diff --git a/audio/die/dc_simashi.mp3 b/audio/die/dc_simashi.mp3 new file mode 100644 index 000000000..786cceeae Binary files /dev/null and b/audio/die/dc_simashi.mp3 differ diff --git a/audio/die/dc_wangling.mp3 b/audio/die/dc_wangling.mp3 new file mode 100644 index 000000000..b0d62632f Binary files /dev/null and b/audio/die/dc_wangling.mp3 differ diff --git a/audio/skill/dcchenlve1.mp3 b/audio/skill/dcchenlve1.mp3 new file mode 100644 index 000000000..745023f56 Binary files /dev/null and b/audio/skill/dcchenlve1.mp3 differ diff --git a/audio/skill/dcchenlve2.mp3 b/audio/skill/dcchenlve2.mp3 new file mode 100644 index 000000000..a99a6bc4c Binary files /dev/null and b/audio/skill/dcchenlve2.mp3 differ diff --git a/audio/skill/dcjichou1.mp3 b/audio/skill/dcjichou1.mp3 new file mode 100644 index 000000000..f2d2fc6b2 Binary files /dev/null and b/audio/skill/dcjichou1.mp3 differ diff --git a/audio/skill/dcjichou2.mp3 b/audio/skill/dcjichou2.mp3 new file mode 100644 index 000000000..d44658227 Binary files /dev/null and b/audio/skill/dcjichou2.mp3 differ diff --git a/audio/skill/dcmouli1.mp3 b/audio/skill/dcmouli1.mp3 new file mode 100644 index 000000000..bf166a425 Binary files /dev/null and b/audio/skill/dcmouli1.mp3 differ diff --git a/audio/skill/dcmouli2.mp3 b/audio/skill/dcmouli2.mp3 new file mode 100644 index 000000000..df6acddf1 Binary files /dev/null and b/audio/skill/dcmouli2.mp3 differ diff --git a/audio/skill/dcsanshi1.mp3 b/audio/skill/dcsanshi1.mp3 new file mode 100644 index 000000000..912c02227 Binary files /dev/null and b/audio/skill/dcsanshi1.mp3 differ diff --git a/audio/skill/dcsanshi2.mp3 b/audio/skill/dcsanshi2.mp3 new file mode 100644 index 000000000..f5a1a8a51 Binary files /dev/null and b/audio/skill/dcsanshi2.mp3 differ diff --git a/audio/skill/dczhenrao1.mp3 b/audio/skill/dczhenrao1.mp3 new file mode 100644 index 000000000..14967e276 Binary files /dev/null and b/audio/skill/dczhenrao1.mp3 differ diff --git a/audio/skill/dczhenrao2.mp3 b/audio/skill/dczhenrao2.mp3 new file mode 100644 index 000000000..3c64d6c83 Binary files /dev/null and b/audio/skill/dczhenrao2.mp3 differ diff --git a/audio/skill/dczifu1.mp3 b/audio/skill/dczifu1.mp3 new file mode 100644 index 000000000..053f573cf Binary files /dev/null and b/audio/skill/dczifu1.mp3 differ diff --git a/audio/skill/dczifu2.mp3 b/audio/skill/dczifu2.mp3 new file mode 100644 index 000000000..e9be2ace5 Binary files /dev/null and b/audio/skill/dczifu2.mp3 differ diff --git a/character/clan.js b/character/clan.js deleted file mode 100644 index 23ac46fec..000000000 --- a/character/clan.js +++ /dev/null @@ -1,3795 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - //clan n.宗派;(尤指苏格兰的)宗族,氏族,家族;庞大的家族;帮派;小集团 - name: "clan", - connect: true, - character: { - clan_wuxian: ["female", "shu", 3, ["clanyirong", "clanguixiang", "clanmuyin"], ["clan:陈留吴氏"]], - clan_wuban: ["male", "shu", 4, ["clanzhanding", "clanmuyin"], ["clan:陈留吴氏"]], - clan_xunshu: ["male", "qun", 3, ["clanshenjun", "clanbalong", "clandaojie"], ["clan:颍川荀氏"]], - clan_xunchen: ["male", "qun", 3, ["clansankuang", "clanbeishi", "clandaojie"], ["clan:颍川荀氏"]], - clan_xuncai: ["female", "qun", 3, ["clanlieshi", "clandianzhan", "clanhuanyin", "clandaojie"], ["clan:颍川荀氏"]], - clan_xuncan: ["male", "wei", 3, ["clanyunshen", "clanshangshen", "clanfenchai", "clandaojie"], ["clan:颍川荀氏"]], - clan_hanshao: ["male", "qun", 3, ["clanfangzhen", "clanliuju", "clanxumin"], ["clan:颍川韩氏"]], - clan_hanrong: ["male", "qun", 3, ["clanlianhe", "clanhuanjia", "clanxumin"], ["clan:颍川韩氏"]], - clan_wukuang: ["male", "qun", 4, ["clanlianzhu", "clanmuyin"], ["clan:陈留吴氏"]], - clan_wangling: ["male", "wei", 4, ["clanbolong", "clanzhongliu"], ["clan:太原王氏"]], - clan_zhongyan: ["female", "jin", 3, ["clanguangu", "clanxiaoyong", "clanbaozu"], ["clan:颍川钟氏"]], - clan_wangyun: ["male", "qun", 3, ["clanjiexuan", "clanmingjie", "clanzhongliu"], ["clan:太原王氏"]], - clan_wanghun: ["male", "jin", 3, ["clanfuxun", "clanchenya", "clanzhongliu"], ["clan:太原王氏"]], - clan_zhonghui: ["male", "wei", "3/4", ["clanyuzhi", "clanxieshu", "clanbaozu"], ["clan:颍川钟氏", "die_audio:clan_zhonghui:clan_zhonghui2:clan_zhonghui3"]], - clan_zhongyu: ["male", "wei", 3, ["clanjiejian", "clanhuanghan", "clanbaozu"], ["clan:颍川钟氏"]], - clan_wanglun: ["male", "jin", 3, ["clanqiuxin", "clanjianyuan", "clanzhongliu"], ["clan:太原王氏"]], - clan_xunyou: ["male", "wei", 3, ["clanbaichu", "clandaojie"], ["clan:颍川荀氏"]], - clan_wuqiao: ["male", "jin", 4, ["clanqiajue", "clanmuyin"], ["clan:陈留吴氏"]], - clan_wangguang: ["male", "wei", 3, ["clanlilun", "clanjianji", "clanzhongliu"], ["clan:太原王氏"]], - clan_wangmingshan: ["male", "wei", 3, ["clantanque", "clanshengmo", "clanzhongliu"], ["clan:太原王氏"]], - clan_zhongyao: ["male", "wei", 3, ["clanchengqi", "clanjieli", "clanbaozu"], ["clan:颍川钟氏"]], - }, - characterSort: { - clan: { - clan_wu: ["clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"], - clan_xun: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou"], - clan_han: ["clan_hanshao", "clan_hanrong"], - clan_wang: ["clan_wangling", "clan_wangyun", "clan_wanghun", "clan_wanglun", "clan_wangguang", "clan_wangmingshan"], - clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu", "clan_zhongyao"], - }, - }, - /** @type { importCharacterConfig['skill'] } */ - skill: { - //族钟繇 - clanchengqi: { - hiddenCard(player, name) { - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - if (player.getStorage("clanchengqi_effect").includes(name)) return false; - return player.countCards("hs") > 1 && lib.inpile.includes(name); - }, - audio: 2, - enable: "chooseToUse", - filter(event, player) { - if (player.countCards("hs") < 2) return false; - return get - .inpileVCardList(info => { - const name = info[2]; - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - return !player.getStorage("clanchengqi_effect").includes(name); - }) - .some(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); - }, - chooseButton: { - dialog(event, player) { - const list = get - .inpileVCardList(info => { - const name = info[2]; - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - return !player.getStorage("clanchengqi_effect").includes(name); - }) - .filter(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); - return ui.create.dialog("承启", [list, "vcard"]); - }, - check(button) { - if (get.event().getParent().type != "phase") return 1; - return get.event("player").getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }, - backup(links, player) { - return { - audio: "clanchengqi", - filterCard: true, - complexCard: true, - selectCard: [2, Infinity], - popname: true, - viewAs: { - name: links[0][2], - nature: links[0][3], - }, - filterOk() { - return ( - (ui.selected.cards || []).reduce((sum, card) => { - return sum + get.cardNameLength(card); - }, 0) >= get.cardNameLength(lib.skill.clanchengqi_backup.viewAs.name) - ); - }, - check(card) { - const player = get.event("player"); - const name = lib.skill.clanchengqi_backup.viewAs.name; - if (ui.selected.cards.length > 1 || card.name == name) return 0; - if ( - ui.selected.cards.length && - game.hasPlayer(target => { - return get.effect(target, { name: "draw" }, player, player) > 0; - }) - ) { - if (get.cardNameLength(name) <= get.cardNameLength(card) + get.cardNameLength(ui.selected.cards[0])) { - return 10 / (get.value(card) || 0.5); - } - } - return 1 / (get.value(card) || 0.5); - }, - position: "hs", - precontent() { - player.addTempSkill("clanchengqi_effect"); - player.markAuto("clanchengqi_effect", [event.result.card.name]); - }, - }; - }, - prompt(links, player) { - return "将至少两张手牌当作" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】使用"; - }, - }, - ai: { - order(item, player) { - if (player && get.event().type == "phase") { - let list = get - .inpileVCardList(info => { - const name = info[2]; - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - return !player.getStorage("clanchengqi_effect").includes(name); - }) - .map(card => { - return { name: card[2], nature: card[3] }; - }) - .filter(card => player.getUseValue(card, true, true) > 0); - if (!list.length) return 0; - list.sort((a, b) => (player.getUseValue(b, true, true) || 0) - (player.getUseValue(a, true, true) || 0)); - return get.order(list[0], player) * 0.99; - } - return 0.001; - }, - respondSha: true, - respondShan: true, - skillTagFilter(player, tag, arg) { - if (arg == "respond") return false; - const name = tag == "respondSha" ? "sha" : "shan"; - return get.info("clanchengqi").hiddenCard(player, name); - }, - result: { player: 1 }, - }, - subSkill: { - backup: { audio: "clanchengqi" }, - effect: { - charlotte: true, - onremove: true, - trigger: { player: "useCard" }, - filter(event, player) { - return ( - event.skill == "clanchengqi_backup" && - get.cardNameLength(event.card) == - (event.cards || []).reduce((sum, card) => { - return sum + get.cardNameLength(card); - }, 0) - ); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget("承启:是否令一名角色摸一张牌?") - .set("ai", target => { - const player = get.event("player"); - return get.effect(target, { name: "draw" }, player, player); - }) - .forResult(); - }, - popup: false, - content() { - player.line(event.targets); - event.targets[0].draw(); - }, - }, - }, - }, - clanjieli: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return game.hasPlayer(target => { - return target.countCards("h"); - }); - }, - async cost(event, trigger, player) { - const num = player.getHistory("useCard").length > 0 ? Math.max(...player.getHistory("useCard").map(history => get.cardNameLength(history.card))) : 0; - const str = num > 0 ? "并观看牌堆顶" + get.cnNumber(num) + "张牌,然后你可以交换其中任意张牌" : ""; - event.result = await player - .chooseTarget(get.prompt("clanjieli"), "观看一名角色的牌名字数最多的手牌" + str, (card, player, target) => { - return target.countCards("h"); - }) - .set("ai", target => { - const player = get.event("player"); - const num = Math.max(...target.getCards("h").map(card => get.cardNameLength(card))); - return num + 0.0001 * get.attitude(player, target); - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - const num = player.getHistory("useCard").length > 0 ? Math.max(...player.getHistory("useCard").map(history => get.cardNameLength(history.card))) : 0; - const limit = Math.max(...target.getCards("h").map(card => get.cardNameLength(card))); - const cards = target.getCards("h", card => get.cardNameLength(card) == limit); - if (num > 0) { - const topCards = get.cards(num); - await game.cardsGotoOrdering(topCards); - const result = await player - .chooseToMove("诫厉:交换其中任意张牌") - .set("list", [ - [get.translation(target) + "牌名字数最多的手牌", cards, "dcsushou_tag"], - ["牌堆顶", topCards], - ]) - .set("filterMove", (from, to) => { - return typeof to != "number"; - }) - .set("filterOk", moved => { - return moved[1].some(card => get.owner(card)); - }) - .set("processAI", list => { - const num = Math.min(list[0][1].length, list[1][1].length); - const player = get.event("player"), - target = get.event().getParent().targets[0]; - const sgn = get.sgn(get.sgn(get.attitude(player, target)) - 0.5); - const cards1 = list[0][1].slice().sort((a, b) => get.value(a, "raw") * sgn - get.value(b, "raw") * sgn); - const cards2 = list[1][1].slice().sort((a, b) => get.value(b, "raw") * sgn - get.value(a, "raw") * sgn); - return [cards1.slice().addArray(cards2.slice(0, num)), cards2.slice().addArray(cards1.slice(0, num))]; - }) - .forResult(); - if (result.bool) { - const lose = result.moved[1].slice(); - const gain = result.moved[0].slice().filter(i => !get.owner(i)); - if (lose.some(i => get.owner(i))) - await target.lose( - lose.filter(i => get.owner(i)), - ui.special - ); - for (let i = lose.length - 1; i--; i >= 0) { - ui.cardPile.insertBefore(lose[i], ui.cardPile.firstChild); - } - game.updateRoundNumber(); - if (gain.length) await target.gain(gain, "draw"); - } else { - for (let i = topCards.length - 1; i--; i >= 0) { - ui.cardPile.insertBefore(topCards[i], ui.cardPile.firstChild); - } - game.updateRoundNumber(); - } - } else { - const content = ['###诫厉###
' + get.translation(target) + "牌名字数最多的手牌
", cards]; - await player.chooseControl("ok").set("dialog", content); - } - }, - }, - //族王明山 - clantanque: { - audio: 2, - trigger: { player: "useCardAfter" }, - usable: 1, - filter(event, player) { - const evt = lib.skill.dcjianying.getLastUsed(player, event); - if (!evt || !evt.card) return false; - const curCard = event.card, - prevCard = evt.card; - const curNum = get.number(curCard), - prevNum = get.number(prevCard); - if (typeof curNum != "number" || typeof prevNum != "number") return false; - const delNum = Math.abs(curNum - prevNum); - if (delNum === 0) return false; - return game.hasPlayer(current => { - return current.getHp() === delNum; - }); - }, - locked: false, - async cost(event, trigger, player) { - const evt = lib.skill.dcjianying.getLastUsed(player, trigger); - const curCard = trigger.card, - prevCard = evt.card; - const curNum = get.number(curCard), - prevNum = get.number(prevCard); - const delNum = Math.abs(curNum - prevNum); - event.result = await player - .chooseTarget(get.prompt("clantanque"), `对一名体力值为${delNum}的角色造成1点伤害`, (card, player, target) => { - return target.getHp() === get.event("delNum"); - }) - .set("delNum", delNum) - .set("ai", target => { - return get.damageEffect(target, get.player(), get.player()); - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - await target.damage(); - await game.asyncDelayx(); - }, - mod: { - aiOrder(player, card, num) { - if (typeof card != "object") return; - const evt = lib.skill.dcjianying.getLastUsed(player); - if (!evt || !evt.card) return; - const curNum = get.number(card), - prevNum = get.number(evt.card); - if (typeof curNum != "number" || typeof prevNum != "number") return; - const pairs = game - .filterPlayer() - .map(current => { - return [current.getHp(), get.damageEffect(current, player, player)]; - }) - .filter(pair => pair[1] > 0); - if (!pairs.length) return; - const delNum = Math.abs(curNum - prevNum); - for (const [hp, eff] of pairs) { - if (hp != delNum) continue; - return num + 10 + pairs.filter(pair => pair[0] === hp).sort((a, b) => b[1] - a[1])[0][1] / 20; - } - }, - }, - }, - clanshengmo: { - audio: 2, - enable: "chooseToUse", - hiddenCard(player, name) { - if (get.type(name) != "basic") return false; - if (!player.getStorage("clanshengmo").includes(name) && (get.event("clanshengmo_cards") || []).length > 0) return true; - }, - filter(event, player) { - if (event.responded) return false; - const names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)), - cards = get.event("clanshengmo_cards") || []; - return ( - cards.length > 0 && - names.some(name => { - return event.filterCard({ name, isCard: true }, player, event); - }) - ); - }, - onChooseToUse(event) { - if (game.online) return; - if (!event.clanshengmo_cards) { - let cards = []; - game.checkGlobalHistory("cardMove", evt => { - if (evt.name != "cardsDiscard" && (evt.name != "lose" || evt.position != ui.discardPile)) return; - cards.addArray(evt.cards.filter(card => get.position(card, true) == "d")); - }); - const numbers = cards.map(card => get.number(card, false)).unique(); - const [min, max] = [Math.min(...numbers), Math.max(...numbers)]; - event.set( - "clanshengmo_cards", - cards.filter(card => { - const num = get.number(card, false); - return num > min && num < max; - }) - ); - } - }, - async content(event, trigger, player) { - const evt = event.getParent(2); - const names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)), - cards = evt.clanshengmo_cards; - const links = await player - .chooseButton(["剩墨:获得其中一张牌", cards], true) - .set("ai", button => { - return get.value(button.link); - }) - .forResultLinks(); - if (!links || !links.length) return; - const list = []; - for (const name of names) { - const card = { name, isCard: true }; - if (evt.filterCard(card, player, evt)) { - list.push(["基本", "", name]); - } - if (name == "sha") { - for (const nature of lib.inpile_nature) { - card.nature = nature; - if (evt.filterCard(card, player, evt)) { - list.push(["基本", "", name, nature]); - } - } - } - } - if (!list.length) return; - const links2 = await player - .chooseButton(["视为使用一张未以此法使用过的基本牌", [list, "vcard"]], true) - .set("ai", button => { - return get.player().getUseValue(button.link) + 1; - }) - .forResultLinks(); - const name = links2[0][2], - nature = links2[0][3]; - game.broadcastAll( - (name, nature, toGain) => { - lib.skill.clanshengmo_backup.viewAs = { - name, - nature, - isCard: true, - }; - lib.skill.clanshengmo_backup.prompt = `选择${get.translation(nature)}【${get.translation(name)}】的目标`; - lib.skill.clanshengmo_backup.cardToGain = toGain; - }, - name, - nature, - links[0] - ); - evt.set("_backupevent", "clanshengmo_backup"); - evt.backup("clanshengmo_backup"); - evt.set("openskilldialog", `选择${get.translation(nature)}【${get.translation(name)}】的目标`); - evt.set("norestore", true); - evt.set("custom", { - add: {}, - replace: { window() {} }, - }); - evt.goto(0); - }, - marktext: "墨", - intro: { - content: "已以此法使用过$", - }, - subSkill: { - backup: { - precontent() { - delete event.result.skill; - event.result.card.storage.clanshengmo = true; - player.markAuto("clanshengmo", event.result.card.name); - player.gain(lib.skill.clanshengmo_backup.cardToGain, "gain2"); - }, - filterCard: () => false, - selectCard: -1, - }, - }, - ai: { - order: 3, - result: { - player(player) { - if (get.event().dying) return get.attitude(player, get.event().dying); - if (get.event().type != "phase") return 1; - const names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)); - if (Array.isArray(names)) { - return names.some(name => { - return player.getUseValue({ name }) > 0; - }); - } - return 0; - }, - }, - }, - }, - //族贝斯塔[doge] - clanlilun: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return player.hasCard(card => get.info("clanlilun").filterCard(card, player), "h"); - }, - filterCard(card, player) { - if (player.getStorage("clanlilun").includes(card.name)) return false; - if (ui.selected.cards.length && ui.selected.cards[0].name != card.name) return false; - const cards = player.getCards("h", cardx => player.canRecast(cardx)); - return cards.includes(card) && cards.filter(i => i.name == card.name).length > 1; - }, - selectCard: 2, - position: "h", - check(card) { - const player = get.event("player"); - const value = function (card, player) { - const num = player.getUseValue(card); - return num > 0 ? num + 1 / (get.value(card) || 0.5) + 7 : 7 - get.value(card); - }; - if (ui.selected.cards.length && value(card, player) < value(ui.selected.cards[0], player)) return 20 - get.value(card); - return value(card, player); - }, - complexCard: true, - discard: false, - lose: false, - delay: 0, - usable: 1, - async content(event, trigger, player) { - await player.recast(event.cards); - if (!player.storage.clanlilun) { - player.when({ global: "phaseAfter" }).then(() => { - player.unmarkSkill("clanlilun"); - delete player.storage.clanlilun; - }); - } - player.markAuto( - "clanlilun", - event.cards.slice().map(card => card.name) - ); - const cards = event.cards.filterInD("d"); - if (cards.some(card => player.hasUseTarget(card))) { - const { - result: { bool, links }, - } = await player - .chooseButton(["离论:是否使用其中的一张牌?", cards]) - .set("filterButton", button => { - return get.event("player").hasUseTarget(button.link); - }) - .set("ai", button => { - return get.event("player").getUseValue(button.link); - }); - if (bool) { - const card = links[0]; - player.$gain2(card, false); - await game.asyncDelayx(); - await player.chooseUseTarget(true, card, false); - } - } - }, - onremove: true, - intro: { content: "本回合已重铸过$" }, - ai: { - order(item, player) { - let cards = player.getCards("h", card => get.info("clanlilun").filterCard(card, player) && player.getUseValue(card) > 0); - cards = cards.filter(card => cards.filter(i => i.name == card.name).length > 1); - if (!cards.length) return 1; - cards.sort((a, b) => get.order(b) - get.order(a)); - return get.order(cards[0]) - 0.001; - }, - result: { player: 1 }, - }, - }, - clanjianji: { - unique: true, - limited: true, - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter(event, player) { - if (!event.player.isIn()) return false; - const targets = game.filterPlayer(target => { - return event.player.getPrevious() == target || event.player.getNext() == target; - }); - if (!targets.length) return false; - const card = new lib.element.VCard({ name: "sha" }); - return ( - !targets.some(target => { - return target.getHistory("useCard").length; - }) || - (player.hasUseTarget(card) && - !targets.some(target => { - return game.hasPlayer2(current => { - return current.getHistory("useCard", evt => { - return evt.targets && evt.targets.includes(target); - }).length; - }); - })) - ); - }, - skillAnimation: true, - animationColor: "watar", - prompt2(event, player) { - let str = ""; - const card = new lib.element.VCard({ name: "sha" }); - const targets = game.filterPlayer(target => { - return event.player.getPrevious() == target || event.player.getNext() == target; - }), - bool = !targets.some(target => { - return target.getHistory("useCard").length; - }), - goon = - player.hasUseTarget(card) && - !targets.some(target => { - return game.hasPlayer2(current => { - return current.getHistory("useCard", evt => { - return evt.targets && evt.targets.includes(target); - }).length; - }); - }); - if (bool) { - if (goon) str += "你可以"; - str += "与" + get.translation(get.translation(event.player)) + "各摸一张牌"; - } - if (goon) { - if (bool) str += ",然后你可以"; - str += "视为使用一张【杀】"; - } - return str; - }, - check(event, player) { - const card = new lib.element.VCard({ name: "sha" }); - const targets = game.filterPlayer(target => { - return event.player.getPrevious() == target || event.player.getNext() == target; - }), - bool = !targets.some(target => { - return target.getHistory("useCard").length; - }), - goon = - player.hasUseTarget(card) && - !targets.some(target => { - return game.hasPlayer2(current => { - return current.getHistory("useCard", evt => { - return evt.targets && evt.targets.includes(target); - }).length; - }); - }); - return (bool && (get.attitude(player, event.player) > 0 || event.player.countCards("h") > player.countCards("h"))) || (goon && player.hasValueTarget(card)); - }, - logTarget: "player", - async content(event, trigger, player) { - player.awakenSkill("clanjianji"); - const card = new lib.element.VCard({ name: "sha" }); - const targets = game.filterPlayer(target => { - return trigger.player.getPrevious() == target || trigger.player.getNext() == target; - }), - boolx = !targets.some(target => { - return target.getHistory("useCard").length; - }), - goon = - player.hasUseTarget(card) && - !targets.some(target => { - return game.hasPlayer2(current => { - return current.getHistory("useCard", evt => { - return evt.targets && evt.targets.includes(target); - }).length; - }); - }); - if (boolx) { - let draw = false; - if (goon) { - const { - result: { bool }, - } = await player.chooseBool("是否与" + get.translation(trigger.player) + "各摸一张牌?").set("choice", get.attitude(player, trigger.player) > 0 || trigger.player.countCards("h") > player.countCards("h")); - if (bool) draw = true; - } else draw = true; - if (draw) { - await player.draw("nodelay"); - await trigger.player.draw(); - } - } - if (goon) await player.chooseUseTarget(card, false, !boolx); - }, - }, - //族吴乔 - clanqiajue: { - audio: 2, - trigger: { player: "phaseDrawBegin" }, - filter(event, player) { - return ( - player.countCards("he", card => { - if (_status.connectMode && get.position(card) == "h") return true; - return get.color(card, player) == "black" && lib.filter.cardDiscardable(card, player); - }) > 0 - ); - }, - direct: true, - async content(event, trigger, player) { - const { - result: { bool }, - } = await player - .chooseToDiscard((card, player) => { - return get.color(card, player) == "black" && lib.filter.cardDiscardable(card, player); - }, "he") - .set("prompt", "当前手牌点数和为" + player.getCards("h").reduce((sum, card) => sum + get.number(card), 0) + "," + get.prompt("clanqiajue")) - .set("prompt2", lib.translate.clanqiajue_info.slice(lib.translate.clanqiajue_info.indexOf("弃置")).slice(0, -1)) - .set("ai", card => { - const player = get.event("player"), - goon = get.position(card) == "h"; - let num = player.getCards("h").reduce((sum, card) => sum + get.number(card), 0); - if (num - (goon ? get.number(card) : 0) > 30) return 0; - return goon ? get.number(card) : 1 / (get.value(card) || 0.5); - }) - .set("logSkill", "clanqiajue"); - if (bool) { - player - .when({ - player: ["phaseDrawEnd", "phaseDrawCancelled", "phaseUseSkipped"], - }) - .filter(evt => evt == trigger) - .then(() => { - const cards = player.getCards("h"), - num = cards.reduce((sum, card) => sum + get.number(card), 0); - if (cards.length) player.showCards(cards, get.translation(player) + "【跒倔】展示"); - if (num > 30) { - player.popup("杯具"); - lib.skill.chenliuwushi.change(player, -2); - } else { - player.popup("洗具"); - const next = player.phaseDraw(); - event.next.remove(next); - trigger.getParent("phase").next.push(next); - } - }); - } - }, - }, - //族荀攸 - clanbaichu: { - derivation: "qice", - audio: 2, - trigger: { player: "useCardAfter" }, - filter(event, player) { - const storage = player.storage.clanbaichu || {}; - if (Object.values(storage).includes(event.card.name)) return true; - const suit = get.suit(event.card); - if (suit == "none") return false; - if (!player.hasSkill("qice")) return true; - const key = `${suit}+${get.type2(event.card)}`; - return !(key in storage); - }, - forced: true, - content() { - "step 0"; - var storage = player.storage.clanbaichu || {}, - suit = get.suit(trigger.card); - if (suit != "none") { - var key = `${suit}+${get.type2(trigger.card)}`; - if (key in storage) { - if (!player.hasSkill("qice")) { - player.addTempSkills("qice", "roundStart"); - player.popup("奇策"); - // game.log(player,'获得了技能','#g【奇策】'); - } - event.goto(2); - } else { - var list = lib.inpile.filter(name => get.type(name) == "trick"); - list.removeArray(Object.values(storage)); - if (list.length > 0) { - var dialog = ["百出:选择记录一种普通锦囊牌", [list, "vcard"]]; - player.chooseButton(dialog, true).set("ai", function (button) { - var player = _status.event.player, - name = button.link[2]; - if (name == _status.event.getTrigger().card.name) return 1919810; - if (name == "wuxie") return 114514; - return get.effect(player, { name: name }, player, player) * (1 + player.countCards("hs", name)); - }); - } else event.goto(2); - } - } else event.goto(2); - "step 1"; - if (result.bool) { - var key = `${get.suit(trigger.card)}+${get.type2(trigger.card)}`, - name = result.links[0][2]; - if (!player.storage.clanbaichu) player.storage.clanbaichu = {}; - player.storage.clanbaichu[key] = name; - player.markSkill("clanbaichu"); - game.log(player, "记录了", "#y" + get.translation(name)); - game.delayx(); - } - "step 2"; - if (Object.values(player.getStorage("clanbaichu")).includes(trigger.card.name)) { - player.chooseDrawRecover(true); - } - }, - intro: { - markcount(storage) { - return Object.keys(storage).length; - }, - content(storage) { - if (!storage) return "当前暂无记录"; - const keys = Object.keys(storage).map(i => i.split("+")); - keys.sort((a, b) => { - if (a[0] != b[0]) return lib.suit.indexOf(b[0]) - lib.suit.indexOf(a[0]); - return lib.sort.name(a[1], b[1]); - }); - return keys - .map(item => { - return `
  • ${get.translation(item[0])}+${get.translation(item[1])}:【${get.translation(storage[item.join("+")])}】`; - }) - .join("
    "); - }, - }, - }, - //族王沦 - clanqiuxin: { - audio: 2, - enable: "phaseUse", - filterTarget: lib.filter.notMe, - usable: 1, - content() { - "step 0"; - var str = get.translation(player); - target - .chooseControl() - .set("choiceList", [str + "下次对你使用【杀】后,其视为对你使用任意普通锦囊牌", str + "下次对你使用任意普通锦囊牌后,其视为对你使用【杀】"]) - .set("ai", function () { - var target = _status.event.player; - var player = _status.event.target; - var num1 = get.effect(target, get.autoViewAs({ name: "sha" }, []), player, player); - if (!player.canUse(get.autoViewAs({ name: "sha" }, []), target)) num1 = 0; - var num2 = 0; - for (var name of lib.inpile) { - if (get.type(name) != "trick") continue; - if (!player.canUse(get.autoViewAs({ name: name }, []), target)) continue; - if (num2 < get.effect(target, get.autoViewAs({ name: name }, []), player, player)) num2 = get.effect(target, get.autoViewAs({ name: name }, []), player, player); - } - return num1 >= num2 ? 1 : 0; - }) - .set("target", player); - "step 1"; - player.addSkill("clanqiuxin_effect"); - player.markAuto("clanqiuxin_effect", [[target, result.index]]); - }, - ai: { - order: 9, - result: { - target(player, target) { - var cards = player.getCards("hs", card => { - if (get.name(card, player) != "sha" && get.type(card, player) != "trick") return false; - return player.hasValueTarget(card); - }); - if (cards.some(card => player.canUse(card, target) && get.effect(target, card, player, player) > 0)) { - var att = get.attitude(player, target); - if (att > 0) return 9; - if (att < 0) return -6; - return 0; - } else { - var att = get.attitude(player, target); - if (att < 0) return -3; - if (att > 0) return 1; - return 2; - } - }, - }, - }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - intro: { - content(storage, player) { - var str = ""; - for (var i = 0; i < storage.length; i++) { - var list = storage[i]; - var strx = ["【杀】", "任意普通锦囊牌"]; - if (list[1]) strx.reverse(); - str += "对" + get.translation(list[0]) + "使用" + strx[0] + "后,视为对其使用" + strx[1]; - str += "
    "; - } - str = str.slice(0, -4); - return str; - }, - }, - trigger: { player: "useCardAfter" }, - filter(event, player) { - if (!event.targets || !event.targets.length) return false; - if (event.card.name == "sha") - return event.targets.some(target => { - return player.getStorage("clanqiuxin_effect").some(list => list[0] == target && list[1] == 0); - }); - if (get.type(event.card) == "trick") - return event.targets.some(target => { - return player.getStorage("clanqiuxin_effect").some(list => list[0] == target && list[1] == 1); - }); - return false; - }, - forced: true, - popup: false, - content() { - "step 0"; - var list; - if (trigger.card.name == "sha") list = player.getStorage("clanqiuxin_effect").filter(listx => trigger.targets.includes(listx[0]) && listx[1] == 0); - if (get.type(trigger.card) == "trick") list = player.getStorage("clanqiuxin_effect").filter(listx => trigger.targets.includes(listx[0]) && listx[1] == 1); - player.unmarkAuto("clanqiuxin_effect", list); - var targets = list.map(listx => listx[0]); - event.targets = targets; - "step 1"; - var target = event.targets.shift(); - event.target = target; - var list = []; - for (var name of lib.inpile) { - if (name != "sha" && get.type(name) != "trick") continue; - if (trigger.card.name == "sha" && get.type(name) != "trick") continue; - if (name == "sha" && get.type(trigger.card) != "trick") continue; - if (!player.canUse(get.autoViewAs({ name: name }, []), target)) continue; - list.push([get.translation(get.type(name)), "", name]); - } - if (!list.length) event.goto(3); - else { - player - .chooseButton(["求心:视为对" + get.translation(target) + "使用一张牌", [list, "vcard"]], true) - .set("ai", function (button) { - var player = _status.event.player; - var target = _status.event.target; - return get.effect( - target, - { - name: button.link[2], - nature: button.link[3], - }, - player, - player - ); - }) - .set("target", target); - } - "step 2"; - if (result.bool) { - var card = { - name: result.links[0][2], - nature: result.links[0][3], - }; - player.useCard(card, target, false); - } - "step 3"; - if (event.targets.length) event.goto(1); - else if (!player.getStorage("clanqiuxin_effect").length) player.removeSkill("clanqiuxin_effect"); - }, - }, - }, - }, - clanjianyuan: { - inherit: "clanchenya", - filter(event, player) { - for (var phase of lib.phaseName) { - var evt = event.getParent(phase); - if (evt && evt.name == phase) { - if (event.player.getHistory("useCard", evtx => evtx.getParent(phase) == evt).length) return lib.skill.clanchenya.filter(event, player); - } - } - return false; - }, - content() { - "step 0"; - var num = 0; - for (var phase of lib.phaseName) { - var evt = trigger.getParent(phase); - if (evt && evt.name == phase) { - num += trigger.player.getHistory("useCard", evtx => evtx.getParent(phase) == evt).length; - } - } - trigger.player - .chooseCard("是否重铸任意张牌名字数为" + num + "的牌?", [1, Infinity], "he", (card, player) => _status.event.cards.includes(card) && player.canRecast(card)) - .set("ai", card => { - var val = get.value(card); - return 6 - val; - }) - .set( - "cards", - trigger.player.getCards("he", card => { - return get.cardNameLength(card) == num; - }) - ); - "step 1"; - if (result.bool) trigger.player.recast(result.cards); - }, - }, - //族钟毓 - clanjiejian: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - if (!event.isFirstTarget || get.type(event.card) == "equip") return false; - return get.cardNameLength(event.card) == player.getHistory("useCard").indexOf(event.getParent()) + 1; - }, - direct: true, - locked: false, - content() { - "step 0"; - var num = get.cardNameLength(trigger.card); - event.num = num; - player - .chooseTarget(get.prompt("clanjiejian"), "令一名目标角色摸" + get.cnNumber(num) + "张牌", function (card, player, target) { - return _status.event.getTrigger().targets.includes(target); - }) - .set("ai", target => get.attitude(_status.event.player, target)); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("clanjiejian", target); - target.draw(num); - } - }, - ai: { - threaten: 3, - effect: { - player(card, player, target) { - if (!target || typeof card !== "object" || player._clanjiejian_mod_temp || get.type(card) === "equip" || get.attitude(player, target) <= 0 || get.cardNameLength(card) !== player.getHistory("useCard").length + 1) return; - let targets = [target], - evt = _status.event.getParent("useCard"); - targets.addArray(ui.selected.targets); - if (evt && evt.card == card) targets.addArray(evt.targets); - return [1, (0.8 * get.cardNameLength(card)) / targets.length]; - }, - }, - }, - mod: { - aiOrder(player, card, num) { - if (typeof card == "object" && get.type(card) !== "equip") { - let cs = get.cardNameLength(card) - player.getHistory("useCard").length - 1; - if (cs < 0) return num; - if (cs > 0) return num / 3; - player._clanjiejian_mod_temp = true; - let bool = game.hasPlayer(target => { - if (get.attitude(player, target) <= 0 || !player.canUse(card, target, null, true)) return false; - return get.effect(target, card, player, player) + get.effect(target, { name: "draw" }, player, player) > 0; - }); - delete player._clanjiejian_mod_temp; - if (bool) return num + 15; - } - }, - }, - }, - clanhuanghan: { - audio: 2, - trigger: { player: "damageEnd" }, - filter(event, player) { - if (!event.card) return false; - var num = get.cardNameLength(event.card); - return typeof num == "number" && num > 0; - }, - check(event, player) { - let num = get.cardNameLength(event.card) - player.getDamagedHp(); - if (num >= 0) return true; - if (num < -1) return false; - if ( - player.hasSkill("clanbaozu", null, false, false) && - player.awakenedSkills.includes("clanbaozu") && - player.getHistory("useSkill", evt => { - return evt.skill == "clanhuanghan"; - }).length - ) - return true; - return false; - }, - content() { - "step 0"; - player.draw(get.cardNameLength(trigger.card)); - if (player.isDamaged()) player.chooseToDiscard(player.getDamagedHp(), "he", true); - "step 1"; - if (player.getHistory("useSkill", evt => evt.skill == "clanhuanghan").length > 1 && player.hasSkill("clanbaozu", null, false, false) && player.awakenedSkills.includes("clanbaozu")) { - player.restoreSkill("clanbaozu"); - player.popup("保族"); - game.log(player, "恢复了技能", "#【保族】"); - } - }, - ai: { - threaten: 3, - effect: { - target(card, player, target) { - if (!get.tag(card, "damage") || player.hasSkillTag("jueqing", false, target)) return; - let num = get.cardNameLength(card) - target.getDamagedHp(); - if (num > 0) return [1, num + 0.1]; - }, - }, - }, - }, - //族钟会 - clanyuzhi: { - mod: { - aiOrder(player, card, num) { - if (card.name == "tao") return num / 114514; - }, - }, - audio: 6, - trigger: { global: "roundStart" }, - direct: true, - locked: true, - content() { - "step 0"; - player.unmarkSkill("clanyuzhi"); - if ( - player.countCards("h", card => { - return card.hasGaintag("clanyuzhi") && lib.filter.cardDiscardable(card, player); - }) - ) { - event.logged = true; - player.chooseToDiscard( - player.countCards("h"), - "h", - (card, player) => { - return card.hasGaintag("clanyuzhi"); - }, - true - ).logSkill = "clanyuzhi"; - } - "step 1"; - player.removeGaintag("clanyuzhi"); - var num1 = player - .getRoundHistory( - "gain", - evt => { - return evt.getParent().name == "draw" && evt.getParent(2).name == "clanyuzhi"; - }, - 1 - ) - .reduce((sum, evt) => sum + evt.cards.length, 0); - var num2 = player - .getRoundHistory( - "gain", - evt => { - return evt.getParent().name == "draw" && evt.getParent(2).name == "clanyuzhi"; - }, - 2 - ) - .reduce((sum, evt) => sum + evt.cards.length, 0); - var num3 = player - .getRoundHistory( - "useCard", - evt => { - return evt.cards && evt.cards.length; - }, - 1 - ) - .reduce((sum, evt) => sum + evt.cards.length, 0); - event.num1 = num1; - if ((num1 > 0 && num2 > 0 && num1 > num2) || num1 > num3) { - if (!event.logged) player.logSkill("clanyuzhi"); - if (num2 > 0 && num1 > num2) game.log(player, "的野心已开始膨胀", "#y(" + num1 + "张>" + num2 + "张)"); - if (num1 > num3) game.log(player, "的行动未达到野心", "#y(" + num3 + "张<" + num1 + "张)"); - if (player.hasSkill("clanbaozu", null, false, false)) player.chooseBool("迂志:是否失去〖保族〗?", "若选择“否”,则你受到1点雷属性伤害").set("choice", player.awakenedSkills.includes("clanbaozu")); - else event._result = { bool: false }; - } else event.goto(3); - "step 2"; - if (result.bool) { - player.removeSkills("clanbaozu"); - } else player.damage(1, "thunder"); - "step 3"; - if (player.countCards("h")) { - player - .chooseCard( - "迂志:请展示一张手牌", - "摸此牌牌名字数的牌。下一轮开始时弃置此牌,若本轮你使用的牌数或上一轮你以此法摸的牌数小于此牌牌名字数,则你受到1点雷属性伤害或失去〖保族〗。", - function (card, player) { - var num = get.cardNameLength(card); - return typeof num == "number" && num > 0; - }, - true - ) - .set("ai", function (card) { - if (_status.event.dying && _status.event.num > 0 && get.cardNameLength(card) > _status.event.num) return 1 / get.cardNameLength(card); //怂 - return get.cardNameLength(card); //勇 - }) - .set( - "dying", - player.hp + - player.countCards("hs", { - name: ["tao", "jiu"], - }) < - 1 - ) - .set("num", event.num1); - } else event.finish(); - "step 4"; - if (result.bool) { - player.logSkill("clanyuzhi"); - player.showCards(result.cards, get.translation(player) + "发动了【迂志】"); - player.addGaintag(result.cards, "clanyuzhi"); - player.draw(get.cardNameLength(result.cards[0])); - player.storage.clanyuzhi = get.cardNameLength(result.cards[0]); - player.markSkill("clanyuzhi"); - } - }, - ai: { - threaten: 3, - nokeep: true, - }, - onremove: true, - intro: { content: "本轮野心:#张" }, - }, - clanxieshu: { - audio: 6, - trigger: { player: "damageEnd", source: "damageSource" }, - filter(event, player) { - if (!event.card || player.isLinked()) return false; - var num = get.cardNameLength(event.card); - return typeof num == "number" && num > 0 && player.countCards("he") > 0; - }, - async cost(event, trigger, player) { - var num = get.cardNameLength(trigger.card), - str = ""; - if (player.getDamagedHp() > 0) str += ",然后摸" + get.cnNumber(player.getDamagedHp()) + "张牌"; - event.result = await player - .chooseToDiscard(get.prompt("clanxieshu"), "横置武将牌并弃置" + get.cnNumber(num) + "张牌" + str, "he", num) - .set("ai", function (card) { - var player = _status.event.player; - var num = _status.event.num; - var num2 = player.getDamagedHp(); - if (!num2) return 0; - if (num < num2) return 8 - get.value(card); - if (num == num2 || num2 >= 2 + num - num2) return lib.skill.zhiheng.check(card); - return 0; - }) - .set("num", num) - .set("logSkill", "clanxieshu") - .forResult(); - }, - popup: false, - *content(event, map) { - const player = map.player; - yield player.link(true); - if (player.getDamagedHp() > 0) { - yield player.draw(player.getDamagedHp()); - } - if ( - game.getGlobalHistory("everything", evt => { - return evt.name == "dying"; - }).length - ) { - player.tempBanSkill("clanxieshu"); - } - }, - ai: { threaten: 3 }, - }, - //族王浑 - clanfuxun: { - mod: { - aiOrder(player, card, num) { - if (player.isPhaseUsing() && get.type(card) == "equip" && get.equipValue(card, player) > 0) return num + 3; - }, - }, - locked: false, - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: true, - position: "h", - discard: false, - lose: false, - delay: false, - selectCard() { - var player = _status.event.player; - if (ui.selected.targets.length && !ui.selected.targets[0].countGainableCards(player, "h")) return 1; - return [0, 1]; - }, - filterTarget(card, player, target) { - if (player == target) return false; - if (!ui.selected.cards.length) return target.countGainableCards(player, "h") > 0; - return true; - }, - check(card) { - var player = _status.event.player; - var evtx = _status.event.getParent("phaseUse"); - var targets = game.filterPlayer(target => target != player && lib.skill.clanfuxun.ai.result.target(player, target) != 0); - targets.sort((a, b) => Math.abs(lib.skill.clanfuxun.ai.result.target(player, b)) - Math.abs(lib.skill.clanfuxun.ai.result.target(player, a))); - if (evtx && targets.length) { - var target = targets[0]; - if ( - !target.hasHistory("lose", evt => { - return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length; - }) && - !target.hasHistory("gain", evt => { - return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length; - }) && - Math.abs(player.countCards("h") - target.countCards("h")) == 2 - ) { - if (player.countCards("h") > target.countCards("h")) return 1 / (get.value(card) || 0.5); - return -1; - } - if (card.name == "du") return 20; - return -1; - } - if (card.name == "du") return 20; - return -1; - }, - content() { - "step 0"; - if (cards.length) { - player.give(cards, target); - } else { - player.gainPlayerCard(target, "h", true); - } - "step 1"; - var evtx = event.getParent("phaseUse"); - if ( - player.countCards("h") == target.countCards("h") && - evtx && - !target.hasHistory("lose", evt => { - return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length; - }) && - !target.hasHistory("gain", evt => { - return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length; - }) && - player.countCards("he") - ) { - var list = []; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - if (player.hasUseTarget({ name: name })) list.push(["基本", "", name]); - if (name == "sha") { - for (var nature of lib.inpile_nature) { - if ( - player.hasUseTarget({ - name: name, - nature: nature, - }) - ) - list.push(["基本", "", name, nature]); - } - } - } - if (list.length) { - player.chooseButton(["是否将一张牌当做一种基本牌使用?", [list, "vcard"]]).set("ai", button => { - return _status.event.player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }); - } else event.finish(); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = { - name: result.links[0][2], - nature: result.links[0][3], - }; - game.broadcastAll(function (card) { - lib.skill.clanfuxun_backup.viewAs = card; - }, card); - var next = player.chooseToUse(); - next.set("openskilldialog", "将一张牌当做" + get.translation(card) + "使用"); - next.set("norestore", true); - next.set("addCount", false); - next.set("_backupevent", "clanfuxun_backup"); - next.set("custom", { - add: {}, - replace: { window() {} }, - }); - next.backup("clanfuxun_backup"); - } - }, - ai: { - order(item, player) { - var evtx = _status.event.getParent("phaseUse"); - if ( - game.hasPlayer(current => { - if (current == player || !evtx || get.attitude(player, current) == 0) return false; - return ( - !current.hasHistory("lose", evt => { - return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length; - }) && - !current.hasHistory("gain", evt => { - return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length; - }) && - Math.abs(player.countCards("h") - current.countCards("h")) == 2 - ); - }) - ) - return 10; - return 2; - }, - result: { - target(player, target) { - var evtx = _status.event.getParent("phaseUse"); - var num = get.sgn(get.attitude(player, target)); - var targets = game.filterPlayer(current => { - if (current == player || !evtx || get.attitude(player, current) == 0) return false; - return ( - !current.hasHistory("lose", evt => { - return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length; - }) && - !current.hasHistory("gain", evt => { - return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length; - }) && - Math.abs(player.countCards("h") - current.countCards("h")) == 2 - ); - }); - if (targets.includes(target)) { - if (player.countCards("h") < target.countCards("h")) return get.sgn(num + 0.5) * Math.sqrt(2 - num); - else return num * (2 + num); - } - return get.sgn(num + 0.5) * (1 - num) * 0.25; - }, - }, - }, - subSkill: { - backup: { - filterCard(card) { - return get.itemtype(card) == "card"; - }, - position: "hes", - filterTarget: lib.filter.filterTarget, - selectCard: 1, - check(card) { - var player = _status.event.player; - if (player.hasSkill("clanzhongliu") && get.position(card) != "h") return 10 - get.value(card); - return 5 - get.value(card); - }, - log: false, - precontent() { - delete event.result.skill; - }, - }, - }, - }, - clanchenya: { - audio: 2, - trigger: { - global: ["useSkillAfter", "logSkill"], - }, - filter(event, player) { - if (event.type != "player") return false; - var skill = event.sourceSkill || event.skill; - var info = get.info(skill); - if (info.charlotte) return false; - var translation = get.skillInfoTranslation(skill, event.player); - if (!translation) return false; - var match = translation.match(/“?出牌阶段限一次/g); - if (!match || match.every(value => value != "出牌阶段限一次")) return false; - return event.player.countCards("h") > 0; - }, - check(event, player) { - return get.attitude(player, event.player) > 0; - }, - logTarget: "player", - content() { - "step 0"; - var num = trigger.player.countCards("h"); - trigger.player - .chooseCard("是否重铸任意张牌名字数为" + num + "的牌?", [1, Infinity], "he", (card, player) => _status.event.cards.includes(card) && player.canRecast(card)) - .set("ai", card => { - var val = get.value(card); - return 6 - val; - }) - .set( - "cards", - trigger.player.getCards("he", card => { - return get.cardNameLength(card) == num; - }) - ); - "step 1"; - if (result.bool) trigger.player.recast(result.cards); - }, - }, - //族王允 - clanjiexuan: { - audio: 2, - enable: "phaseUse", - limited: true, - zhuanhuanji: "number", - mark: true, - marktext: "☯", - intro: { - markcount: () => 0, - content(storage) { - return "限定技,转换技。你可以将一张" + ((storage || 0) % 2 ? "黑色牌当【过河拆桥】" : "红色牌当【顺手牵羊】") + "使用。"; - }, - }, - viewAs(cards, player) { - var storage = player.storage.clanjiexuan; - var name = (storage || 0) % 2 ? "guohe" : "shunshou"; - return { name: name }; - }, - check(card) { - var player = _status.event.player; - var storage = player.storage.clanjiexuan; - var name = (storage || 0) % 2 ? "guohe" : "shunshou"; - var fix = player.hasSkill("clanzhongliu") && get.position(card) != "h" ? 2 : 1; - return (get.value({ name: name }, player) - get.value(card)) * fix; - }, - position: "hes", - filterCard(card, player) { - var storage = player.storage.clanjiexuan; - return get.color(card) == ((storage || 0) % 2 ? "black" : "red"); - }, - prompt() { - var storage = _status.event.player.storage.clanjiexuan; - if ((storage || 0) % 2) return "将一张黑色牌当【过河拆桥】使用"; - return "将一张红色牌当【顺手牵羊】使用"; - }, - skillAnimation: true, - animationColor: "thunder", - precontent() { - "step 0"; - var skill = "clanjiexuan"; - player.logSkill(skill); - player.changeZhuanhuanji(skill); - player.awakenSkill(skill, true); - delete event.result.skill; - }, - ai: { - order(item, player) { - player = player || _status.event.player; - var storage = _status.event.player.storage.clanjiexuan; - var name = (storage || 0) % 2 ? "guohe" : "shunshou"; - return get.order({ name: name }) + 0.1; - }, - }, - }, - clanmingjie: { - init(player) { - player.addSkill("clanmingjie_record"); - }, - initSkill(skill) { - if (!lib.skill[skill]) { - lib.skill[skill] = { - charlotte: true, - mark: true, - marktext: "戒", - intro: { content: "已被$指定为【铭戒】目标" }, - }; - lib.translate[skill] = "铭戒"; - lib.translate[skill + "_bg"] = "戒"; - } - }, - onremove(player) { - player.removeSkill("clanmingjie_record"); - }, - audio: 2, - enable: "phaseUse", - limited: true, - filterTarget(card, player, target) { - return !target.hasSkill("clanmingjie_" + player.playerid); - }, - skillAnimation: true, - animationColor: "thunder", - content() { - player.awakenSkill("clanmingjie"); - player.addSkill("clanmingjie_effect"); - var skill = "clanmingjie_" + player.playerid; - game.broadcastAll(lib.skill.clanmingjie.initSkill, skill); - target.addTempSkill(skill, { player: "phaseAfter" }); - target.storage[skill] = player; - }, - ai: { - order: 10, - result: { - target(player, target) { - if (player.hasSkill("clanzhongliu") || player.hp == 1) { - if ( - !player.hasCard(card => { - var info = get.info(card); - if (info.allowMultiple == false) return false; - if (!lib.filter.targetEnabled2(card, player, target)) return false; - return game.hasPlayer(current => { - return player.canUse(card, current) && get.effect(current, card, player, player) > 0 && current != target && get.effect(target, card, player, player) > 0; - }); - }, "hs") - ) - return 0; - } else { - if ( - player.countCards("hs", card => { - var info = get.info(card); - if (info.allowMultiple == false) return false; - if (!lib.filter.targetEnabled2(card, player, target)) return false; - return game.hasPlayer(current => { - return player.canUse(card, current) && get.effect(current, card, player, player) > 0 && current != target && get.effect(target, card, player, player) > 0; - }); - }) < 3 - ) - return 0; - } - return get.sgnAttitude(player, target); - }, - }, - }, - subSkill: { - effect: { - charlotte: true, - audio: "clanmingjie", - trigger: { player: "useCard2" }, - filter(event, player) { - var card = event.card; - var info = get.info(card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - return game.filterPlayer().some(current => { - if (!current.hasSkill("clanmingjie_" + player.playerid)) return false; - return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && lib.filter.targetInRange(card, player, current); - }); - } - return false; - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget( - get.prompt("clanmingjie_effect"), - "令任意【铭戒】目标角色成为" + get.translation(trigger.card) + "的目标", - function (card, player, target) { - var trigger = _status.event.getTrigger(); - if (trigger.targets.includes(target) || !target.isIn() || !target.hasSkill("clanmingjie_" + player.playerid)) return false; - return lib.filter.targetEnabled2(trigger.card, player, target) && lib.filter.targetInRange(trigger.card, player, target); - }, - [1, Infinity] - ) - .set("ai", function (target) { - var player = _status.event.player; - var trigger = _status.event.getTrigger(); - return get.effect(target, trigger.card, player, player); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.logSkill("clanmingjie_effect", targets); - trigger.targets.addArray(targets); - game.log(targets, "成为了", trigger.card, "的额外目标"); - } - }, - group: "clanmingjie_targeted", - }, - targeted: { - charlotte: true, - trigger: { global: "phaseEnd" }, - filter(event, player) { - var cards = player.getStorage("clanmingjie_record").slice(); - cards = cards.filterInD("d"); - if (!cards.length) return false; - var history = player.getHistory("useSkill", evt => evt.skill == "clanmingjie"); - if (history.length) { - var targets = history.reduce((list, evt) => list.addArray(evt.targets), []); - if (event.player != player && targets.includes(event.player)) return true; - } - if (player.actionHistory.length >= 2) { - for (var i = player.actionHistory.length - 2; i >= 0; i--) { - if (!player.actionHistory[i].isMe) continue; - var history2 = player.actionHistory[i].useSkill.filter(evt => evt.skill == "clanmingjie"); - if (history2.length) { - var targets2 = history2.reduce((list, evt) => list.addArray(evt.targets), []); - if (targets2.includes(event.player)) return true; - } - break; - } - } - return false; - }, - forced: true, - popup: false, - content() { - "step 0"; - var cards = player.getStorage("clanmingjie_record").slice(); - cards = cards.filterInD("d"); - event.cards = cards; - "step 1"; - player - .chooseButton(["铭戒:是否使用这些牌?", cards]) - .set("filterButton", button => { - return _status.event.player.hasUseTarget(button.link); - }) - .set("ai", button => { - return _status.event.player.getUseValue(button.link); - }); - "step 2"; - if (result.bool) { - var card = result.links[0]; - event.cards.remove(card); - player.$gain2(card, false); - game.delayx(); - player.chooseUseTarget(card, true); - } else event.finish(); - "step 3"; - if ( - event.cards.filter(card => { - return get.position(card, true) == "d" && player.hasUseTarget(card); - }).length - ) - event.goto(1); - }, - }, - record: { - charlotte: true, - trigger: { - global: ["shaMiss", "eventNeutralized", "useCard1", "phaseAfter"], - }, - filter(event, player) { - if (event.name == "useCard") { - return get.suit(event.card) == "spade"; - } - if (event.name == "phase") return true; - if (event.type != "card") return false; - return true; - }, - silent: true, - forced: true, - content() { - "step 0"; - if (trigger.name == "phase") { - delete player.storage.clanmingjie_record; - return; - } - player.markAuto("clanmingjie_record", trigger.cards); - }, - }, - }, - }, - //族钟琰 - clanguangu: { - audio: 2, - enable: "phaseUse", - usable: 1, - zhuanhuanji: true, - mark: true, - marktext: "☯", - intro: { - content(storage) { - return "转换技。出牌阶段限一次,你可以观看" + (storage ? "一名角色的至多四张手" : "牌堆顶的至多四张") + "牌,然后可以使用其中的一张牌。"; - }, - }, - filter(event, player) { - if (player.storage.clanguangu) - return game.hasPlayer(current => { - return current.countCards("h"); - }); - return true; - }, - chooseButton: { - dialog(event, player) { - var dialog = ui.create.dialog("观骨:选择观看牌堆的牌数", "hidden"); - if (player.storage.clanguangu) dialog.forceDirect = true; - return dialog; - }, - chooseControl(event, player) { - var list = [1, 2, 3, 4].map(i => { - return get.cnNumber(i, true); - }); - list.push("cancel2"); - return list; - }, - check(button, player) { - var ret; - if (!player.hasSkill("clanxiaoyong")) ret = 4; - else { - var list = [4, 3, 2, 1]; - player.getHistory("useCard", evt => { - var len = get.cardNameLength(evt.card); - list.remove(len); - }); - if (list.length) ret = list[0]; - else ret = 4; - } - return get.cnNumber(ret, true); - }, - backup(result, player) { - return { - audio: "clanguangu", - filterCard: () => false, - selectCard: -1, - filterTarget(card, player, target) { - if (player.storage.clanguangu) return true; - return false; - }, - selectTarget() { - var player = _status.event.player; - if (player.storage.clanguangu) return 1; - return -1; - }, - num: result.index + 1, - content() { - "step 0"; - player.changeZhuanhuanji("clanguangu"); - if (!targets.length) { - var num = lib.skill.clanguangu_backup.num; - var cards = get.cards(num); - event.cards = cards.slice(0); - while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); - game.updateRoundNumber(); - event.goto(2); - } else { - var ret; - if (!player.hasSkill("clanxiaoyong")) ret = 4; - else { - var list = [4, 3, 2, 1]; - player.getHistory("useCard", evt => { - var len = get.cardNameLength(evt.card); - list.remove(len); - }); - if (list.length) ret = list[0]; - else ret = 4; - } - player - .choosePlayerCard(target, "h", true, [1, 4]) - .set("prompt", "观骨:观看" + get.translation(target) + "的至多四张牌") - .set("ai", button => { - if (ui.selected.buttons.length >= _status.event.num) return 0; - return Math.random(); - }) - .set("num", ret); - } - "step 1"; - if (result.bool) { - event.cards = result.links; - } else { - event.finish(); - } - "step 2"; - var count = cards.length; - event.getParent().viewedCount = count; - player - .chooseButton(["观骨:是否使用其中一张牌?", cards]) - .set("filterButton", button => { - var player = _status.event.player; - var card = button.link; - var cardx = { - name: get.name(card, get.owner(card)), - nature: get.nature(card, get.owner(card)), - cards: [card], - }; - return player.hasUseTarget(cardx, null, false); - }) - .set("ai", button => { - var len = _status.event.len; - var card = button.link; - var fix = 1; - if (get.cardNameLength(card) == len) fix = 2; - return fix * _status.event.player.getUseValue(card); - }) - .set( - "len", - (function () { - if (!player.hasSkill("clanxiaoyong")) return 0; - var list = []; - player.getHistory("useCard", evt => { - var len = get.cardNameLength(evt.card); - list.add(len); - }); - if (!list.includes(count)) return count; - if (list.length) return list.randomGet(); - return 4; - })() - ); - "step 3"; - if (result.bool) { - var card = result.links[0]; - cards.remove(card); - var cardx = { - name: get.name(card, get.owner(card)), - nature: get.nature(card, get.owner(card)), - cards: [card], - }; - var next = player.chooseUseTarget(cardx, [card], true, false).set("oncard", card => { - var owner = _status.event.getParent().owner; - if (owner) owner.$throw(card.cards); - }); - if (card.name === cardx.name && get.is.sameNature(card, cardx, true)) next.viewAs = false; - var owner = get.owner(card); - if (owner != player && get.position(card) == "h") { - next.throw = false; - next.set("owner", owner); - } - } - }, - ai: { - order: 10, - result: { - target(player, target) { - return -Math.min(target.countCards("h"), 4) / 2; - }, - }, - }, - }; - }, - prompt(result, player) { - if (!player.storage.clanguangu) return "点击“确定”以观看牌堆顶牌"; - return "观骨:选择观看牌的目标"; - }, - }, - subSkill: { - backup: {}, - }, - ai: { - order: 10, - result: { - player: 1, - }, - }, - }, - clanxiaoyong: { - audio: 2, - trigger: { - player: "useCard", - }, - filter(event, player) { - var len = get.cardNameLength(event.card); - if ( - player.hasHistory( - "useCard", - function (evt) { - return evt != event && get.cardNameLength(evt.card) == len; - }, - event - ) - ) - return false; - if (!player.getStat().skill.clanguangu) return false; - var history = player - .getAllHistory("useSkill", evt => { - return evt.skill == "clanguangu_backup"; - }) - .map(evt => evt.event); - if (!history.length) return false; - var num = 0; - for (var i = history.length - 1; i >= 0; i--) { - var evt = history[i]; - if (evt.viewedCount) { - num = evt.viewedCount; - break; - } - } - if (num && len == num) return true; - return false; - }, - forced: true, - content() { - "step 0"; - delete player.getStat().skill.clanguangu; - game.log(player, "重置了", "#g【观骨】"); - }, - ai: { - combo: "clanguangu", - }, - mod: { - aiOrder(player, card, num) { - if (!player.hasSkill("clanguangu") || !player.getStat().skill.clanguangu) return; - var history = player - .getAllHistory("useSkill", evt => { - return evt.skill == "clanguangu_backup"; - }) - .map(evt => evt.event); - if (!history.length) return; - var numx = 0; - for (var i = history.length - 1; i >= 0; i--) { - var evt = history[i]; - if (evt.viewedCount) { - numx = evt.viewedCount; - break; - } - } - if (numx == get.cardNameLength(card)) { - if ( - !player.hasHistory("useCard", evt => { - return numx == get.cardNameLength(evt.card); - }) - ) { - return num + 9; - } - } - }, - }, - }, - clanbaozu: { - audio: 2, - audioname: ["clan_zhongyan", "clan_zhongyu", "clan_zhongyao"], - audioname2: { clan_zhonghui: "clanbaozu_clan_zhonghui" }, - trigger: { global: "dying" }, - clanSkill: true, - limited: true, - skillAnimation: true, - animationColor: "water", - filter(event, player) { - return (event.player == player || event.player.hasClan("颍川钟氏")) && event.player.hp <= 0 && !event.player.isLinked(); - }, - logTarget: "player", - check(event, player) { - return lib.skill.wanlan.check(event, player); - }, - content() { - "step 0"; - player.awakenSkill("clanbaozu"); - "step 1"; - trigger.player.link(true); - trigger.player.recover(); - }, - subSkill: { clan_zhonghui: { audio: 6 } }, - }, - //族王淩 - clanbolong: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("he") > 0; - }, - filterTarget: lib.filter.notMe, - content() { - "step 0"; - var num = player.countCards("h"); - var str = "是否交给其" + get.cnNumber(num) + "张牌,然后视为你对其使用一张【酒】?或者点击“取消”,令其交给你一张牌,然后其视为对你使用一张雷【杀】。"; - if (!num || target.countCards("he") < num) event._result = { bool: false }; - else - target - .chooseCard(get.translation(player) + "对你发动了【驳龙】", str, num, "he") - .set("ai", card => { - if (_status.event.canGive) return 5 + Math.max(0, 3 - _status.event.player.hp) / 1.5 - get.value(card); - return 0; - }) - .set( - "canGive", - (function () { - if (get.attitude(target, player) > 1) return true; - if (!player.hasSha() && player.countCards("h") <= 4) return true; - var sha = { - name: "sha", - nature: "thunder", - isCard: true, - }; - if ( - game.hasPlayer(current => { - return player.canUse(sha, current, true, true) && get.effect(current, sha, player, target) < 0 && !current.countCards("hs", ["shan", "caochuan"]); - }) - ) - return false; - return true; - })() - ); - "step 1"; - if (result.bool) { - var cards = result.cards; - target.give(cards, player); - if (lib.filter.targetEnabled2({ name: "jiu", isCard: true }, target, player)) target.useCard({ name: "jiu", isCard: true }, player, false); - event.finish(); - } else { - player.chooseCard("驳龙:交给" + get.translation(target) + "一张牌", get.translation(target) + "拒绝给牌,请交给其一张牌然后视为对其使用一张雷【杀】", true, "he"); - } - "step 2"; - if (result.bool) { - var cards = result.cards; - player.give(cards, target); - var sha = { - name: "sha", - nature: "thunder", - isCard: true, - }; - if (player.canUse(sha, target, false, false)) player.useCard(sha, target, false); - } - }, - ai: { - order(item, player) { - return get.order({ name: "jiu" }) + 0.01; - }, - threaten: 2, - result: { - target(player, target) { - if ( - player.hasCard(card => { - return get.value(card) < 5 && !["shan", "tao", "jiu", "wuxie", "caochuan"].includes(get.name(card)); - }, "he") - ) - return -1; - return 0; - }, - }, - }, - }, - clanzhongliu: { - audio: 2, - audioname: ["clan_wangling", "clan_wangyun", "clan_wanghun", "clan_wanglun", "clan_wangguang", "clan_wangmingshan"], - trigger: { player: "useCard" }, - forced: true, - clanSkill: true, - filter(event, player) { - if (!event.cards.length) return true; - return !game.hasPlayer2(current => { - if (!current.hasClan("太原王氏") && current != player) return false; - return current.hasHistory("lose", evt => { - return evt.getParent() == event && evt.hs.length > 0; - }); - }); - }, - content() { - "step 0"; - var skills = player.getStockSkills(true, true); - game.expandSkills(skills); - var resetSkills = []; - var suffixs = ["used", "round", "block", "blocker"]; - for (var skill of skills) { - var info = get.info(skill); - if (typeof info.usable == "number") { - if (player.hasSkill("counttrigger") && player.storage.counttrigger[skill] && player.storage.counttrigger[skill] >= 1) { - delete player.storage.counttrigger[skill]; - resetSkills.add(skill); - } - if (typeof get.skillCount(skill) == "number" && get.skillCount(skill) >= 1) { - delete player.getStat("skill")[skill]; - resetSkills.add(skill); - } - } - if (info.round && player.storage[skill + "_roundcount"]) { - delete player.storage[skill + "_roundcount"]; - resetSkills.add(skill); - } - if (player.storage[`temp_ban_${skill}`]) { - delete player.storage[`temp_ban_${skill}`]; - } - if (player.awakenedSkills.includes(skill)) { - player.restoreSkill(skill); - resetSkills.add(skill); - } - for (var suffix of suffixs) { - if (player.hasSkill(skill + "_" + suffix)) { - player.removeSkill(skill + "_" + suffix); - resetSkills.add(skill); - } - } - } - if (resetSkills.length) { - var str = ""; - for (var i of resetSkills) { - str += "【" + get.translation(i) + "】、"; - } - game.log(player, "重置了技能", "#g" + str.slice(0, -1)); - } - }, - }, - //族吴匡 - clanlianzhu: { - audio: 2, - zhuanhuanji: true, - mark: true, - marktext: "☯", - intro: { - content(storage) { - var str = "转换技。每名角色A的出牌阶段限一次。"; - if (!storage) str += "A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1。"; - else str += "A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1"; - return str; - }, - }, - global: "clanlianzhu_global", - subSkill: { - global: { - forceaudio: true, - audio: "clanlianzhu", - enable: "phaseUse", - filter: (event, player) => game.hasPlayer(current => lib.skill.clanlianzhu_global.filterTarget(null, player, current)), - filterCard: (card, player) => game.hasPlayer(current => current.hasSkill("clanlianzhu") && !current.hasSkill("clanlianzhu_targeted") && !current.storage.clanlianzhu) && player.canRecast(card), - selectCard: [0, 1], - check(card) { - return 5 - get.value(card); - }, - filterTarget(card, player, target) { - return ( - target.hasSkill("clanlianzhu") && - !target.hasSkill("clanlianzhu_targeted") && - (!target.storage.clanlianzhu || - (target.storage.clanlianzhu && - game.hasPlayer(current => { - if (current == player || current == target) return false; - return current.inRangeOf(player) || current.inRangeOf(target); - }))) - ); - }, - selectTarget() { - var player = _status.event.player; - var count = game.countPlayer(current => lib.skill.clanlianzhu_global.filterTarget(null, player, current)); - return count == 1 ? -1 : 1; - }, - filterOk() { - var target = ui.selected.targets[0]; - if (!target) return false; - if (!target.storage.clanlianzhu) { - return ui.selected.cards.length == 1; - } - return ui.selected.cards.length == 0; - }, - position: "he", - discard: false, - lose: false, - delay: false, - prompt() { - var player = _status.event.player; - var bocchi = [], - kita = []; - game.countPlayer(function (target) { - if (target.hasSkill("clanlianzhu") && !target.hasSkill("clanlianzhu_targeted")) { - if (target.storage.clanlianzhu) { - if ( - game.hasPlayer(current => { - if (current == player || current == target) return false; - return current.inRangeOf(player) || current.inRangeOf(target); - }) - ) - kita.add(target); - } else { - if (player.countCards("he") > 0) bocchi.add(target); - } - } - }); - bocchi.sortBySeat(); - kita.sortBySeat(); - var str = ""; - if (bocchi.length) { - str += "重铸一张牌,然后令"; - bocchi.forEach((current, i) => { - str += get.translation(current); - if (i < bocchi.length - 1) str += "或"; - }); - str += "选择是否重铸一张牌"; - if (kita.length) str += "。
    或者"; - } - if (kita.length) { - str += "令"; - kita.forEach((current, i) => { - str += get.translation(current); - if (i < kita.length - 1) str += "或"; - }); - str += "选择一名目标,然后对其进行集火"; - } - str += "。"; - return str; - }, - content() { - "step 0"; - target.addTempSkill("clanlianzhu_targeted", "phaseUseAfter"); - if (target.storage.clanlianzhu) event.goto(4); - target.changeZhuanhuanji("clanlianzhu"); - "step 1"; - player.recast(cards); - "step 2"; - if (!target.countCards("he") && !_status.connectMode) event._result = { bool: false }; - else target.chooseCard("he", "联诛:是否重铸一张牌?", lib.filter.cardRecastable); - "step 3"; - if (result.bool) { - target.recast(result.cards); - if (get.color(cards[0]) === get.color(result.cards[0])) lib.skill.chenliuwushi.change(target, 1); - } - event.finish(); - "step 4"; - target - .chooseTarget("联诛:选择其与你使用【杀】的目标", true, (card, player, target) => { - if (target == player || target == _status.event.sourcex) return false; - return target.inRangeOf(player) || target.inRangeOf(_status.event.sourcex); - }) - .set("ai", target => { - return get.effect(target, { name: "sha" }, _status.event.player, _status.event.player); - }) - .set("sourcex", player); - "step 5"; - if (result.bool) { - var targetx = result.targets[0]; - event.targetx = targetx; - target.line(targetx); - event.targets = [player, target]; - event.cards = []; - if (!event.isMine() && !event.isOnline()) game.delayx(); - } else event.finish(); - "step 6"; - var current = targets.shift(); - current - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "联诛:是否对" + get.translation(event.targetx) + "使用一张杀?") - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", event.targetx) - .set("addCount", false); - "step 7"; - if (result.bool) cards.push(result.card); - if (targets.length > 0) event.goto(6); - "step 8"; - if (cards.length > 1) { - const color = get.color(cards[0], false); - if (color != "none") { - for (let i = 1; i < cards.length; i++) { - const color2 = get.color(cards[i], false); - if (color !== color2 && color2 !== "none") { - lib.skill.chenliuwushi.change(target, -1); - break; - } - } - } - } - }, - ai: { - order: 4.1, - result: { - player(player, target) { - if (!target.storage.clanlianzhu && player.hasCard(card => get.value(card) < 5, "he")) return 1; - return 0; - }, - target(player, target) { - if (target.storage.clanlianzhu && player.hasSha()) return 1; - return 0; - }, - }, - }, - }, - targeted: { charlotte: true }, - }, - }, - //族韩韶 - clanfangzhen: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return game.hasPlayer(current => !current.isLinked()); - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("clanfangzhen"), (card, player, target) => { - return !target.isLinked(); - }) - .set("ai", target => { - var player = _status.event.player; - if (_status.event.goon && target != player) { - target.classList.add("linked"); - target.classList.add("linked2"); - try { - var cards = player.getCards("hs", cardx => { - if (get.name(cardx) != "sha") return false; - return game.hasNature(cardx, "linked"); - }); - cards.map(i => [i, get.effect(target, i, player, player)]); - cards.sort((a, b) => b[1] - a[1]); - } catch (e) { - target.classList.remove("linked"); - target.classList.remove("linked2"); - } - target.classList.remove("linked"); - target.classList.remove("linked2"); - var eff = cards[0][1]; - if (eff > 0) return eff; - return Math.max(2 * get.effect(target, { name: "draw" }, player, player) + 0.6 * get.effect(player, { name: "draw" }, player, player), get.recoverEffect(target, player, player)); - } - return Math.max(2 * get.effect(target, { name: "draw" }, player, player) + 0.6 * get.effect(player, { name: "draw" }, player, player), get.recoverEffect(target, player, player)); - }) - .set( - "goon", - player.countCards("hs", card => { - return get.name(card) == "jiu" && player.hasUseTarget(card); - }) && - player.countCards("hs", card => { - if (get.name(card) != "sha") return false; - return game.hasNature(card, "linked"); - }) - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("clanfangzhen", target); - player.addSkill("clanfangzhen_remove"); - player.markAuto("clanfangzhen_remove", [target.getSeatNum()]); - target.link(true); - var choices = ["选项一"], - choiceList = ["摸两张牌,然后交给" + get.translation(target) + "两张牌", "令" + get.translation(target) + "回复1点体力"]; - if (target.isDamaged()) choices.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - player - .chooseControl(choices) - .set("prompt", "放赈:请选择一项") - .set("choiceList", choiceList) - .set("ai", () => { - var player = _status.event.player, - target = _status.event.getParent().target; - if (!target.isDamaged()) return 0; - if (get.attitude(player, target) <= 0 && player.countCards("he", card => get.value(card) < 0) >= 2) return 0; - return 2 * get.effect(target, { name: "draw" }, player, player) + 0.6 * get.effect(player, { name: "draw" }, player, player) > get.recoverEffect(target, player, player) ? 0 : 1; - }); - } else event.finish(); - "step 2"; - if (result.control == "选项一") { - player.draw(2); - if (player == target) event.finish(); - } else { - target.recover(); - event.finish(); - } - "step 3"; - if (!player.countCards("he")) event.finish(); - else if (player.countCards("he") <= 2) - event._result = { - bool: true, - cards: player.getCards("he"), - }; - else { - player.chooseCard("放赈:交给" + get.translation(target) + "两张牌", "he", 2, true); - } - "step 4"; - if (result.bool) { - player.give(result.cards, target); - } - }, - ai: { - expose: 0.2, - }, - subSkill: { - remove: { - trigger: { global: "roundStart" }, - onremove: true, - forced: true, - locked: false, - charlotte: true, - filter(event, player) { - return player.getStorage("clanfangzhen_remove").includes(game.roundNumber); - }, - content() { - player.removeSkills("clanfangzhen"); - }, - }, - }, - }, - clanliuju: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - filter(event, player) { - return game.hasPlayer(current => player.canCompare(current)); - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt("clanliuju"), "与一名其他角色拼点,输的角色可以使用任意张拼点牌中的非基本牌", (card, player, target) => { - return player.canCompare(target); - }) - .set("ai", target => { - var player = _status.event.player; - var ts = target.getCards("h").sort((a, b) => get.number(a) - get.number(b)); - if (get.attitude(player, target) < 0) { - var hs = player.getCards("h").sort((a, b) => get.number(a) - get.number(b)); - if (!hs.length || !ts.length) return 0; - if (get.type(hs[0], null, false) == "basic" && get.value(hs[0]) > 6) return 0; - if (get.number(hs[0]) < get.number(ts[0]) || get.type(hs[0], null, false) == "basic") return 1; - return Math.random() - 0.7; - } - return get.type(ts[0]) != "basic"; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("clanliuju", target); - player.chooseToCompare(target).set("small", true); - } else event.finish(); - "step 2"; - if (!result.tie) { - var loser = result.bool ? target : player; - var cards = []; - game.getGlobalHistory("cardMove", evt => { - if (evt.getParent(2) == event) - cards.addArray( - evt.cards.filter(i => { - return get.position(i, true) == "d" && get.type(i, null, false) != "basic"; - }) - ); - }); - event.loser = loser; - event.distance = [get.distance(player, target), get.distance(target, player)]; - if (cards.length) event.cards = cards; - else event.finish(); - } else event.finish(); - "step 3"; - var cardsx = cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i)); - if (!cardsx.length) event.goto(6); - else - event.loser - .chooseButton(["留驹:是否使用其中的一张牌?", cardsx]) - .set("filterButton", button => { - return _status.event.player.hasUseTarget(button.link); - }) - .set("ai", button => { - return _status.event.player.getUseValue(button.link) + 0.1; - }); - "step 4"; - if (result.bool) { - var card = result.links[0]; - event.cards.remove(card); - event.loser.$gain2(card, false); - game.delayx(); - event.loser.chooseUseTarget(true, card, false); - } else event.goto(6); - "step 5"; - if (cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i)).length) event.goto(3); - "step 6"; - if (get.distance(player, target) != event.distance[0] || get.distance(target, player) != event.distance[1]) { - player.restoreSkill("clanxumin"); - game.log(player, "重置了", "#g【恤民】"); - } - }, - }, - clanxumin: { - audio: 2, - audioname: ["clan_hanshao", "clan_hanrong"], - enable: "phaseUse", - viewAs: { name: "wugu" }, - filterCard: true, - filterTarget(card, player, target) { - if (player == target) return false; - return player.canUse(card, target); - }, - selectTarget: [1, Infinity], - check(card) { - return 6 - get.value(card); - }, - position: "he", - limited: true, - clanSkill: true, - skillAnimation: true, - animationColor: "soil", - precontent() { - player.logSkill("clanxumin"); - player.awakenSkill("clanxumin"); - delete event.result.skill; - }, - ai: { - order: 7, - result: { target: 1 }, - }, - }, - //族韩融 - //我们连和!(?) - clanlianhe: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return game.hasPlayer(current => !current.isLinked()); - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("clanlianhe"), 2, (card, player, target) => { - return !target.isLinked(); - }) - .set("ai", target => { - var att = get.attitude(_status.event.player, target); - if (att > 0) att /= 1.2; - return Math.abs(att); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - targets.forEach(i => i.link(true)); - player.logSkill("clanlianhe", targets); - player.addSkill("clanlianhe_effect"); - player.markAuto("clanlianhe_effect", targets); - } - }, - subSkill: { - effect: { - trigger: { global: ["phaseUseEnd", "die"] }, - charlotte: true, - forced: true, - locked: false, - popup: false, - onremove: true, - filter(event, player) { - return player.getStorage("clanlianhe_effect").includes(event.player); - }, - marktext: "连", - intro: { content: "已选择目标:$" }, - content() { - "step 0"; - player.unmarkAuto("clanlianhe_effect", [trigger.player]); - if (trigger.name == "die") event.finish(); - "step 1"; - if ( - trigger.player.hasHistory("gain", evt => { - return evt.getParent().name == "draw" && evt.getParent("phaseUse") == trigger; - }) - ) - event.finish(); - else { - player.logSkill("clanlianhe_effect", trigger.player); - var num = 0; - trigger.player.getHistory("gain", evt => { - if (evt.getParent("phaseUse") != trigger) return false; - num += evt.cards.length; - }); - num = Math.min(num, 3); - event.num = num; - if (num <= 1) event._result = { bool: false }; - else { - var pos = player == trigger.player ? "e" : "he"; - trigger.player - .chooseCard("连和:交给" + get.translation(player) + get.cnNumber(num - 1) + "张牌,或点“取消”令其摸" + get.cnNumber(num + 1) + "张牌", num - 1, pos) - .set("ai", card => { - if (_status.event.draw) return 0; - return 5 - get.value(card); - }) - .set("draw", get.attitude(trigger.player, player) >= 0); - } - } - "step 2"; - if (result.bool) { - trigger.player.give(result.cards, player); - } else player.draw(num + 1); - }, - }, - }, - }, - clanhuanjia: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - filter(event, player) { - return game.hasPlayer(current => player.canCompare(current)); - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt("clanhuanjia"), "与一名其他角色拼点,赢的角色可以使用一张拼点牌。若此牌未造成过伤害,你获得另一张拼点牌,否则你失去一个技能", (card, player, target) => { - return player.canCompare(target); - }) - .set("ai", target => { - var player = _status.event.player; - if (get.attitude(player, target) <= 0) { - var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); - var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); - if (!hs.length || !ts.length) return 0; - if (get.number(hs[0]) > get.number(ts[0]) && !get.tag(hs[0], "damage") && player.hasValueTarget(hs[0])) return 1; - return Math.random() - 0.4; - } - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("clanhuanjia", target); - player.chooseToCompare(target); - } else event.finish(); - "step 2"; - if (!result.tie) { - var winner = result.bool ? player : target; - var cards = []; - game.getGlobalHistory("cardMove", evt => { - if (evt.getParent(3) == event) cards.addArray(evt.cards.filterInD("d")); - }); - event.winner = winner; - if (cards.length) event.cards = cards; - else event.finish(); - } else event.finish(); - "step 3"; - var cardsx = cards.filter(i => get.position(i, true) == "d" && event.winner.hasUseTarget(i)); - if (!cardsx.length) event.goto(6); - else - event.winner - .chooseButton(["缓颊:是否使用其中的一张牌?", cardsx]) - .set("filterButton", button => { - return _status.event.player.hasUseTarget(button.link); - }) - .set("ai", button => { - var damage = 1; - if (_status.event.att > 2 && get.tag(button.link, "damage")) damage *= 2; - return _status.event.player.getUseValue(button.link) * damage + 0.1; - }) - .set("att", get.attitude(event.winner, player)); - "step 4"; - if (result.bool) { - var card = result.links[0]; - event.card = card; - event.cards.remove(card); - event.winner.$gain2(card, false); - game.delayx(); - event.winner.chooseUseTarget(true, card, false); - } - "step 5"; - if ( - game.hasPlayer2(current => { - return current.hasHistory("sourceDamage", evt => evt.cards && evt.cards[0] == card); - }) - ) { - var skills = player.getSkills(null, false, false).filter(skill => { - var info = get.info(skill); - if (!info || get.is.empty(info) || info.charlotte) return false; - return true; - }); - player - .chooseControl(skills) - .set( - "choiceList", - skills.map(i => { - return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; - }) - ) - .set("displayIndex", false) - .set("prompt", "恤民:失去一个技能") - .set("ai", () => { - var choices = _status.event.controls.slice(); - var value = skill => get.skillRank(skill, "in") + get.skillRank(skill, "out"); - choices = choices.map(skill => [skill, value(skill)]); - var list = choices.sort((a, b) => a[1] - b[1])[0]; - if (list[1] < 2) return list[0]; - else { - if (_status.event.controls.includes("clanxumin")) return "clanxumin"; - return list[0]; - } - }); - } else { - player.gain(cards, "gain2"); - event.finish(); - } - "step 6"; - player.removeSkills(result.control); - }, - ai: { - expose: 0.1, - }, - }, - //族荀谌 - clansankuang: { - audio: 2, - trigger: { player: "useCardAfter" }, - direct: true, - forced: true, - filter(event, player) { - if (!game.hasPlayer(current => current != player)) return false; - const type = get.type2(event.card); - return player.getRoundHistory("useCard", evt => get.type2(evt.card) == type).indexOf(event) == 0; - }, - getNum(player) { - return (player.countCards("ej") > 0) + player.isDamaged() + (Math.max(0, player.hp) < player.countCards("h")); - }, - content() { - "step 0"; - var cards = trigger.cards.filterInD("oe"); - player - .chooseTarget("三恇:选择一名其他角色", "令其交给你至少X张牌" + (cards.length ? ",然后其获得" + get.translation(cards) : "") + "(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)", true, lib.filter.notMe) - .set("ai", target => { - var att = get.attitude(player, target), - num = lib.skill.clansankuang.getNum(target); - if (num == 0) return att; - if (_status.event.goon) return -att; - return -Math.sqrt(Math.abs(att)) - lib.skill.clansankuang.getNum(target); - }) - .set( - "goon", - Math.max.apply( - Math, - trigger.cards.map(i => get.value(i)) - ) <= 5 || trigger.cards.filterInD("oe").length == 0 - ); - "step 1"; - if (result.bool) { - var target = result.targets[0], - num = lib.skill.clansankuang.getNum(target), - num2 = target.countCards("he"); - event.target = target; - player.logSkill("clansankuang", target); - if (num2 == 0) event._result = { bool: false }; - else if (num2 <= num) - event._result = { - bool: true, - cards: target.getCards("he"), - }; - else { - var cards = trigger.cards.filterInD("oe"); - target - .chooseCard("he", num > 0, [num, Infinity]) - .set("ai", get.unuseful) - .set("prompt", num > 0 ? "是否交给" + get.translation(player) + "任意张牌" + (cards.length ? "并获得" + get.translation(cards) : "") + "?" : "交给" + get.translation(player) + "至少" + get.cnNumber(num) + "张牌"); - } - } else event.finish(); - "step 2"; - if (result.bool) { - var cards = result.cards; - target.give(cards, player); - game.delayx(); - } else event.finish(); - "step 3"; - if (trigger.cards.filterInD().length) target.gain(trigger.cards.filterInD(), "gain2", "bySelf"); - else if (trigger.cards.filterInD("e").length) target.gain(trigger.cards.filterInD("e"), get.owner(trigger.cards.filterInD("e")[0]), "give"); - }, - ai: { - reverseOrder: true, - skillTagFilter(player) { - if (player.getHistory("useCard", evt => get.type(evt.card) == "equip").length > 0) return false; - }, - effect: { - target(card, player, target) { - if (player == target && get.type(card) == "equip" && !player.getHistory("useCard", evt => get.type(evt.card) == "equip").length == 0) return [1, 3]; - }, - }, - threaten: 1.6, - }, - }, - clanbeishi: { - audio: 2, - trigger: { - global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - forced: true, - filter(event, player) { - var history = player.getAllHistory("useSkill", evt => evt.skill == "clansankuang"); - if (!history.length) return false; - var target = history[0].targets[0]; - if (target.countCards("h")) return false; - var evt = event.getl(target); - return evt && evt.hs && evt.hs.length; - }, - content() { - player.recover(); - }, - ai: { - combo: "clansankuang", - }, - }, - //族荀淑 - clanshenjun: { - audio: 2, - trigger: { - global: "useCard", - }, - forced: true, - locked: false, - filter(event, player) { - return (event.card.name == "sha" || get.type(event.card) == "trick") && player.countCards("h", event.card.name) > 0; - }, - content() { - var cards = player.getCards("h", trigger.card.name); - player.showCards(cards, get.translation(player) + "发动了【神君】"); - player.markSkill("clanshenjun"); - player.addGaintag(cards, "clanshenjun"); - for (var name of lib.phaseName) { - var evt = _status.event.getParent(name); - if (!evt || evt.name != name) continue; - player.addTempSkill("clanshenjun_viewAs", name + "After"); - break; - } - }, - marktext: "君", - intro: { - markcount(storage, player) { - return player.countCards("h", card => card.hasGaintag("clanshenjun")); - }, - mark(dialog, content, player) { - var cards = player.getCards("h", card => card.hasGaintag("clanshenjun")); - if (cards.length) { - dialog.addAuto(cards); - } else return "无展示牌"; - }, - }, - subSkill: { - viewAs: { - trigger: { - global: ["phaseZhunbeiEnd", "phaseJudgeEnd", "phaseDrawEnd", "phaseUseEnd", "phaseDiscardEnd", "phaseJieshuEnd"], - }, - filter(event, player) { - return player.countCards("h", card => card.hasGaintag("clanshenjun")) > 0; - }, - forced: true, - charlotte: true, - content() { - "step 0"; - var cards = player.getCards("h", card => card.hasGaintag("clanshenjun")); - var list = [], - names = []; - for (var card of cards) { - var name = get.name(card), - nature = get.nature(card); - var namex = name; - if (nature && nature.length) { - namex += nature; - if (names.includes(namex)) continue; - list.push([get.type(card), "", name, nature]); - } else { - if (names.includes(namex)) continue; - list.push([get.type(card), "", name]); - } - names.push(namex); - } - list.sort((a, b) => { - var del1 = lib.inpile.indexOf(a[2]) - lib.inpile.indexOf(b[2]); - if (del1 != 0) return del1; - var a1 = 0, - b1 = 0; - if (a.length > 3) a1 = lib.nature.get(a) || 0; - if (b.length > 3) b1 = lib.nature.get(b) || 0; - return a1 - b1; - }); - player.chooseButton(["是否将" + get.cnNumber(cards.length) + "张牌当下列一张牌使用?", [list, "vcard"]]).set("ai", function (button) { - return _status.event.player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }); - "step 1"; - if (result.bool) { - var name = result.links[0][2], - nature = result.links[0][3]; - var cards = player.getCards("h", card => card.hasGaintag("clanshenjun")); - game.broadcastAll( - function (num, card) { - lib.skill.clanshenjun_backup.selectCard = num; - lib.skill.clanshenjun_backup.viewAs = card; - }, - cards.length, - { name: name, nature: nature } - ); - var next = player.chooseToUse(); - next.set("openskilldialog", "将" + get.cnNumber(cards.length) + "张牌当做" + (get.translation(nature) || "") + "【" + get.translation(name) + "】使用"); - next.set("norestore", true); - next.set("addCount", false); - next.set("_backupevent", "clanshenjun_backup"); - next.set("custom", { - add: {}, - replace: { window() {} }, - }); - next.backup("clanshenjun_backup"); - } - }, - }, - backup: { - filterCard(card) { - return get.itemtype(card) == "card"; - }, - position: "hes", - filterTarget: lib.filter.filterTarget, - check: card => 6 - get.value(card), - log: false, - precontent() { - delete event.result.skill; - }, - }, - }, - }, - clanbalong: { - audio: 2, - trigger: { - player: ["damageEnd", "recoverEnd", "loseHpEnd"], - }, - forced: true, - filter(event, player) { - if (game.getGlobalHistory("changeHp", evt => evt.player == player).length != 1) return false; - var cards = player.getCards("h"), - map = {}; - if (!cards.length) return false; - for (var card of cards) { - var type = get.type2(card); - if (typeof map[type] != "number") map[type] = 0; - map[type]++; - } - var list = []; - for (var i in map) { - if (map[i] > 0) list.push([i, map[i]]); - } - list.sort((a, b) => b[1] - a[1]); - return list[0][0] == "trick" && (list.length == 1 || list[0][1] > list[1][1]); - }, - content() { - player.showHandcards(get.translation(player) + "发动了【八龙】"); - player.drawTo(game.countPlayer()); - }, - }, - //族荀粲 - clanyunshen: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return player != target && target.isDamaged(); - }, - content() { - "step 0"; - target.recover(); - "step 1"; - var name = get.translation(target); - player - .chooseControl() - .set("choiceList", [name + "视为对你使用一张冰【杀】", "你视为对" + name + "使用一张冰【杀】"]) - .set("prompt", "熨身:请选择一项") - .set("ai", () => _status.event.choice) - .set( - "choice", - (function () { - var card = { - name: "sha", - nature: "ice", - isCard: true, - }; - var eff = get.effect(player, card, target, player), - eff2 = get.effect(target, card, player, player); - if (eff > eff2) return "选项一"; - else return "选项二"; - })() - ); - "step 2"; - var players = [target, player]; - if (result.control == "选项二") players.reverse(); - var card = { name: "sha", nature: "ice", isCard: true }; - if (players[0].canUse(card, players[1], false)) players[0].useCard(card, players[1], false, "noai"); - }, - ai: { - order: 2, - expose: 0.2, - result: { - target(player, target) { - var eff = get.recoverEffect(target, player, player); - if (eff > 0) return 1; - else if ( - get.effect( - target, - { - name: "sha", - nature: "ice", - isCard: true, - }, - player, - player - ) > eff - ) - return -1; - return 0; - }, - }, - }, - }, - clanshangshen: { - audio: 2, - trigger: { global: "damageEnd" }, - filter(event, player) { - if (!event.hasNature() || !event.player.isIn()) return false; - return ( - game.countPlayer2(current => { - return current.hasHistory("damage", evt => { - return evt.hasNature() && evt != event; - }); - }) == 0 - ); - }, - logTarget: "player", - check(event, player) { - if (get.attitude(player, event.player) <= 2) return false; - if (event.player.countCards("h") >= 4) return false; - return true; - }, - content() { - player.executeDelayCardEffect("shandian"); - trigger.player.drawTo(4); - }, - ai: { expose: 0.25 }, - }, - clanfenchai: { - audio: 2, - init(player) { - if (player.getStorage("clanfenchai").length > 0) return; - var history = player.getHistory("useSkill", evt => { - if (evt.type != "player") return false; - var skill = evt.sourceSkill || evt.skill, - targets = evt.targets; - var info = get.info(skill); - if (!info || info.charlotte) return false; - if (targets && targets.length) { - if (targets.filter(i => player.differentSexFrom(i)).length > 0) return true; - } - return false; - }); - if (history.length) { - var evt = history[0], - targets = evt.targets; - player.markAuto( - "clanfenchai", - targets.filter(i => player.differentSexFrom(i)) - ); - } - }, - trigger: { - player: ["logSkill", "useSkillAfter"], - }, - forced: true, - silent: true, - onremove: true, - marktext: "钗", - intro: { - content: (storage, player) => "对象:" + get.translation(storage), - }, - group: "clanfenchai_audio", - filter(event, player) { - if (event.type != "player") return false; - var targets = event.targets; - if (!targets || !targets.length) return false; - var info = get.info(event.sourceSkill || event.skill); - if (!info || info.charlotte) return false; - if (player.getStorage("clanfenchai").length != 0) return false; - return targets.filter(i => player.differentSexFrom(i)).length > 0; - }, - content() { - player.markAuto( - "clanfenchai", - trigger.targets.filter(i => player.differentSexFrom(i)) - ); - }, - subSkill: { - audio: { - audio: "clanfenchai", - forced: true, - trigger: { player: "judge" }, - filter(event, player) { - return player.getStorage("clanfenchai").length; - }, - content() {}, - }, - }, - mod: { - suit(card, suit) { - var player = get.owner(card) || _status.event.player; - if (!player || !player.judging || player.judging[0] != card) return; - var storage = player.getStorage("clanfenchai"); - if (!storage.length) return; - return storage.filter(i => i.isIn()).length > 0 ? "heart" : "spade"; - }, - }, - }, - //族荀采 - clanlieshi: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return !player.isDisabledJudge() || player.countCards("h", card => ["sha", "shan"].includes(get.name(card))) > 0; - }, - chooseButton: { - dialog(event, player) { - var dialog = ui.create.dialog("烈誓:选择一项", "hidden"); - dialog.add([lib.skill.clanlieshi.choices.slice(), "textbutton"]); - return dialog; - }, - filter(button, player) { - var link = button.link; - if (link == "damage") return !player.isDisabledJudge(); - var num = player.countCards("h", link); - return num > 0 && num == player.getDiscardableCards(player, "h").filter(i => get.name(i) == link).length; - }, - check(button) { - var player = _status.event.player; - switch (button.link) { - case "damage": - if (get.damageEffect(player, player, player, "fire") >= 0) return 10; - if (player.hp >= Math.max(2, 3 - player.getFriends().length) && game.countPlayer(current => get.attitude(player, current) < 0 && current.countCards("h", card => ["sha", "shan"].includes(get.name(card))))) return 0.8 + Math.random(); - return 0; - case "shan": - if (player.countCards("h", "shan") == 1) return 8 + Math.random(); - return 1 + Math.random(); - case "sha": - if (player.countCards("h", "sha") == 1) return 8 + Math.random(); - return 0.9 + Math.random(); - } - }, - backup(links) { - var next = get.copy(lib.skill["clanlieshi_backupx"]); - next.choice = links[0]; - return next; - }, - prompt(links) { - if (links[0] == "damage") return "废除判定区并受到1点火焰伤害"; - return "弃置所有【" + get.translation(links[0]) + "】"; - }, - }, - choices: [ - ["damage", "废除判定区并受到1点火焰伤害"], - ["shan", "弃置所有【闪】"], - ["sha", "弃置所有【杀】"], - ], - ai: { - order(item, player) { - if (!player) return; - var eff = get.damageEffect(player, player, player, "fire"), - disabled = !player.isDisabledJudge(); - if ((player.countCards("h", "sha") == 1 || player.countCards("h", "shan") == 1) && eff < 0 && !disabled) return 8; - else if (eff >= 0 && !disabled) return 5.8; - if (!disabled && !player.countCards("h", card => ["sha", "shan"].includes(get.name(card)))) { - if ((!player.hasSkill("clanhuanyin") || !player.canSave(player)) && player.hp <= 1) return 0; - if (player.canSave(player) && player.hp == 1 && player.countCards("h") <= 1) return 2.6; - if (player.hp < Math.max(2, 3 - player.getFriends().length) || !game.countPlayer(current => get.attitude(player, current) < 0 && current.countCards("h", card => ["sha", "shan"].includes(get.name(card))))) return 0; - } - return 2.5; - }, - expose: 0.2, - result: { player: 1 }, - }, - subSkill: { - backup: {}, - backupx: { - audio: "clanlieshi", - selectCard: -1, - selectTarget: -1, - filterCard: () => false, - filterTarget: () => false, - multitarget: true, - content() { - "step 0"; - var choice = lib.skill.clanlieshi_backup.choice; - event.choice = choice; - if (choice == "damage") { - player.damage("fire"); - if (!player.isDisabledJudge()) player.disableJudge(); - } else { - var cards = player.getCards("h", choice); - if (cards.length) player.discard(cards); - } - "step 1"; - if (!player.isIn() || !game.hasPlayer(current => current != player)) event.finish(); - else - player.chooseTarget("烈誓:令一名其他角色选择另一项", lib.filter.notMe, true).set("ai", target => { - var player = _status.event.player, - chosen = _status.event.getParent().choice, - att = get.attitude(player, target); - if (chosen == "damage") { - if (att > 0) return 0; - return -att / 2 + target.countCards("h", card => ["sha", "shan"].includes(get.name(card))); - } - return get.damageEffect(target, player, player, "fire"); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "fire"); - var list = [], - choice = event.choice; - var choiceList = lib.skill.clanlieshi.choices.slice(); - choiceList = choiceList.map((link, ind, arr) => { - link = link[1]; - var ok = true; - if (arr[ind][0] == choice) { - link += "(" + get.translation(player) + "已选)"; - ok = false; - } - if (ind == 0) { - if (target.isDisabledJudge()) ok = false; - } else if (ind > 0) { - var name = ind == 1 ? "shan" : "sha"; - if (!target.countCards("h", name)) ok = false; - } - if (!ok) link = '' + link + ""; - else list.push("选项" + get.cnNumber(ind + 1, true)); - return link; - }); - if (!list.length) { - game.log(target, "没有能执行的选项"); - event.finish(); - return; - } - target - .chooseControl(list) - .set("choiceList", choiceList) - .set("ai", () => { - var controls = _status.event.controls.slice(), - player = _status.event.player, - user = _status.event.getParent().player; - if (controls.length == 1) return controls[0]; - if (controls.includes("选项一") && get.damageEffect(player, user, player, "fire") >= 0) return "选项一"; - if (controls.includes("选项一") && player.hp <= 2 && player.countCards("h", card => ["sha", "shan"].includes(get.name(card))) <= 3) controls.remove("选项一"); - if (controls.length == 1) return controls[0]; - if (player.getCards("h", "sha").reduce((p, c) => p + get.value(c, player), 0) > player.getCards("h", "sha").reduce((p, c) => p + get.value(c, player), 0)) { - if (controls.includes("选项三")) return "选项三"; - } else if (controls.includes("选项二")) return "选项二"; - return controls.randomGet(); - }); - } else event.finish(); - "step 3"; - if (result.control == "选项一") { - if (!target.isDisabledJudge()) target.disableJudge(); - target.damage("fire"); - } else { - var cards = target.getCards("h", result.control == "选项二" ? "shan" : "sha"); - if (cards.length) target.discard(cards); - } - }, - }, - }, - }, - clandianzhan: { - audio: 2, - intro: { - content: "已使用过的花色:$", - onunmark: true, - }, - trigger: { player: "useCardAfter" }, - forced: true, - filter(event, player) { - if (!lib.suit.includes(get.suit(event.card))) return false; - const suit = get.suit(event.card); - if (player.getRoundHistory("useCard", evt => get.suit(evt.card) == suit).indexOf(event) != 0) return false; - return (event.targets && event.targets.length == 1 && !event.targets[0].isLinked()) || player.hasCard(card => get.suit(card) == get.suit(event.card) && player.canRecast(card), "h"); - }, - content() { - "step 0"; - if (trigger.targets && trigger.targets.length == 1 && !trigger.targets[0].isLinked()) { - trigger.targets[0].link(true); - event.link = true; - } - var cards = player.getCards("h", card => get.suit(card) == get.suit(trigger.card) && player.canRecast(card)); - if (cards.length > 0) { - player.recast(cards); - event.recast = true; - } - "step 1"; - if (event.link && event.recast) player.draw(); - }, - group: "clandianzhan_count", - subSkill: { - count: { - charlotte: true, - trigger: { player: "useCardAfter" }, - filter(event, player) { - let suit = get.suit(event.card); - return lib.suits.includes(suit) && !player.getStorage("clandianzhan").includes(suit); - }, - forced: true, - silent: true, - content() { - let suits = player - .getRoundHistory("useCard", evt => { - return lib.suits.includes(get.suit(evt.card)); - }) - .reduce((list, evt) => { - return list.add(get.suit(evt.card)); - }, []) - .sort((a, b) => lib.suits.indexOf(a) - lib.suits.indexOf(b)); - if (!player.storage.clandianzhan) { - player.when({ global: "roundStart" }).then(() => { - delete player.storage.clandianzhan; - player.unmarkSkill("clandianzhan"); - }); - } - player.storage.clandianzhan = suits; - player.markSkill("clandianzhan"); - }, - }, - }, - init(player) { - let suits = player - .getRoundHistory("useCard", evt => { - return lib.suits.includes(get.suit(evt.card)); - }) - .reduce((list, evt) => { - return list.add(get.suit(evt.card)); - }, []) - .sort((a, b) => lib.suits.indexOf(a) - lib.suits.indexOf(b)); - if (suits.length) { - if (!player.storage.clandianzhan) { - player.when({ global: "roundStart" }).then(() => { - delete player.storage.clandianzhan; - player.unmarkSkill("clandianzhan"); - }); - } - player.storage.clandianzhan = suits; - player.markSkill("clandianzhan"); - } - }, - }, - clanhuanyin: { - audio: 2, - trigger: { player: "dying" }, - forced: true, - check: () => true, - filter(event) { - return event.player.countCards("h") < 4; - }, - content() { - player.drawTo(4); - }, - }, - clandaojie: { - audio: 2, - audioname: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou"], - trigger: { player: "useCardAfter" }, - filter(event, player) { - return ( - get.type(event.card, null, false) == "trick" && - !get.tag(event.card, "damage") && - event.cards.filterInD().length > 0 && - player - .getHistory("useCard", evt => { - return get.type(evt.card, null, false) == "trick" && !get.tag(evt.card, "damage"); - }) - .indexOf(event) == 0 - ); - }, - forced: true, - clanSkill: true, - content() { - "step 0"; - var skills = player.getSkills(null, false, false).filter(skill => { - var info = get.info(skill); - if (!info || info.charlotte || !get.is.locked(skill) || get.skillInfoTranslation(skill, player).length == 0) return false; - return true; - }); - player - .chooseControl(skills, "cancel2") - .set( - "choiceList", - skills.map(i => { - return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; - }) - ) - .set("displayIndex", false) - .set("prompt", "蹈节:失去一个锁定技,或点“取消”失去1点体力") - .set("ai", () => { - var player = _status.event.player, - choices = _status.event.controls.slice(); - var negs = choices.filter(i => { - var info = get.info(i); - if (!info || !info.ai) return false; - return info.ai.neg || info.ai.halfneg; - }); - if (negs.length) return negs.randomGet(); - if (get.effect(player, { name: "losehp" }, player, player) >= 0) return "cancel2"; - if (player.hp > 3) return "cancel2"; - return Math.random() < 0.75 ? "clandaojie" : choices.randomGet(); - }); - "step 1"; - if (result.control != "cancel2") { - player.removeSkills(result.control); - } else { - player.loseHp(); - } - "step 2"; - var targets = game.filterPlayer(current => current == player || current.hasClan("颍川荀氏")); - if (targets.length == 1) event._result = { bool: true, targets: targets }; - else - player - .chooseTarget("蹈节:将" + get.translation(trigger.cards.filterInD()) + "交给一名颍川荀氏角色", true, (card, player, target) => { - return target == player || target.hasClan("颍川荀氏"); - }) - .set("ai", target => get.attitude(_status.event.player, target)); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.gain(trigger.cards.filterInD(), player, "gain2"); - } - }, - }, - //族吴班 - clanzhanding: { - audio: 2, - enable: "chooseToUse", - viewAsFilter(player) { - return player.countCards("hes") > 0; - }, - viewAs: { name: "sha" }, - filterCard: true, - position: "hes", - selectCard: [1, Infinity], - check(card) { - return 6 - ui.selected.cards.length - get.value(card); - }, - onuse(links, player) { - lib.skill.chenliuwushi.change(player, -1); - player.addTempSkill("clanzhanding_effect"); - }, - ai: { - order: 1, - respondSha: true, - skillTagFilter(player) { - return player.countCards("hes") > 0; - }, - }, - subSkill: { - effect: { - trigger: { player: "useCardAfter" }, - forced: true, - popup: false, - filter(event, player) { - return event.skill == "clanzhanding"; - }, - content() { - if ( - player.hasHistory("sourceDamage", function (evt) { - return evt.card == trigger.card; - }) - ) { - var num1 = player.countCards("h"), - num2 = player.getHandcardLimit(); - if (num1 < num2) player.draw(Math.min(5, num2 - num1)); - } else if (trigger.addCount !== false) { - trigger.addCount = false; - player.getStat().card.sha--; - } - }, - }, - }, - }, - //族吴苋 - clanyirong: { - audio: 2, - enable: "phaseUse", - usable: 2, - filter(event, player) { - var num1 = player.countCards("h"), - num2 = player.getHandcardLimit(); - return num1 != num2; - }, - selectCard() { - var player = _status.event.player; - var num1 = player.countCards("h"), - num2 = player.getHandcardLimit(); - if (num1 > num2) return num1 - num2; - return [0, 1]; - }, - filterCard(card, player) { - var num1 = player.countCards("h"), - num2 = player.getHandcardLimit(); - return num1 > num2; - }, - check(card) { - var player = _status.event.player; - if ( - player.countCards("h", function (card) { - return lib.skill.clanyirong.checkx(card) > 0; - }) + - 1 < - player.countCards("h") - player.getHandcardLimit() - ) - return 0; - return lib.skill.clanyirong.checkx(card); - }, - checkx(card) { - var num = 1; - if (_status.event.player.getUseValue(card, null, true) <= 0) num = 1.5; - return (15 - get.value(card)) * num; - }, - prompt() { - var player = _status.event.player; - var num1 = player.countCards("h"), - num2 = player.getHandcardLimit(); - var str = ''; - if (num1 > num2) { - str += "弃置" + get.cnNumber(num1 - num2) + "张牌,然后手牌上限+1。"; - } else { - str += "摸" + get.cnNumber(Math.min(8, num2 - num1)) + "张牌,然后手牌上限-1。"; - } - str += "
    ※当前手牌上限:" + num2; - var num3 = (_status.event.getParent().phaseIndex || 0) + 1; - if (num3 > 0) { - str += ";阶段数:" + num3; - } - str += "
    "; - return str; - }, - content() { - "step 0"; - if (cards.length) { - lib.skill.chenliuwushi.change(player, 1); - event.finish(); - } else { - var num1 = player.countCards("h"), - num2 = player.getHandcardLimit(); - if (num1 < num2) player.draw(Math.min(8, num2 - num1)); - } - "step 1"; - lib.skill.chenliuwushi.change(player, -1); - }, - ai: { - order(item, player) { - var num = player.getHandcardLimit(), - numx = (_status.event.getParent().phaseIndex || 0) + 1; - if (num == 5 && numx == 4 && player.getStat("skill").clanyirong) return 0; - if (player.countCards("h") == num + 1 && num != 2 && (num <= 4 || (num > 4 && numx > 4))) return 10; - return 0.5; - }, - result: { player: 1 }, - threaten: 5, - }, - }, - clanguixiang: { - audio: 2, - trigger: { - player: "phaseChange", - }, - forced: true, - filter(event, player) { - if (event.phaseList[event.num].startsWith("phaseUse")) return false; - var num1 = player.getHandcardLimit() - 1, - num2 = event.num; - return num1 == num2; - }, - content() { - trigger.phaseList[trigger.num] = "phaseUse|clanguixiang"; - game.delayx(); - }, - }, - clanmuyin: { - audio: 2, - clanSkill: true, - audioname: ["clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"], - trigger: { player: "phaseBegin" }, - isMax(player) { - var num = player.getHandcardLimit(); - return !game.hasPlayer(function (current) { - return current != player && current.getHandcardLimit() > num; - }); - }, - filter(event, player) { - return game.hasPlayer(function (current) { - return (current == player || current.hasClan("陈留吴氏")) && !lib.skill.clanmuyin.isMax(current); - }); - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt("clanmuyin"), "令一名陈留吴氏角色的手牌上限+1", function (card, player, current) { - return (current == player || current.hasClan("陈留吴氏")) && !lib.skill.clanmuyin.isMax(current); - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("clanmuyin", target); - lib.skill.chenliuwushi.change(target, 1); - game.delayx(); - } - }, - }, - chenliuwushi: { - charlotte: true, - change(player, num) { - player.addSkill("chenliuwushi"); - var info = player.storage; - if (typeof info.chenliuwushi != "number") info.chenliuwushi = 0; - info.chenliuwushi += num; - if (info.chenliuwushi == 0) player.unmarkSkill("chenliuwushi"); - else player.markSkill("chenliuwushi"); - if (num >= 0) game.log(player, "的手牌上限", "#y+" + num); - else game.log(player, "的手牌上限", "#g" + num); - }, - mod: { - maxHandcard(player, num) { - var add = player.storage.chenliuwushi; - if (typeof add == "number") return num + add; - }, - }, - markimage: "image/card/handcard.png", - intro: { - content(num, player) { - var str = "
  • 手牌上限"; - if (num >= 0) str += "+"; - str += num; - str += "
  • 当前手牌上限:"; - str += player.getHandcardLimit(); - return str; - }, - }, - }, - }, - characterReplace: { - wuban: ["clan_wuban", "dc_wuban", "wuban", "xin_wuban"], - }, - characterIntro: { - xunshu: "荀淑(83年~149年),字季和,为郎陵侯相,颍川颍阴人(今河南省许昌市)人。汉和帝至汉桓帝时人物,以品行高洁著称。有子八人,号八龙。年轻时有高尚的德行,学问渊博,不喜欢雕章琢句,徒在文字上用功,不注重实际的学识。因此,常常被俗儒看不起。但州里却称他有知人之明。安帝时,征召任为郎中,后来再升当涂长。离职还乡里。他的孙子荀彧是曹操部下著名的谋士。", - xuncai: "荀采(生卒年不详),字女荀,颍川人,东汉名士荀爽之女。荀采聪慧敏捷而有才艺。十七岁时,荀采嫁给阴瑜。两年后阴瑜去世。荀采不愿意改嫁,但荀爽答应把荀采嫁给同郡人郭奕。荀采趁着旁人没有防备,用粉在门上写下:“尸还阴”,而后自缢而死。", - xuncan: "荀粲(210年—238年),字奉倩,颍川郡颍阴县(今河南省许昌市)人。三国时期曹魏大臣、玄学家,太尉荀彧幼子。个性简贵,不轻易交接常人,所交之辈皆一时俊杰。聪颖过人,善谈玄理,名噪一时。娶大将军曹洪之女为妻,生活美满。景初二年,面对妻子去世,悲痛过度而死,时年二十九,成语“荀令伤神”与之有关。", - hanshao: "韩韶(生卒年不详),字仲黄,颍川舞阳(今河南省漯河市)人,东汉桓帝时出仕。任郡吏,有政绩,继而被征入司徒府。他公正廉明,尽心民事,视民苦如在己身,政绩卓著。汉永寿二年(公元156年),泰山贼公孙举率流寇数千骚扰嬴县,守令因不能拒敌安民,多受制裁,朝廷命尚书府从三府(司徒、司马、司空)属员中,选择能治理民事,又能拒寇入侵的官员,前往镇守。韩韶被封为“嬴长”到嬴县上任,他是莱芜历史上唯一的一位“嬴长”。", - hanrong: "韩融(127年~196年),字元长,颍川舞阳(今属河南省漯河市)人。赢长韩韶子,献帝时大臣。中平五年(188年),融与荀爽、陈纪等十四人并博士征,不至。董卓废立,融等复俱公车征。初平元年(190年)六月,融为大鸿胪,奉命与执金吾胡母班等出使关东。献帝东迁,为李傕、郭汜等所败,融为太仆,奉命至弘农与傕、汜连和,使其放遣公卿百官及宫女妇人。", - wukuang: "吴匡(生卒年不详),兖州陈留(今河南开封市)人。东汉末年大臣,大将军何进部将。光熹元年(公元189年),汉灵帝死后,十常侍干预朝政,大将军何进谋诛宦官,但失败被杀,吴匡联合曹操、袁绍等杀尽宦官,攻杀车骑将军何苗。兴平二年(公元195年)十月,李傕、郭汜后悔放汉献帝东归洛阳,于是联合起来追击,曹操遂起兵平乱,但在回朝后,曹操挟天子以令诸侯,实行专权,但遭到吴匡反对。", - wanghun: "王浑(223年~297年),字玄冲,太原郡晋阳县(今山西省太原市)人。魏晋时期名臣,曹魏司空王昶的儿子。王浑早年为大将军曹爽的掾吏,高平陵政变后,循例免官,出任怀县县令、散骑侍郎等职,袭封京陵县侯。西晋王朝建立后,加号扬烈将军,历任征虏将军、东中郎将、豫州刺史等职,积极筹划伐吴方略。咸宁五年(279年),配合镇南将军杜预灭亡吴国,迁征东大将军、左仆射、司徒公,晋爵京陵县公。晋惠帝司马衷即位,加任侍中衔。楚王司马玮发动政变,有意寻求支持,遭到严词拒绝。楚王司马玮死后,复任司徒、录尚书事。元康七年(297年),王浑去世,享年七十五岁,谥号为元。《唐会要》尊为“魏晋八君子”之一。", - zhongyu: "钟毓(?-263年),字稚叔,颍川长社(今河南长葛市)人。三国时期魏国大臣,太傅钟繇之子、司徒钟会之兄。出身颍川钟氏,机灵敏捷,有其父之遗风。十四岁时,起家散骑侍郎。太和初年,迁黄门侍郎,袭封定陵县侯。正始年间,拜散骑常侍,迁魏郡太守,入为侍中、御史中丞、廷尉 [5] 。随平诸葛诞的淮南叛乱,拜青州刺史、后将军,都督徐州、荆州诸军事。景元四年(263年),去世,追赠车骑将军,谥号为惠,著有文集五卷(见《隋书·经籍志》及《两唐书·经籍志》),传于世。", - wanglun: "王沦(233年-257年)字太冲,出身太原晋阳王姓世族(今山西省太原市),王昶三子,王浑、王深之弟,王湛之兄。醇粹简远,崇尚老庄之学,心思平淡。二十多时被举荐为孝廉,没有前往,后任大将军参军。257年,诸葛诞不满司马氏篡权而在寿春起义,王沦跟随司马昭征讨,遭遇疾疫去世,时年二十五,时人惜之,司马昭为他流泪。其兄著诔文《表德论》,表述其德行,说“因为畏惧帝王的典章制度,不能写墓志铭,于是撰写过往的事迹,刻在墓的背面。”", - wuqiao: "吴乔,西晋人物,蜀车骑将军吴懿之孙。李雄建立成汉政权,他沦落益州,长达三十年,始终不向李雄屈服。", - clan_wangguang: "王广,三国时期曹魏太原祁县人,哲学家。东汉司徒王允从孙,魏太尉王凌之子。有志尚学,官至尚书。魏时随父亲在朝作官,屯骑校尉,机智有谋。当得知司马懿篡夺曹魏政权时,王凌与外甥令狐愚合谋立楚王为魏主,王广劝其父不可,王凌没有接受儿子的谏言,结果计谋泄而被害。", - wangmingshan: "王明山,王凌的小儿子,太原祁(今山西省祁县)人,三国魏书法家,最知名善画,多技艺,人得其书,皆以为法。太尉王凌参与谋划废立,事情泄露,被太傅司马懿领兵平定。", - }, - dynamicTranslate: { - clanlianzhu(player) { - if (player.storage.clanlianzhu) return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; - return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; - }, - clanguangu(player) { - if (player.storage.clanguangu) return '转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。'; - return '转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。'; - }, - clanjiexuan(player) { - if (player.storage.clanjiexuan) return '限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。'; - return '限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。'; - }, - }, - translate: { - clan_wuxian_prefix: "族", - clan_wuban_prefix: "族", - clan_xunshu_prefix: "族", - clan_xunchen_prefix: "族", - clan_xuncai_prefix: "族", - clan_xuncan_prefix: "族", - clan_hanshao_prefix: "族", - clan_hanrong_prefix: "族", - clan_wukuang_prefix: "族", - clan_wangling_prefix: "族", - clan_zhongyan_prefix: "族", - clan_wangyun_prefix: "族", - clan_wanghun_prefix: "族", - clan_zhonghui_prefix: "族", - clan_zhongyu_prefix: "族", - clan_wanglun_prefix: "族", - clan_xunyou_prefix: "族", - clan_wuqiao_prefix: "族", - - clan_wuxian: "族吴苋", - clanyirong: "移荣", - clanyirong_info: "出牌阶段限两次。若你的手牌数:小于X,则你可以将手牌摸至X张(至多摸八张),然后X-1;大于X,则你可以将手牌弃置至X张,然后X+1。(X为你的手牌上限)", - clanguixiang: "贵相", - clanguixiang_info: "锁定技。你的非出牌阶段开始前,若此阶段即将成为你本回合内的第X个阶段(X为你的手牌上限),则你终止此阶段,改为进行一个出牌阶段。", - clanmuyin: "穆荫", - clanmuyin_info: "宗族技。回合开始时,你可以选择一名手牌上限不为全场最多的陈留吴氏角色。该角色的手牌上限+1。", - chenliuwushi: "陈留·吴氏", - clan_wuban: "族吴班", - clanzhanding: "斩钉", - clanzhanding_info: "你可以将任意张牌当做【杀】使用并你令你的手牌上限-1。你以此法使用的【杀】结算结束后,若你因此【杀】造成过伤害,则你将手牌摸至手牌上限(至多摸五张),否则你令此【杀】不计入次数限制。", - clan_xunshu: "族荀淑", - clanshenjun: "神君", - clanshenjun_info: "当一名角色使用【杀】或普通锦囊牌时,若你手牌中有该牌名的牌,你展示之,且这些牌称为“神君”。然后本阶段结束时,你可以将等同于你“神君”数张牌当做一张“神君”牌使用。", - clanbalong: "八龙", - clanbalong_info: "锁定技。当你于一回合内首次{回复体力后或受到伤害后或失去体力后},若你手牌中唯一最多的类别为锦囊牌,你展示所有手牌并摸至角色数张。", - clandaojie: "蹈节", - clandaojie_info: "宗族技,锁定技。当你每回合第一次使用非伤害类普通锦囊牌后,你须失去一个锁定技或失去1点体力,令一名颍川荀氏角色获得此牌对应的所有实体牌。", - clan_xuncai: "族荀采", - clanlieshi: "烈誓", - clanlieshi_info: "出牌阶段,你可以选择一项:1.废除判定区并受到你造成的1点火焰伤害;2.弃置所有【闪】;3.弃置所有【杀】。然后令一名其他角色从你未选择的选项中选择一项。", - clandianzhan: "点盏", - clandianzhan_info: "锁定技。当你每轮第一次使用一种花色的牌后:若此牌的目标数为1且目标未横置,你横置此牌目标;若你有此花色的手牌,你重铸这些牌。均执行后你摸一张牌。", - clanhuanyin: "还阴", - clanhuanyin_info: "锁定技。当你进入濒死状态时,将手牌补至四张。", - clan_xunchen: "族荀谌", - clansankuang: "三恇", - clansankuang_info: "锁定技。当你每轮第一次使用一种类别的牌后,你令一名其他角色交给你至少X张牌,然后于装备区或处理区内获得你使用的牌对应的所有实体牌(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)。", - clanbeishi: "卑势", - clanbeishi_info: "锁定技。当一名角色失去最后的手牌后,若其是你首次发动〖三恇〗的目标角色,你回复1点体力。", - clan_xuncan: "族荀粲", - clanyunshen: "熨身", - clanyunshen_info: "出牌阶段限一次。你可以令一名其他角色回复1点体力,然后选择一项:1.你视为对其使用一张冰【杀】;2.其视为对你使用一张冰【杀】。", - clanshangshen: "伤神", - clanshangshen_info: "当一名角色受到属性伤害后,若本回合此前没有角色或已死亡的角色受到过属性伤害,你可以执行目标角色为你的【闪电】效果,然后其将手牌摸至四张。", - clanfenchai: "分钗", - clanfenchai_info: "锁定技。若你首次发动技能指定的异性目标角色中:存在存活角色,你的判定牌视为♥;不存在存活角色,你的判定牌视为♠。", - clan_hanshao: "族韩韶", - clanfangzhen: "放赈", - clanfangzhen_info: "出牌阶段开始时,你可以横置一名角色并选择一项:1.摸两张牌,然后交给其两张牌;2.令其回复1点体力。然后第X轮游戏开始时,你失去〖放赈〗(X为其座位号)。", - clanliuju: "留驹", - clanliuju_info: "出牌阶段结束时,你可以与一名角色A拼点,输的角色可以使用任意张拼点牌中的非基本牌。然后若你至A的距离或A至你的距离发生了变化,你重置〖恤民〗。", - clanxumin: "恤民", - clanxumin_info: "宗族技,限定技。你可以将一张牌当做【五谷丰登】对任意名其他角色使用。", - clan_hanrong: "族韩融", - clanlianhe: "连和", - clanlianhe_info: "出牌阶段开始时,你可以横置两名角色。这些角色于自己的下个出牌阶段结束时,若其此阶段未摸牌,其令你摸X+1张牌或交给你X-1张牌(X为其此阶段获得的牌数且至多为3)。", - clanhuanjia: "缓颊", - clanhuanjia_info: "出牌阶段结束时,你可以与一名角色拼点。赢的角色可以使用一张拼点牌。然后若此牌:未造成过伤害,你获得另一张拼点牌;造成过伤害,你失去一个技能。", - clan_wukuang: "族吴匡", - clanlianzhu: "联诛", - clanlianzhu_info: "转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色相同,则你的手牌上限+1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色不同,则你的手牌上限-1。", - clan_wangling: "族王淩", - clanbolong: "驳龙", - clanbolong_info: "出牌阶段限一次。你可以令一名其他角色选择一项:1.你交给其一张牌,然后视为对其使用一张雷【杀】;2.交给你等同于你手牌数的牌,然后视为对你使用一张【酒】。", - clanzhongliu: "中流", - clanzhongliu_info: "宗族技,锁定技。当你使用牌时,若此牌对应的实体牌均不为太原王氏角色的手牌,你重置武将牌上的技能。", - clan_zhongyan: "族钟琰", - clanguangu: "观骨", - clanguangu_info: "转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。", - clanxiaoyong: "啸咏", - clanxiaoyong_info: "锁定技。当你于回合内首次使用字数为X的牌时,你重置〖观骨〗(X为你上次发动〖观骨〗观看的牌数)。", - clanbaozu: "保族", - clanbaozu_info: "宗族技,限定技。当一名颍川钟氏角色进入濒死状态时,你可以令其横置并回复1点体力。", - clan_wangyun: "族王允", - clanjiexuan: "解悬", - clanjiexuan_info: "限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。", - clanmingjie: "铭戒", - clanmingjie_info: "限定技。出牌阶段,你可以选择一名角色,然后你获得此下效果:①你使用牌时你可以指定其为额外目标直到其下个回合结束。②其下个回合结束时(若该角色为你则改为你的下下个回合结束时),你可以使用本回合使用过的黑桃牌和被抵消过的牌。", - clan_wanghun: "族王浑", - clanfuxun: "抚循", - clanfuxun_info: "出牌阶段限一次。你可以获得或交给一名其他角色一张手牌,然后若其手牌数与你相等且于此阶段仅以此法获得或失去过牌,你可以将一张牌当任意基本牌使用。", - clanchenya: "沉雅", - clanchenya_info: "当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其手牌数)。", - clan_zhonghui: "族钟会", - clanyuzhi: "迂志", - clanyuzhi_info: "锁定技。新的一轮开始时,你依次执行以下项:①你弃置上一轮因〖迂志〗展示的手牌,然后若你上一轮使用的牌数或你上上轮因〖迂志〗摸的牌数小于你上轮因〖迂志〗摸的牌数,你受到1点雷属性伤害或失去〖保族〗。②你展示一张手牌,然后摸X张牌(X为此牌牌名字数)。", - clanxieshu: "挟术", - clanxieshu_info: "当你因牌造成或受到伤害后,你可以横置武将牌并弃置Y张牌,然后摸你已损失体力值张牌(Y为此牌牌名字数)。若本回合有角色进入过濒死状态,则〖挟术〗于本回合失效。", - clan_zhongyu: "族钟毓", - clanjiejian: "捷谏", - clanjiejian_info: "当你于一回合使用第X张牌指定第一个目标后,若此牌不为装备牌,则你可以令一名目标角色摸X张牌。(X为此牌牌名字数)", - clanhuanghan: "惶汗", - clanhuanghan_info: "当你受到牌造成的伤害后,你可以摸X张牌并弃置Y张牌(X为此牌牌名字数,Y为你已损失的体力值),然后若此次技能发动不为你本回合首次发动此技能,你重置技能〖保族〗。", - clan_wanglun: "族王沦", - clanqiuxin: "求心", - clanqiuxin_info: "出牌阶段限一次,你可以令一名其他角色选择一项:①你对其使用【杀】;②你对其使用任意普通锦囊牌。当你执行其选择的选项后,你视为执行另一项。", - clanjianyuan: "简远", - clanjianyuan_info: "当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其本阶段的使用牌数)。", - clan_xunyou: "族荀攸", - clanbaichu: "百出", - clanbaichu_info: "锁定技,当你使用一张牌结算完毕后,若你:未记录过此牌的花色和类型组合,则你记录此组合并记录一个普通锦囊牌名,否则你于本轮获得技能〖奇策〗;已记录此牌牌名,你回复1点体力或摸一张牌。", - clan_wuqiao: "族吴乔", - clanqiajue: "跒倔", - clanqiajue_info: "摸牌阶段开始时,你可以弃置一张黑色牌。若如此做,此阶段结束时,你展示手牌,若这些牌的点数和大于30,你的手牌上限-2,否则你执行一个额外的摸牌阶段。", - clan_wangguang: "族王广", - clan_wangguang_prefix: "族", - clanlilun: "离论", - clanlilun_info: "出牌阶段限一次,你可以重铸两张手牌(不能是你本回合以此法重铸过的牌名的牌),然后使用其中的一张牌。", - clanjianji: "见机", - clanjianji_info: "限定技,一名角色的结束阶段,若其上下家均未于本回合:使用过牌,则你可以与其各摸一张牌;成为过牌的目标,则你可以视为使用一张【杀】。", - clan_wangmingshan: "族王明山", - clan_wangmingshan_prefix: "族", - clantanque: "弹雀", - clantanque_info: "每回合限一次。当你使用牌结算结束后,你可以对一名体力值为X且不为0的角色造成1点伤害(X为此牌点数与你上一张使用的牌的点数之差)。", - clanshengmo: "剩墨", - clanshengmo_info: "当你需要使用一张未以此法使用过的基本牌时,你可以获得一张于本回合进入弃牌堆且点数不为这些牌中最大且不为这些牌中最小的牌,视为你使用需要使用的牌。", - clan_zhongyao: "族钟繇", - clan_zhongyao_prefix: "族", - clanchengqi: "承启", - clanchengqi_info: "你可以将至少两张手牌当作本回合未以此法转换过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。", - clanjieli: "诫厉", - clanjieli_info: "结束阶段,你可以选择一名角色,你观看其手牌中牌名字数最多的牌和牌堆顶的X张牌,然后你可以交换其中的任意张牌(X为你本回合使用过的牌中的牌名字数最大值)。", - - clan_wu: "陈留·吴氏", - clan_xun: "颍川·荀氏", - clan_han: "颍川·韩氏", - clan_wang: "太原·王氏", - clan_zhong: "颍川·钟氏", - }, - }; -}); diff --git a/character/clan/card.js b/character/clan/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/clan/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/clan/character.js b/character/clan/character.js new file mode 100644 index 000000000..4434a8e93 --- /dev/null +++ b/character/clan/character.js @@ -0,0 +1,25 @@ +const characters = { + clan_wuxian: ["female", "shu", 3, ["clanyirong", "clanguixiang", "clanmuyin"], ["clan:陈留吴氏"]], + clan_wuban: ["male", "shu", 4, ["clanzhanding", "clanmuyin"], ["clan:陈留吴氏"]], + clan_xunshu: ["male", "qun", 3, ["clanshenjun", "clanbalong", "clandaojie"], ["clan:颍川荀氏"]], + clan_xunchen: ["male", "qun", 3, ["clansankuang", "clanbeishi", "clandaojie"], ["clan:颍川荀氏"]], + clan_xuncai: ["female", "qun", 3, ["clanlieshi", "clandianzhan", "clanhuanyin", "clandaojie"], ["clan:颍川荀氏"]], + clan_xuncan: ["male", "wei", 3, ["clanyunshen", "clanshangshen", "clanfenchai", "clandaojie"], ["clan:颍川荀氏"]], + clan_hanshao: ["male", "qun", 3, ["clanfangzhen", "clanliuju", "clanxumin"], ["clan:颍川韩氏"]], + clan_hanrong: ["male", "qun", 3, ["clanlianhe", "clanhuanjia", "clanxumin"], ["clan:颍川韩氏"]], + clan_wukuang: ["male", "qun", 4, ["clanlianzhu", "clanmuyin"], ["clan:陈留吴氏"]], + clan_wangling: ["male", "wei", 4, ["clanbolong", "clanzhongliu"], ["clan:太原王氏"]], + clan_zhongyan: ["female", "jin", 3, ["clanguangu", "clanxiaoyong", "clanbaozu"], ["clan:颍川钟氏"]], + clan_wangyun: ["male", "qun", 3, ["clanjiexuan", "clanmingjie", "clanzhongliu"], ["clan:太原王氏"]], + clan_wanghun: ["male", "jin", 3, ["clanfuxun", "clanchenya", "clanzhongliu"], ["clan:太原王氏"]], + clan_zhonghui: ["male", "wei", "3/4", ["clanyuzhi", "clanxieshu", "clanbaozu"], ["clan:颍川钟氏", "die_audio:clan_zhonghui:clan_zhonghui2:clan_zhonghui3"]], + clan_zhongyu: ["male", "wei", 3, ["clanjiejian", "clanhuanghan", "clanbaozu"], ["clan:颍川钟氏"]], + clan_wanglun: ["male", "jin", 3, ["clanqiuxin", "clanjianyuan", "clanzhongliu"], ["clan:太原王氏"]], + clan_xunyou: ["male", "wei", 3, ["clanbaichu", "clandaojie"], ["clan:颍川荀氏"]], + clan_wuqiao: ["male", "jin", 4, ["clanqiajue", "clanmuyin"], ["clan:陈留吴氏"]], + clan_wangguang: ["male", "wei", 3, ["clanlilun", "clanjianji", "clanzhongliu"], ["clan:太原王氏"]], + clan_wangmingshan: ["male", "wei", 3, ["clantanque", "clanshengmo", "clanzhongliu"], ["clan:太原王氏"]], + clan_zhongyao: ["male", "wei", 3, ["clanchengqi", "clanjieli", "clanbaozu"], ["clan:颍川钟氏"]], +}; + +export default characters; diff --git a/character/clan/characterFilter.js b/character/clan/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/clan/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/clan/characterReplace.js b/character/clan/characterReplace.js new file mode 100644 index 000000000..9dc1723d5 --- /dev/null +++ b/character/clan/characterReplace.js @@ -0,0 +1,5 @@ +const characterReplaces = { + wuban: ["clan_wuban", "dc_wuban", "wuban", "xin_wuban"], +}; + +export default characterReplaces; diff --git a/character/clan/dynamicTranslate.js b/character/clan/dynamicTranslate.js new file mode 100644 index 000000000..bddac9a6a --- /dev/null +++ b/character/clan/dynamicTranslate.js @@ -0,0 +1,17 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + clanlianzhu(player) { + if (player.storage.clanlianzhu) return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; + return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; + }, + clanguangu(player) { + if (player.storage.clanguangu) return '转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。'; + return '转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。'; + }, + clanjiexuan(player) { + if (player.storage.clanjiexuan) return '限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。'; + return '限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。'; + }, +}; +export default dynamicTranslates; diff --git a/character/clan/index.js b/character/clan/index.js new file mode 100644 index 000000000..f952d9f90 --- /dev/null +++ b/character/clan/index.js @@ -0,0 +1,32 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "clan", + connect: true, + character: { ...characters }, + characterSort: { + clan: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/clan/intro.js b/character/clan/intro.js new file mode 100644 index 000000000..38ba015aa --- /dev/null +++ b/character/clan/intro.js @@ -0,0 +1,16 @@ +const characterIntro = { + xunshu: "荀淑(83年~149年),字季和,为郎陵侯相,颍川颍阴人(今河南省许昌市)人。汉和帝至汉桓帝时人物,以品行高洁著称。有子八人,号八龙。年轻时有高尚的德行,学问渊博,不喜欢雕章琢句,徒在文字上用功,不注重实际的学识。因此,常常被俗儒看不起。但州里却称他有知人之明。安帝时,征召任为郎中,后来再升当涂长。离职还乡里。他的孙子荀彧是曹操部下著名的谋士。", + xuncai: "荀采(生卒年不详),字女荀,颍川人,东汉名士荀爽之女。荀采聪慧敏捷而有才艺。十七岁时,荀采嫁给阴瑜。两年后阴瑜去世。荀采不愿意改嫁,但荀爽答应把荀采嫁给同郡人郭奕。荀采趁着旁人没有防备,用粉在门上写下:“尸还阴”,而后自缢而死。", + xuncan: "荀粲(210年—238年),字奉倩,颍川郡颍阴县(今河南省许昌市)人。三国时期曹魏大臣、玄学家,太尉荀彧幼子。个性简贵,不轻易交接常人,所交之辈皆一时俊杰。聪颖过人,善谈玄理,名噪一时。娶大将军曹洪之女为妻,生活美满。景初二年,面对妻子去世,悲痛过度而死,时年二十九,成语“荀令伤神”与之有关。", + hanshao: "韩韶(生卒年不详),字仲黄,颍川舞阳(今河南省漯河市)人,东汉桓帝时出仕。任郡吏,有政绩,继而被征入司徒府。他公正廉明,尽心民事,视民苦如在己身,政绩卓著。汉永寿二年(公元156年),泰山贼公孙举率流寇数千骚扰嬴县,守令因不能拒敌安民,多受制裁,朝廷命尚书府从三府(司徒、司马、司空)属员中,选择能治理民事,又能拒寇入侵的官员,前往镇守。韩韶被封为“嬴长”到嬴县上任,他是莱芜历史上唯一的一位“嬴长”。", + hanrong: "韩融(127年~196年),字元长,颍川舞阳(今属河南省漯河市)人。赢长韩韶子,献帝时大臣。中平五年(188年),融与荀爽、陈纪等十四人并博士征,不至。董卓废立,融等复俱公车征。初平元年(190年)六月,融为大鸿胪,奉命与执金吾胡母班等出使关东。献帝东迁,为李傕、郭汜等所败,融为太仆,奉命至弘农与傕、汜连和,使其放遣公卿百官及宫女妇人。", + wukuang: "吴匡(生卒年不详),兖州陈留(今河南开封市)人。东汉末年大臣,大将军何进部将。光熹元年(公元189年),汉灵帝死后,十常侍干预朝政,大将军何进谋诛宦官,但失败被杀,吴匡联合曹操、袁绍等杀尽宦官,攻杀车骑将军何苗。兴平二年(公元195年)十月,李傕、郭汜后悔放汉献帝东归洛阳,于是联合起来追击,曹操遂起兵平乱,但在回朝后,曹操挟天子以令诸侯,实行专权,但遭到吴匡反对。", + wanghun: "王浑(223年~297年),字玄冲,太原郡晋阳县(今山西省太原市)人。魏晋时期名臣,曹魏司空王昶的儿子。王浑早年为大将军曹爽的掾吏,高平陵政变后,循例免官,出任怀县县令、散骑侍郎等职,袭封京陵县侯。西晋王朝建立后,加号扬烈将军,历任征虏将军、东中郎将、豫州刺史等职,积极筹划伐吴方略。咸宁五年(279年),配合镇南将军杜预灭亡吴国,迁征东大将军、左仆射、司徒公,晋爵京陵县公。晋惠帝司马衷即位,加任侍中衔。楚王司马玮发动政变,有意寻求支持,遭到严词拒绝。楚王司马玮死后,复任司徒、录尚书事。元康七年(297年),王浑去世,享年七十五岁,谥号为元。《唐会要》尊为“魏晋八君子”之一。", + zhongyu: "钟毓(?-263年),字稚叔,颍川长社(今河南长葛市)人。三国时期魏国大臣,太傅钟繇之子、司徒钟会之兄。出身颍川钟氏,机灵敏捷,有其父之遗风。十四岁时,起家散骑侍郎。太和初年,迁黄门侍郎,袭封定陵县侯。正始年间,拜散骑常侍,迁魏郡太守,入为侍中、御史中丞、廷尉 [5] 。随平诸葛诞的淮南叛乱,拜青州刺史、后将军,都督徐州、荆州诸军事。景元四年(263年),去世,追赠车骑将军,谥号为惠,著有文集五卷(见《隋书·经籍志》及《两唐书·经籍志》),传于世。", + wanglun: "王沦(233年-257年)字太冲,出身太原晋阳王姓世族(今山西省太原市),王昶三子,王浑、王深之弟,王湛之兄。醇粹简远,崇尚老庄之学,心思平淡。二十多时被举荐为孝廉,没有前往,后任大将军参军。257年,诸葛诞不满司马氏篡权而在寿春起义,王沦跟随司马昭征讨,遭遇疾疫去世,时年二十五,时人惜之,司马昭为他流泪。其兄著诔文《表德论》,表述其德行,说“因为畏惧帝王的典章制度,不能写墓志铭,于是撰写过往的事迹,刻在墓的背面。”", + wuqiao: "吴乔,西晋人物,蜀车骑将军吴懿之孙。李雄建立成汉政权,他沦落益州,长达三十年,始终不向李雄屈服。", + clan_wangguang: "王广,三国时期曹魏太原祁县人,哲学家。东汉司徒王允从孙,魏太尉王凌之子。有志尚学,官至尚书。魏时随父亲在朝作官,屯骑校尉,机智有谋。当得知司马懿篡夺曹魏政权时,王凌与外甥令狐愚合谋立楚王为魏主,王广劝其父不可,王凌没有接受儿子的谏言,结果计谋泄而被害。", + wangmingshan: "王明山,王凌的小儿子,太原祁(今山西省祁县)人,三国魏书法家,最知名善画,多技艺,人得其书,皆以为法。太尉王凌参与谋划废立,事情泄露,被太傅司马懿领兵平定。", +}; + +export default characterIntro; diff --git a/character/clan/pinyin.js b/character/clan/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/clan/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/clan/skill.js b/character/clan/skill.js new file mode 100644 index 000000000..fd4329b75 --- /dev/null +++ b/character/clan/skill.js @@ -0,0 +1,3591 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //族钟繇 + clanchengqi: { + hiddenCard(player, name) { + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + if (player.getStorage("clanchengqi_effect").includes(name)) return false; + return player.countCards("hs") > 1 && lib.inpile.includes(name); + }, + audio: 2, + enable: "chooseToUse", + filter(event, player) { + if (player.countCards("hs") < 2) return false; + return get + .inpileVCardList(info => { + const name = info[2]; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + return !player.getStorage("clanchengqi_effect").includes(name); + }) + .some(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); + }, + chooseButton: { + dialog(event, player) { + const list = get + .inpileVCardList(info => { + const name = info[2]; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + return !player.getStorage("clanchengqi_effect").includes(name); + }) + .filter(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); + return ui.create.dialog("承启", [list, "vcard"]); + }, + check(button) { + if (get.event().getParent().type != "phase") return 1; + return get.event("player").getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }, + backup(links, player) { + return { + audio: "clanchengqi", + filterCard: true, + complexCard: true, + selectCard: [2, Infinity], + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + }, + filterOk() { + return ( + (ui.selected.cards || []).reduce((sum, card) => { + return sum + get.cardNameLength(card); + }, 0) >= get.cardNameLength(lib.skill.clanchengqi_backup.viewAs.name) + ); + }, + check(card) { + const player = get.event("player"); + const name = lib.skill.clanchengqi_backup.viewAs.name; + if (ui.selected.cards.length > 1 || card.name == name) return 0; + if ( + ui.selected.cards.length && + game.hasPlayer(target => { + return get.effect(target, { name: "draw" }, player, player) > 0; + }) + ) { + if (get.cardNameLength(name) <= get.cardNameLength(card) + get.cardNameLength(ui.selected.cards[0])) { + return 10 / (get.value(card) || 0.5); + } + } + return 1 / (get.value(card) || 0.5); + }, + position: "hs", + precontent() { + player.addTempSkill("clanchengqi_effect"); + player.markAuto("clanchengqi_effect", [event.result.card.name]); + }, + }; + }, + prompt(links, player) { + return "将至少两张手牌当作" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】使用"; + }, + }, + ai: { + order(item, player) { + if (player && get.event().type == "phase") { + let list = get + .inpileVCardList(info => { + const name = info[2]; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + return !player.getStorage("clanchengqi_effect").includes(name); + }) + .map(card => { + return { name: card[2], nature: card[3] }; + }) + .filter(card => player.getUseValue(card, true, true) > 0); + if (!list.length) return 0; + list.sort((a, b) => (player.getUseValue(b, true, true) || 0) - (player.getUseValue(a, true, true) || 0)); + return get.order(list[0], player) * 0.99; + } + return 0.001; + }, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond") return false; + const name = tag == "respondSha" ? "sha" : "shan"; + return get.info("clanchengqi").hiddenCard(player, name); + }, + result: { player: 1 }, + }, + subSkill: { + backup: { audio: "clanchengqi" }, + effect: { + charlotte: true, + onremove: true, + trigger: { player: "useCard" }, + filter(event, player) { + return ( + event.skill == "clanchengqi_backup" && + get.cardNameLength(event.card) == + (event.cards || []).reduce((sum, card) => { + return sum + get.cardNameLength(card); + }, 0) + ); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget("承启:是否令一名角色摸一张牌?") + .set("ai", target => { + const player = get.event("player"); + return get.effect(target, { name: "draw" }, player, player); + }) + .forResult(); + }, + popup: false, + content() { + player.line(event.targets); + event.targets[0].draw(); + }, + }, + }, + }, + clanjieli: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return game.hasPlayer(target => { + return target.countCards("h"); + }); + }, + async cost(event, trigger, player) { + const num = player.getHistory("useCard").length > 0 ? Math.max(...player.getHistory("useCard").map(history => get.cardNameLength(history.card))) : 0; + const str = num > 0 ? "并观看牌堆顶" + get.cnNumber(num) + "张牌,然后你可以交换其中任意张牌" : ""; + event.result = await player + .chooseTarget(get.prompt("clanjieli"), "观看一名角色的牌名字数最多的手牌" + str, (card, player, target) => { + return target.countCards("h"); + }) + .set("ai", target => { + const player = get.event("player"); + const num = Math.max(...target.getCards("h").map(card => get.cardNameLength(card))); + return num + 0.0001 * get.attitude(player, target); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + const num = player.getHistory("useCard").length > 0 ? Math.max(...player.getHistory("useCard").map(history => get.cardNameLength(history.card))) : 0; + const limit = Math.max(...target.getCards("h").map(card => get.cardNameLength(card))); + const cards = target.getCards("h", card => get.cardNameLength(card) == limit); + if (num > 0) { + const topCards = get.cards(num); + await game.cardsGotoOrdering(topCards); + const result = await player + .chooseToMove("诫厉:交换其中任意张牌") + .set("list", [ + [get.translation(target) + "牌名字数最多的手牌", cards, "dcsushou_tag"], + ["牌堆顶", topCards], + ]) + .set("filterMove", (from, to) => { + return typeof to != "number"; + }) + .set("filterOk", moved => { + return moved[1].some(card => get.owner(card)); + }) + .set("processAI", list => { + const num = Math.min(list[0][1].length, list[1][1].length); + const player = get.event("player"), + target = get.event().getParent().targets[0]; + const sgn = get.sgn(get.sgn(get.attitude(player, target)) - 0.5); + const cards1 = list[0][1].slice().sort((a, b) => get.value(a, "raw") * sgn - get.value(b, "raw") * sgn); + const cards2 = list[1][1].slice().sort((a, b) => get.value(b, "raw") * sgn - get.value(a, "raw") * sgn); + return [cards1.slice().addArray(cards2.slice(0, num)), cards2.slice().addArray(cards1.slice(0, num))]; + }) + .forResult(); + if (result.bool) { + const lose = result.moved[1].slice(); + const gain = result.moved[0].slice().filter(i => !get.owner(i)); + if (lose.some(i => get.owner(i))) + await target.lose( + lose.filter(i => get.owner(i)), + ui.special + ); + for (let i = lose.length - 1; i--; i >= 0) { + ui.cardPile.insertBefore(lose[i], ui.cardPile.firstChild); + } + game.updateRoundNumber(); + if (gain.length) await target.gain(gain, "draw"); + } else { + for (let i = topCards.length - 1; i--; i >= 0) { + ui.cardPile.insertBefore(topCards[i], ui.cardPile.firstChild); + } + game.updateRoundNumber(); + } + } else { + const content = ['###诫厉###
    ' + get.translation(target) + "牌名字数最多的手牌
    ", cards]; + await player.chooseControl("ok").set("dialog", content); + } + }, + }, + //族王明山 + clantanque: { + audio: 2, + trigger: { player: "useCardAfter" }, + usable: 1, + filter(event, player) { + const evt = lib.skill.dcjianying.getLastUsed(player, event); + if (!evt || !evt.card) return false; + const curCard = event.card, + prevCard = evt.card; + const curNum = get.number(curCard), + prevNum = get.number(prevCard); + if (typeof curNum != "number" || typeof prevNum != "number") return false; + const delNum = Math.abs(curNum - prevNum); + if (delNum === 0) return false; + return game.hasPlayer(current => { + return current.getHp() === delNum; + }); + }, + locked: false, + async cost(event, trigger, player) { + const evt = lib.skill.dcjianying.getLastUsed(player, trigger); + const curCard = trigger.card, + prevCard = evt.card; + const curNum = get.number(curCard), + prevNum = get.number(prevCard); + const delNum = Math.abs(curNum - prevNum); + event.result = await player + .chooseTarget(get.prompt("clantanque"), `对一名体力值为${delNum}的角色造成1点伤害`, (card, player, target) => { + return target.getHp() === get.event("delNum"); + }) + .set("delNum", delNum) + .set("ai", target => { + return get.damageEffect(target, get.player(), get.player()); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + await target.damage(); + await game.asyncDelayx(); + }, + mod: { + aiOrder(player, card, num) { + if (typeof card != "object") return; + const evt = lib.skill.dcjianying.getLastUsed(player); + if (!evt || !evt.card) return; + const curNum = get.number(card), + prevNum = get.number(evt.card); + if (typeof curNum != "number" || typeof prevNum != "number") return; + const pairs = game + .filterPlayer() + .map(current => { + return [current.getHp(), get.damageEffect(current, player, player)]; + }) + .filter(pair => pair[1] > 0); + if (!pairs.length) return; + const delNum = Math.abs(curNum - prevNum); + for (const [hp, eff] of pairs) { + if (hp != delNum) continue; + return num + 10 + pairs.filter(pair => pair[0] === hp).sort((a, b) => b[1] - a[1])[0][1] / 20; + } + }, + }, + }, + clanshengmo: { + audio: 2, + enable: "chooseToUse", + hiddenCard(player, name) { + if (get.type(name) != "basic") return false; + if (!player.getStorage("clanshengmo").includes(name) && (get.event("clanshengmo_cards") || []).length > 0) return true; + }, + filter(event, player) { + if (event.responded) return false; + const names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)), + cards = get.event("clanshengmo_cards") || []; + return ( + cards.length > 0 && + names.some(name => { + return event.filterCard({ name, isCard: true }, player, event); + }) + ); + }, + onChooseToUse(event) { + if (game.online) return; + if (!event.clanshengmo_cards) { + let cards = []; + game.checkGlobalHistory("cardMove", evt => { + if (evt.name != "cardsDiscard" && (evt.name != "lose" || evt.position != ui.discardPile)) return; + cards.addArray(evt.cards.filter(card => get.position(card, true) == "d")); + }); + const numbers = cards.map(card => get.number(card, false)).unique(); + const [min, max] = [Math.min(...numbers), Math.max(...numbers)]; + event.set( + "clanshengmo_cards", + cards.filter(card => { + const num = get.number(card, false); + return num > min && num < max; + }) + ); + } + }, + async content(event, trigger, player) { + const evt = event.getParent(2); + const names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)), + cards = evt.clanshengmo_cards; + const links = await player + .chooseButton(["剩墨:获得其中一张牌", cards], true) + .set("ai", button => { + return get.value(button.link); + }) + .forResultLinks(); + if (!links || !links.length) return; + const list = []; + for (const name of names) { + const card = { name, isCard: true }; + if (evt.filterCard(card, player, evt)) { + list.push(["基本", "", name]); + } + if (name == "sha") { + for (const nature of lib.inpile_nature) { + card.nature = nature; + if (evt.filterCard(card, player, evt)) { + list.push(["基本", "", name, nature]); + } + } + } + } + if (!list.length) return; + const links2 = await player + .chooseButton(["视为使用一张未以此法使用过的基本牌", [list, "vcard"]], true) + .set("ai", button => { + return get.player().getUseValue(button.link) + 1; + }) + .forResultLinks(); + const name = links2[0][2], + nature = links2[0][3]; + game.broadcastAll( + (name, nature, toGain) => { + lib.skill.clanshengmo_backup.viewAs = { + name, + nature, + isCard: true, + }; + lib.skill.clanshengmo_backup.prompt = `选择${get.translation(nature)}【${get.translation(name)}】的目标`; + lib.skill.clanshengmo_backup.cardToGain = toGain; + }, + name, + nature, + links[0] + ); + evt.set("_backupevent", "clanshengmo_backup"); + evt.backup("clanshengmo_backup"); + evt.set("openskilldialog", `选择${get.translation(nature)}【${get.translation(name)}】的目标`); + evt.set("norestore", true); + evt.set("custom", { + add: {}, + replace: { window() {} }, + }); + evt.goto(0); + }, + marktext: "墨", + intro: { + content: "已以此法使用过$", + }, + subSkill: { + backup: { + precontent() { + delete event.result.skill; + event.result.card.storage.clanshengmo = true; + player.markAuto("clanshengmo", event.result.card.name); + player.gain(lib.skill.clanshengmo_backup.cardToGain, "gain2"); + }, + filterCard: () => false, + selectCard: -1, + }, + }, + ai: { + order: 3, + result: { + player(player) { + if (get.event().dying) return get.attitude(player, get.event().dying); + if (get.event().type != "phase") return 1; + const names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)); + if (Array.isArray(names)) { + return names.some(name => { + return player.getUseValue({ name }) > 0; + }); + } + return 0; + }, + }, + }, + }, + //族贝斯塔[doge] + clanlilun: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.hasCard(card => get.info("clanlilun").filterCard(card, player), "h"); + }, + filterCard(card, player) { + if (player.getStorage("clanlilun").includes(card.name)) return false; + if (ui.selected.cards.length && ui.selected.cards[0].name != card.name) return false; + const cards = player.getCards("h", cardx => player.canRecast(cardx)); + return cards.includes(card) && cards.filter(i => i.name == card.name).length > 1; + }, + selectCard: 2, + position: "h", + check(card) { + const player = get.event("player"); + const value = function (card, player) { + const num = player.getUseValue(card); + return num > 0 ? num + 1 / (get.value(card) || 0.5) + 7 : 7 - get.value(card); + }; + if (ui.selected.cards.length && value(card, player) < value(ui.selected.cards[0], player)) return 20 - get.value(card); + return value(card, player); + }, + complexCard: true, + discard: false, + lose: false, + delay: 0, + usable: 1, + async content(event, trigger, player) { + await player.recast(event.cards); + if (!player.storage.clanlilun) { + player.when({ global: "phaseAfter" }).then(() => { + player.unmarkSkill("clanlilun"); + delete player.storage.clanlilun; + }); + } + player.markAuto( + "clanlilun", + event.cards.slice().map(card => card.name) + ); + const cards = event.cards.filterInD("d"); + if (cards.some(card => player.hasUseTarget(card))) { + const { + result: { bool, links }, + } = await player + .chooseButton(["离论:是否使用其中的一张牌?", cards]) + .set("filterButton", button => { + return get.event("player").hasUseTarget(button.link); + }) + .set("ai", button => { + return get.event("player").getUseValue(button.link); + }); + if (bool) { + const card = links[0]; + player.$gain2(card, false); + await game.asyncDelayx(); + await player.chooseUseTarget(true, card, false); + } + } + }, + onremove: true, + intro: { content: "本回合已重铸过$" }, + ai: { + order(item, player) { + let cards = player.getCards("h", card => get.info("clanlilun").filterCard(card, player) && player.getUseValue(card) > 0); + cards = cards.filter(card => cards.filter(i => i.name == card.name).length > 1); + if (!cards.length) return 1; + cards.sort((a, b) => get.order(b) - get.order(a)); + return get.order(cards[0]) - 0.001; + }, + result: { player: 1 }, + }, + }, + clanjianji: { + unique: true, + limited: true, + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + if (!event.player.isIn()) return false; + const targets = game.filterPlayer(target => { + return event.player.getPrevious() == target || event.player.getNext() == target; + }); + if (!targets.length) return false; + const card = new lib.element.VCard({ name: "sha" }); + return ( + !targets.some(target => { + return target.getHistory("useCard").length; + }) || + (player.hasUseTarget(card) && + !targets.some(target => { + return game.hasPlayer2(current => { + return current.getHistory("useCard", evt => { + return evt.targets && evt.targets.includes(target); + }).length; + }); + })) + ); + }, + skillAnimation: true, + animationColor: "watar", + prompt2(event, player) { + let str = ""; + const card = new lib.element.VCard({ name: "sha" }); + const targets = game.filterPlayer(target => { + return event.player.getPrevious() == target || event.player.getNext() == target; + }), + bool = !targets.some(target => { + return target.getHistory("useCard").length; + }), + goon = + player.hasUseTarget(card) && + !targets.some(target => { + return game.hasPlayer2(current => { + return current.getHistory("useCard", evt => { + return evt.targets && evt.targets.includes(target); + }).length; + }); + }); + if (bool) { + if (goon) str += "你可以"; + str += "与" + get.translation(get.translation(event.player)) + "各摸一张牌"; + } + if (goon) { + if (bool) str += ",然后你可以"; + str += "视为使用一张【杀】"; + } + return str; + }, + check(event, player) { + const card = new lib.element.VCard({ name: "sha" }); + const targets = game.filterPlayer(target => { + return event.player.getPrevious() == target || event.player.getNext() == target; + }), + bool = !targets.some(target => { + return target.getHistory("useCard").length; + }), + goon = + player.hasUseTarget(card) && + !targets.some(target => { + return game.hasPlayer2(current => { + return current.getHistory("useCard", evt => { + return evt.targets && evt.targets.includes(target); + }).length; + }); + }); + return (bool && (get.attitude(player, event.player) > 0 || event.player.countCards("h") > player.countCards("h"))) || (goon && player.hasValueTarget(card)); + }, + logTarget: "player", + async content(event, trigger, player) { + player.awakenSkill("clanjianji"); + const card = new lib.element.VCard({ name: "sha" }); + const targets = game.filterPlayer(target => { + return trigger.player.getPrevious() == target || trigger.player.getNext() == target; + }), + boolx = !targets.some(target => { + return target.getHistory("useCard").length; + }), + goon = + player.hasUseTarget(card) && + !targets.some(target => { + return game.hasPlayer2(current => { + return current.getHistory("useCard", evt => { + return evt.targets && evt.targets.includes(target); + }).length; + }); + }); + if (boolx) { + let draw = false; + if (goon) { + const { + result: { bool }, + } = await player.chooseBool("是否与" + get.translation(trigger.player) + "各摸一张牌?").set("choice", get.attitude(player, trigger.player) > 0 || trigger.player.countCards("h") > player.countCards("h")); + if (bool) draw = true; + } else draw = true; + if (draw) { + await player.draw("nodelay"); + await trigger.player.draw(); + } + } + if (goon) await player.chooseUseTarget(card, false, !boolx); + }, + }, + //族吴乔 + clanqiajue: { + audio: 2, + trigger: { player: "phaseDrawBegin" }, + filter(event, player) { + return ( + player.countCards("he", card => { + if (_status.connectMode && get.position(card) == "h") return true; + return get.color(card, player) == "black" && lib.filter.cardDiscardable(card, player); + }) > 0 + ); + }, + direct: true, + async content(event, trigger, player) { + const { + result: { bool }, + } = await player + .chooseToDiscard((card, player) => { + return get.color(card, player) == "black" && lib.filter.cardDiscardable(card, player); + }, "he") + .set("prompt", "当前手牌点数和为" + player.getCards("h").reduce((sum, card) => sum + get.number(card), 0) + "," + get.prompt("clanqiajue")) + .set("prompt2", lib.translate.clanqiajue_info.slice(lib.translate.clanqiajue_info.indexOf("弃置")).slice(0, -1)) + .set("ai", card => { + const player = get.event("player"), + goon = get.position(card) == "h"; + let num = player.getCards("h").reduce((sum, card) => sum + get.number(card), 0); + if (num - (goon ? get.number(card) : 0) > 30) return 0; + return goon ? get.number(card) : 1 / (get.value(card) || 0.5); + }) + .set("logSkill", "clanqiajue"); + if (bool) { + player + .when({ + player: ["phaseDrawEnd", "phaseDrawCancelled", "phaseUseSkipped"], + }) + .filter(evt => evt == trigger) + .then(() => { + const cards = player.getCards("h"), + num = cards.reduce((sum, card) => sum + get.number(card), 0); + if (cards.length) player.showCards(cards, get.translation(player) + "【跒倔】展示"); + if (num > 30) { + player.popup("杯具"); + lib.skill.chenliuwushi.change(player, -2); + } else { + player.popup("洗具"); + const next = player.phaseDraw(); + event.next.remove(next); + trigger.getParent("phase").next.push(next); + } + }); + } + }, + }, + //族荀攸 + clanbaichu: { + derivation: "qice", + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + const storage = player.storage.clanbaichu || {}; + if (Object.values(storage).includes(event.card.name)) return true; + const suit = get.suit(event.card); + if (suit == "none") return false; + if (!player.hasSkill("qice")) return true; + const key = `${suit}+${get.type2(event.card)}`; + return !(key in storage); + }, + forced: true, + content() { + "step 0"; + var storage = player.storage.clanbaichu || {}, + suit = get.suit(trigger.card); + if (suit != "none") { + var key = `${suit}+${get.type2(trigger.card)}`; + if (key in storage) { + if (!player.hasSkill("qice")) { + player.addTempSkills("qice", "roundStart"); + player.popup("奇策"); + // game.log(player,'获得了技能','#g【奇策】'); + } + event.goto(2); + } else { + var list = lib.inpile.filter(name => get.type(name) == "trick"); + list.removeArray(Object.values(storage)); + if (list.length > 0) { + var dialog = ["百出:选择记录一种普通锦囊牌", [list, "vcard"]]; + player.chooseButton(dialog, true).set("ai", function (button) { + var player = _status.event.player, + name = button.link[2]; + if (name == _status.event.getTrigger().card.name) return 1919810; + if (name == "wuxie") return 114514; + return get.effect(player, { name: name }, player, player) * (1 + player.countCards("hs", name)); + }); + } else event.goto(2); + } + } else event.goto(2); + "step 1"; + if (result.bool) { + var key = `${get.suit(trigger.card)}+${get.type2(trigger.card)}`, + name = result.links[0][2]; + if (!player.storage.clanbaichu) player.storage.clanbaichu = {}; + player.storage.clanbaichu[key] = name; + player.markSkill("clanbaichu"); + game.log(player, "记录了", "#y" + get.translation(name)); + game.delayx(); + } + "step 2"; + if (Object.values(player.getStorage("clanbaichu")).includes(trigger.card.name)) { + player.chooseDrawRecover(true); + } + }, + intro: { + markcount(storage) { + return Object.keys(storage).length; + }, + content(storage) { + if (!storage) return "当前暂无记录"; + const keys = Object.keys(storage).map(i => i.split("+")); + keys.sort((a, b) => { + if (a[0] != b[0]) return lib.suit.indexOf(b[0]) - lib.suit.indexOf(a[0]); + return lib.sort.name(a[1], b[1]); + }); + return keys + .map(item => { + return `
  • ${get.translation(item[0])}+${get.translation(item[1])}:【${get.translation(storage[item.join("+")])}】`; + }) + .join("
    "); + }, + }, + }, + //族王沦 + clanqiuxin: { + audio: 2, + enable: "phaseUse", + filterTarget: lib.filter.notMe, + usable: 1, + content() { + "step 0"; + var str = get.translation(player); + target + .chooseControl() + .set("choiceList", [str + "下次对你使用【杀】后,其视为对你使用任意普通锦囊牌", str + "下次对你使用任意普通锦囊牌后,其视为对你使用【杀】"]) + .set("ai", function () { + var target = _status.event.player; + var player = _status.event.target; + var num1 = get.effect(target, get.autoViewAs({ name: "sha" }, []), player, player); + if (!player.canUse(get.autoViewAs({ name: "sha" }, []), target)) num1 = 0; + var num2 = 0; + for (var name of lib.inpile) { + if (get.type(name) != "trick") continue; + if (!player.canUse(get.autoViewAs({ name: name }, []), target)) continue; + if (num2 < get.effect(target, get.autoViewAs({ name: name }, []), player, player)) num2 = get.effect(target, get.autoViewAs({ name: name }, []), player, player); + } + return num1 >= num2 ? 1 : 0; + }) + .set("target", player); + "step 1"; + player.addSkill("clanqiuxin_effect"); + player.markAuto("clanqiuxin_effect", [[target, result.index]]); + }, + ai: { + order: 9, + result: { + target(player, target) { + var cards = player.getCards("hs", card => { + if (get.name(card, player) != "sha" && get.type(card, player) != "trick") return false; + return player.hasValueTarget(card); + }); + if (cards.some(card => player.canUse(card, target) && get.effect(target, card, player, player) > 0)) { + var att = get.attitude(player, target); + if (att > 0) return 9; + if (att < 0) return -6; + return 0; + } else { + var att = get.attitude(player, target); + if (att < 0) return -3; + if (att > 0) return 1; + return 2; + } + }, + }, + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + intro: { + content(storage, player) { + var str = ""; + for (var i = 0; i < storage.length; i++) { + var list = storage[i]; + var strx = ["【杀】", "任意普通锦囊牌"]; + if (list[1]) strx.reverse(); + str += "对" + get.translation(list[0]) + "使用" + strx[0] + "后,视为对其使用" + strx[1]; + str += "
    "; + } + str = str.slice(0, -4); + return str; + }, + }, + trigger: { player: "useCardAfter" }, + filter(event, player) { + if (!event.targets || !event.targets.length) return false; + if (event.card.name == "sha") + return event.targets.some(target => { + return player.getStorage("clanqiuxin_effect").some(list => list[0] == target && list[1] == 0); + }); + if (get.type(event.card) == "trick") + return event.targets.some(target => { + return player.getStorage("clanqiuxin_effect").some(list => list[0] == target && list[1] == 1); + }); + return false; + }, + forced: true, + popup: false, + content() { + "step 0"; + var list; + if (trigger.card.name == "sha") list = player.getStorage("clanqiuxin_effect").filter(listx => trigger.targets.includes(listx[0]) && listx[1] == 0); + if (get.type(trigger.card) == "trick") list = player.getStorage("clanqiuxin_effect").filter(listx => trigger.targets.includes(listx[0]) && listx[1] == 1); + player.unmarkAuto("clanqiuxin_effect", list); + var targets = list.map(listx => listx[0]); + event.targets = targets; + "step 1"; + var target = event.targets.shift(); + event.target = target; + var list = []; + for (var name of lib.inpile) { + if (name != "sha" && get.type(name) != "trick") continue; + if (trigger.card.name == "sha" && get.type(name) != "trick") continue; + if (name == "sha" && get.type(trigger.card) != "trick") continue; + if (!player.canUse(get.autoViewAs({ name: name }, []), target)) continue; + list.push([get.translation(get.type(name)), "", name]); + } + if (!list.length) event.goto(3); + else { + player + .chooseButton(["求心:视为对" + get.translation(target) + "使用一张牌", [list, "vcard"]], true) + .set("ai", function (button) { + var player = _status.event.player; + var target = _status.event.target; + return get.effect( + target, + { + name: button.link[2], + nature: button.link[3], + }, + player, + player + ); + }) + .set("target", target); + } + "step 2"; + if (result.bool) { + var card = { + name: result.links[0][2], + nature: result.links[0][3], + }; + player.useCard(card, target, false); + } + "step 3"; + if (event.targets.length) event.goto(1); + else if (!player.getStorage("clanqiuxin_effect").length) player.removeSkill("clanqiuxin_effect"); + }, + }, + }, + }, + clanjianyuan: { + inherit: "clanchenya", + filter(event, player) { + for (var phase of lib.phaseName) { + var evt = event.getParent(phase); + if (evt && evt.name == phase) { + if (event.player.getHistory("useCard", evtx => evtx.getParent(phase) == evt).length) return lib.skill.clanchenya.filter(event, player); + } + } + return false; + }, + content() { + "step 0"; + var num = 0; + for (var phase of lib.phaseName) { + var evt = trigger.getParent(phase); + if (evt && evt.name == phase) { + num += trigger.player.getHistory("useCard", evtx => evtx.getParent(phase) == evt).length; + } + } + trigger.player + .chooseCard("是否重铸任意张牌名字数为" + num + "的牌?", [1, Infinity], "he", (card, player) => _status.event.cards.includes(card) && player.canRecast(card)) + .set("ai", card => { + var val = get.value(card); + return 6 - val; + }) + .set( + "cards", + trigger.player.getCards("he", card => { + return get.cardNameLength(card) == num; + }) + ); + "step 1"; + if (result.bool) trigger.player.recast(result.cards); + }, + }, + //族钟毓 + clanjiejian: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget || get.type(event.card) == "equip") return false; + return get.cardNameLength(event.card) == player.getHistory("useCard").indexOf(event.getParent()) + 1; + }, + direct: true, + locked: false, + content() { + "step 0"; + var num = get.cardNameLength(trigger.card); + event.num = num; + player + .chooseTarget(get.prompt("clanjiejian"), "令一名目标角色摸" + get.cnNumber(num) + "张牌", function (card, player, target) { + return _status.event.getTrigger().targets.includes(target); + }) + .set("ai", target => get.attitude(_status.event.player, target)); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("clanjiejian", target); + target.draw(num); + } + }, + ai: { + threaten: 3, + effect: { + player(card, player, target) { + if (!target || typeof card !== "object" || player._clanjiejian_mod_temp || get.type(card) === "equip" || get.attitude(player, target) <= 0 || get.cardNameLength(card) !== player.getHistory("useCard").length + 1) return; + let targets = [target], + evt = _status.event.getParent("useCard"); + targets.addArray(ui.selected.targets); + if (evt && evt.card == card) targets.addArray(evt.targets); + return [1, (0.8 * get.cardNameLength(card)) / targets.length]; + }, + }, + }, + mod: { + aiOrder(player, card, num) { + if (typeof card == "object" && get.type(card) !== "equip") { + let cs = get.cardNameLength(card) - player.getHistory("useCard").length - 1; + if (cs < 0) return num; + if (cs > 0) return num / 3; + player._clanjiejian_mod_temp = true; + let bool = game.hasPlayer(target => { + if (get.attitude(player, target) <= 0 || !player.canUse(card, target, null, true)) return false; + return get.effect(target, card, player, player) + get.effect(target, { name: "draw" }, player, player) > 0; + }); + delete player._clanjiejian_mod_temp; + if (bool) return num + 15; + } + }, + }, + }, + clanhuanghan: { + audio: 2, + trigger: { player: "damageEnd" }, + filter(event, player) { + if (!event.card) return false; + var num = get.cardNameLength(event.card); + return typeof num == "number" && num > 0; + }, + check(event, player) { + let num = get.cardNameLength(event.card) - player.getDamagedHp(); + if (num >= 0) return true; + if (num < -1) return false; + if ( + player.hasSkill("clanbaozu", null, false, false) && + player.awakenedSkills.includes("clanbaozu") && + player.getHistory("useSkill", evt => { + return evt.skill == "clanhuanghan"; + }).length + ) + return true; + return false; + }, + content() { + "step 0"; + player.draw(get.cardNameLength(trigger.card)); + if (player.isDamaged()) player.chooseToDiscard(player.getDamagedHp(), "he", true); + "step 1"; + if (player.getHistory("useSkill", evt => evt.skill == "clanhuanghan").length > 1 && player.hasSkill("clanbaozu", null, false, false) && player.awakenedSkills.includes("clanbaozu")) { + player.restoreSkill("clanbaozu"); + player.popup("保族"); + game.log(player, "恢复了技能", "#【保族】"); + } + }, + ai: { + threaten: 3, + effect: { + target(card, player, target) { + if (!get.tag(card, "damage") || player.hasSkillTag("jueqing", false, target)) return; + let num = get.cardNameLength(card) - target.getDamagedHp(); + if (num > 0) return [1, num + 0.1]; + }, + }, + }, + }, + //族钟会 + clanyuzhi: { + mod: { + aiOrder(player, card, num) { + if (card.name == "tao") return num / 114514; + }, + }, + audio: 6, + trigger: { global: "roundStart" }, + direct: true, + locked: true, + content() { + "step 0"; + player.unmarkSkill("clanyuzhi"); + if ( + player.countCards("h", card => { + return card.hasGaintag("clanyuzhi") && lib.filter.cardDiscardable(card, player); + }) + ) { + event.logged = true; + player.chooseToDiscard( + player.countCards("h"), + "h", + (card, player) => { + return card.hasGaintag("clanyuzhi"); + }, + true + ).logSkill = "clanyuzhi"; + } + "step 1"; + player.removeGaintag("clanyuzhi"); + var num1 = player + .getRoundHistory( + "gain", + evt => { + return evt.getParent().name == "draw" && evt.getParent(2).name == "clanyuzhi"; + }, + 1 + ) + .reduce((sum, evt) => sum + evt.cards.length, 0); + var num2 = player + .getRoundHistory( + "gain", + evt => { + return evt.getParent().name == "draw" && evt.getParent(2).name == "clanyuzhi"; + }, + 2 + ) + .reduce((sum, evt) => sum + evt.cards.length, 0); + var num3 = player + .getRoundHistory( + "useCard", + evt => { + return evt.cards && evt.cards.length; + }, + 1 + ) + .reduce((sum, evt) => sum + evt.cards.length, 0); + event.num1 = num1; + if ((num1 > 0 && num2 > 0 && num1 > num2) || num1 > num3) { + if (!event.logged) player.logSkill("clanyuzhi"); + if (num2 > 0 && num1 > num2) game.log(player, "的野心已开始膨胀", "#y(" + num1 + "张>" + num2 + "张)"); + if (num1 > num3) game.log(player, "的行动未达到野心", "#y(" + num3 + "张<" + num1 + "张)"); + if (player.hasSkill("clanbaozu", null, false, false)) player.chooseBool("迂志:是否失去〖保族〗?", "若选择“否”,则你受到1点雷属性伤害").set("choice", player.awakenedSkills.includes("clanbaozu")); + else event._result = { bool: false }; + } else event.goto(3); + "step 2"; + if (result.bool) { + player.removeSkills("clanbaozu"); + } else player.damage(1, "thunder"); + "step 3"; + if (player.countCards("h")) { + player + .chooseCard( + "迂志:请展示一张手牌", + "摸此牌牌名字数的牌。下一轮开始时弃置此牌,若本轮你使用的牌数或上一轮你以此法摸的牌数小于此牌牌名字数,则你受到1点雷属性伤害或失去〖保族〗。", + function (card, player) { + var num = get.cardNameLength(card); + return typeof num == "number" && num > 0; + }, + true + ) + .set("ai", function (card) { + if (_status.event.dying && _status.event.num > 0 && get.cardNameLength(card) > _status.event.num) return 1 / get.cardNameLength(card); //怂 + return get.cardNameLength(card); //勇 + }) + .set( + "dying", + player.hp + + player.countCards("hs", { + name: ["tao", "jiu"], + }) < + 1 + ) + .set("num", event.num1); + } else event.finish(); + "step 4"; + if (result.bool) { + player.logSkill("clanyuzhi"); + player.showCards(result.cards, get.translation(player) + "发动了【迂志】"); + player.addGaintag(result.cards, "clanyuzhi"); + player.draw(get.cardNameLength(result.cards[0])); + player.storage.clanyuzhi = get.cardNameLength(result.cards[0]); + player.markSkill("clanyuzhi"); + } + }, + ai: { + threaten: 3, + nokeep: true, + }, + onremove: true, + intro: { content: "本轮野心:#张" }, + }, + clanxieshu: { + audio: 6, + trigger: { player: "damageEnd", source: "damageSource" }, + filter(event, player) { + if (!event.card || player.isLinked()) return false; + var num = get.cardNameLength(event.card); + return typeof num == "number" && num > 0 && player.countCards("he") > 0; + }, + async cost(event, trigger, player) { + var num = get.cardNameLength(trigger.card), + str = ""; + if (player.getDamagedHp() > 0) str += ",然后摸" + get.cnNumber(player.getDamagedHp()) + "张牌"; + event.result = await player + .chooseToDiscard(get.prompt("clanxieshu"), "横置武将牌并弃置" + get.cnNumber(num) + "张牌" + str, "he", num) + .set("ai", function (card) { + var player = _status.event.player; + var num = _status.event.num; + var num2 = player.getDamagedHp(); + if (!num2) return 0; + if (num < num2) return 8 - get.value(card); + if (num == num2 || num2 >= 2 + num - num2) return lib.skill.zhiheng.check(card); + return 0; + }) + .set("num", num) + .set("logSkill", "clanxieshu") + .forResult(); + }, + popup: false, + *content(event, map) { + const player = map.player; + yield player.link(true); + if (player.getDamagedHp() > 0) { + yield player.draw(player.getDamagedHp()); + } + if ( + game.getGlobalHistory("everything", evt => { + return evt.name == "dying"; + }).length + ) { + player.tempBanSkill("clanxieshu"); + } + }, + ai: { threaten: 3 }, + }, + //族王浑 + clanfuxun: { + mod: { + aiOrder(player, card, num) { + if (player.isPhaseUsing() && get.type(card) == "equip" && get.equipValue(card, player) > 0) return num + 3; + }, + }, + locked: false, + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "h", + discard: false, + lose: false, + delay: false, + selectCard() { + var player = _status.event.player; + if (ui.selected.targets.length && !ui.selected.targets[0].countGainableCards(player, "h")) return 1; + return [0, 1]; + }, + filterTarget(card, player, target) { + if (player == target) return false; + if (!ui.selected.cards.length) return target.countGainableCards(player, "h") > 0; + return true; + }, + check(card) { + var player = _status.event.player; + var evtx = _status.event.getParent("phaseUse"); + var targets = game.filterPlayer(target => target != player && lib.skill.clanfuxun.ai.result.target(player, target) != 0); + targets.sort((a, b) => Math.abs(lib.skill.clanfuxun.ai.result.target(player, b)) - Math.abs(lib.skill.clanfuxun.ai.result.target(player, a))); + if (evtx && targets.length) { + var target = targets[0]; + if ( + !target.hasHistory("lose", evt => { + return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length; + }) && + !target.hasHistory("gain", evt => { + return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length; + }) && + Math.abs(player.countCards("h") - target.countCards("h")) == 2 + ) { + if (player.countCards("h") > target.countCards("h")) return 1 / (get.value(card) || 0.5); + return -1; + } + if (card.name == "du") return 20; + return -1; + } + if (card.name == "du") return 20; + return -1; + }, + content() { + "step 0"; + if (cards.length) { + player.give(cards, target); + } else { + player.gainPlayerCard(target, "h", true); + } + "step 1"; + var evtx = event.getParent("phaseUse"); + if ( + player.countCards("h") == target.countCards("h") && + evtx && + !target.hasHistory("lose", evt => { + return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length; + }) && + !target.hasHistory("gain", evt => { + return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length; + }) && + player.countCards("he") + ) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (player.hasUseTarget({ name: name })) list.push(["基本", "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if ( + player.hasUseTarget({ + name: name, + nature: nature, + }) + ) + list.push(["基本", "", name, nature]); + } + } + } + if (list.length) { + player.chooseButton(["是否将一张牌当做一种基本牌使用?", [list, "vcard"]]).set("ai", button => { + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }); + } else event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = { + name: result.links[0][2], + nature: result.links[0][3], + }; + game.broadcastAll(function (card) { + lib.skill.clanfuxun_backup.viewAs = card; + }, card); + var next = player.chooseToUse(); + next.set("openskilldialog", "将一张牌当做" + get.translation(card) + "使用"); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "clanfuxun_backup"); + next.set("custom", { + add: {}, + replace: { window() {} }, + }); + next.backup("clanfuxun_backup"); + } + }, + ai: { + order(item, player) { + var evtx = _status.event.getParent("phaseUse"); + if ( + game.hasPlayer(current => { + if (current == player || !evtx || get.attitude(player, current) == 0) return false; + return ( + !current.hasHistory("lose", evt => { + return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length; + }) && + !current.hasHistory("gain", evt => { + return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length; + }) && + Math.abs(player.countCards("h") - current.countCards("h")) == 2 + ); + }) + ) + return 10; + return 2; + }, + result: { + target(player, target) { + var evtx = _status.event.getParent("phaseUse"); + var num = get.sgn(get.attitude(player, target)); + var targets = game.filterPlayer(current => { + if (current == player || !evtx || get.attitude(player, current) == 0) return false; + return ( + !current.hasHistory("lose", evt => { + return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length; + }) && + !current.hasHistory("gain", evt => { + return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length; + }) && + Math.abs(player.countCards("h") - current.countCards("h")) == 2 + ); + }); + if (targets.includes(target)) { + if (player.countCards("h") < target.countCards("h")) return get.sgn(num + 0.5) * Math.sqrt(2 - num); + else return num * (2 + num); + } + return get.sgn(num + 0.5) * (1 - num) * 0.25; + }, + }, + }, + subSkill: { + backup: { + filterCard(card) { + return get.itemtype(card) == "card"; + }, + position: "hes", + filterTarget: lib.filter.filterTarget, + selectCard: 1, + check(card) { + var player = _status.event.player; + if (player.hasSkill("clanzhongliu") && get.position(card) != "h") return 10 - get.value(card); + return 5 - get.value(card); + }, + log: false, + precontent() { + delete event.result.skill; + }, + }, + }, + }, + clanchenya: { + audio: 2, + trigger: { + global: ["useSkillAfter", "logSkill"], + }, + filter(event, player) { + if (event.type != "player") return false; + var skill = event.sourceSkill || event.skill; + var info = get.info(skill); + if (info.charlotte) return false; + var translation = get.skillInfoTranslation(skill, event.player); + if (!translation) return false; + var match = translation.match(/“?出牌阶段限一次/g); + if (!match || match.every(value => value != "出牌阶段限一次")) return false; + return event.player.countCards("h") > 0; + }, + check(event, player) { + return get.attitude(player, event.player) > 0; + }, + logTarget: "player", + content() { + "step 0"; + var num = trigger.player.countCards("h"); + trigger.player + .chooseCard("是否重铸任意张牌名字数为" + num + "的牌?", [1, Infinity], "he", (card, player) => _status.event.cards.includes(card) && player.canRecast(card)) + .set("ai", card => { + var val = get.value(card); + return 6 - val; + }) + .set( + "cards", + trigger.player.getCards("he", card => { + return get.cardNameLength(card) == num; + }) + ); + "step 1"; + if (result.bool) trigger.player.recast(result.cards); + }, + }, + //族王允 + clanjiexuan: { + audio: 2, + enable: "phaseUse", + limited: true, + zhuanhuanji: "number", + mark: true, + marktext: "☯", + intro: { + markcount: () => 0, + content(storage) { + return "限定技,转换技。你可以将一张" + ((storage || 0) % 2 ? "黑色牌当【过河拆桥】" : "红色牌当【顺手牵羊】") + "使用。"; + }, + }, + viewAs(cards, player) { + var storage = player.storage.clanjiexuan; + var name = (storage || 0) % 2 ? "guohe" : "shunshou"; + return { name: name }; + }, + check(card) { + var player = _status.event.player; + var storage = player.storage.clanjiexuan; + var name = (storage || 0) % 2 ? "guohe" : "shunshou"; + var fix = player.hasSkill("clanzhongliu") && get.position(card) != "h" ? 2 : 1; + return (get.value({ name: name }, player) - get.value(card)) * fix; + }, + position: "hes", + filterCard(card, player) { + var storage = player.storage.clanjiexuan; + return get.color(card) == ((storage || 0) % 2 ? "black" : "red"); + }, + prompt() { + var storage = _status.event.player.storage.clanjiexuan; + if ((storage || 0) % 2) return "将一张黑色牌当【过河拆桥】使用"; + return "将一张红色牌当【顺手牵羊】使用"; + }, + skillAnimation: true, + animationColor: "thunder", + precontent() { + "step 0"; + var skill = "clanjiexuan"; + player.logSkill(skill); + player.changeZhuanhuanji(skill); + player.awakenSkill(skill, true); + delete event.result.skill; + }, + ai: { + order(item, player) { + player = player || _status.event.player; + var storage = _status.event.player.storage.clanjiexuan; + var name = (storage || 0) % 2 ? "guohe" : "shunshou"; + return get.order({ name: name }) + 0.1; + }, + }, + }, + clanmingjie: { + init(player) { + player.addSkill("clanmingjie_record"); + }, + initSkill(skill) { + if (!lib.skill[skill]) { + lib.skill[skill] = { + charlotte: true, + mark: true, + marktext: "戒", + intro: { content: "已被$指定为【铭戒】目标" }, + }; + lib.translate[skill] = "铭戒"; + lib.translate[skill + "_bg"] = "戒"; + } + }, + onremove(player) { + player.removeSkill("clanmingjie_record"); + }, + audio: 2, + enable: "phaseUse", + limited: true, + filterTarget(card, player, target) { + return !target.hasSkill("clanmingjie_" + player.playerid); + }, + skillAnimation: true, + animationColor: "thunder", + content() { + player.awakenSkill("clanmingjie"); + player.addSkill("clanmingjie_effect"); + var skill = "clanmingjie_" + player.playerid; + game.broadcastAll(lib.skill.clanmingjie.initSkill, skill); + target.addTempSkill(skill, { player: "phaseAfter" }); + target.storage[skill] = player; + }, + ai: { + order: 10, + result: { + target(player, target) { + if (player.hasSkill("clanzhongliu") || player.hp == 1) { + if ( + !player.hasCard(card => { + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (!lib.filter.targetEnabled2(card, player, target)) return false; + return game.hasPlayer(current => { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0 && current != target && get.effect(target, card, player, player) > 0; + }); + }, "hs") + ) + return 0; + } else { + if ( + player.countCards("hs", card => { + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (!lib.filter.targetEnabled2(card, player, target)) return false; + return game.hasPlayer(current => { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0 && current != target && get.effect(target, card, player, player) > 0; + }); + }) < 3 + ) + return 0; + } + return get.sgnAttitude(player, target); + }, + }, + }, + subSkill: { + effect: { + charlotte: true, + audio: "clanmingjie", + trigger: { player: "useCard2" }, + filter(event, player) { + var card = event.card; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + return game.filterPlayer().some(current => { + if (!current.hasSkill("clanmingjie_" + player.playerid)) return false; + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && lib.filter.targetInRange(card, player, current); + }); + } + return false; + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget( + get.prompt("clanmingjie_effect"), + "令任意【铭戒】目标角色成为" + get.translation(trigger.card) + "的目标", + function (card, player, target) { + var trigger = _status.event.getTrigger(); + if (trigger.targets.includes(target) || !target.isIn() || !target.hasSkill("clanmingjie_" + player.playerid)) return false; + return lib.filter.targetEnabled2(trigger.card, player, target) && lib.filter.targetInRange(trigger.card, player, target); + }, + [1, Infinity] + ) + .set("ai", function (target) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, player, player); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("clanmingjie_effect", targets); + trigger.targets.addArray(targets); + game.log(targets, "成为了", trigger.card, "的额外目标"); + } + }, + group: "clanmingjie_targeted", + }, + targeted: { + charlotte: true, + trigger: { global: "phaseEnd" }, + filter(event, player) { + var cards = player.getStorage("clanmingjie_record").slice(); + cards = cards.filterInD("d"); + if (!cards.length) return false; + var history = player.getHistory("useSkill", evt => evt.skill == "clanmingjie"); + if (history.length) { + var targets = history.reduce((list, evt) => list.addArray(evt.targets), []); + if (event.player != player && targets.includes(event.player)) return true; + } + if (player.actionHistory.length >= 2) { + for (var i = player.actionHistory.length - 2; i >= 0; i--) { + if (!player.actionHistory[i].isMe) continue; + var history2 = player.actionHistory[i].useSkill.filter(evt => evt.skill == "clanmingjie"); + if (history2.length) { + var targets2 = history2.reduce((list, evt) => list.addArray(evt.targets), []); + if (targets2.includes(event.player)) return true; + } + break; + } + } + return false; + }, + forced: true, + popup: false, + content() { + "step 0"; + var cards = player.getStorage("clanmingjie_record").slice(); + cards = cards.filterInD("d"); + event.cards = cards; + "step 1"; + player + .chooseButton(["铭戒:是否使用这些牌?", cards]) + .set("filterButton", button => { + return _status.event.player.hasUseTarget(button.link); + }) + .set("ai", button => { + return _status.event.player.getUseValue(button.link); + }); + "step 2"; + if (result.bool) { + var card = result.links[0]; + event.cards.remove(card); + player.$gain2(card, false); + game.delayx(); + player.chooseUseTarget(card, true); + } else event.finish(); + "step 3"; + if ( + event.cards.filter(card => { + return get.position(card, true) == "d" && player.hasUseTarget(card); + }).length + ) + event.goto(1); + }, + }, + record: { + charlotte: true, + trigger: { + global: ["shaMiss", "eventNeutralized", "useCard1", "phaseAfter"], + }, + filter(event, player) { + if (event.name == "useCard") { + return get.suit(event.card) == "spade"; + } + if (event.name == "phase") return true; + if (event.type != "card") return false; + return true; + }, + silent: true, + forced: true, + content() { + "step 0"; + if (trigger.name == "phase") { + delete player.storage.clanmingjie_record; + return; + } + player.markAuto("clanmingjie_record", trigger.cards); + }, + }, + }, + }, + //族钟琰 + clanguangu: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content(storage) { + return "转换技。出牌阶段限一次,你可以观看" + (storage ? "一名角色的至多四张手" : "牌堆顶的至多四张") + "牌,然后可以使用其中的一张牌。"; + }, + }, + filter(event, player) { + if (player.storage.clanguangu) + return game.hasPlayer(current => { + return current.countCards("h"); + }); + return true; + }, + chooseButton: { + dialog(event, player) { + var dialog = ui.create.dialog("观骨:选择观看牌堆的牌数", "hidden"); + if (player.storage.clanguangu) dialog.forceDirect = true; + return dialog; + }, + chooseControl(event, player) { + var list = [1, 2, 3, 4].map(i => { + return get.cnNumber(i, true); + }); + list.push("cancel2"); + return list; + }, + check(button, player) { + var ret; + if (!player.hasSkill("clanxiaoyong")) ret = 4; + else { + var list = [4, 3, 2, 1]; + player.getHistory("useCard", evt => { + var len = get.cardNameLength(evt.card); + list.remove(len); + }); + if (list.length) ret = list[0]; + else ret = 4; + } + return get.cnNumber(ret, true); + }, + backup(result, player) { + return { + audio: "clanguangu", + filterCard: () => false, + selectCard: -1, + filterTarget(card, player, target) { + if (player.storage.clanguangu) return true; + return false; + }, + selectTarget() { + var player = _status.event.player; + if (player.storage.clanguangu) return 1; + return -1; + }, + num: result.index + 1, + content() { + "step 0"; + player.changeZhuanhuanji("clanguangu"); + if (!targets.length) { + var num = lib.skill.clanguangu_backup.num; + var cards = get.cards(num); + event.cards = cards.slice(0); + while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); + game.updateRoundNumber(); + event.goto(2); + } else { + var ret; + if (!player.hasSkill("clanxiaoyong")) ret = 4; + else { + var list = [4, 3, 2, 1]; + player.getHistory("useCard", evt => { + var len = get.cardNameLength(evt.card); + list.remove(len); + }); + if (list.length) ret = list[0]; + else ret = 4; + } + player + .choosePlayerCard(target, "h", true, [1, 4]) + .set("prompt", "观骨:观看" + get.translation(target) + "的至多四张牌") + .set("ai", button => { + if (ui.selected.buttons.length >= _status.event.num) return 0; + return Math.random(); + }) + .set("num", ret); + } + "step 1"; + if (result.bool) { + event.cards = result.links; + } else { + event.finish(); + } + "step 2"; + var count = cards.length; + event.getParent().viewedCount = count; + player + .chooseButton(["观骨:是否使用其中一张牌?", cards]) + .set("filterButton", button => { + var player = _status.event.player; + var card = button.link; + var cardx = { + name: get.name(card, get.owner(card)), + nature: get.nature(card, get.owner(card)), + cards: [card], + }; + return player.hasUseTarget(cardx, null, false); + }) + .set("ai", button => { + var len = _status.event.len; + var card = button.link; + var fix = 1; + if (get.cardNameLength(card) == len) fix = 2; + return fix * _status.event.player.getUseValue(card); + }) + .set( + "len", + (function () { + if (!player.hasSkill("clanxiaoyong")) return 0; + var list = []; + player.getHistory("useCard", evt => { + var len = get.cardNameLength(evt.card); + list.add(len); + }); + if (!list.includes(count)) return count; + if (list.length) return list.randomGet(); + return 4; + })() + ); + "step 3"; + if (result.bool) { + var card = result.links[0]; + cards.remove(card); + var cardx = { + name: get.name(card, get.owner(card)), + nature: get.nature(card, get.owner(card)), + cards: [card], + }; + var next = player.chooseUseTarget(cardx, [card], true, false).set("oncard", card => { + var owner = _status.event.getParent().owner; + if (owner) owner.$throw(card.cards); + }); + if (card.name === cardx.name && get.is.sameNature(card, cardx, true)) next.viewAs = false; + var owner = get.owner(card); + if (owner != player && get.position(card) == "h") { + next.throw = false; + next.set("owner", owner); + } + } + }, + ai: { + order: 10, + result: { + target(player, target) { + return -Math.min(target.countCards("h"), 4) / 2; + }, + }, + }, + }; + }, + prompt(result, player) { + if (!player.storage.clanguangu) return "点击“确定”以观看牌堆顶牌"; + return "观骨:选择观看牌的目标"; + }, + }, + subSkill: { + backup: {}, + }, + ai: { + order: 10, + result: { + player: 1, + }, + }, + }, + clanxiaoyong: { + audio: 2, + trigger: { + player: "useCard", + }, + filter(event, player) { + var len = get.cardNameLength(event.card); + if ( + player.hasHistory( + "useCard", + function (evt) { + return evt != event && get.cardNameLength(evt.card) == len; + }, + event + ) + ) + return false; + if (!player.getStat().skill.clanguangu) return false; + var history = player + .getAllHistory("useSkill", evt => { + return evt.skill == "clanguangu_backup"; + }) + .map(evt => evt.event); + if (!history.length) return false; + var num = 0; + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + if (evt.viewedCount) { + num = evt.viewedCount; + break; + } + } + if (num && len == num) return true; + return false; + }, + forced: true, + content() { + "step 0"; + delete player.getStat().skill.clanguangu; + game.log(player, "重置了", "#g【观骨】"); + }, + ai: { + combo: "clanguangu", + }, + mod: { + aiOrder(player, card, num) { + if (!player.hasSkill("clanguangu") || !player.getStat().skill.clanguangu) return; + var history = player + .getAllHistory("useSkill", evt => { + return evt.skill == "clanguangu_backup"; + }) + .map(evt => evt.event); + if (!history.length) return; + var numx = 0; + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + if (evt.viewedCount) { + numx = evt.viewedCount; + break; + } + } + if (numx == get.cardNameLength(card)) { + if ( + !player.hasHistory("useCard", evt => { + return numx == get.cardNameLength(evt.card); + }) + ) { + return num + 9; + } + } + }, + }, + }, + clanbaozu: { + audio: 2, + audioname: ["clan_zhongyan", "clan_zhongyu", "clan_zhongyao"], + audioname2: { clan_zhonghui: "clanbaozu_clan_zhonghui" }, + trigger: { global: "dying" }, + clanSkill: true, + limited: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return (event.player == player || event.player.hasClan("颍川钟氏")) && event.player.hp <= 0 && !event.player.isLinked(); + }, + logTarget: "player", + check(event, player) { + return lib.skill.wanlan.check(event, player); + }, + content() { + "step 0"; + player.awakenSkill("clanbaozu"); + "step 1"; + trigger.player.link(true); + trigger.player.recover(); + }, + subSkill: { clan_zhonghui: { audio: 6 } }, + }, + //族王淩 + clanbolong: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("he") > 0; + }, + filterTarget: lib.filter.notMe, + content() { + "step 0"; + var num = player.countCards("h"); + var str = "是否交给其" + get.cnNumber(num) + "张牌,然后视为你对其使用一张【酒】?或者点击“取消”,令其交给你一张牌,然后其视为对你使用一张雷【杀】。"; + if (!num || target.countCards("he") < num) event._result = { bool: false }; + else + target + .chooseCard(get.translation(player) + "对你发动了【驳龙】", str, num, "he") + .set("ai", card => { + if (_status.event.canGive) return 5 + Math.max(0, 3 - _status.event.player.hp) / 1.5 - get.value(card); + return 0; + }) + .set( + "canGive", + (function () { + if (get.attitude(target, player) > 1) return true; + if (!player.hasSha() && player.countCards("h") <= 4) return true; + var sha = { + name: "sha", + nature: "thunder", + isCard: true, + }; + if ( + game.hasPlayer(current => { + return player.canUse(sha, current, true, true) && get.effect(current, sha, player, target) < 0 && !current.countCards("hs", ["shan", "caochuan"]); + }) + ) + return false; + return true; + })() + ); + "step 1"; + if (result.bool) { + var cards = result.cards; + target.give(cards, player); + if (lib.filter.targetEnabled2({ name: "jiu", isCard: true }, target, player)) target.useCard({ name: "jiu", isCard: true }, player, false); + event.finish(); + } else { + player.chooseCard("驳龙:交给" + get.translation(target) + "一张牌", get.translation(target) + "拒绝给牌,请交给其一张牌然后视为对其使用一张雷【杀】", true, "he"); + } + "step 2"; + if (result.bool) { + var cards = result.cards; + player.give(cards, target); + var sha = { + name: "sha", + nature: "thunder", + isCard: true, + }; + if (player.canUse(sha, target, false, false)) player.useCard(sha, target, false); + } + }, + ai: { + order(item, player) { + return get.order({ name: "jiu" }) + 0.01; + }, + threaten: 2, + result: { + target(player, target) { + if ( + player.hasCard(card => { + return get.value(card) < 5 && !["shan", "tao", "jiu", "wuxie", "caochuan"].includes(get.name(card)); + }, "he") + ) + return -1; + return 0; + }, + }, + }, + }, + clanzhongliu: { + audio: 2, + audioname: ["clan_wangling", "clan_wangyun", "clan_wanghun", "clan_wanglun", "clan_wangguang", "clan_wangmingshan"], + trigger: { player: "useCard" }, + forced: true, + clanSkill: true, + filter(event, player) { + if (!event.cards.length) return true; + return !game.hasPlayer2(current => { + if (!current.hasClan("太原王氏") && current != player) return false; + return current.hasHistory("lose", evt => { + return evt.getParent() == event && evt.hs.length > 0; + }); + }); + }, + content() { + "step 0"; + var skills = player.getStockSkills(true, true); + game.expandSkills(skills); + var resetSkills = []; + var suffixs = ["used", "round", "block", "blocker"]; + for (var skill of skills) { + var info = get.info(skill); + if (typeof info.usable == "number") { + if (player.hasSkill("counttrigger") && player.storage.counttrigger[skill] && player.storage.counttrigger[skill] >= 1) { + delete player.storage.counttrigger[skill]; + resetSkills.add(skill); + } + if (typeof get.skillCount(skill) == "number" && get.skillCount(skill) >= 1) { + delete player.getStat("skill")[skill]; + resetSkills.add(skill); + } + } + if (info.round && player.storage[skill + "_roundcount"]) { + delete player.storage[skill + "_roundcount"]; + resetSkills.add(skill); + } + if (player.storage[`temp_ban_${skill}`]) { + delete player.storage[`temp_ban_${skill}`]; + } + if (player.awakenedSkills.includes(skill)) { + player.restoreSkill(skill); + resetSkills.add(skill); + } + for (var suffix of suffixs) { + if (player.hasSkill(skill + "_" + suffix)) { + player.removeSkill(skill + "_" + suffix); + resetSkills.add(skill); + } + } + } + if (resetSkills.length) { + var str = ""; + for (var i of resetSkills) { + str += "【" + get.translation(i) + "】、"; + } + game.log(player, "重置了技能", "#g" + str.slice(0, -1)); + } + }, + }, + //族吴匡 + clanlianzhu: { + audio: 2, + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content(storage) { + var str = "转换技。每名角色A的出牌阶段限一次。"; + if (!storage) str += "A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1。"; + else str += "A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1"; + return str; + }, + }, + global: "clanlianzhu_global", + subSkill: { + global: { + forceaudio: true, + audio: "clanlianzhu", + enable: "phaseUse", + filter: (event, player) => game.hasPlayer(current => lib.skill.clanlianzhu_global.filterTarget(null, player, current)), + filterCard: (card, player) => game.hasPlayer(current => current.hasSkill("clanlianzhu") && !current.hasSkill("clanlianzhu_targeted") && !current.storage.clanlianzhu) && player.canRecast(card), + selectCard: [0, 1], + check(card) { + return 5 - get.value(card); + }, + filterTarget(card, player, target) { + return ( + target.hasSkill("clanlianzhu") && + !target.hasSkill("clanlianzhu_targeted") && + (!target.storage.clanlianzhu || + (target.storage.clanlianzhu && + game.hasPlayer(current => { + if (current == player || current == target) return false; + return current.inRangeOf(player) || current.inRangeOf(target); + }))) + ); + }, + selectTarget() { + var player = _status.event.player; + var count = game.countPlayer(current => lib.skill.clanlianzhu_global.filterTarget(null, player, current)); + return count == 1 ? -1 : 1; + }, + filterOk() { + var target = ui.selected.targets[0]; + if (!target) return false; + if (!target.storage.clanlianzhu) { + return ui.selected.cards.length == 1; + } + return ui.selected.cards.length == 0; + }, + position: "he", + discard: false, + lose: false, + delay: false, + prompt() { + var player = _status.event.player; + var bocchi = [], + kita = []; + game.countPlayer(function (target) { + if (target.hasSkill("clanlianzhu") && !target.hasSkill("clanlianzhu_targeted")) { + if (target.storage.clanlianzhu) { + if ( + game.hasPlayer(current => { + if (current == player || current == target) return false; + return current.inRangeOf(player) || current.inRangeOf(target); + }) + ) + kita.add(target); + } else { + if (player.countCards("he") > 0) bocchi.add(target); + } + } + }); + bocchi.sortBySeat(); + kita.sortBySeat(); + var str = ""; + if (bocchi.length) { + str += "重铸一张牌,然后令"; + bocchi.forEach((current, i) => { + str += get.translation(current); + if (i < bocchi.length - 1) str += "或"; + }); + str += "选择是否重铸一张牌"; + if (kita.length) str += "。
    或者"; + } + if (kita.length) { + str += "令"; + kita.forEach((current, i) => { + str += get.translation(current); + if (i < kita.length - 1) str += "或"; + }); + str += "选择一名目标,然后对其进行集火"; + } + str += "。"; + return str; + }, + content() { + "step 0"; + target.addTempSkill("clanlianzhu_targeted", "phaseUseAfter"); + if (target.storage.clanlianzhu) event.goto(4); + target.changeZhuanhuanji("clanlianzhu"); + "step 1"; + player.recast(cards); + "step 2"; + if (!target.countCards("he") && !_status.connectMode) event._result = { bool: false }; + else target.chooseCard("he", "联诛:是否重铸一张牌?", lib.filter.cardRecastable); + "step 3"; + if (result.bool) { + target.recast(result.cards); + if (get.color(cards[0]) === get.color(result.cards[0])) lib.skill.chenliuwushi.change(target, 1); + } + event.finish(); + "step 4"; + target + .chooseTarget("联诛:选择其与你使用【杀】的目标", true, (card, player, target) => { + if (target == player || target == _status.event.sourcex) return false; + return target.inRangeOf(player) || target.inRangeOf(_status.event.sourcex); + }) + .set("ai", target => { + return get.effect(target, { name: "sha" }, _status.event.player, _status.event.player); + }) + .set("sourcex", player); + "step 5"; + if (result.bool) { + var targetx = result.targets[0]; + event.targetx = targetx; + target.line(targetx); + event.targets = [player, target]; + event.cards = []; + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + "step 6"; + var current = targets.shift(); + current + .chooseToUse( + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + "联诛:是否对" + get.translation(event.targetx) + "使用一张杀?" + ) + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", event.targetx) + .set("addCount", false); + "step 7"; + if (result.bool) cards.push(result.card); + if (targets.length > 0) event.goto(6); + "step 8"; + if (cards.length > 1) { + const color = get.color(cards[0], false); + if (color != "none") { + for (let i = 1; i < cards.length; i++) { + const color2 = get.color(cards[i], false); + if (color !== color2 && color2 !== "none") { + lib.skill.chenliuwushi.change(target, -1); + break; + } + } + } + } + }, + ai: { + order: 4.1, + result: { + player(player, target) { + if (!target.storage.clanlianzhu && player.hasCard(card => get.value(card) < 5, "he")) return 1; + return 0; + }, + target(player, target) { + if (target.storage.clanlianzhu && player.hasSha()) return 1; + return 0; + }, + }, + }, + }, + targeted: { charlotte: true }, + }, + }, + //族韩韶 + clanfangzhen: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(current => !current.isLinked()); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("clanfangzhen"), (card, player, target) => { + return !target.isLinked(); + }) + .set("ai", target => { + var player = _status.event.player; + if (_status.event.goon && target != player) { + target.classList.add("linked"); + target.classList.add("linked2"); + try { + var cards = player.getCards("hs", cardx => { + if (get.name(cardx) != "sha") return false; + return game.hasNature(cardx, "linked"); + }); + cards.map(i => [i, get.effect(target, i, player, player)]); + cards.sort((a, b) => b[1] - a[1]); + } catch (e) { + target.classList.remove("linked"); + target.classList.remove("linked2"); + } + target.classList.remove("linked"); + target.classList.remove("linked2"); + var eff = cards[0][1]; + if (eff > 0) return eff; + return Math.max(2 * get.effect(target, { name: "draw" }, player, player) + 0.6 * get.effect(player, { name: "draw" }, player, player), get.recoverEffect(target, player, player)); + } + return Math.max(2 * get.effect(target, { name: "draw" }, player, player) + 0.6 * get.effect(player, { name: "draw" }, player, player), get.recoverEffect(target, player, player)); + }) + .set( + "goon", + player.countCards("hs", card => { + return get.name(card) == "jiu" && player.hasUseTarget(card); + }) && + player.countCards("hs", card => { + if (get.name(card) != "sha") return false; + return game.hasNature(card, "linked"); + }) + ); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("clanfangzhen", target); + player.addSkill("clanfangzhen_remove"); + player.markAuto("clanfangzhen_remove", [target.getSeatNum()]); + target.link(true); + var choices = ["选项一"], + choiceList = ["摸两张牌,然后交给" + get.translation(target) + "两张牌", "令" + get.translation(target) + "回复1点体力"]; + if (target.isDamaged()) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + player + .chooseControl(choices) + .set("prompt", "放赈:请选择一项") + .set("choiceList", choiceList) + .set("ai", () => { + var player = _status.event.player, + target = _status.event.getParent().target; + if (!target.isDamaged()) return 0; + if (get.attitude(player, target) <= 0 && player.countCards("he", card => get.value(card) < 0) >= 2) return 0; + return 2 * get.effect(target, { name: "draw" }, player, player) + 0.6 * get.effect(player, { name: "draw" }, player, player) > get.recoverEffect(target, player, player) ? 0 : 1; + }); + } else event.finish(); + "step 2"; + if (result.control == "选项一") { + player.draw(2); + if (player == target) event.finish(); + } else { + target.recover(); + event.finish(); + } + "step 3"; + if (!player.countCards("he")) event.finish(); + else if (player.countCards("he") <= 2) + event._result = { + bool: true, + cards: player.getCards("he"), + }; + else { + player.chooseCard("放赈:交给" + get.translation(target) + "两张牌", "he", 2, true); + } + "step 4"; + if (result.bool) { + player.give(result.cards, target); + } + }, + ai: { + expose: 0.2, + }, + subSkill: { + remove: { + trigger: { global: "roundStart" }, + onremove: true, + forced: true, + locked: false, + charlotte: true, + filter(event, player) { + return player.getStorage("clanfangzhen_remove").includes(game.roundNumber); + }, + content() { + player.removeSkills("clanfangzhen"); + }, + }, + }, + }, + clanliuju: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + return game.hasPlayer(current => player.canCompare(current)); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt("clanliuju"), "与一名其他角色拼点,输的角色可以使用任意张拼点牌中的非基本牌", (card, player, target) => { + return player.canCompare(target); + }) + .set("ai", target => { + var player = _status.event.player; + var ts = target.getCards("h").sort((a, b) => get.number(a) - get.number(b)); + if (get.attitude(player, target) < 0) { + var hs = player.getCards("h").sort((a, b) => get.number(a) - get.number(b)); + if (!hs.length || !ts.length) return 0; + if (get.type(hs[0], null, false) == "basic" && get.value(hs[0]) > 6) return 0; + if (get.number(hs[0]) < get.number(ts[0]) || get.type(hs[0], null, false) == "basic") return 1; + return Math.random() - 0.7; + } + return get.type(ts[0]) != "basic"; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("clanliuju", target); + player.chooseToCompare(target).set("small", true); + } else event.finish(); + "step 2"; + if (!result.tie) { + var loser = result.bool ? target : player; + var cards = []; + game.getGlobalHistory("cardMove", evt => { + if (evt.getParent(2) == event) + cards.addArray( + evt.cards.filter(i => { + return get.position(i, true) == "d" && get.type(i, null, false) != "basic"; + }) + ); + }); + event.loser = loser; + event.distance = [get.distance(player, target), get.distance(target, player)]; + if (cards.length) event.cards = cards; + else event.finish(); + } else event.finish(); + "step 3"; + var cardsx = cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i)); + if (!cardsx.length) event.goto(6); + else + event.loser + .chooseButton(["留驹:是否使用其中的一张牌?", cardsx]) + .set("filterButton", button => { + return _status.event.player.hasUseTarget(button.link); + }) + .set("ai", button => { + return _status.event.player.getUseValue(button.link) + 0.1; + }); + "step 4"; + if (result.bool) { + var card = result.links[0]; + event.cards.remove(card); + event.loser.$gain2(card, false); + game.delayx(); + event.loser.chooseUseTarget(true, card, false); + } else event.goto(6); + "step 5"; + if (cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i)).length) event.goto(3); + "step 6"; + if (get.distance(player, target) != event.distance[0] || get.distance(target, player) != event.distance[1]) { + player.restoreSkill("clanxumin"); + game.log(player, "重置了", "#g【恤民】"); + } + }, + }, + clanxumin: { + audio: 2, + audioname: ["clan_hanshao", "clan_hanrong"], + enable: "phaseUse", + viewAs: { name: "wugu" }, + filterCard: true, + filterTarget(card, player, target) { + if (player == target) return false; + return player.canUse(card, target); + }, + selectTarget: [1, Infinity], + check(card) { + return 6 - get.value(card); + }, + position: "he", + limited: true, + clanSkill: true, + skillAnimation: true, + animationColor: "soil", + precontent() { + player.logSkill("clanxumin"); + player.awakenSkill("clanxumin"); + delete event.result.skill; + }, + ai: { + order: 7, + result: { target: 1 }, + }, + }, + //族韩融 + //我们连和!(?) + clanlianhe: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(current => !current.isLinked()); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("clanlianhe"), 2, (card, player, target) => { + return !target.isLinked(); + }) + .set("ai", target => { + var att = get.attitude(_status.event.player, target); + if (att > 0) att /= 1.2; + return Math.abs(att); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + targets.forEach(i => i.link(true)); + player.logSkill("clanlianhe", targets); + player.addSkill("clanlianhe_effect"); + player.markAuto("clanlianhe_effect", targets); + } + }, + subSkill: { + effect: { + trigger: { global: ["phaseUseEnd", "die"] }, + charlotte: true, + forced: true, + locked: false, + popup: false, + onremove: true, + filter(event, player) { + return player.getStorage("clanlianhe_effect").includes(event.player); + }, + marktext: "连", + intro: { content: "已选择目标:$" }, + content() { + "step 0"; + player.unmarkAuto("clanlianhe_effect", [trigger.player]); + if (trigger.name == "die") event.finish(); + "step 1"; + if ( + trigger.player.hasHistory("gain", evt => { + return evt.getParent().name == "draw" && evt.getParent("phaseUse") == trigger; + }) + ) + event.finish(); + else { + player.logSkill("clanlianhe_effect", trigger.player); + var num = 0; + trigger.player.getHistory("gain", evt => { + if (evt.getParent("phaseUse") != trigger) return false; + num += evt.cards.length; + }); + num = Math.min(num, 3); + event.num = num; + if (num <= 1) event._result = { bool: false }; + else { + var pos = player == trigger.player ? "e" : "he"; + trigger.player + .chooseCard("连和:交给" + get.translation(player) + get.cnNumber(num - 1) + "张牌,或点“取消”令其摸" + get.cnNumber(num + 1) + "张牌", num - 1, pos) + .set("ai", card => { + if (_status.event.draw) return 0; + return 5 - get.value(card); + }) + .set("draw", get.attitude(trigger.player, player) >= 0); + } + } + "step 2"; + if (result.bool) { + trigger.player.give(result.cards, player); + } else player.draw(num + 1); + }, + }, + }, + }, + clanhuanjia: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + return game.hasPlayer(current => player.canCompare(current)); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt("clanhuanjia"), "与一名其他角色拼点,赢的角色可以使用一张拼点牌。若此牌未造成过伤害,你获得另一张拼点牌,否则你失去一个技能", (card, player, target) => { + return player.canCompare(target); + }) + .set("ai", target => { + var player = _status.event.player; + if (get.attitude(player, target) <= 0) { + var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + if (!hs.length || !ts.length) return 0; + if (get.number(hs[0]) > get.number(ts[0]) && !get.tag(hs[0], "damage") && player.hasValueTarget(hs[0])) return 1; + return Math.random() - 0.4; + } + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("clanhuanjia", target); + player.chooseToCompare(target); + } else event.finish(); + "step 2"; + if (!result.tie) { + var winner = result.bool ? player : target; + var cards = []; + game.getGlobalHistory("cardMove", evt => { + if (evt.getParent(3) == event) cards.addArray(evt.cards.filterInD("d")); + }); + event.winner = winner; + if (cards.length) event.cards = cards; + else event.finish(); + } else event.finish(); + "step 3"; + var cardsx = cards.filter(i => get.position(i, true) == "d" && event.winner.hasUseTarget(i)); + if (!cardsx.length) event.goto(6); + else + event.winner + .chooseButton(["缓颊:是否使用其中的一张牌?", cardsx]) + .set("filterButton", button => { + return _status.event.player.hasUseTarget(button.link); + }) + .set("ai", button => { + var damage = 1; + if (_status.event.att > 2 && get.tag(button.link, "damage")) damage *= 2; + return _status.event.player.getUseValue(button.link) * damage + 0.1; + }) + .set("att", get.attitude(event.winner, player)); + "step 4"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + event.cards.remove(card); + event.winner.$gain2(card, false); + game.delayx(); + event.winner.chooseUseTarget(true, card, false); + } + "step 5"; + if ( + game.hasPlayer2(current => { + return current.hasHistory("sourceDamage", evt => evt.cards && evt.cards[0] == card); + }) + ) { + var skills = player.getSkills(null, false, false).filter(skill => { + var info = get.info(skill); + if (!info || get.is.empty(info) || info.charlotte) return false; + return true; + }); + player + .chooseControl(skills) + .set( + "choiceList", + skills.map(i => { + return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; + }) + ) + .set("displayIndex", false) + .set("prompt", "恤民:失去一个技能") + .set("ai", () => { + var choices = _status.event.controls.slice(); + var value = skill => get.skillRank(skill, "in") + get.skillRank(skill, "out"); + choices = choices.map(skill => [skill, value(skill)]); + var list = choices.sort((a, b) => a[1] - b[1])[0]; + if (list[1] < 2) return list[0]; + else { + if (_status.event.controls.includes("clanxumin")) return "clanxumin"; + return list[0]; + } + }); + } else { + player.gain(cards, "gain2"); + event.finish(); + } + "step 6"; + player.removeSkills(result.control); + }, + ai: { + expose: 0.1, + }, + }, + //族荀谌 + clansankuang: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + forced: true, + filter(event, player) { + if (!game.hasPlayer(current => current != player)) return false; + const type = get.type2(event.card); + return player.getRoundHistory("useCard", evt => get.type2(evt.card) == type).indexOf(event) == 0; + }, + getNum(player) { + return (player.countCards("ej") > 0) + player.isDamaged() + (Math.max(0, player.hp) < player.countCards("h")); + }, + content() { + "step 0"; + var cards = trigger.cards.filterInD("oe"); + player + .chooseTarget("三恇:选择一名其他角色", "令其交给你至少X张牌" + (cards.length ? ",然后其获得" + get.translation(cards) : "") + "(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)", true, lib.filter.notMe) + .set("ai", target => { + var att = get.attitude(player, target), + num = lib.skill.clansankuang.getNum(target); + if (num == 0) return att; + if (_status.event.goon) return -att; + return -Math.sqrt(Math.abs(att)) - lib.skill.clansankuang.getNum(target); + }) + .set( + "goon", + Math.max.apply( + Math, + trigger.cards.map(i => get.value(i)) + ) <= 5 || trigger.cards.filterInD("oe").length == 0 + ); + "step 1"; + if (result.bool) { + var target = result.targets[0], + num = lib.skill.clansankuang.getNum(target), + num2 = target.countCards("he"); + event.target = target; + player.logSkill("clansankuang", target); + if (num2 == 0) event._result = { bool: false }; + else if (num2 <= num) + event._result = { + bool: true, + cards: target.getCards("he"), + }; + else { + var cards = trigger.cards.filterInD("oe"); + target + .chooseCard("he", num > 0, [num, Infinity]) + .set("ai", get.unuseful) + .set("prompt", num > 0 ? "是否交给" + get.translation(player) + "任意张牌" + (cards.length ? "并获得" + get.translation(cards) : "") + "?" : "交给" + get.translation(player) + "至少" + get.cnNumber(num) + "张牌"); + } + } else event.finish(); + "step 2"; + if (result.bool) { + var cards = result.cards; + target.give(cards, player); + game.delayx(); + } else event.finish(); + "step 3"; + if (trigger.cards.filterInD().length) target.gain(trigger.cards.filterInD(), "gain2", "bySelf"); + else if (trigger.cards.filterInD("e").length) target.gain(trigger.cards.filterInD("e"), get.owner(trigger.cards.filterInD("e")[0]), "give"); + }, + ai: { + reverseOrder: true, + skillTagFilter(player) { + if (player.getHistory("useCard", evt => get.type(evt.card) == "equip").length > 0) return false; + }, + effect: { + target(card, player, target) { + if (player == target && get.type(card) == "equip" && !player.getHistory("useCard", evt => get.type(evt.card) == "equip").length == 0) return [1, 3]; + }, + }, + threaten: 1.6, + }, + }, + clanbeishi: { + audio: 2, + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter(event, player) { + var history = player.getAllHistory("useSkill", evt => evt.skill == "clansankuang"); + if (!history.length) return false; + var target = history[0].targets[0]; + if (target.countCards("h")) return false; + var evt = event.getl(target); + return evt && evt.hs && evt.hs.length; + }, + content() { + player.recover(); + }, + ai: { + combo: "clansankuang", + }, + }, + //族荀淑 + clanshenjun: { + audio: 2, + trigger: { + global: "useCard", + }, + forced: true, + locked: false, + filter(event, player) { + return (event.card.name == "sha" || get.type(event.card) == "trick") && player.countCards("h", event.card.name) > 0; + }, + content() { + var cards = player.getCards("h", trigger.card.name); + player.showCards(cards, get.translation(player) + "发动了【神君】"); + player.markSkill("clanshenjun"); + player.addGaintag(cards, "clanshenjun"); + for (var name of lib.phaseName) { + var evt = _status.event.getParent(name); + if (!evt || evt.name != name) continue; + player.addTempSkill("clanshenjun_viewAs", name + "After"); + break; + } + }, + marktext: "君", + intro: { + markcount(storage, player) { + return player.countCards("h", card => card.hasGaintag("clanshenjun")); + }, + mark(dialog, content, player) { + var cards = player.getCards("h", card => card.hasGaintag("clanshenjun")); + if (cards.length) { + dialog.addAuto(cards); + } else return "无展示牌"; + }, + }, + subSkill: { + viewAs: { + trigger: { + global: ["phaseZhunbeiEnd", "phaseJudgeEnd", "phaseDrawEnd", "phaseUseEnd", "phaseDiscardEnd", "phaseJieshuEnd"], + }, + filter(event, player) { + return player.countCards("h", card => card.hasGaintag("clanshenjun")) > 0; + }, + forced: true, + charlotte: true, + content() { + "step 0"; + var cards = player.getCards("h", card => card.hasGaintag("clanshenjun")); + var list = [], + names = []; + for (var card of cards) { + var name = get.name(card), + nature = get.nature(card); + var namex = name; + if (nature && nature.length) { + namex += nature; + if (names.includes(namex)) continue; + list.push([get.type(card), "", name, nature]); + } else { + if (names.includes(namex)) continue; + list.push([get.type(card), "", name]); + } + names.push(namex); + } + list.sort((a, b) => { + var del1 = lib.inpile.indexOf(a[2]) - lib.inpile.indexOf(b[2]); + if (del1 != 0) return del1; + var a1 = 0, + b1 = 0; + if (a.length > 3) a1 = lib.nature.get(a) || 0; + if (b.length > 3) b1 = lib.nature.get(b) || 0; + return a1 - b1; + }); + player.chooseButton(["是否将" + get.cnNumber(cards.length) + "张牌当下列一张牌使用?", [list, "vcard"]]).set("ai", function (button) { + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }); + "step 1"; + if (result.bool) { + var name = result.links[0][2], + nature = result.links[0][3]; + var cards = player.getCards("h", card => card.hasGaintag("clanshenjun")); + game.broadcastAll( + function (num, card) { + lib.skill.clanshenjun_backup.selectCard = num; + lib.skill.clanshenjun_backup.viewAs = card; + }, + cards.length, + { name: name, nature: nature } + ); + var next = player.chooseToUse(); + next.set("openskilldialog", "将" + get.cnNumber(cards.length) + "张牌当做" + (get.translation(nature) || "") + "【" + get.translation(name) + "】使用"); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "clanshenjun_backup"); + next.set("custom", { + add: {}, + replace: { window() {} }, + }); + next.backup("clanshenjun_backup"); + } + }, + }, + backup: { + filterCard(card) { + return get.itemtype(card) == "card"; + }, + position: "hes", + filterTarget: lib.filter.filterTarget, + check: card => 6 - get.value(card), + log: false, + precontent() { + delete event.result.skill; + }, + }, + }, + }, + clanbalong: { + audio: 2, + trigger: { + player: ["damageEnd", "recoverEnd", "loseHpEnd"], + }, + forced: true, + filter(event, player) { + if (game.getGlobalHistory("changeHp", evt => evt.player == player).length != 1) return false; + var cards = player.getCards("h"), + map = {}; + if (!cards.length) return false; + for (var card of cards) { + var type = get.type2(card); + if (typeof map[type] != "number") map[type] = 0; + map[type]++; + } + var list = []; + for (var i in map) { + if (map[i] > 0) list.push([i, map[i]]); + } + list.sort((a, b) => b[1] - a[1]); + return list[0][0] == "trick" && (list.length == 1 || list[0][1] > list[1][1]); + }, + content() { + player.showHandcards(get.translation(player) + "发动了【八龙】"); + player.drawTo(game.countPlayer()); + }, + }, + //族荀粲 + clanyunshen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return player != target && target.isDamaged(); + }, + content() { + "step 0"; + target.recover(); + "step 1"; + var name = get.translation(target); + player + .chooseControl() + .set("choiceList", [name + "视为对你使用一张冰【杀】", "你视为对" + name + "使用一张冰【杀】"]) + .set("prompt", "熨身:请选择一项") + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var card = { + name: "sha", + nature: "ice", + isCard: true, + }; + var eff = get.effect(player, card, target, player), + eff2 = get.effect(target, card, player, player); + if (eff > eff2) return "选项一"; + else return "选项二"; + })() + ); + "step 2"; + var players = [target, player]; + if (result.control == "选项二") players.reverse(); + var card = { name: "sha", nature: "ice", isCard: true }; + if (players[0].canUse(card, players[1], false)) players[0].useCard(card, players[1], false, "noai"); + }, + ai: { + order: 2, + expose: 0.2, + result: { + target(player, target) { + var eff = get.recoverEffect(target, player, player); + if (eff > 0) return 1; + else if ( + get.effect( + target, + { + name: "sha", + nature: "ice", + isCard: true, + }, + player, + player + ) > eff + ) + return -1; + return 0; + }, + }, + }, + }, + clanshangshen: { + audio: 2, + trigger: { global: "damageEnd" }, + filter(event, player) { + if (!event.hasNature() || !event.player.isIn()) return false; + return ( + game.countPlayer2(current => { + return current.hasHistory("damage", evt => { + return evt.hasNature() && evt != event; + }); + }) == 0 + ); + }, + logTarget: "player", + check(event, player) { + if (get.attitude(player, event.player) <= 2) return false; + if (event.player.countCards("h") >= 4) return false; + return true; + }, + content() { + player.executeDelayCardEffect("shandian"); + trigger.player.drawTo(4); + }, + ai: { expose: 0.25 }, + }, + clanfenchai: { + audio: 2, + init(player) { + if (player.getStorage("clanfenchai").length > 0) return; + var history = player.getHistory("useSkill", evt => { + if (evt.type != "player") return false; + var skill = evt.sourceSkill || evt.skill, + targets = evt.targets; + var info = get.info(skill); + if (!info || info.charlotte) return false; + if (targets && targets.length) { + if (targets.filter(i => player.differentSexFrom(i)).length > 0) return true; + } + return false; + }); + if (history.length) { + var evt = history[0], + targets = evt.targets; + player.markAuto( + "clanfenchai", + targets.filter(i => player.differentSexFrom(i)) + ); + } + }, + trigger: { + player: ["logSkill", "useSkillAfter"], + }, + forced: true, + silent: true, + onremove: true, + marktext: "钗", + intro: { + content: (storage, player) => "对象:" + get.translation(storage), + }, + group: "clanfenchai_audio", + filter(event, player) { + if (event.type != "player") return false; + var targets = event.targets; + if (!targets || !targets.length) return false; + var info = get.info(event.sourceSkill || event.skill); + if (!info || info.charlotte) return false; + if (player.getStorage("clanfenchai").length != 0) return false; + return targets.filter(i => player.differentSexFrom(i)).length > 0; + }, + content() { + player.markAuto( + "clanfenchai", + trigger.targets.filter(i => player.differentSexFrom(i)) + ); + }, + subSkill: { + audio: { + audio: "clanfenchai", + forced: true, + trigger: { player: "judge" }, + filter(event, player) { + return player.getStorage("clanfenchai").length; + }, + content() {}, + }, + }, + mod: { + suit(card, suit) { + var player = get.owner(card) || _status.event.player; + if (!player || !player.judging || player.judging[0] != card) return; + var storage = player.getStorage("clanfenchai"); + if (!storage.length) return; + return storage.filter(i => i.isIn()).length > 0 ? "heart" : "spade"; + }, + }, + }, + //族荀采 + clanlieshi: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return !player.isDisabledJudge() || player.countCards("h", card => ["sha", "shan"].includes(get.name(card))) > 0; + }, + chooseButton: { + dialog(event, player) { + var dialog = ui.create.dialog("烈誓:选择一项", "hidden"); + dialog.add([lib.skill.clanlieshi.choices.slice(), "textbutton"]); + return dialog; + }, + filter(button, player) { + var link = button.link; + if (link == "damage") return !player.isDisabledJudge(); + var num = player.countCards("h", link); + return num > 0 && num == player.getDiscardableCards(player, "h").filter(i => get.name(i) == link).length; + }, + check(button) { + var player = _status.event.player; + switch (button.link) { + case "damage": + if (get.damageEffect(player, player, player, "fire") >= 0) return 10; + if (player.hp >= Math.max(2, 3 - player.getFriends().length) && game.countPlayer(current => get.attitude(player, current) < 0 && current.countCards("h", card => ["sha", "shan"].includes(get.name(card))))) return 0.8 + Math.random(); + return 0; + case "shan": + if (player.countCards("h", "shan") == 1) return 8 + Math.random(); + return 1 + Math.random(); + case "sha": + if (player.countCards("h", "sha") == 1) return 8 + Math.random(); + return 0.9 + Math.random(); + } + }, + backup(links) { + var next = get.copy(lib.skill["clanlieshi_backupx"]); + next.choice = links[0]; + return next; + }, + prompt(links) { + if (links[0] == "damage") return "废除判定区并受到1点火焰伤害"; + return "弃置所有【" + get.translation(links[0]) + "】"; + }, + }, + choices: [ + ["damage", "废除判定区并受到1点火焰伤害"], + ["shan", "弃置所有【闪】"], + ["sha", "弃置所有【杀】"], + ], + ai: { + order(item, player) { + if (!player) return; + var eff = get.damageEffect(player, player, player, "fire"), + disabled = !player.isDisabledJudge(); + if ((player.countCards("h", "sha") == 1 || player.countCards("h", "shan") == 1) && eff < 0 && !disabled) return 8; + else if (eff >= 0 && !disabled) return 5.8; + if (!disabled && !player.countCards("h", card => ["sha", "shan"].includes(get.name(card)))) { + if ((!player.hasSkill("clanhuanyin") || !player.canSave(player)) && player.hp <= 1) return 0; + if (player.canSave(player) && player.hp == 1 && player.countCards("h") <= 1) return 2.6; + if (player.hp < Math.max(2, 3 - player.getFriends().length) || !game.countPlayer(current => get.attitude(player, current) < 0 && current.countCards("h", card => ["sha", "shan"].includes(get.name(card))))) return 0; + } + return 2.5; + }, + expose: 0.2, + result: { player: 1 }, + }, + subSkill: { + backup: {}, + backupx: { + audio: "clanlieshi", + selectCard: -1, + selectTarget: -1, + filterCard: () => false, + filterTarget: () => false, + multitarget: true, + content() { + "step 0"; + var choice = lib.skill.clanlieshi_backup.choice; + event.choice = choice; + if (choice == "damage") { + player.damage("fire"); + if (!player.isDisabledJudge()) player.disableJudge(); + } else { + var cards = player.getCards("h", choice); + if (cards.length) player.discard(cards); + } + "step 1"; + if (!player.isIn() || !game.hasPlayer(current => current != player)) event.finish(); + else + player.chooseTarget("烈誓:令一名其他角色选择另一项", lib.filter.notMe, true).set("ai", target => { + var player = _status.event.player, + chosen = _status.event.getParent().choice, + att = get.attitude(player, target); + if (chosen == "damage") { + if (att > 0) return 0; + return -att / 2 + target.countCards("h", card => ["sha", "shan"].includes(get.name(card))); + } + return get.damageEffect(target, player, player, "fire"); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "fire"); + var list = [], + choice = event.choice; + var choiceList = lib.skill.clanlieshi.choices.slice(); + choiceList = choiceList.map((link, ind, arr) => { + link = link[1]; + var ok = true; + if (arr[ind][0] == choice) { + link += "(" + get.translation(player) + "已选)"; + ok = false; + } + if (ind == 0) { + if (target.isDisabledJudge()) ok = false; + } else if (ind > 0) { + var name = ind == 1 ? "shan" : "sha"; + if (!target.countCards("h", name)) ok = false; + } + if (!ok) link = '' + link + ""; + else list.push("选项" + get.cnNumber(ind + 1, true)); + return link; + }); + if (!list.length) { + game.log(target, "没有能执行的选项"); + event.finish(); + return; + } + target + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", () => { + var controls = _status.event.controls.slice(), + player = _status.event.player, + user = _status.event.getParent().player; + if (controls.length == 1) return controls[0]; + if (controls.includes("选项一") && get.damageEffect(player, user, player, "fire") >= 0) return "选项一"; + if (controls.includes("选项一") && player.hp <= 2 && player.countCards("h", card => ["sha", "shan"].includes(get.name(card))) <= 3) controls.remove("选项一"); + if (controls.length == 1) return controls[0]; + if (player.getCards("h", "sha").reduce((p, c) => p + get.value(c, player), 0) > player.getCards("h", "sha").reduce((p, c) => p + get.value(c, player), 0)) { + if (controls.includes("选项三")) return "选项三"; + } else if (controls.includes("选项二")) return "选项二"; + return controls.randomGet(); + }); + } else event.finish(); + "step 3"; + if (result.control == "选项一") { + if (!target.isDisabledJudge()) target.disableJudge(); + target.damage("fire"); + } else { + var cards = target.getCards("h", result.control == "选项二" ? "shan" : "sha"); + if (cards.length) target.discard(cards); + } + }, + }, + }, + }, + clandianzhan: { + audio: 2, + intro: { + content: "已使用过的花色:$", + onunmark: true, + }, + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + if (!lib.suit.includes(get.suit(event.card))) return false; + const suit = get.suit(event.card); + if (player.getRoundHistory("useCard", evt => get.suit(evt.card) == suit).indexOf(event) != 0) return false; + return (event.targets && event.targets.length == 1 && !event.targets[0].isLinked()) || player.hasCard(card => get.suit(card) == get.suit(event.card) && player.canRecast(card), "h"); + }, + content() { + "step 0"; + if (trigger.targets && trigger.targets.length == 1 && !trigger.targets[0].isLinked()) { + trigger.targets[0].link(true); + event.link = true; + } + var cards = player.getCards("h", card => get.suit(card) == get.suit(trigger.card) && player.canRecast(card)); + if (cards.length > 0) { + player.recast(cards); + event.recast = true; + } + "step 1"; + if (event.link && event.recast) player.draw(); + }, + group: "clandianzhan_count", + subSkill: { + count: { + charlotte: true, + trigger: { player: "useCardAfter" }, + filter(event, player) { + let suit = get.suit(event.card); + return lib.suits.includes(suit) && !player.getStorage("clandianzhan").includes(suit); + }, + forced: true, + silent: true, + content() { + let suits = player + .getRoundHistory("useCard", evt => { + return lib.suits.includes(get.suit(evt.card)); + }) + .reduce((list, evt) => { + return list.add(get.suit(evt.card)); + }, []) + .sort((a, b) => lib.suits.indexOf(a) - lib.suits.indexOf(b)); + if (!player.storage.clandianzhan) { + player.when({ global: "roundStart" }).then(() => { + delete player.storage.clandianzhan; + player.unmarkSkill("clandianzhan"); + }); + } + player.storage.clandianzhan = suits; + player.markSkill("clandianzhan"); + }, + }, + }, + init(player) { + let suits = player + .getRoundHistory("useCard", evt => { + return lib.suits.includes(get.suit(evt.card)); + }) + .reduce((list, evt) => { + return list.add(get.suit(evt.card)); + }, []) + .sort((a, b) => lib.suits.indexOf(a) - lib.suits.indexOf(b)); + if (suits.length) { + if (!player.storage.clandianzhan) { + player.when({ global: "roundStart" }).then(() => { + delete player.storage.clandianzhan; + player.unmarkSkill("clandianzhan"); + }); + } + player.storage.clandianzhan = suits; + player.markSkill("clandianzhan"); + } + }, + }, + clanhuanyin: { + audio: 2, + trigger: { player: "dying" }, + forced: true, + check: () => true, + filter(event) { + return event.player.countCards("h") < 4; + }, + content() { + player.drawTo(4); + }, + }, + clandaojie: { + audio: 2, + audioname: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou"], + trigger: { player: "useCardAfter" }, + filter(event, player) { + return ( + get.type(event.card, null, false) == "trick" && + !get.tag(event.card, "damage") && + event.cards.filterInD().length > 0 && + player + .getHistory("useCard", evt => { + return get.type(evt.card, null, false) == "trick" && !get.tag(evt.card, "damage"); + }) + .indexOf(event) == 0 + ); + }, + forced: true, + clanSkill: true, + content() { + "step 0"; + var skills = player.getSkills(null, false, false).filter(skill => { + var info = get.info(skill); + if (!info || info.charlotte || !get.is.locked(skill) || get.skillInfoTranslation(skill, player).length == 0) return false; + return true; + }); + player + .chooseControl(skills, "cancel2") + .set( + "choiceList", + skills.map(i => { + return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; + }) + ) + .set("displayIndex", false) + .set("prompt", "蹈节:失去一个锁定技,或点“取消”失去1点体力") + .set("ai", () => { + var player = _status.event.player, + choices = _status.event.controls.slice(); + var negs = choices.filter(i => { + var info = get.info(i); + if (!info || !info.ai) return false; + return info.ai.neg || info.ai.halfneg; + }); + if (negs.length) return negs.randomGet(); + if (get.effect(player, { name: "losehp" }, player, player) >= 0) return "cancel2"; + if (player.hp > 3) return "cancel2"; + return Math.random() < 0.75 ? "clandaojie" : choices.randomGet(); + }); + "step 1"; + if (result.control != "cancel2") { + player.removeSkills(result.control); + } else { + player.loseHp(); + } + "step 2"; + var targets = game.filterPlayer(current => current == player || current.hasClan("颍川荀氏")); + if (targets.length == 1) event._result = { bool: true, targets: targets }; + else + player + .chooseTarget("蹈节:将" + get.translation(trigger.cards.filterInD()) + "交给一名颍川荀氏角色", true, (card, player, target) => { + return target == player || target.hasClan("颍川荀氏"); + }) + .set("ai", target => get.attitude(_status.event.player, target)); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(trigger.cards.filterInD(), player, "gain2"); + } + }, + }, + //族吴班 + clanzhanding: { + audio: 2, + enable: "chooseToUse", + viewAsFilter(player) { + return player.countCards("hes") > 0; + }, + viewAs: { name: "sha" }, + filterCard: true, + position: "hes", + selectCard: [1, Infinity], + check(card) { + return 6 - ui.selected.cards.length - get.value(card); + }, + onuse(links, player) { + lib.skill.chenliuwushi.change(player, -1); + player.addTempSkill("clanzhanding_effect"); + }, + ai: { + order: 1, + respondSha: true, + skillTagFilter(player) { + return player.countCards("hes") > 0; + }, + }, + subSkill: { + effect: { + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "clanzhanding"; + }, + content() { + if ( + player.hasHistory("sourceDamage", function (evt) { + return evt.card == trigger.card; + }) + ) { + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + if (num1 < num2) player.draw(Math.min(5, num2 - num1)); + } else if (trigger.addCount !== false) { + trigger.addCount = false; + player.getStat().card.sha--; + } + }, + }, + }, + }, + //族吴苋 + clanyirong: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter(event, player) { + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + return num1 != num2; + }, + selectCard() { + var player = _status.event.player; + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + if (num1 > num2) return num1 - num2; + return [0, 1]; + }, + filterCard(card, player) { + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + return num1 > num2; + }, + check(card) { + var player = _status.event.player; + if ( + player.countCards("h", function (card) { + return lib.skill.clanyirong.checkx(card) > 0; + }) + + 1 < + player.countCards("h") - player.getHandcardLimit() + ) + return 0; + return lib.skill.clanyirong.checkx(card); + }, + checkx(card) { + var num = 1; + if (_status.event.player.getUseValue(card, null, true) <= 0) num = 1.5; + return (15 - get.value(card)) * num; + }, + prompt() { + var player = _status.event.player; + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + var str = ''; + if (num1 > num2) { + str += "弃置" + get.cnNumber(num1 - num2) + "张牌,然后手牌上限+1。"; + } else { + str += "摸" + get.cnNumber(Math.min(8, num2 - num1)) + "张牌,然后手牌上限-1。"; + } + str += "
    ※当前手牌上限:" + num2; + var num3 = (_status.event.getParent().phaseIndex || 0) + 1; + if (num3 > 0) { + str += ";阶段数:" + num3; + } + str += "
    "; + return str; + }, + content() { + "step 0"; + if (cards.length) { + lib.skill.chenliuwushi.change(player, 1); + event.finish(); + } else { + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + if (num1 < num2) player.draw(Math.min(8, num2 - num1)); + } + "step 1"; + lib.skill.chenliuwushi.change(player, -1); + }, + ai: { + order(item, player) { + var num = player.getHandcardLimit(), + numx = (_status.event.getParent().phaseIndex || 0) + 1; + if (num == 5 && numx == 4 && player.getStat("skill").clanyirong) return 0; + if (player.countCards("h") == num + 1 && num != 2 && (num <= 4 || (num > 4 && numx > 4))) return 10; + return 0.5; + }, + result: { player: 1 }, + threaten: 5, + }, + }, + clanguixiang: { + audio: 2, + trigger: { + player: "phaseChange", + }, + forced: true, + filter(event, player) { + if (event.phaseList[event.num].startsWith("phaseUse")) return false; + var num1 = player.getHandcardLimit() - 1, + num2 = event.num; + return num1 == num2; + }, + content() { + trigger.phaseList[trigger.num] = "phaseUse|clanguixiang"; + game.delayx(); + }, + }, + clanmuyin: { + audio: 2, + clanSkill: true, + audioname: ["clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"], + trigger: { player: "phaseBegin" }, + isMax(player) { + var num = player.getHandcardLimit(); + return !game.hasPlayer(function (current) { + return current != player && current.getHandcardLimit() > num; + }); + }, + filter(event, player) { + return game.hasPlayer(function (current) { + return (current == player || current.hasClan("陈留吴氏")) && !lib.skill.clanmuyin.isMax(current); + }); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt("clanmuyin"), "令一名陈留吴氏角色的手牌上限+1", function (card, player, current) { + return (current == player || current.hasClan("陈留吴氏")) && !lib.skill.clanmuyin.isMax(current); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("clanmuyin", target); + lib.skill.chenliuwushi.change(target, 1); + game.delayx(); + } + }, + }, + chenliuwushi: { + charlotte: true, + change(player, num) { + player.addSkill("chenliuwushi"); + var info = player.storage; + if (typeof info.chenliuwushi != "number") info.chenliuwushi = 0; + info.chenliuwushi += num; + if (info.chenliuwushi == 0) player.unmarkSkill("chenliuwushi"); + else player.markSkill("chenliuwushi"); + if (num >= 0) game.log(player, "的手牌上限", "#y+" + num); + else game.log(player, "的手牌上限", "#g" + num); + }, + mod: { + maxHandcard(player, num) { + var add = player.storage.chenliuwushi; + if (typeof add == "number") return num + add; + }, + }, + markimage: "image/card/handcard.png", + intro: { + content(num, player) { + var str = "
  • 手牌上限"; + if (num >= 0) str += "+"; + str += num; + str += "
  • 当前手牌上限:"; + str += player.getHandcardLimit(); + return str; + }, + }, + }, +}; + +export default skills; diff --git a/character/clan/sort.js b/character/clan/sort.js new file mode 100644 index 000000000..0ded4e529 --- /dev/null +++ b/character/clan/sort.js @@ -0,0 +1,17 @@ +const characterSort = { + clan_wu: ["clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"], + clan_xun: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou"], + clan_han: ["clan_hanshao", "clan_hanrong"], + clan_wang: ["clan_wangling", "clan_wangyun", "clan_wanghun", "clan_wanglun", "clan_wangguang", "clan_wangmingshan"], + clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu", "clan_zhongyao"], +}; + +const characterSortTranslate = { + clan_wu: "陈留·吴氏", + clan_xun: "颍川·荀氏", + clan_han: "颍川·韩氏", + clan_wang: "太原·王氏", + clan_zhong: "颍川·钟氏", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/clan/translate.js b/character/clan/translate.js new file mode 100644 index 000000000..55a6ef3f6 --- /dev/null +++ b/character/clan/translate.js @@ -0,0 +1,136 @@ +const translates = { + clan_wuxian_prefix: "族", + clan_wuban_prefix: "族", + clan_xunshu_prefix: "族", + clan_xunchen_prefix: "族", + clan_xuncai_prefix: "族", + clan_xuncan_prefix: "族", + clan_hanshao_prefix: "族", + clan_hanrong_prefix: "族", + clan_wukuang_prefix: "族", + clan_wangling_prefix: "族", + clan_zhongyan_prefix: "族", + clan_wangyun_prefix: "族", + clan_wanghun_prefix: "族", + clan_zhonghui_prefix: "族", + clan_zhongyu_prefix: "族", + clan_wanglun_prefix: "族", + clan_xunyou_prefix: "族", + clan_wuqiao_prefix: "族", + + clan_wuxian: "族吴苋", + clanyirong: "移荣", + clanyirong_info: "出牌阶段限两次。若你的手牌数:小于X,则你可以将手牌摸至X张(至多摸八张),然后X-1;大于X,则你可以将手牌弃置至X张,然后X+1。(X为你的手牌上限)", + clanguixiang: "贵相", + clanguixiang_info: "锁定技。你的非出牌阶段开始前,若此阶段即将成为你本回合内的第X个阶段(X为你的手牌上限),则你终止此阶段,改为进行一个出牌阶段。", + clanmuyin: "穆荫", + clanmuyin_info: "宗族技。回合开始时,你可以选择一名手牌上限不为全场最多的陈留吴氏角色。该角色的手牌上限+1。", + chenliuwushi: "陈留·吴氏", + clan_wuban: "族吴班", + clanzhanding: "斩钉", + clanzhanding_info: "你可以将任意张牌当做【杀】使用并你令你的手牌上限-1。你以此法使用的【杀】结算结束后,若你因此【杀】造成过伤害,则你将手牌摸至手牌上限(至多摸五张),否则你令此【杀】不计入次数限制。", + clan_xunshu: "族荀淑", + clanshenjun: "神君", + clanshenjun_info: "当一名角色使用【杀】或普通锦囊牌时,若你手牌中有该牌名的牌,你展示之,且这些牌称为“神君”。然后本阶段结束时,你可以将等同于你“神君”数张牌当做一张“神君”牌使用。", + clanbalong: "八龙", + clanbalong_info: "锁定技。当你于一回合内首次{回复体力后或受到伤害后或失去体力后},若你手牌中唯一最多的类别为锦囊牌,你展示所有手牌并摸至角色数张。", + clandaojie: "蹈节", + clandaojie_info: "宗族技,锁定技。当你每回合第一次使用非伤害类普通锦囊牌后,你须失去一个锁定技或失去1点体力,令一名颍川荀氏角色获得此牌对应的所有实体牌。", + clan_xuncai: "族荀采", + clanlieshi: "烈誓", + clanlieshi_info: "出牌阶段,你可以选择一项:1.废除判定区并受到你造成的1点火焰伤害;2.弃置所有【闪】;3.弃置所有【杀】。然后令一名其他角色从你未选择的选项中选择一项。", + clandianzhan: "点盏", + clandianzhan_info: "锁定技。当你每轮第一次使用一种花色的牌后:若此牌的目标数为1且目标未横置,你横置此牌目标;若你有此花色的手牌,你重铸这些牌。均执行后你摸一张牌。", + clanhuanyin: "还阴", + clanhuanyin_info: "锁定技。当你进入濒死状态时,将手牌补至四张。", + clan_xunchen: "族荀谌", + clansankuang: "三恇", + clansankuang_info: "锁定技。当你每轮第一次使用一种类别的牌后,你令一名其他角色交给你至少X张牌,然后于装备区或处理区内获得你使用的牌对应的所有实体牌(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)。", + clanbeishi: "卑势", + clanbeishi_info: "锁定技。当一名角色失去最后的手牌后,若其是你首次发动〖三恇〗的目标角色,你回复1点体力。", + clan_xuncan: "族荀粲", + clanyunshen: "熨身", + clanyunshen_info: "出牌阶段限一次。你可以令一名其他角色回复1点体力,然后选择一项:1.你视为对其使用一张冰【杀】;2.其视为对你使用一张冰【杀】。", + clanshangshen: "伤神", + clanshangshen_info: "当一名角色受到属性伤害后,若本回合此前没有角色或已死亡的角色受到过属性伤害,你可以执行目标角色为你的【闪电】效果,然后其将手牌摸至四张。", + clanfenchai: "分钗", + clanfenchai_info: "锁定技。若你首次发动技能指定的异性目标角色中:存在存活角色,你的判定牌视为♥;不存在存活角色,你的判定牌视为♠。", + clan_hanshao: "族韩韶", + clanfangzhen: "放赈", + clanfangzhen_info: "出牌阶段开始时,你可以横置一名角色并选择一项:1.摸两张牌,然后交给其两张牌;2.令其回复1点体力。然后第X轮游戏开始时,你失去〖放赈〗(X为其座位号)。", + clanliuju: "留驹", + clanliuju_info: "出牌阶段结束时,你可以与一名角色A拼点,输的角色可以使用任意张拼点牌中的非基本牌。然后若你至A的距离或A至你的距离发生了变化,你重置〖恤民〗。", + clanxumin: "恤民", + clanxumin_info: "宗族技,限定技。你可以将一张牌当做【五谷丰登】对任意名其他角色使用。", + clan_hanrong: "族韩融", + clanlianhe: "连和", + clanlianhe_info: "出牌阶段开始时,你可以横置两名角色。这些角色于自己的下个出牌阶段结束时,若其此阶段未摸牌,其令你摸X+1张牌或交给你X-1张牌(X为其此阶段获得的牌数且至多为3)。", + clanhuanjia: "缓颊", + clanhuanjia_info: "出牌阶段结束时,你可以与一名角色拼点。赢的角色可以使用一张拼点牌。然后若此牌:未造成过伤害,你获得另一张拼点牌;造成过伤害,你失去一个技能。", + clan_wukuang: "族吴匡", + clanlianzhu: "联诛", + clanlianzhu_info: "转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色相同,则你的手牌上限+1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色不同,则你的手牌上限-1。", + clan_wangling: "族王淩", + clanbolong: "驳龙", + clanbolong_info: "出牌阶段限一次。你可以令一名其他角色选择一项:1.你交给其一张牌,然后视为对其使用一张雷【杀】;2.交给你等同于你手牌数的牌,然后视为对你使用一张【酒】。", + clanzhongliu: "中流", + clanzhongliu_info: "宗族技,锁定技。当你使用牌时,若此牌对应的实体牌均不为太原王氏角色的手牌,你重置武将牌上的技能。", + clan_zhongyan: "族钟琰", + clanguangu: "观骨", + clanguangu_info: "转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。", + clanxiaoyong: "啸咏", + clanxiaoyong_info: "锁定技。当你于回合内首次使用字数为X的牌时,你重置〖观骨〗(X为你上次发动〖观骨〗观看的牌数)。", + clanbaozu: "保族", + clanbaozu_info: "宗族技,限定技。当一名颍川钟氏角色进入濒死状态时,你可以令其横置并回复1点体力。", + clan_wangyun: "族王允", + clanjiexuan: "解悬", + clanjiexuan_info: "限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。", + clanmingjie: "铭戒", + clanmingjie_info: "限定技。出牌阶段,你可以选择一名角色,然后你获得此下效果:①你使用牌时你可以指定其为额外目标直到其下个回合结束。②其下个回合结束时(若该角色为你则改为你的下下个回合结束时),你可以使用本回合使用过的黑桃牌和被抵消过的牌。", + clan_wanghun: "族王浑", + clanfuxun: "抚循", + clanfuxun_info: "出牌阶段限一次。你可以获得或交给一名其他角色一张手牌,然后若其手牌数与你相等且于此阶段仅以此法获得或失去过牌,你可以将一张牌当任意基本牌使用。", + clanchenya: "沉雅", + clanchenya_info: "当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其手牌数)。", + clan_zhonghui: "族钟会", + clanyuzhi: "迂志", + clanyuzhi_info: "锁定技。新的一轮开始时,你依次执行以下项:①你弃置上一轮因〖迂志〗展示的手牌,然后若你上一轮使用的牌数或你上上轮因〖迂志〗摸的牌数小于你上轮因〖迂志〗摸的牌数,你受到1点雷属性伤害或失去〖保族〗。②你展示一张手牌,然后摸X张牌(X为此牌牌名字数)。", + clanxieshu: "挟术", + clanxieshu_info: "当你因牌造成或受到伤害后,你可以横置武将牌并弃置Y张牌,然后摸你已损失体力值张牌(Y为此牌牌名字数)。若本回合有角色进入过濒死状态,则〖挟术〗于本回合失效。", + clan_zhongyu: "族钟毓", + clanjiejian: "捷谏", + clanjiejian_info: "当你于一回合使用第X张牌指定第一个目标后,若此牌不为装备牌,则你可以令一名目标角色摸X张牌。(X为此牌牌名字数)", + clanhuanghan: "惶汗", + clanhuanghan_info: "当你受到牌造成的伤害后,你可以摸X张牌并弃置Y张牌(X为此牌牌名字数,Y为你已损失的体力值),然后若此次技能发动不为你本回合首次发动此技能,你重置技能〖保族〗。", + clan_wanglun: "族王沦", + clanqiuxin: "求心", + clanqiuxin_info: "出牌阶段限一次,你可以令一名其他角色选择一项:①你对其使用【杀】;②你对其使用任意普通锦囊牌。当你执行其选择的选项后,你视为执行另一项。", + clanjianyuan: "简远", + clanjianyuan_info: "当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其本阶段的使用牌数)。", + clan_xunyou: "族荀攸", + clanbaichu: "百出", + clanbaichu_info: "锁定技,当你使用一张牌结算完毕后,若你:未记录过此牌的花色和类型组合,则你记录此组合并记录一个普通锦囊牌名,否则你于本轮获得技能〖奇策〗;已记录此牌牌名,你回复1点体力或摸一张牌。", + clan_wuqiao: "族吴乔", + clanqiajue: "跒倔", + clanqiajue_info: "摸牌阶段开始时,你可以弃置一张黑色牌。若如此做,此阶段结束时,你展示手牌,若这些牌的点数和大于30,你的手牌上限-2,否则你执行一个额外的摸牌阶段。", + clan_wangguang: "族王广", + clan_wangguang_prefix: "族", + clanlilun: "离论", + clanlilun_info: "出牌阶段限一次,你可以重铸两张手牌(不能是你本回合以此法重铸过的牌名的牌),然后使用其中的一张牌。", + clanjianji: "见机", + clanjianji_info: "限定技,一名角色的结束阶段,若其上下家均未于本回合:使用过牌,则你可以与其各摸一张牌;成为过牌的目标,则你可以视为使用一张【杀】。", + clan_wangmingshan: "族王明山", + clan_wangmingshan_prefix: "族", + clantanque: "弹雀", + clantanque_info: "每回合限一次。当你使用牌结算结束后,你可以对一名体力值为X且不为0的角色造成1点伤害(X为此牌点数与你上一张使用的牌的点数之差)。", + clanshengmo: "剩墨", + clanshengmo_info: "当你需要使用一张未以此法使用过的基本牌时,你可以获得一张于本回合进入弃牌堆且点数不为这些牌中最大且不为这些牌中最小的牌,视为你使用需要使用的牌。", + clan_zhongyao: "族钟繇", + clan_zhongyao_prefix: "族", + clanchengqi: "承启", + clanchengqi_info: "你可以将至少两张手牌当作本回合未以此法转换过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。", + clanjieli: "诫厉", + clanjieli_info: "结束阶段,你可以选择一名角色,你观看其手牌中牌名字数最多的牌和牌堆顶的X张牌,然后你可以交换其中的任意张牌(X为你本回合使用过的牌中的牌名字数最大值)。", +}; + +export default translates; diff --git a/character/clan/voices.js b/character/clan/voices.js new file mode 100644 index 000000000..dd6a012d4 --- /dev/null +++ b/character/clan/voices.js @@ -0,0 +1,136 @@ +export default { + "#clanyirong1": "花开彼岸,繁荣不减当年。", + "#clanyirong2": "移花接木,花容更胜从前。", + "#clanguixiang1": "女相显贵,凤仪从龙。", + "#clanguixiang2": "正官七杀,天生富贵。", + "#clanmuyin_clan_wuxian1": "吴门隆盛,闻钟而鼎食。", + "#clanmuyin_clan_wuxian2": "吴氏一族,感明君青睐。", + "#clan_wuxian:die": "玄德东征,何日归还?", + "#clanzhanding1": "汝颈硬,比之金铁何如?", + "#clanzhanding2": "魍魉鼠辈,速速系颈伏首!", + "#clanmuyin_clan_wuban1": "世代佐忠义,子孙何绝焉?", + "#clanmuyin_clan_wuban2": "祖训秉心,其荫何能薄也?", + "#clan_wuban:die": "无胆鼠辈,安敢暗箭伤人……", + "#clanshenjun1": "区区障眼之法,难遮神人之目。", + "#clanshenjun2": "我以天地为师,自可道法自然。", + "#clanbalong1": "八龙之蜿蜿,云旗之委蛇。", + "#clanbalong2": "穆王乘八牡,天地恣遨游。", + "#clandaojie_clan_xunshu1": "荀人如玉,向节而生。", + "#clandaojie_clan_xunshu2": "竹有其节,焚之不改。", + "#clan_xunshu:die": "天下陆沉,荀氏难支……", + "#clansankuang1": "人言可畏,宜常辟之。", + "#clansankuang2": "天地可敬,可常惧之。", + "#clanbeishi1": "虎卑其势,将有所逮。", + "#clanbeishi2": "至山穷水尽,复柳暗花明。", + "#clandaojie_clan_xunchen1": "此生所重者,慷慨之节也。", + "#clandaojie_clan_xunchen2": "愿以此身,全清尚之节。", + "#clan_xunchen:die": "行二臣之为,羞见列祖……", + "#clanlieshi1": "拭刃为誓,女无二夫。", + "#clanlieshi2": "霜刃证言,宁死不贰。", + "#clandianzhan1": "此灯如我,独向光明。", + "#clandianzhan2": "此间皆暗,唯灯瞩明。", + "#clanhuanyin1": "且将此身,还于阴氏。", + "#clanhuanyin2": "生不得同户,死可葬同穴乎?", + "#clandaojie_clan_xuncai1": "女子有节,宁死蹈之。", + "#clandaojie_clan_xuncai2": "荀氏三纲,死不贰嫁。", + "#clan_xuncai:die": "苦难已过,世间大好……", + "#clanyunshen1": "此心恋卿,尽融三九之冰。", + "#clanyunshen2": "寒梅傲雪,馥郁三尺之香。", + "#clanshangshen1": "识字数万,此痛无字可言。", + "#clanshangshen2": "吾妻已逝,吾心悲怆。", + "#clanfenchai1": "钗同我心,奈何分之?", + "#clanfenchai2": "夫妻分钗,天涯陌路。", + "#clandaojie_clan_xuncan1": "君子持节,何移情乎?", + "#clandaojie_clan_xuncan2": "我心慕鸳,从一而终。", + "#clan_xuncan:die": "此钗,今日可合乎?", + "#clanfangzhen1": "百姓罹灾,当施粮以赈。", + "#clanfangzhen2": "开仓放粮,以赈灾民。", + "#clanliuju1": "乡老十里相送,此驹可彰吾情。", + "#clanliuju2": "当逐千里之驹,情深可留嬴城。", + "#clanxumin_clan_hanshao1": "民者,居野而多艰,不可不恤。", + "#clanxumin_clan_hanshao2": "天下之本,上为君,下为民。", + "#clan_hanshao:die": "天地不仁,万物何辜……", + "#clanlianhe1": "枯草难存于劲风,唯抱簇得生。", + "#clanlianhe2": "吾所来之由,一为好,二为和。", + "#clanhuanjia1": "我之所言,皆为君好。", + "#clanhuanjia2": "吾言之切切,请君听之。", + "#clanxumin_clan_hanrong1": "江海陆沉,皆为黎庶之泪。", + "#clanxumin_clan_hanrong2": "天下汹汹,百姓何辜?", + "#clan_hanrong:die": "天下兴亡,皆苦百姓……", + "#clanlianzhu1": "奸宦作乱,当联兵伐之。", + "#clanlianzhu2": "尽诛贼常侍,正在此时。", + "#clanmuyin_clan_wukuang1": "家有贵女,其德泽三代。", + "#clanmuyin_clan_wukuang2": "吾家当以此女而兴之。", + "#clan_wukuang:die": "孟德何在?本初何在?", + "#clanbolong1": "驳者,食虎之兽焉,可摄冢虎。", + "#clanbolong2": "主上暗弱,当另择明主侍之。", + "#clanzhongliu_clan_wangling1": "王门世代骨鲠,皆为国之柱石。", + "#clanzhongliu_clan_wangling2": "行舟至中流而遇浪,大风起兮。", + "#clan_wangling:die": "淩忠心可鉴,死亦未悔……", + "#clanguangu1": "此才拔萃,然观其形骨,恐早夭。", + "#clanguangu2": "绯衣者,汝所拔乎?", + "#clanxiaoyong1": "凉风萧条,露沾我衣。", + "#clanxiaoyong2": "忧来多方,慨然永怀。", + "#clanbaozu_clan_zhongyan1": "好女宜家,可度大厄。", + "#clanbaozu_clan_zhongyan2": "宗族有难,当施以援手。", + "#clan_zhongyan:die": "此间天下人,皆分一斗之才……", + "#clanjiexuan1": "允不才,愿以天下苍生为己任。", + "#clanjiexuan2": "愿以此躯为膳,饲天下以太平。", + "#clanmingjie1": "大公至正,恪忠义于国。", + "#clanmingjie2": "此生柱国之志,铭恪于胸。", + "#clanzhongliu_clan_wangyun1": "国朝汹汹如涌,当如柱石镇之。", + "#clanzhongliu_clan_wangyun2": "砥中流之柱,其舍我复谁?", + "#clan_wangyun:die": "获罪于君,当伏大辟以谢天下……", + "#clanfuxun1": "东吴遗民惶惶,宜抚而不宜罚。", + "#clanfuxun2": "江东新附,不可以严法度之。", + "#clanchenya1": "喜怒不现于形,此为执中之道。", + "#clanchenya2": "胸有万丈之海,故而波澜不惊。", + "#clanzhongliu_clan_wanghun1": "国潮汹涌,当为中流之砥柱。", + "#clanzhongliu_clan_wanghun2": "执剑斩巨浪,息风波者出我辈。", + "#clan_wanghun:die": "灭国之功本属我,奈何枉作他人衣……", + "#clanyuzhi1": "我欲行夏禹旧事,为天下人。", + "#clanyuzhi2": "汉鹿已失,魏牛犹在,吾欲执其耳。", + "#clanxieshu1": "今长缨在手,欲问鼎九州。", + "#clanxieshu2": "我有佐国之术,可缚苍龙。", + "#clanbaozu_clan_zhonghui1": "不为刀下脍,且做俎上刀。", + "#clanbaozu_clan_zhonghui2": "吾族恒大,谁敢欺之?", + "#clan_zhonghui:die": "谋事在人,成事在天……", + "#clanjiejian1": "庙胜之策,不临矢石。", + "#clanjiejian2": "王者之兵,有征无战。", + "#clanhuanghan1": "居天子阶下,故诚惶诚恐。", + "#clanhuanghan2": "战战惶惶,汗出如浆。", + "#clanbaozu_clan_zhongyu1": "弟会腹有恶谋,不可不防。", + "#clanbaozu_clan_zhongyu2": "会期大祸将至,请晋公恕之。", + "#clan_zhongyu:die": "百年钟氏,一朝为尘矣……", + "#clanqiuxin1": "此生所求者,顺心意尔。", + "#clanqiuxin2": "羡孔丘知天命之岁,叹吾生之不达。", + "#clanjianyuan1": "我视天地为三,其为众妙之门。", + "#clanjianyuan2": "昔年孔明有言,宁静方能致远。", + "#clanzhongliu_clan_wanglun1": "上善若水,中流而引全局。", + "#clanzhongliu_clan_wanglun2": "泽物无声,此真名士风流。", + "#clan_wanglun:die": "人间多锦绣,奈何我云不喜……", + "#clanbaichu1": "腹有经纶,到用时施无穷之计。", + "#clanbaichu2": "胸纳甲兵,烽烟起可靖疆晏海。", + "#clandaojie_clan_xunyou1": "秉忠正之心,可抚宁内外。", + "#clandaojie_clan_xunyou2": "贤者,温良恭俭让以得之。", + "#clan_xunyou:die": "吾知命之寿,明知命之节……", + "#clanqiajue1": "汉旗未复,此生不居檐下。", + "#clanqiajue2": "蜀川大好,皆可为家。", + "#clanmuyin_clan_wuqiao1": "生继汉泽于身,死效忠义于行。", + "#clanmuyin_clan_wuqiao2": "吾祖彰汉室之荣,今子孙未敢忘。", + "#clan_wuqiao:die": "蜀川万里,孤身伶仃……", + "#clanlilun1": null, + "#clanlilun2": null, + "#clanjianji1": null, + "#clanjianji2": null, + "#clanzhongliu_clan_wangguang1": null, + "#clanzhongliu_clan_wangguang2": null, + "#clan_wangguang:die": null, + "#clantanque1": null, + "#clantanque2": null, + "#clanshengmo1": null, + "#clanshengmo2": null, + "#clanzhongliu_clan_wangmingshan1": null, + "#clanzhongliu_clan_wangmingshan2": null, + "#clan_wangmingshan:die": null, +}; diff --git a/character/collab.js b/character/collab.js deleted file mode 100644 index 7a069d486..000000000 --- a/character/collab.js +++ /dev/null @@ -1,2424 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "collab", - connect: true, - character: { - dc_zhaoyun: [ - "male", - "shen", - 1, - ["boss_juejing", "dclonghun", "dczhanjiang"], - ["shu", "InitFilter:noZhuHp:noZhuSkill"], - ], - dc_sunce: ["male", "wu", 4, ["dcshuangbi"]], - nezha: ["male", "qun", 3, ["dcsantou", "dcfaqi"], ["InitFilter:noZhuHp"]], - dc_caocao: ["male", "wei", 4, ["dcjianxiong"]], - dc_liubei: ["male", "shu", 4, ["dcrende"]], - dc_sunquan: ["male", "wu", 4, ["dczhiheng"]], - zhutiexiong: ["male", "qun", 3, ["dcbianzhuang"]], - wu_zhutiexiong: ["male", "qun", 3, ["dcbianzhuang"], ["unseen"]], - xiaoyuehankehan: ["male", "qun", 3, ["dctongliao", "dcwudao"]], - libai: ["male", "qun", 3, ["dclbjiuxian", "dcshixian"]], - sunwukong: ["male", "qun", 3, ["dcjinjing", "dccibei", "dcruyi"]], - longwang: ["male", "qun", 3, ["dclonggong", "dcsitian"]], - taoshen: ["male", "qun", 3, ["dcnutao"]], - sunyang: ["male", "wu", 4, ["clbshuijian"]], - yeshiwen: ["female", "wu", 3, ["clbjisu", "clbshuiyong"]], - sp_jiben: ["male", "qun", 3, ["spduanzhi", "spduyi"]], - sp_fuhuanghou: ["female", "qun", 3, ["spcangni", "spmixin"]], - sp_fuwan: ["male", "qun", 3, ["spfengyin", "spchizhong"]], - old_lingju: ["female", "qun", 3, ["jieyuan", "fenxin_old"]], - sp_mushun: ["male", "qun", 4, ["moukui"]], - }, - characterFilter: { - old_lingju(mode) { - return mode == "identity"; - }, - }, - characterInitFilter: { - dc_zhaoyun(tag) { - if (tag == "noZhuSkill" && (get.mode() != "doudizhu" || _status.mode != "normal")) - return false; - }, - }, - characterSort: { - collab: { - collab_olympic: ["sunyang", "yeshiwen"], - collab_tongque: ["sp_fuwan", "sp_fuhuanghou", "sp_jiben", "old_lingju", "sp_mushun"], - collab_duanwu: ["sunwukong", "longwang", "taoshen"], - collab_decade: ["libai", "xiaoyuehankehan", "zhutiexiong", "wu_zhutiexiong"], - collab_remake: ["dc_caocao", "dc_liubei", "dc_sunquan", "nezha", "dc_sunce", "dc_zhaoyun"], - }, - }, - /** @type { importCharacterConfig['skill'] } */ - skill: { - //新InitFilter测试高达一号 - //打赢复活赛的牢达[哭] - dclonghun: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - prompt: "将♦牌当做火【杀】,♥牌当做【桃】,♣牌当做【闪】,♠牌当做【无懈可击】使用或打出", - viewAs(cards, player) { - var name; - var nature = null; - switch (get.suit(cards[0], player)) { - case "club": - name = "shan"; - break; - case "diamond": - name = "sha"; - nature = "fire"; - break; - case "spade": - name = "wuxie"; - break; - case "heart": - name = "tao"; - break; - } - if (name) return { name: name, nature: nature }; - return null; - }, - check(card) { - var player = _status.event.player; - if (_status.event.type == "phase") { - var max = 0; - var name2; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hes", function (card) { - return ( - (name != "sha" || get.value(card) < 5) && - get.suit(card, player) == map[name] - ); - }) > 0 && - player.getUseValue({ - name: name, - nature: name == "sha" ? "fire" : null, - }) > 0 - ) { - var temp = get.order({ - name: name, - nature: name == "sha" ? "fire" : null, - }); - if (temp > max) { - max = temp; - name2 = map[name]; - } - } - } - if (name2 == get.suit(card, player)) - return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); - return 0; - } - return 1; - }, - position: "hes", - filterCard(card, player, event) { - event = event || _status.event; - var filter = event._backup.filterCard; - var name = get.suit(card, player); - if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; - if ( - name == "diamond" && - filter({ name: "sha", cards: [card], nature: "fire" }, player, event) - ) - return true; - if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) - return true; - if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; - return false; - }, - filter(event, player) { - var filter = event.filterCard; - if ( - filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && - player.countCards("hes", { suit: "diamond" }) - ) - return true; - if ( - filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && - player.countCards("hes", { suit: "club" }) - ) - return true; - if ( - filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && - player.countCards("hes", { suit: "heart" }) - ) - return true; - if ( - filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && - player.countCards("hes", { suit: "spade" }) - ) - return true; - return false; - }, - usable: 20, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter(player, tag) { - if ((player.getStat("skill").dclonghun || 0) >= 20) return false; - var name; - switch (tag) { - case "respondSha": - name = "diamond"; - break; - case "respondShan": - name = "club"; - break; - case "save": - name = "heart"; - break; - } - if (!player.countCards("hes", { suit: name })) return false; - }, - order(item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hes", function (card) { - return ( - (name != "sha" || get.value(card) < 5) && - get.suit(card, player) == map[name] - ); - }) > 0 && - player.getUseValue({ - name: name, - nature: name == "sha" ? "fire" : null, - }) > 0 - ) { - var temp = get.order({ - name: name, - nature: name == "sha" ? "fire" : null, - }); - if (temp > max) max = temp; - } - } - max /= 1.1; - return max; - } - return 2; - }, - }, - hiddenCard(player, name) { - if ((player.getStat("skill").dclonghun || 0) >= 20) return false; - if (name == "wuxie" && _status.connectMode && player.countCards("hes") > 0) return true; - if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; - if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; - }, - }, - dczhanjiang: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - return game.hasPlayer((target) => { - return target.countCards( - "ej", - (card) => - get.name(card, false) == "qinggang" || - get.name(card, get.owner(card)) == "qinggang" - ); - }); - }, - content() { - let cards = [], - targets = game.filterPlayer((target) => { - return target.countCards( - "ej", - (card) => - get.name(card, false) == "qinggang" || - get.name(card, get.owner(card)) == "qinggang" - ); - }); - targets.forEach((target) => - cards.addArray( - target.getCards( - "ej", - (card) => - get.name(card, false) == "qinggang" || - get.name(card, get.owner(card)) == "qinggang" - ) - ) - ); - player.gain(cards, "give"); - }, - }, - //孙策 - //双壁=100%技能周瑜+100%原画孙策 - dcshuangbi: { - audio: 2, - enable: "phaseUse", - usable: 1, - *content(event, map) { - var player = map.player, - num = game.countPlayer(); - var result = yield player - .chooseControl() - .set("choiceList", [ - "摸" + get.cnNumber(num) + "张牌,本回合手牌上限+" + parseFloat(num), - "弃置至多" + get.cnNumber(num) + "张牌,随机对其他角色造成等量火焰伤害", - "视为使用" + get.cnNumber(num) + "张火【杀】或【火攻】", - ]) - .set("ai", () => { - var player = _status.event.player, - card = { name: "sha", nature: "fire" }; - if ( - !game.hasPlayer( - (target) => - player.canUse(card, target) && - get.effect(target, card, player, player) > 0 - ) - ) - return 0; - return 2; - }); - player.flashAvatar( - "dcshuangbi", - ["re_zhouyu", "shen_zhouyu", "dc_sb_zhouyu"][result.index] - ); - switch (result.index) { - case 0: - player.draw(num); - player.addTempSkill("dcshuangbi_effect"); - player.addMark("dcshuangbi_effect", num, false); - break; - case 1: - var result2 = yield player - .chooseToDiscard( - "双壁:弃置至多" + - get.cnNumber(num) + - "张牌,随机对其他角色造成等量火焰伤害", - [1, num], - "he" - ) - .set("ai", (card) => 1 / (get.value(card) || 0.5)); - if (result2.bool) { - var map = {}, - sum = result2.cards.length; - var targets = game.filterPlayer((target) => target != player); - if (targets.length) { - while (sum) { - sum--; - var target = targets.randomGet(); - player.line(target); - target.damage(1, "fire"); - game.delayx(); - } - } - } - break; - case 2: - while ( - num && - game.hasPlayer( - (target) => - player.canUse({ name: "sha", nature: "fire" }, target) || - player.canUse({ name: "huogong" }, target) - ) - ) { - num--; - var list = []; - if ( - game.hasPlayer((target) => - player.canUse({ name: "sha", nature: "fire" }, target) - ) - ) - list.push(["基本", "", "sha", "fire"]); - if (game.hasPlayer((target) => player.canUse({ name: "huogong" }, target))) - list.push(["锦囊", "", "huogong"]); - var result2 = yield player - .chooseButton(["双壁:请选择你要使用的牌", [list, "vcard"]], true) - .set("ai", (button) => (button.link[2] == "sha" ? 1 : 0)); - if (result2.bool) { - var card = { - name: result2.links[0][2], - nature: result2.links[0][3], - }; - yield player.chooseUseTarget(true, card, false); - } else break; - } - break; - } - }, - ai: { - order: 9, - result: { player: 1 }, - }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - intro: { content: "手牌上限+#" }, - mod: { - maxHandcard(player, num) { - return num + player.countMark("dcshuangbi_effect"); - }, - }, - }, - }, - }, - //哪吒 - dcsantou: { - audio: 2, - trigger: { player: "damageBegin4" }, - forced: true, - *content(event, map) { - var player = map.player, - trigger = map.trigger; - var source = trigger.source; - trigger.cancel(); - var hp = player.getHp(); - var lose = false; - if (hp >= 3) { - if ( - player.hasHistory("useSkill", (evt) => { - var evtx = evt.event; - return ( - evt.skill == "dcsantou" && - evtx.getTrigger().source == source && - evtx.getParent(2) != trigger - ); - }) - ) - lose = true; - } else if (hp == 2) { - if (trigger.hasNature()) lose = true; - } else if (hp == 1) { - if (trigger.card && get.color(trigger.card) == "red") lose = true; - } - if (lose) player.loseHp(); - }, - ai: { - filterDamage: true, - skillTagFilter(player, tag, arg) { - if (arg && arg.player && arg.player.hasSkillTag("jueqing", false, player)) - return false; - }, - effect: { - target(card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return; - if (player._dcsantou_temp) return; - if (get.tag(card, "damage")) { - const hp = target.getHp(); - player._dcsantou_temp = true; - const losehp = - get.effect(target, { name: "losehp" }, target, target) / - get.attitude(target, target); - delete player._dcsantou_temp; - if (hp >= 3) { - if ( - target.hasHistory( - "useSkill", - (evt) => - evt.skill == "dcsantou" && - evt.event.getTrigger().source == player - ) - ) - return [0, losehp, 0, 0]; - else if (get.attitude(player, target) < 0) { - let hs = player.getCards("hs", (i) => { - return i !== card && (!card.cards || !card.cards.includes(i)); - }), - num = player.getCardUsable("sha"); - if (card.name === "sha") num--; - hs = hs.filter((i) => { - if (!player.canUse(i, target)) return false; - if (get.tag(card, "damage") && get.name(i, player) !== "sha") - return true; - if (num) { - num--; - return true; - } - return false; - }).length; - if ( - player.hasSkillTag("damage", null, { - target: target, - }) - ) - hs++; - if (!hs) return "zeroplayertarget"; - num = 1 - 2 / 3 / hs; - return [num, 0, num, 0]; - } - } - if ( - (hp == 2 && get.tag(card, "natureDamage")) || - (hp == 1 && typeof card == "object" && get.color(card) == "red") - ) - return [0, losehp, 0, 0]; - return "zeroplayertarget"; - } - }, - }, - }, - }, - dcfaqi: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter(event, player) { - if (get.type(event.card) != "equip") return false; - if (!player.isPhaseUsing()) return false; - for (const name of lib.inpile) { - if (get.type(name) != "trick") continue; - if ( - !player.hasStorage("dcfaqi", name) && - player.hasUseTarget({ name: name, isCard: true }) - ) - return true; - } - return false; - }, - direct: true, - *content(event, map) { - var player = map.player; - var list = get.inpileVCardList((info) => { - if (info[0] != "trick") return false; - var name = info[2]; - return ( - !player.hasStorage("dcfaqi", name) && - player.hasUseTarget({ name: name, isCard: true }) - ); - }); - if (list.length) { - var result = yield player - .chooseButton(["法器:视为使用一张普通锦囊牌", [list, "vcard"]], true) - .set("ai", (button) => { - return get.player().getUseValue({ name: button.link[2] }); - }); - if (result.bool) { - var name = result.links[0][2]; - if (!player.storage.dcfaqi) - player - .when({ global: "phaseAfter" }) - .then(() => delete player.storage.dcfaqi); - player.markAuto("dcfaqi", name); - player.chooseUseTarget({ name: name, isCard: true }, true, false).logSkill = - "dcfaqi"; - } - } else event.finish(); - }, - ai: { - reverseEquip: true, - }, - }, - //隅泣曹操 - dcjianxiong: { - audio: "rejianxiong", - trigger: { - player: "damageEnd", - }, - content() { - "step 0"; - if ( - get.itemtype(trigger.cards) == "cards" && - get.position(trigger.cards[0], true) == "o" - ) { - player.gain(trigger.cards, "gain2"); - } - player.draw(player.countMark("dcjianxiong") + 1, "nodelay"); - "step 1"; - if (player.countMark("dcjianxiong") < 4) player.addMark("dcjianxiong", 1, false); - }, - marktext: "雄", - intro: { - markcount(storage, player) { - return player.countMark("dcjianxiong") + 1; - }, - content(storage, player) { - return "摸牌数为" + (player.countMark("dcjianxiong") + 1); - }, - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target(card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; - if (get.tag(card, "damage") && player != target) { - var cards = card.cards, - evt = _status.event; - if ( - evt.player == target && - card.name == "damage" && - evt.getParent().type == "card" - ) - cards = evt.getParent().cards.filterInD(); - if (target.hp <= 1) return; - if (get.itemtype(cards) != "cards") return; - for (var i of cards) { - if (get.name(i, target) == "tao") - return [1, 5 + player.countMark("dcjianxiong") / 2]; - } - if ( - get.value(cards, target) >= - 7 - player.countMark("dcjianxiong") / 2 + target.getDamagedHp() - ) - return [1, 3 + player.countMark("dcjianxiong") / 2]; - return [1, 0.6 + player.countMark("dcjianxiong") / 2]; - } - }, - }, - }, - }, - //缺德刘备 - dcrende: { - audio: "rerende", - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer((current) => { - return lib.skill.dcrende.filterTarget(null, player, current); - }); - }, - discard: false, - lose: false, - delay: false, - filterTarget(card, player, target) { - if (player.getStorage("dcrende_targeted").includes(target)) return false; - return player != target && target.countGainableCards(player, "h") > 1; - }, - content() { - "step 0"; - player.addTempSkill("dcrende_targeted", "phaseUseAfter"); - player.markAuto("dcrende_targeted", [target]); - player.gainPlayerCard(target, "h", true, 2); - "step 1"; - var list = []; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - var card = { name: name, isCard: true }; - if ( - lib.filter.cardUsable(card, player, event.getParent("chooseToUse")) && - game.hasPlayer((current) => { - return player.canUse(card, current); - }) - ) { - list.push(["基本", "", name]); - } - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if ( - lib.filter.cardUsable(card, player, event.getParent("chooseToUse")) && - game.hasPlayer((current) => { - return player.canUse(card, current); - }) - ) { - list.push(["基本", "", name, nature]); - } - } - } - } - 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(); - } - "step 2"; - 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); - } - }, - subSkill: { - targeted: { - onremove: true, - charlotte: true, - }, - }, - ai: { - fireAttack: true, - order(skill, player) { - return 10; - }, - result: { - target(player, target) { - if (target.hasSkillTag("noh")) return -0.1; - return -2; - }, - }, - threaten: 3, - }, - }, - //会玩孙权 - dczhiheng: { - audio: "rezhiheng", - init: (player) => { - player.storage.dczhiheng_hit = []; - }, - enable: "phaseUse", - position: "he", - filterCard: lib.filter.cardDiscardable, - discard: false, - lose: false, - delay: false, - selectCard: [1, Infinity], - filter(event, player) { - var skill = player.getStat().skill; - return ( - !skill.dczhiheng || skill.dczhiheng < 1 + player.getStorage("dczhiheng_hit").length - ); - }, - check(card) { - var player = _status.event.player; - if ( - get.position(card) == "h" && - !player.countCards("h", "du") && - (player.hp > 2 || - !player.countCards("h", function (card) { - return get.value(card) >= 8; - })) - ) { - return 1; - } - return 6 - get.value(card); - }, - group: "dczhiheng_add", - content() { - "step 0"; - player.discard(cards); - event.num = 1; - var hs = player.getCards("h"); - if (!hs.length) event.num = 0; - for (var i = 0; i < hs.length; i++) { - if (!cards.includes(hs[i])) { - event.num = 0; - break; - } - } - "step 1"; - player.draw(event.num + cards.length); - }, - subSkill: { - add: { - audio: 2, - trigger: { - source: "damageSource", - }, - forced: true, - locked: false, - filter(event, player) { - return !player.getStorage("dczhiheng_hit").includes(event.player); - }, - content() { - player.addTempSkill("dczhiheng_hit"); - player.markAuto("dczhiheng_hit", [trigger.player]); - }, - }, - hit: { - charlotte: true, - onremove: (player) => { - player.storage.dczhiheng_hit = []; - }, - mark: true, - marktext: "衡", - intro: { - markcount(storage) { - if (storage) return storage.length; - return 0; - }, - content: "本回合已对$造成过伤害", - }, - }, - }, - ai: { - order(item, player) { - if ( - player.hasCard((i) => { - return get.value(i) > Math.max(6, 9 - player.hp); - }, "he") - ) - return 1; - return 10; - }, - result: { - player: 1, - }, - nokeep: true, - skillTagFilter(player, tag, arg) { - if (tag === "nokeep") - return ( - (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && - player.isPhaseUsing() && - player.countSkill("dczhiheng") < - 1 + player.getStorage("dczhiheng_hit").length && - player.hasCard((card) => { - return get.name(card) !== "tao"; - }, "h") - ); - }, - threaten: 1.55, - }, - }, - //朱铁雄 - dcbianzhuang: { - audio: 2, - enable: "phaseUse", - usable: 1, - content() { - "step 0"; - var list = []; - for (var i in lib.skill.dcbianzhuang.characterMap) { - if ( - lib.character[i] && - get.is.object(lib.skill[lib.skill.dcbianzhuang.characterMap[i]]) - ) - list.push(i); - } - var characters = list.randomGets(player.storage.dcbianzhuang_inited ? 3 : 2); - if (!characters.length) { - event.finish(); - return; - } - var skills = characters.map((i) => lib.skill.dcbianzhuang.characterMap[i]); - player - .chooseControl(skills) - .set("dialog", ["选择获得一个技能并“变装”", [characters, "character"]]); - "step 1"; - var skill = result.control; - player.addTempSkills(skill, "dcbianzhuangAfter"); - for (var i in lib.skill.dcbianzhuang.characterMap) { - if (lib.skill.dcbianzhuang.characterMap[i] == skill) { - player.flashAvatar("dcbianzhuang", i); - player.popup(skill); - game.log(player, "“变装”为了", "#b" + get.translation(i)); - break; - } - } - player.chooseUseTarget("sha", true, false, "nodistance"); - "step 2"; - if (result.bool && !player.storage.dcbianzhuang_inited) { - player.addMark("dcbianzhuang", 1, false); - if (player.countMark("dcbianzhuang") > 2) { - player.storage.dcbianzhuang_inited = true; - player.reinitCharacter("zhutiexiong", "wu_zhutiexiong"); - } - } - }, - group: "dcbianzhuang_refresh", - ai: { - order: 16, - result: { - player(player) { - if (player.hasValueTarget("sha", false)) return 1; - return 0; - }, - }, - effect: { - target(card, player, target, current) { - if (player == target && player.isPhaseUsing() && get.type(card) == "equip") { - if ( - player.hasValueTarget("sha", false) && - typeof player.getStat("skill").dcbianzhuang == "number" - ) - return [1, 3]; - } - }, - }, - }, - subSkill: { - refresh: { - trigger: { player: "useCardAfter" }, - forced: true, - filter(event, player) { - return ( - get.type2(event.card, false) == "equip" && - typeof player.getStat("skill").dcbianzhuang == "number" - ); - }, - content() { - var stat = player.getStat("skill"); - delete stat.dcbianzhuang; - }, - }, - }, - characterMap: { - re_zhangchunhua: "rejueqing", - wangshuang: "spzhuilie", - re_machao: "retieji", - ol_weiyan: "xinkuanggu", - re_lvbu: "wushuang", - re_huangzhong: "xinliegong", - ol_pangde: "rejianchu", - ol_zhurong: "lieren", - re_masu: "rezhiman", - re_panzhangmazhong: "reanjian", - mayunlu: "fengpo", - re_quyi: "refuqi", - }, - }, - //小约翰可汗 - dctongliao: { - audio: 3, - trigger: { player: "phaseDrawAfter" }, - direct: true, - locked: false, - filter(event, player) { - return player.countCards("h") > 0; - }, - content() { - "step 0"; - player - .chooseCard( - "h", - get.prompt("dctongliao"), - "选择一张牌标记为“通辽”", - function (card, player) { - if (card.hasGaintag("dctongliao")) return false; - var num = get.number(card, player); - return !player.hasCard((card2) => { - return card != card2 && get.number(card2, player) < num; - }); - } - ) - .set("ai", function (card) { - var player = _status.event.player; - return 1 + Math.max(0, player.getUseValue(card, null, true)); - }); - "step 1"; - if (result.bool) { - player.logSkill("dctongliao"); - player.addGaintag(result.cards, "dctongliao"); - game.delayx(); - } - }, - mod: { - aiOrder(player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("dctongliao")) return num + 0.6; - }, - }, - group: "dctongliao_draw", - subSkill: { - draw: { - trigger: { - player: ["loseAfter"], - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter(event, player) { - var evt = event.getl(player); - if (!evt || !evt.hs || !evt.hs.length) return false; - if (event.name == "lose") { - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("dctongliao")) return true; - } - return false; - } - return player.hasHistory("lose", function (evt) { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("dctongliao")) return true; - } - return false; - }); - }, - forced: true, - content() { - var num = 0; - var cards = trigger.getl(player).hs, - ids = []; - if (trigger.name == "lose") { - for (var i in trigger.gaintag_map) { - if (trigger.gaintag_map[i].includes("dctongliao")) ids.push(i); - } - } else - player.getHistory("lose", function (evt) { - if (trigger != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("dctongliao")) ids.push(i); - } - }); - for (var card of cards) { - if (ids.includes(card.cardid)) num += get.number(card, player); - } - if (num > 0) player.draw(num); - }, - }, - }, - }, - dcwudao: { - audio: 3, - trigger: { player: "useCardAfter" }, - frequent: true, - filter(event, player) { - if (player.getStorage("dcwudao_effect").includes(get.type2(event.card, false))) - return false; - var history = player.getHistory("useCard"), - index = history.indexOf(event); - if (index < 1) return false; - var evt = history[index - 1]; - return get.type2(event.card, false) == get.type2(evt.card, false); - }, - prompt2(event) { - return ( - "令你本回合使用" + - get.translation(get.type2(event.card, false)) + - "牌时不可被响应且伤害+1" - ); - }, - content() { - player.addTempSkill("dcwudao_effect"); - player.markAuto("dcwudao_effect", [get.type2(trigger.card, false)]); - }, - subSkill: { - effect: { - trigger: { player: "useCard" }, - forced: true, - popup: false, - onremove: true, - filter(event, player) { - return player.getStorage("dcwudao_effect").includes(get.type2(event.card, false)); - }, - content() { - if (get.tag(trigger.card, "damage") > 0) trigger.baseDamage++; - trigger.directHit.addArray(game.filterPlayer()); - }, - intro: { content: "已经悟到了$牌" }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if ( - arg && - arg.card && - player.getStorage("dcwudao_effect").includes(get.type2(arg.card)) - ) - return true; - return false; - }, - }, - }, - }, - }, - //叶诗文 - clbjisu: { - audio: 2, - trigger: { player: "phaseJudgeBefore" }, - direct: true, - content() { - "step 0"; - var check = player.countCards("h") > 2; - player - .chooseTarget( - get.prompt("clbjisu"), - "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", - function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - } - ) - .set("check", check) - .set("ai", function (target) { - if (!_status.event.check) return 0; - return get.effect(target, { name: "sha" }, _status.event.player); - }) - .setHiddenSkill("clbjisu"); - "step 1"; - if (result.bool) { - player.useCard({ name: "sha", isCard: true }, result.targets[0], false, "clbjisu"); - trigger.cancel(); - player.skip("phaseDraw"); - } - }, - }, - clbshuiyong: { - audio: 2, - trigger: { player: "damageBegin4" }, - filter(event) { - return event.hasNature("fire"); - }, - forced: true, - content() { - trigger.cancel(); - }, - ai: { - nofire: true, - effect: { - target(card, player, target, current) { - if (get.tag(card, "fireDamage")) return "zerotarget"; - }, - }, - }, - }, - //孙杨 - clbshuijian: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - frequent: true, - filter(event, player) { - return !event.numFixed; - }, - content() { - var num = 1 + Math.floor(player.countCards("e") / 2); - trigger.num += num; - }, - }, - //李白 - dclbjiuxian: { - audio: 2, - enable: "chooseToUse", - locked: false, - viewAs: { name: "jiu" }, - check: (card) => 6.5 - get.value(card), - filterCard(card) { - var info = get.info(card); - if (!info || (info.type != "trick" && info.type != "delay")) return false; - if (info.notarget) return false; - if (info.selectTarget != undefined) { - if (Array.isArray(info.selectTarget)) { - if (info.selectTarget[0] < 0) return !info.toself; - return info.selectTarget[0] != 1 || info.selectTarget[1] != 1; - } else { - if (info.selectTarget < 0) return !info.toself; - return info.selectTarget != 1; - } - } - return false; - }, - viewAsFilter(player) { - if (_status.connectMode && player.countCards("hs") > 0) return true; - return player.hasCard(lib.skill.dclbjiuxian.filterCard, "hs"); - }, - ai: { - order: (item, player) => get.order({ name: "jiu" }, player), - }, - mod: { - cardUsable(card) { - if (card.name == "jiu") return Infinity; - }, - }, - }, - dcshixian: { - audio: 2, - trigger: { player: "useCard" }, - //frequent:true, - //direct:true, - locked: false, - filter(event, player) { - var history = player.getAllHistory("useCard"), - index = history.indexOf(event); - if (index < 1) return false; - var evt = history[index - 1]; - return get.is.yayun(get.translation(event.card.name), get.translation(evt.card.name)); - }, - filterx(event) { - if (event.targets.length == 0) return false; - var type = get.type(event.card); - if (type != "basic" && type != "trick") return false; - return true; - }, - prompt2(event, player) { - if (lib.skill.dcshixian.filterx(event)) - return "摸一张牌并令" + get.translation(event.card) + "额外结算一次?"; - return "摸一张牌。"; - }, - check(event, player) { - if (lib.skill.dcshixian.filterx(event)) return !get.tag(event.card, "norepeat"); - return true; - }, - content() { - player.draw(); - if (lib.skill.dcshixian.filterx(trigger)) { - trigger.effectCount++; - game.log(trigger.card, "额外结算一次"); - } - }, - mod: { - aiOrder(player, card, num) { - if (typeof card == "object" && !get.tag(card, "norepeat")) { - var history = player.getAllHistory("useCard"); - if (history.length > 0) { - var cardx = history[history.length - 1].card; - if (get.is.yayun(get.translation(cardx.name), get.translation(card.name))) - return num + 20; - } - } - }, - }, - init(player) { - player.addSkill("dcshixian_yayun"); - var history = player.getAllHistory("useCard"); - if (history.length) { - player.addGaintag( - player.getCards("h", (card) => { - return get.is.yayun( - get.translation(card.name), - get.translation(history[history.length - 1].card.name) - ); - }), - "dcshixian_yayun" - ); - } - }, - onremove(player) { - player.removeSkill("dcshixian_yayun"); - player.removeGaintag("dcshixian_yayun"); - }, - subSkill: { - yayun: { - charlotte: true, - trigger: { player: "useCard1" }, - filter(event, player) { - return player.countCards("h") > 0; - }, - direct: true, - priority: 11 + 45 + 14 + 19 + 19 + 810, - content() { - "step 0"; - player.removeGaintag("dcshixian_yayun"); - "step 1"; - player.addGaintag( - player.getCards("h", (card) => { - return get.is.yayun( - get.translation(card.name), - get.translation(trigger.card.name) - ); - }), - "dcshixian_yayun" - ); - }, - }, - }, - }, - //龙王 - dclonggong: { - audio: 2, - trigger: { player: "damageBegin4" }, - usable: 1, - filter(event, player) { - return event.source && event.source.isIn(); - }, - logTarget: "source", - check(event, player) { - return get.attitude(player, event.source) >= 0 || player.hp <= Math.max(2, event.num); - }, - content() { - "step 0"; - trigger.cancel(); - "step 1"; - var card = get.cardPile2(function (card) { - return get.type(card, null, false) == "equip"; - }), - source = trigger.source; - if (card && source && source.isIn()) source.gain(card, "gain2"); - }, - ai: { - filterDamage: true, - skillTagFilter(player) { - return !player.storage.counttrigger || !player.storage.counttrigger.dclonggong; - }, - }, - }, - dcsitian: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - var colorx = false, - hs = player.getCards("he"); - if (hs.length < 2) return false; - for (var card of hs) { - if (!lib.filter.cardDiscardable(card, player)) continue; - var color = get.color(card, player); - if (color == "none") continue; - if (!colorx) colorx = color; - else if (colorx != color) return true; - } - return false; - }, - filterCard(card, player) { - var color = get.color(card, player); - if (color == "none") return false; - return !ui.selected.cards.length || get.color(ui.selected.cards[0]) != color; - }, - selectCard: 2, - complexCard: true, - prompt: "弃置两张颜色不同的牌并改变天气", - check: (card) => 4.5 - get.value(card), - content() { - "step 0"; - var list = ["烈日", "雷电", "大浪", "暴雨", "大雾"].randomGets(2); - player - .chooseButton(true, [ - "请选择执行一个天气", - [ - list.map((i) => [ - i, - '", - ]), - "textbutton", - ], - ]) - .set("ai", function (button) { - return lib.skill.dcsitian.weathers[button.link].ai(_status.event.player); - }); - "step 1"; - if (result.bool) { - var choice = result.links[0]; - game.log(player, "将当前天气变更为", "#g" + choice); - var next = game.createEvent("dcsitian_weather", false); - next.player = player; - next.setContent(lib.skill.dcsitian.weathers[choice].content); - } - }, - ai: { - order: 8, - result: { - player(player) { - var num1 = 0, - num2 = 0; - game.countPlayer(function (current) { - if (player == current) return; - var att = get.attitude(player, current); - if (att > 0) num1++; - else num2++; - }); - return num2 - num1; - }, - }, - }, - subSkill: { - dawu: { - trigger: { player: "useCard" }, - forced: true, - charlotte: true, - filter(event, player) { - return get.type2(event.card, false) == "basic"; - }, - content() { - trigger.targets.length = 0; - trigger.all_excluded = true; - player.removeSkill("dcsitian_dawu"); - }, - mark: true, - marktext: "雾", - intro: { - name: "司天 - 大雾", - content: "使用的下一张基本牌无效", - }, - }, - }, - weathers: { - 烈日: { - description: "你对其他角色造成1点火属性伤害。", - content() { - var targets = game.filterPlayer((current) => current != player).sortBySeat(); - player.line(targets, "fire"); - for (var target of targets) { - target.damage("fire"); - } - }, - ai(player) { - var effect = 0; - game.countPlayer(function (current) { - if (current == player) return; - effect += get.damageEffect(current, player, player, "fire"); - }); - return effect; - }, - }, - 雷电: { - description: - "你令其他角色各进行一次判定。若结果为♠2~9,则其受到3点无来源雷属性伤害。", - content() { - "step 0"; - var targets = game.filterPlayer((current) => current != player).sortBySeat(); - player.line(targets, "thunder"); - event.targets = targets; - "step 1"; - var target = targets.shift(); - if (!target.isIn()) { - if (targets.length > 0) event.redo(); - else { - event.finish(); - return; - } - } - event.target = target; - event.judgestr = get.translation("shandian"); - target.judge(lib.card.shandian.judge, event.judgestr).judge2 = - lib.card.shandian.judge2; - //game.delayx(1.5); - "step 2"; - var name = "shandian"; - if (event.cancelled && !event.direct) { - if (lib.card[name].cancel) { - var next = game.createEvent(name + "Cancel"); - next.setContent(lib.card[name].cancel); - next.cards = []; - next.card = get.autoViewAs({ name: name }); - next.player = target; - } - } else { - var next = game.createEvent(name); - next.setContent(function () { - if (result.bool == false) { - player.damage(3, "thunder", "nosource"); - } - }); - next._result = result; - next.cards = []; - next.card = get.autoViewAs({ name: name }); - next.player = target; - } - if (targets.length > 0) event.goto(1); - }, - ai(player) { - var effect = 0; - game.countPlayer(function (current) { - if (current == player) return; - effect += get.damageEffect(current, current, player, "thunder") / 5; - }); - return effect; - }, - }, - 大浪: { - description: - "你弃置其他角色装备区内的所有牌(装备区内没有牌的角色改为失去1点体力)。", - content() { - "step 0"; - var targets = game.filterPlayer((current) => current != player).sortBySeat(); - player.line(targets, "green"); - event.targets = targets; - "step 1"; - var target = targets.shift(); - if (target.isIn()) { - var num = target.countCards("e"); - if (num > 0) { - player.discardPlayerCard(target, true, "e", num); - } else { - target.loseHp(); - game.delayex(); - } - } - if (targets.length > 0) event.redo(); - }, - ai(player) { - var effect = 0; - game.countPlayer(function (current) { - if (current == player) return; - var es = current.getCards("e"); - if (es.length > 0) { - var att = get.attitude(player, current), - val = get.value(es, current); - effect -= Math.sqrt(att) * val; - } else effect += get.effect(current, { name: "losehp" }, player, player); - }); - return effect; - }, - }, - 暴雨: { - description: "你弃置一名角色的所有手牌。若其没有手牌,则改为令其失去1点体力。", - content() { - "step 0"; - player - .chooseTarget( - "请选择【暴雨】的目标", - "令目标角色弃置所有手牌。若其没有手牌,则其改为失去1点体力。" - ) - .set("ai", function (current) { - var es = current.getCards("h"), - player = _status.event.player; - if (es.length > 0) { - var att = get.attitude(player, current), - val = get.value(es, current); - return -Math.sqrt(att) * val; - } - return get.effect(current, { name: "losehp" }, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - var num = target.countCards("h"); - if (num > 0) { - player.discardPlayerCard(target, true, "h", num); - } else { - target.loseHp(); - game.delayex(); - } - } - }, - ai(player) { - return Math.max.apply( - Math, - game - .filterPlayer(function (current) { - return current != player; - }) - .map(function (current) { - var es = current.getCards("h"); - if (es.length > 0) { - var att = get.attitude(player, current), - val = get.value(es, current); - return -Math.sqrt(att) * val; - } - return get.effect(current, { name: "losehp" }, player, player); - }) - ); - }, - }, - 大雾: { - description: "你令所有其他角色获得如下效果:当其使用下一张基本牌时,取消之。", - content() { - var targets = game.filterPlayer((current) => current != player).sortBySeat(); - player.line(targets); - for (var target of targets) target.addSkill("dcsitian_dawu"); - }, - ai(player) { - var effect = 0; - game.countPlayer(function (current) { - if (current == player || current.hasSkill("dcsitian_dawu")) return; - effect -= 0.5 * get.attitude(player, current); - }); - return effect; - }, - }, - }, - }, - //美猴王 - dcjinjing: { - locked: true, - ai: { - viewHandcard: true, - skillTagFilter(player, tag, arg) { - if (player == arg) return false; - }, - }, - }, - dccibei: { - audio: 2, - trigger: { source: "damageBegin2" }, - logTarget: "player", - filter(event, player) { - return ( - player != event.player && - !player.hasHistory("useSkill", function (evt) { - return evt.skill == "dccibei" && evt.targets.includes(event.player); - }) - ); - }, - check(event, player) { - var target = event.player; - if (get.attitude(player, target) >= 0) return true; - return ( - !player.getStat("skill").ruyijingubang_skill || - player.storage.ruyijingubang_skill == 1 - ); - }, - content() { - trigger.cancel(); - player.draw(5); - }, - ai: { - threaten: 4.5, - }, - }, - dcruyi: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - player.hasEquipableSlot(1) && - !player.getEquips("ruyijingubang").length - ); - }, - content() { - var card = game.createCard2("ruyijingubang", "heart", 9); - player.$gain2(card, false); - game.delayx(); - player.equip(card); - }, - mod: { - canBeGained(card, source, player) { - if (player.getEquips("ruyijingubang").includes(card)) return false; - }, - canBeDiscarded(card, source, player) { - if (player.getEquips("ruyijingubang").includes(card)) return false; - }, - canBeReplaced(card, player) { - if (player.getEquips("ruyijingubang").includes(card)) return false; - }, - cardname(card) { - if (get.subtype(card, false) == "equip1") return "sha"; - }, - cardnature(card) { - if (get.subtypes(card, false).includes("equip1")) return false; - }, - cardDiscardable(card, player) { - if (player.getEquips("ruyijingubang").includes(card)) return false; - }, - cardEnabled2(card, player) { - if (player.getEquips("ruyijingubang").includes(card)) return false; - }, - }, - group: "dcruyi_blocker", - subSkill: { - blocker: { - trigger: { - player: ["loseBefore", "disableEquipBefore"], - }, - forced: true, - filter(event, player) { - if (event.name == "disableEquip") return event.slots.includes("equip1"); - var cards = player.getEquips("ruyijingubang"); - return event.cards.some((card) => cards.includes(card)); - }, - content() { - if (trigger.name == "lose") { - trigger.cards.removeArray(player.getEquips("ruyijingubang")); - } else { - while (trigger.slots.includes("equip1")) trigger.slots.remove("equip1"); - } - }, - }, - }, - }, - ruyijingubang_skill: { - equipSkill: true, - enable: "phaseUse", - usable: 1, - chooseButton: { - dialog() { - var dialog = ui.create.dialog( - "如意金箍棒:选择变化攻击范围", - [ - [ - [1, "   ⒈【杀】无次数限制   "], - [2, "   ⒉【杀】的伤害值+1   "], - ], - "tdnodes", - ], - [ - [ - [3, "   ⒊【杀】不可被响应   "], - [4, "   ⒋【杀】的目标数+1   "], - ], - "tdnodes", - ] - ); - return dialog; - }, - filter(button, player) { - return button.link != player.storage.ruyijingubang_skill; - }, - check(button) { - if (button.link == 1 || button.link == 3) return 1; - return 0; - }, - backup(links, player) { - return { - audio: "dcruyi", - num: links[0], - popup: "如意金箍棒", - content() { - var num = lib.skill.ruyijingubang_skill_backup.num; - player.storage.ruyijingubang_skill = num; - var cards = player.getEquips(1); - for (var card of cards) { - if (card && card.name == "ruyijingubang") { - card.storage.ruyijingubang_skill = num; - game.log(player, "将", card, "的攻击范围改为" + num); - } - } - player.markSkill("ruyijingubang_skill"); - }, - }; - }, - }, - mod: { - cardUsable(card, player, num) { - if (player.storage.ruyijingubang_skill == 1 && card.name == "sha") return Infinity; - }, - }, - ai: { - order: 1, - directHit_ai: true, - skillTagFilter(player, tag, arg) { - return player.storage.ruyijingubang_skill == 3; - }, - effect: { - player(card, player, target, current) { - if (get.tag(card, "damage") > 0 && player != target) { - if ( - player.getStat("skill").ruyijingubang_skill && - player.storage.ruyijingubang_skill != 1 - ) - return; - if ( - player.hasSkill("dccibei") && - !player.hasHistory("useSkill", function (evt) { - return evt.skill == "dccibei" && evt.targets.includes(target); - }) - ) { - return [1, 3]; - } - } - }, - }, - result: { - player(player) { - if (player.storage.ruyijingubang_skill == 1) { - if (!player.hasSha()) return 1; - return 0; - } else { - if (player.hasSha() && player.getCardUsable("sha") <= 0) return 1; - return 0; - } - }, - }, - }, - intro: { - name: "如意金箍棒", - content(storage) { - if (!storage) storage = 3; - return ( - "
  • 攻击范围:" + - storage + - "
  • " + - [ - "你使用【杀】无次数限制。", - "你使用的【杀】伤害+1。", - "你使用的【杀】不可被响应。", - "你使用【杀】选择目标后,可以增加一个额外目标。", - ][storage - 1] - ); - }, - }, - subSkill: { - backup: {}, - }, - }, - ruyijingubang_effect: { - equipSkill: true, - trigger: { player: "useCard2" }, - direct: true, - locked: true, - filter(event, player) { - if (event.card.name != "sha") return false; - var num = player.storage.ruyijingubang_skill; - if (!num || num == 1) return false; - if (num != 4) return true; - var card = event.card; - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) && - lib.filter.targetInRange(card, player, current) - ); - }) - ) { - return true; - } - return false; - }, - content() { - "step 0"; - var num = player.storage.ruyijingubang_skill; - if (num == 4) { - player - .chooseTarget( - get.prompt("ruyijingubang_effect"), - "为" + get.translation(trigger.card) + "额外指定一个目标", - function (card, player, target) { - return ( - !_status.event.sourcex.includes(target) && - player.canUse(_status.event.card, target, false) - ); - } - ) - .set("sourcex", trigger.targets) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, _status.event.card, player, player); - }) - .set("card", trigger.card); - } else { - player.logSkill("ruyijingubang_effect"); - if (num == 2) { - trigger.baseDamage++; - game.log(trigger.card, "的伤害+1"); - } else if (num == 3) { - trigger.directHit.addArray(game.filterPlayer()); - game.log(trigger.card, "不可被响应"); - } - event.finish(); - } - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - player.logSkill("ruyijingubang_effect", event.targets); - trigger.targets.addArray(event.targets); - }, - }, - //涛神 - dcnutao: { - audio: 4, - trigger: { player: "useCardToPlayer" }, - forced: true, - group: "dcnutao_add", - filter(event, player) { - if (get.type2(event.card) != "trick") return false; - return event.isFirstTarget && event.targets.some((i) => i != player); - }, - content() { - var target = trigger.targets.filter((i) => i != player).randomGet(); - player.line(target, "thunder"); - target.damage("thunder"); - }, - ai: { - effect: { - player(card, player, target) { - if (player !== target && get.type2(card) === "trick") { - let tars = [target]; - if (ui.selected.targets.length) - tars.addArray( - ui.selected.targets.filter((i) => i !== player && i !== target) - ); - if (tars.length < 2) return [1, 0, 1, -2]; - return [1, 0, 1, -2 / tars.length]; - } - }, - }, - }, - subSkill: { - add: { - audio: "dcnutao", - trigger: { source: "damageSource" }, - filter(event, player) { - return event.nature == "thunder" && player.isPhaseUsing(); - }, - forced: true, - content() { - player.addTempSkill("dcnutao_sha", "phaseUseAfter"); - player.addMark("dcnutao_sha", 1, false); - }, - }, - sha: { - charlotte: true, - onremove: true, - marktext: "涛", - intro: { - content: "此阶段使用【杀】的次数上限+#", - }, - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") return num + player.countMark("dcnutao_sha"); - }, - }, - }, - }, - }, - //铜雀台 - spduanzhi: { - trigger: { target: "useCardToTargeted" }, - logTarget: "player", - check(event, player) { - var target = event.player; - if ( - get.attitude(player, target) >= -2 || - target.countCards("he", function (card) { - return get.value(card, target) > 5; - }) < 2 - ) - return false; - if (player.hp > 2) return true; - if (player.hp == 1) { - if (get.tag(event.card, "respondSha")) { - if (player.countCards("h", { name: "sha" }) == 0) { - return true; - } - } else if (get.tag(event.card, "respondShan")) { - if (player.countCards("h", { name: "shan" }) == 0) { - return true; - } - } else if (get.tag(event.card, "damage")) { - if (event.card.name == "shuiyanqijunx") return player.countCards("e") == 0; - return true; - } - } - return false; - }, - filter(event, player) { - return player != event.player && event.player.countDiscardableCards(player, "he") > 0; - }, - content() { - player.discardPlayerCard(trigger.player, true, "he", [1, 2]); - player.loseHp(); - }, - }, - spduyi: { - enable: "phaseUse", - usable: 1, - content() { - "step 0"; - event.card = get.cards()[0]; - game.cardsGotoOrdering(event.card); - player.showCards(event.card); - "step 1"; - player - .chooseTarget("令一名角色获得" + get.translation(card), true) - .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 (att > 0) { - if (target == player) att *= 0.6; - return att + Math.sqrt(Math.max(0, 5 - target.countCards("h"))); - } - return att; - }) - .set("du", card.name == "du"); - "step 2"; - if (result && result.bool) { - var target = result.targets[0]; - target.gain(card, "gain2"); - if (get.color(card, false) == "black") target.addTempSkill("spduyi2"); - } - }, - ai: { - order: 0.1, - result: { - player: 1, - }, - }, - }, - spduyi2: { - mod: { - cardEnabled2(card) { - if (get.position(card) == "h") return false; - }, - }, - mark: true, - intro: { - content: "不能使用或打出手牌", - }, - }, - spcangni: { - audio: "zhuikong", - trigger: { player: "phaseDiscardBegin" }, - direct: true, - content() { - "step 0"; - player.chooseDrawRecover( - "###" + get.prompt("spcangni") + "###摸两张牌或回复1点体力,然后将武将牌翻面", - 2 - ).logSkill = "spcangni"; - "step 1"; - if (result.control != "cancel2") player.turnOver(); - }, - group: ["spcangni_gain", "spcangni_lose"], - subSkill: { - gain: { - audio: "zhuikong", - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - usable: 1, - filter(event, player) { - return ( - player.isTurnedOver() && - player != _status.currentPhase && - event.getg(player).length > 0 - ); - }, - check(event, player) { - return get.attitude(player, _status.currentPhase) > 0; - }, - logTarget() { - return _status.currentPhase; - }, - prompt2: "令该角色摸一张牌", - content() { - _status.currentPhase.draw(); - }, - }, - lose: { - audio: "zhuikong", - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter(event, player) { - if (event.name == "gain" && player == event.player) return false; - var evt = event.getl(player); - if (!evt || !evt.cards2 || !evt.cards2.length) return false; - return ( - player.isTurnedOver() && - player != _status.currentPhase && - _status.currentPhase.countCards("he") > 0 - ); - }, - check(event, player) { - var target = _status.currentPhase; - var att = get.attitude(player, target); - if ( - target.countCards("e", function (card) { - return get.value(card, target) <= 0; - }) - ) - return att > 0; - return att < 0; - }, - logTarget() { - return _status.currentPhase; - }, - prompt2: "令该角色弃置一张牌", - content() { - _status.currentPhase.chooseToDiscard("he", true); - }, - }, - }, - }, - spmixin: { - audio: "qiuyuan", - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("h") > 0 && game.countPlayer() > 2; - }, - filterCard: true, - filterTarget: lib.filter.notMe, - position: "h", - selectTarget: 2, - targetprompt: ["拿牌打人", "被打"], - multitarget: true, - delay: false, - discard: false, - lose: false, - check(card) { - if (card.name == "sha") return 4; - return 4 - get.value(card); - }, - content() { - "step 0"; - player.give(cards, targets[0]); - "step 1"; - if (!targets[0].isIn() || !targets[1].isIn()) { - event.finish(); - return; - } - 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]) + - "使用一张【杀】,或令其观看并获得你的一张手牌") - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", targets[1]); - "step 2"; - if (!result.bool && targets[0].countCards("h")) - targets[1].gainPlayerCard(targets[0], "visible", "h", true); - }, - ai: { - order: 1, - expose: 0.1, - result: { - target(player, target) { - var card = ui.selected.cards[0]; - if (!card) return 0; - if (ui.selected.targets.length == 0) { - if (card.name == "sha" || target.hasSha()) return 2; - if (get.value(card, target) < 0) return -2; - return 0; - } - var target1 = ui.selected.targets[0]; - if ( - (card.name == "sha" || target1.hasSha()) && - get.effect(target, { name: "sha" }, target1, target1) > 0 - ) - return get.effect(target, { name: "sha" }, target1, target); - return 1.5; - }, - }, - }, - }, - spfengyin: { - audio: "moukui", - trigger: { global: "phaseZhunbeiBegin" }, - direct: true, - filter(event, player) { - return ( - player != event.player && - event.player.hp >= player.hp && - player.countCards("h", function (card) { - if (_status.connectMode) return true; - return get.name(card, player) == "sha"; - }) > 0 - ); - }, - content() { - "step 0"; - player - .chooseCard( - "h", - get.prompt("spfengyin", trigger.player), - "交给该角色一张【杀】并令其跳过出牌阶段和弃牌阶段", - function (card, player) { - return get.name(card, player) == "sha"; - } - ) - .set("ai", function (card) { - if (_status.event.goon) return 5 - get.value(card); - return 0; - }) - .set( - "goon", - (function () { - if (get.attitude(player, trigger.player) >= 0) return false; - if (trigger.player.countCards("hs") < trigger.player.hp) return false; - return true; - })() - ); - "step 1"; - if (result.bool) { - var target = trigger.player; - player.logSkill("spfengyin", target); - player.give(result.cards, target, "give"); - target.skip("phaseUse"); - target.skip("phaseDiscard"); - } - }, - }, - spchizhong: { - mod: { - maxHandcardBase(player, num) { - return player.maxHp; - }, - }, - trigger: { global: "dieAfter" }, - forced: true, - content() { - player.gainMaxHp(); - }, - }, - fenxin_old: { - mode: ["identity"], - trigger: { source: "dieBegin" }, - init(player) { - player.storage.fenxin = false; - }, - intro: { - content: "limited", - }, - skillAnimation: "epic", - animationColor: "fire", - unique: true, - limited: true, - audio: 2, - mark: true, - filter(event, player) { - if (player.storage.fenxin) return false; - return ( - event.player.identity != "zhu" && - player.identity != "zhu" && - player.identity != "mingzhong" && - event.player.identity != "mingzhong" - ); - }, - check(event, player) { - if (player.identity == event.player.identity) return Math.random() < 0.5; - var stat = get.situation(); - switch (player.identity) { - case "fan": - if (stat < 0) return false; - if (stat == 0) return Math.random() < 0.6; - return true; - case "zhong": - if (stat > 0) return false; - if (stat == 0) return Math.random() < 0.6; - return true; - case "nei": - if (event.player.identity == "fan" && stat < 0) return true; - if (event.player.identity == "zhong" && stat > 0) return true; - if (stat == 0) return Math.random() < 0.7; - return false; - } - return false; - }, - prompt(event, player) { - return "焚心:是否与" + get.translation(event.player) + "交换身份?"; - }, - content() { - game.broadcastAll( - function (player, target, shown) { - var identity = player.identity; - player.identity = target.identity; - if (shown || player == game.me) { - player.setIdentity(); - } - target.identity = identity; - }, - player, - trigger.player, - trigger.player.identityShown - ); - player.line(trigger.player, "green"); - player.storage.fenxin = true; - player.awakenSkill("fenxin_old"); - }, - }, - }, - characterIntro: { - sunwukong: - "孙悟空是中国古典小说《西游记》的主人公,也是中国神话中的民俗神祇之一,明代百回本《西游记》书中最为深入人心的形象之一。《西游记》中的孙悟空本是天地生成的一个石猴,率领群猴在花果山水帘洞过着逍遥自在的日子,后来为学习长生的法术而拜菩提祖师为师,学会了七十二变和筋斗云等绝技。后来他前往东海龙宫夺取如意金箍棒,又大闹地府勾了生死簿,惊动天庭,天庭两次派兵征讨花果山,仍然降他不得,只好请西天如来佛祖前来助阵。如来佛祖以五行山将悟空压在山下五百年。五百年后,悟空在观音菩萨的指点下拜唐僧为师,并跟随唐僧前往西天求取真经。路上唐僧又收了猪八戒、沙和尚两个徒弟,众人在途中斩妖除魔、历经磨难,终于取得真经,修成正果。", - longwang: - "东海龙王,名敖广,是中国古代神话传说中的龙族之王,为“四海龙王”之首,亦为所有水族之王。统治东海之洋,主宰着雨水、雷鸣、洪灾、海潮、海啸等。曾下陷东京、水淹陈塘关(影视设定)。在中国以东方为尊位,按周易来说东为阳,故此东海龙王排第一便是理所应当。常记载于《西游记》《封神演义》《三教搜神大全》等文学典籍。东海龙王居于东海的海底水晶宫(花果山瀑布顺流可直抵龙宫)。虽为司雨之神,但其保持着较大的特殊自由性,人间降雨由其它江河湖井龙王完成,很少需要东海龙王亲自降雨。海洋管辖之权为龙王所有,天庭一般任其自治。", - taoshen: - "涛神,是司掌钱塘江的神,传说其原型为春秋战国时期的吴国大臣伍子胥。伍子胥从楚国投奔吴国,为吴国立下了汗马功劳;但吴王夫差听信太宰伯嚭的谗言,逐渐疏远了伍子胥,最后还赐死了他。伍子胥含冤身亡,十分悲愤,做出了吴国灭亡的预言后自杀。暴怒的夫差下令用皮革包裹住伍子胥的尸身,在五月五日这天丢进钱塘江。百姓可怜伍子胥忠于吴王却遭受惨死,因此将五月五日这一天定为节日,以此纪念伍子胥,这也是端午节的来历之一。", - libai: "李白(701年2月28日—762年12月),字太白,号青莲居士,祖籍陇西成纪(今甘肃省秦安县),出生于蜀郡绵州昌隆县(一说出生于西域碎叶)。唐朝伟大的浪漫主义诗人,凉武昭王李暠九世孙。
    为人爽朗大方,乐于交友,爱好饮酒作诗,名列“酒中八仙”。曾经得到唐玄宗李隆基赏识,担任翰林学士,赐金放还,游历全国,先后迎娶宰相许圉师、宗楚客的孙女。唐肃宗即位后,卷入永王之乱,流放夜郎,辗转到达当涂县令李阳冰家。上元二年,去世,时年六十二。
    著有《李太白集》,代表作有《望庐山瀑布》《行路难》《蜀道难》《将进酒》《早发白帝城》等。李白所作词赋,就其开创意义及艺术成就而言,享有极为崇高的地位,后世誉为“诗仙”,与诗圣杜甫并称“李杜”。", - sunyang: - "孙杨,1991年12月1日生于浙江杭州,男子1500米自由泳世界纪录保持者,男子400米自由泳奥运会纪录保持者。年伦敦奥运会男子400米自由泳、男子1500米自由泳冠军;2016年里约奥运会男子200米自由泳冠军。孙杨是世界泳坛历史上唯一一位男子200米自由泳、男子400米自由泳、男子1500米自由泳的奥运会世锦赛大满贯冠军得主,史上唯一一位男子400米自由泳世锦赛四连冠,唯一一位男子800米自由泳世锦赛三连冠,男子自由泳个人单项金牌数居世界第一。", - yeshiwen: - "叶诗文,1996年3月1日生于浙江省杭州市,中国女子游泳队运动员,女子200米混合泳奥运会纪录保持者。叶诗文是中国泳坛首位集奥运会、长池世锦赛、短池世锦赛、游泳世界杯、亚运会、全运会冠军于一身的运动员,成为中国泳坛首个金满贯。2010年广州亚运会女子200米和400米个人混合泳冠军。2011年上海世界游泳锦标赛女子200米混合泳冠军。2012年伦敦奥运会女子200米混合泳、400米混合泳冠军。2012年伊斯坦布尔短池世锦赛女子200米混合泳冠军。2013年辽宁全运会女子200米、400米混合泳冠军。2016年里约奥运会女子200米混合泳第八名。2017年天津全运会女子200米混合泳冠军。2019年光州世界游泳锦标赛女子200米混合泳亚军、女子400米混合泳亚军。2018年1月30日,当选为浙江省出席第十三届全国人民代表大会代表。2019年7月28日,2019年韩国光州游泳世锦赛,叶诗文以4分32秒07获得亚军。2021年9月19日,叶诗文获得第十四届全国运动会游泳女子4×200米混合泳接力金牌。9月22日,叶诗文获得全运会女子200米个人混合泳银牌。", - jiben: "吉本(?—218年),东汉末年太医令。建安二十三年春正月,时金祎自以世为汉臣,睹汉祚将移,谓可季兴,乃喟然发愤,遂与太医令本、少府耿纪、司直韦晃、本子邈、邈弟穆等结谋攻许,杀曹公长史王必,南援刘备。后必营,必与典农中郎将严匡讨斩之。在《三国演义》中,吉本在此为吉平或吉太,因字称平,故又唤作吉平。曾参与董承等人刺杀曹操的计划,并企图在为曹操治病时毒死曹操,但被曹操识破而遭处刑。之后其子吉邈和吉穆都参与了由耿纪和韦晃等人所发动的反叛曹操的行动,但都失败被杀。", - xiaoyuehankehan: - '小约翰可汗,知乎答主,bilibili知识区up主,其视频以介绍冷门国家和名人为主,因其视频极具特色的幽默风格而知名。代表作包括《奇葩小国》系列和《硬核狠人》系列。昵称里的“小约翰”来源于《纸牌屋》里的主角弗朗西斯·厄克特的外号Little John。家乡在内蒙古通辽市,在《奇葩小国》系列视频中,介绍小国面积和人口时,常用通辽市的面积和人口作为计量单位,后简化为T。1T=6万平方公里或287万人(如:阿富汗面积约为64万平方公里,超过10T)。此梗成为该系列视频的特色之一,可汗也因此被称为“通辽可汗”。', - zhutiexiong: - "朱铁雄,福建莆田人,1994年出生,短视频创作者。中国魔法少年的英雄梦,国风变装的热血与浪漫。抖音年度高光时刻作者,国风变装现象级人物。创玩节期间化身三国杀武将,来一场热血变身!", - nezha: "哪吒是中国神话中的民俗神之一,在古典名著《西游记》《封神演义》等及其衍生作品中也多有登场。传说中,哪吒是托塔天王李靖的第三子。哪吒之母怀胎三年,而哪吒出生之时是一个肉球,李靖惊怒之下,用剑劈开了肉球,而哪吒就在肉球中。哪吒广泛流传于道教以及民间传说中,被称为三坛海会大神、威灵显圣大将军、中坛元帅等,民间俗称“三太子”,又常冠其父姓,称为“李哪吒”。哪吒的原型为佛教护法神“那咤”。在不同作品的设定中,哪吒的师承关系有所不同,比如《封神演义》中,哪吒是太乙真人的弟子、元始天尊的徒孙,而《西游记》之中,哪吒则是释迦牟尼(如来佛祖)的弟子。在传说中,哪吒的形象常被形容为可化作三头六臂(封神之中是三头八臂),使用多种武器战斗。比如,《封神演义》中哪吒使用的武器(法宝)为乾坤圈、混天绫、火尖枪和风火轮等,西游记中是斩妖剑、砍妖刀、缚妖索、降妖杵、绣球儿、火轮儿。而哪吒第一次死后被其师父(太乙真人或如来佛祖)以莲花和莲藕复活。", - }, - card: { - ruyijingubang: { - fullskin: true, - derivation: "sunwukong", - type: "equip", - subtype: "equip1", - cardcolor: "heart", - skills: ["ruyijingubang_skill", "ruyijingubang_effect"], - equipDelay: false, - distance: { - attackFrom: -2, - attackRange: (card, player) => { - return player.storage.ruyijingubang_skill || 3; - }, - }, - onEquip() { - if (!card.storage.ruyijingubang_skill) card.storage.ruyijingubang_skill = 3; - player.storage.ruyijingubang_skill = card.storage.ruyijingubang_skill; - player.markSkill("ruyijingubang_skill"); - }, - }, - }, - dynamicTranslate: { - dcjianxiong(player) { - return ( - "当你受到伤害后,你可以摸" + - get.cnNumber(player.countMark("dcjianxiong") + 1) + - "张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1(至多为5)。" - ); - }, - }, - translate: { - old_lingju: "SP灵雎", - old_lingju_prefix: "SP", - fenxin_old: "焚心", - fenxin_old_info: - "限定技,当你杀死一名非主公角色时,你可以与其交换未翻开的身份牌。(你的身份为主公时不能发动此技能)", - sp_fuwan: "SP伏完", - sp_fuwan_prefix: "SP", - spfengyin: "奉印", - spfengyin_info: - "其他角色的回合开始时,若其体力值不少于你,你可以交给其一张【杀】,令其跳过出牌阶段和弃牌阶段。", - spchizhong: "持重", - spchizhong_info: "锁定技,你的手牌上限等于体力上限;其他角色死亡时,你加1点体力上限。", - sp_fuhuanghou: "SP伏寿", - sp_fuhuanghou_prefix: "SP", - spcangni: "藏匿", - spcangni_info: - "弃牌阶段开始时,你可以回复1点体力或摸两张牌,然后将你的武将牌翻面;其他角色的回合内,当你获得(每回合限一次)/失去一次牌时,若你的武将牌背面朝上,你可以令该角色摸/弃置一张牌。", - spmixin: "密信", - spmixin_info: - "出牌阶段限一次,你可以将一张手牌交给一名其他角色,该角色须对你选择的另一名角色使用一张无距离限制的【杀】,否则你选择的角色观看其手牌并获得其中一张。", - sp_jiben: "SP吉本", - sp_jiben_prefix: "SP", - spduanzhi: "断指", - spduanzhi_info: "当你成为其他角色使用的牌的目标后,你可以弃置其至多两张牌,然后失去1点体力。", - spduyi: "毒医", - spduyi2: "毒医", - spduyi_info: - "出牌阶段限一次,你可以亮出牌堆顶的一张牌并交给一名角色,若此牌为黑色,该角色不能使用或打出手牌,直到回到结束。", - sp_mushun: "SP穆顺", - sp_mushun_prefix: "SP", - libai: "李白", - dclbjiuxian: "酒仙", - dclbjiuxian_info: "①你可以将额定目标数大于1的锦囊牌当做【酒】使用。②你使用【酒】无次数限制。", - dcshixian: "诗仙", - dcshixian_yayun: "押韵", - dcshixian_info: - "当你使用一张牌时,若此牌的牌名与你于本局游戏使用的上一张牌的牌名押韵,则你可以摸一张牌,并令此牌额外结算一次。", - taoshen: "涛神", - dcnutao: "怒涛", - dcnutao_info: - "锁定技。①当你使用锦囊牌指定第一个目标时,若目标角色包含其他角色,你随机对其中一名其他目标角色造成1点雷电伤害。②当你于出牌阶段造成雷电伤害后,你于此阶段使用【杀】的次数上限+1。", - sunwukong: "孙悟空", - dcjinjing: "金睛", - dcjinjing_info: "锁定技。其他角色的手牌对你可见。", - dccibei: "慈悲", - dccibei_info: "每回合每名角色限一次。当你对其他角色造成伤害时,你可以防止此伤害,然后摸五张牌。", - dcruyi: "如意", - dcruyi_info: - "锁定技。①游戏开始时,你将【如意金箍棒】置入装备区。②你手牌区内的武器牌均视为【杀】,且你不是武器牌的合法目标。③当你即将失去【如意金箍棒】或即将废除武器栏时,取消之。④你不能将装备区内的【如意金箍棒】当做其他牌使用或打出。", - ruyijingubang: "如意金箍棒", - // ruyijingubang_skill:'如意', - ruyijingubang_skill: "如意金箍棒", - ruyijingubang_effect: "如意金箍棒", - ruyijingubang_info: - "出牌阶段限一次。你可以将此牌的实际攻击范围调整为1~4内的任意整数。你根据此牌的实际攻击范围拥有对应的效果:
  • ⑴你使用【杀】无次数限制。
  • ⑵你使用的【杀】伤害+1。
  • ⑶你使用的【杀】不可被响应。
  • ⑷你使用【杀】选择目标后,可以增加一个额外目标。", - longwang: "龙王", - dclonggong: "龙宫", - dclonggong_info: - "每回合限一次。当你受到伤害时,你可以防止此伤害,然后令伤害来源从牌堆中获得一张装备牌。", - dcsitian: "司天", - dcsitian_info: - "出牌阶段,你可以弃置两张颜色不同的手牌。系统从所有天气中随机选择两个,你观看这些天气并选择一个执行。
  • 烈日:你对其他角色依次造成1点火属性伤害。
  • 雷电:你令其他角色各进行一次判定。若结果为♠2~9,则其受到3点无来源雷属性伤害。
  • 大浪:你弃置其他角色装备区内的所有牌(装备区内没有牌的角色改为失去1点体力)。
  • 暴雨:你弃置一名角色的所有手牌。若其没有手牌,则改为令其失去1点体力。
  • 大雾:你令所有其他角色获得如下效果:当其使用下一张基本牌时,取消之。", - sunyang: "孙杨", - clbshuijian: "水箭", - clbshuijian_info: - "摸牌阶段开始时,你可以令额定摸牌数+X(X为你装备区内牌数的一半+1,且向下取整)。", - yeshiwen: "叶诗文", - clbjisu: "急速", - clbjisu_info: - "判定阶段开始前,你可以跳过本回合的判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】。", - clbshuiyong: "水泳", - clbshuiyong_info: "锁定技。当你受到火属性伤害时,取消之。", - xiaoyuehankehan: "小约翰可汗", - dctongliao: "通辽", - dctongliao_info: - "①摸牌阶段结束时,你可以选择一张点数最小的手牌,将此牌标记为“通辽”。②当你失去一张具有“通辽”标签的牌时,你摸X张牌(X为此牌点数)。", - dcwudao: "悟道", - dcwudao_info: - "当你使用牌结算结束后,若你使用的上一张牌与此牌类型相同,则你可以于本回合内获得如下效果:当你于回合内使用该类型的牌时,你令此牌不可被响应且伤害值基数+1。", - zhutiexiong: "朱铁雄", - wu_zhutiexiong: "朱铁雄", - dcbianzhuang: "变装", - dcbianzhuang_info: - "①出牌阶段限一次,你可以从系统随机选择的两个技能中获得一个,并视为使用一张【杀】(无距离次数限制),然后失去以此法获得的技能。②当你使用装备牌后,你清空此技能的发动次数记录。③当你发动〖变装①〗后,若你发动〖变装①〗的次数大于2,则你将武将牌变更为诸葛亮,并将系统选择的技能数改为三个。", - dc_caocao: "经典曹操", - dc_caocao_prefix: "经典", - dcjianxiong: "奸雄", - dcjianxiong_info: - "当你受到伤害后,你可以摸一张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1(至多为5)。", - dc_liubei: "经典刘备", - dc_liubei_prefix: "经典", - dcrende: "仁德", - dcrende_info: "出牌阶段每名角色限一次。你可以获得一名其他角色两张手牌,然后视为使用一张基本牌。", - dc_sunquan: "经典孙权", - dc_sunquan_prefix: "经典", - dczhiheng: "制衡", - dczhiheng_info: - "①出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。②每回合每名角色限一次。当你对其他角色造成伤害后,你令〖制衡①〗于此回合发动次数上限+1。", - nezha: "哪吒", - dcsantou: "三头", - dcsantou_info: - "锁定技,当你受到伤害时,防止之,然后若以下有条件成立,你失去1点体力:1.你于本回合此前以此法防止过该伤害来源的伤害,且你的体力值不小于3;2.本次伤害为属性伤害,且你的体力值为2;3.本次伤害的渠道为红色的牌,且你的体力值为1。", - dcfaqi: "法器", - dcfaqi_info: - "当你于出牌阶段使用装备牌结算结束后,你视为使用一张本回合未以此法使用过的普通锦囊牌。", - dc_sunce: "经典孙策", - dc_sunce_prefix: "经典", - dcshuangbi: "双壁", - dcshuangbi_info: - "出牌阶段限一次,你可以选择一项:①摸X张牌,本回合手牌上限+X;②弃置至多X张牌,随机对其他角色造成等量火焰伤害;③视为使用X张火【杀】或【火攻】。(X为场上存活角色数)", - dc_zhaoyun: "经典神赵云", - dc_zhaoyun_prefix: "经典神", - dclonghun: "龙魂", - dclonghun_info: - "每回合限20次,你可以将你的牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。", - dczhanjiang: "斩将", - dczhanjiang_info: "准备阶段,若场上有【青釭剑】,则你可以获得之。", - - collab_olympic: "OL·伦敦奥运会", - collab_tongque: "OL·铜雀台", - collab_duanwu: "新服·端午畅玩", - collab_decade: "新服·创玩节", - collab_remake: "新服·共创武将", - }, - }; -}); diff --git a/character/collab/card.js b/character/collab/card.js new file mode 100644 index 000000000..b4de04af3 --- /dev/null +++ b/character/collab/card.js @@ -0,0 +1,25 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + ruyijingubang: { + fullskin: true, + derivation: "sunwukong", + type: "equip", + subtype: "equip1", + cardcolor: "heart", + skills: ["ruyijingubang_skill", "ruyijingubang_effect"], + equipDelay: false, + distance: { + attackFrom: -2, + attackRange: (card, player) => { + return player.storage.ruyijingubang_skill || 3; + }, + }, + onEquip() { + if (!card.storage.ruyijingubang_skill) card.storage.ruyijingubang_skill = 3; + player.storage.ruyijingubang_skill = card.storage.ruyijingubang_skill; + player.markSkill("ruyijingubang_skill"); + }, + }, +}; +export default cards; diff --git a/character/collab/character.js b/character/collab/character.js new file mode 100644 index 000000000..99c8fea39 --- /dev/null +++ b/character/collab/character.js @@ -0,0 +1,24 @@ +const characters = { + dc_zhaoyun: ["male", "shen", 1, ["boss_juejing", "dclonghun", "dczhanjiang"], ["shu", "InitFilter:noZhuHp:noZhuSkill"]], + dc_sunce: ["male", "wu", 4, ["dcshuangbi"]], + nezha: ["male", "qun", 3, ["dcsantou", "dcfaqi"], ["InitFilter:noZhuHp"]], + dc_caocao: ["male", "wei", 4, ["dcjianxiong"]], + dc_liubei: ["male", "shu", 4, ["dcrende"]], + dc_sunquan: ["male", "wu", 4, ["dczhiheng"]], + zhutiexiong: ["male", "qun", 3, ["dcbianzhuang"]], + wu_zhutiexiong: ["male", "qun", 3, ["dcbianzhuang"], ["unseen"]], + xiaoyuehankehan: ["male", "qun", 3, ["dctongliao", "dcwudao"]], + libai: ["male", "qun", 3, ["dclbjiuxian", "dcshixian"]], + sunwukong: ["male", "qun", 3, ["dcjinjing", "dccibei", "dcruyi"]], + longwang: ["male", "qun", 3, ["dclonggong", "dcsitian"]], + taoshen: ["male", "qun", 3, ["dcnutao"]], + sunyang: ["male", "wu", 4, ["clbshuijian"]], + yeshiwen: ["female", "wu", 3, ["clbjisu", "clbshuiyong"]], + sp_jiben: ["male", "qun", 3, ["spduanzhi", "spduyi"]], + sp_fuhuanghou: ["female", "qun", 3, ["spcangni", "spmixin"]], + sp_fuwan: ["male", "qun", 3, ["spfengyin", "spchizhong"]], + old_lingju: ["female", "qun", 3, ["jieyuan", "fenxin_old"]], + sp_mushun: ["male", "qun", 4, ["moukui"]], +}; + +export default characters; diff --git a/character/collab/characterFilter.js b/character/collab/characterFilter.js new file mode 100644 index 000000000..55952424e --- /dev/null +++ b/character/collab/characterFilter.js @@ -0,0 +1,13 @@ +const characterFilters = { + old_lingju(mode) { + return mode == "identity"; + }, +}; + +const characterInitFilters = { + dc_zhaoyun(tag) { + if (tag == "noZhuSkill" && (get.mode() != "doudizhu" || _status.mode != "normal")) return false; + }, +}; + +export { characterFilters, characterInitFilters }; diff --git a/character/collab/characterReplace.js b/character/collab/characterReplace.js new file mode 100644 index 000000000..2092d9297 --- /dev/null +++ b/character/collab/characterReplace.js @@ -0,0 +1,3 @@ +const characterReplaces = {}; + +export default characterReplaces; diff --git a/character/collab/dynamicTranslate.js b/character/collab/dynamicTranslate.js new file mode 100644 index 000000000..0caffe703 --- /dev/null +++ b/character/collab/dynamicTranslate.js @@ -0,0 +1,8 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + dcjianxiong(player) { + return "当你受到伤害后,你可以摸" + get.cnNumber(player.countMark("dcjianxiong") + 1) + "张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1(至多为5)。"; + }, +}; +export default dynamicTranslates; diff --git a/character/collab/index.js b/character/collab/index.js new file mode 100644 index 000000000..7e04ed662 --- /dev/null +++ b/character/collab/index.js @@ -0,0 +1,33 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import { characterFilters, characterInitFilters } from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "collab", + connect: true, + character: { ...characters }, + characterSort: { + collab: characterSort, + }, + characterFilter: { ...characterFilters }, + characterInitFilter: { ...characterInitFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/collab/intro.js b/character/collab/intro.js new file mode 100644 index 000000000..fd7369d05 --- /dev/null +++ b/character/collab/intro.js @@ -0,0 +1,14 @@ +const characterIntro = { + sunwukong: "孙悟空是中国古典小说《西游记》的主人公,也是中国神话中的民俗神祇之一,明代百回本《西游记》书中最为深入人心的形象之一。《西游记》中的孙悟空本是天地生成的一个石猴,率领群猴在花果山水帘洞过着逍遥自在的日子,后来为学习长生的法术而拜菩提祖师为师,学会了七十二变和筋斗云等绝技。后来他前往东海龙宫夺取如意金箍棒,又大闹地府勾了生死簿,惊动天庭,天庭两次派兵征讨花果山,仍然降他不得,只好请西天如来佛祖前来助阵。如来佛祖以五行山将悟空压在山下五百年。五百年后,悟空在观音菩萨的指点下拜唐僧为师,并跟随唐僧前往西天求取真经。路上唐僧又收了猪八戒、沙和尚两个徒弟,众人在途中斩妖除魔、历经磨难,终于取得真经,修成正果。", + longwang: "东海龙王,名敖广,是中国古代神话传说中的龙族之王,为“四海龙王”之首,亦为所有水族之王。统治东海之洋,主宰着雨水、雷鸣、洪灾、海潮、海啸等。曾下陷东京、水淹陈塘关(影视设定)。在中国以东方为尊位,按周易来说东为阳,故此东海龙王排第一便是理所应当。常记载于《西游记》《封神演义》《三教搜神大全》等文学典籍。东海龙王居于东海的海底水晶宫(花果山瀑布顺流可直抵龙宫)。虽为司雨之神,但其保持着较大的特殊自由性,人间降雨由其它江河湖井龙王完成,很少需要东海龙王亲自降雨。海洋管辖之权为龙王所有,天庭一般任其自治。", + taoshen: "涛神,是司掌钱塘江的神,传说其原型为春秋战国时期的吴国大臣伍子胥。伍子胥从楚国投奔吴国,为吴国立下了汗马功劳;但吴王夫差听信太宰伯嚭的谗言,逐渐疏远了伍子胥,最后还赐死了他。伍子胥含冤身亡,十分悲愤,做出了吴国灭亡的预言后自杀。暴怒的夫差下令用皮革包裹住伍子胥的尸身,在五月五日这天丢进钱塘江。百姓可怜伍子胥忠于吴王却遭受惨死,因此将五月五日这一天定为节日,以此纪念伍子胥,这也是端午节的来历之一。", + libai: "李白(701年2月28日—762年12月),字太白,号青莲居士,祖籍陇西成纪(今甘肃省秦安县),出生于蜀郡绵州昌隆县(一说出生于西域碎叶)。唐朝伟大的浪漫主义诗人,凉武昭王李暠九世孙。
    为人爽朗大方,乐于交友,爱好饮酒作诗,名列“酒中八仙”。曾经得到唐玄宗李隆基赏识,担任翰林学士,赐金放还,游历全国,先后迎娶宰相许圉师、宗楚客的孙女。唐肃宗即位后,卷入永王之乱,流放夜郎,辗转到达当涂县令李阳冰家。上元二年,去世,时年六十二。
    著有《李太白集》,代表作有《望庐山瀑布》《行路难》《蜀道难》《将进酒》《早发白帝城》等。李白所作词赋,就其开创意义及艺术成就而言,享有极为崇高的地位,后世誉为“诗仙”,与诗圣杜甫并称“李杜”。", + sunyang: "孙杨,1991年12月1日生于浙江杭州,男子1500米自由泳世界纪录保持者,男子400米自由泳奥运会纪录保持者。年伦敦奥运会男子400米自由泳、男子1500米自由泳冠军;2016年里约奥运会男子200米自由泳冠军。孙杨是世界泳坛历史上唯一一位男子200米自由泳、男子400米自由泳、男子1500米自由泳的奥运会世锦赛大满贯冠军得主,史上唯一一位男子400米自由泳世锦赛四连冠,唯一一位男子800米自由泳世锦赛三连冠,男子自由泳个人单项金牌数居世界第一。", + yeshiwen: "叶诗文,1996年3月1日生于浙江省杭州市,中国女子游泳队运动员,女子200米混合泳奥运会纪录保持者。叶诗文是中国泳坛首位集奥运会、长池世锦赛、短池世锦赛、游泳世界杯、亚运会、全运会冠军于一身的运动员,成为中国泳坛首个金满贯。2010年广州亚运会女子200米和400米个人混合泳冠军。2011年上海世界游泳锦标赛女子200米混合泳冠军。2012年伦敦奥运会女子200米混合泳、400米混合泳冠军。2012年伊斯坦布尔短池世锦赛女子200米混合泳冠军。2013年辽宁全运会女子200米、400米混合泳冠军。2016年里约奥运会女子200米混合泳第八名。2017年天津全运会女子200米混合泳冠军。2019年光州世界游泳锦标赛女子200米混合泳亚军、女子400米混合泳亚军。2018年1月30日,当选为浙江省出席第十三届全国人民代表大会代表。2019年7月28日,2019年韩国光州游泳世锦赛,叶诗文以4分32秒07获得亚军。2021年9月19日,叶诗文获得第十四届全国运动会游泳女子4×200米混合泳接力金牌。9月22日,叶诗文获得全运会女子200米个人混合泳银牌。", + jiben: "吉本(?—218年),东汉末年太医令。建安二十三年春正月,时金祎自以世为汉臣,睹汉祚将移,谓可季兴,乃喟然发愤,遂与太医令本、少府耿纪、司直韦晃、本子邈、邈弟穆等结谋攻许,杀曹公长史王必,南援刘备。后必营,必与典农中郎将严匡讨斩之。在《三国演义》中,吉本在此为吉平或吉太,因字称平,故又唤作吉平。曾参与董承等人刺杀曹操的计划,并企图在为曹操治病时毒死曹操,但被曹操识破而遭处刑。之后其子吉邈和吉穆都参与了由耿纪和韦晃等人所发动的反叛曹操的行动,但都失败被杀。", + xiaoyuehankehan: '小约翰可汗,知乎答主,bilibili知识区up主,其视频以介绍冷门国家和名人为主,因其视频极具特色的幽默风格而知名。代表作包括《奇葩小国》系列和《硬核狠人》系列。昵称里的“小约翰”来源于《纸牌屋》里的主角弗朗西斯·厄克特的外号Little John。家乡在内蒙古通辽市,在《奇葩小国》系列视频中,介绍小国面积和人口时,常用通辽市的面积和人口作为计量单位,后简化为T。1T=6万平方公里或287万人(如:阿富汗面积约为64万平方公里,超过10T)。此梗成为该系列视频的特色之一,可汗也因此被称为“通辽可汗”。', + zhutiexiong: "朱铁雄,福建莆田人,1994年出生,短视频创作者。中国魔法少年的英雄梦,国风变装的热血与浪漫。抖音年度高光时刻作者,国风变装现象级人物。创玩节期间化身三国杀武将,来一场热血变身!", + nezha: "哪吒是中国神话中的民俗神之一,在古典名著《西游记》《封神演义》等及其衍生作品中也多有登场。传说中,哪吒是托塔天王李靖的第三子。哪吒之母怀胎三年,而哪吒出生之时是一个肉球,李靖惊怒之下,用剑劈开了肉球,而哪吒就在肉球中。哪吒广泛流传于道教以及民间传说中,被称为三坛海会大神、威灵显圣大将军、中坛元帅等,民间俗称“三太子”,又常冠其父姓,称为“李哪吒”。哪吒的原型为佛教护法神“那咤”。在不同作品的设定中,哪吒的师承关系有所不同,比如《封神演义》中,哪吒是太乙真人的弟子、元始天尊的徒孙,而《西游记》之中,哪吒则是释迦牟尼(如来佛祖)的弟子。在传说中,哪吒的形象常被形容为可化作三头六臂(封神之中是三头八臂),使用多种武器战斗。比如,《封神演义》中哪吒使用的武器(法宝)为乾坤圈、混天绫、火尖枪和风火轮等,西游记中是斩妖剑、砍妖刀、缚妖索、降妖杵、绣球儿、火轮儿。而哪吒第一次死后被其师父(太乙真人或如来佛祖)以莲花和莲藕复活。", +}; + +export default characterIntro; diff --git a/character/collab/pinyin.js b/character/collab/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/collab/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/collab/skill.js b/character/collab/skill.js new file mode 100644 index 000000000..450c2fb5f --- /dev/null +++ b/character/collab/skill.js @@ -0,0 +1,1916 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //新InitFilter测试高达一号 + //打赢复活赛的牢达[哭] + dclonghun: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + prompt: "将♦牌当做火【杀】,♥牌当做【桃】,♣牌当做【闪】,♠牌当做【无懈可击】使用或打出", + viewAs(cards, player) { + var name; + var nature = null; + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "fire"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; + } + if (name) return { name: name, nature: nature }; + return null; + }, + check(card) { + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; + var name2; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) { + max = temp; + name2 = map[name]; + } + } + } + if (name2 == get.suit(card, player)) return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); + return 0; + } + return 1; + }, + position: "hes", + filterCard(card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; + if (name == "diamond" && filter({ name: "sha", cards: [card], nature: "fire" }, player, event)) return true; + if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) return true; + if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; + return false; + }, + filter(event, player) { + var filter = event.filterCard; + if (filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && player.countCards("hes", { suit: "diamond" })) return true; + if (filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && player.countCards("hes", { suit: "club" })) return true; + if (filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && player.countCards("hes", { suit: "heart" })) return true; + if (filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && player.countCards("hes", { suit: "spade" })) return true; + return false; + }, + usable: 20, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + if ((player.getStat("skill").dclonghun || 0) >= 20) return false; + var name; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; + } + if (!player.countCards("hes", { suit: name })) return false; + }, + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; + } + } + max /= 1.1; + return max; + } + return 2; + }, + }, + hiddenCard(player, name) { + if ((player.getStat("skill").dclonghun || 0) >= 20) return false; + if (name == "wuxie" && _status.connectMode && player.countCards("hes") > 0) return true; + if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; + if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; + }, + }, + dczhanjiang: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return game.hasPlayer(target => { + return target.countCards("ej", card => get.name(card, false) == "qinggang" || get.name(card, get.owner(card)) == "qinggang"); + }); + }, + content() { + let cards = [], + targets = game.filterPlayer(target => { + return target.countCards("ej", card => get.name(card, false) == "qinggang" || get.name(card, get.owner(card)) == "qinggang"); + }); + targets.forEach(target => cards.addArray(target.getCards("ej", card => get.name(card, false) == "qinggang" || get.name(card, get.owner(card)) == "qinggang"))); + player.gain(cards, "give"); + }, + }, + //孙策 + //双壁=100%技能周瑜+100%原画孙策 + dcshuangbi: { + audio: 2, + enable: "phaseUse", + usable: 1, + *content(event, map) { + var player = map.player, + num = game.countPlayer(); + var result = yield player + .chooseControl() + .set("choiceList", ["摸" + get.cnNumber(num) + "张牌,本回合手牌上限+" + parseFloat(num), "弃置至多" + get.cnNumber(num) + "张牌,随机对其他角色造成等量火焰伤害", "视为使用" + get.cnNumber(num) + "张火【杀】或【火攻】"]) + .set("ai", () => { + var player = _status.event.player, + card = { name: "sha", nature: "fire" }; + if (!game.hasPlayer(target => player.canUse(card, target) && get.effect(target, card, player, player) > 0)) return 0; + return 2; + }); + player.flashAvatar("dcshuangbi", ["re_zhouyu", "shen_zhouyu", "dc_sb_zhouyu"][result.index]); + switch (result.index) { + case 0: + player.draw(num); + player.addTempSkill("dcshuangbi_effect"); + player.addMark("dcshuangbi_effect", num, false); + break; + case 1: + var result2 = yield player.chooseToDiscard("双壁:弃置至多" + get.cnNumber(num) + "张牌,随机对其他角色造成等量火焰伤害", [1, num], "he").set("ai", card => 1 / (get.value(card) || 0.5)); + if (result2.bool) { + var map = {}, + sum = result2.cards.length; + var targets = game.filterPlayer(target => target != player); + if (targets.length) { + while (sum) { + sum--; + var target = targets.randomGet(); + player.line(target); + target.damage(1, "fire"); + game.delayx(); + } + } + } + break; + case 2: + while (num && game.hasPlayer(target => player.canUse({ name: "sha", nature: "fire" }, target) || player.canUse({ name: "huogong" }, target))) { + num--; + var list = []; + if (game.hasPlayer(target => player.canUse({ name: "sha", nature: "fire" }, target))) list.push(["基本", "", "sha", "fire"]); + if (game.hasPlayer(target => player.canUse({ name: "huogong" }, target))) list.push(["锦囊", "", "huogong"]); + var result2 = yield player.chooseButton(["双壁:请选择你要使用的牌", [list, "vcard"]], true).set("ai", button => (button.link[2] == "sha" ? 1 : 0)); + if (result2.bool) { + var card = { + name: result2.links[0][2], + nature: result2.links[0][3], + }; + yield player.chooseUseTarget(true, card, false); + } else break; + } + break; + } + }, + ai: { + order: 9, + result: { player: 1 }, + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + intro: { content: "手牌上限+#" }, + mod: { + maxHandcard(player, num) { + return num + player.countMark("dcshuangbi_effect"); + }, + }, + }, + }, + }, + //哪吒 + dcsantou: { + audio: 2, + trigger: { player: "damageBegin4" }, + forced: true, + *content(event, map) { + var player = map.player, + trigger = map.trigger; + var source = trigger.source; + trigger.cancel(); + var hp = player.getHp(); + var lose = false; + if (hp >= 3) { + if ( + player.hasHistory("useSkill", evt => { + var evtx = evt.event; + return evt.skill == "dcsantou" && evtx.getTrigger().source == source && evtx.getParent(2) != trigger; + }) + ) + lose = true; + } else if (hp == 2) { + if (trigger.hasNature()) lose = true; + } else if (hp == 1) { + if (trigger.card && get.color(trigger.card) == "red") lose = true; + } + if (lose) player.loseHp(); + }, + ai: { + filterDamage: true, + skillTagFilter(player, tag, arg) { + if (arg && arg.player && arg.player.hasSkillTag("jueqing", false, player)) return false; + }, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (player._dcsantou_temp) return; + if (get.tag(card, "damage")) { + const hp = target.getHp(); + player._dcsantou_temp = true; + const losehp = get.effect(target, { name: "losehp" }, target, target) / get.attitude(target, target); + delete player._dcsantou_temp; + if (hp >= 3) { + if (target.hasHistory("useSkill", evt => evt.skill == "dcsantou" && evt.event.getTrigger().source == player)) return [0, losehp, 0, 0]; + else if (get.attitude(player, target) < 0) { + let hs = player.getCards("hs", i => { + return i !== card && (!card.cards || !card.cards.includes(i)); + }), + num = player.getCardUsable("sha"); + if (card.name === "sha") num--; + hs = hs.filter(i => { + if (!player.canUse(i, target)) return false; + if (get.tag(card, "damage") && get.name(i, player) !== "sha") return true; + if (num) { + num--; + return true; + } + return false; + }).length; + if ( + player.hasSkillTag("damage", null, { + target: target, + }) + ) + hs++; + if (!hs) return "zeroplayertarget"; + num = 1 - 2 / 3 / hs; + return [num, 0, num, 0]; + } + } + if ((hp == 2 && get.tag(card, "natureDamage")) || (hp == 1 && typeof card == "object" && get.color(card) == "red")) return [0, losehp, 0, 0]; + return "zeroplayertarget"; + } + }, + }, + }, + }, + dcfaqi: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + if (get.type(event.card) != "equip") return false; + if (!player.isPhaseUsing()) return false; + for (const name of lib.inpile) { + if (get.type(name) != "trick") continue; + if (!player.hasStorage("dcfaqi", name) && player.hasUseTarget({ name: name, isCard: true })) return true; + } + return false; + }, + direct: true, + *content(event, map) { + var player = map.player; + var list = get.inpileVCardList(info => { + if (info[0] != "trick") return false; + var name = info[2]; + return !player.hasStorage("dcfaqi", name) && player.hasUseTarget({ name: name, isCard: true }); + }); + if (list.length) { + var result = yield player.chooseButton(["法器:视为使用一张普通锦囊牌", [list, "vcard"]], true).set("ai", button => { + return get.player().getUseValue({ name: button.link[2] }); + }); + if (result.bool) { + var name = result.links[0][2]; + if (!player.storage.dcfaqi) player.when({ global: "phaseAfter" }).then(() => delete player.storage.dcfaqi); + player.markAuto("dcfaqi", name); + player.chooseUseTarget({ name: name, isCard: true }, true, false).logSkill = "dcfaqi"; + } + } else event.finish(); + }, + ai: { + reverseEquip: true, + }, + }, + //隅泣曹操 + dcjianxiong: { + audio: "rejianxiong", + trigger: { + player: "damageEnd", + }, + content() { + "step 0"; + if (get.itemtype(trigger.cards) == "cards" && get.position(trigger.cards[0], true) == "o") { + player.gain(trigger.cards, "gain2"); + } + player.draw(player.countMark("dcjianxiong") + 1, "nodelay"); + "step 1"; + if (player.countMark("dcjianxiong") < 4) player.addMark("dcjianxiong", 1, false); + }, + marktext: "雄", + intro: { + markcount(storage, player) { + return player.countMark("dcjianxiong") + 1; + }, + content(storage, player) { + return "摸牌数为" + (player.countMark("dcjianxiong") + 1); + }, + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target) { + var cards = card.cards, + evt = _status.event; + if (evt.player == target && card.name == "damage" && evt.getParent().type == "card") cards = evt.getParent().cards.filterInD(); + if (target.hp <= 1) return; + if (get.itemtype(cards) != "cards") return; + for (var i of cards) { + if (get.name(i, target) == "tao") return [1, 5 + player.countMark("dcjianxiong") / 2]; + } + if (get.value(cards, target) >= 7 - player.countMark("dcjianxiong") / 2 + target.getDamagedHp()) return [1, 3 + player.countMark("dcjianxiong") / 2]; + return [1, 0.6 + player.countMark("dcjianxiong") / 2]; + } + }, + }, + }, + }, + //缺德刘备 + dcrende: { + audio: "rerende", + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(current => { + return lib.skill.dcrende.filterTarget(null, player, current); + }); + }, + discard: false, + lose: false, + delay: false, + filterTarget(card, player, target) { + if (player.getStorage("dcrende_targeted").includes(target)) return false; + return player != target && target.countGainableCards(player, "h") > 1; + }, + content() { + "step 0"; + player.addTempSkill("dcrende_targeted", "phaseUseAfter"); + player.markAuto("dcrende_targeted", [target]); + player.gainPlayerCard(target, "h", true, 2); + "step 1"; + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + var card = { name: name, isCard: true }; + if ( + lib.filter.cardUsable(card, player, event.getParent("chooseToUse")) && + game.hasPlayer(current => { + return player.canUse(card, current); + }) + ) { + list.push(["基本", "", name]); + } + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if ( + lib.filter.cardUsable(card, player, event.getParent("chooseToUse")) && + game.hasPlayer(current => { + return player.canUse(card, current); + }) + ) { + list.push(["基本", "", name, nature]); + } + } + } + } + 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(); + } + "step 2"; + 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); + } + }, + subSkill: { + targeted: { + onremove: true, + charlotte: true, + }, + }, + ai: { + fireAttack: true, + order(skill, player) { + return 10; + }, + result: { + target(player, target) { + if (target.hasSkillTag("noh")) return -0.1; + return -2; + }, + }, + threaten: 3, + }, + }, + //会玩孙权 + dczhiheng: { + audio: "rezhiheng", + init: player => { + player.storage.dczhiheng_hit = []; + }, + enable: "phaseUse", + position: "he", + filterCard: lib.filter.cardDiscardable, + discard: false, + lose: false, + delay: false, + selectCard: [1, Infinity], + filter(event, player) { + var skill = player.getStat().skill; + return !skill.dczhiheng || skill.dczhiheng < 1 + player.getStorage("dczhiheng_hit").length; + }, + check(card) { + var player = _status.event.player; + if ( + get.position(card) == "h" && + !player.countCards("h", "du") && + (player.hp > 2 || + !player.countCards("h", function (card) { + return get.value(card) >= 8; + })) + ) { + return 1; + } + return 6 - get.value(card); + }, + group: "dczhiheng_add", + content() { + "step 0"; + player.discard(cards); + event.num = 1; + var hs = player.getCards("h"); + if (!hs.length) event.num = 0; + for (var i = 0; i < hs.length; i++) { + if (!cards.includes(hs[i])) { + event.num = 0; + break; + } + } + "step 1"; + player.draw(event.num + cards.length); + }, + subSkill: { + add: { + audio: 2, + trigger: { + source: "damageSource", + }, + forced: true, + locked: false, + filter(event, player) { + return !player.getStorage("dczhiheng_hit").includes(event.player); + }, + content() { + player.addTempSkill("dczhiheng_hit"); + player.markAuto("dczhiheng_hit", [trigger.player]); + }, + }, + hit: { + charlotte: true, + onremove: player => { + player.storage.dczhiheng_hit = []; + }, + mark: true, + marktext: "衡", + intro: { + markcount(storage) { + if (storage) return storage.length; + return 0; + }, + content: "本回合已对$造成过伤害", + }, + }, + }, + ai: { + order(item, player) { + if ( + player.hasCard(i => { + return get.value(i) > Math.max(6, 9 - player.hp); + }, "he") + ) + return 1; + return 10; + }, + result: { + player: 1, + }, + nokeep: true, + skillTagFilter(player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + player.countSkill("dczhiheng") < 1 + player.getStorage("dczhiheng_hit").length && + player.hasCard(card => { + return get.name(card) !== "tao"; + }, "h") + ); + }, + threaten: 1.55, + }, + }, + //朱铁雄 + dcbianzhuang: { + audio: 2, + enable: "phaseUse", + usable: 1, + content() { + "step 0"; + var list = []; + for (var i in lib.skill.dcbianzhuang.characterMap) { + if (lib.character[i] && get.is.object(lib.skill[lib.skill.dcbianzhuang.characterMap[i]])) list.push(i); + } + var characters = list.randomGets(player.storage.dcbianzhuang_inited ? 3 : 2); + if (!characters.length) { + event.finish(); + return; + } + var skills = characters.map(i => lib.skill.dcbianzhuang.characterMap[i]); + player.chooseControl(skills).set("dialog", ["选择获得一个技能并“变装”", [characters, "character"]]); + "step 1"; + var skill = result.control; + player.addTempSkills(skill, "dcbianzhuangAfter"); + for (var i in lib.skill.dcbianzhuang.characterMap) { + if (lib.skill.dcbianzhuang.characterMap[i] == skill) { + player.flashAvatar("dcbianzhuang", i); + player.popup(skill); + game.log(player, "“变装”为了", "#b" + get.translation(i)); + break; + } + } + player.chooseUseTarget("sha", true, false, "nodistance"); + "step 2"; + if (result.bool && !player.storage.dcbianzhuang_inited) { + player.addMark("dcbianzhuang", 1, false); + if (player.countMark("dcbianzhuang") > 2) { + player.storage.dcbianzhuang_inited = true; + player.reinitCharacter("zhutiexiong", "wu_zhutiexiong"); + } + } + }, + group: "dcbianzhuang_refresh", + ai: { + order: 16, + result: { + player(player) { + if (player.hasValueTarget("sha", false)) return 1; + return 0; + }, + }, + effect: { + target(card, player, target, current) { + if (player == target && player.isPhaseUsing() && get.type(card) == "equip") { + if (player.hasValueTarget("sha", false) && typeof player.getStat("skill").dcbianzhuang == "number") return [1, 3]; + } + }, + }, + }, + subSkill: { + refresh: { + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + return get.type2(event.card, false) == "equip" && typeof player.getStat("skill").dcbianzhuang == "number"; + }, + content() { + var stat = player.getStat("skill"); + delete stat.dcbianzhuang; + }, + }, + }, + characterMap: { + re_zhangchunhua: "rejueqing", + wangshuang: "spzhuilie", + re_machao: "retieji", + ol_weiyan: "xinkuanggu", + re_lvbu: "wushuang", + re_huangzhong: "xinliegong", + ol_pangde: "rejianchu", + ol_zhurong: "lieren", + re_masu: "rezhiman", + re_panzhangmazhong: "reanjian", + mayunlu: "fengpo", + re_quyi: "refuqi", + }, + }, + //小约翰可汗 + dctongliao: { + audio: 3, + trigger: { player: "phaseDrawAfter" }, + direct: true, + locked: false, + filter(event, player) { + return player.countCards("h") > 0; + }, + content() { + "step 0"; + player + .chooseCard("h", get.prompt("dctongliao"), "选择一张牌标记为“通辽”", function (card, player) { + if (card.hasGaintag("dctongliao")) return false; + var num = get.number(card, player); + return !player.hasCard(card2 => { + return card != card2 && get.number(card2, player) < num; + }); + }) + .set("ai", function (card) { + var player = _status.event.player; + return 1 + Math.max(0, player.getUseValue(card, null, true)); + }); + "step 1"; + if (result.bool) { + player.logSkill("dctongliao"); + player.addGaintag(result.cards, "dctongliao"); + game.delayx(); + } + }, + mod: { + aiOrder(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dctongliao")) return num + 0.6; + }, + }, + group: "dctongliao_draw", + subSkill: { + draw: { + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + var evt = event.getl(player); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dctongliao")) return true; + } + return false; + } + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dctongliao")) return true; + } + return false; + }); + }, + forced: true, + content() { + var num = 0; + var cards = trigger.getl(player).hs, + ids = []; + if (trigger.name == "lose") { + for (var i in trigger.gaintag_map) { + if (trigger.gaintag_map[i].includes("dctongliao")) ids.push(i); + } + } else + player.getHistory("lose", function (evt) { + if (trigger != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dctongliao")) ids.push(i); + } + }); + for (var card of cards) { + if (ids.includes(card.cardid)) num += get.number(card, player); + } + if (num > 0) player.draw(num); + }, + }, + }, + }, + dcwudao: { + audio: 3, + trigger: { player: "useCardAfter" }, + frequent: true, + filter(event, player) { + if (player.getStorage("dcwudao_effect").includes(get.type2(event.card, false))) return false; + var history = player.getHistory("useCard"), + index = history.indexOf(event); + if (index < 1) return false; + var evt = history[index - 1]; + return get.type2(event.card, false) == get.type2(evt.card, false); + }, + prompt2(event) { + return "令你本回合使用" + get.translation(get.type2(event.card, false)) + "牌时不可被响应且伤害+1"; + }, + content() { + player.addTempSkill("dcwudao_effect"); + player.markAuto("dcwudao_effect", [get.type2(trigger.card, false)]); + }, + subSkill: { + effect: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + onremove: true, + filter(event, player) { + return player.getStorage("dcwudao_effect").includes(get.type2(event.card, false)); + }, + content() { + if (get.tag(trigger.card, "damage") > 0) trigger.baseDamage++; + trigger.directHit.addArray(game.filterPlayer()); + }, + intro: { content: "已经悟到了$牌" }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (arg && arg.card && player.getStorage("dcwudao_effect").includes(get.type2(arg.card))) return true; + return false; + }, + }, + }, + }, + }, + //叶诗文 + clbjisu: { + audio: 2, + trigger: { player: "phaseJudgeBefore" }, + direct: true, + content() { + "step 0"; + var check = player.countCards("h") > 2; + player + .chooseTarget(get.prompt("clbjisu"), "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }) + .setHiddenSkill("clbjisu"); + "step 1"; + if (result.bool) { + player.useCard({ name: "sha", isCard: true }, result.targets[0], false, "clbjisu"); + trigger.cancel(); + player.skip("phaseDraw"); + } + }, + }, + clbshuiyong: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter(event) { + return event.hasNature("fire"); + }, + forced: true, + content() { + trigger.cancel(); + }, + ai: { + nofire: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "fireDamage")) return "zerotarget"; + }, + }, + }, + }, + //孙杨 + clbshuijian: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + filter(event, player) { + return !event.numFixed; + }, + content() { + var num = 1 + Math.floor(player.countCards("e") / 2); + trigger.num += num; + }, + }, + //李白 + dclbjiuxian: { + audio: 2, + enable: "chooseToUse", + locked: false, + viewAs: { name: "jiu" }, + check: card => 6.5 - get.value(card), + filterCard(card) { + var info = get.info(card); + if (!info || (info.type != "trick" && info.type != "delay")) return false; + if (info.notarget) return false; + if (info.selectTarget != undefined) { + if (Array.isArray(info.selectTarget)) { + if (info.selectTarget[0] < 0) return !info.toself; + return info.selectTarget[0] != 1 || info.selectTarget[1] != 1; + } else { + if (info.selectTarget < 0) return !info.toself; + return info.selectTarget != 1; + } + } + return false; + }, + viewAsFilter(player) { + if (_status.connectMode && player.countCards("hs") > 0) return true; + return player.hasCard(lib.skill.dclbjiuxian.filterCard, "hs"); + }, + ai: { + order: (item, player) => get.order({ name: "jiu" }, player), + }, + mod: { + cardUsable(card) { + if (card.name == "jiu") return Infinity; + }, + }, + }, + dcshixian: { + audio: 2, + trigger: { player: "useCard" }, + //frequent:true, + //direct:true, + locked: false, + filter(event, player) { + var history = player.getAllHistory("useCard"), + index = history.indexOf(event); + if (index < 1) return false; + var evt = history[index - 1]; + return get.is.yayun(get.translation(event.card.name), get.translation(evt.card.name)); + }, + filterx(event) { + if (event.targets.length == 0) return false; + var type = get.type(event.card); + if (type != "basic" && type != "trick") return false; + return true; + }, + prompt2(event, player) { + if (lib.skill.dcshixian.filterx(event)) return "摸一张牌并令" + get.translation(event.card) + "额外结算一次?"; + return "摸一张牌。"; + }, + check(event, player) { + if (lib.skill.dcshixian.filterx(event)) return !get.tag(event.card, "norepeat"); + return true; + }, + content() { + player.draw(); + if (lib.skill.dcshixian.filterx(trigger)) { + trigger.effectCount++; + game.log(trigger.card, "额外结算一次"); + } + }, + mod: { + aiOrder(player, card, num) { + if (typeof card == "object" && !get.tag(card, "norepeat")) { + var history = player.getAllHistory("useCard"); + if (history.length > 0) { + var cardx = history[history.length - 1].card; + if (get.is.yayun(get.translation(cardx.name), get.translation(card.name))) return num + 20; + } + } + }, + }, + init(player) { + player.addSkill("dcshixian_yayun"); + var history = player.getAllHistory("useCard"); + if (history.length) { + player.addGaintag( + player.getCards("h", card => { + return get.is.yayun(get.translation(card.name), get.translation(history[history.length - 1].card.name)); + }), + "dcshixian_yayun" + ); + } + }, + onremove(player) { + player.removeSkill("dcshixian_yayun"); + player.removeGaintag("dcshixian_yayun"); + }, + subSkill: { + yayun: { + charlotte: true, + trigger: { player: "useCard1" }, + filter(event, player) { + return player.countCards("h") > 0; + }, + direct: true, + priority: 11 + 45 + 14 + 19 + 19 + 810, + content() { + "step 0"; + player.removeGaintag("dcshixian_yayun"); + "step 1"; + player.addGaintag( + player.getCards("h", card => { + return get.is.yayun(get.translation(card.name), get.translation(trigger.card.name)); + }), + "dcshixian_yayun" + ); + }, + }, + }, + }, + //龙王 + dclonggong: { + audio: 2, + trigger: { player: "damageBegin4" }, + usable: 1, + filter(event, player) { + return event.source && event.source.isIn(); + }, + logTarget: "source", + check(event, player) { + return get.attitude(player, event.source) >= 0 || player.hp <= Math.max(2, event.num); + }, + content() { + "step 0"; + trigger.cancel(); + "step 1"; + var card = get.cardPile2(function (card) { + return get.type(card, null, false) == "equip"; + }), + source = trigger.source; + if (card && source && source.isIn()) source.gain(card, "gain2"); + }, + ai: { + filterDamage: true, + skillTagFilter(player) { + return !player.storage.counttrigger || !player.storage.counttrigger.dclonggong; + }, + }, + }, + dcsitian: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + var colorx = false, + hs = player.getCards("he"); + if (hs.length < 2) return false; + for (var card of hs) { + if (!lib.filter.cardDiscardable(card, player)) continue; + var color = get.color(card, player); + if (color == "none") continue; + if (!colorx) colorx = color; + else if (colorx != color) return true; + } + return false; + }, + filterCard(card, player) { + var color = get.color(card, player); + if (color == "none") return false; + return !ui.selected.cards.length || get.color(ui.selected.cards[0]) != color; + }, + selectCard: 2, + complexCard: true, + prompt: "弃置两张颜色不同的牌并改变天气", + check: card => 4.5 - get.value(card), + content() { + "step 0"; + var list = ["烈日", "雷电", "大浪", "暴雨", "大雾"].randomGets(2); + player.chooseButton(true, ["请选择执行一个天气", [list.map(i => [i, '"]), "textbutton"]]).set("ai", function (button) { + return lib.skill.dcsitian.weathers[button.link].ai(_status.event.player); + }); + "step 1"; + if (result.bool) { + var choice = result.links[0]; + game.log(player, "将当前天气变更为", "#g" + choice); + var next = game.createEvent("dcsitian_weather", false); + next.player = player; + next.setContent(lib.skill.dcsitian.weathers[choice].content); + } + }, + ai: { + order: 8, + result: { + player(player) { + var num1 = 0, + num2 = 0; + game.countPlayer(function (current) { + if (player == current) return; + var att = get.attitude(player, current); + if (att > 0) num1++; + else num2++; + }); + return num2 - num1; + }, + }, + }, + subSkill: { + dawu: { + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + filter(event, player) { + return get.type2(event.card, false) == "basic"; + }, + content() { + trigger.targets.length = 0; + trigger.all_excluded = true; + player.removeSkill("dcsitian_dawu"); + }, + mark: true, + marktext: "雾", + intro: { + name: "司天 - 大雾", + content: "使用的下一张基本牌无效", + }, + }, + }, + weathers: { + 烈日: { + description: "你对其他角色造成1点火属性伤害。", + content() { + var targets = game.filterPlayer(current => current != player).sortBySeat(); + player.line(targets, "fire"); + for (var target of targets) { + target.damage("fire"); + } + }, + ai(player) { + var effect = 0; + game.countPlayer(function (current) { + if (current == player) return; + effect += get.damageEffect(current, player, player, "fire"); + }); + return effect; + }, + }, + 雷电: { + description: "你令其他角色各进行一次判定。若结果为♠2~9,则其受到3点无来源雷属性伤害。", + content() { + "step 0"; + var targets = game.filterPlayer(current => current != player).sortBySeat(); + player.line(targets, "thunder"); + event.targets = targets; + "step 1"; + var target = targets.shift(); + if (!target.isIn()) { + if (targets.length > 0) event.redo(); + else { + event.finish(); + return; + } + } + event.target = target; + event.judgestr = get.translation("shandian"); + target.judge(lib.card.shandian.judge, event.judgestr).judge2 = lib.card.shandian.judge2; + //game.delayx(1.5); + "step 2"; + var name = "shandian"; + if (event.cancelled && !event.direct) { + if (lib.card[name].cancel) { + var next = game.createEvent(name + "Cancel"); + next.setContent(lib.card[name].cancel); + next.cards = []; + next.card = get.autoViewAs({ name: name }); + next.player = target; + } + } else { + var next = game.createEvent(name); + next.setContent(function () { + if (result.bool == false) { + player.damage(3, "thunder", "nosource"); + } + }); + next._result = result; + next.cards = []; + next.card = get.autoViewAs({ name: name }); + next.player = target; + } + if (targets.length > 0) event.goto(1); + }, + ai(player) { + var effect = 0; + game.countPlayer(function (current) { + if (current == player) return; + effect += get.damageEffect(current, current, player, "thunder") / 5; + }); + return effect; + }, + }, + 大浪: { + description: "你弃置其他角色装备区内的所有牌(装备区内没有牌的角色改为失去1点体力)。", + content() { + "step 0"; + var targets = game.filterPlayer(current => current != player).sortBySeat(); + player.line(targets, "green"); + event.targets = targets; + "step 1"; + var target = targets.shift(); + if (target.isIn()) { + var num = target.countCards("e"); + if (num > 0) { + player.discardPlayerCard(target, true, "e", num); + } else { + target.loseHp(); + game.delayex(); + } + } + if (targets.length > 0) event.redo(); + }, + ai(player) { + var effect = 0; + game.countPlayer(function (current) { + if (current == player) return; + var es = current.getCards("e"); + if (es.length > 0) { + var att = get.attitude(player, current), + val = get.value(es, current); + effect -= Math.sqrt(att) * val; + } else effect += get.effect(current, { name: "losehp" }, player, player); + }); + return effect; + }, + }, + 暴雨: { + description: "你弃置一名角色的所有手牌。若其没有手牌,则改为令其失去1点体力。", + content() { + "step 0"; + player.chooseTarget("请选择【暴雨】的目标", "令目标角色弃置所有手牌。若其没有手牌,则其改为失去1点体力。").set("ai", function (current) { + var es = current.getCards("h"), + player = _status.event.player; + if (es.length > 0) { + var att = get.attitude(player, current), + val = get.value(es, current); + return -Math.sqrt(att) * val; + } + return get.effect(current, { name: "losehp" }, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + var num = target.countCards("h"); + if (num > 0) { + player.discardPlayerCard(target, true, "h", num); + } else { + target.loseHp(); + game.delayex(); + } + } + }, + ai(player) { + return Math.max.apply( + Math, + game + .filterPlayer(function (current) { + return current != player; + }) + .map(function (current) { + var es = current.getCards("h"); + if (es.length > 0) { + var att = get.attitude(player, current), + val = get.value(es, current); + return -Math.sqrt(att) * val; + } + return get.effect(current, { name: "losehp" }, player, player); + }) + ); + }, + }, + 大雾: { + description: "你令所有其他角色获得如下效果:当其使用下一张基本牌时,取消之。", + content() { + var targets = game.filterPlayer(current => current != player).sortBySeat(); + player.line(targets); + for (var target of targets) target.addSkill("dcsitian_dawu"); + }, + ai(player) { + var effect = 0; + game.countPlayer(function (current) { + if (current == player || current.hasSkill("dcsitian_dawu")) return; + effect -= 0.5 * get.attitude(player, current); + }); + return effect; + }, + }, + }, + }, + //美猴王 + dcjinjing: { + locked: true, + ai: { + viewHandcard: true, + skillTagFilter(player, tag, arg) { + if (player == arg) return false; + }, + }, + }, + dccibei: { + audio: 2, + trigger: { source: "damageBegin2" }, + logTarget: "player", + filter(event, player) { + return ( + player != event.player && + !player.hasHistory("useSkill", function (evt) { + return evt.skill == "dccibei" && evt.targets.includes(event.player); + }) + ); + }, + check(event, player) { + var target = event.player; + if (get.attitude(player, target) >= 0) return true; + return !player.getStat("skill").ruyijingubang_skill || player.storage.ruyijingubang_skill == 1; + }, + content() { + trigger.cancel(); + player.draw(5); + }, + ai: { + threaten: 4.5, + }, + }, + dcruyi: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.hasEquipableSlot(1) && !player.getEquips("ruyijingubang").length; + }, + content() { + var card = game.createCard2("ruyijingubang", "heart", 9); + player.$gain2(card, false); + game.delayx(); + player.equip(card); + }, + mod: { + canBeGained(card, source, player) { + if (player.getEquips("ruyijingubang").includes(card)) return false; + }, + canBeDiscarded(card, source, player) { + if (player.getEquips("ruyijingubang").includes(card)) return false; + }, + canBeReplaced(card, player) { + if (player.getEquips("ruyijingubang").includes(card)) return false; + }, + cardname(card) { + if (get.subtype(card, false) == "equip1") return "sha"; + }, + cardnature(card) { + if (get.subtypes(card, false).includes("equip1")) return false; + }, + cardDiscardable(card, player) { + if (player.getEquips("ruyijingubang").includes(card)) return false; + }, + cardEnabled2(card, player) { + if (player.getEquips("ruyijingubang").includes(card)) return false; + }, + }, + group: "dcruyi_blocker", + subSkill: { + blocker: { + trigger: { + player: ["loseBefore", "disableEquipBefore"], + }, + forced: true, + filter(event, player) { + if (event.name == "disableEquip") return event.slots.includes("equip1"); + var cards = player.getEquips("ruyijingubang"); + return event.cards.some(card => cards.includes(card)); + }, + content() { + if (trigger.name == "lose") { + trigger.cards.removeArray(player.getEquips("ruyijingubang")); + } else { + while (trigger.slots.includes("equip1")) trigger.slots.remove("equip1"); + } + }, + }, + }, + }, + ruyijingubang_skill: { + equipSkill: true, + enable: "phaseUse", + usable: 1, + chooseButton: { + dialog() { + var dialog = ui.create.dialog( + "如意金箍棒:选择变化攻击范围", + [ + [ + [1, "   ⒈【杀】无次数限制   "], + [2, "   ⒉【杀】的伤害值+1   "], + ], + "tdnodes", + ], + [ + [ + [3, "   ⒊【杀】不可被响应   "], + [4, "   ⒋【杀】的目标数+1   "], + ], + "tdnodes", + ] + ); + return dialog; + }, + filter(button, player) { + return button.link != player.storage.ruyijingubang_skill; + }, + check(button) { + if (button.link == 1 || button.link == 3) return 1; + return 0; + }, + backup(links, player) { + return { + audio: "dcruyi", + num: links[0], + popup: "如意金箍棒", + content() { + var num = lib.skill.ruyijingubang_skill_backup.num; + player.storage.ruyijingubang_skill = num; + var cards = player.getEquips(1); + for (var card of cards) { + if (card && card.name == "ruyijingubang") { + card.storage.ruyijingubang_skill = num; + game.log(player, "将", card, "的攻击范围改为" + num); + } + } + player.markSkill("ruyijingubang_skill"); + }, + }; + }, + }, + mod: { + cardUsable(card, player, num) { + if (player.storage.ruyijingubang_skill == 1 && card.name == "sha") return Infinity; + }, + }, + ai: { + order: 1, + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return player.storage.ruyijingubang_skill == 3; + }, + effect: { + player(card, player, target, current) { + if (get.tag(card, "damage") > 0 && player != target) { + if (player.getStat("skill").ruyijingubang_skill && player.storage.ruyijingubang_skill != 1) return; + if ( + player.hasSkill("dccibei") && + !player.hasHistory("useSkill", function (evt) { + return evt.skill == "dccibei" && evt.targets.includes(target); + }) + ) { + return [1, 3]; + } + } + }, + }, + result: { + player(player) { + if (player.storage.ruyijingubang_skill == 1) { + if (!player.hasSha()) return 1; + return 0; + } else { + if (player.hasSha() && player.getCardUsable("sha") <= 0) return 1; + return 0; + } + }, + }, + }, + intro: { + name: "如意金箍棒", + content(storage) { + if (!storage) storage = 3; + return "
  • 攻击范围:" + storage + "
  • " + ["你使用【杀】无次数限制。", "你使用的【杀】伤害+1。", "你使用的【杀】不可被响应。", "你使用【杀】选择目标后,可以增加一个额外目标。"][storage - 1]; + }, + }, + subSkill: { + backup: {}, + }, + }, + ruyijingubang_effect: { + equipSkill: true, + trigger: { player: "useCard2" }, + direct: true, + locked: true, + filter(event, player) { + if (event.card.name != "sha") return false; + var num = player.storage.ruyijingubang_skill; + if (!num || num == 1) return false; + if (num != 4) return true; + var card = event.card; + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && lib.filter.targetInRange(card, player, current); + }) + ) { + return true; + } + return false; + }, + content() { + "step 0"; + var num = player.storage.ruyijingubang_skill; + if (num == 4) { + player + .chooseTarget(get.prompt("ruyijingubang_effect"), "为" + get.translation(trigger.card) + "额外指定一个目标", function (card, player, target) { + return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target, false); + }) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + } else { + player.logSkill("ruyijingubang_effect"); + if (num == 2) { + trigger.baseDamage++; + game.log(trigger.card, "的伤害+1"); + } else if (num == 3) { + trigger.directHit.addArray(game.filterPlayer()); + game.log(trigger.card, "不可被响应"); + } + event.finish(); + } + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + player.logSkill("ruyijingubang_effect", event.targets); + trigger.targets.addArray(event.targets); + }, + }, + //涛神 + dcnutao: { + audio: 4, + trigger: { player: "useCardToPlayer" }, + forced: true, + group: "dcnutao_add", + filter(event, player) { + if (get.type2(event.card) != "trick") return false; + return event.isFirstTarget && event.targets.some(i => i != player); + }, + content() { + var target = trigger.targets.filter(i => i != player).randomGet(); + player.line(target, "thunder"); + target.damage("thunder"); + }, + ai: { + effect: { + player(card, player, target) { + if (player !== target && get.type2(card) === "trick") { + let tars = [target]; + if (ui.selected.targets.length) tars.addArray(ui.selected.targets.filter(i => i !== player && i !== target)); + if (tars.length < 2) return [1, 0, 1, -2]; + return [1, 0, 1, -2 / tars.length]; + } + }, + }, + }, + subSkill: { + add: { + audio: "dcnutao", + trigger: { source: "damageSource" }, + filter(event, player) { + return event.nature == "thunder" && player.isPhaseUsing(); + }, + forced: true, + content() { + player.addTempSkill("dcnutao_sha", "phaseUseAfter"); + player.addMark("dcnutao_sha", 1, false); + }, + }, + sha: { + charlotte: true, + onremove: true, + marktext: "涛", + intro: { + content: "此阶段使用【杀】的次数上限+#", + }, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("dcnutao_sha"); + }, + }, + }, + }, + }, + //铜雀台 + spduanzhi: { + trigger: { target: "useCardToTargeted" }, + logTarget: "player", + check(event, player) { + var target = event.player; + if ( + get.attitude(player, target) >= -2 || + target.countCards("he", function (card) { + return get.value(card, target) > 5; + }) < 2 + ) + return false; + if (player.hp > 2) return true; + if (player.hp == 1) { + if (get.tag(event.card, "respondSha")) { + if (player.countCards("h", { name: "sha" }) == 0) { + return true; + } + } else if (get.tag(event.card, "respondShan")) { + if (player.countCards("h", { name: "shan" }) == 0) { + return true; + } + } else if (get.tag(event.card, "damage")) { + if (event.card.name == "shuiyanqijunx") return player.countCards("e") == 0; + return true; + } + } + return false; + }, + filter(event, player) { + return player != event.player && event.player.countDiscardableCards(player, "he") > 0; + }, + content() { + player.discardPlayerCard(trigger.player, true, "he", [1, 2]); + player.loseHp(); + }, + }, + spduyi: { + enable: "phaseUse", + usable: 1, + content() { + "step 0"; + event.card = get.cards()[0]; + game.cardsGotoOrdering(event.card); + player.showCards(event.card); + "step 1"; + player + .chooseTarget("令一名角色获得" + get.translation(card), true) + .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 (att > 0) { + if (target == player) att *= 0.6; + return att + Math.sqrt(Math.max(0, 5 - target.countCards("h"))); + } + return att; + }) + .set("du", card.name == "du"); + "step 2"; + if (result && result.bool) { + var target = result.targets[0]; + target.gain(card, "gain2"); + if (get.color(card, false) == "black") target.addTempSkill("spduyi2"); + } + }, + ai: { + order: 0.1, + result: { + player: 1, + }, + }, + }, + spduyi2: { + mod: { + cardEnabled2(card) { + if (get.position(card) == "h") return false; + }, + }, + mark: true, + intro: { + content: "不能使用或打出手牌", + }, + }, + spcangni: { + audio: "zhuikong", + trigger: { player: "phaseDiscardBegin" }, + direct: true, + content() { + "step 0"; + player.chooseDrawRecover("###" + get.prompt("spcangni") + "###摸两张牌或回复1点体力,然后将武将牌翻面", 2).logSkill = "spcangni"; + "step 1"; + if (result.control != "cancel2") player.turnOver(); + }, + group: ["spcangni_gain", "spcangni_lose"], + subSkill: { + gain: { + audio: "zhuikong", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + usable: 1, + filter(event, player) { + return player.isTurnedOver() && player != _status.currentPhase && event.getg(player).length > 0; + }, + check(event, player) { + return get.attitude(player, _status.currentPhase) > 0; + }, + logTarget() { + return _status.currentPhase; + }, + prompt2: "令该角色摸一张牌", + content() { + _status.currentPhase.draw(); + }, + }, + lose: { + audio: "zhuikong", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + if (event.name == "gain" && player == event.player) return false; + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + return player.isTurnedOver() && player != _status.currentPhase && _status.currentPhase.countCards("he") > 0; + }, + check(event, player) { + var target = _status.currentPhase; + var att = get.attitude(player, target); + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) + ) + return att > 0; + return att < 0; + }, + logTarget() { + return _status.currentPhase; + }, + prompt2: "令该角色弃置一张牌", + content() { + _status.currentPhase.chooseToDiscard("he", true); + }, + }, + }, + }, + spmixin: { + audio: "qiuyuan", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0 && game.countPlayer() > 2; + }, + filterCard: true, + filterTarget: lib.filter.notMe, + position: "h", + selectTarget: 2, + targetprompt: ["拿牌打人", "被打"], + multitarget: true, + delay: false, + discard: false, + lose: false, + check(card) { + if (card.name == "sha") return 4; + return 4 - get.value(card); + }, + content() { + "step 0"; + player.give(cards, targets[0]); + "step 1"; + if (!targets[0].isIn() || !targets[1].isIn()) { + event.finish(); + return; + } + 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]) + "使用一张【杀】,或令其观看并获得你的一张手牌" + ) + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", targets[1]); + "step 2"; + if (!result.bool && targets[0].countCards("h")) targets[1].gainPlayerCard(targets[0], "visible", "h", true); + }, + ai: { + order: 1, + expose: 0.1, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (!card) return 0; + if (ui.selected.targets.length == 0) { + if (card.name == "sha" || target.hasSha()) return 2; + if (get.value(card, target) < 0) return -2; + return 0; + } + var target1 = ui.selected.targets[0]; + if ((card.name == "sha" || target1.hasSha()) && get.effect(target, { name: "sha" }, target1, target1) > 0) return get.effect(target, { name: "sha" }, target1, target); + return 1.5; + }, + }, + }, + }, + spfengyin: { + audio: "moukui", + trigger: { global: "phaseZhunbeiBegin" }, + direct: true, + filter(event, player) { + return ( + player != event.player && + event.player.hp >= player.hp && + player.countCards("h", function (card) { + if (_status.connectMode) return true; + return get.name(card, player) == "sha"; + }) > 0 + ); + }, + content() { + "step 0"; + player + .chooseCard("h", get.prompt("spfengyin", trigger.player), "交给该角色一张【杀】并令其跳过出牌阶段和弃牌阶段", function (card, player) { + return get.name(card, player) == "sha"; + }) + .set("ai", function (card) { + if (_status.event.goon) return 5 - get.value(card); + return 0; + }) + .set( + "goon", + (function () { + if (get.attitude(player, trigger.player) >= 0) return false; + if (trigger.player.countCards("hs") < trigger.player.hp) return false; + return true; + })() + ); + "step 1"; + if (result.bool) { + var target = trigger.player; + player.logSkill("spfengyin", target); + player.give(result.cards, target, "give"); + target.skip("phaseUse"); + target.skip("phaseDiscard"); + } + }, + }, + spchizhong: { + mod: { + maxHandcardBase(player, num) { + return player.maxHp; + }, + }, + trigger: { global: "dieAfter" }, + forced: true, + content() { + player.gainMaxHp(); + }, + }, + fenxin_old: { + mode: ["identity"], + trigger: { source: "dieBegin" }, + init(player) { + player.storage.fenxin = false; + }, + intro: { + content: "limited", + }, + skillAnimation: "epic", + animationColor: "fire", + unique: true, + limited: true, + audio: 2, + mark: true, + filter(event, player) { + if (player.storage.fenxin) return false; + return event.player.identity != "zhu" && player.identity != "zhu" && player.identity != "mingzhong" && event.player.identity != "mingzhong"; + }, + check(event, player) { + if (player.identity == event.player.identity) return Math.random() < 0.5; + var stat = get.situation(); + switch (player.identity) { + case "fan": + if (stat < 0) return false; + if (stat == 0) return Math.random() < 0.6; + return true; + case "zhong": + if (stat > 0) return false; + if (stat == 0) return Math.random() < 0.6; + return true; + case "nei": + if (event.player.identity == "fan" && stat < 0) return true; + if (event.player.identity == "zhong" && stat > 0) return true; + if (stat == 0) return Math.random() < 0.7; + return false; + } + return false; + }, + prompt(event, player) { + return "焚心:是否与" + get.translation(event.player) + "交换身份?"; + }, + content() { + game.broadcastAll( + function (player, target, shown) { + var identity = player.identity; + player.identity = target.identity; + if (shown || player == game.me) { + player.setIdentity(); + } + target.identity = identity; + }, + player, + trigger.player, + trigger.player.identityShown + ); + player.line(trigger.player, "green"); + player.storage.fenxin = true; + player.awakenSkill("fenxin_old"); + }, + }, +}; + +export default skills; diff --git a/character/collab/sort.js b/character/collab/sort.js new file mode 100644 index 000000000..f056ebc6f --- /dev/null +++ b/character/collab/sort.js @@ -0,0 +1,17 @@ +const characterSort = { + collab_olympic: ["sunyang", "yeshiwen"], + collab_tongque: ["sp_fuwan", "sp_fuhuanghou", "sp_jiben", "old_lingju", "sp_mushun"], + collab_duanwu: ["sunwukong", "longwang", "taoshen"], + collab_decade: ["libai", "xiaoyuehankehan", "zhutiexiong", "wu_zhutiexiong"], + collab_remake: ["dc_caocao", "dc_liubei", "dc_sunquan", "nezha", "dc_sunce", "dc_zhaoyun"], +}; + +const characterSortTranslate = { + collab_olympic: "OL·伦敦奥运会", + collab_tongque: "OL·铜雀台", + collab_duanwu: "新服·端午畅玩", + collab_decade: "新服·创玩节", + collab_remake: "新服·共创武将", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/collab/translate.js b/character/collab/translate.js new file mode 100644 index 000000000..3ef849aed --- /dev/null +++ b/character/collab/translate.js @@ -0,0 +1,105 @@ +const translates = { + old_lingju: "SP灵雎", + old_lingju_prefix: "SP", + fenxin_old: "焚心", + fenxin_old_info: "限定技,当你杀死一名非主公角色时,你可以与其交换未翻开的身份牌。(你的身份为主公时不能发动此技能)", + sp_fuwan: "SP伏完", + sp_fuwan_prefix: "SP", + spfengyin: "奉印", + spfengyin_info: "其他角色的回合开始时,若其体力值不少于你,你可以交给其一张【杀】,令其跳过出牌阶段和弃牌阶段。", + spchizhong: "持重", + spchizhong_info: "锁定技,你的手牌上限等于体力上限;其他角色死亡时,你加1点体力上限。", + sp_fuhuanghou: "SP伏寿", + sp_fuhuanghou_prefix: "SP", + spcangni: "藏匿", + spcangni_info: "弃牌阶段开始时,你可以回复1点体力或摸两张牌,然后将你的武将牌翻面;其他角色的回合内,当你获得(每回合限一次)/失去一次牌时,若你的武将牌背面朝上,你可以令该角色摸/弃置一张牌。", + spmixin: "密信", + spmixin_info: "出牌阶段限一次,你可以将一张手牌交给一名其他角色,该角色须对你选择的另一名角色使用一张无距离限制的【杀】,否则你选择的角色观看其手牌并获得其中一张。", + sp_jiben: "SP吉本", + sp_jiben_prefix: "SP", + spduanzhi: "断指", + spduanzhi_info: "当你成为其他角色使用的牌的目标后,你可以弃置其至多两张牌,然后失去1点体力。", + spduyi: "毒医", + spduyi2: "毒医", + spduyi_info: "出牌阶段限一次,你可以亮出牌堆顶的一张牌并交给一名角色,若此牌为黑色,该角色不能使用或打出手牌,直到回到结束。", + sp_mushun: "SP穆顺", + sp_mushun_prefix: "SP", + libai: "李白", + dclbjiuxian: "酒仙", + dclbjiuxian_info: "①你可以将额定目标数大于1的锦囊牌当做【酒】使用。②你使用【酒】无次数限制。", + dcshixian: "诗仙", + dcshixian_yayun: "押韵", + dcshixian_info: "当你使用一张牌时,若此牌的牌名与你于本局游戏使用的上一张牌的牌名押韵,则你可以摸一张牌,并令此牌额外结算一次。", + taoshen: "涛神", + dcnutao: "怒涛", + dcnutao_info: "锁定技。①当你使用锦囊牌指定第一个目标时,若目标角色包含其他角色,你随机对其中一名其他目标角色造成1点雷电伤害。②当你于出牌阶段造成雷电伤害后,你于此阶段使用【杀】的次数上限+1。", + sunwukong: "孙悟空", + dcjinjing: "金睛", + dcjinjing_info: "锁定技。其他角色的手牌对你可见。", + dccibei: "慈悲", + dccibei_info: "每回合每名角色限一次。当你对其他角色造成伤害时,你可以防止此伤害,然后摸五张牌。", + dcruyi: "如意", + dcruyi_info: "锁定技。①游戏开始时,你将【如意金箍棒】置入装备区。②你手牌区内的武器牌均视为【杀】,且你不是武器牌的合法目标。③当你即将失去【如意金箍棒】或即将废除武器栏时,取消之。④你不能将装备区内的【如意金箍棒】当做其他牌使用或打出。", + ruyijingubang: "如意金箍棒", + // ruyijingubang_skill:'如意', + ruyijingubang_skill: "如意金箍棒", + ruyijingubang_effect: "如意金箍棒", + ruyijingubang_info: "出牌阶段限一次。你可以将此牌的实际攻击范围调整为1~4内的任意整数。你根据此牌的实际攻击范围拥有对应的效果:
  • ⑴你使用【杀】无次数限制。
  • ⑵你使用的【杀】伤害+1。
  • ⑶你使用的【杀】不可被响应。
  • ⑷你使用【杀】选择目标后,可以增加一个额外目标。", + longwang: "龙王", + dclonggong: "龙宫", + dclonggong_info: "每回合限一次。当你受到伤害时,你可以防止此伤害,然后令伤害来源从牌堆中获得一张装备牌。", + dcsitian: "司天", + dcsitian_info: "出牌阶段,你可以弃置两张颜色不同的手牌。系统从所有天气中随机选择两个,你观看这些天气并选择一个执行。
  • 烈日:你对其他角色依次造成1点火属性伤害。
  • 雷电:你令其他角色各进行一次判定。若结果为♠2~9,则其受到3点无来源雷属性伤害。
  • 大浪:你弃置其他角色装备区内的所有牌(装备区内没有牌的角色改为失去1点体力)。
  • 暴雨:你弃置一名角色的所有手牌。若其没有手牌,则改为令其失去1点体力。
  • 大雾:你令所有其他角色获得如下效果:当其使用下一张基本牌时,取消之。", + sunyang: "孙杨", + clbshuijian: "水箭", + clbshuijian_info: "摸牌阶段开始时,你可以令额定摸牌数+X(X为你装备区内牌数的一半+1,且向下取整)。", + yeshiwen: "叶诗文", + clbjisu: "急速", + clbjisu_info: "判定阶段开始前,你可以跳过本回合的判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】。", + clbshuiyong: "水泳", + clbshuiyong_info: "锁定技。当你受到火属性伤害时,取消之。", + xiaoyuehankehan: "小约翰可汗", + dctongliao: "通辽", + dctongliao_info: "①摸牌阶段结束时,你可以选择一张点数最小的手牌,将此牌标记为“通辽”。②当你失去一张具有“通辽”标签的牌时,你摸X张牌(X为此牌点数)。", + dcwudao: "悟道", + dcwudao_info: "当你使用牌结算结束后,若你使用的上一张牌与此牌类型相同,则你可以于本回合内获得如下效果:当你于回合内使用该类型的牌时,你令此牌不可被响应且伤害值基数+1。", + zhutiexiong: "朱铁雄", + wu_zhutiexiong: "朱铁雄", + dcbianzhuang: "变装", + dcbianzhuang_info: "①出牌阶段限一次,你可以从系统随机选择的两个技能中获得一个,并视为使用一张【杀】(无距离次数限制),然后失去以此法获得的技能。②当你使用装备牌后,你清空此技能的发动次数记录。③当你发动〖变装①〗后,若你发动〖变装①〗的次数大于2,则你将武将牌变更为诸葛亮,并将系统选择的技能数改为三个。", + dc_caocao: "经典曹操", + dc_caocao_prefix: "经典", + dcjianxiong: "奸雄", + dcjianxiong_info: "当你受到伤害后,你可以摸一张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1(至多为5)。", + dc_liubei: "经典刘备", + dc_liubei_prefix: "经典", + dcrende: "仁德", + dcrende_info: "出牌阶段每名角色限一次。你可以获得一名其他角色两张手牌,然后视为使用一张基本牌。", + dc_sunquan: "经典孙权", + dc_sunquan_prefix: "经典", + dczhiheng: "制衡", + dczhiheng_info: "①出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。②每回合每名角色限一次。当你对其他角色造成伤害后,你令〖制衡①〗于此回合发动次数上限+1。", + nezha: "哪吒", + dcsantou: "三头", + dcsantou_info: "锁定技,当你受到伤害时,防止之,然后若以下有条件成立,你失去1点体力:1.你于本回合此前以此法防止过该伤害来源的伤害,且你的体力值不小于3;2.本次伤害为属性伤害,且你的体力值为2;3.本次伤害的渠道为红色的牌,且你的体力值为1。", + dcfaqi: "法器", + dcfaqi_info: "当你于出牌阶段使用装备牌结算结束后,你视为使用一张本回合未以此法使用过的普通锦囊牌。", + dc_sunce: "经典孙策", + dc_sunce_prefix: "经典", + dcshuangbi: "双壁", + dcshuangbi_info: "出牌阶段限一次,你可以选择一项:①摸X张牌,本回合手牌上限+X;②弃置至多X张牌,随机对其他角色造成等量火焰伤害;③视为使用X张火【杀】或【火攻】。(X为场上存活角色数)", + dc_zhaoyun: "经典神赵云", + dc_zhaoyun_prefix: "经典神", + dclonghun: "龙魂", + dclonghun_info: "每回合限20次,你可以将你的牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。", + dczhanjiang: "斩将", + dczhanjiang_info: "准备阶段,若场上有【青釭剑】,则你可以获得之。", + + collab_olympic: "OL·伦敦奥运会", + collab_tongque: "OL·铜雀台", + collab_duanwu: "新服·端午畅玩", + collab_decade: "新服·创玩节", + collab_remake: "新服·共创武将", +}; + +export default translates; diff --git a/character/collab/voices.js b/character/collab/voices.js new file mode 100644 index 000000000..46f7519c1 --- /dev/null +++ b/character/collab/voices.js @@ -0,0 +1,95 @@ +export default { + "#dcjuejing1": "龙翔九天,曳日月于天地,换旧符于新岁。", + "#dcjuejing2": "御风万里,辟邪祟于宇外,映祥瑞于神州。", + "#dclonghun1": "龙诞新岁,普天同庆,魂佑宇内,裔泽炎黄。", + "#dclonghun2": "龙吐息而万物生,今龙临神州,华夏当兴。", + "#dczhanjiang1": null, + "#dczhanjiang2": null, + "#dc_zhaoyun:die": "酒足驱年兽,新岁老一人。", + "#dcshuangbi1": null, + "#dcshuangbi2": null, + "#dc_sunce:die": "内事不决问张昭,外事不决问周瑜……", + "#dcsantou1": "任尔计策奇略,我自随机应对。", + "#dcsantou2": "三相显圣,何惧雷劫地火?", + "#dcfaqi1": "脚踏风火轮,金印翻天,剑辟阴阳!", + "#dcfaqi2": "手执火尖枪,红绫混天,乾坤难困我!", + "#nezha:die": "莲藕花开,始知三清……", + "#rejianxiong1": "燕雀,安知鸿鹄之志!", + "#rejianxiong2": "夫英雄者,胸怀大志,腹有良谋!", + "#dc_caocao:die": "霸业未成未成啊!", + "#rerende1": "施仁布泽,乃我大汉立国之本!", + "#rerende2": "同心同德,救困扶危!", + "#dc_liubei:die": "这就是桃园吗?", + "#rezhiheng1": "制衡互牵,大局可安。", + "#rezhiheng2": "不急不躁,稳谋应对。", + "#dc_sunquan:die": "父亲,大哥,仲谋愧矣……", + "#dcbianzhuang1": "须知少日凌云志,曾许人间第一流。", + "#dcbianzhuang2": "愿尽绵薄之力,盼国风盛行。", + "#zhutiexiong:die": "那些看似很可笑的梦,是我们用尽全力守护的光……", + "#wu_zhutiexiong:die": "愿得此身长报国,何须生入玉门关。", + "#dctongliao1": "发动偷袭。", + "#dctongliao2": "不够心狠手辣,怎配江山如画。", + "#dctongliao3": "必须出重拳,而且是物理意义上的出重拳。", + "#dcwudao1": "众所周知,能力越大,能力也就越大。", + "#dcwudao2": "龙争虎斗彼岸花,约翰给你一个家。", + "#dcwudao3": "唯一能够打破命运牢笼的,只有我们自己。", + "#xiaoyuehankehan:die": "留得青山在,老天爷饿不死瞎家雀。", + "#dclbjiuxian1": "地若不爱酒,地应无酒泉。", + "#dclbjiuxian2": "天若不爱酒,酒星不在天。", + "#dcshixian1": "鱼水三顾合,风云四海生。", + "#dcshixian2": "武侯立岷蜀,壮志吞咸京。", + "#libai:die": "谁识卧龙客,长吟愁鬓斑。", + "#dcjinjing": null, + "#dcjinjing1": null, + "#dcjinjing2": null, + "#dccibei1": "生亦何欢,死亦何苦。", + "#dccibei2": "我欲成佛,天下无魔;我欲成魔,佛奈我何?", + "#dcruyi1": "俺老孙来也!", + "#dcruyi2": "吃俺老孙一棒!", + "#sunwukong:die": "曾经有一整片蟠桃园在我面前,失去后才追悔莫及……", + "#dclonggong1": "停手,大哥!给东西能换条命不?", + "#dclonggong2": "冤家宜解不宜结,莫要伤了和气。", + "#dcsitian1": "观众朋友大家好,欢迎收看天气预报!", + "#dcsitian2": "这一喷嚏,不知要掀起多少狂风暴雨。", + "#longwang:die": "三年之期已到,哥们要回家啦…", + "#dcnutao1": "伍胥怒涛,奔流不灭!", + "#dcnutao2": "波澜逆转,攻守皆可!", + "#dcnutao3": "智勇深沉,一世之雄!", + "#dcnutao4": "波涛怒天,神力无边!", + "#taoshen:die": "马革裹尸,身沉江心。", + "#clbshuijian1": null, + "#clbshuijian2": null, + "#sunyang:die": null, + "#clbjisu1": null, + "#clbjisu2": null, + "#clbshuiyong1": null, + "#clbshuiyong2": null, + "#yeshiwen:die": null, + "#spduanzhi": null, + "#spduanzhi1": null, + "#spduanzhi2": null, + "#spduyi": null, + "#spduyi1": null, + "#spduyi2": null, + "#sp_jiben:die": null, + "#zhuikong1": "诚惶诚恐,夜不能寐。", + "#zhuikong2": "嘘,隔墙有耳。", + "#qiuyuan1": "逆贼逞凶,卿可灭之。", + "#qiuyuan2": "求父亲救救大汉江山吧!", + "#sp_fuhuanghou:die": "陛下为何不救臣妾……", + "#moukui1": "你的死期到了。", + "#moukui2": "同归于尽吧。", + "#spchizhong": null, + "#spchizhong1": null, + "#spchizhong2": null, + "#sp_fuwan:die": "后会有期……", + "#jieyuan": null, + "#jieyuan1": null, + "#jieyuan2": null, + "#fenxin_old1": null, + "#fenxin_old2": null, + "#old_lingju:die": "主上,对不起……", + "#moukui_sp_mushun1": null, + "#moukui_sp_mushun2": null, + "#sp_mushun:die": "这,何来的大风?", +}; diff --git a/character/ddd.js b/character/ddd.js deleted file mode 100644 index adaa7e8ba..000000000 --- a/character/ddd.js +++ /dev/null @@ -1,6882 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "ddd", - connect: true, - character: { - ddd_handang: ["male", "wu", 4, ["dddxianxi"]], - // ddd_wuzhi:["male","wei",3,["dddlingyong","dddxuxiao"]], - ddd_xujing: ["male", "shu", 3, ["dddxuyu", "dddshijian"]], - // ddd_caomao:["male","wei",3,["dddtaisi","dddquche","dddqianlong"],["zhu"]], - // ddd_xinxianying:["female","wei",3,["ddddongcha","dddzhijie"]], - ddd_xianglang: ["male", "shu", 3, ["dddqiahua", "dddfusi", "dddtuoji"]], - ddd_yujin: ["male", "wei", 4, ["dddzhengjun"]], - ddd_liuye: ["male", "wei", 3, ["dddchashi", "dddqice"]], - ddd_baosanniang: ["female", "shu", 3, ["dddzhilian", "dddjijian"]], - // ddd_zhenji:['female','wei',3,['dddmiaoxing','dddfushi']], - ddd_zhaoang: ["male", "wei", 4, ["dddfenji"]], - ddd_zhouchu: ["male", "wu", 5, ["dddxiaheng"]], - ddd_liuba: ["male", "shu", 3, ["dddfengzheng", "dddyulv"]], - ddd_jianshuo: ["male", "qun", 4, ["dddfenye", "dddshichao"]], - ddd_guanning: ["male", "qun", 3, ["dddyouxue", "dddchengjing"]], - ddd_dingfeng: ["male", "wu", 4, ["dddduanbing"]], - ddd_caoshuang: ["male", "wei", 5, ["dddzhuanshe", "dddweiqiu"]], - ddd_xuelingyun: ["female", "wei", 3, ["dddlianer", "dddanzhi"]], - ddd_liuhong: ["male", "qun", 4, ["dddshixing", "ddddanggu", "dddfuzong"], ["zhu"]], - ddd_xiahouxuan: ["male", "wei", 3, ["dddlanghuai", "dddxuanlun"]], - ddd_zhangkai: ["male", "qun", "3/4", ["dddjiexing", "dddbailei"]], - ddd_liangxi: ["male", "wei", 4, ["dddtongyu"]], - ddd_wangkanglvkai: ["male", "shu", 4, ["dddbingjian"]], - // ddd_sunliang:['male','wu',3,['ddddiedang','dddanliu','dddguiying'],['zhu']], - ddd_lie: ["female", "wu", 3, ["dddyeshen", "dddqiaoduan"]], - ddd_kebineng: ["male", "qun", 4, ["dddxiaoxing", "dddlangzhi", "dddfuyi"], ["zhu"]], - ddd_qianzhao: ["male", "wei", 4, ["dddyuanzhen", "dddzhishu"]], - ddd_zhangmiao: ["male", "qun", 4, ["dddxiaxing"]], - ddd_zhangcheng: ["male", "wu", 3, ["dddjuxian", "dddjungui"]], - ddd_liuchong: ["male", "qun", 4, ["dddjinggou", "dddmoyan"]], - ddd_luoxian: ["male", "shu", 4, ["dddshilie"]], - }, - characterFilter: {}, - characterSort: {}, - characterTitle: { - ddd_handang: "#g晓ャ绝对", - ddd_wuzhi: "#g沸治·克里夫", - ddd_xujing: "#g沸治·克里夫", - ddd_caomao: "#gRocxu", - ddd_xinxianying: "#g好孩子系我", - ddd_xianglang: "#g会乱武的袁绍", - ddd_liuye: "#g好孩子系我", - ddd_baosanniang: "#g会乱武的袁绍", - ddd_wangkanglvkai: "#g扬林", - ddd_yujin: "#g虎鲸", - ddd_caoshuang: "#g辰木", - ddd_zhenji: "#g巴德", - ddd_zhaoang: "#g君腾天下", - ddd_xuelingyun: "#gGENTOVA07", - ddd_liuhong: "#g拉普拉斯", - ddd_xiahouxuan: "#g好孩子系我", - ddd_zhouchu: "#g志文", - ddd_kebineng: "#g晨星", - ddd_zhangkai: "#g拼音", - ddd_liuba: "#g浅水", - ddd_jianshuo: "#g浅水", - ddd_guanning: "#g虎鲸", - ddd_lie: "#gyyuaN", - ddd_liangxi: "#g先負", - // ddd_liuchong:'#g', - ddd_luoxian: "#g绝代倾国倾城貌", - }, - /** @type { importCharacterConfig['skill'] } */ - skill: { - //牵招 - dddyuanzhen: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - forced: true, - filter(event, player) { - return ( - event.target != player && - get.distance(player, event.target) != 1 && - event.isFirstTarget && - event.targets.length == 1 - ); - }, - logTarget: "target", - *content(event, map) { - const player = map.player, - trigger = map.trigger, - target = trigger.target; - let result; - game.delayex(); - if (!target.countCards("he")) result = { bool: false }; - else - result = yield target - .chooseToDiscard( - "he", - `${get.translation(player)}对你使用了【远振】`, - "请弃置一张牌,或点击“取消”令其摸一张牌" - ) - .set("ai", (card) => { - if (get.event("goon")) return 4.5 - get.value(card); - }) - .set("goon", get.attitude(target, player) > 0); - if (!result.bool) { - target.line(player); - player.draw(); - } - }, - }, - dddzhishu: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return player.canMoveCard(null, true); - }, - check(event, player) { - return player.canMoveCard(true, true); - }, - *content(event, map) { - const player = map.player; - let result = yield player.moveCard(); - const targets = result.targets; - const guohe = new lib.element.VCard({ - name: "guohe", - isCard: true, - }); - if (targets[0].canUse(guohe, targets[1])) targets[0].useCard(guohe, targets[1], "noai"); - }, - }, - //张邈 - dddxiaxing: { - audio: 2, - enable: "chooseToUse", - hiddenCard(player, name) { - if (player.hasSkill("dddxiaxing_used")) return false; - return name == "tao"; - }, - filter(event, player) { - if (event.type != "dying") return false; - if (!player.countCards("he")) return false; - const evt = get.event().getParent("_save"); - if (!evt || !evt.dying || !evt.dying.isIn()) return false; - return !player.hasSkill("dddxiaxing_used"); - }, - check: (card) => { - return 7 - get.value(card); - }, - filterCard: true, - position: "he", - discard: false, - delay: false, - lose: false, - group: ["dddxiaxing_begin", "dddxiaxing_viewas"], - prompt() { - const evt = get.event().getParent("_save"); - return `将一张牌置于牌堆顶,视为${get.translation(evt.dying)}使用一张【桃】`; - }, - *content(event, map) { - const player = map.player, - cards = event.cards; - player.addTempSkill("dddxiaxing_used", "roundStart"); - game.log(player, "将一张牌置于了牌堆顶"); - player.$throw(cards.length, 1000); - yield player.lose(cards, ui.cardPile, "insert"); - const evt = event.getParent("_save"); - yield evt.dying.chooseUseTarget("tao", true); - if (!player.hasMark("dddxiaxing")) player.addMark("dddxiaxing"); - }, - marktext: "侠", - intro: { - markcount: () => 0, - name: "侠行", - name2: "侠", - content: "已拥有“侠”标记", - }, - ai: { - order: 4, - result: { - player(player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - begin: { - audio: 2, - trigger: { global: "phaseZhunbeiBegin" }, - filter(event, player) { - if (!player.countCards("he")) return false; - return !player.hasSkill("dddxiaxing_used"); - }, - direct: true, - *content(event, map) { - const player = map.player, - trigger = map.trigger, - target = trigger.player; - let result = yield player - .chooseCard( - get.prompt("dddxiaxing"), - `将一张牌置于牌堆顶,视为${get.translation(target)}使用一张【酒】`, - "he" - ) - .set("ai", (card) => { - if (get.event("goon")) return 5 - get.value(card); - return 0; - }) - .set("goon", get.effect(target, { name: "jiu" }, player, player) > 0); - if (!result.bool) return event.finish(); - const cards = result.cards; - player.logSkill("dddxiaxing_begin", target); - player.addTempSkill("dddxiaxing_used", "roundStart"); - game.log(player, "将一张牌置于了牌堆顶"); - player.$throw(cards.length, 1000); - yield player.lose(cards, ui.cardPile, "insert"); - yield target.chooseUseTarget("jiu", true); - if (!player.hasMark("dddxiaxing")) player.addMark("dddxiaxing"); - }, - }, - used: { charlotte: true }, - viewas: { - audio: "dddxiaxing", - enable: "chooseToUse", - filter(event, player) { - if (event.type == "wuxie" || !player.hasMark("dddxiaxing")) return false; - for (const name of ["sha", "shan"]) { - if (event.filterCard({ name: name, isCard: true }, player, event)) - return true; - } - return false; - }, - chooseButton: { - dialog(event, player) { - const vcards = []; - for (const name of ["sha", "shan"]) { - const card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) - vcards.push(["基本", "", name]); - } - const dialog = ui.create.dialog("侠行", [vcards, "vcard"], "hidden"); - dialog.direct = true; - return dialog; - }, - backup(links, player) { - return { - filterCard: () => false, - selectCard: -1, - viewAs: { - name: links[0][2], - isCard: true, - }, - popname: true, - precontent() { - player.logSkill("dddxiaxing_viewas"); - player.clearMark("dddxiaxing"); - }, - }; - }, - prompt(links, player) { - return ( - "侠行:移去“侠”标记,视为使用一张【" + get.translation(links[0][2]) + "】" - ); - }, - }, - ai: { - order(item, player) { - const event = get.event(); - if (event.filterCard({ name: "sha" }, player, event)) { - if ( - !player.hasShan() && - !game.hasPlayer(function (current) { - return ( - player.canUse("sha", current) && - current.hp == 1 && - get.effect(current, { name: "sha" }, player, player) > 0 - ); - }) - ) { - return 0; - } - return 2.95; - } else return 3.15; - }, - respondSha: true, - respondShan: true, - skillTagFilter(player, tag, arg) { - if (!player.hasMark("dddxiaxing")) return false; - if (arg != "use") return false; - }, - result: { - player: 1, - }, - }, - }, - }, - }, - //张承 - dddjuxian: { - enable: "phaseUse", - usable: 2, - filter(event, player) { - return !player.hasSkill("dddjuxian_ban"); - }, - chooseButton: { - dialog(event, player) { - var dialog = ui.create.dialog("聚贤:请选择一项", "hidden"); - dialog.add([ - [ - ["top", "展示一张牌,然后将此牌置于牌堆顶"], - ["hand", "展示一张牌,然后将此牌交给一名其他角色"], - ], - "textbutton", - ]); - return dialog; - }, - filter(button, player) { - return !player.hasSkill("dddjuxian_" + button.link, null, null, false); - }, - check(button) { - return 1; - }, - backup(links) { - return get.copy(lib.skill["dddjuxian_" + links[0]]); - }, - prompt(links) { - if (links[0] == "top") return "展示一张牌,然后将此牌置于牌堆顶"; - return "展示一张牌,然后将此牌交给一名其他角色"; - }, - }, - ai: { - order: 10, - threaten: 1.7, - result: { player: 1 }, - }, - subSkill: { - backup: { audio: "dddjuxian" }, - ban: { charlotte: true }, - top: { - audio: "dddjuxian", - filterCard: true, - selectCard: 1, - position: "he", - discard: false, - delay: false, - lose: false, - *content(event, map) { - const player = map.player, - cards = event.cards; - player.addTempSkill("dddjuxian_top", "phaseUseAfter"); - player.showCards(cards); - const color1 = get.color(cards); - player.$throw(cards, 1000); - game.log(player, "将", cards, "置于了牌堆顶"); - yield player.lose(cards, ui.cardPile, "insert"); - const targets = game.filterPlayer((target) => - target.countGainableCards(player, "he") - ); - let result; - if (!targets.length) return event.finish(); - else if (targets.length == 1) result = { bool: true, targets: targets }; - else - result = yield player - .chooseTarget( - "聚贤:获得一名其他角色的一张牌", - (card, player, target) => { - if (target == player) return false; - return target.countGainableCards(player, "he"); - }, - true - ) - .set("ai", (target) => { - const player = get.player(); - return get.effect(target, { name: "shunshou" }, player, player); - }); - if (!result.bool) return event.finish(); - const target = result.targets[0]; - player.line(target); - result = yield player.gainPlayerCard(target, "he", true); - if (!result.bool) return event.finish(); - const cards2 = result.links; - const color2 = get.color(cards2); - if (color1 && color2 && color1 != color2) player.addTempSkill("dddjuxian_ban"); - }, - ai: { - result: { - player: 1, - }, - }, - }, - hand: { - audio: "dddjuxian", - filterTarget: lib.filter.notMe, - filterCard: true, - selectCard: 1, - position: "he", - discard: false, - delay: false, - lose: false, - *content(event, map) { - const player = map.player, - cards = event.cards, - target = event.targets[0]; - player.addTempSkill("dddjuxian_hand", "phaseUseAfter"); - player.showCards(cards); - const color1 = get.color(cards); - let result; - yield player.give(cards, target); - result = yield player.draw(); - const cards2 = result.filter( - (i) => get.owner(i) == player && get.position(i) == "h" - ); - if (!cards.length) return event.finish(); - const color2 = get.color(cards2); - player.showCards(cards2); - if (color1 && color2 && color1 != color2) player.addTempSkill("dddjuxian_ban"); - }, - ai: { - result: { - player: 1, - target: 1, - }, - }, - }, - }, - }, - dddjungui: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - *content(event, map) { - const player = map.player; - let result = yield player.chooseTarget(get.prompt2("dddjungui")); - if (!result.bool) return event.finish(); - const target = result.targets[0]; - player.logSkill("dddjungui", target); - target.draw(2); - yield target.showHandcards(); - const targetSuitsCount = target - .getCards("h") - .map((card) => { - return get.suit(card); - }) - .toUniqued().length; - const usedCount = player - .getHistory("useCard") - .map((evt) => { - return get.suit(evt.card); - }) - .toUniqued().length; - let decreasedCount = 0; - if (usedCount > 0) { - const numbers = Array.from({ length: usedCount }, (_, i) => - get.cnNumber(i + 1, true) - ); - result = yield player - .chooseControl(numbers, "cancel2") - .set("prompt", `是否令${get.translation(target)}少弃置任意张牌?`) - .set("ai", () => { - return get.event("choice"); - }) - .set("choice", get.attitude(player, target) > 0 ? numbers.lastItem : "cancel2"); - if (result.control != "cancel") { - decreasedCount = result.index + 1; - game.log( - player, - "选择令", - target, - "少弃置", - get.cnNumber(decreasedCount), - "张牌" - ); - } - } - const toDiscardNum = targetSuitsCount - decreasedCount; - if (toDiscardNum <= 0) return event.finish(); - target - .chooseToDiscard( - `隽轨:请弃置${get.cnNumber(toDiscardNum)}张花色不同的手牌`, - toDiscardNum, - true, - (card, player) => { - const suit = get.suit(card); - for (const cardx of ui.selected.cards) { - if (get.suit(cardx) == suit) return false; - } - return true; - } - ) - .set("complexCard", true); - }, - }, - //刘宠 - dddjinggou: { - audio: 2, - trigger: { player: "useCardAfter" }, - forced: true, - filter(event, player) { - if (get.type(event.card) != "equip") return false; - if (get.subtype(event.card) != "equip1") return false; - const range = player.getAttackRange(); - return !game.hasPlayer((current) => { - return current.getAttackRange() > range; - }); - }, - direct: true, - *content(event, map) { - const player = map.player; - let result = yield player - .chooseTarget("精彀:对一名其他角色造成1点伤害", true, lib.filter.notMe) - .set("ai", (target) => { - var player = get.player(); - return get.damageEffect(target, player, player); - }); - if (result.bool) { - const target = result.targets[0]; - player.logSkill("dddjinggou", target); - target.damage(); - } - }, - }, - dddmoyan: { - audio: 2, - trigger: { global: "roundStart" }, - *content(event, map) { - const player = map.player; - const cards = game.cardsGotoOrdering(get.cards(3)).cards; - yield player.showCards(cards, `${get.translation(player)}发动了【末焱】`); - let result = yield player - .chooseTarget("末焱:选择一名角色获得其中至少一张牌") - .set("ai", (target) => get.attitude(get.player(), target)); - if (!result.bool) return event.finish(); - const target = result.targets[0]; - result = yield target - .chooseButton(["末焱:获得至少一张牌", cards], true, [1, cards.length]) - .set("ai", (button) => { - return get.value(button.link); - }); - if (!result.bool) return event.finish(); - const gains = result.links; - target.gain(gains, "gain2"); - player.setStorage("dddmoyan_target", [target, gains.length]); - player.addTempSkill("dddmoyan_target", "roundStart"); - }, - subSkill: { - target: { - onremove: true, - trigger: { player: "damageBegin3" }, - filter(event, player) { - const info = player.getStorage("dddmoyan_target"); - return info[0] && info[0].isIn() && info[0].countCards("h") <= info[1]; - }, - forced: true, - charlotte: true, - content() { - trigger.increase("num"); - }, - }, - }, - }, - //罗宪 - dddshilie: { - audio: 2, - enable: "chooseToUse", - hiddenCard(player, name) { - if (!player.countCards("h")) return false; - return name == "sha" || name == "shan"; - }, - filter(event, player) { - if (event.type == "wuxie" || !_status.currentPhase) return false; - if (!player.countCards("h") || player.hasSkill("dddshilie_used", null, null, false)) - return false; - for (var name of ["sha", "shan"]) { - if (event.filterCard({ name: name, isCard: true }, player, event)) return true; - } - return false; - }, - chooseButton: { - dialog(event, player) { - var vcards = []; - for (var name of ["sha", "shan"]) { - var card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); - } - const dialog = ui.create.dialog("示烈", [vcards, "vcard"], "hidden"); - dialog.direct = true; - return dialog; - }, - check(button) { - return 1; - }, - backup(links, player) { - return { - filterCard(card) { - return !get.is.shownCard(card); - }, - filterOk: () => { - return ( - ui.selected.cards - .map((card) => { - return get.number(card); - }) - .reduce((p, c) => { - return p + c; - }, 0) >= - get.player().getHp() + - (_status.currentPhase ? _status.currentPhase.getHp() : 0) - ); - }, - selectCard: [1, Infinity], - viewAs: { - name: links[0][2], - isCard: true, - }, - popname: true, - ignoreMod: true, - ai1(card) { - const need = - get.player().getHp() + - (_status.currentPhase ? _status.currentPhase.getHp() : 0); - let num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - if (num + get.number(card) == need) return 20 - 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 (cards[i].number + cards[j].number >= need) { - if (cards[i] == card || cards[j] == card) - return 15 - get.value(card); - } - } - } - } - return 0.1; - }, - precontent() { - "step 0"; - player.logSkill("dddshilie"); - player.addTempSkill("dddshilie_used"); - var cards = event.result.cards.slice(); - player.addShownCards(cards, "visible_dddshilie"); - delete event.result.skill; - player.showCards(cards, get.translation(player) + "发动了【示烈】"); - if ( - cards - .map((card) => { - return get.number(card); - }) - .reduce((p, c) => { - return p + c; - }, 0) == - player.getHp() + (_status.currentPhase ? _status.currentPhase.getHp() : 0) - ) { - player.draw(cards.length); - } - event.result.card = new lib.element.VCard({ - name: event.result.card.name, - isCard: true, - }); - event.result.cards = []; - game.delayx(); - }, - }; - }, - prompt(links, player) { - return `###示烈###明置任意张点数之和不小于${ - player.getHp() + (_status.currentPhase ? _status.currentPhase.getHp() : 0) - }的牌,视为使用【${get.translation(links[0][2])}】`; - }, - }, - subSkill: { used: { charlotte: true } }, - ai: { - order(item, player) { - const evt = get.event(); - for (var name of ["sha", "shan"]) { - if (evt.filterCard({ name: name }, player, evt)) - return get.order({ name: name }) + 0.1; - } - return 1; - }, - respondSha: true, - respondShan: true, - skillTagFilter(player, tag, arg) { - if (!player.countCards("h")) return false; - }, - result: { - player(player) { - return 1; - }, - }, - }, - }, - //李娥 - dddyeshen: { - trigger: { global: "phaseJieshuBegin" }, - logTarget: "player", - prompt2(event, player) { - var num = player.countMark("dddyeshen"); - var str = - "亮出牌堆底的" + - get.cnNumber(3 - num) + - "张牌,然后其将其中的一张牌当作【铁索连环】使用或打出。"; - if (num >= 2) str += "然后你受到1点火属性伤害并重置此技能。"; - return str; - }, - check(event, player) { - if ( - player.countMark("dddyeshen") >= 2 && - get.damageEffect(player, player, player, "fire") < 0 - ) - return false; - return get.attitude(player, event.player) > 0; - }, - content() { - "step 0"; - event.target = trigger.player; - var cards = get.bottomCards(3 - player.countMark("dddyeshen")); - event.cards = cards; - game.cardsGotoOrdering(cards); - player.showCards( - cards, - get.translation(player) + "对" + get.translation(target) + "发动了【冶身】" - ); - if (!cards.some((card) => get.color(card) == "black")) event.goto(4); - "step 1"; - if (target.isIn()) { - var blacks = cards.filter((card) => get.color(card) == "black"); - if (blacks.length > 1) - target - .chooseButton(["选择一张牌当作【铁索连环】使用或重铸", blacks], true) - .set("ai", (button) => get.translation(button.link.name).length); - else - event._result = { - bool: true, - links: blacks, - }; - } else event.goto(4); - "step 2"; - if (result.bool) { - event.links = result.links.slice(0); - var card = get.autoViewAs({ name: "tiesuo" }, result.links); - var maxNum = get.translation(result.links[0].name).length; - if (!game.hasPlayer((current) => target.canUse(card, current))) { - event._result = { bool: false }; - } else - target - .chooseTarget( - "请选择【铁索连环】的目标,或点“取消”重铸", - function (card, player, target) { - var card = _status.event.card; - return player.canUse(card, target); - }, - [1, Math.min(maxNum, game.countPlayer())] - ) - .set("card", card) - .set("ai", function (target) { - var player = _status.event.player, - card = _status.event.card; - return get.effect_use(target, card, player, player); - }); - } - "step 3"; - if (result.bool && result.targets.length > 0) { - var card = get.autoViewAs({ name: "tiesuo" }, event.links); - target.useCard(result.targets, card, event.links); - } else { - target.recast(event.links, (player, cards) => game.cardsDiscard(cards)); - } - "step 4"; - for (var card of cards) { - if (get.position(card, true) == "o") - ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - } - "step 5"; - var num = player.countMark("dddyeshen"); - if (num < 2) { - player.addMark("dddyeshen", 1, false); - game.log(player, "的", "#g【冶身】", "的亮出牌数-1"); - } else { - player.removeMark("dddyeshen", num, false); - game.log(player, "还原了", "#g【冶身】", "的亮出牌数"); - player.damage("fire", "nocard"); - } - }, - }, - dddqiaoduan: { - trigger: { global: "linkAfter" }, - direct: true, - usable: 1, - filter(event, player) { - var num = game.countPlayer((current) => current.isLinked()); - if (event.player.isLinked()) { - return ( - player.countCards("he") >= num && game.hasPlayer((current) => current.isDamaged()) - ); - } else { - return num > 0; - } - }, - content() { - "step 0"; - if (trigger.player.isLinked()) { - var num = game.countPlayer((current) => current.isLinked()); - player.chooseCardTarget({ - prompt: get.prompt("dddqiaoduan"), - prompt2: - "操作提示:选择" + - get.cnNumber(num) + - "张牌和一名已受伤的角色。将这些牌置于牌堆底(先选择的在上),然后该角色回复1点体力。", - filterCard: true, - selectCard: num, - filterTarget: (card, player, target) => target.isDamaged(), - ai1: (card) => 5 - get.value(card), - ai2: (target) => { - var player = _status.event.player; - return get.recoverEffect(target, player, player); - }, - }); - } else event.goto(2); - "step 1"; - if (result.bool) { - player.logSkill("dddqiaoduan", result.targets[0]); - player.loseToDiscardpile(result.cards, ui.cardPile); - result.targets[0].recover(); - } else player.storage.counttrigger.dddqiaoduan--; - event.finish(); - "step 2"; - var num = game.countPlayer((current) => current.isLinked()); - player - .chooseTarget( - get.prompt("dddqiaoduan"), - [1, num], - "令至多" + get.cnNumber(num) + "名角色各摸一张牌" - ) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }); - "step 3"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.logSkill("dddqiaoduan", targets); - game.asyncDraw(targets); - game.delayex(); - } else player.storage.counttrigger.dddqiaoduan--; - }, - }, - //孙亮 - ddddiedang: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - if (player.storage.ddddiedang) return player.countCards("he") >= 3; - return true; - }, - filterCard: true, - position: "he", - selectCard() { - var player = _status.event.player; - return player.storage.ddddiedang ? 3 : 0; - }, - prompt() { - var player = _status.event.player; - if (player.storage.ddddiedang) return "弃置三张牌,然后摸一张牌"; - return "摸三张牌,然后弃置一张牌"; - }, - check: (card) => 5 - get.value(card), - content() { - "step 0"; - if (player.storage.ddddiedang) { - player.draw(); - } else { - player.draw(3); - player.chooseToDiscard(true, "he"); - } - "step 1"; - if (player.isMaxHandcard() || player.isMinHandcard()) - player.storage.ddddiedang = !player.storage.ddddiedang; - }, - ai: { - order: 1, - result: { - player(player) { - if (ui.selected.cards.length) { - var num = - 1 + player.countCards("h", (card) => !ui.selected.cards.includes(card)); - if ( - !game.hasPlayer((current) => { - return current != player && current.countCards("h") > num; - }) || - !game.hasPlayer((current) => { - return current != player && current.countCards("h") < num; - }) - ) - return 1; - return -1; - } - return 1; - }, - }, - }, - }, - dddanliu: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter(event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }) - ); - }, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("dddanliu"), function (card, player, target) { - return target != player && target.countCards("h") > 0; - }) - .set("ai", function (target) { - return get.attitude(get.player(), target) * Math.sqrt(1 + target.countCards("h")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dddanliu", target); - event.target = target; - } else event.finish(); - "step 2"; - player - .choosePlayerCard(target, true, "h", "visible", [0, 1]) - .set("filterOk", () => ui.selected.buttons.length > 0) - .set("ai", (button) => { - var player = get.player(), - target = _status.event.target; - var color = get.color(button.link); - if ( - player.hasCard(function (card) { - return get.color(card) == color; - }, "h") - ) { - if (color == "red") - return ( - get.recoverEffect(player, player, player) + - 2 / Math.max(2, get.value(button.link)) - ); - if (color == "black") - return ( - 2 * get.effect(target, { name: "draw" }, target, player) + - 2 / Math.max(2, get.value(button.link)) - ); - } - return get.value(button.link) / 3; - }); - "step 3"; - if (result.bool) { - event.card1 = result.cards[0]; - target - .choosePlayerCard( - player, - true, - "h", - "visible", - [0, 1], - get.translation(player) + - "选择了你的" + - get.translation(event.card1) + - "。请选择其的一张牌" - ) - .set("ai", function (button) { - var evt = _status.event.getParent(); - var player = evt.target, - card = evt.card1, - source = evt.player; - var color = get.color(card); - if (get.attitude(player, target) > 0) { - if (get.color(button.link) == color) return 20 - get.value(card); - return -get.value(card); - } else { - if (get.color(button.link) == "black") return 20 + get.value(card); - return get.value(card); - } - }) - .set("filterOk", () => ui.selected.buttons.length > 0); - } - "step 4"; - if (result.bool) { - event.card2 = result.cards[0]; - var color = get.color(event.card1); - if (color != "none" && get.color(event.card2) == color) { - event.color = color; - var next = player.chooseBool("是否与" + get.translation(target) + "交换展示牌"); - var prompt2 = - "用" + - get.translation(event.card1) + - "交换对方的" + - get.translation(event.card2); - if (color == "black") { - prompt2 += ",然后对方摸两张牌"; - next.set( - "goon", - 2 * get.effect(target, { name: "draw" }, target, player) > 0 - ); - } else if (color == "red" && player.isDamaged()) { - prompt2 += ",然后你回复1点体力"; - next.set("goon", get.recoverEffect(player, player, player) > 0); - } - next.set("prompt2", prompt2); - next.set("ai", () => Boolean(_status.event.goon)); - } else event.finish(); - } - "step 5"; - if (result.bool) { - player.swapHandcards(target, [event.card2], [event.card1]); - if (event.color == "black") { - target.draw(2); - } else if (event.color == "red") { - player.recover(); - } - } - }, - }, - dddguiying: { - zhuSkill: true, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter(event, player) { - return ( - player.hasZhuSkill("dddguiying") && - game.hasPlayer(function (current) { - return ( - current != player && - current.group == "wu" && - player.hasZhuSkill("dddguiying", current) && - current.countCards("h") > 0 - ); - }) - ); - }, - gainEffect(player) { - var gainers = game.filterPlayer((current) => current.countCards("ej")); - if (!gainers.length) return 0; - var min = Math.min.apply( - Math, - gainers.map((current) => { - return Math.min.apply( - Math, - current.getCards("ej").map(function (card) { - return get.number(card, current); - }) - ); - }) - ); - return Math.max.apply( - Math, - game - .filterPlayer(function (target) { - return target.hasCard(function (card) { - return ( - get.number(card, target) == min && - lib.filter.canBeGained(card, player, target) - ); - }, "ej"); - }) - .map(function (target) { - var cards = target.getCards("ej", function (card) { - return ( - get.number(card, target) == min && - lib.filter.canBeGained(card, player, target) - ); - }), - att = get.attitude(player, target); - return Math.max.apply( - Math, - cards.map((card) => { - if (target.getCards("j").includes(card)) { - var efff = get.effect( - target, - { - name: card.viewAs || card.name, - cards: [card], - }, - player, - player - ); - if (efff > 0) return -0.5 * att; - if (efff == 0) return 0; - return 1.5 * att; - } - if (target.getCards("e").includes(card)) { - var evalue = get.value(card, target); - if (target.hasSkillTag("noe")) { - if (evalue >= 7) { - return (-evalue / 6) * att; - } - return (-evalue / 10) * att; - } - return (-evalue / 3) * att; - } - }) - ); - }) - ); - }, - content() { - "step 0"; - event.targets = game - .filterPlayer(function (current) { - return ( - current != player && - current.group == "wu" && - player.hasZhuSkill("dddguiying", current) - ); - }) - .sortBySeat(); - if (!event.targets.length) event.finish(); - "step 1"; - var target = event.targets.shift(); - event.target = target; - if (target.isIn() && target.group == "wu" && target.countCards("h") > 0) { - target - .chooseBool( - "归萤:是否响应" + get.translation(player) + "的主公技?", - "你可以展示所有手牌,将点数最大的牌交给该角色;然后你可以获得场上点数最小的一张牌" - ) - .set("ai", function () { - var player = get.player(), - source = _status.event.getParent().player; - if (_status.event.gainEffect <= 0) return 0; - return get.attitude(player, source) > 0; - }) - .set("gainEffect", lib.skill.dddguiying.gainEffect(target)); - } else event.goto(7); - "step 2"; - if (result.bool) { - target.logSkill("dddguiying", player); - target.showHandcards(get.translation(target) + "响应了〖归萤〗"); - } else event.goto(7); - "step 3"; - if (target.isIn()) { - var cards = target.getCards("he"); - if (!cards.length) event.goto(7); - var max = Math.max.apply( - Math, - cards.map((card) => get.number(card, target)) - ); - var gives = cards.filter((card) => get.number(card, target) == max); - if (gives.length <= 1) event._result = { bool: true, cards: gives }; - else - target - .chooseCard("he", true, "选择给出一张点数最大的牌", function (card) { - return _status.event.cards.includes(card); - }) - .set("cards", gives); - } else event.goto(7); - "step 4"; - if (result.bool) { - target.give(result.cards, player, "visible"); - } else event.goto(7); - "step 5"; - var gainers = game.filterPlayer((current) => current.countCards("ej")); - if (target.isIn() && gainers.length > 0) { - var min = Math.min.apply( - Math, - gainers.map((current) => { - return Math.min.apply( - Math, - current.getCards("ej").map(function (card) { - return get.number(card, current); - }) - ); - }) - ); - target - .chooseTarget("是否获得场上点数最小的一张牌?", function (card, player, target) { - var num = _status.event.minNum; - return target.hasCard(function (card) { - return ( - get.number(card, target) == num && - lib.filter.canBeGained(card, player, target) - ); - }, "ej"); - }) - .set("minNum", min) - .set("ai", function (target) { - var player = get.player(), - min = _status.event.minNum; - var cards = target.getCards("ej", function (card) { - return ( - get.number(card, target) == min && - lib.filter.canBeGained(card, player, target) - ); - }), - att = get.attitude(player, target); - return Math.max.apply( - Math, - cards.map((card) => { - if (target.getCards("j").includes(card)) { - var efff = get.effect( - target, - { - name: card.viewAs || card.name, - cards: [card], - }, - player, - player - ); - if (efff > 0) return -0.5 * att; - if (efff == 0) return 0; - return 1.5 * att; - } - if (target.getCards("e").includes(card)) { - var evalue = get.value(card, target); - if (target.hasSkillTag("noe")) { - if (evalue >= 7) { - return (-evalue / 6) * att; - } - return (-evalue / 10) * att; - } - return (-evalue / 3) * att; - } - }) - ); - }); - } else event.goto(7); - "step 6"; - if (result.bool) { - var target2 = result.targets[0]; - target.line(target2, "green"); - var min = Math.min.apply( - Math, - target2.getCards("ej").map(function (card) { - return get.number(card, target2); - }) - ), - cards = target2.getCards("ej", (card) => get.number(card, target2) == min); - if (cards.length <= 1) target.gain(cards, target2, "give", "bySelf"); - else - target - .gainPlayerCard(target2, "ej", true) - .set("filterButton", function (button) { - return _status.event.cards.includes(button.link); - }) - .set("cards", cards); - } - "step 7"; - if (targets.length > 0) event.goto(1); - }, - }, - //王伉吕凯 - dddbingjian: { - enable: ["chooseToUse", "chooseToRespond"], - filter(event, player) { - if (event.type == "wuxie") return false; - if (player.countMark("dddbingjian_used") >= 2) return false; - if (player.countCards("h") == 2) return false; - return ( - event.filterCard( - { - name: "sha", - isCard: true, - }, - player, - event - ) || - event.filterCard( - { - name: "shan", - isCard: true, - }, - player, - event - ) - ); - }, - chooseButton: { - dialog(event, player) { - return ui.create.dialog( - "并肩", - // [[ - // [2,'调整至2张'], - // [4,'调整至4张'] - // ],'tdnodes'], - [["sha", "shan"], "vcard"], - "hidden" - ); - }, - // select:2, - filter(button, player) { - if (ui.selected.buttons.length) { - if (typeof button.link == typeof ui.selected.buttons[0].link) return false; - } - // if(typeof button.link=='number'){ - // return button.link!=player.countCards('h'); - // } - return _status.event.getParent().filterCard({ - name: button.link[2], - isCard: true, - }); - }, - check(button) { - // if(typeof button.link=='number') return button.link; - return 1; - }, - backup(links, player) { - // if(typeof links[0]=='number') links.reverse(); - var skill = { - viewAs: { - name: links[0][2], - suit: "none", - number: null, - isCard: true, - }, - }; - var num = 2 - player.countCards("h"); - if (num > 0) { - skill.draw = num; - skill.filterCard = function () { - return false; - }; - skill.selectCard = -1; - skill.precontent = lib.skill.dddbingjian.content_draw; - } else { - skill.selectCard = -num; - skill.ignoreMod = true; - skill.filterCard = lib.filter.cardDiscardable; - skill.precontent = lib.skill.dddbingjian.content_discard; - skill.check = function (card) { - return 5 - get.value(card); - }; - } - return skill; - }, - prompt(links, player) { - // if(typeof links[0]=='number') links.reverse(); - var num = 2 - player.countCards("h"); - if (num > 0) { - return "摸" + get.cnNumber(num) + "张牌并视为使用" + get.translation(links[0][2]); - } else { - return ( - "弃置" + get.cnNumber(-num) + "张牌并视为使用" + get.translation(links[0][2]) - ); - } - }, - }, - ai: { - pretao: true, - order(item, player) { - if (player.countCards("h") < 4) return get.order({ name: "sha" }, player) + 0.2; - return 1; - }, - result: { - player: 1, - }, - }, - content_draw() { - "step 0"; - delete event.result.skill; - player.logSkill("dddbingjian"); - player.draw(lib.skill.dddbingjian_backup.draw); - player.addTempSkill("dddbingjian_used"); - player.addMark("dddbingjian_used", 1, false); - "step 1"; - player - .chooseTarget("是否令一名其他角色摸等量的牌?", lib.filter.notMe) - .set("ai", (target) => { - var player = get.player(); - return get.effect(target, { name: "draw" }, player, player); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.draw(lib.skill.dddbingjian_backup.draw); - } - }, - content_discard() { - "step 0"; - delete event.result.skill; - player.logSkill("dddbingjian"); - player.discard(event.result.cards); - event.num = event.result.cards.length; - player.addTempSkill("dddbingjian_used"); - player.addMark("dddbingjian_used", 1, false); - event.result.card = { - name: event.result.card.name, - isCard: true, - }; - event.result.cards = []; - "step 1"; - player - .chooseTarget("是否弃置一名其他角色等量的牌?", lib.filter.notMe) - .set("ai", (target) => { - var player = get.player(), - num = target.countCards("he") - get.event("num"); - if (num >= 0) num = 1; - else num = 1 - num / 5; - var eff = get.effect(target, { name: "guohe_copy2" }, player, player); - return eff / num; - }) - .set("num", event.num); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - player.discardPlayerCard(target, "he", true, event.num); - } - }, - content_draw_old() { - "step 0"; - delete event.result.skill; - player.logSkill("dddbingjian"); - player.addTempSkill("dddbingjian_round", "roundStart"); - player.draw(lib.skill.dddbingjian_backup.draw); - "step 1"; - player - .chooseTarget( - "是否令一名角色本轮内不能使用或打出" + get.translation(event.result.card) + "?" - ) - .set("ai", function (target) { - var player = _status.event.player; - return ( - -get.attitude(player, target) * - get.threaten(target, player) * - Math.sqrt(1 + target.countCards("h")) - ); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - player.chat("你不许使用" + get.translation(event.result.card)); - target.addTempSkill("dddbingjian_blocker", "roundStart"); - target.markAuto("dddbingjian_blocker", [event.result.card.name]); - game.delayx(); - } - }, - content_discard_old() { - "step 0"; - delete event.result.skill; - player.logSkill("dddbingjian"); - player.discard(event.result.cards); - event.result.card = { - name: event.result.card.name, - isCard: true, - }; - event.result.cards = []; - "step 1"; - var hs = player.countCards("h"); - if (!game.hasPlayer((current) => current.countCards("h") != hs)) { - event.finish(); - } else { - player - .chooseTarget( - "是否令一名角色将手牌调整至" + get.cnNumber(player.countCards("h")) + "张?", - function (card, player, target) { - return target.countCards("h") != player.countCards("h"); - } - ) - .set("ai", function (target) { - var player = _status.event.player, - num = target.countCards("h") - player.countCards("h"); - if (num > 0) - return get.attitude(player, target) * Math.sqrt(1 + Math.abs(num)); - return -get.attitude(player, target) * Math.sqrt(-num); - }); - } - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - var num = target.countCards("h") - player.countCards("h"); - if (num > 0) target.chooseToDiscard("h", true, num); - else target.draw(Math.min(5, -num)); - } - }, - subSkill: { - round: { charlotte: true }, - blocker: { - charlotte: true, - mod: { - cardEnabled(card, player) { - if (player.getStorage("dddbingjian_blocker").includes(card.name)) - return false; - }, - cardRespondable(card, player) { - if (player.getStorage("dddbingjian_blocker").includes(card.name)) - return false; - }, - cardSavable(card, player) { - if (player.getStorage("dddbingjian_blocker").includes(card.name)) - return false; - }, - }, - mark: true, - intro: { - content: "本轮内不能使用或打出$", - }, - }, - used: { - charlotte: true, - onremove: true, - }, - }, - }, - //梁习 - dddtongyu: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("hs") > 0; - }, - viewAs: { - name: "wugu", - }, - selectCard: [1, 4], - filterCard(card) { - var suit = get.suit(card); - if (suit == "none") return false; - if (!ui.selected.cards.length) return true; - for (var card of ui.selected.cards) { - if (get.suit(card) == suit) return false; - } - return true; - }, - complexCard: true, - position: "hs", - prompt: "将任意张花色不同的牌当做【五谷丰登】使用", - check(card) { - return 5 - get.value(card); - }, - precontent() { - if (!event.result.card.storage) event.result.card.storage = {}; - event.result.card.storage.chooseDirection = true; - event.result.card.storage.extraCardsNum = event.result.cards.length; - player.addTempSkill("dddtongyu_effect"); - }, - ai: { - order: 1, - }, - subSkill: { - effect: { - trigger: { global: "useCardToTargeted" }, - forced: true, - charlotte: true, - popup: false, - filter(event, player) { - return event.skill == "dddtongyu" && event.isFirstTarget; - }, - content() { - "step 0"; - event.targets = trigger.targets - .slice() - .sortBySeat(_status.currentPhase || player); - "step 1"; - var target = targets.shift(); - event.target = target; - if (!target.isUnderControl(true) && !target.isOnline()) game.delayx(); - target - .chooseControl() - .set("choiceList", [ - "本回合不能使用或打出手牌", - "令" + get.translation(trigger.card) + "对自己无效", - ]) - .set("ai", function () { - var player = _status.event.player; - var source = _status.event.getTrigger().player; - return player == source ? 1 : 0; - }); - "step 2"; - if (result.index == 0) { - target.chat("接受五谷"); - target.addTempSkill("dddtongyu_blocker"); - game.log(target, "本回合不能使用或打出手牌"); - } else { - target.chat("拒绝五谷"); - trigger.excluded.add(target); - var evt = trigger.getParent(); - if (!evt.dddtongyu_targets) evt.dddtongyu_targets = []; - evt.dddtongyu_targets.add(target); - game.log(target, "令", trigger.card, "对其无效"); - } - if (targets.length) event.goto(1); - }, - group: "dddtongyu_give", - }, - give: { - trigger: { player: "wuguRemained" }, - direct: true, - filter(event, player) { - if (event.skill != "dddtongyu" || event.remained.filterInD().length == 0) - return false; - var list = event.getParent().dddtongyu_targets; - return list.some((target) => target.isIn()); - }, - content() { - "step 0"; - event.cards = trigger.remained.filterInD(); - player - .chooseTarget( - "仝御:令一名角色获得" + get.translation(event.cards), - function (card, player, target) { - return _status.event.targets.includes(target); - } - ) - .set("targets", trigger.getParent().dddtongyu_targets) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att < 3) return 0; - if (target.hasJudge("lebu")) att /= 2; - if (target.hasSkillTag("nogain")) att /= 10; - return att / (1 + get.distance(player, target, "absolute")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dddtongyu_give", target); - target.gain(cards, "gain2"); - } - }, - }, - blocker: { - mark: true, - intro: { content: "本回合不能使用或打出手牌" }, - mod: { - cardEnabled2(card) { - return false; - }, - }, - }, - }, - }, - dddzhilian: { - trigger: { global: "phaseEnd" }, - direct: true, - filter(event, player) { - var targets = game.filterPlayer2(function (current) { - return ( - current.getHistory("useCard").length + current.getHistory("respond").length > 0 - ); - }); - if ( - !targets.includes(player) || - !targets.some((target) => target != player && target.hasSex("male")) - ) - return false; - return targets.length == 2 && !targets.some((target) => !target.isIn()); - }, - content() { - "step 0"; - var targets = game - .filterPlayer(function (current) { - return ( - current.getHistory("useCard").length + current.getHistory("respond").length > - 0 - ); - }) - .sortBySeat(trigger.player); - event.targets = targets; - var choices = ["摸牌"]; - var prompt2 = "令"; - for (var i = 0; i < 2; i++) { - if (targets[i] == player) prompt2 += "你"; - else prompt2 += get.translation(targets[i]); - if (i == 0) prompt2 += "和"; - } - prompt2 += "各摸一张牌"; - if (targets.some((target) => target.countCards("he") > 0)) { - prompt2 += "或各弃置一张牌"; - choices.push("弃牌"); - } - player - .chooseControl(choices, "cancel2") - .set("prompt", get.prompt("dddzhilian")) - .set("prompt2", prompt2) - .set("ai", function () { - var player = _status.event.player; - var targets = _status.event.getParent().targets.slice(0); - if (targets.includes(player)) { - targets.remove(player); - if (get.attitude(player, targets[0]) > 0) return 0; - if ( - targets[0].countCards("he") > 0 && - !targets[0].hasCard((card) => get.value(card, targets[0]) <= 0, "e") && - player.countCards("h", "sha") > 0 - ) - return 1; - return "cancel2"; - } else { - var att1 = get.attitude(player, targets[0]), - att2 = get.attitude(player, targets[1]); - if (get.sgn(att1) != get.sgn(att2)) return "cancel2"; - return att1 > 0 ? 0 : 1; - } - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("dddzhilian", targets); - if (result.control == "摸牌") { - game.asyncDraw(targets); - game.delayex(); - } else { - for (var target of targets) target.chooseToDiscard("he", true); - } - if (!targets.includes(player)) event.finish(); - } else event.finish(); - "step 2"; - var cards = []; - game.getGlobalHistory("cardMove", function (evt) { - if ( - (evt.name == "lose" && evt.position == ui.discardPile) || - evt.name == "cardsDiscard" - ) - cards.addArray(evt.cards); - }); - cards = cards.filter((card) => card.name == "sha" && get.position(card, true) == "d"); - if (cards.length > 0) player.gain(cards, "gain2"); - }, - }, - dddjijian: { - enable: "phaseUse", - usable: 1, - filterCard: { name: "sha" }, - position: "h", - discard: false, - delay: false, - lose: false, - filter: (event, player) => - game.hasPlayer((current) => lib.skill.dddjijian.filterTarget(null, player, current)), - filterTarget: (card, player, target) => target != player && target.hasSex("male"), - content() { - "step 0"; - player.showCards(cards); - player.give(cards, target); - "step 1"; - var cards = target.getCards("h"); - if (!cards.length) event.finish(); - else if (cards.length == 1) event._result = { bool: true, cards: cards }; - else - target - .chooseCard( - "h", - true, - [1, 2], - "请展示一至两张颜色相同的【杀】或普通锦囊牌", - (card, player) => { - var color = get.color(card); - for (var cardx of ui.selected.cards) { - if (get.color(cardx) != color) return false; - } - return get.name(card) == "sha" || get.type(card) == "trick"; - } - ) - .set("complexCard", true) - .set("ai", function (card) { - var player = _status.event.player, - source = _status.event.getParent().player; - if (get.attitude(source, player) <= 0) return -get.value(card); - var name = get.name(card), - color = get.color(card); - if ( - name == "sha" || - player.getUseValue(card) <= 0 || - player.hasCard((card2) => { - return ( - card2 != card && - !ui.selected.cards.includes(card2) && - get.name(card2) == name - ); - }) - ) { - if (!ui.selected.cards.length && color == "black") - return 1 + Math.random(); - return Math.random(); - } - if (!ui.selected.cards.length || get.color(ui.selected.cards[0] == "red")) { - if (color == "black") - return 0.2 - player.getUseValue(card) / 100 + Math.random(); - } - return 0.1 - player.getUseValue(card) / 100; - }); - "step 2"; - if (result.bool) { - var cards = result.cards; - event.cards = cards; - target.showCards( - cards, - get.translation(player) + "对" + get.translation(target) + "发动了【赍剑】" - ); - event.usedName = []; - event.targets = [player, target].sortBySeat(_status.currentPhase || player); - } else event.finish(); - "step 3"; - var current = event.targets.shift(); - if (!current.isIn()) { - event.goto(5); - return; - } - event.current = current; - var list = event.cards - .filter((card) => { - return ( - !event.usedName.includes(get.name(card)) && - current.hasUseTarget({ - name: get.name(card), - nature: get.nature(card), - }) - ); - }) - .map((card) => { - return [get.type(card), "", get.name(card), get.nature(card)]; - }); - if (!list.length) event.finish(); - else - current - .chooseButton(["赍剑:视为使用一张牌", [list, "vcard"]], true) - .set("ai", function (button) { - return get.player().getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }); - "step 4"; - if (result.bool) { - var name = result.links[0][2]; - event.usedName.add(name); - event.current.chooseUseTarget( - { - name: name, - nature: result.links[0][3], - isCard: true, - }, - true, - false - ); - } - "step 5"; - if (event.targets.length) event.goto(3); - }, - ai: { - order: 4, - result: { - player(player, target) { - if ( - get.attitude(player, target) > 0 && - player.hasCard((card) => get.name(card) == "sha", "h") - ) - return target.countCards("h"); - return 0.1 / target.countCards("h"); - }, - }, - }, - }, - dddjijian_old: { - enable: "phaseUse", - usable: 1, - filter: (event, player) => - game.hasPlayer((current) => lib.skill.dddjijian_old.filterTarget(null, player, current)), - filterTarget: (card, player, target) => - target != player && target.hasSex("male") && target.countCards("h") > 0, - content() { - "step 0"; - target.chooseCard("h", true, [1, 2], "请展示一至两张手牌").set("ai", function (card) { - var player = _status.event.player, - source = _status.event.getParent().player; - if (get.attitude(source, player) <= 0) return -get.value(card); - var name = get.name(card), - color = get.color(card); - if ( - name == "sha" || - player.getUseValue(card) <= 0 || - player.hasCard((card2) => { - return ( - card2 != card && - !ui.selected.cards.includes(card2) && - get.name(card2) == name - ); - }) - ) { - if (!ui.selected.cards.length && color == "black") return 1 + Math.random(); - return Math.random(); - } - if (!ui.selected.cards.length || get.color(ui.selected.cards[0] == "red")) { - if (color == "black") return 0.2 - player.getUseValue(card) / 100 + Math.random(); - } - return 0.1 - player.getUseValue(card) / 100; - }); - "step 1"; - if (result.bool) { - var cards = result.cards; - event.cards = cards; - target.showCards( - cards, - get.translation(player) + "对" + get.translation(target) + "发动了【赍剑】" - ); - if ( - !player.hasCard((card) => { - if (_status.connectMode) return true; - return get.name(card, player) == "sha"; - }, "h") - ) - event.finish(); - } else event.finish(); - "step 2"; - var colors = []; - for (var card of cards) colors.add(get.color(card, target)); - colors.sort(); - var str = "若你给出的【杀】为"; - for (var i = 0; i < colors.length; i++) { - str += get.translation(colors[i]); - if (i < colors.length - 1) str += "或"; - } - str += ",则其获得后续增益效果"; - player - .chooseCard( - "h", - (card, player) => get.name(card, player) == "sha", - "是否交给" + get.translation(target) + "一张【杀】?", - str - ) - .set("colors", colors) - .set("ai", function (card) { - var player = _status.event.player, - target = _status.event.getParent().target; - if (get.attitude(player, target) < 0) return false; - if (!_status.event.colors.includes(get.color(card, player))) return 0; - if (game.hasNature(card)) return 1.2; - return 1; - }); - "step 3"; - if (result.bool) { - player.give(result.cards, target, "giveAuto"); - var num = 0, - color = get.color(result.cards[0], player); - for (var card of cards) { - if (get.color(card, target) == color) num++; - } - if (!num) event.finish(); - else event.num = num; - } else event.finish(); - "step 4"; - var cards = target.getCards("h"); - cards.removeArray(event.cards); - var names = []; - for (var card of cards) { - var name = get.name(card, target), - type = get.type(card); - if (type != "basic" && type != "trick") continue; - if (name == "sha") { - var natures = get.natureList(card, target); - for (var nature of natures) { - if (nature && lib.nature.has(nature)) name += "|" + nature; - } - } - names.push(name); - } - if (!names.length) event.finish(); - else event.names = names; - "step 5"; - event.num--; - target - .chooseButton([ - "是否视为使用一张牌?", - [ - event.names.map((name) => { - if (name.indexOf("sha|") == 0) { - return ["基本", "", "sha", name.slice(4).split("|")]; - } - return [get.type(name), "", name]; - }), - "vcard", - ], - ]) - .set("filterButton", function (button) { - var card = { - name: button.link[2], - nature: button.link[3], - isCard: true, - }, - player = _status.event.player; - return player.hasUseTarget(card); - }) - .set("ai", function (button) { - var card = { - name: button.link[2], - nature: button.link[3], - isCard: true, - }, - player = _status.event.player; - return player.getUseValue(card); - }); - "step 6"; - if (result.bool) { - var card = { - name: result.links[0][2], - nature: result.links[0][3], - isCard: true, - }; - target.chooseUseTarget(card, true, false); - if (event.num > 0) { - var name = card.name; - if (name == "sha") { - var natures = get.natureList(card, target); - for (var nature of natures) { - if (nature && lib.nature.has(nature)) name += "|" + nature; - } - } - event.names.remove(name); - if (event.names.length > 0) event.goto(5); - } - } else event.finish(); - }, - ai: { - order: 4, - result: { - player(player, target) { - if ( - get.attitude(player, target) > 0 && - player.hasCard((card) => get.name(card) == "sha", "h") - ) - return target.countCards("h"); - return 0.1 / target.countCards("h"); - }, - }, - }, - }, - dddzhengjun: { - trigger: { - global: [ - "damageEnd", - "loseHpEnd", - "recoverEnd", - "loseAfter", - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter(event, player) { - if (!player.isPhaseUsing()) return false; - if (event.name == "damage" || event.name == "loseHp" || event.name == "recover") { - if (player.hasSkill("dddzhengjun_hp")) return false; - return event.player.getHp() == player.getHp(); - } - const info = get.info("dddzhengjun"); - const hs_check = info.hs_check, - es_check = info.es_check; - return game.hasPlayer((target) => { - if ( - event.getg && - event.getg(target) && - event.getg(target).length && - hs_check(player, target) - ) - return true; - const evt = event.getl(target); - if (evt && evt.hs && evt.hs.length && hs_check(player, target)) return true; - if ( - event.name == "equip" && - event.player == target && - (!evt || evt.cards.length != 1) && - es_check(player, target) - ) - return true; - return evt && evt.es && evt.es.length && es_check(player, target); - }); - }, - hs_check(player, target) { - return ( - !player.hasSkill("dddzhengjun_hs") && target.countCards("h") == player.countCards("h") - ); - }, - es_check(player, target) { - return ( - !player.hasSkill("dddzhengjun_es") && target.countCards("e") == player.countCards("e") - ); - }, - async cost(event, trigger, player) { - if (trigger.name == "damage" || trigger.name == "loseHp" || trigger.name == "recover") { - let list = ["失去体力", "cancel2"]; - if (trigger.player.isDamaged()) list.unshift("回复体力"); - const { - result: { control }, - } = await player - .chooseControl(list) - .set("prompt", get.prompt("dddzhengjun", trigger.player)) - .set("prompt2", "令" + get.translation(event.player) + "执行其中一项") - .set("ai", () => { - const player = get.event("player"), - target = get.event().getTrigger().player; - if ( - get.event("controls").includes("回复体力") && - get.recoverEffect(target, player, player) > 0 - ) - return "回复体力"; - return get.effect(target, { name: "losehp" }, player, player) > 0 - ? "失去体力" - : "cancel2"; - }); - event.result = { - bool: control != "cancel2", - targets: [trigger.player], - cost_data: control, - }; - } else { - let map = {}; - const hs_targets = game.filterPlayer((target) => { - if (!get.info("dddzhengjun").hs_check(player, target)) return false; - if (trigger.getg && trigger.getg(target) && trigger.getg(target).length) - return true; - const evt = trigger.getl(target); - return evt && evt.hs && evt.hs.length; - }); - const es_targets = game.filterPlayer((target) => { - if (!get.info("dddzhengjun").es_check(player, target)) return false; - const evt = trigger.getl(target); - if ( - trigger.name == "equip" && - trigger.player == target && - (!evt || evt.cards.length != 1) - ) - return true; - return evt && evt.es && evt.es.length; - }); - if (hs_targets.length) { - let target; - if (hs_targets.length == 1) target = hs_targets[0]; - else { - let targets = await player - .chooseTarget( - get.prompt("dddzhengjun"), - "令其中一名角色摸一张牌或弃置一张牌", - (card, player, target) => { - return get.event("targets").includes(target); - } - ) - .set("ai", (target) => { - const player = get.event("player"); - return Math.max( - get.effect(target, { name: "guohe_copy2" }, target, player), - get.effect(target, { name: "draw" }, player, player) - ); - }) - .set("targets", hs_targets) - .forResultTargets(); - if (targets && targets.length) target = targets[0]; - } - if (target) { - let list = ["摸牌"]; - if (target.countCards("h")) list.push("弃牌"); - const { - result: { control }, - } = await player - .chooseControl(list, "cancel2") - .set("prompt", get.prompt("dddzhengjun", target)) - .set("prompt2", "令" + get.translation(target) + "执行其中一项") - .set("ai", () => { - const player = get.event("player"), - target = get.event().getTrigger().player; - if ( - get.event("controls").includes("弃牌") && - get.effect(target, { name: "guohe_copy2" }, player, player) > 0 - ) - return "弃牌"; - return get.effect(target, { name: "draw" }, player, player) > 0 - ? "摸牌" - : "cancel2"; - }); - if (control != "cancel2") { - map.hs_target = [target, control]; - } - } - } - if (es_targets.length) { - let target; - if (hs_targets.length == 1) { - const { - result: { bool }, - } = await player - .chooseBool() - .set("prompt", get.prompt("dddzhengjun", hs_targets[0])) - .set("prompt2", "移动" + get.translation(hs_targets[0]) + "的一张装备牌") - .set("choice", () => player.canMoveCard(true, true, hs_targets[0])); - if (bool) target = hs_targets[0]; - } else { - let targets = await player - .chooseTarget( - get.prompt("dddzhengjun"), - "移动其中一名角色的一张装备牌", - (card, player, target) => { - return get.event("targets").includes(target); - } - ) - .set("ai", (target) => { - const player = get.event("player"); - return player.canMoveCard(true, true, target) ? 1 + Math.random() : 0; - }) - .set("targets", es_targets) - .forResultTargets(); - if (targets && targets.length) target = targets[0]; - } - if (target) { - map.es_target = target; - } - } - event.result = { - bool: map.hs_target || map.es_target, - targets: [(map.hs_target || [])[0]].concat(map.es_target ? [map.es_target] : []), - cost_data: map, - }; - } - }, - async content(event, trigger, player) { - const data = event.cost_data; - if (trigger.name == "damage" || trigger.name == "loseHp" || trigger.name == "recover") { - player.addTempSkill("dddzhengjun_hp", "phaseUseAfter"); - await trigger.player[data == "回复体力" ? "recover" : "loseHp"](); - } else { - if (data.hs_target) { - player.addTempSkill("dddzhengjun_hs", "phaseUseAfter"); - if (data.hs_target[1] == "摸牌") await data.hs_target[0].draw(); - else await data.hs_target[0].chooseToDiscard("he", true); - } - if (data.es_target) { - player.addTempSkill("dddzhengjun_es", "phaseUseAfter"); - await player.moveCard(true, data.es_target); - } - } - }, - subSkill: { - hs: { charlotte: true }, - es: { charlotte: true }, - hp: { charlotte: true }, - }, - }, - dddxianxi: { - trigger: { - player: "useCard2", - }, - direct: true, - filter(event, player) { - if (event.card.name != "sha" || !player.isPhaseUsing()) return false; - return game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(event.card, player, current) - ); - }); - }, - content() { - "step 0"; - player - .chooseTarget( - get.prompt("dddxianxi"), - "为" + get.translation(trigger.card) + "增加任意个目标", - function (card, player, target) { - var event = _status.event.getTrigger(); - return ( - !event.targets.includes(target) && - lib.filter.targetEnabled2(event.card, player, target) - ); - }, - [1, Infinity] - ) - .set("ai", function (target) { - var evt = _status.event.getTrigger(); - if (get.damageEffect(target, evt.player, evt.player) < 0) return 0; - return get.effect(target, evt.card, evt.player, evt.player); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - event.targets = targets; - if (!event.isMine() && !event.isOnline()) game.delayx(); - } else event.finish(); - "step 2"; - player.logSkill("dddxianxi", targets); - trigger.targets.addArray(targets); - if (!trigger._dddxianxi_map) trigger._dddxianxi_map = {}; - trigger._dddxianxi_map[player.playerid] = targets.slice(0); - player.addTempSkill("dddxianxi_delay"); - }, - subSkill: { - delay: { - charlotte: true, - trigger: { - player: "useCardAfter", - }, - forced: true, - filter(event, player) { - if (!event._dddxianxi_map || !event._dddxianxi_map[player.playerid]) return false; - for (var target of event._dddxianxi_map[player.playerid]) { - if ( - !target.hasHistory("damage", function (evt) { - return evt.card == event.card; - }) - ) - return true; - } - return false; - }, - content() { - "step 0"; - var targets = trigger._dddxianxi_map[player.playerid] - .filter(function (target) { - return !target.hasHistory("damage", function (evt) { - return evt.card == trigger.card; - }); - }) - .sortBySeat(); - event.targets = targets; - var num = targets.length; - player - .chooseToDiscard( - "he", - num, - "险袭:选择弃置" + get.cnNumber(num) + "张牌", - "然后对" + - get.translation(targets) + - "各造成1点伤害。或点击「取消」,改为摸" + - get.cnNumber(num) + - "张牌并失去1点体力" - ) - .set("ai", function (card) { - return 7 - get.value(card); - }); - "step 1"; - if (result.bool) { - for (var i of targets) { - player.line(i); - i.damage(); - } - } else { - player.draw(targets.length); - player.loseHp(); - } - }, - sub: true, - }, - }, - }, - dddlingyong: { - trigger: { - global: [ - "phaseZhunbeiSkipped", - "phaseZhunbeiCancelled", - "phaseDrawSkipped", - "phaseDrawCancelled", - "phaseJudgeSkipped", - "phaseJudgeCancelled", - "phaseUseSkipped", - "phaseUseCancelled", - "phaseDiscardSkipped", - "phaseDiscardCancelled", - "phaseJieshuSkipped", - "phaseJieshuCancelled", - ], - }, - frequent: true, - content() { - "step 0"; - player - .judge(function (card) { - var name = get.name(card, false); - if (name == "sha") return -2; - return 2; - }) - .set("callback", function () { - if (event.judgeResult.name != "sha") { - var card = event.judgeResult.card; - if (get.position(card, true) == "o") player.chooseUseTarget(card); - } - }).judge2 = function (result) { - return result.bool; - }; - "step 1"; - if (result.bool) { - player.chooseBool("是否继续进行【灵涌】判定?").set("frequentSkill", "dddlingyong"); - } else event.finish(); - "step 2"; - if (result.bool) event.goto(0); - }, - }, - dddxuxiao: { - trigger: { - global: ["loseAfter", "loseAsyncAfter"], - }, - direct: true, - filter(event, player) { - if (event.type != "discard") return false; - var cards = event.getd(); - for (var i of cards) { - if ( - get.position(i, true) == "d" && - get.color(i, false) == "black" && - get.type(i, null, true) == "basic" - ) { - var card = get.autoViewAs({ name: "bingliang" }, [i]); - if ( - game.hasPlayer(function (current) { - return current.canAddJudge(card); - }) - ) - return true; - } - } - return false; - }, - content() { - "step 0"; - if (!event.cards) event.cards = []; - var cards = trigger.getd().filter(function (i) { - if ( - !event.cards.includes(i) && - get.position(i, true) == "d" && - get.color(i, false) == "black" && - get.type(i, null, true) == "basic" - ) { - var card = get.autoViewAs({ name: "bingliang" }, [i]); - if ( - game.hasPlayer(function (current) { - return current.canAddJudge(card); - }) - ) - return true; - } - return false; - }); - if (cards.length) { - player.chooseButton([get.prompt("dddxuxiao"), cards]); - } else event.finish(); - "step 1"; - if (result.bool) { - var card = result.links[0]; - event.cards.push(card); - event.card = card; - player - .chooseTarget( - true, - "请选择【兵粮寸断】的目标", - "将" + get.translation(card) + "置于一名角色的判定区内,然后其摸两张牌", - function (card, player, target) { - var card = get.autoViewAs({ name: "bingliang" }, [_status.event.card]); - return target.canAddJudge(card); - } - ) - .set("card", card) - .set("ai", function (target) { - var card = get.autoViewAs({ name: "bingliang" }, [_status.event.card]), - player = _status.event.player; - return ( - get.attitude(player, target) + - Math.max(0, get.effect(target, card, player, player)) - ); - }); - } - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dddxuxiao", target); - target.addJudge({ name: "bingliang" }, [card]); - target.draw(2); - event.goto(0); - } - }, - }, - dddxuyu: { - trigger: { - player: "useCardAfter", - }, - content() { - player.draw(); - player - .when({ player: "useCardAfter", global: "phaseAfter" }) - .filter((evt) => evt != trigger) - .then(() => { - if (trigger.name == "useCard") player.chooseToDiscard("he", true); - }); - }, - }, - dddshijian: { - trigger: { - global: "useCardAfter", - }, - filter(event, player) { - if (player == event.player) return false; - const evt = event.getParent("phaseUse"); - if (!evt || evt.player != event.player) return false; - return ( - event.player.getHistory( - "useCard", - (evtx) => { - return evtx.getParent("phaseUse") == evt; - }, - event - ).length == 2 - ); - }, - direct: true, - *content(event, map) { - const player = map.player, - trigger = map.trigger, - target = trigger.player; - let result = yield player - .chooseCard( - "he", - get.prompt("dddshijian", target), - `交给${get.translation( - target - )}一张牌,然后其本回合使用下一张牌指定目标时,你令此牌额外结算一次或摸一张牌。` - ) - .set("ai", (card) => { - if (get.event("goon")) return 6 - get.value(card); - return 0; - }) - .set( - "goon", - get.attitude(player, target) > 0 && - target.hasCard((card) => target.hasValueTarget(card)) - ); - if (!result.bool) return event.finish(); - player.logSkill("dddshijian", target); - player.give(result.cards, target); - player.addTempSkill("dddshijian_extra"); - player.markAuto("dddshijian_extra", target); - }, - subSkill: { - extra: { - trigger: { global: "useCardToPlayer" }, - filter(event, player) { - if (!event.isFirstTarget) return false; - return player.getStorage("dddshijian_extra").includes(event.player); - }, - charlotte: true, - forced: true, - onremove: true, - *content(event, map) { - const player = map.player, - trigger = map.trigger, - target = trigger.player; - if (trigger.targets && trigger.targets.length) { - let result = yield player - .chooseControl(["额外结算", "摸一张牌"]) - .set("prompt", "实荐:请选择一项") - .set( - "prompt2", - `令${get.translation(trigger.card)}额外结算一次,或摸一张牌` - ) - .set("ai", () => { - return get.event("choice"); - }) - .set( - "choice", - (function () { - if ( - trigger.card.name === "tiesuo" || - !["basic", "trick"].includes(get.type(trigger.card)) - ) - return 1; - if ( - trigger.targets.reduce((p, c) => { - return ( - p + - get.effect( - c, - trigger.card, - target, - _status.event.player - ) - ); - }, 0) >= - get.effect( - player, - { name: "draw" }, - player, - _status.event.player - ) - ) - return 0; - return 1; - })() - ); - if (result.index == 0) { - trigger.getParent().effectCount++; - game.log(player, "令", trigger.card, "额外结算一次"); - } else player.draw(); - } else player.draw(); - player.removeSkill("dddshijian_extra"); - }, - }, - }, - }, - dddxuyu_old: { - trigger: { - player: "useCardAfter", - }, - filter(event, player) { - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - return ( - player.getHistory( - "useCard", - function (evtx) { - return evtx.getParent("phaseUse") == evt; - }, - event - ).length == 1 - ); - }, - content() { - player.draw(2); - player.addTempSkill("dddxuyu_old_discard", "phaseUseAfter"); - }, - subSkill: { - discard: { - trigger: { - player: "useCardAfter", - }, - filter(event, player) { - if (!player.countCards("he")) return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - return ( - player.getHistory( - "useCard", - function (evtx) { - return evtx.getParent("phaseUse") == evt; - }, - event - ).length == 3 - ); - }, - forced: true, - charlotte: true, - content() { - player.chooseToDiscard("he", true); - }, - sub: true, - }, - }, - }, - dddshijian_old: { - trigger: { - global: "useCardAfter", - }, - filter(event, player) { - if (player == event.player) return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != event.player) return false; - return ( - event.player.getHistory( - "useCard", - function (evtx) { - return evtx.getParent("phaseUse") == evt; - }, - event - ).length == 3 - ); - }, - logTarget: "player", - check(event, player) { - return get.attitude(player, event.player) > 0; - }, - content() { - trigger.player.draw(); - player.addTempSkill("dddshijian_old_draw", "phaseUseAfter"); - }, - subSkill: { - draw: { - trigger: { - global: "useCardAfter", - }, - filter(event, player) { - if (!event.player.countCards("he")) return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != event.player) return false; - return ( - event.player.getHistory( - "useCard", - function (evtx) { - return evtx.getParent("phaseUse") == evt; - }, - event - ).length == 4 - ); - }, - forced: true, - charlotte: true, - content() { - player.draw(2); - }, - sub: true, - }, - }, - }, - dddtaisi: { - trigger: { - global: "phaseEnd", - }, - direct: true, - filter(event, player) { - if (!game.getGlobalHistory("changeHp").some((evt) => evt.player == player)) return false; - return game.getGlobalHistory("cardMove").some(function (evt) { - if (evt.name != "cardsDiscard") { - if (evt.name != "lose" || evt.position != ui.discardPile) return false; - } - return evt.cards.some((card) => get.position(card, true) == "d"); - }); - }, - content() { - "step 0"; - player - .chooseTarget( - get.prompt("dddtaisi"), - "你可以令一名角色获得一张于本回合内进入弃牌堆的牌。若该角色于本回合内对你造成过伤害,则你摸两张牌。" - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (player.hasHistory("damage", (evt) => evt.source == target)) return 10 + att; - return att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dddtaisi", target); - event.target = target; - } else event.finish(); - "step 2"; - var cards = []; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name != "cardsDiscard") { - if (evt.name != "lose" || evt.position != ui.discardPile) return false; - } - cards.addArray(evt.cards.filter((card) => get.position(card, true) == "d")); - }); - if (!cards.length) event.finish(); - else if (cards.length == 1) event._result = { bool: true, links: cards }; - else - player - .chooseButton(["令" + get.translation(target) + "获得一张牌", cards], true) - .set("ai", function (button) { - var player = _status.event.player, - target = _status.event.getParent().target; - var att = get.attitude(player, target) - 0.1; - return get.sgn(att) * get.value(button.link, target); - }); - "step 3"; - if (result.bool) { - target.gain(result.links, "gain2"); - } else event.finish(); - "step 4"; - if (player.hasHistory("damage", (evt) => evt.source == target)) player.draw(2); - }, - }, - dddquche: { - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "thunder", - filter(event, player) { - return player.hasCard({ color: "red" }, "he"); - }, - filterCard: { - color: "red", - }, - filterTarget(card, player, target) { - return player != target; - }, - discard: false, - delay: false, - lose: false, - content() { - "step 0"; - event.count = 1; - player.awakenSkill("dddquche"); - player.addTempSkill("dddquche_effect"); - player.addMark("dddquche_effect", 1, false); - player.give(cards, target); - event.goto(3); - "step 1"; - if ( - player.hasCard(function (card) { - if (_status.connectMode && get.position(card) == "h") return true; - return get.color(card) == "red"; - }, "he") - ) { - player.chooseCardTarget({ - prompt: "是否将一张红色牌交给一名其他角色?", - filterCard: { color: "red" }, - filterTarget: lib.filter.notMe, - position: "he", - }); - } else event.finish(); - "step 2"; - if (result.bool) { - player.addMark("dddquche_effect", 1, false); - player.give(result.cards, result.targets[0]); - } else event.finish(); - "step 3"; - if ( - player.hasCard(function (card) { - if (_status.connectMode && get.position(card) == "h") return true; - return get.color(card) == "black"; - }, "hes") - ) { - player.chooseCardTarget({ - prompt: "是否将一张黑色牌当做【杀】使用?", - position: "he", - filterCard(card, player) { - if (get.color(card) != "black") return false; - var card = get.autoViewAs({ name: "sha" }, [card]); - return lib.filter.cardEnabled(card, player); - }, - selectTarget() { - var card = get.autoViewAs({ name: "sha" }, ui.selected.cards); - return lib.filter.selectTarget(card, _status.event.player); - }, - filterTarget(card, player, target) { - var card = get.autoViewAs({ name: "sha" }, ui.selected.cards); - return ( - lib.filter.targetEnabled(card, player, target) && - lib.filter.targetInRange(card, player, target) - ); - }, - }); - } else event.finish(); - "step 4"; - if (result.bool) { - player.addMark("dddquche_effect", 1, false); - player.useCard({ name: "sha" }, result.cards, result.targets, false); - event.goto(1); - } else event.finish(); - }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - mod: { - globalFrom(from, to, distance) { - return distance - from.countMark("dddquche_effect"); - }, - }, - intro: { - content: "至其他角色的距离-#", - }, - sub: true, - }, - }, - mark: true, - intro: { - content: "limited", - }, - init(player, skill) { - player.storage[skill] = false; - }, - }, - dddqianlong: { - zhuSkill: true, - trigger: { - source: "dieAfter", - }, - forced: true, - filter: (event, player) => player.hasZhuSkill("dddqianlong"), - content() { - player.draw(3); - }, - group: "dddqianlong_cancel", - subSkill: { - cancel: { - trigger: { - player: ["drawBefore", "discardBefore"], - }, - forced: true, - popup: false, - filter(event, player) { - if (!player.hasZhuSkill("dddqianlong")) return false; - var evt = event.getParent(); - return evt && evt.name == "die" && evt.source == player; - }, - content() { - trigger.cancel(); - }, - sub: true, - }, - }, - }, - ddddongcha: { - trigger: { - global: "phaseBegin", - }, - logTarget: "player", - filter(event, player) { - return ( - player != event.player && - player.countCards("h") > 0 && - event.player.countCards("h") > 0 - ); - }, - check(event, player) { - return get.attitude(player, event.player) <= 0; - }, - content() { - "step 0"; - event.target = trigger.player; - player.addTempSkill("ddddongcha_effect"); - if (player.countCards("h") > 0) player.chooseCard("h", true, "选择一张牌作为“鉴”"); - "step 1"; - if (result.bool) { - player.addToExpansion(result.cards, player, "give").gaintag.add("ddddongcha_effect"); - } - "step 2"; - if (target.countCards("h") > 0) target.chooseCard("h", true, "选择一张牌作为“鉴”"); - "step 3"; - if (result.bool) { - player.addToExpansion(result.cards, target, "give").gaintag.add("ddddongcha_effect"); - } - }, - subSkill: { - effect: { - charlotte: true, - trigger: { - global: "phaseEnd", - }, - forced: true, - filter(event, player) { - return player.getExpansions("ddddongcha_effect").length > 0; - }, - content() { - "step 0"; - var cards = player.getExpansions("ddddongcha_effect"); - if (cards.length > 0) { - if (cards.length == 1) - event._result = { - bool: true, - links: cards, - }; - else player.chooseButton(["选择获得一张“鉴”", cards], true); - } else event.finish(); - "step 1"; - if (result.bool) player.gain(result.links, "gain2"); - "step 2"; - var cards = player.getExpansions("ddddongcha_effect"); - if (cards.length > 0 && trigger.player.isIn()) { - if (cards.length == 1) - event._result = { - bool: true, - links: cards, - }; - else - trigger.player - .chooseButton(["选择获得一张“鉴”", cards], true) - .set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - } else event.finish(); - "step 3"; - if (result.bool) trigger.player.gain(result.links, player, "give"); - }, - marktext: "鉴", - intro: { - content: "expansion", - markcount: "expansion", - }, - sub: true, - }, - }, - }, - dddzhijie: { - enable: "chooseToUse", - filter(event, player) { - if (event.type == "phase") return false; - var cards = player.getExpansions("ddddongcha_effect"); - if (cards.length < 2) return false; - var shan = false, - wuxie = false; - for (var i = 0; i < cards.length; i++) { - for (var j = i + 1; j < cards.length; j++) { - if (get.color(cards[i], false) == get.color(cards[j], false)) shan = true; - else wuxie = true; - } - } - if (shan && event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) - return true; - if (wuxie && event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) - return true; - return false; - }, - hiddenCard(player, name) { - if (name != "shan" && name != "wuxie") return false; - var cards = player.getExpansions("ddddongcha_effect"); - if (cards.length < 2) return false; - var shan = false, - wuxie = false; - for (var i = 0; i < cards.length; i++) { - for (var j = i + 1; j < cards.length; j++) { - if (get.color(cards[i], false) == get.color(cards[j], false)) shan = true; - else wuxie = true; - } - } - if (shan && name == "shan") return true; - if (wuxie && name == "wuxie") return true; - return false; - }, - chooseButton: { - dialog(event, player) { - return ui.create.dialog("智解", player.getExpansions("ddddongcha_effect"), "hidden"); - }, - select: 2, - filter(button, player) { - if (!ui.selected.buttons.length) return true; - var evt = _status.event.getParent(), - buttons = ui.selected.buttons; - return evt.filterCard( - get.autoViewAs( - { - name: - get.color(buttons[0].link) == get.color(button.link) - ? "shan" - : "wuxie", - }, - [button.link, buttons[0].link] - ) - ); - }, - check: () => 1, - backup(links, player) { - return { - viewAs: { - name: get.color(links[0]) == get.color(links[1]) ? "shan" : "wuxie", - }, - cards: links, - selectCard: -1, - position: "x", - filterCard: (card) => lib.skill["dddzhijie_backup"].cards.includes(card), - popname: true, - precontent() { - player.addTempSkill("dddzhijie_draw"); - }, - }; - }, - }, - ai: { - combo: "ddddongcha", - respondShan: true, - skillTagFilter(player) { - return lib.skill["dddzhijie"].hiddenCard(player, "shan"); - }, - order: 10, - result: { player: 1 }, - effect: { - target: (card, player, target) => { - if ( - card.name === "sha" && - target.getExpansions("ddddongcha_effect").length < 2 && - lib.skill["dddzhijie"].hiddenCard(target, "shan") - ) - return [1, 1, 1, -get.sgn(get.attitude(player, _status.currentPhase))]; - }, - }, - }, - subSkill: { - draw: { - trigger: { - player: "useCardAfter", - }, - forced: true, - charlotte: true, - popup: false, - filter(event, player) { - return event.skill == "dddzhijie_backup"; - }, - content() { - player.draw(2); - }, - sub: true, - }, - }, - }, - dddqiahua: { - trigger: { - global: "phaseBegin", - }, - direct: true, - filter(event, player) { - return ( - player != event.player && - event.player.hp > 0 && - player.countCards("h", function (card) { - return !get.is.shownCard(card); - }) >= event.player.hp - ); - }, - content() { - "step 0"; - var target = trigger.player; - player - .chooseCard( - "h", - target.hp, - get.prompt("dddqiahua", target), - "选择明置" + - get.cnNumber(target.hp) + - "张手牌,然后" + - get.translation(target) + - "获得技能〖恂恂〗直到本回合结束。", - function (card) { - return !get.is.shownCard(card); - } - ) - .set("goon", get.attitude(player, target) > 0) - .set("ai", function (card) { - if (_status.event.goon) return 1 + Math.random(); - return 0; - }); - "step 1"; - if (result.bool) { - var target = trigger.player, - cards = result.cards; - player.logSkill("dddqiahua", target); - target.addTempSkills("dddxunxun"); - player.addShownCards(cards, "visible_dddxianglang"); - game.log(player, "选择了", cards, "作为“明”"); - player.showCards( - cards, - get.translation(player) + "对" + get.translation(target) + "发动了【恰化】" - ); - } - }, - ai: { - expose: 0.15, - }, - derivation: "dddxunxun", - }, - dddxunxun: { - inherit: "xunxun", - audio: 2, - }, - dddfusi: { - mod: { - ignoredHandcard(card, player) { - if (get.is.shownCard(card)) return true; - }, - cardDiscardable(card, player, name) { - if (name == "phaseDiscard" && get.is.shownCard(card)) return false; - }, - }, - global: "dddfusi_global", - subSkill: { - refused: { - charlotte: true, - sub: true, - }, - allowed: { - charlotte: true, - sub: true, - }, - }, - }, - dddfusi_global: { - mod: { - cardEnabled2(card, player) { - var source = _status.currentPhase; - if ( - !source || - source == player || - !source.hasSkill("dddfusi") || - source.countCards("h") == 0 || - source.hasCard(function (card) { - return !get.is.shownCard(card); - }, "h") - ) - return; - if (player.getCards("h").includes(card)) return false; - }, - }, - enable: "chooseToUse", - filter(event, player) { - if (event._dddfusi_refused || player.hasSkill("dddfusi_refused")) return false; - var players = game.filterPlayer(function (current) { - return current != player && current.hasSkill("dddfusi"); - }); - for (var source of players) { - var cards = source.getShownCards(); - for (var i of cards) { - var card = get.autoViewAs(i); - if (event.filterCard(card, player, event)) return true; - } - } - return false; - }, - hiddenCard(player, name) { - if (player.hasSkill("dddfusi_refused")) return false; - var players = game.filterPlayer(function (current) { - return current != player && current.hasSkill("dddfusi"); - }); - for (var source of players) { - var cards = source.getShownCards(); - for (var i of cards) { - var card = get.autoViewAs(i); - if (name == card.name) return true; - } - } - return false; - }, - chooseButton: { - dialog(event, player) { - var dialog = ui.create.dialog("腹笥", "hidden"); - var players = game - .filterPlayer(function (current) { - return current != player && current.hasSkill("dddfusi"); - }) - .sortBySeat(); - for (var source of players) { - var cards = source.getShownCards(); - if (cards.length) { - var str = '
    '; - str += get.translation(source); - var num = source.getSeatNum(); - if (num > 0) str += "(" + get.cnNumber(num, true) + "号位)"; - str += "
    "; - dialog.add(str); - dialog.add(cards); - } - } - return dialog; - }, - filter(button, player) { - var card = get.autoViewAs(button.link), - evt = _status.event.getParent(); - return evt.filterCard(card, player, evt); - }, - check(button) { - if (_status.event.getParent().type != "phase") return 1; - return _status.event.player.getUseValue(get.autoViewAs(button.link), null, true); - }, - backup(links, player) { - return { - card: links[0], - viewAs: get.autoViewAs(links[0]), - filterCard: () => false, - selectCard: -1, - precontent() { - "step 0"; - var card = lib.skill["dddfusi_global_backup"].card; - event.card = card; - event.result.cards = [card]; - event.source = get.owner(card); - if (!event.result.card.storage) event.result.card.storage = {}; - event.result.card.storage._dddfusi_owner = event.source; - delete event.result.skill; - player.logSkill("dddfusi_global", event.source); - if (player.hasSkill("dddfusi_allowed")) event.finish(); - "step 1"; - if (event.result.targets && event.result.targets.length) - player.line(event.result.targets, event.result.card.nature); - player.showCards( - [card], - get.translation(player) + "向" + get.translation(source) + "发动【腹笥】" - ); - source - .chooseButton( - [ - "是否同意" + - get.translation(player) + - "使用" + - get.translation(card) + - "?", - '
    ' + - (function () { - if (event.result.targets && event.result.targets.length) - return ( - "(目标角色:" + - get.translation(event.result.targets) + - ")" - ); - return "(无目标角色)"; - })() + - "
    ", - [["   同意   ", "  不同意  "], "tdnodes"], - [["   同意且本回合内不再提示   "], "tdnodes"], - [["  不同意且本回合内不再提示  "], "tdnodes"], - "forcebutton", - ], - true - ) - .set("forceAuto", true); - "step 2"; - if (result.links[0].indexOf("不同意") == -1) { - source.chat("同意"); - if (result.links[0].indexOf("本回合内不再提示") > 0) - player.addTempSkill("dddfusi_allowed"); - } else if (result.links[0].indexOf("不同意") != -1) { - source.chat("不同意"); - if (result.links[0].indexOf("本回合内不再提示") > 0) - player.addTempSkill("dddfusi_refused"); - else if (event.result.card.name == "wuxie") - player.addTempSkill("dddfusi_refused", "_wuxieAfter"); - var evt = event.getParent(); - evt.set("_dddfusi_refused", true); - evt.goto(0); - } - }, - }; - }, - prompt(links, player) { - return "请选择" + get.translation(links[0]) + "的目标"; - }, - }, - ai: { - order: 10, - result: { - player(player, target) { - if ( - !game.hasPlayer(function (current) { - return ( - current != player && - current.hasSkill("dddfusi") && - get.attitude(player, current) >= 0 - ); - }) - ) - return 0; - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - respondSha: true, - respondShan: true, - skillTagFilter(player, tag, arg) { - var name; - switch (tag) { - case "respondSha": - name = "sha"; - break; - case "respondShan": - name = "shan"; - break; - } - return lib.skill["dddfusi_global"].hiddenCard(player, name); - }, - }, - }, - dddtuoji: { - trigger: { global: "useCardAfter" }, - frequent: true, - filter(event, player) { - return ( - event.card.storage && - event.card.storage._dddfusi_owner == player && - !player.hasCard(function (card) { - return !get.is.shownCard(card); - }, "h") - ); - }, - content() { - player.draw(3); - }, - ai: { - combo: "dddfusi" - }, - }, - dddchashi: { - trigger: { global: "phaseUseBegin" }, - direct: true, - filter(event, player) { - return player != event.player && player.countCards("he") > 0; - }, - *content(event, map) { - const player = map.player, - trigger = map.trigger, - target = trigger.player; - const valuableCards = target.getCards("hs", (card) => target.hasValueTarget(card)); - let result = yield player - .chooseToDiscard( - get.prompt("dddchashi", target), - "弃置一张牌,若其使用的下一张牌的花色或类型与此牌相同,你与其各摸一张牌", - "he" - ) - .set("logSkill", ["dddchashi", target]) - .set("ai", (card) => { - if (!get.event("goon")) return 0; - var list = get.event("list"); - return list[0].includes(get.suit(card)) || list[1].includes(get.type2(card)); - }) - .set("list", [ - valuableCards.map((card) => get.suit(card)).toUniqued(), - valuableCards.map((card) => get.type2(card)).toUniqued(), - ]) - .set("goon", get.attitude(player, target) > 0); - if (!result.bool) return event.finish(); - player.storage["dddchashi"] = [result.cards[0], target]; - player.addTempSkill("dddchashi_effect", "phaseUseAfter"); - target.addTempSkill("dddchashi_ai", { - player: ["phaseUseAfter", "useCard1"], - }); - }, - content_old() { - "step 0"; - var target = trigger.player, - history = target.getHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == trigger; - }); - event.target = target; - if (history.length > 0) { - var suit = get.suit(history[0].card); - event.suit = suit; - player - .chooseCard( - "he", - get.prompt("dddchashi", target), - "你可以展示一张牌。若此牌花色为" + - get.translation(suit) + - ",则" + - get.translation(target) + - "获得你展示的牌,然后你摸一张牌。" - ) - .set("goon", get.sgn(get.attitude(player, target))) - .set("ai", function (card) { - if (_status.event.goon <= 0) - return _status.event.goon * (get.value(card) + 0.01); - return 2 / Math.max(0.1, get.value(card)); - }); - } else event.goto(2); - "step 1"; - if (result.bool) { - player.logSkill("dddchashi", target); - var card = result.cards[0]; - player.showCards( - card, - get.translation(player) + "对" + get.translation(target) + "发动了【察势】" - ); - if (get.color(card) == event.suit) { - target.gain(card, player, "give"); - player.draw(); - } - } - event.finish(); - "step 2"; - player - .chooseCard( - "he", - get.prompt("dddchashi", target), - "你可以展示一张牌。若其本阶段内使用的第一张牌与此牌花色相同,则" + - get.translation(target) + - "获得你展示的牌,然后你摸一张牌。" - ) - .set("goon", get.sgn(get.attitude(player, target))) - .set("ai", function (card) { - if (_status.event.goon <= 0) return _status.event.goon * (get.value(card) + 0.01); - return 2 / Math.max(0.1, get.value(card)); - }); - "step 3"; - if (result.bool) { - player.logSkill("dddchashi", target); - var card = result.cards[0]; - player.showCards( - card, - get.translation(player) + "对" + get.translation(target) + "发动了【察势】" - ); - player.addTempSkill("dddchashi_effect", "phaseUseAfter"); - player.addGaintag([card], "dddchashi"); - player.storage["dddchashi"] = [card, target]; - target.addTempSkill("dddchashi_ai", { - player: ["phaseUseAfter", "useCard1"], - }); - } - }, - subSkill: { - effect: { - trigger: { global: "useCard" }, - forced: true, - charlotte: true, - filter(event, player) { - var storage = player.getStorage("dddchashi"); - if (!storage || !storage.length) return false; - if (event.player != storage[1] || !event.player.isIn()) return false; - // if(!player.getCards('he').includes(storage[0])||!storage[0].hasGaintag('dddchashi')) return false; - if ( - get.suit(event.card) != get.suit(storage[0]) && - get.type2(event.card) != get.type2(storage[0]) - ) - return false; - // var evt=event.getParent('phaseUse'); - // if(evt.player) - // if(event.player.getHistory('useCard',function(evtx){ - // return evtx.getParent('phaseUse')==evt; - // }).indexOf(event)!=0) return false; - return true; - }, - content() { - var storage = player.getStorage("dddchashi"); - // storage[1].gain(storage[0],player,'give'); - // player.draw(); - game.asyncDraw([player, storage[1]].sortBySeat(_status.currentPhase)); - player.removeSkill("dddchashi_effect"); - }, - onremove(player, storage) { - delete player.storage["dddchashi"]; - // player.removeGaintag('dddchashi'); - }, - }, - ai: { - charlotte: true, - }, - }, - }, - dddqice: { - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - return !player.storage["dddqice"]; - }, - content() { - player.draw(2); - // player.addTempSkill('dddqice_effect'); - player.setStorage("dddqice", true); - player - .when("useCard1") - .filter((evt) => get.type2(evt.card) == "trick") - .then(() => { - delete player.storage["dddqice"]; - }); - }, - subSkill: { - effect: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - charlotte: true, - content() { - "step 0"; - var list = []; - player.getHistory("useCard", function (evt) { - if (get.type(evt.card) == "trick") list.add(evt.card.name); - }); - list.sort(); - if (list.length > 0) { - player - .chooseButton( - ["齐策:是否视为使用一张牌?", [list, "vcard"]], - function (button) { - return _status.event.player.hasUseTarget({ - name: button.link[2], - isCard: true, - }); - } - ) - .set("ai", function (button) { - var card = { - name: button.link[2], - nature: button.link[3], - isCard: true, - }, - player = _status.event.player; - return player.getUseValue(card); - }); - } else { - player.removeSkills("dddqice"); - event.finish(); - } - "step 1"; - if (result.bool) { - player.chooseUseTarget(true, { - name: result.links[0][2], - isCard: true, - }); - } - }, - }, - }, - }, - //甄姬 - dddmiaoxing: { - audio: 2, - trigger: { global: "gameDrawBegin" }, - forced: true, - content() { - var me = player; - var numx = trigger.num; - trigger.num = - typeof numx == "function" - ? function (player) { - if (player == me) { - return 3 * numx(player); - } - return numx(player); - } - : function (player) { - if (player == me) { - return 3 * numx; - } - return numx; - }; - player._dddmiaoxing = true; - }, - group: ["dddmiaoxing_out", "dddmiaoxing_balance"], - marktext: "水", - intro: { - name: "水相", - markcount(storage, player) { - return ( - "" + - player.getExpansions("dddmiaoxing_1").length + - "/" + - player.getExpansions("dddmiaoxing_2").length - ); - }, - mark(dialog, content, player) { - var content1 = player.getExpansions("dddmiaoxing_1"); - var content2 = player.getExpansions("dddmiaoxing_2"); - if ((content1 && content1.length) || (content2 && content2.length)) { - if (player == game.me || player.isUnderControl()) { - dialog.addText("第一组"); - dialog.addAuto(content1); - dialog.addText("第二组"); - dialog.addAuto(content2); - } else { - return ( - "第一组“水相”有" + - get.cnNumber(content1.length) + - "张;" + - "第二组“水相”有" + - get.cnNumber(content2.length) + - "张" - ); - } - } - }, - }, - subSkill: { - out: { - trigger: { - global: "phaseBefore", - }, - forced: true, - filter(event, player) { - return game.phaseNumber == 0 && player._dddmiaoxing; - }, - content() { - "step 0"; - delete player._dddmiaoxing; - var cardsx = player.getCards("h"), - num = Math.ceil(cardsx.length / 3); - var cards = [ - cardsx.slice(0, num), - cardsx.slice(num, 2 * num), - cardsx.slice(2 * num), - ]; - event.cards = cards; - player - .chooseControl("第一组", "第二组", "第三组") - .set("dialog", [ - "淼形:选择一组作为你的手牌", - '第一组', - cards[0], - '第二组', - cards[1], - '第三组', - cards[2], - ]); - "step 1"; - event.cards.splice(result.index, 1); - var cards = event.cards; - player - .addToExpansion(cards[0], player, "giveAuto", false) - .gaintag.add("dddmiaoxing_1"); - player.addToExpansion(cards[1], player, "giveAuto").gaintag.add("dddmiaoxing_2"); - player.markSkill("dddmiaoxing"); - }, - }, - balance: { - trigger: { player: "phaseDrawAfter" }, - forced: true, - content() { - "step 0"; - var forced = - player.getExpansions("dddmiaoxing_1").length != player.countCards("h") && - player.getExpansions("dddmiaoxing_2").length != player.countCards("h"); - var next = player.chooseButton( - [1, 2], - [ - "淼形:将至少一组“水相”调整至与手牌数相等", - [["第一组", "第二组"], "tdnodes"], - '第一组', - player.getExpansions("dddmiaoxing_1"), - '第二组', - player.getExpansions("dddmiaoxing_2"), - ], - forced - ); - next.set("filterButton", (button) => { - var type = typeof button.link; - return type != "object"; - }); - next.set("ai", (button) => { - var player = _status.event.player; - var ind = ["第一组", "第二组"].indexOf(button.link) + 1; - if (ind == -1) return -100; - return ( - player.countCards("h") - player.getExpansions("dddmiaoxing_" + ind).length - ); - }); - "step 1"; - if (result.bool) { - var choices = result.links; - event.choices = choices; - // var hs=result.moved[0],sx1=result.moved[1],sx2=result.moved[2]; - // hs.removeArray(player.getCards('h')); - // sx1.removeArray(player.getExpansions('dddmiaoxing_1')); - // sx2.removeArray(player.getExpansions('dddmiaoxing_2')); - // if(!hs.length&&!sx1.length&&!sx2.length) return; - // player.gain(hs,'gain2'); - // player.addToExpansion(sx1,player,'giveAuto').gaintag.add('dddmiaoxing_1'); - // player.addToExpansion(sx2,player,'giveAuto').gaintag.add('dddmiaoxing_2'); - } else event.finish(); - "step 2"; - if (event.choices.includes("第一组")) { - var del = - player.countCards("h") - player.getExpansions("dddmiaoxing_1").length; - if (del >= 0) { - if (del != 0) - player - .addToExpansion(get.cards(del), player, "draw") - .gaintag.add("dddmiaoxing_1"); - event.goto(4); - } else { - player - .chooseButton( - [ - "淼形:移除" + get.cnNumber(-del) + "张第一组的“水相”", - player.getExpansions("dddmiaoxing_1"), - ], - -del, - true - ) - .set("ai", (button) => { - return -get.buttonValue(button); - }); - } - } - "step 3"; - if (result.bool) { - player.loseToDiscardpile(result.links); - } - "step 4"; - player.markSkill("dddmiaoxing"); - if (event.choices.includes("第二组")) { - var del = - player.countCards("h") - player.getExpansions("dddmiaoxing_2").length; - if (del >= 0) { - if (del != 0) - player - .addToExpansion(get.cards(del), player, "draw") - .gaintag.add("dddmiaoxing_2"); - event.goto(6); - } else { - player - .chooseButton( - [ - "淼形:移除" + get.cnNumber(-del) + "张第二组的“水相”", - player.getExpansions("dddmiaoxing_2"), - ], - -del, - true - ) - .set("ai", (button) => { - return -get.buttonValue(button); - }); - } - } - "step 5"; - if (result.bool) { - player.loseToDiscardpile(result.links); - } - "step 6"; - player.markSkill("dddmiaoxing"); - }, - }, - }, - }, - dddfushi: { - audio: 2, - trigger: { player: ["useCardAfter", "respondAfter"] }, - filter(event, player) { - return get.type(event.card) == "basic" && !player.hasSkill("dddfushi_used"); - }, - direct: true, - content() { - "step 0"; - player - .chooseControl("第一组", "第二组", "cancel2") - .set("dialog", [ - get.prompt("dddfushi"), - '用所有手牌交换一组“水相”', - '第一组', - player.getExpansions("dddmiaoxing_1"), - '第二组', - player.getExpansions("dddmiaoxing_2"), - ]) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var fn = player == _status.currentPhase ? "useful" : "value"; - var list = [ - [ - 1, - player - .getExpansions("dddmiaoxing_1") - .reduce((p, c) => p + get[fn](c), 0), - ], - [ - 2, - player - .getExpansions("dddmiaoxing_2") - .reduce((p, c) => p + get[fn](c), 0), - ], - [3, player.getCards("h").reduce((p, c) => p + get[fn](c), 0)], - ].sort((a, b) => b[1] - a[1]); - return list[0][0] - 1; - })() - ); - "step 1"; - if (result.control == "cancel2") event.finish(); - else { - player.logSkill("dddfushi"); - player.addTempSkill("dddfushi_used"); - var index = result.index + 1; - player - .addToExpansion(player.getCards("h"), player, "giveAuto") - .gaintag.add("dddmiaoxing_" + index); - player.gain(player.getExpansions("dddmiaoxing_" + index), "draw"); - game.log( - player, - "获得了" + - get.cnNumber(player.getExpansions("dddmiaoxing_" + index).length) + - "张“水相”" - ); - } - "step 2"; - player.markSkill("dddmiaoxing"); - player - .chooseTarget("是否令一名男性角色选择是否交换“水相”?", (card, player, target) => { - return target.hasSex("male"); - }) - .set("ai", (target) => get.attitude(_status.event.player, target)); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target); - target - .chooseControl("第一组", "第二组", "cancel2") - .set("dialog", [ - "浮世:是否用所有手牌交换一组“水相”?", - '第一组', - player.getExpansions("dddmiaoxing_1"), - '第二组', - player.getExpansions("dddmiaoxing_2"), - ]) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var fn = target == _status.currentPhase ? "useful" : "value"; - var list = [ - [ - 1, - player - .getExpansions("dddmiaoxing_1") - .reduce((p, c) => p + get[fn](c), 0), - ], - [ - 2, - player - .getExpansions("dddmiaoxing_2") - .reduce((p, c) => p + get[fn](c), 0), - ], - [3, target.getCards("h").reduce((p, c) => p + get[fn](c), 0)], - ].sort((a, b) => b[1] - a[1]); - return list[0] - 1; - })() - ); - } else event.finish(); - "step 4"; - if (result.control == "cancel2") event.finish(); - else { - var index = result.index + 1; - player - .addToExpansion(target.getCards("h"), target, "giveAuto") - .gaintag.add("dddmiaoxing_" + index); - target.gain(player.getExpansions("dddmiaoxing_" + index), player, "giveAuto"); - } - "step 5"; - player.markSkill("dddmiaoxing"); - }, - subSkill: { - used: { charlotte: true }, - }, - }, - //赵昂 - dddfenji: { - audio: 2, - trigger: { player: ["phaseDrawBegin1", "phaseDiscardBegin"] }, - direct: true, - filter(event, player) { - if (event.name == "phaseDraw" && event.numFixed) return false; - return ( - lib.inpile - .filter((i) => get.type(i) == "trick") - .removeArray(player.getStorage("dddfenji")).length > 0 - ); - }, - content() { - "step 0"; - var cards = lib.inpile - .filter((i) => { - return get.type(i) == "trick" && !player.getStorage("dddfenji").includes(i); - }) - .map((i) => ["锦囊", "", i]); - player - .chooseButton([get.prompt("dddfenji"), [cards, "vcard"]]) - .set("ai", (button) => { - var evt = _status.event.getTrigger(); - if (evt.name == "phaseDraw") { - if (!get.tag({ name: button.link[2] }, "damage")) return 0; - } else { - if ( - lib.skill.xunshi.isXunshi({ - name: button.link[2], - }) - ) - return 0; - } - return _status.event.player.getUseValue({ - name: button.link[2], - }); - }) - .set("filterButton", (button) => { - return player.hasUseTarget(button.link[2]); - }); - "step 1"; - if (result.bool) { - player.logSkill("dddfenji"); - player.markAuto("dddfenji", [result.links[0][2]]); - player.chooseUseTarget(result.links[0][2], true); - } else event.finish(); - "step 2"; - if (trigger.name == "phaseDraw") { - trigger.changeToZero(); - var num = 0; - game.filterPlayer((current) => { - current.getHistory("sourceDamage", (evt) => { - if (evt.getParent(4) == event) num += evt.num; - }); - }); - if (num > 0) player.draw(num); - } else { - trigger.cancel(); - var num = 0; - player.getHistory("useCard", (evt) => { - if (evt.getParent(2) == event) num = evt.targets.length; - }); - if (num > 0 && player.countCards("he")) player.chooseToDiscard(num, true); - } - }, - }, - //周处 - dddxiaheng: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - forced: true, - onremove: ["dddxiaheng", "dddxiaheng_del"], - intro: { content: "已因此技能对$造成过伤害" }, - content() { - "step 0"; - event.targets = []; - player.chooseTarget("侠横:令一名角色弃置两张牌", true).set("ai", (target) => { - var player = _status.event.player, - eff = get.effect(target, { name: "guohe_copy2" }, player, player), - eff2 = get.damageEffect(target, player, player); - if (player.storage["dddxiaheng_del"]) return eff; - var toself = false; - if (eff2 > eff * 2) { - toself = - !player.isDamaged() && - player.countCards("he", (card) => get.value(card, player) < 5) >= 2; - } - if (toself) return target == player ? 100 : 0; - return eff * (eff2 > eff * 2 ? 0.5 : 1.5); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.targets.add(target); - player.line(target); - target.chooseToDiscard(2, true, "he"); - } - "step 2"; - player - .chooseTarget("侠横:对一名角色造成1点伤害", true) - .set("ai", (target) => { - var player = _status.event.player, - eff = get.damageEffect(target, player, player), - targetx = _status.event.targetx; - if (player.storage["dddxiaheng_del"]) return eff; - var fix = player.getStorage("dddxiaheng").includes(target) ? 0.75 : 1; - if ( - target == player && - targetx != player && - player.isHealthy() && - !player.getStorage("dddxiaheng").includes(player) && - player.hp > 2 - ) - return 100; - return eff * (player.hp == 1 || target == targetx ? 0.1 : 1) * fix; - }) - .set("targetx", targets[0]); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - event.targets.add(target); - player.line(target); - target.damage(); - player.markAuto("dddxiaheng", [target]); - } - "step 4"; - if (player.storage["dddxiaheng_del"]) event.finish(); - else { - if (!targets.includes(player)) player.loseMaxHp(); - if (targets.length == 1) { - player.removeSkills("dddxiaheng"); - } - } - "step 5"; - if (player.getStorage("dddxiaheng").length >= 3) { - player.storage["dddxiaheng_del"] = true; - } - }, - }, - //刘巴 - dddfengzheng: { - audio: 2, - global: "dddfengzheng_global", - trigger: { - global: "roundStart", - }, - filter(event, player) { - return game.hasPlayer((current) => { - var history = current.actionHistory; - for (var i = history.length - 2; i >= 0; i--) { - var evts = history[i].useSkill; - for (var evt of evts) { - if (evt.skill == "dddfengzheng_global") return true; - } - if (history[i].isRound) break; - } - return false; - }); - }, - prompt2(event, player) { - var num = game.countPlayer((current) => { - var history = current.actionHistory; - for (var i = history.length - 2; i >= 0; i--) { - var evts = history[i].useSkill; - for (var evt of evts) { - if (evt.skill == "dddfengzheng_global") return true; - } - if (history[i].isRound) break; - } - return false; - }); - return "观看并分配牌堆顶的" + get.cnNumber(num) + "张牌"; - }, - content() { - "step 0"; - var num = game.countPlayer((current) => { - var history = current.actionHistory; - for (var i = history.length - 2; i >= 0; i--) { - var evts = history[i].useSkill; - for (var evt of evts) { - if (evt.skill == "dddfengzheng_global") return true; - } - if (history[i].isRound) break; - } - return false; - }); - var cards = game.cardsGotoOrdering(get.cards(num)).cards; - event.cards = cards; - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - "step 1"; - if (event.cards.length > 1) { - player - .chooseCardButton("丰政:请选择要分配的牌", true, event.cards, [ - 1, - event.cards.length, - ]) - .set("ai", function (button) { - if (ui.selected.buttons.length == 0) return 1; - return 0; - }); - } else if (event.cards.length == 1) - event._result = { - links: event.cards.slice(0), - bool: true, - }; - else event.finish(); - "step 2"; - if (result.bool) { - event.cards.removeArray(result.links); - event.togive = result.links.slice(0); - player - .chooseTarget("选择一名角色获得" + get.translation(result.links), true) - .set("ai", function (target) { - var fix = (_status.event.getParent().given_map[target.playerid] || 0) + 1; - var att = get.attitude(_status.event.player, target) / Math.sqrt(fix); - if (_status.event.enemy) return -att; - else if (att > 0) return att / (1 + target.countCards("h")); - else return att / 100; - }) - .set("enemy", get.value(event.togive[0], player, "raw") < 0); - } - "step 3"; - if (result.targets.length) { - var id = result.targets[0].playerid, - map = event.given_map; - if (!map[id]) map[id] = []; - map[id].addArray(event.togive); - } - if (cards.length > 0) event.goto(1); - "step 4"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - var list = [], - lose = false; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - list.push([source, event.given_map[i]]); - if (event.given_map[i].length > 2) lose = true; - } - game.loseAsync({ - gain_list: list, - giver: player, - animate: "draw", - }).setContent("gaincardMultiple"); - if (!lose) event.finish(); - "step 5"; - player.removeSkills("dddfengzheng"); - }, - subSkill: { - global: { - audio: "dddfengzheng", - enable: "phaseUse", - usable: 1, - filter(event, player) { - return game.hasPlayer((current) => current.hasSkill("dddfengzheng")); - }, - filterCard(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() { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - return num == 13; - }, - popname: true, - complexCard: true, - prompt: "将任意张点数和为13的手牌当【无中生有】使用", - check(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: "hs", - viewAs: { name: "wuzhong" }, - }, - }, - }, - dddyulv: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - group: "dddyulv_enter", - content() { - "step 0"; - player.draw(); - "step 1"; - if (!player.countCards("he")) event.finish(); - else player.chooseCard("玉律:将一张牌置于武将牌上", true); - "step 2"; - if (result.bool) { - player.addToExpansion(result.cards, player, "give").gaintag.add("dddyulv"); - } - }, - marktext: "律", - intro: { - markcount: "expansion", - content: "expansion", - }, - subSkill: { - enter: { - trigger: { - global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - forced: true, - direct: true, - filter(event, player) { - var cards = event.getd(); - if (!cards.length) return false; - const card = player.getExpansions("dddyulv")[0]; - if (!card) return false; - const number = get.number(card, false); - if (!_status.currentPhase || !_status.currentPhase.isIn()) return false; - return cards.some((i) => get.number(i, false) == number); - }, - content() { - "step 0"; - player - .chooseControl("摸牌", "弃牌") - .set( - "prompt", - "玉律:令" + - get.translation(_status.currentPhase) + - "摸一张牌或弃置一张牌" - ) - .set("ai", () => { - return get.attitude(_status.event.player, _status.currentPhase) > 0 - ? "摸牌" - : "弃牌"; - }); - "step 1"; - player.logSkill("dddyulv_enter", _status.currentPhase); - var reset = false; - if (result.index == 0) _status.currentPhase.draw(); - else _status.currentPhase.chooseToDiscard(true, "he"); - var reset = - player.getHistory("useSkill", (evt) => { - return evt.skill == "dddyulv_enter"; - }).length == 2; - if (!reset) event.finish(); - "step 2"; - if (!player.countCards("h")) player.draw(); - "step 3"; - if (!player.countCards("h")) event.finish(); - else - player.chooseCard( - "玉律:选择一张手牌交换“玉律”(" + - get.translation(player.getExpansions("dddyulv")) + - ")", - true - ); - "step 4"; - if (result.bool) { - player.gain(player.getExpansions("dddyulv"), player, "give"); - player - .addToExpansion(result.cards, player, "log", "give") - .gaintag.add("dddyulv"); - } - }, - }, - }, - }, - dddyulv_old: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - group: "dddyulv_old_enter", - content() { - "step 0"; - player - .chooseControl(Array.from({ length: 13 }, (_, i) => get.strNumber(i + 1))) - .set("prompt", "玉律:声明一个点数") - .set("ai", () => _status.event.controls.randomGet()); - "step 1"; - player.popup(result.control); - var number = result.index + 1; - player.storage["dddyulv_old"] = number; - player.markSkill("dddyulv_old"); - }, - intro: { - content: "声明的点数为#", - }, - subSkill: { - enter: { - trigger: { - global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - forced: true, - direct: true, - filter(event, player) { - var cards = event.getd(); - if (!cards.length || !player.storage["dddyulv_old"]) return false; - if (!_status.currentPhase || !_status.currentPhase.isIn()) return false; - return cards.some((i) => get.number(i, false) == player.storage["dddyulv_old"]); - }, - content() { - "step 0"; - player - .chooseControl("摸牌", "弃牌") - .set( - "prompt", - "玉律:令" + - get.translation(_status.currentPhase) + - "摸一张牌或弃置一张牌" - ) - .set("ai", () => { - return get.attitude(_status.event.player, _status.currentPhase) > 0 - ? "摸牌" - : "弃牌"; - }); - "step 1"; - player.logSkill("dddyulv_old_enter", _status.currentPhase); - var reset = false; - if (result.index == 0) _status.currentPhase.draw(); - else _status.currentPhase.chooseToDiscard(true, "he"); - if (_status.currentPhase.hasSkill("dddyulv_old_" + result.index)) reset = true; - _status.currentPhase.removeSkill("dddyulv_old_0"); - _status.currentPhase.removeSkill("dddyulv_old_1"); - _status.currentPhase.addSkill("dddyulv_old_" + result.index); - if (!reset) event.finish(); - "step 2"; - player - .chooseControl(Array.from({ length: 13 }, (_, i) => get.strNumber(i + 1))) - .set("prompt", "玉律:重新声明一个点数") - .set("ai", () => _status.event.controls.randomGet()); - "step 3"; - player.popup(result.control); - var number = result.index + 1; - player.storage["dddyulv_old"] = number; - player.markSkill("dddyulv_old"); - "step 4"; - 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); - } - }, - }, - 0: { charlotte: true }, - 1: { charlotte: true }, - }, - }, - //蹇硕 - dddfenye: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return player.canCompare(target); - }, - filter(event, player) { - return player.countCards("h") > 0; - }, - content() { - "step 0"; - player.chooseToCompare([target]).setContent(lib.skill["dddfenye"].chooseToCompareFenye); - "step 1"; - result.winner.forEach((i) => i.addExpose(0.05)); - result.loser.forEach((i) => i.addExpose(0.05)); - if (result.winner.length && result.loser.length) { - var players = result.winner; - event.players = players.sortBySeat(); - event.targets = result.loser; - } else event.finish(); - "step 2"; - var current = event.players.shift(); - event.current = current; - current - .chooseTarget("是否视为对一名没赢的角色使用一张【杀】?", (card, player, target) => { - return ( - player.canUse("sha", target, false) && _status.event.targets.includes(target) - ); - }) - .set("ai", (target) => { - return get.effect(target, { name: "sha" }, get.player(), get.player()); - }) - .set("targets", event.targets); - "step 3"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - var target = result.targets[0]; - event.current.useCard({ name: "sha", isCard: true }, target, false); - event.targets.remove(target); - } - if (event.targets.length && event.players.length) event.goto(2); - }, - chooseToCompareFenye() { - "step 0"; - var target = event.targets[0]; - event.targets.unshift(player); - event.targetx = target; - if (player.countCards("h") == 0 || target.countCards("h") == 0) { - event.result = { cancelled: true, bool: false }; - event.finish(); - return; - } - game.log(player, "对", target, "发起拼点"); - "step 1"; - var send = function (targets) { - var next = game.createEvent("dddfenye_choose", false); - // next.player=game.me; - next.targets = targets; - next.ai = event.ai; - next.fixedResult = event.fixedResult; - next.setContent(lib.skill["dddfenye"].contentx); - game.resume(); - }; - var sendback = function (result, player) { - if (!Array.isArray(result)) { - result = [null, null]; - } - event.results.push([player, result]); - }; - event.ai_targets = []; - event.results = []; - var players = game.filterPlayer().sortBySeat(); - var time = 10000; - if (lib.configOL && lib.configOL.choose_timeout) - time = parseInt(lib.configOL.choose_timeout) * 1000; - for (var i = 0; i < players.length; i++) { - players[i].showTimer(time); - if (players[i].isOnline()) { - event.withol = true; - players[i].send(send, targets); - players[i].wait(sendback); - } else if (players[i] == game.me) { - event.withme = true; - var next = game.createEvent("dddfenye_choose", false); - next.player = game.me; - next.targets = targets; - next.ai = event.ai; - next.fixedResult = event.fixedResult; - next.setContent(lib.skill["dddfenye"].contentx); - if (_status.connectMode) game.me.wait(sendback); - } else { - event.ai_targets.push(players[i]); - } - } - if (event.ai_targets.length) { - for (var i = 0; i < event.ai_targets.length; i++) { - if (targets.includes(event.ai_targets[i])) { - var target = event.ai_targets[i]; - var cards = target.getCards("h").sort((a, b) => { - return event.ai(b) - event.ai(a); - }); - sendback([target, cards[0]], target); - event.ai_targets.splice(i--, 1); - } - } - if (event.ai_targets.length) { - event.ai_targets.randomSort(); - setTimeout(function () { - event.interval = setInterval( - function () { - var target = event.ai_targets.shift(); - var cards = target - .getCards("h", (card) => get.value(card) < 4) - .sort((a, b) => { - return event.ai(b) - event.ai(a); - }); - if (!cards.length) { - sendback([null, null], target); - } else { - if (Math.abs(get.number(cards[0]) - 7) <= 2) { - sendback([null, null], target); - } else { - var sgn = get.number(cards[0]) >= 7 ? 1 : -1; - var targetsx = targets.slice().sort((a, b) => { - var attA = get.attitude(target, a), - attB = get.attitude(target, b); - return sgn * (attB - attA); - }); - sendback([targetsx[0], cards[0]], target); - } - } - if (!event.ai_targets.length) { - clearInterval(event.interval); - if (event.withai) game.resume(); - } - }, - _status.connectMode ? 750 : 75 - ); - }, 500); - } - } - "step 2"; - if (event.withme) { - if (_status.connectMode) game.me.unwait(result, game.me); - else { - if (!Array.isArray(result)) { - result = [null, null]; - } - event.results.push([game.me, result]); - } - } - "step 3"; - if (event.withol && !event.resultOL) { - game.pause(); - } - "step 4"; - if (event.ai_targets.length > 0) { - event.withai = true; - game.pause(); - } - "step 5"; - delete event._global_waiting; - for (var i of game.players) i.hideTimer(); - var cards = []; - var targets = []; - var lose_list = []; - event.results.sort((a, b) => lib.sort.seat(a[0], b[0])); - for (var res of event.results) { - var target = res[0], - card = res[1][1], - skill = res[1][2]; - if (!target || !card) continue; - if (skill && lib.skill[skill] && lib.skill[skill].onCompare) { - target.logSkill(skill); - res[1][1] = lib.skill[skill].onCompare(target); - if (target != player) cards.push(res[1][1]); - } else { - if (target != player) cards.push(card); - lose_list.push([target, [card]]); - } - if (target != player) targets.push(target); - } - if (lose_list.length) { - game.loseAsync({ - lose_list: lose_list, - }).setContent("chooseToCompareLose"); - } - event.lose_list = lose_list; - event.getNum = function (card) { - for (var i of event.lose_list) { - if (i[1].includes && i[1].includes(card)) return get.number(card, i[0]); - } - return get.number(card, false); - }; - event.cardlist = cards; - event.cards = cards; - event.card1 = event.results[0][1][1]; - event.num1 = event.getNum(event.card1); - event.iwhile = 0; - event.targets = targets; - event.tempplayer = event.player; - event.players = event.results - .filter((i) => i[1][0] == player && i[1][1]) - .map((i) => i[0]); - event.targetsx = event.results - .filter((i) => i[1][0] == event.targetx && i[1][1]) - .map((i) => i[0]); - event.result = { - player: event.card1, - targets: event.cardlist.slice(0), - num1: [event.num1], - num2: [], - winner: [], - loser: [], - }; - game.log(player, "的拼点牌为", event.card1); - "step 6"; - event.target = null; - event.trigger("compare"); - lib.skill["dddfenye"].$compareFenye( - event.players, - event.results.filter((i) => i[1][0] == player).map((i) => i[1][1]), - event.targetsx, - event.results.filter((i) => i[1][0] == event.targetx).map((i) => i[1][1]) - ); - "step 7"; - if (event.iwhile < targets.length) { - event.target = targets[event.iwhile]; - event.target.addTempClass("target"); - event.card2 = event.cardlist[event.iwhile]; - event.num2 = event.getNum(event.card2); - game.log(event.target, "的拼点牌为", event.card2); - delete event.player; - event.trigger("compare"); - } else { - game.delay(0, 1000); - event.goto(9); - } - "step 8"; - var key = event.players.includes(target) ? "num1" : "num2"; - event.result[key].push(event.num2); - event.iwhile++; - event.goto(7); - "step 9"; - event.player = event.tempplayer; - delete event.tempplayer; - var str; - var num1 = event.result.num1.reduce((p, c) => p + c, 0) / event.result.num1.length, - num2 = event.result.num2.reduce((p, c) => p + c, 0) / event.result.num2.length; - game.log(event.player, "方的点数均值为", "#y" + Math.floor(num1 * 100) / 100); - game.log(event.targetx, "方的点数均值为", "#y" + Math.floor(num2 * 100) / 100); - if (num1 > num2) { - str = get.translation(event.players) + "拼点成功"; - event.players.forEach((i) => i.popup("胜")); - event.targetsx.forEach((i) => i.popup("负")); - event.result.winner = event.players; - event.result.loser = event.targetsx; - } else { - str = get.translation(event.players) + "拼点失败"; - if (num1 == num2) { - event.players.forEach((i) => i.popup("平")); - event.targetsx.forEach((i) => i.popup("平")); - event.result.loser = event.players.addArray(event.targetsx); - } else { - event.players.forEach((i) => i.popup("负")); - event.targetsx.forEach((i) => i.popup("胜")); - event.result.winner = event.targetsx; - event.result.loser = event.players; - } - } - game.broadcastAll(function (str) { - var dialog = ui.create.dialog(str); - dialog.classList.add("center"); - setTimeout(function () { - dialog.close(); - }, 1000); - }, str); - game.delay(3); - "step 10"; - game.broadcastAll(ui.clear); - "step 11"; - event.cards.add(event.card1); - }, - contentx() { - "step 0"; - var player = game.me; - event.player = player; - event._global_waiting = true; - event.result = []; - if (targets.includes(player)) { - if (event.fixedResult && event.fixedResult[player.playerid]) { - event.result[0] = player; - event.result[1] = event.fixedResult[player.playerid]; - event.finish(); - } else - player - .chooseCard("请选择拼点牌", true) - .set("type", "compare") - .set("glow_result", true) - .set("_global_waiting", true).ai = event.ai; - } else { - player.chooseCardTarget({ - targets: targets, - filterTarget(card, player, target) { - return _status.event.targets.includes(target); - }, - selectCard: 1, - prompt: "是否于此次拼点加入其中一方?", - position: "h", - _global_waiting: true, - ai1: event.ai, - ai2(target) { - var player = _status.event.player, - sgn = -1; - if (player.hasCard((card) => get.number(card) > 10 && get.value(card) < 5)) - sgn = 1; - return sgn * get.attitude(player, target); - }, - }); - } - "step 1"; - if (targets.includes(player)) { - event.result[0] = player; - event.result[1] = result.cards[0]; - event.result[2] = result.skill; - } else { - if (result.bool) { - event.result[0] = result.targets[0]; - event.result[1] = result.cards[0]; - } else { - event.result = [null, null]; - } - } - }, - $compareFenye(players, cards1, targets, cards2) { - game.broadcast( - function (players, cards1, targets, cards2) { - lib.skill["dddfenye"].$compareFenye(players, cards1, targets, cards2); - }, - players, - cards1, - targets, - cards2 - ); - var left0 = -players.length * 52 - (players.length - 1) * 8; - for (var i = 0; i < players.length; i++) { - (function (target, card1, i) { - var left = left0 + i * 120; - var node1; - if (left < 0) { - node1 = target.$throwxy2( - card1, - "calc(50% - " + -left + "px)", - "calc(50% + 10px)", - "perspective(600px) rotateY(180deg)", - true - ); - } else { - node1 = target.$throwxy2( - card1, - "calc(50% + " + left + "px)", - "calc(50% + 10px)", - "perspective(600px) rotateY(180deg)", - true - ); - } - if (lib.config.cardback_style != "default") { - node1.style.transitionProperty = "none"; - ui.refresh(node1); - node1.classList.add("infohidden"); - ui.refresh(node1); - node1.style.transitionProperty = ""; - } else { - node1.classList.add("infohidden"); - } - node1.style.transform = "perspective(600px) rotateY(180deg) translateX(0)"; - var onEnd02 = function () { - node1.removeEventListener("webkitTransitionEnd", onEnd02); - setTimeout(function () { - node1.style.transition = "all ease-in 0.3s"; - node1.style.transform = - "perspective(600px) rotateY(270deg) translateX(52px)"; - var onEnd = function () { - node1.classList.remove("infohidden"); - node1.style.transition = "all 0s"; - ui.refresh(node1); - node1.style.transform = - "perspective(600px) rotateY(-90deg) translateX(52px)"; - ui.refresh(node1); - node1.style.transition = ""; - ui.refresh(node1); - node1.style.transform = ""; - node1.removeEventListener("webkitTransitionEnd", onEnd); - }; - node1.listenTransition(onEnd); - }, 200); - }; - node1.listenTransition(onEnd02); - })(players[i], cards1[i], i); - } - setTimeout(function () { - var left0 = -targets.length * 52 - (targets.length - 1) * 8; - for (var i = 0; i < targets.length; i++) { - (function (target, card2, i) { - var left = left0 + i * 120; - var node2; - if (left < 0) { - node2 = target.$throwxy2( - card2, - "calc(50% - " + -left + "px)", - "calc(50% - 114px)", - "perspective(600px) rotateY(180deg)", - true - ); - } else { - node2 = target.$throwxy2( - card2, - "calc(50% + " + left + "px)", - "calc(50% - 114px)", - "perspective(600px) rotateY(180deg)", - true - ); - } - if (lib.config.cardback_style != "default") { - node2.style.transitionProperty = "none"; - ui.refresh(node2); - node2.classList.add("infohidden"); - ui.refresh(node2); - node2.style.transitionProperty = ""; - } else { - node2.classList.add("infohidden"); - } - node2.style.transform = "perspective(600px) rotateY(180deg) translateX(0)"; - var onEnd02 = function () { - node2.removeEventListener("webkitTransitionEnd", onEnd02); - setTimeout(function () { - node2.style.transition = "all ease-in 0.3s"; - node2.style.transform = - "perspective(600px) rotateY(270deg) translateX(52px)"; - var onEnd = function () { - node2.classList.remove("infohidden"); - node2.style.transition = "all 0s"; - ui.refresh(node2); - node2.style.transform = - "perspective(600px) rotateY(-90deg) translateX(52px)"; - ui.refresh(node2); - node2.style.transition = ""; - ui.refresh(node2); - node2.style.transform = ""; - node2.removeEventListener("webkitTransitionEnd", onEnd); - }; - node2.listenTransition(onEnd); - }, 200); - }; - node2.listenTransition(onEnd02); - })(targets[i], cards2[i], i); - } - }, 200); - }, - ai: { - order: 1, - result: { - target: -1, - }, - threaten: 1.3, - }, - }, - dddshichao: { - audio: 2, - trigger: { - player: "phaseZhunbeiBegin", - }, - filter(event, player) { - return player.countMark("dddshichao") + 1 <= game.countPlayer(); - }, - onremove: true, - forced: true, - content() { - "step 0"; - var N = player.countMark("dddshichao") + 1; - player - .chooseTarget( - "逝潮:选择一名手牌数第" + get.cnNumber(N) + "大的角色", - true, - (card, player, target) => { - return _status.event.targets.includes(target); - } - ) - .set("ai", (target) => { - var zhu = get.zhu(player) || game.filterPlayer((i) => i.getSeatNum() == 1)[0]; - return Math.min( - target.countCards("h") - player.countCards("h"), - zhu.maxHp - player.countCards("h") - ); - }) - .set( - "targets", - (function () { - var list = game - .filterPlayer() - .map((i) => [i, i.countCards("h")]) - .sort((a, b) => b[1] - a[1]); - var targets = []; - var ind = 0, - tmp = Infinity; - for (var i of list) { - if (i[1] < tmp) { - ind++; - tmp = i[1]; - } - if (ind == N) { - targets.push(i[0]); - } - if (ind > N) break; - } - if (!targets.length) - targets = game.filterPlayer( - (i) => i.countCards("h") == list[list.length - 1][1] - ); - return targets; - })() - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dddshichao", target); - var zhu = get.zhu(player) || game.filterPlayer((i) => i.getSeatNum() == 1)[0]; - var del = Math.min( - target.countCards("h") - player.countCards("h"), - zhu.maxHp - player.countCards("h") - ); - if (del > 0) player.draw(del); - if (del < 0) player.chooseToDiscard(-del, true); - target.addSkill("dddshichao_up"); - target.markAuto("dddshichao_up", [player]); - player.addTempSkill("dddshichao_clear", { - player: "phaseBegin", - }); - player.markAuto("dddshichao_clear", [target]); - } - }, - subSkill: { - up: { - trigger: { source: "damageBegin2" }, - filter(event, player) { - return player.getStorage("dddshichao_up").includes(event.player); - }, - charlotte: true, - check(event, player) { - var eff = get.damageEffect(event.player, player, player); - return ( - (event.player.hasSkill("dddshichao") && eff < 0) || - (event.num == 1 && eff < 13) - ); - }, - logTarget: "player", - content() { - "step 0"; - trigger.cancel(); - if (trigger.player.hasSkill("dddshichao")) { - trigger.player.addMark("dddshichao", 1, false); - } - }, - }, - clear: { - charlotte: true, - onremove(player) { - game.filterPlayer((current) => { - current.unmarkAuto("dddshichao_up", [player]); - }); - }, - }, - }, - }, - //管宁 - dddyouxue: { - audio: 2, - trigger: { global: "roundStart" }, - forced: true, - content() { - "step 0"; - if (!game.hasPlayer((current) => current.hasMark("dddyouxue"))) - player.addMark("dddyouxue"); - if (!game.hasPlayer((current) => !current.hasMark("dddyouxue"))) event.finish(); - "step 1"; - player - .chooseTarget("游学:将“游学”标记交给另一名角色", true, (card, player, target) => { - return !target.hasMark("dddyouxue"); - }) - .set("ai", (target) => { - return get.distance( - game.findPlayer((current) => current.hasMark("dddyouxue")), - target - ); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - var source = game.findPlayer((current) => current.hasMark("dddyouxue")); - if (source == player) player.line(target, "green"); - else player.line2([source, target], "green"); - source.clearMark("dddyouxue"); - target.addMark("dddyouxue"); - player.draw(get.distance(source, target)); - } - }, - marktext: "游", - intro: { - name: "游学", - content: () => - get.translation(game.filterPlayer((current) => current.hasSkill("dddyouxue"))) + - "到此一游", - }, - }, - dddchengjing: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter(event, player) { - if (!event.player.hasMark("dddyouxue")) return false; - return event.player.hasHistory("useCard", (evt) => { - if (!["basic", "trick"].includes(get.type(evt.card))) return false; - if (!evt.card.isCard || evt.cards.length != 1) return false; - return get.position(evt.cards[0], true) == "d"; - }); - }, - forced: true, - locked: false, - group: "dddchengjing_use", - logTarget: "player", - *content(event, map) { - const player = map.player, - trigger = map.trigger, - target = trigger.player; - let history = target.getHistory("useCard").reverse(); - let cards = []; - for (var evt of history) { - if (!["basic", "trick"].includes(get.type(evt.card))) continue; - if (!evt.card.isCard || evt.cards.length != 1) continue; - if (get.position(evt.cards[0], true) == "d") { - cards.addArray(evt.cards); - break; - } - } - const jing = player.getExpansions("dddchengjing"); - if (jing.length) player.loseToDiscardpile(jing); - player.addToExpansion(cards, "log", "gain2").gaintag.add("dddchengjing"); - }, - marktext: "经", - intro: { - name: "经(承经)", - name2: "经", - markcount: "expansion", - content: "expansion", - }, - subSkill: { - use: { - audio: "dddchengjing", - enable: "phaseUse", - usable: 1, - filterCard: true, - position: "hes", - filter(event, player) { - return player.getExpansions("dddchengjing").length > 0; - }, - viewAs(cards, player) { - const card = player.getExpansions("dddchengjing")[0]; - return new lib.element.VCard({ - name: get.name(card, false), - nature: get.nature(card, false), - storage: { dddchengjing: true }, - }); - }, - popname: true, - prompt() { - const card = get.player().getExpansions("dddchengjing")[0]; - return ( - "将一张牌当" + - get.translation({ - name: get.name(card, false), - nature: get.nature(card, false), - }) + - "使用" - ); - }, - precontent() { - player - .when("useCardAfter") - .filter((evt) => evt.card.storage.dddchengjing) - .then(() => { - var cards = trigger.cards.filterInD("od"); - if (!cards.length) { - event.finish(); - return; - } - var target = game.findPlayer((current) => current.hasMark("dddyouxue")); - if (!target) { - event.finish(); - return; - } - target = target.getNext(); - event.target = target; - player - .chooseBool( - `承经:是否将${get.translation(cards)}交给${get.translation( - target - )}?` - ) - .set("choice", get.attitude(player, target) > 0); - }) - .then(() => { - if (result.bool) { - player.line(event.target); - player.addExpose(0.1); - event.target.gain(trigger.cards.filterInD("od"), "gain2"); - } - }); - }, - }, - }, - ai: { - combo: "dddyouxue" - }, - }, - dddyouxue_old: { - audio: 2, - trigger: { global: "roundStart" }, - forced: true, - content() { - "step 0"; - var vpos = player.hasMark("dddyouxue_old") - ? game.filterPlayer2((i) => i.getSeatNum() == player.countMark("dddyouxue_old"))[0] - : player; - event.vpos = vpos; - player - .chooseTarget("游学:选择你的行动次序", true) - .set("ai", (target) => { - return get.distance(_status.event.vpos, target); - }) - .set("vpos", vpos); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - if (event.vpos == player) player.line(target, "green"); - else player.line2([event.vpos, target], "green"); - event.num = get.distance(event.vpos, target); - player.storage["dddyouxue_old"] = target.getSeatNum(); - player.addSkill("dddyouxue_old_act"); - player.markSkill("dddyouxue_old"); - } else event.finish(); - "step 2"; - var next = player.phaseDraw(); - next.set("num", num); - delete next.skill; - "step 3"; - player.skip("phaseDraw"); - }, - marktext: "虚", - intro: { - name: "虚位", - content: "当前虚位为#号", - }, - subSkill: { - act: { - trigger: { - global: ["phaseBefore", "phaseAfter", "phaseYouxueed"], - }, - forced: true, - firstDo: true, - charlotte: true, - filter(event, player, name) { - if (event.skill) return false; - var vseat = player.countMark("dddyouxue_old"); - if (name != "phaseBefore") { - if (player.hasSkill("dddyouxue_old_acted", null, false, false)) return false; - var seat = event.player.getSeatNum(); - var next = event.player.next; - if (!game.players.includes(next)) next = game.findNext(next); - var seat2 = next.getSeatNum(); - if (seat == seat2) return false; - if (seat < seat2) return vseat > seat && vseat <= seat2; - return seat2 >= vseat; - } else { - return event.player == player; - } - }, - content() { - if (event.triggername == "phaseBefore") { - trigger.finish(); - trigger.untrigger(true); - trigger._triggered = 5; - trigger.trigger("phaseYouxueed"); - } else { - player.insertPhase("dddyouxue_old_act"); - player.addTempSkill("dddyouxue_old_acted", "roundStart"); - } - }, - }, - acted: { charlotte: true }, - }, - }, - dddchengjing_old: { - audio: 2, - usable: 1, - enable: "phaseUse", - filter(event, player) { - return ( - player.countCards("hes") > 0 && - player.countMark("dddyouxue_old") > 0 && - lib.skill["dddchengjing_old"].getList(player).length > 0 - ); - }, - getList(player) { - var vpos = player.hasMark("dddyouxue_old") - ? game.filterPlayer2((i) => i.getSeatNum() == player.countMark("dddyouxue_old"))[0] - : player; - if (!vpos || !vpos.isIn()) return []; - var vcard = []; - var history = vpos - .getPrevious() - .actionHistory.filter((evt) => !evt.custom.some((i) => i["dddyouxue_old"])); - history = history[history.length - 2]; - var evts = history.useCard; - for (var evt of evts) { - var card = evt.card; - var type = get.type(card); - if (type != "basic" && type != "trick") continue; - if (card.name == "sha") { - vcard.push(["基本", "", card.name, card.nature]); - } else vcard.push([type, "", card.name]); - } - return vcard; - }, - chooseButton: { - dialog(event, player) { - var list = lib.skill["dddchengjing_old"].getList(player); - list.sort((a, b) => { - return ( - 100 * (lib.inpile.indexOf(a[2]) - lib.inpile.indexOf(b[2])) + - lib.inpile_nature.indexOf(a[3]) - - lib.inpile_nature.indexOf(b[3]) - ); - }); - list.filter((vcard) => { - return event.filterCard({ name: vcard[2], nature: vcard[3] }, player, event); - }); - return ui.create.dialog("承经", [list, "vcard"]); - }, - filter(button, player) { - return _status.event - .getParent() - .filterCard({ name: button.link[2] }, player, _status.event.getParent()); - }, - check(button) { - if (_status.event.getParent().type != "phase") return 1; - var player = _status.event.player; - return player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }, - backup(links, player) { - return { - filterCard: true, - audio: "dddchengjing_old", - popname: true, - check(card) { - return 8 - get.value(card); - }, - position: "hes", - viewAs: { - name: links[0][2], - nature: links[0][3], - storage: { dddchengjing_old: true }, - }, - precontent() { - player.addTempSkill("dddchengjing_old_effect"); - }, - }; - }, - prompt(links, player) { - return ( - "将一张牌当做" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) + - "使用" - ); - }, - }, - ai: { - combo: "dddyouxue_old", - order: 1, - result: { - player: 1, - }, - }, - subSkill: { - effect: { - audio: "dddchengjing_old", - trigger: { global: "useCardAfter" }, - charlotte: true, - direct: true, - filter(event, player) { - return event.card && event.card.storage && event.card.storage["dddchengjing_old"]; - }, - content() { - "step 0"; - var damaged = game.hasPlayer2((current) => - current.hasHistory("damage", (evt) => evt.card == trigger.card) - ); - event.damaged = damaged; - var vpos = player.hasMark("dddyouxue_old") - ? game.filterPlayer2( - (i) => i.getSeatNum() == player.countMark("dddyouxue_old") - )[0] - : player; - var target = vpos.getNext(); - event.target = target; - player - .chooseControl(" +1 ", " -1 ", "cancel2") - .set( - "prompt", - "是否令“虚位”下家(" + - get.translation(target) + - ")下回合的" + - (damaged ? "摸牌数" : "手牌上限") + - "+1或-1?" - ) - .set("ai", function () { - var sgn = get.sgn( - get.attitude(_status.event.player, _status.event.target) - ); - if (sgn == 0) return 2; - if (sgn == 1) return 0; - return 1; - }) - .set("target", target); - "step 1"; - if (result.index != 2) { - player.logSkill("dddchengjing_old_effect", target); - var name = (event.damaged ? "draw" : "limit") + result.index; - target.addTempSkill("dddchengjing_old_check", { - player: "phaseAfter", - }); - target.addMark("dddchengjing_old_" + name, 1, false); - game.log( - target, - "下回合的" + (event.damaged ? "摸牌数" : "手牌上限"), - "#y" + ["+1", "-1"][result.index] - ); - } - }, - }, - check: { - trigger: { player: "phaseDrawBegin2" }, - charlotte: true, - forced: true, - filter(event, player) { - return ( - player.countMark("dddchengjing_old_draw0") > 0 || - player.countMark("dddchengjing_old_draw1") > 0 - ); - }, - content() { - trigger.num += - player.countMark("dddchengjing_old_draw0") - - player.countMark("dddchengjing_old_draw1"); - }, - mod: { - maxHandcard(player, num) { - return ( - num + - player.countMark("dddchengjing_old_limit0") - - player.countMark("dddchengjing_old_limit1") - ); - }, - }, - onremove(player) { - delete player.storage["dddchengjing_old_draw0"]; - delete player.storage["dddchengjing_old_draw1"]; - delete player.storage["dddchengjing_old_limit0"]; - delete player.storage["dddchengjing_old_limit1"]; - }, - mark: true, - marktext: "承", - intro: { - name: "承经", - content(storage, player) { - var str = ""; - if ( - player.countMark("dddchengjing_old_draw0") || - player.countMark("dddchengjing_old_draw1") - ) { - var num = - player.countMark("dddchengjing_old_draw0") - - player.countMark("dddchengjing_old_draw1"); - str += "
  • 摸牌阶段摸牌数" + (num >= 0 ? "+" : "") + num; - } - if ( - player.countMark("dddchengjing_old_limit0") || - player.countMark("dddchengjing_old_limit1") - ) { - var num = - player.countMark("dddchengjing_old_limit0") - - player.countMark("dddchengjing_old_limit1"); - str += "
  • 手牌上限" + (num >= 0 ? "+" : "") + num; - } - return str; - }, - }, - }, - draw0: { charlotte: true }, - draw1: { charlotte: true }, - limit0: { charlotte: true }, - limit1: { charlotte: true }, - }, - }, - dddduanbing: { - enable: "phaseUse", - filter(event, player) { - return ( - player.canAddJudge("bingliang") && - player.hasCard((card) => lib.skill["dddduanbing"].filterCard(card, player), "he") - ); - }, - filterCard(card, player) { - if (get.color(card) != "black" || get.type2(card) == "trick") return false; - return player.canAddJudge(get.autoViewAs({ name: "bingliang" }, [card])); - }, - check(card) { - return 8.2 - get.value(card); - }, - discard: false, - lose: false, - delay: false, - prepare: "throw", - group: "dddduanbing_effect", - position: "he", - content() { - "step 0"; - player.addJudge({ name: "bingliang" }, cards); - "step 1"; - game.delayx(); - player.draw(2); - "step 2"; - player.chooseUseTarget( - { - name: "sha", - isCard: true, - storage: { _dddduanbing: true }, - }, - false, - "nodistance" - ); - }, - ai: { - order(item, player) { - return get.order({ name: "sha" }) - 0.1; - }, - result: { - player(player) { - return player.getUseValue({ name: "sha" }, false); - }, - }, - }, - subSkill: { - effect: { - trigger: { source: "damageSource" }, - charlotte: true, - filter(event, player) { - if (event.getParent().type != "card" || !event.player.isIn()) return false; - return player.hasCard((card) => { - return ( - (card.viewAs || card.name) == "bingliang" && - event.player.canAddJudge(card) - ); - }, "j"); - }, - prompt: (event) => "是否将【兵粮寸断】转移给" + get.translation(event.player) + "?", - check(event, player) { - return player.hasCard((card) => { - return ( - (card.viewAs || card.name) == "bingliang" && - event.player.canAddJudge(card) && - get.effect( - event.player, - new lib.element.VCard({ - name: "bingliang", - cards: [card], - }), - player, - _status.event.player - ) >= 0 - ); - }, "j"); - }, - content() { - var cards = player.getCards("j", (card) => { - return ( - (card.viewAs || card.name) == "bingliang" && - trigger.player.canAddJudge(card) - ); - }); - var target = trigger.player; - player.line(target); - player.$give(cards, target, false); - cards.forEach((card) => { - target.addJudge({ name: "bingliang" }, card); - }); - }, - }, - }, - }, - //轲比能 - dddxiaoxing: { - audio: 2, - trigger: { global: "gameDrawBegin" }, - forced: true, - group: "dddxiaoxing_remove", - init(player, skill) { - if (game.online) return; - var bool = get.event().getParent("phaseLoop", true); - if (!bool) return; - if (player.hasSkill(skill)) { - player.logSkill("dddxiaoxing"); - player.draw(3); - } - }, - content() { - var me = player; - var numx = trigger.num; - trigger.num = - typeof numx == "function" - ? function (player) { - if (player == me) { - return 3 + numx(player); - } - return numx(player); - } - : function (player) { - if (player == me) { - return 3 + numx; - } - return numx; - }; - }, - mod: { - attackRange: (player, num) => num + 3, - maxHandcard: (player, num) => num + 3, - }, - subSkill: { - remove: { - trigger: { player: "dying" }, - forced: true, - // direct:true, - // filter(event,player){ - // return event.source&&event.source.isIn()&&event.source.getEquips(1).length>0; - // }, - content() { - player.removeSkills("dddxiaoxing"); - }, - content_old() { - "step 0"; - trigger.source - .chooseBool(get.prompt("dddxiaoxing", player), "废除武器栏,令其失去〖枭行〗") - .set("ai", () => { - if (_status.event.maybe) return Math.random() < 0.5; - return false; - }) - .set( - "maybe", - player.countCards("hs", { - name: ["tao", "jiu"], - }) && player.countCards("h") >= 3 - ); - "step 1"; - if (result.bool) { - trigger.source.logSkill("dddxiaoxing", player); - trigger.source.disableEquip(1); - player.removeSkills("dddxiaoxing"); - } - }, - }, - }, - }, - dddlangzhi: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - logTarget(event, player) { - return game.filterPlayer( - (current) => player.inRange(current) && current.countCards("he") - ); - }, - prompt: "是否发动【狼志】?", - prompt2(event, player) { - return `展示${get.translation( - game.filterPlayer((current) => player.inRange(current) && current.countCards("he")) - )}的各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。`; - }, - content() { - "step 0"; - event.targets = game.filterPlayer( - (current) => player.inRange(current) && current.countCards("he") - ); - event.cards = []; - event.num = 0; - "step 1"; - var target = targets[num]; - event.num++; - event.target = target; - player.choosePlayerCard( - "狼志:展示" + get.translation(target) + "一张牌", - "he", - target, - true - ); - "step 2"; - if (result.bool) { - var card = result.links[0]; - player.showCards(card, get.translation(target) + "被展示"); - event.cards.push(card); - } - "step 3"; - if (num < targets.length) event.goto(1); - else { - event.videoId = lib.status.videoId++; - if (event.isMine()) { - event.dialog = ui.create.dialog( - '###是否替换其中的任意张牌?###
    或点击“取消”,获得所有展示牌,然后失去〖狼志〗
    ', - cards - ); - event.dialog.videoId = event.videoId; - } else if (player.isOnline2()) { - player.send( - function (cards, id) { - var dialog = ui.create.dialog( - '###是否替换其中的任意张牌?###
    或点击“取消”,获得所有展示牌,然后失去〖狼志〗
    ', - cards - ); - dialog.videoId = id; - }, - cards, - event.videoId - ); - } - player - .chooseCard([1, cards.length], "he") - .set("ai", (card) => { - if (ui.selected.cards.length >= _status.event.num) return 0; - return 100 - get.value(card); - }) - .set( - "num", - (function () { - if (cards.length < Math.floor(game.countPlayer() / 2 - 0.5)) return 0; - var val = cards.reduce((p, c) => p + get.value(c), 0); - if (val < cards.length * 6) return 0; - var list1 = player.getCards("he").map((card) => get.value(card, player)), - list2 = cards.map( - (card, i) => - get.value(card, targets[i]) * - get.sgnAttitude(player, targets[i]) - ); - list1.sort((a, b) => a[1] - b[1]); - list2.sort((a, b) => b[1] - a[1]); - list2 = list2.filter((i) => i > 0); - var count = 0; - for (var i of list2) { - for (var j = 0; j < list1.length; j++) { - if (i > list1[j]) { - count++; - list1.splice(j, 1); - break; - } - } - } - return count; - })() - ) - .set("prompt", false); - } - "step 4"; - if (result.bool) { - var cards2 = result.cards; - event.cards2 = cards2; - var func = function (id) { - var dialog = get.idDialog(id); - if (dialog) - dialog.content.childNodes[1].innerHTML = - '
    选择要交换的牌(按选择的顺序一一交换)
    '; - }; - if (event.isMine()) func(event.videoId); - else if (player.isOnline2()) player.send(func, event.videoId); - player - .chooseButton(cards2.length, true) - .set("dialog", event.videoId) - .set("ai", (button) => { - return get.value(button.link); - }); - event.goto(6); - } else { - for (var i = 0; i < cards.length; i++) { - targets[i].$give(cards[i], player, false); - } - player.gain(cards, "log"); - } - "step 5"; - player.removeSkills("dddlangzhi"); - event.finish(); - "step 6"; - game.broadcastAll("closeDialog", event.videoId); - if (result.bool) { - var cards2 = event.cards2, - cards3 = result.links; - if (cards2.length != cards3.length) return; - for (var i = 0; i < cards2.length; i++) { - player.swapHandcards(get.owner(cards3[i]), [cards2[i]], [cards3[i]]); - } - } else event.finish(); - "step 7"; - game.delayx(); - }, - }, - dddfuyi: { - audio: 2, - zhuSkill: true, - trigger: { - // global:['discardBegin','drawBegin'], - global: "dieAfter", - }, - filter(event, player) { - if (!event.source || !event.source.isIn() || event.source.group != "qun") return false; - if (!event.source.countCards("he") < 2) return false; - if (!player.hasZhuSkill("dddfuyi", event.source)) return false; - const skills = player.getStockSkills(true, true).filter((skill) => { - return !player.hasSkill(skill, null, false, false); - }); - return skills.length > 0; - }, - filter_old(event, player) { - var evt = event.getParent(); - if (evt.name != "die" || evt.source != event.player || event.player == player) - return false; - if (!player.hasZhuSkill("dddfuyi", event.player)) return false; - var skills = player.getSkills("dddxiaoxing", null, false, false); - return !skills.includes("dddxiaoxing") || !skills.includes("dddlangzhi"); - }, - direct: true, - global: "dddfuyi_sha", - content() { - "step 0"; - trigger.source - .chooseCard( - "是否响应" + get.translation(player) + "的【附义】?", - "弃置两张牌,令其获得其武将牌上的一个技能", - "he", - 2, - lib.filter.cardDiscardable - ) - .set("ai", () => { - if (get.attitude(_status.event.player, _status.event.getParent().player) <= 2) - return 0; - return 6 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("dddfuyi", trigger.source); - trigger.source.discard(result.cards).discarder = trigger.source; - var skills = player.getStockSkills(true, true).filter((skill) => { - return !player.hasSkill(skill, null, false, false); - }); - if (skills.length == 1) event._result = { control: skills[0] }; - else - trigger.source - .chooseControl(skills) - .set( - "choiceList", - skills.map((skill) => { - return ( - '
    【' + - get.translation( - lib.translate[skill + "_ab"] || - get.translation(skill).slice(0, 2) - ) + - "】
    " + - get.skillInfoTranslation(skill, player) + - "
    " - ); - }) - ) - .set("displayIndex", false) - .set("prompt", `附义:选择令${get.translation(player)}获得一个技能`) - .set("ai", () => { - var controls = get.event("controls"); - if (controls.includes("dddxiaoxing")) return "dddxiaoxing"; - return controls.sort((a, b) => { - return get.skillrank(b, "inout") - get.skillrank(a, "inout"); - })[0]; - }); - } else event.finish(); - "step 2"; - var skill = result.control; - player.addSkills(skill); - }, - content_old() { - "step 0"; - var str = "取消此次奖惩,令其获得"; - var skills = player.getSkills("dddxiaoxing", null, false, false); - var bool1 = !skills.includes("dddxiaoxing"), - bool2 = !skills.includes("dddlangzhi"); - var choices = []; - if (bool1) { - str += "〖枭行〗"; - choices.push("dddxiaoxing"); - } - if (bool1 && bool2) str += "/"; - if (bool2) { - str += "〖狼志〗"; - choices.push("dddlangzhi"); - } - if (bool1 && bool2) { - str += "中的一或两个"; - choices.push("dddfuyi_both"); - } - choices.push("cancel2"); - trigger.player - .chooseControl(choices) - .set("prompt", "是否对" + get.translation(player) + "发动【附义】?") - .set("prompt2", str) - .set("ai", () => { - if (get.attitude(_status.event.player, _status.event.getParent().player) <= 2) - return "cancel2"; - if (_status.event.choices.includes("dddfuyi_both")) return "dddfuyi_both"; - if (_status.event.choices.includes("dddlangzhi")) return "dddlangzhi"; - return Math.random() < 0.5 ? "dddxiaoxing" : "cancel2"; - }); - "step 1"; - if (result.control != "cancel2") { - trigger.player.logSkill("dddfuyi", player); - trigger.cancel(); - var skills = [result.control]; - if (result.control == "dddfuyi_both") { - skills = ["dddxiaoxing", "dddlangzhi"]; - player.draw(3); - } else event.finish(); - player.addSkills(skills); - } else event.finish(); - "step 2"; - player.removeSkills("dddfuyi"); - }, - subSkill: { - sha: { - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") { - if (player.group != "qun") return; - return ( - num + - game.countPlayer((current) => { - return current.hasZhuSkill("dddfuyi", player); - }) - ); - } - }, - }, - }, - }, - }, - //曹爽 - dddzhuanshe: { - audio: 2, - trigger: { global: "phaseUseBegin" }, - filter(event, player) { - return player.countCards("h") > 0 && event.player != player; - }, - direct: true, - content() { - "step 0"; - player - .chooseCard(get.prompt2("dddzhuanshe", trigger.player)) - .set("ai", (card) => { - var target = _status.event.getTrigger().player; - if (!_status.event.goon) { - if (get.value(card) < 4) return -target.getUseValue(card) + 0.001; - return 0; - } - return target.getUseValue(card); - }) - .set("goon", get.attitude(player, trigger.player)); - "step 1"; - if (result.bool) { - var card = result.cards[0]; - player.logSkill("dddzhuanshe", trigger.player); - player.give(card, trigger.player, true); - player.addTempSkill("dddzhuanshe_effect"); - player.markAuto("dddzhuanshe_effect", [card.name]); - } - }, - subSkill: { - effect: { - audio: "dddzhuanshe", - trigger: { global: "useCard2" }, - filter(event, player) { - if (!player.getStorage("dddzhuanshe_effect").includes(event.card.name)) - return false; - if (event.player != _status.currentPhase) return false; - var type = get.type(event.card, null, false); - if (type != "basic" && type != "trick") return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(event.card, event.player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - direct: true, - group: "dddzhuanshe_damage", - charlotte: true, - onremove: true, - content() { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - player - .chooseTarget( - get.prompt("dddzhuanshe_effect"), - function (card, player, target) { - var player = _status.event.source; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2(_status.event.card, player, target) - ); - } - ) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.source; - return get.effect(target, trigger.card, player, _status.event.player); - }) - .set("targets", trigger.targets) - .set("card", trigger.card) - .set("source", trigger.player); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill(event.name, event.targets); - trigger.targets.addArray(event.targets); - game.log(event.targets, "也成为了", trigger.card, "的目标"); - } - }, - }, - damage: { - audio: "dddzhuanshe", - trigger: { global: "phaseEnd" }, - filter(event, player) { - var list = player.getStorage("dddzhuanshe_effect").slice(); - event.player.getHistory("useCard", (evt) => { - list.remove(evt.card.name); - }); - return list.length; - }, - charlotte: true, - logTarget: "player", - prompt2: "对其造成1点伤害", - check(event, player) { - return get.damageEffect(event.player, player, player) >= 0; - }, - content() { - trigger.player.damage(player); - }, - }, - }, - }, - dddweiqiu: { - audio: 2, - trigger: { global: "recoverBefore" }, - filter(event, player) { - return !player.countCards("h"); - }, - forced: true, - direct: true, - content() { - trigger.player.logSkill("dddweiqiu", player); - trigger.cancel(); - player.draw(); - }, - }, - //薛灵芸 - dddlianer: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter(event, player) { - return event.cards.filterInD("od").length > 0 && get.color(event.card) == "red"; - }, - content() { - "step 0"; - var cards = trigger.cards.filterInD("od"); - event.cards = cards; - player.gain(cards, "gain2"); - "step 1"; - var number = get.number(cards[0]); - if (cards.length == 1 && typeof number == "number") { - player.addTempSkill("dddlianer_ceiling"); - player.storage["dddlianer_ceiling"] = number; - } - }, - mod: { - aiOrder(player, card, num) { - if (get.itemtype(card) == "card" && get.color(card) == "red") { - if (!player.storage["dddlianer_ceiling"]) return; - var numx = get.number(card); - if (typeof numx == "number") { - return num + 10 / Math.max(1, player.storage["dddlianer_ceiling"] - numx); - } - } - }, - }, - subSkill: { - ceiling: { - onremove: true, - charlotte: true, - mod: { - cardEnabled(card, player) { - if (!player.storage["dddlianer_ceiling"]) return; - var num = get.number(card); - if ( - num != "unsure" && - (typeof num != "number" || player.storage["dddlianer_ceiling"] <= num) - ) - return false; - }, - cardRespondable(card, player) { - if (!player.storage["dddlianer_ceiling"]) return; - var num = get.number(card); - if ( - num != "unsure" && - (typeof num != "number" || player.storage["dddlianer_ceiling"] <= num) - ) - return false; - }, - cardSavable(card, player) { - if (!player.storage["dddlianer_ceiling"]) return; - var num = get.number(card); - if ( - num != "unsure" && - (typeof num != "number" || player.storage["dddlianer_ceiling"] <= num) - ) - return false; - }, - }, - }, - }, - }, - dddanzhi: { - audio: 2, - trigger: { global: "phaseBegin" }, - filter(event, player) { - var evts = game.getAllGlobalHistory("everything", (evt) => - ["useCard", "respond"].includes(evt.name) - ); - if (!evts.length) return false; - const color = get.color(evts.lastItem.card, false); - return color == "black"; - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget( - get.prompt("dddanzhi"), - "选择一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效" - ) - .set("ai", (target) => { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dddanzhi", target); - target.addTempSkill("dddanzhi_effect"); - } - }, - subSkill: { - effect: { - trigger: { target: "useCardToTarget" }, - filter(event, player) { - return get.color(event.card) == "black"; - }, - forced: true, - charlotte: true, - content() { - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - trigger.untrigger(); - game.log(trigger.card, "对", player, "无效了"); - game.delayx(); - player.removeSkill("dddanzhi_effect"); - }, - }, - }, - }, - //刘宏 - dddshixing: { - audio: 2, - trigger: { - global: ["changeHp", "useCard1", "phaseBefore"], - }, - forced: true, - onremove: true, - filter(event, player) { - var num = player.countMark("dddshixing"); - if (event.name == "changeHp") { - if (event.player.hasSex("female")) { - var bool = !event.player.isDamaged(); - if ((bool && (num & 1) == 0) || (!bool && (num & 1) == 1)) { - return true; - } - } - return false; - } - if (event.name == "useCard") { - var bool = - game.getGlobalHistory("useCard", (evt) => get.type2(evt.card) == "trick") - .length == 0; - if ((bool && (num & 2) == 0) || (!bool && (num & 2) == 2)) { - return true; - } - return false; - } - return true; - }, - content() { - lib.skill["dddshixing"].applyChange(player); - }, - applyChange(player) { - player.removeAdditionalSkill("dddshixing"); - var bool1 = game.hasPlayer((current) => !current.isDamaged() && current.hasSex("female")), - bool2 = - game.getGlobalHistory("useCard", (evt) => get.type2(evt.card) == "trick") - .length == 0; - player.storage["dddshixing"] = bool1 + 2 * bool2; - var list = []; - if (bool1) list.push("xiangle"); - if (bool2) list.push("jiushi"); - if (!bool1 && !bool2) list.push("rezhiheng"); - player.addAdditionalSkill("dddshixing", list); - }, - derivation: ["xiangle", "jiushi", "rezhiheng"], - }, - ddddanggu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return ( - game.countPlayer((current) => current.isLinked()) < - game.countPlayer((current) => current.group == "qun") - ); - }, - forced: true, - group: "ddddanggu_negative", - content() { - "step 0"; - if (!event.loop) event.loop = 0; - var num = - game.countPlayer((current) => current.group == "qun") - - game.countPlayer((current) => current.isLinked()); - player - .chooseTarget( - "党锢:横置至少" + get.cnNumber(num) + "名角色", - [num, Infinity], - true, - (card, player, target) => { - return !target.isLinked(); - } - ) - .set("ai", (target) => { - return get.effect(target, { name: "tiesuo" }, _status.event.player); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.logSkill("ddddanggu", targets); - targets.forEach((i) => i.link()); - } - }, - discard() { - "step 0"; - game.log(player, "进入了弃牌阶段"); - event.num = Math.max( - 0, - player.countCards("he", (card) => !player.canIgnoreHandcard(card)) - - player.getHandcardLimit() - ); - if (event.num <= 0) event.finish(); - else { - if (lib.config.show_phase_prompt) { - player.popup("弃牌阶段"); - } - } - event.trigger("phaseDiscard"); - "step 1"; - player.chooseToDiscard(num, true, "he"); - "step 2"; - event.cards = result.cards; - }, - subSkill: { - negative: { - trigger: { global: "phaseDiscardBegin" }, - filter(event, player) { - return event.player != player && event.player.isLinked(); - }, - forced: true, - logTarget: "player", - content() { - trigger.setContent(lib.skill["ddddanggu"].discard); - }, - }, - }, - }, - dddfuzong: { - audio: 2, - zhuSkill: true, - forced: true, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - if (!player.hasZhuSkill("dddfuzong")) return false; - return event.name != "phase" || game.phaseNumber == 0; - }, - group: "dddfuzong_discard", - content() { - player.draw( - game.countPlayer((current) => { - return current.group == "qun"; - }) - ); - }, - subSkill: { - discard: { - trigger: { global: "die" }, - filter(event, player) { - if (!player.hasZhuSkill("dddfuzong")) return false; - return event.player.group == "qun"; - }, - zhuSkill: true, - forced: true, - logTarget: "player", - content() { - trigger.player.discardPlayerCard(player, "he", true).set("forceDie", true); - }, - }, - }, - }, - //夏侯玄 - dddlanghuai: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - zhuanhuanji: true, - direct: true, - content() { - "step 0"; - if (player.hasMark("dddxuanlun_del")) event._result = { bool: true }; - else - player - .chooseBool( - get.prompt("dddlanghuai"), - "展示手牌(无牌则不展示),并改为摸其中" + - (!player.storage["dddlanghuai"] ? "包含" : "缺少") + - "花色数的牌" - ) - .set("ai", () => _status.event.bool) - .set( - "bool", - (function () { - var list = [], - cards = player.getCards("h"); - for (var i of cards) { - var suit = get.suit(i, player); - if (!lib.suit.includes(suit)) continue; - list.add(suit); - } - if (player.storage["dddlanghuai"]) { - list = list.removeArray(lib.suit); - } - return ( - (list.length == 2 && !player.storage["dddlanghuai"]) || - list.length > 2 - ); - })() - ); - "step 1"; - if (result.bool) { - player.logSkill("dddlanghuai"); - delete player.storage["dddxuanlun_del"]; - if (player.countCards("h")) player.showHandcards(); - } else event.finish(); - "step 2"; - var list = [], - cards = player.getCards("h"); - for (var i of cards) { - var suit = get.suit(i, player); - if (!lib.suit.includes(suit)) continue; - list.add(suit); - } - if (player.storage["dddlanghuai"]) { - list = lib.suit.slice().removeArray(list); - } - player.changeZhuanhuanji("dddlanghuai"); - trigger.changeToZero(); - if (list.length) player.draw(list.length); - }, - mark: true, - intro: { - content(storage, player) { - return ( - "摸牌阶段,你可展示手牌(无牌则不展示),并改为摸其中" + - (!storage ? "包含" : "缺少") + - "花色数的牌。" - ); - }, - }, - marktext: "☯", - }, - dddxuanlun: { - audio: 2, - trigger: { player: "damageEnd" }, - content() { - player.draw(4); - player.addTempSkill("dddxuanlun_choose"); - }, - ai: { - maixie: true, - maixie_hp: true, - result: { - effect(card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - var num = 1; - if (get.attitude(player, target) > 0) { - if (player.needsToDiscard()) num = 0.7; - else num = 0.5; - } - if (target.hp >= 4) return [1, num * 2.5]; - if (target.hp == 3) return [1, num * 1.5]; - if (target.hp == 2) return [1, num * 0.5]; - } - }, - }, - threaten: 0.6, - }, - subSkill: { - choose: { - trigger: { global: "phaseEnd" }, - forced: true, - charlotte: true, - filter(event, player) { - if (player.hasMark("dddxuanlun_del") && !player.countCards("h")) return false; - return true; - }, - content() { - "step 0"; - var choices = []; - var choiceList = [ - "将四张牌以任意顺序置于牌堆顶或底", - "删去此项和〖朗怀〗中的“可”,直到你发动〖朗怀〗", - ]; - if (player.countCards("he") >= 4 || player.hasMark("dddxuanlun_del")) - choices.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if (!player.hasMark("dddxuanlun_del")) choices.push("选项二"); - else - choiceList[1] = - '' + - choiceList[1] + - ""; - if (choices.length == 1 && choices[0] == "选项一") - event._result = { control: "选项一" }; - else - player - .chooseControl(choices) - .set("choiceList", choiceList) - .set("ai", () => { - if (!_status.event.controls.includes("选项一")) return 1; - if (!_status.event.controls.includes("选项二")) return 0; - var player = _status.event.player; - var num = 0; - for (var card of player.getCards("he")) { - if (get.value(card, player) <= 5) num++; - if (num >= 4) break; - } - return num >= 4 ? 0 : 1; - }); - "step 1"; - game.log(player, "选择了", "#y" + result.control); - if (result.control == "选项一") { - var cards = player.getCards("he"); - if (cards.length <= 4) - event._result = { - bool: true, - cards: cards, - }; - else player.chooseCard("玄论:将四张牌置于牌堆顶或牌堆底", "he", true, 4); - } else { - player.addMark("dddxuanlun_del", 1, false); - event.finish(); - } - "step 2"; - if (result.bool) { - var cards = result.cards; - event.cards = cards; - player - .chooseToMove() - .set("list", [["牌堆顶", cards], ["牌堆底"]]) - .set("prompt", "玄论:将这些牌置于牌堆顶或牌堆底") - .set("processAI", function (list) { - var cards = list[0][1], - player = _status.event.player; - var target = _status.currentPhase.next; - var att = get.sgn(get.attitude(player, target)); - var top = []; - var judges = target.getCards("j"); - var stopped = false; - if (player != target || !target.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)) * att; - }); - if (judge(cards[0]) * att < 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)) * att; - }); - while (cards.length) { - if (get.value(cards[0], player) <= 5 == att > 0) break; - top.unshift(cards.shift()); - } - } - bottom = cards; - return [top, bottom]; - }); - } else event.finish(); - "step 3"; - if (result.bool) { - var top = result.moved[0]; - var bottom = result.moved[1]; - top.reverse(); - player.popup( - get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下" - ); - var cards = top.addArray(bottom); - player.$throw(cards.length, 1000); - player.lose(cards, ui.cardPile).set("top", top).insert_index = function ( - event, - card - ) { - if (event.top.includes(card)) return ui.cardPile.firstChild; - return null; - }; - } - }, - }, - }, - }, - //张闿 - dddjiexing: { - audio: 2, - trigger: { - global: ["recoverBegin", "useCard"], - }, - filter(event, player) { - if (event.player == player) return false; - if (event.name == "recover") return player.isDamaged(); - return ( - get.type(event.card, false) == "equip" && - event.cards.some((i) => get.position(i, true) == "o" && player.canEquip(i, true)) - ); - }, - limited: true, - skillAnimation: true, - animationColor: "legend", - logTarget: "player", - check(event, player) { - if (get.attitude(player, event.player) >= 0) return false; - if (event.name == "recover") - return ( - get.recoverEffect(event.player, player, player) < - get.recoverEffect(player, player, player) - ); - return ( - get.effect(event.targets[0], event.card, player, player) < - get.effect(player, event.card, player, player) - ); - }, - content() { - player.awakenSkill("dddjiexing"); - player.addSkill("dddjiexing_reset"); - if (trigger.name == "recover") { - trigger.cancel(); - player.recover(trigger.num); - } else { - trigger.all_excluded = true; - trigger.targets.length = 0; - var cards = trigger.cards.filterInD(); - for (var i of cards) { - if (player.canEquip(i, true)) player.equip(i); - } - } - }, - subSkill: { - reset: { - audio: "dddjiexing", - trigger: { player: ["recoverAfter", "useCardAfter"] }, - filter(event, player) { - if (event.getParent().name == "dddjiexing") return false; - if (event.name == "useCard") return get.type(event.card, false) == "equip"; - return true; - }, - forced: true, - charlotte: true, - content() { - player.restoreSkill("dddjiexing"); - player.removeSkill("dddjiexing_reset"); - }, - }, - }, - }, - dddbailei: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - return ( - game.hasPlayer( - (current) => current.isMaxEquip(true) && current.countGainableCards(player, "he") - ) || game.hasPlayer((current) => current.getHp() == 1) - ); - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("dddbailei"), (card, player, target) => { - return ( - (target.isMaxEquip(true) && target.countGainableCards(player, "he")) || - target.getHp() == 1 - ); - }) - .set("ai", (target) => { - var att = get.attitude(_status.event.player, target); - if (att >= 3) return false; - if (target.hp == 1) return 100; - return 1; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("dddbailei", target); - if (target.isMaxEquip(true) && target.hp == 1) { - if (target.countGainableCards(player, "he")) { - player.gainPlayerCard( - "拜泪:获得" + - get.translation(target) + - "一张牌,或点击“取消”对其造成1点伤害", - "he", - target - ); - } else event._result = { bool: false }; - } else if (target.isMaxEquip(true)) - player.gainPlayerCard( - "拜泪:获得" + get.translation(target) + "一张牌", - "he", - target, - true - ); - else { - event._result = { bool: false }; - } - } else event.finish(); - "step 2"; - if (!result.bool) { - player.line(target); - // player.trySkillAnimate('dddbailei_animate','dddbailei_animate',player.checkShow('dddbailei')); - target.damage(); - game.delayx(); - } else event.finish(); - "step 3"; - if (target.isIn()) { - event.finish(); - return; - } - player.removeSkills("dddbailei"); - }, - subSkill: { - animate: { - skillAnimation: true, - animationColor: "fire", - }, - }, - }, - }, - dynamicTranslate: { - dddxiaheng(player) { - return ( - "锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。" + - (player.storage["dddxiaheng_del"] - ? "" - : "“若两名角色:均不为你,你失去一点体力上限;为同一名角色,你失去一点体力;然后若以此法对包括你在内三名不同的角色造成伤害,删除双引号里的描述内容”") - ); - }, - dddshichao(player) { - return ( - "锁定技,准备阶段,你选择一名手牌数为全场第(" + - (1 + player.countMark("dddshichao")) + - ")大的角色,将手牌数调整至与其相等且至多等于主公的体力上限;其于你的下回合开始前对你造成伤害时,其可防止之,然后令()内的数字+1。" - ); - }, - dddlanghuai(player) { - return ( - "转换技,摸牌阶段,你" + - (player.hasMark("dddxuanlun_del") ? "" : "可") + - "展示手牌(无牌则不展示),并改为摸其中:" + - (player.storage["dddlanghuai"] ? '阴:包含花色数的牌;阳:缺少花色数的牌。' : '阴:包含花色数的牌;阳:缺少花色数的牌。') - ); - }, - dddxuanlun(player) { - var deleted = player.hasMark("dddxuanlun_del"); - return ( - "你受到伤害后,你可摸四张牌;你发动此技能的回合结束时," + - (deleted ? "你" : "须选择一项:") + - "将四张牌以任意顺序置于牌堆顶或底" + - (deleted ? "。" : ";或删去此项和“朗怀”中的“可”,直到你发动“朗怀”。") - ); - }, - ddddiedang(player) { - if (player.storage.ddddiedang) - return "出牌阶段限一次,你可以弃置三张牌,然后摸一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“弃置”和“摸”。"; - return "出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃置”。"; - }, - dddyeshen(player) { - return ( - "一名角色的结束阶段,你可以亮出牌堆底" + - get.cnNumber(3 - player.countMark("dddyeshen")) + - "张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。" - ); - }, - }, - translate: { - ddd_handang: "韩当", - dddxianxi: "险袭", - dddxianxi_info: - "出牌阶段,你使用【杀】时可无视距离额外指定任意名角色为目标;此【杀】结算后,若额外指定的目标中有未受到此【杀】伤害的,你须选择一项:弃置X张牌对其各造成1点伤害;或摸X张牌并失去1点体力(X为未受到此【杀】伤害的目标数)。", - ddd_wuzhi: "吴质", - dddlingyong: "灵涌", - dddlingyong_info: - "一名角色跳过其的阶段时,你可进行判定。若结果不为【杀】,则你可以使用判定牌,然后重复此流程。", - dddxuxiao: "虚孝", - dddxuxiao_info: - "当有黑色基本牌因弃置而进入弃牌堆后,你可将其当做【兵粮寸断】置于一名角色的判定区,然后其摸两张牌。", - ddd_xujing: "许靖", - dddxuyu: "虚誉", - dddxuyu_info: - "当你使用牌结算结束后,你可以摸一张牌。若如此做,当你于本回合使用下一张牌结算结束后,你弃置一张牌。", - dddshijian: "实荐", - dddshijian_info: - "其他角色于其出牌阶段使用的第二张牌结算结束后,你可以交给其一张牌。若如此做,其本回合使用的下一张牌指定第一个目标时,你选择一项:1.令此牌额外结算一次;2.你摸一张牌。", - ddd_caomao: "曹髦", - dddtaisi: "太思", - dddtaisi_info: - "一名角色的回合结束时,若你的体力值于本回合内发生过变化,则你可以令一名角色获得一张于本回合内进入弃牌堆的牌。然后若该角色于本回合内对你造成过伤害,则你摸两张牌。", - dddquche: "驱车", - dddquche_info: - "限定技。出牌阶段,你可依次执行大括号内的流程至多X次(X为你的体力上限):{[⒈将一张牌交给一名其他角色]+[将一张黑色牌当做【杀】使用(不计入次数限制)]}。你每执行一个中括号内的选项,本回合内至其他角色的距离便-1。", - dddqianlong: "潜龙", - dddqianlong_info: - "主公技,锁定技。当你因执行奖惩而摸牌或弃置牌时,取消之;当你杀死一名角色后,你摸三张牌。", - ddd_xinxianying: "辛宪英", - ddddongcha: "洞察", - ddddongcha_info: - "其他角色的回合开始时,你可以令你和其依次将一张手牌置于你的武将牌上,称为“鉴”。若如此做,本回合结束时,你与其依次选择获得一张“鉴”。", - dddzhijie: "智解", - dddzhijie_info: - "你可以将两张颜色相同的“鉴”当做【闪】使用,或将两张颜色不同的“鉴”当做【无懈可击】使用;然后你摸两张牌。", - ddd_xianglang: "向朗", - dddqiahua: "恰化", - dddqiahua_info: - "其他角色的回合开始时,你可明置X张手牌(X为其体力值),然后其于本回合内获得〖恂恂〗。", - dddfusi: "腹笥", - dddfusi_info: - "锁定技。①你的明置手牌不计入手牌上限。②其他角色需要使用牌时,可以改为使用你的明置手牌(需经过你的确认)。③你的回合内,若你的手牌均为明置手牌,则其他角色不能使用各自的手牌。", - dddfusi_global: "腹笥", - dddtuoji: "拓籍", - dddtuoji_info: "其他角色因〖腹笥〗而使用你的牌后,若你的手牌均为明置手牌,则你可以摸三张牌。", - visible_dddxianglang: "明", - ddd_yujin: "于禁", - dddzhengjun: "整军", - dddzhengjun_info: - "出牌阶段内每项各限一次。当有角色的手牌数/体力值/装备区内牌数变化后,若其的对应数值与你相同,则你可以执行对应的选项。体力值:你令其回复或失去1点体力;手牌数:你令其摸或弃置一张牌;装备区内牌数:你移动其的一张装备牌。", - ddd_liuye: "刘晔", - dddchashi: "察势", - dddchashi_info: - "其他角色的出牌阶段开始时,你可弃置一张牌A。当其于本阶段内使用下一张牌结算结束后,若此牌与A花色或类型相同,你与其各摸一张牌。", - dddqice: "齐策", - dddqice_info: "准备阶段开始时,你可以摸两张牌,然后你的〖齐策〗失效直到你使用锦囊牌。", - ddd_baosanniang: "鲍三娘", - dddzhilian: "枝连", - dddzhilian_info: - "一名角色的回合结束时,若本回合仅有你与另一名男性角色使用或打出过牌,则你可以令你与其各摸一张牌或各弃置一张牌,然后你获得本回合内进入弃牌堆的所有【杀】。", - dddjijian: "赍剑", - dddjijian_info: - "出牌阶段限一次。你可以展示一张【杀】并交给一名其他男性角色,然后其展示至多两张颜色相同的【杀】或普通锦囊牌,你与其依次视为使用一张其展示的牌(不能重复使用同一张展示牌)。", - ddd_zhenji: "甄姬", - dddmiaoxing: "淼形", - dddmiaoxing_info: - "锁定技。①分发起始手牌时,你额外获得两份起始手牌,然后将其中的两份移出游戏,称为“水相”。②摸牌阶段结束后,你须将至少一份“水相”调整至与你的手牌数相等。", - dddfushi: "浮世", - dddfushi_info: - "每回合限一次。当你使用或打出基本牌结算结束后,你可以用所有手牌交换一份“水相”,然后你可令一名男性角色选择是否用其所有手牌交换一份“水相”。", - ddd_zhaoang: "赵昂", - dddfenji: "奋计", - dddfenji_info: - "摸牌/弃牌阶段开始时,你可视为使用一张未以此法使用过的普通锦囊牌,然后将此阶段摸牌/弃牌数改为此牌造成的伤害值/此牌的目标数。", - ddd_zhouchu: "周处", - dddxiaheng: "侠横", - dddxiaheng_info: - "锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。“若这两名角色:均不为你,你减1点体力上限;为同一名角色,你失去〖侠横〗;然后若你以此法对三名不同的角色造成过伤害,删除该技能双引号里的描述。”", - ddd_liuba: "刘巴", - dddfengzheng: "丰政", - dddfengzheng_info: - "①每名角色的出牌阶段限一次。其可将点数之和为13的任意张手牌当一张【无中生有】使用。②一轮游戏开始时,你可观看并分配牌堆顶的X张牌(X为上一轮发动过〖丰政〗的角色数),若有角色以此法得到的牌数多于两张,你失去〖丰政〗。", - dddyulv: "玉律", - dddyulv_info: - "锁定技。①游戏开始时,你摸一张牌。将一张手牌置于武将牌上,称为“玉律”。②当有与“玉律”牌点数相同的牌进入弃牌堆后,你令当前回合角色摸一张牌或弃置一张牌。然后若本次为此回合使用的第二次〖玉律②〗,你用一张手牌交换“玉律”牌(若你没有手牌则先摸一张牌)。", - ddd_jianshuo: "蹇硕", - dddfenye: "分野", - dddfenye_info: - "出牌阶段限一次。你可与一名其他角色拼点,其余角色于此次拼点中可加入其中一方并扣置一张手牌作为其拼点牌,本次拼点判断胜负的条件改为比较双方点数均值。然后拼点胜方角色依次可视为对一名不同的拼点败方角色使用【杀】。", - dddshichao: "逝潮", - dddshichao_info: - "锁定技。准备阶段,你选择一名手牌数为全场第(1)大的角色,将手牌数调整至与其相等且至多等于主公的体力上限。然后当其于你的下回合开始前对你造成伤害时,其可防止之,令你〖逝潮〗的()内的数字+1。", - ddd_guanning: "管宁", - dddyouxue: "游学", - dddyouxue_info: - "锁定技。一轮游戏开始时,你将场上的“游学”标记交给一名其他角色(若场上没有“游学”,你获得“游学”),然后摸X张牌(X为本次失去“游学”的角色至获得“游学”的角色的距离)。", - dddchengjing: "承经", - dddchengjing_info: - "①一名角色的回合结束时,若其有“游学”,你将其于此回合内使用的最后一张{非转化且对应的实体牌数为1且均位于弃牌堆中}的基本牌或普通锦囊牌对应的所有实体牌置于武将牌上,称为“经”(若你此前有“经”,你先将这些“经”置入弃牌堆)。②出牌阶段限一次,你可以将一张牌当“经”使用,然后可以将该牌交给有“游学”的角色的下家。", - ddd_dingfeng: "丁奉", - dddduanbing: "短兵", - dddduanbing_info: - "①出牌阶段,你可将一张黑色非锦囊牌当一张【兵粮寸断】置入自己的判定区,摸两张牌,然后视为使用一张无视距离限制的【杀】。②当你使用【杀】对目标角色造成伤害后,若你判定区里有【兵粮寸断】,你可将【兵粮寸断】移至目标角色的判定区。", - ddd_kebineng: "轲比能", - dddxiaoxing: "枭行", - dddxiaoxing_info: - "锁定技。①你的初始手牌,攻击范围和手牌上限+3。②当你进入濒死状态时,你失去〖枭行〗。③当你获得〖枭行〗后,你摸三张牌。", - dddlangzhi: "狼志", - dddlangzhi_info: - "结束阶段,你可展示你攻击范围内的所有角色各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。", - dddfuyi: "附义", - dddfuyi_both: "〖枭行〗和〖狼志〗", - dddfuyi_info: - "主公技,锁定技。①群势力角色使用【杀】的次数上限+1。②当一名群势力角色杀死角色后,其可以弃置两张牌,令你获得你武将牌上的一个技能。", - ddd_caoshuang: "曹爽", - ddd_xuelingyun: "薛灵芸", - ddd_liuhong: "刘宏", - ddd_xiahouxuan: "夏侯玄", - ddd_zhangkai: "张闿", - dddzhuanshe: "专摄", - dddzhuanshe_info: - "其他角色的出牌阶段开始时,你可将一张手牌正面朝上交给该角色,则当其在此回合内使用与之名称相同的基本牌或普通锦囊牌时,你可无视距离限制为之额外选择一个目标;此回合结束时,若其未使用与之名称相同的牌,你可以对其造成1点伤害。", - dddweiqiu: "危秋", - dddweiqiu_info: "锁定技。一名角色回复体力前,若你没有手牌,改为令你摸一张牌。", - dddlianer: "涟洏", - dddlianer_info: - "当你使用红色牌结算后,你可以获得之,然后你只能使用点数小于此牌的牌直到回合结束。", - dddanzhi: "暗织", - dddanzhi_info: - "一名角色的回合开始时,若上一张被使用或打出的牌为黑色,你可以指定一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效。", - dddshixing: "失兴", - dddshixing_info: - "锁定技。若有未受伤的女性角色,你视为拥有〖享乐〗;若当前回合没有锦囊牌被使用,你视为拥有〖酒诗〗;若你没有上述技能,你视为拥有〖制衡〗。", - ddddanggu: "党锢", - ddddanggu_info: - "锁定技。①结束阶段,你横置任意名角色的武将牌,直到场上已横置的角色数不少于X(X为群势力角色数)。②其他角色的弃牌阶段,若其处于连环状态,其装备区里的牌视为手牌。", - dddfuzong: "覆宗", - dddfuzong_info: - "主公技,锁定技。①游戏开始时,你摸等同于场上群势力角色数的牌。②一名群势力角色死亡时,其弃置你的一张牌。", - dddlanghuai: "朗怀", - dddlanghuai_info: - "转换技。摸牌阶段,你可展示手牌(无牌则不展示),并改为摸其中:阴,包含花色数的牌;阳,缺少花色数的牌。", - dddxuanlun: "玄论", - dddxuanlun_info: - "当你受到伤害后,你可摸四张牌,然后该回合结束时,你选择一项:1.将四张牌以任意顺序置于牌堆顶或底;2.删去此项和〖郎怀〗中的“可”直到你发动〖郎怀〗。", - dddjiexing: "劫行", - dddjiexing_info: - "限定技。其他角色回复体力时,你可改为你回复等量体力;其他角色使用装备牌时,你可改为将此牌置入你的装备区。当你不以此法回复体力后或使用装备牌后,重置此技能。", - dddbailei: "拜泪", - dddbailei_info: - "准备阶段,你可以选择一项:1.获得装备区牌数唯一最多的角色的一张牌;2.对一名体力值为1的角色造成1点伤害,若其因此死亡,你失去此技能。", - ddd_liangxi: "梁习", - dddtongyu: "仝御", - dddtongyu_info: - "出牌阶段限一次,你可以将任意张花色不同的牌当做【五谷丰登】使用,且你为此牌选择结算方向,此牌的亮出牌数+X(X为此牌对应的实体牌数量)。此牌的所有目标角色在被指定目标后选择一项:⒈本回合不能再使用或打出手牌。⒉令此【五谷丰登】对其无效。此【五谷丰登】的多余展示牌置入弃牌堆前,你可以令一名选择了选项二的角色获得这些牌。", - ddd_wangkanglvkai: "王伉吕凯", - dddbingjian: "并肩", - dddbingjian_info: - "每回合限两次。你可以将手牌数调整至2(至少调整一张),视为使用或打出一张【杀】或【闪】。若你:因此摸牌,则你可以令一名其他角色摸等量的牌;因此弃牌,则你可以弃置一名其他角色等量的牌。", - ddd_sunliang: "孙亮", - ddddiedang: "迭宕", - ddddiedang_info: - "出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃”。", - dddanliu: "暗流", - dddanliu_info: - "结束阶段,你可以与一名其他角色依次观看并选择对方的一张手牌,然后交换这两张牌。若这两张牌颜色相同,则你可以逾期交换这两张牌,且:若此牌为红色,则你回复1点体力;若此牌为黑色,则其摸两张牌。", - dddguiying: "归萤", - dddguiying_info: - "主公技。准备阶段,其他吴势力角色可依次展示其一张手牌,然后将其点数最大的一张牌交给你,然后其可以获得场上点数最小的一张牌。", - ddd_qianzhao: "牵招", - dddyuanzhen: "远振", - dddyuanzhen_info: - "锁定技。当你使用牌指定其他角色为唯一目标后,若你至其距离不为1,你令其选择一项:1.弃置一张牌;2.令你摸一张牌。", - dddzhishu: "制戍", - dddzhishu_info: - "出牌阶段开始时,你可以移动场上的一张装备牌,然后以此法失去牌的角色视为对以此法装备区被置入牌的角色使用一张【过河拆桥】。", - ddd_zhangmiao: "张邈", - dddxiaxing: "侠行", - dddxiaxing_info: - "①每轮限一次。一名角色处于濒死状态时/回合开始时,你可以将一张牌置于牌堆顶,视为其使用一张【桃】/【酒】。若你没有“侠”标记,你获得“侠”。②你可以移去“侠”,视为使用一张【杀】或【闪】。", - ddd_zhangcheng: "张承", - dddjuxian: "聚贤", - dddjuxian_info: - "出牌阶段每项各限一次。你可以展示一张牌,然后:1.将其置于牌堆顶,然后获得其他角色的一张牌并展示之;2.将此牌交给一名其他角色,然后摸一张牌并展示之。若你以此法展示的两张牌颜色不同,此技能本回合失效。", - dddjungui: "隽轨", - dddjungui_info: - "结束阶段,你可以令一名角色摸两张牌,然后其展示所有手牌,你选择一个不大于X的值。若Y大于0,你令其弃置Y张花色各不同的手牌(X为你于本回合使用过的牌的花色数,Y为其手牌中包含的花色数-X)。", - ddd_liuchong: "刘宠", - dddjinggou: "精彀", - dddjinggou_info: - "锁定技。当你使用武器牌结算结束后,若你的攻击范围为全场最大,你对一名其他角色造成1点伤害。", - dddmoyan: "末焱", - dddmoyan_info: - "一轮游戏开始时,你可以亮出牌堆顶三张牌,令一名角色选择获得其中至少一张牌,然后当你于本轮受到伤害时,若其手牌数不大于X,此伤害+1(X为其本次获得的牌数)。", - ddd_luoxian: "罗宪", - dddshilie: "示烈", - visible_dddshilie: "明", - dddshilie_info: - "每回合限一次。当你需要使用一张【杀】或【闪】时,你可以明置任意点数之和不小于X的手牌,视为你使用之。若本次明置的牌点数等于X,你摸等同于本次明置的牌数的牌(X为你与当前回合角色的体力值之和)。", - ddd_lie: "李娥", - dddyeshen: "冶身", - dddyeshen_info: - "一名角色的结束阶段,你可以亮出牌堆底三张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。", - dddqiaoduan: "巧锻", - dddqiaoduan_info: - "每回合限一次。当有角色:重置后,你可以令至多X名角色各摸一张牌;横置后,你可以将X张牌置于牌堆底,并令一名角色回复1点体力(X为横置角色数)。", - }, - }; -}); diff --git a/character/ddd/card.js b/character/ddd/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/ddd/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/ddd/character.js b/character/ddd/character.js new file mode 100644 index 000000000..8499fa79d --- /dev/null +++ b/character/ddd/character.js @@ -0,0 +1,35 @@ +const characters = { + ddd_handang: ["male", "wu", 4, ["dddxianxi"]], + // ddd_wuzhi:["male","wei",3,["dddlingyong","dddxuxiao"]], + ddd_xujing: ["male", "shu", 3, ["dddxuyu", "dddshijian"]], + // ddd_caomao:["male","wei",3,["dddtaisi","dddquche","dddqianlong"],["zhu"]], + // ddd_xinxianying:["female","wei",3,["ddddongcha","dddzhijie"]], + ddd_xianglang: ["male", "shu", 3, ["dddqiahua", "dddfusi", "dddtuoji"]], + ddd_yujin: ["male", "wei", 4, ["dddzhengjun"]], + ddd_liuye: ["male", "wei", 3, ["dddchashi", "dddqice"]], + ddd_baosanniang: ["female", "shu", 3, ["dddzhilian", "dddjijian"]], + // ddd_zhenji:['female','wei',3,['dddmiaoxing','dddfushi']], + ddd_zhaoang: ["male", "wei", 4, ["dddfenji"]], + ddd_zhouchu: ["male", "wu", 5, ["dddxiaheng"]], + ddd_liuba: ["male", "shu", 3, ["dddfengzheng", "dddyulv"]], + ddd_jianshuo: ["male", "qun", 4, ["dddfenye", "dddshichao"]], + ddd_guanning: ["male", "qun", 3, ["dddyouxue", "dddchengjing"]], + ddd_dingfeng: ["male", "wu", 4, ["dddduanbing"]], + ddd_caoshuang: ["male", "wei", 5, ["dddzhuanshe", "dddweiqiu"]], + ddd_xuelingyun: ["female", "wei", 3, ["dddlianer", "dddanzhi"]], + ddd_liuhong: ["male", "qun", 4, ["dddshixing", "ddddanggu", "dddfuzong"], ["zhu"]], + ddd_xiahouxuan: ["male", "wei", 3, ["dddlanghuai", "dddxuanlun"]], + ddd_zhangkai: ["male", "qun", "3/4", ["dddjiexing", "dddbailei"]], + ddd_liangxi: ["male", "wei", 4, ["dddtongyu"]], + ddd_wangkanglvkai: ["male", "shu", 4, ["dddbingjian"]], + // ddd_sunliang:['male','wu',3,['ddddiedang','dddanliu','dddguiying'],['zhu']], + ddd_lie: ["female", "wu", 3, ["dddyeshen", "dddqiaoduan"]], + ddd_kebineng: ["male", "qun", 4, ["dddxiaoxing", "dddlangzhi", "dddfuyi"], ["zhu"]], + ddd_qianzhao: ["male", "wei", 4, ["dddyuanzhen", "dddzhishu"]], + ddd_zhangmiao: ["male", "qun", 4, ["dddxiaxing"]], + ddd_zhangcheng: ["male", "wu", 3, ["dddjuxian", "dddjungui"]], + ddd_liuchong: ["male", "qun", 4, ["dddjinggou", "dddmoyan"]], + ddd_luoxian: ["male", "shu", 4, ["dddshilie"]], +}; + +export default characters; diff --git a/character/ddd/characterFilter.js b/character/ddd/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/ddd/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/ddd/characterReplace.js b/character/ddd/characterReplace.js new file mode 100644 index 000000000..2092d9297 --- /dev/null +++ b/character/ddd/characterReplace.js @@ -0,0 +1,3 @@ +const characterReplaces = {}; + +export default characterReplaces; diff --git a/character/ddd/dynamicTranslate.js b/character/ddd/dynamicTranslate.js new file mode 100644 index 000000000..6af699f35 --- /dev/null +++ b/character/ddd/dynamicTranslate.js @@ -0,0 +1,25 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + dddxiaheng(player) { + return "锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。" + (player.storage["dddxiaheng_del"] ? "" : "“若两名角色:均不为你,你失去一点体力上限;为同一名角色,你失去一点体力;然后若以此法对包括你在内三名不同的角色造成伤害,删除双引号里的描述内容”"); + }, + dddshichao(player) { + return "锁定技,准备阶段,你选择一名手牌数为全场第(" + (1 + player.countMark("dddshichao")) + ")大的角色,将手牌数调整至与其相等且至多等于主公的体力上限;其于你的下回合开始前对你造成伤害时,其可防止之,然后令()内的数字+1。"; + }, + dddlanghuai(player) { + return "转换技,摸牌阶段,你" + (player.hasMark("dddxuanlun_del") ? "" : "可") + "展示手牌(无牌则不展示),并改为摸其中:" + (player.storage["dddlanghuai"] ? '阴:包含花色数的牌;阳:缺少花色数的牌。' : '阴:包含花色数的牌;阳:缺少花色数的牌。'); + }, + dddxuanlun(player) { + var deleted = player.hasMark("dddxuanlun_del"); + return "你受到伤害后,你可摸四张牌;你发动此技能的回合结束时," + (deleted ? "你" : "须选择一项:") + "将四张牌以任意顺序置于牌堆顶或底" + (deleted ? "。" : ";或删去此项和“朗怀”中的“可”,直到你发动“朗怀”。"); + }, + ddddiedang(player) { + if (player.storage.ddddiedang) return "出牌阶段限一次,你可以弃置三张牌,然后摸一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“弃置”和“摸”。"; + return "出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃置”。"; + }, + dddyeshen(player) { + return "一名角色的结束阶段,你可以亮出牌堆底" + get.cnNumber(3 - player.countMark("dddyeshen")) + "张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。"; + }, +}; +export default dynamicTranslates; diff --git a/character/ddd/index.js b/character/ddd/index.js new file mode 100644 index 000000000..16bf6a3a7 --- /dev/null +++ b/character/ddd/index.js @@ -0,0 +1,59 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "ddd", + connect: true, + character: { ...characters }, + characterSort: { + ddd: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: { + ddd_handang: "#g晓ャ绝对", + ddd_wuzhi: "#g沸治·克里夫", + ddd_xujing: "#g沸治·克里夫", + ddd_caomao: "#gRocxu", + ddd_xinxianying: "#g好孩子系我", + ddd_xianglang: "#g会乱武的袁绍", + ddd_liuye: "#g好孩子系我", + ddd_baosanniang: "#g会乱武的袁绍", + ddd_wangkanglvkai: "#g扬林", + ddd_yujin: "#g虎鲸", + ddd_caoshuang: "#g辰木", + ddd_zhenji: "#g巴德", + ddd_zhaoang: "#g君腾天下", + ddd_xuelingyun: "#gGENTOVA07", + ddd_liuhong: "#g拉普拉斯", + ddd_xiahouxuan: "#g好孩子系我", + ddd_zhouchu: "#g志文", + ddd_kebineng: "#g晨星", + ddd_zhangkai: "#g拼音", + ddd_liuba: "#g浅水", + ddd_jianshuo: "#g浅水", + ddd_guanning: "#g虎鲸", + ddd_lie: "#gyyuaN", + ddd_liangxi: "#g先負", + // ddd_liuchong:'#g', + ddd_luoxian: "#g绝代倾国倾城貌", + }, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/ddd/intro.js b/character/ddd/intro.js new file mode 100644 index 000000000..82d64b020 --- /dev/null +++ b/character/ddd/intro.js @@ -0,0 +1,3 @@ +const characterIntro = {}; + +export default characterIntro; diff --git a/character/ddd/pinyin.js b/character/ddd/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/ddd/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/ddd/skill.js b/character/ddd/skill.js new file mode 100644 index 000000000..e0da3ae21 --- /dev/null +++ b/character/ddd/skill.js @@ -0,0 +1,5688 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //牵招 + dddyuanzhen: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + forced: true, + filter(event, player) { + return event.target != player && get.distance(player, event.target) != 1 && event.isFirstTarget && event.targets.length == 1; + }, + logTarget: "target", + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.target; + let result; + game.delayex(); + if (!target.countCards("he")) result = { bool: false }; + else + result = yield target + .chooseToDiscard("he", `${get.translation(player)}对你使用了【远振】`, "请弃置一张牌,或点击“取消”令其摸一张牌") + .set("ai", card => { + if (get.event("goon")) return 4.5 - get.value(card); + }) + .set("goon", get.attitude(target, player) > 0); + if (!result.bool) { + target.line(player); + player.draw(); + } + }, + }, + dddzhishu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return player.canMoveCard(null, true); + }, + check(event, player) { + return player.canMoveCard(true, true); + }, + *content(event, map) { + const player = map.player; + let result = yield player.moveCard(); + const targets = result.targets; + const guohe = new lib.element.VCard({ + name: "guohe", + isCard: true, + }); + if (targets[0].canUse(guohe, targets[1])) targets[0].useCard(guohe, targets[1], "noai"); + }, + }, + //张邈 + dddxiaxing: { + audio: 2, + enable: "chooseToUse", + hiddenCard(player, name) { + if (player.hasSkill("dddxiaxing_used")) return false; + return name == "tao"; + }, + filter(event, player) { + if (event.type != "dying") return false; + if (!player.countCards("he")) return false; + const evt = get.event().getParent("_save"); + if (!evt || !evt.dying || !evt.dying.isIn()) return false; + return !player.hasSkill("dddxiaxing_used"); + }, + check: card => { + return 7 - get.value(card); + }, + filterCard: true, + position: "he", + discard: false, + delay: false, + lose: false, + group: ["dddxiaxing_begin", "dddxiaxing_viewas"], + prompt() { + const evt = get.event().getParent("_save"); + return `将一张牌置于牌堆顶,视为${get.translation(evt.dying)}使用一张【桃】`; + }, + *content(event, map) { + const player = map.player, + cards = event.cards; + player.addTempSkill("dddxiaxing_used", "roundStart"); + game.log(player, "将一张牌置于了牌堆顶"); + player.$throw(cards.length, 1000); + yield player.lose(cards, ui.cardPile, "insert"); + const evt = event.getParent("_save"); + yield evt.dying.chooseUseTarget("tao", true); + if (!player.hasMark("dddxiaxing")) player.addMark("dddxiaxing"); + }, + marktext: "侠", + intro: { + markcount: () => 0, + name: "侠行", + name2: "侠", + content: "已拥有“侠”标记", + }, + ai: { + order: 4, + result: { + player(player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { + begin: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + filter(event, player) { + if (!player.countCards("he")) return false; + return !player.hasSkill("dddxiaxing_used"); + }, + direct: true, + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + let result = yield player + .chooseCard(get.prompt("dddxiaxing"), `将一张牌置于牌堆顶,视为${get.translation(target)}使用一张【酒】`, "he") + .set("ai", card => { + if (get.event("goon")) return 5 - get.value(card); + return 0; + }) + .set("goon", get.effect(target, { name: "jiu" }, player, player) > 0); + if (!result.bool) return event.finish(); + const cards = result.cards; + player.logSkill("dddxiaxing_begin", target); + player.addTempSkill("dddxiaxing_used", "roundStart"); + game.log(player, "将一张牌置于了牌堆顶"); + player.$throw(cards.length, 1000); + yield player.lose(cards, ui.cardPile, "insert"); + yield target.chooseUseTarget("jiu", true); + if (!player.hasMark("dddxiaxing")) player.addMark("dddxiaxing"); + }, + }, + used: { charlotte: true }, + viewas: { + audio: "dddxiaxing", + enable: "chooseToUse", + filter(event, player) { + if (event.type == "wuxie" || !player.hasMark("dddxiaxing")) return false; + for (const name of ["sha", "shan"]) { + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog(event, player) { + const vcards = []; + for (const name of ["sha", "shan"]) { + const card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); + } + const dialog = ui.create.dialog("侠行", [vcards, "vcard"], "hidden"); + dialog.direct = true; + return dialog; + }, + backup(links, player) { + return { + filterCard: () => false, + selectCard: -1, + viewAs: { + name: links[0][2], + isCard: true, + }, + popname: true, + precontent() { + player.logSkill("dddxiaxing_viewas"); + player.clearMark("dddxiaxing"); + }, + }; + }, + prompt(links, player) { + return "侠行:移去“侠”标记,视为使用一张【" + get.translation(links[0][2]) + "】"; + }, + }, + ai: { + order(item, player) { + const event = get.event(); + if (event.filterCard({ name: "sha" }, player, event)) { + if ( + !player.hasShan() && + !game.hasPlayer(function (current) { + return player.canUse("sha", current) && current.hp == 1 && get.effect(current, { name: "sha" }, player, player) > 0; + }) + ) { + return 0; + } + return 2.95; + } else return 3.15; + }, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (!player.hasMark("dddxiaxing")) return false; + if (arg != "use") return false; + }, + result: { + player: 1, + }, + }, + }, + }, + }, + //张承 + dddjuxian: { + enable: "phaseUse", + usable: 2, + filter(event, player) { + return !player.hasSkill("dddjuxian_ban"); + }, + chooseButton: { + dialog(event, player) { + var dialog = ui.create.dialog("聚贤:请选择一项", "hidden"); + dialog.add([ + [ + ["top", "展示一张牌,然后将此牌置于牌堆顶"], + ["hand", "展示一张牌,然后将此牌交给一名其他角色"], + ], + "textbutton", + ]); + return dialog; + }, + filter(button, player) { + return !player.hasSkill("dddjuxian_" + button.link, null, null, false); + }, + check(button) { + return 1; + }, + backup(links) { + return get.copy(lib.skill["dddjuxian_" + links[0]]); + }, + prompt(links) { + if (links[0] == "top") return "展示一张牌,然后将此牌置于牌堆顶"; + return "展示一张牌,然后将此牌交给一名其他角色"; + }, + }, + ai: { + order: 10, + threaten: 1.7, + result: { player: 1 }, + }, + subSkill: { + backup: { audio: "dddjuxian" }, + ban: { charlotte: true }, + top: { + audio: "dddjuxian", + filterCard: true, + selectCard: 1, + position: "he", + discard: false, + delay: false, + lose: false, + *content(event, map) { + const player = map.player, + cards = event.cards; + player.addTempSkill("dddjuxian_top", "phaseUseAfter"); + player.showCards(cards); + const color1 = get.color(cards); + player.$throw(cards, 1000); + game.log(player, "将", cards, "置于了牌堆顶"); + yield player.lose(cards, ui.cardPile, "insert"); + const targets = game.filterPlayer(target => target.countGainableCards(player, "he")); + let result; + if (!targets.length) return event.finish(); + else if (targets.length == 1) result = { bool: true, targets: targets }; + else + result = yield player + .chooseTarget( + "聚贤:获得一名其他角色的一张牌", + (card, player, target) => { + if (target == player) return false; + return target.countGainableCards(player, "he"); + }, + true + ) + .set("ai", target => { + const player = get.player(); + return get.effect(target, { name: "shunshou" }, player, player); + }); + if (!result.bool) return event.finish(); + const target = result.targets[0]; + player.line(target); + result = yield player.gainPlayerCard(target, "he", true); + if (!result.bool) return event.finish(); + const cards2 = result.links; + const color2 = get.color(cards2); + if (color1 && color2 && color1 != color2) player.addTempSkill("dddjuxian_ban"); + }, + ai: { + result: { + player: 1, + }, + }, + }, + hand: { + audio: "dddjuxian", + filterTarget: lib.filter.notMe, + filterCard: true, + selectCard: 1, + position: "he", + discard: false, + delay: false, + lose: false, + *content(event, map) { + const player = map.player, + cards = event.cards, + target = event.targets[0]; + player.addTempSkill("dddjuxian_hand", "phaseUseAfter"); + player.showCards(cards); + const color1 = get.color(cards); + let result; + yield player.give(cards, target); + result = yield player.draw(); + const cards2 = result.filter(i => get.owner(i) == player && get.position(i) == "h"); + if (!cards.length) return event.finish(); + const color2 = get.color(cards2); + player.showCards(cards2); + if (color1 && color2 && color1 != color2) player.addTempSkill("dddjuxian_ban"); + }, + ai: { + result: { + player: 1, + target: 1, + }, + }, + }, + }, + }, + dddjungui: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + *content(event, map) { + const player = map.player; + let result = yield player.chooseTarget(get.prompt2("dddjungui")); + if (!result.bool) return event.finish(); + const target = result.targets[0]; + player.logSkill("dddjungui", target); + target.draw(2); + yield target.showHandcards(); + const targetSuitsCount = target + .getCards("h") + .map(card => { + return get.suit(card); + }) + .toUniqued().length; + const usedCount = player + .getHistory("useCard") + .map(evt => { + return get.suit(evt.card); + }) + .toUniqued().length; + let decreasedCount = 0; + if (usedCount > 0) { + const numbers = Array.from({ length: usedCount }, (_, i) => get.cnNumber(i + 1, true)); + result = yield player + .chooseControl(numbers, "cancel2") + .set("prompt", `是否令${get.translation(target)}少弃置任意张牌?`) + .set("ai", () => { + return get.event("choice"); + }) + .set("choice", get.attitude(player, target) > 0 ? numbers.lastItem : "cancel2"); + if (result.control != "cancel") { + decreasedCount = result.index + 1; + game.log(player, "选择令", target, "少弃置", get.cnNumber(decreasedCount), "张牌"); + } + } + const toDiscardNum = targetSuitsCount - decreasedCount; + if (toDiscardNum <= 0) return event.finish(); + target + .chooseToDiscard(`隽轨:请弃置${get.cnNumber(toDiscardNum)}张花色不同的手牌`, toDiscardNum, true, (card, player) => { + const suit = get.suit(card); + for (const cardx of ui.selected.cards) { + if (get.suit(cardx) == suit) return false; + } + return true; + }) + .set("complexCard", true); + }, + }, + //刘宠 + dddjinggou: { + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + if (get.type(event.card) != "equip") return false; + if (get.subtype(event.card) != "equip1") return false; + const range = player.getAttackRange(); + return !game.hasPlayer(current => { + return current.getAttackRange() > range; + }); + }, + direct: true, + *content(event, map) { + const player = map.player; + let result = yield player.chooseTarget("精彀:对一名其他角色造成1点伤害", true, lib.filter.notMe).set("ai", target => { + var player = get.player(); + return get.damageEffect(target, player, player); + }); + if (result.bool) { + const target = result.targets[0]; + player.logSkill("dddjinggou", target); + target.damage(); + } + }, + }, + dddmoyan: { + audio: 2, + trigger: { global: "roundStart" }, + *content(event, map) { + const player = map.player; + const cards = game.cardsGotoOrdering(get.cards(3)).cards; + yield player.showCards(cards, `${get.translation(player)}发动了【末焱】`); + let result = yield player.chooseTarget("末焱:选择一名角色获得其中至少一张牌").set("ai", target => get.attitude(get.player(), target)); + if (!result.bool) return event.finish(); + const target = result.targets[0]; + result = yield target.chooseButton(["末焱:获得至少一张牌", cards], true, [1, cards.length]).set("ai", button => { + return get.value(button.link); + }); + if (!result.bool) return event.finish(); + const gains = result.links; + target.gain(gains, "gain2"); + player.setStorage("dddmoyan_target", [target, gains.length]); + player.addTempSkill("dddmoyan_target", "roundStart"); + }, + subSkill: { + target: { + onremove: true, + trigger: { player: "damageBegin3" }, + filter(event, player) { + const info = player.getStorage("dddmoyan_target"); + return info[0] && info[0].isIn() && info[0].countCards("h") <= info[1]; + }, + forced: true, + charlotte: true, + content() { + trigger.increase("num"); + }, + }, + }, + }, + //罗宪 + dddshilie: { + audio: 2, + enable: "chooseToUse", + hiddenCard(player, name) { + if (!player.countCards("h")) return false; + return name == "sha" || name == "shan"; + }, + filter(event, player) { + if (event.type == "wuxie" || !_status.currentPhase) return false; + if (!player.countCards("h") || player.hasSkill("dddshilie_used", null, null, false)) return false; + for (var name of ["sha", "shan"]) { + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog(event, player) { + var vcards = []; + for (var name of ["sha", "shan"]) { + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); + } + const dialog = ui.create.dialog("示烈", [vcards, "vcard"], "hidden"); + dialog.direct = true; + return dialog; + }, + check(button) { + return 1; + }, + backup(links, player) { + return { + filterCard(card) { + return !get.is.shownCard(card); + }, + filterOk: () => { + return ( + ui.selected.cards + .map(card => { + return get.number(card); + }) + .reduce((p, c) => { + return p + c; + }, 0) >= + get.player().getHp() + (_status.currentPhase ? _status.currentPhase.getHp() : 0) + ); + }, + selectCard: [1, Infinity], + viewAs: { + name: links[0][2], + isCard: true, + }, + popname: true, + ignoreMod: true, + ai1(card) { + const need = get.player().getHp() + (_status.currentPhase ? _status.currentPhase.getHp() : 0); + let num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); + } + if (num + get.number(card) == need) return 20 - 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 (cards[i].number + cards[j].number >= need) { + if (cards[i] == card || cards[j] == card) return 15 - get.value(card); + } + } + } + } + return 0.1; + }, + precontent() { + "step 0"; + player.logSkill("dddshilie"); + player.addTempSkill("dddshilie_used"); + var cards = event.result.cards.slice(); + player.addShownCards(cards, "visible_dddshilie"); + delete event.result.skill; + player.showCards(cards, get.translation(player) + "发动了【示烈】"); + if ( + cards + .map(card => { + return get.number(card); + }) + .reduce((p, c) => { + return p + c; + }, 0) == + player.getHp() + (_status.currentPhase ? _status.currentPhase.getHp() : 0) + ) { + player.draw(cards.length); + } + event.result.card = new lib.element.VCard({ + name: event.result.card.name, + isCard: true, + }); + event.result.cards = []; + game.delayx(); + }, + }; + }, + prompt(links, player) { + return `###示烈###明置任意张点数之和不小于${player.getHp() + (_status.currentPhase ? _status.currentPhase.getHp() : 0)}的牌,视为使用【${get.translation(links[0][2])}】`; + }, + }, + subSkill: { used: { charlotte: true } }, + ai: { + order(item, player) { + const evt = get.event(); + for (var name of ["sha", "shan"]) { + if (evt.filterCard({ name: name }, player, evt)) return get.order({ name: name }) + 0.1; + } + return 1; + }, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (!player.countCards("h")) return false; + }, + result: { + player(player) { + return 1; + }, + }, + }, + }, + //李娥 + dddyeshen: { + trigger: { global: "phaseJieshuBegin" }, + logTarget: "player", + prompt2(event, player) { + var num = player.countMark("dddyeshen"); + var str = "亮出牌堆底的" + get.cnNumber(3 - num) + "张牌,然后其将其中的一张牌当作【铁索连环】使用或打出。"; + if (num >= 2) str += "然后你受到1点火属性伤害并重置此技能。"; + return str; + }, + check(event, player) { + if (player.countMark("dddyeshen") >= 2 && get.damageEffect(player, player, player, "fire") < 0) return false; + return get.attitude(player, event.player) > 0; + }, + content() { + "step 0"; + event.target = trigger.player; + var cards = get.bottomCards(3 - player.countMark("dddyeshen")); + event.cards = cards; + game.cardsGotoOrdering(cards); + player.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【冶身】"); + if (!cards.some(card => get.color(card) == "black")) event.goto(4); + "step 1"; + if (target.isIn()) { + var blacks = cards.filter(card => get.color(card) == "black"); + if (blacks.length > 1) target.chooseButton(["选择一张牌当作【铁索连环】使用或重铸", blacks], true).set("ai", button => get.translation(button.link.name).length); + else + event._result = { + bool: true, + links: blacks, + }; + } else event.goto(4); + "step 2"; + if (result.bool) { + event.links = result.links.slice(0); + var card = get.autoViewAs({ name: "tiesuo" }, result.links); + var maxNum = get.translation(result.links[0].name).length; + if (!game.hasPlayer(current => target.canUse(card, current))) { + event._result = { bool: false }; + } else + target + .chooseTarget( + "请选择【铁索连环】的目标,或点“取消”重铸", + function (card, player, target) { + var card = _status.event.card; + return player.canUse(card, target); + }, + [1, Math.min(maxNum, game.countPlayer())] + ) + .set("card", card) + .set("ai", function (target) { + var player = _status.event.player, + card = _status.event.card; + return get.effect_use(target, card, player, player); + }); + } + "step 3"; + if (result.bool && result.targets.length > 0) { + var card = get.autoViewAs({ name: "tiesuo" }, event.links); + target.useCard(result.targets, card, event.links); + } else { + target.recast(event.links, (player, cards) => game.cardsDiscard(cards)); + } + "step 4"; + for (var card of cards) { + if (get.position(card, true) == "o") ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + } + "step 5"; + var num = player.countMark("dddyeshen"); + if (num < 2) { + player.addMark("dddyeshen", 1, false); + game.log(player, "的", "#g【冶身】", "的亮出牌数-1"); + } else { + player.removeMark("dddyeshen", num, false); + game.log(player, "还原了", "#g【冶身】", "的亮出牌数"); + player.damage("fire", "nocard"); + } + }, + }, + dddqiaoduan: { + trigger: { global: "linkAfter" }, + direct: true, + usable: 1, + filter(event, player) { + var num = game.countPlayer(current => current.isLinked()); + if (event.player.isLinked()) { + return player.countCards("he") >= num && game.hasPlayer(current => current.isDamaged()); + } else { + return num > 0; + } + }, + content() { + "step 0"; + if (trigger.player.isLinked()) { + var num = game.countPlayer(current => current.isLinked()); + player.chooseCardTarget({ + prompt: get.prompt("dddqiaoduan"), + prompt2: "操作提示:选择" + get.cnNumber(num) + "张牌和一名已受伤的角色。将这些牌置于牌堆底(先选择的在上),然后该角色回复1点体力。", + filterCard: true, + selectCard: num, + filterTarget: (card, player, target) => target.isDamaged(), + ai1: card => 5 - get.value(card), + ai2: target => { + var player = _status.event.player; + return get.recoverEffect(target, player, player); + }, + }); + } else event.goto(2); + "step 1"; + if (result.bool) { + player.logSkill("dddqiaoduan", result.targets[0]); + player.loseToDiscardpile(result.cards, ui.cardPile); + result.targets[0].recover(); + } else player.storage.counttrigger.dddqiaoduan--; + event.finish(); + "step 2"; + var num = game.countPlayer(current => current.isLinked()); + player.chooseTarget(get.prompt("dddqiaoduan"), [1, num], "令至多" + get.cnNumber(num) + "名角色各摸一张牌").set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + "step 3"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("dddqiaoduan", targets); + game.asyncDraw(targets); + game.delayex(); + } else player.storage.counttrigger.dddqiaoduan--; + }, + }, + //孙亮 + ddddiedang: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + if (player.storage.ddddiedang) return player.countCards("he") >= 3; + return true; + }, + filterCard: true, + position: "he", + selectCard() { + var player = _status.event.player; + return player.storage.ddddiedang ? 3 : 0; + }, + prompt() { + var player = _status.event.player; + if (player.storage.ddddiedang) return "弃置三张牌,然后摸一张牌"; + return "摸三张牌,然后弃置一张牌"; + }, + check: card => 5 - get.value(card), + content() { + "step 0"; + if (player.storage.ddddiedang) { + player.draw(); + } else { + player.draw(3); + player.chooseToDiscard(true, "he"); + } + "step 1"; + if (player.isMaxHandcard() || player.isMinHandcard()) player.storage.ddddiedang = !player.storage.ddddiedang; + }, + ai: { + order: 1, + result: { + player(player) { + if (ui.selected.cards.length) { + var num = 1 + player.countCards("h", card => !ui.selected.cards.includes(card)); + if ( + !game.hasPlayer(current => { + return current != player && current.countCards("h") > num; + }) || + !game.hasPlayer(current => { + return current != player && current.countCards("h") < num; + }) + ) + return 1; + return -1; + } + return 1; + }, + }, + }, + }, + dddanliu: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter(event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); + }, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("dddanliu"), function (card, player, target) { + return target != player && target.countCards("h") > 0; + }) + .set("ai", function (target) { + return get.attitude(get.player(), target) * Math.sqrt(1 + target.countCards("h")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddanliu", target); + event.target = target; + } else event.finish(); + "step 2"; + player + .choosePlayerCard(target, true, "h", "visible", [0, 1]) + .set("filterOk", () => ui.selected.buttons.length > 0) + .set("ai", button => { + var player = get.player(), + target = _status.event.target; + var color = get.color(button.link); + if ( + player.hasCard(function (card) { + return get.color(card) == color; + }, "h") + ) { + if (color == "red") return get.recoverEffect(player, player, player) + 2 / Math.max(2, get.value(button.link)); + if (color == "black") return 2 * get.effect(target, { name: "draw" }, target, player) + 2 / Math.max(2, get.value(button.link)); + } + return get.value(button.link) / 3; + }); + "step 3"; + if (result.bool) { + event.card1 = result.cards[0]; + target + .choosePlayerCard(player, true, "h", "visible", [0, 1], get.translation(player) + "选择了你的" + get.translation(event.card1) + "。请选择其的一张牌") + .set("ai", function (button) { + var evt = _status.event.getParent(); + var player = evt.target, + card = evt.card1, + source = evt.player; + var color = get.color(card); + if (get.attitude(player, target) > 0) { + if (get.color(button.link) == color) return 20 - get.value(card); + return -get.value(card); + } else { + if (get.color(button.link) == "black") return 20 + get.value(card); + return get.value(card); + } + }) + .set("filterOk", () => ui.selected.buttons.length > 0); + } + "step 4"; + if (result.bool) { + event.card2 = result.cards[0]; + var color = get.color(event.card1); + if (color != "none" && get.color(event.card2) == color) { + event.color = color; + var next = player.chooseBool("是否与" + get.translation(target) + "交换展示牌"); + var prompt2 = "用" + get.translation(event.card1) + "交换对方的" + get.translation(event.card2); + if (color == "black") { + prompt2 += ",然后对方摸两张牌"; + next.set("goon", 2 * get.effect(target, { name: "draw" }, target, player) > 0); + } else if (color == "red" && player.isDamaged()) { + prompt2 += ",然后你回复1点体力"; + next.set("goon", get.recoverEffect(player, player, player) > 0); + } + next.set("prompt2", prompt2); + next.set("ai", () => Boolean(_status.event.goon)); + } else event.finish(); + } + "step 5"; + if (result.bool) { + player.swapHandcards(target, [event.card2], [event.card1]); + if (event.color == "black") { + target.draw(2); + } else if (event.color == "red") { + player.recover(); + } + } + }, + }, + dddguiying: { + zhuSkill: true, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter(event, player) { + return ( + player.hasZhuSkill("dddguiying") && + game.hasPlayer(function (current) { + return current != player && current.group == "wu" && player.hasZhuSkill("dddguiying", current) && current.countCards("h") > 0; + }) + ); + }, + gainEffect(player) { + var gainers = game.filterPlayer(current => current.countCards("ej")); + if (!gainers.length) return 0; + var min = Math.min.apply( + Math, + gainers.map(current => { + return Math.min.apply( + Math, + current.getCards("ej").map(function (card) { + return get.number(card, current); + }) + ); + }) + ); + return Math.max.apply( + Math, + game + .filterPlayer(function (target) { + return target.hasCard(function (card) { + return get.number(card, target) == min && lib.filter.canBeGained(card, player, target); + }, "ej"); + }) + .map(function (target) { + var cards = target.getCards("ej", function (card) { + return get.number(card, target) == min && lib.filter.canBeGained(card, player, target); + }), + att = get.attitude(player, target); + return Math.max.apply( + Math, + cards.map(card => { + if (target.getCards("j").includes(card)) { + var efff = get.effect( + target, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ); + if (efff > 0) return -0.5 * att; + if (efff == 0) return 0; + return 1.5 * att; + } + if (target.getCards("e").includes(card)) { + var evalue = get.value(card, target); + if (target.hasSkillTag("noe")) { + if (evalue >= 7) { + return (-evalue / 6) * att; + } + return (-evalue / 10) * att; + } + return (-evalue / 3) * att; + } + }) + ); + }) + ); + }, + content() { + "step 0"; + event.targets = game + .filterPlayer(function (current) { + return current != player && current.group == "wu" && player.hasZhuSkill("dddguiying", current); + }) + .sortBySeat(); + if (!event.targets.length) event.finish(); + "step 1"; + var target = event.targets.shift(); + event.target = target; + if (target.isIn() && target.group == "wu" && target.countCards("h") > 0) { + target + .chooseBool("归萤:是否响应" + get.translation(player) + "的主公技?", "你可以展示所有手牌,将点数最大的牌交给该角色;然后你可以获得场上点数最小的一张牌") + .set("ai", function () { + var player = get.player(), + source = _status.event.getParent().player; + if (_status.event.gainEffect <= 0) return 0; + return get.attitude(player, source) > 0; + }) + .set("gainEffect", lib.skill.dddguiying.gainEffect(target)); + } else event.goto(7); + "step 2"; + if (result.bool) { + target.logSkill("dddguiying", player); + target.showHandcards(get.translation(target) + "响应了〖归萤〗"); + } else event.goto(7); + "step 3"; + if (target.isIn()) { + var cards = target.getCards("he"); + if (!cards.length) event.goto(7); + var max = Math.max.apply( + Math, + cards.map(card => get.number(card, target)) + ); + var gives = cards.filter(card => get.number(card, target) == max); + if (gives.length <= 1) event._result = { bool: true, cards: gives }; + else + target + .chooseCard("he", true, "选择给出一张点数最大的牌", function (card) { + return _status.event.cards.includes(card); + }) + .set("cards", gives); + } else event.goto(7); + "step 4"; + if (result.bool) { + target.give(result.cards, player, "visible"); + } else event.goto(7); + "step 5"; + var gainers = game.filterPlayer(current => current.countCards("ej")); + if (target.isIn() && gainers.length > 0) { + var min = Math.min.apply( + Math, + gainers.map(current => { + return Math.min.apply( + Math, + current.getCards("ej").map(function (card) { + return get.number(card, current); + }) + ); + }) + ); + target + .chooseTarget("是否获得场上点数最小的一张牌?", function (card, player, target) { + var num = _status.event.minNum; + return target.hasCard(function (card) { + return get.number(card, target) == num && lib.filter.canBeGained(card, player, target); + }, "ej"); + }) + .set("minNum", min) + .set("ai", function (target) { + var player = get.player(), + min = _status.event.minNum; + var cards = target.getCards("ej", function (card) { + return get.number(card, target) == min && lib.filter.canBeGained(card, player, target); + }), + att = get.attitude(player, target); + return Math.max.apply( + Math, + cards.map(card => { + if (target.getCards("j").includes(card)) { + var efff = get.effect( + target, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ); + if (efff > 0) return -0.5 * att; + if (efff == 0) return 0; + return 1.5 * att; + } + if (target.getCards("e").includes(card)) { + var evalue = get.value(card, target); + if (target.hasSkillTag("noe")) { + if (evalue >= 7) { + return (-evalue / 6) * att; + } + return (-evalue / 10) * att; + } + return (-evalue / 3) * att; + } + }) + ); + }); + } else event.goto(7); + "step 6"; + if (result.bool) { + var target2 = result.targets[0]; + target.line(target2, "green"); + var min = Math.min.apply( + Math, + target2.getCards("ej").map(function (card) { + return get.number(card, target2); + }) + ), + cards = target2.getCards("ej", card => get.number(card, target2) == min); + if (cards.length <= 1) target.gain(cards, target2, "give", "bySelf"); + else + target + .gainPlayerCard(target2, "ej", true) + .set("filterButton", function (button) { + return _status.event.cards.includes(button.link); + }) + .set("cards", cards); + } + "step 7"; + if (targets.length > 0) event.goto(1); + }, + }, + //王伉吕凯 + dddbingjian: { + enable: ["chooseToUse", "chooseToRespond"], + filter(event, player) { + if (event.type == "wuxie") return false; + if (player.countMark("dddbingjian_used") >= 2) return false; + if (player.countCards("h") == 2) return false; + return ( + event.filterCard( + { + name: "sha", + isCard: true, + }, + player, + event + ) || + event.filterCard( + { + name: "shan", + isCard: true, + }, + player, + event + ) + ); + }, + chooseButton: { + dialog(event, player) { + return ui.create.dialog( + "并肩", + // [[ + // [2,'调整至2张'], + // [4,'调整至4张'] + // ],'tdnodes'], + [["sha", "shan"], "vcard"], + "hidden" + ); + }, + // select:2, + filter(button, player) { + if (ui.selected.buttons.length) { + if (typeof button.link == typeof ui.selected.buttons[0].link) return false; + } + // if(typeof button.link=='number'){ + // return button.link!=player.countCards('h'); + // } + return _status.event.getParent().filterCard({ + name: button.link[2], + isCard: true, + }); + }, + check(button) { + // if(typeof button.link=='number') return button.link; + return 1; + }, + backup(links, player) { + // if(typeof links[0]=='number') links.reverse(); + var skill = { + viewAs: { + name: links[0][2], + suit: "none", + number: null, + isCard: true, + }, + }; + var num = 2 - player.countCards("h"); + if (num > 0) { + skill.draw = num; + skill.filterCard = function () { + return false; + }; + skill.selectCard = -1; + skill.precontent = lib.skill.dddbingjian.content_draw; + } else { + skill.selectCard = -num; + skill.ignoreMod = true; + skill.filterCard = lib.filter.cardDiscardable; + skill.precontent = lib.skill.dddbingjian.content_discard; + skill.check = function (card) { + return 5 - get.value(card); + }; + } + return skill; + }, + prompt(links, player) { + // if(typeof links[0]=='number') links.reverse(); + var num = 2 - player.countCards("h"); + if (num > 0) { + return "摸" + get.cnNumber(num) + "张牌并视为使用" + get.translation(links[0][2]); + } else { + return "弃置" + get.cnNumber(-num) + "张牌并视为使用" + get.translation(links[0][2]); + } + }, + }, + ai: { + pretao: true, + order(item, player) { + if (player.countCards("h") < 4) return get.order({ name: "sha" }, player) + 0.2; + return 1; + }, + result: { + player: 1, + }, + }, + content_draw() { + "step 0"; + delete event.result.skill; + player.logSkill("dddbingjian"); + player.draw(lib.skill.dddbingjian_backup.draw); + player.addTempSkill("dddbingjian_used"); + player.addMark("dddbingjian_used", 1, false); + "step 1"; + player.chooseTarget("是否令一名其他角色摸等量的牌?", lib.filter.notMe).set("ai", target => { + var player = get.player(); + return get.effect(target, { name: "draw" }, player, player); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.draw(lib.skill.dddbingjian_backup.draw); + } + }, + content_discard() { + "step 0"; + delete event.result.skill; + player.logSkill("dddbingjian"); + player.discard(event.result.cards); + event.num = event.result.cards.length; + player.addTempSkill("dddbingjian_used"); + player.addMark("dddbingjian_used", 1, false); + event.result.card = { + name: event.result.card.name, + isCard: true, + }; + event.result.cards = []; + "step 1"; + player + .chooseTarget("是否弃置一名其他角色等量的牌?", lib.filter.notMe) + .set("ai", target => { + var player = get.player(), + num = target.countCards("he") - get.event("num"); + if (num >= 0) num = 1; + else num = 1 - num / 5; + var eff = get.effect(target, { name: "guohe_copy2" }, player, player); + return eff / num; + }) + .set("num", event.num); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.discardPlayerCard(target, "he", true, event.num); + } + }, + content_draw_old() { + "step 0"; + delete event.result.skill; + player.logSkill("dddbingjian"); + player.addTempSkill("dddbingjian_round", "roundStart"); + player.draw(lib.skill.dddbingjian_backup.draw); + "step 1"; + player.chooseTarget("是否令一名角色本轮内不能使用或打出" + get.translation(event.result.card) + "?").set("ai", function (target) { + var player = _status.event.player; + return -get.attitude(player, target) * get.threaten(target, player) * Math.sqrt(1 + target.countCards("h")); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.chat("你不许使用" + get.translation(event.result.card)); + target.addTempSkill("dddbingjian_blocker", "roundStart"); + target.markAuto("dddbingjian_blocker", [event.result.card.name]); + game.delayx(); + } + }, + content_discard_old() { + "step 0"; + delete event.result.skill; + player.logSkill("dddbingjian"); + player.discard(event.result.cards); + event.result.card = { + name: event.result.card.name, + isCard: true, + }; + event.result.cards = []; + "step 1"; + var hs = player.countCards("h"); + if (!game.hasPlayer(current => current.countCards("h") != hs)) { + event.finish(); + } else { + player + .chooseTarget("是否令一名角色将手牌调整至" + get.cnNumber(player.countCards("h")) + "张?", function (card, player, target) { + return target.countCards("h") != player.countCards("h"); + }) + .set("ai", function (target) { + var player = _status.event.player, + num = target.countCards("h") - player.countCards("h"); + if (num > 0) return get.attitude(player, target) * Math.sqrt(1 + Math.abs(num)); + return -get.attitude(player, target) * Math.sqrt(-num); + }); + } + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + var num = target.countCards("h") - player.countCards("h"); + if (num > 0) target.chooseToDiscard("h", true, num); + else target.draw(Math.min(5, -num)); + } + }, + subSkill: { + round: { charlotte: true }, + blocker: { + charlotte: true, + mod: { + cardEnabled(card, player) { + if (player.getStorage("dddbingjian_blocker").includes(card.name)) return false; + }, + cardRespondable(card, player) { + if (player.getStorage("dddbingjian_blocker").includes(card.name)) return false; + }, + cardSavable(card, player) { + if (player.getStorage("dddbingjian_blocker").includes(card.name)) return false; + }, + }, + mark: true, + intro: { + content: "本轮内不能使用或打出$", + }, + }, + used: { + charlotte: true, + onremove: true, + }, + }, + }, + //梁习 + dddtongyu: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("hs") > 0; + }, + viewAs: { + name: "wugu", + }, + selectCard: [1, 4], + filterCard(card) { + var suit = get.suit(card); + if (suit == "none") return false; + if (!ui.selected.cards.length) return true; + for (var card of ui.selected.cards) { + if (get.suit(card) == suit) return false; + } + return true; + }, + complexCard: true, + position: "hs", + prompt: "将任意张花色不同的牌当做【五谷丰登】使用", + check(card) { + return 5 - get.value(card); + }, + precontent() { + if (!event.result.card.storage) event.result.card.storage = {}; + event.result.card.storage.chooseDirection = true; + event.result.card.storage.extraCardsNum = event.result.cards.length; + player.addTempSkill("dddtongyu_effect"); + }, + ai: { + order: 1, + }, + subSkill: { + effect: { + trigger: { global: "useCardToTargeted" }, + forced: true, + charlotte: true, + popup: false, + filter(event, player) { + return event.skill == "dddtongyu" && event.isFirstTarget; + }, + content() { + "step 0"; + event.targets = trigger.targets.slice().sortBySeat(_status.currentPhase || player); + "step 1"; + var target = targets.shift(); + event.target = target; + if (!target.isUnderControl(true) && !target.isOnline()) game.delayx(); + target + .chooseControl() + .set("choiceList", ["本回合不能使用或打出手牌", "令" + get.translation(trigger.card) + "对自己无效"]) + .set("ai", function () { + var player = _status.event.player; + var source = _status.event.getTrigger().player; + return player == source ? 1 : 0; + }); + "step 2"; + if (result.index == 0) { + target.chat("接受五谷"); + target.addTempSkill("dddtongyu_blocker"); + game.log(target, "本回合不能使用或打出手牌"); + } else { + target.chat("拒绝五谷"); + trigger.excluded.add(target); + var evt = trigger.getParent(); + if (!evt.dddtongyu_targets) evt.dddtongyu_targets = []; + evt.dddtongyu_targets.add(target); + game.log(target, "令", trigger.card, "对其无效"); + } + if (targets.length) event.goto(1); + }, + group: "dddtongyu_give", + }, + give: { + trigger: { player: "wuguRemained" }, + direct: true, + filter(event, player) { + if (event.skill != "dddtongyu" || event.remained.filterInD().length == 0) return false; + var list = event.getParent().dddtongyu_targets; + return list.some(target => target.isIn()); + }, + content() { + "step 0"; + event.cards = trigger.remained.filterInD(); + player + .chooseTarget("仝御:令一名角色获得" + get.translation(event.cards), function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("targets", trigger.getParent().dddtongyu_targets) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att < 3) return 0; + if (target.hasJudge("lebu")) att /= 2; + if (target.hasSkillTag("nogain")) att /= 10; + return att / (1 + get.distance(player, target, "absolute")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddtongyu_give", target); + target.gain(cards, "gain2"); + } + }, + }, + blocker: { + mark: true, + intro: { content: "本回合不能使用或打出手牌" }, + mod: { + cardEnabled2(card) { + return false; + }, + }, + }, + }, + }, + dddzhilian: { + trigger: { global: "phaseEnd" }, + direct: true, + filter(event, player) { + var targets = game.filterPlayer2(function (current) { + return current.getHistory("useCard").length + current.getHistory("respond").length > 0; + }); + if (!targets.includes(player) || !targets.some(target => target != player && target.hasSex("male"))) return false; + return targets.length == 2 && !targets.some(target => !target.isIn()); + }, + content() { + "step 0"; + var targets = game + .filterPlayer(function (current) { + return current.getHistory("useCard").length + current.getHistory("respond").length > 0; + }) + .sortBySeat(trigger.player); + event.targets = targets; + var choices = ["摸牌"]; + var prompt2 = "令"; + for (var i = 0; i < 2; i++) { + if (targets[i] == player) prompt2 += "你"; + else prompt2 += get.translation(targets[i]); + if (i == 0) prompt2 += "和"; + } + prompt2 += "各摸一张牌"; + if (targets.some(target => target.countCards("he") > 0)) { + prompt2 += "或各弃置一张牌"; + choices.push("弃牌"); + } + player + .chooseControl(choices, "cancel2") + .set("prompt", get.prompt("dddzhilian")) + .set("prompt2", prompt2) + .set("ai", function () { + var player = _status.event.player; + var targets = _status.event.getParent().targets.slice(0); + if (targets.includes(player)) { + targets.remove(player); + if (get.attitude(player, targets[0]) > 0) return 0; + if (targets[0].countCards("he") > 0 && !targets[0].hasCard(card => get.value(card, targets[0]) <= 0, "e") && player.countCards("h", "sha") > 0) return 1; + return "cancel2"; + } else { + var att1 = get.attitude(player, targets[0]), + att2 = get.attitude(player, targets[1]); + if (get.sgn(att1) != get.sgn(att2)) return "cancel2"; + return att1 > 0 ? 0 : 1; + } + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("dddzhilian", targets); + if (result.control == "摸牌") { + game.asyncDraw(targets); + game.delayex(); + } else { + for (var target of targets) target.chooseToDiscard("he", true); + } + if (!targets.includes(player)) event.finish(); + } else event.finish(); + "step 2"; + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") cards.addArray(evt.cards); + }); + cards = cards.filter(card => card.name == "sha" && get.position(card, true) == "d"); + if (cards.length > 0) player.gain(cards, "gain2"); + }, + }, + dddjijian: { + enable: "phaseUse", + usable: 1, + filterCard: { name: "sha" }, + position: "h", + discard: false, + delay: false, + lose: false, + filter: (event, player) => game.hasPlayer(current => lib.skill.dddjijian.filterTarget(null, player, current)), + filterTarget: (card, player, target) => target != player && target.hasSex("male"), + content() { + "step 0"; + player.showCards(cards); + player.give(cards, target); + "step 1"; + var cards = target.getCards("h"); + if (!cards.length) event.finish(); + else if (cards.length == 1) event._result = { bool: true, cards: cards }; + else + target + .chooseCard("h", true, [1, 2], "请展示一至两张颜色相同的【杀】或普通锦囊牌", (card, player) => { + var color = get.color(card); + for (var cardx of ui.selected.cards) { + if (get.color(cardx) != color) return false; + } + return get.name(card) == "sha" || get.type(card) == "trick"; + }) + .set("complexCard", true) + .set("ai", function (card) { + var player = _status.event.player, + source = _status.event.getParent().player; + if (get.attitude(source, player) <= 0) return -get.value(card); + var name = get.name(card), + color = get.color(card); + if ( + name == "sha" || + player.getUseValue(card) <= 0 || + player.hasCard(card2 => { + return card2 != card && !ui.selected.cards.includes(card2) && get.name(card2) == name; + }) + ) { + if (!ui.selected.cards.length && color == "black") return 1 + Math.random(); + return Math.random(); + } + if (!ui.selected.cards.length || get.color(ui.selected.cards[0] == "red")) { + if (color == "black") return 0.2 - player.getUseValue(card) / 100 + Math.random(); + } + return 0.1 - player.getUseValue(card) / 100; + }); + "step 2"; + if (result.bool) { + var cards = result.cards; + event.cards = cards; + target.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【赍剑】"); + event.usedName = []; + event.targets = [player, target].sortBySeat(_status.currentPhase || player); + } else event.finish(); + "step 3"; + var current = event.targets.shift(); + if (!current.isIn()) { + event.goto(5); + return; + } + event.current = current; + var list = event.cards + .filter(card => { + return ( + !event.usedName.includes(get.name(card)) && + current.hasUseTarget({ + name: get.name(card), + nature: get.nature(card), + }) + ); + }) + .map(card => { + return [get.type(card), "", get.name(card), get.nature(card)]; + }); + if (!list.length) event.finish(); + else + current.chooseButton(["赍剑:视为使用一张牌", [list, "vcard"]], true).set("ai", function (button) { + return get.player().getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }); + "step 4"; + if (result.bool) { + var name = result.links[0][2]; + event.usedName.add(name); + event.current.chooseUseTarget( + { + name: name, + nature: result.links[0][3], + isCard: true, + }, + true, + false + ); + } + "step 5"; + if (event.targets.length) event.goto(3); + }, + ai: { + order: 4, + result: { + player(player, target) { + if (get.attitude(player, target) > 0 && player.hasCard(card => get.name(card) == "sha", "h")) return target.countCards("h"); + return 0.1 / target.countCards("h"); + }, + }, + }, + }, + dddjijian_old: { + enable: "phaseUse", + usable: 1, + filter: (event, player) => game.hasPlayer(current => lib.skill.dddjijian_old.filterTarget(null, player, current)), + filterTarget: (card, player, target) => target != player && target.hasSex("male") && target.countCards("h") > 0, + content() { + "step 0"; + target.chooseCard("h", true, [1, 2], "请展示一至两张手牌").set("ai", function (card) { + var player = _status.event.player, + source = _status.event.getParent().player; + if (get.attitude(source, player) <= 0) return -get.value(card); + var name = get.name(card), + color = get.color(card); + if ( + name == "sha" || + player.getUseValue(card) <= 0 || + player.hasCard(card2 => { + return card2 != card && !ui.selected.cards.includes(card2) && get.name(card2) == name; + }) + ) { + if (!ui.selected.cards.length && color == "black") return 1 + Math.random(); + return Math.random(); + } + if (!ui.selected.cards.length || get.color(ui.selected.cards[0] == "red")) { + if (color == "black") return 0.2 - player.getUseValue(card) / 100 + Math.random(); + } + return 0.1 - player.getUseValue(card) / 100; + }); + "step 1"; + if (result.bool) { + var cards = result.cards; + event.cards = cards; + target.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【赍剑】"); + if ( + !player.hasCard(card => { + if (_status.connectMode) return true; + return get.name(card, player) == "sha"; + }, "h") + ) + event.finish(); + } else event.finish(); + "step 2"; + var colors = []; + for (var card of cards) colors.add(get.color(card, target)); + colors.sort(); + var str = "若你给出的【杀】为"; + for (var i = 0; i < colors.length; i++) { + str += get.translation(colors[i]); + if (i < colors.length - 1) str += "或"; + } + str += ",则其获得后续增益效果"; + player + .chooseCard("h", (card, player) => get.name(card, player) == "sha", "是否交给" + get.translation(target) + "一张【杀】?", str) + .set("colors", colors) + .set("ai", function (card) { + var player = _status.event.player, + target = _status.event.getParent().target; + if (get.attitude(player, target) < 0) return false; + if (!_status.event.colors.includes(get.color(card, player))) return 0; + if (game.hasNature(card)) return 1.2; + return 1; + }); + "step 3"; + if (result.bool) { + player.give(result.cards, target, "giveAuto"); + var num = 0, + color = get.color(result.cards[0], player); + for (var card of cards) { + if (get.color(card, target) == color) num++; + } + if (!num) event.finish(); + else event.num = num; + } else event.finish(); + "step 4"; + var cards = target.getCards("h"); + cards.removeArray(event.cards); + var names = []; + for (var card of cards) { + var name = get.name(card, target), + type = get.type(card); + if (type != "basic" && type != "trick") continue; + if (name == "sha") { + var natures = get.natureList(card, target); + for (var nature of natures) { + if (nature && lib.nature.has(nature)) name += "|" + nature; + } + } + names.push(name); + } + if (!names.length) event.finish(); + else event.names = names; + "step 5"; + event.num--; + target + .chooseButton([ + "是否视为使用一张牌?", + [ + event.names.map(name => { + if (name.indexOf("sha|") == 0) { + return ["基本", "", "sha", name.slice(4).split("|")]; + } + return [get.type(name), "", name]; + }), + "vcard", + ], + ]) + .set("filterButton", function (button) { + var card = { + name: button.link[2], + nature: button.link[3], + isCard: true, + }, + player = _status.event.player; + return player.hasUseTarget(card); + }) + .set("ai", function (button) { + var card = { + name: button.link[2], + nature: button.link[3], + isCard: true, + }, + player = _status.event.player; + return player.getUseValue(card); + }); + "step 6"; + if (result.bool) { + var card = { + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }; + target.chooseUseTarget(card, true, false); + if (event.num > 0) { + var name = card.name; + if (name == "sha") { + var natures = get.natureList(card, target); + for (var nature of natures) { + if (nature && lib.nature.has(nature)) name += "|" + nature; + } + } + event.names.remove(name); + if (event.names.length > 0) event.goto(5); + } + } else event.finish(); + }, + ai: { + order: 4, + result: { + player(player, target) { + if (get.attitude(player, target) > 0 && player.hasCard(card => get.name(card) == "sha", "h")) return target.countCards("h"); + return 0.1 / target.countCards("h"); + }, + }, + }, + }, + dddzhengjun: { + trigger: { + global: ["damageEnd", "loseHpEnd", "recoverEnd", "loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + if (!player.isPhaseUsing()) return false; + if (event.name == "damage" || event.name == "loseHp" || event.name == "recover") { + if (player.hasSkill("dddzhengjun_hp")) return false; + return event.player.getHp() == player.getHp(); + } + const info = get.info("dddzhengjun"); + const hs_check = info.hs_check, + es_check = info.es_check; + return game.hasPlayer(target => { + if (event.getg && event.getg(target) && event.getg(target).length && hs_check(player, target)) return true; + const evt = event.getl(target); + if (evt && evt.hs && evt.hs.length && hs_check(player, target)) return true; + if (event.name == "equip" && event.player == target && (!evt || evt.cards.length != 1) && es_check(player, target)) return true; + return evt && evt.es && evt.es.length && es_check(player, target); + }); + }, + hs_check(player, target) { + return !player.hasSkill("dddzhengjun_hs") && target.countCards("h") == player.countCards("h"); + }, + es_check(player, target) { + return !player.hasSkill("dddzhengjun_es") && target.countCards("e") == player.countCards("e"); + }, + async cost(event, trigger, player) { + if (trigger.name == "damage" || trigger.name == "loseHp" || trigger.name == "recover") { + let list = ["失去体力", "cancel2"]; + if (trigger.player.isDamaged()) list.unshift("回复体力"); + const { + result: { control }, + } = await player + .chooseControl(list) + .set("prompt", get.prompt("dddzhengjun", trigger.player)) + .set("prompt2", "令" + get.translation(event.player) + "执行其中一项") + .set("ai", () => { + const player = get.event("player"), + target = get.event().getTrigger().player; + if (get.event("controls").includes("回复体力") && get.recoverEffect(target, player, player) > 0) return "回复体力"; + return get.effect(target, { name: "losehp" }, player, player) > 0 ? "失去体力" : "cancel2"; + }); + event.result = { + bool: control != "cancel2", + targets: [trigger.player], + cost_data: control, + }; + } else { + let map = {}; + const hs_targets = game.filterPlayer(target => { + if (!get.info("dddzhengjun").hs_check(player, target)) return false; + if (trigger.getg && trigger.getg(target) && trigger.getg(target).length) return true; + const evt = trigger.getl(target); + return evt && evt.hs && evt.hs.length; + }); + const es_targets = game.filterPlayer(target => { + if (!get.info("dddzhengjun").es_check(player, target)) return false; + const evt = trigger.getl(target); + if (trigger.name == "equip" && trigger.player == target && (!evt || evt.cards.length != 1)) return true; + return evt && evt.es && evt.es.length; + }); + if (hs_targets.length) { + let target; + if (hs_targets.length == 1) target = hs_targets[0]; + else { + let targets = await player + .chooseTarget(get.prompt("dddzhengjun"), "令其中一名角色摸一张牌或弃置一张牌", (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("ai", target => { + const player = get.event("player"); + return Math.max(get.effect(target, { name: "guohe_copy2" }, target, player), get.effect(target, { name: "draw" }, player, player)); + }) + .set("targets", hs_targets) + .forResultTargets(); + if (targets && targets.length) target = targets[0]; + } + if (target) { + let list = ["摸牌"]; + if (target.countCards("h")) list.push("弃牌"); + const { + result: { control }, + } = await player + .chooseControl(list, "cancel2") + .set("prompt", get.prompt("dddzhengjun", target)) + .set("prompt2", "令" + get.translation(target) + "执行其中一项") + .set("ai", () => { + const player = get.event("player"), + target = get.event().getTrigger().player; + if (get.event("controls").includes("弃牌") && get.effect(target, { name: "guohe_copy2" }, player, player) > 0) return "弃牌"; + return get.effect(target, { name: "draw" }, player, player) > 0 ? "摸牌" : "cancel2"; + }); + if (control != "cancel2") { + map.hs_target = [target, control]; + } + } + } + if (es_targets.length) { + let target; + if (hs_targets.length == 1) { + const { + result: { bool }, + } = await player + .chooseBool() + .set("prompt", get.prompt("dddzhengjun", hs_targets[0])) + .set("prompt2", "移动" + get.translation(hs_targets[0]) + "的一张装备牌") + .set("choice", () => player.canMoveCard(true, true, hs_targets[0])); + if (bool) target = hs_targets[0]; + } else { + let targets = await player + .chooseTarget(get.prompt("dddzhengjun"), "移动其中一名角色的一张装备牌", (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("ai", target => { + const player = get.event("player"); + return player.canMoveCard(true, true, target) ? 1 + Math.random() : 0; + }) + .set("targets", es_targets) + .forResultTargets(); + if (targets && targets.length) target = targets[0]; + } + if (target) { + map.es_target = target; + } + } + event.result = { + bool: map.hs_target || map.es_target, + targets: [(map.hs_target || [])[0]].concat(map.es_target ? [map.es_target] : []), + cost_data: map, + }; + } + }, + async content(event, trigger, player) { + const data = event.cost_data; + if (trigger.name == "damage" || trigger.name == "loseHp" || trigger.name == "recover") { + player.addTempSkill("dddzhengjun_hp", "phaseUseAfter"); + await trigger.player[data == "回复体力" ? "recover" : "loseHp"](); + } else { + if (data.hs_target) { + player.addTempSkill("dddzhengjun_hs", "phaseUseAfter"); + if (data.hs_target[1] == "摸牌") await data.hs_target[0].draw(); + else await data.hs_target[0].chooseToDiscard("he", true); + } + if (data.es_target) { + player.addTempSkill("dddzhengjun_es", "phaseUseAfter"); + await player.moveCard(true, data.es_target); + } + } + }, + subSkill: { + hs: { charlotte: true }, + es: { charlotte: true }, + hp: { charlotte: true }, + }, + }, + dddxianxi: { + trigger: { + player: "useCard2", + }, + direct: true, + filter(event, player) { + if (event.card.name != "sha" || !player.isPhaseUsing()) return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); + }); + }, + content() { + "step 0"; + player + .chooseTarget( + get.prompt("dddxianxi"), + "为" + get.translation(trigger.card) + "增加任意个目标", + function (card, player, target) { + var event = _status.event.getTrigger(); + return !event.targets.includes(target) && lib.filter.targetEnabled2(event.card, player, target); + }, + [1, Infinity] + ) + .set("ai", function (target) { + var evt = _status.event.getTrigger(); + if (get.damageEffect(target, evt.player, evt.player) < 0) return 0; + return get.effect(target, evt.card, evt.player, evt.player); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + event.targets = targets; + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + "step 2"; + player.logSkill("dddxianxi", targets); + trigger.targets.addArray(targets); + if (!trigger._dddxianxi_map) trigger._dddxianxi_map = {}; + trigger._dddxianxi_map[player.playerid] = targets.slice(0); + player.addTempSkill("dddxianxi_delay"); + }, + subSkill: { + delay: { + charlotte: true, + trigger: { + player: "useCardAfter", + }, + forced: true, + filter(event, player) { + if (!event._dddxianxi_map || !event._dddxianxi_map[player.playerid]) return false; + for (var target of event._dddxianxi_map[player.playerid]) { + if ( + !target.hasHistory("damage", function (evt) { + return evt.card == event.card; + }) + ) + return true; + } + return false; + }, + content() { + "step 0"; + var targets = trigger._dddxianxi_map[player.playerid] + .filter(function (target) { + return !target.hasHistory("damage", function (evt) { + return evt.card == trigger.card; + }); + }) + .sortBySeat(); + event.targets = targets; + var num = targets.length; + player.chooseToDiscard("he", num, "险袭:选择弃置" + get.cnNumber(num) + "张牌", "然后对" + get.translation(targets) + "各造成1点伤害。或点击「取消」,改为摸" + get.cnNumber(num) + "张牌并失去1点体力").set("ai", function (card) { + return 7 - get.value(card); + }); + "step 1"; + if (result.bool) { + for (var i of targets) { + player.line(i); + i.damage(); + } + } else { + player.draw(targets.length); + player.loseHp(); + } + }, + sub: true, + }, + }, + }, + dddlingyong: { + trigger: { + global: ["phaseZhunbeiSkipped", "phaseZhunbeiCancelled", "phaseDrawSkipped", "phaseDrawCancelled", "phaseJudgeSkipped", "phaseJudgeCancelled", "phaseUseSkipped", "phaseUseCancelled", "phaseDiscardSkipped", "phaseDiscardCancelled", "phaseJieshuSkipped", "phaseJieshuCancelled"], + }, + frequent: true, + content() { + "step 0"; + player + .judge(function (card) { + var name = get.name(card, false); + if (name == "sha") return -2; + return 2; + }) + .set("callback", function () { + if (event.judgeResult.name != "sha") { + var card = event.judgeResult.card; + if (get.position(card, true) == "o") player.chooseUseTarget(card); + } + }).judge2 = function (result) { + return result.bool; + }; + "step 1"; + if (result.bool) { + player.chooseBool("是否继续进行【灵涌】判定?").set("frequentSkill", "dddlingyong"); + } else event.finish(); + "step 2"; + if (result.bool) event.goto(0); + }, + }, + dddxuxiao: { + trigger: { + global: ["loseAfter", "loseAsyncAfter"], + }, + direct: true, + filter(event, player) { + if (event.type != "discard") return false; + var cards = event.getd(); + for (var i of cards) { + if (get.position(i, true) == "d" && get.color(i, false) == "black" && get.type(i, null, true) == "basic") { + var card = get.autoViewAs({ name: "bingliang" }, [i]); + if ( + game.hasPlayer(function (current) { + return current.canAddJudge(card); + }) + ) + return true; + } + } + return false; + }, + content() { + "step 0"; + if (!event.cards) event.cards = []; + var cards = trigger.getd().filter(function (i) { + if (!event.cards.includes(i) && get.position(i, true) == "d" && get.color(i, false) == "black" && get.type(i, null, true) == "basic") { + var card = get.autoViewAs({ name: "bingliang" }, [i]); + if ( + game.hasPlayer(function (current) { + return current.canAddJudge(card); + }) + ) + return true; + } + return false; + }); + if (cards.length) { + player.chooseButton([get.prompt("dddxuxiao"), cards]); + } else event.finish(); + "step 1"; + if (result.bool) { + var card = result.links[0]; + event.cards.push(card); + event.card = card; + player + .chooseTarget(true, "请选择【兵粮寸断】的目标", "将" + get.translation(card) + "置于一名角色的判定区内,然后其摸两张牌", function (card, player, target) { + var card = get.autoViewAs({ name: "bingliang" }, [_status.event.card]); + return target.canAddJudge(card); + }) + .set("card", card) + .set("ai", function (target) { + var card = get.autoViewAs({ name: "bingliang" }, [_status.event.card]), + player = _status.event.player; + return get.attitude(player, target) + Math.max(0, get.effect(target, card, player, player)); + }); + } + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddxuxiao", target); + target.addJudge({ name: "bingliang" }, [card]); + target.draw(2); + event.goto(0); + } + }, + }, + dddxuyu: { + trigger: { + player: "useCardAfter", + }, + content() { + player.draw(); + player + .when({ player: "useCardAfter", global: "phaseAfter" }) + .filter(evt => evt != trigger) + .then(() => { + if (trigger.name == "useCard") player.chooseToDiscard("he", true); + }); + }, + }, + dddshijian: { + trigger: { + global: "useCardAfter", + }, + filter(event, player) { + if (player == event.player) return false; + const evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + event.player.getHistory( + "useCard", + evtx => { + return evtx.getParent("phaseUse") == evt; + }, + event + ).length == 2 + ); + }, + direct: true, + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + let result = yield player + .chooseCard("he", get.prompt("dddshijian", target), `交给${get.translation(target)}一张牌,然后其本回合使用下一张牌指定目标时,你令此牌额外结算一次或摸一张牌。`) + .set("ai", card => { + if (get.event("goon")) return 6 - get.value(card); + return 0; + }) + .set("goon", get.attitude(player, target) > 0 && target.hasCard(card => target.hasValueTarget(card))); + if (!result.bool) return event.finish(); + player.logSkill("dddshijian", target); + player.give(result.cards, target); + player.addTempSkill("dddshijian_extra"); + player.markAuto("dddshijian_extra", target); + }, + subSkill: { + extra: { + trigger: { global: "useCardToPlayer" }, + filter(event, player) { + if (!event.isFirstTarget) return false; + return player.getStorage("dddshijian_extra").includes(event.player); + }, + charlotte: true, + forced: true, + onremove: true, + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + if (trigger.targets && trigger.targets.length) { + let result = yield player + .chooseControl(["额外结算", "摸一张牌"]) + .set("prompt", "实荐:请选择一项") + .set("prompt2", `令${get.translation(trigger.card)}额外结算一次,或摸一张牌`) + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + (function () { + if (trigger.card.name === "tiesuo" || !["basic", "trick"].includes(get.type(trigger.card))) return 1; + if ( + trigger.targets.reduce((p, c) => { + return p + get.effect(c, trigger.card, target, _status.event.player); + }, 0) >= get.effect(player, { name: "draw" }, player, _status.event.player) + ) + return 0; + return 1; + })() + ); + if (result.index == 0) { + trigger.getParent().effectCount++; + game.log(player, "令", trigger.card, "额外结算一次"); + } else player.draw(); + } else player.draw(); + player.removeSkill("dddshijian_extra"); + }, + }, + }, + }, + dddxuyu_old: { + trigger: { + player: "useCardAfter", + }, + filter(event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + return ( + player.getHistory( + "useCard", + function (evtx) { + return evtx.getParent("phaseUse") == evt; + }, + event + ).length == 1 + ); + }, + content() { + player.draw(2); + player.addTempSkill("dddxuyu_old_discard", "phaseUseAfter"); + }, + subSkill: { + discard: { + trigger: { + player: "useCardAfter", + }, + filter(event, player) { + if (!player.countCards("he")) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + return ( + player.getHistory( + "useCard", + function (evtx) { + return evtx.getParent("phaseUse") == evt; + }, + event + ).length == 3 + ); + }, + forced: true, + charlotte: true, + content() { + player.chooseToDiscard("he", true); + }, + sub: true, + }, + }, + }, + dddshijian_old: { + trigger: { + global: "useCardAfter", + }, + filter(event, player) { + if (player == event.player) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + event.player.getHistory( + "useCard", + function (evtx) { + return evtx.getParent("phaseUse") == evt; + }, + event + ).length == 3 + ); + }, + logTarget: "player", + check(event, player) { + return get.attitude(player, event.player) > 0; + }, + content() { + trigger.player.draw(); + player.addTempSkill("dddshijian_old_draw", "phaseUseAfter"); + }, + subSkill: { + draw: { + trigger: { + global: "useCardAfter", + }, + filter(event, player) { + if (!event.player.countCards("he")) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + event.player.getHistory( + "useCard", + function (evtx) { + return evtx.getParent("phaseUse") == evt; + }, + event + ).length == 4 + ); + }, + forced: true, + charlotte: true, + content() { + player.draw(2); + }, + sub: true, + }, + }, + }, + dddtaisi: { + trigger: { + global: "phaseEnd", + }, + direct: true, + filter(event, player) { + if (!game.getGlobalHistory("changeHp").some(evt => evt.player == player)) return false; + return game.getGlobalHistory("cardMove").some(function (evt) { + if (evt.name != "cardsDiscard") { + if (evt.name != "lose" || evt.position != ui.discardPile) return false; + } + return evt.cards.some(card => get.position(card, true) == "d"); + }); + }, + content() { + "step 0"; + player.chooseTarget(get.prompt("dddtaisi"), "你可以令一名角色获得一张于本回合内进入弃牌堆的牌。若该角色于本回合内对你造成过伤害,则你摸两张牌。").set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (player.hasHistory("damage", evt => evt.source == target)) return 10 + att; + return att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddtaisi", target); + event.target = target; + } else event.finish(); + "step 2"; + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "cardsDiscard") { + if (evt.name != "lose" || evt.position != ui.discardPile) return false; + } + cards.addArray(evt.cards.filter(card => get.position(card, true) == "d")); + }); + if (!cards.length) event.finish(); + else if (cards.length == 1) event._result = { bool: true, links: cards }; + else + player.chooseButton(["令" + get.translation(target) + "获得一张牌", cards], true).set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target; + var att = get.attitude(player, target) - 0.1; + return get.sgn(att) * get.value(button.link, target); + }); + "step 3"; + if (result.bool) { + target.gain(result.links, "gain2"); + } else event.finish(); + "step 4"; + if (player.hasHistory("damage", evt => evt.source == target)) player.draw(2); + }, + }, + dddquche: { + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return player.hasCard({ color: "red" }, "he"); + }, + filterCard: { + color: "red", + }, + filterTarget(card, player, target) { + return player != target; + }, + discard: false, + delay: false, + lose: false, + content() { + "step 0"; + event.count = 1; + player.awakenSkill("dddquche"); + player.addTempSkill("dddquche_effect"); + player.addMark("dddquche_effect", 1, false); + player.give(cards, target); + event.goto(3); + "step 1"; + if ( + player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.color(card) == "red"; + }, "he") + ) { + player.chooseCardTarget({ + prompt: "是否将一张红色牌交给一名其他角色?", + filterCard: { color: "red" }, + filterTarget: lib.filter.notMe, + position: "he", + }); + } else event.finish(); + "step 2"; + if (result.bool) { + player.addMark("dddquche_effect", 1, false); + player.give(result.cards, result.targets[0]); + } else event.finish(); + "step 3"; + if ( + player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.color(card) == "black"; + }, "hes") + ) { + player.chooseCardTarget({ + prompt: "是否将一张黑色牌当做【杀】使用?", + position: "he", + filterCard(card, player) { + if (get.color(card) != "black") return false; + var card = get.autoViewAs({ name: "sha" }, [card]); + return lib.filter.cardEnabled(card, player); + }, + selectTarget() { + var card = get.autoViewAs({ name: "sha" }, ui.selected.cards); + return lib.filter.selectTarget(card, _status.event.player); + }, + filterTarget(card, player, target) { + var card = get.autoViewAs({ name: "sha" }, ui.selected.cards); + return lib.filter.targetEnabled(card, player, target) && lib.filter.targetInRange(card, player, target); + }, + }); + } else event.finish(); + "step 4"; + if (result.bool) { + player.addMark("dddquche_effect", 1, false); + player.useCard({ name: "sha" }, result.cards, result.targets, false); + event.goto(1); + } else event.finish(); + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + mod: { + globalFrom(from, to, distance) { + return distance - from.countMark("dddquche_effect"); + }, + }, + intro: { + content: "至其他角色的距离-#", + }, + sub: true, + }, + }, + mark: true, + intro: { + content: "limited", + }, + init(player, skill) { + player.storage[skill] = false; + }, + }, + dddqianlong: { + zhuSkill: true, + trigger: { + source: "dieAfter", + }, + forced: true, + filter: (event, player) => player.hasZhuSkill("dddqianlong"), + content() { + player.draw(3); + }, + group: "dddqianlong_cancel", + subSkill: { + cancel: { + trigger: { + player: ["drawBefore", "discardBefore"], + }, + forced: true, + popup: false, + filter(event, player) { + if (!player.hasZhuSkill("dddqianlong")) return false; + var evt = event.getParent(); + return evt && evt.name == "die" && evt.source == player; + }, + content() { + trigger.cancel(); + }, + sub: true, + }, + }, + }, + ddddongcha: { + trigger: { + global: "phaseBegin", + }, + logTarget: "player", + filter(event, player) { + return player != event.player && player.countCards("h") > 0 && event.player.countCards("h") > 0; + }, + check(event, player) { + return get.attitude(player, event.player) <= 0; + }, + content() { + "step 0"; + event.target = trigger.player; + player.addTempSkill("ddddongcha_effect"); + if (player.countCards("h") > 0) player.chooseCard("h", true, "选择一张牌作为“鉴”"); + "step 1"; + if (result.bool) { + player.addToExpansion(result.cards, player, "give").gaintag.add("ddddongcha_effect"); + } + "step 2"; + if (target.countCards("h") > 0) target.chooseCard("h", true, "选择一张牌作为“鉴”"); + "step 3"; + if (result.bool) { + player.addToExpansion(result.cards, target, "give").gaintag.add("ddddongcha_effect"); + } + }, + subSkill: { + effect: { + charlotte: true, + trigger: { + global: "phaseEnd", + }, + forced: true, + filter(event, player) { + return player.getExpansions("ddddongcha_effect").length > 0; + }, + content() { + "step 0"; + var cards = player.getExpansions("ddddongcha_effect"); + if (cards.length > 0) { + if (cards.length == 1) + event._result = { + bool: true, + links: cards, + }; + else player.chooseButton(["选择获得一张“鉴”", cards], true); + } else event.finish(); + "step 1"; + if (result.bool) player.gain(result.links, "gain2"); + "step 2"; + var cards = player.getExpansions("ddddongcha_effect"); + if (cards.length > 0 && trigger.player.isIn()) { + if (cards.length == 1) + event._result = { + bool: true, + links: cards, + }; + else + trigger.player.chooseButton(["选择获得一张“鉴”", cards], true).set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + } else event.finish(); + "step 3"; + if (result.bool) trigger.player.gain(result.links, player, "give"); + }, + marktext: "鉴", + intro: { + content: "expansion", + markcount: "expansion", + }, + sub: true, + }, + }, + }, + dddzhijie: { + enable: "chooseToUse", + filter(event, player) { + if (event.type == "phase") return false; + var cards = player.getExpansions("ddddongcha_effect"); + if (cards.length < 2) return false; + var shan = false, + wuxie = false; + for (var i = 0; i < cards.length; i++) { + for (var j = i + 1; j < cards.length; j++) { + if (get.color(cards[i], false) == get.color(cards[j], false)) shan = true; + else wuxie = true; + } + } + if (shan && event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) return true; + if (wuxie && event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) return true; + return false; + }, + hiddenCard(player, name) { + if (name != "shan" && name != "wuxie") return false; + var cards = player.getExpansions("ddddongcha_effect"); + if (cards.length < 2) return false; + var shan = false, + wuxie = false; + for (var i = 0; i < cards.length; i++) { + for (var j = i + 1; j < cards.length; j++) { + if (get.color(cards[i], false) == get.color(cards[j], false)) shan = true; + else wuxie = true; + } + } + if (shan && name == "shan") return true; + if (wuxie && name == "wuxie") return true; + return false; + }, + chooseButton: { + dialog(event, player) { + return ui.create.dialog("智解", player.getExpansions("ddddongcha_effect"), "hidden"); + }, + select: 2, + filter(button, player) { + if (!ui.selected.buttons.length) return true; + var evt = _status.event.getParent(), + buttons = ui.selected.buttons; + return evt.filterCard( + get.autoViewAs( + { + name: get.color(buttons[0].link) == get.color(button.link) ? "shan" : "wuxie", + }, + [button.link, buttons[0].link] + ) + ); + }, + check: () => 1, + backup(links, player) { + return { + viewAs: { + name: get.color(links[0]) == get.color(links[1]) ? "shan" : "wuxie", + }, + cards: links, + selectCard: -1, + position: "x", + filterCard: card => lib.skill["dddzhijie_backup"].cards.includes(card), + popname: true, + precontent() { + player.addTempSkill("dddzhijie_draw"); + }, + }; + }, + }, + ai: { + combo: "ddddongcha", + respondShan: true, + skillTagFilter(player) { + return lib.skill["dddzhijie"].hiddenCard(player, "shan"); + }, + order: 10, + result: { player: 1 }, + effect: { + target: (card, player, target) => { + if (card.name === "sha" && target.getExpansions("ddddongcha_effect").length < 2 && lib.skill["dddzhijie"].hiddenCard(target, "shan")) return [1, 1, 1, -get.sgn(get.attitude(player, _status.currentPhase))]; + }, + }, + }, + subSkill: { + draw: { + trigger: { + player: "useCardAfter", + }, + forced: true, + charlotte: true, + popup: false, + filter(event, player) { + return event.skill == "dddzhijie_backup"; + }, + content() { + player.draw(2); + }, + sub: true, + }, + }, + }, + dddqiahua: { + trigger: { + global: "phaseBegin", + }, + direct: true, + filter(event, player) { + return ( + player != event.player && + event.player.hp > 0 && + player.countCards("h", function (card) { + return !get.is.shownCard(card); + }) >= event.player.hp + ); + }, + content() { + "step 0"; + var target = trigger.player; + player + .chooseCard("h", target.hp, get.prompt("dddqiahua", target), "选择明置" + get.cnNumber(target.hp) + "张手牌,然后" + get.translation(target) + "获得技能〖恂恂〗直到本回合结束。", function (card) { + return !get.is.shownCard(card); + }) + .set("goon", get.attitude(player, target) > 0) + .set("ai", function (card) { + if (_status.event.goon) return 1 + Math.random(); + return 0; + }); + "step 1"; + if (result.bool) { + var target = trigger.player, + cards = result.cards; + player.logSkill("dddqiahua", target); + target.addTempSkills("dddxunxun"); + player.addShownCards(cards, "visible_dddxianglang"); + game.log(player, "选择了", cards, "作为“明”"); + player.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【恰化】"); + } + }, + ai: { + expose: 0.15, + }, + derivation: "dddxunxun", + }, + dddxunxun: { + inherit: "xunxun", + audio: 2, + }, + dddfusi: { + mod: { + ignoredHandcard(card, player) { + if (get.is.shownCard(card)) return true; + }, + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && get.is.shownCard(card)) return false; + }, + }, + global: "dddfusi_global", + subSkill: { + refused: { + charlotte: true, + sub: true, + }, + allowed: { + charlotte: true, + sub: true, + }, + }, + }, + dddfusi_global: { + mod: { + cardEnabled2(card, player) { + var source = _status.currentPhase; + if ( + !source || + source == player || + !source.hasSkill("dddfusi") || + source.countCards("h") == 0 || + source.hasCard(function (card) { + return !get.is.shownCard(card); + }, "h") + ) + return; + if (player.getCards("h").includes(card)) return false; + }, + }, + enable: "chooseToUse", + filter(event, player) { + if (event._dddfusi_refused || player.hasSkill("dddfusi_refused")) return false; + var players = game.filterPlayer(function (current) { + return current != player && current.hasSkill("dddfusi"); + }); + for (var source of players) { + var cards = source.getShownCards(); + for (var i of cards) { + var card = get.autoViewAs(i); + if (event.filterCard(card, player, event)) return true; + } + } + return false; + }, + hiddenCard(player, name) { + if (player.hasSkill("dddfusi_refused")) return false; + var players = game.filterPlayer(function (current) { + return current != player && current.hasSkill("dddfusi"); + }); + for (var source of players) { + var cards = source.getShownCards(); + for (var i of cards) { + var card = get.autoViewAs(i); + if (name == card.name) return true; + } + } + return false; + }, + chooseButton: { + dialog(event, player) { + var dialog = ui.create.dialog("腹笥", "hidden"); + var players = game + .filterPlayer(function (current) { + return current != player && current.hasSkill("dddfusi"); + }) + .sortBySeat(); + for (var source of players) { + var cards = source.getShownCards(); + if (cards.length) { + var str = '
    '; + str += get.translation(source); + var num = source.getSeatNum(); + if (num > 0) str += "(" + get.cnNumber(num, true) + "号位)"; + str += "
    "; + dialog.add(str); + dialog.add(cards); + } + } + return dialog; + }, + filter(button, player) { + var card = get.autoViewAs(button.link), + evt = _status.event.getParent(); + return evt.filterCard(card, player, evt); + }, + check(button) { + if (_status.event.getParent().type != "phase") return 1; + return _status.event.player.getUseValue(get.autoViewAs(button.link), null, true); + }, + backup(links, player) { + return { + card: links[0], + viewAs: get.autoViewAs(links[0]), + filterCard: () => false, + selectCard: -1, + precontent() { + "step 0"; + var card = lib.skill["dddfusi_global_backup"].card; + event.card = card; + event.result.cards = [card]; + event.source = get.owner(card); + if (!event.result.card.storage) event.result.card.storage = {}; + event.result.card.storage._dddfusi_owner = event.source; + delete event.result.skill; + player.logSkill("dddfusi_global", event.source); + if (player.hasSkill("dddfusi_allowed")) event.finish(); + "step 1"; + if (event.result.targets && event.result.targets.length) player.line(event.result.targets, event.result.card.nature); + player.showCards([card], get.translation(player) + "向" + get.translation(source) + "发动【腹笥】"); + source + .chooseButton( + [ + "是否同意" + get.translation(player) + "使用" + get.translation(card) + "?", + '
    ' + + (function () { + if (event.result.targets && event.result.targets.length) return "(目标角色:" + get.translation(event.result.targets) + ")"; + return "(无目标角色)"; + })() + + "
    ", + [["   同意   ", "  不同意  "], "tdnodes"], + [["   同意且本回合内不再提示   "], "tdnodes"], + [["  不同意且本回合内不再提示  "], "tdnodes"], + "forcebutton", + ], + true + ) + .set("forceAuto", true); + "step 2"; + if (result.links[0].indexOf("不同意") == -1) { + source.chat("同意"); + if (result.links[0].indexOf("本回合内不再提示") > 0) player.addTempSkill("dddfusi_allowed"); + } else if (result.links[0].indexOf("不同意") != -1) { + source.chat("不同意"); + if (result.links[0].indexOf("本回合内不再提示") > 0) player.addTempSkill("dddfusi_refused"); + else if (event.result.card.name == "wuxie") player.addTempSkill("dddfusi_refused", "_wuxieAfter"); + var evt = event.getParent(); + evt.set("_dddfusi_refused", true); + evt.goto(0); + } + }, + }; + }, + prompt(links, player) { + return "请选择" + get.translation(links[0]) + "的目标"; + }, + }, + ai: { + order: 10, + result: { + player(player, target) { + if ( + !game.hasPlayer(function (current) { + return current != player && current.hasSkill("dddfusi") && get.attitude(player, current) >= 0; + }) + ) + return 0; + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + var name; + switch (tag) { + case "respondSha": + name = "sha"; + break; + case "respondShan": + name = "shan"; + break; + } + return lib.skill["dddfusi_global"].hiddenCard(player, name); + }, + }, + }, + dddtuoji: { + trigger: { global: "useCardAfter" }, + frequent: true, + filter(event, player) { + return ( + event.card.storage && + event.card.storage._dddfusi_owner == player && + !player.hasCard(function (card) { + return !get.is.shownCard(card); + }, "h") + ); + }, + content() { + player.draw(3); + }, + ai: { + combo: "dddfusi", + }, + }, + dddchashi: { + trigger: { global: "phaseUseBegin" }, + direct: true, + filter(event, player) { + return player != event.player && player.countCards("he") > 0; + }, + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + const valuableCards = target.getCards("hs", card => target.hasValueTarget(card)); + let result = yield player + .chooseToDiscard(get.prompt("dddchashi", target), "弃置一张牌,若其使用的下一张牌的花色或类型与此牌相同,你与其各摸一张牌", "he") + .set("logSkill", ["dddchashi", target]) + .set("ai", card => { + if (!get.event("goon")) return 0; + var list = get.event("list"); + return list[0].includes(get.suit(card)) || list[1].includes(get.type2(card)); + }) + .set("list", [valuableCards.map(card => get.suit(card)).toUniqued(), valuableCards.map(card => get.type2(card)).toUniqued()]) + .set("goon", get.attitude(player, target) > 0); + if (!result.bool) return event.finish(); + player.storage["dddchashi"] = [result.cards[0], target]; + player.addTempSkill("dddchashi_effect", "phaseUseAfter"); + target.addTempSkill("dddchashi_ai", { + player: ["phaseUseAfter", "useCard1"], + }); + }, + content_old() { + "step 0"; + var target = trigger.player, + history = target.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == trigger; + }); + event.target = target; + if (history.length > 0) { + var suit = get.suit(history[0].card); + event.suit = suit; + player + .chooseCard("he", get.prompt("dddchashi", target), "你可以展示一张牌。若此牌花色为" + get.translation(suit) + ",则" + get.translation(target) + "获得你展示的牌,然后你摸一张牌。") + .set("goon", get.sgn(get.attitude(player, target))) + .set("ai", function (card) { + if (_status.event.goon <= 0) return _status.event.goon * (get.value(card) + 0.01); + return 2 / Math.max(0.1, get.value(card)); + }); + } else event.goto(2); + "step 1"; + if (result.bool) { + player.logSkill("dddchashi", target); + var card = result.cards[0]; + player.showCards(card, get.translation(player) + "对" + get.translation(target) + "发动了【察势】"); + if (get.color(card) == event.suit) { + target.gain(card, player, "give"); + player.draw(); + } + } + event.finish(); + "step 2"; + player + .chooseCard("he", get.prompt("dddchashi", target), "你可以展示一张牌。若其本阶段内使用的第一张牌与此牌花色相同,则" + get.translation(target) + "获得你展示的牌,然后你摸一张牌。") + .set("goon", get.sgn(get.attitude(player, target))) + .set("ai", function (card) { + if (_status.event.goon <= 0) return _status.event.goon * (get.value(card) + 0.01); + return 2 / Math.max(0.1, get.value(card)); + }); + "step 3"; + if (result.bool) { + player.logSkill("dddchashi", target); + var card = result.cards[0]; + player.showCards(card, get.translation(player) + "对" + get.translation(target) + "发动了【察势】"); + player.addTempSkill("dddchashi_effect", "phaseUseAfter"); + player.addGaintag([card], "dddchashi"); + player.storage["dddchashi"] = [card, target]; + target.addTempSkill("dddchashi_ai", { + player: ["phaseUseAfter", "useCard1"], + }); + } + }, + subSkill: { + effect: { + trigger: { global: "useCard" }, + forced: true, + charlotte: true, + filter(event, player) { + var storage = player.getStorage("dddchashi"); + if (!storage || !storage.length) return false; + if (event.player != storage[1] || !event.player.isIn()) return false; + // if(!player.getCards('he').includes(storage[0])||!storage[0].hasGaintag('dddchashi')) return false; + if (get.suit(event.card) != get.suit(storage[0]) && get.type2(event.card) != get.type2(storage[0])) return false; + // var evt=event.getParent('phaseUse'); + // if(evt.player) + // if(event.player.getHistory('useCard',function(evtx){ + // return evtx.getParent('phaseUse')==evt; + // }).indexOf(event)!=0) return false; + return true; + }, + content() { + var storage = player.getStorage("dddchashi"); + // storage[1].gain(storage[0],player,'give'); + // player.draw(); + game.asyncDraw([player, storage[1]].sortBySeat(_status.currentPhase)); + player.removeSkill("dddchashi_effect"); + }, + onremove(player, storage) { + delete player.storage["dddchashi"]; + // player.removeGaintag('dddchashi'); + }, + }, + ai: { + charlotte: true, + }, + }, + }, + dddqice: { + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return !player.storage["dddqice"]; + }, + content() { + player.draw(2); + // player.addTempSkill('dddqice_effect'); + player.setStorage("dddqice", true); + player + .when("useCard1") + .filter(evt => get.type2(evt.card) == "trick") + .then(() => { + delete player.storage["dddqice"]; + }); + }, + subSkill: { + effect: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + content() { + "step 0"; + var list = []; + player.getHistory("useCard", function (evt) { + if (get.type(evt.card) == "trick") list.add(evt.card.name); + }); + list.sort(); + if (list.length > 0) { + player + .chooseButton(["齐策:是否视为使用一张牌?", [list, "vcard"]], function (button) { + return _status.event.player.hasUseTarget({ + name: button.link[2], + isCard: true, + }); + }) + .set("ai", function (button) { + var card = { + name: button.link[2], + nature: button.link[3], + isCard: true, + }, + player = _status.event.player; + return player.getUseValue(card); + }); + } else { + player.removeSkills("dddqice"); + event.finish(); + } + "step 1"; + if (result.bool) { + player.chooseUseTarget(true, { + name: result.links[0][2], + isCard: true, + }); + } + }, + }, + }, + }, + //甄姬 + dddmiaoxing: { + audio: 2, + trigger: { global: "gameDrawBegin" }, + forced: true, + content() { + var me = player; + var numx = trigger.num; + trigger.num = + typeof numx == "function" + ? function (player) { + if (player == me) { + return 3 * numx(player); + } + return numx(player); + } + : function (player) { + if (player == me) { + return 3 * numx; + } + return numx; + }; + player._dddmiaoxing = true; + }, + group: ["dddmiaoxing_out", "dddmiaoxing_balance"], + marktext: "水", + intro: { + name: "水相", + markcount(storage, player) { + return "" + player.getExpansions("dddmiaoxing_1").length + "/" + player.getExpansions("dddmiaoxing_2").length; + }, + mark(dialog, content, player) { + var content1 = player.getExpansions("dddmiaoxing_1"); + var content2 = player.getExpansions("dddmiaoxing_2"); + if ((content1 && content1.length) || (content2 && content2.length)) { + if (player == game.me || player.isUnderControl()) { + dialog.addText("第一组"); + dialog.addAuto(content1); + dialog.addText("第二组"); + dialog.addAuto(content2); + } else { + return "第一组“水相”有" + get.cnNumber(content1.length) + "张;" + "第二组“水相”有" + get.cnNumber(content2.length) + "张"; + } + } + }, + }, + subSkill: { + out: { + trigger: { + global: "phaseBefore", + }, + forced: true, + filter(event, player) { + return game.phaseNumber == 0 && player._dddmiaoxing; + }, + content() { + "step 0"; + delete player._dddmiaoxing; + var cardsx = player.getCards("h"), + num = Math.ceil(cardsx.length / 3); + var cards = [cardsx.slice(0, num), cardsx.slice(num, 2 * num), cardsx.slice(2 * num)]; + event.cards = cards; + player.chooseControl("第一组", "第二组", "第三组").set("dialog", ["淼形:选择一组作为你的手牌", '第一组', cards[0], '第二组', cards[1], '第三组', cards[2]]); + "step 1"; + event.cards.splice(result.index, 1); + var cards = event.cards; + player.addToExpansion(cards[0], player, "giveAuto", false).gaintag.add("dddmiaoxing_1"); + player.addToExpansion(cards[1], player, "giveAuto").gaintag.add("dddmiaoxing_2"); + player.markSkill("dddmiaoxing"); + }, + }, + balance: { + trigger: { player: "phaseDrawAfter" }, + forced: true, + content() { + "step 0"; + var forced = player.getExpansions("dddmiaoxing_1").length != player.countCards("h") && player.getExpansions("dddmiaoxing_2").length != player.countCards("h"); + var next = player.chooseButton([1, 2], ["淼形:将至少一组“水相”调整至与手牌数相等", [["第一组", "第二组"], "tdnodes"], '第一组', player.getExpansions("dddmiaoxing_1"), '第二组', player.getExpansions("dddmiaoxing_2")], forced); + next.set("filterButton", button => { + var type = typeof button.link; + return type != "object"; + }); + next.set("ai", button => { + var player = _status.event.player; + var ind = ["第一组", "第二组"].indexOf(button.link) + 1; + if (ind == -1) return -100; + return player.countCards("h") - player.getExpansions("dddmiaoxing_" + ind).length; + }); + "step 1"; + if (result.bool) { + var choices = result.links; + event.choices = choices; + // var hs=result.moved[0],sx1=result.moved[1],sx2=result.moved[2]; + // hs.removeArray(player.getCards('h')); + // sx1.removeArray(player.getExpansions('dddmiaoxing_1')); + // sx2.removeArray(player.getExpansions('dddmiaoxing_2')); + // if(!hs.length&&!sx1.length&&!sx2.length) return; + // player.gain(hs,'gain2'); + // player.addToExpansion(sx1,player,'giveAuto').gaintag.add('dddmiaoxing_1'); + // player.addToExpansion(sx2,player,'giveAuto').gaintag.add('dddmiaoxing_2'); + } else event.finish(); + "step 2"; + if (event.choices.includes("第一组")) { + var del = player.countCards("h") - player.getExpansions("dddmiaoxing_1").length; + if (del >= 0) { + if (del != 0) player.addToExpansion(get.cards(del), player, "draw").gaintag.add("dddmiaoxing_1"); + event.goto(4); + } else { + player.chooseButton(["淼形:移除" + get.cnNumber(-del) + "张第一组的“水相”", player.getExpansions("dddmiaoxing_1")], -del, true).set("ai", button => { + return -get.buttonValue(button); + }); + } + } + "step 3"; + if (result.bool) { + player.loseToDiscardpile(result.links); + } + "step 4"; + player.markSkill("dddmiaoxing"); + if (event.choices.includes("第二组")) { + var del = player.countCards("h") - player.getExpansions("dddmiaoxing_2").length; + if (del >= 0) { + if (del != 0) player.addToExpansion(get.cards(del), player, "draw").gaintag.add("dddmiaoxing_2"); + event.goto(6); + } else { + player.chooseButton(["淼形:移除" + get.cnNumber(-del) + "张第二组的“水相”", player.getExpansions("dddmiaoxing_2")], -del, true).set("ai", button => { + return -get.buttonValue(button); + }); + } + } + "step 5"; + if (result.bool) { + player.loseToDiscardpile(result.links); + } + "step 6"; + player.markSkill("dddmiaoxing"); + }, + }, + }, + }, + dddfushi: { + audio: 2, + trigger: { player: ["useCardAfter", "respondAfter"] }, + filter(event, player) { + return get.type(event.card) == "basic" && !player.hasSkill("dddfushi_used"); + }, + direct: true, + content() { + "step 0"; + player + .chooseControl("第一组", "第二组", "cancel2") + .set("dialog", [get.prompt("dddfushi"), '用所有手牌交换一组“水相”', '第一组', player.getExpansions("dddmiaoxing_1"), '第二组', player.getExpansions("dddmiaoxing_2")]) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var fn = player == _status.currentPhase ? "useful" : "value"; + var list = [ + [1, player.getExpansions("dddmiaoxing_1").reduce((p, c) => p + get[fn](c), 0)], + [2, player.getExpansions("dddmiaoxing_2").reduce((p, c) => p + get[fn](c), 0)], + [3, player.getCards("h").reduce((p, c) => p + get[fn](c), 0)], + ].sort((a, b) => b[1] - a[1]); + return list[0][0] - 1; + })() + ); + "step 1"; + if (result.control == "cancel2") event.finish(); + else { + player.logSkill("dddfushi"); + player.addTempSkill("dddfushi_used"); + var index = result.index + 1; + player.addToExpansion(player.getCards("h"), player, "giveAuto").gaintag.add("dddmiaoxing_" + index); + player.gain(player.getExpansions("dddmiaoxing_" + index), "draw"); + game.log(player, "获得了" + get.cnNumber(player.getExpansions("dddmiaoxing_" + index).length) + "张“水相”"); + } + "step 2"; + player.markSkill("dddmiaoxing"); + player + .chooseTarget("是否令一名男性角色选择是否交换“水相”?", (card, player, target) => { + return target.hasSex("male"); + }) + .set("ai", target => get.attitude(_status.event.player, target)); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target); + target + .chooseControl("第一组", "第二组", "cancel2") + .set("dialog", ["浮世:是否用所有手牌交换一组“水相”?", '第一组', player.getExpansions("dddmiaoxing_1"), '第二组', player.getExpansions("dddmiaoxing_2")]) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var fn = target == _status.currentPhase ? "useful" : "value"; + var list = [ + [1, player.getExpansions("dddmiaoxing_1").reduce((p, c) => p + get[fn](c), 0)], + [2, player.getExpansions("dddmiaoxing_2").reduce((p, c) => p + get[fn](c), 0)], + [3, target.getCards("h").reduce((p, c) => p + get[fn](c), 0)], + ].sort((a, b) => b[1] - a[1]); + return list[0] - 1; + })() + ); + } else event.finish(); + "step 4"; + if (result.control == "cancel2") event.finish(); + else { + var index = result.index + 1; + player.addToExpansion(target.getCards("h"), target, "giveAuto").gaintag.add("dddmiaoxing_" + index); + target.gain(player.getExpansions("dddmiaoxing_" + index), player, "giveAuto"); + } + "step 5"; + player.markSkill("dddmiaoxing"); + }, + subSkill: { + used: { charlotte: true }, + }, + }, + //赵昂 + dddfenji: { + audio: 2, + trigger: { player: ["phaseDrawBegin1", "phaseDiscardBegin"] }, + direct: true, + filter(event, player) { + if (event.name == "phaseDraw" && event.numFixed) return false; + return lib.inpile.filter(i => get.type(i) == "trick").removeArray(player.getStorage("dddfenji")).length > 0; + }, + content() { + "step 0"; + var cards = lib.inpile + .filter(i => { + return get.type(i) == "trick" && !player.getStorage("dddfenji").includes(i); + }) + .map(i => ["锦囊", "", i]); + player + .chooseButton([get.prompt("dddfenji"), [cards, "vcard"]]) + .set("ai", button => { + var evt = _status.event.getTrigger(); + if (evt.name == "phaseDraw") { + if (!get.tag({ name: button.link[2] }, "damage")) return 0; + } else { + if ( + lib.skill.xunshi.isXunshi({ + name: button.link[2], + }) + ) + return 0; + } + return _status.event.player.getUseValue({ + name: button.link[2], + }); + }) + .set("filterButton", button => { + return player.hasUseTarget(button.link[2]); + }); + "step 1"; + if (result.bool) { + player.logSkill("dddfenji"); + player.markAuto("dddfenji", [result.links[0][2]]); + player.chooseUseTarget(result.links[0][2], true); + } else event.finish(); + "step 2"; + if (trigger.name == "phaseDraw") { + trigger.changeToZero(); + var num = 0; + game.filterPlayer(current => { + current.getHistory("sourceDamage", evt => { + if (evt.getParent(4) == event) num += evt.num; + }); + }); + if (num > 0) player.draw(num); + } else { + trigger.cancel(); + var num = 0; + player.getHistory("useCard", evt => { + if (evt.getParent(2) == event) num = evt.targets.length; + }); + if (num > 0 && player.countCards("he")) player.chooseToDiscard(num, true); + } + }, + }, + //周处 + dddxiaheng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + onremove: ["dddxiaheng", "dddxiaheng_del"], + intro: { content: "已因此技能对$造成过伤害" }, + content() { + "step 0"; + event.targets = []; + player.chooseTarget("侠横:令一名角色弃置两张牌", true).set("ai", target => { + var player = _status.event.player, + eff = get.effect(target, { name: "guohe_copy2" }, player, player), + eff2 = get.damageEffect(target, player, player); + if (player.storage["dddxiaheng_del"]) return eff; + var toself = false; + if (eff2 > eff * 2) { + toself = !player.isDamaged() && player.countCards("he", card => get.value(card, player) < 5) >= 2; + } + if (toself) return target == player ? 100 : 0; + return eff * (eff2 > eff * 2 ? 0.5 : 1.5); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.targets.add(target); + player.line(target); + target.chooseToDiscard(2, true, "he"); + } + "step 2"; + player + .chooseTarget("侠横:对一名角色造成1点伤害", true) + .set("ai", target => { + var player = _status.event.player, + eff = get.damageEffect(target, player, player), + targetx = _status.event.targetx; + if (player.storage["dddxiaheng_del"]) return eff; + var fix = player.getStorage("dddxiaheng").includes(target) ? 0.75 : 1; + if (target == player && targetx != player && player.isHealthy() && !player.getStorage("dddxiaheng").includes(player) && player.hp > 2) return 100; + return eff * (player.hp == 1 || target == targetx ? 0.1 : 1) * fix; + }) + .set("targetx", targets[0]); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + event.targets.add(target); + player.line(target); + target.damage(); + player.markAuto("dddxiaheng", [target]); + } + "step 4"; + if (player.storage["dddxiaheng_del"]) event.finish(); + else { + if (!targets.includes(player)) player.loseMaxHp(); + if (targets.length == 1) { + player.removeSkills("dddxiaheng"); + } + } + "step 5"; + if (player.getStorage("dddxiaheng").length >= 3) { + player.storage["dddxiaheng_del"] = true; + } + }, + }, + //刘巴 + dddfengzheng: { + audio: 2, + global: "dddfengzheng_global", + trigger: { + global: "roundStart", + }, + filter(event, player) { + return game.hasPlayer(current => { + var history = current.actionHistory; + for (var i = history.length - 2; i >= 0; i--) { + var evts = history[i].useSkill; + for (var evt of evts) { + if (evt.skill == "dddfengzheng_global") return true; + } + if (history[i].isRound) break; + } + return false; + }); + }, + prompt2(event, player) { + var num = game.countPlayer(current => { + var history = current.actionHistory; + for (var i = history.length - 2; i >= 0; i--) { + var evts = history[i].useSkill; + for (var evt of evts) { + if (evt.skill == "dddfengzheng_global") return true; + } + if (history[i].isRound) break; + } + return false; + }); + return "观看并分配牌堆顶的" + get.cnNumber(num) + "张牌"; + }, + content() { + "step 0"; + var num = game.countPlayer(current => { + var history = current.actionHistory; + for (var i = history.length - 2; i >= 0; i--) { + var evts = history[i].useSkill; + for (var evt of evts) { + if (evt.skill == "dddfengzheng_global") return true; + } + if (history[i].isRound) break; + } + return false; + }); + var cards = game.cardsGotoOrdering(get.cards(num)).cards; + event.cards = cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + "step 1"; + if (event.cards.length > 1) { + player.chooseCardButton("丰政:请选择要分配的牌", true, event.cards, [1, event.cards.length]).set("ai", function (button) { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + } else if (event.cards.length == 1) + event._result = { + links: event.cards.slice(0), + bool: true, + }; + else event.finish(); + "step 2"; + if (result.bool) { + event.cards.removeArray(result.links); + event.togive = result.links.slice(0); + player + .chooseTarget("选择一名角色获得" + get.translation(result.links), true) + .set("ai", function (target) { + var fix = (_status.event.getParent().given_map[target.playerid] || 0) + 1; + var att = get.attitude(_status.event.player, target) / Math.sqrt(fix); + if (_status.event.enemy) return -att; + else if (att > 0) return att / (1 + target.countCards("h")); + else return att / 100; + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + } + "step 3"; + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; + map[id].addArray(event.togive); + } + if (cards.length > 0) event.goto(1); + "step 4"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var list = [], + lose = false; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + list.push([source, event.given_map[i]]); + if (event.given_map[i].length > 2) lose = true; + } + game.loseAsync({ + gain_list: list, + giver: player, + animate: "draw", + }).setContent("gaincardMultiple"); + if (!lose) event.finish(); + "step 5"; + player.removeSkills("dddfengzheng"); + }, + subSkill: { + global: { + audio: "dddfengzheng", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.hasPlayer(current => current.hasSkill("dddfengzheng")); + }, + filterCard(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() { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); + } + return num == 13; + }, + popname: true, + complexCard: true, + prompt: "将任意张点数和为13的手牌当【无中生有】使用", + check(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: "hs", + viewAs: { name: "wuzhong" }, + }, + }, + }, + dddyulv: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + group: "dddyulv_enter", + content() { + "step 0"; + player.draw(); + "step 1"; + if (!player.countCards("he")) event.finish(); + else player.chooseCard("玉律:将一张牌置于武将牌上", true); + "step 2"; + if (result.bool) { + player.addToExpansion(result.cards, player, "give").gaintag.add("dddyulv"); + } + }, + marktext: "律", + intro: { + markcount: "expansion", + content: "expansion", + }, + subSkill: { + enter: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + forced: true, + direct: true, + filter(event, player) { + var cards = event.getd(); + if (!cards.length) return false; + const card = player.getExpansions("dddyulv")[0]; + if (!card) return false; + const number = get.number(card, false); + if (!_status.currentPhase || !_status.currentPhase.isIn()) return false; + return cards.some(i => get.number(i, false) == number); + }, + content() { + "step 0"; + player + .chooseControl("摸牌", "弃牌") + .set("prompt", "玉律:令" + get.translation(_status.currentPhase) + "摸一张牌或弃置一张牌") + .set("ai", () => { + return get.attitude(_status.event.player, _status.currentPhase) > 0 ? "摸牌" : "弃牌"; + }); + "step 1"; + player.logSkill("dddyulv_enter", _status.currentPhase); + var reset = false; + if (result.index == 0) _status.currentPhase.draw(); + else _status.currentPhase.chooseToDiscard(true, "he"); + var reset = + player.getHistory("useSkill", evt => { + return evt.skill == "dddyulv_enter"; + }).length == 2; + if (!reset) event.finish(); + "step 2"; + if (!player.countCards("h")) player.draw(); + "step 3"; + if (!player.countCards("h")) event.finish(); + else player.chooseCard("玉律:选择一张手牌交换“玉律”(" + get.translation(player.getExpansions("dddyulv")) + ")", true); + "step 4"; + if (result.bool) { + player.gain(player.getExpansions("dddyulv"), player, "give"); + player.addToExpansion(result.cards, player, "log", "give").gaintag.add("dddyulv"); + } + }, + }, + }, + }, + dddyulv_old: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + group: "dddyulv_old_enter", + content() { + "step 0"; + player + .chooseControl(Array.from({ length: 13 }, (_, i) => get.strNumber(i + 1))) + .set("prompt", "玉律:声明一个点数") + .set("ai", () => _status.event.controls.randomGet()); + "step 1"; + player.popup(result.control); + var number = result.index + 1; + player.storage["dddyulv_old"] = number; + player.markSkill("dddyulv_old"); + }, + intro: { + content: "声明的点数为#", + }, + subSkill: { + enter: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + forced: true, + direct: true, + filter(event, player) { + var cards = event.getd(); + if (!cards.length || !player.storage["dddyulv_old"]) return false; + if (!_status.currentPhase || !_status.currentPhase.isIn()) return false; + return cards.some(i => get.number(i, false) == player.storage["dddyulv_old"]); + }, + content() { + "step 0"; + player + .chooseControl("摸牌", "弃牌") + .set("prompt", "玉律:令" + get.translation(_status.currentPhase) + "摸一张牌或弃置一张牌") + .set("ai", () => { + return get.attitude(_status.event.player, _status.currentPhase) > 0 ? "摸牌" : "弃牌"; + }); + "step 1"; + player.logSkill("dddyulv_old_enter", _status.currentPhase); + var reset = false; + if (result.index == 0) _status.currentPhase.draw(); + else _status.currentPhase.chooseToDiscard(true, "he"); + if (_status.currentPhase.hasSkill("dddyulv_old_" + result.index)) reset = true; + _status.currentPhase.removeSkill("dddyulv_old_0"); + _status.currentPhase.removeSkill("dddyulv_old_1"); + _status.currentPhase.addSkill("dddyulv_old_" + result.index); + if (!reset) event.finish(); + "step 2"; + player + .chooseControl(Array.from({ length: 13 }, (_, i) => get.strNumber(i + 1))) + .set("prompt", "玉律:重新声明一个点数") + .set("ai", () => _status.event.controls.randomGet()); + "step 3"; + player.popup(result.control); + var number = result.index + 1; + player.storage["dddyulv_old"] = number; + player.markSkill("dddyulv_old"); + "step 4"; + 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); + } + }, + }, + 0: { charlotte: true }, + 1: { charlotte: true }, + }, + }, + //蹇硕 + dddfenye: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return player.canCompare(target); + }, + filter(event, player) { + return player.countCards("h") > 0; + }, + content() { + "step 0"; + player.chooseToCompare([target]).setContent(lib.skill["dddfenye"].chooseToCompareFenye); + "step 1"; + result.winner.forEach(i => i.addExpose(0.05)); + result.loser.forEach(i => i.addExpose(0.05)); + if (result.winner.length && result.loser.length) { + var players = result.winner; + event.players = players.sortBySeat(); + event.targets = result.loser; + } else event.finish(); + "step 2"; + var current = event.players.shift(); + event.current = current; + current + .chooseTarget("是否视为对一名没赢的角色使用一张【杀】?", (card, player, target) => { + return player.canUse("sha", target, false) && _status.event.targets.includes(target); + }) + .set("ai", target => { + return get.effect(target, { name: "sha" }, get.player(), get.player()); + }) + .set("targets", event.targets); + "step 3"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + var target = result.targets[0]; + event.current.useCard({ name: "sha", isCard: true }, target, false); + event.targets.remove(target); + } + if (event.targets.length && event.players.length) event.goto(2); + }, + chooseToCompareFenye() { + "step 0"; + var target = event.targets[0]; + event.targets.unshift(player); + event.targetx = target; + if (player.countCards("h") == 0 || target.countCards("h") == 0) { + event.result = { cancelled: true, bool: false }; + event.finish(); + return; + } + game.log(player, "对", target, "发起拼点"); + "step 1"; + var send = function (targets) { + var next = game.createEvent("dddfenye_choose", false); + // next.player=game.me; + next.targets = targets; + next.ai = event.ai; + next.fixedResult = event.fixedResult; + next.setContent(lib.skill["dddfenye"].contentx); + game.resume(); + }; + var sendback = function (result, player) { + if (!Array.isArray(result)) { + result = [null, null]; + } + event.results.push([player, result]); + }; + event.ai_targets = []; + event.results = []; + var players = game.filterPlayer().sortBySeat(); + var time = 10000; + if (lib.configOL && lib.configOL.choose_timeout) time = parseInt(lib.configOL.choose_timeout) * 1000; + for (var i = 0; i < players.length; i++) { + players[i].showTimer(time); + if (players[i].isOnline()) { + event.withol = true; + players[i].send(send, targets); + players[i].wait(sendback); + } else if (players[i] == game.me) { + event.withme = true; + var next = game.createEvent("dddfenye_choose", false); + next.player = game.me; + next.targets = targets; + next.ai = event.ai; + next.fixedResult = event.fixedResult; + next.setContent(lib.skill["dddfenye"].contentx); + if (_status.connectMode) game.me.wait(sendback); + } else { + event.ai_targets.push(players[i]); + } + } + if (event.ai_targets.length) { + for (var i = 0; i < event.ai_targets.length; i++) { + if (targets.includes(event.ai_targets[i])) { + var target = event.ai_targets[i]; + var cards = target.getCards("h").sort((a, b) => { + return event.ai(b) - event.ai(a); + }); + sendback([target, cards[0]], target); + event.ai_targets.splice(i--, 1); + } + } + if (event.ai_targets.length) { + event.ai_targets.randomSort(); + setTimeout(function () { + event.interval = setInterval( + function () { + var target = event.ai_targets.shift(); + var cards = target + .getCards("h", card => get.value(card) < 4) + .sort((a, b) => { + return event.ai(b) - event.ai(a); + }); + if (!cards.length) { + sendback([null, null], target); + } else { + if (Math.abs(get.number(cards[0]) - 7) <= 2) { + sendback([null, null], target); + } else { + var sgn = get.number(cards[0]) >= 7 ? 1 : -1; + var targetsx = targets.slice().sort((a, b) => { + var attA = get.attitude(target, a), + attB = get.attitude(target, b); + return sgn * (attB - attA); + }); + sendback([targetsx[0], cards[0]], target); + } + } + if (!event.ai_targets.length) { + clearInterval(event.interval); + if (event.withai) game.resume(); + } + }, + _status.connectMode ? 750 : 75 + ); + }, 500); + } + } + "step 2"; + if (event.withme) { + if (_status.connectMode) game.me.unwait(result, game.me); + else { + if (!Array.isArray(result)) { + result = [null, null]; + } + event.results.push([game.me, result]); + } + } + "step 3"; + if (event.withol && !event.resultOL) { + game.pause(); + } + "step 4"; + if (event.ai_targets.length > 0) { + event.withai = true; + game.pause(); + } + "step 5"; + delete event._global_waiting; + for (var i of game.players) i.hideTimer(); + var cards = []; + var targets = []; + var lose_list = []; + event.results.sort((a, b) => lib.sort.seat(a[0], b[0])); + for (var res of event.results) { + var target = res[0], + card = res[1][1], + skill = res[1][2]; + if (!target || !card) continue; + if (skill && lib.skill[skill] && lib.skill[skill].onCompare) { + target.logSkill(skill); + res[1][1] = lib.skill[skill].onCompare(target); + if (target != player) cards.push(res[1][1]); + } else { + if (target != player) cards.push(card); + lose_list.push([target, [card]]); + } + if (target != player) targets.push(target); + } + if (lose_list.length) { + game.loseAsync({ + lose_list: lose_list, + }).setContent("chooseToCompareLose"); + } + event.lose_list = lose_list; + event.getNum = function (card) { + for (var i of event.lose_list) { + if (i[1].includes && i[1].includes(card)) return get.number(card, i[0]); + } + return get.number(card, false); + }; + event.cardlist = cards; + event.cards = cards; + event.card1 = event.results[0][1][1]; + event.num1 = event.getNum(event.card1); + event.iwhile = 0; + event.targets = targets; + event.tempplayer = event.player; + event.players = event.results.filter(i => i[1][0] == player && i[1][1]).map(i => i[0]); + event.targetsx = event.results.filter(i => i[1][0] == event.targetx && i[1][1]).map(i => i[0]); + event.result = { + player: event.card1, + targets: event.cardlist.slice(0), + num1: [event.num1], + num2: [], + winner: [], + loser: [], + }; + game.log(player, "的拼点牌为", event.card1); + "step 6"; + event.target = null; + event.trigger("compare"); + lib.skill["dddfenye"].$compareFenye( + event.players, + event.results.filter(i => i[1][0] == player).map(i => i[1][1]), + event.targetsx, + event.results.filter(i => i[1][0] == event.targetx).map(i => i[1][1]) + ); + "step 7"; + if (event.iwhile < targets.length) { + event.target = targets[event.iwhile]; + event.target.addTempClass("target"); + event.card2 = event.cardlist[event.iwhile]; + event.num2 = event.getNum(event.card2); + game.log(event.target, "的拼点牌为", event.card2); + delete event.player; + event.trigger("compare"); + } else { + game.delay(0, 1000); + event.goto(9); + } + "step 8"; + var key = event.players.includes(target) ? "num1" : "num2"; + event.result[key].push(event.num2); + event.iwhile++; + event.goto(7); + "step 9"; + event.player = event.tempplayer; + delete event.tempplayer; + var str; + var num1 = event.result.num1.reduce((p, c) => p + c, 0) / event.result.num1.length, + num2 = event.result.num2.reduce((p, c) => p + c, 0) / event.result.num2.length; + game.log(event.player, "方的点数均值为", "#y" + Math.floor(num1 * 100) / 100); + game.log(event.targetx, "方的点数均值为", "#y" + Math.floor(num2 * 100) / 100); + if (num1 > num2) { + str = get.translation(event.players) + "拼点成功"; + event.players.forEach(i => i.popup("胜")); + event.targetsx.forEach(i => i.popup("负")); + event.result.winner = event.players; + event.result.loser = event.targetsx; + } else { + str = get.translation(event.players) + "拼点失败"; + if (num1 == num2) { + event.players.forEach(i => i.popup("平")); + event.targetsx.forEach(i => i.popup("平")); + event.result.loser = event.players.addArray(event.targetsx); + } else { + event.players.forEach(i => i.popup("负")); + event.targetsx.forEach(i => i.popup("胜")); + event.result.winner = event.targetsx; + event.result.loser = event.players; + } + } + game.broadcastAll(function (str) { + var dialog = ui.create.dialog(str); + dialog.classList.add("center"); + setTimeout(function () { + dialog.close(); + }, 1000); + }, str); + game.delay(3); + ("step 10"); + game.broadcastAll(ui.clear); + ("step 11"); + event.cards.add(event.card1); + }, + contentx() { + "step 0"; + var player = game.me; + event.player = player; + event._global_waiting = true; + event.result = []; + if (targets.includes(player)) { + if (event.fixedResult && event.fixedResult[player.playerid]) { + event.result[0] = player; + event.result[1] = event.fixedResult[player.playerid]; + event.finish(); + } else player.chooseCard("请选择拼点牌", true).set("type", "compare").set("glow_result", true).set("_global_waiting", true).ai = event.ai; + } else { + player.chooseCardTarget({ + targets: targets, + filterTarget(card, player, target) { + return _status.event.targets.includes(target); + }, + selectCard: 1, + prompt: "是否于此次拼点加入其中一方?", + position: "h", + _global_waiting: true, + ai1: event.ai, + ai2(target) { + var player = _status.event.player, + sgn = -1; + if (player.hasCard(card => get.number(card) > 10 && get.value(card) < 5)) sgn = 1; + return sgn * get.attitude(player, target); + }, + }); + } + "step 1"; + if (targets.includes(player)) { + event.result[0] = player; + event.result[1] = result.cards[0]; + event.result[2] = result.skill; + } else { + if (result.bool) { + event.result[0] = result.targets[0]; + event.result[1] = result.cards[0]; + } else { + event.result = [null, null]; + } + } + }, + $compareFenye(players, cards1, targets, cards2) { + game.broadcast( + function (players, cards1, targets, cards2) { + lib.skill["dddfenye"].$compareFenye(players, cards1, targets, cards2); + }, + players, + cards1, + targets, + cards2 + ); + var left0 = -players.length * 52 - (players.length - 1) * 8; + for (var i = 0; i < players.length; i++) { + (function (target, card1, i) { + var left = left0 + i * 120; + var node1; + if (left < 0) { + node1 = target.$throwxy2(card1, "calc(50% - " + -left + "px)", "calc(50% + 10px)", "perspective(600px) rotateY(180deg)", true); + } else { + node1 = target.$throwxy2(card1, "calc(50% + " + left + "px)", "calc(50% + 10px)", "perspective(600px) rotateY(180deg)", true); + } + if (lib.config.cardback_style != "default") { + node1.style.transitionProperty = "none"; + ui.refresh(node1); + node1.classList.add("infohidden"); + ui.refresh(node1); + node1.style.transitionProperty = ""; + } else { + node1.classList.add("infohidden"); + } + node1.style.transform = "perspective(600px) rotateY(180deg) translateX(0)"; + var onEnd02 = function () { + node1.removeEventListener("webkitTransitionEnd", onEnd02); + setTimeout(function () { + node1.style.transition = "all ease-in 0.3s"; + node1.style.transform = "perspective(600px) rotateY(270deg) translateX(52px)"; + var onEnd = function () { + node1.classList.remove("infohidden"); + node1.style.transition = "all 0s"; + ui.refresh(node1); + node1.style.transform = "perspective(600px) rotateY(-90deg) translateX(52px)"; + ui.refresh(node1); + node1.style.transition = ""; + ui.refresh(node1); + node1.style.transform = ""; + node1.removeEventListener("webkitTransitionEnd", onEnd); + }; + node1.listenTransition(onEnd); + }, 200); + }; + node1.listenTransition(onEnd02); + })(players[i], cards1[i], i); + } + setTimeout(function () { + var left0 = -targets.length * 52 - (targets.length - 1) * 8; + for (var i = 0; i < targets.length; i++) { + (function (target, card2, i) { + var left = left0 + i * 120; + var node2; + if (left < 0) { + node2 = target.$throwxy2(card2, "calc(50% - " + -left + "px)", "calc(50% - 114px)", "perspective(600px) rotateY(180deg)", true); + } else { + node2 = target.$throwxy2(card2, "calc(50% + " + left + "px)", "calc(50% - 114px)", "perspective(600px) rotateY(180deg)", true); + } + if (lib.config.cardback_style != "default") { + node2.style.transitionProperty = "none"; + ui.refresh(node2); + node2.classList.add("infohidden"); + ui.refresh(node2); + node2.style.transitionProperty = ""; + } else { + node2.classList.add("infohidden"); + } + node2.style.transform = "perspective(600px) rotateY(180deg) translateX(0)"; + var onEnd02 = function () { + node2.removeEventListener("webkitTransitionEnd", onEnd02); + setTimeout(function () { + node2.style.transition = "all ease-in 0.3s"; + node2.style.transform = "perspective(600px) rotateY(270deg) translateX(52px)"; + var onEnd = function () { + node2.classList.remove("infohidden"); + node2.style.transition = "all 0s"; + ui.refresh(node2); + node2.style.transform = "perspective(600px) rotateY(-90deg) translateX(52px)"; + ui.refresh(node2); + node2.style.transition = ""; + ui.refresh(node2); + node2.style.transform = ""; + node2.removeEventListener("webkitTransitionEnd", onEnd); + }; + node2.listenTransition(onEnd); + }, 200); + }; + node2.listenTransition(onEnd02); + })(targets[i], cards2[i], i); + } + }, 200); + }, + ai: { + order: 1, + result: { + target: -1, + }, + threaten: 1.3, + }, + }, + dddshichao: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + }, + filter(event, player) { + return player.countMark("dddshichao") + 1 <= game.countPlayer(); + }, + onremove: true, + forced: true, + content() { + "step 0"; + var N = player.countMark("dddshichao") + 1; + player + .chooseTarget("逝潮:选择一名手牌数第" + get.cnNumber(N) + "大的角色", true, (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set("ai", target => { + var zhu = get.zhu(player) || game.filterPlayer(i => i.getSeatNum() == 1)[0]; + return Math.min(target.countCards("h") - player.countCards("h"), zhu.maxHp - player.countCards("h")); + }) + .set( + "targets", + (function () { + var list = game + .filterPlayer() + .map(i => [i, i.countCards("h")]) + .sort((a, b) => b[1] - a[1]); + var targets = []; + var ind = 0, + tmp = Infinity; + for (var i of list) { + if (i[1] < tmp) { + ind++; + tmp = i[1]; + } + if (ind == N) { + targets.push(i[0]); + } + if (ind > N) break; + } + if (!targets.length) targets = game.filterPlayer(i => i.countCards("h") == list[list.length - 1][1]); + return targets; + })() + ); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddshichao", target); + var zhu = get.zhu(player) || game.filterPlayer(i => i.getSeatNum() == 1)[0]; + var del = Math.min(target.countCards("h") - player.countCards("h"), zhu.maxHp - player.countCards("h")); + if (del > 0) player.draw(del); + if (del < 0) player.chooseToDiscard(-del, true); + target.addSkill("dddshichao_up"); + target.markAuto("dddshichao_up", [player]); + player.addTempSkill("dddshichao_clear", { + player: "phaseBegin", + }); + player.markAuto("dddshichao_clear", [target]); + } + }, + subSkill: { + up: { + trigger: { source: "damageBegin2" }, + filter(event, player) { + return player.getStorage("dddshichao_up").includes(event.player); + }, + charlotte: true, + check(event, player) { + var eff = get.damageEffect(event.player, player, player); + return (event.player.hasSkill("dddshichao") && eff < 0) || (event.num == 1 && eff < 13); + }, + logTarget: "player", + content() { + "step 0"; + trigger.cancel(); + if (trigger.player.hasSkill("dddshichao")) { + trigger.player.addMark("dddshichao", 1, false); + } + }, + }, + clear: { + charlotte: true, + onremove(player) { + game.filterPlayer(current => { + current.unmarkAuto("dddshichao_up", [player]); + }); + }, + }, + }, + }, + //管宁 + dddyouxue: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + content() { + "step 0"; + if (!game.hasPlayer(current => current.hasMark("dddyouxue"))) player.addMark("dddyouxue"); + if (!game.hasPlayer(current => !current.hasMark("dddyouxue"))) event.finish(); + "step 1"; + player + .chooseTarget("游学:将“游学”标记交给另一名角色", true, (card, player, target) => { + return !target.hasMark("dddyouxue"); + }) + .set("ai", target => { + return get.distance( + game.findPlayer(current => current.hasMark("dddyouxue")), + target + ); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + var source = game.findPlayer(current => current.hasMark("dddyouxue")); + if (source == player) player.line(target, "green"); + else player.line2([source, target], "green"); + source.clearMark("dddyouxue"); + target.addMark("dddyouxue"); + player.draw(get.distance(source, target)); + } + }, + marktext: "游", + intro: { + name: "游学", + content: () => get.translation(game.filterPlayer(current => current.hasSkill("dddyouxue"))) + "到此一游", + }, + }, + dddchengjing: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter(event, player) { + if (!event.player.hasMark("dddyouxue")) return false; + return event.player.hasHistory("useCard", evt => { + if (!["basic", "trick"].includes(get.type(evt.card))) return false; + if (!evt.card.isCard || evt.cards.length != 1) return false; + return get.position(evt.cards[0], true) == "d"; + }); + }, + forced: true, + locked: false, + group: "dddchengjing_use", + logTarget: "player", + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + let history = target.getHistory("useCard").reverse(); + let cards = []; + for (var evt of history) { + if (!["basic", "trick"].includes(get.type(evt.card))) continue; + if (!evt.card.isCard || evt.cards.length != 1) continue; + if (get.position(evt.cards[0], true) == "d") { + cards.addArray(evt.cards); + break; + } + } + const jing = player.getExpansions("dddchengjing"); + if (jing.length) player.loseToDiscardpile(jing); + player.addToExpansion(cards, "log", "gain2").gaintag.add("dddchengjing"); + }, + marktext: "经", + intro: { + name: "经(承经)", + name2: "经", + markcount: "expansion", + content: "expansion", + }, + subSkill: { + use: { + audio: "dddchengjing", + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "hes", + filter(event, player) { + return player.getExpansions("dddchengjing").length > 0; + }, + viewAs(cards, player) { + const card = player.getExpansions("dddchengjing")[0]; + return new lib.element.VCard({ + name: get.name(card, false), + nature: get.nature(card, false), + storage: { dddchengjing: true }, + }); + }, + popname: true, + prompt() { + const card = get.player().getExpansions("dddchengjing")[0]; + return ( + "将一张牌当" + + get.translation({ + name: get.name(card, false), + nature: get.nature(card, false), + }) + + "使用" + ); + }, + precontent() { + player + .when("useCardAfter") + .filter(evt => evt.card.storage.dddchengjing) + .then(() => { + var cards = trigger.cards.filterInD("od"); + if (!cards.length) { + event.finish(); + return; + } + var target = game.findPlayer(current => current.hasMark("dddyouxue")); + if (!target) { + event.finish(); + return; + } + target = target.getNext(); + event.target = target; + player.chooseBool(`承经:是否将${get.translation(cards)}交给${get.translation(target)}?`).set("choice", get.attitude(player, target) > 0); + }) + .then(() => { + if (result.bool) { + player.line(event.target); + player.addExpose(0.1); + event.target.gain(trigger.cards.filterInD("od"), "gain2"); + } + }); + }, + }, + }, + ai: { + combo: "dddyouxue", + }, + }, + dddyouxue_old: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + content() { + "step 0"; + var vpos = player.hasMark("dddyouxue_old") ? game.filterPlayer2(i => i.getSeatNum() == player.countMark("dddyouxue_old"))[0] : player; + event.vpos = vpos; + player + .chooseTarget("游学:选择你的行动次序", true) + .set("ai", target => { + return get.distance(_status.event.vpos, target); + }) + .set("vpos", vpos); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + if (event.vpos == player) player.line(target, "green"); + else player.line2([event.vpos, target], "green"); + event.num = get.distance(event.vpos, target); + player.storage["dddyouxue_old"] = target.getSeatNum(); + player.addSkill("dddyouxue_old_act"); + player.markSkill("dddyouxue_old"); + } else event.finish(); + "step 2"; + var next = player.phaseDraw(); + next.set("num", num); + delete next.skill; + "step 3"; + player.skip("phaseDraw"); + }, + marktext: "虚", + intro: { + name: "虚位", + content: "当前虚位为#号", + }, + subSkill: { + act: { + trigger: { + global: ["phaseBefore", "phaseAfter", "phaseYouxueed"], + }, + forced: true, + firstDo: true, + charlotte: true, + filter(event, player, name) { + if (event.skill) return false; + var vseat = player.countMark("dddyouxue_old"); + if (name != "phaseBefore") { + if (player.hasSkill("dddyouxue_old_acted", null, false, false)) return false; + var seat = event.player.getSeatNum(); + var next = event.player.next; + if (!game.players.includes(next)) next = game.findNext(next); + var seat2 = next.getSeatNum(); + if (seat == seat2) return false; + if (seat < seat2) return vseat > seat && vseat <= seat2; + return seat2 >= vseat; + } else { + return event.player == player; + } + }, + content() { + if (event.triggername == "phaseBefore") { + trigger.finish(); + trigger.untrigger(true); + trigger._triggered = 5; + trigger.trigger("phaseYouxueed"); + } else { + player.insertPhase("dddyouxue_old_act"); + player.addTempSkill("dddyouxue_old_acted", "roundStart"); + } + }, + }, + acted: { charlotte: true }, + }, + }, + dddchengjing_old: { + audio: 2, + usable: 1, + enable: "phaseUse", + filter(event, player) { + return player.countCards("hes") > 0 && player.countMark("dddyouxue_old") > 0 && lib.skill["dddchengjing_old"].getList(player).length > 0; + }, + getList(player) { + var vpos = player.hasMark("dddyouxue_old") ? game.filterPlayer2(i => i.getSeatNum() == player.countMark("dddyouxue_old"))[0] : player; + if (!vpos || !vpos.isIn()) return []; + var vcard = []; + var history = vpos.getPrevious().actionHistory.filter(evt => !evt.custom.some(i => i["dddyouxue_old"])); + history = history[history.length - 2]; + var evts = history.useCard; + for (var evt of evts) { + var card = evt.card; + var type = get.type(card); + if (type != "basic" && type != "trick") continue; + if (card.name == "sha") { + vcard.push(["基本", "", card.name, card.nature]); + } else vcard.push([type, "", card.name]); + } + return vcard; + }, + chooseButton: { + dialog(event, player) { + var list = lib.skill["dddchengjing_old"].getList(player); + list.sort((a, b) => { + return 100 * (lib.inpile.indexOf(a[2]) - lib.inpile.indexOf(b[2])) + lib.inpile_nature.indexOf(a[3]) - lib.inpile_nature.indexOf(b[3]); + }); + list.filter(vcard => { + return event.filterCard({ name: vcard[2], nature: vcard[3] }, player, event); + }); + return ui.create.dialog("承经", [list, "vcard"]); + }, + filter(button, player) { + return _status.event.getParent().filterCard({ name: button.link[2] }, player, _status.event.getParent()); + }, + check(button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; + return player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }, + backup(links, player) { + return { + filterCard: true, + audio: "dddchengjing_old", + popname: true, + check(card) { + return 8 - get.value(card); + }, + position: "hes", + viewAs: { + name: links[0][2], + nature: links[0][3], + storage: { dddchengjing_old: true }, + }, + precontent() { + player.addTempSkill("dddchengjing_old_effect"); + }, + }; + }, + prompt(links, player) { + return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + combo: "dddyouxue_old", + order: 1, + result: { + player: 1, + }, + }, + subSkill: { + effect: { + audio: "dddchengjing_old", + trigger: { global: "useCardAfter" }, + charlotte: true, + direct: true, + filter(event, player) { + return event.card && event.card.storage && event.card.storage["dddchengjing_old"]; + }, + content() { + "step 0"; + var damaged = game.hasPlayer2(current => current.hasHistory("damage", evt => evt.card == trigger.card)); + event.damaged = damaged; + var vpos = player.hasMark("dddyouxue_old") ? game.filterPlayer2(i => i.getSeatNum() == player.countMark("dddyouxue_old"))[0] : player; + var target = vpos.getNext(); + event.target = target; + player + .chooseControl(" +1 ", " -1 ", "cancel2") + .set("prompt", "是否令“虚位”下家(" + get.translation(target) + ")下回合的" + (damaged ? "摸牌数" : "手牌上限") + "+1或-1?") + .set("ai", function () { + var sgn = get.sgn(get.attitude(_status.event.player, _status.event.target)); + if (sgn == 0) return 2; + if (sgn == 1) return 0; + return 1; + }) + .set("target", target); + "step 1"; + if (result.index != 2) { + player.logSkill("dddchengjing_old_effect", target); + var name = (event.damaged ? "draw" : "limit") + result.index; + target.addTempSkill("dddchengjing_old_check", { + player: "phaseAfter", + }); + target.addMark("dddchengjing_old_" + name, 1, false); + game.log(target, "下回合的" + (event.damaged ? "摸牌数" : "手牌上限"), "#y" + ["+1", "-1"][result.index]); + } + }, + }, + check: { + trigger: { player: "phaseDrawBegin2" }, + charlotte: true, + forced: true, + filter(event, player) { + return player.countMark("dddchengjing_old_draw0") > 0 || player.countMark("dddchengjing_old_draw1") > 0; + }, + content() { + trigger.num += player.countMark("dddchengjing_old_draw0") - player.countMark("dddchengjing_old_draw1"); + }, + mod: { + maxHandcard(player, num) { + return num + player.countMark("dddchengjing_old_limit0") - player.countMark("dddchengjing_old_limit1"); + }, + }, + onremove(player) { + delete player.storage["dddchengjing_old_draw0"]; + delete player.storage["dddchengjing_old_draw1"]; + delete player.storage["dddchengjing_old_limit0"]; + delete player.storage["dddchengjing_old_limit1"]; + }, + mark: true, + marktext: "承", + intro: { + name: "承经", + content(storage, player) { + var str = ""; + if (player.countMark("dddchengjing_old_draw0") || player.countMark("dddchengjing_old_draw1")) { + var num = player.countMark("dddchengjing_old_draw0") - player.countMark("dddchengjing_old_draw1"); + str += "
  • 摸牌阶段摸牌数" + (num >= 0 ? "+" : "") + num; + } + if (player.countMark("dddchengjing_old_limit0") || player.countMark("dddchengjing_old_limit1")) { + var num = player.countMark("dddchengjing_old_limit0") - player.countMark("dddchengjing_old_limit1"); + str += "
  • 手牌上限" + (num >= 0 ? "+" : "") + num; + } + return str; + }, + }, + }, + draw0: { charlotte: true }, + draw1: { charlotte: true }, + limit0: { charlotte: true }, + limit1: { charlotte: true }, + }, + }, + dddduanbing: { + enable: "phaseUse", + filter(event, player) { + return player.canAddJudge("bingliang") && player.hasCard(card => lib.skill["dddduanbing"].filterCard(card, player), "he"); + }, + filterCard(card, player) { + if (get.color(card) != "black" || get.type2(card) == "trick") return false; + return player.canAddJudge(get.autoViewAs({ name: "bingliang" }, [card])); + }, + check(card) { + return 8.2 - get.value(card); + }, + discard: false, + lose: false, + delay: false, + prepare: "throw", + group: "dddduanbing_effect", + position: "he", + content() { + "step 0"; + player.addJudge({ name: "bingliang" }, cards); + "step 1"; + game.delayx(); + player.draw(2); + "step 2"; + player.chooseUseTarget( + { + name: "sha", + isCard: true, + storage: { _dddduanbing: true }, + }, + false, + "nodistance" + ); + }, + ai: { + order(item, player) { + return get.order({ name: "sha" }) - 0.1; + }, + result: { + player(player) { + return player.getUseValue({ name: "sha" }, false); + }, + }, + }, + subSkill: { + effect: { + trigger: { source: "damageSource" }, + charlotte: true, + filter(event, player) { + if (event.getParent().type != "card" || !event.player.isIn()) return false; + return player.hasCard(card => { + return (card.viewAs || card.name) == "bingliang" && event.player.canAddJudge(card); + }, "j"); + }, + prompt: event => "是否将【兵粮寸断】转移给" + get.translation(event.player) + "?", + check(event, player) { + return player.hasCard(card => { + return ( + (card.viewAs || card.name) == "bingliang" && + event.player.canAddJudge(card) && + get.effect( + event.player, + new lib.element.VCard({ + name: "bingliang", + cards: [card], + }), + player, + _status.event.player + ) >= 0 + ); + }, "j"); + }, + content() { + var cards = player.getCards("j", card => { + return (card.viewAs || card.name) == "bingliang" && trigger.player.canAddJudge(card); + }); + var target = trigger.player; + player.line(target); + player.$give(cards, target, false); + cards.forEach(card => { + target.addJudge({ name: "bingliang" }, card); + }); + }, + }, + }, + }, + //轲比能 + dddxiaoxing: { + audio: 2, + trigger: { global: "gameDrawBegin" }, + forced: true, + group: "dddxiaoxing_remove", + init(player, skill) { + if (game.online) return; + var bool = get.event().getParent("phaseLoop", true); + if (!bool) return; + if (player.hasSkill(skill)) { + player.logSkill("dddxiaoxing"); + player.draw(3); + } + }, + content() { + var me = player; + var numx = trigger.num; + trigger.num = + typeof numx == "function" + ? function (player) { + if (player == me) { + return 3 + numx(player); + } + return numx(player); + } + : function (player) { + if (player == me) { + return 3 + numx; + } + return numx; + }; + }, + mod: { + attackRange: (player, num) => num + 3, + maxHandcard: (player, num) => num + 3, + }, + subSkill: { + remove: { + trigger: { player: "dying" }, + forced: true, + // direct:true, + // filter(event,player){ + // return event.source&&event.source.isIn()&&event.source.getEquips(1).length>0; + // }, + content() { + player.removeSkills("dddxiaoxing"); + }, + content_old() { + "step 0"; + trigger.source + .chooseBool(get.prompt("dddxiaoxing", player), "废除武器栏,令其失去〖枭行〗") + .set("ai", () => { + if (_status.event.maybe) return Math.random() < 0.5; + return false; + }) + .set( + "maybe", + player.countCards("hs", { + name: ["tao", "jiu"], + }) && player.countCards("h") >= 3 + ); + "step 1"; + if (result.bool) { + trigger.source.logSkill("dddxiaoxing", player); + trigger.source.disableEquip(1); + player.removeSkills("dddxiaoxing"); + } + }, + }, + }, + }, + dddlangzhi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + logTarget(event, player) { + return game.filterPlayer(current => player.inRange(current) && current.countCards("he")); + }, + prompt: "是否发动【狼志】?", + prompt2(event, player) { + return `展示${get.translation(game.filterPlayer(current => player.inRange(current) && current.countCards("he")))}的各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。`; + }, + content() { + "step 0"; + event.targets = game.filterPlayer(current => player.inRange(current) && current.countCards("he")); + event.cards = []; + event.num = 0; + "step 1"; + var target = targets[num]; + event.num++; + event.target = target; + player.choosePlayerCard("狼志:展示" + get.translation(target) + "一张牌", "he", target, true); + "step 2"; + if (result.bool) { + var card = result.links[0]; + player.showCards(card, get.translation(target) + "被展示"); + event.cards.push(card); + } + "step 3"; + if (num < targets.length) event.goto(1); + else { + event.videoId = lib.status.videoId++; + if (event.isMine()) { + event.dialog = ui.create.dialog('###是否替换其中的任意张牌?###
    或点击“取消”,获得所有展示牌,然后失去〖狼志〗
    ', cards); + event.dialog.videoId = event.videoId; + } else if (player.isOnline2()) { + player.send( + function (cards, id) { + var dialog = ui.create.dialog('###是否替换其中的任意张牌?###
    或点击“取消”,获得所有展示牌,然后失去〖狼志〗
    ', cards); + dialog.videoId = id; + }, + cards, + event.videoId + ); + } + player + .chooseCard([1, cards.length], "he") + .set("ai", card => { + if (ui.selected.cards.length >= _status.event.num) return 0; + return 100 - get.value(card); + }) + .set( + "num", + (function () { + if (cards.length < Math.floor(game.countPlayer() / 2 - 0.5)) return 0; + var val = cards.reduce((p, c) => p + get.value(c), 0); + if (val < cards.length * 6) return 0; + var list1 = player.getCards("he").map(card => get.value(card, player)), + list2 = cards.map((card, i) => get.value(card, targets[i]) * get.sgnAttitude(player, targets[i])); + list1.sort((a, b) => a[1] - b[1]); + list2.sort((a, b) => b[1] - a[1]); + list2 = list2.filter(i => i > 0); + var count = 0; + for (var i of list2) { + for (var j = 0; j < list1.length; j++) { + if (i > list1[j]) { + count++; + list1.splice(j, 1); + break; + } + } + } + return count; + })() + ) + .set("prompt", false); + } + "step 4"; + if (result.bool) { + var cards2 = result.cards; + event.cards2 = cards2; + var func = function (id) { + var dialog = get.idDialog(id); + if (dialog) dialog.content.childNodes[1].innerHTML = '
    选择要交换的牌(按选择的顺序一一交换)
    '; + }; + if (event.isMine()) func(event.videoId); + else if (player.isOnline2()) player.send(func, event.videoId); + player + .chooseButton(cards2.length, true) + .set("dialog", event.videoId) + .set("ai", button => { + return get.value(button.link); + }); + event.goto(6); + } else { + for (var i = 0; i < cards.length; i++) { + targets[i].$give(cards[i], player, false); + } + player.gain(cards, "log"); + } + "step 5"; + player.removeSkills("dddlangzhi"); + event.finish(); + "step 6"; + game.broadcastAll("closeDialog", event.videoId); + if (result.bool) { + var cards2 = event.cards2, + cards3 = result.links; + if (cards2.length != cards3.length) return; + for (var i = 0; i < cards2.length; i++) { + player.swapHandcards(get.owner(cards3[i]), [cards2[i]], [cards3[i]]); + } + } else event.finish(); + "step 7"; + game.delayx(); + }, + }, + dddfuyi: { + audio: 2, + zhuSkill: true, + trigger: { + // global:['discardBegin','drawBegin'], + global: "dieAfter", + }, + filter(event, player) { + if (!event.source || !event.source.isIn() || event.source.group != "qun") return false; + if (!event.source.countCards("he") < 2) return false; + if (!player.hasZhuSkill("dddfuyi", event.source)) return false; + const skills = player.getStockSkills(true, true).filter(skill => { + return !player.hasSkill(skill, null, false, false); + }); + return skills.length > 0; + }, + filter_old(event, player) { + var evt = event.getParent(); + if (evt.name != "die" || evt.source != event.player || event.player == player) return false; + if (!player.hasZhuSkill("dddfuyi", event.player)) return false; + var skills = player.getSkills("dddxiaoxing", null, false, false); + return !skills.includes("dddxiaoxing") || !skills.includes("dddlangzhi"); + }, + direct: true, + global: "dddfuyi_sha", + content() { + "step 0"; + trigger.source.chooseCard("是否响应" + get.translation(player) + "的【附义】?", "弃置两张牌,令其获得其武将牌上的一个技能", "he", 2, lib.filter.cardDiscardable).set("ai", () => { + if (get.attitude(_status.event.player, _status.event.getParent().player) <= 2) return 0; + return 6 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("dddfuyi", trigger.source); + trigger.source.discard(result.cards).discarder = trigger.source; + var skills = player.getStockSkills(true, true).filter(skill => { + return !player.hasSkill(skill, null, false, false); + }); + if (skills.length == 1) event._result = { control: skills[0] }; + else + trigger.source + .chooseControl(skills) + .set( + "choiceList", + skills.map(skill => { + return '
    【' + get.translation(lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2)) + "】
    " + get.skillInfoTranslation(skill, player) + "
    "; + }) + ) + .set("displayIndex", false) + .set("prompt", `附义:选择令${get.translation(player)}获得一个技能`) + .set("ai", () => { + var controls = get.event("controls"); + if (controls.includes("dddxiaoxing")) return "dddxiaoxing"; + return controls.sort((a, b) => { + return get.skillrank(b, "inout") - get.skillrank(a, "inout"); + })[0]; + }); + } else event.finish(); + "step 2"; + var skill = result.control; + player.addSkills(skill); + }, + content_old() { + "step 0"; + var str = "取消此次奖惩,令其获得"; + var skills = player.getSkills("dddxiaoxing", null, false, false); + var bool1 = !skills.includes("dddxiaoxing"), + bool2 = !skills.includes("dddlangzhi"); + var choices = []; + if (bool1) { + str += "〖枭行〗"; + choices.push("dddxiaoxing"); + } + if (bool1 && bool2) str += "/"; + if (bool2) { + str += "〖狼志〗"; + choices.push("dddlangzhi"); + } + if (bool1 && bool2) { + str += "中的一或两个"; + choices.push("dddfuyi_both"); + } + choices.push("cancel2"); + trigger.player + .chooseControl(choices) + .set("prompt", "是否对" + get.translation(player) + "发动【附义】?") + .set("prompt2", str) + .set("ai", () => { + if (get.attitude(_status.event.player, _status.event.getParent().player) <= 2) return "cancel2"; + if (_status.event.choices.includes("dddfuyi_both")) return "dddfuyi_both"; + if (_status.event.choices.includes("dddlangzhi")) return "dddlangzhi"; + return Math.random() < 0.5 ? "dddxiaoxing" : "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + trigger.player.logSkill("dddfuyi", player); + trigger.cancel(); + var skills = [result.control]; + if (result.control == "dddfuyi_both") { + skills = ["dddxiaoxing", "dddlangzhi"]; + player.draw(3); + } else event.finish(); + player.addSkills(skills); + } else event.finish(); + "step 2"; + player.removeSkills("dddfuyi"); + }, + subSkill: { + sha: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") { + if (player.group != "qun") return; + return ( + num + + game.countPlayer(current => { + return current.hasZhuSkill("dddfuyi", player); + }) + ); + } + }, + }, + }, + }, + }, + //曹爽 + dddzhuanshe: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter(event, player) { + return player.countCards("h") > 0 && event.player != player; + }, + direct: true, + content() { + "step 0"; + player + .chooseCard(get.prompt2("dddzhuanshe", trigger.player)) + .set("ai", card => { + var target = _status.event.getTrigger().player; + if (!_status.event.goon) { + if (get.value(card) < 4) return -target.getUseValue(card) + 0.001; + return 0; + } + return target.getUseValue(card); + }) + .set("goon", get.attitude(player, trigger.player)); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + player.logSkill("dddzhuanshe", trigger.player); + player.give(card, trigger.player, true); + player.addTempSkill("dddzhuanshe_effect"); + player.markAuto("dddzhuanshe_effect", [card.name]); + } + }, + subSkill: { + effect: { + audio: "dddzhuanshe", + trigger: { global: "useCard2" }, + filter(event, player) { + if (!player.getStorage("dddzhuanshe_effect").includes(event.card.name)) return false; + if (event.player != _status.currentPhase) return false; + var type = get.type(event.card, null, false); + if (type != "basic" && type != "trick") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, event.player, current); + }) + ) { + return true; + } + } + return false; + }, + direct: true, + group: "dddzhuanshe_damage", + charlotte: true, + onremove: true, + content() { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("dddzhuanshe_effect"), function (card, player, target) { + var player = _status.event.source; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.source; + return get.effect(target, trigger.card, player, _status.event.player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card) + .set("source", trigger.player); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill(event.name, event.targets); + trigger.targets.addArray(event.targets); + game.log(event.targets, "也成为了", trigger.card, "的目标"); + } + }, + }, + damage: { + audio: "dddzhuanshe", + trigger: { global: "phaseEnd" }, + filter(event, player) { + var list = player.getStorage("dddzhuanshe_effect").slice(); + event.player.getHistory("useCard", evt => { + list.remove(evt.card.name); + }); + return list.length; + }, + charlotte: true, + logTarget: "player", + prompt2: "对其造成1点伤害", + check(event, player) { + return get.damageEffect(event.player, player, player) >= 0; + }, + content() { + trigger.player.damage(player); + }, + }, + }, + }, + dddweiqiu: { + audio: 2, + trigger: { global: "recoverBefore" }, + filter(event, player) { + return !player.countCards("h"); + }, + forced: true, + direct: true, + content() { + trigger.player.logSkill("dddweiqiu", player); + trigger.cancel(); + player.draw(); + }, + }, + //薛灵芸 + dddlianer: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + return event.cards.filterInD("od").length > 0 && get.color(event.card) == "red"; + }, + content() { + "step 0"; + var cards = trigger.cards.filterInD("od"); + event.cards = cards; + player.gain(cards, "gain2"); + "step 1"; + var number = get.number(cards[0]); + if (cards.length == 1 && typeof number == "number") { + player.addTempSkill("dddlianer_ceiling"); + player.storage["dddlianer_ceiling"] = number; + } + }, + mod: { + aiOrder(player, card, num) { + if (get.itemtype(card) == "card" && get.color(card) == "red") { + if (!player.storage["dddlianer_ceiling"]) return; + var numx = get.number(card); + if (typeof numx == "number") { + return num + 10 / Math.max(1, player.storage["dddlianer_ceiling"] - numx); + } + } + }, + }, + subSkill: { + ceiling: { + onremove: true, + charlotte: true, + mod: { + cardEnabled(card, player) { + if (!player.storage["dddlianer_ceiling"]) return; + var num = get.number(card); + if (num != "unsure" && (typeof num != "number" || player.storage["dddlianer_ceiling"] <= num)) return false; + }, + cardRespondable(card, player) { + if (!player.storage["dddlianer_ceiling"]) return; + var num = get.number(card); + if (num != "unsure" && (typeof num != "number" || player.storage["dddlianer_ceiling"] <= num)) return false; + }, + cardSavable(card, player) { + if (!player.storage["dddlianer_ceiling"]) return; + var num = get.number(card); + if (num != "unsure" && (typeof num != "number" || player.storage["dddlianer_ceiling"] <= num)) return false; + }, + }, + }, + }, + }, + dddanzhi: { + audio: 2, + trigger: { global: "phaseBegin" }, + filter(event, player) { + var evts = game.getAllGlobalHistory("everything", evt => ["useCard", "respond"].includes(evt.name)); + if (!evts.length) return false; + const color = get.color(evts.lastItem.card, false); + return color == "black"; + }, + direct: true, + content() { + "step 0"; + player.chooseTarget(get.prompt("dddanzhi"), "选择一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效").set("ai", target => { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddanzhi", target); + target.addTempSkill("dddanzhi_effect"); + } + }, + subSkill: { + effect: { + trigger: { target: "useCardToTarget" }, + filter(event, player) { + return get.color(event.card) == "black"; + }, + forced: true, + charlotte: true, + content() { + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + trigger.untrigger(); + game.log(trigger.card, "对", player, "无效了"); + game.delayx(); + player.removeSkill("dddanzhi_effect"); + }, + }, + }, + }, + //刘宏 + dddshixing: { + audio: 2, + trigger: { + global: ["changeHp", "useCard1", "phaseBefore"], + }, + forced: true, + onremove: true, + filter(event, player) { + var num = player.countMark("dddshixing"); + if (event.name == "changeHp") { + if (event.player.hasSex("female")) { + var bool = !event.player.isDamaged(); + if ((bool && (num & 1) == 0) || (!bool && (num & 1) == 1)) { + return true; + } + } + return false; + } + if (event.name == "useCard") { + var bool = game.getGlobalHistory("useCard", evt => get.type2(evt.card) == "trick").length == 0; + if ((bool && (num & 2) == 0) || (!bool && (num & 2) == 2)) { + return true; + } + return false; + } + return true; + }, + content() { + lib.skill["dddshixing"].applyChange(player); + }, + applyChange(player) { + player.removeAdditionalSkill("dddshixing"); + var bool1 = game.hasPlayer(current => !current.isDamaged() && current.hasSex("female")), + bool2 = game.getGlobalHistory("useCard", evt => get.type2(evt.card) == "trick").length == 0; + player.storage["dddshixing"] = bool1 + 2 * bool2; + var list = []; + if (bool1) list.push("xiangle"); + if (bool2) list.push("jiushi"); + if (!bool1 && !bool2) list.push("rezhiheng"); + player.addAdditionalSkill("dddshixing", list); + }, + derivation: ["xiangle", "jiushi", "rezhiheng"], + }, + ddddanggu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return game.countPlayer(current => current.isLinked()) < game.countPlayer(current => current.group == "qun"); + }, + forced: true, + group: "ddddanggu_negative", + content() { + "step 0"; + if (!event.loop) event.loop = 0; + var num = game.countPlayer(current => current.group == "qun") - game.countPlayer(current => current.isLinked()); + player + .chooseTarget("党锢:横置至少" + get.cnNumber(num) + "名角色", [num, Infinity], true, (card, player, target) => { + return !target.isLinked(); + }) + .set("ai", target => { + return get.effect(target, { name: "tiesuo" }, _status.event.player); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("ddddanggu", targets); + targets.forEach(i => i.link()); + } + }, + discard() { + "step 0"; + game.log(player, "进入了弃牌阶段"); + event.num = Math.max(0, player.countCards("he", card => !player.canIgnoreHandcard(card)) - player.getHandcardLimit()); + if (event.num <= 0) event.finish(); + else { + if (lib.config.show_phase_prompt) { + player.popup("弃牌阶段"); + } + } + event.trigger("phaseDiscard"); + "step 1"; + player.chooseToDiscard(num, true, "he"); + "step 2"; + event.cards = result.cards; + }, + subSkill: { + negative: { + trigger: { global: "phaseDiscardBegin" }, + filter(event, player) { + return event.player != player && event.player.isLinked(); + }, + forced: true, + logTarget: "player", + content() { + trigger.setContent(lib.skill["ddddanggu"].discard); + }, + }, + }, + }, + dddfuzong: { + audio: 2, + zhuSkill: true, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + if (!player.hasZhuSkill("dddfuzong")) return false; + return event.name != "phase" || game.phaseNumber == 0; + }, + group: "dddfuzong_discard", + content() { + player.draw( + game.countPlayer(current => { + return current.group == "qun"; + }) + ); + }, + subSkill: { + discard: { + trigger: { global: "die" }, + filter(event, player) { + if (!player.hasZhuSkill("dddfuzong")) return false; + return event.player.group == "qun"; + }, + zhuSkill: true, + forced: true, + logTarget: "player", + content() { + trigger.player.discardPlayerCard(player, "he", true).set("forceDie", true); + }, + }, + }, + }, + //夏侯玄 + dddlanghuai: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + zhuanhuanji: true, + direct: true, + content() { + "step 0"; + if (player.hasMark("dddxuanlun_del")) event._result = { bool: true }; + else + player + .chooseBool(get.prompt("dddlanghuai"), "展示手牌(无牌则不展示),并改为摸其中" + (!player.storage["dddlanghuai"] ? "包含" : "缺少") + "花色数的牌") + .set("ai", () => _status.event.bool) + .set( + "bool", + (function () { + var list = [], + cards = player.getCards("h"); + for (var i of cards) { + var suit = get.suit(i, player); + if (!lib.suit.includes(suit)) continue; + list.add(suit); + } + if (player.storage["dddlanghuai"]) { + list = list.removeArray(lib.suit); + } + return (list.length == 2 && !player.storage["dddlanghuai"]) || list.length > 2; + })() + ); + "step 1"; + if (result.bool) { + player.logSkill("dddlanghuai"); + delete player.storage["dddxuanlun_del"]; + if (player.countCards("h")) player.showHandcards(); + } else event.finish(); + "step 2"; + var list = [], + cards = player.getCards("h"); + for (var i of cards) { + var suit = get.suit(i, player); + if (!lib.suit.includes(suit)) continue; + list.add(suit); + } + if (player.storage["dddlanghuai"]) { + list = lib.suit.slice().removeArray(list); + } + player.changeZhuanhuanji("dddlanghuai"); + trigger.changeToZero(); + if (list.length) player.draw(list.length); + }, + mark: true, + intro: { + content(storage, player) { + return "摸牌阶段,你可展示手牌(无牌则不展示),并改为摸其中" + (!storage ? "包含" : "缺少") + "花色数的牌。"; + }, + }, + marktext: "☯", + }, + dddxuanlun: { + audio: 2, + trigger: { player: "damageEnd" }, + content() { + player.draw(4); + player.addTempSkill("dddxuanlun_choose"); + }, + ai: { + maixie: true, + maixie_hp: true, + result: { + effect(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; + } + if (target.hp >= 4) return [1, num * 2.5]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; + } + }, + }, + threaten: 0.6, + }, + subSkill: { + choose: { + trigger: { global: "phaseEnd" }, + forced: true, + charlotte: true, + filter(event, player) { + if (player.hasMark("dddxuanlun_del") && !player.countCards("h")) return false; + return true; + }, + content() { + "step 0"; + var choices = []; + var choiceList = ["将四张牌以任意顺序置于牌堆顶或底", "删去此项和〖朗怀〗中的“可”,直到你发动〖朗怀〗"]; + if (player.countCards("he") >= 4 || player.hasMark("dddxuanlun_del")) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (!player.hasMark("dddxuanlun_del")) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (choices.length == 1 && choices[0] == "选项一") event._result = { control: "选项一" }; + else + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => { + if (!_status.event.controls.includes("选项一")) return 1; + if (!_status.event.controls.includes("选项二")) return 0; + var player = _status.event.player; + var num = 0; + for (var card of player.getCards("he")) { + if (get.value(card, player) <= 5) num++; + if (num >= 4) break; + } + return num >= 4 ? 0 : 1; + }); + "step 1"; + game.log(player, "选择了", "#y" + result.control); + if (result.control == "选项一") { + var cards = player.getCards("he"); + if (cards.length <= 4) + event._result = { + bool: true, + cards: cards, + }; + else player.chooseCard("玄论:将四张牌置于牌堆顶或牌堆底", "he", true, 4); + } else { + player.addMark("dddxuanlun_del", 1, false); + event.finish(); + } + "step 2"; + if (result.bool) { + var cards = result.cards; + event.cards = cards; + player + .chooseToMove() + .set("list", [["牌堆顶", cards], ["牌堆底"]]) + .set("prompt", "玄论:将这些牌置于牌堆顶或牌堆底") + .set("processAI", function (list) { + var cards = list[0][1], + player = _status.event.player; + var target = _status.currentPhase.next; + var att = get.sgn(get.attitude(player, target)); + var top = []; + var judges = target.getCards("j"); + var stopped = false; + if (player != target || !target.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)) * att; + }); + if (judge(cards[0]) * att < 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)) * att; + }); + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) break; + top.unshift(cards.shift()); + } + } + bottom = cards; + return [top, bottom]; + }); + } else event.finish(); + "step 3"; + if (result.bool) { + var top = result.moved[0]; + var bottom = result.moved[1]; + top.reverse(); + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + var cards = top.addArray(bottom); + player.$throw(cards.length, 1000); + player.lose(cards, ui.cardPile).set("top", top).insert_index = function (event, card) { + if (event.top.includes(card)) return ui.cardPile.firstChild; + return null; + }; + } + }, + }, + }, + }, + //张闿 + dddjiexing: { + audio: 2, + trigger: { + global: ["recoverBegin", "useCard"], + }, + filter(event, player) { + if (event.player == player) return false; + if (event.name == "recover") return player.isDamaged(); + return get.type(event.card, false) == "equip" && event.cards.some(i => get.position(i, true) == "o" && player.canEquip(i, true)); + }, + limited: true, + skillAnimation: true, + animationColor: "legend", + logTarget: "player", + check(event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if (event.name == "recover") return get.recoverEffect(event.player, player, player) < get.recoverEffect(player, player, player); + return get.effect(event.targets[0], event.card, player, player) < get.effect(player, event.card, player, player); + }, + content() { + player.awakenSkill("dddjiexing"); + player.addSkill("dddjiexing_reset"); + if (trigger.name == "recover") { + trigger.cancel(); + player.recover(trigger.num); + } else { + trigger.all_excluded = true; + trigger.targets.length = 0; + var cards = trigger.cards.filterInD(); + for (var i of cards) { + if (player.canEquip(i, true)) player.equip(i); + } + } + }, + subSkill: { + reset: { + audio: "dddjiexing", + trigger: { player: ["recoverAfter", "useCardAfter"] }, + filter(event, player) { + if (event.getParent().name == "dddjiexing") return false; + if (event.name == "useCard") return get.type(event.card, false) == "equip"; + return true; + }, + forced: true, + charlotte: true, + content() { + player.restoreSkill("dddjiexing"); + player.removeSkill("dddjiexing_reset"); + }, + }, + }, + }, + dddbailei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return game.hasPlayer(current => current.isMaxEquip(true) && current.countGainableCards(player, "he")) || game.hasPlayer(current => current.getHp() == 1); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("dddbailei"), (card, player, target) => { + return (target.isMaxEquip(true) && target.countGainableCards(player, "he")) || target.getHp() == 1; + }) + .set("ai", target => { + var att = get.attitude(_status.event.player, target); + if (att >= 3) return false; + if (target.hp == 1) return 100; + return 1; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dddbailei", target); + if (target.isMaxEquip(true) && target.hp == 1) { + if (target.countGainableCards(player, "he")) { + player.gainPlayerCard("拜泪:获得" + get.translation(target) + "一张牌,或点击“取消”对其造成1点伤害", "he", target); + } else event._result = { bool: false }; + } else if (target.isMaxEquip(true)) player.gainPlayerCard("拜泪:获得" + get.translation(target) + "一张牌", "he", target, true); + else { + event._result = { bool: false }; + } + } else event.finish(); + "step 2"; + if (!result.bool) { + player.line(target); + // player.trySkillAnimate('dddbailei_animate','dddbailei_animate',player.checkShow('dddbailei')); + target.damage(); + game.delayx(); + } else event.finish(); + "step 3"; + if (target.isIn()) { + event.finish(); + return; + } + player.removeSkills("dddbailei"); + }, + subSkill: { + animate: { + skillAnimation: true, + animationColor: "fire", + }, + }, + }, +}; + +export default skills; diff --git a/character/ddd/sort.js b/character/ddd/sort.js new file mode 100644 index 000000000..a338569a7 --- /dev/null +++ b/character/ddd/sort.js @@ -0,0 +1,5 @@ +const characterSort = {}; + +const characterSortTranslate = {}; + +export { characterSort, characterSortTranslate }; diff --git a/character/ddd/translate.js b/character/ddd/translate.js new file mode 100644 index 000000000..95d320a8e --- /dev/null +++ b/character/ddd/translate.js @@ -0,0 +1,155 @@ +const translates = { + ddd_handang: "韩当", + dddxianxi: "险袭", + dddxianxi_info: "出牌阶段,你使用【杀】时可无视距离额外指定任意名角色为目标;此【杀】结算后,若额外指定的目标中有未受到此【杀】伤害的,你须选择一项:弃置X张牌对其各造成1点伤害;或摸X张牌并失去1点体力(X为未受到此【杀】伤害的目标数)。", + ddd_wuzhi: "吴质", + dddlingyong: "灵涌", + dddlingyong_info: "一名角色跳过其的阶段时,你可进行判定。若结果不为【杀】,则你可以使用判定牌,然后重复此流程。", + dddxuxiao: "虚孝", + dddxuxiao_info: "当有黑色基本牌因弃置而进入弃牌堆后,你可将其当做【兵粮寸断】置于一名角色的判定区,然后其摸两张牌。", + ddd_xujing: "许靖", + dddxuyu: "虚誉", + dddxuyu_info: "当你使用牌结算结束后,你可以摸一张牌。若如此做,当你于本回合使用下一张牌结算结束后,你弃置一张牌。", + dddshijian: "实荐", + dddshijian_info: "其他角色于其出牌阶段使用的第二张牌结算结束后,你可以交给其一张牌。若如此做,其本回合使用的下一张牌指定第一个目标时,你选择一项:1.令此牌额外结算一次;2.你摸一张牌。", + ddd_caomao: "曹髦", + dddtaisi: "太思", + dddtaisi_info: "一名角色的回合结束时,若你的体力值于本回合内发生过变化,则你可以令一名角色获得一张于本回合内进入弃牌堆的牌。然后若该角色于本回合内对你造成过伤害,则你摸两张牌。", + dddquche: "驱车", + dddquche_info: "限定技。出牌阶段,你可依次执行大括号内的流程至多X次(X为你的体力上限):{[⒈将一张牌交给一名其他角色]+[将一张黑色牌当做【杀】使用(不计入次数限制)]}。你每执行一个中括号内的选项,本回合内至其他角色的距离便-1。", + dddqianlong: "潜龙", + dddqianlong_info: "主公技,锁定技。当你因执行奖惩而摸牌或弃置牌时,取消之;当你杀死一名角色后,你摸三张牌。", + ddd_xinxianying: "辛宪英", + ddddongcha: "洞察", + ddddongcha_info: "其他角色的回合开始时,你可以令你和其依次将一张手牌置于你的武将牌上,称为“鉴”。若如此做,本回合结束时,你与其依次选择获得一张“鉴”。", + dddzhijie: "智解", + dddzhijie_info: "你可以将两张颜色相同的“鉴”当做【闪】使用,或将两张颜色不同的“鉴”当做【无懈可击】使用;然后你摸两张牌。", + ddd_xianglang: "向朗", + dddqiahua: "恰化", + dddqiahua_info: "其他角色的回合开始时,你可明置X张手牌(X为其体力值),然后其于本回合内获得〖恂恂〗。", + dddfusi: "腹笥", + dddfusi_info: "锁定技。①你的明置手牌不计入手牌上限。②其他角色需要使用牌时,可以改为使用你的明置手牌(需经过你的确认)。③你的回合内,若你的手牌均为明置手牌,则其他角色不能使用各自的手牌。", + dddfusi_global: "腹笥", + dddtuoji: "拓籍", + dddtuoji_info: "其他角色因〖腹笥〗而使用你的牌后,若你的手牌均为明置手牌,则你可以摸三张牌。", + visible_dddxianglang: "明", + ddd_yujin: "于禁", + dddzhengjun: "整军", + dddzhengjun_info: "出牌阶段内每项各限一次。当有角色的手牌数/体力值/装备区内牌数变化后,若其的对应数值与你相同,则你可以执行对应的选项。体力值:你令其回复或失去1点体力;手牌数:你令其摸或弃置一张牌;装备区内牌数:你移动其的一张装备牌。", + ddd_liuye: "刘晔", + dddchashi: "察势", + dddchashi_info: "其他角色的出牌阶段开始时,你可弃置一张牌A。当其于本阶段内使用下一张牌结算结束后,若此牌与A花色或类型相同,你与其各摸一张牌。", + dddqice: "齐策", + dddqice_info: "准备阶段开始时,你可以摸两张牌,然后你的〖齐策〗失效直到你使用锦囊牌。", + ddd_baosanniang: "鲍三娘", + dddzhilian: "枝连", + dddzhilian_info: "一名角色的回合结束时,若本回合仅有你与另一名男性角色使用或打出过牌,则你可以令你与其各摸一张牌或各弃置一张牌,然后你获得本回合内进入弃牌堆的所有【杀】。", + dddjijian: "赍剑", + dddjijian_info: "出牌阶段限一次。你可以展示一张【杀】并交给一名其他男性角色,然后其展示至多两张颜色相同的【杀】或普通锦囊牌,你与其依次视为使用一张其展示的牌(不能重复使用同一张展示牌)。", + ddd_zhenji: "甄姬", + dddmiaoxing: "淼形", + dddmiaoxing_info: "锁定技。①分发起始手牌时,你额外获得两份起始手牌,然后将其中的两份移出游戏,称为“水相”。②摸牌阶段结束后,你须将至少一份“水相”调整至与你的手牌数相等。", + dddfushi: "浮世", + dddfushi_info: "每回合限一次。当你使用或打出基本牌结算结束后,你可以用所有手牌交换一份“水相”,然后你可令一名男性角色选择是否用其所有手牌交换一份“水相”。", + ddd_zhaoang: "赵昂", + dddfenji: "奋计", + dddfenji_info: "摸牌/弃牌阶段开始时,你可视为使用一张未以此法使用过的普通锦囊牌,然后将此阶段摸牌/弃牌数改为此牌造成的伤害值/此牌的目标数。", + ddd_zhouchu: "周处", + dddxiaheng: "侠横", + dddxiaheng_info: "锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。“若这两名角色:均不为你,你减1点体力上限;为同一名角色,你失去〖侠横〗;然后若你以此法对三名不同的角色造成过伤害,删除该技能双引号里的描述。”", + ddd_liuba: "刘巴", + dddfengzheng: "丰政", + dddfengzheng_info: "①每名角色的出牌阶段限一次。其可将点数之和为13的任意张手牌当一张【无中生有】使用。②一轮游戏开始时,你可观看并分配牌堆顶的X张牌(X为上一轮发动过〖丰政〗的角色数),若有角色以此法得到的牌数多于两张,你失去〖丰政〗。", + dddyulv: "玉律", + dddyulv_info: "锁定技。①游戏开始时,你摸一张牌。将一张手牌置于武将牌上,称为“玉律”。②当有与“玉律”牌点数相同的牌进入弃牌堆后,你令当前回合角色摸一张牌或弃置一张牌。然后若本次为此回合使用的第二次〖玉律②〗,你用一张手牌交换“玉律”牌(若你没有手牌则先摸一张牌)。", + ddd_jianshuo: "蹇硕", + dddfenye: "分野", + dddfenye_info: "出牌阶段限一次。你可与一名其他角色拼点,其余角色于此次拼点中可加入其中一方并扣置一张手牌作为其拼点牌,本次拼点判断胜负的条件改为比较双方点数均值。然后拼点胜方角色依次可视为对一名不同的拼点败方角色使用【杀】。", + dddshichao: "逝潮", + dddshichao_info: "锁定技。准备阶段,你选择一名手牌数为全场第(1)大的角色,将手牌数调整至与其相等且至多等于主公的体力上限。然后当其于你的下回合开始前对你造成伤害时,其可防止之,令你〖逝潮〗的()内的数字+1。", + ddd_guanning: "管宁", + dddyouxue: "游学", + dddyouxue_info: "锁定技。一轮游戏开始时,你将场上的“游学”标记交给一名其他角色(若场上没有“游学”,你获得“游学”),然后摸X张牌(X为本次失去“游学”的角色至获得“游学”的角色的距离)。", + dddchengjing: "承经", + dddchengjing_info: "①一名角色的回合结束时,若其有“游学”,你将其于此回合内使用的最后一张{非转化且对应的实体牌数为1且均位于弃牌堆中}的基本牌或普通锦囊牌对应的所有实体牌置于武将牌上,称为“经”(若你此前有“经”,你先将这些“经”置入弃牌堆)。②出牌阶段限一次,你可以将一张牌当“经”使用,然后可以将该牌交给有“游学”的角色的下家。", + ddd_dingfeng: "丁奉", + dddduanbing: "短兵", + dddduanbing_info: "①出牌阶段,你可将一张黑色非锦囊牌当一张【兵粮寸断】置入自己的判定区,摸两张牌,然后视为使用一张无视距离限制的【杀】。②当你使用【杀】对目标角色造成伤害后,若你判定区里有【兵粮寸断】,你可将【兵粮寸断】移至目标角色的判定区。", + ddd_kebineng: "轲比能", + dddxiaoxing: "枭行", + dddxiaoxing_info: "锁定技。①你的初始手牌,攻击范围和手牌上限+3。②当你进入濒死状态时,你失去〖枭行〗。③当你获得〖枭行〗后,你摸三张牌。", + dddlangzhi: "狼志", + dddlangzhi_info: "结束阶段,你可展示你攻击范围内的所有角色各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。", + dddfuyi: "附义", + dddfuyi_both: "〖枭行〗和〖狼志〗", + dddfuyi_info: "主公技,锁定技。①群势力角色使用【杀】的次数上限+1。②当一名群势力角色杀死角色后,其可以弃置两张牌,令你获得你武将牌上的一个技能。", + ddd_caoshuang: "曹爽", + ddd_xuelingyun: "薛灵芸", + ddd_liuhong: "刘宏", + ddd_xiahouxuan: "夏侯玄", + ddd_zhangkai: "张闿", + dddzhuanshe: "专摄", + dddzhuanshe_info: "其他角色的出牌阶段开始时,你可将一张手牌正面朝上交给该角色,则当其在此回合内使用与之名称相同的基本牌或普通锦囊牌时,你可无视距离限制为之额外选择一个目标;此回合结束时,若其未使用与之名称相同的牌,你可以对其造成1点伤害。", + dddweiqiu: "危秋", + dddweiqiu_info: "锁定技。一名角色回复体力前,若你没有手牌,改为令你摸一张牌。", + dddlianer: "涟洏", + dddlianer_info: "当你使用红色牌结算后,你可以获得之,然后你只能使用点数小于此牌的牌直到回合结束。", + dddanzhi: "暗织", + dddanzhi_info: "一名角色的回合开始时,若上一张被使用或打出的牌为黑色,你可以指定一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效。", + dddshixing: "失兴", + dddshixing_info: "锁定技。若有未受伤的女性角色,你视为拥有〖享乐〗;若当前回合没有锦囊牌被使用,你视为拥有〖酒诗〗;若你没有上述技能,你视为拥有〖制衡〗。", + ddddanggu: "党锢", + ddddanggu_info: "锁定技。①结束阶段,你横置任意名角色的武将牌,直到场上已横置的角色数不少于X(X为群势力角色数)。②其他角色的弃牌阶段,若其处于连环状态,其装备区里的牌视为手牌。", + dddfuzong: "覆宗", + dddfuzong_info: "主公技,锁定技。①游戏开始时,你摸等同于场上群势力角色数的牌。②一名群势力角色死亡时,其弃置你的一张牌。", + dddlanghuai: "朗怀", + dddlanghuai_info: "转换技。摸牌阶段,你可展示手牌(无牌则不展示),并改为摸其中:阴,包含花色数的牌;阳,缺少花色数的牌。", + dddxuanlun: "玄论", + dddxuanlun_info: "当你受到伤害后,你可摸四张牌,然后该回合结束时,你选择一项:1.将四张牌以任意顺序置于牌堆顶或底;2.删去此项和〖郎怀〗中的“可”直到你发动〖郎怀〗。", + dddjiexing: "劫行", + dddjiexing_info: "限定技。其他角色回复体力时,你可改为你回复等量体力;其他角色使用装备牌时,你可改为将此牌置入你的装备区。当你不以此法回复体力后或使用装备牌后,重置此技能。", + dddbailei: "拜泪", + dddbailei_info: "准备阶段,你可以选择一项:1.获得装备区牌数唯一最多的角色的一张牌;2.对一名体力值为1的角色造成1点伤害,若其因此死亡,你失去此技能。", + ddd_liangxi: "梁习", + dddtongyu: "仝御", + dddtongyu_info: "出牌阶段限一次,你可以将任意张花色不同的牌当做【五谷丰登】使用,且你为此牌选择结算方向,此牌的亮出牌数+X(X为此牌对应的实体牌数量)。此牌的所有目标角色在被指定目标后选择一项:⒈本回合不能再使用或打出手牌。⒉令此【五谷丰登】对其无效。此【五谷丰登】的多余展示牌置入弃牌堆前,你可以令一名选择了选项二的角色获得这些牌。", + ddd_wangkanglvkai: "王伉吕凯", + dddbingjian: "并肩", + dddbingjian_info: "每回合限两次。你可以将手牌数调整至2(至少调整一张),视为使用或打出一张【杀】或【闪】。若你:因此摸牌,则你可以令一名其他角色摸等量的牌;因此弃牌,则你可以弃置一名其他角色等量的牌。", + ddd_sunliang: "孙亮", + ddddiedang: "迭宕", + ddddiedang_info: "出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃”。", + dddanliu: "暗流", + dddanliu_info: "结束阶段,你可以与一名其他角色依次观看并选择对方的一张手牌,然后交换这两张牌。若这两张牌颜色相同,则你可以逾期交换这两张牌,且:若此牌为红色,则你回复1点体力;若此牌为黑色,则其摸两张牌。", + dddguiying: "归萤", + dddguiying_info: "主公技。准备阶段,其他吴势力角色可依次展示其一张手牌,然后将其点数最大的一张牌交给你,然后其可以获得场上点数最小的一张牌。", + ddd_qianzhao: "牵招", + dddyuanzhen: "远振", + dddyuanzhen_info: "锁定技。当你使用牌指定其他角色为唯一目标后,若你至其距离不为1,你令其选择一项:1.弃置一张牌;2.令你摸一张牌。", + dddzhishu: "制戍", + dddzhishu_info: "出牌阶段开始时,你可以移动场上的一张装备牌,然后以此法失去牌的角色视为对以此法装备区被置入牌的角色使用一张【过河拆桥】。", + ddd_zhangmiao: "张邈", + dddxiaxing: "侠行", + dddxiaxing_info: "①每轮限一次。一名角色处于濒死状态时/回合开始时,你可以将一张牌置于牌堆顶,视为其使用一张【桃】/【酒】。若你没有“侠”标记,你获得“侠”。②你可以移去“侠”,视为使用一张【杀】或【闪】。", + ddd_zhangcheng: "张承", + dddjuxian: "聚贤", + dddjuxian_info: "出牌阶段每项各限一次。你可以展示一张牌,然后:1.将其置于牌堆顶,然后获得其他角色的一张牌并展示之;2.将此牌交给一名其他角色,然后摸一张牌并展示之。若你以此法展示的两张牌颜色不同,此技能本回合失效。", + dddjungui: "隽轨", + dddjungui_info: "结束阶段,你可以令一名角色摸两张牌,然后其展示所有手牌,你选择一个不大于X的值。若Y大于0,你令其弃置Y张花色各不同的手牌(X为你于本回合使用过的牌的花色数,Y为其手牌中包含的花色数-X)。", + ddd_liuchong: "刘宠", + dddjinggou: "精彀", + dddjinggou_info: "锁定技。当你使用武器牌结算结束后,若你的攻击范围为全场最大,你对一名其他角色造成1点伤害。", + dddmoyan: "末焱", + dddmoyan_info: "一轮游戏开始时,你可以亮出牌堆顶三张牌,令一名角色选择获得其中至少一张牌,然后当你于本轮受到伤害时,若其手牌数不大于X,此伤害+1(X为其本次获得的牌数)。", + ddd_luoxian: "罗宪", + dddshilie: "示烈", + visible_dddshilie: "明", + dddshilie_info: "每回合限一次。当你需要使用一张【杀】或【闪】时,你可以明置任意点数之和不小于X的手牌,视为你使用之。若本次明置的牌点数等于X,你摸等同于本次明置的牌数的牌(X为你与当前回合角色的体力值之和)。", + ddd_lie: "李娥", + dddyeshen: "冶身", + dddyeshen_info: "一名角色的结束阶段,你可以亮出牌堆底三张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。", + dddqiaoduan: "巧锻", + dddqiaoduan_info: "每回合限一次。当有角色:重置后,你可以令至多X名角色各摸一张牌;横置后,你可以将X张牌置于牌堆底,并令一名角色回复1点体力(X为横置角色数)。", +}; + +export default translates; diff --git a/character/ddd/voices.js b/character/ddd/voices.js new file mode 100644 index 000000000..ff8b4c563 --- /dev/null +++ b/character/ddd/voices.js @@ -0,0 +1 @@ +export default {}; diff --git a/character/diy.js b/character/diy.js deleted file mode 100755 index 23cd42451..000000000 --- a/character/diy.js +++ /dev/null @@ -1,12545 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "diy", - connect: true, - connectBanned: [ - "diy_tianyu", - "diy_yangyi", - "diy_lukang", - "ns_huamulan", - "ns_yuji", - "ns_duangui", - "ns_liuzhang", - "key_yuu", - ], - character: { - noname: ["female", "key", 3, ["noname_zhuyuan", "noname_duocai"]], - - key_kud: ["female", "key", 3, ["kud_qiaoshou", "kud_buhui"]], - key_misuzu: ["female", "key", 3, ["misuzu_hengzhou", "misuzu_nongyin", "misuzu_zhongxing"]], - key_kamome: ["female", "key", 3, ["kamome_yangfan", "kamome_huanmeng", "kamome_jieban"]], - key_nao: ["female", "key", 3, ["nao_duyin", "nao_wanxin", "nao_shouqing"]], - key_yuuki: ["female", "key", 3, ["yuuki_yicha"]], - key_kotarou: ["male", "key", 3, ["kotarou_rewrite", "kotarou_aurora"]], - key_tenzen: ["male", "key", 4, ["tenzen_fenghuan", "tenzen_retianquan"]], - key_kyouko: ["female", "key", 3, ["kyouko_rongzhu", "kyouko_gongmian"]], - key_kyou: ["female", "key", 3, ["kyou_zhidian", "kyou_duanfa"]], - key_seira: ["female", "key", 3, ["seira_xinghui", "seira_yuanying"]], - key_kiyu: ["female", "key", 3, ["kiyu_yuling", "kiyu_rexianyu"]], - key_tomoyo: ["female", "key", 4, ["tomoyo_wuwei", "tomoyo_zhengfeng"]], - key_minagi: ["female", "key", 3, ["minagi_peiquan", "minagi_huanliu"]], - key_michiru: ["female", "key", 3, ["michiru_sheyuan"]], - - ns_huangchengyan: ["male", "shu", 3, ["nslongyue", "nszhenyin"]], - ns_sunchensunjun: ["male", "wu", 5, ["nsxianhai", "nsxingchu"]], - ns_yuanxi: ["male", "qun", 4, ["nsshengyan", "nsdaizhan"]], - ns_caoshuang: ["male", "wei", 4, ["nsjiquan", "nsfuwei"]], - ns_sunyi: ["male", "wu", 4, ["nsguolie"]], - ns_huangwudie: ["female", "shu", 4, ["nsdiewu", "nslingying", "nspojian"]], - ns_chentai: ["male", "wei", 4, ["nsweiyuan", "nsjuxian"]], - ns_zhangning: ["female", "qun", 3, ["nsfuzhou", "nsguidao", "nstaiping"]], - ns_yanghu: ["male", "jin", 3, ["nsbizhao", "nsqingde", "nsyidi"], ["hiddenSkill"]], - ns_zanghong: ["male", "qun", 4, ["nsshimeng"]], - ns_ruanji: ["male", "wei", 3, ["nsshizui", "nsxiaoye"]], - ns_limi: ["male", "jin", 3, ["nstuilun"]], - ns_zhonglimu: ["male", "wu", 4, ["nskuanhuai", "nsdingbian"]], - prp_zhugeliang: ["male", "shu", 3, ["nsxingyun", "nshanlang"]], - - ns_zhangwei: ["female", "shu", 3, ["nsqiyue", "nsxuezhu"]], - diy_wenyang: ["male", "wei", "4/6", ["lvli", "choujue"]], - // diy_caocao:['male','wei',4,['xicai','diyjianxiong','hujia']], - diy_hanlong: ["male", "wei", 4, ["siji", "ciqiu"]], - diy_feishi: ["male", "shu", 3, ["nsshuaiyan", "moshou"]], - diy_liuyan: ["male", "qun", 3, ["juedao", "geju"]], - // diy_luxun:['male','wu',3,['shaoying','zonghuo']], - diy_yuji: ["male", "qun", 3, ["diyguhuo", "diychanyuan"]], - // diy_zhouyu:['male','wu',3,['jieyan','honglian']], - // diy_zhouyu:['male','wu',3,['xiongzi','yaliang']], - diy_caiwenji: ["female", "qun", 3, ["beige", "guihan"]], - diy_lukang: ["male", "wu", 4, ["luweiyan", "qianxun"]], - // diy_xuhuang:['male','wei',4,['diyduanliang']], - // diy_dianwei:['male','wei',4,['diyqiangxi']], - // diy_huangzhong:['male','shu',4,['liegong','fuli']], - // diy_weiyan:['male','shu',4,['diykuanggu']], - diy_zhenji: ["female", "wei", 3, ["diy_jiaoxia", "yiesheng"]], - // diy_menghuo:['male','shu',4,['huoshou','zaiqix']], - //re_huangyueying:['female','shu',3,['rejizhi','qicai']], - - diy_liufu: ["male", "wei", 3, ["zhucheng", "duoqi"]], - diy_xizhenxihong: ["male", "shu", 4, ["fuchou", "jinyan"]], - diy_liuzan: ["male", "wu", 4, ["kangyin"]], - diy_zaozhirenjun: ["male", "wei", 3, ["liangce", "jianbi", "diyjuntun"]], - diy_yangyi: ["male", "shu", 3, ["choudu", "liduan"]], - diy_tianyu: ["male", "wei", 4, ["chezhen", "youzhan"]], - - ns_zuoci: ["male", "qun", 3, ["nsxinsheng", "nsdunxing"]], - ns_lvzhi: ["female", "qun", 3, ["nsnongquan", "nsdufu"]], - ns_wangyun: ["male", "qun", 4, ["liangji", "jugong", "chengmou"]], - ns_nanhua: ["male", "qun", 3, ["nshuanxian", "nstaiping_nh", "nsshoudao"]], - ns_nanhua_left: ["male", "qun", 2, [], ["unseen"]], - ns_nanhua_right: ["female", "qun", 2, [], ["unseen"]], - ns_huamulan: ["female", "qun", 3, ["nscongjun", "xiaoji", "gongji"]], - ns_huangzu: ["male", "qun", 4, ["nsjihui", "nsmouyun"]], - ns_jinke: ["male", "qun", 4, ["nspinmin", "nsshishou"]], - ns_yanliang: [ - "male", - "qun", - 4, - ["nsduijue", "nsshuangxiong", "dualside"], - ["dualside:ns_wenchou"], - ], - ns_wenchou: ["male", "qun", 2, ["nsguanyong", "dualside"], ["unseen"]], - - ns_caocao: ["male", "wei", 4, ["nscaiyi", "nsgefa", "nshaoling"]], - ns_caocaosp: ["male", "qun", 3, ["nsjianxiong", "nsxionglue"]], - ns_zhugeliang: ["male", "shu", 3, ["nsguanxing", "kongcheng", "nsyunxing"]], - ns_wangyue: ["male", "qun", 4, ["nsjianshu", "nscangjian"]], - ns_yuji: ["male", "qun", 3, ["nsyaowang", "nshuanhuo"]], - ns_xinxianying: ["female", "wei", 3, ["nsdongcha", "nscaijian", "nsgongjian"]], - ns_guanlu: ["male", "wei", 3, ["nsbugua", "nstuiyan", "nstianji"]], - ns_simazhao: ["male", "wei", 3, ["nszhaoxin", "nsxiuxin", "nsshijun"]], - ns_sunjian: ["male", "wu", 4, ["nswulie", "nshunyou", "nscangxi"]], - - ns_duangui: ["male", "qun", 3, ["nscuanquan", "nsjianning", "nschangshi", "nsbaquan"]], - ns_zhangbao: ["male", "qun", 3, ["nsfuhuo", "nswangfeng"]], - ns_masu: ["male", "shu", 3, ["nstanbing", "nsxinzhan"]], - ns_zhangxiu: ["male", "qun", 4, ["nsbaiming", "nsfuge"]], - ns_lvmeng: ["male", "wu", 3, ["nsqinxue", "nsbaiyi"]], - ns_shenpei: ["male", "qun", 3, ["nshunji", "shibei"]], - - ns_yujisp: ["male", "qun", 3, ["nsguhuo"]], - ns_yangyi: ["male", "shu", 3, ["nsjuanli", "nsyuanchou"]], - ns_liuzhang: ["male", "qun", 3, ["nsanruo", "nsxunshan", "nskaicheng"]], - // ns_zhaoyun:['male','qun',3,[]], - // ns_lvmeng:['male','qun',3,[]], - // ns_zhaoyunshen:['male','qun',3,[]], - // ns_lisu:['male','qun',3,[]], - // ns_sunhao:['male','qun',3,[]], - ns_xinnanhua: ["male", "qun", 3, ["ns_xiandao", "ns_xiuzheng", "ns_chuanshu"]], - ns_caimao: ["male", "qun", 4, ["nsdingzhou"]], - ns_luyusheng: ["female", "wu", 3, ["nshuaishuang", "nsfengli"]], - ns_chengpu: ["male", "wu", 4, ["decadelihuo", "decadechunlao"]], - ns_sundeng: ["male", "wu", 4, ["xinkuangbi"]], - ns_duji: ["male", "wei", 3, ["xinfu_andong", "xinyingshi"]], - old_majun: ["male", "wei", 3, ["xinfu_jingxie1", "xinfu_qiaosi"]], - ns_mengyou: ["male", "qun", 4, ["nsmanzhi"]], - - old_jiakui: ["male", "wei", 4, ["tongqu", "xinwanlan"]], - ol_guohuai: ["male", "wei", 3, ["rejingce"]], - junk_zhangrang: ["male", "qun", 3, ["junktaoluan"], ["sex:male_castrated"]], - old_bulianshi: ["female", "wu", 3, ["anxu", "zhuiyi"]], - ol_maliang: ["male", "shu", 3, ["zishu", "xinyingyuan"]], - junk_liubei: ["male", "shu", 4, ["junkrende", "jijiang"], ["zhu"]], - junk_huangyueying: ["female", "shu", 3, ["junkjizhi", "junkqicai"]], - junk_lidian: ["male", "wei", 3, ["xunxun", "junkwangxi"]], - junk_duanwei: ["male", "qun", 4, ["junklangmie"]], - junk_xuyou: ["male", "qun", 3, ["nzry_chenglve", "junkshicai", "nzry_cunmu"]], - junk_zhangjiao: [ - "male", - "shen", - 3, - ["yizhao", "junksijun", "tianjie"], - ["qun", "die_audio:shen_zhangjiao"], - ], - junk_guanyu: ["male", "shu", 4, ["olsbfumeng", "olsbguidao"]], - }, - characterFilter: { - ns_duangui(mode) { - return mode == "identity" && _status.mode == "normal"; - }, - diy_liuyan(mode) { - return mode != "chess" && mode != "tafang"; - }, - }, - characterSort: { - diy: { - diy_yijiang: [ - "key_kud", - "key_misuzu", - "key_kamome", - "key_nao", - "ns_huangchengyan", - "ns_sunchensunjun", - "ns_yuanxi", - "ns_caoshuang", - ], - diy_yijiang2: [ - "key_yuuki", - "key_tenzen", - "key_kyouko", - "key_kotarou", - "key_kyou", - "ns_chentai", - "ns_huangwudie", - "ns_sunyi", - "ns_zhangning", - "ns_yanghu", - ], - diy_yijiang3: [ - "ns_ruanji", - "ns_zanghong", - "ns_limi", - "ns_zhonglimu", - "prp_zhugeliang", - "key_seira", - "key_kiyu", - "key_tomoyo", - "key_minagi", - "key_michiru", - ], - diy_tieba: [ - "ns_zuoci", - "ns_lvzhi", - "ns_wangyun", - "ns_nanhua", - "ns_nanhua_left", - "ns_nanhua_right", - "ns_huamulan", - "ns_huangzu", - "ns_jinke", - "ns_yanliang", - "ns_wenchou", - "ns_caocao", - "ns_caocaosp", - "ns_zhugeliang", - "ns_wangyue", - "ns_yuji", - "ns_xinxianying", - "ns_guanlu", - "ns_simazhao", - "ns_sunjian", - "ns_duangui", - "ns_zhangbao", - "ns_masu", - "ns_zhangxiu", - "ns_lvmeng", - "ns_shenpei", - "ns_yujisp", - "ns_yangyi", - "ns_liuzhang", - "ns_xinnanhua", - "ns_luyusheng", - ], - diy_fakenews: [ - "diy_wenyang", - "ns_zhangwei", - "ns_caimao", - "ns_chengpu", - "ns_sundeng", - "ns_duji", - "ns_mengyou", - ], - diy_xushi: [ - "diy_feishi", - "diy_hanlong", - "diy_liufu", - "diy_liuyan", - "diy_liuzan", - "diy_tianyu", - "diy_xizhenxihong", - "diy_yangyi", - "diy_zaozhirenjun", - ], - diy_default: ["diy_yuji", "diy_caiwenji", "diy_lukang", "diy_zhenji", "old_majun"], - diy_noname: ["noname"], - diy_trashbin: [ - "junk_guanyu", - "junk_zhangjiao", - "old_jiakui", - "ol_guohuai", - "junk_zhangrang", - "old_bulianshi", - "ol_maliang", - "junk_liubei", - "junk_huangyueying", - "junk_lidian", - "junk_duanwei", - "junk_xuyou", - ], - }, - }, - characterIntro: { - noname: "无名杀的吉祥物。
    画师:空城
    技能设计:李木子", - diy_hanlong: - "韩龙,魏国刺客。他孤身一人深入到了长城外的敌人领地,成功刺杀了敌方首领轲比能,瓦解了鲜卑民族,曹魏边境因此获得了几十年的安稳。", - ns_zhangwei: - "血骑教习·张葳,三国杀集换式卡牌游戏《阵面对决》中的帝畿系列卡牌。游卡桌游官方原创的三国时期女性角色。", - diy_feishi: - "字公举,生卒年不详,益州犍为郡南安县(今四川省乐山市)人。刘璋占据益州时,以费诗为绵竹县县令。刘备进攻刘璋夺取益州,费诗举城而降,后受拜督军从事,转任牂牁郡太守,再为州前部司马。", - diy_lukang: "字幼节,吴郡吴县(今江苏苏州)人。三国时期吴国名将,丞相陆逊次子。", - diy_liufu: - "字元颖,沛国相县(今安徽濉溪县西北)人。东汉末年名守。在汉末避难于淮南,说服袁术将戚寄和秦翊率部投奔曹操,曹操大悦,使司徒辟其为掾属。", - diy_xizhenxihong: - "习珍,襄阳人。三国时蜀汉将领。先主刘备时曾任零陵北部都尉,加裨将军。建安二十四年,关羽率荆州大军攻打樊城,唯有习珍据城不降。被困月余,直到箭尽粮绝,拔剑自刎而死。习宏,生卒年不详,习珍之弟。曾在东吴入侵蜀汉时建议哥哥习珍伪降,约樊胄举兵。习珍死后,弟弟习宏落在东吴,有问必不答,终身不为孙权发一言。", - diy_zaozhirenjun: - "枣祗,生卒年月不详,东汉末年颍川阳翟(今河南省禹州市)人。曾任东阿令、羽林监、屯田都尉、陈留太守等职。任峻(?—204年),字伯达,河南郡中牟县人。曹操每次出征,任峻通常在后方补给军队。后来发生饥荒,枣祗建议实施屯田,任峻被任命为典农中郎将,招募百姓在许下屯田,结果连年丰收,积谷足以装满全部粮仓。", - diy_yangyi: - "字威公,襄阳(今湖北襄阳)人,三国时期蜀汉政治家。最初,为荆州刺史傅群的主簿,后投奔关羽,任为功曹。羽遣其至成都,大受刘备赞赏,擢为尚书。建兴三年(225年)任丞相参军,此后一直跟随诸葛亮战斗。亮卒,他部署安全退军。亮生前定蒋琬继己任,仪仅拜中军师。建兴十三年(235年),因多出怨言,被削职流放至汉嘉郡。但杨仪仍不自省,又上书诽谤,言辞激烈,最后下狱,自杀身亡。", - diy_tianyu: - "字国让,渔阳雍奴(今天津市武清区东北)人。三国时期曹魏将领。初从刘备,因母亲年老回乡,后跟随公孙瓒,公孙瓒败亡,劝说鲜于辅加入曹操。曹操攻略河北时,田豫正式得到曹操任用,历任颖阴、郎陵令、弋阳太守等。", - chentai: - "陈泰(200年~260年),字玄伯,颍川许昌(今河南省许昌市)人。三国时期魏国名将,司空陈群之子。陈泰早年起家员外散骑侍郎,其父陈群死后袭封颍阴侯,历任游击将军、并州、雍州刺史、尚书等职,高平陵政变发生时,陈泰力劝大将军曹爽投降,因此得到掌权的司马氏信任,此后为了回避朝廷的争斗,陈泰主动请求外调雍州任职,任内成功防御蜀将姜维的多次进攻。甘露元年(256年),陈泰被调回朝中任尚书右仆射,曾随司马昭两度抵抗东吴的进攻,后改任左仆射。甘露五年(260年),魏帝曹髦被弑杀,陈泰闻讯后悲痛过度,呕血而死,享年六十一岁。追赠司空,赐谥为穆。", - huangwudie: - "黄舞蝶是在现代三国作品中出场的虚拟人物,设定为蜀汉大将黄忠之女,跟随父亲一同投效刘备,在游戏中是一名不错的女将。", - sunyi: "孙翊(184年~204年),又名孙俨,字叔弼,是孙坚的第三子,孙策、孙权的弟弟。曾被大臣推荐为继承者。孙权继位后,孙翊任丹杨太守,后被身边的人边鸿刺杀。", - zhangning: "《三国杀·阵面对决》中登场的角色。张角之女,能呼雷掣电。", - yanghu: "羊祜(221年-278年12月27日),字叔子,泰山郡南城县人。西晋时期杰出的战略家、政治家、文学家,曹魏上党太守羊衜的儿子,名儒蔡邕的女儿蔡文姬的外甥。出身“泰山羊氏”,博学能文,清廉正直。曹魏时期,接受公车征辟,出任中书郎,迁给事黄门侍郎。姐姐嫁给大将军司马师,投靠司马氏家族,仕途平步青云。魏元帝曹奂即位,出任秘书监、相国从事中郎、中领军,统领御林军,兼管内外政事,册封钜平县子,迁。西晋建立后,迁中军将军、散骑常侍、郎中令,册封钜平侯。泰始五年(269年),出任车骑将军、荆州都督,加任开府仪同三司坐镇襄阳,屯田兴学,以德怀柔,深得军民之心;扩充军备,训练士兵,全力准备灭亡孙吴,累迁征南大将军,册封南城侯。咸宁四年,去世,临终前举荐杜预接任职务,获赠侍中、太傅,谥号为“成”。唐宋时期,配享武庙。", - ns_wangyue: - "王越,东汉末年游侠(生卒年不详),乃辽东燕山人士,擅使剑术, 三国时期史阿的师父,曹丕的师公,官职虎贲将军。在史书《典论》中略有记载。", - }, - characterTitle: { - key_kud: "#b千夜", - key_misuzu: "#b长发及腰黑长直", - key_kamome: "#b仿生纱", - key_nao: "#b潮鸣", - key_kyou: "#b长发及腰黑长直", - key_yuuki: "#b4399司命", - key_kyouko: "#b阿阿阿687", - key_tenzen: "#b皋耳击", - key_kotarou: "#bb1154486224", - key_seira: "#b阿开木木W🍀", - key_kiyu: "#b无面◎隐者", - key_tomoyo: "#b长发及腰黑长直", - key_minagi: "#b无面◎隐者", - - ns_huangchengyan: "#g竹邀月", - ns_sunchensunjun: "#gVenusjeu", - ns_yuanxi: "#g食茸二十四", - ns_caoshuang: "#g荬庀芬兰", - ns_chentai: "#g荀彧III荀文若", - ns_huangwudie: "#g你爸爸来了164", - ns_sunyi: "#g无民氏4251", - ns_zhangning: "#g如颍隋行1314", - ns_yanghu: "#ginCenv", - ns_ruanji: "#g伯约的崛起", - ns_zanghong: "#g阿七", - ns_limi: "#g-心若困兽-", - ns_zhonglimu: "#gJG赛文♠7", - prp_zhugeliang: "#g阿开木木W🍀", - - ns_luyusheng: "#g猫咪大院 - 魚と水", - ns_caimao: "#gP尔号玩家◆", - diy_wenyang: "#g最粗的梦想XD", - ns_zuoci: "#bskystarwuwei", - ns_lvzhi: "#bskystarwuwei", - ns_wangyun: "#rSukincen", - ns_guanlu: "#rSukincen", - ns_xinnanhua: "#rSukincen", - ns_nanhua: "#g戒除联盟", - ns_shenpei: "#g戒除联盟", - ns_huamulan: "#p哎别管我是谁", - ns_jinke: "#p哎别管我是谁", - ns_huangzu: "#r小芯儿童鞋", - ns_lisu: "#r小芯儿童鞋", - ns_yanliang: "#r丶橙续缘", - ns_wenchou: "#r丶橙续缘", - ns_caocao: "#r一瞬间丶遗忘", - ns_caocaosp: "#g希望教主", - ns_zhugeliang: "#p死不死什么的", - ns_xinxianying: "#b扶苏公子", - ns_zhangbao: "#b扶苏公子", - ns_wangyue: "#p废城君", - ns_sunjian: "#b兔子两只2", - ns_lvmeng: "#b兔子两只2", - ns_yujisp: "#b兔子两只2", - ns_yuji: "#g蔚屿凉音", - ns_simazhao: "#r一纸载春秋", - ns_duangui: "#b宝宝酱紫萌萌哒", - ns_masu: "#g修女", - ns_zhangxiu: "#p本因坊神策", - ns_yangyi: "#p本因坊神策", - ns_liuzhang: "#r矮子剑薄荷糖", - ns_mengyou: "#g残昼厄夜", - }, - card: { - nsfuzhou_card: { - fullskin: true, - type: "delay", - wuxieable: false, - modTarget(card, player, target) { - return lib.filter.judge(card, player, target); - }, - enable(card, player) { - return player.canAddJudge(card); - }, - filterTarget(card, player, target) { - return lib.filter.judge(card, player, target) && player == target; - }, - judge(card) { - if (get.color(card) == "red") return 0; - return -4; - }, - effect() { - var source = cards[0].storage.nsfuzhou_source; - if (!source || !source.isIn()) return; - source.line(player, "thunder"); - if (result.color == "black") { - player.damage(source, source.storage.nsfuzhou_damage ? 2 : 1, "thunder"); - player.chooseToDiscard("he", true); - } else { - source.draw(2); - if (typeof player.storage.nsfuzhou_num != "number") player.storage.nsfuzhou_num = 0; - if (source.storage.nsfuzhou_draw) { - player.recover(); - player.draw(); - player.storage.nsfuzhou_num++; - } else player.storage.nsfuzhou_num--; - player.addTempSkill("nsfuzhou_num"); - player.markSkill("nsfuzhou_num"); - } - }, - ai: { - basic: { - order: 1, - useful: 0, - value: 0, - }, - result: { - target: -1, - }, - tag: { - // damage:1, - // natureDamage:1, - // thunderDamage:1, - }, - }, - }, - }, - perfectPair: { - yuji: ["zuoci"], - key_riki: ["key_rin", "key_saya", "key_kyousuke", "key_kud"], - key_kud: ["key_harukakanata"], - key_komari: ["key_rin", "key_sasami"], - key_masato: ["key_kengo"], - key_yuiko: ["key_harukakanata"], - key_doruji: ["key_rin"], - key_tomoya: ["key_nagisa", "key_sunohara", "key_kotomi"], - key_ao: ["key_inari"], - key_shiroha: ["key_umi"], - key_shizuku: ["key_tsumugi"], - key_yuzuru: ["key_hinata", "key_kanade", "key_ayato"], - key_yuri: ["key_kanade", "key_abyusa"], - key_hinata: ["key_yui"], - key_iwasawa: ["key_hisako"], - key_yuu: ["key_nao"], - key_jojiro: ["key_yusa"], - key_kaori: ["key_shiori"], - key_chihaya: ["key_sakuya"], - key_lucia: ["key_shizuru"], - }, - /** @type { importCharacterConfig['skill'] } */ - skill: { - //远野美凪&远野小满 - minagi_peiquan: { - enable: "phaseUse", - filter(event, player) { - return player.hasCard((card) => card.hasGaintag("minagi_tag"), "h"); - }, - filterCard(card) { - return card.hasGaintag("minagi_tag"); - }, - position: "h", - filterTarget: lib.filter.notMe, - discard: false, - lose: false, - delay: false, - promptfunc: () => - "出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。", - check: (card) => { - const player = _status.event.player; - return get.type(card, false) == "equip" && - game.hasPlayer( - (current) => - player.canGift(card, current, true) && - !current.refuseGifts(card, player) && - get.effect(current, card, player, player) > 0 - ) - ? 2 - : 1 + Math.random(); - }, - content() { - "step 0"; - player.gift(cards, target); - "step 1"; - var list = player.getStorage("minagi_peiquan_yukito"); - if (list.length >= 4) event.finish(); - else { - var yukito = get.translation(target); - player - .chooseButton( - [ - "配券:请选择一项执行", - [ - [ - ["damage", "选项一:对" + yukito + "造成1点伤害"], - ["draw", "选项二:摸两张牌"], - ["discard", "选项三:弃置" + yukito + "的两张牌"], - ["use", "选项四:亮出牌堆顶的一张牌,然后可以使用之"], - ], - "textbutton", - ], - ], - true - ) - .set("list", list) - .set("filterButton", function (button) { - return !_status.event.list.includes(button.link); - }) - .set("ai", function (button) { - var player = _status.event.player, - target = _status.event.getParent().target; - switch (button.link) { - case "damage": - return get.damageEffect(target, player, player); - case "draw": - return 2 * get.effect(player, { name: "draw" }, player, player); - case "discard": - return ( - get.effect(target, { name: "guohe_copy2" }, player, player) * - Math.min(1.6, target.countCards("he")) - ); - case "use": - return _status.event.getRand("minagi_peiquan") * 4; - } - }); - } - "step 2"; - player.markAuto("minagi_peiquan_yukito", result.links); - player.addTempSkill("minagi_peiquan_yukito"); - switch (result.links[0]) { - case "damage": - target.damage("nocard"); - break; - case "draw": - player.draw(2); - break; - case "discard": - player.discardPlayerCard(target, 2, "he", true); - break; - } - if (result.links[0] != "use") event.finish(); - "step 3"; - var card = get.cards()[0]; - game.cardsGotoOrdering(card); - player.showCards(card); - player.chooseUseTarget(card, "是否使用" + get.translation(card) + "?"); - }, - ai: { - order: 4, - result: { - player: (player, target) => { - const giftEffects = ui.selected.cards.map((value) => - player.getGiftEffect(value, target) - ); - const baseEffect = Math.min( - 3, - giftEffects.reduce( - (previousValue, currentValue) => previousValue + currentValue, - 0 - ) / giftEffects.length - ); - const choices = ["damage", "draw", "discard", "use"]; - choices.removeArray(player.getStorage("minagi_peiquan_yukito")); - if (choices.length <= 0) return baseEffect; - return ( - baseEffect + - Math.max( - ...choices.map((choice) => { - switch (choice) { - case "damage": - return get.damageEffect(target, player, player); - case "draw": - return ( - 2 * get.effect(player, { name: "draw" }, player, player) - ); - case "discard": - return ( - get.effect( - target, - { name: "guohe_copy2" }, - player, - player - ) * Math.min(1.6, target.countCards("he")) - ); - case "use": - return _status.event.getRand("minagi_peiquan") * 4; - } - }) - ) - ); - }, - }, - }, - group: "minagi_peiquan_umareta", - subSkill: { - yukito: { charlotte: true, onremove: true }, - umareta: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0 - ); - }, - content() { - var hs = player.getCards("h"); - player.addGaintag(hs, "minagi_tag"); - }, - }, - }, - }, - minagi_huanliu: { - trigger: { player: "phaseZhunbeiBegin" }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - lib.filter.notMe, - get.prompt("minagi_huanliu"), - "和一名其他角色进行“协力”,并获得“远野小满”的所有对应技能" - ) - .set("ai", function (target) { - return ( - get.threaten(target) * - Math.sqrt(1 + target.countCards("h")) * - (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1) - ); - }) - .forResult(); - }, - content() { - "step 0"; - var target = targets[0]; - player.chooseCooperationFor(target, "minagi_huanliu").set("ai", function (button) { - var base = 0; - switch (button.link) { - case "cooperation_damage": - base = 0.1; - break; - case "cooperation_draw": - base = 0.6; - break; - case "cooperation_discard": - base = 0.1; - break; - case "cooperation_use": - base = 0.3; - break; - } - return base + Math.random(); - }); - player.addAdditionalSkill("cooperation", ["minagi_huanliu_effect", "michiru_sheyuan"]); - "step 1"; - game.delayx(); - }, - subSkill: { - effect: { - charlotte: true, - trigger: { global: "phaseJieshuBegin" }, - forced: true, - logTarget: "player", - filter(event, player) { - return ( - player.checkCooperationStatus(event.player, "minagi_huanliu") && - player.countCards("h") > 0 - ); - }, - content() { - game.log(player, "和", trigger.player, "的协力成功"); - var hs = player.getCards("h"); - player.addGaintag(hs, "minagi_tag"); - game.delayx(); - }, - }, - }, - derivation: "michiru_sheyuan", - }, - michiru_sheyuan: { - charlotte: true, - enable: "chooseToUse", - filter(event, player) { - if (player.hasSkill("michiru_sheyuan_round")) return false; - var hs = player.getCards("h"); - if (!hs.length) return false; - for (var i of hs) { - if (i.hasGaintag("minagi_tag")) return false; - if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; - } - for (var name of lib.inpile) { - var type = get.type(name); - if (type != "basic" && type != "trick") return false; - var card = get.autoViewAs({ name: name }, hs); - if (event.filterCard(card, player, event)) return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(card, player, event)) return true; - } - } - } - return false; - }, - hiddenCard(player, name) { - var type = get.type(name); - if (type != "basic" && type != "trick") return false; - if (player.hasSkill("michiru_sheyuan_round")) return false; - var hs = player.getCards("h"); - if (!hs.length) return false; - if (_status.connectMode) return true; - for (var i of hs) { - if (i.hasGaintag("minagi_tag")) return false; - if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; - } - return true; - }, - chooseButton: { - dialog(event, player) { - var list = [], - hs = player.getCards("h"); - for (var name of lib.inpile) { - var type = get.type(name); - if (type != "basic" && type != "trick") continue; - var card = get.autoViewAs({ name: name }, hs); - if (event.filterCard(card, player, event)) list.push([type, "", name]); - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(card, player, event)) - list.push([type, "", name, nature]); - } - } - } - return ui.create.dialog("舍愿", [list, "vcard"], "hidden"); - }, - check(button) { - var player = _status.event.player; - var card = { - name: button.link[2], - nature: button.link[3], - }; - if (_status.event.getParent().type == "phase") - return player.getUseValue(card, null, true); - return 1; - }, - backup(links, player) { - return { - viewAs: { - name: links[0][2], - nature: links[0][3], - }, - filterCard: true, - position: "h", - selectCard: -1, - onuse(result, player) { - player.addTempSkill("michiru_sheyuan_round", "roundStart"); - }, - }; - }, - prompt(links, player) { - return ( - "将所有手牌当做" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) + - "使用,然后摸等量的牌" - ); - }, - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter(player, tag, arg) { - return lib.skill.michiru_sheyuan.hiddenCard(player, "s" + tag.slice(8)); - }, - order: 1, - result: { - player(player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - round: { - charlotte: true, - trigger: { player: "useCardAfter" }, - forced: true, - popup: false, - filter(event, player) { - return event.skill == "michiru_sheyuan_backup"; - }, - content() { - player.draw(trigger.cards.length); - }, - }, - backup: {}, - }, - }, - //坂上智代 - tomoyo_wuwei: { - enable: ["chooseToUse", "chooseToRespond"], - viewAs: { name: "sha" }, - viewAsFilter(player) { - var storage = player.getStorage("tomoyo_wuwei_mark"); - return player.hasCard(function (card) { - return !storage.includes(get.suit(card)); - }, "hs"); - }, - position: "hs", - filterCard(card, player) { - var storage = player.getStorage("tomoyo_wuwei_mark"); - return !storage.includes(get.suit(card)); - }, - check(card) { - return 5 - get.value(card); - }, - onuse(result, player) { - player.markAuto("tomoyo_wuwei_mark", [get.suit(result.card, false)]); - player.addTempSkill("tomoyo_wuwei_mark"); - }, - onrespond(event, player) { - player.markAuto("tomoyo_wuwei_mark", [get.suit(event.card, false)]); - player.addTempSkill("tomoyo_wuwei_mark"); - }, - group: "tomoyo_wuwei_combo", - subSkill: { - mark: { - charlotte: true, - onremove: true, - }, - combo: { - trigger: { global: "useCardAfter" }, - direct: true, - //chooseToUse类技能暂时没办法改 - filter(event, player) { - return ( - event.card.name == "shan" && - player.inRangeOf(event.player) && - player.canUse("sha", event.player, false) - ); - }, - content() { - player - .chooseToUse( - "武威:是否对" + get.translation(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 = "tomoyo_wuwei_combo"; - }, - }, - }, - }, - tomoyo_zhengfeng: { - dutySkill: true, - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - return game.hasPlayer((current) => player.inRange(current)); - }, - derivation: "tomoyo_changshi", - async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - get.prompt("tomoyo_zhengfeng"), - "令一名攻击范围内的角色进行判定。其于你的下回合开始前使用与判定结果颜色相同的牌时,你摸一张牌。", - function (card, player, target) { - return player.inRange(target); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - if (player.hp <= 1 && !player.countCards("h")) return 0; - var hs = target.countCards("h"), - thr = get.threaten(target); - if (target.hasJudge("lebu")) return 0; - return Math.sqrt(1 + hs) * Math.sqrt(Math.max(1, 1 + thr)); - }) - .forResult(); - }, - content() { - "step 0"; - var target = targets[0]; - event.target = target; - target.judge(); - "step 1"; - player.addTempSkill("tomoyo_zhengfeng_tomoyo", { - player: "phaseBeginStart", - }); - player.markAuto("tomoyo_zhengfeng_tomoyo", [ - { - target: target, - color: result.color, - }, - ]); - }, - group: "tomoyo_zhengfeng_after", - subSkill: { - tomoyo: { - charlotte: true, - onremove: true, - mod: { - inRangeOf(source, player) { - var list = player.getStorage("tomoyo_zhengfeng_tomoyo"); - for (var obj of list) { - if (obj.target == source) return true; - } - }, - }, - trigger: { global: "useCard" }, - forced: true, - filter(event, player) { - var color = get.color(event.card); - if (color == "none") return false; - var list = player.getStorage("tomoyo_zhengfeng_tomoyo"); - for (var obj of list) { - if (obj.target == event.player && color == obj.color) return true; - } - return false; - }, - content() { - player.draw(); - }, - intro: { - mark(dialog, students, player) { - if (!students || !students.length) return "全校风纪良好!"; - var str = ""; - for (var i of students) { - if (str.length > 0) str += "
    "; - str += get.translation(i.target); - str += ":"; - str += get.translation(i.color); - } - dialog.addText(str); - }, - }, - }, - after: { - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return !player.hasHistory("useSkill", function (evt) { - return evt.skill == "tomoyo_zhengfeng"; - }); - }, - prompt: "整风:是否放弃使命?", - prompt2: - "你可以减1点体力上限并失去〖武威〗,摸两张牌并回复1点体力,然后获得技能〖长誓〗。", - skillAnimation: true, - animationColor: "gray", - check(event, player) { - return player.hp * 1.1 + player.countCards("h") < 3; - }, - content() { - "step 0"; - game.log(player, "放弃了身为学生会长的使命"); - player.awakenSkill("tomoyo_zhengfeng"); - player.loseMaxHp(); - "step 1"; - player.removeSkills("tomoyo_wuwei"); - "step 2"; - player.draw(2); - player.recover(); - "step 3"; - player.addSkills("tomoyo_changshi"); - }, - }, - }, - }, - tomoyo_changshi: { - trigger: { - global: ["gainAfter", "loseAsyncAfter"], - }, - forced: true, - filter(event, player) { - return game.hasPlayer(function (current) { - return ( - current != player && event.getg(current).length > 1 && player.inRangeOf(current) - ); - }); - }, - content() { - player.draw(); - }, - group: "tomoyo_changshi_recover", - subSkill: { - recover: { - trigger: { global: "recoverAfter" }, - forced: true, - filter(event, player) { - return event.player.isAlive() && player.inRangeOf(event.player); - }, - content() { - player.changeHujia(1); - }, - }, - }, - }, - //天宫希优 - kiyu_yuling: { - mod: { - targetEnabled(card) { - var info = get.info(card); - if (!info || (info.type != "trick" && info.type != "delay")) return; - if (info.range) return false; - }, - }, - trigger: { target: "useCardToTargeted" }, - forced: true, - charlotte: true, - filter(event, player) { - return event.card.name == "sha" && event.player.countCards("he") > 0; - }, - logTarget: "player", - content() { - trigger.player.chooseToDiscard("he", true, get.distance(trigger.player, player)); - }, - ai: { - threaten: 0.7, - effect: { - target(card, player, target, current) { - if (card.name == "sha") return 0.7; - }, - }, - }, - }, - kiyu_rexianyu: { - trigger: { player: "phaseUseEnd" }, - charlotte: true, - unique: true, - filter(event, player) { - return ( - !player.hasSkill("kiyu_rexianyu_round", null, null, false) && - player.hasHistory("useCard", function (evt) { - var type = get.type(evt.card); - if (type != "basic" && type != "trick") return false; - return evt.getParent("phaseUse") == event; - }) - ); - }, - async cost(event, trigger, player) { - const history = player.getHistory("useCard", function (evt) { - var type = get.type(evt.card); - if (type != "basic" && type != "trick") return false; - return evt.getParent("phaseUse") == trigger; - }); - const list = []; - for (var i = 0; i < Math.min(history.length, 3); i++) { - var card = history[i].card; - list.push({ name: card.name, isCard: true }); - if (card.nature) list[i].nature = card.nature; - } - const { result } = await player - .chooseTarget( - get.prompt("kiyu_rexianyu"), - "将以下使用结果告知于一名其他角色:" + get.translation(list), - function (card, player, target) { - return ( - target != player && - !target.hasSkill("kiyu_rexianyu_lastrun", null, null, false) - ); - } - ) - .set("ai", function (target) { - return ( - get.attitude(_status.event.player, target) * - get.threaten(target) * - Math.sqrt(1 + target.countCards("h")) * - (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1) - ); - }); - if (result.bool) { - event.result = { - bool: result.bool, - targets: result.targets, - cost_data: { list }, - }; - } - }, - async content(event, trigger, player) { - player.addTempSkill("kiyu_rexianyu_round", "roundStart"); - const tabito = targets[0]; - tabito.storage.kiyu_rexianyu_lastrun = event.cost_data.list; - tabito.storage.amamiya_kiyu = player; - tabito.addTempSkill("kiyu_rexianyu_lastrun", { - player: ["phaseUseAfter"], - global: ["roundStart"], - }); - await game.asyncDelayx(); - }, - subSkill: { - round: { charlotte: true }, - lastrun: { - enable: "chooseToUse", - onChooseToUse(event) { - if (!game.online && event.type == "phase") { - var evtx = event.getParent(); - var num = event.player.getHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == evtx; - }).length; - event.set("rexianyu_num", num); - } - }, - filter(event, player) { - if (!player.countCards("hs")) return false; - var num = event.rexianyu_num, - list = player.storage.kiyu_rexianyu_lastrun; - if (!Array.isArray(list) || typeof num != "number" || list.length <= num) - return false; - var card = get.copy(list[num]); - delete card.isCard; - card = get.autoViewAs(card, "unsure"); - if (event.filterCard(card, player, event)) return true; - return false; - }, - onremove: true, - viewAs(cards, player) { - var num = _status.event.rexianyu_num, - list = player.storage.kiyu_rexianyu_lastrun; - if (!Array.isArray(list) || typeof num != "number" || list.length <= num) - return { name: "sha" }; - var card = get.copy(list[num]); - delete card.isCard; - return card; - }, - prompt() { - var player = _status.event.player; - var num = _status.event.rexianyu_num, - list = player.storage.kiyu_rexianyu_lastrun; - if (!Array.isArray(list) || typeof num != "number" || list.length <= num) - return "无可用牌"; - var card = list[num]; - var str = "将一张牌当做" + get.translation(card); - var kiyu = player.storage.amamiya_kiyu; - if (kiyu && kiyu.isAlive()) - str += ";然后" + get.translation(kiyu) + "摸一张牌,且你本回合的手牌上限+1"; - return str; - }, - filterCard: true, - position: "h", - popname: true, - check(card) { - var player = _status.event.player; - var num = _status.event.rexianyu_num, - list = player.storage.kiyu_rexianyu_lastrun; - return ( - player.getUseValue(list[num], null, true) - - player.getUseValue(card, null, true) - ); - }, - group: "kiyu_rexianyu_earthbound", - mark: true, - intro: { content: "已记录:$" }, - ai: { - order: 12, - result: { - player(player) { - var lunarq = player.storage.amamiya_kiyu; - if (lunarq && get.attitude(player, lunarq) <= 0) return -1; - return 1; - }, - }, - }, - }, - earthbound: { - trigger: { player: "useCardAfter" }, - forced: true, - charlotte: true, - filter(event, player) { - if (event.skill != "kiyu_rexianyu_lastrun") return false; - var lunarq = player.storage.amamiya_kiyu; - return get.itemtype(lunarq) == "player" && lunarq.isAlive(); - }, - content() { - var lunarq = player.storage.amamiya_kiyu; - lunarq.draw(); - player.addTempSkill("kiyu_rexianyu_wolf"); - player.addMark("kiyu_rexianyu_wolf", 1, false); - }, - }, - wolf: { - charlotte: true, - onremove: true, - mod: { - maxHandcard(player, num) { - return num + player.countMark("kiyu_rexianyu_wolf"); - }, - }, - markimage: "image/card/handcard.png", - intro: { content: "手牌上限+#" }, - }, - }, - }, - kiyu_xianyu: { - trigger: { global: "phaseUseBegin" }, - charlotte: true, - round: 1, - filter(event, player) { - return event.player.countCards("h") > 0; - }, - logTarget: "player", - check(event, player) { - var target = event.player; - var next = target.next; - if (target.getSeatNum() > next.getSeatNum()) return true; - if ( - target.countCards("h") < 4 && - target.countCards("h", function (card) { - return target.hasUseTarget(card, null, true); - }) < 2 - ) - return false; - return true; - }, - content() { - "step 0"; - var target = trigger.player, - cards = target.getCards("h"); - var next = player.chooseToMove( - "先预:预测" + get.translation(target) + "使用牌的顺序", - true - ); - next.set("list", [[get.translation(target) + "的手牌", cards]]); - next.set("processAI", function (list) { - var cards = list[0][1].slice(0); - var target = _status.event.getTrigger().player; - cards.sort(function (a, b) { - return get.order(b, target) - get.order(a, target); - }); - return [cards]; - }); - "step 1"; - if (result.bool) { - var list = result.moved[0]; - player.storage.kiyu_xianyu_lastrun = list; - player.addTempSkill("kiyu_xianyu_lastrun", list); - } - }, - subSkill: { - lastrun: { - trigger: { global: "phaseUseAfter" }, - forced: true, - charlotte: true, - onremove: true, - content() { - var num = 0, - index = -1, - target = trigger.player; - var cards = player.getStorage("kiyu_xianyu_lastrun"); - var history = target.getHistory("useCard", function (event) { - return event.getParent("phaseUse") == trigger; - }); - for (var evt of history) { - var goon = false; - for (var card of evt.cards) { - var index2 = cards.indexOf(card); - if (index2 > index) { - goon = true; - index = index2; - } - } - if (goon) num++; - } - if (num > 0) { - num = Math.min(3, num); - player.draw(num); - if (target.isIn()) { - target.addTempSkill("kiyu_xianyu_effect"); - target.addMark("kiyu_xianyu_effect", num, false); - } - } - }, - }, - effect: { - charlotte: true, - onremove: true, - mod: { - maxHandcard(player, num) { - return num + player.countMark("kiyu_xianyu_effect"); - }, - }, - }, - }, - }, - //樱庭星罗 - seira_xinghui: { - trigger: { player: "phaseZhunbeiBegin" }, - check(event, player) { - return !player.getExpansions("seira_xinghui").length; - }, - content() { - "step 0"; - game.delayx(); - "step 1"; - if (get.isLuckyStar(player)) { - event.num = 6; - player.throwDice(6); - } else player.throwDice(); - "step 2"; - var cards = get.cards(num); - event.cards = cards; - game.cardsGotoOrdering(cards); - var next = player.chooseToMove(); - next.set("prompt", "星辉:选择要作为“星屑”的牌(先选择的在上)"); - next.set("list", [["置于武将牌上", cards], ["置入弃牌堆"]]); - 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 3"; - if (result.bool && result.moved && result.moved[0].length) { - event.cards = result.moved[0]; - player - .chooseTarget( - true, - "将以下牌置于一名角色的武将牌上", - get.translation(event.cards), - function (card, player, target) { - return !target.getExpansions("seira_xinghui").length; - } - ) - .set("ai", function (target) { - return target == _status.event.player ? 1 : 0; - }); - event.cards.reverse(); - } else event.finish(); - "step 4"; - var target = result.targets[0]; - player.line(target, { color: [253, 153, 182] }); - target.addToExpansion(cards).gaintag.add("seira_xinghui"); - game.log(player, "将" + get.cnNumber(cards.length) + "张牌置于", target, "的武将牌上"); - target.addSkill("seira_xinghui_hoshikuzu"); - }, - intro: { - markcount: "expansion", - content(storage, player) { - return "共有" + get.cnNumber(player.getExpansions("seira_xinghui").length) + "张牌"; - }, - onunmark(storage, player) { - player.removeSkill("seira_xinghui_hoshikuzu"); - }, - }, - subSkill: { - hoshikuzu: { - trigger: { source: "damageBegin1" }, - forced: true, - charlotte: true, - filter(event, player) { - return player.getExpansions("seira_xinghui").length > 0; - }, - content() { - trigger.num++; - game.log(player, "造成了", "#y暴击伤害"); - }, - group: ["seira_xinghui_draw", "seira_xinghui_judge"], - }, - draw: { - trigger: { player: "drawBefore" }, - forced: true, - filter(event, player) { - return player.getExpansions("seira_xinghui").length > 0; - }, - content() { - var cards = player.getExpansions("seira_xinghui"); - var num = Math.min(cards.length, trigger.num); - trigger.num -= num; - player.gain(cards.slice(0, num), "draw"); - if (trigger.num == 0) trigger.cancel(); - }, - }, - judge: { - trigger: { player: "judgeBegin" }, - forced: true, - filter(event, player) { - return player.getExpansions("seira_xinghui").length > 0; - }, - content() { - trigger.directresult = player.getExpansions("seira_xinghui")[0]; - }, - }, - }, - }, - seira_yuanying: { - enable: "phaseUse", - usable: 1, - filterTarget: true, - selectTarget: 2, - multitarget: true, - multiline: true, - line: { color: [253, 153, 182] }, - content() { - game.filterPlayer() - .sortBySeat() - .forEach(function (current) { - if (!targets.includes(current)) { - current.removeSkills("seira_yinyuan"); - } else { - current.addSkills("seira_yinyuan"); - } - }); - game.delayx(); - }, - ai: { - order: 1, - result: { target: 1 }, - expose: 0.1, - }, - derivation: "seira_yinyuan", - }, - seira_yinyuan: { - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return ( - target != player && - target.hasSkill("seira_yinyuan", null, null, false) && - target.countCards("hej") > 0 - ); - }, - content() { - player.gainPlayerCard(target, true, "hej"); - target.recover(); - }, - mark: true, - intro: { - content: - "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。", - }, - ai: { - order: 9, - viewHandcard: true, - skillTagFilter(player, tag, arg) { - if (player == arg) return false; - return player.hasSkill("seira_yinyuan") && arg.hasSkill("seira_yinyuan"); - }, - result: { - player(player, target) { - var effect = get.effect(target, { name: "shunshou_copy" }, player, player); - if (target.isDamaged()) { - if (effect < 0) effect /= 2; - effect += get.recoverEffect(target, player, player); - } - return effect; - }, - }, - }, - }, - //派对浪客 - nsxingyun: { - audio: 2, - enable: "chooseToUse", - getSixiang(card) { - if (typeof card == "string") card = { name: card }; - if (card.name == "shan") return "玄武"; - var type = get.type(card, null, false); - if (type == "delay") return "朱雀"; - if (get.tag(card, "damage")) return "白虎"; - if (get.tag(card, "recover")) return "玄武"; - if (type == "trick") return "青龙"; - return false; - }, - filter(event, player) { - if (player.hasSkill("nsxingyun_round")) return false; - var list = player.getStorage("nsxingyun"); - if (list.length >= 4) return false; - for (var i of lib.inpile) { - var type = lib.skill.nsxingyun.getSixiang(i); - if (!type || list.includes(type)) continue; - if (event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) - return true; - if (i == "sha") { - for (var j of lib.inpile_nature) { - if ( - event.filterCard( - get.autoViewAs({ name: i, nature: j }, "unsure"), - player, - event - ) - ) - return true; - } - } - } - return false; - }, - chooseButton: { - dialog(event, player) { - var map = { 青龙: [], 朱雀: [], 白虎: [], 玄武: [] }; - var list = player.getStorage("nsxingyun"); - for (var i of lib.inpile) { - var type = lib.skill.nsxingyun.getSixiang(i); - if (!type || list.includes(type)) continue; - if (event.filterCard({ name: i }, player, event)) - map[type].push([get.type2(i, false), "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) { - if (event.filterCard({ name: i, nature: j }, player, event)) - map[type].push([get.type2(i, false), "", i, j]); - } - } - } - var dialog = ["星陨", "hidden"]; - for (var i in map) { - if (map[i].length > 0) { - dialog.push('
    ' + i + "
    "); - dialog.push([map[i], "vcard"]); - } - } - return ui.create.dialog.apply(ui.create, dialog); - }, - filter(button, player) { - return _status.event.getParent().filterCard( - { - name: button.link[2], - nature: button.link[3], - }, - player, - _status.event.getParent() - ); - }, - check(button) { - if (_status.event.getParent().type != "phase") return 1; - return _status.event.player.getUseValue( - { - name: button.link[2], - nature: button.link[3], - }, - false - ); - }, - backup(links, player) { - return { - selectCard: 1, - filterCard: true, - popname: true, - position: "hs", - check(card) { - return 7 - get.value(card); - }, - viewAs: { name: links[0][2], nature: links[0][3] }, - precontent() { - player.addTempSkill("nsxingyun_round"); - }, - }; - }, - prompt(links, player) { - return ( - "将一张手牌当做" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) + - "使用" - ); - }, - }, - ai: { - threaten: 2.6, - order: 1, - result: { player: 1 }, - }, - group: "nsxingyun_clear", - derivation: ["nsxingyun_faq", "bazhen"], - subSkill: { - backup: {}, - clear: { - trigger: { player: "useCardAfter" }, - forced: true, - popup: false, - filter(event, player) { - return ( - event.skill == "nsxingyun_backup" && - event.cards.length == 1 && - lib.skill.nsxingyun.getSixiang(event.card) != - lib.skill.nsxingyun.getSixiang(event.cards[0]) && - !player - .getStorage("nsxingyun") - .includes(lib.skill.nsxingyun.getSixiang(event.card)) - ); - }, - content() { - "step 0"; - player.draw(2); - player.markAuto("nsxingyun", [lib.skill.nsxingyun.getSixiang(trigger.card)]); - "step 1"; - if (player.getStorage("nsxingyun").length >= 4) player.addSkills("bazhen"); - }, - }, - round: { - charlotte: true, - onremove: true, - }, - }, - }, - nshanlang: { - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer((current) => player != current && player.canCompare(current)) - ); - }, - async cost(event, trigger, player) { - const goon = player.hasCard(function (card) { - return get.value(card) <= 7; - }, "h"); - event.result = await player - .chooseTarget( - [1, 3], - get.prompt("nshanlang"), - "和至多三名角色进行拼点", - function (card, player, target) { - return target != player && player.canCompare(target); - } - ) - .set("ai", function (target) { - if (!_status.event.goon) return false; - var att = get.attitude(_status.event.player, target); - if (att >= 0) return 0; - if (target.hasSkillTag("noh")) att /= 3; - return -att / Math.sqrt(target.countCards("h")); - }) - .set("goon", goon) - .forResult(); - }, - content() { - "step 0"; - event.max_num = 0; - targets.sortBySeat(); - player.chooseToCompare(targets).callback = lib.skill.nshanlang.callback; - "step 1"; - if (event.target) { - player - .chooseBool("是否令" + get.translation(target) + "获得一张牌?") - .set("goon", get.attitude(player, target) > 0) - .set("ai", () => _status.event.goon); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = get.cardPile2(function (card) { - return !lib.skill.nsxingyun.getSixiang(card); - }); - if (card) target.gain(card, "gain2"); - } - }, - callback() { - var list = [ - [player, event.num1], - [target, event.num2], - ], - evt = event.getParent(2); - for (var i of list) { - if (i[1] > evt.max_num) { - evt.max_num = i[1]; - evt.target = i[0]; - } else if (evt.target && i[1] == evt.max_num && i[0] != evt.target) { - delete evt.target; - } - } - }, - }, - //钟离牧 - nskuanhuai: { - trigger: { player: "phaseUseBegin" }, - content() { - "step 0"; - var card = get.discardPile(function (card) { - return get.type(card) != "basic"; - }); - if (card) player.gain(card, "gain2"); - "step 1"; - player.addTempSkill("nskuanhuai_blocker", "phaseUseAfter"); - player.addTempSkill("nskuanhuai_effect"); - }, - subSkill: { - blocker: { - charlotte: true, - mod: { - cardEnabled(card) { - if (get.type(card) == "basic") return false; - }, - cardSavable(card) { - if (get.type(card) == "basic") return false; - }, - }, - }, - effect: { - trigger: { player: "phaseDiscardEnd" }, - charlotte: true, - popup: false, - filter(event, player) { - return player.hasHistory("lose", function (evt) { - if (evt.type != "discard" || evt.getParent("phaseDiscard") != event) - return false; - for (var i of evt.cards2) { - if ( - get.type(i, false) == "basic" && - get.position(i, true) == "d" && - player.hasUseTarget(i) - ) - return true; - } - return false; - }); - }, - content() { - "step 0"; - var cards = []; - player.getHistory("lose", function (evt) { - if (evt.type != "discard" || evt.getParent("phaseDiscard") != trigger) - return false; - for (var i of evt.cards2) { - if (get.type(i, false) == "basic" && get.position(i, true) == "d") - cards.push(i); - } - return false; - }); - event.cards = cards; - "step 1"; - var cards2 = event.cards.filter(function (i) { - return get.position(i, true) == "d" && player.hasUseTarget(i); - }); - if (cards2.length) { - player.chooseButton(["宽怀:是否使用其中一张牌?", cards2]); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = result.links[0]; - cards.remove(card); - player.chooseUseTarget(card, true); - if (cards.length > 0) event.goto(1); - } - }, - }, - }, - }, - nsdingbian: { - trigger: { player: "useCard" }, - forced: true, - filter(event, player) { - if (player != _status.currentPhase) return false; - return get.type(event.card) != "basic"; - }, - content() { - "step 0"; - player.addTempSkill("nsdingbian_mark"); - player.addMark("nsdingbian_mark", 1, false); - var storage = player.getStorage("nsdingbian_ignore"); - var goon = false; - for (var i of lib.inpile) { - if (get.type(i) == "basic" && !storage.includes(i)) { - goon = true; - break; - } - } - if (goon) - player - .chooseControl() - .set("choiceList", [ - "从牌堆中获得一张基本牌", - "令一种基本牌于本回合内不计入手牌上限", - ]) - .set("prompt", "定边:请选择一项") - .set("ai", function () { - var player = _status.event.player; - var list = ["tao", "shan"], - list2 = player.getStorage("nsdingbian_ignore"); - list.removeArray(list2); - if (!list.length) return 0; - var num1 = player.countCards("hs", function (card) { - return ( - get.type(card) != "basic" && - player.hasValueTarget(card, null, true) - ); - }), - num2 = player.getHandcardLimit(); - if (player.countCards("h", list) <= num2 - num1) return 0; - return 1; - }); - else event._result = { index: 0 }; - "step 1"; - if (result.index == 0) { - var card = get.cardPile2(function (card) { - return get.type(card, false) == "basic"; - }); - if (card) player.gain(card, "gain2"); - event.finish(); - } else { - var list = [], - storage = player.getStorage("nsdingbian_ignore"); - for (var i of lib.inpile) { - if (get.type(i) == "basic" && !storage.includes(i)) { - list.push(i); - } - } - player - .chooseButton(["令一种基本牌于本回合内不计入手牌上限", [list, "vcard"]], true) - .set("ai", function (button) { - var name = button.link[2], - player = _status.event.player; - if (name == "sha") return 0; - var cards = player.getCards("h", name); - if (!cards.length) return 0; - return get.value(cards, player); - }); - } - "step 2"; - player.markAuto("nsdingbian_ignore", [result.links[0][2]]); - }, - subSkill: { - mark: { - onremove(player) { - delete player.storage.nsdingbian_mark; - delete player.storage.nsdingbian_ignore; - }, - mod: { - maxHandcard: (player, num) => num - player.countMark("nsdingbian_mark"), - ignoredHandcard(card, player) { - if (player.getStorage("nsdingbian_ignore").includes(get.name(card, player))) { - return true; - } - }, - cardDiscardable(card, player, name) { - if ( - name == "phaseDiscard" && - player.getStorage("nsdingbian_ignore").includes(get.name(card, player)) - ) { - return false; - } - }, - }, - intro: { content: "手牌上限-#" }, - }, - }, - }, - //李密 - nstuilun: { - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return ( - player.hp > 1 && - player.countCards("h") > 1 && - player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "nstuilun"); - }, "h") - ); - }, - prompt2: "失去任意点体力(至多失去至1点)并弃置任意张手牌(至多弃置至一张)。", - check(event, player) { - if ( - game.hasPlayer(function (current) { - return current != player && current.hp >= player.hp; - }) - ) - return true; - return false; - }, - content() { - "step 0"; - if (player.hp == 2) event._result = { index: 0 }; - else { - var list = []; - for (var i = 1; i < player.hp; i++) { - list.push(i + "点"); - } - player.chooseControl(list).set("prompt", "请选择失去体力的量"); - } - "step 1"; - player.loseHp(1 + result.index); - "step 2"; - if ( - player.countCards("h") > 1 && - player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "nstuilun"); - }, "h") - ) { - player.chooseToDiscard("h", true, [1, player.countCards("h") - 1]); - } else game.delayx(); - "step 3"; - player.addTempSkill("nstuilun_effect", { - player: "phaseBeginStart", - }); - }, - subSkill: { - effect: { - charlotte: true, - trigger: { global: "phaseBegin" }, - forced: true, - popup: false, - filter(event, player) { - return ( - player.hp < event.player.hp || - (player.hp > 0 && player.countCards("h") < event.player.countCards("h")) - ); - }, - content() { - "step 0"; - if (player.hp < trigger.player.hp) { - player - .chooseTarget("退论:是否令一名角色回复或失去1点体力?") - .set("ai", function (target) { - var eff = get.effect(target, { name: "losehp" }, player, player); - if (target.isDamaged()) - eff = Math.max(eff, get.recoverEffect(target, player, player)); - return eff; - }); - } else event.goto(3); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("nstuilun_effect", target); - if (target.isHealthy()) event._result = { index: 1 }; - else - player - .chooseControl("回复1点体力", "失去1点体力") - .set("prompt", "令" + get.translation(target) + "…") - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().target; - if ( - get.recoverEffect(target, player, player) >= - get.effect(target, { name: "losehp" }, player, player) - ) - return 0; - return 1; - }); - } else event.goto(3); - "step 2"; - if (result.index == 0) target.recover(); - else target.loseHp(); - "step 3"; - if (trigger.player.countCards("h") > player.countCards("h")) { - var str = get.cnNumber(player.hp); - player - .chooseTarget("退论:是否令一名角色摸一张牌或弃置一张牌?") - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att > 0 || target.countCards("he") == 0) - return get.effect(target, { name: "draw" }, player, player); - return get.effect(target, { name: "guohe_copy2" }, target, player); - }); - } else event.finish(); - "step 4"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("nstuilun_effect", target); - if (!target.countCards("he")) event._result = { index: 0 }; - else - player - .chooseControl("摸一张牌", "弃置一张牌") - .set("prompt", "令" + get.translation(target) + "…") - .set("ai", function (player) { - var evt = _status.event; - return get.attitude(evt.player, evt.getParent().target) > 0 - ? 0 - : 1; - }); - } else event.finish(); - "step 5"; - if (result.index == 0) target.draw(); - else target.chooseToDiscard("he", true); - }, - }, - }, - }, - //阮籍 - nsshizui: { - trigger: { target: "useCardToTargeted" }, - usable: 1, - filter(event, player) { - var type = get.type(event.card, null, false); - return ( - (type == "basic" || type == "trick") && - player.countCards("he") > 0 && - player.hasUseTarget({ name: "jiu" }, null, true) - ); - }, - async cost(event, trigger, player) { - var suit = get.suit(trigger.card), - cards = trigger.cards.filterInD(); - var str = "弃置一张牌并视为使用一张【酒】"; - if (lib.suit.includes(suit)) - str += - ";若弃置" + - get.translation(suit) + - "牌,则" + - get.translation(trigger.card) + - "对你无效"; - if (cards.length) str += ";若弃置♣牌则获得" + get.translation(cards); - str += "。"; - var next = player.chooseToDiscard("he", get.prompt("nsshizui"), str, "chooseonly"); - next.set("val1", cards.length ? get.value(cards, player) : 0); - next.set("val2", -get.effect(player, trigger.card, trigger.player, player)); - next.set("suit", suit); - next.set("ai", function (card) { - var base = 2, - suit = get.suit(card); - if (suit == "club") base += _status.event.val1; - if (suit == _status.event.suit) base += _status.event.val2; - return base - get.value(card); - }); - event.result = await next.forResult(); - }, - content() { - "step 0"; - event.suit1 = get.suit(cards[0], player); - player.discard(cards); - player.chooseUseTarget("jiu", true); - "step 1"; - var suit1 = event.suit1, - suit2 = get.suit(trigger.card, false); - if (suit1 == suit2 && lib.suit.includes(suit1)) trigger.excluded.add(player); - if (suit1 == "club") { - var cards = trigger.cards.filterInD(); - if (cards.length > 0) player.gain(cards, "gain2"); - } - }, - }, - nsxiaoye: { - trigger: { global: "phaseJieshuBegin" }, - filter(event, player) { - return ( - player.hasHistory("useCard", function (evt) { - return evt.card.name == "jiu"; - }) && - event.player.hasHistory("useCard", function (evt) { - return ( - (evt.card.name == "sha" || get.type(evt.card) == "trick") && - player.hasUseTarget({ - name: evt.card.name, - nature: evt.card.nature, - isCard: true, - }) - ); - }) - ); - }, - async cost(event, trigger, player) { - const list = []; - trigger.player.getHistory("useCard", function (evt) { - if (evt.card.name != "sha" && get.type(evt.card) != "trick") return; - if (evt.card.name == "sha" && evt.card.nature) list.add("sha:" + evt.card.nature); - else list.add(evt.card.name); - }); - for (let i = 0; i < list.length; i++) { - if (list[i].indexOf("sha:") == 0) list[i] = ["基本", "", "sha", list[i].slice(4)]; - else list[i] = [get.type(list[i]), "", list[i]]; - } - const { result } = await player - .chooseButton([get.prompt("nsxiaoye"), [list, "vcard"]]) - .set("filterButton", function (button) { - return player.hasUseTarget({ - name: button.link[2], - nature: button.link[3], - isCard: true, - }); - }) - .set("ai", function (button) { - return player.getUseValue({ - name: button.link[2], - nature: button.link[3], - isCard: true, - }); - }); - if (result.bool) { - event.result = { - bool: true, - cost_data: { - card: { - name: result.links[0][2], - nature: result.links[0][3], - isCard: true, - }, - }, - }; - } - }, - async content(event, trigger, player) { - player.chooseUseTarget(true, event.cost_data.card); - }, - }, - //臧洪 - nsshimeng: { - enable: "phaseUse", - usable: 1, - selectTarget: [1, Infinity], - filterTarget: true, - contentBefore() { - event.getParent()._nsshimeng_count = [0, 0]; - }, - content() { - "step 0"; - if (!target.isIn()) { - event.finish(); - return; - } - target - .chooseToUse("使用一张【杀】,或摸一张牌", function (card, player) { - if (get.name(card) != "sha") return false; - return lib.filter.cardEnabled.apply(this, arguments); - }) - .set("addCount", false); - "step 1"; - if (result.bool) { - event.getParent()._nsshimeng_count[0]++; - } else { - event.getParent()._nsshimeng_count[1]++; - target.draw(); - } - }, - contentAfter() { - var list = event.getParent()._nsshimeng_count; - if (list[0] < list[1]) { - player.changeHujia(1); - player.loseHp(); - } - }, - ai: { - order: 3.05, - result: { - player(player, target) { - var att = get.attitude(player, target); - if (att <= 0) return 0; - if (player.hp > 1 || player.countCards("hs", ["tao", "jiu"])) return 1; - if (!ui.selected.targets.length) { - if (target != player) return 0; - if (player.hasSha()) return 1; - return 0; - } - if (ui.selected.targets.length > 1 && !target.hasSha()) return 0; - return 1; - }, - }, - }, - }, - //加纳天善(改版) - tenzen_fenghuan: { - trigger: { global: "useCardAfter" }, - filter(event, player) { - if ( - player == event.player || - event.targets.length != 1 || - event.targets[0] != player || - !event.player.isIn() || - (event.card.name != "sha" && - (get.type(event.card, null, false) != "trick" || !get.tag(event.card, "damage"))) - ) - return false; - if ( - !player.canUse( - { - name: event.card.name, - nature: event.card.nature, - isCard: true, - }, - event.player, - false - ) - ) - return false; - var num = get.number(event.card); - if (typeof num != "number") return false; - num *= 2; - var hs = player.getCards("he"); - for (var i of hs) { - num -= get.number(i); - if (num <= 0) return true; - } - return false; - }, - async cost(event, trigger, player) { - const num = get.number(trigger.card) * 2, - card = { - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - }; - event.result = await player - .chooseToDiscard( - "he", - get.prompt("tenzen_fenghuan", trigger.player), - "弃置任意张点数之和不小于" + - num + - "的牌,然后视为对其使用一张" + - get.translation(card), - "chooseonly" - ) - .set("selectCard", function () { - var cards = ui.selected.cards, - num = _status.event.cardNumber; - for (var i of cards) { - num -= get.number(i); - if (num <= 0) return [cards.length, cards.length + 1]; - } - return [cards.length + 1, cards.length + 1]; - }) - .set("cardNumber", num) - .set("effect", get.effect(trigger.player, card, player, player)) - .set("ai", function (card) { - var eff = _status.event.effect; - if (eff <= 0) return 0; - for (var i of ui.selected.cards) - eff -= get.value(i) / Math.sqrt(get.number(i) / 3); - return eff - get.value(card) / Math.sqrt(get.number(card) / 3); - }) - .forResult(); - }, - async content(event, trigger, player) { - await player.discard(event.cards); - var card = { - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - }, - target = trigger.player; - if (target.isIn() && player.canUse(card, target, false)) - await player.useCard(card, target, false); - }, - }, - tenzen_retianquan: { - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - return ( - event.card.name == "sha" && - (player.hp > 0 || - player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "tenzen_retianquan"); - }, "he")) - ); - }, - logTarget: "target", - usable: 1, - check(event, player) { - if (get.attitude(player, event.target) >= 0) return false; - if (player.hp > player.maxHp / 2) return true; - if ( - player.hasCard(function (card) { - return ( - lib.filter.cardDiscardable(card, player, "tenzen_retianquan") && - get.value(card) < 6 - ); - }, "he") - ) - return true; - return true; - }, - prompt2: - "你可失去1点体力或弃置一张牌,亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。每有一张基本牌,其所需使用的【闪】的数量便+1。然后若此牌造成过伤害,则你获得展示牌中的所有非基本牌。", - content() { - "step 0"; - player - .chooseToDiscard("弃置一张牌,或点「取消」失去1点体力", "he") - .set("goon", player.hp > player.maxHp / 2) - .set("ai", function (card) { - var val = get.value(card); - if (_status.event.goon) return 0.1 - val; - return 6 - val; - }); - "step 1"; - if (!result.bool) player.loseHp(); - "step 2"; - var cards = get.cards(player.hp <= player.maxHp / 2 ? 5 : 3); - player.showCards(cards, get.translation(player) + "发动了【天全】"); - game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent(); - var num = cards.filter(function (card) { - return get.type(card, false) == "basic"; - }).length; - if (num) { - if (trigger.card.name == "sha") { - var id = trigger.target.playerid; - var map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].shanRequired == "number") { - map[id].shanRequired += num; - } else { - map[id].shanRequired = 1 + num; - } - } - } - if (num < 5) { - var next = game.createEvent("tenzen_retianqua_gain"); - next.cards = cards; - next.player = player; - event.next.remove(next); - trigger.getParent().after.push(next); - next.setContent(function () { - if ( - player.getHistory("sourceDamage", function (evt) { - return evt.card == event.parent.card; - }).length > 0 - ) - player.gain( - cards.filter(function (card) { - return get.type(card, false) != "basic"; - }), - "gain2" - ); - }); - } - }, - }, - //藤林杏 - kyou_zhidian: { - locked: false, - mod: { - targetInRange(card) { - if (card.kyou_zhidian) return true; - }, - aiOrder(player, card, numx) { - var num = _status.event._kyou_zhidian_baseValue; - if (num > 0 && get.type2(card) == "trick" && player.getUseValue(card) < num) - return numx / 10; - }, - }, - enable: "chooseToUse", - filter(event, player) { - return player.countCards("hs", (card) => get.type2(card) == "trick") > 0; - }, - filterCard(card) { - return get.type2(card) == "trick"; - }, - onChooseToUse(event) { - event._kyou_zhidian_baseValue = event.player.getUseValue({ - name: "sha", - }); - }, - check(card) { - var num = _status.event._kyou_zhidian_baseValue, - player = _status.event.player; - return num - player.getUseValue(card); - }, - prompt: "将一张锦囊牌当做【杀】使用", - viewAs: { - name: "sha", - kyou_zhidian: true, - }, - group: "kyou_zhidian_aim", - ai: { - respondSha: true, - skillTagFilter: (player) => - player.countCards("hs", (card) => get.type2(card) == "trick") > 0, - }, - subSkill: { - aim: { - trigger: { - player: "useCardToPlayered", - }, - forced: true, - locked: false, - filter(event, player) { - return event.isFirstTarget && event.card.name == "sha"; - }, - logTarget: "target", - content() { - "step 0"; - var list = ["不可被响应", "无视防具", "伤害+1", "不计入次数"]; - list.remove(player.storage.kyou_zhidian); - player - .chooseControl(list) - .set("prompt", "掷典:请为" + get.translation(trigger.card) + "选择一种效果") - .set( - "choice", - (function () { - if (list.includes("不计入次数") && player.hasSha()) - return "不计入次数"; - if ( - list.includes("不可被响应") && - trigger.target.mayHaveShan( - player, - "use", - trigger.target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) - ) - return "不可被响应"; - if (list.includes("伤害+1")) return "伤害+1"; - return list.randomGet(); - })() - ) - .set("ai", () => _status.event.choice); - "step 1"; - var target = trigger.target; - player.storage.kyou_zhidian = result.control; - game.log(player, "对", target, "的", trigger.card, "#g" + result.control); - switch (result.control) { - case "不可被响应": - trigger.directHit.add(target); - break; - case "无视防具": - target.addTempSkill("qinggang2"); - target.storage.qinggang2.add(trigger.card); - break; - case "伤害+1": - var map = trigger.customArgs; - var id = target.playerid; - if (!map[id]) map[id] = {}; - if (!map[id].extraDamage) map[id].extraDamage = 0; - map[id].extraDamage++; - break; - case "不计入次数": - var evt = trigger.getParent(); - if (evt.addCount !== false) { - evt.addCount = false; - player.getStat().card.sha--; - } - break; - } - }, - }, - }, - }, - kyou_duanfa: { - trigger: { player: "damageBegin2" }, - limited: true, - skillAnimation: true, - animationColor: "thunder", - filter(event, player) { - return player.hp <= event.num; - }, - content() { - player.awakenSkill("kyou_duanfa"); - if (player.countCards("h") > 0) player.chooseToDiscard("h", true, player.countCards("h")); - player.recover(); - trigger.cancel(); - player.addTempSkill("kyou_duanfa_draw", { - player: "phaseBeginStart", - }); - }, - subSkill: { - draw: { - trigger: { target: "useCardToTargeted" }, - forced: true, - charlotte: true, - filter(event, player) { - if (event.card.name == "sha") return true; - return ( - get.type(event.card, false) == "trick" && get.tag(event.card, "damage") > 0 - ); - }, - content() { - player.draw(); - }, - }, - }, - }, - //天王寺瑚太朗 - kotarou_aurora: { - trigger: { - player: ["damageEnd", "loseHpEnd", "gainMaxHpEnd"], - }, - forced: true, - charlotte: true, - filter(event, player) { - return player.hasEnabledSlot(1); - }, - content() { - if (player.hasEmptySlot(1)) { - var card = get.cardPile2(function (card) { - return ( - get.subtype(card) == "equip1" && - !get.cardtag(card, "gifts") && - player.canUse(card, player) - ); - }); - if (card) player.chooseUseTarget(card, true); - } else player.chooseUseTarget("sha", true, false); - }, - }, - kotarou_rewrite: { - enable: "phaseUse", - charlotte: true, - filter(event, player) { - return !player.hasSkill("kotarou_rewrite_block"); - }, - content() { - "step 0"; - player.getHistory("custom").push({ kotarou_rewrite: true }); - player - .chooseControl() - .set("choiceList", [ - "视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌", - "移动场上的一张牌", - "增加1点体力上限并失去1点体力", - "本回合内下一次造成的伤害+1", - "本回合内下一次回复体力时,额外回复1点体力", - "本回合内手牌上限和【杀】的使用次数+1                         ", - ]) - .set("ai", function () { - var player = _status.event.player; - if (player.hp > 2 && player.getUseValue({ name: "sha" }) > 0) return 2; - return 0; - }); - "step 1"; - lib.skill.kotarou_rewrite.rewrites[result.index](player, event); - if (result.index != 0) event.goto(3); - "step 2"; - if (result.bool) { - player.storage.kotarou_rewrite.push(result.links[0][2]); - player.chooseUseTarget(true, { - name: result.links[0][2], - nature: result.links[0][3], - isCard: true, - }); - } - "step 3"; - if ( - player.getHistory("custom", function (evt) { - return evt && evt.kotarou_rewrite == true; - }).length >= 3 - ) - player.addTempSkill("kotarou_rewrite_block"); - }, - onremove: true, - rewrites: [ - function (player, event) { - var list = []; - if (!player.storage.kotarou_rewrite) player.storage.kotarou_rewrite = []; - for (var i of lib.inpile) { - if (player.storage.kotarou_rewrite.includes(i)) continue; - var type = get.type(i); - if (type == "basic" || type == "trick") list.push([type, "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) list.push([type, "", i, j]); - } - } - if (list.length) { - player - .chooseButton(["改写:视为使用一张基本牌或普通锦囊牌", [list, "vcard"]], true) - .set("filterButton", function (button) { - return player.hasUseTarget( - { - name: button.link[2], - nature: button.link[3], - isCard: true, - }, - null, - true - ); - }) - .set("ai", function (button) { - return player.getUseValue({ - name: button.link[2], - nature: button.link[3], - isCard: true, - }); - }); - } else event._result = { bool: false }; - }, - function (player, event) { - player.moveCard(true); - }, - function (player, event) { - if (player.maxHp < 5) player.gainMaxHp(); - player.loseHp(); - }, - function (player, event) { - player.addSkill("kotarou_rewrite_damage"); - player.addMark("kotarou_rewrite_damage", 1, false); - game.log(player, "本回合下次造成的伤害", "#y+1"); - }, - function (player, event) { - player.addSkill("kotarou_rewrite_recover"); - player.addMark("kotarou_rewrite_recover", 1, false); - game.log(player, "本回合下次回复的体力", "#y+1"); - }, - function (player, event) { - player.addSkill("kotarou_rewrite_sha"); - player.addMark("kotarou_rewrite_sha", 1, false); - game.log(player, "本回合的手牌上限和使用【杀】的次数上限", "#y+1"); - }, - ], - ai: { - order: 4, - result: { - player(player) { - if ( - player.getHistory("custom", function (evt) { - return evt && evt.kotarou_rewrite == true; - }).length >= 2 - ) - return 0; - return 1; - }, - }, - }, - }, - kotarou_rewrite_damage: { - onremove: true, - trigger: { source: "damageBegin1" }, - forced: true, - content() { - trigger.num += player.countMark("kotarou_rewrite_damage"); - player.removeSkill("kotarou_rewrite_damage"); - }, - charlotte: true, - intro: { content: "下一次造成的伤害+#" }, - }, - kotarou_rewrite_recover: { - onremove: true, - trigger: { player: "recoverBegin" }, - forced: true, - content() { - trigger.num += player.countMark("kotarou_rewrite_recover"); - player.removeSkill("kotarou_rewrite_recover"); - }, - charlotte: true, - intro: { content: "下一次回复的体力+#" }, - }, - kotarou_rewrite_sha: { - onremove: true, - mod: { - maxHandcard(player, num) { - return num + player.countMark("kotarou_rewrite_sha"); - }, - cardUsable(card, player, num) { - if (card.name == "sha") return num + player.countMark("kotarou_rewrite_sha"); - }, - }, - charlotte: true, - intro: { content: "手牌上限和出杀次数+#" }, - }, - kotarou_rewrite_block: { - trigger: { player: "phaseEnd" }, - forced: true, - charlotte: true, - content() { - player.removeSkill("kotarou_rewrite"); - player.removeSkill("kotarou_aurora"); - if (player.maxHp > 3) player.loseMaxHp(player.maxHp - 3); - }, - }, - //加纳天善(旧) - tenzen_yixing: { - trigger: { - global: "damageEnd", - }, - filter(event, player) { - if (!event.card || (event.card.name != "sha" && event.card.name != "juedou")) - return false; - var hairi = event.source; - if ( - hairi && - (hairi == player || player.inRangeOf(hairi)) && - hairi.isIn() && - hairi.name1 != "key_shizuku" && - hairi.name2 != "key_shizuku" - ) - return true; - hairi = event.player; - return ( - hairi && - (hairi == player || player.inRange(hairi)) && - hairi.isIn() && - hairi.name1 != "key_shizuku" && - hairi.name2 != "key_shizuku" - ); - }, - frequent: true, - content() { - "step 0"; - player.draw(); - "step 1"; - if (player.countCards("he") > 0) { - player.chooseCard("he", true, "将一张牌作为“兴”置于武将牌上"); - } else event.finish(); - "step 2"; - if (result.bool) { - var cards = result.cards; - player.addToExpansion(cards, player, "give").gaintag.add("tenzen_yixing"); - } - }, - intro: { - content: "expansion", - onunmark: "expansion", - }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: "tenzen_yixing_counter", - subSkill: { - counter: { - trigger: { target: "useCardToTargeted" }, - filter(event, player) { - if (player == event.player || !player.getExpansions("tenzen_yixing").length) - return false; - return ( - event.targets.length == 1 && - (event.card.name == "sha" || get.type(event.card) == "trick") - ); - }, - prompt2(event) { - return ( - "获得一张“兴”,且" + - get.translation(event.card) + - "结算完成后可以弃置两张牌,视为对" + - get.translation(event.player) + - "使用一张同名牌" - ); - }, - check(event, player) { - if ( - !player.storage.tenzen_lingyu && - player.getExpansions("tenzen_yixing").length < 3 - ) - return false; - var card = { - name: event.card.name, - nature: event.card.nature, - isCard: true, - }; - return ( - player.canUse(card, event.player, false) && - get.effect(event.player, card, player, player) > 0 - ); - }, - content() { - "step 0"; - player.chooseButton( - ["选择获得一张“兴”", player.getExpansions("tenzen_yixing")], - true - ); - "step 1"; - if (result.bool) { - player.gain(result.links, "gain2"); - } - var next = game.createEvent("tenzen_yixing_insert"); - event.next.remove(next); - trigger.getParent().after.push(next); - next.player = player; - next.target = trigger.player; - next.setContent(lib.skill.tenzen_yixing.content_extra); - }, - }, - }, - content_extra() { - "step 0"; - var card = event.getParent().card; - event.card = { - name: card.name, - nature: card.nature, - isCard: true, - }; - if ( - player.countCards("he") > 1 && - target && - target.isIn() && - player.canUse(event.card, target, false) - ) { - player - .chooseToDiscard( - "he", - 2, - "是否弃置两张牌,视为对" + - get.translation(target) + - "使用" + - get.translation(event.card) + - "?" - ) - .set("ai", function (card) { - return 5 - get.value(card); - }); - } else event.finish(); - "step 1"; - if (result.bool) player.useCard(card, target, false, "tenzen_yixing"); - }, - }, - tenzen_lingyu: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "water", - filter(event, player) { - return player.getExpansions("tenzen_yixing").length >= player.hp; - }, - content() { - player.awakenSkill("tenzen_lingyu"); - player.storage.tenzen_lingyu = true; - player.loseMaxHp(); - if (player.isHealthy()) player.draw(2); - player.addSkills("tenzen_tianquan"); - }, - ai: { - combo: "tenzen_yixing" - }, - }, - tenzen_tianquan: { - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - return ( - (event.card.name == "sha" || event.card.name == "juedou") && - event.targets.length == 1 && - player.getExpansions("tenzen_yixing").length > 1 - ); - }, - logTarget: "target", - usable: 1, - check(event, player) { - return get.attitude(player, event.target) < 0; - }, - content() { - "step 0"; - //player.viewHandcards(trigger.target); - player.chooseButton(["选择移去两张“兴”", player.getExpansions("tenzen_yixing")], true, 2); - "step 1"; - if (result.bool) { - player.loseToDiscardpile(result.links); - var cards = get.cards(5); - player.showCards(cards, get.translation(player) + "发动了【天全】"); - game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent(); - var num = cards.filter(function (card) { - return get.type(card, false) == "basic"; - }).length; - if (num) { - if (trigger.card.name == "sha") { - var id = trigger.target.playerid; - var map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].shanRequired == "number") { - map[id].shanRequired += num; - } else { - map[id].shanRequired = 1 + num; - } - } else { - var idt = trigger.target.playerid; - var map = trigger.getParent().customArgs; - if (!map[idt]) map[idt] = {}; - if (!map[idt].shaReq) map[idt].shaReq = {}; - if (!map[idt].shaReq[idt]) map[idt].shaReq[idt] = 1; - map[idt].shaReq[idt]++; - } - } - if (num < 5) { - var next = game.createEvent("tenzen_lingyu_gain"); - next.cards = cards; - next.player = player; - event.next.remove(next); - trigger.getParent().after.push(next); - next.setContent(function () { - if ( - player.getHistory("sourceDamage", function (evt) { - return evt.card == event.parent.card; - }).length > 0 - ) - player.gain( - cards.filter(function (card) { - return get.type(card, false) != "basic"; - }), - "gain2" - ); - }); - } - } - }, - }, - //伊座并杏子 - kyouko_rongzhu: { - trigger: { global: "gainEnd" }, - filter(event, player) { - if (player == event.player || event.getParent().name == "kyouko_rongzhu") return false; - var evt = event.getl(player); - return evt && evt.cards2 && evt.cards2.length > 0; - }, - logTarget: "player", - check(event, player) { - return get.attitude(player, event.player) > 0; - }, - content() { - "step 0"; - player.draw(); - "step 1"; - var target = trigger.player; - if (player.countCards("he") > 0 && target.isIn()) { - player.chooseCard("he", true, "将一张牌交给" + get.translation(target)); - } else event.finish(); - "step 2"; - if (result.bool) { - player.give(result.cards, trigger.player); - var target = _status.currentPhase; - var name; - if (target == player) { - name = "kyouko_rongzhu_me"; - player.addTempSkill(name); - player.addMark(name, 1, false); - } else if (target == trigger.player) { - name = "kyouko_rongzhu_notme"; - target.addTempSkill(name); - target.addMark(name, 1, false); - } - } - }, - subSkill: { - me: { - mod: { - maxHandcard(player, num) { - return num + player.countMark("kyouko_rongzhu_me"); - }, - }, - intro: { content: "手牌上限+#" }, - onremove: true, - }, - notme: { - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") return num + player.countMark("kyouko_rongzhu_notme"); - }, - }, - intro: { content: "使用杀的次数上限+#" }, - onremove: true, - }, - }, - }, - kyouko_gongmian: { - enable: "phaseUse", - prompt: "出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。", - filter(event, player) { - return game.hasPlayer(function (current) { - return ( - current != player && lib.skill.kyouko_gongmian.filterTarget(null, player, current) - ); - }); - }, - filterTarget(card, kyouko, hina) { - if (kyouko == hina || kyouko.getStorage("kyouko_gongmian").includes(hina)) return false; - var hs = hina.countCards("he"); - if (hs == 0) return kyouko.countCards("h") == 0; - return true; - }, - content() { - "step 0"; - player.markAuto("kyouko_gongmian", targets); - var hs = player.countCards("h"), - ts = target.countCards("h"); - player.getHistory("custom").push({ kyouko_gongmian: true }); - if (hs > ts) { - event.utype = 1; - target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); - } else if (hs == ts) { - game.asyncDraw([player, target]); - event.utype = 2; - } else { - event.utype = 3; - player.gainPlayerCard(target, true, "he"); - } - "step 1"; - if (event.utype == 2) { - game.delayx(); - event.finish(); - } else if (!result.bool) event.finish(); - else if (event.utype == 1) target.give(result.cards, player); - "step 2"; - if (player.countCards("he") > 0) { - player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); - } else event.finish(); - "step 3"; - if (result.bool) player.give(result.cards, target); - }, - intro: { - content: "已与$共勉", - }, - group: ["kyouko_gongmian_use", "kyouko_gongmian_discard"], - ai: { - order: 6, - result: { - target(player, target) { - if ( - player.getHistory("custom", function (evt) { - return evt.kyouko_gongmian == true; - }).length - ) - return 0; - return 1; - }, - }, - }, - }, - kyouko_gongmian_use: { - trigger: { player: "phaseUseEnd" }, - filter(event, player) { - return ( - player.getHistory("custom", function (evt) { - return evt.kyouko_gongmian == true; - }).length > 0 && - game.hasPlayer(function (current) { - return current != player && current.countGainableCards(player, "hej") > 0; - }) - ); - }, - async cost(event, trigger, player) { - const num = player.getHistory("custom", function (evt) { - return evt.kyouko_gongmian == true; - }).length; - event.result = await player - .chooseTarget( - get.prompt("kyouko_gongmian"), - "获得一名其他角色的至多" + get.cnNumber(num) + "张牌,然后交给其等量的牌", - function (card, player, target) { - return target != player && target.countGainableCards(player, "hej") > 0; - } - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att > 0) return att; - var he = player.getCards("he"); - if ( - target.countCards("he", function (card) { - return get.value(card, target) > 7; - }) && - he.length > 0 - ) - return ( - -att + - 5 - - Math.min.apply( - Math, - he.map(function (card) { - return get.value(card, player); - }) - ) - ); - return 0; - }) - .forResult(); - }, - async content(event, trigger, player) { - const num = player.getHistory("custom", function (evt) { - return evt.kyouko_gongmian == true; - }).length, - target = event.targets[0]; - let result = await player.gainPlayerCard(target, "hej", true, [1, num]).forResult(); - if ( - target.isIn() && - result.bool && - result.cards && - result.cards.length && - player.countCards("he") > 0 - ) { - const num = result.cards.length, - hs = player.getCards("he"); - if (hs.length <= num) result = { bool: true, cards: hs }; - else { - result = await player - .chooseCard( - "he", - true, - num, - "交给" + get.translation(target) + get.cnNumber(num) + "张牌" - ) - .forResult(); - } - if (result.bool && result.cards && result.cards.length) { - player.give(result.cards, target); - } - } - }, - }, - kyouko_gongmian_discard: { - trigger: { player: "phaseDiscardBegin" }, - filter(event, player) { - var hs = player.countCards("h"); - return ( - hs > 0 && - player.getHistory("custom", function (evt) { - return evt.kyouko_gongmian == true; - }).length >= player.hp && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") < hs; - }) - ); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - get.prompt("kyouko_gongmian"), - "获得一名其他角色的所有手牌,然后将一半的牌交给该角色(向上取整)", - function (card, player, target) { - return target != player && target.countCards("h") < player.countCards("h"); - } - ) - .forResult(); - }, - content() { - "step 0"; - var target = event.targets[0]; - event.target = target; - var hs = target.getCards("h"); - if (hs.length > 0) player.gain(hs, target, "giveAuto", "bySelf"); - "step 1"; - if (target.isIn() && player.countCards("h") > 0) { - var hs = player.getCards("h"), - num = Math.ceil(hs.length / 2); - if (hs.length <= num) event._result = { bool: true, cards: hs }; - else - player.chooseCard( - "he", - true, - num, - "交给" + get.translation(target) + get.cnNumber(num) + "张牌" - ); - } else event.finish(); - "step 2"; - if (result.bool && result.cards && result.cards.length) { - player.give(result.cards, target); - } - }, - }, - //冰室忧希 - yuuki_yicha: { - trigger: { player: "phaseUseBegin" }, - frequent: true, - createDialog(id) { - var dialog = ui.create.dialog("hidden"); - (dialog.textPrompt = dialog.add("异插")).style.textAlign = "center"; - dialog.cards = []; - dialog.rawButtons = []; - dialog.videoId = id; - var cards = []; - for (var i = 0; i < 3; i++) { - var card = ui.create.card(null, null, true); - card.pos = i; - card.pos_x = i; - card.pos_y = 0; - cards.push(card); - dialog.rawButtons.push(card); - } - dialog.add(cards); - cards = []; - for (var i = 0; i < 3; i++) { - var card = ui.create.card(null, null, true); - card.pos = i + 3; - card.pos_x = i; - card.pos_y = 1; - cards.push(card); - dialog.rawButtons.push(card); - } - dialog.add(cards); - for (var i of dialog.buttons) { - i.pos_x = i.link.pos_x; - i.pos_y = i.link.pos_y; - i.link = i.link.pos; - } - dialog.open(); - }, - addCard(card, id, pos) { - var dialog = get.idDialog(id); - if (!dialog) return; - for (var i = 0; i < dialog.buttons.length; i++) { - var button = dialog.buttons[i]; - if (button.link == pos) { - var card2 = ui.create.button(card, "card"); - card2.pos = button.link; - card2.pos_x = button.pos_x; - card2.pos_y = button.pos_y; - card2.classList.add("noclick"); - button.parentNode.insertBefore(card2, button); - dialog.cards.push(card2); - button.remove(); - dialog.buttons.splice(i, 1); - break; - } - } - }, - changePrompt(str, id) { - var dialog = get.idDialog(id); - if (!dialog) return; - dialog.textPrompt.innerHTML = str; - }, - content() { - "step 0"; - var next = game.createEvent("cardsGotoOrdering"); - next.cards = []; - next.setContent("cardsGotoOrdering"); - event.videoId = lib.status.videoId++; - event.forceDie = true; - event.cards = []; - event.positions = [0, 1, 2, 3, 4, 5]; - game.broadcastAll(function (id) { - lib.skill.yuuki_yicha.createDialog(id); - }, event.videoId); - player.judge().set("callback", function () { - event.getParent().orderingCards.remove(event.judgeResult.card); - event.getParent(2).orderingCards.add(event.judgeResult.card); - }); - "step 1"; - if (get.position(result.card, true) == "o") { - var pos = event.positions.randomRemove(); - event._first_pos = pos; - game.broadcastAll( - function (card, id, player, pos) { - lib.skill.yuuki_yicha.addCard(card, id, pos); - lib.skill.yuuki_yicha.changePrompt( - get.translation(player) + "放置了" + get.translation(card), - id - ); - }, - result.card, - event.videoId, - player, - pos - ); - cards.push(result.card); - game.delay(2); - } - player.judge().set("callback", function () { - event.getParent().orderingCards.remove(event.judgeResult.card); - event.getParent(2).orderingCards.add(event.judgeResult.card); - }); - "step 2"; - if (get.position(result.card, true) == "o") { - var list = event.positions; - if (get.isLuckyStar(player)) { - var index = get.color(cards[0], false) == get.color(result.card, false) ? 0 : 1; - list = list.filter(function (i) { - return Math.abs((i % 2) - (event._first_pos % 2)) == index; - }); - } - var pos = list.randomRemove(); - game.broadcastAll( - function (card, id, player, pos) { - lib.skill.yuuki_yicha.addCard(card, id, pos); - lib.skill.yuuki_yicha.changePrompt( - get.translation(player) + "放置了" + get.translation(card), - id - ); - }, - result.card, - event.videoId, - player, - pos - ); - cards.push(result.card); - game.delay(2); - } - if (cards.length) event.count = 4; - else { - game.broadcastAll("closeDialog", event.videoId); - event.finish(); - } - "step 3"; - event.count--; - player.judge().set("callback", function () { - event.getParent().orderingCards.remove(event.judgeResult.card); - event.getParent(2).orderingCards.add(event.judgeResult.card); - }); - "step 4"; - var card = result.card; - event.card = card; - var str = "请选择一个位置放置" + get.translation(card); - if (player == game.me || player.isUnderControl()) { - lib.skill.yuuki_yicha.changePrompt(str, event.videoId); - } else if (player.isOnline()) { - player.send( - function (str, id) { - lib.skill.yuuki_yicha.changePrompt(str, event.videoId); - }, - str, - id - ); - } - player - .chooseButton() - .set("dialog", event.videoId) - .set("filterButton", function (button) { - var posx = button.pos_x, - posy = button.pos_y; - var list = [], - cards = ui.dialog.cards; - for (var i of cards) { - if (i.pos_x == posx && Math.abs(i.pos_y - posy) == 1) list.push(i.link); - if (i.pos_y == posy && Math.abs(i.pos_x - posx) == 1) list.push(i.link); - } - if (list.length > 0) { - var color = get.color(list[0], false); - if (list.length > 1) { - for (var i = 1; i < list.length; i++) { - if (get.color(list[i]) != color) return false; - } - } - return get.color(_status.event.card, false) != color; - } - return false; - }) - .set("card", card); - "step 5"; - if (result.bool) { - cards.push(card); - event.positions.remove(result.links[0]); - game.broadcastAll( - function (card, id, pos, player) { - lib.skill.yuuki_yicha.addCard(card, id, pos); - lib.skill.yuuki_yicha.changePrompt( - get.translation(player) + "放置了" + get.translation(card), - id - ); - }, - card, - event.videoId, - result.links[0], - player - ); - game.delay(2); - } - if (event.count > 0) event.goto(3); - "step 6"; - game.broadcastAll("closeDialog", event.videoId); - player - .chooseTarget("令一名角色获得" + get.translation(cards), true) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 7"; - if (result.bool && result.targets && result.targets.length) { - var target = result.targets[0]; - player.line(target, "green"); - target.gain(cards, "gain2"); - } - }, - }, - //库特莉亚芙卡 - kud_qiaoshou: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return !player.getExpansions("kud_qiaoshou_equip").length && player.countCards("h") > 0; - }, - chooseButton: { - dialog() { - var list = []; - var list2 = [ - "pyzhuren_heart", - "pyzhuren_diamond", - "pyzhuren_club", - "pyzhuren_spade", - "pyzhuren_shandian", - "rewrite_zhuge", - ]; - list2.addArray(lib.inpile); - for (var i of list2) { - var sub = get.subtype(i); - if (["equip1", "equip4"].includes(sub)) list.push([sub, "", i]); - } - return ui.create.dialog("巧手:选择一种装备牌", [list, "vcard"], "hidden"); - }, - check(button) { - var player = _status.event.player; - var name = button.link[2]; - if (get.subtype(name) == "equip4" || player.getEquip(name)) return 0; - var sha = player.countCards("h", "sha"); - switch (name) { - case "rewrite_zhuge": - return sha - player.getCardUsable("sha"); - case "guding": - if ( - sha > 0 && - game.hasPlayer(function (current) { - return ( - get.attitude(player, current) < 0 && - !current.countCards("h") && - player.canUse("sha", current) && - get.effect(current, { name: "sha" }, player) > 0 - ); - }) - ) - return 1.4 + Math.random(); - return 0; - case "guanshi": - if (sha > 0) return 0.7 + Math.random(); - return 0; - case "qinggang": - if (sha > 0) return 0.4 + Math.random(); - return 0; - case "zhuque": - if ( - game.hasPlayer(function (current) { - return ( - get.attitude(player, current) < 0 && - current.getEquip("tengjia") && - get.effect(current, { name: "sha", nature: "fire" }, player) > 0 - ); - }) - ) - return 1.2 + Math.random(); - return 0; - default: - return 0; - } - }, - backup(links) { - var next = get.copy(lib.skill.kud_qiaoshou_backupx); - next.cardname = links[0][2]; - return next; - }, - prompt(links) { - return "将一张手牌置于武将牌上,然后视为装备" + get.translation(links[0][2]); - }, - }, - group: "kud_qiaoshou_end", - ai: { - notemp: true, - order: 5, - result: { - player: 1, - }, - }, - }, - kud_qiaoshou_backupx: { - filterCard: true, - discard: false, - lose: false, - delay: false, - check(event, player) { - return 6 - get.value(card); - }, - content() { - "step 0"; - player.addToExpansion(cards, player, "give").gaintag.add("kud_qiaoshou_equip"); - "step 1"; - if (!player.getExpansions("kud_qiaoshou_equip").length) return; - player.addTempSkill("kud_qiaoshou_equip", { - player: ["phaseUseEnd", "phaseZhunbeiBegin"], - }); - var name = lib.skill.kud_qiaoshou_backup.cardname; - player.storage.kud_qiaoshou_equip2 = name; - var info = lib.card[name].skills; - if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info); - player.draw(); - game.log(player, "声明了", "#y" + get.translation(name)); - }, - ai: { - result: { - player: 1, - }, - }, - }, - kud_qiaoshou_equip: { - charlotte: true, - mod: { - globalFrom(from, to, distance) { - var info = lib.card[from.storage.kud_qiaoshou_equip2]; - if (info && info.distance && info.distance.globalFrom) - return distance + info.distance.globalFrom; - }, - globalTo(from, to, distance) { - var info = lib.card[to.storage.kud_qiaoshou_equip2]; - if (info && info.distance && info.distance.globalTo) - return distance + info.distance.globalTo; - }, - attackRange(from, distance) { - var info = lib.card[from.storage.kud_qiaoshou_equip2]; - if (info && info.distance && info.distance.attackFrom) - return distance - info.distance.attackFrom; - }, - attackTo(from, to, distance) { - var info = lib.card[to.storage.kud_qiaoshou_equip2]; - if (info && info.distance && info.distance.attackTo) - return distance + info.distance.attackTo; - }, - }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - markcount: "expansion", - mark(dialog, storage, player) { - dialog.add(player.getExpansions("kud_qiaoshou_equip")); - dialog.addText("当前装备:" + get.translation(player.storage.kud_qiaoshou_equip2)); - var str2 = lib.translate[player.storage.kud_qiaoshou_equip2 + "_info"]; - if (str2) { - if (str2.length >= 12) dialog.addText(str2, false); - else dialog.addText(str2); - } - }, - onunmark(storage, player) { - player.removeAdditionalSkill("kud_qiaoshou_equip"); - delete player.storage.kud_qiaoshou_equip2; - player.addEquipTrigger(); - }, - }, - }, - kud_qiaoshou_end: { - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return player.countCards("h") > 0 && !player.getExpansions("kud_qiaoshou_equip").length; - }, - cost() { - "step 0"; - var list = []; - var list2 = ["rewrite_bagua", "rewrite_renwang", "rewrite_tengjia", "rewrite_baiyin"]; - list2.addArray(lib.inpile); - for (var i of list2) { - var sub = get.subtype(i); - if (["equip2", "equip3"].includes(sub)) list.push([sub, "", i]); - } - player - .chooseButton([get.prompt("kud_qiaoshou"), [list, "vcard"]]) - .set("ai", function (button) { - var player = _status.event.player; - var name = button.link[2]; - if (get.subtype(name) == "equip3" || player.getEquip(name)) return false; - switch (name) { - case "yexingyi": - if ( - player.hp > 2 || - player.getEquip("bagua") || - player.getEquip("tengjia") - ) - return 1.5 + Math.random(); - return 0.5 + Math.random(); - case "rewrite_bagua": - case "rewrite_renwang": - if ( - player.getEquip("bagua") || - player.getEquip("tengjia") || - player.getEquip("renwang") - ) - return Math.random(); - return 1.2 + Math.random(); - case "rewrite_tengjia": - if (player.getEquip("baiyin")) return 1.3 + Math.random(); - return Math.random(); - case "rewrite_baiyin": - return 0.4 + Math.random(); - default: - return 0; - } - }); - "step 1"; - if (result.bool) { - event.cardname = result.links[0][2]; - player.chooseCard( - "h", - true, - "将一张手牌置于武将牌上,然后视为装备" + get.translation(event.cardname) - ); - } else event.finish(); - "step 2"; - if (result.bool) { - event.result = { - bool: true, - cards: result.cards, - cost_data: { - cardname: event.cardname, - }, - }; - } - }, - async content(event, trigger, player) { - await player - .addToExpansion(event.cards, player, "give") - .gaintag.add("kud_qiaoshou_equip"); - if (!player.getExpansions("kud_qiaoshou_equip").length) return; - player.addTempSkill("kud_qiaoshou_equip", { - player: ["phaseUseEnd", "phaseZhunbeiBegin"], - }); - var name = event.cost_data.cardname; - player.storage.kud_qiaoshou_equip2 = name; - player.markAuto("kud_qiaoshou_equip", cards); - var info = lib.card[name].skills; - if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info); - game.log(player, "声明了", "#y" + get.translation(name)); - await player.draw(); - }, - }, - kud_buhui: { - enable: "chooseToUse", - filter(event, player) { - return ( - event.type == "dying" && - player == event.dying && - player.getExpansions("kud_qiaoshou_equip").length + player.countCards("e") > 0 - ); - }, - skillAnimation: true, - limited: true, - animationColor: "gray", - content() { - "step 0"; - player.awakenSkill("kud_buhui"); - var cards = player.getCards("e").concat(player.getExpansions("kud_qiaoshou_equip")); - if (cards.length) player.discard(cards); - player.removeSkill("kud_qiaoshou_equip"); - player.draw(cards.length); - player.addSkills("kud_chongzhen"); - "step 1"; - var num = 2 - player.hp; - if (num) player.recover(num); - }, - derivation: "riki_chongzhen", - ai: { - order: 0.5, - result: { - player: 1, - }, - save: true, - skillTagFilter(player, tag, target) { - return player == target; - }, - }, - }, - kud_chongzhen: { - inherit: "riki_chongzhen", - }, - //神尾观铃 - misuzu_hengzhou: { - trigger: { - player: [ - "phaseJieshuBegin", - "recoverEnd", - "damageEnd", - "phaseDrawBegin2", - "phaseZhunbeiBegin", - ], - }, - forced: true, - character: true, - filter(event, player) { - if (event.name == "phaseZhunbei") return true; - if (["damage", "recover"].includes(event.name)) return event.num > 0; - var num = player.countMark("misuzu_hengzhou"); - if (event.name == "phaseDraw") return num > 0 && !event.numFixed; - return num > 3; - }, - content() { - var num = player.countMark("misuzu_hengzhou"); - if (trigger.name == "phaseDraw") trigger.num += num; - else if (trigger.name == "phaseJieshu") { - player.removeMark("misuzu_hengzhou", num); - player.loseHp(); - } else player.addMark("misuzu_hengzhou", trigger.num || 1); - }, - intro: { - name: "诅咒", - name2: "诅咒", - content: "mark", - }, - marktext: "诅", - mod: { - maxHandcard(player, num) { - return num + player.countMark("misuzu_hengzhou"); - }, - }, - ai: { - notemp: true, - }, - }, - misuzu_nongyin: { - enable: "chooseToUse", - viewAs: { - name: "tao", - isCard: true, - }, - viewAsFilter(player) { - return ( - !player.hasJudge("lebu") && - player.countCards("hes", function (card) { - return get.color(card) == "red" && get.type(card, "trick") != "trick"; - }) - ); - }, - filterCard(card) { - return get.color(card) == "red" && get.type(card, "trick") != "trick"; - }, - check(card) { - return 7 + (_status.event.dying || _status.event.player).getDamagedHp() - get.value(card); - }, - ignoreMod: true, - position: "hes", - precontent() { - player.logSkill("misuzu_nongyin"); - player.$throw(event.result.cards); - player.addJudge({ name: "lebu" }, event.result.cards); - event.result.card.cards = []; - event.result.cards = []; - delete event.result.skill; - delete event.result.card.suit; - delete event.result.card.number; - }, - ai: { - result: 0.5, - }, - }, - misuzu_zhongxing: { - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter(event, player) { - var evt = event.getl(player); - return evt && evt.js && evt.js.length > 0 && !player.hasSkill("misuzu_zhongxing_haruko"); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt("misuzu_zhongxing"), "令一名角色选择摸两张牌或回复1点体力") - .set("ai", function (card) { - return get.attitude(_status.event.player, card); - }) - .forResult(); - }, - async content(event, trigger, player) { - var target = event.targets[0]; - player.logSkill("misuzu_zhongxing", target); - player.addTempSkill("misuzu_zhongxing_haruko"); - target.chooseDrawRecover(2, true); - }, - }, - misuzu_zhongxing_haruko: { charlotte: true }, - //久岛鸥 - kamome_suitcase: { - trigger: { - player: ["phaseJudgeBefore", "phaseDiscardBefore", "turnOverBefore"], - }, - forced: true, - popup: false, - equipSkill: true, - content() { - trigger.cancel(); - }, - }, - kamome_yangfan: { - trigger: { - player: ["loseAfter", "enterGame"], - global: [ - "equipAfter", - "addJudgeAfter", - "phaseBefore", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - filter(event, player) { - if (typeof event.getl != "function") - return event.name != "phase" || game.phaseNumber == 0; - var evt = event.getl(player); - return evt && evt.player == player && evt.es && evt.es.length; - }, - content() { - if (trigger.getl) player.draw(2 * trigger.getl(player).es.length); - else player.equip(game.createCard2("kamome_suitcase", "spade", 1)); - }, - ai: { - noe: true, - reverseEquip: true, - effect: { - target(card, player, target, current) { - if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; - }, - }, - }, - }, - kamome_huanmeng: { - trigger: { player: "phaseZhunbeiBegin" }, - frequent: true, - content() { - "step 0"; - var num = 1 + player.countCards("e"); - 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, - }, - }, - kamome_jieban: { - trigger: { - player: "damageEnd", - source: "damageSource", - }, - zhuanhuanji: true, - marktext: "☯", - mark: true, - intro: { - content(storage, player) { - return ( - "转换技。每回合限一次,当你受到或造成伤害后," + - (!storage - ? "你可将两张牌交给一名其他角色,然后其交给你一张牌。" - : "你可将一张牌交给一名其他角色,然后其交给你两张牌。") - ); - }, - }, - filter(event, player) { - var num = player.storage.kamome_jieban ? 1 : 2; - return player.countCards("he") >= num && !player.hasSkill("kamome_jieban_phase"); - }, - async cost(event, trigger, player) { - event.num = player.storage.kamome_jieban ? 1 : 2; - event.result = await player - .chooseCardTarget({ - position: "he", - filterCard: true, - filterTarget: lib.filter.notMe, - selectCard: event.num, - prompt: get.prompt("kamome_jieban"), - prompt2: - event.num == 2 - ? "将两张牌交给一名其他角色,然后其交给你一张牌。" - : "将一张牌交给一名其他角色,然后其交给你两张牌。", - ai1(card) { - if (card.name == "du") return 20; - var val = get.value(card); - var player = _status.event.player; - if (get.position(card) == "e") { - if (val <= 0) return 10; - return 10 / val; - } - return 6 - val; - }, - ai2(target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (ui.selected.cards[0].name == "du") return -2 * att; - if (att > 0) return 1.5 * att; - var num = get.select(_status.event.selectCard)[1]; - if (att < 0 && num == 1) return -0.7 * att; - return att; - }, - }) - .forResult(); - }, - content() { - "step 0"; - event.num = player.storage.kamome_jieban ? 1 : 2; - var target = targets[0]; - event.target = target; - player.addTempSkill("kamome_jieban_phase"); - player.give(cards, target); - player.changeZhuanhuanji("kamome_jieban"); - "step 1"; - var num = 3 - event.num; - var hs = target.getCards("he"); - if (hs.length) { - if (hs.length <= num) event._result = { bool: true, cards: hs }; - else { - target - .chooseCard( - "he", - true, - "交给" + get.translation(player) + get.cnNumber(num) + "张牌", - num - ) - .set("ai", function (card) { - var player = _status.event.player; - var target = _status.event.getParent().player; - if (get.attitude(player, target) > 0) { - if (!target.hasShan() && card.name == "shan") return 10; - if ( - get.type(card) == "equip" && - !get.cardtag(card, "gifts") && - target.hasUseTarget(card) - ) - return 10 - get.value(card); - return 6 - get.value(card); - } - return -get.value(card); - }); - } - } else event.finish(); - "step 2"; - target.give(result.cards, player); - }, - }, - kamome_jieban_phase: { charlotte: true }, - //友利奈绪 - nao_duyin: { - trigger: { global: "phaseBegin" }, - filter(event, player) { - return ( - event.player != player && - (!player.storage.nao_duyin || !player.storage.nao_duyin.includes(event.player)) - ); - }, - logTarget: "player", - charlotte: true, - check() { - return false; - }, - content() { - "step 0"; - player.chooseToDiscard("he", "弃置一张牌,或将武将牌翻面").set("ai", function (card) { - if (_status.event.player.isTurnedOver()) return 0; - return 6 - get.value(card); - }); - "step 1"; - if (!result.bool) player.turnOver(); - player.addTempSkill("nao_duyin2", { player: "phaseAfter" }); - if (!player.storage.nao_duyin) player.storage.nao_duyin = []; - player.storage.nao_duyin.push(trigger.player); - if (!player.storage.nao_duyin2) player.storage.nao_duyin2 = []; - player.storage.nao_duyin2.push(trigger.player); - player.markSkill("nao_duyin2"); - }, - }, - nao_duyin2: { - intro: { - content: "$不能使用牌指定你为目标,对$使用牌没有距离和次数限制", - }, - mod: { - targetEnabled(card, player, target) { - if (target.storage.nao_duyin2 && target.storage.nao_duyin2.includes(player)) - return false; - }, - targetInRange(card, player, target) { - if (player.storage.nao_duyin2 && player.storage.nao_duyin2.includes(target)) - return true; - }, - }, - trigger: { player: "useCardEnd" }, - firstDo: true, - silent: true, - onremove: true, - filter(event, player) { - if (player.storage.nao_duyin2) { - for (var i of player.storage.nao_duyin2) { - if (event.targets.includes(i)) return true; - } - } - return false; - }, - content() { - if (trigger.addCount !== false) { - trigger.addCount = false; - var stat = player.getStat(); - if (stat && stat.card && stat.card[trigger.card.name]) stat.card[trigger.card.name]--; - } - }, - }, - nao_wanxin: { - trigger: { global: "phaseEnd" }, - hasHistory(player) { - return player.getHistory("damage").length > 0; - }, - filter(event, player) { - return game.hasPlayer(function (current) { - return lib.skill.nao_wanxin.hasHistory(current); - }); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("nao_wanxin"), function (card, player, target) { - return _status.event.yuus.includes(target); - }) - .set( - "yuus", - game.filterPlayer(function (current) { - return lib.skill.nao_wanxin.hasHistory(current); - }) - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - await target.draw(2); - await player.turnOver(false); - await player.link(false); - if (target == player) return; - await target.turnOver(false); - await target.link(false); - }, - }, - nao_shouqing: { - global: "nao_shouqing2", - }, - nao_shouqing2: { - enable: "phaseUse", - viewAs() { - return { name: "tao" }; - }, - filterCard: { name: "tao" }, - ignoreMod: true, - filterTarget(card, player, target) { - return target != player && target.isDamaged() && target.hasSkill("nao_shouqing"); - }, - selectTarget() { - return game.countPlayer(function (current) { - return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current); - }) > 1 - ? 1 - : -1; - }, - filter(event, player) { - return ( - player.countCards("hs", "tao") && - game.hasPlayer(function (current) { - return lib.skill.nao_shouqing2.filterTarget(null, player, current); - }) - ); - }, - position: "hs", - onuse(links, player) { - player.addSkill("nao_shouqing3"); - player.addMark("nao_shouqing3", 1, false); - }, - prompt() { - var list = game.filterPlayer(function (current) { - return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current); - }); - var str = "对" + get.translation(list); - if (list.length > 1) str += "中的一名角色"; - str += "使用一张【桃】"; - return str; - }, - }, - nao_shouqing3: { - intro: { - content: "手牌上限+#", - }, - mod: { - maxHandcard(player, num) { - return num + player.countMark("nao_shouqing3"); - }, - }, - trigger: { player: "useCardAfter" }, - forced: true, - popup: false, - filter(event, player) { - return event.skill == "nao_shouqing2"; - }, - content() { - player.draw(); - }, - }, - - nsqiyue: { - trigger: { - global: [ - "turnOverEnd", - "linkEnd", - "showCharacterEnd", - "hideCharacterEnd", - "removeCharacterEnd", - ], - }, - forced: true, - content() { - player.draw(); - }, - }, - nsxuezhu: { - trigger: { player: "damageEnd", source: "damageSource" }, - filter(event, player) { - return event.player.isIn(); - }, - logTarget: "player", - content() { - trigger.player.draw(2); - trigger.player.turnOver(); - }, - check(event, player) { - return !event.player.isTurnedOver() || get.attitude(player, event.player) > 0; - }, - }, - noname_zhuyuan: { - enable: "phaseUse", - position: "he", - selectCard: 4, - complexCard: true, - charlotte: true, - prompt: "将4张花色各不同的牌交一名角色并令你与其获得【铁骑】和【激昂】直到各自回合结束", - check(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.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); - }, - filterCard(card, player) { - var suit = get.suit(card, player); - for (var i = 0; i < ui.selected.cards.length; i++) { - if (get.suit(ui.selected.cards[i], player) == suit) return false; - } - return true; - }, - filter(event, player) { - var suits = []; - player.countCards("he", function (card) { - if (suits.length < 4) suits.add(get.suit(card, player)); - }); - if (suits.length < 4) return false; - var stat = player.getStat(); - if (!stat.noname_zhuyuan) return true; - return game.hasPlayer(function (current) { - return current != player && !stat.noname_zhuyuan.includes(current); - }); - }, - filterTarget(card, player, target) { - if (player == target) return false; - var stat = player.getStat(); - if (!stat.noname_zhuyuan) return true; - return !stat.noname_zhuyuan.includes(target); - }, - discard: false, - lose: false, - delay: false, - content() { - "step 0"; - var stat = player.getStat(); - if (!stat.noname_zhuyuan) stat.noname_zhuyuan = []; - stat.noname_zhuyuan.push(target); - player.give(cards, target, "visible"); - "step 1"; - game.log(player, "获得了技能", "#g【铁骑】"); - player.addTempSkill("noname_retieji", { - player: "phaseAfter", - }); - game.log(player, "获得了技能", "#g【激昂】"); - player.addTempSkill("noname_jiang", { - player: "phaseAfter", - }); - game.log(target, "获得了技能", "#g【铁骑】"); - target.addTempSkill("noname_retieji", { - player: "phaseAfter", - }); - game.log(target, "获得了技能", "#g【激昂】"); - target.addTempSkill("noname_jiang", { - player: "phaseAfter", - }); - }, - mod: { - targetInRange(card, player) { - var stat = player.getStat(); - if (stat.noname_zhuyuan) return true; - }, - cardUsable(card, player) { - var stat = player.getStat(); - if (!stat.noname_zhuyuan) return Infinity; - }, - }, - ai: { - order: 5, - result: { - target: 10, - }, - }, - }, - noname_retieji: { - inherit: "retieji", - mark: true, - marktext: "", - intro: { - name: "小无·铁骑", - content: - "你使用【杀】指定一名角色为目标后,可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。", - }, - }, - noname_jiang: { - inherit: "jiang", - mark: true, - marktext: "", - intro: { - name: "小无·激昂", - content: - "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", - }, - }, - noname_duocai: { - trigger: { - global: ["loseAfter", "loseAsyncAfter"], - }, - filter(event, player) { - if (event.type != "discard" || event.getlx === false) return false; - var evt = event.getl(player); - var cards = event.cards.slice(0); - if (evt && evt.cards) cards.removeArray(evt.cards); - return cards.filterInD("d").length > 0 && !player.hasSkill("noname_duocai2"); - }, - direct: true, - charlotte: true, - content() { - "step 0"; - if (trigger.delay == false && player != game.me && !player.isOnline()) game.delay(); - var evt = trigger.getl(player); - var cards = trigger.cards.slice(0); - cards.removeArray(evt.cards); - player.chooseButton([get.prompt("noname_duocai"), cards], [1, cards.length]); - "step 1"; - if (result.bool) { - player.logSkill("noname_duocai"); - player.addTempSkill("noname_duocai2"); - player.gain(result.links, "gain2"); - if (result.links.length > 2) { - var filterTarget = function (card, player, target) { - return target != player && target.countDiscardableCards(player, "hej") > 0; - }; - if ( - game.hasPlayer(function (current) { - return filterTarget(null, player, current); - }) - ) { - player - .chooseTarget("弃置一名其他角色区域内的一张牌", true, filterTarget) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe" }, player, player); - }); - } else event.finish(); - } else { - if (result.links.length == 2) player.draw(); - else player.recover(); - event.finish(); - } - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - player.discardPlayerCard(target, "hej", true); - } - }, - }, - noname_duocai2: { charlotte: true }, - nsbizhao: { - trigger: { player: "showCharacterAfter" }, - forced: true, - hiddenSkill: true, - filter(event, player) { - return ( - event.toShow && event.toShow.includes("ns_yanghu") && player != _status.currentPhase - ); - }, - content() { - player.addTempSkill("nsbizhao2", { - player: "phaseBeginStart", - }); - }, - }, - nsbizhao2: { - charlotte: true, - mark: true, - intro: { content: "其他角色至自己的距离+1" }, - mod: { - globalTo(source, player, distance) { - return distance + 1; - }, - }, - }, - nsqingde: { - trigger: { - player: "damageEnd", - source: "damageSource", - }, - usable: 1, - filter(event, player) { - if ( - !event.card || - !event.cards || - event.player == event.source || - (event.card.name != "sha" && get.type(event.card) != "trick") || - event.cards.filterInD().length != 1 - ) - return false; - var target = lib.skill.nsqingde.logTarget(event, player); - if (player.hasSkillTag("noCompareSource") || target.hasSkillTag("noCompareTarget")) - return false; - return target.countCards("h") > 0; - }, - logTarget(event, player) { - if (player == event.source) return event.player; - return event.source; - }, - check(event, player) { - var target = lib.skill.nsqingde.logTarget(event, player); - return get.attitude(player, target) <= 0; - }, - content() { - "step 0"; - var target = lib.skill.nsqingde.logTarget(trigger, player); - event.target = target; - var next = player.chooseToCompare(target); - if (event.triggername == "damageSource") next.set("small", true); - if (!next.fixedResult) next.fixedResult = {}; - next.fixedResult[player.playerid] = trigger.cards.filterInD()[0]; - "step 1"; - if (result.tie) { - event.finish(); - return; - } - var i = result.bool; - if (event.triggername == "damageSource") i = !i; - event.target2 = i ? player : target; - if (event.triggername == "damageSource") event.goto(3); - else if (event.target2.isDamaged()) - player - .chooseBool("是否令" + get.translation(event.target2) + "回复1点体力?") - .set("ai", function () { - var evt = _status.event.getParent(); - return get.attitude(evt.player, evt.target2) > 0; - }); - else event.finish(); - "step 2"; - if (result.bool) event.target2.recover(); - event.finish(); - "step 3"; - player - .chooseBool("是否令" + get.translation(event.target2) + "摸两张牌?") - .set("ai", function () { - var evt = _status.event.getParent(); - return get.attitude(evt.player, evt.target2) > 0; - }); - "step 4"; - if (result.bool) event.target2.draw(2); - }, - ai: { - effect: { - target(card, player, target, current) { - if (target.storage.counttrigger && target.storage.counttrigger.nsqingde) return; - var num = get.number(card); - if (typeof num == "number") { - if ( - target.hasSkillTag("noCompareSource") || - player.hasSkillTag("noCompareTarget") - ) - return; - var hs = player.getCards("h"); - if (card.cards) hs.removeArray(card.cards); - if (ui.selected.cards) hs.removeArray(ui.selected.cards); - if (!hs.length) return; - for (var i of hs) { - if (get.number(i) >= num) return; - if (player.hasSkill("tianbian") && get.suit(card) == "heart") return; - } - return "zerotarget"; - } - }, - }, - }, - }, - nsyidi: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("h") > 0; - }, - filterCard: true, - filterTarget: lib.filter.notMe, - discard: false, - lose: false, - delay: false, - check(card) { - var player = _status.event.player; - if (get.type(card, player) == "basic") { - if ( - game.hasPlayer(function (current) { - return ( - get.attitude(current, player) > 0 && - current.getUseValue(card) > player.getUseValue(card, null, true) - ); - }) - ) - return 5 + Math.random(); - return 0; - } - if ( - game.hasPlayer(function (current) { - return ( - get.attitude(current, player) > 0 && - !current.hasJudge("lebu") && - current.getUseValue(card) > player.getUseValue(card) - ); - }) - ) - return 4.7 + Math.random(); - if ( - card.name == "wuxie" && - game.hasPlayer(function (current) { - return get.attitude(current, player) > 0; - }) - ) - return 5 + Math.random(); - return 4 - get.value(card); - }, - content() { - "step 0"; - player.give(cards, target, "visible"); - if (get.type(cards[0], player) != "basic") { - player.draw(); - event.finish(); - } - "step 1"; - if (target.getCards("h").includes(cards[0]) && target.hasUseTarget(cards[0])) - target.chooseUseTarget(cards[0]); - }, - ai: { - order: 7, - result: { - player(player, target) { - if ( - !ui.selected.cards.length || - get.type(ui.selected.cards[0], player) == "basic" - ) - return 0; - if (get.value(ui.selected.cards[0]) < 4) return 2; - return 0.5; - }, - target: 1, - }, - }, - }, - nsfuzhou: { - enable: "phaseUse", - usable: 2, - filter(event, player) { - if (!player.storage.nstaiping && player.getStat("skill").nsfuzhou) return false; - return player.countCards("he", { color: "black" }) > 0; - }, - filterCard: { color: "black" }, - filterTarget(card, player, target) { - return !target.hasJudge("nsfuzhou_card"); - }, - check(card) { - return 8 - get.value(card); - }, - prepare: "give", - position: "he", - discard: false, - lose: false, - delay: false, - content() { - "step 0"; - target.addJudge({ name: "nsfuzhou_card" }, cards[0]); - cards[0].storage.nsfuzhou_source = player; - "step 1"; - game.delayx(); - }, - ai: { - order: 5, - result: { - target(player, target) { - if (player.storage.nsfuzhou_draw) { - if ( - get.attitude(player, target) > 0 && - player.countCards("he", function (card) { - return get.color(card) == "red"; - }) - ) { - return 1; - } - return 0; - } - if (player.storage.nsfuzhou_damage) return -2; - return -1.5; - }, - }, - }, - }, - nsfuzhou_num: { - charlotte: true, - onremove: true, - mod: { - maxHandcard(player, num) { - return num + player.storage.nsfuzhou_num; - }, - }, - intro: { - content(num) { - return "手牌上限" + (num < 0 ? "" : "+") + num; - }, - }, - }, - nsguidao: { - trigger: { global: "judge" }, - filter(event, player) { - return ( - player.countCards("hes", function (card) { - if ( - player.storage.nstaiping || - (_status.connectMode && get.position(card) != "e") - ) - return true; - return get.color(card) == "black"; - }) > 0 - ); - }, - direct: true, - content() { - "step 0"; - player - .chooseCard( - get.translation(trigger.player) + - "的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - "," + - get.prompt("nsguidao"), - "hes", - function (card, player) { - if (!player.storage.nstaiping && get.color(card) != "black") return false; - var player = _status.event.player; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - } - ) - .set("ai", function (card) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0; - if (attitude > 0) { - return result; - } else { - return -result; - } - }) - .set("judging", trigger.player.judging[0]); - "step 1"; - if (result.bool) { - player.respond(result.cards, "highlight", "nsguidao", "noOrdering"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.$gain2(trigger.player.judging[0]); - player.gain(trigger.player.judging[0]); - trigger.player.judging[0] = result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player, "的判定牌改为", result.cards[0]); - } - "step 3"; - game.delay(2); - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - nstaiping: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - filter(event, player) { - return ( - player.getAllHistory("sourceDamage", function (evt) { - return evt.getParent().name == "nsfuzhou_card"; - }).length > 1 || - player.getAllHistory("gain", function (evt) { - return evt.getParent(2).name == "nsfuzhou_card"; - }).length > 1 - ); - }, - content() { - player.awakenSkill("nstaiping"); - player.storage.nstaiping = true; - if ( - player.getAllHistory("sourceDamage", function (evt) { - return evt.getParent().name == "nsfuzhou_card"; - }).length > 1 - ) - player.storage.nsfuzhou_damage = true; - if ( - player.getAllHistory("gain", function (evt) { - return evt.getParent(2).name == "nsfuzhou_card"; - }).length > 1 - ) - player.storage.nsfuzhou_draw = true; - }, - ai: { - combo: "nsfuzhou" - }, - derivation: ["nsfuzhou_damage", "nsfuzhou_draw"], - }, - nsweiyuan: { - trigger: { player: "useCardToTargeted" }, - direct: true, - filter(event, player) { - return ( - player != event.target && - event.targets && - event.targets.length == 1 && - event.target.isIn() && - player.isPhaseUsing() && - !player.hasSkill("nsweiyuan2") && - game.hasPlayer(function (current) { - return current != player && current != event.target; - }) - ); - }, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("nsweiyuan"), function (card, player, target) { - return target != player && target != _status.event.getTrigger().target; - }) - .set("ai", function (target) { - return Math.max(Math.random(), get.attitude(player, target)); - }); - "step 1"; - if (result.bool) { - player.addTempSkill("nsweiyuan2", "phaseUseAfter"); - var target = result.targets[0]; - event.target = target; - player.logSkill("nsweiyuan", target); - target - .chooseCard( - "he", - "交给" + - get.translation(trigger.target) + - "一张牌并受到1点伤害,或令" + - get.translation(player) + - "摸一张牌且可以重复使用牌" - ) - .set("ai", function (card) { - if (_status.event.goon) return Math.random(); - return 0; - }) - .set( - "goon", - (function () { - if (get.attitude(target, player) > 0) return false; - return Math.random() > 0.5; - })() - ); - } else event.finish(); - "step 2"; - if (result.bool) { - target.gain(result.cards, trigger.target); - target.damage(); - } else { - player.addTempSkill("nsweiyuan_use"); - player.draw(); - } - }, - }, - nsweiyuan2: { charlotte: true }, - nsweiyuan_use_backup: {}, - nsweiyuan_use: { - enable: "phaseUse", - charlotte: true, - mod: { - cardUsable() { - if (_status.event.skill == "nsweiyuan_use_backup") return Infinity; - }, - targetInRange() { - if (_status.event.skill == "nsweiyuan_use_backup") return true; - }, - }, - onChooseToUse(event) { - if (game.online || event.type != "phase") return; - var list = []; - event.player.getHistory("useCard", function (evt) { - var name = evt.card.name; - var type = get.type(name); - if (type != "basic" && type != "trick") return; - if (name == "sha") { - var nature = evt.card.nature; - switch (nature) { - case "fire": - name = "huosha"; - break; - case "thunder": - name = "leisha"; - break; - case "kami": - name = "kamisha"; - break; - case "ice": - name = "icesha"; - break; - } - } - list.add(type + "咕咕" + name); - }); - event.set("nsweiyuan_list", list); - }, - filter(event, player) { - return ( - player.countCards("h") > 0 && event.nsweiyuan_list && event.nsweiyuan_list.length > 0 - ); - }, - chooseButton: { - dialog(event, player) { - return ui.create.dialog("围援", [ - event.nsweiyuan_list.map(function (i) { - return i.split("咕"); - }), - "vcard", - ]); - }, - filter(button, player) { - return lib.filter.cardEnabled( - { - name: button.link[2], - nature: button.link[3], - }, - player - ); - }, - check(button) { - return _status.event.player.getUseValue( - { - name: button.link[2], - nature: button.link[3], - }, - false - ); - }, - backup(links, player) { - return { - popname: true, - position: "h", - filterCard: true, - ai1(card) { - return 7 - get.value(card); - }, - viewAs: { - name: links[0][2], - nature: links[0][3], - }, - onuse(links, player) { - player.removeSkill("nsweiyuan_use"); - }, - }; - }, - prompt(links, player) { - return ( - "将一张手牌当做" + - get.translation(links[0][3] || "") + - get.translation(links[0][2]) + - "使用" - ); - }, - }, - ai: { - order: 1, - result: { - player: 1, - }, - }, - }, - nsjuxian: { - trigger: { player: "damageBegin2" }, - filter(event, player) { - return !player.hasSkill("nsjuxian2"); - }, - check(event, player) { - if (player.countCards("h") + 2 >= player.maxHp) - return ( - !event.source || - !event.source.countCards("he") || - get.attitude(player, event.source) > 0 - ); - return true; - }, - content() { - "step 0"; - player.addSkill("nsjuxian2"); - player.draw(2); - "step 1"; - var target = trigger.source; - if (player.countCards("h") >= player.maxHp && target && target.countCards("he")) { - player.line(target, "green"); - target.chooseToDiscard("he", true); - } - }, - }, - nsjuxian2: { - trigger: { player: "phaseDrawBefore" }, - forced: true, - charlotte: true, - content() { - player.removeSkill("nsjuxian2"); - trigger.cancel(); - game.log(player, "跳过了", "#y摸牌阶段"); - }, - }, - nsdiewu: { - trigger: { - player: ["damageEnd", "gainAfter"], - global: "loseAsyncAfter", - }, - forced: true, - locked: false, - filter(event, player) { - if (event.name != "damage") return event.getg(player).length > 1; - return true; - }, - content() { - player.addMark("nsdiewu", 1); - }, - intro: { - content: "mark", - }, - group: ["nsdiewu_sha", "nsdiewu_shan", "nsdiewu_draw"], - subSkill: { - sha: { - enable: "chooseToUse", - viewAs: { name: "sha", isCard: true }, - prompt: "视为使用一张【杀】", - viewAsFilter(player) { - return player.countMark("nsdiewu") > 0; - }, - filterCard: () => false, - selectCard: -1, - onuse(links, player) { - player.removeMark("nsdiewu", 1); - }, - ai: { - order() { - var player = _status.event.player; - if (!player.storage.nspojian && player.countMark("nsdiewu") <= player.hp) - return 0; - return get.order({ name: "sha" }) + 0.1; - }, - }, - }, - shan: { - enable: "chooseToUse", - viewAs: { name: "shan", isCard: true }, - viewAsFilter(player) { - return player.countMark("nsdiewu") > 0 && !player.storage.nspojian; - }, - filterCard: () => false, - selectCard: -1, - onuse(links, player) { - player.removeMark("nsdiewu", 1); - }, - ai: { - order() { - var player = _status.event.player; - if (player.hp > 1 && player.countMark("nsdiewu") <= player.hp) return 0; - return get.order({ name: "shan" }) - 0.2; - }, - }, - }, - draw: { - trigger: { source: "damageEnd" }, - forced: true, - popup: false, - filter(event, player) { - var evt = event.getParent(); - return evt && evt.type == "card" && evt.skill == "nsdiewu_sha"; - }, - content() { - player.draw(); - }, - }, - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter(player, tag) { - if (tag == "respondShan" && player.storage.nspojian) return false; - return player.countMark("nsdiewu") > 0; - }, - }, - }, - nslingying: { - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") return num + 1; - }, - targetInRange(card) { - if (card.name == "sha") return true; - }, - }, - }, - nspojian: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "fire", - filter(event, player) { - return player.countMark("nsdiewu") >= player.hp; - }, - content() { - player.awakenSkill("nspojian"); - player.storage.nspojian = true; - player.loseMaxHp(); - player.draw(2); - player.addSkill("nsliegong"); - }, - derivation: "nsliegong", - ai: { - combo: "nsdiewu" - }, - }, - nsliegong: { - inherit: "xinliegong", - }, - nsguolie: { - trigger: { player: "phaseDrawBefore" }, - check(event, player) { - var h1 = player.getUseValue({ name: "sha" }, false); - var h2 = player.getUseValue({ name: "guohe" }); - return ( - player.countCards("h", function (card) { - if (get.color(card) == "red") return h1 > 0; - return h2 > 0; - }) > 2 - ); - }, - content() { - trigger.cancel(); - player.addTempSkill("nsguolie2"); - }, - }, - nsguolie2: { - mod: { - cardname(card, player) { - var color = get.color(card, player); - if (color == "red") return "sha"; - if (color == "black") return "guohe"; - }, - cardnature() { - return false; - }, - cardUsable() { - return Infinity; - }, - targetInRange() { - return true; - }, - }, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter(event, player) { - var cards = []; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.player == player) return; - for (var i of evt.cards) { - if (get.position(i, true) == "d") cards.push(i); - } - }); - return cards.length > 0; - }, - content() { - var cards = []; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.player == player) return; - if (evt.name == "cardsDiscard" && evt.parent.name == "orderingDiscard") return; - for (var i of evt.cards) { - if (get.position(i, true) == "d") cards.push(i); - } - }); - player.gain(cards, "gain2"); - }, - }, - nslongyue: { - init: () => { - game.addGlobalSkill("nslongyue_ai"); - }, - onremove: () => { - if (!game.hasPlayer((i) => i.hasSkill("nslongyue"), true)) - game.removeGlobalSkill("nslongyue_ai"); - }, - trigger: { global: "useCard" }, - filter(event, player) { - return ( - get.type(event.card, "trick") == "trick" && - event.player.getHistory("useCard").indexOf(event) == 0 - ); - }, - logTarget: "player", - check(event, player) { - return get.attitude(player, event.player) > 0; - }, - content() { - trigger.player.draw(); - }, - ai: { - expose: 0.2, - }, - }, - nslongyue_ai: { - mod: { - aiOrder(player, card, num) { - if ( - !player.getHistory("useCard").length && - get.type(card) == "trick" && - game.hasPlayer(function (current) { - return current.hasSkill("nslongyue") && get.attitude(player, current) >= 0; - }) - ) - return num + 6; - }, - }, - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer((i) => i.hasSkill("nslongyue"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("nslongyue_ai"); - }, - }, - nszhenyin: { - trigger: { global: "judge" }, - usable: 1, - filter(event, player) { - return _status.currentPhase && _status.currentPhase.countCards("h") > 0; - }, - logTarget() { - return _status.currentPhase; - }, - check(event, player) { - var target = _status.currentPhase; - var judge = event.judge(event.player.judging[0]); - var max = 0; - var hs = target.getCards("h", function (card) { - var mod2 = game.checkMod(card, target, "unchanged", "cardEnabled2", target); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, target, "unchanged", "cardRespondable", target); - if (mod != "unchanged") return mod; - return true; - }); - for (var i of hs) { - var num = event.judge(i) - judge; - if (num > max) max = num; - } - var att = get.attitude(player, target); - if (att > 0) return max > 0; - if (att < 0) return max <= 0; - return false; - }, - content() { - "step 0"; - if ( - !_status.currentPhase.countCards("h", function (card) { - var player = _status.currentPhase; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - }) - ) { - event.finish(); - return; - } - _status.currentPhase - .chooseCard( - get.translation(trigger.player) + - "的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - ",请打出一张手牌进行改判", - "h", - true, - function (card) { - var player = _status.event.player; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - } - ) - .set("ai", function (card) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0; - if (attitude > 0) { - return result / Math.max(0.1, get.value(card)); - } else { - return -result / Math.max(0.1, get.value(card)); - } - }) - .set("judging", trigger.player.judging[0]); - "step 1"; - if (result.bool) { - _status.currentPhase.respond(result.cards, "highlight").nopopup = true; - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo( - "deletenode", - player, - get.cardsInfo([trigger.player.judging[0].clone]) - ); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player, "的判定牌改为", result.cards[0]); - game.delay(2); - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - nsxianhai: { - trigger: { global: "damageSource" }, - filter(event, player) { - return ( - event.source && - event.source != player && - event.source.isIn() && - event.source == _status.currentPhase && - (event.source.getStat("damage") || 0) > (player.getLastStat("damage") || 0) && - !player.hasSkill("nsxianhai_round") - ); - }, - check(event, player) { - return player.maxHp > 1 && get.attitude(player, event.source) < -4; - }, - logTarget: "source", - content() { - "step 0"; - player.addTempSkill("nsxianhai_round", "roundStart"); - player.loseMaxHp(); - var list = []; - for (var i = 1; i < 6; i++) { - if (trigger.source.hasEnabledSlot(i)) - list.add("equip" + (i == 3 || i == 4 ? "3_4" : i)); - } - if (list.length) { - player - .chooseControl(list) - .set("prompt", "选择废除" + get.translation(trigger.source) + "的一种装备栏") - .set("ai", function () { - var target = _status.event.getTrigger().source; - if ( - list.includes("equip6") && - target.getEquip("equip3") && - target.getEquip("equip4") - ) - return "equip6"; - if ( - list.includes("equip2") && - target.getEquip(2) && - get.value(target.getEquip(2), target) > 0 - ) - return "equip2"; - if ( - list.includes("equip5") && - target.getEquip(5) && - get.value(target.getEquip(5), target) > 0 - ) - return "equip5"; - return 0; - }); - } else event.goto(2); - "step 1"; - if (result.control != "equip3_4") trigger.source.disableEquip(result.control); - else { - trigger.source.disableEquip(3, 4); - } - "step 2"; - if (player.awakenedSkills.includes("nsxingchu")) { - var next = game.createEvent("nsxianhai_clear"); - event.next.remove(next); - event.getParent("phase").after.push(next); - next.player = player; - next.setContent(function () { - player.restoreSkill("nsxingchu"); - }); - } - "step 3"; - if (trigger.source) { - var hs = trigger.source.getCards("h", "shan"); - if (hs.length) trigger.source.discard(hs); - } - }, - }, - nsxianhai_round: { charlotte: true }, - nsxingchu: { - trigger: { global: "die" }, - forceDie: true, - filter(event, player) { - return player == event.player || player == event.source; - }, - limited: true, - skillAnimation: true, - animationColor: "wood", - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("nsxingchu")) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .set("forceDie", true); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("nsxingchu", target); - player.awakenSkill("nsxingchu"); - var he = trigger.player.getCards("he"); - if (he.length) target.gain(he, trigger.player, "giveAuto", "bySelf"); - target.gainMaxHp(); - } - }, - }, - nsshengyan: { - trigger: { player: "judgeEnd" }, - forced: true, - filter(event, player) { - return ( - _status.currentPhase && - _status.currentPhase.isIn() && - (!player.storage.nsshengyan2 || - !player.storage.nsshengyan2.includes(event.result.suit)) - ); - }, - logTarget() { - return _status.currentPhase; - }, - content() { - player.addTempSkill("nsshengyan2"); - if (!player.storage.nsshengyan2) player.storage.nsshengyan2 = []; - _status.currentPhase.addTempSkill("nsshengyan3"); - player.storage.nsshengyan2.add(trigger.result.suit); - _status.currentPhase.addMark("nsshengyan3", 2, false); - }, - }, - nsshengyan2: { onremove: true }, - nsshengyan3: { - mod: { - maxHandcard(player, num) { - return num + player.countMark("nsshengyan3"); - }, - }, - onremove: true, - intro: { - content: "本回合手牌上限+#", - }, - marktext: "筵", - }, - nsdaizhan: { - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter(event, player) { - return ( - (!player.hasJudge("lebu") || !player.hasJudge("bingliang")) && - player.countCards("he", function (card) { - if (_status.connectMode) return true; - return get.type(card, "trick") != "trick"; - }) - ); - }, - content() { - var next = player.chooseToUse(); - next.set("norestore", true); - next.set("_backupevent", "nsdaizhanx"); - next.set("custom", { - add: {}, - replace: { window() {} }, - }); - next.backup("nsdaizhanx"); - }, - }, - nsdaizhanx: { - chooseButton: { - dialog() { - var list = ["lebu", "bingliang"]; - var list2 = []; - for (var i of list) { - list2.push(["延时锦囊", "", i]); - } - return ui.create.dialog(get.prompt("nsdaizhan"), [list2, "vcard"], "hidden"); - }, - filter(button, player) { - return !player.hasJudge(button.link[2]); - }, - check(button) { - if (button.link[2] == "lebu") return 0; - var player = _status.event.player; - var delta = player.getHandcardLimit() + player.countCards("j") * 2 + 2 - player.hp; - if (delta >= 2) return 1 + Math.random(); - if ( - delta >= 0 && - !player.countCards("h", function (card) { - return player.hasValueTarget(card); - }) - ) - return Math.random(); - return 0; - }, - backup(links, player) { - return { - filterCard(card, player) { - return ( - get.itemtype(card) == "card" && - get.type(card, "trick") != "trick" && - player.canAddJudge({ - name: links[0][2], - cards: [card], - }) - ); - }, - filterTarget(card, player, target) { - return player == target; - }, - check(card) { - return 8 - get.value(card); - }, - viewAs: { name: links[0][2] }, - position: "he", - precontent() { - player.addTempSkill("nsdaizhany"); - event.result.skill = "nsdaizhan"; - }, - ai: { - result: { - target: 1, - }, - }, - }; - }, - prompt(links) { - return "将一张牌当做" + get.translation(links[0][2]) + "对自己使用"; - }, - }, - }, - nsdaizhany: { - trigger: { player: "phaseEnd" }, - forced: true, - popup: false, - filter(event, player) { - return player.countCards("h") < player.getHandcardLimit(); - }, - content() { - player.drawTo(player.getHandcardLimit()); - }, - ai: { - nowuxie_judge: true, - }, - }, - nsjiquan: { - trigger: { - global: ["damageEnd", "damageSource"], - }, - direct: true, - filter(event, player, name) { - var target = name == "damageSource" ? event.source : event.player; - return ( - target && - target != player && - get.distance(player, target) <= 1 && - target.countCards("hej") > 0 - ); - }, - locked(skill, player) { - return player && player.storage.nsfuwei; - }, - content() { - "step 0"; - var target = event.triggername == "damageSource" ? trigger.source : trigger.player; - event.target = target; - player - .choosePlayerCard(target, "hej", player.storage.nsfuwei ? true : 1) - .set("ai", function (button) { - var val = get.buttonValue(button); - if (get.attitude(_status.event.player, get.owner(button.link)) > 0) return -val; - return val; - }); - "step 1"; - if (result.bool) { - player.logSkill("nsjiquan", target); - player.addToExpansion(result.cards, target, "give").gaintag.add("nsjiquan_mark"); - } else event.finish(); - "step 2"; - game.delayx(); - }, - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") return num + player.getExpansions("nsjiquan_mark").length; - }, - }, - }, - nsjiquan_mark: { - intro: { - content: "expansion", - markcount: "expansion", - }, - marktext: "威", - }, - nsfuwei: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - unique: true, - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - filter(event, player) { - return player.getExpansions("nsjiquan_mark").length > 4; - }, - content() { - player.awakenSkill("nsfuwei"); - player.storage.nsfuwei = true; - player.addSkill("nsdiemou"); - player.addSkill("nszhihuang"); - player.gainMaxHp(2); - }, - derivation: ["nsdiemou", "nszhihuang"], - ai: { - combo: "nsjiquan" - }, - }, - nsdiemou: { - trigger: { player: "phaseUseBegin" }, - forced: true, - filter(event, player) { - return player.getExpansions("nsjiquan_mark").length > game.players.length; - }, - content() { - var cards = player.getExpansions("nsjiquan_mark"); - player.draw(cards.length); - player.loseMaxHp(); - player.loseToDiscardpile(cards); - if (cards.length > 4) player.turnOver(); - }, - ai: { - combo: "nsjiquan" - }, - }, - nszhihuang: { - group: "nszhihuang_damage", - trigger: { global: "useCard" }, - usable: 1, - filter(event, player) { - return ( - event.player == get.zhu(player) && - player.getExpansions("nsjiquan_mark").length > 0 && - event.cards && - event.cards.filterInD().length > 0 - ); - }, - prompt2(event) { - return "移去一张“威”并获得" + get.translation(event.cards.filterInD()); - }, - check(event, player) { - if (["equip", "delay"].includes(get.type(event.card))) - return get.attitude(player, event.player) < 0; - return get.value(event.cards.filterInD()) > 0; - }, - logTarget: "player", - content() { - "step 0"; - var cards = player.getExpansions("nsjiquan_mark"); - if (cards.length == 1) - event._result = { - bool: true, - links: cards.slice(0), - }; - else player.chooseButton(["选择移去一张“威”", cards], true); - "step 1"; - player.loseToDiscardpile(result.links); - player.gain(trigger.cards.filterInD(), "gain2", "log"); - }, - ai: { - combo: "nsjiquan" - }, - }, - nszhihuang_damage: { - trigger: { source: "damageBegin1" }, - forced: true, - filter(event, player) { - var zhu = get.zhu(player); - return ( - zhu && - player.countCards("h") > zhu.countCards("h") && - event.getParent().type == "card" - ); - }, - content() { - trigger.num++; - }, - }, - //OL神张角 - junksijun: { - audio: "sijun", - inherit: "sijun", - check(event, player) { - return ui.cardPile.childNodes.length; - }, - async content(event, trigger, player) { - player.removeMark("yizhao", player.countMark("yizhao")); - const pile = Array.from(ui.cardPile.childNodes); - if (pile.length) { - const max = Math.pow(2, Math.min(100, pile.length)); - let bool = false, - index, - cards = []; - for (let i = 0; i < max; i++) { - let num = 0; - index = i.toString(2); - while (index.length < pile.length) { - index = "0" + index; - } - for (var k = 0; k < index.length; k++) { - if (index[k] == "1") num += get.number(pile[k]); - if (num > 36) break; - } - if (num == 36) { - bool = true; - break; - } - } - if (bool) { - for (let k = 0; k < index.length; k++) { - if (index[k] == "1") cards.push(pile[k]); - } - await player.gain(cards, "gain2"); - } else { - let total = 0; - for (const card of pile) { - total += get.number(card); - cards.push(card); - if (total >= 36) break; - } - } - if (cards.length) await player.gain(cards, "gain2"); - } - }, - }, - //手杀削弱版许攸 - junkshicai: { - audio: "nzry_shicai_2", - trigger: { player: "useCardAfter" }, - filter(event, player) { - if (!event.cards.filterInD("oe").length) return false; - return ( - player - .getHistory("useCard", (evt) => get.type2(evt.card) == get.type2(event.card)) - .indexOf(event) == 0 - ); - }, - prompt2(event, player) { - const cards = event.cards.filterInD("oe"); - return ( - "你可以将" + - get.translation(cards) + - (cards.length > 1 ? "以任意顺序" : "") + - "置于牌堆顶,然后摸一张牌" - ); - }, - content() { - "step 0"; - event.cards = trigger.cards.filterInD("oe"); - var lose_list = []; - event.cards.forEach((card) => { - var owner = get.owner(card); - if (owner) { - var arr = lose_list.find((i) => i[0] == owner); - if (arr) arr[1].push(card); - else lose_list.push([owner, [card]]); - } - }); - if (lose_list.length) { - game.loseAsync({ - lose_list: lose_list, - }).setContent("chooseToCompareLose"); - } - "step 1"; - if (cards.length > 1) { - var next = player.chooseToMove("恃才:将牌按顺序置于牌堆顶"); - next.set("list", [["牌堆顶", cards]]); - next.set( - "reverse", - _status.currentPhase && _status.currentPhase.next - ? get.attitude(player, _status.currentPhase.next) > 0 - : false - ); - next.set("processAI", function (list) { - var cards = list[0][1].slice(0); - cards.sort(function (a, b) { - return (_status.event.reverse ? 1 : -1) * (get.value(b) - get.value(a)); - }); - return [cards]; - }); - } - "step 2"; - if (result.bool && result.moved && result.moved[0].length) - cards = result.moved[0].slice(0); - cards.reverse(); - game.cardsGotoPile(cards, "insert"); - game.log(player, "将", cards, "置于了牌堆顶"); - player.draw(); - }, - ai: { - reverseOrder: true, - skillTagFilter(player) { - if ( - player.getHistory("useCard", function (evt) { - return get.type(evt.card) == "equip"; - }).length > 0 - ) - return false; - }, - }, - }, - //削弱版段煨 - junklangmie: { - audio: "langmie", - trigger: { global: "phaseJieshuBegin" }, - direct: true, - filter(event, player) { - if (player == event.player || player.countCards("he") == 0) return false; - var num = 0; - if ( - event.player.hasHistory("sourceDamage", function (evt) { - num += evt.num; - return num >= 2; - }) - ) - return true; - var map = {}; - return event.player.hasHistory("useCard", function (i) { - var name = get.type2(i.card, false); - if (!map[name]) { - map[name] = true; - return false; - } - return true; - }); - }, - content() { - "step 0"; - var list = [], - num = 0, - target = trigger.player; - event.target = target; - event.choices = []; - var map = {}; - if ( - target.hasHistory("useCard", function (i) { - var name = get.type2(i.card, false); - if (!map[name]) { - map[name] = true; - return false; - } - return true; - }) - ) { - list.push("弃置一张牌,然后摸两张牌"); - event.choices.push("draw"); - } - if ( - target.hasHistory("sourceDamage", function (evt) { - num += evt.num; - return num >= 2; - }) - ) { - list.push("弃置一张牌,对" + get.translation(target) + "造成1点伤害"); - event.choices.push("damage"); - } - player - .chooseControl("cancel2") - .set("choiceList", list) - .set("ai", function () { - var player = _status.event.player; - var choices = _status.event.getParent().choices.slice(0); - choices.push("cancel"); - choicex = choices.slice(0); - var getx = function (a) { - switch (a) { - case "draw": - return 2 * get.effect(player, { name: "draw" }, player, player); - case "damage": - return get.damageEffect( - _status.event.getParent().target, - player, - player - ); - default: - return 0; - } - }; - choices.sort(function (a, b) { - return getx(b) - getx(a); - }); - return choicex.indexOf(choices[0]); - }) - .set("prompt", get.prompt("junklangmie", target)); - "step 1"; - if (result.control == "cancel2") event.finish(); - else { - event.choice = event.choices[result.index]; - player.chooseToDiscard("he").set("ai", (card) => 7 - get.value(card)).logSkill = - event.choice == "draw" ? "junklangmie" : ["junklangmie", target]; - } - "step 2"; - if (result.bool) { - if (event.choice == "draw") player.draw(2); - else target.damage(); - } - }, - }, - //李典光速通渠传说 - junkwangxi: { - audio: "wangxi", - trigger: { player: "damageEnd", source: "damageSource" }, - filter(event) { - if (event._notrigger.includes(event.player)) return false; - return ( - event.num && - event.source && - event.player && - event.player.isIn() && - event.source.isIn() && - event.source != event.player - ); - }, - check(event, player) { - if (player.isPhaseUsing()) return true; - if (event.player == player) return get.attitude(player, event.source) > -5; - return get.attitude(player, event.player) > -5; - }, - logTarget(event, player) { - if (event.player == player) return event.source; - return event.player; - }, - preHidden: true, - content() { - "step 0"; - event.count = trigger.num; - event.target = lib.skill.junkwangxi.logTarget(trigger, player); - "step 1"; - player.draw(2).gaintag = ["junkwangxi_tag"]; - event.count--; - "step 2"; - var cards = player.getCards("he", (card) => card.hasGaintag("junkwangxi_tag")); - if (cards.length > 0 && target.isIn()) { - if (cards.length == 1) event._result = { bool: true, cards: cards }; - else - player.chooseCard( - "he", - "忘隙:交给" + get.translation(target) + "一张牌", - true, - function (card) { - return card.hasGaintag("junkwangxi_tag"); - } - ); - } else event.goto(4); - "step 3"; - if (result.bool) { - player.give(result.cards, target); - } - "step 4"; - player.removeGaintag("junkwangxi_tag"); - if (event.count && target.isIn() && player.hasSkill("junkwangxi")) { - player.chooseBool(get.prompt2("junkwangxi", target)); - } else event.finish(); - "step 5"; - if (result.bool) { - player.logSkill("junkwangxi", target); - event.goto(1); - } - }, - ai: { - maixie: true, - maixie_hp: true, - }, - }, - //2013标准包双蜀黑 - junkjizhi: { - audio: "jizhi", - trigger: { player: "useCard" }, - frequent: true, - filter(event, player) { - return get.type(event.card) == "trick" && event.card.isCard; - }, - content() { - "step 0"; - var card = get.cards()[0]; - event.card = card; - game.cardsGotoOrdering(card); - player.showCards(card, get.translation(player) + "发动了【集智】"); - if (get.type(card) != "basic") { - player.gain(card, "gain2"); - event.finish(); - } else if (!player.countCards("h")) event.finish(); - "step 1"; - player.chooseCard( - "h", - "是否用一张手牌交换" + get.translation(card) + "?", - "若选择「取消」,则" + get.translation(card) + "将被置入弃牌堆。" - ); - "step 2"; - if (result.bool) { - var card = result.cards[0]; - player.$throw(card, 1000); - game.log(player, "将", card, "置于牌堆顶"); - player.lose(card, ui.cardPile, "visible", "insert"); - player.gain(event.card, "gain2"); - } - }, - }, - junkqicai: { - mod: { - targetInRange(card, player, target, now) { - var type = get.type(card); - if (type == "trick" || type == "delay") return true; - }, - canBeDiscarded(card) { - if ( - get.position(card) == "e" && - !["equip3", "equip4", "equip6"].includes(get.subtype(card)) - ) - return false; - }, - }, - }, - junkrende: { - audio: "rende", - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("h") > 0; - }, - filterTarget: lib.filter.notMe, - filterCard: true, - selectCard: [1, Infinity], - position: "h", - discard: false, - lose: false, - delay: false, - content() { - "step 0"; - event.num = cards.length; - event.targets = targets.slice(0); - player.give(cards, target); - if (event.num > 1) player.recover(); - "step 1"; - if ( - player.countCards("h") > 0 && - game.hasPlayer((current) => current != player && !targets.includes(current)) - ) { - player.chooseCardTarget({ - prompt: "是否继续分配剩余的手牌", - prompt2: - "操作提示:请先选择要分配的手牌,然后再选择一名角色,该角色将获得你选择的所有手牌。", - filterCard: true, - selectCard: [1, Infinity], - filterTarget(card, player, target) { - return ( - target != player && !_status.event.getParent().targets.includes(target) - ); - }, - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0], - cards = result.cards; - player.line(target, "green"); - player.give(cards, target); - targets.add(target); - event.num += cards.length; - if (num < 2 && event.num > 1) player.recover(); - event.goto(1); - } - }, - }, - //十周年削弱版张让 - junktaoluan: { - hiddenCard(player, name) { - return ( - !player.getStorage("junktaoluan").includes(name) && - player.countCards( - "hes", - (card) => !player.getStorage("junktaoluan2").includes(get.suit(card)) - ) > 0 && - !player.hasSkill("junktaoluan3") && - lib.inpile.includes(name) - ); - }, - audio: "taoluan", - enable: "chooseToUse", - filter(event, player) { - return ( - !player.hasSkill("junktaoluan3") && - player.countCards("hes", (card) => { - return lib.inpile.some((name) => { - if (player.getStorage("junktaoluan2").includes(get.suit(card))) return false; - if (player.getStorage("junktaoluan").includes(name)) return false; - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - if ( - event.filterCard( - { - name: name, - isCard: true, - cards: [card], - }, - player, - event - ) - ) - return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - if ( - event.filterCard( - { - name: name, - nature: nature, - isCard: true, - cards: [card], - }, - player, - event - ) - ) - return true; - } - } - return false; - }); - }) > 0 - ); - }, - chooseButton: { - dialog(event, player) { - var list = []; - for (var name of lib.inpile) { - if (get.type(name) == "basic" || get.type(name) == "trick") { - if (player.getStorage("junktaoluan").includes(name)) continue; - list.push([get.translation(get.type(name)), "", name]); - if (name == "sha") { - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } - } - } - return ui.create.dialog("滔乱", [list, "vcard"]); - }, - filter(button, player) { - return _status.event - .getParent() - .filterCard({ name: button.link[2] }, player, _status.event.getParent()); - }, - check(button) { - var player = _status.event.player; - var card = { - name: button.link[2], - nature: button.link[3], - }; - if (player.countCards("hes", (cardx) => cardx.name == card.name)) return 0; - return _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; - }, - backup(links, player) { - return { - filterCard(card, player) { - return !player.getStorage("junktaoluan2").includes(get.suit(card)); - }, - audio: "taoluan", - popname: true, - check(card) { - return 7 - get.value(card); - }, - position: "hse", - viewAs: { name: links[0][2], nature: links[0][3] }, - onuse(result, player) { - player.markAuto("junktaoluan2", [get.suit(result.cards[0], player)]); - var evt = _status.event.getParent("phase"); - if (evt && evt.name == "phase" && !evt.junktaoluan) { - evt.junktaoluan = true; - var next = game.createEvent("taoluan_clear"); - _status.event.next.remove(next); - evt.after.push(next); - next.player = player; - next.setContent(function () { - delete player.storage.junktaoluan2; - }); - } - player.markAuto("junktaoluan", [result.card.name]); - }, - }; - }, - prompt(links, player) { - return ( - "将一张牌当做" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) + - "使用" - ); - }, - }, - ai: { - order: 4, - save: true, - respondSha: true, - respondShan: true, - skillTagFilter(player, tag, arg) { - if ( - !player.countCards( - "hes", - (card) => !player.getStorage("junktaoluan2").includes(get.suit(card)) - ) || - player.hasSkill("taoluan3") - ) - return false; - if (tag == "respondSha" || tag == "respondShan") { - if (arg == "respond") return false; - return !player - .getStorage("taoluan") - .includes(tag == "respondSha" ? "sha" : "shan"); - } - return ( - !player.getStorage("taoluan").includes("tao") || - (!player.getStorage("taoluan").includes("jiu") && arg == player) - ); - }, - result: { - player(player) { - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if ( - players[i] != player && - players[i].countCards("he") && - get.attitude(player, players[i]) > 0 - ) { - return 1; - } - } - return 0; - }, - }, - threaten: 1.9, - }, - group: "junktaoluan2", - }, - junktaoluan2: { - trigger: { player: ["useCardAfter", "respondAfter"] }, - forced: true, - popup: false, - charlotte: true, - filter(event, player) { - if (!game.hasPlayer((current) => current != player)) return false; - return event.skill == "junktaoluan_backup"; - }, - content() { - "step 0"; - player - .chooseTarget( - true, - function (card, player, target) { - return target != player; - }, - "###滔乱###令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力" - ) - .set("ai", function (target) { - var player = _status.event.player; - if (get.attitude(player, target) > 0) { - if (get.attitude(target, player) > 0) { - return target.countCards("h"); - } - return target.countCards("h") / 2; - } - return 0; - }); - "step 1"; - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - var type = get.type(trigger.card, "trick"); - target - .chooseCard( - "###滔乱###交给" + - get.translation(player) + - "一张不为" + - get.translation(type) + - "牌的牌,或令其失去1点体力且滔乱无效直到回合结束", - "he", - num, - function (card, player, target) { - return get.type(card, "trick") != _status.event.cardType; - } - ) - .set("cardType", type) - .set("ai", function (card) { - if (_status.event.att) { - return 11 - get.value(card); - } - return 0; - }) - .set("att", get.attitude(target, player) > 0); - "step 2"; - if (result.bool) { - target.give(result.cards, player, "visible"); - } else { - player.addTempSkill("junktaoluan3"); - } - }, - }, - junktaoluan3: { - charlotte: true, - trigger: { player: "phaseEnd" }, - forced: true, - popup: false, - content() { - player.loseHp(); - }, - }, - junktaoluan_backup: { charlotte: true }, - - nshuaishuang: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - content() { - "step 0"; - var card = get.cardPile(function (card) { - return card.name == "tao"; - }); - if (card) { - player.gain(card, "gain2"); - } else event.finish(); - "step 1"; - game.updateRoundNumber(); - player.loseHp(); - }, - }, - nsfengli: { - trigger: { player: "phaseEnd" }, - direct: true, - filter(event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return current != player && !current.hasSkill("nsfengli_use"); - }) - ); - }, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("nsfengli"), function (card, player, target) { - return target != player && !target.hasSkill("nsfengli_use"); - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target) / (5 + target.countCards("h")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("nsfengli", target); - var cards = player.getCards("h"); - player.addShownCards(cards, "visible_nsfengli"); - player.addSkill("nsfengli2"); - target.addSkill("nsfengli_use"); - target.storage.nsfengli_use = player; - } - }, - group: ["nsfengli_draw", "nsfengli_clear"], - onremove(player) { - player.removeSkill("nsfengli2"); - }, - }, - nsfengli_draw: { - trigger: { - player: ["loseAfter", "hideShownCardsAfter"], - global: [ - "gainAfter", - "equipAfter", - "addJudgeAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - direct: true, - charlotte: true, - filter(event, player, name) { - if (event.name == "hideShownCards") { - const hs = player.countCards("h"); - return game.hasPlayer((current) => current.countCards("h") < hs); - } - var num = 0; - var evt = event.getl(player); - if (!evt || !evt.gaintag_map) return false; - var bool = false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].some((tag) => tag.indexOf("visible_") == 0)) num++; - } - if (event.getg) { - if (event.name == "gain") { - if ( - event.getlx === false && - event.gaintag.some((tag) => tag.indexOf("visible_") == 0) - ) - num -= event.cards.length; - } else { - player.checkHistory("gain", function (evt) { - if ( - evt.parent == event && - evt.gaintag.some((tag) => tag.indexOf("visible_") == 0) - ) { - num -= evt.cards.length; - } - }); - } - } - if (num > 0) { - const hs = player.countCards("h"); - return game.hasPlayer((current) => current.countCards("h") < hs); - } - }, - content() { - "step 0"; - player - .chooseTarget( - "奉礼:是否令一名手牌数小于你的其他角色摸一张牌?", - function (card, player, target) { - return target != player && target.countCards("h") < player.countCards("h"); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("nsfengli", target); - target.draw(); - } - }, - }, - nsfengli_clear: { - trigger: { player: "phaseBegin" }, - forced: true, - filter(event, player) { - return player.hasSkill("nsfengli2"); - }, - content() { - var cards = player.getShownCards(); - if (cards.length > 0) player.hideShownCards(cards); - player.removeSkill("nsfengli2"); - }, - }, - nsfengli2: { - onremove(player) { - player.removeGaintag("nsfengli2"); - game.countPlayer(function (current) { - if (current.storage.nsfengli_use == player) current.removeSkill("nsfengli_use"); - }); - }, - }, - nsfengli_use: { - hiddenCard(player, name) { - if (player == _status.currentPhase) return false; - var target = player.storage.nsfengli_use; - var cards = target.getShownCards(); - for (var i of cards) { - if (get.name(i, target) == name) return true; - } - return false; - }, - enable: ["chooseToUse", "chooseToRespond"], - charlotte: true, - onremove: true, - filter(event, player) { - if (player == _status.currentPhase) return false; - var target = player.storage.nsfengli_use; - var cards = target.getShownCards(); - for (var i of cards) { - if ( - event.filterCard( - { - name: get.name(i, target), - nature: get.nature(i, target), - isCard: true, - }, - player, - event - ) - ) - return true; - } - return false; - }, - chooseButton: { - dialog(event, player) { - var target = player.storage.nsfengli_use; - var cards = target.getShownCards(); - return ui.create.dialog("奉礼", cards); - }, - filter(button, player) { - var evt = _status.event.getParent(); - var target = player.storage.nsfengli_use; - return evt.filterCard( - { - name: get.name(button.link, target), - nature: get.nature(button.link, target), - isCard: true, - }, - player, - evt - ); - }, - check(button) { - var player = _status.event.player; - var evt = _status.event.getParent(); - if (evt.dying) return get.attitude(player, evt.dying); - return 1; - }, - backup(links, player) { - var target = player.storage.nsfengli_use; - return { - viewAs: { - name: get.name(links[0], target), - nature: get.nature(links[0], target), - isCard: true, - }, - card: links[0], - filterCard: () => false, - selectCard: -1, - precontent() { - var card = lib.skill.nsfengli_use_backup.card; - var target = player.storage.nsfengli_use; - event.target = target; - player.logSkill("nsfengli", target); - delete event.result.skill; - player.showCards(card, get.translation(player) + "发动了【奉礼】"); - target.hideShownCards(card); - }, - }; - }, - ai: { - hasSha: true, - hasShan: true, - skillTagFilter(player, tag) { - var name = "s" + tag.slice(4); - return lib.skill.nsfengli_use.hiddenCard(player, name); - }, - }, - }, - ai: { - order: 8, - result: { - player: 1, - }, - }, - }, - ns_chuanshu: { - audio: ["xingshuai", 2], - trigger: { - global: "dying", - }, - priority: 8, - unique: true, - skillAnimation: true, - animationColor: "water", - filter(event, player) { - return event.player.hp <= 0 && event.player != player; - }, - check(event, player) { - return get.attitude(player, event.player) > 0; - }, - logTarget: "player", - content() { - "step 0"; - trigger.player - .chooseControl("releiji", "guidao") - .set("prompt", "" + get.translation(trigger.player) + "获得一项技能"); - goon = true; - if (!goon) { - event.finish(); - } - "step 1"; - trigger.player.addSkillLog(result.control); - trigger.player.recover(1 - trigger.player.hp); - trigger.player.draw(2); - trigger.player.storage.ns_chuanshu2 = player; - trigger.player.addSkill("ns_chuanshu2"); - player.awakenSkill("ns_chuanshu"); - }, - }, - ns_xiandao1: { - audio: ["huashen", 2], - forced: true, - //noLose:true, - //locked:true, - //noRemove:true, - //noDisable:true, - priority: 10, - trigger: { - global: "gameStart", - player: ["phaseEnd", "enterGame"], - }, - //filter (event,player){ - // return player.isAlive(); - //}, - content() { - var n = [1, 2].randomGet(); - if (n == 1) { - player.addTempSkill("releiji", { - player: "phaseUseBegin", - }); - player.markSkill("releiji", { - player: "phaseUseBegin", - }); - } - if (n == 2) { - player.addTempSkill("guidao", { - player: "phaseUseBegin", - }); - player.markSkill("guidao", { player: "phaseUseBegin" }); - } - }, - }, - ns_xiandao2: { - audio: ["huashen", 2], - forced: true, - //noLose:true, - //locked:true, - //noRemove:true, - //noDisable:true, - trigger: { - player: "damageBefore", - }, - filter(event, player) { - if (!event.nature) return false; - return true; - }, - content() { - trigger.cancel(); - //event.finish(); - }, - }, - ns_xiandao: { - forced: true, - //noLose:true, - //locked:true, - noRemove: true, - //noDisable:true, - group: ["ns_xiandao1", "ns_xiandao2"], - }, - ns_chuanshu2: { - audio: ["songwei", 2], - mark: "character", - intro: { - content: "当你造成或受到一次伤害后,$摸一张牌", - }, - nopop: true, - trigger: { - source: "damageEnd", - player: "damageEnd", - }, - forced: true, - popup: false, - filter(event, player) { - return player.storage.ns_chuanshu2 && player.storage.ns_chuanshu2.isIn() && event.num > 0; - }, - content() { - "step 0"; - game.delayx(); - "step 1"; - var target = player.storage.ns_chuanshu2; - player.line(target, "green"); - target.draw(); - game.delay(); - }, - onremove: true, - group: "ns_chuanshu3", - }, - ns_chuanshu3: { - audio: 1, - trigger: { - player: "dieBegin", - }, - silent: true, - onremove: true, - filter(event, player) { - return player.storage.ns_chuanshu2 && player.storage.ns_chuanshu2.isIn(); - }, - content() { - "step 0"; - game.delayx(); - "step 1"; - var target = player.storage.ns_chuanshu2; - player.line(target, "green"); - //target.addSkill('ns_chuanshu'); - target.restoreSkill("ns_chuanshu"); - target.update(); - }, - forced: true, - popup: false, - }, - ns_xiuzheng: { - audio: ["xinsheng", 2], - enable: "phaseUse", - usable: 1, - priority: 10, - filter(event, player) { - return ui.cardPile.childElementCount + ui.discardPile.childElementCount >= 2; - }, - filterTarget(card, player, target) { - return player != target; - }, - content() { - "step 0"; - event.cards = get.cards(2); - player.showCards(event.cards); - "step 1"; - if (get.color(event.cards[0]) == "red" && get.color(event.cards[1]) == "red") { - target.damage("fire"); - } - if (get.color(event.cards[0]) != get.color(event.cards[1])) { - player.discardPlayerCard(target, "he", true); - } - if (get.color(event.cards[0]) == "black" && get.color(event.cards[1]) == "black") { - target.damage("thunder"); - } - "step 2"; - if (event.cards.length) { - player.gain(event.cards, "gain2"); - game.delay(); - } - "step 3"; - player.chooseToDiscard(2, "he", "请弃置两张牌", true); - }, - ai: { - threaten: 0.5, - order: 13, - result: { - target(player, target) { - return get.damageEffect(target, player); - }, - }, - }, - }, - nsanruo: { - unique: true, - init(player) { - if (!player.node.handcards1.cardMod) { - player.node.handcards1.cardMod = {}; - } - if (!player.node.handcards2.cardMod) { - player.node.handcards2.cardMod = {}; - } - var cardMod = function (card) { - if (get.info(card).multitarget) return; - if (card.name == "sha" || get.type(card) == "trick") - return ["暗弱", "杀或普通锦囊牌对你不可见"]; - }; - player.node.handcards1.cardMod.nsanruo = cardMod; - player.node.handcards2.cardMod.nsanruo = cardMod; - player.node.handcards1.classList.add("nsanruo"); - player.node.handcards2.classList.add("nsanruo"); - if (!ui.css.nsanruo) { - ui.css.nsanruo = lib.init.sheet( - '.handcards.nsanruo>.card[data-card-type="trick"]:not(*[data-card-multitarget="1"])>*,' + - '.handcards.nsanruo>.card[data-card-name="sha"]>*{visibility:hidden !important}' - ); - } - }, - onremove(player) { - player.node.handcards1.classList.remove("nsanruo"); - player.node.handcards2.classList.remove("nsanruo"); - delete player.node.handcards1.cardMod.nsanruo; - delete player.node.handcards2.cardMod.nsanruo; - }, - ai: { - neg: true, - }, - }, - nsxunshan: { - mod: { - selectTarget(card, player, range) { - if (!player.hasSkill("nsanruo")) return; - if (_status.auto) return; - if (get.position(card) != "h" || get.owner(card) != player) return; - if (get.info(card).multitarget) return; - if (card.name == "sha" || get.type(card) == "trick") range[1] = game.countPlayer(); - }, - // playerEnabled(card,player,target,current){ - // if(current==false) return; - // var filter=get.info(card).modTarget; - // if(typeof filter=='boolean'&&filter) return 'forceEnable'; - // if(typeof filter=='function'&&filter(card,player,target)) return 'forceEnable'; - // } - // targetInRange(card,player){ - // if(_status.auto) return; - // if(get.position(card)!='h'||get.owner(card)!=player) return; - // if(get.info(card).multitarget) return; - // if(card.name=='sha'||get.type(card)=='trick') return true; - // } - }, - ai: { - combo: "nsanruo", - }, - }, - nskaicheng: { - enable: "phaseUse", - usable: 1, - zhuSkill: true, - unique: true, - filter(event, player) { - if (!player.hasZhuSkill("nskaicheng")) return false; - if ( - !player.hasCard(function (card) { - if (get.info(card).multitarget) return false; - return card.name == "sha" || get.type(card) == "trick"; - }) - ) { - return false; - } - return game.hasPlayer(function (current) { - return current != player && current.group == "qun"; - }); - }, - filterCard(card) { - if (get.info(card).multitarget) return false; - return card.name == "sha" || get.type(card) == "trick"; - }, - filterTarget(card, player, target) { - return player != target && target.group == "qun"; - }, - lose: false, - content() { - "step 0"; - target.chooseBool(function () { - return get.attitude(target, player) > 0; - }, "是否将" + get.translation(cards) + "告知" + get.translation(player)); - "step 1"; - if (!player.hasUseTarget(cards[0])) { - if (result.bool) { - player - .chooseControl("确定") - .set("prompt", "你展示的手牌为" + get.translation(cards)); - } else { - event.hidden = true; - player - .chooseControl("确定") - .set("prompt", get.translation(target) + "拒绝告知你卡牌信息"); - } - } else { - if (result.bool) { - player.chooseBool( - "是否使用展示的牌?", - "你展示的手牌为" + - get.translation(cards) + - "。如果你使用此牌,则在结算后摸一张牌;如果你不使用此牌,则结束出牌阶段" - ); - } else { - event.hidden = true; - player.chooseBool( - "是否使用展示的牌?", - get.translation(target) + - "拒绝告知你卡牌信息。如果你使用此牌,则在结算后摸一张牌;如果你不使用此牌,则结束出牌阶段" - ); - } - } - "step 2"; - if (result.bool) { - player.chooseUseTarget(true, cards[0], event.hidden ? "选择此牌的目标" : null); - } else { - var evt = _status.event.getParent("phaseUse"); - if (evt) { - evt.skipped = true; - } - event.finish(); - } - "step 3"; - player.draw(); - }, - ai: { - combo: "nsanruo", - }, - }, - nsjuanli: { - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target != player && target.countCards("h"); - }, - filter(event, player) { - return player.countCards("h"); - }, - init(player) { - player.storage.nsjuanli_win = []; - player.storage.nsjuanli_lose = []; - }, - intro: { - content(storage, player) { - var str = ""; - if (player.storage.nsjuanli_win.length) { - str += - get.translation(player.storage.nsjuanli_win) + "与你距离-1直到与你下次赌牌"; - } - if (player.storage.nsjuanli_lose.length) { - if (str.length) { - str += ";"; - } - str += - get.translation(player.storage.nsjuanli_lose) + "与你距离+1直到与你下次赌牌"; - } - return str; - }, - }, - onremove: ["nsjuanli_win", "nsjuanli_lose"], - content() { - "step 0"; - player.storage.nsjuanli_win.remove(target); - player.storage.nsjuanli_lose.remove(target); - event.prompt2 = - "赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次亮出牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利"; - player.chooseCard("h", true).set("prompt2", event.prompt2); - "step 1"; - if (result.bool) { - event.card1 = result.cards[0]; - target.chooseCard("h", true).set("prompt2", event.prompt2); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - event.card2 = result.cards[0]; - } else { - event.finish(); - } - "step 3"; - player.$compare(event.card1, event.target, event.card2); - game.delay(0, 1500); - game.log(player, "亮出的牌为", event.card1); - game.log(target, "亮出的牌为", event.card2); - "step 4"; - var suit1 = get.suit(event.card1); - var suit2 = get.suit(event.card2); - if (suit1 == suit2) { - game.broadcastAll(function (str) { - var dialog = ui.create.dialog(str); - dialog.classList.add("center"); - setTimeout(function () { - dialog.close(); - }, 1000); - }, "平局"); - game.delay(2); - if (!player.storage.nsjuanli_win.length && !player.storage.nsjuanli_lose.length) { - player.unmarkSkill("nsjuanli"); - } - } else { - var cards = []; - for (var i = 0; i < 1000; i++) { - var current = get.cards(); - if (current && current.length) { - current = current[0]; - current.discard(); - cards.push(current); - var suit = get.suit(current); - if (suit == suit1) { - player.showCards(cards, get.translation(player) + "赌牌获胜"); - player.storage.nsjuanli_win.add(target); - target.loseHp(); - player.markSkill("nsjuanli"); - break; - } else if (suit == suit2) { - player.showCards(cards, get.translation(target) + "赌牌获胜"); - player.storage.nsjuanli_lose.add(target); - target.recover(); - player.markSkill("nsjuanli"); - break; - } - } else { - break; - } - } - } - }, - mod: { - globalTo(from, to, distance) { - if (to.storage.nsjuanli_win && to.storage.nsjuanli_win.includes(from)) { - return distance - 1; - } - if (to.storage.nsjuanli_lose && to.storage.nsjuanli_lose.includes(from)) { - return distance + 1; - } - }, - }, - ai: { - order: 4, - result: { - target(player, target) { - if (target.isHealthy()) { - return -1 / (1 + target.hp); - } else { - return -0.3 / (1 + target.hp); - } - }, - }, - }, - }, - nsyuanchou: { - trigger: { target: "useCardToBefore" }, - forced: true, - priority: 15, - check(event, player) { - return get.effect(event.target, event.card, event.player, player) < 0; - }, - filter(event, player) { - return get.type(event.card, "trick") == "trick" && get.distance(event.player, player) > 1; - }, - content() { - trigger.cancel(); - }, - ai: { - effect: { - target(card, player, target, current) { - if (get.type(card, "trick") == "trick" && get.distance(player, target) > 1) - return "zeroplayertarget"; - }, - }, - }, - }, - nsguhuo: { - trigger: { player: "useCardAfter" }, - forced: true, - usable: 2, - filter(event, player) { - if (event.parent.name == "nsguhuo") return false; - if (event.card == event.cards[0]) { - var type = get.type(event.card, "trick"); - var names = []; - if ( - get.cardPile(function (card) { - if (get.type(card, "trick") != type) return false; - if (get.info(card).multitarget) return false; - if (names.includes(card.name)) return false; - if (player.hasUseTarget(card)) { - return true; - } else { - names.add(card.name); - return false; - } - }) - ) { - return true; - } - } - return true; - }, - content() { - var type = get.type(trigger.card, "trick"); - var names = []; - var card = get.cardPile(function (card) { - if (get.type(card, "trick") != type) return false; - if (get.info(card).multitarget) return false; - if (names.includes(card.name)) return false; - if (player.hasUseTarget(card)) { - return true; - } else { - names.add(card.name); - return false; - } - }); - if (card) { - var info = get.info(card); - var targets = game.filterPlayer(function (current) { - return lib.filter.filterTarget(card, player, current); - }); - if (targets.length) { - targets.sort(lib.sort.seat); - var select = get.select(info.selectTarget); - if (select[0] == -1 || select[1] == -1) { - player.useCard(card, targets, "noai"); - } else if (targets.length >= select[0]) { - var num = select[0] + Math.floor(Math.random() * (select[1] - select[0] + 1)); - player.useCard(card, targets.randomGets(num), "noai"); - } - } - } - }, - }, - nsbaiyi: { - trigger: { player: "phaseDiscardBefore" }, - forced: true, - filter(event, player) { - return player.storage.nsqinxue && player.storage.nsqinxue.length; - }, - content() { - "step 0"; - trigger.cancel(); - var num = player.storage.nsqinxue.length; - player.chooseToDiscard("白衣:请弃置" + get.cnNumber(num) + "张牌", "he", true, num); - "step 1"; - if (result.bool && result.cards.length) { - event.goon = true; - if (result.cards.length == 3) { - var type = []; - for (var i = 0; i < result.cards.length; i++) { - type.add(get.type(result.cards[i], "trick")); - } - if (type.length == 3 && trigger.getParent().skill != "nsbaiyi") { - event.goon = false; - player.insertPhase(); - } - } - if (event.goon) { - var cards = get.cards(result.cards.length); - event.cards = cards; - player.chooseCardButton(cards, "获得一张牌", true); - } - } - "step 2"; - if (event.goon && result.bool && result.links.length) { - player.gain(result.links, "draw"); - for (var i = 0; i < event.cards.length; i++) { - if (!result.links.includes(event.cards[i])) { - event.cards[i].discard(); - } - } - } - }, - ai: { - threaten: 1.5, - combo: "nsqinxue", - }, - }, - nsqinxue: { - trigger: { player: "useCard" }, - init(player) { - player.storage.nsqinxue = []; - }, - forced: true, - filter(event, player) { - var type = get.type(event.card, "trick"); - if (player.storage.nsqinxue.includes(type)) return false; - return ["basic", "trick", "equip"].includes(type); - }, - content() { - var type = null; - var type0 = get.type(trigger.card, "trick"); - switch (type0) { - case "basic": - type = "trick"; - break; - case "trick": - type = "equip"; - break; - case "equip": - type = "basic"; - break; - } - var card = get.cardPile(function (card) { - return get.type(card, "trick") == type; - }); - if (card) { - player.gain(card, "gain2"); - player.storage.nsqinxue.push(type0); - } - }, - group: "nsqinxue_clear", - subSkill: { - clear: { - trigger: { global: "phaseAfter" }, - silent: true, - content() { - player.storage.nsqinxue = []; - }, - }, - }, - }, - nsfuge: { - trigger: { player: "phaseAfter" }, - filter(event, player) { - return !player.storage.nsfuge; - }, - init(player) { - lib.onwash.push(function () { - delete player.storage.nsfuge; - }); - }, - skillAnimation: true, - check(event, player) { - return player.hp == 1 || player.maxHp - player.hp >= 2; - }, - content() { - player.storage.nsfuge = true; - player.insertPhase(); - }, - group: "nsfuge_draw", - subSkill: { - draw: { - trigger: { player: "phaseDrawBegin" }, - silent: true, - filter(event, player) { - var evt = event.getParent("phase"); - return evt && evt.skill == "nsfuge"; - }, - content() { - trigger.num += player.maxHp - player.hp; - }, - }, - }, - }, - nsbaiming: { - trigger: { player: "useCard" }, - direct: true, - filter(event, player) { - if (player.additionalSkills.nsbaiming) return false; - return ( - event.card && - event.card.name == "sha" && - player.storage.nsbaiming && - player.storage.nsbaiming.length > 0 - ); - }, - group: "nsbaiming_clear", - init(player) { - var check = function (list) { - for (var i = 0; i < list.length; i++) { - var info = lib.skill[list[i]]; - if (info && info.shaRelated) return true; - if (info && info.trigger) { - for (var j in info.trigger) { - var cond = info.trigger[j]; - if (typeof cond == "string") { - cond = [cond]; - } - if (j == "player" || j == "global") { - if (cond.indexOf("shaBefore") != -1) return true; - if (cond.indexOf("shaBegin") != -1) return true; - if (cond.indexOf("shaEnd") != -1) return true; - if (cond.indexOf("shaAfter") != -1) return true; - } - if (j == "source" || j == "global") { - if (cond.indexOf("damageBefore") != -1) return true; - if (cond.indexOf("damageBegin") != -1) return true; - if (cond.indexOf("damageBegin1") != -1) return true; - if (cond.indexOf("damageBegin2") != -1) return true; - if (cond.indexOf("damageEnd") != -1) return true; - if (cond.indexOf("damageSource") != -1) return true; - if (cond.indexOf("damageAfter") != -1) return true; - } - } - } - } - return false; - }; - player.storage.nsbaiming = get.gainableSkills(function (info, skill) { - var list = [skill]; - game.expandSkills(list); - return check(list); - }, player); - }, - content() { - "step 0"; - var list = player.storage.nsbaiming.slice(0); - event.skillai = function () { - return get.max(list, get.skillRank, "item"); - }; - if (event.isMine()) { - var dialog = ui.create.dialog("forcebutton"); - dialog.add(get.prompt("nsbaiming")); - var clickItem = function () { - _status.event._result = this.link; - dialog.close(); - game.resume(); - }; - for (var i = 0; i < list.length; i++) { - if (lib.translate[list[i] + "_info"]) { - var translation = get.translation(list[i]); - if (translation[0] == "新" && translation.length == 3) { - translation = translation.slice(1, 3); - } else { - translation = translation.slice(0, 2); - } - var item = dialog.add( - '" - ); - item.firstChild.addEventListener("click", clickItem); - item.firstChild.link = list[i]; - } - } - dialog.add(ui.create.div(".placeholder")); - event.switchToAuto = function () { - event._result = event.skillai(); - dialog.close(); - game.resume(); - }; - event.confirm = ui.create.confirm("c"); - event.custom.replace.confirm = function () { - event._result = null; - dialog.close(); - game.resume(); - }; - _status.imchoosing = true; - game.pause(); - } else { - event._result = event.skillai(); - } - "step 1"; - _status.imchoosing = false; - if (event.confirm) { - event.confirm.close(); - } - if (typeof result == "string") { - player.logSkill("nsbaiming"); - var link = result; - player.addAdditionalSkill("nsbaiming", link); - player.logSkill("nsbaiming"); - player.popup(link); - game.log(player, "获得了技能", "【" + get.translation(link) + "】"); - game.delay(); - player.storage.nsbaiming.remove(link); - trigger.nsbaiming = true; - } - }, - subSkill: { - clear: { - trigger: { player: "useCardAfter" }, - silent: true, - filter(event) { - return event.nsbaiming == true; - }, - content() { - player.removeAdditionalSkill("nsbaiming"); - }, - }, - }, - }, - nsxinzhan: { - enable: "phaseUse", - filterCard: [1, Infinity], - filter(event, player) { - return player.countCards("h") > 0; - }, - usable: 1, - selectCard: [1, Infinity], - check(card) { - var player = _status.event.player; - if ( - player.countCards("h") >= 8 && - game.hasPlayer(function (current) { - return current.isDamaged() && get.attitude(player, current) > 3; - }) - ) { - if (ui.selected.cards.length >= 6) { - return 0; - } - return 1; - } else { - if (ui.selected.cards.length >= 2) { - return 0; - } - if ( - player.countCards("h", function (card) { - return get.value(card) < 0; - }) - ) { - return 8 - get.value(card, player, "raw"); - } else { - return 4 - get.value(card, player, "raw"); - } - } - }, - discard: false, - prepare: "give2", - content() { - target.gain(cards, player); - var num = Math.floor(cards.length / 2); - if (num >= 3) { - target.loseMaxHp(true); - } else if (num) { - target.loseHp(num); - } - }, - filterTarget(card, player, target) { - return target != player; - }, - ai: { - order: 10, - result: { - target(player, target) { - if (ui.selected.cards.length >= 6) { - if (target.isDamaged()) return 2; - return 1; - } - if (ui.selected.cards.length == 1) { - return 1; - } - return -1; - }, - }, - }, - }, - nstanbing: { - trigger: { player: "phaseDrawBegin" }, - filter(event, player) { - return player.countCards("h") > 0; - }, - direct: true, - content() { - "step 0"; - player.chooseToDiscard("h", get.prompt2("nstanbing")).set("ai", function (card) { - if (!player.needsToDiscard(1)) { - return get.translation(card.name).length - 1; - } - return 0; - }).logSkill = "nstanbing"; - "step 1"; - if (result.bool) { - player.draw(get.translation(result.cards[0].name).length); - player.addTempSkill("nstanbing_sha"); - } - }, - subSkill: { - sha: { - mod: { - cardEnabled(card, player) { - if (card.name == "sha") { - return false; - } - }, - cardUsable(card, player) { - if (card.name == "sha") { - return false; - } - }, - }, - }, - }, - }, - nswangfeng: { - trigger: { global: "judge" }, - filter(event, player) { - return player.countCards("he", { color: "red" }) > 0; - }, - direct: true, - content() { - "step 0"; - player - .chooseCard( - get.translation(trigger.player) + - "的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - "," + - get.prompt("nswangfeng"), - "he", - function (card) { - return get.color(card) == "red"; - } - ) - .set("ai", function (card) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0; - if (attitude > 0) { - return result; - } else { - return -result; - } - }) - .set("judging", trigger.player.judging[0]); - "step 1"; - if (result.bool) { - player.respond(result.cards, "highlight"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.logSkill("nswangfeng"); - player.$gain2(trigger.player.judging[0]); - player.gain(trigger.player.judging[0]); - trigger.player.judging[0] = result.cards[0]; - if (!get.owner(result.cards[0], "judge")) { - trigger.position.appendChild(result.cards[0]); - } - game.log(trigger.player, "的判定牌改为", result.cards[0]); - } - "step 3"; - game.delay(2); - }, - ai: { - tag: { - rejudge: 1, - }, - }, - }, - nsfuhuo: { - enable: "phaseUse", - usable: 1, - filterCard: true, - filterTarget(card, player, target) { - return player != target && !target.hasSkill("nsfuhuo2"); - }, - prepare: "throw", - discard: false, - content() { - target.$gain2(cards); - target.storage.nsfuhuo2 = cards[0]; - target.addSkill("nsfuhuo2"); - target.storage.nsfuhuo3 = player; - ui.special.appendChild(cards[0]); - target.syncStorage("nsfuhuo2"); - }, - check(card) { - return 6 - get.value(card); - }, - ai: { - expose: 0.1, - order: 4, - result: { - target(player, target) { - if (target.hasSkillTag("maixie")) return 0; - return -1; - }, - }, - }, - group: ["nsfuhuo_die", "nsfuhuo_gain"], - subSkill: { - die: { - trigger: { player: "dieBegin" }, - silent: true, - content() { - for (var i = 0; i < game.players.length; i++) { - if ( - game.players[i].hasSkill("nsfuhuo2") && - game.players[i].storage.nsfuhuo3 == player - ) { - game.players[i].removeSkill("nsfuhuo2"); - } - } - }, - }, - gain: { - trigger: { player: "phaseBegin" }, - silent: true, - content() { - for (var i = 0; i < game.players.length; i++) { - if ( - game.players[i].hasSkill("nsfuhuo2") && - game.players[i].storage.nsfuhuo3 == player - ) { - var card = game.players[i].storage.nsfuhuo2; - game.players[i].removeSkill("nsfuhuo2"); - game.players[i].$give(card, player); - player.gain(card); - } - } - }, - }, - }, - }, - nsfuhuo2: { - trigger: { player: ["respondAfter", "useCardAfter"] }, - forced: true, - priority: 10, - mark: "card", - popup: false, - filter(event, player) { - return ( - event.card && - event.card.name == "shan" && - player.storage.nsfuhuo3 && - player.storage.nsfuhuo3.isIn() - ); - }, - content() { - "step 0"; - player.storage.nsfuhuo3.logSkill("nsfuhuo", player); - player.judge(function (card) { - var suit = get.suit(card); - if (suit == "heart" || suit == "diamond") { - return -1; - } else { - return 0; - } - }); - "step 1"; - var source = player.storage.nsfuhuo3; - if (result.suit == "diamond") { - player.damage("fire", source); - if (player.countCards("h")) { - player.randomDiscard("h"); - } - } else if (result.suit == "heart") { - player.damage("fire", 2, source); - } - }, - intro: { - content: "card", - }, - onremove(player) { - player.storage.nsfuhuo2.discard(); - delete player.storage.nsfuhuo2; - delete player.storage.nsfuhuo3; - }, - ai: { - noShan: true, - }, - }, - nshunji: { - enable: "phaseUse", - viewAs: { name: "wanjian" }, - usable: 1, - delay: 0, - selectCard: 0, - group: ["nshunji_damage", "nshunji_draw"], - subSkill: { - draw: { - trigger: { player: "useCard" }, - silent: true, - filter(event) { - return event.skill == "nshunji"; - }, - content() { - player.draw(); - }, - }, - damage: { - trigger: { global: "damageAfter" }, - silent: true, - filter(event) { - return event.getParent(2).skill == "nshunji"; - }, - content() { - "step 0"; - if (player.countCards("he")) { - trigger.player - .discardPlayerCard(player, "混击", "he") - .set("boolline", true) - .set( - "prompt2", - "弃置" + get.translation(player) + "的一张牌,或取消并摸一张牌" - ); - } else { - trigger.player.draw(); - event.finish(); - } - "step 1"; - if (!result.bool) { - trigger.player.draw(); - } - }, - }, - }, - }, - nsbaquan: { - trigger: { player: "phaseEnd" }, - filter(event, player) { - return player.countCards("h") > 0; - }, - check(event, player) { - if (player.hasShan() || player.hujia > 0) return false; - var nh = player.countCards("h"); - if (player.hp == 1) { - return nh <= 3; - } - if (player.hp == 2) { - return nh <= 1; - } - return false; - }, - content() { - var cards = player.getCards("h"); - player.discard(cards); - player.changeHujia(cards.length); - player.storage.nsbaquan = true; - }, - group: "nsbaquan_clear", - subSkill: { - clear: { - trigger: { player: "phaseBegin" }, - forced: true, - filter(event, player) { - return player.storage.nsbaquan && player.hujia > 0; - }, - content() { - player.changeHujia(-player.hujia); - game.log(player, "失去了所有护甲"); - delete player.storage.nsbaquan; - }, - }, - }, - }, - nschangshi: { - mode: ["identity"], - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.identity == "fan"; - }, - filterTarget(card, player, target) { - if (target == player) return false; - if (ui.selected.targets.length) { - return target.hp != ui.selected.targets[0].hp; - } - return true; - }, - multitarget: true, - selectTarget: 2, - content() { - game.broadcastAll(function (player, targets) { - player.showIdentity(); - var tmp = targets[0].hp; - targets[0].hp = targets[1].hp; - targets[1].hp = tmp; - targets[0].update(); - targets[1].update(); - if (Math.abs(targets[0].hp - targets[1].hp) == 1) { - player.loseHp(); - } - //else{ - //player.die(); - //} - }, player, targets); - }, - ai: { - order: 10, - result: { - target(player, target) { - if (target == game.zhu) return -1; - if (get.attitude(player, target) > 3) { - var num = game.zhu.hp - target.hp; - if (num == 1) { - return 1; - } - if (num > 1) { - if (player.hp == 1) return num; - if (target.hp == 1) return num; - if (num >= 3) return num; - } - } - return 0; - }, - }, - }, - }, - nsjianning: { - mode: ["identity"], - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.identity == "nei"; - }, - filterTarget(card, player, target) { - return target.countCards("h") < player.countCards("h"); - }, - content() { - "step 0"; - if (!player.identityShown) { - game.broadcastAll(function (player) { - player.showIdentity(); - }, player); - } - player.swapHandcards(target); - "step 1"; - target.damage(); - }, - ai: { - order: 10, - result: { - target(player, target) { - if ( - !player.countCards("h", function (card) { - return get.value(card) >= 8; - }) && - player.countCards("h") - target.countCards("h") <= 1 - ) { - if ( - target.hp == 1 || - player.countCards("h", function (card) { - return get.value(card) < 0; - }) - ) { - return get.damageEffect(target, player, target); - } - } - return 0; - }, - }, - }, - }, - nscuanquan: { - mode: ["identity"], - init(player) { - player.storage.nscuanquan = 0; - }, - forced: true, - unique: true, - forceunique: true, - skillAnimation: true, - animationColor: "thunder", - trigger: { player: "damageAfter" }, - filter(event, player) { - return ( - player.identity == "zhong" && - player.storage.nscuanquan == 3 && - game.zhu && - game.zhu.isZhu - ); - }, - group: "nscuanquan_count", - subSkill: { - count: { - trigger: { player: "damageEnd" }, - silent: true, - content() { - player.storage.nscuanquan++; - }, - }, - }, - logTarget() { - return [game.zhu]; - }, - content() { - player.awakenSkill("nscuanquan"); - game.broadcastAll(function (player) { - var tmp = player.maxHp; - player.identity = "zhu"; - player.maxHp = game.zhu.hp; - player.showIdentity(); - player.update(); - game.zhu.identity = "zhong"; - game.zhu.maxHp = tmp; - game.zhu.showIdentity(); - game.zhu.update(); - game.zhu = player; - }, player); - event.trigger("zhuUpdate"); - }, - }, - nstianji: { - trigger: { global: "dying" }, - priority: 6, - unique: true, - skillAnimation: true, - animationColor: "water", - filter(event, player) { - return event.player.hp <= 0 && event.player != player; - }, - logTarget: "player", - check(event, player) { - return get.attitude(player, event.player) > 1; - }, - content() { - "step 0"; - player.awakenSkill("nstianji"); - player.loseMaxHp(); - "step 1"; - trigger.player.recover(1 - trigger.player.hp); - "step 2"; - trigger.player.gainMaxHp(); - }, - }, - nsbugua: { - group: "nsbugua_use", - ai: { - threaten: 1.4, - }, - subSkill: { - use: { - enable: "phaseUse", - usable: 1, - filterCard: true, - check(card) { - return 9 - get.value(card); - }, - filter(event, player) { - // if(!player.storage.nstuiyan2_done&&player.getStat().skill.nsbugua_use){ - // return false; - // } - return player.countCards("he"); - }, - position: "he", - ai: { - order: 9.5, - result: { - player: 1, - }, - }, - content() { - "step 0"; - player.throwDice(); - "step 1"; - var cards = get.cards(6); - var cards2 = cards.slice(0); - var card = cards2.splice(event.num - 1, 1)[0]; - player - .showCards(get.translation(player) + "亮出了" + get.translation(card), cards) - .set("hiddencards", cards2); - card.discard(); - var name = null; - switch (get.suit(card)) { - case "club": { - if (card.number % 2 == 0) { - name = "guohe"; - } else { - name = "jiedao"; - } - break; - } - case "spade": { - if (card.number % 2 == 0) { - name = "nanman"; - } else { - name = "juedou"; - } - break; - } - case "diamond": { - if (card.number % 2 == 0) { - name = "shunshou"; - } else { - name = "huogong"; - } - break; - } - case "heart": { - if (card.number % 2 == 0) { - name = "wuzhong"; - } else { - name = "wanjian"; - } - break; - } - } - var togain = get.cardPile(name, "cardPile"); - if (togain) { - player.gain(togain, "gain2"); - } else { - player.draw(); - } - event.list = cards2; - "step 2"; - player.chooseCardButton( - event.list, - true, - "按顺序将牌置于牌堆顶(先选择的在上)", - event.list.length - ); - "step 3"; - var list = result.links.slice(0); - while (list.length) { - ui.cardPile.insertBefore(list.pop(), ui.cardPile.firstChild); - } - }, - }, - twice: {}, - }, - }, - nstuiyan: { - trigger: { player: "useCard" }, - filter(event, player) { - return ( - _status.currentPhase == player && - event.getParent("phaseUse", true) && - !player.hasSkill("nstuiyan_fail") && - typeof player.storage.nstuiyan == "number" && - event.card.number > player.storage.nstuiyan - ); - }, - frequent: true, - priority: 2, - content() { - player.draw(); - }, - onremove(player) { - delete player.storage.nstuiyan; - delete player.storage.nstuiyan_done; - delete player.storage.nstuiyan2; - delete player.storage.nstuiyan2_done; - }, - intro: { - mark(dialog, content, player) { - if (player.storage.nstuiyan_done) { - dialog.addText("推演摸牌已结束"); - } else { - dialog.addText("上一张点数:" + player.storage.nstuiyan); - } - if (player.storage.nstuiyan2_done) { - dialog.addText("总点数8的倍数已达成"); - } else { - dialog.addText("总点数:" + player.storage.nstuiyan2); - } - }, - content(storage, player) { - var str = ""; - if (player.storage.nstuiyan_done) { - str += "推演摸牌已结束;"; - } else { - str += "上一张牌点数:" + storage + ";"; - } - if (player.storage.nstuiyan2_done) { - str += "总点数8的倍数已达成"; - } else { - str += "总点数:" + player.storage.nstuiyan2; - } - return str; - }, - markcount(storage, player) { - if (player.storage.nstuiyan2_done) { - if (player.storage.nstuiyan_done) { - return 0; - } else { - return player.storage.nstuiyan; - } - } else { - return player.storage.nstuiyan2; - } - }, - }, - group: ["nstuiyan_use", "nstuiyan_clear"], - subSkill: { - bugua: { - trigger: { player: "useCardAfter" }, - direct: true, - filter(event, player) { - return player.countCards("h"); - }, - content() { - "step 0"; - player.removeSkill("nstuiyan_bugua"); - player - .chooseToDiscard("he", "推演:是否发动一次【卜卦】?") - .set("ai", function (card) { - return 8 - get.value(card); - }) - .set("logSkill", "nstuiyan"); - "step 1"; - if (result.bool) { - event.insert(lib.skill.nsbugua.subSkill.use.content, { player: player }); - } - }, - }, - use: { - trigger: { player: "useCard" }, - silent: true, - priority: -1, - filter(event, player) { - return ( - _status.currentPhase == player && - event.getParent("phaseUse", true) && - typeof event.card.number == "number" - ); - }, - content() { - if (typeof player.storage.nstuiyan2 != "number") { - player.storage.nstuiyan2 = 0; - } - if ( - !player.hasSkill("nstuiyan_fail") && - (trigger.card.number <= player.storage.nstuiyan || - typeof trigger.card.number != "number") - ) { - player.storage.nstuiyan_done = true; - player.addTempSkill("nstuiyan_fail"); - } - player.storage.nstuiyan = trigger.card.number; - player.storage.nstuiyan2 += trigger.card.number; - if (player.storage.nstuiyan2 % 8 == 0 && !player.storage.nstuiyan2_done) { - player.storage.nstuiyan2_done = true; - player.addTempSkill("nstuiyan_bugua"); - } - player.markSkill("nstuiyan"); - }, - }, - clear: { - trigger: { player: ["phaseUseAfter", "phaseAfter"] }, - silent: true, - content() { - delete player.storage.nstuiyan; - delete player.storage.nstuiyan_done; - delete player.storage.nstuiyan2; - delete player.storage.nstuiyan2_done; - player.unmarkSkill("nstuiyan"); - }, - }, - fail: {}, - }, - ai: { - threaten: 1.4, - }, - }, - nsshijun: { - trigger: { source: "damageBegin" }, - forced: true, - content() { - trigger.num++; - trigger.nsshijun = true; - }, - subSkill: { - hp: { - trigger: { source: "damageAfter" }, - silent: true, - filter(event) { - return event.nsshijun; - }, - content() { - player.loseHp(); - }, - }, - }, - group: "nsshijun_hp", - ai: { - halfneg: true - }, - }, - nszhaoxin: { - mark: true, - intro: { - mark(dialog, content, player) { - var hs = player.getCards("h"); - if (hs.length) { - dialog.addSmall(hs); - } else { - dialog.addText("无手牌"); - } - }, - content(content, player) { - var hs = player.getCards("h"); - if (hs.length) { - return get.translation(hs); - } else { - return "无手牌"; - } - }, - }, - ai: { - neg: true - }, - }, - nsxiuxin: { - mod: { - targetEnabled(card, player, target) { - var suit = get.suit(card); - if (suit && !target.countCards("h", { suit: suit })) { - return false; - } - }, - }, - }, - nscangxi: { - unique: true, - global: "nscangxi2", - zhuSkill: true, - init(player) { - player.storage.nscangxi = 0; - }, - intro: { - content: "手牌上限+#", - }, - mod: { - maxHandcard(player, num) { - return num + player.storage.nscangxi; - }, - }, - }, - nscangxi2: { - trigger: { player: "phaseDiscardEnd" }, - filter(event, player) { - if (!event.cards || event.cards.length <= 1) return false; - if (player.group != "wu") return false; - return game.hasPlayer(function (target) { - return player != target && target.hasZhuSkill("nscangxi", player); - }); - }, - direct: true, - content() { - "step 0"; - var list = game.filterPlayer(function (current) { - return current != player && current.hasZhuSkill("nscangxi", player); - }); - list.sortBySeat(); - event.list = list; - "step 1"; - if (event.list.length) { - var current = event.list.shift(); - event.current = current; - player - .chooseBool(get.prompt("nscangxi", current)) - .set("choice", get.attitude(player, current) > 0); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.logSkill("nscangxi", event.current); - player - .judge(function (card) { - return _status.event.att * (get.color(card) == "black" ? 1 : 0); - }) - .set("att", get.sgnAttitude(player, event.current)); - } else { - event.goto(1); - } - "step 3"; - if (result.color == "black") { - var name = get.translation(event.current.name); - var att = 0; - if (event.current.needsToDiscard()) { - att = 1; - } - player - .chooseControlList( - [ - "令" + name + "摸一张牌展示", - "令" + name + "手牌上永久+1", - "弃置一张牌并令" + name + "获得一张本回合进入弃牌堆的牌", - ], - function () { - return _status.event.att; - } - ) - .set("att", att); - } else { - event.goto(1); - } - "step 4"; - switch (result.index) { - case 0: - event.current.draw("visible"); - break; - case 1: { - if (typeof event.current.storage.nscangxi != "number") { - event.current.storage.nscangxi = 0; - } - event.current.storage.nscangxi++; - event.current.syncStorage("nscangxi"); - event.current.markSkill("nscangxi"); - break; - } - case 2: { - player.chooseToDiscard(true, "he"); - break; - } - } - if (result.index != 2) { - event.goto(1); - } - "step 5"; - if (result.bool) { - var discarded = get.discarded(); - if (discarded.length) { - event.current - .chooseCardButton("选择一张获得之", discarded, true) - .set("ai", function (button) { - return get.value(button.link); - }); - } else { - event.goto(1); - } - } else { - event.goto(1); - } - "step 6"; - if (result.bool && result.links && result.links.length) { - event.current.gain(result.links, "gain2"); - } - event.goto(1); - }, - }, - nswulie: { - trigger: { player: "phaseBegin" }, - skillAnimation: true, - animationColor: "metal", - unique: true, - check() { - return false; - }, - filter(event, player) { - return ui.discardPile.childElementCount > 0; - }, - content() { - "step 0"; - player.awakenSkill("nswulie"); - player.loseMaxHp(); - "step 1"; - player.chooseCardButton( - Array.from(ui.discardPile.childNodes), - "将至多3张任意顺置于牌堆顶(先选择的在上)", - true, - [1, 3] - ); - "step 2"; - if (result.bool) { - var cards = result.links.slice(0); - while (cards.length) { - ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); - } - player.addTempSkill("nswulie_end"); - } - }, - subSkill: { - end: { - trigger: { player: "phaseEnd" }, - check() { - return false; - }, - filter(event, player) { - return ui.discardPile.childElementCount > 0; - }, - content() { - "step 0"; - player.loseMaxHp(); - "step 1"; - player.chooseCardButton( - Array.from(ui.discardPile.childNodes), - "将至多3张任意顺置于牌堆顶(先选择的在上)", - true, - [1, 3] - ); - "step 2"; - if (result.bool) { - var cards = result.links.slice(0); - while (cards.length) { - ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); - } - } - }, - }, - }, - }, - nshunyou: { - enable: "phaseUse", - usable: 1, - filterCard: { type: "basic" }, - filter(event, player) { - return player.countCards("h", { type: "basic" }); - }, - content() { - "step 0"; - var equip = null, - trick = null; - for (var i = 0; i < ui.discardPile.childElementCount; i++) { - var type = get.type(ui.discardPile.childNodes[i], "trick"); - if (type == "trick") { - trick = ui.discardPile.childNodes[i]; - } else if (type == "equip") { - equip = ui.discardPile.childNodes[i]; - } - if (trick && equip) { - break; - } - } - var list = []; - if (trick) list.push(trick); - if (equip) list.push(equip); - if (!list.length) { - player.draw(Math.min(3, 1 + player.maxHp - player.hp)); - } else { - player.gain(list, "gain2"); - event.equip = equip; - } - "step 1"; - if (event.equip && get.owner(event.equip) == player) { - player - .chooseTarget( - "是否将" + get.translation(event.equip) + "装备给一其角色?", - function (card, player, target) { - return target != player; - } - ) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 1) { - if (!target.getEquip(_status.event.subtype)) return att; - } - return 0; - }) - .set("subtype", get.subtype(event.equip)); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.line(result.targets, "green"); - player.$give(event.equip, result.targets[0]); - player.lose(event.equip, ui.special); - } else { - event.finish(); - } - "step 3"; - game.delay(0.5); - "step 4"; - result.targets[0].equip(event.equip); - "step 5"; - game.delay(); - }, - check(card) { - return 7 - get.value(card); - }, - ai: { - order: 7, - result: { - player: 1, - }, - }, - }, - nsgongjian: { - trigger: { player: "phaseDiscardEnd" }, - forced: true, - filter(event, player) { - if (event.cards && event.cards.length > 0) { - return game.hasPlayer(function (current) { - return current.hp > player.hp; - }); - } - return false; - }, - content() { - "step 0"; - player - .chooseTarget( - "恭俭:将置的牌交给一名体力值大于你的角色", - function (card, player, target) { - return target.hp > player.hp; - } - ) - .set("ai", function (target) { - return ( - get.attitude(_status.event.player, target) / - Math.sqrt(target.countCards("h") + 1) - ); - }); - "step 1"; - if (result.bool) { - player.line(result.targets, "green"); - result.targets[0].gain(trigger.cards, "gain2"); - } - }, - }, - nscaijian: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - var nh = player.countCards("h"); - return nh && nh <= player.maxHp; - }, - content() { - "step 0"; - player.showHandcards(); - event.num = player.countCards("h"); - "step 1"; - player.directgain(get.cards(event.num)); - player - .chooseCard( - "将" + get.cnNumber(event.num) + "张手牌以按顺序置于牌堆顶(先选择的在上)", - event.num, - true - ) - .set("ai", function (card) { - return -get.value(card); - }); - "step 2"; - if (result.bool) { - player.lose(result.cards, ui.special)._triggered = null; - event.cards = result.cards.slice(0); - } else { - event.finish(); - } - "step 3"; - if (player == game.me && _status.auto) { - game.delay(); - } - "step 4"; - while (event.cards.length) { - var current = event.cards.pop(); - current.fix(); - ui.cardPile.insertBefore(current, ui.cardPile.firstChild); - } - }, - ai: { - order: 10, - result: { - player: 1, - }, - }, - }, - nsdongcha: { - trigger: { player: "damageBefore" }, - forced: true, - priority: 15, - filter(event, player) { - if (get.type(event.card, "trick") == "trick") { - if (event.getParent(2).name == "useCard") { - return event.getParent(2).targets.length == 1; - } - return true; - } - return false; - }, - content() { - trigger.cancel(); - }, - ai: { - notrick: true, - effect: { - target(card, player, target, current) { - if ( - get.type(card) == "trick" && - get.tag(card, "damage") && - !get.tag(card, "multitarget") - ) { - return "zeroplayertarget"; - } - }, - }, - }, - group: "nsdongcha_cancel", - subSkill: { - cancel: { - trigger: { target: "useCardToAfter" }, - silent: true, - filter(event, player) { - return ( - get.type(event.card, "trick") == "trick" && - _status.currentPhase == event.player && - event.player != player - ); - }, - content() { - player.addTempSkill("nsdongcha_disable"); - }, - }, - disable: { - trigger: { target: "useCardToBefore" }, - forced: true, - priority: 15, - onremove: true, - filter(event, player) { - return ( - event.player == _status.currentPhase && - get.type(event.card, "trick") == "trick" - ); - }, - content() { - trigger.cancel(); - }, - ai: { - effect: { - target(card, player, target, current) { - if (get.type(card, "trick") == "trick" && _status.currentPhase == player) - return "zeroplayertarget"; - }, - }, - }, - }, - }, - }, - nsjianxiong: { - trigger: { target: "useCardToBefore" }, - direct: true, - content() { - "step 0"; - player.chooseToUse( - function (card) { - return !get.info(card).multitarget; - }, - get.prompt("nsjianxiong", trigger.player), - trigger.player, - -1 - ); - "step 1"; - if (event.damaged) { - trigger.cancel(); - if (get.color(trigger.card) == "black") { - player.draw(); - } - } - }, - subSkill: { - damage: { - trigger: { source: "damageAfter" }, - silent: true, - filter(event, player) { - return event.getParent(4).name == "nsjianxiong"; - }, - content() { - trigger.getParent(4).damaged = true; - }, - }, - }, - group: "nsjianxiong_damage", - ai: { - effect: { - player(card, player, target) { - if (_status.currentPhase != player) return; - if (get.tag(card, "damage") && !player.needsToDiscard(1) && target.hp > 1) { - return "zeroplayertarget"; - } - }, - }, - }, - }, - nsxionglue: { - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("h", { color: "black" }); - }, - check(card) { - return 7 - get.value(card); - }, - filterCard: { color: "black" }, - content() { - "step 0"; - var list = get.inpile("trick"); - list = list.randomGets(3); - for (var i = 0; i < list.length; i++) { - list[i] = ["锦囊", "", list[i]]; - } - var dialog = ui.create.dialog("选择一张锦囊牌加入你的手牌", [list, "vcard"], "hidden"); - player.chooseButton(dialog, true).set("ai", function (button) { - var card = { name: button.link[2] }; - var value = get.value(card); - return value; - }); - "step 1"; - if (result.bool) { - player.gain(game.createCard(result.buttons[0].link[2]), "draw"); - } - }, - ai: { - order: 9, - result: { - player: 1, - }, - }, - }, - nshuanhuo: { - trigger: { player: ["loseHpAfter", "damageAfter"] }, - filter(event, player) { - if ( - game.countPlayer(function (current) { - return current != player && !current.isUnseen(2); - }) < 2 - ) - return false; - if (event.name == "damage") return event.num > 1; - return true; - }, - direct: true, - skillAnimation: true, - animationColor: "thunder", - content() { - "step 0"; - player - .chooseTarget(2, get.prompt2("nshuanhuo"), function (card, player, target) { - return target != player && !target.isUnseen(2); - }) - .set("ai", function (target) { - var att = get.attitude(player, target); - if (ui.selected.targets.length) { - if (att < 0) { - return get.rank(target, true) - get.rank(ui.selected.targets[0], true); - } - } else { - if (att >= 0) { - return 1 / (1 + get.rank(target, true)); - } - } - return 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("nshuanhuo", result.targets); - } else { - event.finish(); - } - "step 2"; - var name1 = result.targets[0].name; - var name2 = result.targets[1].name; - result.targets[0].reinit(name1, name2, false); - result.targets[1].reinit(name2, name1, false); - }, - }, - nsyaowang: { - trigger: { player: "phaseBegin" }, - direct: true, - createDialog(player, target, onlylist) { - var names = []; - var list = []; - if (target.name1 && !target.isUnseen(0)) names.add(target.name1); - if (target.name2 && !target.isUnseen(1)) names.add(target.name2); - var pss = player.getSkills(); - for (var i = 0; i < names.length; i++) { - var info = lib.character[names[i]]; - if (info) { - var skills = info[3]; - for (var j = 0; j < skills.length; j++) { - if ( - lib.translate[skills[j] + "_info"] && - lib.skill[skills[j]] && - !lib.skill[skills[j]].unique && - !pss.includes(skills[j]) - ) { - list.add(skills[j]); - } - } - } - } - if (onlylist) return list; - var dialog = ui.create.dialog("forcebutton"); - dialog.add("选择获得一项技能"); - _status.event.list = list; - var clickItem = function () { - _status.event._result = this.link; - game.resume(); - }; - for (i = 0; i < list.length; i++) { - if (lib.translate[list[i] + "_info"]) { - var translation = get.translation(list[i]); - if (translation[0] == "新" && translation.length == 3) { - translation = translation.slice(1, 3); - } else { - translation = translation.slice(0, 2); - } - var item = dialog.add( - '" - ); - item.firstChild.addEventListener("click", clickItem); - item.firstChild.link = list[i]; - } - } - dialog.add(ui.create.div(".placeholder")); - return dialog; - }, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("nsyaowang"), function (card, player, target) { - var names = []; - if (target.name1 && !target.isUnseen(0)) names.add(target.name1); - if (target.name2 && !target.isUnseen(1)) names.add(target.name2); - var pss = player.getSkills(); - for (var i = 0; i < names.length; i++) { - var info = lib.character[names[i]]; - if (info) { - var skills = info[3]; - for (var j = 0; j < skills.length; j++) { - if ( - lib.translate[skills[j] + "_info"] && - lib.skill[skills[j]] && - !lib.skill[skills[j]].unique && - !pss.includes(skills[j]) - ) { - return true; - } - } - } - return false; - } - }) - .set("ai", function (target) { - if (get.attitude(_status.event.player, target) > 0) return Math.random(); - return 0; - }); - "step 1"; - if (result.bool) { - event.target = result.targets[0]; - player.logSkill("nsyaowang", event.target); - } else { - event.finish(); - } - "step 2"; - event.skillai = function (list) { - return get.max(list, get.skillRank, "item"); - }; - if (event.isMine()) { - event.dialog = lib.skill.nsyaowang.createDialog(player, target); - event.switchToAuto = function () { - event._result = event.skillai(event.list); - game.resume(); - }; - _status.imchoosing = true; - game.pause(); - } else { - event._result = event.skillai(lib.skill.nsyaowang.createDialog(player, target, true)); - } - "step 3"; - _status.imchoosing = false; - if (event.dialog) { - event.dialog.close(); - } - player.addTempSkill(result); - player.popup(result); - game.log(player, "获得了", "【" + get.translation(result) + "】"); - var names = []; - for (var i = 0; i < game.players.length; i++) { - names.add(game.players[i].name); - names.add(game.players[i].name1); - names.add(game.players[i].name2); - } - for (var i = 0; i < game.dead.length; i++) { - names.add(game.dead[i].name); - names.add(game.dead[i].name1); - names.add(game.dead[i].name2); - } - var list = get.gainableSkills(function (info, skill, name) { - if (names.includes(name)) return false; - return true; - }); - var skill = list.randomGet(); - target.popup(skill); - target.addTempSkill(skill, { player: "phaseAfter" }); - game.log(target, "获得了", "【" + get.translation(skill) + "】"); - }, - }, - nsjianshu: { - trigger: { player: "shaBegin" }, - forced: true, - filter(event, player) { - return !event.directHit && player.getEquip(1); - }, - priority: -1, - content() { - if (typeof trigger.shanRequired == "number") { - trigger.shanRequired++; - } else { - trigger.shanRequired = 2; - } - }, - }, - nscangjian: { - trigger: { source: "damageEnd" }, - direct: true, - filter(event) { - return event.player.isIn() && event.player.countCards("e"); - }, - content() { - player.gainPlayerCard( - trigger.player, - "e", - get.prompt("nscangjian", trigger.player) - ).logSkill = ["nscangjian", trigger.player]; - }, - }, - nsyunxing: { - trigger: { global: "dieAfter" }, - forced: true, - check(event, player) { - return event.player.group == "wei" || (event.player.group == "wu" && player.hp == 1); - }, - filter(event, player) { - return ["wei", "shu", "wu", "qun"].includes(event.player.group); - }, - content() { - "step 0"; - switch (trigger.player.group) { - case "wei": - player.draw(); - break; - case "shu": - player.loseHp(); - break; - case "wu": - player.recover(); - break; - case "qun": { - var evt = _status.event.getParent("phaseUse"); - if (evt && evt.name == "phaseUse") { - evt.skipped = true; - } - var evt = _status.event.getParent("phase"); - if (evt && evt.name == "phase") { - evt.finish(); - } - break; - } - } - if ( - trigger.player.group != "wei" || - !game.hasPlayer(function (current) { - return current.countCards("h"); - }) - ) { - event.finish(); - } - "step 1"; - player - .chooseTarget("弃置一名角色的一张手牌", true, function (card, player, target) { - return target.countCards("h"); - }) - .set("ai", function (target) { - if (target.hasSkillTag("noh")) return 0; - return -get.attitude(_status.event.player, target); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.discardPlayerCard(target, true, "h"); - player.line(target, "green"); - } - }, - group: "nsyunxing_self", - subSkill: { - self: { - trigger: { player: "dieBegin" }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt("nsyunxing"), function (card, player, target) { - return target != player; - }) - .set("prompt2", "令一名其他角色翻面") - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.isTurnedOver()) { - if (att > 2) { - return att * 2; - } else { - return att; - } - } else { - return -att; - } - }); - "step 1"; - if (result.bool) { - player.logSkill("nsyunxing", result.targets); - result.targets[0].turnOver(); - } - }, - }, - }, - }, - nsguanxing: { - trigger: { player: "phaseBegin" }, - forced: true, - filter(event, player) { - return player.hp > 0; - }, - content() { - "step 0"; - event.cards = get.cards(game.countPlayer()); - event.chosen = []; - event.num = player.hp; - "step 1"; - var js = player.getCards("j"); - var pos; - var choice = -1; - var getval = function (card, pos) { - if (js[pos]) { - return get.judge(js[pos])(card); - } else { - return get.value(card); - } - }; - for (pos = 0; pos < Math.min(event.cards.length, js.length + 2); pos++) { - var max = getval(event.cards[pos], pos); - for (var j = pos + 1; j < event.cards.length; j++) { - var current = getval(event.cards[j], pos); - if (current > max) { - choice = j; - max = current; - } - } - if (choice != -1) { - break; - } - } - player - .chooseCardButton("观星:选择要移动的牌(还能移动" + event.num + "张)", event.cards) - .set("filterButton", function (button) { - return !_status.event.chosen.includes(button.link); - }) - .set("chosen", event.chosen) - .set("ai", function (button) { - return button.link == _status.event.choice ? 1 : 0; - }) - .set("choice", event.cards[choice]); - event.pos = pos; - "step 2"; - if (result.bool) { - var card = result.links[0]; - var index = event.cards.indexOf(card); - event.card = card; - event.chosen.push(card); - event.cards.remove(event.card); - var buttons = event.cards.slice(0); - player - .chooseControl(function () { - return _status.event.controlai; - }) - .set("controlai", event.pos || 0) - .set("sortcard", buttons) - .set("tosort", card); - } else { - event.goto(4); - } - "step 3"; - if (typeof result.index == "number") { - if (result.index > event.cards.length) { - ui.cardPile.appendChild(event.card); - } else { - event.cards.splice(result.index, 0, event.card); - } - event.num--; - if (event.num > 0) { - event.goto(1); - } - } - "step 4"; - while (event.cards.length) { - ui.cardPile.insertBefore(event.cards.pop(), ui.cardPile.firstChild); - } - var js = player.getCards("j"); - if (js.length == 1) { - if (get.judge(js[0])(ui.cardPile.firstChild) < 0) { - player.addTempSkill("guanxing_fail"); - } - } - }, - ai: { - guanxing: true, - }, - }, - nshaoling: { - skillAnimation: true, - animationColor: "water", - unique: true, - limited: true, - enable: "phaseUse", - filterTarget(card, player, target) { - return target != player; - }, - content() { - "step 0"; - player.awakenSkill("nshaoling"); - event.targets = game.filterPlayer(); - event.targets.remove(player); - event.targets.remove(target); - event.targets.sortBySeat(); - "step 1"; - if (event.targets.length) { - event.current = event.targets.shift(); - if (event.current.countCards("he") && target.isAlive()) { - event.current - .chooseToUse({ name: "sha" }, target, -1, "号令") - .set( - "prompt2", - "选择一项:1. 对" + - get.translation(event.current) + - "使用一张杀;2. 取消并交给" + - get.translation(player) + - "一张牌,然后视" + - get.translation(player) + - "为对你使用一张杀" - ); - } - } else { - event.finish(); - } - "step 2"; - if (result.bool == false) { - if (event.current.countCards("he")) { - event.current.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); - } else { - event.goto(4); - } - } else { - event.goto(1); - } - "step 3"; - if (result.bool) { - event.current.give(result.cards, player); - } - "step 4"; - player.useCard({ name: "sha" }, event.current, false); - event.goto(1); - }, - ai: { - order: 5, - result: { - target(player, target) { - var players = game.filterPlayer(); - if (player.hp > 1) { - if (game.phaseNumber < game.players.length) return 0; - if (player.hasUnknown()) return 0; - } - var effect = 0; - for (var i = 0; i < players.length; i++) { - if ( - players[i] != target && - players[i] != player && - players[i].countCards("he") - ) - effect += get.effect(target, { name: "sha" }, players[i], target); - } - return effect; - }, - }, - }, - }, - nsgefa: { - enable: "chooseToUse", - filter(event, player) { - return player.hp <= 0; - }, - filterCard: { suit: "club" }, - position: "hse", - viewAs: { name: "tao" }, - prompt: "将一张梅花牌当桃使用", - check(card) { - return 15 - get.value(card); - }, - ai: { - skillTagFilter(player) { - return player.countCards("hes", { suit: "club" }) > 0; - }, - threaten: 1.5, - save: true, - respondTao: true, - }, - }, - nscaiyi: { - trigger: { global: "drawAfter" }, - check(event, player) { - if (get.attitude(player, event.player) >= 0) return false; - if (get.effect(event.player, { name: "sha" }, player, player) <= 0) return false; - if (get.effect(player, { name: "sha" }, event.player, player) >= 0) return true; - return player.hasShan() && player.hp >= event.player.hp; - }, - filter(event, player) { - return player != event.player && Array.isArray(event.result) && event.result.length > 0; - }, - logTarget: "player", - content() { - "step 0"; - player.viewCards(get.translation(trigger.player) + "摸到的牌", trigger.result); - if (!event.isMine()) { - game.delayx(); - } - "step 1"; - var list = []; - for (var i = 0; i < trigger.result.length; i++) { - if (trigger.result[i].name == "sha") { - list.push(trigger.result[i]); - } - } - if (list.length) { - player.useCard({ name: "sha" }, trigger.player); - } else { - trigger.player.useCard({ name: "sha" }, player); - } - }, - }, - nspinmin: { - trigger: { player: "dieBefore" }, - forced: true, - filter(event, player) { - return player.maxHp > 0; - }, - content() { - trigger.cancel(); - player.hp = 1; - player.update(); - if (_status.currentPhase == player) { - var num = 4; - // if(game.countPlayer()>=7){ - // num=5; - // } - if (!player.hasSkill("nspinmin_used") && player.maxHp < num) { - player.gainMaxHp(true); - player.addTempSkill("nspinmin_used"); - } - } else { - player.loseMaxHp(true); - } - }, - subSkill: { - used: {}, - }, - }, - nsshishou: { - trigger: { player: "loseEnd" }, - forced: true, - filter(event, player) { - if (_status.currentPhase != player) return false; - for (var i = 0; i < event.cards.length; i++) { - if (event.cards[i].original == "h") return true; - } - return false; - }, - content() { - "step 0"; - player.loseHp(); - "step 1"; - player.draw(); - }, - group: "nsshishou_use", - subSkill: { - use: { - mod: { - cardEnabled(card, player) { - if (_status.currentPhase != player) return; - if (get.cardCount(true, player) >= 4) { - return false; - } - }, - }, - }, - }, - ai: { - halfneg: true, - effect: { - target(card, player, target) { - if (get.tag(card, "save")) { - if (_status.currentPhase == player) return 0; - if (target.maxHp > 1 && player != target) return 0; - } - if (get.tag(card, "recover")) { - if (_status.currentPhase == player) return 0; - } - }, - }, - }, - }, - nsduijue: { - trigger: { player: "phaseUseBegin" }, - direct: true, - filter(event, player) { - return player.countCards("h"); - }, - content() { - "step 0"; - var color = { - black: player.countCards("h", function (card) { - return get.color(card) == "red" && get.value(card) < 8; - }), - red: player.countCards("h", function (card) { - return get.color(card) == "black" && get.value(card) < 8; - }), - }; - player - .chooseToDiscard(get.prompt2("nsduijue")) - .set("ai", function (card) { - var num = _status.event.color[get.color(card)]; - if (_status.event.goon && num >= 1) { - return 7 + num - get.value(card); - } - }) - .set( - "goon", - game.hasPlayer(function (current) { - return get.effect(current, { name: "juedou" }, player, player) > 0; - }) - ) - .set("color", color) - .set("logSkill", "nsduijue"); - "step 1"; - if (result.bool) { - player.addTempSkill("nsduijue_use"); - player.storage.nsduijue_use = get.color(result.cards[0]); - } - }, - subSkill: { - use: { - enable: "phaseUse", - viewAs: { name: "juedou" }, - usable: 2, - filter(event, player) { - return player.hasCard(function (card) { - return get.color(card) != player.storage.nsduijue_use; - }, "hs"); - }, - position: "hs", - filterCard(card, player) { - return get.color(card) != player.storage.nsduijue_use; - }, - check(card) { - return 8 - get.value(card); - }, - ai: { - basic: { - order: 10, - }, - }, - }, - }, - }, - nsshuangxiong: { - trigger: { player: "juedouBegin", target: "juedouBegin" }, - check(event, player) { - return player.isTurnedOver(); - }, - content() { - player.turnOver(); - }, - }, - nsguanyong: { - enable: "chooseToRespond", - filterCard: true, - viewAs: { name: "sha" }, - viewAsFilter(player) { - if (!player.countCards("hs")) return false; - }, - position: "hs", - prompt: "将一张手牌当杀打出", - check(card) { - return 7 - get.value(card); - }, - ai: { - respondSha: true, - skillTagFilter(player, tag, arg) { - if (arg != "respond") return false; - if (!player.countCards("hs")) return false; - }, - }, - }, - nsjihui: { - trigger: { global: "discardAfter" }, - filter(event, player) { - return event.cards.length >= 3; - }, - content() { - player.insertPhase(); - player.storage.nsjihui_use = _status.currentPhase; - player.addSkill("nsjihui_use"); - }, - subSkill: { - use: { - mark: "character", - intro: { - content: "使用牌只能指定自己与$为目标", - }, - trigger: { player: "phaseAfter" }, - forced: true, - popup: false, - filter(event, player) { - return event.skill == "nsjihui"; - }, - onremove: true, - content() { - player.removeSkill("nsjihui_use"); - }, - mod: { - playerEnabled(card, player, target) { - if (player != target && player.storage.nsjihui_use != target) return false; - }, - }, - }, - }, - }, - nsmouyun: { - enable: "phaseUse", - round: 2, - filterTarget(card, player, target) { - return target.isMinHp() && target != player && target.isDamaged(); - }, - content() { - if (target.isDamaged()) { - player.discardPlayerCard(target, "hej", target.maxHp - target.hp, true); - } - }, - ai: { - order: 10, - result: { - target(player, target) { - return target.hp - target.maxHp; - }, - }, - }, - }, - nscongjun: { - forbid: ["guozhan"], - unique: true, - forceunique: true, - init(player) { - if (player.storage.nscongjun_show) return false; - var change = function (target) { - if (target == player) { - var list; - if (_status.connectMode) { - list = get.charactersOL(function (i) { - return lib.character[i][0] != "male"; - }); - } else { - list = get.gainableCharacters(function (info) { - return info[0] == "male"; - }); - } - var name = list.randomGet(); - target.reinit("ns_huamulan", name, "nosmooth"); - target.storage.nscongjun_show = name; - target.addSkill("nscongjun_show"); - player._inits.remove(change); - player.hp = player.maxHp; - player.update(); - } - }; - if (!player._inits) { - player._inits = []; - } - player._inits.push(change); - }, - subSkill: { - show: { - trigger: { global: "useCard" }, - filter(event, player) { - return ( - player.getEnemies().includes(event.player) && - event.card.name == "wuxie" && - event.getRand() < 0.1 - ); - }, - direct: true, - skillAnimation: true, - animationColor: "thunder", - content() { - "step 0"; - game.delay(0.5); - "step 1"; - player.reinit(player.storage.nscongjun_show, "ns_huamulan", "nosmooth"); - player.logSkill("nscongjun_show"); - "step 2"; - player.removeSkill("nscongjun_show"); - player.line(trigger.player, "green"); - trigger.player.damage(2); - }, - }, - }, - }, - nstaiping_nh: { - trigger: { player: "damageEnd" }, - filter(event, player) { - return !event.nshuanxian && player.getSubPlayers("nshuanxian").length; - }, - direct: true, - priority: -0.1, - ai: { - maixie: true, - maixie_hp: true, - }, - content() { - "step 0"; - event.num = trigger.num; - "step 1"; - var left = player.storage.nshuanxian_left; - var right = player.storage.nshuanxian_right; - var list = []; - var choice = 0; - var hpleft = 0; - var maxleft = 0; - if (left && player.hasSkill(left)) { - if (player.storage[left].hp < player.storage[left].maxHp) { - list.push("令幻身·左回复1点体力"); - hpleft = player.storage[left].hp; - } - list.push("令幻身·左增加1点体力上限"); - maxleft = player.storage[left].hp; - } - if (left && player.hasSkill(right)) { - if (player.storage[right].hp < player.storage[right].maxHp) { - list.push("令幻身·右回复1点体力"); - if ( - !hpleft || - player.storage[right].hp < hpleft || - (player.storage[right].hp == hpleft && Math.random() < 0.5) - ) { - choice = list.length - 1; - } - } - list.push("令幻身·右增加1点体力上限"); - if (!hpleft && maxleft && choice == 0) { - if ( - player.storage[right].maxHp < maxleft || - (player.storage[right].maxHp == maxleft && Math.random() < 0.5) - ) { - choice = list.length - 1; - } - } - } - if (!list.length) { - event.finish(); - return; - } - event.map = {}; - for (var i = 0; i < list.length; i++) { - event.map["选项" + get.cnNumber(i + 1, true)] = list[i]; - } - player - .chooseControlList(list, function () { - return _status.event.choice; - }) - .set("prompt", get.prompt("nstaiping_nh")) - .set("choice", choice); - "step 2"; - var left = player.storage.nshuanxian_left; - var right = player.storage.nshuanxian_right; - if (result.control != "cancel2") { - player.logSkill("nstaiping_nh"); - switch (event.map[result.control]) { - case "令幻身·左回复1点体力": - player.storage[left].hp++; - break; - case "令幻身·左增加1点体力上限": - player.storage[left].maxHp++; - break; - case "令幻身·右回复1点体力": - player.storage[right].hp++; - break; - case "令幻身·右增加1点体力上限": - player.storage[right].maxHp++; - break; - } - game.log(player, event.map[result.control].replace(/一/, "了一")); - } - "step 3"; - if (event.num > 1) { - event.num--; - event.goto(1); - } - }, - ai: { - combo: "nshuanxian" - }, - }, - nsshoudao: { - group: ["nsshoudao_gain", "nsshoudao_die"], - subSkill: { - gain: { - trigger: { player: "subPlayerDie" }, - forced: true, - filter(event, player) { - var left = player.storage.nshuanxian_left; - if (left && player.hasSkill(left)) return false; - var right = player.storage.nshuanxian_right; - if (right && player.hasSkill(right)) return false; - if (!player.storage.nshuanxian_damage) return false; - return true; - }, - content() { - player.addSkill("releiji"); - player.addSkill("guidao"); - }, - }, - die: { - trigger: { player: "dieBegin" }, - direct: true, - filter(event, player) { - if (game.countPlayer() <= 2) return false; - var left = player.storage.nshuanxian_left; - if (left && player.hasSkill(left)) return true; - var right = player.storage.nshuanxian_right; - if (right && player.hasSkill(right)) return true; - return false; - }, - content() { - "step 0"; - var str; - var left = player.storage.nshuanxian_left; - var right = player.storage.nshuanxian_right; - if (left && player.hasSkill(left) && right && player.hasSkill(right)) { - str = "令一名其他角色获得技能【雷击】和【鬼道】"; - } else { - str = "令一名其他角色获得技能【雷击】或【鬼道】"; - } - if (trigger.source) { - str += "(" + get.translation(trigger.source) + "除外)"; - } - player - .chooseTarget(function (card, player, target) { - return target != player && target != _status.event.source; - }, get.prompt("nsshoudao")) - .set("ai", function (target) { - if (target.hasSkill("releiji")) return 0; - return get.attitude(_status.event.player, target); - }) - .set("source", trigger.source) - .set("prompt2", str); - "step 1"; - var goon = false; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("nsshoudao", target); - var left = player.storage.nshuanxian_left; - var right = player.storage.nshuanxian_right; - if (left && player.hasSkill(left) && right && player.hasSkill(right)) { - target.addSkillLog("releiji"); - target.addSkillLog("guidao"); - } else { - event.target = target; - player - .chooseControl("releiji", "guidao") - .set("prompt", "令" + get.translation(target) + "获得一项技能"); - goon = true; - } - } - if (!goon) { - event.finish(); - } - "step 2"; - event.target.addSkillLog(result.control); - }, - }, - }, - ai: { - combo: "nshuanxian" - }, - }, - nshuanxian: { - trigger: { global: "gameStart", player: "enterGame" }, - forced: true, - nosub: true, - unique: true, - group: [ - "nshuanxian_left", - "nshuanxian_right", - "nshuanxian_damage", - "nshuanxian_swap", - "nshuanxian_draw", - ], - content() { - player.storage.nshuanxian_right = player.addSubPlayer({ - name: "ns_nanhua_right", - skills: ["nshuanxian_left", "nshuanxian_draw", "nshuanxian_swap"], - hp: 2, - maxHp: 2, - hs: get.cards(2), - skill: "nshuanxian", - intro: "你的本体回合结束后,切换至此随从并进行一个额外的回合;若你的上家与下家不同,在你的下家的准备阶段,切换至此随从", - intro2: "当前回合结束后切换回本体", - onremove(player) { - delete player.storage.nshuanxian_right; - }, - }); - }, - ai: { - effect: { - target(card, player, target) { - if (get.tag(card, "damage")) { - if (!target.hasFriend()) return; - if (target.hp <= 2) return; - if (!target.storage.nshuanxian_damage) { - if (get.attitude(player, target) < 0 || get.tag(card, "multineg")) - return [0, 1]; - return [1, 1]; - } - } - }, - }, - }, - // mod:{ - // globalFrom(from,to,distance){ - // - // }, - // globalTo(from,to,distance){ - // - // } - // }, - // global:'nshuanxian_choose', - subSkill: { - chosen: {}, - leftdist: { - mod: { - globalFrom(from, to, distance) {}, - globalTo(from, to, distance) {}, - }, - }, - rightdist: { - mod: { - globalFrom(from, to, distance) {}, - globalTo(from, to, distance) {}, - }, - }, - swap: { - trigger: { global: "phaseBegin" }, - forced: true, - popup: false, - filter(event, player) { - return event.player != player; - }, - priority: 20, - content() { - var next = player.getNext(); - var prev = player.getPrevious(); - var left = player.storage.nshuanxian_left; - var right = player.storage.nshuanxian_right; - if (prev == next || (trigger.player != next && trigger.player != prev)) { - if (player.hasSkill("subplayer")) { - player.exitSubPlayer(); - } - } else if (prev == trigger.player && player.name != left && left) { - if (!player.hasSkill("subplayer")) { - player.callSubPlayer(left); - } else { - player.toggleSubPlayer(left); - } - } else if (next == trigger.player && player.name != right && right) { - if (!player.hasSkill("subplayer")) { - player.callSubPlayer(right); - } else { - player.toggleSubPlayer(right); - } - } - }, - }, - damage: { - trigger: { player: "damageEnd" }, - forced: true, - filter(event, player) { - return !player.storage.nshuanxian_damage; - }, - content() { - player.storage.nshuanxian_damage = true; - player.storage.nshuanxian_left = player.addSubPlayer({ - name: "ns_nanhua_left", - skills: ["nshuanxian_middle", "nshuanxian_draw", "nshuanxian_swap"], - hp: 2, - maxHp: 2, - hs: get.cards(2), - skill: "nshuanxian", - intro: "你的本体回合开始前,切换至此随从并进行一个额外的回合;若你的上家与下家不同,在你的上家的准备阶段,切换至此随从", - intro2: "当前回合结束后切换回本体", - onremove(player) { - delete player.storage.nshuanxian_left; - }, - }); - trigger.nshuanxian = true; - }, - }, - draw: { - trigger: { player: "phaseDrawBegin" }, - silent: true, - filter(event) { - return event.num > 0; - }, - content() { - trigger.num--; - }, - }, - left: { - trigger: { player: "phaseBefore" }, - forced: true, - popup: false, - priority: 40, - filter(event, player) { - if (event.skill == "nshuanxian_middle") return false; - if (event.skill == "nshuanxian_right") return false; - var left = player.storage.nshuanxian_left; - if (player.hasSkill("subplayer")) { - if (!left) return player.name == player.storage.nshuanxian_right; - return player.storage.subplayer.skills.includes(left); - } else { - if (!left) return false; - return player.hasSkill(left); - } - }, - content() { - if (player.hasSkill("subplayer")) { - var left = player.storage.nshuanxian_left; - if (left && player.storage.subplayer.skills.includes(left)) { - player.toggleSubPlayer(player.storage.nshuanxian_left); - } else { - player.exitSubPlayer(); - } - } else { - player.callSubPlayer(player.storage.nshuanxian_left); - } - }, - }, - middle: { - trigger: { player: ["phaseAfter", "phaseCancelled"] }, - forced: true, - popup: false, - priority: -40, - filter(event, player) { - if (player.hasSkill("nshuanxian_chosen")) return false; - return true; - }, - content() { - player.exitSubPlayer(); - player.insertPhase(null, true); - }, - }, - right: { - trigger: { player: ["phaseAfter", "phaseCancelled"] }, - forced: true, - popup: false, - priority: -40, - filter(event, player) { - if (player.hasSkill("nshuanxian_chosen")) return false; - if (player.hasSkill("subplayer")) return false; - var right = player.storage.nshuanxian_right; - if (!right) return false; - return player.hasSkill(right); - }, - content() { - player.callSubPlayer(player.storage.nshuanxian_right); - player.insertPhase(null, true); - player.addTempSkill("nshuanxian_chosen", ["phaseBegin", "phaseCancelled"]); - }, - }, - end: { - trigger: { player: ["phaseAfter", "phaseCancelled"] }, - forced: true, - popup: false, - priority: -40, - filter(event, player) { - if (player.hasSkill("nshuanxian_chosen")) return false; - return true; - }, - content() { - if (player.hasSkill("subplayer")) { - player.exitSubPlayer(); - } - }, - content_old() { - "step 0"; - var controls = ["本体"]; - var left = player.storage.nshuanxian_left; - var right = player.storage.nshuanxian_right; - if (player.hasSkill("subplayer")) { - if (player.storage.subplayer.skills.includes(left)) { - controls.unshift("幻身·左"); - } - if (player.storage.subplayer.skills.includes(right)) { - controls.push("幻身·右"); - } - } else { - if (player.hasSkill(left)) { - controls.unshift("幻身·左"); - } - if (player.hasSkill(right)) { - controls.push("幻身·右"); - } - } - if (controls.length > 1) { - player - .chooseControl(controls, function (event, player) { - return Math.floor(Math.random() * _status.event.num); - }) - .set("prompt", "选择一个形态直到下一回合开始") - .set("num", controls.length); - } else { - event.finish(); - } - "step 1"; - switch (result.control) { - case "幻身·左": { - if (!player.hasSkill("subplayer")) { - player.callSubPlayer(player.storage.nshuanxian_left); - } else { - player.toggleSubPlayer(player.storage.nshuanxian_left); - } - break; - } - case "幻身·右": { - if (!player.hasSkill("subplayer")) { - player.callSubPlayer(player.storage.nshuanxian_right); - } - break; - } - default: { - if (player.hasSkill("subplayer")) { - player.exitSubPlayer(); - } - break; - } - } - player.addTempSkill("nshuanxian_chosen", "phaseBegin"); - }, - }, - }, - }, - nsnongquan: { - enable: "phaseUse", - // usable:4, - filter(event, player) { - return player.countCards("h") == 1 && player.canUse("wuzhong", player); - }, - direct: true, - delay: 0, - content() { - player.useCard({ name: "wuzhong" }, player.getCards("h"), player, "nsnongquan"); - }, - ai: { - order: 10, - result: { - player(player, target) { - return 10 - get.value(player.getCards("h")[0]); - }, - }, - }, - }, - nsdufu: { - trigger: { source: "damageBefore" }, - check(event, player) { - return event.player.hasSkillTag("maixie"); - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("nsdufu"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - if (_status.event.bool) { - return -get.attitude(_status.event.player, target); - } - return 0; - }) - .set("bool", trigger.player.hasSkillTag("maixie_defend")); - "step 1"; - if (result.bool) { - player.logSkill("nsdufu", result.targets); - trigger.source = result.targets[0]; - } - }, - }, - yiesheng: { - enable: "phaseUse", - filterCard: { color: "black" }, - filter(event, player) { - return player.countCards("h", { color: "black" }) > 0; - }, - selectCard: [1, Infinity], - prompt: "弃置任意张黑色手牌并摸等量的牌", - check(card) { - return 5 - get.value(card); - }, - content() { - player.draw(cards.length); - }, - ai: { - order: 1, - result: { - player: 1, - }, - }, - }, - liangji: { - audio: ["liangji", 2], - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target != player && !target.hasSkill("liangji_1"); - }, - content() { - "step 0"; - player - .chooseCard("h", "环计:将一张牌置于" + get.translation(target) + "的武将牌上", true) - .set("ai", function (card) { - if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { - return 7 - get.value(card); - } - return -get.value(card); - }); - "step 1"; - if (result.bool) { - player.$give(result.cards, target); - player.lose(result.cards, ui.special); - target.storage.liangji_1 = result.cards; - target.storage.liangji_1_source = target; - target.syncStorage("liangji_1"); - target.addSkill("liangji_1"); - } - }, - ai: { - order: 1, - result: { - target(player, target) { - if (get.attitude(player, target) > 0) { - return Math.sqrt(target.countCards("he")); - } - return 0; - }, - player: 1, - }, - }, - subSkill: { - 1: { - trigger: { - player: "phaseDrawBegin", - }, - forced: true, - mark: true, - intro: { - content: "cards", - }, - content() { - "step 0"; - var cards = player.storage.liangji_1; - if (cards) { - player.gain(cards, "gain2"); - } - player.storage.liangji_1 = 0; - "step 1"; - if (player.sex == "male") player.addTempSkill("wushuang"); - if (player.sex == "female") player.addTempSkill("lijian"); - player.removeSkill("liangji_1"); - }, - sub: true, - }, - }, - }, - jugong: { - audio: ["jingong", 2], - trigger: { - global: "damageEnd", - }, - usable: 1, - frequent: true, - locked: false, - notemp: true, - marktext: "功", - init(player) { - player.storage.jugong = []; - }, - filter(event, player) { - return ( - event.card && - (event.card.name == "sha" || event.card.name == "juedou") && - event.notLink() && - _status.currentPhase != player - ); - }, - content() { - "step 0"; - player.draw(); - "step 1"; - if (player.countCards("h")) { - player.chooseCard("将" + get.cnNumber(1) + "张手牌置于武将牌上作为“功”", 1, true); - } else { - event.finish(); - } - "step 2"; - if (result.cards && result.cards.length) { - player.lose(result.cards, ui.special); - player.storage.jugong = player.storage.jugong.concat(result.cards); - player.syncStorage("jugong"); - player.markSkill("jugong"); - game.log(player, "将", result.cards, "置于武将牌上作为“功”"); - } - }, - intro: { - content: "cards", - }, - group: "jugong_1", - subSkill: { - 1: { - trigger: { - player: "damageBegin", - }, - filter(event, player) { - return player.storage.jugong.length > 1; - }, - content() { - "step 0"; - player.chooseCardButton("移去两张“功”", 2, player.storage.jugong, true); - "step 1"; - if (event.directresult || result.bool) { - player.logSkill("jugong"); - var links = event.directresult || result.links; - for (var i = 0; i < links.length; i++) { - player.storage.jugong.remove(links[i]); - } - player.syncStorage("jugong"); - if (!player.storage.jugong.length) { - player.unmarkSkill("jugong"); - } else { - player.markSkill("jugong"); - } - player.$throw(links); - game.log(player, "被移去了", links); - for (var i = 0; i < links.length; i++) { - ui.discardPile.appendChild(links[i]); - } - } - "step 2"; - trigger.cancel(); - }, - sub: true, - }, - }, - ai: { - effect: { - target(card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; - if (!target.hasSkill("paiyi") && target.hp > 1) - return [0.5, get.tag(card, "damage") * 1.5]; - if (target.hp == 3) return [0.5, get.tag(card, "damage") * 0.2]; - if (target.hp == 2) return [0.1, get.tag(card, "damage") * 0.1]; - } - }, - }, - }, - }, - chengmou: { - audio: ["moucheng", 2], - trigger: { - player: "phaseDrawBegin", - }, - frequent: true, - filter(event, player) { - return player.storage.jugong.length > 0; - }, - content() { - "step 0"; - if (player.storage.jugong.length > 2) player.loseHp(); - "step 1"; - var cards = player.storage.jugong; - if (cards) { - player.gain(cards, "gain2"); - } - player.storage.jugong = []; - "step 2"; - trigger.cancel(); - }, - ai: { - combo: "jugong" - }, - }, - nsxinsheng: { - trigger: { source: "damageEnd" }, - frequent: true, - filter(event, player) { - return player.isHealthy(); - }, - content() { - player.gainMaxHp(trigger.num, true); - player.draw(trigger.num); - }, - }, - nsdunxing: { - trigger: { player: "damageBefore" }, - filter(event, player) { - return player.isDamaged(); - }, - content() { - trigger.cancel(); - player.loseMaxHp(trigger.num, true); - player.draw(trigger.num); - }, - }, - liangce: { - enable: "phaseUse", - viewAs: { name: "wugu" }, - usable: 1, - filterCard: { type: "basic" }, - position: "hs", - filter(event, player) { - return player.countCards("hs", { type: "basic" }) > 0; - }, - check(card) { - return 6 - get.value(card); - }, - group: "liangce2", - }, - liangce2: { - trigger: { global: "wuguRemained" }, - direct: true, - filter(event) { - return event.remained.filterInD().length > 0; - }, - content() { - "step 0"; - var du = 0; - for (var i = 0; i < trigger.remained.length; i++) { - if (trigger.remained[i].name == "du") du++; - } - var dialog = ui.create.dialog(get.prompt("liangce"), trigger.remained, "hidden"); - dialog.classList.add("noselect"); - player.chooseTarget(dialog).set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var att = get.attitude(player, target); - if (du >= trigger.remained.length / 2) return -att; - return att; - }); - "step 1"; - if (result.bool) { - player.logSkill("liangce", result.targets); - result.targets[0].gain(trigger.remained.slice(0), "gain2", "log"); - trigger.remained.length = 0; - } - }, - }, - jianbi: { - trigger: { target: "useCardToTargeted" }, - priority: 5, - filter(event, player) { - if (get.type(event.card) != "trick") return false; - if (get.info(event.card).multitarget) return false; - if (event.targets.length < 2) return false; - return true; - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt("jianbi"), [1, 1], function (card, player, target) { - return _status.event.getTrigger().targets.includes(target); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var eff = -get.effect(target, trigger.card, trigger.player, _status.event.player); - if (trigger.card.name == "wugu" && eff == 0 && get.attitude(player, target) < 0) { - return 0.01; - } - return eff; - }); - "step 1"; - if (result.bool) { - event.targets = result.targets; - if (event.isMine()) { - player.logSkill("jianbi", event.targets); - event.finish(); - } - for (var i = 0; i < result.targets.length; i++) { - trigger.getParent().excluded.add(result.targets[i]); - } - game.delay(); - } else { - event.finish(); - } - "step 2"; - player.logSkill("jianbi", event.targets); - }, - ai: { - effect: { - target(card, player, target) { - if (get.tag(card, "multineg")) { - return "zerotarget"; - } - if (get.tag(card, "multitarget")) { - var info = get.info(card); - if (info.selectTarget == -1 && !info.multitarget) { - return [1, Math.min(3, 1 + target.maxHp - target.hp)]; - } - } - }, - }, - }, - }, - diyjuntun: { - enable: "phaseUse", - filter: (event, player) => - player.hasCard((card) => lib.skill.diyjuntun.filterCard(card, player), "he"), - position: "he", - filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), - check(card) { - var player = _status.event.player; - var he = player.getCards("he"); - var subtype = get.subtype(card); - var value = get.equipValue(card); - for (var i = 0; i < he.length; i++) { - if ( - he[i] != card && - get.subtype(he[i]) == subtype && - get.equipValue(he[i]) >= value - ) { - return 10; - } - } - if (!player.needsToDiscard()) { - return 4 - get.equipValue(card); - } - return 0; - }, - content() { - player.recast(cards); - }, - discard: false, - lose: false, - delay: false, - prompt: "将一张装备牌置入弃牌堆并摸一张牌", - ai: { - basic: { - order: 8.5, - }, - result: { - player: 1, - }, - }, - }, - choudu: { - enable: "phaseUse", - usable: 1, - filterCard: true, - position: "he", - filterTarget(card, player, target) { - return lib.filter.cardEnabled({ name: "diaobingqianjiang" }, target); - }, - check(card) { - return 6 - get.value(card); - }, - content() { - var list = game.filterPlayer(); - list.sortBySeat(target); - target.useCard({ name: "diaobingqianjiang" }, list); - }, - ai: { - order: 1, - result: { - player(player, target) { - if (get.attitude(player, target) <= 1) return 0; - return game.countPlayer(function (current) { - return get.effect(current, { name: "diaobingqianjiang" }, target, player); - }); - }, - }, - }, - }, - liduan: { - trigger: { global: "gainAfter" }, - filter(event, player) { - if (event.player == player) return false; - if (_status.currentPhase == event.player) return false; - if (event.cards.length != 1) return false; - return ( - get.type(event.cards[0]) == "equip" && - get.position(event.cards[0]) == "h" && - event.player.hasUseTarget(event.cards[0]) - ); - }, - logTarget: "player", - check(event, player) { - var att = get.attitude(player, event.player); - var subtype = get.subtype(event.cards[0]); - if (att > 0) { - if (event.player.countCards("h") >= player.countCards("h") + 2) return true; - return ( - event.player.countCards("e", { - subtype: subtype, - }) == 0 - ); - } else { - return event.player.countCards("e", { subtype: subtype }) > 0; - } - }, - content() { - "step 0"; - var bool = false; - var subtype = get.subtype(trigger.cards[0]); - var current = trigger.player.getEquip("e", parseInt(subtype[5])); - var att = get.attitude(trigger.player, player); - if (current) { - if (att > 0) { - bool = true; - } else { - if (get.equipValue(current) > get.equipValue(trigger.cards[0])) { - bool = true; - } - } - } - trigger.player - .chooseCard("立断") - .set( - "prompt2", - "将一张手牌交给" + - get.translation(player) + - ",或取消并使用" + - get.translation(trigger.cards) - ).ai = function (card) { - if (bool) { - if (att > 0) { - return 8 - get.value(card); - } else { - return 4 - get.value(card); - } - } else { - if (att <= 0) return -get.value(card); - return 0; - } - }; - "step 1"; - if (result.bool) { - player.gain(result.cards, trigger.player); - trigger.player.$give(1, player); - } else { - trigger.player.chooseUseTarget(trigger.cards[0], true); - } - }, - }, - jinyan: { - mod: { - cardEnabled(card, player) { - if ( - _status.event.skill != "jinyan" && - player.hp <= 2 && - get.type(card, "trick") == "trick" && - get.color(card) == "black" - ) - return false; - }, - cardUsable(card, player) { - if ( - _status.event.skill != "jinyan" && - player.hp <= 2 && - get.type(card, "trick") == "trick" && - get.color(card) == "black" - ) - return false; - }, - cardRespondable(card, player) { - if ( - _status.event.skill != "jinyan" && - player.hp <= 2 && - get.type(card, "trick") == "trick" && - get.color(card) == "black" - ) - return false; - }, - cardSavable(card, player) { - if ( - _status.event.skill != "jinyan" && - player.hp <= 2 && - get.type(card, "trick") == "trick" && - get.color(card) == "black" - ) - return false; - }, - }, - enable: ["chooseToUse", "chooseToRespond"], - filterCard(card) { - return get.type(card, "trick") == "trick" && get.color(card) == "black"; - }, - viewAsFilter(player) { - if (player.hp > 2) return false; - if ( - !player.hasCard(function (card) { - return get.type(card, "trick") == "trick" && get.color(card) == "black"; - }) - ) - return false; - }, - viewAs: { name: "sha" }, - prompt: "将一张黑色锦囊牌当作杀使用或打出", - check() { - return 1; - }, - ai: { - respondSha: true, - skillTagFilter(player) { - if (player.hp > 2) return false; - if ( - !player.hasCard(function (card) { - return get.type(card, "trick") == "trick" && get.color(card) == "black"; - }) - ) - return false; - }, - }, - }, - fuchou: { - trigger: { target: "shaBefore" }, - filter(event, player) { - return player.countCards("he") > 0; - }, - direct: true, - content() { - "step 0"; - var bool = false; - if (!player.hasShan() && get.effect(player, trigger.card, trigger.player, player) < 0) { - bool = true; - } - player.chooseCard("he", get.prompt("fuchou", trigger.player)).set("ai", function (card) { - var player = _status.event.player; - if (bool) { - if (player.hp <= 1) { - if (get.tag(card, "save")) return 0; - return 8 - get.value(card); - } - return 6 - get.value(card); - } - return -get.value(card); - }); - "step 1"; - if (result.bool) { - trigger.cancel(); - player.logSkill("fuchou", trigger.player); - trigger.player.gain(result.cards, player); - if (get.position(result.cards[0]) == "h") { - player.$give(1, trigger.player); - } else { - player.$give(result.cards, trigger.player); - } - player.storage.fuchou2.add(trigger.player); - } - }, - group: "fuchou2", - }, - fuchou2: { - init(player) { - player.storage.fuchou2 = []; - }, - forced: true, - trigger: { global: "phaseAfter" }, - filter(event, player) { - for (var i = 0; i < player.storage.fuchou2.length; i++) { - if (player.storage.fuchou2[i].isAlive()) return true; - } - return false; - }, - content() { - "step 0"; - if (player.storage.fuchou2.length) { - var target = player.storage.fuchou2.shift(); - if (target.isAlive()) { - player.draw(); - if (player.canUse("sha", target, false) && player.hasSha()) { - player.chooseToUse( - { name: "sha" }, - target, - -1, - "对" + get.translation(target) + "使用一张杀,或失去1点体力" - ); - } else { - player.loseHp(); - event.redo(); - } - } - } else { - event.finish(); - } - "step 1"; - if (!result.bool) { - player.loseHp(); - } - event.goto(0); - }, - }, - chezhen: { - mod: { - globalFrom(from, to, distance) { - if (from.countCards("e")) return distance - 1; - }, - globalTo(from, to, distance) { - if (!to.countCards("e")) return distance + 1; - }, - }, - }, - youzhan: { - trigger: { global: "shaBefore" }, - direct: true, - filter(event, player) { - return ( - get.distance(player, event.target) <= 1 && player.countCards("he", { type: "equip" }) - ); - }, - content() { - "step 0"; - var bool = - get.attitude(player, trigger.player) < 0 && get.attitude(player, trigger.target) > 0; - var next = player.chooseToDiscard( - "he", - { type: "equip" }, - get.prompt("youzhan", trigger.target) - ); - next.ai = function (card) { - if (bool) { - return 7 - get.value(card); - } - return 0; - }; - next.logSkill = ["youzhan", trigger.target]; - "step 1"; - if (result.bool) { - event.youdiinfo = { - source: trigger.player, - evt: trigger, - }; - trigger.target.useCard({ name: "youdishenru" }); - } - }, - }, - kangyin: { - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target != player && target.countCards("he") > 0; - }, - content() { - "step 0"; - player.loseHp(); - "step 1"; - player.discardPlayerCard(target, true); - "step 2"; - if (player.isDamaged() && result.links && result.links.length) { - if (get.type(result.links[0]) == "basic") { - player - .chooseTarget( - [1, player.maxHp - player.hp], - "选择至多" + get.cnNumber(player.maxHp - player.hp) + "名角色各摸一张牌" - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - } else { - player.storage.kangyin2 = player.maxHp - player.hp; - player.addTempSkill("kangyin2"); - event.finish(); - } - } else { - event.finish(); - } - "step 3"; - if (result.targets && result.targets.length) { - result.targets.sort(lib.sort.seat); - player.line(result.targets, "green"); - game.asyncDraw(result.targets); - } - }, - ai: { - order: 7, - result: { - target(player, target) { - if (player.hp >= 4) return -1; - if (player.hp == 3 && !player.needsToDiscard()) return -1; - return 0; - }, - }, - }, - }, - kangyin2: { - mark: true, - intro: { - content: "到其他角色的距离-#;使用【杀】的额外目标数上限+#", - }, - onremove: true, - mod: { - globalFrom(from, to, distance) { - return distance - from.storage.kangyin2; - }, - selectTarget(card, player, range) { - if (card.name == "sha" && range[1] != -1) range[1] += player.storage.kangyin2; - }, - }, - }, - duoqi: { - trigger: { global: "discardAfter" }, - filter(event, player) { - if (_status.currentPhase == player) return false; - if (!player.storage.zhucheng || !player.storage.zhucheng.length) return false; - var evt = event.getParent("phaseUse"); - if (evt && evt.name == "phaseUse") return true; - return false; - }, - direct: true, - content() { - "step 0"; - var bool = false; - if (get.attitude(player, trigger.player) < 0 && trigger.player.needsToDiscard()) { - bool = true; - } - player - .chooseCardButton( - get.prompt("zhucheng", _status.currentPhase), - player.storage.zhucheng - ) - .set("ai", function (button) { - return _status.event.bool ? 1 : 0; - }) - .set("bool", bool); - "step 1"; - if (result.bool) { - player.logSkill("zhucheng", _status.currentPhase); - player.$throw(result.links[0]); - player.storage.zhucheng.remove(result.links[0]); - result.links[0].discard(); - player.syncStorage("zhucheng"); - if (player.storage.zhucheng.length == 0) { - player.unmarkSkill("zhucheng"); - } else { - player.updateMarks(); - } - var evt = trigger.getParent("phaseUse"); - if (evt && evt.name == "phaseUse") { - evt.skipped = true; - } - } - }, - ai: { - expose: 0.2, - combo: "zhucheng" - }, - }, - zhucheng: { - trigger: { player: "phaseEnd" }, - filter(event, player) { - return !player.storage.zhucheng || !player.storage.zhucheng.length; - }, - check(event, player) { - if (player.storage.zhucheng && player.storage.zhucheng.length) { - if (!player.hasShan()) return false; - if (player.storage.zhucheng.length >= 2) return false; - } - return true; - }, - intro: { - content: "cards", - }, - content() { - if (player.storage.zhucheng && player.storage.zhucheng.length) { - player.gain(player.storage.zhucheng, "gain2"); - delete player.storage.zhucheng; - player.unmarkSkill("zhucheng"); - } else { - var cards = get.cards(Math.max(1, player.maxHp - player.hp)); - player.$gain2(cards); - player.storage.zhucheng = cards; - player.markSkill("zhucheng"); - } - }, - ai: { - target(card, player, target, current) { - if (card.name == "sha" && player.storage.zhucheng && player.storage.zhucheng.length) { - if (player.storage.zhucheng.length >= 2) { - if ( - !player.hasFriend() && - player.countCards("he") - 2 < player.storage.zhucheng.length - ) - return "zeroplayertarget"; - return 0.1; - } else { - var he = player.getCards("he"); - var sha = false; - for (var i = 0; i < he.length; i++) { - if (he[i] == "sha" && !sha) { - sha = true; - } else { - if (get.value(he[i]) <= 6) { - return [1, 0, 1, -0.5]; - } - } - } - return "zeroplayertarget"; - } - } - }, - }, - group: "zhucheng2", - }, - zhucheng2: { - trigger: { target: "shaBefore" }, - check(event, player) { - if (get.attitude(event.player, player) <= 0) return true; - return get.effect(player, event.card, event.player, player) <= 0; - }, - filter(event, player) { - return player.storage.zhucheng && player.storage.zhucheng.length > 0; - }, - content() { - "step 0"; - var bool = false; - if (get.effect(player, trigger.card, trigger.player, trigger.player) >= 0) { - bool = true; - } - var num = player.storage.zhucheng.length; - trigger.player - .chooseToDiscard("弃置" + get.cnNumber(num) + "张牌,或令杀无效", "he", num) - .set("ai", function (card) { - if (_status.event.bool) { - return 10 - get.value(card); - } - return 0; - }) - .set("bool", bool); - "step 1"; - if (!result.bool) { - trigger.cancel(); - } - }, - }, - diy_jiaoxia: { - //audio:['jiaoxia',2], - trigger: { target: "useCardToBegin" }, - filter(event, player) { - return event.card && get.color(event.card) == "red"; - }, - frequent: true, - content() { - player.draw(); - }, - ai: { - effect(card, player, target) { - if (get.color(card) == "red") return [1, 1]; - }, - }, - }, - zaiqix: { - trigger: { player: "phaseDrawBefore" }, - filter(event, player) { - return player.hp < player.maxHp; - }, - check(event, player) { - if (1 + player.maxHp - player.hp < 2) { - return false; - } else if (1 + player.maxHp - player.hp == 2) { - return player.countCards("h") >= 2; - } - return true; - }, - content() { - "step 0"; - trigger.cancel(); - event.cards = get.cards(player.maxHp - player.hp + 1); - player.showCards(event.cards); - "step 1"; - var num = 0; - for (var i = 0; i < event.cards.length; i++) { - if (get.suit(event.cards[i]) == "heart") { - num++; - event.cards[i].discard(); - event.cards.splice(i--, 1); - } - } - if (num) { - player.recover(num); - } - "step 2"; - if (event.cards.length) { - player.gain(event.cards); - player.$gain2(event.cards); - game.delay(); - } - }, - ai: { - threaten(player, target) { - if (target.hp == 1) return 2; - if (target.hp == 2) return 1.5; - return 1; - }, - }, - }, - batu: { - trigger: { player: "phaseEnd" }, - frequent: true, - filter(event, player) { - return player.countCards("h") < game.countGroup(); - }, - content() { - player.draw(game.countGroup() - player.countCards("h")); - }, - ai: { - threaten: 1.3, - }, - }, - diyzaiqi: { - trigger: { player: "phaseDrawBegin" }, - forced: true, - filter(event, player) { - return player.hp < player.maxHp; - }, - content() { - trigger.num += player.maxHp - player.hp; - }, - ai: { - threaten(player, target) { - if (target.hp == 1) return 2.5; - if (target.hp == 2) return 1.8; - return 0.5; - }, - maixie: true, - effect: { - target(card, player, target) { - if (get.tag(card, "damage")) { - if (target.hp == target.maxHp) return [0, 1]; - } - if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; - }, - }, - }, - }, - diykuanggu: { - trigger: { source: "damageEnd" }, - forced: true, - content() { - if (get.distance(trigger.player, player, "attack") > 1) { - player.draw(trigger.num); - } else { - player.recover(trigger.num); - } - }, - }, - diyduanliang: { - group: ["diyduanliang1", "diyduanliang2"], - ai: { - threaten: 1.2, - }, - }, - diyduanliang1: { - enable: "phaseUse", - usable: 1, - discard: false, - filter(event, player) { - var cards = player.getCards("he", { color: "black" }); - for (var i = 0; i < cards.length; i++) { - var type = get.type(cards[i]); - if (type == "basic") return true; - } - return false; - }, - prepare: "throw", - position: "he", - filterCard(card) { - if (get.color(card) != "black") return false; - var type = get.type(card); - return type == "basic"; - }, - filterTarget(card, player, target) { - return lib.filter.filterTarget({ name: "bingliang" }, player, target); - }, - check(card) { - return 7 - get.value(card); - }, - content() { - player.useCard({ name: "bingliang" }, target, cards).animate = false; - player.draw(); - }, - ai: { - result: { - target(player, target) { - return get.effect(target, { name: "bingliang" }, player, target); - }, - }, - order: 9, - }, - }, - diyduanliang2: { - mod: { - targetInRange(card, player, target) { - if (card.name == "bingliang") { - if (get.distance(player, target) <= 2) return true; - } - }, - }, - }, - guihan: { - unique: true, - enable: "chooseToUse", - skillAnimation: "epic", - limited: true, - filter(event, player) { - if (event.type != "dying") return false; - if (player != event.dying) return false; - return true; - }, - filterTarget(card, player, target) { - return target.hasSex("male") && player != target; - }, - content() { - "step 0"; - player.awakenSkill("guihan"); - player.recover(); - "step 1"; - player.draw(2); - "step 2"; - target.recover(); - "step 3"; - target.draw(2); - // if(lib.config.mode=='identity'){ - // player.node.identity.style.backgroundColor=get.translation('weiColor'); - // player.group='wei'; - // } - }, - ai: { - skillTagFilter(player) { - if (player.storage.guihan) return false; - if (player.hp > 0) return false; - }, - save: true, - result: { - player: 4, - target(player, target) { - if (target.hp == target.maxHp) return 2; - return 4; - }, - }, - threaten(player, target) { - if (!target.storage.guihan) return 0.8; - }, - }, - }, - luweiyan: { - enable: "phaseUse", - usable: 1, - filterCard(card) { - return get.type(card) != "basic"; - }, - position: "hse", - filter(event, player) { - return player.hasCard(function (card) { - return get.type(card) != "basic"; - }, "hes"); - }, - viewAs: { name: "shuiyanqijun" }, - prompt: "将一张非基本牌当水淹七军使用", - check(card) { - return 8 - get.value(card); - }, - group: "luweiyan2", - }, - luweiyan2: { - trigger: { player: "useCardAfter" }, - direct: true, - filter(event, player) { - if (event.skill != "luweiyan") return false; - for (var i = 0; i < event.targets.length; i++) { - if (player.canUse("sha", event.targets[i], false)) { - return true; - } - } - return false; - }, - content() { - "step 0"; - player - .chooseTarget("是否视为使用一张杀?", function (card, player, target) { - return ( - _status.event.targets.includes(target) && player.canUse("sha", target, false) - ); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "sha" }, player, player); - }) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - player.useCard({ name: "sha" }, result.targets, false); - } - }, - }, - yaliang: { - inherit: "wangxi", - }, - xiongzi: { - trigger: { player: "phaseDrawBegin" }, - forced: true, - content() { - trigger.num += 1 + Math.floor(player.countCards("e") / 2); - }, - }, - honglian: { - trigger: { player: "damageEnd" }, - check(event, player) { - return get.attitude(player, event.player) < 0; - }, - filter(event, player) { - return ( - event.source && - event.source != player && - event.source.countCards("he", { color: "red" }) > 0 - ); - }, - content() { - trigger.source.discard(trigger.source.getCards("he", { color: "red" })); - }, - ai: { - expose: 0.1, - result: { - threaten: 0.8, - target(card, player, target) { - if (get.tag(card, "damage") && get.attitude(target, player) < 0) { - return [1, 0, 0, -player.countCards("he", { color: "red" })]; - } - }, - }, - }, - }, - diyguhuo: { - trigger: { player: "phaseBegin" }, - forced: true, - filter(event, player) { - return player.countCards("hej") > 0; - }, - content() { - "step 0"; - player.draw(2); - "step 1"; - var next = player.discardPlayerCard(player, "hej", 2, true); - next.ai = function (button) { - if (get.position(button.link) == "j") return 10; - return -get.value(button.link); - }; - next.filterButton = function (button) { - return lib.filter.cardDiscardable(button.link, player); - }; - }, - ai: { - effect: { - target(card) { - if (get.type(card) == "delay") return [0, 0.5]; - }, - }, - }, - }, - diychanyuan: { - trigger: { player: "dieBegin" }, - forced: true, - filter(event) { - return event.source != undefined; - }, - content() { - trigger.source.loseMaxHp(true); - }, - ai: { - threaten(player, target) { - if (target.hp == 1) return 0.2; - }, - result: { - target(card, player, target, current) { - if (target.hp <= 1 && get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -5]; - return [1, 0, 0, -2]; - } - }, - }, - }, - }, - zonghuo: { - trigger: { source: "damageBefore" }, - direct: true, - priority: 10, - filter(event) { - return event.nature != "fire"; - }, - content() { - "step 0"; - player.chooseToDiscard(get.prompt("zonghuo")).ai = function (card) { - var att = get.attitude(player, trigger.player); - if (trigger.player.hasSkillTag("nofire")) { - if (att > 0) return 8 - get.value(card); - return -1; - } - if (att < 0) { - return 7 - get.value(card); - } - return -1; - }; - "step 1"; - if (result.bool) { - player.logSkill("zonghuo", trigger.player, "fire"); - trigger.nature = "fire"; - } - }, - }, - shaoying: { - trigger: { source: "damageAfter" }, - direct: true, - filter(event) { - return event.nature == "fire"; - }, - content() { - "step 0"; - player.chooseTarget(get.prompt("shaoying"), function (card, player, target) { - return get.distance(trigger.player, target) <= 1 && trigger.player != target; - }).ai = function (target) { - return get.damageEffect(target, player, player, "fire"); - }; - "step 1"; - if (result.bool) { - var card = get.cards()[0]; - card.discard(); - player.showCards(card); - event.bool = get.color(card) == "red"; - event.target = result.targets[0]; - player.logSkill("shaoying", event.target, false); - trigger.player.line(event.target, "fire"); - } else { - event.finish(); - } - "step 2"; - if (event.bool) { - event.target.damage("fire"); - } - }, - }, - tiangong: { - group: ["tiangong2"], - trigger: { player: "damageBefore" }, - filter(event) { - if (event.nature == "thunder") return true; - }, - forced: true, - content() { - trigger.cancel(); - }, - ai: { - effect: { - target(card, player, target, current) { - if (card.name == "tiesuo") return 0; - if (get.tag(card, "thunderDamage")) return 0; - }, - }, - threaten: 0.5, - }, - }, - tiangong2: { - trigger: { source: "damageAfter" }, - filter(event) { - if (event.nature == "thunder") return true; - }, - forced: true, - popup: false, - priority: 1, - content() { - player.draw(); - }, - }, - xicai: { - inherit: "jianxiong", - }, - diyjianxiong: { - mode: ["identity", "guozhan"], - trigger: { global: "dieBefore" }, - forced: true, - filter(event, player) { - if (_status.currentPhase !== player) return false; - if (get.mode() === "identity") return event.player != game.zhu; - return get.mode() === "guozhan" && event.player.isFriendOf(player); - }, - content() { - game.broadcastAll(function (target, group) { - if (get.mode() === "identity") { - target.identity = group; - target.setIdentity(group); - target.identityShown = true; - } - else { - target.trueIdentity = lib.group.slice(0).filter(i => group !== i).randomGet(); - } - }, trigger.player, get.mode() === "identity" ? "fan" : player.getGuozhanGroup()); - }, - }, - nsshuaiyan: { - trigger: { global: "recoverAfter" }, - filter(event, player) { - return event.player != player && _status.currentPhase != player; - }, - logTarget: "player", - content() { - "step 0"; - var att = get.attitude(trigger.player, player); - var bool = 0; - if (att < 0) { - if (trigger.player.countCards("e") == 0 && trigger.player.countCards("h") > 2) - bool = 1; - else if (trigger.player.countCards("he") == 0) bool = 1; - } else if (att == 0 && trigger.player.countCards("he") == 0) { - bool = 1; - } - trigger.player - .chooseControl(function () { - return _status.event.bool; - }) - .set("prompt", "率言") - .set("bool", bool) - .set("choiceList", [ - "令" + get.translation(player) + "摸一张牌", - "令" + get.translation(player) + "弃置你一张牌", - ]); - "step 1"; - if (result.control == "选项一") { - player.draw(); - event.finish(); - } else if (trigger.player.countCards("he")) { - player.discardPlayerCard(trigger.player, true, "he"); - } else { - event.finish(); - } - }, - ai: { - threaten: 1.2, - }, - }, - moshou: { - mod: { - targetEnabled(card, player, target, now) { - if (card.name == "bingliang" || card.name == "lebu") return false; - }, - }, - }, - siji: { - trigger: { player: "phaseDiscardEnd" }, - frequent: true, - filter(event, player) { - if (event.cards) { - for (var i = 0; i < event.cards.length; i++) { - if (event.cards[i].name == "sha") return true; - } - } - return false; - }, - content() { - var num = 0; - for (var i = 0; i < trigger.cards.length; i++) { - if (trigger.cards[i].name == "sha") num++; - } - player.draw(2 * num); - }, - }, - ciqiu: { - trigger: { source: "damageBegin1" }, - forced: true, - filter(event) { - return event.card && event.card.name == "sha" && event.player.isHealthy(); - }, - content() { - "step 0"; - trigger.num++; - if (trigger.num >= trigger.player.hp) { - trigger.player.addTempSkill("ciqiu_dying"); - player.removeSkill("ciqiu"); - } - }, - ai: { - effect: { - player(card, player, target) { - if ( - card.name == "sha" && - target.isHealthy() && - get.attitude(player, target) > 0 - ) { - return [1, -2]; - } - }, - }, - }, - }, - ciqiu_dying: { - trigger: { player: "dyingBegin" }, - forced: true, - silent: true, - firstDo: true, - content() { - player.die(); - }, - popup: false, - }, - juedao: { - enable: "phaseUse", - filter(event, player) { - return player.isLinked() == false; - }, - filterCard: true, - check(card) { - return 6 - get.value(card); - }, - content() { - if (player.isLinked() == false) player.link(); - }, - ai: { - link: true, - order: 2, - result: { - player(player) { - if (player.isLinked()) return 0; - return 1; - }, - }, - effect: { - target(card, player, target) { - if (card.name == "tiesuo") { - if (target.isLinked()) { - return [0, -0.5]; - } else { - return [0, 0.5]; - } - } - }, - }, - }, - mod: { - globalFrom(from, to, distance) { - if (from.isLinked()) return distance + 1; - }, - globalTo(from, to, distance) { - if (to.isLinked()) return distance + 1; - }, - }, - }, - geju: { - trigger: { player: "phaseBegin" }, - frequent: true, - filter(event, player) { - var list = []; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (player != players[i]) list.add(players[i].group); - } - list.remove("unknown"); - for (var i = 0; i < players.length; i++) { - if (players[i] != player) { - if (lib.filter.targetInRange({ name: "sha" }, players[i], player)) { - list.remove(players[i].group); - } - } - } - return list.length > 0; - }, - content() { - var list = []; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (player != players[i]) list.add(players[i].group); - } - list.remove("unknown"); - for (var i = 0; i < players.length; i++) { - if (players[i] != player) { - if (lib.filter.targetInRange({ name: "sha" }, players[i], player)) { - list.remove(players[i].group); - } - } - } - if (list.length > 0) player.draw(list.length); - }, - }, - diyqiangxi: { - enable: "phaseUse", - usable: 1, - filterCard(card) { - return get.subtype(card) == "equip1"; - }, - selectCard: [0, 1], - filterTarget(card, player, target) { - if (player == target) return false; - return get.distance(player, target, "attack") <= 1; - }, - content() { - "step 0"; - if (cards.length == 0) { - player.loseHp(); - } - "step 1"; - target.damage(); - "step 2"; - if (target.isAlive() && target.countCards("he")) { - player.discardPlayerCard(target); - } - }, - check(card) { - return 10 - get.value(card); - }, - position: "he", - ai: { - order: 8, - result: { - player(player, target) { - if (ui.selected.cards.length) return 0; - if (player.hp >= target.hp) return -0.9; - if (player.hp <= 2) return -10; - return -2; - }, - target(player, target) { - if (player.hp <= 1) return 0; - return get.damageEffect(target, player); - }, - }, - }, - threaten: 1.3, - }, - nsdingzhou: { - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target != player && target.countCards("hej") > 0; - }, - content() { - "step 0"; - var cards = target.getCards("hej"); - if (get.isLuckyStar(player)) { - var cardx = ui.cardPile.firstChild; - if (cardx) { - var color = get.color(card), - cardsx = cards.filter(function (i) { - return get.color(i) == color; - }); - if (cardsx.length > 0) cards = cardsx; - } - } - var card = cards.randomGet(); - event.card = card; - player.gain(card, target, "giveAuto", "bySelf"); - player.draw(); - "step 1"; - if (Array.isArray(result) && get.color(card) != get.color(result[0])) player.loseHp(); - }, - ai: { - order: 7, - result: { target: -1 }, - }, - }, - //比原版更令人难以吐槽的神孙权 - junkyuheng: { - audio: "yuheng", - trigger: { player: "phaseBegin" }, - forced: true, - keepSkill: true, - filter(event, player) { - return player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "junkyuheng"); - }, "he"); - }, - content() { - "step 0"; - player - .chooseToDiscard("he", true, [1, 4], function (card, player) { - if (!ui.selected.cards.length) return true; - var suit = get.suit(card, player); - for (var i of ui.selected.cards) { - if (get.suit(i, player) == suit) return false; - } - return true; - }) - .set("complexCard", true) - .set("ai", function (card) { - if (!player.hasValueTarget(card)) return 5; - return 5 - get.value(card); - }); - "step 1"; - if (result.bool) { - var skills = lib.skill.junkyuheng.derivation.randomGets(result.cards.length); - player.addAdditionalSkills("junkyuheng", skills); - } - }, - group: "junkyuheng_remove", - derivation: [ - "olbingyi", - "shenxing", - "xiashu", - "old_anxu", - "rezhiheng", - "xinanguo", - "lanjiang", - "xinfu_guanwei", - "dimeng", - "xindiaodu", - "xingxue", - "jiexun", - "olhongyuan", - "xinfu_youdi", - "bizheng", - ], - subSkill: { - remove: { - audio: "yuheng", - trigger: { player: "phaseEnd" }, - forced: true, - filter(event, player) { - return ( - player.additionalSkills.junkyuheng && - player.additionalSkills.junkyuheng.length > 0 - ); - }, - async content(event, trigger, player) { - const skillslength = player.additionalSkills.junkyuheng.length; - await player.removeAdditionalSkills("junkyuheng"); - await player.draw(skillslength); - }, - }, - }, - }, - junkdili: { - audio: "dili", - trigger: { player: "changeSkillsAfter" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "wood", - filter(event, player) { - if (!event.addSkill.length) return false; - var skills = player.getSkills(null, false, false).filter(function (i) { - var info = get.info(i); - return info && !info.charlotte; - }); - return skills.length > player.maxHp; - }, - content() { - "step 0"; - player.awakenSkill("junkdili"); - player.loseMaxHp(); - "step 1"; - var skills = player.getSkills(null, false, false).filter(function (i) { - if (i == "junkdili") return false; - var info = get.info(i); - return info && !info.charlotte; - }); - var list = []; - for (var skill of skills) { - list.push([ - skill, - '", - ]); - } - var next = player.chooseButton(["请选择失去任意个技能", [list, "textbutton"]]); - next.set("forced", true); - next.set("selectButton", [1, skills.length]); - next.set("ai", function (button) { - var skill = button.link, - skills = _status.event.skills.slice(0); - skills.removeArray(["xinanguo", "lanjiang", "rezhiheng", "junkyuheng"]); - switch (ui.selected.buttons.length) { - case 0: - if (skills.includes(skill)) return 2; - if (skill == "junkyuheng") return 1; - return Math.random(); - case 1: - if (skills.length < 2) return 0; - if (skills.includes(skill)) return 2; - if (skill == "junkyuheng") return 1; - return 0; - case 2: - if (skills.includes(skill)) return 2; - if (skill == "junkyuheng") return 1; - return 0; - default: - return 0; - } - }); - next.set("skills", skills); - "step 2"; - if (result.bool) { - var skills = result.links; - player.removeSkills(skills.slice(0)); - } - var list = lib.skill.junkdili.derivation; - list = list.slice(0, Math.min(skills.length, list.length)); - player.addSkills(list); - }, - derivation: ["junkshengzhi", "junkquandao", "junkchigang"], - }, - junkshengzhi: { - audio: "dili_shengzhi", - trigger: { player: ["logSkill", "useSkillAfter"] }, - forced: true, - filter(event, player) { - if (event.type != "player") return false; - var skill = event.sourceSkill || event.skill; - if (get.is.locked(skill)) return false; - var info = get.info(skill); - return !info.charlotte; - }, - content() { - player.addTempSkill("junkshengzhi_effect"); - }, - subSkill: { - effect: { - mod: { - cardUsable: () => Infinity, - targetInRange: () => true, - }, - trigger: { player: "useCard1" }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - content() { - if (trigger.addCount !== false) { - trigger.addCount = false; - player.getStat().card[trigger.card.name]--; - } - player.removeSkill("junkshengzhi_effect"); - }, - mark: true, - intro: { content: "使用下一张牌无距离和次数限制" }, - }, - }, - }, - junkquandao: { - audio: "dili_quandao", - trigger: { player: "useCard" }, - forced: true, - filter(event, player) { - return event.card.name == "sha" || get.type(event.card, null, false) == "trick"; - }, - async content(event, trigger, player) { - const cards1 = player.getCards("h", (card) => get.name(card) === "sha"), - cards2 = player.getCards("h", (card) => get.type(card) === "trick"); - if (cards1.length !== cards2.length) { - const num = cards1.length - cards2.length, - cards = num > 0 ? cards1 : cards2; - let i = 0; - cards.forEach((card) => { - if (i < Math.abs(num) && lib.filter.cardDiscardable(card, player, "junkquandao")) - i++; - }); - if (i > 0) { - await player.chooseToDiscard( - i, - true, - `权道:请弃置${get.cnNumber(i)}张${num > 0 ? "杀" : "普通锦囊牌"}`, - num > 0 - ? (card) => get.name(card) === "sha" - : (card) => get.type(card) === "trick" - ); - } - } - await player.draw(); - }, - }, - junkchigang: { - audio: "dili_chigang", - trigger: { player: "phaseJudgeBefore" }, - forced: true, - zhuanhuanji: true, - mark: true, - marktext: "☯", - content() { - player.changeZhuanhuanji("junkchigang"); - trigger.cancel(); - var next = player[player.storage.junkchigang ? "phaseDraw" : "phaseUse"](); - event.next.remove(next); - trigger.getParent().next.push(next); - }, - ai: { - effect: { - target(card, player, target) { - if (get.type(card) == "delay") return "zerotarget"; - }, - }, - }, - intro: { - content(storage) { - return ( - "转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的" + - (storage ? "出牌阶段" : "摸牌阶段") + - "。" - ); - }, - }, - }, - nsmanzhi: { - audio: "dcmanzhi", - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - direct: true, - filter(event, player) { - var nums = []; - game.countPlayer((current) => { - nums.add(current.hp); - nums.add(current.maxHp); - nums.add(current.countCards("h")); - nums.add(current.countCards("e")); - nums.add(current.countCards("j")); - }); - for (var a of nums) { - for (var b of nums) { - if (0.5 * a * a + 2.5 * b - game.roundNumber == game.countPlayer()) return true; - } - } - return false; - }, - content() { - "step 0"; - var nums = []; - game.countPlayer((current) => { - nums.add(current.hp); - nums.add(current.maxHp); - nums.add(current.countCards("h")); - nums.add(current.countCards("e")); - nums.add(current.countCards("j")); - }); - nums.sort((a, b) => a - b); - var a = null, - b = null, - goon = false; - for (a of nums) { - for (b of nums) { - if (0.5 * a * a + 2.5 * b - game.roundNumber == game.countPlayer()) { - goon = true; - break; - } - } - if (goon) break; - } - player - .chooseButton(2, [ - "蛮智:请选择让下列等式成立的A与B的值", - '
    目标等式
    ', - `0.5 × A2 + 2.5 × B - ${game.roundNumber} = ${game.countPlayer()}`, - '
    A的可选值
    ', - [ - nums.map((i) => { - return [`A|${i}`, i == a ? `${i}` : i]; - }), - "tdnodes", - ], - '
    B的可选值
    ', - [ - nums.map((i) => { - return [`B|${i}`, i == b ? `${i}` : i]; - }), - "tdnodes", - ], - ]) - .set("filterButton", function (button) { - if (!ui.selected.buttons.length) return true; - return button.link[0] != ui.selected.buttons[0].link[0]; - }) - .set("filterOk", function () { - if (ui.selected.buttons.length != 2) return false; - var a, b; - for (var i of ui.selected.buttons) { - if (i.link[0] == "A") a = parseInt(i.link.slice(2)); - else b = parseInt(i.link.slice(2)); - } - return 0.5 * a * a + 2.5 * b - game.roundNumber == game.countPlayer(); - }) - .set("choice", [a, b]) - .set("ai", (button) => { - var choice = _status.event.choice; - if (button.link == `A|${choice[0]}` || button.link == `B|${choice[1]}`) return 1; - return 0; - }); - "step 1"; - if (result.bool) { - var a, b; - for (var i of result.links) { - if (i[0] == "A") a = parseInt(i.slice(2)); - else b = parseInt(i.slice(2)); - } - equals = `0.5×${a}2+2.5×${b}-${game.roundNumber}=${game.countPlayer()}`; - player.logSkill("nsmanzhi"); - player.chat(equals); - game.log(player, "的计算结果为", equals); - player.draw(game.countPlayer()); - } - }, - }, - }, - dynamicTranslate: { - nsjiquan(player) { - if (player.storage.nsfuwei) - return "锁定技,与你距离1以内的其他角色造成或受到伤害后,你将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。"; - return "与你距离1以内的其他角色造成或受到伤害后,你可以将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。"; - }, - abyusa_jueqing(player) { - if (player.storage.abyusa_jueqing_rewrite) return "锁定技,你即将造成的伤害均视为失去体力。"; - return "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。"; - }, - tomoya_shangxian(player) { - if (player.storage.tomoya_shangxian) - return "锁定技,你计算与其他角色的距离时始终从顺时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。"; - return "锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。"; - }, - yui_lieyin(player) { - if (player.storage._ichiban_no_takaramono) - return "锁定技,出牌阶段开始时,你可选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。"; - return "锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。"; - }, - yuzuru_kunfen(player) { - if (player.storage._yuzuru_sss) - return "锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。"; - return "锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。"; - }, - yuzuru_quji(player) { - if (player.storage._yuzuru_sss) - return "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)"; - return "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)"; - }, - kamome_jieban(player) { - if (player.storage.kamome_jieban) - return '转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。'; - return '转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。'; - }, - shiroha_guying(player) { - var str = "当你受到伤害/对其他角色造成伤害时,你"; - if (!player.storage.shiroha_jiezhao) str = "锁定技,每回合限一次," + str; - if (player.storage.shiroha_jiezhao) str += "可"; - str += "进行判定。若结果为红色/黑色,此伤害-1/+1。"; - return str; - }, - nsdiewu(player) { - if (player.storage.nspojian) - return "当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】。当你以此法使用【杀】造成伤害后,则你摸一张牌。"; - return "当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】或【闪】。当你以此法使用【杀】造成伤害后,则你摸一张牌。"; - }, - nsfuzhou(player) { - var str = "出牌阶段限"; - str += player.storage.nstaiping ? "两" : "一"; - str += - "次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到"; - str += player.storage.nsfuzhou_damage ? "两" : "一"; - str += "点雷属性伤害并弃置一张牌;红色,你摸两张牌,"; - str += player.storage.nsfuzhou_draw - ? "该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。" - : "且该角色本回合手牌上限减1。"; - return str; - }, - nsguidao(player) { - if (player.storage.nstaiping) return "一名角色的判定牌生效前,你可以打出一张牌替换之。"; - return "一名角色的判定牌生效前,你可以打出一张黑色牌替换之。"; - }, - junkchigang(player) { - if (player.storage.junkchigang) - return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。'; - return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。'; - }, - }, - characterReplace: { - key_yuri: ["key_yuri", "sp_key_yuri"], - kanade: ["sp_key_kanade", "kanade"], - }, - translate: { - diy_liufu: "刘馥", - diy_xizhenxihong: "习珍习宏", - diy_liuzan: "留赞", - diy_zaozhirenjun: "枣祗任峻", - diy_yangyi: "杨仪", - diy_tianyu: "田豫", - - // diy_caocao:'曹操', - diy_menghuo: "孟获", - diy_huangzhong: "黄汉升", - diy_xuhuang: "徐公明", - diy_dianwei: "新典韦", - diy_weiyan: "魏文长", - xicai: "惜才", - diyjianxiong: "奸雄", - diy_feishi: "费诗", - nsshuaiyan: "率言", - moshou: "墨守", - diy_hanlong: "韩龙", - diy_luxun: "陆伯言", - diy_yuji: "于吉", - diy_zhouyu: "周公瑾", - diy_lukang: "陆抗", - diy_caiwenji: "蔡昭姬", - diy_zhenji: "甄宓", - - ns_zuoci: "左慈", - ns_wangyun: "王允", - ns_lvzhi: "吕后", - ns_nanhua: "南华", - ns_nanhua_left: "幻身·左", - ns_nanhua_right: "幻身·右", - ns_huamulan: "SP花木兰", - ns_huamulan_prefix: "SP", - ns_huangzu: "黄祖", - ns_yanliang: "颜良", - ns_wenchou: "文丑", - ns_jinke: "荆轲", - - ns_caocao: "曹操", - ns_zhugeliang: "诸葛亮", - ns_wangyue: "王越", - ns_yuji: "于吉", - ns_caocaosp: "SP曹操", - ns_caocaosp_prefix: "SP", - ns_xinxianying: "辛宪英", - ns_sunjian: "孙坚", - ns_simazhao: "司马昭", - ns_guanlu: "管辂", - - ns_duangui: "段珪", - ns_shenpei: "审配", - ns_zhangbao: "张宝", - ns_masu: "马谡", - ns_zhangxiu: "张绣", - ns_lvmeng: "吕蒙", - - ns_yujisp: "于吉", - ns_lisu: "李肃", - ns_yangyi: "杨仪", - ns_liuzhang: "刘璋", - ns_xinnanhua: "南华老仙", - ns_luyusheng: "陆郁生", - - key_kud: "库特莉亚芙卡", - kud_qiaoshou: "巧手", - kud_qiaoshou_equip: "巧手", - kud_qiaoshou_end: "巧手", - kud_qiaoshou_backup: "巧手", - kud_qiaoshou_info: - "出牌阶段/结束阶段,若你没有“巧”,则你可以将一张手牌作为“巧”置于武将牌上并摸一张牌,且视为装备了一张你选择的武器牌或进攻坐骑/防具牌或防御坐骑直到“巧”进入弃牌堆。出牌阶段结束时/准备阶段开始时,你将“巧”置入弃牌堆。", - kud_buhui: "不悔", - kud_buhui_info: - "限定技,当你进入濒死状态时,你可以弃置“巧”和装备区内的所有牌(至少一张)并摸等量的牌,将体力回复至2点,获得技能〖重振〗。", - key_misuzu: "神尾观铃", - misuzu_hengzhou: "恒咒", - misuzu_hengzhou_info: - "锁定技,准备阶段开始时,或当你受到1点伤害或回复1点体力后,你获得一个“诅咒”标记。你的手牌上限和摸牌阶段的额定摸牌数+X。结束阶段开始时,若X大于3,则你移去所有“诅咒”标记并失去1点体力。(X为“诅咒”标记数)", - misuzu_nongyin: "浓饮", - misuzu_nongyin_info: - "当你需要使用【桃】时,你可将一张红色非锦囊牌当做【乐不思蜀】置入自己的判定区,然后视为使用一张【桃】。", - misuzu_zhongxing: "终幸", - misuzu_zhongxing_info: - "每回合限一次,当你判定区的牌移动到其他区域后,你可令一名角色回复1点体力或摸两张牌。", - key_kamome: "久岛鸥", - kamome_yangfan: "扬帆", - kamome_yangfan_info: - "锁定技,游戏开始时,你将一张【旅行箱】置入你的装备区。当你失去装备区内的一张牌后,你摸两张牌。", - kamome_huanmeng: "幻梦", - kamome_huanmeng_info: - "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)", - kamome_jieban: "结伴", - kamome_jieban_info: - "转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。", - kamome_suitcase: "旅行箱", - kamome_suitcase_info: "锁定技,你跳过你的判定阶段和弃牌阶段;当你即将翻面时,取消之。", - key_nao: "友利奈绪", - nao_duyin: "独隐", - nao_duyin2: "独隐", - nao_duyin_info: - "一名其他角色的回合开始时,若你本局游戏内未对其发动过〖独隐〗,则你可以弃置一张牌或将武将牌翻面。若如此做,你不能成为其使用牌的目标,且对其使用牌没有距离限制且不计入使用次数直到你的下回合结束。", - nao_wanxin: "挽心", - nao_wanxin_info: - "一名角色的回合结束时,你可以令一名本回合内受到过伤害的角色摸两张牌,然后你与其将武将牌重置。", - nao_shouqing: "守情", - nao_shouqing2: "守情", - nao_shouqing3: "守情", - nao_shouqing_info: - "其他角色的出牌阶段内可以对你使用【桃】。若如此做,其摸一张牌且本局游戏内的手牌上限+1。", - key_yuuki: "冰室忧希", - yuuki_yicha: "异插", - yuuki_yicha_info: - "出牌阶段开始时,你可依次进行两次判定并将判定牌依次置入两行三列方阵的两个随机位置中。然后你依次进行四次判定,每次可将当前判定牌置入空方格,且须与相邻方格的牌颜色均不同。若如此做,你令一名角色获得方阵内的所有牌。", - key_kyouko: "伊座并杏子", - kyouko_rongzhu: "容助", - kyouko_rongzhu_info: - "其他角色不因此技能而得到你的牌后,你可摸一张牌,然后交给其一张牌。若其是当前回合角色,则其本回合使用【杀】的次数上限+1;若你是当前回合角色,则你本回合的手牌上限+1。", - kyouko_gongmian: "共勉", - kyouko_gongmian_use: "共勉", - kyouko_gongmian_exchange: "共勉", - kyouko_gongmian_info: - "①出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。②出牌阶段结束时,你可以获得一名其他角色区域内的至多X张牌,然后交给其等量的牌。③弃牌阶段开始时,若X不小于你的体力值,你可以获得一名手牌数少于你的角色的所有手牌,然后将手牌数的一半(向上取整)交给该角色。(X为你本回合内发动过〖共勉①〗的次数)", - key_tenzen: "加纳天善", - tenzen_yixing: "弈兴", - tenzen_yixing_info: - "当有角色因【杀】或【决斗】而受到伤害后,若其在你的攻击范围内或你在伤害来源的攻击范围内,你可以摸一张牌,然后将一张牌置于武将牌上,称为“兴”。当你成为其他角色使用【杀】或普通锦囊牌的唯一目标后,你可以获得一张“兴”,并可于此牌结算完成后弃置两张牌,视为对其使用一张名称相同的牌。", - //若对方为水织静久则无法触发〖弈兴〗 - tenzen_lingyu: "领域", - tenzen_lingyu_info: - "觉醒技,准备阶段,若你的“兴”不小于你的体力值,则你减1点体力上限并获得技能〖天全〗。若你以此法失去了体力,则你摸两张牌。", - tenzen_tianquan: "天全", - tenzen_tianquan_info: - "每回合限一次,当你使用【杀】或【决斗】指定唯一目标后,你可以移去两张“兴”并亮出牌堆顶的五张牌。这些牌中每有一张基本牌,响应此牌需要的【闪】/【杀】的数量便+1。此牌结算完成后,若此牌造成过伤害,则你获得这些牌中的非基本牌。", - key_kotarou: "天王寺瑚太朗", - kotarou_aurora: "丝刃", - kotarou_aurora_info: - "锁定技,当扣减体力或增加体力上限后,若你的装备区内:有武器牌,你视为使用一张【杀】;没有武器牌,你使用牌堆中的一张不为赠物的武器牌。", - kotarou_rewrite: "改写", - kotarou_rewrite_damage: "改写", - kotarou_rewrite_recover: "改写", - kotarou_rewrite_sha: "改写", - kotarou_rewrite_block: "改写", - kotarou_rewrite_info: - "出牌阶段,你可选择:①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌;②移动场上的一张牌;③增加1点体力上限并失去1点体力(体力上限至多为5);④下一次造成的伤害+1;⑤下一次回复的体力值+1;⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次,则你令此技能失效,且于回合结束后将体力上限降至3点,失去〖丝刃〗和〖改写〗。", - key_kyou: "藤林杏", - kyou_zhidian: "掷典", - kyou_zhidian_info: - "你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。", - kyou_duanfa: "断发", - kyou_duanfa_info: - "限定技,当你受到伤害时,若伤害值不小于你的体力值,则你可弃置所有手牌,防止此伤害并回复1点体力;且当你于你的下回合开始前成为【杀】或伤害性锦囊牌的目标后,你摸一张牌。", - key_seira: "樱庭星罗", - seira_xinghui: "星辉", - seira_xinghui_info: - "准备阶段,你可以投掷一枚骰子,观看牌堆顶的X张牌(X为投掷点数)并以任意顺序扣置于一名没有“星屑”的角色的武将牌上,称为“星屑”。有“星屑”的角色造成的伤害+1,且当其从牌堆顶摸牌或取得判定牌时,改为从“星屑”中获取。", - seira_yuanying: "缘映", - seira_yuanying_info: - "出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。", - seira_yinyuan: "姻缘", - seira_yinyuan_info: - "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。", - key_kiyu: "露娜Q", - kiyu_yuling: "玉灵", - kiyu_yuling_info: - "锁定技。你不是有距离限制的锦囊牌的合法目标;你成为【杀】的目标后,使用者需弃置X张牌(X为其至你的距离)。", - kiyu_xianyu: "先预", - kiyu_xianyu_info: - "每轮限一次。一名角色的出牌阶段开始时,你可观看其手牌并预测其使用这些牌的顺序。此出牌阶段结束时,你摸X张牌,且其本回合的手牌上限+X(X为你的预测与其实际使用顺序的吻合数且至多为3)。", - kiyu_rexianyu: "先预", - kiyu_rexianyu_info: - "每轮限一次。出牌阶段结束时,你可以选择一名其他角色。该角色于下个出牌阶段内使用第X张牌时,其可以将一张牌当做你本阶段内使用的第X张基本牌或普通锦囊牌使用(X至多为3);若如此做,你摸一张牌,且其本回合的手牌上限+1。", - key_tomoyo: "坂上智代", - tomoyo_wuwei: "武威", - tomoyo_wuwei_info: - "①每回合每种花色限一次。你可以将一张手牌当做【杀】使用或打出。②当有角色使用【闪】后,若你在其攻击范围内,你可以对其使用一张【杀】(无距离限制)。", - tomoyo_zhengfeng: "整风", - tomoyo_zhengfeng_info: - "使命技。①准备阶段,你可以令攻击范围内的一名角色进行判定。若如此做,你获得如下效果直到下回合开始:你视为在该角色的攻击范围内,且当该角色使用与判定牌颜色相同的牌时,你摸一张牌。②失败:结束阶段,若你于本回合内未发动过〖整风①〗,则你可以减1点体力上限。你失去〖武威〗,摸两张牌并回复1点体力,然后获得〖长誓〗。", - tomoyo_changshi: "长誓", - tomoyo_changshi_info: - "锁定技。一名攻击范围内包含你的角色回复体力后,你获得1点护甲;一名攻击范围内包含你的角色一次性获得至少两张牌后,你摸一张牌。", - key_minagi: "远野美凪", - minagi_peiquan: "配券", - minagi_peiquan_info: - "锁定技。①游戏开始时,你将你所有的手牌记录为“米券”。②出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。", - minagi_huanliu: "幻流", - minagi_huanliu_info: - "准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”。", - key_michiru: "远野小满", - michiru_sheyuan: "舍愿", - michiru_sheyuan_info: - "每轮限一次。若你没有“米券”,则你可以将所有手牌当做任意基本牌或普通锦囊牌使用,然后摸等量的牌。", - minagi_tag: "米券", - - noname: "小无", - noname_zhuyuan: "祝愿", - noname_zhuyuan_info: - "①每回合每名角色限一次。出牌阶段,你可以将四张花色各不相同的牌交给一名其他角色。你与其获得技能〖铁骑〗和〖激昂〗至各自的回合结束。②锁定技,若你于当前回合内:未发动过〖祝愿〗,则你使用牌无次数限制;发动过〖祝愿〗,则你使用牌无距离限制。", - noname_duocai: "多彩", - noname_duocai_info: - "每回合限一次。其他角色区域内的牌因弃置而进入弃牌堆后,你可以获得之。若你以此法得到的牌数:大于2,你弃置一名角色区域内的一张牌;等于2,你摸一张牌;小于2,你回复1点体力。", - ns_huangchengyan: "黄承彦", - nslongyue: "龙岳", - nslongyue_info: "当一名角色使用锦囊牌时,若此牌是其本回合内使用的第一张牌,则你可令其摸一张牌。", - nszhenyin: "阵引", - nszhenyin_info: "每回合限一次。一名角色的判定牌生效前,你可令当前回合角色打出一张手牌代替之。", - ns_sunchensunjun: "孙綝孙峻", - nsxianhai: "险害", - nsxianhai_info: - "每轮限一次,当一名其他角色于回合内造成伤害后,若其此回合内造成过的伤害总和大于你上一回合内造成的伤害总和,则你可以减1点体力上限,令其废除一种装备栏并弃置手牌中所有的【闪】。若〖兴黜〗已发动,此回合结束后视为该限定技未发动过。", - nsxingchu: "兴黜", - nsxingchu_info: - "限定技,当你杀死一名角色/你死亡时,你可以令一名角色获得其/你的所有牌并增加1点体力上限。", - ns_yuanxi: "袁熙", - nsshengyan: "盛筵", - nsshengyan3: "盛筵", - nsshengyan_info: - "锁定技,你的判定牌生效后,若结果花色与你本回合内其他判定结果的花色均不同,则你令当前回合角色本回合的手牌上限+2。", - nsdaizhan: "怠战", - nsdaizhany: "怠战", - nsdaizhan_info: - "准备阶段,你可以将一张非锦囊牌当做【兵粮寸断】或【乐不思蜀】对自己使用。若如此做,回合结束时,你将手牌摸至手牌上限。", - ns_caoshuang: "曹爽", - nsjiquan: "集权", - nsjiquan_mark: "集权", - nsjiquan_info: - "与你距离1以内的其他角色造成或受到伤害后,你可以将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。", - nsfuwei: "附位", - nsfuwei_info: - "觉醒技,结束阶段开始时,若“威”数大于4,则你加2点体力上限,获得〖喋谋〗和〖制皇〗,并将〖集权〗改为锁定技。", - nsdiemou: "喋谋", - nsdiemou_info: - "锁定技,出牌阶段开始时,若“威”大于全场角色数,你移去所有“威”,减1点体力上限并摸X张牌。若X大于4,你翻面。(X为移去的“威”数)", - nszhihuang: "制皇", - nszhihuang_damage: "制皇", - nszhihuang_info: - "每回合限一次,当主公使用牌时,你可以移去一张“威”,然后获得此牌。锁定技,若你的手牌数大于主公,则你使用牌造成的伤害+1。", - ns_chentai: "陈泰", - nsweiyuan: "围援", - nsweiyuan_use: "围援", - nsweiyuan_use_backup: "围援", - nsweiyuan_info: - "出牌阶段限一次,当你使用牌指定其他角色A为唯一目标后,你可以令一名除该角色外的其他角色B选择一项:①交给A一张牌:然后你对B造成1点伤害;②你摸一张牌,且可以将一张手牌当做本回合使用过的一张基本牌/普通锦囊牌使用(无次数距离限制)。", - nsjuxian: "据险", - nsjuxian2: "据险", - nsjuxian_info: - "当你受到伤害时,你可以摸两张并跳过下一个摸牌阶段,且在此之前不能再次发动〖据险〗。然后若你的手牌数不小于体力上限,则伤害来源弃置一张牌。", - ns_huangwudie: "黄舞蝶", - nsdiewu: "蝶舞", - nsdiewu_info: - "当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】或【闪】。当你以此法使用【杀】造成伤害后,则你摸一张牌。", - nslingying: "灵影", - nslingying_info: "锁定技,你使用【杀】无距离限制,且你使用【杀】的次数上限+1。", - nspojian: "破茧", - nspojian_info: - '觉醒技,准备阶段,若你的"蝶舞"标记的数量不小于你的体力值,则你减1点体力上限并摸两张牌,删除〖蝶舞〗中使用【闪】的部分并获得技能〖烈弓〗。', - ns_sunyi: "孙翊", - nsguolie: "果烈", - nsguolie2: "果烈", - nsguolie_info: - "摸牌阶段开始前,你可跳过此阶段。若如此做,你的红色牌均视为【杀】,黑色牌均视为【过河拆桥】且均无视距离与次数直到回合结束,且结束阶段,你获得本回合从你以外的区域内进入弃牌堆的所有牌。", - ns_zhangning: "张宁", - nsfuzhou: "符咒", - nsfuzhou_card: "符咒", - nsfuzhou_card_info: - "此牌不可被【无懈可击】响应。若判定结果为:黑色,你受到使用者造成的1点雷属性伤害且弃置一张牌;红色,使用者摸两张牌,且你本回合的手牌上限-1。", - nsfuzhou_num: "符咒", - nsfuzhou_info: - "出牌阶段限一次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限减1。", - nsguidao: "鬼道", - nsguidao_info: "一名角色的判定牌生效前,你可以打出一张黑色牌替换之。", - nstaiping: "太平", - nstaiping_info: - "觉醒技。准备阶段,若你:已因〖符咒〗造成了两次或更多的伤害,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·邪〗;若你已因〖符咒〗摸了两次或更多的牌,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·正〗。", - nsfuzhou_damage: "符咒·邪", - nsfuzhou_damage_info: - "出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限-1。", - nsfuzhou_draw: "符咒·正", - nsfuzhou_draw_info: - "出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。", - ns_yanghu: "羊祜", - nsbizhao: "避召", - nsbizhao2: "避召", - nsbizhao_info: - "隐匿技,锁定技,当你于回合外明置此武将牌后,其他角色计算与你的距离+1直至你的回合开始。", - nsqingde: "清德", - nsqingde_info: - "每回合限一次,当你使用【杀】或普通锦囊牌对其他角色造成伤害后,你可使用该牌与受到伤害的角色拼点。你可令输的角色摸两张牌;当你受到其他角色使用【杀】或普通锦囊牌造成的伤害后,可使用该牌与伤害来源拼点。你可令赢的角色回复1点体力。", - nsyidi: "遗敌", - nsyidi_info: - "出牌阶段限一次,你可展示一张手牌,然后将其交给一名其他角色。若为基本牌,该角色可使用此牌;若不为基本牌,你摸一张牌。", - - diy_wenyang: "文鸯", - ns_zhangwei: "张葳", - nshuaishuang: "怀霜", - nshuaishuang_info: "锁定技,结束阶段,你从牌堆/弃牌堆获得一张【桃】,然后失去1点体力。", - nsfengli: "奉礼", - nsfengli2: "奉礼", - nsfengli_draw: "奉礼", - nsfengli_clear: "奉礼", - nsfengli_use: "奉礼", - visible_nsfengli: "奉礼", - nsfengli_info: - "回合结束时,你可以选择一名其他角色并展示所有手牌直到你的下回合开始。当该角色于回合外需要使用或打出牌时,其可暗置你的一张明置手牌,然后视为使用或打出之。当你的明置手牌减少时,你可令一名手牌数小于你的角色摸一张牌。", - nsqiyue: "骑钺", - nsqiyue_info: "锁定技,当有角色的武将牌状态改变后,你摸一张牌。", - nsxuezhu: "血逐", - nsxuezhu_info: "当你受到伤害或造成伤害后,你可以令受到伤害的角色摸两张牌并翻面。", - ns_chuanshu: "传术", - ns_chuanshu_info: - "限定技 当一名其他角色进入濒死状态时,你可以令其选择获得技能〖雷击〗或〖鬼道〗,其回复体力至1并摸两张牌。当该被【传术】的角色造成或受到一次伤害后,你摸一张牌。其阵亡后,你重置技能〖传术〗。", - ns_xiandao1: "仙道", - ns_xiandao1_info: - "锁定技 游戏开始和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段开始。", - ns_xiandao2: "仙道", - ns_xiandao2_info: "锁定技 你防止受到任何属性伤害。", - ns_xiandao: "仙道", - ns_xiandao_info: - "锁定技 游戏开始、你进入游戏时和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段阶段开始。你防止受到任何属性伤害。", - ns_chuanshu2: "术", - ns_chuanshu2_info: "锁定技 当你造成或受到一次伤害后,南华老仙摸一张牌。", - ns_chuanshu3: "术", - ns_chuanshu3_info: - "锁定技 当你【传术】的角色阵亡后,你重置技能〖传术〗。", - ns_xiuzheng: "修真", - ns_xiuzheng_info: - "出牌阶段限一次,你可选择一名其他角色,然后亮出牌堆顶的两张牌,若同为红色,则其受到1点火焰伤害;若同为黑色,其受到1点雷电伤害;若颜色不相同,你弃置其一张牌。然后你获得这两张展示的牌后再弃置两张牌。", - nsanruo: "暗弱", - nsanruo_info: - "锁定技,你手牌中的【杀】和普通锦囊牌(借刀杀人等带有指向目标的锦囊除外)均对你不可见。但你可以正常使用之。", - nsxunshan: "循善", - nsxunshan_info: "锁定技,你使用【暗弱】牌可以为其指定任意名合法目标(托管无效)。", - nskaicheng: "开城", - nskaicheng_info: - "主公技,你的回合内,你可以将一张【暗弱】牌交给一名群势力其他角色观看,其可以选择是否告诉你此牌的名字。然后你选择一项:使用这张牌并摸一张牌;或结束此回合。", - nsjuanli: "狷戾", - nsjuanli_info: - "出牌阶段限一次,你可以和一名有手牌的其他角色进行赌牌,若你赢,目标角色失去1点体力且该角色与你距离-1直到与你下次赌牌,若你没赢,目标角色回复1点体力,且该角色与你距离+1直到与你的下次赌牌。(赌牌:赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次亮出牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利)", - nsyuanchou: "远筹", - nsyuanchou_info: "锁定技,当你成为锦囊牌的目标时,若来源角色与你的距离大于1,则取消之。", - nsguhuo: "蛊惑", - nsguhuo_info: - "锁定技,你在一个回合中使用前两张牌时,你对一名随机角色从牌堆(牌堆无则从弃牌堆)随机使用一张同类别卡牌。", - nsqinxue: "勤学", - nsqinxue_info: - "每个效果每回合只能使用一次。①当你使用一张基本牌时,你从牌堆随机获得一张锦囊牌;②当你使用一张锦囊牌时,你从牌堆随机获得一张装备牌;③当你使用一张装备牌时,你从牌堆随机获得一张基本牌。", - nsbaiyi: "白衣", - nsbaiyi_info: - "锁定技,若你本回合发动过勤学,你跳过弃牌阶段,改为弃置X张牌(X为本回合发动勤学次数);若你弃置了3张类别不同的牌,你获得一个额外回合(不可连续获得回合),否则你观看牌堆顶的X张牌并获得其中一张。", - nsbaiming: "百鸣", - nsbaiming_info: - "当你使用【杀】时,你可以获得一项未获得过且与杀或伤害相关的技能,此【杀】结算完毕后,你失去以此法获得的技能。", - nsfuge: "覆戈", - nsfuge_info: - "你的回合结束后,你可以执行一个额外的回合,此回合的摸牌阶段,你于摸牌阶段额外摸X张牌(X为你已损失的体力值);若如此做,直到洗牌前,你不能再发动此技能。", - nstanbing: "谈兵", - nstanbing_info: - "摸牌阶段开始时,你可弃置一张手牌,然后摸X张牌(X为你弃置牌的名称字数),若如此做,本回合你不可使用或打出【杀】。", - nsxinzhan: "心战", - nsxinzhan_info: - "出牌阶段限一次,你可将任意张手牌交给一名其他角色,若如此做,该角色失去X点体力(X为你交给其的牌张数的一半,向下取整),若你给的牌达到六张,则改为该角色失去1点体力上限。", - nsfuhuo: "符火", - nsfuhuo2: "符火", - nsfuhuo_info: - "出牌阶段限一次,你可将一张手牌置于一名武将牌上没有“符”的角色的武将牌上,称为“符”,若如此做,其回合外使用或打出【闪】时,你可令其判定,若结果为:红桃,你对其造成2点火焰伤害;方块,你弃置其一张手牌,然后对其造成1点火焰伤害。你的下个回合开始时,你获得其武将牌上的“符”。", - nswangfeng: "望风", - nswangfeng_info: "在判定牌生效前,你可以打出一张红色牌替换之。", - nshunji: "混击", - nshunji_info: - "出牌阶段限一次,你可以摸一张牌,视为使用一张【万箭齐发】。此【万箭齐发】造成伤害时,受伤害角色选择一项:①弃置你一张牌;②摸一张牌。", - nscuanquan: "篡权", - nscuanquan_info: "锁定技,如果你的身份为忠臣,则在受伤三次后与主公,互换身份和体力上限。", - nsjianning: "奸佞", - nsjianning_info: - "出牌阶段限一次,如果你的身份为内奸,你可以与一名手牌数比你少的角色交换手牌,并对其造成1点伤害。", - nschangshi: "常仕", - nschangshi_info: - "出牌阶段限一次,如果你的身份为反贼,你可以指定两名其他角色互换体力;如果两名角色体力之差等于1,你失去1点体力。", - nsbaquan: "霸权", - nsbaquan_info: - "回合结束时,你可以弃置所有手牌,并获得相应点数的护甲,你的新一回合开始时清除所有护甲。", - nsbugua: "卜卦", - nsbugua_use_info: - "弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数随机获得牌堆中相应的一张牌。", - nsbugua_info: - "出牌阶段限一次,你可以弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数按以下规则随机获得牌堆中相应的一张牌:乾(红桃偶数):无中生有;坤(黑桃奇数):决斗;震(黑桃偶数):南蛮入侵;巽(红桃奇数):万箭齐发;坎(梅花偶数):过河拆桥、兑(梅花奇数):借刀杀人、艮(方片偶数):顺手牵羊、离(方片奇数):火攻。若牌堆中无此牌则摸一张牌,然后你观看未展示的另外五张牌并按任意顺序将其置于牌堆顶。", - nstuiyan: "推演", - nstuiyan_info: - "出牌阶段,若你使用的牌点数比上一张使用的牌点数大,你可以摸一张牌,反之你本回合不能再以此法摸牌;当你使用的牌点数首次达到8的倍数时,你可以在结算后立即发动一次【卜卦】。", - nstianji: "天机", - nstianji_info: - "限定技,当一名其他角色进入濒死状态,你可自减1点体力上限,令其回复体力至1并增加1点体力上限。", - nszhaoxin: "昭心", - nszhaoxin_info: "锁定技,你始终展示手牌。", - nsxiuxin: "修穆", - nsxiuxin_info: "锁定技,若你没有某种花色的手牌,你不能成为这种花色的牌的目标。", - nsshijun: "弑君", - nsshijun_info: "锁定技,你造成伤害时,你令此伤害+1,并在结算后失去1点体力。", - nshunyou: "魂佑", - nshunyou_info: - "出牌阶段限一次,你可以弃置一张基本牌,获得弃牌堆底的一张装备牌和一张锦囊牌,然后你可以将那张装备牌装备给一名角色(允许替换)。如果弃牌堆没有装备以及锦囊牌,则改为摸X张牌,X为你已损失的体力值+1(最多3张)。", - nswulie: "武烈", - nswulie_info: - "限定技,准备阶段,你可以失去1点体力上限,从弃牌堆选择最多三张牌以任意顺序放置于牌堆顶。若如此做,此回合的结束阶段,你可以重复此操作。", - nscangxi: "藏玺", - nscangxi2: "藏玺", - nscangxi_info: - "主公技,其他吴势力角色的弃牌阶段结束时,若其弃置了至少两张牌,则可以选择判定,若是黑色,则其选择一项,1,令主公摸一张并且展示;2,主公手牌上限永久加一;3,额外弃置一张牌,令主公获得本回合进入弃牌堆的一张牌。", - nsdongcha: "洞察", - nsdongcha_info: - "锁定技,单体锦囊牌无法对你造成伤害。其它角色于其回合内第二次使用锦囊牌指定你为目标时,取消之。", - nscaijian: "才鉴", - nscaijian_info: - "出牌阶段限一次,若你的手牌数不大于你的体力上限,则你可以展示你的手牌,观看牌堆顶相同数量的牌并以任意方式交换之。", - nsgongjian: "恭俭", - nsgongjian_info: "锁定技,弃牌阶段,你须将弃牌交给一名体力值大于你的其它角色。", - nsjianxiong: "奸雄", - nsjianxiong_info: - "当你成为一名角色牌的目标后你可以对该角色使用一张牌,若此牌对其造成伤害,则该角色的牌失效。若失效的为黑色牌,则你摸一张牌。", - nsxionglue: "雄略", - nsxionglue_info: "出牌阶段限一次,你可以弃置一张黑色手牌,然后发现一张锦囊牌。", - nsyaowang: "妖妄", - nsyaowang_info: - "回合开始阶段你可以选择一名角色然后获得其其中一项技能直到回合结束,然后该角色随机获得一项未上场武将的其中一项技能直到其回合结束。", - nshuanhuo: "幻惑", - nshuanhuo_info: - "每当你失去1点体力或受到一次大于2的伤害时,你可以交换除你之外的两名角色的武将牌(体力及体力上限不变)。", - nsjianshu: "剑术", - nsjianshu_info: - "锁定技:每当你的装备区有武器时,你使用【杀】指定一个目标后,该角色需要依次使用两张【闪】才能抵消此【杀】。", - nscangjian: "藏剑", - nscangjian_info: "每当你对一名角色造成伤害,你可以获得其装备区一张牌。", - nsyunxing: "陨星", - nsyunxing_info: - "锁定技,当场上一名角色死亡,若为蜀,你失去1点体力;若为吴,你回复1点体力;若为魏,你摸一张牌并弃置一名角色的手牌;若为群,你强制结束当前回合;若为你,你可以使一名角色翻面。", - nsguanxing: "观星", - nsguanxing_info: - "锁定技,准备阶段,你观看牌堆的X张牌(X为场上存活人数)并且任意移动Y张牌(Y为你当前体力值)。", - nscaiyi: "猜疑", - nscaiyi_info: - "其他角色摸牌后,你可以观看其摸到的牌,若其中有【杀】,则视为你对其使用一张【杀】,若其中没有【杀】,则视为其对你使用一张【杀】(计入出杀次数)。", - nsgefa: "割发", - nsgefa_info: "当你的体力值等于0或更低时,你可以将任意一张♣牌当【桃】使用。", - nshaoling: "号令", - nshaoling_info: - "限定技,出牌阶段,你可以指定一名其他角色,令另外所有其他角色角色选择一项:1、对该角色使用一张【杀】;2、交给你一张牌,然后视为你对其使用一张【杀】。", - nspinmin: "拼命", - nspinmin_info: - "锁定技,当你于回合内死亡时,你不死亡并增加1点体力上限(每回合最多增加1点且不能超过4);当你于回合外死亡时,你不死亡并减少1点体力上限(体力上限为0会导致你死亡)。", - nsshishou: "失手", - nsshishou_info: - "锁定技,当你于回合内失去手牌时,你失去1点体力并摸一张牌;你回合内使用的牌数不能超过4。", - nsduijue: "对决", - nsduijue_info: - "出牌阶段开始时,你可以弃置一张手牌,若如此做,此阶段你可以将一张与此牌颜色不同的手牌当作【决斗】使用(限2次)。", - nsshuangxiong: "双雄", - nsshuangxiong_info: "当你使用【决斗】或被使用【决斗】时,你可以将武将牌翻面。", - nsshuangxiong_append: "背面武将:文丑,2体力,你可以将一张牌当【杀】打出。", - nsguanyong: "冠勇", - nsguanyong_info: "你可以将一张手牌当【杀】打出。", - nsjihui: "急恚", - nsjihui_info: - "锁定技,每当一名角色一次弃置了三张或更多的牌,你获得一个额外回合;你的额外回合内,你使用牌只能指定你与上一回合角色为目标。", - nsmouyun: "谋运", - nsmouyun_info: - "每两轮限一次,你可以弃置场上体力值最少的一名其他角色区域内的X张牌。(X为其损失的体力值)", - nscongjun: "从军", - nscongjun_info: - "锁定技,游戏开始时,你变身为一名随机男性角色;当一名敌方角色使用无懈可击时,你有小概率亮出此武将并变回花木兰,然后对该角色造成2点伤害。", - nshuanxian: "幻仙", - nshuanxian_info: - "锁定技,游戏开始时,你获得随从“幻身·右”,当你首次受到伤害时,你获得随从“幻身·左”(体力上限2,初始手牌2);你与幻身在摸牌阶段均少摸一张牌;在你的回合中(如果有对应幻身),你以【幻身·左-本体-幻身·右】的顺序进行3个连续回合。", - nstaiping_nh: "太平", - nstaiping_nh_info: - "当你受到1点伤害后(首次伤害除外),你可以选择一项: ①令一个“幻身”增加1点体力上限。②令一个“幻身”回复1点体力。", - nsshoudao: "授道", - nsshoudao_info: - "当左右“幻身”全部死亡时,你获得技能“雷击”和“鬼道”。当你死亡时,若此时有两个“幻身”,你可以令一名其他角色获得技能“雷击”和“鬼道”。若有一个“幻身”,你可以令一名其他角色获得技能“雷击”或“鬼道”。(杀死你的角色除外)", - nsnongquan: "弄权", - nsnongquan_info: "出牌阶段,你可以将最后一张手牌当作【无中生有】使用。", - nsdufu: "毒妇", - nsdufu_info: "每当你即将造成一次伤害时,你可以为此伤害重新指定伤害来源。", - yiesheng: "回雪", - yiesheng_info: "出牌阶段,你可以弃置任意数量的黑色手牌,然后摸等量的牌。", - liangji: "环计", - liangji_info: - "出牌阶段限一次,你可以选择一名未以此法放置牌的其他角色并将一张手牌置于其武将牌上。目标角色于摸牌阶段开始时,获得此牌。若其为男性角色,则获得技能〖无双〗,若其为女性角色,则获得技能〖离间〗,直到回合结束。", - chengmou: "逞谋", - chengmou_info: - "摸牌阶段开始时,若你有“功”牌,你获得之并跳过摸牌阶段,若你所获得的“功”牌多于两张,你须失去1点体力。", - jugong: "居功", - jugong_info: - "回合外每名角色的回合限一次,每当场上有角色因受到【杀】或【决斗】造成的伤害,你可以摸一张牌并且将一张手牌置于你的武将牌上,称之为“功”。在你即将受到伤害时,你可以弃置两张“功”,防止此伤害。", - nsxinsheng: "新生", - nsxinsheng_info: - "每当你对其他角色造成伤害后,若你未受伤,则你可以增加X点体力上限并摸X张牌,X为伤害点数。", - nsdunxing: "遁形", - nsdunxing_info: - "每当你即将受到其他角色造成的伤害时,若你已受伤,则你可以防止此伤害,改为失去X点体力上限并摸X张牌,X为伤害点数。", - liangce: "粮策", - liangce_info: - "①出牌阶段限一次,你可以将一张基本牌当【五谷丰登】使用。②当因执行【五谷丰登】的效果而亮出的牌因效果执行完毕而置入弃牌堆后,你可以选择一名角色,令该角色获取之。", - jianbi: "坚壁", - jianbi_info: "当你成为锦囊牌的目标时,若此牌的目标包括其他角色,你可以令此牌对1个目标无效。", - diyjuntun: "军屯", - diyjuntun_info: "出牌阶段,你可以重铸装备牌。", - choudu: "筹度", - choudu_info: "出牌阶段限一次,你可以弃置一张牌,并指定一名角色视为其使用一张调兵遣将。", - liduan: "立断", - liduan_info: - "当一名其他角色于其回合外得到牌后,若其此次得到的牌数为1且为装备牌(无论是否可见),你可以令该角色选择一项:1.使用此牌;2.将一张手牌交给你。", - fuchou: "负仇", - fuchou2: "负仇", - fuchou_info: - "当你成为【杀】的目标时,你可以将一张牌交给此【杀】的使用者,令此【杀】对你无效且你到其的距离于当前回合内视为1,若如此做,此回合的结束阶段开始时,其令你摸一张牌,然后你需对其使用【杀】,否则失去1点体力。", - jinyan: "噤言", - jinyan_info: "锁定技。若你的体力值不大于2,你的黑色锦囊牌视为【杀】。", - chezhen: "车阵", - chezhen_info: "锁定技。若你的装备区里:没有牌,你的防御距离+1;有牌,你的进攻距离+1。", - youzhan: "诱战", - youzhan_info: - "当以你距离不大于1的角色为目标的【杀】的使用结算开始时,你可以弃置一张装备牌,令该角色视为使用【诱敌深入】。", - kangyin: "亢音", - kangyin2: "亢音", - kangyin_info: - "出牌阶段限一次,你可以失去1点体力并选择一名其他角色,弃置该角色的一张牌。若此牌:为基本牌,你可以令一至X名角色各摸一张牌;不为基本牌,于此回合内:你的进攻距离+X,且你使用【杀】的额外目标数上限+X。(X为你已损失的体力值)", - zhucheng: "筑城", - zhucheng2: "筑城", - zhucheng_info: - "①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此杀的使用者弃置X张牌(X为“筑”的数量),否则杀对你无效。", - duoqi: "夺气", - duoqi_info: - "当一名角色于除你之外的角色的出牌阶段内因弃置而失去牌后,你可以移去一张“筑”,并结束此出牌阶段。", - - siji: "伺机", - ciqiu: "刺酋", - ciqiu_dying: "刺酋", - diy_liuyan: "刘焉", - juedao: "绝道", - geju: "割据", - shaoying: "烧营", - zonghuo: "纵火", - diychanyuan: "缠怨", - diyguhuo: "蛊惑", - jieyan: "劫焰", - honglian: "红莲", - xiongzi: "雄姿", - luweiyan: "围堰", - guihan: "归汉", - diyduanliang: "断粮", - diyduanliang1: "断粮", - diyduanliang2: "断粮", - diyqiangxi: "强袭", - diykuanggu: "狂骨", - diyzaiqi: "再起", - batu: "霸图", - zaiqix: "再起", - diy_jiaoxia: "皎霞", - yaliang: "雅量", - yaliang_info: - "每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。", - diy_jiaoxia_info: "每当你成为红色牌的目标,你可以摸一张牌。", - zaiqix_info: - "摸牌阶段,若你已受伤,你可以改为亮出牌堆顶的X+1张牌,X为你已损失的体力值,其中每有一张♥牌,你回复1点体力,然后弃掉这些♥牌,将其余的牌收入手牌。", - batu_info: "结束阶段,你可以将手牌数补至X,X为现存的势力数。", - diyzaiqi_info: "锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值。", - diykuanggu_info: "锁定技,每当你造成1点伤害,你在其攻击范围内,你回复1点体力,否则你摸一张牌。", - diyqiangxi_info: - "出牌阶段,你可以自减1点体力或弃一张武器牌,然后你对你攻击范围内的一名角色造成1点伤害并弃置其一张牌,每回合限一次。", - diyduanliang_info: - "出牌阶段限一次,你可以将一张黑色的基本牌当兵粮寸断对一名角色使用,然后摸一张牌。你的兵粮寸断可以指定距离2以内的角色作为目标。", - guihan_info: "限定技,当你进入濒死状态时,可以指定一名男性角色与其各回复1点体力并摸两张牌。", - luweiyan_info: - "出牌阶段限一次,你可以将一张非基本牌当作水攻使用;结算后你可以视为对其中一个目标使用一张不计入出杀次数的【杀】。", - xiongzi_info: "锁定技,你于摸牌阶段额外摸X+1张牌,X为你装备区牌数的一半,向下取整。", - honglian_info: "每当你受到来自其他角色的伤害,可以弃置伤害来源的所有红色牌。", - jieyan_info: "出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到1点火焰伤害。", - diyguhuo_info: "锁定技,准备阶段,你摸两张牌,然后弃置区域内的两张牌。", - diychanyuan_info: "锁定技,杀死你的角色失去1点体力上限。", - zonghuo_info: "你可弃置一张牌将你即将造成的伤害变为火焰伤害。", - shaoying_info: - "每当你造成一次火焰伤害,可指定距离受伤害角色1以内的另一名角色,并亮出牌堆顶的一张牌,若此牌为红色,该角色受到1点火焰伤害。", - juedao_info: - "出牌阶段,你可以弃置一张手牌,横置你的武将牌;锁定技,若你的武将牌横置,则你计算至其他角色的距离和其他角色计算至你的距离均+1。", - geju_info: "准备阶段开始时,你可以摸X张牌(X为攻击范围内不含有你的势力数)。", - siji_info: "弃牌阶段结束后,你可以摸2X张牌(X为你于此阶段内弃置的【杀】的数量)。", - ciqiu_info: - "锁定技,每当你使用【杀】对目标角色造成伤害时,若该角色未受伤,你令此伤害+1;若其因此进入濒死状态,你令其死亡,然后你失去“刺酋”。", - nsshuaiyan_info: - "每当其他角色于你的回合外回复体力后,你可以令该角色选择一项:1.令你摸一张牌;2.令你弃置其一张牌。", - moshou_info: "锁定技,你不能成为乐不思蜀和兵粮寸断的目标。", - xicai_info: "你可以立即获得对你造成伤害的牌。", - diyjianxiong_info: - "锁定技,在身份局中,在你回合内死亡的角色均视为反贼,国战中,在你回合内死亡的角色若与你势力相同则随机改为另一个势力。", - - ns_zanghong: "臧洪", - nsshimeng: "誓盟", - nsshimeng_info: - "出牌阶段限一次,你可以选择任意名角色。这些角色依次选择一项:⒈摸一张牌。⒉使用一张【杀】。然后若选择前者角色数大于选择后者的角色数,则你获得1点护甲并失去1点体力。", - ns_ruanji: "阮籍", - nsshizui: "酾醉", - nsshizui_info: - "每回合限一次。当你成为基本牌或普通锦囊牌的目标后,你可以弃置一张牌,然后视为使用一张【酒】。若你弃置的牌与其使用的牌花色相同,则此牌对你无效;若你弃置的牌为♣,则你获得其使用的牌。", - nsxiaoye: "啸野", - nsxiaoye_info: - "一名角色的结束阶段开始时,若你于当前回合内使用过【酒】,则你可以视为使用一张其于本回合内使用过的【杀】或普通锦囊牌。", - ns_limi: "李密", - nstuilun: "退论", - nstuilun_info: - "结束阶段,你可以失去任意点体力(至多失去至1点)并弃置任意张手牌(至多弃置至一张)。若如此做,你获得如下效果直到你下回合开始:其他角色的回合开始时,若你的体力值小于该角色,则你可以令一名角色回复或失去1点体力;若你的手牌数小于该角色,则你可以令一名角色摸一张牌或弃置一张牌。", - ns_zhonglimu: "钟离牧", - nskuanhuai: "宽怀", - nskuanhuai_info: - "出牌阶段开始时,你可以从弃牌堆中获得一张非基本牌。若如此做:你本阶段内不能使用基本牌,且本回合的弃牌阶段结束时,你可以依次使用本阶段内弃置的基本牌。", - nsdingbian: "定边", - nsdingbian_info: - "锁定技。当你于回合内使用锦囊牌或装备牌后,你令自己本回合的手牌上限-1且选择一项:⒈从牌堆获得一张基本牌。⒉令一种基本牌于本回合内不计入手牌上限。", - prp_zhugeliang_ab: "诸葛亮", - prp_zhugeliang: "派对浪客", - nsxingyun: "星陨", - nsxingyun_info: - "每回合限一次。你可以将一张手牌当做任意一张符合“四象天阵”的牌使用。然后若这两张牌的类型不同,则你删除此“四象天阵”并摸两张牌。当你删除“四象天阵”中的最后一个项目后,你获得技能〖八阵〗。", - nsxingyun_faq: "四象天阵", - nsxingyun_faq_info: - "青龙:无标签普通锦囊牌
    朱雀:延时锦囊牌
    白虎:伤害类卡牌
    玄武:【闪】/回复类卡牌", - nshanlang: "酣浪", - nshanlang_info: - "准备阶段,你可以和至多三名角色拼点。然后若这些角色中有拼点牌唯一最大的角色,则你可以令该角色从牌堆中获得一张不符合“四象天阵”的牌。", - - junktaoluan: "滔乱", - junktaoluan_backup: "滔乱", - junktaoluan_info: - "你可将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌,且每回合每种花色限一次),然后你令一名其他角色选择一项:1.交给你一张与“滔乱”声明的牌类别不同的牌;2.本回合“滔乱”失效且回合结束时你失去1点体力。", - ns_caimao: "蔡瑁", - nsdingzhou: "定州", - nsdingzhou_info: - "出牌阶段限一次,你可以选择一名区域内有牌的其他角色。你随机获得其区域内的一张牌,然后摸一张牌。若你以此法获得了两张颜色不同的牌,则你失去1点体力。", - junkyuheng: "驭衡", - junkyuheng_info: - '锁定技。①回合开始时,你须弃置任意张花色不同的牌,从东吴命运线·改中随机获得等量的技能。②回合结束时,你失去所有因〖驭衡①〗获得的技能,然后摸等量的牌。', - junkdili: "帝力", - junkdili_info: - "觉醒技。当你获得技能后,若你拥有的技能数大于你的体力上限,则你减1点体力上限,选择失去任意个其他技能,然后获得以下技能中的前等量个:〖圣质〗/〖权道〗/〖持纲〗。", - junkshengzhi: "圣质", - junkshengzhi_info: "锁定技。当你发动非锁定技后,你令你本回合使用的下一张牌无距离和次数限制。", - junkquandao: "权道", - junkquandao_info: - "锁定技。当你使用【杀】或普通锦囊牌时,{若你手牌中的【杀】或普通锦囊牌的数量之差X不为0,则你弃置X张数量较多的一种牌},然后你摸一张牌。", - junkchigang: "持纲", - junkchigang_info: - "转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。", - junkrende: "仁德", - junkrende_info: - "出牌阶段限一次,你可以将任意张手牌交给其他角色。若你给出的牌多于一张,则你回复1点体力。", - junkjizhi: "集智", - junkjizhi_info: - "当你使用非转化的普通锦囊牌时,你可以亮出牌堆顶的一张牌A。若A不为基本牌,则你获得A。否则你选择一项:⒈将A置入弃牌堆。⒉将一张手牌置于牌堆顶,然后获得A。", - junkqicai: "奇才", - junkqicai_info: "锁定技。①你使用锦囊牌无距离限制。②你装备区内的非坐骑牌不能被其他角色弃置。", - junkwangxi: "忘隙", - junkwangxi_info: - "当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可以摸两张牌,然后交给其其中一张牌。", - junkwangxi_tag: "invisible", - junklangmie: "狼灭", - junklangmie_info: - "其他角色的结束阶段开始时,你可以选择一项:⒈若其本回合内使用过某种类型的牌超过一张,则你弃置一张牌并摸两张牌。⒉若其本回合累计造成过的伤害大于1,则你弃置一张牌,然后对其造成1点伤害。", - junkshicai: "恃才", - junkshicai_info: - "当你使用牌结束完毕后,若此牌与你本回合使用的牌类型均不同,则你可以将此牌置于牌堆顶,然后摸一张牌。", - junk_zhangrang: "新杀张让", - junk_zhangrang_prefix: "新杀", - old_jiakui: "手杀贾逵", - old_jiakui_prefix: "手杀", - ol_guohuai: "OL郭淮", - ol_guohuai_prefix: "OL", - old_bulianshi: "RE步练师", - old_bulianshi_prefix: "RE", - ol_maliang: "OL马良", - ol_maliang_prefix: "OL", - junk_lidian: "OL李典", - junk_lidian_prefix: "OL", - junk_duanwei: "新杀段煨", - junk_duanwei_prefix: "新杀", - junk_xuyou: "手杀许攸", - junk_xuyou_prefix: "手杀", - junk_liubei: "旧界刘备", - junk_liubei_prefix: "旧界", - junk_huangyueying: "旧界黄月英", - junk_huangyueying_prefix: "旧界", - old_majun: "骰子马钧", - old_majun_prefix: "骰子", - ns_mengyou: "数学孟优", - ns_mengyou_prefix: "数学", - ns_mengyou_ab: "孟优", - nsmanzhi: "蛮智", - nsmanzhi_info: - "准备阶段或结束阶段开始时,你可以将场上出现的数字代入等式中的A和B。若此等式成立,你摸Y张牌。(等式为Y=0.5A2+2.5B-X,其中X为游戏轮数,Y为存活人数)", - ns_chengpu: "铁索程普", - ns_chengpu_prefix: "铁索", - ns_chengpu_ab: "程普", - ns_sundeng: "画饼孙登", - ns_sundeng_prefix: "画饼", - ns_sundeng_ab: "孙登", - ns_duji: "画饼杜畿", - ns_duji_prefix: "画饼", - ns_duji_ab: "杜畿", - junk_zhangjiao: "OL神张角", - junk_zhangjiao_prefix: "OL神", - junksijun: "肆军", - junksijun_info: - "准备阶段,若“黄”数大于牌堆的牌数,你可以移去所有“黄”,然后从牌堆中随机获得任意张点数之和为36的牌(若牌堆没有点数和为36的组合则获得牌堆顶点数和刚好超过36的牌组)。", - junk_guanyu: "旧谋关羽", - junk_guanyu_prefix: "旧谋", - - diy_tieba: "吧友设计", - diy_xushi: "玩点论杀·虚实篇", - diy_default: "常规", - diy_noname: "无名专属", - diy_key: "论外", - diy_yijiang: "设计比赛2020", - diy_yijiang2: "设计比赛2021", - diy_yijiang3: "设计比赛2022", - diy_fakenews: "杀海流言", - diy_trashbin: "垃圾桶", - }, - }; -}); diff --git a/character/diy/card.js b/character/diy/card.js new file mode 100644 index 000000000..ef431671b --- /dev/null +++ b/character/diy/card.js @@ -0,0 +1,57 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + nsfuzhou_card: { + fullskin: true, + type: "delay", + wuxieable: false, + modTarget(card, player, target) { + return lib.filter.judge(card, player, target); + }, + enable(card, player) { + return player.canAddJudge(card); + }, + filterTarget(card, player, target) { + return lib.filter.judge(card, player, target) && player == target; + }, + judge(card) { + if (get.color(card) == "red") return 0; + return -4; + }, + effect() { + var source = cards[0].storage.nsfuzhou_source; + if (!source || !source.isIn()) return; + source.line(player, "thunder"); + if (result.color == "black") { + player.damage(source, source.storage.nsfuzhou_damage ? 2 : 1, "thunder"); + player.chooseToDiscard("he", true); + } else { + source.draw(2); + if (typeof player.storage.nsfuzhou_num != "number") player.storage.nsfuzhou_num = 0; + if (source.storage.nsfuzhou_draw) { + player.recover(); + player.draw(); + player.storage.nsfuzhou_num++; + } else player.storage.nsfuzhou_num--; + player.addTempSkill("nsfuzhou_num"); + player.markSkill("nsfuzhou_num"); + } + }, + ai: { + basic: { + order: 1, + useful: 0, + value: 0, + }, + result: { + target: -1, + }, + tag: { + // damage:1, + // natureDamage:1, + // thunderDamage:1, + }, + }, + }, +}; +export default cards; diff --git a/character/diy/character.js b/character/diy/character.js new file mode 100644 index 000000000..5ee99c062 --- /dev/null +++ b/character/diy/character.js @@ -0,0 +1,121 @@ +const characters = { + noname: ["female", "key", 3, ["noname_zhuyuan", "noname_duocai"]], + + key_kud: ["female", "key", 3, ["kud_qiaoshou", "kud_buhui"]], + key_misuzu: ["female", "key", 3, ["misuzu_hengzhou", "misuzu_nongyin", "misuzu_zhongxing"]], + key_kamome: ["female", "key", 3, ["kamome_yangfan", "kamome_huanmeng", "kamome_jieban"]], + key_nao: ["female", "key", 3, ["nao_duyin", "nao_wanxin", "nao_shouqing"]], + key_yuuki: ["female", "key", 3, ["yuuki_yicha"]], + key_kotarou: ["male", "key", 3, ["kotarou_rewrite", "kotarou_aurora"]], + key_tenzen: ["male", "key", 4, ["tenzen_fenghuan", "tenzen_retianquan"]], + key_kyouko: ["female", "key", 3, ["kyouko_rongzhu", "kyouko_gongmian"]], + key_kyou: ["female", "key", 3, ["kyou_zhidian", "kyou_duanfa"]], + key_seira: ["female", "key", 3, ["seira_xinghui", "seira_yuanying"]], + key_kiyu: ["female", "key", 3, ["kiyu_yuling", "kiyu_rexianyu"]], + key_tomoyo: ["female", "key", 4, ["tomoyo_wuwei", "tomoyo_zhengfeng"]], + key_minagi: ["female", "key", 3, ["minagi_peiquan", "minagi_huanliu"]], + key_michiru: ["female", "key", 3, ["michiru_sheyuan"]], + + ns_huangchengyan: ["male", "shu", 3, ["nslongyue", "nszhenyin"]], + ns_sunchensunjun: ["male", "wu", 5, ["nsxianhai", "nsxingchu"]], + ns_yuanxi: ["male", "qun", 4, ["nsshengyan", "nsdaizhan"]], + ns_caoshuang: ["male", "wei", 4, ["nsjiquan", "nsfuwei"]], + ns_sunyi: ["male", "wu", 4, ["nsguolie"]], + ns_huangwudie: ["female", "shu", 4, ["nsdiewu", "nslingying", "nspojian"]], + ns_chentai: ["male", "wei", 4, ["nsweiyuan", "nsjuxian"]], + ns_zhangning: ["female", "qun", 3, ["nsfuzhou", "nsguidao", "nstaiping"]], + ns_yanghu: ["male", "jin", 3, ["nsbizhao", "nsqingde", "nsyidi"], ["hiddenSkill"]], + ns_zanghong: ["male", "qun", 4, ["nsshimeng"]], + ns_ruanji: ["male", "wei", 3, ["nsshizui", "nsxiaoye"]], + ns_limi: ["male", "jin", 3, ["nstuilun"]], + ns_zhonglimu: ["male", "wu", 4, ["nskuanhuai", "nsdingbian"]], + prp_zhugeliang: ["male", "shu", 3, ["nsxingyun", "nshanlang"]], + + ns_zhangwei: ["female", "shu", 3, ["nsqiyue", "nsxuezhu"]], + diy_wenyang: ["male", "wei", "4/6", ["lvli", "choujue"]], + // diy_caocao:['male','wei',4,['xicai','diyjianxiong','hujia']], + diy_hanlong: ["male", "wei", 4, ["siji", "ciqiu"]], + diy_feishi: ["male", "shu", 3, ["nsshuaiyan", "moshou"]], + diy_liuyan: ["male", "qun", 3, ["juedao", "geju"]], + // diy_luxun:['male','wu',3,['shaoying','zonghuo']], + diy_yuji: ["male", "qun", 3, ["diyguhuo", "diychanyuan"]], + // diy_zhouyu:['male','wu',3,['jieyan','honglian']], + // diy_zhouyu:['male','wu',3,['xiongzi','yaliang']], + diy_caiwenji: ["female", "qun", 3, ["beige", "guihan"]], + diy_lukang: ["male", "wu", 4, ["luweiyan", "qianxun"]], + // diy_xuhuang:['male','wei',4,['diyduanliang']], + // diy_dianwei:['male','wei',4,['diyqiangxi']], + // diy_huangzhong:['male','shu',4,['liegong','fuli']], + // diy_weiyan:['male','shu',4,['diykuanggu']], + diy_zhenji: ["female", "wei", 3, ["diy_jiaoxia", "yiesheng"]], + // diy_menghuo:['male','shu',4,['huoshou','zaiqix']], + //re_huangyueying:['female','shu',3,['rejizhi','qicai']], + + diy_liufu: ["male", "wei", 3, ["zhucheng", "duoqi"]], + diy_xizhenxihong: ["male", "shu", 4, ["fuchou", "jinyan"]], + diy_liuzan: ["male", "wu", 4, ["kangyin"]], + diy_zaozhirenjun: ["male", "wei", 3, ["liangce", "jianbi", "diyjuntun"]], + diy_yangyi: ["male", "shu", 3, ["choudu", "liduan"]], + diy_tianyu: ["male", "wei", 4, ["chezhen", "youzhan"]], + + ns_zuoci: ["male", "qun", 3, ["nsxinsheng", "nsdunxing"]], + ns_lvzhi: ["female", "qun", 3, ["nsnongquan", "nsdufu"]], + ns_wangyun: ["male", "qun", 4, ["liangji", "jugong", "chengmou"]], + ns_nanhua: ["male", "qun", 3, ["nshuanxian", "nstaiping_nh", "nsshoudao"]], + ns_nanhua_left: ["male", "qun", 2, [], ["unseen"]], + ns_nanhua_right: ["female", "qun", 2, [], ["unseen"]], + ns_huamulan: ["female", "qun", 3, ["nscongjun", "xiaoji", "gongji"]], + ns_huangzu: ["male", "qun", 4, ["nsjihui", "nsmouyun"]], + ns_jinke: ["male", "qun", 4, ["nspinmin", "nsshishou"]], + ns_yanliang: ["male", "qun", 4, ["nsduijue", "nsshuangxiong", "dualside"], ["dualside:ns_wenchou"]], + ns_wenchou: ["male", "qun", 2, ["nsguanyong", "dualside"], ["unseen"]], + + ns_caocao: ["male", "wei", 4, ["nscaiyi", "nsgefa", "nshaoling"]], + ns_caocaosp: ["male", "qun", 3, ["nsjianxiong", "nsxionglue"]], + ns_zhugeliang: ["male", "shu", 3, ["nsguanxing", "kongcheng", "nsyunxing"]], + ns_wangyue: ["male", "qun", 4, ["nsjianshu", "nscangjian"]], + ns_yuji: ["male", "qun", 3, ["nsyaowang", "nshuanhuo"]], + ns_xinxianying: ["female", "wei", 3, ["nsdongcha", "nscaijian", "nsgongjian"]], + ns_guanlu: ["male", "wei", 3, ["nsbugua", "nstuiyan", "nstianji"]], + ns_simazhao: ["male", "wei", 3, ["nszhaoxin", "nsxiuxin", "nsshijun"]], + ns_sunjian: ["male", "wu", 4, ["nswulie", "nshunyou", "nscangxi"]], + + ns_duangui: ["male", "qun", 3, ["nscuanquan", "nsjianning", "nschangshi", "nsbaquan"]], + ns_zhangbao: ["male", "qun", 3, ["nsfuhuo", "nswangfeng"]], + ns_masu: ["male", "shu", 3, ["nstanbing", "nsxinzhan"]], + ns_zhangxiu: ["male", "qun", 4, ["nsbaiming", "nsfuge"]], + ns_lvmeng: ["male", "wu", 3, ["nsqinxue", "nsbaiyi"]], + ns_shenpei: ["male", "qun", 3, ["nshunji", "shibei"]], + + ns_yujisp: ["male", "qun", 3, ["nsguhuo"]], + ns_yangyi: ["male", "shu", 3, ["nsjuanli", "nsyuanchou"]], + ns_liuzhang: ["male", "qun", 3, ["nsanruo", "nsxunshan", "nskaicheng"]], + // ns_zhaoyun:['male','qun',3,[]], + // ns_lvmeng:['male','qun',3,[]], + // ns_zhaoyunshen:['male','qun',3,[]], + // ns_lisu:['male','qun',3,[]], + // ns_sunhao:['male','qun',3,[]], + ns_xinnanhua: ["male", "qun", 3, ["ns_xiandao", "ns_xiuzheng", "ns_chuanshu"]], + ns_caimao: ["male", "qun", 4, ["nsdingzhou"]], + ns_luyusheng: ["female", "wu", 3, ["nshuaishuang", "nsfengli"]], + ns_chengpu: ["male", "wu", 4, ["decadelihuo", "decadechunlao"]], + ns_sundeng: ["male", "wu", 4, ["xinkuangbi"]], + ns_duji: ["male", "wei", 3, ["xinfu_andong", "xinyingshi"]], + old_majun: ["male", "wei", 3, ["xinfu_jingxie1", "xinfu_qiaosi"]], + ns_mengyou: ["male", "qun", 4, ["nsmanzhi"]], + + old_jiakui: ["male", "wei", 4, ["tongqu", "xinwanlan"]], + ol_guohuai: ["male", "wei", 3, ["rejingce"]], + junk_zhangrang: ["male", "qun", 3, ["junktaoluan"], ["sex:male_castrated"]], + old_bulianshi: ["female", "wu", 3, ["anxu", "zhuiyi"]], + ol_maliang: ["male", "shu", 3, ["zishu", "xinyingyuan"]], + junk_liubei: ["male", "shu", 4, ["junkrende", "jijiang"], ["zhu"]], + junk_huangyueying: ["female", "shu", 3, ["junkjizhi", "junkqicai"]], + junk_lidian: ["male", "wei", 3, ["xunxun", "junkwangxi"]], + junk_duanwei: ["male", "qun", 4, ["junklangmie"]], + junk_xuyou: ["male", "qun", 3, ["nzry_chenglve", "junkshicai", "nzry_cunmu"]], + junk_zhangjiao: ["male", "shen", 3, ["yizhao", "junksijun", "tianjie"], ["qun", "die_audio:shen_zhangjiao"]], + junk_guanyu: ["male", "shu", 4, ["olsbfumeng", "olsbguidao"]], +}; + +export default characters; diff --git a/character/diy/characterFilter.js b/character/diy/characterFilter.js new file mode 100644 index 000000000..685ecb85f --- /dev/null +++ b/character/diy/characterFilter.js @@ -0,0 +1,10 @@ +const characterFilters = { + ns_duangui(mode) { + return mode == "identity" && _status.mode == "normal"; + }, + diy_liuyan(mode) { + return mode != "chess" && mode != "tafang"; + }, +}; + +export default characterFilters; diff --git a/character/diy/characterReplace.js b/character/diy/characterReplace.js new file mode 100644 index 000000000..144fe6da7 --- /dev/null +++ b/character/diy/characterReplace.js @@ -0,0 +1,6 @@ +const characterReplaces = { + key_yuri: ["key_yuri", "sp_key_yuri"], + kanade: ["sp_key_kanade", "kanade"], +}; + +export default characterReplaces; diff --git a/character/diy/characterTitles.js b/character/diy/characterTitles.js new file mode 100644 index 000000000..0e8c18558 --- /dev/null +++ b/character/diy/characterTitles.js @@ -0,0 +1,64 @@ +export default { + key_kud: "#b千夜", + key_misuzu: "#b长发及腰黑长直", + key_kamome: "#b仿生纱", + key_nao: "#b潮鸣", + key_kyou: "#b长发及腰黑长直", + key_yuuki: "#b4399司命", + key_kyouko: "#b阿阿阿687", + key_tenzen: "#b皋耳击", + key_kotarou: "#bb1154486224", + key_seira: "#b阿开木木W🍀", + key_kiyu: "#b无面◎隐者", + key_tomoyo: "#b长发及腰黑长直", + key_minagi: "#b无面◎隐者", + + ns_huangchengyan: "#g竹邀月", + ns_sunchensunjun: "#gVenusjeu", + ns_yuanxi: "#g食茸二十四", + ns_caoshuang: "#g荬庀芬兰", + ns_chentai: "#g荀彧III荀文若", + ns_huangwudie: "#g你爸爸来了164", + ns_sunyi: "#g无民氏4251", + ns_zhangning: "#g如颍隋行1314", + ns_yanghu: "#ginCenv", + ns_ruanji: "#g伯约的崛起", + ns_zanghong: "#g阿七", + ns_limi: "#g-心若困兽-", + ns_zhonglimu: "#gJG赛文♠7", + prp_zhugeliang: "#g阿开木木W🍀", + + ns_luyusheng: "#g猫咪大院 - 魚と水", + ns_caimao: "#gP尔号玩家◆", + diy_wenyang: "#g最粗的梦想XD", + ns_zuoci: "#bskystarwuwei", + ns_lvzhi: "#bskystarwuwei", + ns_wangyun: "#rSukincen", + ns_guanlu: "#rSukincen", + ns_xinnanhua: "#rSukincen", + ns_nanhua: "#g戒除联盟", + ns_shenpei: "#g戒除联盟", + ns_huamulan: "#p哎别管我是谁", + ns_jinke: "#p哎别管我是谁", + ns_huangzu: "#r小芯儿童鞋", + ns_lisu: "#r小芯儿童鞋", + ns_yanliang: "#r丶橙续缘", + ns_wenchou: "#r丶橙续缘", + ns_caocao: "#r一瞬间丶遗忘", + ns_caocaosp: "#g希望教主", + ns_zhugeliang: "#p死不死什么的", + ns_xinxianying: "#b扶苏公子", + ns_zhangbao: "#b扶苏公子", + ns_wangyue: "#p废城君", + ns_sunjian: "#b兔子两只2", + ns_lvmeng: "#b兔子两只2", + ns_yujisp: "#b兔子两只2", + ns_yuji: "#g蔚屿凉音", + ns_simazhao: "#r一纸载春秋", + ns_duangui: "#b宝宝酱紫萌萌哒", + ns_masu: "#g修女", + ns_zhangxiu: "#p本因坊神策", + ns_yangyi: "#p本因坊神策", + ns_liuzhang: "#r矮子剑薄荷糖", + ns_mengyou: "#g残昼厄夜", +}; diff --git a/character/diy/dynamicTranslate.js b/character/diy/dynamicTranslate.js new file mode 100644 index 000000000..4ae216725 --- /dev/null +++ b/character/diy/dynamicTranslate.js @@ -0,0 +1,61 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + nsjiquan(player) { + if (player.storage.nsfuwei) return "锁定技,与你距离1以内的其他角色造成或受到伤害后,你将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。"; + return "与你距离1以内的其他角色造成或受到伤害后,你可以将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。"; + }, + abyusa_jueqing(player) { + if (player.storage.abyusa_jueqing_rewrite) return "锁定技,你即将造成的伤害均视为失去体力。"; + return "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。"; + }, + tomoya_shangxian(player) { + if (player.storage.tomoya_shangxian) return "锁定技,你计算与其他角色的距离时始终从顺时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。"; + return "锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。"; + }, + yui_lieyin(player) { + if (player.storage._ichiban_no_takaramono) return "锁定技,出牌阶段开始时,你可选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。"; + return "锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。"; + }, + yuzuru_kunfen(player) { + if (player.storage._yuzuru_sss) return "锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。"; + return "锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。"; + }, + yuzuru_quji(player) { + if (player.storage._yuzuru_sss) return "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)"; + return "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)"; + }, + kamome_jieban(player) { + if (player.storage.kamome_jieban) return '转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。'; + return '转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。'; + }, + shiroha_guying(player) { + var str = "当你受到伤害/对其他角色造成伤害时,你"; + if (!player.storage.shiroha_jiezhao) str = "锁定技,每回合限一次," + str; + if (player.storage.shiroha_jiezhao) str += "可"; + str += "进行判定。若结果为红色/黑色,此伤害-1/+1。"; + return str; + }, + nsdiewu(player) { + if (player.storage.nspojian) return "当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】。当你以此法使用【杀】造成伤害后,则你摸一张牌。"; + return "当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】或【闪】。当你以此法使用【杀】造成伤害后,则你摸一张牌。"; + }, + nsfuzhou(player) { + var str = "出牌阶段限"; + str += player.storage.nstaiping ? "两" : "一"; + str += "次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到"; + str += player.storage.nsfuzhou_damage ? "两" : "一"; + str += "点雷属性伤害并弃置一张牌;红色,你摸两张牌,"; + str += player.storage.nsfuzhou_draw ? "该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。" : "且该角色本回合手牌上限减1。"; + return str; + }, + nsguidao(player) { + if (player.storage.nstaiping) return "一名角色的判定牌生效前,你可以打出一张牌替换之。"; + return "一名角色的判定牌生效前,你可以打出一张黑色牌替换之。"; + }, + junkchigang(player) { + if (player.storage.junkchigang) return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。'; + return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。'; + }, +}; +export default dynamicTranslates; diff --git a/character/diy/index.js b/character/diy/index.js new file mode 100644 index 000000000..94e799a93 --- /dev/null +++ b/character/diy/index.js @@ -0,0 +1,36 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterTitles from "./characterTitles.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "diy", + connect: true, + connectBanned: ["diy_tianyu", "diy_yangyi", "diy_lukang", "ns_huamulan", "ns_yuji", "ns_duangui", "ns_liuzhang", "key_yuu"], + character: { ...characters }, + characterSort: { + diy: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: { ...characterTitles }, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/diy/intro.js b/character/diy/intro.js new file mode 100644 index 000000000..1f2dca147 --- /dev/null +++ b/character/diy/intro.js @@ -0,0 +1,20 @@ +const characterIntro = { + noname: "无名杀的吉祥物。
    画师:空城
    技能设计:李木子", + diy_hanlong: "韩龙,魏国刺客。他孤身一人深入到了长城外的敌人领地,成功刺杀了敌方首领轲比能,瓦解了鲜卑民族,曹魏边境因此获得了几十年的安稳。", + ns_zhangwei: "血骑教习·张葳,三国杀集换式卡牌游戏《阵面对决》中的帝畿系列卡牌。游卡桌游官方原创的三国时期女性角色。", + diy_feishi: "字公举,生卒年不详,益州犍为郡南安县(今四川省乐山市)人。刘璋占据益州时,以费诗为绵竹县县令。刘备进攻刘璋夺取益州,费诗举城而降,后受拜督军从事,转任牂牁郡太守,再为州前部司马。", + diy_lukang: "字幼节,吴郡吴县(今江苏苏州)人。三国时期吴国名将,丞相陆逊次子。", + diy_liufu: "字元颖,沛国相县(今安徽濉溪县西北)人。东汉末年名守。在汉末避难于淮南,说服袁术将戚寄和秦翊率部投奔曹操,曹操大悦,使司徒辟其为掾属。", + diy_xizhenxihong: "习珍,襄阳人。三国时蜀汉将领。先主刘备时曾任零陵北部都尉,加裨将军。建安二十四年,关羽率荆州大军攻打樊城,唯有习珍据城不降。被困月余,直到箭尽粮绝,拔剑自刎而死。习宏,生卒年不详,习珍之弟。曾在东吴入侵蜀汉时建议哥哥习珍伪降,约樊胄举兵。习珍死后,弟弟习宏落在东吴,有问必不答,终身不为孙权发一言。", + diy_zaozhirenjun: "枣祗,生卒年月不详,东汉末年颍川阳翟(今河南省禹州市)人。曾任东阿令、羽林监、屯田都尉、陈留太守等职。任峻(?—204年),字伯达,河南郡中牟县人。曹操每次出征,任峻通常在后方补给军队。后来发生饥荒,枣祗建议实施屯田,任峻被任命为典农中郎将,招募百姓在许下屯田,结果连年丰收,积谷足以装满全部粮仓。", + diy_yangyi: "字威公,襄阳(今湖北襄阳)人,三国时期蜀汉政治家。最初,为荆州刺史傅群的主簿,后投奔关羽,任为功曹。羽遣其至成都,大受刘备赞赏,擢为尚书。建兴三年(225年)任丞相参军,此后一直跟随诸葛亮战斗。亮卒,他部署安全退军。亮生前定蒋琬继己任,仪仅拜中军师。建兴十三年(235年),因多出怨言,被削职流放至汉嘉郡。但杨仪仍不自省,又上书诽谤,言辞激烈,最后下狱,自杀身亡。", + diy_tianyu: "字国让,渔阳雍奴(今天津市武清区东北)人。三国时期曹魏将领。初从刘备,因母亲年老回乡,后跟随公孙瓒,公孙瓒败亡,劝说鲜于辅加入曹操。曹操攻略河北时,田豫正式得到曹操任用,历任颖阴、郎陵令、弋阳太守等。", + chentai: "陈泰(200年~260年),字玄伯,颍川许昌(今河南省许昌市)人。三国时期魏国名将,司空陈群之子。陈泰早年起家员外散骑侍郎,其父陈群死后袭封颍阴侯,历任游击将军、并州、雍州刺史、尚书等职,高平陵政变发生时,陈泰力劝大将军曹爽投降,因此得到掌权的司马氏信任,此后为了回避朝廷的争斗,陈泰主动请求外调雍州任职,任内成功防御蜀将姜维的多次进攻。甘露元年(256年),陈泰被调回朝中任尚书右仆射,曾随司马昭两度抵抗东吴的进攻,后改任左仆射。甘露五年(260年),魏帝曹髦被弑杀,陈泰闻讯后悲痛过度,呕血而死,享年六十一岁。追赠司空,赐谥为穆。", + huangwudie: "黄舞蝶是在现代三国作品中出场的虚拟人物,设定为蜀汉大将黄忠之女,跟随父亲一同投效刘备,在游戏中是一名不错的女将。", + sunyi: "孙翊(184年~204年),又名孙俨,字叔弼,是孙坚的第三子,孙策、孙权的弟弟。曾被大臣推荐为继承者。孙权继位后,孙翊任丹杨太守,后被身边的人边鸿刺杀。", + zhangning: "《三国杀·阵面对决》中登场的角色。张角之女,能呼雷掣电。", + yanghu: "羊祜(221年-278年12月27日),字叔子,泰山郡南城县人。西晋时期杰出的战略家、政治家、文学家,曹魏上党太守羊衜的儿子,名儒蔡邕的女儿蔡文姬的外甥。出身“泰山羊氏”,博学能文,清廉正直。曹魏时期,接受公车征辟,出任中书郎,迁给事黄门侍郎。姐姐嫁给大将军司马师,投靠司马氏家族,仕途平步青云。魏元帝曹奂即位,出任秘书监、相国从事中郎、中领军,统领御林军,兼管内外政事,册封钜平县子,迁。西晋建立后,迁中军将军、散骑常侍、郎中令,册封钜平侯。泰始五年(269年),出任车骑将军、荆州都督,加任开府仪同三司坐镇襄阳,屯田兴学,以德怀柔,深得军民之心;扩充军备,训练士兵,全力准备灭亡孙吴,累迁征南大将军,册封南城侯。咸宁四年,去世,临终前举荐杜预接任职务,获赠侍中、太傅,谥号为“成”。唐宋时期,配享武庙。", + ns_wangyue: "王越,东汉末年游侠(生卒年不详),乃辽东燕山人士,擅使剑术, 三国时期史阿的师父,曹丕的师公,官职虎贲将军。在史书《典论》中略有记载。", +}; + +export default characterIntro; diff --git a/character/diy/perfectPairs.js b/character/diy/perfectPairs.js new file mode 100644 index 000000000..93a32f926 --- /dev/null +++ b/character/diy/perfectPairs.js @@ -0,0 +1,22 @@ +export default { + yuji: ["zuoci"], + key_riki: ["key_rin", "key_saya", "key_kyousuke", "key_kud"], + key_kud: ["key_harukakanata"], + key_komari: ["key_rin", "key_sasami"], + key_masato: ["key_kengo"], + key_yuiko: ["key_harukakanata"], + key_doruji: ["key_rin"], + key_tomoya: ["key_nagisa", "key_sunohara", "key_kotomi"], + key_ao: ["key_inari"], + key_shiroha: ["key_umi"], + key_shizuku: ["key_tsumugi"], + key_yuzuru: ["key_hinata", "key_kanade", "key_ayato"], + key_yuri: ["key_kanade", "key_abyusa"], + key_hinata: ["key_yui"], + key_iwasawa: ["key_hisako"], + key_yuu: ["key_nao"], + key_jojiro: ["key_yusa"], + key_kaori: ["key_shiori"], + key_chihaya: ["key_sakuya"], + key_lucia: ["key_shizuru"], +}; diff --git a/character/diy/pinyin.js b/character/diy/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/diy/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/diy/skill.js b/character/diy/skill.js new file mode 100644 index 000000000..81377c1f1 --- /dev/null +++ b/character/diy/skill.js @@ -0,0 +1,10386 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //远野美凪&远野小满 + minagi_peiquan: { + enable: "phaseUse", + filter(event, player) { + return player.hasCard(card => card.hasGaintag("minagi_tag"), "h"); + }, + filterCard(card) { + return card.hasGaintag("minagi_tag"); + }, + position: "h", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + promptfunc: () => "出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。", + check: card => { + const player = _status.event.player; + return get.type(card, false) == "equip" && game.hasPlayer(current => player.canGift(card, current, true) && !current.refuseGifts(card, player) && get.effect(current, card, player, player) > 0) ? 2 : 1 + Math.random(); + }, + content() { + "step 0"; + player.gift(cards, target); + "step 1"; + var list = player.getStorage("minagi_peiquan_yukito"); + if (list.length >= 4) event.finish(); + else { + var yukito = get.translation(target); + player + .chooseButton( + [ + "配券:请选择一项执行", + [ + [ + ["damage", "选项一:对" + yukito + "造成1点伤害"], + ["draw", "选项二:摸两张牌"], + ["discard", "选项三:弃置" + yukito + "的两张牌"], + ["use", "选项四:亮出牌堆顶的一张牌,然后可以使用之"], + ], + "textbutton", + ], + ], + true + ) + .set("list", list) + .set("filterButton", function (button) { + return !_status.event.list.includes(button.link); + }) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target; + switch (button.link) { + case "damage": + return get.damageEffect(target, player, player); + case "draw": + return 2 * get.effect(player, { name: "draw" }, player, player); + case "discard": + return get.effect(target, { name: "guohe_copy2" }, player, player) * Math.min(1.6, target.countCards("he")); + case "use": + return _status.event.getRand("minagi_peiquan") * 4; + } + }); + } + "step 2"; + player.markAuto("minagi_peiquan_yukito", result.links); + player.addTempSkill("minagi_peiquan_yukito"); + switch (result.links[0]) { + case "damage": + target.damage("nocard"); + break; + case "draw": + player.draw(2); + break; + case "discard": + player.discardPlayerCard(target, 2, "he", true); + break; + } + if (result.links[0] != "use") event.finish(); + "step 3"; + var card = get.cards()[0]; + game.cardsGotoOrdering(card); + player.showCards(card); + player.chooseUseTarget(card, "是否使用" + get.translation(card) + "?"); + }, + ai: { + order: 4, + result: { + player: (player, target) => { + const giftEffects = ui.selected.cards.map(value => player.getGiftEffect(value, target)); + const baseEffect = Math.min(3, giftEffects.reduce((previousValue, currentValue) => previousValue + currentValue, 0) / giftEffects.length); + const choices = ["damage", "draw", "discard", "use"]; + choices.removeArray(player.getStorage("minagi_peiquan_yukito")); + if (choices.length <= 0) return baseEffect; + return ( + baseEffect + + Math.max( + ...choices.map(choice => { + switch (choice) { + case "damage": + return get.damageEffect(target, player, player); + case "draw": + return 2 * get.effect(player, { name: "draw" }, player, player); + case "discard": + return get.effect(target, { name: "guohe_copy2" }, player, player) * Math.min(1.6, target.countCards("he")); + case "use": + return _status.event.getRand("minagi_peiquan") * 4; + } + }) + ) + ); + }, + }, + }, + group: "minagi_peiquan_umareta", + subSkill: { + yukito: { charlotte: true, onremove: true }, + umareta: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0; + }, + content() { + var hs = player.getCards("h"); + player.addGaintag(hs, "minagi_tag"); + }, + }, + }, + }, + minagi_huanliu: { + trigger: { player: "phaseZhunbeiBegin" }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(lib.filter.notMe, get.prompt("minagi_huanliu"), "和一名其他角色进行“协力”,并获得“远野小满”的所有对应技能") + .set("ai", function (target) { + return get.threaten(target) * Math.sqrt(1 + target.countCards("h")) * (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1); + }) + .forResult(); + }, + content() { + "step 0"; + var target = targets[0]; + player.chooseCooperationFor(target, "minagi_huanliu").set("ai", function (button) { + var base = 0; + switch (button.link) { + case "cooperation_damage": + base = 0.1; + break; + case "cooperation_draw": + base = 0.6; + break; + case "cooperation_discard": + base = 0.1; + break; + case "cooperation_use": + base = 0.3; + break; + } + return base + Math.random(); + }); + player.addAdditionalSkill("cooperation", ["minagi_huanliu_effect", "michiru_sheyuan"]); + "step 1"; + game.delayx(); + }, + subSkill: { + effect: { + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + logTarget: "player", + filter(event, player) { + return player.checkCooperationStatus(event.player, "minagi_huanliu") && player.countCards("h") > 0; + }, + content() { + game.log(player, "和", trigger.player, "的协力成功"); + var hs = player.getCards("h"); + player.addGaintag(hs, "minagi_tag"); + game.delayx(); + }, + }, + }, + derivation: "michiru_sheyuan", + }, + michiru_sheyuan: { + charlotte: true, + enable: "chooseToUse", + filter(event, player) { + if (player.hasSkill("michiru_sheyuan_round")) return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of hs) { + if (i.hasGaintag("minagi_tag")) return false; + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; + } + for (var name of lib.inpile) { + var type = get.type(name); + if (type != "basic" && type != "trick") return false; + var card = get.autoViewAs({ name: name }, hs); + if (event.filterCard(card, player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; + } + } + } + return false; + }, + hiddenCard(player, name) { + var type = get.type(name); + if (type != "basic" && type != "trick") return false; + if (player.hasSkill("michiru_sheyuan_round")) return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + if (_status.connectMode) return true; + for (var i of hs) { + if (i.hasGaintag("minagi_tag")) return false; + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; + } + return true; + }, + chooseButton: { + dialog(event, player) { + var list = [], + hs = player.getCards("h"); + for (var name of lib.inpile) { + var type = get.type(name); + if (type != "basic" && type != "trick") continue; + var card = get.autoViewAs({ name: name }, hs); + if (event.filterCard(card, player, event)) list.push([type, "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) list.push([type, "", name, nature]); + } + } + } + return ui.create.dialog("舍愿", [list, "vcard"], "hidden"); + }, + check(button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], + }; + if (_status.event.getParent().type == "phase") return player.getUseValue(card, null, true); + return 1; + }, + backup(links, player) { + return { + viewAs: { + name: links[0][2], + nature: links[0][3], + }, + filterCard: true, + position: "h", + selectCard: -1, + onuse(result, player) { + player.addTempSkill("michiru_sheyuan_round", "roundStart"); + }, + }; + }, + prompt(links, player) { + return "将所有手牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用,然后摸等量的牌"; + }, + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + return lib.skill.michiru_sheyuan.hiddenCard(player, "s" + tag.slice(8)); + }, + order: 1, + result: { + player(player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { + round: { + charlotte: true, + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "michiru_sheyuan_backup"; + }, + content() { + player.draw(trigger.cards.length); + }, + }, + backup: {}, + }, + }, + //坂上智代 + tomoyo_wuwei: { + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { name: "sha" }, + viewAsFilter(player) { + var storage = player.getStorage("tomoyo_wuwei_mark"); + return player.hasCard(function (card) { + return !storage.includes(get.suit(card)); + }, "hs"); + }, + position: "hs", + filterCard(card, player) { + var storage = player.getStorage("tomoyo_wuwei_mark"); + return !storage.includes(get.suit(card)); + }, + check(card) { + return 5 - get.value(card); + }, + onuse(result, player) { + player.markAuto("tomoyo_wuwei_mark", [get.suit(result.card, false)]); + player.addTempSkill("tomoyo_wuwei_mark"); + }, + onrespond(event, player) { + player.markAuto("tomoyo_wuwei_mark", [get.suit(event.card, false)]); + player.addTempSkill("tomoyo_wuwei_mark"); + }, + group: "tomoyo_wuwei_combo", + subSkill: { + mark: { + charlotte: true, + onremove: true, + }, + combo: { + trigger: { global: "useCardAfter" }, + direct: true, + //chooseToUse类技能暂时没办法改 + filter(event, player) { + return event.card.name == "shan" && player.inRangeOf(event.player) && player.canUse("sha", event.player, false); + }, + content() { + player + .chooseToUse( + "武威:是否对" + get.translation(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 = "tomoyo_wuwei_combo"; + }, + }, + }, + }, + tomoyo_zhengfeng: { + dutySkill: true, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return game.hasPlayer(current => player.inRange(current)); + }, + derivation: "tomoyo_changshi", + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("tomoyo_zhengfeng"), "令一名攻击范围内的角色进行判定。其于你的下回合开始前使用与判定结果颜色相同的牌时,你摸一张牌。", function (card, player, target) { + return player.inRange(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + if (player.hp <= 1 && !player.countCards("h")) return 0; + var hs = target.countCards("h"), + thr = get.threaten(target); + if (target.hasJudge("lebu")) return 0; + return Math.sqrt(1 + hs) * Math.sqrt(Math.max(1, 1 + thr)); + }) + .forResult(); + }, + content() { + "step 0"; + var target = targets[0]; + event.target = target; + target.judge(); + "step 1"; + player.addTempSkill("tomoyo_zhengfeng_tomoyo", { + player: "phaseBeginStart", + }); + player.markAuto("tomoyo_zhengfeng_tomoyo", [ + { + target: target, + color: result.color, + }, + ]); + }, + group: "tomoyo_zhengfeng_after", + subSkill: { + tomoyo: { + charlotte: true, + onremove: true, + mod: { + inRangeOf(source, player) { + var list = player.getStorage("tomoyo_zhengfeng_tomoyo"); + for (var obj of list) { + if (obj.target == source) return true; + } + }, + }, + trigger: { global: "useCard" }, + forced: true, + filter(event, player) { + var color = get.color(event.card); + if (color == "none") return false; + var list = player.getStorage("tomoyo_zhengfeng_tomoyo"); + for (var obj of list) { + if (obj.target == event.player && color == obj.color) return true; + } + return false; + }, + content() { + player.draw(); + }, + intro: { + mark(dialog, students, player) { + if (!students || !students.length) return "全校风纪良好!"; + var str = ""; + for (var i of students) { + if (str.length > 0) str += "
    "; + str += get.translation(i.target); + str += ":"; + str += get.translation(i.color); + } + dialog.addText(str); + }, + }, + }, + after: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return !player.hasHistory("useSkill", function (evt) { + return evt.skill == "tomoyo_zhengfeng"; + }); + }, + prompt: "整风:是否放弃使命?", + prompt2: "你可以减1点体力上限并失去〖武威〗,摸两张牌并回复1点体力,然后获得技能〖长誓〗。", + skillAnimation: true, + animationColor: "gray", + check(event, player) { + return player.hp * 1.1 + player.countCards("h") < 3; + }, + content() { + "step 0"; + game.log(player, "放弃了身为学生会长的使命"); + player.awakenSkill("tomoyo_zhengfeng"); + player.loseMaxHp(); + "step 1"; + player.removeSkills("tomoyo_wuwei"); + "step 2"; + player.draw(2); + player.recover(); + "step 3"; + player.addSkills("tomoyo_changshi"); + }, + }, + }, + }, + tomoyo_changshi: { + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + forced: true, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && event.getg(current).length > 1 && player.inRangeOf(current); + }); + }, + content() { + player.draw(); + }, + group: "tomoyo_changshi_recover", + subSkill: { + recover: { + trigger: { global: "recoverAfter" }, + forced: true, + filter(event, player) { + return event.player.isAlive() && player.inRangeOf(event.player); + }, + content() { + player.changeHujia(1); + }, + }, + }, + }, + //天宫希优 + kiyu_yuling: { + mod: { + targetEnabled(card) { + var info = get.info(card); + if (!info || (info.type != "trick" && info.type != "delay")) return; + if (info.range) return false; + }, + }, + trigger: { target: "useCardToTargeted" }, + forced: true, + charlotte: true, + filter(event, player) { + return event.card.name == "sha" && event.player.countCards("he") > 0; + }, + logTarget: "player", + content() { + trigger.player.chooseToDiscard("he", true, get.distance(trigger.player, player)); + }, + ai: { + threaten: 0.7, + effect: { + target(card, player, target, current) { + if (card.name == "sha") return 0.7; + }, + }, + }, + }, + kiyu_rexianyu: { + trigger: { player: "phaseUseEnd" }, + charlotte: true, + unique: true, + filter(event, player) { + return ( + !player.hasSkill("kiyu_rexianyu_round", null, null, false) && + player.hasHistory("useCard", function (evt) { + var type = get.type(evt.card); + if (type != "basic" && type != "trick") return false; + return evt.getParent("phaseUse") == event; + }) + ); + }, + async cost(event, trigger, player) { + const history = player.getHistory("useCard", function (evt) { + var type = get.type(evt.card); + if (type != "basic" && type != "trick") return false; + return evt.getParent("phaseUse") == trigger; + }); + const list = []; + for (var i = 0; i < Math.min(history.length, 3); i++) { + var card = history[i].card; + list.push({ name: card.name, isCard: true }); + if (card.nature) list[i].nature = card.nature; + } + const { result } = await player + .chooseTarget(get.prompt("kiyu_rexianyu"), "将以下使用结果告知于一名其他角色:" + get.translation(list), function (card, player, target) { + return target != player && !target.hasSkill("kiyu_rexianyu_lastrun", null, null, false); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) * get.threaten(target) * Math.sqrt(1 + target.countCards("h")) * (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1); + }); + if (result.bool) { + event.result = { + bool: result.bool, + targets: result.targets, + cost_data: { list }, + }; + } + }, + async content(event, trigger, player) { + player.addTempSkill("kiyu_rexianyu_round", "roundStart"); + const tabito = targets[0]; + tabito.storage.kiyu_rexianyu_lastrun = event.cost_data.list; + tabito.storage.amamiya_kiyu = player; + tabito.addTempSkill("kiyu_rexianyu_lastrun", { + player: ["phaseUseAfter"], + global: ["roundStart"], + }); + await game.asyncDelayx(); + }, + subSkill: { + round: { charlotte: true }, + lastrun: { + enable: "chooseToUse", + onChooseToUse(event) { + if (!game.online && event.type == "phase") { + var evtx = event.getParent(); + var num = event.player.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == evtx; + }).length; + event.set("rexianyu_num", num); + } + }, + filter(event, player) { + if (!player.countCards("hs")) return false; + var num = event.rexianyu_num, + list = player.storage.kiyu_rexianyu_lastrun; + if (!Array.isArray(list) || typeof num != "number" || list.length <= num) return false; + var card = get.copy(list[num]); + delete card.isCard; + card = get.autoViewAs(card, "unsure"); + if (event.filterCard(card, player, event)) return true; + return false; + }, + onremove: true, + viewAs(cards, player) { + var num = _status.event.rexianyu_num, + list = player.storage.kiyu_rexianyu_lastrun; + if (!Array.isArray(list) || typeof num != "number" || list.length <= num) return { name: "sha" }; + var card = get.copy(list[num]); + delete card.isCard; + return card; + }, + prompt() { + var player = _status.event.player; + var num = _status.event.rexianyu_num, + list = player.storage.kiyu_rexianyu_lastrun; + if (!Array.isArray(list) || typeof num != "number" || list.length <= num) return "无可用牌"; + var card = list[num]; + var str = "将一张牌当做" + get.translation(card); + var kiyu = player.storage.amamiya_kiyu; + if (kiyu && kiyu.isAlive()) str += ";然后" + get.translation(kiyu) + "摸一张牌,且你本回合的手牌上限+1"; + return str; + }, + filterCard: true, + position: "h", + popname: true, + check(card) { + var player = _status.event.player; + var num = _status.event.rexianyu_num, + list = player.storage.kiyu_rexianyu_lastrun; + return player.getUseValue(list[num], null, true) - player.getUseValue(card, null, true); + }, + group: "kiyu_rexianyu_earthbound", + mark: true, + intro: { content: "已记录:$" }, + ai: { + order: 12, + result: { + player(player) { + var lunarq = player.storage.amamiya_kiyu; + if (lunarq && get.attitude(player, lunarq) <= 0) return -1; + return 1; + }, + }, + }, + }, + earthbound: { + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter(event, player) { + if (event.skill != "kiyu_rexianyu_lastrun") return false; + var lunarq = player.storage.amamiya_kiyu; + return get.itemtype(lunarq) == "player" && lunarq.isAlive(); + }, + content() { + var lunarq = player.storage.amamiya_kiyu; + lunarq.draw(); + player.addTempSkill("kiyu_rexianyu_wolf"); + player.addMark("kiyu_rexianyu_wolf", 1, false); + }, + }, + wolf: { + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("kiyu_rexianyu_wolf"); + }, + }, + markimage: "image/card/handcard.png", + intro: { content: "手牌上限+#" }, + }, + }, + }, + kiyu_xianyu: { + trigger: { global: "phaseUseBegin" }, + charlotte: true, + round: 1, + filter(event, player) { + return event.player.countCards("h") > 0; + }, + logTarget: "player", + check(event, player) { + var target = event.player; + var next = target.next; + if (target.getSeatNum() > next.getSeatNum()) return true; + if ( + target.countCards("h") < 4 && + target.countCards("h", function (card) { + return target.hasUseTarget(card, null, true); + }) < 2 + ) + return false; + return true; + }, + content() { + "step 0"; + var target = trigger.player, + cards = target.getCards("h"); + var next = player.chooseToMove("先预:预测" + get.translation(target) + "使用牌的顺序", true); + next.set("list", [[get.translation(target) + "的手牌", cards]]); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0); + var target = _status.event.getTrigger().player; + cards.sort(function (a, b) { + return get.order(b, target) - get.order(a, target); + }); + return [cards]; + }); + "step 1"; + if (result.bool) { + var list = result.moved[0]; + player.storage.kiyu_xianyu_lastrun = list; + player.addTempSkill("kiyu_xianyu_lastrun", list); + } + }, + subSkill: { + lastrun: { + trigger: { global: "phaseUseAfter" }, + forced: true, + charlotte: true, + onremove: true, + content() { + var num = 0, + index = -1, + target = trigger.player; + var cards = player.getStorage("kiyu_xianyu_lastrun"); + var history = target.getHistory("useCard", function (event) { + return event.getParent("phaseUse") == trigger; + }); + for (var evt of history) { + var goon = false; + for (var card of evt.cards) { + var index2 = cards.indexOf(card); + if (index2 > index) { + goon = true; + index = index2; + } + } + if (goon) num++; + } + if (num > 0) { + num = Math.min(3, num); + player.draw(num); + if (target.isIn()) { + target.addTempSkill("kiyu_xianyu_effect"); + target.addMark("kiyu_xianyu_effect", num, false); + } + } + }, + }, + effect: { + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("kiyu_xianyu_effect"); + }, + }, + }, + }, + }, + //樱庭星罗 + seira_xinghui: { + trigger: { player: "phaseZhunbeiBegin" }, + check(event, player) { + return !player.getExpansions("seira_xinghui").length; + }, + content() { + "step 0"; + game.delayx(); + "step 1"; + if (get.isLuckyStar(player)) { + event.num = 6; + player.throwDice(6); + } else player.throwDice(); + "step 2"; + var cards = get.cards(num); + event.cards = cards; + game.cardsGotoOrdering(cards); + var next = player.chooseToMove(); + next.set("prompt", "星辉:选择要作为“星屑”的牌(先选择的在上)"); + next.set("list", [["置于武将牌上", cards], ["置入弃牌堆"]]); + 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 3"; + if (result.bool && result.moved && result.moved[0].length) { + event.cards = result.moved[0]; + player + .chooseTarget(true, "将以下牌置于一名角色的武将牌上", get.translation(event.cards), function (card, player, target) { + return !target.getExpansions("seira_xinghui").length; + }) + .set("ai", function (target) { + return target == _status.event.player ? 1 : 0; + }); + event.cards.reverse(); + } else event.finish(); + "step 4"; + var target = result.targets[0]; + player.line(target, { color: [253, 153, 182] }); + target.addToExpansion(cards).gaintag.add("seira_xinghui"); + game.log(player, "将" + get.cnNumber(cards.length) + "张牌置于", target, "的武将牌上"); + target.addSkill("seira_xinghui_hoshikuzu"); + }, + intro: { + markcount: "expansion", + content(storage, player) { + return "共有" + get.cnNumber(player.getExpansions("seira_xinghui").length) + "张牌"; + }, + onunmark(storage, player) { + player.removeSkill("seira_xinghui_hoshikuzu"); + }, + }, + subSkill: { + hoshikuzu: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + filter(event, player) { + return player.getExpansions("seira_xinghui").length > 0; + }, + content() { + trigger.num++; + game.log(player, "造成了", "#y暴击伤害"); + }, + group: ["seira_xinghui_draw", "seira_xinghui_judge"], + }, + draw: { + trigger: { player: "drawBefore" }, + forced: true, + filter(event, player) { + return player.getExpansions("seira_xinghui").length > 0; + }, + content() { + var cards = player.getExpansions("seira_xinghui"); + var num = Math.min(cards.length, trigger.num); + trigger.num -= num; + player.gain(cards.slice(0, num), "draw"); + if (trigger.num == 0) trigger.cancel(); + }, + }, + judge: { + trigger: { player: "judgeBegin" }, + forced: true, + filter(event, player) { + return player.getExpansions("seira_xinghui").length > 0; + }, + content() { + trigger.directresult = player.getExpansions("seira_xinghui")[0]; + }, + }, + }, + }, + seira_yuanying: { + enable: "phaseUse", + usable: 1, + filterTarget: true, + selectTarget: 2, + multitarget: true, + multiline: true, + line: { color: [253, 153, 182] }, + content() { + game.filterPlayer() + .sortBySeat() + .forEach(function (current) { + if (!targets.includes(current)) { + current.removeSkills("seira_yinyuan"); + } else { + current.addSkills("seira_yinyuan"); + } + }); + game.delayx(); + }, + ai: { + order: 1, + result: { target: 1 }, + expose: 0.1, + }, + derivation: "seira_yinyuan", + }, + seira_yinyuan: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.hasSkill("seira_yinyuan", null, null, false) && target.countCards("hej") > 0; + }, + content() { + player.gainPlayerCard(target, true, "hej"); + target.recover(); + }, + mark: true, + intro: { + content: "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。", + }, + ai: { + order: 9, + viewHandcard: true, + skillTagFilter(player, tag, arg) { + if (player == arg) return false; + return player.hasSkill("seira_yinyuan") && arg.hasSkill("seira_yinyuan"); + }, + result: { + player(player, target) { + var effect = get.effect(target, { name: "shunshou_copy" }, player, player); + if (target.isDamaged()) { + if (effect < 0) effect /= 2; + effect += get.recoverEffect(target, player, player); + } + return effect; + }, + }, + }, + }, + //派对浪客 + nsxingyun: { + audio: 2, + enable: "chooseToUse", + getSixiang(card) { + if (typeof card == "string") card = { name: card }; + if (card.name == "shan") return "玄武"; + var type = get.type(card, null, false); + if (type == "delay") return "朱雀"; + if (get.tag(card, "damage")) return "白虎"; + if (get.tag(card, "recover")) return "玄武"; + if (type == "trick") return "青龙"; + return false; + }, + filter(event, player) { + if (player.hasSkill("nsxingyun_round")) return false; + var list = player.getStorage("nsxingyun"); + if (list.length >= 4) return false; + for (var i of lib.inpile) { + var type = lib.skill.nsxingyun.getSixiang(i); + if (!type || list.includes(type)) continue; + if (event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard(get.autoViewAs({ name: i, nature: j }, "unsure"), player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog(event, player) { + var map = { 青龙: [], 朱雀: [], 白虎: [], 玄武: [] }; + var list = player.getStorage("nsxingyun"); + for (var i of lib.inpile) { + var type = lib.skill.nsxingyun.getSixiang(i); + if (!type || list.includes(type)) continue; + if (event.filterCard({ name: i }, player, event)) map[type].push([get.type2(i, false), "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: i, nature: j }, player, event)) map[type].push([get.type2(i, false), "", i, j]); + } + } + } + var dialog = ["星陨", "hidden"]; + for (var i in map) { + if (map[i].length > 0) { + dialog.push('
    ' + i + "
    "); + dialog.push([map[i], "vcard"]); + } + } + return ui.create.dialog.apply(ui.create, dialog); + }, + filter(button, player) { + return _status.event.getParent().filterCard( + { + name: button.link[2], + nature: button.link[3], + }, + player, + _status.event.getParent() + ); + }, + check(button) { + if (_status.event.getParent().type != "phase") return 1; + return _status.event.player.getUseValue( + { + name: button.link[2], + nature: button.link[3], + }, + false + ); + }, + backup(links, player) { + return { + selectCard: 1, + filterCard: true, + popname: true, + position: "hs", + check(card) { + return 7 - get.value(card); + }, + viewAs: { name: links[0][2], nature: links[0][3] }, + precontent() { + player.addTempSkill("nsxingyun_round"); + }, + }; + }, + prompt(links, player) { + return "将一张手牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + threaten: 2.6, + order: 1, + result: { player: 1 }, + }, + group: "nsxingyun_clear", + derivation: ["nsxingyun_faq", "bazhen"], + subSkill: { + backup: {}, + clear: { + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "nsxingyun_backup" && event.cards.length == 1 && lib.skill.nsxingyun.getSixiang(event.card) != lib.skill.nsxingyun.getSixiang(event.cards[0]) && !player.getStorage("nsxingyun").includes(lib.skill.nsxingyun.getSixiang(event.card)); + }, + content() { + "step 0"; + player.draw(2); + player.markAuto("nsxingyun", [lib.skill.nsxingyun.getSixiang(trigger.card)]); + "step 1"; + if (player.getStorage("nsxingyun").length >= 4) player.addSkills("bazhen"); + }, + }, + round: { + charlotte: true, + onremove: true, + }, + }, + }, + nshanlang: { + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return player.countCards("h") > 0 && game.hasPlayer(current => player != current && player.canCompare(current)); + }, + async cost(event, trigger, player) { + const goon = player.hasCard(function (card) { + return get.value(card) <= 7; + }, "h"); + event.result = await player + .chooseTarget([1, 3], get.prompt("nshanlang"), "和至多三名角色进行拼点", function (card, player, target) { + return target != player && player.canCompare(target); + }) + .set("ai", function (target) { + if (!_status.event.goon) return false; + var att = get.attitude(_status.event.player, target); + if (att >= 0) return 0; + if (target.hasSkillTag("noh")) att /= 3; + return -att / Math.sqrt(target.countCards("h")); + }) + .set("goon", goon) + .forResult(); + }, + content() { + "step 0"; + event.max_num = 0; + targets.sortBySeat(); + player.chooseToCompare(targets).callback = lib.skill.nshanlang.callback; + "step 1"; + if (event.target) { + player + .chooseBool("是否令" + get.translation(target) + "获得一张牌?") + .set("goon", get.attitude(player, target) > 0) + .set("ai", () => _status.event.goon); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = get.cardPile2(function (card) { + return !lib.skill.nsxingyun.getSixiang(card); + }); + if (card) target.gain(card, "gain2"); + } + }, + callback() { + var list = [ + [player, event.num1], + [target, event.num2], + ], + evt = event.getParent(2); + for (var i of list) { + if (i[1] > evt.max_num) { + evt.max_num = i[1]; + evt.target = i[0]; + } else if (evt.target && i[1] == evt.max_num && i[0] != evt.target) { + delete evt.target; + } + } + }, + }, + //钟离牧 + nskuanhuai: { + trigger: { player: "phaseUseBegin" }, + content() { + "step 0"; + var card = get.discardPile(function (card) { + return get.type(card) != "basic"; + }); + if (card) player.gain(card, "gain2"); + "step 1"; + player.addTempSkill("nskuanhuai_blocker", "phaseUseAfter"); + player.addTempSkill("nskuanhuai_effect"); + }, + subSkill: { + blocker: { + charlotte: true, + mod: { + cardEnabled(card) { + if (get.type(card) == "basic") return false; + }, + cardSavable(card) { + if (get.type(card) == "basic") return false; + }, + }, + }, + effect: { + trigger: { player: "phaseDiscardEnd" }, + charlotte: true, + popup: false, + filter(event, player) { + return player.hasHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent("phaseDiscard") != event) return false; + for (var i of evt.cards2) { + if (get.type(i, false) == "basic" && get.position(i, true) == "d" && player.hasUseTarget(i)) return true; + } + return false; + }); + }, + content() { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent("phaseDiscard") != trigger) return false; + for (var i of evt.cards2) { + if (get.type(i, false) == "basic" && get.position(i, true) == "d") cards.push(i); + } + return false; + }); + event.cards = cards; + "step 1"; + var cards2 = event.cards.filter(function (i) { + return get.position(i, true) == "d" && player.hasUseTarget(i); + }); + if (cards2.length) { + player.chooseButton(["宽怀:是否使用其中一张牌?", cards2]); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.links[0]; + cards.remove(card); + player.chooseUseTarget(card, true); + if (cards.length > 0) event.goto(1); + } + }, + }, + }, + }, + nsdingbian: { + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + if (player != _status.currentPhase) return false; + return get.type(event.card) != "basic"; + }, + content() { + "step 0"; + player.addTempSkill("nsdingbian_mark"); + player.addMark("nsdingbian_mark", 1, false); + var storage = player.getStorage("nsdingbian_ignore"); + var goon = false; + for (var i of lib.inpile) { + if (get.type(i) == "basic" && !storage.includes(i)) { + goon = true; + break; + } + } + if (goon) + player + .chooseControl() + .set("choiceList", ["从牌堆中获得一张基本牌", "令一种基本牌于本回合内不计入手牌上限"]) + .set("prompt", "定边:请选择一项") + .set("ai", function () { + var player = _status.event.player; + var list = ["tao", "shan"], + list2 = player.getStorage("nsdingbian_ignore"); + list.removeArray(list2); + if (!list.length) return 0; + var num1 = player.countCards("hs", function (card) { + return get.type(card) != "basic" && player.hasValueTarget(card, null, true); + }), + num2 = player.getHandcardLimit(); + if (player.countCards("h", list) <= num2 - num1) return 0; + return 1; + }); + else event._result = { index: 0 }; + "step 1"; + if (result.index == 0) { + var card = get.cardPile2(function (card) { + return get.type(card, false) == "basic"; + }); + if (card) player.gain(card, "gain2"); + event.finish(); + } else { + var list = [], + storage = player.getStorage("nsdingbian_ignore"); + for (var i of lib.inpile) { + if (get.type(i) == "basic" && !storage.includes(i)) { + list.push(i); + } + } + player.chooseButton(["令一种基本牌于本回合内不计入手牌上限", [list, "vcard"]], true).set("ai", function (button) { + var name = button.link[2], + player = _status.event.player; + if (name == "sha") return 0; + var cards = player.getCards("h", name); + if (!cards.length) return 0; + return get.value(cards, player); + }); + } + "step 2"; + player.markAuto("nsdingbian_ignore", [result.links[0][2]]); + }, + subSkill: { + mark: { + onremove(player) { + delete player.storage.nsdingbian_mark; + delete player.storage.nsdingbian_ignore; + }, + mod: { + maxHandcard: (player, num) => num - player.countMark("nsdingbian_mark"), + ignoredHandcard(card, player) { + if (player.getStorage("nsdingbian_ignore").includes(get.name(card, player))) { + return true; + } + }, + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && player.getStorage("nsdingbian_ignore").includes(get.name(card, player))) { + return false; + } + }, + }, + intro: { content: "手牌上限-#" }, + }, + }, + }, + //李密 + nstuilun: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player.hp > 1 && + player.countCards("h") > 1 && + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "nstuilun"); + }, "h") + ); + }, + prompt2: "失去任意点体力(至多失去至1点)并弃置任意张手牌(至多弃置至一张)。", + check(event, player) { + if ( + game.hasPlayer(function (current) { + return current != player && current.hp >= player.hp; + }) + ) + return true; + return false; + }, + content() { + "step 0"; + if (player.hp == 2) event._result = { index: 0 }; + else { + var list = []; + for (var i = 1; i < player.hp; i++) { + list.push(i + "点"); + } + player.chooseControl(list).set("prompt", "请选择失去体力的量"); + } + "step 1"; + player.loseHp(1 + result.index); + "step 2"; + if ( + player.countCards("h") > 1 && + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "nstuilun"); + }, "h") + ) { + player.chooseToDiscard("h", true, [1, player.countCards("h") - 1]); + } else game.delayx(); + "step 3"; + player.addTempSkill("nstuilun_effect", { + player: "phaseBeginStart", + }); + }, + subSkill: { + effect: { + charlotte: true, + trigger: { global: "phaseBegin" }, + forced: true, + popup: false, + filter(event, player) { + return player.hp < event.player.hp || (player.hp > 0 && player.countCards("h") < event.player.countCards("h")); + }, + content() { + "step 0"; + if (player.hp < trigger.player.hp) { + player.chooseTarget("退论:是否令一名角色回复或失去1点体力?").set("ai", function (target) { + var eff = get.effect(target, { name: "losehp" }, player, player); + if (target.isDamaged()) eff = Math.max(eff, get.recoverEffect(target, player, player)); + return eff; + }); + } else event.goto(3); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("nstuilun_effect", target); + if (target.isHealthy()) event._result = { index: 1 }; + else + player + .chooseControl("回复1点体力", "失去1点体力") + .set("prompt", "令" + get.translation(target) + "…") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + if (get.recoverEffect(target, player, player) >= get.effect(target, { name: "losehp" }, player, player)) return 0; + return 1; + }); + } else event.goto(3); + "step 2"; + if (result.index == 0) target.recover(); + else target.loseHp(); + "step 3"; + if (trigger.player.countCards("h") > player.countCards("h")) { + var str = get.cnNumber(player.hp); + player.chooseTarget("退论:是否令一名角色摸一张牌或弃置一张牌?").set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0 || target.countCards("he") == 0) return get.effect(target, { name: "draw" }, player, player); + return get.effect(target, { name: "guohe_copy2" }, target, player); + }); + } else event.finish(); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("nstuilun_effect", target); + if (!target.countCards("he")) event._result = { index: 0 }; + else + player + .chooseControl("摸一张牌", "弃置一张牌") + .set("prompt", "令" + get.translation(target) + "…") + .set("ai", function (player) { + var evt = _status.event; + return get.attitude(evt.player, evt.getParent().target) > 0 ? 0 : 1; + }); + } else event.finish(); + "step 5"; + if (result.index == 0) target.draw(); + else target.chooseToDiscard("he", true); + }, + }, + }, + }, + //阮籍 + nsshizui: { + trigger: { target: "useCardToTargeted" }, + usable: 1, + filter(event, player) { + var type = get.type(event.card, null, false); + return (type == "basic" || type == "trick") && player.countCards("he") > 0 && player.hasUseTarget({ name: "jiu" }, null, true); + }, + async cost(event, trigger, player) { + var suit = get.suit(trigger.card), + cards = trigger.cards.filterInD(); + var str = "弃置一张牌并视为使用一张【酒】"; + if (lib.suit.includes(suit)) str += ";若弃置" + get.translation(suit) + "牌,则" + get.translation(trigger.card) + "对你无效"; + if (cards.length) str += ";若弃置♣牌则获得" + get.translation(cards); + str += "。"; + var next = player.chooseToDiscard("he", get.prompt("nsshizui"), str, "chooseonly"); + next.set("val1", cards.length ? get.value(cards, player) : 0); + next.set("val2", -get.effect(player, trigger.card, trigger.player, player)); + next.set("suit", suit); + next.set("ai", function (card) { + var base = 2, + suit = get.suit(card); + if (suit == "club") base += _status.event.val1; + if (suit == _status.event.suit) base += _status.event.val2; + return base - get.value(card); + }); + event.result = await next.forResult(); + }, + content() { + "step 0"; + event.suit1 = get.suit(cards[0], player); + player.discard(cards); + player.chooseUseTarget("jiu", true); + "step 1"; + var suit1 = event.suit1, + suit2 = get.suit(trigger.card, false); + if (suit1 == suit2 && lib.suit.includes(suit1)) trigger.excluded.add(player); + if (suit1 == "club") { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) player.gain(cards, "gain2"); + } + }, + }, + nsxiaoye: { + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player.hasHistory("useCard", function (evt) { + return evt.card.name == "jiu"; + }) && + event.player.hasHistory("useCard", function (evt) { + return ( + (evt.card.name == "sha" || get.type(evt.card) == "trick") && + player.hasUseTarget({ + name: evt.card.name, + nature: evt.card.nature, + isCard: true, + }) + ); + }) + ); + }, + async cost(event, trigger, player) { + const list = []; + trigger.player.getHistory("useCard", function (evt) { + if (evt.card.name != "sha" && get.type(evt.card) != "trick") return; + if (evt.card.name == "sha" && evt.card.nature) list.add("sha:" + evt.card.nature); + else list.add(evt.card.name); + }); + for (let i = 0; i < list.length; i++) { + if (list[i].indexOf("sha:") == 0) list[i] = ["基本", "", "sha", list[i].slice(4)]; + else list[i] = [get.type(list[i]), "", list[i]]; + } + const { result } = await player + .chooseButton([get.prompt("nsxiaoye"), [list, "vcard"]]) + .set("filterButton", function (button) { + return player.hasUseTarget({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }) + .set("ai", function (button) { + return player.getUseValue({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }); + if (result.bool) { + event.result = { + bool: true, + cost_data: { + card: { + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }, + }, + }; + } + }, + async content(event, trigger, player) { + player.chooseUseTarget(true, event.cost_data.card); + }, + }, + //臧洪 + nsshimeng: { + enable: "phaseUse", + usable: 1, + selectTarget: [1, Infinity], + filterTarget: true, + contentBefore() { + event.getParent()._nsshimeng_count = [0, 0]; + }, + content() { + "step 0"; + if (!target.isIn()) { + event.finish(); + return; + } + target + .chooseToUse("使用一张【杀】,或摸一张牌", function (card, player) { + if (get.name(card) != "sha") return false; + return lib.filter.cardEnabled.apply(this, arguments); + }) + .set("addCount", false); + "step 1"; + if (result.bool) { + event.getParent()._nsshimeng_count[0]++; + } else { + event.getParent()._nsshimeng_count[1]++; + target.draw(); + } + }, + contentAfter() { + var list = event.getParent()._nsshimeng_count; + if (list[0] < list[1]) { + player.changeHujia(1); + player.loseHp(); + } + }, + ai: { + order: 3.05, + result: { + player(player, target) { + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (player.hp > 1 || player.countCards("hs", ["tao", "jiu"])) return 1; + if (!ui.selected.targets.length) { + if (target != player) return 0; + if (player.hasSha()) return 1; + return 0; + } + if (ui.selected.targets.length > 1 && !target.hasSha()) return 0; + return 1; + }, + }, + }, + }, + //加纳天善(改版) + tenzen_fenghuan: { + trigger: { global: "useCardAfter" }, + filter(event, player) { + if (player == event.player || event.targets.length != 1 || event.targets[0] != player || !event.player.isIn() || (event.card.name != "sha" && (get.type(event.card, null, false) != "trick" || !get.tag(event.card, "damage")))) return false; + if ( + !player.canUse( + { + name: event.card.name, + nature: event.card.nature, + isCard: true, + }, + event.player, + false + ) + ) + return false; + var num = get.number(event.card); + if (typeof num != "number") return false; + num *= 2; + var hs = player.getCards("he"); + for (var i of hs) { + num -= get.number(i); + if (num <= 0) return true; + } + return false; + }, + async cost(event, trigger, player) { + const num = get.number(trigger.card) * 2, + card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }; + event.result = await player + .chooseToDiscard("he", get.prompt("tenzen_fenghuan", trigger.player), "弃置任意张点数之和不小于" + num + "的牌,然后视为对其使用一张" + get.translation(card), "chooseonly") + .set("selectCard", function () { + var cards = ui.selected.cards, + num = _status.event.cardNumber; + for (var i of cards) { + num -= get.number(i); + if (num <= 0) return [cards.length, cards.length + 1]; + } + return [cards.length + 1, cards.length + 1]; + }) + .set("cardNumber", num) + .set("effect", get.effect(trigger.player, card, player, player)) + .set("ai", function (card) { + var eff = _status.event.effect; + if (eff <= 0) return 0; + for (var i of ui.selected.cards) eff -= get.value(i) / Math.sqrt(get.number(i) / 3); + return eff - get.value(card) / Math.sqrt(get.number(card) / 3); + }) + .forResult(); + }, + async content(event, trigger, player) { + await player.discard(event.cards); + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }, + target = trigger.player; + if (target.isIn() && player.canUse(card, target, false)) await player.useCard(card, target, false); + }, + }, + tenzen_retianquan: { + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return ( + event.card.name == "sha" && + (player.hp > 0 || + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "tenzen_retianquan"); + }, "he")) + ); + }, + logTarget: "target", + usable: 1, + check(event, player) { + if (get.attitude(player, event.target) >= 0) return false; + if (player.hp > player.maxHp / 2) return true; + if ( + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "tenzen_retianquan") && get.value(card) < 6; + }, "he") + ) + return true; + return true; + }, + prompt2: "你可失去1点体力或弃置一张牌,亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。每有一张基本牌,其所需使用的【闪】的数量便+1。然后若此牌造成过伤害,则你获得展示牌中的所有非基本牌。", + content() { + "step 0"; + player + .chooseToDiscard("弃置一张牌,或点「取消」失去1点体力", "he") + .set("goon", player.hp > player.maxHp / 2) + .set("ai", function (card) { + var val = get.value(card); + if (_status.event.goon) return 0.1 - val; + return 6 - val; + }); + "step 1"; + if (!result.bool) player.loseHp(); + "step 2"; + var cards = get.cards(player.hp <= player.maxHp / 2 ? 5 : 3); + player.showCards(cards, get.translation(player) + "发动了【天全】"); + game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent(); + var num = cards.filter(function (card) { + return get.type(card, false) == "basic"; + }).length; + if (num) { + if (trigger.card.name == "sha") { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { + map[id].shanRequired += num; + } else { + map[id].shanRequired = 1 + num; + } + } + } + if (num < 5) { + var next = game.createEvent("tenzen_retianqua_gain"); + next.cards = cards; + next.player = player; + event.next.remove(next); + trigger.getParent().after.push(next); + next.setContent(function () { + if ( + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.parent.card; + }).length > 0 + ) + player.gain( + cards.filter(function (card) { + return get.type(card, false) != "basic"; + }), + "gain2" + ); + }); + } + }, + }, + //藤林杏 + kyou_zhidian: { + locked: false, + mod: { + targetInRange(card) { + if (card.kyou_zhidian) return true; + }, + aiOrder(player, card, numx) { + var num = _status.event._kyou_zhidian_baseValue; + if (num > 0 && get.type2(card) == "trick" && player.getUseValue(card) < num) return numx / 10; + }, + }, + enable: "chooseToUse", + filter(event, player) { + return player.countCards("hs", card => get.type2(card) == "trick") > 0; + }, + filterCard(card) { + return get.type2(card) == "trick"; + }, + onChooseToUse(event) { + event._kyou_zhidian_baseValue = event.player.getUseValue({ + name: "sha", + }); + }, + check(card) { + var num = _status.event._kyou_zhidian_baseValue, + player = _status.event.player; + return num - player.getUseValue(card); + }, + prompt: "将一张锦囊牌当做【杀】使用", + viewAs: { + name: "sha", + kyou_zhidian: true, + }, + group: "kyou_zhidian_aim", + ai: { + respondSha: true, + skillTagFilter: player => player.countCards("hs", card => get.type2(card) == "trick") > 0, + }, + subSkill: { + aim: { + trigger: { + player: "useCardToPlayered", + }, + forced: true, + locked: false, + filter(event, player) { + return event.isFirstTarget && event.card.name == "sha"; + }, + logTarget: "target", + content() { + "step 0"; + var list = ["不可被响应", "无视防具", "伤害+1", "不计入次数"]; + list.remove(player.storage.kyou_zhidian); + player + .chooseControl(list) + .set("prompt", "掷典:请为" + get.translation(trigger.card) + "选择一种效果") + .set( + "choice", + (function () { + if (list.includes("不计入次数") && player.hasSha()) return "不计入次数"; + if ( + list.includes("不可被响应") && + trigger.target.mayHaveShan( + player, + "use", + trigger.target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return "不可被响应"; + if (list.includes("伤害+1")) return "伤害+1"; + return list.randomGet(); + })() + ) + .set("ai", () => _status.event.choice); + "step 1"; + var target = trigger.target; + player.storage.kyou_zhidian = result.control; + game.log(player, "对", target, "的", trigger.card, "#g" + result.control); + switch (result.control) { + case "不可被响应": + trigger.directHit.add(target); + break; + case "无视防具": + target.addTempSkill("qinggang2"); + target.storage.qinggang2.add(trigger.card); + break; + case "伤害+1": + var map = trigger.customArgs; + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; + map[id].extraDamage++; + break; + case "不计入次数": + var evt = trigger.getParent(); + if (evt.addCount !== false) { + evt.addCount = false; + player.getStat().card.sha--; + } + break; + } + }, + }, + }, + }, + kyou_duanfa: { + trigger: { player: "damageBegin2" }, + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return player.hp <= event.num; + }, + content() { + player.awakenSkill("kyou_duanfa"); + if (player.countCards("h") > 0) player.chooseToDiscard("h", true, player.countCards("h")); + player.recover(); + trigger.cancel(); + player.addTempSkill("kyou_duanfa_draw", { + player: "phaseBeginStart", + }); + }, + subSkill: { + draw: { + trigger: { target: "useCardToTargeted" }, + forced: true, + charlotte: true, + filter(event, player) { + if (event.card.name == "sha") return true; + return get.type(event.card, false) == "trick" && get.tag(event.card, "damage") > 0; + }, + content() { + player.draw(); + }, + }, + }, + }, + //天王寺瑚太朗 + kotarou_aurora: { + trigger: { + player: ["damageEnd", "loseHpEnd", "gainMaxHpEnd"], + }, + forced: true, + charlotte: true, + filter(event, player) { + return player.hasEnabledSlot(1); + }, + content() { + if (player.hasEmptySlot(1)) { + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip1" && !get.cardtag(card, "gifts") && player.canUse(card, player); + }); + if (card) player.chooseUseTarget(card, true); + } else player.chooseUseTarget("sha", true, false); + }, + }, + kotarou_rewrite: { + enable: "phaseUse", + charlotte: true, + filter(event, player) { + return !player.hasSkill("kotarou_rewrite_block"); + }, + content() { + "step 0"; + player.getHistory("custom").push({ kotarou_rewrite: true }); + player + .chooseControl() + .set("choiceList", ["视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌", "移动场上的一张牌", "增加1点体力上限并失去1点体力", "本回合内下一次造成的伤害+1", "本回合内下一次回复体力时,额外回复1点体力", "本回合内手牌上限和【杀】的使用次数+1                         "]) + .set("ai", function () { + var player = _status.event.player; + if (player.hp > 2 && player.getUseValue({ name: "sha" }) > 0) return 2; + return 0; + }); + "step 1"; + lib.skill.kotarou_rewrite.rewrites[result.index](player, event); + if (result.index != 0) event.goto(3); + "step 2"; + if (result.bool) { + player.storage.kotarou_rewrite.push(result.links[0][2]); + player.chooseUseTarget(true, { + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }); + } + "step 3"; + if ( + player.getHistory("custom", function (evt) { + return evt && evt.kotarou_rewrite == true; + }).length >= 3 + ) + player.addTempSkill("kotarou_rewrite_block"); + }, + onremove: true, + rewrites: [ + function (player, event) { + var list = []; + if (!player.storage.kotarou_rewrite) player.storage.kotarou_rewrite = []; + for (var i of lib.inpile) { + if (player.storage.kotarou_rewrite.includes(i)) continue; + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) list.push([type, "", i, j]); + } + } + if (list.length) { + player + .chooseButton(["改写:视为使用一张基本牌或普通锦囊牌", [list, "vcard"]], true) + .set("filterButton", function (button) { + return player.hasUseTarget( + { + name: button.link[2], + nature: button.link[3], + isCard: true, + }, + null, + true + ); + }) + .set("ai", function (button) { + return player.getUseValue({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }); + } else event._result = { bool: false }; + }, + function (player, event) { + player.moveCard(true); + }, + function (player, event) { + if (player.maxHp < 5) player.gainMaxHp(); + player.loseHp(); + }, + function (player, event) { + player.addSkill("kotarou_rewrite_damage"); + player.addMark("kotarou_rewrite_damage", 1, false); + game.log(player, "本回合下次造成的伤害", "#y+1"); + }, + function (player, event) { + player.addSkill("kotarou_rewrite_recover"); + player.addMark("kotarou_rewrite_recover", 1, false); + game.log(player, "本回合下次回复的体力", "#y+1"); + }, + function (player, event) { + player.addSkill("kotarou_rewrite_sha"); + player.addMark("kotarou_rewrite_sha", 1, false); + game.log(player, "本回合的手牌上限和使用【杀】的次数上限", "#y+1"); + }, + ], + ai: { + order: 4, + result: { + player(player) { + if ( + player.getHistory("custom", function (evt) { + return evt && evt.kotarou_rewrite == true; + }).length >= 2 + ) + return 0; + return 1; + }, + }, + }, + }, + kotarou_rewrite_damage: { + onremove: true, + trigger: { source: "damageBegin1" }, + forced: true, + content() { + trigger.num += player.countMark("kotarou_rewrite_damage"); + player.removeSkill("kotarou_rewrite_damage"); + }, + charlotte: true, + intro: { content: "下一次造成的伤害+#" }, + }, + kotarou_rewrite_recover: { + onremove: true, + trigger: { player: "recoverBegin" }, + forced: true, + content() { + trigger.num += player.countMark("kotarou_rewrite_recover"); + player.removeSkill("kotarou_rewrite_recover"); + }, + charlotte: true, + intro: { content: "下一次回复的体力+#" }, + }, + kotarou_rewrite_sha: { + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("kotarou_rewrite_sha"); + }, + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("kotarou_rewrite_sha"); + }, + }, + charlotte: true, + intro: { content: "手牌上限和出杀次数+#" }, + }, + kotarou_rewrite_block: { + trigger: { player: "phaseEnd" }, + forced: true, + charlotte: true, + content() { + player.removeSkill("kotarou_rewrite"); + player.removeSkill("kotarou_aurora"); + if (player.maxHp > 3) player.loseMaxHp(player.maxHp - 3); + }, + }, + //加纳天善(旧) + tenzen_yixing: { + trigger: { + global: "damageEnd", + }, + filter(event, player) { + if (!event.card || (event.card.name != "sha" && event.card.name != "juedou")) return false; + var hairi = event.source; + if (hairi && (hairi == player || player.inRangeOf(hairi)) && hairi.isIn() && hairi.name1 != "key_shizuku" && hairi.name2 != "key_shizuku") return true; + hairi = event.player; + return hairi && (hairi == player || player.inRange(hairi)) && hairi.isIn() && hairi.name1 != "key_shizuku" && hairi.name2 != "key_shizuku"; + }, + frequent: true, + content() { + "step 0"; + player.draw(); + "step 1"; + if (player.countCards("he") > 0) { + player.chooseCard("he", true, "将一张牌作为“兴”置于武将牌上"); + } else event.finish(); + "step 2"; + if (result.bool) { + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("tenzen_yixing"); + } + }, + intro: { + content: "expansion", + onunmark: "expansion", + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "tenzen_yixing_counter", + subSkill: { + counter: { + trigger: { target: "useCardToTargeted" }, + filter(event, player) { + if (player == event.player || !player.getExpansions("tenzen_yixing").length) return false; + return event.targets.length == 1 && (event.card.name == "sha" || get.type(event.card) == "trick"); + }, + prompt2(event) { + return "获得一张“兴”,且" + get.translation(event.card) + "结算完成后可以弃置两张牌,视为对" + get.translation(event.player) + "使用一张同名牌"; + }, + check(event, player) { + if (!player.storage.tenzen_lingyu && player.getExpansions("tenzen_yixing").length < 3) return false; + var card = { + name: event.card.name, + nature: event.card.nature, + isCard: true, + }; + return player.canUse(card, event.player, false) && get.effect(event.player, card, player, player) > 0; + }, + content() { + "step 0"; + player.chooseButton(["选择获得一张“兴”", player.getExpansions("tenzen_yixing")], true); + "step 1"; + if (result.bool) { + player.gain(result.links, "gain2"); + } + var next = game.createEvent("tenzen_yixing_insert"); + event.next.remove(next); + trigger.getParent().after.push(next); + next.player = player; + next.target = trigger.player; + next.setContent(lib.skill.tenzen_yixing.content_extra); + }, + }, + }, + content_extra() { + "step 0"; + var card = event.getParent().card; + event.card = { + name: card.name, + nature: card.nature, + isCard: true, + }; + if (player.countCards("he") > 1 && target && target.isIn() && player.canUse(event.card, target, false)) { + player.chooseToDiscard("he", 2, "是否弃置两张牌,视为对" + get.translation(target) + "使用" + get.translation(event.card) + "?").set("ai", function (card) { + return 5 - get.value(card); + }); + } else event.finish(); + "step 1"; + if (result.bool) player.useCard(card, target, false, "tenzen_yixing"); + }, + }, + tenzen_lingyu: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return player.getExpansions("tenzen_yixing").length >= player.hp; + }, + content() { + player.awakenSkill("tenzen_lingyu"); + player.storage.tenzen_lingyu = true; + player.loseMaxHp(); + if (player.isHealthy()) player.draw(2); + player.addSkills("tenzen_tianquan"); + }, + ai: { + combo: "tenzen_yixing", + }, + }, + tenzen_tianquan: { + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return (event.card.name == "sha" || event.card.name == "juedou") && event.targets.length == 1 && player.getExpansions("tenzen_yixing").length > 1; + }, + logTarget: "target", + usable: 1, + check(event, player) { + return get.attitude(player, event.target) < 0; + }, + content() { + "step 0"; + //player.viewHandcards(trigger.target); + player.chooseButton(["选择移去两张“兴”", player.getExpansions("tenzen_yixing")], true, 2); + "step 1"; + if (result.bool) { + player.loseToDiscardpile(result.links); + var cards = get.cards(5); + player.showCards(cards, get.translation(player) + "发动了【天全】"); + game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent(); + var num = cards.filter(function (card) { + return get.type(card, false) == "basic"; + }).length; + if (num) { + if (trigger.card.name == "sha") { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { + map[id].shanRequired += num; + } else { + map[id].shanRequired = 1 + num; + } + } else { + var idt = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[idt]) map[idt] = {}; + if (!map[idt].shaReq) map[idt].shaReq = {}; + if (!map[idt].shaReq[idt]) map[idt].shaReq[idt] = 1; + map[idt].shaReq[idt]++; + } + } + if (num < 5) { + var next = game.createEvent("tenzen_lingyu_gain"); + next.cards = cards; + next.player = player; + event.next.remove(next); + trigger.getParent().after.push(next); + next.setContent(function () { + if ( + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.parent.card; + }).length > 0 + ) + player.gain( + cards.filter(function (card) { + return get.type(card, false) != "basic"; + }), + "gain2" + ); + }); + } + } + }, + }, + //伊座并杏子 + kyouko_rongzhu: { + trigger: { global: "gainEnd" }, + filter(event, player) { + if (player == event.player || event.getParent().name == "kyouko_rongzhu") return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; + }, + logTarget: "player", + check(event, player) { + return get.attitude(player, event.player) > 0; + }, + content() { + "step 0"; + player.draw(); + "step 1"; + var target = trigger.player; + if (player.countCards("he") > 0 && target.isIn()) { + player.chooseCard("he", true, "将一张牌交给" + get.translation(target)); + } else event.finish(); + "step 2"; + if (result.bool) { + player.give(result.cards, trigger.player); + var target = _status.currentPhase; + var name; + if (target == player) { + name = "kyouko_rongzhu_me"; + player.addTempSkill(name); + player.addMark(name, 1, false); + } else if (target == trigger.player) { + name = "kyouko_rongzhu_notme"; + target.addTempSkill(name); + target.addMark(name, 1, false); + } + } + }, + subSkill: { + me: { + mod: { + maxHandcard(player, num) { + return num + player.countMark("kyouko_rongzhu_me"); + }, + }, + intro: { content: "手牌上限+#" }, + onremove: true, + }, + notme: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("kyouko_rongzhu_notme"); + }, + }, + intro: { content: "使用杀的次数上限+#" }, + onremove: true, + }, + }, + }, + kyouko_gongmian: { + enable: "phaseUse", + prompt: "出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。", + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && lib.skill.kyouko_gongmian.filterTarget(null, player, current); + }); + }, + filterTarget(card, kyouko, hina) { + if (kyouko == hina || kyouko.getStorage("kyouko_gongmian").includes(hina)) return false; + var hs = hina.countCards("he"); + if (hs == 0) return kyouko.countCards("h") == 0; + return true; + }, + content() { + "step 0"; + player.markAuto("kyouko_gongmian", targets); + var hs = player.countCards("h"), + ts = target.countCards("h"); + player.getHistory("custom").push({ kyouko_gongmian: true }); + if (hs > ts) { + event.utype = 1; + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + } else if (hs == ts) { + game.asyncDraw([player, target]); + event.utype = 2; + } else { + event.utype = 3; + player.gainPlayerCard(target, true, "he"); + } + "step 1"; + if (event.utype == 2) { + game.delayx(); + event.finish(); + } else if (!result.bool) event.finish(); + else if (event.utype == 1) target.give(result.cards, player); + "step 2"; + if (player.countCards("he") > 0) { + player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); + } else event.finish(); + "step 3"; + if (result.bool) player.give(result.cards, target); + }, + intro: { + content: "已与$共勉", + }, + group: ["kyouko_gongmian_use", "kyouko_gongmian_discard"], + ai: { + order: 6, + result: { + target(player, target) { + if ( + player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; + }).length + ) + return 0; + return 1; + }, + }, + }, + }, + kyouko_gongmian_use: { + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + return ( + player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; + }).length > 0 && + game.hasPlayer(function (current) { + return current != player && current.countGainableCards(player, "hej") > 0; + }) + ); + }, + async cost(event, trigger, player) { + const num = player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; + }).length; + event.result = await player + .chooseTarget(get.prompt("kyouko_gongmian"), "获得一名其他角色的至多" + get.cnNumber(num) + "张牌,然后交给其等量的牌", function (card, player, target) { + return target != player && target.countGainableCards(player, "hej") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att > 0) return att; + var he = player.getCards("he"); + if ( + target.countCards("he", function (card) { + return get.value(card, target) > 7; + }) && + he.length > 0 + ) + return ( + -att + + 5 - + Math.min.apply( + Math, + he.map(function (card) { + return get.value(card, player); + }) + ) + ); + return 0; + }) + .forResult(); + }, + async content(event, trigger, player) { + const num = player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; + }).length, + target = event.targets[0]; + let result = await player.gainPlayerCard(target, "hej", true, [1, num]).forResult(); + if (target.isIn() && result.bool && result.cards && result.cards.length && player.countCards("he") > 0) { + const num = result.cards.length, + hs = player.getCards("he"); + if (hs.length <= num) result = { bool: true, cards: hs }; + else { + result = await player.chooseCard("he", true, num, "交给" + get.translation(target) + get.cnNumber(num) + "张牌").forResult(); + } + if (result.bool && result.cards && result.cards.length) { + player.give(result.cards, target); + } + } + }, + }, + kyouko_gongmian_discard: { + trigger: { player: "phaseDiscardBegin" }, + filter(event, player) { + var hs = player.countCards("h"); + return ( + hs > 0 && + player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; + }).length >= player.hp && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") < hs; + }) + ); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("kyouko_gongmian"), "获得一名其他角色的所有手牌,然后将一半的牌交给该角色(向上取整)", function (card, player, target) { + return target != player && target.countCards("h") < player.countCards("h"); + }) + .forResult(); + }, + content() { + "step 0"; + var target = event.targets[0]; + event.target = target; + var hs = target.getCards("h"); + if (hs.length > 0) player.gain(hs, target, "giveAuto", "bySelf"); + "step 1"; + if (target.isIn() && player.countCards("h") > 0) { + var hs = player.getCards("h"), + num = Math.ceil(hs.length / 2); + if (hs.length <= num) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, num, "交给" + get.translation(target) + get.cnNumber(num) + "张牌"); + } else event.finish(); + "step 2"; + if (result.bool && result.cards && result.cards.length) { + player.give(result.cards, target); + } + }, + }, + //冰室忧希 + yuuki_yicha: { + trigger: { player: "phaseUseBegin" }, + frequent: true, + createDialog(id) { + var dialog = ui.create.dialog("hidden"); + (dialog.textPrompt = dialog.add("异插")).style.textAlign = "center"; + dialog.cards = []; + dialog.rawButtons = []; + dialog.videoId = id; + var cards = []; + for (var i = 0; i < 3; i++) { + var card = ui.create.card(null, null, true); + card.pos = i; + card.pos_x = i; + card.pos_y = 0; + cards.push(card); + dialog.rawButtons.push(card); + } + dialog.add(cards); + cards = []; + for (var i = 0; i < 3; i++) { + var card = ui.create.card(null, null, true); + card.pos = i + 3; + card.pos_x = i; + card.pos_y = 1; + cards.push(card); + dialog.rawButtons.push(card); + } + dialog.add(cards); + for (var i of dialog.buttons) { + i.pos_x = i.link.pos_x; + i.pos_y = i.link.pos_y; + i.link = i.link.pos; + } + dialog.open(); + }, + addCard(card, id, pos) { + var dialog = get.idDialog(id); + if (!dialog) return; + for (var i = 0; i < dialog.buttons.length; i++) { + var button = dialog.buttons[i]; + if (button.link == pos) { + var card2 = ui.create.button(card, "card"); + card2.pos = button.link; + card2.pos_x = button.pos_x; + card2.pos_y = button.pos_y; + card2.classList.add("noclick"); + button.parentNode.insertBefore(card2, button); + dialog.cards.push(card2); + button.remove(); + dialog.buttons.splice(i, 1); + break; + } + } + }, + changePrompt(str, id) { + var dialog = get.idDialog(id); + if (!dialog) return; + dialog.textPrompt.innerHTML = str; + }, + content() { + "step 0"; + var next = game.createEvent("cardsGotoOrdering"); + next.cards = []; + next.setContent("cardsGotoOrdering"); + event.videoId = lib.status.videoId++; + event.forceDie = true; + event.cards = []; + event.positions = [0, 1, 2, 3, 4, 5]; + game.broadcastAll(function (id) { + lib.skill.yuuki_yicha.createDialog(id); + }, event.videoId); + player.judge().set("callback", function () { + event.getParent().orderingCards.remove(event.judgeResult.card); + event.getParent(2).orderingCards.add(event.judgeResult.card); + }); + "step 1"; + if (get.position(result.card, true) == "o") { + var pos = event.positions.randomRemove(); + event._first_pos = pos; + game.broadcastAll( + function (card, id, player, pos) { + lib.skill.yuuki_yicha.addCard(card, id, pos); + lib.skill.yuuki_yicha.changePrompt(get.translation(player) + "放置了" + get.translation(card), id); + }, + result.card, + event.videoId, + player, + pos + ); + cards.push(result.card); + game.delay(2); + } + player.judge().set("callback", function () { + event.getParent().orderingCards.remove(event.judgeResult.card); + event.getParent(2).orderingCards.add(event.judgeResult.card); + }); + "step 2"; + if (get.position(result.card, true) == "o") { + var list = event.positions; + if (get.isLuckyStar(player)) { + var index = get.color(cards[0], false) == get.color(result.card, false) ? 0 : 1; + list = list.filter(function (i) { + return Math.abs((i % 2) - (event._first_pos % 2)) == index; + }); + } + var pos = list.randomRemove(); + game.broadcastAll( + function (card, id, player, pos) { + lib.skill.yuuki_yicha.addCard(card, id, pos); + lib.skill.yuuki_yicha.changePrompt(get.translation(player) + "放置了" + get.translation(card), id); + }, + result.card, + event.videoId, + player, + pos + ); + cards.push(result.card); + game.delay(2); + } + if (cards.length) event.count = 4; + else { + game.broadcastAll("closeDialog", event.videoId); + event.finish(); + } + "step 3"; + event.count--; + player.judge().set("callback", function () { + event.getParent().orderingCards.remove(event.judgeResult.card); + event.getParent(2).orderingCards.add(event.judgeResult.card); + }); + "step 4"; + var card = result.card; + event.card = card; + var str = "请选择一个位置放置" + get.translation(card); + if (player == game.me || player.isUnderControl()) { + lib.skill.yuuki_yicha.changePrompt(str, event.videoId); + } else if (player.isOnline()) { + player.send( + function (str, id) { + lib.skill.yuuki_yicha.changePrompt(str, event.videoId); + }, + str, + id + ); + } + player + .chooseButton() + .set("dialog", event.videoId) + .set("filterButton", function (button) { + var posx = button.pos_x, + posy = button.pos_y; + var list = [], + cards = ui.dialog.cards; + for (var i of cards) { + if (i.pos_x == posx && Math.abs(i.pos_y - posy) == 1) list.push(i.link); + if (i.pos_y == posy && Math.abs(i.pos_x - posx) == 1) list.push(i.link); + } + if (list.length > 0) { + var color = get.color(list[0], false); + if (list.length > 1) { + for (var i = 1; i < list.length; i++) { + if (get.color(list[i]) != color) return false; + } + } + return get.color(_status.event.card, false) != color; + } + return false; + }) + .set("card", card); + "step 5"; + if (result.bool) { + cards.push(card); + event.positions.remove(result.links[0]); + game.broadcastAll( + function (card, id, pos, player) { + lib.skill.yuuki_yicha.addCard(card, id, pos); + lib.skill.yuuki_yicha.changePrompt(get.translation(player) + "放置了" + get.translation(card), id); + }, + card, + event.videoId, + result.links[0], + player + ); + game.delay(2); + } + if (event.count > 0) event.goto(3); + "step 6"; + game.broadcastAll("closeDialog", event.videoId); + player.chooseTarget("令一名角色获得" + get.translation(cards), true).set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 7"; + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(cards, "gain2"); + } + }, + }, + //库特莉亚芙卡 + kud_qiaoshou: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return !player.getExpansions("kud_qiaoshou_equip").length && player.countCards("h") > 0; + }, + chooseButton: { + dialog() { + var list = []; + var list2 = ["pyzhuren_heart", "pyzhuren_diamond", "pyzhuren_club", "pyzhuren_spade", "pyzhuren_shandian", "rewrite_zhuge"]; + list2.addArray(lib.inpile); + for (var i of list2) { + var sub = get.subtype(i); + if (["equip1", "equip4"].includes(sub)) list.push([sub, "", i]); + } + return ui.create.dialog("巧手:选择一种装备牌", [list, "vcard"], "hidden"); + }, + check(button) { + var player = _status.event.player; + var name = button.link[2]; + if (get.subtype(name) == "equip4" || player.getEquip(name)) return 0; + var sha = player.countCards("h", "sha"); + switch (name) { + case "rewrite_zhuge": + return sha - player.getCardUsable("sha"); + case "guding": + if ( + sha > 0 && + game.hasPlayer(function (current) { + return get.attitude(player, current) < 0 && !current.countCards("h") && player.canUse("sha", current) && get.effect(current, { name: "sha" }, player) > 0; + }) + ) + return 1.4 + Math.random(); + return 0; + case "guanshi": + if (sha > 0) return 0.7 + Math.random(); + return 0; + case "qinggang": + if (sha > 0) return 0.4 + Math.random(); + return 0; + case "zhuque": + if ( + game.hasPlayer(function (current) { + return get.attitude(player, current) < 0 && current.getEquip("tengjia") && get.effect(current, { name: "sha", nature: "fire" }, player) > 0; + }) + ) + return 1.2 + Math.random(); + return 0; + default: + return 0; + } + }, + backup(links) { + var next = get.copy(lib.skill.kud_qiaoshou_backupx); + next.cardname = links[0][2]; + return next; + }, + prompt(links) { + return "将一张手牌置于武将牌上,然后视为装备" + get.translation(links[0][2]); + }, + }, + group: "kud_qiaoshou_end", + ai: { + notemp: true, + order: 5, + result: { + player: 1, + }, + }, + }, + kud_qiaoshou_backupx: { + filterCard: true, + discard: false, + lose: false, + delay: false, + check(event, player) { + return 6 - get.value(card); + }, + content() { + "step 0"; + player.addToExpansion(cards, player, "give").gaintag.add("kud_qiaoshou_equip"); + "step 1"; + if (!player.getExpansions("kud_qiaoshou_equip").length) return; + player.addTempSkill("kud_qiaoshou_equip", { + player: ["phaseUseEnd", "phaseZhunbeiBegin"], + }); + var name = lib.skill.kud_qiaoshou_backup.cardname; + player.storage.kud_qiaoshou_equip2 = name; + var info = lib.card[name].skills; + if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info); + player.draw(); + game.log(player, "声明了", "#y" + get.translation(name)); + }, + ai: { + result: { + player: 1, + }, + }, + }, + kud_qiaoshou_equip: { + charlotte: true, + mod: { + globalFrom(from, to, distance) { + var info = lib.card[from.storage.kud_qiaoshou_equip2]; + if (info && info.distance && info.distance.globalFrom) return distance + info.distance.globalFrom; + }, + globalTo(from, to, distance) { + var info = lib.card[to.storage.kud_qiaoshou_equip2]; + if (info && info.distance && info.distance.globalTo) return distance + info.distance.globalTo; + }, + attackRange(from, distance) { + var info = lib.card[from.storage.kud_qiaoshou_equip2]; + if (info && info.distance && info.distance.attackFrom) return distance - info.distance.attackFrom; + }, + attackTo(from, to, distance) { + var info = lib.card[to.storage.kud_qiaoshou_equip2]; + if (info && info.distance && info.distance.attackTo) return distance + info.distance.attackTo; + }, + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + markcount: "expansion", + mark(dialog, storage, player) { + dialog.add(player.getExpansions("kud_qiaoshou_equip")); + dialog.addText("当前装备:" + get.translation(player.storage.kud_qiaoshou_equip2)); + var str2 = lib.translate[player.storage.kud_qiaoshou_equip2 + "_info"]; + if (str2) { + if (str2.length >= 12) dialog.addText(str2, false); + else dialog.addText(str2); + } + }, + onunmark(storage, player) { + player.removeAdditionalSkill("kud_qiaoshou_equip"); + delete player.storage.kud_qiaoshou_equip2; + player.addEquipTrigger(); + }, + }, + }, + kud_qiaoshou_end: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.countCards("h") > 0 && !player.getExpansions("kud_qiaoshou_equip").length; + }, + cost() { + "step 0"; + var list = []; + var list2 = ["rewrite_bagua", "rewrite_renwang", "rewrite_tengjia", "rewrite_baiyin"]; + list2.addArray(lib.inpile); + for (var i of list2) { + var sub = get.subtype(i); + if (["equip2", "equip3"].includes(sub)) list.push([sub, "", i]); + } + player.chooseButton([get.prompt("kud_qiaoshou"), [list, "vcard"]]).set("ai", function (button) { + var player = _status.event.player; + var name = button.link[2]; + if (get.subtype(name) == "equip3" || player.getEquip(name)) return false; + switch (name) { + case "yexingyi": + if (player.hp > 2 || player.getEquip("bagua") || player.getEquip("tengjia")) return 1.5 + Math.random(); + return 0.5 + Math.random(); + case "rewrite_bagua": + case "rewrite_renwang": + if (player.getEquip("bagua") || player.getEquip("tengjia") || player.getEquip("renwang")) return Math.random(); + return 1.2 + Math.random(); + case "rewrite_tengjia": + if (player.getEquip("baiyin")) return 1.3 + Math.random(); + return Math.random(); + case "rewrite_baiyin": + return 0.4 + Math.random(); + default: + return 0; + } + }); + "step 1"; + if (result.bool) { + event.cardname = result.links[0][2]; + player.chooseCard("h", true, "将一张手牌置于武将牌上,然后视为装备" + get.translation(event.cardname)); + } else event.finish(); + "step 2"; + if (result.bool) { + event.result = { + bool: true, + cards: result.cards, + cost_data: { + cardname: event.cardname, + }, + }; + } + }, + async content(event, trigger, player) { + await player.addToExpansion(event.cards, player, "give").gaintag.add("kud_qiaoshou_equip"); + if (!player.getExpansions("kud_qiaoshou_equip").length) return; + player.addTempSkill("kud_qiaoshou_equip", { + player: ["phaseUseEnd", "phaseZhunbeiBegin"], + }); + var name = event.cost_data.cardname; + player.storage.kud_qiaoshou_equip2 = name; + player.markAuto("kud_qiaoshou_equip", cards); + var info = lib.card[name].skills; + if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info); + game.log(player, "声明了", "#y" + get.translation(name)); + await player.draw(); + }, + }, + kud_buhui: { + enable: "chooseToUse", + filter(event, player) { + return event.type == "dying" && player == event.dying && player.getExpansions("kud_qiaoshou_equip").length + player.countCards("e") > 0; + }, + skillAnimation: true, + limited: true, + animationColor: "gray", + content() { + "step 0"; + player.awakenSkill("kud_buhui"); + var cards = player.getCards("e").concat(player.getExpansions("kud_qiaoshou_equip")); + if (cards.length) player.discard(cards); + player.removeSkill("kud_qiaoshou_equip"); + player.draw(cards.length); + player.addSkills("kud_chongzhen"); + "step 1"; + var num = 2 - player.hp; + if (num) player.recover(num); + }, + derivation: "riki_chongzhen", + ai: { + order: 0.5, + result: { + player: 1, + }, + save: true, + skillTagFilter(player, tag, target) { + return player == target; + }, + }, + }, + kud_chongzhen: { + inherit: "riki_chongzhen", + }, + //神尾观铃 + misuzu_hengzhou: { + trigger: { + player: ["phaseJieshuBegin", "recoverEnd", "damageEnd", "phaseDrawBegin2", "phaseZhunbeiBegin"], + }, + forced: true, + character: true, + filter(event, player) { + if (event.name == "phaseZhunbei") return true; + if (["damage", "recover"].includes(event.name)) return event.num > 0; + var num = player.countMark("misuzu_hengzhou"); + if (event.name == "phaseDraw") return num > 0 && !event.numFixed; + return num > 3; + }, + content() { + var num = player.countMark("misuzu_hengzhou"); + if (trigger.name == "phaseDraw") trigger.num += num; + else if (trigger.name == "phaseJieshu") { + player.removeMark("misuzu_hengzhou", num); + player.loseHp(); + } else player.addMark("misuzu_hengzhou", trigger.num || 1); + }, + intro: { + name: "诅咒", + name2: "诅咒", + content: "mark", + }, + marktext: "诅", + mod: { + maxHandcard(player, num) { + return num + player.countMark("misuzu_hengzhou"); + }, + }, + ai: { + notemp: true, + }, + }, + misuzu_nongyin: { + enable: "chooseToUse", + viewAs: { + name: "tao", + isCard: true, + }, + viewAsFilter(player) { + return ( + !player.hasJudge("lebu") && + player.countCards("hes", function (card) { + return get.color(card) == "red" && get.type(card, "trick") != "trick"; + }) + ); + }, + filterCard(card) { + return get.color(card) == "red" && get.type(card, "trick") != "trick"; + }, + check(card) { + return 7 + (_status.event.dying || _status.event.player).getDamagedHp() - get.value(card); + }, + ignoreMod: true, + position: "hes", + precontent() { + player.logSkill("misuzu_nongyin"); + player.$throw(event.result.cards); + player.addJudge({ name: "lebu" }, event.result.cards); + event.result.card.cards = []; + event.result.cards = []; + delete event.result.skill; + delete event.result.card.suit; + delete event.result.card.number; + }, + ai: { + result: 0.5, + }, + }, + misuzu_zhongxing: { + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + var evt = event.getl(player); + return evt && evt.js && evt.js.length > 0 && !player.hasSkill("misuzu_zhongxing_haruko"); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("misuzu_zhongxing"), "令一名角色选择摸两张牌或回复1点体力") + .set("ai", function (card) { + return get.attitude(_status.event.player, card); + }) + .forResult(); + }, + async content(event, trigger, player) { + var target = event.targets[0]; + player.logSkill("misuzu_zhongxing", target); + player.addTempSkill("misuzu_zhongxing_haruko"); + target.chooseDrawRecover(2, true); + }, + }, + misuzu_zhongxing_haruko: { charlotte: true }, + //久岛鸥 + kamome_suitcase: { + trigger: { + player: ["phaseJudgeBefore", "phaseDiscardBefore", "turnOverBefore"], + }, + forced: true, + popup: false, + equipSkill: true, + content() { + trigger.cancel(); + }, + }, + kamome_yangfan: { + trigger: { + player: ["loseAfter", "enterGame"], + global: ["equipAfter", "addJudgeAfter", "phaseBefore", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter(event, player) { + if (typeof event.getl != "function") return event.name != "phase" || game.phaseNumber == 0; + var evt = event.getl(player); + return evt && evt.player == player && evt.es && evt.es.length; + }, + content() { + if (trigger.getl) player.draw(2 * trigger.getl(player).es.length); + else player.equip(game.createCard2("kamome_suitcase", "spade", 1)); + }, + ai: { + noe: true, + reverseEquip: true, + effect: { + target(card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, + }, + }, + kamome_huanmeng: { + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + content() { + "step 0"; + var num = 1 + player.countCards("e"); + 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, + }, + }, + kamome_jieban: { + trigger: { + player: "damageEnd", + source: "damageSource", + }, + zhuanhuanji: true, + marktext: "☯", + mark: true, + intro: { + content(storage, player) { + return "转换技。每回合限一次,当你受到或造成伤害后," + (!storage ? "你可将两张牌交给一名其他角色,然后其交给你一张牌。" : "你可将一张牌交给一名其他角色,然后其交给你两张牌。"); + }, + }, + filter(event, player) { + var num = player.storage.kamome_jieban ? 1 : 2; + return player.countCards("he") >= num && !player.hasSkill("kamome_jieban_phase"); + }, + async cost(event, trigger, player) { + event.num = player.storage.kamome_jieban ? 1 : 2; + event.result = await player + .chooseCardTarget({ + position: "he", + filterCard: true, + filterTarget: lib.filter.notMe, + selectCard: event.num, + prompt: get.prompt("kamome_jieban"), + prompt2: event.num == 2 ? "将两张牌交给一名其他角色,然后其交给你一张牌。" : "将一张牌交给一名其他角色,然后其交给你两张牌。", + ai1(card) { + if (card.name == "du") return 20; + var val = get.value(card); + var player = _status.event.player; + if (get.position(card) == "e") { + if (val <= 0) return 10; + return 10 / val; + } + return 6 - val; + }, + ai2(target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -2 * att; + if (att > 0) return 1.5 * att; + var num = get.select(_status.event.selectCard)[1]; + if (att < 0 && num == 1) return -0.7 * att; + return att; + }, + }) + .forResult(); + }, + content() { + "step 0"; + event.num = player.storage.kamome_jieban ? 1 : 2; + var target = targets[0]; + event.target = target; + player.addTempSkill("kamome_jieban_phase"); + player.give(cards, target); + player.changeZhuanhuanji("kamome_jieban"); + "step 1"; + var num = 3 - event.num; + var hs = target.getCards("he"); + if (hs.length) { + if (hs.length <= num) event._result = { bool: true, cards: hs }; + else { + target.chooseCard("he", true, "交给" + get.translation(player) + get.cnNumber(num) + "张牌", num).set("ai", function (card) { + var player = _status.event.player; + var target = _status.event.getParent().player; + if (get.attitude(player, target) > 0) { + if (!target.hasShan() && card.name == "shan") return 10; + if (get.type(card) == "equip" && !get.cardtag(card, "gifts") && target.hasUseTarget(card)) return 10 - get.value(card); + return 6 - get.value(card); + } + return -get.value(card); + }); + } + } else event.finish(); + "step 2"; + target.give(result.cards, player); + }, + }, + kamome_jieban_phase: { charlotte: true }, + //友利奈绪 + nao_duyin: { + trigger: { global: "phaseBegin" }, + filter(event, player) { + return event.player != player && (!player.storage.nao_duyin || !player.storage.nao_duyin.includes(event.player)); + }, + logTarget: "player", + charlotte: true, + check() { + return false; + }, + content() { + "step 0"; + player.chooseToDiscard("he", "弃置一张牌,或将武将牌翻面").set("ai", function (card) { + if (_status.event.player.isTurnedOver()) return 0; + return 6 - get.value(card); + }); + "step 1"; + if (!result.bool) player.turnOver(); + player.addTempSkill("nao_duyin2", { player: "phaseAfter" }); + if (!player.storage.nao_duyin) player.storage.nao_duyin = []; + player.storage.nao_duyin.push(trigger.player); + if (!player.storage.nao_duyin2) player.storage.nao_duyin2 = []; + player.storage.nao_duyin2.push(trigger.player); + player.markSkill("nao_duyin2"); + }, + }, + nao_duyin2: { + intro: { + content: "$不能使用牌指定你为目标,对$使用牌没有距离和次数限制", + }, + mod: { + targetEnabled(card, player, target) { + if (target.storage.nao_duyin2 && target.storage.nao_duyin2.includes(player)) return false; + }, + targetInRange(card, player, target) { + if (player.storage.nao_duyin2 && player.storage.nao_duyin2.includes(target)) return true; + }, + }, + trigger: { player: "useCardEnd" }, + firstDo: true, + silent: true, + onremove: true, + filter(event, player) { + if (player.storage.nao_duyin2) { + for (var i of player.storage.nao_duyin2) { + if (event.targets.includes(i)) return true; + } + } + return false; + }, + content() { + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat(); + if (stat && stat.card && stat.card[trigger.card.name]) stat.card[trigger.card.name]--; + } + }, + }, + nao_wanxin: { + trigger: { global: "phaseEnd" }, + hasHistory(player) { + return player.getHistory("damage").length > 0; + }, + filter(event, player) { + return game.hasPlayer(function (current) { + return lib.skill.nao_wanxin.hasHistory(current); + }); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("nao_wanxin"), function (card, player, target) { + return _status.event.yuus.includes(target); + }) + .set( + "yuus", + game.filterPlayer(function (current) { + return lib.skill.nao_wanxin.hasHistory(current); + }) + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + await target.draw(2); + await player.turnOver(false); + await player.link(false); + if (target == player) return; + await target.turnOver(false); + await target.link(false); + }, + }, + nao_shouqing: { + global: "nao_shouqing2", + }, + nao_shouqing2: { + enable: "phaseUse", + viewAs() { + return { name: "tao" }; + }, + filterCard: { name: "tao" }, + ignoreMod: true, + filterTarget(card, player, target) { + return target != player && target.isDamaged() && target.hasSkill("nao_shouqing"); + }, + selectTarget() { + return game.countPlayer(function (current) { + return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current); + }) > 1 + ? 1 + : -1; + }, + filter(event, player) { + return ( + player.countCards("hs", "tao") && + game.hasPlayer(function (current) { + return lib.skill.nao_shouqing2.filterTarget(null, player, current); + }) + ); + }, + position: "hs", + onuse(links, player) { + player.addSkill("nao_shouqing3"); + player.addMark("nao_shouqing3", 1, false); + }, + prompt() { + var list = game.filterPlayer(function (current) { + return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current); + }); + var str = "对" + get.translation(list); + if (list.length > 1) str += "中的一名角色"; + str += "使用一张【桃】"; + return str; + }, + }, + nao_shouqing3: { + intro: { + content: "手牌上限+#", + }, + mod: { + maxHandcard(player, num) { + return num + player.countMark("nao_shouqing3"); + }, + }, + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "nao_shouqing2"; + }, + content() { + player.draw(); + }, + }, + + nsqiyue: { + trigger: { + global: ["turnOverEnd", "linkEnd", "showCharacterEnd", "hideCharacterEnd", "removeCharacterEnd"], + }, + forced: true, + content() { + player.draw(); + }, + }, + nsxuezhu: { + trigger: { player: "damageEnd", source: "damageSource" }, + filter(event, player) { + return event.player.isIn(); + }, + logTarget: "player", + content() { + trigger.player.draw(2); + trigger.player.turnOver(); + }, + check(event, player) { + return !event.player.isTurnedOver() || get.attitude(player, event.player) > 0; + }, + }, + noname_zhuyuan: { + enable: "phaseUse", + position: "he", + selectCard: 4, + complexCard: true, + charlotte: true, + prompt: "将4张花色各不同的牌交一名角色并令你与其获得【铁骑】和【激昂】直到各自回合结束", + check(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.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); + }, + filterCard(card, player) { + var suit = get.suit(card, player); + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.suit(ui.selected.cards[i], player) == suit) return false; + } + return true; + }, + filter(event, player) { + var suits = []; + player.countCards("he", function (card) { + if (suits.length < 4) suits.add(get.suit(card, player)); + }); + if (suits.length < 4) return false; + var stat = player.getStat(); + if (!stat.noname_zhuyuan) return true; + return game.hasPlayer(function (current) { + return current != player && !stat.noname_zhuyuan.includes(current); + }); + }, + filterTarget(card, player, target) { + if (player == target) return false; + var stat = player.getStat(); + if (!stat.noname_zhuyuan) return true; + return !stat.noname_zhuyuan.includes(target); + }, + discard: false, + lose: false, + delay: false, + content() { + "step 0"; + var stat = player.getStat(); + if (!stat.noname_zhuyuan) stat.noname_zhuyuan = []; + stat.noname_zhuyuan.push(target); + player.give(cards, target, "visible"); + "step 1"; + game.log(player, "获得了技能", "#g【铁骑】"); + player.addTempSkill("noname_retieji", { + player: "phaseAfter", + }); + game.log(player, "获得了技能", "#g【激昂】"); + player.addTempSkill("noname_jiang", { + player: "phaseAfter", + }); + game.log(target, "获得了技能", "#g【铁骑】"); + target.addTempSkill("noname_retieji", { + player: "phaseAfter", + }); + game.log(target, "获得了技能", "#g【激昂】"); + target.addTempSkill("noname_jiang", { + player: "phaseAfter", + }); + }, + mod: { + targetInRange(card, player) { + var stat = player.getStat(); + if (stat.noname_zhuyuan) return true; + }, + cardUsable(card, player) { + var stat = player.getStat(); + if (!stat.noname_zhuyuan) return Infinity; + }, + }, + ai: { + order: 5, + result: { + target: 10, + }, + }, + }, + noname_retieji: { + inherit: "retieji", + mark: true, + marktext: "", + intro: { + name: "小无·铁骑", + content: "你使用【杀】指定一名角色为目标后,可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。", + }, + }, + noname_jiang: { + inherit: "jiang", + mark: true, + marktext: "", + intro: { + name: "小无·激昂", + content: "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", + }, + }, + noname_duocai: { + trigger: { + global: ["loseAfter", "loseAsyncAfter"], + }, + filter(event, player) { + if (event.type != "discard" || event.getlx === false) return false; + var evt = event.getl(player); + var cards = event.cards.slice(0); + if (evt && evt.cards) cards.removeArray(evt.cards); + return cards.filterInD("d").length > 0 && !player.hasSkill("noname_duocai2"); + }, + direct: true, + charlotte: true, + content() { + "step 0"; + if (trigger.delay == false && player != game.me && !player.isOnline()) game.delay(); + var evt = trigger.getl(player); + var cards = trigger.cards.slice(0); + cards.removeArray(evt.cards); + player.chooseButton([get.prompt("noname_duocai"), cards], [1, cards.length]); + "step 1"; + if (result.bool) { + player.logSkill("noname_duocai"); + player.addTempSkill("noname_duocai2"); + player.gain(result.links, "gain2"); + if (result.links.length > 2) { + var filterTarget = function (card, player, target) { + return target != player && target.countDiscardableCards(player, "hej") > 0; + }; + if ( + game.hasPlayer(function (current) { + return filterTarget(null, player, current); + }) + ) { + player.chooseTarget("弃置一名其他角色区域内的一张牌", true, filterTarget).set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe" }, player, player); + }); + } else event.finish(); + } else { + if (result.links.length == 2) player.draw(); + else player.recover(); + event.finish(); + } + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, "hej", true); + } + }, + }, + noname_duocai2: { charlotte: true }, + nsbizhao: { + trigger: { player: "showCharacterAfter" }, + forced: true, + hiddenSkill: true, + filter(event, player) { + return event.toShow && event.toShow.includes("ns_yanghu") && player != _status.currentPhase; + }, + content() { + player.addTempSkill("nsbizhao2", { + player: "phaseBeginStart", + }); + }, + }, + nsbizhao2: { + charlotte: true, + mark: true, + intro: { content: "其他角色至自己的距离+1" }, + mod: { + globalTo(source, player, distance) { + return distance + 1; + }, + }, + }, + nsqingde: { + trigger: { + player: "damageEnd", + source: "damageSource", + }, + usable: 1, + filter(event, player) { + if (!event.card || !event.cards || event.player == event.source || (event.card.name != "sha" && get.type(event.card) != "trick") || event.cards.filterInD().length != 1) return false; + var target = lib.skill.nsqingde.logTarget(event, player); + if (player.hasSkillTag("noCompareSource") || target.hasSkillTag("noCompareTarget")) return false; + return target.countCards("h") > 0; + }, + logTarget(event, player) { + if (player == event.source) return event.player; + return event.source; + }, + check(event, player) { + var target = lib.skill.nsqingde.logTarget(event, player); + return get.attitude(player, target) <= 0; + }, + content() { + "step 0"; + var target = lib.skill.nsqingde.logTarget(trigger, player); + event.target = target; + var next = player.chooseToCompare(target); + if (event.triggername == "damageSource") next.set("small", true); + if (!next.fixedResult) next.fixedResult = {}; + next.fixedResult[player.playerid] = trigger.cards.filterInD()[0]; + "step 1"; + if (result.tie) { + event.finish(); + return; + } + var i = result.bool; + if (event.triggername == "damageSource") i = !i; + event.target2 = i ? player : target; + if (event.triggername == "damageSource") event.goto(3); + else if (event.target2.isDamaged()) + player.chooseBool("是否令" + get.translation(event.target2) + "回复1点体力?").set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target2) > 0; + }); + else event.finish(); + "step 2"; + if (result.bool) event.target2.recover(); + event.finish(); + "step 3"; + player.chooseBool("是否令" + get.translation(event.target2) + "摸两张牌?").set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target2) > 0; + }); + "step 4"; + if (result.bool) event.target2.draw(2); + }, + ai: { + effect: { + target(card, player, target, current) { + if (target.storage.counttrigger && target.storage.counttrigger.nsqingde) return; + var num = get.number(card); + if (typeof num == "number") { + if (target.hasSkillTag("noCompareSource") || player.hasSkillTag("noCompareTarget")) return; + var hs = player.getCards("h"); + if (card.cards) hs.removeArray(card.cards); + if (ui.selected.cards) hs.removeArray(ui.selected.cards); + if (!hs.length) return; + for (var i of hs) { + if (get.number(i) >= num) return; + if (player.hasSkill("tianbian") && get.suit(card) == "heart") return; + } + return "zerotarget"; + } + }, + }, + }, + }, + nsyidi: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + check(card) { + var player = _status.event.player; + if (get.type(card, player) == "basic") { + if ( + game.hasPlayer(function (current) { + return get.attitude(current, player) > 0 && current.getUseValue(card) > player.getUseValue(card, null, true); + }) + ) + return 5 + Math.random(); + return 0; + } + if ( + game.hasPlayer(function (current) { + return get.attitude(current, player) > 0 && !current.hasJudge("lebu") && current.getUseValue(card) > player.getUseValue(card); + }) + ) + return 4.7 + Math.random(); + if ( + card.name == "wuxie" && + game.hasPlayer(function (current) { + return get.attitude(current, player) > 0; + }) + ) + return 5 + Math.random(); + return 4 - get.value(card); + }, + content() { + "step 0"; + player.give(cards, target, "visible"); + if (get.type(cards[0], player) != "basic") { + player.draw(); + event.finish(); + } + "step 1"; + if (target.getCards("h").includes(cards[0]) && target.hasUseTarget(cards[0])) target.chooseUseTarget(cards[0]); + }, + ai: { + order: 7, + result: { + player(player, target) { + if (!ui.selected.cards.length || get.type(ui.selected.cards[0], player) == "basic") return 0; + if (get.value(ui.selected.cards[0]) < 4) return 2; + return 0.5; + }, + target: 1, + }, + }, + }, + nsfuzhou: { + enable: "phaseUse", + usable: 2, + filter(event, player) { + if (!player.storage.nstaiping && player.getStat("skill").nsfuzhou) return false; + return player.countCards("he", { color: "black" }) > 0; + }, + filterCard: { color: "black" }, + filterTarget(card, player, target) { + return !target.hasJudge("nsfuzhou_card"); + }, + check(card) { + return 8 - get.value(card); + }, + prepare: "give", + position: "he", + discard: false, + lose: false, + delay: false, + content() { + "step 0"; + target.addJudge({ name: "nsfuzhou_card" }, cards[0]); + cards[0].storage.nsfuzhou_source = player; + "step 1"; + game.delayx(); + }, + ai: { + order: 5, + result: { + target(player, target) { + if (player.storage.nsfuzhou_draw) { + if ( + get.attitude(player, target) > 0 && + player.countCards("he", function (card) { + return get.color(card) == "red"; + }) + ) { + return 1; + } + return 0; + } + if (player.storage.nsfuzhou_damage) return -2; + return -1.5; + }, + }, + }, + }, + nsfuzhou_num: { + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.storage.nsfuzhou_num; + }, + }, + intro: { + content(num) { + return "手牌上限" + (num < 0 ? "" : "+") + num; + }, + }, + }, + nsguidao: { + trigger: { global: "judge" }, + filter(event, player) { + return ( + player.countCards("hes", function (card) { + if (player.storage.nstaiping || (_status.connectMode && get.position(card) != "e")) return true; + return get.color(card) == "black"; + }) > 0 + ); + }, + direct: true, + content() { + "step 0"; + player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("nsguidao"), "hes", function (card, player) { + if (!player.storage.nstaiping && get.color(card) != "black") return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.bool) { + player.respond(result.cards, "highlight", "nsguidao", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.$gain2(trigger.player.judging[0]); + player.gain(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + } + "step 3"; + game.delay(2); + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + nstaiping: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return ( + player.getAllHistory("sourceDamage", function (evt) { + return evt.getParent().name == "nsfuzhou_card"; + }).length > 1 || + player.getAllHistory("gain", function (evt) { + return evt.getParent(2).name == "nsfuzhou_card"; + }).length > 1 + ); + }, + content() { + player.awakenSkill("nstaiping"); + player.storage.nstaiping = true; + if ( + player.getAllHistory("sourceDamage", function (evt) { + return evt.getParent().name == "nsfuzhou_card"; + }).length > 1 + ) + player.storage.nsfuzhou_damage = true; + if ( + player.getAllHistory("gain", function (evt) { + return evt.getParent(2).name == "nsfuzhou_card"; + }).length > 1 + ) + player.storage.nsfuzhou_draw = true; + }, + ai: { + combo: "nsfuzhou", + }, + derivation: ["nsfuzhou_damage", "nsfuzhou_draw"], + }, + nsweiyuan: { + trigger: { player: "useCardToTargeted" }, + direct: true, + filter(event, player) { + return ( + player != event.target && + event.targets && + event.targets.length == 1 && + event.target.isIn() && + player.isPhaseUsing() && + !player.hasSkill("nsweiyuan2") && + game.hasPlayer(function (current) { + return current != player && current != event.target; + }) + ); + }, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("nsweiyuan"), function (card, player, target) { + return target != player && target != _status.event.getTrigger().target; + }) + .set("ai", function (target) { + return Math.max(Math.random(), get.attitude(player, target)); + }); + "step 1"; + if (result.bool) { + player.addTempSkill("nsweiyuan2", "phaseUseAfter"); + var target = result.targets[0]; + event.target = target; + player.logSkill("nsweiyuan", target); + target + .chooseCard("he", "交给" + get.translation(trigger.target) + "一张牌并受到1点伤害,或令" + get.translation(player) + "摸一张牌且可以重复使用牌") + .set("ai", function (card) { + if (_status.event.goon) return Math.random(); + return 0; + }) + .set( + "goon", + (function () { + if (get.attitude(target, player) > 0) return false; + return Math.random() > 0.5; + })() + ); + } else event.finish(); + "step 2"; + if (result.bool) { + target.gain(result.cards, trigger.target); + target.damage(); + } else { + player.addTempSkill("nsweiyuan_use"); + player.draw(); + } + }, + }, + nsweiyuan2: { charlotte: true }, + nsweiyuan_use_backup: {}, + nsweiyuan_use: { + enable: "phaseUse", + charlotte: true, + mod: { + cardUsable() { + if (_status.event.skill == "nsweiyuan_use_backup") return Infinity; + }, + targetInRange() { + if (_status.event.skill == "nsweiyuan_use_backup") return true; + }, + }, + onChooseToUse(event) { + if (game.online || event.type != "phase") return; + var list = []; + event.player.getHistory("useCard", function (evt) { + var name = evt.card.name; + var type = get.type(name); + if (type != "basic" && type != "trick") return; + if (name == "sha") { + var nature = evt.card.nature; + switch (nature) { + case "fire": + name = "huosha"; + break; + case "thunder": + name = "leisha"; + break; + case "kami": + name = "kamisha"; + break; + case "ice": + name = "icesha"; + break; + } + } + list.add(type + "咕咕" + name); + }); + event.set("nsweiyuan_list", list); + }, + filter(event, player) { + return player.countCards("h") > 0 && event.nsweiyuan_list && event.nsweiyuan_list.length > 0; + }, + chooseButton: { + dialog(event, player) { + return ui.create.dialog("围援", [ + event.nsweiyuan_list.map(function (i) { + return i.split("咕"); + }), + "vcard", + ]); + }, + filter(button, player) { + return lib.filter.cardEnabled( + { + name: button.link[2], + nature: button.link[3], + }, + player + ); + }, + check(button) { + return _status.event.player.getUseValue( + { + name: button.link[2], + nature: button.link[3], + }, + false + ); + }, + backup(links, player) { + return { + popname: true, + position: "h", + filterCard: true, + ai1(card) { + return 7 - get.value(card); + }, + viewAs: { + name: links[0][2], + nature: links[0][3], + }, + onuse(links, player) { + player.removeSkill("nsweiyuan_use"); + }, + }; + }, + prompt(links, player) { + return "将一张手牌当做" + get.translation(links[0][3] || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 1, + result: { + player: 1, + }, + }, + }, + nsjuxian: { + trigger: { player: "damageBegin2" }, + filter(event, player) { + return !player.hasSkill("nsjuxian2"); + }, + check(event, player) { + if (player.countCards("h") + 2 >= player.maxHp) return !event.source || !event.source.countCards("he") || get.attitude(player, event.source) > 0; + return true; + }, + content() { + "step 0"; + player.addSkill("nsjuxian2"); + player.draw(2); + "step 1"; + var target = trigger.source; + if (player.countCards("h") >= player.maxHp && target && target.countCards("he")) { + player.line(target, "green"); + target.chooseToDiscard("he", true); + } + }, + }, + nsjuxian2: { + trigger: { player: "phaseDrawBefore" }, + forced: true, + charlotte: true, + content() { + player.removeSkill("nsjuxian2"); + trigger.cancel(); + game.log(player, "跳过了", "#y摸牌阶段"); + }, + }, + nsdiewu: { + trigger: { + player: ["damageEnd", "gainAfter"], + global: "loseAsyncAfter", + }, + forced: true, + locked: false, + filter(event, player) { + if (event.name != "damage") return event.getg(player).length > 1; + return true; + }, + content() { + player.addMark("nsdiewu", 1); + }, + intro: { + content: "mark", + }, + group: ["nsdiewu_sha", "nsdiewu_shan", "nsdiewu_draw"], + subSkill: { + sha: { + enable: "chooseToUse", + viewAs: { name: "sha", isCard: true }, + prompt: "视为使用一张【杀】", + viewAsFilter(player) { + return player.countMark("nsdiewu") > 0; + }, + filterCard: () => false, + selectCard: -1, + onuse(links, player) { + player.removeMark("nsdiewu", 1); + }, + ai: { + order() { + var player = _status.event.player; + if (!player.storage.nspojian && player.countMark("nsdiewu") <= player.hp) return 0; + return get.order({ name: "sha" }) + 0.1; + }, + }, + }, + shan: { + enable: "chooseToUse", + viewAs: { name: "shan", isCard: true }, + viewAsFilter(player) { + return player.countMark("nsdiewu") > 0 && !player.storage.nspojian; + }, + filterCard: () => false, + selectCard: -1, + onuse(links, player) { + player.removeMark("nsdiewu", 1); + }, + ai: { + order() { + var player = _status.event.player; + if (player.hp > 1 && player.countMark("nsdiewu") <= player.hp) return 0; + return get.order({ name: "shan" }) - 0.2; + }, + }, + }, + draw: { + trigger: { source: "damageEnd" }, + forced: true, + popup: false, + filter(event, player) { + var evt = event.getParent(); + return evt && evt.type == "card" && evt.skill == "nsdiewu_sha"; + }, + content() { + player.draw(); + }, + }, + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + if (tag == "respondShan" && player.storage.nspojian) return false; + return player.countMark("nsdiewu") > 0; + }, + }, + }, + nslingying: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + 1; + }, + targetInRange(card) { + if (card.name == "sha") return true; + }, + }, + }, + nspojian: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "fire", + filter(event, player) { + return player.countMark("nsdiewu") >= player.hp; + }, + content() { + player.awakenSkill("nspojian"); + player.storage.nspojian = true; + player.loseMaxHp(); + player.draw(2); + player.addSkill("nsliegong"); + }, + derivation: "nsliegong", + ai: { + combo: "nsdiewu", + }, + }, + nsliegong: { + inherit: "xinliegong", + }, + nsguolie: { + trigger: { player: "phaseDrawBefore" }, + check(event, player) { + var h1 = player.getUseValue({ name: "sha" }, false); + var h2 = player.getUseValue({ name: "guohe" }); + return ( + player.countCards("h", function (card) { + if (get.color(card) == "red") return h1 > 0; + return h2 > 0; + }) > 2 + ); + }, + content() { + trigger.cancel(); + player.addTempSkill("nsguolie2"); + }, + }, + nsguolie2: { + mod: { + cardname(card, player) { + var color = get.color(card, player); + if (color == "red") return "sha"; + if (color == "black") return "guohe"; + }, + cardnature() { + return false; + }, + cardUsable() { + return Infinity; + }, + targetInRange() { + return true; + }, + }, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter(event, player) { + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.player == player) return; + for (var i of evt.cards) { + if (get.position(i, true) == "d") cards.push(i); + } + }); + return cards.length > 0; + }, + content() { + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.player == player) return; + if (evt.name == "cardsDiscard" && evt.parent.name == "orderingDiscard") return; + for (var i of evt.cards) { + if (get.position(i, true) == "d") cards.push(i); + } + }); + player.gain(cards, "gain2"); + }, + }, + nslongyue: { + init: () => { + game.addGlobalSkill("nslongyue_ai"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("nslongyue"), true)) game.removeGlobalSkill("nslongyue_ai"); + }, + trigger: { global: "useCard" }, + filter(event, player) { + return get.type(event.card, "trick") == "trick" && event.player.getHistory("useCard").indexOf(event) == 0; + }, + logTarget: "player", + check(event, player) { + return get.attitude(player, event.player) > 0; + }, + content() { + trigger.player.draw(); + }, + ai: { + expose: 0.2, + }, + }, + nslongyue_ai: { + mod: { + aiOrder(player, card, num) { + if ( + !player.getHistory("useCard").length && + get.type(card) == "trick" && + game.hasPlayer(function (current) { + return current.hasSkill("nslongyue") && get.attitude(player, current) >= 0; + }) + ) + return num + 6; + }, + }, + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("nslongyue"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("nslongyue_ai"); + }, + }, + nszhenyin: { + trigger: { global: "judge" }, + usable: 1, + filter(event, player) { + return _status.currentPhase && _status.currentPhase.countCards("h") > 0; + }, + logTarget() { + return _status.currentPhase; + }, + check(event, player) { + var target = _status.currentPhase; + var judge = event.judge(event.player.judging[0]); + var max = 0; + var hs = target.getCards("h", function (card) { + var mod2 = game.checkMod(card, target, "unchanged", "cardEnabled2", target); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, target, "unchanged", "cardRespondable", target); + if (mod != "unchanged") return mod; + return true; + }); + for (var i of hs) { + var num = event.judge(i) - judge; + if (num > max) max = num; + } + var att = get.attitude(player, target); + if (att > 0) return max > 0; + if (att < 0) return max <= 0; + return false; + }, + content() { + "step 0"; + if ( + !_status.currentPhase.countCards("h", function (card) { + var player = _status.currentPhase; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + ) { + event.finish(); + return; + } + _status.currentPhase + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + ",请打出一张手牌进行改判", "h", true, function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result / Math.max(0.1, get.value(card)); + } else { + return -result / Math.max(0.1, get.value(card)); + } + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.bool) { + _status.currentPhase.respond(result.cards, "highlight").nopopup = true; + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + game.delay(2); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + nsxianhai: { + trigger: { global: "damageSource" }, + filter(event, player) { + return event.source && event.source != player && event.source.isIn() && event.source == _status.currentPhase && (event.source.getStat("damage") || 0) > (player.getLastStat("damage") || 0) && !player.hasSkill("nsxianhai_round"); + }, + check(event, player) { + return player.maxHp > 1 && get.attitude(player, event.source) < -4; + }, + logTarget: "source", + content() { + "step 0"; + player.addTempSkill("nsxianhai_round", "roundStart"); + player.loseMaxHp(); + var list = []; + for (var i = 1; i < 6; i++) { + if (trigger.source.hasEnabledSlot(i)) list.add("equip" + (i == 3 || i == 4 ? "3_4" : i)); + } + if (list.length) { + player + .chooseControl(list) + .set("prompt", "选择废除" + get.translation(trigger.source) + "的一种装备栏") + .set("ai", function () { + var target = _status.event.getTrigger().source; + if (list.includes("equip6") && target.getEquip("equip3") && target.getEquip("equip4")) return "equip6"; + if (list.includes("equip2") && target.getEquip(2) && get.value(target.getEquip(2), target) > 0) return "equip2"; + if (list.includes("equip5") && target.getEquip(5) && get.value(target.getEquip(5), target) > 0) return "equip5"; + return 0; + }); + } else event.goto(2); + "step 1"; + if (result.control != "equip3_4") trigger.source.disableEquip(result.control); + else { + trigger.source.disableEquip(3, 4); + } + "step 2"; + if (player.awakenedSkills.includes("nsxingchu")) { + var next = game.createEvent("nsxianhai_clear"); + event.next.remove(next); + event.getParent("phase").after.push(next); + next.player = player; + next.setContent(function () { + player.restoreSkill("nsxingchu"); + }); + } + "step 3"; + if (trigger.source) { + var hs = trigger.source.getCards("h", "shan"); + if (hs.length) trigger.source.discard(hs); + } + }, + }, + nsxianhai_round: { charlotte: true }, + nsxingchu: { + trigger: { global: "die" }, + forceDie: true, + filter(event, player) { + return player == event.player || player == event.source; + }, + limited: true, + skillAnimation: true, + animationColor: "wood", + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("nsxingchu")) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("forceDie", true); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("nsxingchu", target); + player.awakenSkill("nsxingchu"); + var he = trigger.player.getCards("he"); + if (he.length) target.gain(he, trigger.player, "giveAuto", "bySelf"); + target.gainMaxHp(); + } + }, + }, + nsshengyan: { + trigger: { player: "judgeEnd" }, + forced: true, + filter(event, player) { + return _status.currentPhase && _status.currentPhase.isIn() && (!player.storage.nsshengyan2 || !player.storage.nsshengyan2.includes(event.result.suit)); + }, + logTarget() { + return _status.currentPhase; + }, + content() { + player.addTempSkill("nsshengyan2"); + if (!player.storage.nsshengyan2) player.storage.nsshengyan2 = []; + _status.currentPhase.addTempSkill("nsshengyan3"); + player.storage.nsshengyan2.add(trigger.result.suit); + _status.currentPhase.addMark("nsshengyan3", 2, false); + }, + }, + nsshengyan2: { onremove: true }, + nsshengyan3: { + mod: { + maxHandcard(player, num) { + return num + player.countMark("nsshengyan3"); + }, + }, + onremove: true, + intro: { + content: "本回合手牌上限+#", + }, + marktext: "筵", + }, + nsdaizhan: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter(event, player) { + return ( + (!player.hasJudge("lebu") || !player.hasJudge("bingliang")) && + player.countCards("he", function (card) { + if (_status.connectMode) return true; + return get.type(card, "trick") != "trick"; + }) + ); + }, + content() { + var next = player.chooseToUse(); + next.set("norestore", true); + next.set("_backupevent", "nsdaizhanx"); + next.set("custom", { + add: {}, + replace: { window() {} }, + }); + next.backup("nsdaizhanx"); + }, + }, + nsdaizhanx: { + chooseButton: { + dialog() { + var list = ["lebu", "bingliang"]; + var list2 = []; + for (var i of list) { + list2.push(["延时锦囊", "", i]); + } + return ui.create.dialog(get.prompt("nsdaizhan"), [list2, "vcard"], "hidden"); + }, + filter(button, player) { + return !player.hasJudge(button.link[2]); + }, + check(button) { + if (button.link[2] == "lebu") return 0; + var player = _status.event.player; + var delta = player.getHandcardLimit() + player.countCards("j") * 2 + 2 - player.hp; + if (delta >= 2) return 1 + Math.random(); + if ( + delta >= 0 && + !player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) + return Math.random(); + return 0; + }, + backup(links, player) { + return { + filterCard(card, player) { + return ( + get.itemtype(card) == "card" && + get.type(card, "trick") != "trick" && + player.canAddJudge({ + name: links[0][2], + cards: [card], + }) + ); + }, + filterTarget(card, player, target) { + return player == target; + }, + check(card) { + return 8 - get.value(card); + }, + viewAs: { name: links[0][2] }, + position: "he", + precontent() { + player.addTempSkill("nsdaizhany"); + event.result.skill = "nsdaizhan"; + }, + ai: { + result: { + target: 1, + }, + }, + }; + }, + prompt(links) { + return "将一张牌当做" + get.translation(links[0][2]) + "对自己使用"; + }, + }, + }, + nsdaizhany: { + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + filter(event, player) { + return player.countCards("h") < player.getHandcardLimit(); + }, + content() { + player.drawTo(player.getHandcardLimit()); + }, + ai: { + nowuxie_judge: true, + }, + }, + nsjiquan: { + trigger: { + global: ["damageEnd", "damageSource"], + }, + direct: true, + filter(event, player, name) { + var target = name == "damageSource" ? event.source : event.player; + return target && target != player && get.distance(player, target) <= 1 && target.countCards("hej") > 0; + }, + locked(skill, player) { + return player && player.storage.nsfuwei; + }, + content() { + "step 0"; + var target = event.triggername == "damageSource" ? trigger.source : trigger.player; + event.target = target; + player.choosePlayerCard(target, "hej", player.storage.nsfuwei ? true : 1).set("ai", function (button) { + var val = get.buttonValue(button); + if (get.attitude(_status.event.player, get.owner(button.link)) > 0) return -val; + return val; + }); + "step 1"; + if (result.bool) { + player.logSkill("nsjiquan", target); + player.addToExpansion(result.cards, target, "give").gaintag.add("nsjiquan_mark"); + } else event.finish(); + "step 2"; + game.delayx(); + }, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.getExpansions("nsjiquan_mark").length; + }, + }, + }, + nsjiquan_mark: { + intro: { + content: "expansion", + markcount: "expansion", + }, + marktext: "威", + }, + nsfuwei: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return player.getExpansions("nsjiquan_mark").length > 4; + }, + content() { + player.awakenSkill("nsfuwei"); + player.storage.nsfuwei = true; + player.addSkill("nsdiemou"); + player.addSkill("nszhihuang"); + player.gainMaxHp(2); + }, + derivation: ["nsdiemou", "nszhihuang"], + ai: { + combo: "nsjiquan", + }, + }, + nsdiemou: { + trigger: { player: "phaseUseBegin" }, + forced: true, + filter(event, player) { + return player.getExpansions("nsjiquan_mark").length > game.players.length; + }, + content() { + var cards = player.getExpansions("nsjiquan_mark"); + player.draw(cards.length); + player.loseMaxHp(); + player.loseToDiscardpile(cards); + if (cards.length > 4) player.turnOver(); + }, + ai: { + combo: "nsjiquan", + }, + }, + nszhihuang: { + group: "nszhihuang_damage", + trigger: { global: "useCard" }, + usable: 1, + filter(event, player) { + return event.player == get.zhu(player) && player.getExpansions("nsjiquan_mark").length > 0 && event.cards && event.cards.filterInD().length > 0; + }, + prompt2(event) { + return "移去一张“威”并获得" + get.translation(event.cards.filterInD()); + }, + check(event, player) { + if (["equip", "delay"].includes(get.type(event.card))) return get.attitude(player, event.player) < 0; + return get.value(event.cards.filterInD()) > 0; + }, + logTarget: "player", + content() { + "step 0"; + var cards = player.getExpansions("nsjiquan_mark"); + if (cards.length == 1) + event._result = { + bool: true, + links: cards.slice(0), + }; + else player.chooseButton(["选择移去一张“威”", cards], true); + "step 1"; + player.loseToDiscardpile(result.links); + player.gain(trigger.cards.filterInD(), "gain2", "log"); + }, + ai: { + combo: "nsjiquan", + }, + }, + nszhihuang_damage: { + trigger: { source: "damageBegin1" }, + forced: true, + filter(event, player) { + var zhu = get.zhu(player); + return zhu && player.countCards("h") > zhu.countCards("h") && event.getParent().type == "card"; + }, + content() { + trigger.num++; + }, + }, + //OL神张角 + junksijun: { + audio: "sijun", + inherit: "sijun", + check(event, player) { + return ui.cardPile.childNodes.length; + }, + async content(event, trigger, player) { + player.removeMark("yizhao", player.countMark("yizhao")); + const pile = Array.from(ui.cardPile.childNodes); + if (pile.length) { + const max = Math.pow(2, Math.min(100, pile.length)); + let bool = false, + index, + cards = []; + for (let i = 0; i < max; i++) { + let num = 0; + index = i.toString(2); + while (index.length < pile.length) { + index = "0" + index; + } + for (var k = 0; k < index.length; k++) { + if (index[k] == "1") num += get.number(pile[k]); + if (num > 36) break; + } + if (num == 36) { + bool = true; + break; + } + } + if (bool) { + for (let k = 0; k < index.length; k++) { + if (index[k] == "1") cards.push(pile[k]); + } + await player.gain(cards, "gain2"); + } else { + let total = 0; + for (const card of pile) { + total += get.number(card); + cards.push(card); + if (total >= 36) break; + } + } + if (cards.length) await player.gain(cards, "gain2"); + } + }, + }, + //手杀削弱版许攸 + junkshicai: { + audio: "nzry_shicai_2", + trigger: { player: "useCardAfter" }, + filter(event, player) { + if (!event.cards.filterInD("oe").length) return false; + return player.getHistory("useCard", evt => get.type2(evt.card) == get.type2(event.card)).indexOf(event) == 0; + }, + prompt2(event, player) { + const cards = event.cards.filterInD("oe"); + return "你可以将" + get.translation(cards) + (cards.length > 1 ? "以任意顺序" : "") + "置于牌堆顶,然后摸一张牌"; + }, + content() { + "step 0"; + event.cards = trigger.cards.filterInD("oe"); + var lose_list = []; + event.cards.forEach(card => { + var owner = get.owner(card); + if (owner) { + var arr = lose_list.find(i => i[0] == owner); + if (arr) arr[1].push(card); + else lose_list.push([owner, [card]]); + } + }); + if (lose_list.length) { + game.loseAsync({ + lose_list: lose_list, + }).setContent("chooseToCompareLose"); + } + "step 1"; + if (cards.length > 1) { + var next = player.chooseToMove("恃才:将牌按顺序置于牌堆顶"); + next.set("list", [["牌堆顶", cards]]); + next.set("reverse", _status.currentPhase && _status.currentPhase.next ? get.attitude(player, _status.currentPhase.next) > 0 : false); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0); + cards.sort(function (a, b) { + return (_status.event.reverse ? 1 : -1) * (get.value(b) - get.value(a)); + }); + return [cards]; + }); + } + "step 2"; + if (result.bool && result.moved && result.moved[0].length) cards = result.moved[0].slice(0); + cards.reverse(); + game.cardsGotoPile(cards, "insert"); + game.log(player, "将", cards, "置于了牌堆顶"); + player.draw(); + }, + ai: { + reverseOrder: true, + skillTagFilter(player) { + if ( + player.getHistory("useCard", function (evt) { + return get.type(evt.card) == "equip"; + }).length > 0 + ) + return false; + }, + }, + }, + //削弱版段煨 + junklangmie: { + audio: "langmie", + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter(event, player) { + if (player == event.player || player.countCards("he") == 0) return false; + var num = 0; + if ( + event.player.hasHistory("sourceDamage", function (evt) { + num += evt.num; + return num >= 2; + }) + ) + return true; + var map = {}; + return event.player.hasHistory("useCard", function (i) { + var name = get.type2(i.card, false); + if (!map[name]) { + map[name] = true; + return false; + } + return true; + }); + }, + content() { + "step 0"; + var list = [], + num = 0, + target = trigger.player; + event.target = target; + event.choices = []; + var map = {}; + if ( + target.hasHistory("useCard", function (i) { + var name = get.type2(i.card, false); + if (!map[name]) { + map[name] = true; + return false; + } + return true; + }) + ) { + list.push("弃置一张牌,然后摸两张牌"); + event.choices.push("draw"); + } + if ( + target.hasHistory("sourceDamage", function (evt) { + num += evt.num; + return num >= 2; + }) + ) { + list.push("弃置一张牌,对" + get.translation(target) + "造成1点伤害"); + event.choices.push("damage"); + } + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("ai", function () { + var player = _status.event.player; + var choices = _status.event.getParent().choices.slice(0); + choices.push("cancel"); + choicex = choices.slice(0); + var getx = function (a) { + switch (a) { + case "draw": + return 2 * get.effect(player, { name: "draw" }, player, player); + case "damage": + return get.damageEffect(_status.event.getParent().target, player, player); + default: + return 0; + } + }; + choices.sort(function (a, b) { + return getx(b) - getx(a); + }); + return choicex.indexOf(choices[0]); + }) + .set("prompt", get.prompt("junklangmie", target)); + "step 1"; + if (result.control == "cancel2") event.finish(); + else { + event.choice = event.choices[result.index]; + player.chooseToDiscard("he").set("ai", card => 7 - get.value(card)).logSkill = event.choice == "draw" ? "junklangmie" : ["junklangmie", target]; + } + "step 2"; + if (result.bool) { + if (event.choice == "draw") player.draw(2); + else target.damage(); + } + }, + }, + //李典光速通渠传说 + junkwangxi: { + audio: "wangxi", + trigger: { player: "damageEnd", source: "damageSource" }, + filter(event) { + if (event._notrigger.includes(event.player)) return false; + return event.num && event.source && event.player && event.player.isIn() && event.source.isIn() && event.source != event.player; + }, + check(event, player) { + if (player.isPhaseUsing()) return true; + if (event.player == player) return get.attitude(player, event.source) > -5; + return get.attitude(player, event.player) > -5; + }, + logTarget(event, player) { + if (event.player == player) return event.source; + return event.player; + }, + preHidden: true, + content() { + "step 0"; + event.count = trigger.num; + event.target = lib.skill.junkwangxi.logTarget(trigger, player); + "step 1"; + player.draw(2).gaintag = ["junkwangxi_tag"]; + event.count--; + "step 2"; + var cards = player.getCards("he", card => card.hasGaintag("junkwangxi_tag")); + if (cards.length > 0 && target.isIn()) { + if (cards.length == 1) event._result = { bool: true, cards: cards }; + else + player.chooseCard("he", "忘隙:交给" + get.translation(target) + "一张牌", true, function (card) { + return card.hasGaintag("junkwangxi_tag"); + }); + } else event.goto(4); + "step 3"; + if (result.bool) { + player.give(result.cards, target); + } + "step 4"; + player.removeGaintag("junkwangxi_tag"); + if (event.count && target.isIn() && player.hasSkill("junkwangxi")) { + player.chooseBool(get.prompt2("junkwangxi", target)); + } else event.finish(); + "step 5"; + if (result.bool) { + player.logSkill("junkwangxi", target); + event.goto(1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + }, + }, + //2013标准包双蜀黑 + junkjizhi: { + audio: "jizhi", + trigger: { player: "useCard" }, + frequent: true, + filter(event, player) { + return get.type(event.card) == "trick" && event.card.isCard; + }, + content() { + "step 0"; + var card = get.cards()[0]; + event.card = card; + game.cardsGotoOrdering(card); + player.showCards(card, get.translation(player) + "发动了【集智】"); + if (get.type(card) != "basic") { + player.gain(card, "gain2"); + event.finish(); + } else if (!player.countCards("h")) event.finish(); + "step 1"; + player.chooseCard("h", "是否用一张手牌交换" + get.translation(card) + "?", "若选择「取消」,则" + get.translation(card) + "将被置入弃牌堆。"); + "step 2"; + if (result.bool) { + var card = result.cards[0]; + player.$throw(card, 1000); + game.log(player, "将", card, "置于牌堆顶"); + player.lose(card, ui.cardPile, "visible", "insert"); + player.gain(event.card, "gain2"); + } + }, + }, + junkqicai: { + mod: { + targetInRange(card, player, target, now) { + var type = get.type(card); + if (type == "trick" || type == "delay") return true; + }, + canBeDiscarded(card) { + if (get.position(card) == "e" && !["equip3", "equip4", "equip6"].includes(get.subtype(card))) return false; + }, + }, + }, + junkrende: { + audio: "rende", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0; + }, + filterTarget: lib.filter.notMe, + filterCard: true, + selectCard: [1, Infinity], + position: "h", + discard: false, + lose: false, + delay: false, + content() { + "step 0"; + event.num = cards.length; + event.targets = targets.slice(0); + player.give(cards, target); + if (event.num > 1) player.recover(); + "step 1"; + if (player.countCards("h") > 0 && game.hasPlayer(current => current != player && !targets.includes(current))) { + player.chooseCardTarget({ + prompt: "是否继续分配剩余的手牌", + prompt2: "操作提示:请先选择要分配的手牌,然后再选择一名角色,该角色将获得你选择的所有手牌。", + filterCard: true, + selectCard: [1, Infinity], + filterTarget(card, player, target) { + return target != player && !_status.event.getParent().targets.includes(target); + }, + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + player.line(target, "green"); + player.give(cards, target); + targets.add(target); + event.num += cards.length; + if (num < 2 && event.num > 1) player.recover(); + event.goto(1); + } + }, + }, + //十周年削弱版张让 + junktaoluan: { + hiddenCard(player, name) { + return !player.getStorage("junktaoluan").includes(name) && player.countCards("hes", card => !player.getStorage("junktaoluan2").includes(get.suit(card))) > 0 && !player.hasSkill("junktaoluan3") && lib.inpile.includes(name); + }, + audio: "taoluan", + enable: "chooseToUse", + filter(event, player) { + return ( + !player.hasSkill("junktaoluan3") && + player.countCards("hes", card => { + return lib.inpile.some(name => { + if (player.getStorage("junktaoluan2").includes(get.suit(card))) return false; + if (player.getStorage("junktaoluan").includes(name)) return false; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + if ( + event.filterCard( + { + name: name, + isCard: true, + cards: [card], + }, + player, + event + ) + ) + return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if ( + event.filterCard( + { + name: name, + nature: nature, + isCard: true, + cards: [card], + }, + player, + event + ) + ) + return true; + } + } + return false; + }); + }) > 0 + ); + }, + chooseButton: { + dialog(event, player) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) == "basic" || get.type(name) == "trick") { + if (player.getStorage("junktaoluan").includes(name)) continue; + list.push([get.translation(get.type(name)), "", name]); + if (name == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } + } + } + return ui.create.dialog("滔乱", [list, "vcard"]); + }, + filter(button, player) { + return _status.event.getParent().filterCard({ name: button.link[2] }, player, _status.event.getParent()); + }, + check(button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], + }; + if (player.countCards("hes", cardx => cardx.name == card.name)) return 0; + return _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + }, + backup(links, player) { + return { + filterCard(card, player) { + return !player.getStorage("junktaoluan2").includes(get.suit(card)); + }, + audio: "taoluan", + popname: true, + check(card) { + return 7 - get.value(card); + }, + position: "hse", + viewAs: { name: links[0][2], nature: links[0][3] }, + onuse(result, player) { + player.markAuto("junktaoluan2", [get.suit(result.cards[0], player)]); + var evt = _status.event.getParent("phase"); + if (evt && evt.name == "phase" && !evt.junktaoluan) { + evt.junktaoluan = true; + var next = game.createEvent("taoluan_clear"); + _status.event.next.remove(next); + evt.after.push(next); + next.player = player; + next.setContent(function () { + delete player.storage.junktaoluan2; + }); + } + player.markAuto("junktaoluan", [result.card.name]); + }, + }; + }, + prompt(links, player) { + return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 4, + save: true, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (!player.countCards("hes", card => !player.getStorage("junktaoluan2").includes(get.suit(card))) || player.hasSkill("taoluan3")) return false; + if (tag == "respondSha" || tag == "respondShan") { + if (arg == "respond") return false; + return !player.getStorage("taoluan").includes(tag == "respondSha" ? "sha" : "shan"); + } + return !player.getStorage("taoluan").includes("tao") || (!player.getStorage("taoluan").includes("jiu") && arg == player); + }, + result: { + player(player) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && players[i].countCards("he") && get.attitude(player, players[i]) > 0) { + return 1; + } + } + return 0; + }, + }, + threaten: 1.9, + }, + group: "junktaoluan2", + }, + junktaoluan2: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + if (!game.hasPlayer(current => current != player)) return false; + return event.skill == "junktaoluan_backup"; + }, + content() { + "step 0"; + player + .chooseTarget( + true, + function (card, player, target) { + return target != player; + }, + "###滔乱###令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力" + ) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) { + if (get.attitude(target, player) > 0) { + return target.countCards("h"); + } + return target.countCards("h") / 2; + } + return 0; + }); + "step 1"; + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var type = get.type(trigger.card, "trick"); + target + .chooseCard("###滔乱###交给" + get.translation(player) + "一张不为" + get.translation(type) + "牌的牌,或令其失去1点体力且滔乱无效直到回合结束", "he", num, function (card, player, target) { + return get.type(card, "trick") != _status.event.cardType; + }) + .set("cardType", type) + .set("ai", function (card) { + if (_status.event.att) { + return 11 - get.value(card); + } + return 0; + }) + .set("att", get.attitude(target, player) > 0); + "step 2"; + if (result.bool) { + target.give(result.cards, player, "visible"); + } else { + player.addTempSkill("junktaoluan3"); + } + }, + }, + junktaoluan3: { + charlotte: true, + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + content() { + player.loseHp(); + }, + }, + junktaoluan_backup: { charlotte: true }, + + nshuaishuang: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content() { + "step 0"; + var card = get.cardPile(function (card) { + return card.name == "tao"; + }); + if (card) { + player.gain(card, "gain2"); + } else event.finish(); + "step 1"; + game.updateRoundNumber(); + player.loseHp(); + }, + }, + nsfengli: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && !current.hasSkill("nsfengli_use"); + }) + ); + }, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("nsfengli"), function (card, player, target) { + return target != player && !target.hasSkill("nsfengli_use"); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) / (5 + target.countCards("h")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("nsfengli", target); + var cards = player.getCards("h"); + player.addShownCards(cards, "visible_nsfengli"); + player.addSkill("nsfengli2"); + target.addSkill("nsfengli_use"); + target.storage.nsfengli_use = player; + } + }, + group: ["nsfengli_draw", "nsfengli_clear"], + onremove(player) { + player.removeSkill("nsfengli2"); + }, + }, + nsfengli_draw: { + trigger: { + player: ["loseAfter", "hideShownCardsAfter"], + global: ["gainAfter", "equipAfter", "addJudgeAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + charlotte: true, + filter(event, player, name) { + if (event.name == "hideShownCards") { + const hs = player.countCards("h"); + return game.hasPlayer(current => current.countCards("h") < hs); + } + var num = 0; + var evt = event.getl(player); + if (!evt || !evt.gaintag_map) return false; + var bool = false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].some(tag => tag.indexOf("visible_") == 0)) num++; + } + if (event.getg) { + if (event.name == "gain") { + if (event.getlx === false && event.gaintag.some(tag => tag.indexOf("visible_") == 0)) num -= event.cards.length; + } else { + player.checkHistory("gain", function (evt) { + if (evt.parent == event && evt.gaintag.some(tag => tag.indexOf("visible_") == 0)) { + num -= evt.cards.length; + } + }); + } + } + if (num > 0) { + const hs = player.countCards("h"); + return game.hasPlayer(current => current.countCards("h") < hs); + } + }, + content() { + "step 0"; + player + .chooseTarget("奉礼:是否令一名手牌数小于你的其他角色摸一张牌?", function (card, player, target) { + return target != player && target.countCards("h") < player.countCards("h"); + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("nsfengli", target); + target.draw(); + } + }, + }, + nsfengli_clear: { + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return player.hasSkill("nsfengli2"); + }, + content() { + var cards = player.getShownCards(); + if (cards.length > 0) player.hideShownCards(cards); + player.removeSkill("nsfengli2"); + }, + }, + nsfengli2: { + onremove(player) { + player.removeGaintag("nsfengli2"); + game.countPlayer(function (current) { + if (current.storage.nsfengli_use == player) current.removeSkill("nsfengli_use"); + }); + }, + }, + nsfengli_use: { + hiddenCard(player, name) { + if (player == _status.currentPhase) return false; + var target = player.storage.nsfengli_use; + var cards = target.getShownCards(); + for (var i of cards) { + if (get.name(i, target) == name) return true; + } + return false; + }, + enable: ["chooseToUse", "chooseToRespond"], + charlotte: true, + onremove: true, + filter(event, player) { + if (player == _status.currentPhase) return false; + var target = player.storage.nsfengli_use; + var cards = target.getShownCards(); + for (var i of cards) { + if ( + event.filterCard( + { + name: get.name(i, target), + nature: get.nature(i, target), + isCard: true, + }, + player, + event + ) + ) + return true; + } + return false; + }, + chooseButton: { + dialog(event, player) { + var target = player.storage.nsfengli_use; + var cards = target.getShownCards(); + return ui.create.dialog("奉礼", cards); + }, + filter(button, player) { + var evt = _status.event.getParent(); + var target = player.storage.nsfengli_use; + return evt.filterCard( + { + name: get.name(button.link, target), + nature: get.nature(button.link, target), + isCard: true, + }, + player, + evt + ); + }, + check(button) { + var player = _status.event.player; + var evt = _status.event.getParent(); + if (evt.dying) return get.attitude(player, evt.dying); + return 1; + }, + backup(links, player) { + var target = player.storage.nsfengli_use; + return { + viewAs: { + name: get.name(links[0], target), + nature: get.nature(links[0], target), + isCard: true, + }, + card: links[0], + filterCard: () => false, + selectCard: -1, + precontent() { + var card = lib.skill.nsfengli_use_backup.card; + var target = player.storage.nsfengli_use; + event.target = target; + player.logSkill("nsfengli", target); + delete event.result.skill; + player.showCards(card, get.translation(player) + "发动了【奉礼】"); + target.hideShownCards(card); + }, + }; + }, + ai: { + hasSha: true, + hasShan: true, + skillTagFilter(player, tag) { + var name = "s" + tag.slice(4); + return lib.skill.nsfengli_use.hiddenCard(player, name); + }, + }, + }, + ai: { + order: 8, + result: { + player: 1, + }, + }, + }, + ns_chuanshu: { + audio: ["xingshuai", 2], + trigger: { + global: "dying", + }, + priority: 8, + unique: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return event.player.hp <= 0 && event.player != player; + }, + check(event, player) { + return get.attitude(player, event.player) > 0; + }, + logTarget: "player", + content() { + "step 0"; + trigger.player.chooseControl("releiji", "guidao").set("prompt", "" + get.translation(trigger.player) + "获得一项技能"); + goon = true; + if (!goon) { + event.finish(); + } + "step 1"; + trigger.player.addSkillLog(result.control); + trigger.player.recover(1 - trigger.player.hp); + trigger.player.draw(2); + trigger.player.storage.ns_chuanshu2 = player; + trigger.player.addSkill("ns_chuanshu2"); + player.awakenSkill("ns_chuanshu"); + }, + }, + ns_xiandao1: { + audio: ["huashen", 2], + forced: true, + //noLose:true, + //locked:true, + //noRemove:true, + //noDisable:true, + priority: 10, + trigger: { + global: "gameStart", + player: ["phaseEnd", "enterGame"], + }, + //filter (event,player){ + // return player.isAlive(); + //}, + content() { + var n = [1, 2].randomGet(); + if (n == 1) { + player.addTempSkill("releiji", { + player: "phaseUseBegin", + }); + player.markSkill("releiji", { + player: "phaseUseBegin", + }); + } + if (n == 2) { + player.addTempSkill("guidao", { + player: "phaseUseBegin", + }); + player.markSkill("guidao", { player: "phaseUseBegin" }); + } + }, + }, + ns_xiandao2: { + audio: ["huashen", 2], + forced: true, + //noLose:true, + //locked:true, + //noRemove:true, + //noDisable:true, + trigger: { + player: "damageBefore", + }, + filter(event, player) { + if (!event.nature) return false; + return true; + }, + content() { + trigger.cancel(); + //event.finish(); + }, + }, + ns_xiandao: { + forced: true, + //noLose:true, + //locked:true, + noRemove: true, + //noDisable:true, + group: ["ns_xiandao1", "ns_xiandao2"], + }, + ns_chuanshu2: { + audio: ["songwei", 2], + mark: "character", + intro: { + content: "当你造成或受到一次伤害后,$摸一张牌", + }, + nopop: true, + trigger: { + source: "damageEnd", + player: "damageEnd", + }, + forced: true, + popup: false, + filter(event, player) { + return player.storage.ns_chuanshu2 && player.storage.ns_chuanshu2.isIn() && event.num > 0; + }, + content() { + "step 0"; + game.delayx(); + "step 1"; + var target = player.storage.ns_chuanshu2; + player.line(target, "green"); + target.draw(); + game.delay(); + }, + onremove: true, + group: "ns_chuanshu3", + }, + ns_chuanshu3: { + audio: 1, + trigger: { + player: "dieBegin", + }, + silent: true, + onremove: true, + filter(event, player) { + return player.storage.ns_chuanshu2 && player.storage.ns_chuanshu2.isIn(); + }, + content() { + "step 0"; + game.delayx(); + "step 1"; + var target = player.storage.ns_chuanshu2; + player.line(target, "green"); + //target.addSkill('ns_chuanshu'); + target.restoreSkill("ns_chuanshu"); + target.update(); + }, + forced: true, + popup: false, + }, + ns_xiuzheng: { + audio: ["xinsheng", 2], + enable: "phaseUse", + usable: 1, + priority: 10, + filter(event, player) { + return ui.cardPile.childElementCount + ui.discardPile.childElementCount >= 2; + }, + filterTarget(card, player, target) { + return player != target; + }, + content() { + "step 0"; + event.cards = get.cards(2); + player.showCards(event.cards); + "step 1"; + if (get.color(event.cards[0]) == "red" && get.color(event.cards[1]) == "red") { + target.damage("fire"); + } + if (get.color(event.cards[0]) != get.color(event.cards[1])) { + player.discardPlayerCard(target, "he", true); + } + if (get.color(event.cards[0]) == "black" && get.color(event.cards[1]) == "black") { + target.damage("thunder"); + } + "step 2"; + if (event.cards.length) { + player.gain(event.cards, "gain2"); + game.delay(); + } + "step 3"; + player.chooseToDiscard(2, "he", "请弃置两张牌", true); + }, + ai: { + threaten: 0.5, + order: 13, + result: { + target(player, target) { + return get.damageEffect(target, player); + }, + }, + }, + }, + nsanruo: { + unique: true, + init(player) { + if (!player.node.handcards1.cardMod) { + player.node.handcards1.cardMod = {}; + } + if (!player.node.handcards2.cardMod) { + player.node.handcards2.cardMod = {}; + } + var cardMod = function (card) { + if (get.info(card).multitarget) return; + if (card.name == "sha" || get.type(card) == "trick") return ["暗弱", "杀或普通锦囊牌对你不可见"]; + }; + player.node.handcards1.cardMod.nsanruo = cardMod; + player.node.handcards2.cardMod.nsanruo = cardMod; + player.node.handcards1.classList.add("nsanruo"); + player.node.handcards2.classList.add("nsanruo"); + if (!ui.css.nsanruo) { + ui.css.nsanruo = lib.init.sheet('.handcards.nsanruo>.card[data-card-type="trick"]:not(*[data-card-multitarget="1"])>*,' + '.handcards.nsanruo>.card[data-card-name="sha"]>*{visibility:hidden !important}'); + } + }, + onremove(player) { + player.node.handcards1.classList.remove("nsanruo"); + player.node.handcards2.classList.remove("nsanruo"); + delete player.node.handcards1.cardMod.nsanruo; + delete player.node.handcards2.cardMod.nsanruo; + }, + ai: { + neg: true, + }, + }, + nsxunshan: { + mod: { + selectTarget(card, player, range) { + if (!player.hasSkill("nsanruo")) return; + if (_status.auto) return; + if (get.position(card) != "h" || get.owner(card) != player) return; + if (get.info(card).multitarget) return; + if (card.name == "sha" || get.type(card) == "trick") range[1] = game.countPlayer(); + }, + // playerEnabled(card,player,target,current){ + // if(current==false) return; + // var filter=get.info(card).modTarget; + // if(typeof filter=='boolean'&&filter) return 'forceEnable'; + // if(typeof filter=='function'&&filter(card,player,target)) return 'forceEnable'; + // } + // targetInRange(card,player){ + // if(_status.auto) return; + // if(get.position(card)!='h'||get.owner(card)!=player) return; + // if(get.info(card).multitarget) return; + // if(card.name=='sha'||get.type(card)=='trick') return true; + // } + }, + ai: { + combo: "nsanruo", + }, + }, + nskaicheng: { + enable: "phaseUse", + usable: 1, + zhuSkill: true, + unique: true, + filter(event, player) { + if (!player.hasZhuSkill("nskaicheng")) return false; + if ( + !player.hasCard(function (card) { + if (get.info(card).multitarget) return false; + return card.name == "sha" || get.type(card) == "trick"; + }) + ) { + return false; + } + return game.hasPlayer(function (current) { + return current != player && current.group == "qun"; + }); + }, + filterCard(card) { + if (get.info(card).multitarget) return false; + return card.name == "sha" || get.type(card) == "trick"; + }, + filterTarget(card, player, target) { + return player != target && target.group == "qun"; + }, + lose: false, + content() { + "step 0"; + target.chooseBool( + function () { + return get.attitude(target, player) > 0; + }, + "是否将" + get.translation(cards) + "告知" + get.translation(player) + ); + "step 1"; + if (!player.hasUseTarget(cards[0])) { + if (result.bool) { + player.chooseControl("确定").set("prompt", "你展示的手牌为" + get.translation(cards)); + } else { + event.hidden = true; + player.chooseControl("确定").set("prompt", get.translation(target) + "拒绝告知你卡牌信息"); + } + } else { + if (result.bool) { + player.chooseBool("是否使用展示的牌?", "你展示的手牌为" + get.translation(cards) + "。如果你使用此牌,则在结算后摸一张牌;如果你不使用此牌,则结束出牌阶段"); + } else { + event.hidden = true; + player.chooseBool("是否使用展示的牌?", get.translation(target) + "拒绝告知你卡牌信息。如果你使用此牌,则在结算后摸一张牌;如果你不使用此牌,则结束出牌阶段"); + } + } + "step 2"; + if (result.bool) { + player.chooseUseTarget(true, cards[0], event.hidden ? "选择此牌的目标" : null); + } else { + var evt = _status.event.getParent("phaseUse"); + if (evt) { + evt.skipped = true; + } + event.finish(); + } + "step 3"; + player.draw(); + }, + ai: { + combo: "nsanruo", + }, + }, + nsjuanli: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("h"); + }, + filter(event, player) { + return player.countCards("h"); + }, + init(player) { + player.storage.nsjuanli_win = []; + player.storage.nsjuanli_lose = []; + }, + intro: { + content(storage, player) { + var str = ""; + if (player.storage.nsjuanli_win.length) { + str += get.translation(player.storage.nsjuanli_win) + "与你距离-1直到与你下次赌牌"; + } + if (player.storage.nsjuanli_lose.length) { + if (str.length) { + str += ";"; + } + str += get.translation(player.storage.nsjuanli_lose) + "与你距离+1直到与你下次赌牌"; + } + return str; + }, + }, + onremove: ["nsjuanli_win", "nsjuanli_lose"], + content() { + "step 0"; + player.storage.nsjuanli_win.remove(target); + player.storage.nsjuanli_lose.remove(target); + event.prompt2 = "赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次亮出牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利"; + player.chooseCard("h", true).set("prompt2", event.prompt2); + "step 1"; + if (result.bool) { + event.card1 = result.cards[0]; + target.chooseCard("h", true).set("prompt2", event.prompt2); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + event.card2 = result.cards[0]; + } else { + event.finish(); + } + "step 3"; + player.$compare(event.card1, event.target, event.card2); + game.delay(0, 1500); + game.log(player, "亮出的牌为", event.card1); + game.log(target, "亮出的牌为", event.card2); + "step 4"; + var suit1 = get.suit(event.card1); + var suit2 = get.suit(event.card2); + if (suit1 == suit2) { + game.broadcastAll(function (str) { + var dialog = ui.create.dialog(str); + dialog.classList.add("center"); + setTimeout(function () { + dialog.close(); + }, 1000); + }, "平局"); + game.delay(2); + if (!player.storage.nsjuanli_win.length && !player.storage.nsjuanli_lose.length) { + player.unmarkSkill("nsjuanli"); + } + } else { + var cards = []; + for (var i = 0; i < 1000; i++) { + var current = get.cards(); + if (current && current.length) { + current = current[0]; + current.discard(); + cards.push(current); + var suit = get.suit(current); + if (suit == suit1) { + player.showCards(cards, get.translation(player) + "赌牌获胜"); + player.storage.nsjuanli_win.add(target); + target.loseHp(); + player.markSkill("nsjuanli"); + break; + } else if (suit == suit2) { + player.showCards(cards, get.translation(target) + "赌牌获胜"); + player.storage.nsjuanli_lose.add(target); + target.recover(); + player.markSkill("nsjuanli"); + break; + } + } else { + break; + } + } + } + }, + mod: { + globalTo(from, to, distance) { + if (to.storage.nsjuanli_win && to.storage.nsjuanli_win.includes(from)) { + return distance - 1; + } + if (to.storage.nsjuanli_lose && to.storage.nsjuanli_lose.includes(from)) { + return distance + 1; + } + }, + }, + ai: { + order: 4, + result: { + target(player, target) { + if (target.isHealthy()) { + return -1 / (1 + target.hp); + } else { + return -0.3 / (1 + target.hp); + } + }, + }, + }, + }, + nsyuanchou: { + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + check(event, player) { + return get.effect(event.target, event.card, event.player, player) < 0; + }, + filter(event, player) { + return get.type(event.card, "trick") == "trick" && get.distance(event.player, player) > 1; + }, + content() { + trigger.cancel(); + }, + ai: { + effect: { + target(card, player, target, current) { + if (get.type(card, "trick") == "trick" && get.distance(player, target) > 1) return "zeroplayertarget"; + }, + }, + }, + }, + nsguhuo: { + trigger: { player: "useCardAfter" }, + forced: true, + usable: 2, + filter(event, player) { + if (event.parent.name == "nsguhuo") return false; + if (event.card == event.cards[0]) { + var type = get.type(event.card, "trick"); + var names = []; + if ( + get.cardPile(function (card) { + if (get.type(card, "trick") != type) return false; + if (get.info(card).multitarget) return false; + if (names.includes(card.name)) return false; + if (player.hasUseTarget(card)) { + return true; + } else { + names.add(card.name); + return false; + } + }) + ) { + return true; + } + } + return true; + }, + content() { + var type = get.type(trigger.card, "trick"); + var names = []; + var card = get.cardPile(function (card) { + if (get.type(card, "trick") != type) return false; + if (get.info(card).multitarget) return false; + if (names.includes(card.name)) return false; + if (player.hasUseTarget(card)) { + return true; + } else { + names.add(card.name); + return false; + } + }); + if (card) { + var info = get.info(card); + var targets = game.filterPlayer(function (current) { + return lib.filter.filterTarget(card, player, current); + }); + if (targets.length) { + targets.sort(lib.sort.seat); + var select = get.select(info.selectTarget); + if (select[0] == -1 || select[1] == -1) { + player.useCard(card, targets, "noai"); + } else if (targets.length >= select[0]) { + var num = select[0] + Math.floor(Math.random() * (select[1] - select[0] + 1)); + player.useCard(card, targets.randomGets(num), "noai"); + } + } + } + }, + }, + nsbaiyi: { + trigger: { player: "phaseDiscardBefore" }, + forced: true, + filter(event, player) { + return player.storage.nsqinxue && player.storage.nsqinxue.length; + }, + content() { + "step 0"; + trigger.cancel(); + var num = player.storage.nsqinxue.length; + player.chooseToDiscard("白衣:请弃置" + get.cnNumber(num) + "张牌", "he", true, num); + "step 1"; + if (result.bool && result.cards.length) { + event.goon = true; + if (result.cards.length == 3) { + var type = []; + for (var i = 0; i < result.cards.length; i++) { + type.add(get.type(result.cards[i], "trick")); + } + if (type.length == 3 && trigger.getParent().skill != "nsbaiyi") { + event.goon = false; + player.insertPhase(); + } + } + if (event.goon) { + var cards = get.cards(result.cards.length); + event.cards = cards; + player.chooseCardButton(cards, "获得一张牌", true); + } + } + "step 2"; + if (event.goon && result.bool && result.links.length) { + player.gain(result.links, "draw"); + for (var i = 0; i < event.cards.length; i++) { + if (!result.links.includes(event.cards[i])) { + event.cards[i].discard(); + } + } + } + }, + ai: { + threaten: 1.5, + combo: "nsqinxue", + }, + }, + nsqinxue: { + trigger: { player: "useCard" }, + init(player) { + player.storage.nsqinxue = []; + }, + forced: true, + filter(event, player) { + var type = get.type(event.card, "trick"); + if (player.storage.nsqinxue.includes(type)) return false; + return ["basic", "trick", "equip"].includes(type); + }, + content() { + var type = null; + var type0 = get.type(trigger.card, "trick"); + switch (type0) { + case "basic": + type = "trick"; + break; + case "trick": + type = "equip"; + break; + case "equip": + type = "basic"; + break; + } + var card = get.cardPile(function (card) { + return get.type(card, "trick") == type; + }); + if (card) { + player.gain(card, "gain2"); + player.storage.nsqinxue.push(type0); + } + }, + group: "nsqinxue_clear", + subSkill: { + clear: { + trigger: { global: "phaseAfter" }, + silent: true, + content() { + player.storage.nsqinxue = []; + }, + }, + }, + }, + nsfuge: { + trigger: { player: "phaseAfter" }, + filter(event, player) { + return !player.storage.nsfuge; + }, + init(player) { + lib.onwash.push(function () { + delete player.storage.nsfuge; + }); + }, + skillAnimation: true, + check(event, player) { + return player.hp == 1 || player.maxHp - player.hp >= 2; + }, + content() { + player.storage.nsfuge = true; + player.insertPhase(); + }, + group: "nsfuge_draw", + subSkill: { + draw: { + trigger: { player: "phaseDrawBegin" }, + silent: true, + filter(event, player) { + var evt = event.getParent("phase"); + return evt && evt.skill == "nsfuge"; + }, + content() { + trigger.num += player.maxHp - player.hp; + }, + }, + }, + }, + nsbaiming: { + trigger: { player: "useCard" }, + direct: true, + filter(event, player) { + if (player.additionalSkills.nsbaiming) return false; + return event.card && event.card.name == "sha" && player.storage.nsbaiming && player.storage.nsbaiming.length > 0; + }, + group: "nsbaiming_clear", + init(player) { + var check = function (list) { + for (var i = 0; i < list.length; i++) { + var info = lib.skill[list[i]]; + if (info && info.shaRelated) return true; + if (info && info.trigger) { + for (var j in info.trigger) { + var cond = info.trigger[j]; + if (typeof cond == "string") { + cond = [cond]; + } + if (j == "player" || j == "global") { + if (cond.indexOf("shaBefore") != -1) return true; + if (cond.indexOf("shaBegin") != -1) return true; + if (cond.indexOf("shaEnd") != -1) return true; + if (cond.indexOf("shaAfter") != -1) return true; + } + if (j == "source" || j == "global") { + if (cond.indexOf("damageBefore") != -1) return true; + if (cond.indexOf("damageBegin") != -1) return true; + if (cond.indexOf("damageBegin1") != -1) return true; + if (cond.indexOf("damageBegin2") != -1) return true; + if (cond.indexOf("damageEnd") != -1) return true; + if (cond.indexOf("damageSource") != -1) return true; + if (cond.indexOf("damageAfter") != -1) return true; + } + } + } + } + return false; + }; + player.storage.nsbaiming = get.gainableSkills(function (info, skill) { + var list = [skill]; + game.expandSkills(list); + return check(list); + }, player); + }, + content() { + "step 0"; + var list = player.storage.nsbaiming.slice(0); + event.skillai = function () { + return get.max(list, get.skillRank, "item"); + }; + if (event.isMine()) { + var dialog = ui.create.dialog("forcebutton"); + dialog.add(get.prompt("nsbaiming")); + var clickItem = function () { + _status.event._result = this.link; + dialog.close(); + game.resume(); + }; + for (var i = 0; i < list.length; i++) { + if (lib.translate[list[i] + "_info"]) { + var translation = get.translation(list[i]); + if (translation[0] == "新" && translation.length == 3) { + translation = translation.slice(1, 3); + } else { + translation = translation.slice(0, 2); + } + var item = dialog.add('"); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; + } + } + dialog.add(ui.create.div(".placeholder")); + event.switchToAuto = function () { + event._result = event.skillai(); + dialog.close(); + game.resume(); + }; + event.confirm = ui.create.confirm("c"); + event.custom.replace.confirm = function () { + event._result = null; + dialog.close(); + game.resume(); + }; + _status.imchoosing = true; + game.pause(); + } else { + event._result = event.skillai(); + } + "step 1"; + _status.imchoosing = false; + if (event.confirm) { + event.confirm.close(); + } + if (typeof result == "string") { + player.logSkill("nsbaiming"); + var link = result; + player.addAdditionalSkill("nsbaiming", link); + player.logSkill("nsbaiming"); + player.popup(link); + game.log(player, "获得了技能", "【" + get.translation(link) + "】"); + game.delay(); + player.storage.nsbaiming.remove(link); + trigger.nsbaiming = true; + } + }, + subSkill: { + clear: { + trigger: { player: "useCardAfter" }, + silent: true, + filter(event) { + return event.nsbaiming == true; + }, + content() { + player.removeAdditionalSkill("nsbaiming"); + }, + }, + }, + }, + nsxinzhan: { + enable: "phaseUse", + filterCard: [1, Infinity], + filter(event, player) { + return player.countCards("h") > 0; + }, + usable: 1, + selectCard: [1, Infinity], + check(card) { + var player = _status.event.player; + if ( + player.countCards("h") >= 8 && + game.hasPlayer(function (current) { + return current.isDamaged() && get.attitude(player, current) > 3; + }) + ) { + if (ui.selected.cards.length >= 6) { + return 0; + } + return 1; + } else { + if (ui.selected.cards.length >= 2) { + return 0; + } + if ( + player.countCards("h", function (card) { + return get.value(card) < 0; + }) + ) { + return 8 - get.value(card, player, "raw"); + } else { + return 4 - get.value(card, player, "raw"); + } + } + }, + discard: false, + prepare: "give2", + content() { + target.gain(cards, player); + var num = Math.floor(cards.length / 2); + if (num >= 3) { + target.loseMaxHp(true); + } else if (num) { + target.loseHp(num); + } + }, + filterTarget(card, player, target) { + return target != player; + }, + ai: { + order: 10, + result: { + target(player, target) { + if (ui.selected.cards.length >= 6) { + if (target.isDamaged()) return 2; + return 1; + } + if (ui.selected.cards.length == 1) { + return 1; + } + return -1; + }, + }, + }, + }, + nstanbing: { + trigger: { player: "phaseDrawBegin" }, + filter(event, player) { + return player.countCards("h") > 0; + }, + direct: true, + content() { + "step 0"; + player.chooseToDiscard("h", get.prompt2("nstanbing")).set("ai", function (card) { + if (!player.needsToDiscard(1)) { + return get.translation(card.name).length - 1; + } + return 0; + }).logSkill = "nstanbing"; + "step 1"; + if (result.bool) { + player.draw(get.translation(result.cards[0].name).length); + player.addTempSkill("nstanbing_sha"); + } + }, + subSkill: { + sha: { + mod: { + cardEnabled(card, player) { + if (card.name == "sha") { + return false; + } + }, + cardUsable(card, player) { + if (card.name == "sha") { + return false; + } + }, + }, + }, + }, + }, + nswangfeng: { + trigger: { global: "judge" }, + filter(event, player) { + return player.countCards("he", { color: "red" }) > 0; + }, + direct: true, + content() { + "step 0"; + player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("nswangfeng"), "he", function (card) { + return get.color(card) == "red"; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.bool) { + player.respond(result.cards, "highlight"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.logSkill("nswangfeng"); + player.$gain2(trigger.player.judging[0]); + player.gain(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + if (!get.owner(result.cards[0], "judge")) { + trigger.position.appendChild(result.cards[0]); + } + game.log(trigger.player, "的判定牌改为", result.cards[0]); + } + "step 3"; + game.delay(2); + }, + ai: { + tag: { + rejudge: 1, + }, + }, + }, + nsfuhuo: { + enable: "phaseUse", + usable: 1, + filterCard: true, + filterTarget(card, player, target) { + return player != target && !target.hasSkill("nsfuhuo2"); + }, + prepare: "throw", + discard: false, + content() { + target.$gain2(cards); + target.storage.nsfuhuo2 = cards[0]; + target.addSkill("nsfuhuo2"); + target.storage.nsfuhuo3 = player; + ui.special.appendChild(cards[0]); + target.syncStorage("nsfuhuo2"); + }, + check(card) { + return 6 - get.value(card); + }, + ai: { + expose: 0.1, + order: 4, + result: { + target(player, target) { + if (target.hasSkillTag("maixie")) return 0; + return -1; + }, + }, + }, + group: ["nsfuhuo_die", "nsfuhuo_gain"], + subSkill: { + die: { + trigger: { player: "dieBegin" }, + silent: true, + content() { + for (var i = 0; i < game.players.length; i++) { + if (game.players[i].hasSkill("nsfuhuo2") && game.players[i].storage.nsfuhuo3 == player) { + game.players[i].removeSkill("nsfuhuo2"); + } + } + }, + }, + gain: { + trigger: { player: "phaseBegin" }, + silent: true, + content() { + for (var i = 0; i < game.players.length; i++) { + if (game.players[i].hasSkill("nsfuhuo2") && game.players[i].storage.nsfuhuo3 == player) { + var card = game.players[i].storage.nsfuhuo2; + game.players[i].removeSkill("nsfuhuo2"); + game.players[i].$give(card, player); + player.gain(card); + } + } + }, + }, + }, + }, + nsfuhuo2: { + trigger: { player: ["respondAfter", "useCardAfter"] }, + forced: true, + priority: 10, + mark: "card", + popup: false, + filter(event, player) { + return event.card && event.card.name == "shan" && player.storage.nsfuhuo3 && player.storage.nsfuhuo3.isIn(); + }, + content() { + "step 0"; + player.storage.nsfuhuo3.logSkill("nsfuhuo", player); + player.judge(function (card) { + var suit = get.suit(card); + if (suit == "heart" || suit == "diamond") { + return -1; + } else { + return 0; + } + }); + "step 1"; + var source = player.storage.nsfuhuo3; + if (result.suit == "diamond") { + player.damage("fire", source); + if (player.countCards("h")) { + player.randomDiscard("h"); + } + } else if (result.suit == "heart") { + player.damage("fire", 2, source); + } + }, + intro: { + content: "card", + }, + onremove(player) { + player.storage.nsfuhuo2.discard(); + delete player.storage.nsfuhuo2; + delete player.storage.nsfuhuo3; + }, + ai: { + noShan: true, + }, + }, + nshunji: { + enable: "phaseUse", + viewAs: { name: "wanjian" }, + usable: 1, + delay: 0, + selectCard: 0, + group: ["nshunji_damage", "nshunji_draw"], + subSkill: { + draw: { + trigger: { player: "useCard" }, + silent: true, + filter(event) { + return event.skill == "nshunji"; + }, + content() { + player.draw(); + }, + }, + damage: { + trigger: { global: "damageAfter" }, + silent: true, + filter(event) { + return event.getParent(2).skill == "nshunji"; + }, + content() { + "step 0"; + if (player.countCards("he")) { + trigger.player + .discardPlayerCard(player, "混击", "he") + .set("boolline", true) + .set("prompt2", "弃置" + get.translation(player) + "的一张牌,或取消并摸一张牌"); + } else { + trigger.player.draw(); + event.finish(); + } + "step 1"; + if (!result.bool) { + trigger.player.draw(); + } + }, + }, + }, + }, + nsbaquan: { + trigger: { player: "phaseEnd" }, + filter(event, player) { + return player.countCards("h") > 0; + }, + check(event, player) { + if (player.hasShan() || player.hujia > 0) return false; + var nh = player.countCards("h"); + if (player.hp == 1) { + return nh <= 3; + } + if (player.hp == 2) { + return nh <= 1; + } + return false; + }, + content() { + var cards = player.getCards("h"); + player.discard(cards); + player.changeHujia(cards.length); + player.storage.nsbaquan = true; + }, + group: "nsbaquan_clear", + subSkill: { + clear: { + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return player.storage.nsbaquan && player.hujia > 0; + }, + content() { + player.changeHujia(-player.hujia); + game.log(player, "失去了所有护甲"); + delete player.storage.nsbaquan; + }, + }, + }, + }, + nschangshi: { + mode: ["identity"], + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.identity == "fan"; + }, + filterTarget(card, player, target) { + if (target == player) return false; + if (ui.selected.targets.length) { + return target.hp != ui.selected.targets[0].hp; + } + return true; + }, + multitarget: true, + selectTarget: 2, + content() { + game.broadcastAll( + function (player, targets) { + player.showIdentity(); + var tmp = targets[0].hp; + targets[0].hp = targets[1].hp; + targets[1].hp = tmp; + targets[0].update(); + targets[1].update(); + if (Math.abs(targets[0].hp - targets[1].hp) == 1) { + player.loseHp(); + } + //else{ + //player.die(); + //} + }, + player, + targets + ); + }, + ai: { + order: 10, + result: { + target(player, target) { + if (target == game.zhu) return -1; + if (get.attitude(player, target) > 3) { + var num = game.zhu.hp - target.hp; + if (num == 1) { + return 1; + } + if (num > 1) { + if (player.hp == 1) return num; + if (target.hp == 1) return num; + if (num >= 3) return num; + } + } + return 0; + }, + }, + }, + }, + nsjianning: { + mode: ["identity"], + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.identity == "nei"; + }, + filterTarget(card, player, target) { + return target.countCards("h") < player.countCards("h"); + }, + content() { + "step 0"; + if (!player.identityShown) { + game.broadcastAll(function (player) { + player.showIdentity(); + }, player); + } + player.swapHandcards(target); + "step 1"; + target.damage(); + }, + ai: { + order: 10, + result: { + target(player, target) { + if ( + !player.countCards("h", function (card) { + return get.value(card) >= 8; + }) && + player.countCards("h") - target.countCards("h") <= 1 + ) { + if ( + target.hp == 1 || + player.countCards("h", function (card) { + return get.value(card) < 0; + }) + ) { + return get.damageEffect(target, player, target); + } + } + return 0; + }, + }, + }, + }, + nscuanquan: { + mode: ["identity"], + init(player) { + player.storage.nscuanquan = 0; + }, + forced: true, + unique: true, + forceunique: true, + skillAnimation: true, + animationColor: "thunder", + trigger: { player: "damageAfter" }, + filter(event, player) { + return player.identity == "zhong" && player.storage.nscuanquan == 3 && game.zhu && game.zhu.isZhu; + }, + group: "nscuanquan_count", + subSkill: { + count: { + trigger: { player: "damageEnd" }, + silent: true, + content() { + player.storage.nscuanquan++; + }, + }, + }, + logTarget() { + return [game.zhu]; + }, + content() { + player.awakenSkill("nscuanquan"); + game.broadcastAll(function (player) { + var tmp = player.maxHp; + player.identity = "zhu"; + player.maxHp = game.zhu.hp; + player.showIdentity(); + player.update(); + game.zhu.identity = "zhong"; + game.zhu.maxHp = tmp; + game.zhu.showIdentity(); + game.zhu.update(); + game.zhu = player; + }, player); + event.trigger("zhuUpdate"); + }, + }, + nstianji: { + trigger: { global: "dying" }, + priority: 6, + unique: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return event.player.hp <= 0 && event.player != player; + }, + logTarget: "player", + check(event, player) { + return get.attitude(player, event.player) > 1; + }, + content() { + "step 0"; + player.awakenSkill("nstianji"); + player.loseMaxHp(); + "step 1"; + trigger.player.recover(1 - trigger.player.hp); + "step 2"; + trigger.player.gainMaxHp(); + }, + }, + nsbugua: { + group: "nsbugua_use", + ai: { + threaten: 1.4, + }, + subSkill: { + use: { + enable: "phaseUse", + usable: 1, + filterCard: true, + check(card) { + return 9 - get.value(card); + }, + filter(event, player) { + // if(!player.storage.nstuiyan2_done&&player.getStat().skill.nsbugua_use){ + // return false; + // } + return player.countCards("he"); + }, + position: "he", + ai: { + order: 9.5, + result: { + player: 1, + }, + }, + content() { + "step 0"; + player.throwDice(); + "step 1"; + var cards = get.cards(6); + var cards2 = cards.slice(0); + var card = cards2.splice(event.num - 1, 1)[0]; + player.showCards(get.translation(player) + "亮出了" + get.translation(card), cards).set("hiddencards", cards2); + card.discard(); + var name = null; + switch (get.suit(card)) { + case "club": { + if (card.number % 2 == 0) { + name = "guohe"; + } else { + name = "jiedao"; + } + break; + } + case "spade": { + if (card.number % 2 == 0) { + name = "nanman"; + } else { + name = "juedou"; + } + break; + } + case "diamond": { + if (card.number % 2 == 0) { + name = "shunshou"; + } else { + name = "huogong"; + } + break; + } + case "heart": { + if (card.number % 2 == 0) { + name = "wuzhong"; + } else { + name = "wanjian"; + } + break; + } + } + var togain = get.cardPile(name, "cardPile"); + if (togain) { + player.gain(togain, "gain2"); + } else { + player.draw(); + } + event.list = cards2; + "step 2"; + player.chooseCardButton(event.list, true, "按顺序将牌置于牌堆顶(先选择的在上)", event.list.length); + "step 3"; + var list = result.links.slice(0); + while (list.length) { + ui.cardPile.insertBefore(list.pop(), ui.cardPile.firstChild); + } + }, + }, + twice: {}, + }, + }, + nstuiyan: { + trigger: { player: "useCard" }, + filter(event, player) { + return _status.currentPhase == player && event.getParent("phaseUse", true) && !player.hasSkill("nstuiyan_fail") && typeof player.storage.nstuiyan == "number" && event.card.number > player.storage.nstuiyan; + }, + frequent: true, + priority: 2, + content() { + player.draw(); + }, + onremove(player) { + delete player.storage.nstuiyan; + delete player.storage.nstuiyan_done; + delete player.storage.nstuiyan2; + delete player.storage.nstuiyan2_done; + }, + intro: { + mark(dialog, content, player) { + if (player.storage.nstuiyan_done) { + dialog.addText("推演摸牌已结束"); + } else { + dialog.addText("上一张点数:" + player.storage.nstuiyan); + } + if (player.storage.nstuiyan2_done) { + dialog.addText("总点数8的倍数已达成"); + } else { + dialog.addText("总点数:" + player.storage.nstuiyan2); + } + }, + content(storage, player) { + var str = ""; + if (player.storage.nstuiyan_done) { + str += "推演摸牌已结束;"; + } else { + str += "上一张牌点数:" + storage + ";"; + } + if (player.storage.nstuiyan2_done) { + str += "总点数8的倍数已达成"; + } else { + str += "总点数:" + player.storage.nstuiyan2; + } + return str; + }, + markcount(storage, player) { + if (player.storage.nstuiyan2_done) { + if (player.storage.nstuiyan_done) { + return 0; + } else { + return player.storage.nstuiyan; + } + } else { + return player.storage.nstuiyan2; + } + }, + }, + group: ["nstuiyan_use", "nstuiyan_clear"], + subSkill: { + bugua: { + trigger: { player: "useCardAfter" }, + direct: true, + filter(event, player) { + return player.countCards("h"); + }, + content() { + "step 0"; + player.removeSkill("nstuiyan_bugua"); + player + .chooseToDiscard("he", "推演:是否发动一次【卜卦】?") + .set("ai", function (card) { + return 8 - get.value(card); + }) + .set("logSkill", "nstuiyan"); + "step 1"; + if (result.bool) { + event.insert(lib.skill.nsbugua.subSkill.use.content, { player: player }); + } + }, + }, + use: { + trigger: { player: "useCard" }, + silent: true, + priority: -1, + filter(event, player) { + return _status.currentPhase == player && event.getParent("phaseUse", true) && typeof event.card.number == "number"; + }, + content() { + if (typeof player.storage.nstuiyan2 != "number") { + player.storage.nstuiyan2 = 0; + } + if (!player.hasSkill("nstuiyan_fail") && (trigger.card.number <= player.storage.nstuiyan || typeof trigger.card.number != "number")) { + player.storage.nstuiyan_done = true; + player.addTempSkill("nstuiyan_fail"); + } + player.storage.nstuiyan = trigger.card.number; + player.storage.nstuiyan2 += trigger.card.number; + if (player.storage.nstuiyan2 % 8 == 0 && !player.storage.nstuiyan2_done) { + player.storage.nstuiyan2_done = true; + player.addTempSkill("nstuiyan_bugua"); + } + player.markSkill("nstuiyan"); + }, + }, + clear: { + trigger: { player: ["phaseUseAfter", "phaseAfter"] }, + silent: true, + content() { + delete player.storage.nstuiyan; + delete player.storage.nstuiyan_done; + delete player.storage.nstuiyan2; + delete player.storage.nstuiyan2_done; + player.unmarkSkill("nstuiyan"); + }, + }, + fail: {}, + }, + ai: { + threaten: 1.4, + }, + }, + nsshijun: { + trigger: { source: "damageBegin" }, + forced: true, + content() { + trigger.num++; + trigger.nsshijun = true; + }, + subSkill: { + hp: { + trigger: { source: "damageAfter" }, + silent: true, + filter(event) { + return event.nsshijun; + }, + content() { + player.loseHp(); + }, + }, + }, + group: "nsshijun_hp", + ai: { + halfneg: true, + }, + }, + nszhaoxin: { + mark: true, + intro: { + mark(dialog, content, player) { + var hs = player.getCards("h"); + if (hs.length) { + dialog.addSmall(hs); + } else { + dialog.addText("无手牌"); + } + }, + content(content, player) { + var hs = player.getCards("h"); + if (hs.length) { + return get.translation(hs); + } else { + return "无手牌"; + } + }, + }, + ai: { + neg: true, + }, + }, + nsxiuxin: { + mod: { + targetEnabled(card, player, target) { + var suit = get.suit(card); + if (suit && !target.countCards("h", { suit: suit })) { + return false; + } + }, + }, + }, + nscangxi: { + unique: true, + global: "nscangxi2", + zhuSkill: true, + init(player) { + player.storage.nscangxi = 0; + }, + intro: { + content: "手牌上限+#", + }, + mod: { + maxHandcard(player, num) { + return num + player.storage.nscangxi; + }, + }, + }, + nscangxi2: { + trigger: { player: "phaseDiscardEnd" }, + filter(event, player) { + if (!event.cards || event.cards.length <= 1) return false; + if (player.group != "wu") return false; + return game.hasPlayer(function (target) { + return player != target && target.hasZhuSkill("nscangxi", player); + }); + }, + direct: true, + content() { + "step 0"; + var list = game.filterPlayer(function (current) { + return current != player && current.hasZhuSkill("nscangxi", player); + }); + list.sortBySeat(); + event.list = list; + "step 1"; + if (event.list.length) { + var current = event.list.shift(); + event.current = current; + player.chooseBool(get.prompt("nscangxi", current)).set("choice", get.attitude(player, current) > 0); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.logSkill("nscangxi", event.current); + player + .judge(function (card) { + return _status.event.att * (get.color(card) == "black" ? 1 : 0); + }) + .set("att", get.sgnAttitude(player, event.current)); + } else { + event.goto(1); + } + "step 3"; + if (result.color == "black") { + var name = get.translation(event.current.name); + var att = 0; + if (event.current.needsToDiscard()) { + att = 1; + } + player + .chooseControlList(["令" + name + "摸一张牌展示", "令" + name + "手牌上永久+1", "弃置一张牌并令" + name + "获得一张本回合进入弃牌堆的牌"], function () { + return _status.event.att; + }) + .set("att", att); + } else { + event.goto(1); + } + "step 4"; + switch (result.index) { + case 0: + event.current.draw("visible"); + break; + case 1: { + if (typeof event.current.storage.nscangxi != "number") { + event.current.storage.nscangxi = 0; + } + event.current.storage.nscangxi++; + event.current.syncStorage("nscangxi"); + event.current.markSkill("nscangxi"); + break; + } + case 2: { + player.chooseToDiscard(true, "he"); + break; + } + } + if (result.index != 2) { + event.goto(1); + } + "step 5"; + if (result.bool) { + var discarded = get.discarded(); + if (discarded.length) { + event.current.chooseCardButton("选择一张获得之", discarded, true).set("ai", function (button) { + return get.value(button.link); + }); + } else { + event.goto(1); + } + } else { + event.goto(1); + } + "step 6"; + if (result.bool && result.links && result.links.length) { + event.current.gain(result.links, "gain2"); + } + event.goto(1); + }, + }, + nswulie: { + trigger: { player: "phaseBegin" }, + skillAnimation: true, + animationColor: "metal", + unique: true, + check() { + return false; + }, + filter(event, player) { + return ui.discardPile.childElementCount > 0; + }, + content() { + "step 0"; + player.awakenSkill("nswulie"); + player.loseMaxHp(); + "step 1"; + player.chooseCardButton(Array.from(ui.discardPile.childNodes), "将至多3张任意顺置于牌堆顶(先选择的在上)", true, [1, 3]); + "step 2"; + if (result.bool) { + var cards = result.links.slice(0); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); + } + player.addTempSkill("nswulie_end"); + } + }, + subSkill: { + end: { + trigger: { player: "phaseEnd" }, + check() { + return false; + }, + filter(event, player) { + return ui.discardPile.childElementCount > 0; + }, + content() { + "step 0"; + player.loseMaxHp(); + "step 1"; + player.chooseCardButton(Array.from(ui.discardPile.childNodes), "将至多3张任意顺置于牌堆顶(先选择的在上)", true, [1, 3]); + "step 2"; + if (result.bool) { + var cards = result.links.slice(0); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); + } + } + }, + }, + }, + }, + nshunyou: { + enable: "phaseUse", + usable: 1, + filterCard: { type: "basic" }, + filter(event, player) { + return player.countCards("h", { type: "basic" }); + }, + content() { + "step 0"; + var equip = null, + trick = null; + for (var i = 0; i < ui.discardPile.childElementCount; i++) { + var type = get.type(ui.discardPile.childNodes[i], "trick"); + if (type == "trick") { + trick = ui.discardPile.childNodes[i]; + } else if (type == "equip") { + equip = ui.discardPile.childNodes[i]; + } + if (trick && equip) { + break; + } + } + var list = []; + if (trick) list.push(trick); + if (equip) list.push(equip); + if (!list.length) { + player.draw(Math.min(3, 1 + player.maxHp - player.hp)); + } else { + player.gain(list, "gain2"); + event.equip = equip; + } + "step 1"; + if (event.equip && get.owner(event.equip) == player) { + player + .chooseTarget("是否将" + get.translation(event.equip) + "装备给一其角色?", function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 1) { + if (!target.getEquip(_status.event.subtype)) return att; + } + return 0; + }) + .set("subtype", get.subtype(event.equip)); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.line(result.targets, "green"); + player.$give(event.equip, result.targets[0]); + player.lose(event.equip, ui.special); + } else { + event.finish(); + } + "step 3"; + game.delay(0.5); + "step 4"; + result.targets[0].equip(event.equip); + "step 5"; + game.delay(); + }, + check(card) { + return 7 - get.value(card); + }, + ai: { + order: 7, + result: { + player: 1, + }, + }, + }, + nsgongjian: { + trigger: { player: "phaseDiscardEnd" }, + forced: true, + filter(event, player) { + if (event.cards && event.cards.length > 0) { + return game.hasPlayer(function (current) { + return current.hp > player.hp; + }); + } + return false; + }, + content() { + "step 0"; + player + .chooseTarget("恭俭:将置的牌交给一名体力值大于你的角色", function (card, player, target) { + return target.hp > player.hp; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) / Math.sqrt(target.countCards("h") + 1); + }); + "step 1"; + if (result.bool) { + player.line(result.targets, "green"); + result.targets[0].gain(trigger.cards, "gain2"); + } + }, + }, + nscaijian: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + var nh = player.countCards("h"); + return nh && nh <= player.maxHp; + }, + content() { + "step 0"; + player.showHandcards(); + event.num = player.countCards("h"); + "step 1"; + player.directgain(get.cards(event.num)); + player.chooseCard("将" + get.cnNumber(event.num) + "张手牌以按顺序置于牌堆顶(先选择的在上)", event.num, true).set("ai", function (card) { + return -get.value(card); + }); + "step 2"; + if (result.bool) { + player.lose(result.cards, ui.special)._triggered = null; + event.cards = result.cards.slice(0); + } else { + event.finish(); + } + "step 3"; + if (player == game.me && _status.auto) { + game.delay(); + } + "step 4"; + while (event.cards.length) { + var current = event.cards.pop(); + current.fix(); + ui.cardPile.insertBefore(current, ui.cardPile.firstChild); + } + }, + ai: { + order: 10, + result: { + player: 1, + }, + }, + }, + nsdongcha: { + trigger: { player: "damageBefore" }, + forced: true, + priority: 15, + filter(event, player) { + if (get.type(event.card, "trick") == "trick") { + if (event.getParent(2).name == "useCard") { + return event.getParent(2).targets.length == 1; + } + return true; + } + return false; + }, + content() { + trigger.cancel(); + }, + ai: { + notrick: true, + effect: { + target(card, player, target, current) { + if (get.type(card) == "trick" && get.tag(card, "damage") && !get.tag(card, "multitarget")) { + return "zeroplayertarget"; + } + }, + }, + }, + group: "nsdongcha_cancel", + subSkill: { + cancel: { + trigger: { target: "useCardToAfter" }, + silent: true, + filter(event, player) { + return get.type(event.card, "trick") == "trick" && _status.currentPhase == event.player && event.player != player; + }, + content() { + player.addTempSkill("nsdongcha_disable"); + }, + }, + disable: { + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + onremove: true, + filter(event, player) { + return event.player == _status.currentPhase && get.type(event.card, "trick") == "trick"; + }, + content() { + trigger.cancel(); + }, + ai: { + effect: { + target(card, player, target, current) { + if (get.type(card, "trick") == "trick" && _status.currentPhase == player) return "zeroplayertarget"; + }, + }, + }, + }, + }, + }, + nsjianxiong: { + trigger: { target: "useCardToBefore" }, + direct: true, + content() { + "step 0"; + player.chooseToUse( + function (card) { + return !get.info(card).multitarget; + }, + get.prompt("nsjianxiong", trigger.player), + trigger.player, + -1 + ); + "step 1"; + if (event.damaged) { + trigger.cancel(); + if (get.color(trigger.card) == "black") { + player.draw(); + } + } + }, + subSkill: { + damage: { + trigger: { source: "damageAfter" }, + silent: true, + filter(event, player) { + return event.getParent(4).name == "nsjianxiong"; + }, + content() { + trigger.getParent(4).damaged = true; + }, + }, + }, + group: "nsjianxiong_damage", + ai: { + effect: { + player(card, player, target) { + if (_status.currentPhase != player) return; + if (get.tag(card, "damage") && !player.needsToDiscard(1) && target.hp > 1) { + return "zeroplayertarget"; + } + }, + }, + }, + }, + nsxionglue: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h", { color: "black" }); + }, + check(card) { + return 7 - get.value(card); + }, + filterCard: { color: "black" }, + content() { + "step 0"; + var list = get.inpile("trick"); + list = list.randomGets(3); + for (var i = 0; i < list.length; i++) { + list[i] = ["锦囊", "", list[i]]; + } + var dialog = ui.create.dialog("选择一张锦囊牌加入你的手牌", [list, "vcard"], "hidden"); + player.chooseButton(dialog, true).set("ai", function (button) { + var card = { name: button.link[2] }; + var value = get.value(card); + return value; + }); + "step 1"; + if (result.bool) { + player.gain(game.createCard(result.buttons[0].link[2]), "draw"); + } + }, + ai: { + order: 9, + result: { + player: 1, + }, + }, + }, + nshuanhuo: { + trigger: { player: ["loseHpAfter", "damageAfter"] }, + filter(event, player) { + if ( + game.countPlayer(function (current) { + return current != player && !current.isUnseen(2); + }) < 2 + ) + return false; + if (event.name == "damage") return event.num > 1; + return true; + }, + direct: true, + skillAnimation: true, + animationColor: "thunder", + content() { + "step 0"; + player + .chooseTarget(2, get.prompt2("nshuanhuo"), function (card, player, target) { + return target != player && !target.isUnseen(2); + }) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (ui.selected.targets.length) { + if (att < 0) { + return get.rank(target, true) - get.rank(ui.selected.targets[0], true); + } + } else { + if (att >= 0) { + return 1 / (1 + get.rank(target, true)); + } + } + return 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("nshuanhuo", result.targets); + } else { + event.finish(); + } + "step 2"; + var name1 = result.targets[0].name; + var name2 = result.targets[1].name; + result.targets[0].reinit(name1, name2, false); + result.targets[1].reinit(name2, name1, false); + }, + }, + nsyaowang: { + trigger: { player: "phaseBegin" }, + direct: true, + createDialog(player, target, onlylist) { + var names = []; + var list = []; + if (target.name1 && !target.isUnseen(0)) names.add(target.name1); + if (target.name2 && !target.isUnseen(1)) names.add(target.name2); + var pss = player.getSkills(); + for (var i = 0; i < names.length; i++) { + var info = lib.character[names[i]]; + if (info) { + var skills = info[3]; + for (var j = 0; j < skills.length; j++) { + if (lib.translate[skills[j] + "_info"] && lib.skill[skills[j]] && !lib.skill[skills[j]].unique && !pss.includes(skills[j])) { + list.add(skills[j]); + } + } + } + } + if (onlylist) return list; + var dialog = ui.create.dialog("forcebutton"); + dialog.add("选择获得一项技能"); + _status.event.list = list; + var clickItem = function () { + _status.event._result = this.link; + game.resume(); + }; + for (i = 0; i < list.length; i++) { + if (lib.translate[list[i] + "_info"]) { + var translation = get.translation(list[i]); + if (translation[0] == "新" && translation.length == 3) { + translation = translation.slice(1, 3); + } else { + translation = translation.slice(0, 2); + } + var item = dialog.add('"); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; + } + } + dialog.add(ui.create.div(".placeholder")); + return dialog; + }, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("nsyaowang"), function (card, player, target) { + var names = []; + if (target.name1 && !target.isUnseen(0)) names.add(target.name1); + if (target.name2 && !target.isUnseen(1)) names.add(target.name2); + var pss = player.getSkills(); + for (var i = 0; i < names.length; i++) { + var info = lib.character[names[i]]; + if (info) { + var skills = info[3]; + for (var j = 0; j < skills.length; j++) { + if (lib.translate[skills[j] + "_info"] && lib.skill[skills[j]] && !lib.skill[skills[j]].unique && !pss.includes(skills[j])) { + return true; + } + } + } + return false; + } + }) + .set("ai", function (target) { + if (get.attitude(_status.event.player, target) > 0) return Math.random(); + return 0; + }); + "step 1"; + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("nsyaowang", event.target); + } else { + event.finish(); + } + "step 2"; + event.skillai = function (list) { + return get.max(list, get.skillRank, "item"); + }; + if (event.isMine()) { + event.dialog = lib.skill.nsyaowang.createDialog(player, target); + event.switchToAuto = function () { + event._result = event.skillai(event.list); + game.resume(); + }; + _status.imchoosing = true; + game.pause(); + } else { + event._result = event.skillai(lib.skill.nsyaowang.createDialog(player, target, true)); + } + "step 3"; + _status.imchoosing = false; + if (event.dialog) { + event.dialog.close(); + } + player.addTempSkill(result); + player.popup(result); + game.log(player, "获得了", "【" + get.translation(result) + "】"); + var names = []; + for (var i = 0; i < game.players.length; i++) { + names.add(game.players[i].name); + names.add(game.players[i].name1); + names.add(game.players[i].name2); + } + for (var i = 0; i < game.dead.length; i++) { + names.add(game.dead[i].name); + names.add(game.dead[i].name1); + names.add(game.dead[i].name2); + } + var list = get.gainableSkills(function (info, skill, name) { + if (names.includes(name)) return false; + return true; + }); + var skill = list.randomGet(); + target.popup(skill); + target.addTempSkill(skill, { player: "phaseAfter" }); + game.log(target, "获得了", "【" + get.translation(skill) + "】"); + }, + }, + nsjianshu: { + trigger: { player: "shaBegin" }, + forced: true, + filter(event, player) { + return !event.directHit && player.getEquip(1); + }, + priority: -1, + content() { + if (typeof trigger.shanRequired == "number") { + trigger.shanRequired++; + } else { + trigger.shanRequired = 2; + } + }, + }, + nscangjian: { + trigger: { source: "damageEnd" }, + direct: true, + filter(event) { + return event.player.isIn() && event.player.countCards("e"); + }, + content() { + player.gainPlayerCard(trigger.player, "e", get.prompt("nscangjian", trigger.player)).logSkill = ["nscangjian", trigger.player]; + }, + }, + nsyunxing: { + trigger: { global: "dieAfter" }, + forced: true, + check(event, player) { + return event.player.group == "wei" || (event.player.group == "wu" && player.hp == 1); + }, + filter(event, player) { + return ["wei", "shu", "wu", "qun"].includes(event.player.group); + }, + content() { + "step 0"; + switch (trigger.player.group) { + case "wei": + player.draw(); + break; + case "shu": + player.loseHp(); + break; + case "wu": + player.recover(); + break; + case "qun": { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; + } + var evt = _status.event.getParent("phase"); + if (evt && evt.name == "phase") { + evt.finish(); + } + break; + } + } + if ( + trigger.player.group != "wei" || + !game.hasPlayer(function (current) { + return current.countCards("h"); + }) + ) { + event.finish(); + } + "step 1"; + player + .chooseTarget("弃置一名角色的一张手牌", true, function (card, player, target) { + return target.countCards("h"); + }) + .set("ai", function (target) { + if (target.hasSkillTag("noh")) return 0; + return -get.attitude(_status.event.player, target); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.discardPlayerCard(target, true, "h"); + player.line(target, "green"); + } + }, + group: "nsyunxing_self", + subSkill: { + self: { + trigger: { player: "dieBegin" }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt("nsyunxing"), function (card, player, target) { + return target != player; + }) + .set("prompt2", "令一名其他角色翻面") + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.isTurnedOver()) { + if (att > 2) { + return att * 2; + } else { + return att; + } + } else { + return -att; + } + }); + "step 1"; + if (result.bool) { + player.logSkill("nsyunxing", result.targets); + result.targets[0].turnOver(); + } + }, + }, + }, + }, + nsguanxing: { + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return player.hp > 0; + }, + content() { + "step 0"; + event.cards = get.cards(game.countPlayer()); + event.chosen = []; + event.num = player.hp; + "step 1"; + var js = player.getCards("j"); + var pos; + var choice = -1; + var getval = function (card, pos) { + if (js[pos]) { + return get.judge(js[pos])(card); + } else { + return get.value(card); + } + }; + for (pos = 0; pos < Math.min(event.cards.length, js.length + 2); pos++) { + var max = getval(event.cards[pos], pos); + for (var j = pos + 1; j < event.cards.length; j++) { + var current = getval(event.cards[j], pos); + if (current > max) { + choice = j; + max = current; + } + } + if (choice != -1) { + break; + } + } + player + .chooseCardButton("观星:选择要移动的牌(还能移动" + event.num + "张)", event.cards) + .set("filterButton", function (button) { + return !_status.event.chosen.includes(button.link); + }) + .set("chosen", event.chosen) + .set("ai", function (button) { + return button.link == _status.event.choice ? 1 : 0; + }) + .set("choice", event.cards[choice]); + event.pos = pos; + "step 2"; + if (result.bool) { + var card = result.links[0]; + var index = event.cards.indexOf(card); + event.card = card; + event.chosen.push(card); + event.cards.remove(event.card); + var buttons = event.cards.slice(0); + player + .chooseControl(function () { + return _status.event.controlai; + }) + .set("controlai", event.pos || 0) + .set("sortcard", buttons) + .set("tosort", card); + } else { + event.goto(4); + } + "step 3"; + if (typeof result.index == "number") { + if (result.index > event.cards.length) { + ui.cardPile.appendChild(event.card); + } else { + event.cards.splice(result.index, 0, event.card); + } + event.num--; + if (event.num > 0) { + event.goto(1); + } + } + "step 4"; + while (event.cards.length) { + ui.cardPile.insertBefore(event.cards.pop(), ui.cardPile.firstChild); + } + var js = player.getCards("j"); + if (js.length == 1) { + if (get.judge(js[0])(ui.cardPile.firstChild) < 0) { + player.addTempSkill("guanxing_fail"); + } + } + }, + ai: { + guanxing: true, + }, + }, + nshaoling: { + skillAnimation: true, + animationColor: "water", + unique: true, + limited: true, + enable: "phaseUse", + filterTarget(card, player, target) { + return target != player; + }, + content() { + "step 0"; + player.awakenSkill("nshaoling"); + event.targets = game.filterPlayer(); + event.targets.remove(player); + event.targets.remove(target); + event.targets.sortBySeat(); + "step 1"; + if (event.targets.length) { + event.current = event.targets.shift(); + if (event.current.countCards("he") && target.isAlive()) { + event.current.chooseToUse({ name: "sha" }, target, -1, "号令").set("prompt2", "选择一项:1. 对" + get.translation(event.current) + "使用一张杀;2. 取消并交给" + get.translation(player) + "一张牌,然后视" + get.translation(player) + "为对你使用一张杀"); + } + } else { + event.finish(); + } + "step 2"; + if (result.bool == false) { + if (event.current.countCards("he")) { + event.current.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + } else { + event.goto(4); + } + } else { + event.goto(1); + } + "step 3"; + if (result.bool) { + event.current.give(result.cards, player); + } + "step 4"; + player.useCard({ name: "sha" }, event.current, false); + event.goto(1); + }, + ai: { + order: 5, + result: { + target(player, target) { + var players = game.filterPlayer(); + if (player.hp > 1) { + if (game.phaseNumber < game.players.length) return 0; + if (player.hasUnknown()) return 0; + } + var effect = 0; + for (var i = 0; i < players.length; i++) { + if (players[i] != target && players[i] != player && players[i].countCards("he")) effect += get.effect(target, { name: "sha" }, players[i], target); + } + return effect; + }, + }, + }, + }, + nsgefa: { + enable: "chooseToUse", + filter(event, player) { + return player.hp <= 0; + }, + filterCard: { suit: "club" }, + position: "hse", + viewAs: { name: "tao" }, + prompt: "将一张梅花牌当桃使用", + check(card) { + return 15 - get.value(card); + }, + ai: { + skillTagFilter(player) { + return player.countCards("hes", { suit: "club" }) > 0; + }, + threaten: 1.5, + save: true, + respondTao: true, + }, + }, + nscaiyi: { + trigger: { global: "drawAfter" }, + check(event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if (get.effect(event.player, { name: "sha" }, player, player) <= 0) return false; + if (get.effect(player, { name: "sha" }, event.player, player) >= 0) return true; + return player.hasShan() && player.hp >= event.player.hp; + }, + filter(event, player) { + return player != event.player && Array.isArray(event.result) && event.result.length > 0; + }, + logTarget: "player", + content() { + "step 0"; + player.viewCards(get.translation(trigger.player) + "摸到的牌", trigger.result); + if (!event.isMine()) { + game.delayx(); + } + "step 1"; + var list = []; + for (var i = 0; i < trigger.result.length; i++) { + if (trigger.result[i].name == "sha") { + list.push(trigger.result[i]); + } + } + if (list.length) { + player.useCard({ name: "sha" }, trigger.player); + } else { + trigger.player.useCard({ name: "sha" }, player); + } + }, + }, + nspinmin: { + trigger: { player: "dieBefore" }, + forced: true, + filter(event, player) { + return player.maxHp > 0; + }, + content() { + trigger.cancel(); + player.hp = 1; + player.update(); + if (_status.currentPhase == player) { + var num = 4; + // if(game.countPlayer()>=7){ + // num=5; + // } + if (!player.hasSkill("nspinmin_used") && player.maxHp < num) { + player.gainMaxHp(true); + player.addTempSkill("nspinmin_used"); + } + } else { + player.loseMaxHp(true); + } + }, + subSkill: { + used: {}, + }, + }, + nsshishou: { + trigger: { player: "loseEnd" }, + forced: true, + filter(event, player) { + if (_status.currentPhase != player) return false; + for (var i = 0; i < event.cards.length; i++) { + if (event.cards[i].original == "h") return true; + } + return false; + }, + content() { + "step 0"; + player.loseHp(); + "step 1"; + player.draw(); + }, + group: "nsshishou_use", + subSkill: { + use: { + mod: { + cardEnabled(card, player) { + if (_status.currentPhase != player) return; + if (get.cardCount(true, player) >= 4) { + return false; + } + }, + }, + }, + }, + ai: { + halfneg: true, + effect: { + target(card, player, target) { + if (get.tag(card, "save")) { + if (_status.currentPhase == player) return 0; + if (target.maxHp > 1 && player != target) return 0; + } + if (get.tag(card, "recover")) { + if (_status.currentPhase == player) return 0; + } + }, + }, + }, + }, + nsduijue: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter(event, player) { + return player.countCards("h"); + }, + content() { + "step 0"; + var color = { + black: player.countCards("h", function (card) { + return get.color(card) == "red" && get.value(card) < 8; + }), + red: player.countCards("h", function (card) { + return get.color(card) == "black" && get.value(card) < 8; + }), + }; + player + .chooseToDiscard(get.prompt2("nsduijue")) + .set("ai", function (card) { + var num = _status.event.color[get.color(card)]; + if (_status.event.goon && num >= 1) { + return 7 + num - get.value(card); + } + }) + .set( + "goon", + game.hasPlayer(function (current) { + return get.effect(current, { name: "juedou" }, player, player) > 0; + }) + ) + .set("color", color) + .set("logSkill", "nsduijue"); + "step 1"; + if (result.bool) { + player.addTempSkill("nsduijue_use"); + player.storage.nsduijue_use = get.color(result.cards[0]); + } + }, + subSkill: { + use: { + enable: "phaseUse", + viewAs: { name: "juedou" }, + usable: 2, + filter(event, player) { + return player.hasCard(function (card) { + return get.color(card) != player.storage.nsduijue_use; + }, "hs"); + }, + position: "hs", + filterCard(card, player) { + return get.color(card) != player.storage.nsduijue_use; + }, + check(card) { + return 8 - get.value(card); + }, + ai: { + basic: { + order: 10, + }, + }, + }, + }, + }, + nsshuangxiong: { + trigger: { player: "juedouBegin", target: "juedouBegin" }, + check(event, player) { + return player.isTurnedOver(); + }, + content() { + player.turnOver(); + }, + }, + nsguanyong: { + enable: "chooseToRespond", + filterCard: true, + viewAs: { name: "sha" }, + viewAsFilter(player) { + if (!player.countCards("hs")) return false; + }, + position: "hs", + prompt: "将一张手牌当杀打出", + check(card) { + return 7 - get.value(card); + }, + ai: { + respondSha: true, + skillTagFilter(player, tag, arg) { + if (arg != "respond") return false; + if (!player.countCards("hs")) return false; + }, + }, + }, + nsjihui: { + trigger: { global: "discardAfter" }, + filter(event, player) { + return event.cards.length >= 3; + }, + content() { + player.insertPhase(); + player.storage.nsjihui_use = _status.currentPhase; + player.addSkill("nsjihui_use"); + }, + subSkill: { + use: { + mark: "character", + intro: { + content: "使用牌只能指定自己与$为目标", + }, + trigger: { player: "phaseAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "nsjihui"; + }, + onremove: true, + content() { + player.removeSkill("nsjihui_use"); + }, + mod: { + playerEnabled(card, player, target) { + if (player != target && player.storage.nsjihui_use != target) return false; + }, + }, + }, + }, + }, + nsmouyun: { + enable: "phaseUse", + round: 2, + filterTarget(card, player, target) { + return target.isMinHp() && target != player && target.isDamaged(); + }, + content() { + if (target.isDamaged()) { + player.discardPlayerCard(target, "hej", target.maxHp - target.hp, true); + } + }, + ai: { + order: 10, + result: { + target(player, target) { + return target.hp - target.maxHp; + }, + }, + }, + }, + nscongjun: { + forbid: ["guozhan"], + unique: true, + forceunique: true, + init(player) { + if (player.storage.nscongjun_show) return false; + var change = function (target) { + if (target == player) { + var list; + if (_status.connectMode) { + list = get.charactersOL(function (i) { + return lib.character[i][0] != "male"; + }); + } else { + list = get.gainableCharacters(function (info) { + return info[0] == "male"; + }); + } + var name = list.randomGet(); + target.reinit("ns_huamulan", name, "nosmooth"); + target.storage.nscongjun_show = name; + target.addSkill("nscongjun_show"); + player._inits.remove(change); + player.hp = player.maxHp; + player.update(); + } + }; + if (!player._inits) { + player._inits = []; + } + player._inits.push(change); + }, + subSkill: { + show: { + trigger: { global: "useCard" }, + filter(event, player) { + return player.getEnemies().includes(event.player) && event.card.name == "wuxie" && event.getRand() < 0.1; + }, + direct: true, + skillAnimation: true, + animationColor: "thunder", + content() { + "step 0"; + game.delay(0.5); + "step 1"; + player.reinit(player.storage.nscongjun_show, "ns_huamulan", "nosmooth"); + player.logSkill("nscongjun_show"); + "step 2"; + player.removeSkill("nscongjun_show"); + player.line(trigger.player, "green"); + trigger.player.damage(2); + }, + }, + }, + }, + nstaiping_nh: { + trigger: { player: "damageEnd" }, + filter(event, player) { + return !event.nshuanxian && player.getSubPlayers("nshuanxian").length; + }, + direct: true, + priority: -0.1, + content() { + "step 0"; + event.num = trigger.num; + "step 1"; + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + var list = []; + var choice = 0; + var hpleft = 0; + var maxleft = 0; + if (left && player.hasSkill(left)) { + if (player.storage[left].hp < player.storage[left].maxHp) { + list.push("令幻身·左回复1点体力"); + hpleft = player.storage[left].hp; + } + list.push("令幻身·左增加1点体力上限"); + maxleft = player.storage[left].hp; + } + if (left && player.hasSkill(right)) { + if (player.storage[right].hp < player.storage[right].maxHp) { + list.push("令幻身·右回复1点体力"); + if (!hpleft || player.storage[right].hp < hpleft || (player.storage[right].hp == hpleft && Math.random() < 0.5)) { + choice = list.length - 1; + } + } + list.push("令幻身·右增加1点体力上限"); + if (!hpleft && maxleft && choice == 0) { + if (player.storage[right].maxHp < maxleft || (player.storage[right].maxHp == maxleft && Math.random() < 0.5)) { + choice = list.length - 1; + } + } + } + if (!list.length) { + event.finish(); + return; + } + event.map = {}; + for (var i = 0; i < list.length; i++) { + event.map["选项" + get.cnNumber(i + 1, true)] = list[i]; + } + player + .chooseControlList(list, function () { + return _status.event.choice; + }) + .set("prompt", get.prompt("nstaiping_nh")) + .set("choice", choice); + "step 2"; + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + if (result.control != "cancel2") { + player.logSkill("nstaiping_nh"); + switch (event.map[result.control]) { + case "令幻身·左回复1点体力": + player.storage[left].hp++; + break; + case "令幻身·左增加1点体力上限": + player.storage[left].maxHp++; + break; + case "令幻身·右回复1点体力": + player.storage[right].hp++; + break; + case "令幻身·右增加1点体力上限": + player.storage[right].maxHp++; + break; + } + game.log(player, event.map[result.control].replace(/一/, "了一")); + } + "step 3"; + if (event.num > 1) { + event.num--; + event.goto(1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + combo: "nshuanxian", + }, + }, + nsshoudao: { + group: ["nsshoudao_gain", "nsshoudao_die"], + subSkill: { + gain: { + trigger: { player: "subPlayerDie" }, + forced: true, + filter(event, player) { + var left = player.storage.nshuanxian_left; + if (left && player.hasSkill(left)) return false; + var right = player.storage.nshuanxian_right; + if (right && player.hasSkill(right)) return false; + if (!player.storage.nshuanxian_damage) return false; + return true; + }, + content() { + player.addSkill("releiji"); + player.addSkill("guidao"); + }, + }, + die: { + trigger: { player: "dieBegin" }, + direct: true, + filter(event, player) { + if (game.countPlayer() <= 2) return false; + var left = player.storage.nshuanxian_left; + if (left && player.hasSkill(left)) return true; + var right = player.storage.nshuanxian_right; + if (right && player.hasSkill(right)) return true; + return false; + }, + content() { + "step 0"; + var str; + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + if (left && player.hasSkill(left) && right && player.hasSkill(right)) { + str = "令一名其他角色获得技能【雷击】和【鬼道】"; + } else { + str = "令一名其他角色获得技能【雷击】或【鬼道】"; + } + if (trigger.source) { + str += "(" + get.translation(trigger.source) + "除外)"; + } + player + .chooseTarget(function (card, player, target) { + return target != player && target != _status.event.source; + }, get.prompt("nsshoudao")) + .set("ai", function (target) { + if (target.hasSkill("releiji")) return 0; + return get.attitude(_status.event.player, target); + }) + .set("source", trigger.source) + .set("prompt2", str); + "step 1"; + var goon = false; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("nsshoudao", target); + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + if (left && player.hasSkill(left) && right && player.hasSkill(right)) { + target.addSkillLog("releiji"); + target.addSkillLog("guidao"); + } else { + event.target = target; + player.chooseControl("releiji", "guidao").set("prompt", "令" + get.translation(target) + "获得一项技能"); + goon = true; + } + } + if (!goon) { + event.finish(); + } + "step 2"; + event.target.addSkillLog(result.control); + }, + }, + }, + ai: { + combo: "nshuanxian", + }, + }, + nshuanxian: { + trigger: { global: "gameStart", player: "enterGame" }, + forced: true, + nosub: true, + unique: true, + group: ["nshuanxian_left", "nshuanxian_right", "nshuanxian_damage", "nshuanxian_swap", "nshuanxian_draw"], + content() { + player.storage.nshuanxian_right = player.addSubPlayer({ + name: "ns_nanhua_right", + skills: ["nshuanxian_left", "nshuanxian_draw", "nshuanxian_swap"], + hp: 2, + maxHp: 2, + hs: get.cards(2), + skill: "nshuanxian", + intro: "你的本体回合结束后,切换至此随从并进行一个额外的回合;若你的上家与下家不同,在你的下家的准备阶段,切换至此随从", + intro2: "当前回合结束后切换回本体", + onremove(player) { + delete player.storage.nshuanxian_right; + }, + }); + }, + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (!target.hasFriend()) return; + if (target.hp <= 2) return; + if (!target.storage.nshuanxian_damage) { + if (get.attitude(player, target) < 0 || get.tag(card, "multineg")) return [0, 1]; + return [1, 1]; + } + } + }, + }, + }, + // mod:{ + // globalFrom(from,to,distance){ + // + // }, + // globalTo(from,to,distance){ + // + // } + // }, + // global:'nshuanxian_choose', + subSkill: { + chosen: {}, + leftdist: { + mod: { + globalFrom(from, to, distance) {}, + globalTo(from, to, distance) {}, + }, + }, + rightdist: { + mod: { + globalFrom(from, to, distance) {}, + globalTo(from, to, distance) {}, + }, + }, + swap: { + trigger: { global: "phaseBegin" }, + forced: true, + popup: false, + filter(event, player) { + return event.player != player; + }, + priority: 20, + content() { + var next = player.getNext(); + var prev = player.getPrevious(); + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + if (prev == next || (trigger.player != next && trigger.player != prev)) { + if (player.hasSkill("subplayer")) { + player.exitSubPlayer(); + } + } else if (prev == trigger.player && player.name != left && left) { + if (!player.hasSkill("subplayer")) { + player.callSubPlayer(left); + } else { + player.toggleSubPlayer(left); + } + } else if (next == trigger.player && player.name != right && right) { + if (!player.hasSkill("subplayer")) { + player.callSubPlayer(right); + } else { + player.toggleSubPlayer(right); + } + } + }, + }, + damage: { + trigger: { player: "damageEnd" }, + forced: true, + filter(event, player) { + return !player.storage.nshuanxian_damage; + }, + content() { + player.storage.nshuanxian_damage = true; + player.storage.nshuanxian_left = player.addSubPlayer({ + name: "ns_nanhua_left", + skills: ["nshuanxian_middle", "nshuanxian_draw", "nshuanxian_swap"], + hp: 2, + maxHp: 2, + hs: get.cards(2), + skill: "nshuanxian", + intro: "你的本体回合开始前,切换至此随从并进行一个额外的回合;若你的上家与下家不同,在你的上家的准备阶段,切换至此随从", + intro2: "当前回合结束后切换回本体", + onremove(player) { + delete player.storage.nshuanxian_left; + }, + }); + trigger.nshuanxian = true; + }, + }, + draw: { + trigger: { player: "phaseDrawBegin" }, + silent: true, + filter(event) { + return event.num > 0; + }, + content() { + trigger.num--; + }, + }, + left: { + trigger: { player: "phaseBefore" }, + forced: true, + popup: false, + priority: 40, + filter(event, player) { + if (event.skill == "nshuanxian_middle") return false; + if (event.skill == "nshuanxian_right") return false; + var left = player.storage.nshuanxian_left; + if (player.hasSkill("subplayer")) { + if (!left) return player.name == player.storage.nshuanxian_right; + return player.storage.subplayer.skills.includes(left); + } else { + if (!left) return false; + return player.hasSkill(left); + } + }, + content() { + if (player.hasSkill("subplayer")) { + var left = player.storage.nshuanxian_left; + if (left && player.storage.subplayer.skills.includes(left)) { + player.toggleSubPlayer(player.storage.nshuanxian_left); + } else { + player.exitSubPlayer(); + } + } else { + player.callSubPlayer(player.storage.nshuanxian_left); + } + }, + }, + middle: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + priority: -40, + filter(event, player) { + if (player.hasSkill("nshuanxian_chosen")) return false; + return true; + }, + content() { + player.exitSubPlayer(); + player.insertPhase(null, true); + }, + }, + right: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + priority: -40, + filter(event, player) { + if (player.hasSkill("nshuanxian_chosen")) return false; + if (player.hasSkill("subplayer")) return false; + var right = player.storage.nshuanxian_right; + if (!right) return false; + return player.hasSkill(right); + }, + content() { + player.callSubPlayer(player.storage.nshuanxian_right); + player.insertPhase(null, true); + player.addTempSkill("nshuanxian_chosen", ["phaseBegin", "phaseCancelled"]); + }, + }, + end: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + priority: -40, + filter(event, player) { + if (player.hasSkill("nshuanxian_chosen")) return false; + return true; + }, + content() { + if (player.hasSkill("subplayer")) { + player.exitSubPlayer(); + } + }, + content_old() { + "step 0"; + var controls = ["本体"]; + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + if (player.hasSkill("subplayer")) { + if (player.storage.subplayer.skills.includes(left)) { + controls.unshift("幻身·左"); + } + if (player.storage.subplayer.skills.includes(right)) { + controls.push("幻身·右"); + } + } else { + if (player.hasSkill(left)) { + controls.unshift("幻身·左"); + } + if (player.hasSkill(right)) { + controls.push("幻身·右"); + } + } + if (controls.length > 1) { + player + .chooseControl(controls, function (event, player) { + return Math.floor(Math.random() * _status.event.num); + }) + .set("prompt", "选择一个形态直到下一回合开始") + .set("num", controls.length); + } else { + event.finish(); + } + "step 1"; + switch (result.control) { + case "幻身·左": { + if (!player.hasSkill("subplayer")) { + player.callSubPlayer(player.storage.nshuanxian_left); + } else { + player.toggleSubPlayer(player.storage.nshuanxian_left); + } + break; + } + case "幻身·右": { + if (!player.hasSkill("subplayer")) { + player.callSubPlayer(player.storage.nshuanxian_right); + } + break; + } + default: { + if (player.hasSkill("subplayer")) { + player.exitSubPlayer(); + } + break; + } + } + player.addTempSkill("nshuanxian_chosen", "phaseBegin"); + }, + }, + }, + }, + nsnongquan: { + enable: "phaseUse", + // usable:4, + filter(event, player) { + return player.countCards("h") == 1 && player.canUse("wuzhong", player); + }, + direct: true, + delay: 0, + content() { + player.useCard({ name: "wuzhong" }, player.getCards("h"), player, "nsnongquan"); + }, + ai: { + order: 10, + result: { + player(player, target) { + return 10 - get.value(player.getCards("h")[0]); + }, + }, + }, + }, + nsdufu: { + trigger: { source: "damageBefore" }, + check(event, player) { + return event.player.hasSkillTag("maixie"); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("nsdufu"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + if (_status.event.bool) { + return -get.attitude(_status.event.player, target); + } + return 0; + }) + .set("bool", trigger.player.hasSkillTag("maixie_defend")); + "step 1"; + if (result.bool) { + player.logSkill("nsdufu", result.targets); + trigger.source = result.targets[0]; + } + }, + }, + yiesheng: { + enable: "phaseUse", + filterCard: { color: "black" }, + filter(event, player) { + return player.countCards("h", { color: "black" }) > 0; + }, + selectCard: [1, Infinity], + prompt: "弃置任意张黑色手牌并摸等量的牌", + check(card) { + return 5 - get.value(card); + }, + content() { + player.draw(cards.length); + }, + ai: { + order: 1, + result: { + player: 1, + }, + }, + }, + liangji: { + audio: ["liangji", 2], + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && !target.hasSkill("liangji_1"); + }, + content() { + "step 0"; + player.chooseCard("h", "环计:将一张牌置于" + get.translation(target) + "的武将牌上", true).set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { + return 7 - get.value(card); + } + return -get.value(card); + }); + "step 1"; + if (result.bool) { + player.$give(result.cards, target); + player.lose(result.cards, ui.special); + target.storage.liangji_1 = result.cards; + target.storage.liangji_1_source = target; + target.syncStorage("liangji_1"); + target.addSkill("liangji_1"); + } + }, + ai: { + order: 1, + result: { + target(player, target) { + if (get.attitude(player, target) > 0) { + return Math.sqrt(target.countCards("he")); + } + return 0; + }, + player: 1, + }, + }, + subSkill: { + 1: { + trigger: { + player: "phaseDrawBegin", + }, + forced: true, + mark: true, + intro: { + content: "cards", + }, + content() { + "step 0"; + var cards = player.storage.liangji_1; + if (cards) { + player.gain(cards, "gain2"); + } + player.storage.liangji_1 = 0; + "step 1"; + if (player.sex == "male") player.addTempSkill("wushuang"); + if (player.sex == "female") player.addTempSkill("lijian"); + player.removeSkill("liangji_1"); + }, + sub: true, + }, + }, + }, + jugong: { + audio: ["jingong", 2], + trigger: { + global: "damageEnd", + }, + usable: 1, + frequent: true, + locked: false, + notemp: true, + marktext: "功", + init(player) { + player.storage.jugong = []; + }, + filter(event, player) { + return event.card && (event.card.name == "sha" || event.card.name == "juedou") && event.notLink() && _status.currentPhase != player; + }, + content() { + "step 0"; + player.draw(); + "step 1"; + if (player.countCards("h")) { + player.chooseCard("将" + get.cnNumber(1) + "张手牌置于武将牌上作为“功”", 1, true); + } else { + event.finish(); + } + "step 2"; + if (result.cards && result.cards.length) { + player.lose(result.cards, ui.special); + player.storage.jugong = player.storage.jugong.concat(result.cards); + player.syncStorage("jugong"); + player.markSkill("jugong"); + game.log(player, "将", result.cards, "置于武将牌上作为“功”"); + } + }, + intro: { + content: "cards", + }, + group: "jugong_1", + subSkill: { + 1: { + trigger: { + player: "damageBegin", + }, + filter(event, player) { + return player.storage.jugong.length > 1; + }, + content() { + "step 0"; + player.chooseCardButton("移去两张“功”", 2, player.storage.jugong, true); + "step 1"; + if (event.directresult || result.bool) { + player.logSkill("jugong"); + var links = event.directresult || result.links; + for (var i = 0; i < links.length; i++) { + player.storage.jugong.remove(links[i]); + } + player.syncStorage("jugong"); + if (!player.storage.jugong.length) { + player.unmarkSkill("jugong"); + } else { + player.markSkill("jugong"); + } + player.$throw(links); + game.log(player, "被移去了", links); + for (var i = 0; i < links.length; i++) { + ui.discardPile.appendChild(links[i]); + } + } + "step 2"; + trigger.cancel(); + }, + sub: true, + }, + }, + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; + if (!target.hasSkill("paiyi") && target.hp > 1) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [0.5, get.tag(card, "damage") * 0.2]; + if (target.hp == 2) return [0.1, get.tag(card, "damage") * 0.1]; + } + }, + }, + }, + }, + chengmou: { + audio: ["moucheng", 2], + trigger: { + player: "phaseDrawBegin", + }, + frequent: true, + filter(event, player) { + return player.storage.jugong.length > 0; + }, + content() { + "step 0"; + if (player.storage.jugong.length > 2) player.loseHp(); + "step 1"; + var cards = player.storage.jugong; + if (cards) { + player.gain(cards, "gain2"); + } + player.storage.jugong = []; + "step 2"; + trigger.cancel(); + }, + ai: { + combo: "jugong", + }, + }, + nsxinsheng: { + trigger: { source: "damageEnd" }, + frequent: true, + filter(event, player) { + return player.isHealthy(); + }, + content() { + player.gainMaxHp(trigger.num, true); + player.draw(trigger.num); + }, + }, + nsdunxing: { + trigger: { player: "damageBefore" }, + filter(event, player) { + return player.isDamaged(); + }, + content() { + trigger.cancel(); + player.loseMaxHp(trigger.num, true); + player.draw(trigger.num); + }, + }, + liangce: { + enable: "phaseUse", + viewAs: { name: "wugu" }, + usable: 1, + filterCard: { type: "basic" }, + position: "hs", + filter(event, player) { + return player.countCards("hs", { type: "basic" }) > 0; + }, + check(card) { + return 6 - get.value(card); + }, + group: "liangce2", + }, + liangce2: { + trigger: { global: "wuguRemained" }, + direct: true, + filter(event) { + return event.remained.filterInD().length > 0; + }, + content() { + "step 0"; + var du = 0; + for (var i = 0; i < trigger.remained.length; i++) { + if (trigger.remained[i].name == "du") du++; + } + var dialog = ui.create.dialog(get.prompt("liangce"), trigger.remained, "hidden"); + dialog.classList.add("noselect"); + player.chooseTarget(dialog).set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var att = get.attitude(player, target); + if (du >= trigger.remained.length / 2) return -att; + return att; + }); + "step 1"; + if (result.bool) { + player.logSkill("liangce", result.targets); + result.targets[0].gain(trigger.remained.slice(0), "gain2", "log"); + trigger.remained.length = 0; + } + }, + }, + jianbi: { + trigger: { target: "useCardToTargeted" }, + priority: 5, + filter(event, player) { + if (get.type(event.card) != "trick") return false; + if (get.info(event.card).multitarget) return false; + if (event.targets.length < 2) return false; + return true; + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt("jianbi"), [1, 1], function (card, player, target) { + return _status.event.getTrigger().targets.includes(target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var eff = -get.effect(target, trigger.card, trigger.player, _status.event.player); + if (trigger.card.name == "wugu" && eff == 0 && get.attitude(player, target) < 0) { + return 0.01; + } + return eff; + }); + "step 1"; + if (result.bool) { + event.targets = result.targets; + if (event.isMine()) { + player.logSkill("jianbi", event.targets); + event.finish(); + } + for (var i = 0; i < result.targets.length; i++) { + trigger.getParent().excluded.add(result.targets[i]); + } + game.delay(); + } else { + event.finish(); + } + "step 2"; + player.logSkill("jianbi", event.targets); + }, + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "multineg")) { + return "zerotarget"; + } + if (get.tag(card, "multitarget")) { + var info = get.info(card); + if (info.selectTarget == -1 && !info.multitarget) { + return [1, Math.min(3, 1 + target.maxHp - target.hp)]; + } + } + }, + }, + }, + }, + diyjuntun: { + enable: "phaseUse", + filter: (event, player) => player.hasCard(card => lib.skill.diyjuntun.filterCard(card, player), "he"), + position: "he", + filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), + check(card) { + var player = _status.event.player; + var he = player.getCards("he"); + var subtype = get.subtype(card); + var value = get.equipValue(card); + for (var i = 0; i < he.length; i++) { + if (he[i] != card && get.subtype(he[i]) == subtype && get.equipValue(he[i]) >= value) { + return 10; + } + } + if (!player.needsToDiscard()) { + return 4 - get.equipValue(card); + } + return 0; + }, + content() { + player.recast(cards); + }, + discard: false, + lose: false, + delay: false, + prompt: "将一张装备牌置入弃牌堆并摸一张牌", + ai: { + basic: { + order: 8.5, + }, + result: { + player: 1, + }, + }, + }, + choudu: { + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + filterTarget(card, player, target) { + return lib.filter.cardEnabled({ name: "diaobingqianjiang" }, target); + }, + check(card) { + return 6 - get.value(card); + }, + content() { + var list = game.filterPlayer(); + list.sortBySeat(target); + target.useCard({ name: "diaobingqianjiang" }, list); + }, + ai: { + order: 1, + result: { + player(player, target) { + if (get.attitude(player, target) <= 1) return 0; + return game.countPlayer(function (current) { + return get.effect(current, { name: "diaobingqianjiang" }, target, player); + }); + }, + }, + }, + }, + liduan: { + trigger: { global: "gainAfter" }, + filter(event, player) { + if (event.player == player) return false; + if (_status.currentPhase == event.player) return false; + if (event.cards.length != 1) return false; + return get.type(event.cards[0]) == "equip" && get.position(event.cards[0]) == "h" && event.player.hasUseTarget(event.cards[0]); + }, + logTarget: "player", + check(event, player) { + var att = get.attitude(player, event.player); + var subtype = get.subtype(event.cards[0]); + if (att > 0) { + if (event.player.countCards("h") >= player.countCards("h") + 2) return true; + return ( + event.player.countCards("e", { + subtype: subtype, + }) == 0 + ); + } else { + return event.player.countCards("e", { subtype: subtype }) > 0; + } + }, + content() { + "step 0"; + var bool = false; + var subtype = get.subtype(trigger.cards[0]); + var current = trigger.player.getEquip("e", parseInt(subtype[5])); + var att = get.attitude(trigger.player, player); + if (current) { + if (att > 0) { + bool = true; + } else { + if (get.equipValue(current) > get.equipValue(trigger.cards[0])) { + bool = true; + } + } + } + trigger.player.chooseCard("立断").set("prompt2", "将一张手牌交给" + get.translation(player) + ",或取消并使用" + get.translation(trigger.cards)).ai = function (card) { + if (bool) { + if (att > 0) { + return 8 - get.value(card); + } else { + return 4 - get.value(card); + } + } else { + if (att <= 0) return -get.value(card); + return 0; + } + }; + "step 1"; + if (result.bool) { + player.gain(result.cards, trigger.player); + trigger.player.$give(1, player); + } else { + trigger.player.chooseUseTarget(trigger.cards[0], true); + } + }, + }, + jinyan: { + mod: { + cardEnabled(card, player) { + if (_status.event.skill != "jinyan" && player.hp <= 2 && get.type(card, "trick") == "trick" && get.color(card) == "black") return false; + }, + cardUsable(card, player) { + if (_status.event.skill != "jinyan" && player.hp <= 2 && get.type(card, "trick") == "trick" && get.color(card) == "black") return false; + }, + cardRespondable(card, player) { + if (_status.event.skill != "jinyan" && player.hp <= 2 && get.type(card, "trick") == "trick" && get.color(card) == "black") return false; + }, + cardSavable(card, player) { + if (_status.event.skill != "jinyan" && player.hp <= 2 && get.type(card, "trick") == "trick" && get.color(card) == "black") return false; + }, + }, + enable: ["chooseToUse", "chooseToRespond"], + filterCard(card) { + return get.type(card, "trick") == "trick" && get.color(card) == "black"; + }, + viewAsFilter(player) { + if (player.hp > 2) return false; + if ( + !player.hasCard(function (card) { + return get.type(card, "trick") == "trick" && get.color(card) == "black"; + }) + ) + return false; + }, + viewAs: { name: "sha" }, + prompt: "将一张黑色锦囊牌当作杀使用或打出", + check() { + return 1; + }, + ai: { + respondSha: true, + skillTagFilter(player) { + if (player.hp > 2) return false; + if ( + !player.hasCard(function (card) { + return get.type(card, "trick") == "trick" && get.color(card) == "black"; + }) + ) + return false; + }, + }, + }, + fuchou: { + trigger: { target: "shaBefore" }, + filter(event, player) { + return player.countCards("he") > 0; + }, + direct: true, + content() { + "step 0"; + var bool = false; + if (!player.hasShan() && get.effect(player, trigger.card, trigger.player, player) < 0) { + bool = true; + } + player.chooseCard("he", get.prompt("fuchou", trigger.player)).set("ai", function (card) { + var player = _status.event.player; + if (bool) { + if (player.hp <= 1) { + if (get.tag(card, "save")) return 0; + return 8 - get.value(card); + } + return 6 - get.value(card); + } + return -get.value(card); + }); + "step 1"; + if (result.bool) { + trigger.cancel(); + player.logSkill("fuchou", trigger.player); + trigger.player.gain(result.cards, player); + if (get.position(result.cards[0]) == "h") { + player.$give(1, trigger.player); + } else { + player.$give(result.cards, trigger.player); + } + player.storage.fuchou2.add(trigger.player); + } + }, + group: "fuchou2", + }, + fuchou2: { + init(player) { + player.storage.fuchou2 = []; + }, + forced: true, + trigger: { global: "phaseAfter" }, + filter(event, player) { + for (var i = 0; i < player.storage.fuchou2.length; i++) { + if (player.storage.fuchou2[i].isAlive()) return true; + } + return false; + }, + content() { + "step 0"; + if (player.storage.fuchou2.length) { + var target = player.storage.fuchou2.shift(); + if (target.isAlive()) { + player.draw(); + if (player.canUse("sha", target, false) && player.hasSha()) { + player.chooseToUse({ name: "sha" }, target, -1, "对" + get.translation(target) + "使用一张杀,或失去1点体力"); + } else { + player.loseHp(); + event.redo(); + } + } + } else { + event.finish(); + } + "step 1"; + if (!result.bool) { + player.loseHp(); + } + event.goto(0); + }, + }, + chezhen: { + mod: { + globalFrom(from, to, distance) { + if (from.countCards("e")) return distance - 1; + }, + globalTo(from, to, distance) { + if (!to.countCards("e")) return distance + 1; + }, + }, + }, + youzhan: { + trigger: { global: "shaBefore" }, + direct: true, + filter(event, player) { + return get.distance(player, event.target) <= 1 && player.countCards("he", { type: "equip" }); + }, + content() { + "step 0"; + var bool = get.attitude(player, trigger.player) < 0 && get.attitude(player, trigger.target) > 0; + var next = player.chooseToDiscard("he", { type: "equip" }, get.prompt("youzhan", trigger.target)); + next.ai = function (card) { + if (bool) { + return 7 - get.value(card); + } + return 0; + }; + next.logSkill = ["youzhan", trigger.target]; + "step 1"; + if (result.bool) { + event.youdiinfo = { + source: trigger.player, + evt: trigger, + }; + trigger.target.useCard({ name: "youdishenru" }); + } + }, + }, + kangyin: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("he") > 0; + }, + content() { + "step 0"; + player.loseHp(); + "step 1"; + player.discardPlayerCard(target, true); + "step 2"; + if (player.isDamaged() && result.links && result.links.length) { + if (get.type(result.links[0]) == "basic") { + player.chooseTarget([1, player.maxHp - player.hp], "选择至多" + get.cnNumber(player.maxHp - player.hp) + "名角色各摸一张牌").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + } else { + player.storage.kangyin2 = player.maxHp - player.hp; + player.addTempSkill("kangyin2"); + event.finish(); + } + } else { + event.finish(); + } + "step 3"; + if (result.targets && result.targets.length) { + result.targets.sort(lib.sort.seat); + player.line(result.targets, "green"); + game.asyncDraw(result.targets); + } + }, + ai: { + order: 7, + result: { + target(player, target) { + if (player.hp >= 4) return -1; + if (player.hp == 3 && !player.needsToDiscard()) return -1; + return 0; + }, + }, + }, + }, + kangyin2: { + mark: true, + intro: { + content: "到其他角色的距离-#;使用【杀】的额外目标数上限+#", + }, + onremove: true, + mod: { + globalFrom(from, to, distance) { + return distance - from.storage.kangyin2; + }, + selectTarget(card, player, range) { + if (card.name == "sha" && range[1] != -1) range[1] += player.storage.kangyin2; + }, + }, + }, + duoqi: { + trigger: { global: "discardAfter" }, + filter(event, player) { + if (_status.currentPhase == player) return false; + if (!player.storage.zhucheng || !player.storage.zhucheng.length) return false; + var evt = event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") return true; + return false; + }, + direct: true, + content() { + "step 0"; + var bool = false; + if (get.attitude(player, trigger.player) < 0 && trigger.player.needsToDiscard()) { + bool = true; + } + player + .chooseCardButton(get.prompt("zhucheng", _status.currentPhase), player.storage.zhucheng) + .set("ai", function (button) { + return _status.event.bool ? 1 : 0; + }) + .set("bool", bool); + "step 1"; + if (result.bool) { + player.logSkill("zhucheng", _status.currentPhase); + player.$throw(result.links[0]); + player.storage.zhucheng.remove(result.links[0]); + result.links[0].discard(); + player.syncStorage("zhucheng"); + if (player.storage.zhucheng.length == 0) { + player.unmarkSkill("zhucheng"); + } else { + player.updateMarks(); + } + var evt = trigger.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; + } + } + }, + ai: { + expose: 0.2, + combo: "zhucheng", + }, + }, + zhucheng: { + trigger: { player: "phaseEnd" }, + filter(event, player) { + return !player.storage.zhucheng || !player.storage.zhucheng.length; + }, + check(event, player) { + if (player.storage.zhucheng && player.storage.zhucheng.length) { + if (!player.hasShan()) return false; + if (player.storage.zhucheng.length >= 2) return false; + } + return true; + }, + intro: { + content: "cards", + }, + content() { + if (player.storage.zhucheng && player.storage.zhucheng.length) { + player.gain(player.storage.zhucheng, "gain2"); + delete player.storage.zhucheng; + player.unmarkSkill("zhucheng"); + } else { + var cards = get.cards(Math.max(1, player.maxHp - player.hp)); + player.$gain2(cards); + player.storage.zhucheng = cards; + player.markSkill("zhucheng"); + } + }, + ai: { + target(card, player, target, current) { + if (card.name == "sha" && player.storage.zhucheng && player.storage.zhucheng.length) { + if (player.storage.zhucheng.length >= 2) { + if (!player.hasFriend() && player.countCards("he") - 2 < player.storage.zhucheng.length) return "zeroplayertarget"; + return 0.1; + } else { + var he = player.getCards("he"); + var sha = false; + for (var i = 0; i < he.length; i++) { + if (he[i] == "sha" && !sha) { + sha = true; + } else { + if (get.value(he[i]) <= 6) { + return [1, 0, 1, -0.5]; + } + } + } + return "zeroplayertarget"; + } + } + }, + }, + group: "zhucheng2", + }, + zhucheng2: { + trigger: { target: "shaBefore" }, + check(event, player) { + if (get.attitude(event.player, player) <= 0) return true; + return get.effect(player, event.card, event.player, player) <= 0; + }, + filter(event, player) { + return player.storage.zhucheng && player.storage.zhucheng.length > 0; + }, + content() { + "step 0"; + var bool = false; + if (get.effect(player, trigger.card, trigger.player, trigger.player) >= 0) { + bool = true; + } + var num = player.storage.zhucheng.length; + trigger.player + .chooseToDiscard("弃置" + get.cnNumber(num) + "张牌,或令杀无效", "he", num) + .set("ai", function (card) { + if (_status.event.bool) { + return 10 - get.value(card); + } + return 0; + }) + .set("bool", bool); + "step 1"; + if (!result.bool) { + trigger.cancel(); + } + }, + }, + diy_jiaoxia: { + //audio:['jiaoxia',2], + trigger: { target: "useCardToBegin" }, + filter(event, player) { + return event.card && get.color(event.card) == "red"; + }, + frequent: true, + content() { + player.draw(); + }, + ai: { + effect(card, player, target) { + if (get.color(card) == "red") return [1, 1]; + }, + }, + }, + zaiqix: { + trigger: { player: "phaseDrawBefore" }, + filter(event, player) { + return player.hp < player.maxHp; + }, + check(event, player) { + if (1 + player.maxHp - player.hp < 2) { + return false; + } else if (1 + player.maxHp - player.hp == 2) { + return player.countCards("h") >= 2; + } + return true; + }, + content() { + "step 0"; + trigger.cancel(); + event.cards = get.cards(player.maxHp - player.hp + 1); + player.showCards(event.cards); + "step 1"; + var num = 0; + for (var i = 0; i < event.cards.length; i++) { + if (get.suit(event.cards[i]) == "heart") { + num++; + event.cards[i].discard(); + event.cards.splice(i--, 1); + } + } + if (num) { + player.recover(num); + } + "step 2"; + if (event.cards.length) { + player.gain(event.cards); + player.$gain2(event.cards); + game.delay(); + } + }, + ai: { + threaten(player, target) { + if (target.hp == 1) return 2; + if (target.hp == 2) return 1.5; + return 1; + }, + }, + }, + batu: { + trigger: { player: "phaseEnd" }, + frequent: true, + filter(event, player) { + return player.countCards("h") < game.countGroup(); + }, + content() { + player.draw(game.countGroup() - player.countCards("h")); + }, + ai: { + threaten: 1.3, + }, + }, + diyzaiqi: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + filter(event, player) { + return player.hp < player.maxHp; + }, + content() { + trigger.num += player.maxHp - player.hp; + }, + ai: { + threaten(player, target) { + if (target.hp == 1) return 2.5; + if (target.hp == 2) return 1.8; + return 0.5; + }, + maixie: true, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (target.hp == target.maxHp) return [0, 1]; + } + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, + }, + }, + }, + diykuanggu: { + trigger: { source: "damageEnd" }, + forced: true, + content() { + if (get.distance(trigger.player, player, "attack") > 1) { + player.draw(trigger.num); + } else { + player.recover(trigger.num); + } + }, + }, + diyduanliang: { + group: ["diyduanliang1", "diyduanliang2"], + ai: { + threaten: 1.2, + }, + }, + diyduanliang1: { + enable: "phaseUse", + usable: 1, + discard: false, + filter(event, player) { + var cards = player.getCards("he", { color: "black" }); + for (var i = 0; i < cards.length; i++) { + var type = get.type(cards[i]); + if (type == "basic") return true; + } + return false; + }, + prepare: "throw", + position: "he", + filterCard(card) { + if (get.color(card) != "black") return false; + var type = get.type(card); + return type == "basic"; + }, + filterTarget(card, player, target) { + return lib.filter.filterTarget({ name: "bingliang" }, player, target); + }, + check(card) { + return 7 - get.value(card); + }, + content() { + player.useCard({ name: "bingliang" }, target, cards).animate = false; + player.draw(); + }, + ai: { + result: { + target(player, target) { + return get.effect(target, { name: "bingliang" }, player, target); + }, + }, + order: 9, + }, + }, + diyduanliang2: { + mod: { + targetInRange(card, player, target) { + if (card.name == "bingliang") { + if (get.distance(player, target) <= 2) return true; + } + }, + }, + }, + guihan: { + unique: true, + enable: "chooseToUse", + skillAnimation: "epic", + limited: true, + filter(event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; + return true; + }, + filterTarget(card, player, target) { + return target.hasSex("male") && player != target; + }, + content() { + "step 0"; + player.awakenSkill("guihan"); + player.recover(); + "step 1"; + player.draw(2); + "step 2"; + target.recover(); + "step 3"; + target.draw(2); + // if(lib.config.mode=='identity'){ + // player.node.identity.style.backgroundColor=get.translation('weiColor'); + // player.group='wei'; + // } + }, + ai: { + skillTagFilter(player) { + if (player.storage.guihan) return false; + if (player.hp > 0) return false; + }, + save: true, + result: { + player: 4, + target(player, target) { + if (target.hp == target.maxHp) return 2; + return 4; + }, + }, + threaten(player, target) { + if (!target.storage.guihan) return 0.8; + }, + }, + }, + luweiyan: { + enable: "phaseUse", + usable: 1, + filterCard(card) { + return get.type(card) != "basic"; + }, + position: "hse", + filter(event, player) { + return player.hasCard(function (card) { + return get.type(card) != "basic"; + }, "hes"); + }, + viewAs: { name: "shuiyanqijun" }, + prompt: "将一张非基本牌当水淹七军使用", + check(card) { + return 8 - get.value(card); + }, + group: "luweiyan2", + }, + luweiyan2: { + trigger: { player: "useCardAfter" }, + direct: true, + filter(event, player) { + if (event.skill != "luweiyan") return false; + for (var i = 0; i < event.targets.length; i++) { + if (player.canUse("sha", event.targets[i], false)) { + return true; + } + } + return false; + }, + content() { + "step 0"; + player + .chooseTarget("是否视为使用一张杀?", function (card, player, target) { + return _status.event.targets.includes(target) && player.canUse("sha", target, false); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + player.useCard({ name: "sha" }, result.targets, false); + } + }, + }, + yaliang: { + inherit: "wangxi", + }, + xiongzi: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + content() { + trigger.num += 1 + Math.floor(player.countCards("e") / 2); + }, + }, + honglian: { + trigger: { player: "damageEnd" }, + check(event, player) { + return get.attitude(player, event.player) < 0; + }, + filter(event, player) { + return event.source && event.source != player && event.source.countCards("he", { color: "red" }) > 0; + }, + content() { + trigger.source.discard(trigger.source.getCards("he", { color: "red" })); + }, + ai: { + expose: 0.1, + result: { + threaten: 0.8, + target(card, player, target) { + if (get.tag(card, "damage") && get.attitude(target, player) < 0) { + return [1, 0, 0, -player.countCards("he", { color: "red" })]; + } + }, + }, + }, + }, + diyguhuo: { + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return player.countCards("hej") > 0; + }, + content() { + "step 0"; + player.draw(2); + "step 1"; + var next = player.discardPlayerCard(player, "hej", 2, true); + next.ai = function (button) { + if (get.position(button.link) == "j") return 10; + return -get.value(button.link); + }; + next.filterButton = function (button) { + return lib.filter.cardDiscardable(button.link, player); + }; + }, + ai: { + effect: { + target(card) { + if (get.type(card) == "delay") return [0, 0.5]; + }, + }, + }, + }, + diychanyuan: { + trigger: { player: "dieBegin" }, + forced: true, + filter(event) { + return event.source != undefined; + }, + content() { + trigger.source.loseMaxHp(true); + }, + ai: { + threaten(player, target) { + if (target.hp == 1) return 0.2; + }, + result: { + target(card, player, target, current) { + if (target.hp <= 1 && get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -5]; + return [1, 0, 0, -2]; + } + }, + }, + }, + }, + zonghuo: { + trigger: { source: "damageBefore" }, + direct: true, + priority: 10, + filter(event) { + return event.nature != "fire"; + }, + content() { + "step 0"; + player.chooseToDiscard(get.prompt("zonghuo")).ai = function (card) { + var att = get.attitude(player, trigger.player); + if (trigger.player.hasSkillTag("nofire")) { + if (att > 0) return 8 - get.value(card); + return -1; + } + if (att < 0) { + return 7 - get.value(card); + } + return -1; + }; + "step 1"; + if (result.bool) { + player.logSkill("zonghuo", trigger.player, "fire"); + trigger.nature = "fire"; + } + }, + }, + shaoying: { + trigger: { source: "damageAfter" }, + direct: true, + filter(event) { + return event.nature == "fire"; + }, + content() { + "step 0"; + player.chooseTarget(get.prompt("shaoying"), function (card, player, target) { + return get.distance(trigger.player, target) <= 1 && trigger.player != target; + }).ai = function (target) { + return get.damageEffect(target, player, player, "fire"); + }; + "step 1"; + if (result.bool) { + var card = get.cards()[0]; + card.discard(); + player.showCards(card); + event.bool = get.color(card) == "red"; + event.target = result.targets[0]; + player.logSkill("shaoying", event.target, false); + trigger.player.line(event.target, "fire"); + } else { + event.finish(); + } + "step 2"; + if (event.bool) { + event.target.damage("fire"); + } + }, + }, + tiangong: { + group: ["tiangong2"], + trigger: { player: "damageBefore" }, + filter(event) { + if (event.nature == "thunder") return true; + }, + forced: true, + content() { + trigger.cancel(); + }, + ai: { + effect: { + target(card, player, target, current) { + if (card.name == "tiesuo") return 0; + if (get.tag(card, "thunderDamage")) return 0; + }, + }, + threaten: 0.5, + }, + }, + tiangong2: { + trigger: { source: "damageAfter" }, + filter(event) { + if (event.nature == "thunder") return true; + }, + forced: true, + popup: false, + priority: 1, + content() { + player.draw(); + }, + }, + xicai: { + inherit: "jianxiong", + }, + diyjianxiong: { + mode: ["identity", "guozhan"], + trigger: { global: "dieBefore" }, + forced: true, + filter(event, player) { + if (_status.currentPhase !== player) return false; + if (get.mode() === "identity") return event.player != game.zhu; + return get.mode() === "guozhan" && event.player.isFriendOf(player); + }, + content() { + game.broadcastAll( + function (target, group) { + if (get.mode() === "identity") { + target.identity = group; + target.setIdentity(group); + target.identityShown = true; + } else { + target.trueIdentity = lib.group + .slice(0) + .filter(i => group !== i) + .randomGet(); + } + }, + trigger.player, + get.mode() === "identity" ? "fan" : player.getGuozhanGroup() + ); + }, + }, + nsshuaiyan: { + trigger: { global: "recoverAfter" }, + filter(event, player) { + return event.player != player && _status.currentPhase != player; + }, + logTarget: "player", + content() { + "step 0"; + var att = get.attitude(trigger.player, player); + var bool = 0; + if (att < 0) { + if (trigger.player.countCards("e") == 0 && trigger.player.countCards("h") > 2) bool = 1; + else if (trigger.player.countCards("he") == 0) bool = 1; + } else if (att == 0 && trigger.player.countCards("he") == 0) { + bool = 1; + } + trigger.player + .chooseControl(function () { + return _status.event.bool; + }) + .set("prompt", "率言") + .set("bool", bool) + .set("choiceList", ["令" + get.translation(player) + "摸一张牌", "令" + get.translation(player) + "弃置你一张牌"]); + "step 1"; + if (result.control == "选项一") { + player.draw(); + event.finish(); + } else if (trigger.player.countCards("he")) { + player.discardPlayerCard(trigger.player, true, "he"); + } else { + event.finish(); + } + }, + ai: { + threaten: 1.2, + }, + }, + moshou: { + mod: { + targetEnabled(card, player, target, now) { + if (card.name == "bingliang" || card.name == "lebu") return false; + }, + }, + }, + siji: { + trigger: { player: "phaseDiscardEnd" }, + frequent: true, + filter(event, player) { + if (event.cards) { + for (var i = 0; i < event.cards.length; i++) { + if (event.cards[i].name == "sha") return true; + } + } + return false; + }, + content() { + var num = 0; + for (var i = 0; i < trigger.cards.length; i++) { + if (trigger.cards[i].name == "sha") num++; + } + player.draw(2 * num); + }, + }, + ciqiu: { + trigger: { source: "damageBegin1" }, + forced: true, + filter(event) { + return event.card && event.card.name == "sha" && event.player.isHealthy(); + }, + content() { + "step 0"; + trigger.num++; + if (trigger.num >= trigger.player.hp) { + trigger.player.addTempSkill("ciqiu_dying"); + player.removeSkill("ciqiu"); + } + }, + ai: { + effect: { + player(card, player, target) { + if (card.name == "sha" && target.isHealthy() && get.attitude(player, target) > 0) { + return [1, -2]; + } + }, + }, + }, + }, + ciqiu_dying: { + trigger: { player: "dyingBegin" }, + forced: true, + silent: true, + firstDo: true, + content() { + player.die(); + }, + popup: false, + }, + juedao: { + enable: "phaseUse", + filter(event, player) { + return player.isLinked() == false; + }, + filterCard: true, + check(card) { + return 6 - get.value(card); + }, + content() { + if (player.isLinked() == false) player.link(); + }, + ai: { + link: true, + order: 2, + result: { + player(player) { + if (player.isLinked()) return 0; + return 1; + }, + }, + effect: { + target(card, player, target) { + if (card.name == "tiesuo") { + if (target.isLinked()) { + return [0, -0.5]; + } else { + return [0, 0.5]; + } + } + }, + }, + }, + mod: { + globalFrom(from, to, distance) { + if (from.isLinked()) return distance + 1; + }, + globalTo(from, to, distance) { + if (to.isLinked()) return distance + 1; + }, + }, + }, + geju: { + trigger: { player: "phaseBegin" }, + frequent: true, + filter(event, player) { + var list = []; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (player != players[i]) list.add(players[i].group); + } + list.remove("unknown"); + for (var i = 0; i < players.length; i++) { + if (players[i] != player) { + if (lib.filter.targetInRange({ name: "sha" }, players[i], player)) { + list.remove(players[i].group); + } + } + } + return list.length > 0; + }, + content() { + var list = []; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (player != players[i]) list.add(players[i].group); + } + list.remove("unknown"); + for (var i = 0; i < players.length; i++) { + if (players[i] != player) { + if (lib.filter.targetInRange({ name: "sha" }, players[i], player)) { + list.remove(players[i].group); + } + } + } + if (list.length > 0) player.draw(list.length); + }, + }, + diyqiangxi: { + enable: "phaseUse", + usable: 1, + filterCard(card) { + return get.subtype(card) == "equip1"; + }, + selectCard: [0, 1], + filterTarget(card, player, target) { + if (player == target) return false; + return get.distance(player, target, "attack") <= 1; + }, + content() { + "step 0"; + if (cards.length == 0) { + player.loseHp(); + } + "step 1"; + target.damage(); + "step 2"; + if (target.isAlive() && target.countCards("he")) { + player.discardPlayerCard(target); + } + }, + check(card) { + return 10 - get.value(card); + }, + position: "he", + ai: { + order: 8, + result: { + player(player, target) { + if (ui.selected.cards.length) return 0; + if (player.hp >= target.hp) return -0.9; + if (player.hp <= 2) return -10; + return -2; + }, + target(player, target) { + if (player.hp <= 1) return 0; + return get.damageEffect(target, player); + }, + }, + }, + threaten: 1.3, + }, + nsdingzhou: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("hej") > 0; + }, + content() { + "step 0"; + var cards = target.getCards("hej"); + if (get.isLuckyStar(player)) { + var cardx = ui.cardPile.firstChild; + if (cardx) { + var color = get.color(card), + cardsx = cards.filter(function (i) { + return get.color(i) == color; + }); + if (cardsx.length > 0) cards = cardsx; + } + } + var card = cards.randomGet(); + event.card = card; + player.gain(card, target, "giveAuto", "bySelf"); + player.draw(); + "step 1"; + if (Array.isArray(result) && get.color(card) != get.color(result[0])) player.loseHp(); + }, + ai: { + order: 7, + result: { target: -1 }, + }, + }, + //比原版更令人难以吐槽的神孙权 + junkyuheng: { + audio: "yuheng", + trigger: { player: "phaseBegin" }, + forced: true, + keepSkill: true, + filter(event, player) { + return player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "junkyuheng"); + }, "he"); + }, + content() { + "step 0"; + player + .chooseToDiscard("he", true, [1, 4], function (card, player) { + if (!ui.selected.cards.length) return true; + var suit = get.suit(card, player); + for (var i of ui.selected.cards) { + if (get.suit(i, player) == suit) return false; + } + return true; + }) + .set("complexCard", true) + .set("ai", function (card) { + if (!player.hasValueTarget(card)) return 5; + return 5 - get.value(card); + }); + "step 1"; + if (result.bool) { + var skills = lib.skill.junkyuheng.derivation.randomGets(result.cards.length); + player.addAdditionalSkills("junkyuheng", skills); + } + }, + group: "junkyuheng_remove", + derivation: ["olbingyi", "shenxing", "xiashu", "old_anxu", "rezhiheng", "xinanguo", "lanjiang", "xinfu_guanwei", "dimeng", "xindiaodu", "xingxue", "jiexun", "olhongyuan", "xinfu_youdi", "bizheng"], + subSkill: { + remove: { + audio: "yuheng", + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.additionalSkills.junkyuheng && player.additionalSkills.junkyuheng.length > 0; + }, + async content(event, trigger, player) { + const skillslength = player.additionalSkills.junkyuheng.length; + await player.removeAdditionalSkills("junkyuheng"); + await player.draw(skillslength); + }, + }, + }, + }, + junkdili: { + audio: "dili", + trigger: { player: "changeSkillsAfter" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "wood", + filter(event, player) { + if (!event.addSkill.length) return false; + var skills = player.getSkills(null, false, false).filter(function (i) { + var info = get.info(i); + return info && !info.charlotte; + }); + return skills.length > player.maxHp; + }, + content() { + "step 0"; + player.awakenSkill("junkdili"); + player.loseMaxHp(); + "step 1"; + var skills = player.getSkills(null, false, false).filter(function (i) { + if (i == "junkdili") return false; + var info = get.info(i); + return info && !info.charlotte; + }); + var list = []; + for (var skill of skills) { + list.push([skill, '"]); + } + var next = player.chooseButton(["请选择失去任意个技能", [list, "textbutton"]]); + next.set("forced", true); + next.set("selectButton", [1, skills.length]); + next.set("ai", function (button) { + var skill = button.link, + skills = _status.event.skills.slice(0); + skills.removeArray(["xinanguo", "lanjiang", "rezhiheng", "junkyuheng"]); + switch (ui.selected.buttons.length) { + case 0: + if (skills.includes(skill)) return 2; + if (skill == "junkyuheng") return 1; + return Math.random(); + case 1: + if (skills.length < 2) return 0; + if (skills.includes(skill)) return 2; + if (skill == "junkyuheng") return 1; + return 0; + case 2: + if (skills.includes(skill)) return 2; + if (skill == "junkyuheng") return 1; + return 0; + default: + return 0; + } + }); + next.set("skills", skills); + "step 2"; + if (result.bool) { + var skills = result.links; + player.removeSkills(skills.slice(0)); + } + var list = lib.skill.junkdili.derivation; + list = list.slice(0, Math.min(skills.length, list.length)); + player.addSkills(list); + }, + derivation: ["junkshengzhi", "junkquandao", "junkchigang"], + }, + junkshengzhi: { + audio: "dili_shengzhi", + trigger: { player: ["logSkill", "useSkillAfter"] }, + forced: true, + filter(event, player) { + if (event.type != "player") return false; + var skill = event.sourceSkill || event.skill; + if (get.is.locked(skill)) return false; + var info = get.info(skill); + return !info.charlotte; + }, + content() { + player.addTempSkill("junkshengzhi_effect"); + }, + subSkill: { + effect: { + mod: { + cardUsable: () => Infinity, + targetInRange: () => true, + }, + trigger: { player: "useCard1" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + content() { + if (trigger.addCount !== false) { + trigger.addCount = false; + player.getStat().card[trigger.card.name]--; + } + player.removeSkill("junkshengzhi_effect"); + }, + mark: true, + intro: { content: "使用下一张牌无距离和次数限制" }, + }, + }, + }, + junkquandao: { + audio: "dili_quandao", + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return event.card.name == "sha" || get.type(event.card, null, false) == "trick"; + }, + async content(event, trigger, player) { + const cards1 = player.getCards("h", card => get.name(card) === "sha"), + cards2 = player.getCards("h", card => get.type(card) === "trick"); + if (cards1.length !== cards2.length) { + const num = cards1.length - cards2.length, + cards = num > 0 ? cards1 : cards2; + let i = 0; + cards.forEach(card => { + if (i < Math.abs(num) && lib.filter.cardDiscardable(card, player, "junkquandao")) i++; + }); + if (i > 0) { + await player.chooseToDiscard(i, true, `权道:请弃置${get.cnNumber(i)}张${num > 0 ? "杀" : "普通锦囊牌"}`, num > 0 ? card => get.name(card) === "sha" : card => get.type(card) === "trick"); + } + } + await player.draw(); + }, + }, + junkchigang: { + audio: "dili_chigang", + trigger: { player: "phaseJudgeBefore" }, + forced: true, + zhuanhuanji: true, + mark: true, + marktext: "☯", + content() { + player.changeZhuanhuanji("junkchigang"); + trigger.cancel(); + var next = player[player.storage.junkchigang ? "phaseDraw" : "phaseUse"](); + event.next.remove(next); + trigger.getParent().next.push(next); + }, + ai: { + effect: { + target(card, player, target) { + if (get.type(card) == "delay") return "zerotarget"; + }, + }, + }, + intro: { + content(storage) { + return "转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的" + (storage ? "出牌阶段" : "摸牌阶段") + "。"; + }, + }, + }, + nsmanzhi: { + audio: "dcmanzhi", + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + direct: true, + filter(event, player) { + var nums = []; + game.countPlayer(current => { + nums.add(current.hp); + nums.add(current.maxHp); + nums.add(current.countCards("h")); + nums.add(current.countCards("e")); + nums.add(current.countCards("j")); + }); + for (var a of nums) { + for (var b of nums) { + if (0.5 * a * a + 2.5 * b - game.roundNumber == game.countPlayer()) return true; + } + } + return false; + }, + content() { + "step 0"; + var nums = []; + game.countPlayer(current => { + nums.add(current.hp); + nums.add(current.maxHp); + nums.add(current.countCards("h")); + nums.add(current.countCards("e")); + nums.add(current.countCards("j")); + }); + nums.sort((a, b) => a - b); + var a = null, + b = null, + goon = false; + for (a of nums) { + for (b of nums) { + if (0.5 * a * a + 2.5 * b - game.roundNumber == game.countPlayer()) { + goon = true; + break; + } + } + if (goon) break; + } + player + .chooseButton(2, [ + "蛮智:请选择让下列等式成立的A与B的值", + '
    目标等式
    ', + `0.5 × A2 + 2.5 × B - ${game.roundNumber} = ${game.countPlayer()}`, + '
    A的可选值
    ', + [ + nums.map(i => { + return [`A|${i}`, i == a ? `${i}` : i]; + }), + "tdnodes", + ], + '
    B的可选值
    ', + [ + nums.map(i => { + return [`B|${i}`, i == b ? `${i}` : i]; + }), + "tdnodes", + ], + ]) + .set("filterButton", function (button) { + if (!ui.selected.buttons.length) return true; + return button.link[0] != ui.selected.buttons[0].link[0]; + }) + .set("filterOk", function () { + if (ui.selected.buttons.length != 2) return false; + var a, b; + for (var i of ui.selected.buttons) { + if (i.link[0] == "A") a = parseInt(i.link.slice(2)); + else b = parseInt(i.link.slice(2)); + } + return 0.5 * a * a + 2.5 * b - game.roundNumber == game.countPlayer(); + }) + .set("choice", [a, b]) + .set("ai", button => { + var choice = _status.event.choice; + if (button.link == `A|${choice[0]}` || button.link == `B|${choice[1]}`) return 1; + return 0; + }); + "step 1"; + if (result.bool) { + var a, b; + for (var i of result.links) { + if (i[0] == "A") a = parseInt(i.slice(2)); + else b = parseInt(i.slice(2)); + } + equals = `0.5×${a}2+2.5×${b}-${game.roundNumber}=${game.countPlayer()}`; + player.logSkill("nsmanzhi"); + player.chat(equals); + game.log(player, "的计算结果为", equals); + player.draw(game.countPlayer()); + } + }, + }, +}; + +export default skills; diff --git a/character/diy/sort.js b/character/diy/sort.js new file mode 100644 index 000000000..76b1b3faa --- /dev/null +++ b/character/diy/sort.js @@ -0,0 +1,26 @@ +const characterSort = { + diy_yijiang: ["key_kud", "key_misuzu", "key_kamome", "key_nao", "ns_huangchengyan", "ns_sunchensunjun", "ns_yuanxi", "ns_caoshuang"], + diy_yijiang2: ["key_yuuki", "key_tenzen", "key_kyouko", "key_kotarou", "key_kyou", "ns_chentai", "ns_huangwudie", "ns_sunyi", "ns_zhangning", "ns_yanghu"], + diy_yijiang3: ["ns_ruanji", "ns_zanghong", "ns_limi", "ns_zhonglimu", "prp_zhugeliang", "key_seira", "key_kiyu", "key_tomoyo", "key_minagi", "key_michiru"], + diy_tieba: ["ns_zuoci", "ns_lvzhi", "ns_wangyun", "ns_nanhua", "ns_nanhua_left", "ns_nanhua_right", "ns_huamulan", "ns_huangzu", "ns_jinke", "ns_yanliang", "ns_wenchou", "ns_caocao", "ns_caocaosp", "ns_zhugeliang", "ns_wangyue", "ns_yuji", "ns_xinxianying", "ns_guanlu", "ns_simazhao", "ns_sunjian", "ns_duangui", "ns_zhangbao", "ns_masu", "ns_zhangxiu", "ns_lvmeng", "ns_shenpei", "ns_yujisp", "ns_yangyi", "ns_liuzhang", "ns_xinnanhua", "ns_luyusheng"], + diy_fakenews: ["diy_wenyang", "ns_zhangwei", "ns_caimao", "ns_chengpu", "ns_sundeng", "ns_duji", "ns_mengyou"], + diy_xushi: ["diy_feishi", "diy_hanlong", "diy_liufu", "diy_liuyan", "diy_liuzan", "diy_tianyu", "diy_xizhenxihong", "diy_yangyi", "diy_zaozhirenjun"], + diy_default: ["diy_yuji", "diy_caiwenji", "diy_lukang", "diy_zhenji", "old_majun"], + diy_noname: ["noname"], + diy_trashbin: ["junk_guanyu", "junk_zhangjiao", "old_jiakui", "ol_guohuai", "junk_zhangrang", "old_bulianshi", "ol_maliang", "junk_liubei", "junk_huangyueying", "junk_lidian", "junk_duanwei", "junk_xuyou"], +}; + +const characterSortTranslate = { + diy_tieba: "吧友设计", + diy_xushi: "玩点论杀·虚实篇", + diy_default: "常规", + diy_noname: "无名专属", + diy_key: "论外", + diy_yijiang: "设计比赛2020", + diy_yijiang2: "设计比赛2021", + diy_yijiang3: "设计比赛2022", + diy_fakenews: "杀海流言", + diy_trashbin: "垃圾桶", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/diy/translate.js b/character/diy/translate.js new file mode 100644 index 000000000..bdcef0e4a --- /dev/null +++ b/character/diy/translate.js @@ -0,0 +1,570 @@ +const translates = { + diy_liufu: "刘馥", + diy_xizhenxihong: "习珍习宏", + diy_liuzan: "留赞", + diy_zaozhirenjun: "枣祗任峻", + diy_yangyi: "杨仪", + diy_tianyu: "田豫", + + // diy_caocao:'曹操', + diy_menghuo: "孟获", + diy_huangzhong: "黄汉升", + diy_xuhuang: "徐公明", + diy_dianwei: "新典韦", + diy_weiyan: "魏文长", + xicai: "惜才", + diyjianxiong: "奸雄", + diy_feishi: "费诗", + nsshuaiyan: "率言", + moshou: "墨守", + diy_hanlong: "韩龙", + diy_luxun: "陆伯言", + diy_yuji: "于吉", + diy_zhouyu: "周公瑾", + diy_lukang: "陆抗", + diy_caiwenji: "蔡昭姬", + diy_zhenji: "甄宓", + + ns_zuoci: "左慈", + ns_wangyun: "王允", + ns_lvzhi: "吕后", + ns_nanhua: "南华", + ns_nanhua_left: "幻身·左", + ns_nanhua_right: "幻身·右", + ns_huamulan: "SP花木兰", + ns_huamulan_prefix: "SP", + ns_huangzu: "黄祖", + ns_yanliang: "颜良", + ns_wenchou: "文丑", + ns_jinke: "荆轲", + + ns_caocao: "曹操", + ns_zhugeliang: "诸葛亮", + ns_wangyue: "王越", + ns_yuji: "于吉", + ns_caocaosp: "SP曹操", + ns_caocaosp_prefix: "SP", + ns_xinxianying: "辛宪英", + ns_sunjian: "孙坚", + ns_simazhao: "司马昭", + ns_guanlu: "管辂", + + ns_duangui: "段珪", + ns_shenpei: "审配", + ns_zhangbao: "张宝", + ns_masu: "马谡", + ns_zhangxiu: "张绣", + ns_lvmeng: "吕蒙", + + ns_yujisp: "于吉", + ns_lisu: "李肃", + ns_yangyi: "杨仪", + ns_liuzhang: "刘璋", + ns_xinnanhua: "南华老仙", + ns_luyusheng: "陆郁生", + + key_kud: "库特莉亚芙卡", + kud_qiaoshou: "巧手", + kud_qiaoshou_equip: "巧手", + kud_qiaoshou_end: "巧手", + kud_qiaoshou_backup: "巧手", + kud_qiaoshou_info: "出牌阶段/结束阶段,若你没有“巧”,则你可以将一张手牌作为“巧”置于武将牌上并摸一张牌,且视为装备了一张你选择的武器牌或进攻坐骑/防具牌或防御坐骑直到“巧”进入弃牌堆。出牌阶段结束时/准备阶段开始时,你将“巧”置入弃牌堆。", + kud_buhui: "不悔", + kud_buhui_info: "限定技,当你进入濒死状态时,你可以弃置“巧”和装备区内的所有牌(至少一张)并摸等量的牌,将体力回复至2点,获得技能〖重振〗。", + key_misuzu: "神尾观铃", + misuzu_hengzhou: "恒咒", + misuzu_hengzhou_info: "锁定技,准备阶段开始时,或当你受到1点伤害或回复1点体力后,你获得一个“诅咒”标记。你的手牌上限和摸牌阶段的额定摸牌数+X。结束阶段开始时,若X大于3,则你移去所有“诅咒”标记并失去1点体力。(X为“诅咒”标记数)", + misuzu_nongyin: "浓饮", + misuzu_nongyin_info: "当你需要使用【桃】时,你可将一张红色非锦囊牌当做【乐不思蜀】置入自己的判定区,然后视为使用一张【桃】。", + misuzu_zhongxing: "终幸", + misuzu_zhongxing_info: "每回合限一次,当你判定区的牌移动到其他区域后,你可令一名角色回复1点体力或摸两张牌。", + key_kamome: "久岛鸥", + kamome_yangfan: "扬帆", + kamome_yangfan_info: "锁定技,游戏开始时,你将一张【旅行箱】置入你的装备区。当你失去装备区内的一张牌后,你摸两张牌。", + kamome_huanmeng: "幻梦", + kamome_huanmeng_info: "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)", + kamome_jieban: "结伴", + kamome_jieban_info: "转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。", + kamome_suitcase: "旅行箱", + kamome_suitcase_info: "锁定技,你跳过你的判定阶段和弃牌阶段;当你即将翻面时,取消之。", + key_nao: "友利奈绪", + nao_duyin: "独隐", + nao_duyin2: "独隐", + nao_duyin_info: "一名其他角色的回合开始时,若你本局游戏内未对其发动过〖独隐〗,则你可以弃置一张牌或将武将牌翻面。若如此做,你不能成为其使用牌的目标,且对其使用牌没有距离限制且不计入使用次数直到你的下回合结束。", + nao_wanxin: "挽心", + nao_wanxin_info: "一名角色的回合结束时,你可以令一名本回合内受到过伤害的角色摸两张牌,然后你与其将武将牌重置。", + nao_shouqing: "守情", + nao_shouqing2: "守情", + nao_shouqing3: "守情", + nao_shouqing_info: "其他角色的出牌阶段内可以对你使用【桃】。若如此做,其摸一张牌且本局游戏内的手牌上限+1。", + key_yuuki: "冰室忧希", + yuuki_yicha: "异插", + yuuki_yicha_info: "出牌阶段开始时,你可依次进行两次判定并将判定牌依次置入两行三列方阵的两个随机位置中。然后你依次进行四次判定,每次可将当前判定牌置入空方格,且须与相邻方格的牌颜色均不同。若如此做,你令一名角色获得方阵内的所有牌。", + key_kyouko: "伊座并杏子", + kyouko_rongzhu: "容助", + kyouko_rongzhu_info: "其他角色不因此技能而得到你的牌后,你可摸一张牌,然后交给其一张牌。若其是当前回合角色,则其本回合使用【杀】的次数上限+1;若你是当前回合角色,则你本回合的手牌上限+1。", + kyouko_gongmian: "共勉", + kyouko_gongmian_use: "共勉", + kyouko_gongmian_exchange: "共勉", + kyouko_gongmian_info: "①出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。②出牌阶段结束时,你可以获得一名其他角色区域内的至多X张牌,然后交给其等量的牌。③弃牌阶段开始时,若X不小于你的体力值,你可以获得一名手牌数少于你的角色的所有手牌,然后将手牌数的一半(向上取整)交给该角色。(X为你本回合内发动过〖共勉①〗的次数)", + key_tenzen: "加纳天善", + tenzen_yixing: "弈兴", + tenzen_yixing_info: "当有角色因【杀】或【决斗】而受到伤害后,若其在你的攻击范围内或你在伤害来源的攻击范围内,你可以摸一张牌,然后将一张牌置于武将牌上,称为“兴”。当你成为其他角色使用【杀】或普通锦囊牌的唯一目标后,你可以获得一张“兴”,并可于此牌结算完成后弃置两张牌,视为对其使用一张名称相同的牌。", + //若对方为水织静久则无法触发〖弈兴〗 + tenzen_lingyu: "领域", + tenzen_lingyu_info: "觉醒技,准备阶段,若你的“兴”不小于你的体力值,则你减1点体力上限并获得技能〖天全〗。若你以此法失去了体力,则你摸两张牌。", + tenzen_tianquan: "天全", + tenzen_tianquan_info: "每回合限一次,当你使用【杀】或【决斗】指定唯一目标后,你可以移去两张“兴”并亮出牌堆顶的五张牌。这些牌中每有一张基本牌,响应此牌需要的【闪】/【杀】的数量便+1。此牌结算完成后,若此牌造成过伤害,则你获得这些牌中的非基本牌。", + key_kotarou: "天王寺瑚太朗", + kotarou_aurora: "丝刃", + kotarou_aurora_info: "锁定技,当扣减体力或增加体力上限后,若你的装备区内:有武器牌,你视为使用一张【杀】;没有武器牌,你使用牌堆中的一张不为赠物的武器牌。", + kotarou_rewrite: "改写", + kotarou_rewrite_damage: "改写", + kotarou_rewrite_recover: "改写", + kotarou_rewrite_sha: "改写", + kotarou_rewrite_block: "改写", + kotarou_rewrite_info: "出牌阶段,你可选择:①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌;②移动场上的一张牌;③增加1点体力上限并失去1点体力(体力上限至多为5);④下一次造成的伤害+1;⑤下一次回复的体力值+1;⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次,则你令此技能失效,且于回合结束后将体力上限降至3点,失去〖丝刃〗和〖改写〗。", + key_kyou: "藤林杏", + kyou_zhidian: "掷典", + kyou_zhidian_info: "你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。", + kyou_duanfa: "断发", + kyou_duanfa_info: "限定技,当你受到伤害时,若伤害值不小于你的体力值,则你可弃置所有手牌,防止此伤害并回复1点体力;且当你于你的下回合开始前成为【杀】或伤害性锦囊牌的目标后,你摸一张牌。", + key_seira: "樱庭星罗", + seira_xinghui: "星辉", + seira_xinghui_info: "准备阶段,你可以投掷一枚骰子,观看牌堆顶的X张牌(X为投掷点数)并以任意顺序扣置于一名没有“星屑”的角色的武将牌上,称为“星屑”。有“星屑”的角色造成的伤害+1,且当其从牌堆顶摸牌或取得判定牌时,改为从“星屑”中获取。", + seira_yuanying: "缘映", + seira_yuanying_info: "出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。", + seira_yinyuan: "姻缘", + seira_yinyuan_info: "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。", + key_kiyu: "露娜Q", + kiyu_yuling: "玉灵", + kiyu_yuling_info: "锁定技。你不是有距离限制的锦囊牌的合法目标;你成为【杀】的目标后,使用者需弃置X张牌(X为其至你的距离)。", + kiyu_xianyu: "先预", + kiyu_xianyu_info: "每轮限一次。一名角色的出牌阶段开始时,你可观看其手牌并预测其使用这些牌的顺序。此出牌阶段结束时,你摸X张牌,且其本回合的手牌上限+X(X为你的预测与其实际使用顺序的吻合数且至多为3)。", + kiyu_rexianyu: "先预", + kiyu_rexianyu_info: "每轮限一次。出牌阶段结束时,你可以选择一名其他角色。该角色于下个出牌阶段内使用第X张牌时,其可以将一张牌当做你本阶段内使用的第X张基本牌或普通锦囊牌使用(X至多为3);若如此做,你摸一张牌,且其本回合的手牌上限+1。", + key_tomoyo: "坂上智代", + tomoyo_wuwei: "武威", + tomoyo_wuwei_info: "①每回合每种花色限一次。你可以将一张手牌当做【杀】使用或打出。②当有角色使用【闪】后,若你在其攻击范围内,你可以对其使用一张【杀】(无距离限制)。", + tomoyo_zhengfeng: "整风", + tomoyo_zhengfeng_info: "使命技。①准备阶段,你可以令攻击范围内的一名角色进行判定。若如此做,你获得如下效果直到下回合开始:你视为在该角色的攻击范围内,且当该角色使用与判定牌颜色相同的牌时,你摸一张牌。②失败:结束阶段,若你于本回合内未发动过〖整风①〗,则你可以减1点体力上限。你失去〖武威〗,摸两张牌并回复1点体力,然后获得〖长誓〗。", + tomoyo_changshi: "长誓", + tomoyo_changshi_info: "锁定技。一名攻击范围内包含你的角色回复体力后,你获得1点护甲;一名攻击范围内包含你的角色一次性获得至少两张牌后,你摸一张牌。", + key_minagi: "远野美凪", + minagi_peiquan: "配券", + minagi_peiquan_info: "锁定技。①游戏开始时,你将你所有的手牌记录为“米券”。②出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。", + minagi_huanliu: "幻流", + minagi_huanliu_info: "准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”。", + key_michiru: "远野小满", + michiru_sheyuan: "舍愿", + michiru_sheyuan_info: "每轮限一次。若你没有“米券”,则你可以将所有手牌当做任意基本牌或普通锦囊牌使用,然后摸等量的牌。", + minagi_tag: "米券", + + noname: "小无", + noname_zhuyuan: "祝愿", + noname_zhuyuan_info: "①每回合每名角色限一次。出牌阶段,你可以将四张花色各不相同的牌交给一名其他角色。你与其获得技能〖铁骑〗和〖激昂〗至各自的回合结束。②锁定技,若你于当前回合内:未发动过〖祝愿〗,则你使用牌无次数限制;发动过〖祝愿〗,则你使用牌无距离限制。", + noname_duocai: "多彩", + noname_duocai_info: "每回合限一次。其他角色区域内的牌因弃置而进入弃牌堆后,你可以获得之。若你以此法得到的牌数:大于2,你弃置一名角色区域内的一张牌;等于2,你摸一张牌;小于2,你回复1点体力。", + ns_huangchengyan: "黄承彦", + nslongyue: "龙岳", + nslongyue_info: "当一名角色使用锦囊牌时,若此牌是其本回合内使用的第一张牌,则你可令其摸一张牌。", + nszhenyin: "阵引", + nszhenyin_info: "每回合限一次。一名角色的判定牌生效前,你可令当前回合角色打出一张手牌代替之。", + ns_sunchensunjun: "孙綝孙峻", + nsxianhai: "险害", + nsxianhai_info: "每轮限一次,当一名其他角色于回合内造成伤害后,若其此回合内造成过的伤害总和大于你上一回合内造成的伤害总和,则你可以减1点体力上限,令其废除一种装备栏并弃置手牌中所有的【闪】。若〖兴黜〗已发动,此回合结束后视为该限定技未发动过。", + nsxingchu: "兴黜", + nsxingchu_info: "限定技,当你杀死一名角色/你死亡时,你可以令一名角色获得其/你的所有牌并增加1点体力上限。", + ns_yuanxi: "袁熙", + nsshengyan: "盛筵", + nsshengyan3: "盛筵", + nsshengyan_info: "锁定技,你的判定牌生效后,若结果花色与你本回合内其他判定结果的花色均不同,则你令当前回合角色本回合的手牌上限+2。", + nsdaizhan: "怠战", + nsdaizhany: "怠战", + nsdaizhan_info: "准备阶段,你可以将一张非锦囊牌当做【兵粮寸断】或【乐不思蜀】对自己使用。若如此做,回合结束时,你将手牌摸至手牌上限。", + ns_caoshuang: "曹爽", + nsjiquan: "集权", + nsjiquan_mark: "集权", + nsjiquan_info: "与你距离1以内的其他角色造成或受到伤害后,你可以将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。", + nsfuwei: "附位", + nsfuwei_info: "觉醒技,结束阶段开始时,若“威”数大于4,则你加2点体力上限,获得〖喋谋〗和〖制皇〗,并将〖集权〗改为锁定技。", + nsdiemou: "喋谋", + nsdiemou_info: "锁定技,出牌阶段开始时,若“威”大于全场角色数,你移去所有“威”,减1点体力上限并摸X张牌。若X大于4,你翻面。(X为移去的“威”数)", + nszhihuang: "制皇", + nszhihuang_damage: "制皇", + nszhihuang_info: "每回合限一次,当主公使用牌时,你可以移去一张“威”,然后获得此牌。锁定技,若你的手牌数大于主公,则你使用牌造成的伤害+1。", + ns_chentai: "陈泰", + nsweiyuan: "围援", + nsweiyuan_use: "围援", + nsweiyuan_use_backup: "围援", + nsweiyuan_info: "出牌阶段限一次,当你使用牌指定其他角色A为唯一目标后,你可以令一名除该角色外的其他角色B选择一项:①交给A一张牌:然后你对B造成1点伤害;②你摸一张牌,且可以将一张手牌当做本回合使用过的一张基本牌/普通锦囊牌使用(无次数距离限制)。", + nsjuxian: "据险", + nsjuxian2: "据险", + nsjuxian_info: "当你受到伤害时,你可以摸两张并跳过下一个摸牌阶段,且在此之前不能再次发动〖据险〗。然后若你的手牌数不小于体力上限,则伤害来源弃置一张牌。", + ns_huangwudie: "黄舞蝶", + nsdiewu: "蝶舞", + nsdiewu_info: "当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】或【闪】。当你以此法使用【杀】造成伤害后,则你摸一张牌。", + nslingying: "灵影", + nslingying_info: "锁定技,你使用【杀】无距离限制,且你使用【杀】的次数上限+1。", + nspojian: "破茧", + nspojian_info: '觉醒技,准备阶段,若你的"蝶舞"标记的数量不小于你的体力值,则你减1点体力上限并摸两张牌,删除〖蝶舞〗中使用【闪】的部分并获得技能〖烈弓〗。', + ns_sunyi: "孙翊", + nsguolie: "果烈", + nsguolie2: "果烈", + nsguolie_info: "摸牌阶段开始前,你可跳过此阶段。若如此做,你的红色牌均视为【杀】,黑色牌均视为【过河拆桥】且均无视距离与次数直到回合结束,且结束阶段,你获得本回合从你以外的区域内进入弃牌堆的所有牌。", + ns_zhangning: "张宁", + nsfuzhou: "符咒", + nsfuzhou_card: "符咒", + nsfuzhou_card_info: "此牌不可被【无懈可击】响应。若判定结果为:黑色,你受到使用者造成的1点雷属性伤害且弃置一张牌;红色,使用者摸两张牌,且你本回合的手牌上限-1。", + nsfuzhou_num: "符咒", + nsfuzhou_info: "出牌阶段限一次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限减1。", + nsguidao: "鬼道", + nsguidao_info: "一名角色的判定牌生效前,你可以打出一张黑色牌替换之。", + nstaiping: "太平", + nstaiping_info: "觉醒技。准备阶段,若你:已因〖符咒〗造成了两次或更多的伤害,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·邪〗;若你已因〖符咒〗摸了两次或更多的牌,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·正〗。", + nsfuzhou_damage: "符咒·邪", + nsfuzhou_damage_info: "出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限-1。", + nsfuzhou_draw: "符咒·正", + nsfuzhou_draw_info: "出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。", + ns_yanghu: "羊祜", + nsbizhao: "避召", + nsbizhao2: "避召", + nsbizhao_info: "隐匿技,锁定技,当你于回合外明置此武将牌后,其他角色计算与你的距离+1直至你的回合开始。", + nsqingde: "清德", + nsqingde_info: "每回合限一次,当你使用【杀】或普通锦囊牌对其他角色造成伤害后,你可使用该牌与受到伤害的角色拼点。你可令输的角色摸两张牌;当你受到其他角色使用【杀】或普通锦囊牌造成的伤害后,可使用该牌与伤害来源拼点。你可令赢的角色回复1点体力。", + nsyidi: "遗敌", + nsyidi_info: "出牌阶段限一次,你可展示一张手牌,然后将其交给一名其他角色。若为基本牌,该角色可使用此牌;若不为基本牌,你摸一张牌。", + + diy_wenyang: "文鸯", + ns_zhangwei: "张葳", + nshuaishuang: "怀霜", + nshuaishuang_info: "锁定技,结束阶段,你从牌堆/弃牌堆获得一张【桃】,然后失去1点体力。", + nsfengli: "奉礼", + nsfengli2: "奉礼", + nsfengli_draw: "奉礼", + nsfengli_clear: "奉礼", + nsfengli_use: "奉礼", + visible_nsfengli: "奉礼", + nsfengli_info: "回合结束时,你可以选择一名其他角色并展示所有手牌直到你的下回合开始。当该角色于回合外需要使用或打出牌时,其可暗置你的一张明置手牌,然后视为使用或打出之。当你的明置手牌减少时,你可令一名手牌数小于你的角色摸一张牌。", + nsqiyue: "骑钺", + nsqiyue_info: "锁定技,当有角色的武将牌状态改变后,你摸一张牌。", + nsxuezhu: "血逐", + nsxuezhu_info: "当你受到伤害或造成伤害后,你可以令受到伤害的角色摸两张牌并翻面。", + ns_chuanshu: "传术", + ns_chuanshu_info: "限定技 当一名其他角色进入濒死状态时,你可以令其选择获得技能〖雷击〗或〖鬼道〗,其回复体力至1并摸两张牌。当该被【传术】的角色造成或受到一次伤害后,你摸一张牌。其阵亡后,你重置技能〖传术〗。", + ns_xiandao1: "仙道", + ns_xiandao1_info: "锁定技 游戏开始和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段开始。", + ns_xiandao2: "仙道", + ns_xiandao2_info: "锁定技 你防止受到任何属性伤害。", + ns_xiandao: "仙道", + ns_xiandao_info: "锁定技 游戏开始、你进入游戏时和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段阶段开始。你防止受到任何属性伤害。", + ns_chuanshu2: "术", + ns_chuanshu2_info: "锁定技 当你造成或受到一次伤害后,南华老仙摸一张牌。", + ns_chuanshu3: "术", + ns_chuanshu3_info: "锁定技 当你【传术】的角色阵亡后,你重置技能〖传术〗。", + ns_xiuzheng: "修真", + ns_xiuzheng_info: "出牌阶段限一次,你可选择一名其他角色,然后亮出牌堆顶的两张牌,若同为红色,则其受到1点火焰伤害;若同为黑色,其受到1点雷电伤害;若颜色不相同,你弃置其一张牌。然后你获得这两张展示的牌后再弃置两张牌。", + nsanruo: "暗弱", + nsanruo_info: "锁定技,你手牌中的【杀】和普通锦囊牌(借刀杀人等带有指向目标的锦囊除外)均对你不可见。但你可以正常使用之。", + nsxunshan: "循善", + nsxunshan_info: "锁定技,你使用【暗弱】牌可以为其指定任意名合法目标(托管无效)。", + nskaicheng: "开城", + nskaicheng_info: "主公技,你的回合内,你可以将一张【暗弱】牌交给一名群势力其他角色观看,其可以选择是否告诉你此牌的名字。然后你选择一项:使用这张牌并摸一张牌;或结束此回合。", + nsjuanli: "狷戾", + nsjuanli_info: "出牌阶段限一次,你可以和一名有手牌的其他角色进行赌牌,若你赢,目标角色失去1点体力且该角色与你距离-1直到与你下次赌牌,若你没赢,目标角色回复1点体力,且该角色与你距离+1直到与你的下次赌牌。(赌牌:赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次亮出牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利)", + nsyuanchou: "远筹", + nsyuanchou_info: "锁定技,当你成为锦囊牌的目标时,若来源角色与你的距离大于1,则取消之。", + nsguhuo: "蛊惑", + nsguhuo_info: "锁定技,你在一个回合中使用前两张牌时,你对一名随机角色从牌堆(牌堆无则从弃牌堆)随机使用一张同类别卡牌。", + nsqinxue: "勤学", + nsqinxue_info: "每个效果每回合只能使用一次。①当你使用一张基本牌时,你从牌堆随机获得一张锦囊牌;②当你使用一张锦囊牌时,你从牌堆随机获得一张装备牌;③当你使用一张装备牌时,你从牌堆随机获得一张基本牌。", + nsbaiyi: "白衣", + nsbaiyi_info: "锁定技,若你本回合发动过勤学,你跳过弃牌阶段,改为弃置X张牌(X为本回合发动勤学次数);若你弃置了3张类别不同的牌,你获得一个额外回合(不可连续获得回合),否则你观看牌堆顶的X张牌并获得其中一张。", + nsbaiming: "百鸣", + nsbaiming_info: "当你使用【杀】时,你可以获得一项未获得过且与杀或伤害相关的技能,此【杀】结算完毕后,你失去以此法获得的技能。", + nsfuge: "覆戈", + nsfuge_info: "你的回合结束后,你可以执行一个额外的回合,此回合的摸牌阶段,你于摸牌阶段额外摸X张牌(X为你已损失的体力值);若如此做,直到洗牌前,你不能再发动此技能。", + nstanbing: "谈兵", + nstanbing_info: "摸牌阶段开始时,你可弃置一张手牌,然后摸X张牌(X为你弃置牌的名称字数),若如此做,本回合你不可使用或打出【杀】。", + nsxinzhan: "心战", + nsxinzhan_info: "出牌阶段限一次,你可将任意张手牌交给一名其他角色,若如此做,该角色失去X点体力(X为你交给其的牌张数的一半,向下取整),若你给的牌达到六张,则改为该角色失去1点体力上限。", + nsfuhuo: "符火", + nsfuhuo2: "符火", + nsfuhuo_info: "出牌阶段限一次,你可将一张手牌置于一名武将牌上没有“符”的角色的武将牌上,称为“符”,若如此做,其回合外使用或打出【闪】时,你可令其判定,若结果为:红桃,你对其造成2点火焰伤害;方块,你弃置其一张手牌,然后对其造成1点火焰伤害。你的下个回合开始时,你获得其武将牌上的“符”。", + nswangfeng: "望风", + nswangfeng_info: "在判定牌生效前,你可以打出一张红色牌替换之。", + nshunji: "混击", + nshunji_info: "出牌阶段限一次,你可以摸一张牌,视为使用一张【万箭齐发】。此【万箭齐发】造成伤害时,受伤害角色选择一项:①弃置你一张牌;②摸一张牌。", + nscuanquan: "篡权", + nscuanquan_info: "锁定技,如果你的身份为忠臣,则在受伤三次后与主公,互换身份和体力上限。", + nsjianning: "奸佞", + nsjianning_info: "出牌阶段限一次,如果你的身份为内奸,你可以与一名手牌数比你少的角色交换手牌,并对其造成1点伤害。", + nschangshi: "常仕", + nschangshi_info: "出牌阶段限一次,如果你的身份为反贼,你可以指定两名其他角色互换体力;如果两名角色体力之差等于1,你失去1点体力。", + nsbaquan: "霸权", + nsbaquan_info: "回合结束时,你可以弃置所有手牌,并获得相应点数的护甲,你的新一回合开始时清除所有护甲。", + nsbugua: "卜卦", + nsbugua_use_info: "弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数随机获得牌堆中相应的一张牌。", + nsbugua_info: "出牌阶段限一次,你可以弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数按以下规则随机获得牌堆中相应的一张牌:乾(红桃偶数):无中生有;坤(黑桃奇数):决斗;震(黑桃偶数):南蛮入侵;巽(红桃奇数):万箭齐发;坎(梅花偶数):过河拆桥、兑(梅花奇数):借刀杀人、艮(方片偶数):顺手牵羊、离(方片奇数):火攻。若牌堆中无此牌则摸一张牌,然后你观看未展示的另外五张牌并按任意顺序将其置于牌堆顶。", + nstuiyan: "推演", + nstuiyan_info: "出牌阶段,若你使用的牌点数比上一张使用的牌点数大,你可以摸一张牌,反之你本回合不能再以此法摸牌;当你使用的牌点数首次达到8的倍数时,你可以在结算后立即发动一次【卜卦】。", + nstianji: "天机", + nstianji_info: "限定技,当一名其他角色进入濒死状态,你可自减1点体力上限,令其回复体力至1并增加1点体力上限。", + nszhaoxin: "昭心", + nszhaoxin_info: "锁定技,你始终展示手牌。", + nsxiuxin: "修穆", + nsxiuxin_info: "锁定技,若你没有某种花色的手牌,你不能成为这种花色的牌的目标。", + nsshijun: "弑君", + nsshijun_info: "锁定技,你造成伤害时,你令此伤害+1,并在结算后失去1点体力。", + nshunyou: "魂佑", + nshunyou_info: "出牌阶段限一次,你可以弃置一张基本牌,获得弃牌堆底的一张装备牌和一张锦囊牌,然后你可以将那张装备牌装备给一名角色(允许替换)。如果弃牌堆没有装备以及锦囊牌,则改为摸X张牌,X为你已损失的体力值+1(最多3张)。", + nswulie: "武烈", + nswulie_info: "限定技,准备阶段,你可以失去1点体力上限,从弃牌堆选择最多三张牌以任意顺序放置于牌堆顶。若如此做,此回合的结束阶段,你可以重复此操作。", + nscangxi: "藏玺", + nscangxi2: "藏玺", + nscangxi_info: "主公技,其他吴势力角色的弃牌阶段结束时,若其弃置了至少两张牌,则可以选择判定,若是黑色,则其选择一项,1,令主公摸一张并且展示;2,主公手牌上限永久加一;3,额外弃置一张牌,令主公获得本回合进入弃牌堆的一张牌。", + nsdongcha: "洞察", + nsdongcha_info: "锁定技,单体锦囊牌无法对你造成伤害。其它角色于其回合内第二次使用锦囊牌指定你为目标时,取消之。", + nscaijian: "才鉴", + nscaijian_info: "出牌阶段限一次,若你的手牌数不大于你的体力上限,则你可以展示你的手牌,观看牌堆顶相同数量的牌并以任意方式交换之。", + nsgongjian: "恭俭", + nsgongjian_info: "锁定技,弃牌阶段,你须将弃牌交给一名体力值大于你的其它角色。", + nsjianxiong: "奸雄", + nsjianxiong_info: "当你成为一名角色牌的目标后你可以对该角色使用一张牌,若此牌对其造成伤害,则该角色的牌失效。若失效的为黑色牌,则你摸一张牌。", + nsxionglue: "雄略", + nsxionglue_info: "出牌阶段限一次,你可以弃置一张黑色手牌,然后发现一张锦囊牌。", + nsyaowang: "妖妄", + nsyaowang_info: "回合开始阶段你可以选择一名角色然后获得其其中一项技能直到回合结束,然后该角色随机获得一项未上场武将的其中一项技能直到其回合结束。", + nshuanhuo: "幻惑", + nshuanhuo_info: "每当你失去1点体力或受到一次大于2的伤害时,你可以交换除你之外的两名角色的武将牌(体力及体力上限不变)。", + nsjianshu: "剑术", + nsjianshu_info: "锁定技:每当你的装备区有武器时,你使用【杀】指定一个目标后,该角色需要依次使用两张【闪】才能抵消此【杀】。", + nscangjian: "藏剑", + nscangjian_info: "每当你对一名角色造成伤害,你可以获得其装备区一张牌。", + nsyunxing: "陨星", + nsyunxing_info: "锁定技,当场上一名角色死亡,若为蜀,你失去1点体力;若为吴,你回复1点体力;若为魏,你摸一张牌并弃置一名角色的手牌;若为群,你强制结束当前回合;若为你,你可以使一名角色翻面。", + nsguanxing: "观星", + nsguanxing_info: "锁定技,准备阶段,你观看牌堆的X张牌(X为场上存活人数)并且任意移动Y张牌(Y为你当前体力值)。", + nscaiyi: "猜疑", + nscaiyi_info: "其他角色摸牌后,你可以观看其摸到的牌,若其中有【杀】,则视为你对其使用一张【杀】,若其中没有【杀】,则视为其对你使用一张【杀】(计入出杀次数)。", + nsgefa: "割发", + nsgefa_info: "当你的体力值等于0或更低时,你可以将任意一张♣牌当【桃】使用。", + nshaoling: "号令", + nshaoling_info: "限定技,出牌阶段,你可以指定一名其他角色,令另外所有其他角色角色选择一项:1、对该角色使用一张【杀】;2、交给你一张牌,然后视为你对其使用一张【杀】。", + nspinmin: "拼命", + nspinmin_info: "锁定技,当你于回合内死亡时,你不死亡并增加1点体力上限(每回合最多增加1点且不能超过4);当你于回合外死亡时,你不死亡并减少1点体力上限(体力上限为0会导致你死亡)。", + nsshishou: "失手", + nsshishou_info: "锁定技,当你于回合内失去手牌时,你失去1点体力并摸一张牌;你回合内使用的牌数不能超过4。", + nsduijue: "对决", + nsduijue_info: "出牌阶段开始时,你可以弃置一张手牌,若如此做,此阶段你可以将一张与此牌颜色不同的手牌当作【决斗】使用(限2次)。", + nsshuangxiong: "双雄", + nsshuangxiong_info: "当你使用【决斗】或被使用【决斗】时,你可以将武将牌翻面。", + nsshuangxiong_append: "背面武将:文丑,2体力,你可以将一张牌当【杀】打出。", + nsguanyong: "冠勇", + nsguanyong_info: "你可以将一张手牌当【杀】打出。", + nsjihui: "急恚", + nsjihui_info: "锁定技,每当一名角色一次弃置了三张或更多的牌,你获得一个额外回合;你的额外回合内,你使用牌只能指定你与上一回合角色为目标。", + nsmouyun: "谋运", + nsmouyun_info: "每两轮限一次,你可以弃置场上体力值最少的一名其他角色区域内的X张牌。(X为其损失的体力值)", + nscongjun: "从军", + nscongjun_info: "锁定技,游戏开始时,你变身为一名随机男性角色;当一名敌方角色使用无懈可击时,你有小概率亮出此武将并变回花木兰,然后对该角色造成2点伤害。", + nshuanxian: "幻仙", + nshuanxian_info: "锁定技,游戏开始时,你获得随从“幻身·右”,当你首次受到伤害时,你获得随从“幻身·左”(体力上限2,初始手牌2);你与幻身在摸牌阶段均少摸一张牌;在你的回合中(如果有对应幻身),你以【幻身·左-本体-幻身·右】的顺序进行3个连续回合。", + nstaiping_nh: "太平", + nstaiping_nh_info: "当你受到1点伤害后(首次伤害除外),你可以选择一项: ①令一个“幻身”增加1点体力上限。②令一个“幻身”回复1点体力。", + nsshoudao: "授道", + nsshoudao_info: "当左右“幻身”全部死亡时,你获得技能“雷击”和“鬼道”。当你死亡时,若此时有两个“幻身”,你可以令一名其他角色获得技能“雷击”和“鬼道”。若有一个“幻身”,你可以令一名其他角色获得技能“雷击”或“鬼道”。(杀死你的角色除外)", + nsnongquan: "弄权", + nsnongquan_info: "出牌阶段,你可以将最后一张手牌当作【无中生有】使用。", + nsdufu: "毒妇", + nsdufu_info: "每当你即将造成一次伤害时,你可以为此伤害重新指定伤害来源。", + yiesheng: "回雪", + yiesheng_info: "出牌阶段,你可以弃置任意数量的黑色手牌,然后摸等量的牌。", + liangji: "环计", + liangji_info: "出牌阶段限一次,你可以选择一名未以此法放置牌的其他角色并将一张手牌置于其武将牌上。目标角色于摸牌阶段开始时,获得此牌。若其为男性角色,则获得技能〖无双〗,若其为女性角色,则获得技能〖离间〗,直到回合结束。", + chengmou: "逞谋", + chengmou_info: "摸牌阶段开始时,若你有“功”牌,你获得之并跳过摸牌阶段,若你所获得的“功”牌多于两张,你须失去1点体力。", + jugong: "居功", + jugong_info: "回合外每名角色的回合限一次,每当场上有角色因受到【杀】或【决斗】造成的伤害,你可以摸一张牌并且将一张手牌置于你的武将牌上,称之为“功”。在你即将受到伤害时,你可以弃置两张“功”,防止此伤害。", + nsxinsheng: "新生", + nsxinsheng_info: "每当你对其他角色造成伤害后,若你未受伤,则你可以增加X点体力上限并摸X张牌,X为伤害点数。", + nsdunxing: "遁形", + nsdunxing_info: "每当你即将受到其他角色造成的伤害时,若你已受伤,则你可以防止此伤害,改为失去X点体力上限并摸X张牌,X为伤害点数。", + liangce: "粮策", + liangce_info: "①出牌阶段限一次,你可以将一张基本牌当【五谷丰登】使用。②当因执行【五谷丰登】的效果而亮出的牌因效果执行完毕而置入弃牌堆后,你可以选择一名角色,令该角色获取之。", + jianbi: "坚壁", + jianbi_info: "当你成为锦囊牌的目标时,若此牌的目标包括其他角色,你可以令此牌对1个目标无效。", + diyjuntun: "军屯", + diyjuntun_info: "出牌阶段,你可以重铸装备牌。", + choudu: "筹度", + choudu_info: "出牌阶段限一次,你可以弃置一张牌,并指定一名角色视为其使用一张调兵遣将。", + liduan: "立断", + liduan_info: "当一名其他角色于其回合外得到牌后,若其此次得到的牌数为1且为装备牌(无论是否可见),你可以令该角色选择一项:1.使用此牌;2.将一张手牌交给你。", + fuchou: "负仇", + fuchou2: "负仇", + fuchou_info: "当你成为【杀】的目标时,你可以将一张牌交给此【杀】的使用者,令此【杀】对你无效且你到其的距离于当前回合内视为1,若如此做,此回合的结束阶段开始时,其令你摸一张牌,然后你需对其使用【杀】,否则失去1点体力。", + jinyan: "噤言", + jinyan_info: "锁定技。若你的体力值不大于2,你的黑色锦囊牌视为【杀】。", + chezhen: "车阵", + chezhen_info: "锁定技。若你的装备区里:没有牌,你的防御距离+1;有牌,你的进攻距离+1。", + youzhan: "诱战", + youzhan_info: "当以你距离不大于1的角色为目标的【杀】的使用结算开始时,你可以弃置一张装备牌,令该角色视为使用【诱敌深入】。", + kangyin: "亢音", + kangyin2: "亢音", + kangyin_info: "出牌阶段限一次,你可以失去1点体力并选择一名其他角色,弃置该角色的一张牌。若此牌:为基本牌,你可以令一至X名角色各摸一张牌;不为基本牌,于此回合内:你的进攻距离+X,且你使用【杀】的额外目标数上限+X。(X为你已损失的体力值)", + zhucheng: "筑城", + zhucheng2: "筑城", + zhucheng_info: "①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此杀的使用者弃置X张牌(X为“筑”的数量),否则杀对你无效。", + duoqi: "夺气", + duoqi_info: "当一名角色于除你之外的角色的出牌阶段内因弃置而失去牌后,你可以移去一张“筑”,并结束此出牌阶段。", + + siji: "伺机", + ciqiu: "刺酋", + ciqiu_dying: "刺酋", + diy_liuyan: "刘焉", + juedao: "绝道", + geju: "割据", + shaoying: "烧营", + zonghuo: "纵火", + diychanyuan: "缠怨", + diyguhuo: "蛊惑", + jieyan: "劫焰", + honglian: "红莲", + xiongzi: "雄姿", + luweiyan: "围堰", + guihan: "归汉", + diyduanliang: "断粮", + diyduanliang1: "断粮", + diyduanliang2: "断粮", + diyqiangxi: "强袭", + diykuanggu: "狂骨", + diyzaiqi: "再起", + batu: "霸图", + zaiqix: "再起", + diy_jiaoxia: "皎霞", + yaliang: "雅量", + yaliang_info: "每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。", + diy_jiaoxia_info: "每当你成为红色牌的目标,你可以摸一张牌。", + zaiqix_info: "摸牌阶段,若你已受伤,你可以改为亮出牌堆顶的X+1张牌,X为你已损失的体力值,其中每有一张♥牌,你回复1点体力,然后弃掉这些♥牌,将其余的牌收入手牌。", + batu_info: "结束阶段,你可以将手牌数补至X,X为现存的势力数。", + diyzaiqi_info: "锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值。", + diykuanggu_info: "锁定技,每当你造成1点伤害,你在其攻击范围内,你回复1点体力,否则你摸一张牌。", + diyqiangxi_info: "出牌阶段,你可以自减1点体力或弃一张武器牌,然后你对你攻击范围内的一名角色造成1点伤害并弃置其一张牌,每回合限一次。", + diyduanliang_info: "出牌阶段限一次,你可以将一张黑色的基本牌当兵粮寸断对一名角色使用,然后摸一张牌。你的兵粮寸断可以指定距离2以内的角色作为目标。", + guihan_info: "限定技,当你进入濒死状态时,可以指定一名男性角色与其各回复1点体力并摸两张牌。", + luweiyan_info: "出牌阶段限一次,你可以将一张非基本牌当作水攻使用;结算后你可以视为对其中一个目标使用一张不计入出杀次数的【杀】。", + xiongzi_info: "锁定技,你于摸牌阶段额外摸X+1张牌,X为你装备区牌数的一半,向下取整。", + honglian_info: "每当你受到来自其他角色的伤害,可以弃置伤害来源的所有红色牌。", + jieyan_info: "出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到1点火焰伤害。", + diyguhuo_info: "锁定技,准备阶段,你摸两张牌,然后弃置区域内的两张牌。", + diychanyuan_info: "锁定技,杀死你的角色失去1点体力上限。", + zonghuo_info: "你可弃置一张牌将你即将造成的伤害变为火焰伤害。", + shaoying_info: "每当你造成一次火焰伤害,可指定距离受伤害角色1以内的另一名角色,并亮出牌堆顶的一张牌,若此牌为红色,该角色受到1点火焰伤害。", + juedao_info: "出牌阶段,你可以弃置一张手牌,横置你的武将牌;锁定技,若你的武将牌横置,则你计算至其他角色的距离和其他角色计算至你的距离均+1。", + geju_info: "准备阶段开始时,你可以摸X张牌(X为攻击范围内不含有你的势力数)。", + siji_info: "弃牌阶段结束后,你可以摸2X张牌(X为你于此阶段内弃置的【杀】的数量)。", + ciqiu_info: "锁定技,每当你使用【杀】对目标角色造成伤害时,若该角色未受伤,你令此伤害+1;若其因此进入濒死状态,你令其死亡,然后你失去“刺酋”。", + nsshuaiyan_info: "每当其他角色于你的回合外回复体力后,你可以令该角色选择一项:1.令你摸一张牌;2.令你弃置其一张牌。", + moshou_info: "锁定技,你不能成为乐不思蜀和兵粮寸断的目标。", + xicai_info: "你可以立即获得对你造成伤害的牌。", + diyjianxiong_info: "锁定技,在身份局中,在你回合内死亡的角色均视为反贼,国战中,在你回合内死亡的角色若与你势力相同则随机改为另一个势力。", + + ns_zanghong: "臧洪", + nsshimeng: "誓盟", + nsshimeng_info: "出牌阶段限一次,你可以选择任意名角色。这些角色依次选择一项:⒈摸一张牌。⒉使用一张【杀】。然后若选择前者角色数大于选择后者的角色数,则你获得1点护甲并失去1点体力。", + ns_ruanji: "阮籍", + nsshizui: "酾醉", + nsshizui_info: "每回合限一次。当你成为基本牌或普通锦囊牌的目标后,你可以弃置一张牌,然后视为使用一张【酒】。若你弃置的牌与其使用的牌花色相同,则此牌对你无效;若你弃置的牌为♣,则你获得其使用的牌。", + nsxiaoye: "啸野", + nsxiaoye_info: "一名角色的结束阶段开始时,若你于当前回合内使用过【酒】,则你可以视为使用一张其于本回合内使用过的【杀】或普通锦囊牌。", + ns_limi: "李密", + nstuilun: "退论", + nstuilun_info: "结束阶段,你可以失去任意点体力(至多失去至1点)并弃置任意张手牌(至多弃置至一张)。若如此做,你获得如下效果直到你下回合开始:其他角色的回合开始时,若你的体力值小于该角色,则你可以令一名角色回复或失去1点体力;若你的手牌数小于该角色,则你可以令一名角色摸一张牌或弃置一张牌。", + ns_zhonglimu: "钟离牧", + nskuanhuai: "宽怀", + nskuanhuai_info: "出牌阶段开始时,你可以从弃牌堆中获得一张非基本牌。若如此做:你本阶段内不能使用基本牌,且本回合的弃牌阶段结束时,你可以依次使用本阶段内弃置的基本牌。", + nsdingbian: "定边", + nsdingbian_info: "锁定技。当你于回合内使用锦囊牌或装备牌后,你令自己本回合的手牌上限-1且选择一项:⒈从牌堆获得一张基本牌。⒉令一种基本牌于本回合内不计入手牌上限。", + prp_zhugeliang_ab: "诸葛亮", + prp_zhugeliang: "派对浪客", + nsxingyun: "星陨", + nsxingyun_info: "每回合限一次。你可以将一张手牌当做任意一张符合“四象天阵”的牌使用。然后若这两张牌的类型不同,则你删除此“四象天阵”并摸两张牌。当你删除“四象天阵”中的最后一个项目后,你获得技能〖八阵〗。", + nsxingyun_faq: "四象天阵", + nsxingyun_faq_info: "青龙:无标签普通锦囊牌
    朱雀:延时锦囊牌
    白虎:伤害类卡牌
    玄武:【闪】/回复类卡牌", + nshanlang: "酣浪", + nshanlang_info: "准备阶段,你可以和至多三名角色拼点。然后若这些角色中有拼点牌唯一最大的角色,则你可以令该角色从牌堆中获得一张不符合“四象天阵”的牌。", + + junktaoluan: "滔乱", + junktaoluan_backup: "滔乱", + junktaoluan_info: "你可将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌,且每回合每种花色限一次),然后你令一名其他角色选择一项:1.交给你一张与“滔乱”声明的牌类别不同的牌;2.本回合“滔乱”失效且回合结束时你失去1点体力。", + ns_caimao: "蔡瑁", + nsdingzhou: "定州", + nsdingzhou_info: "出牌阶段限一次,你可以选择一名区域内有牌的其他角色。你随机获得其区域内的一张牌,然后摸一张牌。若你以此法获得了两张颜色不同的牌,则你失去1点体力。", + junkyuheng: "驭衡", + junkyuheng_info: '锁定技。①回合开始时,你须弃置任意张花色不同的牌,从东吴命运线·改中随机获得等量的技能。②回合结束时,你失去所有因〖驭衡①〗获得的技能,然后摸等量的牌。', + junkdili: "帝力", + junkdili_info: "觉醒技。当你获得技能后,若你拥有的技能数大于你的体力上限,则你减1点体力上限,选择失去任意个其他技能,然后获得以下技能中的前等量个:〖圣质〗/〖权道〗/〖持纲〗。", + junkshengzhi: "圣质", + junkshengzhi_info: "锁定技。当你发动非锁定技后,你令你本回合使用的下一张牌无距离和次数限制。", + junkquandao: "权道", + junkquandao_info: "锁定技。当你使用【杀】或普通锦囊牌时,{若你手牌中的【杀】或普通锦囊牌的数量之差X不为0,则你弃置X张数量较多的一种牌},然后你摸一张牌。", + junkchigang: "持纲", + junkchigang_info: "转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。", + junkrende: "仁德", + junkrende_info: "出牌阶段限一次,你可以将任意张手牌交给其他角色。若你给出的牌多于一张,则你回复1点体力。", + junkjizhi: "集智", + junkjizhi_info: "当你使用非转化的普通锦囊牌时,你可以亮出牌堆顶的一张牌A。若A不为基本牌,则你获得A。否则你选择一项:⒈将A置入弃牌堆。⒉将一张手牌置于牌堆顶,然后获得A。", + junkqicai: "奇才", + junkqicai_info: "锁定技。①你使用锦囊牌无距离限制。②你装备区内的非坐骑牌不能被其他角色弃置。", + junkwangxi: "忘隙", + junkwangxi_info: "当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可以摸两张牌,然后交给其其中一张牌。", + junkwangxi_tag: "invisible", + junklangmie: "狼灭", + junklangmie_info: "其他角色的结束阶段开始时,你可以选择一项:⒈若其本回合内使用过某种类型的牌超过一张,则你弃置一张牌并摸两张牌。⒉若其本回合累计造成过的伤害大于1,则你弃置一张牌,然后对其造成1点伤害。", + junkshicai: "恃才", + junkshicai_info: "当你使用牌结束完毕后,若此牌与你本回合使用的牌类型均不同,则你可以将此牌置于牌堆顶,然后摸一张牌。", + junk_zhangrang: "新杀张让", + junk_zhangrang_prefix: "新杀", + old_jiakui: "手杀贾逵", + old_jiakui_prefix: "手杀", + ol_guohuai: "OL郭淮", + ol_guohuai_prefix: "OL", + old_bulianshi: "RE步练师", + old_bulianshi_prefix: "RE", + ol_maliang: "OL马良", + ol_maliang_prefix: "OL", + junk_lidian: "OL李典", + junk_lidian_prefix: "OL", + junk_duanwei: "新杀段煨", + junk_duanwei_prefix: "新杀", + junk_xuyou: "手杀许攸", + junk_xuyou_prefix: "手杀", + junk_liubei: "旧界刘备", + junk_liubei_prefix: "旧界", + junk_huangyueying: "旧界黄月英", + junk_huangyueying_prefix: "旧界", + old_majun: "骰子马钧", + old_majun_prefix: "骰子", + ns_mengyou: "数学孟优", + ns_mengyou_prefix: "数学", + ns_mengyou_ab: "孟优", + nsmanzhi: "蛮智", + nsmanzhi_info: "准备阶段或结束阶段开始时,你可以将场上出现的数字代入等式中的A和B。若此等式成立,你摸Y张牌。(等式为Y=0.5A2+2.5B-X,其中X为游戏轮数,Y为存活人数)", + ns_chengpu: "铁索程普", + ns_chengpu_prefix: "铁索", + ns_chengpu_ab: "程普", + ns_sundeng: "画饼孙登", + ns_sundeng_prefix: "画饼", + ns_sundeng_ab: "孙登", + ns_duji: "画饼杜畿", + ns_duji_prefix: "画饼", + ns_duji_ab: "杜畿", + junk_zhangjiao: "OL神张角", + junk_zhangjiao_prefix: "OL神", + junksijun: "肆军", + junksijun_info: "准备阶段,若“黄”数大于牌堆的牌数,你可以移去所有“黄”,然后从牌堆中随机获得任意张点数之和为36的牌(若牌堆没有点数和为36的组合则获得牌堆顶点数和刚好超过36的牌组)。", + junk_guanyu: "旧谋关羽", + junk_guanyu_prefix: "旧谋", +}; + +export default translates; diff --git a/character/diy/voices.js b/character/diy/voices.js new file mode 100644 index 000000000..ff8b4c563 --- /dev/null +++ b/character/diy/voices.js @@ -0,0 +1 @@ +export default {}; diff --git a/character/extra.js b/character/extra.js deleted file mode 100755 index acd1b10ee..000000000 --- a/character/extra.js +++ /dev/null @@ -1,10891 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "extra", - connect: true, - connectBanned: ["shen_diaochan"], - characterSort: { - extra: { - extra_feng: ["shen_guanyu", "shen_lvmeng"], - extra_huo: ["shen_zhugeliang", "shen_zhouyu"], - extra_lin: ["shen_caocao", "shen_lvbu"], - extra_shan: ["shen_zhaoyun", "shen_simayi"], - extra_yin: ["shen_liubei", "shen_luxun"], - extra_lei: ["shen_ganning", "shen_zhangliao"], - extra_key: ["key_kagari", "key_shiki", "db_key_hina"], - extra_decade: [ - "shen_jiangwei", - "shen_machao", - "shen_zhangfei", - "shen_zhangjiao", - "shen_dengai", - "shen_xuzhu", - "dc_shen_huatuo", - ], - extra_ol: ["ol_zhangliao", "shen_caopi", "shen_zhenji", "shen_sunquan"], - extra_mobilezhi: ["shen_guojia", "shen_xunyu"], - extra_mobilexin: ["shen_taishici", "shen_sunce"], - extra_mobileren: ["shen_huatuo", "shen_lusu"], - extra_tw: ["tw_shen_guanyu", "tw_shen_lvmeng"], - extra_offline: ["shen_diaochan", "boss_zhaoyun", "shen_dianwei", "le_shen_jiaxu"], - }, - }, - character: { - dc_shen_huatuo: ["male", "shen", 3, ["jingyu", "lvxin", "huandao"], ["qun"]], - shen_xuzhu: ["male", "shen", 5, ["zhengqing", "zhuangpo"], ["wei"]], - shen_lusu: ["male", "shen", 3, ["tamo", "dingzhou", "zhimeng"], ["wu"]], - shen_huatuo: ["male", "shen", 3, ["wuling", "youyi"], ["qun"]], - le_shen_jiaxu: ["male", "shen", 4, ["jxlianpo", "jxzhaoluan"], ["qun"]], - shen_dianwei: ["male", "shen", 4, ["juanjia", "qiexie", "cuijue"], ["wei"]], - shen_dengai: ["male", "shen", 4, ["dctuoyu", "dcxianjin", "dcqijing"], ["wei"]], - tw_shen_lvmeng: ["male", "shen", 3, ["twshelie", "twgongxin"], ["wu"]], - shen_zhangjiao: ["male", "shen", 3, ["yizhao", "sijun", "sanshou", "tianjie"], ["qun"]], - shen_zhangfei: ["male", "shen", 4, ["shencai", "xunshi"], ["shu"]], - tw_shen_guanyu: ["male", "shen", 4, ["twwushen", "twwuhun"], ["shu"]], - shen_machao: ["male", "shen", 4, ["shouli", "hengwu"], ["shu"]], - shen_sunquan: ["male", "shen", 4, ["junkyuheng", "junkdili"], ["wu"]], - shen_jiangwei: ["male", "shen", 4, ["jiufa", "tianren", "pingxiang"], ["shu"]], - key_kagari: ["female", "shen", 3, ["kagari_zongsi"], ["key"]], - key_shiki: ["female", "shen", "3/5", ["shiki_omusubi"], ["key"]], - db_key_hina: ["female", "key", 3, ["hina_shenshi", "hina_xingzhi"], ["doublegroup:key:shen"]], - - shen_sunce: ["male", "shen", "1/6", ["yingba", "scfuhai", "pinghe"], ["wu"]], - shen_xunyu: ["male", "shen", 3, ["tianzuo", "lingce", "dinghan"], ["wei", "clan:颍川荀氏"]], - shen_taishici: ["male", "shen", 4, ["dulie", "tspowei"], ["wu"]], - shen_guojia: ["male", "shen", 3, ["reshuishi", "stianyi", "resghuishi"], ["wei"]], - shen_diaochan: ["female", "shen", 3, ["meihun", "huoxin"], ["qun"]], - shen_guanyu: ["male", "shen", 5, ["wushen", "new_wuhun"], ["shu"]], - shen_zhaoyun: ["male", "shen", 2, ["xinjuejing", "relonghun"], ["shu"]], - shen_zhugeliang: ["male", "shen", 3, ["qixing", "kuangfeng", "dawu"], ["shu"]], - shen_lvmeng: ["male", "shen", 3, ["shelie", "gongxin"], ["wu"]], - shen_zhouyu: ["male", "shen", 4, ["yeyan", "qinyin"], ["wu"]], - shen_simayi: ["male", "shen", 4, ["renjie", "sbaiyin", "lianpo"], ["wei"]], - shen_caocao: ["male", "shen", 3, ["new_guixin", "feiying"], ["wei"]], - shen_lvbu: ["male", "shen", 5, ["baonu", "wumou", "ol_wuqian", "ol_shenfen"], ["qun"]], - - shen_liubei: ["male", "shen", 6, ["nzry_longnu", "nzry_jieying"], ["shu"]], - shen_luxun: ["male", "shen", 4, ["nzry_junlve", "nzry_cuike", "nzry_dinghuo"], ["wu"]], - shen_zhangliao: ["male", "shen", 4, ["drlt_duorui", "drlt_zhiti"], ["wei"]], - shen_ganning: ["male", "shen", "3/6", ["drlt_poxi", "drlt_jieying"], ["wu"]], - ol_zhangliao: ["male", "shen", 4, ["olduorui", "olzhiti"], ["wei"]], - shen_caopi: ["male", "shen", 5, ["chuyuan", "dengji"], ["wei"]], - shen_zhenji: ["female", "shen", 3, ["shenfu", "qixian"], ["wei"]], - boss_zhaoyun: ["male", "shen", 1, ["boss_juejing", "xinlonghun", "zhanjiang"], ["shu"]], - }, - characterIntro: { - shen_guanyu: - "关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。", - shen_lvmeng: - "吕蒙,字子明,汝南富陂人,东吴名将,原有“吴下阿蒙”之贬称,后受孙权劝说,奋发读书,最终成就一代名将。", - shen_zhouyu: - "字公瑾,庐江舒县人。东汉末年名将。有姿貌、精音律,江东有“曲有误,周郎顾”之语。周瑜少与孙策交好,后孙策遇刺身亡,孙权继任。周瑜将兵赴丧,以中护军的身份与长史张昭共掌众事,建安十三年(208年),周瑜率东吴军与刘备军联合,在赤壁击败曹操。此战也奠定了三分天下的基础。", - shen_zhugeliang: - "字孔明、号卧龙,汉族,琅琊阳都人,三国时期蜀汉丞相、杰出的政治家、军事家、发明家、文学家。在世时被封为武乡侯,死后追谥忠武侯,后来东晋政权推崇诸葛亮军事才能,特追封他为武兴王。诸葛亮为匡扶蜀汉政权,呕心沥血、鞠躬尽瘁、死而后已。其代表作有《前出师表》、《后出师表》、《诫子书》等。曾发明木牛流马等,并改造连弩,可一弩十矢俱发。于234年在宝鸡五丈原逝世。", - }, - characterReplace: { - shen_zhangliao: ["ol_zhangliao", "shen_zhangliao"], - shen_zhaoyun: ["shen_zhaoyun", "dc_zhaoyun", "old_shen_zhaoyun", "boss_zhaoyun"], - shen_guanyu: ["shen_guanyu", "tw_shen_guanyu"], - shen_sunquan: ["shen_sunquan", "junk_sunquan"], - shen_lvmeng: ["shen_lvmeng", "tw_shen_lvmeng"], - shen_machao: ["shen_machao", "ps_shen_machao"], - shen_jiaxu: ["le_shen_jiaxu", "shen_jiaxu"], - shen_caocao: ["shen_caocao", "old_caocao"], - shen_zhangjiao: ["shen_zhangjiao", "junk_zhangjiao"], - shen_huatuo: ["dc_shen_huatuo", "shen_huatuo"], - }, - characterFilter: { - shen_diaochan(mode) { - return ( - mode == "identity" || - mode == "doudizhu" || - mode == "single" || - (mode == "versus" && _status.mode != "standard" && _status.mode != "three") - ); - }, - shen_dengai(mode) { - if (["boss", "chess", "tafang", "stone"].includes(mode)) return false; - if (mode == "versus") return _status.mode != "three"; - return true; - }, - le_shen_jiaxu(mode) { - return mode == "identity" && _status.mode != "purple"; - }, - }, - /** @type { importCharacterConfig['skill'] } */ - skill: { - //十周年神华佗 - jingyu: { - audio: 2, - trigger: { - global: ["useSkill", "logSkillBegin", "useCard", "respond"], - }, - filter(event, player) { - if (["global", "equip"].includes(event.type)) return false; - let skill = event.sourceSkill || event.skill; - if (!skill || skill === "jingyu") return false; - let info = get.info(skill); - while (true) { - if (!info || info.charlotte || info.equipSkill) return false; - if (info && !info.sourceSkill) break; - skill = info.sourceSkill; - info = get.info(skill); - } - return !player.getStorage("jingyu_used").includes(skill); - }, - forced: true, - async content(event, trigger, player) { - if (!player.storage.jingyu_used) { - player - .when({ global: "roundStart" }) - .assign({ - firstDo: true, - }) - .then(() => delete player.storage.jingyu_used); - } - let skill = trigger.sourceSkill || trigger.skill, - info = get.info(skill); - while (true) { - if (info && !info.sourceSkill) break; - skill = info.sourceSkill; - info = get.info(skill); - } - player.markAuto("jingyu_used", skill); - await player.draw(); - }, - ai: { - threaten: 6, - }, - }, - lvxin: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: true, - filterTarget: lib.filter.notMe, - check(card) { - const round = game.roundNumber, - player = get.player(); - let valueFix = 0; - if (["sha", "shan"].includes(get.name(card, false))) valueFix += 3; - if ( - (round <= 2 && - player.hasCard((card) => { - return ["sha", "shan"].includes(get.name(card)) && get.value(card) <= 3; - })) || - game.hasPlayer((current) => { - return current !== player && get.attitude(player, current) > 0; - }) - ) - return 6 - get.value(card) + valueFix; - return 4.5 - get.value(card) + valueFix; - }, - delay: false, - discard: false, - lose: false, - async content(event, trigger, player) { - const { target, cards } = event, - round = Math.min(5, game.roundNumber); - const name = get.translation(target); - await player.give(cards, target); - const result = await player - .chooseControl(["摸牌", "弃牌"]) - .set("choiceList", [ - `令${name}摸${get.cnNumber(round)}张牌`, - `令${name}随机弃置${get.cnNumber(round)}张手牌`, - ]) - .set("prompt", "滤心:请选择一项") - .set("ai", () => { - return get.event("choice"); - }) - .set("choice", get.attitude(player, target) > 0 ? "摸牌" : "弃牌") - .forResult(); - let cards2 = []; - const makeDraw = result.index === 0; - if (makeDraw) { - cards2 = await target.draw(round).forResult(); - } else { - const cards = target.getCards("h", (card) => { - return lib.filter.cardDiscardable(card, target, "lvxin"); - }); - if (cards.length > 0) { - const evt = await target - .discard(cards.randomGets(round)) - .set("discarder", target); - cards2 = evt.done.cards2; - } - } - const cardName = get.name(cards[0], player); - if ( - cards2.some((card) => { - return get.name(card, target) === cardName; - }) - ) { - const skillName = `lvxin_${makeDraw ? "recover" : "lose"}`; - target.addSkill(skillName); - target.addMark(skillName, 1, false); - } - }, - subSkill: { - recover: { - trigger: { - player: ["useSkill", "logSkillBegin", "useCard", "respond"], - }, - filter(event, player) { - if (["global", "equip"].includes(event.type)) return false; - const skill = event.sourceSkill || event.skill; - const info = get.info(skill); - return info && !info.charlotte && !info.equipSkill; - }, - forced: true, - onremove: true, - charlotte: true, - async content(event, trigger, player) { - player.recover(player.countMark("lvxin_recover")); - player.removeSkill("lvxin_recover"); - }, - intro: { - content: "下次发动技能时回复#点体力", - }, - }, - lose: { - trigger: { - player: ["useSkill", "logSkillBegin", "useCard", "respond"], - }, - filter(event, player) { - if (["global", "equip"].includes(event.type)) return false; - const skill = event.sourceSkill || event.skill; - const info = get.info(skill); - return info && !info.charlotte && !info.equipSkill; - }, - forced: true, - onremove: true, - charlotte: true, - async content(event, trigger, player) { - player.loseHp(player.countMark("lvxin_lose")); - player.removeSkill("lvxin_lose"); - }, - intro: { - content: "下次发动技能时失去#点体力", - }, - }, - }, - ai: { - order: 5, - result: { - target(player, target) { - const round = game.roundNumber; - if ( - round <= 2 && - target.countCards("h") > round * 2 && - player.getCards("h").some((card) => { - return ["sha", "shan"].includes(get.name(card)) && get.value(card) <= 3; - }) - ) - return 1; - if (get.attitude(player, target) > 0) { - return round + Math.sqrt(1 + target.getDamagedHp()); - } - return -(round + Math.sqrt(Math.max(0, 2 - target.getHp()))); - }, - }, - }, - }, - huandao: { - audio: 2, - enable: "phaseUse", - usable: 1, - limited: true, - filterTarget: lib.filter.notMe, - skillAnimation: true, - animationColor: "metal", - async content(event, trigger, player) { - player.awakenSkill("huandao"); - const { target } = event; - await target.turnOver(false); - await target.link(false); - let names = [target.name1 || target.name]; - if (target.name2) names.add(target.name2); - names = names.map((name) => get.rawName(name)); - if (!_status.characterlist) lib.skill.pingjian.initList(); - _status.characterlist.randomSort(); - let ownedSkills = target.getSkills(null, false, false), - ownedSkillsName = ownedSkills.map((skill) => get.translation(skill)); - let skillToGain = null; - outer: for (const name of _status.characterlist) { - const info = lib.character[name]; - if (!names.includes(get.rawName(name))) continue; - const skills = info[3].slice().randomSort(); - while (skills.length) { - const skill = skills.shift(), - skillName = get.translation(skill); - if (!ownedSkillsName.includes(skillName)) { - skillToGain = skill; - break outer; - } - } - } - if (!skillToGain) return; - player.popup(skillToGain); - player.line(target, "green"); - let prompt2 = "若你选择是,则你于获得此技能后须失去一个其他技能。

    "; - if (lib.skill[skillToGain].nobracket) { - prompt2 += `
    ${get.translation( - skillToGain - )}
    ${get.skillInfoTranslation( - skillToGain - )}


    `; - } else { - const translation = - lib.translate[skillToGain + "_ab"] || get.translation(skillToGain).slice(0, 2); - prompt2 += `
    【${translation}】
    ${get.skillInfoTranslation( - skillToGain - )}


    `; - } - const bool = await target - .chooseBool(`寰道:是否获得技能〖${get.translation(skillToGain)}〗?`, prompt2) - .set( - "choice", - (() => { - const rank = get.skillRank(skillToGain, "inout") + 1; - return ownedSkills.some((skill) => { - const info = get.info(skill); - if (info) { - if ( - target.awakenedSkills.includes(skill) && - (info.limited || info.juexingji || info.dutySkill) - ) - return true; - if (info.ai && (info.ai.neg || info.ai.halfneg)) return true; - } - return get.skillRank(skill, "inout") < rank; - }); - })() - ) - .forResultBool(); - if (!bool) { - target.chat("拒绝"); - game.log(target, "拒绝获得技能", `#g【${get.translation(skillToGain)}】`); - await game.asyncDelay(); - return; - } - await target.addSkills(skillToGain); - ownedSkills = target.getSkills(null, false, false).filter((skill) => { - if (skill === skillToGain) return false; - const info = get.info(skill); - if (!info || info.charlotte || !get.skillInfoTranslation(skill, player).length) - return false; - return true; - }); - if (!ownedSkills) return; - const control = await target - .chooseControl(ownedSkills) - .set( - "choiceList", - ownedSkills.map((skill) => { - return `
    【${get.translation( - lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2) - )}】
    ${get.skillInfoTranslation(skill, target)}
    `; - }) - ) - .set("displayIndex", false) - .set("prompt", "寰道:选择失去一个技能") - .set("ai", () => { - return get.event("choice"); - }) - .set( - "choice", - (() => { - const uselessSkills = ownedSkills.filter((skill) => { - const info = get.info(skill); - if (!info) return false; - if ( - target.awakenedSkills.includes(skill) && - (info.limited || info.juexingji || info.dutySkill) - ) - return true; - if (info.ai && (info.ai.neg || info.ai.halfneg)) return true; - return false; - }); - if (uselessSkills.length) return uselessSkills.randomGet(); - return ownedSkills.sort((a, b) => { - return get.skillRank(a, "inout") - get.skillRank(b, "inout"); - })[0]; - })() - ) - .forResultControl(); - await target.removeSkills(control); - }, - ai: { - order: 5, - result: { - target(player, target) { - if ( - game.roundNumber * game.countPlayer() <= - (1.5 * game.countPlayer2()) / Math.sqrt(player.getDamagedHp() + 1) - ) - return 0; - const ownedSkills = target.getSkills(null, false, false).filter((skill) => { - const info = get.info(skill); - if ( - !info || - info.charlotte || - !get.skillInfoTranslation(skill, player).length - ) - return false; - return true; - }); - const uselessSkills = ownedSkills.filter((skill) => { - const info = get.info(skill); - if (!info) return false; - if ( - target.awakenedSkills.includes(skill) && - (info.limited || info.juexingji || info.dutySkill) - ) - return true; - if (info.ai && (info.ai.neg || info.ai.halfneg)) return true; - return false; - }); - if (uselessSkills.length) return 3; - let names = [target.name1 || target.name]; - if (target.name2) names.add(target.name2); - names = names.map((name) => get.rawName(name)); - if (_status.characterlist.some((name) => names.includes(get.rawName(name)))) - return 1; - return 0; - }, - }, - }, - }, - //神许褚 - zhengqing: { - audio: 2, - trigger: { global: "roundStart" }, - forced: true, - filter() { - return ( - game.hasPlayer((current) => { - return current.countMark("zhengqing"); - }) || lib.skill.zhengqing.getMostInfoLastRound()[0] > 0 - ); - }, - getMostInfoLastRound() { - let max = -1, - players = []; - const history = game.getAllGlobalHistory(); - if (history.length <= 2) return [max, players]; - for (let i = history.length - 2; i >= 0; i--) { - const evts = history[i]["everything"].filter((evt) => { - if (evt.name !== "damage") return false; - const source = evt.source; - return source && source.isIn(); - }); - if (evts.length) { - let curMax = -1, - curPlayers = []; - const map = {}; - for (const evt of evts) { - const source = evt.source; - const id = source.playerid; - if (typeof map[id] !== "number") map[id] = 0; - map[id] += evt.num; - if (map[id] > curMax) { - curMax = map[id]; - curPlayers = [source]; - } else if (map[id] == curMax) { - curPlayers.add(source); - } - } - if (curMax > max) { - max = curMax; - players = curPlayers.slice(); - } else if (curMax === max) { - players.addArray(curPlayers); - } - } - if (history[i].isRound) break; - } - return [max, players]; - }, - async content(event, trigger, player) { - game.countPlayer((current) => { - if (current.hasMark("zhengqing")) current.clearMark("zhengqing"); - }); - const [num, players] = lib.skill.zhengqing.getMostInfoLastRound(); - player.line(players, "thunder"); - const onlyMe = players.length === 1 && players[0] === player; - const isMax = - (player - .getAllHistory("custom", (evt) => evt && evt.zhengqing_count) - .map((evt) => evt.zhengqing_count) - .sort((a, b) => b - a)[0] || 0) <= num; - players.forEach((current) => { - current.addMark("zhengqing", num); - }); - if (onlyMe && isMax) { - player.draw(Math.min(5, num)); - player.getHistory("custom").push({ zhengqing_count: num }); - } else { - const drawers = [player].concat(players).sortBySeat(trigger.player); - for (const drawer of drawers) { - await drawer.draw(); - } - } - }, - marktext: "擎", - intro: { - name: "争擎", - name2: "擎", - content: "mark", - }, - }, - zhuangpo: { - audio: 2, - enable: "chooseToUse", - onChooseToUse(event) { - if (!game.online && !event.zhuangpo_cards) { - event.set( - "zhuangpo_cards", - event.player.getCards("hes", (card) => { - if (get.name(card, event.player) == "sha") return true; - const str = lib.skill.shencai.getStr(card); - return str.includes("【杀】"); - }) - ); - } - }, - viewAs: { - name: "juedou", - storage: { zhuangpo: true }, - }, - viewAsFilter() { - return get.event("zhuangpo_cards").length > 0; - }, - prompt: "将一张牌面信息包含“【杀】”的牌当【决斗】使用", - filterCard(card, player) { - return get.event("zhuangpo_cards").includes(card); - }, - position: "hes", - precontent() { - player.addTempSkill("zhuangpo_effect"); - }, - subSkill: { - effect: { - trigger: { - player: "useCardToPlayered", - }, - filter(event, player) { - const card = event.card; - if (!card || !card.storage || !card.storage.zhuangpo) return false; - return player.hasMark("zhengqing"); - }, - direct: true, - charlotte: true, - group: "zhuangpo_damage", - async content(event, trigger, player) { - const target = trigger.target; - const list = Array.from({ length: player.countMark("zhengqing") }, (_, i) => { - return get.cnNumber(i + 1, true); - }); - const result = await player - .chooseControl(list, "cancel2") - .set("prompt", "壮魄:是否移去任意枚“擎”?") - .set("prompt2", `若如此做,${get.translation(target)}须弃置等量的牌`) - .set("ai", () => get.event("choice")) - .set( - "choice", - (() => { - if (get.attitude(player, target) >= 0) return "cancel2"; - const markCount = list.length; - const cards = target.getCards("he", (card) => - lib.filter.cardDiscardable(card, target) - ); - let allIn = false; - if ( - player.hp < 2 || - target.hp + - target.countCards("h", (card) => - target.canSaveCard(card, target) - ) <= - 1 + - trigger.targets.some((current) => - current.hasMark("zhengqing") - ) - ) - allIn = true; - if ( - cards.map((card) => get.value(card)).reduce((p, c) => p + c, 0) / - cards.length > - 5 - ) - allIn = true; - if ( - !player.isPhaseUsing() || - !player.hasCard((card) => { - if (!lib.skill.shencai.getStr(card).includes("【杀】")) - return false; - return player.hasValueTarget( - get.autoViewAs({ name: "juedou" }, [card]) - ); - }) - ) - allIn = true; - const maxCount = Math.min(markCount, cards.length); - const toRemoveCount = allIn - ? maxCount - : Math.ceil(Math.random() * maxCount); - return get.cnNumber(toRemoveCount, true); - })() - ) - .forResult(); - if (result.control === "cancel2") return; - const toRemoveCount = result.index + 1; - player.logSkill("zhuangpo_effect", target); - player.popup(get.cnNumber(toRemoveCount) + "张"); - player.removeMark("zhengqing", toRemoveCount); - target.chooseToDiscard("he", toRemoveCount, true); - }, - }, - damage: { - audio: "zhuangpo", - trigger: { source: "damageBegin1" }, - filter(event, player) { - const card = event.card; - if (!card || !card.storage || !card.storage.zhuangpo) return false; - const evt = event.getParent(2); - return evt.targets && evt.targets.some((current) => current.hasMark("zhengqing")); - }, - charlotte: true, - forced: true, - async content(event, trigger) { - trigger.num++; - }, - }, - }, - }, - //神鲁肃 - dingzhou: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter(event, player) { - const num = player.countCards("he"); - return game.hasPlayer((current) => { - if (current == player) return false; - const total = current.countCards("ej"); - return total > 0 && num >= total; - }); - }, - filterCard: true, - selectCard() { - return [ - 1, - Math.max( - ...game.filterPlayer((i) => i != get.player()).map((i) => i.countCards("ej")) - ), - ]; - }, - check(card) { - return 7 - get.value(card); - }, - filterTarget(card, player, target) { - const num = target.countCards("ej"); - if (!num) return false; - return ui.selected.cards.length == num && player != target; - }, - filterOk() { - return ui.selected.cards.length == ui.selected.targets[0].countCards("ej"); - }, - position: "he", - lose: false, - discard: false, - delay: false, - async content(event, trigger, player) { - const target = event.targets[0]; - await player.give(event.cards, target); - const cards = target.getGainableCards(player, "ej"); - if (cards.length) player.gain(cards, "give", target); - }, - ai: { - order: 9, - result: { - target(player, target) { - let eff = 0; - if (ui.selected.cards.length) - eff = ui.selected.cards - .map((card) => get.value(card)) - .reduce((p, c) => p + c, 0); - if (player.hasSkill("zhimeng") && (get.mode() == 'identity' || (player.countCards('h') - target.countCards('h') > 2 * ui.selected.cards.length))) eff *= 1 + get.sgnAttitude(player, target) * 0.15; - const es = target.getCards("e"), - js = target.getCards("j"); - es.forEach((card) => { - eff -= get.value(card, target); - }); - js.forEach((card) => { - eff -= get.effect( - target, - { - name: card.viewAs || card.name, - cards: [card], - }, - target, - target - ); - }); - return eff; - }, - }, - }, - }, - tamo: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter(event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - game.countPlayer((current) => { - if (get.mode() === "doudizhu") return current.getSeatNum() !== 3; - return !current.isZhu2(); - }) > 1 - ); - }, - direct: true, - changeSeat: true, - derivation: "tamo_faq", - async content(event, trigger, player) { - const toSortPlayers = game.filterPlayer((current) => { - if (get.mode() === "doudizhu") return current.getSeatNum() !== 3; - return !current.isZhu2(); - }); - toSortPlayers.sortBySeat(game.findPlayer2((current) => current.getSeatNum() == 1, true)); - const next = player.chooseToMove("榻谟:是否分配" + - (get.mode() != "doudizhu" ? - (game.hasPlayer(cur => cur.isZhu2()) ? "除主公外" : "") : "除三号位外") + - "所有角色的座次?" - ); - next.set("list", [ - [ - "(以下排列的顺序即为发动技能后角色的座次顺序)", - [ - toSortPlayers.map((i) => `${i.getSeatNum()}|${i.name}`), - (item, type, position, noclick, node) => { - const info = item.split("|"), - _item = item; - const seat = parseInt(info[0]); - item = info[1]; - if (node) { - node.classList.add("button"); - node.classList.add("character"); - node.style.display = ""; - } else { - node = ui.create.div(".button.character", position); - } - node._link = item; - node.link = item; - - const func = function (node, item) { - const currentPlayer = game.findPlayer( - (current) => current.getSeatNum() == seat - ); - if (currentPlayer.classList.contains("unseen_show")) - node.setBackground("hidden_image", "character"); - else if (item != "unknown") node.setBackground(item, "character"); - if (node.node) { - node.node.name.remove(); - node.node.hp.remove(); - node.node.group.remove(); - node.node.intro.remove(); - if (node.node.replaceButton) node.node.replaceButton.remove(); - } - node.node = { - name: ui.create.div(".name", node), - group: ui.create.div(".identity", node), - intro: ui.create.div(".intro", node), - }; - const infoitem = [ - currentPlayer.sex, - currentPlayer.group, - `${currentPlayer.hp}/${currentPlayer.maxHp}/${currentPlayer.hujia}`, - ]; - node.node.name.innerHTML = get.slimName(item); - if ( - lib.config.buttoncharacter_style == "default" || - lib.config.buttoncharacter_style == "simple" - ) { - if (lib.config.buttoncharacter_style == "simple") { - node.node.group.style.display = "none"; - } - node.classList.add("newstyle"); - node.node.name.dataset.nature = get.groupnature( - get.bordergroup(infoitem) - ); - node.node.group.dataset.nature = get.groupnature( - get.bordergroup(infoitem), - "raw" - ); - } - node.node.name.style.top = "8px"; - if (node.node.name.querySelectorAll("br").length >= 4) { - node.node.name.classList.add("long"); - if (lib.config.buttoncharacter_style == "old") { - node.addEventListener("mouseenter", ui.click.buttonnameenter); - node.addEventListener("mouseleave", ui.click.buttonnameleave); - } - } - node.node.intro.innerHTML = lib.config.intro; - if (!noclick) { - lib.setIntro(node); - } - node.node.group.innerHTML = `
    ${get.cnNumber( - seat, - true - )}号
    `; - node.node.group.style.backgroundColor = get.translation( - `${get.bordergroup(infoitem)}Color` - ); - }; - node.refresh = func; - node.refresh(node, item); - - node.link = _item; - node.seatNumber = seat; - node._customintro = (uiintro) => { - uiintro.add( - `${get.translation(node._link)}(原${get.cnNumber( - node.seatNumber, - true - )}号位)` - ); - }; - return node; - }, - ], - ], - ]); - next.set("processAI", (list) => { - const listx = list[0][1][0]; - const me = listx.find( - (info) => parseInt(info.split("|")[0]) == get.player().getSeatNum() - ); - listx.randomSort(); - if (me) { - listx.remove(me); - listx.unshift(me); - } - return [listx]; - }); - const { result } = await next; - if (!result.bool) return; - await player.logSkill("tamo"); - const resultList = result.moved[0].map((info) => { - return parseInt(info.split("|")[0]); - }); - const toSwapList = []; - const cmp = (a, b) => { - return resultList.indexOf(a) - resultList.indexOf(b); - }; - for (let i = 0; i < toSortPlayers.length; i++) { - for (let j = 0; j < toSortPlayers.length; j++) { - if (cmp(toSortPlayers[i].getSeatNum(), toSortPlayers[j].getSeatNum()) < 0) { - toSwapList.push([toSortPlayers[i], toSortPlayers[j]]); - [toSortPlayers[i], toSortPlayers[j]] = [toSortPlayers[j], toSortPlayers[i]]; - } - } - } - game.broadcastAll((toSwapList) => { - for (const list of toSwapList) { - game.swapSeat(list[0], list[1], false); - } - }, toSwapList); - if ( - trigger.name === "phase" && - !trigger.player.isZhu2() && - trigger.player !== toSortPlayers[0] && - !trigger._finished - ) { - trigger.finish(); - trigger._triggered = 5; - const evt = toSortPlayers[0].insertPhase(); - delete evt.skill; - const evt2 = trigger.getParent(); - if (evt2.name == "phaseLoop" && evt2._isStandardLoop) { - evt2.player = toSortPlayers[0]; - } - //跳过新回合的phaseBefore - evt.pushHandler("onPhase", (event, option) => { - if (event.step === 0 && option.state === "begin") { - event.step = 1; - } - }); - } - await game.asyncDelay(); - }, - }, - //什么均贫卡 - zhimeng: { - audio: 2, - trigger: { player: "phaseAfter" }, - filter(event, player) { - return game.hasPlayer(target => { - if (target == player || target.countCards('h') + player.countCards('h') == 0) return false; - return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; - }); - }, - direct: true, - async content(event, trigger, player) { - const { - result: { bool, targets }, - } = await player - .chooseTarget( - get.prompt("zhimeng"), - "与一名其他角色平分手牌", - (card, player, target) => { - if (target == player || target.countCards('h') + player.countCards('h') == 0) return false; - return get.mode() == 'identity' || target.countCards('h') <= player.countCards('h') + 1; - } - ) - .set("ai", (target) => { - const player = get.player(); - const pvalue = -player - .getCards("h") - .map((card) => get.value(card, player)) - .reduce((p, c) => p + c, 0); - const tvalue = - -target - .getCards("h") - .map((card) => get.value(card, target)) - .reduce((p, c) => p + c, 0) * get.sgnAttitude(player, target); - return (pvalue + tvalue) / 2; - }); - if (!bool) return; - const target = targets[0]; - player.logSkill("zhimeng", target); - const lose_list = []; - let cards = []; - [player, target].forEach((current) => { - const hs = current.getCards("h"); - if (hs.length) { - cards.addArray(hs); - current.$throw(hs.length, 500); - game.log(current, "将", get.cnNumber(hs.length), "张牌置入了处理区"); - lose_list.push([current, hs]); - } - }); - await game - .loseAsync({ - lose_list: lose_list, - }) - .setContent("chooseToCompareLose"); - await game.asyncDelay(); - cards = cards.filterInD(); - const pcards = cards.randomGets(Math.ceil(cards.length / 2)); - const tcards = cards.removeArray(pcards); - const list = []; - if (pcards.length) { - list.push([player, pcards]); - game.log(player, "获得了", get.cnNumber(pcards.length), "张牌"); - } - if (tcards.length) { - list.push([target, tcards]); - game.log(target, "获得了", get.cnNumber(tcards.length), "张牌"); - } - game.loseAsync({ - gain_list: list, - player: player, - animate: "draw", - }).setContent("gaincardMultiple"); - }, - ai: { - threaten: 4, - }, - }, - //神华佗 - wuling: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer((target) => lib.skill.wuling.filterTarget(null, player, target)); - }, - filterTarget(card, player, target) { - return !target.hasSkill("wuling_wuqinxi"); - }, - usable: 2, - prompt: "选择一名角色,向其传授“五禽戏”", - group: "wuling_die", - content() { - "step 0"; - target.addAdditionalSkill(`wuling_${player.playerid}`, "wuling_wuqinxi"); - var next = player.chooseToMove( - `五灵:调整向${get.translation(target)}传授的“五禽戏”顺序` - ); - next.set("list", [ - [ - "", - [ - lib.skill.wuling.wuqinxi, - (item, type, position, noclick, node) => { - node = ui.create.buttonPresets.vcard(item, type, position, noclick); - node._customintro = [ - (node) => `五禽戏:${node.link[2]}`, - (node) => - lib.skill.wuling.wuqinxiMap[ - lib.skill.wuling.wuqinxi.indexOf(node.link[2]) - ].slice(2), - ]; - return node; - }, - ], - ], - ]); - next.set("processAI", () => { - const event = get.event().getParent(), - player = event.player, - target = event.target; - const spirits = []; - let nextPlayer = player; - do { - nextPlayer = nextPlayer.getNext(); - if (get.attitude(player, nextPlayer) < 0) { - spirits.add("熊"); - break; - } - } while (nextPlayer != target); - if (!spirits.length) spirits.add("猿"); - if ( - get.recoverEffect(target, player, player) > 0 || - target.hasCard((card) => { - return ( - get.effect( - target, - { - name: card.viewAs || card.name, - cards: [card], - }, - target, - target - ) < -1 - ); - }, "j") - ) - spirits.add("鹿"); - const others = lib.skill.wuling.wuqinxi.slice().removeArray(spirits); - do { - others.randomSort(); - } while (others.length > 1 && others[0] == "鹿"); - return [spirits.concat(others).map((i) => ["", "", i])]; - }); - "step 1"; - var sortedWuqinxi = result.moved[0].map((i) => i[2]); - game.log(target, "习得的五禽戏顺序为", "#g" + sortedWuqinxi.join("、")); - sortedWuqinxi.unshift(sortedWuqinxi[0]); - target.storage.wuling_wuqinxi = sortedWuqinxi; - lib.skill.wuling.updateMark(target); - }, - wuqinxi: ["虎", "鹿", "熊", "猿", "鹤"], - wuqinxiMap: [ - "虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。", - "鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。", - "熊:每回合限一次,当你受到伤害时,此伤害-1。", - "猿:当你获得此效果时,你选择一名其他角色,获得其装备区里的一张牌。", - "鹤:当你获得此效果时,你摸三张牌。", - ], - updateMark(player) { - var wuqinxi = player.storage.wuling_wuqinxi; - if (!wuqinxi) return; - var prevMark = wuqinxi.shift(); - // wuqinxi.push(prevMark); - var curMark = wuqinxi[0]; - if (!curMark) { - for (var skill in player.additionalSkills) { - if (!skill.startsWith("wuling_")) continue; - player.removeAdditionalSkill(skill); - } - game.log(player, "完成了五禽戏的操练"); - return; - } - game.log(player, "获得了", "#g【" + curMark + "】", "标记"); - player.markSkill("wuling_wuqinxi"); - game.broadcastAll( - function (player, curMark) { - if (player.marks.wuling_wuqinxi) - player.marks.wuling_wuqinxi.firstChild.innerHTML = curMark; - }, - player, - curMark - ); - var next = game.createEvent("wuling_change"); - next.player = player; - next.setContent("emptyEvent"); - }, - ai: { - order: 7, - threaten: 5, - result: { target: 1 }, - }, - derivation: "wuling_wuqinxi", - subSkill: { - wuqinxi: { - nopop: true, - charlotte: true, - intro: { - markcount: () => 0, - mark(dialog, storage) { - const wuqinxiMap = lib.skill.wuling.wuqinxiMap; - const str = `
  • 当前效果:${storage[0]}
  • ${wuqinxiMap - .find((str) => storage[0] == str[0]) - .slice(2)}
    `; - dialog.addText(str, false); - const str2 = - '
    “五禽戏”顺序:
    ' + - storage.join(" ") + - "
    "; - dialog.addText(str2); - if (storage.length > 1) { - const str3 = `
    [下一效果] ${wuqinxiMap.find( - (str) => storage[1] == str[0] - )}
    `; - dialog.add(str3); - } - }, - }, - mod: { - targetEnabled(card, player, target) { - if ( - get.type(card) == "delay" && - target.storage.wuling_wuqinxi && - target.storage.wuling_wuqinxi[0] == "鹿" - ) - return false; - }, - }, - trigger: { - source: "damageBegin1", - player: ["phaseZhunbeiBegin", "damageBegin4", "wuling_change"], - }, - filter(event, player, name) { - const wuqinxi = player.storage.wuling_wuqinxi && player.storage.wuling_wuqinxi[0]; - if (!wuqinxi) return false; - if (event.name == "phaseZhunbei") return true; - switch (name) { - case "damageBegin1": - if (wuqinxi != "虎" || !event.card) return false; - var evt = event.getParent("useCard"); - return ( - evt.targets && - evt.targets.length == 1 && - evt.targets.includes(event.player) - ); - case "damageBegin4": - return wuqinxi == "熊" && !player.hasSkill("wuling_xiong"); - default: - switch (wuqinxi) { - case "鹿": - return player.isDamaged() || player.countCards("j"); - case "鹤": - return true; - case "猿": - return game.hasPlayer( - (target) => - target != player && target.countGainableCards(player, "e") - ); - default: - return false; - } - } - }, - forced: true, - onremove: true, - content() { - "step 0"; - var wuqinxi = player.storage.wuling_wuqinxi[0]; - if (trigger.name == "phaseZhunbei") { - lib.skill.wuling.updateMark(player); - event.finish(); - } else { - var name = event.triggername; - switch (name) { - case "damageBegin1": - player.line(trigger.player); - trigger.num++; - event.finish(); - break; - case "damageBegin4": - player.addTempSkill("wuling_xiong"); - trigger.num--; - event.finish(); - break; - default: - switch (wuqinxi) { - case "鹿": - player.recover(); - player.discard(player.getCards("j")).discarder = player; - event.finish(); - break; - case "鹤": - player.draw(3); - event.finish(); - break; - case "猿": - player - .chooseTarget( - "五禽戏:获得一名其他角色装备区里的一张装备牌", - function (card, player, target) { - return ( - target != player && - target.countGainableCards(player, "e") - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target), - eff = 0; - target.getCards("e", function (card) { - var val = get.value(card, target); - eff = Math.max(eff, -val * att); - }); - return eff; - }); - break; - } - break; - } - } - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - player.gainPlayerCard(target, "e", true); - } - }, - ai: { - effect: { - target(card, player, target) { - const wuqinxi = target.storage.wuling_wuqinxi; - if (!wuqinxi || !wuqinxi.length) return; - const curWuqinxi = wuqinxi[0]; - const nextWuqinxi = wuqinxi[1]; - if (nextWuqinxi == "鹿" && get.type(card) == "delay") return "zerotarget"; - if (curWuqinxi != "熊" || player.hasSkill("wuling_xiong")) return; - if (player.hasSkillTag("jueqing", false, target)) return; - var num = get.tag(card, "damage"); - if (num) { - if (num > 1) return 0.5; - return 0; - } - }, - }, - }, - }, - xiong: { charlotte: true }, - die: { - trigger: { player: "die" }, - filter(event, player) { - return game.hasPlayer( - (current) => current.additionalSkills[`wuling_${player.playerid}`] - ); - }, - forced: true, - locked: false, - forceDie: true, - content() { - var targets = game.filterPlayer((current) => { - return current.additionalSkills[`wuling_${player.playerid}`]; - }); - player.line(targets); - targets.forEach((current) => - current.removeAdditionalSkill(`wuling_${player.playerid}`) - ); - }, - }, - }, - }, - youyi: { - init(player) { - player.storage.renku = true; - }, - audio: 2, - enable: "phaseUse", - filter(event, player) { - return _status.renku.length > 0; - }, - prompt: "将仁区所有牌置入弃牌堆,令所有角色各回复1点体力", - content() { - "step 0"; - var cards = _status.renku.slice(); - game.cardsDiscard(cards).fromRenku = true; - _status.renku.removeArray(cards); - player.$throw(cards, 1000); - game.updateRenku(); - game.log(cards, "从仁库进入了弃牌堆"); - "step 1"; - var targets = game.filterPlayer(); - player.line(targets); - targets.forEach((target) => target.recover()); - }, - ai: { - order(item, player) { - return get.order({ name: "taoyuan" }, player); - }, - result: { - player(player) { - return Math.max( - 0, - game - .filterPlayer() - .reduce( - (num, target) => num + get.recoverEffect(target, player, player), - 0 - ) - ); - }, - }, - }, - group: "youyi_put", - subSkill: { - put: { - audio: "youyi", - trigger: { player: "phaseDiscardEnd" }, - filter(event, player) { - return lib.skill.twlijian.getCards(event).length; - }, - prompt2(event, player) { - return "将" + get.translation(lib.skill.twlijian.getCards(event)) + "置入仁区"; - }, - content() { - var cards = lib.skill.twlijian.getCards(trigger); - game.log(player, "将", cards, "置于了仁库"); - game.cardsGotoSpecial(cards, "toRenku"); - }, - }, - }, - }, - //神贾诩 - jxlianpo: { - audio: 2, - init: () => { - game.addGlobalSkill("jxlianpo_global"); - }, - onremove: () => { - if (!game.hasPlayer((i) => i.hasSkill("jxlianpo"), true)) - game.removeGlobalSkill("jxlianpo_global"); - }, - trigger: { global: "dieAfter" }, - filter(event, player) { - if (lib.skill.jxlianpo.getMax().length <= 1) return false; - return event.source && event.source.isIn(); - }, - forced: true, - logTarget: "source", - getMax: () => { - const map = { - zhu: game.countPlayer((current) => { - const identity = current.identity; - let num = 0; - if (identity == "zhu" || identity == "zhong" || identity == "mingzhong") num++; - num += current.countMark("jxlianpo_mark_zhong"); - return num; - }), - fan: game.countPlayer((current) => { - let num = 0; - if (current.identity == "fan") num++; - num += current.countMark("jxlianpo_mark_fan"); - return num; - }), - nei: game.countPlayer((current) => { - let num = 0; - if (current.identity == "nei") num++; - num += current.countMark("jxlianpo_mark_nei"); - return num; - }), - commoner: game.countPlayer((current) => { - let num = 0; - if (current.identity == "commoner") num++; - num += current.countMark("jxlianpo_mark_commoner"); - return num; - }), - }; - let population = 0, - identities = []; - for (let i in map) { - let curPopulation = map[i]; - if (curPopulation >= population) { - if (curPopulation > population) identities = []; - identities.add(i); - population = curPopulation; - } - } - return identities; - }, - group: "jxlianpo_show", - *content(event, map) { - var source = map.trigger.source; - source.chooseDrawRecover(2, true); - }, - mark: true, - intro: { - content: () => - `场上最大阵营为${lib.skill.jxlianpo - .getMax() - .map((i) => { - if (i == "zhu") return "主忠"; - return get.translation(i + "2"); - }) - .join("、")}`, - }, - $createButton(item, type, position, noclick, node) { - node = ui.create.identityCard(item, position, noclick); - node.link = item; - return node; - }, - subSkill: { - show: { - audio: "jxlianpo", - trigger: { global: "roundStart" }, - filter(event, player) { - var list = lib.config.mode_config.identity.identity.lastItem.slice(); - list.removeArray( - game.filterPlayer().map((i) => { - let identity = i.identity; - if (identity == "mingzhong") identity = "zhong"; - return identity; - }) - ); - return list.length; - }, - forced: true, - content() { - "step 0"; - var list = lib.config.mode_config.identity.identity.lastItem.slice(); - list.removeArray( - game.filterPlayer().map((i) => { - var identity = i.identity; - return identity == "mingzhong" ? "zhong" : identity; - }) - ).unique(); - player.chooseButton( - [ - '###炼魄:请选择一个身份###
    你选择的身份对应的阵营角色数于本轮内视为+1
    ', - [ - list, - function (item, type, position, noclick, node) { - return lib.skill.jxlianpo.$createButton( - item, - type, - position, - noclick, - node - ); - }, - ], - ], - true - ); - "step 1"; - var choice = result.links[0], - mark = `jxlianpo_mark_${choice}`; - player - .when({ global: "roundStart" }) - .assign({ - firstDo: true, - }) - .filter((evt) => evt != trigger) - .then(() => { - for (var i in player.storage) { - if (i.startsWith("jxlianpo_mark_")) { - player.clearMark(i); - } - } - }); - player.addMark(mark, 1, false); - event.videoId = lib.status.videoId++; - var createDialog = function (player, identity, id) { - var dialog = ui.create.dialog( - `${get.translation(player)}展示了“${get.translation( - identity + "2" - )}”的身份牌
    `, - "forcebutton" - ); - dialog.videoId = id; - ui.create.spinningIdentityCard(identity, dialog); - }; - game.broadcastAll(createDialog, player, choice, event.videoId); - var color = ""; - if (choice == "zhong") color = "#y"; - else if (choice == "fan") color = "#g"; - else if (choice == "nei") color = "#b"; - game.log( - player, - "展示了", - `${color}${get.translation(choice + "2")}`, - "的身份牌" - ); - game.delay(3); - "step 2"; - game.broadcastAll("closeDialog", event.videoId); - }, - }, - global: { - mod: { - maxHandcard(player, num) { - if (!lib.skill.jxlianpo.getMax().includes("fan")) return; - return ( - num - - game.countPlayer((current) => { - return current != player && current.hasSkill("jxlianpo"); - }) - ); - }, - cardUsable(card, player, num) { - if (card.name == "sha") { - if (!lib.skill.jxlianpo.getMax().includes("fan")) return; - return ( - num + - game.countPlayer((current) => { - return current.hasSkill("jxlianpo"); - }) - ); - } - }, - attackRange(player, num) { - if (!lib.skill.jxlianpo.getMax().includes("fan")) return; - return ( - num + - game.countPlayer((current) => { - return current.hasSkill("jxlianpo"); - }) - ); - }, - cardSavable(card, player, target) { - if (card.name == "tao" && !player.hasSkill("jxlianpo")) { - if (!lib.skill.jxlianpo.getMax().includes("zhu")) return; - if (player == target) return; - return false; - } - }, - playerEnabled(card, player, target) { - if (card.name == "tao" && !player.hasSkill("jxlianpo")) { - if (!lib.skill.jxlianpo.getMax().includes("zhu")) return; - if (player == target) return; - return false; - } - }, - }, - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer((i) => i.hasSkill("jxlianpo"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("jxlianpo_global"); - }, - }, - }, - }, - jxzhaoluan: { - audio: 2, - trigger: { global: "dieBegin" }, - filter(event, player) { - return event.getParent().name == "dying" && event.player.isIn(); - }, - limited: true, - skillAnimation: true, - animationColor: "metal", - logTarget: "player", - check(event, player) { - if ( - event.source && - event.source.isIn() && - get.attitude(player, event.source) > 0 && - player.identity == "fan" - ) - return false; - return get.attitude(player, event.player) > 3.5; - }, - *content(event, map) { - var player = map.player, - trigger = map.trigger; - var target = trigger.player; - player.awakenSkill("jxzhaoluan"); - trigger.cancel(); - const skills = target.getSkills(null, false, false).filter((skill) => { - var info = get.info(skill); - if (info && !info.charlotte && !get.is.locked(skill)) { - return true; - } - }); - if (skills.length) yield target.removeSkills(skills); - yield target.gainMaxHp(3); - var num = 3 - target.getHp(true); - if (num > 0) yield target.recover(num); - target.draw(4); - player.addSkill("jxzhaoluan_effect"); - player.markAuto("jxzhaoluan_effect", target); - }, - ai: { - expose: 0.5, - threaten: 3, - }, - subSkill: { - effect: { - audio: "jxzhaoluan", - enable: "phaseUse", - filter(event, player) { - return player.getStorage("jxzhaoluan_effect").some((i) => i.isIn()); - }, - filterTarget(card, player, target) { - return !player.getStorage("jxzhaoluan_hit").includes(target); - }, - line: false, - locked: true, - charlotte: true, - promptfunc() { - var bodies = _status.event.player - .getStorage("jxzhaoluan_effect") - .filter((i) => i.isIn()); - return `选择一名角色,你令${get.translation(bodies)}${bodies.length > 1 ? "中的一人" : "" - }减1点体力上限,然后你对选择的角色造成1点伤害。`; - }, - delay: false, - content() { - "step 0"; - var bodies = player.getStorage("jxzhaoluan_effect").filter((i) => i.isIn()); - if (bodies.length == 1) event._result = { bool: true, targets: bodies }; - else { - player - .chooseTarget( - "兆乱:请选择被减上限的傀儡", - true, - (card, player, target) => { - return _status.event.targets.includes(target); - } - ) - .set("targets", bodies) - .set("ai", (target) => { - return 8 - get.attitude(_status.event.player, target); - }); - } - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - target.loseMaxHp(); - game.delayex(); - } else event.finish(); - "step 2"; - player.line(target); - target.damage(); - if (!player.storage.jxzhaoluan_hit) { - player.when("phaseUseAfter").then(() => { - delete player.storage.jxzhaoluan_hit; - }); - } - player.markAuto("jxzhaoluan_hit", target); - }, - ai: { - order: 9, - result: { - player(player) { - var bodies = player - .getStorage("jxzhaoluan_effect") - .filter((i) => i.isIn()); - var body; - if (bodies.length == 1) body = bodies[0]; - else - body = bodies.sort( - (a, b) => get.attitude(player, a) - get.attitude(player, b) - )[0]; - if ( - get.attitude(player, body) > 4 && - !body.isDamaged() && - body.getHp() <= 2 - ) - return -10; - return 0; - }, - target(player, target) { - return Math.sign(get.damageEffect(target, player, target)); - }, - }, - }, - }, - }, - }, - //神典韦 - juanjia: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - return (event.name != "phase" || game.phaseNumber == 0) && player.hasEnabledSlot(2); - }, - content() { - player.disableEquip(2); - player.expandEquip(1); - }, - }, - qiexie: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter(event, player) { - return player.countEmptySlot(1) > 0; - }, - content() { - "step 0"; - if (!_status.characterlist) { - lib.skill.pingjian.initList(); - } - _status.characterlist.randomSort(); - var list = []; - for (var name of _status.characterlist) { - var info = lib.character[name]; - if ( - info[3].some(function (skill) { - var info = get.skillInfoTranslation(skill); - if (!info.includes("【杀】")) return false; - var list = get.skillCategoriesOf(skill); - list.remove("锁定技"); - return list.length == 0; - }) - ) { - list.push(name); - if (list.length >= 5) break; - } - } - if (!list.length) event.finish(); - else { - var num = player.countEmptySlot(1); - player - .chooseButton( - [ - "挈挟:选择" + - (num > 1 ? "至多" : "") + - get.cnNumber(num) + - "张武将置入武器栏", - [ - list, - function (item, type, position, noclick, node) { - return lib.skill.qiexie.$createButton( - item, - type, - position, - noclick, - node - ); - }, - ], - ], - [1, num], - true - ) - .set("ai", function (button) { - var name = button.link; - var info = lib.character[name]; - var skills = info[3].filter(function (skill) { - var info = get.skillInfoTranslation(skill); - if (!info.includes("【杀】")) return false; - var list = get.skillCategoriesOf(skill); - list.remove("锁定技"); - return list.length == 0; - }); - var eff = 0.2; - for (var i of skills) { - eff += get.skillRank(i, "in"); - } - return eff; - }); - } - "step 1"; - if (result.bool) { - var list = result.links; - game.addVideo("skill", player, ["qiexie", [list]]); - _status.characterlist.removeArray(list); - game.broadcastAll( - function (player, list) { - player.tempname.addArray(list); - for (var name of list) lib.skill.qiexie.createCard(name); - }, - player, - list - ); - var cards = list.map(function (name) { - var card = game.createCard( - "qiexie_" + name, - "none", - get.infoMaxHp(lib.character[name][2]) - ); - return card; - }); - player.$gain2(cards); - game.delayx(); - for (var card of cards) player.equip(card); - } - }, - $createButton(item, type, position, noclick, node) { - node = ui.create.buttonPresets.character(item, "character", position, noclick); - const info = lib.character[item]; - const skills = info[3].filter(function (skill) { - var info = get.skillInfoTranslation(skill); - if (!info.includes("【杀】")) return false; - var list = get.skillCategoriesOf(skill); - list.remove("锁定技"); - return list.length == 0; - }); - if (skills.length) { - const skillstr = skills.map((i) => `[${get.translation(i)}]`).join("
    "); - const skillnode = ui.create.caption( - `
    ${skillstr}
    `, - node - ); - skillnode.style.left = "2px"; - skillnode.style.bottom = "2px"; - } - node._customintro = function (uiintro, evt) { - const character = node.link, - characterInfo = get.character(node.link); - let capt = get.translation(character); - if (characterInfo) { - const infoHp = get.infoMaxHp(characterInfo[2]); - capt += `  范围:${infoHp}`; - } - uiintro.add(capt); - if (lib.characterTitle[node.link]) { - uiintro.addText(get.colorspan(lib.characterTitle[node.link])); - } - for (let i = 0; i < skills.length; i++) { - if (lib.translate[skills[i] + "_info"]) { - let translation = - lib.translate[skills[i] + "_ab"] || - get.translation(skills[i]).slice(0, 2); - if (lib.skill[skills[i]] && lib.skill[skills[i]].nobracket) { - uiintro.add( - '
    ' + - get.translation(skills[i]) + - "
    " + - get.skillInfoTranslation(skills[i]) + - "
    " - ); - } else { - uiintro.add( - '
    【' + - translation + - "】
    " + - get.skillInfoTranslation(skills[i]) + - "
    " - ); - } - if (lib.translate[skills[i] + "_append"]) { - uiintro._place_text = uiintro.add( - '
    ' + lib.translate[skills[i] + "_append"] + "
    " - ); - } - } - } - }; - return node; - }, - video(player, info) { - for (var name of info[0]) { - lib.skill.qiexie.createCard(name); - } - }, - createCard(name) { - if (!_status.postReconnect.qiexie) - _status.postReconnect.qiexie = [ - function (list) { - for (var name of list) lib.skill.qiexie.createCard(name); - }, - [], - ]; - _status.postReconnect.qiexie[1].add(name); - if (!lib.card["qiexie_" + name]) { - if (lib.translate[name + "_ab"]) - lib.translate["qiexie_" + name] = lib.translate[name + "_ab"]; - else lib.translate["qiexie_" + name] = lib.translate[name]; - var info = lib.character[name]; - var card = { - fullimage: true, - image: "character:" + name, - type: "equip", - subtype: "equip1", - enable: true, - selectTarget: -1, - filterCard(card, player, target) { - if (player != target) return false; - return target.canEquip(card, true); - }, - modTarget: true, - allowMultiple: false, - content: lib.element.content.equipCard, - toself: true, - ai: {}, - skills: ["qiexie_destroy"], - }; - var maxHp = get.infoMaxHp(info[2]); - if (maxHp != 1) card.distance = { attackFrom: 1 - maxHp }; - var skills = info[3].filter(function (skill) { - var info = get.skillInfoTranslation(skill); - if (!info.includes("【杀】")) return false; - var list = get.skillCategoriesOf(skill); - list.remove("锁定技"); - return list.length == 0; - }); - var str = "锁定技。"; - if (skills.length) { - card.skills.addArray(skills); - str += "你视为拥有技能"; - for (var skill of skills) { - str += "〖" + get.translation(skill) + "〗"; - str += "、"; - } - str = str.slice(0, str.length - 1); - str += ";"; - card.ai.equipValue = function (card, player) { - let val = maxHp; - if (player.hasSkill("qiexie")) val *= 0.4; - else val *= 0.6; - return (val += skills.length); - }; - } - str += "此牌离开你的装备区后,改为置入剩余武将牌牌堆。"; - lib.translate["qiexie_" + name + "_info"] = str; - var append = ""; - if (skills.length) { - for (var skill of skills) { - if (lib.skill[skill].nobracket) { - append += - '
    ' + - get.translation(skill) + - '
    ' + - get.skillInfoTranslation(skill) + - "


    "; - } else { - var translation = - lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2); - append += - '
    【' + - translation + - '】
    ' + - get.skillInfoTranslation(skill) + - "


    "; - } - } - str = str.slice(0, str.length - 8); - } - lib.translate["qiexie_" + name + "_append"] = append; - lib.card["qiexie_" + name] = card; - } - }, - subSkill: { - destroy: { - trigger: { player: "loseBegin" }, - equipSkill: true, - forceDie: true, - charlotte: true, - forced: true, - popup: false, - filter(event, player) { - return event.cards.some((card) => card.name.indexOf("qiexie_") == 0); - }, - content() { - for (var card of trigger.cards) { - if (card.name.indexOf("qiexie_") == 0) { - card._destroy = true; - game.log(card, "被放回武将牌堆"); - var name = card.name.slice(7); - if (player.tempname && player.tempname.includes(name)) { - game.broadcastAll( - (player, name) => { - player.tempname.remove(name); - }, - player, - name - ); - } - if (lib.character[name]) _status.characterlist.add(name); - } - } - }, - }, - }, - }, - cuijue: { - enable: "phaseUse", - filter(event, player) { - return player.countCards("he") > 0; //&&game.hasPlayer(target=>lib.skill.cuijue.filterTarget('SB',player,target)); - }, - filterCard: true, - filterTarget(card, player, target) { - if (player.getStorage("cuijue_used").includes(target) || !player.inRange(target)) - return false; - var distance = get.distance(player, target); - return !game.hasPlayer( - (current) => - current != target && - player.inRange(current) && - get.distance(player, current) > distance - ); - }, - selectTarget: [0, 1], - filterOk() { - var player = _status.event.player; - if (game.hasPlayer((target) => lib.skill.cuijue.filterTarget("SB", player, target))) - return ui.selected.targets.length > 0; - return true; - }, - position: "he", - complexTarget: true, - check: (card) => { - var player = _status.event.player, - goon = 0; - try { - ui.selected.cards.add(card); - if ( - game.hasPlayer((target) => { - return lib.skill.cuijue.filterTarget("SB", player, target); - }) - ) { - goon = 6; - } - } catch (e) { - console.trace(e); - } - ui.selected.cards.remove(card); - return goon - get.value(card); - }, - content() { - if (target) { - player.addTempSkill("cuijue_used", "phaseUseAfter"); - player.markAuto("cuijue_used", [target]); - target.damage("nocard"); - } - }, - ai: { - order: 2, - result: { - target: -1.5, - }, - tag: { - damage: 1, - }, - }, - subSkill: { - used: { - onremove: true, - charlotte: true, - }, - }, - }, - //神邓艾 - dctuoyu: { - audio: 2, - trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, - forced: true, - filter(event, player) { - return player.countCards("h") > 0 && player.getStorage("dctuoyu").length > 0; - }, - content() { - "step 0"; - var hs = player.getCards("h"), - tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; - var storage = player.getStorage("dctuoyu"); - var list = [ - ["未分配手牌(对话框较长,请下滑操作)", []], - ["丰田(伤害/回复值+1)", []], - ["清渠(无次数和距离限制)", []], - ["峻山(不可被响应)", []], - ]; - for (var card of hs) { - var added = false; - for (var i = 0; i < tags.length; i++) { - if (card.hasGaintag(tags[i] + "_tag")) { - added = true; - list[i + 1][1].push(card); - break; - } - } - if (!added) list[0][1].push(card); - } - for (var row of list) { - for (var i = 0; i < tags.length; i++) { - if (!storage.includes(tags[i])) { - list[i + 1][0] = get.translation(tags[i]) + "(尚未激活)"; - } - } - } - var next = player.chooseToMove("拓域:请分配你的手牌", true); - next.set("list", list); - next.set("filterMove", function (from, to, moved) { - var storage = _status.event.player.getStorage("dctuoyu"), - tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; - if (typeof to == "number") { - if (to == 0) return true; - return storage.includes(tags[to - 1]) && moved[to].length < 5; - } - return true; - }); - next.set("processAI", function () { - var player = _status.event.player; - var storage = player.getStorage("dctuoyu"), - tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; - var moved = [[], [], [], []]; - var isEmpty = function (to) { - return storage.includes(tags[to - 1]) && moved[to].length < 5; - }; - var hs = player.getCards("h"); - var hs2 = hs.slice(0); - var usable = player.getCardUsable("sha"); - var addTo = function (card, to) { - if (isEmpty(to)) { - hs2.remove(card); - moved[to].push(card); - if (get.name(card) == "sha" && to != 2) usable--; - } - }; - var hasRuanshizi = game.hasPlayer(function (target) { - return ( - target != player && - player.canUse("sha", target, null, true) && - !target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) && - get.attitude(player, target) < 0 && - get.effect(target, { name: "sha" }, player, player) > 0 - ); - }); - for (var card of hs) { - var name = get.name(card); - if (name == "tao" || name == "jiu") { - addTo(card, 1); - } else if (name == "sha") { - if (hasRuanshizi && isEmpty(1) && usable > 0) addTo(card, 1); - else if (isEmpty(3) && usable > 0) addTo(card, 3); - else addTo(card, 2); - } else if (get.type(name) == "trick") { - if (isEmpty(1) && get.tag(card, "damage") > 0 && player.hasUseTarget(card)) - addTo(card, 1); - else addTo(card, 3); - } - } - moved[0].addArray(hs2); - return moved; - }); - "step 1"; - if (result.bool) { - game.broadcastAll( - function (moved, player) { - var tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; - var cards = []; - for (var i = 0; i < moved.length; i++) { - for (var card of moved[i]) { - cards.unshift(card); - for (var j = 0; j < tags.length; j++) { - if (i == j + 1) { - if (!card.hasGaintag(tags[j] + "_tag")) - card.addGaintag(tags[j] + "_tag"); - } else { - if (card.hasGaintag(tags[j] + "_tag")) - card.removeGaintag(tags[j] + "_tag"); - } - } - } - } - if (player == game.me) { - game.addVideo("lose", game.me, [get.cardsInfo(cards), [], [], []]); - for (var i = 0; i < cards.length; i++) { - cards[i].goto(ui.special); - } - game.me.directgain(cards, false); - } - }, - result.moved, - player - ); - } - }, - intro: { - content: "已激活的副区域:$", - }, - group: "dctuoyu_effect", - subSkill: { - effect: { - mod: { - targetInRange(card, player, target) { - if (!card.cards) return; - for (var i of card.cards) { - if (i.hasGaintag("dctuoyu_qingqu_tag")) return true; - } - }, - cardUsable(card, player, num) { - if (!card.cards) return; - for (var i of card.cards) { - if (i.hasGaintag("dctuoyu_qingqu_tag")) return Infinity; - } - }, - }, - trigger: { player: "useCard" }, - forced: true, - filter(event, player) { - var tags = ["dctuoyu_fengtian_tag", "dctuoyu_qingqu_tag", "dctuoyu_junshan_tag"], - card = event.card; - return player.hasHistory("lose", function (evt) { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - for (var tag of evt.gaintag_map[i]) { - if (tags.includes(tag)) return true; - } - } - return false; - }); - }, - content() { - var tags = ["dctuoyu_fengtian_tag", "dctuoyu_qingqu_tag", "dctuoyu_junshan_tag"], - card = trigger.card; - player.hasHistory("lose", function (evt) { - if (evt.getParent() != trigger) return false; - for (var i in evt.gaintag_map) { - tags.removeArray(evt.gaintag_map[i]); - } - return tags.length == 0; - }); - if (!tags.includes("dctuoyu_fengtian_tag")) { - if (get.tag(card, "damage") > 0 || get.tag(card, "recover") > 0) { - trigger.baseDamage++; - game.log(card, "的伤害值/回复值+1"); - } - } - if (!tags.includes("dctuoyu_qingqu_tag")) { - if (trigger.addCount !== false) { - trigger.addCount = false; - var stat = player.getStat("card"); - if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; - game.log(card, "不计入次数限制"); - } - } - if (!tags.includes("dctuoyu_junshan_tag")) { - game.log(card, "不可被响应"); - trigger.directHit.addArray(game.filterPlayer()); - } - }, - }, - }, - ai: { - combo: "dcxianjin", - }, - }, - dcxianjin: { - init(player) { - var num = game - .getAllGlobalHistory("changeHp", (evt) => { - return ( - evt.getParent().name == "damage" && - (evt.getParent().player == player || - (evt.getParent().source && evt.getParent().source == player)) - ); - }) - .concat( - game.getAllGlobalHistory("changeHp", (evt) => { - return ( - evt.getParent().name == "damage" && - evt.getParent().player == player && - evt.getParent().source && - evt.getParent().source == player - ); - }) - ).length; - if (num) player.addMark("dcxianjin", num, false); - }, - onremove: true, - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - filter(event, player) { - return player.countMark("dcxianjin") % 2 == 0; - }, - forced: true, - content() { - "step 0"; - var tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; - tags.removeArray(player.getStorage("dctuoyu")); - if (!tags.length) { - player.draw(player.isMaxHandcard() ? 1 : 3); - event.finish(); - } else if (tags.length == 1) { - event._result = { control: tags[0] }; - } else player.chooseControl(tags).set("prompt", "险峻:选择激活一个副区域标签"); - "step 1"; - var control = result.control; - game.log(player, "激活了副区域", "#y" + get.translation(control)); - player.markAuto("dctuoyu", [control]); - player.popup(get.translation(control + "_tag")); - if (player.isMaxHandcard()) player.draw(); - else player.draw(player.getStorage("dctuoyu").length); - }, - group: "dcxianjin_mark", - intro: { content: "已造成或受到#次伤害" }, - subSkill: { - mark: { - charlotte: true, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - forced: true, - popup: false, - firstDo: true, - content() { - player.addMark("dcxianjin", 1, false); - }, - }, - }, - ai: { - combo: "dctuoyu", - }, - }, - dcqijing: { - derivation: "dccuixin", - audio: 2, - trigger: { global: "phaseEnd" }, - filter(event, player) { - return player.getStorage("dctuoyu").length == 3; - }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "orange", - changeSeat: true, - content() { - "step 0"; - player.awakenSkill("dcqijing"); - player.loseMaxHp(); - player.addSkills("dccuixin"); - "step 1"; - if (game.countPlayer() > 2) { - if (player == trigger.player && !trigger.skill) { - var evt = trigger.getParent(); - if (evt.name == "phaseLoop" && evt._isStandardLoop) evt.player = player.next; - } - player - .chooseTarget( - "请选择一名要更换座次的角色,将自己移动到该角色的上家位置", - function (card, player, target) { - return target != player && target != player.next; - }, - true - ) - .set("ai", function (target) { - var player = _status.event.player; - var current = _status.currentPhase.next; - var max = 20, - att = 0; - while (max > 0) { - max--; - if (current == target) return att; - att -= get.attitude(player, current); - current = current.next; - } - return att; - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - game.broadcastAll( - function (target1, target2) { - game.swapSeat(target1, target2, null, true); - }, - player, - target - ); - } else event.finish(); - "step 3"; - player.insertPhase(); - }, - ai: { - combo: "dctuoyu", - }, - }, - dccuixin: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter(event, player) { - if ( - !event._dccuixin || - get.type(event.card, false) == "delay" || - get.type(event.card, false) == "equip" - ) - return false; - var card = { - name: event.card.name, - nature: event.card.nature, - isCard: true, - }, - list = event._dccuixin; - for (var target of list) { - var targetx = player[target](); - if (lib.filter.targetEnabled2(card, targetx, player)) return true; - } - return false; - }, - direct: true, - content() { - "step 0"; - var card = { - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - }; - event.card = card; - var list = []; - trigger._dccuixin.forEach((target) => { - var targetx = player[target](); - if (lib.filter.targetEnabled2(card, targetx, player)) list.add(targetx); - }); - if (list.length == 1) { - event.target = list[0]; - player - .chooseBool( - "摧心:是否视为对" + - get.translation(list[0]) + - "使用" + - get.translation(card) + - "?" - ) - .set("goon", get.effect(list[0], card, player, player) > 0) - .set("ai", () => _status.event.goon); - } else { - player - .chooseTarget( - "摧心:是否视为对上家或下家使用" + get.translation(card) + "?", - "操作提示:从上家或下家中选择一名角色作为使用目标", - function (card, player, target) { - return ( - (target == player.getNext() || target == player.getPrevious()) && - lib.filter.targetEnabled2( - _status.event.getParent().card, - target, - player - ) - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, _status.event.getParent().card, player, player); - }); - } - "step 1"; - if (result.bool) { - var target = event.target || result.targets[0]; - player.useCard(card, target, false, "dccuixin"); - } - }, - group: "dccuixin_silent", - subSkill: { - silent: { - trigger: { player: "useCardToPlayered" }, - silent: true, - forced: true, - popup: false, - firstDo: true, - charlotte: true, - filter(event, player) { - if (!event.isFirstTarget || event.getParent().skill == "dccuixin") return false; - if (event.targets.length == 0) return false; - return ( - event.targets.includes(player.getNext()) || - event.targets.includes(player.getPrevious()) - ); - }, - content() { - var list = []; - if (trigger.targets.includes(player.getNext())) list.push("getPrevious"); - if (trigger.targets.includes(player.getPrevious())) list.push("getNext"); - trigger.getParent()._dccuixin = list; - }, - }, - }, - }, - //海外神吕蒙 - twshelie: { - audio: "shelie", - inherit: "shelie", - prompt2: () => lib.translate.shelie_info, - group: "twshelie_jingce", - //什么精策技能啊喂! - subSkill: { - round: { charlotte: true }, - count: { - charlotte: true, - onremove: true, - intro: { - markcount(storage) { - return storage.length; - }, - content: "本回合已使用$花色的牌", - }, - }, - jingce: { - audio: "shelie", - trigger: { player: ["phaseJieshuBegin", "useCard1"] }, - filter(event, player) { - if (player.hasSkill("twshelie_round") || player != _status.currentPhase) - return false; - var list = []; - player.getHistory("useCard", function (evt) { - if ( - lib.suit.includes(get.suit(evt.card)) && - !list.includes(get.suit(evt.card)) - ) - list.push(get.suit(evt.card)); - }); - if (list.length) { - player.addTempSkill("twshelie_count"); - player.storage.twshelie_count = list.sort(function (a, b) { - return lib.suit.indexOf(b) - lib.suit.indexOf(a); - }); - player.markSkill("twshelie_count"); - player.syncStorage("twshelie_count"); - } - return event.name != "useCard" && list.length >= player.hp; - }, - forced: true, - locked: false, - content() { - "step 0"; - player.addTempSkill("twshelie_round", "roundStart"); - player - .chooseControl("摸牌阶段", "出牌阶段") - .set("prompt", "涉猎:请选择要执行的额外阶段"); - "step 1"; - if (result.index == 0) { - var next = player.phaseDraw(); - event.next.remove(next); - trigger.getParent().next.push(next); - } - if (result.index == 1) { - var next = player.phaseUse(); - event.next.remove(next); - trigger.getParent().next.push(next); - } - }, - }, - }, - }, - twgongxin: { - audio: "gongxin", - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("h"); - }); - }, - filterTarget(card, player, target) { - return target != player && target.countCards("h") > 0; - }, - usable: 1, - content() { - "step 0"; - event.num = target.getCards("h").reduce(function (arr, card) { - return arr.add(get.suit(card, player)), arr; - }, []).length; - "step 1"; - var cards = target.getCards("h"); - player - .chooseButton(2, ["攻心", cards, [["弃置此牌", "置于牌堆顶"], "tdnodes"]]) - .set("filterButton", function (button) { - var type = typeof button.link; - if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) - return false; - return true; - }) - .set("ai", function (button) { - var target = _status.event.target; - var type = typeof button.link; - if (type == "object") return get.value(button.link, target); - }); - "step 2"; - if (result.bool) { - if (typeof result.links[0] != "string") result.links.reverse(); - var card = result.links[1], - choice = result.links[0]; - if (choice == "弃置此牌") target.discard(card); - else { - player.showCards( - card, - get.translation(player) + "对" + get.translation(target) + "发动了【攻心】" - ); - target.lose(card, ui.cardPile, "visible", "insert"); - game.log(card, "被置于了牌堆顶"); - } - } - "step 3"; - if ( - event.num == - target.getCards("h").reduce(function (arr, card) { - return arr.add(get.suit(card, player)), arr; - }, []).length - ) - event.finish(); - "step 4"; - var num1 = 0; - for (var card of target.getCards("h")) { - if (get.color(card) == "red") num1++; - } - var num2 = target.countCards("h") - num1; - player - .chooseControl(["红色", "黑色", "cancel2"]) - .set("prompt", "是否令" + get.translation(target) + "本回合无法使用一种颜色的牌?") - .set("ai", function () { - return num1 >= num2 ? "红色" : "黑色"; - }); - "step 5"; - if (result.control != "cancel2") { - player.line(target); - target.addTempSkill("twgongxin2"); - target.markAuto("twgongxin2", [result.control == "红色" ? "red" : "black"]); - game.log(target, "本回合无法使用" + result.control + "牌"); - if (!event.isMine() && !event.isOnline()) game.delayx(); - } - }, - ai: { - order: 10, - expose: 0.25, - result: { - target(player, target) { - return -target.countCards("h"); - }, - }, - }, - }, - twgongxin2: { - mod: { - cardEnabled2(card, player) { - const color = get.color(card); - if (color != "unsure" && player.getStorage("twgongxin2").includes(color)) - return false; - }, - }, - charlotte: true, - onremove: true, - intro: { content: "本回合内不能使用或打出$牌" }, - }, - //神张角 - yizhao: { - audio: 2, - trigger: { - player: ["useCard", "respond"], - }, - forced: true, - filter(event, player) { - return typeof get.number(event.card) == "number"; - }, - marktext: "黄", - intro: { - name: "黄(异兆/肆军)", - name2: "黄", - content: "mark", - markcount(storage, player) { - return (storage || 0).toString().slice(-2); - }, - }, - content() { - "step 0"; - event.num = player.countMark("yizhao"); - player.addMark("yizhao", get.number(trigger.card)); - "step 1"; - var num = Math.floor(num / 10) % 10, - num2 = Math.floor(player.countMark("yizhao") / 10) % 10; - if (num != num2) { - var card = get.cardPile2((card) => { - return get.number(card, false) == num2; - }); - if (card) player.gain(card, "gain2"); - } - }, - mod: { - aiOrder(player, card, num) { - if (Math.floor((get.number(card) + (player.countMark("yizhao") % 10)) / 10) == 1) - return num + 10; - }, - }, - ai: { - threaten: 1.5, - effect: { - target(card, player, target, current) { - if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 0.1]; - }, - }, - }, - }, - sijun: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - return player.countMark("yizhao") > ui.cardPile.childNodes.length; - }, - check(event, player) { - return ui.cardPile.childNodes.length; - }, - content() { - "step 0"; - player.removeMark("yizhao", player.countMark("yizhao")); - game.washCard(); - "step 1"; - var pile = Array.from(ui.cardPile.childNodes); - if (pile.length < 3) return; - var bool = false, - max = Math.pow(2, Math.min(100, pile.length)), - index; - for (var i = 0; i < max; i++) { - var num = 0; - index = i.toString(2); - while (index.length < pile.length) { - index = "0" + index; - } - for (var k = 0; k < index.length; k++) { - if (index[k] == "1") num += get.number(pile[k]); - if (num > 36) break; - } - if (num == 36) { - bool = true; - break; - } - } - if (bool) { - var cards = []; - for (var k = 0; k < index.length; k++) { - if (index[k] == "1") cards.push(pile[k]); - } - player.gain(cards, "gain2"); - } - }, - ai: { - combo: "yizhao", - }, - }, - sanshou: { - audio: 2, - trigger: { player: "damageBegin4" }, - check(event, player) { - return get.damageEffect(player, event.source, player, event.nature) <= 0; - }, - content() { - "step 0"; - var cards = game.cardsGotoOrdering(get.cards(3)).cards; - event.cards = cards; - player.showCards(cards, get.translation(player) + "发动了【三首】"); - "step 1"; - var types = []; - types.addArray(game.getGlobalHistory("useCard").map((evt) => get.type2(evt.card))); - if (cards.filter((card) => !types.includes(get.type2(card))).length) { - trigger.cancel(); - } - game.delayx(); - }, - ai: { - effect: { - target(card, player, target) { - if (card.name == "shandian" || card.name == "fulei") return [0, 0.1]; - if (!get.tag(card, "damage")) return; - var types = [], - bool = 0; - types.addArray( - game.getGlobalHistory("useCard").map((evt) => get.type2(evt.card)) - ); - if (!types.includes(get.type2(card))) bool = 1; - if (types.length < 2) return Math.min(1, 0.4 + (types.length + bool) * 0.2); - }, - }, - }, - }, - tianjie: { - audio: 2, - trigger: { global: "phaseEnd" }, - direct: true, - filter(event, player) { - return ( - game.hasGlobalHistory("cardMove", (evt) => evt.washCard) && - game.hasPlayer((current) => current != player) - ); - }, - skillAnimation: true, - animationColor: "metal", - content() { - "step 0"; - player - .chooseTarget( - get.prompt("tianjie"), - "选择至多三名其他角色,依次对这些角色造成X点雷电伤害(X为其手牌中【闪】的数量,至少为1)", - [1, 3] - ) - .set("ai", (target) => { - var player = _status.event.player; - return ( - get.damageEffect(target, player, player, "thunder") * - Math.sqrt(Math.max(1, target.countCards("h", "shan"))) - ); - }); - "step 1"; - if (result.bool) { - var targets = result.targets; - targets.sortBySeat(); - player.logSkill("tianjie", targets); - for (var target of targets) { - var num = Math.max(1, target.countCards("h", "shan")); - target.damage(num, "thunder"); - } - } - }, - }, - shencai: { - audio: 2, - enable: "phaseUse", - usable: 5, - filter(event, player) { - var count = player.getStat("skill").shencai; - if (count && count > player.countMark("shencai")) return false; - return true; - }, - filterTarget: lib.filter.notMe, - onremove: true, - prompt: "选择一名其他角色进行地狱审判", - content() { - var next = target.judge(); - next.callback = lib.skill.shencai.contentx; - }, - ai: { - order: 8, - result: { target: -1 }, - }, - contentx() { - var card = event.judgeResult.card; - var player = event.getParent(2).player; - var target = event.getParent(2).target; - if (get.position(card, true) == "o") player.gain(card, "gain2"); - var list = [], - str = lib.skill.shencai.getStr(card); - for (var i in lib.skill.shencai.filterx) { - if (str.indexOf(lib.skill.shencai.filterx[i]) != -1) list.push("shencai_" + i); - } - if (list.length) { - for (var i in lib.skill.shencai.filterx) { - var num = target.countMark("shencai_" + i); - if (num > 0) { - target.removeMark("shencai_" + i, num); - target.removeSkill("shencai_" + i); - } - } - if (target.isIn()) { - for (var i of list) { - target.addSkill(i); - target.addMark(i, 1); - } - } - } else if (target.isIn()) { - player.gainPlayerCard(target, true, "hej"); - target.addMark("shencai_death", 1); - target.addSkill("shencai_death"); - } - }, - filterx: { - losehp: "体力", - weapon: "武器", - respond: "打出", - distance: "距离", - }, - getStr(node) { - var str = "", - name = node.name; - if (lib.translate[name + "_info"]) { - if (lib.card[name].type && lib.translate[lib.card[name].type]) - str += "" + get.translation(lib.card[name].type) + "牌|"; - if (get.subtype(name)) { - str += "" + get.translation(get.subtype(name)) + "|"; - } - if (lib.card[name] && lib.card[name].addinfomenu) { - str += "" + lib.card[name].addinfomenu + "|"; - } - if (get.subtype(name) == "equip1") { - var added = false; - if (lib.card[node.name] && lib.card[node.name].distance) { - var dist = lib.card[node.name].distance; - if (dist.attackFrom) { - added = true; - str += "攻击范围:" + (-dist.attackFrom + 1) + "|"; - } - } - if (!added) { - str += "攻击范围:1|"; - } - } - } - if (lib.card[name].cardPrompt) { - str += "" + lib.card[name].cardPrompt(node) + "|"; - } else if (lib.translate[name + "_info"]) { - str += "" + lib.translate[name + "_info"] + "|"; - } - if (lib.translate[name + "_append"]) { - str += "" + lib.translate[name + "_append"] + "|"; - } - if (get.is.yingbianConditional(node)) { - const yingbianEffects = get.yingbianEffects(node); - if (!yingbianEffects.length) { - const defaultYingbianEffect = get.defaultYingbianEffect(node); - if (lib.yingbian.prompt.has(defaultYingbianEffect)) - yingbianEffects.push(defaultYingbianEffect); - } - if (yingbianEffects.length) - str += `应变:${yingbianEffects - .map((value) => lib.yingbian.prompt.get(value)) - .join(";")}|`; - } - return str; - }, - subSkill: { - losehp: { - charlotte: true, - marktext: "笞", - trigger: { player: "damageEnd" }, - forced: true, - content() { - player.loseHp(trigger.num); - }, - ai: { - effect: { - target(card, player, target, current) { - if (get.tag(card, "damage") && current < 0) return 1.6; - }, - }, - }, - intro: { - name: "神裁 - 体力", - name2: "笞", - content: "锁定技。当你受到伤害后,你失去等量的体力。", - onunmark: true, - }, - }, - weapon: { - charlotte: true, - marktext: "杖", - trigger: { target: "useCardToTargeted" }, - forced: true, - filter(event, player) { - return event.card.name == "sha"; - }, - content() { - trigger.directHit.add(player); - game.log(player, "不可响应", trigger.card); - }, - intro: { - name: "神裁 - 武器", - name2: "杖", - content: "锁定技。当你成为【杀】的目标后,你不能使用牌响应此【杀】。", - onunmark: true, - }, - global: "shencai_weapon_ai", - }, - ai: { - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if (!arg || !arg.card || arg.card.name != "sha") return false; - if (!arg.target || !arg.target.hasSkill("shencai_weapon")) return false; - return true; - }, - }, - }, - respond: { - charlotte: true, - marktext: "徒", - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - filter(event, player) { - if ( - !player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "shencai_respond"); - }, "h") - ) - return false; - var evt = event.getParent("shencai_respond"); - if (evt && evt.player == player) return false; - evt = event.getl(player); - return evt && evt.hs && evt.hs.length > 0; - }, - content() { - var cards = player.getCards("h", function (card) { - return lib.filter.cardDiscardable(card, player, "shencai_respond"); - }); - if (cards.length > 0) player.discard(cards.randomGet()); - }, - intro: { - name: "神裁 - 打出", - name2: "徒", - content: "锁定技。当你失去手牌后,你随机弃置一张手牌(不嵌套触发)。", - onunmark: true, - }, - }, - distance: { - charlotte: true, - marktext: "流", - trigger: { player: "phaseJieshuBegin" }, - forced: true, - content() { - player.turnOver(); - }, - intro: { - name: "神裁 - 距离", - name2: "流", - content: "锁定技。结束阶段开始时,你翻面。", - onunmark: true, - }, - }, - death: { - charlotte: true, - marktext: "死", - mod: { - maxHandcard(player, num) { - return num - player.countMark("shencai_death"); - }, - }, - trigger: { player: "phaseEnd" }, - forced: true, - filter(event, player) { - return player.countMark("shencai_death") > game.countPlayer(); - }, - content() { - player.die(); - }, - intro: { - name: "神裁 - 死", - name2: "死", - content: - "锁定技。你的角色手牌上限-#;回合结束时,若场上存活人数小于#,则你死亡。", - onunmark: true, - }, - }, - }, - intro: { - content: "发动次数上限+#", - }, - }, - xunshi: { - audio: 2, - mod: { - cardname(card) { - if (lib.skill.xunshi.isXunshi(card)) return "sha"; - }, - cardnature(card) { - if (lib.skill.xunshi.isXunshi(card)) return false; - }, - suit(card) { - if (lib.skill.xunshi.isXunshi(card)) return "none"; - }, - targetInRange(card) { - const suit = get.color(card); - if (suit == "none" || suit == "unsure") return true; - }, - cardUsable(card) { - const suit = get.color(card); - if (suit == "none" || suit == "unsure") return Infinity; - }, - }, - isXunshi(card) { - var info = lib.card[card.name]; - if (!info || (info.type != "trick" && info.type != "delay")) return false; - if (info.notarget) return false; - if (info.selectTarget != undefined) { - if (Array.isArray(info.selectTarget)) { - if (info.selectTarget[0] < 0) return !info.toself; - return info.selectTarget[0] != 1 || info.selectTarget[1] != 1; - } else { - if (info.selectTarget < 0) return !info.toself; - return info.selectTarget != 1; - } - } - return false; - }, - trigger: { player: "useCard2" }, - forced: true, - filter(event, player) { - return get.color(event.card) == "none"; - }, - content() { - "step 0"; - if (player.countMark("shencai") < 4 && player.hasSkill("shencai", null, null, false)) - player.addMark("shencai", 1, false); - if (trigger.addCount !== false) { - trigger.addCount = false; - var stat = player.getStat().card, - name = trigger.card.name; - if (typeof stat[name] == "number") stat[name]--; - } - var info = get.info(trigger.card); - if (info.allowMultiple == false) event.finish(); - else if (trigger.targets && !info.multitarget) { - if ( - !game.hasPlayer(function (current) { - return ( - !trigger.targets.includes(current) && - lib.filter.targetEnabled2(trigger.card, player, current) - ); - }) - ) - event.finish(); - } else event.finish(); - "step 1"; - var prompt2 = "为" + get.translation(trigger.card) + "增加任意个目标"; - player - .chooseTarget( - get.prompt("xunshi"), - function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2(_status.event.card, player, target) - ); - }, - [1, Infinity] - ) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - "step 2"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 3"; - if (event.targets) { - player.line(event.targets, "fire"); - trigger.targets.addArray(event.targets); - } - }, - }, - twwushen: { - mod: { - cardname(card, player, name) { - if (get.suit(card) == "heart") return "sha"; - }, - cardnature(card, player) { - if (get.suit(card) == "heart") return false; - }, - targetInRange(card) { - if (card.name === "sha") { - const suit = get.suit(card); - if (suit === "heart" || suit === "unsure") return true; - } - }, - cardUsable(card) { - if (card.name === "sha") { - const suit = get.suit(card); - if (suit === "heart" || suit === "unsure") return Infinity; - } - }, - }, - audio: "wushen", - trigger: { player: "useCard2" }, - forced: true, - filter(event, player) { - return ( - event.card.name == "sha" && - (get.suit(event.card) == "heart" || - !player.hasSkill("twwushen_phase", null, null, false)) - ); - }, - logTarget(event, player) { - if (get.suit(event.card) == "heart") { - var targets = game.filterPlayer(function (current) { - return ( - !event.targets.includes(current) && - current.hasMark("twwuhun") && - lib.filter.targetEnabled(event.card, player, current) - ); - }); - if (targets.length) { - return targets.sortBySeat(); - } - } - return null; - }, - content() { - if (!player.hasSkill("twwushen_phase", null, null, false)) { - trigger.directHit.addArray(game.players); - player.addTempSkill("twwushen_phase", [ - "phaseZhunbeiAfter", - "phaseJudgeAfter", - "phaseDrawAfter", - "phaseUseAfter", - "phaseDiscardAfter", - "phaseJieshuAfter", - ]); - } - if (get.suit(trigger.card) == "heart") { - if (trigger.addCount !== false) { - trigger.addCount = false; - if (player.stat[player.stat.length - 1].card.sha > 0) { - player.stat[player.stat.length - 1].card.sha--; - } - } - var targets = game.filterPlayer(function (current) { - return ( - !trigger.targets.includes(current) && - current.hasMark("twwuhun") && - lib.filter.targetEnabled(trigger.card, player, current) - ); - }); - if (targets.length) { - trigger.targets.addArray(targets.sortBySeat()); - game.log(targets, "也成为了", trigger.card, "的目标"); - } - } - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - return ( - arg.card.name == "sha" && !player.hasSkill("twwushen_phase", null, null, false) - ); - }, - }, - subSkill: { phase: { charlotte: true } }, - shaRelated: true, - }, - twwuhun: { - audio: 2, - trigger: { player: "die" }, - forceDie: true, - skillAnimation: true, - animationColor: "soil", - locked: true, - check(event, player) { - return game.hasPlayer(function (current) { - return ( - current != player && - current.hasMark("twwuhun") && - get.attitude(player, current) < 0 - ); - }); - }, - content() { - "step 0"; - player - .judge(function (card) { - var name = get.name(card, false); - if (name == "tao" || name == "taoyuan") return -25; - return 15; - }) - .set("forceDie", true).judge2 = function (result) { - return result.bool; - }; - "step 1"; - var num = game.countPlayer(function (current) { - return current != player && current.hasMark("twwuhun"); - }); - if (result.bool && num > 0) { - player - .chooseTarget( - "请选择【武魂】的目标", - "选择至少一名拥有“梦魇”标记的角色。令这些角色各自失去X点体力(X为其“梦魇”标记数)", - true, - [1, num], - function (card, player, target) { - return target != player && target.hasMark("twwuhun"); - } - ) - .set("forceDie", true) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - } else event.finish(); - "step 2"; - var targets = result.targets.sortBySeat(); - player.line(targets, "fire"); - event.targets = targets; - "step 3"; - var target = targets.shift(); - var num = target.countMark("twwuhun"); - if (num > 0) target.loseHp(num); - if (targets.length > 0) event.redo(); - }, - marktext: "魇", - intro: { - name: "梦魇", - content: "mark", - onunmark: true, - }, - group: "twwuhun_gain", - subSkill: { - gain: { - audio: "twwuhun", - trigger: { - player: "damageEnd", - source: "damageSource", - }, - forced: true, - filter(event, player, name) { - if (event.player == event.source) return false; - var target = lib.skill.twwuhun_gain.logTarget(event, player); - if (!target || !target.isIn()) return false; - return name == "damageEnd" || target.hasMark("twwuhun"); - }, - logTarget(event, player) { - if (player == event.player) return event.source; - return event.player; - }, - content() { - var target = lib.skill.twwuhun_gain.logTarget(trigger, player); - target.addMark("twwuhun", player == trigger.source ? 1 : trigger.num); - game.delayx(); - }, - }, - }, - ai: { - notemp: true, - maixie_defend: true, - effect: { - target: (card, player, target) => { - if (!get.tag(card, "damage") || !target.hasFriend()) return; - let die = [], - extra = [null, 0], - temp; - game.filterPlayer((i) => { - if (!i.hasMark("twwuhun")) return false; - temp = get.attitude(target, i); - if (temp < 0) die.push(i); - else { - temp = Math.sqrt(temp) * i.countMark("twwuhun"); - if (!extra[0] || temp < extra[1]) extra = [i, temp]; - } - }); - if (extra[0] && !die.length) die.push(extra[0]); - if ( - target.hp + target.hujia > 1 && - (!die.length || get.attitude(player, target) <= 0) - ) - die.add(player); - if (die.length) - return [ - 1, - 0, - 1, - die.reduce((num, i) => { - return (num -= 2 * get.sgnAttitude(player, i)); - }, 0), - ]; - }, - }, - }, - }, - shouli: { - audio: 2, - mod: { - cardUsable(card) { - if (card.storage && card.storage.shouli) return Infinity; - }, - }, - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard(player, name) { - if (player != _status.currentPhase && (name == "sha" || name == "shan")) return true; - }, - filter(event, player) { - if (event.responded || event.shouli || event.type == "wuxie") return false; - if ( - game.hasPlayer(function (current) { - return current.getCards("e", (card) => get.is.attackingMount(card)).length > 0; - }) && - event.filterCard( - get.autoViewAs( - { - name: "sha", - storage: { shouli: true }, - }, - "unsure" - ), - player, - event - ) - ) - return true; - if ( - game.hasPlayer(function (current) { - return current.getCards("e", (card) => get.is.defendingMount(card)).length > 0; - }) && - event.filterCard( - get.autoViewAs( - { - name: "shan", - storage: { shouli: true }, - }, - "unsure" - ), - player, - event - ) - ) - return true; - return false; - }, - delay: false, - locked: false, - filterTarget(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: { shouli: true }, - }, - [card] - ), - player, - event - ) - ) - ) - return true; - return equip4.some((card) => { - var sha = get.autoViewAs( - { - name: "sha", - storage: { shouli: 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() { - "step 0"; - var evt = event.getParent(2); - evt.set("shouli", 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: { shouli: 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: { shouli: 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.shouli_backup.viewAs = { - name: name, - cards: [result], - storage: { shouli: true }, - }; - lib.skill.shouli_backup.prompt = - "选择" + - get.translation(name) + - "(" + - get.translation(result) + - ")的目标"; - }, - result.links[0], - name - ); - evt.set("_backupevent", "shouli_backup"); - evt.backup("shouli_backup"); - evt.set( - "openskilldialog", - "选择" + - get.translation(name) + - "(" + - get.translation(result.links[0]) + - ")的目标" - ); - evt.set("norestore", true); - evt.set("custom", { - add: {}, - replace: { window() { } }, - }); - } else { - delete evt.result.skill; - delete evt.result.used; - evt.result.card = get.autoViewAs( - { - name: name, - cards: [result.links[0]], - storage: { shouli: true }, - }, - result.links - ); - evt.result.cards = [result.links[0]]; - target.$give(result.links[0], player, false); - if (player != target) target.addTempSkill("fengyin"); - target.addTempSkill("shouli_thunder"); - player.addTempSkill("shouli_thunder"); - evt.redo(); - return; - } - } - evt.goto(0); - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter(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(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: "shouli_init", - subSkill: { - thunder: { - charlotte: true, - trigger: { player: "damageBegin1" }, - forced: true, - mark: true, - content() { - 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: "shouli", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - logTarget: () => game.filterPlayer(), - content() { - "step 0"; - var targets = game.filterPlayer().sortBySeat(player.getNext()); - event.targets = targets; - event.num = 0; - "step 1"; - var target = event.targets[num]; - if (target.isIn()) { - var card = get.cardPile2(function (card) { - if (get.cardtag(card, "gifts")) return false; - var type = get.subtype(card); - if (type != "equip3" && type != "equip4" && type != "equip6") - return false; - return target.canUse(card, target); - }); - if (card) target.chooseUseTarget(card, "nopopup", "noanimate", true); - } - event.num++; - if (event.num < targets.length) event.redo(); - }, - }, - }, - }, - shouli_backup: { - sourceSkill: "shouli", - precontent() { - "step 0"; - delete event.result.skill; - var cards = event.result.card.cards; - event.result.cards = cards; - var owner = get.owner(cards[0]); - event.target = owner; - owner.$give(cards[0], player, false); - player.popup(event.result.card.name, "metal"); - game.delayx(); - event.getParent().addCount = false; - "step 1"; - if (player != target) target.addTempSkill("fengyin"); - target.addTempSkill("shouli_thunder"); - player.addTempSkill("shouli_thunder"); - }, - filterCard() { - return false; - }, - prompt: "请选择【杀】的目标", - selectCard: -1, - }, - hengwu: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - frequent: true, - filter(event, player) { - var suit = get.suit(event.card); - if ( - !lib.suit.includes(suit) || - player.hasCard(function (card) { - return get.suit(card, player) == suit; - }, "h") - ) - return false; - return game.hasPlayer(function (current) { - return current.hasCard(function (card) { - return get.suit(card, current) == suit; - }, "e"); - }); - }, - content() { - var suit = get.suit(trigger.card); - player.draw( - game.countPlayer(function (current) { - return current.countCards("e", function (card) { - return get.suit(card, current) == suit; - }); - }) - ); - }, - ai: { - 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, - 0.8 * - 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]; - }, - }, - }, - }, - changandajian_equip5: { - equipSkill: true, - mod: { maxHandcard: (player, num) => num + 2 }, - }, - changandajian_destroy: { - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - charlotte: true, - equipSkill: true, - filter(event, player) { - var evt = event.getl(player); - if (!evt || !evt.es || !evt.es.length) return false; - for (var i of evt.es) { - if (i.name.indexOf("changandajian_equip") == 0) return true; - } - return false; - }, - getEffect(player, target) { - if (player == target) return 0; - var getRaw = function () { - var att = get.attitude(player, target); - if (att > 0) { - if ( - target.countCards("j", function (card) { - var cardj = card.viewAs ? { name: card.viewAs } : card; - return get.effect(target, cardj, target, player) < 0; - }) > 0 - ) - return 3; - if ( - target.getEquip("baiyin") && - target.isDamaged() && - get.recoverEffect(target, player, player) > 0 - ) { - if (target.hp == 1 && !target.hujia) return 1.6; - } - if ( - target.countCards("e", function (card) { - if (get.position(card) == "e") return get.value(card, target) < 0; - }) > 0 - ) - return 1; - } - var es = target.getCards("e"); - var noe = es.length == 0 || target.hasSkillTag("noe"); - var noe2 = - es.filter(function (esx) { - return get.value(esx, target) > 0; - }).length == 0; - if (noe || noe2) return 0; - if (att <= 0 && !target.countCards("e")) return 1.5; - return -1.5; - }; - return getRaw() * get.attitude(player, target); - }, - content() { - "step 0"; - var num = 0, - recover = 0; - var evt = trigger.getl(player); - for (var i of evt.es) { - if (i.name.indexOf("changandajian_equip") == 0) num++; - if (i.name == "changandajian_equip2") recover++; - } - if (recover > 0) player.recover(recover); - event.count = num; - if ( - !game.hasPlayer(function (current) { - return current.countCards("ej") > 0; - }) - ) - event.finish(); - "step 1"; - event.count--; - player - .chooseTarget( - true, - "选择一名装备区或判定区有牌的角色", - function (card, player, target) { - return target.countCards("ej") > 0; - } - ) - .set("ai", function (target) { - return lib.skill.changandajian_destroy.getEffect(_status.event.player, target); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - player.choosePlayerCard(target, true, "ej"); - } else event.finish(); - "step 3"; - if (result.bool) { - var card = result.cards[0]; - var num = get.number(card); - if ([1, 11, 12, 13].includes(num)) { - if (lib.filter.canBeGained(card, player, target)) - player.gain(card, target, "give", "bySelf"); - } else if (lib.filter.canBeDiscarded(card, player, target)) target.discard(card); - } else event.finish(); - "step 4"; - if ( - event.count > 0 && - game.hasPlayer(function (current) { - return current.countCards("ej") > 0; - }) - ) - event.goto(1); - }, - }, - dili: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - if (player.storage.dili) return false; - if (event.name != "phase") return true; - if (game.phaseNumber == 0) return true; - //让神山识能够获得东吴命运线 - return player.name == "key_shiki"; - }, - content() { - player.storage.dili = true; - var skill = [ - "dili_shengzhi", - "dili_chigang", - "dili_qionglan", - "dili_quandao", - "dili_jiaohui", - "dili_yuanlv", - ].randomGet(); - player.addSkill(skill); - game.log( - player, - '解锁了东吴命运线:', - "#g【" + get.translation(skill) + "】" - ); - }, - derivation: [ - "dili_shengzhi", - "dili_chigang", - "dili_qionglan", - "dili_quandao", - "dili_jiaohui", - "dili_yuanlv", - "gzyinghun", - "hongde", - "rebingyi", - "xinfu_guanwei", - "bizheng", - "xinanguo", - "shelie", - "wengua", - "rebotu", - "rezhiheng", - "jiexun", - "reanxu", - "xiashu", - "rejieyin", - "oldimeng", - "xinfu_guanchao", - "drlt_jueyan", - "lanjiang", - ], - subSkill: { - shengzhi: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - filter(event, player) { - var num = get.number(event.card); - if (typeof num != "number") return false; - if (num <= 1) return false; - for (var i = 2; i <= Math.sqrt(num); i++) { - if (num % i == 0) return false; - } - if (!player.storage.yuheng) return false; - var list = ["gzyinghun", "hongde", "rebingyi"]; - for (var i of list) { - if (!player.storage.yuheng.includes(i)) return false; - } - return true; - }, - content() { - trigger.directHit.addArray( - game.filterPlayer(function (current) { - return current != player; - }) - ); - }, - init(player, skill) { - player.markAuto("yuheng_current", ["gzyinghun", "hongde", "rebingyi"]); - }, - mark: true, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if (arg && arg.card) { - var num = get.number(arg.card); - if (typeof num != "number") return false; - if (num <= 1) return false; - for (var i = 2; i <= Math.sqrt(num); i++) { - if (num % i == 0) return false; - } - return true; - } - return false; - }, - }, - intro: { - name: "命运线:圣质", - content(storage, player) { - var finished = [], - unfinished = ["gzyinghun", "hongde", "rebingyi"]; - if (player.storage.yuheng) { - for (var i = 0; i < unfinished.length; i++) { - if (player.storage.yuheng.includes(unfinished[i])) { - finished.push(unfinished[i]); - unfinished.splice(i--, 1); - } - } - } - var str = ""; - if (unfinished.length) - str += "
  • 未获得:" + get.translation(unfinished) + "
    "; - if (finished.length) - str += "
  • 已获得过:" + get.translation(finished) + "
    "; - str += - "
  • 锁定技。若你因〖驭衡〗获得过〖英魂〗〖弘德〗〖秉壹〗,则当你使用点数为质数的牌时,此牌不可被响应。"; - return str; - }, - }, - }, - chigang: { - audio: 2, - trigger: { player: "phaseJudgeBefore" }, - forced: true, - filter(event, player) { - if (!player.storage.yuheng) return false; - var list = ["xinfu_guanwei", "bizheng", "xinanguo"]; - for (var i of list) { - if (!player.storage.yuheng.includes(i)) return false; - } - return true; - }, - content() { - trigger.cancel(); - var next = player.phaseDraw(); - event.next.remove(next); - trigger.getParent().next.push(next); - }, - init(player, skill) { - player.markAuto("yuheng_current", ["xinfu_guanwei", "bizheng", "xinanguo"]); - }, - ai: { - effect: { - target(card) { - if (get.type(card) == "delay") return "zerotarget"; - }, - }, - }, - mark: true, - intro: { - name: "命运线:持纲", - content(storage, player) { - var finished = [], - unfinished = ["xinfu_guanwei", "bizheng", "xinanguo"]; - if (player.storage.yuheng) { - for (var i = 0; i < unfinished.length; i++) { - if (player.storage.yuheng.includes(unfinished[i])) { - finished.push(unfinished[i]); - unfinished.splice(i--, 1); - } - } - } - var str = ""; - if (unfinished.length) - str += "
  • 未获得:" + get.translation(unfinished) + "
    "; - if (finished.length) - str += "
  • 已获得过:" + get.translation(finished) + "
    "; - str += - "
  • 锁定技。若你因〖驭衡〗获得过〖观微〗〖弼政〗〖安国〗,则当你的判定阶段开始前,你跳过此阶段并获得一个额外的摸牌阶段。"; - return str; - }, - }, - }, - qionglan: { - audio: 2, - init(player, skill) { - player.markAuto("yuheng_current", ["shelie", "wengua", "rebotu"]); - }, - trigger: { player: "useSkillAfter" }, - forced: true, - limited: true, - filter(event, player) { - if (!player.storage.yuheng || event.skill != "yuheng") return false; - var list = ["shelie", "wengua", "rebotu"]; - for (var i of list) { - if (!player.storage.yuheng.includes(i)) return false; - } - return true; - }, - content() { - player.awakenSkill("dili_qionglan"); - var list = [ - "dili_shengzhi", - "dili_chigang", - "dili_quandao", - "dili_jiaohui", - "dili_yuanlv", - ]; - var list2 = list.randomRemove(2); - if (list2.includes("dili_quandao") && list2.includes("dili_jiaohui")) { - list2.randomRemove(1); - list2.push(list.randomGet()); - } - for (var skill of list2) { - player.addSkill(skill); - game.log( - player, - '解锁了东吴命运线:', - "#g【" + get.translation(skill) + "】" - ); - } - }, - mark: true, - intro: { - name: "命运线:穹览", - content(storage, player) { - var finished = [], - unfinished = ["shelie", "wengua", "rebotu"]; - if (player.storage.yuheng) { - for (var i = 0; i < unfinished.length; i++) { - if (player.storage.yuheng.includes(unfinished[i])) { - finished.push(unfinished[i]); - unfinished.splice(i--, 1); - } - } - } - var str = ""; - if (unfinished.length) - str += "
  • 未获得:" + get.translation(unfinished) + "
    "; - if (finished.length) - str += "
  • 已获得过:" + get.translation(finished) + "
    "; - str += - '
  • 锁定技,限定技。若你因〖驭衡〗获得过〖涉猎〗〖问卦〗〖博图〗,则当你发动的〖驭衡〗结算结束后,你随机获得两条其他东吴命运线。'; - return str; - }, - }, - }, - quandao: { - audio: 2, - mod: { - cardname(card, player) { - if (player.storage.yuheng && [1, 11, 12, 13].includes(card.number)) { - var list = ["rezhiheng", "jiexun", "reanxu"]; - for (var i of list) { - if (!player.storage.yuheng.includes(i)) return; - } - return "tiaojiyanmei"; - } - }, - }, - init(player, skill) { - player.markAuto("yuheng_current", ["rezhiheng", "jiexun", "reanxu"]); - }, - mark: true, - intro: { - name: "命运线:权道", - content(storage, player) { - var finished = [], - unfinished = ["rezhiheng", "jiexun", "reanxu"]; - if (player.storage.yuheng) { - for (var i = 0; i < unfinished.length; i++) { - if (player.storage.yuheng.includes(unfinished[i])) { - finished.push(unfinished[i]); - unfinished.splice(i--, 1); - } - } - } - var str = ""; - if (unfinished.length) - str += "
  • 未获得:" + get.translation(unfinished) + "
    "; - if (finished.length) - str += "
  • 已获得过:" + get.translation(finished) + "
    "; - str += - "
  • 锁定技。若你因〖驭衡〗获得过〖制衡〗〖诫训〗〖安恤〗,则你手牌区内点数为字母的牌的牌名视为【调剂盐梅】。"; - return str; - }, - }, - }, - jiaohui: { - audio: 2, - mod: { - cardname(card, player) { - if (player.countCards("h") == 1 && player.storage.yuheng) { - var list = ["xiashu", "rejieyin", "oldimeng"]; - for (var i of list) { - if (!player.storage.yuheng.includes(i)) return; - } - return "yuanjiao"; - } - }, - }, - init(player, skill) { - player.markAuto("yuheng_current", ["xiashu", "rejieyin", "oldimeng"]); - }, - mark: true, - intro: { - name: "命运线:交辉", - content(storage, player) { - var finished = [], - unfinished = ["xiashu", "rejieyin", "oldimeng"]; - if (player.storage.yuheng) { - for (var i = 0; i < unfinished.length; i++) { - if (player.storage.yuheng.includes(unfinished[i])) { - finished.push(unfinished[i]); - unfinished.splice(i--, 1); - } - } - } - var str = ""; - if (unfinished.length) - str += "
  • 未获得:" + get.translation(unfinished) + "
    "; - if (finished.length) - str += "
  • 已获得过:" + get.translation(finished) + "
    "; - str += - "
  • 锁定技。若你因〖驭衡〗获得过〖下书〗〖结姻〗〖缔盟〗,且你的手牌数为1,则此牌的牌名视为【远交近攻】。"; - return str; - }, - }, - }, - yuanlv: { - audio: 2, - init(player, skill) { - player.markAuto("yuheng_current", ["xinfu_guanchao", "drlt_jueyan", "lanjiang"]); - }, - trigger: { player: "useCardToTargeted" }, - forced: true, - filter(event, player) { - if ( - get.type(event.card, false) != "equip" || - player != event.target || - event.card.name.indexOf("changandajian_equip") == 0 - ) - return false; - if (!player.storage.yuheng) return false; - var list = ["xinfu_guanchao", "drlt_jueyan", "lanjiang"]; - for (var i of list) { - if (!player.storage.yuheng.includes(i)) return false; - } - var type = get.subtype(event.card); - if (lib.card["changandajian_" + type] && player.hasEquipableSlot(type)) - return true; - return false; - }, - content() { - var cards = trigger.cards.filterInD(); - if (cards.length > 0) game.cardsDiscard(cards); - var type = get.subtype(trigger.card); - var card = game.createCard( - "changandajian_" + type, - Math.random() < 0.5 ? "spade" : "heart", - 10 - ); - player.useCard(card, player); - }, - mark: true, - intro: { - name: "命运线:渊虑", - content(storage, player) { - var finished = [], - unfinished = ["xinfu_guanchao", "drlt_jueyan", "lanjiang"]; - if (player.storage.yuheng) { - for (var i = 0; i < unfinished.length; i++) { - if (player.storage.yuheng.includes(unfinished[i])) { - finished.push(unfinished[i]); - unfinished.splice(i--, 1); - } - } - } - var str = ""; - if (unfinished.length) - str += "
  • 未获得:" + get.translation(unfinished) + "
    "; - if (finished.length) - str += "
  • 已获得过:" + get.translation(finished) + "
    "; - str += - "
  • 锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜江〗,则当你成为自己使用的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。"; - return str; - }, - }, - }, - }, - }, - yuheng: { - audio: 2, - enable: "phaseUse", - usable: 1, - content() { - var skills = player.getSkills(null, false, false).filter(function (i) { - if (i == "yuheng") return false; - var info = get.info(i); - return info && !info.charlotte && !get.is.locked(i); - }); - if (skills.length) { - player.removeSkills(skills); - } - //初始化技能库 - var list1 = [ - "dili_shengzhi", - "dili_chigang", - "dili_qionglan", - "dili_quandao", - "dili_jiaohui", - "dili_yuanlv", - ]; - var list2 = [ - "gzyinghun", - "hongde", - "rebingyi", - "xinfu_guanwei", - "bizheng", - "xinanguo", - "shelie", - "wengua", - "rebotu", - "rezhiheng", - "jiexun", - "reanxu", - "xiashu", - "rejieyin", - "oldimeng", - "xinfu_guanchao", - "drlt_jueyan", - "lanjiang", - ]; - var list3 = []; - if (!player.storage.yuheng_full) player.storage.yuheng_full = list2.slice(0); - if (player.getStorage("yuheng_current").length == 0) { - for (var i = 0; i < list1.length; i++) { - if (player.hasSkill(list1[i])) { - for (var j = 0; j < 3; j++) { - list3.add(list2[i * 3 + j]); - } - } - } - if (!player.storage.yuheng_current) player.storage.yuheng_current = list3.slice(0); - } - var fullskills, currentskills; - //决定抽选技能范围 - if (player.storage.yuheng_full && player.storage.yuheng_full.length) - fullskills = player.storage.yuheng_full; - else fullskills = list2.slice(0); - if (player.storage.yuheng_current && player.storage.yuheng_current.length) - currentskills = player.storage.yuheng_current; - else currentskills = list3.slice(0); - var skills = []; - //在没有发动过其他非锁定技时抽选技能 - var evtx = event.getParent("phaseUse"); - if ( - currentskills.length > 0 && - !player.hasHistory("useSkill", function (evt) { - if (evt.skill == "yuheng" || evt.type != "player" || !evt.sourceSkill) - return false; - var info1 = get.info(evt.skill); - if (info1.charlotte) return false; - var info = get.info(evt.sourceSkill); - if (info.charlotte || get.is.locked(evt.skill)) return false; - return evt.event.getParent("phaseUse") == evtx; - }) - ) { - fullskills.randomSort(); - currentskills.randomSort(); - for (var i = 0; i < fullskills.length; i++) { - for (var j = 0; j < currentskills.length; j++) { - if ( - fullskills[i] != currentskills[j] || - (i == fullskills.length - 1 && j == currentskills.length - 1) - ) { - skills.add(fullskills.splice(i--, 1)[0]); - skills.add(currentskills.splice(j--, 1)[0]); - break; - } - } - if (skills.length > 0) break; - } - } - //在已经发动过其他非锁定技时抽选技能 - else { - skills.add(fullskills.randomRemove(1)[0]); - } - for (var i of skills) { - player.addSkills(i); - } - player.markAuto("yuheng", skills); - }, - ai: { - order(item, player) { - var evtx = _status.event.getParent("phaseUse"); - if ( - !player.hasHistory("useSkill", function (evt) { - if (evt.skill == "yuheng" || evt.type != "player" || !evt.sourceSkill) - return false; - var info1 = get.info(evt.skill); - if (info1.charlotte) return false; - var info = get.info(evt.sourceSkill); - if (info.charlotte || get.is.locked(evt.skill)) return false; - return evt.event.getParent("phaseUse") == evtx; - }) - ) - return 11; - return 0.8; - }, - result: { player: 1 }, - }, - group: "yuheng_losehp", - subSkill: { - losehp: { - trigger: { player: "phaseUseEnd" }, - forced: true, - locked: false, - filter(event, player) { - return !player.hasHistory("useSkill", function (evt) { - if (evt.skill != "yuheng") return false; - return evt.event.getParent("phaseUse") == event; - }); - }, - content() { - player.loseHp(); - }, - }, - }, - }, - jiufa: { - audio: 2, - trigger: { player: ["useCardAfter", "respondAfter"] }, - frequent: true, - filter(event, player) { - return event.jiufa_counted && player.getStorage("jiufa").length >= 9; - }, - content() { - "step 0"; - player.unmarkSkill("jiufa"); - event.cards = get.cards(9); - event.cards.sort(function (a, b) { - return get.number(b) - get.number(a); - }); - game.cardsGotoOrdering(event.cards); - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (player, id, cards) { - var str; - if (player == game.me && !_status.auto) { - str = "九伐:选择任意张点数满足条件的牌"; - } else { - 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 next = player.chooseButton([0, 9], true); - next.set("dialog", event.videoId); - next.set("filterButton", function (button) { - var num = get.number(button.link), - cards = _status.event.getParent().cards; - for (var i of ui.selected.buttons) { - if (get.number(i.link) == num) return false; - } - for (var i of cards) { - if (i != button.link && get.number(i) == num) return true; - } - return false; - }); - next.set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - "step 2"; - if (result.bool && result.links && result.links.length) { - event.cards2 = result.links; - } - var time = 1000 - (get.utc() - event.time); - if (time > 0) { - game.delay(0, time); - } - "step 3"; - game.broadcastAll("closeDialog", event.videoId); - var cards2 = event.cards2; - if (cards2 && cards2.length) player.gain(cards2, "log", "gain2"); - }, - marktext: "⑨", - intro: { - content: "已记录牌名:$", - onunmark: true, - }, - group: "jiufa_count", - subSkill: { - count: { - trigger: { player: ["useCard1", "respond"] }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - filter(event, player) { - return !player.getStorage("jiufa").includes(event.card.name); - }, - content() { - trigger.jiufa_counted = true; - player.markAuto("jiufa", [trigger.card.name]); - }, - }, - }, - }, - tianren: { - audio: 2, - trigger: { global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter"] }, - forced: true, - filter(event, player) { - if (event.name.indexOf("lose") == 0) { - if (event.getlx === false || event.position != ui.discardPile) return false; - } else { - var evt = event.getParent(); - if (evt.relatedEvent && evt.relatedEvent.name == "useCard") return false; - } - for (var i of event.cards) { - var owner = false; - if (event.hs && event.hs.includes(i)) owner = event.player; - var type = get.type(i, null, owner); - if (type == "basic" || type == "trick") return true; - } - return false; - }, - content() { - var num = 0; - for (var i of trigger.cards) { - var owner = false; - if (trigger.hs && trigger.hs.includes(i)) owner = trigger.player; - var type = get.type(i, null, owner); - if (type == "basic" || type == "trick") num++; - } - player.addMark("tianren", num); - }, - group: "tianren_maxHp", - intro: { content: "mark" }, - subSkill: { - maxHp: { - trigger: { player: ["tianrenAfter", "gainMaxHpAfter", "loseMaxHpAfter"] }, - forced: true, - filter(event, player) { - return player.countMark("tianren") >= player.maxHp; - }, - content() { - player.removeMark("tianren", player.maxHp); - player.gainMaxHp(); - player.draw(2); - }, - }, - }, - }, - pingxiang: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "ice", - filter(event, player) { - return player.maxHp > 9; - }, - content() { - "step 0"; - player.awakenSkill("pingxiang"); - player.loseMaxHp(9); - event.num = 0; - "step 1"; - event.num++; - player.chooseUseTarget( - { - name: "sha", - nature: "fire", - isCard: true, - }, - "请选择火【杀】的目标(" + (event.num == 9 ? "⑨" : event.num) + "/9)", - false - ); - "step 2"; - if (result.bool && event.num < 9) event.goto(1); - else player.removeSkills("jiufa"); - "step 3"; - player.addSkill("pingxiang_effect"); - }, - ai: { - order() { - return get.order({ - name: "sha", - nature: "fire", - isCard: true, - }); - }, - result: { - player(player) { - if ( - player.hasValueTarget({ - name: "sha", - nature: "fire", - isCard: true, - }) - ) - return 1; - return 0; - }, - }, - }, - subSkill: { - effect: { - marktext: "襄", - intro: { content: "手牌上限基数改为体力上限" }, - mod: { - maxHandcardBase(player) { - return player.maxHp; - }, - }, - }, - }, - }, - hina_shenshi: { - groupSkill: true, - trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, - frequent: true, - filter(event, player) { - return player.group == "shen"; - }, - content() { - "step 0"; - player.draw(2).gaintag = ["hina_shenshi"]; - player.addSkill("hina_shenshi_yingbian"); - "step 1"; - var cards = player.getCards("h", function (card) { - return card.hasGaintag("hina_shenshi"); - }); - if (!cards.length) event.finish(); - else if (cards.length == 1) event._result = { bool: true, cards: cards }; - else - player.chooseCard("h", true, "将一张“神视”牌置于牌堆顶", function (card) { - return card.hasGaintag("hina_shenshi"); - }); - "step 2"; - if (result.bool) { - game.log(player, "将一张牌置于了牌堆顶"); - player.lose(result.cards, ui.cardPile, "insert"); - player.$throw(1, 1000); - } else event.finish(); - "step 3"; - game.delayx(); - }, - onremove(player) { - player.removeGaintag("hina_shenshi"); - }, - group: "hina_shenshi_yingbian", - }, - hina_shenshi_yingbian: { - trigger: { player: "yingbian" }, - forced: true, - filter: (event, player) => - event.card.isCard && - player.hasHistory( - "lose", - (evt) => - evt.getParent() == event && - Object.values(evt.gaintag_map).some((value) => value.includes("hina_shenshi")) - ), - content: () => { - if (!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian = []; - trigger.temporaryYingbian.add("force"); - trigger.temporaryYingbian.addArray(get.yingbianEffects()); - }, - }, - hina_xingzhi: { - groupSkill: true, - trigger: { player: "yingbian" }, - usable: 1, - filter: (event, player) => - player.group == "key" && - !event.card.yingbian && - lib.yingbian.condition.complex.has("zhuzhan"), - content: () => { - "step 0"; - trigger.yingbianZhuzhanAI = (player, card, source, targets) => (cardx) => { - if (get.attitude(player, source) <= 0) return 0; - var info = get.info(card), - num = 0; - if (info && info.ai && info.ai.yingbian) { - var ai = info.ai.yingbian(card, source, targets, player); - if (ai) num = ai; - } - return Math.max(num, 6) - get.value(cardx); - }; - trigger.afterYingbianZhuzhan = (event) => event.zhuzhanresult.draw(2); - lib.yingbian.condition.complex.get("zhuzhan")(trigger); - "step 1"; - if (!result.bool) return; - trigger.card.yingbian = true; - lib.yingbian.effect.forEach((value) => game.yingbianEffect(trigger, value)); - player.addTempSkill("yingbian_changeTarget"); - }, - }, - yingba: { - audio: 2, - mod: { - aiOrder(player, card, num) { - if ( - num > 0 && - _status.event && - _status.event.type == "phase" && - get.tag(card, "recover") - ) { - if (player.needsToDiscard()) return num / 3; - return 0; - } - }, - targetInRange(card, player, target) { - if (target.hasMark("yingba_mark")) return true; - }, - }, - enable: "phaseUse", - usable: 1, - filter: (event, player) => - game.hasPlayer((current) => current != player && current.maxHp > 1), - filterTarget: (card, player, target) => target != player && target.maxHp > 1, - content() { - "step 0"; - target.loseMaxHp(); - "step 1"; - if (target.isIn()) target.addMark("yingba_mark", 1); - player.loseMaxHp(); - }, - locked: false, - //global:'yingba_mark', - ai: { - combo: "scfuhai", - threaten: 3, - order: 11, - result: { - player(player, target) { - if (player.maxHp == 1) return -2.5; - return -0.25; - }, - target(player, target) { - if (target.isHealthy()) return -2; - if (!target.hasMark("yingba_mark")) return -1; - return -0.2; - }, - }, - }, - subSkill: { - mark: { - marktext: "定", - intro: { - name: "平定", - content: "mark", - onunmark: true, - }, - mod: { - maxHandcard(player, numx) { - var num = player.countMark("yingba_mark"); - if (num) - return ( - numx + - num * - game.countPlayer(function (current) { - return current.hasSkill("yingba"); - }) - ); - }, - }, - }, - }, - }, - scfuhai: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - forced: true, - filter(event, player) { - return event.target && event.target.hasMark("yingba_mark"); - }, - logTarget: "target", - content() { - trigger.directHit.add(trigger.target); - if ( - player.getHistory("gain", function (evt) { - return evt.getParent(2).name == "scfuhai"; - }).length < 2 - ) - player.draw(); - }, - group: ["scfuhai_die"], - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - return arg && arg.target && arg.target.hasMark("yingba_mark"); - }, - combo: "yingba", - }, - subSkill: { - usea: { - trigger: { player: "useCardAfter" }, - forced: true, - filter(event, player) { - return lib.skill.scfuhai_usea.logTarget(event, player).length > 0; - }, - logTarget(event, player) { - return event.targets.filter(function (i) { - return i.hasMark("yingba_mark"); - }); - }, - content() { - var num = 0; - for (var i of trigger.targets) { - var numx = i.countMark("yingba_mark"); - if (numx) { - num += numx; - i.removeMark("yingba_mark", numx); - } - } - if (num) player.gainMaxHp(num); - }, - }, - die: { - trigger: { global: "die" }, - forced: true, - filter(event, player) { - return event.player.countMark("yingba_mark") > 0; - }, - content() { - player.gainMaxHp(trigger.player.countMark("yingba_mark")); - player.draw(trigger.player.countMark("yingba_mark")); - }, - }, - }, - }, - pinghe: { - audio: 2, - mod: { - maxHandcardBase(player) { - return player.getDamagedHp(); - }, - }, - ai: { - effect: { - target(card, player, target) { - if ( - get.tag(card, "recover") && - _status.event.type == "phase" && - !player.needsToDiscard() - ) - return 0.2; - }, - }, - }, - trigger: { player: "damageBegin2" }, - forced: true, - filter(event, player) { - return ( - event.source && - event.source != player && - player.maxHp > 1 && - player.countCards("h") > 0 - ); - }, - content() { - "step 0"; - player.chooseCardTarget({ - prompt: "请选择【冯河】的牌和目标", - prompt2: - "将一张手牌交给一名其他角色并防止伤害" + - (player.hasSkill("yingba") ? ",然后令伤害来源获得一个“平定”标记" : ""), - filterCard: true, - forced: true, - filterTarget: lib.filter.notMe, - ai1(card) { - if ( - get.tag(card, "recover") && - !game.hasPlayer(function (current) { - return ( - get.attitude(current, player) > 0 && !current.hasSkillTag("nogain") - ); - }) - ) - return 0; - return 1 / Math.max(0.1, get.value(card)); - }, - ai2(target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) att /= 9; - return 4 + att; - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - //player.logSkill('pinghe',target); - player.line(target, "green"); - player.give(result.cards, target); - trigger.cancel(); - player.loseMaxHp(); - if (player.hasSkill("yingba")) { - trigger.source.addMark("yingba_mark", 1); - } - } - }, - }, - tianzuo: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - !lib.inpile.includes("qizhengxiangsheng") - ); - }, - content() { - game.addGlobalSkill("tianzuo_global"); - var cards = []; - for (var i = 2; i < 10; i++) { - cards.push(game.createCard2("qizhengxiangsheng", i % 2 ? "club" : "spade", i)); - } - game.broadcastAll(function () { - lib.inpile.add("qizhengxiangsheng"); - }); - game.cardsGotoPile(cards, () => { - return ui.cardPile.childNodes[get.rand(0, ui.cardPile.childNodes.length - 1)]; - }); - }, - group: "tianzuo_remove", - subSkill: { - remove: { - audio: 2, - trigger: { target: "useCardToBefore" }, - forced: true, - priority: 15, - filter(event, player) { - return event.card && event.card.name == "qizhengxiangsheng"; - }, - content() { - trigger.cancel(); - }, - ai: { - effect: { - target(card, player, target) { - if (card && card.name == "qizhengxiangsheng") return "zeroplayertarget"; - }, - }, - }, - }, - global: { - trigger: { player: "useCardToPlayered" }, - forced: true, - popup: false, - filter(event, player) { - return event.card.name == "qizhengxiangsheng"; - }, - content() { - "step 0"; - var target = trigger.target; - event.target = target; - player - .chooseControl("奇兵", "正兵") - .set("prompt", "请选择" + get.translation(target) + "的标记") - .set( - "choice", - (function () { - var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); - var e2 = 0; - if ( - target.countGainableCards(player, "h") > 0 && - !target.hasSkillTag("noh") - ) - e2 = -1; - var es = target.getGainableCards(player, "e"); - if (es.length) - e2 = Math.min( - e2, - (function () { - var max = 0; - for (var i of es) - max = Math.max(max, get.value(i, target)); - return -max / 4; - })() - ); - if (Math.abs(e1 - e2) <= 0.3) - return Math.random() < 0.5 ? "奇兵" : "正兵"; - if (e1 < e2) return "奇兵"; - return "正兵"; - })() - ) - .set("ai", function () { - return _status.event.choice; - }); - "step 1"; - var map = trigger.getParent().customArgs, - id = target.playerid; - if (!map[id]) map[id] = {}; - map[id].qizheng_name = result.control; - }, - }, - rewrite: { - audio: "tianzuo", - trigger: { global: "useCardToTargeted" }, - filter(event, player) { - return event.card.name == "qizhengxiangsheng"; - }, - logTarget: "target", - prompt2: "观看其手牌并修改“奇正相生”标记", - content() { - "step 0"; - var target = trigger.target; - event.target = target; - if (player != target && target.countCards("h") > 0) player.viewHandcards(target); - player - .chooseControl("奇兵", "正兵") - .set("prompt", "请选择" + get.translation(target) + "的标记") - .set( - "choice", - (function () { - var shas = target.getCards("h", "sha"), - shans = target.getCards("h", "shan"); - var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); - var e2 = 0; - if ( - target.countGainableCards(player, "h") > 0 && - !target.hasSkillTag("noh") - ) - e2 = -1; - var es = target.getGainableCards(player, "e"); - if (es.length) - e2 = Math.min( - e2, - (function () { - var max = 0; - for (var i of es) - max = Math.max(max, get.value(i, target)); - return -max / 4; - })() - ); - if (get.attitude(player, target) > 0) { - if (shas.length >= Math.max(1, shans.length)) return "奇兵"; - if (shans.length > shas.length) return "正兵"; - return e1 > e2 ? "奇兵" : "正兵"; - } - if (shas.length) e1 = -0.5; - if (shans.length) e2 = -0.7; - if (Math.abs(e1 - e2) <= 0.3) - return Math.random() < 0.5 ? "奇兵" : "正兵"; - var rand = Math.random(); - if (e1 < e2) return rand < 0.1 ? "奇兵" : "正兵"; - return rand < 0.1 ? "正兵" : "奇兵"; - })() - ) - .set("ai", () => _status.event.choice); - "step 1"; - var map = trigger.getParent().customArgs, - id = target.playerid; - if (!map[id]) map[id] = {}; - map[id].qizheng_name = result.control; - map[id].qizheng_aibuff = get.attitude(player, target) > 0; - }, - }, - }, - }, - lingce: { - audio: 2, - init: (player) => { - game.addGlobalSkill("lingce_global"); - }, - trigger: { global: "useCard" }, - forced: true, - filter(event, player) { - if (!event.card.isCard || !event.cards || event.cards.length !== 1) return false; - return ( - event.card.name == "qizhengxiangsheng" || - get.zhinangs().includes(event.card.name) || - player.getStorage("dinghan").includes(event.card.name) - ); - }, - content() { - player.draw(); - }, - subSkill: { - global: { - ai: { - effect: { - player: (card, player, target) => { - let num = 0, - nohave = true; - game.countPlayer((i) => { - if (i.hasSkill("lingce")) { - nohave = false; - if (i.isIn() && lib.skill.lingce.filter({ card: card }, i)) - num += get.sgnAttitude(player, i); - } - }, true); - if (nohave) game.removeGlobalSkill("lingce_global"); - else return [1, 0.8 * num]; - }, - }, - }, - }, - }, - }, - dinghan: { - audio: 2, - trigger: { - target: "useCardToTarget", - player: "addJudgeBefore", - }, - forced: true, - locked: false, - filter(event, player) { - if (event.name == "useCardToTarget" && get.type(event.card, null, false) != "trick") - return false; - return !player.getStorage("dinghan").includes(event.card.name); - }, - content() { - player.markAuto("dinghan", [trigger.card.name]); - if (trigger.name == "addJudge") { - trigger.cancel(); - var owner = get.owner(trigger.card); - if (owner && owner.getCards("hej").includes(trigger.card)) - owner.lose(trigger.card, ui.discardPile); - else game.cardsDiscard(trigger.card); - game.log(trigger.card, "进入了弃牌堆"); - } else { - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - trigger.untrigger(); - } - }, - onremove: true, - intro: { content: "已记录牌名:$" }, - group: "dinghan_add", - subSkill: { - add: { - trigger: { player: "phaseBegin" }, - direct: true, - content() { - "step 0"; - var dialog = [get.prompt("dinghan")]; - (list1 = player.getStorage("dinghan")), - (list2 = lib.inpile.filter(function (i) { - return get.type2(i, false) == "trick" && !list1.includes(i); - })); - if (list1.length) { - dialog.push('
    已记录
    '); - dialog.push([list1, "vcard"]); - } - if (list2.length) { - dialog.push('
    未记录
    '); - dialog.push([list2, "vcard"]); - } - player.chooseButton(dialog).set("ai", function (button) { - var player = _status.event.player, - name = button.link[2]; - if (player.getStorage("dinghan").includes(name)) { - return -get.effect(player, { name: name }, player, player); - } else { - return ( - get.effect(player, { name: name }, player, player) * - (1 + player.countCards("hs", name)) - ); - } - }); - "step 1"; - if (result.bool) { - player.logSkill("dinghan"); - var name = result.links[0][2]; - if (player.getStorage("dinghan").includes(name)) { - player.unmarkAuto("dinghan", [name]); - game.log(player, "从定汉记录中移除了", "#y" + get.translation(name)); - } else { - player.markAuto("dinghan", [name]); - game.log(player, "向定汉记录中添加了", "#y" + get.translation(name)); - } - game.delayx(); - } - }, - }, - }, - }, - dulie: { - audio: 2, - trigger: { target: "useCardToTarget" }, - forced: true, - logTarget: "player", - filter(event, player) { - return event.card.name == "sha" && event.player.hp > player.hp; - }, - content() { - "step 0"; - player.judge(function (result) { - if (get.suit(result) == "heart") return 2; - return -1; - }).judge2 = function (result) { - return result.bool; - }; - "step 1"; - if (result.bool) { - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - trigger.untrigger(); - } - }, - ai: { - effect: { - target(card, player, target, current, isLink) { - if (card.name == "sha" && !isLink && player.hp > target.hp) return 0.5; - }, - }, - }, - marktext: "围", - intro: { - name: "破围(围)", - name2: "围", - content: "mark", - }, - }, - tspowei: { - audio: 3, - dutySkill: true, - derivation: "shenzhu", - group: [ - "tspowei_init", - "tspowei_move", - "tspowei_achieve", - "tspowei_fail", - "tspowei_use", - "tspowei_remove", - ], - subSkill: { - remove: { - audio: "tspowei3", - trigger: { global: "damageEnd" }, - filter(event, player) { - return event.player && event.player.isIn() && event.player.hasMark("dulie"); - }, - forced: true, - logTarget: "player", - content() { - trigger.player.removeMark("dulie", trigger.player.countMark("dulie")); - }, - }, - use: { - audio: "tspowei3", - trigger: { global: "phaseBegin" }, - direct: true, - filter(event, player) { - return ( - event.player != player && - event.player.hasMark("dulie") && - (player.countCards("h") > 0 || - (player.hp >= event.player.hp && event.player.countCards("h") > 0)) - ); - }, - content() { - "step 0"; - var list = [], - target = trigger.player, - choiceList = ["弃置一张牌并对其造成1点伤害", "获得其一张手牌"]; - event.target = target; - if ( - player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "tspowei_use"); - }, "h") - ) - list.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if (player.hp >= target.hp && target.countCards("h") > 0) list.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - player - .chooseControl(list, "cancel2") - .set("prompt", get.prompt("tspowei", target)) - .set("choiceList", choiceList) - .set("ai", function () { - var evt = _status.event.getParent(); - if ( - evt.player.hasCard(function (card) { - return ( - lib.filter.cardDiscardable(card, evt.player, "tspowei_use") && - get.value(card, evt.player) < 7 - ); - }, "h") && - get.damageEffect(evt.target, evt.player, evt.player) > 0 - ) - return "选项一"; - if ( - evt.player.hp >= evt.target.hp && - evt.target.countCards("h") > 0 && - get.attitude(evt.player, evt.target) <= 0 && - !evt.target.hasSkillTag("noh") - ) - return "选项二"; - return "cancel2"; - }); - "step 1"; - if (result.control != "cancel2") { - if (result.control == "选项二") { - player.logSkill("tspowei_use", target); - player.gainPlayerCard(target, "h", true); - event.goto(3); - } - } else event.finish(); - "step 2"; - player.chooseToDiscard("h", true).logSkill = ["tspowei_use", target]; - if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); - target.damage(); - "step 3"; - player.addTempSkill("tspowei_inRange"); - }, - ai: { expose: 0.2 }, - }, - inRange: { - charlotte: true, - mod: { - inRangeOf(from, to) { - if (from == _status.currentPhase) return true; - }, - }, - }, - init: { - audio: "tspowei3", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - logTarget(event, player) { - return game.filterPlayer( - (current) => current != player && !current.hasMark("dulie") - ); - }, - content() { - var list = game - .filterPlayer((current) => current != player && !current.hasMark("dulie")) - .sortBySeat(); - for (var i of list) i.addMark("dulie", 1, false); - }, - }, - move: { - audio: "tspowei3", - trigger: { player: "phaseBegin" }, - forced: true, - filter(event, player) { - return game.hasPlayer((current) => current != player && current.hasMark("dulie")); - }, - content() { - var list = game - .filterPlayer((current) => current != player && current.hasMark("dulie")) - .sortBySeat(); - var map = {}; - for (var i of list) { - var num = i.countMark("dulie"); - i.removeMark("dulie", num); - map[i.playerid] = num; - } - for (var i of list) { - var next = i.next; - if (next == player) next = next.next; - next.addMark("dulie", map[i.playerid]); - } - }, - }, - achieve: { - audio: "tspowei1", - trigger: { player: "phaseBegin" }, - forced: true, - skillAnimation: true, - animationColor: "metal", - filter(event, player) { - return !game.hasPlayer(function (current) { - return current.hasMark("dulie"); - }); - }, - content() { - game.log(player, "成功完成使命"); - player.awakenSkill("tspowei"); - player.addSkills("shenzhu"); - }, - }, - fail: { - audio: "tspowei2", - trigger: { player: "dying" }, - forced: true, - content() { - "step 0"; - game.log(player, "使命失败"); - player.awakenSkill("tspowei"); - if (player.hp < 1) player.recover(1 - player.hp); - "step 1"; - var num = player.countCards("e"); - if (num > 0) player.chooseToDiscard("e", true, num); - }, - }, - }, - }, - tspowei1: { audio: true }, - tspowei2: { audio: true }, - tspowei3: { audio: true }, - shenzhu: { - audio: 2, - trigger: { player: "useCardAfter" }, - forced: true, - filter(event, player) { - return event.card.name == "sha" && event.card.isCard && event.cards.length == 1; - }, - content() { - "step 0"; - player - .chooseControl() - .set("choiceList", [ - "摸一张牌,且本回合使用【杀】的次数上限+1", - "摸三张牌,且本回合不能再使用【杀】", - ]) - .set("ai", () => (_status.event.player.hasSha() ? 0 : 1)); - "step 1"; - if (result.index == 0) { - player.draw(); - player.addTempSkill("shenzhu_more"); - player.addMark("shenzhu_more", 1, false); - } else { - player.draw(3); - player.addTempSkill("shenzhu_less"); - } - }, - subSkill: { - more: { - charlotte: true, - onremove: true, - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") return num + player.countMark("shenzhu_more"); - }, - }, - }, - less: { - charlotte: true, - mod: { - cardEnabled(card) { - if (card.name == "sha") return false; - }, - }, - }, - }, - }, - dangmo: { - audio: 2, - trigger: { player: "useCard2" }, - direct: true, - filter(event, player) { - if (event.card.name != "sha" || player.hp <= 1) return false; - var evt = event.getParent("phaseUse"); - return ( - evt && - evt.player == player && - player.getHistory("useCard", function (evtx) { - return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; - })[0] == event && - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.filterTarget(event.card, player, current) - ); - }) - ); - }, - content() { - "step 0"; - var num = Math.min( - player.hp - 1, - game.countPlayer(function (current) { - return ( - !trigger.targets.includes(current) && - lib.filter.filterTarget(trigger.card, player, current) - ); - }) - ); - player - .chooseTarget( - get.prompt("dangmo"), - "为" + - get.translation(trigger.card) + - "增加至多" + - get.translation(num) + - "个目标", - [1, num], - function (card, player, target) { - var evt = _status.event.getTrigger(); - return ( - !evt.targets.includes(target) && - lib.filter.filterTarget(evt.card, player, target) - ); - } - ) - .set("ai", function (target) { - var evt = _status.event.getTrigger(), - eff = get.effect(target, evt.card, evt.player, evt.player); - if (player.hasSkill("tspowei") && target.hasMark("dulie")) return 4 * eff; - return eff; - }); - "step 1"; - if (result.bool) { - if (player != game.me && !player.isOnline()) game.delayx(); - event.targets = result.targets; - } else event.finish(); - "step 2"; - player.logSkill("dangmo", targets); - trigger.targets.addArray(targets); - }, - }, - reshuishi: { - audio: "shuishi", - enable: "phaseUse", - usable: 1, - frequent: true, - filter(event, player) { - return player.maxHp < 10; - }, - content() { - "step 0"; - event.cards = []; - event.suits = []; - "step 1"; - player - .judge(function (result) { - var evt = _status.event.getParent("reshuishi"); - if (evt && evt.suits && evt.suits.includes(get.suit(result))) return 0; - return 1; - }) - .set("callback", lib.skill.reshuishi.callback).judge2 = function (result) { - return result.bool ? true : false; - }; - "step 2"; - var cards = cards.filterInD(); - if (cards.length) - player - .chooseTarget("将" + get.translation(cards) + "交给一名角色", true) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att <= 0) return att; - if (target.countCards("h") + _status.event.num >= _status.event.max) att /= 3; - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }) - .set("num", cards.length) - .set( - "max", - game.filterPlayer().reduce((num, i) => { - return Math.max(num, i.countCards("h")); - }, 0) - ); - else event.finish(); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - target.gain(cards, "gain2").giver = player; - } else event.finish(); - "step 4"; - if (target.isMaxHandcard()) player.loseMaxHp(); - }, - callback() { - "step 0"; - var evt = event.getParent(2); - event.getParent().orderingCards.remove(event.judgeResult.card); - evt.cards.push(event.judgeResult.card); - if (event.getParent().result.bool && player.maxHp < 10) { - evt.suits.push(event.getParent().result.suit); - player.gainMaxHp(); - player.chooseBool("是否继续发动【慧识】?").set("frequentSkill", "reshuishi"); - } else event._result = { bool: false }; - "step 1"; - if (result.bool) event.getParent(2).redo(); - }, - ai: { - order: 9, - result: { - player: 1, - }, - }, - }, - shuishi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.maxHp < 10; - }, - filterTarget: true, - content() { - "step 0"; - target.draw(); - "step 1"; - if ( - !result || - !Array.isArray(result) || - result.length != 1 || - get.itemtype(result[0]) != "card" - ) { - event.finish(); - return; - } - var suit = get.suit(result[0]), - hs = target.getCards("h"); - for (var i of hs) { - if (i != result[0] && get.suit(i, target) == suit) { - player.loseMaxHp(); - target.showHandcards(); - event.finish(); - return; - } - } - player.gainMaxHp(); - "step 2"; - if (player.maxHp < 10) { - player.chooseBool("是否继续发动【慧识】?"); - } else event.finish(); - "step 3"; - if (result.bool) event.goto(0); - }, - ai: { - order: 0.5, - result: { - target: 0.2, - player(player, target) { - var list = [], - hs = target.getCards("h"); - for (var i of hs) list.add(get.suit(i, target)); - if (list.length == 0) return 0; - if (list.length == 1) return player.maxHp > 2 ? 0 : -2; - if (list.length == 2) return player.maxHp > 3 ? 0 : -2; - return -2; - }, - }, - }, - }, - stianyi: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "gray", - filter(event, player) { - return !game.hasPlayer(function (current) { - return current.getAllHistory("damage").length == 0; - }); - }, - content() { - "step 0"; - player.awakenSkill("stianyi"); - player.gainMaxHp(2); - player.recover(); - "step 1"; - player.chooseTarget(true, "令一名角色获得技能〖佐幸〗").set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.storage.zuoxing = player; - target.addSkills("zuoxing"); - } - }, - derivation: "zuoxing", - }, - zuoxing: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter(event, player) { - var target = player.storage.zuoxing; - if (!target || !target.isIn() || target.maxHp < 2) return false; - for (var i of lib.inpile) { - if ( - get.type(i) == "trick" && - event.filterCard({ name: i, isCard: true }, player, event) - ) - return true; - } - return false; - }, - chooseButton: { - dialog(event, player) { - var list = []; - for (var i of lib.inpile) { - if ( - get.type(i) == "trick" && - event.filterCard({ name: i, isCard: true }, player, event) - ) - list.push(["锦囊", "", i]); - } - return ui.create.dialog("佐幸", [list, "vcard"]); - }, - check(button) { - return _status.event.player.getUseValue({ name: button.link[2], isCard: true }); - }, - backup(links, player) { - return { - viewAs: { - name: links[0][2], - isCard: true, - }, - filterCard: () => false, - selectCard: -1, - popname: true, - precontent() { - player.logSkill("zuoxing"); - var target = player.storage.zuoxing; - target.loseMaxHp(); - //delete event.result.skill; - }, - }; - }, - prompt(links, player) { - return "请选择" + get.translation(links[0][2]) + "的目标"; - }, - }, - ai: { order: 1, result: { player: 1 } }, - }, - resghuishi: { - audio: "sghuishi", - inherit: "sghuishi", - filterTarget: true, - prompt() { - var player = _status.event.player; - if (player.maxHp >= game.players.length) - return "选择一名角色。若其拥有未发动过的觉醒技,则你解除其中一个觉醒技的发动限制;否则其摸四张牌。然后你减2点体力上限。"; - return "令一名角色摸四张牌,然后你减2点体力上限。"; - }, - content() { - "step 0"; - player.awakenSkill("resghuishi"); - var list = target.getSkills(null, false, false).filter(function (skill) { - var info = lib.skill[skill]; - return info && info.juexingji && !target.awakenedSkills.includes(skill); - }); - if (player.maxHp >= game.players.length && list.length > 0) { - if (list.length == 1) event._result = { control: list[0] }; - else - player - .chooseControl(list) - .set( - "prompt", - "选择一个觉醒技,令" + get.translation(target) + "可无视条件发动该技能" - ); - } else { - target.draw(4); - event.goto(2); - } - "step 1"; - target.storage.resghuishi_mark = result.control; - target.markSkill("resghuishi_mark"); - var info = lib.skill[result.control]; - if (info.filter && !info.charlotte && !info.resghuishi_filter) { - info.resghuishi_filter = info.filter; - info.filter = function (event, player) { - if (player.storage.resghuishi_mark) return true; - return this.resghuishi_filter.apply(this, arguments); - }; - } - "step 2"; - player.loseMaxHp(2); - }, - intro: { content: "未发动" }, - ai: { - order: 0.1, - expose: 0.2, - result: { - target(player, target) { - if ( - (target != player && player.hasUnknown()) || - player.maxHp < (player.getDamagedHp() > 1 ? 5 : 6) - ) - return 0; - if ( - target == player && - player.hasSkill("resghuishi") && - game.hasPlayer(function (current) { - return current.getAllHistory("damage").length == 0; - }) - ) - return 4; - var list = target.getSkills(null, false, false).filter(function (skill) { - var info = lib.skill[skill]; - return info && info.juexingji && !target.awakenedSkills.includes(skill); - }); - if (list.length || target.hasJudge("lebu") || target.hasSkillTag("nogain")) - return 0; - return 4; - }, - }, - }, - subSkill: { mark: { intro: { content: "发动【$】时无视条件" } } }, - }, - sghuishi: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "water", - filterTarget: lib.filter.notMe, - content() { - "step 0"; - player.awakenSkill("sghuishi"); - var list = target.getSkills(null, false, false).filter(function (skill) { - var info = lib.skill[skill]; - return info && info.juexingji; - }); - if (list.length) { - target.addMark("sghuishi", 1, false); - for (var i of list) { - var info = lib.skill[i]; - if (info.filter && !info.charlotte && !info.sghuishi_filter) { - info.sghuishi_filter = info.filter; - info.filter = function (event, player) { - if (player.hasMark("sghuishi")) return true; - return this.sghuishi_filter.apply(this, arguments); - }; - } - } - } else target.draw(4); - player.loseMaxHp(2); - }, - intro: { content: "发动非Charlotte觉醒技时无视条件" }, - ai: { - order: 0.1, - expose: 0.2, - result: { - target(player, target) { - if (player.hasUnknown() || player.maxHp < 5) return 0; - var list = target.getSkills(null, false, false).filter(function (skill) { - var info = lib.skill[skill]; - return info && info.juexingji; - }); - if (list.length || target.hasJudge("lebu") || target.hasSkillTag("nogain")) - return 0; - return 4; - }, - }, - }, - }, - zhanjiang: { - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != player && players[i].getEquips("qinggang").length > 0) { - return true; - } - } - }, - content() { - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != player) { - var e = players[i].getEquips("qinggang"); - if (e.length > 0) { - player.line(players[i], "green"); - player.gain(e, players[i], "give", "bySelf"); - } - } - } - }, - }, - boss_juejing: { - audio: "juejing", - audioname2: { - dc_zhaoyun: "dcjuejing", - }, - trigger: { player: "phaseDrawBefore" }, - forced: true, - content() { - trigger.cancel(); - }, - ai: { - noh: true, - nogain: true, - }, - group: "boss_juejing2", - }, - boss_juejing2: { - audio: "juejing", - audioname2: { - dc_zhaoyun: "dcjuejing", - }, - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - filter(event, player) { - if (event.name == "gain" && event.player == player) return player.countCards("h") > 4; - var evt = event.getl(player); - if (!evt || !evt.hs || evt.hs.length == 0 || player.countCards("h") >= 4) return false; - var evt = event; - for (var i = 0; i < 4; i++) { - evt = evt.getParent("boss_juejing2"); - if (evt.name != "boss_juejing2") return true; - } - return false; - }, - content() { - var num = 4 - player.countCards("h"); - if (num > 0) player.draw(num); - else player.chooseToDiscard("h", true, -num); - }, - }, - dcjuejing: { audio: 2 }, - meihun: { - audio: 2, - trigger: { - player: "phaseJieshuBegin", - target: "useCardToTargeted", - }, - direct: true, - filter(event, player) { - if (event.name != "phaseJieshu" && event.card.name != "sha") return false; - return game.hasPlayer(function (current) { - return current != player && current.countCards("h"); - }); - }, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("meihun"), function (card, player, target) { - return target != player && target.countCards("h") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att > 0) return 0; - return 0.1 - att / target.countCards("h"); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("meihun", target); - event.target = target; - player - .chooseControl(lib.suit) - .set("prompt", "请选择一种花色") - .set("ai", function () { - return lib.suit.randomGet(); - }); - } else event.finish(); - "step 2"; - var suit = result.control; - player.chat(get.translation(suit + 2)); - game.log(player, "选择了", "#y" + get.translation(suit + 2)); - if (target.countCards("h", { suit: suit })) { - target - .chooseCard( - "h", - "交给" + - get.translation(player) + - "一张" + - get.translation(suit) + - "花色的手牌", - true, - function (card, player) { - return get.suit(card, player) == _status.event.suit; - } - ) - .set("suit", suit); - } else { - player.discardPlayerCard(target, true, "h", "visible"); - event.finish(); - } - "step 3"; - if (result.bool && result.cards && result.cards.length) - target.give(result.cards, player, "give"); - }, - }, - //Connect Mode support after Angel Beats! -2nd beat- - huoxin: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter(event, player) { - if (game.countPlayer() < 3) return false; - for (var i of lib.suit) { - if (player.countCards("h", { suit: i }) > 1) return true; - } - return false; - }, - complexCard: true, - position: "h", - filterCard(card, player) { - if (!ui.selected.cards.length) { - var suit = get.suit(card); - return ( - player.countCards("h", function (card2) { - return card != card2 && get.suit(card2, player) == suit; - }) > 0 - ); - } - return get.suit(card, player) == get.suit(ui.selected.cards[0], player); - }, - selectCard: 2, - selectTarget: 2, - filterTarget: lib.filter.notMe, - multitarget: true, - multiline: true, - delay: false, - discard: false, - lose: false, - check(card) { - return 6 - get.value(card); - }, - targetprompt: ["拼点发起人", "拼点目标"], - content() { - "step 0"; - var list = []; - for (var i = 0; i < targets.length; i++) { - list.push([targets[i], cards[i]]); - } - game.loseAsync({ - gain_list: list, - player: player, - cards: cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - "step 1"; - game.delayx(); - if (targets[0].canCompare(targets[1])) { - targets[0].chooseToCompare(targets[1]); - } else event.finish(); - "step 2"; - if (result.winner !== targets[0]) targets[0].addMark("huoxin", 1); - if (result.winner !== targets[1]) targets[1].addMark("huoxin", 1); - }, - marktext: "魅", - intro: { - name: "魅惑", - name2: "魅惑", - content: "mark", - }, - group: "huoxin_control", - ai: { - order: 1, - result: { - target(player, target) { - if (target.hasMark("huoxin")) return -2; - return -1; - }, - }, - }, - }, - huoxin_control: { - audio: "huoxin", - forced: true, - trigger: { global: "phaseBeginStart" }, - filter(event, player) { - return ( - player != event.player && - !event.player._trueMe && - event.player.countMark("huoxin") > 1 - ); - }, - logTarget: "player", - skillAnimation: true, - animationColor: "key", - content() { - trigger.player.removeMark("huoxin", trigger.player.countMark("huoxin")); - trigger.player._trueMe = player; - game.addGlobalSkill("autoswap"); - if (trigger.player == game.me) { - game.notMe = true; - if (!_status.auto) ui.click.auto(); - } - trigger.player.addSkill("huoxin2"); - }, - }, - huoxin2: { - trigger: { - player: ["phaseAfter", "dieAfter"], - global: "phaseBeforeStart", - }, - lastDo: true, - charlotte: true, - forceDie: true, - forced: true, - silent: true, - content() { - player.removeSkill("huoxin2"); - }, - onremove(player) { - if (player == game.me) { - if (!game.notMe) game.swapPlayerAuto(player._trueMe); - else delete game.notMe; - if (_status.auto) ui.click.auto(); - } - delete player._trueMe; - }, - }, - shiki_omusubi: { - audio: 2, - trigger: { global: "roundStart" }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("shiki_omusubi"), lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player; - if (player.isHealthy()) return 0; - if (player.hp < 3 && player.getDamagedHp() < 2) return 0; - var list = []; - if (lib.character[target.name]) list.addArray(lib.character[target.name][3]); - if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]); - if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]); - list = list.filter(function (i) { - return !player.hasSkill(i); - }); - if (!list.length) return 0; - return 1 + Math.random(); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("shiki_omusubi", target); - player.loseMaxHp(); - var list = []; - if (lib.character[target.name]) list.addArray(lib.character[target.name][3]); - if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]); - if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]); - player.addSkills(list); - game.broadcastAll(function (list) { - lib.character.key_shiki[3].addArray(list); - game.expandSkills(list); - for (var i of list) { - var info = lib.skill[i]; - if (!info) continue; - if (!info.audioname2) info.audioname2 = {}; - info.audioname2.key_shiki = "shiki_omusubi"; - } - }, list); - } - }, - }, - kagari_zongsi: { - enable: "phaseUse", - usable: 1, - content() { - "step 0"; - var controls = []; - if (ui.cardPile.hasChildNodes()) controls.push("选择牌堆中的一张牌"); - if (ui.discardPile.hasChildNodes()) controls.push("选择弃牌堆中的一张牌"); - if ( - game.hasPlayer(function (current) { - return current.countCards("hej") > 0; - }) - ) - controls.push("选择一名角色区域内的一张牌"); - if (!controls.length) { - event.finish(); - return; - } - event.controls = controls; - var next = player.chooseControl(); - next.set("choiceList", controls); - next.set("prompt", "请选择要移动的卡牌的来源"); - next.ai = function () { - return 0; - }; - "step 1"; - result.control = event.controls[result.index]; - var list = ["弃牌堆", "牌堆", "角色"]; - for (var i = 0; i < list.length; i++) { - if (result.control.indexOf(list[i]) != -1) { - event.index = i; - break; - } - } - if (event.index == 2) { - player.chooseTarget( - "请选择要移动的卡牌的来源", - true, - function (card, kagari, target) { - return target.countCards("hej") > 0; - } - ); - } else { - var source = ui[event.index == 0 ? "discardPile" : "cardPile"].childNodes; - var list = []; - for (var i = 0; i < source.length; i++) list.push(source[i]); - player.chooseButton(["请选择要移动的卡牌", list], true).ai = get.buttonValue; - } - "step 2"; - if (event.index == 2) { - player.line(result.targets[0]); - event.target1 = result.targets[0]; - player.choosePlayerCard(result.targets[0], true, "hej").set("visible", true); - } else { - event.card = result.links[0]; - } - "step 3"; - if (event.index == 2) event.card = result.cards[0]; - var controls = [ - "将这张牌移动到牌堆的顶部或者底部", - "将这张牌移动到弃牌堆的顶部或者底部", - "将这张牌移动到一名角色对应的区域里", - ]; - event.controls = controls; - var next = player.chooseControl(); - next.set("prompt", "要对" + get.translation(event.card) + "做什么呢?"); - next.set("choiceList", controls); - next.ai = function () { - return 2; - }; - "step 4"; - result.control = event.controls[result.index]; - var list = ["弃牌堆", "牌堆", "角色"]; - for (var i = 0; i < list.length; i++) { - if (result.control.indexOf(list[i]) != -1) { - event.index2 = i; - break; - } - } - if (event.index2 == 2) { - player.chooseTarget( - "要将" + get.translation(card) + "移动到哪一名角色的对应区域呢", - true - ).ai = function (target) { - return target == _status.event.player ? 1 : 0; - }; - } else { - player - .chooseControl("顶部", "底部") - .set( - "prompt", - "把" + - get.translation(card) + - "移动到" + - (event.index2 == 0 ? "弃" : "") + - "牌堆的..." - ); - } - "step 5"; - if (event.index2 != 2) { - //if(event.target1) event.target1.lose(card,ui.special); - //else card.goto(ui.special); - event.way = result.control; - } else { - event.target2 = result.targets[0]; - var list = ["手牌区"]; - if (lib.card[card.name].type == "equip" && event.target2.canEquip(card)) - list.push("装备区"); - if ( - lib.card[card.name].type == "delay" && - !event.target2.isDisabledJudge() && - !event.target2.hasJudge(card.name) - ) - list.push("判定区"); - if (list.length == 1) event._result = { control: list[0] }; - else { - player - .chooseControl(list) - .set( - "prompt", - "把" + - get.translation(card) + - "移动到" + - get.translation(event.target2) + - "的..." - ).ai = function () { - return 0; - }; - } - } - "step 6"; - if (event.index2 != 2) { - var node = ui[event.index == 0 ? "discardPile" : "cardPile"]; - if (event.target1) { - var next = event.target1.lose(card, event.position); - if (event.way == "顶部") next.insert_card = true; - } else { - if (event.way == "底部") node.appendChild(card); - else node.insertBefore(card, node.firstChild); - } - game.updateRoundNumber(); - event.finish(); - } else { - if (result.control == "手牌区") { - var next = event.target2.gain(card); - if (event.target1) { - next.source = event.target1; - next.animate = "giveAuto"; - } else next.animate = "draw"; - } else if (result.control == "装备区") { - if (event.target1) event.target1.$give(card, event.target2); - event.target2.equip(card); - } else { - if (event.target1) event.target1.$give(card, event.target2); - event.target2.addJudge(card); - } - } - "step 7"; - game.updateRoundNumber(); - }, - ai: { - order: 10, - result: { player: 1 }, - }, - }, - caopi_xingdong: { - audio: "olfangquan", - audioname: ["shen_caopi"], - subSkill: { - mark: { - mark: true, - marktext: "令", - intro: { - content: "跳过下个回合的判定阶段和摸牌阶段", - }, - }, - }, - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("h", lib.skill.caopi_xingdong.filterCard) > 0; - }, - filterCard(card) { - return card.name == "sha" || get.type(card) == "trick"; - }, - check(card) { - return 1; - }, - filterTarget: lib.filter.notMe, - discard: false, - lose: false, - delay: 0, - content() { - "step 0"; - player.give(cards, target); - "step 1"; - if (!target.getCards("h").includes(cards[0])) event._result = { bool: false }; - else - target.chooseUseTarget( - cards[0], - game.filterPlayer(function (current) { - return current != player; - }), - "请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段" - ); - "step 2"; - if (result.bool) game.asyncDraw([player, target]); - else { - target.addTempSkill("caopi_xingdong_mark", "phaseJudgeSkipped"); - target.skip("phaseJudge"); - target.skip("phaseDraw"); - event.finish(); - } - "step 3"; - game.delay(); - }, - ai: { - order: 12, - result: { - target(player, target) { - var card = ui.selected.cards[0]; - if (target.hasSkill("pingkou")) return 1; - if (!card) return 0; - var info = get.info(card); - if (info.selectTarget == -1) { - var eff = 0; - game.countPlayer(function (current) { - if (current != player && target.canUse(card, current)) - eff += get.effect(current, card, target, target) > 0; - }); - if (eff > 0 || get.value(card) < 3) return eff; - return 0; - } else if ( - game.hasPlayer(function (current) { - return ( - current != player && - target.canUse(card, current) && - get.effect(current, card, target, target) > 0 - ); - }) - ) - return 1.5; - else if (get.value(card) < 3) return -1; - return 0; - }, - }, - }, - }, - shenfu: { - audio: 2, - trigger: { player: "phaseEnd" }, - direct: true, - content() { - "step 0"; - event.logged = false; - event.targets = []; - event.goto(player.countCards("h") % 2 == 1 ? 1 : 4); - "step 1"; - player - .chooseTarget( - get.prompt("shenfu"), - "对一名其他角色造成1点雷属性伤害", - function (card, player, target) { - return ( - target != player && !_status.event.getParent().targets.includes(target) - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return ( - get.damageEffect(target, player, player, "thunder") * (target.hp == 1 ? 2 : 1) - ); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - if (!event.logged) { - event.logged = true; - player.logSkill("shenfu", target, "thunder"); - } else player.line(target, "thunder"); - event.targets.push(target); - target.damage("thunder"); - } else event.finish(); - "step 3"; - if ( - target.getHistory("damage", function (evt) { - return evt.getParent("shenfu") == event && evt._dyinged; - }).length - ) - event.goto(1); - else event.finish(); - "step 4"; - player - .chooseTarget( - get.prompt("shenfu"), - "令一名角色摸一张牌或弃置其一张手牌", - function (card, player, target) { - return !_status.event.getParent().targets.includes(target); - } - ) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - var delta = target.hp - target.countCards("h"); - if (Math.abs(delta) == 1 && get.sgn(delta) == get.sgn(att)) - return 3 * Math.abs(att); - if (att > 0 || target.countCards("h") > 0) return Math.abs(att); - return 0; - }); - "step 5"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - if (!event.logged) { - event.logged = true; - player.logSkill("shenfu", target); - } else player.line(target, "green"); - event.targets.push(target); - if (target.countCards("h") == 0) event._result = { index: 0 }; - else - player - .chooseControl("摸一张牌", "弃置一张手牌") - .set("prompt", "选择一项令" + get.translation(target) + "执行…") - .set("goon", get.attitude(player, target) > 0 ? 0 : 1) - .set("ai", () => _status.event.goon); - //else player.discardPlayerCard(target,'h','弃置'+get.translation(target)+'一张手牌,或点【取消】令其摸一张牌。'); - } else event.finish(); - "step 6"; - if (result.index == 0) target.draw(); - else target.chooseToDiscard("h", true); - "step 7"; - if (target.hp == target.countCards("h")) event.goto(4); - }, - ai: { expose: 0.25 }, - }, - qixian: { - mod: { - maxHandcardBase(player, num) { - return 7; - }, - }, - }, - chuyuan: { - audio: 2, - trigger: { global: "damageEnd" }, - filter(event, player) { - return event.player.isIn() && player.getExpansions("chuyuan").length < player.maxHp; - }, - logTarget: "player", - locked: false, - content() { - "step 0"; - trigger.player.draw(); - "step 1"; - if (!trigger.player.countCards("h")) event.finish(); - else - trigger.player.chooseCard( - "h", - true, - "选择一张牌置于" + get.translation(player) + "的武将牌上作为「储」" - ); - "step 2"; - player.addToExpansion(result.cards, trigger.player, "give").gaintag.add("chuyuan"); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { combo: "dengji" }, - }, - dengji: { - audio: 2, - derivation: [ - "tianxing", - "new_rejianxiong", - "rerende", - "rezhiheng", - "olluanji", - "caopi_xingdong", - ], - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - unique: true, - juexingji: true, - skillAnimation: true, - animationColor: "water", - filter(event, player) { - return player.getExpansions("chuyuan").length >= 3; - }, - content() { - player.awakenSkill(event.name); - player.addSkills(["tianxing", "new_rejianxiong"]); - player.loseMaxHp(); - player.gain(player.getExpansions("chuyuan"), "gain2", "fromStorage"); - }, - ai: { - combo: "chuyuan", - }, - }, - tianxing: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - unique: true, - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - filter(event, player) { - return player.getExpansions("chuyuan").length >= 3; - }, - content() { - "step 0"; - player.awakenSkill(event.name); - player.loseMaxHp(); - player.gain(player.getExpansions("chuyuan"), "gain2", "fromStorage"); - "step 1"; - player.removeSkills("chuyuan"); - player - .chooseControl("rerende", "rezhiheng", "olluanji", "caopi_xingdong") - .set("prompt", "选择获得一个技能") - .set("ai", function () { - var player = _status.event.player; - if ( - !player.hasSkill("luanji") && - !player.hasSkill("olluanji") && - player.getUseValue({ name: "wanjian" }) > 4 - ) - return "olluanji"; - if (!player.hasSkill("rezhiheng")) return "rezhiheng"; - if (!player.hasSkill("caopi_xingdong")) return "caopi_xingdong"; - return "rerende"; - }); - "step 2"; - player.addSkills(result.control); - }, - ai: { - combo: "chuyuan", - }, - }, - olzhiti: { - audio: "drlt_zhiti", - global: "olzhiti2", - mod: { - maxHandcard(player, num) { - if ( - game.hasPlayer(function (current) { - return current.isDamaged(); - }) - ) - return num + 1; - }, - }, - trigger: { player: ["phaseDrawBegin2", "phaseEnd"] }, - forced: true, - filter(event, player) { - var num = event.name == "phase" ? 5 : 3; - if ( - num == 3 - ? event.numFixed - : !game.hasPlayer(function (current) { - return current.hasEnabledSlot(); - }) - ) - return false; - return ( - game.countPlayer(function (current) { - return current.isDamaged(); - }) >= num - ); - }, - direct: true, - content() { - "step 0"; - if (trigger.name == "phaseDraw") { - player.logSkill("olzhiti"); - trigger.num++; - event.finish(); - } else { - player - .chooseTarget( - get.prompt("olzhiti"), - "废除一名角色的一个随机装备栏", - function (card, player, target) { - return target.hasEnabledSlot(); - } - ) - .set("ai", function (target) { - return ( - -get.attitude(_status.event.player, target) * (target.countCards("e") + 1) - ); - }); - } - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("olzhiti", target); - var list = []; - for (var i = 1; i < 6; i++) { - if (target.hasEnabledSlot(i)) list.add(i == 3 || i == 4 ? 6 : i); - } - var num = list.randomGet(); - if (num != 6) target.disableEquip(num); - else { - target.disableEquip(3, 4); - } - } - }, - }, - olzhiti2: { - mod: { - maxHandcard(player, num) { - if (player.isDamaged()) - return ( - num - - game.countPlayer(function (current) { - return current.hasSkill("olzhiti") && current.inRange(player); - }) - ); - }, - }, - }, - olduorui: { - audio: "drlt_duorui", - trigger: { - source: "damageSource", - }, - filter(event, player) { - if (!player.isPhaseUsing() || event.player.isDead()) return false; - for (var i in event.player.disabledSkills) { - if (event.player.disabledSkills[i].includes("olduorui2")) return false; - } - var list = []; - var listm = []; - var listv = []; - if (event.player.name1 != undefined) listm = lib.character[event.player.name1][3]; - else listm = lib.character[event.player.name][3]; - if (event.player.name2 != undefined) listv = lib.character[event.player.name2][3]; - listm = listm.concat(listv); - var func = function (skill) { - var info = get.info(skill); - if (!info || info.charlotte) return false; - return true; - }; - for (var i = 0; i < listm.length; i++) { - if (func(listm[i])) list.add(listm[i]); - } - return list.length > 0; - }, - check(event, player) { - if (get.attitude(_status.event.player, event.player) >= 0) return false; - if (event.getParent("phaseUse").skipped) return true; - var nd = player.needsToDiscard(); - return ( - player.countCards("h", function (card) { - return ( - player.getUseValue(card, null, true) > 0 && - (nd ? true : get.tag(card, "damage") > 0) - ); - }) == 0 - ); - }, - logTarget: "player", - content() { - "step 0"; - var list = []; - var listm = []; - var listv = []; - if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3]; - else listm = lib.character[trigger.player.name][3]; - if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3]; - listm = listm.concat(listv); - var func = function (skill) { - var info = get.info(skill); - if (!info || info.charlotte) return false; - return true; - }; - for (var i = 0; i < listm.length; i++) { - if (func(listm[i])) list.add(listm[i]); - } - event.skills = list; - player - .chooseControl(list) - .set( - "prompt", - "选择" + get.translation(trigger.player) + "武将牌上的一个技能并令其失效" - ); - "step 1"; - trigger.player.disableSkill("olduorui2", result.control); - trigger.player.addTempSkill("olduorui2", { player: "phaseAfter" }); - game.log( - player, - "选择了", - trigger.player, - "的技能", - "#g【" + get.translation(result.control) + "】" - ); - event.getParent("phaseUse").skipped = true; - }, - }, - olduorui2: { - onremove(player, skill) { - player.enableSkill(skill); - }, - locked: true, - mark: true, - charlotte: true, - intro: { - content(storage, player, skill) { - var list = []; - for (var i in player.disabledSkills) { - if (player.disabledSkills[i].includes(skill)) list.push(i); - } - if (list.length) { - var str = "失效技能:"; - for (var i = 0; i < list.length; i++) { - if (lib.translate[list[i] + "_info"]) str += get.translation(list[i]) + "、"; - } - return str.slice(0, str.length - 1); - } - }, - }, - }, - wuhun2: { audio: 2 }, - new_wuhun: { - audio: "wuhun2", - trigger: { player: "damageEnd" }, - filter(event, player) { - return event.source && event.source.isIn(); - }, - forced: true, - logTarget: "source", - content() { - trigger.source.addMark("new_wuhun", trigger.num); - }, - group: "new_wuhun_die", - ai: { - notemp: true, - effect: { - target: (card, player, target) => { - if (!get.tag(card, "damage") || !target.hasFriend()) return; - if (player.hasSkillTag("jueqing", null, target)) return 1.7; - let die = [null, 1], - temp; - game.filterPlayer((i) => { - temp = i.countMark("new_wuhun"); - if (i === player && target.hp + target.hujia > 1) temp++; - if (temp >= die[1]) { - if (!die[0]) die = [i, temp]; - else { - let att = get.attitude(player, i); - if (att < die[1]) die = [i, temp]; - } - } - }); - if (die[0]) - return [ - 1, - 0, - 1, - (-6 * get.sgnAttitude(player, die[0])) / Math.max(1, target.hp), - ]; - }, - }, - }, - marktext: "魇", - intro: { - name: "梦魇", - content: "mark", - onunmark: true, - }, - subSkill: { - die: { - audio: "wuhun2", - trigger: { player: "die" }, - filter(event, player) { - return game.hasPlayer(function (current) { - return current != player && current.hasMark("new_wuhun"); - }); - }, - forced: true, - direct: true, - forceDie: true, - skillAnimation: true, - animationColor: "soil", - content() { - "step 0"; - var num = 0; - for (var i = 0; i < game.players.length; i++) { - var current = game.players[i]; - if (current != player && current.countMark("new_wuhun") > num) { - num = current.countMark("new_wuhun"); - } - } - player - .chooseTarget( - true, - "请选择【武魂】的目标", - "令其进行判定,若判定结果不为【桃】或【桃园结义】,则其死亡", - function (card, player, target) { - return ( - target != player && - target.countMark("new_wuhun") == _status.event.num - ); - } - ) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }) - .set("forceDie", true) - .set("num", num); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("new_wuhun_die", target); - player.line(target, { color: [255, 255, 0] }); - game.delay(2); - } - "step 2"; - target.judge(function (card) { - if (["tao", "taoyuan"].includes(card.name)) return 10; - return -10; - }).judge2 = function (result) { - return result.bool == false ? true : false; - }; - "step 3"; - if (!result.bool) target.die(); - }, - }, - }, - }, - new_guixin: { - audio: "guixin", - trigger: { - player: "damageEnd", - }, - check(event, player) { - if (player.isTurnedOver() || event.num > 1) return true; - var num = game.countPlayer(function (current) { - if ( - current.countCards("he") && - current != player && - get.attitude(player, current) <= 0 - ) { - return true; - } - if ( - current.countCards("j") && - current != player && - get.attitude(player, current) > 0 - ) { - return true; - } - }); - return num >= 2; - }, - content() { - "step 0"; - var targets = game.filterPlayer(); - targets.remove(player); - targets.sort(lib.sort.seat); - event.targets = targets; - event.count = trigger.num; - "step 1"; - event.num = 0; - player.line(targets, "green"); - player - .chooseControl("手牌区", "装备区", "判定区") - .set("ai", function () { - if ( - game.hasPlayer(function (current) { - return ( - current.countCards("j") && - current != player && - get.attitude(player, current) > 0 - ); - }) - ) - return 2; - return Math.floor(Math.random() * 3); - }) - .set("prompt", "请选择优先获得的区域"); - "step 2"; - event.range = { - 手牌区: ["h", "e", "j"], - 装备区: ["e", "h", "j"], - 判定区: ["j", "h", "e"], - }[result.control || "手牌区"]; - "step 3"; - if (num < event.targets.length) { - var target = event.targets[num]; - var range = event.range; - for (var i = 0; i < range.length; i++) { - var cards = target.getCards(range[i]); - if (cards.length) { - var card = cards.randomGet(); - player.gain(card, target, "giveAuto", "bySelf"); - break; - } - } - event.num++; - } - "step 4"; - if (num < event.targets.length) event.goto(3); - "step 5"; - player.turnOver(); - "step 6"; - event.count--; - if (event.count && player.hasSkill("new_guixin")) { - player.chooseBool(get.prompt2("new_guixin")).ai = function () { - return lib.skill.new_guixin.check({ num: event.count }, player); - }; - } else { - event.finish(); - } - "step 7"; - if (event.count && result.bool) { - player.logSkill("new_guixin"); - event.goto(1); - } - }, - ai: { - maixie: true, - maixie_hp: true, - threaten(player, target) { - if (target.hp == 1) return 2.5; - return 1; - }, - effect: { - target(card, player, target) { - if ( - !target._new_guixin_eff && - get.tag(card, "damage") && - target.hp > - (player.hasSkillTag("damageBonus", true, { - card: card, - target: target, - }) - ? 2 - : 1) - ) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - target._new_guixin_eff = true; - let gain = game.countPlayer(function (current) { - if (target == current) return 0; - if (get.attitude(target, current) > 0) { - if ( - current.hasCard( - (cardx) => - lib.filter.canBeGained( - cardx, - target, - current, - "new_guixin" - ) && get.effect(current, cardx, current, current) < 0, - "j" - ) - ) - return 1.3; - return 0; - } - if ( - current.hasCard( - (cardx) => - lib.filter.canBeGained( - cardx, - target, - current, - "new_guixin" - ) && get.effect(current, cardx, current, current) > 0, - "e" - ) - ) - return 1.1; - if ( - current.hasCard( - (cardx) => - lib.filter.canBeGained(cardx, target, current, "new_guixin"), - "h" - ) - ) - return 0.9; - return 0; - }); - if (target.isTurnedOver()) gain += 2.3; - else gain -= 2.3; - delete target._new_guixin_eff; - return [1, Math.max(0, gain)]; - } - }, - }, - }, - }, - ol_shenfen: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return player.countMark("baonu") >= 6; - }, - usable: 1, - skillAnimation: true, - animationColor: "metal", - content() { - "step 0"; - event.delay = false; - player.removeMark("baonu", 6); - event.targets = game.filterPlayer(); - event.targets.remove(player); - event.targets.sort(lib.sort.seat); - player.line(event.targets, "green"); - event.targets2 = event.targets.slice(0); - event.targets3 = event.targets.slice(0); - "step 1"; - if (event.targets2.length) { - event.targets2.shift().damage("nocard"); - event.redo(); - } - "step 2"; - if (event.targets.length) { - event.current = event.targets.shift(); - if (event.current.countCards("e")) event.delay = true; - event.current.discard(event.current.getCards("e")).delay = false; - } - "step 3"; - if (event.delay) game.delay(0.5); - event.delay = false; - if (event.targets.length) event.goto(2); - "step 4"; - if (event.targets3.length) { - var target = event.targets3.shift(); - target.chooseToDiscard(4, "h", true).delay = false; - if (target.countCards("h")) event.delay = true; - } - "step 5"; - if (event.delay) game.delay(0.5); - event.delay = false; - if (event.targets3.length) event.goto(4); - "step 6"; - player.turnOver(); - }, - ai: { - combo: "baonu", - order: 10, - result: { - player(player) { - return game.countPlayer(function (current) { - if (current != player) { - return get.sgn(get.damageEffect(current, player, player)); - } - }); - }, - }, - }, - }, - ol_wuqian: { - audio: 2, - enable: "phaseUse", - derivation: "wushuang", - filter(event, player) { - return ( - player.countMark("baonu") >= 2 && - game.hasPlayer((target) => lib.skill.ol_wuqian.filterTarget(null, player, target)) - ); - }, - filterTarget(card, player, target) { - return target != player && !target.hasSkill("ol_wuqian_targeted"); - }, - content() { - player.removeMark("baonu", 2); - player.addTempSkills("wushuang"); - player.popup("无双"); - // game.log(player,'获得了技能','#g【无双】'); - target.addTempSkill("ol_wuqian_targeted"); - }, - ai: { - order: 9, - result: { - target(player, target) { - if ( - player.countCards("hs", (card) => { - if (!player.getCardUsable({ name: card.name })) return false; - if (!player.canUse(card, target)) return false; - var eff1 = get.effect(target, card, player, player); - _status.baonuCheck = true; - var eff2 = get.effect(target, card, player, player); - delete _status.baonuCheck; - return eff2 > Math.max(0, eff1); - }) - ) - return -1; - return 0; - }, - }, - combo: "baonu", - }, - global: "ol_wuqian_ai", - subSkill: { - targeted: { - charlotte: true, - ai: { unequip2: true }, - }, - ai: { - ai: { - unequip2: true, - skillTagFilter(player) { - if (!_status.baonuCheck) return false; - }, - }, - }, - }, - }, - wumou: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - filter(event) { - return get.type(event.card) == "trick"; - }, - content() { - "step 0"; - if (player.hasMark("baonu")) { - player - .chooseControlList(["移去一枚【暴怒】标记", "失去1点体力"], true) - .set("ai", function (event, player) { - if (get.effect(player, { name: "losehp" }, player, player) >= 0) return 1; - if (player.storage.baonu > 6) return 0; - if (player.hp + player.num("h", "tao") > 3) return 1; - return 0; - }); - } else { - player.loseHp(); - event.finish(); - } - "step 1"; - if (result.index == 0) { - player.removeMark("baonu", 1); - } else { - player.loseHp(); - } - }, - ai: { - effect: { - player_use(card, player) { - if (get.type(card) == "trick" && get.value(card) < 6) { - return [0, -2]; - } - }, - }, - neg: true, - }, - }, - qinyin: { - audio: 2, - trigger: { player: "phaseDiscardEnd" }, - direct: true, - filter(event, player) { - var cards = []; - player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) - cards.addArray(evt.cards2); - }); - return cards.length > 1; - }, - content() { - "step 0"; - event.forceDie = true; - if (typeof event.count != "number") { - // event.count=trigger.cards.length-1; - event.count = 1; - } - var recover = 0, - lose = 0, - players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i].hp < players[i].maxHp) { - if (get.attitude(player, players[i]) > 0) { - if (players[i].hp < 2) { - lose--; - recover += 0.5; - } - lose--; - recover++; - } else if (get.attitude(player, players[i]) < 0) { - if (players[i].hp < 2) { - lose++; - recover -= 0.5; - } - lose++; - recover--; - } - } else { - if (get.attitude(player, players[i]) > 0) { - lose--; - } else if (get.attitude(player, players[i]) < 0) { - lose++; - } - } - } - var prompt = get.prompt("qinyin") + "(剩余" + get.cnNumber(event.count) + "次)"; - player.chooseControl( - "失去体力", - "回复体力", - "cancel2", - ui.create.dialog(get.prompt("qinyin"), "hidden") - ).ai = function () { - if (lose > recover && lose > 0) return 0; - if (lose < recover && recover > 0) return 1; - return 2; - }; - "step 1"; - if (result.control == "cancel2") { - event.finish(); - } else { - player.logSkill("qinyin"); - event.bool = result.control == "回复体力"; - event.num = 0; - event.players = game.filterPlayer(); - } - "step 2"; - if (event.num < event.players.length) { - var target = event.players[event.num]; - if (event.bool) { - target.recover(); - } else { - target.loseHp(); - } - event.num++; - event.redo(); - } - "step 3"; - if (event.count > 1) { - event.count--; - event.goto(0); - } - }, - ai: { - expose: 0.1, - threaten: 2, - }, - }, - lianpo: { - audio: 2, - trigger: { global: "phaseAfter" }, - frequent: true, - filter(event, player) { - return player.getStat("kill") > 0; - }, - content() { - player.insertPhase(); - }, - }, - baonu: { - audio: 2, - marktext: "暴", - unique: true, - trigger: { - source: "damageSource", - player: ["damageEnd", "enterGame"], - global: "phaseBefore", - }, - forced: true, - filter(event) { - return ( - (event.name != "damage" && (event.name != "phase" || game.phaseNumber == 0)) || - event.num > 0 - ); - }, - content() { - player.addMark("baonu", trigger.name == "damage" ? trigger.num : 2); - }, - intro: { - name: "暴怒", - content: "mark", - }, - ai: { - combo: "ol_shenfen", - maixie: true, - maixie_hp: true, - }, - }, - shenfen: { - audio: 2, - unique: true, - enable: "phaseUse", - filter(event, player) { - return player.storage.baonu >= 6; - }, - skillAnimation: true, - animationColor: "metal", - limited: true, - content() { - "step 0"; - player.awakenSkill("shenfen"); - player.storage.baonu -= 6; - player.markSkill("baonu"); - player.syncStorage("baonu"); - event.targets = game.filterPlayer(); - event.targets.remove(player); - event.targets.sort(lib.sort.seat); - event.targets2 = event.targets.slice(0); - player.line(event.targets, "green"); - "step 1"; - if (event.targets.length) { - event.targets.shift().damage(); - event.redo(); - } - "step 2"; - if (event.targets2.length) { - var cur = event.targets2.shift(); - if (cur && cur.countCards("he")) { - cur.chooseToDiscard("he", true, 4); - } - event.redo(); - } - }, - ai: { - order: 10, - result: { - player(player) { - return game.countPlayer(function (current) { - if (current != player) { - return get.sgn(get.damageEffect(current, player, player)); - } - }); - }, - }, - combo: "baonu", - }, - }, - wuqian: { - audio: 2, - enable: "phaseUse", - derivation: "wushuang", - filter(event, player) { - return player.storage.baonu >= 2 && !player.hasSkill("wushuang"); - }, - content() { - player.storage.baonu -= 2; - player.addTempSkill("wushuang"); - }, - ai: { - order: 5, - result: { - player(player) { - if (!player.storage.shenfen) return 0; - var cards = player.getCards("h", "sha"); - if (cards.length) { - if ( - game.hasPlayer(function (current) { - return ( - player.canUse("sha", current) && - get.effect(current, cards[0], player, player) > 0 && - current.hasShan() - ); - }) - ) { - return 1; - } - } - return 0; - }, - }, - combo: "baonu", - }, - }, - renjie: { - audio: "renjie2", - trigger: { player: "damageEnd" }, - forced: true, - group: "renjie2", - notemp: true, - //mark:true, - filter(event) { - return event.num > 0; - }, - content() { - player.addMark("renjie", trigger.num); - }, - intro: { - name2: "忍", - content: "mark", - }, - ai: { - maixie: true, - maixie_hp: true, - combo: "sbaiyin", - effect: { - target(card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (get.tag(card, "damage")) { - if (target.hp == target.maxHp) { - if (!target.hasSkill("jilue")) { - return [0, 1]; - } - return [0.7, 1]; - } - return 0.7; - } - }, - }, - }, - }, - renjie2: { - audio: 2, - mod: { - aiOrder: (player, card, num) => { - if (num <= 0 || typeof card !== "object" || !player.isPhaseUsing()) return num; - if (player.hasSkill("sbaiyin")) { - if ( - player.countMark("renjie") < 4 && - player.getUseValue(card) < Math.min(4, (player.hp * player.hp) / 4) - ) - return 0; - } else if (player.hasSkill("jilue")) { - if ( - player.countMark("renjie") < 3 && - player.getUseValue(card) < Math.min(1.8, 0.18 * player.hp * player.hp) - ) - return 0; - } - }, - }, - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - forced: true, - filter(event, player) { - if (event.type != "discard" || event.getlx === false) return false; - var evt = event.getParent("phaseDiscard"), - evt2 = event.getl(player); - return ( - evt && - evt2 && - evt.name == "phaseDiscard" && - evt.player == player && - evt2.cards2 && - evt2.cards2.length > 0 - ); - }, - content() { - player.addMark("renjie", trigger.getl(player).cards2.length); - }, - }, - sbaiyin: { - skillAnimation: "epic", - animationColor: "thunder", - juexingji: true, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - unique: true, - audio: 2, - filter(event, player) { - return player.countMark("renjie") >= 4; - }, - content() { - player.awakenSkill("sbaiyin"); - player.loseMaxHp(); - player.addSkills("jilue"); - }, - derivation: ["jilue", "reguicai", "fangzhu", "rejizhi", "rezhiheng", "rewansha"], - ai: { - combo: "renjie", - }, - }, - jilue: { - unique: true, - group: ["jilue_guicai", "jilue_fangzhu", "jilue_wansha", "jilue_zhiheng", "jilue_jizhi"], - ai: { - combo: "renjie", - }, - }, - jilue_guicai: { - audio: 1, - trigger: { global: "judge" }, - direct: true, - filter(event, player) { - return player.countCards("hes") > 0 && player.hasMark("renjie"); - }, - content() { - "step 0"; - player.chooseCard("是否弃置一枚“忍”,并发动〖鬼才〗?", "hes", function (card) { - var player = _status.event.player; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - }).ai = function (card) { - var trigger = _status.event.parent._trigger; - var player = _status.event.player; - var result = trigger.judge(card) - trigger.judge(trigger.player.judging[0]); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0; - if (attitude > 0) { - return result - get.value(card) / 2; - } else { - return -result - get.value(card) / 2; - } - }; - "step 1"; - if (result.bool) { - player.respond(result.cards, "highlight", "jilue_guicai", "noOrdering"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.removeMark("renjie", 1); - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.delete(); - game.addVideo( - "deletenode", - player, - get.cardsInfo([trigger.player.judging[0].clone]) - ); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player, "的判定牌改为", result.cards[0]); - game.delay(2); - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - jilue_fangzhu: { - audio: 1, - trigger: { player: "damageEnd" }, - direct: true, - //priority:-1, - filter(event, player) { - return player.hasMark("renjie"); - }, - content() { - "step 0"; - player - .chooseTarget("是否弃置一枚“忍”,并发动【放逐】?", function (card, player, target) { - return player != target; - }) - .set("ai", (target) => { - if (target.hasSkillTag("noturn")) return 0; - var player = _status.event.player; - var current = _status.currentPhase; - var dis = current ? get.distance(current, target, "absolute") : 1; - var draw = player.getDamagedHp(); - var att = get.attitude(player, target); - if (att == 0) - return target.hasJudge("lebu") - ? Math.random() / 3 - : Math.sqrt(get.threaten(target)) / 5 + Math.random() / 2; - if (att > 0) { - if (target.isTurnedOver()) return att + draw; - if (draw < 4) return -1; - if (current && target.getSeatNum() > current.getSeatNum()) - return att + draw / 3; - return ( - (10 * Math.sqrt(Math.max(0.01, get.threaten(target)))) / (3.5 - draw) + - dis / (2 * game.countPlayer()) - ); - } else { - if (target.isTurnedOver()) return att - draw; - if (draw >= 5) return -1; - if (current && target.getSeatNum() <= current.getSeatNum()) - return -att + draw / 3; - return ( - (4.25 - draw) * 10 * Math.sqrt(Math.max(0.01, get.threaten(target))) + - (2 * game.countPlayer()) / dis - ); - } - }); - "step 1"; - if (result.bool) { - player.removeMark("renjie", 1); - player.logSkill("jilue_fangzhu", result.targets); - result.targets[0].draw(player.maxHp - player.hp); - result.targets[0].turnOver(); - } - }, - }, - jilue_wansha: { - audio: "wansha", - audioname: ["shen_simayi"], - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.hasMark("renjie"); - }, - content() { - player.removeMark("renjie", 1); - player.addTempSkill("rewansha"); - }, - ai: { - order: () => { - let player = _status.event.player; - if ( - game.hasPlayer((current) => { - if ( - player === current || - current.hp > 1 || - get.attitude(player, current) >= 0 - ) - return false; - return ( - (player.inRange(current) && - player.countCards("hs", "sha") && - player.getCardUsable("sha")) || - player.countCards( - "hs", - (card) => get.name(card) !== "sha" && get.tag(card, "damage") - ) > 1 - ); - }) - ) - return 9.2; - return 0; - }, - result: { - player: 1, - }, - effect: { - player(card, player, target) { - if ( - target && - player.hasSkill("rewansha") && - target.hp <= 1 && - get.tag(card, "damage") - ) - return [1, 0, 1.5, -1.5]; - }, - }, - }, - }, - jilue_zhiheng: { - audio: 1, - mod: { - aiOrder(player, card, num) { - if (num <= 0 || get.itemtype(card) != "card" || get.type(card) != "equip") return num; - let eq = player.getEquip(get.subtype(card)); - if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp)) - return 0; - }, - }, - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.hasMark("renjie"); - }, - position: "he", - filterCard: lib.filter.cardDiscardable, - discard: false, - lose: false, - delay: false, - selectCard: [1, Infinity], - prompt: "弃置一枚“忍”,然后弃置任意张牌并摸等量的牌。若弃置了所有的手牌,则可以多摸一张牌。", - check(card) { - var player = _status.event.player; - if ( - get.position(card) == "h" && - !player.countCards("h", function (card) { - return get.value(card) >= 8; - }) - ) { - return 8 - get.value(card); - } - return 6 - get.value(card); - }, - content() { - "step 0"; - player.removeMark("renjie", 1); - player.discard(cards); - event.num = 1; - var hs = player.getCards("h"); - if (!hs.length) event.num = 0; - for (var i = 0; i < hs.length; i++) { - if (!cards.includes(hs[i])) { - event.num = 0; - break; - } - } - "step 1"; - player.draw(event.num + cards.length); - }, - ai: { - order(item, player) { - if (player.hasCard((i) => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; - return 10; - }, - result: { - player(player) { - var num = 0; - var cards = player.getCards("he"); - for (var i = 0; i < cards.length; i++) { - if (get.value(cards[i]) < 6) { - num++; - } - } - if (cards.length > 2) return 1; - if (cards.length == 2 && player.storage.jilue > 1); - return 0; - }, - }, - nokeep: true, - skillTagFilter(player, tag, arg) { - if (tag === "nokeep") - return ( - player.isPhaseUsing() && - !player.getStat().skill.jilue_zhiheng && - player.hasCard((card) => get.name(card) !== "tao", "h") - ); - }, - }, - }, - jilue_jizhi: { - audio: 1, - trigger: { player: "useCard" }, - filter(event, player) { - return ( - get.type(event.card, "trick") == "trick" && - event.card.isCard && - player.hasMark("renjie") - ); - }, - content() { - "step 0"; - player.removeMark("renjie", 1); - player.draw(); - "step 1"; - event.card = result[0]; - if (get.type(event.card) == "basic") { - player - .chooseBool("是否弃置" + get.translation(event.card) + "并令本回合手牌上限+1?") - .set("ai", function (evt, player) { - return ( - _status.currentPhase == player && - player.needsToDiscard(-3) && - _status.event.value < 6 - ); - }) - .set("value", get.value(event.card, player)); - } - "step 2"; - if (result.bool) { - player.discard(event.card); - player.addTempSkill("jilue_jizhi_clear"); - player.addMark("jilue_jizhi_clear", 1, false); - } - }, - subSkill: { - clear: { - charlotte: true, - onremove: true, - mod: { - maxHandcard(player, num) { - return num + player.countMark("jilue_jizhi_clear"); - }, - }, - intro: { content: "手牌上限+#" }, - }, - }, - }, - wushen: { - mod: { - cardname(card, player, name) { - if (get.suit(card) == "heart") return "sha"; - }, - cardnature(card, player) { - if (get.suit(card) == "heart") return false; - }, - targetInRange(card) { - if (card.name === "sha") { - const suit = get.suit(card); - if (suit === "heart" || suit === "unsure") return true; - } - }, - cardUsable(card) { - if (card.name === "sha") { - const suit = get.suit(card); - if (suit === "heart" || suit === "unsure") return Infinity; - } - }, - }, - audio: 2, - trigger: { player: "useCard" }, - forced: true, - filter(event, player) { - return event.card.name == "sha" && get.suit(event.card) == "heart"; - }, - content() { - trigger.directHit.addArray(game.players); - if (trigger.addCount !== false) { - trigger.addCount = false; - if (player.stat[player.stat.length - 1].card.sha > 0) { - player.stat[player.stat.length - 1].card.sha--; - } - } - }, - ai: { - effect: { - target(card, player, target, current) { - if (get.tag(card, "respondSha") && current < 0) return 0.6; - }, - }, - directHit_ai: true, - skillTagFilter(player, tag, arg) { - return arg.card.name == "sha" && get.suit(arg.card) == "heart"; - }, - }, - }, - wuhun: { - audio: "wuhun2", - trigger: { player: "die" }, - filter(event) { - return event.source && event.source.isIn(); - }, - forced: true, - forceDie: true, - skillAnimation: true, - animationColor: "soil", - logTarget: "source", - content() { - var num = trigger.source.getHp(); - if (num > 0) trigger.source.loseHp(num); - }, - ai: { - threaten(player, target) { - if (target.hp == 1) { - if (player.getHp() <= 0) return 100; - return 0.2; - } - return 0.8; - }, - effect: { - target(card, player, target, current) { - if (player.getHp() <= 0) return; - if (!target.hasFriend()) return; - if (target.hp <= 1 && get.tag(card, "damage")) return [1, 0, 0, -2]; - }, - }, - }, - }, - guixin: { - audio: 2, - trigger: { player: "damageEnd" }, - check(event, player) { - if (player.isTurnedOver() || event.num > 1) return true; - var num = game.countPlayer(function (current) { - if ( - current.countCards("he") && - current != player && - get.attitude(player, current) <= 0 - ) { - return true; - } - if ( - current.countCards("j") && - current != player && - get.attitude(player, current) > 0 - ) { - return true; - } - }); - return num >= 2; - }, - content() { - "step 0"; - event.count = trigger.num; - "step 1"; - var targets = game.filterPlayer((current) => current != player).sortBySeat(); - player.line(targets); - player.gainMultiple(targets, "hej"); - "step 2"; - player.turnOver(); - "step 3"; - event.count--; - if (event.count && player.hasSkill("guixin")) { - player.chooseBool(get.prompt2("guixin")); - } else event.finish(); - "step 4"; - if (event.count && result.bool) event.goto(1); - }, - ai: { - maixie: true, - maixie_hp: true, - threaten(player, target) { - if (target.hp == 1) return 2.5; - return 0.5; - }, - effect: { - target(card, player, target) { - if ( - !target._guixin_eff && - get.tag(card, "damage") && - target.hp > - (player.hasSkillTag("damageBonus", true, { - card: card, - target: target, - }) - ? 2 - : 1) - ) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - target._guixin_eff = true; - let gain = game.countPlayer(function (current) { - if (target == current) return 0; - if (get.attitude(target, current) > 0) { - if ( - current.hasCard( - (cardx) => - lib.filter.canBeGained( - cardx, - target, - current, - "guixin" - ) && get.effect(current, cardx, current, current) < 0, - "ej" - ) - ) - return 1.3; - return 0; - } - if ( - current.hasCard( - (cardx) => - lib.filter.canBeGained(cardx, target, current, "guixin") && - get.effect(current, cardx, current, current) > 0, - "ej" - ) - ) - return 1.1; - if ( - current.hasCard( - (cardx) => - lib.filter.canBeGained(cardx, target, current, "guixin"), - "h" - ) - ) - return 0.9; - return 0; - }); - if (target.isTurnedOver()) gain += 2.3; - else gain -= 2.3; - delete target._guixin_eff; - return [1, Math.max(0, gain)]; - } - }, - }, - }, - }, - qixing: { - audio: 2, - unique: true, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content() { - "step 0"; - player.addToExpansion(get.cards(7), "draw").gaintag.add("qixing"); - "step 1"; - var cards = player.getExpansions("qixing"); - if (!cards.length || !player.countCards("h")) { - event.finish(); - return; - } - var next = player.chooseToMove("七星:是否交换“星”和手牌?"); - next.set("list", [ - [get.translation(player) + "(你)的星", cards], - ["手牌区", player.getCards("h")], - ]); - next.set("filterMove", function (from, to) { - return typeof to != "number"; - }); - next.set("processAI", function (list) { - var player = _status.event.player, - cards = list[0][1].concat(list[1][1]).sort(function (a, b) { - return get.useful(a) - get.useful(b); - }), - cards2 = cards.splice(0, player.getExpansions("qixing").length); - return [cards2, cards]; - }); - "step 2"; - if (result.bool) { - var pushs = result.moved[0], - gains = result.moved[1]; - pushs.removeArray(player.getExpansions("qixing")); - gains.removeArray(player.getCards("h")); - if (!pushs.length || pushs.length != gains.length) return; - player.addToExpansion(pushs, player, "giveAuto").gaintag.add("qixing"); - //game.log(player,'将',pushs,'作为“星”置于武将牌上'); - player.gain(gains, "draw"); - } - }, - intro: { - markcount: "expansion", - mark(dialog, content, player) { - var content = player.getExpansions("qixing"); - if (content && content.length) { - if (player == game.me || player.isUnderControl()) { - dialog.addAuto(content); - } else { - return "共有" + get.cnNumber(content.length) + "张星"; - } - } - }, - content(content, player) { - var content = player.getExpansions("qixing"); - if (content && content.length) { - if (player == game.me || player.isUnderControl()) { - return get.translation(content); - } - return "共有" + get.cnNumber(content.length) + "张星"; - } - }, - }, - group: ["qixing2"], - ai: { combo: "dawu" }, - }, - qixing2: { - trigger: { player: "phaseDrawAfter" }, - direct: true, - filter(event, player) { - return player.getExpansions("qixing").length > 0 && player.countCards("h") > 0; - }, - content() { - "step 0"; - var cards = player.getExpansions("qixing"); - if (!cards.length || !player.countCards("h")) { - event.finish(); - return; - } - var next = player.chooseToMove("七星:是否交换“星”和手牌?"); - next.set("list", [ - [get.translation(player) + "(你)的星", cards], - ["手牌区", player.getCards("h")], - ]); - next.set("filterMove", function (from, to) { - return typeof to != "number"; - }); - next.set("processAI", function (list) { - var player = _status.event.player, - cards = list[0][1].concat(list[1][1]).sort(function (a, b) { - return get.value(a) - get.value(b); - }), - cards2 = cards.splice(0, player.getExpansions("qixing").length); - return [cards2, cards]; - }); - "step 1"; - if (result.bool) { - var pushs = result.moved[0], - gains = result.moved[1]; - pushs.removeArray(player.getExpansions("qixing")); - gains.removeArray(player.getCards("h")); - if (!pushs.length || pushs.length != gains.length) return; - player.logSkill("qixing2"); - player.addToExpansion(pushs, player, "giveAuto").gaintag.add("qixing"); - game.log(player, "将", pushs, "作为“星”置于武将牌上"); - player.gain(gains, "draw"); - } - }, - }, - dawu: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter(event, player) { - return player.getExpansions("qixing").length; - }, - audio: 2, - content() { - "step 0"; - var num = Math.min(game.countPlayer(), player.getExpansions("qixing").length); - player - .chooseTarget( - get.prompt("dawu"), - "令至多" + get.cnNumber(num) + "名角色获得“大雾”标记", - [1, num] - ) - .set("ai", function (target) { - if (target.isMin()) return 0; - if (target.hasSkill("biantian2") || target.hasSkill("dawu2")) return 0; - var att = get.attitude(player, target); - if (att >= 4) { - if (target.hp > 2 && (target.isHealthy() || target.hasSkillTag("maixie"))) - return 0; - if (_status.event.allUse) return att; - if (target.hp == 1) return att; - if (target.hp == 2 && target.countCards("he") <= 2) return att * 0.7; - return 0; - } - return -1; - }) - .set( - "allUse", - player.getExpansions("qixing").length >= - game.countPlayer(function (current) { - return get.attitude(player, current) > 4; - }) * - 2 - ); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.logSkill("dawu", targets, "thunder"); - var length = targets.length; - targets.forEach((target) => { - target.addAdditionalSkill(`dawu_${player.playerid}`, "dawu2"); - target.markAuto("dawu2", [player]); - }); - player.addTempSkill("dawu3", { player: "phaseBeginStart" }); - player.chooseCardButton( - "选择弃置" + get.cnNumber(length) + "张“星”", - length, - player.getExpansions("qixing"), - true - ); - } else { - event.finish(); - } - "step 2"; - player.loseToDiscardpile(result.links); - }, - ai: { combo: "qixing" }, - }, - dawu2: { - charlotte: true, - ai: { - nofire: true, - nodamage: true, - effect: { - target(card, player, target, current) { - if (get.tag(card, "damage") && !get.tag(card, "thunderDamage")) - return "zeroplayertarget"; - }, - }, - }, - intro: { - content(storage) { - return `共有${storage.length}枚标记`; - }, - }, - }, - dawu3: { - trigger: { global: "damageBegin4" }, - filter(event, player) { - return !event.hasNature("thunder") && event.player.getStorage("dawu2").includes(player); - }, - forced: true, - charlotte: true, - logTarget: "player", - content() { - trigger.cancel(); - }, - onremove(player) { - game.countPlayer2((current) => { - if (current.getStorage("dawu2").includes(player)) { - current.unmarkAuto("dawu2", [player]); - current.removeAdditionalSkill(`dawu_${player.playerid}`); - } - }, true); - }, - }, - kuangfeng: { - unique: true, - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter(event, player) { - return player.getExpansions("qixing").length; - }, - content() { - "step 0"; - player.chooseTarget(get.prompt("kuangfeng"), "令一名角色获得“狂风”标记").ai = function ( - target - ) { - return -1; - }; - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.logSkill("kuangfeng", targets, "fire"); - var length = targets.length; - targets.forEach((target) => { - target.addAdditionalSkill(`kuangfeng_${player.playerid}`, "kuangfeng2"); - target.markAuto("kuangfeng2", [player]); - }); - player.addTempSkill("kuangfeng3", { player: "phaseBeginStart" }); - player.chooseCardButton( - "选择弃置" + get.cnNumber(length) + "张“星”", - length, - player.getExpansions("qixing"), - true - ); - } else { - event.finish(); - } - "step 2"; - player.loseToDiscardpile(result.links); - }, - ai: { combo: "qixing" }, - }, - kuangfeng2: { - charlotte: true, - intro: { - content(storage) { - return `共有${storage.length}枚标记`; - }, - }, - ai: { - effect: { - target(card, player, target, current) { - if (get.tag(card, "fireDamage") && current < 0) return 1.5; - }, - }, - }, - }, - kuangfeng3: { - trigger: { global: "damageBegin3" }, - filter(event, player) { - return event.hasNature("fire") && event.player.getStorage("kuangfeng2").includes(player); - }, - charlotte: true, - forced: true, - logTarget: "player", - content() { - trigger.num++; - }, - onremove(player) { - game.countPlayer2((current) => { - if (current.getStorage("kuangfeng2").includes(player)) { - current.unmarkAuto("kuangfeng2", player); - current.removeAdditionalSkill(`kuangfeng_${player.playerid}`); - } - }, true); - }, - }, - yeyan: { - unique: true, - limited: true, - audio: 3, - enable: "phaseUse", - filterCard(card, player) { - return !ui.selected.cards.some( - (cardx) => get.suit(cardx, player) == get.suit(card, player) - ); - }, - selectCard: [0, 4], - filterTarget(card, player, target) { - var length = ui.selected.cards.length; - return length == 0 || length == 4; - }, - selectTarget() { - if (ui.selected.cards.length == 4) return [1, 2]; - if (ui.selected.cards.length == 0) return [1, 3]; - game.uncheck("target"); - return [1, 3]; - }, - complexCard: true, - complexSelect: true, - line: "fire", - forceDie: true, - animationColor: "metal", - skillAnimation: "legend", - check(card) { - if (!lib.skill.yeyan.getBigFire(get.event("player"))) return -1; - return 1 / (get.value(card) || 0.5); - }, - multitarget: true, - multiline: true, - contentBefore() { - player.awakenSkill("yeyan"); - }, - content() { - "step 0"; - event.num = 0; - targets.sortBySeat(); - "step 1"; - if (cards.length == 4) event.goto(2); - else { - if (event.num < targets.length) { - targets[event.num].damage("fire", 1, "nocard"); - event.num++; - } - if (event.num == targets.length) event.finish(); - else event.redo(); - } - "step 2"; - player.loseHp(3); - if (targets.length == 1) event.goto(4); - else { - player - .chooseTarget("请选择受到2点伤害的角色", true, function (card, player, target) { - return _status.event.targets.includes(target); - }) - .set("ai", function (target) { - return 1; - }) - .set("forceDie", true) - .set("targets", targets); - } - "step 3"; - if (event.num < targets.length) { - var dnum = 1; - if (result.bool && result.targets && targets[event.num] == result.targets[0]) - dnum = 2; - targets[event.num].damage("fire", dnum, "nocard"); - event.num++; - } - if (event.num == targets.length) event.finish(); - else event.redo(); - "step 4"; - player - .chooseControl("2点", "3点") - .set("prompt", "请选择伤害点数") - .set("ai", function () { - return "3点"; - }) - .set("forceDie", true); - "step 5"; - targets[0].damage("fire", result.control == "2点" ? 2 : 3, "nocard"); - }, - ai: { - order(item, player) { - return lib.skill.yeyan.getBigFire(player) ? 10 : 1; - }, - fireAttack: true, - result: { - target(player, target) { - if (player.hasUnknown()) return 0; - const att = get.sgn(get.attitude(player, target)); - const targets = game.filterPlayer( - (target) => - get.damageEffect(target, player, player, "fire") && - (!lib.skill.yeyan.getBigFire(player) || - (target.hp <= 3 && - !target.hasSkillTag("filterDamage", null, { player: player }))) - ); - if (!targets.includes(target)) return 0; - if (lib.skill.yeyan.getBigFire(player)) { - if (ui.selected.targets.length) return 0; - if ( - !( - targets.length == 1 || - (att < 0 && target.identity && target.identity.indexOf("zhu") != -1) - ) - ) - return 0; - } - return att * get.damageEffect(target, player, player, "fire"); - }, - }, - }, - getBigFire(player) { - if ( - player - .getDiscardableCards(player, "h") - .reduce((list, card) => list.add(get.suit(card, player)), []).length < 4 - ) - return false; - const targets = game.filterPlayer( - (target) => - get.damageEffect(target, player, player, "fire") && - target.hp <= 3 && - !target.hasSkillTag("filterDamage", null, { player: player }) - ); - if (!targets.length) return false; - if ( - targets.length == 1 || - targets.some( - (target) => - get.attitude(player, target) < 0 && - target.identity && - target.identity.indexOf("zhu") != -1 - ) - ) { - let suits = player.getDiscardableCards(player, "h").reduce((map, card) => { - const suit = get.suit(card, player); - if (!map[suit]) map[suit] = []; - return map; - }, {}), - cards = []; - Object.keys(suits).forEach((i) => { - suits[i].addArray( - player.getDiscardableCards(player, "h").filter((card) => get.suit(card) == i) - ); - cards.add(suits[i].sort((a, b) => get.value(a) - get.value(b))[0]); - }); - return ( - player.hp + - player.countCards( - "h", - (card) => !cards.includes(card) && player.canSaveCard(card, player) - ) - - 3 > - 0 - ); - } - return false; - }, - }, - longhun: { - audio: 4, - group: ["longhun1", "longhun2", "longhun3", "longhun4"], - ai: { - fireAttack: true, - skillTagFilter(player, tag) { - switch (tag) { - case "respondSha": { - if (player.countCards("he", { suit: "diamond" }) < Math.max(1, player.hp)) - return false; - break; - } - case "respondShan": { - if (player.countCards("he", { suit: "club" }) < Math.max(1, player.hp)) - return false; - break; - } - case "save": { - if (player.countCards("he", { suit: "heart" }) < Math.max(1, player.hp)) - return false; - break; - } - default: - return true; - } - }, - maixie: true, - respondSha: true, - respondShan: true, - effect: { - target(card, player, target) { - if (get.tag(card, "recover") && target.hp >= 1) return [0, 0]; - if (!target.hasFriend()) return; - if ((get.tag(card, "damage") == 1 || get.tag(card, "loseHp")) && target.hp > 1) - return [0, 1]; - }, - }, - threaten(player, target) { - if (target.hp == 1) return 2; - return 0.5; - }, - }, - }, - longhun1: { - audio: true, - enable: ["chooseToUse", "chooseToRespond"], - prompt() { - return "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张红桃牌当作桃使用"; - }, - position: "hes", - check(card, event) { - if (_status.event.player.hp > 1) return 0; - return 10 - get.value(card); - }, - selectCard() { - return Math.max(1, _status.event.player.hp); - }, - viewAs: { name: "tao" }, - viewAsFilter(player) { - return player.countCards("hes", { suit: "heart" }) >= player.hp; - }, - filterCard(card) { - return get.suit(card) == "heart"; - }, - }, - longhun2: { - audio: true, - enable: ["chooseToUse", "chooseToRespond"], - prompt() { - return ( - "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张方片当作火杀使用或打出" - ); - }, - position: "hes", - check(card, event) { - if (_status.event.player.hp > 1) return 0; - return 10 - get.value(card); - }, - selectCard() { - return Math.max(1, _status.event.player.hp); - }, - viewAs: { name: "sha", nature: "fire" }, - viewAsFilter(player) { - return player.countCards("hes", { suit: "diamond" }) >= player.hp; - }, - filterCard(card) { - return get.suit(card) == "diamond"; - }, - }, - longhun3: { - audio: true, - enable: ["chooseToUse", "chooseToRespond"], - prompt() { - return ( - "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张黑桃牌当作无懈可击使用" - ); - }, - position: "hes", - check(card, event) { - if (_status.event.player.hp > 1) return 0; - return 7 - get.value(card); - }, - selectCard() { - return Math.max(1, _status.event.player.hp); - }, - viewAs: { name: "wuxie" }, - viewAsFilter(player) { - return player.countCards("hes", { suit: "spade" }) >= player.hp; - }, - filterCard(card) { - return get.suit(card) == "spade"; - }, - }, - longhun4: { - audio: true, - enable: ["chooseToUse", "chooseToRespond"], - prompt() { - return ( - "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张梅花牌当作闪使用或打出" - ); - }, - position: "hes", - check(card, event) { - if (_status.event.player.hp > 1) return 0; - return 10 - get.value(card); - }, - selectCard() { - return Math.max(1, _status.event.player.hp); - }, - viewAsFilter(player) { - return player.countCards("hes", { suit: "club" }) >= player.hp; - }, - viewAs: { name: "shan" }, - filterCard(card) { - return get.suit(card) == "club"; - }, - }, - juejing: { - mod: { - maxHandcard(player, num) { - return 2 + num; - }, - }, - audio: true, - trigger: { player: "phaseDrawBegin2" }, - //priority:-5, - filter(event, player) { - return !event.numFixed && player.hp < player.maxHp; - }, - forced: true, - content() { - trigger.num += player.getDamagedHp(); - }, - }, - relonghun: { - audio: 2, - //技能发动时机 - enable: ["chooseToUse", "chooseToRespond"], - //发动时提示的技能描述 - prompt: "将♦牌当做杀,♥牌当做桃,♣牌当做闪,♠牌当做无懈可击使用或打出", - //动态的viewAs - viewAs(cards, player) { - if (cards.length) { - var name = false, - nature = null; - //根据选择的卡牌的花色 判断要转化出的卡牌是闪还是火杀还是无懈还是桃 - switch (get.suit(cards[0], player)) { - case "club": - name = "shan"; - break; - case "diamond": - name = "sha"; - nature = "fire"; - break; - case "spade": - name = "wuxie"; - break; - case "heart": - name = "tao"; - break; - } - //返回判断结果 - if (name) return { name: name, nature: nature }; - } - return null; - }, - //AI选牌思路 - check(card) { - if (ui.selected.cards.length) return 0; - var player = _status.event.player; - if (_status.event.type == "phase") { - var max = 0; - var name2; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hes", function (card) { - return ( - (name != "sha" || get.value(card) < 5) && - get.suit(card, player) == map[name] - ); - }) > 0 && - player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 - ) { - var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); - if (temp > max) { - max = temp; - name2 = map[name]; - } - } - } - if (name2 == get.suit(card, player)) - return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); - return 0; - } - return 1; - }, - //选牌数量 - selectCard: [1, 2], - //确保选择第一张牌后 重新检测第二张牌的合法性 避免选择两张花色不同的牌 - complexCard: true, - //选牌范围:手牌区和装备区和木马 - position: "hes", - //选牌合法性判断 - filterCard(card, player, event) { - //如果已经选了一张牌 那么第二张牌和第一张花色相同即可 - if (ui.selected.cards.length) - return get.suit(card, player) == get.suit(ui.selected.cards[0], player); - event = event || _status.event; - //获取当前时机的卡牌选择限制 - var filter = event._backup.filterCard; - //获取卡牌花色 - var name = get.suit(card, player); - //如果这张牌是梅花并且当前时机能够使用/打出闪 那么这张牌可以选择 - if (name == "club" && filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) - return true; - //如果这张牌是方片并且当前时机能够使用/打出火杀 那么这张牌可以选择 - if ( - name == "diamond" && - filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) - ) - return true; - //如果这张牌是黑桃并且当前时机能够使用/打出无懈 那么这张牌可以选择 - if (name == "spade" && filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) - return true; - //如果这张牌是红桃并且当前时机能够使用/打出桃 那么这张牌可以选择 - if (name == "heart" && filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event)) - return true; - //上述条件都不满足 那么就不能选择这张牌 - return false; - }, - //判断当前时机能否发动技能 - filter(event, player) { - //获取当前时机的卡牌选择限制 - var filter = event.filterCard; - //如果当前时机能够使用/打出火杀并且角色有方片 那么可以发动技能 - if ( - filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && - player.countCards("hes", { suit: "diamond" }) - ) - return true; - //如果当前时机能够使用/打出闪并且角色有梅花 那么可以发动技能 - if ( - filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && - player.countCards("hes", { suit: "club" }) - ) - return true; - //如果当前时机能够使用/打出桃并且角色有红桃 那么可以发动技能 - if ( - filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && - player.countCards("hes", { suit: "heart" }) - ) - return true; - //如果当前时机能够使用/打出无懈可击并且角色有黑桃 那么可以发动技能 - if ( - filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && - player.countCards("hes", { suit: "spade" }) - ) - return true; - return false; - }, - ai: { - respondSha: true, - respondShan: true, - //让系统知道角色“有杀”“有闪” - skillTagFilter(player, tag) { - var name; - switch (tag) { - case "respondSha": - name = "diamond"; - break; - case "respondShan": - name = "club"; - break; - case "save": - name = "heart"; - break; - } - if (!player.countCards("hes", { suit: name })) return false; - }, - //AI牌序 - order(item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hes", function (card) { - return ( - (name != "sha" || get.value(card) < 5) && - get.suit(card, player) == map[name] - ); - }) > 0 && - player.getUseValue({ - name: name, - nature: name == "sha" ? "fire" : null, - }) > 0 - ) { - var temp = get.order({ - name: name, - nature: name == "sha" ? "fire" : null, - }); - if (temp > max) max = temp; - } - } - max /= 1.1; - return max; - } - return 2; - }, - }, - //让系统知道玩家“有无懈”“有桃” - hiddenCard(player, name) { - if (name == "wuxie" && _status.connectMode && player.countCards("hs") > 0) return true; - if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; - if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; - }, - group: ["relonghun_num", "relonghun_discard"], - subSkill: { - num: { - trigger: { player: "useCard" }, - forced: true, - popup: false, - filter(event) { - var evt = event; - return ( - ["sha", "tao"].includes(evt.card.name) && - evt.skill == "relonghun" && - evt.cards && - evt.cards.length == 2 - ); - }, - content() { - trigger.baseDamage++; - }, - }, - discard: { - trigger: { player: ["useCardAfter", "respondAfter"] }, - forced: true, - popup: false, - logTarget() { - return _status.currentPhase; - }, - autodelay(event) { - return event.name == "respond" ? 0.5 : false; - }, - filter(evt, player) { - return ( - ["shan", "wuxie"].includes(evt.card.name) && - evt.skill == "relonghun" && - evt.cards && - evt.cards.length == 2 && - _status.currentPhase && - _status.currentPhase != player && - _status.currentPhase.countDiscardableCards(player, "he") - ); - }, - content() { - //game.log(trigger.card) - //game.log(trigger.cards) - player.line(_status.currentPhase, "green"); - player.discardPlayerCard(_status.currentPhase, "he", true); - }, - }, - }, - }, - xinlonghun: { - audio: "longhun", - enable: ["chooseToUse", "chooseToRespond"], - prompt: "将♦手牌当做火【杀】,♥手牌当做【桃】,♣手牌当做【闪】,♠手牌当做【无懈可击】使用或打出", - viewAs(cards, player) { - if (cards.length) { - var name = false, - nature = null; - switch (get.suit(cards[0], player)) { - case "club": - name = "shan"; - break; - case "diamond": - name = "sha"; - nature = "fire"; - break; - case "spade": - name = "wuxie"; - break; - case "heart": - name = "tao"; - break; - } - if (name) return { name: name, nature: nature }; - } - return null; - }, - check(card) { - var player = _status.event.player; - if (_status.event.type == "phase") { - var max = 0; - var name2; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hs", function (card) { - return ( - (name != "sha" || get.value(card) < 5) && - get.suit(card, player) == map[name] - ); - }) > 0 && - player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 - ) { - var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); - if (temp > max) { - max = temp; - name2 = map[name]; - } - } - } - if (name2 == get.suit(card, player)) - return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); - return 0; - } - return 1; - }, - position: "hs", - filterCard(card, player, event) { - event = event || _status.event; - var filter = event._backup.filterCard; - var name = get.suit(card, player); - if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; - if ( - name == "diamond" && - filter({ name: "sha", cards: [card], nature: "fire" }, player, event) - ) - return true; - if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) - return true; - if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; - return false; - }, - filter(event, player) { - var filter = event.filterCard; - if ( - filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && - player.countCards("hs", { suit: "diamond" }) - ) - return true; - if ( - filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && - player.countCards("hs", { suit: "club" }) - ) - return true; - if ( - filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && - player.countCards("hs", { suit: "heart" }) - ) - return true; - if ( - filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && - player.countCards("hs", { suit: "spade" }) - ) - return true; - return false; - }, - precontent() { - delete event.result.skill; - player.logSkill( - "longhun" + (4 - lib.suit.indexOf(get.suit(event.result.cards[0], player))) - ); - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter(player, tag) { - var name; - switch (tag) { - case "respondSha": - name = "diamond"; - break; - case "respondShan": - name = "club"; - break; - case "save": - name = "heart"; - break; - } - if (!player.countCards("hs", { suit: name })) return false; - }, - order(item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hs", function (card) { - return ( - (name != "sha" || get.value(card) < 5) && - get.suit(card, player) == map[name] - ); - }) > 0 && - player.getUseValue({ - name: name, - nature: name == "sha" ? "fire" : null, - }) > 0 - ) { - var temp = get.order({ - name: name, - nature: name == "sha" ? "fire" : null, - }); - if (temp > max) max = temp; - } - } - max /= 1.1; - return max; - } - return 2; - }, - }, - hiddenCard(player, name) { - if (name == "wuxie" && _status.connectMode && player.countCards("hs") > 0) return true; - if (name == "wuxie") return player.countCards("hs", { suit: "spade" }) > 0; - if (name == "tao") return player.countCards("hs", { suit: "heart" }) > 0; - }, - }, - xinjuejing: { - mod: { - maxHandcard(player, num) { - return 2 + num; - }, - }, - audio: 2, - trigger: { player: ["dying", "dyingAfter"] }, - forced: true, - content() { - player.draw(); - }, - }, - shelie: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter(event, player) { - return !event.numFixed; - }, - content() { - "step 0"; - trigger.changeToZero(); - event.cards = get.cards(5); - game.cardsGotoOrdering(event.cards); - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (player, id, cards) { - var str; - if (player == game.me && !_status.auto) { - str = "涉猎:获取花色各不相同的牌"; - } else { - 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.suit(i, false)); - var next = player.chooseButton(list.length, true); - next.set("dialog", event.videoId); - next.set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if (get.suit(ui.selected.buttons[i].link) == get.suit(button.link)) return false; - } - return true; - }); - next.set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - "step 2"; - if (result.bool && result.links) { - event.cards2 = result.links; - } else { - event.finish(); - } - var time = 1000 - (get.utc() - event.time); - if (time > 0) { - game.delay(0, time); - } - "step 3"; - game.broadcastAll("closeDialog", event.videoId); - var cards2 = event.cards2; - player.gain(cards2, "log", "gain2"); - }, - ai: { - threaten: 1.2, - }, - }, - gongxin: { - audio: 2, - audioname: ["re_lvmeng", "gexuan"], - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target != player && target.countCards("h"); - }, - content() { - "step 0"; - var cards = target.getCards("h"); - player - .chooseButton(2, ["攻心", cards, [["弃置此牌", "置于牌堆顶"], "tdnodes"]]) - .set("filterButton", function (button) { - var type = typeof button.link; - if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) - return false; - return type == "string" || get.suit(button.link) == "heart"; - }); - "step 1"; - if (result.bool) { - if (typeof result.links[0] != "string") result.links.reverse(); - var card = result.links[1], - choice = result.links[0]; - if (choice == "弃置此牌") target.discard(card); - else { - player.showCards( - card, - get.translation(player) + "对" + get.translation(target) + "发动了【攻心】" - ); - target.lose(card, ui.cardPile, "visible", "insert"); - } - } - }, - ai: { - threaten: 1.5, - result: { - target(player, target) { - return -target.countCards("h"); - }, - }, - order: 10, - expose: 0.4, - }, - }, - nzry_longnu: { - mark: true, - locked: true, - zhuanhuanji: true, - marktext: "☯", - intro: { - content(storage, player, skill) { - if (player.storage.nzry_longnu == true) - return "锁定技,出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷杀且无使用次数限制"; - return "锁定技,出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火杀且无距离限制"; - }, - }, - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - forced: true, - content() { - "step 0"; - player.changeZhuanhuanji("nzry_longnu"); - if (player.storage.nzry_longnu != true) { - player.loseMaxHp(); - } else { - player.loseHp(); - } - player.draw(); - "step 1"; - if (player.storage.nzry_longnu != true) { - player.addTempSkill("nzry_longnu_2", "phaseUseAfter"); - } else { - player.addTempSkill("nzry_longnu_1", "phaseUseAfter"); - } - }, - subSkill: { - 1: { - mod: { - cardname(card, player) { - if (get.color(card) == "red") return "sha"; - }, - cardnature(card, player) { - if (get.color(card) == "red") return "fire"; - }, - targetInRange(card) { - if (get.color(card) == "red") return true; - }, - }, - ai: { - effect: { - target(card, player, target, current) { - if (get.tag(card, "respondSha") && current < 0) return 0.6; - }, - }, - respondSha: true, - }, - }, - 2: { - mod: { - cardname(card, player) { - if (["trick", "delay"].includes(lib.card[card.name].type)) return "sha"; - }, - cardnature(card, player) { - if (["trick", "delay"].includes(lib.card[card.name].type)) return "thunder"; - }, - cardUsable(card, player) { - if (card.name == "sha" && game.hasNature(card, "thunder")) return Infinity; - }, - }, - ai: { - effect: { - target(card, player, target, current) { - if (get.tag(card, "respondSha") && current < 0) return 0.6; - }, - }, - respondSha: true, - }, - }, - }, - ai: { - fireAttack: true, - halfneg: true, - threaten: 1.05, - }, - }, - nzry_jieying: { - audio: 2, - locked: true, - global: "g_nzry_jieying", - ai: { - effect: { - target(card) { - if (card.name == "tiesuo") return "zeroplayertarget"; - }, - }, - }, - group: ["nzry_jieying_1", "nzry_jieying_2"], - subSkill: { - 1: { - audio: "nzry_jieying", - trigger: { - player: ["linkBefore", "enterGame"], - global: "phaseBefore", - }, - forced: true, - filter(event, player) { - if (event.name == "link") return player.isLinked(); - return (event.name != "phase" || game.phaseNumber == 0) && !player.isLinked(); - }, - content() { - if (trigger.name != "link") player.link(true); - else trigger.cancel(); - }, - }, - 2: { - audio: "nzry_jieying", - trigger: { - player: "phaseJieshuBegin", - }, - direct: true, - filter(event, player) { - return game.hasPlayer(function (current) { - return current != player && !current.isLinked(); - }); - }, - content() { - "step 0"; - player.chooseTarget( - true, - "请选择【结营】的目标", - function (card, player, target) { - return target != player && !target.isLinked(); - } - ).ai = function (target) { - return 1 + Math.random(); - }; - "step 1"; - if (result.bool) { - player.line(result.targets); - player.logSkill("nzry_jieying"); - result.targets[0].link(true); - } else { - event.finish(); - } - }, - }, - }, - }, - g_nzry_jieying: { - mod: { - maxHandcard(player, num) { - if ( - game.countPlayer(function (current) { - return current.hasSkill("nzry_jieying"); - }) > 0 && - player.isLinked() - ) - return num + 2; - }, - }, - }, - nzry_junlve: { - audio: 2, - //marktext:"军", - intro: { - content: "当前有#个标记", - }, - //mark:true, - trigger: { - player: "damageAfter", - source: "damageSource", - }, - forced: true, - content() { - player.addMark("nzry_junlve", trigger.num); - }, - ai: { - combo: "nzry_cuike", - }, - }, - nzry_cuike: { - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - direct: true, - content() { - "step 0"; - if (player.countMark("nzry_junlve") % 2 == 1) { - player.chooseTarget("是否发动【摧克】,对一名角色造成1点伤害?").ai = function ( - target - ) { - return -get.attitude(player, target); - }; - } else { - player.chooseTarget("是否发动【摧克】,横置一名角色并弃置其区域内的一张牌?").ai = - function (target) { - return -get.attitude(player, target); - }; - } - "step 1"; - if (result.bool) { - player.logSkill("nzry_cuike", result.targets); - if (player.countMark("nzry_junlve") % 2 == 1) { - result.targets[0].damage(); - } else { - result.targets[0].link(true); - player.discardPlayerCard(result.targets[0], 1, "hej", true); - } - } - "step 2"; - if (player.countMark("nzry_junlve") > 7) { - player - .chooseBool() - .set("ai", function () { - return true; - }) - .set("prompt", "是否弃置所有“军略”标记并对所有其他角色造成1点伤害?"); - } else { - event.finish(); - } - "step 3"; - if (result.bool) { - var players = game.players.slice(0).sortBySeat(); - player.line(players); - player.removeMark("nzry_junlve", player.countMark("nzry_junlve")); - for (var i = 0; i < players.length; i++) { - if (players[i] != player) players[i].damage(); - } - } - }, - ai: { - combo: "nzry_junlve" - }, - }, - nzry_dinghuo: { - audio: 2, - limited: true, - init(player) { - player.storage.nzry_dinghuo = false; - }, - intro: { - content: "limited", - }, - unique: true, - mark: true, - skillAnimation: true, - animationColor: "metal", - enable: "phaseUse", - filter(event, player) { - return !player.storage.nzry_dinghuo && player.countMark("nzry_junlve") > 0; - }, - check(event, player) { - var num = game.countPlayer(function (current) { - return get.attitude(player, current) < 0 && current.isLinked(); - }); - return ( - player.storage.nzry_junlve >= num && - num == - game.countPlayer(function (current) { - return get.attitude(player, current) < 0; - }) - ); - }, - filterTarget(card, player, target) { - return target.isLinked(); - }, - selectTarget() { - return [1, _status.event.player.countMark("nzry_junlve")]; - }, - multiline: true, - multitarget: true, - content() { - "step 0"; - player.awakenSkill("nzry_dinghuo"); - player.storage.nzry_dinghuo = true; - "step 1"; - player.removeMark("nzry_junlve", player.countMark("nzry_junlve")); - for (var i = 0; i < targets.length; i++) { - targets[i].discard(targets[i].getCards("e")); - } - player - .chooseTarget(true, "对一名目标角色造成1点火焰伤害", function (card, player, target) { - return _status.event.targets.includes(target); - }) - .set("targets", targets).ai = function () { - return 1; - }; - "step 2"; - if (result.bool) { - result.targets[0].damage("fire", "nocard"); - } - }, - ai: { - order: 1, - fireAttack: true, - combo: "nzry_junlve", - result: { - target(player, target) { - if (target.hasSkillTag("nofire")) return 0; - if (lib.config.mode == "versus") return -1; - if (player.hasUnknown()) return 0; - return get.damageEffect(target, player) - target.countCards("e"); - }, - }, - }, - }, - drlt_duorui: { - audio: 2, - init(player, skill) { - if (!player.storage.drlt_duorui) player.storage.drlt_duorui = []; - }, - trigger: { - source: "damageSource", - }, - filter(event, player) { - if (player.storage.drlt_duorui.length) return false; - return event.player.isIn() && _status.currentPhase == player; - }, - check(event, player) { - if (get.attitude(_status.event.player, event.player) >= 0) return false; - if (player.hasEnabledSlot() && !player.hasEnabledSlot(5)) return false; - return true; - }, - bannedList: [ - "bifa", - "buqu", - "gzbuqu", - "songci", - "funan", - "xinfu_guhuo", - "reguhuo", - "huashen", - "rehuashen", - "old_guhuo", - "shouxi", - "xinpojun", - "taoluan", - "xintaoluan", - "yinbing", - "xinfu_yingshi", - "zhenwei", - "zhengnan", - "xinzhengnan", - "zhoufu", - ], - logTarget: "player", - content() { - "step 0"; - var list = []; - var listm = []; - var listv = []; - if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3]; - else listm = lib.character[trigger.player.name][3]; - if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3]; - listm = listm.concat(listv); - var func = function (skill) { - var info = get.info(skill); - if ( - !info || - info.charlotte || - info.hiddenSkill || - info.zhuSkill || - info.juexingji || - info.limited || - info.dutySkill || - (info.unique && !info.gainable) || - lib.skill.drlt_duorui.bannedList.includes(skill) - ) - return false; - return true; - }; - for (var i = 0; i < listm.length; i++) { - if (func(listm[i])) list.add(listm[i]); - } - event.skills = list; - if (player.hasEnabledSlot()) { - player.chooseToDisable().ai = function (event, player, list) { - if (list.includes("equip5")) return "equip5"; - return list.randomGet(); - }; - } - "step 1"; - if (event.skills.length > 0) { - player - .chooseControl(event.skills) - .set("prompt", "请选择要获得的技能") - .set("ai", function () { - return event.skills.randomGet(); - }); - } else event.finish(); - "step 2"; - player.addTempSkills(result.control, { player: "dieAfter" }); - // player.popup(result.control,'thunder'); - player.storage.drlt_duorui = [result.control]; - player.storage.drlt_duorui_player = trigger.player; - trigger.player.storage.drlt_duorui = [result.control]; - trigger.player.addTempSkill("drlt_duorui1", { player: "phaseAfter" }); - // game.log(player,'获得了技能','#g【'+get.translation(result.control)+'】') - }, - group: ["duorui_clear"], - }, - duorui_clear: { - trigger: { global: ["phaseAfter", "dieAfter"] }, - filter(event, player) { - if (!player.storage.drlt_duorui_player || !player.storage.drlt_duorui) return false; - return ( - player.storage.drlt_duorui_player == event.player && player.storage.drlt_duorui.length - ); - }, - silent: true, - forced: true, - popup: false, - content() { - player.removeSkills(player.storage.drlt_duorui[0]); - delete player.storage.drlt_duorui_player; - player.storage.drlt_duorui = []; - }, - }, - drlt_duorui1: { - init(player, skill) { - player.disableSkill(skill, player.storage.drlt_duorui); - }, - onremove(player, skill) { - player.enableSkill(skill); - }, - locked: true, - mark: true, - charlotte: true, - intro: { - content(storage, player, skill) { - var list = []; - for (var i in player.disabledSkills) { - if (player.disabledSkills[i].includes(skill)) list.push(i); - } - if (list.length) { - var str = "失效技能:"; - for (var i = 0; i < list.length; i++) { - if (lib.translate[list[i] + "_info"]) str += get.translation(list[i]) + "、"; - } - return str.slice(0, str.length - 1); - } - }, - }, - }, - drlt_zhiti: { - audio: 2, - locked: true, - group: ["drlt_zhiti_damage", "drlt_zhiti_compare", "drlt_zhiti_juedou"], - global: "g_drlt_zhiti", - subSkill: { - juedou: { - audio: "drlt_zhiti", - trigger: { - player: "juedouAfter", - target: "juedouAfter", - }, - forced: true, - filter(event, player) { - if (event.turn === player || !player.hasDisabledSlot()) return false; - const opposite = event.player === player ? event.target : event.player; - return opposite && opposite.isIn() && opposite.inRangeOf(player); - }, - content() { - player.chooseToEnable(); - }, - }, - compare: { - audio: "drlt_zhiti", - trigger: { - player: ["chooseToCompareAfter", "compareMultipleAfter"], - target: ["chooseToCompareAfter", "compareMultipleAfter"], - }, - filter(event, player) { - if (event.preserve || !player.hasDisabledSlot()) return false; - let opposite; - if (player === event.player) { - if (event.num1 > event.num2) { - opposite = event.target; - } else { - return false; - } - } else { - if (event.num1 < event.num2) { - opposite = event.player; - } else { - return false; - } - } - return opposite && opposite.isIn() && opposite.inRangeOf(player); - }, - forced: true, - content() { - player.chooseToEnable(); - }, - }, - damage: { - audio: "drlt_zhiti", - trigger: { player: "damageEnd" }, - forced: true, - filter(event, player) { - if (!player.hasDisabledSlot()) return false; - const opposite = event.source; - return opposite && opposite.isIn() && opposite.inRangeOf(player); - }, - content() { - player.chooseToEnable(); - }, - }, - }, - }, - g_drlt_zhiti: { - mod: { - maxHandcard(player, num) { - if (player.isDamaged()) - return ( - num - - game.countPlayer(function (current) { - return ( - current != player && - current.hasSkill("drlt_zhiti") && - current.inRange(player) - ); - }) - ); - }, - }, - }, - drlt_poxi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target != player && target.countCards("h") > 0; - //return target!=player; - }, - content() { - "step 0"; - event.list1 = []; - event.list2 = []; - if (player.countCards("h") > 0) { - var chooseButton = player.chooseButton(4, [ - "你的手牌", - player.getCards("h"), - get.translation(target.name) + "的手牌", - target.getCards("h"), - ]); - } else { - var chooseButton = player.chooseButton(4, [ - get.translation(target.name) + "的手牌", - target.getCards("h"), - ]); - } - chooseButton.set("target", target); - chooseButton.set("ai", function (button) { - var player = _status.event.player; - var target = _status.event.target; - var ps = []; - var ts = []; - for (var i = 0; i < ui.selected.buttons.length; i++) { - var card = ui.selected.buttons[i].link; - if (target.getCards("h").includes(card)) ts.push(card); - else ps.push(card); - } - var card = button.link; - var owner = get.owner(card); - var val = get.value(card) || 1; - if (owner == target) { - if (ts.length > 1) return 0; - if (ts.length == 0 || player.hp > 3) return val; - return 2 * val; - } - return 7 - val; - }); - chooseButton.set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if (get.suit(button.link) == get.suit(ui.selected.buttons[i].link)) return false; - } - return true; - }); - "step 1"; - if (result.bool) { - var list = result.links; - for (var i = 0; i < list.length; i++) { - if (get.owner(list[i]) == player) { - event.list1.push(list[i]); - } else { - event.list2.push(list[i]); - } - } - if (event.list1.length && event.list2.length) { - game.loseAsync({ - lose_list: [ - [player, event.list1], - [target, event.list2], - ], - discarder: player, - }).setContent("discardMultiple"); - } else if (event.list2.length) { - target.discard(event.list2); - } else player.discard(event.list1); - } - "step 2"; - if (event.list1.length + event.list2.length == 4) { - if (event.list1.length == 0) player.loseMaxHp(); - if (event.list1.length == 1) { - var evt = _status.event; - for (var i = 0; i < 10; i++) { - if (evt && evt.getParent) evt = evt.getParent(); - if (evt.name == "phaseUse") { - evt.skipped = true; - break; - } - } - player.addTempSkill("drlt_poxi1", { player: "phaseAfter" }); - } - if (event.list1.length == 3) player.recover(); - if (event.list1.length == 4) player.draw(4); - } - }, - ai: { - order: 13, - result: { - target(target, player) { - return -1; - }, - }, - }, - }, - drlt_poxi1: { - mod: { - maxHandcard(player, num) { - return num - 1; - }, - }, - }, - drlt_jieying_mark: { - marktext: "营", - intro: { - name: "营", - content: "mark", - }, - mod: { - cardUsable(card, player, num) { - if (player.hasMark("drlt_jieying_mark") && card.name == "sha") - return ( - num + - game.countPlayer(function (current) { - return current.hasSkill("drlt_jieying"); - }) - ); - }, - maxHandcard(player, num) { - if (player.hasMark("drlt_jieying_mark")) - return ( - num + - game.countPlayer(function (current) { - return current.hasSkill("drlt_jieying"); - }) - ); - }, - aiOrder(player, card, num) { - if ( - player.hasMark("drlt_jieying_mark") && - game.hasPlayer((current) => { - return current.hasSkill("drlt_jieying") && get.attitude(player, current) <= 0; - }) - ) - return Math.max(num, 0) + 1; - }, - }, - audio: "drlt_jieying", - trigger: { - player: "phaseDrawBegin2", - }, - forced: true, - filter(event, player) { - return ( - !event.numFixed && - player.hasMark("drlt_jieying_mark") && - game.hasPlayer(function (current) { - return current.hasSkill("drlt_jieying"); - }) - ); - }, - content() { - trigger.num += game.countPlayer(function (current) { - return current.hasSkill("drlt_jieying"); - }); - }, - ai: { - nokeep: true, - skillTagFilter(player) { - return ( - player.hasMark("drlt_jieying_mark") && - game.hasPlayer((current) => { - return current.hasSkill("drlt_jieying") && get.attitude(player, current) <= 0; - }) - ); - }, - }, - }, - drlt_jieying: { - audio: 2, - locked: false, - global: "drlt_jieying_mark", - group: ["drlt_jieying_1", "drlt_jieying_2", "drlt_jieying_3"], - subSkill: { - 1: { - audio: "drlt_jieying", - trigger: { - player: "phaseBegin", - }, - forced: true, - filter(event, player) { - return !game.hasPlayer(function (current) { - return current.hasMark("drlt_jieying_mark"); - }); - }, - content() { - player.addMark("drlt_jieying_mark", 1); - }, - }, - 2: { - audio: "drlt_jieying", - trigger: { - player: "phaseJieshuBegin", - }, - direct: true, - filter(event, player) { - return player.hasMark("drlt_jieying_mark"); - }, - content() { - "step 0"; - player.chooseTarget( - get.prompt("drlt_jieying"), - "将“营”交给一名角色;其摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1且手牌上限+1。该角色回合结束后,其移去“营”标记,然后你获得其所有手牌。", - function (card, player, target) { - return target != player; - } - ).ai = function (target) { - let th = target.countCards("h"), - att = get.attitude(_status.event.player, target); - for (let i in target.skills) { - let info = get.info(i); - if (info && info.shaRelated) return Math.abs(att); - } - if (att > 0) { - if (th > 3 && target.hp > 2) return 0.6 * th; - } - if (att < 1) { - if (target.countCards("j", { name: "lebu" })) - return ( - 1 + Math.min((1.5 + th) * 0.8, target.getHandcardLimit() * 0.7) - ); - if (!th || target.getEquip("zhangba") || target.getEquip("guanshi")) - return 0; - if ( - !target.inRange(player) || - player.countCards("hs", { name: "shan" }) > 1 - ) - return Math.min((1 + th) * 0.3, target.getHandcardLimit() * 0.2); - } - return 0; - }; - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - player.logSkill("drlt_jieying", target); - var mark = player.countMark("drlt_jieying_mark"); - player.removeMark("drlt_jieying_mark", mark); - target.addMark("drlt_jieying_mark", mark); - } - }, - ai: { - effect: { - player(card, player, target) { - if (get.name(card) === "lebu" && get.attitude(player, target) < 0) - return ( - 1 + - Math.min( - (target.countCards("h") + 1.5) * 0.8, - target.getHandcardLimit() * 0.7 - ) - ); - }, - }, - }, - }, - 3: { - audio: "drlt_jieying", - trigger: { - global: "phaseEnd", - }, - forced: true, - filter(event, player) { - return ( - player != event.player && - event.player.hasMark("drlt_jieying_mark") && - event.player.isIn() - ); - }, - logTarget: "player", - content() { - if (trigger.player.countCards("h") > 0) { - trigger.player.give(trigger.player.getCards("h"), player); - } - trigger.player.removeMark( - "drlt_jieying_mark", - trigger.player.countMark("drlt_jieying_mark") - ); - }, - }, - }, - }, - }, - card: { - changandajian_equip1: { - fullskin: true, - derivation: "shen_sunquan", - type: "equip", - subtype: "equip1", - distance: { attackFrom: -5 }, - onLose() { - card.fix(); - card.remove(); - card.destroyed = true; - game.log(card, "被销毁了"); - player.addTempSkill("changandajian_destroy"); - }, - ai: { - value(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - equipValue(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - basic: { - equipValue: 2, - }, - }, - }, - changandajian_equip2: { - fullskin: true, - cardimage: "changandajian_equip1", - derivation: "shen_sunquan", - type: "equip", - subtype: "equip2", - onLose() { - card.fix(); - card.remove(); - card.destroyed = true; - game.log(card, "被销毁了"); - player.addTempSkill("changandajian_destroy"); - }, - ai: { - value(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - equipValue(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - basic: { - equipValue: 2, - }, - }, - }, - changandajian_equip3: { - fullskin: true, - cardimage: "changandajian_equip1", - derivation: "shen_sunquan", - type: "equip", - subtype: "equip3", - distance: { globalTo: 2 }, - onLose() { - card.fix(); - card.remove(); - card.destroyed = true; - game.log(card, "被销毁了"); - player.addTempSkill("changandajian_destroy"); - }, - ai: { - value(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - equipValue(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - basic: { - equipValue: 2, - }, - }, - }, - changandajian_equip4: { - fullskin: true, - cardimage: "changandajian_equip1", - derivation: "shen_sunquan", - type: "equip", - subtype: "equip4", - distance: { globalFrom: -2 }, - onLose() { - card.fix(); - card.remove(); - card.destroyed = true; - game.log(card, "被销毁了"); - player.addTempSkill("changandajian_destroy"); - }, - ai: { - value(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - equipValue(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - basic: { - equipValue: 2, - }, - }, - }, - changandajian_equip5: { - fullskin: true, - cardimage: "changandajian_equip1", - derivation: "shen_sunquan", - type: "equip", - subtype: "equip5", - skills: ["changandajian_equip5"], - onLose() { - card.fix(); - card.remove(); - card.destroyed = true; - game.log(card, "被销毁了"); - player.addTempSkill("changandajian_destroy"); - }, - ai: { - value(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - equipValue(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - basic: { - equipValue: 2, - }, - }, - }, - changandajian_equip6: { - fullskin: true, - cardimage: "changandajian_equip1", - derivation: "shen_sunquan", - type: "equip", - subtype: "equip6", - distance: { globalTo: 2, globalFrom: -2 }, - onLose() { - card.fix(); - card.remove(); - card.destroyed = true; - game.log(card, "被销毁了"); - player.addTempSkill("changandajian_destroy"); - }, - ai: { - value(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - equipValue(card, player) { - if ( - game.hasPlayer(function (current) { - return lib.skill.changandajian_destroy.getEffect(player, current) > 0; - }) - ) - return 0; - return 8; - }, - basic: { - equipValue: 2, - }, - }, - }, - qizhengxiangsheng: { - enable: true, - type: "trick", - fullskin: true, - derivation: "shen_xunyu", - filterTarget: lib.filter.notMe, - content() { - "step 0"; - if (!event.qizheng_name) { - if (player.isIn()) - player - .chooseControl("奇兵", "正兵") - .set("prompt", "请选择" + get.translation(target) + "的标记") - .set( - "choice", - (function () { - var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); - var e2 = 0; - if ( - target.countGainableCards(player, "h") > 0 && - !target.hasSkillTag("noh") - ) - e2 = -1; - var es = target.getGainableCards(player, "e"); - if (es.length) - e2 = Math.min( - e2, - (function () { - var max = 0; - for (var i of es) - max = Math.max(max, get.value(i, target)); - return -max / 4; - })() - ); - if (Math.abs(e1 - e2) <= 0.3) - return Math.random() < 0.5 ? "奇兵" : "正兵"; - if (e1 < e2) return "奇兵"; - return "正兵"; - })() - ) - .set("ai", function () { - return _status.event.choice; - }); - else event.finish(); - } - "step 1"; - if (!event.qizheng_name && result && result.control) event.qizheng_name = result.control; - if (event.directHit) event._result = { bool: false }; - else - target - .chooseToRespond("请打出一张杀或闪响应奇正相生", function (card, player) { - var name = get.name(card); - return name == "sha" || name == "shan"; - }) - .set("ai", function (card) { - if (_status.event.choice == "all") { - var rand = get.rand("qizhengxiangsheng"); - if (rand > 0.5) return 0; - return 1 + Math.random(); - } - if (get.name(card) == _status.event.choice) return get.order(card); - return 0; - }) - .set( - "choice", - (function () { - if (target.hasSkillTag("useShan")) return "shan"; - if (typeof event.qizheng_aibuff == "boolean") { - var shas = target.getCards("h", "sha"), - shans = target.getCards("h", "shan"); - if (event.qizheng_aibuff) { - if (shas.length >= Math.max(1, shans.length)) return "shan"; - if (shans.length > shas.length) return "sha"; - return false; - } - if (!shas.length || !shans.length) return false; - } - var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); - var e2 = 0; - if ( - target.countGainableCards(player, "h") > 0 && - !target.hasSkillTag("noh") - ) - e2 = -1; - var es = target.getGainableCards(player, "e"); - if (es.length) - e2 = Math.min( - e2, - (function () { - var max = 0; - for (var i of es) max = Math.max(max, get.value(i, target)); - return -max / 4; - })() - ); - if (e1 - e2 >= 0.3) return "shan"; - if (e2 - e1 >= 0.3) return "sha"; - return "all"; - })() - ); - "step 2"; - var name = result.bool ? result.card.name : null, - require = event.qizheng_name; - if (require == "奇兵" && name != "sha") target.damage(); - else if ( - require == "正兵" && - name != "shan" && - target.countGainableCards(player, "he") > 0 - ) - player.gainPlayerCard(target, true, "he"); - }, - ai: { - order: 5, - tag: { - damage: 0.5, - gain: 0.5, - loseCard: 1, - respondShan: 1, - respondSha: 1, - }, - result: { - target(player, target) { - var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); - var e2 = 0; - if (target.countGainableCards(player, "h") > 0 && !target.hasSkillTag("noh")) - e2 = -1; - var es = target.getGainableCards(player, "e"); - if (es.length) - e2 = Math.min( - e2, - (function () { - var max = 0; - for (var i of es) max = Math.max(max, get.value(i, target)); - return -max / 4; - })() - ); - if ( - game.hasPlayer(function (current) { - return current.hasSkill("tianzuo") && get.attitude(current, player) <= 0; - }) - ) - return Math.max(e1, e2); - return Math.min(e1, e2); - }, - }, - }, - }, - }, - dynamicTranslate: { - nzry_longnu(player) { - if (player.hasSkill("nzry_longnu_2")) - return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; - if (player.hasSkill("nzry_longnu_1")) - return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; - if (player.storage.nzry_longnu == true) - return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; - return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; - }, - }, - translate: { - shen_luxun: "神陆逊", - shen_luxun_prefix: "神", - nzry_junlve: "军略", - nzry_junlve_info: "锁定技,当你受到或造成伤害后,你获得X个“军略”标记(X为伤害点数)。", - nzry_cuike: "摧克", - nzry_cuike_info: - "出牌阶段开始时,若“军略”标记的数量为奇数,你可以对一名角色造成1点伤害;若“军略”标记的数量为偶数,你可以横置一名角色并弃置其区域内的一张牌。然后,若“军略”标记的数量超过7个,你可以移去全部“军略”标记并对所有其他角色造成1点伤害。", - nzry_dinghuo: "绽火", - nzry_dinghuo_info: - "限定技,出牌阶段,你可以移去全部“军略”标记,令至多等量的已横置角色弃置所有装备区内的牌。然后,你对其中一名角色造成1点火焰伤害。", - shen_liubei: "神刘备", - shen_liubei_prefix: "神", - nzry_longnu: "龙怒", - nzry_longnu_info: - "转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。", - nzry_jieying: "结营", - nzry_jieying_info: - "锁定技,游戏开始时或当你的武将牌重置时,你横置;所有已横置的角色手牌上限+2;结束阶段,你横置一名其他角色。", - - shen_ganning: "神甘宁", - shen_ganning_prefix: "神", - shen_zhangliao: "神张辽", - shen_zhangliao_prefix: "神", - - drlt_poxi: "魄袭", - drlt_poxi_info: - "出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可以弃置你与其手牌中的四张花色不同的牌。若如此做,根据此次弃置你的牌的数量执行以下效果:零张,扣减1点体力上限;一张,你结束出牌阶段且本回合手牌上限-1;三张,你回复1点体力;四张,你摸四张牌。", - drlt_jieying: "劫营", - drlt_jieying_info: - "回合开始时,若场上没有拥有“营”标记的角色,你获得1个“营”标记;结束阶段,你可以将你的一个“营”标记交给一名角色;有“营”标记的角色摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1,手牌上限+1。有“营”的其他角色回合结束时,其移去“营”标记,然后你获得其所有手牌。", - drlt_jieying_mark: "劫营", - drlt_duorui1: "失效技能", - drlt_duorui1_bg: "锐", - drlt_duorui: "夺锐", - drlt_duorui_info: - "当你于出牌阶段内对一名其他角色造成伤害后,你可以废除你装备区内的一个装备栏(若已全部废除则可以跳过此步骤),然后获得该角色的一个技能直到其的下回合结束或其死亡(觉醒技,限定技,主公技,隐匿技,使命技等特殊技能除外)。若如此做,该角色该技能失效且你不能再发动〖夺锐〗直到你失去以此法获得的技能。", - drlt_zhiti: "止啼", - drlt_zhiti_info: - "锁定技。①你攻击范围内已受伤的其他角色手牌上限-1;②当你拼点或【决斗】胜利/或受到伤害后,若对方/伤害来源在你的攻击范围内,则你恢复一个装备栏。", - - shen_zhaoyun: "神赵云", - shen_zhaoyun_prefix: "神", - shen_guanyu: "神关羽", - shen_guanyu_prefix: "神", - shen_lvmeng: "神吕蒙", - shen_lvmeng_prefix: "神", - shen_simayi: "神司马懿", - shen_simayi_prefix: "神", - shen_caocao: "神曹操", - shen_caocao_prefix: "神", - shen_zhugeliang: "神诸葛亮", - shen_zhugeliang_prefix: "神", - shen_zhouyu: "神周瑜", - shen_zhouyu_prefix: "神", - shen_lvbu: "神吕布", - shen_lvbu_prefix: "神", - xinjuejing: "绝境", - xinjuejing_info: "锁定技。①你的手牌上限+2。②当你进入或脱离濒死状态时,你摸一张牌。", - relonghun: "龙魂", - relonghun_info: - "你可以将同花色的一至两张牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当普【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。", - xinlonghun: "龙魂", - xinlonghun_info: - "你可以将你的手牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。", - longhun: "龙魂", - longhun1: "龙魂♥︎", - longhun2: "龙魂♦︎", - longhun3: "龙魂♠︎", - longhun4: "龙魂♣︎", - juejing: "绝境", - longhun_info: - "你可以将同花色的X张牌按下列规则使用或打出:红桃当【桃】,方块当具火焰伤害的【杀】,梅花当【闪】,黑桃当【无懈可击】(X为你当前的体力值且至少为1)。", - juejing_info: "锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。", - wushen: "武神", - wushen_info: "锁定技。①你的红桃手牌均视为【杀】。②你使用红桃【杀】无距离和次数限制且不可被响应。", - wuhun: "武魂", - wuhun_info: "锁定技,杀死你的角色立即进入濒死状态。", - shelie: "涉猎", - gongxin: "攻心", - gongxin_discard: "弃置", - gongxin_top: "牌堆顶", - renjie: "忍戒", - renjie2: "忍戒", - renjie_info: - "锁定技,当你受到1点伤害后,你获得一枚“忍”标记;锁定技,当你于弃牌阶段内弃置牌后,你获得等同于失去的牌数量的“忍”标记。", - sbaiyin: "拜印", - sbaiyin_info: - "觉醒技,准备阶段开始时,若你的“忍”标记数不小于4,你减1点体力上限,然后获得〖极略〗。", - jilue: "极略", - jilue_info: - "当一名角色的判定牌生效前,你可以弃1枚“忍”标记并发动〖鬼才〗;每当你受到伤害后,你可以弃1枚“忍”标记并发动〖放逐〗;当你使用锦囊牌时,你可以弃1枚“忍”标记并发动〖集智〗;出牌阶段限一次,你可以弃1枚“忍”标记并发动〖制衡〗;出牌阶段,你可以弃1枚“忍”标记并获得〖完杀〗直到回合结束。", - jilue_guicai: "鬼才", - jilue_fangzhu: "放逐", - jilue_wansha: "完杀", - jilue_zhiheng: "制衡", - jilue_jizhi: "集智", - lianpo: "连破", - lianpo_info: "一名角色的回合结束时,若你本回合内杀死过角色,则你可以进行一个额外的回合。", - guixin: "归心", - qinyin: "琴音", - yeyan: "业炎", - shelie_info: "摸牌阶段,你可以改为从牌堆顶亮出五张牌,然后选择获得不同花色的牌各一张。", - gongxin_info: - "出牌阶段限一次,你可以观看一名其他角色的手牌,并可以展示其中一张红桃牌,然后将其弃置或置于牌堆顶。", - guixin_info: "当你受到1点伤害后,你可以获得每名其他角色区域里的一张牌,然后你翻面。", - guixin_info_alter: "当你受到1点伤害后,你可以随机获得每名其他角色区域里的一张牌,然后你翻面。", - qinyin_info: - "弃牌阶段结束时,若你于此阶段内弃置过两张或更多的牌,则你可以选择一项:1. 令所有角色各回复1点体力;2. 令所有角色各失去1点体力。", - // qinyin_info:'每当你于弃牌阶段内因你的弃置而失去第X张手牌时(X至少为2),你可以选择一项:1.令所有角色各回复1点体力;2.令所有角色各失去1点体力。每阶段限一次。', - yeyan_info: - "限定技,出牌阶段,你可以对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。", - qixing: "七星", - qixing_bg: "星", - qixing2: "七星", - qixing3: "七星", - qixing_info: - "游戏开始时,你将牌堆顶的七张牌置于你的武将牌上,称之为“星”。然后/摸牌阶段结束后,你可用任意数量的手牌等量交换这些“星”。", - dawu: "大雾", - dawu2_bg: "雾", - dawu2: "大雾", - dawu3: "大雾", - // dawu2_info:'已获得大雾标记', - dawu_info: - "结束阶段,你可以弃置X张“星”并指定等量的角色:直到你的下回合开始,当这些角色受到非雷电伤害时,防止此伤害。", - kuangfeng: "狂风", - kuangfeng2: "狂风", - kuangfeng2_bg: "风", - // kuangfeng2_info:'已获得狂风标记', - kuangfeng3: "狂风", - kuangfeng_info: - "结束阶段,你可以弃置1张“星”并指定一名角色:直到你的下回合开始,该角色受到火焰伤害时,此伤害+1。", - baonu: "狂暴", - baonu_bg: "暴", - baonu_info: - "锁定技,游戏开始时,你获得两枚“暴怒”标记;锁定技,当你造成/受到1点伤害后,你获得1枚“暴怒”标记。", - shenfen: "神愤", - shenfen_info: - "限定技,出牌阶段,你可以弃置6枚暴怒标记,对场上所有其他角色造成1点伤害,然后令其弃置四张牌。", - wuqian: "无前", - wuqian_info: "出牌阶段,你可以弃置两枚暴怒标记并获得技能〖无双〗直到回合结束。", - wumou: "无谋", - wumou_info: "锁定技,当你使用普通锦囊牌时,你选择一项:1.弃置1枚“暴怒”标记;2.失去1点体力。", - ol_wuqian: "无前", - ol_wuqian_info: - "出牌阶段,你可以弃置2枚“暴怒”标记并选择一名本回合内未选择过的其他角色,你获得技能〖无双〗并令其防具无效直到回合结束。", - ol_shenfen: "神愤", - ol_shenfen_info: - "出牌阶段限一次,你可以弃置6枚“暴怒”标记并选择所有其他角色,对这些角色各造成1点伤害。然后这些角色先各弃置其装备区里的牌,再各弃置四张手牌。最后你将你的武将牌翻面。", - new_wuhun: "武魂", - new_wuhun_info: - "锁定技,当你受到伤害后,伤害来源获得X个“梦魇”标记(X为伤害点数)。锁定技,当你死亡时,你选择一名“梦魇”标记数量最多的其他角色。该角色进行判定:若判定结果不为【桃】或【桃园结义】,则该角色死亡。", - new_guixin: "归心", - new_guixin_info: - "当你受到1点伤害后,你可以按照你选择的区域优先度随机获得每名其他角色区域里的一张牌,然后你翻面。", - ol_zhangliao: "OL神张辽", - ol_zhangliao_prefix: "OL神", - olduorui: "夺锐", - olduorui2: "夺锐", - olduorui_info: - "当你于出牌阶段内对一名角色造成伤害后,你可以选择该角色武将牌上的一个技能。若如此做,你结束出牌阶段,且你令此技能于其下个回合结束之前无效。", - olzhiti: "止啼", - olzhiti_info: - "锁定技,你攻击范围内已受伤角色的手牌上限-1。若场上已受伤的角色数:不小于1,你的手牌上限+1;不小于3,你于摸牌阶段开始时令额定摸牌数+1;不小于5,回合结束时,你废除一名角色的一个随机装备栏。", - shen_caopi: "神曹丕", - shen_caopi_prefix: "神", - chuyuan: "储元", - chuyuan_info: - "一名角色受到伤害后,若你武将牌上「储」的数量小于体力上限,你可以令其摸一张牌。然后其将一张手牌置于你的武将牌上,称为「储」。", - //chuyuan_info:'一名角色受到伤害后,你可以令其摸一张牌。然后其将一张手牌置于你的武将牌上,称为「储」。你的手牌上限+X(X为你武将牌上的「储」数)。', - dengji: "登极", - dengji_info: - "觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后获得技能〖天行〗和〖奸雄〗。", - tianxing: "天行", - tianxing_info: - "觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后失去技能〖储元〗,选择获得以下技能中的一个:〖仁德〗/〖制衡〗/〖乱击〗/〖行动〗。", - shen_zhenji: "神甄宓", - shen_zhenji_prefix: "神", - shenfu: "神赋", - shenfu_info: - "回合结束时,若你的手牌数为:奇数,你可对一名其他角色造成1点雷属性伤害。若其因此进入过濒死状态,你可重复此流程(不能选择本次已选择过的角色)。偶数,你可选择一名角色,你令其摸一张牌或弃置一张手牌。若其手牌数等于体力值,你可重复此流程(不能选择本次已选择过的角色)。", - qixian: "七弦", - qixian_info: "锁定技,你的手牌上限视为7。", - caopi_xingdong: "行动", - caopi_xingdong_info: - "出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。", - shen_diaochan: "神貂蝉", - shen_diaochan_prefix: "神", - meihun: "魅魂", - meihun_info: - "结束阶段或当你成为【杀】的目标后,你可以令一名其他角色交给你一张你声明的花色的手牌,若其没有则你观看其手牌然后弃置其中一张。", - huoxin_control: "惑心", - huoxin: "惑心", - huoxin_info: - "出牌阶段限一次,你可以展示两张花色相同的手牌并分别交给两名其他角色,然后令这两名角色拼点,没赢的角色获得1个“魅惑”标记。拥有2个或更多“魅惑”的角色回合即将开始时,该角色移去其所有“魅惑”,此回合改为由你操控。", - boss_zhaoyun: "高达一号", - boss_zhaoyun_ab: "神赵云", - boss_zhaoyun_prefix: "神", - boss_juejing: "绝境", - boss_juejing2: "绝境", - boss_juejing_info: - "锁定技,摸牌阶段开始前,你跳过此阶段。当你得到牌/失去手牌后,若你的手牌数大于4/小于4,则你将手牌摸至4张/弃置至4张。", - zhanjiang: "斩将", - zhanjiang_info: "准备阶段开始时,如果其他角色的装备区内有【青釭剑】,你可以获得之。", - shen_guojia: "神郭嘉", - shen_guojia_prefix: "神", - shuishi: "慧识", - shuishi_info: - "出牌阶段限一次,若你的体力上限小于10,则你可选择一名角色。你令其摸一张牌,若其以此法得到的牌:与该角色的其他手牌花色均不相同,则你加1点体力上限,若你的体力上限小于10,则你可以重复此流程;否则你减1点体力上限,且其展示所有手牌。", - stianyi: "天翊", - stianyi_info: - "觉醒技,准备阶段,若场上的所有存活角色均于本局游戏内受到过伤害,则你加2点体力上限并回复1点体力,然后令一名角色获得技能〖佐幸〗。", - zuoxing: "佐幸", - zuoxing2: "佐幸", - zuoxing_info: - "出牌阶段限一次,若令你获得〖佐幸〗的角色存活且体力上限大于1,则你可以令其减1点体力上限,并视为使用一张普通锦囊牌。", - sghuishi: "辉逝", - sghuishi_info: - "限定技,出牌阶段,你可以选择一名其他角色:若其有未发动过的觉醒技,则你令其发动这些觉醒技时无视原有条件;否则其摸四张牌。然后你减2点体力上限。", - shen_taishici: "神太史慈", - shen_taishici_prefix: "神", - dulie: "笃烈", - dulie_info: - "锁定技。当你成为【杀】的目标时,若使用者的体力值大于你,则你进行判定。若结果为红桃,则取消此目标。", - tspowei: "破围", - tspowei_info: - "使命技。①游戏开始时,你令所有其他角色获得一个“围”。②一名角色受到伤害后,若其有“围”,则其移去“围”。③回合开始时,你选择所有有“围”的角色。这些角色失去“围”,然后这些角色的第一个不为你的下家获得等量的“围”。④一名其他角色的回合开始时,若其有“围”,则你可以选择一项:⒈弃置一张手牌并对其造成1点伤害。⒉若其体力值不大于你,则你获得其一张手牌。选择完成后,你视为在其攻击范围内直到回合结束。⑤使命:回合开始时,若场上没有“围”,则你获得技能〖神著〗。⑥失败:当你进入濒死状态时,你将体力值回复至1点,然后弃置装备区的所有牌。", - shenzhu: "神著", - shenzhu_info: - "锁定技,当你使用有对应实体牌的非转化【杀】结算结束后,你选择一项:①摸一张牌,且本回合使用【杀】的次数上限+1。②摸三张牌,且本回合不能再使用【杀】。", - dangmo: "荡魔", - dangmo_info: - "当你于出牌阶段内使用第一张【杀】选择目标后,你可以为此牌增加至多Y-1个目标(Y为你的体力值)。", - reshuishi: "慧识", - reshuishi_info: - "出牌阶段限一次。若你的体力上限小于10,你可进行判定牌不置入弃牌堆的判定。若判定结果与本次发动技能时的其他判定结果的花色均不相同且你的体力上限小于10,则你加1点体力上限,且可以重复此流程。然后你将所有位于处理区的判定牌交给一名角色。若其手牌数为全场最多,则你减1点体力上限。", - resghuishi: "辉逝", - resghuishi_info: - "限定技,出牌阶段,你可选择一名角色。若你的体力上限不小于存活人数且其有未发动的觉醒技,则你令其中一个技能无视发动条件;否则其摸四张牌。然后你减2点体力上限。", - qizhengxiangsheng: "奇正相生", - qizhengxiangsheng_info: - "出牌阶段,对一名其他角色使用。你将目标角色标记为“奇兵”或“正兵”(对其他角色不可见)。然后目标角色可以打出一张【杀】或【闪】。若其是“奇兵”且未打出【杀】,则你对其造成1点伤害;若其是“正兵”且未打出【闪】,则你获得其一张牌。", - shen_xunyu: "神荀彧", - shen_xunyu_prefix: "神", - tianzuo: "天佐", - tianzuo_info: "锁定技。①游戏开始时,你将8张【奇正相生】加入牌堆。②【奇正相生】对你无效。", - lingce: "灵策", - lingce_info: - "锁定技。当有【奇正相生】或智囊或〖定汉①〗记录过的锦囊牌被使用时,若此牌不为转化牌且对应实体牌数量为1,则你摸一张牌。", - dinghan: "定汉", - dinghan_info: - "①当你成为未记录过的普通锦囊牌的目标时,或有未记录过的延时锦囊牌进入你的判定区时,你记录此牌名并取消之。②准备阶段,你可在〖定汉①〗的记录中添加或减少一种锦囊牌的牌名。", - shen_sunce: "神孙策", - shen_sunce_prefix: "神", - yingba: "英霸", - yingba_info: - "①出牌阶段限一次,你可令一名体力上限大于1的其他角色减少1点体力上限并获得“平定”标记,然后你减少1点体力上限。②你对拥有“平定”标记的角色使用牌没有距离限制。", - scfuhai: "覆海", - scfuhai_info: - "锁定技。①当你使用牌指定目标后,若目标角色有“平定”标记,则其不可响应此牌。若你本回合内以此法得到的牌数小于2,则你摸一张牌。②拥有“平定”标记的角色死亡时,你增加X点体力上限并摸X张牌。(X为其拥有的“平定”标记数)。", - pinghe: "冯河", - pinghe_info: - "锁定技。①你的手牌上限基数等于你已损失的体力值。②当你受到其他角色造成的伤害时,若你有牌且你的体力上限大于1,则你防止此伤害,减1点体力上限并将一张手牌交给一名其他角色。然后若你拥有〖英霸〗,则伤害来源获得一个“平定”标记。", - shen_jiangwei: "神姜维", - shen_jiangwei_prefix: "神", - jiufa: "九伐", - jiufa_info: - "①当你声明使用牌后或打出牌时,你记录此牌的牌名。②当你使用或打出的牌结算结束后,若你的〖九伐〗记录中包含至少⑨种不同的牌名,则你可以亮出牌堆顶的⑨张牌,选择并获得其中任意张点数各不相同且{这九张牌中存在未被选择且和已选择的牌点数相同}的牌,清除所有的记录,将其余牌置入弃牌堆。", - tianren: "天任", - tianren_info: - "锁定技。①当有一张基本牌或普通锦囊牌不因使用而进入弃牌堆后,你获得一枚“天任”标记。②当你获得“天任”标记或体力上限变化后,若你的“天任”数不小于X,则你移去X枚“天任”,加1点体力上限并摸两张牌(X为你的体力上限)。", - pingxiang: "平襄", - pingxiang_info: - "限定技。出牌阶段,若你的体力上限大于⑨,则你可减⑨点体力上限,视为使用至多⑨张火【杀】,然后失去〖九伐〗,并将手牌上限基数改为体力上限直到游戏结束。", - shen_sunquan: "神孙权", - shen_sunquan_prefix: "神", - dili: "帝力", - dili_info: - '锁定技。游戏开始时,你随机获得一条东吴命运线。', - yuheng: "驭衡", - yuheng_info: - '①出牌阶段限一次。你可以失去所有不为〖驭衡〗的非锁定技,然后随机获得全部东吴命运线涉及的一个技能。若你本阶段内没有发动过其他非锁定技,则你随机获得当前东吴命运线涉及的一个内容。②出牌阶段结束时,若你未于本阶段内发动过〖驭衡①〗,则你失去1点体力。', - yuheng_append: '天下英雄谁敌手?曹刘。生子当如孙仲谋!', - dili_shengzhi: "圣质", - dili_shengzhi_info: - "锁定技。若你因〖驭衡〗获得过〖英魂〗〖弘德〗〖秉壹〗,则当你使用点数为质数的牌时,此牌不可被响应。", - dili_chigang: "持纲", - dili_chigang_info: - "锁定技。若你因〖驭衡〗获得过〖观微〗〖弼政〗〖安国〗,则当你的判定阶段开始前,你跳过此阶段并获得一个额外的摸牌阶段。", - dili_qionglan: "穹览", - dili_qionglan_info: - '锁定技,限定技。若你因〖驭衡〗获得过〖涉猎〗〖问卦〗〖博图〗,则当你发动的〖驭衡〗结算结束后,你随机获得两条其他东吴命运线。', - dili_quandao: "权道", - dili_quandao_info: - "锁定技。若你因〖驭衡〗获得过〖制衡〗〖诫训〗〖安恤〗,则你手牌区内点数为字母的牌的牌名视为【调剂盐梅】。", - dili_jiaohui: "交辉", - dili_jiaohui_info: - "锁定技。若你因〖驭衡〗获得过〖下书〗〖结姻〗〖缔盟〗,且你的手牌数为1,则此牌的牌名视为【远交近攻】。", - dili_yuanlv: "渊虑", - dili_yuanlv_info: - "锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜江〗,则当你成为自己使用的不为【长安大舰】的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。", - changandajian_equip1: "长安大舰", - changandajian_equip2: "长安大舰", - changandajian_equip3: "长安大舰", - changandajian_equip4: "长安大舰", - changandajian_equip5: "长安大舰", - changandajian_equip6: "长安大舰", - changandajian_destroy: "长安大舰", - changandajian_equip1_info: - "锁定技。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", - changandajian_equip2_info: - "锁定技。当你失去装备区内的【长安大舰】后,你销毁之并回复1点体力。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", - changandajian_equip3_info: - "锁定技。其他角色至你的距离+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", - changandajian_equip4_info: - "锁定技。你至其他角色的距离-2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", - changandajian_equip5_info: - "锁定技。你的手牌上限+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", - changandajian_equip6_info: - "锁定技。你至其他角色的距离-2,其他角色至你的距离+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", - shen_machao: "神马超", - shen_machao_prefix: "神", - shouli: "狩骊", - shouli_backup: "狩骊", - shouli_info: - "①锁定技,游戏开始时,你令场上所有角色从你的下家起,依次使用牌堆中的一张不为赠物的坐骑牌。②你可以将场上的一张进攻坐骑牌当做【杀】(无任何次数限制),防御坐骑牌当做【闪】使用或打出。若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。", - hengwu: "横骛", - hengwu_info: - "当你使用或打出有花色的牌时,若你的手牌区内没有与此牌花色相同的牌,则你可以摸X张牌(X为场上装备区内花色与此牌相同的牌数)。", - hengwu_append: '棘手,怀念,摧毁!', - - key_kagari: "篝", - kagari_zongsi: "纵丝", - kagari_zongsi_info: - "出牌阶段限一次,你可以选择一张不在游戏外的牌,然后将其置于牌堆/弃牌堆的顶部/底部或一名角色的对应区域内。", - key_shiki: "神山识", - key_shiki_ab: "神山识", - shiki_omusubi: "御结", - shiki_omusubi_info: - "一轮游戏开始时,你可以减1点体力上限,然后将一名其他角色武将牌上的技能加入到你的武将牌上。", - shiki_omusubi_append: - '来吧,羽依里。用你的手,让我变成那只真正的鬼吧!', - db_key_hina: "佐藤雏", - hina_shenshi: "神视", - hina_shenshi_yingbian: "神视", - hina_shenshi_info: - "神势力技。出牌阶段开始时/结束时,你可摸两张牌,然后将其中一张牌置于牌堆顶。你以此法得到的牌视为拥有全部应变效果,且可以无条件发动。", - hina_xingzhi: "幸凪", - hina_xingzhi_info: - "键势力技。每回合限一次,你可以通过“助战”触发一张牌的全部应变效果,且响应助战的角色摸两张牌。", - tw_shen_guanyu: "TW神关羽", - tw_shen_guanyu_prefix: "TW神", - twwushen: "武神", - twwushen_info: - "锁定技。①你的♥手牌均视为普【杀】。②你于每阶段使用的第一张【杀】不可被响应。③你使用♥【杀】无距离和次数限制。④当你使用♥【杀】选择目标后,你令所有拥有“梦魇”标记的角色均成为此【杀】的目标。", - twwuhun: "武魂", - twwuhun_info: - "锁定技。①当你受到其他角色造成的1点伤害后,你令伤害来源获得1枚“梦魇”标记。②当你对有“梦魇”标记的其他角色造成伤害后,你令其获得一枚“梦魇”标记。③当你死亡时,你可进行判定。若结果不为【桃】或【桃园结义】,则你选择至少一名拥有“梦魇”标记的角色。令这些角色各自失去X点体力(X为其“梦魇”标记数)。", - shen_zhangfei: "神张飞", - shen_zhangfei_prefix: "神", - shencai: "神裁", - shencai_info: - "出牌阶段限一次,你可以令一名其他角色进行判定。你获得此判定牌,然后若此判定牌:包含以下要素中的任意一个,则其失去已有的下列效果,并获得对应的效果:{⒈体力:当其受到伤害后,其失去等量的体力、⒉武器:其不能使用牌响应【杀】、⒊打出:当其失去手牌后,其再随机弃置一张手牌(不嵌套触发)、⒋距离:其的结束阶段开始时,其翻面};若均不包含,你获得其区域里的一张牌,其获得一枚“死”并获得如下效果:其的角色手牌上限-X、其的回合结束时,若X大于场上存活人数,则其死亡(X为其“死”标记数)。", - xunshi: "巡使", - xunshi_info: - "锁定技。①你手牌区内所有的多目标锦囊牌均视为花色为none的普【杀】。②你使用颜色为none的牌无距离和次数限制。③当你使用无颜色的牌选择目标后,你令你的〖神裁〗的发动次数上限+1(至多为5),然后可以为此牌增加任意个目标。", - shen_zhangjiao: "神张角", - shen_zhangjiao_prefix: "神", - yizhao: "异兆", - yizhao_info: - "锁定技。当你使用或打出牌时,你获得等同于此牌点数枚“黄”标记。然后若“黄”的十位数发生变化,你获得牌堆中一张点数为你“黄”的十位数的牌。", - sijun: "肆军", - sijun_info: - "准备阶段,若“黄”数大于牌堆的牌数,你可以移去所有“黄”并洗牌,然后随机获得任意张点数之和为36的牌。", - sanshou: "三首", - sanshou_info: - "当你受到伤害时,你可以亮出牌堆顶三张牌。若其中有本回合未被使用过的牌的类型,防止此伤害。", - tianjie: "天劫", - tianjie_info: - "一名角色的回合结束时,若本回合牌堆洗过牌,你可以选择至多三名其他角色。你依次对每名目标角色造成X点雷电伤害(X为其手牌中【闪】的数量,至少为1)。", - tw_shen_lvmeng: "TW神吕蒙", - tw_shen_lvmeng_prefix: "TW神", - twshelie: "涉猎", - twshelie_info: - "①摸牌阶段,你可放弃摸牌并亮出牌堆顶的五张牌,然后选择获得其中每种花色的牌各一张。②每轮限一次。结束阶段,若你本回合使用的花色数不小于你的体力值,你执行一个额外的摸牌阶段或出牌阶段。", - twgongxin: "攻心", - twgongxin2: "攻心", - twgongxin_info: - "出牌阶段限一次。你可以观看一名其他角色的手牌,然后你可以展示其中一张牌并选择一项:1.弃置此牌;2.将此牌置于牌堆顶。若该角色手牌中的花色数因此减少,你选择一种颜色,其于本回合不能使用或打出该颜色的牌。", - shen_dengai: "神邓艾", - shen_dengai_prefix: "神", - dctuoyu: "拓域", - dctuoyu_fengtian: "丰田", - dctuoyu_qingqu: "清渠", - dctuoyu_junshan: "峻山", - dctuoyu_fengtian_tag: '丰田', - dctuoyu_qingqu_tag: '清渠', - dctuoyu_junshan_tag: '峻山', - dctuoyu_info: - "①锁定技。当你使用拥有对应副区域标签的牌时,你令此牌获得对应效果。
    丰田:伤害值或回复值+1;清渠:无次数和距离限制;峻山:不可被响应。②出牌阶段开始时和结束时,你给你的手牌分配对应的已激活副区域标签(每个区域至多五张)。", - dcxianjin: "险进", - dcxianjin_info: - "锁定技。当你每造成或受到两次伤害后,你激活一个副区域标签并摸X张牌(X为你已激活的副区域数,若你的手牌数为全场最多则改为摸一张牌)。", - dcqijing: "奇径", - dcqijing_info: - "觉醒技。一名角色的回合结束后,若你的三个副区域标签均被激活,则你减1点体力上限,获得〖摧心〗,将座位移动至两名相邻的其他角色之间并执行一个额外回合。", - dccuixin: "摧心", - dccuixin_info: - "当你不因此技能使用的基本牌或普通锦囊牌结算结束后,若此牌的目标于你使用此牌指定第一个目标时包含你的上家或下家,则你可以视为对下家或上家再使用一张牌名和元素相同的牌。", - shen_dianwei: "神典韦", - shen_dianwei_prefix: "神", - juanjia: "捐甲", - juanjia_info: "锁定技。游戏开始时,你废除一个防具栏,然后获得一个额外的武器栏。", - qiexie: "挈挟", - qiexie_info: - "锁定技。准备阶段,你在剩余武将牌堆中随机观看五张牌,选择其中的任意张,将其按照如下规则转化为武器牌置入你的武器栏:{⒈此牌不具有花色,且其攻击范围和点数等于此武将牌的体力上限。⒉此武器牌的技能为该武将牌上所有描述中包含“【杀】”且不具有锁定技以外的标签的技能。⒊此武器牌离开你的装备区时,改为放回武将牌堆。}", - cuijue: "摧决", - cuijue_info: - "每回合每名角色限一次。出牌阶段,你可以弃置一张牌,然后对攻击范围内距离最远的一名其他角色造成1点伤害(没有则不选)。", - le_shen_jiaxu: "神贾诩", - le_shen_jiaxu_prefix: "神", - jxlianpo: "炼魄", - jxlianpo_info: - "锁定技。①若场上最大阵营为:反贼,其他角色的手牌上限-1,所有角色使用【杀】的次数上限和攻击范围+1;主忠,其他角色不能对其以外的角色使用【桃】。若有多个最大阵营,其他角色死亡后,来源摸两张牌或回复1点体力。②一轮游戏开始时,你展示一张未加入游戏或已死亡角色的身份牌,本轮视为该身份对应阵营的角色数+1。", - jxzhaoluan: "兆乱", - jxzhaoluan_info: - "限定技。一名角色死亡前,若其此次进入过濒死状态,你可以取消之,令其加3点体力上限并失去所有非锁定技,回复体力至3点,摸四张牌。然后你获得如下效果:出牌阶段,你可以令一名成为过你〖兆乱〗目标的角色减1点体力上限,然后对一名此阶段未以此法选择过的角色造成1点伤害。", - shen_huatuo: "手杀神华佗", - shen_huatuo_prefix: "手杀神", - wuling: "五灵", - wuling_info: - "①出牌阶段限两次。你可以选择一名没有“五禽戏”的角色,按照你选择的顺序向其传授“五禽戏”,且其获得如下效果:其获得你选择的第一种“五禽戏”的效果,并在其每个准备阶段移除当前“五禽戏”的效果并切换为下一种。②当你死亡时,你令场上的角色失去你传授的“五禽戏”。", - wuling_wuqinxi: "五禽戏", - wuling_wuqinxi_info: - "
  • “五禽戏”分为“虎、鹿、熊、猿、鹤”五个不同的效果:" + - "
  • 虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。" + - "
  • 鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。" + - "
  • 熊:每回合限一次,当你受到伤害时,此伤害-1。" + - "
  • 猿:当你获得此效果时,你选择一名其他角色,获得其装备区里的一张牌。" + - "
  • 鹤:当你获得此效果时,你摸三张牌。", - youyi: "游医", - youyi_info: - "①弃牌阶段结束时,你可以将所有于此阶段弃置的牌置入仁区。②出牌阶段限一次。你可以将仁区的所有牌置入弃牌堆,令所有角色各回复1点体力。", - shen_lusu: "神鲁肃", - shen_lusu_prefix: "神", - dingzhou: "定州", - dingzhou_info: - "出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数)。", - tamo: "榻谟", - tamo_info: "游戏开始时,你可以重新分配除主公外所有角色的座次。", - tamo_info_doudizhu: "游戏开始时,你可以重新分配除三号位角色外所有角色的座次。", - tamo_faq: "FAQ", - tamo_faq_info: - "
  • Q:在一号位不为主公的情况下,〖榻谟〗如何结算?
  • A:该角色可以正常进行座次交换。若受此技能影响导致一号位角色发生了变化,则以排列后的一号位角色为起始角色开始本局游戏。
  • ", - zhimeng: "智盟", - zhimeng_info_identity: - "回合结束后,你可以选择一名其他角色。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", - zhimeng_info: - "回合结束后,你可以选择一名手牌数不大于Y的其他角色(Y为你的手牌数+1)。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", - shen_xuzhu: "神许褚", - shen_xuzhu_prefix: "神", - zhengqing: "争擎", - zhengqing_info: - "锁定技。一轮游戏开始时,你移去所有角色的“擎”标记,令上一轮于一回合内造成伤害值最多的角色各获得X枚“擎”,且你与这些角色各摸一张牌(X为这些角色该回合内造成的伤害值)。若该角色为你且本次获得的“擎”数为本局游戏最多的一次,你改为摸X张牌(至多摸五张)。", - zhuangpo: "壮魄", - zhuangpo_info: - "你可以将牌名为【杀】或牌面信息中包含“【杀】”的牌当【决斗】使用,然后你获得如下效果:1.当此【决斗】指定目标后,若你有“擎”,你可以移去任意枚“擎”,令目标角色弃置等量的牌;2.当你造成渠道为此牌的伤害时,若此牌的所有目标角色中存在有“擎”的角色,此伤害+1。", - dc_shen_huatuo: "神华佗", - dc_shen_huatuo_prefix: "神", - jingyu: "静域", - jingyu_info: "锁定技。每个技能每轮限一次,当一名角色发动不为〖静域〗的技能时,你摸一张牌。", - lvxin: "滤心", - lvxin_info: - "出牌阶段限一次。你可以交给一名其他角色一张手牌并选择一项:⒈令其摸X张牌;⒉令其随机弃置X张手牌(X为游戏轮数,至多为5)。然后若其以此法得到/弃置了与你交给其的牌牌名相同的牌,其于其下次发动技能时回复/失去1点体力。", - huandao: "寰道", - huandao_info: - "限定技。出牌阶段,你可以选择一名其他角色。你令其复原武将牌,系统随机生成一个与其同名的武将的武将牌上的一个与其拥有的技能均不同名的技能。其可以选择获得此技能,然后选择失去一个其他技能。", - - extra_feng: "神话再临·风", - extra_huo: "神话再临·火", - extra_lin: "神话再临·林", - extra_shan: "神话再临·山", - extra_yin: "神话再临·阴", - extra_lei: "神话再临·雷", - extra_key: "论外", - extra_ol: "神话再临OL", - extra_mobilezhi: "始计篇·智", - extra_mobilexin: "始计篇·信", - extra_mobileren: "始计篇·仁", - extra_offline: "神话再临·线下", - extra_decade: "神·武", - extra_tw: "海外服神将", - }, - }; -}); diff --git a/character/extra/card.js b/character/extra/card.js new file mode 100644 index 000000000..46fead2cf --- /dev/null +++ b/character/extra/card.js @@ -0,0 +1,362 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + changandajian_equip1: { + fullskin: true, + derivation: "shen_sunquan", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -5 }, + onLose() { + card.fix(); + card.remove(); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); + }, + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + basic: { + equipValue: 2, + }, + }, + }, + changandajian_equip2: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip2", + onLose() { + card.fix(); + card.remove(); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); + }, + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + basic: { + equipValue: 2, + }, + }, + }, + changandajian_equip3: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip3", + distance: { globalTo: 2 }, + onLose() { + card.fix(); + card.remove(); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); + }, + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + basic: { + equipValue: 2, + }, + }, + }, + changandajian_equip4: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip4", + distance: { globalFrom: -2 }, + onLose() { + card.fix(); + card.remove(); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); + }, + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + basic: { + equipValue: 2, + }, + }, + }, + changandajian_equip5: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip5", + skills: ["changandajian_equip5"], + onLose() { + card.fix(); + card.remove(); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); + }, + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + basic: { + equipValue: 2, + }, + }, + }, + changandajian_equip6: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip6", + distance: { globalTo: 2, globalFrom: -2 }, + onLose() { + card.fix(); + card.remove(); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); + }, + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; + return 8; + }, + basic: { + equipValue: 2, + }, + }, + }, + qizhengxiangsheng: { + enable: true, + type: "trick", + fullskin: true, + derivation: "shen_xunyu", + filterTarget: lib.filter.notMe, + content() { + "step 0"; + if (!event.qizheng_name) { + if (player.isIn()) + player + .chooseControl("奇兵", "正兵") + .set("prompt", "请选择" + get.translation(target) + "的标记") + .set( + "choice", + (function () { + var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); + var e2 = 0; + if (target.countGainableCards(player, "h") > 0 && !target.hasSkillTag("noh")) e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if (Math.abs(e1 - e2) <= 0.3) return Math.random() < 0.5 ? "奇兵" : "正兵"; + if (e1 < e2) return "奇兵"; + return "正兵"; + })() + ) + .set("ai", function () { + return _status.event.choice; + }); + else event.finish(); + } + "step 1"; + if (!event.qizheng_name && result && result.control) event.qizheng_name = result.control; + if (event.directHit) event._result = { bool: false }; + else + target + .chooseToRespond("请打出一张杀或闪响应奇正相生", function (card, player) { + var name = get.name(card); + return name == "sha" || name == "shan"; + }) + .set("ai", function (card) { + if (_status.event.choice == "all") { + var rand = get.rand("qizhengxiangsheng"); + if (rand > 0.5) return 0; + return 1 + Math.random(); + } + if (get.name(card) == _status.event.choice) return get.order(card); + return 0; + }) + .set( + "choice", + (function () { + if (target.hasSkillTag("useShan")) return "shan"; + if (typeof event.qizheng_aibuff == "boolean") { + var shas = target.getCards("h", "sha"), + shans = target.getCards("h", "shan"); + if (event.qizheng_aibuff) { + if (shas.length >= Math.max(1, shans.length)) return "shan"; + if (shans.length > shas.length) return "sha"; + return false; + } + if (!shas.length || !shans.length) return false; + } + var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); + var e2 = 0; + if (target.countGainableCards(player, "h") > 0 && !target.hasSkillTag("noh")) e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if (e1 - e2 >= 0.3) return "shan"; + if (e2 - e1 >= 0.3) return "sha"; + return "all"; + })() + ); + "step 2"; + var name = result.bool ? result.card.name : null, + require = event.qizheng_name; + if (require == "奇兵" && name != "sha") target.damage(); + else if (require == "正兵" && name != "shan" && target.countGainableCards(player, "he") > 0) player.gainPlayerCard(target, true, "he"); + }, + ai: { + order: 5, + tag: { + damage: 0.5, + gain: 0.5, + loseCard: 1, + respondShan: 1, + respondSha: 1, + }, + result: { + target(player, target) { + var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); + var e2 = 0; + if (target.countGainableCards(player, "h") > 0 && !target.hasSkillTag("noh")) e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if ( + game.hasPlayer(function (current) { + return current.hasSkill("tianzuo") && get.attitude(current, player) <= 0; + }) + ) + return Math.max(e1, e2); + return Math.min(e1, e2); + }, + }, + }, + }, +}; + +export default cards; diff --git a/character/extra/character.js b/character/extra/character.js new file mode 100644 index 000000000..35df5f7c2 --- /dev/null +++ b/character/extra/character.js @@ -0,0 +1,44 @@ +const characters = { + dc_shen_huatuo: ["male", "shen", 3, ["jingyu", "lvxin", "huandao"], ["qun"]], + shen_xuzhu: ["male", "shen", 5, ["zhengqing", "zhuangpo"], ["wei"]], + shen_lusu: ["male", "shen", 3, ["tamo", "dingzhou", "zhimeng"], ["wu"]], + shen_huatuo: ["male", "shen", 3, ["wuling", "youyi"], ["qun"]], + le_shen_jiaxu: ["male", "shen", 4, ["jxlianpo", "jxzhaoluan"], ["qun"]], + shen_dianwei: ["male", "shen", 4, ["juanjia", "qiexie", "cuijue"], ["wei"]], + shen_dengai: ["male", "shen", 4, ["dctuoyu", "dcxianjin", "dcqijing"], ["wei"]], + tw_shen_lvmeng: ["male", "shen", 3, ["twshelie", "twgongxin"], ["wu"]], + shen_zhangjiao: ["male", "shen", 3, ["yizhao", "sijun", "sanshou", "tianjie"], ["qun"]], + shen_zhangfei: ["male", "shen", 4, ["shencai", "xunshi"], ["shu"]], + tw_shen_guanyu: ["male", "shen", 4, ["twwushen", "twwuhun"], ["shu"]], + shen_machao: ["male", "shen", 4, ["shouli", "hengwu"], ["shu"]], + shen_sunquan: ["male", "shen", 4, ["junkyuheng", "junkdili"], ["wu"]], + shen_jiangwei: ["male", "shen", 4, ["jiufa", "tianren", "pingxiang"], ["shu"]], + key_kagari: ["female", "shen", 3, ["kagari_zongsi"], ["key"]], + key_shiki: ["female", "shen", "3/5", ["shiki_omusubi"], ["key"]], + db_key_hina: ["female", "key", 3, ["hina_shenshi", "hina_xingzhi"], ["doublegroup:key:shen"]], + + shen_sunce: ["male", "shen", "1/6", ["yingba", "scfuhai", "pinghe"], ["wu"]], + shen_xunyu: ["male", "shen", 3, ["tianzuo", "lingce", "dinghan"], ["wei", "clan:颍川荀氏"]], + shen_taishici: ["male", "shen", 4, ["dulie", "tspowei"], ["wu"]], + shen_guojia: ["male", "shen", 3, ["reshuishi", "stianyi", "resghuishi"], ["wei"]], + shen_diaochan: ["female", "shen", 3, ["meihun", "huoxin"], ["qun"]], + shen_guanyu: ["male", "shen", 5, ["wushen", "new_wuhun"], ["shu"]], + shen_zhaoyun: ["male", "shen", 2, ["xinjuejing", "relonghun"], ["shu"]], + shen_zhugeliang: ["male", "shen", 3, ["qixing", "kuangfeng", "dawu"], ["shu"]], + shen_lvmeng: ["male", "shen", 3, ["shelie", "gongxin"], ["wu"]], + shen_zhouyu: ["male", "shen", 4, ["yeyan", "qinyin"], ["wu"]], + shen_simayi: ["male", "shen", 4, ["renjie", "sbaiyin", "lianpo"], ["wei"]], + shen_caocao: ["male", "shen", 3, ["new_guixin", "feiying"], ["wei"]], + shen_lvbu: ["male", "shen", 5, ["baonu", "wumou", "ol_wuqian", "ol_shenfen"], ["qun"]], + + shen_liubei: ["male", "shen", 6, ["nzry_longnu", "nzry_jieying"], ["shu"]], + shen_luxun: ["male", "shen", 4, ["nzry_junlve", "nzry_cuike", "nzry_dinghuo"], ["wu"]], + shen_zhangliao: ["male", "shen", 4, ["drlt_duorui", "drlt_zhiti"], ["wei"]], + shen_ganning: ["male", "shen", "3/6", ["drlt_poxi", "drlt_jieying"], ["wu"]], + ol_zhangliao: ["male", "shen", 4, ["olduorui", "olzhiti"], ["wei"]], + shen_caopi: ["male", "shen", 5, ["chuyuan", "dengji"], ["wei"]], + shen_zhenji: ["female", "shen", 3, ["shenfu", "qixian"], ["wei"]], + boss_zhaoyun: ["male", "shen", 1, ["boss_juejing", "xinlonghun", "zhanjiang"], ["shu"]], +}; + +export default characters; diff --git a/character/extra/characterFilter.js b/character/extra/characterFilter.js new file mode 100644 index 000000000..f7b687897 --- /dev/null +++ b/character/extra/characterFilter.js @@ -0,0 +1,15 @@ +const characterFilters = { + shen_diaochan(mode) { + return mode == "identity" || mode == "doudizhu" || mode == "single" || (mode == "versus" && _status.mode != "standard" && _status.mode != "three"); + }, + shen_dengai(mode) { + if (["boss", "chess", "tafang", "stone"].includes(mode)) return false; + if (mode == "versus") return _status.mode != "three"; + return true; + }, + le_shen_jiaxu(mode) { + return mode == "identity" && _status.mode != "purple"; + }, +}; + +export default characterFilters; diff --git a/character/extra/characterReplace.js b/character/extra/characterReplace.js new file mode 100644 index 000000000..61ebf5a03 --- /dev/null +++ b/character/extra/characterReplace.js @@ -0,0 +1,14 @@ +const characterReplaces = { + shen_zhangliao: ["ol_zhangliao", "shen_zhangliao"], + shen_zhaoyun: ["shen_zhaoyun", "dc_zhaoyun", "old_shen_zhaoyun", "boss_zhaoyun"], + shen_guanyu: ["shen_guanyu", "tw_shen_guanyu"], + shen_sunquan: ["shen_sunquan", "junk_sunquan"], + shen_lvmeng: ["shen_lvmeng", "tw_shen_lvmeng"], + shen_machao: ["shen_machao", "ps_shen_machao"], + shen_jiaxu: ["le_shen_jiaxu", "shen_jiaxu"], + shen_caocao: ["shen_caocao", "old_caocao"], + shen_zhangjiao: ["shen_zhangjiao", "junk_zhangjiao"], + shen_huatuo: ["dc_shen_huatuo", "shen_huatuo"], +}; + +export default characterReplaces; diff --git a/character/extra/dynamicTranslate.js b/character/extra/dynamicTranslate.js new file mode 100644 index 000000000..03a85c362 --- /dev/null +++ b/character/extra/dynamicTranslate.js @@ -0,0 +1,11 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + nzry_longnu(player) { + if (player.hasSkill("nzry_longnu_2")) return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; + if (player.hasSkill("nzry_longnu_1")) return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; + if (player.storage.nzry_longnu == true) return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; + return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; + }, +}; +export default dynamicTranslates; diff --git a/character/extra/index.js b/character/extra/index.js new file mode 100644 index 000000000..eb2cb7914 --- /dev/null +++ b/character/extra/index.js @@ -0,0 +1,33 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "extra", + connect: true, + connectBanned: ["shen_diaochan"], + character: { ...characters }, + characterSort: { + extra: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/extra/intro.js b/character/extra/intro.js new file mode 100644 index 000000000..80358b8dd --- /dev/null +++ b/character/extra/intro.js @@ -0,0 +1,8 @@ +const characterIntro = { + shen_guanyu: "关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。", + shen_lvmeng: "吕蒙,字子明,汝南富陂人,东吴名将,原有“吴下阿蒙”之贬称,后受孙权劝说,奋发读书,最终成就一代名将。", + shen_zhouyu: "字公瑾,庐江舒县人。东汉末年名将。有姿貌、精音律,江东有“曲有误,周郎顾”之语。周瑜少与孙策交好,后孙策遇刺身亡,孙权继任。周瑜将兵赴丧,以中护军的身份与长史张昭共掌众事,建安十三年(208年),周瑜率东吴军与刘备军联合,在赤壁击败曹操。此战也奠定了三分天下的基础。", + shen_zhugeliang: "字孔明、号卧龙,汉族,琅琊阳都人,三国时期蜀汉丞相、杰出的政治家、军事家、发明家、文学家。在世时被封为武乡侯,死后追谥忠武侯,后来东晋政权推崇诸葛亮军事才能,特追封他为武兴王。诸葛亮为匡扶蜀汉政权,呕心沥血、鞠躬尽瘁、死而后已。其代表作有《前出师表》、《后出师表》、《诫子书》等。曾发明木牛流马等,并改造连弩,可一弩十矢俱发。于234年在宝鸡五丈原逝世。", +}; + +export default characterIntro; diff --git a/character/extra/pinyin.js b/character/extra/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/extra/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/extra/skill.js b/character/extra/skill.js new file mode 100644 index 000000000..4a8cfc98d --- /dev/null +++ b/character/extra/skill.js @@ -0,0 +1,8749 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //十周年神华佗 + jingyu: { + audio: 2, + trigger: { + global: ["useSkill", "logSkillBegin", "useCard", "respond"], + }, + filter(event, player) { + if (["global", "equip"].includes(event.type)) return false; + let skill = event.sourceSkill || event.skill; + if (!skill || skill === "jingyu") return false; + let info = get.info(skill); + while (true) { + if (!info || info.charlotte || info.equipSkill) return false; + if (info && !info.sourceSkill) break; + skill = info.sourceSkill; + info = get.info(skill); + } + return !player.getStorage("jingyu_used").includes(skill); + }, + forced: true, + async content(event, trigger, player) { + if (!player.storage.jingyu_used) { + player + .when({ global: "roundStart" }) + .assign({ + firstDo: true, + }) + .then(() => delete player.storage.jingyu_used); + } + let skill = trigger.sourceSkill || trigger.skill, + info = get.info(skill); + while (true) { + if (info && !info.sourceSkill) break; + skill = info.sourceSkill; + info = get.info(skill); + } + player.markAuto("jingyu_used", skill); + await player.draw(); + }, + ai: { + threaten: 6, + }, + }, + lvxin: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + filterTarget: lib.filter.notMe, + check(card) { + const round = game.roundNumber, + player = get.player(); + let valueFix = 0; + if (["sha", "shan"].includes(get.name(card, false))) valueFix += 3; + if ( + (round <= 2 && + player.hasCard(card => { + return ["sha", "shan"].includes(get.name(card)) && get.value(card) <= 3; + })) || + game.hasPlayer(current => { + return current !== player && get.attitude(player, current) > 0; + }) + ) + return 6 - get.value(card) + valueFix; + return 4.5 - get.value(card) + valueFix; + }, + delay: false, + discard: false, + lose: false, + async content(event, trigger, player) { + const { target, cards } = event, + round = Math.min(5, game.roundNumber); + const name = get.translation(target); + await player.give(cards, target); + const result = await player + .chooseControl(["摸牌", "弃牌"]) + .set("choiceList", [`令${name}摸${get.cnNumber(round)}张牌`, `令${name}随机弃置${get.cnNumber(round)}张手牌`]) + .set("prompt", "滤心:请选择一项") + .set("ai", () => { + return get.event("choice"); + }) + .set("choice", get.attitude(player, target) > 0 ? "摸牌" : "弃牌") + .forResult(); + let cards2 = []; + const makeDraw = result.index === 0; + if (makeDraw) { + cards2 = await target.draw(round).forResult(); + } else { + const cards = target.getCards("h", card => { + return lib.filter.cardDiscardable(card, target, "lvxin"); + }); + if (cards.length > 0) { + const evt = await target.discard(cards.randomGets(round)).set("discarder", target); + cards2 = evt.done.cards2; + } + } + const cardName = get.name(cards[0], player); + if ( + cards2.some(card => { + return get.name(card, target) === cardName; + }) + ) { + const skillName = `lvxin_${makeDraw ? "recover" : "lose"}`; + target.addSkill(skillName); + target.addMark(skillName, 1, false); + } + }, + subSkill: { + recover: { + trigger: { + player: ["useSkill", "logSkillBegin", "useCard", "respond"], + }, + filter(event, player) { + if (["global", "equip"].includes(event.type)) return false; + const skill = event.sourceSkill || event.skill; + const info = get.info(skill); + return info && !info.charlotte && !info.equipSkill; + }, + forced: true, + onremove: true, + charlotte: true, + async content(event, trigger, player) { + player.recover(player.countMark("lvxin_recover")); + player.removeSkill("lvxin_recover"); + }, + intro: { + content: "下次发动技能时回复#点体力", + }, + }, + lose: { + trigger: { + player: ["useSkill", "logSkillBegin", "useCard", "respond"], + }, + filter(event, player) { + if (["global", "equip"].includes(event.type)) return false; + const skill = event.sourceSkill || event.skill; + const info = get.info(skill); + return info && !info.charlotte && !info.equipSkill; + }, + forced: true, + onremove: true, + charlotte: true, + async content(event, trigger, player) { + player.loseHp(player.countMark("lvxin_lose")); + player.removeSkill("lvxin_lose"); + }, + intro: { + content: "下次发动技能时失去#点体力", + }, + }, + }, + ai: { + order: 5, + result: { + target(player, target) { + const round = game.roundNumber; + if ( + round <= 2 && + target.countCards("h") > round * 2 && + player.getCards("h").some(card => { + return ["sha", "shan"].includes(get.name(card)) && get.value(card) <= 3; + }) + ) + return 1; + if (get.attitude(player, target) > 0) { + return round + Math.sqrt(1 + target.getDamagedHp()); + } + return -(round + Math.sqrt(Math.max(0, 2 - target.getHp()))); + }, + }, + }, + }, + huandao: { + audio: 2, + enable: "phaseUse", + usable: 1, + limited: true, + filterTarget: lib.filter.notMe, + skillAnimation: true, + animationColor: "metal", + async content(event, trigger, player) { + player.awakenSkill("huandao"); + const { target } = event; + await target.turnOver(false); + await target.link(false); + let names = [target.name1 || target.name]; + if (target.name2) names.add(target.name2); + names = names.map(name => get.rawName(name)); + if (!_status.characterlist) lib.skill.pingjian.initList(); + _status.characterlist.randomSort(); + let ownedSkills = target.getSkills(null, false, false), + ownedSkillsName = ownedSkills.map(skill => get.translation(skill)); + let skillToGain = null; + outer: for (const name of _status.characterlist) { + const info = lib.character[name]; + if (!names.includes(get.rawName(name))) continue; + const skills = info[3].slice().randomSort(); + while (skills.length) { + const skill = skills.shift(), + skillName = get.translation(skill); + if (!ownedSkillsName.includes(skillName)) { + skillToGain = skill; + break outer; + } + } + } + if (!skillToGain) return; + player.popup(skillToGain); + player.line(target, "green"); + let prompt2 = "若你选择是,则你于获得此技能后须失去一个其他技能。

    "; + if (lib.skill[skillToGain].nobracket) { + prompt2 += `
    ${get.translation(skillToGain)}
    ${get.skillInfoTranslation(skillToGain)}


    `; + } else { + const translation = lib.translate[skillToGain + "_ab"] || get.translation(skillToGain).slice(0, 2); + prompt2 += `
    【${translation}】
    ${get.skillInfoTranslation(skillToGain)}


    `; + } + const bool = await target + .chooseBool(`寰道:是否获得技能〖${get.translation(skillToGain)}〗?`, prompt2) + .set( + "choice", + (() => { + const rank = get.skillRank(skillToGain, "inout") + 1; + return ownedSkills.some(skill => { + const info = get.info(skill); + if (info) { + if (target.awakenedSkills.includes(skill) && (info.limited || info.juexingji || info.dutySkill)) return true; + if (info.ai && (info.ai.neg || info.ai.halfneg)) return true; + } + return get.skillRank(skill, "inout") < rank; + }); + })() + ) + .forResultBool(); + if (!bool) { + target.chat("拒绝"); + game.log(target, "拒绝获得技能", `#g【${get.translation(skillToGain)}】`); + await game.asyncDelay(); + return; + } + await target.addSkills(skillToGain); + ownedSkills = target.getSkills(null, false, false).filter(skill => { + if (skill === skillToGain) return false; + const info = get.info(skill); + if (!info || info.charlotte || !get.skillInfoTranslation(skill, player).length) return false; + return true; + }); + if (!ownedSkills) return; + const control = await target + .chooseControl(ownedSkills) + .set( + "choiceList", + ownedSkills.map(skill => { + return `
    【${get.translation(lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2))}】
    ${get.skillInfoTranslation(skill, target)}
    `; + }) + ) + .set("displayIndex", false) + .set("prompt", "寰道:选择失去一个技能") + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + (() => { + const uselessSkills = ownedSkills.filter(skill => { + const info = get.info(skill); + if (!info) return false; + if (target.awakenedSkills.includes(skill) && (info.limited || info.juexingji || info.dutySkill)) return true; + if (info.ai && (info.ai.neg || info.ai.halfneg)) return true; + return false; + }); + if (uselessSkills.length) return uselessSkills.randomGet(); + return ownedSkills.sort((a, b) => { + return get.skillRank(a, "inout") - get.skillRank(b, "inout"); + })[0]; + })() + ) + .forResultControl(); + await target.removeSkills(control); + }, + ai: { + order: 5, + result: { + target(player, target) { + if (game.roundNumber * game.countPlayer() <= (1.5 * game.countPlayer2()) / Math.sqrt(player.getDamagedHp() + 1)) return 0; + const ownedSkills = target.getSkills(null, false, false).filter(skill => { + const info = get.info(skill); + if (!info || info.charlotte || !get.skillInfoTranslation(skill, player).length) return false; + return true; + }); + const uselessSkills = ownedSkills.filter(skill => { + const info = get.info(skill); + if (!info) return false; + if (target.awakenedSkills.includes(skill) && (info.limited || info.juexingji || info.dutySkill)) return true; + if (info.ai && (info.ai.neg || info.ai.halfneg)) return true; + return false; + }); + if (uselessSkills.length) return 3; + let names = [target.name1 || target.name]; + if (target.name2) names.add(target.name2); + names = names.map(name => get.rawName(name)); + if (_status.characterlist.some(name => names.includes(get.rawName(name)))) return 1; + return 0; + }, + }, + }, + }, + //神许褚 + zhengqing: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + filter() { + return ( + game.hasPlayer(current => { + return current.countMark("zhengqing"); + }) || lib.skill.zhengqing.getMostInfoLastRound()[0] > 0 + ); + }, + getMostInfoLastRound() { + let max = -1, + players = []; + const history = game.getAllGlobalHistory(); + if (history.length <= 2) return [max, players]; + for (let i = history.length - 2; i >= 0; i--) { + const evts = history[i]["everything"].filter(evt => { + if (evt.name !== "damage") return false; + const source = evt.source; + return source && source.isIn(); + }); + if (evts.length) { + let curMax = -1, + curPlayers = []; + const map = {}; + for (const evt of evts) { + const source = evt.source; + const id = source.playerid; + if (typeof map[id] !== "number") map[id] = 0; + map[id] += evt.num; + if (map[id] > curMax) { + curMax = map[id]; + curPlayers = [source]; + } else if (map[id] == curMax) { + curPlayers.add(source); + } + } + if (curMax > max) { + max = curMax; + players = curPlayers.slice(); + } else if (curMax === max) { + players.addArray(curPlayers); + } + } + if (history[i].isRound) break; + } + return [max, players]; + }, + async content(event, trigger, player) { + game.countPlayer(current => { + if (current.hasMark("zhengqing")) current.clearMark("zhengqing"); + }); + const [num, players] = lib.skill.zhengqing.getMostInfoLastRound(); + player.line(players, "thunder"); + const onlyMe = players.length === 1 && players[0] === player; + const isMax = + (player + .getAllHistory("custom", evt => evt && evt.zhengqing_count) + .map(evt => evt.zhengqing_count) + .sort((a, b) => b - a)[0] || 0) <= num; + players.forEach(current => { + current.addMark("zhengqing", num); + }); + if (onlyMe && isMax) { + player.draw(Math.min(5, num)); + player.getHistory("custom").push({ zhengqing_count: num }); + } else { + const drawers = [player].concat(players).sortBySeat(trigger.player); + for (const drawer of drawers) { + await drawer.draw(); + } + } + }, + marktext: "擎", + intro: { + name: "争擎", + name2: "擎", + content: "mark", + }, + }, + zhuangpo: { + audio: 2, + enable: "chooseToUse", + onChooseToUse(event) { + if (!game.online && !event.zhuangpo_cards) { + event.set( + "zhuangpo_cards", + event.player.getCards("hes", card => { + if (get.name(card, event.player) == "sha") return true; + const str = lib.skill.shencai.getStr(card); + return str.includes("【杀】"); + }) + ); + } + }, + viewAs: { + name: "juedou", + storage: { zhuangpo: true }, + }, + viewAsFilter() { + return get.event("zhuangpo_cards").length > 0; + }, + prompt: "将一张牌面信息包含“【杀】”的牌当【决斗】使用", + filterCard(card, player) { + return get.event("zhuangpo_cards").includes(card); + }, + position: "hes", + precontent() { + player.addTempSkill("zhuangpo_effect"); + }, + subSkill: { + effect: { + trigger: { + player: "useCardToPlayered", + }, + filter(event, player) { + const card = event.card; + if (!card || !card.storage || !card.storage.zhuangpo) return false; + return player.hasMark("zhengqing"); + }, + direct: true, + charlotte: true, + group: "zhuangpo_damage", + async content(event, trigger, player) { + const target = trigger.target; + const list = Array.from({ length: player.countMark("zhengqing") }, (_, i) => { + return get.cnNumber(i + 1, true); + }); + const result = await player + .chooseControl(list, "cancel2") + .set("prompt", "壮魄:是否移去任意枚“擎”?") + .set("prompt2", `若如此做,${get.translation(target)}须弃置等量的牌`) + .set("ai", () => get.event("choice")) + .set( + "choice", + (() => { + if (get.attitude(player, target) >= 0) return "cancel2"; + const markCount = list.length; + const cards = target.getCards("he", card => lib.filter.cardDiscardable(card, target)); + let allIn = false; + if (player.hp < 2 || target.hp + target.countCards("h", card => target.canSaveCard(card, target)) <= 1 + trigger.targets.some(current => current.hasMark("zhengqing"))) allIn = true; + if (cards.map(card => get.value(card)).reduce((p, c) => p + c, 0) / cards.length > 5) allIn = true; + if ( + !player.isPhaseUsing() || + !player.hasCard(card => { + if (!lib.skill.shencai.getStr(card).includes("【杀】")) return false; + return player.hasValueTarget(get.autoViewAs({ name: "juedou" }, [card])); + }) + ) + allIn = true; + const maxCount = Math.min(markCount, cards.length); + const toRemoveCount = allIn ? maxCount : Math.ceil(Math.random() * maxCount); + return get.cnNumber(toRemoveCount, true); + })() + ) + .forResult(); + if (result.control === "cancel2") return; + const toRemoveCount = result.index + 1; + player.logSkill("zhuangpo_effect", target); + player.popup(get.cnNumber(toRemoveCount) + "张"); + player.removeMark("zhengqing", toRemoveCount); + target.chooseToDiscard("he", toRemoveCount, true); + }, + }, + damage: { + audio: "zhuangpo", + trigger: { source: "damageBegin1" }, + filter(event, player) { + const card = event.card; + if (!card || !card.storage || !card.storage.zhuangpo) return false; + const evt = event.getParent(2); + return evt.targets && evt.targets.some(current => current.hasMark("zhengqing")); + }, + charlotte: true, + forced: true, + async content(event, trigger) { + trigger.num++; + }, + }, + }, + }, + //神鲁肃 + dingzhou: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + const num = player.countCards("he"); + return game.hasPlayer(current => { + if (current == player) return false; + const total = current.countCards("ej"); + return total > 0 && num >= total; + }); + }, + filterCard: true, + selectCard() { + return [1, Math.max(...game.filterPlayer(i => i != get.player()).map(i => i.countCards("ej")))]; + }, + check(card) { + return 7 - get.value(card); + }, + filterTarget(card, player, target) { + const num = target.countCards("ej"); + if (!num) return false; + return ui.selected.cards.length == num && player != target; + }, + filterOk() { + return ui.selected.cards.length == ui.selected.targets[0].countCards("ej"); + }, + position: "he", + lose: false, + discard: false, + delay: false, + async content(event, trigger, player) { + const target = event.targets[0]; + await player.give(event.cards, target); + const cards = target.getGainableCards(player, "ej"); + if (cards.length) player.gain(cards, "give", target); + }, + ai: { + order: 9, + result: { + target(player, target) { + let eff = 0; + if (ui.selected.cards.length) eff = ui.selected.cards.map(card => get.value(card)).reduce((p, c) => p + c, 0); + if (player.hasSkill("zhimeng") && (get.mode() == "identity" || player.countCards("h") - target.countCards("h") > 2 * ui.selected.cards.length)) eff *= 1 + get.sgnAttitude(player, target) * 0.15; + const es = target.getCards("e"), + js = target.getCards("j"); + es.forEach(card => { + eff -= get.value(card, target); + }); + js.forEach(card => { + eff -= get.effect( + target, + { + name: card.viewAs || card.name, + cards: [card], + }, + target, + target + ); + }); + return eff; + }, + }, + }, + }, + tamo: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + game.countPlayer(current => { + if (get.mode() === "doudizhu") return current.getSeatNum() !== 3; + return !current.isZhu2(); + }) > 1 + ); + }, + direct: true, + changeSeat: true, + derivation: "tamo_faq", + async content(event, trigger, player) { + const toSortPlayers = game.filterPlayer(current => { + if (get.mode() === "doudizhu") return current.getSeatNum() !== 3; + return !current.isZhu2(); + }); + toSortPlayers.sortBySeat(game.findPlayer2(current => current.getSeatNum() == 1, true)); + const next = player.chooseToMove("榻谟:是否分配" + (get.mode() != "doudizhu" ? (game.hasPlayer(cur => cur.isZhu2()) ? "除主公外" : "") : "除三号位外") + "所有角色的座次?"); + next.set("list", [ + [ + "(以下排列的顺序即为发动技能后角色的座次顺序)", + [ + toSortPlayers.map(i => `${i.getSeatNum()}|${i.name}`), + (item, type, position, noclick, node) => { + const info = item.split("|"), + _item = item; + const seat = parseInt(info[0]); + item = info[1]; + if (node) { + node.classList.add("button"); + node.classList.add("character"); + node.style.display = ""; + } else { + node = ui.create.div(".button.character", position); + } + node._link = item; + node.link = item; + + const func = function (node, item) { + const currentPlayer = game.findPlayer(current => current.getSeatNum() == seat); + if (currentPlayer.classList.contains("unseen_show")) node.setBackground("hidden_image", "character"); + else if (item != "unknown") node.setBackground(item, "character"); + if (node.node) { + node.node.name.remove(); + node.node.hp.remove(); + node.node.group.remove(); + node.node.intro.remove(); + if (node.node.replaceButton) node.node.replaceButton.remove(); + } + node.node = { + name: ui.create.div(".name", node), + group: ui.create.div(".identity", node), + intro: ui.create.div(".intro", node), + }; + const infoitem = [currentPlayer.sex, currentPlayer.group, `${currentPlayer.hp}/${currentPlayer.maxHp}/${currentPlayer.hujia}`]; + node.node.name.innerHTML = get.slimName(item); + if (lib.config.buttoncharacter_style == "default" || lib.config.buttoncharacter_style == "simple") { + if (lib.config.buttoncharacter_style == "simple") { + node.node.group.style.display = "none"; + } + node.classList.add("newstyle"); + node.node.name.dataset.nature = get.groupnature(get.bordergroup(infoitem)); + node.node.group.dataset.nature = get.groupnature(get.bordergroup(infoitem), "raw"); + } + node.node.name.style.top = "8px"; + if (node.node.name.querySelectorAll("br").length >= 4) { + node.node.name.classList.add("long"); + if (lib.config.buttoncharacter_style == "old") { + node.addEventListener("mouseenter", ui.click.buttonnameenter); + node.addEventListener("mouseleave", ui.click.buttonnameleave); + } + } + node.node.intro.innerHTML = lib.config.intro; + if (!noclick) { + lib.setIntro(node); + } + node.node.group.innerHTML = `
    ${get.cnNumber(seat, true)}号
    `; + node.node.group.style.backgroundColor = get.translation(`${get.bordergroup(infoitem)}Color`); + }; + node.refresh = func; + node.refresh(node, item); + + node.link = _item; + node.seatNumber = seat; + node._customintro = uiintro => { + uiintro.add(`${get.translation(node._link)}(原${get.cnNumber(node.seatNumber, true)}号位)`); + }; + return node; + }, + ], + ], + ]); + next.set("processAI", list => { + const listx = list[0][1][0]; + const me = listx.find(info => parseInt(info.split("|")[0]) == get.player().getSeatNum()); + listx.randomSort(); + if (me) { + listx.remove(me); + listx.unshift(me); + } + return [listx]; + }); + const { result } = await next; + if (!result.bool) return; + await player.logSkill("tamo"); + const resultList = result.moved[0].map(info => { + return parseInt(info.split("|")[0]); + }); + const toSwapList = []; + const cmp = (a, b) => { + return resultList.indexOf(a) - resultList.indexOf(b); + }; + for (let i = 0; i < toSortPlayers.length; i++) { + for (let j = 0; j < toSortPlayers.length; j++) { + if (cmp(toSortPlayers[i].getSeatNum(), toSortPlayers[j].getSeatNum()) < 0) { + toSwapList.push([toSortPlayers[i], toSortPlayers[j]]); + [toSortPlayers[i], toSortPlayers[j]] = [toSortPlayers[j], toSortPlayers[i]]; + } + } + } + game.broadcastAll(toSwapList => { + for (const list of toSwapList) { + game.swapSeat(list[0], list[1], false); + } + }, toSwapList); + if (trigger.name === "phase" && !trigger.player.isZhu2() && trigger.player !== toSortPlayers[0] && !trigger._finished) { + trigger.finish(); + trigger._triggered = 5; + const evt = toSortPlayers[0].insertPhase(); + delete evt.skill; + const evt2 = trigger.getParent(); + if (evt2.name == "phaseLoop" && evt2._isStandardLoop) { + evt2.player = toSortPlayers[0]; + } + //跳过新回合的phaseBefore + evt.pushHandler("onPhase", (event, option) => { + if (event.step === 0 && option.state === "begin") { + event.step = 1; + } + }); + } + await game.asyncDelay(); + }, + }, + //什么均贫卡 + zhimeng: { + audio: 2, + trigger: { player: "phaseAfter" }, + filter(event, player) { + return game.hasPlayer(target => { + if (target == player || target.countCards("h") + player.countCards("h") == 0) return false; + return get.mode() == "identity" || target.countCards("h") <= player.countCards("h") + 1; + }); + }, + direct: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt("zhimeng"), "与一名其他角色平分手牌", (card, player, target) => { + if (target == player || target.countCards("h") + player.countCards("h") == 0) return false; + return get.mode() == "identity" || target.countCards("h") <= player.countCards("h") + 1; + }) + .set("ai", target => { + const player = get.player(); + const pvalue = -player + .getCards("h") + .map(card => get.value(card, player)) + .reduce((p, c) => p + c, 0); + const tvalue = + -target + .getCards("h") + .map(card => get.value(card, target)) + .reduce((p, c) => p + c, 0) * get.sgnAttitude(player, target); + return (pvalue + tvalue) / 2; + }); + if (!bool) return; + const target = targets[0]; + player.logSkill("zhimeng", target); + const lose_list = []; + let cards = []; + [player, target].forEach(current => { + const hs = current.getCards("h"); + if (hs.length) { + cards.addArray(hs); + current.$throw(hs.length, 500); + game.log(current, "将", get.cnNumber(hs.length), "张牌置入了处理区"); + lose_list.push([current, hs]); + } + }); + await game + .loseAsync({ + lose_list: lose_list, + }) + .setContent("chooseToCompareLose"); + await game.asyncDelay(); + cards = cards.filterInD(); + const pcards = cards.randomGets(Math.ceil(cards.length / 2)); + const tcards = cards.removeArray(pcards); + const list = []; + if (pcards.length) { + list.push([player, pcards]); + game.log(player, "获得了", get.cnNumber(pcards.length), "张牌"); + } + if (tcards.length) { + list.push([target, tcards]); + game.log(target, "获得了", get.cnNumber(tcards.length), "张牌"); + } + game.loseAsync({ + gain_list: list, + player: player, + animate: "draw", + }).setContent("gaincardMultiple"); + }, + ai: { + threaten: 4, + }, + }, + //神华佗 + wuling: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(target => lib.skill.wuling.filterTarget(null, player, target)); + }, + filterTarget(card, player, target) { + return !target.hasSkill("wuling_wuqinxi"); + }, + usable: 2, + prompt: "选择一名角色,向其传授“五禽戏”", + group: "wuling_die", + content() { + "step 0"; + target.addAdditionalSkill(`wuling_${player.playerid}`, "wuling_wuqinxi"); + var next = player.chooseToMove(`五灵:调整向${get.translation(target)}传授的“五禽戏”顺序`); + next.set("list", [ + [ + "", + [ + lib.skill.wuling.wuqinxi, + (item, type, position, noclick, node) => { + node = ui.create.buttonPresets.vcard(item, type, position, noclick); + node._customintro = [node => `五禽戏:${node.link[2]}`, node => lib.skill.wuling.wuqinxiMap[lib.skill.wuling.wuqinxi.indexOf(node.link[2])].slice(2)]; + return node; + }, + ], + ], + ]); + next.set("processAI", () => { + const event = get.event().getParent(), + player = event.player, + target = event.target; + const spirits = []; + let nextPlayer = player; + do { + nextPlayer = nextPlayer.getNext(); + if (get.attitude(player, nextPlayer) < 0) { + spirits.add("熊"); + break; + } + } while (nextPlayer != target); + if (!spirits.length) spirits.add("猿"); + if ( + get.recoverEffect(target, player, player) > 0 || + target.hasCard(card => { + return ( + get.effect( + target, + { + name: card.viewAs || card.name, + cards: [card], + }, + target, + target + ) < -1 + ); + }, "j") + ) + spirits.add("鹿"); + const others = lib.skill.wuling.wuqinxi.slice().removeArray(spirits); + do { + others.randomSort(); + } while (others.length > 1 && others[0] == "鹿"); + return [spirits.concat(others).map(i => ["", "", i])]; + }); + "step 1"; + var sortedWuqinxi = result.moved[0].map(i => i[2]); + game.log(target, "习得的五禽戏顺序为", "#g" + sortedWuqinxi.join("、")); + sortedWuqinxi.unshift(sortedWuqinxi[0]); + target.storage.wuling_wuqinxi = sortedWuqinxi; + lib.skill.wuling.updateMark(target); + }, + wuqinxi: ["虎", "鹿", "熊", "猿", "鹤"], + wuqinxiMap: ["虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。", "鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。", "熊:每回合限一次,当你受到伤害时,此伤害-1。", "猿:当你获得此效果时,你选择一名其他角色,获得其装备区里的一张牌。", "鹤:当你获得此效果时,你摸三张牌。"], + updateMark(player) { + var wuqinxi = player.storage.wuling_wuqinxi; + if (!wuqinxi) return; + var prevMark = wuqinxi.shift(); + // wuqinxi.push(prevMark); + var curMark = wuqinxi[0]; + if (!curMark) { + for (var skill in player.additionalSkills) { + if (!skill.startsWith("wuling_")) continue; + player.removeAdditionalSkill(skill); + } + game.log(player, "完成了五禽戏的操练"); + return; + } + game.log(player, "获得了", "#g【" + curMark + "】", "标记"); + player.markSkill("wuling_wuqinxi"); + game.broadcastAll( + function (player, curMark) { + if (player.marks.wuling_wuqinxi) player.marks.wuling_wuqinxi.firstChild.innerHTML = curMark; + }, + player, + curMark + ); + var next = game.createEvent("wuling_change"); + next.player = player; + next.setContent("emptyEvent"); + }, + ai: { + order: 7, + threaten: 5, + result: { target: 1 }, + }, + derivation: "wuling_wuqinxi", + subSkill: { + wuqinxi: { + nopop: true, + charlotte: true, + intro: { + markcount: () => 0, + mark(dialog, storage) { + const wuqinxiMap = lib.skill.wuling.wuqinxiMap; + const str = `
  • 当前效果:${storage[0]}
  • ${wuqinxiMap.find(str => storage[0] == str[0]).slice(2)}
    `; + dialog.addText(str, false); + const str2 = '
    “五禽戏”顺序:
    ' + storage.join(" ") + "
    "; + dialog.addText(str2); + if (storage.length > 1) { + const str3 = `
    [下一效果] ${wuqinxiMap.find(str => storage[1] == str[0])}
    `; + dialog.add(str3); + } + }, + }, + mod: { + targetEnabled(card, player, target) { + if (get.type(card) == "delay" && target.storage.wuling_wuqinxi && target.storage.wuling_wuqinxi[0] == "鹿") return false; + }, + }, + trigger: { + source: "damageBegin1", + player: ["phaseZhunbeiBegin", "damageBegin4", "wuling_change"], + }, + filter(event, player, name) { + const wuqinxi = player.storage.wuling_wuqinxi && player.storage.wuling_wuqinxi[0]; + if (!wuqinxi) return false; + if (event.name == "phaseZhunbei") return true; + switch (name) { + case "damageBegin1": + if (wuqinxi != "虎" || !event.card) return false; + var evt = event.getParent("useCard"); + return evt.targets && evt.targets.length == 1 && evt.targets.includes(event.player); + case "damageBegin4": + return wuqinxi == "熊" && !player.hasSkill("wuling_xiong"); + default: + switch (wuqinxi) { + case "鹿": + return player.isDamaged() || player.countCards("j"); + case "鹤": + return true; + case "猿": + return game.hasPlayer(target => target != player && target.countGainableCards(player, "e")); + default: + return false; + } + } + }, + forced: true, + onremove: true, + content() { + "step 0"; + var wuqinxi = player.storage.wuling_wuqinxi[0]; + if (trigger.name == "phaseZhunbei") { + lib.skill.wuling.updateMark(player); + event.finish(); + } else { + var name = event.triggername; + switch (name) { + case "damageBegin1": + player.line(trigger.player); + trigger.num++; + event.finish(); + break; + case "damageBegin4": + player.addTempSkill("wuling_xiong"); + trigger.num--; + event.finish(); + break; + default: + switch (wuqinxi) { + case "鹿": + player.recover(); + player.discard(player.getCards("j")).discarder = player; + event.finish(); + break; + case "鹤": + player.draw(3); + event.finish(); + break; + case "猿": + player + .chooseTarget("五禽戏:获得一名其他角色装备区里的一张装备牌", function (card, player, target) { + return target != player && target.countGainableCards(player, "e"); + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target), + eff = 0; + target.getCards("e", function (card) { + var val = get.value(card, target); + eff = Math.max(eff, -val * att); + }); + return eff; + }); + break; + } + break; + } + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.gainPlayerCard(target, "e", true); + } + }, + ai: { + effect: { + target(card, player, target) { + const wuqinxi = target.storage.wuling_wuqinxi; + if (!wuqinxi || !wuqinxi.length) return; + const curWuqinxi = wuqinxi[0]; + const nextWuqinxi = wuqinxi[1]; + if (nextWuqinxi == "鹿" && get.type(card) == "delay") return "zerotarget"; + if (curWuqinxi != "熊" || player.hasSkill("wuling_xiong")) return; + if (player.hasSkillTag("jueqing", false, target)) return; + var num = get.tag(card, "damage"); + if (num) { + if (num > 1) return 0.5; + return 0; + } + }, + }, + }, + }, + xiong: { charlotte: true }, + die: { + trigger: { player: "die" }, + filter(event, player) { + return game.hasPlayer(current => current.additionalSkills[`wuling_${player.playerid}`]); + }, + forced: true, + locked: false, + forceDie: true, + content() { + var targets = game.filterPlayer(current => { + return current.additionalSkills[`wuling_${player.playerid}`]; + }); + player.line(targets); + targets.forEach(current => current.removeAdditionalSkill(`wuling_${player.playerid}`)); + }, + }, + }, + }, + youyi: { + init(player) { + player.storage.renku = true; + }, + audio: 2, + enable: "phaseUse", + filter(event, player) { + return _status.renku.length > 0; + }, + prompt: "将仁区所有牌置入弃牌堆,令所有角色各回复1点体力", + content() { + "step 0"; + var cards = _status.renku.slice(); + game.cardsDiscard(cards).fromRenku = true; + _status.renku.removeArray(cards); + player.$throw(cards, 1000); + game.updateRenku(); + game.log(cards, "从仁库进入了弃牌堆"); + "step 1"; + var targets = game.filterPlayer(); + player.line(targets); + targets.forEach(target => target.recover()); + }, + ai: { + order(item, player) { + return get.order({ name: "taoyuan" }, player); + }, + result: { + player(player) { + return Math.max( + 0, + game.filterPlayer().reduce((num, target) => num + get.recoverEffect(target, player, player), 0) + ); + }, + }, + }, + group: "youyi_put", + subSkill: { + put: { + audio: "youyi", + trigger: { player: "phaseDiscardEnd" }, + filter(event, player) { + return lib.skill.twlijian.getCards(event).length; + }, + prompt2(event, player) { + return "将" + get.translation(lib.skill.twlijian.getCards(event)) + "置入仁区"; + }, + content() { + var cards = lib.skill.twlijian.getCards(trigger); + game.log(player, "将", cards, "置于了仁库"); + game.cardsGotoSpecial(cards, "toRenku"); + }, + }, + }, + }, + //神贾诩 + jxlianpo: { + audio: 2, + init: () => { + game.addGlobalSkill("jxlianpo_global"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("jxlianpo"), true)) game.removeGlobalSkill("jxlianpo_global"); + }, + trigger: { global: "dieAfter" }, + filter(event, player) { + if (lib.skill.jxlianpo.getMax().length <= 1) return false; + return event.source && event.source.isIn(); + }, + forced: true, + logTarget: "source", + getMax: () => { + const map = { + zhu: game.countPlayer(current => { + const identity = current.identity; + let num = 0; + if (identity == "zhu" || identity == "zhong" || identity == "mingzhong") num++; + num += current.countMark("jxlianpo_mark_zhong"); + return num; + }), + fan: game.countPlayer(current => { + let num = 0; + if (current.identity == "fan") num++; + num += current.countMark("jxlianpo_mark_fan"); + return num; + }), + nei: game.countPlayer(current => { + let num = 0; + if (current.identity == "nei") num++; + num += current.countMark("jxlianpo_mark_nei"); + return num; + }), + commoner: game.countPlayer(current => { + let num = 0; + if (current.identity == "commoner") num++; + num += current.countMark("jxlianpo_mark_commoner"); + return num; + }), + }; + let population = 0, + identities = []; + for (let i in map) { + let curPopulation = map[i]; + if (curPopulation >= population) { + if (curPopulation > population) identities = []; + identities.add(i); + population = curPopulation; + } + } + return identities; + }, + group: "jxlianpo_show", + *content(event, map) { + var source = map.trigger.source; + source.chooseDrawRecover(2, true); + }, + mark: true, + intro: { + content: () => + `场上最大阵营为${lib.skill.jxlianpo + .getMax() + .map(i => { + if (i == "zhu") return "主忠"; + return get.translation(i + "2"); + }) + .join("、")}`, + }, + $createButton(item, type, position, noclick, node) { + node = ui.create.identityCard(item, position, noclick); + node.link = item; + return node; + }, + subSkill: { + show: { + audio: "jxlianpo", + trigger: { global: "roundStart" }, + filter(event, player) { + var list = lib.config.mode_config.identity.identity.lastItem.slice(); + list.removeArray( + game.filterPlayer().map(i => { + let identity = i.identity; + if (identity == "mingzhong") identity = "zhong"; + return identity; + }) + ); + return list.length; + }, + forced: true, + content() { + "step 0"; + var list = lib.config.mode_config.identity.identity.lastItem.slice(); + list.removeArray( + game.filterPlayer().map(i => { + var identity = i.identity; + return identity == "mingzhong" ? "zhong" : identity; + }) + ).unique(); + player.chooseButton( + [ + '###炼魄:请选择一个身份###
    你选择的身份对应的阵营角色数于本轮内视为+1
    ', + [ + list, + function (item, type, position, noclick, node) { + return lib.skill.jxlianpo.$createButton(item, type, position, noclick, node); + }, + ], + ], + true + ); + "step 1"; + var choice = result.links[0], + mark = `jxlianpo_mark_${choice}`; + player + .when({ global: "roundStart" }) + .assign({ + firstDo: true, + }) + .filter(evt => evt != trigger) + .then(() => { + for (var i in player.storage) { + if (i.startsWith("jxlianpo_mark_")) { + player.clearMark(i); + } + } + }); + player.addMark(mark, 1, false); + event.videoId = lib.status.videoId++; + var createDialog = function (player, identity, id) { + var dialog = ui.create.dialog(`${get.translation(player)}展示了“${get.translation(identity + "2")}”的身份牌
    `, "forcebutton"); + dialog.videoId = id; + ui.create.spinningIdentityCard(identity, dialog); + }; + game.broadcastAll(createDialog, player, choice, event.videoId); + var color = ""; + if (choice == "zhong") color = "#y"; + else if (choice == "fan") color = "#g"; + else if (choice == "nei") color = "#b"; + game.log(player, "展示了", `${color}${get.translation(choice + "2")}`, "的身份牌"); + game.delay(3); + "step 2"; + game.broadcastAll("closeDialog", event.videoId); + }, + }, + global: { + mod: { + maxHandcard(player, num) { + if (!lib.skill.jxlianpo.getMax().includes("fan")) return; + return ( + num - + game.countPlayer(current => { + return current != player && current.hasSkill("jxlianpo"); + }) + ); + }, + cardUsable(card, player, num) { + if (card.name == "sha") { + if (!lib.skill.jxlianpo.getMax().includes("fan")) return; + return ( + num + + game.countPlayer(current => { + return current.hasSkill("jxlianpo"); + }) + ); + } + }, + attackRange(player, num) { + if (!lib.skill.jxlianpo.getMax().includes("fan")) return; + return ( + num + + game.countPlayer(current => { + return current.hasSkill("jxlianpo"); + }) + ); + }, + cardSavable(card, player, target) { + if (card.name == "tao" && !player.hasSkill("jxlianpo")) { + if (!lib.skill.jxlianpo.getMax().includes("zhu")) return; + if (player == target) return; + return false; + } + }, + playerEnabled(card, player, target) { + if (card.name == "tao" && !player.hasSkill("jxlianpo")) { + if (!lib.skill.jxlianpo.getMax().includes("zhu")) return; + if (player == target) return; + return false; + } + }, + }, + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("jxlianpo"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("jxlianpo_global"); + }, + }, + }, + }, + jxzhaoluan: { + audio: 2, + trigger: { global: "dieBegin" }, + filter(event, player) { + return event.getParent().name == "dying" && event.player.isIn(); + }, + limited: true, + skillAnimation: true, + animationColor: "metal", + logTarget: "player", + check(event, player) { + if (event.source && event.source.isIn() && get.attitude(player, event.source) > 0 && player.identity == "fan") return false; + return get.attitude(player, event.player) > 3.5; + }, + *content(event, map) { + var player = map.player, + trigger = map.trigger; + var target = trigger.player; + player.awakenSkill("jxzhaoluan"); + trigger.cancel(); + const skills = target.getSkills(null, false, false).filter(skill => { + var info = get.info(skill); + if (info && !info.charlotte && !get.is.locked(skill)) { + return true; + } + }); + if (skills.length) yield target.removeSkills(skills); + yield target.gainMaxHp(3); + var num = 3 - target.getHp(true); + if (num > 0) yield target.recover(num); + target.draw(4); + player.addSkill("jxzhaoluan_effect"); + player.markAuto("jxzhaoluan_effect", target); + }, + ai: { + expose: 0.5, + threaten: 3, + }, + subSkill: { + effect: { + audio: "jxzhaoluan", + enable: "phaseUse", + filter(event, player) { + return player.getStorage("jxzhaoluan_effect").some(i => i.isIn()); + }, + filterTarget(card, player, target) { + return !player.getStorage("jxzhaoluan_hit").includes(target); + }, + line: false, + locked: true, + charlotte: true, + promptfunc() { + var bodies = _status.event.player.getStorage("jxzhaoluan_effect").filter(i => i.isIn()); + return `选择一名角色,你令${get.translation(bodies)}${bodies.length > 1 ? "中的一人" : ""}减1点体力上限,然后你对选择的角色造成1点伤害。`; + }, + delay: false, + content() { + "step 0"; + var bodies = player.getStorage("jxzhaoluan_effect").filter(i => i.isIn()); + if (bodies.length == 1) event._result = { bool: true, targets: bodies }; + else { + player + .chooseTarget("兆乱:请选择被减上限的傀儡", true, (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set("targets", bodies) + .set("ai", target => { + return 8 - get.attitude(_status.event.player, target); + }); + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + target.loseMaxHp(); + game.delayex(); + } else event.finish(); + "step 2"; + player.line(target); + target.damage(); + if (!player.storage.jxzhaoluan_hit) { + player.when("phaseUseAfter").then(() => { + delete player.storage.jxzhaoluan_hit; + }); + } + player.markAuto("jxzhaoluan_hit", target); + }, + ai: { + order: 9, + result: { + player(player) { + var bodies = player.getStorage("jxzhaoluan_effect").filter(i => i.isIn()); + var body; + if (bodies.length == 1) body = bodies[0]; + else body = bodies.sort((a, b) => get.attitude(player, a) - get.attitude(player, b))[0]; + if (get.attitude(player, body) > 4 && !body.isDamaged() && body.getHp() <= 2) return -10; + return 0; + }, + target(player, target) { + return Math.sign(get.damageEffect(target, player, target)); + }, + }, + }, + }, + }, + }, + //神典韦 + juanjia: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.hasEnabledSlot(2); + }, + content() { + player.disableEquip(2); + player.expandEquip(1); + }, + }, + qiexie: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter(event, player) { + return player.countEmptySlot(1) > 0; + }, + content() { + "step 0"; + if (!_status.characterlist) { + lib.skill.pingjian.initList(); + } + _status.characterlist.randomSort(); + var list = []; + for (var name of _status.characterlist) { + var info = lib.character[name]; + if ( + info[3].some(function (skill) { + var info = get.skillInfoTranslation(skill); + if (!info.includes("【杀】")) return false; + var list = get.skillCategoriesOf(skill); + list.remove("锁定技"); + return list.length == 0; + }) + ) { + list.push(name); + if (list.length >= 5) break; + } + } + if (!list.length) event.finish(); + else { + var num = player.countEmptySlot(1); + player + .chooseButton( + [ + "挈挟:选择" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "张武将置入武器栏", + [ + list, + function (item, type, position, noclick, node) { + return lib.skill.qiexie.$createButton(item, type, position, noclick, node); + }, + ], + ], + [1, num], + true + ) + .set("ai", function (button) { + var name = button.link; + var info = lib.character[name]; + var skills = info[3].filter(function (skill) { + var info = get.skillInfoTranslation(skill); + if (!info.includes("【杀】")) return false; + var list = get.skillCategoriesOf(skill); + list.remove("锁定技"); + return list.length == 0; + }); + var eff = 0.2; + for (var i of skills) { + eff += get.skillRank(i, "in"); + } + return eff; + }); + } + "step 1"; + if (result.bool) { + var list = result.links; + game.addVideo("skill", player, ["qiexie", [list]]); + _status.characterlist.removeArray(list); + game.broadcastAll( + function (player, list) { + player.tempname.addArray(list); + for (var name of list) lib.skill.qiexie.createCard(name); + }, + player, + list + ); + var cards = list.map(function (name) { + var card = game.createCard("qiexie_" + name, "none", get.infoMaxHp(lib.character[name][2])); + return card; + }); + player.$gain2(cards); + game.delayx(); + for (var card of cards) player.equip(card); + } + }, + $createButton(item, type, position, noclick, node) { + node = ui.create.buttonPresets.character(item, "character", position, noclick); + const info = lib.character[item]; + const skills = info[3].filter(function (skill) { + var info = get.skillInfoTranslation(skill); + if (!info.includes("【杀】")) return false; + var list = get.skillCategoriesOf(skill); + list.remove("锁定技"); + return list.length == 0; + }); + if (skills.length) { + const skillstr = skills.map(i => `[${get.translation(i)}]`).join("
    "); + const skillnode = ui.create.caption(`
    ${skillstr}
    `, node); + skillnode.style.left = "2px"; + skillnode.style.bottom = "2px"; + } + node._customintro = function (uiintro, evt) { + const character = node.link, + characterInfo = get.character(node.link); + let capt = get.translation(character); + if (characterInfo) { + const infoHp = get.infoMaxHp(characterInfo[2]); + capt += `  范围:${infoHp}`; + } + uiintro.add(capt); + if (lib.characterTitle[node.link]) { + uiintro.addText(get.colorspan(lib.characterTitle[node.link])); + } + for (let i = 0; i < skills.length; i++) { + if (lib.translate[skills[i] + "_info"]) { + let translation = lib.translate[skills[i] + "_ab"] || get.translation(skills[i]).slice(0, 2); + if (lib.skill[skills[i]] && lib.skill[skills[i]].nobracket) { + uiintro.add('
    ' + get.translation(skills[i]) + "
    " + get.skillInfoTranslation(skills[i]) + "
    "); + } else { + uiintro.add('
    【' + translation + "】
    " + get.skillInfoTranslation(skills[i]) + "
    "); + } + if (lib.translate[skills[i] + "_append"]) { + uiintro._place_text = uiintro.add('
    ' + lib.translate[skills[i] + "_append"] + "
    "); + } + } + } + }; + return node; + }, + video(player, info) { + for (var name of info[0]) { + lib.skill.qiexie.createCard(name); + } + }, + createCard(name) { + if (!_status.postReconnect.qiexie) + _status.postReconnect.qiexie = [ + function (list) { + for (var name of list) lib.skill.qiexie.createCard(name); + }, + [], + ]; + _status.postReconnect.qiexie[1].add(name); + if (!lib.card["qiexie_" + name]) { + if (lib.translate[name + "_ab"]) lib.translate["qiexie_" + name] = lib.translate[name + "_ab"]; + else lib.translate["qiexie_" + name] = lib.translate[name]; + var info = lib.character[name]; + var card = { + fullimage: true, + image: "character:" + name, + type: "equip", + subtype: "equip1", + enable: true, + selectTarget: -1, + filterCard(card, player, target) { + if (player != target) return false; + return target.canEquip(card, true); + }, + modTarget: true, + allowMultiple: false, + content: lib.element.content.equipCard, + toself: true, + ai: {}, + skills: ["qiexie_destroy"], + }; + var maxHp = get.infoMaxHp(info[2]); + if (maxHp != 1) card.distance = { attackFrom: 1 - maxHp }; + var skills = info[3].filter(function (skill) { + var info = get.skillInfoTranslation(skill); + if (!info.includes("【杀】")) return false; + var list = get.skillCategoriesOf(skill); + list.remove("锁定技"); + return list.length == 0; + }); + var str = "锁定技。"; + if (skills.length) { + card.skills.addArray(skills); + str += "你视为拥有技能"; + for (var skill of skills) { + str += "〖" + get.translation(skill) + "〗"; + str += "、"; + } + str = str.slice(0, str.length - 1); + str += ";"; + card.ai.equipValue = function (card, player) { + let val = maxHp; + if (player.hasSkill("qiexie")) val *= 0.4; + else val *= 0.6; + return (val += skills.length); + }; + } + str += "此牌离开你的装备区后,改为置入剩余武将牌牌堆。"; + lib.translate["qiexie_" + name + "_info"] = str; + var append = ""; + if (skills.length) { + for (var skill of skills) { + if (lib.skill[skill].nobracket) { + append += '
    ' + get.translation(skill) + '
    ' + get.skillInfoTranslation(skill) + "


    "; + } else { + var translation = lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2); + append += '
    【' + translation + '】
    ' + get.skillInfoTranslation(skill) + "


    "; + } + } + str = str.slice(0, str.length - 8); + } + lib.translate["qiexie_" + name + "_append"] = append; + lib.card["qiexie_" + name] = card; + } + }, + subSkill: { + destroy: { + trigger: { player: "loseBegin" }, + equipSkill: true, + forceDie: true, + charlotte: true, + forced: true, + popup: false, + filter(event, player) { + return event.cards.some(card => card.name.indexOf("qiexie_") == 0); + }, + content() { + for (var card of trigger.cards) { + if (card.name.indexOf("qiexie_") == 0) { + card._destroy = true; + game.log(card, "被放回武将牌堆"); + var name = card.name.slice(7); + if (player.tempname && player.tempname.includes(name)) { + game.broadcastAll( + (player, name) => { + player.tempname.remove(name); + }, + player, + name + ); + } + if (lib.character[name]) _status.characterlist.add(name); + } + } + }, + }, + }, + }, + cuijue: { + enable: "phaseUse", + filter(event, player) { + return player.countCards("he") > 0; //&&game.hasPlayer(target=>lib.skill.cuijue.filterTarget('SB',player,target)); + }, + filterCard: true, + filterTarget(card, player, target) { + if (player.getStorage("cuijue_used").includes(target) || !player.inRange(target)) return false; + var distance = get.distance(player, target); + return !game.hasPlayer(current => current != target && player.inRange(current) && get.distance(player, current) > distance); + }, + selectTarget: [0, 1], + filterOk() { + var player = _status.event.player; + if (game.hasPlayer(target => lib.skill.cuijue.filterTarget("SB", player, target))) return ui.selected.targets.length > 0; + return true; + }, + position: "he", + complexTarget: true, + check: card => { + var player = _status.event.player, + goon = 0; + try { + ui.selected.cards.add(card); + if ( + game.hasPlayer(target => { + return lib.skill.cuijue.filterTarget("SB", player, target); + }) + ) { + goon = 6; + } + } catch (e) { + console.trace(e); + } + ui.selected.cards.remove(card); + return goon - get.value(card); + }, + content() { + if (target) { + player.addTempSkill("cuijue_used", "phaseUseAfter"); + player.markAuto("cuijue_used", [target]); + target.damage("nocard"); + } + }, + ai: { + order: 2, + result: { + target: -1.5, + }, + tag: { + damage: 1, + }, + }, + subSkill: { + used: { + onremove: true, + charlotte: true, + }, + }, + }, + //神邓艾 + dctuoyu: { + audio: 2, + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + forced: true, + filter(event, player) { + return player.countCards("h") > 0 && player.getStorage("dctuoyu").length > 0; + }, + content() { + "step 0"; + var hs = player.getCards("h"), + tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; + var storage = player.getStorage("dctuoyu"); + var list = [ + ["未分配手牌(对话框较长,请下滑操作)", []], + ["丰田(伤害/回复值+1)", []], + ["清渠(无次数和距离限制)", []], + ["峻山(不可被响应)", []], + ]; + for (var card of hs) { + var added = false; + for (var i = 0; i < tags.length; i++) { + if (card.hasGaintag(tags[i] + "_tag")) { + added = true; + list[i + 1][1].push(card); + break; + } + } + if (!added) list[0][1].push(card); + } + for (var row of list) { + for (var i = 0; i < tags.length; i++) { + if (!storage.includes(tags[i])) { + list[i + 1][0] = get.translation(tags[i]) + "(尚未激活)"; + } + } + } + var next = player.chooseToMove("拓域:请分配你的手牌", true); + next.set("list", list); + next.set("filterMove", function (from, to, moved) { + var storage = _status.event.player.getStorage("dctuoyu"), + tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; + if (typeof to == "number") { + if (to == 0) return true; + return storage.includes(tags[to - 1]) && moved[to].length < 5; + } + return true; + }); + next.set("processAI", function () { + var player = _status.event.player; + var storage = player.getStorage("dctuoyu"), + tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; + var moved = [[], [], [], []]; + var isEmpty = function (to) { + return storage.includes(tags[to - 1]) && moved[to].length < 5; + }; + var hs = player.getCards("h"); + var hs2 = hs.slice(0); + var usable = player.getCardUsable("sha"); + var addTo = function (card, to) { + if (isEmpty(to)) { + hs2.remove(card); + moved[to].push(card); + if (get.name(card) == "sha" && to != 2) usable--; + } + }; + var hasRuanshizi = game.hasPlayer(function (target) { + return ( + target != player && + player.canUse("sha", target, null, true) && + !target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) && + get.attitude(player, target) < 0 && + get.effect(target, { name: "sha" }, player, player) > 0 + ); + }); + for (var card of hs) { + var name = get.name(card); + if (name == "tao" || name == "jiu") { + addTo(card, 1); + } else if (name == "sha") { + if (hasRuanshizi && isEmpty(1) && usable > 0) addTo(card, 1); + else if (isEmpty(3) && usable > 0) addTo(card, 3); + else addTo(card, 2); + } else if (get.type(name) == "trick") { + if (isEmpty(1) && get.tag(card, "damage") > 0 && player.hasUseTarget(card)) addTo(card, 1); + else addTo(card, 3); + } + } + moved[0].addArray(hs2); + return moved; + }); + "step 1"; + if (result.bool) { + game.broadcastAll( + function (moved, player) { + var tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; + var cards = []; + for (var i = 0; i < moved.length; i++) { + for (var card of moved[i]) { + cards.unshift(card); + for (var j = 0; j < tags.length; j++) { + if (i == j + 1) { + if (!card.hasGaintag(tags[j] + "_tag")) card.addGaintag(tags[j] + "_tag"); + } else { + if (card.hasGaintag(tags[j] + "_tag")) card.removeGaintag(tags[j] + "_tag"); + } + } + } + } + if (player == game.me) { + game.addVideo("lose", game.me, [get.cardsInfo(cards), [], [], []]); + for (var i = 0; i < cards.length; i++) { + cards[i].goto(ui.special); + } + game.me.directgain(cards, false); + } + }, + result.moved, + player + ); + } + }, + intro: { + content: "已激活的副区域:$", + }, + group: "dctuoyu_effect", + subSkill: { + effect: { + mod: { + targetInRange(card, player, target) { + if (!card.cards) return; + for (var i of card.cards) { + if (i.hasGaintag("dctuoyu_qingqu_tag")) return true; + } + }, + cardUsable(card, player, num) { + if (!card.cards) return; + for (var i of card.cards) { + if (i.hasGaintag("dctuoyu_qingqu_tag")) return Infinity; + } + }, + }, + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + var tags = ["dctuoyu_fengtian_tag", "dctuoyu_qingqu_tag", "dctuoyu_junshan_tag"], + card = event.card; + return player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + for (var tag of evt.gaintag_map[i]) { + if (tags.includes(tag)) return true; + } + } + return false; + }); + }, + content() { + var tags = ["dctuoyu_fengtian_tag", "dctuoyu_qingqu_tag", "dctuoyu_junshan_tag"], + card = trigger.card; + player.hasHistory("lose", function (evt) { + if (evt.getParent() != trigger) return false; + for (var i in evt.gaintag_map) { + tags.removeArray(evt.gaintag_map[i]); + } + return tags.length == 0; + }); + if (!tags.includes("dctuoyu_fengtian_tag")) { + if (get.tag(card, "damage") > 0 || get.tag(card, "recover") > 0) { + trigger.baseDamage++; + game.log(card, "的伤害值/回复值+1"); + } + } + if (!tags.includes("dctuoyu_qingqu_tag")) { + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat("card"); + if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; + game.log(card, "不计入次数限制"); + } + } + if (!tags.includes("dctuoyu_junshan_tag")) { + game.log(card, "不可被响应"); + trigger.directHit.addArray(game.filterPlayer()); + } + }, + }, + }, + ai: { + combo: "dcxianjin", + }, + }, + dcxianjin: { + init(player) { + var num = game + .getAllGlobalHistory("changeHp", evt => { + return evt.getParent().name == "damage" && (evt.getParent().player == player || (evt.getParent().source && evt.getParent().source == player)); + }) + .concat( + game.getAllGlobalHistory("changeHp", evt => { + return evt.getParent().name == "damage" && evt.getParent().player == player && evt.getParent().source && evt.getParent().source == player; + }) + ).length; + if (num) player.addMark("dcxianjin", num, false); + }, + onremove: true, + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + filter(event, player) { + return player.countMark("dcxianjin") % 2 == 0; + }, + forced: true, + content() { + "step 0"; + var tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; + tags.removeArray(player.getStorage("dctuoyu")); + if (!tags.length) { + player.draw(player.isMaxHandcard() ? 1 : 3); + event.finish(); + } else if (tags.length == 1) { + event._result = { control: tags[0] }; + } else player.chooseControl(tags).set("prompt", "险峻:选择激活一个副区域标签"); + "step 1"; + var control = result.control; + game.log(player, "激活了副区域", "#y" + get.translation(control)); + player.markAuto("dctuoyu", [control]); + player.popup(get.translation(control + "_tag")); + if (player.isMaxHandcard()) player.draw(); + else player.draw(player.getStorage("dctuoyu").length); + }, + group: "dcxianjin_mark", + intro: { content: "已造成或受到#次伤害" }, + subSkill: { + mark: { + charlotte: true, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + forced: true, + popup: false, + firstDo: true, + content() { + player.addMark("dcxianjin", 1, false); + }, + }, + }, + ai: { + combo: "dctuoyu", + }, + }, + dcqijing: { + derivation: "dccuixin", + audio: 2, + trigger: { global: "phaseEnd" }, + filter(event, player) { + return player.getStorage("dctuoyu").length == 3; + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "orange", + changeSeat: true, + content() { + "step 0"; + player.awakenSkill("dcqijing"); + player.loseMaxHp(); + player.addSkills("dccuixin"); + "step 1"; + if (game.countPlayer() > 2) { + if (player == trigger.player && !trigger.skill) { + var evt = trigger.getParent(); + if (evt.name == "phaseLoop" && evt._isStandardLoop) evt.player = player.next; + } + player + .chooseTarget( + "请选择一名要更换座次的角色,将自己移动到该角色的上家位置", + function (card, player, target) { + return target != player && target != player.next; + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + var current = _status.currentPhase.next; + var max = 20, + att = 0; + while (max > 0) { + max--; + if (current == target) return att; + att -= get.attitude(player, current); + current = current.next; + } + return att; + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + game.broadcastAll( + function (target1, target2) { + game.swapSeat(target1, target2, null, true); + }, + player, + target + ); + } else event.finish(); + "step 3"; + player.insertPhase(); + }, + ai: { + combo: "dctuoyu", + }, + }, + dccuixin: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + if (!event._dccuixin || get.type(event.card, false) == "delay" || get.type(event.card, false) == "equip") return false; + var card = { + name: event.card.name, + nature: event.card.nature, + isCard: true, + }, + list = event._dccuixin; + for (var target of list) { + var targetx = player[target](); + if (lib.filter.targetEnabled2(card, targetx, player)) return true; + } + return false; + }, + direct: true, + content() { + "step 0"; + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }; + event.card = card; + var list = []; + trigger._dccuixin.forEach(target => { + var targetx = player[target](); + if (lib.filter.targetEnabled2(card, targetx, player)) list.add(targetx); + }); + if (list.length == 1) { + event.target = list[0]; + player + .chooseBool("摧心:是否视为对" + get.translation(list[0]) + "使用" + get.translation(card) + "?") + .set("goon", get.effect(list[0], card, player, player) > 0) + .set("ai", () => _status.event.goon); + } else { + player + .chooseTarget("摧心:是否视为对上家或下家使用" + get.translation(card) + "?", "操作提示:从上家或下家中选择一名角色作为使用目标", function (card, player, target) { + return (target == player.getNext() || target == player.getPrevious()) && lib.filter.targetEnabled2(_status.event.getParent().card, target, player); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.getParent().card, player, player); + }); + } + "step 1"; + if (result.bool) { + var target = event.target || result.targets[0]; + player.useCard(card, target, false, "dccuixin"); + } + }, + group: "dccuixin_silent", + subSkill: { + silent: { + trigger: { player: "useCardToPlayered" }, + silent: true, + forced: true, + popup: false, + firstDo: true, + charlotte: true, + filter(event, player) { + if (!event.isFirstTarget || event.getParent().skill == "dccuixin") return false; + if (event.targets.length == 0) return false; + return event.targets.includes(player.getNext()) || event.targets.includes(player.getPrevious()); + }, + content() { + var list = []; + if (trigger.targets.includes(player.getNext())) list.push("getPrevious"); + if (trigger.targets.includes(player.getPrevious())) list.push("getNext"); + trigger.getParent()._dccuixin = list; + }, + }, + }, + }, + //海外神吕蒙 + twshelie: { + audio: "shelie", + inherit: "shelie", + prompt2: () => lib.translate.shelie_info, + group: "twshelie_jingce", + //什么精策技能啊喂! + subSkill: { + round: { charlotte: true }, + count: { + charlotte: true, + onremove: true, + intro: { + markcount(storage) { + return storage.length; + }, + content: "本回合已使用$花色的牌", + }, + }, + jingce: { + audio: "shelie", + trigger: { player: ["phaseJieshuBegin", "useCard1"] }, + filter(event, player) { + if (player.hasSkill("twshelie_round") || player != _status.currentPhase) return false; + var list = []; + player.getHistory("useCard", function (evt) { + if (lib.suit.includes(get.suit(evt.card)) && !list.includes(get.suit(evt.card))) list.push(get.suit(evt.card)); + }); + if (list.length) { + player.addTempSkill("twshelie_count"); + player.storage.twshelie_count = list.sort(function (a, b) { + return lib.suit.indexOf(b) - lib.suit.indexOf(a); + }); + player.markSkill("twshelie_count"); + player.syncStorage("twshelie_count"); + } + return event.name != "useCard" && list.length >= player.hp; + }, + forced: true, + locked: false, + content() { + "step 0"; + player.addTempSkill("twshelie_round", "roundStart"); + player.chooseControl("摸牌阶段", "出牌阶段").set("prompt", "涉猎:请选择要执行的额外阶段"); + "step 1"; + if (result.index == 0) { + var next = player.phaseDraw(); + event.next.remove(next); + trigger.getParent().next.push(next); + } + if (result.index == 1) { + var next = player.phaseUse(); + event.next.remove(next); + trigger.getParent().next.push(next); + } + }, + }, + }, + }, + twgongxin: { + audio: "gongxin", + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("h"); + }); + }, + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; + }, + usable: 1, + content() { + "step 0"; + event.num = target.getCards("h").reduce(function (arr, card) { + return arr.add(get.suit(card, player)), arr; + }, []).length; + "step 1"; + var cards = target.getCards("h"); + player + .chooseButton(2, ["攻心", cards, [["弃置此牌", "置于牌堆顶"], "tdnodes"]]) + .set("filterButton", function (button) { + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) return false; + return true; + }) + .set("ai", function (button) { + var target = _status.event.target; + var type = typeof button.link; + if (type == "object") return get.value(button.link, target); + }); + "step 2"; + if (result.bool) { + if (typeof result.links[0] != "string") result.links.reverse(); + var card = result.links[1], + choice = result.links[0]; + if (choice == "弃置此牌") target.discard(card); + else { + player.showCards(card, get.translation(player) + "对" + get.translation(target) + "发动了【攻心】"); + target.lose(card, ui.cardPile, "visible", "insert"); + game.log(card, "被置于了牌堆顶"); + } + } + "step 3"; + if ( + event.num == + target.getCards("h").reduce(function (arr, card) { + return arr.add(get.suit(card, player)), arr; + }, []).length + ) + event.finish(); + "step 4"; + var num1 = 0; + for (var card of target.getCards("h")) { + if (get.color(card) == "red") num1++; + } + var num2 = target.countCards("h") - num1; + player + .chooseControl(["红色", "黑色", "cancel2"]) + .set("prompt", "是否令" + get.translation(target) + "本回合无法使用一种颜色的牌?") + .set("ai", function () { + return num1 >= num2 ? "红色" : "黑色"; + }); + "step 5"; + if (result.control != "cancel2") { + player.line(target); + target.addTempSkill("twgongxin2"); + target.markAuto("twgongxin2", [result.control == "红色" ? "red" : "black"]); + game.log(target, "本回合无法使用" + result.control + "牌"); + if (!event.isMine() && !event.isOnline()) game.delayx(); + } + }, + ai: { + order: 10, + expose: 0.25, + result: { + target(player, target) { + return -target.countCards("h"); + }, + }, + }, + }, + twgongxin2: { + mod: { + cardEnabled2(card, player) { + const color = get.color(card); + if (color != "unsure" && player.getStorage("twgongxin2").includes(color)) return false; + }, + }, + charlotte: true, + onremove: true, + intro: { content: "本回合内不能使用或打出$牌" }, + }, + //神张角 + yizhao: { + audio: 2, + trigger: { + player: ["useCard", "respond"], + }, + forced: true, + filter(event, player) { + return typeof get.number(event.card) == "number"; + }, + marktext: "黄", + intro: { + name: "黄(异兆/肆军)", + name2: "黄", + content: "mark", + markcount(storage, player) { + return (storage || 0).toString().slice(-2); + }, + }, + content() { + "step 0"; + event.num = player.countMark("yizhao"); + player.addMark("yizhao", get.number(trigger.card)); + "step 1"; + var num = Math.floor(num / 10) % 10, + num2 = Math.floor(player.countMark("yizhao") / 10) % 10; + if (num != num2) { + var card = get.cardPile2(card => { + return get.number(card, false) == num2; + }); + if (card) player.gain(card, "gain2"); + } + }, + mod: { + aiOrder(player, card, num) { + if (Math.floor((get.number(card) + (player.countMark("yizhao") % 10)) / 10) == 1) return num + 10; + }, + }, + ai: { + threaten: 1.5, + effect: { + target(card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 0.1]; + }, + }, + }, + }, + sijun: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return player.countMark("yizhao") > ui.cardPile.childNodes.length; + }, + check(event, player) { + return ui.cardPile.childNodes.length; + }, + content() { + "step 0"; + player.removeMark("yizhao", player.countMark("yizhao")); + game.washCard(); + "step 1"; + var pile = Array.from(ui.cardPile.childNodes); + if (pile.length < 3) return; + var bool = false, + max = Math.pow(2, Math.min(100, pile.length)), + index; + for (var i = 0; i < max; i++) { + var num = 0; + index = i.toString(2); + while (index.length < pile.length) { + index = "0" + index; + } + for (var k = 0; k < index.length; k++) { + if (index[k] == "1") num += get.number(pile[k]); + if (num > 36) break; + } + if (num == 36) { + bool = true; + break; + } + } + if (bool) { + var cards = []; + for (var k = 0; k < index.length; k++) { + if (index[k] == "1") cards.push(pile[k]); + } + player.gain(cards, "gain2"); + } + }, + ai: { + combo: "yizhao", + }, + }, + sanshou: { + audio: 2, + trigger: { player: "damageBegin4" }, + check(event, player) { + return get.damageEffect(player, event.source, player, event.nature) <= 0; + }, + content() { + "step 0"; + var cards = game.cardsGotoOrdering(get.cards(3)).cards; + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【三首】"); + "step 1"; + var types = []; + types.addArray(game.getGlobalHistory("useCard").map(evt => get.type2(evt.card))); + if (cards.filter(card => !types.includes(get.type2(card))).length) { + trigger.cancel(); + } + game.delayx(); + }, + ai: { + effect: { + target(card, player, target) { + if (card.name == "shandian" || card.name == "fulei") return [0, 0.1]; + if (!get.tag(card, "damage")) return; + var types = [], + bool = 0; + types.addArray(game.getGlobalHistory("useCard").map(evt => get.type2(evt.card))); + if (!types.includes(get.type2(card))) bool = 1; + if (types.length < 2) return Math.min(1, 0.4 + (types.length + bool) * 0.2); + }, + }, + }, + }, + tianjie: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + filter(event, player) { + return game.hasGlobalHistory("cardMove", evt => evt.washCard) && game.hasPlayer(current => current != player); + }, + skillAnimation: true, + animationColor: "metal", + content() { + "step 0"; + player.chooseTarget(get.prompt("tianjie"), "选择至多三名其他角色,依次对这些角色造成X点雷电伤害(X为其手牌中【闪】的数量,至少为1)", [1, 3]).set("ai", target => { + var player = _status.event.player; + return get.damageEffect(target, player, player, "thunder") * Math.sqrt(Math.max(1, target.countCards("h", "shan"))); + }); + "step 1"; + if (result.bool) { + var targets = result.targets; + targets.sortBySeat(); + player.logSkill("tianjie", targets); + for (var target of targets) { + var num = Math.max(1, target.countCards("h", "shan")); + target.damage(num, "thunder"); + } + } + }, + }, + shencai: { + audio: 2, + enable: "phaseUse", + usable: 5, + filter(event, player) { + var count = player.getStat("skill").shencai; + if (count && count > player.countMark("shencai")) return false; + return true; + }, + filterTarget: lib.filter.notMe, + onremove: true, + prompt: "选择一名其他角色进行地狱审判", + content() { + var next = target.judge(); + next.callback = lib.skill.shencai.contentx; + }, + ai: { + order: 8, + result: { target: -1 }, + }, + contentx() { + var card = event.judgeResult.card; + var player = event.getParent(2).player; + var target = event.getParent(2).target; + if (get.position(card, true) == "o") player.gain(card, "gain2"); + var list = [], + str = lib.skill.shencai.getStr(card); + for (var i in lib.skill.shencai.filterx) { + if (str.indexOf(lib.skill.shencai.filterx[i]) != -1) list.push("shencai_" + i); + } + if (list.length) { + for (var i in lib.skill.shencai.filterx) { + var num = target.countMark("shencai_" + i); + if (num > 0) { + target.removeMark("shencai_" + i, num); + target.removeSkill("shencai_" + i); + } + } + if (target.isIn()) { + for (var i of list) { + target.addSkill(i); + target.addMark(i, 1); + } + } + } else if (target.isIn()) { + player.gainPlayerCard(target, true, "hej"); + target.addMark("shencai_death", 1); + target.addSkill("shencai_death"); + } + }, + filterx: { + losehp: "体力", + weapon: "武器", + respond: "打出", + distance: "距离", + }, + getStr(node) { + var str = "", + name = node.name; + if (lib.translate[name + "_info"]) { + if (lib.card[name].type && lib.translate[lib.card[name].type]) str += "" + get.translation(lib.card[name].type) + "牌|"; + if (get.subtype(name)) { + str += "" + get.translation(get.subtype(name)) + "|"; + } + if (lib.card[name] && lib.card[name].addinfomenu) { + str += "" + lib.card[name].addinfomenu + "|"; + } + if (get.subtype(name) == "equip1") { + var added = false; + if (lib.card[node.name] && lib.card[node.name].distance) { + var dist = lib.card[node.name].distance; + if (dist.attackFrom) { + added = true; + str += "攻击范围:" + (-dist.attackFrom + 1) + "|"; + } + } + if (!added) { + str += "攻击范围:1|"; + } + } + } + if (lib.card[name].cardPrompt) { + str += "" + lib.card[name].cardPrompt(node) + "|"; + } else if (lib.translate[name + "_info"]) { + str += "" + lib.translate[name + "_info"] + "|"; + } + if (lib.translate[name + "_append"]) { + str += "" + lib.translate[name + "_append"] + "|"; + } + if (get.is.yingbianConditional(node)) { + const yingbianEffects = get.yingbianEffects(node); + if (!yingbianEffects.length) { + const defaultYingbianEffect = get.defaultYingbianEffect(node); + if (lib.yingbian.prompt.has(defaultYingbianEffect)) yingbianEffects.push(defaultYingbianEffect); + } + if (yingbianEffects.length) str += `应变:${yingbianEffects.map(value => lib.yingbian.prompt.get(value)).join(";")}|`; + } + return str; + }, + subSkill: { + losehp: { + charlotte: true, + marktext: "笞", + trigger: { player: "damageEnd" }, + forced: true, + content() { + player.loseHp(trigger.num); + }, + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage") && current < 0) return 1.6; + }, + }, + }, + intro: { + name: "神裁 - 体力", + name2: "笞", + content: "锁定技。当你受到伤害后,你失去等量的体力。", + onunmark: true, + }, + }, + weapon: { + charlotte: true, + marktext: "杖", + trigger: { target: "useCardToTargeted" }, + forced: true, + filter(event, player) { + return event.card.name == "sha"; + }, + content() { + trigger.directHit.add(player); + game.log(player, "不可响应", trigger.card); + }, + intro: { + name: "神裁 - 武器", + name2: "杖", + content: "锁定技。当你成为【杀】的目标后,你不能使用牌响应此【杀】。", + onunmark: true, + }, + global: "shencai_weapon_ai", + }, + ai: { + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (!arg || !arg.card || arg.card.name != "sha") return false; + if (!arg.target || !arg.target.hasSkill("shencai_weapon")) return false; + return true; + }, + }, + }, + respond: { + charlotte: true, + marktext: "徒", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter(event, player) { + if ( + !player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "shencai_respond"); + }, "h") + ) + return false; + var evt = event.getParent("shencai_respond"); + if (evt && evt.player == player) return false; + evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; + }, + content() { + var cards = player.getCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "shencai_respond"); + }); + if (cards.length > 0) player.discard(cards.randomGet()); + }, + intro: { + name: "神裁 - 打出", + name2: "徒", + content: "锁定技。当你失去手牌后,你随机弃置一张手牌(不嵌套触发)。", + onunmark: true, + }, + }, + distance: { + charlotte: true, + marktext: "流", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content() { + player.turnOver(); + }, + intro: { + name: "神裁 - 距离", + name2: "流", + content: "锁定技。结束阶段开始时,你翻面。", + onunmark: true, + }, + }, + death: { + charlotte: true, + marktext: "死", + mod: { + maxHandcard(player, num) { + return num - player.countMark("shencai_death"); + }, + }, + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.countMark("shencai_death") > game.countPlayer(); + }, + content() { + player.die(); + }, + intro: { + name: "神裁 - 死", + name2: "死", + content: "锁定技。你的角色手牌上限-#;回合结束时,若场上存活人数小于#,则你死亡。", + onunmark: true, + }, + }, + }, + intro: { + content: "发动次数上限+#", + }, + }, + xunshi: { + audio: 2, + mod: { + cardname(card) { + if (lib.skill.xunshi.isXunshi(card)) return "sha"; + }, + cardnature(card) { + if (lib.skill.xunshi.isXunshi(card)) return false; + }, + suit(card) { + if (lib.skill.xunshi.isXunshi(card)) return "none"; + }, + targetInRange(card) { + const suit = get.color(card); + if (suit == "none" || suit == "unsure") return true; + }, + cardUsable(card) { + const suit = get.color(card); + if (suit == "none" || suit == "unsure") return Infinity; + }, + }, + isXunshi(card) { + var info = lib.card[card.name]; + if (!info || (info.type != "trick" && info.type != "delay")) return false; + if (info.notarget) return false; + if (info.selectTarget != undefined) { + if (Array.isArray(info.selectTarget)) { + if (info.selectTarget[0] < 0) return !info.toself; + return info.selectTarget[0] != 1 || info.selectTarget[1] != 1; + } else { + if (info.selectTarget < 0) return !info.toself; + return info.selectTarget != 1; + } + } + return false; + }, + trigger: { player: "useCard2" }, + forced: true, + filter(event, player) { + return get.color(event.card) == "none"; + }, + content() { + "step 0"; + if (player.countMark("shencai") < 4 && player.hasSkill("shencai", null, null, false)) player.addMark("shencai", 1, false); + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; + } + var info = get.info(trigger.card); + if (info.allowMultiple == false) event.finish(); + else if (trigger.targets && !info.multitarget) { + if ( + !game.hasPlayer(function (current) { + return !trigger.targets.includes(current) && lib.filter.targetEnabled2(trigger.card, player, current); + }) + ) + event.finish(); + } else event.finish(); + "step 1"; + var prompt2 = "为" + get.translation(trigger.card) + "增加任意个目标"; + player + .chooseTarget( + get.prompt("xunshi"), + function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }, + [1, Infinity] + ) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + "step 2"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 3"; + if (event.targets) { + player.line(event.targets, "fire"); + trigger.targets.addArray(event.targets); + } + }, + }, + twwushen: { + mod: { + cardname(card, player, name) { + if (get.suit(card) == "heart") return "sha"; + }, + cardnature(card, player) { + if (get.suit(card) == "heart") return false; + }, + targetInRange(card) { + if (card.name === "sha") { + const suit = get.suit(card); + if (suit === "heart" || suit === "unsure") return true; + } + }, + cardUsable(card) { + if (card.name === "sha") { + const suit = get.suit(card); + if (suit === "heart" || suit === "unsure") return Infinity; + } + }, + }, + audio: "wushen", + trigger: { player: "useCard2" }, + forced: true, + filter(event, player) { + return event.card.name == "sha" && (get.suit(event.card) == "heart" || !player.hasSkill("twwushen_phase", null, null, false)); + }, + logTarget(event, player) { + if (get.suit(event.card) == "heart") { + var targets = game.filterPlayer(function (current) { + return !event.targets.includes(current) && current.hasMark("twwuhun") && lib.filter.targetEnabled(event.card, player, current); + }); + if (targets.length) { + return targets.sortBySeat(); + } + } + return null; + }, + content() { + if (!player.hasSkill("twwushen_phase", null, null, false)) { + trigger.directHit.addArray(game.players); + player.addTempSkill("twwushen_phase", ["phaseZhunbeiAfter", "phaseJudgeAfter", "phaseDrawAfter", "phaseUseAfter", "phaseDiscardAfter", "phaseJieshuAfter"]); + } + if (get.suit(trigger.card) == "heart") { + if (trigger.addCount !== false) { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + } + var targets = game.filterPlayer(function (current) { + return !trigger.targets.includes(current) && current.hasMark("twwuhun") && lib.filter.targetEnabled(trigger.card, player, current); + }); + if (targets.length) { + trigger.targets.addArray(targets.sortBySeat()); + game.log(targets, "也成为了", trigger.card, "的目标"); + } + } + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return arg.card.name == "sha" && !player.hasSkill("twwushen_phase", null, null, false); + }, + }, + subSkill: { phase: { charlotte: true } }, + shaRelated: true, + }, + twwuhun: { + audio: 2, + trigger: { player: "die" }, + forceDie: true, + skillAnimation: true, + animationColor: "soil", + locked: true, + check(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.hasMark("twwuhun") && get.attitude(player, current) < 0; + }); + }, + content() { + "step 0"; + player + .judge(function (card) { + var name = get.name(card, false); + if (name == "tao" || name == "taoyuan") return -25; + return 15; + }) + .set("forceDie", true).judge2 = function (result) { + return result.bool; + }; + "step 1"; + var num = game.countPlayer(function (current) { + return current != player && current.hasMark("twwuhun"); + }); + if (result.bool && num > 0) { + player + .chooseTarget("请选择【武魂】的目标", "选择至少一名拥有“梦魇”标记的角色。令这些角色各自失去X点体力(X为其“梦魇”标记数)", true, [1, num], function (card, player, target) { + return target != player && target.hasMark("twwuhun"); + }) + .set("forceDie", true) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + } else event.finish(); + "step 2"; + var targets = result.targets.sortBySeat(); + player.line(targets, "fire"); + event.targets = targets; + "step 3"; + var target = targets.shift(); + var num = target.countMark("twwuhun"); + if (num > 0) target.loseHp(num); + if (targets.length > 0) event.redo(); + }, + marktext: "魇", + intro: { + name: "梦魇", + content: "mark", + onunmark: true, + }, + group: "twwuhun_gain", + subSkill: { + gain: { + audio: "twwuhun", + trigger: { + player: "damageEnd", + source: "damageSource", + }, + forced: true, + filter(event, player, name) { + if (event.player == event.source) return false; + var target = lib.skill.twwuhun_gain.logTarget(event, player); + if (!target || !target.isIn()) return false; + return name == "damageEnd" || target.hasMark("twwuhun"); + }, + logTarget(event, player) { + if (player == event.player) return event.source; + return event.player; + }, + content() { + var target = lib.skill.twwuhun_gain.logTarget(trigger, player); + target.addMark("twwuhun", player == trigger.source ? 1 : trigger.num); + game.delayx(); + }, + }, + }, + ai: { + notemp: true, + maixie_defend: true, + effect: { + target: (card, player, target) => { + if (!get.tag(card, "damage") || !target.hasFriend()) return; + let die = [], + extra = [null, 0], + temp; + game.filterPlayer(i => { + if (!i.hasMark("twwuhun")) return false; + temp = get.attitude(target, i); + if (temp < 0) die.push(i); + else { + temp = Math.sqrt(temp) * i.countMark("twwuhun"); + if (!extra[0] || temp < extra[1]) extra = [i, temp]; + } + }); + if (extra[0] && !die.length) die.push(extra[0]); + if (target.hp + target.hujia > 1 && (!die.length || get.attitude(player, target) <= 0)) die.add(player); + if (die.length) + return [ + 1, + 0, + 1, + die.reduce((num, i) => { + return (num -= 2 * get.sgnAttitude(player, i)); + }, 0), + ]; + }, + }, + }, + }, + shouli: { + audio: 2, + mod: { + cardUsable(card) { + if (card.storage && card.storage.shouli) return Infinity; + }, + }, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard(player, name) { + if (player != _status.currentPhase && (name == "sha" || name == "shan")) return true; + }, + filter(event, player) { + if (event.responded || event.shouli || event.type == "wuxie") return false; + if ( + game.hasPlayer(function (current) { + return current.getCards("e", card => get.is.attackingMount(card)).length > 0; + }) && + event.filterCard( + get.autoViewAs( + { + name: "sha", + storage: { shouli: true }, + }, + "unsure" + ), + player, + event + ) + ) + return true; + if ( + game.hasPlayer(function (current) { + return current.getCards("e", card => get.is.defendingMount(card)).length > 0; + }) && + event.filterCard( + get.autoViewAs( + { + name: "shan", + storage: { shouli: true }, + }, + "unsure" + ), + player, + event + ) + ) + return true; + return false; + }, + delay: false, + locked: false, + filterTarget(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: { shouli: true }, + }, + [card] + ), + player, + event + ) + ) + ) + return true; + return equip4.some(card => { + var sha = get.autoViewAs( + { + name: "sha", + storage: { shouli: 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() { + "step 0"; + var evt = event.getParent(2); + evt.set("shouli", 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: { shouli: 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: { shouli: 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.shouli_backup.viewAs = { + name: name, + cards: [result], + storage: { shouli: true }, + }; + lib.skill.shouli_backup.prompt = "选择" + get.translation(name) + "(" + get.translation(result) + ")的目标"; + }, + result.links[0], + name + ); + evt.set("_backupevent", "shouli_backup"); + evt.backup("shouli_backup"); + evt.set("openskilldialog", "选择" + get.translation(name) + "(" + get.translation(result.links[0]) + ")的目标"); + evt.set("norestore", true); + evt.set("custom", { + add: {}, + replace: { window() {} }, + }); + } else { + delete evt.result.skill; + delete evt.result.used; + evt.result.card = get.autoViewAs( + { + name: name, + cards: [result.links[0]], + storage: { shouli: true }, + }, + result.links + ); + evt.result.cards = [result.links[0]]; + target.$give(result.links[0], player, false); + if (player != target) target.addTempSkill("fengyin"); + target.addTempSkill("shouli_thunder"); + player.addTempSkill("shouli_thunder"); + evt.redo(); + return; + } + } + evt.goto(0); + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(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(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: "shouli_init", + subSkill: { + thunder: { + charlotte: true, + trigger: { player: "damageBegin1" }, + forced: true, + mark: true, + content() { + 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: "shouli", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + logTarget: () => game.filterPlayer(), + content() { + "step 0"; + var targets = game.filterPlayer().sortBySeat(player.getNext()); + event.targets = targets; + event.num = 0; + "step 1"; + var target = event.targets[num]; + if (target.isIn()) { + var card = get.cardPile2(function (card) { + if (get.cardtag(card, "gifts")) return false; + var type = get.subtype(card); + if (type != "equip3" && type != "equip4" && type != "equip6") return false; + return target.canUse(card, target); + }); + if (card) target.chooseUseTarget(card, "nopopup", "noanimate", true); + } + event.num++; + if (event.num < targets.length) event.redo(); + }, + }, + }, + }, + shouli_backup: { + sourceSkill: "shouli", + precontent() { + "step 0"; + delete event.result.skill; + var cards = event.result.card.cards; + event.result.cards = cards; + var owner = get.owner(cards[0]); + event.target = owner; + owner.$give(cards[0], player, false); + player.popup(event.result.card.name, "metal"); + game.delayx(); + event.getParent().addCount = false; + "step 1"; + if (player != target) target.addTempSkill("fengyin"); + target.addTempSkill("shouli_thunder"); + player.addTempSkill("shouli_thunder"); + }, + filterCard() { + return false; + }, + prompt: "请选择【杀】的目标", + selectCard: -1, + }, + hengwu: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + frequent: true, + filter(event, player) { + var suit = get.suit(event.card); + if ( + !lib.suit.includes(suit) || + player.hasCard(function (card) { + return get.suit(card, player) == suit; + }, "h") + ) + return false; + return game.hasPlayer(function (current) { + return current.hasCard(function (card) { + return get.suit(card, current) == suit; + }, "e"); + }); + }, + content() { + var suit = get.suit(trigger.card); + player.draw( + game.countPlayer(function (current) { + return current.countCards("e", function (card) { + return get.suit(card, current) == suit; + }); + }) + ); + }, + ai: { + 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, + 0.8 * + 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]; + }, + }, + }, + }, + changandajian_equip5: { + equipSkill: true, + mod: { maxHandcard: (player, num) => num + 2 }, + }, + changandajian_destroy: { + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + charlotte: true, + equipSkill: true, + filter(event, player) { + var evt = event.getl(player); + if (!evt || !evt.es || !evt.es.length) return false; + for (var i of evt.es) { + if (i.name.indexOf("changandajian_equip") == 0) return true; + } + return false; + }, + getEffect(player, target) { + if (player == target) return 0; + var getRaw = function () { + var att = get.attitude(player, target); + if (att > 0) { + if ( + target.countCards("j", function (card) { + var cardj = card.viewAs ? { name: card.viewAs } : card; + return get.effect(target, cardj, target, player) < 0; + }) > 0 + ) + return 3; + if (target.getEquip("baiyin") && target.isDamaged() && get.recoverEffect(target, player, player) > 0) { + if (target.hp == 1 && !target.hujia) return 1.6; + } + if ( + target.countCards("e", function (card) { + if (get.position(card) == "e") return get.value(card, target) < 0; + }) > 0 + ) + return 1; + } + var es = target.getCards("e"); + var noe = es.length == 0 || target.hasSkillTag("noe"); + var noe2 = + es.filter(function (esx) { + return get.value(esx, target) > 0; + }).length == 0; + if (noe || noe2) return 0; + if (att <= 0 && !target.countCards("e")) return 1.5; + return -1.5; + }; + return getRaw() * get.attitude(player, target); + }, + content() { + "step 0"; + var num = 0, + recover = 0; + var evt = trigger.getl(player); + for (var i of evt.es) { + if (i.name.indexOf("changandajian_equip") == 0) num++; + if (i.name == "changandajian_equip2") recover++; + } + if (recover > 0) player.recover(recover); + event.count = num; + if ( + !game.hasPlayer(function (current) { + return current.countCards("ej") > 0; + }) + ) + event.finish(); + "step 1"; + event.count--; + player + .chooseTarget(true, "选择一名装备区或判定区有牌的角色", function (card, player, target) { + return target.countCards("ej") > 0; + }) + .set("ai", function (target) { + return lib.skill.changandajian_destroy.getEffect(_status.event.player, target); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + player.choosePlayerCard(target, true, "ej"); + } else event.finish(); + "step 3"; + if (result.bool) { + var card = result.cards[0]; + var num = get.number(card); + if ([1, 11, 12, 13].includes(num)) { + if (lib.filter.canBeGained(card, player, target)) player.gain(card, target, "give", "bySelf"); + } else if (lib.filter.canBeDiscarded(card, player, target)) target.discard(card); + } else event.finish(); + "step 4"; + if ( + event.count > 0 && + game.hasPlayer(function (current) { + return current.countCards("ej") > 0; + }) + ) + event.goto(1); + }, + }, + dili: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + if (player.storage.dili) return false; + if (event.name != "phase") return true; + if (game.phaseNumber == 0) return true; + //让神山识能够获得东吴命运线 + return player.name == "key_shiki"; + }, + content() { + player.storage.dili = true; + var skill = ["dili_shengzhi", "dili_chigang", "dili_qionglan", "dili_quandao", "dili_jiaohui", "dili_yuanlv"].randomGet(); + player.addSkill(skill); + game.log(player, '解锁了东吴命运线:', "#g【" + get.translation(skill) + "】"); + }, + derivation: ["dili_shengzhi", "dili_chigang", "dili_qionglan", "dili_quandao", "dili_jiaohui", "dili_yuanlv", "gzyinghun", "hongde", "rebingyi", "xinfu_guanwei", "bizheng", "xinanguo", "shelie", "wengua", "rebotu", "rezhiheng", "jiexun", "reanxu", "xiashu", "rejieyin", "oldimeng", "xinfu_guanchao", "drlt_jueyan", "lanjiang"], + subSkill: { + shengzhi: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + var num = get.number(event.card); + if (typeof num != "number") return false; + if (num <= 1) return false; + for (var i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) return false; + } + if (!player.storage.yuheng) return false; + var list = ["gzyinghun", "hongde", "rebingyi"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return false; + } + return true; + }, + content() { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player; + }) + ); + }, + init(player, skill) { + player.markAuto("yuheng_current", ["gzyinghun", "hongde", "rebingyi"]); + }, + mark: true, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (arg && arg.card) { + var num = get.number(arg.card); + if (typeof num != "number") return false; + if (num <= 1) return false; + for (var i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) return false; + } + return true; + } + return false; + }, + }, + intro: { + name: "命运线:圣质", + content(storage, player) { + var finished = [], + unfinished = ["gzyinghun", "hongde", "rebingyi"]; + if (player.storage.yuheng) { + for (var i = 0; i < unfinished.length; i++) { + if (player.storage.yuheng.includes(unfinished[i])) { + finished.push(unfinished[i]); + unfinished.splice(i--, 1); + } + } + } + var str = ""; + if (unfinished.length) str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += "
  • 锁定技。若你因〖驭衡〗获得过〖英魂〗〖弘德〗〖秉壹〗,则当你使用点数为质数的牌时,此牌不可被响应。"; + return str; + }, + }, + }, + chigang: { + audio: 2, + trigger: { player: "phaseJudgeBefore" }, + forced: true, + filter(event, player) { + if (!player.storage.yuheng) return false; + var list = ["xinfu_guanwei", "bizheng", "xinanguo"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return false; + } + return true; + }, + content() { + trigger.cancel(); + var next = player.phaseDraw(); + event.next.remove(next); + trigger.getParent().next.push(next); + }, + init(player, skill) { + player.markAuto("yuheng_current", ["xinfu_guanwei", "bizheng", "xinanguo"]); + }, + ai: { + effect: { + target(card) { + if (get.type(card) == "delay") return "zerotarget"; + }, + }, + }, + mark: true, + intro: { + name: "命运线:持纲", + content(storage, player) { + var finished = [], + unfinished = ["xinfu_guanwei", "bizheng", "xinanguo"]; + if (player.storage.yuheng) { + for (var i = 0; i < unfinished.length; i++) { + if (player.storage.yuheng.includes(unfinished[i])) { + finished.push(unfinished[i]); + unfinished.splice(i--, 1); + } + } + } + var str = ""; + if (unfinished.length) str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += "
  • 锁定技。若你因〖驭衡〗获得过〖观微〗〖弼政〗〖安国〗,则当你的判定阶段开始前,你跳过此阶段并获得一个额外的摸牌阶段。"; + return str; + }, + }, + }, + qionglan: { + audio: 2, + init(player, skill) { + player.markAuto("yuheng_current", ["shelie", "wengua", "rebotu"]); + }, + trigger: { player: "useSkillAfter" }, + forced: true, + limited: true, + filter(event, player) { + if (!player.storage.yuheng || event.skill != "yuheng") return false; + var list = ["shelie", "wengua", "rebotu"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return false; + } + return true; + }, + content() { + player.awakenSkill("dili_qionglan"); + var list = ["dili_shengzhi", "dili_chigang", "dili_quandao", "dili_jiaohui", "dili_yuanlv"]; + var list2 = list.randomRemove(2); + if (list2.includes("dili_quandao") && list2.includes("dili_jiaohui")) { + list2.randomRemove(1); + list2.push(list.randomGet()); + } + for (var skill of list2) { + player.addSkill(skill); + game.log(player, '解锁了东吴命运线:', "#g【" + get.translation(skill) + "】"); + } + }, + mark: true, + intro: { + name: "命运线:穹览", + content(storage, player) { + var finished = [], + unfinished = ["shelie", "wengua", "rebotu"]; + if (player.storage.yuheng) { + for (var i = 0; i < unfinished.length; i++) { + if (player.storage.yuheng.includes(unfinished[i])) { + finished.push(unfinished[i]); + unfinished.splice(i--, 1); + } + } + } + var str = ""; + if (unfinished.length) str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += '
  • 锁定技,限定技。若你因〖驭衡〗获得过〖涉猎〗〖问卦〗〖博图〗,则当你发动的〖驭衡〗结算结束后,你随机获得两条其他东吴命运线。'; + return str; + }, + }, + }, + quandao: { + audio: 2, + mod: { + cardname(card, player) { + if (player.storage.yuheng && [1, 11, 12, 13].includes(card.number)) { + var list = ["rezhiheng", "jiexun", "reanxu"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return; + } + return "tiaojiyanmei"; + } + }, + }, + init(player, skill) { + player.markAuto("yuheng_current", ["rezhiheng", "jiexun", "reanxu"]); + }, + mark: true, + intro: { + name: "命运线:权道", + content(storage, player) { + var finished = [], + unfinished = ["rezhiheng", "jiexun", "reanxu"]; + if (player.storage.yuheng) { + for (var i = 0; i < unfinished.length; i++) { + if (player.storage.yuheng.includes(unfinished[i])) { + finished.push(unfinished[i]); + unfinished.splice(i--, 1); + } + } + } + var str = ""; + if (unfinished.length) str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += "
  • 锁定技。若你因〖驭衡〗获得过〖制衡〗〖诫训〗〖安恤〗,则你手牌区内点数为字母的牌的牌名视为【调剂盐梅】。"; + return str; + }, + }, + }, + jiaohui: { + audio: 2, + mod: { + cardname(card, player) { + if (player.countCards("h") == 1 && player.storage.yuheng) { + var list = ["xiashu", "rejieyin", "oldimeng"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return; + } + return "yuanjiao"; + } + }, + }, + init(player, skill) { + player.markAuto("yuheng_current", ["xiashu", "rejieyin", "oldimeng"]); + }, + mark: true, + intro: { + name: "命运线:交辉", + content(storage, player) { + var finished = [], + unfinished = ["xiashu", "rejieyin", "oldimeng"]; + if (player.storage.yuheng) { + for (var i = 0; i < unfinished.length; i++) { + if (player.storage.yuheng.includes(unfinished[i])) { + finished.push(unfinished[i]); + unfinished.splice(i--, 1); + } + } + } + var str = ""; + if (unfinished.length) str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += "
  • 锁定技。若你因〖驭衡〗获得过〖下书〗〖结姻〗〖缔盟〗,且你的手牌数为1,则此牌的牌名视为【远交近攻】。"; + return str; + }, + }, + }, + yuanlv: { + audio: 2, + init(player, skill) { + player.markAuto("yuheng_current", ["xinfu_guanchao", "drlt_jueyan", "lanjiang"]); + }, + trigger: { player: "useCardToTargeted" }, + forced: true, + filter(event, player) { + if (get.type(event.card, false) != "equip" || player != event.target || event.card.name.indexOf("changandajian_equip") == 0) return false; + if (!player.storage.yuheng) return false; + var list = ["xinfu_guanchao", "drlt_jueyan", "lanjiang"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return false; + } + var type = get.subtype(event.card); + if (lib.card["changandajian_" + type] && player.hasEquipableSlot(type)) return true; + return false; + }, + content() { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) game.cardsDiscard(cards); + var type = get.subtype(trigger.card); + var card = game.createCard("changandajian_" + type, Math.random() < 0.5 ? "spade" : "heart", 10); + player.useCard(card, player); + }, + mark: true, + intro: { + name: "命运线:渊虑", + content(storage, player) { + var finished = [], + unfinished = ["xinfu_guanchao", "drlt_jueyan", "lanjiang"]; + if (player.storage.yuheng) { + for (var i = 0; i < unfinished.length; i++) { + if (player.storage.yuheng.includes(unfinished[i])) { + finished.push(unfinished[i]); + unfinished.splice(i--, 1); + } + } + } + var str = ""; + if (unfinished.length) str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += "
  • 锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜江〗,则当你成为自己使用的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。"; + return str; + }, + }, + }, + }, + }, + yuheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + content() { + var skills = player.getSkills(null, false, false).filter(function (i) { + if (i == "yuheng") return false; + var info = get.info(i); + return info && !info.charlotte && !get.is.locked(i); + }); + if (skills.length) { + player.removeSkills(skills); + } + //初始化技能库 + var list1 = ["dili_shengzhi", "dili_chigang", "dili_qionglan", "dili_quandao", "dili_jiaohui", "dili_yuanlv"]; + var list2 = ["gzyinghun", "hongde", "rebingyi", "xinfu_guanwei", "bizheng", "xinanguo", "shelie", "wengua", "rebotu", "rezhiheng", "jiexun", "reanxu", "xiashu", "rejieyin", "oldimeng", "xinfu_guanchao", "drlt_jueyan", "lanjiang"]; + var list3 = []; + if (!player.storage.yuheng_full) player.storage.yuheng_full = list2.slice(0); + if (player.getStorage("yuheng_current").length == 0) { + for (var i = 0; i < list1.length; i++) { + if (player.hasSkill(list1[i])) { + for (var j = 0; j < 3; j++) { + list3.add(list2[i * 3 + j]); + } + } + } + if (!player.storage.yuheng_current) player.storage.yuheng_current = list3.slice(0); + } + var fullskills, currentskills; + //决定抽选技能范围 + if (player.storage.yuheng_full && player.storage.yuheng_full.length) fullskills = player.storage.yuheng_full; + else fullskills = list2.slice(0); + if (player.storage.yuheng_current && player.storage.yuheng_current.length) currentskills = player.storage.yuheng_current; + else currentskills = list3.slice(0); + var skills = []; + //在没有发动过其他非锁定技时抽选技能 + var evtx = event.getParent("phaseUse"); + if ( + currentskills.length > 0 && + !player.hasHistory("useSkill", function (evt) { + if (evt.skill == "yuheng" || evt.type != "player" || !evt.sourceSkill) return false; + var info1 = get.info(evt.skill); + if (info1.charlotte) return false; + var info = get.info(evt.sourceSkill); + if (info.charlotte || get.is.locked(evt.skill)) return false; + return evt.event.getParent("phaseUse") == evtx; + }) + ) { + fullskills.randomSort(); + currentskills.randomSort(); + for (var i = 0; i < fullskills.length; i++) { + for (var j = 0; j < currentskills.length; j++) { + if (fullskills[i] != currentskills[j] || (i == fullskills.length - 1 && j == currentskills.length - 1)) { + skills.add(fullskills.splice(i--, 1)[0]); + skills.add(currentskills.splice(j--, 1)[0]); + break; + } + } + if (skills.length > 0) break; + } + } + //在已经发动过其他非锁定技时抽选技能 + else { + skills.add(fullskills.randomRemove(1)[0]); + } + for (var i of skills) { + player.addSkills(i); + } + player.markAuto("yuheng", skills); + }, + ai: { + order(item, player) { + var evtx = _status.event.getParent("phaseUse"); + if ( + !player.hasHistory("useSkill", function (evt) { + if (evt.skill == "yuheng" || evt.type != "player" || !evt.sourceSkill) return false; + var info1 = get.info(evt.skill); + if (info1.charlotte) return false; + var info = get.info(evt.sourceSkill); + if (info.charlotte || get.is.locked(evt.skill)) return false; + return evt.event.getParent("phaseUse") == evtx; + }) + ) + return 11; + return 0.8; + }, + result: { player: 1 }, + }, + group: "yuheng_losehp", + subSkill: { + losehp: { + trigger: { player: "phaseUseEnd" }, + forced: true, + locked: false, + filter(event, player) { + return !player.hasHistory("useSkill", function (evt) { + if (evt.skill != "yuheng") return false; + return evt.event.getParent("phaseUse") == event; + }); + }, + content() { + player.loseHp(); + }, + }, + }, + }, + jiufa: { + audio: 2, + trigger: { player: ["useCardAfter", "respondAfter"] }, + frequent: true, + filter(event, player) { + return event.jiufa_counted && player.getStorage("jiufa").length >= 9; + }, + content() { + "step 0"; + player.unmarkSkill("jiufa"); + event.cards = get.cards(9); + event.cards.sort(function (a, b) { + return get.number(b) - get.number(a); + }); + game.cardsGotoOrdering(event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str; + if (player == game.me && !_status.auto) { + str = "九伐:选择任意张点数满足条件的牌"; + } else { + 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 next = player.chooseButton([0, 9], true); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + var num = get.number(button.link), + cards = _status.event.getParent().cards; + for (var i of ui.selected.buttons) { + if (get.number(i.link) == num) return false; + } + for (var i of cards) { + if (i != button.link && get.number(i) == num) return true; + } + return false; + }); + next.set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + "step 2"; + if (result.bool && result.links && result.links.length) { + event.cards2 = result.links; + } + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); + } + "step 3"; + game.broadcastAll("closeDialog", event.videoId); + var cards2 = event.cards2; + if (cards2 && cards2.length) player.gain(cards2, "log", "gain2"); + }, + marktext: "⑨", + intro: { + content: "已记录牌名:$", + onunmark: true, + }, + group: "jiufa_count", + subSkill: { + count: { + trigger: { player: ["useCard1", "respond"] }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter(event, player) { + return !player.getStorage("jiufa").includes(event.card.name); + }, + content() { + trigger.jiufa_counted = true; + player.markAuto("jiufa", [trigger.card.name]); + }, + }, + }, + }, + tianren: { + audio: 2, + trigger: { global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter"] }, + forced: true, + filter(event, player) { + if (event.name.indexOf("lose") == 0) { + if (event.getlx === false || event.position != ui.discardPile) return false; + } else { + var evt = event.getParent(); + if (evt.relatedEvent && evt.relatedEvent.name == "useCard") return false; + } + for (var i of event.cards) { + var owner = false; + if (event.hs && event.hs.includes(i)) owner = event.player; + var type = get.type(i, null, owner); + if (type == "basic" || type == "trick") return true; + } + return false; + }, + content() { + var num = 0; + for (var i of trigger.cards) { + var owner = false; + if (trigger.hs && trigger.hs.includes(i)) owner = trigger.player; + var type = get.type(i, null, owner); + if (type == "basic" || type == "trick") num++; + } + player.addMark("tianren", num); + }, + group: "tianren_maxHp", + intro: { content: "mark" }, + subSkill: { + maxHp: { + trigger: { player: ["tianrenAfter", "gainMaxHpAfter", "loseMaxHpAfter"] }, + forced: true, + filter(event, player) { + return player.countMark("tianren") >= player.maxHp; + }, + content() { + player.removeMark("tianren", player.maxHp); + player.gainMaxHp(); + player.draw(2); + }, + }, + }, + }, + pingxiang: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "ice", + filter(event, player) { + return player.maxHp > 9; + }, + content() { + "step 0"; + player.awakenSkill("pingxiang"); + player.loseMaxHp(9); + event.num = 0; + "step 1"; + event.num++; + player.chooseUseTarget( + { + name: "sha", + nature: "fire", + isCard: true, + }, + "请选择火【杀】的目标(" + (event.num == 9 ? "⑨" : event.num) + "/9)", + false + ); + "step 2"; + if (result.bool && event.num < 9) event.goto(1); + else player.removeSkills("jiufa"); + "step 3"; + player.addSkill("pingxiang_effect"); + }, + ai: { + order() { + return get.order({ + name: "sha", + nature: "fire", + isCard: true, + }); + }, + result: { + player(player) { + if ( + player.hasValueTarget({ + name: "sha", + nature: "fire", + isCard: true, + }) + ) + return 1; + return 0; + }, + }, + }, + subSkill: { + effect: { + marktext: "襄", + intro: { content: "手牌上限基数改为体力上限" }, + mod: { + maxHandcardBase(player) { + return player.maxHp; + }, + }, + }, + }, + }, + hina_shenshi: { + groupSkill: true, + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + frequent: true, + filter(event, player) { + return player.group == "shen"; + }, + content() { + "step 0"; + player.draw(2).gaintag = ["hina_shenshi"]; + player.addSkill("hina_shenshi_yingbian"); + "step 1"; + var cards = player.getCards("h", function (card) { + return card.hasGaintag("hina_shenshi"); + }); + if (!cards.length) event.finish(); + else if (cards.length == 1) event._result = { bool: true, cards: cards }; + else + player.chooseCard("h", true, "将一张“神视”牌置于牌堆顶", function (card) { + return card.hasGaintag("hina_shenshi"); + }); + "step 2"; + if (result.bool) { + game.log(player, "将一张牌置于了牌堆顶"); + player.lose(result.cards, ui.cardPile, "insert"); + player.$throw(1, 1000); + } else event.finish(); + "step 3"; + game.delayx(); + }, + onremove(player) { + player.removeGaintag("hina_shenshi"); + }, + group: "hina_shenshi_yingbian", + }, + hina_shenshi_yingbian: { + trigger: { player: "yingbian" }, + forced: true, + filter: (event, player) => event.card.isCard && player.hasHistory("lose", evt => evt.getParent() == event && Object.values(evt.gaintag_map).some(value => value.includes("hina_shenshi"))), + content: () => { + if (!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian = []; + trigger.temporaryYingbian.add("force"); + trigger.temporaryYingbian.addArray(get.yingbianEffects()); + }, + }, + hina_xingzhi: { + groupSkill: true, + trigger: { player: "yingbian" }, + usable: 1, + filter: (event, player) => player.group == "key" && !event.card.yingbian && lib.yingbian.condition.complex.has("zhuzhan"), + content: () => { + "step 0"; + trigger.yingbianZhuzhanAI = (player, card, source, targets) => cardx => { + if (get.attitude(player, source) <= 0) return 0; + var info = get.info(card), + num = 0; + if (info && info.ai && info.ai.yingbian) { + var ai = info.ai.yingbian(card, source, targets, player); + if (ai) num = ai; + } + return Math.max(num, 6) - get.value(cardx); + }; + trigger.afterYingbianZhuzhan = event => event.zhuzhanresult.draw(2); + lib.yingbian.condition.complex.get("zhuzhan")(trigger); + "step 1"; + if (!result.bool) return; + trigger.card.yingbian = true; + lib.yingbian.effect.forEach(value => game.yingbianEffect(trigger, value)); + player.addTempSkill("yingbian_changeTarget"); + }, + }, + yingba: { + audio: 2, + mod: { + aiOrder(player, card, num) { + if (num > 0 && _status.event && _status.event.type == "phase" && get.tag(card, "recover")) { + if (player.needsToDiscard()) return num / 3; + return 0; + } + }, + targetInRange(card, player, target) { + if (target.hasMark("yingba_mark")) return true; + }, + }, + enable: "phaseUse", + usable: 1, + filter: (event, player) => game.hasPlayer(current => current != player && current.maxHp > 1), + filterTarget: (card, player, target) => target != player && target.maxHp > 1, + content() { + "step 0"; + target.loseMaxHp(); + "step 1"; + if (target.isIn()) target.addMark("yingba_mark", 1); + player.loseMaxHp(); + }, + locked: false, + //global:'yingba_mark', + ai: { + combo: "scfuhai", + threaten: 3, + order: 11, + result: { + player(player, target) { + if (player.maxHp == 1) return -2.5; + return -0.25; + }, + target(player, target) { + if (target.isHealthy()) return -2; + if (!target.hasMark("yingba_mark")) return -1; + return -0.2; + }, + }, + }, + subSkill: { + mark: { + marktext: "定", + intro: { + name: "平定", + content: "mark", + onunmark: true, + }, + mod: { + maxHandcard(player, numx) { + var num = player.countMark("yingba_mark"); + if (num) + return ( + numx + + num * + game.countPlayer(function (current) { + return current.hasSkill("yingba"); + }) + ); + }, + }, + }, + }, + }, + scfuhai: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + forced: true, + filter(event, player) { + return event.target && event.target.hasMark("yingba_mark"); + }, + logTarget: "target", + content() { + trigger.directHit.add(trigger.target); + if ( + player.getHistory("gain", function (evt) { + return evt.getParent(2).name == "scfuhai"; + }).length < 2 + ) + player.draw(); + }, + group: ["scfuhai_die"], + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return arg && arg.target && arg.target.hasMark("yingba_mark"); + }, + combo: "yingba", + }, + subSkill: { + usea: { + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + return lib.skill.scfuhai_usea.logTarget(event, player).length > 0; + }, + logTarget(event, player) { + return event.targets.filter(function (i) { + return i.hasMark("yingba_mark"); + }); + }, + content() { + var num = 0; + for (var i of trigger.targets) { + var numx = i.countMark("yingba_mark"); + if (numx) { + num += numx; + i.removeMark("yingba_mark", numx); + } + } + if (num) player.gainMaxHp(num); + }, + }, + die: { + trigger: { global: "die" }, + forced: true, + filter(event, player) { + return event.player.countMark("yingba_mark") > 0; + }, + content() { + player.gainMaxHp(trigger.player.countMark("yingba_mark")); + player.draw(trigger.player.countMark("yingba_mark")); + }, + }, + }, + }, + pinghe: { + audio: 2, + mod: { + maxHandcardBase(player) { + return player.getDamagedHp(); + }, + }, + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "recover") && _status.event.type == "phase" && !player.needsToDiscard()) return 0.2; + }, + }, + }, + trigger: { player: "damageBegin2" }, + forced: true, + filter(event, player) { + return event.source && event.source != player && player.maxHp > 1 && player.countCards("h") > 0; + }, + content() { + "step 0"; + player.chooseCardTarget({ + prompt: "请选择【冯河】的牌和目标", + prompt2: "将一张手牌交给一名其他角色并防止伤害" + (player.hasSkill("yingba") ? ",然后令伤害来源获得一个“平定”标记" : ""), + filterCard: true, + forced: true, + filterTarget: lib.filter.notMe, + ai1(card) { + if ( + get.tag(card, "recover") && + !game.hasPlayer(function (current) { + return get.attitude(current, player) > 0 && !current.hasSkillTag("nogain"); + }) + ) + return 0; + return 1 / Math.max(0.1, get.value(card)); + }, + ai2(target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 9; + return 4 + att; + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + //player.logSkill('pinghe',target); + player.line(target, "green"); + player.give(result.cards, target); + trigger.cancel(); + player.loseMaxHp(); + if (player.hasSkill("yingba")) { + trigger.source.addMark("yingba_mark", 1); + } + } + }, + }, + tianzuo: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && !lib.inpile.includes("qizhengxiangsheng"); + }, + content() { + game.addGlobalSkill("tianzuo_global"); + var cards = []; + for (var i = 2; i < 10; i++) { + cards.push(game.createCard2("qizhengxiangsheng", i % 2 ? "club" : "spade", i)); + } + game.broadcastAll(function () { + lib.inpile.add("qizhengxiangsheng"); + }); + game.cardsGotoPile(cards, () => { + return ui.cardPile.childNodes[get.rand(0, ui.cardPile.childNodes.length - 1)]; + }); + }, + group: "tianzuo_remove", + subSkill: { + remove: { + audio: 2, + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + filter(event, player) { + return event.card && event.card.name == "qizhengxiangsheng"; + }, + content() { + trigger.cancel(); + }, + ai: { + effect: { + target(card, player, target) { + if (card && card.name == "qizhengxiangsheng") return "zeroplayertarget"; + }, + }, + }, + }, + global: { + trigger: { player: "useCardToPlayered" }, + forced: true, + popup: false, + filter(event, player) { + return event.card.name == "qizhengxiangsheng"; + }, + content() { + "step 0"; + var target = trigger.target; + event.target = target; + player + .chooseControl("奇兵", "正兵") + .set("prompt", "请选择" + get.translation(target) + "的标记") + .set( + "choice", + (function () { + var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); + var e2 = 0; + if (target.countGainableCards(player, "h") > 0 && !target.hasSkillTag("noh")) e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if (Math.abs(e1 - e2) <= 0.3) return Math.random() < 0.5 ? "奇兵" : "正兵"; + if (e1 < e2) return "奇兵"; + return "正兵"; + })() + ) + .set("ai", function () { + return _status.event.choice; + }); + "step 1"; + var map = trigger.getParent().customArgs, + id = target.playerid; + if (!map[id]) map[id] = {}; + map[id].qizheng_name = result.control; + }, + }, + rewrite: { + audio: "tianzuo", + trigger: { global: "useCardToTargeted" }, + filter(event, player) { + return event.card.name == "qizhengxiangsheng"; + }, + logTarget: "target", + prompt2: "观看其手牌并修改“奇正相生”标记", + content() { + "step 0"; + var target = trigger.target; + event.target = target; + if (player != target && target.countCards("h") > 0) player.viewHandcards(target); + player + .chooseControl("奇兵", "正兵") + .set("prompt", "请选择" + get.translation(target) + "的标记") + .set( + "choice", + (function () { + var shas = target.getCards("h", "sha"), + shans = target.getCards("h", "shan"); + var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); + var e2 = 0; + if (target.countGainableCards(player, "h") > 0 && !target.hasSkillTag("noh")) e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if (get.attitude(player, target) > 0) { + if (shas.length >= Math.max(1, shans.length)) return "奇兵"; + if (shans.length > shas.length) return "正兵"; + return e1 > e2 ? "奇兵" : "正兵"; + } + if (shas.length) e1 = -0.5; + if (shans.length) e2 = -0.7; + if (Math.abs(e1 - e2) <= 0.3) return Math.random() < 0.5 ? "奇兵" : "正兵"; + var rand = Math.random(); + if (e1 < e2) return rand < 0.1 ? "奇兵" : "正兵"; + return rand < 0.1 ? "正兵" : "奇兵"; + })() + ) + .set("ai", () => _status.event.choice); + "step 1"; + var map = trigger.getParent().customArgs, + id = target.playerid; + if (!map[id]) map[id] = {}; + map[id].qizheng_name = result.control; + map[id].qizheng_aibuff = get.attitude(player, target) > 0; + }, + }, + }, + }, + lingce: { + audio: 2, + init: player => { + game.addGlobalSkill("lingce_global"); + }, + trigger: { global: "useCard" }, + forced: true, + filter(event, player) { + if (!event.card.isCard || !event.cards || event.cards.length !== 1) return false; + return event.card.name == "qizhengxiangsheng" || get.zhinangs().includes(event.card.name) || player.getStorage("dinghan").includes(event.card.name); + }, + content() { + player.draw(); + }, + subSkill: { + global: { + ai: { + effect: { + player: (card, player, target) => { + let num = 0, + nohave = true; + game.countPlayer(i => { + if (i.hasSkill("lingce")) { + nohave = false; + if (i.isIn() && lib.skill.lingce.filter({ card: card }, i)) num += get.sgnAttitude(player, i); + } + }, true); + if (nohave) game.removeGlobalSkill("lingce_global"); + else return [1, 0.8 * num]; + }, + }, + }, + }, + }, + }, + dinghan: { + audio: 2, + trigger: { + target: "useCardToTarget", + player: "addJudgeBefore", + }, + forced: true, + locked: false, + filter(event, player) { + if (event.name == "useCardToTarget" && get.type(event.card, null, false) != "trick") return false; + return !player.getStorage("dinghan").includes(event.card.name); + }, + content() { + player.markAuto("dinghan", [trigger.card.name]); + if (trigger.name == "addJudge") { + trigger.cancel(); + var owner = get.owner(trigger.card); + if (owner && owner.getCards("hej").includes(trigger.card)) owner.lose(trigger.card, ui.discardPile); + else game.cardsDiscard(trigger.card); + game.log(trigger.card, "进入了弃牌堆"); + } else { + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + trigger.untrigger(); + } + }, + onremove: true, + intro: { content: "已记录牌名:$" }, + group: "dinghan_add", + subSkill: { + add: { + trigger: { player: "phaseBegin" }, + direct: true, + content() { + "step 0"; + var dialog = [get.prompt("dinghan")]; + (list1 = player.getStorage("dinghan")), + (list2 = lib.inpile.filter(function (i) { + return get.type2(i, false) == "trick" && !list1.includes(i); + })); + if (list1.length) { + dialog.push('
    已记录
    '); + dialog.push([list1, "vcard"]); + } + if (list2.length) { + dialog.push('
    未记录
    '); + dialog.push([list2, "vcard"]); + } + player.chooseButton(dialog).set("ai", function (button) { + var player = _status.event.player, + name = button.link[2]; + if (player.getStorage("dinghan").includes(name)) { + return -get.effect(player, { name: name }, player, player); + } else { + return get.effect(player, { name: name }, player, player) * (1 + player.countCards("hs", name)); + } + }); + "step 1"; + if (result.bool) { + player.logSkill("dinghan"); + var name = result.links[0][2]; + if (player.getStorage("dinghan").includes(name)) { + player.unmarkAuto("dinghan", [name]); + game.log(player, "从定汉记录中移除了", "#y" + get.translation(name)); + } else { + player.markAuto("dinghan", [name]); + game.log(player, "向定汉记录中添加了", "#y" + get.translation(name)); + } + game.delayx(); + } + }, + }, + }, + }, + dulie: { + audio: 2, + trigger: { target: "useCardToTarget" }, + forced: true, + logTarget: "player", + filter(event, player) { + return event.card.name == "sha" && event.player.hp > player.hp; + }, + content() { + "step 0"; + player.judge(function (result) { + if (get.suit(result) == "heart") return 2; + return -1; + }).judge2 = function (result) { + return result.bool; + }; + "step 1"; + if (result.bool) { + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + trigger.untrigger(); + } + }, + ai: { + effect: { + target(card, player, target, current, isLink) { + if (card.name == "sha" && !isLink && player.hp > target.hp) return 0.5; + }, + }, + }, + marktext: "围", + intro: { + name: "破围(围)", + name2: "围", + content: "mark", + }, + }, + tspowei: { + audio: 3, + dutySkill: true, + derivation: "shenzhu", + group: ["tspowei_init", "tspowei_move", "tspowei_achieve", "tspowei_fail", "tspowei_use", "tspowei_remove"], + subSkill: { + remove: { + audio: "tspowei3", + trigger: { global: "damageEnd" }, + filter(event, player) { + return event.player && event.player.isIn() && event.player.hasMark("dulie"); + }, + forced: true, + logTarget: "player", + content() { + trigger.player.removeMark("dulie", trigger.player.countMark("dulie")); + }, + }, + use: { + audio: "tspowei3", + trigger: { global: "phaseBegin" }, + direct: true, + filter(event, player) { + return event.player != player && event.player.hasMark("dulie") && (player.countCards("h") > 0 || (player.hp >= event.player.hp && event.player.countCards("h") > 0)); + }, + content() { + "step 0"; + var list = [], + target = trigger.player, + choiceList = ["弃置一张牌并对其造成1点伤害", "获得其一张手牌"]; + event.target = target; + if ( + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "tspowei_use"); + }, "h") + ) + list.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (player.hp >= target.hp && target.countCards("h") > 0) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + player + .chooseControl(list, "cancel2") + .set("prompt", get.prompt("tspowei", target)) + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event.getParent(); + if ( + evt.player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, evt.player, "tspowei_use") && get.value(card, evt.player) < 7; + }, "h") && + get.damageEffect(evt.target, evt.player, evt.player) > 0 + ) + return "选项一"; + if (evt.player.hp >= evt.target.hp && evt.target.countCards("h") > 0 && get.attitude(evt.player, evt.target) <= 0 && !evt.target.hasSkillTag("noh")) return "选项二"; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + if (result.control == "选项二") { + player.logSkill("tspowei_use", target); + player.gainPlayerCard(target, "h", true); + event.goto(3); + } + } else event.finish(); + "step 2"; + player.chooseToDiscard("h", true).logSkill = ["tspowei_use", target]; + if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); + target.damage(); + "step 3"; + player.addTempSkill("tspowei_inRange"); + }, + ai: { expose: 0.2 }, + }, + inRange: { + charlotte: true, + mod: { + inRangeOf(from, to) { + if (from == _status.currentPhase) return true; + }, + }, + }, + init: { + audio: "tspowei3", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + logTarget(event, player) { + return game.filterPlayer(current => current != player && !current.hasMark("dulie")); + }, + content() { + var list = game.filterPlayer(current => current != player && !current.hasMark("dulie")).sortBySeat(); + for (var i of list) i.addMark("dulie", 1, false); + }, + }, + move: { + audio: "tspowei3", + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return game.hasPlayer(current => current != player && current.hasMark("dulie")); + }, + content() { + var list = game.filterPlayer(current => current != player && current.hasMark("dulie")).sortBySeat(); + var map = {}; + for (var i of list) { + var num = i.countMark("dulie"); + i.removeMark("dulie", num); + map[i.playerid] = num; + } + for (var i of list) { + var next = i.next; + if (next == player) next = next.next; + next.addMark("dulie", map[i.playerid]); + } + }, + }, + achieve: { + audio: "tspowei1", + trigger: { player: "phaseBegin" }, + forced: true, + skillAnimation: true, + animationColor: "metal", + filter(event, player) { + return !game.hasPlayer(function (current) { + return current.hasMark("dulie"); + }); + }, + content() { + game.log(player, "成功完成使命"); + player.awakenSkill("tspowei"); + player.addSkills("shenzhu"); + }, + }, + fail: { + audio: "tspowei2", + trigger: { player: "dying" }, + forced: true, + content() { + "step 0"; + game.log(player, "使命失败"); + player.awakenSkill("tspowei"); + if (player.hp < 1) player.recover(1 - player.hp); + "step 1"; + var num = player.countCards("e"); + if (num > 0) player.chooseToDiscard("e", true, num); + }, + }, + }, + }, + tspowei1: { audio: true }, + tspowei2: { audio: true }, + tspowei3: { audio: true }, + shenzhu: { + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + return event.card.name == "sha" && event.card.isCard && event.cards.length == 1; + }, + content() { + "step 0"; + player + .chooseControl() + .set("choiceList", ["摸一张牌,且本回合使用【杀】的次数上限+1", "摸三张牌,且本回合不能再使用【杀】"]) + .set("ai", () => (_status.event.player.hasSha() ? 0 : 1)); + "step 1"; + if (result.index == 0) { + player.draw(); + player.addTempSkill("shenzhu_more"); + player.addMark("shenzhu_more", 1, false); + } else { + player.draw(3); + player.addTempSkill("shenzhu_less"); + } + }, + subSkill: { + more: { + charlotte: true, + onremove: true, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("shenzhu_more"); + }, + }, + }, + less: { + charlotte: true, + mod: { + cardEnabled(card) { + if (card.name == "sha") return false; + }, + }, + }, + }, + }, + dangmo: { + audio: 2, + trigger: { player: "useCard2" }, + direct: true, + filter(event, player) { + if (event.card.name != "sha" || player.hp <= 1) return false; + var evt = event.getParent("phaseUse"); + return ( + evt && + evt.player == player && + player.getHistory("useCard", function (evtx) { + return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; + })[0] == event && + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.filterTarget(event.card, player, current); + }) + ); + }, + content() { + "step 0"; + var num = Math.min( + player.hp - 1, + game.countPlayer(function (current) { + return !trigger.targets.includes(current) && lib.filter.filterTarget(trigger.card, player, current); + }) + ); + player + .chooseTarget(get.prompt("dangmo"), "为" + get.translation(trigger.card) + "增加至多" + get.translation(num) + "个目标", [1, num], function (card, player, target) { + var evt = _status.event.getTrigger(); + return !evt.targets.includes(target) && lib.filter.filterTarget(evt.card, player, target); + }) + .set("ai", function (target) { + var evt = _status.event.getTrigger(), + eff = get.effect(target, evt.card, evt.player, evt.player); + if (player.hasSkill("tspowei") && target.hasMark("dulie")) return 4 * eff; + return eff; + }); + "step 1"; + if (result.bool) { + if (player != game.me && !player.isOnline()) game.delayx(); + event.targets = result.targets; + } else event.finish(); + "step 2"; + player.logSkill("dangmo", targets); + trigger.targets.addArray(targets); + }, + }, + reshuishi: { + audio: "shuishi", + enable: "phaseUse", + usable: 1, + frequent: true, + filter(event, player) { + return player.maxHp < 10; + }, + content() { + "step 0"; + event.cards = []; + event.suits = []; + "step 1"; + player + .judge(function (result) { + var evt = _status.event.getParent("reshuishi"); + if (evt && evt.suits && evt.suits.includes(get.suit(result))) return 0; + return 1; + }) + .set("callback", lib.skill.reshuishi.callback).judge2 = function (result) { + return result.bool ? true : false; + }; + "step 2"; + var cards = cards.filterInD(); + if (cards.length) + player + .chooseTarget("将" + get.translation(cards) + "交给一名角色", true) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return att; + if (target.countCards("h") + _status.event.num >= _status.event.max) att /= 3; + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }) + .set("num", cards.length) + .set( + "max", + game.filterPlayer().reduce((num, i) => { + return Math.max(num, i.countCards("h")); + }, 0) + ); + else event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.gain(cards, "gain2").giver = player; + } else event.finish(); + "step 4"; + if (target.isMaxHandcard()) player.loseMaxHp(); + }, + callback() { + "step 0"; + var evt = event.getParent(2); + event.getParent().orderingCards.remove(event.judgeResult.card); + evt.cards.push(event.judgeResult.card); + if (event.getParent().result.bool && player.maxHp < 10) { + evt.suits.push(event.getParent().result.suit); + player.gainMaxHp(); + player.chooseBool("是否继续发动【慧识】?").set("frequentSkill", "reshuishi"); + } else event._result = { bool: false }; + "step 1"; + if (result.bool) event.getParent(2).redo(); + }, + ai: { + order: 9, + result: { + player: 1, + }, + }, + }, + shuishi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.maxHp < 10; + }, + filterTarget: true, + content() { + "step 0"; + target.draw(); + "step 1"; + if (!result || !Array.isArray(result) || result.length != 1 || get.itemtype(result[0]) != "card") { + event.finish(); + return; + } + var suit = get.suit(result[0]), + hs = target.getCards("h"); + for (var i of hs) { + if (i != result[0] && get.suit(i, target) == suit) { + player.loseMaxHp(); + target.showHandcards(); + event.finish(); + return; + } + } + player.gainMaxHp(); + "step 2"; + if (player.maxHp < 10) { + player.chooseBool("是否继续发动【慧识】?"); + } else event.finish(); + "step 3"; + if (result.bool) event.goto(0); + }, + ai: { + order: 0.5, + result: { + target: 0.2, + player(player, target) { + var list = [], + hs = target.getCards("h"); + for (var i of hs) list.add(get.suit(i, target)); + if (list.length == 0) return 0; + if (list.length == 1) return player.maxHp > 2 ? 0 : -2; + if (list.length == 2) return player.maxHp > 3 ? 0 : -2; + return -2; + }, + }, + }, + }, + stianyi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter(event, player) { + return !game.hasPlayer(function (current) { + return current.getAllHistory("damage").length == 0; + }); + }, + content() { + "step 0"; + player.awakenSkill("stianyi"); + player.gainMaxHp(2); + player.recover(); + "step 1"; + player.chooseTarget(true, "令一名角色获得技能〖佐幸〗").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.storage.zuoxing = player; + target.addSkills("zuoxing"); + } + }, + derivation: "zuoxing", + }, + zuoxing: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + var target = player.storage.zuoxing; + if (!target || !target.isIn() || target.maxHp < 2) return false; + for (var i of lib.inpile) { + if (get.type(i) == "trick" && event.filterCard({ name: i, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog(event, player) { + var list = []; + for (var i of lib.inpile) { + if (get.type(i) == "trick" && event.filterCard({ name: i, isCard: true }, player, event)) list.push(["锦囊", "", i]); + } + return ui.create.dialog("佐幸", [list, "vcard"]); + }, + check(button) { + return _status.event.player.getUseValue({ name: button.link[2], isCard: true }); + }, + backup(links, player) { + return { + viewAs: { + name: links[0][2], + isCard: true, + }, + filterCard: () => false, + selectCard: -1, + popname: true, + precontent() { + player.logSkill("zuoxing"); + var target = player.storage.zuoxing; + target.loseMaxHp(); + //delete event.result.skill; + }, + }; + }, + prompt(links, player) { + return "请选择" + get.translation(links[0][2]) + "的目标"; + }, + }, + ai: { order: 1, result: { player: 1 } }, + }, + resghuishi: { + audio: "sghuishi", + inherit: "sghuishi", + filterTarget: true, + prompt() { + var player = _status.event.player; + if (player.maxHp >= game.players.length) return "选择一名角色。若其拥有未发动过的觉醒技,则你解除其中一个觉醒技的发动限制;否则其摸四张牌。然后你减2点体力上限。"; + return "令一名角色摸四张牌,然后你减2点体力上限。"; + }, + content() { + "step 0"; + player.awakenSkill("resghuishi"); + var list = target.getSkills(null, false, false).filter(function (skill) { + var info = lib.skill[skill]; + return info && info.juexingji && !target.awakenedSkills.includes(skill); + }); + if (player.maxHp >= game.players.length && list.length > 0) { + if (list.length == 1) event._result = { control: list[0] }; + else player.chooseControl(list).set("prompt", "选择一个觉醒技,令" + get.translation(target) + "可无视条件发动该技能"); + } else { + target.draw(4); + event.goto(2); + } + "step 1"; + target.storage.resghuishi_mark = result.control; + target.markSkill("resghuishi_mark"); + var info = lib.skill[result.control]; + if (info.filter && !info.charlotte && !info.resghuishi_filter) { + info.resghuishi_filter = info.filter; + info.filter = function (event, player) { + if (player.storage.resghuishi_mark) return true; + return this.resghuishi_filter.apply(this, arguments); + }; + } + "step 2"; + player.loseMaxHp(2); + }, + intro: { content: "未发动" }, + ai: { + order: 0.1, + expose: 0.2, + result: { + target(player, target) { + if ((target != player && player.hasUnknown()) || player.maxHp < (player.getDamagedHp() > 1 ? 5 : 6)) return 0; + if ( + target == player && + player.hasSkill("resghuishi") && + game.hasPlayer(function (current) { + return current.getAllHistory("damage").length == 0; + }) + ) + return 4; + var list = target.getSkills(null, false, false).filter(function (skill) { + var info = lib.skill[skill]; + return info && info.juexingji && !target.awakenedSkills.includes(skill); + }); + if (list.length || target.hasJudge("lebu") || target.hasSkillTag("nogain")) return 0; + return 4; + }, + }, + }, + subSkill: { mark: { intro: { content: "发动【$】时无视条件" } } }, + }, + sghuishi: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "water", + filterTarget: lib.filter.notMe, + content() { + "step 0"; + player.awakenSkill("sghuishi"); + var list = target.getSkills(null, false, false).filter(function (skill) { + var info = lib.skill[skill]; + return info && info.juexingji; + }); + if (list.length) { + target.addMark("sghuishi", 1, false); + for (var i of list) { + var info = lib.skill[i]; + if (info.filter && !info.charlotte && !info.sghuishi_filter) { + info.sghuishi_filter = info.filter; + info.filter = function (event, player) { + if (player.hasMark("sghuishi")) return true; + return this.sghuishi_filter.apply(this, arguments); + }; + } + } + } else target.draw(4); + player.loseMaxHp(2); + }, + intro: { content: "发动非Charlotte觉醒技时无视条件" }, + ai: { + order: 0.1, + expose: 0.2, + result: { + target(player, target) { + if (player.hasUnknown() || player.maxHp < 5) return 0; + var list = target.getSkills(null, false, false).filter(function (skill) { + var info = lib.skill[skill]; + return info && info.juexingji; + }); + if (list.length || target.hasJudge("lebu") || target.hasSkillTag("nogain")) return 0; + return 4; + }, + }, + }, + }, + zhanjiang: { + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && players[i].getEquips("qinggang").length > 0) { + return true; + } + } + }, + content() { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player) { + var e = players[i].getEquips("qinggang"); + if (e.length > 0) { + player.line(players[i], "green"); + player.gain(e, players[i], "give", "bySelf"); + } + } + } + }, + }, + boss_juejing: { + audio: "juejing", + audioname2: { + dc_zhaoyun: "dcjuejing", + }, + trigger: { player: "phaseDrawBefore" }, + forced: true, + content() { + trigger.cancel(); + }, + ai: { + noh: true, + nogain: true, + }, + group: "boss_juejing2", + }, + boss_juejing2: { + audio: "juejing", + audioname2: { + dc_zhaoyun: "dcjuejing", + }, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter(event, player) { + if (event.name == "gain" && event.player == player) return player.countCards("h") > 4; + var evt = event.getl(player); + if (!evt || !evt.hs || evt.hs.length == 0 || player.countCards("h") >= 4) return false; + var evt = event; + for (var i = 0; i < 4; i++) { + evt = evt.getParent("boss_juejing2"); + if (evt.name != "boss_juejing2") return true; + } + return false; + }, + content() { + var num = 4 - player.countCards("h"); + if (num > 0) player.draw(num); + else player.chooseToDiscard("h", true, -num); + }, + }, + dcjuejing: { audio: 2 }, + meihun: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + target: "useCardToTargeted", + }, + direct: true, + filter(event, player) { + if (event.name != "phaseJieshu" && event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return current != player && current.countCards("h"); + }); + }, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("meihun"), function (card, player, target) { + return target != player && target.countCards("h") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0) return 0; + return 0.1 - att / target.countCards("h"); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("meihun", target); + event.target = target; + player + .chooseControl(lib.suit) + .set("prompt", "请选择一种花色") + .set("ai", function () { + return lib.suit.randomGet(); + }); + } else event.finish(); + "step 2"; + var suit = result.control; + player.chat(get.translation(suit + 2)); + game.log(player, "选择了", "#y" + get.translation(suit + 2)); + if (target.countCards("h", { suit: suit })) { + target + .chooseCard("h", "交给" + get.translation(player) + "一张" + get.translation(suit) + "花色的手牌", true, function (card, player) { + return get.suit(card, player) == _status.event.suit; + }) + .set("suit", suit); + } else { + player.discardPlayerCard(target, true, "h", "visible"); + event.finish(); + } + "step 3"; + if (result.bool && result.cards && result.cards.length) target.give(result.cards, player, "give"); + }, + }, + //Connect Mode support after Angel Beats! -2nd beat- + huoxin: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + if (game.countPlayer() < 3) return false; + for (var i of lib.suit) { + if (player.countCards("h", { suit: i }) > 1) return true; + } + return false; + }, + complexCard: true, + position: "h", + filterCard(card, player) { + if (!ui.selected.cards.length) { + var suit = get.suit(card); + return ( + player.countCards("h", function (card2) { + return card != card2 && get.suit(card2, player) == suit; + }) > 0 + ); + } + return get.suit(card, player) == get.suit(ui.selected.cards[0], player); + }, + selectCard: 2, + selectTarget: 2, + filterTarget: lib.filter.notMe, + multitarget: true, + multiline: true, + delay: false, + discard: false, + lose: false, + check(card) { + return 6 - get.value(card); + }, + targetprompt: ["拼点发起人", "拼点目标"], + content() { + "step 0"; + var list = []; + for (var i = 0; i < targets.length; i++) { + list.push([targets[i], cards[i]]); + } + game.loseAsync({ + gain_list: list, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + "step 1"; + game.delayx(); + if (targets[0].canCompare(targets[1])) { + targets[0].chooseToCompare(targets[1]); + } else event.finish(); + "step 2"; + if (result.winner !== targets[0]) targets[0].addMark("huoxin", 1); + if (result.winner !== targets[1]) targets[1].addMark("huoxin", 1); + }, + marktext: "魅", + intro: { + name: "魅惑", + name2: "魅惑", + content: "mark", + }, + group: "huoxin_control", + ai: { + order: 1, + result: { + target(player, target) { + if (target.hasMark("huoxin")) return -2; + return -1; + }, + }, + }, + }, + huoxin_control: { + audio: "huoxin", + forced: true, + trigger: { global: "phaseBeginStart" }, + filter(event, player) { + return player != event.player && !event.player._trueMe && event.player.countMark("huoxin") > 1; + }, + logTarget: "player", + skillAnimation: true, + animationColor: "key", + content() { + trigger.player.removeMark("huoxin", trigger.player.countMark("huoxin")); + trigger.player._trueMe = player; + game.addGlobalSkill("autoswap"); + if (trigger.player == game.me) { + game.notMe = true; + if (!_status.auto) ui.click.auto(); + } + trigger.player.addSkill("huoxin2"); + }, + }, + huoxin2: { + trigger: { + player: ["phaseAfter", "dieAfter"], + global: "phaseBeforeStart", + }, + lastDo: true, + charlotte: true, + forceDie: true, + forced: true, + silent: true, + content() { + player.removeSkill("huoxin2"); + }, + onremove(player) { + if (player == game.me) { + if (!game.notMe) game.swapPlayerAuto(player._trueMe); + else delete game.notMe; + if (_status.auto) ui.click.auto(); + } + delete player._trueMe; + }, + }, + shiki_omusubi: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + content() { + "step 0"; + player.chooseTarget(get.prompt2("shiki_omusubi"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + if (player.isHealthy()) return 0; + if (player.hp < 3 && player.getDamagedHp() < 2) return 0; + var list = []; + if (lib.character[target.name]) list.addArray(lib.character[target.name][3]); + if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]); + if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]); + list = list.filter(function (i) { + return !player.hasSkill(i); + }); + if (!list.length) return 0; + return 1 + Math.random(); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("shiki_omusubi", target); + player.loseMaxHp(); + var list = []; + if (lib.character[target.name]) list.addArray(lib.character[target.name][3]); + if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]); + if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]); + player.addSkills(list); + game.broadcastAll(function (list) { + lib.character.key_shiki[3].addArray(list); + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.key_shiki = "shiki_omusubi"; + } + }, list); + } + }, + }, + kagari_zongsi: { + enable: "phaseUse", + usable: 1, + content() { + "step 0"; + var controls = []; + if (ui.cardPile.hasChildNodes()) controls.push("选择牌堆中的一张牌"); + if (ui.discardPile.hasChildNodes()) controls.push("选择弃牌堆中的一张牌"); + if ( + game.hasPlayer(function (current) { + return current.countCards("hej") > 0; + }) + ) + controls.push("选择一名角色区域内的一张牌"); + if (!controls.length) { + event.finish(); + return; + } + event.controls = controls; + var next = player.chooseControl(); + next.set("choiceList", controls); + next.set("prompt", "请选择要移动的卡牌的来源"); + next.ai = function () { + return 0; + }; + "step 1"; + result.control = event.controls[result.index]; + var list = ["弃牌堆", "牌堆", "角色"]; + for (var i = 0; i < list.length; i++) { + if (result.control.indexOf(list[i]) != -1) { + event.index = i; + break; + } + } + if (event.index == 2) { + player.chooseTarget("请选择要移动的卡牌的来源", true, function (card, kagari, target) { + return target.countCards("hej") > 0; + }); + } else { + var source = ui[event.index == 0 ? "discardPile" : "cardPile"].childNodes; + var list = []; + for (var i = 0; i < source.length; i++) list.push(source[i]); + player.chooseButton(["请选择要移动的卡牌", list], true).ai = get.buttonValue; + } + "step 2"; + if (event.index == 2) { + player.line(result.targets[0]); + event.target1 = result.targets[0]; + player.choosePlayerCard(result.targets[0], true, "hej").set("visible", true); + } else { + event.card = result.links[0]; + } + "step 3"; + if (event.index == 2) event.card = result.cards[0]; + var controls = ["将这张牌移动到牌堆的顶部或者底部", "将这张牌移动到弃牌堆的顶部或者底部", "将这张牌移动到一名角色对应的区域里"]; + event.controls = controls; + var next = player.chooseControl(); + next.set("prompt", "要对" + get.translation(event.card) + "做什么呢?"); + next.set("choiceList", controls); + next.ai = function () { + return 2; + }; + "step 4"; + result.control = event.controls[result.index]; + var list = ["弃牌堆", "牌堆", "角色"]; + for (var i = 0; i < list.length; i++) { + if (result.control.indexOf(list[i]) != -1) { + event.index2 = i; + break; + } + } + if (event.index2 == 2) { + player.chooseTarget("要将" + get.translation(card) + "移动到哪一名角色的对应区域呢", true).ai = function (target) { + return target == _status.event.player ? 1 : 0; + }; + } else { + player.chooseControl("顶部", "底部").set("prompt", "把" + get.translation(card) + "移动到" + (event.index2 == 0 ? "弃" : "") + "牌堆的..."); + } + "step 5"; + if (event.index2 != 2) { + //if(event.target1) event.target1.lose(card,ui.special); + //else card.goto(ui.special); + event.way = result.control; + } else { + event.target2 = result.targets[0]; + var list = ["手牌区"]; + if (lib.card[card.name].type == "equip" && event.target2.canEquip(card)) list.push("装备区"); + if (lib.card[card.name].type == "delay" && !event.target2.isDisabledJudge() && !event.target2.hasJudge(card.name)) list.push("判定区"); + if (list.length == 1) event._result = { control: list[0] }; + else { + player.chooseControl(list).set("prompt", "把" + get.translation(card) + "移动到" + get.translation(event.target2) + "的...").ai = function () { + return 0; + }; + } + } + "step 6"; + if (event.index2 != 2) { + var node = ui[event.index == 0 ? "discardPile" : "cardPile"]; + if (event.target1) { + var next = event.target1.lose(card, event.position); + if (event.way == "顶部") next.insert_card = true; + } else { + if (event.way == "底部") node.appendChild(card); + else node.insertBefore(card, node.firstChild); + } + game.updateRoundNumber(); + event.finish(); + } else { + if (result.control == "手牌区") { + var next = event.target2.gain(card); + if (event.target1) { + next.source = event.target1; + next.animate = "giveAuto"; + } else next.animate = "draw"; + } else if (result.control == "装备区") { + if (event.target1) event.target1.$give(card, event.target2); + event.target2.equip(card); + } else { + if (event.target1) event.target1.$give(card, event.target2); + event.target2.addJudge(card); + } + } + "step 7"; + game.updateRoundNumber(); + }, + ai: { + order: 10, + result: { player: 1 }, + }, + }, + caopi_xingdong: { + audio: "olfangquan", + audioname: ["shen_caopi"], + subSkill: { + mark: { + mark: true, + marktext: "令", + intro: { + content: "跳过下个回合的判定阶段和摸牌阶段", + }, + }, + }, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h", lib.skill.caopi_xingdong.filterCard) > 0; + }, + filterCard(card) { + return card.name == "sha" || get.type(card) == "trick"; + }, + check(card) { + return 1; + }, + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: 0, + content() { + "step 0"; + player.give(cards, target); + "step 1"; + if (!target.getCards("h").includes(cards[0])) event._result = { bool: false }; + else + target.chooseUseTarget( + cards[0], + game.filterPlayer(function (current) { + return current != player; + }), + "请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段" + ); + "step 2"; + if (result.bool) game.asyncDraw([player, target]); + else { + target.addTempSkill("caopi_xingdong_mark", "phaseJudgeSkipped"); + target.skip("phaseJudge"); + target.skip("phaseDraw"); + event.finish(); + } + "step 3"; + game.delay(); + }, + ai: { + order: 12, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (target.hasSkill("pingkou")) return 1; + if (!card) return 0; + var info = get.info(card); + if (info.selectTarget == -1) { + var eff = 0; + game.countPlayer(function (current) { + if (current != player && target.canUse(card, current)) eff += get.effect(current, card, target, target) > 0; + }); + if (eff > 0 || get.value(card) < 3) return eff; + return 0; + } else if ( + game.hasPlayer(function (current) { + return current != player && target.canUse(card, current) && get.effect(current, card, target, target) > 0; + }) + ) + return 1.5; + else if (get.value(card) < 3) return -1; + return 0; + }, + }, + }, + }, + shenfu: { + audio: 2, + trigger: { player: "phaseEnd" }, + direct: true, + content() { + "step 0"; + event.logged = false; + event.targets = []; + event.goto(player.countCards("h") % 2 == 1 ? 1 : 4); + "step 1"; + player + .chooseTarget(get.prompt("shenfu"), "对一名其他角色造成1点雷属性伤害", function (card, player, target) { + return target != player && !_status.event.getParent().targets.includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "thunder") * (target.hp == 1 ? 2 : 1); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + if (!event.logged) { + event.logged = true; + player.logSkill("shenfu", target, "thunder"); + } else player.line(target, "thunder"); + event.targets.push(target); + target.damage("thunder"); + } else event.finish(); + "step 3"; + if ( + target.getHistory("damage", function (evt) { + return evt.getParent("shenfu") == event && evt._dyinged; + }).length + ) + event.goto(1); + else event.finish(); + "step 4"; + player + .chooseTarget(get.prompt("shenfu"), "令一名角色摸一张牌或弃置其一张手牌", function (card, player, target) { + return !_status.event.getParent().targets.includes(target); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var delta = target.hp - target.countCards("h"); + if (Math.abs(delta) == 1 && get.sgn(delta) == get.sgn(att)) return 3 * Math.abs(att); + if (att > 0 || target.countCards("h") > 0) return Math.abs(att); + return 0; + }); + "step 5"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + if (!event.logged) { + event.logged = true; + player.logSkill("shenfu", target); + } else player.line(target, "green"); + event.targets.push(target); + if (target.countCards("h") == 0) event._result = { index: 0 }; + else + player + .chooseControl("摸一张牌", "弃置一张手牌") + .set("prompt", "选择一项令" + get.translation(target) + "执行…") + .set("goon", get.attitude(player, target) > 0 ? 0 : 1) + .set("ai", () => _status.event.goon); + //else player.discardPlayerCard(target,'h','弃置'+get.translation(target)+'一张手牌,或点【取消】令其摸一张牌。'); + } else event.finish(); + "step 6"; + if (result.index == 0) target.draw(); + else target.chooseToDiscard("h", true); + "step 7"; + if (target.hp == target.countCards("h")) event.goto(4); + }, + ai: { expose: 0.25 }, + }, + qixian: { + mod: { + maxHandcardBase(player, num) { + return 7; + }, + }, + }, + chuyuan: { + audio: 2, + trigger: { global: "damageEnd" }, + filter(event, player) { + return event.player.isIn() && player.getExpansions("chuyuan").length < player.maxHp; + }, + logTarget: "player", + locked: false, + content() { + "step 0"; + trigger.player.draw(); + "step 1"; + if (!trigger.player.countCards("h")) event.finish(); + else trigger.player.chooseCard("h", true, "选择一张牌置于" + get.translation(player) + "的武将牌上作为「储」"); + "step 2"; + player.addToExpansion(result.cards, trigger.player, "give").gaintag.add("chuyuan"); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { combo: "dengji" }, + }, + dengji: { + audio: 2, + derivation: ["tianxing", "new_rejianxiong", "rerende", "rezhiheng", "olluanji", "caopi_xingdong"], + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return player.getExpansions("chuyuan").length >= 3; + }, + content() { + player.awakenSkill(event.name); + player.addSkills(["tianxing", "new_rejianxiong"]); + player.loseMaxHp(); + player.gain(player.getExpansions("chuyuan"), "gain2", "fromStorage"); + }, + ai: { + combo: "chuyuan", + }, + }, + tianxing: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return player.getExpansions("chuyuan").length >= 3; + }, + content() { + "step 0"; + player.awakenSkill(event.name); + player.loseMaxHp(); + player.gain(player.getExpansions("chuyuan"), "gain2", "fromStorage"); + "step 1"; + player.removeSkills("chuyuan"); + player + .chooseControl("rerende", "rezhiheng", "olluanji", "caopi_xingdong") + .set("prompt", "选择获得一个技能") + .set("ai", function () { + var player = _status.event.player; + if (!player.hasSkill("luanji") && !player.hasSkill("olluanji") && player.getUseValue({ name: "wanjian" }) > 4) return "olluanji"; + if (!player.hasSkill("rezhiheng")) return "rezhiheng"; + if (!player.hasSkill("caopi_xingdong")) return "caopi_xingdong"; + return "rerende"; + }); + "step 2"; + player.addSkills(result.control); + }, + ai: { + combo: "chuyuan", + }, + }, + olzhiti: { + audio: "drlt_zhiti", + global: "olzhiti2", + mod: { + maxHandcard(player, num) { + if ( + game.hasPlayer(function (current) { + return current.isDamaged(); + }) + ) + return num + 1; + }, + }, + trigger: { player: ["phaseDrawBegin2", "phaseEnd"] }, + forced: true, + filter(event, player) { + var num = event.name == "phase" ? 5 : 3; + if ( + num == 3 + ? event.numFixed + : !game.hasPlayer(function (current) { + return current.hasEnabledSlot(); + }) + ) + return false; + return ( + game.countPlayer(function (current) { + return current.isDamaged(); + }) >= num + ); + }, + direct: true, + content() { + "step 0"; + if (trigger.name == "phaseDraw") { + player.logSkill("olzhiti"); + trigger.num++; + event.finish(); + } else { + player + .chooseTarget(get.prompt("olzhiti"), "废除一名角色的一个随机装备栏", function (card, player, target) { + return target.hasEnabledSlot(); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) * (target.countCards("e") + 1); + }); + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olzhiti", target); + var list = []; + for (var i = 1; i < 6; i++) { + if (target.hasEnabledSlot(i)) list.add(i == 3 || i == 4 ? 6 : i); + } + var num = list.randomGet(); + if (num != 6) target.disableEquip(num); + else { + target.disableEquip(3, 4); + } + } + }, + }, + olzhiti2: { + mod: { + maxHandcard(player, num) { + if (player.isDamaged()) + return ( + num - + game.countPlayer(function (current) { + return current.hasSkill("olzhiti") && current.inRange(player); + }) + ); + }, + }, + }, + olduorui: { + audio: "drlt_duorui", + trigger: { + source: "damageSource", + }, + filter(event, player) { + if (!player.isPhaseUsing() || event.player.isDead()) return false; + for (var i in event.player.disabledSkills) { + if (event.player.disabledSkills[i].includes("olduorui2")) return false; + } + var list = []; + var listm = []; + var listv = []; + if (event.player.name1 != undefined) listm = lib.character[event.player.name1][3]; + else listm = lib.character[event.player.name][3]; + if (event.player.name2 != undefined) listv = lib.character[event.player.name2][3]; + listm = listm.concat(listv); + var func = function (skill) { + var info = get.info(skill); + if (!info || info.charlotte) return false; + return true; + }; + for (var i = 0; i < listm.length; i++) { + if (func(listm[i])) list.add(listm[i]); + } + return list.length > 0; + }, + check(event, player) { + if (get.attitude(_status.event.player, event.player) >= 0) return false; + if (event.getParent("phaseUse").skipped) return true; + var nd = player.needsToDiscard(); + return ( + player.countCards("h", function (card) { + return player.getUseValue(card, null, true) > 0 && (nd ? true : get.tag(card, "damage") > 0); + }) == 0 + ); + }, + logTarget: "player", + content() { + "step 0"; + var list = []; + var listm = []; + var listv = []; + if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3]; + else listm = lib.character[trigger.player.name][3]; + if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3]; + listm = listm.concat(listv); + var func = function (skill) { + var info = get.info(skill); + if (!info || info.charlotte) return false; + return true; + }; + for (var i = 0; i < listm.length; i++) { + if (func(listm[i])) list.add(listm[i]); + } + event.skills = list; + player.chooseControl(list).set("prompt", "选择" + get.translation(trigger.player) + "武将牌上的一个技能并令其失效"); + "step 1"; + trigger.player.disableSkill("olduorui2", result.control); + trigger.player.addTempSkill("olduorui2", { player: "phaseAfter" }); + game.log(player, "选择了", trigger.player, "的技能", "#g【" + get.translation(result.control) + "】"); + event.getParent("phaseUse").skipped = true; + }, + }, + olduorui2: { + onremove(player, skill) { + player.enableSkill(skill); + }, + locked: true, + mark: true, + charlotte: true, + intro: { + content(storage, player, skill) { + var list = []; + for (var i in player.disabledSkills) { + if (player.disabledSkills[i].includes(skill)) list.push(i); + } + if (list.length) { + var str = "失效技能:"; + for (var i = 0; i < list.length; i++) { + if (lib.translate[list[i] + "_info"]) str += get.translation(list[i]) + "、"; + } + return str.slice(0, str.length - 1); + } + }, + }, + }, + wuhun2: { audio: 2 }, + new_wuhun: { + audio: "wuhun2", + trigger: { player: "damageEnd" }, + filter(event, player) { + return event.source && event.source.isIn(); + }, + forced: true, + logTarget: "source", + content() { + trigger.source.addMark("new_wuhun", trigger.num); + }, + group: "new_wuhun_die", + ai: { + notemp: true, + effect: { + target: (card, player, target) => { + if (!get.tag(card, "damage") || !target.hasFriend()) return; + if (player.hasSkillTag("jueqing", null, target)) return 1.7; + let die = [null, 1], + temp; + game.filterPlayer(i => { + temp = i.countMark("new_wuhun"); + if (i === player && target.hp + target.hujia > 1) temp++; + if (temp >= die[1]) { + if (!die[0]) die = [i, temp]; + else { + let att = get.attitude(player, i); + if (att < die[1]) die = [i, temp]; + } + } + }); + if (die[0]) return [1, 0, 1, (-6 * get.sgnAttitude(player, die[0])) / Math.max(1, target.hp)]; + }, + }, + }, + marktext: "魇", + intro: { + name: "梦魇", + content: "mark", + onunmark: true, + }, + subSkill: { + die: { + audio: "wuhun2", + trigger: { player: "die" }, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.hasMark("new_wuhun"); + }); + }, + forced: true, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "soil", + content() { + "step 0"; + var num = 0; + for (var i = 0; i < game.players.length; i++) { + var current = game.players[i]; + if (current != player && current.countMark("new_wuhun") > num) { + num = current.countMark("new_wuhun"); + } + } + player + .chooseTarget(true, "请选择【武魂】的目标", "令其进行判定,若判定结果不为【桃】或【桃园结义】,则其死亡", function (card, player, target) { + return target != player && target.countMark("new_wuhun") == _status.event.num; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }) + .set("forceDie", true) + .set("num", num); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("new_wuhun_die", target); + player.line(target, { color: [255, 255, 0] }); + game.delay(2); + } + "step 2"; + target.judge(function (card) { + if (["tao", "taoyuan"].includes(card.name)) return 10; + return -10; + }).judge2 = function (result) { + return result.bool == false ? true : false; + }; + "step 3"; + if (!result.bool) target.die(); + }, + }, + }, + }, + new_guixin: { + audio: "guixin", + trigger: { + player: "damageEnd", + }, + check(event, player) { + if (player.isTurnedOver() || event.num > 1) return true; + var num = game.countPlayer(function (current) { + if (current.countCards("he") && current != player && get.attitude(player, current) <= 0) { + return true; + } + if (current.countCards("j") && current != player && get.attitude(player, current) > 0) { + return true; + } + }); + return num >= 2; + }, + content() { + "step 0"; + var targets = game.filterPlayer(); + targets.remove(player); + targets.sort(lib.sort.seat); + event.targets = targets; + event.count = trigger.num; + "step 1"; + event.num = 0; + player.line(targets, "green"); + player + .chooseControl("手牌区", "装备区", "判定区") + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return current.countCards("j") && current != player && get.attitude(player, current) > 0; + }) + ) + return 2; + return Math.floor(Math.random() * 3); + }) + .set("prompt", "请选择优先获得的区域"); + "step 2"; + event.range = { + 手牌区: ["h", "e", "j"], + 装备区: ["e", "h", "j"], + 判定区: ["j", "h", "e"], + }[result.control || "手牌区"]; + "step 3"; + if (num < event.targets.length) { + var target = event.targets[num]; + var range = event.range; + for (var i = 0; i < range.length; i++) { + var cards = target.getCards(range[i]); + if (cards.length) { + var card = cards.randomGet(); + player.gain(card, target, "giveAuto", "bySelf"); + break; + } + } + event.num++; + } + "step 4"; + if (num < event.targets.length) event.goto(3); + "step 5"; + player.turnOver(); + "step 6"; + event.count--; + if (event.count && player.hasSkill("new_guixin")) { + player.chooseBool(get.prompt2("new_guixin")).ai = function () { + return lib.skill.new_guixin.check({ num: event.count }, player); + }; + } else { + event.finish(); + } + "step 7"; + if (event.count && result.bool) { + player.logSkill("new_guixin"); + event.goto(1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + threaten(player, target) { + if (target.hp == 1) return 2.5; + return 1; + }, + effect: { + target(card, player, target) { + if ( + !target._new_guixin_eff && + get.tag(card, "damage") && + target.hp > + (player.hasSkillTag("damageBonus", true, { + card: card, + target: target, + }) + ? 2 + : 1) + ) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + target._new_guixin_eff = true; + let gain = game.countPlayer(function (current) { + if (target == current) return 0; + if (get.attitude(target, current) > 0) { + if (current.hasCard(cardx => lib.filter.canBeGained(cardx, target, current, "new_guixin") && get.effect(current, cardx, current, current) < 0, "j")) return 1.3; + return 0; + } + if (current.hasCard(cardx => lib.filter.canBeGained(cardx, target, current, "new_guixin") && get.effect(current, cardx, current, current) > 0, "e")) return 1.1; + if (current.hasCard(cardx => lib.filter.canBeGained(cardx, target, current, "new_guixin"), "h")) return 0.9; + return 0; + }); + if (target.isTurnedOver()) gain += 2.3; + else gain -= 2.3; + delete target._new_guixin_eff; + return [1, Math.max(0, gain)]; + } + }, + }, + }, + }, + ol_shenfen: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countMark("baonu") >= 6; + }, + usable: 1, + skillAnimation: true, + animationColor: "metal", + content() { + "step 0"; + event.delay = false; + player.removeMark("baonu", 6); + event.targets = game.filterPlayer(); + event.targets.remove(player); + event.targets.sort(lib.sort.seat); + player.line(event.targets, "green"); + event.targets2 = event.targets.slice(0); + event.targets3 = event.targets.slice(0); + "step 1"; + if (event.targets2.length) { + event.targets2.shift().damage("nocard"); + event.redo(); + } + "step 2"; + if (event.targets.length) { + event.current = event.targets.shift(); + if (event.current.countCards("e")) event.delay = true; + event.current.discard(event.current.getCards("e")).delay = false; + } + "step 3"; + if (event.delay) game.delay(0.5); + event.delay = false; + if (event.targets.length) event.goto(2); + "step 4"; + if (event.targets3.length) { + var target = event.targets3.shift(); + target.chooseToDiscard(4, "h", true).delay = false; + if (target.countCards("h")) event.delay = true; + } + "step 5"; + if (event.delay) game.delay(0.5); + event.delay = false; + if (event.targets3.length) event.goto(4); + "step 6"; + player.turnOver(); + }, + ai: { + combo: "baonu", + order: 10, + result: { + player(player) { + return game.countPlayer(function (current) { + if (current != player) { + return get.sgn(get.damageEffect(current, player, player)); + } + }); + }, + }, + }, + }, + ol_wuqian: { + audio: 2, + enable: "phaseUse", + derivation: "wushuang", + filter(event, player) { + return player.countMark("baonu") >= 2 && game.hasPlayer(target => lib.skill.ol_wuqian.filterTarget(null, player, target)); + }, + filterTarget(card, player, target) { + return target != player && !target.hasSkill("ol_wuqian_targeted"); + }, + content() { + player.removeMark("baonu", 2); + player.addTempSkills("wushuang"); + player.popup("无双"); + // game.log(player,'获得了技能','#g【无双】'); + target.addTempSkill("ol_wuqian_targeted"); + }, + ai: { + order: 9, + result: { + target(player, target) { + if ( + player.countCards("hs", card => { + if (!player.getCardUsable({ name: card.name })) return false; + if (!player.canUse(card, target)) return false; + var eff1 = get.effect(target, card, player, player); + _status.baonuCheck = true; + var eff2 = get.effect(target, card, player, player); + delete _status.baonuCheck; + return eff2 > Math.max(0, eff1); + }) + ) + return -1; + return 0; + }, + }, + combo: "baonu", + }, + global: "ol_wuqian_ai", + subSkill: { + targeted: { + charlotte: true, + ai: { unequip2: true }, + }, + ai: { + ai: { + unequip2: true, + skillTagFilter(player) { + if (!_status.baonuCheck) return false; + }, + }, + }, + }, + }, + wumou: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter(event) { + return get.type(event.card) == "trick"; + }, + content() { + "step 0"; + if (player.hasMark("baonu")) { + player.chooseControlList(["移去一枚【暴怒】标记", "失去1点体力"], true).set("ai", function (event, player) { + if (get.effect(player, { name: "losehp" }, player, player) >= 0) return 1; + if (player.storage.baonu > 6) return 0; + if (player.hp + player.num("h", "tao") > 3) return 1; + return 0; + }); + } else { + player.loseHp(); + event.finish(); + } + "step 1"; + if (result.index == 0) { + player.removeMark("baonu", 1); + } else { + player.loseHp(); + } + }, + ai: { + effect: { + player_use(card, player) { + if (get.type(card) == "trick" && get.value(card) < 6) { + return [0, -2]; + } + }, + }, + neg: true, + }, + }, + qinyin: { + audio: 2, + trigger: { player: "phaseDiscardEnd" }, + direct: true, + filter(event, player) { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) cards.addArray(evt.cards2); + }); + return cards.length > 1; + }, + content() { + "step 0"; + event.forceDie = true; + if (typeof event.count != "number") { + // event.count=trigger.cards.length-1; + event.count = 1; + } + var recover = 0, + lose = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].hp < players[i].maxHp) { + if (get.attitude(player, players[i]) > 0) { + if (players[i].hp < 2) { + lose--; + recover += 0.5; + } + lose--; + recover++; + } else if (get.attitude(player, players[i]) < 0) { + if (players[i].hp < 2) { + lose++; + recover -= 0.5; + } + lose++; + recover--; + } + } else { + if (get.attitude(player, players[i]) > 0) { + lose--; + } else if (get.attitude(player, players[i]) < 0) { + lose++; + } + } + } + var prompt = get.prompt("qinyin") + "(剩余" + get.cnNumber(event.count) + "次)"; + player.chooseControl("失去体力", "回复体力", "cancel2", ui.create.dialog(get.prompt("qinyin"), "hidden")).ai = function () { + if (lose > recover && lose > 0) return 0; + if (lose < recover && recover > 0) return 1; + return 2; + }; + "step 1"; + if (result.control == "cancel2") { + event.finish(); + } else { + player.logSkill("qinyin"); + event.bool = result.control == "回复体力"; + event.num = 0; + event.players = game.filterPlayer(); + } + "step 2"; + if (event.num < event.players.length) { + var target = event.players[event.num]; + if (event.bool) { + target.recover(); + } else { + target.loseHp(); + } + event.num++; + event.redo(); + } + "step 3"; + if (event.count > 1) { + event.count--; + event.goto(0); + } + }, + ai: { + expose: 0.1, + threaten: 2, + }, + }, + lianpo: { + audio: 2, + trigger: { global: "phaseAfter" }, + frequent: true, + filter(event, player) { + return player.getStat("kill") > 0; + }, + content() { + player.insertPhase(); + }, + }, + baonu: { + audio: 2, + marktext: "暴", + unique: true, + trigger: { + source: "damageSource", + player: ["damageEnd", "enterGame"], + global: "phaseBefore", + }, + forced: true, + filter(event) { + return (event.name != "damage" && (event.name != "phase" || game.phaseNumber == 0)) || event.num > 0; + }, + content() { + player.addMark("baonu", trigger.name == "damage" ? trigger.num : 2); + }, + intro: { + name: "暴怒", + content: "mark", + }, + ai: { + combo: "ol_shenfen", + maixie: true, + maixie_hp: true, + }, + }, + shenfen: { + audio: 2, + unique: true, + enable: "phaseUse", + filter(event, player) { + return player.storage.baonu >= 6; + }, + skillAnimation: true, + animationColor: "metal", + limited: true, + content() { + "step 0"; + player.awakenSkill("shenfen"); + player.storage.baonu -= 6; + player.markSkill("baonu"); + player.syncStorage("baonu"); + event.targets = game.filterPlayer(); + event.targets.remove(player); + event.targets.sort(lib.sort.seat); + event.targets2 = event.targets.slice(0); + player.line(event.targets, "green"); + "step 1"; + if (event.targets.length) { + event.targets.shift().damage(); + event.redo(); + } + "step 2"; + if (event.targets2.length) { + var cur = event.targets2.shift(); + if (cur && cur.countCards("he")) { + cur.chooseToDiscard("he", true, 4); + } + event.redo(); + } + }, + ai: { + order: 10, + result: { + player(player) { + return game.countPlayer(function (current) { + if (current != player) { + return get.sgn(get.damageEffect(current, player, player)); + } + }); + }, + }, + combo: "baonu", + }, + }, + wuqian: { + audio: 2, + enable: "phaseUse", + derivation: "wushuang", + filter(event, player) { + return player.storage.baonu >= 2 && !player.hasSkill("wushuang"); + }, + content() { + player.storage.baonu -= 2; + player.addTempSkill("wushuang"); + }, + ai: { + order: 5, + result: { + player(player) { + if (!player.storage.shenfen) return 0; + var cards = player.getCards("h", "sha"); + if (cards.length) { + if ( + game.hasPlayer(function (current) { + return player.canUse("sha", current) && get.effect(current, cards[0], player, player) > 0 && current.hasShan(); + }) + ) { + return 1; + } + } + return 0; + }, + }, + combo: "baonu", + }, + }, + renjie: { + audio: "renjie2", + trigger: { player: "damageEnd" }, + forced: true, + group: "renjie2", + notemp: true, + //mark:true, + filter(event) { + return event.num > 0; + }, + content() { + player.addMark("renjie", trigger.num); + }, + intro: { + name2: "忍", + content: "mark", + }, + ai: { + maixie: true, + maixie_hp: true, + combo: "sbaiyin", + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (get.tag(card, "damage")) { + if (target.hp == target.maxHp) { + if (!target.hasSkill("jilue")) { + return [0, 1]; + } + return [0.7, 1]; + } + return 0.7; + } + }, + }, + }, + }, + renjie2: { + audio: 2, + mod: { + aiOrder: (player, card, num) => { + if (num <= 0 || typeof card !== "object" || !player.isPhaseUsing()) return num; + if (player.hasSkill("sbaiyin")) { + if (player.countMark("renjie") < 4 && player.getUseValue(card) < Math.min(4, (player.hp * player.hp) / 4)) return 0; + } else if (player.hasSkill("jilue")) { + if (player.countMark("renjie") < 3 && player.getUseValue(card) < Math.min(1.8, 0.18 * player.hp * player.hp)) return 0; + } + }, + }, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + forced: true, + filter(event, player) { + if (event.type != "discard" || event.getlx === false) return false; + var evt = event.getParent("phaseDiscard"), + evt2 = event.getl(player); + return evt && evt2 && evt.name == "phaseDiscard" && evt.player == player && evt2.cards2 && evt2.cards2.length > 0; + }, + content() { + player.addMark("renjie", trigger.getl(player).cards2.length); + }, + }, + sbaiyin: { + skillAnimation: "epic", + animationColor: "thunder", + juexingji: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + audio: 2, + filter(event, player) { + return player.countMark("renjie") >= 4; + }, + content() { + player.awakenSkill("sbaiyin"); + player.loseMaxHp(); + player.addSkills("jilue"); + }, + derivation: ["jilue", "reguicai", "fangzhu", "rejizhi", "rezhiheng", "rewansha"], + ai: { + combo: "renjie", + }, + }, + jilue: { + unique: true, + group: ["jilue_guicai", "jilue_fangzhu", "jilue_wansha", "jilue_zhiheng", "jilue_jizhi"], + ai: { + combo: "renjie", + }, + }, + jilue_guicai: { + audio: 1, + trigger: { global: "judge" }, + direct: true, + filter(event, player) { + return player.countCards("hes") > 0 && player.hasMark("renjie"); + }, + content() { + "step 0"; + player.chooseCard("是否弃置一枚“忍”,并发动〖鬼才〗?", "hes", function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }).ai = function (card) { + var trigger = _status.event.parent._trigger; + var player = _status.event.player; + var result = trigger.judge(card) - trigger.judge(trigger.player.judging[0]); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result - get.value(card) / 2; + } else { + return -result - get.value(card) / 2; + } + }; + "step 1"; + if (result.bool) { + player.respond(result.cards, "highlight", "jilue_guicai", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.removeMark("renjie", 1); + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.delete(); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + game.delay(2); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + jilue_fangzhu: { + audio: 1, + trigger: { player: "damageEnd" }, + direct: true, + //priority:-1, + filter(event, player) { + return player.hasMark("renjie"); + }, + content() { + "step 0"; + player + .chooseTarget("是否弃置一枚“忍”,并发动【放逐】?", function (card, player, target) { + return player != target; + }) + .set("ai", target => { + if (target.hasSkillTag("noturn")) return 0; + var player = _status.event.player; + var current = _status.currentPhase; + var dis = current ? get.distance(current, target, "absolute") : 1; + var draw = player.getDamagedHp(); + var att = get.attitude(player, target); + if (att == 0) return target.hasJudge("lebu") ? Math.random() / 3 : Math.sqrt(get.threaten(target)) / 5 + Math.random() / 2; + if (att > 0) { + if (target.isTurnedOver()) return att + draw; + if (draw < 4) return -1; + if (current && target.getSeatNum() > current.getSeatNum()) return att + draw / 3; + return (10 * Math.sqrt(Math.max(0.01, get.threaten(target)))) / (3.5 - draw) + dis / (2 * game.countPlayer()); + } else { + if (target.isTurnedOver()) return att - draw; + if (draw >= 5) return -1; + if (current && target.getSeatNum() <= current.getSeatNum()) return -att + draw / 3; + return (4.25 - draw) * 10 * Math.sqrt(Math.max(0.01, get.threaten(target))) + (2 * game.countPlayer()) / dis; + } + }); + "step 1"; + if (result.bool) { + player.removeMark("renjie", 1); + player.logSkill("jilue_fangzhu", result.targets); + result.targets[0].draw(player.maxHp - player.hp); + result.targets[0].turnOver(); + } + }, + }, + jilue_wansha: { + audio: "wansha", + audioname: ["shen_simayi"], + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.hasMark("renjie"); + }, + content() { + player.removeMark("renjie", 1); + player.addTempSkill("rewansha"); + }, + ai: { + order: () => { + let player = _status.event.player; + if ( + game.hasPlayer(current => { + if (player === current || current.hp > 1 || get.attitude(player, current) >= 0) return false; + return (player.inRange(current) && player.countCards("hs", "sha") && player.getCardUsable("sha")) || player.countCards("hs", card => get.name(card) !== "sha" && get.tag(card, "damage")) > 1; + }) + ) + return 9.2; + return 0; + }, + result: { + player: 1, + }, + effect: { + player(card, player, target) { + if (target && player.hasSkill("rewansha") && target.hp <= 1 && get.tag(card, "damage")) return [1, 0, 1.5, -1.5]; + }, + }, + }, + }, + jilue_zhiheng: { + audio: 1, + mod: { + aiOrder(player, card, num) { + if (num <= 0 || get.itemtype(card) != "card" || get.type(card) != "equip") return num; + let eq = player.getEquip(get.subtype(card)); + if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp)) return 0; + }, + }, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.hasMark("renjie"); + }, + position: "he", + filterCard: lib.filter.cardDiscardable, + discard: false, + lose: false, + delay: false, + selectCard: [1, Infinity], + prompt: "弃置一枚“忍”,然后弃置任意张牌并摸等量的牌。若弃置了所有的手牌,则可以多摸一张牌。", + check(card) { + var player = _status.event.player; + if ( + get.position(card) == "h" && + !player.countCards("h", function (card) { + return get.value(card) >= 8; + }) + ) { + return 8 - get.value(card); + } + return 6 - get.value(card); + }, + content() { + "step 0"; + player.removeMark("renjie", 1); + player.discard(cards); + event.num = 1; + var hs = player.getCards("h"); + if (!hs.length) event.num = 0; + for (var i = 0; i < hs.length; i++) { + if (!cards.includes(hs[i])) { + event.num = 0; + break; + } + } + "step 1"; + player.draw(event.num + cards.length); + }, + ai: { + order(item, player) { + if (player.hasCard(i => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; + return 10; + }, + result: { + player(player) { + var num = 0; + var cards = player.getCards("he"); + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i]) < 6) { + num++; + } + } + if (cards.length > 2) return 1; + if (cards.length == 2 && player.storage.jilue > 1); + return 0; + }, + }, + nokeep: true, + skillTagFilter(player, tag, arg) { + if (tag === "nokeep") return player.isPhaseUsing() && !player.getStat().skill.jilue_zhiheng && player.hasCard(card => get.name(card) !== "tao", "h"); + }, + }, + }, + jilue_jizhi: { + audio: 1, + trigger: { player: "useCard" }, + filter(event, player) { + return get.type(event.card, "trick") == "trick" && event.card.isCard && player.hasMark("renjie"); + }, + content() { + "step 0"; + player.removeMark("renjie", 1); + player.draw(); + "step 1"; + event.card = result[0]; + if (get.type(event.card) == "basic") { + player + .chooseBool("是否弃置" + get.translation(event.card) + "并令本回合手牌上限+1?") + .set("ai", function (evt, player) { + return _status.currentPhase == player && player.needsToDiscard(-3) && _status.event.value < 6; + }) + .set("value", get.value(event.card, player)); + } + "step 2"; + if (result.bool) { + player.discard(event.card); + player.addTempSkill("jilue_jizhi_clear"); + player.addMark("jilue_jizhi_clear", 1, false); + } + }, + subSkill: { + clear: { + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("jilue_jizhi_clear"); + }, + }, + intro: { content: "手牌上限+#" }, + }, + }, + }, + wushen: { + mod: { + cardname(card, player, name) { + if (get.suit(card) == "heart") return "sha"; + }, + cardnature(card, player) { + if (get.suit(card) == "heart") return false; + }, + targetInRange(card) { + if (card.name === "sha") { + const suit = get.suit(card); + if (suit === "heart" || suit === "unsure") return true; + } + }, + cardUsable(card) { + if (card.name === "sha") { + const suit = get.suit(card); + if (suit === "heart" || suit === "unsure") return Infinity; + } + }, + }, + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return event.card.name == "sha" && get.suit(event.card) == "heart"; + }, + content() { + trigger.directHit.addArray(game.players); + if (trigger.addCount !== false) { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + } + }, + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondSha") && current < 0) return 0.6; + }, + }, + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return arg.card.name == "sha" && get.suit(arg.card) == "heart"; + }, + }, + }, + wuhun: { + audio: "wuhun2", + trigger: { player: "die" }, + filter(event) { + return event.source && event.source.isIn(); + }, + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "soil", + logTarget: "source", + content() { + var num = trigger.source.getHp(); + if (num > 0) trigger.source.loseHp(num); + }, + ai: { + threaten(player, target) { + if (target.hp == 1) { + if (player.getHp() <= 0) return 100; + return 0.2; + } + return 0.8; + }, + effect: { + target(card, player, target, current) { + if (player.getHp() <= 0) return; + if (!target.hasFriend()) return; + if (target.hp <= 1 && get.tag(card, "damage")) return [1, 0, 0, -2]; + }, + }, + }, + }, + guixin: { + audio: 2, + trigger: { player: "damageEnd" }, + check(event, player) { + if (player.isTurnedOver() || event.num > 1) return true; + var num = game.countPlayer(function (current) { + if (current.countCards("he") && current != player && get.attitude(player, current) <= 0) { + return true; + } + if (current.countCards("j") && current != player && get.attitude(player, current) > 0) { + return true; + } + }); + return num >= 2; + }, + content() { + "step 0"; + event.count = trigger.num; + "step 1"; + var targets = game.filterPlayer(current => current != player).sortBySeat(); + player.line(targets); + player.gainMultiple(targets, "hej"); + "step 2"; + player.turnOver(); + "step 3"; + event.count--; + if (event.count && player.hasSkill("guixin")) { + player.chooseBool(get.prompt2("guixin")); + } else event.finish(); + "step 4"; + if (event.count && result.bool) event.goto(1); + }, + ai: { + maixie: true, + maixie_hp: true, + threaten(player, target) { + if (target.hp == 1) return 2.5; + return 0.5; + }, + effect: { + target(card, player, target) { + if ( + !target._guixin_eff && + get.tag(card, "damage") && + target.hp > + (player.hasSkillTag("damageBonus", true, { + card: card, + target: target, + }) + ? 2 + : 1) + ) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + target._guixin_eff = true; + let gain = game.countPlayer(function (current) { + if (target == current) return 0; + if (get.attitude(target, current) > 0) { + if (current.hasCard(cardx => lib.filter.canBeGained(cardx, target, current, "guixin") && get.effect(current, cardx, current, current) < 0, "ej")) return 1.3; + return 0; + } + if (current.hasCard(cardx => lib.filter.canBeGained(cardx, target, current, "guixin") && get.effect(current, cardx, current, current) > 0, "ej")) return 1.1; + if (current.hasCard(cardx => lib.filter.canBeGained(cardx, target, current, "guixin"), "h")) return 0.9; + return 0; + }); + if (target.isTurnedOver()) gain += 2.3; + else gain -= 2.3; + delete target._guixin_eff; + return [1, Math.max(0, gain)]; + } + }, + }, + }, + }, + qixing: { + audio: 2, + unique: true, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + "step 0"; + player.addToExpansion(get.cards(7), "draw").gaintag.add("qixing"); + "step 1"; + var cards = player.getExpansions("qixing"); + if (!cards.length || !player.countCards("h")) { + event.finish(); + return; + } + var next = player.chooseToMove("七星:是否交换“星”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的星", cards], + ["手牌区", player.getCards("h")], + ]); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return get.useful(a) - get.useful(b); + }), + cards2 = cards.splice(0, player.getExpansions("qixing").length); + return [cards2, cards]; + }); + "step 2"; + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("qixing")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.addToExpansion(pushs, player, "giveAuto").gaintag.add("qixing"); + //game.log(player,'将',pushs,'作为“星”置于武将牌上'); + player.gain(gains, "draw"); + } + }, + intro: { + markcount: "expansion", + mark(dialog, content, player) { + var content = player.getExpansions("qixing"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { + dialog.addAuto(content); + } else { + return "共有" + get.cnNumber(content.length) + "张星"; + } + } + }, + content(content, player) { + var content = player.getExpansions("qixing"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { + return get.translation(content); + } + return "共有" + get.cnNumber(content.length) + "张星"; + } + }, + }, + group: ["qixing2"], + ai: { combo: "dawu" }, + }, + qixing2: { + trigger: { player: "phaseDrawAfter" }, + direct: true, + filter(event, player) { + return player.getExpansions("qixing").length > 0 && player.countCards("h") > 0; + }, + content() { + "step 0"; + var cards = player.getExpansions("qixing"); + if (!cards.length || !player.countCards("h")) { + event.finish(); + return; + } + var next = player.chooseToMove("七星:是否交换“星”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的星", cards], + ["手牌区", player.getCards("h")], + ]); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return get.value(a) - get.value(b); + }), + cards2 = cards.splice(0, player.getExpansions("qixing").length); + return [cards2, cards]; + }); + "step 1"; + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("qixing")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.logSkill("qixing2"); + player.addToExpansion(pushs, player, "giveAuto").gaintag.add("qixing"); + game.log(player, "将", pushs, "作为“星”置于武将牌上"); + player.gain(gains, "draw"); + } + }, + }, + dawu: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter(event, player) { + return player.getExpansions("qixing").length; + }, + audio: 2, + content() { + "step 0"; + var num = Math.min(game.countPlayer(), player.getExpansions("qixing").length); + player + .chooseTarget(get.prompt("dawu"), "令至多" + get.cnNumber(num) + "名角色获得“大雾”标记", [1, num]) + .set("ai", function (target) { + if (target.isMin()) return 0; + if (target.hasSkill("biantian2") || target.hasSkill("dawu2")) return 0; + var att = get.attitude(player, target); + if (att >= 4) { + if (target.hp > 2 && (target.isHealthy() || target.hasSkillTag("maixie"))) return 0; + if (_status.event.allUse) return att; + if (target.hp == 1) return att; + if (target.hp == 2 && target.countCards("he") <= 2) return att * 0.7; + return 0; + } + return -1; + }) + .set( + "allUse", + player.getExpansions("qixing").length >= + game.countPlayer(function (current) { + return get.attitude(player, current) > 4; + }) * + 2 + ); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("dawu", targets, "thunder"); + var length = targets.length; + targets.forEach(target => { + target.addAdditionalSkill(`dawu_${player.playerid}`, "dawu2"); + target.markAuto("dawu2", [player]); + }); + player.addTempSkill("dawu3", { player: "phaseBeginStart" }); + player.chooseCardButton("选择弃置" + get.cnNumber(length) + "张“星”", length, player.getExpansions("qixing"), true); + } else { + event.finish(); + } + "step 2"; + player.loseToDiscardpile(result.links); + }, + ai: { combo: "qixing" }, + }, + dawu2: { + charlotte: true, + ai: { + nofire: true, + nodamage: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage") && !get.tag(card, "thunderDamage")) return "zeroplayertarget"; + }, + }, + }, + intro: { + content(storage) { + return `共有${storage.length}枚标记`; + }, + }, + }, + dawu3: { + trigger: { global: "damageBegin4" }, + filter(event, player) { + return !event.hasNature("thunder") && event.player.getStorage("dawu2").includes(player); + }, + forced: true, + charlotte: true, + logTarget: "player", + content() { + trigger.cancel(); + }, + onremove(player) { + game.countPlayer2(current => { + if (current.getStorage("dawu2").includes(player)) { + current.unmarkAuto("dawu2", [player]); + current.removeAdditionalSkill(`dawu_${player.playerid}`); + } + }, true); + }, + }, + kuangfeng: { + unique: true, + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter(event, player) { + return player.getExpansions("qixing").length; + }, + content() { + "step 0"; + player.chooseTarget(get.prompt("kuangfeng"), "令一名角色获得“狂风”标记").ai = function (target) { + return -1; + }; + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("kuangfeng", targets, "fire"); + var length = targets.length; + targets.forEach(target => { + target.addAdditionalSkill(`kuangfeng_${player.playerid}`, "kuangfeng2"); + target.markAuto("kuangfeng2", [player]); + }); + player.addTempSkill("kuangfeng3", { player: "phaseBeginStart" }); + player.chooseCardButton("选择弃置" + get.cnNumber(length) + "张“星”", length, player.getExpansions("qixing"), true); + } else { + event.finish(); + } + "step 2"; + player.loseToDiscardpile(result.links); + }, + ai: { combo: "qixing" }, + }, + kuangfeng2: { + charlotte: true, + intro: { + content(storage) { + return `共有${storage.length}枚标记`; + }, + }, + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "fireDamage") && current < 0) return 1.5; + }, + }, + }, + }, + kuangfeng3: { + trigger: { global: "damageBegin3" }, + filter(event, player) { + return event.hasNature("fire") && event.player.getStorage("kuangfeng2").includes(player); + }, + charlotte: true, + forced: true, + logTarget: "player", + content() { + trigger.num++; + }, + onremove(player) { + game.countPlayer2(current => { + if (current.getStorage("kuangfeng2").includes(player)) { + current.unmarkAuto("kuangfeng2", player); + current.removeAdditionalSkill(`kuangfeng_${player.playerid}`); + } + }, true); + }, + }, + yeyan: { + unique: true, + limited: true, + audio: 3, + enable: "phaseUse", + filterCard(card, player) { + return !ui.selected.cards.some(cardx => get.suit(cardx, player) == get.suit(card, player)); + }, + selectCard: [0, 4], + filterTarget(card, player, target) { + var length = ui.selected.cards.length; + return length == 0 || length == 4; + }, + selectTarget() { + if (ui.selected.cards.length == 4) return [1, 2]; + if (ui.selected.cards.length == 0) return [1, 3]; + game.uncheck("target"); + return [1, 3]; + }, + complexCard: true, + complexSelect: true, + line: "fire", + forceDie: true, + animationColor: "metal", + skillAnimation: "legend", + check(card) { + if (!lib.skill.yeyan.getBigFire(get.event("player"))) return -1; + return 1 / (get.value(card) || 0.5); + }, + multitarget: true, + multiline: true, + contentBefore() { + player.awakenSkill("yeyan"); + }, + content() { + "step 0"; + event.num = 0; + targets.sortBySeat(); + "step 1"; + if (cards.length == 4) event.goto(2); + else { + if (event.num < targets.length) { + targets[event.num].damage("fire", 1, "nocard"); + event.num++; + } + if (event.num == targets.length) event.finish(); + else event.redo(); + } + "step 2"; + player.loseHp(3); + if (targets.length == 1) event.goto(4); + else { + player + .chooseTarget("请选择受到2点伤害的角色", true, function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return 1; + }) + .set("forceDie", true) + .set("targets", targets); + } + "step 3"; + if (event.num < targets.length) { + var dnum = 1; + if (result.bool && result.targets && targets[event.num] == result.targets[0]) dnum = 2; + targets[event.num].damage("fire", dnum, "nocard"); + event.num++; + } + if (event.num == targets.length) event.finish(); + else event.redo(); + "step 4"; + player + .chooseControl("2点", "3点") + .set("prompt", "请选择伤害点数") + .set("ai", function () { + return "3点"; + }) + .set("forceDie", true); + "step 5"; + targets[0].damage("fire", result.control == "2点" ? 2 : 3, "nocard"); + }, + ai: { + order(item, player) { + return lib.skill.yeyan.getBigFire(player) ? 10 : 1; + }, + fireAttack: true, + result: { + target(player, target) { + if (player.hasUnknown()) return 0; + const att = get.sgn(get.attitude(player, target)); + const targets = game.filterPlayer(target => get.damageEffect(target, player, player, "fire") && (!lib.skill.yeyan.getBigFire(player) || (target.hp <= 3 && !target.hasSkillTag("filterDamage", null, { player: player })))); + if (!targets.includes(target)) return 0; + if (lib.skill.yeyan.getBigFire(player)) { + if (ui.selected.targets.length) return 0; + if (!(targets.length == 1 || (att < 0 && target.identity && target.identity.indexOf("zhu") != -1))) return 0; + } + return att * get.damageEffect(target, player, player, "fire"); + }, + }, + }, + getBigFire(player) { + if (player.getDiscardableCards(player, "h").reduce((list, card) => list.add(get.suit(card, player)), []).length < 4) return false; + const targets = game.filterPlayer(target => get.damageEffect(target, player, player, "fire") && target.hp <= 3 && !target.hasSkillTag("filterDamage", null, { player: player })); + if (!targets.length) return false; + if (targets.length == 1 || targets.some(target => get.attitude(player, target) < 0 && target.identity && target.identity.indexOf("zhu") != -1)) { + let suits = player.getDiscardableCards(player, "h").reduce((map, card) => { + const suit = get.suit(card, player); + if (!map[suit]) map[suit] = []; + return map; + }, {}), + cards = []; + Object.keys(suits).forEach(i => { + suits[i].addArray(player.getDiscardableCards(player, "h").filter(card => get.suit(card) == i)); + cards.add(suits[i].sort((a, b) => get.value(a) - get.value(b))[0]); + }); + return player.hp + player.countCards("h", card => !cards.includes(card) && player.canSaveCard(card, player)) - 3 > 0; + } + return false; + }, + }, + longhun: { + audio: 4, + group: ["longhun1", "longhun2", "longhun3", "longhun4"], + ai: { + fireAttack: true, + skillTagFilter(player, tag) { + switch (tag) { + case "respondSha": { + if (player.countCards("he", { suit: "diamond" }) < Math.max(1, player.hp)) return false; + break; + } + case "respondShan": { + if (player.countCards("he", { suit: "club" }) < Math.max(1, player.hp)) return false; + break; + } + case "save": { + if (player.countCards("he", { suit: "heart" }) < Math.max(1, player.hp)) return false; + break; + } + default: + return true; + } + }, + maixie: true, + respondSha: true, + respondShan: true, + effect: { + target(card, player, target) { + if (get.tag(card, "recover") && target.hp >= 1) return [0, 0]; + if (!target.hasFriend()) return; + if ((get.tag(card, "damage") == 1 || get.tag(card, "loseHp")) && target.hp > 1) return [0, 1]; + }, + }, + threaten(player, target) { + if (target.hp == 1) return 2; + return 0.5; + }, + }, + }, + longhun1: { + audio: true, + enable: ["chooseToUse", "chooseToRespond"], + prompt() { + return "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张红桃牌当作桃使用"; + }, + position: "hes", + check(card, event) { + if (_status.event.player.hp > 1) return 0; + return 10 - get.value(card); + }, + selectCard() { + return Math.max(1, _status.event.player.hp); + }, + viewAs: { name: "tao" }, + viewAsFilter(player) { + return player.countCards("hes", { suit: "heart" }) >= player.hp; + }, + filterCard(card) { + return get.suit(card) == "heart"; + }, + }, + longhun2: { + audio: true, + enable: ["chooseToUse", "chooseToRespond"], + prompt() { + return "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张方片当作火杀使用或打出"; + }, + position: "hes", + check(card, event) { + if (_status.event.player.hp > 1) return 0; + return 10 - get.value(card); + }, + selectCard() { + return Math.max(1, _status.event.player.hp); + }, + viewAs: { name: "sha", nature: "fire" }, + viewAsFilter(player) { + return player.countCards("hes", { suit: "diamond" }) >= player.hp; + }, + filterCard(card) { + return get.suit(card) == "diamond"; + }, + }, + longhun3: { + audio: true, + enable: ["chooseToUse", "chooseToRespond"], + prompt() { + return "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张黑桃牌当作无懈可击使用"; + }, + position: "hes", + check(card, event) { + if (_status.event.player.hp > 1) return 0; + return 7 - get.value(card); + }, + selectCard() { + return Math.max(1, _status.event.player.hp); + }, + viewAs: { name: "wuxie" }, + viewAsFilter(player) { + return player.countCards("hes", { suit: "spade" }) >= player.hp; + }, + filterCard(card) { + return get.suit(card) == "spade"; + }, + }, + longhun4: { + audio: true, + enable: ["chooseToUse", "chooseToRespond"], + prompt() { + return "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张梅花牌当作闪使用或打出"; + }, + position: "hes", + check(card, event) { + if (_status.event.player.hp > 1) return 0; + return 10 - get.value(card); + }, + selectCard() { + return Math.max(1, _status.event.player.hp); + }, + viewAsFilter(player) { + return player.countCards("hes", { suit: "club" }) >= player.hp; + }, + viewAs: { name: "shan" }, + filterCard(card) { + return get.suit(card) == "club"; + }, + }, + juejing: { + mod: { + maxHandcard(player, num) { + return 2 + num; + }, + }, + audio: true, + trigger: { player: "phaseDrawBegin2" }, + //priority:-5, + filter(event, player) { + return !event.numFixed && player.hp < player.maxHp; + }, + forced: true, + content() { + trigger.num += player.getDamagedHp(); + }, + }, + relonghun: { + audio: 2, + //技能发动时机 + enable: ["chooseToUse", "chooseToRespond"], + //发动时提示的技能描述 + prompt: "将♦牌当做杀,♥牌当做桃,♣牌当做闪,♠牌当做无懈可击使用或打出", + //动态的viewAs + viewAs(cards, player) { + if (cards.length) { + var name = false, + nature = null; + //根据选择的卡牌的花色 判断要转化出的卡牌是闪还是火杀还是无懈还是桃 + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "fire"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; + } + //返回判断结果 + if (name) return { name: name, nature: nature }; + } + return null; + }, + //AI选牌思路 + check(card) { + if (ui.selected.cards.length) return 0; + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; + var name2; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 + ) { + var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); + if (temp > max) { + max = temp; + name2 = map[name]; + } + } + } + if (name2 == get.suit(card, player)) return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); + return 0; + } + return 1; + }, + //选牌数量 + selectCard: [1, 2], + //确保选择第一张牌后 重新检测第二张牌的合法性 避免选择两张花色不同的牌 + complexCard: true, + //选牌范围:手牌区和装备区和木马 + position: "hes", + //选牌合法性判断 + filterCard(card, player, event) { + //如果已经选了一张牌 那么第二张牌和第一张花色相同即可 + if (ui.selected.cards.length) return get.suit(card, player) == get.suit(ui.selected.cards[0], player); + event = event || _status.event; + //获取当前时机的卡牌选择限制 + var filter = event._backup.filterCard; + //获取卡牌花色 + var name = get.suit(card, player); + //如果这张牌是梅花并且当前时机能够使用/打出闪 那么这张牌可以选择 + if (name == "club" && filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) return true; + //如果这张牌是方片并且当前时机能够使用/打出火杀 那么这张牌可以选择 + if (name == "diamond" && filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event)) return true; + //如果这张牌是黑桃并且当前时机能够使用/打出无懈 那么这张牌可以选择 + if (name == "spade" && filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) return true; + //如果这张牌是红桃并且当前时机能够使用/打出桃 那么这张牌可以选择 + if (name == "heart" && filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event)) return true; + //上述条件都不满足 那么就不能选择这张牌 + return false; + }, + //判断当前时机能否发动技能 + filter(event, player) { + //获取当前时机的卡牌选择限制 + var filter = event.filterCard; + //如果当前时机能够使用/打出火杀并且角色有方片 那么可以发动技能 + if (filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && player.countCards("hes", { suit: "diamond" })) return true; + //如果当前时机能够使用/打出闪并且角色有梅花 那么可以发动技能 + if (filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && player.countCards("hes", { suit: "club" })) return true; + //如果当前时机能够使用/打出桃并且角色有红桃 那么可以发动技能 + if (filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && player.countCards("hes", { suit: "heart" })) return true; + //如果当前时机能够使用/打出无懈可击并且角色有黑桃 那么可以发动技能 + if (filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && player.countCards("hes", { suit: "spade" })) return true; + return false; + }, + ai: { + respondSha: true, + respondShan: true, + //让系统知道角色“有杀”“有闪” + skillTagFilter(player, tag) { + var name; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; + } + if (!player.countCards("hes", { suit: name })) return false; + }, + //AI牌序 + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; + } + } + max /= 1.1; + return max; + } + return 2; + }, + }, + //让系统知道玩家“有无懈”“有桃” + hiddenCard(player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hs") > 0) return true; + if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; + if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; + }, + group: ["relonghun_num", "relonghun_discard"], + subSkill: { + num: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + filter(event) { + var evt = event; + return ["sha", "tao"].includes(evt.card.name) && evt.skill == "relonghun" && evt.cards && evt.cards.length == 2; + }, + content() { + trigger.baseDamage++; + }, + }, + discard: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + logTarget() { + return _status.currentPhase; + }, + autodelay(event) { + return event.name == "respond" ? 0.5 : false; + }, + filter(evt, player) { + return ["shan", "wuxie"].includes(evt.card.name) && evt.skill == "relonghun" && evt.cards && evt.cards.length == 2 && _status.currentPhase && _status.currentPhase != player && _status.currentPhase.countDiscardableCards(player, "he"); + }, + content() { + //game.log(trigger.card) + //game.log(trigger.cards) + player.line(_status.currentPhase, "green"); + player.discardPlayerCard(_status.currentPhase, "he", true); + }, + }, + }, + }, + xinlonghun: { + audio: "longhun", + enable: ["chooseToUse", "chooseToRespond"], + prompt: "将♦手牌当做火【杀】,♥手牌当做【桃】,♣手牌当做【闪】,♠手牌当做【无懈可击】使用或打出", + viewAs(cards, player) { + if (cards.length) { + var name = false, + nature = null; + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "fire"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; + } + if (name) return { name: name, nature: nature }; + } + return null; + }, + check(card) { + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; + var name2; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hs", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 + ) { + var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); + if (temp > max) { + max = temp; + name2 = map[name]; + } + } + } + if (name2 == get.suit(card, player)) return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); + return 0; + } + return 1; + }, + position: "hs", + filterCard(card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; + if (name == "diamond" && filter({ name: "sha", cards: [card], nature: "fire" }, player, event)) return true; + if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) return true; + if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; + return false; + }, + filter(event, player) { + var filter = event.filterCard; + if (filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && player.countCards("hs", { suit: "diamond" })) return true; + if (filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && player.countCards("hs", { suit: "club" })) return true; + if (filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && player.countCards("hs", { suit: "heart" })) return true; + if (filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && player.countCards("hs", { suit: "spade" })) return true; + return false; + }, + precontent() { + delete event.result.skill; + player.logSkill("longhun" + (4 - lib.suit.indexOf(get.suit(event.result.cards[0], player)))); + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + var name; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; + } + if (!player.countCards("hs", { suit: name })) return false; + }, + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hs", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; + } + } + max /= 1.1; + return max; + } + return 2; + }, + }, + hiddenCard(player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hs") > 0) return true; + if (name == "wuxie") return player.countCards("hs", { suit: "spade" }) > 0; + if (name == "tao") return player.countCards("hs", { suit: "heart" }) > 0; + }, + }, + xinjuejing: { + mod: { + maxHandcard(player, num) { + return 2 + num; + }, + }, + audio: 2, + trigger: { player: ["dying", "dyingAfter"] }, + forced: true, + content() { + player.draw(); + }, + }, + shelie: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter(event, player) { + return !event.numFixed; + }, + content() { + "step 0"; + trigger.changeToZero(); + event.cards = get.cards(5); + game.cardsGotoOrdering(event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str; + if (player == game.me && !_status.auto) { + str = "涉猎:获取花色各不相同的牌"; + } else { + 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.suit(i, false)); + var next = player.chooseButton(list.length, true); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.suit(ui.selected.buttons[i].link) == get.suit(button.link)) return false; + } + return true; + }); + next.set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + "step 2"; + if (result.bool && result.links) { + event.cards2 = result.links; + } else { + event.finish(); + } + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); + } + "step 3"; + game.broadcastAll("closeDialog", event.videoId); + var cards2 = event.cards2; + player.gain(cards2, "log", "gain2"); + }, + ai: { + threaten: 1.2, + }, + }, + gongxin: { + audio: 2, + audioname: ["re_lvmeng", "gexuan"], + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("h"); + }, + content() { + "step 0"; + var cards = target.getCards("h"); + player.chooseButton(2, ["攻心", cards, [["弃置此牌", "置于牌堆顶"], "tdnodes"]]).set("filterButton", function (button) { + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) return false; + return type == "string" || get.suit(button.link) == "heart"; + }); + "step 1"; + if (result.bool) { + if (typeof result.links[0] != "string") result.links.reverse(); + var card = result.links[1], + choice = result.links[0]; + if (choice == "弃置此牌") target.discard(card); + else { + player.showCards(card, get.translation(player) + "对" + get.translation(target) + "发动了【攻心】"); + target.lose(card, ui.cardPile, "visible", "insert"); + } + } + }, + ai: { + threaten: 1.5, + result: { + target(player, target) { + return -target.countCards("h"); + }, + }, + order: 10, + expose: 0.4, + }, + }, + nzry_longnu: { + mark: true, + locked: true, + zhuanhuanji: true, + marktext: "☯", + intro: { + content(storage, player, skill) { + if (player.storage.nzry_longnu == true) return "锁定技,出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷杀且无使用次数限制"; + return "锁定技,出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火杀且无距离限制"; + }, + }, + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + forced: true, + content() { + "step 0"; + player.changeZhuanhuanji("nzry_longnu"); + if (player.storage.nzry_longnu != true) { + player.loseMaxHp(); + } else { + player.loseHp(); + } + player.draw(); + "step 1"; + if (player.storage.nzry_longnu != true) { + player.addTempSkill("nzry_longnu_2", "phaseUseAfter"); + } else { + player.addTempSkill("nzry_longnu_1", "phaseUseAfter"); + } + }, + subSkill: { + 1: { + mod: { + cardname(card, player) { + if (get.color(card) == "red") return "sha"; + }, + cardnature(card, player) { + if (get.color(card) == "red") return "fire"; + }, + targetInRange(card) { + if (get.color(card) == "red") return true; + }, + }, + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondSha") && current < 0) return 0.6; + }, + }, + respondSha: true, + }, + }, + 2: { + mod: { + cardname(card, player) { + if (["trick", "delay"].includes(lib.card[card.name].type)) return "sha"; + }, + cardnature(card, player) { + if (["trick", "delay"].includes(lib.card[card.name].type)) return "thunder"; + }, + cardUsable(card, player) { + if (card.name == "sha" && game.hasNature(card, "thunder")) return Infinity; + }, + }, + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondSha") && current < 0) return 0.6; + }, + }, + respondSha: true, + }, + }, + }, + ai: { + fireAttack: true, + halfneg: true, + threaten: 1.05, + }, + }, + nzry_jieying: { + audio: 2, + locked: true, + global: "g_nzry_jieying", + ai: { + effect: { + target(card) { + if (card.name == "tiesuo") return "zeroplayertarget"; + }, + }, + }, + group: ["nzry_jieying_1", "nzry_jieying_2"], + subSkill: { + 1: { + audio: "nzry_jieying", + trigger: { + player: ["linkBefore", "enterGame"], + global: "phaseBefore", + }, + forced: true, + filter(event, player) { + if (event.name == "link") return player.isLinked(); + return (event.name != "phase" || game.phaseNumber == 0) && !player.isLinked(); + }, + content() { + if (trigger.name != "link") player.link(true); + else trigger.cancel(); + }, + }, + 2: { + audio: "nzry_jieying", + trigger: { + player: "phaseJieshuBegin", + }, + direct: true, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && !current.isLinked(); + }); + }, + content() { + "step 0"; + player.chooseTarget(true, "请选择【结营】的目标", function (card, player, target) { + return target != player && !target.isLinked(); + }).ai = function (target) { + return 1 + Math.random(); + }; + "step 1"; + if (result.bool) { + player.line(result.targets); + player.logSkill("nzry_jieying"); + result.targets[0].link(true); + } else { + event.finish(); + } + }, + }, + }, + }, + g_nzry_jieying: { + mod: { + maxHandcard(player, num) { + if ( + game.countPlayer(function (current) { + return current.hasSkill("nzry_jieying"); + }) > 0 && + player.isLinked() + ) + return num + 2; + }, + }, + }, + nzry_junlve: { + audio: 2, + //marktext:"军", + intro: { + content: "当前有#个标记", + }, + //mark:true, + trigger: { + player: "damageAfter", + source: "damageSource", + }, + forced: true, + content() { + player.addMark("nzry_junlve", trigger.num); + }, + ai: { + combo: "nzry_cuike", + }, + }, + nzry_cuike: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + direct: true, + content() { + "step 0"; + if (player.countMark("nzry_junlve") % 2 == 1) { + player.chooseTarget("是否发动【摧克】,对一名角色造成1点伤害?").ai = function (target) { + return -get.attitude(player, target); + }; + } else { + player.chooseTarget("是否发动【摧克】,横置一名角色并弃置其区域内的一张牌?").ai = function (target) { + return -get.attitude(player, target); + }; + } + "step 1"; + if (result.bool) { + player.logSkill("nzry_cuike", result.targets); + if (player.countMark("nzry_junlve") % 2 == 1) { + result.targets[0].damage(); + } else { + result.targets[0].link(true); + player.discardPlayerCard(result.targets[0], 1, "hej", true); + } + } + "step 2"; + if (player.countMark("nzry_junlve") > 7) { + player + .chooseBool() + .set("ai", function () { + return true; + }) + .set("prompt", "是否弃置所有“军略”标记并对所有其他角色造成1点伤害?"); + } else { + event.finish(); + } + "step 3"; + if (result.bool) { + var players = game.players.slice(0).sortBySeat(); + player.line(players); + player.removeMark("nzry_junlve", player.countMark("nzry_junlve")); + for (var i = 0; i < players.length; i++) { + if (players[i] != player) players[i].damage(); + } + } + }, + ai: { + combo: "nzry_junlve", + }, + }, + nzry_dinghuo: { + audio: 2, + limited: true, + init(player) { + player.storage.nzry_dinghuo = false; + }, + intro: { + content: "limited", + }, + unique: true, + mark: true, + skillAnimation: true, + animationColor: "metal", + enable: "phaseUse", + filter(event, player) { + return !player.storage.nzry_dinghuo && player.countMark("nzry_junlve") > 0; + }, + check(event, player) { + var num = game.countPlayer(function (current) { + return get.attitude(player, current) < 0 && current.isLinked(); + }); + return ( + player.storage.nzry_junlve >= num && + num == + game.countPlayer(function (current) { + return get.attitude(player, current) < 0; + }) + ); + }, + filterTarget(card, player, target) { + return target.isLinked(); + }, + selectTarget() { + return [1, _status.event.player.countMark("nzry_junlve")]; + }, + multiline: true, + multitarget: true, + content() { + "step 0"; + player.awakenSkill("nzry_dinghuo"); + player.storage.nzry_dinghuo = true; + "step 1"; + player.removeMark("nzry_junlve", player.countMark("nzry_junlve")); + for (var i = 0; i < targets.length; i++) { + targets[i].discard(targets[i].getCards("e")); + } + player + .chooseTarget(true, "对一名目标角色造成1点火焰伤害", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("targets", targets).ai = function () { + return 1; + }; + "step 2"; + if (result.bool) { + result.targets[0].damage("fire", "nocard"); + } + }, + ai: { + order: 1, + fireAttack: true, + combo: "nzry_junlve", + result: { + target(player, target) { + if (target.hasSkillTag("nofire")) return 0; + if (lib.config.mode == "versus") return -1; + if (player.hasUnknown()) return 0; + return get.damageEffect(target, player) - target.countCards("e"); + }, + }, + }, + }, + drlt_duorui: { + audio: 2, + init(player, skill) { + if (!player.storage.drlt_duorui) player.storage.drlt_duorui = []; + }, + trigger: { + source: "damageSource", + }, + filter(event, player) { + if (player.storage.drlt_duorui.length) return false; + return event.player.isIn() && _status.currentPhase == player; + }, + check(event, player) { + if (get.attitude(_status.event.player, event.player) >= 0) return false; + if (player.hasEnabledSlot() && !player.hasEnabledSlot(5)) return false; + return true; + }, + bannedList: ["bifa", "buqu", "gzbuqu", "songci", "funan", "xinfu_guhuo", "reguhuo", "huashen", "rehuashen", "old_guhuo", "shouxi", "xinpojun", "taoluan", "xintaoluan", "yinbing", "xinfu_yingshi", "zhenwei", "zhengnan", "xinzhengnan", "zhoufu"], + logTarget: "player", + content() { + "step 0"; + var list = []; + var listm = []; + var listv = []; + if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3]; + else listm = lib.character[trigger.player.name][3]; + if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3]; + listm = listm.concat(listv); + var func = function (skill) { + var info = get.info(skill); + if (!info || info.charlotte || info.hiddenSkill || info.zhuSkill || info.juexingji || info.limited || info.dutySkill || (info.unique && !info.gainable) || lib.skill.drlt_duorui.bannedList.includes(skill)) return false; + return true; + }; + for (var i = 0; i < listm.length; i++) { + if (func(listm[i])) list.add(listm[i]); + } + event.skills = list; + if (player.hasEnabledSlot()) { + player.chooseToDisable().ai = function (event, player, list) { + if (list.includes("equip5")) return "equip5"; + return list.randomGet(); + }; + } + "step 1"; + if (event.skills.length > 0) { + player + .chooseControl(event.skills) + .set("prompt", "请选择要获得的技能") + .set("ai", function () { + return event.skills.randomGet(); + }); + } else event.finish(); + "step 2"; + player.addTempSkills(result.control, { player: "dieAfter" }); + // player.popup(result.control,'thunder'); + player.storage.drlt_duorui = [result.control]; + player.storage.drlt_duorui_player = trigger.player; + trigger.player.storage.drlt_duorui = [result.control]; + trigger.player.addTempSkill("drlt_duorui1", { player: "phaseAfter" }); + // game.log(player,'获得了技能','#g【'+get.translation(result.control)+'】') + }, + group: ["duorui_clear"], + }, + duorui_clear: { + trigger: { global: ["phaseAfter", "dieAfter"] }, + filter(event, player) { + if (!player.storage.drlt_duorui_player || !player.storage.drlt_duorui) return false; + return player.storage.drlt_duorui_player == event.player && player.storage.drlt_duorui.length; + }, + silent: true, + forced: true, + popup: false, + content() { + player.removeSkills(player.storage.drlt_duorui[0]); + delete player.storage.drlt_duorui_player; + player.storage.drlt_duorui = []; + }, + }, + drlt_duorui1: { + init(player, skill) { + player.disableSkill(skill, player.storage.drlt_duorui); + }, + onremove(player, skill) { + player.enableSkill(skill); + }, + locked: true, + mark: true, + charlotte: true, + intro: { + content(storage, player, skill) { + var list = []; + for (var i in player.disabledSkills) { + if (player.disabledSkills[i].includes(skill)) list.push(i); + } + if (list.length) { + var str = "失效技能:"; + for (var i = 0; i < list.length; i++) { + if (lib.translate[list[i] + "_info"]) str += get.translation(list[i]) + "、"; + } + return str.slice(0, str.length - 1); + } + }, + }, + }, + drlt_zhiti: { + audio: 2, + locked: true, + group: ["drlt_zhiti_damage", "drlt_zhiti_compare", "drlt_zhiti_juedou"], + global: "g_drlt_zhiti", + subSkill: { + juedou: { + audio: "drlt_zhiti", + trigger: { + player: "juedouAfter", + target: "juedouAfter", + }, + forced: true, + filter(event, player) { + if (event.turn === player || !player.hasDisabledSlot()) return false; + const opposite = event.player === player ? event.target : event.player; + return opposite && opposite.isIn() && opposite.inRangeOf(player); + }, + content() { + player.chooseToEnable(); + }, + }, + compare: { + audio: "drlt_zhiti", + trigger: { + player: ["chooseToCompareAfter", "compareMultipleAfter"], + target: ["chooseToCompareAfter", "compareMultipleAfter"], + }, + filter(event, player) { + if (event.preserve || !player.hasDisabledSlot()) return false; + let opposite; + if (player === event.player) { + if (event.num1 > event.num2) { + opposite = event.target; + } else { + return false; + } + } else { + if (event.num1 < event.num2) { + opposite = event.player; + } else { + return false; + } + } + return opposite && opposite.isIn() && opposite.inRangeOf(player); + }, + forced: true, + content() { + player.chooseToEnable(); + }, + }, + damage: { + audio: "drlt_zhiti", + trigger: { player: "damageEnd" }, + forced: true, + filter(event, player) { + if (!player.hasDisabledSlot()) return false; + const opposite = event.source; + return opposite && opposite.isIn() && opposite.inRangeOf(player); + }, + content() { + player.chooseToEnable(); + }, + }, + }, + }, + g_drlt_zhiti: { + mod: { + maxHandcard(player, num) { + if (player.isDamaged()) + return ( + num - + game.countPlayer(function (current) { + return current != player && current.hasSkill("drlt_zhiti") && current.inRange(player); + }) + ); + }, + }, + }, + drlt_poxi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; + //return target!=player; + }, + content() { + "step 0"; + event.list1 = []; + event.list2 = []; + if (player.countCards("h") > 0) { + var chooseButton = player.chooseButton(4, ["你的手牌", player.getCards("h"), get.translation(target.name) + "的手牌", target.getCards("h")]); + } else { + var chooseButton = player.chooseButton(4, [get.translation(target.name) + "的手牌", target.getCards("h")]); + } + chooseButton.set("target", target); + chooseButton.set("ai", function (button) { + var player = _status.event.player; + var target = _status.event.target; + var ps = []; + var ts = []; + for (var i = 0; i < ui.selected.buttons.length; i++) { + var card = ui.selected.buttons[i].link; + if (target.getCards("h").includes(card)) ts.push(card); + else ps.push(card); + } + var card = button.link; + var owner = get.owner(card); + var val = get.value(card) || 1; + if (owner == target) { + if (ts.length > 1) return 0; + if (ts.length == 0 || player.hp > 3) return val; + return 2 * val; + } + return 7 - val; + }); + chooseButton.set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.suit(button.link) == get.suit(ui.selected.buttons[i].link)) return false; + } + return true; + }); + "step 1"; + if (result.bool) { + var list = result.links; + for (var i = 0; i < list.length; i++) { + if (get.owner(list[i]) == player) { + event.list1.push(list[i]); + } else { + event.list2.push(list[i]); + } + } + if (event.list1.length && event.list2.length) { + game.loseAsync({ + lose_list: [ + [player, event.list1], + [target, event.list2], + ], + discarder: player, + }).setContent("discardMultiple"); + } else if (event.list2.length) { + target.discard(event.list2); + } else player.discard(event.list1); + } + "step 2"; + if (event.list1.length + event.list2.length == 4) { + if (event.list1.length == 0) player.loseMaxHp(); + if (event.list1.length == 1) { + var evt = _status.event; + for (var i = 0; i < 10; i++) { + if (evt && evt.getParent) evt = evt.getParent(); + if (evt.name == "phaseUse") { + evt.skipped = true; + break; + } + } + player.addTempSkill("drlt_poxi1", { player: "phaseAfter" }); + } + if (event.list1.length == 3) player.recover(); + if (event.list1.length == 4) player.draw(4); + } + }, + ai: { + order: 13, + result: { + target(target, player) { + return -1; + }, + }, + }, + }, + drlt_poxi1: { + mod: { + maxHandcard(player, num) { + return num - 1; + }, + }, + }, + drlt_jieying_mark: { + marktext: "营", + intro: { + name: "营", + content: "mark", + }, + mod: { + cardUsable(card, player, num) { + if (player.hasMark("drlt_jieying_mark") && card.name == "sha") + return ( + num + + game.countPlayer(function (current) { + return current.hasSkill("drlt_jieying"); + }) + ); + }, + maxHandcard(player, num) { + if (player.hasMark("drlt_jieying_mark")) + return ( + num + + game.countPlayer(function (current) { + return current.hasSkill("drlt_jieying"); + }) + ); + }, + aiOrder(player, card, num) { + if ( + player.hasMark("drlt_jieying_mark") && + game.hasPlayer(current => { + return current.hasSkill("drlt_jieying") && get.attitude(player, current) <= 0; + }) + ) + return Math.max(num, 0) + 1; + }, + }, + audio: "drlt_jieying", + trigger: { + player: "phaseDrawBegin2", + }, + forced: true, + filter(event, player) { + return ( + !event.numFixed && + player.hasMark("drlt_jieying_mark") && + game.hasPlayer(function (current) { + return current.hasSkill("drlt_jieying"); + }) + ); + }, + content() { + trigger.num += game.countPlayer(function (current) { + return current.hasSkill("drlt_jieying"); + }); + }, + ai: { + nokeep: true, + skillTagFilter(player) { + return ( + player.hasMark("drlt_jieying_mark") && + game.hasPlayer(current => { + return current.hasSkill("drlt_jieying") && get.attitude(player, current) <= 0; + }) + ); + }, + }, + }, + drlt_jieying: { + audio: 2, + locked: false, + global: "drlt_jieying_mark", + group: ["drlt_jieying_1", "drlt_jieying_2", "drlt_jieying_3"], + subSkill: { + 1: { + audio: "drlt_jieying", + trigger: { + player: "phaseBegin", + }, + forced: true, + filter(event, player) { + return !game.hasPlayer(function (current) { + return current.hasMark("drlt_jieying_mark"); + }); + }, + content() { + player.addMark("drlt_jieying_mark", 1); + }, + }, + 2: { + audio: "drlt_jieying", + trigger: { + player: "phaseJieshuBegin", + }, + direct: true, + filter(event, player) { + return player.hasMark("drlt_jieying_mark"); + }, + content() { + "step 0"; + player.chooseTarget(get.prompt("drlt_jieying"), "将“营”交给一名角色;其摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1且手牌上限+1。该角色回合结束后,其移去“营”标记,然后你获得其所有手牌。", function (card, player, target) { + return target != player; + }).ai = function (target) { + let th = target.countCards("h"), + att = get.attitude(_status.event.player, target); + for (let i in target.skills) { + let info = get.info(i); + if (info && info.shaRelated) return Math.abs(att); + } + if (att > 0) { + if (th > 3 && target.hp > 2) return 0.6 * th; + } + if (att < 1) { + if (target.countCards("j", { name: "lebu" })) return 1 + Math.min((1.5 + th) * 0.8, target.getHandcardLimit() * 0.7); + if (!th || target.getEquip("zhangba") || target.getEquip("guanshi")) return 0; + if (!target.inRange(player) || player.countCards("hs", { name: "shan" }) > 1) return Math.min((1 + th) * 0.3, target.getHandcardLimit() * 0.2); + } + return 0; + }; + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + player.logSkill("drlt_jieying", target); + var mark = player.countMark("drlt_jieying_mark"); + player.removeMark("drlt_jieying_mark", mark); + target.addMark("drlt_jieying_mark", mark); + } + }, + ai: { + effect: { + player(card, player, target) { + if (get.name(card) === "lebu" && get.attitude(player, target) < 0) return 1 + Math.min((target.countCards("h") + 1.5) * 0.8, target.getHandcardLimit() * 0.7); + }, + }, + }, + }, + 3: { + audio: "drlt_jieying", + trigger: { + global: "phaseEnd", + }, + forced: true, + filter(event, player) { + return player != event.player && event.player.hasMark("drlt_jieying_mark") && event.player.isIn(); + }, + logTarget: "player", + content() { + if (trigger.player.countCards("h") > 0) { + trigger.player.give(trigger.player.getCards("h"), player); + } + trigger.player.removeMark("drlt_jieying_mark", trigger.player.countMark("drlt_jieying_mark")); + }, + }, + }, + }, +}; + +export default skills; diff --git a/character/extra/sort.js b/character/extra/sort.js new file mode 100644 index 000000000..03ccdc886 --- /dev/null +++ b/character/extra/sort.js @@ -0,0 +1,35 @@ +const characterSort = { + extra_feng: ["shen_guanyu", "shen_lvmeng"], + extra_huo: ["shen_zhugeliang", "shen_zhouyu"], + extra_lin: ["shen_caocao", "shen_lvbu"], + extra_shan: ["shen_zhaoyun", "shen_simayi"], + extra_yin: ["shen_liubei", "shen_luxun"], + extra_lei: ["shen_ganning", "shen_zhangliao"], + extra_key: ["key_kagari", "key_shiki", "db_key_hina"], + extra_decade: ["shen_jiangwei", "shen_machao", "shen_zhangfei", "shen_zhangjiao", "shen_dengai", "shen_xuzhu", "dc_shen_huatuo"], + extra_ol: ["ol_zhangliao", "shen_caopi", "shen_zhenji", "shen_sunquan"], + extra_mobilezhi: ["shen_guojia", "shen_xunyu"], + extra_mobilexin: ["shen_taishici", "shen_sunce"], + extra_mobileren: ["shen_huatuo", "shen_lusu"], + extra_tw: ["tw_shen_guanyu", "tw_shen_lvmeng"], + extra_offline: ["shen_diaochan", "boss_zhaoyun", "shen_dianwei", "le_shen_jiaxu"], +}; + +const characterSortTranslate = { + extra_feng: "神话再临·风", + extra_huo: "神话再临·火", + extra_lin: "神话再临·林", + extra_shan: "神话再临·山", + extra_yin: "神话再临·阴", + extra_lei: "神话再临·雷", + extra_key: "论外", + extra_ol: "神话再临OL", + extra_mobilezhi: "始计篇·智", + extra_mobilexin: "始计篇·信", + extra_mobileren: "始计篇·仁", + extra_offline: "神话再临·线下", + extra_decade: "神·武", + extra_tw: "海外服神将", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/extra/translate.js b/character/extra/translate.js new file mode 100644 index 000000000..d432b1c67 --- /dev/null +++ b/character/extra/translate.js @@ -0,0 +1,370 @@ +const translates = { + shen_luxun: "神陆逊", + shen_luxun_prefix: "神", + nzry_junlve: "军略", + nzry_junlve_info: "锁定技,当你受到或造成伤害后,你获得X个“军略”标记(X为伤害点数)。", + nzry_cuike: "摧克", + nzry_cuike_info: "出牌阶段开始时,若“军略”标记的数量为奇数,你可以对一名角色造成1点伤害;若“军略”标记的数量为偶数,你可以横置一名角色并弃置其区域内的一张牌。然后,若“军略”标记的数量超过7个,你可以移去全部“军略”标记并对所有其他角色造成1点伤害。", + nzry_dinghuo: "绽火", + nzry_dinghuo_info: "限定技,出牌阶段,你可以移去全部“军略”标记,令至多等量的已横置角色弃置所有装备区内的牌。然后,你对其中一名角色造成1点火焰伤害。", + shen_liubei: "神刘备", + shen_liubei_prefix: "神", + nzry_longnu: "龙怒", + nzry_longnu_info: "转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。", + nzry_jieying: "结营", + nzry_jieying_info: "锁定技,游戏开始时或当你的武将牌重置时,你横置;所有已横置的角色手牌上限+2;结束阶段,你横置一名其他角色。", + + shen_ganning: "神甘宁", + shen_ganning_prefix: "神", + shen_zhangliao: "神张辽", + shen_zhangliao_prefix: "神", + + drlt_poxi: "魄袭", + drlt_poxi_info: "出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可以弃置你与其手牌中的四张花色不同的牌。若如此做,根据此次弃置你的牌的数量执行以下效果:零张,扣减1点体力上限;一张,你结束出牌阶段且本回合手牌上限-1;三张,你回复1点体力;四张,你摸四张牌。", + drlt_jieying: "劫营", + drlt_jieying_info: "回合开始时,若场上没有拥有“营”标记的角色,你获得1个“营”标记;结束阶段,你可以将你的一个“营”标记交给一名角色;有“营”标记的角色摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1,手牌上限+1。有“营”的其他角色回合结束时,其移去“营”标记,然后你获得其所有手牌。", + drlt_jieying_mark: "劫营", + drlt_duorui1: "失效技能", + drlt_duorui1_bg: "锐", + drlt_duorui: "夺锐", + drlt_duorui_info: "当你于出牌阶段内对一名其他角色造成伤害后,你可以废除你装备区内的一个装备栏(若已全部废除则可以跳过此步骤),然后获得该角色的一个技能直到其的下回合结束或其死亡(觉醒技,限定技,主公技,隐匿技,使命技等特殊技能除外)。若如此做,该角色该技能失效且你不能再发动〖夺锐〗直到你失去以此法获得的技能。", + drlt_zhiti: "止啼", + drlt_zhiti_info: "锁定技。①你攻击范围内已受伤的其他角色手牌上限-1;②当你拼点或【决斗】胜利/或受到伤害后,若对方/伤害来源在你的攻击范围内,则你恢复一个装备栏。", + + shen_zhaoyun: "神赵云", + shen_zhaoyun_prefix: "神", + shen_guanyu: "神关羽", + shen_guanyu_prefix: "神", + shen_lvmeng: "神吕蒙", + shen_lvmeng_prefix: "神", + shen_simayi: "神司马懿", + shen_simayi_prefix: "神", + shen_caocao: "神曹操", + shen_caocao_prefix: "神", + shen_zhugeliang: "神诸葛亮", + shen_zhugeliang_prefix: "神", + shen_zhouyu: "神周瑜", + shen_zhouyu_prefix: "神", + shen_lvbu: "神吕布", + shen_lvbu_prefix: "神", + xinjuejing: "绝境", + xinjuejing_info: "锁定技。①你的手牌上限+2。②当你进入或脱离濒死状态时,你摸一张牌。", + relonghun: "龙魂", + relonghun_info: "你可以将同花色的一至两张牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当普【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。", + xinlonghun: "龙魂", + xinlonghun_info: "你可以将你的手牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。", + longhun: "龙魂", + longhun1: "龙魂♥︎", + longhun2: "龙魂♦︎", + longhun3: "龙魂♠︎", + longhun4: "龙魂♣︎", + juejing: "绝境", + longhun_info: "你可以将同花色的X张牌按下列规则使用或打出:红桃当【桃】,方块当具火焰伤害的【杀】,梅花当【闪】,黑桃当【无懈可击】(X为你当前的体力值且至少为1)。", + juejing_info: "锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。", + wushen: "武神", + wushen_info: "锁定技。①你的红桃手牌均视为【杀】。②你使用红桃【杀】无距离和次数限制且不可被响应。", + wuhun: "武魂", + wuhun_info: "锁定技,杀死你的角色立即进入濒死状态。", + shelie: "涉猎", + gongxin: "攻心", + gongxin_discard: "弃置", + gongxin_top: "牌堆顶", + renjie: "忍戒", + renjie2: "忍戒", + renjie_info: "锁定技,当你受到1点伤害后,你获得一枚“忍”标记;锁定技,当你于弃牌阶段内弃置牌后,你获得等同于失去的牌数量的“忍”标记。", + sbaiyin: "拜印", + sbaiyin_info: "觉醒技,准备阶段开始时,若你的“忍”标记数不小于4,你减1点体力上限,然后获得〖极略〗。", + jilue: "极略", + jilue_info: "当一名角色的判定牌生效前,你可以弃1枚“忍”标记并发动〖鬼才〗;每当你受到伤害后,你可以弃1枚“忍”标记并发动〖放逐〗;当你使用锦囊牌时,你可以弃1枚“忍”标记并发动〖集智〗;出牌阶段限一次,你可以弃1枚“忍”标记并发动〖制衡〗;出牌阶段,你可以弃1枚“忍”标记并获得〖完杀〗直到回合结束。", + jilue_guicai: "鬼才", + jilue_fangzhu: "放逐", + jilue_wansha: "完杀", + jilue_zhiheng: "制衡", + jilue_jizhi: "集智", + lianpo: "连破", + lianpo_info: "一名角色的回合结束时,若你本回合内杀死过角色,则你可以进行一个额外的回合。", + guixin: "归心", + qinyin: "琴音", + yeyan: "业炎", + shelie_info: "摸牌阶段,你可以改为从牌堆顶亮出五张牌,然后选择获得不同花色的牌各一张。", + gongxin_info: "出牌阶段限一次,你可以观看一名其他角色的手牌,并可以展示其中一张红桃牌,然后将其弃置或置于牌堆顶。", + guixin_info: "当你受到1点伤害后,你可以获得每名其他角色区域里的一张牌,然后你翻面。", + guixin_info_alter: "当你受到1点伤害后,你可以随机获得每名其他角色区域里的一张牌,然后你翻面。", + qinyin_info: "弃牌阶段结束时,若你于此阶段内弃置过两张或更多的牌,则你可以选择一项:1. 令所有角色各回复1点体力;2. 令所有角色各失去1点体力。", + // qinyin_info:'每当你于弃牌阶段内因你的弃置而失去第X张手牌时(X至少为2),你可以选择一项:1.令所有角色各回复1点体力;2.令所有角色各失去1点体力。每阶段限一次。', + yeyan_info: "限定技,出牌阶段,你可以对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。", + qixing: "七星", + qixing_bg: "星", + qixing2: "七星", + qixing3: "七星", + qixing_info: "游戏开始时,你将牌堆顶的七张牌置于你的武将牌上,称之为“星”。然后/摸牌阶段结束后,你可用任意数量的手牌等量交换这些“星”。", + dawu: "大雾", + dawu2_bg: "雾", + dawu2: "大雾", + dawu3: "大雾", + // dawu2_info:'已获得大雾标记', + dawu_info: "结束阶段,你可以弃置X张“星”并指定等量的角色:直到你的下回合开始,当这些角色受到非雷电伤害时,防止此伤害。", + kuangfeng: "狂风", + kuangfeng2: "狂风", + kuangfeng2_bg: "风", + // kuangfeng2_info:'已获得狂风标记', + kuangfeng3: "狂风", + kuangfeng_info: "结束阶段,你可以弃置1张“星”并指定一名角色:直到你的下回合开始,该角色受到火焰伤害时,此伤害+1。", + baonu: "狂暴", + baonu_bg: "暴", + baonu_info: "锁定技,游戏开始时,你获得两枚“暴怒”标记;锁定技,当你造成/受到1点伤害后,你获得1枚“暴怒”标记。", + shenfen: "神愤", + shenfen_info: "限定技,出牌阶段,你可以弃置6枚暴怒标记,对场上所有其他角色造成1点伤害,然后令其弃置四张牌。", + wuqian: "无前", + wuqian_info: "出牌阶段,你可以弃置两枚暴怒标记并获得技能〖无双〗直到回合结束。", + wumou: "无谋", + wumou_info: "锁定技,当你使用普通锦囊牌时,你选择一项:1.弃置1枚“暴怒”标记;2.失去1点体力。", + ol_wuqian: "无前", + ol_wuqian_info: "出牌阶段,你可以弃置2枚“暴怒”标记并选择一名本回合内未选择过的其他角色,你获得技能〖无双〗并令其防具无效直到回合结束。", + ol_shenfen: "神愤", + ol_shenfen_info: "出牌阶段限一次,你可以弃置6枚“暴怒”标记并选择所有其他角色,对这些角色各造成1点伤害。然后这些角色先各弃置其装备区里的牌,再各弃置四张手牌。最后你将你的武将牌翻面。", + new_wuhun: "武魂", + new_wuhun_info: "锁定技,当你受到伤害后,伤害来源获得X个“梦魇”标记(X为伤害点数)。锁定技,当你死亡时,你选择一名“梦魇”标记数量最多的其他角色。该角色进行判定:若判定结果不为【桃】或【桃园结义】,则该角色死亡。", + new_guixin: "归心", + new_guixin_info: "当你受到1点伤害后,你可以按照你选择的区域优先度随机获得每名其他角色区域里的一张牌,然后你翻面。", + ol_zhangliao: "OL神张辽", + ol_zhangliao_prefix: "OL神", + olduorui: "夺锐", + olduorui2: "夺锐", + olduorui_info: "当你于出牌阶段内对一名角色造成伤害后,你可以选择该角色武将牌上的一个技能。若如此做,你结束出牌阶段,且你令此技能于其下个回合结束之前无效。", + olzhiti: "止啼", + olzhiti_info: "锁定技,你攻击范围内已受伤角色的手牌上限-1。若场上已受伤的角色数:不小于1,你的手牌上限+1;不小于3,你于摸牌阶段开始时令额定摸牌数+1;不小于5,回合结束时,你废除一名角色的一个随机装备栏。", + shen_caopi: "神曹丕", + shen_caopi_prefix: "神", + chuyuan: "储元", + chuyuan_info: "一名角色受到伤害后,若你武将牌上「储」的数量小于体力上限,你可以令其摸一张牌。然后其将一张手牌置于你的武将牌上,称为「储」。", + //chuyuan_info:'一名角色受到伤害后,你可以令其摸一张牌。然后其将一张手牌置于你的武将牌上,称为「储」。你的手牌上限+X(X为你武将牌上的「储」数)。', + dengji: "登极", + dengji_info: "觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后获得技能〖天行〗和〖奸雄〗。", + tianxing: "天行", + tianxing_info: "觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后失去技能〖储元〗,选择获得以下技能中的一个:〖仁德〗/〖制衡〗/〖乱击〗/〖行动〗。", + shen_zhenji: "神甄宓", + shen_zhenji_prefix: "神", + shenfu: "神赋", + shenfu_info: "回合结束时,若你的手牌数为:奇数,你可对一名其他角色造成1点雷属性伤害。若其因此进入过濒死状态,你可重复此流程(不能选择本次已选择过的角色)。偶数,你可选择一名角色,你令其摸一张牌或弃置一张手牌。若其手牌数等于体力值,你可重复此流程(不能选择本次已选择过的角色)。", + qixian: "七弦", + qixian_info: "锁定技,你的手牌上限视为7。", + caopi_xingdong: "行动", + caopi_xingdong_info: "出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。", + shen_diaochan: "神貂蝉", + shen_diaochan_prefix: "神", + meihun: "魅魂", + meihun_info: "结束阶段或当你成为【杀】的目标后,你可以令一名其他角色交给你一张你声明的花色的手牌,若其没有则你观看其手牌然后弃置其中一张。", + huoxin_control: "惑心", + huoxin: "惑心", + huoxin_info: "出牌阶段限一次,你可以展示两张花色相同的手牌并分别交给两名其他角色,然后令这两名角色拼点,没赢的角色获得1个“魅惑”标记。拥有2个或更多“魅惑”的角色回合即将开始时,该角色移去其所有“魅惑”,此回合改为由你操控。", + boss_zhaoyun: "高达一号", + boss_zhaoyun_ab: "神赵云", + boss_zhaoyun_prefix: "神", + boss_juejing: "绝境", + boss_juejing2: "绝境", + boss_juejing_info: "锁定技,摸牌阶段开始前,你跳过此阶段。当你得到牌/失去手牌后,若你的手牌数大于4/小于4,则你将手牌摸至4张/弃置至4张。", + zhanjiang: "斩将", + zhanjiang_info: "准备阶段开始时,如果其他角色的装备区内有【青釭剑】,你可以获得之。", + shen_guojia: "神郭嘉", + shen_guojia_prefix: "神", + shuishi: "慧识", + shuishi_info: "出牌阶段限一次,若你的体力上限小于10,则你可选择一名角色。你令其摸一张牌,若其以此法得到的牌:与该角色的其他手牌花色均不相同,则你加1点体力上限,若你的体力上限小于10,则你可以重复此流程;否则你减1点体力上限,且其展示所有手牌。", + stianyi: "天翊", + stianyi_info: "觉醒技,准备阶段,若场上的所有存活角色均于本局游戏内受到过伤害,则你加2点体力上限并回复1点体力,然后令一名角色获得技能〖佐幸〗。", + zuoxing: "佐幸", + zuoxing2: "佐幸", + zuoxing_info: "出牌阶段限一次,若令你获得〖佐幸〗的角色存活且体力上限大于1,则你可以令其减1点体力上限,并视为使用一张普通锦囊牌。", + sghuishi: "辉逝", + sghuishi_info: "限定技,出牌阶段,你可以选择一名其他角色:若其有未发动过的觉醒技,则你令其发动这些觉醒技时无视原有条件;否则其摸四张牌。然后你减2点体力上限。", + shen_taishici: "神太史慈", + shen_taishici_prefix: "神", + dulie: "笃烈", + dulie_info: "锁定技。当你成为【杀】的目标时,若使用者的体力值大于你,则你进行判定。若结果为红桃,则取消此目标。", + tspowei: "破围", + tspowei_info: "使命技。①游戏开始时,你令所有其他角色获得一个“围”。②一名角色受到伤害后,若其有“围”,则其移去“围”。③回合开始时,你选择所有有“围”的角色。这些角色失去“围”,然后这些角色的第一个不为你的下家获得等量的“围”。④一名其他角色的回合开始时,若其有“围”,则你可以选择一项:⒈弃置一张手牌并对其造成1点伤害。⒉若其体力值不大于你,则你获得其一张手牌。选择完成后,你视为在其攻击范围内直到回合结束。⑤使命:回合开始时,若场上没有“围”,则你获得技能〖神著〗。⑥失败:当你进入濒死状态时,你将体力值回复至1点,然后弃置装备区的所有牌。", + shenzhu: "神著", + shenzhu_info: "锁定技,当你使用有对应实体牌的非转化【杀】结算结束后,你选择一项:①摸一张牌,且本回合使用【杀】的次数上限+1。②摸三张牌,且本回合不能再使用【杀】。", + dangmo: "荡魔", + dangmo_info: "当你于出牌阶段内使用第一张【杀】选择目标后,你可以为此牌增加至多Y-1个目标(Y为你的体力值)。", + reshuishi: "慧识", + reshuishi_info: "出牌阶段限一次。若你的体力上限小于10,你可进行判定牌不置入弃牌堆的判定。若判定结果与本次发动技能时的其他判定结果的花色均不相同且你的体力上限小于10,则你加1点体力上限,且可以重复此流程。然后你将所有位于处理区的判定牌交给一名角色。若其手牌数为全场最多,则你减1点体力上限。", + resghuishi: "辉逝", + resghuishi_info: "限定技,出牌阶段,你可选择一名角色。若你的体力上限不小于存活人数且其有未发动的觉醒技,则你令其中一个技能无视发动条件;否则其摸四张牌。然后你减2点体力上限。", + qizhengxiangsheng: "奇正相生", + qizhengxiangsheng_info: "出牌阶段,对一名其他角色使用。你将目标角色标记为“奇兵”或“正兵”(对其他角色不可见)。然后目标角色可以打出一张【杀】或【闪】。若其是“奇兵”且未打出【杀】,则你对其造成1点伤害;若其是“正兵”且未打出【闪】,则你获得其一张牌。", + shen_xunyu: "神荀彧", + shen_xunyu_prefix: "神", + tianzuo: "天佐", + tianzuo_info: "锁定技。①游戏开始时,你将8张【奇正相生】加入牌堆。②【奇正相生】对你无效。", + lingce: "灵策", + lingce_info: "锁定技。当有【奇正相生】或智囊或〖定汉①〗记录过的锦囊牌被使用时,若此牌不为转化牌且对应实体牌数量为1,则你摸一张牌。", + dinghan: "定汉", + dinghan_info: "①当你成为未记录过的普通锦囊牌的目标时,或有未记录过的延时锦囊牌进入你的判定区时,你记录此牌名并取消之。②准备阶段,你可在〖定汉①〗的记录中添加或减少一种锦囊牌的牌名。", + shen_sunce: "神孙策", + shen_sunce_prefix: "神", + yingba: "英霸", + yingba_info: "①出牌阶段限一次,你可令一名体力上限大于1的其他角色减少1点体力上限并获得“平定”标记,然后你减少1点体力上限。②你对拥有“平定”标记的角色使用牌没有距离限制。", + scfuhai: "覆海", + scfuhai_info: "锁定技。①当你使用牌指定目标后,若目标角色有“平定”标记,则其不可响应此牌。若你本回合内以此法得到的牌数小于2,则你摸一张牌。②拥有“平定”标记的角色死亡时,你增加X点体力上限并摸X张牌。(X为其拥有的“平定”标记数)。", + pinghe: "冯河", + pinghe_info: "锁定技。①你的手牌上限基数等于你已损失的体力值。②当你受到其他角色造成的伤害时,若你有牌且你的体力上限大于1,则你防止此伤害,减1点体力上限并将一张手牌交给一名其他角色。然后若你拥有〖英霸〗,则伤害来源获得一个“平定”标记。", + shen_jiangwei: "神姜维", + shen_jiangwei_prefix: "神", + jiufa: "九伐", + jiufa_info: "①当你声明使用牌后或打出牌时,你记录此牌的牌名。②当你使用或打出的牌结算结束后,若你的〖九伐〗记录中包含至少⑨种不同的牌名,则你可以亮出牌堆顶的⑨张牌,选择并获得其中任意张点数各不相同且{这九张牌中存在未被选择且和已选择的牌点数相同}的牌,清除所有的记录,将其余牌置入弃牌堆。", + tianren: "天任", + tianren_info: "锁定技。①当有一张基本牌或普通锦囊牌不因使用而进入弃牌堆后,你获得一枚“天任”标记。②当你获得“天任”标记或体力上限变化后,若你的“天任”数不小于X,则你移去X枚“天任”,加1点体力上限并摸两张牌(X为你的体力上限)。", + pingxiang: "平襄", + pingxiang_info: "限定技。出牌阶段,若你的体力上限大于⑨,则你可减⑨点体力上限,视为使用至多⑨张火【杀】,然后失去〖九伐〗,并将手牌上限基数改为体力上限直到游戏结束。", + shen_sunquan: "神孙权", + shen_sunquan_prefix: "神", + dili: "帝力", + dili_info: '锁定技。游戏开始时,你随机获得一条东吴命运线。', + yuheng: "驭衡", + yuheng_info: '①出牌阶段限一次。你可以失去所有不为〖驭衡〗的非锁定技,然后随机获得全部东吴命运线涉及的一个技能。若你本阶段内没有发动过其他非锁定技,则你随机获得当前东吴命运线涉及的一个内容。②出牌阶段结束时,若你未于本阶段内发动过〖驭衡①〗,则你失去1点体力。', + yuheng_append: '天下英雄谁敌手?曹刘。生子当如孙仲谋!', + dili_shengzhi: "圣质", + dili_shengzhi_info: "锁定技。若你因〖驭衡〗获得过〖英魂〗〖弘德〗〖秉壹〗,则当你使用点数为质数的牌时,此牌不可被响应。", + dili_chigang: "持纲", + dili_chigang_info: "锁定技。若你因〖驭衡〗获得过〖观微〗〖弼政〗〖安国〗,则当你的判定阶段开始前,你跳过此阶段并获得一个额外的摸牌阶段。", + dili_qionglan: "穹览", + dili_qionglan_info: '锁定技,限定技。若你因〖驭衡〗获得过〖涉猎〗〖问卦〗〖博图〗,则当你发动的〖驭衡〗结算结束后,你随机获得两条其他东吴命运线。', + dili_quandao: "权道", + dili_quandao_info: "锁定技。若你因〖驭衡〗获得过〖制衡〗〖诫训〗〖安恤〗,则你手牌区内点数为字母的牌的牌名视为【调剂盐梅】。", + dili_jiaohui: "交辉", + dili_jiaohui_info: "锁定技。若你因〖驭衡〗获得过〖下书〗〖结姻〗〖缔盟〗,且你的手牌数为1,则此牌的牌名视为【远交近攻】。", + dili_yuanlv: "渊虑", + dili_yuanlv_info: "锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜江〗,则当你成为自己使用的不为【长安大舰】的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。", + changandajian_equip1: "长安大舰", + changandajian_equip2: "长安大舰", + changandajian_equip3: "长安大舰", + changandajian_equip4: "长安大舰", + changandajian_equip5: "长安大舰", + changandajian_equip6: "长安大舰", + changandajian_destroy: "长安大舰", + changandajian_equip1_info: "锁定技。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip2_info: "锁定技。当你失去装备区内的【长安大舰】后,你销毁之并回复1点体力。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip3_info: "锁定技。其他角色至你的距离+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip4_info: "锁定技。你至其他角色的距离-2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip5_info: "锁定技。你的手牌上限+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip6_info: "锁定技。你至其他角色的距离-2,其他角色至你的距离+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + shen_machao: "神马超", + shen_machao_prefix: "神", + shouli: "狩骊", + shouli_backup: "狩骊", + shouli_info: "①锁定技,游戏开始时,你令场上所有角色从你的下家起,依次使用牌堆中的一张不为赠物的坐骑牌。②你可以将场上的一张进攻坐骑牌当做【杀】(无任何次数限制),防御坐骑牌当做【闪】使用或打出。若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。", + hengwu: "横骛", + hengwu_info: "当你使用或打出有花色的牌时,若你的手牌区内没有与此牌花色相同的牌,则你可以摸X张牌(X为场上装备区内花色与此牌相同的牌数)。", + hengwu_append: '棘手,怀念,摧毁!', + + key_kagari: "篝", + kagari_zongsi: "纵丝", + kagari_zongsi_info: "出牌阶段限一次,你可以选择一张不在游戏外的牌,然后将其置于牌堆/弃牌堆的顶部/底部或一名角色的对应区域内。", + key_shiki: "神山识", + key_shiki_ab: "神山识", + shiki_omusubi: "御结", + shiki_omusubi_info: "一轮游戏开始时,你可以减1点体力上限,然后将一名其他角色武将牌上的技能加入到你的武将牌上。", + shiki_omusubi_append: '来吧,羽依里。用你的手,让我变成那只真正的鬼吧!', + db_key_hina: "佐藤雏", + hina_shenshi: "神视", + hina_shenshi_yingbian: "神视", + hina_shenshi_info: "神势力技。出牌阶段开始时/结束时,你可摸两张牌,然后将其中一张牌置于牌堆顶。你以此法得到的牌视为拥有全部应变效果,且可以无条件发动。", + hina_xingzhi: "幸凪", + hina_xingzhi_info: "键势力技。每回合限一次,你可以通过“助战”触发一张牌的全部应变效果,且响应助战的角色摸两张牌。", + tw_shen_guanyu: "TW神关羽", + tw_shen_guanyu_prefix: "TW神", + twwushen: "武神", + twwushen_info: "锁定技。①你的♥手牌均视为普【杀】。②你于每阶段使用的第一张【杀】不可被响应。③你使用♥【杀】无距离和次数限制。④当你使用♥【杀】选择目标后,你令所有拥有“梦魇”标记的角色均成为此【杀】的目标。", + twwuhun: "武魂", + twwuhun_info: "锁定技。①当你受到其他角色造成的1点伤害后,你令伤害来源获得1枚“梦魇”标记。②当你对有“梦魇”标记的其他角色造成伤害后,你令其获得一枚“梦魇”标记。③当你死亡时,你可进行判定。若结果不为【桃】或【桃园结义】,则你选择至少一名拥有“梦魇”标记的角色。令这些角色各自失去X点体力(X为其“梦魇”标记数)。", + shen_zhangfei: "神张飞", + shen_zhangfei_prefix: "神", + shencai: "神裁", + shencai_info: "出牌阶段限一次,你可以令一名其他角色进行判定。你获得此判定牌,然后若此判定牌:包含以下要素中的任意一个,则其失去已有的下列效果,并获得对应的效果:{⒈体力:当其受到伤害后,其失去等量的体力、⒉武器:其不能使用牌响应【杀】、⒊打出:当其失去手牌后,其再随机弃置一张手牌(不嵌套触发)、⒋距离:其的结束阶段开始时,其翻面};若均不包含,你获得其区域里的一张牌,其获得一枚“死”并获得如下效果:其的角色手牌上限-X、其的回合结束时,若X大于场上存活人数,则其死亡(X为其“死”标记数)。", + xunshi: "巡使", + xunshi_info: "锁定技。①你手牌区内所有的多目标锦囊牌均视为花色为none的普【杀】。②你使用颜色为none的牌无距离和次数限制。③当你使用无颜色的牌选择目标后,你令你的〖神裁〗的发动次数上限+1(至多为5),然后可以为此牌增加任意个目标。", + shen_zhangjiao: "神张角", + shen_zhangjiao_prefix: "神", + yizhao: "异兆", + yizhao_info: "锁定技。当你使用或打出牌时,你获得等同于此牌点数枚“黄”标记。然后若“黄”的十位数发生变化,你获得牌堆中一张点数为你“黄”的十位数的牌。", + sijun: "肆军", + sijun_info: "准备阶段,若“黄”数大于牌堆的牌数,你可以移去所有“黄”并洗牌,然后随机获得任意张点数之和为36的牌。", + sanshou: "三首", + sanshou_info: "当你受到伤害时,你可以亮出牌堆顶三张牌。若其中有本回合未被使用过的牌的类型,防止此伤害。", + tianjie: "天劫", + tianjie_info: "一名角色的回合结束时,若本回合牌堆洗过牌,你可以选择至多三名其他角色。你依次对每名目标角色造成X点雷电伤害(X为其手牌中【闪】的数量,至少为1)。", + tw_shen_lvmeng: "TW神吕蒙", + tw_shen_lvmeng_prefix: "TW神", + twshelie: "涉猎", + twshelie_info: "①摸牌阶段,你可放弃摸牌并亮出牌堆顶的五张牌,然后选择获得其中每种花色的牌各一张。②每轮限一次。结束阶段,若你本回合使用的花色数不小于你的体力值,你执行一个额外的摸牌阶段或出牌阶段。", + twgongxin: "攻心", + twgongxin2: "攻心", + twgongxin_info: "出牌阶段限一次。你可以观看一名其他角色的手牌,然后你可以展示其中一张牌并选择一项:1.弃置此牌;2.将此牌置于牌堆顶。若该角色手牌中的花色数因此减少,你选择一种颜色,其于本回合不能使用或打出该颜色的牌。", + shen_dengai: "神邓艾", + shen_dengai_prefix: "神", + dctuoyu: "拓域", + dctuoyu_fengtian: "丰田", + dctuoyu_qingqu: "清渠", + dctuoyu_junshan: "峻山", + dctuoyu_fengtian_tag: '丰田', + dctuoyu_qingqu_tag: '清渠', + dctuoyu_junshan_tag: '峻山', + dctuoyu_info: "①锁定技。当你使用拥有对应副区域标签的牌时,你令此牌获得对应效果。
    丰田:伤害值或回复值+1;清渠:无次数和距离限制;峻山:不可被响应。②出牌阶段开始时和结束时,你给你的手牌分配对应的已激活副区域标签(每个区域至多五张)。", + dcxianjin: "险进", + dcxianjin_info: "锁定技。当你每造成或受到两次伤害后,你激活一个副区域标签并摸X张牌(X为你已激活的副区域数,若你的手牌数为全场最多则改为摸一张牌)。", + dcqijing: "奇径", + dcqijing_info: "觉醒技。一名角色的回合结束后,若你的三个副区域标签均被激活,则你减1点体力上限,获得〖摧心〗,将座位移动至两名相邻的其他角色之间并执行一个额外回合。", + dccuixin: "摧心", + dccuixin_info: "当你不因此技能使用的基本牌或普通锦囊牌结算结束后,若此牌的目标于你使用此牌指定第一个目标时包含你的上家或下家,则你可以视为对下家或上家再使用一张牌名和元素相同的牌。", + shen_dianwei: "神典韦", + shen_dianwei_prefix: "神", + juanjia: "捐甲", + juanjia_info: "锁定技。游戏开始时,你废除一个防具栏,然后获得一个额外的武器栏。", + qiexie: "挈挟", + qiexie_info: "锁定技。准备阶段,你在剩余武将牌堆中随机观看五张牌,选择其中的任意张,将其按照如下规则转化为武器牌置入你的武器栏:{⒈此牌不具有花色,且其攻击范围和点数等于此武将牌的体力上限。⒉此武器牌的技能为该武将牌上所有描述中包含“【杀】”且不具有锁定技以外的标签的技能。⒊此武器牌离开你的装备区时,改为放回武将牌堆。}", + cuijue: "摧决", + cuijue_info: "每回合每名角色限一次。出牌阶段,你可以弃置一张牌,然后对攻击范围内距离最远的一名其他角色造成1点伤害(没有则不选)。", + le_shen_jiaxu: "神贾诩", + le_shen_jiaxu_prefix: "神", + jxlianpo: "炼魄", + jxlianpo_info: "锁定技。①若场上最大阵营为:反贼,其他角色的手牌上限-1,所有角色使用【杀】的次数上限和攻击范围+1;主忠,其他角色不能对其以外的角色使用【桃】。若有多个最大阵营,其他角色死亡后,来源摸两张牌或回复1点体力。②一轮游戏开始时,你展示一张未加入游戏或已死亡角色的身份牌,本轮视为该身份对应阵营的角色数+1。", + jxzhaoluan: "兆乱", + jxzhaoluan_info: "限定技。一名角色死亡前,若其此次进入过濒死状态,你可以取消之,令其加3点体力上限并失去所有非锁定技,回复体力至3点,摸四张牌。然后你获得如下效果:出牌阶段,你可以令一名成为过你〖兆乱〗目标的角色减1点体力上限,然后对一名此阶段未以此法选择过的角色造成1点伤害。", + shen_huatuo: "手杀神华佗", + shen_huatuo_prefix: "手杀神", + wuling: "五灵", + wuling_info: "①出牌阶段限两次。你可以选择一名没有“五禽戏”的角色,按照你选择的顺序向其传授“五禽戏”,且其获得如下效果:其获得你选择的第一种“五禽戏”的效果,并在其每个准备阶段移除当前“五禽戏”的效果并切换为下一种。②当你死亡时,你令场上的角色失去你传授的“五禽戏”。", + wuling_wuqinxi: "五禽戏", + wuling_wuqinxi_info: "
  • “五禽戏”分为“虎、鹿、熊、猿、鹤”五个不同的效果:" + "
  • 虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。" + "
  • 鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。" + "
  • 熊:每回合限一次,当你受到伤害时,此伤害-1。" + "
  • 猿:当你获得此效果时,你选择一名其他角色,获得其装备区里的一张牌。" + "
  • 鹤:当你获得此效果时,你摸三张牌。", + youyi: "游医", + youyi_info: "①弃牌阶段结束时,你可以将所有于此阶段弃置的牌置入仁区。②出牌阶段限一次。你可以将仁区的所有牌置入弃牌堆,令所有角色各回复1点体力。", + shen_lusu: "神鲁肃", + shen_lusu_prefix: "神", + dingzhou: "定州", + dingzhou_info: "出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数)。", + tamo: "榻谟", + tamo_info: "游戏开始时,你可以重新分配除主公外所有角色的座次。", + tamo_info_doudizhu: "游戏开始时,你可以重新分配除三号位角色外所有角色的座次。", + tamo_faq: "FAQ", + tamo_faq_info: "
  • Q:在一号位不为主公的情况下,〖榻谟〗如何结算?
  • A:该角色可以正常进行座次交换。若受此技能影响导致一号位角色发生了变化,则以排列后的一号位角色为起始角色开始本局游戏。
  • ", + zhimeng: "智盟", + zhimeng_info_identity: "回合结束后,你可以选择一名其他角色。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", + zhimeng_info: "回合结束后,你可以选择一名手牌数不大于Y的其他角色(Y为你的手牌数+1)。若如此做,你与其将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", + shen_xuzhu: "神许褚", + shen_xuzhu_prefix: "神", + zhengqing: "争擎", + zhengqing_info: "锁定技。一轮游戏开始时,你移去所有角色的“擎”标记,令上一轮于一回合内造成伤害值最多的角色各获得X枚“擎”,且你与这些角色各摸一张牌(X为这些角色该回合内造成的伤害值)。若该角色为你且本次获得的“擎”数为本局游戏最多的一次,你改为摸X张牌(至多摸五张)。", + zhuangpo: "壮魄", + zhuangpo_info: "你可以将牌名为【杀】或牌面信息中包含“【杀】”的牌当【决斗】使用,然后你获得如下效果:1.当此【决斗】指定目标后,若你有“擎”,你可以移去任意枚“擎”,令目标角色弃置等量的牌;2.当你造成渠道为此牌的伤害时,若此牌的所有目标角色中存在有“擎”的角色,此伤害+1。", + dc_shen_huatuo: "神华佗", + dc_shen_huatuo_prefix: "神", + jingyu: "静域", + jingyu_info: "锁定技。每个技能每轮限一次,当一名角色发动不为〖静域〗的技能时,你摸一张牌。", + lvxin: "滤心", + lvxin_info: "出牌阶段限一次。你可以交给一名其他角色一张手牌并选择一项:⒈令其摸X张牌;⒉令其随机弃置X张手牌(X为游戏轮数,至多为5)。然后若其以此法得到/弃置了与你交给其的牌牌名相同的牌,其于其下次发动技能时回复/失去1点体力。", + huandao: "寰道", + huandao_info: "限定技。出牌阶段,你可以选择一名其他角色。你令其复原武将牌,系统随机生成一个与其同名的武将的武将牌上的一个与其拥有的技能均不同名的技能。其可以选择获得此技能,然后选择失去一个其他技能。", +}; + +export default translates; diff --git a/character/extra/voices.js b/character/extra/voices.js new file mode 100644 index 000000000..cd5cd10ca --- /dev/null +++ b/character/extra/voices.js @@ -0,0 +1,222 @@ +export default { + "#jingyu1": "人身疾苦,与我无异。", + "#jingyu2": "医以济世,其术贵在精诚。", + "#lvxin1": "放下执念,将心寄与沧海。", + "#lvxin2": "医病非难,难在医人之心。", + "#huandao1": "一语一默,道尽医者慈悲。", + "#huandao2": "亦急亦缓,抚平世间苦难。", + "#dc_shen_huatuo:die": "世无良医,枉死者半。", + "#zhengqing1": "锐势夺志,斩将者虎候是也!", + "#zhengqing2": "三军争勇,擎纛者舍我其谁!", + "#zhuangpo1": "腹吞龙虎,气撼山河!", + "#zhuangpo2": "神魄凝威,魍魉辟易!", + "#shen_xuzhu:die": "猛虎归林晚,不见往来人……", + "#dingzhou1": "今肃亲往,主公何愁不定!", + "#dingzhou2": "肃之所至,万事皆平!", + "#tamo1": "天下分崩,乱之已极,肃竭浅智,窃为君计。", + "#tamo2": "天下易主,已为大势,君当据此,以待其时。", + "#zhimeng1": "豫州何图远窜,而不投吾雄略之主乎?", + "#zhimeng2": "吾主英明神武,曹众虽百万亦无所惧!", + "#shen_lusu:die": "常计小利,何成大局……", + "#wuling1": "吾创五禽之戏,君可作以除疾。", + "#wuling2": "欲解万般苦,驱身仿五灵。", + "#youyi1": "此身行医,志济万千百姓。", + "#youyi2": "普济众生,永免疾患之苦。", + "#shen_huatuo:die": "人间诸疾未解,老夫怎入轮回……", + "#jxlianpo1": null, + "#jxlianpo2": null, + "#jxzhaoluan1": null, + "#jxzhaoluan2": null, + "#le_shen_jiaxu:die": null, + "#juanjia": null, + "#juanjia1": "尚攻者弃守,其提双刃,斩万敌!", + "#juanjia2": "舍衣事力,提兵驱敌!", + "#qiexie": null, + "#qiexie1": "今挟双戟搏战,定护主公太平!", + "#qiexie2": "吾乃典韦是也,谁敢向前,谁敢向前!", + "#cuijue": null, + "#cuijue1": "当锋摧决,贯遐洞坚!", + "#cuijue2": "殒身不恤,死战成仁!", + "#shen_dianwei:die": "主公快走!", + "#dctuoyu1": "本尊目之所及,皆为麾下王土。", + "#dctuoyu2": "擎五丁之神力,碎万仞之高山。", + "#dcxianjin1": "大风!大雨!大景!!", + "#dcxianjin2": "行役沙场,不战胜,则战死!", + "#dcqijing1": "今神兵于天降,贯奕世之长虹!", + "#dcqijing2": "辟罗浮之险径,捣伪汉之黄龙!", + "#shen_dengai:die": "灭蜀者,邓氏士载也!", + "#shelie1": "略懂,略懂。", + "#shelie2": "什么都略懂一点,生活更多彩一些。", + "#gongxin1": "攻城为下,攻心为上。", + "#gongxin2": "我替施主把把脉。", + "#tw_shen_lvmeng:die": "终是逃不开,追魂索命之咒。", + "#yizhao1": "苍天已死,此黄天当立之时。", + "#yizhao2": "甲子尚水,显炎汉将亡之兆。", + "#sijun1": "联九州黎庶,撼一家之王庭。", + "#sijun2": "吾以此身为药,欲医天下之疾。", + "#sanshou1": "三公既现,领大道而立黄天。", + "#sanshou2": "天地三才,载厚德以驱魍魉。", + "#tianjie1": "苍天既死,贫道当替天行道。", + "#tianjie2": "贫道张角,请大汉赴死!", + "#shen_zhangjiao:die": "诸君唤我为贼,然我所窃何物?", + "#shencai1": "我有三千炼狱,待汝万世轮回!", + "#shencai2": "纵汝王侯将相,亦须俯首待裁!", + "#xunshi1": "秉身为正,辟易万邪!", + "#xunshi2": "巡御两界,路寻不平!", + "#shen_zhangfei:die": "尔等,欲复斩我头乎?", + "#wushen1": "鬼龙斩月刀!", + "#wushen2": "千里追魂,一刀索命。", + "#twwuhun1": "不杀此人,何以雪恨?", + "#twwuhun2": "还我头来!", + "#tw_shen_guanyu:die": "夙愿已了,魂归地府。", + "#shouli1": "赤骊骋疆,巡狩八荒!", + "#shouli2": "长缨在手,百骥可降!", + "#hengwu1": "横枪立马,独啸秋风!", + "#hengwu2": "世皆彳亍,唯我纵横!", + "#shen_machao:die": "离群之马,虽强亦亡……", + "#yuheng1": "权术妙用,存乎一心。", + "#yuheng2": "威权之道,皆在于衡。", + "#dili1": "身处巅峰,览天下大事。", + "#dili2": "位居至尊,掌至高之权。", + "#shen_sunquan:die": "困居江东,枉称至尊……", + "#jiufa1": "九伐中原,以圆先帝遗志。", + "#jiufa2": "日日砺剑,相报丞相厚恩。", + "#tianren1": "举石补苍天,舍我更复其谁?", + "#tianren2": "天地同协力,何愁汉道不昌?", + "#pingxiang1": "策马纵慷慨,捐躯抗虎豺。", + "#pingxiang2": "解甲事仇雠,竭力挽狂澜。", + "#shen_jiangwei:die": "武侯遗志,已成泡影矣……", + "#kagari_zongsi": null, + "#kagari_zongsi1": null, + "#kagari_zongsi2": null, + "#key_kagari:die": null, + "#shiki_omusubi1": "始めるんだ、神山識。", + "#shiki_omusubi2": "大切な人を守るために…!", + "#key_shiki:die": "ありがとう、羽依里君…", + "#hina_shenshi": null, + "#hina_shenshi1": null, + "#hina_shenshi2": null, + "#hina_xingzhi": null, + "#hina_xingzhi1": null, + "#hina_xingzhi2": null, + "#db_key_hina:die": null, + "#yingba1": "从我者可免,拒我者难容!", + "#yingba2": "卧榻之侧,岂容他人鼾睡!", + "#scfuhai1": "翻江复蹈海,六合定乾坤!", + "#scfuhai2": "力攻平江东,威名扬天下!", + "#pinghe1": "不过胆小鼠辈,吾等有何惧哉!", + "#pinghe2": "只可得胜而返,岂能败战而归!", + "#shen_sunce:die": "无耻小人!竟敢暗算于我……", + "#tianzuo1": "此时进之多弊,守之多利,愿主公熟虑。", + "#tianzuo2": "主公若不时定,待四方生心,则无及矣。", + "#lingce1": "绍士卒虽众,其实难用,必无为也。", + "#lingce2": "袁军不过一盘砂砾,主公用奇则散。", + "#dinghan1": "杀身有地,报国有时。", + "#dinghan2": "益国之事,虽死弗避。", + "#shen_xunyu:die": "宁鸣而死,不默而生……", + "#dulie1": "素来言出必践,成吾信义昭彰!", + "#dulie2": "小信如若不成,大信将以何立?", + "#tspowei1": "弓马骑射洒热血,突破重围显英豪!", + "#tspowei2": "敌军尚犹严防,有待明日再看!", + "#tspowei3": "君且城中等候,待吾探敌虚实。", + "#shen_taishici:die": "魂归……天地……", + "#shuishi1": "聪以知远,明以察微。", + "#shuishi2": "见微知著,识人心智。", + "#stianyi1": "天命靡常,惟德是辅。", + "#stianyi2": "可成吾志者,必此人也!", + "#sghuishi1": "以聪虑难,悉咨于上。", + "#sghuishi2": "奉孝不才,愿献勤心。", + "#shen_guojia:die": "可叹桢干命也迂……", + "#meihun1": "这个和这个不要,其他全给我吧~", + "#meihun2": "嗯~~妾身就是喜欢这些,给我嘛~", + "#huoxin1": "一笑倾城,一眼惑心~", + "#huoxin2": "哎呀~妾身~能有什么坏心思呢?", + "#shen_diaochan:die": "纵使消逝,妾影长存……", + "#wuhun21": "生当啖汝之肉!", + "#wuhun22": "死当追汝之魂!", + "#shen_guanyu:die": "我还会回来的……", + "#xinjuejing1": "背水一战,不胜便死!", + "#xinjuejing2": "置于死地,方能后生!", + "#relonghun1": "能屈能伸,才是大丈夫!", + "#relonghun2": "常山赵子龙在此!", + "#shen_zhaoyun:die": "龙身虽死,魂魄不灭!", + "#qixing1": "伏望天恩,誓讨汉贼!", + "#qixing2": "祈星辰之力,佑我蜀汉!", + "#kuangfeng1": "万事俱备,只欠业火。", + "#kuangfeng2": "风~~起~~", + "#dawu1": "此计可保你一时平安。", + "#dawu2": "此非万全之策,唯惧天雷。", + "#shen_zhugeliang:die": "今当远离,临表涕零,不知所言……", + "#shen_lvmeng:die": "劫数难逃,我们别无选择……", + "#yeyan1": "(急促的琴声、燃烧声)", + "#yeyan2": "(燃烧声)聆听吧,这献给你的镇魂曲!", + "#yeyan3": "(燃烧声)让这熊熊业火,焚尽你的罪恶!", + "#qinyin1": "(急促的琴声、燃烧声)", + "#qinyin2": "(舒缓的琴声)", + "#shen_zhouyu:die": "逝者不死,浴火……重生……", + "#renjie21": "忍一时,风平浪静。", + "#renjie22": "退一步,海阔天空。", + "#sbaiyin1": "老骥伏枥,志在千里!", + "#sbaiyin2": "烈士暮年,壮心不已!", + "#lianpo1": "受命于天,既寿永昌!", + "#lianpo2": "一鼓作气,破敌致胜!", + "#shen_simayi:die": "鼎足三分已成梦,一切都结束了……", + "#guixin1": "山不厌高,海不厌深!", + "#guixin2": "周公吐哺,天下归心!", + "#feiying": null, + "#feiying1": null, + "#feiying2": null, + "#shen_caocao:die": "腾蛇乘雾,终为土灰。", + "#baonu1": "嗯~~~~~!", + "#baonu2": "哼!", + "#wumou1": "哪个说我有勇无谋?!", + "#wumou2": "不管这些了!", + "#ol_wuqian1": "看我神威,无坚不摧!", + "#ol_wuqian2": "天王老子也保不住你!", + "#ol_shenfen1": "凡人们,颤抖吧!这是神之怒火!", + "#ol_shenfen2": "这,才是活生生的地狱!", + "#shen_lvbu:die": "我在修罗炼狱,等着你们,呃哈哈哈哈哈~", + "#nzry_longnu1": "龙怒降临,岂是尔等凡人可抗?", + "#nzry_longnu2": "龙意怒火,汝皆不能逃脱。", + "#nzry_jieying1": "桃园结义,营一世之交。", + "#nzry_jieying2": "结草衔环,报兄弟大恩。", + "#shen_liubei:die": "桃园依旧,来世再结……", + "#nzry_junlve1": "文韬武略兼备,方可破敌如破竹。", + "#nzry_junlve2": "军略绵腹,制敌千里。", + "#nzry_cuike1": "摧敌心神,克敌计谋。", + "#nzry_cuike2": "克险摧难,军略当先。", + "#nzry_dinghuo1": "绽东吴业火,烧敌军数千!", + "#nzry_dinghuo2": "业火映东水,吴志绽敌营!", + "#shen_luxun:die": "东吴业火,终究熄灭…", + "#drlt_duorui1": "夺敌军锐气,杀敌方士气。", + "#drlt_duorui2": "尖锐之势,吾亦可一人夺之!", + "#drlt_zhiti1": "娃闻名止啼,孙损十万休。", + "#drlt_zhiti2": "江东小儿,安敢啼哭?", + "#shen_zhangliao:die": "我也有……被孙仲谋所伤之时?", + "#drlt_poxi1": "夜袭敌军,挫其锐气。", + "#drlt_poxi2": "受主知遇,袭敌不惧。", + "#drlt_jieying1": "劫营速战,措手不及。", + "#drlt_jieying2": "裹甲衔枚,劫营如入无人之境。", + "#shen_ganning:die": "吾不能奉主,谁辅主基业?", + "#ol_zhangliao:die": "真的没想到……", + "#chuyuan1": "储君之位,囊中之物。", + "#chuyuan2": "此役,我之胜。", + "#dengji1": "登高位,享极乐。", + "#dengji2": "今日,便是我称帝之时。", + "#shen_caopi:die": "曹魏锦绣,孤还未看尽……", + "#shenfu1": "河洛之神,诗赋可抒。", + "#shenfu2": "云神鱼游,罗扇掩面。", + "#qixian": null, + "#qixian1": null, + "#qixian2": null, + "#shen_zhenji:die": "众口铄金,难证吾清……", + "#juejing": "龙战于野,其血玄黄。", + "#longhun1": "潜龙于渊,涉灵愈伤。", + "#longhun2": "千里一怒,红莲灿世。", + "#longhun3": "金甲映日,驱邪祛秽。", + "#longhun4": "腾龙行云,首尾不见。", + "#zhanjiang": null, + "#zhanjiang1": null, + "#zhanjiang2": null, + "#boss_zhaoyun:die": "血染鳞甲,龙坠九天。", +}; diff --git a/character/huicui.js b/character/huicui.js deleted file mode 100644 index 70bb922cb..000000000 --- a/character/huicui.js +++ /dev/null @@ -1,16579 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "huicui", - connect: true, - character: { - wupu: ["male", "qun", 4, ["dcduanti", "dcshicao"]], - dc_caoshuang: ["male", "wei", 4, ["dcjianzhuan", "dcfanshi"]], - zangba: ["male", "wei", 4, ["rehengjiang"]], - dc_simashi: ["male", "wei", 3, ["dcsanshi", "dczhenrao", "dcchenlve"]], - dc_wangling: ["male", "wei", 4, ["dcjichou", "dcmouli"], ["clan:太原王氏"]], - dc_jiangji: ["male", "wei", 3, ["dcshiju", "dcyingshi"]], - gongsunxiu: ["male", "qun", 4, ["dcgangu", "dckuizhen"]], - dc_liuli: ["male", "shu", 3, ["dcfuli", "dcdehua"]], - yue_daqiao: ["female", "wu", 3, ["dcqiqin", "dczixi"]], - dc_kongrong: ["male", "qun", 3, ["dckrmingshi", "lirang"]], - dc_sp_menghuo: ["male", "qun", 4, ["dcmanwang"]], - dc_lingcao: ["male", "wu", "4/5", ["dcdufeng"]], - yue_xiaoqiao: ["female", "wu", 3, ["dcqiqin", "dcweiwan"]], - dc_dongzhao: ["male", "wei", 3, ["dcyijia", "dcdingji"]], - kuaiqi: ["male", "wei", 3, ["dcliangxiu", "dcxunjie"]], - yue_caiyong: ["male", "qun", 3, ["dcjiaowei", "dcfeibai"]], - pangshanmin: ["male", "wei", 3, ["dccaisi", "dczhuoli"]], - dc_jiachong: ["male", "wei", 3, ["dcbeini", "dcshizong"]], - dc_sunchen: ["male", "wu", 4, ["dczigu", "dczuowei"]], - dc_zhangmancheng: ["male", "qun", 4, ["dclvecheng", "dczhongji"]], - yue_zhoufei: ["female", "wu", 3, ["dclingkong", "dcxianshu"]], - dc_wuban: ["male", "shu", 4, ["dcyouzhan"], ["clan:陈留吴氏"]], - yue_caiwenji: ["female", "qun", 3, ["dcshuangjia", "dcbeifen"]], - liuchongluojun: ["male", "qun", 3, ["dcminze", "dcjini"]], - yuechen: ["male", "wei", 4, ["dcporui", "dcgonghu"]], - zhangkai: ["male", "qun", 4, ["dcxiangshu"]], - gaoxiang: ["male", "shu", 4, ["dcchiying"]], - yuanyin: ["male", "qun", 3, ["dcmoshou", "dcyunjiu"]], - dongwan: ["female", "qun", 3, ["dcshengdu", "dcjieling"]], - zhangchu: ["female", "qun", 3, ["dcjizhong", "dcrihui", "dcguangshi"]], - peiyuanshao: ["male", "qun", 4, ["dcmoyu"]], - mengjie: ["male", "qun", 3, ["dcyinlu", "dcyouqi"]], - dc_huojun: ["male", "shu", 4, ["dcgue", "dcsigong"]], - dc_sunhanhua: ["female", "wu", 3, ["dchuiling", "dcchongxu"]], - dc_sunziliufang: ["male", "wei", 3, ["dcqinshen", "dcweidang"]], - yuantanyuanxiyuanshang: ["male", "qun", 4, ["dcneifa"]], - qiaorui: ["male", "qun", 4, ["dcaishou", "dcsaowei"]], - xianglang: ["male", "shu", 3, ["dckanji", "dcqianzheng"]], - qinlang: ["male", "wei", 4, ["dchaochong", "dcjinjin"]], - furongfuqian: ["male", "shu", "4/6", ["dcxuewei", "dcyuguan"]], - zhenghun: ["male", "wei", 3, ["dcqiangzhi", "dcpitian"]], - dc_zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "dcqingren", "dclongyuan"]], - dc_huanghao: ["male", "shu", 3, ["dcqinqing", "huisheng", "dccunwei"]], - liupi: ["male", "qun", 4, ["dcjuying"]], - dc_sp_jiaxu: ["male", "wei", 3, ["zhenlue", "dcjianshu", "dcyongdi"]], - leibo: ["male", "qun", 4, ["dcsilve", "dcshuaijie"]], - gongsundu: ["male", "qun", 4, ["dczhenze", "dcanliao"]], - panghui: ["male", "wei", 5, ["dcyiyong"]], - dc_yuejiu: ["male", "qun", 4, ["dccuijin"]], - chenjiao: ["male", "wei", 3, ["dcxieshou", "dcqingyan", "dcqizi"]], - wanglie: ["male", "qun", 3, ["dcchongwang", "dchuagui"]], - chengui: ["male", "qun", 3, ["dcyingtu", "dccongshi"]], - dc_huangquan: ["male", "shu", 3, ["dcquanjian", "dctujue"]], - yinfuren: ["female", "wei", 3, ["dcyingyu", "dcyongbi"]], - dc_lvkuanglvxiang: ["male", "wei", 4, ["dcshuhe", "dcliehou"]], - guanhai: ["male", "qun", 4, ["suoliang", "qinbao"]], - huzhao: ["male", "qun", 3, ["midu", "xianwang"]], - dc_liuba: ["male", "shu", 3, ["dczhubi", "dcliuzhuan"]], - zhangxun: ["male", "qun", 4, ["suizheng"]], - zongyu: ["male", "shu", 3, ["zyqiao", "chengshang"]], - dc_jiling: ["male", "qun", 4, ["dcshuangren"]], - dc_yanghu: ["male", "wei", 3, ["dcdeshao", "dcmingfa"]], - caimaozhangyun: ["male", "wei", 4, ["lianzhou", "jinglan"]], - tenggongzhu: ["female", "wu", 3, ["xingchong", "liunian"]], - dc_huangchengyan: ["male", "qun", 3, ["dcjiezhen", "dczecai", "dcyinshi"]], - dc_gaolan: ["male", "qun", 4, ["xizhen"]], - guanning: ["male", "qun", "3/7", ["dunshi"]], - dc_jiben: ["male", "qun", 3, ["xunli", "zhishi", "lieyi"]], - mamidi: ["male", "qun", "4/6", ["bingjie", "zhengding"]], - re_dengzhi: ["male", "shu", 3, ["jianliang", "weimeng"]], - fengxi: ["male", "wu", 3, ["yusui", "boyan"]], - re_miheng: ["male", "qun", 3, ["rekuangcai", "reshejian"]], - re_chendeng: ["male", "qun", 3, ["refuyuan", "reyingshui", "rewangzu"]], - wanniangongzhu: ["female", "qun", 3, ["zhenge", "xinghan"]], - re_xunchen: ["male", "qun", 3, ["refenglve", "anyong"], ["clan:颍川荀氏"]], - re_kanze: ["male", "wu", 3, ["xiashu", "rekuanshi"]], - lvlingqi: ["female", "qun", 4, ["guowu", "zhuangrong"]], - zhanghu: ["male", "wei", 4, ["cuijian", "zhtongyuan"]], - luyusheng: ["female", "wu", 3, ["zhente", "zhiwei"]], - huaxin: ["male", "wei", 3, ["spwanggui", "xibing"]], - mengyou: ["male", "qun", 5, ["manyi", "dcmanzhi"]], - liuyong: ["male", "shu", 3, ["zhuning", "fengxiang"]], - dc_sunru: ["female", "wu", 3, ["xiecui", "youxu"]], - xiahoulingnv: ["female", "wei", 4, ["fuping", "weilie"]], - zhangyao: ["female", "wu", 3, ["yuanyu", "xiyan"]], - tengyin: ["male", "wu", 3, ["chenjian", "xixiu"]], - zhangxuan: ["female", "wu", 4, ["tongli", "shezang"]], - wangtao: ["female", "shu", 3, ["huguan", "yaopei"]], - wangyue: ["female", "shu", 3, ["huguan", "mingluan"]], - zhaoyan: ["female", "wu", 3, ["jinhui", "qingman"]], - heyan: ["male", "wei", 3, ["yachai", "qingtan"]], - re_sunluyu: ["female", "wu", 3, ["remeibu", "remumu"]], - re_dongbai: ["female", "qun", 3, ["relianzhu", "rexiahui"]], - zhoushan: ["male", "wu", 4, ["dcmiyun", "dcdanying"]], - dc_caiyang: ["male", "wei", 4, ["dcxunji", "dcjiaofeng"]], - xiahoujie: ["male", "wei", 5, ["liedan", "zhuangdan"]], - caoxing: ["male", "qun", 4, ["cxliushi", "zhanwan"]], - re_chunyuqiong: ["male", "qun", 4, ["recangchu", "reliangying", "reshishou"]], - xingdaorong: ["male", "qun", "4/6", ["xuxie"]], - re_panfeng: ["male", "qun", 4, ["xinkuangfu"]], - jiangfei: ["male", "shu", 3, ["dcshengxi", "dcshoucheng"]], - }, - characterSort: { - huicui: { - sp_baigei: [ - "re_panfeng", - "xingdaorong", - "caoxing", - "re_chunyuqiong", - "xiahoujie", - "dc_caiyang", - "zhoushan", - ], - sp_caizijiaren: [ - "dc_kongrong", - "re_dongbai", - "re_sunluyu", - "heyan", - "zhaoyan", - "wangtao", - "wangyue", - "zhangxuan", - "tengyin", - "zhangyao", - "xiahoulingnv", - "dc_sunru", - "pangshanmin", - "kuaiqi", - ], - sp_zhilan: [ - "dc_liuli", - "liuyong", - "wanniangongzhu", - "zhanghu", - "lvlingqi", - "tenggongzhu", - "panghui", - "dc_zhaotongzhaoguang", - "yuantanyuanxiyuanshang", - "yuechen", - "dc_lingcao", - ], - sp_guixin: [ - "zangba", - "re_kanze", - "re_chendeng", - "caimaozhangyun", - "dc_lvkuanglvxiang", - "dc_gaolan", - "yinfuren", - "chengui", - "chenjiao", - "dc_sp_jiaxu", - "qinlang", - "dc_dongzhao", - ], - sp_daihan: [ - "mamidi", - "dc_jiling", - "zhangxun", - "dc_yuejiu", - "leibo", - "qiaorui", - "dongwan", - "yuanyin", - ], - sp_jianghu: ["guanning", "huzhao", "dc_huangchengyan", "mengjie", "wanglie"], - sp_zongheng: [ - "huaxin", - "luyusheng", - "re_xunchen", - "re_miheng", - "fengxi", - "re_dengzhi", - "dc_yanghu", - "zongyu", - ], - sp_taiping: ["guanhai", "liupi", "peiyuanshao", "zhangchu", "zhangkai", "dc_zhangmancheng"], - sp_yanhan: [ - "dc_liuba", - "dc_huangquan", - "furongfuqian", - "xianglang", - "dc_huojun", - "gaoxiang", - "dc_wuban", - "jiangfei", - ], - sp_jishi: ["dc_jiben", "zhenghun", "dc_sunhanhua", "liuchongluojun", "wupu"], - sp_raoting: ["dc_huanghao", "dc_sunziliufang", "dc_sunchen", "dc_jiachong"], - sp_yijun: ["gongsundu", "mengyou", "dc_sp_menghuo", "gongsunxiu"], - sp_zhengyin: ["yue_caiwenji", "yue_zhoufei", "yue_caiyong", "yue_xiaoqiao", "yue_daqiao"], - sp_zhonghu: ["dc_jiangji", "dc_wangling", "dc_simashi", "dc_caoshuang"], - }, - }, - /** @type { importCharacterConfig['skill'] } */ - skill: { - //吴普 - dcduanti: { - audio: 2, - trigger: { - player: ["useCardAfter", "respondAfter"], - }, - forced: true, - filter(event, player) { - const number = game - .getAllGlobalHistory("everything", evt => { - if (evt.player !== player) return false; - return ["useCard", "respond"].includes(evt.name); - }) - .indexOf(event); - return number >= 0 && (number + 1) % 5 === 0; - }, - onremove: true, - async content(event, trigger, player) { - await player.recover(); - if (player.countMark("dcduanti") >= 5) return; - player.addMark("dcduanti", 1, false); - await player.gainMaxHp(); - }, - }, - dcshicao: { - audio: 2, - enable: "phaseUse", - onremove: ["dcshicao_aiRecord"], - chooseButton: { - dialog(event, player) { - return ui.create.dialog("###识草###选择一种类型与要摸牌的来源", [["basic", "trick", "equip"].map(type => [type, get.translation(type)]), "tdnodes"], [["牌堆顶", "牌堆底"], "tdnodes"]); - }, - check(button) { - const aiStorage = get.player().getStorage("dcshicao_aiRecord"); - if (aiStorage.length > 0 && get.name(ui.cardPile.lastChild, false) === get.name(aiStorage.lastItem, false)) { - if (button.link === "牌堆底" || button.link === get.type2(aiStorage.lastItem, false)) return 20; - } - if (button.link === "牌堆顶" || button.link === "basic") return 10; - return 5 + Math.random(); - }, - filter(button, player) { - if (!ui.selected.buttons.length) return true; - return ui.selected.buttons[0].parentNode != button.parentNode; - }, - select: 2, - backup(links, player) { - return { - audio: "dcshicao", - type: links[0], - pos: links[1], - filterCard: () => false, - selectCard: -1, - async content(event, trigger, player) { - let { type, pos } = lib.skill.dcshicao_backup; - game.log(player, "声明了", `#y${get.translation(type)}牌`); - const next = player.draw(); - const bottom = pos === "牌堆底"; - if (bottom) { - next.set("bottom", true); - if (player.getStorage("dcshicao_aiRecord").length > 0) { - player.storage.dcshicao_aiRecord.pop(); - } - } - const drawnCards = await next.forResult(); - if (get.type2(drawnCards[0], player) === type) return; - let cards; - if (bottom) { - cards = get.bottomCards(2); - cards.reverse(); - } else cards = get.cards(2); - await game.cardsGotoOrdering(cards); - await player.viewCards(`${bottom ? "牌堆顶" : "牌堆底"}的两张牌(靠左的在牌堆更靠上)`, cards); - if (bottom) { - cards.reverse(); - delete player.storage.dcshicao_aiRecord; - } else { - player.storage.dcshicao_aiRecord = cards.slice(); - } - await game.cardsGotoPile(cards, bottom ? "insert" : null); - player.tempBanSkill("dcshicao"); - }, - ai: { - result: {player: 1}, - }, - }; - }, - prompt(links, player) { - return `点击“确定”,从${links[1]}摸一张牌`; - }, - }, - subSkill: { - backup: {}, - }, - ai: { - order: 8, - result:{ - player: 1, - }, - }, - }, - //新杀曹爽 - dcjianzhuan: { - audio: 2, - trigger: { player: "useCard" }, - filter(event, player) { - const evtx = event.getParent("phaseUse"); - return ( - player.isPhaseUsing() && - player.getHistory("useSkill", (evt) => { - return evt.skill == "dcjianzhuan" && evt.event.getParent("phaseUse") == evtx; - }).length < - 4 - player.getStorage("dcjianzhuan").length - ); - }, - forced: true, - derivation: "dcjianzhuan_faq", - async content(event, trigger, player) { - const evtx = event.getParent("phaseUse"), - num = player.getHistory("useSkill", (evt) => { - return evt.skill == "dcjianzhuan" && evt.event.getParent("phaseUse") == evtx; - }).length, - info = get.info("dcjianzhuan").choices; - let choices = [], - choiceList = [], - map = {}; - for (const i in info) { - map[info[i].intro] = i; - if ( - player.getStorage("dcjianzhuan").includes(i) || - player.getStorage("dcjianzhuan_used").includes(i) - ) - continue; - choices.push(info[i].intro); - choiceList.push(info[i].introx(num)); - } - const { - result: { control }, - } = await player - .chooseControl(choices) - .set("choiceList", choiceList) - .set("ai", () => { - const player = get.event("player"), - num = get.event("num"), - info = get.info("dcjianzhuan").choices; - let choices = get.event("controls").slice(), - map = get.event("map"); - return choices.sort( - (a, b) => - info[map[b]].ai_effect(player, num) - info[map[a]].ai_effect(player, num) - )[0]; - }) - .set("num", num) - .set("map", map) - .set("prompt", "渐专:请选择一项执行"); - if (control) { - if (!player.storage.dcjianzhuan_used) { - player.when("phaseUseAfter").then(() => delete player.storage.dcjianzhuan_used); - } - player.markAuto("dcjianzhuan_used", [map[control]]); - await info[map[control]].content(player, num); - } - }, - choices: { - discard_target: { - intro: "拆牌", - introx: (num) => "令一名角色弃置" + num + "张牌", - weight: 1, - ai_effect(player, num) { - return game.hasPlayer((target) => { - return get.effect(target, { name: "guohe_copy2" }, player, player) > 0; - }) - ? 2 + num - : 0; - }, - async content(player, num = 1) { - const { - result: { bool, targets }, - } = await player - .chooseTarget("令一名角色弃置" + num + "张牌", true) - .set("ai", (target) => { - return ( - get.effect( - target, - { name: "guohe_copy2" }, - get.event("player"), - get.event("player") - ) * - Math.sqrt( - Math.min( - get.event("num"), - target.countDiscardableCards(target, "he") - ) - ) - ); - }) - .set("num", num); - if (bool) { - const target = targets[0]; - player.line(target); - await target.chooseToDiscard(num, "he", true); - } - }, - }, - draw_self: { - intro: "摸牌", - introx: (num) => "摸" + num + "张牌", - weight: 1, - ai_effect(player, num) { - return 3; - }, - async content(player, num = 1) { - await player.draw(num); - }, - }, - recast_self: { - intro: "重铸", - introx: (num) => "重铸" + num + "张牌", - weight: 1, - ai_effect(player, num) { - return 1; - }, - async content(player, num = 1) { - if (!player.hasCard(lib.filter.cardRecastable, "he")) return; - const { - result: { bool, cards }, - } = await player - .chooseCard("重铸" + num + "张牌", "he", num, lib.filter.cardRecastable, true) - .set("ai", lib.skill.zhiheng.check); - if (bool) await player.recast(cards); - }, - }, - discard_self: { - intro: "弃牌", - introx: (num) => "弃置" + num + "张牌", - weight: "90%", - ai_effect(player, num) { - let cards = player.getCards("hs"); - cards.sort((a, b) => get.value(b) - get.value(a)); - cards = cards.slice(0, -Math.min(num, cards.length)); - return cards.some((card) => player.hasValueTarget(card, true, true)) ? 4 : -4; - }, - async content(player, num = 1) { - await player.chooseToDiscard(num, "he", true); - }, - }, - }, - group: "dcjianzhuan_remove", - subSkill: { - remove: { - audio: "dcjianzhuan", - trigger: { player: "phaseUseEnd" }, - filter(event, player) { - if (player.getStorage("dcjianzhuan").length >= 4) return false; - return ( - player.getStorage("dcjianzhuan_used").length >= - 4 - player.getStorage("dcjianzhuan").length - ); - }, - forced: true, - async content(event, trigger, player) { - const info = get.info("dcjianzhuan").choices; - let map = {}; - let unfixedWeightTotal = 0, - remainedWeight = 100; - let entries = []; - for (const i in info) { - const infox = info[i]; - map[infox.intro] = i; - if (player.getStorage("dcjianzhuan").includes(i)) continue; - let weight = (infox.weight || 1).toString(); - if (weight.endsWith("%")) { - weight = Math.min(remainedWeight, parseInt(weight.slice(0, -1))); - entries.push([infox.intro, weight]); - remainedWeight -= weight; - } else { - weight = parseInt(weight); - unfixedWeightTotal += weight; - entries.push([infox.intro, -weight]); - } - } - entries = entries.map((entry) => { - let weight = entry[1]; - if (weight < 0) weight = (-remainedWeight / unfixedWeightTotal) * weight; - return [entry[0], weight]; - }); - let rand = Math.random() * 100; - let removeChoice = entries.find((entry) => { - rand -= entry[1]; - return rand < 0; - })[0]; - if (get.isLuckyStar(player) && Object.keys(entries).includes("弃牌")) - removeChoice = "弃牌"; - player.markAuto("dcjianzhuan", [map[removeChoice]]); - player.popup(removeChoice); - game.log(player, "移去了", "#g" + removeChoice, "项"); - }, - }, - }, - mark: true, - intro: { - markcount(storage) { - return 4 - (storage || []).length; - }, - content(storage) { - if (!(storage || []).length) return "暂未移去任何项"; - const info = get.info("dcjianzhuan").choices; - let str = ""; - for (const i of storage) { - str += info[i].intro; - str += "、"; - } - str = str.slice(0, -1); - return "已移去" + str + "项"; - }, - }, - }, - dcfanshi: { - unique: true, - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return 4 - player.getStorage("dcjianzhuan").length < 2; - }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - async content(event, trigger, player) { - player.awakenSkill("dcfanshi"); - const info = get.info("dcjianzhuan").choices; - let choices = []; - for (const i in info) { - if (!player.getStorage("dcjianzhuan").includes(i)) choices.push(i); - } - if (choices.length) { - for (const choice of choices) { - for (let i = 1; i <= 3; i++) { - await info[choice].content(player, 1); - } - } - } - await player.gainMaxHp(2); - await player.recover(2); - await player.changeSkills(["dcfudou"], ["dcjianzhuan"]); - }, - derivation: "dcfudou", - ai: { - combo: "dcjianzhuan" - }, - }, - dcfudou: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - if (event.targets.length != 1 || event.target == player) return false; - const color = get.color(event.card); - if (!["black", "red"].includes(color)) return false; - const damage = event.target.getAllHistory( - "sourceDamage", - (evt) => evt.player == player - ).length; - return Math.min(1, damage) == (color == "black"); - }, - check(event, player) { - const color = get.color(event.card); - if (color == "red") return get.attitude(player, event.target) > 0; - if ( - player.getHp() + - player.countCards("hs", (card) => player.canSaveCard(card, player)) <= - 1 - ) - return false; - return ( - get.effect(player, { name: "losehp" }, player, player) >= - get.effect(event.target, { name: "losehp" }, player, player) - ); - }, - prompt2(event, player) { - return ( - "与" + - get.translation(event.target) + - "各" + - (get.color(event.card) == "black" ? "失去1点体力" : "摸一张牌") - ); - }, - logTarget: "target", - async content(event, trigger, player) { - const color = get.color(trigger.card), - target = trigger.target; - if (color == "red") { - await player.draw("nodelay"); - await target.draw(); - } else { - await player.loseHp(); - await target.loseHp(); - } - }, - }, - //司马师 - dcsanshi: { - audio: 2, - trigger: { global: "roundStart" }, - forced: true, - filter(event, player) { - return game.roundNumber === 1; - }, - group: ["dcsanshi_gain", "dcsanshi_directHit"], - async content(event, trigger, player) { - const recordedNumbers = []; - let num = get.rand(0, ui.cardPile.childNodes.length - 1); - for (let i = 0; i < ui.cardPile.childNodes.length; i++) { - let j = i + num; - if (j >= ui.cardPile.childNodes.length) j -= ui.cardPile.childNodes.length; - const card = ui.cardPile.childNodes[j], - number = get.number(card, false); - if (!recordedNumbers.includes(number)) { - recordedNumbers.add(number); - card.storage.dcsanshi = true; - num = get.rand(0, ui.cardPile.childNodes.length - 1); - } - } - player.addSkill("dcsanshi_mark"); - }, - subSkill: { - gain: { - audio: "dcsanshi", - trigger: { global: "phaseEnd" }, - filter(event, player) { - return game.hasGlobalHistory("cardMove", (evt) => { - if (evt.name == "lose") { - if (evt.position !== ui.discardPile) return false; - } else if (evt.name !== "cardsDiscard") return false; - if (lib.skill.dcsanshi_gain.notUseOrRespond(evt, player)) { - return evt.cards.some((card) => { - return card.storage.dcsanshi && get.position(card) === "d"; - }); - } - return false; - }); - }, - forced: true, - notUseOrRespond(event, player) { - if (event.name !== "cardsDiscard") return true; - const evtx = event.getParent(); - if (evtx.name !== "orderingDiscard") return true; - const evt2 = evtx.relatedEvent || evtx.getParent(); - return !["useCard", "respond"].includes(evt2.name) || evt2.player !== player; - }, - async content(event, trigger, player) { - const cards = []; - game.checkGlobalHistory("cardMove", (evt) => { - if (evt.name == "lose") { - if (evt.position !== ui.discardPile) return false; - } else if (evt.name !== "cardsDiscard") return false; - if (lib.skill.dcsanshi_gain.notUseOrRespond(evt, player)) { - cards.addArray( - evt.cards.filter((card) => { - return card.storage.dcsanshi && get.position(card) === "d"; - }) - ); - } - }); - if (cards.length) player.gain(cards, "gain2"); - }, - }, - directHit: { - audio: "dcsanshi", - trigger: { player: "useCard" }, - forced: true, - filter(event, player) { - return ( - event.cards && - event.cards.some((card) => { - return card.storage.dcsanshi; - }) - ); - }, - async content(event, trigger, player) { - trigger.directHit.addArray(game.filterPlayer()); - game.log(trigger.card, "不可被响应"); - }, - }, - mark: { - trigger: { - player: "gainEnd", - global: "loseAsyncEnd", - }, - forced: true, - popup: false, - silent: true, - lastDo: true, - filter(event, player) { - if ( - !["dcsanshi", "dcchenlve"].every((skill) => - player.hasSkill(skill, null, false, false) - ) - ) - return false; - const cards = event.getg(player); - if (!cards.length) return false; - return cards.some((card) => card.storage.dcsanshi); - }, - async content(event, trigger, player) { - var cards = trigger.getg(player); - if (cards.length) { - cards = cards.filter((card) => card.storage.dcsanshi); - player.addGaintag(cards, "dcsanshi_tag"); - } - }, - }, - }, - ai: { - threaten: 3, - }, - }, - dczhenrao: { - audio: 2, - trigger: { global: "useCardToPlayered" }, - filter(event, player) { - if ( - (() => { - if (event.player === player) { - if (!event.isFirstTarget) return false; - return event.targets.some((target) => target !== player); - } - return event.target === player; - })() - ) { - return event.targets.concat(event.player).some((target) => { - return ( - target.countCards("h") > player.countCards("h") && - !player.getStorage("dczhenrao").includes(target) - ); - }); - } - return false; - }, - direct: true, - async content(event, trigger, player) { - const result = await player - .chooseTarget( - get.prompt("dczhenrao"), - "对一名可选角色造成1点伤害", - (card, player, target) => { - return ( - get.event("targets").includes(target) && - !player.getStorage("dczhenrao").includes(target) - ); - } - ) - .set( - "targets", - trigger.targets - .concat(trigger.player) - .filter((target) => target.countCards("h") > player.countCards("h")) - ) - .set("ai", (target) => { - const player = get.player(); - return get.damageEffect(target, player, player); - }) - .forResult(); - if (!result.bool) return; - const target = result.targets[0]; - player.logSkill("dczhenrao", target); - await target.damage(); - await game.asyncDelayx(); - if (!player.storage.dczhenrao) { - player.when({ global: "phaseAfter" }).then(() => player.unmarkSkill("dczhenrao")); - } - player.markAuto("dczhenrao", target); - }, - intro: { - content: "已以此法对$造成过伤害", - onunmark: true, - }, - ai: { - expose: 0.2, - threaten: 3, - }, - }, - dcchenlve: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "thunder", - filterCard: () => false, - selectCard: [-2, -1], - async content(event, trigger, player) { - player.awakenSkill("dcchenlve"); - const cards = ["cardPile", "discardPile"] - .map((pos) => Array.from(ui[pos].childNodes)) - .flat(); - const sishiList = []; - const isSishi = (card) => card.storage.dcsanshi; - const lose_list = [], - players = game.filterPlayer(); - players.forEach((current) => { - const pos = "ej" + (current === player ? "h" : ""); - const sishis = current.getCards(pos, isSishi); - if (sishis.length > 0) { - current.$throw(sishis); - lose_list.push([current, sishis]); - sishiList.addArray(sishis); - } - }); - if (lose_list.length) { - await game.loseAsync({ lose_list }).setContent("chooseToCompareLose"); - } - sishiList.addArray(cards.filter(isSishi)); - if (lose_list.length) await game.asyncDelayx(); - player.gain(sishiList, "gain2"); - player - .when("phaseEnd") - .filter((evt) => evt === event.getParent("phase")) - .vars({ - sishiList, - }) - .then(() => { - const lose_list = [], - players = game.filterPlayer(); - players.forEach((current) => { - const cards = current - .getCards("hej") - .filter((card) => sishiList.includes(card)); - if (cards.length > 0) { - current.$throw(cards); - lose_list.push([current, cards]); - } - }); - if (lose_list.length) { - game.loseAsync({ lose_list }).setContent("chooseToCompareLose"); - } - }) - .then(() => { - game.cardsGotoSpecial(sishiList); - game.log(sishiList, "被移出了游戏"); - }); - player - .when("die") - .vars({ - sishiList, - }) - .assign({ - forceDie: true, - }) - .then(() => { - game.cardsDiscard(sishiList); - game.log(sishiList, "被置入了弃牌堆"); - }); - }, - ai: { - order: 0.5, - result: { - player(player) { - if (player.getHp(true) > 1 && player.countCards("he") > 1) return 0; - if ( - !player.isDamaged() && - (player.countCards("h") > 1 || player.countCards("e") > 0) - ) - return 0; - return 13; - }, - }, - combo: "dcsanshi", - }, - }, - //王凌 - dcjichou: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - filter(event, player) { - const evts = player.getHistory("useCard", (evt) => evt.getParent("phaseUse") === event); - const names = evts.map((evt) => evt.card.name).unique(); - return ( - evts.length > 0 && - evts.length === names.length && - evts.some((evt) => evt.cards.some((card) => get.position(card) === "d")) - ); - }, - async content(event, trigger, player) { - const cards = []; - player.checkHistory("useCard", (evt) => { - if (evt.getParent("phaseUse") !== trigger) return; - cards.addArray(evt.cards.filterInD("d")); - }); - const num = Math.min(cards.length, game.countPlayer()); - if (_status.connectMode) - game.broadcastAll(() => { - _status.noclearcountdown = true; - }); - const [bool, links] = await player - .chooseButton([ - `集筹:将${ - num < cards.length ? "至多" + get.cnNumber(num) + "张牌" : "任意张牌" - }交给等量角色`, - cards, - ]) - .set("selectButton", [1, num]) - .set("population", [ - game.countPlayer((current) => get.attitude(player, current) > 0), - game.countPlayer((current) => get.attitude(player, current) < 0), - ]) - .set("ai", (button) => { - const card = button.link, - population = get.event("population"); - if (ui.selected.buttons.length > population[0] + population[1]) return 0; - if (ui.selected.buttons.length > get.event("population")[0]) - return 2 - get.value(card); - return 2 + get.value(card); - }) - .forResult("bool", "links"); - if (bool) { - const [bool, targets] = await player - .chooseTarget( - `集筹:请选择${get.cnNumber(links.length)}名角色`, - `操作提示:请按照顺序选择要交给牌的目标,令这些角色按顺序获得这些牌:${get.translation( - links - )}`, - true, - links.length - ) - .set( - "values", - links.map((i) => get.value(i)) - ) - .set("ai", (target) => { - const att = get.attitude(get.player(), target); - const chosenNum = ui.selected.targets.length, - values = get.event("values"); - if (values[chosenNum] > 0) return att; - return 0.01 - att; - }) - .forResult("bool", "targets"); - if (_status.connectMode) { - game.broadcastAll(() => { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - if (bool) { - const gain_list = [], - givenCards = []; - targets.forEach((target, i) => { - player.line(target, "green"); - gain_list.push([target, links[i]]); - givenCards.push(links[i]); - game.log(player, "将", links[i], "交给了", target); - }); - event.getParent().set("givenCards", givenCards); - await game - .loseAsync({ - gain_list, - player: player, - cards: givenCards, - giver: player, - animate: "gain2", - }) - .setContent("gaincardMultiple"); - const toDraw = player.getAllHistory("useSkill", (evt) => { - const evtx = evt.event; - return evt.skill === "dcjichou" && evtx.givenCards && evtx.givenCards.length; - })[0].event.givenCards.length; - await game.asyncDelayx(); - await player.draw(toDraw); - } - } - if (_status.connectMode) { - game.broadcastAll(() => { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - }, - }, - dcmouli: { - audio: 2, - trigger: { player: "phaseEnd" }, - filter(event, player) { - const names = []; - player.checkAllHistory("useSkill", (evt) => { - if (evt.skill !== "dcjichou") return; - const evtx = evt.event; - if (evtx.givenCards) - names.addArray(evtx.givenCards.map((card) => get.name(card, false))); - }); - return names.length >= 5; - }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "water", - derivation: ["dczifu"], - async content(event, trigger, player) { - player.awakenSkill("dcmouli"); - await player.gainMaxHp(); - await player.recover(); - await player.addSkills("dczifu"); - }, - ai: { - combo: "dcjichou", - }, - }, - dczifu: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - forced: true, - async content(event, trigger, player) { - const maxLimit = Math.min(5, player.maxHp); - let count = player.countCards("h"); - if (count < maxLimit) { - await player.draw(maxLimit - count); - } - if (!player.hasHistory("gain", (evt) => evt.getParent(2) === event)) return; - count = player.countCards("h"); - const toKeepCount = player - .getCards("h") - .map((card) => get.name(card)) - .unique(); - if (count > toKeepCount) { - const [bool, cards] = await player - .chooseCard( - "自缚:选择要保留的手牌", - "选择不同牌名的手牌各一张,然后弃置其余手牌", - toKeepCount - ) - .set("filterCard", (card) => { - if (!ui.selected.cards.length) return true; - const name = get.name(card, player); - if (ui.selected.cards.some((card) => get.name(card, player) === name)) - return false; - return true; - }) - .set("complexCard", true) - .set("ai", get.value) - .forResult("bool", "cards"); - if (!bool) return; - const toDiscard = player.getCards("h").removeArray(cards); - if (toDiscard.length) player.discard(toDiscard); - } - }, - ai: { - halfneg: true, - }, - }, - //蒋济 - dcshiju: { - audio: 2, - global: "dcshiju_global", - subSkill: { - global: { - audio: "dcshiju", - forceaudio: true, - enable: "phaseUse", - usable: 1, - filter(event, player) { - return game.hasPlayer((current) => { - if (current == player || !current.hasSkill("dcshiju")) return false; - return player.countCards("he"); - }); - }, - filterTarget(card, player, target) { - return target != player && target.hasSkill("dcshiju"); - }, - selectTarget() { - const num = game.countPlayer((current) => { - return current.hasSkill("dcshiju"); - }); - return num > 1 ? 1 : -1; - }, - filterCard: true, - position: "he", - check(card) { - const player = get.player(); - if (get.type(card) === "equip") { - const subtype = get.subtype(card); - let valueFix = 0; - if ( - game.hasPlayer((current) => { - if (current == player || !current.hasSkill("dcshiju")) return false; - if (current.hasUseTarget(card) && !player.countEmptySlot(subtype)) - return true; - }) - ) - valueFix += 5; - if (player.countCards("he", { subtype }) > 1) { - return valueFix + 12 - get.equipValue(card); - } - return valueFix + 6 - get.value(card); - } - return 4 - get.value(card); - }, - prompt() { - const list = game.filterPlayer((current) => { - return current.hasSkill("dcshiju"); - }); - return `将一张牌交给${get.translation(list)}${ - list.length > 1 ? "中的一人" : "" - },若此牌为装备牌,其可以使用之,且你本回合的攻击范围+X(X为其装备区的牌数)。若其以此法替换了装备,你与其各摸两张牌。`; - }, - discard: false, - lose: false, - prepare(cards, player, targets) { - player.$give(cards, targets[0], false); - }, - async content(event, trigger, player) { - const card = event.cards[0], - target = event.target; - await player.give(card, target); - if (!target.getCards("h").includes(card) || get.type(card) !== "equip") return; - const bool = await target.chooseUseTarget(card).forResultBool(); - if (!bool) return; - const count = target.countCards("e"); - if (count > 0) { - player.addTempSkill("dcshiju_range"); - player.addMark("dcshiju_range", count, false); - if ( - target.hasHistory("lose", (evt) => { - return ( - evt.getParent().name === "equip" && - evt.getParent(5) === event && - evt.es && - evt.es.length > 0 - ); - }) - ) { - for (const current of [player, target]) await current.draw(2); - } - } - }, - ai: { - order: 10, - result: { - target(player, target) { - const card = ui.selected.cards[0]; - if (!card) return; - if (target.hasSkillTag("nogain") && get.type(card) != "equip") return 0; - if (card.name == "du" && target.hasSkillTag("nodu")) return 0; - if (get.value(card) < 0) return -5; - const nh = target.countCards("h"); - return Math.max(1, 5 - nh); - }, - }, - }, - }, - range: { - charlotte: true, - onremove: true, - mod: { - attackRange: function (player, num) { - return num + player.countMark("dcshiju_range"); - }, - }, - intro: { content: "本回合攻击范围+#" }, - }, - }, - }, - dcyingshi: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - if (!event.isFirstTarget) return false; - if (get.type(event.card) !== "trick") return false; - return true; - }, - direct: true, - async content(event, trigger, player) { - const result = await player - .chooseTarget() - .set("prompt", get.prompt("dcyingshi")) - .set( - "prompt2", - `令其中一名角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation( - trigger.card.name - )};⒉弃置${get.cnNumber(player.countCards("e"))}张牌,此牌对其无效。` - ) - .set("filterTarget", (card, player, target) => { - return get.event("targets").includes(target); - }) - .set("targets", trigger.targets) - .set( - "toFriends", - (() => { - const isPositive = trigger.targets.some((current) => { - return get.effect(current, trigger.card, trigger.player, player) > 0; - }), - isNegative = trigger.targets.some((current) => { - return get.effect(current, trigger.card, trigger.player, player) < -5; - }); - if ( - (player.hasSkill("dcyingshi_choice1") || player.countCards("e") < 2) && - isNegative - ) - return true; - if ( - !player.hasSkill("dcyingshi_choice1") && - ((get.tag(trigger.card, "norepeat") && isNegative) || isPositive) - ) - return true; - return false; - })() - ) - .set("ai", (target) => { - const player = get.player(), - count = player.countCards("e"), - att = get.attitude(player, target); - if (att > 0 && get.event("toFriends")) { - if (target.countCards("he", (card) => get.value(card) < 5) < count) return 0; - return att; - } - if (player.hasSkill("dcyingshi_choice1") && !count) return 0; - return -get.attitude(player, target); - }) - .forResult(); - if (!result.bool) return; - const target = result.targets[0]; - player.logSkill("dcyingshi", target); - let bool; - if (!player.hasSkill(`dcyingshi_choice2`)) { - const count = player.countCards("e"), - forced = player.hasSkill("dcyingshi_choice1"); - if (count > 0) { - const prompt = `###${get.translation(player)}对你发动了【应时】###${ - forced ? "请" : "是否" - }弃置${get.cnNumber(count)}张牌,令${get.translation(trigger.card)}对你无效${ - forced ? "。" : "?或点击“取消”,令其与此牌结算后视为对你使用一张同名牌。" - }`; - bool = await target - .chooseToDiscard(prompt, count, forced, "he") - .set("ai", (card) => { - if (get.event("goon")) return 5.5 - get.value(card); - return 0; - }) - .set( - "goon", - !get.tag(trigger.card, "norepeat") && - get.effect(target, trigger.card, trigger.player, target) < -5 - ) - .forResultBool(); - } else bool = false; - } else bool = player.hasSkill("dcyingshi_choice1"); - if (bool) { - trigger.excluded.add(target); - } else { - player - .when({ global: "useCardAfter" }) - .filter((evt) => evt === trigger.getParent()) - .vars({ - targetx: target, - cardx: { - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - storage: { dcyingshi: true }, - }, - }) - .then(() => { - const next = player.useCard(get.copy(cardx), targetx, false); - if (trigger.addedTarget) next.addedTarget = trigger.addedTarget; - if (trigger.addedTargets && trigger.addedTargets.length) - next.addedTargets = trigger.addedTargets.slice(0); - }); - } - player.addTempSkill(`dcyingshi_choice${bool + 1}`); - }, - subSkill: { - choice1: { charlotte: true }, - choice2: { charlotte: true }, - }, - }, - //公孙修 - dcgangu: { - audio: 2, - trigger: { global: "loseHpAfter" }, - filter(event, player) { - return event.player !== player; - }, - usable: 1, - forced: true, - async content(event, trigger, player) { - await player.draw(2); - await player.loseHp(); - }, - ai: { - halfneg: true - }, - }, - dckuizhen: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer((current) => { - return lib.skill.dckuizhen.filterTarget(null, player, current); - }); - }, - filterTarget(card, player, target) { - return target.countCards("h") > player.countCards("h") || target.getHp() > player.getHp(); - }, - usable: 1, - forced: true, - async content(event, trigger, player) { - const { target } = event, - juedou = new lib.element.VCard({ name: "juedou" }); - if (target.canUse(juedou, player, false)) { - await target.useCard(juedou, player, "noai"); - } - if ( - player.hasHistory("damage", (evt) => { - return evt.getParent(3) === event; - }) - ) { - await player.viewHandcards(target); - const shas = target - .getGainableCards(player, "h") - .filter((card) => get.name(card) === "sha"); - if (shas.length) { - player.addTempSkill("dckuizhen_effect"); - await player.gain(shas, "give", target).gaintag.add("dckuizhen"); - } - } else { - await target.loseHp(); - } - }, - ai: { - result: { - target(player, target) { - const [juedouEff, loseEff] = [ - get.effect(player, { name: "juedou" }, target, player), - get.effect(target, { name: "losehp" }, target, player), - ]; - if (juedouEff > 0) return (loseEff * get.attitude(player, target)) / 10; - return 0; - }, - }, - }, - subSkill: { - effect: { - trigger: { player: "useCard1" }, - forced: true, - popup: false, - firstDo: true, - charlotte: true, - filter: function (event, player) { - if (event.addCount === false) return false; - return player.hasHistory("lose", (evt) => { - if (evt.getParent() != event) return false; - for (const i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("dckuizhen")) return true; - } - return false; - }); - }, - async content(event, trigger, player) { - trigger.addCount = false; - var stat = player.getStat().card, - name = trigger.card.name; - if (typeof stat[name] == "number") stat[name]--; - }, - mod: { - cardUsable(card) { - if (!card.cards) return; - if (card.cards.some((card) => card.hasGaintag("dckuizhen"))) return Infinity; - }, - }, - }, - }, - }, - //刘理 - dcfuli: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return player.countDiscardableCards(player, "h"); - }, - usable: 1, - async content(event, trigger, player) { - await player.showHandcards(get.translation(player) + "发动了【抚黎】"); - const getNum = (type) => { - let num = ["basic", "trick", "equip"].indexOf(type); - if (num === -1) num = 3; - return num; - }; - const types = player - .getDiscardableCards(player, "h") - .reduce((list, card) => { - return list.add(get.type2(card)); - }, []) - .sort((a, b) => getNum(a) - getNum(b)); - if (types.length) { - const { - result: { control }, - } = await player - .chooseControl(types) - .set("ai", () => { - const player = get.event("player"), - types = get.event("controls").slice(); - const getNum = (type) => { - const cards = player - .getDiscardableCards(player, "h") - .filter((card) => get.type2(card) == type); - const countCards = (target, player, cards) => { - return target.countCards("h") - (target == player ? cards.length : 0); - }; - const max = game - .findPlayer((target) => { - return !game.hasPlayer((target2) => { - return ( - countCards(target2, player, cards) > - countCards(target, player, cards) - ); - }); - }) - .countCards("h"); - return ( - Math.min( - max, - cards.reduce((sum, card) => sum + get.cardNameLength(card), 0) - ) / cards.length - ); - }; - return types.sort((a, b) => { - return getNum(b) - getNum(a); - })[0]; - }) - .set("prompt", "弃置一种类别的所有手牌,然后摸这些牌的名字字数之和的牌"); - if (control) { - const cards = player - .getDiscardableCards(player, "h") - .filter((card) => get.type2(card) == control); - await player.discard(cards); - const max = game.findPlayer((target) => target.isMaxHandcard()).countCards("h"); - const num = Math.min( - max, - cards.reduce((sum, card) => sum + get.cardNameLength(card), 0) - ); - if (num) await player.draw(num); - if (cards.some((card) => card.name != "shandian" && get.tag(card, "damage"))) { - const { - result: { bool, targets }, - } = await player - .chooseTarget("抚黎:是否令一名角色的攻击范围-1直到你的下个回合开始?") - .set("ai", (target) => { - const player = get.event("player"), - num = target.getAttackRange(); - return ( - -get.sgn(get.attitude(player, target)) * - (target.getAttackRange() + (num <= 0 ? -num + 0.5 : num)) - ); - }); - if (bool) { - const target = targets[0]; - player.line(target); - target.addSkill("dcfuli_range"); - target.addMark("dcfuli_range", 1, false); - player - .when(["phaseBegin", "dieBegin"]) - .then(() => { - target.removeMark("dcfuli_range", 1, false); - if (!target.hasMark("dcfuli_range")) - target.removeSkill("dcfuli_range"); - }) - .vars({ target: target }); - } - } - } - } - }, - ai: { - order: 1, - result: { - player(player) { - const types = player.getDiscardableCards(player, "h").reduce((list, card) => { - return list.add(get.type2(card)); - }, []); - if ( - !types.some((type) => { - const cards = player - .getDiscardableCards(player, "h") - .filter((card) => get.type2(card) == type); - const countCards = (target, player, cards) => { - return target.countCards("h") - (target == player ? cards.length : 0); - }; - return !game - .filterPlayer((target) => { - return !game.hasPlayer((target2) => { - return ( - countCards(target2, player, cards) > - countCards(target, player, cards) - ); - }); - }) - .includes(player); - }) - ) - return 0; - return 1; - }, - }, - }, - subSkill: { - range: { - charlotte: true, - onremove: true, - mod: { - attackRange(player, num) { - return num - player.countMark("dcfuli_range"); - }, - }, - marktext: " - ", - intro: { content: "攻击范围-#" }, - }, - }, - }, - dcdehua: { - audio: 2, - trigger: { global: "roundStart" }, - forced: true, - async content(event, trigger, player) { - const list = lib.inpile.filter((name) => { - if (get.type(name) === "delay") return false; - const card = new lib.element.VCard({ name: name }); - return get.tag(card, "damage") && player.hasUseTarget(card); - }); - if (list.length) { - const { - result: { bool, links }, - } = await player - .chooseButton( - [ - '###德化###
    视为使用一张仍可以使用的伤害类卡牌
    ', - [list, "vcard"], - ], - true - ) - .set("ai", (button) => { - const name = button.link[2], - player = get.player(); - let value = player.getUseValue({ name, isCard: true }, null, true); - if ( - player.countCards( - "h", - (card) => get.name(card) === name && player.hasUseTarget(card) - ) - ) - value /= 3; - if (name === "sha") value /= 2; - if (player.getStorage("dcdehua").includes("sha")) - value = Math.max(0.1, value); - return value; - }); - if (bool) { - const name = links[0][2], - card = new lib.element.VCard({ name: name }); - await player.chooseUseTarget(card, true); - player.markAuto("dcdehua", [name]); - } - } - if ( - !lib.inpile.some((name) => { - if (get.type(name) === "delay") return false; - const card = new lib.element.VCard({ name: name }); - return get.tag(card, "damage") && !player.getStorage("dcdehua").includes(name); - }) - ) - player.removeSkills("dcdehua"); - }, - mod: { - maxHandcard(player, num) { - return num + player.getStorage("dcdehua").length; - }, - cardEnabled(card, player) { - if ( - player.getStorage("dcdehua").includes(card.name) && - (get.position(card) == "h" || - (card.cards && card.cards.some((i) => get.position(i) == "h"))) - ) - return false; - }, - cardSavable(card, player) { - if ( - player.getStorage("dcdehua").includes(card.name) && - (get.position(card) == "h" || - (card.cards && card.cards.some((i) => get.position(i) == "h"))) - ) - return false; - }, - aiValue(player, card) { - if (player.getStorage("dcdehua").includes(get.name(card))) return 0; - }, - aiUseful() { - return lib.skill.dcdehua.mod.aiValue.apply(this, arguments); - }, - }, - intro: { - content(storage) { - return ( - "
  • 手牌上限+" + - storage.length + - "
  • 不能从手牌中使用" + - get.translation(storage) - ); - }, - }, - }, - //蒋琬费祎 - dcshengxi: { - inherit: "reshengxi", - trigger: { player: "phaseDiscardEnd" }, - }, - dcshoucheng: { - audio: "shoucheng", - global: "dcshoucheng_ai", - trigger: { - global: [ - "equipAfter", - "addJudgeAfter", - "loseAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter(event, player) { - const target = _status.currentPhase; - return game.hasPlayer((current) => { - if (target && current == target) return false; - let evt = event.getl(current); - return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; - }); - }, - async cost(event, trigger, player) { - const targetx = _status.currentPhase; - const targets = game - .filterPlayer((current) => { - if (targetx && current == targetx || !current.isIn()) return false; - let evt = trigger.getl(current); - return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; - }) - .sortBySeat(targetx || player); - event.result = await player - .chooseTarget("是否对" + (targets.length > 1 ? "其中一名角色" : get.translation(targets[0])) + "发动【守成】?", - "令其摸两张牌", - (card, player, target) => { - return get.event("targets").includes(target); - } - ) - .set("targets", targets) - .set("ai", target => get.attitude(get.event("player"), target)) - .forResult(); - }, - usable: 1, - async content(event, trigger, player) { - const target = event.targets[0]; - if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); - target.draw(2); - }, - subSkill: { - ai: { - ai: { - noh: true, - skillTagFilter(player, tag, arg) { - if (player === _status.currentPhase || player.countCards("h") != 1) - return false; - return game.hasPlayer((current) => { - return ( - current.hasSkill("dcshoucheng") && get.attitude(current, player) > 0 - ); - }); - }, - }, - }, - }, - }, - //乐大乔 - dczixi: { - init() { - game.addGlobalSkill("dczixi_judge"); - game.broadcastAll(() => lib.skill.dczixi.video()); - }, - video() { - const list = lib.skill.dczixi.zixiList; - for (const name of list) { - const namex = "dczixi_" + name; - if (!lib.card[namex]) { - lib.card[namex] = { - type: "special_delay", - fullskin: true, - noEffect: true, - wuxieable: false, - }; - lib.card[namex].cardimage = name; - lib.translate[namex] = lib.translate[name] + "·姊希"; - lib.translate[namex + "_info"] = - "由【姊希】技能创造的无效果【" + lib.translate[name] + "】"; - } - } - }, - audio: 2, - trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, - filter(event, player) { - return ( - player.countCards("h", (card) => { - return ( - card.hasGaintag("dcqiqin_tag") && - lib.skill.dczixi.zixiList.some((name) => { - return game.hasPlayer((target) => - target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card])) - ); - }) - ); - }) > 0 - ); - }, - zixiList: ["lebu", "bingliang", "shandian"], - direct: true, - async content(event, trigger, player) { - game.addVideo("skill", player, ["dczixi", []]); - const names = lib.skill.dczixi.zixiList.filter((name) => { - return player.countCards("h", (card) => { - return ( - card.hasGaintag("dcqiqin_tag") && - game.hasPlayer((target) => - target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card])) - ) - ); - }); - }); - let map = {}; - for (const name of names) { - map[get.translation(name)] = name; - } - const { - result: { bool, links }, - } = await player - .chooseButton(2, [ - "###" + - get.prompt("dczixi") + - '###
    将一张“琴”以你选择的牌名置于一名角色的判定区
    ', - player.getCards("h"), - [Object.keys(map), "tdnodes"], - ]) - .set("filterButton", (button) => { - const type = typeof button.link, - card = button.link; - if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) - return false; - if (type == "string") return true; - return ( - card.hasGaintag("dcqiqin_tag") && - lib.skill.dczixi.zixiList.some((name) => { - return game.hasPlayer((target) => - target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card])) - ); - }) - ); - }) - .set("ai", (button) => { - const player = get.event("player"), - list = Object.keys(get.event("map")); - if (typeof button.link == "string") { - const card = player - .getCards("h", (card) => { - if (get.value(card) >= 7) return false; - return ( - card.hasGaintag("dcqiqin_tag") && - game.hasPlayer((target) => - target.canAddJudge( - get.autoViewAs({ name: "dczixi_" + name }, [card]) - ) - ) - ); - }) - .sort((a, b) => get.value(a) - get.value(b))[0]; - if ( - game.hasPlayer((current) => { - return ( - get.attitude(player, current) < 0 && - lib.skill.dczixi.zixiList.some((name) => - current.canAddJudge( - get.autoViewAs({ name: "dczixi_" + name }, [card]) - ) - ) - ); - }) - ) - return list.indexOf(button.link) + 1; - return 1 / (list.indexOf(button.link) + 1); - } - return 7 - get.value(button.link); - }) - .set("map", map); - if (bool) { - const name = links.find((i) => typeof i == "string"), - card = links.find((j) => j != name), - cardname = map[name]; - const { - result: { bool, targets }, - } = await player - .chooseTarget( - "请选择【" + name + "(" + get.translation(card) + ")】置入的目标", - (cardx, player, target) => { - return target.canAddJudge( - get.autoViewAs({ name: "dczixi_" + get.event("cardname") }, [ - get.event("card"), - ]) - ); - }, - true - ) - .set("ai", (target) => { - const player = get.event("player"), - card = get.event("card"); - if ( - game.hasPlayer((current) => { - return ( - get.attitude(player, current) < 0 && - current.canAddJudge( - get.autoViewAs({ name: "dczixi_" + get.event("cardname") }, [ - card, - ]) - ) - ); - }) - ) - return -target.countCards("j") - 1; - return target.countCards("j") + 1; - }) - .set("card", card) - .set("cardname", cardname); - if (bool) { - const target = targets[0]; - player.logSkill("dczixi", target); - player.$give(card, target, false); - await game.asyncDelay(0.5); - target.addJudge({ name: "dczixi_" + cardname }, [card]); - } - } - }, - group: "dczixi_effect", - subSkill: { - judge: { - mod: { - targetEnabled(card, player, target) { - const list = lib.skill.dczixi.zixiList; - const name = - typeof card == "string" ? card : card.viewAs ? card.viewAs : card.name; - if (name.indexOf("dczixi_") == 0) { - const namex = name.slice("dczixi_".length); - if (list.includes(namex) && target.hasJudge(namex)) return false; - } else if (list.includes(name) && target.hasJudge("dczixi_" + name)) - return false; - }, - }, - ai: { - threaten(player, target) { - if (!player.hasSkill("dczixi") || ![1, 2, 3].includes(target.countCards("j"))) - return; - return 3 + target.countCards("j"); - }, - }, - }, - effect: { - audio: "dczixi", - trigger: { player: "useCardToTargeted" }, - filter(event, player) { - return ( - event.isFirstTarget && - event.targets.length == 1 && - [1, 2, 3].includes(event.target.countCards("j")) && - (get.type(event.card) == "basic" || get.type(event.card) == "trick") - ); - }, - prompt2(event, player) { - const target = event.target, - str = get.translation(target); - return [ - "令" + get.translation(event.card) + "对" + str + "额外结算一次", - "摸两张牌", - "弃置" + str + "判定区里的所有牌,对其造成3点伤害", - ][target.countCards("j") - 1]; - }, - check(event, player) { - const target = event.target, - num = target.countCards("j"); - if (num == 2) return true; - if (num == 1) return get.effect(target, event.card, player, player) > 0; - return ( - get.attitude(player, target) < 0 && - get.damageEffect(target, player, player) > 0 - ); - }, - logTarget: "target", - async content(event, trigger, player) { - const target = trigger.target, - num = target.countCards("j"); - switch (num) { - case 1: - trigger.getParent().effectCount++; - game.log(trigger.card, "额外结算一次"); - break; - case 2: - player.draw(2); - break; - case 3: - target.discard(target.getCards("j")).discarder = player; - target.damage(3); - break; - } - }, - }, - }, - }, - //孔融 - dckrmingshi: { - audio: "mingshi", - trigger: { player: "damageBegin4" }, - filter(event, player) { - return event.source && event.source.countCards("h") > player.countCards("h"); - }, - forced: true, - logTarget: "source", - async content(event, trigger, player) { - const target = trigger.source; - const { - result: { bool }, - } = await target - .chooseToDiscard( - "名士:弃置一张手牌,或防止对" + get.translation(player) + "造成的伤害" - ) - .set("ai", (card) => { - if (get.event("goon")) return 0; - return 6 - get.value(card); - }) - .set("goon", get.damageEffect(player, target, target) <= 0); - if (!bool) trigger.cancel(); - }, - ai: { - effect: { - target_use(card, player, target, current) { - if (get.tag(card, "damage") && target != player) { - if (_status.event.name == "dckrmingshi") return; - if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; - var bs = player.getCards("h"); - bs.remove(card); - if (card.cards) bs.removeArray(card.cards); - else bs.removeArray(ui.selected.cards); - if (bs.length > target.countCards("h")) { - if (bs.some((bsi) => get.value(bsi) < 7)) return [1, 0, 1, -0.5]; - return [1, 0, 0.3, 0]; - } - return [1, 0, 1, -0.5]; - } - }, - }, - }, - }, - //新服SP孟获 - dcmanwang: { - audio: "spmanwang", - inherit: "spmanwang", - check: function (card) { - var player = _status.event.player; - var max = Math.min(player.isDamaged() ? 3 : 2, 4 - player.countMark("dcmanwang")); - if (!max && !player.hasSkill("dcpanqin")) return 0; - if (max == 0 && ui.selected.length > 0) return 0; - return 7 - ui.selected.cards.length - get.value(card); - }, - content: function () { - var num = Math.min(cards.length, 4 - player.countMark("dcmanwang")); - if (num >= 1) player.addSkills("dcpanqin"); - if (num >= 2) player.draw(); - if (num >= 3) player.recover(); - if (num >= 4) { - player.draw(2); - player.removeSkills("dcpanqin"); - } - }, - ai: { - order: 2, - result: { - player: function (player, target) { - if (player.getUseValue({ name: "nanman" }) <= 0) return 0; - if (player.getStat("skill").spmanwang && player.hasSkill("dcpanqin")) return 0; - return 1; - }, - }, - }, - derivation: "dcpanqin", - }, - dcpanqin: { - audio: "sppanqin", - inherit: "sppanqin", - content: function () { - var cards = []; - player.getHistory("lose", function (evt) { - if (evt.type != "discard" || evt.getParent(trigger.name) != trigger) return false; - for (var i of evt.cards2) { - if (get.position(i, true) == "d") { - cards.add(i); - } - } - }); - player.chooseUseTarget(true, { name: "nanman" }, cards); - player.addTempSkill("dcpanqin_eff"); - }, - subSkill: { - eff: { - charlotte: true, - trigger: { player: "useCard" }, - filter: function (event, player) { - return ( - event.card.name == "nanman" && - event.getParent(2).name == "dcpanqin" && - player.countMark("dcmanwang") < 4 && - player.hasSkill("dcmanwang", null, null, false) && - event.cards.length <= event.targets.length - ); - }, - forced: true, - popup: false, - content: function () { - "step 0"; - player.addMark("dcmanwang", 1, false); - switch (player.countMark("dcmanwang")) { - case 1: - player.draw(2); - player.removeSkills("dcpanqin"); - break; - case 2: - player.recover(); - break; - case 3: - player.draw(); - break; - case 4: - player.addSkills("dcpanqin"); - break; - } - "step 1"; - player.gainMaxHp(); - player.recover(); - }, - }, - }, - }, - //凌操 - dcdufeng: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - forced: true, - async content(event, trigger, player) { - const list = []; - for (let i = 1; i < 6; i++) { - if (player.isDisabled(i)) continue; - list.push("equip" + i); - } - list.push("cancel2"); - const next = player.chooseControl(list); - next.set("prompt", "独锋:请废除一个装备栏,或点击“取消”失去1点体力"); - next.set("ai", () => { - const list = get.event().list.slice(), - player = get.player(); - if (player.hp <= 2 && list.length > 1) list.remove("cancel2"); - const listx = list.filter((subtype) => !player.getEquips(subtype).length); - if (listx.length) return listx.randomGet(); - return list.randomGet(); - }); - next.set("list", list); - const { result } = await next; - if (result.control == "cancel2") await player.loseHp(); - else await player.disableEquip(result.control); - if (!player.isIn()) return; - const num = Math.min(player.countDisabled() + player.getDamagedHp(), player.maxHp); - await player.draw(num); - player.addTempSkill("dcdufeng_effect"); - player.addMark("dcdufeng_effect", num, false); - }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - intro: { - content: "本回合攻击范围与使用【杀】的次数上限均为#", - }, - mod: { - attackRangeBase(player, num) { - return player.countMark("dcdufeng_effect"); - }, - cardUsable(card, player, num) { - if (card.name == "sha") return player.countMark("dcdufeng_effect"); - }, - }, - }, - }, - }, - //小乔 - dcqiqin: { - audio: 2, - audioname: ["yue_daqiao"], - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - content: function () { - let cards = player.getCards("h"); - player.addGaintag(cards, "dcqiqin_tag"); - player.markAuto("dcqiqin", cards); - }, - group: "dcqiqin_restore", - subSkill: { - tag: {}, - restore: { - audio: "dcqiqin", - audioname: ["yue_daqiao"], - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - const targets = game.players.slice().concat(game.dead); - return targets.some( - (target) => target.getStorage("dcqiqin").filterInD("d").length - ); - }, - forced: true, - content: function () { - const targets = game.players.slice().concat(game.dead); - const cards = targets.reduce( - (list, target) => list.addArray(target.getStorage("dcqiqin").filterInD("d")), - [] - ); - player.gain(cards, "gain2").gaintag.add("dcqiqin_tag"); - }, - }, - }, - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("dcqiqin_tag")) return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("dcqiqin_tag")) return false; - }, - }, - }, - dcweiwan: { - audio: 2, - enable: "phaseUse", - filter: (event, player) => { - return ( - player.countCards(lib.skill.dcweiwan.position, (card) => { - return lib.skill.dcweiwan.filterCard(card, player); - }) && - game.hasPlayer((target) => { - return lib.skill.dcweiwan.filterTarget(null, player, target); - }) - ); - }, - filterCard: (card, player) => { - return card.hasGaintag("dcqiqin_tag") && lib.filter.cardDiscardable(card, player); - }, - filterTarget: (card, player, target) => { - return target != player && target.countCards("he"); - }, - position: "h", - check: (card) => { - const player = _status.event.player; - const target = game.players.reduce( - (result, current) => { - if (current === player) return result; - const effect = Math.abs(lib.skill.dcweiwan.ai.result.target(player, current)); - return effect > result[1] ? [current, effect] : result; - }, - [null, 0] - )[0]; - return target ? lib.skill.dcweiwan.getWeiWanEffect(player, card, target) : 0; - }, - usable: 1, - content: function* (event, map) { - let player = map.player, - target = event.target; - let suit = get.suit(event.cards[0], player); - let cards = target.getCards( - "hej", - (card) => - get.suit(card, target) != suit && lib.filter.canBeGained(card, player, target) - ); - if (!cards.length) { - player.chat("无牌可得!!"); - return; - } - let suits = lib.suit.slice(); - suits.reverse(); - suits.add("none"); - suits.forEach((suit2) => { - let cards2 = cards.filter((card) => get.suit(card, target) == suit2); - if (cards2.length) { - cards2.randomRemove(); - cards.removeArray(cards2); - } - }); - if (!cards.length) { - player.chat("无牌可得!!"); - return; - } - player.gain(cards, target, "give"); - switch (cards.length) { - case 1: - target.loseHp(); - break; - case 2: - player.addTempSkill("tanbei_effect3"); - target.addTempSkill("tanbei_effect1"); - break; - case 3: - player.addTempSkill("tanbei_effect3"); - target.addTempSkill("tanbei_effect2"); - break; - } - }, - ai: { - order: 9, - result: { - target: (player, target) => { - const att = get.sgn(get.attitude(player, target)) - 1; - const cards = player.getCards(lib.skill.dcweiwan.position, (card) => - lib.skill.dcweiwan.filterCard(card, player) - ); - return ( - att * - cards.reduce((result, card) => { - const effect = lib.skill.dcweiwan.getWeiWanEffect(player, card, target); - return effect > result ? effect : result; - }, 0) - ); - }, - }, - combo: "dcqiqin", - }, - getWeiWanEffect: (player, cardx, target) => { - const suit = get.suit(cardx, player); - const cards = target.getCards( - "hej", - (card) => - get.suit(card, target) !== suit && lib.filter.canBeGained(card, player, target) - ); - const num = lib.suits.filter((suit) => - cards.some((card) => get.suit(card, target) === suit) - ).length; - switch (num) { - case 1: - return ( - num + - Math.max(0, get.sgn(get.effect(target, { name: "losehp" }, player, player))) - ); - case 2: - return ( - num + - player.countCards( - "he", - (card) => - player.canUse(card, target, false) && - get.effect(target, card, player, player) > 0 - ) - ); - case 3: - return Math.ceil(num / 2); - default: - return num; - } - }, - }, - //董昭 - dcyijia: { - audio: 2, - trigger: { global: "damageEnd" }, - filter: function (event, player) { - if (!event.player.isIn()) return false; - if (get.distance(player, event.player) > 1) return false; - return player.canMoveCard( - null, - true, - game.filterPlayer((i) => i != event.player), - event.player, - "canReplace" - ); - }, - check: function (event, player) { - return player.canMoveCard( - true, - true, - game.filterPlayer((i) => i != event.player), - event.player, - "canReplace" - ); - }, - prompt2: function (event, player) { - return `将场上一张装备牌移动至${get.translation( - event.player - )}的装备区内(替换原装备)。然后若其因此脱离了一名角色的攻击范围,你摸一张牌。`; - }, - logTarget: "player", - line: false, - content: function* (event, map) { - const player = map.player, - trigger = map.trigger, - target = trigger.player; - const inRangeList = game.filterPlayer((current) => current.inRange(target)); - yield player.moveCard( - true, - game.filterPlayer((i) => i != target), - target, - "canReplace" - ); - const leaveSomeone = inRangeList.some((current) => !current.inRange(target)); - if (leaveSomeone) player.draw(); - }, - ai: { - maixie: true, - expose: 0.2, - threaten: 3.3, - }, - }, - dcdingji: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function* (event, map) { - const player = map.player; - let result; - result = yield player.chooseTarget(get.prompt2("dcdingji")).set("ai", (target) => { - let att = get.attitude(get.player(), target) / 2; - const delta = 5 - target.countCards("h"); - let fix = 1; - const hs = target.getCards("h"); - outer: for (let i = 0; i < hs.length - 1; i++) { - const name1 = get.name(hs[i]); - for (let j = i + 1; j < hs.length; j++) { - const name2 = get.name(hs[j]); - if (name1 == name2) { - fix = 0.5; - break outer; - } - } - } - if (delta > 0) { - if (target.hasSkillTag("nogain")) att /= 3; - return Math.sqrt(delta) * att * fix; - } - if (delta > -2 && att > 0) return fix == 0.5 ? 0.1 : -1; - return (-Math.sqrt(-delta) * att) / 2; - }); - if (!result.bool) return event.finish(); - const target = result.targets[0]; - player.logSkill("dcdingji", target); - if (target != player) player.addExpose(0.3); - const delta = 5 - target.countCards("h"); - if (delta != 0) { - yield target[delta > 0 ? "draw" : "chooseToDiscard"](Math.abs(delta), true); - } - target.showHandcards(); - const hs = target.getCards("h"); - let hasSame = false; - outer: for (let i = 0; i < hs.length - 1; i++) { - const name1 = get.name(hs[i]); - for (let j = i + 1; j < hs.length; j++) { - const name2 = get.name(hs[j]); - if (name1 == name2) { - hasSame = true; - break outer; - } - } - } - game.delayex(); - if (hasSame) return event.finish(); - const list = get.inpileVCardList((info) => { - if (!["basic", "trick"].includes(info[0])) return false; - if ( - !target.hasUseTarget( - new lib.element.VCard({ name: info[2], nature: info[3], isCard: true }) - ) - ) - return false; - return hs.some((card) => { - return get.name(card) == info[2] && get.is.sameNature([card, info[3]], true); - }); - }); - if (!list.length) return event.finish(); - result = yield target - .chooseButton(["是否视为使用其中一张牌?", [list, "vcard"]]) - .set("ai", (button) => { - return get.player().getUseValue({ name: button.link[2] }); - }); - if (result.bool) { - target.chooseUseTarget( - new lib.element.VCard({ - name: result.links[0][2], - nature: result.links[0][3], - isCard: true, - }), - true, - false - ); - } - }, - }, - //蒯祺 - dcliangxiu: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.hasCard((card) => { - const type = get.type2(card, player); - return player.hasCard((cardx) => { - if (card == cardx) return false; - return get.type2(cardx, player) != type; - }, "he"); - }, "he"); - }, - filterCard: function (card, player) { - if (!ui.selected.cards.length) return true; - return get.type2(ui.selected.cards[0], player) != get.type2(card, player); - }, - selectCard: 2, - check: function (card) { - const player = get.player(); - const bannedTypes = []; - bannedTypes.addArray(player.getStorage("dcliangxiu")); - if (!ui.selected.cards.length) { - let val = get.value(card); - if (val > 5.5) return 0; - if (bannedTypes.includes(get.type2(card, player))) return 7.5 - val; - return 5.5 - val; - } - bannedTypes.addArray(ui.selected.cards.map((card) => get.type2(card, player))); - bannedTypes.add(get.type2(card, player)); - const filter = (card) => !bannedTypes.includes(get.type2(card, player)); - if (!get.cardPile(filter)) return 0; - return 6 - get.value(card); - }, - position: "he", - complexCard: true, - onremove: true, - content: function* (event, map) { - const player = map.player; - const cards = []; - const bannedTypes = []; - bannedTypes.addArray(event.cards.map((card) => get.type2(card, player))); - bannedTypes.addArray(player.getStorage("dcliangxiu")); - - const filter = (card) => !bannedTypes.includes(get.type2(card, player)); - const piles = ["cardPile", "discardPile"]; - for (const pile of piles) { - for (let i = 0; i < ui[pile].childNodes.length; i++) { - const card = ui[pile].childNodes[i]; - if (filter(card)) { - cards.add(card); - if (cards.length >= 2) break; - } - } - if (cards.length >= 2) break; - } - let result; - if (!cards.length) { - player.chat("没牌了…"); - game.log("但是哪里都找不到没有符合条件的牌!"); - event.finish(); - return; - } else if (cards.length == 1) result = { bool: true, links: cards }; - else - result = yield player - .chooseButton(["良秀:获得一张牌", cards], true) - .set("ai", get.buttonValue); - if (result.bool) { - const toGain = result.links; - player.markAuto("dcliangxiu", get.type2(toGain[0], false)); - player.when({ global: "phaseChange" }).then(() => { - player.unmarkSkill("dcliangxiu"); - }); - player.gain(toGain, "gain2"); - } - }, - intro: { - content: "已因此技能获得过$牌", - onunmark: true, - }, - ai: { - order: 2, - result: { player: 1 }, - }, - }, - dcxunjie: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - if (["handcard", "hp"].every((i) => player.isTempBanned(`dcxunjie_${i}`))) return false; - return player.hasHistory("gain", (evt) => { - return !evt.getParent("phaseDraw", true); - }); - }, - direct: true, - content: function* (event, map) { - const player = map.player; - const choices = []; - const choiceList = [ - "令一名角色将手牌数摸或弃置至与其体力值相同", - "令一名角色将体力回复或失去至与其手牌数相同", - ]; - if (!player.isTempBanned("dcxunjie_handcard")) choices.push("选项一"); - else - choiceList[0] = - '' + choiceList[0] + "(已被选择过)"; - if (!player.isTempBanned("dcxunjie_hp")) choices.push("选项二"); - else - choiceList[1] = - '' + choiceList[1] + "(已被选择过)"; - let result; - if (_status.connectMode) - game.broadcastAll(() => { - _status.noclearcountdown = true; - }); - if (choices.length == 1) result = { control: choices[0] }; - else - result = yield player - .chooseControl(choices, "cancel2") - .set("choiceList", choiceList) - .set("prompt", get.prompt("dcxunjie")) - .set("ai", () => { - return get.event("choice"); - }) - .set( - "choice", - (() => { - const getValue = (index, target) => { - let att = get.attitude(player, target); - att = Math.sign(att) * Math.sqrt(Math.abs(att)); - let delt = target.getHp(true) - target.countCards("h"); - if (index == 1 && delt < 0) delt = 0; - return (1 - 3 * index) * att * delt; - }; - const list = game - .filterPlayer() - .map((current) => { - const val0 = getValue(0, current), - val1 = getValue(1, current); - return [val0, val1, Math.max(val0, val1)]; - }) - .sort((a, b) => { - return b[2] - a[2]; - }); - const toChoose = list[0]; - if (toChoose[2] <= 0) return "cancel2"; - return toChoose[0] > toChoose[1] ? 0 : 1; - })() - ); - if (result.control == "cancel2") { - if (_status.connectMode) { - game.broadcastAll(() => { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - return event.finish(); - } - let prompt = ""; - const choice = result.control, - index = choice == "选项一" ? 0 : 1; - if (choices.length == 1) { - prompt = `###${get.prompt("dcxunjie")}###
    ${ - choiceList[index] - }
    `; - } else - prompt = `###殉节:请选择一名角色###
    ${choiceList[ - index - ].replace("一名", "该")}
    `; - result = yield player - .chooseTarget(prompt) - .set("ai", (target) => { - const player = get.player(), - index = get.event("index"); - let att = get.attitude(player, target); - att = Math.sign(att) * Math.sqrt(Math.abs(att)); - let delt = target.getHp(true) - target.countCards("h"); - if (index == 1 && delt < 0) delt = 0; - return (1 - 2 * index) * att * delt; - }) - .set("index", index); - if (_status.connectMode) { - game.broadcastAll(() => { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - if (!result.bool) return event.finish(); - const target = result.targets[0]; - player.logSkill("dcxunjie", target); - player.tempBanSkill(`dcxunjie_${index == 0 ? "handcard" : "hp"}`, "roundStart", false); - const delt = (target.getHp(true) - target.countCards("h")) * (1 - 2 * index); - if (delt == 0) event.finish(); - else if (index == 0) target[delt > 0 ? "draw" : "chooseToDiscard"](Math.abs(delt), true); - else target[delt > 0 ? "recover" : "loseHp"](Math.abs(delt)); - }, - }, - //乐蔡邕 - dcjiaowei: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - group: "dcjiaowei_prevent", - content: function* (event, map) { - const player = map.player; - var cards = player.getCards("h"); - player.addGaintag(cards, "dcjiaowei_tag"); - }, - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("dcjiaowei_tag")) return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("dcjiaowei_tag")) return false; - }, - }, - subSkill: { - prevent: { - audio: "dcjiaowei", - trigger: { - player: "damageBegin4", - }, - forced: true, - filter: function (event, player) { - if (!event.source || !event.source.isIn()) return false; - return ( - event.source.countCards("h") <= - player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag")) - ); - }, - content: function* (event, map) { - map.trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - const num = target.countCards("h", (card) => - card.hasGaintag("dcjiaowei_tag") - ); - let cards = []; - if (card.cards) cards.addArray(card.cards); - if (ui.selected.cards) cards.addArray(ui.selected.cards); - cards = cards.filter((card) => { - if (get.itemtype(card) != "card") return false; - return get.owner(card) == player && get.position(card) == "e"; - }); - if (player.countCards("h") - cards.length <= num) - return "zeroplayertarget"; - } - }, - }, - }, - }, - }, - }, - dcfeibai: { - audio: 2, - trigger: { player: "useCardAfter" }, - usable: 1, - locked: false, - filter: function (event, player) { - return player.getHistory("useCard").indexOf(event) > 0; - }, - prompt2: function (event, player) { - const history = player.getHistory("useCard"); - const ind = history.indexOf(event) - 1, - evt = history[ind]; - const len = get.cardNameLength(event.card) + get.cardNameLength(evt.card); - return `随机获得一张字数为${len}的牌`; - }, - check: function (event, player) { - const history = player.getHistory("useCard"); - const ind = history.indexOf(event) - 1, - evt = history[ind]; - const len = get.cardNameLength(event.card) + get.cardNameLength(evt.card); - return ( - player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag")) <= len || - get.cardPile((card) => { - return get.cardNameLength(card, false) == len; - }) - ); - }, - content: function* (event, map) { - const player = map.player, - trigger = map.trigger; - const history = player.getHistory("useCard"); - const ind = history.indexOf(trigger) - 1, - evt = history[ind]; - const len = get.cardNameLength(trigger.card) + get.cardNameLength(evt.card); - const card = get.cardPile((card) => { - return get.cardNameLength(card, false) == len; - }); - if (card) { - yield player.gain(card, "gain2"); - } else { - let str = `没有${len}字的牌…`; - if (len == 5 && Math.random() <= 0.2) str = "五字不行哇"; - player.chat(str); - game.log(`但是找不到字数为${len}的牌!`); - } - if (player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag")) <= len) { - player.storage.counttrigger.dcfeibai--; - game.log(player, "重置了", "#【飞白】"); - } - }, - mod: { - aiOrder: function (player, card, num) { - const evt = player.getLastUsed(); - if (!evt) return; - const len = get.cardNameLength(card) + get.cardNameLength(evt.card); - const cardx = get.cardPile((card) => { - return get.cardNameLength(card, false) == len; - }); - if (cardx) return num + 8 + (len == 2 || len == 4 ? 2 : 0); - }, - }, - }, - //庞山民 - dccaisi: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return get.type(event.card) == "basic" && _status.currentPhase; - }, - prompt2: function (event, player) { - const num = player.countMark("dccaisi_more") + 1; - return `从${player == _status.currentPhase ? "牌堆" : "弃牌"}堆中随机获得${get.cnNumber( - num - )}张非基本牌`; - }, - content: function* (event, map) { - const player = map.player, - trigger = map.trigger; - const position = player == _status.currentPhase ? "cardPile" : "discardPile"; - let cards = [], - num = player.countMark("dccaisi_more") + 1; - while (num > 0) { - num--; - let card = get[position]( - (card) => get.type(card) != "basic" && !cards.includes(card) - ); - if (card) cards.add(card); - else break; - } - if (cards.length) yield player.gain(cards, "gain2"); - else { - player.chat("没有非基本牌…"); - game.log(`但是${position == "discardPile" ? "弃" : ""}牌堆里没有非基本牌!`); - } - const sum = player.getHistory("useSkill", (evt) => evt.skill == "dccaisi").length; - if (sum < player.maxHp) { - player.addTempSkill("dccaisi_more"); - player.addMark("dccaisi_more", 1, false); - } else player.tempBanSkill("dccaisi"); - }, - subSkill: { more: { charlotte: true, onremove: true } }, - }, - dczhuoli: { - audio: 2, - trigger: { global: "phaseEnd" }, - forced: true, - filter: function (event, player) { - return ( - player.getHistory("useCard").length > player.getHp() || - player.getHistory("gain").reduce((sum, evt) => sum + evt.cards.length, 0) > - player.getHp() - ); - }, - content: function* (event, map) { - const player = map.player; - if (player.maxHp < game.countPlayer2()) { - yield player.gainMaxHp(); - } - yield player.recover(); - }, - }, - //魏贾充 - dcbeini: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: function (card, player) { - const delt = player.countCards("h") - player.maxHp; - return delt > 0; - }, - selectCard: function () { - const player = get.player(); - const delt = player.countCards("h") - player.maxHp; - return delt > 0 ? delt : -1; - }, - promptfunc: () => { - const player = get.player(); - const delt = player.countCards("h") - player.maxHp; - let str = ""; - if (delt > 0) str += `弃置${get.cnNumber(delt)}张牌`; - else if (delt == 0) str += `点击“确定”`; - else str += `摸${get.cnNumber(-delt)}张牌`; - return `${str},然后选择两名角色,前者视为对后者使用一张【杀】,且这两者的非锁定技失效。`; - }, - content: function* (event, map) { - var player = map.player; - if (player.countCards("h") < player.maxHp) yield player.drawTo(player.maxHp); - if (game.countPlayer() < 2) { - event.finish(); - return; - } - var result = yield player - .chooseTarget( - "悖逆:请选择两名角色", - "前者视为对后者使用一张【杀】,且这两名角色的非锁定技失效直到回合结束。", - true, - 2, - (card, player, target) => { - var sha = new lib.element.VCard({ name: "sha", isCard: true }); - if (ui.selected.targets.length) { - var targetx = ui.selected.targets[0]; - return targetx.canUse(sha, target, false); - } - return lib.filter.cardEnabled(sha, target); - } - ) - .set("targetprompt", ["打人", "被打"]) - .set("multitarget", true) - .set("ai", (target) => { - var aiTargets = get.event("aiTargets"); - if (aiTargets) { - return aiTargets[ui.selected.targets.length] == target ? 10 : 0; - } - return 0; - }) - .set( - "aiTargets", - (() => { - var targets = [], - eff = 0; - var sha = new lib.element.VCard({ name: "sha", isCard: true }); - for (var user of game.filterPlayer()) { - for (var target of game.filterPlayer()) { - if (user == target) continue; - var targetsx = [user, target]; - targetsx.forEach((i) => i.addSkill("dcbeini_fengyin2")); - var effx = get.effect(target, sha, user, player); - targetsx.forEach((i) => i.removeSkill("dcbeini_fengyin2")); - if (user == player) effx += 1; - if (get.attitude(player, user) > 0) effx -= 0.1; - if (effx > eff) { - eff = effx; - targets = targetsx; - } - } - } - if (targets.length) return targets; - return null; - })() - ); - if (result.bool) { - var user = result.targets[0], - target = result.targets[1]; - result.targets.forEach((i) => i.addTempSkill("dcbeini_fengyin")); - var sha = new lib.element.VCard({ name: "sha", isCard: true }); - if (user.canUse(sha, target, false)) user.useCard(sha, target, false, "noai"); - } - }, - ai: { - order: 0.1, - result: { - player: function (player) { - if (player.countCards("h") - player.maxHp >= 3) return 1; - return game.hasPlayer((current) => get.attitude(player, current) <= 0) ? 1 : 0; - }, - }, - }, - subSkill: { - fengyin: { - inherit: "fengyin", - }, - fengyin2: { - inherit: "fengyin", - }, - }, - }, - dcshizong: { - audio: 2, - enable: "chooseToUse", - hiddenCard: function (player, name) { - if (get.type(name) != "basic") return false; - return player.countCards("he") >= player.countMark("dcshizong") + 1; - }, - filter: function (event, player) { - if (event.type == "wuxie" || event.dcshizong) return false; - if (player.countCards("he") < player.countMark("dcshizong") + 1) return false; - for (const name of lib.inpile) { - if (get.type(name) != "basic") continue; - const card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) return true; - if (name == "sha") { - for (const nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(card, player, event)) return true; - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - const vcards = get.inpileVCardList((info) => { - if (info[0] != "basic") return; - const card = { name: info[2], nature: info[3], isCard: true }; - return event.filterCard(card, player, event); - }); - return ui.create.dialog("恃纵", [vcards, "vcard"], "hidden"); - }, - check: function (button) { - if (get.event().getParent().type != "phase") return 1; - const player = get.player(); - const card = { name: button.link[2], nature: button.link[3] }; - if ( - game.hasPlayer((current) => { - return ( - player.canUse(card, current) && - get.effect(current, card, player, player) > 0 - ); - }) - ) { - switch (button.link[2]) { - case "tao": - return 5; - case "jiu": - return 3.01; - case "sha": - if (button.link[3] == "fire") return 2.95; - else if (button.link[3] == "thunder") return 2.92; - else return 2.9; - } - } - return 0; - }, - backup: function (links, player) { - return { - filterCard: true, - filterTarget: lib.filter.notMe, - selectTarget: 1, - selectCard: () => get.player().countMark("dcshizong") + 1, - viewAs: { - name: links[0][2], - nature: links[0][3], - suit: "none", - number: null, - isCard: true, - }, - position: "he", - popname: true, - ignoreMod: true, - ai1: function (card) { - return 1 / (1.1 + Math.max(-1, get.value(card))); - }, - ai2: function (target) { - return get.attitude(get.player(), target); - }, - precontent: function* (event, map) { - var player = map.player, - target = event.result.targets[0]; - player.logSkill("dcshizong", target); - if (!player.countMark("dcshizong")) - player - .when({ global: "phaseAfter" }) - .then(() => delete player.storage.dcshizong); - player.addMark("dcshizong", 1, false); - yield player.give(event.result.cards.slice(), target); - var viewAs = new lib.element.VCard({ - name: event.result.card.name, - nature: event.result.card.nature, - isCard: true, - }); - var result = yield target - .chooseCard( - "恃纵:是否将一张牌置于牌堆底?", - `若如此做,${get.translation(player)}视为使用一张${get.translation( - viewAs.nature - )}【${get.translation(viewAs.name)}】`, - "he" - ) - .set("ai", (card) => { - if (get.event("goon")) return 7 - get.value(card); - return 0; - }) - .set( - "goon", - get.attitude(target, player) * (player.getUseValue(viewAs) || 1) >= 1 - ); - var card = event.result.cards[0]; - if (result.bool) { - var card = result.cards[0]; - game.delayex(); - var next = target.loseToDiscardpile(card, ui.cardPile); - next.log = false; - if (get.position(card) == "e") { - game.log(target, "将", card, "置于了牌堆底"); - } else { - next.blank = true; - game.log(target, "将一张牌置于了牌堆底"); - } - result = yield next; - game.broadcastAll((viewAs) => { - lib.skill.dcshizong_backup2.viewAs = viewAs; - }, lib.skill.dcshizong_backup.viewAs); - var evt = event.getParent(); - evt.set("_backupevent", "dcshizong_backup2"); - evt.set( - "openskilldialog", - `请选择${get.translation(viewAs.nature)}${get.translation( - viewAs.name - )}的目标` - ); - evt.backup("dcshizong_backup2"); - evt.set("norestore", true); - evt.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - evt.goto(0); - if (target != _status.currentPhase) player.tempBanSkill("dcshizong"); - } else { - target.chat("不放!"); - game.log(target, "选择不将牌置于牌堆底"); - var evt = event.getParent(); - evt.set("dcshizong", true); - evt.goto(0); - } - game.delayx(); - }, - ai: { - order: 10, - }, - }; - }, - prompt: function (links, player) { - return `###恃纵:选择要交出的牌和目标角色###将${get.cnNumber( - player.countMark("dcshizong") + 1 - )}张牌交给一名其他角色,其可以选择将一张牌置于牌堆底,视为你使用一张${get.translation( - links[0][3] || "" - )}${get.translation(links[0][2])}。`; - }, - }, - ai: { - order: function () { - const player = get.player(), - event = get.event(); - if ( - event.filterCard({ name: "jiu" }, player, event) && - get.effect(player, { name: "jiu" }) > 0 - ) { - return get.order({ name: "jiu" }) + 0.1; - } - return get.order({ name: "sha" }) + 0.1; - }, - respondSha: true, - fireAttack: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - if (tag == "fireAttack") return true; - if (player.countCards("he") < player.countMark("dcshizong") + 1) return false; - if (tag == "respondSha" && arg != "use") return false; - }, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - backup: {}, - backup2: { - filterCard: () => false, - selectCard: -1, - precontent: function () { - delete event.result.skill; - }, - }, - }, - }, - //张曼成 - dclvecheng: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - content: function () { - player.addTempSkill("dclvecheng_xiongluan"); - player.markAuto("dclvecheng_xiongluan", [target]); - var cards = player.getCards("h", "sha"); - if (cards.length) player.addGaintag(cards, "dclvecheng_xiongluan"); - }, - ai: { - threaten: 3.1, - order: 3.5, - expose: 0.2, - result: { - target: function (player, target) { - if (player.getStorage("dclvecheng_xiongluan").includes(target)) return 0; - if ( - target.hasSkillTag( - "freeShan", - false, - { - player: player, - }, - true - ) - ) - return -0.6; - var hs = player.countCards("h", (card) => { - if (!player.canUse(card, target)) return false; - return ( - get.name(card) == "sha" && get.effect(target, card, player, player) > 0 - ); - }); - var ts = target.hp; - if (hs >= ts && ts > 1) return -2; - return -1; - }, - }, - }, - subSkill: { - xiongluan: { - trigger: { player: "phaseEnd" }, - charlotte: true, - forced: true, - popup: false, - onremove: function (player, skill) { - player.removeGaintag("dclvecheng_xiongluan"); - delete player.storage[skill]; - }, - filter: function (event, player) { - return player.getStorage("dclvecheng_xiongluan").some((i) => i.isIn()); - }, - content: function () { - "step 0"; - event.targets = player.getStorage("dclvecheng_xiongluan").slice(); - event.targets.sortBySeat(); - "step 1"; - if (!event.targets.length) { - event.finish(); - return; - } - var target = event.targets.shift(); - event.target = target; - target.showHandcards(); - var cards = target.getCards("h", "sha"); - if (!cards.length) event.redo(); - else event.forced = false; - "step 2"; - var forced = event.forced; - var prompt2 = forced - ? "掠城:选择对" + get.translation(player) + "使用的【杀】" - : "掠城:是否依次对" + get.translation(player) + "使用所有的【杀】?"; - target - .chooseToUse( - forced, - function (card, player, event) { - if (get.itemtype(card) != "card" || get.name(card) != "sha") - return false; - return lib.filter.filterCard.apply(this, arguments); - }, - prompt2 - ) - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", player); - "step 3"; - if (result.bool) { - if (target.countCards("h", "sha")) { - event.forced = true; - event.goto(2); - return; - } - } - event.forced = false; - event.goto(1); - }, - intro: { - content: "对$使用“掠城”【杀】无任何次数限制", - }, - mod: { - cardUsableTarget: function (card, player, target) { - if (!card.cards || card.cards.length != 1) return; - if ( - card.name == "sha" && - card.cards[0].hasGaintag("dclvecheng_xiongluan") && - player.getStorage("dclvecheng_xiongluan").includes(target) - ) - return true; - }, - }, - }, - }, - }, - dczhongji: { - audio: 2, - trigger: { player: "useCard" }, - filter: function (event, player) { - if (player.countCards("h") >= player.maxHp) return false; - var suit = get.suit(event.card); - return !lib.suit.includes(suit) || !player.countCards("h", { suit: suit }); - }, - check: function (event, player) { - var num = Math.min(20, player.maxHp - player.countCards("h")); - if (num <= 0) return false; - var numx = - player.getHistory("useSkill", (evt) => { - return evt.skill == "dczhongji"; - }).length + 1; - if (numx > num) return false; - if (_status.currentPhase != player) return true; - if ( - player.hasCard((card) => { - var suit = get.suit(card); - return ( - player.hasValueTarget(card) && - !player.hasCard((cardx) => { - return cardx != card && get.suit(cardx) == suit; - }) - ); - }) - ) - return false; - return true; - }, - prompt2: function (event, player) { - var num = Math.min(20, player.maxHp - player.countCards("h")); - var str = num > 0 ? "摸" + get.cnNumber(num) + "张牌,然后" : ""; - return ( - str + - "弃置" + - get.cnNumber( - 1 + - player.getHistory("useSkill", (evt) => { - return evt.skill == "dczhongji"; - }).length - ) + - "张牌" - ); - }, - content: function () { - "step 0"; - var num = Math.min(20, player.maxHp - player.countCards("h")); - if (num > 0) player.draw(num); - "step 1"; - var num = player.getHistory("useSkill", (evt) => { - return evt.skill == "dczhongji"; - }).length; - player - .chooseToDiscard("螽集:请弃置" + get.cnNumber(num) + "张牌", "he", true, num) - .set("ai", get.unuseful); - }, - ai: { - threaten: 3.2, - }, - }, - //乐周妃 - dclingkong: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - var cards = player.getCards("h"); - player.addGaintag(cards, "dclingkong_tag"); - }, - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("dclingkong_tag")) { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("dclingkong_tag")) { - return false; - } - }, - }, - group: "dclingkong_marker", - subSkill: { - marker: { - audio: "dclingkong", - trigger: { player: ["gainAfter", "loseAsyncAfter"] }, - forced: true, - filter: (event, player) => { - if (event.getParent("phaseDraw", true)) return false; - const evt = player.getHistory("gain", (i) => !i.getParent("phaseDraw", true))[0]; - if (!evt) return false; - if (event.name == "gain") { - if (evt != event || event.getlx === false) return false; - } else if (evt.getParent() != event) return false; - const hs = player.getCards("h"); - if (!hs.length) return false; - const cards = event.getg(player); - return cards.some((card) => hs.includes(card)); - }, - content: function () { - var hs = player.getCards("h"), - cards = trigger.getg(player); - cards = cards.filter((card) => hs.includes(card)); - player.addGaintag(cards, "dclingkong_tag"); - game.delayx(); - }, - }, - }, - }, - dcxianshu: { - audio: 2, - enable: "phaseUse", - filter: (event, player) => { - return ( - game.hasPlayer((current) => current != player) && - player.hasCard((card) => card.hasGaintag("dclingkong_tag"), "h") - ); - }, - filterCard: (card) => card.hasGaintag("dclingkong_tag"), - filterTarget: lib.filter.notMe, - discard: false, - lose: false, - delay: false, - position: "h", - check: (card) => { - const player = _status.event.player, - event = _status.event, - color = get.color(card); - if (color == "red") { - return (event.getTempCache("dcxianshu", "red") || - event.putTempCache( - "dcxianshu", - "red", - game - .hasPlayer((current) => { - return ( - current != player && - current.hp <= player.hp && - current.isDamaged() && - get.recoverEffect(current, player, player) > 0 - ); - }) - .toString() - )) == "true" - ? 7 - get.value(card) - : 0; - } else if (color == "black") { - return (event.getTempCache("dcxianshu", "black") || - event.putTempCache( - "dcxianshu", - "black", - game - .hasPlayer((current) => { - return ( - current != player && - current.hp >= player.hp && - get.effect(current, { name: "losehp" }, player, player) > 0 - ); - }) - .toString() - )) == "true" - ? 7 - get.value(card) - : 0; - } - return 6 - get.value(card); - }, - content: function () { - "step 0"; - player.give(cards, target, true); - event.color = get.color(cards[0], player); - "step 1"; - if (target.isIn()) { - var num = Math.min(Math.abs(target.getHp() - player.getHp()), 5); - if (num > 0) player.draw(num); - } - "step 2"; - if (event.color == "red") { - if (target.getHp() <= player.getHp() && target.isDamaged()) target.recover(); - } else if (event.color == "black") { - if (target.getHp() >= player.getHp()) target.loseHp(); - } - }, - ai: { - combo: "dclingkong", - order: 10, - result: { - player: function (player, target) { - if (!ui.selected.cards.length) return 0; - let num = target.getHp() - player.getHp(); - const card = ui.selected.cards[0], - color = get.color(card); - if (color == "red" && target.getHp() <= player.getHp() && target.isDamaged()) - num++; - else if (color == "black" && target.getHp() >= player.getHp()) num--; - return Math.min(Math.abs(num), 5) * 1.1; - }, - target: function (player, target) { - if (!ui.selected.cards.length) return 0; - const card = ui.selected.cards[0], - color = get.color(card), - val = get.value(card, target); - if (color == "red" && target.getHp() <= player.getHp() && target.isDamaged()) - return get.recoverEffect(target, player, target) + val / 1.4; - else if (color == "black" && target.getHp() >= player.getHp()) - return get.effect(target, { name: "losehp" }, player, target) + val / 1.4; - return val / 1.4; - }, - }, - }, - }, - //吴班 - dcyouzhan: { - audio: 2, - trigger: { - global: [ - "loseAfter", - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - direct: true, - filter: function (event, player) { - if (player != _status.currentPhase) return false; - return game.hasPlayer((current) => { - if (current == player) return false; - var evt = event.getl(current); - return evt && evt.cards2.length; - }); - }, - content: function () { - "step 0"; - var targets = game.filterPlayer((current) => { - if (current == player) return false; - var evt = trigger.getl(current); - return evt && evt.cards2.length; - }); - event.targets = targets; - player.logSkill("dcyouzhan", targets); - "step 1"; - event.target = targets.shift(); - event.num = trigger.getl(event.target).cards2.length; - "step 2"; - player.draw().gaintag = ["dcyouzhan"]; - player.addTempSkill("dcyouzhan_limit"); - target.addTempSkill("dcyouzhan_effect"); - target.addMark("dcyouzhan_effect", 1, false); - target.addTempSkill("dcyouzhan_draw"); - if (--event.num) event.redo(); - "step 3"; - if (targets.length) { - event.goto(1); - } - }, - ai: { - damageBonus: true, - skillTagFilter: function (player, tag, arg) { - if (!arg || !arg.target || !arg.target.hasSkill("dcyouzhan_effect")) return false; - }, - }, - subSkill: { - effect: { - audio: "dcyouzhan", - trigger: { - player: "damageBegin3", - }, - filter: function (event, player) { - return player.hasMark("dcyouzhan_effect"); - }, - forced: true, - charlotte: true, - onremove: true, - content: function () { - "step 0"; - trigger.num += player.countMark("dcyouzhan_effect"); - player.removeSkill("dcyouzhan_effect"); - }, - mark: true, - intro: { - content: "本回合下一次受到的伤害+#", - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) - return 1 + 0.5 * target.countMark("dcyouzhan_effect"); - }, - }, - }, - }, - draw: { - trigger: { - global: "phaseJieshuBegin", - }, - forced: true, - charlotte: true, - filter: function (event, player) { - return !player.getHistory("damage").length; - }, - content: function () { - player.draw(Math.min(3, player.getHistory("lose").length)); - }, - }, - limit: { - charlotte: true, - onremove: function (player) { - player.removeGaintag("dcyouzhan"); - }, - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("dcyouzhan")) return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("dcyouzhan")) return false; - }, - }, - }, - }, - }, - //乐蔡文姬 - dcshuangjia: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - var cards = player.getCards("h"); - player.addGaintag(cards, "dcshuangjia_tag"); - }, - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("dcshuangjia_tag")) { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("dcshuangjia_tag")) { - return false; - } - }, - globalTo: function (from, to, distance) { - return ( - distance + - Math.min( - 5, - to.countCards("h", (card) => card.hasGaintag("dcshuangjia_tag")) - ) - ); - }, - }, - }, - dcbeifen: { - audio: 2, - trigger: { - player: ["loseAfter"], - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter: function (event, player) { - var evt = event.getl(player); - if (!evt || !evt.hs || !evt.hs.length) return false; - if (event.name == "lose") { - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("dcshuangjia_tag")) return true; - } - return false; - } - return player.hasHistory("lose", (evt) => { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("dcshuangjia_tag")) return true; - } - return false; - }); - }, - forced: true, - content: function () { - var suits = lib.suit.slice(); - player.countCards("h", (card) => { - if (!card.hasGaintag("dcshuangjia_tag")) return false; - suits.remove(get.suit(card)); - }); - var cards = []; - while (suits.length) { - var suit = suits.shift(); - var card = get.cardPile((cardx) => { - return get.suit(cardx, false) == suit; - }); - if (card) cards.push(card); - } - if (cards.length) { - player.gain(cards, "gain2"); - } - }, - mod: { - cardUsable: function (card, player) { - var len = player.countCards("h"); - var cnt = player.countCards("h", (card) => card.hasGaintag("dcshuangjia_tag")); - if (2 * cnt < len) return Infinity; - }, - targetInRange: function (card, player) { - var len = player.countCards("h"); - var cnt = player.countCards("h", (card) => card.hasGaintag("dcshuangjia_tag")); - if (2 * cnt < len) return true; - }, - aiOrder: function (player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("dcshuangjia_tag")) { - var suits = lib.suit.slice(); - player.countCards("h", (cardx) => { - if (!cardx.hasGaintag("dcshuangjia_tag")) return false; - if (card == cardx) return false; - suits.remove(get.suit(cardx)); - }); - if (suits.length) return num + suits.length * 2.5; - } - }, - }, - }, - //孟优 - dcmanzhi: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - filter: function (event, player) { - if (event.name == "phaseJieshu") { - var del = 0; - game.getGlobalHistory("changeHp", (evt) => { - if (evt.player != player) return; - for (var phase of lib.phaseName) { - var evtx = evt.getParent(phase); - if (evtx && evtx.name == phase) { - del += evt.num; - break; - } - } - }); - if (del != 0) return false; - } - return game.hasPlayer((current) => { - if (current == player) return false; - return ( - (!player.hasSkill("dcmanzhi_1") && current.countCards("he")) || - (!player.hasSkill("dcmanzhi_2") && current.countCards("hej")) - ); - }); - }, - direct: true, - content: function () { - "step 0"; - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - player - .chooseTarget(get.prompt2("dcmanzhi"), (card, player, target) => { - if (player == target) return false; - return ( - (!player.hasSkill("dcmanzhi_1") && target.countCards("he")) || - (!player.hasSkill("dcmanzhi_2") && target.countCards("hej")) - ); - }) - .set("ai", (target) => { - return 1 - get.attitude(get.player(), target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - var choices = []; - var choiceList = [ - "令其交给你两张牌,然后其视为使用一张无距离限制的【杀】", - "你获得其区域内的至多两张牌,然后交给其等量的牌并摸一张牌", - ]; - var chosen = [player.hasSkill("dcmanzhi_1"), player.hasSkill("dcmanzhi_2")]; - if (target.countCards("he") && (!chosen[0] || trigger.name == "phaseZhunbei")) - choices.push("选项一"); - else - choiceList[0] = - '' + - choiceList[0] + - (chosen[0] ? "(已被选择过)" : "") + - ""; - if (target.countCards("hej") && (!chosen[1] || trigger.name == "phaseZhunbei")) - choices.push("选项二"); - else - choiceList[1] = - '' + - choiceList[1] + - (chosen[1] ? "(已被选择过)" : "") + - ""; - if (trigger.name == "phaseJieshu") choices.push("cancel2"); - player - .chooseControl(choices) - .set("choiceList", choiceList) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - if ( - target.getUseValue({ name: "sha" }, false) > 5 && - !player.hasShan() && - trigger.name == "phaseZhunbei" - ) - return 1; - return 0; - })() - ) - .set("prompt", "蛮智:请选择一项"); - } else { - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - event.finish(); - } - "step 2"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - if (result.control == "cancel2") { - event.finish(); - return; - } - player.logSkill("dcmanzhi", target); - if (result.control == "选项一") { - player.addTempSkill("dcmanzhi_1"); - target.chooseCard( - Math.min(2, target.countCards("he")), - "he", - "蛮智:请交给" + get.translation(player) + "两张牌", - true - ); - } else { - player.addTempSkill("dcmanzhi_2"); - player.gainPlayerCard(target, "hej", [1, 2], true); - event.goto(5); - } - "step 3"; - if (result.bool) { - target.give(result.cards, player); - } else event.finish(); - "step 4"; - target.chooseUseTarget("sha", true, "nodistance"); - event.finish(); - "step 5"; - if (result.bool && target.isIn()) { - var num = result.cards.length, - hs = player.getCards("he"); - if (!hs.length) event.finish(); - else if (hs.length < num) event._result = { bool: true, cards: hs }; - else - player.chooseCard( - "he", - true, - num, - "交给" + get.translation(target) + get.cnNumber(num) + "张牌" - ); - } else event.finish(); - "step 6"; - if (result.bool) { - player.give(result.cards, target); - player.draw(); - } - }, - subSkill: { - 1: { charlotte: true }, - 2: { charlotte: true }, - }, - }, - //孙綝 - dczigu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: true, - position: "he", - selectCard: 1, - check: function (card) { - var player = _status.event.player; - if (!player.hasSkill("dczuowei")) return 6 - get.value(card); - if ( - player.countCards("h") == player.countCards("e") + 1 && - !player.hasCard((card) => player.hasValueTarget(card), "h") - ) { - if (get.position(card) == "e") return 0; - return 8 - get.value(card); - } - return 6 - get.value(card); - }, - content: function () { - "step 0"; - var targets = game.filterPlayer((current) => { - return current.countGainableCards(player, "e"); - }); - if (targets.length == 0) event._result = { bool: false }; - else if (targets.length == 1) event._result = { bool: true, targets: targets }; - else - player - .chooseTarget( - "自固:获得一名角色装备区里的一张牌", - true, - (card, player, target) => { - return target.countGainableCards(player, "e"); - } - ) - .set("ai", (target) => { - if (target == _status.event.player) return 10; - if (get.attitude(_status.event.player, target) < 0) { - if ( - target.hasCard((card) => { - return get.value(card, player) >= 6; - }) - ) - return 12; - return 8; - } - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.gainPlayerCard("e", target, true); - } - "step 2"; - if ( - !result.bool || - target == player || - !result.cards || - !result.cards.some((i) => get.owner(i) == player) - ) - player.draw(); - }, - ai: { - order: function (item, player) { - if (!player.hasSkill("dczuowei")) return 9; - if ( - player.countCards("h") == player.countCards("e") + 1 && - !player.hasCard((card) => player.hasValueTarget(card), "h") - ) - return 9; - return 1; - }, - result: { - player: 1, - }, - }, - }, - dczuowei: { - audio: 2, - trigger: { player: "useCard" }, - filter: function (event, player) { - if (_status.currentPhase != player) return false; - if (!player.hasSkill("dczuowei_ban")) return true; - return Math.sign(player.countCards("h") - Math.max(1, player.countCards("e"))) >= 0; - }, - direct: true, - locked: false, - content: function () { - "step 0"; - var hs = player.countCards("h"); - var es = Math.max(1, player.countCards("e")); - var sign = Math.sign(hs - es); - event.sign = sign; - if (sign > 0) - player - .chooseBool( - get.prompt("dczuowei"), - "令" + get.translation(trigger.card) + "不可被响应" - ) - .set("ai", () => 1); - else if (sign == 0) - player - .chooseTarget( - get.prompt("dczuowei"), - "对一名其他角色造成1点伤害", - lib.filter.notMe - ) - .set("ai", (target) => { - return get.damageEffect(target, _status.event.player, _status.event.player); - }); - else - player - .chooseBool(get.prompt("dczuowei"), "摸两张牌,然后本回合你不能再触发该分支") - .set("ai", () => 1); - "step 1"; - if (!result.bool) event.finish(); - else if (event.sign <= 0 && !event.isMine() && !event.isOnline()) game.delayx(); - "step 2"; - var sign = event.sign; - if (sign > 0) { - player.logSkill("dczuowei"); - trigger.directHit.addArray(game.players); - event.finish(); - } else if (sign == 0) { - var target = result.targets[0]; - player.logSkill("dczuowei", target); - target.damage(); - } else { - player.logSkill("dczuowei"); - player.draw(2); - player.addTempSkill("dczuowei_ban"); - } - }, - subSkill: { - ban: { charlotte: true }, - }, - mod: { - aiValue: function (player, card, num) { - if (_status.currentPhase != player) return; - const event = get.event(); - if (!player.isPhaseUsing()) return; - if (event.type != "phase") return; - const cardsh = [], - cardse = []; - for (const cardx of ui.selected.cards) { - const pos = get.position(cardx); - if (pos == "h") cardsh.add(cardx); - else if (pos == "e") cardse.add(cardx); - } - const hs = player.countCards("h") - cardsh.length, - es = Math.max(1, player.countCards("e") - cardse.length); - const delt = hs - es; - if (delt <= 0) return; - if (get.position(card) == "h" && delt == 1) return num / 1.25; - }, - aiUseful: function () { - return lib.skill.dczuowei.mod.aiValue.apply(this, arguments); - }, - aiOrder: function (player, card, num) { - if (player.hasSkill("dczuowei_ban") || _status.currentPhase != player) return; - const cardsh = [], - cardse = []; - const pos = get.position(card); - if (pos == "h") cardsh.add(card); - else if (pos == "e") cardse.add(card); - if (get.tag(card, "draw") || get.tag(card, "gain")) { - const hs = player.countCards("h") - cardsh.length, - es = Math.max( - 1, - player.countCards("e") - cardse.length + (get.type(card) == "equip") - ); - if ((player.hasSkill("dczuowei_ban") && hs < es) || hs == es) return num + 10; - return num / 5; - } - }, - }, - ai: { - threaten: 3, - reverseEquip: true, - effect: { - player_use: function (card, player, target, current) { - if (_status.currentPhase != player) return; - if (get.type(card) == "equip" && get.cardtag(card, "gifts")) return; - if (player.countCards("h") > Math.max(1, player.countCards("e"))) return [1, 3]; - }, - }, - }, - }, - //刘宠骆俊 - dcminze: { - audio: 2, - enable: "phaseUse", - filterTarget: function (card, player, target) { - if (player.getStorage("dcminze_targeted").includes(target)) return false; - return target.countCards("h") < player.countCards("h"); - }, - filterCard: function (card, player) { - if (!ui.selected.cards.length) return true; - return get.name(ui.selected.cards[0]) != get.name(card); - }, - selectCard: [1, 2], - complexCard: true, - position: "he", - discard: false, - lose: false, - delay: false, - group: "dcminze_draw", - content: function () { - player.give(cards, target); - player.addTempSkill("dcminze_targeted", "phaseUseAfter"); - player.markAuto("dcminze_targeted", [target]); - player.addTempSkill("dcminze_given"); - player.markAuto( - "dcminze_given", - cards.map((i) => get.name(i, player)) - ); - }, - ai: { - order: 6.5, - expose: 0.2, - }, - subSkill: { - targeted: { onremove: true, charlotte: true }, - given: { - charlotte: true, - onremove: true, - intro: { - content: "本回合以此法交出的牌名:$", - }, - }, - draw: { - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.getStorage("dcminze_given").length; - }, - forced: true, - locked: false, - content: function () { - var num = - Math.min(5, player.getStorage("dcminze_given").length) - - player.countCards("h"); - if (num > 0) player.draw(num); - }, - }, - }, - }, - dcjini: { - audio: 2, - trigger: { player: "damageEnd" }, - direct: true, - filter: function (event, player) { - return player.maxHp - player.countMark("dcjini_counted") > 0; - }, - content: function () { - "step 0"; - player - .chooseCard( - get.prompt2("dcjini"), - [1, player.maxHp - player.countMark("dcjini_counted")], - lib.filter.cardRecastable - ) - .set("ai", (card) => { - return 6 - get.value(card); - }); - "step 1"; - if (result.bool) { - var cards = result.cards; - player.logSkill("dcjini"); - player.addTempSkill("dcjini_counted"); - player.addMark("dcjini_counted", cards.length, false); - event.recast = player.recast(cards); - } else event.finish(); - "step 2"; - if ( - trigger.source && - trigger.source.isIn() && - player.hasHistory( - "gain", - (evt) => - evt.getParent(2) == event.recast && - evt.cards.some((value) => get.name(value) == "sha") - ) - ) { - player - .chooseToUse(function (card) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "击逆:是否对" + get.translation(trigger.source) + "使用一张不可被响应的杀?") - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", trigger.source) - .set("oncard", () => { - _status.event.directHit.addArray(game.players); - }); - } - }, - subSkill: { - counted: { - onremove: true, - charlotte: true, - }, - }, - }, - //乐綝 - dcporui: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - if (player == event.player) return false; - if ( - player.countMark("dcporui_round") >= (player.hasMark("dcgonghu_basic") ? 2 : 1) || - player.countCards("h") == 0 - ) - return false; - return ( - game.hasPlayer((current) => { - if (current == player || current == event.player) return false; - return current.hasHistory("lose", function (evt) { - return evt.cards2.length > 0; - }); - }) && player.countCards("he") > 0 - ); - }, - direct: true, - content: function () { - "step 0"; - var map = {}; - game.countPlayer(function (current) { - if (current == player || current == trigger.player) return false; - if ( - current.hasHistory("lose", function (evt) { - return evt.cards2.length > 0; - }) - ) - map[current.playerid] = - Math.min( - 5, - current.getHistory("lose").reduce(function (num, evt) { - return num + evt.cards2.length; - }, 0) - ) + 1; - }); - player - .chooseCardTarget({ - prompt: get.prompt("dcporui"), - prompt2: get.skillInfoTranslation("dcporui", player), - filterCard: function (card, player) { - return lib.filter.cardDiscardable(card, player, "dcporui"); - }, - position: "he", - filterTarget: function (card, player, target) { - return Object.keys(_status.event.map).includes(target.playerid); - }, - ai1: function (card) { - return 7 - get.value(card); - }, - ai2: function (target) { - return ( - get.effect( - target, - { name: "sha" }, - _status.event.player, - _status.event.player - ) * _status.event.map[target.playerid] - ); - }, - }) - .set("map", map); - "step 1"; - if (result.bool) { - var target = result.targets[0], - cards = result.cards; - event.target = target; - player.logSkill("dcporui", target); - player.discard(cards); - event.num2 = Math.min( - 5, - target.getHistory("lose").reduce(function (num, evt) { - return num + evt.cards2.length; - }, 0) - ); - event.num = event.num2 + 1; - player.addTempSkill("dcporui_round", "roundStart"); - player.addMark("dcporui_round", 1, false); - } else event.finish(); - "step 2"; - var card = { name: "sha", isCard: true, storage: { dcporui: true } }; - if (player.canUse(card, target, false) && target.isIn()) { - player.useCard(card, target); - event.num--; - } else event.goto(4); - "step 3"; - if (event.num > 0) event.goto(2); - "step 4"; - if (!player.hasMark("dcgonghu_damage") && target.isIn()) { - var cards = player.getCards("h"); - if (cards.length == 0) event._result = { bool: false }; - else if (cards.length <= event.num2) event._result = { bool: true, cards: cards }; - else - player.chooseCard( - "破锐:交给" + get.translation(target) + get.cnNumber(event.num2) + "张手牌", - true, - event.num2 - ); - } else event.finish(); - "step 5"; - if (result.bool) { - player.give(result.cards, target); - } - event.finish(); - "step 6"; - if (player.hasMark("dcgonghu_basic")) { - if ( - !target.hasHistory("damage", (evt) => { - return ( - evt.card && - evt.card.storage && - evt.card.storage.dcporui && - evt.getParent("dcporui") == event - ); - }) - ) { - player.recover(); - } - } - }, - subSkill: { - round: { charlotte: true, onremove: true }, - }, - ai: { - expose: 0.4, - threaten: 3.8, - }, - }, - dcgonghu: { - audio: 2, - trigger: { - player: ["loseAfter", "damageEnd"], - source: "damageSource", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - filter: function (event, player) { - if (event.name == "damage") { - if (player.hasMark("dcgonghu_damage")) return false; - var num = 0; - player.getHistory("damage", (evt) => (num += evt.num)); - player.getHistory("sourceDamage", (evt) => (num += evt.num)); - return num > 1; - } - if (!_status.currentPhase || _status.currentPhase == player) return false; - if (player.hasMark("dcgonghu_basic")) return false; - if (_status.currentPhase && _status.currentPhase == player) return false; - var evt = event.getl(player); - if (!evt || !evt.cards2 || !evt.cards2.some((i) => get.type2(i, player) == "basic")) - return false; - var num = 0; - player.getHistory("lose", function (evtx) { - if (num < 2) { - if (evtx && evtx.cards2) - num += evtx.cards2.filter((i) => get.type2(i, player) == "basic").length; - } - }); - return num >= 2; - }, - group: ["dcgonghu_basic", "dcgonghu_trick"], - content: function () { - player.addMark("dcgonghu_" + (trigger.name == "damage" ? "damage" : "basic"), 1, false); - game.log(player, "修改了技能", "#g【破锐】"); - }, - ai: { - combo: "dcporui", - }, - subSkill: { - trick: { - audio: "dcgonghu", - trigger: { player: "useCard2" }, - direct: true, - locked: true, - filter: function (event, player) { - if (!player.hasMark("dcgonghu_basic") || !player.hasMark("dcgonghu_damage")) - return false; - var card = event.card; - if (get.color(card, false) != "red" || get.type(card, null, true) != "trick") - return false; - var info = get.info(card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - player - .chooseTarget(get.prompt("dcgonghu_trick"), function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2(_status.event.card, player, target) - ); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("dcgonghu_trick", event.targets); - trigger.targets.addArray(event.targets); - } - }, - }, - basic: { - audio: "dcgonghu", - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - if (!player.hasMark("dcgonghu_basic") || !player.hasMark("dcgonghu_damage")) - return false; - var card = event.card; - return get.color(card, false) == "red" && get.type(card, null, false) == "basic"; - }, - content: function () { - trigger.directHit.addArray(game.filterPlayer()); - game.log(trigger.card, "不可被响应"); - }, - }, - }, - }, - //张闿 - dcxiangshu: { - audio: 2, - trigger: { global: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return event.player != player && event.player.countCards("h") >= event.player.hp; - }, - content: function () { - "step 0"; - var list = [0, 1, 2, 3, 4, 5, "cancel2"]; - player - .chooseControl(list) - .set("prompt", get.prompt2("dcxiangshu")) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - if (get.attitude(player, trigger.player) > 0) return "cancel2"; - var cards = trigger.player.getCards("h"); - var num = 0; - for (var card of cards) { - if (!trigger.player.hasValueTarget(card)) { - num++; - if (num >= 5) break; - } - } - if (cards.length >= 3 && Math.random() < 0.5) num = Math.max(0, num - 1); - return num; - })() - ); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("dcxiangshu", trigger.player); - var num = result.index; - player.storage.dcxiangshu_lottery = num; - player.addTempSkill("dcxiangshu_lottery", "phaseUseAfter"); - } else event.finish(); - "step 2"; - player - .chooseToDiscard("相鼠:是否弃置一张牌不公布此数字?") - .set("ai", (card) => 2 - get.value(card)); - "step 3"; - if (!result.bool) { - var num = player.storage.dcxiangshu_lottery; - player.markSkill("dcxiangshu_lottery"); - player.popup(num); - game.log(player, "选择了数字", "#g" + num); - } - }, - subSkill: { - lottery: { - audio: "dcxiangshu", - trigger: { global: "phaseUseEnd" }, - charlotte: true, - forced: true, - onremove: true, - logTarget: "player", - filter: function (event, player) { - return ( - typeof player.storage.dcxiangshu_lottery == "number" && - Math.abs(event.player.countCards("h") - player.storage.dcxiangshu_lottery) <= - 1 - ); - }, - content: function () { - var delt = Math.abs( - trigger.player.countCards("h") - player.storage.dcxiangshu_lottery - ); - if (delt <= 1 && trigger.player.countGainableCards("he", player) > 0) { - player.gainPlayerCard(trigger.player, "he", true); - } - if (delt == 0) { - trigger.player.damage(player); - } - }, - intro: { content: "猜测的数字为#" }, - }, - }, - }, - //裴元绍 - dcmoyu: { - audio: 2, - init() { - game.addGlobalSkill("dcmoyu_ai"); - }, - onremove() { - if (!game.hasPlayer(i => i.hasSkill("dcmoyu"), true)) game.removeGlobalSkill("dcmoyu_ai"); - }, - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer((current) => lib.skill.dcmoyu.filterTarget(null, player, current)); - }, - filterTarget(card, player, target) { - return player != target && !player.getStorage("dcmoyu_clear").includes(target) && target.countGainableCards(player, "hej"); - }, - async content(event, trigger, player) { - const target = event.target; - player.addTempSkill("dcmoyu_clear"); - player.markAuto("dcmoyu_clear", [target]); - await player.gainPlayerCard(target, "hej", true, 1 + player.hasSkill("dcmoyu_add")); - player.removeSkill("dcmoyu_add"); - const num = player.getStorage("dcmoyu_clear").length; - const result = await 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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", player) - .set("num", num) - .set("oncard", card => { - _status.event.baseDamage = _status.event.getParent().num; - }) - .forResult(); - if (result.bool) { - if ( - player.hasHistory("damage", evt => { - return evt.card && evt.card.name == "sha" && evt.getParent(4) == event; - }) - ) { - player.tempBanSkill("dcmoyu"); - } else { - player.addTempSkill("dcmoyu_add", "phaseChange"); - } - } - }, - subSkill: { - clear: { - charlotte: true, - onremove: true, - }, - ban: { - charlotte: true, - mark: true, - marktext: "欲", - intro: { content: "偷马贼被反打了!" }, - }, - add: { - charlotte: true, - mark: true, - marktext: "欲", - intro: { content: "欲望加速,下次抢两张!" }, - }, - ai: { - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer((i) => i.hasSkill("dcmoyu"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("dcmoyu_ai"); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "delay" && current < 0) { - var currentx = _status.currentPhase; - if (!currentx || !currentx.isIn()) return; - var list = game.filterPlayer((current) => { - if (current == target) return true; - if (!current.hasSkill("dcmoyu")) return false; - if (current.hasJudge("lebu")) return false; - return get.attitude(current, target) > 0; - }); - list.sortBySeat(currentx); - if (list.indexOf(target) != 0) return "zerotarget"; - } - }, - }, - }, - }, - }, - ai: { - order: 9, - threaten: 2.4, - result: { - target: function (player, target) { - var num = get.sgn(get.attitude(player, target)); - var eff = get.effect(target, { name: "shunshou" }, player, player) * num; - if (eff * num > 0) return eff / 10; - if ( - player.hasShan() && - !target.hasSkillTag( - "directHit_ai", - true, - { - target: player, - card: { name: "sha" }, - }, - true - ) - ) - return eff; - if ( - target.hasSha() && - player.hp + - player.countCards("hs", function (card) { - var mod2 = game.checkMod( - card, - player, - "unchanged", - "cardEnabled2", - player - ); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod( - card, - player, - player, - "unchanged", - "cardSavable", - player - ); - if (mod != "unchanged") return mod; - var savable = get.info(card).savable; - if (typeof savable == "function") - savable = savable(card, player, player); - return savable; - }) <= - 1 - ) - return 0; - return eff; - }, - }, - }, - }, - oldmoyu: { - audio: "dcmoyu", - init: () => { - game.addGlobalSkill("oldmoyu_ai"); - }, - onremove: () => { - if (!game.hasPlayer((i) => i.hasSkill("oldmoyu"), true)) - game.removeGlobalSkill("oldmoyu_ai"); - }, - enable: "phaseUse", - filter: function (event, player) { - return ( - !player.hasSkill("oldmoyu_ban") && - game.hasPlayer((current) => lib.skill.oldmoyu.filterTarget(null, player, current)) - ); - }, - filterTarget: function (card, player, target) { - return ( - player != target && - !player.getStorage("oldmoyu_clear").includes(target) && - target.countGainableCards(player, "hej") - ); - }, - content: function () { - "step 0"; - player.addTempSkill("oldmoyu_clear"); - player.markAuto("oldmoyu_clear", [target]); - player.gainPlayerCard(target, "hej", true); - "step 1"; - var num = player.getStorage("oldmoyu_clear").length; - target - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "是否对" + - get.translation(player) + - "使用一张无距离限制的【杀】(伤害基数为" + - num + - ")?") - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", player) - .set("num", num) - .set("oncard", (card) => { - _status.event.baseDamage = _status.event.getParent().num; - }); - "step 2"; - if (result.bool) { - if ( - player.hasHistory("damage", (evt) => { - return evt.card && evt.card.name == "sha" && evt.getParent(4) == event; - }) - ) - player.addTempSkill("oldmoyu_ban"); - } - }, - subSkill: { - clear: { - charlotte: true, - onremove: true, - }, - ban: { - charlotte: true, - mark: true, - marktext: "欲", - intro: { content: "偷马贼被反打了!" }, - }, - ai: { - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer((i) => i.hasSkill("oldmoyu"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("oldmoyu_ai"); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "delay" && current < 0) { - var currentx = _status.currentPhase; - if (!currentx || !currentx.isIn()) return; - var list = game.filterPlayer((current) => { - if (current == target) return true; - if (!current.hasSkill("oldmoyu")) return false; - if (current.hasJudge("lebu")) return false; - return get.attitude(current, target) > 0; - }); - list.sortBySeat(currentx); - if (list.indexOf(target) != 0) return "zerotarget"; - } - }, - }, - }, - }, - }, - ai: { - order: 9, - threaten: 2.4, - result: { - target: function (player, target) { - var num = get.sgn(get.attitude(player, target)); - var eff = get.effect(target, { name: "shunshou" }, player, player) * num; - if (eff * num > 0) return eff / 10; - if ( - player.hasShan() && - !target.hasSkillTag( - "directHit_ai", - true, - { - target: player, - card: { name: "sha" }, - }, - true - ) - ) - return eff; - if ( - target.hasSha() && - player.hp + - player.countCards("hs", function (card) { - var mod2 = game.checkMod( - card, - player, - "unchanged", - "cardEnabled2", - player - ); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod( - card, - player, - player, - "unchanged", - "cardSavable", - player - ); - if (mod != "unchanged") return mod; - var savable = get.info(card).savable; - if (typeof savable == "function") - savable = savable(card, player, player); - return savable; - }) <= - player.getStorage("oldmoyu_clear").length + 1 - ) - return 0; - return eff; - }, - }, - }, - }, - //张楚 - dcjizhong: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - selectTarget: 1, - content: function () { - "step 0"; - target.draw(2); - "step 1"; - var marked = target.hasMark("dcjizhong"); - var cards = target.getCards("h"); - if (marked) { - if (cards.length <= 3) event._result = { bool: true, cards: cards }; - else target.chooseCard(`集众:交给${get.translation(player)}三张手牌`, 3, true); - } else { - target - .chooseCard( - `集众:交给${get.translation(player)}三张手牌,或点击“取消”获得“信众”标记`, - 3 - ) - .set("ai", (card) => { - if (get.event("goon")) return 20 - get.value(card); - return 1 - get.value(card); - }) - .set("goon", get.attitude(target, player) > 0); - } - "step 2"; - if (!result.bool) { - target.addMark("dcjizhong", 1); - } else { - target.give(result.cards, player); - } - }, - marktext: "信", - intro: { - name: "信众", - name2: "信众", - markcount: () => 0, - content: "已成为信徒", - }, - ai: { - order: 9.5, - result: { - target: function (player, target) { - var num = target.countCards("h"); - if (num <= 1) return -num; - if (get.attitude(player, target) > 0) return 1; - return -1 / (num / 2 + 1); - }, - }, - }, - }, - dcrihui: { - audio: 2, - trigger: { player: "useCardAfter" }, - usable: 1, - filter: function (event, player) { - if (!event.targets || event.targets.length != 1 || event.targets[0] == player) - return false; - var card = event.card; - var target = event.targets[0]; - var marked = target.hasMark("dcjizhong"); - return ( - (get.type(card) == "trick" || - (get.color(card) == "black" && get.type(card) == "basic")) && - (marked || (!marked && game.hasPlayer((current) => current.hasMark("dcjizhong")))) - ); - }, - logTarget: (event) => event.targets[0], - prompt2(event, player) { - const target = event.targets[0]; - if (target.hasMark("dcjizhong")) return "获得该角色区域内的一张牌"; - else { - const card = { name: event.card.name, nature: event.card.nature, isCard: true }; - return "令所有有“信众”的角色依次视为对其使用一张" + get.translation(card); - } - }, - check(event, player) { - const target = event.targets[0]; - if (target.hasMark("dcjizhong")) { - return get.effect(target, { name: "shunshou_copy" }, event, player) > 0; - } else { - const card = { name: event.card.name, nature: event.card.nature, isCard: true }; - let eff = 0; - game.countPlayer((current) => { - if (!current.hasMark("dcjizhong") || !current.canUse(card, player, false)) return; - eff += get.effect(target, card, current, player); - }); - return eff > 0; - } - }, - async content(event, trigger, player) { - const target = trigger.targets[0]; - if (target.hasMark("dcjizhong")) { - await player.gainPlayerCard(target, "hej", true); - } else { - const card = { name: trigger.card.name, nature: trigger.card.nature, isCard: true }; - const targets = game - .filterPlayer((current) => current.hasMark("dcjizhong")) - .sortBySeat(_status.currentPhase); - for (const current of targets) { - if (target.isIn() && current.isIn() && current.canUse(card, target, false)) { - await current.useCard(card, target, false); - } - } - } - }, - ai: { - combo: "dcjizhong", - }, - }, - dcguangshi: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return !game.hasPlayer((current) => current != player && !current.hasMark("dcjizhong")); - }, - forced: true, - content: function () { - player.draw(2); - player.loseHp(); - }, - ai: { - combo: "dcjizhong", - }, - }, - //董绾 - dcshengdu: { - audio: 2, - trigger: { player: "phaseBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("dcshengdu"), lib.filter.notMe).set("ai", (target) => { - var player = _status.event.player; - var att = get.attitude(player, target); - var eff = get.effect( - target, - { - name: "sha", - storage: { dcjieling: true }, - }, - player, - player - ); - var value = att / 5; - if (value < 0) value = -value / 1.3; - value = Math.max(value - eff / 20, 0.01); - return value; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dcshengdu", target); - target.addMark("dcshengdu", 1); - } - }, - intro: { content: "mark" }, - group: "dcshengdu_effect", - subSkill: { - effect: { - audio: "dcshengdu", - trigger: { global: "gainAfter" }, - filter: function (event, player) { - return ( - event.getParent(2).name == "phaseDraw" && event.player.hasMark("dcshengdu") - ); - }, - forced: true, - logTarget: "player", - content: function () { - var num = trigger.player.countMark("dcshengdu"); - player.draw(num * trigger.cards.length); - trigger.player.removeMark("dcshengdu", num); - }, - }, - }, - }, - dcjieling: { - audio: 2, - enable: "phaseUse", - position: "hs", - viewAs: { - name: "sha", - storage: { dcjieling: true }, - }, - filterCard: function (card, player) { - if (player.getStorage("dcjieling_count").includes(get.suit(card))) return false; - if (ui.selected.cards.length) { - return get.suit(card) != get.suit(ui.selected.cards[0]); - } - return true; - }, - selectCard: 2, - complexCard: true, - check: function (card) { - return 6 - get.value(card); - }, - precontent: function () { - player.addTempSkill("dcjieling_after"); - event.getParent().addCount = false; - player.addTempSkill("dcjieling_count", "phaseUseAfter"); - player.markAuto( - "dcjieling_count", - event.result.cards.reduce((list, card) => list.add(get.suit(card, player)), []) - ); - }, - ai: { - order: function (item, player) { - return get.order({ name: "sha" }) + 0.1; - }, - }, - locked: false, - mod: { - targetInRange: function (card) { - if (card.storage && card.storage.dcjieling) return true; - }, - cardUsable: function (card, player, num) { - if (card.storage && card.storage.dcjieling) return Infinity; - }, - }, - subSkill: { - after: { - charlotte: true, - audio: "dcjieling", - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return ( - event.card.name == "sha" && event.card.storage && event.card.storage.dcjieling - ); - }, - direct: true, - content: function () { - "step 0"; - var damaged = game.hasPlayer2((current) => { - return current.hasHistory("damage", (evt) => evt.card == trigger.card); - }); - var targets = trigger.targets.filter((i) => i.isIn()); - player.logSkill("dcjieling_after", targets); - if (damaged) { - for (var target of targets) { - target.loseHp(); - } - } else { - for (var target of targets) { - target.addMark("dcshengdu", 1); - } - } - }, - }, - count: { - intro: { - content: function (s, p) { - let str = "此阶段已转化过的卡牌花色:"; - for (let i = 0; i < s.length; i++) { - str += get.translation(s[i]); - } - return str; - }, - }, - charlotte: true, - onremove: true, - }, - }, - }, - //袁胤 - dcmoshou: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - init: function (player, skill) { - if (typeof player.storage[skill] != "number") player.storage[skill] = 0; - }, - filter: function (event, player) { - return get.color(event.card) == "black" && event.player != player; - }, - frequent: true, - prompt2: function (event, player) { - var num = - (player.getAllHistory("useSkill", (evt) => evt.skill == "dcmoshou").length % 3) + 1; - return "摸" + get.cnNumber(num) + "张牌"; - }, - content: function () { - var num = player.getAllHistory("useSkill", (evt) => evt.skill == "dcmoshou").length; - player.storage.dcmoshou = num; - player.syncStorage("dcmoshou"); - player.markSkill("dcmoshou"); - num = ((num - 1) % 3) + 1; - player.draw(num); - }, - mark: true, - marktext: "守", - intro: { - markcount: function (storage, player) { - if (typeof storage != "number") return 1; - return (storage % 3) + 1; - }, - content: "本局游戏已发动过$次技能", - }, - }, - dcyunjiu: { - audio: 2, - trigger: { global: "dieAfter" }, - direct: true, - content: function () { - "step 0"; - var evt = trigger.player.getHistory("lose", (evtx) => { - return evtx.getParent(2) == trigger; - })[0]; - if (!evt) event.finish(); - else { - var cards = []; - //冷知识,角色死亡后只有手牌区和装备区的牌是被系统弃置的,其余牌的处理方式均为置入弃牌堆 - cards.addArray(evt.hs).addArray(evt.es); - event.cards = cards.filterInD("d"); - var num = cards.length; - if (num) { - event.videoId = lib.status.videoId++; - var func = function (cards, id) { - var num = cards.length; - var dialog = ui.create.dialog( - get.prompt("dcyunjiu"), - '
    弃置' + - get.cnNumber(num) + - "张牌,令一名其他角色获得以下这些牌
    ", - cards - ); - dialog.videoId = id; - return dialog; - }; - if (player.isOnline2()) { - player.send(func, cards, event.videoId); - } - event.dialog = func(cards, event.videoId); - if (player != game.me || _status.auto) { - event.dialog.style.display = "none"; - } - player.chooseCardTarget({ - prompt: false, - filterTarget: lib.filter.notMe, - filterCard: lib.filter.cardDiscardable, - selectCard: num, - position: "he", - goon: (function () { - if (!game.hasPlayer((current) => get.attitude(player, current)) > 0) - return false; - var value = 0; - for (var card of cards) { - value += get.value(card, player, "raw") - 1.2; - } - return value > 0; - })(), - ai1: function (card) { - if (_status.event.goon) { - if ( - ui.selected.cards.length == _status.event.selectCard[1] - 1 && - ui.selected.cards.length > 0 - ) - return 7 - get.value(card); - return 5.5 - get.value(card); - } - return 0; - }, - ai2: function (target) { - return ( - get.attitude(_status.event.player, target) / - Math.sqrt(target.countCards("h") + 1) - ); - }, - }); - } else event.finish(); - } - "step 1"; - if (player.isOnline2()) { - player.send("closeDialog", event.videoId); - } - event.dialog.close(); - if (result.bool) { - var cardsx = result.cards, - target = result.targets[0]; - player.logSkill("dcyunjiu", target); - player.discard(cardsx); - target.gain(cards.filterInD("d"), "gain2").giver = player; - } else event.finish(); - "step 2"; - player.gainMaxHp(); - player.recover(); - }, - }, - //高翔 - dcchiying: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.hp <= player.hp; - }, - content: function () { - "step 0"; - var targets = game - .filterPlayer((current) => target.inRange(current) && current != player) - .sortBySeat(player); - event.targets = targets; - if (!targets.length) event.finish(); - "step 1"; - var current = targets.shift(); - if (current.countCards("he")) current.chooseToDiscard("驰应:请弃置一张牌", "he", true); - if (targets.length) event.redo(); - "step 2"; - if (target != player) { - var cards = []; - game.getGlobalHistory("cardMove", (evt) => { - if (evt.getParent(3) == event) { - cards.addArray(evt.cards.filter((card) => get.type(card) == "basic")); - } - }); - cards = cards.filterInD("d"); - if (cards.length) target.gain(cards, "gain2"); - } - }, - ai: { - order: 6, - result: { - target: function (player, target) { - var targets = game.filterPlayer( - (current) => target.inRange(current) && current != player - ); - var eff = 0; - for (var targetx of targets) { - var effx = get.effect(targetx, { name: "guohe_copy2" }, player, target); - if (get.attitude(player, targetx) < 0) effx /= 2; - eff += effx; - } - return ( - (target == player ? 0.5 : 1) * - eff * - (get.attitude(player, target) <= 0 ? 0.75 : 1) - ); - }, - }, - }, - }, - //霍峻 - dcgue: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - if (player.hasSkill("dcgue_blocker", null, null, false)) return false; - return name == "sha" || name == "shan"; - }, - filter: function (event, player) { - if (event.dcgue || event.type == "wuxie" || player == _status.currentPhase) return false; - if (player.hasSkill("dcgue_blocker", null, null, false)) return false; - for (var name of ["sha", "shan"]) { - if (event.filterCard({ name: name, isCard: true }, player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var vcards = []; - for (var name of ["sha", "shan"]) { - var card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); - } - return ui.create.dialog("孤扼", [vcards, "vcard"], "hidden"); - }, - check: function (button) { - if (_status.event.player.countCards("h", { name: ["sha", "shan"] }) > 1) return 0; - return 1; - }, - backup: function (links, player) { - return { - filterCard: () => false, - selectCard: -1, - viewAs: { - name: links[0][2], - isCard: true, - }, - popname: true, - precontent: function () { - "step 0"; - player.logSkill("dcgue"); - player.addTempSkill("dcgue_blocker"); - if (player.countCards("h")) player.showHandcards(); - delete event.result.skill; - "step 1"; - if (player.countCards("h", { name: ["sha", "shan"] }) > 1) { - var evt = event.getParent(); - evt.set("dcgue", true); - evt.goto(0); - delete evt.openskilldialog; - return; - } - game.delayx(); - }, - }; - }, - prompt: function (links, player) { - return ( - (player.countCards ? "展示所有手牌" : "") + - (player.countCards("h", { name: ["sha", "shan"] }) <= 1 - ? ",然后视为使用【" + get.translation(links[0][2]) + "】" - : "") - ); - }, - }, - subSkill: { blocker: { charlotte: true } }, - ai: { - order: 1, - respondSha: true, - respondShan: true, - skillTagFilter: function (player) { - if (player.hasSkill("dcgue_blocker", null, null, false)) return false; - }, - result: { - player: function (player) { - if (player.countCards("h", { name: ["sha", "shan"] }) > 1) return 0; - return 1; - }, - }, - }, - }, - dcsigong: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - if (player.hasSkill("dcsigong_round")) return false; - if (event.player == player || !event.player.isIn()) return false; - if (!player.canUse("sha", event.player, false)) return false; - var respondEvts = []; - game.countPlayer2((current) => - respondEvts - .addArray(current.getHistory("useCard")) - .addArray(current.getHistory("respond")) - ); - respondEvts = respondEvts.filter((i) => i.respondTo).map((evt) => evt.respondTo); - return event.player.hasHistory("useCard", (evt) => { - return respondEvts.some((list) => list[1] == evt.card); - }); - }, - direct: true, - content: function () { - "step 0"; - var num = 1 - player.countCards("h"); - event.num = num; - var prompt2 = ""; - if (num >= 0) { - var next = player.chooseBool().set("ai", () => _status.event.goon); - prompt2 += - (num > 0 ? "摸一张牌," : "") + - "视为对" + - get.translation(trigger.player) + - "使用一张【杀】(伤害基数+1)"; - } else { - var next = player - .chooseToDiscard(-num) - .set("ai", (card) => { - if (_status.event.goon) return 5.2 - get.value(card); - return 0; - }) - .set("logSkill", ["dcsigong", trigger.player]); - prompt2 += - "将手牌数弃置至1,视为对" + - get.translation(trigger.player) + - "使用一张【杀】(伤害基数+1)"; - } - next.set("prompt", get.prompt("dcsigong", trigger.player)); - next.set("prompt2", prompt2); - next.set("goon", get.effect(trigger.player, { name: "sha" }, player, player) > 0); - "step 1"; - if (result.bool) { - if (num >= 0) player.logSkill("dcsigong", trigger.player); - if (num > 0) player.draw(num, "nodelay"); - event.num = Math.max(1, Math.abs(num)); - } else event.finish(); - "step 2"; - if (player.canUse("sha", trigger.player, false)) { - player.addTempSkill("dcsigong_check"); - player - .useCard({ name: "sha", isCard: true }, trigger.player, false) - .set("shanReq", num) - .set("oncard", (card) => { - var evt = _status.event; - evt.baseDamage++; - for (var target of game.filterPlayer(null, null, true)) { - var id = target.playerid; - var map = evt.customArgs; - if (!map[id]) map[id] = {}; - map[id].shanRequired = evt.shanReq; - } - }); - } - }, - subSkill: { - round: { charlotte: true }, - check: { - charlotte: true, - forced: true, - popup: false, - trigger: { source: "damageSource" }, - filter: function (event, player) { - return ( - event.card && - event.card.name == "sha" && - event.getParent(3).name == "dcsigong" - ); - }, - content: function () { - player.addTempSkill("dcsigong_round", "roundStart"); - }, - }, - }, - }, - //孙寒华 - dchuiling: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - direct: true, - filter: function () { - return ui.discardPile.childNodes.length > 0; - }, - onremove: true, - mark: true, - marktext: "灵", - intro: { - name2: "灵", - mark: function (dialog, storage, player) { - dialog.addText("共有" + (storage || 0) + "个标记"); - dialog.addText("注:图标的颜色代表弃牌堆中较多的颜色"); - }, - }, - global: "dchuiling_hint", - content: function () { - "step 0"; - var mark = false; - var red = 0, - black = 0; - for (var i = 0; i < ui.discardPile.childNodes.length; i++) { - var color = get.color(ui.discardPile.childNodes[i]); - if (color == "red") red++; - if (color == "black") black++; - } - if (red == black) event.finish(); - else if (red > black) { - player.logSkill("dchuiling"); - player.recover(); - event.finish(); - if (get.color(trigger.card) == "black") mark = true; - event.logged = true; - } else { - if (!event.isMine() && !event.isOnline()) game.delayx(); - player - .chooseTarget( - get.prompt("dchuiling"), - "弃置一名角色的一张牌", - (card, player, target) => { - return target.countDiscardableCards(player, "he") > 0; - } - ) - .set("ai", (target) => { - return get.effect(target, { name: "guohe_copy2" }, _status.event.player); - }); - if (get.color(trigger.card) == "red") mark = true; - } - if (mark) { - if (!event.logged) player.logSkill("dchuiling"); - player.addMark("dchuiling", 1); - event.logged = true; - } - "step 1"; - if (result.bool) { - var target = result.targets[0]; - if (!event.logged) player.logSkill("dchuiling", target); - else player.line(target); - player.discardPlayerCard(target, "he", true); - } - }, - subSkill: { - hint: { - trigger: { - global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], - }, - forced: true, - popup: false, - lastDo: true, - forceDie: true, - forceOut: true, - filter: function (event, player) { - if (event._dchuiling_checked) return false; - event._dchuiling_checked = true; - var cards = event.getd(); - if (!cards.filterInD("d").length) return false; - return true; - }, - markColor: [ - ["rgba(241, 42, 42, 0.75)", "black"], - ["", ""], - ["rgba(18, 4, 4, 0.75)", "rgb(200, 200, 200)"], - ], - content: function () { - "step 0"; - var red = 0, - black = 0; - for (var i = 0; i < ui.discardPile.childNodes.length; i++) { - var color = get.color(ui.discardPile.childNodes[i]); - if (color == "red") red++; - if (color == "black") black++; - } - if (trigger.name.indexOf("lose") == 0) { - var cards = trigger.getd().filterInD("d"); - for (var i = 0; i < cards.length; i++) { - var color = get.color(cards[i]); - if (color == "red") red++; - if (color == "black") black++; - } - } - game.broadcastAll(function (ind) { - var bgColor = lib.skill.dchuiling_hint.markColor[ind][0], - text = - ''; - for (var player of game.players) { - if (player.marks.dchuiling) { - player.marks.dchuiling.firstChild.style.backgroundColor = bgColor; - player.marks.dchuiling.firstChild.innerHTML = text; - } - } - }, Math.sign(black - red) + 1); - }, - }, - }, - mod: { - aiOrder: function (player, card, num) { - if (get.itemtype(card) != "card") return; - var len = ui.discardPile.childNodes.length; - if (!len) { - var type = get.type(card); - if (type == "basic" || type == "trick") { - if (player.getDamagedHp() > 0) { - return num + (get.color(card) == "red" ? 15 : 10); - } - return num + 10; - } - return; - } - if (len > 40) return; - var red = 0, - black = 0; - for (var i = 0; i < ui.discardPile.childNodes.length; i++) { - var color = get.color(ui.discardPile.childNodes[i]); - if (color == "red") red++; - if (color == "black") black++; - } - if (red == black) { - var type = get.type(card); - if (type == "basic" || type == "trick") { - if (player.getDamagedHp() > 0) { - return num + (get.color(card) == "red" ? 15 : 10); - } - return num + 10; - } - return; - } else { - var color = get.color(card); - if ((color == "red" && red < black) || (color == "black" && red > black)) - return num + 10; - } - }, - }, - }, - dcchongxu: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "wood", - derivation: ["dctaji", "dcqinghuang"], - filterCard: () => false, - selectCard: [0, 1], - prompt: function () { - return ( - "限定技。你可以失去〖汇灵〗,增加" + - Math.min(game.countPlayer(), _status.event.player.countMark("dchuiling")) + - "点体力上限,然后获得〖踏寂〗和〖清荒〗。" - ); - }, - filter: function (event, player) { - return player.countMark("dchuiling") >= 4; - }, - content: function () { - "step 0"; - player.awakenSkill("dcchongxu"); - player.removeSkills("dchuiling"); - player.gainMaxHp(Math.min(game.countPlayer(), player.countMark("dchuiling"))); - "step 1"; - player.addSkills(["dctaji", "dcqinghuang"]); - }, - ai: { - combo: "dchuiling", - order: function (itemp, player) { - if ( - player.hasCard((card) => { - return get.type(card) != "equip" && player.getUseValue(card) > 1; - }, "h") - ) - return 12; - return 0.1; - }, - result: { - player: function (player) { - var count = player.countMark("dchuiling"); - if (count >= game.countPlayer() - 1) return 1; - return count >= 6 || player.hp <= 2 ? 1 : 0; - }, - }, - }, - }, - dctaji: { - audio: 2, - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - locked: false, - filter: function (event, player) { - var evt = event.getl(player); - return evt && evt.hs && evt.hs.length; - }, - content: function () { - "step 0"; - var evt = trigger.getParent(); - var effects = [ - [ - "useCard", - function () { - "step 0"; - var targets = game.filterPlayer((current) => { - return current.countDiscardableCards(player, "he") && current != player; - }); - if (!targets.length) event.finish(); - else - player - .chooseTarget( - "踏寂:弃置其他角色一张牌", - true, - (card, player, target) => { - return _status.event.targets.includes(target); - } - ) - .set("targets", targets) - .set("ai", (target) => { - return get.effect( - target, - { name: "guohe_copy2" }, - _status.event.player - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - player.discardPlayerCard(target, "he", true); - } - }, - ], - [ - "respond", - function () { - player.draw(); - }, - ], - [ - "discard", - function () { - player.recover(); - }, - ], - [ - "other", - function () { - player.addSkill("dctaji_damage"); - player.addMark("dctaji_damage", 1, false); - game.log(player, "下一次对其他角色造成的伤害", "#g+1"); - }, - ], - ]; - var name = evt.name; - if (trigger.name == "loseAsync") name = evt.type; - var list = ["useCard", "respond", "discard", "other"]; - if (!list.includes(name)) name = "other"; - for (var i = 0; i < 1 + player.countMark("dcqinghuang_add"); i++) { - if (!list.length) break; - if (!list.includes(name)) name = list.randomRemove(1)[0]; - if (name == "useCard") list.remove("useCard"); - for (var effect of effects) { - if (effect[0] == name) { - list.remove(name); - var next = game.createEvent("dctaji_" + name); - next.player = player; - next.setContent(effect[1]); - break; - } - } - } - }, - subSkill: { - damage: { - trigger: { source: "damageBegin1" }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - return event.player != player; - }, - content: function () { - trigger.num += player.countMark("dctaji_damage"); - player.removeSkill("dctaji_damage"); - }, - intro: { - content: "下次对其他角色造成伤害时,此伤害+#", - }, - }, - }, - }, - dcqinghuang: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return player.maxHp > 1; - }, - check: function (event, player) { - var num1 = player.countCards("h"); - var num2 = player.countCards("h", (card) => player.hasValueTarget(card)); - var num3 = player.getHandcardLimit(); - if (player.isDamaged()) { - return num2 > 1 || num1 - num2 - num3 > 0; - } else { - return ( - num2 > 2 + Math.max(0, 3 - player.hp) || (player.hp > 2 && num1 - num2 - num3 > 2) - ); - } - }, - content: function () { - player.loseMaxHp(); - player.addTempSkill("dcqinghuang_add"); - player.addMark("dcqinghuang_add", 1, false); - }, - ai: { - combo: "dctaji", - }, - subSkill: { - add: { - charlotte: true, - onremove: true, - }, - }, - }, - //孟节 - dcyinlu: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - derivation: ["dcyinlu_lequan", "dcyinlu_huoxi", "dcyinlu_zhangqi", "dcyinlu_yunxiang"], - global: ["dcyinlu_lequan", "dcyinlu_huoxi", "dcyinlu_zhangqi", "dcyinlu_yunxiang"], - group: "dcyinlu_move", - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - hasMark: function (target) { - return lib.skill.dcyinlu.derivation.some((i) => target.hasMark(i)); - }, - content: function () { - "step 0"; - event.marks = lib.skill.dcyinlu.derivation.slice(0, 3); - if (game.countPlayer() <= 2) event.goto(3); - "step 1"; - player - .chooseTarget("引路:令三名角色分别获得〖引路〗标记", true, 3) - .set("targetprompt", () => { - return get.translation( - lib.skill.dcyinlu.derivation[ui.selected.targets.length - 1] - ); - }) - .set("complexSelect", true) - .set("ai", (target) => { - var player = _status.event.player; - if (ui.selected.targets.length == 2) - return get.effect(target, { name: "losehp" }, player, player); - return get.attitude(player, target); - }); - "step 2"; - if (result.bool) { - var targets = result.targets; - player.line(targets); - for (var i = 0; i < targets.length; i++) { - targets[i].addMark(event.marks[i]); - } - } - event.goto(5); - "step 3"; - player.logSkill("dcyinlu", game.players); - var list = []; - for (var mark of event.marks) { - list.push([ - mark, - '", - ]); - } - var target = game.filterPlayer((i) => i != player)[0]; - if (!game.hasPlayer((current) => current != player)) target = player; - event.target = target; - player - .chooseButton([ - "引路:令" + get.translation(target) + "获得2枚〖引路〗标记", - [list, "textbutton"], - ]) - .set("ai", (button) => { - var mark = button.link; - if (mark == "dcyinlu_lequan") return 9; - if (mark == "dcyinlu_zhangqi") return 10; - return 8; - }) - .set("forced", true) - .set("selectButton", 2) - .set("forcebutton", true); - "step 4"; - if (result.bool) { - var marks = result.links; - for (var mark of marks) target.addMark(mark, 1); - event.marks.removeArray(marks); - for (var mark of event.marks) player.addMark(mark, 1); - } - "step 5"; - player.addMark("dcyinlu_yunxiang", 1); - player.addMark("dcyinlu_xiang", 1); - game.log(player, "获得了1点芸香值"); - }, - subSkill: { - move: { - audio: "dcyinlu", - trigger: { - player: "phaseZhunbeiBegin", - global: "die", - }, - direct: true, - filter: function (event, player) { - if (event.name == "die") { - return lib.skill.dcyinlu.hasMark(event.player); - } - return game.hasPlayer((current) => { - return lib.skill.dcyinlu.hasMark(current); - }); - }, - content: function () { - "step 0"; - if (trigger.name == "die") { - var marks = lib.skill.dcyinlu.derivation.filter((mark) => - trigger.player.hasMark(mark) - ); - event.marks = marks; - event.goto(3); - } else { - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - player - .chooseTarget( - get.prompt("dcyinlu_move"), - "移动一名角色的〖引路〗标记", - 2, - (card, player, target) => { - if (ui.selected.targets.length == 0) - return lib.skill.dcyinlu.hasMark(target); - return true; - } - ) - .set("ai", (target) => { - var player = _status.event.player; - if (ui.selected.targets.length == 0) { - var owned = lib.skill.dcyinlu.derivation.filter((i) => - target.hasMark(i) - ); - var att = get.attitude(player, target); - if (att > 0) { - if (owned.includes("dcyinlu_zhangqi")) - return target.hasCard({ suit: "spade" }, "he") ? 5 : 10; - if ( - owned.includes("dcyinlu_lequan") && - target.isHealthy() && - game.hasPlayer((current) => { - return ( - current != target && - get.recoverEffect(current, player, player) > 0 - ); - }) - ) - return 2; - return 0; - } - if (att < 0) { - if (owned.some((i) => i != "dcyinlu_zhangqi")) return 8; - return 0; - } - if ( - owned.includes("dcyinlu_zhangqi") && - game.hasPlayer((current) => { - return ( - current != target && - get.effect( - current, - { name: "losehp" }, - player, - player - ) > 0 - ); - }) - ) - return 3; - return 1; - } else { - var targetx = ui.selected.targets[0]; - var att = get.attitude(player, targetx), - att2 = get.attitude(player, target); - var owned = lib.skill.dcyinlu.derivation.filter((i) => - targetx.hasMark(i) - ); - if (att > 0) { - if (owned.includes("dcyinlu_zhangqi")) return -att2; - if (owned.includes("dcyinlu_lequan")) - return get.recoverEffect(target, player, player); - } else if (att < 0) { - if (owned.some((i) => i != "dcyinlu_zhangqi")) return att2; - } else { - if (owned.includes("dcyinlu_zhangqi")) - return get.effect( - target, - { name: "losehp" }, - player, - player - ); - return att2; - } - } - return Math.random(); - }) - .set("complexTarget", true); - } - "step 1"; - if (result.bool) { - var marks = lib.skill.dcyinlu.derivation; - var targets = result.targets, - owned = marks.filter((mark) => targets[0].hasMark(mark)); - event.targets = targets; - if (owned.length == 1) event._result = { bool: true, control: owned[0] }; - else { - player - .chooseControl(owned) - .set( - "prompt", - "引路:选择要移动" + get.translation(targets[0]) + "的标记" - ) - .set( - "choiceList", - owned.map((mark) => { - return ( - '
    【' + - get.translation(mark) + - "】
    " + - lib.translate[mark + "_info"] + - "
    " - ); - }) - ) - .set("displayIndex", false) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var att = get.attitude(player, targets[0]), - att2 = get.attitude(player, targets[1]); - if (att > 0) { - if (owned.includes("dcyinlu_zhangqi") && att2 < 0) - return "dcyinlu_zhangqi"; - if (owned.includes("dcyinlu_lequan") && att2 > 0) - return "dcyinlu_lequan"; - } else if (att < 0) { - var marksx = owned.filter((i) => i != "dcyinlu_zhangqi"); - if (marksx.length && att2 > 0) return marksx[0]; - return owned[0]; - } else { - if (owned.includes("dcyinlu_zhangqi")) - return "dcyinlu_zhangqi"; - } - if (owned.length > 1) owned.remove("dcyinlu_zhangqi"); - return owned[0]; - })() - ); - } - } else { - if (_status.connectMode) - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - event.finish(); - } - "step 2"; - if (_status.connectMode) - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - var mark = result.control, - count = targets[0].countMark(mark); - player.logSkill("dcyinlu_move", targets, false); - player.line2(targets, mark == "dcyinlu_zhangqi" ? "fire" : "green"); - targets[0].removeMark(mark, count); - targets[1].addMark(mark, count); - event.finish(); - "step 3"; - player - .chooseTarget("引路:是否转移“" + get.translation(event.marks[0]) + "”标记?") - .set("ai", (target) => { - var player = _status.event.player, - mark = _status.event.mark; - if (mark == "dcyinlu_zhangqi") - return get.effect(target, { name: "losehp" }, player, player) + 0.1; - if (mark == "dcyinlu_lequan") - return ( - get.recoverEffect(target, player, player) + - get.attitude(player, target) / 5 - ); - return get.attitude(player, target); - }) - .set("mark", event.marks[0]); - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dcyinlu_move", target); - var count = trigger.player.countMark(event.marks[0]); - trigger.player.removeMark(event.marks[0], count, false); - target.addMark(event.marks[0], count); - } - "step 5"; - event.marks.shift(); - if (event.marks.length) event.goto(3); - }, - }, - lequan: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - charlotte: true, - filter: function (event, player) { - return ( - player.hasMark("dcyinlu_lequan") && - game.hasPlayer((current) => current.hasSkill("dcyinlu")) - ); - }, - marktext: "乐", - intro: { - name: "乐泉", - name2: "乐泉", - markcount: () => 0, - content: "结束阶段,你可以弃置一张♦牌并回复1点体力。", - }, - content: function () { - "step 0"; - player - .chooseToDiscard( - "乐泉:是否弃置一张♦牌并回复1点体力?", - { suit: "diamond" }, - "he" - ) - .set("ai", (card) => { - if (_status.event.goon) return 7 - get.value(card); - return 0; - }) - .set("logSkill", "dcyinlu_lequan") - .set("goon", get.recoverEffect(player, player)); - "step 1"; - if (result.bool) { - player.recover(); - } - }, - }, - huoxi: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - charlotte: true, - filter: function (event, player) { - return ( - player.hasMark("dcyinlu_huoxi") && - game.hasPlayer((current) => current.hasSkill("dcyinlu")) - ); - }, - marktext: "藿", - intro: { - name: "藿溪", - name2: "藿溪", - markcount: () => 0, - content: "结束阶段,你可以弃置一张♥牌并摸两张牌。", - }, - content: function () { - "step 0"; - player - .chooseToDiscard("藿溪:是否弃置一张♥牌并摸两张牌?", { suit: "heart" }, "he") - .set("ai", (card) => { - return 6 - get.value(card); - }) - .set("logSkill", "dcyinlu_huoxi"); - "step 1"; - if (result.bool) { - player.draw(2); - } - }, - }, - zhangqi: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - direct: true, - charlotte: true, - filter: function (event, player) { - return ( - player.hasMark("dcyinlu_zhangqi") && - game.hasPlayer((current) => current.hasSkill("dcyinlu")) - ); - }, - marktext: "瘴", - intro: { - name: "瘴气", - name2: "瘴气", - markcount: () => 0, - content: "锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。", - }, - content: function () { - "step 0"; - player - .chooseToDiscard("瘴气:弃置一张♠牌,或失去1点体力", { suit: "spade" }, "he") - .set("ai", (card) => { - if (_status.event.goon) return 7 - get.value(card); - return 0; - }) - .set("logSkill", "dcyinlu_zhangqi") - .set("goon", get.effect(player, { name: "losehp" }, player) < 0); - "step 1"; - if (!result.bool) { - player.logSkill("dcyinlu_zhangqi"); - player.loseHp(); - } - }, - }, - yunxiang: { - trigger: { player: ["phaseJieshuBegin", "damageBegin4"] }, - direct: true, - charlotte: true, - filter: function (event, player) { - if (!game.hasPlayer((current) => current.hasSkill("dcyinlu"))) return false; - if (event.name == "phaseJieshu") return player.hasMark("dcyinlu_yunxiang"); - return player.hasMark("dcyinlu_yunxiang") && player.hasMark("dcyinlu_xiang"); - }, - onremove: function (player) { - delete player.storage.dcyinlu_xiang; - }, - marktext: "芸", - intro: { - name: "芸香", - name2: "芸香", - markcount: function (storage, player) { - return player.countMark("dcyinlu_xiang"); - }, - content: function (storage, player) { - return ( - "①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。
  • 当前芸香值:" + - player.countMark("dcyinlu_xiang") - ); - }, - }, - content: function () { - "step 0"; - if (trigger.name == "phaseJieshu") { - player - .chooseToDiscard( - "芸香:是否弃置一张♣牌,获得1枚“香”?", - { suit: "club" }, - "he" - ) - .set("ai", (card) => { - return ( - 6 - - get.value(card) + - 2.5 * _status.event.player.countMark("dcyinlu_xiang") - ); - }) - .set("logSkill", "dcyinlu_yunxiang"); - } else { - player - .chooseBool( - "芸香:是否移去所有“香”,令此伤害-" + - player.countMark("dcyinlu_xiang") + - "?" - ) - .set("ai", () => { - return _status.event.bool; - }) - .set("bool", get.damageEffect(player, trigger.source, player) < 0); - } - "step 1"; - if (result.bool) { - if (trigger.name == "phaseJieshu") { - player.addMark("dcyinlu_xiang", 1, false); - game.log(player, "获得了1点芸香值"); - } else { - player.logSkill("dcyinlu_yunxiang"); - var num = player.countMark("dcyinlu_xiang"); - player.removeMark("dcyinlu_xiang", num, false); - game.log(player, "扣减了", num, "点芸香值"); - trigger.num = Math.max(0, trigger.num - num); - } - } - }, - }, - }, - }, - dcyouqi: { - audio: 2, - trigger: { global: "loseAfter" }, - filter: function (event, player) { - if (event.getParent(3).name.indexOf("dcyinlu_") != 0 || player == event.player) - return false; - return true; - }, - derivation: "dcyouqi_faq", - direct: true, - forced: true, - content: function () { - if ( - Math.random() < 1.25 - 0.25 * get.distance(player, trigger.player) || - get.isLuckyStar(player) - ) { - player.logSkill("dcyouqi"); - player.gain(trigger.cards.filterInD("d"), "gain2"); - } - }, - ai: { - combo: "dcyinlu", - }, - }, - //孙资刘放 - dcqinshen: { - audio: 2, - trigger: { player: "phaseDiscardEnd" }, - frequent: true, - prompt2: function () { - return "摸" + get.cnNumber(lib.skill.dcqinshen.getNum()) + "张牌"; - }, - getNum: function () { - var list = lib.suit.slice(); - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name != "lose" && evt.name != "cardsDiscard") return false; - if (evt.name == "lose" && evt.position != ui.discardPile) return false; - for (var card of evt.cards) list.remove(get.suit(card, false)); - }); - return list.length; - }, - filter: function (event, player) { - return lib.skill.dcqinshen.getNum() > 0; - }, - content: function () { - player.draw(lib.skill.dcqinshen.getNum()); - }, - }, - dcweidang: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - /** - * @deprecated - */ - getLength: (card) => get.cardNameLength(card), - direct: true, - filter: function (event, player) { - var num = lib.skill.dcqinshen.getNum(); - return ( - event.player != player && - (_status.connectMode - ? player.countCards("he") - : player.hasCard((card) => get.cardNameLength(card) == num, "he")) - ); - }, - content: function () { - "step 0"; - var num = lib.skill.dcqinshen.getNum(); - event.num = num; - player - .chooseCard( - get.prompt("dcweidang"), - "将一张字数为" + - num + - "的牌置于牌堆底,然后获得一张字数为" + - num + - "的牌。若你能使用此牌,你使用之。", - "he", - (card, player, target) => { - return get.cardNameLength(card) == _status.event.num; - } - ) - .set("num", num) - .set("ai", (card) => { - return 5 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("dcweidang"), player.lose(result.cards[0], ui.cardPile); - game.broadcastAll(function (player) { - var cardx = ui.create.card(); - cardx.classList.add("infohidden"); - cardx.classList.add("infoflip"); - player.$throw(cardx, 1000, "nobroadcast"); - }, player); - game.delayx(); - } else event.finish(); - "step 2"; - var card = get.cardPile((cardx) => get.cardNameLength(cardx) == num); - if (card) { - player.gain(card, "gain2"); - if (player.hasUseTarget(card)) { - player.chooseUseTarget(card, true); - } - } - }, - }, - //三袁 - dcneifa: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - content: function () { - "step 0"; - player.draw(3); - player.chooseToDiscard(true, "he").set("ai", function (cardx) { - var player = _status.event.player; - var num = 0; - var hs = player.getCards("h"); - var muniu = player.getEquip("muniu"); - if (muniu && muniu.cards) hs = hs.concat(muniu.cards); - if (get.type(cardx) == "basic") { - var shas = hs.filter(function (card) { - return ( - card != cardx && - get.name(card, player) == "sha" && - player.hasValueTarget(card, false) - ); - }); - var numx = player.countCards("h", function (card) { - return get.type2(card, player) == "trick"; - }); - num += - Math.min(numx, Math.max(0, shas.length - player.getCardUsable("sha"))) * 0.65; - num += - Math.min( - player.getCardUsable("sha") + numx, - shas.filter(function (card) { - return ( - game.countPlayer(function (current) { - return ( - player.canUse(card, current) && - get.effect(current, card, player, player) > 0 - ); - }) > 1 - ); - }).length - ) * 1.1; - var taos = Math.min( - player.maxHp - player.hp, - hs.filter(function (card) { - return cardx != card && get.name(card, player) == "tao"; - }).length - ); - num += taos * player.getDamagedHp() * 1.2; - } else if (get.type2(cardx) == "trick") { - var numx = Math.sqrt( - Math.min( - 5, - player.countCards("h", function (card) { - return get.type(card, player) == "basic"; - }) - ) - ); - num += - hs.filter(function (card) { - return ( - card != cardx && - get.type2(card) == "trick" && - player.hasValueTarget(card) - ); - }).length * 0.65; - } else num = 4; - return num * 1.5 - get.value(cardx); - }); - "step 1"; - if ( - result.bool && - result.cards && - result.cards.length && - get.type(result.cards[0]) != "equip" - ) { - var name = get.type(result.cards[0]) == "basic" ? "dcneifa_basic" : "dcneifa_trick"; - player.addTempSkill(name, "phaseUseAfter"); - var num = Math.min( - 5, - player.countCards("h", function (cardx) { - var type = get.type(cardx, player); - return (name == "dcneifa_basic") != (type == "basic") && type != "equip"; - }) - ); - if (num > 0) player.addMark(name, num, false); - else player.storage[name] = 0; - } - }, - ai: { - threaten: 2.33, - }, - }, - dcneifa_basic: { - mark: true, - marktext: "伐", - onremove: true, - intro: { - name: "内伐 - 基本牌", - content: - "本回合内不能使用锦囊牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。", - }, - mod: { - cardEnabled: function (card, player) { - if (get.type(card, "trick") == "trick") return false; - }, - cardSavable: function (card, player) { - if (get.type(card, "trick") == "trick") return false; - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") { - return num + player.countMark("dcneifa_basic"); - } - }, - }, - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - return game.hasPlayer(function (current) { - return !event.targets.includes(current) && player.canUse(event.card, current, false); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("dcneifa"), - "为" + get.translation(trigger.card) + "额外指定一个目标", - function (card, player, target) { - return ( - !_status.event.sourcex.includes(target) && - player.canUse(_status.event.card, target, false) - ); - } - ) - .set("sourcex", trigger.targets) - .set("ai", function (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("dcneifa", event.targets); - trigger.targets.addArray(event.targets); - }, - }, - dcneifa_trick: { - trigger: { player: "useCard2" }, - direct: true, - mark: true, - marktext: "伐", - onremove: true, - mod: { - cardEnabled: function (card, player) { - if (get.type(card) == "basic") return false; - }, - cardSavable: function (card, player) { - if (get.type(card) == "basic") return false; - }, - }, - intro: { - name: "内伐 - 锦囊牌", - content: "本回合内不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标。", - }, - filter: function (event, player) { - if (get.type(event.card) != "trick") return false; - if (event.targets && event.targets.length > 0) return true; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(event.card, player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; - player - .chooseTarget(get.prompt("dcneifa"), function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return true; - return lib.filter.targetEnabled2(_status.event.card, player, target); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return ( - get.effect(target, trigger.card, player, player) * - (_status.event.targets.includes(target) ? -1 : 1) - ); - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("dcneifa", event.targets); - if (trigger.targets.includes(event.targets[0])) - trigger.targets.removeArray(event.targets); - else trigger.targets.addArray(event.targets); - } - }, - }, - //桥蕤 - dcaishou: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return player.hasCard((card) => card.hasGaintag("dcaishou_tag"), "h"); - }, - forced: true, - locked: false, - group: ["dcaishou_draw", "dcaishou_lose"], - subfrequent: ["draw"], - content: function () { - "step 0"; - player.discard(player.getCards("h", (card) => card.hasGaintag("dcaishou_tag"))); - "step 1"; - var len = 0; - player.getHistory("lose", (evt) => { - if (evt.getParent(2) == event) len += evt.cards.length; - }); - if (len > Math.max(0, player.hp) && player.maxHp < 9) { - player.gainMaxHp(); - } - }, - subSkill: { - draw: { - audio: "dcaishou", - trigger: { player: "phaseJieshuBegin" }, - frequent: function (event, player) { - return player.maxHp > 1; - }, - prompt2: function (event, player) { - return "摸" + get.cnNumber(player.maxHp) + "张牌,称为“隘”"; - }, - check: function (event, player) { - return player.maxHp > 1; - }, - content: function () { - player.draw(player.maxHp).gaintag = ["dcaishou_tag"]; - }, - }, - lose: { - audio: "dcaishou", - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - locked: false, - filter: function (event, player) { - if (player == _status.currentPhase) return false; - var evt = event.getl(player); - if ( - !evt || - !evt.hs || - !evt.hs.length || - player.hasCard((card) => card.hasGaintag("dcaishou_tag"), "h") - ) - return false; - if (event.name == "lose") { - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("dcaishou_tag")) return true; - } - return false; - } - return player.hasHistory("lose", function (evt) { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("dcaishou_tag")) return true; - } - return false; - }); - }, - content: function () { - player.loseMaxHp(); - }, - }, - }, - }, - dcsaowei: { - audio: 2, - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return ( - event.player != player && - event.card.name == "sha" && - event.targets.length && - !event.targets.includes(player) && - event.targets.every((current) => player.inRange(current) && current.isIn()) && - player.hasCard((card) => card.hasGaintag("dcaishou_tag"), "h") - ); - }, - direct: true, - content: function () { - "step 0"; - player.chooseCardTarget({ - position: "hs", - prompt: get.prompt("dcsaowei"), - prompt2: "将一张“隘”当做【杀】对" + get.translation(trigger.targets) + "使用", - targets: trigger.targets, - filterCard: function (card, player) { - if (get.itemtype(card) == "card" && !card.hasGaintag("dcaishou_tag")) - return false; - return _status.event.targets.every((current) => - player.canUse(get.autoViewAs({ name: "sha" }, [card]), current, false) - ); - }, - filterTarget: function (card, player, target) { - if (!_status.event.targets.includes(target)) return false; - card = get.autoViewAs({ name: "sha" }, [card]); - return lib.filter.filterTarget.apply(this, arguments); - }, - selectTarget: -1, - ai1: function (card) { - var player = _status.event.player; - if ( - player.isHealthy() && - player.hasSkill("dcaishou") && - player.countCards("h", (card) => card.hasGaintag("dcaishou_tag") == 1) - ) - return 0; - var eff = 0; - for (var target of _status.event.targets) { - eff += get.effect( - target, - get.autoViewAs({ name: "sha" }, [card]), - player, - player - ); - } - if (eff > 0) return 6.5 + eff / 10 - get.value(card); - return 0; - }, - ai2: () => 1, - }); - "step 1"; - if (result.bool) { - var cards = result.cards, - targets = result.targets; - event.cards = cards; - var next = player.useCard({ name: "sha" }, cards, targets, false, "dcsaowei"); - player - .when("useCardAfter") - .filter((event) => event == next) - .then(() => { - if (player.hasHistory("sourceDamage", (evt) => evt.card == trigger.card)) { - var cards = trigger.cards.filterInD(); - if (cards.length > 0) player.gain(cards, "gain2"); - } - }); - } - }, - }, - //向朗 - dckanji: { - audio: 2, - enable: "phaseUse", - usable: 2, - filter: function (event, player) { - return player.countCards("h"); - }, - content: function () { - "step 0"; - player.showHandcards(); - "step 1"; - var suits = []; - player.getCards("h", (card) => suits.add(get.suit(card))); - if (suits.length == player.countCards("h")) { - player.draw(2); - event.suitsLength = suits.length; - player.addTempSkill("dckanji_check"); - } - }, - subSkill: { - check: { - trigger: { player: "gainAfter" }, - filter: function (event, player) { - if (event.getParent(2).name != "dckanji") return false; - var len = event.getParent(2).suitsLength; - var suits = []; - player.getCards("h", (card) => suits.add(get.suit(card))); - return suits.length >= 4 && len < 4; - }, - charlotte: true, - forced: true, - popup: false, - content: function () { - player.skip("phaseDiscard"); - game.log(player, "跳过了", "#y弃牌阶段"); - }, - }, - }, - ai: { - order: 9, - result: { - player: function (player, target) { - var count = player.countCards("h"); - if (count > 4) return false; - var suits = []; - player.getCards("h", (card) => suits.add(get.suit(card))); - return suits.length == count ? 1 : 0; - }, - }, - }, - }, - dcqianzheng: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - usable: 2, - filter: function (event, player) { - return ( - event.player != player && - (get.type(event.card) == "trick" || event.card.name == "sha") && - player.countCards("he") > 1 - ); - }, - async cost(event, trigger, player) { - const str = - ",若重铸的牌中没有" + - get.translation(get.type2(trigger.card)) + - "牌,你于" + - get.translation(trigger.cards) + - "进入弃牌堆后获得之"; - event.result = await player - .chooseCard( - get.prompt("dcqianzheng"), - "重铸两张牌" + (trigger.cards.length ? str : "") + "。", - 2, - "he", - lib.filter.cardRecastable - ) - .set("ai", (card) => { - var val = get.value(card); - if (get.type2(card) == _status.event.type) val += 0.5; - return 6 - val; - }) - .set("type", get.type2(trigger.card)) - .forResult(); - }, - async content(event, trigger, player) { - if (event.cards.every((card) => get.type2(card) != get.type2(trigger.card))) { - trigger.getParent().dcqianzheng = true; - player.addTempSkill("dcqianzheng_gain"); - } - await player.recast(event.cards); - }, - subSkill: { - gain: { - trigger: { global: "cardsDiscardAfter" }, - filter: function (event, player) { - var evt = event.getParent(); - if (evt.name != "orderingDiscard") return false; - return evt.relatedEvent.dcqianzheng && event.cards.filterInD("d").length; - }, - charlotte: true, - forced: true, - popup: false, - content: function () { - player.gain(trigger.cards.filterInD("d"), "gain2"); - }, - }, - }, - }, - //秦朗 - dchaochong: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return player.getHandcardLimit() != player.countCards("h"); - }, - direct: true, - locked: false, - content: function () { - "step 0"; - var del = player.getHandcardLimit() - player.countCards("h"); - event.delta = del; - if (del > 0) { - player - .chooseBool( - get.prompt("dchaochong"), - "摸" + get.cnNumber(Math.min(5, del)) + "张牌,然后令你的手牌上限-1" - ) - .set("ai", () => { - var player = _status.event.player; - if ( - player.isPhaseUsing() && - player.hasCard( - (cardx) => player.hasUseTarget(cardx) && player.hasValueTarget(cardx), - "hs" - ) - ) - return false; - return true; - }); - } else if (del < 0) { - player - .chooseToDiscard( - get.prompt("dchaochong"), - "弃置" + get.cnNumber(-del) + "张手牌,然后令你的手牌上限+1", - -del - ) - .set("ai", (card) => { - var player = _status.event.player; - if ( - player.isPhaseUsing() && - player.hasCard((cardx) => player.hasValueTarget(cardx), "hs") - ) - return 6 - player.getUseValue(card); - return 5 - get.value(card); - }) - .set("logSkill", "dchaochong"); - } - "step 1"; - if (result.bool) { - if (event.delta > 0) { - player.logSkill("dchaochong"); - player.draw(Math.min(5, event.delta)); - lib.skill.dchaochong.change(player, -1); - } else if (event.delta < 0) { - lib.skill.dchaochong.change(player, 1); - } - } - }, - change: function (player, num) { - if (typeof player.storage.dchaochong !== "number") player.storage.dchaochong = 0; - if (!num) return; - player.storage.dchaochong += num; - player.markSkill("dchaochong"); - game.log(player, "的手牌上限", "#g" + (num > 0 ? "+" : "") + num); - }, - markimage: "image/card/handcard.png", - intro: { - content: function (storage, player) { - var num = player.storage.dchaochong; - return "手牌上限" + (num >= 0 ? "+" : "") + num; - }, - }, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("dchaochong"); - }, - }, - ai: { threaten: 2.2 }, - }, - dcjinjin: { - audio: 2, - trigger: { - source: "damageSource", - player: "damageEnd", - }, - usable: 2, - logTarget: "source", - check: function (event, player) { - if (typeof player.storage.dchaochong != "number" || player.storage.dchaochong == 0) - return true; - var evt = event.getParent("useCard"); - if (evt && evt.player == player && event.source == player) return false; - if (player.isPhaseUsing() && player.storage.dchaochong == -1) return true; - return Math.abs(player.storage.dchaochong) >= 2; - }, - prompt2: function (event, player) { - var str = ""; - if (typeof player.storage.dchaochong == "number" && player.storage.dchaochong != 0) { - str += "重置因〖佞宠〗增加或减少的手牌上限,"; - } - var num = Math.abs(player.countMark("dchaochong")) || 1; - if (event.source && event.source.isIn()) { - str += - "令伤害来源弃置至多" + - get.cnNumber(num) + - "张牌,然后你摸" + - num + - "-X张牌(X为其弃置的牌数)"; - } else str += "你摸" + get.cnNumber(num) + "张牌"; - return str; - }, - content: function () { - "step 0"; - var del = Math.abs(player.countMark("dchaochong")) || 1; - event.delta = del; - player.storage.dchaochong = 0; - if (player.hasSkill("dchaochong", null, false, false)) player.markSkill("dchaochong"); - game.log(player, "重置了手牌上限"); - if (trigger.source && trigger.source.isIn()) { - trigger.source - .chooseToDiscard( - get.translation(player) + "对你发动了【矜谨】", - "弃置至多" + - get.cnNumber(del) + - "张牌,然后" + - get.translation(player) + - "摸" + - del + - "-X张牌(X为你弃置的牌数)。", - [1, del], - "he" - ) - .set("ai", (card) => { - if (_status.event.goon) return 5.5 - get.value(card); - return 0; - }) - .set("goon", get.attitude(trigger.source, player) < 0); - } - "step 1"; - var num = event.delta; - if (result.bool) num -= result.cards.length; - if (num > 0) player.draw(num); - }, - ai: { - combo: "dchaochong", - maixie: true, - maixie_hp: true, - threaten: 0.85, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - var num = 0; - if (typeof target.storage.dcninchong == "number") - num = Math.abs(target.storage.dcninchong); - if (num <= 0) return; - return [1, Math.min(1, num / 3)]; - } - }, - }, - }, - }, - //二傅 - dcxuewei: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("dcxuewei"), (card, player, target) => { - return target.hp <= player.hp; - }) - .set("ai", (target) => { - var player = _status.event.player; - return get.effect(target, { name: "tao" }, player, player) + 0.1; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dcxuewei", target); - player.addTempSkill("dcxuewei_shelter", { player: "phaseBegin" }); - player.markAuto("dcxuewei_shelter", [target]); - } - }, - ai: { threaten: 1.1 }, - subSkill: { - shelter: { - audio: "dcxuewei", - trigger: { global: "damageBegin4" }, - filter: function (event, player) { - return player.getStorage("dcxuewei_shelter").includes(event.player); - }, - charlotte: true, - forced: true, - onremove: true, - logTarget: "player", - marktext: "卫", - intro: { content: "保护对象:$" }, - content: function () { - "step 0"; - trigger.cancel(); - "step 1"; - player.loseHp(); - if (trigger.player != player) game.asyncDraw([player, trigger.player]); - else player.draw("nodelay"); - "step 2"; - game.delayx(); - }, - ai: { - filterDamage: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.player && arg.player.hasSkillTag("jueqing", false, player)) - return false; - return true; - }, - }, - }, - }, - }, - dcyuguan: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - var num = player.getDamagedHp(); - if (num == 0) return false; - return !game.hasPlayer((current) => { - return current.getDamagedHp() > num; - }); - }, - check: function (event, player) { - var num = player.getDamagedHp() - 1; - if (num <= 0) return false; - return game.hasPlayer((target) => { - return get.attitude(player, target) > 0 && target.maxHp - target.countCards("h") > 1; - }); - }, - content: function () { - "step 0"; - player.loseMaxHp(); - "step 1"; - var num = player.getDamagedHp(); - if (!player.isIn() || !num) event.finish(); - else - player - .chooseTarget( - "御关:令至多" + get.cnNumber(num) + "名角色将手牌摸至体力上限", - Math.min(game.countPlayer(), [1, num]), - true - ) - .set("ai", (target) => { - return ( - get.attitude(_status.event.player, target) * - Math.max(0.1, target.maxHp - target.countCards("h")) - ); - }); - "step 2"; - if (result.bool) { - var targets = result.targets.sortBySeat(_status.currentPhase); - player.line(targets); - for (var target of targets) { - target.drawTo(target.maxHp); - } - } - }, - }, - //郑浑 - dcqiangzhi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - if (target == player) return false; - return ( - target.countDiscardableCards(player, "he") + - player.countDiscardableCards(player, "he") >= - 3 - ); - }, - content: function () { - "step 0"; - var dialog = []; - dialog.push("强峙:弃置你与" + get.translation(target) + "的共计三张牌"); - if (player.countCards("h")) - dialog.addArray(['
    你的手牌
    ', player.getCards("h")]); - if (player.countCards("e")) - dialog.addArray(['
    你的装备
    ', player.getCards("e")]); - if (target.countCards("h")) { - dialog.add('
    ' + get.translation(target) + "的手牌
    "); - if (player.hasSkillTag("viewHandcard", null, target, true)) - dialog.push(target.getCards("h")); - else dialog.push([target.getCards("h"), "blank"]); - } - if (target.countCards("e")) - dialog.addArray([ - '
    ' + get.translation(target) + "的装备
    ", - target.getCards("e"), - ]); - player - .chooseButton(3, true) - .set("createDialog", dialog) - .set("filterButton", (button) => { - if ( - !lib.filter.canBeDiscarded( - button.link, - _status.event.player, - get.owner(button.link) - ) - ) - return false; - return true; - }) - .set("filterOk", () => { - return ui.selected.buttons.length == 3; - }) - .set("ai", (button) => { - var player = _status.event.player; - var target = _status.event.getParent().target; - var card = button.link; - if (get.owner(card) == player) { - if (_status.event.damage) return 15 - get.value(card); - if ( - player.hp >= 3 || - get.damageEffect(player, target, player) >= 0 || - (player.hasSkill("dcpitian") && - player.getHandcardLimit() - player.countCards("h") >= 1 && - player.hp > 1) - ) - return 0; - if (ui.selected.buttons.length == 0) return 10 - get.value(card); - return 0; - } else { - if (_status.event.damage) return 0; - return -(get.sgnAttitude(player, target) || 1) * get.value(card); - } - }) - .set( - "damage", - get.damageEffect(target, player, player) > 10 && - player.countCards("he", (card) => { - return ( - lib.filter.canBeDiscarded(card, player, player) && get.value(card) < 5 - ); - }) >= 3 - ); - "step 1"; - if (result.bool) { - var links = result.links; - var list1 = [], - list2 = []; - event.players = [player, target]; - for (var card of links) { - if (get.owner(card) == player) list1.push(card); - else list2.push(card); - } - if (list1.length && list2.length) { - game.loseAsync({ - lose_list: [ - [player, list1], - [target, list2], - ], - discarder: player, - }).setContent("discardMultiple"); - event.finish(); - } else if (list2.length) target.discard(list2); - else player.discard(list1); - if (list2.length >= 3) event.players.reverse(); - } else event.finish(); - "step 2"; - event.players[0].line(event.players[1]); - event.players[1].damage(event.players[0]); - }, - ai: { - expose: 0.2, - order: 4, - result: { - target: function (player, target) { - return ( - (get.effect(target, { name: "guohe_copy2" }, player, target) / 2) * - (target.countDiscardableCards(player, "he") >= 2 ? 1.25 : 1) + - get.damageEffect(target, player, target) / 3 - ); - }, - }, - }, - }, - dcpitian: { - audio: 2, - trigger: { - player: ["loseAfter", "damageEnd"], - global: "loseAsyncAfter", - }, - forced: true, - locked: false, - group: "dcpitian_draw", - filter: function (event, player) { - if (event.name == "damage") return true; - return event.type == "discard" && event.getl(player).cards2.length > 0; - }, - content: function () { - player.addMark("dcpitian_handcard", 1, false); - player.addSkill("dcpitian_handcard"); - game.log(player, "的手牌上限", "#y+1"); - }, - subSkill: { - draw: { - audio: "dcpitian", - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.countCards("h") < player.getHandcardLimit(); - }, - prompt2: function (event, player) { - return ( - "摸" + - get.cnNumber( - Math.min(5, player.getHandcardLimit() - player.countCards("h")) - ) + - "张牌,重置因〖辟田〗增加的手牌上限" - ); - }, - check: function (event, player) { - return ( - player.getHandcardLimit() - player.countCards("h") > - Math.min(2, player.hp - 1) - ); - }, - content: function () { - "step 0"; - var num = Math.min(5, player.getHandcardLimit() - player.countCards("h")); - if (num > 0) player.draw(num); - "step 1"; - player.removeMark( - "dcpitian_handcard", - player.countMark("dcpitian_handcard"), - false - ); - game.log(player, "重置了", "#g【辟田】", "增加的手牌上限"); - }, - }, - handcard: { - markimage: "image/card/handcard.png", - intro: { - content: function (storage, player) { - return "手牌上限+" + storage; - }, - }, - charlotte: true, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("dcpitian_handcard"); - }, - }, - }, - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.tag(card, "discard")) return 0.9; - if (get.tag(card, "damage")) return 0.95; - }, - }, - }, - }, - //新服二赵 - dcqingren: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - filter: function (event, player) { - return player.hasHistory("useSkill", (evt) => - ["yizan_use", "yizan_use_backup"].includes(evt.sourceSkill || evt.skill) - ); - }, - content: function () { - player.draw( - player.getHistory("useSkill", (evt) => - ["yizan_use", "yizan_use_backup"].includes(evt.sourceSkill || evt.skill) - ).length - ); - }, - ai: { - combo: "yizan_use", - }, - }, - dclongyuan: { - audio: "xinfu_longyuan", - forced: true, - unique: true, - juexingji: true, - trigger: { - global: "phaseEnd", - }, - skillAnimation: true, - animationColor: "orange", - filter: function (event, player) { - return player.countMark("yizan_use") >= 3; - }, - content: function () { - player.awakenSkill("dclongyuan"); - player.draw(2); - player.recover(); - player.storage.yizan = true; - }, - derivation: "yizan_rewrite", - ai: { - combo: "yizan_use", - }, - }, - //黄皓 - dcqinqing: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0]; - if (!zhu || !zhu.isIn()) return false; - return game.hasPlayer((current) => { - return current != player && current.inRange(zhu); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("dcqinqing"), function (card, player, target) { - var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0]; - return ( - target != player && - target.inRange(zhu) && - target.countDiscardableCards(player, "he") > 0 - ); - }) - .set("ai", function (target) { - var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0]; - var he = target.countCards("he"); - if (get.attitude(_status.event.player, target) > 0) { - if (target.countCards("h") > zhu.countCards("h") + 1) return 0.1; - } else { - if (he > zhu.countCards("h") + 1) return 2; - if (he > 0) return 1; - } - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("dcqinqing", target); - if (target.countCards("he")) player.discardPlayerCard(target, "he", true); - } else { - event.finish(); - } - "step 2"; - var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0]; - if (zhu && zhu.isIn()) { - if (target.countCards("h") > zhu.countCards("h")) player.draw(); - } - }, - }, - dccunwei: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - forced: true, - filter: function (event, player) { - return ( - player != event.player && - get.type2(event.card) == "trick" && - (event.targets.length == 1 || player.countCards("he") > 0) - ); - }, - content: function () { - if (trigger.targets.length == 1) player.draw(); - else if (player.countCards("he") > 0) - player.chooseToDiscard("he", true, "存畏:请弃置一张牌"); - }, - ai: { - halfneg: true - }, - }, - //刘辟 - dcjuying: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - filter: function (event, player) { - return ( - player.getCardUsable("sha", true) > - player.getHistory("useCard", (evt) => { - return ( - evt.getParent("phaseUse") == event && - evt.card.name == "sha" && - evt.addCount !== false - ); - }).length - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseButton([ - get.prompt("dcjuying"), - [ - [ - ["sha", "你于下回合使用【杀】的次数上限+1"], - ["hand", "本回合手牌上限+2"], - ["draw", "摸三张牌"], - ], - "textbutton", - ], - ]) - .set("ai", function (button) { - var player = _status.event.player, - choice = button.link; - if (choice == "draw") return 10; - if (choice == "sha") return 9; - var del = 3 - player.hp; - if (choice == "hand" && player.needsToDiscard() > 0 && del <= 0) return 8; - return 0; - }) - .set("selectButton", [1, 3]); - "step 1"; - if (result.bool) { - player.logSkill("dcjuying"); - var choices = result.links; - event.choices = choices; - if (choices.includes("sha")) { - player.addMark("dcjuying_sha", 1, false); - player.addSkill("dcjuying_sha"); - } - if (choices.includes("hand")) { - player.addMark("dcjuying_hand", 1, false); - player.addTempSkill("dcjuying_hand"); - } - if (choices.includes("draw")) { - player.draw(3); - } - } else event.finish(); - "step 2"; - var num = event.choices.length - Math.max(0, player.hp); - if (num > 0) { - player.chooseToDiscard(true, "he"); - } - }, - ai: { - effect: { - player_use: function (card, player, target) { - if ( - typeof card == "object" && - player.isPhaseUsing() && - card.name == "sha" && - player.getCardUsable("sha") == 1 - ) - return "zeroplayertarget"; - }, - target_use: function (card, player, target) { - if (card.name == "jiu" && player.getCardUsable("sha") == 2) return [1, 1]; - }, - }, - }, - subSkill: { - sha: { - trigger: { player: "phaseBegin" }, - filter: function (event, player) { - return player.countMark("dcjuying_sha") > 0; - }, - silent: true, - firstDo: true, - charlotte: true, - onremove: true, - content: function () { - player.addMark("dcjuying_effect", player.countMark("dcjuying_sha"), false); - player.addTempSkill("dcjuying_effect"); - player.removeSkill("dcjuying_sha"); - }, - intro: { content: "下回合使用【杀】的次数上限+#" }, - }, - effect: { - onremove: true, - charlotte: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("dcjuying_effect"); - }, - }, - intro: { content: "本回合使用【杀】的次数上限+#" }, - }, - hand: { - onremove: true, - charlotte: true, - mod: { - maxHandcard: function (player, num) { - return num + 2 * player.countMark("dcjuying_hand"); - }, - }, - }, - }, - }, - //新服加强魏贾诩 - dcjianshu: { - audio: "jianshu", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h", { color: "black" }) > 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; - }, - targetprompt: ["发起者", "拼点目标"], - filterCard: { color: "black" }, - 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, - multitarget: true, - content: function () { - "step 0"; - player.give(cards, targets[0], "give"); - "step 1"; - targets[0].chooseToCompare(targets[1]); - "step 2"; - player.addTempSkill("dcjianshu_check", "phaseUseAfter"); - if (result.bool) { - var cards = targets[0].getCards("he", function (card) { - return lib.filter.cardDiscardable(card, targets[0], "dcjianshu"); - }); - if (cards.length > 0) targets[0].discard(cards.randomGet()); - targets[1].loseHp(); - } else if (result.tie) { - targets[0].loseHp(); - targets[1].loseHp(); - } else { - var cards = targets[1].getCards("he", function (card) { - return lib.filter.cardDiscardable(card, targets[1], "dcjianshu"); - }); - if (cards.length > 0) targets[1].discard(cards.randomGet()); - targets[0].loseHp(); - } - }, - subSkill: { - check: { - trigger: { global: "dieAfter" }, - charlotte: true, - forced: true, - popup: false, - filter: function (event, player) { - return event.getParent(3).name == "dcjianshu"; - }, - content: function () { - delete player.getStat("skill").dcjianshu; - }, - }, - }, - ai: { - expose: 0.4, - order: 4, - result: { - target: function (player, target) { - if (ui.selected.targets.length) return -1; - return -0.5; - }, - }, - }, - }, - dcyongdi: { - audio: "yongdi", - audioname: ["xinping"], - unique: true, - limited: true, - enable: "phaseUse", - filterTarget: function (card, player, target) { - return target.hasSex("male"); - }, - animationColor: "thunder", - skillAnimation: "legend", - mark: true, - intro: { - content: "limited", - }, - content: function () { - "step 0"; - player.awakenSkill("dcyongdi"); - //player.logSkill('dcyongdi',target); - if (!game.hasPlayer((current) => current.maxHp < target.maxHp)) { - target.gainMaxHp(); - } - "step 1"; - if (target.isMinHp()) { - target.recover(); - } - "step 2"; - if (target.isMinHandcard()) { - target.draw(Math.min(5, target.maxHp)); - } - "step 3"; - game.delayx(); - }, - ai: { - expose: 0.3, - order: 1, - result: { - target: function (player, target) { - var val = 0; - var bool1 = !game.hasPlayer((current) => current.maxHp < target.maxHp), - bool2 = target.isMinHp(), - bool3 = target.isMinHandcard(); - if (bool1) val += 6.5; - if (bool2) { - if (bool1) target.maxHp++; - val += Math.max(0, get.recoverEffect(target, player, player)); - if (bool1) target.maxHp--; - } - if (bool3) { - var num = Math.max(0, Math.min(5, target.maxHp + (bool1 ? 1 : 0))); - val += 5 * num; - } - return val; - }, - }, - }, - }, - //雷普 - dcsilve: { - audio: 2, - trigger: { - player: "enterGame", - global: "phaseBefore", - }, - forced: true, - locked: false, - direct: true, - onremove: ["dcsilve", "dcsilve_self"], - filter: function (event, player) { - return ( - game.hasPlayer((current) => current != player) && - (event.name != "phase" || game.phaseNumber == 0) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - "私掠:请选择一名其他角色", - "选择一名其他角色(暂时仅你可见),称为“私掠”角色,且你获得后续效果", - true, - (card, player, target) => { - return target != player && !player.getStorage("dcsilve").includes(target); - } - ) - .set("ai", (target) => { - var att = get.attitude(_status.event.player, target); - if (att > 0) return att + 1; - if (att == 0) return Math.random(); - return att; - }) - .set("animate", false); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dcsilve"); - player.markAuto("dcsilve", [target]); - player.addSkill("dcsilve_rob"); - player.addSkill("dcsilve_revenge"); - target.addSkill("dcsilve_target"); - if (!target.storage.dcsilve_target) target.storage.dcsilve_target = []; - target.storage.dcsilve_target.push(player); - } - }, - subSkill: { - rob: { - audio: "dcsilve", - trigger: { global: "damageSource" }, - filter: function (event, player) { - if (!player.getStorage("dcsilve").includes(event.source)) return false; - if (!event.player.isIn() || event.player == player) return false; - if (player.getStorage("dcsilve_robbed").includes(event.player)) return false; - return event.player.countCards("he") > 0; - }, - charlotte: true, - prompt2: function (event, player) { - return "获得" + get.translation(event.player) + "一张牌"; - }, - logTarget: "player", - content: function () { - player.addTempSkill("dcsilve_robbed"); - player.markAuto("dcsilve_self", [trigger.player]); - if (trigger.player.countGainableCards(player, "he") > 0) { - player.markAuto("dcsilve_robbed", [trigger.player]); - player.gainPlayerCard(trigger.player, "he", true); - } - if (trigger.source && trigger.source != player) - trigger.source.markSkill("dcsilve_target"); - }, - }, - revenge: { - audio: "dcsilve", - trigger: { global: "damageEnd" }, - filter: function (event, player) { - if (!player.getStorage("dcsilve").includes(event.player)) return false; - if ( - !event.player.isIn() || - !event.source || - !event.source.isIn() || - event.source == player - ) - return false; - return true; - }, - forced: true, - locked: false, - charlotte: true, - direct: true, - content: function () { - "step 0"; - if (trigger.player && trigger.player != player) - trigger.player.markSkill("dcsilve_target"); - player.markAuto("dcsilve_self", [trigger.player]); - player - .chooseToUse( - "私掠:对" + - get.translation(trigger.source) + - "使用一张【杀】,或弃置一张手牌", - function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - } - ) - .set("targetRequired", true) - .set("complexSelect", true) - .set("filterTarget", function (card, player, target) { - if ( - target != _status.event.source && - !ui.selected.targets.includes(_status.event.source) - ) - return false; - return lib.filter.targetEnabled.apply(this, arguments); - }) - .set("source", trigger.source) - .set("logSkill", "dcsilve_revenge"); - "step 1"; - if (!result.bool) { - if (player.countCards("h") > 0) - player.chooseToDiscard("h", true).set("logSkill", "dcsilve_revenge"); - } - }, - }, - self: { - marktext: "私", - intro: { - name: "私掠", - content: function (storage, player) { - if (!storage || !storage.length) return "没有打劫对象"; - if (storage[0] == player) return "已绑定" + get.translation(player) + "自己"; - return "打劫对象:" + get.translation(storage); - }, - }, - }, - target: { - marktext: "掠", - intro: { - name: "私掠", - content: function (storage, player) { - return "被" + get.translation(storage) + "盯上了!"; - }, - }, - }, - robbed: { onremove: true, charlotte: true }, - }, - }, - dcshuaijie: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - var targets = player.getStorage("dcsilve").filter((i) => i.isIn()); - if (!targets.length) return true; - return ( - targets.filter((target) => { - return player.hp > target.hp && player.countCards("e") > target.countCards("e"); - }).length == targets.length - ); - }, - content: function () { - "step 0"; - player.awakenSkill("dcshuaijie"); - player.loseMaxHp(); - var choices = []; - var choiceList = ["获得“私掠”角色至多三张牌", "从牌堆中获得三张类型各不相同的牌"]; - var targets = player.getStorage("dcsilve").filter((i) => i.isIn()); - event.targets = targets; - if (targets.length) choices.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - choices.push("选项二"); - player - .chooseControl(choices) - .set("prompt", "衰劫:选择一项") - .set("choiceList", choiceList) - .set("ai", () => _status.event.choice) - .set( - "choice", - (function () { - var eff = 0; - for (var target of targets) { - eff += get.effect(target, { name: "shunshou_copy2" }, player, player) * 2; - } - eff -= get.effect(player, { name: "dongzhuxianji" }, player, player); - return eff > 0 && choices.includes("选项一") ? "选项一" : "选项二"; - })() - ); - "step 1"; - if (result.control == "选项一") { - if (targets.length) { - for (var target of targets) { - if (target.countGainableCards(player, "he") > 0) { - player.line(target); - player.gainPlayerCard(target, "he", true, [1, 3]); - } - } - } - } else { - var cards = []; - for (var i = 0; i < 3; i++) { - var card = get.cardPile((cardx) => { - return ( - cards.filter((cardxx) => get.type2(cardxx) == get.type2(cardx)).length == - 0 - ); - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - } - "step 2"; - var targets = player.getStorage("dcsilve").filter((i) => i.isIn()); - for (var target of targets) { - target.unmarkAuto("dcsilve_target", [player]); - } - delete player.storage.dcsilve; - delete player.storage.dcsilve_self; - player.markAuto("dcsilve", [player]); - player.markAuto("dcsilve_self", [player]); - }, - ai: { - combo: "dcsilve", - order: 8, - result: { - player: function (player) { - var targets = player.getStorage("dcsilve").filter((i) => i.isIn()); - if (!targets.length) return 1; - var att = 0; - targets.forEach((i) => (att += get.attitude(player, i))); - if (att < 0) return 1; - return 0; - }, - }, - }, - }, - //庞会 - dcyiyong: { - audio: 2, - trigger: { - source: "damageBegin1", - }, - //usable:2, - filter: function (event, player) { - return player.countDiscardableCards(player, "he") > 0 && player != event.player; - }, - check: function (event, player) { - return ( - get.attitude(player, event.player) < 0 && - player.countCards( - "he", - (card) => - lib.filter.cardDiscardable(card, player, "dcyiyong") && - get.value(card, player) < 7 - ) > 0 - ); - }, - logTarget: "player", - content: function () { - "step 0"; - event.list = [player]; - event.cards0 = []; - event.cards1 = []; - if (trigger.player.countDiscardableCards(trigger.player, "he") > 0) { - event.list.push(trigger.player); - } - if (!event.isMine() && !event.isOnline()) game.delayx(); - player - .chooseCardOL( - event.list, - "he", - true, - [1, Infinity], - "异勇:弃置任意张牌", - (card, player, target) => { - return lib.filter.cardDiscardable(card, player, "dcyiyong"); - } - ) - .set("ai", (card) => { - var evt = _status.event.getParent(2); - var source = evt.player, - player = _status.event.player, - target = evt.list[1]; - if (!target) return get.unuseful(card); - if (player == source) { - var total = 0, - need = 0; - target.countCards("he", (card) => { - if ( - lib.filter.cardDiscardable(card, target, "dcyiyong") && - get.value(card) < 5 - ) - need += get.number(card); - }); - for (var i of ui.selected.cards) total += get.number(i); - if (total >= need + 5) return 0; - var val = 6; - if ( - target.hp <= 2 && - !target.hasSkillTag("filterDamage", null, { - player: player, - card: evt.getTrigger().card, - }) - ) - val += 2 + get.number(card) / 5; - if (target.countCards("he", (card) => get.value(card) < 5) >= 3) - val -= 3 + get.number(card) / 5; - return val - get.value(card); - } - if ( - ui.selected.cards.length > 1 && - ui.selected.cards.length + 2 >= source.countCards("he") - ) - return 0; - if ( - player.hp <= 2 && - !target.hasSkillTag("filterDamage", null, { - player: player, - card: evt.getTrigger().card, - }) - ) - return 10 - get.value(card); - return 5 - get.value(card); - }); - "step 1"; - var lose_list = [], - cards = []; - for (var i = 0; i < result.length; i++) { - var current = event.list[i], - cards2 = result[i].cards; - cards.push(cards2); - event["cards" + i] = cards2; - event.cards = cards; - lose_list.push([current, cards2]); - } - game.loseAsync({ lose_list: lose_list }).setContent("discardMultiple"); - "step 2"; - var getn = function (cards) { - return cards.map((i) => get.number(i, false)).reduce((p, c) => p + c, 0); - }; - var num0 = getn(event.cards0), - num1 = getn(event.cards1); - if (num0 <= num1) { - player.draw(event.cards1.length); - } - if (num0 >= num1) { - trigger.num++; - } - }, - }, - //乐就 - dccuijin: { - audio: 2, - trigger: { global: "useCard" }, - filter: function (event, player) { - return ( - (event.card.name == "sha" || event.card.name == "juedou") && - (event.player == player || player.inRange(event.player)) && - player.countCards("he") > 0 - ); - }, - direct: true, - content: function () { - "step 0"; - if (player != game.me && !player.isOnline()) game.delayx(); - var target = trigger.player; - event.target = target; - player - .chooseToDiscard( - "he", - get.prompt("dccuijin", target), - "弃置一张牌并令" + - get.translation(trigger.player) + - "使用的" + - get.translation(trigger.card) + - "伤害+1,但若其未造成伤害,则你摸两张牌并对其造成1点伤害。" - ) - .set("ai", function (card) { - if (_status.event.goon) return 7 - get.value(card); - return 0; - }) - .set("goon", lib.skill.cuijin.checkx(trigger, player)).logSkill = [ - "dccuijin", - target, - ]; - "step 1"; - if (result.bool) { - if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; - trigger.baseDamage++; - player.addSkill("dccuijin_damage"); - player.markAuto("dccuijin_damage", [trigger.card]); - if (!player.storage.dccuijin_map) - player.storage.dccuijin_map = { cards: [], targets: [] }; - player.storage.dccuijin_map.cards.push(trigger.card); - player.storage.dccuijin_map.targets.push(trigger.targets.slice()); - } - }, - subSkill: { - damage: { - trigger: { - global: [ - "damage", - "damageCancelled", - "damageZero", - "shaMiss", - "useCardToExcluded", - "useCardToEnd", - "eventNeutralized", - "useCardAfter", - "shaCancelled", - ], - }, - forced: true, - silent: true, - firstDo: true, - charlotte: true, - onremove: true, - filter: function (event, player, name) { - if (!event.card) return false; - var cards = player.getStorage("dccuijin_damage"); - if (!cards.includes(event.card)) return false; - return true; - }, - content: function () { - "step 0"; - var card = trigger.card, - idx = player.storage.dccuijin_map.cards.indexOf(card); - if (event.triggername == "useCardAfter") { - var cards = player.getStorage("dccuijin_damage"); - cards = cards.remove(card); - if (!cards.length) { - player.removeSkill("dccuijin_damage"); - delete player.storage.dccuijin_map; - } else if (idx !== -1) { - player.storage.dccuijin_map.cards.splice(idx, 1); - player.storage.dccuijin_map.targets.splice(idx, 1); - } - event.finish(); - } else if (idx !== -1) { - var target, source; - if (trigger.name.indexOf("damage") == 0) { - target = trigger.player; - source = trigger.source; - } else { - target = trigger.target; - source = trigger.player; - } - if ( - player.storage.dccuijin_map.targets[idx].includes(target) && - !target.hasHistory("damage", (evt) => { - return evt.card == card; - }) - ) { - player.logSkill("dccuijin_damage", source); - player.storage.dccuijin_map.targets[idx].remove(target); - player.draw(2); - if (source && source.isIn()) { - player.line(trigger.player, "green"); - trigger.player.damage(); - } - } - } - "step 1"; - game.delayx(); - }, - }, - }, - }, - //陈矫 - dcxieshou: { - trigger: { - global: "damageEnd", - }, - usable: 1, - filter: function (event, player) { - return get.distance(player, event.player) <= 2 && event.player.isIn(); - }, - check: function (event, player) { - return get.attitude(player, event.player) > 4; - }, - locked: false, - logTarget: "player", - onremove: true, - change: function (player, num) { - player.addSkill("dcxieshoux"); - if (typeof player.storage.dcxieshoux !== "number") player.storage.dcxieshoux = 0; - if (!num) return; - player.storage.dcxieshoux += num; - if (player.storage.dcxieshoux != 0) player.markSkill("dcxieshoux"); - else player.unmarkSkill("dcxieshoux"); - game.log(player, "的手牌上限", (num > 0 ? "+" : "") + num); - }, - content: function () { - "step 0"; - lib.skill.dcxieshou.change(player, -1); - "step 1"; - var list = [], - target = trigger.player; - event.target = target; - var choiceList = ["回复1点体力", "复原,摸两张牌"]; - if (target.getDamagedHp() == 0) - choiceList[0] = '' + choiceList[0] + ""; - else list.push("选项一"); - list.push("选项二"); - target - .chooseControl(list) - .set("choiceList", choiceList) - .set("prompt", get.translation(player) + "对你发动了【协守】,请选择一项"); - "step 2"; - if (result.control == "选项一") { - target.recover(); - } else { - target.link(false); - target.draw(2); - } - }, - ai: { - expose: 0.3, - }, - }, - dcxieshoux: { - markimage: "image/card/handcard.png", - intro: { - content: function (storage, player) { - var num = player.storage.dcxieshoux; - return "手牌上限" + (num >= 0 ? "+" : "") + num; - }, - }, - charlotte: true, - mod: { - maxHandcard: function (player, num) { - return num + (player.storage.dcxieshoux || 0); - }, - }, - }, - dcqingyan: { - trigger: { - target: "useCardToTargeted", - }, - filter: function (event, player) { - return event.player != player && get.color(event.card) == "black"; - }, - usable: 2, - async cost(event, trigger, player) { - if (player.countCards("h") < player.hp) { - event.result = await player - .chooseBool( - get.prompt("dcqingyan"), - "将手牌摸至体力上限(摸" + - get.cnNumber(player.maxHp - player.countCards("h")) + - "张牌)" - ) - .set("ai", () => 1) - .forResult(); - } else { - event.result = await player - .chooseToDiscard( - get.prompt("dcqingyan"), - "弃置一张手牌令你的手牌上限+1", - "chooseonly" - ) - .set("ai", (card) => 6 - get.value(card)) - .forResult(); - } - }, - async content(event, trigger, player) { - if (event.cards && event.cards.length) { - await player.discard(event.cards); - lib.skill.dcxieshou.change(player, 1); - } else { - player.drawTo(player.maxHp); - } - }, - }, - dcqizi: { - mod: { - cardSavable: function (card, player, target) { - if ( - get.distance(player, target) > 2 && - card.name == "tao" && - target == _status.event.dying - ) - return false; - }, - }, - ai: { - neg: true - }, - }, - //公孙度 - dczhenze: { - audio: 2, - trigger: { player: "phaseDiscardBegin" }, - direct: true, - content: function () { - "step 0"; - var getCond = (player) => Math.sign(player.countCards("h") - Math.max(0, player.hp)); - var me = getCond(player); - var recovers = game.filterPlayer((current) => getCond(current) == me), - loses = game.filterPlayer().removeArray(recovers); - event.recovers = recovers; - event.loses = loses; - var list = []; - if (loses.length) list.push("选项一"); - if (recovers.length) list.push("选项二"); - list.push("cancel2"); - var sign = [ - ["≥", "<"], - ["≠", "="], - ["≤", ">"], - ]; - var choiceList = [ - "令所有手牌数" + - sign[me + 1][0] + - "体力值的角色失去1点体力" + - (loses.length ? "(" + get.translation(loses) + ")" : ""), - "令所有手牌数" + - sign[me + 1][1] + - "体力值的角色回复1点体力" + - (recovers.length ? "(" + get.translation(recovers) + ")" : ""), - ]; - if (!loses.length) - choiceList[0] = '' + choiceList[0] + ""; - if (!recovers.length) - choiceList[1] = '' + choiceList[1] + ""; - player - .chooseControl(list) - .set("choiceList", choiceList) - .set("prompt", get.prompt("dczhenze")) - .set("ai", () => _status.event.choice) - .set( - "choice", - (() => { - var effect = 0; - if (list.length == 2) { - if (list.includes("选项一")) { - loses.forEach( - (i) => - (effect += get.effect(i, { name: "losehp" }, player, player)) - ); - if (effect > 0) return "选项一"; - } else { - recovers.forEach( - (i) => (effect += get.recoverEffect(i, player, player)) - ); - if (effect > 0) return "选项二"; - } - } else { - loses.forEach( - (i) => (effect += get.effect(i, { name: "losehp" }, player, player)) - ); - recovers.forEach((i) => (effect += get.recoverEffect(i, player, player))); - if (effect > 0) return "选项二"; - return "选项一"; - } - })() - ); - "step 1"; - if (result.control == "cancel2") { - event.finish(); - } else { - var lose = result.control == "选项一", - targets = event[lose ? "loses" : "recovers"]; - player.logSkill("dczhenze", targets); - for (var i of targets) { - i[lose ? "loseHp" : "recover"](); - } - } - }, - }, - dcanliao: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if ( - (player.getStat().skill.dcanliao || 0) >= - game.countPlayer((current) => current.group == "qun") - ) - return false; - return true; - }, - filterTarget: function (card, player, target) { - return target.countCards("he"); - }, - content: function () { - "step 0"; - player - .choosePlayerCard(target, "he", true) - .set("filterButton", function (button) { - var card = button.link, - owner = get.owner(card); - return !owner || owner.canRecast(card, _status.event.player); - }) - .set("ai", function (card) { - if (get.attitude(_status.event.player, _status.event.getParent().target) >= 0) - return -get.buttonValue(card); - return get.buttonValue(card); - }); - "step 1"; - if (result.bool) target.recast(result.links); - }, - ai: { - expose: 0.1, - result: { - target: function (player, target) { - if ( - target.hasCard((card) => get.value(card) >= 6, "e") && - get.attitude(player, target) < 0 - ) - return -1; - return 1; - }, - }, - }, - }, - //王烈 - dcchongwang: { - audio: 2, - trigger: { global: "useCard" }, - direct: true, - filter: function (event, player) { - if (player == event.player) return false; - var type = get.type(event.card); - if (type != "basic" && type != "trick") return false; - var history = game.getAllGlobalHistory("useCard"); - var index = history.indexOf(event); - if (index > 0) return history[index - 1].player == player; - return false; - }, - content: function () { - "step 0"; - var source = trigger.player; - var list = [["exclude", "令" + get.translation(trigger.card) + "无效"]]; - var cards = trigger.cards.filterInD(); - if (source.isIn() && cards.length > 0) - list.push(["gain", "令" + get.translation(source) + "收回" + get.translation(cards)]); - player - .chooseButton([ - get.prompt("dcchongwang", source), - [list, "textbutton"], - "noforcebutton", - ]) - .set("ai", function (button) { - var player = _status.event.player, - choice = button.link; - var evt = _status.event.getTrigger(); - if (choice == "exclude") { - var effect = 0; - if (!evt.targets.length && get.info(evt.card, false).notarget) - effect -= get.effect(evt.player, evt.card, evt.player, player); - for (var i of evt.targets) { - effect -= get.effect(i, evt.card, evt.player, player); - } - return effect; - } else { - var cards = evt.cards.filterInD(); - return get.value(cards, evt.player) * get.attitude(player, evt.player); - } - }); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - } else event.finish(); - "step 2"; - if (result.bool) { - player.logSkill("dcchongwang", trigger.player); - if (result.links[0] == "gain") { - player.addTempSkill("dcchongwang_gain"); - trigger._dcchongwang = true; - } else { - trigger.targets.length = 0; - trigger.all_excluded = true; - game.log(trigger.card, "被无效了"); - } - } - }, - ai: { - threaten: 3.5, - directHit_ai: true, - }, - subSkill: { - gain: { - trigger: { global: "useCardAfter" }, - charlotte: true, - forced: true, - popup: false, - filter: function (event, player) { - return event._dcchongwang; - }, - content: function () { - trigger.player.gain(trigger.cards.filterInD(), "gain2"); - }, - }, - }, - }, - dchuagui: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("he") > 0; - }); - }, - content: function () { - "step 0"; - var min = Math.max.apply( - Math, - game.filterPlayer().map(function (current) { - return 1 + current.getFriends().length; - }) - ); - var max = Math.min( - min, - game.countPlayer(function (current) { - return current != player && current.countCards("he") > 0; - }) - ); - player - .chooseTarget( - get.prompt("dchuagui"), - "令至多" + get.cnNumber(max) + "名角色进行囚徒困境选择", - [1, max], - function (card, player, target) { - return target != player && target.countCards("he") > 0; - } - ) - .set("animate", false) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - player.logSkill("dchuagui"); - event.players = result.targets.slice(0); - event._global_waiting = true; - } else event.finish(); - "step 2"; - var send = function (source) { - var next = game.createEvent("dchuagui_choose", false); - next.player = game.me; - next.source = source; - next.setContent(lib.skill.dchuagui.contentx); - game.resume(); - }; - var sendback = function (result, player) { - if (!Array.isArray(result)) { - result = [ - Math.random() < 0.5 ? "仅展示牌" : "交出牌", - player.getCards("he").randomGet(), - ]; - } - event.results.push([player, result]); - }; - event.ai_targets = []; - event.results = []; - var players = game - .filterPlayer(function (current) { - return current != player; - }) - .sortBySeat(); - var time = 10000; - if (lib.configOL && lib.configOL.choose_timeout) - time = parseInt(lib.configOL.choose_timeout) * 1000; - for (var i = 0; i < players.length; i++) { - players[i].showTimer(time); - if (!event.players.includes(players[i])) continue; - if (players[i].isOnline()) { - event.withol = true; - players[i].send(send, player); - players[i].wait(sendback); - } else if (players[i] == game.me) { - event.withme = true; - var next = game.createEvent("dchuagui_choose", false); - next.player = game.me; - next.source = player; - next.setContent(lib.skill.dchuagui.contentx); - if (_status.connectMode) game.me.wait(sendback); - } else { - event.ai_targets.push(players[i]); - } - } - if (event.ai_targets.length) { - event.ai_targets.randomSort(); - setTimeout(function () { - event.interval = setInterval( - function () { - var target = event.ai_targets.shift(); - var att = get.attitude(target, player), - hs = target.getCards("he"); - hs.sort((b, a) => get.value(b, target) - get.value(a, target)); - var choice = "仅展示牌", - card = hs[0]; - if (att < -2 && Math.random() > (get.value(card, target) - 3) / 5) - choice = "交出牌"; - sendback([choice, card], target); - if (!event.ai_targets.length) { - clearInterval(event.interval); - if (event.withai) game.resume(); - } - }, - _status.connectMove ? 750 : 75 - ); - }, 500); - } - "step 3"; - if (event.withme) { - if (_status.connectMode) game.me.unwait(result, game.me); - else { - if (!Array.isArray(result)) { - result = [ - Math.random() < 0.5 ? "仅展示牌" : "交出牌", - player.getCards("he").randomGet(), - ]; - } - event.results.push([player, result]); - } - } - "step 4"; - if (event.withol && !event.resultOL) { - game.pause(); - } - "step 5"; - if (event.ai_targets.length > 0) { - event.withai = true; - game.pause(); - } - "step 6"; - delete event._global_waiting; - for (var i of game.players) i.hideTimer(); - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (name, id, results) { - var dialog = ui.create.dialog( - name + "发动了技能【化归】", - "hidden", - "forcebutton" - ); - dialog.videoId = id; - dialog.classList.add("scroll1"); - dialog.classList.add("scroll2"); - dialog.classList.add("fullwidth"); - dialog.classList.add("fullheight"); - dialog.buttonss = []; - - var list = ["仅展示牌的玩家", "交出牌的玩家"]; - for (var i = 0; i < list.length; i++) { - dialog.add('
    ' + list[i] + "
    "); - var buttons = ui.create.div(".buttons", dialog.content); - dialog.buttonss.push(buttons); - buttons.classList.add("popup"); - buttons.classList.add("guanxing"); - } - dialog.open(); - - var getx = function () { - var item = results.shift(); - var card = item[1][1], - index = item[1][0] == "仅展示牌" ? 0 : 1; - var button = ui.create.button(card, "card", dialog.buttonss[index]); - button.querySelector(".info").innerHTML = (function (target) { - if (target._tempTranslate) return target._tempTranslate; - var name = target.name; - if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; - return get.translation(name); - })(item[0]); - if (results.length > 0) setTimeout(getx, 500); - }; - setTimeout(getx, 500); - }, - get.translation(player), - event.videoId, - event.results.slice(0) - ); - game.delay(0, 2000 + event.results.length * 500); - "step 7"; - game.broadcastAll("closeDialog", event.videoId); - var shown = [], - given = []; - for (var i of event.results) { - (i[1][0] == "仅展示牌" ? shown : given).push(i); - } - var list = given.length > 0 ? given : shown; - var cards = [], - targets = []; - for (var i of list) { - cards.push(i[1][1]); - targets.push(i[0]); - //i[0].$give(i[1][1],player); - } - player.line(targets); - player.gain(cards, "give"); - //step 8 - //game.delayx(); - }, - contentx: function () { - "step 0"; - event._global_waiting = true; - event.result = ["仅展示牌", player.getCards("he").randomGet()]; - var str = get.translation(source); - player - .chooseControl("仅展示牌", "交出牌") - .set("choiceList", [ - "仅展示一张牌。但如果所有人都选择了仅展示,则" + str + "获得这张牌", - "将一张牌交给" + str, - ]) - .set("_global_waiting", true); - "step 1"; - event.result[0] = result.control; - player.chooseCard("he", true).set("_global_waiting", true); - "step 2"; - event.result[1] = result.cards[0]; - }, - }, - //陈珪 - dcyingtu: { - audio: 2, - trigger: { - global: ["gainAfter", "loseAsyncAfter"], - }, - usable: 1, - getIndex(event, player) { - var targets = []; - if (lib.skill.dcyingtu.filterx(event, player, player.getNext())) - targets.add(player.getNext()); - if (lib.skill.dcyingtu.filterx(event, player, player.getPrevious())) - targets.add(player.getPrevious()); - return targets.sortBySeat(_status.currentPhase); - }, - filterx: function (event, player, target) { - var evt = event.getParent("phaseDraw"); - if (evt && target == evt.player) return false; - return ( - event.getg(target).length > 0 && - target.hasCard(function (card) { - return lib.filter.canBeGained(card, target, player); - }, "he") - ); - }, - logTarget(event, player, triggername, target) { - return target; - }, - check(event, player, triggername, source) { - var target = source == player.getNext() ? player.getPrevious() : player.getNext(); - return Math.min(0, get.attitude(player, target)) >= get.attitude(player, source); - }, - prompt2: - "获得该角色的一张牌,然后将一张牌交给该角色的对位角色。若你给出的是装备牌,则其使用其得到的牌。", - content: function () { - "step 0"; - var target = event.targets[0]; - event.target = target; - event.side = target == player.getPrevious() ? "getNext" : "getPrevious"; - player.gainPlayerCard(target, true, "he"); - "step 1"; - var he = player.getCards("he"); - if (he.length > 0) { - var target = player[event.side](); - event.target = target; - if (he.length == 1) event._result = { bool: true, cards: he }; - else player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = result.cards[0]; - event.card = card; - player.line(target); - player.give(card, target); - } else event.finish(); - "step 3"; - if ( - target.getCards("h").includes(card) && - get.type(card, null, target) == "equip" && - target.canUse(card, target) - ) - target.chooseUseTarget(card, true, "nopopup"); - }, - }, - dccongshi: { - audio: 2, - trigger: { global: "useCardAfter" }, - forced: true, - filter: function (event, player) { - return get.type(event.card, null, false) == "equip" && event.player.isMaxEquip(); - }, - content: function () { - player.draw(); - }, - }, - //黄权 - dcquanjian: { - audio: 2, - enable: "phaseUse", - usable: 2, - filter: function (event, player) { - return game.hasPlayer((current) => current != player); - }, - chooseButton: { - dialog: function (event, player) { - var dialog = ui.create.dialog("劝谏:令一名其他角色…", "hidden"); - dialog.add([ - [ - ["damage", "对其攻击范围内的一名角色造成1点伤害"], - [ - "draw", - "将其手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌", - ], - ], - "textbutton", - ]); - return dialog; - }, - filter: function (button, player) { - return !player.hasSkill("dcquanjian_" + button.link, null, null, false); - }, - check: () => 1 + Math.random(), - backup: function (links) { - return get.copy(lib.skill["dcquanjian_" + links[0]]); - }, - prompt: function (links) { - if (links[0] == "damage") return "令一名其他角色对攻击范围内的另一名角色造成1点伤害"; - return "令一名其他角色将手牌数调整至手牌上限(至多摸至五张)且本回合内不能使用手牌"; - }, - }, - ai: { - order: 2, - result: { player: 1 }, - }, - subSkill: { - backup: { audio: "dcquanjian" }, - damage: { - audio: "dcquanjian", - selectTarget: 2, - filterTarget: function (card, player, target) { - if (!ui.selected.targets.length) return target != player; - return ui.selected.targets[0].inRange(target); - }, - complexTarget: true, - complexSelect: true, - filterCard: () => false, - selectCard: -1, - targetprompt: ["造成伤害", "受到伤害"], - multitarget: true, - content: function () { - "step 0"; - player.addTempSkill("dcquanjian_damage", "phaseUseAfter"); - targets[0] - .chooseControl() - .set("choiceList", [ - "对" + get.translation(targets[1]) + "造成1点伤害", - "本回合下次受到的伤害+1", - ]) - .set("ai", function () { - return _status.event.eff >= 0 ? 0 : 1; - }) - .set("eff", get.damageEffect(targets[1], targets[0], targets[0])); - "step 1"; - if (result.index == 0) { - targets[1].damage(targets[0]); - } else { - target.addMark("dcquanjian_effect", 1, false); - target.addTempSkill("dcquanjian_effect"); - } - }, - ai: { - result: { - player: function (player, target) { - if (ui.selected.targets.length == 0) { - if ( - !game.hasPlayer( - (current) => - current.inRangeOf(target) && - get.damageEffect(current, target, player) > 0 - ) - ) - return 0; - if (get.attitude(player, target) > 0) return 2; - return 1; - } - return get.damageEffect(target, ui.selected.targets[0], player, player); - }, - }, - }, - }, - draw: { - audio: "dcquanjian", - filterTarget: function (card, player, target) { - if (target == player) return false; - var num = target.countCards("h"); - if (num > target.getHandcardLimit()) return true; - return num < Math.min(5, target.getHandcardLimit()); - }, - filterCard: () => false, - selectCard: -1, - content: function () { - "step 0"; - player.addTempSkill("dcquanjian_draw", "phaseUseAfter"); - var num1 = target.countCards("h"), - num2 = target.getHandcardLimit(); - var num = 0; - if (num1 > num2) { - event.index = 0; - num = num1 - num2; - target - .chooseControl() - .set("choiceList", [ - "弃置" + get.cnNumber(num) + "张手牌", - "本回合下次受到的伤害+1", - ]) - .set("ai", function () { - var player = _status.event.player; - if ( - _status.event.number == 1 && - player.hasCard(function (card) { - return ( - lib.filter.cardDiscardable( - card, - player, - "dcquanjian_draw" - ) && get.value(card) < 5 - ); - }, "h") - ) - return 0; - return 1; - }) - .set("number", num); - } else { - event.index = 1; - num = Math.min(num2, 5) - num1; - if (num <= 0) event.finish(); - else - target - .chooseControl() - .set("choiceList", [ - "摸" + get.cnNumber(num) + "张牌,且本回合内不能使用或打出手牌", - "本回合下次受到的伤害+1", - ]) - .set("ai", function () { - return 0; - }); - } - event.num = num; - "step 1"; - if (result.index == 0) { - if (event.index == 0) target.chooseToDiscard("h", true, num); - else target.draw(num); - } else { - target.addMark("dcquanjian_effect", 1, false); - target.addTempSkill("dcquanjian_effect"); - event.finish(); - } - "step 2"; - target.addTempSkill("dcquanjian_disable"); - }, - ai: { - result: { - target: function (player, target) { - var num1 = target.countCards("h"), - num2 = target.getHandcardLimit(); - if (num1 > num2) return -1; - return Math.min(5, num2) - num1; - }, - }, - }, - }, - effect: { - charlotte: true, - trigger: { player: "damageBegin3" }, - forced: true, - onremove: true, - marktext: "谏", - content: function () { - trigger.num += player.countMark(event.name); - player.removeSkill(event.name); - }, - intro: { content: "下次受到的伤害+#" }, - ai: { threaten: 2.5 }, - }, - disable: { - charlotte: true, - mod: { - cardEnabled(card, player) { - if (card.cards) { - const hs = player.getCards("h"); - if (card.cards.some((card) => hs.includes(card))) return false; - } - }, - cardSavable(card, player) { - if (card.cards) { - const hs = player.getCards("h"); - if (card.cards.some((card) => hs.includes(card))) return false; - } - }, - }, - mark: true, - marktext: "禁", - intro: { content: "不能使用或打出手牌" }, - ai: { threaten: 2.5 }, - }, - }, - }, - dctujue: { - audio: 2, - trigger: { player: "dying" }, - direct: true, - limited: true, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player - .chooseTarget(lib.filter.notMe, get.prompt2("dctujue")) - .set("ai", function (target) { - if (_status.event.skip) return 0; - return 200 + get.attitude(_status.event.player, target); - }) - .set("skip", player.countCards("hs", { name: ["tao", "jiu"] }) + player.hp > 0); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dctujue", target); - player.awakenSkill("dctujue"); - var cards = player.getCards("he"); - player.give(cards, target); - player.recover(cards.length); - player.draw(cards.length); - } - }, - }, - //尹夫人 - dcyingyu: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - direct: true, - filter: function (event, player) { - if (event.name == "phaseJieshu" && !player.storage.dcyingyu) return false; - return ( - game.countPlayer(function (current) { - return current.countCards("h") > 0; - }) > 1 - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - 2, - get.prompt("dcyingyu"), - "展示两名角色的各一张手牌。若这两张牌花色不同,则你可以令其中一名角色获得另一名角色的展示牌。", - function (card, player, target) { - return target.countCards("h") > 0; - } - ) - .set("ai", function (target) { - var player = _status.event.player; - if (!ui.selected.targets.length) return get.attitude(player, target); - return 1 - get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - event.targets = targets; - event.cards = []; - player.logSkill("dcyingyu", targets); - player.choosePlayerCard(targets[0], true, "h"); - } else event.finish(); - "step 2"; - var card = result.cards[0]; - player.line(targets[0]); - player.showCards( - card, - get.translation(player) + "对" + get.translation(targets[0]) + "发动了【媵予】" - ); - event.cards.push(card); - player.choosePlayerCard(targets[1], true, "h"); - "step 3"; - var card = result.cards[0]; - player.line(targets[1]); - player.showCards( - card, - get.translation(player) + "对" + get.translation(targets[1]) + "发动了【媵予】" - ); - event.cards.push(card); - if (get.suit(cards[0], targets[0]) == get.suit(cards[1], targets[1])) event.finish(); - "step 4"; - var str1 = get.translation(targets[0]), - str2 = get.translation(targets[1]); - player - .chooseControl("cancel2") - .set("choiceList", [ - "令" + str1 + "获得" + str2 + "的" + get.translation(cards[1]), - "令" + str2 + "获得" + str1 + "的" + get.translation(cards[0]), - ]) - .set("goon", get.attitude(player, targets[0]) > 0 ? 0 : 1) - .set("ai", () => _status.event.goon); - "step 5"; - if (result.control != "cancel2") { - var i = result.index; - targets[1 - i].give(cards[1 - i], targets[i], "give"); - } - }, - onremove: true, - }, - dcyongbi: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer((current) => lib.skill.dcyongbi.filterTarget(null, player, current)) - ); - }, - filterTarget: function (card, player, target) { - return target != player && target.hasSex("male"); - }, - selectCard: -1, - filterCard: true, - position: "h", - limited: true, - skillAnimation: true, - animationColor: "fire", - discard: false, - lose: false, - content: function () { - "step 0"; - player.awakenSkill("dcyongbi"); - if (player.hasSkill("dcyingyu", null, null, false)) player.storage.dcyingyu = true; - player.give(cards, target); - "step 1"; - var list = []; - for (var i of cards) { - list.add(get.suit(i, player)); - if (list.length >= 3) break; - } - if (list.length >= 2) { - player.addMark("dcyongbi_eff1", 2, false); - player.addSkill("dcyongbi_eff1"); - target.addMark("dcyongbi_eff1", 2, false); - target.addSkill("dcyongbi_eff1"); - } - if (list.length >= 3) { - player.addMark("dcyongbi_eff2", 1, false); - player.addSkill("dcyongbi_eff2"); - target.addMark("dcyongbi_eff2", 1, false); - target.addSkill("dcyongbi_eff2"); - } - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (player.hasUnknown()) return 0; - var zhu = get.zhu(player); - if (zhu && get.attitude(player, zhu) > 0) { - if (target == zhu) return 4; - } - return 1; - }, - }, - }, - subSkill: { - eff1: { - mod: { - maxHandcard: (player, num) => num + player.countMark("dcyongbi_eff1"), - }, - charlotte: true, - onremove: true, - marktext: "拥", - intro: { content: "手牌上限+#" }, - }, - eff2: { - trigger: { player: "damageBegin4" }, - forced: true, - filter: function (event, player) { - return event.num > 1; - }, - content: function () { - trigger.num -= player.countMark("dcyongbi_eff2"); - }, - charlotte: true, - onremove: true, - marktext: "嬖", - intro: { content: "受到大于1的伤害时,此伤害-#" }, - }, - }, - }, - //吕旷吕翔 - dcshuhe: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterCard: true, - position: "h", - discard: false, - lose: false, - delay: false, - check: function (cardx) { - var player = _status.event.player; - var num1 = get.number(cardx), - players = game.filterPlayer(); - var goon = false, - effect = 0; - for (var current of players) { - var cards = current.getCards("ej", function (card) { - var num = get.number(card); - return num == num1; - }); - if (cards.length) { - goon = true; - var att = get.attitude(player, current); - for (var card of cards) { - if (get.position(card) == "e") { - var val = get.value(card, current); - if (att <= 0) effect += val; - else effect -= val / 2; - } else { - var eff = get.effect( - current, - { name: card.viewAs || card.name }, - player, - player - ); - effect -= get.sgn(att) * eff; - } - } - } - } - if (goon) { - if (effect > 0) return 6 + effect - get.value(cardx); - return 0; - } - return game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0; - }) - ? 6 - get.value(cardx) - : 0; - }, - content: function () { - "step 0"; - player.showCards(cards, get.translation(player) + "发动了【数合】"); - player.addMark("dcliehou", 1); - "step 1"; - event.cards2 = []; - var num1 = get.number(cards[0], player); - var lose_list = [], - players = game.filterPlayer(); - for (var current of players) { - var cards = current.getCards("ej", function (card) { - var num = get.number(card); - return num == num1; - }); - if (cards.length > 0) { - player.line(current, "thunder"); - current.$throw(cards); - lose_list.push([current, cards]); - event.cards2.addArray(cards); - } - } - if (lose_list.length) { - event.lose_list = lose_list; - game.loseAsync({ - lose_list: lose_list, - }).setContent("chooseToCompareLose"); - } else { - event.goto(3); - player - .chooseTarget( - true, - lib.filter.notMe, - "将" + get.translation(event.cards[0]) + "交给一名其他角色" - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - } - "step 2"; - var cards = event.cards2; - if (cards.length > 0) { - if (event.lose_list) game.delayx(); - player.gain(cards, "gain2"); - } - event.finish(); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - player.give(cards, target); - } - }, - ai: { - order: 2, - result: { - player: 1, - }, - }, - }, - dcliehou: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - var num = Math.min(5, 1 + player.countMark("dcliehou")); - trigger.num += num; - trigger._dcliehou = num; - }, - group: "dcliehou_discard", - subSkill: { - discard: { - trigger: { player: "phaseDrawEnd" }, - forced: true, - filter: function (event, player) { - return typeof event._dcliehou == "number"; - }, - content: function () { - "step 0"; - var num = trigger._dcliehou; - player - .chooseToDiscard( - num, - "he", - "弃置" + get.cnNumber(num) + "张牌,或失去1点体力" - ) - .set("ai", function (card) { - if (_status.event.goon) return 6 - get.value(card); - return 26 - get.value(card); - }) - .set( - "goon", - player.hp > Math.max(1, 4 - num) || - get.effect(player, { name: "losehp" }, player, player) > 0 - ); - "step 1"; - if (!result.bool) player.loseHp(); - }, - }, - }, - marktext: "爵", - intro: { - name: "列侯(爵)", - name2: "爵", - content: "〖列侯〗的摸牌数+#", - }, - }, - //管亥 - suoliang: { - audio: 2, - trigger: { source: "damageSource" }, - logTarget: "player", - usable: 1, - filter: function (event, player) { - return ( - event.player != player && event.player.maxHp > 0 && event.player.countCards("he") > 0 - ); - }, - check: function (event, player) { - return get.attitude(player, event.player) <= 0; - }, - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - player.choosePlayerCard( - target, - true, - "he", - [1, target.maxHp], - "选择" + get.translation(target) + "的至多" + get.cnNumber(target.maxHp) + "张牌" - ); - "step 1"; - if (result.bool) { - player.showCards( - result.cards, - get.translation(player) + "对" + get.translation(target) + "发动了【索粮】" - ); - var cards = result.cards.filter(function (card) { - var suit = get.suit(card, target); - if (suit != "heart" && suit != "club") return false; - return lib.filter.canBeGained(card, target, player); - }); - if (cards.length) player.gain(cards, target, "giveAuto", "bySelf"); - else { - var cards = result.cards.filter(function (card) { - return lib.filter.canBeDiscarded(card, target, player); - }); - if (cards.length) target.discard(cards, "notBySelf"); - } - } - }, - }, - qinbao: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - return ( - (event.card.name == "sha" || get.type(event.card, null, false) == "trick") && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") >= player.countCards("h"); - }) - ); - }, - content: function () { - var hs = player.countCards("h"); - trigger.directHit.addArray( - game.filterPlayer(function (current) { - return current != player && current.countCards("h") >= hs; - }) - ); - }, - ai: { - threaten: 1.4, - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return ( - player.countCards("h", function (card) { - return !ui.selected.cards.includes(card); - }) <= arg.target.countCards("h") - ); - }, - }, - }, - //胡昭 - midu: { - audio: 2, - enable: "phaseUse", - usable: 1, - chooseButton: { - dialog: function (event, player) { - var dialog = ui.create.dialog("弥笃:选择要废除或恢复的装备栏或判定区", "hidden"); - dialog.classList.add("withbg"); - dialog.noforcebutton = true; - var list1 = [], - list2 = []; - for (var i = 1; i < 6; i++) { - for (var j = 0; j < player.countEnabledSlot(i); j++) { - list1.push(i); - } - if (player.hasDisabledSlot(i)) list2.push(i); - } - (player.isDisabledJudge() ? list2 : list1).push(-1); - var addTable = function (list, bool) { - const adds = []; - for (var i of list) { - adds.push([ - [i, bool], - i > 0 ? get.translation("equip" + i) + "栏" : "判定区", - ]); - } - dialog.add([adds, "tdnodes"]); - }; - if (list1.length) { - dialog.addText("未废除"); - addTable(list1, true); - } - if (list2.length) { - dialog.addText("已废除"); - addTable(list2, false); - } - return dialog; - }, - filter: function (button, player) { - if (!ui.selected.buttons.length) return true; - if (!ui.selected.buttons[0].link[1]) return false; - return button.link[1]; - }, - check: function (button) { - var player = _status.event.player; - if (!button.link[1]) { - if (button.link[0] <= 0) return -10; - if ( - player.hasCard(function (card) { - return get.subtype(card) == "equip" + button.link[0]; - }, "hs") - ) - return 15; - return 10; - } - if ( - button.link[0] <= 0 || - (player.hasEmptySlot(button.link[0]) && - !player.hasCard(function (card) { - return ( - get.subtype(card) == "equip" + button.link[0] && - player.canUse(card, player) && - get.effect(player, card, player, player) > 0 - ); - }, "hs")) - ) - return 5; - return 0; - }, - select: [1, Infinity], - backup: function (links, player) { - if (!links[0][1]) { - return { - audio: "midu", - selectCard: -1, - selectTarget: -1, - filterCard: () => false, - filterTarget: () => false, - equip: links[0][0], - content: function () { - var pos = lib.skill.midu_backup.equip; - if (pos <= 0) player.enableJudge(); - else player.enableEquip(pos); - player.addTempSkills("rehuomo", { player: "phaseBegin" }); - }, - }; - } else { - return { - audio: "midu", - selectCard: -1, - filterCard: () => false, - filterTarget: true, - equip: links.map((i) => i[0]).sort(), - content: function () { - var list = lib.skill.midu_backup.equip, - num = list.length, - bool = false; - if (list.includes(-1)) { - list.remove(-1); - bool = true; - } - if (list.length > 0) player.disableEquip(list); - if (bool) player.disableJudge(); - target.draw(num); - }, - ai: { - tag: { - draw: 1, - }, - result: { - target: 2, - }, - }, - }; - } - }, - prompt: function (links, player) { - if (!links[0][1]) { - return "恢复一个装备栏或判定区并获得〖活墨〗"; - } - var numc = get.cnNumber(links.length); - return "废除" + numc + "个区域并令一名角色摸" + numc + "张牌"; - }, - }, - derivation: "rehuomo", - ai: { - order: 8, - result: { player: 1 }, - }, - subSkill: { backup: {} }, - }, - xianwang: { - mod: { - globalTo: function (source, player, distance) { - var num = player.countDisabledSlot(); - if (num > 0) return distance + (num > 2 ? 2 : 1); - }, - globalFrom: function (source, player, distance) { - var num = source.countDisabledSlot(); - if (num > 0) return distance - (num > 2 ? 2 : 1); - }, - }, - }, - //刘巴 - dczhubi: { - audio: 2, - trigger: { - global: ["loseAfter", "loseAsyncAfter"], - }, - filter: function (event, player) { - if (event.type != "discard" || event.getlx === false) return false; - for (var i of event.cards) { - if (get.suit(i, event.player) == "diamond") return true; - } - return false; - }, - prompt2: "检索一张【无中生有】并置于牌堆顶", - content: function () { - var card = get.cardPile(function (card) { - return card.name == "wuzhong" && get.suit(card) != "diamond"; - }); - if (card) { - game.log(player, "将", card, "置于牌堆顶"); - card.fix(); - ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - game.updateRoundNumber(); - game.delayx(); - } - }, - }, - dcliuzhuan: { - audio: 2, - group: ["dcliuzhuan_mark", "dcliuzhuan_gain"], - mod: { - targetEnabled: function (card) { - if (card.cards) { - for (var i of card.cards) { - if (i.hasGaintag("dcliuzhuan_tag")) return false; - } - } else if (get.itemtype(card) == "card") { - if (card.hasGaintag("dcliuzhuan_tag")) return false; - } - }, - }, - subSkill: { - gain: { - audio: "dcliuzhuan", - trigger: { global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter"] }, - forced: true, - logTarget: () => _status.currentPhase, - filter: function (event, player) { - var current = _status.currentPhase; - if (!current) return false; - if (event.name == "cardsDiscard") { - var evtx = event.getParent(); - if (evtx.name != "orderingDiscard") return false; - var evtx2 = evtx.relatedEvent || evtx.getParent(); - return current.hasHistory("lose", function (evtx3) { - var evtx4 = evtx3.relatedEvent || evtx3.getParent(); - if (evtx2 != evtx4) return false; - for (var i in evtx3.gaintag_map) { - if (evtx3.gaintag_map[i].includes("dcliuzhuan_tag")) return true; - } - }); - //return false; - } else if (event.name == "lose") { - if (event.player != current || event.position != ui.discardPile) return false; - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("dcliuzhuan_tag")) return true; - } - return false; - } - return current.hasHistory("lose", function (evt) { - if (evt.getParent() != event || evt.position != ui.discardPile) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("dcliuzhuan_tag")) return true; - } - }); - }, - content: function () { - var cards, - current = _status.currentPhase; - if (trigger.name == "lose") - cards = trigger.hs.filter(function (i) { - return ( - trigger.gaintag_map[i.cardid] && - trigger.gaintag_map[i.cardid].includes("dcliuzhuan_tag") && - get.position(i, true) == "d" - ); - }); - else if (trigger.name == "cardsDiscard") { - var evtx = trigger.getParent(); - var evtx2 = evtx.relatedEvent || evtx.getParent(); - var bool = false; - var history = current.getHistory("lose", function (evtx3) { - var evtx4 = evtx3.relatedEvent || evtx3.getParent(); - if (evtx2 != evtx4) return false; - for (var i in evtx3.gaintag_map) { - if (evtx3.gaintag_map[i].includes("dcliuzhuan_tag")) return true; - } - }); - cards = trigger.cards.filter(function (i) { - for (var evt of history) { - if ( - evt.gaintag_map[i.cardid] && - evt.gaintag_map[i.cardid].includes("dcliuzhuan_tag") && - get.position(i, true) == "d" - ) - return true; - } - return false; - }); - } else { - cards = []; - current.getHistory("lose", function (evt) { - if (evt.getParent() != trigger || evt.position != ui.discardPile) - return false; - for (var card of evt.hs) { - if (get.position(card, true) != "d") continue; - var i = card.cardid; - if ( - evt.gaintag_map[i] && - evt.gaintag_map[i].includes("dcliuzhuan_tag") - ) - cards.push(card); - } - }); - } - if (cards && cards.length > 0) player.gain(cards, "gain2"); - }, - }, - mark: { - trigger: { global: "gainBegin" }, - forced: true, - popup: false, - silent: true, - lastDo: true, - filter: function (event, player) { - if (player == event.player || event.player != _status.currentPhase) return false; - var evt = event.getParent("phaseDraw"); - if (evt && evt.name == "phaseDraw") return false; - return true; - }, - content: function () { - trigger.gaintag.add("dcliuzhuan_tag"); - trigger.player.addTempSkill("dcliuzhuan_tag"); - }, - }, - tag: { - charlotte: true, - onremove: (player, skill) => player.removeGaintag(skill), - }, - }, - }, - //张勋 - suizheng: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("suizheng"), "令一名角色下回合内获得〖随征〗效果") - .set("", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.hasJudge("lebu")) return att / 2; - return ( - att * - get.threaten(target) * - Math.sqrt( - 2 + player == target - ? player.countCards("h", "sha") * 2 - : target.countCards("h") - ) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("suizheng", target); - target.addMark("suizheng_effect", 1, false); - target.markAuto("suizheng_source", [player]); - target.addTempSkill("suizheng_effect", { - player: player == target ? "phaseJieshuBefore" : "phaseAfter", - }); - } - }, - subSkill: { - effect: { - audio: "suizheng", - charlotte: true, - mod: { - targetInRange: function (card) { - if (card.name == "sha") return true; - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("suizheng_effect"); - }, - }, - trigger: { player: "phaseUseEnd" }, - forced: true, - popup: false, - filter: function (event, player) { - var list = player.getStorage("suizheng_source"); - if (!list.filter((i) => i.isIn().length)) return false; - return player.hasHistory("sourceDamage", function (evt) { - return evt.player.isIn() && evt.getParent("phaseUse") == event; - }); - }, - content: function () { - "step 0"; - var targets = player.getStorage("suizheng_source").slice(0).sortBySeat(); - event.targets = targets; - "step 1"; - var target = targets.shift(); - event.target = target; - var list = []; - player.getHistory("sourceDamage", function (evt) { - if (evt.player.isIn() && evt.getParent("phaseUse") == trigger) - list.add(evt.player); - }); - if (!list.length) event.finish(); - else if (target.isIn()) { - list = list.filter(function (i) { - return target.canUse("sha", i, false); - }); - if (list.length > 0) - target - .chooseTarget( - "随征:是否对一名角色使用【杀】?", - function (card, player, target) { - return _status.event.targets.includes(target); - } - ) - .set("targets", list) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "sha" }, player, player); - }); - } else event._result = { bool: false }; - "step 2"; - if (result.bool) { - target.useCard( - { - name: "sha", - isCard: true, - }, - result.targets, - false, - "suizheng_effect" - ); - } - if (targets.length > 0) event.goto(1); - }, - onremove: function (player) { - delete player.storage.suizheng_effect; - delete player.storage.suizheng_source; - }, - intro: { content: "使用【杀】无距离限制且次数上限+#" }, - }, - }, - }, - //纪灵 - dcshuangren: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - preHidden: true, - filter: function (event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return current != player && player.canCompare(current); - }) - ); - }, - content: function () { - "step 0"; - var goon; - if (player.needsToDiscard() > 1) { - goon = player.hasCard(function (card) { - return card.number > 10 && get.value(card) <= 5; - }); - } else if (player.hasSha()) { - goon = player.hasCard(function (card) { - return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; - }); - } else { - goon = player.hasCard(function (card) { - return get.value(card) <= 5; - }); - } - player - .chooseTarget(get.prompt2("dcshuangren"), function (card, player, target) { - return player.canCompare(target); - }) - .set("ai", function (target) { - var player = _status.event.player; - if (_status.event.goon && get.attitude(player, target) < 0) { - return get.effect(target, { name: "sha" }, player, player); - } - return 0; - }) - .set("goon", goon) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("dcshuangren", target); - player.chooseToCompare(target); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - var target = event.target; - if ( - game.hasPlayer(function (current) { - if (target == current || target.group != current.group) return false; - return player.canUse("sha", current, false); - }) - ) { - var str = "请选择视为使用【杀】的目标"; - var str2 = - "操作提示:选择一名角色B,或选择包含A(" + - get.translation(target) + - ")在内的两名角色A和B(B的势力需为" + - get.translation(target.group) + - "势力)"; - player - .chooseTarget([1, 2], str, str2, true, function (card, player, target) { - if (!player.canUse("sha", target, false)) return false; - var current = _status.event.target; - if (target == current) return true; - if (target.group != current.group) return false; - if (!ui.selected.targets.length) return true; - return ui.selected.targets[0] == current; - //return current==target; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "sha" }, player, player); - }) - .set("target", target) - .set("complexTarget", true); - } else { - player.useCard({ name: "sha", isCard: true }, target, false); - event.finish(); - } - } else { - player.addTempSkill("dcshuangren_debuff", "phaseUseAfter"); - event.finish(); - } - "step 3"; - if (result.bool && result.targets && result.targets.length) { - player.useCard({ name: "sha", isCard: true }, result.targets, false); - } - }, - subSkill: { - debuff: { - charlotte: true, - mod: { - cardEnabled: function (card) { - if (card.name == "sha") return false; - }, - }, - }, - }, - }, - //羊祜 - dcdeshao: { - audio: 2, - usable: 2, - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - return player != event.player && get.color(event.card) == "black"; - }, - logTarget: "player", - check: function (event, player) { - var eff = get.effect(player, { name: "draw" }, player, player); - if ( - player.countCards("h") + 1 <= event.player.countCards("h") && - event.player.countCards("he") > 0 - ) - eff += get.effect(event.player, { name: "guohe_copy2" }, player, player); - return eff; - }, - content: function () { - "step 0"; - player.draw(); - "step 1"; - var target = trigger.player; - if (player.countCards("h") <= target.countCards("h") && target.countCards("he") > 0) { - player.discardPlayerCard(target, true, "he"); - player.addExpose(0.2); - } - }, - }, - dcmingfa: { - audio: 2, - trigger: { player: "useCardAfter" }, - direct: true, - filter: function (event, player) { - return ( - player.isPhaseUsing() && - (event.card.name == "sha" || get.type(event.card) == "trick") && - event.cards.filterInD().length > 0 && - !player.getExpansions("dcmingfa").length - ); - }, - content: function () { - "step 0"; - var str, - cards = trigger.cards.filterInD(), - card = trigger.card; - if ( - cards.length == 1 && - card.name == cards[0].name && - (card.nature || false) == (cards[0].nature || false) - ) - str = get.translation(cards[0]); - else str = get.translation(trigger.card) + "(" + get.translation(cards) + ")"; - var cardx = { - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - }; - player - .chooseTarget( - lib.filter.notMe, - get.prompt("dcmingfa"), - "将" + - str + - "作为“明伐”牌置于武将牌上,并选择一名其他角色。该角色下回合结束时对其执行〖明伐〗的后续效果。" - ) - .set("card", cardx) - .set( - "goon", - (function () { - var getMax = function (card) { - return Math.max.apply( - Math, - game - .filterPlayer(function (current) { - return ( - current != player && - lib.filter.targetEnabled2(card, player, current) - ); - }) - .map(function (i) { - return ( - get.effect(i, card, player, player) * - Math.sqrt( - Math.min(i.getHandcardLimit(), 1 + i.countCards("h")) - ) - ); - }) - .concat([0]) - ); - }; - var eff1 = getMax(cardx); - if ( - player.hasCard(function (card) { - if ( - (card.name != "sha" && get.type(card) != "trick") || - !player.hasValueTarget(card, null, true) - ) - return false; - return ( - getMax({ - name: get.name(card), - nature: get.nature(card), - isCard: true, - }) >= eff1 - ); - }, "hs") - ) - return false; - return true; - })() - ) - .set("ai", function (target) { - if (!_status.event.goon) return 0; - var player = _status.event.player, - card = _status.event.card; - if (!lib.filter.targetEnabled2(card, player, target)) return 0; - return ( - get.effect(target, card, player, player) * - Math.sqrt(Math.min(target.getHandcardLimit(), 1 + target.countCards("h"))) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dcmingfa", target); - var card = { - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - }; - player.storage.dcmingfa_info = [card, target]; - player.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("dcmingfa"); - } - }, - group: "dcmingfa_use", - ai: { expose: 0.2 }, - intro: { - mark: function (dialog, storage, player) { - var cards = player.getExpansions("dcmingfa"); - if (!cards.length) return "没有“明伐”牌"; - else dialog.add(cards); - var info = player.storage.dcmingfa_info; - if (info) { - dialog.addText( - "记录牌:" + - get.translation(info[0]) + - "
    记录目标:" + - get.translation(info[1]) - ); - } - }, - content: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - delete player.storage.dcmingfa_info; - }, - subSkill: { - use: { - audio: "dcmingfa", - trigger: { global: ["phaseEnd", "die"] }, - forced: true, - filter: function (event, player) { - if (!player.storage.dcmingfa_info || !player.getExpansions("dcmingfa").length) - return false; - return event.player == player.storage.dcmingfa_info[1]; - }, - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - var card = player.storage.dcmingfa_info[0]; - delete player.storage.dcmingfa_info; - event.card = card; - event.count = Math.max(1, Math.min(5, target.countCards("h"))); - if (!event.player.isIn()) event.goto(2); - "step 1"; - event.count--; - if (target.isIn() && lib.filter.targetEnabled2(card, player, target)) { - player.useCard(get.copy(card), target); - if (event.count > 0) event.redo(); - } - "step 2"; - var cards = player.getExpansions("dcmingfa"); - if (cards.length > 0) player.loseToDiscardpile(cards); - }, - }, - }, - }, - //蔡瑁张允 - lianzhou: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - if (!player.isLinked()) return true; - return game.hasPlayer(function (current) { - return current != player && current.hp == player.hp && !current.isLinked(); - }); - }, - content: function () { - "step 0"; - if (!player.isLinked()) player.link(); - "step 1"; - var num = game.countPlayer(function (current) { - return current != player && current.hp == player.hp && !current.isLinked(); - }); - if (num > 0) { - player - .chooseTarget( - [1, num], - "选择横置任意名体力值等于你的角色", - function (card, player, current) { - return ( - current != player && current.hp == player.hp && !current.isLinked() - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "tiesuo" }, player, player); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.line(targets, "green"); - for (var i of targets) i.link(); - } - }, - ai: { halfneg: true }, - }, - jinglan: { - audio: 2, - trigger: { source: "damageSource" }, - forced: true, - content: function () { - var delta = player.countCards("h") - player.hp; - if (delta > 0) player.chooseToDiscard("h", 4, true); - else if (delta == 0) { - player.chooseToDiscard("he", true); - player.recover(); - } else { - player.damage("fire", "nosource"); - player.draw(5); - } - }, - ai: { halfneg: true }, - }, - //滕公主 - xingchong: { - audio: 2, - trigger: { global: "roundStart" }, - direct: true, - filter: function (event, player) { - return player.maxHp > 0; - }, - content: function () { - "step 0"; - var list = []; - for (var i = 0; i <= Math.min(5, player.maxHp); i++) { - list.push(get.cnNumber(i) + "张"); - } - list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", get.prompt("xingchong")) - .set("prompt2", "请首先选择摸牌的张数") - .set("ai", function () { - var player = _status.event.player, - num1 = player.maxHp, - num2 = player.countCards("h"); - if (num1 <= num2) return 0; - return Math.ceil((num1 - num2) / 2); - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("xingchong"); - var num2 = result.index; - if (num2 > 0) player.draw(num2); - var num = Math.min(5, player.maxHp) - num2; - if (num == 0) event.finish(); - else event.num = num; - } else event.finish(); - "step 2"; - if (player.countCards("h") > 0) { - player - .chooseCard( - "h", - [1, Math.min(player.countCards("h"), event.num)], - "请选择要展示的牌" - ) - .set("ai", () => 1 + Math.random()); - } else event.finish(); - "step 3"; - if (result.bool) { - var cards = result.cards; - player.showCards(cards, get.translation(player) + "发动了【幸宠】"); - player.addGaintag(cards, "xingchong"); - player.addTempSkill("xingchong_effect", "roundStart"); - } - }, - subSkill: { - effect: { - audio: "xingchong", - trigger: { - player: ["loseAfter"], - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter: function (event, player) { - var evt = event.getl(player); - if (!evt || !evt.cards2 || !evt.cards2.length) return false; - if (event.name == "lose") { - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("xingchong")) return true; - } - return false; - } - return player.hasHistory("lose", function (evt) { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("xingchong")) return true; - } - return false; - }); - }, - forced: true, - popup: false, - charlotte: true, - onremove: function (player) { - player.removeGaintag("xingchong"); - }, - content: function () { - "step 0"; - if (trigger.delay === false) game.delayx(); - "step 1"; - player.logSkill("xingchong_effect"); - var num = 0; - if (trigger.name == "lose") { - for (var i in trigger.gaintag_map) { - if (trigger.gaintag_map[i].includes("xingchong")) num++; - } - } else - player.getHistory("lose", function (evt) { - if (trigger != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("xingchong")) num++; - } - }); - player.draw(2 * num); - }, - }, - }, - }, - liunian: { - audio: 2, - trigger: { global: "phaseEnd" }, - forced: true, - filter: function (event, player) { - return game.hasGlobalHistory("cardMove", function (evt) { - return evt.washCard && (evt.shuffleNumber == 1 || evt.shuffleNumber == 2); - }); - }, - content: function () { - "step 0"; - if ( - game.hasGlobalHistory("cardMove", function (evt) { - return evt.washCard && evt.shuffleNumber == 1; - }) - ) { - player.gainMaxHp(); - game.delayx(); - } - "step 1"; - if ( - game.hasGlobalHistory("cardMove", function (evt) { - return evt.washCard && evt.shuffleNumber == 2; - }) - ) { - player.recover(); - game.delayx(); - } else event.finish(); - "step 2"; - player.addSkill("liunian_effect"); - player.addMark("liunian_effect", 10, false); - }, - subSkill: { - effect: { - charlotte: true, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("liunian_effect"); - }, - }, - marktext: "年", - intro: { - content: "手牌上限+#", - }, - }, - }, - }, - //黄承彦 - dcjiezhen: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player; - }, - content: function () { - var skills = target.getSkills(null, false, false).filter(function (i) { - if (i == "bazhen") return; - var info = get.info(i); - return ( - info && - !get.is.locked(i) && - !info.limited && - !info.juexingji && - !info.zhuSkill && - !info.charlotte - ); - }); - target.addAdditionalSkills("dcjiezhen_blocker", "bazhen"); - target.addSkill("dcjiezhen_blocker"); - target.markAuto("dcjiezhen_blocker", skills); - player.addSkill("dcjiezhen_clear"); - player.markAuto("dcjiezhen_clear", [target]); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - var skills = target.getSkills(null, false, false).filter(function (i) { - if (i == "bazhen") return; - var info = get.info(i); - return ( - info && - !get.is.locked(i) && - !info.limited && - !info.juexingji && - !info.zhuSkill && - !info.charlotte - ); - }); - if (!skills.length && target.hasEmptySlot(2)) return 1; - return -0.5 * skills.length; - }, - }, - }, - subSkill: { - blocker: { - init: function (player, skill) { - player.addSkillBlocker(skill); - }, - onremove: function (player, skill) { - player.removeSkillBlocker(skill); - player.removeAdditionalSkill(skill); - delete player.storage.dcjiezhen_blocker; - }, - charlotte: true, - locked: true, - skillBlocker: function (skill, player) { - return ( - skill != "bazhen" && - skill != "dcjiezhen_blocker" && - !lib.skill[skill].charlotte && - player.getStorage("dcjiezhen_blocker").includes(skill) - ); - }, - mark: true, - marktext: "阵", - intro: { - markcount: () => 0, - content: function (storage, player, skill) { - if (storage.length) return "失效技能:" + get.translation(storage); - return "无失效技能"; - }, - }, - }, - clear: { - audio: "dcjiezhen", - charlotte: true, - trigger: { - global: ["judgeAfter", "die"], - player: "phaseBegin", - }, - forced: true, - forceDie: true, - onremove: true, - filter: function (event, player) { - if (event.name == "die") { - return ( - player == event.player || - player.getStorage("dcjiezhen_clear").includes(event.player) - ); - } else if (event.name == "judge") { - return ( - event.skill == "bagua" && - player.getStorage("dcjiezhen_clear").includes(event.player) - ); - } - return player.getStorage("dcjiezhen_clear").length > 0; - }, - logTarget: function (event, player) { - if (event.name != "phase") return event.player; - return player.getStorage("dcjiezhen_clear"); - }, - content: function () { - "step 0"; - var targets = player.getStorage("dcjiezhen_clear"); - if (trigger.name == "die" && player == trigger.player) { - for (var target of targets) { - target.removeSkill("dcjiezhen_blocker"); - } - player.removeSkill("dcjiezhen_clear"); - event.finish(); - return; - } - if (trigger.name == "phase") event.targets = targets.slice(0).sortBySeat(); - else event.targets = [trigger.player]; - "step 1"; - var target = targets.shift(); - var storage = player.getStorage("dcjiezhen_clear"); - if (storage.includes(target)) { - storage.remove(target); - target.removeSkill("dcjiezhen_blocker"); - if (target.isIn() && target.countGainableCards(player, "hej") > 0) - player.gainPlayerCard(target, "hej", true); - } - if (targets.length > 0) { - event.redo(); - } else { - player.removeSkill("dcjiezhen_clear"); - } - }, - }, - }, - derivation: "bazhen", - }, - dczecai: { - audio: 2, - trigger: { global: "roundStart" }, - limited: true, - skillAnimation: true, - direct: true, - animationColor: "soil", - filter: function (event, player) { - return game.roundNumber > 1; - }, - getMax: function () { - var getNum = function (current) { - var history = current.actionHistory; - var num = 0; - for (var i = history.length - 2; i >= 0; i--) { - for (var j = 0; j < history[i].useCard.length; j++) { - if (get.type2(history[i].useCard[j].card, false) == "trick") num++; - } - if (history[i].isRound) break; - } - return num; - }; - var max = 0, - current = false, - targets = game.filterPlayer(); - for (var target of targets) { - var num = getNum(target); - if (num > max) { - max = num; - current = target; - } else if (num == max) current = false; - } - return current; - }, - content: function () { - "step 0"; - event.target = lib.skill.dczecai.getMax(); - var str = "令一名其他角色于本轮内获得〖集智〗"; - if (event.target && event.target != player) - str += - ";若选择的目标为" + get.translation(event.target) + ",则其获得一个额外的回合"; - player - .chooseTarget(lib.filter.notMe, get.prompt("dczecai"), str) - .set("maximum", event.target) - .set("ai", function (target) { - if (target != _status.event.maximum) return 0; - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - player.awakenSkill("dczecai"); - var target = result.targets[0]; - player.logSkill("dczecai", target); - target.addAdditionalSkills("dczecai_effect", "rejizhi"); - target.addTempSkill("dczecai_effect", "roundStart"); - if (target == event.target) { - var evt = trigger; - target.insertPhase(); - if (evt.player != target && !evt._finished) { - evt.finish(); - evt._triggered = 5; - var evtx = evt.player.insertPhase(); - delete evtx.skill; - } - } - } - }, - derivation: "rejizhi", - subSkill: { - effect: { - charlotte: true, - mark: true, - marktext: "才", - intro: { content: "已拥有技能〖集智〗" }, - }, - }, - }, - dcyinshi: { - audio: 2, - trigger: { player: "damageBegin" }, - usable: 1, - filter: function (event, player) { - return !event.card || get.color(event.card) == "none"; - }, - forced: true, - content: function () { - trigger.cancel(); - }, - group: "dcyinshi_gain", - subSkill: { - gain: { - audio: "dcyinshi", - trigger: { global: "judgeEnd" }, - forced: true, - filter: function (event, player) { - return ( - event.skill == "bagua" && - event.result.card && - get.position(event.result.card, true) == "o" - ); - }, - content: function () { - player.gain(trigger.result.card, "gain2"); - }, - }, - }, - }, - //高览 - xizhen: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return ( - current != player && - (player.canUse("sha", current, false) || player.canUse("juedou", current, false)) - ); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("xizhen"), - "视为对一名角色使用【杀】或【决斗】", - function (card, player, target) { - return ( - target != player && - (player.canUse("sha", target, false) || - player.canUse("juedou", target, false)) - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - var eff1 = 0, - eff2 = 0; - if (player.canUse("sha", target, false)) - eff1 = get.effect(target, { name: "sha" }, player, player); - if (player.canUse("juedou", target, false)) - eff2 = get.effect(target, { name: "juedou" }, player, player); - var effx = Math.max(eff1, eff2); - if (effx <= 0) return 0; - if (target.isHealthy()) effx *= 3; - if (get.attitude(player, target) > 0) effx *= 1.6; - return effx; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("xizhen", target); - var list = []; - if (player.canUse("sha", target, false)) list.push("sha"); - if (player.canUse("juedou", target, false)) list.push("juedou"); - if (list.length == 1) event._result = { control: list[0] }; - else - player - .chooseControl(list) - .set("prompt", "视为对" + get.translation(target) + "使用…") - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().target; - var eff1 = get.effect(target, { name: "sha" }, player, player), - eff2 = get.effect(target, { name: "juedou" }, player, player); - return eff1 > eff2 ? 0 : 1; - }); - } else event.finish(); - "step 2"; - player.useCard({ name: result.control, isCard: true }, target, false); - "step 3"; - if (target.isIn()) { - player.storage.xizhen_effect = target; - player.addTempSkill("xizhen_effect", "phaseUseAfter"); - } - }, - subSkill: { - effect: { - audio: "xizhen", - charlotte: true, - onremove: true, - trigger: { global: ["useCard", "respond"] }, - logTarget: function (event, player) { - return player.storage.xizhen_effect; - }, - forced: true, - filter: function (event, player) { - return ( - Array.isArray(event.respondTo) && - event.respondTo[0] == player && - player.storage.xizhen_effect && - player.storage.xizhen_effect.isIn() - ); - }, - content: function () { - "step 0"; - var target = player.storage.xizhen_effect; - event.target = target; - target.recover(); - "step 1"; - player.draw(target.isHealthy() ? 2 : 1); - }, - mark: "character", - intro: { content: "已指定$为目标" }, - }, - }, - }, - //管宁 - dunshi: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - usable: 1, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = [["sha", "shan", "tao", "jiu"], 0]; - }, - hiddenCard: function (player, name) { - if ( - player.storage.dunshi && - player.storage.dunshi[0].includes(name) && - !player.getStat("skill").dunshi - ) - return true; - return false; - }, - marktext: "席", - mark: true, - intro: { - markcount: function (storage) { - return storage[1]; - }, - content: function (storage, player) { - if (!storage) return; - var str = "
  • "; - if (!storage[0].length) { - str += "已无可用牌"; - } else { - str += "剩余可用牌:"; - str += get.translation(storage[0]); - } - str += "
  • “席”标记数量:"; - str += storage[1]; - return str; - }, - }, - filter: function (event, player) { - if (event.type == "wuxie") return false; - var storage = player.storage.dunshi; - if (!storage || !storage[0].length) return false; - for (var i of storage[0]) { - var card = { name: i, isCard: true }; - if (event.filterCard(card, player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - var storage = player.storage.dunshi; - for (var i of storage[0]) list.push(["基本", "", i]); - return ui.create.dialog("遁世", [list, "vcard"], "hidden"); - }, - filter: function (button, player) { - var evt = _status.event.getParent(); - return evt.filterCard({ name: button.link[2], isCard: true }, player, evt); - }, - check: function (button) { - var card = { name: button.link[2] }, - player = _status.event.player; - if (_status.event.getParent().type != "phase") return 1; - if (card.name == "jiu") return 0; - if (card.name == "sha" && player.hasSkill("jiu")) return 0; - return player.getUseValue(card, null, true); - }, - backup: function (links, player) { - return { - audio: "dunshi", - filterCard: function () { - return false; - }, - popname: true, - viewAs: { - name: links[0][2], - isCard: true, - }, - selectCard: -1, - precontent: function () { - player.addTempSkill("dunshi_damage"); - player.storage.dunshi_damage = event.result.card.name; - }, - }; - }, - prompt: function (links, player) { - return "选择【" + get.translation(links[0][2]) + "】的目标"; - }, - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - var storage = player.storage.dunshi; - if (!storage || !storage[0].length) return false; - if (player.getStat("skill").dunshi) return false; - switch (tag) { - case "respondSha": - return ( - (_status.event.type != "phase" || - player == game.me || - player.isUnderControl() || - player.isOnline()) && - storage[0].includes("sha") - ); - case "respondShan": - return storage[0].includes("shan"); - case "save": - if (arg == player && storage[0].includes("jiu")) return true; - return storage[0].includes("tao"); - } - }, - order: 2, - result: { - player: function (player) { - if (_status.event.type == "dying") { - return get.attitude(player, _status.event.dying); - } - return 1; - }, - }, - }, - initList: function () { - var list, - skills = []; - var banned = ["xunyi", "mbyilie"]; - if (get.mode() == "guozhan") { - list = []; - for (var i in lib.characterPack.mode_guozhan) list.push(i); - } else if (_status.connectMode) list = get.charactersOL(); - else { - list = []; - for (var i in lib.character) { - if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue; - list.push(i); - } - } - for (var i of list) { - if (i.indexOf("gz_jun") == 0) continue; - for (var j of lib.character[i][3]) { - var skill = lib.skill[j]; - if (!skill || skill.zhuSkill || banned.includes(j)) continue; - if (skill.ai && (skill.ai.combo || skill.ai.notemp || skill.ai.neg)) continue; - var info = get.translation(j); - for (var ix = 0; ix < info.length; ix++) { - if (/仁|义|礼|智|信/.test(info[ix]) == true) { - skills.add(j); - break; - } - } - } - } - _status.dunshi_list = skills; - }, - subSkill: { - backup: { audio: "dunshi" }, - damage: { - audio: "dunshi", - trigger: { global: "damageBegin2" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return event.source == _status.currentPhase; - }, - onremove: true, - logTarget: "source", - content: function () { - "step 0"; - event.cardname = player.storage.dunshi_damage; - player.removeSkill("dunshi_damage"); - event.target = trigger.source; - var card = get.translation(trigger.source), - card2 = get.translation(event.cardname), - card3 = get.translation(trigger.player); - var list = [ - "防止即将对" + - card3 + - "造成的伤害,并令" + - card + - "获得一个技能名中包含“仁/义/礼/智/信”的技能", - "从〖遁世〗中删除【" + card2 + "】并获得一枚“席”", - "减1点体力上限,然后摸等同于“席”数的牌", - ]; - var next = player.chooseButton([ - "遁世:请选择两项", - [ - list.map((item, i) => { - return [i, item]; - }), - "textbutton", - ], - ]); - next.set("forced", true); - next.set("selectButton", 2); - next.set("ai", function (button) { - var player = _status.event.player; - switch (button.link) { - case 0: - if (get.attitude(player, _status.currentPhase) > 0) return 3; - return 0; - case 1: - return 1; - case 2: - var num = player.storage.dunshi[1]; - for (var i of ui.selected.buttons) { - if (i.link == 1) num++; - } - if (num > 0 && player.isDamaged()) return 2; - return 0; - } - }); - "step 1"; - event.links = result.links.sort(); - for (var i of event.links) { - game.log( - player, - "选择了", - "#g【遁世】", - "的", - "#y选项" + get.cnNumber(i + 1, true) - ); - } - if (event.links.includes(0)) { - trigger.cancel(); - if (!_status.dunshi_list) lib.skill.dunshi.initList(); - var list = _status.dunshi_list - .filter(function (i) { - return !target.hasSkill(i, null, null, false); - }) - .randomGets(3); - if (list.length == 0) event.goto(3); - else { - event.videoId = lib.status.videoId++; - var func = function (skills, id, target) { - var dialog = ui.create.dialog("forcebutton"); - dialog.videoId = id; - dialog.add("令" + get.translation(target) + "获得一个技能"); - for (var i = 0; i < skills.length; i++) { - dialog.add( - '" - ); - } - dialog.addText("
    "); - }; - if (player.isOnline()) player.send(func, list, event.videoId, target); - else if (player == game.me) func(list, event.videoId, target); - player.chooseControl(list).set("ai", function () { - var controls = _status.event.controls; - if (controls.includes("cslilu")) return "cslilu"; - return controls[0]; - }); - } - } else event.goto(3); - "step 2"; - game.broadcastAll("closeDialog", event.videoId); - target.addSkills(result.control); - "step 3"; - var storage = player.storage.dunshi; - if (event.links.includes(1)) { - storage[0].remove(event.cardname); - storage[1]++; - player.markSkill("dunshi"); - } - if (event.links.includes(2)) { - player.loseMaxHp(); - if (storage[1] > 0) player.draw(storage[1]); - } - }, - }, - }, - }, - //吉本 - xunli: { - audio: 2, - trigger: { - global: ["loseAfter", "loseAsyncAfter"], - }, - forced: true, - filter: function (event, player) { - if ( - event.type != "discard" || - event.getlx === false || - player.getExpansions("xunli").length >= 9 - ) - return false; - for (var i of event.cards) { - if ( - get.position(i, true) == "d" && - get.color(i, event.cards2 && event.cards2.includes(i) ? event.player : false) == - "black" - ) - return true; - } - return false; - }, - content: function () { - "step 0"; - var num = 9 - player.getExpansions("xunli").length; - var cards = []; - for (var i of trigger.cards) { - if ( - get.position(i, true) == "d" && - get.color( - i, - trigger.cards2 && trigger.cards2.includes(i) ? trigger.player : false - ) == "black" - ) - cards.push(i); - } - if (cards.length <= num) - event._result = { - bool: true, - links: cards, - }; - else - player - .chooseButton(true, num, [ - "寻疠:将" + get.cnNumber(num) + "张牌置于武将牌上", - cards, - ]) - .set("forceAuto", true) - .set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - "step 1"; - if (result.bool) { - player.addToExpansion("gain2", result.links).gaintag.add("xunli"); - } - }, - marktext: "疠", - intro: { - content: "expansion", - markcount: "expansion", - }, - group: "xunli_exchange", - subSkill: { - exchange: { - audio: "xunli", - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return ( - player.getExpansions("xunli").length > 0 && - player.hasCard((card) => get.color(card, player) == "black", "h") - ); - }, - content: function () { - "step 0"; - var cards = player.getExpansions("xunli"); - if (!cards.length || !player.countCards("h")) { - event.finish(); - return; - } - var next = player.chooseToMove("寻疠:是否交换“疠”和手牌?"); - next.set("list", [ - [get.translation(player) + "(你)的疠", cards], - [ - "手牌区", - player.getCards("h", (card) => get.color(card, player) == "black"), - ], - ]); - next.set("filterMove", function (from, to) { - return typeof to != "number"; - }); - next.set("processAI", function (list) { - var player = _status.event.player; - var getv = function (card) { - if (get.info(card).toself) return 0; - return player.getUseValue(card, false); - }; - var cards = list[0][1].concat(list[1][1]).sort(function (a, b) { - return getv(b) - getv(a); - }), - cards2 = cards.splice(0, player.getExpansions("xunli").length); - return [cards2, cards]; - }); - "step 1"; - if (result.bool) { - var pushs = result.moved[0], - gains = result.moved[1]; - pushs.removeArray(player.getExpansions("xunli")); - gains.removeArray(player.getCards("h")); - if (!pushs.length || pushs.length != gains.length) return; - player.logSkill("xunli_exchange"); - player.addToExpansion(pushs, player, "giveAuto").gaintag.add("xunli"); - game.log(player, "将", pushs, "作为“疠”置于武将牌上"); - player.gain(gains, "gain2"); - } - }, - }, - }, - }, - zhishi: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("zhishi")).set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att <= 4) return 0; - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("zhishi", target); - player.storage.zhishi_mark = target; - player.addTempSkill("zhishi_mark", { player: "phaseBegin" }); - } - }, - ai: { - combo: "xunli", - expose: 0.3 - }, - subSkill: { - mark: { - trigger: { - global: ["dying", "useCardToTargeted"], - }, - direct: true, - charlotte: true, - filter: function (event, player) { - if (!player.getExpansions("xunli").length) return false; - var target = player.storage.zhishi_mark; - if (event.name == "dying") return event.player == target; - return event.card.name == "sha" && event.target == target; - }, - content: function () { - "step 0"; - var target = player.storage.zhishi_mark; - event.target = target; - player - .chooseButton( - [ - get.prompt("zhishi", target), - '
    弃置任意张“疠”并令其摸等量的牌
    ', - player.getExpansions("xunli"), - ], - [1, Infinity] - ) - .set("ai", function (button) { - var player = _status.event.player, - target = player.storage.zhishi_mark; - if (target.hp < 1 && target != get.zhu(player)) return 0; - if (target.hasSkillTag("nogain")) return 0; - return 3 - player.getUseValue(card, false); - }); - "step 1"; - if (result.bool) { - player.logSkill("zhishi", target); - player.loseToDiscardpile(result.links); - target.draw(result.links.length); - } - }, - mark: "character", - intro: { - content: "决定帮助$,具体帮不帮另说", - }, - }, - }, - }, - lieyi: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.getExpansions("xunli").length > 0; - }, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - var cards = player.getExpansions("xunli"); - var cards2 = cards.filter(function (card) { - return target.isIn() && player.canUse(card, target, false); - }); - if (cards2.length) { - player - .chooseButton(["对" + get.translation(target) + "使用一张牌", cards2], true) - .set("ai", function (button) { - return get.order(button.link); - }); - } else { - event.finish(); - if (cards.length) player.loseToDiscardpile(cards); - if ( - target.isIn() && - !target.hasHistory("damage", function (evt) { - return evt.getParent("lieyi") == event && evt._dyinged; - }) - ) - player.loseHp(); - } - "step 1"; - player.useCard(result.links[0], target, false); - event.goto(0); - }, - ai: { - order: 2, - result: { - target: function (player, target) { - var cards = player.getExpansions("xunli"); - var effect = 0, - damage = 0; - for (var i of cards) { - if (player.canUse(i, target, false)) { - effect += get.effect(target, i, player, target); - damage += get.tag(i, "damage"); - } - } - if (damage >= target.hp) return effect; - if (player.hp > 2 && cards.length > 3) return effect / 3; - return 0; - }, - }, - combo: "xunli" - }, - }, - //马日磾 - bingjie: { - trigger: { player: "phaseUseBegin" }, - check: function (event, player) { - return ( - player.maxHp > 3 && - player.isDamaged() && - player.hasCard(function (card) { - return ( - game.hasPlayer(function (current) { - return ( - current != player && - get.attitude(player, current) < 0 && - player.canUse(card, current, null, true) && - get.effect(current, card, player, player) > 0 - ); - }) && player.hasValueTarget(card) - ); - }, "hs") - ); - }, - content: function () { - "step 0"; - player.loseMaxHp(); - "step 1"; - player.addTempSkill("bingjie_effect"); - game.delayx(); - }, - subSkill: { - effect: { - audio: "bingjie", - trigger: { player: "useCardToPlayered" }, - forced: true, - charlotte: true, - logTarget: "target", - filter: function (event, player) { - return ( - event.target != player && - (event.card.name == "sha" || get.type(event.card, false) == "trick") && - event.target.countCards("he") > 0 - ); - }, - content: function () { - "step 0"; - trigger.target.chooseToDiscard("he", true); - "step 1"; - if ( - result.bool && - result.cards.length && - get.color(result.cards[0], trigger.target) == get.color(trigger.card) - ) { - game.log(trigger.target, "不能响应", trigger.card); - trigger.directHit.push(trigger.target); - } - }, - ai: { - effect: { - player: function (card, player, target) { - if ( - player !== target && - get.itemtype(target) === "player" && - (card.name === "sha" || get.type(card, false) === "trick") && - target.countCards("he") && - !target.hasSkillTag("noh") - ) - return [1, 0, 1, -1]; - }, - }, - }, - }, - }, - }, - zhengding: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - forced: true, - filter: function (event, player) { - if (player == _status.currentPhase) return false; - if (!Array.isArray(event.respondTo)) return false; - if (player == event.respondTo[0]) return false; - var color = get.color(event.card); - if (color == "none") return false; - return color == get.color(event.respondTo[1]); - }, - content: function () { - player.gainMaxHp(); - player.recover(); - }, - }, - //孙茹 - xiecui: { - audio: 2, - trigger: { global: "damageBegin1" }, - filter: function (event, player) { - var source = event.source; - if (!source || source != _status.currentPhase || event.getParent().type != "card") - return false; - return !source.hasHistory("sourceDamage", function (evt) { - return evt.getParent().type == "card"; - }); - }, - logTarget: "source", - prompt2: function (event, player) { - var str = "令" + get.translation(event.player) + "即将受到的"; - str += "" + event.num + "点"; - if (event.hasNature("linked")) { - str += get.translation(event.nature) + "属性"; - } - str += "伤害+1"; - if (event.source.group == "wu") { - var cards = event.cards.filterInD(); - if (cards.length) { - str += - ";然后" + - get.translation(event.source) + - "获得" + - get.translation(cards) + - ",且本回合的手牌上限+1"; - } - } - return str; - }, - check: function (event, player) { - var att = get.attitude(player, event.player); - if (att < 0) { - if (event.source.group != "wu" || !event.cards.filterInD().length) return true; - return get.attitude(player, event.source) > 0; - } - return false; - }, - content: function () { - trigger.num++; - var source = trigger.source; - if (source.group == "wu") { - var cards = trigger.cards.filterInD(); - if (cards.length > 0) { - source.gain(cards, "gain2"); - source.addMark("xiecui_effect", 1, false); - source.addTempSkill("xiecui_effect"); - } - } - }, - subSkill: { - effect: { - charlotte: true, - mod: { - maxHandcard: (player, num) => num + player.countMark("xiecui_effect"), - }, - marktext: "翠", - onremove: true, - intro: { content: "手牌上限+#" }, - }, - }, - ai: { threaten: 1.75 }, - }, - youxu: { - audio: 2, - trigger: { global: "phaseEnd" }, - logTarget: "player", - filter: function (event, player) { - return event.player.countCards("h") > event.player.hp; - }, - check: function (event, player) { - if (get.attitude(player, event.player) <= 0) return true; - else - return game.hasPlayer(function (current) { - return ( - current != event.player && - current.isDamaged() && - current.isMinHp() && - get.attitude(player, current) > 0 && - get.recoverEffect(current, player, player) > 0 - ); - }); - }, - content: function () { - "step 0"; - if (player == trigger.player) { - player.chooseCard("h", true, "请展示一张手牌"); - } else { - player.choosePlayerCard(trigger.player, true, "h"); - } - "step 1"; - if (result.bool) { - var card = result.cards[0]; - event.card = card; - var str = get.translation(player); - if (player != trigger.player) str += "对" + get.translation(trigger.player); - str += "发动了【忧恤】"; - player.showCards(card, str); - player - .chooseTarget( - "令一名角色获得" + get.translation(card), - "若其体力值为全场最少,则其回复1点体力", - function (card, player, target) { - return target != _status.event.getTrigger().player; - } - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att < 0) return 0; - if ( - target.isDamaged() && - target.isMinHp && - get.recoverEffect(target, player, player) > 0 - ) - return 4 * att; - return att; - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - target.gain(card, trigger.player, "give").giver = player; - } else event.finish(); - "step 3"; - if (target.isMinHp()) target.recover(); - }, - }, - //夏侯令女 - fuping: { - audio: 2, - hiddenCard: function (player, name) { - var list = player.getStorage("fuping").slice(0); - list.removeArray(player.getStorage("fuping_round")); - return list.includes(name) && player.hasCard((card) => get.type(card) != "basic", "ehs"); - }, - enable: "chooseToUse", - locked: false, - filter: function (event, player) { - var list = player.getStorage("fuping").slice(0); - list.removeArray(player.getStorage("fuping_round")); - if (!list.length) return false; - if (!player.hasCard((card) => get.type(card) != "basic", "ehs")) return false; - for (var i of list) { - var type = get.type2(i, false); - 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 = player.getStorage("fuping").slice(0); - list.removeArray(player.getStorage("fuping_round")); - var list2 = []; - for (var i of list) { - var type = get.type2(i, false); - if ( - (type == "basic" || type == "trick") && - event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) - ) - list2.push([type, "", i]); - } - return ui.create.dialog("浮萍", [list2, "vcard"]); - }, - check: function (button) { - if (_status.event.getParent().type != "phase") return 1; - return _status.event.player.getUseValue({ name: button.link[2] }, null, true); - }, - backup: function (links, player) { - return { - audio: "fuping", - filterCard: (card) => get.type(card) != "basic", - position: "he", - popname: true, - viewAs: { - name: links[0][2], - }, - check: function (card) { - return 8 - get.value(card); - }, - precontent: function () { - player.addTempSkill("fuping_round"); - player.markAuto("fuping_round", [event.result.card.name]); - }, - }; - }, - prompt: function (links, player) { - return "将一张非基本牌当做【" + get.translation(links[0][2]) + "】使用"; - }, - }, - ai: { - order: 8, - result: { player: 1 }, - respondSha: true, - skillTagFilter: function (player) { - var list = player.getStorage("fuping").slice(0); - list.removeArray(player.getStorage("fuping_round")); - return list.includes("sha"); - }, - }, - mod: { - targetInRange: function (card, player, target) { - if (!player.hasEnabledSlot()) return true; - }, - }, - marktext: "萍", - intro: { content: "已记录$" }, - group: "fuping_mark", - subSkill: { - mark: { - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return ( - player != event.player && - event.targets.includes(player) && - player.hasEnabledSlot() && - !player.getStorage("fuping").includes(event.card.name) - ); - }, - logTarget: "player", - prompt2: (event) => - "废除一个装备栏并记录【" + get.translation(event.card.name) + "】", - check: function (event, player) { - var list = [ - "tao", - "juedou", - "guohe", - "shunshou", - "wuzhong", - "xietianzi", - "yuanjiao", - "wanjian", - "nanman", - "huoshaolianying", - "chuqibuyi", - "zhujinqiyuan", - "lebu", - "bingliang", - ]; - if (!list.includes(event.card.name)) return false; - if ( - ["nanman", "wanjian"].includes(event.card.name) && - !player.hasValueTarget({ name: event.card.name }) - ) - return false; - var list = [3, 5, 4, 1, 2]; - for (var i of list) { - if (player.hasEnabledSlot(i)) { - var card = player.getEquip(i); - if (!card || player.hasEmptySlot(i)) return true; - if (get.value(card, player) <= 0) return true; - } - } - return false; - }, - content: function () { - player.markAuto("fuping", [trigger.card.name]); - game.log(player, "记录了", "#y" + get.translation(trigger.card.name)); - player.chooseToDisable().set("ai", function (event, player, list) { - var list = [3, 5, 4, 1, 2]; - for (var i of list) { - if (player.hasEnabledSlot(i)) { - var card = player.getEquip(i); - if (!card || player.hasEmptySlot(i)) return "equip" + i; - if (get.value(card, player) <= 0) return "equip" + i; - } - } - return list.randomGet(); - }); - }, - }, - backup: { audio: "fuping" }, - round: { charlotte: true, onremove: true }, - }, - }, - weilie: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return ( - player.countMark("weilie") <= player.getStorage("fuping").length && - player.countCards("he") > 0 && - game.hasPlayer((current) => current.isDamaged()) - ); - }, - filterCard: true, - position: "he", - filterTarget: (card, player, target) => target.isDamaged(), - check: function (card) { - return 8 - get.value(card); - }, - content: function () { - "step 0"; - player.addMark("weilie", 1, false); - target.recover(); - "step 1"; - if (target.isDamaged()) target.draw(); - }, - onremove: true, - ai: { - order: 1, - result: { - player: function (player, target) { - var eff = get.recoverEffect(target, player, player); - if (target.getDamagedHp() > 1) - eff += get.effect(target, { name: "draw" }, player, player); - return eff; - }, - }, - }, - }, - //张瑶 - //Partly powered by 烟雨墨染 - yuanyu: { - audio: 2, - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - player.draw(); - "step 1"; - if (player.countCards("h") > 0 && game.hasPlayer((current) => current != player)) { - var suits = lib.suit.slice(0), - cards = player.getExpansions("yuanyu"); - for (var i of cards) suits.remove(get.suit(i, false)); - var str = - "选择一张手牌,作为“怨”置于武将牌上;同时选择一名其他角色,令该角色获得〖怨语〗的后续效果。"; - if (suits.length) { - str += "目前“怨”中未包含的花色:"; - for (var i of suits) str += get.translation(i); - } - player.chooseCardTarget({ - filterCard: true, - filterTarget: lib.filter.notMe, - position: "h", - prompt: "怨语:选择置于武将牌上的牌和目标", - prompt2: str, - suits: suits, - forced: true, - ai1: function (card) { - var val = get.value(card), - evt = _status.event; - if (evt.suits.includes(get.suit(card, false))) return 8 - get.value(card); - return 5 - get.value(card); - }, - ai2: function (target) { - var player = _status.event.player; - if ( - player.storage.yuanyu_damage && - player.storage.yuanyu_damage.includes(target) - ) - return 0; - return -get.attitude(player, target); - }, - }); - } else event.finish(); - "step 2"; - var target = result.targets[0]; - player.addSkill("yuanyu_damage"); - player.markAuto("yuanyu_damage", result.targets); - player.line(target, "green"); - if (!target.storage.yuanyu_mark) { - target.storage.yuanyu_mark = player; - target.markSkillCharacter("yuanyu_mark", player, "怨语", "已获得〖怨语〗效果"); - target.addSkill("yuanyu_mark"); - } - player.addToExpansion(result.cards, player, "give").gaintag.add("yuanyu"); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - player.removeSkill("yuanyu_damage"); - }, - ai: { - order: 7, - result: { - player: 1, - }, - }, - subSkill: { - mark: { - mark: "character", - charlotte: true, - intro: { - content: "已获得〖怨语〗效果", - onunmark: true, - }, - }, - damage: { - trigger: { global: ["damageSource", "phaseDiscardBegin"] }, - forced: true, - charlotte: true, - onremove: function (player, skill) { - if (player.storage[skill]) { - for (var i of player.storage[skill]) { - if (i.storage.yuanyu_mark == player) i.unmarkSkill("yuanyu_mark"); - } - } - delete player.storage[skill]; - }, - filter: function (event, player) { - if (event.name == "damage") { - var source = event.source; - return ( - source && - player.getStorage("yuanyu_damage").includes(source) && - source.countCards("h") > 0 - ); - } else { - if (player == event.player) { - return player.getStorage("yuanyu_damage").some(function (target) { - return target.isIn() && target.countCards("h") > 0; - }); - } else if (player.getStorage("yuanyu_damage").includes(event.player)) { - return event.player.countCards("h") > 0; - } - return false; - } - }, - content: function () { - "step 0"; - if (trigger.name == "phaseDiscard") { - if (trigger.player == player) { - event.targets = player - .getStorage("yuanyu_damage") - .filter(function (target) { - return target.isIn() && target.countCards("h") > 0; - }) - .sortBySeat(); - } else event.targets = [trigger.player]; - } else event.targets = [trigger.source]; - "step 1"; - event.target = event.targets.shift(); - event.count = trigger.name == "damage" ? trigger.num : 1; - "step 2"; - event.count--; - var suits = lib.suit.slice(0), - cards = player.getExpansions("yuanyu"); - for (var i of cards) suits.remove(get.suit(i, false)); - var next = target.chooseCard( - "h", - true, - "将一张手牌置于" + get.translation(player) + "的武将牌上" - ); - next.set("suits", suits); - next.set("ai", function (card) { - var val = get.value(card), - evt = _status.event; - if (evt.suits.includes(get.suit(card, false))) return 5 - get.value(card); - return 8 - get.value(card); - }); - if (suits.length) { - var str = "目前未包含的花色:"; - for (var i of suits) str += get.translation(i); - next.set("prompt2", str); - } - "step 3"; - player.addToExpansion(result.cards, target, "give").gaintag.add("yuanyu"); - "step 4"; - if (!player.hasSkill("yuanyu_damage")) event.finish(); - else if (event.count > 0 && target.countCards("h") > 0) event.goto(2); - else if (event.targets.length > 0) event.goto(1); - }, - }, - }, - }, - xiyan: { - audio: 2, - trigger: { player: "addToExpansionAfter" }, - filter: function (event, player) { - if (!event.gaintag.includes("yuanyu")) return false; - var cards = player.getExpansions("yuanyu"); - if (cards.length < lib.suit.length) return false; - var suits = lib.suit.slice(0); - for (var i of cards) { - suits.remove(get.suit(i)); - if (!suits.length) return true; - } - return false; - }, - logTarget: () => _status.currentPhase, - prompt2: "获得所有“怨”", - check: () => true, - content: function () { - "step 0"; - player.removeSkill("yuanyu_damage"); - var cards = player.getExpansions("yuanyu"); - player.gain(cards, "gain2"); - "step 1"; - var target = _status.currentPhase; - if (player == target) { - player.addMark("xiyan_buff", 4, false); - player.addTempSkill("xiyan_buff"); - delete player.getStat("skill").yuanyu; - event.finish(); - } else { - player - .chooseBool( - "夕颜:是否令" + - get.translation(target) + - "本回合的手牌上限-4且不能使用基本牌?" - ) - .set("ai", function () { - return _status.event.bool; - }) - .set("bool", get.attitude(player, target) < 0); - } - "step 2"; - if (result.bool) { - var target = _status.currentPhase; - target.addMark("xiyan_debuff", 4, false); - target.addTempSkill("xiyan_debuff"); - } - }, - subSkill: { - buff: { - charlotte: true, - mark: true, - marktext: " + ", - intro: { - content: "本回合手牌上限+#且使用牌无次数限制", - }, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("xiyan_buff"); - }, - cardUsable: function (card, player) { - return Infinity; - }, - }, - sub: true, - }, - debuff: { - charlotte: true, - mark: true, - marktext: " - ", - intro: { - content: "本回合手牌上限-#且不能使用基本牌", - }, - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("xiyan_debuff"); - }, - cardEnabled: function (card) { - if (get.type(card) == "basic") return false; - }, - cardSavable: function (card) { - if (get.type(card) == "basic") return false; - }, - }, - sub: true, - }, - }, - ai: { - combo: "yuanyu", - }, - }, - //滕胤 - chenjian: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - prompt2: function (event, player) { - return ( - "亮出牌堆顶的" + - get.cnNumber(3 + player.countMark("chenjian")) + - "张牌,然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌" - ); - }, - content: function () { - "step 0"; - var cards = get.cards(3 + player.countMark("chenjian")); - event.cards = cards; - player.showCards(cards, get.translation(player) + "发动了【陈见】"); - "step 1"; - var list = []; - if ( - player.countCards("he", (i) => { - return lib.filter.cardDiscardable(i, player, "chenjian"); - }) - ) - list.push("选项一"); - if ( - event.cards.some((i) => { - return player.hasUseTarget(i); - }) - ) - list.push("选项二"); - if (list.length === 1) event._result = { control: list[0] }; - else if (list.length > 1) - player - .chooseControl(list) - .set("choiceList", [ - "弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌", - "使用" + get.translation(event.cards) + "中的一张牌", - ]) - .set("prompt", "陈见:请选择一项") - .set("ai", () => { - let player = _status.event.player, - cards = _status.event.getParent().cards; - if ( - cards.some((i) => { - return player.getUseValue(i) > 0; - }) - ) - return "选项二"; - return "选项一"; - }); - else event.finish(); - "step 2"; - event.goon = 0; - event.choosed = result.control; - if (result.control === "cancel2") event.finish(); - else if (result.control === "选项二") event.goto(6); - "step 3"; - if ( - player.countCards("he", (i) => { - return lib.filter.cardDiscardable(i, player, "chenjian"); - }) - ) - player - .chooseToDiscard("he", !event.goon) - .set("ai", function (card) { - let evt = _status.event.getParent(), - val = - event.goon && evt.player.countMark("chenjian") < 2 - ? 0 - : -get.value(card), - suit = get.suit(card); - for (let i of evt.cards) { - if (get.suit(i, false) == suit) val += get.value(i, "raw"); - } - return val; - }) - .set( - "prompt", - "陈见:" + - (event.goon ? "是否" : "请") + - "弃置一张牌,然后令一名角色获得" + - get.translation(event.cards) + - "中花色与之相同的牌" + - (event.goon ? "?" : "") - ); - else if (event.choosed === "选项一") event.goto(6); - else event.finish(); - "step 4"; - if (result.bool) { - event.goon++; - var suit = get.suit(result.cards[0], player); - var cards2 = event.cards.filter(function (i) { - return get.suit(i, false) == suit; - }); - if (cards2.length) { - event.cards2 = cards2; - player - .chooseTarget(true, "选择一名角色获得" + get.translation(cards2)) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 0) { - return att + Math.max(0, 5 - target.countCards("h")); - } - return att; - }); - } else if (event.choosed === "选项一") event.goto(6); - else event.goto(8); - } else event.finish(); - "step 5"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.gain(event.cards2, "gain2"); - event.cards.removeArray(event.cards2); - } - if (event.choosed === "选项二") event.goto(8); - "step 6"; - var cards2 = cards.filter(function (i) { - return player.hasUseTarget(i); - }); - if (cards2.length) - player - .chooseButton( - [ - "陈见:" + - (event.goon ? "是否" : "请") + - "使用其中一张牌" + - (event.goon ? "?" : ""), - cards2, - ], - !event.goon - ) - .set("ai", function (button) { - return player.getUseValue(button.link); - }); - else if (event.choosed === "选项二") event.goto(3); - else event.finish(); - "step 7"; - if (result.bool) { - player.chooseUseTarget(true, result.links[0], false); - event.cards.removeArray(result.links); - event.goon += 2; - if (event.choosed === "选项二") event.goto(3); - } else event.finish(); - "step 8"; - if (event.goon > 2) { - if (player.countMark("chenjian") < 2) player.addMark("chenjian", 1, false); - player.recast(player.getCards("h", lib.filter.cardRecastable)); - } - }, - marktext: "见", - intro: { content: "展示牌数量+#" }, - }, - xixiu: { - mod: { - canBeDiscarded: function (card, player, target) { - if (player != target && get.position(card) == "e" && target.countCards("e") == 1) - return false; - }, - }, - audio: 2, - trigger: { target: "useCardToTargeted" }, - forced: true, - filter: function (event, player) { - if (player == event.player || !player.countCards("e")) return false; - var suit = get.suit(event.card, false); - if (suit == "none") return false; - return player.hasCard(function (card) { - return get.suit(card, player) == suit; - }, "e"); - }, - content: function () { - player.draw(); - }, - ai: { - effect: { - target: function (card, player, target) { - if (typeof card == "object" && player != target) { - var suit = get.suit(card); - if (suit == "none") return; - if ( - player.hasCard(function (card) { - return get.suit(card, player) == suit; - }, "e") - ) - return [1, 0.08]; - } - }, - }, - }, - }, - //张嫙 - tongli: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - if (!event.isFirstTarget || (event.card.storage && event.card.storage.tongli)) - return false; - var type = get.type(event.card); - if (type != "basic" && type != "trick") return false; - var hs = player.getCards("h"); - if (!hs.length) return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - var num1 = player.getHistory("useCard", function (evtx) { - if (evtx.getParent("phaseUse") != evt) return false; - return !evtx.card.storage || !evtx.card.storage.tongli; - }).length; - if (hs.length < num1) return false; - var list = []; - for (var i of hs) list.add(get.suit(i, player)); - return list.length == num1; - }, - prompt2: function (event, player) { - var evt = event.getParent("phaseUse"); - var num = player.getHistory("useCard", function (evtx) { - if (evtx.getParent("phaseUse") != evt) return false; - return !evtx.card.storage || !evtx.card.storage.tongli; - }).length; - //var str='视为额外使用'+get.cnNumber(num)+'张' - var str = "额外结算" + get.cnNumber(num) + "次"; - if (event.card.name == "sha" && game.hasNature(event.card)) - str += get.translation(event.card.nature); - return str + "【" + get.translation(event.card.name) + "】"; - }, - check: function (event, player) { - return !get.tag(event.card, "norepeat"); - }, - content: function () { - //player.addTempSkill('tongli_effect'); - var evt = trigger.getParent("phaseUse"); - var num = player.getHistory("useCard", function (evtx) { - if (evtx.getParent("phaseUse") != evt) return false; - return true; - //return !evtx.card.storage||!evtx.card.storage.tongli; - }).length; - trigger.getParent().effectCount += num; - }, - /*subSkill:{ - effect:{ - trigger:{player:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.tongli_effect!=undefined; - }, - content:function(){ - 'step 0' - event.card=trigger.tongli_effect[0]; - event.count=trigger.tongli_effect[1]; - 'step 1' - event.count--; - for(var i of trigger.targets){ - if(!i.isIn()||!player.canUse(card,i,false)) return; - } - if(trigger.addedTarget&&!trigger.addedTarget.isIn()) return; - if(trigger.addedTargets&&trigger.addedTargets.length){ - for(var i of trigger.addedTargets){ - if(!i.isIn()) return; - } - } - var next=player.useCard(get.copy(card),trigger.targets,false); - if(trigger.addedTarget) next.addedTarget=trigger.addedTarget; - if(trigger.addedTargets&&trigger.addedTargets.length) next.addedTargets=trigger.addedTargets.slice(0); - if(event.count>0) event.redo(); - }, - }, - },*/ - }, - shezang: { - audio: 2, - round: 1, - trigger: { global: "dying" }, - frequent: true, - filter: function (event, player) { - return event.player == player || player == _status.currentPhase; - }, - content: function () { - var cards = []; - for (var i of lib.suit) { - var card = get.cardPile2(function (card) { - return get.suit(card, false) == i; - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - }, - }, - //王桃王悦 - huguan: { - audio: 2, - audioname: ["wangyue"], - init: function (player) { - game.addGlobalSkill("huguan_all"); - }, - trigger: { global: "useCard" }, - direct: true, - filter: function (event, player) { - if (get.color(event.card, false) != "red") return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != event.player) return false; - return ( - event.player - .getHistory("useCard", function (event) { - return event.getParent("phaseUse") == evt; - }) - .indexOf(event) == 0 - ); - }, - content: function () { - "step 0"; - player - .chooseControl(lib.suit, "cancel2") - .set("prompt", get.prompt("huguan", trigger.player)) - .set("prompt2", "令某种花色的手牌不计入其本回合的手牌上限") - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getTrigger().player, - att = get.attitude(player, target); - if (att <= 0) { - if ( - !player.hasSkill("yaopei") || - player.hasHistory("useSkill", function (evt) { - return evt.skill == "huguan" && evt.targets.includes(target); - }) || - target.needsToDiscard() - - target.needsToDiscard(-target.countCards("h") / 4) > - (att > -2 ? 1.6 : 1) - ) - return "cancel2"; - } - let list = lib.suit.slice(0); - if (att <= 0 && target.getStorage("huguan_add")) - for (let i of target.getStorage("huguan_add")) { - if (list.includes(i)) return i; - } - list.removeArray(target.getStorage("huguan_add")); - if (list.length) return list.randomGet(); - return "cancel2"; - }); - "step 1"; - if (result.control != "cancel2") { - var target = trigger.player; - player.logSkill("huguan", target); - game.log(player, "选择了", "#g" + get.translation(result.control), "花色"); - target.addTempSkill("huguan_add"); - target.markAuto("huguan_add", [result.control]); - } - }, - subSkill: { - add: { - charlotte: true, - onremove: true, - mod: { - ignoredHandcard: function (card, player) { - if (player.getStorage("huguan_add").includes(get.suit(card, player))) - return true; - }, - cardDiscardable: function (card, player, name) { - if ( - name == "phaseDiscard" && - player.getStorage("huguan_add").includes(get.suit(card, player)) - ) - return false; - }, - }, - intro: { content: "本回合$花色的牌不计入手牌上限" }, - }, - all: { - mod: { - aiValue: function (player, card, num) { - if ( - player && - player.storage.huguan_all > 0 && - get.itemtype(card) == "card" && - get.color(card, player) == "red" - ) - return num + player.storage.huguan_all; - }, - }, - trigger: { - player: ["phaseUseBegin", "useCard"], - }, - filter: function (event, player) { - if (event.name === "useCard") return player.storage.huguan_all; - return true; - }, - silent: true, - charlotte: true, - content: function () { - "step 0"; - if (trigger.name === "useCard") { - player.storage.huguan_all = 0; - event.finish(); - } - "step 1"; - let num = -157; - game.countPlayer(function (current) { - if (current.hasSkill("huguan")) - num = Math.max(num, get.attitude(_status.event.player, current)); - }, true); - if (num === -157) game.removeGlobalSkill("huguan_all"); - else if (num === 0) player.storage.huguan_all = 6; - else if (num > 0) player.storage.huguan_all = 9; - }, - }, - }, - }, - yaopei: { - audio: 2, - trigger: { global: "phaseDiscardEnd" }, - direct: true, - filter: function (event, player) { - if (player == event.player || !event.player.isIn()) return false; - if ( - !player.hasAllHistory("useSkill", function (evt) { - return evt.skill == "huguan" && evt.targets.includes(event.player); - }) - ) - return false; - var suits = []; - event.player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) { - for (var i of evt.cards2) - suits.add(get.suit(i, evt.hs.includes(i) ? evt.player : false)); - } - }); - if (suits.length >= lib.suit.length) return false; - if (_status.connectMode && player.countCards("h") > 0) return true; - return player.hasCard(function (card) { - return !suits.includes(get.suit(card)); - }, "he"); - }, - content: function () { - "step 0"; - var suits = []; - trigger.player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) { - for (var i of evt.cards2) - suits.add(get.suit(i, evt.hs.includes(i) ? evt.player : false)); - } - }); - player.chooseCardTarget({ - prompt: get.prompt("yaopei", trigger.player), - prompt2: - "操作提示:选择要弃置的牌,并选择执行摸牌选项的角色,另一名角色执行回复体力的选项。", - suits: suits, - position: "he", - filterCard: function (card, player) { - return ( - !_status.event.suits.includes(get.suit(card)) && - lib.filter.cardDiscardable(card, player, "yaopei") - ); - }, - filterTarget: function (card, player, target) { - return target == player || target == _status.event.getTrigger().player; - }, - ai1: function (card) { - let player = _status.event.player, - source = _status.event.getTrigger().player; - if ( - get.attitude(player, source) > 0 && - (get.recoverEffect(player, player, player) > 0 || - get.recoverEffect(source, player, player) > 0) - ) - return 12 - get.value(card); - return 8 - get.value(card); - }, - ai2: function (target) { - let player = _status.event.player, - source = _status.event.getTrigger().player; - let recoverer = player === target ? source : player; - if (recoverer.isHealthy()) return get.attitude(player, target); - let att = get.attitude(player, recoverer), - rec = get.recoverEffect(recoverer, player, player); - if (rec > 0) return Math.abs(att) + get.attitude(player, target); - return 0; - }, - }); - "step 1"; - if (result.bool) { - var target = trigger.player; - player.logSkill("yaopei", target); - player.discard(result.cards); - if (player == result.targets[0]) { - if ( - target.isDamaged() && - target.hp < player.hp && - (get.mode() != "identity" || player.identity != "nei") - ) - player.addExpose(0.15); - target.recover(); - player.draw(2); - } else { - if ( - (player.isHealthy() || player.hp > target.hp) && - (get.mode() != "identity" || player.identity != "nei") - ) - player.addExpose(0.15); - target.draw(2); - player.recover(); - } - } - }, - ai: { - combo: "huguan" - }, - }, - mingluan: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return ( - player != event.player && - event.player.isIn() && - player.hasSkill("mingluan_mark") && - player.countCards("he") > 0 - ); - }, - content: function () { - "step 0"; - let he = player.getCards("he"), - disval = 0, - dis = 0, - spare = 30, - use = true; - for (let i of he) { - let val = get.value(i, player); - if (val < 6 && get.position(i) == "h") { - dis++; - disval += val; - } else if (val < spare) spare = val; - } - if (!dis) { - dis = 1; - disval = spare; - spare = -1; - } - let draw = Math.min(trigger.player.countCards("h"), 5 + dis - player.countCards("h")); - if (6 * draw < disval) use = false; - player - .chooseToDiscard( - "he", - get.prompt("mingluan"), - "弃置任意张牌,并摸等同于" + - get.translation(trigger.player) + - "手牌数的牌(至多摸至五张)", - [1, Infinity] - ) - .set("ai", function (card) { - let val = get.value(card, player); - if (val < 0 && card.name !== "du") return 30; - if (!_status.event.use) return 0; - if (ui.selected.cards.length) { - if (get.position(card) !== "h") return 0; - return 6 - val; - } - if (_status.event.spare < 0 || get.position(card) === "h") return 30 - val; - return 0; - }) - .set("spare", spare) - .set("use", use).logSkill = ["mingluan", trigger.player]; - "step 1"; - if (result.bool) { - var num = trigger.player.countCards("h"), - num2 = 5 - player.countCards("h"); - if (num > 0 && num2 > 0) player.draw(Math.min(num, num2)); - } - }, - group: "mingluan_count", - subSkill: { - count: { - charlotte: true, - trigger: { global: "recoverEnd" }, - silent: true, - popup: false, - firstDo: true, - filter: function (event, player) { - var current = _status.currentPhase; - return current && current != player && !player.hasSkill("mingluan_mark"); - }, - content: function () { - player.addTempSkill("mingluan_mark"); - }, - }, - mark: { - charlotte: true, - }, - }, - }, - //赵嫣 - jinhui: { - audio: 2, - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - var cards = []; - while (cards.length < 3) { - var card = get.cardPile2(function (card) { - for (var i of cards) { - if (i.name == card.name) return false; - } - var info = get.info(card, false); - if (info.ai && info.ai.tag && info.ai.tag.damage) return false; - return ( - !info.notarget && - (info.toself || - info.singleCard || - !info.selectTarget || - info.selectTarget == 1) - ); - }); - if (card) cards.push(card); - else break; - } - if (!cards.length) event.finish(); - else { - player.showCards(cards, get.translation(player) + "发动了【锦绘】"); - event.cards = cards; - game.cardsGotoOrdering(cards); - if (game.hasPlayer((current) => current != player)) - player - .chooseTarget("选择【锦绘】的目标", true, lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player, - cards = _status.event.getParent().cards.slice(0); - var max_effect = 0, - max_effect_player = 0; - for (var i of cards) { - var targetx = lib.skill.jinhui.getUsableTarget(i, target, player); - if (targetx) { - var effect2 = get.effect(targetx, i, target, target); - var effect3 = get.effect(targetx, i, target, player); - if (effect2 > max_effect) { - max_effect = effect2; - max_effect_player = effect3; - } - } - } - return max_effect_player; - }); - else event.finish(); - } - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - var cards = cards.filter(function (card) { - return lib.skill.jinhui.getUsableTarget(card, target, player); - }); - if (cards.length) { - if (cards.length == 1) event._result = { bool: true, links: cards }; - else - target - .chooseButton(["选择按“锦绘”规则使用一张牌", cards], true) - .set("ai", function (button) { - var player = _status.event.player, - target = _status.event.getParent().player, - card = button.link; - var targetx = lib.skill.jinhui.getUsableTarget(card, player, target); - var effect = get.effect(targetx, card, player, player), - cards = _status.event.getParent().cards.slice(0); - var effect2 = 0, - effect3 = 0; - cards.remove(button.link); - for (var i of cards) { - var targetx = lib.skill.jinhui.getUsableTarget(i, target, player); - if (targetx) { - effect2 += get.effect(targetx, i, target, target); - effect3 += get.effect(targetx, i, target, player); - } - } - if (effect2 > 0) effect += effect3; - return effect; - }); - } else event.goto(3); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = result.links[0]; - event.cards.remove(card); - var targetx = lib.skill.jinhui.getUsableTarget(card, target, player); - target.useCard(card, targetx, false, "noai"); - } - "step 3"; - var cards = cards.filter(function (card) { - return lib.skill.jinhui.getUsableTarget(card, player, target); - }); - if (cards.length) { - player - .chooseButton(["是否按“锦绘”规则使用其中一张牌?", cards]) - .set("ai", function (button) { - var player = _status.event.player, - target = _status.event.getParent().target; - var card = button.link, - targetx = lib.skill.jinhui.getUsableTarget(card, player, target); - return get.effect(targetx, card, player, player); - }); - } else event.finish(); - "step 4"; - if (result.bool) { - var card = result.links[0]; - cards.remove(card); - var targetx = lib.skill.jinhui.getUsableTarget(card, player, target); - if (targetx) { - player.useCard(card, targetx, false, "noai"); - } - if (cards.length) event.goto(3); - } else event.finish(); - }, - getUsableTarget: function (card, player, target) { - var info = get.info(card, false); - if (info.toself) return player.canUse(card, player, false) ? player : false; - return target.isIn() && player.canUse(card, target, false) ? target : false; - }, - ai: { - order: 5, - result: { player: 1 }, - }, - }, - qingman: { - audio: 2, - trigger: { global: "phaseEnd" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - if (!event.player.isIn()) return false; - var num = player.countCards("h"); - if (num >= 5) return false; - var num2 = 0; - for (var i = 1; i <= 5; i++) { - num2 += event.player.countEmptySlot(i); - } - return num < num2; - }, - content: function () { - var num2 = 0; - for (var i = 1; i <= 5; i++) { - num2 += trigger.player.countEmptySlot(i); - } - player.drawTo(num2); - }, - }, - //何晏 - yachai: { - audio: 2, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return event.source && event.source.isIn(); - }, - logTarget: "source", - check: function (event, player) { - return get.attitude(player, event.source) < 0; - }, - content: function () { - "step 0"; - var target = trigger.source, - str = get.translation(player); - event.target = target; - var th = target.countCards("h"); - if (th > 0) { - event.num = Math.ceil(th / 2); - var list = [ - "本回合不能使用手牌,然后" + str + "摸两张牌", - "展示所有手牌,并将其中一种花色的所有牌交给" + str, - "弃置" + get.cnNumber(event.num) + "张手牌", - ]; - target - .chooseControl() - .set("choiceList", list) - .set("ai", function () { - return get.rand(0, 2); - }); - } else event._result = { index: 0 }; - "step 1"; - switch (result.index) { - case 0: - target.addTempSkill("yachai_block"); - player.draw(2); - event.finish(); - break; - case 1: - target.showHandcards(); - break; - case 2: - event.goto(4); - break; - } - "step 2"; - var map = {}, - hs = target.getCards("h"); - for (var i of hs) { - map[get.suit(i, target)] = true; - } - var list = []; - for (var i of lib.suit) { - if (map[i]) list.push(i); - } - if (!list.length) event.finish(); - else if (list.length == 1) event._result = { control: list[0] }; - else - target - .chooseControl(list) - .set("prompt", "将一种花色的牌交给" + get.translation(player)); - "step 3"; - var cards = target.getCards("h", function (card) { - return ( - get.suit(card, target) == result.control && - lib.filter.cardDiscardable(card, target, "yachai") - ); - }); - if (cards.length) target.give(cards, player, "give"); - event.finish(); - "step 4"; - target.chooseToDiscard("h", true, num); - }, - subSkill: { - block: { - mark: true, - intro: { content: "不能使用手牌" }, - charlotte: true, - mod: { - cardEnabled: function (card, player) { - let hs = player.getCards("h"), - cards = [card]; - if (Array.isArray(card.cards)) cards.addArray(card.cards); - for (let i of cards) { - if (hs.includes(i)) return false; - } - }, - cardSavable: function (card, player) { - let hs = player.getCards("h"), - cards = [card]; - if (Array.isArray(card.cards)) cards.addArray(card.cards); - for (let i of cards) { - if (hs.includes(i)) return false; - } - }, - }, - }, - }, - }, - qingtan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer((current) => current.countCards("h") > 0); - }, - filterTarget: function (card, player, target) { - return target.countCards("h") > 0; - }, - selectTarget: -1, - multitarget: true, - multiline: true, - content: function () { - "step 0"; - targets.sortBySeat(); - var next = player - .chooseCardOL(targets, "请选择要展示的牌", true) - .set("ai", function (card) { - return -get.value(card); - }) - .set("source", player); - next.aiCard = function (target) { - var hs = target.getCards("h"); - return { bool: true, cards: [hs.randomGet()] }; - }; - next._args.remove("glow_result"); - "step 1"; - var cards = []; - event.videoId = lib.status.videoId++; - for (var i = 0; i < targets.length; i++) cards.push(result[i].cards[0]); - event.cards = cards; - game.log(player, "展示了", targets, "的", cards); - game.broadcastAll( - function (targets, cards, id, player) { - var dialog = ui.create.dialog(get.translation(player) + "发动了【清谈】", cards); - dialog.videoId = id; - var getName = function (target) { - if (target._tempTranslate) return target._tempTranslate; - var name = target.name; - if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; - return get.translation(name); - }; - for (var i = 0; i < targets.length; i++) { - dialog.buttons[i].querySelector(".info").innerHTML = - getName(targets[i]) + get.translation(cards[i].suit); - } - }, - targets, - cards, - event.videoId, - player - ); - game.delay(4); - "step 2"; - game.broadcastAll("closeDialog", event.videoId); - var list = [], - map = {}; - for (var i of cards) { - var suit = get.suit(i); - if (!map[suit]) map[suit] = []; - map[suit].push(i); - } - var dialog = ["选择获得一种花色的所有牌"]; - for (var suit of lib.suit) { - if (map[suit]) { - var targetsx = map[suit].map(function (card) { - return targets[cards.indexOf(card)]; - }); - dialog.push('
    ' + get.translation(targetsx) + "
    "); - dialog.push(map[suit]); - list.push(suit); - } - } - if (list.length) - player - .chooseControl(list, "cancel2") - .set("dialog", dialog) - .set("list", list) - .set("map", map) - .set("ai", function () { - let max = 0, - res = "cancel2"; - for (let s of _status.event.list) { - let temp = 0; - for (let i of _status.event.map[s]) { - temp += - get.value(i, _status.event.player) + - get.sgn(get.attitude(_status.event.player, get.owner(i))) * - (6 - get.value(i, get.owner(i))); - } - for (let i in _status.event.map) { - if (i === s) continue; - for (let j of _status.event.map[i]) { - temp -= - get.sgn(get.attitude(_status.event.player, get.owner(j))) * - get.value(j, get.owner(j)); - } - } - if (temp > max) { - res = s; - max = temp; - } - } - return res; - }); - else event.finish(); - "step 3"; - if (result.control != "cancel2") { - event.cards2 = cards.filter(function (i) { - return get.suit(i) == result.control; - }); - for (var i = 0; i < cards.length; i++) { - if (event.cards2.includes(cards[i])) { - targets[i].$give(cards[i], player, false); - } - } - player.gain(event.cards2, "log"); - } else event.finish(); - "step 4"; - var draws = []; - for (var i = 0; i < cards.length; i++) { - if (!event.cards2.includes(cards[i])) { - targets[i].discard(cards[i]).delay = false; - } else draws.push(targets[i]); - } - if (draws.length) game.asyncDraw(draws); - "step 5"; - game.delayx(); - }, - ai: { - order: 7, - result: { - player: 0.3, - target: -1, - }, - }, - }, - //邓芝 - jianliang: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - filter: function (event, player) { - return !player.isMaxHandcard(); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("jianliang"), "令至多两名角色各摸一张牌", [1, 2]) - .set("ai", function (target) { - return ( - Math.sqrt(5 - Math.min(4, target.countCards("h"))) * - get.attitude(_status.event.player, target) - ); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.logSkill("jianliang", targets); - if (targets.length == 1) { - targets[0].draw(); - event.finish(); - } else game.asyncDraw(targets); - } else event.finish(); - "step 2"; - game.delayx(); - }, - }, - weimeng: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.hp > 0 && target != player && target.countGainableCards(player, "h") > 0; - }, - content: function () { - "step 0"; - player.gainPlayerCard(target, "h", true, [1, player.hp]); - "step 1"; - if (result.bool && target.isIn()) { - var num = result.cards.length, - hs = player.getCards("he"); - var numx = 0; - for (var i of result.cards) numx += get.number(i, player); - event.num = numx; - event.cards = result.cards; - if (!hs.length) event.finish(); - else if (hs.length <= num) event._result = { bool: true, cards: hs }; - else - player.chooseCard( - "he", - true, - "选择交给" + get.translation(target) + get.cnNumber(num) + "张牌", - "(已得到牌的点数和:" + numx + ")", - num - ); - } else event.finish(); - "step 2"; - player.give(result.cards, target); - var numx = 0; - for (var i of result.cards) numx += get.number(i, player); - if (numx > num) player.draw(); - else if (numx < num) player.discardPlayerCard(target, true, "hej"); - }, - ai: { - order: 6, - tag: { - lose: 1, - loseCard: 1, - gain: 1, - }, - result: { - target: function (player, target) { - return -Math.pow(Math.min(player.hp, target.countCards("h")), 2) / 4; - }, - }, - }, - }, - //冯熙 - yusui: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - return event.player != player && event.player.isIn() && get.color(event.card) == "black"; - }, - logTarget: "player", - check: function (event, player) { - var target = event.player; - if (player.hp < 3 || get.attitude(player, target) > -3) return false; - if (player.hp < target.hp) return true; - if (Math.min(target.countCards("h") - player.countCards("h"), target.countCards("h")) > 3) - return true; - return false; - }, - preHidden: true, - content: function () { - "step 0"; - player.loseHp(); - event.target = trigger.player; - "step 1"; - event.addIndex = 0; - var list = [], - num = target.countCards("h") - player.countCards("h"); - event.num = num; - if (num > 0 && target.countCards("h") > 0) - list.push("令其弃置" + get.cnNumber(num) + "张手牌"); - else event.addIndex++; - if (target.hp > player.hp) - list.push("令其失去" + get.cnNumber(target.hp - player.hp) + "点体力"); - if (!list.length) event.finish(); - else if (list.length == 1) event._result = { index: 0 }; - else - player - .chooseControl() - .set("choiceList", list) - .set("prompt", "令" + get.translation(target) + "执行一项") - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().target; - return target.hp - player.hp > - Math.min(_status.event.getParent().num, target.countCards("h")) / 2 - ? 1 - : 0; - }); - "step 2"; - if (result.index + event.addIndex == 0) target.chooseToDiscard(num, true, "h"); - else target.loseHp(target.hp - player.hp); - }, - }, - boyan: { - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player; - }, - content: function () { - "step 0"; - target.drawTo(Math.min(5, target.maxHp)); - "step 1"; - target.addTempSkill("boyan_block"); - }, - subSkill: { - block: { - mark: true, - intro: { content: "不能使用或打出手牌" }, - charlotte: true, - mod: { - cardEnabled2: function (card) { - if (get.position(card) == "h") return false; - }, - }, - }, - }, - ai: { - order: 4, - result: { - target: function (player, target) { - if (get.attitude(player, target) > 0) - return Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")); - if ( - Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")) <= 1 && - target.countCards("h", "shan") && - !target.hasSkillTag("respondShan", true, null, true) && - player.countCards("h", function (card) { - return ( - get.tag(card, "respondShan") && - player.getUseValue(card, null, true) > 0 && - get.effect(target, card, player, player) > 0 - ); - }) - ) - return -2; - }, - }, - }, - }, - //祢衡 - rekuangcai: { - audio: 2, - forced: true, - trigger: { player: "phaseDiscardBegin" }, - filter: function (event, player) { - return !player.getHistory("useCard").length || !player.getHistory("sourceDamage").length; - }, - content: function () { - lib.skill.rekuangcai.change(player, player.getHistory("useCard").length ? -1 : 1); - }, - mod: { - targetInRange: function (card, player) { - if (player == _status.currentPhase) return true; - }, - cardUsable: function (card, player) { - if (player == _status.currentPhase) return Infinity; - }, - }, - change: function (player, num) { - if (typeof player.storage.rekuangcai_change != "number") - player.storage.rekuangcai_change = 0; - player.storage.rekuangcai_change += num; - player.addSkill("rekuangcai_change"); - }, - group: "rekuangcai_draw", - subSkill: { - draw: { - audio: "rekuangcai", - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return player.getHistory("sourceDamage").length > 0; - }, - content: function () { - player.draw(Math.min(5, player.getStat("damage"))); - }, - }, - change: { - mod: { - maxHandcard: function (player, num) { - if (typeof player.storage.rekuangcai_change == "number") - return num + player.storage.rekuangcai_change; - }, - }, - charlotte: true, - mark: true, - intro: { - content: (num) => "手牌上限" + (num < 0 ? "" : "+") + num, - }, - }, - }, - }, - reshejian: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - if (player == event.player || event.targets.length != 1) return false; - return player.countCards("h") >= 2; - }, - usable: 2, - async cost(event, trigger, player) { - event.result = await player - .chooseToDiscard( - "he", - [2, Infinity], - get.prompt("reshejian", trigger.player), - '
    弃置至少两张手牌,然后选择一项:
    ⒈弃置其等量的牌。⒉对其造成1点伤害。
    ' - ) - .set( - "ai", - function (card) { - if (_status.event.goon && ui.selected.cards.length < 2) - return 5.6 - get.value(card); - return 0; - }, - "chooseonly" - ) - .set( - "goon", - (function () { - var target = trigger.player; - if (get.damageEffect(target, player, player) > 0) return true; - if ( - target.countCards("he", function (card) { - return get.value(card, target) > 6; - }) >= 2 - ) - return true; - return false; - })() - ) - .forResult(); - }, - logTarget: "player", - content: function () { - "step 0"; - player.discard(cards); - "step 1"; - var num = cards.length; - event.num = num; - var target = targets[0], - str = get.translation(target); - event.target = target; - if (!target.isIn()) event.finish(); - else if ( - !target.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, target); - }, "he") - ) - event._result = { index: 1 }; - else - player - .chooseControl() - .set("choiceList", [ - "弃置" + str + "的" + get.cnNumber(num) + "张牌", - "对" + str + "造成1点伤害", - ]) - .set("ai", function () { - var player = _status.event.player; - var eff0 = - get.effect(target, { name: "guohe_copy2" }, player, player) * - Math.min(1.7, target.countCards("he")); - var eff1 = get.damageEffect(target, player, player); - return eff0 > eff1 ? 0 : 1; - }); - "step 2"; - if (result.index == 0) player.discardPlayerCard(target, num, true, "he"); - else target.damage(); - }, - }, - //陈登 - refuyuan: { - audio: 2, - trigger: { global: "useCardToTargeted" }, - logTarget: "target", - filter: function (event, player) { - return ( - event.card.name == "sha" && - event.target.isIn() && - !game.hasPlayer2(function (current) { - return current.hasHistory("useCard", function (evt) { - return ( - evt.card != event.card && - get.color(evt.card, false) == "red" && - evt.targets && - evt.targets.includes(event.target) - ); - }); - }) - ); - }, - check: function (event, player) { - return get.attitude(player, event.target) > 0; - }, - content: function () { - trigger.target.draw(); - }, - }, - reyingshui: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.countCards("he") > 0 && game.hasPlayer((current) => player.inRange(current)) - ); - }, - position: "he", - filterCard: true, - filterTarget: function (card, player, target) { - return player.inRange(target); - }, - discard: false, - lose: false, - delay: false, - check: function (card) { - if (get.type(card) == "equip") return 3 - get.value(card); - return 6.5 - get.value(card); - }, - content: function () { - "step 0"; - player.give(cards, target); - "step 1"; - var next = target.chooseCard( - "he", - [2, Infinity], - "交给" + get.translation(player) + "至少两张装备牌,否则受到1点伤害", - { type: "equip" } - ); - if (get.damageEffect(target, player, target) >= 0) next.set("ai", () => -1); - else next.set("ai", (card) => (ui.selected.cards.length < 2 ? 6 - get.value(card) : 0)); - "step 2"; - if (result.bool) target.give(result.cards, player); - else target.damage("nocard"); - }, - ai: { - order: 5, - tag: { - damage: 0.5, - }, - result: { - target: -1.5, - }, - }, - }, - rewangzu: { - audio: 2, - trigger: { player: "damageBegin1" }, - filter: function (event, player) { - return ( - event.source && - player != event.source && - player.hasCard((card) => lib.filter.cardDiscardable(card, player, "rewangzu"), "h") - ); - }, - usable: 1, - async cost(event, trigger, player) { - var num = player.getFriends().length; - if ( - !game.hasPlayer(function (current) { - return current != player && current.getFriends().length > num; - }) - ) { - event.result = await player - .chooseToDiscard( - "h", - get.prompt("rewangzu"), - "弃置一张牌并令伤害-1", - "chooseonly" - ) - .set("ai", function (card) { - return 7 - get.value(card); - }) - .forResult(); - } else { - event.result = await player.chooseBool(get.prompt("rewangzu"), "随机弃置一张牌并令伤害-1").forResult(); - } - }, - async content(event, trigger, player) { - trigger.num--; - if (!event.cards || !event.cards.length) { - const cards = player.getCards("h", (card) => - lib.filter.cardDiscardable(card, player, "rewangzu") - ); - if (cards.length) player.discard(cards.randomGet()); - } else { - player.discard(event.cards); - } - }, - }, - //万年公主 - zhenge: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("zhenge"), "令一名角色的攻击范围+1") - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att > 0) { - if (!target.hasMark("zhenge_effect")) att *= 1.5; - if ( - !game.hasPlayer(function (current) { - return get.distance(target, current, "attack") > 2; - }) - ) { - var usf = Math.max.apply( - Math, - game.filterPlayer().map(function (current) { - if (target.canUse("sha", current, false)) - return get.effect(current, { name: "sha" }, target, player); - return 0; - }) - ); - return att + usf; - } - return att; - } - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("zhenge", target); - target.addSkill("zhenge_effect"); - if (target.countMark("zhenge_effect") < 5) target.addMark("zhenge_effect", 1, false); - if ( - !game.hasPlayer(function (current) { - return current != target && !target.inRange(current); - }) - ) { - player - .chooseTarget( - "是否令" + get.translation(target) + "视为对另一名角色使用【杀】?", - function (card, player, target) { - return _status.event.source.canUse("sha", target); - } - ) - .set("source", target) - .set("ai", function (target) { - var evt = _status.event; - return get.effect(target, { name: "sha" }, evt.source, evt.player); - }); - } else { - game.delayx(); - event.finish(); - } - } else event.finish(); - "step 2"; - if (result.bool) { - target.useCard({ name: "sha", isCard: true }, result.targets[0], false); - } - "step 3"; - game.delayx(); - }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - mod: { - attackRange: function (player, num) { - return num + player.countMark("zhenge_effect"); - }, - }, - intro: { content: "攻击范围+#" }, - }, - }, - }, - xinghan: { - audio: 2, - init: function (player) { - player.addSkill("xinghan_count"); - }, - onremove: function (player) { - player.removeSkill("xinghan_count"); - }, - trigger: { global: "damageSource" }, - forced: true, - filter: function (event, player) { - return ( - event.card && - event.card == player.storage.xinghan_temp && - event.source && - event.source.hasMark("zhenge_effect") - ); - }, - logTarget: "source", - content: function () { - player.draw( - player.isMaxHandcard(true) ? 1 : Math.min(5, trigger.source.getAttackRange()) - ); - }, - subSkill: { - count: { - trigger: { global: "useCard1" }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - filter: function (event, player) { - return ( - event.card.name == "sha" && - !game.hasPlayer2(function (current) { - return current.hasHistory("useCard", function (evt) { - return evt != event && evt.card.name == "sha"; - }); - }) - ); - }, - content: function () { - player.addTempSkill("xinghan_temp"); - player.storage.xinghan_temp = trigger.card; - }, - }, - temp: { onremove: true }, - }, - ai: { combo: "zhenge" }, - }, - //荀谌 - refenglve: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.countCards("h") > 0 && - !player.hasSkillTag("noCompareSource") && - game.hasPlayer(function (current) { - return ( - current != player && - current.countCards("h") > 0 && - !current.hasSkillTag("noCompareTarget") - ); - }) - ); - }, - filterTarget: function (card, player, target) { - return ( - target != player && - target.countCards("h") > 0 && - !target.hasSkillTag("noCompareTarget") - ); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - if (!target.countCards("hej")) event.finish(); - else { - // event.giver = target; - // event.gainner = player; - player.gainPlayerCard( - target, - true, - "hej", - 2, - "获得" + get.translation(target) + "区域里的两张牌" - ); - } - } else if (result.tie) { - delete player.getStat("skill").refenglve; - if (get.position(result.player, true) == "d") player.gain(result.player, "gain2"); - // event.finish(); - } else { - if (get.position(result.player, true) == "d") target.gain(result.player, "gain2"); - // event.finish(); - /*if(!player.countCards('he')) event.finish(); - else{ - event.giver=player; - event.gainner=target; - player.chooseCard(true,'he','交给'+get.translation(target)+'一张牌'); - }*/ - } - "step 2"; - // if (result.bool) event.giver.give(result.cards, event.gainner); - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if ( - !player.hasCard(function (card) { - if (get.position(card) != "h") return false; - var val = get.value(card); - if (val < 0) return true; - if (val <= 5) { - return card.number >= 11; - } - if (val <= 6) { - return card.number >= 13; - } - return false; - }) - ) - return 0; - return -Math.sqrt(1 + target.countCards("he")) / (1 + target.countCards("j")); - }, - }, - }, - }, - anyong: { - audio: 2, - trigger: { global: "damageSource" }, - direct: true, - filter: function (event, player) { - return ( - event.source && - event.source == _status.currentPhase && - event.num == 1 && - // event.player != event.source && - event.player.isIn() && - player.countCards("he") > 0 && - event.source - .getHistory("sourceDamage", function (evt) { - return evt.player != event.source; - }) - .indexOf(event) == 0 - ); - }, - content: function () { - "step 0"; - player - .chooseToDiscard( - "he", - get.prompt("anyong", trigger.player), - "弃置一张牌并对其造成1点伤害" - ) - .set("goon", get.damageEffect(trigger.player, player, player) > 0) - .set("ai", function (card) { - if (_status.event.goon) return 7 - get.value(card); - return 0; - }).logSkill = ["anyong", trigger.player]; - "step 1"; - if (result.bool) trigger.player.damage(); - }, - }, - //刘永 - zhuning: { - audio: 2, - enable: "phaseUse", - usable: 2, - filter: function (event, player) { - if (!player.countCards("he")) return false; - return !player.getStat("skill").zhuning || player.hasSkill("zhuning_double"); - }, - filterCard: true, - position: "he", - filterTarget: lib.filter.notMe, - selectCard: [1, Infinity], - delay: false, - lose: false, - discard: false, - 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(1, player.countCards("h") - player.hp)) return 0; - return 10 - get.value(card); - }, - content: function () { - "step 0"; - player.give(cards, target).gaintag.add("fengxiang_tag"); - "step 1"; - var list = []; - for (var name of lib.inpile) { - var type = get.type(name); - if (type != "basic" && type != "trick") continue; - var card = { name: name, isCard: true }; - if (get.tag(card, "damage") > 0 && player.hasUseTarget(card)) { - list.push([type, "", name]); - } - if (name == "sha") { - for (var i of lib.inpile_nature) { - card.nature = i; - if (player.hasUseTarget(card)) list.push([type, "", name, i]); - } - } - } - if (list.length) { - player - .chooseButton(["是否视为使用一张伤害牌?", [list, "vcard"]]) - .set("ai", function (button) { - return _status.event.player.getUseValue({ name: button.link[2] }); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - player.chooseUseTarget( - { name: result.links[0][2], nature: result.links[0][3], isCard: true }, - true, - false - ); - } else event.finish(); - "step 3"; - if ( - !player.hasHistory("sourceDamage", function (evt) { - if (!evt.card) return false; - var evtx = evt.getParent("useCard"); - return evtx.card == evt.card && evtx.getParent(2) == event; - }) - ) - player.addTempSkill("zhuning_double"); - }, - subSkill: { - double: {}, - }, - ai: { - fireAttack: true, - order: 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.rerende < 0 || - player.countCards("h") <= 1 - ) { - if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0; - } - return Math.max(1, 5 - nh); - }, - }, - }, - }, - fengxiang: { - getMax: function (event) { - var max = 0, - max2 = null, - players = game.filterPlayer(); - for (var current of players) { - var num = 0, - cards = current.getCards("h", function (card) { - return card.hasGaintag("fengxiang_tag"); - }); - if (event) { - if (event.name == "gain" && event.gaintag.includes("fengxiang_tag")) - cards.removeArray(event.cards); - var evt = event.getl(current); - if (evt && evt.gaintag_map) { - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("fengxiang_tag")) num++; - } - } - } - num += cards.length; - if (num > max) { - max = num; - max2 = current; - } else if (num == max) max2 = null; - } - return max2; - }, - audio: 2, - init: function (player) { - game.addGlobalSkill("fengxiang_use"); - }, - onremove: function (player) { - if (!game.hasPlayer((current) => current.hasSkill("fengxiang"), true)) - game.removeGlobalSkill("fengxiang_use"); - }, - trigger: { player: "damageEnd" }, - forced: true, - filter: function (event, player) { - var target = lib.skill.fengxiang.getMax(); - return !target || target.isDamaged(); - }, - logTarget: function (event, player) { - return lib.skill.fengxiang.getMax() || player; - }, - content: function () { - var target = lib.skill.fengxiang.getMax(); - if (target) target.recover(); - else player.draw(); - }, - group: "fengxiang_draw", - subSkill: { - draw: { - trigger: { - global: [ - "equipAfter", - "addJudgeAfter", - "loseAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - filter: function (event, player) { - if (event.name == "lose" && event.getlx === false) return false; - return lib.skill.fengxiang.getMax() != lib.skill.fengxiang.getMax(event); - }, - content: function () { - if (trigger.delay === false) game.delayx(); - player.draw(); - }, - }, - use: { - mod: { - aiOrder: function (player, card, num) { - if ( - num > 0 && - get.itemtype(card) === "card" && - card.hasGaintag("fengxiang_tag") && - game.hasPlayer((current) => { - return ( - current.hasSkill("fengxiang") && get.attitude(player, current) > 0 - ); - }) - ) - return num + 10; - }, - }, - trigger: { player: "dieAfter" }, - filter: function (event, player) { - return !game.hasPlayer((current) => current.hasSkill("fengxiang"), true); - }, - silent: true, - forceDie: true, - charlotte: true, - content: function () { - game.removeGlobalSkill("fengxiang_use"); - }, - }, - }, - }, - //阚泽 - rekuanshi: { - audio: "kuanshi", - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("rekuanshi")) - .set("animate", false) - .set("ai", function (target) { - var att = get.attitude(player, target); - if (target.hp < 3) att /= 1.5; - return att; - }); - "step 1"; - if (result.bool) { - player.logSkill("rekuanshi"); - player.addTempSkill("rekuanshi_effect", { player: "phaseBegin" }); - player.storage.rekuanshi_effect = result.targets[0]; - game.delayx(); - } - }, - subSkill: { - effect: { - audio: "kuanshi", - mark: true, - intro: { - content: "每回合限一次,当$于一回合内受到第2点伤害后,其回复1点体力。", - }, - trigger: { global: "damageEnd" }, - forced: true, - charlotte: true, - logTarget: "player", - usable: 1, - filter: function (event, player) { - if (event.player != player.storage.rekuanshi_effect || event.player.isHealthy()) - return false; - var history = event.player.getHistory("damage", null, event), - num = 0; - for (var i of history) num += i.num; - return num > 1 && num - event.num < 2; - }, - content: function () { - trigger.player.recover(); - }, - }, - }, - }, - //吕玲绮 - guowu: { - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - preHidden: true, - content: function () { - "step 0"; - var hs = player.getCards("h"); - player.showCards(hs, get.translation(player) + "发动了【帼舞】"); - var list = []; - for (var i of hs) { - list.add(get.type2(i, player)); - if (list.length >= 3) break; - } - if (list.length >= 1) { - var card = get.discardPile(function (i) { - return i.name == "sha"; - }); - if (card) player.gain(card, "gain2"); - } - if (list.length >= 2) player.addTempSkill("guowu_dist", "phaseUseAfter"); - if (list.length >= 3) player.addTempSkill("guowu_add", "phaseUseAfter"); - }, - subSkill: { - dist: { - charlotte: true, - mod: { targetInRange: () => true }, - }, - add: { - charlotte: true, - trigger: { player: "useCard1" }, - direct: true, - filter: function (event, player) { - var info = get.info(event.card, false); - if (info.allowMultiple == false) return false; - if (event.card.name != "sha" && (info.type != "trick" || get.mode() == "guozhan")) - return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(event.card, player, current) && - lib.filter.targetInRange(event.card, player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var num = game.countPlayer(function (current) { - return ( - !trigger.targets.includes(current) && - lib.filter.targetEnabled2(trigger.card, player, current) && - lib.filter.targetInRange(trigger.card, player, current) - ); - }); - player - .chooseTarget( - "帼舞:是否为" + - get.translation(trigger.card) + - "增加" + - (num > 1 ? "至多两个" : "一个") + - "目标?", - [1, Math.min(2, num)], - function (card, player, target) { - var trigger = _status.event.getTrigger(); - var card = trigger.card; - return ( - !trigger.targets.includes(target) && - lib.filter.targetEnabled2(card, player, target) && - lib.filter.targetInRange(card, player, target) - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - var card = _status.event.getTrigger().card; - return get.effect(target, card, player, player); - }); - "step 1"; - if (result.bool) { - if (player != game.me && !player.isOnline()) game.delayx(); - } else event.finish(); - "step 2"; - var targets = result.targets.sortBySeat(); - player.logSkill("guowu_add", targets); - trigger.targets.addArray(targets); - //if(get.mode()=='guozhan') player.removeSkill('guowu_add'); - }, - }, - }, - }, - zhuangrong: { - derivation: ["llqshenwei", "wushuang"], - trigger: { global: "phaseEnd" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return player.hp == 1 || player.countCards("h") == 1; - }, - content: function () { - "step 0"; - player.awakenSkill("zhuangrong"); - player.loseMaxHp(); - "step 1"; - if (player.maxHp > player.hp) player.recover(player.maxHp - player.hp); - "step 2"; - player.drawTo(Math.min(5, player.maxHp)); - player.addSkills(["llqshenwei", "wushuang"]); - }, - }, - llqshenwei: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - forced: true, - filter: (event) => !event.numFixed, - content: function () { - trigger.num += 2; - }, - mod: { - maxHandcard: (player, num) => num + 2, - }, - }, - cuijian: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer((current) => lib.skill.cuijian.filterTarget(null, player, current)); - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - var hs = target.getCards("h", "shan"); - if (hs.length) { - hs.addArray( - target.getCards("he", function (card) { - return get.subtype(card) == "equip2"; - }) - ); - player.gain(hs, target, "give", "bySelf"); - if (player.hasMark("zhtongyuan_basic")) event.finish(); - else event.num = hs.length; - } else { - if (player.hasMark("zhtongyuan_trick")) player.draw(2); - event.finish(); - } - "step 1"; - var hs = player.getCards("he"); - if (!hs.length || !target.isIn()) event.finish(); - else if (hs.length <= num) event._result = { bool: true, cards: hs }; - else - player.chooseCard( - "he", - true, - "选择交给" + get.translation(target) + get.cnNumber(num) + "张牌", - num - ); - "step 2"; - if (result.bool && result.cards && result.cards.length) player.give(result.cards, target); - }, - ai: { - order: 4, - result: { - player: function (player, target) { - if (!target.countCards("h", "shan")) - return player.hasMark("zhtongyuan_trick") ? 2 : 0; - return 0; - }, - target: function (player, target) { - if (target.countCards("h", "shan")) { - var num = -target.countCards("h") / 2; - var card = target.getEquip(2); - if (card) num -= get.value(card, target) / 2; - return num; - } - return -0.01; - }, - }, - }, - }, - tongyuan: { audio: 2 }, - zhtongyuan: { - audio: "tongyuan", - trigger: { player: ["useCardAfter", "respondAfter"] }, - forced: true, - filter: function (event, player) { - var type = get.type2(event.card, false); - return ( - (type == "basic" || type == "trick") && - get.color(event.card, false) == "red" && - !player.hasMark("zhtongyuan_" + type) - ); - }, - content: function () { - var type = get.type2(trigger.card, false); - if (!player.hasMark("zhtongyuan_" + type)) { - player.addMark("zhtongyuan_" + type, 1, false); - game.log(player, "修改了技能", "#g【摧坚】"); - } - }, - group: ["zhtongyuan_basic", "zhtongyuan_trick"], - subSkill: { - basic: { - trigger: { player: "useCard2" }, - direct: true, - locked: true, - filter: function (event, player) { - if (!player.hasMark("zhtongyuan_basic") || !player.hasMark("zhtongyuan_trick")) - return false; - var card = event.card; - if (get.color(card, false) != "red" || get.type(card, null, true) != "basic") - return false; - var info = get.info(card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - player - .chooseTarget(get.prompt("zhtongyuan"), function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2(_status.event.card, player, target) - ); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("zhtongyuan", event.targets); - trigger.targets.addArray(event.targets); - } - }, - }, - trick: { - audio: "zhtongyuan", - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - if (!player.hasMark("zhtongyuan_basic") || !player.hasMark("zhtongyuan_trick")) - return false; - var card = event.card; - return get.color(card, false) == "red" && get.type(card, null, false) == "trick"; - }, - content: function () { - trigger.directHit.addArray(game.filterPlayer()); - game.log(trigger.card, "不可被响应"); - }, - }, - }, - }, - //陆郁生 - zhente: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - logTarget: "player", - usable: 1, - preHidden: true, - filter: function (event, player) { - var color = get.color(event.card); - if ( - player == event.player || - event.player.isDead() || - color == "none" || - (get.mode() == "guozhan" && color != "black") - ) - return false; - var type = get.type(event.card); - return type == "basic" || type == "trick"; - }, - check: function (event, player) { - return ( - !event.excluded.includes(player) && - get.effect(player, event.card, event.player, player) < 0 - ); - }, - content: function () { - "step 0"; - trigger.player - .chooseControl() - .set("choiceList", [ - "本回合内不能再使用" + get.translation(get.color(trigger.card)) + "牌", - "令" + get.translation(trigger.card) + "对" + get.translation(player) + "无效", - ]) - .set("prompt", get.translation(player) + "发动了【贞特】,请选择一项") - .set("ai", function () { - var player = _status.event.player; - var target = _status.event.getParent().player; - var card = _status.event.getTrigger().card, - color = get.color(card); - if (get.effect(target, card, player, player) <= 0) return 1; - var hs = player.countCards("h", function (card) { - return ( - get.color(card, player) == color && - player.hasValueTarget(card, null, true) - ); - }); - if (!hs.length) return 0; - if (hs > 1) return 1; - return Math.random() > 0.5 ? 0 : 1; - }); - "step 1"; - if (result.index == 0) { - trigger.player.addTempSkill("zhente2"); - trigger.player.storage.zhente2.add(get.color(trigger.card)); - trigger.player.markSkill("zhente2"); - } else trigger.excluded.add(player); - }, - }, - zhente2: { - mod: { - cardEnabled(card, player) { - const color = get.color(card); - if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false; - }, - cardSavable(card, player) { - const color = get.color(card); - if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false; - }, - }, - charlotte: true, - onremove: true, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - intro: { content: "本回合内不能使用$牌" }, - }, - zhiwei: { - audio: 2, - trigger: { - player: ["enterGame", "showCharacterAfter", "phaseBegin"], - global: ["phaseBefore"], - }, - direct: true, - filter: function (event, player, name) { - if (player.hasSkill("zhiwei2")) return false; - if (!game.hasPlayer((current) => current != player)) return false; - if (get.mode() == "guozhan") - return ( - event.name == "showCharacter" && - (event.toShow.includes("gz_luyusheng") || event.toShow.includes("luyusheng")) - ); - return event.name != "showCharacter" && (name != "phaseBefore" || game.phaseNumber == 0); - }, - content: function () { - "step 0"; - player - .chooseTarget( - "请选择【至微】的目标", - "选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。", - true, - lib.filter.notMe - ) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 0) return 1 + att; - return Math.random(); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("zhiwei", target); - player.storage.zhiwei2 = target; - player.addSkill("zhiwei2"); - } - }, - }, - zhiwei2: { - group: ["zhiwei2_draw", "zhiwei2_discard", "zhiwei2_gain", "zhiwei2_clear"], - charlotte: true, - onremove: true, - mark: "character", - intro: { - content: "$造成伤害后你摸一张牌;$受到伤害后你弃置一张牌;你于弃牌阶段弃置牌后交给$", - }, - subSkill: { - draw: { - audio: "zhiwei", - trigger: { global: "damageSource" }, - forced: true, - filter: function (event, player) { - return event.source == player.storage.zhiwei2; - }, - logTarget: "source", - content: function () { - player.draw(); - }, - }, - discard: { - audio: "zhiwei", - trigger: { global: "damageEnd" }, - forced: true, - filter: function (event, player) { - return ( - event.player == player.storage.zhiwei2 && - player.countCards("h", function (card) { - return lib.filter.cardDiscardable(card, player, "zhiwei2_discard"); - }) - ); - }, - logTarget: "player", - content: function () { - player.discard( - player - .getCards("h", function (card) { - return lib.filter.cardDiscardable(card, player, "zhiwei2_discard"); - }) - .randomGet() - ); - }, - }, - gain: { - audio: "zhiwei", - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - forced: true, - filter: function (event, player) { - if ( - event.type != "discard" || - event.getlx === false || - event.getParent("phaseDiscard").player != player || - !player.storage.zhiwei2 || - !player.storage.zhiwei2.isIn() - ) - return false; - var evt = event.getl(player); - return evt && evt.cards2.filterInD("d").length > 0; - }, - logTarget: function (event, player) { - return player.storage.zhiwei2; - }, - content: function () { - if (trigger.delay === false) game.delay(); - player.storage.zhiwei2.gain(trigger.getl(player).cards2.filterInD("d"), "gain2"); - }, - }, - clear: { - audio: "zhiwei", - trigger: { - global: "die", - player: ["hideCharacterEnd", "removeCharacterEnd"], - }, - forced: true, - filter: function (event, player) { - if (event.name == "die") return event.player == player.storage.zhiwei2; - if (event.name == "removeCharacter") - return event.toRemove == "luyusheng" || event.toRemove == "gz_luyusheng"; - return event.toHide == "luyusheng" || event.toHide == "gz_luyusheng"; - }, - content: function () { - "step 0"; - player.removeSkill("zhiwei2"); - if (trigger.name != "die" || get.mode() != "guozhan") event.finish(); - "step 1"; - if (player.name1 == "gz_luyusheng" || player.name1 == "luyusheng") - player.hideCharacter(0); - if (player.name2 == "gz_luyusheng" || player.name2 == "luyusheng") - player.hideCharacter(1); - }, - }, - }, - }, - //华歆 - spwanggui: { - audio: "wanggui", - trigger: { source: "damageSource" }, - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.group != player.group; - }); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - get.prompt("spwanggui"), - "对一名势力不同的其他角色造成1点伤害", - function (card, player, target) { - return target.group != player.group; - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - target.damage(); - }, - group: "spwanggui_draw", - subSkill: { - draw: { - trigger: { player: "damageEnd" }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - get.prompt("spwanggui"), - "令自己摸一张牌,或和一名势力相同的其他角色各摸一张牌", - function (card, player, target) { - return target.group == player.group; - } - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target != player) att *= 2; - if (target.hasSkillTag("nogain")) att /= 1.7; - return att; - }) - .forResult(); - }, - content: function () { - "step 0"; - var target = targets[0]; - if (player == target) { - player.draw(); - event.finish(); - } else { - var list = [player, target].sortBySeat(); - game.asyncDraw(list); - } - "step 1"; - game.delayx(); - }, - }, - }, - }, - wanggui: { - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - direct: true, - filter: function (event, player) { - return player.hasSkill("wanggui") && !player.hasSkill("wanggui2"); - }, - preHidden: true, - content: function () { - "step 0"; - player.addTempSkill("wanggui2"); - var bool = player.isUnseen(2); - if (bool) { - player - .chooseTarget( - "望归:是否对一名势力不同的角色造成1点伤害?", - function (card, player, target) { - return target.isEnemyOf(player); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }) - .setHiddenSkill("wanggui"); - } else event.goto(2); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("wanggui", target); - target.damage(); - } - event.finish(); - "step 2"; - player - .chooseBool("望归:是否令所有与自己势力相同的角色各摸一张牌?") - .setHiddenSkill("wanggui"); - "step 3"; - if (result.bool) { - var targets = game.filterPlayer(function (current) { - return current.isFriendOf(player); - }); - targets.sortBySeat(); - player.logSkill("wanggui", targets); - game.asyncDraw(targets); - } else event.finish(); - "step 4"; - game.delayx(); - }, - }, - wanggui2: {}, - xibing: { - audio: 2, - trigger: { global: "useCardToPlayered" }, - filter: function (event, player) { - if ( - player == event.player || - event.targets.length != 1 || - event.player.countCards("h") >= event.player.hp - ) - return false; - var bool = function (card) { - return ( - (card.name == "sha" || get.type(card, false) == "trick") && - get.color(card, false) == "black" - ); - }; - if (!bool(event.card)) return false; - var evt = event.getParent("phaseUse"); - if (evt.player != event.player) return false; - return ( - get.mode() != "guozhan" || - event.player.getHistory("useCard", function (evtx) { - return bool(evtx.card) && evtx.getParent("phaseUse") == evt; - })[0] == event.getParent() - ); - }, - logTarget: "player", - check: function (event, player) { - var target = event.player; - var att = get.attitude(player, target); - var num2 = Math.min(5, target.hp) - target.countCards("h"); - if (num2 <= 0) return att <= 0; - var num = target.countCards("h", function (card) { - return target.hasValueTarget(card, null, true); - }); - if (!num) return att > 0; - return (num - num2) * att < 0; - }, - preHidden: true, - content: function () { - "step 0"; - var num = Math.min(5, trigger.player.hp) - trigger.player.countCards("h"); - if (num > 0) trigger.player.draw(num); - "step 1"; - trigger.player.addTempSkill("xibing2"); - player._xibing = true; - if (get.mode() != "guozhan" || player.isUnseen(2) || trigger.player.isUnseen(2)) - event.finish(); - "step 2"; - var target = trigger.player; - var players1 = [player.name1, player.name2]; - var players2 = [target.name1, target.name2]; - player - .chooseButton(2, [ - "是否暗置自己和" + get.translation(target) + "的各一张武将牌?", - '
    你的武将牌
    ', - [players1, "character"], - '
    ' + get.translation(target) + "的武将牌
    ", - [players2, "character"], - ]) - .set("players", players1) - .set("complexSelect", true) - .set("filterButton", function (button) { - return ( - !get.is.jun(button.link) && - (ui.selected.buttons.length == 0) == - _status.event.players.includes(button.link) - ); - }); - "step 3"; - if (result.bool) { - var target = trigger.player; - player.hideCharacter(player.name1 == result.links[0] ? 0 : 1); - target.hideCharacter(target.name1 == result.links[1] ? 0 : 1); - player.addTempSkill("xibing3"); - target.addTempSkill("xibing3"); - } - }, - }, - xibing2: { - mod: { - cardEnabled2: function (card) { - if (get.position(card) == "h") return false; - }, - }, - }, - xibing3: { - ai: { nomingzhi: true }, - }, - //小虎 - remeibu: { - audio: "meibu", - trigger: { - global: "phaseUseBegin", - }, - filter: function (event, player) { - return ( - event.player != player && - event.player.isIn() && - event.player.inRange(player) && - player.countCards("he") > 0 - ); - }, - direct: true, - derivation: ["rezhixi"], - checkx: function (event, player) { - if (get.attitude(player, event.player) >= 0) return false; - return event.player.countCards("h") > event.player.hp; - }, - content: function () { - "step 0"; - var check = lib.skill.new_meibu.checkx(trigger, player); - player - .chooseToDiscard(get.prompt2("remeibu", trigger.player), "he") - .set("ai", function (card) { - if (_status.event.check) return 6 - get.value(card); - return 0; - }) - .set("check", check) - .set("logSkill", ["remeibu", trigger.player]); - "step 1"; - if (result.bool) { - var target = trigger.player; - var card = result.cards[0]; - player.line(target, "green"); - player.markAuto("remeibu_gain", [get.suit(card, player)]); - player.addTempSkill("remeibu_gain"); - target.addTempSkills("rezhixi", "phaseUseEnd"); - } - }, - ai: { - expose: 0.2, - }, - subSkill: { - gain: { - trigger: { global: "loseAfter" }, - forced: true, - charlotte: true, - popup: false, - onremove: true, - filter: function (event, player) { - return ( - event.getParent(3).name == "rezhixi" && - player - .getStorage("remeibu_gain") - .includes(get.suit(event.cards[0], event.player)) && - get.position(event.cards[0]) == "d" - ); - }, - content: function () { - player.gain(trigger.cards[0], "gain2"); - }, - }, - }, - }, - remumu: { - audio: "mumu", - trigger: { - player: "phaseUseBegin", - }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("e") > 0; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("remumu"), function (card, player, target) { - return target.countCards("e") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target), - es = target.getCards("e"), - val = 0; - for (var i of es) { - var eff = -(get.value(i, target) - 0.1) * att; - if (eff > val) val = eff; - } - return eff; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("remumu", target); - if (player == target) event._result = { index: 1 }; - else { - var str = get.translation(target); - player - .chooseControl() - .set("choiceList", [ - "弃置" + str + "装备区的一张牌且本阶段使用【杀】的次数上限+1", - "获得" + str + "装备区的一张牌且本阶段使用【杀】的次数上限-1", - ]) - .set("ai", function () { - var player = _status.event.player; - if ( - player.countCards("hs", function (card) { - return ( - get.name(card, player) == "sha" && player.hasValueTarget(card) - ); - }) < Math.max(1, player.getCardUsable("sha")) - ) - return 1; - return 0; - }); - } - } else event.finish(); - "step 2"; - if (result.index == 0) { - player.addTempSkill("remumu3", "phaseUseAfter"); - player.discardPlayerCard(target, "e", true); - } else { - player.addTempSkill("remumu2", "phaseUseAfter"); - player.gainPlayerCard(target, "e", true); - } - }, - }, - remumu2: { - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num - 1; - }, - }, - }, - remumu3: { - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - }, - rezhixi: { - trigger: { - player: "useCard", - }, - forced: true, - filter: function (event, player) { - return ( - (event.card.name == "sha" || get.type(event.card) == "trick") && - player.countCards("h") > 0 - ); - }, - content: function () { - player.chooseToDiscard("h", true); - }, - ai: { - halfneg: true, - nokeep: true - }, - }, - //董白 - relianzhu: { - audio: "lianzhu", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - filterCard: true, - discard: false, - lose: false, - delay: false, - position: "he", - filterTarget: lib.filter.notMe, - check: function (card) { - var num = get.value(card); - if (get.color(card) == "black") { - if (num >= 6) return 0; - return 9 - num; - } else { - return 7 - num; - } - }, - content: function () { - "step 0"; - player.give(cards, target); - "step 1"; - if (get.color(cards[0], player) == "red") { - player.draw(); - event.finish(); - } else { - target - .chooseToDiscard( - "he", - 2, - "弃置两张牌,或令" + get.translation(player) + "摸两张牌" - ) - .set("goon", get.attitude(target, player) < 0) - .set("ai", function (card) { - if (!_status.event.goon) return -get.value(card); - return 6 - get.value(card); - }); - } - "step 2"; - if (!result.bool) player.draw(2); - }, - ai: { - order: 3, - expose: 0.2, - result: { - target: function (player, target) { - if (ui.selected.cards.length && get.color(ui.selected.cards[0]) == "red") { - if (target.countCards("h") < player.countCards("h")) return 1; - return 0.5; - } - return -1; - }, - }, - }, - }, - rexiahui: { - audio: "xiahui", - mod: { - ignoredHandcard: function (card, player) { - if (get.color(card, player) == "black") return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && get.color(card, player) == "black") return false; - }, - }, - trigger: { global: "phaseEnd" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - var target = event.player; - return ( - target != player && - target.countCards("h", function (card) { - return card.hasGaintag("rexiahui"); - }) == 0 && - target.getHistory("lose", function (evt) { - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("rexiahui")) return true; - } - }).length > 0 - ); - }, - content: function () { - trigger.player.loseHp(); - }, - group: "rexiahui_gain", - subSkill: { - gain: { - trigger: { global: "gainEnd" }, - forced: true, - popup: false, - filter: function (event, player) { - if (player == event.player) return false; - var evt = event.getl(player); - return ( - evt && - evt.cards2 && - evt.cards2.filter(function (card) { - return get.color(card, player) == "black"; - }).length > 0 - ); - }, - content: function () { - trigger.player.addSkill("rexiahui_block"); - var cards = trigger.getl(player).cards2.filter(function (card) { - return get.color(card, player) == "black"; - }); - trigger.player.addGaintag(cards, "rexiahui"); - }, - }, - block: { - mod: { - cardEnabled2: function (card) { - if (get.itemtype(card) == "card" && card.hasGaintag("rexiahui")) return false; - }, - cardDiscardable: function (card) { - if (card.hasGaintag("rexiahui")) return false; - }, - }, - charlotte: true, - forced: true, - popup: false, - trigger: { player: "changeHp" }, - filter: function (event, player) { - return event.num < 0; - }, - content: function () { - player.removeSkill("rexiahui_block"); - }, - onremove: function (player) { - player.removeGaintag("rexiahui"); - }, - }, - }, - }, - //周善 - dcmiyun: { - audio: 2, - trigger: { global: "roundStart" }, - forced: true, - direct: true, - group: "dcmiyun_lose", - content: function () { - "step 0"; - if (player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h")) { - player.chooseCardTarget({ - prompt: "密运:将包括“安”在内的任意张手牌交给一名其他角色", - forced: true, - filterTarget: lib.filter.notMe, - selectCard: [1, Infinity], - filterOk: function () { - for (var card of ui.selected.cards) { - if (card.hasGaintag("dcmiyun_tag")) return true; - } - return false; - }, - goon: game.hasPlayer( - (current) => player != current && get.attitude(player, current) > 0 - ), - ai1: function (card) { - if (get.itemtype(card) != "card") return 0; - if (card.hasGaintag("dcmiyun_tag")) return 100; - if (_status.event.goon) return 8 - get.value(card); - return -get.value(card); - }, - ai2: function (target) { - return get.attitude(_status.event.player, target); - }, - }); - } else event.goto(3); - "step 1"; - if (result.bool) { - var target = result.targets[0], - cards = result.cards; - player.logSkill("dcmiyun", target); - player.give(cards, target); - } else event.goto(3); - "step 2"; - player.drawTo(player.maxHp); - "step 3"; - if ( - game.hasPlayer( - (current) => current != player && current.countGainableCards(player, "he") - ) - ) { - player - .chooseTarget( - "密运:获得一名其他角色的一张牌,称为“安”", - true, - (card, player, target) => { - return target != player && target.countGainableCards(player, "he"); - } - ) - .set("ai", (target) => { - return get.effect( - target, - { name: "shunshou" }, - _status.event.player, - _status.event.player - ); - }); - } else event.finish(); - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dcmiyun", target); - player.gainPlayerCard(target, true, "visibleMove").chooseonly = true; - } else event.finish(); - "step 5"; - if (result.bool) { - player.gain(result.cards).gaintag.add("dcmiyun_tag"); - } - }, - mod: { - aiValue: function (player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("dcmiyun_tag")) - return Math.abs(num) * 10; - }, - aiUseful: function () { - return lib.skill.dcmiyun.mod.aiValue.apply(this, arguments); - }, - aiOrder: function (player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("dcmiyun_tag")) return 0; - }, - }, - subSkill: { - lose: { - audio: "dcmiyun", - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - filter: function (event, player) { - if (event.getParent().name == "dcmiyun") return false; - var evt = event.getl(player); - if (!evt || !evt.cards2 || !evt.cards2.length) return false; - if (event.name == "lose") { - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("dcmiyun_tag")) return true; - } - return false; - } - return player.hasHistory("lose", (evt) => { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("dcmiyun_tag")) return true; - } - return false; - }); - }, - content: function () { - player.loseHp(); - }, - }, - }, - }, - dcdanying: { - audio: 2, - mod: { - aiOrder: function (player, card, num) { - if ( - num <= 0 || - (card.name !== "sha" && card.name !== "shan") || - !player.hasCard((i) => i.hasGaintag("dcmiyun_tag"), "h") - ) - return; - return Math.max(0.12, num / 25); - }, - }, - locked: false, - enable: ["chooseToUse", "chooseToRespond"], - usable: 1, - hiddenCard: function (player, name) { - if ( - !_status.connectMode && - !player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h") - ) - return false; - return name == "sha" || name == "shan"; - }, - filter: function (event, player) { - if ( - event.type == "wuxie" || - !player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h") - ) - return false; - for (var name of ["sha", "shan"]) { - if (event.filterCard({ name: name, isCard: true }, player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var vcards = []; - for (var name of ["sha", "shan"]) { - var card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); - } - var dialog = ui.create.dialog("胆迎", [vcards, "vcard"], "hidden"); - dialog.direct = true; - return dialog; - }, - backup: function (links, player) { - return { - filterCard: () => false, - selectCard: -1, - viewAs: { - name: links[0][2], - isCard: true, - }, - popname: true, - precontent: function () { - player.logSkill("dcdanying"); - player.showCards( - player.getCards("h", (card) => card.hasGaintag("dcmiyun_tag")), - get.translation(player) + "的“安”" - ); - player.addTempSkill("dcdanying_discard"); - }, - }; - }, - prompt: function (links, player) { - return "展示“安”,然后视为使用【" + get.translation(links[0][2]) + "】"; - }, - }, - ai: { - order: function (item, player) { - var o1 = get.order({ name: "sha" }), - o2 = get.order({ name: "shan" }); - if (player.countCards("h") > 3 || player == _status.currentPhase) - return Math.max(o1, o2) + 0.1; - return Math.min(o1, o2) - 0.1; - }, - combo: "dcmiyun", - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - if (!player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h")) return false; - }, - result: { - player: 1, - }, - }, - subSkill: { - discard: { - trigger: { target: "useCardToTargeted" }, - charlotte: true, - forced: true, - filter: function (event, player) { - return player.countDiscardableCards(event.player, "he"); - }, - content: function () { - trigger.player.discardPlayerCard(player, "he", true); - player.removeSkill("dcdanying_discard"); - }, - ai: { - effect: { - target: function (card, player, target) { - if (_status._dcdanying_aiChecking) return; - _status._dcdanying_aiChecking = true; - let eff = get.effect(target, { name: "guohe_copy2" }, player, player); - delete _status._dcdanying_aiChecking; - return [1, get.sgn(eff)]; - }, - }, - }, - }, - }, - }, - //蔡阳 - dcxunji: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player && !player.getStorage("dcxunji_effect").includes(target); - }, - content: function () { - player.markAuto("dcxunji_effect", [target]); - player.addTempSkill("dcxunji_effect", { player: "die" }); - target.addTempSkill("dcxunji_mark", { player: "phaseEnd" }); - }, - ai: { - order: 1, - result: { - player: function (player, target) { - if (player.hp < 2) return 0; - return get.effect(target, { name: "juedou" }, player, player); - }, - }, - }, - subSkill: { - mark: { - mark: true, - marktext: "嫉", - intro: { content: "你已经被盯上了!" }, - }, - effect: { - audio: "dcxunji", - charlotte: true, - trigger: { global: "phaseJieshuBegin" }, - forced: true, - popup: false, - onremove: true, - filter: function (event, player) { - return player.getStorage("dcxunji_effect").includes(event.player); - }, - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - if ( - target.getHistory("useCard", (evt) => get.color(evt.card) == "black").length > - 0 && - player.canUse("juedou", target) - ) { - player.useCard({ name: "juedou", isCard: true }, target, "dcxunji_effect"); - } - "step 1"; - player.unmarkAuto("dcxunji_effect", [target]); - if (!player.storage.dcxunji_effect.length) player.removeSkill("dcxunji_effect"); - }, - group: "dcxunji_loseHp", - }, - loseHp: { - trigger: { source: "damageSource" }, - forced: true, - popup: false, - filter: function (event, player) { - return ( - event.card && - event.card.name == "juedou" && - event.getParent().skill == "dcxunji_effect" && - event.player.isIn() - ); - }, - content: function () { - trigger.player.line(player); - player.damage(trigger.num, trigger.player); - }, - }, - }, - }, - dcjiaofeng: { - audio: 2, - trigger: { source: "damageBegin1" }, - forced: true, - usable: 1, - filter: function (event, player) { - return player.isDamaged() && !player.getHistory("sourceDamage").length; - }, - content: function () { - var num = player.getDamagedHp(); - if (num > 0) player.draw(); - if (num > 1) trigger.num++; - if (num > 2) player.recover(); - }, - }, - //夏侯杰 - liedan: { - audio: 2, - trigger: { global: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return ( - (player != event.player || player.countMark("liedan") > 4) && - !player.hasSkill("zhuangdan_mark") - ); - }, - logTarget: "player", - content: function () { - if (player == trigger.player) { - player.die(); - return; - } - var num = 0; - if (player.hp > trigger.player.hp) num++; - if (player.countCards("h") > trigger.player.countCards("h")) num++; - if (player.countCards("e") > trigger.player.countCards("e")) num++; - if (num) { - player.draw(num); - if (num == 3 && player.maxHp < 8) player.gainMaxHp(); - } else { - player.addMark("liedan", 1); - player.loseHp(); - } - }, - intro: { content: "mark" }, - }, - zhuangdan: { - audio: 2, - trigger: { global: "phaseEnd" }, - forced: true, - filter: function (event, player) { - return player != event.player && player.isMaxHandcard(true); - }, - content: function () { - player.addTempSkill("zhuangdan_mark", { player: "phaseEnd" }); - }, - ai: { - combo: "zhuangdan", - }, - }, - zhuangdan_mark: { - mark: true, - marktext: "胆", - intro: { content: "我超勇的" }, - }, - //乌巢酒仙 - recangchu: { - audio: 2, - trigger: { global: "phaseBefore", player: "enterGame" }, - marktext: "粮", - forced: true, - filter: function (event, player) { - if (event.name == "phase" && game.phaseNumber != 0) return false; - return player.countMark("recangchu") < game.countPlayer(); - }, - content: function () { - player.addMark( - "recangchu", - Math.min(3, game.countPlayer() - player.countMark("recangchu")) - ); - }, - intro: { content: "mark", name: "粮" }, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("recangchu"); - }, - }, - group: ["recangchu2", "recangchu3"], - }, - recangchu2: { - audio: "recangchu", - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - forced: true, - usable: 1, - filter: function (event, player) { - return ( - player != _status.currentPhase && - player.countMark("recangchu") < game.countPlayer() && - event.getg(player).length > 0 - ); - }, - content: function () { - player.addMark("recangchu", 1); - }, - }, - recangchu3: { - audio: "recangchu", - trigger: { global: "die" }, - forced: true, - filter: function (event, player) { - return player.countMark("recangchu") > game.countPlayer(); - }, - content: function () { - player.removeMark("recangchu", player.countMark("recangchu") - game.countPlayer()); - }, - }, - reliangying: { - audio: 2, - trigger: { player: "phaseDiscardBegin" }, - filter(event, player) { - return player.hasMark("recangchu"); - }, - direct: true, - async content(event, trigger, player) { - const draws = Array.from({ length: player.countMark("recangchu") }).map( - (_, i) => get.cnNumber(i + 1) + "张" - ); - const { - result: { control }, - } = await player - .chooseControl(draws, "cancel2") - .set("prompt", get.prompt("reliangying")) - .set( - "prompt2", - "摸至多" + - get.cnNumber(player.countMark("recangchu")) + - "张牌,然后交给等量的角色各一张牌" - ) - .set("ai", () => { - const player = get.event("player"); - const num = Math.min( - player.countMark("recangchu"), - game.countPlayer((current) => get.attitude(player, current) > 0) - ); - if (num > 0) return get.cnNumber(num) + "张"; - return "cancel2"; - }); - if (control != "cancel2") { - player.logSkill("reliangying"); - const num = draws.indexOf(control) + 1, - max = Math.min( - num, - player.countCards("he"), - game.countPlayer((target) => target != player) - ); - await player.draw(num); - let list = []; - if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); - while (max - list.length > 0) { - const { - result: { bool, cards, targets }, - } = await player - .chooseCardTarget({ - prompt: - "粮营:将" + - get.cnNumber(max - 1) + - "至" + - get.cnNumber(max) + - "张牌交给其他角色", - position: "he", - 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) - .set("forced", max - list.length > 1); - 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"); - } - } - }, - }, - reshishou: { - audio: 2, - trigger: { player: ["useCard", "damageEnd"] }, - forced: true, - filter: function (event, player) { - if (!player.countMark("recangchu")) return false; - return event.name == "damage" - ? event.hasNature("fire") - : event.card && event.card.name == "jiu"; - }, - content: function () { - player.removeMark("recangchu", Math.min(player.countMark("recangchu"), trigger.num || 1)); - }, - ai: { - combo: "recangchu", - neg: true - }, - group: "reshishou2", - }, - reshishou2: { - audio: "reshishou", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return !player.countMark("recangchu"); - }, - content: function () { - player.loseHp(); - }, - }, - //曹性 - cxliushi: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("he", { suit: "heart" }) > 0; - }, - filterCard: { suit: "heart" }, - position: "he", - filterTarget: function (card, player, target) { - return player.canUse("sha", target, false); - }, - check: function (card) { - var player = _status.event.player; - var next = player.getNext(); - var att = get.attitude(player, next); - if (att > 0) { - var js = next.getCards("j"); - if (js.length) return get.judge(js[0]) + 10 - get.value(card); - return 9 - get.value(card); - } - return 6 - get.value(card); - }, - discard: false, - prepare: "throw", - loseTo: "cardPile", - visible: true, - insert: true, - content: function () { - game.log(player, "将", cards, "置于牌堆顶"); - player.useCard({ name: "sha", isCard: true }, false, targets).card.cxliushi = true; - }, - group: "cxliushi_damage", - subSkill: { - damage: { - trigger: { source: "damageSource" }, - forced: true, - popup: false, - filter: function (event, player) { - return ( - event.card && - event.card.cxliushi == true && - event.player.isIn() && - event.getParent(3).name == "cxliushi" - ); - }, - content: function () { - trigger.player.addMark("cxliushi2", 1); - trigger.player.addSkill("cxliushi2"); - }, - }, - }, - ai: { - order: function () { - return get.order({ name: "sha" }) - 0.4; - }, - result: { - target: function (player, target) { - var eff = get.effect(target, { name: "sha" }, player, target); - var damageEff = get.damageEffect(target, player, player); - if (eff > 0) return damageEff > 0 ? 0 : eff; - if ( - target.hasSkill("bagua_skill") || - target.hasSkill("rw_bagua_skill") || - target.hasSkill("bazhen") - ) - return 0; - return eff; - }, - }, - }, - }, - cxliushi2: { - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("cxliushi2"); - }, - }, - onremove: true, - charlotte: true, - intro: { - name2: "流", - content: "手牌上限-#", - }, - }, - zhanwan: { - audio: 2, - trigger: { global: "phaseDiscardEnd" }, - forced: true, - filter: function (event, player) { - return ( - event.player.hasSkill("cxliushi2") && - event.player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) return true; - }).length > 0 - ); - }, - logTarget: "player", - content: function () { - trigger.player.removeSkill("cxliushi2"); - var num = 0; - trigger.player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) - num += evt.cards2.length; - }); - player.draw(num); - }, - ai: { - combo: "cxliushi", - }, - }, - //说出吾名吓汝一跳 - xuxie: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - logTarget: function (event, player) { - return game - .filterPlayer(function (current) { - return get.distance(player, current) <= 1; - }) - .sortBySeat(); - }, - check: function (event, player) { - if (player.isHealthy()) return false; - var list = game.filterPlayer(function (current) { - return get.distance(player, current) <= 1; - }); - var draw = 0; - var discard = 0; - var num = 2 / player.getDamagedHp(); - while (list.length) { - var target = list.shift(); - var att = get.attitude(player, target); - if (att > 0) { - draw++; - if (target.countDiscardableCards(player, "he") > 0) discard--; - } - if (att == 0) { - draw--; - if (target.countDiscardableCards(player, "he") > 0) discard--; - } - if (att < 0) { - draw--; - if (target.countDiscardableCards(player, "he") > 0) discard++; - } - } - return draw >= num || discard >= num; - }, - content: function () { - "step 0"; - player.loseMaxHp(); - "step 1"; - var targets = game - .filterPlayer(function (current) { - return get.distance(player, current) <= 1; - }) - .sortBySeat(); - if (!targets.length) event.finish(); - else { - event.targets = targets; - player - .chooseControl() - .set("choiceList", [ - "弃置" + get.translation(targets) + "的各一张牌", - "令" + get.translation(targets) + "各摸一张牌", - ]) - .set("ai", function () { - var player = _status.event.player; - var list = _status.event.getParent().targets.slice(0); - var draw = 0; - var discard = 0; - while (list.length) { - var target = list.shift(); - var att = get.attitude(player, target); - if (att > 0) { - draw++; - if (target.countDiscardableCards(player, "he") > 0) discard--; - } - if (att < 0) { - draw--; - if (target.countDiscardableCards(player, "he") > 0) discard++; - } - } - if (draw > discard) return 1; - return 0; - }); - } - "step 2"; - event.index = result.index; - if (result.index == 1) { - game.asyncDraw(targets); - } else event.goto(4); - "step 3"; - game.delay(); - event.finish(); - "step 4"; - var target = targets.shift(); - if (target.countDiscardableCards(player, "he") > 0) - player.discardPlayerCard(target, "he", true); - if (targets.length) event.redo(); - }, - group: "xuxie_add", - }, - xuxie_add: { - audio: "xuxie", - trigger: { player: "phaseUseEnd" }, - forced: true, - locked: false, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.maxHp > player.maxHp; - }); - }, - content: function () { - player.gainMaxHp(); - player.chooseDrawRecover(2, true); - }, - }, - //新潘凤 - xinkuangfu: { - enable: "phaseUse", - usable: 1, - audio: 2, - delay: false, - filterTarget: function (card, player, target) { - if (player == target) - return ( - player.countCards("e", function (card) { - return lib.filter.cardDiscardable(card, player); - }) > 0 - ); - return target.countDiscardableCards(player, "e") > 0; - }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("e") > 0; - }); - }, - content: function () { - "step 0"; - if (player == target) player.chooseToDiscard("e", true); - else player.discardPlayerCard(target, "e", true); - "step 1"; - player.chooseUseTarget("sha", true, false, "nodistance"); - "step 2"; - var bool = game.hasPlayer2(function (current) { - return ( - current.getHistory("damage", function (evt) { - return evt.getParent("xinkuangfu") == event; - }).length > 0 - ); - }); - if (player == target && bool) player.draw(2); - else if (player != target && !bool) player.chooseToDiscard("h", 2, true); - }, - ai: { - order: function () { - return get.order({ name: "sha" }) + 0.3; - }, - result: { - target: function (player, target) { - var att = get.attitude(player, target); - var max = 0; - var min = 1; - target.countCards("e", function (card) { - var val = get.value(card, target); - if (val > max) max = val; - if (val < min) min = val; - }); - if (att > 0 && min <= 0) return target.hasSkillTag("noe") ? 3 : 1; - if (att <= 0 && max > 0) { - if (target.hasSkillTag("noe")) return max > 6 ? -max / 3 : 0; - return -max; - } - if (player === target && !player.hasSha()) { - let ph = player.countCards("h"); - if ( - game.hasPlayer((i) => { - if ( - !player.canUse("sha", i, true, true) || - get.effect(i, { name: "sha" }, player, player) <= 0 - ) - return false; - return ( - !ph || - !i.mayHaveShan( - player, - "use", - i.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) - ); - }) - ) - return 1; - } - return 0; - }, - }, - }, - }, - }, - card: {}, - characterIntro: { - dc_liuli: - "刘理(?—244年),字奉孝,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅、甘陵王刘永异母弟。章武元年(221年),刘备称帝,派司徒许靖封刘理为梁王。建兴八年(230年),改封为安平王。延熙七年(244年),刘理去世,谥号悼王。", - xingdaorong: - "邢道荣是《三国演义》中虚构的人物,为零陵太守刘度手下武将,被评价有万夫不当之勇,于《三国演义》第五十二回登场,被赵云刺死。", - caoxing: - "曹性,东汉末年吕布部将,史载他曾与身为自己上司的反叛者郝萌交战,并砍去郝萌一臂,受到吕布的嘉奖。在罗贯中所著古典小说《三国演义》中,也有关于曹性箭射夏侯惇左目的描述,而曹性也随即被暴怒的夏侯惇所杀。在穿越小说《三国之银河射手》中,主角穿越成为曹性,经过一番闯荡之后,被封为“银河射手”。", - xiahoujie: - "夏侯杰(?—208年),是罗贯中的小说《三国演义》中曹操的部将,征战时常常带在身边。在第42回长坂坡之战中,张飞大吼,从马儿受惊跌下马来而死。", - huaxin: "华歆(157年-232年1月30日),字子鱼,汉族。平原郡高唐县人(今山东省高唐县)。汉末至三国曹魏初年名士、重臣。华歆早年拜太尉陈球为师,与卢植、郑玄、管宁等为同门,又与管宁、邴原共称一龙,华歆为龙头。汉灵帝时华歆被举为孝廉,任郎中,因病去官。又被大将军何进征召为尚书郎。后任豫章太守,甚得民心。孙策率军南下,华歆举郡投降,被奉为上宾。官渡之战时,被征为议郎、参司空军事。入为尚书、侍中,又代荀彧为尚书令。丞相曹操讨孙权时,授华歆为军师。后为魏王国的御史大夫。曹丕即王位,拜华歆为相国,封安乐乡侯。曹魏建立后,其相国职名改称司徒。魏明帝即位,升任太尉,晋封博平侯。太和五年十二月(232年1月),华歆去世,年七十五,谥号“敬”。有文集三十卷,今佚失,其余见《全三国文》。", - luyusheng: - "陆郁生(?年-?),三国时期吴国官员陆绩之女。陆郁生的父亲陆绩是吴郡公认的才子,又是当时吴郡陆氏的领袖。陆绩赴任担任郁林太守,遂取此名。陆郁生年少的时候就定下坚贞的志向。建安二十四年(219年),陆绩早亡,她与两个兄弟陆宏、陆睿当时都只有几岁,一起返回吴县,被他们的从兄陆瑁接回抚养。13周岁的陆郁生嫁给同郡出身的张白为妻。出嫁3个月后,张白因为其兄张温一族的案件遭到连坐,被处以流刑,后死于流放地,陆郁生成为了寡妇,其后公开宣言不再改嫁,困难于生计但拒绝了所有提亲,在艰苦中从未停止服侍、照顾张白的姐妹。事情传到朝廷,皇帝褒奖陆郁生,号其为“义姑”。她的表侄姚信在文集中称赞她的义举。", - fengxi: "冯熙(?—223年),字子柔,颍川郡父城县(今河南省平顶山市宝丰县)人。汉末三国时期吴国官员,东汉初年名将冯异的后人。孙权担任车骑将军时,冯熙担任其幕府东曹掾,后迁立信都尉。刘备去世时,奉命进入蜀汉吊丧,返回后,任中大夫。后奉命出使魏国,受到魏文帝曹丕和尚书令陈群招揽,宁死不从,自尽未果。孙权闻之流泪,称其“东吴苏武”。最终在曹魏死去。", - heyan: "何晏(?-249年),字平叔。南阳郡宛县(今河南省南阳市)人。三国时期曹魏大臣、玄学家,东汉大将军何进之孙(一称何进弟何苗之孙)。何晏之父早逝,司空曹操纳其母尹氏为妾,他因而被收养,为曹操所宠爱。少年时以才秀知名,喜好老庄之学,娶曹操之女金乡公主。魏文帝在位时,未被授予官职。魏明帝认为何晏虚浮不实,也只授其冗官之职。大将军曹爽秉政时,何晏与之共事,得以累官至侍中、吏部尚书,典选举,封列侯。高平陵之变后,与大将军曹爽同为太傅司马懿所杀,被夷灭三族。何晏有文集十一卷,并曾与郑冲等共撰《论语集解》,今已佚。钟嵘《诗品》称“平叔鸿鹄之篇,风规见矣。”将何晏诗列入中品。袁宏在《名士传》中将何晏等称为正始名士。他与夏侯玄、王弼等倡导玄学,竞事清谈,遂开一时风气,为魏晋玄学的创始者之一。", - zhaoyan: - "赵嫣,生卒年不详。东吴方士(一说是丞相)赵达之妹,吴大帝孙权之妃,人称赵夫人。她心灵手巧,多才多艺,有“三绝”之称。孙权曾经想要找擅长绘画之人绘制山川地势军阵之图。赵达举荐了自己的妹妹。赵嫣认为水墨容易褪色,不方便在军旅之中保存。自己擅长刺绣,可以在锦帛上绣出孙权所需之图。待制作完成后献于孙权,只见方帛锦绣之上有五岳河海城邑行阵之形,孙权大为赞叹。时人谓之“针绝”。除刺绣之外,赵嫣还擅长绘画织锦,她能用彩丝织成云霞龙蛇之锦,大则盈尺,小则方寸,宫中谓之“机绝”。孙权在昭阳宫居住之时,饱受暑气之扰,以紫绡制成帷帐缓解暑气。赵嫣认为此物不足为贵,她削下自己的头发剖为细丝,以郁夷国出产的神胶连接,花了数月功夫将其制成一顶幔帐,打开之后薄如蝉翼,轻赛寒烟。放下帐帷能笼罩一丈之地,帐内清风自生暑意顿消。收起来则可纳入枕中,携带方便。时人谓之“丝绝”。", - wangtao: - "王桃是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王悦的姐姐,与妹妹都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。", - wangyue: - "王悦是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王桃的妹妹,与姐姐都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。", - zhangxuan: - "张嫙,三国时期孙吴将领张布之女,孙皓后妃张媱的姐姐。初为卫尉冯朝之子冯纯的妻子,后为孙皓后妃,册封左夫人。因孙皓诛灭张布,张媱口吐怨言,被暴怒的孙皓下令棒杀。后来孙皓怀念她的容颜,于是询问侍从:“张布还有女儿吗?”侍从回答:“张布的大女儿嫁给了已故卫尉冯朝的儿子冯纯。”于是孙皓夺走了冯纯的妻子张嫙,纳入宫中。孙皓颇为宠爱张嫙,册封其为左夫人。昼夜嬉戏,纸醉金迷,不理朝政。后来张嫙也去世了,孙皓非常悲伤,下令以最高的规格埋葬张嫙。因为悲伤过度,孙皓一度半年都不出宫门,甚至由于葬礼太过奢华被宫外之人认为孙皓已经死了。", - tengyin: - "滕胤(?-256年),字承嗣,三国时期吴国重臣,北海郡剧县(今山东省昌乐县)人。滕胤仪表堂堂,少时有节操,后娶公主为妻。孙权称王后,滕胤被封都亭侯。其后历任丹杨太守、吴郡太守、会稽太守。孙亮继位后,出任太常、卫将军。诸葛恪被杀后,群臣推举滕胤为司徒,但遭权臣孙峻党羽所阻挠,滕胤也有意避嫌,最终只晋爵高密侯。孙峻死后,由其堂弟孙綝执政。滕胤的连襟、骠骑将军吕据联系北伐前线诸将推举滕胤为相,希望分割孙綝权力,但并未成功,滕胤被改任大司马,镇守武昌。不久,滕胤与吕据密谋推翻孙綝,因计划泄露而被杀,惨遭灭族。孙綝被杀后,景帝孙休为滕胤平反。", - zhangyao: - "张美人,三国东吴末帝孙皓后妃,张布之女。另有张布女,张美人姊被孙皓立为左夫人。《吴书五妃嫔传第五》:江表传曰:皓以张布女为美人,有宠,皓问曰:“汝父所在?”答曰:“贼以杀之。”皓大怒,棒杀之。后思其颜色,使巧工刻木作美人形象,恒置座侧。问左右:“布复有女否?”答曰:“布大女适故卫尉冯朝子纯。”即夺纯妻入宫,大有宠,拜为左夫人,昼夜与夫人房宴,不听朝政,使尚方以金作华燧、步摇、假髻以千数。令宫人著以相扑,朝成夕败,辄出更作,工匠因缘偷盗,府藏为空。会夫人死,皓哀愍思念,葬于苑中,大作冢,使工匠刻柏作木人,内冢中以为兵卫,以金银珍玩之物送葬,不可称计。已葬之后,皓治丧於内,半年不出。国人见葬太奢丽,皆谓皓已死,所葬者是也。皓舅子何都颜状似皓,云都代立。临海太守奚熙信讹言,举兵欲还诛都,都叔父植时为备海督,击杀熙,夷三族,讹言乃息,而人心犹疑。", - xiahoulingnv: - "夏侯令女,字令女,名不详。生卒年不详,三国时期人物。夏侯文宁之女(《三国演义》中为夏侯令之女),曹文叔之妻。其事迹见于《三国志·魏书·诸夏侯曹传第九》裴松之注引皇甫谧《列女传》。而在《三国演义》中,由于作者断句错误,便认为“夏侯令女”是“夏侯令之女”之意(见《三国演义》第107回:“乃夏侯令女也”,由其语气可推断)。", - lvlingqi: - "吕玲绮,虚拟人物,源于日本光荣株式会社(现光荣特库摩公司)旗下游戏《真·三国无双》系列,初次登场于《真三国无双7:猛将传》。吕布的女儿,寂寥而威风凛凛的战姬,发挥着不亚于父亲的武艺,非常勇敢地身先士卒立于前线。虽然有着能够直面困难的坚强意志,却由于过去的经历而有着非常害怕孤独的一面。", - liuyong: - "刘永,字公寿,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅之弟。章武元年(221年)六月,封鲁王。建兴八年(230年),改封甘陵王。咸熙元年(264年),蜀汉灭亡,刘永被迁往洛阳,被任命为奉车都尉,封乡侯。", - wanniangongzhu: - "刘氏(生卒年不详),河南郡雒阳县(今河南省洛阳市)人,汉灵帝刘宏之女,汉少帝刘辩与汉献帝刘协的姐妹,封万年公主。", - mamidi: "马日磾(?~194年),字翁叔。扶风茂陵(今陕西省兴平市)人。东汉中后期大臣,经学大师马融之族孙(一作族子)。马日磾年轻时即继承马融学说,以才学入仕。曾任谏议大夫,与蔡邕、卢植等人东观典校官藏的《五经》记传,并参与续写《东观汉记》。后历任射声校尉、太尉、太常等职。初平三年(192年),掌权的李傕任命马日磾为太傅、录尚书事,与太仆赵岐共同出使关东。他到寿春袁术处后,对其多有所求,遭袁术轻鄙,袁术遂夺其符节,来随意征辟将士,并企图强迫马日磾任其军师,马日磾求去不能,忧愤发病,兴平元年(194年),卒于寿春。", - guanning: - "管宁(158年—241年),字幼安。北海郡朱虚县(今山东省安丘、临朐东南)人。汉末三国时期著名隐士。管宁与华歆、邴原并称为“一龙”。汉末天下大乱时,与邴原及王烈等人避于辽。在当地只谈经典而不问世事,做讲解《诗经》《书经》,谈祭礼、整治威仪、陈明礼让等教化工作,人们都很乐于接受他的教导。直到魏文帝黄初四年(公元223年)才返乡,辽东太守公孙恭亲自送别。此后曹魏几代帝王数次征召管宁,他都没有应命。正始二年(公元241年),管宁逝世,年八十四。著有《氏姓论》。", - tenggongzhu: - "滕公主,名讳不详,三国人物,吴大帝孙权之女。一说为养女,生父为孙权堂弟孙奂。黄武年间(222年—228年),以公主身份下嫁功臣滕胄之子滕胤,当时滕胤年仅20岁。滕胤皮肤白皙,容貌俊美,每逢入朝大臣们没有不惊叹称羡的。滕胤仕官后,上书言及时局,又对政策多有匡弼。孙权对公主也特别宠爱,因为滕胤的缘故,又格外增加对公主的赏赐,又几次探望慰劳。少帝孙亮时期,孙綝以宗室身份独揽大权作恶多端,引发群臣不满。五凤三年(256年)滕胤与连襟吕据密谋推翻孙綝,事败遭到夷三族 。公主则被亲兄孙壹救出,携其逃亡曹魏。", - caimaozhangyun: - "蔡瑁,字德珪,生卒年不详。襄阳蔡州人,东汉末年荆州名士。少年时与曹操交好。初平元年(公元190年),刘表为荆州刺史。时宗贼猖獗,蔡瑁协助刘表诛杀宗贼,平定荆州之地,蔡瑁因此得刘表重用,并在刘表任镇南将军时担任他的军师。刘表病亡后,蔡瑁拥护刘表幼子刘琮继位,并逼迫他投降南征的曹操。蔡瑁在曹操麾下历任从事中郎、司马、长水校尉,受封汉阳亭侯。张允,生卒年不详,荆州牧刘表的外甥,与蔡瑁一样是刘表幼子刘琮的党羽。刘表病重之时,张允害怕刘表会把州牧之位传给长子刘琦,于是将远赴而来的刘琦阻于门外,不准他与刘表相见。曹操大军到达新野时,张允也随蔡瑁一同投降曹操。之后便隐没于历史之中,并无记载。在《三国演义》中,蔡瑁张允擅长水战,是东吴心腹大患。周瑜用反间计诱骗曹操除掉二人,使得曹军再无能够统领水军的大将。", - zhangxun: - "张勋,东汉末年军阀袁术帐下大将,袁术称帝后受封大将军。初平四年(公元193年),袁术引兵入陈留,被曹操、袁绍合力击败,逃至雍丘。后入九江,杀死扬州刺史陈温而自领之,并任命张勋、桥蕤为大将。时孙策依附于袁术,被表为怀义校尉,张勋对其倾心敬服。袁术称帝后,任命张勋为大将军,攻打吕布,大败而还。其后曹操又以袁术称帝为名南下进攻,袁术闻之大惊,即走度淮,留张勋、桥蕤守蕲阳以拒曹。曹操破其军,斩桥蕤,张勋退走。建安四年(公元199年),袁术病死,张勋率残军欲南投孙策,途中被袁术旧部刘勋俘虏,其后下落不明。", - huzhao: "胡昭(162年-250年),字孔明,颍川(治今河南禹州)人。汉末三国时期隐士、书法家。胡昭善长隶书,与钟繇、邯郸淳、卫觊、韦诞齐名。有“钟氏小巧,胡氏豪放”之说,世人并称“钟胡”。", - guanhai: - "管亥(生卒年不详),青州黄巾军渠帅,率军侵略北海,围北海相孔融于都昌。孔融派遣太史慈突围而出,前往平原向刘备求援,刘备率军来到,击退管亥。《三国演义》中管亥在单挑中为关羽斩杀。", - yinfuren: - "尹夫人,原汉大将军何进的儿媳,丈夫早逝,生有一子何晏。曹操任司空时娶尹氏为妾,一并收养何晏,并生有一子曹矩。", - chengui: - "陈珪(生卒年不详),一作圭,字汉瑜。徐州下邳(治今江苏睢宁西北)人,广汉太守陈亹之孙,太尉陈球之侄,吴郡太守陈瑀(一作陈璃)、汝阴太守陈琮的从兄,陈登、陈应之父。官至沛相。", - wanglie: - "王烈,字彦方(141-219),平原县(今山东德州平原)人。生于永和六年(公元141年),卒于建安二十三年(公元218年)。王烈少时师从陈寔,闻名遐迩。董卓作乱时避乱辽东,并多次拒绝曹操的聘请。七十八岁时病死于辽东。", - panghui: - "庞会,(214—?),三国时期曹魏名将,庞德之子。曹丕即位后,思庞德忠烈,遂赐庞会等兄弟四人爵关内侯,邑各百户。庞会勇烈,有先父之风,官至中尉将军,封列侯。", - chenjiao: - "陈矫(?-237年7月11日),字季弼,广陵郡东阳县(治今安徽省天长市西北,今地属江苏省如皋市)人。三国时期曹魏名臣。陈矫本姓刘,因过继与母族而改姓陈。早年避乱江东,后广陵太守陈登请为功曹。曹操辟为丞相掾属,迁任相县令,转任征南长史。又为彭城、乐陵太守,迁任魏郡西部都尉。曹操东征,拜丞相长史,转西曹属、尚书。曹丕称帝,领吏部事,封高陵亭侯,迁尚书令。明帝继位后,进爵东乡侯,后转侍中,加光禄大夫,又拜司徒。景初元年(237年),陈矫去世,谥贞侯。", - gongsundu: - "公孙度 (?-204年),字升济,辽东襄平(今辽宁辽阳)人,东汉末年辽东太守。少随父迁居玄菟郡。初为玄菟小吏,建宁二年(169年),继升尚书郎、冀州刺史,后被免官。初平元年(190年),经同乡徐荣推荐,被董卓任命为辽东太守。公孙度到任后,厉行严刑峻法,打击豪强势力,使令行政通,羽翼渐丰。不久,中原地区董卓乱起,各地军阀无暇东顾。公孙度趁机自立为辽东侯、平州牧。继则东伐高句丽,西击乌桓,南取辽东半岛,越海取胶东半岛北部东莱诸县,开疆扩土;又招贤纳士,设馆开学,广招流民,威行海外,俨然以辽东王自居。建安九年(204年)病逝,子公孙康继承其位由于公孙度的锐意进取和苦心经营,使辽东地区在汉末三国的战乱年代,获得了暂时的安宁,推动了当地生产技术和封建文化的发展。", - leibo: "雷薄(生卒年不详),本为东汉末年袁术麾下部将。离开称帝后昏庸奢侈的袁术,与陈兰一起占据嵩山为山贼。后来袭击兵败的袁术,抢夺财宝。同时在《三国演义》中也有出场。", - liupi: "刘辟,东汉末年黄巾起义军将领。黄巾军将领。黄巾之乱后,与龚都一起率军盘踞在汝南。欲追随刘备,将汝南让给刘备。《三国演义》中,在与曹操的部将高览交战时,为保护刘备而战死。", - zhenghun: - "郑浑(生卒年不详),字文公。开封(今河南省开封市)人。汉末及三国时期曹魏大臣,东汉名儒郑众曾孙、名士郑泰之弟。郑浑早年避乱淮南,后转投豫章太守华歆。又被曹操辟为掾属,历任下蔡县长、邵陵县令,任内颇有政绩,深得民心。任左冯翊时,击杀扰乱郡县的梁兴,又击败作乱的山贼。历任上党太守、京兆尹、丞相掾属等职。曹丕称帝后,拜侍御史,加驸马都尉。先后任阳平、沛郡太守,任内兴修水利,使农田常年丰收,被百姓称为“郑陂”。后转任山阳和魏郡太守。魏明帝曹叡听闻郑浑的事迹之后,下诏将其政绩布告天下。官至将作大匠。卒年不详。", - furongfuqian: - "傅肜(?-222年),义阳(今湖北枣阳)人,三国时蜀汉将领。刘备攻伐吴国时,傅肜为别督。后刘备被陆逊击败,傅肜率部断后,奋战至死。死前怒斥道:“吴狗!何有汉将军降者!”
    傅佥[qiān] ( ? ~263年),义阳(治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。", - qinlang: - "秦朗(生卒年不详),字元明,小字阿蘇(一作阿鳔),新兴(治今山西忻州)云中人。三国时期曹魏将领,官至骁骑将军、给事中,曾率兵讨伐鲜卑轲比能和步度根的叛军。", - xianglang: - "向朗(约167年—247年),字巨达。襄阳郡宜城县(今湖北宜城)人,三国时期蜀汉官员、藏书家、学者。向朗早年师从于司马徽,并被荆州牧刘表任命为临沮县长。后随刘备入蜀,历任巴西、牂牁、房陵太守,并拜步兵校尉,领丞相长史,随丞相诸葛亮北伐。因包庇马谡被免职,后为光禄勋,转左将军、特进,封显明亭侯。曾代理丞相册封张皇后及太子刘璿。晚年专心研究典籍,诱导青年学习,家中藏书丰富,受到举国尊重。延熙十年(247年),向朗去世。《全三国文》收录有一篇《遗言戒子》", - yuantanyuanxiyuanshang: - "袁谭、袁尚的武将介绍请移步「袁谭袁尚」,此处为袁熙的介绍。
    袁熙(?-207年),字显奕(《后汉书》、《东光世系》作显雍),汝南郡汝阳县(今河南商水)人,是东汉末年占据河北的军阀袁绍次子,袁绍打败公孙瓒后,令袁熙为幽州刺史。袁绍官渡兵败后不久病死,其兄长袁谭、弟弟袁尚各自独立,互相攻伐,曹操趁机进攻袁谭、袁尚,并逐渐占河北。袁熙接纳兵败的袁尚后,因为属下叛变而逃往乌桓,被曹操击败后,逃往辽东太守公孙康帐下,却被公孙康杀死,二人首级被献给曹操。", - zhanghu: - "张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。张辽之子,三国时期曹魏武将。官至偏将军,封晋阳侯,有一子张统。", - mengjie: - "孟节,南中蛮王孟获之兄。是小说《三国演义》中杜撰的人物,史上并无记载。诸葛亮南征孟获之时,帐下军士因误饮哑泉之水失语。当地山神告知诸葛亮,言万安溪畔有一高士隐居彼处,号“万安隐者”。其草庵后有一泉,名安乐泉,可解哑泉之毒。庵前生有一草,名薤叶芸香,可防瘴气之染。诸葛亮于是带人连夜前往其隐居之处,求得泉水草叶解毒防瘴,拜求隐士姓名,方知其名为孟节,由此而叹:“方信盗跖、下惠之事,今亦有之。”诸葛亮欲申奏刘禅,立其为王,孟节辞之。又以金帛赠之,孟节坚辞不受。诸葛亮嗟叹不已,拜别而回。", - peiyuanshao: - "裴元绍,《三国演义》人物,原黄巾军之武将。黄巾起义失败之后,与周仓一同率领残部在山中落草当山贼。公元200年,在关羽欲返刘备旗下,在突破曹操的五道关卡后路过其落草之地,与周仓一同向关羽要求能以期成为关羽家臣。但此时仅周仓同行,其他弟兄则于山中等待。不久后,因其欲夺偶然路过的赵云之马,反遭讨伐战败身死。", - zhangchu: - "张楚,《阵面对决》第九弹“燎原”中登场的一个原创人物。她是张角的女儿,张宁的姐姐,在逃亡途中被刘备捕获。之后在诸葛亮的建议下,张楚被囚禁。在《阵面对决》的“怒焰”故事线中,张楚随着刘备入了西川,并被软禁在成都。夷陵之战后,刘备大败,全国主力外出用以支援刘备,朝内空虚,张楚趁机逃跑。", - dongwan: "董绾,袁术老婆,嫉妒冯芳女的美貌,与冯方女有矛盾。", - yuanyin: - "袁胤(生卒年不详),东汉末期人物,据说是袁隗之子,是袁术从弟。兴平二年(公元195年)被袁术任命为丹杨太守,后因孙策平定江东被逐。建安四年(公元199年),袁术卒,袁胤因畏惧曹操,遂率领袁术部曲并带着其灵柩及妻子到皖城并投奔庐江太守刘勋。6个月后皖城被孙策所破,袁胤等人迁居吴郡,此后事迹不详。", - gaoxiang: - "高翔(又作高详、高祥)(生卒年不详),荆州南郡(治今湖北省公安县)人,三国时期蜀汉将领。曾随刘备攻打汉中,后又随蜀汉丞相诸葛亮参加北伐曹魏的战争。建兴九年(公元231年)的北伐中大破司马懿。官至杂号大将军(即某杂号将军加大,但无考何杂号将军),封玄乡侯。此后,关于高翔的记载不详。", - zhoushan: - "周善,《三国演义》中人物,不见于正史记载。为吴侯孙权的家将,此人最有胆量,自幼穿房入户,多随孙策。权为骗其妹回吴,遣善将五百人,扮为商人,分作五船;更诈修国书,以备盘诘;船内暗藏兵器。周善领命,往荆州。正骗得孙夫人带刘禅上船,赵云前来抢走禅,周善在后梢挟住舵,只顾放船下水。正僵持时张飞赶到,周善见张飞上船,提刀来迎,被张飞手起一剑砍倒,提头掷于孙夫人前。", - zhangkai: - "张闿,陶谦的手下都尉。奉命截杀曹操之父曹嵩,杀死曹嵩,夺去财宝逃往淮南投奔袁术,并担任刺杀陈王刘宠和陈国相骆俊的任务。", - mengyou: - "孟优,《三国演义》里的人物,南蛮王孟获之弟。与诸葛亮的南征军交战,向败战的兄长推荐朵思大王,劝兄长借助朵思之力与蜀汉军对抗。后来与兄长一起发誓归顺蜀汉。", - liuchongluojun: - "刘宠(?~197年),汉明帝刘庄玄孙,陈敬王刘羡曾孙,陈顷王刘崇之孙,陈孝王刘承之子,陈国第六位国君,也是东汉陈国的最后一位国君。骆俊(?-197),字孝远,东汉末年扬州会稽郡乌伤县(今浙江义乌)人。宗室陈王刘宠的国相,在任期间励精图治,深得民众爱戴。刘宠勇猛过人,善使弓弩,箭法高超。在其父刘承死后,继承陈王爵位。中平年间,黄巾军起义,郡县官兵都弃城逃走,刘宠于是征兵自守卫。当时天下饥荒,诸王侯都已不再享有租赋,反屡遭抢掠,有的甚至流离在外,死于荒野。只有陈国仍很富强,邻郡百姓纷纷前去投靠,陈国拥有部众达十余万人。初平元年(190年),各州郡起兵讨伐董卓,刘宠率军屯驻阳夏,自称辅汉大将军。建安二年(197年),袁术向陈国求取粮草,遭陈国国相骆俊拒绝,袁术大为生气,便派刺客张闿假装路过陈国,乘机杀死骆俊和刘宠。", - yuechen: - "乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。", - kuaiqi: "蒯祺(?~219年),南郡中卢人,荆州望族子弟,与荆州牧刘表帐下谋士蒯良、蒯越为同族,东汉末年房陵太守。建安二十四年(219年),汉中王刘备遣宜都太守孟达从秭归北攻房陵,蒯祺于战斗中被孟达所部士兵所杀。清朝任兆麟《心斋十种》中的《襄阳记》辑本引用《万历襄阳府志》“(蒯)钦从祖祺妇,即诸葛孔明之姊也”,称蒯祺娶故兖州泰山郡丞诸葛珪长女,即他是知名政治家、蜀汉丞相诸葛亮的姐夫。但在任兆麟之前的《襄阳记》辑本中,并没有这一条。", - pangshanmin: - "庞山民,荆州襄阳人,三国时期曹魏大臣。庞山民出身荆州庞氏,为隐士庞德公之子、凤雏庞统的堂兄,娶诸葛亮二姐诸葛氏(“若雪”为网络小说虚构)为妻。后出仕曹魏,历任黄门、吏部郎等职。", - gongsunxiu: - "公孙修(?-238),三国时期人物,公孙渊之子。景初元年(237年),魏明帝曹叡派出幽州刺史毌丘俭攻打公孙渊,久战不利回师。公孙渊即自立为燕王,改元绍汉,引诱鲜卑侵扰北方,背叛曹魏。景初二年(238年)春,曹魏又派司马懿和高句丽国王高位宫率军攻打公孙渊,围城日久,公孙渊粮尽之后,与儿子公孙修一起出逃后被擒获,父子二人同时被斩首示众。", - }, - characterTitle: {}, - characterFilter: {}, - dynamicTranslate: { - cuijian: function (player) { - return ( - "出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你" + - (player.hasMark("zhtongyuan_basic") ? "" : ",然后你交给其等量的牌") + - "。" + - (player.hasMark("zhtongyuan_trick") ? "若其手牌中没有【闪】,则你摸两张牌。" : "") - ); - }, - dunshi: function (player) { - var info = player.storage.dunshi; - var str = "每回合限一次。你可以视为使用或打出一张"; - var list = ["sha", "shan", "tao", "jiu"]; - for (var i of list) { - var strx = "【" + get.translation(i) + "】"; - if (info && !info[0].includes(i)) - strx = '' + strx + ""; - str += strx; - if (i != "jiu") str += "/"; - } - str += - ",然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。"; - return str; - }, - dcporui: function (player) { - return ( - "每轮限" + - (player.hasMark("dcgonghu_basic") ? "两" : "一") + - "次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】" + - (player.hasMark("dcgonghu_damage") ? "" : ",然后你交给其X张手牌") + - "(X为其本回合失去的牌数且至多为5)。" - ); - }, - dcmanwang: function (player) { - var num = 4 - player.countMark("dcmanwang"); - var str = "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:"; - var list = ["⒈获得〖叛侵〗。", "⒉摸一张牌。", "⒊回复1点体力。", "⒋摸两张牌并失去〖叛侵〗。"]; - for (var i = 0; i < 4; i++) { - if (i == num) { - str += ''; - } - str += list[i]; - } - if (num < 4) str += ""; - return str; - }, - dcjianzhuan(player) { - let str = "锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:"; - const list = [ - "⒈令一名角色弃置X张牌", - ";", - "⒉摸X张牌", - ";", - "⒊重铸X张牌", - ";", - "⒋弃置X张牌", - ], - info = get.info("dcjianzhuan").choices, - storage = player.getStorage("dcjianzhuan"); - let choices = []; - for (const k in info) choices.push(k); - for (let i = 0; i < list.length; i++) { - const j = i / 2, - goon = Array.from({ length: list.length }) - .map((_, i) => i) - .includes(j); - if (goon && storage.includes(choices[j])) - str += ''; - str += list[i]; - if (goon && storage.includes(choices[j])) str += ""; - } - return ( - str + - "(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。" - ); - }, - }, - perfectPair: {}, - characterReplace: { - dongbai: ["dongbai", "re_dongbai", "jsrg_dongbai"], - chunyuqiong: ["chunyuqiong", "re_chunyuqiong", "jsrg_chunyuqiong"], - kanze: ["kanze", "re_kanze"], - chendeng: ["ol_chendeng", "re_chendeng", "chendeng", "jsrg_chendeng"], - miheng: ["re_miheng", "miheng"], - liuba: ["ol_liuba", "dc_liuba", "liuba"], - lvkuanglvxiang: ["lvkuanglvxiang", "dc_lvkuanglvxiang"], - dc_huangquan: ["xf_huangquan", "dc_huangquan"], - yuejiu: ["dc_yuejiu", "yuejiu"], - jiling: ["dc_jiling", "tw_jiling", "jiling"], - sp_jiaxu: ["sp_jiaxu", "dc_sp_jiaxu", "yj_jiaxu"], - qiaorui: ["qiaorui", "tw_qiaorui"], - mamidi: ["mamidi", "xin_mamidi"], - mengyou: ["mengyou", "ns_mengyou"], - zhangchu: ["zhangchu", "jsrg_zhangchu"], - xianglang: ["xianglang", "mb_xianglang"], - chengui: ["chengui", "mb_chengui"], - liuyong: ["liuyong", "jsrg_liuyong"], - zhangxuan: ["zhangxuan", "jsrg_zhangxuan"], - gaoxiang: ["gaoxiang", "jsrg_gaoxiang"], - lingcao: ["lingcao", "dc_lingcao"], - sp_menghuo: ["sp_menghuo", "dc_sp_menghuo"], - sunchen: ["dc_sunchen", "pe_sunchen"], - }, - translate: { - re_panfeng: "潘凤", - xinkuangfu: "狂斧", - xinkuangfu_info: - "出牌阶段限一次,你可选择:1,弃置装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】造成伤害,你摸两张牌。2,弃置一名其他角色装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】未造成伤害,你弃置两张手牌。(均无距离和次数限制)", - xingdaorong: "邢道荣", - xuxie: "虚猲", - xuxie_info: - "出牌阶段开始时,你可以减1点体力上限并选择所有距离1以内的角色,弃置这些角色的各一张牌或令这些角色各摸一张牌。出牌阶段结束时,若你的体力上限不为全场最多,则你加1点体力上限,然后回复1点体力或摸两张牌。", - caoxing: "曹性", - cxliushi: "流矢", - cxliushi2: "流矢", - cxliushi_info: - "出牌阶段,你可以将一张红桃牌置于牌堆顶,视为对一名角色使用一张【杀】(无距离限制且不计入使用次数)。当此【杀】造成伤害后,受到伤害的角色获得一个“流”。有“流”的角色手牌上限-X(X为其“流”数)。", - zhanwan: "斩腕", - zhanwan_info: "锁定技,有“流”的角色于弃牌阶段弃牌后,你摸等量的牌,然后其移去所有的“流”。", - re_chunyuqiong: "淳于琼", - recangchu: "仓储", - recangchu2: "仓储", - recangchu3: "仓储", - recangchu_info: - "锁定技。①游戏开始时,你获得3个“粮”。你的手牌上限+X(X为“粮”数)。②每回合限一次,当你于回合外得到牌后,你获得一个“粮”。(你的“粮”数不能超过存活角色数)", - reliangying: "粮营", - reliangying_info: - "弃牌阶段开始时,你可以摸至多X张牌,然后交给等量的角色各一张牌。(X为你的“粮”数)", - reshishou: "失守", - reshishou2: "失守", - reshishou_info: - "锁定技,当你使用【酒】时或受到1点火焰伤害后,你移去一个“粮”。准备阶段,若你没有“粮”,你失去1点体力。", - xiahoujie: "夏侯杰", - liedan: "裂胆", - liedan_info: - "锁定技,其他角色的准备阶段开始时,若X大于0,则你摸X张牌。若X等于3,则你加1点体力上限(至多加到8)。若X为0,则你失去1点体力并获得一枚“裂”(X为你的手牌数,体力值,装备区牌数中大于其的数量)。准备阶段,若“裂”数大于4,则你死亡。", - zhuangdan: "壮胆", - zhuangdan_mark: "壮胆", - zhuangdan_info: - "锁定技,其他角色的回合结束时,若你的手牌数为全场唯一最多,则你令〖裂胆〗失效直到你下回合结束。", - dc_caiyang: "蔡阳", - dcxunji: "寻嫉", - dcxunji_info: - "出牌阶段限一次,你可以选择一名其他角色。该角色的下个结束阶段开始时,若其此回合使用过黑色牌,则你视为对其使用一张【决斗】,且当此【决斗】对其造成伤害后,其对你造成等量的伤害。", - dcjiaofeng: "交锋", - dcjiaofeng_info: - "锁定技。每回合限一次,当你造成伤害时,若你本回合内未造成过其他伤害且你已损失的体力值:大于0,则你摸一张牌;大于1,则此伤害+1;大于2,则你回复1点体力。", - zhoushan: "周善", - dcmiyun: "密运", - dcmiyun_tag: "安", - dcmiyun_info: - "锁定技。①一轮游戏开始时,你依次执行:1.若你有“安”,你将包括“安”的在内的任意张手牌交给一名其他角色,然后你将手牌补至体力上限;2.你正面向上获得一名其他角色的一张牌,称为“安”。②当你不因〖密运①〗失去“安”后,你失去1点体力。", - dcdanying: "胆迎", - dcdanying_info: - "每回合限一次。你可以展示“安”,然后视为使用或打出一张【杀】或【闪】。然后当你于本回合下一次成为牌的目标后,使用者弃置你的一张牌。", - re_sunluyu: "孙鲁育", - remeibu: "魅步", - remeibu_info: - "其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌A,该角色于本阶段内拥有〖止息〗,且当其因〖止息〗弃置与牌A花色相同的牌时,你获得之。", - rezhixi: "止息", - rezhixi_info: "锁定技,当你使用【杀】或普通锦囊牌时,你弃置一张手牌。", - remumu: "穆穆", - remumu_info: - "出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌,然后你本回合可使用【杀】的次数+1;2.获得一名角色装备区里的一张牌,然后你本回合可使用【杀】的次数-1。", - re_dongbai: "董白", - relianzhu: "连诛", - relianzhu_info: - "出牌阶段限一次,你可将一张牌正面朝上交给一名其他角色。若此牌为:红色,你摸一张牌;黑色,对方弃置两张牌或令你摸两张牌。", - rexiahui: "黠慧", - rexiahui_info: - "锁定技,①你的黑色牌不计入手牌上限。②当有其他角色获得你的黑色牌后,其于下次扣减体力前不能使用,打出,弃置这些牌。③一名其他角色的回合结束时,若其本回合失去过其所有“黠慧”牌,则其失去1点体力。", - heyan: "何晏", - yachai: "崖柴", - yachai_info: - "当你受到伤害后,你可令伤害来源选择一项:①其本回合不能再使用手牌,然后你摸两张牌;②其展示所有手牌,然后将其手牌中一种花色的所有牌交给你;③弃置一半数量的手牌(向上取整)。", - qingtan: "清谈", - qingtan_info: - "出牌阶段限一次,你可令所有有手牌的角色同时选择一张手牌并同时展示。你可以获得其中一种花色的牌,然后展示此花色牌的角色各摸一张牌。若如此做,弃置其他的牌。", - zhaoyan: "赵嫣", - jinhui: "锦绘", - jinhui_info: - "出牌阶段限一次,你可以随机亮出牌堆中的三张不具有“伤害”标签且使用目标范围为“自己”或“一名角色”的牌,然后选择一名其他角色。该角色选择并按如下“锦绘”规则使用其中一张,然后你可以按如下“锦绘”规则使用剩余的任意张牌:若此牌的使用目标为“自己”,则对自己使用该牌,否则对对方使用该牌(无距离限制且不计入次数限制)。", - qingman: "轻幔", - qingman_info: "锁定技。一名角色的回合结束时,你将手牌摸至X张(X为其装备区中空栏的数量)。", - wangtao: "王桃", - wangyue: "王悦", - huguan: "护关", - huguan_info: - "一名角色于出牌阶段内使用第一张牌时,若此牌为红色,则你可以声明一种花色。该花色的牌不计入其本回合的手牌上限。", - yaopei: "摇佩", - yaopei_info: - "其他角色的弃牌阶段结束时,若你本回合内对其发动过〖护关〗,则你可以弃置一张与其于此阶段弃置的牌花色均不相同的牌。然后你选择一项:①其摸两张牌,你回复1点体力。②其回复1点体力,你摸两张牌。", - mingluan: "鸣鸾", - mingluan_info: - "其他角色的结束阶段开始时,若有角色于本回合内回复过体力,则你可以弃置任意张牌,然后摸X张牌(X为当前角色的手牌数,且至多摸至5张)。", - zhangxuan: "张嫙", - tongli: "同礼", - //tongli_info:'当你于出牌阶段内不因〖同礼〗而使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内不因〖同礼〗而使用过的牌数相等,则你可以于此牌结算结束后依次视为对此牌的所有目标使用X张名称和属性相同的牌(X为你手牌中的花色数)。', - tongli_info: - "当你于出牌阶段内使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内使用过的牌数相等,则你可以令此牌额外结算X次(X为你手牌中的花色数)。", - shezang: "奢葬", - shezang_info: - "每轮限一次。当你或你回合内的其他角色进入濒死状态时,你可以从牌堆中获得每种花色的牌各一张。", - tengyin: "滕胤", - chenjian: "陈见", - chenjian_info: - "准备阶段,你可亮出牌堆顶的3+X张牌(X为你“陈见”标记的数量且至多为2),然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌。", - xixiu: "皙秀", - xixiu_info: - "锁定技。①当你成为其他角色使用牌的目标时,若你的装备区内有和此牌花色相同的牌,则你摸一张牌。②若你装备区内的牌数为1,则其他角色不能弃置你装备区内的牌。", - zhangyao: "张媱", - yuanyu: "怨语", - yuanyu_info: - "出牌阶段限一次。你可以摸一张牌,然后选择一张手牌和一名其他角色。该角色获得如下效果直到你发动〖夕颜〗:{你与该角色的弃牌阶段开始时,或当该角色造成1点伤害后,其须将一张手牌作为“怨”置于你的武将牌上}。然后你将你选择的手牌作为“怨”置于你的武将牌上。", - xiyan: "夕颜", - xiyan_info: - "当有牌作为“怨”移动到你的武将牌上后,若“怨”中的花色数达到4种,则你可以获得所有“怨”。然后若当前回合角色:是你,你本回合手牌上限+4且使用牌无次数限制且重置你的〖怨语〗于此阶段的发动次数;不是你,你可令当前回合角色本回合手牌上限-4且不能使用基本牌。", - xiahoulingnv: "夏侯令女", - fuping: "浮萍", - fuping_info: - "①其他角色对你使用的牌结算结束后,若你未因此技能记录过此牌的名称且你有未废除的装备栏,则你可以废除一个装备栏,记录此牌的名称。②每回合每种牌名限一次。你可以将一张非基本牌当做〖浮萍①〗记录过的基本牌或锦囊牌使用或打出。③若你的所有装备栏均已被废除,则你使用牌无距离限制。", - weilie: "炜烈", - weilie_info: - "每局游戏限X次。出牌阶段,你可以弃置一张牌并选择一名已受伤的角色,令该角色回复1点体力。然后若其体力值小于体力上限,则其摸一张牌(X为你〖浮萍①〗中的记录数+1)。", - dc_sunru: "孙茹", - xiecui: "撷翠", - xiecui_info: - "当有角色于回合内第一次因执行牌的效果而造成伤害时,你可以令此伤害+1。若其势力为吴,则该角色获得此伤害牌对应的实体牌,且其本回合的手牌上限+1。", - youxu: "忧恤", - youxu_info: - "一名角色A的回合结束时,若其手牌数大于体力值,则你可以展示A的一张牌,然后将此牌交给另一名角色B。若B的体力值为全场最少,则B回复1点体力。", - huaxin: "华歆", - wanggui: "望归", - wanggui_info: - "每回合限触发一次,当你造成或受到伤害后,若你:仅明置了此武将牌,则你可对与你势力不同的一名角色造成1点伤害;武将牌均明置,则你可令与你势力相同的角色各摸一张牌。", - spwanggui: "望归", - spwanggui_info: - "①当你受到伤害后,你可以摸一张牌,或和一名势力相同的其他角色各摸一张牌;②每回合限一次,当你造成伤害后,你可以对一名与你势力不同的角色造成1点伤害。", - xibing: "息兵", - xibing_info: - "当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸至五张)且本回合不能再使用手牌。", - xibing_info_guozhan: - "当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸至五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。", - luyusheng: "陆郁生", - zhente: "贞特", - zhente2: "贞特", - zhente_info: - "每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用与此牌颜色相同的牌;2.此牌对你无效。", - zhente_info_guozhan: - "每回合限一次,当你成为其他角色使用黑色基本牌或黑色普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用黑色牌;2.此牌对你无效。", - zhiwei: "至微", - zhiwei2: "至微", - zhiwei_info: - "游戏开始时/你的回合开始时,若场上没有因此法被选择过的角色存活,则你选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。", - zhiwei_info_guozhan: - "你明置此武将牌时,选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。该角色死亡时,若你的两个武将牌均明置,你暗置此武将牌。", - zhanghu: "张虎", - cuijian: "摧坚", - cuijian_info: - "出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你,然后你交给其等量的牌。", - zhtongyuan: "同援", - zhtongyuan_info: - "锁定技。①当你使用红色锦囊牌后,你于〖摧坚〗后增加“若其手牌中没有【闪】,则你摸两张牌”;②当你使用或打出红色基本牌后,你删除〖摧坚〗中的“,然后你交给其等量的牌”。③当你使用红色的普通锦囊牌/基本牌时,若你已发动过〖摧坚①〗和〖摧坚②〗,则此牌不可被响应/可额外增加一个目标。", - lvlingqi: "吕玲绮", - guowu: "帼舞", - guowu_info: - "出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】或普通锦囊牌可以多指定至多两个目标。", - guowu_info_guozhan: - "出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】可以多指定至多两个目标。", - zhuangrong: "妆戎", - zhuangrong_info: - "觉醒技,一名角色的回合结束时,若你的体力值或手牌数为1,你减1点体力上限并回复体力至上限,将手牌摸至体力上限,然后获得〖神威〗和〖无双〗。", - llqshenwei: "神威", - llqshenwei_info: "锁定技,摸牌阶段开始时,你令额定摸牌数+2;你的手牌上限+2。", - re_kanze: "阚泽", - rekuanshi: "宽释", - rekuanshi_info: - "结束阶段,你可以选择一名角色。你获得如下效果直到你下回合开始:每回合限一次,当其于一回合内受到第2点伤害后,其回复1点体力。", - liuyong: "刘永", - zhuning: "诛佞", - zhuning_info: - "出牌阶段限一次。你可将任意张牌交给一名其他角色(称为“隙”),然后可视为使用一张具有伤害标签的基本牌/锦囊牌(不计入次数限制)。若你以此法使用的牌未造成伤害,则你将〖诛佞〗于本回合内改为“限两次”。", - fengxiang: "封乡", - fengxiang_info: - "锁定技。①当你受到伤害后,若场上:存在“隙”唯一最多的角色,则其回复1点体力;不存在,则你摸一张牌。②当有角色的手牌移动后,若场上“隙”最多的角色因此发生变化,则你摸一张牌。", - fengxiang_tag: "隙", - re_xunchen: "荀谌", - refenglve: "锋略", - refenglve_info: - "出牌阶段限一次,你可以和一名其他角色进行拼点。若你赢,你获得其区域里的两张牌;若平局,则你获得你的拼点牌且令此技能于本阶段内的发动次数上限+1;若你输,其获得你的拼点牌。", - anyong: "暗涌", - anyong_info: - "当一名角色于其回合内第一次造成伤害后,若伤害值为1,则你可弃置一张牌,并对受伤角色造成1点伤害。", - wanniangongzhu: "万年公主", - zhenge: "枕戈", - zhenge_info: - "准备阶段,你可以选择一名角色。该角色本局游戏的攻击范围+1(至多+5)。然后若除其外的所有角色都在该角色的攻击范围内,则你可以令其视为对另一名角色使用一张【杀】。", - xinghan: "兴汉", - xinghan_info: - "锁定技,每回合的第一张【杀】造成伤害后,若此【杀】的使用者成为过〖枕戈〗的目标,则你摸一张牌。若你的手牌数不是全场唯一最多的,则改为摸X张牌(X为该角色的攻击范围且最多为5)。", - re_chendeng: "陈登", - refuyuan: "扶援", - refuyuan_info: - "一名角色成为【杀】的目标后,若其本回合内没有成为过其他红色牌的目标,则你可以令其摸一张牌。", - reyingshui: "营说", - reyingshui_info: - "出牌阶段限一次,你可将一张牌交给攻击范围内的一名其他角色,然后其选择一项:①交给你至少两张装备牌。②受到1点伤害。", - rewangzu: "望族", - rewangzu_info: - "每回合限一次。当你受到其他角色造成的伤害时,你可随机弃置一张手牌,令此伤害-1。若你所在阵营的存活角色数是全场最多的,则你可以自行选择弃置的牌。", - re_miheng: "祢衡", - rekuangcai: "狂才", - rekuangcai_info: - "锁定技。①你于回合内使用牌无距离和次数限制。②弃牌阶段开始时,若你本回合内:未使用过牌,则你本局游戏的手牌上限+1;使用过牌但未造成过伤害,则你本局游戏的手牌上限-1。③结束阶段开始时,你摸X张牌(X为你本回合内造成的伤害且至多为5)。", - reshejian: "舌剑", - reshejian_info: - "每回合限两次。当你成为其他角色使用牌的唯一目标后,你可以弃置至少两张手牌。若如此做,你选择一项:⒈弃置其等量的牌。⒉对其造成1点伤害。", - fengxi: "冯熙", - yusui: "玉碎", - yusui_info: - "当你成为其他角色使用黑色牌的目标后,你可以失去1点体力,然后选择一项:⒈令其将手牌数弃置至与你相同;⒉令其失去Y点体力(Y为其的体力值减去你的体力值,不为正时不可选择)。", - boyan: "驳言", - boyan_info: - "出牌阶段限一次,你可选择一名其他角色。其将手牌摸至体力上限(至多摸至五张),然后其本回合不能使用或打出手牌。", - re_dengzhi: "邓芝", - jianliang: "简亮", - jianliang_info: "摸牌阶段开始时,若你的手牌数不为全场最多,则你可以令至多两名角色各摸一张牌。", - weimeng: "危盟", - weimeng_info: - "出牌阶段限一次,你可以获得一名其他角色的至多X张手牌,然后交给其等量的牌(X为你的体力值)。若你给出的牌点数之和:大于得到的牌,则你摸一张牌;小于得到的牌,弃置该角色区域内的一张牌。", - mamidi: "马日磾", - bingjie: "秉节", - bingjie_info: - "出牌阶段开始时,你可减1点体力上限,然后当你于本阶段内使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。若其弃置的牌与你使用的牌颜色相同,其无法响应此牌。", - zhengding: "正订", - zhengding_info: - "锁定技。当你于回合外使用或打出牌响应其他角色使用的牌时,若这两张牌颜色相同,则你加1点体力上限并回复1点体力。", - dc_jiben: "吉本", - xunli: "询疠", - xunli_info: - "锁定技。①当有黑色牌因弃置而进入弃牌堆后,若X大于0,则你将其中的X张牌置于武将牌上作为“疠”(X=min(这些牌的数量,9-Y),Y=你的“疠”数)。②出牌阶段开始时,你可以用任意张黑色手牌交换等量的“疠”。", - zhishi: "指誓", - zhishi_info: - "结束阶段,你可选择一名角色。当该角色于你的下回合开始前{成为【杀】的目标后或进入濒死状态时},你可移去任意张“疠”,然后其摸等量的牌。", - lieyi: "烈医", - lieyi_info: - "出牌阶段限一次。你可以展示所有“疠”并选择一名其他角色,对其使用其中的一张可对其使用的牌(无距离和次数限制)并重复此流程,并将其余的牌置于弃牌堆。然后若其存活且未于此流程中因受到伤害而进入过濒死状态,则你失去1点体力。", - guanning: "管宁", - dunshi: "遁世", - dunshi_info: - "每回合限一次。你可以视为使用或打出一张【杀】/【闪】/【桃】/【酒】,然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。", - dc_gaolan: "高览", - xizhen: "袭阵", - xizhen_info: - "出牌阶段开始时,你可选择一名其他角色,视为对其使用【杀】或【决斗】。然后当有角色于本阶段内使用或打出牌响应你时,该角色回复1点体力,你摸一张牌(若其满体力,改为两张)。", - dc_huangchengyan: "黄承彦", - dcjiezhen: "解阵", - dcjiezhen_info: - "出牌阶段限一次,你可选择一名其他角色。该角色获得〖八阵〗,且其所有不为{锁定技、限定技、觉醒技、主公技、带有Charlotte标签}的技能失效。你的下回合开始时,或其因〖八卦阵〗发起的判定结算结束后,你令其恢复其以此法失效的所有技能并失去以此法获得的〖八阵〗,然后获得其区域内的一张牌。", - dczecai: "择才", - dczecai_info: - "限定技。一轮游戏开始时,若游戏轮数大于1,则你可令一名其他角色获得〖集智〗直到下一轮游戏开始;若其是上一轮内使用过锦囊牌数量唯一最多的角色,则其获得一个额外的回合。", - dcyinshi: "隐世", - dcyinshi_info: - "锁定技。①每回合限一次,当你受到伤害时,若此伤害的渠道不为有颜色的牌,则你防止此伤害。②当有因〖八卦阵〗发起的判定的判定牌生效时,你获得此判定牌。", - tenggongzhu: "滕公主", - xingchong: "幸宠", - xingchong_info: - "一轮游戏开始时,你可声明两个自然数X和Y,且(X+Y)≤min(5, 你的体力上限)。你摸X张牌并展示Y张手牌。若如此做,当你于本轮内失去一张以此法展示的牌后,你摸两张牌。", - liunian: "流年", - liunian_info: - "锁定技。一名角色的回合结束时,若本回合内进行了本次游戏的第一次洗牌,则你加1点体力上限;若本回合内进行了本次游戏的第二次洗牌,则你于本回合结束时回复1点体力,且本局游戏内的手牌上限+10。", - caimaozhangyun: "蔡瑁张允", - lianzhou: "连舟", - lianzhou_info: "锁定技。准备阶段,你横置你的武将牌。然后你可横置任意名体力值等于你的角色。", - jinglan: "惊澜", - jinglan_info: - "锁定技。当你造成伤害后,若你的手牌数:大于体力值,你弃置四张手牌;等于体力值,你弃置一张牌并回复1点体力;小于体力值,你受到1点无来源火焰伤害并摸五张牌。", - dc_yanghu: "羊祜", - dcdeshao: "德劭", - dcdeshao_info: - "每回合限两次。当你成为其他角色使用的黑色牌的目标后,你可以摸一张牌,然后若其手牌数不小于你,则你弃置其一张牌。", - dcmingfa: "明伐", - dcmingfa_info: - "①出牌阶段限一次。当你使用【杀】或普通锦囊牌结算结束后,若你的武将牌上没有“明伐”牌,则你可以将此牌作为“明伐”牌置于武将牌上并选择一名其他角色,记录该角色和此牌的名称。②一名角色的回合结束时,若其是你〖明伐①〗记录的角色,则你视为对其依次使用X张〖明伐①〗记录的牌,然后移去“明伐”牌(X为其手牌数且至少为1,至多为5)。③一名角色死亡时,若其是你〖明伐①〗记录的角色,则你移去“明伐”牌。", - dc_jiling: "纪灵", - dcshuangren: "双刃", - dcshuangren_info: - "出牌阶段开始时,你可以和一名其他角色A进行拼点。若你赢,你选择一名角色B,或选择包含A在内的两名角色A和B(B的势力需与A相同),然后视为对被选择的角色使用一张【杀】(不计入次数限制);若你没赢,则你本阶段内不能使用【杀】。", - zhangxun: "张勋", - suizheng: "随征", - suizheng_info: - "结束阶段,你可以选择一名角色A,获得如下效果直到其下回合结束:①A于下回合出牌阶段内使用【杀】的次数上限+1且无距离限制;②A下回合的出牌阶段结束时,你可以选择一名此阶段内受到过A造成的伤害的角色B,视为对B使用一张【杀】。", - dc_liuba: "刘巴", - dczhubi: "铸币", - dczhubi_info: - "当有♦牌因弃置而进入弃牌堆后,你可以令系统从牌堆/弃牌堆中检索一张【无中生有】,并将此牌置于牌堆顶。", - dcliuzhuan: "流转", - dcliuzhuan_tag: "转", - dcliuzhuan_info: - "锁定技。①其他角色于其回合内不于摸牌阶段而得到的牌称为“转”。②你不能成为实体牌中包含“转”的牌的目标。③当有“转”直接进入弃牌堆或经由处理区进入弃牌堆后,你获得之。", - huzhao: "胡昭", - midu: "弥笃", - midu_info: - "出牌阶段限一次。你可以选择一项:⒈废除任意个装备栏或判定区,并令一名角色摸等量的牌。⒉恢复一个已经被废除的装备栏或判定区,然后你获得〖活墨〗直到下回合开始。", - xianwang: "贤望", - xianwang_info: - "锁定技。若你有被废除的装备栏,则其他角色至你的距离+1,你至其他角色的距离-1;若废除的装备栏数大于2,则改为距离+2/-2。", - guanhai: "管亥", - suoliang: "索粮", - suoliang_info: - "每回合限一次。当你对其他角色造成伤害后,你可以选择并展示其的至多X张牌(X为其体力上限且至多为5)。若这些牌中有♥或♣牌,则你获得这些牌;否则你弃置这些牌。", - qinbao: "侵暴", - qinbao_info: "锁定技。当你使用【杀】或普通锦囊牌时,你令所有手牌数不小于你的角色不能响应此牌。", - dc_lvkuanglvxiang: "吕旷吕翔", - dcshuhe: "数合", - dcshuhe_info: - "出牌阶段限一次,你可以展示一张手牌并获得一枚“爵”。若场上有与此牌点数相同的牌,则你获得这些牌;否则你将此牌交给一名其他角色。", - dcliehou: "列侯", - dcliehou_info: - "锁定技。摸牌阶段开始时,你令额定摸牌数+X;然后此摸牌阶段结束时,你选择一项:⒈弃置X张牌。⒉失去1点体力(X为你的“爵”数+1且至多为5)。", - yinfuren: "尹夫人", - dcyingyu: "媵予", - dcyingyu_info: - "准备阶段开始时,你可以展示两名角色的各一张手牌。若这两张牌的花色不同,则你可以令一名角色获得另一名角色的展示牌。", - dcyongbi: "拥嬖", - dcyongbi_info: - "限定技。出牌阶段,你可以将所有手牌交给一名其他男性角色。你将〖媵予〗的发动时机改为“准备阶段和结束阶段开始时”。然后若这些牌中包含的花色数:大于1,则你与其本局游戏的手牌上限+2;大于2,则当你或其于本局游戏内受到大于1的伤害时,此伤害-1。", - dc_huangquan: "黄权", - dcquanjian: "劝谏", - dcquanjian_info: - "出牌阶段每项各限一次。你可以选择一项流程并选择一名其他角色A:⒈令A对其攻击范围内的另一名角色B造成1点伤害。⒉令A将手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌。然后A选择一项:⒈执行此流程。⒉本回合下次受到的伤害+1。", - dctujue: "途绝", - dctujue_info: - "限定技。当你进入濒死状态时,你可以将所有牌交给一名其他角色。然后你回复等量的体力并摸等量的牌。", - chengui: "陈珪", - dcyingtu: "营图", - dcyingtu_info: - "每回合限一次。当你的上家/下家于摸牌阶段外得到牌后,你可以获得其一张牌,然后将一张牌交给你的下家/上家。若你给出的牌为装备牌,则其使用之。", - dccongshi: "从势", - dccongshi_info: - "锁定技。一名角色使用的装备牌结算结束后,若其装备区内的牌数为全场最多,则你摸一张牌。", - wanglie: "王烈", - dcchongwang: "崇望", - dcchongwang_info: - "其他角色使用基本牌或普通锦囊牌时,若你是本局游戏内上一张被使用的牌的使用者,则你可以选择一项:⒈令其于此牌结算结束后收回此牌对应的所有实体牌;⒉取消此牌的所有目标。", - dchuagui: "化归", - dchuagui_info: - "出牌阶段开始时,你可以选择至多X名有牌的其他角色(X为场上每个阵营中最大阵营的人数,且你的选择结果不展示)。这些角色同时选择一项:⒈交给你一张牌,⒉展示一张牌。若这些角色均选择选项二,则你获得所有展示牌。", - gongsundu: "公孙度", - dczhenze: "震泽", - dczhenze_info: - "弃牌阶段开始时,你可以选择一项:1.令所有手牌数与体力值大小关系与你不同的角色失去1点体力;2.令所有手牌数和体力值关系与你相同的角色回复1点体力。", - dcanliao: "安辽", - dcanliao_info: "出牌阶段限X次(X为群势力角色数)。你可以重铸一名角色的一张牌。", - dc_yuejiu: "乐就", - dccuijin: "催进", - dccuijin_info: - "当你或你攻击范围内的角色使用【杀】或【决斗】时,你可以弃置一张牌,令此牌的伤害基数+1。然后当此牌被目标角色抵消或无效或防止伤害后,你摸两张牌并对使用者造成1点伤害。", - panghui: "庞会", - dcyiyong: "异勇", - dcyiyong_info: - "当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。", - chenjiao: "陈矫", - dcxieshoux: "协守/清严", - dcxieshou: "协守", - dcxieshou_info: - "每回合限一次。当一名角色受到伤害后,若你至其的距离不大于2,你可以令你的手牌上限-1,然后其选择一项:1.回复1点体力;2.复原,摸两张牌。", - dcqingyan: "清严", - dcqingyan_info: - "每回合限两次。当你成为其他角色使用黑色牌的目标后,若你的手牌数:小于体力值,你可以将手牌补至体力上限;不小于体力值,你可以弃置一张牌令你的手牌上限+1。", - dcqizi: "弃子", - dcqizi_info: "锁定技。你不能对至其的距离大于2且正在进行濒死流程的角色使用【桃】。", - leibo: "雷薄", - dcsilve: "私掠", - dcsilve_info: - "游戏开始时,你选择一名其他角色(对其他角色不可见),称为“私掠”角色。然后你获得以下效果:①当“私掠”角色造成伤害后,若你本回合未因此效果得到过受伤角色的牌,你可以获得受伤角色一张牌;②当“私掠”角色受到其他角色造成的伤害后,若伤害来源存活,你须对伤害来源使用一张【杀】(无距离限制),否则你弃置一张手牌。", - dcshuaijie: "衰劫", - dcshuaijie_info: - "限定技。出牌阶段,若你的体力值与装备区里的牌数均大于“私掠”角色,或没有角色有“私掠”,你可以减1点体力上限,然后选择一项:1.获得“私掠”角色至多三张牌;2.从牌堆随机获得三张类型各不同的牌。最后将你的“私掠”角色改为你。", - dc_sp_jiaxu: "新杀SP贾诩", - dc_sp_jiaxu_prefix: "新杀SP", - dcjianshu: "间书", - dcjianshu_info: - "出牌阶段限一次。你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,你令前者与后者拼点。赢的角色随机弃置一张牌,没赢的角色失去1点体力。若有角色因此死亡,你令你〖间书〗于此阶段发动的次数上限+1。", - dcyongdi: "拥嫡", - dcyongdi_info: - "限定技。出牌阶段,你可以选择一名男性角色,若其:体力上限最少,其加1点体力上限;体力值最少,其回复1点体力;手牌数最少,其摸X张牌(X为其体力上限且至多为5)。", - liupi: "新杀刘辟", - liupi_prefix: "新杀", - dcjuying: "踞营", - dcjuying_info: - "出牌阶段结束时,若你于此阶段内使用【杀】的次数未达到上限,你可以选择任意项:1.下回合使用【杀】的次数上限+1;2.本回合手牌上限+2;3.摸三张牌。若你选择的项数超过了你的体力值,你弃置一张牌。", - dc_huanghao: "新杀黄皓", - dc_huanghao_prefix: "新杀", - dcqinqing: "寝情", - dcqinqing_info: - "结束阶段,你可以弃置一名攻击范围内包含一号位的其他角色一张牌。然后若其手牌数大于一号位,你摸一张牌。", - dccunwei: "存畏", - dccunwei_info: - "锁定技。当你成为其他角色使用的锦囊牌的目标后,若你是唯一目标,你摸一张牌;否则你弃置一张牌。", - dc_zhaotongzhaoguang: "赵统赵广", - dcqingren: "青刃", - dcqingren_info: "结束阶段,你可以摸X张牌(X为你本回合发动〖翊赞〗的次数)。", - dclongyuan: "龙渊", - dclongyuan_info: - "锁定技。一名角色的回合结束时,若你本局游戏已发动过至少三次〖翊赞〗,你摸两张牌并回复1点体力,修改〖翊赞〗。", - zhenghun: "郑浑", - dcqiangzhi: "强峙", - dcqiangzhi_info: - "出牌阶段限一次。你可以弃置你和一名其他角色的共计三张牌。然后若你与其之中有角色因此失去了三张牌,该角色对另一名角色造成1点伤害。", - dcpitian: "辟田", - dcpitian_info: - "①当你的牌被弃置后,或当你受到伤害后,你的手牌上限+1。②结束阶段,若你的手牌数小于手牌上限,你可以摸至手牌上限(至多摸五张),然后重置因〖辟田①〗增加的手牌上限。", - furongfuqian: "傅肜傅佥", - dcxuewei: "血卫", - dcxuewei_info: - "结束阶段,你可以选择一名体力值不大于你的角色,然后你获得如下效果直到你的下回合开始时:当其受到伤害时,防止此伤害,然后你失去1点体力,你与其各摸一张牌(若该角色为你,则改为你摸一张牌)。", - dcyuguan: "御关", - dcyuguan_info: - "一名角色的回合结束时,若你已损失的体力值为全场最多,你可以减1点体力上限,然后令至多X名角色将手牌摸至体力上限(X为你已损失的体力值)。", - qinlang: "秦朗", - dchaochong: "昊宠", - dchaochong_info: - "当你使用牌后,你可以将手牌摸至或弃置至你的手牌上限数(至多摸五张)。然后若你以此法:得到牌,你的手牌上限-1;失去牌,你的手牌上限+1。", - dcjinjin: "矜谨", - dcjinjin_info: - "每回合限两次。当你造成或受到伤害后,你可以重置因〖昊宠〗增加或减少的手牌上限,令伤害来源弃置至多X张牌,然后你摸Y张牌(X为你以此法变化的手牌上限且至少为1,Y为X减其以此法弃置的牌数)。", - xianglang: "向朗", - dckanji: "勘集", - dckanji_info: - "出牌阶段限两次。你可以展示所有手牌,若花色均不同,你摸两张牌。然后若你的手牌因此包含了四种花色,你跳过下一个弃牌阶段。", - dcqianzheng: "愆正", - dcqianzheng_info: - "每回合限两次。当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以重铸两张牌。若你以此法重铸的牌中没有与指定你为目标的牌类别相同的牌,你于此牌对应的实体牌进入弃牌堆后获得此牌对应的所有实体牌。", - qiaorui: "桥蕤", - dcaishou: "隘守", - dcaishou_tag: "隘", - dcaishou_info: - "①结束阶段,你可以摸X张牌,称为“隘”(X为你的体力上限)。②准备阶段,你弃置所有“隘”,若你以此法弃置的牌数大于体力值且你的体力上限小于9,你加1点体力上限。③当你于回合外失去最后一张“隘”后,你减1点体力上限。", - dcsaowei: "扫围", - dcsaowei_info: - "当一名其他角色使用【杀】结算结束后,若此牌的目标角色不包含你且均在你的攻击范围内,你可以将一张“隘”当做【杀】对所有目标角色使用。以此法转化的【杀】结算完毕后,若此【杀】造成过伤害,你获得此【杀】对应的实体牌。", - yuantanyuanxiyuanshang: "袁谭袁尚袁熙", - dcneifa: "内伐", - dcneifa_info: - "出牌阶段开始时,你可以摸三张牌,然后弃置一张牌。若你弃置的牌类型为:基本牌,本阶段你不能使用锦囊牌,且【杀】的使用次数上限+X且可以额外指定一名目标;锦囊牌,本阶段你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5。你以此法选择的额外目标均无距离限制)。", - dc_sunziliufang: "新杀孙资刘放", - dc_sunziliufang_prefix: "新杀", - dcqinshen: "勤慎", - dcqinshen_info: "弃牌阶段结束时,你可以摸X张牌(X为本回合未进入过弃牌堆的花色数)。", - dcweidang: "伪谠", - dcweidang_info: - "其他角色的结束阶段,你可以将一张字数为X的牌置于牌堆底,然后获得牌堆里一张字数为X的牌(X为本回合未进入过弃牌堆的花色数)。若你能使用此牌,你使用之。", - mengjie: "孟节", - dcyinlu: "引路", - dcyinlu_info: - "①游戏开始时,你令三名角色依次分别获得“乐泉”、“藿溪”、“瘴气”标记(若场上角色数为2则改为令一名其他角色获得其中2枚,你获得剩余标记),然后你获得“芸香”标记并获得1点“芸香”值。②准备阶段/有〖引路〗标记的角色死亡时,你可以移动一名角色的1枚/其的所有〖引路〗标记。", - dcyinlu_lequan: "乐泉", - dcyinlu_lequan_info: "结束阶段,你可以弃置一张♦牌并回复1点体力。", - dcyinlu_huoxi: "藿溪", - dcyinlu_huoxi_info: "结束阶段,你可以弃置一张♥牌并摸两张牌。", - dcyinlu_zhangqi: "瘴气", - dcyinlu_zhangqi_info: "锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。", - dcyinlu_yunxiang: "芸香", - dcyinlu_yunxiang_info: - "①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。", - dcyouqi: "幽栖", - dcyouqi_info: "锁定技。当其他角色因〖引路〗标记弃置牌后,你有一定概率获得此牌。", - dcyouqi_faq: "〖幽栖〗概率
    ", - dcyouqi_faq_info: - "当满足〖幽栖〗条件时,系统生成一个随机数X∈[0,1)。若X小于(1.25-0.25Y),或幸运星模式已开启,你获得此牌(Y为你至该角色的距离)。", - dc_sunhanhua: "孙寒华", - dchuiling: "汇灵", - dchuiling_info: - "锁定技。当你使用牌时,若此牌颜色为弃牌堆中数量较少的颜色,你获得1枚“灵”标记。若弃牌堆中:红色牌数大于黑色牌数,你回复1点体力;黑色牌数大于红色牌数,你可以弃置一名其他角色的一张牌。", - dcchongxu: "冲虚", - dcchongxu_info: - "限定技。出牌阶段,若“灵”数不小于4,你可以失去〖汇灵〗,增加等同于“灵”数的体力上限(至多增加场上人数的体力上限),然后获得〖踏寂〗和〖清荒〗。", - dctaji: "踏寂", - dctaji_info: - "当你失去手牌后,根据你失去牌的原因执行以下效果:1.使用:你弃置其他角色一张牌;2.打出:你摸一张牌;3.弃置:你回复1点体力;4.其他:你下一次对其他角色造成伤害时,此伤害+1。", - dcqinghuang: "清荒", - dcqinghuang_info: - "出牌阶段开始时,你可以减1点体力上限,然后你于本回合发动〖踏寂〗时额外随机执行一种效果。", - dc_huojun: "霍峻", - dcgue: "孤扼", - dcgue_info: - "每回合限一次。当你需要于回合外使用或打出【杀】或【闪】时,你可以发动此技能:你展示所有手牌,若其中【杀】和【闪】的数量之和不超过1,你视为使用或打出此牌。", - dcsigong: "伺攻", - dcsigong_info: - "其他角色的回合结束时,若其于本回合内使用牌被响应过,你可以将手牌摸至或弃置至1,视为对其使用一张需使用X张【闪】抵消的【杀】,且此【杀】的伤害基数+1(X为你以此法弃置的牌数且至少为1)。当你以此法造成伤害后,该技能于本轮失效。", - peiyuanshao: "裴元绍", - oldmoyu: "没欲", - oldmoyu_info: - "出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】,且此【杀】伤害基数为X(X为你于本回合发动此技能的次数)。若此【杀】对你造成了伤害,你令此技能于本回合失效。", - dcmoyu: "没欲", - dcmoyu_info: - "出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】。若此【杀】:未对你造成过伤害,你将此技能于此阶段下次获得的牌数改为两张;对你造成过伤害,你令此技能于本回合失效。", - zhangchu: "张楚", - dcjizhong: "集众", - dcjizhong_info: - "出牌阶段限一次。你可以令一名其他角色摸两张牌,然后其选择一项:1.若其没有“信众”标记,其获得“信众”标记;2.交给你三张手牌。", - dcrihui: "日彗", - dcrihui_info: - "每回合限一次。当你使用普通锦囊牌或黑色基本牌结算结束后,若此牌的目标数为1且目标不为你,且其:没有“信众”,则所有有“信众”的角色依次视为对其使用一张与此牌牌名和属性相同的牌;有“信众”,则你可以获得其区域里的一张牌。", - dcguangshi: "光噬", - dcguangshi_info: "锁定技。准备阶段,若所有其他角色均有“信众”,你摸两张牌并失去1点体力。", - dongwan: "董绾", - dcshengdu: "生妒", - dcshengdu_info: - "回合开始时,你可以选择一名其他角色,令其获得1枚“生妒”标记。有“生妒”标记的角色于摸牌阶段得到牌后,你摸X张牌,然后其移去所有“生妒”标记(X为摸牌数乘以其拥有的“生妒”标记数)。", - dcjieling: "介绫", - dcjieling_info: - "出牌阶段每种花色限一次,你可以将两张花色不同的手牌当无距离限制且无任何次数限制的【杀】使用。然后若此【杀】:造成了伤害,所有目标角色失去1点体力;未造成伤害,所有目标角色依次获得1枚“生妒”标记。", - yuanyin: "袁胤", - dcmoshou: "墨守", - dcmoshou_info: - "当你成为其他角色使用的黑色牌的目标后,你可以摸X张牌(X为你本局游戏此前发动过此技能的次数÷3的余数+1)。", - dcyunjiu: "运柩", - dcyunjiu_info: - "一名角色死亡后,你可以弃置等同于其因死亡事件的规则而弃置的牌数,将其此次弃置的牌交给一名其他角色。然后你加1点体力上限并回复1点体力。", - gaoxiang: "高翔", - dcchiying: "驰应", - dcchiying_info: - "出牌阶段限一次。你可以选择一名体力不大于你的角色,令其攻击范围内的其他角色依次弃置一张牌。然后若你选择的角色不为你,其获得以此法弃置的牌中所有的基本牌。", - zhangkai: "张闿", - dcxiangshu: "相鼠", - dcxiangshu_info: - "其他角色的出牌阶段开始时,若其手牌数不小于其体力值,你可以选择一个不大于5的非负整数,然后你弃置一张牌或声明此数字。若如此做,此阶段结束时,若其手牌数与你选择的数字:差值不大于1,你获得其一张牌;相等,你对其造成1点伤害。", - mengyou: "孟优", - dcmanzhi: "蛮智", - dcmanzhi_info: - "①准备阶段,你可以选择一名其他角色并选择一项:1.令其交给你两张牌,然后其视为使用一张无距离限制的【杀】;2.获得其区域内至多两张牌,然后交给其等量的牌并摸一张牌。②结束阶段,若你的体力值与本回合准备阶段时的体力值相等,你可以执行你未于本回合执行过的〖蛮智①〗的分支。", - dc_sunchen: "孙綝", - dczigu: "自固", - dczigu_info: - "出牌阶段限一次。你可以弃置一张牌,然后获得场上的一张装备牌。若你没有因此获得其他角色的牌,你摸一张牌。", - dczuowei: "作威", - dczuowei_info: - "当你于回合内使用牌时,你可以根据你的手牌数执行对应效果:大于X,令此牌不可被响应;等于X,对一名其他角色造成1点伤害;小于X,摸两张牌且不能于本回合再触发该选项(X为你装备区里牌的数量且至少为1)。", - liuchongluojun: "刘宠骆俊", - dcminze: "悯泽", - dcminze_info: - "①出牌阶段每名角色限一次。你可以将至多两张牌名不同的牌交给一名手牌数小于你的角色。②结束阶段,你将手牌摸至X张(X为你本回合因〖悯泽①〗失去过的牌的牌名数且至多为5)。", - dcjini: "击逆", - dcjini_info: - "当你受到伤害后,你可以重铸至多Y张手牌(Y为你的体力上限减本回合你以此法重铸过的牌数)。若你以此法获得了【杀】,你可以对伤害来源使用一张无视距离且不可被响应的【杀】。", - yuechen: "乐綝", - dcporui: "破锐", - dcporui_info: - "每轮限一次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】,然后你交给其X张手牌(X为其本回合失去的牌数且至多为5)。", - dcgonghu: "共护", - dcgonghu_info: - "锁定技。①当你于回合外失去基本牌后,若你本回合内失去基本牌的数量大于1,你将〖破锐〗改为每轮限两次。②当你造成或受到伤害后,若你本回合内造成或受到的总伤害大于1,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。", - yue_caiwenji: "乐蔡琰", - yue_caiwenji_prefix: "乐", - dcshuangjia: "霜笳", - dcshuangjia_tag: "胡笳", - dcshuangjia_info: - "锁定技。①游戏开始,你将你的手牌标记为“胡笳”。②你的“胡笳”牌不计入手牌上限。③其他角色至你的距离+X(X为你的“胡笳”数且至多为5)。", - dcbeifen: "悲愤", - dcbeifen_info: - "锁定技。①当你失去牌后,若这些牌中有“胡笳”牌,你获得与你手牌中“胡笳”牌花色均不同的每种花色的牌各一张。②若你手牌中“胡笳”牌数小于不为“胡笳”牌的牌数,你使用牌无距离和次数限制。", - dc_wuban: "吴班", - dcyouzhan: "诱战", - dcyouzhan_info: - "锁定技。当其他角色于你的回合内失去一张牌后,你摸一张牌(不计入本回合的手牌上限),且其获得如下效果:1.其于此回合下一次受到的伤害+1;2.结束阶段,若其于此回合未受到过伤害,其摸X张牌(X为其此回合失去过牌的次数且至多为3)。", - yue_zhoufei: "乐周妃", - yue_zhoufei_prefix: "乐", - dclingkong: "灵箜", - dclingkong_tag: "箜篌", - dclingkong_info: - "锁定技。①游戏开始时,你将所有手牌标记为“箜篌”。②你的“箜篌”牌不计入手牌上限。③当你于一回合内首次于摸牌阶段外得到牌后,你将这些牌标记为“箜篌”。", - dcxianshu: "贤淑", - dcxianshu_info: - "出牌阶段,你可以将一张“箜篌”正面向上交给一名其他角色,然后你摸X张牌(X为你与其的体力值之差且至多为5)。若此牌为红色,且该角色的体力值不大于你,则其回复1点体力;若此牌为黑色,且该角色的体力值不小于你,则其失去1点体力。", - dc_zhangmancheng: "张曼成", - dclvecheng: "掠城", - dclvecheng_info: - "出牌阶段限一次。你可以选择一名其他角色,你于本回合对其使用当前手牌中的【杀】无任何次数限制。然后回合结束时,其展示所有手牌,若其中有【杀】,其可以选择对你依次使用其中所有的【杀】。", - dczhongji: "螽集", - dczhongji_info: - "当你使用牌时,若此牌无花色或你手牌区里没有与此牌花色相同的手牌,你可以将手牌摸至体力上限并弃置X张牌(X为本回合发动〖螽集〗的次数)。", - dc_jiachong: "贾充", - dcbeini: "悖逆", - dcbeini_info: - "出牌阶段限一次。你可以将手牌调整至体力上限,然后令一名角色视为对另一名角色使用一张【杀】,且这些角色的非锁定技失效直到回合结束。", - dcshizong: "恃纵", - dcshizong_info: - "当你需要使用一张基本牌时,你可以交给一名其他角色X张牌,然后其可以将一张牌置于牌堆底,视为你使用之。若其不为当前回合角色,此技能失效直到回合结束(X为你本回合发动〖恃纵〗的次数)。", - pangshanmin: "庞山民", - dccaisi: "才思", - dccaisi_info: - "当你于回合内/回合外使用基本牌结算结束后,你可以从牌堆/弃牌堆随机获得一张非基本牌,然后若你本回合发动此技能的次数:小于你的体力上限,本回合你发动此技能获得的牌数+1;大于等于你的体力上限,本回合此技能失效。", - dczhuoli: "擢吏", - dczhuoli_info: - "锁定技。一名角色的回合结束时,若你本回合使用或获得的牌数大于体力值,你加1点体力上限(不能超过游戏人数),回复1点体力。", - yue_caiyong: "乐蔡邕", - yue_caiyong_prefix: "乐", - dcjiaowei: "焦尾", - dcjiaowei_tag: "弦", - dcjiaowei_info: - "锁定技。①游戏开始时,你将所有手牌标记为“弦”。②你的“弦”牌不计入手牌上限。③当你受到伤害时,若来源的手牌数不大于你的“弦”牌数,防止此伤害。", - dcfeibai: "飞白", - dcfeibai_info: - "每回合限一次。当你使用牌结算结束后,若你本回合使用过至少两张牌,你可以随机获得一张字数为X的牌。若你的“弦”数不大于X,你重置〖飞白〗(X为此牌与你使用的上一张牌的字数之和)。", - kuaiqi: "蒯祺", - dcliangxiu: "良秀", - dcliangxiu_info: - "出牌阶段,你可以弃置两张不同类型的牌,然后从两张与你弃置的牌类型均不同的牌中选择一张获得之(每阶段每种类型限一次)。", - dcxunjie: "殉节", - dcxunjie_info: - "每轮每项限一次。一名角色的回合结束时,若你本回合于摸牌阶段外得到过牌,你可以选择一项:1.令一名角色将手牌数摸或弃置至与其体力值相同;2.令一名角色将体力回复或失去至与其手牌数相同。", - dc_dongzhao: "董昭", - dcyijia: "移驾", - dcyijia_info: - "一名角色受到伤害后,若你至其的距离不大于1,你可以将场上一张装备牌移动至其对应装备栏(替换原装备)。若其因此脱离了一名角色的攻击范围,你摸一张牌。", - dcdingji: "定基", - dcdingji_info: - "准备阶段,你可以令一名角色将手牌摸或弃置至五张,然后其展示手牌。若牌名均不同,则其可以视为使用其中一张基本或普通锦囊牌。", - yue_xiaoqiao: "乐小乔", - yue_xiaoqiao_prefix: "乐", - dcqiqin: "绮琴", - dcqiqin_tag: "琴", - dcqiqin_info: - "锁定技。①游戏开始时,你将所有手牌标记为“琴”。②你的“琴”牌不计入手牌上限。③准备阶段,你获得位于弃牌堆的所有“琴”。", - dcweiwan: "媦婉", - dcweiwan_info: - "出牌阶段限一次,你可以弃置一张“琴”并随机获得一名其他角色区域内花色与此牌不相同的牌各一张,若你获得了:一张牌,其失去1点体力;两张牌,本回合你对其使用牌无距离和次数限制;三张牌,本回合你不能对其使用牌。", - dc_lingcao: "新杀凌操", - dc_lingcao_prefix: "新杀", - dcdufeng: "独锋", - dcdufeng_info: - "锁定技。出牌阶段开始时,你失去1点体力或废除一个装备栏,摸X张牌,然后你的攻击范围与使用【杀】的次数上限均为X直到回合结束(X为你已废除的装备栏数与损失的体力值之和,至多为你的体力上限)。", - dc_sp_menghuo: "群孟获", - dc_sp_menghuo_prefix: "群", - dcmanwang: "蛮王", - dcmanwang_info: - "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。", - dcpanqin: "叛侵", - dcpanqin_info: - "出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项,然后加1点体力上限并回复1点体力。", - dc_kongrong: "孔融", - dckrmingshi: "名士", - dckrmingshi_info: - "锁定技,当你受到其他角色造成的伤害时,若其手牌数大于你,则其需弃置一张手牌,否则此伤害-1。", - yue_daqiao: "乐大乔", - yue_daqiao_prefix: "乐", - dczixi: "姊希", - dczixi_info: - "①出牌阶段开始和结束时,你可以将一张“琴”当作一张无效果的【乐不思蜀】、【兵粮寸断】或【闪电】置于一名角色的判定区。②当你使用基本牌或普通锦囊牌指定唯一目标后,你可根据其判定区内的牌数执行对应项:1.令此牌对其额外结算一次;2.摸两张牌;3.弃置其判定区所有牌,对其造成3点伤害。", - jiangfei: "蒋琬费祎", - dcshengxi: "生息", - dcshengxi_info: "弃牌阶段结束时,若你本回合未造成过伤害,你可以摸两张牌。", - dcshoucheng: "守成", - dcshoucheng_info: "每回合限一次,当一名角色于其回合外失去手牌后,若其没有手牌,你可令其摸两张牌。", - dc_liuli: "刘理", - dcfuli: "抚黎", - dcfuli_info: - "出牌阶段限一次,你可以展示手牌并弃置一种类别的所有手牌,然后摸X张牌(X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数)。若你因此弃置了伤害类卡牌,则你可以选择一名角色,令其攻击范围-1直到你的下个回合开始。", - dcdehua: "德化", - dcdehua_info: - "锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗。②你的手牌上限+Y(Y为你〖德化①〗选择过的牌名数)。", - gongsunxiu: "公孙修", - dcgangu: "干蛊", - dcgangu_info: "锁定技。每回合限一次。当其他角色失去体力后,你摸两张牌,然后失去1点体力。", - dckuizhen: "溃阵", - dckuizhen_info: - "出牌阶段限一次。你可以令一名手牌数或体力值大于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。", - dc_jiangji: "蒋济", - dcshiju: "势举", - dcshiju_info: - "其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+X(X为你装备区里的牌数)。若你以此法替换了装备,你与其各摸两张牌。", - dcyingshi: "应时", - dcyingshi_info: - "每回合每项各限一次。当你使用普通锦囊牌指定目标后,你可令其中一个目标选择一项:⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌;⒉弃置X张牌,此牌对其无效(X为你装备区里的牌数)。", - dc_wangling: "王淩", - dcjichou: "集筹", - dcjichou_info: - "出牌阶段结束时,若你于此阶段使用过牌且这些牌的牌名均不同,你可以观看位于弃牌堆中的这些牌,选择任意张牌并选择等量角色,将这些牌交给这些角色各一张,然后你摸X张牌(X为你本局游戏首次发动〖集筹〗给出的牌数)。", - dcmouli: "谋立", - dcmouli_info: - "觉醒技。回合结束时,若你因〖集筹〗给出的牌的牌名总数不小于5,你加1点体力上限并回复1点体力,然后获得〖自缚〗。", - dczifu: "自缚", - dczifu_info: - "锁定技。出牌阶段开始时,你将手牌摸至体力上限(至多摸至五张)。若你以此法得到牌,你须选择手牌中不同牌名的牌各一张,然后弃置其余的手牌。", - dc_simashi: "司马师", - dcsanshi: "散士", - dcsanshi_tag: "死士", - dcsanshi_info: - "锁定技。①第一轮游戏开始时,你令系统将牌堆中每个点数的随机一张牌永久标记为“死士”(“死士”对你可见)。②一名角色的回合结束时,若本回合有“死士”不因你使用或打出而进入弃牌堆,你于弃牌堆中获得这些牌。③你使用“死士”不能被响应。", - dczhenrao: "震扰", - dczhenrao_info: - "每回合每名角色限一次。当你使用牌指定第一个目标后,若目标角色包含其他角色,或当其他角色使用牌指定你为目标后,你可以选择手牌数大于你的其中一个目标或此牌的使用者,然后对其造成1点伤害。", - dcchenlve: "沉略", - dcchenlve_info: - "限定技。出牌阶段,你可以将牌堆、弃牌堆、场上及其他角色的手牌区里的所有“死士”置入处理区,然后你获得这些牌。若如此做,你获得如下效果:1.此回合结束时,你将这些牌移出游戏;2.当你死亡时,你将所有以此法移出游戏的“死士”置入弃牌堆。", - dc_caoshuang: "新杀曹爽", - dc_caoshuang_prefix: "新杀", - dcjianzhuan: "渐专", - dcjianzhuan_info: - "锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:⒈令一名角色弃置X张牌;⒉摸X张牌;⒊重铸X张牌;⒋弃置X张牌(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。", - dcjianzhuan_faq: "渐专概率", - dcjianzhuan_faq_info: - "
    当系统随机选择要删除的选项时,“弃置X张牌”的选项概率固定为90%;剩余选项平分剩余的的10%概率。
    如第一次删除时,删除弃牌选项概率为90%,其余三个选项被删除的概率均为3.33%,若删除了非弃牌选项,第二次删除时,删除弃牌选项的概率依旧是90%,其余两个选项被删除的概率均为5%。", - dcfanshi: "返势", - dcfanshi_info: - "觉醒技,结束阶段,若〖渐专①〗剩余选项数小于2,则你执行三次X视为1的剩余选项,然后增加2点体力上限并回复2点体力,失去技能〖渐专〗并获得技能〖覆斗〗。", - dcfudou: "覆斗", - dcfudou_info: - "当你使用黑色牌/红色牌指定唯一目标后,若该角色不为你,且其于本局游戏对你/未对你造成过伤害,则你可以与其各失去1点体力/各摸一张牌。", - wupu: "吴普", - dcduanti: "锻体", - dcduanti_info: "锁定技。当你使用或打出牌结算结束后,若此牌是你本局游戏使用或打出过的牌中的第5X张牌(X∈N⁺),你回复1点体力,然后若你以此法增加的上限小于5,你加1点体力上限。", - dcshicao: "识草", - dcshicao_info: "出牌阶段,你可以声明一种类型,然后选择从牌堆顶或牌堆底摸一张牌。若此牌类型与你声明的类型不同,你观看牌堆另一端的两张牌,此技能本回合失效。", - - sp_baigei: "无双上将", - sp_caizijiaren: "才子佳人", - sp_zhilan: "芝兰玉树", - sp_zongheng: "纵横捭阖", - sp_guixin: "天下归心", - sp_jianghu: "江湖之远", - sp_daihan: "代汉涂高", - sp_taiping: "太平甲子", - sp_yanhan: "匡鼎炎汉", - sp_jishi: "悬壶济世", - sp_raoting: "绕庭之鸦", - sp_yijun: "异军突起", - sp_zhengyin: "正音雅乐", - sp_zhonghu: "冢虎狼顾", - }, - }; -}); diff --git a/character/huicui/card.js b/character/huicui/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/huicui/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/huicui/character.js b/character/huicui/character.js new file mode 100644 index 000000000..7a2d5f256 --- /dev/null +++ b/character/huicui/character.js @@ -0,0 +1,105 @@ +const characters = { + wupu: ["male", "qun", 4, ["dcduanti", "dcshicao"]], + dc_caoshuang: ["male", "wei", 4, ["dcjianzhuan", "dcfanshi"]], + zangba: ["male", "wei", 4, ["rehengjiang"]], + dc_simashi: ["male", "wei", 3, ["dcsanshi", "dczhenrao", "dcchenlve"]], + dc_wangling: ["male", "wei", 4, ["dcjichou", "dcmouli"], ["clan:太原王氏"]], + dc_jiangji: ["male", "wei", 3, ["dcshiju", "dcyingshi"]], + gongsunxiu: ["male", "qun", 4, ["dcgangu", "dckuizhen"]], + dc_liuli: ["male", "shu", 3, ["dcfuli", "dcdehua"]], + yue_daqiao: ["female", "wu", 3, ["dcqiqin", "dczixi"]], + dc_kongrong: ["male", "qun", 3, ["dckrmingshi", "lirang"]], + dc_sp_menghuo: ["male", "qun", 4, ["dcmanwang"]], + dc_lingcao: ["male", "wu", "4/5", ["dcdufeng"]], + yue_xiaoqiao: ["female", "wu", 3, ["dcqiqin", "dcweiwan"]], + dc_dongzhao: ["male", "wei", 3, ["dcyijia", "dcdingji"]], + kuaiqi: ["male", "wei", 3, ["dcliangxiu", "dcxunjie"]], + yue_caiyong: ["male", "qun", 3, ["dcjiaowei", "dcfeibai"]], + pangshanmin: ["male", "wei", 3, ["dccaisi", "dczhuoli"]], + dc_jiachong: ["male", "wei", 3, ["dcbeini", "dcshizong"]], + dc_sunchen: ["male", "wu", 4, ["dczigu", "dczuowei"]], + dc_zhangmancheng: ["male", "qun", 4, ["dclvecheng", "dczhongji"]], + yue_zhoufei: ["female", "wu", 3, ["dclingkong", "dcxianshu"]], + dc_wuban: ["male", "shu", 4, ["dcyouzhan"], ["clan:陈留吴氏"]], + yue_caiwenji: ["female", "qun", 3, ["dcshuangjia", "dcbeifen"]], + liuchongluojun: ["male", "qun", 3, ["dcminze", "dcjini"]], + yuechen: ["male", "wei", 4, ["dcporui", "dcgonghu"]], + zhangkai: ["male", "qun", 4, ["dcxiangshu"]], + gaoxiang: ["male", "shu", 4, ["dcchiying"]], + yuanyin: ["male", "qun", 3, ["dcmoshou", "dcyunjiu"]], + dongwan: ["female", "qun", 3, ["dcshengdu", "dcjieling"]], + zhangchu: ["female", "qun", 3, ["dcjizhong", "dcrihui", "dcguangshi"]], + peiyuanshao: ["male", "qun", 4, ["dcmoyu"]], + mengjie: ["male", "qun", 3, ["dcyinlu", "dcyouqi"]], + dc_huojun: ["male", "shu", 4, ["dcgue", "dcsigong"]], + dc_sunhanhua: ["female", "wu", 3, ["dchuiling", "dcchongxu"]], + dc_sunziliufang: ["male", "wei", 3, ["dcqinshen", "dcweidang"]], + yuantanyuanxiyuanshang: ["male", "qun", 4, ["dcneifa"]], + qiaorui: ["male", "qun", 4, ["dcaishou", "dcsaowei"]], + xianglang: ["male", "shu", 3, ["dckanji", "dcqianzheng"]], + qinlang: ["male", "wei", 4, ["dchaochong", "dcjinjin"]], + furongfuqian: ["male", "shu", "4/6", ["dcxuewei", "dcyuguan"]], + zhenghun: ["male", "wei", 3, ["dcqiangzhi", "dcpitian"]], + dc_zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "dcqingren", "dclongyuan"]], + dc_huanghao: ["male", "shu", 3, ["dcqinqing", "huisheng", "dccunwei"]], + liupi: ["male", "qun", 4, ["dcjuying"]], + dc_sp_jiaxu: ["male", "wei", 3, ["zhenlue", "dcjianshu", "dcyongdi"]], + leibo: ["male", "qun", 4, ["dcsilve", "dcshuaijie"]], + gongsundu: ["male", "qun", 4, ["dczhenze", "dcanliao"]], + panghui: ["male", "wei", 5, ["dcyiyong"]], + dc_yuejiu: ["male", "qun", 4, ["dccuijin"]], + chenjiao: ["male", "wei", 3, ["dcxieshou", "dcqingyan", "dcqizi"]], + wanglie: ["male", "qun", 3, ["dcchongwang", "dchuagui"]], + chengui: ["male", "qun", 3, ["dcyingtu", "dccongshi"]], + dc_huangquan: ["male", "shu", 3, ["dcquanjian", "dctujue"]], + yinfuren: ["female", "wei", 3, ["dcyingyu", "dcyongbi"]], + dc_lvkuanglvxiang: ["male", "wei", 4, ["dcshuhe", "dcliehou"]], + guanhai: ["male", "qun", 4, ["suoliang", "qinbao"]], + huzhao: ["male", "qun", 3, ["midu", "xianwang"]], + dc_liuba: ["male", "shu", 3, ["dczhubi", "dcliuzhuan"]], + zhangxun: ["male", "qun", 4, ["suizheng"]], + zongyu: ["male", "shu", 3, ["zyqiao", "chengshang"]], + dc_jiling: ["male", "qun", 4, ["dcshuangren"]], + dc_yanghu: ["male", "wei", 3, ["dcdeshao", "dcmingfa"]], + caimaozhangyun: ["male", "wei", 4, ["lianzhou", "jinglan"]], + tenggongzhu: ["female", "wu", 3, ["xingchong", "liunian"]], + dc_huangchengyan: ["male", "qun", 3, ["dcjiezhen", "dczecai", "dcyinshi"]], + dc_gaolan: ["male", "qun", 4, ["xizhen"]], + guanning: ["male", "qun", "3/7", ["dunshi"]], + dc_jiben: ["male", "qun", 3, ["xunli", "zhishi", "lieyi"]], + mamidi: ["male", "qun", "4/6", ["bingjie", "zhengding"]], + re_dengzhi: ["male", "shu", 3, ["jianliang", "weimeng"]], + fengxi: ["male", "wu", 3, ["yusui", "boyan"]], + re_miheng: ["male", "qun", 3, ["rekuangcai", "reshejian"]], + re_chendeng: ["male", "qun", 3, ["refuyuan", "reyingshui", "rewangzu"]], + wanniangongzhu: ["female", "qun", 3, ["zhenge", "xinghan"]], + re_xunchen: ["male", "qun", 3, ["refenglve", "anyong"], ["clan:颍川荀氏"]], + re_kanze: ["male", "wu", 3, ["xiashu", "rekuanshi"]], + lvlingqi: ["female", "qun", 4, ["guowu", "zhuangrong"]], + zhanghu: ["male", "wei", 4, ["cuijian", "zhtongyuan"]], + luyusheng: ["female", "wu", 3, ["zhente", "zhiwei"]], + huaxin: ["male", "wei", 3, ["spwanggui", "xibing"]], + mengyou: ["male", "qun", 5, ["manyi", "dcmanzhi"]], + liuyong: ["male", "shu", 3, ["zhuning", "fengxiang"]], + dc_sunru: ["female", "wu", 3, ["xiecui", "youxu"]], + xiahoulingnv: ["female", "wei", 4, ["fuping", "weilie"]], + zhangyao: ["female", "wu", 3, ["yuanyu", "xiyan"]], + tengyin: ["male", "wu", 3, ["chenjian", "xixiu"]], + zhangxuan: ["female", "wu", 4, ["tongli", "shezang"]], + wangtao: ["female", "shu", 3, ["huguan", "yaopei"]], + wangyue: ["female", "shu", 3, ["huguan", "mingluan"]], + zhaoyan: ["female", "wu", 3, ["jinhui", "qingman"]], + heyan: ["male", "wei", 3, ["yachai", "qingtan"]], + re_sunluyu: ["female", "wu", 3, ["remeibu", "remumu"]], + re_dongbai: ["female", "qun", 3, ["relianzhu", "rexiahui"]], + zhoushan: ["male", "wu", 4, ["dcmiyun", "dcdanying"]], + dc_caiyang: ["male", "wei", 4, ["dcxunji", "dcjiaofeng"]], + xiahoujie: ["male", "wei", 5, ["liedan", "zhuangdan"]], + caoxing: ["male", "qun", 4, ["cxliushi", "zhanwan"]], + re_chunyuqiong: ["male", "qun", 4, ["recangchu", "reliangying", "reshishou"]], + xingdaorong: ["male", "qun", "4/6", ["xuxie"]], + re_panfeng: ["male", "qun", 4, ["xinkuangfu"]], + jiangfei: ["male", "shu", 3, ["dcshengxi", "dcshoucheng"]], +}; + +export default characters; diff --git a/character/huicui/characterFilter.js b/character/huicui/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/huicui/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/huicui/characterReplace.js b/character/huicui/characterReplace.js new file mode 100644 index 000000000..2092d9297 --- /dev/null +++ b/character/huicui/characterReplace.js @@ -0,0 +1,3 @@ +const characterReplaces = {}; + +export default characterReplaces; diff --git a/character/huicui/dynamicTranslate.js b/character/huicui/dynamicTranslate.js new file mode 100644 index 000000000..fdf8f881b --- /dev/null +++ b/character/huicui/dynamicTranslate.js @@ -0,0 +1,55 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + cuijian: function (player) { + return "出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你" + (player.hasMark("zhtongyuan_basic") ? "" : ",然后你交给其等量的牌") + "。" + (player.hasMark("zhtongyuan_trick") ? "若其手牌中没有【闪】,则你摸两张牌。" : ""); + }, + dunshi: function (player) { + var info = player.storage.dunshi; + var str = "每回合限一次。你可以视为使用或打出一张"; + var list = ["sha", "shan", "tao", "jiu"]; + for (var i of list) { + var strx = "【" + get.translation(i) + "】"; + if (info && !info[0].includes(i)) strx = '' + strx + ""; + str += strx; + if (i != "jiu") str += "/"; + } + str += ",然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。"; + return str; + }, + dcporui: function (player) { + return "每轮限" + (player.hasMark("dcgonghu_basic") ? "两" : "一") + "次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】" + (player.hasMark("dcgonghu_damage") ? "" : ",然后你交给其X张手牌") + "(X为其本回合失去的牌数且至多为5)。"; + }, + dcmanwang: function (player) { + var num = 4 - player.countMark("dcmanwang"); + var str = "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:"; + var list = ["⒈获得〖叛侵〗。", "⒉摸一张牌。", "⒊回复1点体力。", "⒋摸两张牌并失去〖叛侵〗。"]; + for (var i = 0; i < 4; i++) { + if (i == num) { + str += ''; + } + str += list[i]; + } + if (num < 4) str += ""; + return str; + }, + dcjianzhuan(player) { + let str = "锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:"; + const list = ["⒈令一名角色弃置X张牌", ";", "⒉摸X张牌", ";", "⒊重铸X张牌", ";", "⒋弃置X张牌"], + info = get.info("dcjianzhuan").choices, + storage = player.getStorage("dcjianzhuan"); + let choices = []; + for (const k in info) choices.push(k); + for (let i = 0; i < list.length; i++) { + const j = i / 2, + goon = Array.from({ length: list.length }) + .map((_, i) => i) + .includes(j); + if (goon && storage.includes(choices[j])) str += ''; + str += list[i]; + if (goon && storage.includes(choices[j])) str += ""; + } + return str + "(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。"; + }, +}; +export default dynamicTranslates; diff --git a/character/huicui/index.js b/character/huicui/index.js new file mode 100644 index 000000000..4d701ac40 --- /dev/null +++ b/character/huicui/index.js @@ -0,0 +1,32 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "huicui", + connect: true, + character: { ...characters }, + characterSort: { + huicui: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/huicui/intro.js b/character/huicui/intro.js new file mode 100644 index 000000000..0781b83bd --- /dev/null +++ b/character/huicui/intro.js @@ -0,0 +1,58 @@ +const characterIntro = { + dc_liuli: "刘理(?—244年),字奉孝,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅、甘陵王刘永异母弟。章武元年(221年),刘备称帝,派司徒许靖封刘理为梁王。建兴八年(230年),改封为安平王。延熙七年(244年),刘理去世,谥号悼王。", + xingdaorong: "邢道荣是《三国演义》中虚构的人物,为零陵太守刘度手下武将,被评价有万夫不当之勇,于《三国演义》第五十二回登场,被赵云刺死。", + caoxing: "曹性,东汉末年吕布部将,史载他曾与身为自己上司的反叛者郝萌交战,并砍去郝萌一臂,受到吕布的嘉奖。在罗贯中所著古典小说《三国演义》中,也有关于曹性箭射夏侯惇左目的描述,而曹性也随即被暴怒的夏侯惇所杀。在穿越小说《三国之银河射手》中,主角穿越成为曹性,经过一番闯荡之后,被封为“银河射手”。", + xiahoujie: "夏侯杰(?—208年),是罗贯中的小说《三国演义》中曹操的部将,征战时常常带在身边。在第42回长坂坡之战中,张飞大吼,从马儿受惊跌下马来而死。", + huaxin: "华歆(157年-232年1月30日),字子鱼,汉族。平原郡高唐县人(今山东省高唐县)。汉末至三国曹魏初年名士、重臣。华歆早年拜太尉陈球为师,与卢植、郑玄、管宁等为同门,又与管宁、邴原共称一龙,华歆为龙头。汉灵帝时华歆被举为孝廉,任郎中,因病去官。又被大将军何进征召为尚书郎。后任豫章太守,甚得民心。孙策率军南下,华歆举郡投降,被奉为上宾。官渡之战时,被征为议郎、参司空军事。入为尚书、侍中,又代荀彧为尚书令。丞相曹操讨孙权时,授华歆为军师。后为魏王国的御史大夫。曹丕即王位,拜华歆为相国,封安乐乡侯。曹魏建立后,其相国职名改称司徒。魏明帝即位,升任太尉,晋封博平侯。太和五年十二月(232年1月),华歆去世,年七十五,谥号“敬”。有文集三十卷,今佚失,其余见《全三国文》。", + luyusheng: "陆郁生(?年-?),三国时期吴国官员陆绩之女。陆郁生的父亲陆绩是吴郡公认的才子,又是当时吴郡陆氏的领袖。陆绩赴任担任郁林太守,遂取此名。陆郁生年少的时候就定下坚贞的志向。建安二十四年(219年),陆绩早亡,她与两个兄弟陆宏、陆睿当时都只有几岁,一起返回吴县,被他们的从兄陆瑁接回抚养。13周岁的陆郁生嫁给同郡出身的张白为妻。出嫁3个月后,张白因为其兄张温一族的案件遭到连坐,被处以流刑,后死于流放地,陆郁生成为了寡妇,其后公开宣言不再改嫁,困难于生计但拒绝了所有提亲,在艰苦中从未停止服侍、照顾张白的姐妹。事情传到朝廷,皇帝褒奖陆郁生,号其为“义姑”。她的表侄姚信在文集中称赞她的义举。", + fengxi: "冯熙(?—223年),字子柔,颍川郡父城县(今河南省平顶山市宝丰县)人。汉末三国时期吴国官员,东汉初年名将冯异的后人。孙权担任车骑将军时,冯熙担任其幕府东曹掾,后迁立信都尉。刘备去世时,奉命进入蜀汉吊丧,返回后,任中大夫。后奉命出使魏国,受到魏文帝曹丕和尚书令陈群招揽,宁死不从,自尽未果。孙权闻之流泪,称其“东吴苏武”。最终在曹魏死去。", + heyan: "何晏(?-249年),字平叔。南阳郡宛县(今河南省南阳市)人。三国时期曹魏大臣、玄学家,东汉大将军何进之孙(一称何进弟何苗之孙)。何晏之父早逝,司空曹操纳其母尹氏为妾,他因而被收养,为曹操所宠爱。少年时以才秀知名,喜好老庄之学,娶曹操之女金乡公主。魏文帝在位时,未被授予官职。魏明帝认为何晏虚浮不实,也只授其冗官之职。大将军曹爽秉政时,何晏与之共事,得以累官至侍中、吏部尚书,典选举,封列侯。高平陵之变后,与大将军曹爽同为太傅司马懿所杀,被夷灭三族。何晏有文集十一卷,并曾与郑冲等共撰《论语集解》,今已佚。钟嵘《诗品》称“平叔鸿鹄之篇,风规见矣。”将何晏诗列入中品。袁宏在《名士传》中将何晏等称为正始名士。他与夏侯玄、王弼等倡导玄学,竞事清谈,遂开一时风气,为魏晋玄学的创始者之一。", + zhaoyan: "赵嫣,生卒年不详。东吴方士(一说是丞相)赵达之妹,吴大帝孙权之妃,人称赵夫人。她心灵手巧,多才多艺,有“三绝”之称。孙权曾经想要找擅长绘画之人绘制山川地势军阵之图。赵达举荐了自己的妹妹。赵嫣认为水墨容易褪色,不方便在军旅之中保存。自己擅长刺绣,可以在锦帛上绣出孙权所需之图。待制作完成后献于孙权,只见方帛锦绣之上有五岳河海城邑行阵之形,孙权大为赞叹。时人谓之“针绝”。除刺绣之外,赵嫣还擅长绘画织锦,她能用彩丝织成云霞龙蛇之锦,大则盈尺,小则方寸,宫中谓之“机绝”。孙权在昭阳宫居住之时,饱受暑气之扰,以紫绡制成帷帐缓解暑气。赵嫣认为此物不足为贵,她削下自己的头发剖为细丝,以郁夷国出产的神胶连接,花了数月功夫将其制成一顶幔帐,打开之后薄如蝉翼,轻赛寒烟。放下帐帷能笼罩一丈之地,帐内清风自生暑意顿消。收起来则可纳入枕中,携带方便。时人谓之“丝绝”。", + wangtao: "王桃是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王悦的姐姐,与妹妹都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。", + wangyue: "王悦是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王桃的妹妹,与姐姐都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。", + zhangxuan: "张嫙,三国时期孙吴将领张布之女,孙皓后妃张媱的姐姐。初为卫尉冯朝之子冯纯的妻子,后为孙皓后妃,册封左夫人。因孙皓诛灭张布,张媱口吐怨言,被暴怒的孙皓下令棒杀。后来孙皓怀念她的容颜,于是询问侍从:“张布还有女儿吗?”侍从回答:“张布的大女儿嫁给了已故卫尉冯朝的儿子冯纯。”于是孙皓夺走了冯纯的妻子张嫙,纳入宫中。孙皓颇为宠爱张嫙,册封其为左夫人。昼夜嬉戏,纸醉金迷,不理朝政。后来张嫙也去世了,孙皓非常悲伤,下令以最高的规格埋葬张嫙。因为悲伤过度,孙皓一度半年都不出宫门,甚至由于葬礼太过奢华被宫外之人认为孙皓已经死了。", + tengyin: "滕胤(?-256年),字承嗣,三国时期吴国重臣,北海郡剧县(今山东省昌乐县)人。滕胤仪表堂堂,少时有节操,后娶公主为妻。孙权称王后,滕胤被封都亭侯。其后历任丹杨太守、吴郡太守、会稽太守。孙亮继位后,出任太常、卫将军。诸葛恪被杀后,群臣推举滕胤为司徒,但遭权臣孙峻党羽所阻挠,滕胤也有意避嫌,最终只晋爵高密侯。孙峻死后,由其堂弟孙綝执政。滕胤的连襟、骠骑将军吕据联系北伐前线诸将推举滕胤为相,希望分割孙綝权力,但并未成功,滕胤被改任大司马,镇守武昌。不久,滕胤与吕据密谋推翻孙綝,因计划泄露而被杀,惨遭灭族。孙綝被杀后,景帝孙休为滕胤平反。", + zhangyao: "张美人,三国东吴末帝孙皓后妃,张布之女。另有张布女,张美人姊被孙皓立为左夫人。《吴书五妃嫔传第五》:江表传曰:皓以张布女为美人,有宠,皓问曰:“汝父所在?”答曰:“贼以杀之。”皓大怒,棒杀之。后思其颜色,使巧工刻木作美人形象,恒置座侧。问左右:“布复有女否?”答曰:“布大女适故卫尉冯朝子纯。”即夺纯妻入宫,大有宠,拜为左夫人,昼夜与夫人房宴,不听朝政,使尚方以金作华燧、步摇、假髻以千数。令宫人著以相扑,朝成夕败,辄出更作,工匠因缘偷盗,府藏为空。会夫人死,皓哀愍思念,葬于苑中,大作冢,使工匠刻柏作木人,内冢中以为兵卫,以金银珍玩之物送葬,不可称计。已葬之后,皓治丧於内,半年不出。国人见葬太奢丽,皆谓皓已死,所葬者是也。皓舅子何都颜状似皓,云都代立。临海太守奚熙信讹言,举兵欲还诛都,都叔父植时为备海督,击杀熙,夷三族,讹言乃息,而人心犹疑。", + xiahoulingnv: "夏侯令女,字令女,名不详。生卒年不详,三国时期人物。夏侯文宁之女(《三国演义》中为夏侯令之女),曹文叔之妻。其事迹见于《三国志·魏书·诸夏侯曹传第九》裴松之注引皇甫谧《列女传》。而在《三国演义》中,由于作者断句错误,便认为“夏侯令女”是“夏侯令之女”之意(见《三国演义》第107回:“乃夏侯令女也”,由其语气可推断)。", + lvlingqi: "吕玲绮,虚拟人物,源于日本光荣株式会社(现光荣特库摩公司)旗下游戏《真·三国无双》系列,初次登场于《真三国无双7:猛将传》。吕布的女儿,寂寥而威风凛凛的战姬,发挥着不亚于父亲的武艺,非常勇敢地身先士卒立于前线。虽然有着能够直面困难的坚强意志,却由于过去的经历而有着非常害怕孤独的一面。", + liuyong: "刘永,字公寿,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅之弟。章武元年(221年)六月,封鲁王。建兴八年(230年),改封甘陵王。咸熙元年(264年),蜀汉灭亡,刘永被迁往洛阳,被任命为奉车都尉,封乡侯。", + wanniangongzhu: "刘氏(生卒年不详),河南郡雒阳县(今河南省洛阳市)人,汉灵帝刘宏之女,汉少帝刘辩与汉献帝刘协的姐妹,封万年公主。", + mamidi: "马日磾(?~194年),字翁叔。扶风茂陵(今陕西省兴平市)人。东汉中后期大臣,经学大师马融之族孙(一作族子)。马日磾年轻时即继承马融学说,以才学入仕。曾任谏议大夫,与蔡邕、卢植等人东观典校官藏的《五经》记传,并参与续写《东观汉记》。后历任射声校尉、太尉、太常等职。初平三年(192年),掌权的李傕任命马日磾为太傅、录尚书事,与太仆赵岐共同出使关东。他到寿春袁术处后,对其多有所求,遭袁术轻鄙,袁术遂夺其符节,来随意征辟将士,并企图强迫马日磾任其军师,马日磾求去不能,忧愤发病,兴平元年(194年),卒于寿春。", + guanning: "管宁(158年—241年),字幼安。北海郡朱虚县(今山东省安丘、临朐东南)人。汉末三国时期著名隐士。管宁与华歆、邴原并称为“一龙”。汉末天下大乱时,与邴原及王烈等人避于辽。在当地只谈经典而不问世事,做讲解《诗经》《书经》,谈祭礼、整治威仪、陈明礼让等教化工作,人们都很乐于接受他的教导。直到魏文帝黄初四年(公元223年)才返乡,辽东太守公孙恭亲自送别。此后曹魏几代帝王数次征召管宁,他都没有应命。正始二年(公元241年),管宁逝世,年八十四。著有《氏姓论》。", + tenggongzhu: "滕公主,名讳不详,三国人物,吴大帝孙权之女。一说为养女,生父为孙权堂弟孙奂。黄武年间(222年—228年),以公主身份下嫁功臣滕胄之子滕胤,当时滕胤年仅20岁。滕胤皮肤白皙,容貌俊美,每逢入朝大臣们没有不惊叹称羡的。滕胤仕官后,上书言及时局,又对政策多有匡弼。孙权对公主也特别宠爱,因为滕胤的缘故,又格外增加对公主的赏赐,又几次探望慰劳。少帝孙亮时期,孙綝以宗室身份独揽大权作恶多端,引发群臣不满。五凤三年(256年)滕胤与连襟吕据密谋推翻孙綝,事败遭到夷三族 。公主则被亲兄孙壹救出,携其逃亡曹魏。", + caimaozhangyun: "蔡瑁,字德珪,生卒年不详。襄阳蔡州人,东汉末年荆州名士。少年时与曹操交好。初平元年(公元190年),刘表为荆州刺史。时宗贼猖獗,蔡瑁协助刘表诛杀宗贼,平定荆州之地,蔡瑁因此得刘表重用,并在刘表任镇南将军时担任他的军师。刘表病亡后,蔡瑁拥护刘表幼子刘琮继位,并逼迫他投降南征的曹操。蔡瑁在曹操麾下历任从事中郎、司马、长水校尉,受封汉阳亭侯。张允,生卒年不详,荆州牧刘表的外甥,与蔡瑁一样是刘表幼子刘琮的党羽。刘表病重之时,张允害怕刘表会把州牧之位传给长子刘琦,于是将远赴而来的刘琦阻于门外,不准他与刘表相见。曹操大军到达新野时,张允也随蔡瑁一同投降曹操。之后便隐没于历史之中,并无记载。在《三国演义》中,蔡瑁张允擅长水战,是东吴心腹大患。周瑜用反间计诱骗曹操除掉二人,使得曹军再无能够统领水军的大将。", + zhangxun: "张勋,东汉末年军阀袁术帐下大将,袁术称帝后受封大将军。初平四年(公元193年),袁术引兵入陈留,被曹操、袁绍合力击败,逃至雍丘。后入九江,杀死扬州刺史陈温而自领之,并任命张勋、桥蕤为大将。时孙策依附于袁术,被表为怀义校尉,张勋对其倾心敬服。袁术称帝后,任命张勋为大将军,攻打吕布,大败而还。其后曹操又以袁术称帝为名南下进攻,袁术闻之大惊,即走度淮,留张勋、桥蕤守蕲阳以拒曹。曹操破其军,斩桥蕤,张勋退走。建安四年(公元199年),袁术病死,张勋率残军欲南投孙策,途中被袁术旧部刘勋俘虏,其后下落不明。", + huzhao: "胡昭(162年-250年),字孔明,颍川(治今河南禹州)人。汉末三国时期隐士、书法家。胡昭善长隶书,与钟繇、邯郸淳、卫觊、韦诞齐名。有“钟氏小巧,胡氏豪放”之说,世人并称“钟胡”。", + guanhai: "管亥(生卒年不详),青州黄巾军渠帅,率军侵略北海,围北海相孔融于都昌。孔融派遣太史慈突围而出,前往平原向刘备求援,刘备率军来到,击退管亥。《三国演义》中管亥在单挑中为关羽斩杀。", + yinfuren: "尹夫人,原汉大将军何进的儿媳,丈夫早逝,生有一子何晏。曹操任司空时娶尹氏为妾,一并收养何晏,并生有一子曹矩。", + chengui: "陈珪(生卒年不详),一作圭,字汉瑜。徐州下邳(治今江苏睢宁西北)人,广汉太守陈亹之孙,太尉陈球之侄,吴郡太守陈瑀(一作陈璃)、汝阴太守陈琮的从兄,陈登、陈应之父。官至沛相。", + wanglie: "王烈,字彦方(141-219),平原县(今山东德州平原)人。生于永和六年(公元141年),卒于建安二十三年(公元218年)。王烈少时师从陈寔,闻名遐迩。董卓作乱时避乱辽东,并多次拒绝曹操的聘请。七十八岁时病死于辽东。", + panghui: "庞会,(214—?),三国时期曹魏名将,庞德之子。曹丕即位后,思庞德忠烈,遂赐庞会等兄弟四人爵关内侯,邑各百户。庞会勇烈,有先父之风,官至中尉将军,封列侯。", + chenjiao: "陈矫(?-237年7月11日),字季弼,广陵郡东阳县(治今安徽省天长市西北,今地属江苏省如皋市)人。三国时期曹魏名臣。陈矫本姓刘,因过继与母族而改姓陈。早年避乱江东,后广陵太守陈登请为功曹。曹操辟为丞相掾属,迁任相县令,转任征南长史。又为彭城、乐陵太守,迁任魏郡西部都尉。曹操东征,拜丞相长史,转西曹属、尚书。曹丕称帝,领吏部事,封高陵亭侯,迁尚书令。明帝继位后,进爵东乡侯,后转侍中,加光禄大夫,又拜司徒。景初元年(237年),陈矫去世,谥贞侯。", + gongsundu: "公孙度 (?-204年),字升济,辽东襄平(今辽宁辽阳)人,东汉末年辽东太守。少随父迁居玄菟郡。初为玄菟小吏,建宁二年(169年),继升尚书郎、冀州刺史,后被免官。初平元年(190年),经同乡徐荣推荐,被董卓任命为辽东太守。公孙度到任后,厉行严刑峻法,打击豪强势力,使令行政通,羽翼渐丰。不久,中原地区董卓乱起,各地军阀无暇东顾。公孙度趁机自立为辽东侯、平州牧。继则东伐高句丽,西击乌桓,南取辽东半岛,越海取胶东半岛北部东莱诸县,开疆扩土;又招贤纳士,设馆开学,广招流民,威行海外,俨然以辽东王自居。建安九年(204年)病逝,子公孙康继承其位由于公孙度的锐意进取和苦心经营,使辽东地区在汉末三国的战乱年代,获得了暂时的安宁,推动了当地生产技术和封建文化的发展。", + leibo: "雷薄(生卒年不详),本为东汉末年袁术麾下部将。离开称帝后昏庸奢侈的袁术,与陈兰一起占据嵩山为山贼。后来袭击兵败的袁术,抢夺财宝。同时在《三国演义》中也有出场。", + liupi: "刘辟,东汉末年黄巾起义军将领。黄巾军将领。黄巾之乱后,与龚都一起率军盘踞在汝南。欲追随刘备,将汝南让给刘备。《三国演义》中,在与曹操的部将高览交战时,为保护刘备而战死。", + zhenghun: "郑浑(生卒年不详),字文公。开封(今河南省开封市)人。汉末及三国时期曹魏大臣,东汉名儒郑众曾孙、名士郑泰之弟。郑浑早年避乱淮南,后转投豫章太守华歆。又被曹操辟为掾属,历任下蔡县长、邵陵县令,任内颇有政绩,深得民心。任左冯翊时,击杀扰乱郡县的梁兴,又击败作乱的山贼。历任上党太守、京兆尹、丞相掾属等职。曹丕称帝后,拜侍御史,加驸马都尉。先后任阳平、沛郡太守,任内兴修水利,使农田常年丰收,被百姓称为“郑陂”。后转任山阳和魏郡太守。魏明帝曹叡听闻郑浑的事迹之后,下诏将其政绩布告天下。官至将作大匠。卒年不详。", + furongfuqian: "傅肜(?-222年),义阳(今湖北枣阳)人,三国时蜀汉将领。刘备攻伐吴国时,傅肜为别督。后刘备被陆逊击败,傅肜率部断后,奋战至死。死前怒斥道:“吴狗!何有汉将军降者!”
    傅佥[qiān] ( ? ~263年),义阳(治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。", + qinlang: "秦朗(生卒年不详),字元明,小字阿蘇(一作阿鳔),新兴(治今山西忻州)云中人。三国时期曹魏将领,官至骁骑将军、给事中,曾率兵讨伐鲜卑轲比能和步度根的叛军。", + xianglang: "向朗(约167年—247年),字巨达。襄阳郡宜城县(今湖北宜城)人,三国时期蜀汉官员、藏书家、学者。向朗早年师从于司马徽,并被荆州牧刘表任命为临沮县长。后随刘备入蜀,历任巴西、牂牁、房陵太守,并拜步兵校尉,领丞相长史,随丞相诸葛亮北伐。因包庇马谡被免职,后为光禄勋,转左将军、特进,封显明亭侯。曾代理丞相册封张皇后及太子刘璿。晚年专心研究典籍,诱导青年学习,家中藏书丰富,受到举国尊重。延熙十年(247年),向朗去世。《全三国文》收录有一篇《遗言戒子》", + yuantanyuanxiyuanshang: "袁谭、袁尚的武将介绍请移步「袁谭袁尚」,此处为袁熙的介绍。
    袁熙(?-207年),字显奕(《后汉书》、《东光世系》作显雍),汝南郡汝阳县(今河南商水)人,是东汉末年占据河北的军阀袁绍次子,袁绍打败公孙瓒后,令袁熙为幽州刺史。袁绍官渡兵败后不久病死,其兄长袁谭、弟弟袁尚各自独立,互相攻伐,曹操趁机进攻袁谭、袁尚,并逐渐占河北。袁熙接纳兵败的袁尚后,因为属下叛变而逃往乌桓,被曹操击败后,逃往辽东太守公孙康帐下,却被公孙康杀死,二人首级被献给曹操。", + zhanghu: "张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。张辽之子,三国时期曹魏武将。官至偏将军,封晋阳侯,有一子张统。", + mengjie: "孟节,南中蛮王孟获之兄。是小说《三国演义》中杜撰的人物,史上并无记载。诸葛亮南征孟获之时,帐下军士因误饮哑泉之水失语。当地山神告知诸葛亮,言万安溪畔有一高士隐居彼处,号“万安隐者”。其草庵后有一泉,名安乐泉,可解哑泉之毒。庵前生有一草,名薤叶芸香,可防瘴气之染。诸葛亮于是带人连夜前往其隐居之处,求得泉水草叶解毒防瘴,拜求隐士姓名,方知其名为孟节,由此而叹:“方信盗跖、下惠之事,今亦有之。”诸葛亮欲申奏刘禅,立其为王,孟节辞之。又以金帛赠之,孟节坚辞不受。诸葛亮嗟叹不已,拜别而回。", + peiyuanshao: "裴元绍,《三国演义》人物,原黄巾军之武将。黄巾起义失败之后,与周仓一同率领残部在山中落草当山贼。公元200年,在关羽欲返刘备旗下,在突破曹操的五道关卡后路过其落草之地,与周仓一同向关羽要求能以期成为关羽家臣。但此时仅周仓同行,其他弟兄则于山中等待。不久后,因其欲夺偶然路过的赵云之马,反遭讨伐战败身死。", + zhangchu: "张楚,《阵面对决》第九弹“燎原”中登场的一个原创人物。她是张角的女儿,张宁的姐姐,在逃亡途中被刘备捕获。之后在诸葛亮的建议下,张楚被囚禁。在《阵面对决》的“怒焰”故事线中,张楚随着刘备入了西川,并被软禁在成都。夷陵之战后,刘备大败,全国主力外出用以支援刘备,朝内空虚,张楚趁机逃跑。", + dongwan: "董绾,袁术老婆,嫉妒冯芳女的美貌,与冯方女有矛盾。", + yuanyin: "袁胤(生卒年不详),东汉末期人物,据说是袁隗之子,是袁术从弟。兴平二年(公元195年)被袁术任命为丹杨太守,后因孙策平定江东被逐。建安四年(公元199年),袁术卒,袁胤因畏惧曹操,遂率领袁术部曲并带着其灵柩及妻子到皖城并投奔庐江太守刘勋。6个月后皖城被孙策所破,袁胤等人迁居吴郡,此后事迹不详。", + gaoxiang: "高翔(又作高详、高祥)(生卒年不详),荆州南郡(治今湖北省公安县)人,三国时期蜀汉将领。曾随刘备攻打汉中,后又随蜀汉丞相诸葛亮参加北伐曹魏的战争。建兴九年(公元231年)的北伐中大破司马懿。官至杂号大将军(即某杂号将军加大,但无考何杂号将军),封玄乡侯。此后,关于高翔的记载不详。", + zhoushan: "周善,《三国演义》中人物,不见于正史记载。为吴侯孙权的家将,此人最有胆量,自幼穿房入户,多随孙策。权为骗其妹回吴,遣善将五百人,扮为商人,分作五船;更诈修国书,以备盘诘;船内暗藏兵器。周善领命,往荆州。正骗得孙夫人带刘禅上船,赵云前来抢走禅,周善在后梢挟住舵,只顾放船下水。正僵持时张飞赶到,周善见张飞上船,提刀来迎,被张飞手起一剑砍倒,提头掷于孙夫人前。", + zhangkai: "张闿,陶谦的手下都尉。奉命截杀曹操之父曹嵩,杀死曹嵩,夺去财宝逃往淮南投奔袁术,并担任刺杀陈王刘宠和陈国相骆俊的任务。", + mengyou: "孟优,《三国演义》里的人物,南蛮王孟获之弟。与诸葛亮的南征军交战,向败战的兄长推荐朵思大王,劝兄长借助朵思之力与蜀汉军对抗。后来与兄长一起发誓归顺蜀汉。", + liuchongluojun: "刘宠(?~197年),汉明帝刘庄玄孙,陈敬王刘羡曾孙,陈顷王刘崇之孙,陈孝王刘承之子,陈国第六位国君,也是东汉陈国的最后一位国君。骆俊(?-197),字孝远,东汉末年扬州会稽郡乌伤县(今浙江义乌)人。宗室陈王刘宠的国相,在任期间励精图治,深得民众爱戴。刘宠勇猛过人,善使弓弩,箭法高超。在其父刘承死后,继承陈王爵位。中平年间,黄巾军起义,郡县官兵都弃城逃走,刘宠于是征兵自守卫。当时天下饥荒,诸王侯都已不再享有租赋,反屡遭抢掠,有的甚至流离在外,死于荒野。只有陈国仍很富强,邻郡百姓纷纷前去投靠,陈国拥有部众达十余万人。初平元年(190年),各州郡起兵讨伐董卓,刘宠率军屯驻阳夏,自称辅汉大将军。建安二年(197年),袁术向陈国求取粮草,遭陈国国相骆俊拒绝,袁术大为生气,便派刺客张闿假装路过陈国,乘机杀死骆俊和刘宠。", + yuechen: "乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。", + kuaiqi: "蒯祺(?~219年),南郡中卢人,荆州望族子弟,与荆州牧刘表帐下谋士蒯良、蒯越为同族,东汉末年房陵太守。建安二十四年(219年),汉中王刘备遣宜都太守孟达从秭归北攻房陵,蒯祺于战斗中被孟达所部士兵所杀。清朝任兆麟《心斋十种》中的《襄阳记》辑本引用《万历襄阳府志》“(蒯)钦从祖祺妇,即诸葛孔明之姊也”,称蒯祺娶故兖州泰山郡丞诸葛珪长女,即他是知名政治家、蜀汉丞相诸葛亮的姐夫。但在任兆麟之前的《襄阳记》辑本中,并没有这一条。", + pangshanmin: "庞山民,荆州襄阳人,三国时期曹魏大臣。庞山民出身荆州庞氏,为隐士庞德公之子、凤雏庞统的堂兄,娶诸葛亮二姐诸葛氏(“若雪”为网络小说虚构)为妻。后出仕曹魏,历任黄门、吏部郎等职。", + gongsunxiu: "公孙修(?-238),三国时期人物,公孙渊之子。景初元年(237年),魏明帝曹叡派出幽州刺史毌丘俭攻打公孙渊,久战不利回师。公孙渊即自立为燕王,改元绍汉,引诱鲜卑侵扰北方,背叛曹魏。景初二年(238年)春,曹魏又派司马懿和高句丽国王高位宫率军攻打公孙渊,围城日久,公孙渊粮尽之后,与儿子公孙修一起出逃后被擒获,父子二人同时被斩首示众。", + wupu: "吴普,三国时期医药学家。名医华佗弟子。广陵(今扬州)人。约三世纪中叶在世。他以华佗所创五禽戏进行养生锻炼,因获长寿,“年九十余,耳目聪明,齿牙完坚”,但主要是在本草学上有一定成就。所撰《吴普本草》六卷,又名《吴氏本草》,为《神农本草经》古辑注本之一。流行于世达数百年,后代有不少子书引述其内容,如南北朝贾思勰《齐民要术》、唐代官修《艺文类聚》,《唐书·艺文志》还载有该书六卷书目。宋初所修《太平御览》,仍收载其较多条文。自此该书即散佚不存,清焦循有辑本。据辑佚可知,此书对本草药性的叙述较为详明,书中对某一类药常列述前代诸家关于药性的不同叙述,总汇魏晋以前药性研究之成果,又详载药物产地及其生态环境,略述药物形态及采造时月、加工方法等。但南朝齐、梁时陶弘景《本草经集注》对其“草石不分,虫兽无辨”有所批评。", +}; + +export default characterIntro; diff --git a/character/huicui/pinyin.js b/character/huicui/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/huicui/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/huicui/skill.js b/character/huicui/skill.js new file mode 100644 index 000000000..2bbbd4f66 --- /dev/null +++ b/character/huicui/skill.js @@ -0,0 +1,13538 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //吴普 + dcduanti: { + audio: 2, + trigger: { + player: ["useCardAfter", "respondAfter"], + }, + forced: true, + filter(event, player) { + return event._copdcduanti; + }, + onremove: ["dcduanti", "dcduanti_counter"], + group: "dcduanti_counter", + async content(event, trigger, player) { + await player.recover(); + if (player.countMark("dcduanti") >= 5) return; + player.addMark("dcduanti", 1, false); + await player.gainMaxHp(); + }, + subSkill: { + counter: { + trigger: { + player: ["useCard1", "respond"], + }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + async content(event, trigger, player) { + if (!player.countMark("dcduanti_counter")) { + const num = game.getAllGlobalHistory("everything", evt => { + return evt.player === player && ["useCard", "respond"].includes(evt.name) && evt !== trigger; + }).length; + if (num) player.addMark("dcduanti_counter", num, false); + } + player.addMark("dcduanti_counter", 1, false); + if (player.countMark("dcduanti_counter") % 5 === 0) trigger._copdcduanti = true; + player.markSkill("dcduanti"); + }, + }, + }, + intro: { + markcount(storage, player) { + return player.countMark("dcduanti_counter"); + }, + content(storage, player) { + return `
  • 已使用过${get.cnNumber(player.countMark("dcduanti_counter"))}张牌
  • 已以此法增加${player.countMark("dcduanti")}点体力上限`; + }, + }, + }, + dcshicao: { + audio: 2, + enable: "phaseUse", + onremove: ["dcshicao_aiRecord"], + chooseButton: { + dialog(event, player) { + return ui.create.dialog("###识草###选择一种类型与要摸牌的来源", [["basic", "trick", "equip"].map(type => [type, get.translation(type)]), "tdnodes"], [["牌堆顶", "牌堆底"], "tdnodes"]); + }, + check(button) { + const player = get.player(); + const bottom = player.storage.dcshicao_bottom, + aiStorage = player.getStorage("dcshicao_aiRecord"); + if (bottom && aiStorage.length > 0 && get.name(ui.cardPile.lastChild, false) === get.name(aiStorage.lastItem, false)) { + if (button.link === "牌堆底" || button.link === get.type2(aiStorage.lastItem, false)) return 20; + } + if (button.link === "牌堆顶" || button.link === "basic") return 10; + return 5 + Math.random(); + }, + filter(button, player) { + if (!ui.selected.buttons.length) return true; + return ui.selected.buttons[0].parentNode != button.parentNode; + }, + select: 2, + backup(links, player) { + if (links[0].includes("牌堆")) links.reverse(); + return { + audio: "dcshicao", + type: links[0], + pos: links[1], + filterCard: () => false, + selectCard: -1, + async content(event, trigger, player) { + let { type, pos } = lib.skill.dcshicao_backup; + game.log(player, "声明了", `#y${get.translation(type)}牌`); + const next = player.draw(); + const bottom = pos === "牌堆底"; + if (bottom) { + next.set("bottom", true); + if (player.getStorage("dcshicao_aiRecord").length > 0) { + player.storage.dcshicao_aiRecord.pop(); + } + } + const drawnCards = await next.forResult(); + if (get.type2(drawnCards[0], player) === type) return; + let cards; + if (!bottom) { + cards = get.bottomCards(2); + cards.reverse(); + } else cards = get.cards(2); + await game.cardsGotoOrdering(cards); + await player.viewCards(`${bottom ? "牌堆顶" : "牌堆底"}的两张牌(靠左的在牌堆更靠上)`, cards); + player.storage.dcshicao_record = cards.slice(); + player.storage.dcshicao_aiRecord = cards.slice(); + player.storage.dcshicao_bottom = !bottom; + const func = lib.skill.dctongguan.localMark, + skill = "dcshicao"; + if (event.player.isUnderControl(true)) func(skill, player); + else if (event.isOnline()) player.send(func, skill, player); + if (bottom) cards.reverse(); + await game.cardsGotoPile(cards, bottom ? "insert" : null); + player.tempBanSkill("dcshicao"); + }, + ai: { + result: { player: 1 }, + }, + }; + }, + prompt(links, player) { + return `点击“确定”,从${links[1]}摸一张牌`; + }, + }, + intro: { + mark(dialog, content, player) { + var cards = player.getStorage("dcshicao_record"); + if (cards && cards.length) { + if (player.isUnderControl(true)) { + dialog.addText(`上一次观看的${player.storage.dcshicao_bottom ? "牌堆底" : "牌堆顶"}的牌:`); + dialog.addAuto(cards); + } else { + return "不给看"; + } + } + }, + }, + subSkill: { + backup: {}, + }, + ai: { + order: 8, + result: { + player: 1, + }, + }, + }, + //新杀曹爽 + dcjianzhuan: { + audio: 2, + trigger: { player: "useCard" }, + filter(event, player) { + const evtx = event.getParent("phaseUse"); + return ( + player.isPhaseUsing() && + player.getHistory("useSkill", evt => { + return evt.skill == "dcjianzhuan" && evt.event.getParent("phaseUse") == evtx; + }).length < + 4 - player.getStorage("dcjianzhuan").length + ); + }, + forced: true, + derivation: "dcjianzhuan_faq", + async content(event, trigger, player) { + const evtx = event.getParent("phaseUse"), + num = player.getHistory("useSkill", evt => { + return evt.skill == "dcjianzhuan" && evt.event.getParent("phaseUse") == evtx; + }).length, + info = get.info("dcjianzhuan").choices; + let choices = [], + choiceList = [], + map = {}; + for (const i in info) { + map[info[i].intro] = i; + if (player.getStorage("dcjianzhuan").includes(i) || player.getStorage("dcjianzhuan_used").includes(i)) continue; + choices.push(info[i].intro); + choiceList.push(info[i].introx(num)); + } + const { + result: { control }, + } = await player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => { + const player = get.event("player"), + num = get.event("num"), + info = get.info("dcjianzhuan").choices; + let choices = get.event("controls").slice(), + map = get.event("map"); + return choices.sort((a, b) => info[map[b]].ai_effect(player, num) - info[map[a]].ai_effect(player, num))[0]; + }) + .set("num", num) + .set("map", map) + .set("prompt", "渐专:请选择一项执行"); + if (control) { + if (!player.storage.dcjianzhuan_used) { + player.when("phaseUseAfter").then(() => delete player.storage.dcjianzhuan_used); + } + player.markAuto("dcjianzhuan_used", [map[control]]); + await info[map[control]].content(player, num); + } + }, + choices: { + discard_target: { + intro: "拆牌", + introx: num => "令一名角色弃置" + num + "张牌", + weight: 1, + ai_effect(player, num) { + return game.hasPlayer(target => { + return get.effect(target, { name: "guohe_copy2" }, player, player) > 0; + }) + ? 2 + num + : 0; + }, + async content(player, num = 1) { + const { + result: { bool, targets }, + } = await player + .chooseTarget("令一名角色弃置" + num + "张牌", true) + .set("ai", target => { + return get.effect(target, { name: "guohe_copy2" }, get.event("player"), get.event("player")) * Math.sqrt(Math.min(get.event("num"), target.countDiscardableCards(target, "he"))); + }) + .set("num", num); + if (bool) { + const target = targets[0]; + player.line(target); + await target.chooseToDiscard(num, "he", true); + } + }, + }, + draw_self: { + intro: "摸牌", + introx: num => "摸" + num + "张牌", + weight: 1, + ai_effect(player, num) { + return 3; + }, + async content(player, num = 1) { + await player.draw(num); + }, + }, + recast_self: { + intro: "重铸", + introx: num => "重铸" + num + "张牌", + weight: 1, + ai_effect(player, num) { + return 1; + }, + async content(player, num = 1) { + if (!player.hasCard(lib.filter.cardRecastable, "he")) return; + const { + result: { bool, cards }, + } = await player.chooseCard("重铸" + num + "张牌", "he", num, lib.filter.cardRecastable, true).set("ai", lib.skill.zhiheng.check); + if (bool) await player.recast(cards); + }, + }, + discard_self: { + intro: "弃牌", + introx: num => "弃置" + num + "张牌", + weight: "90%", + ai_effect(player, num) { + let cards = player.getCards("hs"); + cards.sort((a, b) => get.value(b) - get.value(a)); + cards = cards.slice(0, -Math.min(num, cards.length)); + return cards.some(card => player.hasValueTarget(card, true, true)) ? 4 : -4; + }, + async content(player, num = 1) { + await player.chooseToDiscard(num, "he", true); + }, + }, + }, + group: "dcjianzhuan_remove", + subSkill: { + remove: { + audio: "dcjianzhuan", + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + if (player.getStorage("dcjianzhuan").length >= 4) return false; + return player.getStorage("dcjianzhuan_used").length >= 4 - player.getStorage("dcjianzhuan").length; + }, + forced: true, + async content(event, trigger, player) { + const info = get.info("dcjianzhuan").choices; + let map = {}; + let unfixedWeightTotal = 0, + remainedWeight = 100; + let entries = []; + for (const i in info) { + const infox = info[i]; + map[infox.intro] = i; + if (player.getStorage("dcjianzhuan").includes(i)) continue; + let weight = (infox.weight || 1).toString(); + if (weight.endsWith("%")) { + weight = Math.min(remainedWeight, parseInt(weight.slice(0, -1))); + entries.push([infox.intro, weight]); + remainedWeight -= weight; + } else { + weight = parseInt(weight); + unfixedWeightTotal += weight; + entries.push([infox.intro, -weight]); + } + } + entries = entries.map(entry => { + let weight = entry[1]; + if (weight < 0) weight = (-remainedWeight / unfixedWeightTotal) * weight; + return [entry[0], weight]; + }); + let rand = Math.random() * 100; + let removeChoice = entries.find(entry => { + rand -= entry[1]; + return rand < 0; + })[0]; + if (get.isLuckyStar(player) && Object.keys(entries).includes("弃牌")) removeChoice = "弃牌"; + player.markAuto("dcjianzhuan", [map[removeChoice]]); + player.popup(removeChoice); + game.log(player, "移去了", "#g" + removeChoice, "项"); + }, + }, + }, + mark: true, + intro: { + markcount(storage) { + return 4 - (storage || []).length; + }, + content(storage) { + if (!(storage || []).length) return "暂未移去任何项"; + const info = get.info("dcjianzhuan").choices; + let str = ""; + for (const i of storage) { + str += info[i].intro; + str += "、"; + } + str = str.slice(0, -1); + return "已移去" + str + "项"; + }, + }, + }, + dcfanshi: { + unique: true, + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return 4 - player.getStorage("dcjianzhuan").length < 2; + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + async content(event, trigger, player) { + player.awakenSkill("dcfanshi"); + const info = get.info("dcjianzhuan").choices; + let choices = []; + for (const i in info) { + if (!player.getStorage("dcjianzhuan").includes(i)) choices.push(i); + } + if (choices.length) { + for (const choice of choices) { + for (let i = 1; i <= 3; i++) { + await info[choice].content(player, 1); + } + } + } + await player.gainMaxHp(2); + await player.recover(2); + await player.changeSkills(["dcfudou"], ["dcjianzhuan"]); + }, + derivation: "dcfudou", + ai: { + combo: "dcjianzhuan", + }, + }, + dcfudou: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (event.targets.length != 1 || event.target == player) return false; + const color = get.color(event.card); + if (!["black", "red"].includes(color)) return false; + const damage = event.target.getAllHistory("sourceDamage", evt => evt.player == player).length; + return Math.min(1, damage) == (color == "black"); + }, + check(event, player) { + const color = get.color(event.card); + if (color == "red") return get.attitude(player, event.target) > 0; + if (player.getHp() + player.countCards("hs", card => player.canSaveCard(card, player)) <= 1) return false; + return get.effect(player, { name: "losehp" }, player, player) >= get.effect(event.target, { name: "losehp" }, player, player); + }, + prompt2(event, player) { + return "与" + get.translation(event.target) + "各" + (get.color(event.card) == "black" ? "失去1点体力" : "摸一张牌"); + }, + logTarget: "target", + async content(event, trigger, player) { + const color = get.color(trigger.card), + target = trigger.target; + if (color == "red") { + await player.draw("nodelay"); + await target.draw(); + } else { + await player.loseHp(); + await target.loseHp(); + } + }, + }, + //司马师 + dcsanshi: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + filter(event, player) { + return game.roundNumber === 1; + }, + group: ["dcsanshi_gain", "dcsanshi_directHit"], + async content(event, trigger, player) { + const recordedNumbers = []; + let num = get.rand(0, ui.cardPile.childNodes.length - 1); + for (let i = 0; i < ui.cardPile.childNodes.length; i++) { + let j = i + num; + if (j >= ui.cardPile.childNodes.length) j -= ui.cardPile.childNodes.length; + const card = ui.cardPile.childNodes[j], + number = get.number(card, false); + if (!recordedNumbers.includes(number)) { + recordedNumbers.add(number); + card.storage.dcsanshi = true; + num = get.rand(0, ui.cardPile.childNodes.length - 1); + } + } + player.addSkill("dcsanshi_mark"); + }, + subSkill: { + gain: { + audio: "dcsanshi", + trigger: { global: "phaseEnd" }, + filter(event, player) { + return game.hasGlobalHistory("cardMove", evt => { + if (evt.name == "lose") { + if (evt.position !== ui.discardPile) return false; + } else if (evt.name !== "cardsDiscard") return false; + if (lib.skill.dcsanshi_gain.notUseOrRespond(evt, player)) { + return evt.cards.some(card => { + return card.storage.dcsanshi && get.position(card) === "d"; + }); + } + return false; + }); + }, + forced: true, + notUseOrRespond(event, player) { + if (event.name !== "cardsDiscard") return true; + const evtx = event.getParent(); + if (evtx.name !== "orderingDiscard") return true; + const evt2 = evtx.relatedEvent || evtx.getParent(); + return !["useCard", "respond"].includes(evt2.name) || evt2.player !== player; + }, + async content(event, trigger, player) { + const cards = []; + game.checkGlobalHistory("cardMove", evt => { + if (evt.name == "lose") { + if (evt.position !== ui.discardPile) return false; + } else if (evt.name !== "cardsDiscard") return false; + if (lib.skill.dcsanshi_gain.notUseOrRespond(evt, player)) { + cards.addArray( + evt.cards.filter(card => { + return card.storage.dcsanshi && get.position(card) === "d"; + }) + ); + } + }); + if (cards.length) player.gain(cards, "gain2"); + }, + }, + directHit: { + audio: "dcsanshi", + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return ( + event.cards && + event.cards.some(card => { + return card.storage.dcsanshi; + }) + ); + }, + async content(event, trigger, player) { + trigger.directHit.addArray(game.filterPlayer()); + game.log(trigger.card, "不可被响应"); + }, + }, + mark: { + trigger: { + player: "gainEnd", + global: "loseAsyncEnd", + }, + forced: true, + popup: false, + silent: true, + lastDo: true, + filter(event, player) { + if (!["dcsanshi", "dcchenlve"].every(skill => player.hasSkill(skill, null, false, false))) return false; + const cards = event.getg(player); + if (!cards.length) return false; + return cards.some(card => card.storage.dcsanshi); + }, + async content(event, trigger, player) { + var cards = trigger.getg(player); + if (cards.length) { + cards = cards.filter(card => card.storage.dcsanshi); + player.addGaintag(cards, "dcsanshi_tag"); + } + }, + }, + }, + ai: { + threaten: 3, + }, + }, + dczhenrao: { + audio: 2, + trigger: { global: "useCardToPlayered" }, + filter(event, player) { + if ( + (() => { + if (event.player === player) { + if (!event.isFirstTarget) return false; + return event.targets.some(target => target !== player); + } + return event.target === player; + })() + ) { + return event.targets.concat(event.player).some(target => { + return target.countCards("h") > player.countCards("h") && !player.getStorage("dczhenrao").includes(target); + }); + } + return false; + }, + direct: true, + async content(event, trigger, player) { + const result = await player + .chooseTarget(get.prompt("dczhenrao"), "对一名可选角色造成1点伤害", (card, player, target) => { + return get.event("targets").includes(target) && !player.getStorage("dczhenrao").includes(target); + }) + .set( + "targets", + trigger.targets.concat(trigger.player).filter(target => target.countCards("h") > player.countCards("h")) + ) + .set("ai", target => { + const player = get.player(); + return get.damageEffect(target, player, player); + }) + .forResult(); + if (!result.bool) return; + const target = result.targets[0]; + player.logSkill("dczhenrao", target); + await target.damage(); + await game.asyncDelayx(); + if (!player.storage.dczhenrao) { + player.when({ global: "phaseAfter" }).then(() => player.unmarkSkill("dczhenrao")); + } + player.markAuto("dczhenrao", target); + }, + intro: { + content: "已以此法对$造成过伤害", + onunmark: true, + }, + ai: { + expose: 0.2, + threaten: 3, + }, + }, + dcchenlve: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filterCard: () => false, + selectCard: [-2, -1], + async content(event, trigger, player) { + player.awakenSkill("dcchenlve"); + const cards = ["cardPile", "discardPile"].map(pos => Array.from(ui[pos].childNodes)).flat(); + const sishiList = []; + const isSishi = card => card.storage.dcsanshi; + const lose_list = [], + players = game.filterPlayer(); + players.forEach(current => { + const pos = "ej" + (current === player ? "h" : ""); + const sishis = current.getCards(pos, isSishi); + if (sishis.length > 0) { + current.$throw(sishis); + lose_list.push([current, sishis]); + sishiList.addArray(sishis); + } + }); + if (lose_list.length) { + await game.loseAsync({ lose_list }).setContent("chooseToCompareLose"); + } + sishiList.addArray(cards.filter(isSishi)); + if (lose_list.length) await game.asyncDelayx(); + player.gain(sishiList, "gain2"); + player + .when("phaseEnd") + .filter(evt => evt === event.getParent("phase")) + .vars({ + sishiList, + }) + .then(() => { + const lose_list = [], + players = game.filterPlayer(); + players.forEach(current => { + const cards = current.getCards("hej").filter(card => sishiList.includes(card)); + if (cards.length > 0) { + current.$throw(cards); + lose_list.push([current, cards]); + } + }); + if (lose_list.length) { + game.loseAsync({ lose_list }).setContent("chooseToCompareLose"); + } + }) + .then(() => { + game.cardsGotoSpecial(sishiList); + game.log(sishiList, "被移出了游戏"); + }); + player + .when("die") + .vars({ + sishiList, + }) + .assign({ + forceDie: true, + }) + .then(() => { + game.cardsDiscard(sishiList); + game.log(sishiList, "被置入了弃牌堆"); + }); + }, + ai: { + order: 0.5, + result: { + player(player) { + if (player.getHp(true) > 1 && player.countCards("he") > 1) return 0; + if (!player.isDamaged() && (player.countCards("h") > 1 || player.countCards("e") > 0)) return 0; + return 13; + }, + }, + combo: "dcsanshi", + }, + }, + //王凌 + dcjichou: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + const evts = player.getHistory("useCard", evt => evt.getParent("phaseUse") === event); + const names = evts.map(evt => evt.card.name).unique(); + return evts.length > 0 && evts.length === names.length && evts.some(evt => evt.cards.some(card => get.position(card) === "d")); + }, + async content(event, trigger, player) { + const cards = []; + player.checkHistory("useCard", evt => { + if (evt.getParent("phaseUse") !== trigger) return; + cards.addArray(evt.cards.filterInD("d")); + }); + const num = Math.min(cards.length, game.countPlayer()); + if (_status.connectMode) + game.broadcastAll(() => { + _status.noclearcountdown = true; + }); + const [bool, links] = await player + .chooseButton([`集筹:将${num < cards.length ? "至多" + get.cnNumber(num) + "张牌" : "任意张牌"}交给等量角色`, cards]) + .set("selectButton", [1, num]) + .set("population", [game.countPlayer(current => get.attitude(player, current) > 0), game.countPlayer(current => get.attitude(player, current) < 0)]) + .set("ai", button => { + const card = button.link, + population = get.event("population"); + if (ui.selected.buttons.length > population[0] + population[1]) return 0; + if (ui.selected.buttons.length > get.event("population")[0]) return 2 - get.value(card); + return 2 + get.value(card); + }) + .forResult("bool", "links"); + if (bool) { + const [bool, targets] = await player + .chooseTarget(`集筹:请选择${get.cnNumber(links.length)}名角色`, `操作提示:请按照顺序选择要交给牌的目标,令这些角色按顺序获得这些牌:${get.translation(links)}`, true, links.length) + .set( + "values", + links.map(i => get.value(i)) + ) + .set("ai", target => { + const att = get.attitude(get.player(), target); + const chosenNum = ui.selected.targets.length, + values = get.event("values"); + if (values[chosenNum] > 0) return att; + return 0.01 - att; + }) + .forResult("bool", "targets"); + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (bool) { + const gain_list = [], + givenCards = []; + targets.forEach((target, i) => { + player.line(target, "green"); + gain_list.push([target, links[i]]); + givenCards.push(links[i]); + game.log(player, "将", links[i], "交给了", target); + }); + event.getParent().set("givenCards", givenCards); + await game + .loseAsync({ + gain_list, + player: player, + cards: givenCards, + giver: player, + animate: "gain2", + }) + .setContent("gaincardMultiple"); + const toDraw = player.getAllHistory("useSkill", evt => { + const evtx = evt.event; + return evt.skill === "dcjichou" && evtx.givenCards && evtx.givenCards.length; + })[0].event.givenCards.length; + await game.asyncDelayx(); + await player.draw(toDraw); + } + } + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + }, + }, + dcmouli: { + audio: 2, + trigger: { player: "phaseEnd" }, + filter(event, player) { + const names = []; + player.checkAllHistory("useSkill", evt => { + if (evt.skill !== "dcjichou") return; + const evtx = evt.event; + if (evtx.givenCards) names.addArray(evtx.givenCards.map(card => get.name(card, false))); + }); + return names.length >= 5; + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + derivation: ["dczifu"], + async content(event, trigger, player) { + player.awakenSkill("dcmouli"); + await player.gainMaxHp(); + await player.recover(); + await player.addSkills("dczifu"); + }, + ai: { + combo: "dcjichou", + }, + }, + dczifu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + async content(event, trigger, player) { + const maxLimit = Math.min(5, player.maxHp); + let count = player.countCards("h"); + if (count < maxLimit) { + await player.draw(maxLimit - count); + } + if (!player.hasHistory("gain", evt => evt.getParent(2) === event)) return; + count = player.countCards("h"); + const toKeepCount = player + .getCards("h") + .map(card => get.name(card)) + .unique(); + if (count > toKeepCount) { + const [bool, cards] = await player + .chooseCard("自缚:选择要保留的手牌", "选择不同牌名的手牌各一张,然后弃置其余手牌", toKeepCount) + .set("filterCard", card => { + if (!ui.selected.cards.length) return true; + const name = get.name(card, player); + if (ui.selected.cards.some(card => get.name(card, player) === name)) return false; + return true; + }) + .set("complexCard", true) + .set("ai", get.value) + .forResult("bool", "cards"); + if (!bool) return; + const toDiscard = player.getCards("h").removeArray(cards); + if (toDiscard.length) player.discard(toDiscard); + } + }, + ai: { + halfneg: true, + }, + }, + //蒋济 + dcshiju: { + audio: 2, + global: "dcshiju_global", + subSkill: { + global: { + audio: "dcshiju", + forceaudio: true, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.hasPlayer(current => { + if (current == player || !current.hasSkill("dcshiju")) return false; + return player.countCards("he"); + }); + }, + filterTarget(card, player, target) { + return target != player && target.hasSkill("dcshiju"); + }, + selectTarget() { + const num = game.countPlayer(current => { + return current.hasSkill("dcshiju"); + }); + return num > 1 ? 1 : -1; + }, + filterCard: true, + position: "he", + check(card) { + const player = get.player(); + if (get.type(card) === "equip") { + const subtype = get.subtype(card); + let valueFix = 0; + if ( + game.hasPlayer(current => { + if (current == player || !current.hasSkill("dcshiju")) return false; + if (current.hasUseTarget(card) && !player.countEmptySlot(subtype)) return true; + }) + ) + valueFix += 5; + if (player.countCards("he", { subtype }) > 1) { + return valueFix + 12 - get.equipValue(card); + } + return valueFix + 6 - get.value(card); + } + return 4 - get.value(card); + }, + prompt() { + const list = game.filterPlayer(current => { + return current.hasSkill("dcshiju"); + }); + return `将一张牌交给${get.translation(list)}${list.length > 1 ? "中的一人" : ""},若此牌为装备牌,其可以使用之,且你本回合的攻击范围+X(X为其装备区的牌数)。若其以此法替换了装备,你与其各摸两张牌。`; + }, + discard: false, + lose: false, + prepare(cards, player, targets) { + player.$give(cards, targets[0], false); + }, + async content(event, trigger, player) { + const card = event.cards[0], + target = event.target; + await player.give(card, target); + if (!target.getCards("h").includes(card) || get.type(card) !== "equip") return; + const bool = await target.chooseUseTarget(card).forResultBool(); + if (!bool) return; + const count = target.countCards("e"); + if (count > 0) { + player.addTempSkill("dcshiju_range"); + player.addMark("dcshiju_range", count, false); + if ( + target.hasHistory("lose", evt => { + return evt.getParent().name === "equip" && evt.getParent(5) === event && evt.es && evt.es.length > 0; + }) + ) { + for (const current of [player, target]) await current.draw(2); + } + } + }, + ai: { + order: 10, + result: { + target(player, target) { + const card = ui.selected.cards[0]; + if (!card) return; + if (target.hasSkillTag("nogain") && get.type(card) != "equip") return 0; + if (card.name == "du" && target.hasSkillTag("nodu")) return 0; + if (get.value(card) < 0) return -5; + const nh = target.countCards("h"); + return Math.max(1, 5 - nh); + }, + }, + }, + }, + range: { + charlotte: true, + onremove: true, + mod: { + attackRange: function (player, num) { + return num + player.countMark("dcshiju_range"); + }, + }, + intro: { content: "本回合攻击范围+#" }, + }, + }, + }, + dcyingshi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget) return false; + if (get.type(event.card) !== "trick") return false; + return true; + }, + direct: true, + async content(event, trigger, player) { + const result = await player + .chooseTarget() + .set("prompt", get.prompt("dcyingshi")) + .set("prompt2", `令其中一名角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation(trigger.card.name)};⒉弃置${get.cnNumber(player.countCards("e"))}张牌,此牌对其无效。`) + .set("filterTarget", (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("targets", trigger.targets) + .set( + "toFriends", + (() => { + const isPositive = trigger.targets.some(current => { + return get.effect(current, trigger.card, trigger.player, player) > 0; + }), + isNegative = trigger.targets.some(current => { + return get.effect(current, trigger.card, trigger.player, player) < -5; + }); + if ((player.hasSkill("dcyingshi_choice1") || player.countCards("e") < 2) && isNegative) return true; + if (!player.hasSkill("dcyingshi_choice1") && ((get.tag(trigger.card, "norepeat") && isNegative) || isPositive)) return true; + return false; + })() + ) + .set("ai", target => { + const player = get.player(), + count = player.countCards("e"), + att = get.attitude(player, target); + if (att > 0 && get.event("toFriends")) { + if (target.countCards("he", card => get.value(card) < 5) < count) return 0; + return att; + } + if (player.hasSkill("dcyingshi_choice1") && !count) return 0; + return -get.attitude(player, target); + }) + .forResult(); + if (!result.bool) return; + const target = result.targets[0]; + player.logSkill("dcyingshi", target); + let bool; + if (!player.hasSkill(`dcyingshi_choice2`)) { + const count = player.countCards("e"), + forced = player.hasSkill("dcyingshi_choice1"); + if (count > 0) { + const prompt = `###${get.translation(player)}对你发动了【应时】###${forced ? "请" : "是否"}弃置${get.cnNumber(count)}张牌,令${get.translation(trigger.card)}对你无效${forced ? "。" : "?或点击“取消”,令其与此牌结算后视为对你使用一张同名牌。"}`; + bool = await target + .chooseToDiscard(prompt, count, forced, "he") + .set("ai", card => { + if (get.event("goon")) return 5.5 - get.value(card); + return 0; + }) + .set("goon", !get.tag(trigger.card, "norepeat") && get.effect(target, trigger.card, trigger.player, target) < -5) + .forResultBool(); + } else bool = false; + } else bool = player.hasSkill("dcyingshi_choice1"); + if (bool) { + trigger.excluded.add(target); + } else { + player + .when({ global: "useCardAfter" }) + .filter(evt => evt === trigger.getParent()) + .vars({ + targetx: target, + cardx: { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + storage: { dcyingshi: true }, + }, + }) + .then(() => { + const next = player.useCard(get.copy(cardx), targetx, false); + if (trigger.addedTarget) next.addedTarget = trigger.addedTarget; + if (trigger.addedTargets && trigger.addedTargets.length) next.addedTargets = trigger.addedTargets.slice(0); + }); + } + player.addTempSkill(`dcyingshi_choice${bool + 1}`); + }, + subSkill: { + choice1: { charlotte: true }, + choice2: { charlotte: true }, + }, + }, + //公孙修 + dcgangu: { + audio: 2, + trigger: { global: "loseHpAfter" }, + filter(event, player) { + return event.player !== player; + }, + usable: 1, + forced: true, + async content(event, trigger, player) { + await player.draw(2); + await player.loseHp(); + }, + ai: { + halfneg: true, + }, + }, + dckuizhen: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(current => { + return lib.skill.dckuizhen.filterTarget(null, player, current); + }); + }, + filterTarget(card, player, target) { + return target.countCards("h") > player.countCards("h") || target.getHp() > player.getHp(); + }, + usable: 1, + forced: true, + async content(event, trigger, player) { + const { target } = event, + juedou = new lib.element.VCard({ name: "juedou" }); + if (target.canUse(juedou, player, false)) { + await target.useCard(juedou, player, "noai"); + } + if ( + player.hasHistory("damage", evt => { + return evt.getParent(3) === event; + }) + ) { + await player.viewHandcards(target); + const shas = target.getGainableCards(player, "h").filter(card => get.name(card) === "sha"); + if (shas.length) { + player.addTempSkill("dckuizhen_effect"); + await player.gain(shas, "give", target).gaintag.add("dckuizhen"); + } + } else { + await target.loseHp(); + } + }, + ai: { + result: { + target(player, target) { + const [juedouEff, loseEff] = [get.effect(player, { name: "juedou" }, target, player), get.effect(target, { name: "losehp" }, target, player)]; + if (juedouEff > 0) return (loseEff * get.attitude(player, target)) / 10; + return 0; + }, + }, + }, + subSkill: { + effect: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + charlotte: true, + filter: function (event, player) { + if (event.addCount === false) return false; + return player.hasHistory("lose", evt => { + if (evt.getParent() != event) return false; + for (const i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dckuizhen")) return true; + } + return false; + }); + }, + async content(event, trigger, player) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; + }, + mod: { + cardUsable(card) { + if (!card.cards) return; + if (card.cards.some(card => card.hasGaintag("dckuizhen"))) return Infinity; + }, + }, + }, + }, + }, + //刘理 + dcfuli: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countDiscardableCards(player, "h"); + }, + usable: 1, + async content(event, trigger, player) { + await player.showHandcards(get.translation(player) + "发动了【抚黎】"); + const getNum = type => { + let num = ["basic", "trick", "equip"].indexOf(type); + if (num === -1) num = 3; + return num; + }; + const types = player + .getDiscardableCards(player, "h") + .reduce((list, card) => { + return list.add(get.type2(card)); + }, []) + .sort((a, b) => getNum(a) - getNum(b)); + if (types.length) { + const { + result: { control }, + } = await player + .chooseControl(types) + .set("ai", () => { + const player = get.event("player"), + types = get.event("controls").slice(); + const getNum = type => { + const cards = player.getDiscardableCards(player, "h").filter(card => get.type2(card) == type); + const countCards = (target, player, cards) => { + return target.countCards("h") - (target == player ? cards.length : 0); + }; + const max = game + .findPlayer(target => { + return !game.hasPlayer(target2 => { + return countCards(target2, player, cards) > countCards(target, player, cards); + }); + }) + .countCards("h"); + return ( + Math.min( + max, + cards.reduce((sum, card) => sum + get.cardNameLength(card), 0) + ) / cards.length + ); + }; + return types.sort((a, b) => { + return getNum(b) - getNum(a); + })[0]; + }) + .set("prompt", "弃置一种类别的所有手牌,然后摸这些牌的名字字数之和的牌"); + if (control) { + const cards = player.getDiscardableCards(player, "h").filter(card => get.type2(card) == control); + await player.discard(cards); + const max = game.findPlayer(target => target.isMaxHandcard()).countCards("h"); + const num = Math.min( + max, + cards.reduce((sum, card) => sum + get.cardNameLength(card), 0) + ); + if (num) await player.draw(num); + if (cards.some(card => card.name != "shandian" && get.tag(card, "damage"))) { + const { + result: { bool, targets }, + } = await player.chooseTarget("抚黎:是否令一名角色的攻击范围-1直到你的下个回合开始?").set("ai", target => { + const player = get.event("player"), + num = target.getAttackRange(); + return -get.sgn(get.attitude(player, target)) * (target.getAttackRange() + (num <= 0 ? -num + 0.5 : num)); + }); + if (bool) { + const target = targets[0]; + player.line(target); + target.addSkill("dcfuli_range"); + target.addMark("dcfuli_range", 1, false); + player + .when(["phaseBegin", "dieBegin"]) + .then(() => { + target.removeMark("dcfuli_range", 1, false); + if (!target.hasMark("dcfuli_range")) target.removeSkill("dcfuli_range"); + }) + .vars({ target: target }); + } + } + } + } + }, + ai: { + order: 1, + result: { + player(player) { + const types = player.getDiscardableCards(player, "h").reduce((list, card) => { + return list.add(get.type2(card)); + }, []); + if ( + !types.some(type => { + const cards = player.getDiscardableCards(player, "h").filter(card => get.type2(card) == type); + const countCards = (target, player, cards) => { + return target.countCards("h") - (target == player ? cards.length : 0); + }; + return !game + .filterPlayer(target => { + return !game.hasPlayer(target2 => { + return countCards(target2, player, cards) > countCards(target, player, cards); + }); + }) + .includes(player); + }) + ) + return 0; + return 1; + }, + }, + }, + subSkill: { + range: { + charlotte: true, + onremove: true, + mod: { + attackRange(player, num) { + return num - player.countMark("dcfuli_range"); + }, + }, + marktext: " - ", + intro: { content: "攻击范围-#" }, + }, + }, + }, + dcdehua: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + async content(event, trigger, player) { + const list = lib.inpile.filter(name => { + if (get.type(name) === "delay") return false; + const card = new lib.element.VCard({ name: name }); + return get.tag(card, "damage") && player.hasUseTarget(card); + }); + if (list.length) { + const { + result: { bool, links }, + } = await player.chooseButton(['###德化###
    视为使用一张仍可以使用的伤害类卡牌
    ', [list, "vcard"]], true).set("ai", button => { + const name = button.link[2], + player = get.player(); + let value = player.getUseValue({ name, isCard: true }, null, true); + if (player.countCards("h", card => get.name(card) === name && player.hasUseTarget(card))) value /= 3; + if (name === "sha") value /= 2; + if (player.getStorage("dcdehua").includes("sha")) value = Math.max(0.1, value); + return value; + }); + if (bool) { + const name = links[0][2], + card = new lib.element.VCard({ name: name }); + await player.chooseUseTarget(card, true); + player.markAuto("dcdehua", [name]); + } + } + if ( + !lib.inpile.some(name => { + if (get.type(name) === "delay") return false; + const card = new lib.element.VCard({ name: name }); + return get.tag(card, "damage") && !player.getStorage("dcdehua").includes(name); + }) + ) + player.removeSkills("dcdehua"); + }, + mod: { + maxHandcard(player, num) { + return num + player.getStorage("dcdehua").length; + }, + cardEnabled(card, player) { + if (player.getStorage("dcdehua").includes(card.name) && (get.position(card) == "h" || (card.cards && card.cards.some(i => get.position(i) == "h")))) return false; + }, + cardSavable(card, player) { + if (player.getStorage("dcdehua").includes(card.name) && (get.position(card) == "h" || (card.cards && card.cards.some(i => get.position(i) == "h")))) return false; + }, + aiValue(player, card) { + if (player.getStorage("dcdehua").includes(get.name(card))) return 0; + }, + aiUseful() { + return lib.skill.dcdehua.mod.aiValue.apply(this, arguments); + }, + }, + intro: { + content(storage) { + return "
  • 手牌上限+" + storage.length + "
  • 不能从手牌中使用" + get.translation(storage); + }, + }, + }, + //蒋琬费祎 + dcshengxi: { + inherit: "reshengxi", + trigger: { player: "phaseDiscardEnd" }, + }, + dcshoucheng: { + audio: "shoucheng", + global: "dcshoucheng_ai", + trigger: { + global: ["equipAfter", "addJudgeAfter", "loseAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + const target = _status.currentPhase; + return game.hasPlayer(current => { + if (target && current == target) return false; + let evt = event.getl(current); + return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; + }); + }, + async cost(event, trigger, player) { + const targetx = _status.currentPhase; + const targets = game + .filterPlayer(current => { + if ((targetx && current == targetx) || !current.isIn()) return false; + let evt = trigger.getl(current); + return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; + }) + .sortBySeat(targetx || player); + event.result = await player + .chooseTarget("是否对" + (targets.length > 1 ? "其中一名角色" : get.translation(targets[0])) + "发动【守成】?", "令其摸两张牌", (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("targets", targets) + .set("ai", target => get.attitude(get.event("player"), target)) + .forResult(); + }, + usable: 1, + async content(event, trigger, player) { + const target = event.targets[0]; + if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); + target.draw(2); + }, + subSkill: { + ai: { + ai: { + noh: true, + skillTagFilter(player, tag, arg) { + if (player === _status.currentPhase || player.countCards("h") != 1) return false; + return game.hasPlayer(current => { + return current.hasSkill("dcshoucheng") && get.attitude(current, player) > 0; + }); + }, + }, + }, + }, + }, + //乐大乔 + dczixi: { + init() { + game.addGlobalSkill("dczixi_judge"); + game.broadcastAll(() => lib.skill.dczixi.video()); + }, + video() { + const list = lib.skill.dczixi.zixiList; + for (const name of list) { + const namex = "dczixi_" + name; + if (!lib.card[namex]) { + lib.card[namex] = { + type: "special_delay", + fullskin: true, + noEffect: true, + wuxieable: false, + }; + lib.card[namex].cardimage = name; + lib.translate[namex] = lib.translate[name] + "·姊希"; + lib.translate[namex + "_info"] = "由【姊希】技能创造的无效果【" + lib.translate[name] + "】"; + } + } + }, + audio: 2, + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + filter(event, player) { + return ( + player.countCards("h", card => { + return ( + card.hasGaintag("dcqiqin_tag") && + lib.skill.dczixi.zixiList.some(name => { + return game.hasPlayer(target => target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card]))); + }) + ); + }) > 0 + ); + }, + zixiList: ["lebu", "bingliang", "shandian"], + direct: true, + async content(event, trigger, player) { + game.addVideo("skill", player, ["dczixi", []]); + const names = lib.skill.dczixi.zixiList.filter(name => { + return player.countCards("h", card => { + return card.hasGaintag("dcqiqin_tag") && game.hasPlayer(target => target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card]))); + }); + }); + let map = {}; + for (const name of names) { + map[get.translation(name)] = name; + } + const { + result: { bool, links }, + } = await player + .chooseButton(2, ["###" + get.prompt("dczixi") + '###
    将一张“琴”以你选择的牌名置于一名角色的判定区
    ', player.getCards("h"), [Object.keys(map), "tdnodes"]]) + .set("filterButton", button => { + const type = typeof button.link, + card = button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) return false; + if (type == "string") return true; + return ( + card.hasGaintag("dcqiqin_tag") && + lib.skill.dczixi.zixiList.some(name => { + return game.hasPlayer(target => target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card]))); + }) + ); + }) + .set("ai", button => { + const player = get.event("player"), + list = Object.keys(get.event("map")); + if (typeof button.link == "string") { + const card = player + .getCards("h", card => { + if (get.value(card) >= 7) return false; + return card.hasGaintag("dcqiqin_tag") && game.hasPlayer(target => target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card]))); + }) + .sort((a, b) => get.value(a) - get.value(b))[0]; + if ( + game.hasPlayer(current => { + return get.attitude(player, current) < 0 && lib.skill.dczixi.zixiList.some(name => current.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card]))); + }) + ) + return list.indexOf(button.link) + 1; + return 1 / (list.indexOf(button.link) + 1); + } + return 7 - get.value(button.link); + }) + .set("map", map); + if (bool) { + const name = links.find(i => typeof i == "string"), + card = links.find(j => j != name), + cardname = map[name]; + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "请选择【" + name + "(" + get.translation(card) + ")】置入的目标", + (cardx, player, target) => { + return target.canAddJudge(get.autoViewAs({ name: "dczixi_" + get.event("cardname") }, [get.event("card")])); + }, + true + ) + .set("ai", target => { + const player = get.event("player"), + card = get.event("card"); + if ( + game.hasPlayer(current => { + return get.attitude(player, current) < 0 && current.canAddJudge(get.autoViewAs({ name: "dczixi_" + get.event("cardname") }, [card])); + }) + ) + return -target.countCards("j") - 1; + return target.countCards("j") + 1; + }) + .set("card", card) + .set("cardname", cardname); + if (bool) { + const target = targets[0]; + player.logSkill("dczixi", target); + player.$give(card, target, false); + await game.asyncDelay(0.5); + target.addJudge({ name: "dczixi_" + cardname }, [card]); + } + } + }, + group: "dczixi_effect", + subSkill: { + judge: { + mod: { + targetEnabled(card, player, target) { + const list = lib.skill.dczixi.zixiList; + const name = typeof card == "string" ? card : card.viewAs ? card.viewAs : card.name; + if (name.indexOf("dczixi_") == 0) { + const namex = name.slice("dczixi_".length); + if (list.includes(namex) && target.hasJudge(namex)) return false; + } else if (list.includes(name) && target.hasJudge("dczixi_" + name)) return false; + }, + }, + ai: { + threaten(player, target) { + if (!player.hasSkill("dczixi") || ![1, 2, 3].includes(target.countCards("j"))) return; + return 3 + target.countCards("j"); + }, + }, + }, + effect: { + audio: "dczixi", + trigger: { player: "useCardToTargeted" }, + filter(event, player) { + return event.isFirstTarget && event.targets.length == 1 && [1, 2, 3].includes(event.target.countCards("j")) && (get.type(event.card) == "basic" || get.type(event.card) == "trick"); + }, + prompt2(event, player) { + const target = event.target, + str = get.translation(target); + return ["令" + get.translation(event.card) + "对" + str + "额外结算一次", "摸两张牌", "弃置" + str + "判定区里的所有牌,对其造成3点伤害"][target.countCards("j") - 1]; + }, + check(event, player) { + const target = event.target, + num = target.countCards("j"); + if (num == 2) return true; + if (num == 1) return get.effect(target, event.card, player, player) > 0; + return get.attitude(player, target) < 0 && get.damageEffect(target, player, player) > 0; + }, + logTarget: "target", + async content(event, trigger, player) { + const target = trigger.target, + num = target.countCards("j"); + switch (num) { + case 1: + trigger.getParent().effectCount++; + game.log(trigger.card, "额外结算一次"); + break; + case 2: + player.draw(2); + break; + case 3: + target.discard(target.getCards("j")).discarder = player; + target.damage(3); + break; + } + }, + }, + }, + }, + //孔融 + dckrmingshi: { + audio: "mingshi", + trigger: { player: "damageBegin4" }, + filter(event, player) { + return event.source && event.source.countCards("h") > player.countCards("h"); + }, + forced: true, + logTarget: "source", + async content(event, trigger, player) { + const target = trigger.source; + const { + result: { bool }, + } = await target + .chooseToDiscard("名士:弃置一张手牌,或防止对" + get.translation(player) + "造成的伤害") + .set("ai", card => { + if (get.event("goon")) return 0; + return 6 - get.value(card); + }) + .set("goon", get.damageEffect(player, target, target) <= 0); + if (!bool) trigger.cancel(); + }, + ai: { + effect: { + target_use(card, player, target, current) { + if (get.tag(card, "damage") && target != player) { + if (_status.event.name == "dckrmingshi") return; + if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; + var bs = player.getCards("h"); + bs.remove(card); + if (card.cards) bs.removeArray(card.cards); + else bs.removeArray(ui.selected.cards); + if (bs.length > target.countCards("h")) { + if (bs.some(bsi => get.value(bsi) < 7)) return [1, 0, 1, -0.5]; + return [1, 0, 0.3, 0]; + } + return [1, 0, 1, -0.5]; + } + }, + }, + }, + }, + //新服SP孟获 + dcmanwang: { + audio: "spmanwang", + inherit: "spmanwang", + check: function (card) { + var player = _status.event.player; + var max = Math.min(player.isDamaged() ? 3 : 2, 4 - player.countMark("dcmanwang")); + if (!max && !player.hasSkill("dcpanqin")) return 0; + if (max == 0 && ui.selected.length > 0) return 0; + return 7 - ui.selected.cards.length - get.value(card); + }, + content: function () { + var num = Math.min(cards.length, 4 - player.countMark("dcmanwang")); + if (num >= 1) player.addSkills("dcpanqin"); + if (num >= 2) player.draw(); + if (num >= 3) player.recover(); + if (num >= 4) { + player.draw(2); + player.removeSkills("dcpanqin"); + } + }, + ai: { + order: 2, + result: { + player: function (player, target) { + if (player.getUseValue({ name: "nanman" }) <= 0) return 0; + if (player.getStat("skill").spmanwang && player.hasSkill("dcpanqin")) return 0; + return 1; + }, + }, + }, + derivation: "dcpanqin", + }, + dcpanqin: { + audio: "sppanqin", + inherit: "sppanqin", + content: function () { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent(trigger.name) != trigger) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { + cards.add(i); + } + } + }); + player.chooseUseTarget(true, { name: "nanman" }, cards); + player.addTempSkill("dcpanqin_eff"); + }, + subSkill: { + eff: { + charlotte: true, + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card.name == "nanman" && event.getParent(2).name == "dcpanqin" && player.countMark("dcmanwang") < 4 && player.hasSkill("dcmanwang", null, null, false) && event.cards.length <= event.targets.length; + }, + forced: true, + popup: false, + content: function () { + "step 0"; + player.addMark("dcmanwang", 1, false); + switch (player.countMark("dcmanwang")) { + case 1: + player.draw(2); + player.removeSkills("dcpanqin"); + break; + case 2: + player.recover(); + break; + case 3: + player.draw(); + break; + case 4: + player.addSkills("dcpanqin"); + break; + } + "step 1"; + player.gainMaxHp(); + player.recover(); + }, + }, + }, + }, + //凌操 + dcdufeng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + async content(event, trigger, player) { + const list = []; + for (let i = 1; i < 6; i++) { + if (player.isDisabled(i)) continue; + list.push("equip" + i); + } + list.push("cancel2"); + const next = player.chooseControl(list); + next.set("prompt", "独锋:请废除一个装备栏,或点击“取消”失去1点体力"); + next.set("ai", () => { + const list = get.event().list.slice(), + player = get.player(); + if (player.hp <= 2 && list.length > 1) list.remove("cancel2"); + const listx = list.filter(subtype => !player.getEquips(subtype).length); + if (listx.length) return listx.randomGet(); + return list.randomGet(); + }); + next.set("list", list); + const { result } = await next; + if (result.control == "cancel2") await player.loseHp(); + else await player.disableEquip(result.control); + if (!player.isIn()) return; + const num = Math.min(player.countDisabled() + player.getDamagedHp(), player.maxHp); + await player.draw(num); + player.addTempSkill("dcdufeng_effect"); + player.addMark("dcdufeng_effect", num, false); + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + intro: { + content: "本回合攻击范围与使用【杀】的次数上限均为#", + }, + mod: { + attackRangeBase(player, num) { + return player.countMark("dcdufeng_effect"); + }, + cardUsable(card, player, num) { + if (card.name == "sha") return player.countMark("dcdufeng_effect"); + }, + }, + }, + }, + }, + //小乔 + dcqiqin: { + audio: 2, + audioname: ["yue_daqiao"], + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + content: function () { + let cards = player.getCards("h"); + player.addGaintag(cards, "dcqiqin_tag"); + player.markAuto("dcqiqin", cards); + }, + group: "dcqiqin_restore", + subSkill: { + tag: {}, + restore: { + audio: "dcqiqin", + audioname: ["yue_daqiao"], + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + const targets = game.players.slice().concat(game.dead); + return targets.some(target => target.getStorage("dcqiqin").filterInD("d").length); + }, + forced: true, + content: function () { + const targets = game.players.slice().concat(game.dead); + const cards = targets.reduce((list, target) => list.addArray(target.getStorage("dcqiqin").filterInD("d")), []); + player.gain(cards, "gain2").gaintag.add("dcqiqin_tag"); + }, + }, + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcqiqin_tag")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcqiqin_tag")) return false; + }, + }, + }, + dcweiwan: { + audio: 2, + enable: "phaseUse", + filter: (event, player) => { + return ( + player.countCards(lib.skill.dcweiwan.position, card => { + return lib.skill.dcweiwan.filterCard(card, player); + }) && + game.hasPlayer(target => { + return lib.skill.dcweiwan.filterTarget(null, player, target); + }) + ); + }, + filterCard: (card, player) => { + return card.hasGaintag("dcqiqin_tag") && lib.filter.cardDiscardable(card, player); + }, + filterTarget: (card, player, target) => { + return target != player && target.countCards("he"); + }, + position: "h", + check: card => { + const player = _status.event.player; + const target = game.players.reduce( + (result, current) => { + if (current === player) return result; + const effect = Math.abs(lib.skill.dcweiwan.ai.result.target(player, current)); + return effect > result[1] ? [current, effect] : result; + }, + [null, 0] + )[0]; + return target ? lib.skill.dcweiwan.getWeiWanEffect(player, card, target) : 0; + }, + usable: 1, + content: function* (event, map) { + let player = map.player, + target = event.target; + let suit = get.suit(event.cards[0], player); + let cards = target.getCards("hej", card => get.suit(card, target) != suit && lib.filter.canBeGained(card, player, target)); + if (!cards.length) { + player.chat("无牌可得!!"); + return; + } + let suits = lib.suit.slice(); + suits.reverse(); + suits.add("none"); + suits.forEach(suit2 => { + let cards2 = cards.filter(card => get.suit(card, target) == suit2); + if (cards2.length) { + cards2.randomRemove(); + cards.removeArray(cards2); + } + }); + if (!cards.length) { + player.chat("无牌可得!!"); + return; + } + player.gain(cards, target, "give"); + switch (cards.length) { + case 1: + target.loseHp(); + break; + case 2: + player.addTempSkill("tanbei_effect3"); + target.addTempSkill("tanbei_effect1"); + break; + case 3: + player.addTempSkill("tanbei_effect3"); + target.addTempSkill("tanbei_effect2"); + break; + } + }, + ai: { + order: 9, + result: { + target: (player, target) => { + const att = get.sgn(get.attitude(player, target)) - 1; + const cards = player.getCards(lib.skill.dcweiwan.position, card => lib.skill.dcweiwan.filterCard(card, player)); + return ( + att * + cards.reduce((result, card) => { + const effect = lib.skill.dcweiwan.getWeiWanEffect(player, card, target); + return effect > result ? effect : result; + }, 0) + ); + }, + }, + combo: "dcqiqin", + }, + getWeiWanEffect: (player, cardx, target) => { + const suit = get.suit(cardx, player); + const cards = target.getCards("hej", card => get.suit(card, target) !== suit && lib.filter.canBeGained(card, player, target)); + const num = lib.suits.filter(suit => cards.some(card => get.suit(card, target) === suit)).length; + switch (num) { + case 1: + return num + Math.max(0, get.sgn(get.effect(target, { name: "losehp" }, player, player))); + case 2: + return num + player.countCards("he", card => player.canUse(card, target, false) && get.effect(target, card, player, player) > 0); + case 3: + return Math.ceil(num / 2); + default: + return num; + } + }, + }, + //董昭 + dcyijia: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (!event.player.isIn()) return false; + if (get.distance(player, event.player) > 1) return false; + return player.canMoveCard( + null, + true, + game.filterPlayer(i => i != event.player), + event.player, + "canReplace" + ); + }, + check: function (event, player) { + return player.canMoveCard( + true, + true, + game.filterPlayer(i => i != event.player), + event.player, + "canReplace" + ); + }, + prompt2: function (event, player) { + return `将场上一张装备牌移动至${get.translation(event.player)}的装备区内(替换原装备)。然后若其因此脱离了一名角色的攻击范围,你摸一张牌。`; + }, + logTarget: "player", + line: false, + content: function* (event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + const inRangeList = game.filterPlayer(current => current.inRange(target)); + yield player.moveCard( + true, + game.filterPlayer(i => i != target), + target, + "canReplace" + ); + const leaveSomeone = inRangeList.some(current => !current.inRange(target)); + if (leaveSomeone) player.draw(); + }, + ai: { + maixie: true, + expose: 0.2, + threaten: 3.3, + }, + }, + dcdingji: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function* (event, map) { + const player = map.player; + let result; + result = yield player.chooseTarget(get.prompt2("dcdingji")).set("ai", target => { + let att = get.attitude(get.player(), target) / 2; + const delta = 5 - target.countCards("h"); + let fix = 1; + const hs = target.getCards("h"); + outer: for (let i = 0; i < hs.length - 1; i++) { + const name1 = get.name(hs[i]); + for (let j = i + 1; j < hs.length; j++) { + const name2 = get.name(hs[j]); + if (name1 == name2) { + fix = 0.5; + break outer; + } + } + } + if (delta > 0) { + if (target.hasSkillTag("nogain")) att /= 3; + return Math.sqrt(delta) * att * fix; + } + if (delta > -2 && att > 0) return fix == 0.5 ? 0.1 : -1; + return (-Math.sqrt(-delta) * att) / 2; + }); + if (!result.bool) return event.finish(); + const target = result.targets[0]; + player.logSkill("dcdingji", target); + if (target != player) player.addExpose(0.3); + const delta = 5 - target.countCards("h"); + if (delta != 0) { + yield target[delta > 0 ? "draw" : "chooseToDiscard"](Math.abs(delta), true); + } + target.showHandcards(); + const hs = target.getCards("h"); + let hasSame = false; + outer: for (let i = 0; i < hs.length - 1; i++) { + const name1 = get.name(hs[i]); + for (let j = i + 1; j < hs.length; j++) { + const name2 = get.name(hs[j]); + if (name1 == name2) { + hasSame = true; + break outer; + } + } + } + game.delayex(); + if (hasSame) return event.finish(); + const list = get.inpileVCardList(info => { + if (!["basic", "trick"].includes(info[0])) return false; + if (!target.hasUseTarget(new lib.element.VCard({ name: info[2], nature: info[3], isCard: true }))) return false; + return hs.some(card => { + return get.name(card) == info[2] && get.is.sameNature([card, info[3]], true); + }); + }); + if (!list.length) return event.finish(); + result = yield target.chooseButton(["是否视为使用其中一张牌?", [list, "vcard"]]).set("ai", button => { + return get.player().getUseValue({ name: button.link[2] }); + }); + if (result.bool) { + target.chooseUseTarget( + new lib.element.VCard({ + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }), + true, + false + ); + } + }, + }, + //蒯祺 + dcliangxiu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.hasCard(card => { + const type = get.type2(card, player); + return player.hasCard(cardx => { + if (card == cardx) return false; + return get.type2(cardx, player) != type; + }, "he"); + }, "he"); + }, + filterCard: function (card, player) { + if (!ui.selected.cards.length) return true; + return get.type2(ui.selected.cards[0], player) != get.type2(card, player); + }, + selectCard: 2, + check: function (card) { + const player = get.player(); + const bannedTypes = []; + bannedTypes.addArray(player.getStorage("dcliangxiu")); + if (!ui.selected.cards.length) { + let val = get.value(card); + if (val > 5.5) return 0; + if (bannedTypes.includes(get.type2(card, player))) return 7.5 - val; + return 5.5 - val; + } + bannedTypes.addArray(ui.selected.cards.map(card => get.type2(card, player))); + bannedTypes.add(get.type2(card, player)); + const filter = card => !bannedTypes.includes(get.type2(card, player)); + if (!get.cardPile(filter)) return 0; + return 6 - get.value(card); + }, + position: "he", + complexCard: true, + onremove: true, + content: function* (event, map) { + const player = map.player; + const cards = []; + const bannedTypes = []; + bannedTypes.addArray(event.cards.map(card => get.type2(card, player))); + bannedTypes.addArray(player.getStorage("dcliangxiu")); + + const filter = card => !bannedTypes.includes(get.type2(card, player)); + const piles = ["cardPile", "discardPile"]; + for (const pile of piles) { + for (let i = 0; i < ui[pile].childNodes.length; i++) { + const card = ui[pile].childNodes[i]; + if (filter(card)) { + cards.add(card); + if (cards.length >= 2) break; + } + } + if (cards.length >= 2) break; + } + let result; + if (!cards.length) { + player.chat("没牌了…"); + game.log("但是哪里都找不到没有符合条件的牌!"); + event.finish(); + return; + } else if (cards.length == 1) result = { bool: true, links: cards }; + else result = yield player.chooseButton(["良秀:获得一张牌", cards], true).set("ai", get.buttonValue); + if (result.bool) { + const toGain = result.links; + player.markAuto("dcliangxiu", get.type2(toGain[0], false)); + player.when({ global: "phaseChange" }).then(() => { + player.unmarkSkill("dcliangxiu"); + }); + player.gain(toGain, "gain2"); + } + }, + intro: { + content: "已因此技能获得过$牌", + onunmark: true, + }, + ai: { + order: 2, + result: { player: 1 }, + }, + }, + dcxunjie: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + if (["handcard", "hp"].every(i => player.isTempBanned(`dcxunjie_${i}`))) return false; + return player.hasHistory("gain", evt => { + return !evt.getParent("phaseDraw", true); + }); + }, + direct: true, + content: function* (event, map) { + const player = map.player; + const choices = []; + const choiceList = ["令一名角色将手牌数摸或弃置至与其体力值相同", "令一名角色将体力回复或失去至与其手牌数相同"]; + if (!player.isTempBanned("dcxunjie_handcard")) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + "(已被选择过)"; + if (!player.isTempBanned("dcxunjie_hp")) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + "(已被选择过)"; + let result; + if (_status.connectMode) + game.broadcastAll(() => { + _status.noclearcountdown = true; + }); + if (choices.length == 1) result = { control: choices[0] }; + else + result = yield player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("dcxunjie")) + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + (() => { + const getValue = (index, target) => { + let att = get.attitude(player, target); + att = Math.sign(att) * Math.sqrt(Math.abs(att)); + let delt = target.getHp(true) - target.countCards("h"); + if (index == 1 && delt < 0) delt = 0; + return (1 - 3 * index) * att * delt; + }; + const list = game + .filterPlayer() + .map(current => { + const val0 = getValue(0, current), + val1 = getValue(1, current); + return [val0, val1, Math.max(val0, val1)]; + }) + .sort((a, b) => { + return b[2] - a[2]; + }); + const toChoose = list[0]; + if (toChoose[2] <= 0) return "cancel2"; + return toChoose[0] > toChoose[1] ? 0 : 1; + })() + ); + if (result.control == "cancel2") { + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + return event.finish(); + } + let prompt = ""; + const choice = result.control, + index = choice == "选项一" ? 0 : 1; + if (choices.length == 1) { + prompt = `###${get.prompt("dcxunjie")}###
    ${choiceList[index]}
    `; + } else prompt = `###殉节:请选择一名角色###
    ${choiceList[index].replace("一名", "该")}
    `; + result = yield player + .chooseTarget(prompt) + .set("ai", target => { + const player = get.player(), + index = get.event("index"); + let att = get.attitude(player, target); + att = Math.sign(att) * Math.sqrt(Math.abs(att)); + let delt = target.getHp(true) - target.countCards("h"); + if (index == 1 && delt < 0) delt = 0; + return (1 - 2 * index) * att * delt; + }) + .set("index", index); + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (!result.bool) return event.finish(); + const target = result.targets[0]; + player.logSkill("dcxunjie", target); + player.tempBanSkill(`dcxunjie_${index == 0 ? "handcard" : "hp"}`, "roundStart", false); + const delt = (target.getHp(true) - target.countCards("h")) * (1 - 2 * index); + if (delt == 0) event.finish(); + else if (index == 0) target[delt > 0 ? "draw" : "chooseToDiscard"](Math.abs(delt), true); + else target[delt > 0 ? "recover" : "loseHp"](Math.abs(delt)); + }, + }, + //乐蔡邕 + dcjiaowei: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + group: "dcjiaowei_prevent", + content: function* (event, map) { + const player = map.player; + var cards = player.getCards("h"); + player.addGaintag(cards, "dcjiaowei_tag"); + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcjiaowei_tag")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcjiaowei_tag")) return false; + }, + }, + subSkill: { + prevent: { + audio: "dcjiaowei", + trigger: { + player: "damageBegin4", + }, + forced: true, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return event.source.countCards("h") <= player.countCards("h", card => card.hasGaintag("dcjiaowei_tag")); + }, + content: function* (event, map) { + map.trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + const num = target.countCards("h", card => card.hasGaintag("dcjiaowei_tag")); + let cards = []; + if (card.cards) cards.addArray(card.cards); + if (ui.selected.cards) cards.addArray(ui.selected.cards); + cards = cards.filter(card => { + if (get.itemtype(card) != "card") return false; + return get.owner(card) == player && get.position(card) == "e"; + }); + if (player.countCards("h") - cards.length <= num) return "zeroplayertarget"; + } + }, + }, + }, + }, + }, + }, + dcfeibai: { + audio: 2, + trigger: { player: "useCardAfter" }, + usable: 1, + locked: false, + filter: function (event, player) { + return player.getHistory("useCard").indexOf(event) > 0; + }, + prompt2: function (event, player) { + const history = player.getHistory("useCard"); + const ind = history.indexOf(event) - 1, + evt = history[ind]; + const len = get.cardNameLength(event.card) + get.cardNameLength(evt.card); + return `随机获得一张字数为${len}的牌`; + }, + check: function (event, player) { + const history = player.getHistory("useCard"); + const ind = history.indexOf(event) - 1, + evt = history[ind]; + const len = get.cardNameLength(event.card) + get.cardNameLength(evt.card); + return ( + player.countCards("h", card => card.hasGaintag("dcjiaowei_tag")) <= len || + get.cardPile(card => { + return get.cardNameLength(card, false) == len; + }) + ); + }, + content: function* (event, map) { + const player = map.player, + trigger = map.trigger; + const history = player.getHistory("useCard"); + const ind = history.indexOf(trigger) - 1, + evt = history[ind]; + const len = get.cardNameLength(trigger.card) + get.cardNameLength(evt.card); + const card = get.cardPile(card => { + return get.cardNameLength(card, false) == len; + }); + if (card) { + yield player.gain(card, "gain2"); + } else { + let str = `没有${len}字的牌…`; + if (len == 5 && Math.random() <= 0.2) str = "五字不行哇"; + player.chat(str); + game.log(`但是找不到字数为${len}的牌!`); + } + if (player.countCards("h", card => card.hasGaintag("dcjiaowei_tag")) <= len) { + player.storage.counttrigger.dcfeibai--; + game.log(player, "重置了", "#【飞白】"); + } + }, + mod: { + aiOrder: function (player, card, num) { + const evt = player.getLastUsed(); + if (!evt) return; + const len = get.cardNameLength(card) + get.cardNameLength(evt.card); + const cardx = get.cardPile(card => { + return get.cardNameLength(card, false) == len; + }); + if (cardx) return num + 8 + (len == 2 || len == 4 ? 2 : 0); + }, + }, + }, + //庞山民 + dccaisi: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return get.type(event.card) == "basic" && _status.currentPhase; + }, + prompt2: function (event, player) { + const num = player.countMark("dccaisi_more") + 1; + return `从${player == _status.currentPhase ? "牌堆" : "弃牌"}堆中随机获得${get.cnNumber(num)}张非基本牌`; + }, + content: function* (event, map) { + const player = map.player, + trigger = map.trigger; + const position = player == _status.currentPhase ? "cardPile" : "discardPile"; + let cards = [], + num = player.countMark("dccaisi_more") + 1; + while (num > 0) { + num--; + let card = get[position](card => get.type(card) != "basic" && !cards.includes(card)); + if (card) cards.add(card); + else break; + } + if (cards.length) yield player.gain(cards, "gain2"); + else { + player.chat("没有非基本牌…"); + game.log(`但是${position == "discardPile" ? "弃" : ""}牌堆里没有非基本牌!`); + } + const sum = player.getHistory("useSkill", evt => evt.skill == "dccaisi").length; + if (sum < player.maxHp) { + player.addTempSkill("dccaisi_more"); + player.addMark("dccaisi_more", 1, false); + } else player.tempBanSkill("dccaisi"); + }, + subSkill: { more: { charlotte: true, onremove: true } }, + }, + dczhuoli: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return player.getHistory("useCard").length > player.getHp() || player.getHistory("gain").reduce((sum, evt) => sum + evt.cards.length, 0) > player.getHp(); + }, + content: function* (event, map) { + const player = map.player; + if (player.maxHp < game.countPlayer2()) { + yield player.gainMaxHp(); + } + yield player.recover(); + }, + }, + //魏贾充 + dcbeini: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: function (card, player) { + const delt = player.countCards("h") - player.maxHp; + return delt > 0; + }, + selectCard: function () { + const player = get.player(); + const delt = player.countCards("h") - player.maxHp; + return delt > 0 ? delt : -1; + }, + promptfunc: () => { + const player = get.player(); + const delt = player.countCards("h") - player.maxHp; + let str = ""; + if (delt > 0) str += `弃置${get.cnNumber(delt)}张牌`; + else if (delt == 0) str += `点击“确定”`; + else str += `摸${get.cnNumber(-delt)}张牌`; + return `${str},然后选择两名角色,前者视为对后者使用一张【杀】,且这两者的非锁定技失效。`; + }, + content: function* (event, map) { + var player = map.player; + if (player.countCards("h") < player.maxHp) yield player.drawTo(player.maxHp); + if (game.countPlayer() < 2) { + event.finish(); + return; + } + var result = yield player + .chooseTarget("悖逆:请选择两名角色", "前者视为对后者使用一张【杀】,且这两名角色的非锁定技失效直到回合结束。", true, 2, (card, player, target) => { + var sha = new lib.element.VCard({ name: "sha", isCard: true }); + if (ui.selected.targets.length) { + var targetx = ui.selected.targets[0]; + return targetx.canUse(sha, target, false); + } + return lib.filter.cardEnabled(sha, target); + }) + .set("targetprompt", ["打人", "被打"]) + .set("multitarget", true) + .set("ai", target => { + var aiTargets = get.event("aiTargets"); + if (aiTargets) { + return aiTargets[ui.selected.targets.length] == target ? 10 : 0; + } + return 0; + }) + .set( + "aiTargets", + (() => { + var targets = [], + eff = 0; + var sha = new lib.element.VCard({ name: "sha", isCard: true }); + for (var user of game.filterPlayer()) { + for (var target of game.filterPlayer()) { + if (user == target) continue; + var targetsx = [user, target]; + targetsx.forEach(i => i.addSkill("dcbeini_fengyin2")); + var effx = get.effect(target, sha, user, player); + targetsx.forEach(i => i.removeSkill("dcbeini_fengyin2")); + if (user == player) effx += 1; + if (get.attitude(player, user) > 0) effx -= 0.1; + if (effx > eff) { + eff = effx; + targets = targetsx; + } + } + } + if (targets.length) return targets; + return null; + })() + ); + if (result.bool) { + var user = result.targets[0], + target = result.targets[1]; + result.targets.forEach(i => i.addTempSkill("dcbeini_fengyin")); + var sha = new lib.element.VCard({ name: "sha", isCard: true }); + if (user.canUse(sha, target, false)) user.useCard(sha, target, false, "noai"); + } + }, + ai: { + order: 0.1, + result: { + player: function (player) { + if (player.countCards("h") - player.maxHp >= 3) return 1; + return game.hasPlayer(current => get.attitude(player, current) <= 0) ? 1 : 0; + }, + }, + }, + subSkill: { + fengyin: { + inherit: "fengyin", + }, + fengyin2: { + inherit: "fengyin", + }, + }, + }, + dcshizong: { + audio: 2, + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (get.type(name) != "basic") return false; + return player.countCards("he") >= player.countMark("dcshizong") + 1; + }, + filter: function (event, player) { + if (event.type == "wuxie" || event.dcshizong) return false; + if (player.countCards("he") < player.countMark("dcshizong") + 1) return false; + for (const name of lib.inpile) { + if (get.type(name) != "basic") continue; + const card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (name == "sha") { + for (const nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + const vcards = get.inpileVCardList(info => { + if (info[0] != "basic") return; + const card = { name: info[2], nature: info[3], isCard: true }; + return event.filterCard(card, player, event); + }); + return ui.create.dialog("恃纵", [vcards, "vcard"], "hidden"); + }, + check: function (button) { + if (get.event().getParent().type != "phase") return 1; + const player = get.player(); + const card = { name: button.link[2], nature: button.link[3] }; + if ( + game.hasPlayer(current => { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + switch (button.link[2]) { + case "tao": + return 5; + case "jiu": + return 3.01; + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder") return 2.92; + else return 2.9; + } + } + return 0; + }, + backup: function (links, player) { + return { + filterCard: true, + filterTarget: lib.filter.notMe, + selectTarget: 1, + selectCard: () => get.player().countMark("dcshizong") + 1, + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, + }, + position: "he", + popname: true, + ignoreMod: true, + ai1: function (card) { + return 1 / (1.1 + Math.max(-1, get.value(card))); + }, + ai2: function (target) { + return get.attitude(get.player(), target); + }, + precontent: function* (event, map) { + var player = map.player, + target = event.result.targets[0]; + player.logSkill("dcshizong", target); + if (!player.countMark("dcshizong")) player.when({ global: "phaseAfter" }).then(() => delete player.storage.dcshizong); + player.addMark("dcshizong", 1, false); + yield player.give(event.result.cards.slice(), target); + var viewAs = new lib.element.VCard({ + name: event.result.card.name, + nature: event.result.card.nature, + isCard: true, + }); + var result = yield target + .chooseCard("恃纵:是否将一张牌置于牌堆底?", `若如此做,${get.translation(player)}视为使用一张${get.translation(viewAs.nature)}【${get.translation(viewAs.name)}】`, "he") + .set("ai", card => { + if (get.event("goon")) return 7 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) * (player.getUseValue(viewAs) || 1) >= 1); + var card = event.result.cards[0]; + if (result.bool) { + var card = result.cards[0]; + game.delayex(); + var next = target.loseToDiscardpile(card, ui.cardPile); + next.log = false; + if (get.position(card) == "e") { + game.log(target, "将", card, "置于了牌堆底"); + } else { + next.blank = true; + game.log(target, "将一张牌置于了牌堆底"); + } + result = yield next; + game.broadcastAll(viewAs => { + lib.skill.dcshizong_backup2.viewAs = viewAs; + }, lib.skill.dcshizong_backup.viewAs); + var evt = event.getParent(); + evt.set("_backupevent", "dcshizong_backup2"); + evt.set("openskilldialog", `请选择${get.translation(viewAs.nature)}${get.translation(viewAs.name)}的目标`); + evt.backup("dcshizong_backup2"); + evt.set("norestore", true); + evt.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + evt.goto(0); + if (target != _status.currentPhase) player.tempBanSkill("dcshizong"); + } else { + target.chat("不放!"); + game.log(target, "选择不将牌置于牌堆底"); + var evt = event.getParent(); + evt.set("dcshizong", true); + evt.goto(0); + } + game.delayx(); + }, + ai: { + order: 10, + }, + }; + }, + prompt: function (links, player) { + return `###恃纵:选择要交出的牌和目标角色###将${get.cnNumber(player.countMark("dcshizong") + 1)}张牌交给一名其他角色,其可以选择将一张牌置于牌堆底,视为你使用一张${get.translation(links[0][3] || "")}${get.translation(links[0][2])}。`; + }, + }, + ai: { + order: function () { + const player = get.player(), + event = get.event(); + if (event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0) { + return get.order({ name: "jiu" }) + 0.1; + } + return get.order({ name: "sha" }) + 0.1; + }, + respondSha: true, + fireAttack: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "fireAttack") return true; + if (player.countCards("he") < player.countMark("dcshizong") + 1) return false; + if (tag == "respondSha" && arg != "use") return false; + }, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { + backup: {}, + backup2: { + filterCard: () => false, + selectCard: -1, + precontent: function () { + delete event.result.skill; + }, + }, + }, + }, + //张曼成 + dclvecheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + player.addTempSkill("dclvecheng_xiongluan"); + player.markAuto("dclvecheng_xiongluan", [target]); + var cards = player.getCards("h", "sha"); + if (cards.length) player.addGaintag(cards, "dclvecheng_xiongluan"); + }, + ai: { + threaten: 3.1, + order: 3.5, + expose: 0.2, + result: { + target: function (player, target) { + if (player.getStorage("dclvecheng_xiongluan").includes(target)) return 0; + if ( + target.hasSkillTag( + "freeShan", + false, + { + player: player, + }, + true + ) + ) + return -0.6; + var hs = player.countCards("h", card => { + if (!player.canUse(card, target)) return false; + return get.name(card) == "sha" && get.effect(target, card, player, player) > 0; + }); + var ts = target.hp; + if (hs >= ts && ts > 1) return -2; + return -1; + }, + }, + }, + subSkill: { + xiongluan: { + trigger: { player: "phaseEnd" }, + charlotte: true, + forced: true, + popup: false, + onremove: function (player, skill) { + player.removeGaintag("dclvecheng_xiongluan"); + delete player.storage[skill]; + }, + filter: function (event, player) { + return player.getStorage("dclvecheng_xiongluan").some(i => i.isIn()); + }, + content: function () { + "step 0"; + event.targets = player.getStorage("dclvecheng_xiongluan").slice(); + event.targets.sortBySeat(); + "step 1"; + if (!event.targets.length) { + event.finish(); + return; + } + var target = event.targets.shift(); + event.target = target; + target.showHandcards(); + var cards = target.getCards("h", "sha"); + if (!cards.length) event.redo(); + else event.forced = false; + "step 2"; + var forced = event.forced; + var prompt2 = forced ? "掠城:选择对" + get.translation(player) + "使用的【杀】" : "掠城:是否依次对" + get.translation(player) + "使用所有的【杀】?"; + target + .chooseToUse( + forced, + function (card, player, event) { + if (get.itemtype(card) != "card" || get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + prompt2 + ) + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player); + "step 3"; + if (result.bool) { + if (target.countCards("h", "sha")) { + event.forced = true; + event.goto(2); + return; + } + } + event.forced = false; + event.goto(1); + }, + intro: { + content: "对$使用“掠城”【杀】无任何次数限制", + }, + mod: { + cardUsableTarget: function (card, player, target) { + if (!card.cards || card.cards.length != 1) return; + if (card.name == "sha" && card.cards[0].hasGaintag("dclvecheng_xiongluan") && player.getStorage("dclvecheng_xiongluan").includes(target)) return true; + }, + }, + }, + }, + }, + dczhongji: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + if (player.countCards("h") >= player.maxHp) return false; + var suit = get.suit(event.card); + return !lib.suit.includes(suit) || !player.countCards("h", { suit: suit }); + }, + check: function (event, player) { + var num = Math.min(20, player.maxHp - player.countCards("h")); + if (num <= 0) return false; + var numx = + player.getHistory("useSkill", evt => { + return evt.skill == "dczhongji"; + }).length + 1; + if (numx > num) return false; + if (_status.currentPhase != player) return true; + if ( + player.hasCard(card => { + var suit = get.suit(card); + return ( + player.hasValueTarget(card) && + !player.hasCard(cardx => { + return cardx != card && get.suit(cardx) == suit; + }) + ); + }) + ) + return false; + return true; + }, + prompt2: function (event, player) { + var num = Math.min(20, player.maxHp - player.countCards("h")); + var str = num > 0 ? "摸" + get.cnNumber(num) + "张牌,然后" : ""; + return ( + str + + "弃置" + + get.cnNumber( + 1 + + player.getHistory("useSkill", evt => { + return evt.skill == "dczhongji"; + }).length + ) + + "张牌" + ); + }, + content: function () { + "step 0"; + var num = Math.min(20, player.maxHp - player.countCards("h")); + if (num > 0) player.draw(num); + "step 1"; + var num = player.getHistory("useSkill", evt => { + return evt.skill == "dczhongji"; + }).length; + player.chooseToDiscard("螽集:请弃置" + get.cnNumber(num) + "张牌", "he", true, num).set("ai", get.unuseful); + }, + ai: { + threaten: 3.2, + }, + }, + //乐周妃 + dclingkong: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + var cards = player.getCards("h"); + player.addGaintag(cards, "dclingkong_tag"); + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dclingkong_tag")) { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dclingkong_tag")) { + return false; + } + }, + }, + group: "dclingkong_marker", + subSkill: { + marker: { + audio: "dclingkong", + trigger: { player: ["gainAfter", "loseAsyncAfter"] }, + forced: true, + filter: (event, player) => { + if (event.getParent("phaseDraw", true)) return false; + const evt = player.getHistory("gain", i => !i.getParent("phaseDraw", true))[0]; + if (!evt) return false; + if (event.name == "gain") { + if (evt != event || event.getlx === false) return false; + } else if (evt.getParent() != event) return false; + const hs = player.getCards("h"); + if (!hs.length) return false; + const cards = event.getg(player); + return cards.some(card => hs.includes(card)); + }, + content: function () { + var hs = player.getCards("h"), + cards = trigger.getg(player); + cards = cards.filter(card => hs.includes(card)); + player.addGaintag(cards, "dclingkong_tag"); + game.delayx(); + }, + }, + }, + }, + dcxianshu: { + audio: 2, + enable: "phaseUse", + filter: (event, player) => { + return game.hasPlayer(current => current != player) && player.hasCard(card => card.hasGaintag("dclingkong_tag"), "h"); + }, + filterCard: card => card.hasGaintag("dclingkong_tag"), + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + position: "h", + check: card => { + const player = _status.event.player, + event = _status.event, + color = get.color(card); + if (color == "red") { + return (event.getTempCache("dcxianshu", "red") || + event.putTempCache( + "dcxianshu", + "red", + game + .hasPlayer(current => { + return current != player && current.hp <= player.hp && current.isDamaged() && get.recoverEffect(current, player, player) > 0; + }) + .toString() + )) == "true" + ? 7 - get.value(card) + : 0; + } else if (color == "black") { + return (event.getTempCache("dcxianshu", "black") || + event.putTempCache( + "dcxianshu", + "black", + game + .hasPlayer(current => { + return current != player && current.hp >= player.hp && get.effect(current, { name: "losehp" }, player, player) > 0; + }) + .toString() + )) == "true" + ? 7 - get.value(card) + : 0; + } + return 6 - get.value(card); + }, + content: function () { + "step 0"; + player.give(cards, target, true); + event.color = get.color(cards[0], player); + "step 1"; + if (target.isIn()) { + var num = Math.min(Math.abs(target.getHp() - player.getHp()), 5); + if (num > 0) player.draw(num); + } + "step 2"; + if (event.color == "red") { + if (target.getHp() <= player.getHp() && target.isDamaged()) target.recover(); + } else if (event.color == "black") { + if (target.getHp() >= player.getHp()) target.loseHp(); + } + }, + ai: { + combo: "dclingkong", + order: 10, + result: { + player: function (player, target) { + if (!ui.selected.cards.length) return 0; + let num = target.getHp() - player.getHp(); + const card = ui.selected.cards[0], + color = get.color(card); + if (color == "red" && target.getHp() <= player.getHp() && target.isDamaged()) num++; + else if (color == "black" && target.getHp() >= player.getHp()) num--; + return Math.min(Math.abs(num), 5) * 1.1; + }, + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + const card = ui.selected.cards[0], + color = get.color(card), + val = get.value(card, target); + if (color == "red" && target.getHp() <= player.getHp() && target.isDamaged()) return get.recoverEffect(target, player, target) + val / 1.4; + else if (color == "black" && target.getHp() >= player.getHp()) return get.effect(target, { name: "losehp" }, player, target) + val / 1.4; + return val / 1.4; + }, + }, + }, + }, + //吴班 + dcyouzhan: { + audio: 2, + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + direct: true, + filter: function (event, player) { + if (player != _status.currentPhase) return false; + return game.hasPlayer(current => { + if (current == player) return false; + var evt = event.getl(current); + return evt && evt.cards2.length; + }); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => { + if (current == player) return false; + var evt = trigger.getl(current); + return evt && evt.cards2.length; + }); + event.targets = targets; + player.logSkill("dcyouzhan", targets); + "step 1"; + event.target = targets.shift(); + event.num = trigger.getl(event.target).cards2.length; + "step 2"; + player.draw().gaintag = ["dcyouzhan"]; + player.addTempSkill("dcyouzhan_limit"); + target.addTempSkill("dcyouzhan_effect"); + target.addMark("dcyouzhan_effect", 1, false); + target.addTempSkill("dcyouzhan_draw"); + if (--event.num) event.redo(); + "step 3"; + if (targets.length) { + event.goto(1); + } + }, + ai: { + damageBonus: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.target || !arg.target.hasSkill("dcyouzhan_effect")) return false; + }, + }, + subSkill: { + effect: { + audio: "dcyouzhan", + trigger: { + player: "damageBegin3", + }, + filter: function (event, player) { + return player.hasMark("dcyouzhan_effect"); + }, + forced: true, + charlotte: true, + onremove: true, + content: function () { + "step 0"; + trigger.num += player.countMark("dcyouzhan_effect"); + player.removeSkill("dcyouzhan_effect"); + }, + mark: true, + intro: { + content: "本回合下一次受到的伤害+#", + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) return 1 + 0.5 * target.countMark("dcyouzhan_effect"); + }, + }, + }, + }, + draw: { + trigger: { + global: "phaseJieshuBegin", + }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !player.getHistory("damage").length; + }, + content: function () { + player.draw(Math.min(3, player.getHistory("lose").length)); + }, + }, + limit: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("dcyouzhan"); + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcyouzhan")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcyouzhan")) return false; + }, + }, + }, + }, + }, + //乐蔡文姬 + dcshuangjia: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + var cards = player.getCards("h"); + player.addGaintag(cards, "dcshuangjia_tag"); + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcshuangjia_tag")) { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcshuangjia_tag")) { + return false; + } + }, + globalTo: function (from, to, distance) { + return ( + distance + + Math.min( + 5, + to.countCards("h", card => card.hasGaintag("dcshuangjia_tag")) + ) + ); + }, + }, + }, + dcbeifen: { + audio: 2, + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dcshuangjia_tag")) return true; + } + return false; + } + return player.hasHistory("lose", evt => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcshuangjia_tag")) return true; + } + return false; + }); + }, + forced: true, + content: function () { + var suits = lib.suit.slice(); + player.countCards("h", card => { + if (!card.hasGaintag("dcshuangjia_tag")) return false; + suits.remove(get.suit(card)); + }); + var cards = []; + while (suits.length) { + var suit = suits.shift(); + var card = get.cardPile(cardx => { + return get.suit(cardx, false) == suit; + }); + if (card) cards.push(card); + } + if (cards.length) { + player.gain(cards, "gain2"); + } + }, + mod: { + cardUsable: function (card, player) { + var len = player.countCards("h"); + var cnt = player.countCards("h", card => card.hasGaintag("dcshuangjia_tag")); + if (2 * cnt < len) return Infinity; + }, + targetInRange: function (card, player) { + var len = player.countCards("h"); + var cnt = player.countCards("h", card => card.hasGaintag("dcshuangjia_tag")); + if (2 * cnt < len) return true; + }, + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcshuangjia_tag")) { + var suits = lib.suit.slice(); + player.countCards("h", cardx => { + if (!cardx.hasGaintag("dcshuangjia_tag")) return false; + if (card == cardx) return false; + suits.remove(get.suit(cardx)); + }); + if (suits.length) return num + suits.length * 2.5; + } + }, + }, + }, + //孟优 + dcmanzhi: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + filter: function (event, player) { + if (event.name == "phaseJieshu") { + var del = 0; + game.getGlobalHistory("changeHp", evt => { + if (evt.player != player) return; + for (var phase of lib.phaseName) { + var evtx = evt.getParent(phase); + if (evtx && evtx.name == phase) { + del += evt.num; + break; + } + } + }); + if (del != 0) return false; + } + return game.hasPlayer(current => { + if (current == player) return false; + return (!player.hasSkill("dcmanzhi_1") && current.countCards("he")) || (!player.hasSkill("dcmanzhi_2") && current.countCards("hej")); + }); + }, + direct: true, + content: function () { + "step 0"; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + player + .chooseTarget(get.prompt2("dcmanzhi"), (card, player, target) => { + if (player == target) return false; + return (!player.hasSkill("dcmanzhi_1") && target.countCards("he")) || (!player.hasSkill("dcmanzhi_2") && target.countCards("hej")); + }) + .set("ai", target => { + return 1 - get.attitude(get.player(), target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var choices = []; + var choiceList = ["令其交给你两张牌,然后其视为使用一张无距离限制的【杀】", "你获得其区域内的至多两张牌,然后交给其等量的牌并摸一张牌"]; + var chosen = [player.hasSkill("dcmanzhi_1"), player.hasSkill("dcmanzhi_2")]; + if (target.countCards("he") && (!chosen[0] || trigger.name == "phaseZhunbei")) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + (chosen[0] ? "(已被选择过)" : "") + ""; + if (target.countCards("hej") && (!chosen[1] || trigger.name == "phaseZhunbei")) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + (chosen[1] ? "(已被选择过)" : "") + ""; + if (trigger.name == "phaseJieshu") choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (target.getUseValue({ name: "sha" }, false) > 5 && !player.hasShan() && trigger.name == "phaseZhunbei") return 1; + return 0; + })() + ) + .set("prompt", "蛮智:请选择一项"); + } else { + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + event.finish(); + } + "step 2"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (result.control == "cancel2") { + event.finish(); + return; + } + player.logSkill("dcmanzhi", target); + if (result.control == "选项一") { + player.addTempSkill("dcmanzhi_1"); + target.chooseCard(Math.min(2, target.countCards("he")), "he", "蛮智:请交给" + get.translation(player) + "两张牌", true); + } else { + player.addTempSkill("dcmanzhi_2"); + player.gainPlayerCard(target, "hej", [1, 2], true); + event.goto(5); + } + "step 3"; + if (result.bool) { + target.give(result.cards, player); + } else event.finish(); + "step 4"; + target.chooseUseTarget("sha", true, "nodistance"); + event.finish(); + "step 5"; + if (result.bool && target.isIn()) { + var num = result.cards.length, + hs = player.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length < num) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, num, "交给" + get.translation(target) + get.cnNumber(num) + "张牌"); + } else event.finish(); + "step 6"; + if (result.bool) { + player.give(result.cards, target); + player.draw(); + } + }, + subSkill: { + 1: { charlotte: true }, + 2: { charlotte: true }, + }, + }, + //孙綝 + dczigu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + selectCard: 1, + check: function (card) { + var player = _status.event.player; + if (!player.hasSkill("dczuowei")) return 6 - get.value(card); + if (player.countCards("h") == player.countCards("e") + 1 && !player.hasCard(card => player.hasValueTarget(card), "h")) { + if (get.position(card) == "e") return 0; + return 8 - get.value(card); + } + return 6 - get.value(card); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => { + return current.countGainableCards(player, "e"); + }); + if (targets.length == 0) event._result = { bool: false }; + else if (targets.length == 1) event._result = { bool: true, targets: targets }; + else + player + .chooseTarget("自固:获得一名角色装备区里的一张牌", true, (card, player, target) => { + return target.countGainableCards(player, "e"); + }) + .set("ai", target => { + if (target == _status.event.player) return 10; + if (get.attitude(_status.event.player, target) < 0) { + if ( + target.hasCard(card => { + return get.value(card, player) >= 6; + }) + ) + return 12; + return 8; + } + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.gainPlayerCard("e", target, true); + } + "step 2"; + if (!result.bool || target == player || !result.cards || !result.cards.some(i => get.owner(i) == player)) player.draw(); + }, + ai: { + order: function (item, player) { + if (!player.hasSkill("dczuowei")) return 9; + if (player.countCards("h") == player.countCards("e") + 1 && !player.hasCard(card => player.hasValueTarget(card), "h")) return 9; + return 1; + }, + result: { + player: 1, + }, + }, + }, + dczuowei: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + if (!player.hasSkill("dczuowei_ban")) return true; + return Math.sign(player.countCards("h") - Math.max(1, player.countCards("e"))) >= 0; + }, + direct: true, + locked: false, + content: function () { + "step 0"; + var hs = player.countCards("h"); + var es = Math.max(1, player.countCards("e")); + var sign = Math.sign(hs - es); + event.sign = sign; + if (sign > 0) player.chooseBool(get.prompt("dczuowei"), "令" + get.translation(trigger.card) + "不可被响应").set("ai", () => 1); + else if (sign == 0) + player.chooseTarget(get.prompt("dczuowei"), "对一名其他角色造成1点伤害", lib.filter.notMe).set("ai", target => { + return get.damageEffect(target, _status.event.player, _status.event.player); + }); + else player.chooseBool(get.prompt("dczuowei"), "摸两张牌,然后本回合你不能再触发该分支").set("ai", () => 1); + "step 1"; + if (!result.bool) event.finish(); + else if (event.sign <= 0 && !event.isMine() && !event.isOnline()) game.delayx(); + "step 2"; + var sign = event.sign; + if (sign > 0) { + player.logSkill("dczuowei"); + trigger.directHit.addArray(game.players); + event.finish(); + } else if (sign == 0) { + var target = result.targets[0]; + player.logSkill("dczuowei", target); + target.damage(); + } else { + player.logSkill("dczuowei"); + player.draw(2); + player.addTempSkill("dczuowei_ban"); + } + }, + subSkill: { + ban: { charlotte: true }, + }, + mod: { + aiValue: function (player, card, num) { + if (_status.currentPhase != player) return; + const event = get.event(); + if (!player.isPhaseUsing()) return; + if (event.type != "phase") return; + const cardsh = [], + cardse = []; + for (const cardx of ui.selected.cards) { + const pos = get.position(cardx); + if (pos == "h") cardsh.add(cardx); + else if (pos == "e") cardse.add(cardx); + } + const hs = player.countCards("h") - cardsh.length, + es = Math.max(1, player.countCards("e") - cardse.length); + const delt = hs - es; + if (delt <= 0) return; + if (get.position(card) == "h" && delt == 1) return num / 1.25; + }, + aiUseful: function () { + return lib.skill.dczuowei.mod.aiValue.apply(this, arguments); + }, + aiOrder: function (player, card, num) { + if (player.hasSkill("dczuowei_ban") || _status.currentPhase != player) return; + const cardsh = [], + cardse = []; + const pos = get.position(card); + if (pos == "h") cardsh.add(card); + else if (pos == "e") cardse.add(card); + if (get.tag(card, "draw") || get.tag(card, "gain")) { + const hs = player.countCards("h") - cardsh.length, + es = Math.max(1, player.countCards("e") - cardse.length + (get.type(card) == "equip")); + if ((player.hasSkill("dczuowei_ban") && hs < es) || hs == es) return num + 10; + return num / 5; + } + }, + }, + ai: { + threaten: 3, + reverseEquip: true, + effect: { + player_use: function (card, player, target, current) { + if (_status.currentPhase != player) return; + if (get.type(card) == "equip" && get.cardtag(card, "gifts")) return; + if (player.countCards("h") > Math.max(1, player.countCards("e"))) return [1, 3]; + }, + }, + }, + }, + //刘宠骆俊 + dcminze: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + if (player.getStorage("dcminze_targeted").includes(target)) return false; + return target.countCards("h") < player.countCards("h"); + }, + filterCard: function (card, player) { + if (!ui.selected.cards.length) return true; + return get.name(ui.selected.cards[0]) != get.name(card); + }, + selectCard: [1, 2], + complexCard: true, + position: "he", + discard: false, + lose: false, + delay: false, + group: "dcminze_draw", + content: function () { + player.give(cards, target); + player.addTempSkill("dcminze_targeted", "phaseUseAfter"); + player.markAuto("dcminze_targeted", [target]); + player.addTempSkill("dcminze_given"); + player.markAuto( + "dcminze_given", + cards.map(i => get.name(i, player)) + ); + }, + ai: { + order: 6.5, + expose: 0.2, + }, + subSkill: { + targeted: { onremove: true, charlotte: true }, + given: { + charlotte: true, + onremove: true, + intro: { + content: "本回合以此法交出的牌名:$", + }, + }, + draw: { + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getStorage("dcminze_given").length; + }, + forced: true, + locked: false, + content: function () { + var num = Math.min(5, player.getStorage("dcminze_given").length) - player.countCards("h"); + if (num > 0) player.draw(num); + }, + }, + }, + }, + dcjini: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return player.maxHp - player.countMark("dcjini_counted") > 0; + }, + content: function () { + "step 0"; + player.chooseCard(get.prompt2("dcjini"), [1, player.maxHp - player.countMark("dcjini_counted")], lib.filter.cardRecastable).set("ai", card => { + return 6 - get.value(card); + }); + "step 1"; + if (result.bool) { + var cards = result.cards; + player.logSkill("dcjini"); + player.addTempSkill("dcjini_counted"); + player.addMark("dcjini_counted", cards.length, false); + event.recast = player.recast(cards); + } else event.finish(); + "step 2"; + if (trigger.source && trigger.source.isIn() && player.hasHistory("gain", evt => evt.getParent(2) == event.recast && evt.cards.some(value => get.name(value) == "sha"))) { + player + .chooseToUse( + function (card) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + "击逆:是否对" + get.translation(trigger.source) + "使用一张不可被响应的杀?" + ) + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", trigger.source) + .set("oncard", () => { + _status.event.directHit.addArray(game.players); + }); + } + }, + subSkill: { + counted: { + onremove: true, + charlotte: true, + }, + }, + }, + //乐綝 + dcporui: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + if (player == event.player) return false; + if (player.countMark("dcporui_round") >= (player.hasMark("dcgonghu_basic") ? 2 : 1) || player.countCards("h") == 0) return false; + return ( + game.hasPlayer(current => { + if (current == player || current == event.player) return false; + return current.hasHistory("lose", function (evt) { + return evt.cards2.length > 0; + }); + }) && player.countCards("he") > 0 + ); + }, + direct: true, + content: function () { + "step 0"; + var map = {}; + game.countPlayer(function (current) { + if (current == player || current == trigger.player) return false; + if ( + current.hasHistory("lose", function (evt) { + return evt.cards2.length > 0; + }) + ) + map[current.playerid] = + Math.min( + 5, + current.getHistory("lose").reduce(function (num, evt) { + return num + evt.cards2.length; + }, 0) + ) + 1; + }); + player + .chooseCardTarget({ + prompt: get.prompt("dcporui"), + prompt2: get.skillInfoTranslation("dcporui", player), + filterCard: function (card, player) { + return lib.filter.cardDiscardable(card, player, "dcporui"); + }, + position: "he", + filterTarget: function (card, player, target) { + return Object.keys(_status.event.map).includes(target.playerid); + }, + ai1: function (card) { + return 7 - get.value(card); + }, + ai2: function (target) { + return get.effect(target, { name: "sha" }, _status.event.player, _status.event.player) * _status.event.map[target.playerid]; + }, + }) + .set("map", map); + "step 1"; + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + event.target = target; + player.logSkill("dcporui", target); + player.discard(cards); + event.num2 = Math.min( + 5, + target.getHistory("lose").reduce(function (num, evt) { + return num + evt.cards2.length; + }, 0) + ); + event.num = event.num2 + 1; + player.addTempSkill("dcporui_round", "roundStart"); + player.addMark("dcporui_round", 1, false); + } else event.finish(); + "step 2"; + var card = { name: "sha", isCard: true, storage: { dcporui: true } }; + if (player.canUse(card, target, false) && target.isIn()) { + player.useCard(card, target); + event.num--; + } else event.goto(4); + "step 3"; + if (event.num > 0) event.goto(2); + "step 4"; + if (!player.hasMark("dcgonghu_damage") && target.isIn()) { + var cards = player.getCards("h"); + if (cards.length == 0) event._result = { bool: false }; + else if (cards.length <= event.num2) event._result = { bool: true, cards: cards }; + else player.chooseCard("破锐:交给" + get.translation(target) + get.cnNumber(event.num2) + "张手牌", true, event.num2); + } else event.finish(); + "step 5"; + if (result.bool) { + player.give(result.cards, target); + } + event.finish(); + "step 6"; + if (player.hasMark("dcgonghu_basic")) { + if ( + !target.hasHistory("damage", evt => { + return evt.card && evt.card.storage && evt.card.storage.dcporui && evt.getParent("dcporui") == event; + }) + ) { + player.recover(); + } + } + }, + subSkill: { + round: { charlotte: true, onremove: true }, + }, + ai: { + expose: 0.4, + threaten: 3.8, + }, + }, + dcgonghu: { + audio: 2, + trigger: { + player: ["loseAfter", "damageEnd"], + source: "damageSource", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + if (event.name == "damage") { + if (player.hasMark("dcgonghu_damage")) return false; + var num = 0; + player.getHistory("damage", evt => (num += evt.num)); + player.getHistory("sourceDamage", evt => (num += evt.num)); + return num > 1; + } + if (!_status.currentPhase || _status.currentPhase == player) return false; + if (player.hasMark("dcgonghu_basic")) return false; + if (_status.currentPhase && _status.currentPhase == player) return false; + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.some(i => get.type2(i, player) == "basic")) return false; + var num = 0; + player.getHistory("lose", function (evtx) { + if (num < 2) { + if (evtx && evtx.cards2) num += evtx.cards2.filter(i => get.type2(i, player) == "basic").length; + } + }); + return num >= 2; + }, + group: ["dcgonghu_basic", "dcgonghu_trick"], + content: function () { + player.addMark("dcgonghu_" + (trigger.name == "damage" ? "damage" : "basic"), 1, false); + game.log(player, "修改了技能", "#g【破锐】"); + }, + ai: { + combo: "dcporui", + }, + subSkill: { + trick: { + audio: "dcgonghu", + trigger: { player: "useCard2" }, + direct: true, + locked: true, + filter: function (event, player) { + if (!player.hasMark("dcgonghu_basic") || !player.hasMark("dcgonghu_damage")) return false; + var card = event.card; + if (get.color(card, false) != "red" || get.type(card, null, true) != "trick") return false; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("dcgonghu_trick"), function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("dcgonghu_trick", event.targets); + trigger.targets.addArray(event.targets); + } + }, + }, + basic: { + audio: "dcgonghu", + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (!player.hasMark("dcgonghu_basic") || !player.hasMark("dcgonghu_damage")) return false; + var card = event.card; + return get.color(card, false) == "red" && get.type(card, null, false) == "basic"; + }, + content: function () { + trigger.directHit.addArray(game.filterPlayer()); + game.log(trigger.card, "不可被响应"); + }, + }, + }, + }, + //张闿 + dcxiangshu: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return event.player != player && event.player.countCards("h") >= event.player.hp; + }, + content: function () { + "step 0"; + var list = [0, 1, 2, 3, 4, 5, "cancel2"]; + player + .chooseControl(list) + .set("prompt", get.prompt2("dcxiangshu")) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (get.attitude(player, trigger.player) > 0) return "cancel2"; + var cards = trigger.player.getCards("h"); + var num = 0; + for (var card of cards) { + if (!trigger.player.hasValueTarget(card)) { + num++; + if (num >= 5) break; + } + } + if (cards.length >= 3 && Math.random() < 0.5) num = Math.max(0, num - 1); + return num; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("dcxiangshu", trigger.player); + var num = result.index; + player.storage.dcxiangshu_lottery = num; + player.addTempSkill("dcxiangshu_lottery", "phaseUseAfter"); + } else event.finish(); + "step 2"; + player.chooseToDiscard("相鼠:是否弃置一张牌不公布此数字?").set("ai", card => 2 - get.value(card)); + "step 3"; + if (!result.bool) { + var num = player.storage.dcxiangshu_lottery; + player.markSkill("dcxiangshu_lottery"); + player.popup(num); + game.log(player, "选择了数字", "#g" + num); + } + }, + subSkill: { + lottery: { + audio: "dcxiangshu", + trigger: { global: "phaseUseEnd" }, + charlotte: true, + forced: true, + onremove: true, + logTarget: "player", + filter: function (event, player) { + return typeof player.storage.dcxiangshu_lottery == "number" && Math.abs(event.player.countCards("h") - player.storage.dcxiangshu_lottery) <= 1; + }, + content: function () { + var delt = Math.abs(trigger.player.countCards("h") - player.storage.dcxiangshu_lottery); + if (delt <= 1 && trigger.player.countGainableCards("he", player) > 0) { + player.gainPlayerCard(trigger.player, "he", true); + } + if (delt == 0) { + trigger.player.damage(player); + } + }, + intro: { content: "猜测的数字为#" }, + }, + }, + }, + //裴元绍 + dcmoyu: { + audio: 2, + init() { + game.addGlobalSkill("dcmoyu_ai"); + }, + onremove() { + if (!game.hasPlayer(i => i.hasSkill("dcmoyu"), true)) game.removeGlobalSkill("dcmoyu_ai"); + }, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(current => lib.skill.dcmoyu.filterTarget(null, player, current)); + }, + filterTarget(card, player, target) { + return player != target && !player.getStorage("dcmoyu_clear").includes(target) && target.countGainableCards(player, "hej"); + }, + async content(event, trigger, player) { + const target = event.target; + player.addTempSkill("dcmoyu_clear"); + player.markAuto("dcmoyu_clear", [target]); + await player.gainPlayerCard(target, "hej", true, 1 + player.hasSkill("dcmoyu_add")); + player.removeSkill("dcmoyu_add"); + const num = player.getStorage("dcmoyu_clear").length; + const result = await 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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player) + .set("num", num) + .set("oncard", card => { + _status.event.baseDamage = _status.event.getParent().num; + }) + .forResult(); + if (result.bool) { + if ( + player.hasHistory("damage", evt => { + return evt.card && evt.card.name == "sha" && evt.getParent(4) == event; + }) + ) { + player.tempBanSkill("dcmoyu"); + } else { + player.addTempSkill("dcmoyu_add", "phaseChange"); + } + } + }, + subSkill: { + clear: { + charlotte: true, + onremove: true, + }, + ban: { + charlotte: true, + mark: true, + marktext: "欲", + intro: { content: "偷马贼被反打了!" }, + }, + add: { + charlotte: true, + mark: true, + marktext: "欲", + intro: { content: "欲望加速,下次抢两张!" }, + }, + ai: { + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("dcmoyu"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("dcmoyu_ai"); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "delay" && current < 0) { + var currentx = _status.currentPhase; + if (!currentx || !currentx.isIn()) return; + var list = game.filterPlayer(current => { + if (current == target) return true; + if (!current.hasSkill("dcmoyu")) return false; + if (current.hasJudge("lebu")) return false; + return get.attitude(current, target) > 0; + }); + list.sortBySeat(currentx); + if (list.indexOf(target) != 0) return "zerotarget"; + } + }, + }, + }, + }, + }, + ai: { + order: 9, + threaten: 2.4, + result: { + target: function (player, target) { + var num = get.sgn(get.attitude(player, target)); + var eff = get.effect(target, { name: "shunshou" }, player, player) * num; + if (eff * num > 0) return eff / 10; + if ( + player.hasShan() && + !target.hasSkillTag( + "directHit_ai", + true, + { + target: player, + card: { name: "sha" }, + }, + true + ) + ) + return eff; + if ( + target.hasSha() && + player.hp + + player.countCards("hs", function (card) { + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, player, "unchanged", "cardSavable", player); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") savable = savable(card, player, player); + return savable; + }) <= + 1 + ) + return 0; + return eff; + }, + }, + }, + }, + oldmoyu: { + audio: "dcmoyu", + init: () => { + game.addGlobalSkill("oldmoyu_ai"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("oldmoyu"), true)) game.removeGlobalSkill("oldmoyu_ai"); + }, + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("oldmoyu_ban") && game.hasPlayer(current => lib.skill.oldmoyu.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return player != target && !player.getStorage("oldmoyu_clear").includes(target) && target.countGainableCards(player, "hej"); + }, + content: function () { + "step 0"; + player.addTempSkill("oldmoyu_clear"); + player.markAuto("oldmoyu_clear", [target]); + player.gainPlayerCard(target, "hej", true); + "step 1"; + var num = player.getStorage("oldmoyu_clear").length; + target + .chooseToUse( + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + "是否对" + get.translation(player) + "使用一张无距离限制的【杀】(伤害基数为" + num + ")?" + ) + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player) + .set("num", num) + .set("oncard", card => { + _status.event.baseDamage = _status.event.getParent().num; + }); + "step 2"; + if (result.bool) { + if ( + player.hasHistory("damage", evt => { + return evt.card && evt.card.name == "sha" && evt.getParent(4) == event; + }) + ) + player.addTempSkill("oldmoyu_ban"); + } + }, + subSkill: { + clear: { + charlotte: true, + onremove: true, + }, + ban: { + charlotte: true, + mark: true, + marktext: "欲", + intro: { content: "偷马贼被反打了!" }, + }, + ai: { + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("oldmoyu"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("oldmoyu_ai"); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "delay" && current < 0) { + var currentx = _status.currentPhase; + if (!currentx || !currentx.isIn()) return; + var list = game.filterPlayer(current => { + if (current == target) return true; + if (!current.hasSkill("oldmoyu")) return false; + if (current.hasJudge("lebu")) return false; + return get.attitude(current, target) > 0; + }); + list.sortBySeat(currentx); + if (list.indexOf(target) != 0) return "zerotarget"; + } + }, + }, + }, + }, + }, + ai: { + order: 9, + threaten: 2.4, + result: { + target: function (player, target) { + var num = get.sgn(get.attitude(player, target)); + var eff = get.effect(target, { name: "shunshou" }, player, player) * num; + if (eff * num > 0) return eff / 10; + if ( + player.hasShan() && + !target.hasSkillTag( + "directHit_ai", + true, + { + target: player, + card: { name: "sha" }, + }, + true + ) + ) + return eff; + if ( + target.hasSha() && + player.hp + + player.countCards("hs", function (card) { + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, player, "unchanged", "cardSavable", player); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") savable = savable(card, player, player); + return savable; + }) <= + player.getStorage("oldmoyu_clear").length + 1 + ) + return 0; + return eff; + }, + }, + }, + }, + //张楚 + dcjizhong: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + selectTarget: 1, + content: function () { + "step 0"; + target.draw(2); + "step 1"; + var marked = target.hasMark("dcjizhong"); + var cards = target.getCards("h"); + if (marked) { + if (cards.length <= 3) event._result = { bool: true, cards: cards }; + else target.chooseCard(`集众:交给${get.translation(player)}三张手牌`, 3, true); + } else { + target + .chooseCard(`集众:交给${get.translation(player)}三张手牌,或点击“取消”获得“信众”标记`, 3) + .set("ai", card => { + if (get.event("goon")) return 20 - get.value(card); + return 1 - get.value(card); + }) + .set("goon", get.attitude(target, player) > 0); + } + "step 2"; + if (!result.bool) { + target.addMark("dcjizhong", 1); + } else { + target.give(result.cards, player); + } + }, + marktext: "信", + intro: { + name: "信众", + name2: "信众", + markcount: () => 0, + content: "已成为信徒", + }, + ai: { + order: 9.5, + result: { + target: function (player, target) { + var num = target.countCards("h"); + if (num <= 1) return -num; + if (get.attitude(player, target) > 0) return 1; + return -1 / (num / 2 + 1); + }, + }, + }, + }, + dcrihui: { + audio: 2, + trigger: { player: "useCardAfter" }, + usable: 1, + filter: function (event, player) { + if (!event.targets || event.targets.length != 1 || event.targets[0] == player) return false; + var card = event.card; + var target = event.targets[0]; + var marked = target.hasMark("dcjizhong"); + return (get.type(card) == "trick" || (get.color(card) == "black" && get.type(card) == "basic")) && (marked || (!marked && game.hasPlayer(current => current.hasMark("dcjizhong")))); + }, + logTarget: event => event.targets[0], + prompt2(event, player) { + const target = event.targets[0]; + if (target.hasMark("dcjizhong")) return "获得该角色区域内的一张牌"; + else { + const card = { name: event.card.name, nature: event.card.nature, isCard: true }; + return "令所有有“信众”的角色依次视为对其使用一张" + get.translation(card); + } + }, + check(event, player) { + const target = event.targets[0]; + if (target.hasMark("dcjizhong")) { + return get.effect(target, { name: "shunshou_copy" }, event, player) > 0; + } else { + const card = { name: event.card.name, nature: event.card.nature, isCard: true }; + let eff = 0; + game.countPlayer(current => { + if (!current.hasMark("dcjizhong") || !current.canUse(card, player, false)) return; + eff += get.effect(target, card, current, player); + }); + return eff > 0; + } + }, + async content(event, trigger, player) { + const target = trigger.targets[0]; + if (target.hasMark("dcjizhong")) { + await player.gainPlayerCard(target, "hej", true); + } else { + const card = { name: trigger.card.name, nature: trigger.card.nature, isCard: true }; + const targets = game.filterPlayer(current => current.hasMark("dcjizhong")).sortBySeat(_status.currentPhase); + for (const current of targets) { + if (target.isIn() && current.isIn() && current.canUse(card, target, false)) { + await current.useCard(card, target, false); + } + } + } + }, + ai: { + combo: "dcjizhong", + }, + }, + dcguangshi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return !game.hasPlayer(current => current != player && !current.hasMark("dcjizhong")); + }, + forced: true, + content: function () { + player.draw(2); + player.loseHp(); + }, + ai: { + combo: "dcjizhong", + }, + }, + //董绾 + dcshengdu: { + audio: 2, + trigger: { player: "phaseBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("dcshengdu"), lib.filter.notMe).set("ai", target => { + var player = _status.event.player; + var att = get.attitude(player, target); + var eff = get.effect( + target, + { + name: "sha", + storage: { dcjieling: true }, + }, + player, + player + ); + var value = att / 5; + if (value < 0) value = -value / 1.3; + value = Math.max(value - eff / 20, 0.01); + return value; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcshengdu", target); + target.addMark("dcshengdu", 1); + } + }, + intro: { content: "mark" }, + group: "dcshengdu_effect", + subSkill: { + effect: { + audio: "dcshengdu", + trigger: { global: "gainAfter" }, + filter: function (event, player) { + return event.getParent(2).name == "phaseDraw" && event.player.hasMark("dcshengdu"); + }, + forced: true, + logTarget: "player", + content: function () { + var num = trigger.player.countMark("dcshengdu"); + player.draw(num * trigger.cards.length); + trigger.player.removeMark("dcshengdu", num); + }, + }, + }, + }, + dcjieling: { + audio: 2, + enable: "phaseUse", + position: "hs", + viewAs: { + name: "sha", + storage: { dcjieling: true }, + }, + filterCard: function (card, player) { + if (player.getStorage("dcjieling_count").includes(get.suit(card))) return false; + if (ui.selected.cards.length) { + return get.suit(card) != get.suit(ui.selected.cards[0]); + } + return true; + }, + selectCard: 2, + complexCard: true, + check: function (card) { + return 6 - get.value(card); + }, + precontent: function () { + player.addTempSkill("dcjieling_after"); + event.getParent().addCount = false; + player.addTempSkill("dcjieling_count", "phaseUseAfter"); + player.markAuto( + "dcjieling_count", + event.result.cards.reduce((list, card) => list.add(get.suit(card, player)), []) + ); + }, + ai: { + order: function (item, player) { + return get.order({ name: "sha" }) + 0.1; + }, + }, + locked: false, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dcjieling) return true; + }, + cardUsable: function (card, player, num) { + if (card.storage && card.storage.dcjieling) return Infinity; + }, + }, + subSkill: { + after: { + charlotte: true, + audio: "dcjieling", + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return event.card.name == "sha" && event.card.storage && event.card.storage.dcjieling; + }, + direct: true, + content: function () { + "step 0"; + var damaged = game.hasPlayer2(current => { + return current.hasHistory("damage", evt => evt.card == trigger.card); + }); + var targets = trigger.targets.filter(i => i.isIn()); + player.logSkill("dcjieling_after", targets); + if (damaged) { + for (var target of targets) { + target.loseHp(); + } + } else { + for (var target of targets) { + target.addMark("dcshengdu", 1); + } + } + }, + }, + count: { + intro: { + content: function (s, p) { + let str = "此阶段已转化过的卡牌花色:"; + for (let i = 0; i < s.length; i++) { + str += get.translation(s[i]); + } + return str; + }, + }, + charlotte: true, + onremove: true, + }, + }, + }, + //袁胤 + dcmoshou: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + init: function (player, skill) { + if (typeof player.storage[skill] != "number") player.storage[skill] = 0; + }, + filter: function (event, player) { + return get.color(event.card) == "black" && event.player != player; + }, + frequent: true, + prompt2: function (event, player) { + var num = (player.getAllHistory("useSkill", evt => evt.skill == "dcmoshou").length % 3) + 1; + return "摸" + get.cnNumber(num) + "张牌"; + }, + content: function () { + var num = player.getAllHistory("useSkill", evt => evt.skill == "dcmoshou").length; + player.storage.dcmoshou = num; + player.syncStorage("dcmoshou"); + player.markSkill("dcmoshou"); + num = ((num - 1) % 3) + 1; + player.draw(num); + }, + mark: true, + marktext: "守", + intro: { + markcount: function (storage, player) { + if (typeof storage != "number") return 1; + return (storage % 3) + 1; + }, + content: "本局游戏已发动过$次技能", + }, + }, + dcyunjiu: { + audio: 2, + trigger: { global: "dieAfter" }, + direct: true, + content: function () { + "step 0"; + var evt = trigger.player.getHistory("lose", evtx => { + return evtx.getParent(2) == trigger; + })[0]; + if (!evt) event.finish(); + else { + var cards = []; + //冷知识,角色死亡后只有手牌区和装备区的牌是被系统弃置的,其余牌的处理方式均为置入弃牌堆 + cards.addArray(evt.hs).addArray(evt.es); + event.cards = cards.filterInD("d"); + var num = cards.length; + if (num) { + event.videoId = lib.status.videoId++; + var func = function (cards, id) { + var num = cards.length; + var dialog = ui.create.dialog(get.prompt("dcyunjiu"), '
    弃置' + get.cnNumber(num) + "张牌,令一名其他角色获得以下这些牌
    ", cards); + dialog.videoId = id; + return dialog; + }; + if (player.isOnline2()) { + player.send(func, cards, event.videoId); + } + event.dialog = func(cards, event.videoId); + if (player != game.me || _status.auto) { + event.dialog.style.display = "none"; + } + player.chooseCardTarget({ + prompt: false, + filterTarget: lib.filter.notMe, + filterCard: lib.filter.cardDiscardable, + selectCard: num, + position: "he", + goon: (function () { + if (!game.hasPlayer(current => get.attitude(player, current)) > 0) return false; + var value = 0; + for (var card of cards) { + value += get.value(card, player, "raw") - 1.2; + } + return value > 0; + })(), + ai1: function (card) { + if (_status.event.goon) { + if (ui.selected.cards.length == _status.event.selectCard[1] - 1 && ui.selected.cards.length > 0) return 7 - get.value(card); + return 5.5 - get.value(card); + } + return 0; + }, + ai2: function (target) { + return get.attitude(_status.event.player, target) / Math.sqrt(target.countCards("h") + 1); + }, + }); + } else event.finish(); + } + "step 1"; + if (player.isOnline2()) { + player.send("closeDialog", event.videoId); + } + event.dialog.close(); + if (result.bool) { + var cardsx = result.cards, + target = result.targets[0]; + player.logSkill("dcyunjiu", target); + player.discard(cardsx); + target.gain(cards.filterInD("d"), "gain2").giver = player; + } else event.finish(); + "step 2"; + player.gainMaxHp(); + player.recover(); + }, + }, + //高翔 + dcchiying: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.hp <= player.hp; + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => target.inRange(current) && current != player).sortBySeat(player); + event.targets = targets; + if (!targets.length) event.finish(); + "step 1"; + var current = targets.shift(); + if (current.countCards("he")) current.chooseToDiscard("驰应:请弃置一张牌", "he", true); + if (targets.length) event.redo(); + "step 2"; + if (target != player) { + var cards = []; + game.getGlobalHistory("cardMove", evt => { + if (evt.getParent(3) == event) { + cards.addArray(evt.cards.filter(card => get.type(card) == "basic")); + } + }); + cards = cards.filterInD("d"); + if (cards.length) target.gain(cards, "gain2"); + } + }, + ai: { + order: 6, + result: { + target: function (player, target) { + var targets = game.filterPlayer(current => target.inRange(current) && current != player); + var eff = 0; + for (var targetx of targets) { + var effx = get.effect(targetx, { name: "guohe_copy2" }, player, target); + if (get.attitude(player, targetx) < 0) effx /= 2; + eff += effx; + } + return (target == player ? 0.5 : 1) * eff * (get.attitude(player, target) <= 0 ? 0.75 : 1); + }, + }, + }, + }, + //霍峻 + dcgue: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if (player.hasSkill("dcgue_blocker", null, null, false)) return false; + return name == "sha" || name == "shan"; + }, + filter: function (event, player) { + if (event.dcgue || event.type == "wuxie" || player == _status.currentPhase) return false; + if (player.hasSkill("dcgue_blocker", null, null, false)) return false; + for (var name of ["sha", "shan"]) { + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var vcards = []; + for (var name of ["sha", "shan"]) { + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); + } + return ui.create.dialog("孤扼", [vcards, "vcard"], "hidden"); + }, + check: function (button) { + if (_status.event.player.countCards("h", { name: ["sha", "shan"] }) > 1) return 0; + return 1; + }, + backup: function (links, player) { + return { + filterCard: () => false, + selectCard: -1, + viewAs: { + name: links[0][2], + isCard: true, + }, + popname: true, + precontent: function () { + "step 0"; + player.logSkill("dcgue"); + player.addTempSkill("dcgue_blocker"); + if (player.countCards("h")) player.showHandcards(); + delete event.result.skill; + "step 1"; + if (player.countCards("h", { name: ["sha", "shan"] }) > 1) { + var evt = event.getParent(); + evt.set("dcgue", true); + evt.goto(0); + delete evt.openskilldialog; + return; + } + game.delayx(); + }, + }; + }, + prompt: function (links, player) { + return (player.countCards ? "展示所有手牌" : "") + (player.countCards("h", { name: ["sha", "shan"] }) <= 1 ? ",然后视为使用【" + get.translation(links[0][2]) + "】" : ""); + }, + }, + subSkill: { blocker: { charlotte: true } }, + ai: { + order: 1, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + if (player.hasSkill("dcgue_blocker", null, null, false)) return false; + }, + result: { + player: function (player) { + if (player.countCards("h", { name: ["sha", "shan"] }) > 1) return 0; + return 1; + }, + }, + }, + }, + dcsigong: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + if (player.hasSkill("dcsigong_round")) return false; + if (event.player == player || !event.player.isIn()) return false; + if (!player.canUse("sha", event.player, false)) return false; + var respondEvts = []; + game.countPlayer2(current => respondEvts.addArray(current.getHistory("useCard")).addArray(current.getHistory("respond"))); + respondEvts = respondEvts.filter(i => i.respondTo).map(evt => evt.respondTo); + return event.player.hasHistory("useCard", evt => { + return respondEvts.some(list => list[1] == evt.card); + }); + }, + direct: true, + content: function () { + "step 0"; + var num = 1 - player.countCards("h"); + event.num = num; + var prompt2 = ""; + if (num >= 0) { + var next = player.chooseBool().set("ai", () => _status.event.goon); + prompt2 += (num > 0 ? "摸一张牌," : "") + "视为对" + get.translation(trigger.player) + "使用一张【杀】(伤害基数+1)"; + } else { + var next = player + .chooseToDiscard(-num) + .set("ai", card => { + if (_status.event.goon) return 5.2 - get.value(card); + return 0; + }) + .set("logSkill", ["dcsigong", trigger.player]); + prompt2 += "将手牌数弃置至1,视为对" + get.translation(trigger.player) + "使用一张【杀】(伤害基数+1)"; + } + next.set("prompt", get.prompt("dcsigong", trigger.player)); + next.set("prompt2", prompt2); + next.set("goon", get.effect(trigger.player, { name: "sha" }, player, player) > 0); + "step 1"; + if (result.bool) { + if (num >= 0) player.logSkill("dcsigong", trigger.player); + if (num > 0) player.draw(num, "nodelay"); + event.num = Math.max(1, Math.abs(num)); + } else event.finish(); + "step 2"; + if (player.canUse("sha", trigger.player, false)) { + player.addTempSkill("dcsigong_check"); + player + .useCard({ name: "sha", isCard: true }, trigger.player, false) + .set("shanReq", num) + .set("oncard", card => { + var evt = _status.event; + evt.baseDamage++; + for (var target of game.filterPlayer(null, null, true)) { + var id = target.playerid; + var map = evt.customArgs; + if (!map[id]) map[id] = {}; + map[id].shanRequired = evt.shanReq; + } + }); + } + }, + subSkill: { + round: { charlotte: true }, + check: { + charlotte: true, + forced: true, + popup: false, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.getParent(3).name == "dcsigong"; + }, + content: function () { + player.addTempSkill("dcsigong_round", "roundStart"); + }, + }, + }, + }, + //孙寒华 + dchuiling: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + direct: true, + filter: function () { + return ui.discardPile.childNodes.length > 0; + }, + onremove: true, + mark: true, + marktext: "灵", + intro: { + name2: "灵", + mark: function (dialog, storage, player) { + dialog.addText("共有" + (storage || 0) + "个标记"); + dialog.addText("注:图标的颜色代表弃牌堆中较多的颜色"); + }, + }, + global: "dchuiling_hint", + content: function () { + "step 0"; + var mark = false; + var red = 0, + black = 0; + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var color = get.color(ui.discardPile.childNodes[i]); + if (color == "red") red++; + if (color == "black") black++; + } + if (red == black) event.finish(); + else if (red > black) { + player.logSkill("dchuiling"); + player.recover(); + event.finish(); + if (get.color(trigger.card) == "black") mark = true; + event.logged = true; + } else { + if (!event.isMine() && !event.isOnline()) game.delayx(); + player + .chooseTarget(get.prompt("dchuiling"), "弃置一名角色的一张牌", (card, player, target) => { + return target.countDiscardableCards(player, "he") > 0; + }) + .set("ai", target => { + return get.effect(target, { name: "guohe_copy2" }, _status.event.player); + }); + if (get.color(trigger.card) == "red") mark = true; + } + if (mark) { + if (!event.logged) player.logSkill("dchuiling"); + player.addMark("dchuiling", 1); + event.logged = true; + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + if (!event.logged) player.logSkill("dchuiling", target); + else player.line(target); + player.discardPlayerCard(target, "he", true); + } + }, + subSkill: { + hint: { + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], + }, + forced: true, + popup: false, + lastDo: true, + forceDie: true, + forceOut: true, + filter: function (event, player) { + if (event._dchuiling_checked) return false; + event._dchuiling_checked = true; + var cards = event.getd(); + if (!cards.filterInD("d").length) return false; + return true; + }, + markColor: [ + ["rgba(241, 42, 42, 0.75)", "black"], + ["", ""], + ["rgba(18, 4, 4, 0.75)", "rgb(200, 200, 200)"], + ], + content: function () { + "step 0"; + var red = 0, + black = 0; + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var color = get.color(ui.discardPile.childNodes[i]); + if (color == "red") red++; + if (color == "black") black++; + } + if (trigger.name.indexOf("lose") == 0) { + var cards = trigger.getd().filterInD("d"); + for (var i = 0; i < cards.length; i++) { + var color = get.color(cards[i]); + if (color == "red") red++; + if (color == "black") black++; + } + } + game.broadcastAll( + function (ind) { + var bgColor = lib.skill.dchuiling_hint.markColor[ind][0], + text = ''; + for (var player of game.players) { + if (player.marks.dchuiling) { + player.marks.dchuiling.firstChild.style.backgroundColor = bgColor; + player.marks.dchuiling.firstChild.innerHTML = text; + } + } + }, + Math.sign(black - red) + 1 + ); + }, + }, + }, + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) != "card") return; + var len = ui.discardPile.childNodes.length; + if (!len) { + var type = get.type(card); + if (type == "basic" || type == "trick") { + if (player.getDamagedHp() > 0) { + return num + (get.color(card) == "red" ? 15 : 10); + } + return num + 10; + } + return; + } + if (len > 40) return; + var red = 0, + black = 0; + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var color = get.color(ui.discardPile.childNodes[i]); + if (color == "red") red++; + if (color == "black") black++; + } + if (red == black) { + var type = get.type(card); + if (type == "basic" || type == "trick") { + if (player.getDamagedHp() > 0) { + return num + (get.color(card) == "red" ? 15 : 10); + } + return num + 10; + } + return; + } else { + var color = get.color(card); + if ((color == "red" && red < black) || (color == "black" && red > black)) return num + 10; + } + }, + }, + }, + dcchongxu: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "wood", + derivation: ["dctaji", "dcqinghuang"], + filterCard: () => false, + selectCard: [0, 1], + prompt: function () { + return "限定技。你可以失去〖汇灵〗,增加" + Math.min(game.countPlayer(), _status.event.player.countMark("dchuiling")) + "点体力上限,然后获得〖踏寂〗和〖清荒〗。"; + }, + filter: function (event, player) { + return player.countMark("dchuiling") >= 4; + }, + content: function () { + "step 0"; + player.awakenSkill("dcchongxu"); + player.removeSkills("dchuiling"); + player.gainMaxHp(Math.min(game.countPlayer(), player.countMark("dchuiling"))); + "step 1"; + player.addSkills(["dctaji", "dcqinghuang"]); + }, + ai: { + combo: "dchuiling", + order: function (itemp, player) { + if ( + player.hasCard(card => { + return get.type(card) != "equip" && player.getUseValue(card) > 1; + }, "h") + ) + return 12; + return 0.1; + }, + result: { + player: function (player) { + var count = player.countMark("dchuiling"); + if (count >= game.countPlayer() - 1) return 1; + return count >= 6 || player.hp <= 2 ? 1 : 0; + }, + }, + }, + }, + dctaji: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + locked: false, + filter: function (event, player) { + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length; + }, + content: function () { + "step 0"; + var evt = trigger.getParent(); + var effects = [ + [ + "useCard", + function () { + "step 0"; + var targets = game.filterPlayer(current => { + return current.countDiscardableCards(player, "he") && current != player; + }); + if (!targets.length) event.finish(); + else + player + .chooseTarget("踏寂:弃置其他角色一张牌", true, (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set("targets", targets) + .set("ai", target => { + return get.effect(target, { name: "guohe_copy2" }, _status.event.player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + player.discardPlayerCard(target, "he", true); + } + }, + ], + [ + "respond", + function () { + player.draw(); + }, + ], + [ + "discard", + function () { + player.recover(); + }, + ], + [ + "other", + function () { + player.addSkill("dctaji_damage"); + player.addMark("dctaji_damage", 1, false); + game.log(player, "下一次对其他角色造成的伤害", "#g+1"); + }, + ], + ]; + var name = evt.name; + if (trigger.name == "loseAsync") name = evt.type; + var list = ["useCard", "respond", "discard", "other"]; + if (!list.includes(name)) name = "other"; + for (var i = 0; i < 1 + player.countMark("dcqinghuang_add"); i++) { + if (!list.length) break; + if (!list.includes(name)) name = list.randomRemove(1)[0]; + if (name == "useCard") list.remove("useCard"); + for (var effect of effects) { + if (effect[0] == name) { + list.remove(name); + var next = game.createEvent("dctaji_" + name); + next.player = player; + next.setContent(effect[1]); + break; + } + } + } + }, + subSkill: { + damage: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return event.player != player; + }, + content: function () { + trigger.num += player.countMark("dctaji_damage"); + player.removeSkill("dctaji_damage"); + }, + intro: { + content: "下次对其他角色造成伤害时,此伤害+#", + }, + }, + }, + }, + dcqinghuang: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.maxHp > 1; + }, + check: function (event, player) { + var num1 = player.countCards("h"); + var num2 = player.countCards("h", card => player.hasValueTarget(card)); + var num3 = player.getHandcardLimit(); + if (player.isDamaged()) { + return num2 > 1 || num1 - num2 - num3 > 0; + } else { + return num2 > 2 + Math.max(0, 3 - player.hp) || (player.hp > 2 && num1 - num2 - num3 > 2); + } + }, + content: function () { + player.loseMaxHp(); + player.addTempSkill("dcqinghuang_add"); + player.addMark("dcqinghuang_add", 1, false); + }, + ai: { + combo: "dctaji", + }, + subSkill: { + add: { + charlotte: true, + onremove: true, + }, + }, + }, + //孟节 + dcyinlu: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + derivation: ["dcyinlu_lequan", "dcyinlu_huoxi", "dcyinlu_zhangqi", "dcyinlu_yunxiang"], + global: ["dcyinlu_lequan", "dcyinlu_huoxi", "dcyinlu_zhangqi", "dcyinlu_yunxiang"], + group: "dcyinlu_move", + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + hasMark: function (target) { + return lib.skill.dcyinlu.derivation.some(i => target.hasMark(i)); + }, + content: function () { + "step 0"; + event.marks = lib.skill.dcyinlu.derivation.slice(0, 3); + if (game.countPlayer() <= 2) event.goto(3); + "step 1"; + player + .chooseTarget("引路:令三名角色分别获得〖引路〗标记", true, 3) + .set("targetprompt", () => { + return get.translation(lib.skill.dcyinlu.derivation[ui.selected.targets.length - 1]); + }) + .set("complexSelect", true) + .set("ai", target => { + var player = _status.event.player; + if (ui.selected.targets.length == 2) return get.effect(target, { name: "losehp" }, player, player); + return get.attitude(player, target); + }); + "step 2"; + if (result.bool) { + var targets = result.targets; + player.line(targets); + for (var i = 0; i < targets.length; i++) { + targets[i].addMark(event.marks[i]); + } + } + event.goto(5); + "step 3"; + player.logSkill("dcyinlu", game.players); + var list = []; + for (var mark of event.marks) { + list.push([mark, '"]); + } + var target = game.filterPlayer(i => i != player)[0]; + if (!game.hasPlayer(current => current != player)) target = player; + event.target = target; + player + .chooseButton(["引路:令" + get.translation(target) + "获得2枚〖引路〗标记", [list, "textbutton"]]) + .set("ai", button => { + var mark = button.link; + if (mark == "dcyinlu_lequan") return 9; + if (mark == "dcyinlu_zhangqi") return 10; + return 8; + }) + .set("forced", true) + .set("selectButton", 2) + .set("forcebutton", true); + "step 4"; + if (result.bool) { + var marks = result.links; + for (var mark of marks) target.addMark(mark, 1); + event.marks.removeArray(marks); + for (var mark of event.marks) player.addMark(mark, 1); + } + "step 5"; + player.addMark("dcyinlu_yunxiang", 1); + player.addMark("dcyinlu_xiang", 1); + game.log(player, "获得了1点芸香值"); + }, + subSkill: { + move: { + audio: "dcyinlu", + trigger: { + player: "phaseZhunbeiBegin", + global: "die", + }, + direct: true, + filter: function (event, player) { + if (event.name == "die") { + return lib.skill.dcyinlu.hasMark(event.player); + } + return game.hasPlayer(current => { + return lib.skill.dcyinlu.hasMark(current); + }); + }, + content: function () { + "step 0"; + if (trigger.name == "die") { + var marks = lib.skill.dcyinlu.derivation.filter(mark => trigger.player.hasMark(mark)); + event.marks = marks; + event.goto(3); + } else { + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + player + .chooseTarget(get.prompt("dcyinlu_move"), "移动一名角色的〖引路〗标记", 2, (card, player, target) => { + if (ui.selected.targets.length == 0) return lib.skill.dcyinlu.hasMark(target); + return true; + }) + .set("ai", target => { + var player = _status.event.player; + if (ui.selected.targets.length == 0) { + var owned = lib.skill.dcyinlu.derivation.filter(i => target.hasMark(i)); + var att = get.attitude(player, target); + if (att > 0) { + if (owned.includes("dcyinlu_zhangqi")) return target.hasCard({ suit: "spade" }, "he") ? 5 : 10; + if ( + owned.includes("dcyinlu_lequan") && + target.isHealthy() && + game.hasPlayer(current => { + return current != target && get.recoverEffect(current, player, player) > 0; + }) + ) + return 2; + return 0; + } + if (att < 0) { + if (owned.some(i => i != "dcyinlu_zhangqi")) return 8; + return 0; + } + if ( + owned.includes("dcyinlu_zhangqi") && + game.hasPlayer(current => { + return current != target && get.effect(current, { name: "losehp" }, player, player) > 0; + }) + ) + return 3; + return 1; + } else { + var targetx = ui.selected.targets[0]; + var att = get.attitude(player, targetx), + att2 = get.attitude(player, target); + var owned = lib.skill.dcyinlu.derivation.filter(i => targetx.hasMark(i)); + if (att > 0) { + if (owned.includes("dcyinlu_zhangqi")) return -att2; + if (owned.includes("dcyinlu_lequan")) return get.recoverEffect(target, player, player); + } else if (att < 0) { + if (owned.some(i => i != "dcyinlu_zhangqi")) return att2; + } else { + if (owned.includes("dcyinlu_zhangqi")) return get.effect(target, { name: "losehp" }, player, player); + return att2; + } + } + return Math.random(); + }) + .set("complexTarget", true); + } + "step 1"; + if (result.bool) { + var marks = lib.skill.dcyinlu.derivation; + var targets = result.targets, + owned = marks.filter(mark => targets[0].hasMark(mark)); + event.targets = targets; + if (owned.length == 1) event._result = { bool: true, control: owned[0] }; + else { + player + .chooseControl(owned) + .set("prompt", "引路:选择要移动" + get.translation(targets[0]) + "的标记") + .set( + "choiceList", + owned.map(mark => { + return '
    【' + get.translation(mark) + "】
    " + lib.translate[mark + "_info"] + "
    "; + }) + ) + .set("displayIndex", false) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var att = get.attitude(player, targets[0]), + att2 = get.attitude(player, targets[1]); + if (att > 0) { + if (owned.includes("dcyinlu_zhangqi") && att2 < 0) return "dcyinlu_zhangqi"; + if (owned.includes("dcyinlu_lequan") && att2 > 0) return "dcyinlu_lequan"; + } else if (att < 0) { + var marksx = owned.filter(i => i != "dcyinlu_zhangqi"); + if (marksx.length && att2 > 0) return marksx[0]; + return owned[0]; + } else { + if (owned.includes("dcyinlu_zhangqi")) return "dcyinlu_zhangqi"; + } + if (owned.length > 1) owned.remove("dcyinlu_zhangqi"); + return owned[0]; + })() + ); + } + } else { + if (_status.connectMode) + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + event.finish(); + } + "step 2"; + if (_status.connectMode) + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + var mark = result.control, + count = targets[0].countMark(mark); + player.logSkill("dcyinlu_move", targets, false); + player.line2(targets, mark == "dcyinlu_zhangqi" ? "fire" : "green"); + targets[0].removeMark(mark, count); + targets[1].addMark(mark, count); + event.finish(); + "step 3"; + player + .chooseTarget("引路:是否转移“" + get.translation(event.marks[0]) + "”标记?") + .set("ai", target => { + var player = _status.event.player, + mark = _status.event.mark; + if (mark == "dcyinlu_zhangqi") return get.effect(target, { name: "losehp" }, player, player) + 0.1; + if (mark == "dcyinlu_lequan") return get.recoverEffect(target, player, player) + get.attitude(player, target) / 5; + return get.attitude(player, target); + }) + .set("mark", event.marks[0]); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcyinlu_move", target); + var count = trigger.player.countMark(event.marks[0]); + trigger.player.removeMark(event.marks[0], count, false); + target.addMark(event.marks[0], count); + } + "step 5"; + event.marks.shift(); + if (event.marks.length) event.goto(3); + }, + }, + lequan: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + charlotte: true, + filter: function (event, player) { + return player.hasMark("dcyinlu_lequan") && game.hasPlayer(current => current.hasSkill("dcyinlu")); + }, + marktext: "乐", + intro: { + name: "乐泉", + name2: "乐泉", + markcount: () => 0, + content: "结束阶段,你可以弃置一张♦牌并回复1点体力。", + }, + content: function () { + "step 0"; + player + .chooseToDiscard("乐泉:是否弃置一张♦牌并回复1点体力?", { suit: "diamond" }, "he") + .set("ai", card => { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("logSkill", "dcyinlu_lequan") + .set("goon", get.recoverEffect(player, player)); + "step 1"; + if (result.bool) { + player.recover(); + } + }, + }, + huoxi: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + charlotte: true, + filter: function (event, player) { + return player.hasMark("dcyinlu_huoxi") && game.hasPlayer(current => current.hasSkill("dcyinlu")); + }, + marktext: "藿", + intro: { + name: "藿溪", + name2: "藿溪", + markcount: () => 0, + content: "结束阶段,你可以弃置一张♥牌并摸两张牌。", + }, + content: function () { + "step 0"; + player + .chooseToDiscard("藿溪:是否弃置一张♥牌并摸两张牌?", { suit: "heart" }, "he") + .set("ai", card => { + return 6 - get.value(card); + }) + .set("logSkill", "dcyinlu_huoxi"); + "step 1"; + if (result.bool) { + player.draw(2); + } + }, + }, + zhangqi: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + direct: true, + charlotte: true, + filter: function (event, player) { + return player.hasMark("dcyinlu_zhangqi") && game.hasPlayer(current => current.hasSkill("dcyinlu")); + }, + marktext: "瘴", + intro: { + name: "瘴气", + name2: "瘴气", + markcount: () => 0, + content: "锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。", + }, + content: function () { + "step 0"; + player + .chooseToDiscard("瘴气:弃置一张♠牌,或失去1点体力", { suit: "spade" }, "he") + .set("ai", card => { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("logSkill", "dcyinlu_zhangqi") + .set("goon", get.effect(player, { name: "losehp" }, player) < 0); + "step 1"; + if (!result.bool) { + player.logSkill("dcyinlu_zhangqi"); + player.loseHp(); + } + }, + }, + yunxiang: { + trigger: { player: ["phaseJieshuBegin", "damageBegin4"] }, + direct: true, + charlotte: true, + filter: function (event, player) { + if (!game.hasPlayer(current => current.hasSkill("dcyinlu"))) return false; + if (event.name == "phaseJieshu") return player.hasMark("dcyinlu_yunxiang"); + return player.hasMark("dcyinlu_yunxiang") && player.hasMark("dcyinlu_xiang"); + }, + onremove: function (player) { + delete player.storage.dcyinlu_xiang; + }, + marktext: "芸", + intro: { + name: "芸香", + name2: "芸香", + markcount: function (storage, player) { + return player.countMark("dcyinlu_xiang"); + }, + content: function (storage, player) { + return "①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。
  • 当前芸香值:" + player.countMark("dcyinlu_xiang"); + }, + }, + content: function () { + "step 0"; + if (trigger.name == "phaseJieshu") { + player + .chooseToDiscard("芸香:是否弃置一张♣牌,获得1枚“香”?", { suit: "club" }, "he") + .set("ai", card => { + return 6 - get.value(card) + 2.5 * _status.event.player.countMark("dcyinlu_xiang"); + }) + .set("logSkill", "dcyinlu_yunxiang"); + } else { + player + .chooseBool("芸香:是否移去所有“香”,令此伤害-" + player.countMark("dcyinlu_xiang") + "?") + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.damageEffect(player, trigger.source, player) < 0); + } + "step 1"; + if (result.bool) { + if (trigger.name == "phaseJieshu") { + player.addMark("dcyinlu_xiang", 1, false); + game.log(player, "获得了1点芸香值"); + } else { + player.logSkill("dcyinlu_yunxiang"); + var num = player.countMark("dcyinlu_xiang"); + player.removeMark("dcyinlu_xiang", num, false); + game.log(player, "扣减了", num, "点芸香值"); + trigger.num = Math.max(0, trigger.num - num); + } + } + }, + }, + }, + }, + dcyouqi: { + audio: 2, + trigger: { global: "loseAfter" }, + filter: function (event, player) { + if (event.getParent(3).name.indexOf("dcyinlu_") != 0 || player == event.player) return false; + return true; + }, + derivation: "dcyouqi_faq", + direct: true, + forced: true, + content: function () { + if (Math.random() < 1.25 - 0.25 * get.distance(player, trigger.player) || get.isLuckyStar(player)) { + player.logSkill("dcyouqi"); + player.gain(trigger.cards.filterInD("d"), "gain2"); + } + }, + ai: { + combo: "dcyinlu", + }, + }, + //孙资刘放 + dcqinshen: { + audio: 2, + trigger: { player: "phaseDiscardEnd" }, + frequent: true, + prompt2: function () { + return "摸" + get.cnNumber(lib.skill.dcqinshen.getNum()) + "张牌"; + }, + getNum: function () { + var list = lib.suit.slice(); + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" && evt.name != "cardsDiscard") return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + for (var card of evt.cards) list.remove(get.suit(card, false)); + }); + return list.length; + }, + filter: function (event, player) { + return lib.skill.dcqinshen.getNum() > 0; + }, + content: function () { + player.draw(lib.skill.dcqinshen.getNum()); + }, + }, + dcweidang: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + /** + * @deprecated + */ + getLength: card => get.cardNameLength(card), + direct: true, + filter: function (event, player) { + var num = lib.skill.dcqinshen.getNum(); + return event.player != player && (_status.connectMode ? player.countCards("he") : player.hasCard(card => get.cardNameLength(card) == num, "he")); + }, + content: function () { + "step 0"; + var num = lib.skill.dcqinshen.getNum(); + event.num = num; + player + .chooseCard(get.prompt("dcweidang"), "将一张字数为" + num + "的牌置于牌堆底,然后获得一张字数为" + num + "的牌。若你能使用此牌,你使用之。", "he", (card, player, target) => { + return get.cardNameLength(card) == _status.event.num; + }) + .set("num", num) + .set("ai", card => { + return 5 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("dcweidang"), player.lose(result.cards[0], ui.cardPile); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, player); + game.delayx(); + } else event.finish(); + "step 2"; + var card = get.cardPile(cardx => get.cardNameLength(cardx) == num); + if (card) { + player.gain(card, "gain2"); + if (player.hasUseTarget(card)) { + player.chooseUseTarget(card, true); + } + } + }, + }, + //三袁 + dcneifa: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + content: function () { + "step 0"; + player.draw(3); + player.chooseToDiscard(true, "he").set("ai", function (cardx) { + var player = _status.event.player; + var num = 0; + var hs = player.getCards("h"); + var muniu = player.getEquip("muniu"); + if (muniu && muniu.cards) hs = hs.concat(muniu.cards); + if (get.type(cardx) == "basic") { + var shas = hs.filter(function (card) { + return card != cardx && get.name(card, player) == "sha" && player.hasValueTarget(card, false); + }); + var numx = player.countCards("h", function (card) { + return get.type2(card, player) == "trick"; + }); + num += Math.min(numx, Math.max(0, shas.length - player.getCardUsable("sha"))) * 0.65; + num += + Math.min( + player.getCardUsable("sha") + numx, + shas.filter(function (card) { + return ( + game.countPlayer(function (current) { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) > 1 + ); + }).length + ) * 1.1; + var taos = Math.min( + player.maxHp - player.hp, + hs.filter(function (card) { + return cardx != card && get.name(card, player) == "tao"; + }).length + ); + num += taos * player.getDamagedHp() * 1.2; + } else if (get.type2(cardx) == "trick") { + var numx = Math.sqrt( + Math.min( + 5, + player.countCards("h", function (card) { + return get.type(card, player) == "basic"; + }) + ) + ); + num += + hs.filter(function (card) { + return card != cardx && get.type2(card) == "trick" && player.hasValueTarget(card); + }).length * 0.65; + } else num = 4; + return num * 1.5 - get.value(cardx); + }); + "step 1"; + if (result.bool && result.cards && result.cards.length && get.type(result.cards[0]) != "equip") { + var name = get.type(result.cards[0]) == "basic" ? "dcneifa_basic" : "dcneifa_trick"; + player.addTempSkill(name, "phaseUseAfter"); + var num = Math.min( + 5, + player.countCards("h", function (cardx) { + var type = get.type(cardx, player); + return (name == "dcneifa_basic") != (type == "basic") && type != "equip"; + }) + ); + if (num > 0) player.addMark(name, num, false); + else player.storage[name] = 0; + } + }, + ai: { + threaten: 2.33, + }, + }, + dcneifa_basic: { + mark: true, + marktext: "伐", + onremove: true, + intro: { + name: "内伐 - 基本牌", + content: "本回合内不能使用锦囊牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。", + }, + mod: { + cardEnabled: function (card, player) { + if (get.type(card, "trick") == "trick") return false; + }, + cardSavable: function (card, player) { + if (get.type(card, "trick") == "trick") return false; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") { + return num + player.countMark("dcneifa_basic"); + } + }, + }, + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current, false); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("dcneifa"), "为" + get.translation(trigger.card) + "额外指定一个目标", function (card, player, target) { + return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target, false); + }) + .set("sourcex", trigger.targets) + .set("ai", function (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("dcneifa", event.targets); + trigger.targets.addArray(event.targets); + }, + }, + dcneifa_trick: { + trigger: { player: "useCard2" }, + direct: true, + mark: true, + marktext: "伐", + onremove: true, + mod: { + cardEnabled: function (card, player) { + if (get.type(card) == "basic") return false; + }, + cardSavable: function (card, player) { + if (get.type(card) == "basic") return false; + }, + }, + intro: { + name: "内伐 - 锦囊牌", + content: "本回合内不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标。", + }, + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + if (event.targets && event.targets.length > 0) return true; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; + player + .chooseTarget(get.prompt("dcneifa"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return true; + return lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("dcneifa", event.targets); + if (trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); + else trigger.targets.addArray(event.targets); + } + }, + }, + //桥蕤 + dcaishou: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.hasCard(card => card.hasGaintag("dcaishou_tag"), "h"); + }, + forced: true, + locked: false, + group: ["dcaishou_draw", "dcaishou_lose"], + subfrequent: ["draw"], + content: function () { + "step 0"; + player.discard(player.getCards("h", card => card.hasGaintag("dcaishou_tag"))); + "step 1"; + var len = 0; + player.getHistory("lose", evt => { + if (evt.getParent(2) == event) len += evt.cards.length; + }); + if (len > Math.max(0, player.hp) && player.maxHp < 9) { + player.gainMaxHp(); + } + }, + subSkill: { + draw: { + audio: "dcaishou", + trigger: { player: "phaseJieshuBegin" }, + frequent: function (event, player) { + return player.maxHp > 1; + }, + prompt2: function (event, player) { + return "摸" + get.cnNumber(player.maxHp) + "张牌,称为“隘”"; + }, + check: function (event, player) { + return player.maxHp > 1; + }, + content: function () { + player.draw(player.maxHp).gaintag = ["dcaishou_tag"]; + }, + }, + lose: { + audio: "dcaishou", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + locked: false, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + var evt = event.getl(player); + if (!evt || !evt.hs || !evt.hs.length || player.hasCard(card => card.hasGaintag("dcaishou_tag"), "h")) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dcaishou_tag")) return true; + } + return false; + } + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcaishou_tag")) return true; + } + return false; + }); + }, + content: function () { + player.loseMaxHp(); + }, + }, + }, + }, + dcsaowei: { + audio: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return event.player != player && event.card.name == "sha" && event.targets.length && !event.targets.includes(player) && event.targets.every(current => player.inRange(current) && current.isIn()) && player.hasCard(card => card.hasGaintag("dcaishou_tag"), "h"); + }, + direct: true, + content: function () { + "step 0"; + player.chooseCardTarget({ + position: "hs", + prompt: get.prompt("dcsaowei"), + prompt2: "将一张“隘”当做【杀】对" + get.translation(trigger.targets) + "使用", + targets: trigger.targets, + filterCard: function (card, player) { + if (get.itemtype(card) == "card" && !card.hasGaintag("dcaishou_tag")) return false; + return _status.event.targets.every(current => player.canUse(get.autoViewAs({ name: "sha" }, [card]), current, false)); + }, + filterTarget: function (card, player, target) { + if (!_status.event.targets.includes(target)) return false; + card = get.autoViewAs({ name: "sha" }, [card]); + return lib.filter.filterTarget.apply(this, arguments); + }, + selectTarget: -1, + ai1: function (card) { + var player = _status.event.player; + if (player.isHealthy() && player.hasSkill("dcaishou") && player.countCards("h", card => card.hasGaintag("dcaishou_tag") == 1)) return 0; + var eff = 0; + for (var target of _status.event.targets) { + eff += get.effect(target, get.autoViewAs({ name: "sha" }, [card]), player, player); + } + if (eff > 0) return 6.5 + eff / 10 - get.value(card); + return 0; + }, + ai2: () => 1, + }); + "step 1"; + if (result.bool) { + var cards = result.cards, + targets = result.targets; + event.cards = cards; + var next = player.useCard({ name: "sha" }, cards, targets, false, "dcsaowei"); + player + .when("useCardAfter") + .filter(event => event == next) + .then(() => { + if (player.hasHistory("sourceDamage", evt => evt.card == trigger.card)) { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) player.gain(cards, "gain2"); + } + }); + } + }, + }, + //向朗 + dckanji: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return player.countCards("h"); + }, + content: function () { + "step 0"; + player.showHandcards(); + "step 1"; + var suits = []; + player.getCards("h", card => suits.add(get.suit(card))); + if (suits.length == player.countCards("h")) { + player.draw(2); + event.suitsLength = suits.length; + player.addTempSkill("dckanji_check"); + } + }, + subSkill: { + check: { + trigger: { player: "gainAfter" }, + filter: function (event, player) { + if (event.getParent(2).name != "dckanji") return false; + var len = event.getParent(2).suitsLength; + var suits = []; + player.getCards("h", card => suits.add(get.suit(card))); + return suits.length >= 4 && len < 4; + }, + charlotte: true, + forced: true, + popup: false, + content: function () { + player.skip("phaseDiscard"); + game.log(player, "跳过了", "#y弃牌阶段"); + }, + }, + }, + ai: { + order: 9, + result: { + player: function (player, target) { + var count = player.countCards("h"); + if (count > 4) return false; + var suits = []; + player.getCards("h", card => suits.add(get.suit(card))); + return suits.length == count ? 1 : 0; + }, + }, + }, + }, + dcqianzheng: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + usable: 2, + filter: function (event, player) { + return event.player != player && (get.type(event.card) == "trick" || event.card.name == "sha") && player.countCards("he") > 1; + }, + async cost(event, trigger, player) { + const str = ",若重铸的牌中没有" + get.translation(get.type2(trigger.card)) + "牌,你于" + get.translation(trigger.cards) + "进入弃牌堆后获得之"; + event.result = await player + .chooseCard(get.prompt("dcqianzheng"), "重铸两张牌" + (trigger.cards.length ? str : "") + "。", 2, "he", lib.filter.cardRecastable) + .set("ai", card => { + var val = get.value(card); + if (get.type2(card) == _status.event.type) val += 0.5; + return 6 - val; + }) + .set("type", get.type2(trigger.card)) + .forResult(); + }, + async content(event, trigger, player) { + if (event.cards.every(card => get.type2(card) != get.type2(trigger.card))) { + trigger.getParent().dcqianzheng = true; + player.addTempSkill("dcqianzheng_gain"); + } + await player.recast(event.cards); + }, + subSkill: { + gain: { + trigger: { global: "cardsDiscardAfter" }, + filter: function (event, player) { + var evt = event.getParent(); + if (evt.name != "orderingDiscard") return false; + return evt.relatedEvent.dcqianzheng && event.cards.filterInD("d").length; + }, + charlotte: true, + forced: true, + popup: false, + content: function () { + player.gain(trigger.cards.filterInD("d"), "gain2"); + }, + }, + }, + }, + //秦朗 + dchaochong: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return player.getHandcardLimit() != player.countCards("h"); + }, + direct: true, + locked: false, + content: function () { + "step 0"; + var del = player.getHandcardLimit() - player.countCards("h"); + event.delta = del; + if (del > 0) { + player.chooseBool(get.prompt("dchaochong"), "摸" + get.cnNumber(Math.min(5, del)) + "张牌,然后令你的手牌上限-1").set("ai", () => { + var player = _status.event.player; + if (player.isPhaseUsing() && player.hasCard(cardx => player.hasUseTarget(cardx) && player.hasValueTarget(cardx), "hs")) return false; + return true; + }); + } else if (del < 0) { + player + .chooseToDiscard(get.prompt("dchaochong"), "弃置" + get.cnNumber(-del) + "张手牌,然后令你的手牌上限+1", -del) + .set("ai", card => { + var player = _status.event.player; + if (player.isPhaseUsing() && player.hasCard(cardx => player.hasValueTarget(cardx), "hs")) return 6 - player.getUseValue(card); + return 5 - get.value(card); + }) + .set("logSkill", "dchaochong"); + } + "step 1"; + if (result.bool) { + if (event.delta > 0) { + player.logSkill("dchaochong"); + player.draw(Math.min(5, event.delta)); + lib.skill.dchaochong.change(player, -1); + } else if (event.delta < 0) { + lib.skill.dchaochong.change(player, 1); + } + } + }, + change: function (player, num) { + if (typeof player.storage.dchaochong !== "number") player.storage.dchaochong = 0; + if (!num) return; + player.storage.dchaochong += num; + player.markSkill("dchaochong"); + game.log(player, "的手牌上限", "#g" + (num > 0 ? "+" : "") + num); + }, + markimage: "image/card/handcard.png", + intro: { + content: function (storage, player) { + var num = player.storage.dchaochong; + return "手牌上限" + (num >= 0 ? "+" : "") + num; + }, + }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("dchaochong"); + }, + }, + ai: { threaten: 2.2 }, + }, + dcjinjin: { + audio: 2, + trigger: { + source: "damageSource", + player: "damageEnd", + }, + usable: 2, + logTarget: "source", + check: function (event, player) { + if (typeof player.storage.dchaochong != "number" || player.storage.dchaochong == 0) return true; + var evt = event.getParent("useCard"); + if (evt && evt.player == player && event.source == player) return false; + if (player.isPhaseUsing() && player.storage.dchaochong == -1) return true; + return Math.abs(player.storage.dchaochong) >= 2; + }, + prompt2: function (event, player) { + var str = ""; + if (typeof player.storage.dchaochong == "number" && player.storage.dchaochong != 0) { + str += "重置因〖佞宠〗增加或减少的手牌上限,"; + } + var num = Math.abs(player.countMark("dchaochong")) || 1; + if (event.source && event.source.isIn()) { + str += "令伤害来源弃置至多" + get.cnNumber(num) + "张牌,然后你摸" + num + "-X张牌(X为其弃置的牌数)"; + } else str += "你摸" + get.cnNumber(num) + "张牌"; + return str; + }, + content: function () { + "step 0"; + var del = Math.abs(player.countMark("dchaochong")) || 1; + event.delta = del; + player.storage.dchaochong = 0; + if (player.hasSkill("dchaochong", null, false, false)) player.markSkill("dchaochong"); + game.log(player, "重置了手牌上限"); + if (trigger.source && trigger.source.isIn()) { + trigger.source + .chooseToDiscard(get.translation(player) + "对你发动了【矜谨】", "弃置至多" + get.cnNumber(del) + "张牌,然后" + get.translation(player) + "摸" + del + "-X张牌(X为你弃置的牌数)。", [1, del], "he") + .set("ai", card => { + if (_status.event.goon) return 5.5 - get.value(card); + return 0; + }) + .set("goon", get.attitude(trigger.source, player) < 0); + } + "step 1"; + var num = event.delta; + if (result.bool) num -= result.cards.length; + if (num > 0) player.draw(num); + }, + ai: { + combo: "dchaochong", + maixie: true, + maixie_hp: true, + threaten: 0.85, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 0; + if (typeof target.storage.dcninchong == "number") num = Math.abs(target.storage.dcninchong); + if (num <= 0) return; + return [1, Math.min(1, num / 3)]; + } + }, + }, + }, + }, + //二傅 + dcxuewei: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("dcxuewei"), (card, player, target) => { + return target.hp <= player.hp; + }) + .set("ai", target => { + var player = _status.event.player; + return get.effect(target, { name: "tao" }, player, player) + 0.1; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcxuewei", target); + player.addTempSkill("dcxuewei_shelter", { player: "phaseBegin" }); + player.markAuto("dcxuewei_shelter", [target]); + } + }, + ai: { threaten: 1.1 }, + subSkill: { + shelter: { + audio: "dcxuewei", + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + return player.getStorage("dcxuewei_shelter").includes(event.player); + }, + charlotte: true, + forced: true, + onremove: true, + logTarget: "player", + marktext: "卫", + intro: { content: "保护对象:$" }, + content: function () { + "step 0"; + trigger.cancel(); + "step 1"; + player.loseHp(); + if (trigger.player != player) game.asyncDraw([player, trigger.player]); + else player.draw("nodelay"); + "step 2"; + game.delayx(); + }, + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.player && arg.player.hasSkillTag("jueqing", false, player)) return false; + return true; + }, + }, + }, + }, + }, + dcyuguan: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + var num = player.getDamagedHp(); + if (num == 0) return false; + return !game.hasPlayer(current => { + return current.getDamagedHp() > num; + }); + }, + check: function (event, player) { + var num = player.getDamagedHp() - 1; + if (num <= 0) return false; + return game.hasPlayer(target => { + return get.attitude(player, target) > 0 && target.maxHp - target.countCards("h") > 1; + }); + }, + content: function () { + "step 0"; + player.loseMaxHp(); + "step 1"; + var num = player.getDamagedHp(); + if (!player.isIn() || !num) event.finish(); + else + player.chooseTarget("御关:令至多" + get.cnNumber(num) + "名角色将手牌摸至体力上限", Math.min(game.countPlayer(), [1, num]), true).set("ai", target => { + return get.attitude(_status.event.player, target) * Math.max(0.1, target.maxHp - target.countCards("h")); + }); + "step 2"; + if (result.bool) { + var targets = result.targets.sortBySeat(_status.currentPhase); + player.line(targets); + for (var target of targets) { + target.drawTo(target.maxHp); + } + } + }, + }, + //郑浑 + dcqiangzhi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + if (target == player) return false; + return target.countDiscardableCards(player, "he") + player.countDiscardableCards(player, "he") >= 3; + }, + content: function () { + "step 0"; + var dialog = []; + dialog.push("强峙:弃置你与" + get.translation(target) + "的共计三张牌"); + if (player.countCards("h")) dialog.addArray(['
    你的手牌
    ', player.getCards("h")]); + if (player.countCards("e")) dialog.addArray(['
    你的装备
    ', player.getCards("e")]); + if (target.countCards("h")) { + dialog.add('
    ' + get.translation(target) + "的手牌
    "); + if (player.hasSkillTag("viewHandcard", null, target, true)) dialog.push(target.getCards("h")); + else dialog.push([target.getCards("h"), "blank"]); + } + if (target.countCards("e")) dialog.addArray(['
    ' + get.translation(target) + "的装备
    ", target.getCards("e")]); + player + .chooseButton(3, true) + .set("createDialog", dialog) + .set("filterButton", button => { + if (!lib.filter.canBeDiscarded(button.link, _status.event.player, get.owner(button.link))) return false; + return true; + }) + .set("filterOk", () => { + return ui.selected.buttons.length == 3; + }) + .set("ai", button => { + var player = _status.event.player; + var target = _status.event.getParent().target; + var card = button.link; + if (get.owner(card) == player) { + if (_status.event.damage) return 15 - get.value(card); + if (player.hp >= 3 || get.damageEffect(player, target, player) >= 0 || (player.hasSkill("dcpitian") && player.getHandcardLimit() - player.countCards("h") >= 1 && player.hp > 1)) return 0; + if (ui.selected.buttons.length == 0) return 10 - get.value(card); + return 0; + } else { + if (_status.event.damage) return 0; + return -(get.sgnAttitude(player, target) || 1) * get.value(card); + } + }) + .set( + "damage", + get.damageEffect(target, player, player) > 10 && + player.countCards("he", card => { + return lib.filter.canBeDiscarded(card, player, player) && get.value(card) < 5; + }) >= 3 + ); + "step 1"; + if (result.bool) { + var links = result.links; + var list1 = [], + list2 = []; + event.players = [player, target]; + for (var card of links) { + if (get.owner(card) == player) list1.push(card); + else list2.push(card); + } + if (list1.length && list2.length) { + game.loseAsync({ + lose_list: [ + [player, list1], + [target, list2], + ], + discarder: player, + }).setContent("discardMultiple"); + event.finish(); + } else if (list2.length) target.discard(list2); + else player.discard(list1); + if (list2.length >= 3) event.players.reverse(); + } else event.finish(); + "step 2"; + event.players[0].line(event.players[1]); + event.players[1].damage(event.players[0]); + }, + ai: { + expose: 0.2, + order: 4, + result: { + target: function (player, target) { + return (get.effect(target, { name: "guohe_copy2" }, player, target) / 2) * (target.countDiscardableCards(player, "he") >= 2 ? 1.25 : 1) + get.damageEffect(target, player, target) / 3; + }, + }, + }, + }, + dcpitian: { + audio: 2, + trigger: { + player: ["loseAfter", "damageEnd"], + global: "loseAsyncAfter", + }, + forced: true, + locked: false, + group: "dcpitian_draw", + filter: function (event, player) { + if (event.name == "damage") return true; + return event.type == "discard" && event.getl(player).cards2.length > 0; + }, + content: function () { + player.addMark("dcpitian_handcard", 1, false); + player.addSkill("dcpitian_handcard"); + game.log(player, "的手牌上限", "#y+1"); + }, + subSkill: { + draw: { + audio: "dcpitian", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h") < player.getHandcardLimit(); + }, + prompt2: function (event, player) { + return "摸" + get.cnNumber(Math.min(5, player.getHandcardLimit() - player.countCards("h"))) + "张牌,重置因〖辟田〗增加的手牌上限"; + }, + check: function (event, player) { + return player.getHandcardLimit() - player.countCards("h") > Math.min(2, player.hp - 1); + }, + content: function () { + "step 0"; + var num = Math.min(5, player.getHandcardLimit() - player.countCards("h")); + if (num > 0) player.draw(num); + "step 1"; + player.removeMark("dcpitian_handcard", player.countMark("dcpitian_handcard"), false); + game.log(player, "重置了", "#g【辟田】", "增加的手牌上限"); + }, + }, + handcard: { + markimage: "image/card/handcard.png", + intro: { + content: function (storage, player) { + return "手牌上限+" + storage; + }, + }, + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("dcpitian_handcard"); + }, + }, + }, + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "discard")) return 0.9; + if (get.tag(card, "damage")) return 0.95; + }, + }, + }, + }, + //新服二赵 + dcqingren: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + return player.hasHistory("useSkill", evt => ["yizan_use", "yizan_use_backup"].includes(evt.sourceSkill || evt.skill)); + }, + content: function () { + player.draw(player.getHistory("useSkill", evt => ["yizan_use", "yizan_use_backup"].includes(evt.sourceSkill || evt.skill)).length); + }, + ai: { + combo: "yizan_use", + }, + }, + dclongyuan: { + audio: "xinfu_longyuan", + forced: true, + unique: true, + juexingji: true, + trigger: { + global: "phaseEnd", + }, + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { + return player.countMark("yizan_use") >= 3; + }, + content: function () { + player.awakenSkill("dclongyuan"); + player.draw(2); + player.recover(); + player.storage.yizan = true; + }, + derivation: "yizan_rewrite", + ai: { + combo: "yizan_use", + }, + }, + //黄皓 + dcqinqing: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + var zhu = game.filterPlayer(current => current.getSeatNum() == 1)[0]; + if (!zhu || !zhu.isIn()) return false; + return game.hasPlayer(current => { + return current != player && current.inRange(zhu); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("dcqinqing"), function (card, player, target) { + var zhu = game.filterPlayer(current => current.getSeatNum() == 1)[0]; + return target != player && target.inRange(zhu) && target.countDiscardableCards(player, "he") > 0; + }) + .set("ai", function (target) { + var zhu = game.filterPlayer(current => current.getSeatNum() == 1)[0]; + var he = target.countCards("he"); + if (get.attitude(_status.event.player, target) > 0) { + if (target.countCards("h") > zhu.countCards("h") + 1) return 0.1; + } else { + if (he > zhu.countCards("h") + 1) return 2; + if (he > 0) return 1; + } + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dcqinqing", target); + if (target.countCards("he")) player.discardPlayerCard(target, "he", true); + } else { + event.finish(); + } + "step 2"; + var zhu = game.filterPlayer(current => current.getSeatNum() == 1)[0]; + if (zhu && zhu.isIn()) { + if (target.countCards("h") > zhu.countCards("h")) player.draw(); + } + }, + }, + dccunwei: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + return player != event.player && get.type2(event.card) == "trick" && (event.targets.length == 1 || player.countCards("he") > 0); + }, + content: function () { + if (trigger.targets.length == 1) player.draw(); + else if (player.countCards("he") > 0) player.chooseToDiscard("he", true, "存畏:请弃置一张牌"); + }, + ai: { + halfneg: true, + }, + }, + //刘辟 + dcjuying: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return ( + player.getCardUsable("sha", true) > + player.getHistory("useCard", evt => { + return evt.getParent("phaseUse") == event && evt.card.name == "sha" && evt.addCount !== false; + }).length + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseButton([ + get.prompt("dcjuying"), + [ + [ + ["sha", "你于下回合使用【杀】的次数上限+1"], + ["hand", "本回合手牌上限+2"], + ["draw", "摸三张牌"], + ], + "textbutton", + ], + ]) + .set("ai", function (button) { + var player = _status.event.player, + choice = button.link; + if (choice == "draw") return 10; + if (choice == "sha") return 9; + var del = 3 - player.hp; + if (choice == "hand" && player.needsToDiscard() > 0 && del <= 0) return 8; + return 0; + }) + .set("selectButton", [1, 3]); + "step 1"; + if (result.bool) { + player.logSkill("dcjuying"); + var choices = result.links; + event.choices = choices; + if (choices.includes("sha")) { + player.addMark("dcjuying_sha", 1, false); + player.addSkill("dcjuying_sha"); + } + if (choices.includes("hand")) { + player.addMark("dcjuying_hand", 1, false); + player.addTempSkill("dcjuying_hand"); + } + if (choices.includes("draw")) { + player.draw(3); + } + } else event.finish(); + "step 2"; + var num = event.choices.length - Math.max(0, player.hp); + if (num > 0) { + player.chooseToDiscard(true, "he"); + } + }, + ai: { + effect: { + player_use: function (card, player, target) { + if (typeof card == "object" && player.isPhaseUsing() && card.name == "sha" && player.getCardUsable("sha") == 1) return "zeroplayertarget"; + }, + target_use: function (card, player, target) { + if (card.name == "jiu" && player.getCardUsable("sha") == 2) return [1, 1]; + }, + }, + }, + subSkill: { + sha: { + trigger: { player: "phaseBegin" }, + filter: function (event, player) { + return player.countMark("dcjuying_sha") > 0; + }, + silent: true, + firstDo: true, + charlotte: true, + onremove: true, + content: function () { + player.addMark("dcjuying_effect", player.countMark("dcjuying_sha"), false); + player.addTempSkill("dcjuying_effect"); + player.removeSkill("dcjuying_sha"); + }, + intro: { content: "下回合使用【杀】的次数上限+#" }, + }, + effect: { + onremove: true, + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("dcjuying_effect"); + }, + }, + intro: { content: "本回合使用【杀】的次数上限+#" }, + }, + hand: { + onremove: true, + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + 2 * player.countMark("dcjuying_hand"); + }, + }, + }, + }, + }, + //新服加强魏贾诩 + dcjianshu: { + audio: "jianshu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", { color: "black" }) > 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; + }, + targetprompt: ["发起者", "拼点目标"], + filterCard: { color: "black" }, + 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, + multitarget: true, + content: function () { + "step 0"; + player.give(cards, targets[0], "give"); + "step 1"; + targets[0].chooseToCompare(targets[1]); + "step 2"; + player.addTempSkill("dcjianshu_check", "phaseUseAfter"); + if (result.bool) { + var cards = targets[0].getCards("he", function (card) { + return lib.filter.cardDiscardable(card, targets[0], "dcjianshu"); + }); + if (cards.length > 0) targets[0].discard(cards.randomGet()); + targets[1].loseHp(); + } else if (result.tie) { + targets[0].loseHp(); + targets[1].loseHp(); + } else { + var cards = targets[1].getCards("he", function (card) { + return lib.filter.cardDiscardable(card, targets[1], "dcjianshu"); + }); + if (cards.length > 0) targets[1].discard(cards.randomGet()); + targets[0].loseHp(); + } + }, + subSkill: { + check: { + trigger: { global: "dieAfter" }, + charlotte: true, + forced: true, + popup: false, + filter: function (event, player) { + return event.getParent(3).name == "dcjianshu"; + }, + content: function () { + delete player.getStat("skill").dcjianshu; + }, + }, + }, + ai: { + expose: 0.4, + order: 4, + result: { + target: function (player, target) { + if (ui.selected.targets.length) return -1; + return -0.5; + }, + }, + }, + }, + dcyongdi: { + audio: "yongdi", + audioname: ["xinping"], + unique: true, + limited: true, + enable: "phaseUse", + filterTarget: function (card, player, target) { + return target.hasSex("male"); + }, + animationColor: "thunder", + skillAnimation: "legend", + mark: true, + intro: { + content: "limited", + }, + content: function () { + "step 0"; + player.awakenSkill("dcyongdi"); + //player.logSkill('dcyongdi',target); + if (!game.hasPlayer(current => current.maxHp < target.maxHp)) { + target.gainMaxHp(); + } + "step 1"; + if (target.isMinHp()) { + target.recover(); + } + "step 2"; + if (target.isMinHandcard()) { + target.draw(Math.min(5, target.maxHp)); + } + "step 3"; + game.delayx(); + }, + ai: { + expose: 0.3, + order: 1, + result: { + target: function (player, target) { + var val = 0; + var bool1 = !game.hasPlayer(current => current.maxHp < target.maxHp), + bool2 = target.isMinHp(), + bool3 = target.isMinHandcard(); + if (bool1) val += 6.5; + if (bool2) { + if (bool1) target.maxHp++; + val += Math.max(0, get.recoverEffect(target, player, player)); + if (bool1) target.maxHp--; + } + if (bool3) { + var num = Math.max(0, Math.min(5, target.maxHp + (bool1 ? 1 : 0))); + val += 5 * num; + } + return val; + }, + }, + }, + }, + //雷普 + dcsilve: { + audio: 2, + trigger: { + player: "enterGame", + global: "phaseBefore", + }, + forced: true, + locked: false, + direct: true, + onremove: ["dcsilve", "dcsilve_self"], + filter: function (event, player) { + return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + player + .chooseTarget("私掠:请选择一名其他角色", "选择一名其他角色(暂时仅你可见),称为“私掠”角色,且你获得后续效果", true, (card, player, target) => { + return target != player && !player.getStorage("dcsilve").includes(target); + }) + .set("ai", target => { + var att = get.attitude(_status.event.player, target); + if (att > 0) return att + 1; + if (att == 0) return Math.random(); + return att; + }) + .set("animate", false); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcsilve"); + player.markAuto("dcsilve", [target]); + player.addSkill("dcsilve_rob"); + player.addSkill("dcsilve_revenge"); + target.addSkill("dcsilve_target"); + if (!target.storage.dcsilve_target) target.storage.dcsilve_target = []; + target.storage.dcsilve_target.push(player); + } + }, + subSkill: { + rob: { + audio: "dcsilve", + trigger: { global: "damageSource" }, + filter: function (event, player) { + if (!player.getStorage("dcsilve").includes(event.source)) return false; + if (!event.player.isIn() || event.player == player) return false; + if (player.getStorage("dcsilve_robbed").includes(event.player)) return false; + return event.player.countCards("he") > 0; + }, + charlotte: true, + prompt2: function (event, player) { + return "获得" + get.translation(event.player) + "一张牌"; + }, + logTarget: "player", + content: function () { + player.addTempSkill("dcsilve_robbed"); + player.markAuto("dcsilve_self", [trigger.player]); + if (trigger.player.countGainableCards(player, "he") > 0) { + player.markAuto("dcsilve_robbed", [trigger.player]); + player.gainPlayerCard(trigger.player, "he", true); + } + if (trigger.source && trigger.source != player) trigger.source.markSkill("dcsilve_target"); + }, + }, + revenge: { + audio: "dcsilve", + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (!player.getStorage("dcsilve").includes(event.player)) return false; + if (!event.player.isIn() || !event.source || !event.source.isIn() || event.source == player) return false; + return true; + }, + forced: true, + locked: false, + charlotte: true, + direct: true, + content: function () { + "step 0"; + if (trigger.player && trigger.player != player) trigger.player.markSkill("dcsilve_target"); + player.markAuto("dcsilve_self", [trigger.player]); + player + .chooseToUse("私掠:对" + get.translation(trigger.source) + "使用一张【杀】,或弃置一张手牌", function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }) + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if (target != _status.event.source && !ui.selected.targets.includes(_status.event.source)) return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("source", trigger.source) + .set("logSkill", "dcsilve_revenge"); + "step 1"; + if (!result.bool) { + if (player.countCards("h") > 0) player.chooseToDiscard("h", true).set("logSkill", "dcsilve_revenge"); + } + }, + }, + self: { + marktext: "私", + intro: { + name: "私掠", + content: function (storage, player) { + if (!storage || !storage.length) return "没有打劫对象"; + if (storage[0] == player) return "已绑定" + get.translation(player) + "自己"; + return "打劫对象:" + get.translation(storage); + }, + }, + }, + target: { + marktext: "掠", + intro: { + name: "私掠", + content: function (storage, player) { + return "被" + get.translation(storage) + "盯上了!"; + }, + }, + }, + robbed: { onremove: true, charlotte: true }, + }, + }, + dcshuaijie: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + var targets = player.getStorage("dcsilve").filter(i => i.isIn()); + if (!targets.length) return true; + return ( + targets.filter(target => { + return player.hp > target.hp && player.countCards("e") > target.countCards("e"); + }).length == targets.length + ); + }, + content: function () { + "step 0"; + player.awakenSkill("dcshuaijie"); + player.loseMaxHp(); + var choices = []; + var choiceList = ["获得“私掠”角色至多三张牌", "从牌堆中获得三张类型各不相同的牌"]; + var targets = player.getStorage("dcsilve").filter(i => i.isIn()); + event.targets = targets; + if (targets.length) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + choices.push("选项二"); + player + .chooseControl(choices) + .set("prompt", "衰劫:选择一项") + .set("choiceList", choiceList) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var eff = 0; + for (var target of targets) { + eff += get.effect(target, { name: "shunshou_copy2" }, player, player) * 2; + } + eff -= get.effect(player, { name: "dongzhuxianji" }, player, player); + return eff > 0 && choices.includes("选项一") ? "选项一" : "选项二"; + })() + ); + "step 1"; + if (result.control == "选项一") { + if (targets.length) { + for (var target of targets) { + if (target.countGainableCards(player, "he") > 0) { + player.line(target); + player.gainPlayerCard(target, "he", true, [1, 3]); + } + } + } + } else { + var cards = []; + for (var i = 0; i < 3; i++) { + var card = get.cardPile(cardx => { + return cards.filter(cardxx => get.type2(cardxx) == get.type2(cardx)).length == 0; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + } + "step 2"; + var targets = player.getStorage("dcsilve").filter(i => i.isIn()); + for (var target of targets) { + target.unmarkAuto("dcsilve_target", [player]); + } + delete player.storage.dcsilve; + delete player.storage.dcsilve_self; + player.markAuto("dcsilve", [player]); + player.markAuto("dcsilve_self", [player]); + }, + ai: { + combo: "dcsilve", + order: 8, + result: { + player: function (player) { + var targets = player.getStorage("dcsilve").filter(i => i.isIn()); + if (!targets.length) return 1; + var att = 0; + targets.forEach(i => (att += get.attitude(player, i))); + if (att < 0) return 1; + return 0; + }, + }, + }, + }, + //庞会 + dcyiyong: { + audio: 2, + trigger: { + source: "damageBegin1", + }, + //usable:2, + filter: function (event, player) { + return player.countDiscardableCards(player, "he") > 0 && player != event.player; + }, + check: function (event, player) { + return get.attitude(player, event.player) < 0 && player.countCards("he", card => lib.filter.cardDiscardable(card, player, "dcyiyong") && get.value(card, player) < 7) > 0; + }, + logTarget: "player", + content: function () { + "step 0"; + event.list = [player]; + event.cards0 = []; + event.cards1 = []; + if (trigger.player.countDiscardableCards(trigger.player, "he") > 0) { + event.list.push(trigger.player); + } + if (!event.isMine() && !event.isOnline()) game.delayx(); + player + .chooseCardOL(event.list, "he", true, [1, Infinity], "异勇:弃置任意张牌", (card, player, target) => { + return lib.filter.cardDiscardable(card, player, "dcyiyong"); + }) + .set("ai", card => { + var evt = _status.event.getParent(2); + var source = evt.player, + player = _status.event.player, + target = evt.list[1]; + if (!target) return get.unuseful(card); + if (player == source) { + var total = 0, + need = 0; + target.countCards("he", card => { + if (lib.filter.cardDiscardable(card, target, "dcyiyong") && get.value(card) < 5) need += get.number(card); + }); + for (var i of ui.selected.cards) total += get.number(i); + if (total >= need + 5) return 0; + var val = 6; + if ( + target.hp <= 2 && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: evt.getTrigger().card, + }) + ) + val += 2 + get.number(card) / 5; + if (target.countCards("he", card => get.value(card) < 5) >= 3) val -= 3 + get.number(card) / 5; + return val - get.value(card); + } + if (ui.selected.cards.length > 1 && ui.selected.cards.length + 2 >= source.countCards("he")) return 0; + if ( + player.hp <= 2 && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: evt.getTrigger().card, + }) + ) + return 10 - get.value(card); + return 5 - get.value(card); + }); + "step 1"; + var lose_list = [], + cards = []; + for (var i = 0; i < result.length; i++) { + var current = event.list[i], + cards2 = result[i].cards; + cards.push(cards2); + event["cards" + i] = cards2; + event.cards = cards; + lose_list.push([current, cards2]); + } + game.loseAsync({ lose_list: lose_list }).setContent("discardMultiple"); + "step 2"; + var getn = function (cards) { + return cards.map(i => get.number(i, false)).reduce((p, c) => p + c, 0); + }; + var num0 = getn(event.cards0), + num1 = getn(event.cards1); + if (num0 <= num1) { + player.draw(event.cards1.length); + } + if (num0 >= num1) { + trigger.num++; + } + }, + }, + //乐就 + dccuijin: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + return (event.card.name == "sha" || event.card.name == "juedou") && (event.player == player || player.inRange(event.player)) && player.countCards("he") > 0; + }, + direct: true, + content: function () { + "step 0"; + if (player != game.me && !player.isOnline()) game.delayx(); + var target = trigger.player; + event.target = target; + player + .chooseToDiscard("he", get.prompt("dccuijin", target), "弃置一张牌并令" + get.translation(trigger.player) + "使用的" + get.translation(trigger.card) + "伤害+1,但若其未造成伤害,则你摸两张牌并对其造成1点伤害。") + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", lib.skill.cuijin.checkx(trigger, player)).logSkill = ["dccuijin", target]; + "step 1"; + if (result.bool) { + if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; + trigger.baseDamage++; + player.addSkill("dccuijin_damage"); + player.markAuto("dccuijin_damage", [trigger.card]); + if (!player.storage.dccuijin_map) player.storage.dccuijin_map = { cards: [], targets: [] }; + player.storage.dccuijin_map.cards.push(trigger.card); + player.storage.dccuijin_map.targets.push(trigger.targets.slice()); + } + }, + subSkill: { + damage: { + trigger: { + global: ["damage", "damageCancelled", "damageZero", "shaMiss", "useCardToExcluded", "useCardToEnd", "eventNeutralized", "useCardAfter", "shaCancelled"], + }, + forced: true, + silent: true, + firstDo: true, + charlotte: true, + onremove: true, + filter: function (event, player, name) { + if (!event.card) return false; + var cards = player.getStorage("dccuijin_damage"); + if (!cards.includes(event.card)) return false; + return true; + }, + content: function () { + "step 0"; + var card = trigger.card, + idx = player.storage.dccuijin_map.cards.indexOf(card); + if (event.triggername == "useCardAfter") { + var cards = player.getStorage("dccuijin_damage"); + cards = cards.remove(card); + if (!cards.length) { + player.removeSkill("dccuijin_damage"); + delete player.storage.dccuijin_map; + } else if (idx !== -1) { + player.storage.dccuijin_map.cards.splice(idx, 1); + player.storage.dccuijin_map.targets.splice(idx, 1); + } + event.finish(); + } else if (idx !== -1) { + var target, source; + if (trigger.name.indexOf("damage") == 0) { + target = trigger.player; + source = trigger.source; + } else { + target = trigger.target; + source = trigger.player; + } + if ( + player.storage.dccuijin_map.targets[idx].includes(target) && + !target.hasHistory("damage", evt => { + return evt.card == card; + }) + ) { + player.logSkill("dccuijin_damage", source); + player.storage.dccuijin_map.targets[idx].remove(target); + player.draw(2); + if (source && source.isIn()) { + player.line(trigger.player, "green"); + trigger.player.damage(); + } + } + } + "step 1"; + game.delayx(); + }, + }, + }, + }, + //陈矫 + dcxieshou: { + trigger: { + global: "damageEnd", + }, + usable: 1, + filter: function (event, player) { + return get.distance(player, event.player) <= 2 && event.player.isIn(); + }, + check: function (event, player) { + return get.attitude(player, event.player) > 4; + }, + locked: false, + logTarget: "player", + onremove: true, + change: function (player, num) { + player.addSkill("dcxieshoux"); + if (typeof player.storage.dcxieshoux !== "number") player.storage.dcxieshoux = 0; + if (!num) return; + player.storage.dcxieshoux += num; + if (player.storage.dcxieshoux != 0) player.markSkill("dcxieshoux"); + else player.unmarkSkill("dcxieshoux"); + game.log(player, "的手牌上限", (num > 0 ? "+" : "") + num); + }, + content: function () { + "step 0"; + lib.skill.dcxieshou.change(player, -1); + "step 1"; + var list = [], + target = trigger.player; + event.target = target; + var choiceList = ["回复1点体力", "复原,摸两张牌"]; + if (target.getDamagedHp() == 0) choiceList[0] = '' + choiceList[0] + ""; + else list.push("选项一"); + list.push("选项二"); + target + .chooseControl(list) + .set("choiceList", choiceList) + .set("prompt", get.translation(player) + "对你发动了【协守】,请选择一项"); + "step 2"; + if (result.control == "选项一") { + target.recover(); + } else { + target.link(false); + target.draw(2); + } + }, + ai: { + expose: 0.3, + }, + }, + dcxieshoux: { + markimage: "image/card/handcard.png", + intro: { + content: function (storage, player) { + var num = player.storage.dcxieshoux; + return "手牌上限" + (num >= 0 ? "+" : "") + num; + }, + }, + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + (player.storage.dcxieshoux || 0); + }, + }, + }, + dcqingyan: { + trigger: { + target: "useCardToTargeted", + }, + filter: function (event, player) { + return event.player != player && get.color(event.card) == "black"; + }, + usable: 2, + async cost(event, trigger, player) { + if (player.countCards("h") < player.hp) { + event.result = await player + .chooseBool(get.prompt("dcqingyan"), "将手牌摸至体力上限(摸" + get.cnNumber(player.maxHp - player.countCards("h")) + "张牌)") + .set("ai", () => 1) + .forResult(); + } else { + event.result = await player + .chooseToDiscard(get.prompt("dcqingyan"), "弃置一张手牌令你的手牌上限+1", "chooseonly") + .set("ai", card => 6 - get.value(card)) + .forResult(); + } + }, + async content(event, trigger, player) { + if (event.cards && event.cards.length) { + await player.discard(event.cards); + lib.skill.dcxieshou.change(player, 1); + } else { + player.drawTo(player.maxHp); + } + }, + }, + dcqizi: { + mod: { + cardSavable: function (card, player, target) { + if (get.distance(player, target) > 2 && card.name == "tao" && target == _status.event.dying) return false; + }, + }, + ai: { + neg: true, + }, + }, + //公孙度 + dczhenze: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + direct: true, + content: function () { + "step 0"; + var getCond = player => Math.sign(player.countCards("h") - Math.max(0, player.hp)); + var me = getCond(player); + var recovers = game.filterPlayer(current => getCond(current) == me), + loses = game.filterPlayer().removeArray(recovers); + event.recovers = recovers; + event.loses = loses; + var list = []; + if (loses.length) list.push("选项一"); + if (recovers.length) list.push("选项二"); + list.push("cancel2"); + var sign = [ + ["≥", "<"], + ["≠", "="], + ["≤", ">"], + ]; + var choiceList = ["令所有手牌数" + sign[me + 1][0] + "体力值的角色失去1点体力" + (loses.length ? "(" + get.translation(loses) + ")" : ""), "令所有手牌数" + sign[me + 1][1] + "体力值的角色回复1点体力" + (recovers.length ? "(" + get.translation(recovers) + ")" : "")]; + if (!loses.length) choiceList[0] = '' + choiceList[0] + ""; + if (!recovers.length) choiceList[1] = '' + choiceList[1] + ""; + player + .chooseControl(list) + .set("choiceList", choiceList) + .set("prompt", get.prompt("dczhenze")) + .set("ai", () => _status.event.choice) + .set( + "choice", + (() => { + var effect = 0; + if (list.length == 2) { + if (list.includes("选项一")) { + loses.forEach(i => (effect += get.effect(i, { name: "losehp" }, player, player))); + if (effect > 0) return "选项一"; + } else { + recovers.forEach(i => (effect += get.recoverEffect(i, player, player))); + if (effect > 0) return "选项二"; + } + } else { + loses.forEach(i => (effect += get.effect(i, { name: "losehp" }, player, player))); + recovers.forEach(i => (effect += get.recoverEffect(i, player, player))); + if (effect > 0) return "选项二"; + return "选项一"; + } + })() + ); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + } else { + var lose = result.control == "选项一", + targets = event[lose ? "loses" : "recovers"]; + player.logSkill("dczhenze", targets); + for (var i of targets) { + i[lose ? "loseHp" : "recover"](); + } + } + }, + }, + dcanliao: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if ((player.getStat().skill.dcanliao || 0) >= game.countPlayer(current => current.group == "qun")) return false; + return true; + }, + filterTarget: function (card, player, target) { + return target.countCards("he"); + }, + content: function () { + "step 0"; + player + .choosePlayerCard(target, "he", true) + .set("filterButton", function (button) { + var card = button.link, + owner = get.owner(card); + return !owner || owner.canRecast(card, _status.event.player); + }) + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().target) >= 0) return -get.buttonValue(card); + return get.buttonValue(card); + }); + "step 1"; + if (result.bool) target.recast(result.links); + }, + ai: { + expose: 0.1, + result: { + target: function (player, target) { + if (target.hasCard(card => get.value(card) >= 6, "e") && get.attitude(player, target) < 0) return -1; + return 1; + }, + }, + }, + }, + //王烈 + dcchongwang: { + audio: 2, + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + if (player == event.player) return false; + var type = get.type(event.card); + if (type != "basic" && type != "trick") return false; + var history = game.getAllGlobalHistory("useCard"); + var index = history.indexOf(event); + if (index > 0) return history[index - 1].player == player; + return false; + }, + content: function () { + "step 0"; + var source = trigger.player; + var list = [["exclude", "令" + get.translation(trigger.card) + "无效"]]; + var cards = trigger.cards.filterInD(); + if (source.isIn() && cards.length > 0) list.push(["gain", "令" + get.translation(source) + "收回" + get.translation(cards)]); + player.chooseButton([get.prompt("dcchongwang", source), [list, "textbutton"], "noforcebutton"]).set("ai", function (button) { + var player = _status.event.player, + choice = button.link; + var evt = _status.event.getTrigger(); + if (choice == "exclude") { + var effect = 0; + if (!evt.targets.length && get.info(evt.card, false).notarget) effect -= get.effect(evt.player, evt.card, evt.player, player); + for (var i of evt.targets) { + effect -= get.effect(i, evt.card, evt.player, player); + } + return effect; + } else { + var cards = evt.cards.filterInD(); + return get.value(cards, evt.player) * get.attitude(player, evt.player); + } + }); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + "step 2"; + if (result.bool) { + player.logSkill("dcchongwang", trigger.player); + if (result.links[0] == "gain") { + player.addTempSkill("dcchongwang_gain"); + trigger._dcchongwang = true; + } else { + trigger.targets.length = 0; + trigger.all_excluded = true; + game.log(trigger.card, "被无效了"); + } + } + }, + ai: { + threaten: 3.5, + directHit_ai: true, + }, + subSkill: { + gain: { + trigger: { global: "useCardAfter" }, + charlotte: true, + forced: true, + popup: false, + filter: function (event, player) { + return event._dcchongwang; + }, + content: function () { + trigger.player.gain(trigger.cards.filterInD(), "gain2"); + }, + }, + }, + }, + dchuagui: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he") > 0; + }); + }, + content: function () { + "step 0"; + var min = Math.max.apply( + Math, + game.filterPlayer().map(function (current) { + return 1 + current.getFriends().length; + }) + ); + var max = Math.min( + min, + game.countPlayer(function (current) { + return current != player && current.countCards("he") > 0; + }) + ); + player + .chooseTarget(get.prompt("dchuagui"), "令至多" + get.cnNumber(max) + "名角色进行囚徒困境选择", [1, max], function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("animate", false) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + player.logSkill("dchuagui"); + event.players = result.targets.slice(0); + event._global_waiting = true; + } else event.finish(); + "step 2"; + var send = function (source) { + var next = game.createEvent("dchuagui_choose", false); + next.player = game.me; + next.source = source; + next.setContent(lib.skill.dchuagui.contentx); + game.resume(); + }; + var sendback = function (result, player) { + if (!Array.isArray(result)) { + result = [Math.random() < 0.5 ? "仅展示牌" : "交出牌", player.getCards("he").randomGet()]; + } + event.results.push([player, result]); + }; + event.ai_targets = []; + event.results = []; + var players = game + .filterPlayer(function (current) { + return current != player; + }) + .sortBySeat(); + var time = 10000; + if (lib.configOL && lib.configOL.choose_timeout) time = parseInt(lib.configOL.choose_timeout) * 1000; + for (var i = 0; i < players.length; i++) { + players[i].showTimer(time); + if (!event.players.includes(players[i])) continue; + if (players[i].isOnline()) { + event.withol = true; + players[i].send(send, player); + players[i].wait(sendback); + } else if (players[i] == game.me) { + event.withme = true; + var next = game.createEvent("dchuagui_choose", false); + next.player = game.me; + next.source = player; + next.setContent(lib.skill.dchuagui.contentx); + if (_status.connectMode) game.me.wait(sendback); + } else { + event.ai_targets.push(players[i]); + } + } + if (event.ai_targets.length) { + event.ai_targets.randomSort(); + setTimeout(function () { + event.interval = setInterval( + function () { + var target = event.ai_targets.shift(); + var att = get.attitude(target, player), + hs = target.getCards("he"); + hs.sort((b, a) => get.value(b, target) - get.value(a, target)); + var choice = "仅展示牌", + card = hs[0]; + if (att < -2 && Math.random() > (get.value(card, target) - 3) / 5) choice = "交出牌"; + sendback([choice, card], target); + if (!event.ai_targets.length) { + clearInterval(event.interval); + if (event.withai) game.resume(); + } + }, + _status.connectMove ? 750 : 75 + ); + }, 500); + } + "step 3"; + if (event.withme) { + if (_status.connectMode) game.me.unwait(result, game.me); + else { + if (!Array.isArray(result)) { + result = [Math.random() < 0.5 ? "仅展示牌" : "交出牌", player.getCards("he").randomGet()]; + } + event.results.push([player, result]); + } + } + "step 4"; + if (event.withol && !event.resultOL) { + game.pause(); + } + "step 5"; + if (event.ai_targets.length > 0) { + event.withai = true; + game.pause(); + } + "step 6"; + delete event._global_waiting; + for (var i of game.players) i.hideTimer(); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (name, id, results) { + var dialog = ui.create.dialog(name + "发动了技能【化归】", "hidden", "forcebutton"); + dialog.videoId = id; + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + dialog.buttonss = []; + + var list = ["仅展示牌的玩家", "交出牌的玩家"]; + for (var i = 0; i < list.length; i++) { + dialog.add('
    ' + list[i] + "
    "); + var buttons = ui.create.div(".buttons", dialog.content); + dialog.buttonss.push(buttons); + buttons.classList.add("popup"); + buttons.classList.add("guanxing"); + } + dialog.open(); + + var getx = function () { + var item = results.shift(); + var card = item[1][1], + index = item[1][0] == "仅展示牌" ? 0 : 1; + var button = ui.create.button(card, "card", dialog.buttonss[index]); + button.querySelector(".info").innerHTML = (function (target) { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + })(item[0]); + if (results.length > 0) setTimeout(getx, 500); + }; + setTimeout(getx, 500); + }, + get.translation(player), + event.videoId, + event.results.slice(0) + ); + game.delay(0, 2000 + event.results.length * 500); + "step 7"; + game.broadcastAll("closeDialog", event.videoId); + var shown = [], + given = []; + for (var i of event.results) { + (i[1][0] == "仅展示牌" ? shown : given).push(i); + } + var list = given.length > 0 ? given : shown; + var cards = [], + targets = []; + for (var i of list) { + cards.push(i[1][1]); + targets.push(i[0]); + //i[0].$give(i[1][1],player); + } + player.line(targets); + player.gain(cards, "give"); + //step 8 + //game.delayx(); + }, + contentx: function () { + "step 0"; + event._global_waiting = true; + event.result = ["仅展示牌", player.getCards("he").randomGet()]; + var str = get.translation(source); + player + .chooseControl("仅展示牌", "交出牌") + .set("choiceList", ["仅展示一张牌。但如果所有人都选择了仅展示,则" + str + "获得这张牌", "将一张牌交给" + str]) + .set("_global_waiting", true); + "step 1"; + event.result[0] = result.control; + player.chooseCard("he", true).set("_global_waiting", true); + "step 2"; + event.result[1] = result.cards[0]; + }, + }, + //陈珪 + dcyingtu: { + audio: 2, + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + usable: 1, + getIndex(event, player) { + var targets = []; + if (lib.skill.dcyingtu.filterx(event, player, player.getNext())) targets.add(player.getNext()); + if (lib.skill.dcyingtu.filterx(event, player, player.getPrevious())) targets.add(player.getPrevious()); + return targets.sortBySeat(_status.currentPhase); + }, + filterx: function (event, player, target) { + var evt = event.getParent("phaseDraw"); + if (evt && target == evt.player) return false; + return ( + event.getg(target).length > 0 && + target.hasCard(function (card) { + return lib.filter.canBeGained(card, target, player); + }, "he") + ); + }, + logTarget(event, player, triggername, target) { + return target; + }, + check(event, player, triggername, source) { + var target = source == player.getNext() ? player.getPrevious() : player.getNext(); + return Math.min(0, get.attitude(player, target)) >= get.attitude(player, source); + }, + prompt2: "获得该角色的一张牌,然后将一张牌交给该角色的对位角色。若你给出的是装备牌,则其使用其得到的牌。", + content: function () { + "step 0"; + var target = event.targets[0]; + event.target = target; + event.side = target == player.getPrevious() ? "getNext" : "getPrevious"; + player.gainPlayerCard(target, true, "he"); + "step 1"; + var he = player.getCards("he"); + if (he.length > 0) { + var target = player[event.side](); + event.target = target; + if (he.length == 1) event._result = { bool: true, cards: he }; + else player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + player.line(target); + player.give(card, target); + } else event.finish(); + "step 3"; + if (target.getCards("h").includes(card) && get.type(card, null, target) == "equip" && target.canUse(card, target)) target.chooseUseTarget(card, true, "nopopup"); + }, + }, + dccongshi: { + audio: 2, + trigger: { global: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return get.type(event.card, null, false) == "equip" && event.player.isMaxEquip(); + }, + content: function () { + player.draw(); + }, + }, + //黄权 + dcquanjian: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return game.hasPlayer(current => current != player); + }, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("劝谏:令一名其他角色…", "hidden"); + dialog.add([ + [ + ["damage", "对其攻击范围内的一名角色造成1点伤害"], + ["draw", "将其手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌"], + ], + "textbutton", + ]); + return dialog; + }, + filter: function (button, player) { + return !player.hasSkill("dcquanjian_" + button.link, null, null, false); + }, + check: () => 1 + Math.random(), + backup: function (links) { + return get.copy(lib.skill["dcquanjian_" + links[0]]); + }, + prompt: function (links) { + if (links[0] == "damage") return "令一名其他角色对攻击范围内的另一名角色造成1点伤害"; + return "令一名其他角色将手牌数调整至手牌上限(至多摸至五张)且本回合内不能使用手牌"; + }, + }, + ai: { + order: 2, + result: { player: 1 }, + }, + subSkill: { + backup: { audio: "dcquanjian" }, + damage: { + audio: "dcquanjian", + selectTarget: 2, + filterTarget: function (card, player, target) { + if (!ui.selected.targets.length) return target != player; + return ui.selected.targets[0].inRange(target); + }, + complexTarget: true, + complexSelect: true, + filterCard: () => false, + selectCard: -1, + targetprompt: ["造成伤害", "受到伤害"], + multitarget: true, + content: function () { + "step 0"; + player.addTempSkill("dcquanjian_damage", "phaseUseAfter"); + targets[0] + .chooseControl() + .set("choiceList", ["对" + get.translation(targets[1]) + "造成1点伤害", "本回合下次受到的伤害+1"]) + .set("ai", function () { + return _status.event.eff >= 0 ? 0 : 1; + }) + .set("eff", get.damageEffect(targets[1], targets[0], targets[0])); + "step 1"; + if (result.index == 0) { + targets[1].damage(targets[0]); + } else { + target.addMark("dcquanjian_effect", 1, false); + target.addTempSkill("dcquanjian_effect"); + } + }, + ai: { + result: { + player: function (player, target) { + if (ui.selected.targets.length == 0) { + if (!game.hasPlayer(current => current.inRangeOf(target) && get.damageEffect(current, target, player) > 0)) return 0; + if (get.attitude(player, target) > 0) return 2; + return 1; + } + return get.damageEffect(target, ui.selected.targets[0], player, player); + }, + }, + }, + }, + draw: { + audio: "dcquanjian", + filterTarget: function (card, player, target) { + if (target == player) return false; + var num = target.countCards("h"); + if (num > target.getHandcardLimit()) return true; + return num < Math.min(5, target.getHandcardLimit()); + }, + filterCard: () => false, + selectCard: -1, + content: function () { + "step 0"; + player.addTempSkill("dcquanjian_draw", "phaseUseAfter"); + var num1 = target.countCards("h"), + num2 = target.getHandcardLimit(); + var num = 0; + if (num1 > num2) { + event.index = 0; + num = num1 - num2; + target + .chooseControl() + .set("choiceList", ["弃置" + get.cnNumber(num) + "张手牌", "本回合下次受到的伤害+1"]) + .set("ai", function () { + var player = _status.event.player; + if ( + _status.event.number == 1 && + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "dcquanjian_draw") && get.value(card) < 5; + }, "h") + ) + return 0; + return 1; + }) + .set("number", num); + } else { + event.index = 1; + num = Math.min(num2, 5) - num1; + if (num <= 0) event.finish(); + else + target + .chooseControl() + .set("choiceList", ["摸" + get.cnNumber(num) + "张牌,且本回合内不能使用或打出手牌", "本回合下次受到的伤害+1"]) + .set("ai", function () { + return 0; + }); + } + event.num = num; + "step 1"; + if (result.index == 0) { + if (event.index == 0) target.chooseToDiscard("h", true, num); + else target.draw(num); + } else { + target.addMark("dcquanjian_effect", 1, false); + target.addTempSkill("dcquanjian_effect"); + event.finish(); + } + "step 2"; + target.addTempSkill("dcquanjian_disable"); + }, + ai: { + result: { + target: function (player, target) { + var num1 = target.countCards("h"), + num2 = target.getHandcardLimit(); + if (num1 > num2) return -1; + return Math.min(5, num2) - num1; + }, + }, + }, + }, + effect: { + charlotte: true, + trigger: { player: "damageBegin3" }, + forced: true, + onremove: true, + marktext: "谏", + content: function () { + trigger.num += player.countMark(event.name); + player.removeSkill(event.name); + }, + intro: { content: "下次受到的伤害+#" }, + ai: { threaten: 2.5 }, + }, + disable: { + charlotte: true, + mod: { + cardEnabled(card, player) { + if (card.cards) { + const hs = player.getCards("h"); + if (card.cards.some(card => hs.includes(card))) return false; + } + }, + cardSavable(card, player) { + if (card.cards) { + const hs = player.getCards("h"); + if (card.cards.some(card => hs.includes(card))) return false; + } + }, + }, + mark: true, + marktext: "禁", + intro: { content: "不能使用或打出手牌" }, + ai: { threaten: 2.5 }, + }, + }, + }, + dctujue: { + audio: 2, + trigger: { player: "dying" }, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget(lib.filter.notMe, get.prompt2("dctujue")) + .set("ai", function (target) { + if (_status.event.skip) return 0; + return 200 + get.attitude(_status.event.player, target); + }) + .set("skip", player.countCards("hs", { name: ["tao", "jiu"] }) + player.hp > 0); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dctujue", target); + player.awakenSkill("dctujue"); + var cards = player.getCards("he"); + player.give(cards, target); + player.recover(cards.length); + player.draw(cards.length); + } + }, + }, + //尹夫人 + dcyingyu: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + direct: true, + filter: function (event, player) { + if (event.name == "phaseJieshu" && !player.storage.dcyingyu) return false; + return ( + game.countPlayer(function (current) { + return current.countCards("h") > 0; + }) > 1 + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(2, get.prompt("dcyingyu"), "展示两名角色的各一张手牌。若这两张牌花色不同,则你可以令其中一名角色获得另一名角色的展示牌。", function (card, player, target) { + return target.countCards("h") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) return get.attitude(player, target); + return 1 - get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + event.targets = targets; + event.cards = []; + player.logSkill("dcyingyu", targets); + player.choosePlayerCard(targets[0], true, "h"); + } else event.finish(); + "step 2"; + var card = result.cards[0]; + player.line(targets[0]); + player.showCards(card, get.translation(player) + "对" + get.translation(targets[0]) + "发动了【媵予】"); + event.cards.push(card); + player.choosePlayerCard(targets[1], true, "h"); + "step 3"; + var card = result.cards[0]; + player.line(targets[1]); + player.showCards(card, get.translation(player) + "对" + get.translation(targets[1]) + "发动了【媵予】"); + event.cards.push(card); + if (get.suit(cards[0], targets[0]) == get.suit(cards[1], targets[1])) event.finish(); + "step 4"; + var str1 = get.translation(targets[0]), + str2 = get.translation(targets[1]); + player + .chooseControl("cancel2") + .set("choiceList", ["令" + str1 + "获得" + str2 + "的" + get.translation(cards[1]), "令" + str2 + "获得" + str1 + "的" + get.translation(cards[0])]) + .set("goon", get.attitude(player, targets[0]) > 0 ? 0 : 1) + .set("ai", () => _status.event.goon); + "step 5"; + if (result.control != "cancel2") { + var i = result.index; + targets[1 - i].give(cards[1 - i], targets[i], "give"); + } + }, + onremove: true, + }, + dcyongbi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h") > 0 && game.hasPlayer(current => lib.skill.dcyongbi.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return target != player && target.hasSex("male"); + }, + selectCard: -1, + filterCard: true, + position: "h", + limited: true, + skillAnimation: true, + animationColor: "fire", + discard: false, + lose: false, + content: function () { + "step 0"; + player.awakenSkill("dcyongbi"); + if (player.hasSkill("dcyingyu", null, null, false)) player.storage.dcyingyu = true; + player.give(cards, target); + "step 1"; + var list = []; + for (var i of cards) { + list.add(get.suit(i, player)); + if (list.length >= 3) break; + } + if (list.length >= 2) { + player.addMark("dcyongbi_eff1", 2, false); + player.addSkill("dcyongbi_eff1"); + target.addMark("dcyongbi_eff1", 2, false); + target.addSkill("dcyongbi_eff1"); + } + if (list.length >= 3) { + player.addMark("dcyongbi_eff2", 1, false); + player.addSkill("dcyongbi_eff2"); + target.addMark("dcyongbi_eff2", 1, false); + target.addSkill("dcyongbi_eff2"); + } + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (player.hasUnknown()) return 0; + var zhu = get.zhu(player); + if (zhu && get.attitude(player, zhu) > 0) { + if (target == zhu) return 4; + } + return 1; + }, + }, + }, + subSkill: { + eff1: { + mod: { + maxHandcard: (player, num) => num + player.countMark("dcyongbi_eff1"), + }, + charlotte: true, + onremove: true, + marktext: "拥", + intro: { content: "手牌上限+#" }, + }, + eff2: { + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return event.num > 1; + }, + content: function () { + trigger.num -= player.countMark("dcyongbi_eff2"); + }, + charlotte: true, + onremove: true, + marktext: "嬖", + intro: { content: "受到大于1的伤害时,此伤害-#" }, + }, + }, + }, + //吕旷吕翔 + dcshuhe: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + position: "h", + discard: false, + lose: false, + delay: false, + check: function (cardx) { + var player = _status.event.player; + var num1 = get.number(cardx), + players = game.filterPlayer(); + var goon = false, + effect = 0; + for (var current of players) { + var cards = current.getCards("ej", function (card) { + var num = get.number(card); + return num == num1; + }); + if (cards.length) { + goon = true; + var att = get.attitude(player, current); + for (var card of cards) { + if (get.position(card) == "e") { + var val = get.value(card, current); + if (att <= 0) effect += val; + else effect -= val / 2; + } else { + var eff = get.effect(current, { name: card.viewAs || card.name }, player, player); + effect -= get.sgn(att) * eff; + } + } + } + } + if (goon) { + if (effect > 0) return 6 + effect - get.value(cardx); + return 0; + } + return game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ? 6 - get.value(cardx) + : 0; + }, + content: function () { + "step 0"; + player.showCards(cards, get.translation(player) + "发动了【数合】"); + player.addMark("dcliehou", 1); + "step 1"; + event.cards2 = []; + var num1 = get.number(cards[0], player); + var lose_list = [], + players = game.filterPlayer(); + for (var current of players) { + var cards = current.getCards("ej", function (card) { + var num = get.number(card); + return num == num1; + }); + if (cards.length > 0) { + player.line(current, "thunder"); + current.$throw(cards); + lose_list.push([current, cards]); + event.cards2.addArray(cards); + } + } + if (lose_list.length) { + event.lose_list = lose_list; + game.loseAsync({ + lose_list: lose_list, + }).setContent("chooseToCompareLose"); + } else { + event.goto(3); + player.chooseTarget(true, lib.filter.notMe, "将" + get.translation(event.cards[0]) + "交给一名其他角色").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + } + "step 2"; + var cards = event.cards2; + if (cards.length > 0) { + if (event.lose_list) game.delayx(); + player.gain(cards, "gain2"); + } + event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.give(cards, target); + } + }, + ai: { + order: 2, + result: { + player: 1, + }, + }, + }, + dcliehou: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + var num = Math.min(5, 1 + player.countMark("dcliehou")); + trigger.num += num; + trigger._dcliehou = num; + }, + group: "dcliehou_discard", + subSkill: { + discard: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + filter: function (event, player) { + return typeof event._dcliehou == "number"; + }, + content: function () { + "step 0"; + var num = trigger._dcliehou; + player + .chooseToDiscard(num, "he", "弃置" + get.cnNumber(num) + "张牌,或失去1点体力") + .set("ai", function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 26 - get.value(card); + }) + .set("goon", player.hp > Math.max(1, 4 - num) || get.effect(player, { name: "losehp" }, player, player) > 0); + "step 1"; + if (!result.bool) player.loseHp(); + }, + }, + }, + marktext: "爵", + intro: { + name: "列侯(爵)", + name2: "爵", + content: "〖列侯〗的摸牌数+#", + }, + }, + //管亥 + suoliang: { + audio: 2, + trigger: { source: "damageSource" }, + logTarget: "player", + usable: 1, + filter: function (event, player) { + return event.player != player && event.player.maxHp > 0 && event.player.countCards("he") > 0; + }, + check: function (event, player) { + return get.attitude(player, event.player) <= 0; + }, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + player.choosePlayerCard(target, true, "he", [1, target.maxHp], "选择" + get.translation(target) + "的至多" + get.cnNumber(target.maxHp) + "张牌"); + "step 1"; + if (result.bool) { + player.showCards(result.cards, get.translation(player) + "对" + get.translation(target) + "发动了【索粮】"); + var cards = result.cards.filter(function (card) { + var suit = get.suit(card, target); + if (suit != "heart" && suit != "club") return false; + return lib.filter.canBeGained(card, target, player); + }); + if (cards.length) player.gain(cards, target, "giveAuto", "bySelf"); + else { + var cards = result.cards.filter(function (card) { + return lib.filter.canBeDiscarded(card, target, player); + }); + if (cards.length) target.discard(cards, "notBySelf"); + } + } + }, + }, + qinbao: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return ( + (event.card.name == "sha" || get.type(event.card, null, false) == "trick") && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") >= player.countCards("h"); + }) + ); + }, + content: function () { + var hs = player.countCards("h"); + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player && current.countCards("h") >= hs; + }) + ); + }, + ai: { + threaten: 1.4, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return ( + player.countCards("h", function (card) { + return !ui.selected.cards.includes(card); + }) <= arg.target.countCards("h") + ); + }, + }, + }, + //胡昭 + midu: { + audio: 2, + enable: "phaseUse", + usable: 1, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("弥笃:选择要废除或恢复的装备栏或判定区", "hidden"); + dialog.classList.add("withbg"); + dialog.noforcebutton = true; + var list1 = [], + list2 = []; + for (var i = 1; i < 6; i++) { + for (var j = 0; j < player.countEnabledSlot(i); j++) { + list1.push(i); + } + if (player.hasDisabledSlot(i)) list2.push(i); + } + (player.isDisabledJudge() ? list2 : list1).push(-1); + var addTable = function (list, bool) { + const adds = []; + for (var i of list) { + adds.push([[i, bool], i > 0 ? get.translation("equip" + i) + "栏" : "判定区"]); + } + dialog.add([adds, "tdnodes"]); + }; + if (list1.length) { + dialog.addText("未废除"); + addTable(list1, true); + } + if (list2.length) { + dialog.addText("已废除"); + addTable(list2, false); + } + return dialog; + }, + filter: function (button, player) { + if (!ui.selected.buttons.length) return true; + if (!ui.selected.buttons[0].link[1]) return false; + return button.link[1]; + }, + check: function (button) { + var player = _status.event.player; + if (!button.link[1]) { + if (button.link[0] <= 0) return -10; + if ( + player.hasCard(function (card) { + return get.subtype(card) == "equip" + button.link[0]; + }, "hs") + ) + return 15; + return 10; + } + if ( + button.link[0] <= 0 || + (player.hasEmptySlot(button.link[0]) && + !player.hasCard(function (card) { + return get.subtype(card) == "equip" + button.link[0] && player.canUse(card, player) && get.effect(player, card, player, player) > 0; + }, "hs")) + ) + return 5; + return 0; + }, + select: [1, Infinity], + backup: function (links, player) { + if (!links[0][1]) { + return { + audio: "midu", + selectCard: -1, + selectTarget: -1, + filterCard: () => false, + filterTarget: () => false, + equip: links[0][0], + content: function () { + var pos = lib.skill.midu_backup.equip; + if (pos <= 0) player.enableJudge(); + else player.enableEquip(pos); + player.addTempSkills("rehuomo", { player: "phaseBegin" }); + }, + }; + } else { + return { + audio: "midu", + selectCard: -1, + filterCard: () => false, + filterTarget: true, + equip: links.map(i => i[0]).sort(), + content: function () { + var list = lib.skill.midu_backup.equip, + num = list.length, + bool = false; + if (list.includes(-1)) { + list.remove(-1); + bool = true; + } + if (list.length > 0) player.disableEquip(list); + if (bool) player.disableJudge(); + target.draw(num); + }, + ai: { + tag: { + draw: 1, + }, + result: { + target: 2, + }, + }, + }; + } + }, + prompt: function (links, player) { + if (!links[0][1]) { + return "恢复一个装备栏或判定区并获得〖活墨〗"; + } + var numc = get.cnNumber(links.length); + return "废除" + numc + "个区域并令一名角色摸" + numc + "张牌"; + }, + }, + derivation: "rehuomo", + ai: { + order: 8, + result: { player: 1 }, + }, + subSkill: { backup: {} }, + }, + xianwang: { + mod: { + globalTo: function (source, player, distance) { + var num = player.countDisabledSlot(); + if (num > 0) return distance + (num > 2 ? 2 : 1); + }, + globalFrom: function (source, player, distance) { + var num = source.countDisabledSlot(); + if (num > 0) return distance - (num > 2 ? 2 : 1); + }, + }, + }, + //刘巴 + dczhubi: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], + }, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false) return false; + for (var i of event.cards) { + if (get.suit(i, event.player) == "diamond") return true; + } + return false; + }, + prompt2: "检索一张【无中生有】并置于牌堆顶", + content: function () { + var card = get.cardPile(function (card) { + return card.name == "wuzhong" && get.suit(card) != "diamond"; + }); + if (card) { + game.log(player, "将", card, "置于牌堆顶"); + card.fix(); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + game.updateRoundNumber(); + game.delayx(); + } + }, + }, + dcliuzhuan: { + audio: 2, + group: ["dcliuzhuan_mark", "dcliuzhuan_gain"], + mod: { + targetEnabled: function (card) { + if (card.cards) { + for (var i of card.cards) { + if (i.hasGaintag("dcliuzhuan_tag")) return false; + } + } else if (get.itemtype(card) == "card") { + if (card.hasGaintag("dcliuzhuan_tag")) return false; + } + }, + }, + subSkill: { + gain: { + audio: "dcliuzhuan", + trigger: { global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter"] }, + forced: true, + logTarget: () => _status.currentPhase, + filter: function (event, player) { + var current = _status.currentPhase; + if (!current) return false; + if (event.name == "cardsDiscard") { + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evtx2 = evtx.relatedEvent || evtx.getParent(); + return current.hasHistory("lose", function (evtx3) { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + for (var i in evtx3.gaintag_map) { + if (evtx3.gaintag_map[i].includes("dcliuzhuan_tag")) return true; + } + }); + //return false; + } else if (event.name == "lose") { + if (event.player != current || event.position != ui.discardPile) return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dcliuzhuan_tag")) return true; + } + return false; + } + return current.hasHistory("lose", function (evt) { + if (evt.getParent() != event || evt.position != ui.discardPile) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcliuzhuan_tag")) return true; + } + }); + }, + content: function () { + var cards, + current = _status.currentPhase; + if (trigger.name == "lose") + cards = trigger.hs.filter(function (i) { + return trigger.gaintag_map[i.cardid] && trigger.gaintag_map[i.cardid].includes("dcliuzhuan_tag") && get.position(i, true) == "d"; + }); + else if (trigger.name == "cardsDiscard") { + var evtx = trigger.getParent(); + var evtx2 = evtx.relatedEvent || evtx.getParent(); + var bool = false; + var history = current.getHistory("lose", function (evtx3) { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + for (var i in evtx3.gaintag_map) { + if (evtx3.gaintag_map[i].includes("dcliuzhuan_tag")) return true; + } + }); + cards = trigger.cards.filter(function (i) { + for (var evt of history) { + if (evt.gaintag_map[i.cardid] && evt.gaintag_map[i.cardid].includes("dcliuzhuan_tag") && get.position(i, true) == "d") return true; + } + return false; + }); + } else { + cards = []; + current.getHistory("lose", function (evt) { + if (evt.getParent() != trigger || evt.position != ui.discardPile) return false; + for (var card of evt.hs) { + if (get.position(card, true) != "d") continue; + var i = card.cardid; + if (evt.gaintag_map[i] && evt.gaintag_map[i].includes("dcliuzhuan_tag")) cards.push(card); + } + }); + } + if (cards && cards.length > 0) player.gain(cards, "gain2"); + }, + }, + mark: { + trigger: { global: "gainBegin" }, + forced: true, + popup: false, + silent: true, + lastDo: true, + filter: function (event, player) { + if (player == event.player || event.player != _status.currentPhase) return false; + var evt = event.getParent("phaseDraw"); + if (evt && evt.name == "phaseDraw") return false; + return true; + }, + content: function () { + trigger.gaintag.add("dcliuzhuan_tag"); + trigger.player.addTempSkill("dcliuzhuan_tag"); + }, + }, + tag: { + charlotte: true, + onremove: (player, skill) => player.removeGaintag(skill), + }, + }, + }, + //张勋 + suizheng: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("suizheng"), "令一名角色下回合内获得〖随征〗效果").set("", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasJudge("lebu")) return att / 2; + return att * get.threaten(target) * Math.sqrt(2 + player == target ? player.countCards("h", "sha") * 2 : target.countCards("h")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("suizheng", target); + target.addMark("suizheng_effect", 1, false); + target.markAuto("suizheng_source", [player]); + target.addTempSkill("suizheng_effect", { + player: player == target ? "phaseJieshuBefore" : "phaseAfter", + }); + } + }, + subSkill: { + effect: { + audio: "suizheng", + charlotte: true, + mod: { + targetInRange: function (card) { + if (card.name == "sha") return true; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("suizheng_effect"); + }, + }, + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + var list = player.getStorage("suizheng_source"); + if (!list.filter(i => i.isIn().length)) return false; + return player.hasHistory("sourceDamage", function (evt) { + return evt.player.isIn() && evt.getParent("phaseUse") == event; + }); + }, + content: function () { + "step 0"; + var targets = player.getStorage("suizheng_source").slice(0).sortBySeat(); + event.targets = targets; + "step 1"; + var target = targets.shift(); + event.target = target; + var list = []; + player.getHistory("sourceDamage", function (evt) { + if (evt.player.isIn() && evt.getParent("phaseUse") == trigger) list.add(evt.player); + }); + if (!list.length) event.finish(); + else if (target.isIn()) { + list = list.filter(function (i) { + return target.canUse("sha", i, false); + }); + if (list.length > 0) + target + .chooseTarget("随征:是否对一名角色使用【杀】?", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("targets", list) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); + } else event._result = { bool: false }; + "step 2"; + if (result.bool) { + target.useCard( + { + name: "sha", + isCard: true, + }, + result.targets, + false, + "suizheng_effect" + ); + } + if (targets.length > 0) event.goto(1); + }, + onremove: function (player) { + delete player.storage.suizheng_effect; + delete player.storage.suizheng_source; + }, + intro: { content: "使用【杀】无距离限制且次数上限+#" }, + }, + }, + }, + //纪灵 + dcshuangren: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + preHidden: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && player.canCompare(current); + }) + ); + }, + content: function () { + "step 0"; + var goon; + if (player.needsToDiscard() > 1) { + goon = player.hasCard(function (card) { + return card.number > 10 && get.value(card) <= 5; + }); + } else if (player.hasSha()) { + goon = player.hasCard(function (card) { + return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; + }); + } else { + goon = player.hasCard(function (card) { + return get.value(card) <= 5; + }); + } + player + .chooseTarget(get.prompt2("dcshuangren"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + if (_status.event.goon && get.attitude(player, target) < 0) { + return get.effect(target, { name: "sha" }, player, player); + } + return 0; + }) + .set("goon", goon) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dcshuangren", target); + player.chooseToCompare(target); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + var target = event.target; + if ( + game.hasPlayer(function (current) { + if (target == current || target.group != current.group) return false; + return player.canUse("sha", current, false); + }) + ) { + var str = "请选择视为使用【杀】的目标"; + var str2 = "操作提示:选择一名角色B,或选择包含A(" + get.translation(target) + ")在内的两名角色A和B(B的势力需为" + get.translation(target.group) + "势力)"; + player + .chooseTarget([1, 2], str, str2, true, function (card, player, target) { + if (!player.canUse("sha", target, false)) return false; + var current = _status.event.target; + if (target == current) return true; + if (target.group != current.group) return false; + if (!ui.selected.targets.length) return true; + return ui.selected.targets[0] == current; + //return current==target; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }) + .set("target", target) + .set("complexTarget", true); + } else { + player.useCard({ name: "sha", isCard: true }, target, false); + event.finish(); + } + } else { + player.addTempSkill("dcshuangren_debuff", "phaseUseAfter"); + event.finish(); + } + "step 3"; + if (result.bool && result.targets && result.targets.length) { + player.useCard({ name: "sha", isCard: true }, result.targets, false); + } + }, + subSkill: { + debuff: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + }, + }, + }, + //羊祜 + dcdeshao: { + audio: 2, + usable: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return player != event.player && get.color(event.card) == "black"; + }, + logTarget: "player", + check: function (event, player) { + var eff = get.effect(player, { name: "draw" }, player, player); + if (player.countCards("h") + 1 <= event.player.countCards("h") && event.player.countCards("he") > 0) eff += get.effect(event.player, { name: "guohe_copy2" }, player, player); + return eff; + }, + content: function () { + "step 0"; + player.draw(); + "step 1"; + var target = trigger.player; + if (player.countCards("h") <= target.countCards("h") && target.countCards("he") > 0) { + player.discardPlayerCard(target, true, "he"); + player.addExpose(0.2); + } + }, + }, + dcmingfa: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + return player.isPhaseUsing() && (event.card.name == "sha" || get.type(event.card) == "trick") && event.cards.filterInD().length > 0 && !player.getExpansions("dcmingfa").length; + }, + content: function () { + "step 0"; + var str, + cards = trigger.cards.filterInD(), + card = trigger.card; + if (cards.length == 1 && card.name == cards[0].name && (card.nature || false) == (cards[0].nature || false)) str = get.translation(cards[0]); + else str = get.translation(trigger.card) + "(" + get.translation(cards) + ")"; + var cardx = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }; + player + .chooseTarget(lib.filter.notMe, get.prompt("dcmingfa"), "将" + str + "作为“明伐”牌置于武将牌上,并选择一名其他角色。该角色下回合结束时对其执行〖明伐〗的后续效果。") + .set("card", cardx) + .set( + "goon", + (function () { + var getMax = function (card) { + return Math.max.apply( + Math, + game + .filterPlayer(function (current) { + return current != player && lib.filter.targetEnabled2(card, player, current); + }) + .map(function (i) { + return get.effect(i, card, player, player) * Math.sqrt(Math.min(i.getHandcardLimit(), 1 + i.countCards("h"))); + }) + .concat([0]) + ); + }; + var eff1 = getMax(cardx); + if ( + player.hasCard(function (card) { + if ((card.name != "sha" && get.type(card) != "trick") || !player.hasValueTarget(card, null, true)) return false; + return ( + getMax({ + name: get.name(card), + nature: get.nature(card), + isCard: true, + }) >= eff1 + ); + }, "hs") + ) + return false; + return true; + })() + ) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + var player = _status.event.player, + card = _status.event.card; + if (!lib.filter.targetEnabled2(card, player, target)) return 0; + return get.effect(target, card, player, player) * Math.sqrt(Math.min(target.getHandcardLimit(), 1 + target.countCards("h"))); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcmingfa", target); + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }; + player.storage.dcmingfa_info = [card, target]; + player.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("dcmingfa"); + } + }, + group: "dcmingfa_use", + ai: { expose: 0.2 }, + intro: { + mark: function (dialog, storage, player) { + var cards = player.getExpansions("dcmingfa"); + if (!cards.length) return "没有“明伐”牌"; + else dialog.add(cards); + var info = player.storage.dcmingfa_info; + if (info) { + dialog.addText("记录牌:" + get.translation(info[0]) + "
    记录目标:" + get.translation(info[1])); + } + }, + content: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + delete player.storage.dcmingfa_info; + }, + subSkill: { + use: { + audio: "dcmingfa", + trigger: { global: ["phaseEnd", "die"] }, + forced: true, + filter: function (event, player) { + if (!player.storage.dcmingfa_info || !player.getExpansions("dcmingfa").length) return false; + return event.player == player.storage.dcmingfa_info[1]; + }, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var card = player.storage.dcmingfa_info[0]; + delete player.storage.dcmingfa_info; + event.card = card; + event.count = Math.max(1, Math.min(5, target.countCards("h"))); + if (!event.player.isIn()) event.goto(2); + "step 1"; + event.count--; + if (target.isIn() && lib.filter.targetEnabled2(card, player, target)) { + player.useCard(get.copy(card), target); + if (event.count > 0) event.redo(); + } + "step 2"; + var cards = player.getExpansions("dcmingfa"); + if (cards.length > 0) player.loseToDiscardpile(cards); + }, + }, + }, + }, + //蔡瑁张允 + lianzhou: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + if (!player.isLinked()) return true; + return game.hasPlayer(function (current) { + return current != player && current.hp == player.hp && !current.isLinked(); + }); + }, + content: function () { + "step 0"; + if (!player.isLinked()) player.link(); + "step 1"; + var num = game.countPlayer(function (current) { + return current != player && current.hp == player.hp && !current.isLinked(); + }); + if (num > 0) { + player + .chooseTarget([1, num], "选择横置任意名体力值等于你的角色", function (card, player, current) { + return current != player && current.hp == player.hp && !current.isLinked(); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "tiesuo" }, player, player); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); + for (var i of targets) i.link(); + } + }, + ai: { halfneg: true }, + }, + jinglan: { + audio: 2, + trigger: { source: "damageSource" }, + forced: true, + content: function () { + var delta = player.countCards("h") - player.hp; + if (delta > 0) player.chooseToDiscard("h", 4, true); + else if (delta == 0) { + player.chooseToDiscard("he", true); + player.recover(); + } else { + player.damage("fire", "nosource"); + player.draw(5); + } + }, + ai: { halfneg: true }, + }, + //滕公主 + xingchong: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + filter: function (event, player) { + return player.maxHp > 0; + }, + content: function () { + "step 0"; + var list = []; + for (var i = 0; i <= Math.min(5, player.maxHp); i++) { + list.push(get.cnNumber(i) + "张"); + } + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("xingchong")) + .set("prompt2", "请首先选择摸牌的张数") + .set("ai", function () { + var player = _status.event.player, + num1 = player.maxHp, + num2 = player.countCards("h"); + if (num1 <= num2) return 0; + return Math.ceil((num1 - num2) / 2); + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("xingchong"); + var num2 = result.index; + if (num2 > 0) player.draw(num2); + var num = Math.min(5, player.maxHp) - num2; + if (num == 0) event.finish(); + else event.num = num; + } else event.finish(); + "step 2"; + if (player.countCards("h") > 0) { + player.chooseCard("h", [1, Math.min(player.countCards("h"), event.num)], "请选择要展示的牌").set("ai", () => 1 + Math.random()); + } else event.finish(); + "step 3"; + if (result.bool) { + var cards = result.cards; + player.showCards(cards, get.translation(player) + "发动了【幸宠】"); + player.addGaintag(cards, "xingchong"); + player.addTempSkill("xingchong_effect", "roundStart"); + } + }, + subSkill: { + effect: { + audio: "xingchong", + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("xingchong")) return true; + } + return false; + } + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("xingchong")) return true; + } + return false; + }); + }, + forced: true, + popup: false, + charlotte: true, + onremove: function (player) { + player.removeGaintag("xingchong"); + }, + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + "step 1"; + player.logSkill("xingchong_effect"); + var num = 0; + if (trigger.name == "lose") { + for (var i in trigger.gaintag_map) { + if (trigger.gaintag_map[i].includes("xingchong")) num++; + } + } else + player.getHistory("lose", function (evt) { + if (trigger != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("xingchong")) num++; + } + }); + player.draw(2 * num); + }, + }, + }, + }, + liunian: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return game.hasGlobalHistory("cardMove", function (evt) { + return evt.washCard && (evt.shuffleNumber == 1 || evt.shuffleNumber == 2); + }); + }, + content: function () { + "step 0"; + if ( + game.hasGlobalHistory("cardMove", function (evt) { + return evt.washCard && evt.shuffleNumber == 1; + }) + ) { + player.gainMaxHp(); + game.delayx(); + } + "step 1"; + if ( + game.hasGlobalHistory("cardMove", function (evt) { + return evt.washCard && evt.shuffleNumber == 2; + }) + ) { + player.recover(); + game.delayx(); + } else event.finish(); + "step 2"; + player.addSkill("liunian_effect"); + player.addMark("liunian_effect", 10, false); + }, + subSkill: { + effect: { + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("liunian_effect"); + }, + }, + marktext: "年", + intro: { + content: "手牌上限+#", + }, + }, + }, + }, + //黄承彦 + dcjiezhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { + var skills = target.getSkills(null, false, false).filter(function (i) { + if (i == "bazhen") return; + var info = get.info(i); + return info && !get.is.locked(i) && !info.limited && !info.juexingji && !info.zhuSkill && !info.charlotte; + }); + target.addAdditionalSkills("dcjiezhen_blocker", "bazhen"); + target.addSkill("dcjiezhen_blocker"); + target.markAuto("dcjiezhen_blocker", skills); + player.addSkill("dcjiezhen_clear"); + player.markAuto("dcjiezhen_clear", [target]); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + var skills = target.getSkills(null, false, false).filter(function (i) { + if (i == "bazhen") return; + var info = get.info(i); + return info && !get.is.locked(i) && !info.limited && !info.juexingji && !info.zhuSkill && !info.charlotte; + }); + if (!skills.length && target.hasEmptySlot(2)) return 1; + return -0.5 * skills.length; + }, + }, + }, + subSkill: { + blocker: { + init: function (player, skill) { + player.addSkillBlocker(skill); + }, + onremove: function (player, skill) { + player.removeSkillBlocker(skill); + player.removeAdditionalSkill(skill); + delete player.storage.dcjiezhen_blocker; + }, + charlotte: true, + locked: true, + skillBlocker: function (skill, player) { + return skill != "bazhen" && skill != "dcjiezhen_blocker" && !lib.skill[skill].charlotte && player.getStorage("dcjiezhen_blocker").includes(skill); + }, + mark: true, + marktext: "阵", + intro: { + markcount: () => 0, + content: function (storage, player, skill) { + if (storage.length) return "失效技能:" + get.translation(storage); + return "无失效技能"; + }, + }, + }, + clear: { + audio: "dcjiezhen", + charlotte: true, + trigger: { + global: ["judgeAfter", "die"], + player: "phaseBegin", + }, + forced: true, + forceDie: true, + onremove: true, + filter: function (event, player) { + if (event.name == "die") { + return player == event.player || player.getStorage("dcjiezhen_clear").includes(event.player); + } else if (event.name == "judge") { + return event.skill == "bagua" && player.getStorage("dcjiezhen_clear").includes(event.player); + } + return player.getStorage("dcjiezhen_clear").length > 0; + }, + logTarget: function (event, player) { + if (event.name != "phase") return event.player; + return player.getStorage("dcjiezhen_clear"); + }, + content: function () { + "step 0"; + var targets = player.getStorage("dcjiezhen_clear"); + if (trigger.name == "die" && player == trigger.player) { + for (var target of targets) { + target.removeSkill("dcjiezhen_blocker"); + } + player.removeSkill("dcjiezhen_clear"); + event.finish(); + return; + } + if (trigger.name == "phase") event.targets = targets.slice(0).sortBySeat(); + else event.targets = [trigger.player]; + "step 1"; + var target = targets.shift(); + var storage = player.getStorage("dcjiezhen_clear"); + if (storage.includes(target)) { + storage.remove(target); + target.removeSkill("dcjiezhen_blocker"); + if (target.isIn() && target.countGainableCards(player, "hej") > 0) player.gainPlayerCard(target, "hej", true); + } + if (targets.length > 0) { + event.redo(); + } else { + player.removeSkill("dcjiezhen_clear"); + } + }, + }, + }, + derivation: "bazhen", + }, + dczecai: { + audio: 2, + trigger: { global: "roundStart" }, + limited: true, + skillAnimation: true, + direct: true, + animationColor: "soil", + filter: function (event, player) { + return game.roundNumber > 1; + }, + getMax: function () { + var getNum = function (current) { + var history = current.actionHistory; + var num = 0; + for (var i = history.length - 2; i >= 0; i--) { + for (var j = 0; j < history[i].useCard.length; j++) { + if (get.type2(history[i].useCard[j].card, false) == "trick") num++; + } + if (history[i].isRound) break; + } + return num; + }; + var max = 0, + current = false, + targets = game.filterPlayer(); + for (var target of targets) { + var num = getNum(target); + if (num > max) { + max = num; + current = target; + } else if (num == max) current = false; + } + return current; + }, + content: function () { + "step 0"; + event.target = lib.skill.dczecai.getMax(); + var str = "令一名其他角色于本轮内获得〖集智〗"; + if (event.target && event.target != player) str += ";若选择的目标为" + get.translation(event.target) + ",则其获得一个额外的回合"; + player + .chooseTarget(lib.filter.notMe, get.prompt("dczecai"), str) + .set("maximum", event.target) + .set("ai", function (target) { + if (target != _status.event.maximum) return 0; + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + player.awakenSkill("dczecai"); + var target = result.targets[0]; + player.logSkill("dczecai", target); + target.addAdditionalSkills("dczecai_effect", "rejizhi"); + target.addTempSkill("dczecai_effect", "roundStart"); + if (target == event.target) { + var evt = trigger; + target.insertPhase(); + if (evt.player != target && !evt._finished) { + evt.finish(); + evt._triggered = 5; + var evtx = evt.player.insertPhase(); + delete evtx.skill; + } + } + } + }, + derivation: "rejizhi", + subSkill: { + effect: { + charlotte: true, + mark: true, + marktext: "才", + intro: { content: "已拥有技能〖集智〗" }, + }, + }, + }, + dcyinshi: { + audio: 2, + trigger: { player: "damageBegin" }, + usable: 1, + filter: function (event, player) { + return !event.card || get.color(event.card) == "none"; + }, + forced: true, + content: function () { + trigger.cancel(); + }, + group: "dcyinshi_gain", + subSkill: { + gain: { + audio: "dcyinshi", + trigger: { global: "judgeEnd" }, + forced: true, + filter: function (event, player) { + return event.skill == "bagua" && event.result.card && get.position(event.result.card, true) == "o"; + }, + content: function () { + player.gain(trigger.result.card, "gain2"); + }, + }, + }, + }, + //高览 + xizhen: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && (player.canUse("sha", current, false) || player.canUse("juedou", current, false)); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("xizhen"), "视为对一名角色使用【杀】或【决斗】", function (card, player, target) { + return target != player && (player.canUse("sha", target, false) || player.canUse("juedou", target, false)); + }) + .set("ai", function (target) { + var player = _status.event.player; + var eff1 = 0, + eff2 = 0; + if (player.canUse("sha", target, false)) eff1 = get.effect(target, { name: "sha" }, player, player); + if (player.canUse("juedou", target, false)) eff2 = get.effect(target, { name: "juedou" }, player, player); + var effx = Math.max(eff1, eff2); + if (effx <= 0) return 0; + if (target.isHealthy()) effx *= 3; + if (get.attitude(player, target) > 0) effx *= 1.6; + return effx; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xizhen", target); + var list = []; + if (player.canUse("sha", target, false)) list.push("sha"); + if (player.canUse("juedou", target, false)) list.push("juedou"); + if (list.length == 1) event._result = { control: list[0] }; + else + player + .chooseControl(list) + .set("prompt", "视为对" + get.translation(target) + "使用…") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + var eff1 = get.effect(target, { name: "sha" }, player, player), + eff2 = get.effect(target, { name: "juedou" }, player, player); + return eff1 > eff2 ? 0 : 1; + }); + } else event.finish(); + "step 2"; + player.useCard({ name: result.control, isCard: true }, target, false); + "step 3"; + if (target.isIn()) { + player.storage.xizhen_effect = target; + player.addTempSkill("xizhen_effect", "phaseUseAfter"); + } + }, + subSkill: { + effect: { + audio: "xizhen", + charlotte: true, + onremove: true, + trigger: { global: ["useCard", "respond"] }, + logTarget: function (event, player) { + return player.storage.xizhen_effect; + }, + forced: true, + filter: function (event, player) { + return Array.isArray(event.respondTo) && event.respondTo[0] == player && player.storage.xizhen_effect && player.storage.xizhen_effect.isIn(); + }, + content: function () { + "step 0"; + var target = player.storage.xizhen_effect; + event.target = target; + target.recover(); + "step 1"; + player.draw(target.isHealthy() ? 2 : 1); + }, + mark: "character", + intro: { content: "已指定$为目标" }, + }, + }, + }, + //管宁 + dunshi: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + usable: 1, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = [["sha", "shan", "tao", "jiu"], 0]; + }, + hiddenCard: function (player, name) { + if (player.storage.dunshi && player.storage.dunshi[0].includes(name) && !player.getStat("skill").dunshi) return true; + return false; + }, + marktext: "席", + mark: true, + intro: { + markcount: function (storage) { + return storage[1]; + }, + content: function (storage, player) { + if (!storage) return; + var str = "
  • "; + if (!storage[0].length) { + str += "已无可用牌"; + } else { + str += "剩余可用牌:"; + str += get.translation(storage[0]); + } + str += "
  • “席”标记数量:"; + str += storage[1]; + return str; + }, + }, + filter: function (event, player) { + if (event.type == "wuxie") return false; + var storage = player.storage.dunshi; + if (!storage || !storage[0].length) return false; + for (var i of storage[0]) { + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + var storage = player.storage.dunshi; + for (var i of storage[0]) list.push(["基本", "", i]); + return ui.create.dialog("遁世", [list, "vcard"], "hidden"); + }, + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard({ name: button.link[2], isCard: true }, player, evt); + }, + check: function (button) { + var card = { name: button.link[2] }, + player = _status.event.player; + if (_status.event.getParent().type != "phase") return 1; + if (card.name == "jiu") return 0; + if (card.name == "sha" && player.hasSkill("jiu")) return 0; + return player.getUseValue(card, null, true); + }, + backup: function (links, player) { + return { + audio: "dunshi", + filterCard: function () { + return false; + }, + popname: true, + viewAs: { + name: links[0][2], + isCard: true, + }, + selectCard: -1, + precontent: function () { + player.addTempSkill("dunshi_damage"); + player.storage.dunshi_damage = event.result.card.name; + }, + }; + }, + prompt: function (links, player) { + return "选择【" + get.translation(links[0][2]) + "】的目标"; + }, + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + var storage = player.storage.dunshi; + if (!storage || !storage[0].length) return false; + if (player.getStat("skill").dunshi) return false; + switch (tag) { + case "respondSha": + return (_status.event.type != "phase" || player == game.me || player.isUnderControl() || player.isOnline()) && storage[0].includes("sha"); + case "respondShan": + return storage[0].includes("shan"); + case "save": + if (arg == player && storage[0].includes("jiu")) return true; + return storage[0].includes("tao"); + } + }, + order: 2, + result: { + player: function (player) { + if (_status.event.type == "dying") { + return get.attitude(player, _status.event.dying); + } + return 1; + }, + }, + }, + initList: function () { + var list, + skills = []; + var banned = ["xunyi", "mbyilie"]; + if (get.mode() == "guozhan") { + list = []; + for (var i in lib.characterPack.mode_guozhan) list.push(i); + } else if (_status.connectMode) list = get.charactersOL(); + else { + list = []; + for (var i in lib.character) { + if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue; + list.push(i); + } + } + for (var i of list) { + if (i.indexOf("gz_jun") == 0) continue; + for (var j of lib.character[i][3]) { + var skill = lib.skill[j]; + if (!skill || skill.zhuSkill || banned.includes(j)) continue; + if (skill.ai && (skill.ai.combo || skill.ai.notemp || skill.ai.neg)) continue; + var info = get.translation(j); + for (var ix = 0; ix < info.length; ix++) { + if (/仁|义|礼|智|信/.test(info[ix]) == true) { + skills.add(j); + break; + } + } + } + } + _status.dunshi_list = skills; + }, + subSkill: { + backup: { audio: "dunshi" }, + damage: { + audio: "dunshi", + trigger: { global: "damageBegin2" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.source == _status.currentPhase; + }, + onremove: true, + logTarget: "source", + content: function () { + "step 0"; + event.cardname = player.storage.dunshi_damage; + player.removeSkill("dunshi_damage"); + event.target = trigger.source; + var card = get.translation(trigger.source), + card2 = get.translation(event.cardname), + card3 = get.translation(trigger.player); + var list = ["防止即将对" + card3 + "造成的伤害,并令" + card + "获得一个技能名中包含“仁/义/礼/智/信”的技能", "从〖遁世〗中删除【" + card2 + "】并获得一枚“席”", "减1点体力上限,然后摸等同于“席”数的牌"]; + var next = player.chooseButton([ + "遁世:请选择两项", + [ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ], + ]); + next.set("forced", true); + next.set("selectButton", 2); + next.set("ai", function (button) { + var player = _status.event.player; + switch (button.link) { + case 0: + if (get.attitude(player, _status.currentPhase) > 0) return 3; + return 0; + case 1: + return 1; + case 2: + var num = player.storage.dunshi[1]; + for (var i of ui.selected.buttons) { + if (i.link == 1) num++; + } + if (num > 0 && player.isDamaged()) return 2; + return 0; + } + }); + "step 1"; + event.links = result.links.sort(); + for (var i of event.links) { + game.log(player, "选择了", "#g【遁世】", "的", "#y选项" + get.cnNumber(i + 1, true)); + } + if (event.links.includes(0)) { + trigger.cancel(); + if (!_status.dunshi_list) lib.skill.dunshi.initList(); + var list = _status.dunshi_list + .filter(function (i) { + return !target.hasSkill(i, null, null, false); + }) + .randomGets(3); + if (list.length == 0) event.goto(3); + else { + event.videoId = lib.status.videoId++; + var func = function (skills, id, target) { + var dialog = ui.create.dialog("forcebutton"); + dialog.videoId = id; + dialog.add("令" + get.translation(target) + "获得一个技能"); + for (var i = 0; i < skills.length; i++) { + dialog.add('"); + } + dialog.addText("
    "); + }; + if (player.isOnline()) player.send(func, list, event.videoId, target); + else if (player == game.me) func(list, event.videoId, target); + player.chooseControl(list).set("ai", function () { + var controls = _status.event.controls; + if (controls.includes("cslilu")) return "cslilu"; + return controls[0]; + }); + } + } else event.goto(3); + "step 2"; + game.broadcastAll("closeDialog", event.videoId); + target.addSkills(result.control); + "step 3"; + var storage = player.storage.dunshi; + if (event.links.includes(1)) { + storage[0].remove(event.cardname); + storage[1]++; + player.markSkill("dunshi"); + } + if (event.links.includes(2)) { + player.loseMaxHp(); + if (storage[1] > 0) player.draw(storage[1]); + } + }, + }, + }, + }, + //吉本 + xunli: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], + }, + forced: true, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false || player.getExpansions("xunli").length >= 9) return false; + for (var i of event.cards) { + if (get.position(i, true) == "d" && get.color(i, event.cards2 && event.cards2.includes(i) ? event.player : false) == "black") return true; + } + return false; + }, + content: function () { + "step 0"; + var num = 9 - player.getExpansions("xunli").length; + var cards = []; + for (var i of trigger.cards) { + if (get.position(i, true) == "d" && get.color(i, trigger.cards2 && trigger.cards2.includes(i) ? trigger.player : false) == "black") cards.push(i); + } + if (cards.length <= num) + event._result = { + bool: true, + links: cards, + }; + else + player + .chooseButton(true, num, ["寻疠:将" + get.cnNumber(num) + "张牌置于武将牌上", cards]) + .set("forceAuto", true) + .set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + "step 1"; + if (result.bool) { + player.addToExpansion("gain2", result.links).gaintag.add("xunli"); + } + }, + marktext: "疠", + intro: { + content: "expansion", + markcount: "expansion", + }, + group: "xunli_exchange", + subSkill: { + exchange: { + audio: "xunli", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("xunli").length > 0 && player.hasCard(card => get.color(card, player) == "black", "h"); + }, + content: function () { + "step 0"; + var cards = player.getExpansions("xunli"); + if (!cards.length || !player.countCards("h")) { + event.finish(); + return; + } + var next = player.chooseToMove("寻疠:是否交换“疠”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的疠", cards], + ["手牌区", player.getCards("h", card => get.color(card, player) == "black")], + ]); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + next.set("processAI", function (list) { + var player = _status.event.player; + var getv = function (card) { + if (get.info(card).toself) return 0; + return player.getUseValue(card, false); + }; + var cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return getv(b) - getv(a); + }), + cards2 = cards.splice(0, player.getExpansions("xunli").length); + return [cards2, cards]; + }); + "step 1"; + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("xunli")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.logSkill("xunli_exchange"); + player.addToExpansion(pushs, player, "giveAuto").gaintag.add("xunli"); + game.log(player, "将", pushs, "作为“疠”置于武将牌上"); + player.gain(gains, "gain2"); + } + }, + }, + }, + }, + zhishi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("zhishi")).set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att <= 4) return 0; + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhishi", target); + player.storage.zhishi_mark = target; + player.addTempSkill("zhishi_mark", { player: "phaseBegin" }); + } + }, + ai: { + combo: "xunli", + expose: 0.3, + }, + subSkill: { + mark: { + trigger: { + global: ["dying", "useCardToTargeted"], + }, + direct: true, + charlotte: true, + filter: function (event, player) { + if (!player.getExpansions("xunli").length) return false; + var target = player.storage.zhishi_mark; + if (event.name == "dying") return event.player == target; + return event.card.name == "sha" && event.target == target; + }, + content: function () { + "step 0"; + var target = player.storage.zhishi_mark; + event.target = target; + player.chooseButton([get.prompt("zhishi", target), '
    弃置任意张“疠”并令其摸等量的牌
    ', player.getExpansions("xunli")], [1, Infinity]).set("ai", function (button) { + var player = _status.event.player, + target = player.storage.zhishi_mark; + if (target.hp < 1 && target != get.zhu(player)) return 0; + if (target.hasSkillTag("nogain")) return 0; + return 3 - player.getUseValue(card, false); + }); + "step 1"; + if (result.bool) { + player.logSkill("zhishi", target); + player.loseToDiscardpile(result.links); + target.draw(result.links.length); + } + }, + mark: "character", + intro: { + content: "决定帮助$,具体帮不帮另说", + }, + }, + }, + }, + lieyi: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.getExpansions("xunli").length > 0; + }, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + var cards = player.getExpansions("xunli"); + var cards2 = cards.filter(function (card) { + return target.isIn() && player.canUse(card, target, false); + }); + if (cards2.length) { + player.chooseButton(["对" + get.translation(target) + "使用一张牌", cards2], true).set("ai", function (button) { + return get.order(button.link); + }); + } else { + event.finish(); + if (cards.length) player.loseToDiscardpile(cards); + if ( + target.isIn() && + !target.hasHistory("damage", function (evt) { + return evt.getParent("lieyi") == event && evt._dyinged; + }) + ) + player.loseHp(); + } + "step 1"; + player.useCard(result.links[0], target, false); + event.goto(0); + }, + ai: { + order: 2, + result: { + target: function (player, target) { + var cards = player.getExpansions("xunli"); + var effect = 0, + damage = 0; + for (var i of cards) { + if (player.canUse(i, target, false)) { + effect += get.effect(target, i, player, target); + damage += get.tag(i, "damage"); + } + } + if (damage >= target.hp) return effect; + if (player.hp > 2 && cards.length > 3) return effect / 3; + return 0; + }, + }, + combo: "xunli", + }, + }, + //马日磾 + bingjie: { + trigger: { player: "phaseUseBegin" }, + check: function (event, player) { + return ( + player.maxHp > 3 && + player.isDamaged() && + player.hasCard(function (card) { + return ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) < 0 && player.canUse(card, current, null, true) && get.effect(current, card, player, player) > 0; + }) && player.hasValueTarget(card) + ); + }, "hs") + ); + }, + content: function () { + "step 0"; + player.loseMaxHp(); + "step 1"; + player.addTempSkill("bingjie_effect"); + game.delayx(); + }, + subSkill: { + effect: { + audio: "bingjie", + trigger: { player: "useCardToPlayered" }, + forced: true, + charlotte: true, + logTarget: "target", + filter: function (event, player) { + return event.target != player && (event.card.name == "sha" || get.type(event.card, false) == "trick") && event.target.countCards("he") > 0; + }, + content: function () { + "step 0"; + trigger.target.chooseToDiscard("he", true); + "step 1"; + if (result.bool && result.cards.length && get.color(result.cards[0], trigger.target) == get.color(trigger.card)) { + game.log(trigger.target, "不能响应", trigger.card); + trigger.directHit.push(trigger.target); + } + }, + ai: { + effect: { + player: function (card, player, target) { + if (player !== target && get.itemtype(target) === "player" && (card.name === "sha" || get.type(card, false) === "trick") && target.countCards("he") && !target.hasSkillTag("noh")) return [1, 0, 1, -1]; + }, + }, + }, + }, + }, + }, + zhengding: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (!Array.isArray(event.respondTo)) return false; + if (player == event.respondTo[0]) return false; + var color = get.color(event.card); + if (color == "none") return false; + return color == get.color(event.respondTo[1]); + }, + content: function () { + player.gainMaxHp(); + player.recover(); + }, + }, + //孙茹 + xiecui: { + audio: 2, + trigger: { global: "damageBegin1" }, + filter: function (event, player) { + var source = event.source; + if (!source || source != _status.currentPhase || event.getParent().type != "card") return false; + return !source.hasHistory("sourceDamage", function (evt) { + return evt.getParent().type == "card"; + }); + }, + logTarget: "source", + prompt2: function (event, player) { + var str = "令" + get.translation(event.player) + "即将受到的"; + str += "" + event.num + "点"; + if (event.hasNature("linked")) { + str += get.translation(event.nature) + "属性"; + } + str += "伤害+1"; + if (event.source.group == "wu") { + var cards = event.cards.filterInD(); + if (cards.length) { + str += ";然后" + get.translation(event.source) + "获得" + get.translation(cards) + ",且本回合的手牌上限+1"; + } + } + return str; + }, + check: function (event, player) { + var att = get.attitude(player, event.player); + if (att < 0) { + if (event.source.group != "wu" || !event.cards.filterInD().length) return true; + return get.attitude(player, event.source) > 0; + } + return false; + }, + content: function () { + trigger.num++; + var source = trigger.source; + if (source.group == "wu") { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) { + source.gain(cards, "gain2"); + source.addMark("xiecui_effect", 1, false); + source.addTempSkill("xiecui_effect"); + } + } + }, + subSkill: { + effect: { + charlotte: true, + mod: { + maxHandcard: (player, num) => num + player.countMark("xiecui_effect"), + }, + marktext: "翠", + onremove: true, + intro: { content: "手牌上限+#" }, + }, + }, + ai: { threaten: 1.75 }, + }, + youxu: { + audio: 2, + trigger: { global: "phaseEnd" }, + logTarget: "player", + filter: function (event, player) { + return event.player.countCards("h") > event.player.hp; + }, + check: function (event, player) { + if (get.attitude(player, event.player) <= 0) return true; + else + return game.hasPlayer(function (current) { + return current != event.player && current.isDamaged() && current.isMinHp() && get.attitude(player, current) > 0 && get.recoverEffect(current, player, player) > 0; + }); + }, + content: function () { + "step 0"; + if (player == trigger.player) { + player.chooseCard("h", true, "请展示一张手牌"); + } else { + player.choosePlayerCard(trigger.player, true, "h"); + } + "step 1"; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + var str = get.translation(player); + if (player != trigger.player) str += "对" + get.translation(trigger.player); + str += "发动了【忧恤】"; + player.showCards(card, str); + player + .chooseTarget("令一名角色获得" + get.translation(card), "若其体力值为全场最少,则其回复1点体力", function (card, player, target) { + return target != _status.event.getTrigger().player; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att < 0) return 0; + if (target.isDamaged() && target.isMinHp && get.recoverEffect(target, player, player) > 0) return 4 * att; + return att; + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.gain(card, trigger.player, "give").giver = player; + } else event.finish(); + "step 3"; + if (target.isMinHp()) target.recover(); + }, + }, + //夏侯令女 + fuping: { + audio: 2, + hiddenCard: function (player, name) { + var list = player.getStorage("fuping").slice(0); + list.removeArray(player.getStorage("fuping_round")); + return list.includes(name) && player.hasCard(card => get.type(card) != "basic", "ehs"); + }, + enable: "chooseToUse", + locked: false, + filter: function (event, player) { + var list = player.getStorage("fuping").slice(0); + list.removeArray(player.getStorage("fuping_round")); + if (!list.length) return false; + if (!player.hasCard(card => get.type(card) != "basic", "ehs")) return false; + for (var i of list) { + var type = get.type2(i, false); + 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 = player.getStorage("fuping").slice(0); + list.removeArray(player.getStorage("fuping_round")); + var list2 = []; + for (var i of list) { + var type = get.type2(i, false); + if ((type == "basic" || type == "trick") && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) list2.push([type, "", i]); + } + return ui.create.dialog("浮萍", [list2, "vcard"]); + }, + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + return _status.event.player.getUseValue({ name: button.link[2] }, null, true); + }, + backup: function (links, player) { + return { + audio: "fuping", + filterCard: card => get.type(card) != "basic", + position: "he", + popname: true, + viewAs: { + name: links[0][2], + }, + check: function (card) { + return 8 - get.value(card); + }, + precontent: function () { + player.addTempSkill("fuping_round"); + player.markAuto("fuping_round", [event.result.card.name]); + }, + }; + }, + prompt: function (links, player) { + return "将一张非基本牌当做【" + get.translation(links[0][2]) + "】使用"; + }, + }, + ai: { + order: 8, + result: { player: 1 }, + respondSha: true, + skillTagFilter: function (player) { + var list = player.getStorage("fuping").slice(0); + list.removeArray(player.getStorage("fuping_round")); + return list.includes("sha"); + }, + }, + mod: { + targetInRange: function (card, player, target) { + if (!player.hasEnabledSlot()) return true; + }, + }, + marktext: "萍", + intro: { content: "已记录$" }, + group: "fuping_mark", + subSkill: { + mark: { + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return player != event.player && event.targets.includes(player) && player.hasEnabledSlot() && !player.getStorage("fuping").includes(event.card.name); + }, + logTarget: "player", + prompt2: event => "废除一个装备栏并记录【" + get.translation(event.card.name) + "】", + check: function (event, player) { + var list = ["tao", "juedou", "guohe", "shunshou", "wuzhong", "xietianzi", "yuanjiao", "wanjian", "nanman", "huoshaolianying", "chuqibuyi", "zhujinqiyuan", "lebu", "bingliang"]; + if (!list.includes(event.card.name)) return false; + if (["nanman", "wanjian"].includes(event.card.name) && !player.hasValueTarget({ name: event.card.name })) return false; + var list = [3, 5, 4, 1, 2]; + for (var i of list) { + if (player.hasEnabledSlot(i)) { + var card = player.getEquip(i); + if (!card || player.hasEmptySlot(i)) return true; + if (get.value(card, player) <= 0) return true; + } + } + return false; + }, + content: function () { + player.markAuto("fuping", [trigger.card.name]); + game.log(player, "记录了", "#y" + get.translation(trigger.card.name)); + player.chooseToDisable().set("ai", function (event, player, list) { + var list = [3, 5, 4, 1, 2]; + for (var i of list) { + if (player.hasEnabledSlot(i)) { + var card = player.getEquip(i); + if (!card || player.hasEmptySlot(i)) return "equip" + i; + if (get.value(card, player) <= 0) return "equip" + i; + } + } + return list.randomGet(); + }); + }, + }, + backup: { audio: "fuping" }, + round: { charlotte: true, onremove: true }, + }, + }, + weilie: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countMark("weilie") <= player.getStorage("fuping").length && player.countCards("he") > 0 && game.hasPlayer(current => current.isDamaged()); + }, + filterCard: true, + position: "he", + filterTarget: (card, player, target) => target.isDamaged(), + check: function (card) { + return 8 - get.value(card); + }, + content: function () { + "step 0"; + player.addMark("weilie", 1, false); + target.recover(); + "step 1"; + if (target.isDamaged()) target.draw(); + }, + onremove: true, + ai: { + order: 1, + result: { + player: function (player, target) { + var eff = get.recoverEffect(target, player, player); + if (target.getDamagedHp() > 1) eff += get.effect(target, { name: "draw" }, player, player); + return eff; + }, + }, + }, + }, + //张瑶 + //Partly powered by 烟雨墨染 + yuanyu: { + audio: 2, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (player.countCards("h") > 0 && game.hasPlayer(current => current != player)) { + var suits = lib.suit.slice(0), + cards = player.getExpansions("yuanyu"); + for (var i of cards) suits.remove(get.suit(i, false)); + var str = "选择一张手牌,作为“怨”置于武将牌上;同时选择一名其他角色,令该角色获得〖怨语〗的后续效果。"; + if (suits.length) { + str += "目前“怨”中未包含的花色:"; + for (var i of suits) str += get.translation(i); + } + player.chooseCardTarget({ + filterCard: true, + filterTarget: lib.filter.notMe, + position: "h", + prompt: "怨语:选择置于武将牌上的牌和目标", + prompt2: str, + suits: suits, + forced: true, + ai1: function (card) { + var val = get.value(card), + evt = _status.event; + if (evt.suits.includes(get.suit(card, false))) return 8 - get.value(card); + return 5 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + if (player.storage.yuanyu_damage && player.storage.yuanyu_damage.includes(target)) return 0; + return -get.attitude(player, target); + }, + }); + } else event.finish(); + "step 2"; + var target = result.targets[0]; + player.addSkill("yuanyu_damage"); + player.markAuto("yuanyu_damage", result.targets); + player.line(target, "green"); + if (!target.storage.yuanyu_mark) { + target.storage.yuanyu_mark = player; + target.markSkillCharacter("yuanyu_mark", player, "怨语", "已获得〖怨语〗效果"); + target.addSkill("yuanyu_mark"); + } + player.addToExpansion(result.cards, player, "give").gaintag.add("yuanyu"); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + player.removeSkill("yuanyu_damage"); + }, + ai: { + order: 7, + result: { + player: 1, + }, + }, + subSkill: { + mark: { + mark: "character", + charlotte: true, + intro: { + content: "已获得〖怨语〗效果", + onunmark: true, + }, + }, + damage: { + trigger: { global: ["damageSource", "phaseDiscardBegin"] }, + forced: true, + charlotte: true, + onremove: function (player, skill) { + if (player.storage[skill]) { + for (var i of player.storage[skill]) { + if (i.storage.yuanyu_mark == player) i.unmarkSkill("yuanyu_mark"); + } + } + delete player.storage[skill]; + }, + filter: function (event, player) { + if (event.name == "damage") { + var source = event.source; + return source && player.getStorage("yuanyu_damage").includes(source) && source.countCards("h") > 0; + } else { + if (player == event.player) { + return player.getStorage("yuanyu_damage").some(function (target) { + return target.isIn() && target.countCards("h") > 0; + }); + } else if (player.getStorage("yuanyu_damage").includes(event.player)) { + return event.player.countCards("h") > 0; + } + return false; + } + }, + content: function () { + "step 0"; + if (trigger.name == "phaseDiscard") { + if (trigger.player == player) { + event.targets = player + .getStorage("yuanyu_damage") + .filter(function (target) { + return target.isIn() && target.countCards("h") > 0; + }) + .sortBySeat(); + } else event.targets = [trigger.player]; + } else event.targets = [trigger.source]; + "step 1"; + event.target = event.targets.shift(); + event.count = trigger.name == "damage" ? trigger.num : 1; + "step 2"; + event.count--; + var suits = lib.suit.slice(0), + cards = player.getExpansions("yuanyu"); + for (var i of cards) suits.remove(get.suit(i, false)); + var next = target.chooseCard("h", true, "将一张手牌置于" + get.translation(player) + "的武将牌上"); + next.set("suits", suits); + next.set("ai", function (card) { + var val = get.value(card), + evt = _status.event; + if (evt.suits.includes(get.suit(card, false))) return 5 - get.value(card); + return 8 - get.value(card); + }); + if (suits.length) { + var str = "目前未包含的花色:"; + for (var i of suits) str += get.translation(i); + next.set("prompt2", str); + } + "step 3"; + player.addToExpansion(result.cards, target, "give").gaintag.add("yuanyu"); + "step 4"; + if (!player.hasSkill("yuanyu_damage")) event.finish(); + else if (event.count > 0 && target.countCards("h") > 0) event.goto(2); + else if (event.targets.length > 0) event.goto(1); + }, + }, + }, + }, + xiyan: { + audio: 2, + trigger: { player: "addToExpansionAfter" }, + filter: function (event, player) { + if (!event.gaintag.includes("yuanyu")) return false; + var cards = player.getExpansions("yuanyu"); + if (cards.length < lib.suit.length) return false; + var suits = lib.suit.slice(0); + for (var i of cards) { + suits.remove(get.suit(i)); + if (!suits.length) return true; + } + return false; + }, + logTarget: () => _status.currentPhase, + prompt2: "获得所有“怨”", + check: () => true, + content: function () { + "step 0"; + player.removeSkill("yuanyu_damage"); + var cards = player.getExpansions("yuanyu"); + player.gain(cards, "gain2"); + "step 1"; + var target = _status.currentPhase; + if (player == target) { + player.addMark("xiyan_buff", 4, false); + player.addTempSkill("xiyan_buff"); + delete player.getStat("skill").yuanyu; + event.finish(); + } else { + player + .chooseBool("夕颜:是否令" + get.translation(target) + "本回合的手牌上限-4且不能使用基本牌?") + .set("ai", function () { + return _status.event.bool; + }) + .set("bool", get.attitude(player, target) < 0); + } + "step 2"; + if (result.bool) { + var target = _status.currentPhase; + target.addMark("xiyan_debuff", 4, false); + target.addTempSkill("xiyan_debuff"); + } + }, + subSkill: { + buff: { + charlotte: true, + mark: true, + marktext: " + ", + intro: { + content: "本回合手牌上限+#且使用牌无次数限制", + }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("xiyan_buff"); + }, + cardUsable: function (card, player) { + return Infinity; + }, + }, + sub: true, + }, + debuff: { + charlotte: true, + mark: true, + marktext: " - ", + intro: { + content: "本回合手牌上限-#且不能使用基本牌", + }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("xiyan_debuff"); + }, + cardEnabled: function (card) { + if (get.type(card) == "basic") return false; + }, + cardSavable: function (card) { + if (get.type(card) == "basic") return false; + }, + }, + sub: true, + }, + }, + ai: { + combo: "yuanyu", + }, + }, + //滕胤 + chenjian: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + prompt2: function (event, player) { + return "亮出牌堆顶的" + get.cnNumber(3 + player.countMark("chenjian")) + "张牌,然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌"; + }, + content: function () { + "step 0"; + var cards = get.cards(3 + player.countMark("chenjian")); + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【陈见】"); + "step 1"; + var list = []; + if ( + player.countCards("he", i => { + return lib.filter.cardDiscardable(i, player, "chenjian"); + }) + ) + list.push("选项一"); + if ( + event.cards.some(i => { + return player.hasUseTarget(i); + }) + ) + list.push("选项二"); + if (list.length === 1) event._result = { control: list[0] }; + else if (list.length > 1) + player + .chooseControl(list) + .set("choiceList", ["弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌", "使用" + get.translation(event.cards) + "中的一张牌"]) + .set("prompt", "陈见:请选择一项") + .set("ai", () => { + let player = _status.event.player, + cards = _status.event.getParent().cards; + if ( + cards.some(i => { + return player.getUseValue(i) > 0; + }) + ) + return "选项二"; + return "选项一"; + }); + else event.finish(); + "step 2"; + event.goon = 0; + event.choosed = result.control; + if (result.control === "cancel2") event.finish(); + else if (result.control === "选项二") event.goto(6); + "step 3"; + if ( + player.countCards("he", i => { + return lib.filter.cardDiscardable(i, player, "chenjian"); + }) + ) + player + .chooseToDiscard("he", !event.goon) + .set("ai", function (card) { + let evt = _status.event.getParent(), + val = event.goon && evt.player.countMark("chenjian") < 2 ? 0 : -get.value(card), + suit = get.suit(card); + for (let i of evt.cards) { + if (get.suit(i, false) == suit) val += get.value(i, "raw"); + } + return val; + }) + .set("prompt", "陈见:" + (event.goon ? "是否" : "请") + "弃置一张牌,然后令一名角色获得" + get.translation(event.cards) + "中花色与之相同的牌" + (event.goon ? "?" : "")); + else if (event.choosed === "选项一") event.goto(6); + else event.finish(); + "step 4"; + if (result.bool) { + event.goon++; + var suit = get.suit(result.cards[0], player); + var cards2 = event.cards.filter(function (i) { + return get.suit(i, false) == suit; + }); + if (cards2.length) { + event.cards2 = cards2; + player.chooseTarget(true, "选择一名角色获得" + get.translation(cards2)).set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) { + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }); + } else if (event.choosed === "选项一") event.goto(6); + else event.goto(8); + } else event.finish(); + "step 5"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(event.cards2, "gain2"); + event.cards.removeArray(event.cards2); + } + if (event.choosed === "选项二") event.goto(8); + "step 6"; + var cards2 = cards.filter(function (i) { + return player.hasUseTarget(i); + }); + if (cards2.length) + player.chooseButton(["陈见:" + (event.goon ? "是否" : "请") + "使用其中一张牌" + (event.goon ? "?" : ""), cards2], !event.goon).set("ai", function (button) { + return player.getUseValue(button.link); + }); + else if (event.choosed === "选项二") event.goto(3); + else event.finish(); + "step 7"; + if (result.bool) { + player.chooseUseTarget(true, result.links[0], false); + event.cards.removeArray(result.links); + event.goon += 2; + if (event.choosed === "选项二") event.goto(3); + } else event.finish(); + "step 8"; + if (event.goon > 2) { + if (player.countMark("chenjian") < 2) player.addMark("chenjian", 1, false); + player.recast(player.getCards("h", lib.filter.cardRecastable)); + } + }, + marktext: "见", + intro: { content: "展示牌数量+#" }, + }, + xixiu: { + mod: { + canBeDiscarded: function (card, player, target) { + if (player != target && get.position(card) == "e" && target.countCards("e") == 1) return false; + }, + }, + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + if (player == event.player || !player.countCards("e")) return false; + var suit = get.suit(event.card, false); + if (suit == "none") return false; + return player.hasCard(function (card) { + return get.suit(card, player) == suit; + }, "e"); + }, + content: function () { + player.draw(); + }, + ai: { + effect: { + target: function (card, player, target) { + if (typeof card == "object" && player != target) { + var suit = get.suit(card); + if (suit == "none") return; + if ( + player.hasCard(function (card) { + return get.suit(card, player) == suit; + }, "e") + ) + return [1, 0.08]; + } + }, + }, + }, + }, + //张嫙 + tongli: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget || (event.card.storage && event.card.storage.tongli)) return false; + var type = get.type(event.card); + if (type != "basic" && type != "trick") return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var num1 = player.getHistory("useCard", function (evtx) { + if (evtx.getParent("phaseUse") != evt) return false; + return !evtx.card.storage || !evtx.card.storage.tongli; + }).length; + if (hs.length < num1) return false; + var list = []; + for (var i of hs) list.add(get.suit(i, player)); + return list.length == num1; + }, + prompt2: function (event, player) { + var evt = event.getParent("phaseUse"); + var num = player.getHistory("useCard", function (evtx) { + if (evtx.getParent("phaseUse") != evt) return false; + return !evtx.card.storage || !evtx.card.storage.tongli; + }).length; + //var str='视为额外使用'+get.cnNumber(num)+'张' + var str = "额外结算" + get.cnNumber(num) + "次"; + if (event.card.name == "sha" && game.hasNature(event.card)) str += get.translation(event.card.nature); + return str + "【" + get.translation(event.card.name) + "】"; + }, + check: function (event, player) { + return !get.tag(event.card, "norepeat"); + }, + content: function () { + //player.addTempSkill('tongli_effect'); + var evt = trigger.getParent("phaseUse"); + var num = player.getHistory("useCard", function (evtx) { + if (evtx.getParent("phaseUse") != evt) return false; + return true; + //return !evtx.card.storage||!evtx.card.storage.tongli; + }).length; + trigger.getParent().effectCount += num; + }, + /*subSkill:{ + effect:{ + trigger:{player:'useCardAfter'}, + forced:true, + charlotte:true, + filter:function(event,player){ + return event.tongli_effect!=undefined; + }, + content:function(){ + 'step 0' + event.card=trigger.tongli_effect[0]; + event.count=trigger.tongli_effect[1]; + 'step 1' + event.count--; + for(var i of trigger.targets){ + if(!i.isIn()||!player.canUse(card,i,false)) return; + } + if(trigger.addedTarget&&!trigger.addedTarget.isIn()) return; + if(trigger.addedTargets&&trigger.addedTargets.length){ + for(var i of trigger.addedTargets){ + if(!i.isIn()) return; + } + } + var next=player.useCard(get.copy(card),trigger.targets,false); + if(trigger.addedTarget) next.addedTarget=trigger.addedTarget; + if(trigger.addedTargets&&trigger.addedTargets.length) next.addedTargets=trigger.addedTargets.slice(0); + if(event.count>0) event.redo(); + }, + }, + },*/ + }, + shezang: { + audio: 2, + round: 1, + trigger: { global: "dying" }, + frequent: true, + filter: function (event, player) { + return event.player == player || player == _status.currentPhase; + }, + content: function () { + var cards = []; + for (var i of lib.suit) { + var card = get.cardPile2(function (card) { + return get.suit(card, false) == i; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + }, + }, + //王桃王悦 + huguan: { + audio: 2, + audioname: ["wangyue"], + init: function (player) { + game.addGlobalSkill("huguan_all"); + }, + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + if (get.color(event.card, false) != "red") return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + event.player + .getHistory("useCard", function (event) { + return event.getParent("phaseUse") == evt; + }) + .indexOf(event) == 0 + ); + }, + content: function () { + "step 0"; + player + .chooseControl(lib.suit, "cancel2") + .set("prompt", get.prompt("huguan", trigger.player)) + .set("prompt2", "令某种花色的手牌不计入其本回合的手牌上限") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player, + att = get.attitude(player, target); + if (att <= 0) { + if ( + !player.hasSkill("yaopei") || + player.hasHistory("useSkill", function (evt) { + return evt.skill == "huguan" && evt.targets.includes(target); + }) || + target.needsToDiscard() - target.needsToDiscard(-target.countCards("h") / 4) > (att > -2 ? 1.6 : 1) + ) + return "cancel2"; + } + let list = lib.suit.slice(0); + if (att <= 0 && target.getStorage("huguan_add")) + for (let i of target.getStorage("huguan_add")) { + if (list.includes(i)) return i; + } + list.removeArray(target.getStorage("huguan_add")); + if (list.length) return list.randomGet(); + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + var target = trigger.player; + player.logSkill("huguan", target); + game.log(player, "选择了", "#g" + get.translation(result.control), "花色"); + target.addTempSkill("huguan_add"); + target.markAuto("huguan_add", [result.control]); + } + }, + subSkill: { + add: { + charlotte: true, + onremove: true, + mod: { + ignoredHandcard: function (card, player) { + if (player.getStorage("huguan_add").includes(get.suit(card, player))) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && player.getStorage("huguan_add").includes(get.suit(card, player))) return false; + }, + }, + intro: { content: "本回合$花色的牌不计入手牌上限" }, + }, + all: { + mod: { + aiValue: function (player, card, num) { + if (player && player.storage.huguan_all > 0 && get.itemtype(card) == "card" && get.color(card, player) == "red") return num + player.storage.huguan_all; + }, + }, + trigger: { + player: ["phaseUseBegin", "useCard"], + }, + filter: function (event, player) { + if (event.name === "useCard") return player.storage.huguan_all; + return true; + }, + silent: true, + charlotte: true, + content: function () { + "step 0"; + if (trigger.name === "useCard") { + player.storage.huguan_all = 0; + event.finish(); + } + "step 1"; + let num = -157; + game.countPlayer(function (current) { + if (current.hasSkill("huguan")) num = Math.max(num, get.attitude(_status.event.player, current)); + }, true); + if (num === -157) game.removeGlobalSkill("huguan_all"); + else if (num === 0) player.storage.huguan_all = 6; + else if (num > 0) player.storage.huguan_all = 9; + }, + }, + }, + }, + yaopei: { + audio: 2, + trigger: { global: "phaseDiscardEnd" }, + direct: true, + filter: function (event, player) { + if (player == event.player || !event.player.isIn()) return false; + if ( + !player.hasAllHistory("useSkill", function (evt) { + return evt.skill == "huguan" && evt.targets.includes(event.player); + }) + ) + return false; + var suits = []; + event.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) { + for (var i of evt.cards2) suits.add(get.suit(i, evt.hs.includes(i) ? evt.player : false)); + } + }); + if (suits.length >= lib.suit.length) return false; + if (_status.connectMode && player.countCards("h") > 0) return true; + return player.hasCard(function (card) { + return !suits.includes(get.suit(card)); + }, "he"); + }, + content: function () { + "step 0"; + var suits = []; + trigger.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) { + for (var i of evt.cards2) suits.add(get.suit(i, evt.hs.includes(i) ? evt.player : false)); + } + }); + player.chooseCardTarget({ + prompt: get.prompt("yaopei", trigger.player), + prompt2: "操作提示:选择要弃置的牌,并选择执行摸牌选项的角色,另一名角色执行回复体力的选项。", + suits: suits, + position: "he", + filterCard: function (card, player) { + return !_status.event.suits.includes(get.suit(card)) && lib.filter.cardDiscardable(card, player, "yaopei"); + }, + filterTarget: function (card, player, target) { + return target == player || target == _status.event.getTrigger().player; + }, + ai1: function (card) { + let player = _status.event.player, + source = _status.event.getTrigger().player; + if (get.attitude(player, source) > 0 && (get.recoverEffect(player, player, player) > 0 || get.recoverEffect(source, player, player) > 0)) return 12 - get.value(card); + return 8 - get.value(card); + }, + ai2: function (target) { + let player = _status.event.player, + source = _status.event.getTrigger().player; + let recoverer = player === target ? source : player; + if (recoverer.isHealthy()) return get.attitude(player, target); + let att = get.attitude(player, recoverer), + rec = get.recoverEffect(recoverer, player, player); + if (rec > 0) return Math.abs(att) + get.attitude(player, target); + return 0; + }, + }); + "step 1"; + if (result.bool) { + var target = trigger.player; + player.logSkill("yaopei", target); + player.discard(result.cards); + if (player == result.targets[0]) { + if (target.isDamaged() && target.hp < player.hp && (get.mode() != "identity" || player.identity != "nei")) player.addExpose(0.15); + target.recover(); + player.draw(2); + } else { + if ((player.isHealthy() || player.hp > target.hp) && (get.mode() != "identity" || player.identity != "nei")) player.addExpose(0.15); + target.draw(2); + player.recover(); + } + } + }, + ai: { + combo: "huguan", + }, + }, + mingluan: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player != event.player && event.player.isIn() && player.hasSkill("mingluan_mark") && player.countCards("he") > 0; + }, + content: function () { + "step 0"; + let he = player.getCards("he"), + disval = 0, + dis = 0, + spare = 30, + use = true; + for (let i of he) { + let val = get.value(i, player); + if (val < 6 && get.position(i) == "h") { + dis++; + disval += val; + } else if (val < spare) spare = val; + } + if (!dis) { + dis = 1; + disval = spare; + spare = -1; + } + let draw = Math.min(trigger.player.countCards("h"), 5 + dis - player.countCards("h")); + if (6 * draw < disval) use = false; + player + .chooseToDiscard("he", get.prompt("mingluan"), "弃置任意张牌,并摸等同于" + get.translation(trigger.player) + "手牌数的牌(至多摸至五张)", [1, Infinity]) + .set("ai", function (card) { + let val = get.value(card, player); + if (val < 0 && card.name !== "du") return 30; + if (!_status.event.use) return 0; + if (ui.selected.cards.length) { + if (get.position(card) !== "h") return 0; + return 6 - val; + } + if (_status.event.spare < 0 || get.position(card) === "h") return 30 - val; + return 0; + }) + .set("spare", spare) + .set("use", use).logSkill = ["mingluan", trigger.player]; + "step 1"; + if (result.bool) { + var num = trigger.player.countCards("h"), + num2 = 5 - player.countCards("h"); + if (num > 0 && num2 > 0) player.draw(Math.min(num, num2)); + } + }, + group: "mingluan_count", + subSkill: { + count: { + charlotte: true, + trigger: { global: "recoverEnd" }, + silent: true, + popup: false, + firstDo: true, + filter: function (event, player) { + var current = _status.currentPhase; + return current && current != player && !player.hasSkill("mingluan_mark"); + }, + content: function () { + player.addTempSkill("mingluan_mark"); + }, + }, + mark: { + charlotte: true, + }, + }, + }, + //赵嫣 + jinhui: { + audio: 2, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + var cards = []; + while (cards.length < 3) { + var card = get.cardPile2(function (card) { + for (var i of cards) { + if (i.name == card.name) return false; + } + var info = get.info(card, false); + if (info.ai && info.ai.tag && info.ai.tag.damage) return false; + return !info.notarget && (info.toself || info.singleCard || !info.selectTarget || info.selectTarget == 1); + }); + if (card) cards.push(card); + else break; + } + if (!cards.length) event.finish(); + else { + player.showCards(cards, get.translation(player) + "发动了【锦绘】"); + event.cards = cards; + game.cardsGotoOrdering(cards); + if (game.hasPlayer(current => current != player)) + player.chooseTarget("选择【锦绘】的目标", true, lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + cards = _status.event.getParent().cards.slice(0); + var max_effect = 0, + max_effect_player = 0; + for (var i of cards) { + var targetx = lib.skill.jinhui.getUsableTarget(i, target, player); + if (targetx) { + var effect2 = get.effect(targetx, i, target, target); + var effect3 = get.effect(targetx, i, target, player); + if (effect2 > max_effect) { + max_effect = effect2; + max_effect_player = effect3; + } + } + } + return max_effect_player; + }); + else event.finish(); + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var cards = cards.filter(function (card) { + return lib.skill.jinhui.getUsableTarget(card, target, player); + }); + if (cards.length) { + if (cards.length == 1) event._result = { bool: true, links: cards }; + else + target.chooseButton(["选择按“锦绘”规则使用一张牌", cards], true).set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().player, + card = button.link; + var targetx = lib.skill.jinhui.getUsableTarget(card, player, target); + var effect = get.effect(targetx, card, player, player), + cards = _status.event.getParent().cards.slice(0); + var effect2 = 0, + effect3 = 0; + cards.remove(button.link); + for (var i of cards) { + var targetx = lib.skill.jinhui.getUsableTarget(i, target, player); + if (targetx) { + effect2 += get.effect(targetx, i, target, target); + effect3 += get.effect(targetx, i, target, player); + } + } + if (effect2 > 0) effect += effect3; + return effect; + }); + } else event.goto(3); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.links[0]; + event.cards.remove(card); + var targetx = lib.skill.jinhui.getUsableTarget(card, target, player); + target.useCard(card, targetx, false, "noai"); + } + "step 3"; + var cards = cards.filter(function (card) { + return lib.skill.jinhui.getUsableTarget(card, player, target); + }); + if (cards.length) { + player.chooseButton(["是否按“锦绘”规则使用其中一张牌?", cards]).set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target; + var card = button.link, + targetx = lib.skill.jinhui.getUsableTarget(card, player, target); + return get.effect(targetx, card, player, player); + }); + } else event.finish(); + "step 4"; + if (result.bool) { + var card = result.links[0]; + cards.remove(card); + var targetx = lib.skill.jinhui.getUsableTarget(card, player, target); + if (targetx) { + player.useCard(card, targetx, false, "noai"); + } + if (cards.length) event.goto(3); + } else event.finish(); + }, + getUsableTarget: function (card, player, target) { + var info = get.info(card, false); + if (info.toself) return player.canUse(card, player, false) ? player : false; + return target.isIn() && player.canUse(card, target, false) ? target : false; + }, + ai: { + order: 5, + result: { player: 1 }, + }, + }, + qingman: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + if (!event.player.isIn()) return false; + var num = player.countCards("h"); + if (num >= 5) return false; + var num2 = 0; + for (var i = 1; i <= 5; i++) { + num2 += event.player.countEmptySlot(i); + } + return num < num2; + }, + content: function () { + var num2 = 0; + for (var i = 1; i <= 5; i++) { + num2 += trigger.player.countEmptySlot(i); + } + player.drawTo(num2); + }, + }, + //何晏 + yachai: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source && event.source.isIn(); + }, + logTarget: "source", + check: function (event, player) { + return get.attitude(player, event.source) < 0; + }, + content: function () { + "step 0"; + var target = trigger.source, + str = get.translation(player); + event.target = target; + var th = target.countCards("h"); + if (th > 0) { + event.num = Math.ceil(th / 2); + var list = ["本回合不能使用手牌,然后" + str + "摸两张牌", "展示所有手牌,并将其中一种花色的所有牌交给" + str, "弃置" + get.cnNumber(event.num) + "张手牌"]; + target + .chooseControl() + .set("choiceList", list) + .set("ai", function () { + return get.rand(0, 2); + }); + } else event._result = { index: 0 }; + "step 1"; + switch (result.index) { + case 0: + target.addTempSkill("yachai_block"); + player.draw(2); + event.finish(); + break; + case 1: + target.showHandcards(); + break; + case 2: + event.goto(4); + break; + } + "step 2"; + var map = {}, + hs = target.getCards("h"); + for (var i of hs) { + map[get.suit(i, target)] = true; + } + var list = []; + for (var i of lib.suit) { + if (map[i]) list.push(i); + } + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { control: list[0] }; + else target.chooseControl(list).set("prompt", "将一种花色的牌交给" + get.translation(player)); + "step 3"; + var cards = target.getCards("h", function (card) { + return get.suit(card, target) == result.control && lib.filter.cardDiscardable(card, target, "yachai"); + }); + if (cards.length) target.give(cards, player, "give"); + event.finish(); + "step 4"; + target.chooseToDiscard("h", true, num); + }, + subSkill: { + block: { + mark: true, + intro: { content: "不能使用手牌" }, + charlotte: true, + mod: { + cardEnabled: function (card, player) { + let hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (let i of cards) { + if (hs.includes(i)) return false; + } + }, + cardSavable: function (card, player) { + let hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (let i of cards) { + if (hs.includes(i)) return false; + } + }, + }, + }, + }, + }, + qingtan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => current.countCards("h") > 0); + }, + filterTarget: function (card, player, target) { + return target.countCards("h") > 0; + }, + selectTarget: -1, + multitarget: true, + multiline: true, + content: function () { + "step 0"; + targets.sortBySeat(); + var next = player + .chooseCardOL(targets, "请选择要展示的牌", true) + .set("ai", function (card) { + return -get.value(card); + }) + .set("source", player); + next.aiCard = function (target) { + var hs = target.getCards("h"); + return { bool: true, cards: [hs.randomGet()] }; + }; + next._args.remove("glow_result"); + "step 1"; + var cards = []; + event.videoId = lib.status.videoId++; + for (var i = 0; i < targets.length; i++) cards.push(result[i].cards[0]); + event.cards = cards; + game.log(player, "展示了", targets, "的", cards); + game.broadcastAll( + function (targets, cards, id, player) { + var dialog = ui.create.dialog(get.translation(player) + "发动了【清谈】", cards); + dialog.videoId = id; + var getName = function (target) { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + }; + for (var i = 0; i < targets.length; i++) { + dialog.buttons[i].querySelector(".info").innerHTML = getName(targets[i]) + get.translation(cards[i].suit); + } + }, + targets, + cards, + event.videoId, + player + ); + game.delay(4); + "step 2"; + game.broadcastAll("closeDialog", event.videoId); + var list = [], + map = {}; + for (var i of cards) { + var suit = get.suit(i); + if (!map[suit]) map[suit] = []; + map[suit].push(i); + } + var dialog = ["选择获得一种花色的所有牌"]; + for (var suit of lib.suit) { + if (map[suit]) { + var targetsx = map[suit].map(function (card) { + return targets[cards.indexOf(card)]; + }); + dialog.push('
    ' + get.translation(targetsx) + "
    "); + dialog.push(map[suit]); + list.push(suit); + } + } + if (list.length) + player + .chooseControl(list, "cancel2") + .set("dialog", dialog) + .set("list", list) + .set("map", map) + .set("ai", function () { + let max = 0, + res = "cancel2"; + for (let s of _status.event.list) { + let temp = 0; + for (let i of _status.event.map[s]) { + temp += get.value(i, _status.event.player) + get.sgn(get.attitude(_status.event.player, get.owner(i))) * (6 - get.value(i, get.owner(i))); + } + for (let i in _status.event.map) { + if (i === s) continue; + for (let j of _status.event.map[i]) { + temp -= get.sgn(get.attitude(_status.event.player, get.owner(j))) * get.value(j, get.owner(j)); + } + } + if (temp > max) { + res = s; + max = temp; + } + } + return res; + }); + else event.finish(); + "step 3"; + if (result.control != "cancel2") { + event.cards2 = cards.filter(function (i) { + return get.suit(i) == result.control; + }); + for (var i = 0; i < cards.length; i++) { + if (event.cards2.includes(cards[i])) { + targets[i].$give(cards[i], player, false); + } + } + player.gain(event.cards2, "log"); + } else event.finish(); + "step 4"; + var draws = []; + for (var i = 0; i < cards.length; i++) { + if (!event.cards2.includes(cards[i])) { + targets[i].discard(cards[i]).delay = false; + } else draws.push(targets[i]); + } + if (draws.length) game.asyncDraw(draws); + "step 5"; + game.delayx(); + }, + ai: { + order: 7, + result: { + player: 0.3, + target: -1, + }, + }, + }, + //邓芝 + jianliang: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { + return !player.isMaxHandcard(); + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("jianliang"), "令至多两名角色各摸一张牌", [1, 2]).set("ai", function (target) { + return Math.sqrt(5 - Math.min(4, target.countCards("h"))) * get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("jianliang", targets); + if (targets.length == 1) { + targets[0].draw(); + event.finish(); + } else game.asyncDraw(targets); + } else event.finish(); + "step 2"; + game.delayx(); + }, + }, + weimeng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.hp > 0 && target != player && target.countGainableCards(player, "h") > 0; + }, + content: function () { + "step 0"; + player.gainPlayerCard(target, "h", true, [1, player.hp]); + "step 1"; + if (result.bool && target.isIn()) { + var num = result.cards.length, + hs = player.getCards("he"); + var numx = 0; + for (var i of result.cards) numx += get.number(i, player); + event.num = numx; + event.cards = result.cards; + if (!hs.length) event.finish(); + else if (hs.length <= num) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, "选择交给" + get.translation(target) + get.cnNumber(num) + "张牌", "(已得到牌的点数和:" + numx + ")", num); + } else event.finish(); + "step 2"; + player.give(result.cards, target); + var numx = 0; + for (var i of result.cards) numx += get.number(i, player); + if (numx > num) player.draw(); + else if (numx < num) player.discardPlayerCard(target, true, "hej"); + }, + ai: { + order: 6, + tag: { + lose: 1, + loseCard: 1, + gain: 1, + }, + result: { + target: function (player, target) { + return -Math.pow(Math.min(player.hp, target.countCards("h")), 2) / 4; + }, + }, + }, + }, + //冯熙 + yusui: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return event.player != player && event.player.isIn() && get.color(event.card) == "black"; + }, + logTarget: "player", + check: function (event, player) { + var target = event.player; + if (player.hp < 3 || get.attitude(player, target) > -3) return false; + if (player.hp < target.hp) return true; + if (Math.min(target.countCards("h") - player.countCards("h"), target.countCards("h")) > 3) return true; + return false; + }, + preHidden: true, + content: function () { + "step 0"; + player.loseHp(); + event.target = trigger.player; + "step 1"; + event.addIndex = 0; + var list = [], + num = target.countCards("h") - player.countCards("h"); + event.num = num; + if (num > 0 && target.countCards("h") > 0) list.push("令其弃置" + get.cnNumber(num) + "张手牌"); + else event.addIndex++; + if (target.hp > player.hp) list.push("令其失去" + get.cnNumber(target.hp - player.hp) + "点体力"); + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl() + .set("choiceList", list) + .set("prompt", "令" + get.translation(target) + "执行一项") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + return target.hp - player.hp > Math.min(_status.event.getParent().num, target.countCards("h")) / 2 ? 1 : 0; + }); + "step 2"; + if (result.index + event.addIndex == 0) target.chooseToDiscard(num, true, "h"); + else target.loseHp(target.hp - player.hp); + }, + }, + boyan: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { + "step 0"; + target.drawTo(Math.min(5, target.maxHp)); + "step 1"; + target.addTempSkill("boyan_block"); + }, + subSkill: { + block: { + mark: true, + intro: { content: "不能使用或打出手牌" }, + charlotte: true, + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; + }, + }, + }, + }, + ai: { + order: 4, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0) return Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")); + if ( + Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")) <= 1 && + target.countCards("h", "shan") && + !target.hasSkillTag("respondShan", true, null, true) && + player.countCards("h", function (card) { + return get.tag(card, "respondShan") && player.getUseValue(card, null, true) > 0 && get.effect(target, card, player, player) > 0; + }) + ) + return -2; + }, + }, + }, + }, + //祢衡 + rekuangcai: { + audio: 2, + forced: true, + trigger: { player: "phaseDiscardBegin" }, + filter: function (event, player) { + return !player.getHistory("useCard").length || !player.getHistory("sourceDamage").length; + }, + content: function () { + lib.skill.rekuangcai.change(player, player.getHistory("useCard").length ? -1 : 1); + }, + mod: { + targetInRange: function (card, player) { + if (player == _status.currentPhase) return true; + }, + cardUsable: function (card, player) { + if (player == _status.currentPhase) return Infinity; + }, + }, + change: function (player, num) { + if (typeof player.storage.rekuangcai_change != "number") player.storage.rekuangcai_change = 0; + player.storage.rekuangcai_change += num; + player.addSkill("rekuangcai_change"); + }, + group: "rekuangcai_draw", + subSkill: { + draw: { + audio: "rekuangcai", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.getHistory("sourceDamage").length > 0; + }, + content: function () { + player.draw(Math.min(5, player.getStat("damage"))); + }, + }, + change: { + mod: { + maxHandcard: function (player, num) { + if (typeof player.storage.rekuangcai_change == "number") return num + player.storage.rekuangcai_change; + }, + }, + charlotte: true, + mark: true, + intro: { + content: num => "手牌上限" + (num < 0 ? "" : "+") + num, + }, + }, + }, + }, + reshejian: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + if (player == event.player || event.targets.length != 1) return false; + return player.countCards("h") >= 2; + }, + usable: 2, + async cost(event, trigger, player) { + event.result = await player + .chooseToDiscard("he", [2, Infinity], get.prompt("reshejian", trigger.player), '
    弃置至少两张手牌,然后选择一项:
    ⒈弃置其等量的牌。⒉对其造成1点伤害。
    ') + .set( + "ai", + function (card) { + if (_status.event.goon && ui.selected.cards.length < 2) return 5.6 - get.value(card); + return 0; + }, + "chooseonly" + ) + .set( + "goon", + (function () { + var target = trigger.player; + if (get.damageEffect(target, player, player) > 0) return true; + if ( + target.countCards("he", function (card) { + return get.value(card, target) > 6; + }) >= 2 + ) + return true; + return false; + })() + ) + .forResult(); + }, + logTarget: "player", + content: function () { + "step 0"; + player.discard(cards); + "step 1"; + var num = cards.length; + event.num = num; + var target = targets[0], + str = get.translation(target); + event.target = target; + if (!target.isIn()) event.finish(); + else if ( + !target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ) + event._result = { index: 1 }; + else + player + .chooseControl() + .set("choiceList", ["弃置" + str + "的" + get.cnNumber(num) + "张牌", "对" + str + "造成1点伤害"]) + .set("ai", function () { + var player = _status.event.player; + var eff0 = get.effect(target, { name: "guohe_copy2" }, player, player) * Math.min(1.7, target.countCards("he")); + var eff1 = get.damageEffect(target, player, player); + return eff0 > eff1 ? 0 : 1; + }); + "step 2"; + if (result.index == 0) player.discardPlayerCard(target, num, true, "he"); + else target.damage(); + }, + }, + //陈登 + refuyuan: { + audio: 2, + trigger: { global: "useCardToTargeted" }, + logTarget: "target", + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.target.isIn() && + !game.hasPlayer2(function (current) { + return current.hasHistory("useCard", function (evt) { + return evt.card != event.card && get.color(evt.card, false) == "red" && evt.targets && evt.targets.includes(event.target); + }); + }) + ); + }, + check: function (event, player) { + return get.attitude(player, event.target) > 0; + }, + content: function () { + trigger.target.draw(); + }, + }, + reyingshui: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0 && game.hasPlayer(current => player.inRange(current)); + }, + position: "he", + filterCard: true, + filterTarget: function (card, player, target) { + return player.inRange(target); + }, + discard: false, + lose: false, + delay: false, + check: function (card) { + if (get.type(card) == "equip") return 3 - get.value(card); + return 6.5 - get.value(card); + }, + content: function () { + "step 0"; + player.give(cards, target); + "step 1"; + var next = target.chooseCard("he", [2, Infinity], "交给" + get.translation(player) + "至少两张装备牌,否则受到1点伤害", { type: "equip" }); + if (get.damageEffect(target, player, target) >= 0) next.set("ai", () => -1); + else next.set("ai", card => (ui.selected.cards.length < 2 ? 6 - get.value(card) : 0)); + "step 2"; + if (result.bool) target.give(result.cards, player); + else target.damage("nocard"); + }, + ai: { + order: 5, + tag: { + damage: 0.5, + }, + result: { + target: -1.5, + }, + }, + }, + rewangzu: { + audio: 2, + trigger: { player: "damageBegin1" }, + filter: function (event, player) { + return event.source && player != event.source && player.hasCard(card => lib.filter.cardDiscardable(card, player, "rewangzu"), "h"); + }, + usable: 1, + async cost(event, trigger, player) { + var num = player.getFriends().length; + if ( + !game.hasPlayer(function (current) { + return current != player && current.getFriends().length > num; + }) + ) { + event.result = await player + .chooseToDiscard("h", get.prompt("rewangzu"), "弃置一张牌并令伤害-1", "chooseonly") + .set("ai", function (card) { + return 7 - get.value(card); + }) + .forResult(); + } else { + event.result = await player.chooseBool(get.prompt("rewangzu"), "随机弃置一张牌并令伤害-1").forResult(); + } + }, + async content(event, trigger, player) { + trigger.num--; + if (!event.cards || !event.cards.length) { + const cards = player.getCards("h", card => lib.filter.cardDiscardable(card, player, "rewangzu")); + if (cards.length) player.discard(cards.randomGet()); + } else { + player.discard(event.cards); + } + }, + }, + //万年公主 + zhenge: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("zhenge"), "令一名角色的攻击范围+1").set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att > 0) { + if (!target.hasMark("zhenge_effect")) att *= 1.5; + if ( + !game.hasPlayer(function (current) { + return get.distance(target, current, "attack") > 2; + }) + ) { + var usf = Math.max.apply( + Math, + game.filterPlayer().map(function (current) { + if (target.canUse("sha", current, false)) return get.effect(current, { name: "sha" }, target, player); + return 0; + }) + ); + return att + usf; + } + return att; + } + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("zhenge", target); + target.addSkill("zhenge_effect"); + if (target.countMark("zhenge_effect") < 5) target.addMark("zhenge_effect", 1, false); + if ( + !game.hasPlayer(function (current) { + return current != target && !target.inRange(current); + }) + ) { + player + .chooseTarget("是否令" + get.translation(target) + "视为对另一名角色使用【杀】?", function (card, player, target) { + return _status.event.source.canUse("sha", target); + }) + .set("source", target) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.source, evt.player); + }); + } else { + game.delayx(); + event.finish(); + } + } else event.finish(); + "step 2"; + if (result.bool) { + target.useCard({ name: "sha", isCard: true }, result.targets[0], false); + } + "step 3"; + game.delayx(); + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + mod: { + attackRange: function (player, num) { + return num + player.countMark("zhenge_effect"); + }, + }, + intro: { content: "攻击范围+#" }, + }, + }, + }, + xinghan: { + audio: 2, + init: function (player) { + player.addSkill("xinghan_count"); + }, + onremove: function (player) { + player.removeSkill("xinghan_count"); + }, + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + return event.card && event.card == player.storage.xinghan_temp && event.source && event.source.hasMark("zhenge_effect"); + }, + logTarget: "source", + content: function () { + player.draw(player.isMaxHandcard(true) ? 1 : Math.min(5, trigger.source.getAttackRange())); + }, + subSkill: { + count: { + trigger: { global: "useCard1" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + !game.hasPlayer2(function (current) { + return current.hasHistory("useCard", function (evt) { + return evt != event && evt.card.name == "sha"; + }); + }) + ); + }, + content: function () { + player.addTempSkill("xinghan_temp"); + player.storage.xinghan_temp = trigger.card; + }, + }, + temp: { onremove: true }, + }, + ai: { combo: "zhenge" }, + }, + //荀谌 + refenglve: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + !player.hasSkillTag("noCompareSource") && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0 && !current.hasSkillTag("noCompareTarget"); + }) + ); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0 && !target.hasSkillTag("noCompareTarget"); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + if (!target.countCards("hej")) event.finish(); + else { + // event.giver = target; + // event.gainner = player; + player.gainPlayerCard(target, true, "hej", 2, "获得" + get.translation(target) + "区域里的两张牌"); + } + } else if (result.tie) { + delete player.getStat("skill").refenglve; + if (get.position(result.player, true) == "d") player.gain(result.player, "gain2"); + // event.finish(); + } else { + if (get.position(result.player, true) == "d") target.gain(result.player, "gain2"); + // event.finish(); + /*if(!player.countCards('he')) event.finish(); + else{ + event.giver=player; + event.gainner=target; + player.chooseCard(true,'he','交给'+get.translation(target)+'一张牌'); + }*/ + } + "step 2"; + // if (result.bool) event.giver.give(result.cards, event.gainner); + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if ( + !player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return card.number >= 11; + } + if (val <= 6) { + return card.number >= 13; + } + return false; + }) + ) + return 0; + return -Math.sqrt(1 + target.countCards("he")) / (1 + target.countCards("j")); + }, + }, + }, + }, + anyong: { + audio: 2, + trigger: { global: "damageSource" }, + direct: true, + filter: function (event, player) { + return ( + event.source && + event.source == _status.currentPhase && + event.num == 1 && + // event.player != event.source && + event.player.isIn() && + player.countCards("he") > 0 && + event.source + .getHistory("sourceDamage", function (evt) { + return evt.player != event.source; + }) + .indexOf(event) == 0 + ); + }, + content: function () { + "step 0"; + player + .chooseToDiscard("he", get.prompt("anyong", trigger.player), "弃置一张牌并对其造成1点伤害") + .set("goon", get.damageEffect(trigger.player, player, player) > 0) + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }).logSkill = ["anyong", trigger.player]; + "step 1"; + if (result.bool) trigger.player.damage(); + }, + }, + //刘永 + zhuning: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + if (!player.countCards("he")) return false; + return !player.getStat("skill").zhuning || player.hasSkill("zhuning_double"); + }, + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + delay: false, + lose: false, + discard: false, + 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(1, player.countCards("h") - player.hp)) return 0; + return 10 - get.value(card); + }, + content: function () { + "step 0"; + player.give(cards, target).gaintag.add("fengxiang_tag"); + "step 1"; + var list = []; + for (var name of lib.inpile) { + var type = get.type(name); + if (type != "basic" && type != "trick") continue; + var card = { name: name, isCard: true }; + if (get.tag(card, "damage") > 0 && player.hasUseTarget(card)) { + list.push([type, "", name]); + } + if (name == "sha") { + for (var i of lib.inpile_nature) { + card.nature = i; + if (player.hasUseTarget(card)) list.push([type, "", name, i]); + } + } + } + if (list.length) { + player.chooseButton(["是否视为使用一张伤害牌?", [list, "vcard"]]).set("ai", function (button) { + return _status.event.player.getUseValue({ name: button.link[2] }); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + player.chooseUseTarget({ name: result.links[0][2], nature: result.links[0][3], isCard: true }, true, false); + } else event.finish(); + "step 3"; + if ( + !player.hasHistory("sourceDamage", function (evt) { + if (!evt.card) return false; + var evtx = evt.getParent("useCard"); + return evtx.card == evt.card && evtx.getParent(2) == event; + }) + ) + player.addTempSkill("zhuning_double"); + }, + subSkill: { + double: {}, + }, + ai: { + fireAttack: true, + order: 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.rerende < 0 || player.countCards("h") <= 1) { + if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0; + } + return Math.max(1, 5 - nh); + }, + }, + }, + }, + fengxiang: { + getMax: function (event) { + var max = 0, + max2 = null, + players = game.filterPlayer(); + for (var current of players) { + var num = 0, + cards = current.getCards("h", function (card) { + return card.hasGaintag("fengxiang_tag"); + }); + if (event) { + if (event.name == "gain" && event.gaintag.includes("fengxiang_tag")) cards.removeArray(event.cards); + var evt = event.getl(current); + if (evt && evt.gaintag_map) { + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("fengxiang_tag")) num++; + } + } + } + num += cards.length; + if (num > max) { + max = num; + max2 = current; + } else if (num == max) max2 = null; + } + return max2; + }, + audio: 2, + init: function (player) { + game.addGlobalSkill("fengxiang_use"); + }, + onremove: function (player) { + if (!game.hasPlayer(current => current.hasSkill("fengxiang"), true)) game.removeGlobalSkill("fengxiang_use"); + }, + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + var target = lib.skill.fengxiang.getMax(); + return !target || target.isDamaged(); + }, + logTarget: function (event, player) { + return lib.skill.fengxiang.getMax() || player; + }, + content: function () { + var target = lib.skill.fengxiang.getMax(); + if (target) target.recover(); + else player.draw(); + }, + group: "fengxiang_draw", + subSkill: { + draw: { + trigger: { + global: ["equipAfter", "addJudgeAfter", "loseAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + if (event.name == "lose" && event.getlx === false) return false; + return lib.skill.fengxiang.getMax() != lib.skill.fengxiang.getMax(event); + }, + content: function () { + if (trigger.delay === false) game.delayx(); + player.draw(); + }, + }, + use: { + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + get.itemtype(card) === "card" && + card.hasGaintag("fengxiang_tag") && + game.hasPlayer(current => { + return current.hasSkill("fengxiang") && get.attitude(player, current) > 0; + }) + ) + return num + 10; + }, + }, + trigger: { player: "dieAfter" }, + filter: function (event, player) { + return !game.hasPlayer(current => current.hasSkill("fengxiang"), true); + }, + silent: true, + forceDie: true, + charlotte: true, + content: function () { + game.removeGlobalSkill("fengxiang_use"); + }, + }, + }, + }, + //阚泽 + rekuanshi: { + audio: "kuanshi", + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("rekuanshi")) + .set("animate", false) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (target.hp < 3) att /= 1.5; + return att; + }); + "step 1"; + if (result.bool) { + player.logSkill("rekuanshi"); + player.addTempSkill("rekuanshi_effect", { player: "phaseBegin" }); + player.storage.rekuanshi_effect = result.targets[0]; + game.delayx(); + } + }, + subSkill: { + effect: { + audio: "kuanshi", + mark: true, + intro: { + content: "每回合限一次,当$于一回合内受到第2点伤害后,其回复1点体力。", + }, + trigger: { global: "damageEnd" }, + forced: true, + charlotte: true, + logTarget: "player", + usable: 1, + filter: function (event, player) { + if (event.player != player.storage.rekuanshi_effect || event.player.isHealthy()) return false; + var history = event.player.getHistory("damage", null, event), + num = 0; + for (var i of history) num += i.num; + return num > 1 && num - event.num < 2; + }, + content: function () { + trigger.player.recover(); + }, + }, + }, + }, + //吕玲绮 + guowu: { + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + preHidden: true, + content: function () { + "step 0"; + var hs = player.getCards("h"); + player.showCards(hs, get.translation(player) + "发动了【帼舞】"); + var list = []; + for (var i of hs) { + list.add(get.type2(i, player)); + if (list.length >= 3) break; + } + if (list.length >= 1) { + var card = get.discardPile(function (i) { + return i.name == "sha"; + }); + if (card) player.gain(card, "gain2"); + } + if (list.length >= 2) player.addTempSkill("guowu_dist", "phaseUseAfter"); + if (list.length >= 3) player.addTempSkill("guowu_add", "phaseUseAfter"); + }, + subSkill: { + dist: { + charlotte: true, + mod: { targetInRange: () => true }, + }, + add: { + charlotte: true, + trigger: { player: "useCard1" }, + direct: true, + filter: function (event, player) { + var info = get.info(event.card, false); + if (info.allowMultiple == false) return false; + if (event.card.name != "sha" && (info.type != "trick" || get.mode() == "guozhan")) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var num = game.countPlayer(function (current) { + return !trigger.targets.includes(current) && lib.filter.targetEnabled2(trigger.card, player, current) && lib.filter.targetInRange(trigger.card, player, current); + }); + player + .chooseTarget("帼舞:是否为" + get.translation(trigger.card) + "增加" + (num > 1 ? "至多两个" : "一个") + "目标?", [1, Math.min(2, num)], function (card, player, target) { + var trigger = _status.event.getTrigger(); + var card = trigger.card; + return !trigger.targets.includes(target) && lib.filter.targetEnabled2(card, player, target) && lib.filter.targetInRange(card, player, target); + }) + .set("ai", function (target) { + var player = _status.event.player; + var card = _status.event.getTrigger().card; + return get.effect(target, card, player, player); + }); + "step 1"; + if (result.bool) { + if (player != game.me && !player.isOnline()) game.delayx(); + } else event.finish(); + "step 2"; + var targets = result.targets.sortBySeat(); + player.logSkill("guowu_add", targets); + trigger.targets.addArray(targets); + //if(get.mode()=='guozhan') player.removeSkill('guowu_add'); + }, + }, + }, + }, + zhuangrong: { + derivation: ["llqshenwei", "wushuang"], + trigger: { global: "phaseEnd" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.hp == 1 || player.countCards("h") == 1; + }, + content: function () { + "step 0"; + player.awakenSkill("zhuangrong"); + player.loseMaxHp(); + "step 1"; + if (player.maxHp > player.hp) player.recover(player.maxHp - player.hp); + "step 2"; + player.drawTo(Math.min(5, player.maxHp)); + player.addSkills(["llqshenwei", "wushuang"]); + }, + }, + llqshenwei: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: event => !event.numFixed, + content: function () { + trigger.num += 2; + }, + mod: { + maxHandcard: (player, num) => num + 2, + }, + }, + cuijian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => lib.skill.cuijian.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + var hs = target.getCards("h", "shan"); + if (hs.length) { + hs.addArray( + target.getCards("he", function (card) { + return get.subtype(card) == "equip2"; + }) + ); + player.gain(hs, target, "give", "bySelf"); + if (player.hasMark("zhtongyuan_basic")) event.finish(); + else event.num = hs.length; + } else { + if (player.hasMark("zhtongyuan_trick")) player.draw(2); + event.finish(); + } + "step 1"; + var hs = player.getCards("he"); + if (!hs.length || !target.isIn()) event.finish(); + else if (hs.length <= num) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, "选择交给" + get.translation(target) + get.cnNumber(num) + "张牌", num); + "step 2"; + if (result.bool && result.cards && result.cards.length) player.give(result.cards, target); + }, + ai: { + order: 4, + result: { + player: function (player, target) { + if (!target.countCards("h", "shan")) return player.hasMark("zhtongyuan_trick") ? 2 : 0; + return 0; + }, + target: function (player, target) { + if (target.countCards("h", "shan")) { + var num = -target.countCards("h") / 2; + var card = target.getEquip(2); + if (card) num -= get.value(card, target) / 2; + return num; + } + return -0.01; + }, + }, + }, + }, + tongyuan: { audio: 2 }, + zhtongyuan: { + audio: "tongyuan", + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + filter: function (event, player) { + var type = get.type2(event.card, false); + return (type == "basic" || type == "trick") && get.color(event.card, false) == "red" && !player.hasMark("zhtongyuan_" + type); + }, + content: function () { + var type = get.type2(trigger.card, false); + if (!player.hasMark("zhtongyuan_" + type)) { + player.addMark("zhtongyuan_" + type, 1, false); + game.log(player, "修改了技能", "#g【摧坚】"); + } + }, + group: ["zhtongyuan_basic", "zhtongyuan_trick"], + subSkill: { + basic: { + trigger: { player: "useCard2" }, + direct: true, + locked: true, + filter: function (event, player) { + if (!player.hasMark("zhtongyuan_basic") || !player.hasMark("zhtongyuan_trick")) return false; + var card = event.card; + if (get.color(card, false) != "red" || get.type(card, null, true) != "basic") return false; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("zhtongyuan"), function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("zhtongyuan", event.targets); + trigger.targets.addArray(event.targets); + } + }, + }, + trick: { + audio: "zhtongyuan", + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (!player.hasMark("zhtongyuan_basic") || !player.hasMark("zhtongyuan_trick")) return false; + var card = event.card; + return get.color(card, false) == "red" && get.type(card, null, false) == "trick"; + }, + content: function () { + trigger.directHit.addArray(game.filterPlayer()); + game.log(trigger.card, "不可被响应"); + }, + }, + }, + }, + //陆郁生 + zhente: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + logTarget: "player", + usable: 1, + preHidden: true, + filter: function (event, player) { + var color = get.color(event.card); + if (player == event.player || event.player.isDead() || color == "none" || (get.mode() == "guozhan" && color != "black")) return false; + var type = get.type(event.card); + return type == "basic" || type == "trick"; + }, + check: function (event, player) { + return !event.excluded.includes(player) && get.effect(player, event.card, event.player, player) < 0; + }, + content: function () { + "step 0"; + trigger.player + .chooseControl() + .set("choiceList", ["本回合内不能再使用" + get.translation(get.color(trigger.card)) + "牌", "令" + get.translation(trigger.card) + "对" + get.translation(player) + "无效"]) + .set("prompt", get.translation(player) + "发动了【贞特】,请选择一项") + .set("ai", function () { + var player = _status.event.player; + var target = _status.event.getParent().player; + var card = _status.event.getTrigger().card, + color = get.color(card); + if (get.effect(target, card, player, player) <= 0) return 1; + var hs = player.countCards("h", function (card) { + return get.color(card, player) == color && player.hasValueTarget(card, null, true); + }); + if (!hs.length) return 0; + if (hs > 1) return 1; + return Math.random() > 0.5 ? 0 : 1; + }); + "step 1"; + if (result.index == 0) { + trigger.player.addTempSkill("zhente2"); + trigger.player.storage.zhente2.add(get.color(trigger.card)); + trigger.player.markSkill("zhente2"); + } else trigger.excluded.add(player); + }, + }, + zhente2: { + mod: { + cardEnabled(card, player) { + const color = get.color(card); + if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false; + }, + cardSavable(card, player) { + const color = get.color(card); + if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false; + }, + }, + charlotte: true, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + intro: { content: "本回合内不能使用$牌" }, + }, + zhiwei: { + audio: 2, + trigger: { + player: ["enterGame", "showCharacterAfter", "phaseBegin"], + global: ["phaseBefore"], + }, + direct: true, + filter: function (event, player, name) { + if (player.hasSkill("zhiwei2")) return false; + if (!game.hasPlayer(current => current != player)) return false; + if (get.mode() == "guozhan") return event.name == "showCharacter" && (event.toShow.includes("gz_luyusheng") || event.toShow.includes("luyusheng")); + return event.name != "showCharacter" && (name != "phaseBefore" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + player.chooseTarget("请选择【至微】的目标", "选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。", true, lib.filter.notMe).set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return 1 + att; + return Math.random(); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhiwei", target); + player.storage.zhiwei2 = target; + player.addSkill("zhiwei2"); + } + }, + }, + zhiwei2: { + group: ["zhiwei2_draw", "zhiwei2_discard", "zhiwei2_gain", "zhiwei2_clear"], + charlotte: true, + onremove: true, + mark: "character", + intro: { + content: "$造成伤害后你摸一张牌;$受到伤害后你弃置一张牌;你于弃牌阶段弃置牌后交给$", + }, + subSkill: { + draw: { + audio: "zhiwei", + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + return event.source == player.storage.zhiwei2; + }, + logTarget: "source", + content: function () { + player.draw(); + }, + }, + discard: { + audio: "zhiwei", + trigger: { global: "damageEnd" }, + forced: true, + filter: function (event, player) { + return ( + event.player == player.storage.zhiwei2 && + player.countCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "zhiwei2_discard"); + }) + ); + }, + logTarget: "player", + content: function () { + player.discard( + player + .getCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "zhiwei2_discard"); + }) + .randomGet() + ); + }, + }, + gain: { + audio: "zhiwei", + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + forced: true, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false || event.getParent("phaseDiscard").player != player || !player.storage.zhiwei2 || !player.storage.zhiwei2.isIn()) return false; + var evt = event.getl(player); + return evt && evt.cards2.filterInD("d").length > 0; + }, + logTarget: function (event, player) { + return player.storage.zhiwei2; + }, + content: function () { + if (trigger.delay === false) game.delay(); + player.storage.zhiwei2.gain(trigger.getl(player).cards2.filterInD("d"), "gain2"); + }, + }, + clear: { + audio: "zhiwei", + trigger: { + global: "die", + player: ["hideCharacterEnd", "removeCharacterEnd"], + }, + forced: true, + filter: function (event, player) { + if (event.name == "die") return event.player == player.storage.zhiwei2; + if (event.name == "removeCharacter") return event.toRemove == "luyusheng" || event.toRemove == "gz_luyusheng"; + return event.toHide == "luyusheng" || event.toHide == "gz_luyusheng"; + }, + content: function () { + "step 0"; + player.removeSkill("zhiwei2"); + if (trigger.name != "die" || get.mode() != "guozhan") event.finish(); + "step 1"; + if (player.name1 == "gz_luyusheng" || player.name1 == "luyusheng") player.hideCharacter(0); + if (player.name2 == "gz_luyusheng" || player.name2 == "luyusheng") player.hideCharacter(1); + }, + }, + }, + }, + //华歆 + spwanggui: { + audio: "wanggui", + trigger: { source: "damageSource" }, + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.group != player.group; + }); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("spwanggui"), "对一名势力不同的其他角色造成1点伤害", function (card, player, target) { + return target.group != player.group; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + target.damage(); + }, + group: "spwanggui_draw", + subSkill: { + draw: { + trigger: { player: "damageEnd" }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("spwanggui"), "令自己摸一张牌,或和一名势力相同的其他角色各摸一张牌", function (card, player, target) { + return target.group == player.group; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target != player) att *= 2; + if (target.hasSkillTag("nogain")) att /= 1.7; + return att; + }) + .forResult(); + }, + content: function () { + "step 0"; + var target = targets[0]; + if (player == target) { + player.draw(); + event.finish(); + } else { + var list = [player, target].sortBySeat(); + game.asyncDraw(list); + } + "step 1"; + game.delayx(); + }, + }, + }, + }, + wanggui: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + direct: true, + filter: function (event, player) { + return player.hasSkill("wanggui") && !player.hasSkill("wanggui2"); + }, + preHidden: true, + content: function () { + "step 0"; + player.addTempSkill("wanggui2"); + var bool = player.isUnseen(2); + if (bool) { + player + .chooseTarget("望归:是否对一名势力不同的角色造成1点伤害?", function (card, player, target) { + return target.isEnemyOf(player); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }) + .setHiddenSkill("wanggui"); + } else event.goto(2); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("wanggui", target); + target.damage(); + } + event.finish(); + "step 2"; + player.chooseBool("望归:是否令所有与自己势力相同的角色各摸一张牌?").setHiddenSkill("wanggui"); + "step 3"; + if (result.bool) { + var targets = game.filterPlayer(function (current) { + return current.isFriendOf(player); + }); + targets.sortBySeat(); + player.logSkill("wanggui", targets); + game.asyncDraw(targets); + } else event.finish(); + "step 4"; + game.delayx(); + }, + }, + wanggui2: {}, + xibing: { + audio: 2, + trigger: { global: "useCardToPlayered" }, + filter: function (event, player) { + if (player == event.player || event.targets.length != 1 || event.player.countCards("h") >= event.player.hp) return false; + var bool = function (card) { + return (card.name == "sha" || get.type(card, false) == "trick") && get.color(card, false) == "black"; + }; + if (!bool(event.card)) return false; + var evt = event.getParent("phaseUse"); + if (evt.player != event.player) return false; + return ( + get.mode() != "guozhan" || + event.player.getHistory("useCard", function (evtx) { + return bool(evtx.card) && evtx.getParent("phaseUse") == evt; + })[0] == event.getParent() + ); + }, + logTarget: "player", + check: function (event, player) { + var target = event.player; + var att = get.attitude(player, target); + var num2 = Math.min(5, target.hp) - target.countCards("h"); + if (num2 <= 0) return att <= 0; + var num = target.countCards("h", function (card) { + return target.hasValueTarget(card, null, true); + }); + if (!num) return att > 0; + return (num - num2) * att < 0; + }, + preHidden: true, + content: function () { + "step 0"; + var num = Math.min(5, trigger.player.hp) - trigger.player.countCards("h"); + if (num > 0) trigger.player.draw(num); + "step 1"; + trigger.player.addTempSkill("xibing2"); + player._xibing = true; + if (get.mode() != "guozhan" || player.isUnseen(2) || trigger.player.isUnseen(2)) event.finish(); + "step 2"; + var target = trigger.player; + var players1 = [player.name1, player.name2]; + var players2 = [target.name1, target.name2]; + player + .chooseButton(2, ["是否暗置自己和" + get.translation(target) + "的各一张武将牌?", '
    你的武将牌
    ', [players1, "character"], '
    ' + get.translation(target) + "的武将牌
    ", [players2, "character"]]) + .set("players", players1) + .set("complexSelect", true) + .set("filterButton", function (button) { + return !get.is.jun(button.link) && (ui.selected.buttons.length == 0) == _status.event.players.includes(button.link); + }); + "step 3"; + if (result.bool) { + var target = trigger.player; + player.hideCharacter(player.name1 == result.links[0] ? 0 : 1); + target.hideCharacter(target.name1 == result.links[1] ? 0 : 1); + player.addTempSkill("xibing3"); + target.addTempSkill("xibing3"); + } + }, + }, + xibing2: { + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; + }, + }, + }, + xibing3: { + ai: { nomingzhi: true }, + }, + //小虎 + remeibu: { + audio: "meibu", + trigger: { + global: "phaseUseBegin", + }, + filter: function (event, player) { + return event.player != player && event.player.isIn() && event.player.inRange(player) && player.countCards("he") > 0; + }, + direct: true, + derivation: ["rezhixi"], + checkx: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + return event.player.countCards("h") > event.player.hp; + }, + content: function () { + "step 0"; + var check = lib.skill.new_meibu.checkx(trigger, player); + player + .chooseToDiscard(get.prompt2("remeibu", trigger.player), "he") + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }) + .set("check", check) + .set("logSkill", ["remeibu", trigger.player]); + "step 1"; + if (result.bool) { + var target = trigger.player; + var card = result.cards[0]; + player.line(target, "green"); + player.markAuto("remeibu_gain", [get.suit(card, player)]); + player.addTempSkill("remeibu_gain"); + target.addTempSkills("rezhixi", "phaseUseEnd"); + } + }, + ai: { + expose: 0.2, + }, + subSkill: { + gain: { + trigger: { global: "loseAfter" }, + forced: true, + charlotte: true, + popup: false, + onremove: true, + filter: function (event, player) { + return event.getParent(3).name == "rezhixi" && player.getStorage("remeibu_gain").includes(get.suit(event.cards[0], event.player)) && get.position(event.cards[0]) == "d"; + }, + content: function () { + player.gain(trigger.cards[0], "gain2"); + }, + }, + }, + }, + remumu: { + audio: "mumu", + trigger: { + player: "phaseUseBegin", + }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("e") > 0; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("remumu"), function (card, player, target) { + return target.countCards("e") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + es = target.getCards("e"), + val = 0; + for (var i of es) { + var eff = -(get.value(i, target) - 0.1) * att; + if (eff > val) val = eff; + } + return eff; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("remumu", target); + if (player == target) event._result = { index: 1 }; + else { + var str = get.translation(target); + player + .chooseControl() + .set("choiceList", ["弃置" + str + "装备区的一张牌且本阶段使用【杀】的次数上限+1", "获得" + str + "装备区的一张牌且本阶段使用【杀】的次数上限-1"]) + .set("ai", function () { + var player = _status.event.player; + if ( + player.countCards("hs", function (card) { + return get.name(card, player) == "sha" && player.hasValueTarget(card); + }) < Math.max(1, player.getCardUsable("sha")) + ) + return 1; + return 0; + }); + } + } else event.finish(); + "step 2"; + if (result.index == 0) { + player.addTempSkill("remumu3", "phaseUseAfter"); + player.discardPlayerCard(target, "e", true); + } else { + player.addTempSkill("remumu2", "phaseUseAfter"); + player.gainPlayerCard(target, "e", true); + } + }, + }, + remumu2: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num - 1; + }, + }, + }, + remumu3: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + rezhixi: { + trigger: { + player: "useCard", + }, + forced: true, + filter: function (event, player) { + return (event.card.name == "sha" || get.type(event.card) == "trick") && player.countCards("h") > 0; + }, + content: function () { + player.chooseToDiscard("h", true); + }, + ai: { + halfneg: true, + nokeep: true, + }, + }, + //董白 + relianzhu: { + audio: "lianzhu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterCard: true, + discard: false, + lose: false, + delay: false, + position: "he", + filterTarget: lib.filter.notMe, + check: function (card) { + var num = get.value(card); + if (get.color(card) == "black") { + if (num >= 6) return 0; + return 9 - num; + } else { + return 7 - num; + } + }, + content: function () { + "step 0"; + player.give(cards, target); + "step 1"; + if (get.color(cards[0], player) == "red") { + player.draw(); + event.finish(); + } else { + target + .chooseToDiscard("he", 2, "弃置两张牌,或令" + get.translation(player) + "摸两张牌") + .set("goon", get.attitude(target, player) < 0) + .set("ai", function (card) { + if (!_status.event.goon) return -get.value(card); + return 6 - get.value(card); + }); + } + "step 2"; + if (!result.bool) player.draw(2); + }, + ai: { + order: 3, + expose: 0.2, + result: { + target: function (player, target) { + if (ui.selected.cards.length && get.color(ui.selected.cards[0]) == "red") { + if (target.countCards("h") < player.countCards("h")) return 1; + return 0.5; + } + return -1; + }, + }, + }, + }, + rexiahui: { + audio: "xiahui", + mod: { + ignoredHandcard: function (card, player) { + if (get.color(card, player) == "black") return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.color(card, player) == "black") return false; + }, + }, + trigger: { global: "phaseEnd" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + var target = event.player; + return ( + target != player && + target.countCards("h", function (card) { + return card.hasGaintag("rexiahui"); + }) == 0 && + target.getHistory("lose", function (evt) { + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("rexiahui")) return true; + } + }).length > 0 + ); + }, + content: function () { + trigger.player.loseHp(); + }, + group: "rexiahui_gain", + subSkill: { + gain: { + trigger: { global: "gainEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + if (player == event.player) return false; + var evt = event.getl(player); + return ( + evt && + evt.cards2 && + evt.cards2.filter(function (card) { + return get.color(card, player) == "black"; + }).length > 0 + ); + }, + content: function () { + trigger.player.addSkill("rexiahui_block"); + var cards = trigger.getl(player).cards2.filter(function (card) { + return get.color(card, player) == "black"; + }); + trigger.player.addGaintag(cards, "rexiahui"); + }, + }, + block: { + mod: { + cardEnabled2: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("rexiahui")) return false; + }, + cardDiscardable: function (card) { + if (card.hasGaintag("rexiahui")) return false; + }, + }, + charlotte: true, + forced: true, + popup: false, + trigger: { player: "changeHp" }, + filter: function (event, player) { + return event.num < 0; + }, + content: function () { + player.removeSkill("rexiahui_block"); + }, + onremove: function (player) { + player.removeGaintag("rexiahui"); + }, + }, + }, + }, + //周善 + dcmiyun: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + direct: true, + group: "dcmiyun_lose", + content: function () { + "step 0"; + if (player.hasCard(card => card.hasGaintag("dcmiyun_tag"), "h")) { + player.chooseCardTarget({ + prompt: "密运:将包括“安”在内的任意张手牌交给一名其他角色", + forced: true, + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + filterOk: function () { + for (var card of ui.selected.cards) { + if (card.hasGaintag("dcmiyun_tag")) return true; + } + return false; + }, + goon: game.hasPlayer(current => player != current && get.attitude(player, current) > 0), + ai1: function (card) { + if (get.itemtype(card) != "card") return 0; + if (card.hasGaintag("dcmiyun_tag")) return 100; + if (_status.event.goon) return 8 - get.value(card); + return -get.value(card); + }, + ai2: function (target) { + return get.attitude(_status.event.player, target); + }, + }); + } else event.goto(3); + "step 1"; + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + player.logSkill("dcmiyun", target); + player.give(cards, target); + } else event.goto(3); + "step 2"; + player.drawTo(player.maxHp); + "step 3"; + if (game.hasPlayer(current => current != player && current.countGainableCards(player, "he"))) { + player + .chooseTarget("密运:获得一名其他角色的一张牌,称为“安”", true, (card, player, target) => { + return target != player && target.countGainableCards(player, "he"); + }) + .set("ai", target => { + return get.effect(target, { name: "shunshou" }, _status.event.player, _status.event.player); + }); + } else event.finish(); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcmiyun", target); + player.gainPlayerCard(target, true, "visibleMove").chooseonly = true; + } else event.finish(); + "step 5"; + if (result.bool) { + player.gain(result.cards).gaintag.add("dcmiyun_tag"); + } + }, + mod: { + aiValue: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcmiyun_tag")) return Math.abs(num) * 10; + }, + aiUseful: function () { + return lib.skill.dcmiyun.mod.aiValue.apply(this, arguments); + }, + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcmiyun_tag")) return 0; + }, + }, + subSkill: { + lose: { + audio: "dcmiyun", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + if (event.getParent().name == "dcmiyun") return false; + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dcmiyun_tag")) return true; + } + return false; + } + return player.hasHistory("lose", evt => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcmiyun_tag")) return true; + } + return false; + }); + }, + content: function () { + player.loseHp(); + }, + }, + }, + }, + dcdanying: { + audio: 2, + mod: { + aiOrder: function (player, card, num) { + if (num <= 0 || (card.name !== "sha" && card.name !== "shan") || !player.hasCard(i => i.hasGaintag("dcmiyun_tag"), "h")) return; + return Math.max(0.12, num / 25); + }, + }, + locked: false, + enable: ["chooseToUse", "chooseToRespond"], + usable: 1, + hiddenCard: function (player, name) { + if (!_status.connectMode && !player.hasCard(card => card.hasGaintag("dcmiyun_tag"), "h")) return false; + return name == "sha" || name == "shan"; + }, + filter: function (event, player) { + if (event.type == "wuxie" || !player.hasCard(card => card.hasGaintag("dcmiyun_tag"), "h")) return false; + for (var name of ["sha", "shan"]) { + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var vcards = []; + for (var name of ["sha", "shan"]) { + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); + } + var dialog = ui.create.dialog("胆迎", [vcards, "vcard"], "hidden"); + dialog.direct = true; + return dialog; + }, + backup: function (links, player) { + return { + filterCard: () => false, + selectCard: -1, + viewAs: { + name: links[0][2], + isCard: true, + }, + popname: true, + precontent: function () { + player.logSkill("dcdanying"); + player.showCards( + player.getCards("h", card => card.hasGaintag("dcmiyun_tag")), + get.translation(player) + "的“安”" + ); + player.addTempSkill("dcdanying_discard"); + }, + }; + }, + prompt: function (links, player) { + return "展示“安”,然后视为使用【" + get.translation(links[0][2]) + "】"; + }, + }, + ai: { + order: function (item, player) { + var o1 = get.order({ name: "sha" }), + o2 = get.order({ name: "shan" }); + if (player.countCards("h") > 3 || player == _status.currentPhase) return Math.max(o1, o2) + 0.1; + return Math.min(o1, o2) - 0.1; + }, + combo: "dcmiyun", + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (!player.hasCard(card => card.hasGaintag("dcmiyun_tag"), "h")) return false; + }, + result: { + player: 1, + }, + }, + subSkill: { + discard: { + trigger: { target: "useCardToTargeted" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player.countDiscardableCards(event.player, "he"); + }, + content: function () { + trigger.player.discardPlayerCard(player, "he", true); + player.removeSkill("dcdanying_discard"); + }, + ai: { + effect: { + target: function (card, player, target) { + if (_status._dcdanying_aiChecking) return; + _status._dcdanying_aiChecking = true; + let eff = get.effect(target, { name: "guohe_copy2" }, player, player); + delete _status._dcdanying_aiChecking; + return [1, get.sgn(eff)]; + }, + }, + }, + }, + }, + }, + //蔡阳 + dcxunji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && !player.getStorage("dcxunji_effect").includes(target); + }, + content: function () { + player.markAuto("dcxunji_effect", [target]); + player.addTempSkill("dcxunji_effect", { player: "die" }); + target.addTempSkill("dcxunji_mark", { player: "phaseEnd" }); + }, + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.hp < 2) return 0; + return get.effect(target, { name: "juedou" }, player, player); + }, + }, + }, + subSkill: { + mark: { + mark: true, + marktext: "嫉", + intro: { content: "你已经被盯上了!" }, + }, + effect: { + audio: "dcxunji", + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + popup: false, + onremove: true, + filter: function (event, player) { + return player.getStorage("dcxunji_effect").includes(event.player); + }, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + if (target.getHistory("useCard", evt => get.color(evt.card) == "black").length > 0 && player.canUse("juedou", target)) { + player.useCard({ name: "juedou", isCard: true }, target, "dcxunji_effect"); + } + "step 1"; + player.unmarkAuto("dcxunji_effect", [target]); + if (!player.storage.dcxunji_effect.length) player.removeSkill("dcxunji_effect"); + }, + group: "dcxunji_loseHp", + }, + loseHp: { + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.card && event.card.name == "juedou" && event.getParent().skill == "dcxunji_effect" && event.player.isIn(); + }, + content: function () { + trigger.player.line(player); + player.damage(trigger.num, trigger.player); + }, + }, + }, + }, + dcjiaofeng: { + audio: 2, + trigger: { source: "damageBegin1" }, + forced: true, + usable: 1, + filter: function (event, player) { + return player.isDamaged() && !player.getHistory("sourceDamage").length; + }, + content: function () { + var num = player.getDamagedHp(); + if (num > 0) player.draw(); + if (num > 1) trigger.num++; + if (num > 2) player.recover(); + }, + }, + //夏侯杰 + liedan: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return (player != event.player || player.countMark("liedan") > 4) && !player.hasSkill("zhuangdan_mark"); + }, + logTarget: "player", + content: function () { + if (player == trigger.player) { + player.die(); + return; + } + var num = 0; + if (player.hp > trigger.player.hp) num++; + if (player.countCards("h") > trigger.player.countCards("h")) num++; + if (player.countCards("e") > trigger.player.countCards("e")) num++; + if (num) { + player.draw(num); + if (num == 3 && player.maxHp < 8) player.gainMaxHp(); + } else { + player.addMark("liedan", 1); + player.loseHp(); + } + }, + intro: { content: "mark" }, + }, + zhuangdan: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return player != event.player && player.isMaxHandcard(true); + }, + content: function () { + player.addTempSkill("zhuangdan_mark", { player: "phaseEnd" }); + }, + ai: { + combo: "zhuangdan", + }, + }, + zhuangdan_mark: { + mark: true, + marktext: "胆", + intro: { content: "我超勇的" }, + }, + //乌巢酒仙 + recangchu: { + audio: 2, + trigger: { global: "phaseBefore", player: "enterGame" }, + marktext: "粮", + forced: true, + filter: function (event, player) { + if (event.name == "phase" && game.phaseNumber != 0) return false; + return player.countMark("recangchu") < game.countPlayer(); + }, + content: function () { + player.addMark("recangchu", Math.min(3, game.countPlayer() - player.countMark("recangchu"))); + }, + intro: { content: "mark", name: "粮" }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("recangchu"); + }, + }, + group: ["recangchu2", "recangchu3"], + }, + recangchu2: { + audio: "recangchu", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + forced: true, + usable: 1, + filter: function (event, player) { + return player != _status.currentPhase && player.countMark("recangchu") < game.countPlayer() && event.getg(player).length > 0; + }, + content: function () { + player.addMark("recangchu", 1); + }, + }, + recangchu3: { + audio: "recangchu", + trigger: { global: "die" }, + forced: true, + filter: function (event, player) { + return player.countMark("recangchu") > game.countPlayer(); + }, + content: function () { + player.removeMark("recangchu", player.countMark("recangchu") - game.countPlayer()); + }, + }, + reliangying: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + filter(event, player) { + return player.hasMark("recangchu"); + }, + direct: true, + async content(event, trigger, player) { + const draws = Array.from({ length: player.countMark("recangchu") }).map((_, i) => get.cnNumber(i + 1) + "张"); + const { + result: { control }, + } = await player + .chooseControl(draws, "cancel2") + .set("prompt", get.prompt("reliangying")) + .set("prompt2", "摸至多" + get.cnNumber(player.countMark("recangchu")) + "张牌,然后交给等量的角色各一张牌") + .set("ai", () => { + const player = get.event("player"); + const num = Math.min( + player.countMark("recangchu"), + game.countPlayer(current => get.attitude(player, current) > 0) + ); + if (num > 0) return get.cnNumber(num) + "张"; + return "cancel2"; + }); + if (control != "cancel2") { + player.logSkill("reliangying"); + const num = draws.indexOf(control) + 1, + max = Math.min( + num, + player.countCards("he"), + game.countPlayer(target => target != player) + ); + await player.draw(num); + let list = []; + if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); + while (max - list.length > 0) { + const { + result: { bool, cards, targets }, + } = await player + .chooseCardTarget({ + prompt: "粮营:将" + get.cnNumber(max - 1) + "至" + get.cnNumber(max) + "张牌交给其他角色", + position: "he", + 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) + .set("forced", max - list.length > 1); + 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"); + } + } + }, + }, + reshishou: { + audio: 2, + trigger: { player: ["useCard", "damageEnd"] }, + forced: true, + filter: function (event, player) { + if (!player.countMark("recangchu")) return false; + return event.name == "damage" ? event.hasNature("fire") : event.card && event.card.name == "jiu"; + }, + content: function () { + player.removeMark("recangchu", Math.min(player.countMark("recangchu"), trigger.num || 1)); + }, + ai: { + combo: "recangchu", + neg: true, + }, + group: "reshishou2", + }, + reshishou2: { + audio: "reshishou", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return !player.countMark("recangchu"); + }, + content: function () { + player.loseHp(); + }, + }, + //曹性 + cxliushi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he", { suit: "heart" }) > 0; + }, + filterCard: { suit: "heart" }, + position: "he", + filterTarget: function (card, player, target) { + return player.canUse("sha", target, false); + }, + check: function (card) { + var player = _status.event.player; + var next = player.getNext(); + var att = get.attitude(player, next); + if (att > 0) { + var js = next.getCards("j"); + if (js.length) return get.judge(js[0]) + 10 - get.value(card); + return 9 - get.value(card); + } + return 6 - get.value(card); + }, + discard: false, + prepare: "throw", + loseTo: "cardPile", + visible: true, + insert: true, + content: function () { + game.log(player, "将", cards, "置于牌堆顶"); + player.useCard({ name: "sha", isCard: true }, false, targets).card.cxliushi = true; + }, + group: "cxliushi_damage", + subSkill: { + damage: { + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.card && event.card.cxliushi == true && event.player.isIn() && event.getParent(3).name == "cxliushi"; + }, + content: function () { + trigger.player.addMark("cxliushi2", 1); + trigger.player.addSkill("cxliushi2"); + }, + }, + }, + ai: { + order: function () { + return get.order({ name: "sha" }) - 0.4; + }, + result: { + target: function (player, target) { + var eff = get.effect(target, { name: "sha" }, player, target); + var damageEff = get.damageEffect(target, player, player); + if (eff > 0) return damageEff > 0 ? 0 : eff; + if (target.hasSkill("bagua_skill") || target.hasSkill("rw_bagua_skill") || target.hasSkill("bazhen")) return 0; + return eff; + }, + }, + }, + }, + cxliushi2: { + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("cxliushi2"); + }, + }, + onremove: true, + charlotte: true, + intro: { + name2: "流", + content: "手牌上限-#", + }, + }, + zhanwan: { + audio: 2, + trigger: { global: "phaseDiscardEnd" }, + forced: true, + filter: function (event, player) { + return ( + event.player.hasSkill("cxliushi2") && + event.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) return true; + }).length > 0 + ); + }, + logTarget: "player", + content: function () { + trigger.player.removeSkill("cxliushi2"); + var num = 0; + trigger.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) num += evt.cards2.length; + }); + player.draw(num); + }, + ai: { + combo: "cxliushi", + }, + }, + //说出吾名吓汝一跳 + xuxie: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + logTarget: function (event, player) { + return game + .filterPlayer(function (current) { + return get.distance(player, current) <= 1; + }) + .sortBySeat(); + }, + check: function (event, player) { + if (player.isHealthy()) return false; + var list = game.filterPlayer(function (current) { + return get.distance(player, current) <= 1; + }); + var draw = 0; + var discard = 0; + var num = 2 / player.getDamagedHp(); + while (list.length) { + var target = list.shift(); + var att = get.attitude(player, target); + if (att > 0) { + draw++; + if (target.countDiscardableCards(player, "he") > 0) discard--; + } + if (att == 0) { + draw--; + if (target.countDiscardableCards(player, "he") > 0) discard--; + } + if (att < 0) { + draw--; + if (target.countDiscardableCards(player, "he") > 0) discard++; + } + } + return draw >= num || discard >= num; + }, + content: function () { + "step 0"; + player.loseMaxHp(); + "step 1"; + var targets = game + .filterPlayer(function (current) { + return get.distance(player, current) <= 1; + }) + .sortBySeat(); + if (!targets.length) event.finish(); + else { + event.targets = targets; + player + .chooseControl() + .set("choiceList", ["弃置" + get.translation(targets) + "的各一张牌", "令" + get.translation(targets) + "各摸一张牌"]) + .set("ai", function () { + var player = _status.event.player; + var list = _status.event.getParent().targets.slice(0); + var draw = 0; + var discard = 0; + while (list.length) { + var target = list.shift(); + var att = get.attitude(player, target); + if (att > 0) { + draw++; + if (target.countDiscardableCards(player, "he") > 0) discard--; + } + if (att < 0) { + draw--; + if (target.countDiscardableCards(player, "he") > 0) discard++; + } + } + if (draw > discard) return 1; + return 0; + }); + } + "step 2"; + event.index = result.index; + if (result.index == 1) { + game.asyncDraw(targets); + } else event.goto(4); + "step 3"; + game.delay(); + event.finish(); + "step 4"; + var target = targets.shift(); + if (target.countDiscardableCards(player, "he") > 0) player.discardPlayerCard(target, "he", true); + if (targets.length) event.redo(); + }, + group: "xuxie_add", + }, + xuxie_add: { + audio: "xuxie", + trigger: { player: "phaseUseEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.maxHp > player.maxHp; + }); + }, + content: function () { + player.gainMaxHp(); + player.chooseDrawRecover(2, true); + }, + }, + //新潘凤 + xinkuangfu: { + enable: "phaseUse", + usable: 1, + audio: 2, + delay: false, + filterTarget: function (card, player, target) { + if (player == target) + return ( + player.countCards("e", function (card) { + return lib.filter.cardDiscardable(card, player); + }) > 0 + ); + return target.countDiscardableCards(player, "e") > 0; + }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("e") > 0; + }); + }, + content: function () { + "step 0"; + if (player == target) player.chooseToDiscard("e", true); + else player.discardPlayerCard(target, "e", true); + "step 1"; + player.chooseUseTarget("sha", true, false, "nodistance"); + "step 2"; + var bool = game.hasPlayer2(function (current) { + return ( + current.getHistory("damage", function (evt) { + return evt.getParent("xinkuangfu") == event; + }).length > 0 + ); + }); + if (player == target && bool) player.draw(2); + else if (player != target && !bool) player.chooseToDiscard("h", 2, true); + }, + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.3; + }, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + var max = 0; + var min = 1; + target.countCards("e", function (card) { + var val = get.value(card, target); + if (val > max) max = val; + if (val < min) min = val; + }); + if (att > 0 && min <= 0) return target.hasSkillTag("noe") ? 3 : 1; + if (att <= 0 && max > 0) { + if (target.hasSkillTag("noe")) return max > 6 ? -max / 3 : 0; + return -max; + } + if (player === target && !player.hasSha()) { + let ph = player.countCards("h"); + if ( + game.hasPlayer(i => { + if (!player.canUse("sha", i, true, true) || get.effect(i, { name: "sha" }, player, player) <= 0) return false; + return ( + !ph || + !i.mayHaveShan( + player, + "use", + i.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ); + }) + ) + return 1; + } + return 0; + }, + }, + }, + }, +}; + +export default skills; diff --git a/character/huicui/sort.js b/character/huicui/sort.js new file mode 100644 index 000000000..ed36831f7 --- /dev/null +++ b/character/huicui/sort.js @@ -0,0 +1,35 @@ +const characterSort = { + sp_baigei: ["re_panfeng", "xingdaorong", "caoxing", "re_chunyuqiong", "xiahoujie", "dc_caiyang", "zhoushan"], + sp_caizijiaren: ["dc_kongrong", "re_dongbai", "re_sunluyu", "heyan", "zhaoyan", "wangtao", "wangyue", "zhangxuan", "tengyin", "zhangyao", "xiahoulingnv", "dc_sunru", "pangshanmin", "kuaiqi"], + sp_zhilan: ["dc_liuli", "liuyong", "wanniangongzhu", "zhanghu", "lvlingqi", "tenggongzhu", "panghui", "dc_zhaotongzhaoguang", "yuantanyuanxiyuanshang", "yuechen", "dc_lingcao"], + sp_guixin: ["zangba", "re_kanze", "re_chendeng", "caimaozhangyun", "dc_lvkuanglvxiang", "dc_gaolan", "yinfuren", "chengui", "chenjiao", "dc_sp_jiaxu", "qinlang", "dc_dongzhao"], + sp_daihan: ["mamidi", "dc_jiling", "zhangxun", "dc_yuejiu", "leibo", "qiaorui", "dongwan", "yuanyin"], + sp_jianghu: ["guanning", "huzhao", "dc_huangchengyan", "mengjie", "wanglie"], + sp_zongheng: ["huaxin", "luyusheng", "re_xunchen", "re_miheng", "fengxi", "re_dengzhi", "dc_yanghu", "zongyu"], + sp_taiping: ["guanhai", "liupi", "peiyuanshao", "zhangchu", "zhangkai", "dc_zhangmancheng"], + sp_yanhan: ["dc_liuba", "dc_huangquan", "furongfuqian", "xianglang", "dc_huojun", "gaoxiang", "dc_wuban", "jiangfei"], + sp_jishi: ["dc_jiben", "zhenghun", "dc_sunhanhua", "liuchongluojun", "wupu"], + sp_raoting: ["dc_huanghao", "dc_sunziliufang", "dc_sunchen", "dc_jiachong"], + sp_yijun: ["gongsundu", "mengyou", "dc_sp_menghuo", "gongsunxiu"], + sp_zhengyin: ["yue_caiwenji", "yue_zhoufei", "yue_caiyong", "yue_xiaoqiao", "yue_daqiao"], + sp_zhonghu: ["dc_jiangji", "dc_wangling", "dc_simashi", "dc_caoshuang"], +}; + +const characterSortTranslate = { + sp_baigei: "无双上将", + sp_caizijiaren: "才子佳人", + sp_zhilan: "芝兰玉树", + sp_zongheng: "纵横捭阖", + sp_guixin: "天下归心", + sp_jianghu: "江湖之远", + sp_daihan: "代汉涂高", + sp_taiping: "太平甲子", + sp_yanhan: "匡鼎炎汉", + sp_jishi: "悬壶济世", + sp_raoting: "绕庭之鸦", + sp_yijun: "异军突起", + sp_zhengyin: "正音雅乐", + sp_zhonghu: "冢虎狼顾", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/huicui/translate.js b/character/huicui/translate.js new file mode 100644 index 000000000..54a0afc75 --- /dev/null +++ b/character/huicui/translate.js @@ -0,0 +1,535 @@ +const translates = { + re_panfeng: "潘凤", + xinkuangfu: "狂斧", + xinkuangfu_info: "出牌阶段限一次,你可选择:1,弃置装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】造成伤害,你摸两张牌。2,弃置一名其他角色装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】未造成伤害,你弃置两张手牌。(均无距离和次数限制)", + xingdaorong: "邢道荣", + xuxie: "虚猲", + xuxie_info: "出牌阶段开始时,你可以减1点体力上限并选择所有距离1以内的角色,弃置这些角色的各一张牌或令这些角色各摸一张牌。出牌阶段结束时,若你的体力上限不为全场最多,则你加1点体力上限,然后回复1点体力或摸两张牌。", + caoxing: "曹性", + cxliushi: "流矢", + cxliushi2: "流矢", + cxliushi_info: "出牌阶段,你可以将一张红桃牌置于牌堆顶,视为对一名角色使用一张【杀】(无距离限制且不计入使用次数)。当此【杀】造成伤害后,受到伤害的角色获得一个“流”。有“流”的角色手牌上限-X(X为其“流”数)。", + zhanwan: "斩腕", + zhanwan_info: "锁定技,有“流”的角色于弃牌阶段弃牌后,你摸等量的牌,然后其移去所有的“流”。", + re_chunyuqiong: "淳于琼", + recangchu: "仓储", + recangchu2: "仓储", + recangchu3: "仓储", + recangchu_info: "锁定技。①游戏开始时,你获得3个“粮”。你的手牌上限+X(X为“粮”数)。②每回合限一次,当你于回合外得到牌后,你获得一个“粮”。(你的“粮”数不能超过存活角色数)", + reliangying: "粮营", + reliangying_info: "弃牌阶段开始时,你可以摸至多X张牌,然后交给等量的角色各一张牌。(X为你的“粮”数)", + reshishou: "失守", + reshishou2: "失守", + reshishou_info: "锁定技,当你使用【酒】时或受到1点火焰伤害后,你移去一个“粮”。准备阶段,若你没有“粮”,你失去1点体力。", + xiahoujie: "夏侯杰", + liedan: "裂胆", + liedan_info: "锁定技,其他角色的准备阶段开始时,若X大于0,则你摸X张牌。若X等于3,则你加1点体力上限(至多加到8)。若X为0,则你失去1点体力并获得一枚“裂”(X为你的手牌数,体力值,装备区牌数中大于其的数量)。准备阶段,若“裂”数大于4,则你死亡。", + zhuangdan: "壮胆", + zhuangdan_mark: "壮胆", + zhuangdan_info: "锁定技,其他角色的回合结束时,若你的手牌数为全场唯一最多,则你令〖裂胆〗失效直到你下回合结束。", + dc_caiyang: "蔡阳", + dcxunji: "寻嫉", + dcxunji_info: "出牌阶段限一次,你可以选择一名其他角色。该角色的下个结束阶段开始时,若其此回合使用过黑色牌,则你视为对其使用一张【决斗】,且当此【决斗】对其造成伤害后,其对你造成等量的伤害。", + dcjiaofeng: "交锋", + dcjiaofeng_info: "锁定技。每回合限一次,当你造成伤害时,若你本回合内未造成过其他伤害且你已损失的体力值:大于0,则你摸一张牌;大于1,则此伤害+1;大于2,则你回复1点体力。", + zhoushan: "周善", + dcmiyun: "密运", + dcmiyun_tag: "安", + dcmiyun_info: "锁定技。①一轮游戏开始时,你依次执行:1.若你有“安”,你将包括“安”的在内的任意张手牌交给一名其他角色,然后你将手牌补至体力上限;2.你正面向上获得一名其他角色的一张牌,称为“安”。②当你不因〖密运①〗失去“安”后,你失去1点体力。", + dcdanying: "胆迎", + dcdanying_info: "每回合限一次。你可以展示“安”,然后视为使用或打出一张【杀】或【闪】。然后当你于本回合下一次成为牌的目标后,使用者弃置你的一张牌。", + re_sunluyu: "孙鲁育", + remeibu: "魅步", + remeibu_info: "其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌A,该角色于本阶段内拥有〖止息〗,且当其因〖止息〗弃置与牌A花色相同的牌时,你获得之。", + rezhixi: "止息", + rezhixi_info: "锁定技,当你使用【杀】或普通锦囊牌时,你弃置一张手牌。", + remumu: "穆穆", + remumu_info: "出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌,然后你本回合可使用【杀】的次数+1;2.获得一名角色装备区里的一张牌,然后你本回合可使用【杀】的次数-1。", + re_dongbai: "董白", + relianzhu: "连诛", + relianzhu_info: "出牌阶段限一次,你可将一张牌正面朝上交给一名其他角色。若此牌为:红色,你摸一张牌;黑色,对方弃置两张牌或令你摸两张牌。", + rexiahui: "黠慧", + rexiahui_info: "锁定技,①你的黑色牌不计入手牌上限。②当有其他角色获得你的黑色牌后,其于下次扣减体力前不能使用,打出,弃置这些牌。③一名其他角色的回合结束时,若其本回合失去过其所有“黠慧”牌,则其失去1点体力。", + heyan: "何晏", + yachai: "崖柴", + yachai_info: "当你受到伤害后,你可令伤害来源选择一项:①其本回合不能再使用手牌,然后你摸两张牌;②其展示所有手牌,然后将其手牌中一种花色的所有牌交给你;③弃置一半数量的手牌(向上取整)。", + qingtan: "清谈", + qingtan_info: "出牌阶段限一次,你可令所有有手牌的角色同时选择一张手牌并同时展示。你可以获得其中一种花色的牌,然后展示此花色牌的角色各摸一张牌。若如此做,弃置其他的牌。", + zhaoyan: "赵嫣", + jinhui: "锦绘", + jinhui_info: "出牌阶段限一次,你可以随机亮出牌堆中的三张不具有“伤害”标签且使用目标范围为“自己”或“一名角色”的牌,然后选择一名其他角色。该角色选择并按如下“锦绘”规则使用其中一张,然后你可以按如下“锦绘”规则使用剩余的任意张牌:若此牌的使用目标为“自己”,则对自己使用该牌,否则对对方使用该牌(无距离限制且不计入次数限制)。", + qingman: "轻幔", + qingman_info: "锁定技。一名角色的回合结束时,你将手牌摸至X张(X为其装备区中空栏的数量)。", + wangtao: "王桃", + wangyue: "王悦", + huguan: "护关", + huguan_info: "一名角色于出牌阶段内使用第一张牌时,若此牌为红色,则你可以声明一种花色。该花色的牌不计入其本回合的手牌上限。", + yaopei: "摇佩", + yaopei_info: "其他角色的弃牌阶段结束时,若你本回合内对其发动过〖护关〗,则你可以弃置一张与其于此阶段弃置的牌花色均不相同的牌。然后你选择一项:①其摸两张牌,你回复1点体力。②其回复1点体力,你摸两张牌。", + mingluan: "鸣鸾", + mingluan_info: "其他角色的结束阶段开始时,若有角色于本回合内回复过体力,则你可以弃置任意张牌,然后摸X张牌(X为当前角色的手牌数,且至多摸至5张)。", + zhangxuan: "张嫙", + tongli: "同礼", + //tongli_info:'当你于出牌阶段内不因〖同礼〗而使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内不因〖同礼〗而使用过的牌数相等,则你可以于此牌结算结束后依次视为对此牌的所有目标使用X张名称和属性相同的牌(X为你手牌中的花色数)。', + tongli_info: "当你于出牌阶段内使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内使用过的牌数相等,则你可以令此牌额外结算X次(X为你手牌中的花色数)。", + shezang: "奢葬", + shezang_info: "每轮限一次。当你或你回合内的其他角色进入濒死状态时,你可以从牌堆中获得每种花色的牌各一张。", + tengyin: "滕胤", + chenjian: "陈见", + chenjian_info: "准备阶段,你可亮出牌堆顶的3+X张牌(X为你“陈见”标记的数量且至多为2),然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌。", + xixiu: "皙秀", + xixiu_info: "锁定技。①当你成为其他角色使用牌的目标时,若你的装备区内有和此牌花色相同的牌,则你摸一张牌。②若你装备区内的牌数为1,则其他角色不能弃置你装备区内的牌。", + zhangyao: "张媱", + yuanyu: "怨语", + yuanyu_info: "出牌阶段限一次。你可以摸一张牌,然后选择一张手牌和一名其他角色。该角色获得如下效果直到你发动〖夕颜〗:{你与该角色的弃牌阶段开始时,或当该角色造成1点伤害后,其须将一张手牌作为“怨”置于你的武将牌上}。然后你将你选择的手牌作为“怨”置于你的武将牌上。", + xiyan: "夕颜", + xiyan_info: "当有牌作为“怨”移动到你的武将牌上后,若“怨”中的花色数达到4种,则你可以获得所有“怨”。然后若当前回合角色:是你,你本回合手牌上限+4且使用牌无次数限制且重置你的〖怨语〗于此阶段的发动次数;不是你,你可令当前回合角色本回合手牌上限-4且不能使用基本牌。", + xiahoulingnv: "夏侯令女", + fuping: "浮萍", + fuping_info: "①其他角色对你使用的牌结算结束后,若你未因此技能记录过此牌的名称且你有未废除的装备栏,则你可以废除一个装备栏,记录此牌的名称。②每回合每种牌名限一次。你可以将一张非基本牌当做〖浮萍①〗记录过的基本牌或锦囊牌使用或打出。③若你的所有装备栏均已被废除,则你使用牌无距离限制。", + weilie: "炜烈", + weilie_info: "每局游戏限X次。出牌阶段,你可以弃置一张牌并选择一名已受伤的角色,令该角色回复1点体力。然后若其体力值小于体力上限,则其摸一张牌(X为你〖浮萍①〗中的记录数+1)。", + dc_sunru: "孙茹", + xiecui: "撷翠", + xiecui_info: "当有角色于回合内第一次因执行牌的效果而造成伤害时,你可以令此伤害+1。若其势力为吴,则该角色获得此伤害牌对应的实体牌,且其本回合的手牌上限+1。", + youxu: "忧恤", + youxu_info: "一名角色A的回合结束时,若其手牌数大于体力值,则你可以展示A的一张牌,然后将此牌交给另一名角色B。若B的体力值为全场最少,则B回复1点体力。", + huaxin: "华歆", + wanggui: "望归", + wanggui_info: "每回合限触发一次,当你造成或受到伤害后,若你:仅明置了此武将牌,则你可对与你势力不同的一名角色造成1点伤害;武将牌均明置,则你可令与你势力相同的角色各摸一张牌。", + spwanggui: "望归", + spwanggui_info: "①当你受到伤害后,你可以摸一张牌,或和一名势力相同的其他角色各摸一张牌;②每回合限一次,当你造成伤害后,你可以对一名与你势力不同的角色造成1点伤害。", + xibing: "息兵", + xibing_info: "当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸至五张)且本回合不能再使用手牌。", + xibing_info_guozhan: "当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸至五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。", + luyusheng: "陆郁生", + zhente: "贞特", + zhente2: "贞特", + zhente_info: "每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用与此牌颜色相同的牌;2.此牌对你无效。", + zhente_info_guozhan: "每回合限一次,当你成为其他角色使用黑色基本牌或黑色普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用黑色牌;2.此牌对你无效。", + zhiwei: "至微", + zhiwei2: "至微", + zhiwei_info: "游戏开始时/你的回合开始时,若场上没有因此法被选择过的角色存活,则你选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。", + zhiwei_info_guozhan: "你明置此武将牌时,选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。该角色死亡时,若你的两个武将牌均明置,你暗置此武将牌。", + zhanghu: "张虎", + cuijian: "摧坚", + cuijian_info: "出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你,然后你交给其等量的牌。", + zhtongyuan: "同援", + zhtongyuan_info: "锁定技。①当你使用红色锦囊牌后,你于〖摧坚〗后增加“若其手牌中没有【闪】,则你摸两张牌”;②当你使用或打出红色基本牌后,你删除〖摧坚〗中的“,然后你交给其等量的牌”。③当你使用红色的普通锦囊牌/基本牌时,若你已发动过〖摧坚①〗和〖摧坚②〗,则此牌不可被响应/可额外增加一个目标。", + lvlingqi: "吕玲绮", + guowu: "帼舞", + guowu_info: "出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】或普通锦囊牌可以多指定至多两个目标。", + guowu_info_guozhan: "出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】可以多指定至多两个目标。", + zhuangrong: "妆戎", + zhuangrong_info: "觉醒技,一名角色的回合结束时,若你的体力值或手牌数为1,你减1点体力上限并回复体力至上限,将手牌摸至体力上限,然后获得〖神威〗和〖无双〗。", + llqshenwei: "神威", + llqshenwei_info: "锁定技,摸牌阶段开始时,你令额定摸牌数+2;你的手牌上限+2。", + re_kanze: "阚泽", + rekuanshi: "宽释", + rekuanshi_info: "结束阶段,你可以选择一名角色。你获得如下效果直到你下回合开始:每回合限一次,当其于一回合内受到第2点伤害后,其回复1点体力。", + liuyong: "刘永", + zhuning: "诛佞", + zhuning_info: "出牌阶段限一次。你可将任意张牌交给一名其他角色(称为“隙”),然后可视为使用一张具有伤害标签的基本牌/锦囊牌(不计入次数限制)。若你以此法使用的牌未造成伤害,则你将〖诛佞〗于本回合内改为“限两次”。", + fengxiang: "封乡", + fengxiang_info: "锁定技。①当你受到伤害后,若场上:存在“隙”唯一最多的角色,则其回复1点体力;不存在,则你摸一张牌。②当有角色的手牌移动后,若场上“隙”最多的角色因此发生变化,则你摸一张牌。", + fengxiang_tag: "隙", + re_xunchen: "荀谌", + refenglve: "锋略", + refenglve_info: "出牌阶段限一次,你可以和一名其他角色进行拼点。若你赢,你获得其区域里的两张牌;若平局,则你获得你的拼点牌且令此技能于本阶段内的发动次数上限+1;若你输,其获得你的拼点牌。", + anyong: "暗涌", + anyong_info: "当一名角色于其回合内第一次造成伤害后,若伤害值为1,则你可弃置一张牌,并对受伤角色造成1点伤害。", + wanniangongzhu: "万年公主", + zhenge: "枕戈", + zhenge_info: "准备阶段,你可以选择一名角色。该角色本局游戏的攻击范围+1(至多+5)。然后若除其外的所有角色都在该角色的攻击范围内,则你可以令其视为对另一名角色使用一张【杀】。", + xinghan: "兴汉", + xinghan_info: "锁定技,每回合的第一张【杀】造成伤害后,若此【杀】的使用者成为过〖枕戈〗的目标,则你摸一张牌。若你的手牌数不是全场唯一最多的,则改为摸X张牌(X为该角色的攻击范围且最多为5)。", + re_chendeng: "陈登", + refuyuan: "扶援", + refuyuan_info: "一名角色成为【杀】的目标后,若其本回合内没有成为过其他红色牌的目标,则你可以令其摸一张牌。", + reyingshui: "营说", + reyingshui_info: "出牌阶段限一次,你可将一张牌交给攻击范围内的一名其他角色,然后其选择一项:①交给你至少两张装备牌。②受到1点伤害。", + rewangzu: "望族", + rewangzu_info: "每回合限一次。当你受到其他角色造成的伤害时,你可随机弃置一张手牌,令此伤害-1。若你所在阵营的存活角色数是全场最多的,则你可以自行选择弃置的牌。", + re_miheng: "祢衡", + rekuangcai: "狂才", + rekuangcai_info: "锁定技。①你于回合内使用牌无距离和次数限制。②弃牌阶段开始时,若你本回合内:未使用过牌,则你本局游戏的手牌上限+1;使用过牌但未造成过伤害,则你本局游戏的手牌上限-1。③结束阶段开始时,你摸X张牌(X为你本回合内造成的伤害且至多为5)。", + reshejian: "舌剑", + reshejian_info: "每回合限两次。当你成为其他角色使用牌的唯一目标后,你可以弃置至少两张手牌。若如此做,你选择一项:⒈弃置其等量的牌。⒉对其造成1点伤害。", + fengxi: "冯熙", + yusui: "玉碎", + yusui_info: "当你成为其他角色使用黑色牌的目标后,你可以失去1点体力,然后选择一项:⒈令其将手牌数弃置至与你相同;⒉令其失去Y点体力(Y为其的体力值减去你的体力值,不为正时不可选择)。", + boyan: "驳言", + boyan_info: "出牌阶段限一次,你可选择一名其他角色。其将手牌摸至体力上限(至多摸至五张),然后其本回合不能使用或打出手牌。", + re_dengzhi: "邓芝", + jianliang: "简亮", + jianliang_info: "摸牌阶段开始时,若你的手牌数不为全场最多,则你可以令至多两名角色各摸一张牌。", + weimeng: "危盟", + weimeng_info: "出牌阶段限一次,你可以获得一名其他角色的至多X张手牌,然后交给其等量的牌(X为你的体力值)。若你给出的牌点数之和:大于得到的牌,则你摸一张牌;小于得到的牌,弃置该角色区域内的一张牌。", + mamidi: "马日磾", + bingjie: "秉节", + bingjie_info: "出牌阶段开始时,你可减1点体力上限,然后当你于本阶段内使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。若其弃置的牌与你使用的牌颜色相同,其无法响应此牌。", + zhengding: "正订", + zhengding_info: "锁定技。当你于回合外使用或打出牌响应其他角色使用的牌时,若这两张牌颜色相同,则你加1点体力上限并回复1点体力。", + dc_jiben: "吉本", + xunli: "询疠", + xunli_info: "锁定技。①当有黑色牌因弃置而进入弃牌堆后,若X大于0,则你将其中的X张牌置于武将牌上作为“疠”(X=min(这些牌的数量,9-Y),Y=你的“疠”数)。②出牌阶段开始时,你可以用任意张黑色手牌交换等量的“疠”。", + zhishi: "指誓", + zhishi_info: "结束阶段,你可选择一名角色。当该角色于你的下回合开始前{成为【杀】的目标后或进入濒死状态时},你可移去任意张“疠”,然后其摸等量的牌。", + lieyi: "烈医", + lieyi_info: "出牌阶段限一次。你可以展示所有“疠”并选择一名其他角色,对其使用其中的一张可对其使用的牌(无距离和次数限制)并重复此流程,并将其余的牌置于弃牌堆。然后若其存活且未于此流程中因受到伤害而进入过濒死状态,则你失去1点体力。", + guanning: "管宁", + dunshi: "遁世", + dunshi_info: "每回合限一次。你可以视为使用或打出一张【杀】/【闪】/【桃】/【酒】,然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。", + dc_gaolan: "高览", + xizhen: "袭阵", + xizhen_info: "出牌阶段开始时,你可选择一名其他角色,视为对其使用【杀】或【决斗】。然后当有角色于本阶段内使用或打出牌响应你时,该角色回复1点体力,你摸一张牌(若其满体力,改为两张)。", + dc_huangchengyan: "黄承彦", + dcjiezhen: "解阵", + dcjiezhen_info: "出牌阶段限一次,你可选择一名其他角色。该角色获得〖八阵〗,且其所有不为{锁定技、限定技、觉醒技、主公技、带有Charlotte标签}的技能失效。你的下回合开始时,或其因〖八卦阵〗发起的判定结算结束后,你令其恢复其以此法失效的所有技能并失去以此法获得的〖八阵〗,然后获得其区域内的一张牌。", + dczecai: "择才", + dczecai_info: "限定技。一轮游戏开始时,若游戏轮数大于1,则你可令一名其他角色获得〖集智〗直到下一轮游戏开始;若其是上一轮内使用过锦囊牌数量唯一最多的角色,则其获得一个额外的回合。", + dcyinshi: "隐世", + dcyinshi_info: "锁定技。①每回合限一次,当你受到伤害时,若此伤害的渠道不为有颜色的牌,则你防止此伤害。②当有因〖八卦阵〗发起的判定的判定牌生效时,你获得此判定牌。", + tenggongzhu: "滕公主", + xingchong: "幸宠", + xingchong_info: "一轮游戏开始时,你可声明两个自然数X和Y,且(X+Y)≤min(5, 你的体力上限)。你摸X张牌并展示Y张手牌。若如此做,当你于本轮内失去一张以此法展示的牌后,你摸两张牌。", + liunian: "流年", + liunian_info: "锁定技。一名角色的回合结束时,若本回合内进行了本次游戏的第一次洗牌,则你加1点体力上限;若本回合内进行了本次游戏的第二次洗牌,则你于本回合结束时回复1点体力,且本局游戏内的手牌上限+10。", + caimaozhangyun: "蔡瑁张允", + lianzhou: "连舟", + lianzhou_info: "锁定技。准备阶段,你横置你的武将牌。然后你可横置任意名体力值等于你的角色。", + jinglan: "惊澜", + jinglan_info: "锁定技。当你造成伤害后,若你的手牌数:大于体力值,你弃置四张手牌;等于体力值,你弃置一张牌并回复1点体力;小于体力值,你受到1点无来源火焰伤害并摸五张牌。", + dc_yanghu: "羊祜", + dcdeshao: "德劭", + dcdeshao_info: "每回合限两次。当你成为其他角色使用的黑色牌的目标后,你可以摸一张牌,然后若其手牌数不小于你,则你弃置其一张牌。", + dcmingfa: "明伐", + dcmingfa_info: "①出牌阶段限一次。当你使用【杀】或普通锦囊牌结算结束后,若你的武将牌上没有“明伐”牌,则你可以将此牌作为“明伐”牌置于武将牌上并选择一名其他角色,记录该角色和此牌的名称。②一名角色的回合结束时,若其是你〖明伐①〗记录的角色,则你视为对其依次使用X张〖明伐①〗记录的牌,然后移去“明伐”牌(X为其手牌数且至少为1,至多为5)。③一名角色死亡时,若其是你〖明伐①〗记录的角色,则你移去“明伐”牌。", + dc_jiling: "纪灵", + dcshuangren: "双刃", + dcshuangren_info: "出牌阶段开始时,你可以和一名其他角色A进行拼点。若你赢,你选择一名角色B,或选择包含A在内的两名角色A和B(B的势力需与A相同),然后视为对被选择的角色使用一张【杀】(不计入次数限制);若你没赢,则你本阶段内不能使用【杀】。", + zhangxun: "张勋", + suizheng: "随征", + suizheng_info: "结束阶段,你可以选择一名角色A,获得如下效果直到其下回合结束:①A于下回合出牌阶段内使用【杀】的次数上限+1且无距离限制;②A下回合的出牌阶段结束时,你可以选择一名此阶段内受到过A造成的伤害的角色B,视为对B使用一张【杀】。", + dc_liuba: "刘巴", + dczhubi: "铸币", + dczhubi_info: "当有♦牌因弃置而进入弃牌堆后,你可以令系统从牌堆/弃牌堆中检索一张【无中生有】,并将此牌置于牌堆顶。", + dcliuzhuan: "流转", + dcliuzhuan_tag: "转", + dcliuzhuan_info: "锁定技。①其他角色于其回合内不于摸牌阶段而得到的牌称为“转”。②你不能成为实体牌中包含“转”的牌的目标。③当有“转”直接进入弃牌堆或经由处理区进入弃牌堆后,你获得之。", + huzhao: "胡昭", + midu: "弥笃", + midu_info: "出牌阶段限一次。你可以选择一项:⒈废除任意个装备栏或判定区,并令一名角色摸等量的牌。⒉恢复一个已经被废除的装备栏或判定区,然后你获得〖活墨〗直到下回合开始。", + xianwang: "贤望", + xianwang_info: "锁定技。若你有被废除的装备栏,则其他角色至你的距离+1,你至其他角色的距离-1;若废除的装备栏数大于2,则改为距离+2/-2。", + guanhai: "管亥", + suoliang: "索粮", + suoliang_info: "每回合限一次。当你对其他角色造成伤害后,你可以选择并展示其的至多X张牌(X为其体力上限且至多为5)。若这些牌中有♥或♣牌,则你获得这些牌;否则你弃置这些牌。", + qinbao: "侵暴", + qinbao_info: "锁定技。当你使用【杀】或普通锦囊牌时,你令所有手牌数不小于你的角色不能响应此牌。", + dc_lvkuanglvxiang: "吕旷吕翔", + dcshuhe: "数合", + dcshuhe_info: "出牌阶段限一次,你可以展示一张手牌并获得一枚“爵”。若场上有与此牌点数相同的牌,则你获得这些牌;否则你将此牌交给一名其他角色。", + dcliehou: "列侯", + dcliehou_info: "锁定技。摸牌阶段开始时,你令额定摸牌数+X;然后此摸牌阶段结束时,你选择一项:⒈弃置X张牌。⒉失去1点体力(X为你的“爵”数+1且至多为5)。", + yinfuren: "尹夫人", + dcyingyu: "媵予", + dcyingyu_info: "准备阶段开始时,你可以展示两名角色的各一张手牌。若这两张牌的花色不同,则你可以令一名角色获得另一名角色的展示牌。", + dcyongbi: "拥嬖", + dcyongbi_info: "限定技。出牌阶段,你可以将所有手牌交给一名其他男性角色。你将〖媵予〗的发动时机改为“准备阶段和结束阶段开始时”。然后若这些牌中包含的花色数:大于1,则你与其本局游戏的手牌上限+2;大于2,则当你或其于本局游戏内受到大于1的伤害时,此伤害-1。", + dc_huangquan: "黄权", + dcquanjian: "劝谏", + dcquanjian_info: "出牌阶段每项各限一次。你可以选择一项流程并选择一名其他角色A:⒈令A对其攻击范围内的另一名角色B造成1点伤害。⒉令A将手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌。然后A选择一项:⒈执行此流程。⒉本回合下次受到的伤害+1。", + dctujue: "途绝", + dctujue_info: "限定技。当你进入濒死状态时,你可以将所有牌交给一名其他角色。然后你回复等量的体力并摸等量的牌。", + chengui: "陈珪", + dcyingtu: "营图", + dcyingtu_info: "每回合限一次。当你的上家/下家于摸牌阶段外得到牌后,你可以获得其一张牌,然后将一张牌交给你的下家/上家。若你给出的牌为装备牌,则其使用之。", + dccongshi: "从势", + dccongshi_info: "锁定技。一名角色使用的装备牌结算结束后,若其装备区内的牌数为全场最多,则你摸一张牌。", + wanglie: "王烈", + dcchongwang: "崇望", + dcchongwang_info: "其他角色使用基本牌或普通锦囊牌时,若你是本局游戏内上一张被使用的牌的使用者,则你可以选择一项:⒈令其于此牌结算结束后收回此牌对应的所有实体牌;⒉取消此牌的所有目标。", + dchuagui: "化归", + dchuagui_info: "出牌阶段开始时,你可以选择至多X名有牌的其他角色(X为场上每个阵营中最大阵营的人数,且你的选择结果不展示)。这些角色同时选择一项:⒈交给你一张牌,⒉展示一张牌。若这些角色均选择选项二,则你获得所有展示牌。", + gongsundu: "公孙度", + dczhenze: "震泽", + dczhenze_info: "弃牌阶段开始时,你可以选择一项:1.令所有手牌数与体力值大小关系与你不同的角色失去1点体力;2.令所有手牌数和体力值关系与你相同的角色回复1点体力。", + dcanliao: "安辽", + dcanliao_info: "出牌阶段限X次(X为群势力角色数)。你可以重铸一名角色的一张牌。", + dc_yuejiu: "乐就", + dccuijin: "催进", + dccuijin_info: "当你或你攻击范围内的角色使用【杀】或【决斗】时,你可以弃置一张牌,令此牌的伤害基数+1。然后当此牌被目标角色抵消或无效或防止伤害后,你摸两张牌并对使用者造成1点伤害。", + panghui: "庞会", + dcyiyong: "异勇", + dcyiyong_info: "当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。", + chenjiao: "陈矫", + dcxieshoux: "协守/清严", + dcxieshou: "协守", + dcxieshou_info: "每回合限一次。当一名角色受到伤害后,若你至其的距离不大于2,你可以令你的手牌上限-1,然后其选择一项:1.回复1点体力;2.复原,摸两张牌。", + dcqingyan: "清严", + dcqingyan_info: "每回合限两次。当你成为其他角色使用黑色牌的目标后,若你的手牌数:小于体力值,你可以将手牌补至体力上限;不小于体力值,你可以弃置一张牌令你的手牌上限+1。", + dcqizi: "弃子", + dcqizi_info: "锁定技。你不能对至其的距离大于2且正在进行濒死流程的角色使用【桃】。", + leibo: "雷薄", + dcsilve: "私掠", + dcsilve_info: "游戏开始时,你选择一名其他角色(对其他角色不可见),称为“私掠”角色。然后你获得以下效果:①当“私掠”角色造成伤害后,若你本回合未因此效果得到过受伤角色的牌,你可以获得受伤角色一张牌;②当“私掠”角色受到其他角色造成的伤害后,若伤害来源存活,你须对伤害来源使用一张【杀】(无距离限制),否则你弃置一张手牌。", + dcshuaijie: "衰劫", + dcshuaijie_info: "限定技。出牌阶段,若你的体力值与装备区里的牌数均大于“私掠”角色,或没有角色有“私掠”,你可以减1点体力上限,然后选择一项:1.获得“私掠”角色至多三张牌;2.从牌堆随机获得三张类型各不同的牌。最后将你的“私掠”角色改为你。", + dc_sp_jiaxu: "新杀SP贾诩", + dc_sp_jiaxu_prefix: "新杀SP", + dcjianshu: "间书", + dcjianshu_info: "出牌阶段限一次。你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,你令前者与后者拼点。赢的角色随机弃置一张牌,没赢的角色失去1点体力。若有角色因此死亡,你令你〖间书〗于此阶段发动的次数上限+1。", + dcyongdi: "拥嫡", + dcyongdi_info: "限定技。出牌阶段,你可以选择一名男性角色,若其:体力上限最少,其加1点体力上限;体力值最少,其回复1点体力;手牌数最少,其摸X张牌(X为其体力上限且至多为5)。", + liupi: "新杀刘辟", + liupi_prefix: "新杀", + dcjuying: "踞营", + dcjuying_info: "出牌阶段结束时,若你于此阶段内使用【杀】的次数未达到上限,你可以选择任意项:1.下回合使用【杀】的次数上限+1;2.本回合手牌上限+2;3.摸三张牌。若你选择的项数超过了你的体力值,你弃置一张牌。", + dc_huanghao: "新杀黄皓", + dc_huanghao_prefix: "新杀", + dcqinqing: "寝情", + dcqinqing_info: "结束阶段,你可以弃置一名攻击范围内包含一号位的其他角色一张牌。然后若其手牌数大于一号位,你摸一张牌。", + dccunwei: "存畏", + dccunwei_info: "锁定技。当你成为其他角色使用的锦囊牌的目标后,若你是唯一目标,你摸一张牌;否则你弃置一张牌。", + dc_zhaotongzhaoguang: "赵统赵广", + dcqingren: "青刃", + dcqingren_info: "结束阶段,你可以摸X张牌(X为你本回合发动〖翊赞〗的次数)。", + dclongyuan: "龙渊", + dclongyuan_info: "锁定技。一名角色的回合结束时,若你本局游戏已发动过至少三次〖翊赞〗,你摸两张牌并回复1点体力,修改〖翊赞〗。", + zhenghun: "郑浑", + dcqiangzhi: "强峙", + dcqiangzhi_info: "出牌阶段限一次。你可以弃置你和一名其他角色的共计三张牌。然后若你与其之中有角色因此失去了三张牌,该角色对另一名角色造成1点伤害。", + dcpitian: "辟田", + dcpitian_info: "①当你的牌被弃置后,或当你受到伤害后,你的手牌上限+1。②结束阶段,若你的手牌数小于手牌上限,你可以摸至手牌上限(至多摸五张),然后重置因〖辟田①〗增加的手牌上限。", + furongfuqian: "傅肜傅佥", + dcxuewei: "血卫", + dcxuewei_info: "结束阶段,你可以选择一名体力值不大于你的角色,然后你获得如下效果直到你的下回合开始时:当其受到伤害时,防止此伤害,然后你失去1点体力,你与其各摸一张牌(若该角色为你,则改为你摸一张牌)。", + dcyuguan: "御关", + dcyuguan_info: "一名角色的回合结束时,若你已损失的体力值为全场最多,你可以减1点体力上限,然后令至多X名角色将手牌摸至体力上限(X为你已损失的体力值)。", + qinlang: "秦朗", + dchaochong: "昊宠", + dchaochong_info: "当你使用牌后,你可以将手牌摸至或弃置至你的手牌上限数(至多摸五张)。然后若你以此法:得到牌,你的手牌上限-1;失去牌,你的手牌上限+1。", + dcjinjin: "矜谨", + dcjinjin_info: "每回合限两次。当你造成或受到伤害后,你可以重置因〖昊宠〗增加或减少的手牌上限,令伤害来源弃置至多X张牌,然后你摸Y张牌(X为你以此法变化的手牌上限且至少为1,Y为X减其以此法弃置的牌数)。", + xianglang: "向朗", + dckanji: "勘集", + dckanji_info: "出牌阶段限两次。你可以展示所有手牌,若花色均不同,你摸两张牌。然后若你的手牌因此包含了四种花色,你跳过下一个弃牌阶段。", + dcqianzheng: "愆正", + dcqianzheng_info: "每回合限两次。当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以重铸两张牌。若你以此法重铸的牌中没有与指定你为目标的牌类别相同的牌,你于此牌对应的实体牌进入弃牌堆后获得此牌对应的所有实体牌。", + qiaorui: "桥蕤", + dcaishou: "隘守", + dcaishou_tag: "隘", + dcaishou_info: "①结束阶段,你可以摸X张牌,称为“隘”(X为你的体力上限)。②准备阶段,你弃置所有“隘”,若你以此法弃置的牌数大于体力值且你的体力上限小于9,你加1点体力上限。③当你于回合外失去最后一张“隘”后,你减1点体力上限。", + dcsaowei: "扫围", + dcsaowei_info: "当一名其他角色使用【杀】结算结束后,若此牌的目标角色不包含你且均在你的攻击范围内,你可以将一张“隘”当做【杀】对所有目标角色使用。以此法转化的【杀】结算完毕后,若此【杀】造成过伤害,你获得此【杀】对应的实体牌。", + yuantanyuanxiyuanshang: "袁谭袁尚袁熙", + dcneifa: "内伐", + dcneifa_info: "出牌阶段开始时,你可以摸三张牌,然后弃置一张牌。若你弃置的牌类型为:基本牌,本阶段你不能使用锦囊牌,且【杀】的使用次数上限+X且可以额外指定一名目标;锦囊牌,本阶段你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5。你以此法选择的额外目标均无距离限制)。", + dc_sunziliufang: "新杀孙资刘放", + dc_sunziliufang_prefix: "新杀", + dcqinshen: "勤慎", + dcqinshen_info: "弃牌阶段结束时,你可以摸X张牌(X为本回合未进入过弃牌堆的花色数)。", + dcweidang: "伪谠", + dcweidang_info: "其他角色的结束阶段,你可以将一张字数为X的牌置于牌堆底,然后获得牌堆里一张字数为X的牌(X为本回合未进入过弃牌堆的花色数)。若你能使用此牌,你使用之。", + mengjie: "孟节", + dcyinlu: "引路", + dcyinlu_info: "①游戏开始时,你令三名角色依次分别获得“乐泉”、“藿溪”、“瘴气”标记(若场上角色数为2则改为令一名其他角色获得其中2枚,你获得剩余标记),然后你获得“芸香”标记并获得1点“芸香”值。②准备阶段/有〖引路〗标记的角色死亡时,你可以移动一名角色的1枚/其的所有〖引路〗标记。", + dcyinlu_lequan: "乐泉", + dcyinlu_lequan_info: "结束阶段,你可以弃置一张♦牌并回复1点体力。", + dcyinlu_huoxi: "藿溪", + dcyinlu_huoxi_info: "结束阶段,你可以弃置一张♥牌并摸两张牌。", + dcyinlu_zhangqi: "瘴气", + dcyinlu_zhangqi_info: "锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。", + dcyinlu_yunxiang: "芸香", + dcyinlu_yunxiang_info: "①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。", + dcyouqi: "幽栖", + dcyouqi_info: "锁定技。当其他角色因〖引路〗标记弃置牌后,你有一定概率获得此牌。", + dcyouqi_faq: "〖幽栖〗概率
    ", + dcyouqi_faq_info: "当满足〖幽栖〗条件时,系统生成一个随机数X∈[0,1)。若X小于(1.25-0.25Y),或幸运星模式已开启,你获得此牌(Y为你至该角色的距离)。", + dc_sunhanhua: "孙寒华", + dchuiling: "汇灵", + dchuiling_info: "锁定技。当你使用牌时,若此牌颜色为弃牌堆中数量较少的颜色,你获得1枚“灵”标记。若弃牌堆中:红色牌数大于黑色牌数,你回复1点体力;黑色牌数大于红色牌数,你可以弃置一名其他角色的一张牌。", + dcchongxu: "冲虚", + dcchongxu_info: "限定技。出牌阶段,若“灵”数不小于4,你可以失去〖汇灵〗,增加等同于“灵”数的体力上限(至多增加场上人数的体力上限),然后获得〖踏寂〗和〖清荒〗。", + dctaji: "踏寂", + dctaji_info: "当你失去手牌后,根据你失去牌的原因执行以下效果:1.使用:你弃置其他角色一张牌;2.打出:你摸一张牌;3.弃置:你回复1点体力;4.其他:你下一次对其他角色造成伤害时,此伤害+1。", + dcqinghuang: "清荒", + dcqinghuang_info: "出牌阶段开始时,你可以减1点体力上限,然后你于本回合发动〖踏寂〗时额外随机执行一种效果。", + dc_huojun: "霍峻", + dcgue: "孤扼", + dcgue_info: "每回合限一次。当你需要于回合外使用或打出【杀】或【闪】时,你可以发动此技能:你展示所有手牌,若其中【杀】和【闪】的数量之和不超过1,你视为使用或打出此牌。", + dcsigong: "伺攻", + dcsigong_info: "其他角色的回合结束时,若其于本回合内使用牌被响应过,你可以将手牌摸至或弃置至1,视为对其使用一张需使用X张【闪】抵消的【杀】,且此【杀】的伤害基数+1(X为你以此法弃置的牌数且至少为1)。当你以此法造成伤害后,该技能于本轮失效。", + peiyuanshao: "裴元绍", + oldmoyu: "没欲", + oldmoyu_info: "出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】,且此【杀】伤害基数为X(X为你于本回合发动此技能的次数)。若此【杀】对你造成了伤害,你令此技能于本回合失效。", + dcmoyu: "没欲", + dcmoyu_info: "出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】。若此【杀】:未对你造成过伤害,你将此技能于此阶段下次获得的牌数改为两张;对你造成过伤害,你令此技能于本回合失效。", + zhangchu: "张楚", + dcjizhong: "集众", + dcjizhong_info: "出牌阶段限一次。你可以令一名其他角色摸两张牌,然后其选择一项:1.若其没有“信众”标记,其获得“信众”标记;2.交给你三张手牌。", + dcrihui: "日彗", + dcrihui_info: "每回合限一次。当你使用普通锦囊牌或黑色基本牌结算结束后,若此牌的目标数为1且目标不为你,且其:没有“信众”,则所有有“信众”的角色依次视为对其使用一张与此牌牌名和属性相同的牌;有“信众”,则你可以获得其区域里的一张牌。", + dcguangshi: "光噬", + dcguangshi_info: "锁定技。准备阶段,若所有其他角色均有“信众”,你摸两张牌并失去1点体力。", + dongwan: "董绾", + dcshengdu: "生妒", + dcshengdu_info: "回合开始时,你可以选择一名其他角色,令其获得1枚“生妒”标记。有“生妒”标记的角色于摸牌阶段得到牌后,你摸X张牌,然后其移去所有“生妒”标记(X为摸牌数乘以其拥有的“生妒”标记数)。", + dcjieling: "介绫", + dcjieling_info: "出牌阶段每种花色限一次,你可以将两张花色不同的手牌当无距离限制且无任何次数限制的【杀】使用。然后若此【杀】:造成了伤害,所有目标角色失去1点体力;未造成伤害,所有目标角色依次获得1枚“生妒”标记。", + yuanyin: "袁胤", + dcmoshou: "墨守", + dcmoshou_info: "当你成为其他角色使用的黑色牌的目标后,你可以摸X张牌(X为你本局游戏此前发动过此技能的次数÷3的余数+1)。", + dcyunjiu: "运柩", + dcyunjiu_info: "一名角色死亡后,你可以弃置等同于其因死亡事件的规则而弃置的牌数,将其此次弃置的牌交给一名其他角色。然后你加1点体力上限并回复1点体力。", + gaoxiang: "高翔", + dcchiying: "驰应", + dcchiying_info: "出牌阶段限一次。你可以选择一名体力不大于你的角色,令其攻击范围内的其他角色依次弃置一张牌。然后若你选择的角色不为你,其获得以此法弃置的牌中所有的基本牌。", + zhangkai: "张闿", + dcxiangshu: "相鼠", + dcxiangshu_info: "其他角色的出牌阶段开始时,若其手牌数不小于其体力值,你可以选择一个不大于5的非负整数,然后你弃置一张牌或声明此数字。若如此做,此阶段结束时,若其手牌数与你选择的数字:差值不大于1,你获得其一张牌;相等,你对其造成1点伤害。", + mengyou: "孟优", + dcmanzhi: "蛮智", + dcmanzhi_info: "①准备阶段,你可以选择一名其他角色并选择一项:1.令其交给你两张牌,然后其视为使用一张无距离限制的【杀】;2.获得其区域内至多两张牌,然后交给其等量的牌并摸一张牌。②结束阶段,若你的体力值与本回合准备阶段时的体力值相等,你可以执行你未于本回合执行过的〖蛮智①〗的分支。", + dc_sunchen: "孙綝", + dczigu: "自固", + dczigu_info: "出牌阶段限一次。你可以弃置一张牌,然后获得场上的一张装备牌。若你没有因此获得其他角色的牌,你摸一张牌。", + dczuowei: "作威", + dczuowei_info: "当你于回合内使用牌时,你可以根据你的手牌数执行对应效果:大于X,令此牌不可被响应;等于X,对一名其他角色造成1点伤害;小于X,摸两张牌且不能于本回合再触发该选项(X为你装备区里牌的数量且至少为1)。", + liuchongluojun: "刘宠骆俊", + dcminze: "悯泽", + dcminze_info: "①出牌阶段每名角色限一次。你可以将至多两张牌名不同的牌交给一名手牌数小于你的角色。②结束阶段,你将手牌摸至X张(X为你本回合因〖悯泽①〗失去过的牌的牌名数且至多为5)。", + dcjini: "击逆", + dcjini_info: "当你受到伤害后,你可以重铸至多Y张手牌(Y为你的体力上限减本回合你以此法重铸过的牌数)。若你以此法获得了【杀】,你可以对伤害来源使用一张无视距离且不可被响应的【杀】。", + yuechen: "乐綝", + dcporui: "破锐", + dcporui_info: "每轮限一次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】,然后你交给其X张手牌(X为其本回合失去的牌数且至多为5)。", + dcgonghu: "共护", + dcgonghu_info: "锁定技。①当你于回合外失去基本牌后,若你本回合内失去基本牌的数量大于1,你将〖破锐〗改为每轮限两次。②当你造成或受到伤害后,若你本回合内造成或受到的总伤害大于1,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。", + yue_caiwenji: "乐蔡琰", + yue_caiwenji_prefix: "乐", + dcshuangjia: "霜笳", + dcshuangjia_tag: "胡笳", + dcshuangjia_info: "锁定技。①游戏开始,你将你的手牌标记为“胡笳”。②你的“胡笳”牌不计入手牌上限。③其他角色至你的距离+X(X为你的“胡笳”数且至多为5)。", + dcbeifen: "悲愤", + dcbeifen_info: "锁定技。①当你失去牌后,若这些牌中有“胡笳”牌,你获得与你手牌中“胡笳”牌花色均不同的每种花色的牌各一张。②若你手牌中“胡笳”牌数小于不为“胡笳”牌的牌数,你使用牌无距离和次数限制。", + dc_wuban: "吴班", + dcyouzhan: "诱战", + dcyouzhan_info: "锁定技。当其他角色于你的回合内失去一张牌后,你摸一张牌(不计入本回合的手牌上限),且其获得如下效果:1.其于此回合下一次受到的伤害+1;2.结束阶段,若其于此回合未受到过伤害,其摸X张牌(X为其此回合失去过牌的次数且至多为3)。", + yue_zhoufei: "乐周妃", + yue_zhoufei_prefix: "乐", + dclingkong: "灵箜", + dclingkong_tag: "箜篌", + dclingkong_info: "锁定技。①游戏开始时,你将所有手牌标记为“箜篌”。②你的“箜篌”牌不计入手牌上限。③当你于一回合内首次于摸牌阶段外得到牌后,你将这些牌标记为“箜篌”。", + dcxianshu: "贤淑", + dcxianshu_info: "出牌阶段,你可以将一张“箜篌”正面向上交给一名其他角色,然后你摸X张牌(X为你与其的体力值之差且至多为5)。若此牌为红色,且该角色的体力值不大于你,则其回复1点体力;若此牌为黑色,且该角色的体力值不小于你,则其失去1点体力。", + dc_zhangmancheng: "张曼成", + dclvecheng: "掠城", + dclvecheng_info: "出牌阶段限一次。你可以选择一名其他角色,你于本回合对其使用当前手牌中的【杀】无任何次数限制。然后回合结束时,其展示所有手牌,若其中有【杀】,其可以选择对你依次使用其中所有的【杀】。", + dczhongji: "螽集", + dczhongji_info: "当你使用牌时,若此牌无花色或你手牌区里没有与此牌花色相同的手牌,你可以将手牌摸至体力上限并弃置X张牌(X为本回合发动〖螽集〗的次数)。", + dc_jiachong: "贾充", + dcbeini: "悖逆", + dcbeini_info: "出牌阶段限一次。你可以将手牌调整至体力上限,然后令一名角色视为对另一名角色使用一张【杀】,且这些角色的非锁定技失效直到回合结束。", + dcshizong: "恃纵", + dcshizong_info: "当你需要使用一张基本牌时,你可以交给一名其他角色X张牌,然后其可以将一张牌置于牌堆底,视为你使用之。若其不为当前回合角色,此技能失效直到回合结束(X为你本回合发动〖恃纵〗的次数)。", + pangshanmin: "庞山民", + dccaisi: "才思", + dccaisi_info: "当你于回合内/回合外使用基本牌结算结束后,你可以从牌堆/弃牌堆随机获得一张非基本牌,然后若你本回合发动此技能的次数:小于你的体力上限,本回合你发动此技能获得的牌数+1;大于等于你的体力上限,本回合此技能失效。", + dczhuoli: "擢吏", + dczhuoli_info: "锁定技。一名角色的回合结束时,若你本回合使用或获得的牌数大于体力值,你加1点体力上限(不能超过游戏人数),回复1点体力。", + yue_caiyong: "乐蔡邕", + yue_caiyong_prefix: "乐", + dcjiaowei: "焦尾", + dcjiaowei_tag: "弦", + dcjiaowei_info: "锁定技。①游戏开始时,你将所有手牌标记为“弦”。②你的“弦”牌不计入手牌上限。③当你受到伤害时,若来源的手牌数不大于你的“弦”牌数,防止此伤害。", + dcfeibai: "飞白", + dcfeibai_info: "每回合限一次。当你使用牌结算结束后,若你本回合使用过至少两张牌,你可以随机获得一张字数为X的牌。若你的“弦”数不大于X,你重置〖飞白〗(X为此牌与你使用的上一张牌的字数之和)。", + kuaiqi: "蒯祺", + dcliangxiu: "良秀", + dcliangxiu_info: "出牌阶段,你可以弃置两张不同类型的牌,然后从两张与你弃置的牌类型均不同的牌中选择一张获得之(每阶段每种类型限一次)。", + dcxunjie: "殉节", + dcxunjie_info: "每轮每项限一次。一名角色的回合结束时,若你本回合于摸牌阶段外得到过牌,你可以选择一项:1.令一名角色将手牌数摸或弃置至与其体力值相同;2.令一名角色将体力回复或失去至与其手牌数相同。", + dc_dongzhao: "董昭", + dcyijia: "移驾", + dcyijia_info: "一名角色受到伤害后,若你至其的距离不大于1,你可以将场上一张装备牌移动至其对应装备栏(替换原装备)。若其因此脱离了一名角色的攻击范围,你摸一张牌。", + dcdingji: "定基", + dcdingji_info: "准备阶段,你可以令一名角色将手牌摸或弃置至五张,然后其展示手牌。若牌名均不同,则其可以视为使用其中一张基本或普通锦囊牌。", + yue_xiaoqiao: "乐小乔", + yue_xiaoqiao_prefix: "乐", + dcqiqin: "绮琴", + dcqiqin_tag: "琴", + dcqiqin_info: "锁定技。①游戏开始时,你将所有手牌标记为“琴”。②你的“琴”牌不计入手牌上限。③准备阶段,你获得位于弃牌堆的所有“琴”。", + dcweiwan: "媦婉", + dcweiwan_info: "出牌阶段限一次,你可以弃置一张“琴”并随机获得一名其他角色区域内花色与此牌不相同的牌各一张,若你获得了:一张牌,其失去1点体力;两张牌,本回合你对其使用牌无距离和次数限制;三张牌,本回合你不能对其使用牌。", + dc_lingcao: "新杀凌操", + dc_lingcao_prefix: "新杀", + dcdufeng: "独锋", + dcdufeng_info: "锁定技。出牌阶段开始时,你失去1点体力或废除一个装备栏,摸X张牌,然后你的攻击范围与使用【杀】的次数上限均为X直到回合结束(X为你已废除的装备栏数与损失的体力值之和,至多为你的体力上限)。", + dc_sp_menghuo: "群孟获", + dc_sp_menghuo_prefix: "群", + dcmanwang: "蛮王", + dcmanwang_info: "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。", + dcpanqin: "叛侵", + dcpanqin_info: "出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项,然后加1点体力上限并回复1点体力。", + dc_kongrong: "孔融", + dckrmingshi: "名士", + dckrmingshi_info: "锁定技,当你受到其他角色造成的伤害时,若其手牌数大于你,则其需弃置一张手牌,否则此伤害-1。", + yue_daqiao: "乐大乔", + yue_daqiao_prefix: "乐", + dczixi: "姊希", + dczixi_info: "①出牌阶段开始和结束时,你可以将一张“琴”当作一张无效果的【乐不思蜀】、【兵粮寸断】或【闪电】置于一名角色的判定区。②当你使用基本牌或普通锦囊牌指定唯一目标后,你可根据其判定区内的牌数执行对应项:1.令此牌对其额外结算一次;2.摸两张牌;3.弃置其判定区所有牌,对其造成3点伤害。", + jiangfei: "蒋琬费祎", + dcshengxi: "生息", + dcshengxi_info: "弃牌阶段结束时,若你本回合未造成过伤害,你可以摸两张牌。", + dcshoucheng: "守成", + dcshoucheng_info: "每回合限一次,当一名角色于其回合外失去手牌后,若其没有手牌,你可令其摸两张牌。", + dc_liuli: "刘理", + dcfuli: "抚黎", + dcfuli_info: "出牌阶段限一次,你可以展示手牌并弃置一种类别的所有手牌,然后摸X张牌(X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数)。若你因此弃置了伤害类卡牌,则你可以选择一名角色,令其攻击范围-1直到你的下个回合开始。", + dcdehua: "德化", + dcdehua_info: "锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗。②你的手牌上限+Y(Y为你〖德化①〗选择过的牌名数)。", + gongsunxiu: "公孙修", + dcgangu: "干蛊", + dcgangu_info: "锁定技。每回合限一次。当其他角色失去体力后,你摸两张牌,然后失去1点体力。", + dckuizhen: "溃阵", + dckuizhen_info: "出牌阶段限一次。你可以令一名手牌数或体力值大于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。", + dc_jiangji: "蒋济", + dcshiju: "势举", + dcshiju_info: "其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+X(X为你装备区里的牌数)。若你以此法替换了装备,你与其各摸两张牌。", + dcyingshi: "应时", + dcyingshi_info: "每回合每项各限一次。当你使用普通锦囊牌指定目标后,你可令其中一个目标选择一项:⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌;⒉弃置X张牌,此牌对其无效(X为你装备区里的牌数)。", + dc_wangling: "王淩", + dcjichou: "集筹", + dcjichou_info: "出牌阶段结束时,若你于此阶段使用过牌且这些牌的牌名均不同,你可以观看位于弃牌堆中的这些牌,选择任意张牌并选择等量角色,将这些牌交给这些角色各一张,然后你摸X张牌(X为你本局游戏首次发动〖集筹〗给出的牌数)。", + dcmouli: "谋立", + dcmouli_info: "觉醒技。回合结束时,若你因〖集筹〗给出的牌的牌名总数不小于5,你加1点体力上限并回复1点体力,然后获得〖自缚〗。", + dczifu: "自缚", + dczifu_info: "锁定技。出牌阶段开始时,你将手牌摸至体力上限(至多摸至五张)。若你以此法得到牌,你须选择手牌中不同牌名的牌各一张,然后弃置其余的手牌。", + dc_simashi: "司马师", + dcsanshi: "散士", + dcsanshi_tag: "死士", + dcsanshi_info: "锁定技。①第一轮游戏开始时,你令系统将牌堆中每个点数的随机一张牌永久标记为“死士”(“死士”对你可见)。②一名角色的回合结束时,若本回合有“死士”不因你使用或打出而进入弃牌堆,你于弃牌堆中获得这些牌。③你使用“死士”不能被响应。", + dczhenrao: "震扰", + dczhenrao_info: "每回合每名角色限一次。当你使用牌指定第一个目标后,若目标角色包含其他角色,或当其他角色使用牌指定你为目标后,你可以选择手牌数大于你的其中一个目标或此牌的使用者,然后对其造成1点伤害。", + dcchenlve: "沉略", + dcchenlve_info: "限定技。出牌阶段,你可以将牌堆、弃牌堆、场上及其他角色的手牌区里的所有“死士”置入处理区,然后你获得这些牌。若如此做,你获得如下效果:1.此回合结束时,你将这些牌移出游戏;2.当你死亡时,你将所有以此法移出游戏的“死士”置入弃牌堆。", + dc_caoshuang: "新杀曹爽", + dc_caoshuang_prefix: "新杀", + dcjianzhuan: "渐专", + dcjianzhuan_info: "锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:⒈令一名角色弃置X张牌;⒉摸X张牌;⒊重铸X张牌;⒋弃置X张牌(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。", + dcjianzhuan_faq: "渐专概率", + dcjianzhuan_faq_info: "
    当系统随机选择要删除的选项时,“弃置X张牌”的选项概率固定为90%;剩余选项平分剩余的的10%概率。
    如第一次删除时,删除弃牌选项概率为90%,其余三个选项被删除的概率均为3.33%,若删除了非弃牌选项,第二次删除时,删除弃牌选项的概率依旧是90%,其余两个选项被删除的概率均为5%。", + dcfanshi: "返势", + dcfanshi_info: "觉醒技,结束阶段,若〖渐专①〗剩余选项数小于2,则你执行三次X视为1的剩余选项,然后增加2点体力上限并回复2点体力,失去技能〖渐专〗并获得技能〖覆斗〗。", + dcfudou: "覆斗", + dcfudou_info: "当你使用黑色牌/红色牌指定唯一目标后,若该角色不为你,且其于本局游戏对你/未对你造成过伤害,则你可以与其各失去1点体力/各摸一张牌。", + wupu: "吴普", + dcduanti: "锻体", + dcduanti_info: "锁定技。当你使用或打出牌结算结束后,若此牌是你本局游戏使用或打出过的牌中的第5X张牌(X∈N⁺),你回复1点体力,然后若你以此法增加的上限小于5,你加1点体力上限。", + dcshicao: "识草", + dcshicao_info: "出牌阶段,你可以声明一种类型,然后选择从牌堆顶或牌堆底摸一张牌。若此牌类型与你声明的类型不同,你观看牌堆另一端的两张牌,此技能本回合失效。", +}; + +export default translates; diff --git a/character/huicui/voices.js b/character/huicui/voices.js new file mode 100644 index 000000000..998d892f0 --- /dev/null +++ b/character/huicui/voices.js @@ -0,0 +1,502 @@ +export default { + "#dcjianzhuan1": "今作擎天之柱,何怜八方风雨?", + "#dcjianzhuan2": "吾寄百里之命,当居万丈危楼。", + "#dcfanshi1": "垒巨木为寨,发屯兵自守。", + "#dcfanshi2": "吾居伊周之位,怎可以罪见黜?", + "#dc_caoshuang:die": "我度太傅之意,不欲伤我兄弟耳……", + "#hengjiang1": "霸必奋勇杀敌,一雪夷陵之耻!", + "#hengjiang2": "江横索寒,阻敌绝境之中!", + "#zangba:die": "短刃沉江,负主重托……", + "#dcsanshi1": "春雨润物,未觉其暖,已见其青。", + "#dcsanshi2": "养士效孟尝,用时可得千臂之助力。", + "#dczhenrao1": "此病需静养,怎堪兵戈铁马之扰。", + "#dczhenrao2": "孤值有疾,竟为文家小儿所扰。", + "#dcchenlve1": "怀泰山之重,必立以千仞。", + "#dcchenlve2": "万世之勋待取,此乃亮剑之时。", + "#dc_simashi:die": "东兴之败,此我过也,诸将何罪!", + "#dcjichou1": "备武整戈,待天下风起之时。", + "#dcjichou2": "定淮联兖,邀群士共襄大义。", + "#dcmouli1": "君上暗弱,以致受制于强臣。", + "#dcmouli2": "吾闻楚王彪有智勇,可迎之于许都。", + "#dczifu1": "今势穷,吾自缚于斯,请太傅发落。", + "#dczifu2": "凌有罪,公劳师而来,唯系首待斩。", + "#dc_wangling:die": "曹魏之盛,再难复梦。", + "#dcshiju1": "借力为己用,可攀青云直上。", + "#dcshiju2": "应势而动,事半而功倍。", + "#dcyingshi1": "今君失道寡助,何不审时以降?", + "#dcyingshi2": "君既掷刀于地,可保富贵无虞。", + "#dc_jiangji:die": "大醉解忧,然忧无解,唯忘耳……", + "#dcgangu1": "干父之蛊,全辽裔未竟之业。", + "#dcgangu2": "承志奉祠,达于行伍之事。", + "#dckuizhen1": "今一马当先,效霸王破釜!", + "#dckuizhen2": "自古北马皆傲,视南风为鱼俎。", + "#gongsunxiu:die": "大星坠地,父子俱亡……", + "#dcfuli1": "民为贵,社稷次之,君为轻。", + "#dcfuli2": "民之所欲,天必从之。", + "#dcdehua1": "君子怀德,可驱怀土之小人。", + "#dcdehua2": "以德与人,福虽未至,祸已远离。", + "#dc_liuli:die": "覆舟之水,皆百姓之泪。", + "#dcqiqin_yue_daqiao1": "山月栖瑶琴,一曲渔歌和晚音。", + "#dcqiqin_yue_daqiao2": "指尖有琴音,何不于君指上听?", + "#dczixi1": "日暮飞伯劳,倦梳头,坐看鸥鹭争舟。", + "#dczixi2": "姊折翠柳寄江北,念君心悠悠。", + "#yue_daqiao:die": "曲终人散,再会奈何桥畔……", + "#mingshi1": "孔门之后,忠孝为先。", + "#mingshi2": "名士之风,仁义高洁。", + "#lirang1": "夫礼先王以承天之道,以治人之情。", + "#lirang2": "谦者,德之柄也,让者,礼之逐也。", + "#dc_kongrong:die": "覆巢之下,岂有完卵……", + "#spmanwang1": "不服王命,纵兵凶战危,也应以血相偿!", + "#spmanwang2": "夷汉所服,据南中诸郡,当以蛮王为号!", + "#dc_sp_menghuo:die": null, + "#dcdufeng1": null, + "#dcdufeng2": null, + "#dc_lingcao:die": "呃啊!(扑通)此箭……何来……", + "#dcqiqin1": "渔歌唱晚落山月,素琴薄暮声。", + "#dcqiqin2": "指上琴音浅,欲听还需抚瑶琴。", + "#dcweiwan1": "繁花初成,所幸未晚于桑榆。", + "#dcweiwan2": "群胥泛舟,共载佳期若瑶梦。", + "#yue_xiaoqiao:die": "独寄人间白首,曲误周郎难顾……", + "#dcyijia1": "曹侯忠心可鉴,可暂居其檐下。", + "#dcyijia2": "今东都糜败,陛下当移驾许昌。", + "#dcdingji1": "丞相宜进爵国公,以彰殊勋。", + "#dcdingji2": "今公与诸将并侯,岂天下所望哉!", + "#dc_dongzhao:die": "凡有天下者,无虚伪不真之人……", + "#dcliangxiu1": "君子性谦,不夺人之爱。", + "#dcliangxiu2": "蒯门多隽秀,吾居其末。", + "#dcxunjie1": "君子有节,可杀而不可辱。", + "#dcxunjie2": "吾受国命,城破则身死。", + "#kuaiqi:die": "泉下万事休,人间雪满头……", + "#dcjiaowei1": null, + "#dcjiaowei2": null, + "#dcfeibai1": null, + "#dcfeibai2": null, + "#yue_caiyong:die": "感叹世事,何罪之有?", + "#dccaisi1": "扶耒耜,植桑陌,习诗书,以传家。", + "#dccaisi2": "惟楚有才,于庞门为盛。", + "#dczhuoli1": "良子千万,当擢才而用。", + "#dczhuoli2": null, + "#pangshanmin:die": "九品中正后,庙堂无寒门……", + "#dcbeini1": "臣等忠心耿耿,陛下何故谋反?", + "#dcbeini2": "公等养汝,正拟今日,复何疑?", + "#dcshizong1": "成济、王经已死,独我安享富贵。", + "#dcshizong2": "吾乃司马公心腹,顺我者生!", + "#dc_jiachong:die": "诸公勿怪,充乃奉命行事……", + "#dczigu1": "卿有成材良木,可妆吾家江山。", + "#dczigu2": "吾好锦衣玉食,卿家可愿割爱否?", + "#dczuowei1": "不顺我意者,当填在野之壑。", + "#dczuowei2": "吾令不从者,当膏霜锋之锷。", + "#dc_sunchen:die": "臣家火起,请离席救之……", + "#dclvecheng1": "我等一无所有,普天又有何惧?", + "#dclvecheng2": "我视百城为饵,皆可食之果腹。", + "#dczhongji1": "羸汉暴政不息,黄巾永世不绝。", + "#dczhongji2": "宛洛膏如秋实,怎可不生螟虫?", + "#dc_zhangmancheng:die": "逡巡不前,坐以待毙……", + "#dclingkong1": "吴宫绿荷惊涟漪,飞燕啄新泥。", + "#dclingkong2": "箜篌奏晚歌,渔樵有归期。", + "#dcxianshu1": "居宠而不骄,秉贤淑于内庭。", + "#dcxianshu2": "心怀玲珑意,宜家国于春秋。", + "#yue_zhoufei:die": "红颜薄命,望君珍重……", + "#dcyouzhan1": "本将军在此!贼仲达何在?", + "#dcyouzhan2": "以身为饵,诱老贼出营。", + "#dc_wuban:die": "班……有负丞相重望……", + "#dcshuangjia1": "塞外青鸟匿,不闻折柳声。", + "#dcshuangjia2": "向晚吹霜笳,雪落白发生。", + "#dcbeifen1": "此心如置冰壶,无物可暖。", + "#dcbeifen2": "年少爱登楼,欲说语还休。", + "#yue_caiwenji:die": "天何薄我,天何薄我……", + "#dcminze1": "百姓千载皆苦,勿以苛政待之。", + "#dcminze2": "黎庶待哺,人主当施恩德泽。", + "#dcjini1": "备劲弩强刃,待恶客上门。", + "#dcjini2": "逆贼犯境,诸君当共击之。", + "#liuchongluojun:die": "袁术贼子,折我大汉基业……", + "#dcporui1": "承父勇烈,问此间谁堪敌手。", + "#dcporui2": "敌锋虽锐,吾亦击之如破卵。", + "#dcgonghu1": "大都督中伏,吾等当舍命救之。", + "#dcgonghu2": "袍泽临难,但有共死而无坐视。", + "#yuechen:die": "天下犹魏,公休何故如此?", + "#dcxiangshu1": "要财还是要命,选一个吧!", + "#dcxiangshu2": "有什么好东西,都给我交出来!", + "#zhangkai:die": "报应竟来得这么快……", + "#dcchiying1": "今诱老贼来此,必折其父子于上方谷。", + "#dcchiying2": "列柳城既失,当下唯死守阳平关。", + "#gaoxiang:die": "老贼不死,实天意也……", + "#dcmoshou1": null, + "#dcmoshou2": null, + "#dcyunjiu1": null, + "#dcyunjiu2": null, + "#yuanyin:die": null, + "#dcshengdu1": "姐姐有的,妹妹也要有。", + "#dcshengdu2": "你我同为佳丽,凭甚汝得独宠?", + "#dcjieling1": "来人,送冯氏上路!", + "#dcjieling2": "我有一求,请姐姐赴之。", + "#dongwan:die": "陛下饶命,妾并无歹意……", + "#dcjizhong1": "聚八方之众,昭黄天之明。", + "#dcjizhong2": "联苦厄黎庶,传大道太平。", + "#dcrihui1": "甲子双至,黄巾再起。", + "#dcrihui2": "日中必彗,操刀必割。", + "#dcguangshi1": "舍身饲火,光耀人间。", + "#dcguangshi2": "愿为奉光之薪柴,照太平于人间。", + "#zhangchu:die": "苦难不尽,黄天不死……", + "#dcmoyu1": "人之所有,我之所欲。", + "#dcmoyu2": "胸有欲壑千丈,自当饥不择食。", + "#peiyuanshao:die": "好生厉害的白袍小将……", + "#dcyinlu1": "南疆苦瘴,非土人不得过。", + "#dcyinlu2": "闻丞相南征,某特来引之。", + "#dcyouqi1": "寒烟锁旧山,坐看云起出。", + "#dcyouqi2": "某隐居山野,不慕富贵功名。", + "#mengjie:die": "蛮人无知,请丞相教之……", + "#dcgue1": "哀兵必胜,况吾众志成城。", + "#dcgue2": "扼守孤城,试问万夫谁开?", + "#dcsigong1": "善守者亦善攻,不可死守。", + "#dcsigong2": "璋军疲敝,可伺机而攻。", + "#dc_huojun:die": "蒙君知恩,奈何早薨……", + "#dchuiling1": "天地有灵,汇于我眸间。", + "#dchuiling2": "撷四时钟灵,拈芳兰毓秀。", + "#dcchongxu1": "慕圣道冲虚,有求者皆应。", + "#dcchongxu2": "养志无为,遗冲虚于物外。", + "#dc_sunhanhua:die": "长生不长乐,悔觅仙途……", + "#dcqinshen1": "君不见砾砖素瓦,亦可成摘星之高楼乎?", + "#dcqinshen2": "某无惊世之才,亦非积富之家,唯托以勤慎。", + "#dcweidang1": "今既掌玺握权,焉能不为己谋划?", + "#dcweidang2": "托孤之大任,内可付与爽,外可付于懿。", + "#dc_sunziliufang:die": "我等虽死,然已享富贵荣华。", + "#dcneifa1": "同室操戈,胜者王、败者寇。", + "#dcneifa2": "兄弟无能,吾当继袁氏大统。", + "#yuantanyuanxiyuanshang:die": "同室内伐,贻笑大方……", + "#dcaishou1": "某家未闻有一合而破关之将。", + "#dcaishou2": "凭关而守,敌强又奈何?", + "#dcsaowei1": "今从王师猎虎,必擒吕布。", + "#dcsaowei2": "七军围猎,虓虎插翅难逃。", + "#qiaorui:die": "今兵败城破,唯死而已。", + "#dckanji1": "览文库全书,筑文心文胆。", + "#dckanji2": "世间学问,皆载韦编之上。", + "#dcqianzheng1": "悔往昔之种种,恨彼时之切切。", + "#dcqianzheng2": "罪臣怀咎难辞,有愧国恩。", + "#xianglang:die": "识文重义而徇私,恨也……", + "#dchaochong1": "朗螟蛉之子,幸隆曹氏厚恩。", + "#dchaochong2": "幸得义父所重,必效死奉曹。", + "#dcjinjin1": "螟蛉终非麒麟,不可气盛自矜。", + "#dcjinjin2": "我姓非曹,可敬人,不可欺人。", + "#qinlang:die": "二姓之人,死无其所……", + "#dcxuewei1": "慷慨赴国难,青山侠骨香。", + "#dcxuewei2": "舍身卫主之志,死犹未悔!", + "#dcyuguan1": "城后即为汉土,吾等无路可退!", + "#dcyuguan2": "舍身卫关,身虽死而志犹在。", + "#furongfuqian:die": "此间,何有汉将军降者!", + "#dcqiangzhi1": "吾民在后,岂惧尔等魍魉。", + "#dcqiangzhi2": "凶兵来袭,当长戈相迎。", + "#dcpitian1": "此间辟地数旬,必成良田千亩。", + "#dcpitian2": "民以物力为天,物力唯田可得。", + "#zhenghun:die": "此世为官,未辱青天之名……", + "#yizan_respond_shan1": "承吾父之勇,翊军立阵。", + "#yizan_respond_shan2": "继先帝之志,季兴大汉。", + "#dcqingren1": "此身忠义,可鉴天涯明月。", + "#dcqingren2": "青釭并龙胆,试刃三千里。", + "#xinfu_longyuan1": "金鳞岂是池中物,一遇风云便化龙。", + "#xinfu_longyuan2": "忍时待机,今日终于可以建功立业。", + "#dc_zhaotongzhaoguang:die": "皇上……丞相,统(广)愧矣……", + "#dcqinqing1": "陛下今日不理朝政,退下吧!", + "#dcqinqing2": "此事咱家自会传达陛下。", + "#huisheng_dc_huanghao1": "不就是想要好处嘛?", + "#huisheng_dc_huanghao2": "这些都拿去。", + "#dccunwei1": "陛下专宠,诸侯畏惧。", + "#dccunwei2": "君侧之人,众所畏惧。", + "#dc_huanghao:die": "难道都是我一个人的错吗!", + "#dcjuying1": "垒石为寨,纵万军亦可阻。", + "#dcjuying2": "如虎踞汝南,攻守自有我。", + "#liupi:die": "玄德公高义,辟宁死不悔!", + "#zhenlue1": null, + "#zhenlue2": null, + "#jianshu1": "来,让我看一出好戏吧。", + "#jianshu2": "纵有千军万马,离心则难成大事。", + "#yongdi1": "臣愿为世子,肝脑涂地。", + "#yongdi2": "嫡庶有别,尊卑有序。", + "#dc_sp_jiaxu:die": "哎,站错队伍才是根本问题。", + "#dcsilve1": "劫尔之富,济我之贫!", + "#dcsilve2": "徇私而动,劫财掠货。", + "#dcshuaijie1": "弱肉强食,实乃天地至理。", + "#dcshuaijie2": "恃强凌弱,方为我辈本色!", + "#leibo:die": "此人不可力敌,速退!", + "#dczhenze1": "名震千里,泽被海东。", + "#dczhenze2": "施威除暴,上下咸服。", + "#dcanliao1": "地阔天高,大有可为。", + "#dcanliao2": "水草丰沛,当展宏图。", + "#gongsundu:die": "为何都不愿出仕!", + "#dcyiyong1": "关氏鼠辈,庞令明之子来邪!", + "#dcyiyong2": "凭一腔勇力,父仇定可报还。", + "#panghui:die": "大仇虽报,奈何心有余创。", + "#dccuijin1": "军令如山,诸君焉敢不前?", + "#dccuijin2": "前攻者赏之,后靡斩之!", + "#dc_yuejiu:die": "此役既败,请速斩我……", + "#dcxieshou": null, + "#dcxieshou1": "此城所能守者,在你我之协力。", + "#dcxieshou2": "据地利而拥人和,其天时在我。", + "#dcqingyan": null, + "#dcqingyan1": "清风盈大袖,严韵久长存。", + "#dcqingyan2": "至清之人无徒,唯余雁阵惊寒。", + "#dcqizi": null, + "#dcqizi1": null, + "#dcqizi2": null, + "#chenjiao:die": "矫既死,则魏再无直臣哉……", + "#dcchongwang1": "乡人所崇者,烈之义行也。", + "#dcchongwang2": "诸家争讼曲直,可质于我。", + "#dchuagui1": "烈不才,难为君之朱紫。", + "#dchuagui2": "一身风雨,难坐高堂。", + "#wanglie:die": "烈尚不能自断,何断人乎?", + "#dcyingtu1": "不过略施小计,聊戏莽夫耳。", + "#dcyingtu2": "栖虎狼之侧,安能不图存身?", + "#dccongshi1": "阁下奉天子以令诸侯,珪自当相从。", + "#dccongshi2": "将军率六师以伐不臣,珪何敢相抗?", + "#chengui:die": "终日戏虎,竟为虎所噬。", + "#dcquanjian1": "陛下宜后镇,臣请为先锋!", + "#dcquanjian2": "吴人悍战,陛下万不可涉险!", + "#dctujue1": "归蜀无路,孤臣泪尽江北。", + "#dctujue2": "受吾主殊遇,安能降吴!", + "#dc_huangquan:die": "败军之将,何言忠乎?", + "#dcyingyu1": "妾身蒲柳,幸蒙将军不弃。", + "#dcyingyu2": "妾之所有,愿尽予君。", + "#dcyongbi1": "海誓山盟,此生不渝。", + "#dcyongbi2": "万千宠爱,幸君怜之。", + "#yinfuren:die": "奈何遇君何其晚乎?", + "#dcshuhe1": "齐心共举,万事俱成。", + "#dcshuhe2": "手足协力,天下可往。", + "#dcliehou1": "论功行赏,加官进侯。", + "#dcliehou2": "增班列侯,赏赐无量!", + "#dc_lvkuanglvxiang:die": "不避其死,以成其忠……", + "#suoliang1": "奉上万石粮草,吾便退兵!", + "#suoliang2": "听闻北海富庶,特来借粮。", + "#qinbao1": "赤箓护身,神鬼莫当。", + "#qinbao2": "头裹黄巾,代天征伐。", + "#guanhai:die": "这红脸汉子,为何如此眼熟……", + "#midu1": "皓首穷经,其心不移。", + "#midu2": "竹简册书,百读不厌。", + "#xianwang": null, + "#xianwang1": "浩气长存,以正压邪。", + "#xianwang2": "名彰千里,盗无敢侵。", + "#huzhao:die": "纵有清名,无益于世也。", + "#dczhubi1": "铸币平市,百货可居。", + "#dczhubi2": "做钱直百,府库皆实。", + "#dcliuzhuan1": "身似浮萍,随波逐流。", + "#dcliuzhuan2": "辗转四方,宦游八州。", + "#dc_liuba:die": "竹蕴于林,风必摧之。", + "#suizheng1": "屡屡随征,战皆告捷。", + "#suizheng2": "将勇兵强,大举出征!", + "#zhangxun:die": "此役,死伤甚重……", + "#zyqiao1": "吾六十何为不受兵邪?", + "#zyqiao2": "芝性骄傲,吾独不为屈。", + "#chengshang1": "嘉其抗直,甚爱待之。", + "#chengshang2": "为国鞠躬,必受封赏。", + "#zongyu:die": "吾年逾七十,唯少一死耳……", + "#dcshuangren1": "尔也配称天下名将?徒有虚名!", + "#dcshuangren2": "不决个高下,愧对我家主公。", + "#dc_jiling:die": "这贼将武艺,竟胜我三分……", + "#dcdeshao1": "名德远播,朝野俱瞻。", + "#dcdeshao2": "增修德信,以诚服人。", + "#dcmingfa1": "煌煌大势,无须诈取。", + "#dcmingfa2": "开示公道,不为掩袭。", + "#dc_yanghu:die": "臣死之后,杜元凯可继之……", + "#lianzhou1": "操练水军,以应东吴。", + "#lianzhou2": "连锁环舟,方能共济。", + "#jinglan1": "潮生潮落,风浪不息。", + "#jinglan2": "狂风舟起,巨浪滔天。", + "#caimaozhangyun:die": "丞相,冤枉,冤枉啊!", + "#xingchong1": "佳人有荣幸,好女天自怜。", + "#xingchong2": "世间万般宠爱,独聚我于一身。", + "#liunian1": "佳期若梦,似水流年。", + "#liunian2": "逝者如流水,昼夜不将息。", + "#tenggongzhu:die": "已过江北,再无江南……", + "#dcjiezhen1": "八阵无破,唯解死而向生。", + "#dcjiezhen2": "此阵,可由景门入、生门出。", + "#dczecai1": "诸葛良才,可为我佳婿。", + "#dczecai2": "梧桐亭亭,必引凤而栖。", + "#dcyinshi1": "南阳隐世,耕读传家。", + "#dcyinshi2": "手扶耒耜,不闻风雷。", + "#dc_huangchengyan:die": "卧龙出山天伦逝,悔教吾婿离南阳……", + "#xizhen1": "今我为刀俎,尔等皆为鱼肉。", + "#xizhen2": "先发可制人,后发制于人。", + "#dc_gaolan:die": "郭公则害我!", + "#dunshi1": "失路青山隐,藏名白水游。", + "#dunshi2": "隐居青松畔,遁走孤竹丘。", + "#guanning:die": "高节始终,无憾矣。", + "#xunli1": "病情扑朔,容某思量。", + "#xunli2": "此疾难辨,容某细察。", + "#zhishi1": "嚼指为誓,誓杀国贼!", + "#zhishi2": "心怀汉恩,断指相随。", + "#lieyi": null, + "#lieyi1": "君有疾在身,不治将恐深。", + "#lieyi2": "汝身患重疾,当以虎狼之药去之。", + "#dc_jiben:die": "今事不成,惟死而已!", + "#bingjie": null, + "#bingjie1": "秉节传旌,心存丹衷。", + "#bingjie2": "秉节刚劲,奸佞务尽。", + "#zhengding1": "行义修正,改故用新。", + "#zhengding2": "义约谬误,有所正订。", + "#mamidi:die": "失节屈辱忧恚!", + "#jianliang1": "岂曰少衣食,与君共袍泽!", + "#jianliang2": "义士同心力,粮秣应期来!", + "#weimeng1": "此礼献于友邦,共赴兴汉大业!", + "#weimeng2": "吴有三江之守,何故委身侍魏?", + "#re_dengzhi:die": "使命既成,但死无妨!", + "#yusui1": "宁为玉碎,不为瓦全!", + "#yusui2": "生义相左,舍生取义。", + "#boyan": null, + "#boyan1": "黑白颠倒,汝言谬矣!", + "#boyan2": "魏王高论,实为无知之言。", + "#fengxi:die": "乡音未改双鬓苍,身陷北国有义求。", + "#rekuangcai1": "耳所瞥闻,不忘于心。", + "#rekuangcai2": "吾焉能从屠沽儿耶?", + "#reshejian1": "伤人的,可不止刀剑! ", + "#reshejian2": "死公!云等道?", + "#re_miheng:die": "恶口……终至杀身……", + "#refuyuan1": "今君困顿,扶援相助。", + "#refuyuan2": "恤君之患,以相扶援。", + "#reyingshui1": "道之以德,齐之以礼。", + "#reyingshui2": "施恩行惠,赡之以义。", + "#rewangzu1": "名门望族,显贵荣达。", + "#rewangzu2": "能人辈出,仕宦显达。", + "#re_chendeng:die": "吾疾无人可治。", + "#zhenge1": "常备不懈,严阵以待。", + "#zhenge2": "枕戈待旦,日夜警惕。", + "#xinghan1": "汉之兴旺,不敢松懈。", + "#xinghan2": "兴汉除贼,吾之所愿。", + "#wanniangongzhu:die": "兴汉的使命,还没有完成。", + "#refenglve1": "当今敢称贤者,唯袁氏本初一人!", + "#refenglve2": "冀州宝地,本当贤者居之。", + "#anyong1": "殿上太守且相看,殿下几人还拥韩?", + "#anyong2": "冀州暗潮汹涌,群士居危思变。", + "#re_xunchen:die": "为臣当不贰,贰臣不当为。", + "#xiashu1": "吾有密信,特来献于将军。", + "#xiashu2": "将军若不信,可亲自验看!", + "#kuanshi1": "不知者,无罪。", + "#kuanshi2": "罚酒三杯,下不为例。", + "#re_kanze:die": "我早已做好了牺牲的准备。", + "#guowu": null, + "#guowu1": "方天映黛眉,赤兔牵红妆。", + "#guowu2": "武姬青丝利,巾帼女儿红。", + "#zhuangrong": null, + "#zhuangrong1": "我乃温侯吕奉先之女!", + "#zhuangrong2": "继父神威,无坚不摧!", + "#lvlingqi:die": "父亲,女儿好累……", + "#cuijian1": "所当皆披靡,破坚若无人!", + "#cuijian2": "一枪定顽敌,一骑破坚城!", + "#tongyuan1": "乐将军何在?随我共援上方谷!", + "#tongyuan2": "袍泽有难,岂有坐视之理?", + "#zhanghu:die": "虎父威犹在,犬子叹奈何……", + "#zhente1": "抗声昭节,义形于色。", + "#zhente2": "少履贞特之行,三从四德。", + "#zhiwei1": "体信贯于神明,送终以礼。", + "#zhiwei2": "昭德以行,生不能侍奉二主。", + "#luyusheng:die": "父亲,郁生甚是想念……", + "#wanggui1": "存志太虚,安心玄妙。", + "#wanggui2": "礼法有度,良德才略。", + "#xibing1": "千里运粮,非用兵之利。", + "#xibing2": "宜弘一代之治,绍三王之迹。", + "#huaxin:die": "大举发兵,劳民伤国。", + "#manyi_mengyou1": "我辈蛮夷久居荒野,岂为兽虫所伤。", + "#manyi_mengyou2": "我乃蛮王孟获之弟,谁敢伤我!", + "#dcmanzhi1": "吾有蛮勇可攻,亦有蛮智可御。", + "#dcmanzhi2": "远交近攻之法,怎可不为我所用。", + "#mengyou:die": "大哥,诸葛亮又打来了。", + "#zhuning1": "此剑半丈,当斩奸佞人头!", + "#zhuning2": "此身八尺,甘为柱国之石。", + "#fengxiang1": "北风摧蜀地,王爵换乡侯。", + "#fengxiang2": "汉皇可负我,我不负父兄。", + "#liuyong:die": "他日若是凛风起,你自长哭我自笑。", + "#xiecui1": "东隅既得,亦收桑榆。", + "#xiecui2": "江东多娇,锦花相簇。", + "#youxu1": "积富之家,当恤众急。", + "#youxu2": "周忧济难,请君恤之。", + "#dc_sunru:die": "伯言,抗儿便托付于你了……", + "#fuping1": "有草生清池,无根碧波上。", + "#fuping2": "愿为浮萍草,托身寄清池。", + "#weilie1": "好学尚贞烈,义形必沾巾。", + "#weilie2": "贞烈过男子,何处弱须眉?", + "#xiahoulingnv:die": "心存死志,绝不肯从!", + "#yuanyu1": "此生最恨者,吴垣孙氏人。", + "#yuanyu2": "愿为宫外柳,不做建章卿。", + "#xiyan1": "夕阳绝美,只叹黄昏。", + "#xiyan2": "朱颜将逝,知我何求。", + "#zhangyao:die": "花开人赏,花败谁怜……", + "#chenjian1": "国有其弊,上书当陈。", + "#chenjian2": "食君之禄,怎可默言。", + "#xixiu1": "君子如玉,德形皓白。", + "#xixiu2": "木秀于身,芬芳自如。", + "#tengyin:die": "臣好洁,不堪与之合污!", + "#tongli1": "胞妹殊礼,妾幸同之。", + "#tongli2": "夫妻之礼,举案齐眉。", + "#shezang1": "世间千百物,物物皆相思。", + "#shezang2": "伊人将逝,何物为葬?", + "#zhangxuan:die": "陛下,臣妾绝无异心!", + "#huguan1": "共护边关,蜀汉可安。", + "#huguan2": "护君周全,妾身无悔。", + "#yaopei1": "环佩春风,步摇桃粉。", + "#yaopei2": "赠君摇佩,佑君安好。", + "#wangtao:die": "落花有意,何人来摘……", + "#huguan_wangyue1": "此战虽险,悦亦可助之。", + "#huguan_wangyue2": "葭萌关外,同君携手。", + "#mingluan1": "鸾笺寄情,笙歌动心。", + "#mingluan2": "鸾鸣轻歌,声声悦耳。", + "#wangyue:die": "这次比试不算,再来。", + "#jinhui1": "大则盈尺,小则方寸。", + "#jinhui2": "十指纤纤,万分机巧。", + "#qingman1": "经纬分明,片片罗縠。", + "#qingman2": "罗帐轻幔,可消酷暑烦躁。", + "#zhaoyan:die": "彩绘锦绣,二者不可缺其一。", + "#yachai1": "才秀知名,无所顾惮。", + "#yachai2": "讲论经义,为万世法。", + "#qingtan1": "事而为事,由无以成。", + "#qingtan2": "转蓬去其根,流飘从风移。", + "#heyan:die": "恃无以生。", + "#meibu": null, + "#meibu1": "若要动手,就请先杀我吧!", + "#meibu2": "萧墙之乱,宫闱之衅,实为吴国之祸啊!", + "#mumu": null, + "#mumu1": "只求相夫教子,不求参政议事。", + "#mumu2": "立储乃国家大事,我们姐妹不便参与。", + "#re_sunluyu:die": "姐姐,你且好自为之……", + "#lianzhu1": "若有不臣之心,定当株连九族。", + "#lianzhu2": "你们都是一条绳上的蚂蚱~", + "#xiahui": null, + "#xiahui1": null, + "#xiahui2": null, + "#re_dongbai:die": "放肆,我要让爷爷赐你们死罪!", + "#dcmiyun1": "不要大张旗鼓,要神不知鬼不觉。", + "#dcmiyun2": "小阿斗,跟本将军走一趟吧。", + "#dcdanying1": "早就想会会你常山赵子龙了。", + "#dcdanying2": "赵子龙是吧?兜鍪给你打掉。", + "#zhoushan:die": "夫人救我!夫人救我!", + "#dcxunji1": "待拿下你,再找丞相谢罪。", + "#dcxunji2": "姓关的,我现在就来抓你!", + "#dcjiaofeng1": "此击透骨,亦解骨肉之痛。", + "#dcjiaofeng2": "关羽?哼,不过如此!", + "#dc_caiyang:die": "何处来的鼓声?", + "#liedan1": "声若洪钟,震胆发聩!", + "#liedan2": "阴雷滚滚,肝胆俱颤!", + "#zhuangdan1": "假丞相虎威,壮豪将龙胆。", + "#zhuangdan2": "我家丞相在此,哪个有胆敢动我?", + "#xiahoujie:die": "你吼那么大声干嘛……", + "#cxliushi1": "就你叫夏侯惇?", + "#cxliushi2": "兀那贼将,且吃我一箭!", + "#zhanwan1": "郝萌,尔敢造反不成?", + "#zhanwan2": "健儿护主,奸逆断腕!", + "#caoxing:die": "夏侯将军,有话好说……", + "#recangchu1": "广积粮草,有备无患。", + "#recangchu2": "吾奉命于此、建仓储粮。", + "#reliangying1": "酒气上涌,精神倍长。", + "#reliangying2": "仲简在此,谁敢来犯?", + "#reshishou1": "腹痛骤发,痛不可当。", + "#reshishou2": "火光冲天,悔不当初。", + "#re_chunyuqiong:die": "这酒,饮不得啊……", + "#xuxie1": "说出吾名,吓汝一跳!", + "#xuxie2": "我乃是零陵上将军!", + "#xingdaorong:die": "孔明之计,我难猜透啊。", + "#xinkuangfu1": "大斧到处,片甲不留!", + "#xinkuangfu2": "你可接得住我一斧?", + "#re_panfeng:die": "来者……可是魔将?", + "#shengxi1": "国之生计,在民生息。", + "#shengxi2": "安民止战,兴汉室!", + "#shoucheng1": "待吾等助将军一臂之力!", + "#shoucheng2": "大汉羸弱,唯有守成,方有生机。", + "#jiangfei:die": "墨守成规,终为其害啊……", +}; diff --git a/character/jsrg.js b/character/jsrg.js deleted file mode 100644 index 60cbb4a57..000000000 --- a/character/jsrg.js +++ /dev/null @@ -1,9029 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "jsrg", - connect: true, - characterSort: { - jsrg: { - jiangshanrugu_qi: ["jsrg_liuhong", "jsrg_hejin", "jsrg_sunjian", "jsrg_huangfusong", "jsrg_xushao", "jsrg_dongbai", "jsrg_qiaoxuan", "jsrg_yangbiao", "jsrg_kongrong", "jsrg_zhujun", "jsrg_liubei", "jsrg_wangyun", "jsrg_liuyan", "jsrg_caocao", "jsrg_nanhualaoxian"], - jiangshanrugu_cheng: ["jsrg_sunce", "jsrg_xuyou", "jsrg_lvbu", "jsrg_zhanghe", "jsrg_zoushi", "jsrg_guanyu", "jsrg_chendeng", "jsrg_zhenji", "jsrg_zhangliao", "jsrg_xugong", "jsrg_chunyuqiong"], - jiangshanrugu_zhuan: ["jsrg_guojia", "jsrg_zhangfei", "jsrg_machao", "jsrg_lougui", "jsrg_zhangren", "jsrg_huangzhong", "jsrg_xiahourong", "jsrg_sunshangxiang", "jsrg_pangtong", "jsrg_hansui", "jsrg_zhangchu", "jsrg_xiahouen", "jsrg_fanjiangzhangda"], - jiangshanrugu_he: ["jsrg_zhugeliang", "jsrg_jiangwei", "jsrg_luxun", "jsrg_zhaoyun", "jsrg_simayi", "jsrg_guoxun", "jsrg_sunlubansunluyu", "jsrg_caofang", "jsrg_sunjun", "jsrg_liuyong", "jsrg_weiwenzhugezhi", "jsrg_zhangxuan", "jsrg_gaoxiang", "jsrg_guozhao"], - }, - }, - character: { - //起 - jsrg_liuhong: ["male", "qun", 4, ["jsrgchaozheng", "jsrgshenchong", "jsrgjulian"], ["zhu"]], - jsrg_hejin: ["male", "qun", 4, ["jsrgzhaobing", "jsrgzhuhuan", "jsrgyanhuo"]], - jsrg_sunjian: ["male", "qun", 4, ["jsrgpingtao", "jsrgjuelie"]], - jsrg_huangfusong: ["male", "qun", 4, ["jsrgguanhuo", "jsrgjuxia"]], - jsrg_xushao: ["male", "qun", 3, ["sbyingmen", "sbpingjian"]], - jsrg_dongbai: ["female", "qun", 3, ["jsrgshichong", "jsrglianzhu"]], - jsrg_qiaoxuan: ["male", "qun", 3, ["jsrgjuezhi", "jsrgjizhao"]], - jsrg_yangbiao: ["male", "qun", "3/4", ["jsrgzhaohan", "jsrgrangjie", "jsrgyizheng"]], - jsrg_kongrong: ["male", "qun", 3, ["jsrglirang", "jsrgzhengyi"]], - jsrg_zhujun: ["male", "qun", 4, ["jsrgfendi", "jsrgjuxiang"]], - jsrg_liubei: ["male", "qun", 4, ["jsrgjishan", "jsrgzhenqiao"]], - jsrg_wangyun: ["male", "qun", 3, ["jsrgshelun", "jsrgfayi"], ["clan:太原王氏"]], - jsrg_liuyan: ["male", "qun", 3, ["xinfu_limu", "jsrgtushe", "jsrgtongjue"], ["zhu"]], - jsrg_caocao: ["male", "qun", 4, ["jsrgzhenglve", "jsrghuilie"]], - jsrg_nanhualaoxian: ["male", "qun", 3, ["jsrgshoushu", "jsrgxundao", "jsrglinghua"]], - //承 - jsrg_sunce: ["male", "wu", 4, ["jsrgduxing", "jsrgzhiheng", "jsrgzhasi", "jsrgbashi"], ["zhu"]], - jsrg_xuyou: ["male", "wei", 3, ["jsrglipan", "jsrgqingxi", "jsrgjinmie"], ["doublegroup:wei:qun"]], - jsrg_lvbu: ["male", "qun", 5, ["jsrgwuchang", "jsrgqingjiao", "jsrgchengxu"], ["doublegroup:shu:qun"]], - jsrg_zhanghe: ["male", "wei", 4, ["jsrgqiongtu", "jsrgxianzhu"], ["doublegroup:wei:qun"]], - jsrg_zoushi: ["female", "qun", 3, ["jsrgguyin", "jsrgzhangdeng"]], - jsrg_guanyu: ["male", "shu", 5, ["jsrgguanjue", "jsrgnianen"], ["border:wei"]], - jsrg_chendeng: ["male", "qun", 3, ["jsrglunshi", "jsrgguitu"]], - jsrg_zhenji: ["female", "qun", 3, ["jsrgjixiang", "jsrgchengxian"]], - jsrg_zhangliao: ["male", "qun", 4, ["jsrgzhengbing", "jsrgtuwei"], ["doublegroup:wei:qun"]], - jsrg_xugong: ["male", "wu", 3, ["jsrgbiaozhao", "jsrgyechou"]], - jsrg_chunyuqiong: ["male", "qun", 4, ["jsrgcangchu", "jsrgshishou"]], - //转 - jsrg_guojia: ["male", "wei", 3, ["jsrgqingzi", "jsrgdingce", "jsrgzhenfeng"]], - jsrg_zhangfei: ["male", "shu", 5, ["jsrgbaohe", "jsrgxushi"]], - jsrg_machao: ["male", "qun", 4, ["jsrgzhuiming", "mashu"]], - jsrg_lougui: ["male", "wei", 3, ["jsrgshacheng", "jsrgninghan"]], - jsrg_zhangren: ["male", "qun", 4, ["jsrgfuni", "jsrgchuanxin"]], - jsrg_huangzhong: ["male", "shu", 4, ["jsrgcuifeng", "jsrgdengnan"]], - jsrg_xiahourong: ["male", "wei", 4, ["jsrgfenjian"]], - jsrg_sunshangxiang: ["female", "wu", 3, ["jsrgguiji", "jsrgjiaohao"]], - jsrg_pangtong: ["male", "qun", 3, ["jsrgmanjuan", "jsrgyangming"]], - jsrg_hansui: ["male", "qun", 4, ["jsrgniluan", "jsrghuchou", "jsrgjiemeng"], ["zhu"]], - jsrg_zhangchu: ["female", "qun", 3, ["jsrghuozhong", "jsrgrihui"]], - jsrg_xiahouen: ["male", "wei", 4, ["jsrghujian", "jsrgshili"], ["die_audio:tw_xiahouen"]], - jsrg_fanjiangzhangda: ["male", "wu", 5, ["jsrgfushan"]], - //合 - jsrg_zhugeliang: ["male", "shu", 3, ["jsrgwentian", "jsrgchushi", "jsrgyinlve"]], - jsrg_jiangwei: ["male", "shu", 4, ["jsrgjinfa", "jsrgfumou", "jsrgxuanfeng"], ["border:wei"]], - jsrg_luxun: ["male", "wu", 3, ["jsrgyoujin", "jsrgdailao", "jsrgzhubei"]], - jsrg_zhaoyun: ["male", "shu", 4, ["jsrglonglin", "jsrgzhendan"]], - jsrg_simayi: ["male", "wei", 4, ["jsrgyingshi", "jsrgtuigu"]], - jsrg_guoxun: ["male", "wei", 4, ["jsrgeqian", "jsrgfusha"]], - jsrg_sunlubansunluyu: ["female", "wu", 3, ["jsrgdaimou", "jsrgfangjie"]], - jsrg_caofang: ["male", "wei", "3/4", ["jsrgzhaotu", "jsrgjingju", "jsrgweizhui"], ["zhu"]], - jsrg_sunjun: ["male", "wu", 4, ["jsrgyaoyan", "jsrgbazheng"]], - jsrg_liuyong: ["male", "shu", 3, ["jsrgdanxin", "jsrgfengxiang"]], - jsrg_weiwenzhugezhi: ["male", "wu", 4, ["jsrgfuhai"]], - jsrg_zhangxuan: ["female", "wu", 4, ["jsrgtongli", "jsrgshezang"]], - jsrg_gaoxiang: ["male", "shu", 4, ["jsrgchiying"]], - jsrg_guozhao: ["female", "wei", 3, ["jsrgpianchong", "jsrgzunwei"]], - }, - characterIntro: { - qiaoxuan: "桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。", - lougui: "娄圭,字子伯,荆州南阳郡(治今河南南阳)人。曹魏时期著名谋士、将军,娄圭年轻时与曹操有交情,曾经随曹操平定冀州,南征刘表,击破马超,立有功劳,连曹操都感叹他的计谋。 后来曹操和他的儿子们一起出去游玩,娄圭当时也一起随行。因言语不当,被南郡(治今湖北荆州)人习授举报,曹操认为有意诽谤,遭杀害。在小说《三国演义》里,娄圭被设定为京兆人(今陕西西安),隐居终南山,道号“梦梅居士”。于第59回登场。", - xiahourong: "夏侯荣(207年—219年) ,字幼权,名将夏侯渊之子。建安二十四年(219年)汉中之战,父亲夏侯渊战死后,夏侯荣不愿逃跑,随后拔剑冲入敌阵,战死。", - guoxun: "郭脩(?~253年),一作郭循,字孝先,凉州西平人,三国时期曹魏官员。原为曹魏中郎,被蜀汉将领姜维俘虏后降蜀汉,任左将军,后来刺杀了蜀汉大将军费祎。被曹魏追封为长乐乡侯,谥曰威侯。", - caofang: "曹芳(232年-274年),字兰卿,沛国谯县(今安徽省亳州市)人。三国时期曹魏第三位皇帝(239年1月22日-254年10月17日在位),疑为魏武帝曹操曾孙,任城威王曹彰之孙,任城王曹楷之子。太和六年(232年),生于任城王府。青龙三年(235年),选为魏明帝曹叡养子,册封齐王。景初三年(239年),立为皇太子,同日魏明帝曹叡病死,曹芳正式即位,由大将军曹爽和太尉司马懿共同辅政。正始十年,经历高平陵之变,曹爽倒台,政权落入司马氏手中。嘉平六年(254年),中书令李丰和光禄大夫张缉图谋废掉司马师,改立夏侯玄为大将军。司马师平定叛乱后,将曹芳废为齐王,拥戴高贵乡公曹髦继位。西晋建立后,册封邵陵县公。泰始十年(274年),曹芳病逝,终年四十三岁,谥号为厉。", - sunjun: "孙峻(219年-256年10月19日),字子远,扬州吴郡富春(今浙江省杭州市)人,昭义中郎将孙静曾孙,定武中郎将孙暠之孙,散骑侍郎孙恭之子。三国时期吴国宗室、权臣。孙峻从小弓马娴熟,胆量非凡。孙权晚年时,孙峻担任武卫都尉,掌握军权,然后又任侍中,开始涉足朝政。孙权临终前,孙峻接受遗诏同诸葛恪、滕胤共同辅佐朝政。此后,其身兼武卫将军,一直主持宫廷的值班、守卫等要害部门,并被封为都乡侯。孙峻生性喜好专断,容不下诸葛恪,于是与吴主孙亮密谋发动政变,在酒宴中设伏兵杀死诸葛恪。孙峻谋杀诸葛恪之后,升任丞相、大将军,督察内外一切军务,假节,晋封富春侯。此后,孙峻独揽朝政。孙峻在任职期间,滥施刑杀,淫乱宫女,和全公主孙鲁班私通。五凤元年(254年),吴侯孙英企图谋杀孙峻,后来事情被泄露,孙英自杀。时隔一年,吴国将军孙仪、张怡、林恂等人乘蜀国使节来访之机,共同谋划诛杀孙峻。后被孙峻发觉,孙仪自杀,林恂等被认为有罪诛死。太平元年(256年),孙峻梦见被诸葛恪所击,因惊悸恐惧发病而死,时年38岁。", - sunlubansunluyu: "孙鲁班,孙权之女。孙鲁班与孙权二子孙和不睦。孙权长子孙登死后,孙和被立为太子。孙鲁班向孙权进谗言废孙和太子之位,孙和被废后忧愤而死。
    孙鲁育,又名小虎,孙权与步练师之女。吴后期,孙鲁班诬陷孙鲁育参与谋反,于是孙峻杀害了孙鲁育。", - jsrg_caocao: "初平元年二月,董卓徙天子都长安,焚洛阳宫室,众诸侯畏卓兵强,莫敢进。操怒斥众人:“为人臣而临此境,当举义兵以诛暴乱,大众已合,诸君何疑?此一战而天下定矣!”遂引兵汴水,遇卓将徐荣,大破之。操迎天子,攻吕布,伐袁术,安汉室,拜为征西将军。是时,袁绍兼四州之地,将攻许都。操欲扫清寰宇,兴复汉室,遂屯兵官渡。既克绍,操曰:“若天命在吾,吾为周文王矣。”", - jsrg_sunce: "建安五年,操、绍相拒于官渡,孙策欲阴袭许昌,迎汉帝,遂密治兵,部署诸将。未发,会为许贡门客所刺,将计就计,尽托江东于权,诈死以待天时。八月,操、绍决战,孙策亲冒矢石,斩将刈旗,得扬、豫之地。曹操败走冀、青,刘备远遁荆、益。而后历时七年,孙策三分天下已有其二,帝于洛阳,建霸王未竟之功业。权表求吴王,封为仲帝,共治天下。", - jsrg_guojia: "初平元年二月,郭嘉拜见袁绍,闻曹操怒斥众诸侯,乃对曰:“董卓于汴水或有埋伏,慎之!”曹操未从,果败于徐荣。三月,曹操与郭嘉论天下事:“使孤成大业者,必此人也。”郭嘉从破袁绍,讨谭、尚,连战数克,计定辽东。时年三十八,征乌桓归途郭嘉因劳染疾,命悬之际竟意外饮下柳皮醋水而愈。建安十三年,曹操屯兵赤壁,郭嘉识破连环之计,议上中下三策,可胜刘备。尚未献策,曹操便决意采纳上策,“奉孝之才,足胜孤百倍,卿言上策,如何不取?”由此,赤壁战后曹操尽得天下。", - jsrg_zhugeliang: "建兴六年春,汉丞相诸葛亮使赵云、邓芝为先锋,马谡为副将拒箕谷,牵制曹真主力。自率三十万大军攻祁山,三郡叛魏应亮,关中响震。曹叡命张郃拒亮,亮使定军山降将姜维与郃战于街亭,张郃久攻不下。后曹真强攻赵云军,赵云死战,坚守箕谷,马谡、邓芝当场战死忠勇殉国。……既克张郃,曹真溃逃,曹叡弃守长安,迁都邺城。十月,司马懿击退孙权,回援曹真。而后三年,丞相所到之处,无不望风而降,皆箪食壶浆,以迎汉军。尽收豫、徐、兖、并之地,建兴十年春,司马懿父子三人死于诸葛武侯火计,同年,孙权上表称臣,至此四海清平,大汉一统。而后诸葛亮荐蒋琬为丞相,姜维为大将军,自回隆中归隐,后主挽留再三,皆不受。魏延亦辞官相随,侍奉左右。后主时有不决之事,便往隆中拜访相父,均未得面,童子答曰外出云游,遗数锦囊,拆而视之,皆治国之良策也。", - }, - characterTitle: {}, - perfectPair: {}, - card: { - xumou_jsrg: { - type: "special_delay", - allowDuplicate: true, - blankCard: true, - fullimage: true, - wuxieable: false, - effect: function () { - "step 0"; - var card = get.autoViewAs(event.cards[0]); - card.storage.xumou_jsrg = true; - player.chooseUseTarget(card, event.cards, `蓄谋:是否使用${get.translation(card)}?`, `请选择要使用的目标。若不使用此牌,则判定区内的所有“蓄谋”牌都将被置入弃牌堆。`); - "step 1"; - if (!result.bool) { - var cards = player.getCards("j", card => { - return (card.viewAs || card.name) == "xumou_jsrg"; - }); - if (cards.length > 0) player.loseToDiscardpile(cards); - } else { - player.addTempSkill("xumou_jsrg_temp", "phaseChange"); - player.markAuto("xumou_jsrg_temp", [event.cards[0].name]); - } - }, - }, - ying: { - audio: true, - fullskin: true, - type: "basic", - cardcolor: "spade", - enable: false, - destroy: "discardPile", - getYing: function (count) { - var cards = []; - if (typeof count != "number") count = 1; - while (count--) { - let card = game.createCard("ying", "spade", 1); - cards.push(card); - } - return cards; - }, - ai: { - basic: { - useful: 0, - value: 0, - }, - }, - }, - }, - characterFilter: { - jsrg_xushao: function (mode) { - return mode != "guozhan"; - }, - jsrg_jiangwei(mode) { - return mode !== "guozhan"; - }, - }, - skill: { - //江山如故·合 - //蓄谋临时禁用 - xumou_jsrg_temp: { - charlotte: true, - onremove: true, - mod: { - cardEnabled(card, player) { - if (!card.storage || !card.storage.xumou_jsrg) return; - if (player.getStorage("xumou_jsrg_temp").includes(get.name(card, false))) return false; - }, - }, - }, - //404诸葛亮 - jsrgwentian: { - audio: 2, - trigger: { - player: ["phaseZhunbeiBegin", "phaseJudgeBegin", "phaseDrawBegin", "phaseUseBegin", "phaseDiscardBegin", "phaseJieshuBegin"], - }, - usable: 1, - prompt2: "观看牌堆顶的五张牌,将其中一张交给其他角色,并将其余牌置于牌堆顶或牌堆底", - group: "jsrgwentian_viewas", - async content(event, trigger, player) { - const cards = get.cards(5); - game.cardsGotoOrdering(cards); - const { result } = await player.chooseButton(["问天:将一张牌交给一名其他角色", cards], true); - if (result.bool) { - const { result: result2 } = await player.chooseTarget(`将${get.translation(result.links)}交给一名其他角色`, lib.filter.notMe, true).set("ai", target => { - return get.attitude(get.player(), target); - }); - if (result2.bool) { - cards.removeArray(result.links); - const target = result2.targets[0]; - player.line(target, "green"); - await target.gain(result.links, "gain2").set("giver", player); - } - } - const next = player.chooseToMove(); - next.set("list", [["牌堆顶", cards.filterInD()], ["牌堆底"]]); - next.set("prompt", "问天:点击将牌移动到牌堆顶或牌堆底"); - next.processAI = list => { - const cards = list[0][1], - player = _status.event.player; - const top = []; - const judges = player.getCards("j"); - let stopped = false; - if (!player.hasWuxie()) { - for (let i = 0; i < judges.length; i++) { - const judge = get.judge(judges[i]); - cards.sort((a, b) => judge(b) - judge(a)); - if (judge(cards[0]) < 0) { - stopped = true; - break; - } else { - top.unshift(cards.shift()); - } - } - } - let bottom; - if (!stopped) { - cards.sort((a, b) => 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]; - }; - const { - result: { moved }, - } = await next; - const top = moved[0]; - const bottom = moved[1]; - top.reverse(); - game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { - if (event.top_cards.includes(card)) return ui.cardPile.firstChild; - return null; - }); - player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); - game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); - game.asyncDelayx(); - }, - subSkill: { - viewas: { - audio: "jsrgwentian", - enable: "chooseToUse", - filter: function (event, player) { - for (const name of ["wuxie", "huogong"]) { - if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) return true; - } - return false; - }, - hiddenCard: function (player, name) { - if (player.isTempBanned("jsrgwentian")) return false; - return name == "wuxie"; - }, - viewAs: function (cards, player) { - const event = get.event(), - filter = event._backup.filterCard; - for (const name of ["wuxie", "huogong"]) { - if (filter(get.autoViewAs({ name }, "unsure"), player, event)) return { name }; - } - return null; - }, - filterCard: () => false, - selectCard: -1, - prompt: function () { - const player = get.player(); - const event = get.event(), - filter = event._backup.filterCard; - let str = "将牌堆顶的牌当【"; - for (const name of ["wuxie", "huogong"]) { - if (filter({ name }, player, event)) { - str += get.translation(name); - break; - } - } - str += "】使用"; - return str; - }, - precontent() { - player.logSkill("jsrgwentian"); - const cards = get.cards(); - event.result.cards = cards; - delete event.result.skill; - game.cardsGotoOrdering(cards); - const color = event.result.card.name == "wuxie" ? "black" : "red"; - if (get.color(cards, false) != color) { - player.tempBanSkill("jsrgwentian", "roundStart"); - } - }, - }, - }, - }, - jsrgchushi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter(event, player) { - const zhu = get.zhu(player); - if (!zhu || !zhu.isZhu2() || !zhu.countCards("h")) return false; - return !player.isZhu2() && player.countCards("h"); - }, - async content(event, trigger, player) { - player - .chooseToDebate( - game.filterPlayer(current => { - return (current == player || current.isZhu2()) && current.countCards("h"); - }) - ) - .set("callback", async event => { - const result = event.debateResult; - if (result.bool && result.opinion) { - const { opinion, targets } = result; - targets.sortBySeat(); - if (opinion == "red") { - do { - for (const current of targets) { - await current.draw(); - } - } while ( - targets - .map(current => { - return current.countCards("h"); - }) - .reduce((p, c) => { - return p + c; - }, 0) < 7 - ); - } else { - player.addMark("jsrgchushi_add", 1, false); - player.addTempSkill("jsrgchushi_add", "roundStart"); - } - } - }); - }, - subSkill: { - add: { - audio: "jsrgchushi", - trigger: { source: "damageBegin1" }, - filter: function (event) { - return event.hasNature("linked"); - }, - forced: true, - charlotte: true, - onremove: true, - async content(_, trigger, player) { - trigger.num += player.countMark("jsrgchushi_add"); - }, - ai: { - damageBonus: true, - skillTagFilter: function (player, tag, arg) { - if (tag === "damageBonus") return arg && arg.card && game.hasNature(arg.card, "linked"); - }, - }, - intro: { - content: "造成的属性伤害+#", - }, - }, - }, - }, - jsrgyinlve: { - audio: 2, - trigger: { - global: "damageBegin4", - }, - filter: function (event, player) { - return event.player.isIn() && ["fire", "thunder"].some(n => !player.hasSkill(`jsrgyinlve_${n}`) && event.hasNature(n)); - }, - check: function (event, player) { - if (get.damageEffect(event.player, event.source, player, get.natureList(event.nature)) < -5) return true; - return false; - }, - logTarget: "player", - async content(event, trigger, player) { - trigger.cancel(); - const natures = ["fire", "thunder"]; - let index; - if (natures.every(n => !player.hasSkill(`jsrgyinlve_${n}`) && trigger.hasNature(n))) { - const { result } = await player.chooseControl(["摸牌阶段", "弃牌阶段"]).set("prompt", "请选择要新回合内仅有的阶段"); - index = result.index; - } else index = [0, 1].find(i => !player.hasSkill(`jsrgyinlve_${natures[i]}`) && trigger.hasNature(natures[i])); - player.addTempSkill(`jsrgyinlve_${natures[index]}`, "roundStart"); - player.insertPhase().set("phaseList", [["phaseDraw", "phaseDiscard"][index]]); - }, - subSkill: { - fire: { charlotte: true }, - thunder: { charlotte: true }, - }, - }, - //姜维 - jsrgjinfa: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: true, - position: "h", - discard: false, - lose: false, - delay: false, - check: function () { - return 1 + Math.random(); - }, - async content(event, trigger, player) { - await player.showCards(event.cards); - player - .chooseToDebate( - game.filterPlayer(current => { - return current.maxHp <= player.maxHp; - }) - ) - .set("callback", async event => { - const result = event.debateResult; - if (result.bool && result.opinion) { - const { cards: fixedCards } = event.getParent("jsrgjinfa"); - const color = get.color(fixedCards); - const { opinion, targets } = result; - if (opinion == color) { - const { result } = await player - .chooseTarget("是否令至多两名参与议事的角色将手牌摸至体力上限?", [1, 2], (card, player, target) => { - return get.event("targets").includes(target); - }) - .set("targets", targets) - .set("ai", target => { - const player = get.player(); - const att = get.attitude(player, target); - if (att <= 0) return -1; - return att * Math.sqrt(Math.max(0.1, target.maxHp - target.countCards("h"))); - }); - if (result.bool) { - const targets = result.targets; - targets.sortBySeat(); - player.line(targets, "green"); - for (const current of targets) { - if (current.countCards("h") < current.maxHp) await current.drawTo(current.maxHp); - } - } - } else { - await player.gain(lib.card.ying.getYing(2), "gain2"); - } - } - const { red, black } = result; - if ((red.length == 1 && red[0][0] == player) || (black.length == 1 && black[0][0] == player)) { - const list = lib.group.slice(); - list.remove(player.group); - list.push("cancel2"); - const { - result: { control }, - } = await player - .chooseControl(list) - .set("prompt", "是否变更势力?") - .set("ai", () => { - if (!get.event("change")) return "cancel2"; - const controls = get.event("controls"); - const groups = ["wei", "shu"].filter(g => controls.includes(g)); - if (groups.length) return groups.randomGet(); - return controls.randomGet(); - }) - .set("change", ["wei", "shu"].includes(player.group) ? Math.random() < 0.5 : true); - if (control != "cancel2") { - player.popup(control + "2", get.groupnature(control, "raw")); - player.changeGroup(control); - } - } - }); - }, - ai: { - order: function (item, player) { - if (player.countCards("h") == 1) return 10; - return 1; - }, - result: { - player: 1, - }, - }, - }, - jsrgfumou: { - audio: 2, - trigger: { global: "chooseToDebateAfter" }, - groupSkill: true, - forced: true, - locked: false, - filter: function (event, player) { - if (player.group != "wei") return false; - if (!event.targets.includes(player)) return false; - if (event.red.some(i => i[0] == player)) return event.black.length; - if (event.black.some(i => i[0] == player)) return event.red.length; - return false; - }, - async content(event, trigger, player) { - const targets = []; - if (trigger.red.some(i => i[0] == player)) targets.addArray(trigger.black.map(i => i[0])); - if (trigger.black.some(i => i[0] == player)) targets.addArray(trigger.red.map(i => i[0])); - player.line(targets, "thunder"); - targets.forEach(target => { - target.addTempSkill("jsrgfumou_forbid"); - target.markAuto( - "jsrgfumou_forbid", - ["red", "black"].filter(color => { - return trigger[color].some(i => i[0] == target); - }) - ); - }); - game.broadcastAll(targets => { - lib.skill.jsrgfumou_backup.targets = targets; - }, targets); - const next = player.chooseToUse(); - next.set("openskilldialog", `是否将一张【影】当【出其不意】对一名与你意见不同的角色使用?`); - next.set("norestore", true); - next.set("_backupevent", "jsrgfumou_backup"); - next.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - next.backup("jsrgfumou_backup"); - }, - subSkill: { - backup: { - filterCard: function (card) { - return get.itemtype(card) == "card" && get.name(card) == "ying"; - }, - viewAs: { - name: "chuqibuyi", - }, - selectCard: 1, - position: "hs", - log: false, - filterTarget: function (card, player, target) { - const targets = lib.skill.jsrgfumou_backup.targets; - if (!targets.includes(target) || ui.selected.targets.containsSome(targets)) return false; - return lib.filter.targetEnabled.apply(this, arguments); - }, - ai1: function (card) { - return 6 - get.value(card); - }, - precontent: function () { - delete event.result.skill; - }, - }, - forbid: { - charlotte: true, - onremove: true, - mod: { - cardEnabled: function (card, player) { - const color = get.color(card); - if (color != "unsure" && player.getStorage("jsrgfumou_forbid").includes(color)) return false; - }, - cardRespondable: function (card, player) { - const color = get.color(card); - if (color != "unsure" && player.getStorage("jsrgfumou_forbid").includes(color)) return false; - }, - cardSavable: function (card, player) { - const color = get.color(card); - if (color != "unsure" && player.getStorage("jsrgfumou_forbid").includes(color)) return false; - }, - }, - mark: true, - intro: { - content: "本回合不能使用或打出$牌", - }, - }, - }, - }, - jsrgxuanfeng: { - audio: 2, - enable: "chooseToUse", - filterCard: { name: "ying" }, - position: "hs", - groupSkill: true, - locked: false, - viewAs: { - name: "sha", - nature: "stab", - storage: { jsrgxuanfeng: true }, - }, - viewAsFilter(player) { - if (player.group != "shu") return false; - if (!player.countCards("hs", "ying")) return false; - }, - prompt: "将一张【影】当无距离和次数限制的刺【杀】使用", - check(card) { - const val = get.value(card); - return 5 - val; - }, - mod: { - targetInRange: function (card, player, target) { - if (card.storage && card.storage.jsrgxuanfeng) return true; - }, - cardUsable: function (card) { - if (card.storage && card.storage.jsrgxuanfeng) return Infinity; - }, - }, - ai: { - order: 2, - }, - }, - //陆逊 - jsrgyoujin: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return game.hasPlayer(current => { - return player.canCompare(current); - }); - }, - direct: true, - async content(event, trigger, player) { - const { result } = await player - .chooseTarget(get.prompt2("jsrgyoujin"), (card, player, target) => { - return player.canCompare(target); - }) - .set("ai", target => { - if (!get.event("goon")) return 0; - return -get.attitude(get.player(), target); - }) - .set("goon", player.countCards("hs", ["shan", "caochuan"]) || player.getHp() >= 3); - if (!result.bool) return; - const { targets } = result, - target = targets[0]; - player.logSkill("jsrgyoujin", target); - const { result: result2 } = await player.chooseToCompare(target).set("small", true); - player.addTempSkill("jsrgyoujin_forbid"); - player.markAuto("jsrgyoujin_forbid", [result2.num1]); - target.addTempSkill("jsrgyoujin_forbid"); - target.markAuto("jsrgyoujin_forbid", [result2.num2]); - if (!result2.tie) { - const targets = [target, player]; - if (result2.bool) targets.reverse(); - const sha = new lib.element.VCard({ name: "sha" }); - if (targets[0].canUse(sha, targets[1], false)) { - targets[0].useCard(sha, targets[1], false); - } - } - }, - subSkill: { - forbid: { - charlotte: true, - onremove: true, - mod: { - cardEnabled2: function (card, player) { - if (get.itemtype(card) == "card" && player.getStorage("jsrgyoujin_forbid").some(num => num > get.number(card))) return false; - }, - }, - mark: true, - intro: { - content: "本回合不能使用或打出点数小于$的手牌", - }, - }, - }, - }, - jsrgdailao: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return !player.hasCard(card => { - return player.hasUseTarget(card, true, true); - }); - }, - async content(event, trigger, player) { - await player.showHandcards(); - await player.draw(2); - const evt = event.getParent("phase"); - if (evt) { - game.resetSkills(); - _status.event = evt; - _status.event.finish(); - _status.event.untrigger(true); - } - }, - ai: { - order: 0.0001, - result: { player: 1 }, - }, - }, - jsrgzhubei: { - audio: 2, - trigger: { source: "damageBegin1" }, - forced: true, - init(player) { - player.addSkill("jsrgzhubei_record"); - }, - filter(event, player) { - return event.player.hasHistory("damage", evt => { - return evt.source == player; - }); - }, - logTarget: "player", - async content(event, trigger, player) { - trigger.num++; - }, - subSkill: { - record: { - trigger: { - global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - charlotte: true, - silent: true, - filter(event, player) { - return game.hasPlayer(current => { - if (current.countCards("h")) return false; - const evt = event.getl(current); - return evt && evt.hs && evt.hs.length; - }); - }, - async content(event, trigger, player) { - game.countPlayer(current => { - if (current.countCards("h")) return false; - const evt = trigger.getl(current); - if (evt && evt.hs && evt.hs.length) current.addTempSkill("jsrgzhubei_lost"); - }); - }, - }, - lost: { charlotte: true }, - }, - mod: { - cardUsableTarget(card, player, target) { - if (target.hasSkill("jsrgzhubei_lost")) return true; - }, - }, - }, - //赵云 - jsrglonglin: { - audio: 2, - trigger: { - global: "useCardToPlayered", - }, - usable: 1, - filter(event, player) { - if (event.player == player) return false; - if (event.card.name != "sha") return false; - return event.isFirstTarget && event.player.isPhaseUsing(); - }, - direct: true, - async content(event, trigger, player) { - const juedou = new lib.element.VCard({ name: "juedou", storage: { jsrglonglin: true } }); - const { result } = await player - .chooseToDiscard(get.prompt2("jsrglonglin"), "he") - .set("ai", card => { - if (get.event("goon")) return 5 - get.value(card); - return 0; - }) - .set( - "goon", - (trigger.player.canUse(juedou, player) ? Math.max(0, get.effect(player, juedou, trigger.player, trigger.player)) : 0) + - trigger.targets - .map(target => { - return get.effect(target, trigger.card, trigger.player, player); - }) - .reduce((p, c) => { - return p + c; - }, 0) < - -4 - ) - .set("logSkill", ["jsrglonglin", trigger.player]); - if (result.bool) { - trigger.excluded.addArray(trigger.targets); - game.asyncDelayx(); - if (trigger.player.canUse(juedou, player)) { - const { result } = await trigger.player.chooseBool(`是否视为对${get.translation(player)}使用一张【决斗】?`).set("choice", get.effect(player, juedou, trigger.player, trigger.player) >= 0); - if (result.bool) { - player.addTempSkill("jsrglonglin_source"); - trigger.player.useCard(juedou, player); - } - } - } - }, - subSkill: { - source: { - trigger: { source: "damageSource" }, - charlotte: true, - forced: true, - popup: false, - filter(event, player) { - return event.card && event.card.storage && event.card.storage.jsrglonglin; - }, - async content(event, trigger, player) { - player.line(trigger.player); - trigger.player.addTempSkill("jsrglonglin_forbid"); - }, - }, - forbid: { - mod: { - cardEnabled: function (card, player) { - if (!card.cards) return; - if (card.cards.some(cardx => get.position(cardx) == "h")) return false; - }, - cardSavable: function (card, player) { - if (!card.cards) return; - if (card.cards.some(cardx => get.position(cardx) == "h")) return false; - }, - }, - charlotte: true, - mark: true, - intro: { - content: "不能使用手牌", - }, - }, - }, - }, - jsrgzhendan: { - audio: 2, - trigger: { - player: "damageEnd", - global: "roundStart", - }, - filter(event, player) { - let count = 0; - let roundCount = 1 + (event.name != "damage"); - const curLen = player.actionHistory.length; - for (let i = curLen - 1; i >= 0; i--) { - if ( - roundCount == 1 && - game.hasPlayer(current => { - const history = current.actionHistory[i]; - if (!history.isMe || history.isSkipped) return false; - return true; - }) - ) { - count++; - } - if (player.actionHistory[i].isRound) roundCount--; - if (roundCount <= 0) break; - } - if (!player.storage.jsrgzhendan_mark && count > 0) return true; - return false; - }, - forced: true, - locked: false, - group: "jsrgzhendan_viewas", - async content(event, trigger, player) { - let count = 0; - let roundCount = 1 + (trigger.name != "damage"); - const curLen = player.actionHistory.length; - for (let i = curLen - 1; i >= 0; i--) { - if ( - roundCount == 1 && - game.hasPlayer(current => { - const history = current.actionHistory[i]; - if (!history.isMe || history.isSkipped) return false; - return true; - }) - ) { - count++; - } - if (player.actionHistory[i].isRound) roundCount--; - if (roundCount <= 0) break; - } - count = Math.min(5, count); - await player.draw(count); - if (trigger.name == "damage") { - player.tempBanSkill("jsrgzhendan", "roundStart"); - player.storage.jsrgzhendan_mark = true; - player - .when({ global: "roundStart" }) - .assign({ - lastDo: true, - }) - .then(() => { - delete player.storage.jsrgzhendan_mark; - }); - } - }, - subSkill: { - viewas: { - audio: "jsrgzhendan", - enable: ["chooseToUse", "chooseToRespond"], - filter(event, player) { - if (event.type == "wuxie") return false; - if ( - !_status.connectMode && - !player.countCards("hs", card => { - return get.type2(card) != "basic"; - }) - ) - return false; - return get.inpileVCardList(info => { - if (info[0] != "basic") return false; - return event.filterCard(get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), player, event); - }).length; - }, - chooseButton: { - dialog(event, player) { - const vcards = get.inpileVCardList(info => { - if (info[0] != "basic") return false; - return event.filterCard(get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), player, event); - }); - return ui.create.dialog("镇胆", [vcards, "vcard"]); - }, - check(button) { - if (get.event().getParent().type != "phase") return 1; - return get.player().getUseValue({ name: button.link[2], nature: button.link[3] }); - }, - backup(links, player) { - return { - audio: "jsrgzhendan", - popname: true, - viewAs: { name: links[0][2], nature: links[0][3] }, - filterCard(card, player) { - return get.type2(card) != "basic"; - }, - selectCard: 1, - position: "hs", - }; - }, - prompt(links, player) { - return "将一张非基本手牌当" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用或打出"; - }, - }, - hiddenCard(player, name) { - return get.type(name) == "basic" && player.countCards("hs") > 0; - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter(player) { - return player.countCards("hs") > 0; - }, - order: 0.5, - result: { - player(player) { - if (get.event().dying) { - return get.attitude(player, get.event().dying); - } - return 1; - }, - }, - }, - }, - viewas_backup: {}, - }, - }, - //司马懿 - jsrgyingshi: { - audio: 2, - trigger: { player: "turnOverAfter" }, - async content(event, trigger, player) { - const number = game.dead.length > 2 ? 5 : 3; - const cards = get.bottomCards(number); - game.cardsGotoOrdering(cards); - const next = player.chooseToMove(); - next.set("list", [["牌堆顶"], ["牌堆底", cards.reverse()]]); - next.set("prompt", "鹰眎:点击将牌移动到牌堆顶或牌堆底"); - next.processAI = list => { - const cards = list[1][1], - player = _status.event.player; - const top = []; - const judges = player.getCards("j"); - let stopped = false; - if (!player.hasWuxie()) { - for (let i = 0; i < judges.length; i++) { - const judge = get.judge(judges[i]); - cards.sort((a, b) => judge(b) - judge(a)); - if (judge(cards[0]) < 0) { - stopped = true; - break; - } else { - top.unshift(cards.shift()); - } - } - } - let bottom; - if (!stopped) { - cards.sort((a, b) => 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]; - }; - const { - result: { moved }, - } = await next; - const top = moved[0]; - const bottom = moved[1]; - top.reverse(); - game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { - if (event.top_cards.includes(card)) return ui.cardPile.firstChild; - return null; - }); - player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); - game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); - game.asyncDelayx(); - }, - }, - jsrgtuigu: { - audio: 2, - trigger: { player: "phaseBegin" }, - prompt2(event, player) { - const num = Math.floor(game.countPlayer() / 2); - return `你翻面,令你本回合的手牌上限+${num},摸${get.cnNumber(num)}张牌,视为使用一张【解甲归田】(目标角色不能使用这些牌直到其下回合结束)。`; - }, - group: ["jsrgtuigu_insert", "jsrgtuigu_recover"], - async content(event, trigger, player) { - await player.turnOver(); - const num = Math.floor(game.countPlayer() / 2); - player.addTempSkill("jsrgtuigu_handcard"); - player.addMark("jsrgtuigu_handcard", num, false); - await player.draw(num); - const jiejia = new lib.element.VCard({ name: "jiejia", storage: { jsrgtuigu: true } }); - if (player.hasUseTarget(jiejia)) { - player.addTempSkill("jsrgtuigu_block"); - player.chooseUseTarget(jiejia, true); - } - }, - subSkill: { - insert: { - audio: "jsrgtuigu", - trigger: { global: "roundStart" }, - filter(event, player) { - const curLen = player.actionHistory.length; - if (curLen <= 2) return false; - for (let i = curLen - 2; i >= 0; i--) { - const history = player.actionHistory[i]; - if (history.isMe && !history.isSkipped && !history._jsrgtuigu) return false; - if (history.isRound) break; - } - return true; - }, - forced: true, - locked: false, - async content(event, trigger, player) { - const evt = trigger, - evtx = player.insertPhase(); - player - .when("phaseBeforeStart") - .filter(evtt => evtt == evtx) - .then(() => { - game.players - .slice() - .concat(game.dead) - .forEach(current => { - current.getHistory()._jsrgtuigu = true; - current.getStat()._jsrgtuigu = true; - }); - }); - if (evt.player != player && !evt._finished) { - evt.finish(); - evt._triggered = 5; - const evtxx = evt.player.insertPhase(); - delete evtxx.skill; - } - }, - }, - recover: { - audio: "jsrgtuigu", - trigger: { - player: "loseAfter", - global: ["gainAfter", "equipAfter", "addJudgeAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter(event, player) { - if (player.isHealthy()) return false; - const evt = event.getl(player); - return evt && evt.es && evt.es.length > 0; - }, - forced: true, - locked: false, - async content(event, trigger, player) { - player.recover(); - }, - }, - handcard: { - markimage: "image/card/handcard.png", - intro: { - content(storage, player) { - return "手牌上限+" + storage; - }, - }, - onremove: true, - charlotte: true, - mod: { - maxHandcard(player, num) { - return num + player.countMark("jsrgtuigu_handcard"); - }, - }, - }, - block: { - trigger: { global: "gainAfter" }, - filter(event, player) { - if (event.getParent().name != "jiejia") return false; - const card = event.getParent(2).card; - if (card && card.storage && card.storage.jsrgtuigu) return true; - return false; - }, - charlotte: true, - forced: true, - silent: true, - content() { - trigger.player.addGaintag(trigger.cards, "jsrgtuigu"); - trigger.player.addTempSkill("jsrgtuigu_blocked", { player: "phaseAfter" }); - }, - }, - blocked: { - mod: { - cardEnabled2(card) { - if (get.itemtype(card) == "card" && card.hasGaintag("jsrgtuigu")) return false; - }, - }, - charlotte: true, - forced: true, - popup: false, - onremove(player) { - player.removeGaintag("jsrgtuigu"); - }, - }, - }, - }, - //郭循 - jsrgeqian: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - if (!event.isFirstTarget || event.targets.length != 1 || event.target == player) return false; - if (event.card.name == "sha") return true; - return event.getParent(3).name == "xumou_jsrg"; - }, - prompt2(event, player) { - return `令${get.translation(event.card)}不计入次数限制,且你获得${get.translation(event.target)}一张牌,然后其可以令你本回合至其的距离+2`; - }, - group: "jsrgeqian_prepare", - logTarget: "target", - async content(event, trigger, player) { - if (trigger.addCount !== false) { - trigger.addCount = false; - var stat = player.getStat().card, - name = trigger.card.name; - if (typeof stat[name] == "number") stat[name]--; - } - await player.gainPlayerCard(trigger.target, "he", true); - const { - result: { bool }, - } = await trigger.target.chooseBool(`是否令${get.translation(player)}至你的距离于本回合内+2?`).set("ai", () => true); - if (bool) { - player.addTempSkill("jsrgeqian_distance"); - if (!player.storage.jsrgeqian_distance) player.storage.jsrgeqian_distance = {}; - const id = trigger.target.playerid; - if (typeof player.storage.jsrgeqian_distance[id] != "number") player.storage.jsrgeqian_distance[id] = 0; - player.storage.jsrgeqian_distance[id] += 2; - player.markSkill("jsrgeqian_distance"); - } - }, - subSkill: { - prepare: { - audio: "jsrgeqian", - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return player.countCards("h"); - }, - direct: true, - async content(event, trigger, player) { - while (player.countCards("h") > 0) { - const { - result: { bool, cards }, - } = await player.chooseCard(get.prompt("jsrgeqian"), "你可以蓄谋任意次").set("ai", card => { - const player = get.player(); - if (player.hasValueTarget(card)) return player.getUseValue(card); - return 0; - }); - if (!bool) break; - await player.addJudge({ name: "xumou_jsrg" }, cards); - } - }, - }, - distance: { - onremove: true, - charlotte: true, - mod: { - globalFrom(player, target, distance) { - if (!player.storage.jsrgeqian_distance) return; - const dis = player.storage.jsrgeqian_distance[target.playerid]; - if (typeof dis == "number") return distance + dis; - }, - }, - intro: { - content(storage, player) { - if (!storage) return; - const map = _status.connectMode ? lib.playerOL : game.playerMap; - let str = `你本回合:`; - for (const id in storage) { - str += "
  • 至" + get.translation(map[id]) + "的距离+" + storage[id]; - } - return str; - }, - }, - }, - }, - }, - jsrgfusha: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "fire", - filter(event, player) { - return ( - game.countPlayer(current => { - return player.inRange(current); - }) == 1 - ); - }, - filterTarget(card, player, target) { - return player.inRange(target); - }, - selectTarget: -1, - async content(event, trigger, player) { - player.awakenSkill("jsrgfusha"); - event.target.damage(Math.min(game.countPlayer(), player.getAttackRange())); - }, - ai: { - order: 1, - result: { - target: -2, - }, - }, - }, - //大小虎 - jsrgdaimou: { - audio: 2, - trigger: { - global: "useCardToPlayer", - }, - filter(event, player) { - if (event.card.name != "sha") return false; - if (event.target != player) return !player.hasSkill("jsrgdaimou_other"); - return ( - !player.hasSkill("jsrgdaimou_me") && - player.hasCard(card => { - return (card.viewAs || card.name) == "xumou_jsrg" && lib.filter.cardDiscardable(card, player, "jsrgdaimou"); - }, "j") - ); - }, - direct: true, - async content(event, trigger, player) { - if (trigger.target == player) { - player.logSkill("jsrgdaimou"); - player.addTempSkill("jsrgdaimou_me"); - const { - result: { bool, links }, - } = await player - .chooseButton( - [ - "殆谋:请弃置区域里的一张蓄谋牌", - player.getCards("j", card => { - return (card.viewAs || card.name) == "xumou_jsrg"; - }), - ], - true - ) - .set("filterButton", button => { - return lib.filter.cardDiscardable(button.link, get.player(), "jsrgdaimou"); - }) - .set("ai", button => { - const player = get.player(); - return 1 / Math.max(0.01, player.getUseValue(button.link)); - }); - if (bool) { - player.discard(links); - } - } else { - const { - result: { bool }, - } = await player.chooseBool(get.prompt("jsrgdaimou"), "你可以用牌堆顶的牌蓄谋").set("ai", () => true); - if (bool) { - player.logSkill("jsrgdaimou"); - player.addTempSkill("jsrgdaimou_other"); - player.addJudge({ name: "xumou_jsrg" }, get.cards()); - } - } - }, - subSkill: { - me: { charlotte: true }, - other: { charlotte: true }, - }, - }, - jsrgfangjie: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - async content(event, trigger, player) { - if ( - !player.hasCard(card => { - return (card.viewAs || card.name) == "xumou_jsrg"; - }, "j") - ) { - player.logSkill("jsrgfangjie"); - await player.recover(); - await player.draw(); - } else { - const { - result: { bool, links }, - } = await player - .chooseButton( - [ - "是否弃置区域里的任意张蓄谋牌并失去〖芳洁〗?", - player.getCards("j", card => { - return (card.viewAs || card.name) == "xumou_jsrg"; - }), - ], - [1, Infinity] - ) - .set("filterButton", button => { - return lib.filter.cardDiscardable(button.link, get.player(), "jsrgdaimou"); - }) - .set("ai", () => 0); - if (bool) { - player.logSkill("jsrgfangjie"); - await player.discard(links); - player.removeSkills("jsrgfangjie"); - } - } - }, - }, - //曹芳 - jsrgzhaotu: { - audio: 2, - enable: "chooseToUse", - viewAs: { name: "lebu" }, - position: "hes", - round: 1, - viewAsFilter(player) { - return player.countCards("hes"); - }, - filterCard(card, player) { - return get.color(card) == "red" && get.type2(card) != "trick"; - }, - onuse(result, player) { - player.tempBanSkill("jsrgzhaotu", null, false); - result.targets[0].insertPhase(); - result.targets[0].addTempSkill("jsrgzhaotu_handcard", { player: "phaseAfter" }); - result.targets[0].addMark("jsrgzhaotu_handcard", 2, false); - }, - subSkill: { - handcard: { - intro: { - content(storage, player) { - return "手牌上限-" + storage; - }, - }, - charlotte: true, - onremove: true, - mod: { - maxHandcard(player, num) { - return num - player.countMark("jsrgzhaotu_handcard"); - }, - }, - }, - }, - ai: { - order: 5, - result: { - target(player, target) { - let dis = 0.5 - 0.75 * target.needsToDiscard(2, null, true); - if (dis > 0) return dis; - if (player.hasSkill("jsrgjingju") && player.hasZhuSkill("jsrgweizhui") && get.attitude(player, target) > 0) - return game.countPlayer(current => { - if (current === player || current === target || current.group !== "wei") return false; - return player.hasZhuSkill("jsrgweizhui", current) && get.attitude(player, current) > 0; - }); - return dis; - }, - }, - }, - }, - jsrgjingju: { - audio: 2, - enable: "chooseToUse", - filter(event, player) { - if (event.type == "wuxie" || event.jsrgjingju) return false; - if ( - !player.canMoveCard( - null, - false, - game.filterPlayer(i => i != player), - player, - card => { - return get.position(card) == "j"; - } - ) - ) - return false; - return get.inpileVCardList(info => { - if (info[0] != "basic") return false; - return event.filterCard(get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), player, event); - }).length; - }, - chooseButton: { - dialog: function (event, player) { - const vcards = get.inpileVCardList(info => { - if (info[0] != "basic") return false; - return event.filterCard(get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), player, event); - }); - return ui.create.dialog("惊惧", [vcards, "vcard"], "hidden"); - }, - check: function (button) { - let player = _status.event.player; - if (get.event().getParent().type != "phase") return 1; - return ( - get.player().getUseValue({ name: button.link[2], nature: button.link[3] }) + - game.countPlayer(current => { - if (current === player || current.group !== "wei") return false; - return player.hasZhuSkill("jsrgweizhui", current) && get.attitude(player, current) > 0; - }) - ); - }, - backup: function (links, player) { - return { - filterCard: () => false, - viewAs: { - name: links[0][2], - nature: links[0][3], - isCard: true, - }, - selectCard: -1, - precontent() { - "step 0"; - player - .moveCard( - `惊惧:将其他角色判定区里的牌移动至你的判定区`, - game.filterPlayer(i => i != player), - player, - card => { - return get.position(card) == "j"; - } - ) - .set("logSkill", "jsrgjingju"); - "step 1"; - if (result.bool) { - delete event.result.skill; - } else { - event.getParent().jsrgjingju = true; - event.getParent().goto(0); - delete event.getParent().openskilldialog; - event.finish(); - } - "step 2"; - game.delayx(); - }, - }; - }, - prompt: function (links, player) { - return "选择" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】的目标"; - }, - }, - ai: { - order: function () { - const player = get.player(), - event = _status.event; - if ( - player.canMoveCard(null, false, game.filterPlayer(), player, card => { - return get.position(card) == "j"; - }) - ) { - if (event.type == "dying") { - if (event.filterCard({ name: "tao" }, player, event)) { - return 0.5; - } - } else { - if (event.filterCard({ name: "tao" }, player, event) || event.filterCard({ name: "shan" }, player, event)) { - return 4; - } - if (event.filterCard({ name: "sha" }, player, event)) { - return 2.9; - } - } - } - return 0; - }, - save: true, - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - return player.canMoveCard(null, false, game.filterPlayer(), player, card => { - return get.position(card) == "j"; - }); - }, - result: { - player: function (player) { - if (get.event().type == "dying") { - return get.attitude(player, get.event().dying); - } - return 1; - }, - }, - }, - }, - jsrgweizhui: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - zhuSkill: true, - direct: true, - filter(event, player) { - return player != event.player && event.player.group == "wei" && event.player.isIn() && player.hasZhuSkill("jsrgweizhui", event.player); - }, - async content(event, trigger, player) { - const { - result: { bool, cards }, - } = await trigger.player - .chooseCard(`是否响应${get.translation(player)}的主公技【危坠】?`, "将一张黑色手牌当【过河拆桥】对其使用", (card, player) => { - if (get.color(card) != "black") return false; - return player.canUse(get.autoViewAs({ name: "guohe" }, [card]), get.event("target")); - }) - .set("target", player) - .set("ai", card => { - if (get.effect(get.event("target"), get.autoViewAs({ name: "guohe" }, [card]), player) <= 0) return 0; - return 7 - get.value(card); - }); - if (bool) { - trigger.player.logSkill("jsrgweizhui", player); - trigger.player.useCard(get.autoViewAs({ name: "guohe" }, cards), cards, player); - } - }, - }, - //孙峻 - jsrgyaoyan: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - prompt: "是否发动【邀宴】?", - logTarget: () => game.filterPlayer(), - async content(event, trigger, player) { - const targets = game.filterPlayer(); - const toDebateList = []; - while (targets.length) { - const current = targets.shift(); - const { - result: { bool }, - } = await current.chooseBool(`是否响应${get.translation(player)}的【邀宴】,于回合结束参与议事?`).set("ai", () => Math.random() < 0.5); - if (bool) { - toDebateList.add(current); - current.popup("同意", "wood"); - game.log(current, "#g同意", "参加", player, "的议事"); - } else { - current.popup("拒绝", "fire"); - game.log(current, "#r拒绝", "参加", player, "的议事"); - } - } - if (toDebateList.length) { - player.addTempSkill("jsrgyaoyan_hold"); - player.markAuto("jsrgyaoyan_hold", toDebateList); - } - }, - subSkill: { - hold: { - trigger: { player: "phaseEnd" }, - charlotte: true, - forced: true, - popup: false, - onremove: true, - filter(event, player) { - return player.getStorage("jsrgyaoyan_hold").some(i => i.isIn()); - }, - async content(event, trigger, player) { - player.chooseToDebate(player.getStorage("jsrgyaoyan_hold").filter(i => i.isIn())).set("callback", async event => { - const { bool, opinion, targets } = event.debateResult; - if (bool && opinion) { - if (opinion == "red") { - const notDebated = game.filterPlayer().removeArray(targets); - if (notDebated.length) { - const { result } = await player - .chooseTarget("获得任意名未议事的角色的各一张手牌", [1, Infinity], true, (card, player, target) => { - return get.event("targets").includes(target) && target.countGainableCards(player, "h"); - }) - .set("targets", notDebated) - .set("ai", target => { - const player = get.player(); - const att = get.attitude(player, target); - return -att; - }); - if (result.bool) { - const targets = result.targets; - targets.sortBySeat(); - player.line(targets, "green"); - for (const current of targets) { - await player.gainPlayerCard(current, "h", true); - } - } - } - } else { - const { - result: { bool, targets: targets2 }, - } = await player - .chooseTarget("是否对一名议事的角色造成2点伤害?", (card, player, target) => { - return get.event("targets").includes(target); - }) - .set("targets", targets) - .set("ai", target => { - const player = get.player(); - const eff = get.damageEffect(target, player, player); - return eff; - }); - if (bool) { - player.line(targets2[0]); - targets2[0].damage(2); - } - } - } - }); - }, - }, - }, - }, - jsrgbazheng: { - audio: 2, - trigger: { global: "debateShowOpinion" }, - filter(event, player) { - if (!event.targets.includes(player)) return false; - const damagedPlayers = player - .getHistory("sourceDamage") - .map(evt => evt.player) - .toUniqued(); - let dissent; - const colors = ["red", "black"]; - for (const color of colors) { - if (event[color].some(i => i[0] == player)) { - dissent = colors.find(i => i != color); - break; - } - } - return event[dissent].some(i => damagedPlayers.includes(i[0])); - }, - forced: true, - locked: false, - direct: true, - async content(event, trigger, player) { - let myOpinion, dissent; - const colors = ["red", "black"]; - for (const color of colors) { - if (trigger[color].some(i => i[0] == player)) { - myOpinion = color; - dissent = colors.find(i => i != color); - break; - } - } - const damagedPlayers = player - .getHistory("sourceDamage") - .map(evt => evt.player) - .toUniqued(); - let dissident = []; - for (let i = 0; i < trigger[dissent].length; i++) { - const pair = trigger[dissent][i]; - if (damagedPlayers.includes(pair[0])) { - dissident.push(pair[0]); - trigger[myOpinion].push(pair); - trigger[dissent].splice(i--, 1); - } - } - player.logSkill("jsrgbazheng", dissident); - }, - }, - //刘永 - jsrgdanxin: { - audio: 2, - enable: "chooseToUse", - viewAs: { - name: "tuixinzhifu", - storage: { jsrgdanxin: true }, - }, - filterCard: true, - position: "hes", - precontent() { - player.addTempSkill("jsrgdanxin_effect"); - }, - subSkill: { - effect: { - audio: "jsrgdanxin", - trigger: { - global: "gainAfter", - }, - filter(event, player) { - const level = event.player != player ? 1 : 2; - if (event.player != player && event.getParent(level).name != "tuixinzhifu") return false; - if (event.player == player && event.getParent(level).name != "tuixinzhifu") return false; - const card = event.getParent(level + 1).card; - return card && card.storage && card.storage.jsrgdanxin; - }, - forced: true, - popup: false, - charlotte: true, - async content(event, trigger, player) { - const level = trigger.player != player ? 1 : 2; - const { targets } = trigger.getParent(level + 1); - await player.showCards(trigger.cards); - if (trigger.cards.some(card => get.suit(card) == "heart")) { - const owners = trigger.cards - .filter(card => get.suit(card) == "heart") - .map(card => get.owner(card)) - .toUniqued(); - for (const owner of owners) { - if (owner && owner.isIn()) await owner.recover(); - } - } - if (trigger.player == player) return; - player.addTempSkill("jsrgdanxin_distance"); - if (!player.storage.jsrgdanxin_distance) player.storage.jsrgdanxin_distance = {}; - const id = targets[0].playerid; - if (typeof player.storage.jsrgdanxin_distance[id] != "number") player.storage.jsrgdanxin_distance[id] = 0; - player.storage.jsrgdanxin_distance[id]++; - player.markSkill("jsrgdanxin_distance"); - }, - }, - distance: { - onremove: true, - charlotte: true, - mod: { - globalFrom(player, target, distance) { - if (!player.storage.jsrgdanxin_distance) return; - const dis = player.storage.jsrgdanxin_distance[target.playerid]; - if (typeof dis == "number") return distance + dis; - }, - }, - intro: { - content(storage, player) { - if (!storage) return; - const map = _status.connectMode ? lib.playerOL : game.playerMap; - let str = `你本回合:`; - for (const id in storage) { - str += "
  • 至" + get.translation(map[id]) + "的距离+" + storage[id]; - } - return str; - }, - }, - }, - }, - }, - jsrgfengxiang: { - audio: "fengxiang", - trigger: { player: "damageEnd" }, - forced: true, - direct: true, - filter(event, player) { - return game.hasPlayer(current => { - return current.countCards("e"); - }); - }, - async content(event, trigger, player) { - const { - result: { bool, targets }, - } = await player - .chooseTarget( - "封乡:与一名其他角色交换装备区里的所有牌", - (card, player, target) => { - return target.countCards("e") + player.countCards("e") > 0 && player != target; - }, - true - ) - .set("ai", target => { - const player = get.player(); - const att = get.attitude(player, target); - let delta = get.value(target.getCards("e"), player) - get.value(player.getCards("e"), player); - if (att > 0) { - if (delta < 0) delta += att / 3; - } else { - if (delta < 0) delta -= att / 3; - } - return delta; - }); - if (bool) { - player.logSkill("jsrgfengxiang", targets[0]); - const num = player.countCards("e"); - await player.swapEquip(targets[0]); - const delta = num - player.countCards("e"); - if (delta > 0) player.draw(delta); - } - }, - }, - jsrgfuhai: { - audio: "xinfu_fuhai", - enable: "phaseUse", - usable: 1, - filter(event, player) { - return game.hasPlayer(current => { - return current.countCards("h") && current != player; - }); - }, - filterTarget(card, player, target) { - return target.countCards("h") && target != player; - }, - selectTarget: -1, - multitarget: true, - multiline: true, - async content(event, trigger, player) { - const targets = event.targets.sortBySeat(); - const next = player - .chooseCardOL(targets, "请展示一张手牌", true) - .set("ai", card => { - return -get.value(card); - }) - .set("aiCard", target => { - const hs = target.getCards("h"); - return { bool: true, cards: [hs.randomGet()] }; - }); - next._args.remove("glow_result"); - const { result } = await next; - const cards = []; - const videoId = lib.status.videoId++; - for (let i = 0; i < targets.length; i++) { - cards.push(result[i].cards[0]); - game.log(targets[i], "展示了", result[i].cards[0]); - } - game.broadcastAll( - (targets, cards, id, player) => { - var dialog = ui.create.dialog(get.translation(player) + "发动了【浮海】", cards); - dialog.videoId = id; - const getName = target => { - if (target._tempTranslate) return target._tempTranslate; - var name = target.name; - if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; - return get.translation(name); - }; - for (let i = 0; i < targets.length; i++) { - dialog.buttons[i].querySelector(".info").innerHTML = getName(targets[i]) + "|" + get.strNumber(cards[i].number); - } - }, - targets, - cards, - videoId, - player - ); - await game.asyncDelay(4); - game.broadcastAll("closeDialog", videoId); - let clock = -1, - anticlock = -1; - for (let j = 0; j < 2; j++) { - let increase = -Infinity, - decrease = Infinity, - count = 0; - for (let i = 0; i < targets.length; i++) { - const number = get.number(cards[i], false); - let flag = false; - if (number > increase) { - increase = number; - flag = true; - } else increase = Infinity; - if (number < decrease) { - decrease = number; - flag = true; - } else decrease = -Infinity; - if (flag) count++; - else break; - } - targets.reverse(); - cards.reverse(); - if (j == 0) anticlock = Math.max(1, count); - else clock = Math.max(1, count); - } - const { - result: { index }, - } = await player - .chooseControl(`↖顺时针(${clock})`, `逆时针(${anticlock})↗`) - .set("prompt", "请选择一个方向,摸对应数量的牌") - .set("ai", () => get.event("choice")) - .set("choice", clock > anticlock ? 0 : 1); - player.draw(index == 0 ? clock : anticlock); - }, - ai: { - order: 8, - result: { player: 1 }, - }, - }, - //张嫙 - jsrgtongli: { - audio: "tongli", - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - if (!event.isFirstTarget) return false; - const type = get.type(event.card); - if (type != "basic" && type != "trick") return false; - const hs = player.getCards("h"); - if (!hs.length) return false; - const evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - const num1 = player.getHistory("useCard", evtx => { - return evtx.getParent("phaseUse") == evt; - }).length; - if (hs.length < num1) return false; - const list = []; - for (const i of hs) list.add(get.suit(i, player)); - return list.length == num1; - }, - prompt2(event, player) { - let str = "展示所有手牌,额外结算一次"; - if (event.card.name == "sha" && game.hasNature(event.card)) str += get.translation(event.card.nature); - return str + "【" + get.translation(event.card.name) + "】"; - }, - check(event, player) { - return !get.tag(event.card, "norepeat"); - }, - async content(event, trigger, player) { - await player.showHandcards(); - trigger.getParent().effectCount++; - }, - }, - jsrgshezang: { - audio: "shezang", - round: 1, - trigger: { global: "dying" }, - frequent: true, - filter(event, player) { - return event.player == player || player == _status.currentPhase; - }, - async content(event, trigger, player) { - const cards = get.cards(4); - game.cardsGotoOrdering(cards); - const videoId = lib.status.videoId++; - game.broadcastAll( - (player, id, cards) => { - let str = "奢葬"; - if (player == game.me && !_status.auto) { - str += ":获得任意张花色各不相同的牌"; - } - const dialog = ui.create.dialog(str, cards); - dialog.videoId = id; - }, - player, - videoId, - cards - ); - const time = get.utc(); - game.addVideo("showCards", player, ["奢葬", get.cardsInfo(event.cards)]); - game.addVideo("delay", null, 2); - const list = []; - for (const i of cards) list.add(get.suit(i, false)); - const next = player.chooseButton([1, list.length]); - next.set("dialog", event.videoId); - next.set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if (get.suit(ui.selected.buttons[i].link) == get.suit(button.link)) return false; - } - return true; - }); - next.set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - const { result } = await next; - if (result.bool && result.links) { - const time2 = 1000 - (get.utc() - time); - if (time2 > 0) { - await game.asyncDelay(0, time2); - } - game.broadcastAll("closeDialog", videoId); - player.gain(result.links, "gain2"); - } - }, - }, - jsrgchiying: { - audio: "dcchiying", - enable: "phaseUse", - usable: 1, - filterTarget: true, - async content(event, trigger, player) { - const target = event.target; - const targets = game.filterPlayer(current => target.inRange(current) && current != player).sortBySeat(player); - if (!targets.length) return; - while (targets.length) { - const current = targets.shift(); - if (current.countCards("he")) await current.chooseToDiscard("驰应:请弃置一张牌", "he", true); - } - let cards = []; - game.getGlobalHistory("cardMove", evt => { - if (evt.getParent(3) == event) { - cards.addArray(evt.cards.filter(card => get.type(card) == "basic")); - } - }); - if (cards.length <= target.getHp()) { - cards = cards.filterInD("d"); - if (cards.length) target.gain(cards, "gain2"); - } - }, - ai: { - order: 6, - result: { - target(player, target) { - const targets = game.filterPlayer(current => target.inRange(current) && current != player); - let eff = 0; - for (const targetx of targets) { - let effx = get.effect(targetx, { name: "guohe_copy2" }, player, target); - if (get.attitude(player, targetx) < 0) effx /= 2; - eff += effx; - } - return eff * (get.attitude(player, target) <= 0 ? 0.75 : 1); - }, - }, - }, - }, - //郭照 - jsrgpianchong: { - audio: "pianchong", - trigger: { global: "phaseJieshuBegin" }, - filter(event, player) { - return player.getHistory("lose").length; - }, - frequent: true, - async content(event, trigger, player) { - const { result } = await player.judge(); - let num = 0; - game.getGlobalHistory("cardMove", evt => { - if (evt.name != "cardsDiscard") { - if (evt.name != "lose" || evt.position != ui.discardPile) return false; - } - num += evt.cards.filter(i => get.color(i, false) == result.color).length; - }); - if (num > 0) player.draw(num); - }, - }, - jsrgzunwei: { - audio: "zunwei", - enable: "phaseUse", - usable: 1, - filter(event, player) { - const storage = player.getStorage("jsrgzunwei"); - return ( - storage.length < 3 && - game.hasPlayer(current => { - return (player.isDamaged() && current.getHp() > player.getHp() && !storage.includes(2)) || (current.countCards("h") > player.countCards("h") && !storage.includes(0)) || (current.countCards("e") > player.countCards("e") && !storage.includes(1)); - }) - ); - }, - chooseButton: { - dialog(event, player) { - const list = ["选择手牌数大于你的一名角色", "选择装备数大于你的一名角色", "选择体力值大于你的一名角色"]; - const choiceList = ui.create.dialog("尊位:请选择一项", "forcebutton", "hidden"); - choiceList.add([ - list.map((item, i) => { - if (player.getStorage("jsrgzunwei").includes(i)) item = `${item}`; - return [i, item]; - }), - "textbutton", - ]); - return choiceList; - }, - filter(button) { - const player = get.player(); - if (player.getStorage("jsrgzunwei").includes(button.link)) return false; - if (button.link == 2) { - if (!player.isDamaged()) return false; - return game.hasPlayer(current => { - return current.getHp() > player.getHp(); - }); - } - if (button.link == 0) { - return game.hasPlayer(current => { - return current.countCards("h") > player.countCards("h"); - }); - } - if (button.link == 1) { - return game.hasPlayer(current => { - return current.countCards("e") > player.countCards("e"); - }); - } - }, - backup(links) { - const next = get.copy(lib.skill.jsrgzunwei.backups[links[0]]); - next.audio = "zunwei"; - next.filterCard = function () { - return false; - }; - next.selectCard = -1; - return next; - }, - check(button) { - const player = get.player(); - switch (button.link) { - case 2: { - const target = game.findPlayer(function (current) { - return current.isMaxHp(); - }); - return (Math.min(target.hp, player.maxHp) - player.hp) * 2; - } - case 0: { - const target = game.findPlayer(function (current) { - return current.isMaxHandcard(); - }); - return Math.min(5, target.countCards("h") - player.countCards("h")) * 0.8; - } - case 1: { - const target = game.findPlayer(function (current) { - return current.isMaxEquip(); - }); - return (target.countCards("e") - player.countCards("e")) * 1.4; - } - } - }, - prompt(links) { - return ["选择一名手牌数大于你的其他角色,将手牌数摸至与其相同(至多摸五张)", "选择一名装备区内牌数大于你的其他角色,将其装备区里的牌移至你的装备区,直到你装备数不小于其", "选择一名体力值大于你的其他角色,将体力值回复至与其相同"][links[0]]; - }, - }, - backups: [ - { - filterTarget(card, player, target) { - return target.countCards("h") > player.countCards("h"); - }, - async content(event, trigger, player) { - player.draw(Math.min(5, event.target.countCards("h") - player.countCards("h"))); - if (!player.storage.jsrgzunwei) player.storage.jsrgzunwei = []; - player.storage.jsrgzunwei.add(0); - }, - ai: { - order: 10, - result: { - player: function (player, target) { - return Math.min(5, target.countCards("h") - player.countCards("h")); - }, - }, - }, - }, - { - filterTarget(card, player, target) { - return target.countCards("e") > player.countCards("e"); - }, - async content(event, trigger, player) { - if (!player.storage.jsrgzunwei) player.storage.jsrgzunwei = []; - player.storage.jsrgzunwei.add(1); - const target = event.target; - do { - if ( - !target.countCards("e", card => { - return player.canEquip(card); - }) - ) - break; - const { - result: { bool, links }, - } = await player - .chooseButton([`尊位:将${get.translation(target)}的一张装备牌移至你的区域内`, target.getCards("e")], true) - .set("filterButton", button => { - return get.player().canEquip(button.link); - }) - .set("ai", get.buttonValue); - if (bool) { - target.$give(links[0], player, false); - await player.equip(links[0]); - } - } while (player.countCards("e") < target.countCards("e")); - }, - ai: { - order: 10, - result: { - player(player, target) { - return target.countCards("e") - player.countCards("e"); - }, - }, - }, - }, - { - filterTarget(card, player, target) { - if (player.isHealthy()) return false; - return target.hp > player.hp; - }, - async content(event, trigger, player) { - player.recover(event.target.hp - player.hp); - if (!player.storage.jsrgzunwei) player.storage.jsrgzunwei = []; - player.storage.jsrgzunwei.add(2); - }, - ai: { - order: 10, - result: { - player: function (player, target) { - return Math.min(target.hp, player.maxHp) - player.hp; - }, - }, - }, - }, - ], - ai: { - order: 10, - result: { - player: 1, - }, - }, - subSkill: { - backup: {}, - }, - }, - //江山如故·转 - //404郭嘉 - jsrgqingzi: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return game.hasPlayer(current => { - if (current == player) return false; - return current.hasCard(card => { - return lib.filter.canBeDiscarded(card, player, current); - }, "e"); - }); - }, - derivation: "xinshensu", - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("jsrgqingzi"), "弃置任意名其他角色装备区里的一张牌,然后令这些角色获得〖神速〗直到你的下回合开始", [1, Infinity], (card, player, target) => { - return ( - target != player && - target.hasCard(card => { - return lib.filter.canBeDiscarded(card, player, target); - }, "e") - ); - }) - .set("ai", target => { - var player = _status.event.player; - return target.hasCard(card => { - return (lib.filter.canBeDiscarded(card, player, target) && get.value(card, target) > 3) || (target.hp == 1 && get.value(card, target) > 0); - }); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.slice(); - targets.sortBySeat(); - event.targets = targets; - event.num = 0; - player.logSkill("jsrgqingzi", targets); - player.addSkill("jsrgqingzi_clear"); - } else event.finish(); - "step 2"; - var target = targets[num]; - if ( - target.hasCard(card => { - return lib.filter.canBeDiscarded(card, player, target); - }, "e") - ) { - player.discardPlayerCard(target, "e", true); - target.addAdditionalSkills("jsrgqingzi_" + player.playerid, "xinshensu"); - player.markAuto("jsrgqingzi_clear", [target]); - } - event.num++; - if (event.num < targets.length) event.redo(); - }, - subSkill: { - clear: { - audio: "jsrgqingzi", - charlotte: true, - trigger: { - global: "die", - player: "phaseBegin", - }, - forced: true, - popup: false, - forceDie: true, - onremove: true, - filter: function (event, player) { - if (event.name == "die") { - return player == event.player || player.getStorage("jsrgqingzi_clear").includes(event.player); - } - return player.getStorage("jsrgqingzi_clear").length > 0; - }, - content: function () { - "step 0"; - var targets = player.getStorage("jsrgqingzi_clear"); - if (trigger.name == "die" && player == trigger.player) { - for (var target of targets) { - target.removeAdditionalSkill(`jsrgqingzi_${player.playerid}`); - } - player.removeSkill("jsrgqingzi_clear"); - event.finish(); - return; - } - if (trigger.name == "phase") event.targets = targets.slice(0).sortBySeat(); - else event.targets = [trigger.player]; - "step 1"; - var target = targets.shift(); - var storage = player.getStorage("jsrgqingzi_clear"); - if (storage.includes(target)) { - storage.remove(target); - target.removeAdditionalSkill(`jsrgqingzi_${player.playerid}`); - } - if (targets.length > 0) { - event.redo(); - } else if (!storage.length) { - player.removeSkill("jsrgqingzi_clear"); - } - }, - }, - }, - }, - jsrgdingce: { - audio: 2, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - if (!event.source || !event.source.isIn()) return false; - return player.hasCard(card => { - return lib.filter.cardDiscardable(card, player, "jsrgdingce"); - }); - }, - direct: true, - content: function () { - "step 0"; - var target = trigger.source; - event.target = target; - player - .chooseToDiscard(get.prompt("jsrgdingce", target), "弃置你与其的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。") - .set("ai", card => { - if (_status.event.goon) return 6 - get.value(card); - return 0; - }) - .set( - "goon", - get.attitude(player, target) < 0 || - player - .getCards("h") - .concat(target.getCards("h")) - .filter(card => { - return get.value(card) < 5.5; - }).length >= 2 - ) - .set("logSkill", ["jsrgdingce", target]); - "step 1"; - if (result.bool) { - event.card = result.cards[0]; - if (target.countDiscardableCards(player, "h")) { - var next = player.discardPlayerCard(target, "h", true); - if (target == player) - next.set("ai", button => { - var card = button.link; - return (get.color(card, false) == _status.event.color ? 7.5 : 5) - get.value(card); - }).set("color", get.color(event.card, false)); - } else event.finish(); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = result.cards[0]; - if (get.color(event.card, false) == get.color(card, false)) { - game.delayex(); - player.chooseUseTarget("dongzhuxianji", true); - } - } - }, - }, - jsrgzhenfeng: { - audio: 2, - enable: "phaseUse", - locked: false, - filter: function (event, player) { - if (!event.jsrgzhenfeng) return false; - return event.jsrgzhenfeng.some(info => - event.filterCard( - { - name: info[2], - nature: info[3], - storage: { jsrgzhenfeng: true }, - isCard: true, - }, - player, - event - ) - ); - }, - onChooseToUse: function (event) { - if (!event.jsrgzhenfeng && !game.online) { - var str = ""; - game.countPlayer(current => { - current.getSkills(null, false, false).forEach(skill => { - var info = get.info(skill); - if (!info || info.charlotte) return; - var translation = get.skillInfoTranslation(skill, current); - str += translation; - }); - }); - event.set("jsrgzhenfeng", lib.skill.jsrgzhenfeng.getInclusion(str, null, event.player)); - } - }, - getInclusion: function (str, checkCard, player) { - let list = []; - const names = Object.keys(lib.card); - for (const name of names) { - let type = get.type(name); - if (!["basic", "trick"].includes(type)) continue; - if (player && player.getStorage("jsrgzhenfeng_effect").includes(type)) continue; - const reg = `【${get.translation(name)}】`; - if (name == "sha") { - if (str.includes(reg)) { - if (checkCard && checkCard.name == name) return true; - list.push([type, "", name]); - } - for (let nature of lib.inpile_nature) { - const reg1 = `【${get.translation(nature) + get.translation(name)}】`, - reg2 = `${get.translation(nature)}【${get.translation(name)}】`; - if (str.includes(reg1) || str.includes(reg2)) { - if (checkCard && checkCard.name == name && checkCard.nature == nature) return true; - list.push([type, "", name, nature]); - } - } - } else { - if (!str.includes(reg)) continue; - if (checkCard && checkCard.name == name) return true; - list.push([type, "", name]); - } - } - if (checkCard) return false; - return list; - }, - chooseButton: { - dialog: function (event, player) { - var list = event.jsrgzhenfeng.filter(info => { - return event.filterCard( - { - name: info[2], - nature: info[3], - storage: { jsrgzhenfeng: true }, - isCard: true, - }, - player, - event - ); - }); - return ui.create.dialog("针锋", [list, "vcard"]); - }, - filter: function (button, player) { - return _status.event.getParent().filterCard( - { - name: button.link[2], - nature: button.link[3], - storage: { jsrgzhenfeng: true }, - isCard: true, - }, - player, - _status.event.getParent() - ); - }, - check: function (button) { - var player = _status.event.player; - var card = { - name: button.link[2], - nature: button.link[3], - storage: { jsrgzhenfeng: true }, - isCard: true, - }; - var eff = player.getUseValue(card); - if (["wugu", "zhulu_card", "yiyi", "lulitongxin", "lianjunshengyan", "diaohulishan"].includes(button.link[2])) eff /= 5; - var info = get.info(card); - if (info.toself) { - var str = player - .getSkills(null, false, false) - .map(skill => { - var info = get.info(skill); - if (!info || info.charlotte) return; - return get.skillInfoTranslation(skill, player); - }) - .join("\n"); - if (lib.skill.jsrgzhenfeng.getInclusion(str, card)) eff += get.damageEffect(player, player, player); - } - return eff; - }, - backup: function (links, player) { - return { - audio: "jsrgzhenfeng", - filterCard: () => false, - selectCard: -1, - popname: true, - viewAs: { - name: links[0][2], - nature: links[0][3], - storage: { jsrgzhenfeng: true }, - isCard: true, - }, - precontent: function () { - delete event.result.skill; - player.logSkill("jsrgzhenfeng"); - event.getParent().addCount = false; - player.addTempSkill("jsrgzhenfeng_effect", "phaseUseAfter"); - player.markAuto("jsrgzhenfeng_effect", [get.type(event.result.card)]); - }, - }; - }, - prompt: function (links, player) { - return "视为使用一张" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]); - }, - }, - mod: { - cardUsable: function (card) { - if (card.storage && card.storage.jsrgzhenfeng) return Infinity; - }, - targetInRange: function (card) { - if (card.storage && card.storage.jsrgzhenfeng) return true; - }, - }, - ai: { - order: 1, - result: { - player: 1, - }, - }, - subSkill: { - effect: { - audio: "jsrgzhenfeng", - trigger: { - global: "useCardToBegin", - }, - charlotte: true, - forced: true, - onremove: true, - filter: function (event, player) { - if (!event.card.storage || !event.card.storage.jsrgzhenfeng) return false; - // debugger - var str = event.target - .getSkills(null, false, false) - .map(skill => { - var info = get.info(skill); - if (!info || info.charlotte) return; - return get.skillInfoTranslation(skill, event.target); - }) - .join("\n"); - return lib.skill.jsrgzhenfeng.getInclusion(str, event.card); - }, - logTarget: "target", - content: function () { - trigger.target.damage(); - }, - }, - }, - }, - //张飞 - jsrgbaohe: { - audio: 2, - trigger: { global: "phaseUseEnd" }, - filter: function (event, player) { - return ( - player.countCards("he") >= 2 && - game.hasPlayer(current => { - return current.inRange(event.player) && player.canUse("sha", current, false); - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt2("jsrgbaohe"), 2, "he") - .set("ai", card => { - var val = _status.event.val; - if (val > 20) return 6 - get.value(card); - if (val > 0) return 4 - get.value(card); - return 0; - }) - .set( - "val", - game - .filterPlayer(current => { - return current.inRange(trigger.player) && player.canUse("sha", current, false); - }) - .map(i => get.effect(i, { name: "sha" }, player, player)) - .reduce((p, c) => { - return p + c; - }, 0) - ) - .set("logSkill", "jsrgbaohe"); - "step 1"; - if (result.bool) { - var targets = game.filterPlayer(current => { - return current.inRange(trigger.player) && player.canUse("sha", current, false); - }); - if (targets.length) { - game.delayex(); - player.useCard({ name: "sha", isCard: true, storage: { jsrgbaohe: true } }, targets, false); - player.addTempSkill("jsrgbaohe_add"); - } - } - }, - subSkill: { - add: { - audio: "jsrgbaohe", - trigger: { - global: "useCard", - }, - charlotte: true, - forced: true, - filter: function (event, player) { - let evt = event.getParent(3), - respondTo = event.respondTo; - if (evt.name != "useCard" || !Array.isArray(respondTo) || !respondTo[1].storage || !respondTo[1].storage.jsrgbaohe) return false; - return evt.targets.length > evt.num + 1; - }, - logTarget: function (event) { - let evt = event.getParent(3); - return evt.targets.slice(evt.num + 1); - }, - content: function () { - "step 0"; - var evt = trigger.getParent(3); - var targets = evt.targets.slice(evt.num + 1); - var map = evt.customArgs; - for (var target of targets) { - var id = target.playerid; - if (!map[id]) map[id] = {}; - if (typeof map[id].extraDamage != "number") { - map[id].extraDamage = 0; - } - map[id].extraDamage++; - } - game.delayx(); - }, - }, - }, - }, - jsrgxushi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: true, - filterTarget: lib.filter.notMe, - selectCard: [1, Infinity], - selectTarget: [1, Infinity], - position: "he", - filterOk: function () { - return ui.selected.cards.length == ui.selected.targets.length; - }, - check: function (card) { - var player = get.player(); - if ( - ui.selected.cards.length >= - game.countPlayer(current => { - return current != player && get.attitude(player, current) > 0; - }) - ) - return 0; - return 5 - get.value(card); - }, - prompt: "按顺序选择卡牌和角色,并将卡牌交给对应顺序的角色。然后你获得两倍数量的【影】。", - complexSelect: true, - multitarget: true, - multiline: true, - discard: false, - lose: false, - delay: false, - contentBefore: function () { - event.getParent()._jsrgxushi_targets = targets.slice(); - }, - content: function () { - "step 0"; - var targets = event.getParent()._jsrgxushi_targets; - var list = []; - for (var i = 0; i < targets.length; i++) { - var target = targets[i]; - var card = cards[i]; - list.push([target, card]); - player.line(target); - } - game.loseAsync({ - gain_list: list, - player: player, - cards: cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - "step 1"; - player.gain(lib.card.ying.getYing(2 * cards.length), "gain2"); - }, - ai: { - order: 2.5, - result: { - target: function (player, target) { - var card = ui.selected.cards[ui.selected.targets.length]; - if (!card) return 0; - if (get.value(card) < 0) return -1; - if (get.value(card) < 1.5 && player.hasSkill("jsrgbaohe")) return (get.sgnAttitude(player, target) + 0.01) / 5; - return Math.sqrt(5 - Math.min(4, target.countCards("h"))); - }, - }, - }, - }, - jsrgzhuiming: { - audio: 2, - trigger: { - player: "useCardToPlayered", - }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - return event.isFirstTarget && event.targets.length == 1 && event.target.isIn(); - }, - direct: true, - content: function* (event, map) { - var player = map.player, - trigger = map.trigger, - target = trigger.target; - var colors = Object.keys(lib.color).remove("none"); - var result = yield player - .chooseControl(colors, "cancel2") - .set("prompt", get.prompt("jsrgzhuiming")) - .set("prompt2", `声明一种颜色并令${get.translation(trigger.target)}弃置任意张牌`) - .set("ai", () => { - var player = get.player(), - target = get.event("target"), - att = get.attitude(player, target) > 0 ? 1 : -1; - var list = get - .event("controls") - .map(i => [ - i, - target - .getCards("he") - .map(get.value) - .reduce((p, c) => p + c, 0), - ]) - .sort((a, b) => { - return att * (a[1] - b[1]); - }); - return list[0][0]; - }) - .set("target", target); - var color = result.control; - if (color == "cancel2") { - event.finish(); - return; - } - player.logSkill("jsrgzhuiming", target); - player.popup(color, color == "red" ? "fire" : "thunder"); - game.log(player, "声明了", color); - var prompt = `追命:${get.translation(player)}声明了${get.translation(color)}`, - prompt2 = `请弃置任意张牌,然后其展示你一张牌,若此牌颜色为${get.translation(color)},此【杀】不计入次数限制、不可被响应且伤害+1`; - yield target - .chooseToDiscard(prompt, prompt2, [1, Infinity], "he", true) - .set("ai", card => { - var color = get.event("color"), - player = get.player(); - if (get.position(card) == "e" && get.color(card) == color) return 2; - if (player.getHp() <= 2 && get.color(card) == color) return Math.random() < 0.5; - return 0; - }) - .set("color", color); - if (target.countCards("he")) - result = yield player - .choosePlayerCard(target, "he", true) - .set("ai", button => { - var color = get.event("color"), - att = get.event("att"); - if (get.position(button.link) == "e" && get.color(button.link) == color) { - return 100 * att; - } - return 1 + Math.random(); - }) - .set("color", color) - .set("att", get.attitude(player, target) > 0 ? 1 : -1); - else { - event.finish(); - return; - } - var card = result.cards[0]; - player.showCards(card, `${get.translation(target)}因【追命】被展示`); - if (get.color(card) == color) { - trigger.directHit.addArray(game.players); - var evt = trigger.getParent(); - if (evt.addCount !== false) { - evt.addCount = false; - player.getStat().card.sha--; - } - var map = trigger.getParent().customArgs; - var id = target.playerid; - if (!map[id]) map[id] = {}; - if (typeof map[id].extraDamage != "number") { - map[id].extraDamage = 0; - } - map[id].extraDamage++; - game.log(trigger.card, "不计入次数限制、不可被响应、伤害+1"); - } - }, - }, - //娄圭 - jsrgshacheng: { - audio: 2, - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - return event.targets.some(i => i.isIn() && i.hasHistory("lose", evt => evt.cards2.length)) && player.getExpansions("jsrgshacheng").length; - }, - direct: true, - group: "jsrgshacheng_build", - content: function () { - "step 0"; - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - var targets = trigger.targets.filter(i => i.isIn() && i.hasHistory("lose", evt => evt.cards2.length)); - player - .chooseTarget(get.prompt("jsrgshacheng"), "令一名目标角色摸X张牌,然后移去一张“城”(X为对应角色本回合失去过的牌数且至多为5)", (card, player, target) => { - return get.event("targets").includes(target); - }) - .set("targets", targets) - .set("ai", target => { - return target == get.event("targetx") ? 1 : 0; - }) - .set( - "targetx", - (() => { - let info = []; - targets.filter(target => { - let att = get.attitude(player, target); - if (att <= 0) return false; - if (Math.abs(att) > 1) att = Math.sign(att) * Math.sqrt(Math.abs(att)); - info.push([ - target, - att * - target - .getHistory("lose") - .map(evt => evt.cards2.length) - .reduce((p, c) => p + c, 0), - ]); - return false; - }); - if (!info.length) return null; - info = info.sort((a, b) => { - return b[1] - a[1]; - })[0]; - if (info[1] <= 0) return null; - return info[0]; - })() - ); - "step 1"; - if (result.bool) { - event.target = result.targets[0]; - var cards = player.getExpansions("jsrgshacheng"); - if (cards.length == 1) event._result = { bool: true, links: cards }; - else player.chooseButton([`沙城:移去一张“城”`, cards], true); - } else { - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - event.finish(); - } - "step 2"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - if (result.bool) { - player.logSkill("jsrgshacheng", target); - player.loseToDiscardpile(result.links); - target.draw( - Math.min( - 5, - target - .getHistory("lose") - .map(evt => evt.cards2.length) - .reduce((p, c) => p + c, 0) - ) - ); - } - }, - marktext: "城", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - subSkill: { - build: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - var cards = get.cards(2); - player.addToExpansion(cards, "gain2").gaintag.add("jsrgshacheng"); - }, - }, - }, - }, - jsrgninghan: { - audio: 2, - init: player => { - game.addGlobalSkill("jsrgninghan_frozen"); - }, - onremove: player => { - if (!game.hasPlayer(current => current.hasSkill("jsrgninghan"), true)) game.removeGlobalSkill("jsrgninghan_frozen"); - }, - trigger: { global: "damageEnd" }, - filter: function (event, player) { - if (!event.hasNature("ice")) return false; - return event.cards && event.cards.filterInD().length; - }, - forced: true, - content: function () { - var cards = trigger.cards.filterInD(); - player.addToExpansion(cards, "gain2").gaintag.add("jsrgshacheng"); - }, - subSkill: { - frozen: { - mod: { - cardnature: function (card, player) { - if (card.name === "sha" && get.suit(card) === "club") return "ice"; - }, - aiOrder: (player, card, num) => { - if (num && card.name === "sha" && game.hasNature(card, "ice")) { - let lg = game.findPlayer(current => current.hasSkill("jsrgninghan")); - if (lg) return num + 0.15 * Math.sign(get.attitude(player, lg)); - } - }, - }, - trigger: { player: "dieAfter" }, - filter: (event, player) => { - return !game.hasPlayer(current => !current.hasSkill("jsrgninghan"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("jsrgninghan_frozen"); - }, - }, - }, - ai: { - combo: "jsrgshacheng", - }, - }, - //张任 - jsrgfuni: { - audio: 2, - trigger: { global: "roundStart" }, - group: ["jsrgfuni_unlimit", "jsrgfuni_zero"], - forced: true, - direct: true, - content: function* (event, map) { - var player = map.player, - trigger = map.trigger; - var count = Math.ceil(game.countPlayer() / 2); - var result = yield player.chooseTarget(`伏匿:请选择至多${get.cnNumber(count)}名角色`, `令这些角色获得共计${get.cnNumber(count)}张【影】`, true, [1, count]).set("ai", target => { - return get.attitude(get.player(), target) + get.event().getRand(target.playerid); - }); - if (result.bool) { - var targets = result.targets.slice().sortBySeat(_status.currentPhase); - player.logSkill("jsrgfuni", targets); - } else event.finish(); - yield null; - var num = count / targets.length; - if (num == 1 || num == count) { - result = { - bool: true, - links: targets.map(current => { - return `${num}|${current.playerid}`; - }), - }; - } else { - var dialog = ["伏匿:选择每名角色要获得的【影】数"]; - var len = count - targets.length + 1; - for (var target of targets) { - dialog.addArray([ - `
    ${get.translation(target)}
    `, - [ - Array.from({ length: len }).map((_, i) => { - return [`${i + 1}|${target.playerid}`, get.cnNumber(i + 1, true)]; - }), - "tdnodes", - ], - ]); - } - result = yield player - .chooseButton(dialog, true) - .set("filterButton", button => { - var total = 0, - info = button.link.split("|"); - var numFix = 0; - for (var buttonx of ui.selected.buttons) { - var infox = buttonx.link.split("|"); - var num = parseInt(infox[0]); - total += num; - if (infox[1] == info[1]) numFix = num; - } - return total + parseInt(info[0]) - numFix <= get.event("count"); - }) - .set("count", count) - .set("filterOk", () => { - var total = 0; - for (var buttonx of ui.selected.buttons) { - total += parseInt(buttonx.link.split("|")[0]); - } - return total == get.event("count"); - }) - .set("selectButton", () => { - return [get.event("len"), Math.max(get.event("len"), ui.selected.buttons.length) + 1]; - }) - .set("len", targets.length) - .set("custom", { - add: {}, - replace: { - button: function (button) { - if (!_status.event.isMine()) return; - if (button.classList.contains("selectable") == false) return; - if (button.classList.contains("selected")) { - ui.selected.buttons.remove(button); - button.classList.remove("selected"); - if (_status.multitarget || _status.event.complexSelect) { - game.uncheck(); - game.check(); - } - } else { - var current = button.parentNode.querySelector(".selected"); - if (current) { - ui.selected.buttons.remove(current); - current.classList.remove("selected"); - } - button.classList.add("selected"); - ui.selected.buttons.add(button); - } - game.check(); - }, - }, - }) - .set("processAI", () => { - return get.event("aiResult"); - }) - .set( - "aiResult", - (() => { - var result = targets.map(i => { - return [i == player ? 2 : 1, i.playerid]; - }); - var rest = count - targets.length - 1; - while (rest--) result[Math.floor(Math.random() * result.length)][0]++; - return { - bool: true, - links: result.map(i => `${i[0]}|${i[1]}`), - }; - })() - ); - } - if (result.bool) { - var links = result.links; - var list = []; - for (var link of links) { - var info = link.split("|"); - var id = info[1]; - var target = (_status.connectMode ? lib.playerOL : game.playerMap)[id]; - player.line(target); - var yings = lib.card.ying.getYing(parseInt(info[0])); - list.push([target, yings]); - game.log(target, "获得了", yings); - } - game.loseAsync({ - gain_list: list, - animate: "gain2", - }).setContent("gaincardMultiple"); - } - }, - subSkill: { - zero: { - priority: Infinity, - mod: { - attackRange: () => 0, - }, - }, - unlimit: { - audio: "jsrgfuni", - trigger: { - global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter"], - }, - filter: function (event, player) { - return event.getd().some(i => get.name(i, false) == "ying"); - }, - forced: true, - content: function () { - player.addTempSkill("jsrgfuni_buff"); - }, - }, - buff: { - charlotte: true, - trigger: { player: "useCard1" }, - forced: true, - popup: false, - content: function () { - trigger.directHit.addArray(game.players); - game.log(trigger.card, "不可被响应"); - }, - mark: true, - intro: { - content: "使用牌无距离限制且不能被响应", - }, - mod: { - targetInRange: () => true, - }, - }, - }, - ai: { - expose: 0.15, - halfneg: true - }, - }, - jsrgchuanxin: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return ( - player.countCards("hes") && - game.hasPlayer(current => - player.canUse( - { - name: "sha", - storage: { jsrgchuanxin: true }, - }, - current - ) - ) - ); - }, - direct: true, - content: function () { - var next = player.chooseToUse(); - next.set("openskilldialog", `###${get.prompt("jsrgchuanxin")}###将一张牌当【杀】使用,且当一名角色受到此【杀】伤害时,此伤害+X(X为其本回合回复过的体力值)。`); - next.set("norestore", true); - next.set("_backupevent", "jsrgchuanxin_backup"); - next.set("addCount", false); - next.set("logSkill", "jsrgchuanxin"); - next.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - next.backup("jsrgchuanxin_backup"); - }, - subSkill: { - backup: { - filterCard: function (card) { - return get.itemtype(card) == "card"; - }, - viewAs: { - name: "sha", - storage: { jsrgchuanxin: true }, - }, - selectCard: 1, - position: "hes", - ai1: function (card) { - var player = get.player(); - var maxVal = 5.5; - if (get.name(card, false) == "ying" && player.hasSkill("jsrgchuanxin")) maxVal -= 3; - return maxVal - get.value(card); - }, - precontent: function () { - delete event.result.skill; - player.addTempSkill("jsrgchuanxin_add"); - }, - }, - add: { - trigger: { global: "damageBegin3" }, - filter: function (event, player) { - if (!event.card || !event.card.storage || !event.card.storage.jsrgchuanxin) return false; - if (event.getParent().type != "card") return false; - return game.hasGlobalHistory("changeHp", evt => { - return evt.getParent().name == "recover" && evt.player == event.player; - }); - }, - forced: true, - charlotte: true, - content: function () { - var num = game - .getGlobalHistory("changeHp", evt => { - return evt.getParent().name == "recover" && evt.player == trigger.player; - }) - .map(evt => evt.num) - .reduce((p, c) => p + c, 0); - trigger.num += num; - game.log(trigger.card, "的伤害+" + num); - }, - }, - }, - }, - //黄忠 - jsrgcuifeng: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "orange", - locked: false, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var name of lib.inpile) { - var info = lib.card[name]; - if (!info || info.notarget || (info.selectTarget && info.selectTarget != 1) || !get.tag({ name: name }, "damage")) continue; - if (name == "sha") { - list.push(["基本", "", "sha"]); - for (var nature of lib.inpile_nature) list.push(["基本", "", name, nature]); - } else if (get.type(name) == "trick") list.push(["锦囊", "", name]); - else if (get.type(name) == "basic") 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], - isCard: true, - storage: { jsrgcuifeng: true }, - }, - player, - _status.event.getParent() - ); - }, - check: function (button) { - var player = _status.event.player; - var effect = player.getUseValue({ - name: button.link[2], - nature: button.link[3], - storage: { jsrgcuifeng: true }, - }); - if (effect > 0) return effect; - return 0; - }, - backup: function (links, player) { - return { - audio: "jsrgcuifeng", - selectCard: -1, - filterCard: () => false, - popname: true, - viewAs: { - name: links[0][2], - nature: links[0][3], - isCard: true, - storage: { jsrgcuifeng: true }, - }, - precontent: function () { - player.logSkill("jsrgcuifeng"); - player.awakenSkill("jsrgcuifeng"); - delete event.result.skill; - if (!player.storage.jsrgcuifeng_check) - player - .when("phaseEnd") - .then(() => { - var num = 0; - player.checkHistory("sourceDamage", evt => { - if (evt.card.storage.jsrgcuifeng) num += evt.num; - }); - if (num == 0 || num > 1) { - player.restoreSkill("jsrgcuifeng"); - game.log(player, "重置了", "#g【摧锋】"); - } - delete player.storage.jsrgcuifeng_check; - }) - .translation("摧锋"); - player.setStorage("jsrgcuifeng_check", true); - }, - }; - }, - prompt: function (links, player) { - return "请选择" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "的目标"; - }, - }, - mod: { - targetInRange: card => { - if (card.storage && card.storage.jsrgcuifeng) return true; - }, - }, - ai: { - order: 1.9, - result: { - player: 1, - }, - }, - }, - jsrgdengnan: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "orange", - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var name of lib.inpile) { - var info = lib.card[name]; - if (!info || info.type != "trick" || info.notarget || get.tag({ name: name }, "damage")) continue; - list.push(["锦囊", "", name]); - } - return ui.create.dialog("登难", [list, "vcard"]); - }, - filter: function (button, player) { - return _status.event.getParent().filterCard({ name: button.link[2], isCard: true }, player, _status.event.getParent()); - }, - check: function (button) { - var player = _status.event.player; - return player.getUseValue(button.link[2]); - }, - backup: function (links, player) { - return { - audio: "jsrgdengnan", - selectCard: -1, - filterCard: () => false, - popname: true, - viewAs: { - name: links[0][2], - isCard: true, - storage: { jsrgdengnan: true }, - }, - precontent: function () { - player.logSkill("jsrgdengnan"); - player.awakenSkill("jsrgdengnan"); - delete event.result.skill; - if (!player.storage.jsrgdengnan_check) - player - .when("phaseEnd") - .then(() => { - var targets = []; - player.checkHistory("useCard", evt => { - if (evt.card.storage.jsrgdengnan) targets.addArray(evt.targets); - }); - if ( - targets.every(current => { - return current.hasHistory("damage"); - }) - ) { - player.restoreSkill("jsrgdengnan"); - game.log(player, "重置了", "#g【登难】"); - } - delete player.storage.jsrgdengnan_check; - }) - .translation("登难"); - player.setStorage("jsrgdengnan_check", true); - }, - }; - }, - prompt: function (links, player) { - return "请选择" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "的目标"; - }, - }, - ai: { - order: 2, - result: { - player: 1, - }, - }, - }, - //夏侯荣 - jsrgfenjian: { - audio: 2, - enable: "chooseToUse", - locked: false, - filter: function (event, player) { - return ["juedou", "tao"].some(name => { - return ( - !player.getStorage("jsrgfenjian_used").includes(name) && - event.filterCard( - { - name: name, - isCard: true, - storage: { jsrgfenjian: true }, - }, - player, - event - ) - ); - }); - }, - hiddenCard: function (player, name) { - if (["juedou", "tao"].some(i => i == name && !player.getStorage("jsrgfenjian_used").includes(name))) return true; - return false; - }, - chooseButton: { - dialog: function (event, player) { - var dialog = ui.create.dialog("奋剑", [["juedou", "tao"].filter(name => !player.getStorage("jsrgfenjian_used").includes(name)), "vcard"]); - dialog.direct = true; - return dialog; - }, - filter: function (button, player) { - var evt = _status.event.getParent(); - return evt.filterCard( - { - name: button.link[2], - isCard: true, - storage: { jsrgfenjian: true }, - }, - player, - evt - ); - }, - check: function (button) { - if (button.link[2] === "tao") { - let dying = _status.event.getParent(2).dying; - if (dying) - return get.effect( - dying, - { - name: "tao", - isCard: true, - storage: { jsrgfenjian: true }, - }, - _status.event.player - ); - } - return _status.event.player.getUseValue({ - name: button.link[2], - isCard: true, - storage: { jsrgfenjian: true }, - }); - }, - backup: function (links) { - return { - audio: "jsrgfenjian", - viewAs: { - name: links[0][2], - isCard: true, - storage: { jsrgfenjian: true }, - }, - filterCard: () => false, - selectCard: -1, - precontent: function () { - player.logSkill("jsrgfenjian"); - delete event.result.skill; - player.addTempSkill("jsrgfenjian_effect"); - player.addMark("jsrgfenjian_effect", 1, false); - if (!player.storage.jsrgfenjian_used) - player.when({ global: "phaseAfter" }).then(() => { - delete player.storage.jsrgfenjian_used; - }); - player.markAuto("jsrgfenjian_used", [event.result.card.name]); - }, - }; - }, - prompt: function (links) { - return "奋剑:令你本回合受到的伤害+1,视为使用" + get.translation(links[0][2]); - }, - }, - mod: { - targetEnabled: function (card, player, target) { - if (player == target && card.storage && card.storage.jsrgfenjian) return false; - }, - }, - ai: { - order: function (item, player) { - return Math.max(get.order({ name: "juedou" }), get.order({ name: "tao" })) + 0.2; - }, - result: { - player: player => { - if (_status.event.dying) return 2 * get.sgnAttitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - effect: { - audio: "jsrgfenjian", - charlotte: true, - trigger: { player: "damageBegin3" }, - forced: true, - onremove: true, - content: function () { - trigger.num += player.countMark("jsrgfenjian_effect"); - }, - intro: { content: "本回合受到的伤害+#" }, - }, - }, - }, - //孙尚香 - jsrgguiji: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (player.hasSkill("jsrgguiji_used")) return false; - return game.hasPlayer(current => lib.skill.jsrgguiji.filterTarget("keiki", player, current)); - }, - filterTarget: function (card, player, target) { - return target.countCards("h") < player.countCards("h") && target.hasSex("male"); - }, - content: function () { - "step 0"; - player.swapHandcards(target); - player.addSkill("jsrgguiji_swapback"); - player.markAuto("jsrgguiji_swapback", target); - player.addTempSkill("jsrgguiji_used"); - }, - ai: { - order: 6, - result: { - target: function (player, target) { - var val = player - .getCards("h") - .map(i => get.value(i)) - .reduce((p, c) => p + c, 0); - var val2 = target - .getCards("h") - .map(i => get.value(i)) - .reduce((p, c) => p + c, 0); - return val - val2; - }, - }, - }, - subSkill: { - used: { charlotte: true }, - swapback: { - audio: "jsrgguiji", - trigger: { - global: ["phaseUseEnd", "dieAfter"], - }, - filter: function (event, player) { - return player.getStorage("jsrgguiji_swapback").includes(event.player); - }, - charlotte: true, - direct: true, - check: function (event, player) { - return ( - player - .getCards("h") - .map(i => get.value(i)) - .reduce((p, c) => p + c, 0) < - event.player - .getCards("h") - .map(i => get.value(i)) - .reduce((p, c) => p + c, 0) + - 4 * Math.random() - ); - }, - content: function () { - "step 0"; - if (trigger.name == "phaseUse") { - player - .chooseBool(get.prompt("jsrgguiji_swapback", trigger.player), "与其交换手牌。") - .set("ai", () => { - return get.event("bool"); - }) - .set("bool", lib.skill.jsrgguiji_swapback.check(trigger, player) > 0); - } else { - player.unmarkAuto("jsrgguiji_swapback", [trigger.player]); - event.finish(); - } - "step 1"; - if (result.bool) { - player.logSkill("jsrgguiji_swapback", trigger.player); - player.swapHandcards(trigger.player); - } - player.unmarkAuto("jsrgguiji_swapback", [trigger.player]); - }, - intro: { - content: "$的下个出牌阶段结束时,你可以与其交换手牌", - }, - }, - }, - }, - jsrgjiaohao: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return [1, 2, 3, 4, 5].some(i => player.countEmptySlot(i)); - }, - forced: true, - locked: false, - global: "jsrgjiaohao_g", - content: function () { - "step 0"; - var count = Math.ceil([1, 2, 3, 4, 5].map(i => player.countEmptySlot(i)).reduce((p, c) => p + c, 0) / 2); - player.gain(lib.card.ying.getYing(count), "gain2"); - }, - subSkill: { - g: { - audio: "jsrgjiaohao", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(current => { - if (current == player || !current.hasSkill("jsrgjiaohao")) return false; - return player.hasCard(card => { - return get.type(card) == "equip" && current.canEquip(card); - }); - }); - }, - filterTarget: function (card, player, target) { - if (target.isMin()) return false; - return target != player && target.hasSkill("jsrgjiaohao") && target.canEquip(card); - }, - selectTarget: function () { - var num = game.countPlayer(current => { - return current.hasSkill("jsrgjiaohao"); - }); - return num > 1 ? 1 : -1; - }, - filterCard: function (card) { - return get.type(card) == "equip"; - }, - check: function (card) { - var player = get.player(); - if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { - return 11 - get.equipValue(card); - } - return 6 - get.value(card); - }, - prompt: function () { - var list = game.filterPlayer(current => { - return current.hasSkill("jsrgjiaohao"); - }); - return `将一张装备牌置于${get.translation(list)}${list.length > 1 ? "中的一人" : ""}的装备区`; - }, - discard: false, - lose: false, - prepare: function (cards, player, targets) { - player.$give(cards, targets[0], false); - }, - content: function () { - target.equip(cards[0]); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - var card = ui.selected.cards[0]; - if (card) return get.effect(target, card, target, target); - return 0; - }, - }, - }, - }, - }, - }, - //庞统 - jsrgmanjuan: { - audio: 2, - trigger: { - player: "loseEnd", - global: ["equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd"], - }, - filter: function (event, player) { - return (player.countCards("h") == 0) ^ player.hasSkill("jsrgmanjuan_in"); - }, - forced: true, - locked: false, - firstDo: true, - silent: true, - content: function () { - "step 0"; - if (!player.countCards("h")) { - var cards = []; - game.checkGlobalHistory("cardMove", evt => { - if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") { - cards.addArray(evt.cards.filterInD("d")); - } - }); - var cardsx = cards.map(card => { - var cardx = ui.create.card(); - cardx.init(get.cardInfo(card)); - cardx._cardid = card.cardid; - return cardx; - }); - player.directgains(cardsx, null, "jsrgmanjuan"); - player.addSkill("jsrgmanjuan_in"); - } else { - player.removeSkill("jsrgmanjuan_in"); - } - }, - subSkill: { - in: { - audio: "jsrgmanjuan", - trigger: { - global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], - }, - forced: true, - locked: false, - silent: true, - filter: function (event, player) { - var cards = event.getd(); - return cards.length; - }, - onremove: function (player) { - var cards2 = player.getCards("s", card => { - return card.hasGaintag("jsrgmanjuan"); - }); - if (player.isOnline2()) { - player.send( - function (cards, player) { - cards.forEach(i => i.delete()); - if (player == game.me) ui.updatehl(); - }, - cards2, - player - ); - } - cards2.forEach(i => i.delete()); - if (player == game.me) ui.updatehl(); - }, - group: ["jsrgmanjuan_use", "jsrgmanjuan_lose"], - content: function () { - var cards = []; - var idList = player.getCards("s", card => card.hasGaintag("jsrgmanjuan")).map(i => i._cardid); - game.checkGlobalHistory("cardMove", evt => { - if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") { - cards.addArray(evt.cards.filter(i => get.position(i, true) == "d" && !idList.includes(i.cardid))); - } - }); - var cards2 = cards.map(card => { - var cardx = ui.create.card(); - cardx.init(get.cardInfo(card)); - cardx._cardid = card.cardid; - return cardx; - }); - player.directgains(cards2, null, "jsrgmanjuan"); - }, - mod: { - cardEnabled2: function (card, player) { - if (get.itemtype(card) == "card" && card.hasGaintag("jsrgmanjuan") && player.getStorage("jsrgmanjuan_used").includes(get.number(card, false))) return false; - }, - }, - }, - use: { - trigger: { - player: ["useCardBefore", "respondBefore"], - }, - charlotte: true, - forced: true, - popup: false, - firstDo: true, - filter: function (event, player) { - var cards = player.getCards("s", card => card.hasGaintag("jsrgmanjuan") && card._cardid); - return ( - event.cards && - event.cards.some(card => { - return cards.includes(card); - }) - ); - }, - content: function () { - var idList = player.getCards("s", card => card.hasGaintag("jsrgmanjuan")).map(i => i._cardid); - var cards = []; - game.checkGlobalHistory("cardMove", evt => { - if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") { - cards.addArray(evt.cards.filter(i => idList.includes(i.cardid))); - } - }); - var cards2 = []; - for (var card of trigger.cards) { - var cardx = cards.find(cardx => cardx.cardid == card._cardid); - if (cardx) cards2.push(cardx); - } - var cards3 = trigger.cards.slice(); - trigger.cards = cards2; - trigger.card.cards = cards2; - if (player.isOnline2()) { - player.send( - function (cards, player) { - cards.forEach(i => i.delete()); - if (player == game.me) ui.updatehl(); - }, - cards3, - player - ); - } - cards3.forEach(i => i.delete()); - if (player == game.me) ui.updatehl(); - if (!player.storage.jsrgmanjuan_used) { - player.when({ global: "phaseAfter" }).then(() => { - delete player.storage.jsrgmanjuan_used; - }); - } - player.markAuto( - "jsrgmanjuan_used", - cards3.map(card => get.number(card, false)) - ); - }, - }, - lose: { - trigger: { - global: ["loseEnd", "equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd", "cardsGotoOrderingBegin", "phaseAfter"], - }, - charlotte: true, - forced: true, - popup: false, - firstDo: true, - filter: function (event, player) { - if (event.name == "phase") return true; - var idList = player.getCards("s", card => card.hasGaintag("jsrgmanjuan")).map(i => i._cardid); - return ( - event.cards && - event.cards.some(card => { - return idList.includes(card.cardid); - }) - ); - }, - content: function () { - var cards2; - if (trigger.name == "phase") { - cards2 = player.getCards("s", card => { - return card.hasGaintag("jsrgmanjuan"); - }); - } else { - var idList = []; - game.checkGlobalHistory("cardMove", evt => { - if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") { - idList.addArray(evt.cards.filter(i => get.position(i, true) == "d").map(i => i.cardid)); - } - }); - cards2 = player.getCards("s", card => { - return card.hasGaintag("jsrgmanjuan") && !idList.includes(card._cardid); - }); - } - if (player.isOnline2()) { - player.send( - function (cards, player) { - cards.forEach(i => i.delete()); - if (player == game.me) ui.updatehl(); - }, - cards2, - player - ); - } - cards2.forEach(i => i.delete()); - if (player == game.me) ui.updatehl(); - }, - }, - }, - }, - jsrgyangming: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(current => { - return player.canCompare(current); - }); - }, - filterTarget: function (card, player, current) { - return player.canCompare(current); - }, - content: function () { - "step 0"; - event.num = 0; - "step 1"; - player.chooseToCompare(target).set( - "small", - get.attitude(player, target) > 0 && - (player.countCards("h", card => { - return get.value(card) < 6; - }) <= 1 || - target.countCards("h", card => { - return get.value(card) < 6; - }) <= 1) - ); - "step 2"; - if (result.winner != target) { - if (!player.canCompare(target)) event._result = { bool: false }; - else - player - .chooseBool("是否与其重复此拼点流程?") - .set("ai", () => get.event("bool")) - .set("bool", get.effect(target, "jsrgyangming", player, player) > 0); - event.num++; - } else { - if (event.num) target.draw(event.num); - player.recover(); - event.finish(); - } - "step 3"; - if (result.bool) { - event.goto(1); - } - }, - ai: { - order: 1, - expose: 0.15, - result: { - target: function (player, target) { - var maxnum = 0; - var cards2 = target.getCards("h"); - for (var i = 0; i < cards2.length; i++) { - if (get.number(cards2[i]) > maxnum) { - maxnum = get.number(cards2[i]); - } - } - if (maxnum > 10) maxnum = 10; - if (maxnum < 5 && cards2.length > 1) maxnum = 5; - var cards = player.getCards("h"); - for (var i = 0; i < cards.length; i++) { - if (get.number(cards[i]) < maxnum) return 1; - } - return 0; - }, - }, - }, - }, - //韩遂 - jsrgniluan: { - audio: "niluan", - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - var damaged = game.filterPlayer(current => { - return current.hasAllHistory("sourceDamage", evt => evt.player == player); - }); - var undamaged = game.filterPlayer().removeArray(damaged); - player.chooseCardTarget({ - prompt: get.prompt("jsrgniluan"), - prompt2: `${undamaged.length ? "选择一张牌弃置并选择一名未对你造成过伤害的角色,你对其造成1点伤害" : ""}${undamaged.length && damaged.length ? ";
    或" : ""}${damaged.length ? "仅选择一名对你造成过伤害的角色,你令其摸两张牌" : ""}。`, - damaged: damaged, - aiTarget: (() => { - if ( - undamaged.includes(player) && - !undamaged.some(i => { - if (i === player) return false; - let att = get.attitude(player, i); - if (att > 0) return true; - return att < 0 && i.getHp(true) + i.hujia < 2; - }) && - (player.hp > 2 || get.damageEffect(player, player, player) >= 0) - ) - return player; - var info = game - .filterPlayer() - .map(current => { - let damage = undamaged.includes(current), - card = { name: damage ? "damage" : "draw" }; - return [current, get.effect(current, card, player, player) * (damage ? 0.7 : 2)]; - }) - .sort((a, b) => b[1] - a[1])[0]; - if (info[1] > 0) return info[0]; - return null; - })(), - filterCard: lib.filter.cardDiscardable, - selectCard: function () { - if (get.event("damaged").length == 0) return 1; - if (get.event("damaged").length == game.countPlayer()) return 0; - return [0, 1]; - }, - position: "he", - filterTarget: function (card, player, target) { - var damaged = get.event("damaged"); - return damaged.includes(target) ^ (ui.selected.cards.length > 0); - }, - selectTarget: 1, - ai1: function (card) { - if (get.event("damaged").includes(get.event("aiTarget"))) return 0; - return 6 - get.value(card); - }, - ai2: function (target) { - return target == get.event("aiTarget") ? 10 : 0; - }, - }); - "step 1"; - if (result.bool) { - var cards = result.cards, - target = result.targets[0]; - player.logSkill("jsrgniluan", target); - if (cards && cards.length) { - player.discard(cards); - game.delayex(); - target.damage(); - } else { - target.draw(2); - } - } - }, - }, - jsrghuchou: { - audio: 2, - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - const history = _status.globalHistory; - for (let i = history.length - 1; i >= 0; i--) { - let evts = history[i]["useCard"]; - for (let j = evts.length - 1; j >= 0; j--) { - var evt = evts[j]; - let card = evt.card, - targets = evt.targets; - if (!get.tag(card, "damage") || !targets.includes(player)) continue; - return event.player == evt.player; - } - } - return false; - }, - forced: true, - content: function () { - trigger.num++; - }, - ai: { - damageBonus: true, - skillTagFilter: (player, tag, arg) => { - if (tag === "damageBonus" && arg && arg.target) { - const history = _status.globalHistory; - for (let i = history.length - 1; i >= 0; i--) { - let evts = history[i]["useCard"]; - for (let j = evts.length - 1; j >= 0; j--) { - var evt = evts[j]; - let card = evt.card, - targets = evt.targets; - if (!get.tag(card, "damage") || !targets.includes(player)) continue; - return arg.target === evt.player; - } - } - return false; - } - }, - effect: { - player: (card, player, target) => { - if ( - get.tag(card, "damage") && - target && - lib.skill.jsrghuchou.ai.skillTagFilter(player, "damageBonus", { - card: card, - target: target, - }) && - !target.hasSkillTag("filterDamage", null, { - player: player, - card: card, - }) - ) - return [1, 0, 2, 0]; - }, - }, - }, - }, - jsrgjiemeng: { - audio: 2, - zhuSkill: true, - forced: true, - init: () => { - game.addGlobalSkill("jsrgjiemeng_effect"); - }, - onremove: () => { - if (!game.hasPlayer(i => i.hasSkill("jsrgjiemeng"), true)) game.removeGlobalSkill("jsrgjiemeng_effect"); - }, - subSkill: { - effect: { - mod: { - globalFrom: function (from, to, distance) { - if (from.group != "qun") return; - if (to.hasZhuSkill("jsrgjiemeng")) return; - return distance - game.countPlayer(current => current.group == "qun"); - }, - }, - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer(i => i.hasSkill("jsrgjiemeng"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("jsrgjiemeng_effect"); - }, - }, - }, - }, - //张楚 - jsrghuozhong: { - audio: "dcjizhong", - global: "jsrghuozhong_g", - subSkill: { - g: { - audio: "dcjizhong", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - if (player.hasJudge("bingliang")) return false; - if (!game.hasPlayer(current => current.hasSkill("jsrghuozhong"))) return false; - return player.countCards("hes", card => get.color(card) == "black" && get.type2(card) != "trick") > 0; - }, - viewAs: { name: "bingliang" }, - position: "hes", - discard: false, - prompt: function () { - var list = game.filterPlayer(target => { - return target.hasSkill("jsrghuozhong"); - }); - return `将一张黑色非锦囊牌当【兵粮寸断】置于自己的判定区,然后令${get.translation(list)}${list.length > 1 ? "中的一人" : ""}摸两张牌。`; - }, - filterCard: function (card, player, event) { - return get.color(card) == "black" && get.type2(card) != "trick" && player.canAddJudge({ name: "bingliang", cards: [card] }); - }, - selectTarget: -1, - filterTarget: function (card, player, target) { - return player == target; - }, - check: function (card) { - return 6 - get.value(card); - }, - precontent: function* (event, map) { - var player = map.player; - var targets = game.filterPlayer(current => current.hasSkill("jsrghuozhong")); - var result; - if (targets.length) result = { bool: true, targets: targets }; - else - result = yield player - .chooseTarget("请选择一名传教士,发动其的【惑众】", true, (card, player, target) => { - return get.event("targets").includes(target); - }) - .set("targets", targets); - if (result.bool) { - var target = result.targets[0]; - player.logSkill("jsrghuozhong", target); - var next = game.createEvent("jsrghuozhong_draw", false); - next.set("player", player); - next.set("target", target); - event.next.remove(next); - event.getParent().after.push(next); - next.setContent(function () { - target.draw(2); - }); - } - }, - ai: { - result: { - player: function (player) { - if (game.hasPlayer(current => get.attitude(player, current) > 2 && current.hasSkill("jsrghuozhong"))) return 1; - return 0; - }, - }, - order: 9, - }, - }, - }, - }, - jsrgrihui: { - audio: "dcrihui", - locked: false, - trigger: { source: "damageSource" }, - filter: function (event, player) { - return ( - event.getParent().type == "card" && - event.card && - event.card.name == "sha" && - game.hasPlayer(current => { - return current != player && current.countCards("j"); - }) - ); - }, - prompt: "是否发动【日彗】?", - prompt2: function (event, player) { - var list = game.filterPlayer(current => { - return current != player && current.countCards("j"); - }); - return `令${get.translation(list)}${list.length > 1 ? "各" : ""}摸一张牌。`; - }, - logTarget: function (event, player) { - return game.filterPlayer(current => { - return current != player && current.countCards("j"); - }); - }, - group: "jsrgrihui_sha", - content: function () { - game.asyncDraw(lib.skill.jsrgrihui.logTarget(trigger, player)); - }, - mod: { - cardUsableTarget: function (card, player, target) { - if (card.name == "sha" && !player.getStorage("jsrgrihui_targeted").includes(target)) return true; - }, - }, - subSkill: { - sha: { - trigger: { player: "useCardToPlayered" }, - forced: true, - silent: true, - firstDo: true, - content: function () { - player.addTempSkill("jsrgrihui_targeted"); - player.markAuto("jsrgrihui_targeted", trigger.target); - }, - }, - targeted: { - charlotte: true, - onremove: true, - }, - }, - }, - //夏侯恩 - jsrghujian: { - audio: "twfujian", - trigger: { - global: "phaseEnd", - }, - filter: function (event, player) { - if (!Array.from(ui.discardPile.childNodes).some(i => i.name == "chixueqingfeng")) return false; - return game.hasGlobalHistory("everything", evt => ["useCard", "respond"].includes(evt.name) && evt.player.isIn()); - }, - popup: false, - forced: true, - locked: false, - group: "jsrghujian_begin", - content: function () { - "step 0"; - var cards = Array.from(ui.discardPile.childNodes).filter(i => i.name == "chixueqingfeng"); - if (cards.length) { - event.cards = cards; - var history = _status.globalHistory, - target = null; - for (var i = history.length - 1; i >= 0 && !target; i--) { - var evts = history[i]["everything"]; - for (var j = evts.length - 1; j >= 0; j--) { - var evt = evts[j]; - if (!["useCard", "respond"].includes(evt.name)) continue; - target = evt.player; - break; - } - } - if (target && target.isIn()) { - event.target = target; - target.chooseBool(`是否响应${get.translation(player)}的【护剑】?`, "获得弃牌堆里的【赤血青锋】。"); - } else event.finish(); - } else event.finish(); - "step 1"; - if (result.bool) { - player.logSkill("jsrghujian"); - player.line(target); - target.gain(cards, "gain2"); - } - }, - subSkill: { - begin: { - audio: "twfujian", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - player.gain(game.createCard2("chixueqingfeng", "spade", 6), "gain2"); - }, - }, - }, - }, - jsrgshili: { - audio: "twjianwei", - enable: "phaseUse", - usable: 1, - viewAs: { - name: "juedou", - }, - filterCard: { type: "equip" }, - position: "hs", - viewAsFilter: function (player) { - return player.hasCard({ type: "equip" }, "hs"); - }, - check: function (card) { - return (get.name(card, false) == "chixueqingfeng" ? 20 : 12) - _status.event.player.getUseValue(card); - }, - ai: { - order: 0.001, - }, - }, - //范疆张达 - jsrgfushan: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - return game.hasPlayer(i => i != player); - }, - content: function* (event, map) { - var player = map.player, - trigger = map.trigger, - targets = game.filterPlayer(i => i != player); - var shas = player.mayHaveSha(target, "use", null, "count") - player.getCardUsable("sha", true); - for (var target of targets) { - var att = get.attitude(target, player); - var result = yield target - .chooseCard("he", `负山:是否交给${get.translation(player)}一张牌?`, `若如此做,其此阶段使用【杀】的次数上限+1`) - .set("att", att) - .set("ai", card => { - if (!get.event("goon")) return -get.value(card); - var isSha = get.name(card, get.event("target")) == "sha"; - if (get.event("att") < 0) return (isSha ? 0 : 5) - get.value(card); - return (isSha ? 10 : 0) - get.value(card); - }) - .set("goon", (att > 0 && shas >= 0) || (att < 0 && target.hp > player.getCardUsable("sha", true) && shas < -1 / Math.max(1, player.hp))) - .set("target", player); - if (result.bool) { - target.give(result.cards, player); - target.line(player); - player.addTempSkill("jsrgfushan_sha", "phaseAfter"); - player.addMark("jsrgfushan_sha", 1, false); - player.markAuto("jsrgfushan_given", target); - } - } - player - .when("phaseUseAfter") - .filter(evt => evt == trigger) - .then(() => { - player.logSkill("jsrgfushan"); - if ( - player.getCardUsable("sha", true) > - player.getHistory("useCard", evt => { - return evt.getParent("phaseUse") == trigger && evt.card.name == "sha" && evt.addCount !== false; - }).length && - player.storage.jsrgfushan_given && - player.storage.jsrgfushan_given.every(i => i.isIn()) - ) { - player.loseHp(2); - } else { - player.drawTo(player.maxHp); - } - delete player.storage.jsrgfushan_given; - }); - }, - subSkill: { - sha: { - charlotte: true, - onremove: true, - marktext: "负", - intro: { content: "使用【杀】的次数上限+#" }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("jsrgfushan_sha"); - }, - }, - }, - }, - }, - //江山如故·承 - //404孙策 - jsrgduxing: { - audio: 2, - enable: "phaseUse", - viewAs: { - name: "juedou", - storage: { jsrgduxing: true }, - isCard: true, - }, - viewAsFilter: function (player) { - if (player.hasSkill("jsrgduxing_used")) return false; - }, - filterCard: () => false, - selectCard: -1, - selectTarget: [1, Infinity], - precontent: function () { - player.logSkill("jsrgduxing"); - delete event.result.skill; - var targets = event.result.targets; - for (var target of targets) { - target.addTempSkill("jsrgduxing_allsha"); - } - player.addTempSkill("jsrgduxing_restore"); - player.addTempSkill("jsrgduxing_used", "phaseUseAfter"); - }, - ai: { - order: 5, - result: { - player: function (player, target) { - var eff = Math.sign(get.effect(target, { name: "juedou" }, player, player)); - if ( - player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: { name: "juedou" }, - }, - true - ) || - ui.selected.targets.concat(target).reduce((p, c) => { - return p + c.countCards("h"); - }, 0) < player.countCards("h", "sha") - ) { - return 0; - } - return -114514; - }, - target: -1.5, - }, - }, - subSkill: { - allsha: { - charlotte: true, - mod: { - cardname: function (card, player, name) { - return "sha"; - }, - }, - }, - used: { - charlotte: true, - }, - restore: { - charlotte: true, - trigger: { - global: "useCardAfter", - }, - forced: true, - popup: false, - forceDie: true, - forceOut: true, - filter: function (event, player) { - return event.card.name == "juedou" && event.card.storage && event.card.storage.jsrgduxing; - }, - content: function () { - game.countPlayer(current => { - current.removeSkill("jsrgduxing_allsha"); - }, true); - }, - }, - }, - }, - jsrgzhiheng: { - audio: 2, - trigger: { - source: "damageBegin1", - }, - forced: true, - filter: function (event, player) { - if (event.getParent().type != "card") return false; - var respondEvts = []; - respondEvts.addArray(event.player.getHistory("useCard")).addArray(event.player.getHistory("respond")); - respondEvts = respondEvts.filter(i => i.respondTo).map(evt => evt.respondTo); - return respondEvts.some(list => { - return list[0] == player; - }); - }, - content: function () { - trigger.num++; - }, - }, - jsrgzhasi: { - audio: 2, - trigger: { - player: "damageBegin4", - }, - limited: true, - skillAnimation: true, - animationColor: "wood", - filter: function (event, player) { - return event.num >= player.getHp(); - }, - content: function () { - player.awakenSkill("jsrgzhasi"); - trigger.cancel(); - player.changeSkills(["rezhiheng"], ["jsrgzhiheng"]); - player.addSkill("jsrgzhasi_undist"); - }, - derivation: "rezhiheng", - subSkill: { - undist: { - group: "undist", - trigger: { - player: ["useCardAfter", "damageEnd"], - }, - filter: function (event, player) { - if (event.name == "useCard") - return event.targets.some(target => { - return target != player; - }); - return true; - }, - forced: true, - popup: false, - charlotte: true, - content: function () { - player.removeSkill("jsrgzhasi_undist"); - }, - mark: true, - intro: { - content: "诈死中,不计入距离和座次的计算", - }, - }, - }, - }, - jsrgbashi: { - audio: 2, - trigger: { player: "chooseToRespondBefore" }, - zhuSkill: true, - filter: function (event, player) { - if (event.responded) return false; - if (player.storage.jsrgbashiing) return false; - if (!player.hasZhuSkill("jsrgbashi")) return false; - if (!event.filterCard({ name: "sha" }, player, event) && !event.filterCard({ name: "shan" }, player, event)) return false; - return game.hasPlayer(function (current) { - return current != player && current.group == "wu"; - }); - }, - check: function (event, player) { - if (get.damageEffect(player, event.player, player) >= 0) return false; - return true; - }, - content: function () { - "step 0"; - event.targets = game.filterPlayer(); - "step 1"; - var target = event.targets.shift(); - event.target = target; - if (!target) event.finish(); - else if (!target.isIn() || target == player) event.redo(); - else if (target.group == "wu") { - if ((target == game.me && !_status.auto) || get.attitude(target, player) > 2 || target.isOnline()) { - player.storage.jsrgbashiing = true; - var list = ["sha", "shan"].filter(name => trigger.filterCard({ name: name }, player, trigger)); - var names = list.map(i => "【" + get.translation(i) + "】").join("或"); - var next = target.chooseToRespond("是否替" + get.translation(player) + "打出一张" + names + "?", { name: list }); - next.set("ai", function () { - var event = _status.event; - return get.attitude(event.player, event.source) - 2; - }); - next.set("skillwarn", "替" + get.translation(player) + "打出一张" + names); - next.autochoose = function () { - if (!lib.filter.autoRespondSha.apply(this, arguments)) return false; - return lib.filter.autoRespondShan.apply(this, arguments); - }; - next.set("source", player); - } - } - "step 2"; - delete player.storage.jsrgbashiing; - if (result.bool) { - event.finish(); - var name = result.card.name; - trigger.result = { bool: true, card: { name: name, isCard: true } }; - trigger.responded = true; - trigger.animate = false; - if (typeof target.ai.shown == "number" && target.ai.shown < 0.95) { - target.ai.shown += 0.3; - if (target.ai.shown > 0.95) target.ai.shown = 0.95; - } - } else { - event.goto(1); - } - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - if (arg == "use") return false; - if (player.storage.jsrgbashiing) return false; - if (!player.hasZhuSkill("jsrgbashi")) return false; - return game.hasPlayer(function (current) { - return current != player && current.group == "wu"; - }); - }, - }, - }, - //许攸 - jsrglipan: { - forbid: ["guozhan"], - audio: 2, - trigger: { - player: "phaseEnd", - }, - direct: true, - content: function () { - "step 0"; - var list = lib.group.slice(); - list.remove(player.group); - var getV = function (group) { - var val = 1; - if (group == "wei" || group == "qun") val++; - game.countPlayer(current => { - if (current.group != group) return false; - var att = get.attitude(player, current); - if (att > 0) val++; - else if (att == 0) val += 0.5; - else val--; - }); - return val; - }; - var maxGroup = list.slice().sort((a, b) => { - return getV(b) - getV(a); - })[0]; - list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", get.prompt("jsrglipan")) - .set("prompt2", "变更为另一个势力") - .set("ai", () => { - return _status.event.choice; - }) - .set("choice", maxGroup); - "step 1"; - var group = result.control; - if (group == "cancel2") return; - player.logSkill("jsrglipan"); - player.popup(group + "2", get.groupnature(group, "raw")); - player.changeGroup(group); - var num = game.countPlayer(current => { - return current.group == group && current != player; - }); - if (num > 0) player.draw(num); - var next = player.phaseUse(); - next.jsrglipan = true; - event.next.remove(next); - trigger.next.push(next); - player.addTempSkill("jsrglipan_backfire"); - }, - subSkill: { - backfire: { - trigger: { - player: "phaseUseEnd", - }, - charlotte: true, - forced: true, - popup: false, - filter: function (event, player) { - return event.jsrglipan; - }, - content: function () { - "step 0"; - var targets = game.filterPlayer(current => { - return current.group == player.group; - }); - targets.sortBySeat(); - event.targets = targets; - "step 1"; - var target = targets.shift(); - event.target = target; - if (target && target.isIn() && target.canUse({ name: "juedou" }, player)) { - target.chooseCardTarget({ - position: "hes", - prompt: "是否将一张牌当【决斗】对" + get.translation(player) + "使用?", - filterCard: function (card, player) { - return player.canUse(get.autoViewAs({ name: "juedou" }, [card]), _status.event.getParent().player); - }, - filterTarget: function (card, player, target) { - var source = _status.event.getParent().player; - if (target != source && !ui.selected.targets.includes(source)) return false; - card = get.autoViewAs({ name: "juedou" }, [card]); - return lib.filter.filterTarget.apply(this, arguments); - }, - selectTarget: function () { - var card = get.card(), - player = get.player(); - if (!card) return; - card = get.autoViewAs({ name: "juedou" }, [card]); - var range = [1, 1]; - game.checkMod(card, player, range, "selectTarget", player); - return range; - }, - ai1: function (card) { - var player = _status.event.player, - target = _status.event.getParent().player; - var eff = get.effect(target, get.autoViewAs({ name: "juedou" }, [card]), player, player); - if (eff <= 0) return 0; - return (player.hp == 1 ? 10 : 6) - get.value(card); - }, - ai2: function (target) { - if (target == _status.event.getParent().player) return 100; - return get.effect(target, { name: "juedou" }, _status.event.player); - }, - }); - } - "step 2"; - if (result.bool) { - var cards = result.cards; - var cardx = get.autoViewAs({ name: "juedou" }, cards); - var targets = result.targets.filter(targetx => { - return target.canUse(cardx, targetx); - }); - if (targets.length) target.useCard(cardx, cards, targets); - } - if (targets.length) event.goto(1); - }, - }, - }, - }, - jsrgqingxi: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (player.group != "qun") return false; - return game.hasPlayer(current => lib.skill.jsrgqingxi.filterTarget("", player, current)); - }, - groupSkill: true, - filterTarget: function (card, player, target) { - if (target.countCards("h") >= player.countCards("h")) return false; - return !player.getStorage("jsrgqingxi_used").includes(target); - }, - content: function () { - "step 0"; - player.addTempSkill("jsrgqingxi_used", "phaseUseAfter"); - player.markAuto("jsrgqingxi_used", [target]); - var num = player.countCards("h") - target.countCards("h"); - if (num > 0) player.chooseToDiscard(num, true, "轻袭:弃置" + get.cnNumber(num) + "张手牌"); - "step 1"; - var card = { - name: "sha", - nature: "stab", - isCard: true, - }; - if (player.canUse(card, target, false)) player.useCard(card, target, false); - }, - ai: { - order: 8, - result: { - target: (player, target) => { - let num = player.countCards("h") - target.countCards("h"), - eff = get.effect(target, { name: "sha", nature: "stab" }, player, target), - val = 0, - ph = _status.event.getTempCache("jsrgqingxi_result", "ph"); - if (!ph) { - ph = player.getCards("h").sort((a, b) => { - return get.value(a) - get.value(b); - }); - _status.event.putTempCache("jsrgqingxi_result", "ph", ph); - } - ph.slice(0, num).forEach(i => { - val += get.value(i, player); - }); - eff = Math.sign(eff) * Math.sqrt(Math.abs(eff)); - if (val > 2 * Math.abs(eff)) return 0; - return eff / num; - }, - }, - }, - subSkill: { - used: { - onremove: true, - charlotte: true, - }, - }, - }, - jsrgjinmie: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - if (player.group != "wei") return false; - return game.hasPlayer(current => current.countCards("h") > player.countCards("h")); - }, - groupSkill: true, - filterTarget: function (card, player, target) { - return target.countCards("h") > player.countCards("h"); - }, - content: function () { - "step 0"; - var card = { - name: "sha", - nature: "fire", - storage: { jsrgjinmie: target }, - isCard: true, - }; - if (player.canUse(card, target, false)) { - player.useCard(card, target, false); - player.addTempSkill("jsrgjinmie_effect"); - } - }, - ai: { - order: 0.5, - result: { - target: function (player, target) { - var eff = get.effect(target, { name: "sha", nature: "fire" }, player, target) / 30; - if ( - !target.mayHaveShan( - player, - "use", - target.getCards("h", i => { - return i.hasGaintag("sha_notshan"); - }) - ) - ) - eff *= 2; - var del = target.countCards("h") - player.countCards("h") + 1.5; - eff *= Math.sqrt(del); - return eff; - }, - }, - }, - subSkill: { - effect: { - trigger: { - source: "damageSource", - }, - filter: function (event, player) { - return event.card && event.card.storage && event.card.storage.jsrgjinmie && event.card.storage.jsrgjinmie.isIn(); - }, - forced: true, - popup: false, - charlotte: true, - content: function () { - "step 0"; - var target = trigger.card.storage.jsrgjinmie; - var del = target.countCards("h") - player.countCards("h"); - if (del > 0) { - player.line(target); - player.discardPlayerCard(target, "h", true, del); - } - // else if(del<0){ - // player.line(target); - // target.draw(-del); - // } - }, - }, - }, - }, - //吕布 - jsrgwuchang: { - forbid: ["guozhan"], - audio: 2, - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - forced: true, - filter: function (event, player) { - var cards = event.getg(player); - if (!cards.length) return false; - return game.hasPlayer(current => { - if (current == player) return false; - return event.getl(current).cards2.length; - }); - }, - group: "jsrgwuchang_add", - content: function () { - "step 0"; - var targets = game.filterPlayer(current => { - if (current == player) return false; - return trigger.getl(current).cards2.length; - }); - var target = targets[0]; - player.changeGroup(target.group); - player.popup(target.group + "2", get.groupnature(target.group, "raw")); - }, - subSkill: { - add: { - trigger: { - source: "damageBegin1", - }, - filter: function (event, player) { - if (!event.card || !["sha", "juedou"].includes(event.card.name) || event.getParent().type != "card") return false; - return event.player.group == player.group; - }, - forced: true, - content: function () { - "step 0"; - trigger.num++; - var group = "qun"; - player.changeGroup(group); - player.popup(group + "2", get.groupnature(group, "raw")); - }, - }, - }, - }, - jsrgqingjiao: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (player.group != "qun") return false; - if (!player.countCards("hes")) return false; - return ( - (!player.hasSkill("jsrgqingjiao_tuixinzhifu") && - game.hasPlayer(current => { - return current.countCards("h") > player.countCards("h"); - })) || - (!player.hasSkill("jsrgqingjiao_chenghuodajie") && - game.hasPlayer(current => { - return current.countCards("h") < player.countCards("h"); - })) - ); - }, - groupSkill: true, - position: "hes", - filterCard: true, - selectCard: 1, - discard: false, - lose: false, - delay: false, - filterTarget: function (card, player, target) { - var mod = game.checkMod(ui.selected.cards[0], player, "unchanged", "cardEnabled2", player); - if (!mod) return false; - var del = target.countCards("h") - player.countCards("h"); - if (del == 0) return false; - var name = del > 0 ? "tuixinzhifu" : "chenghuodajie"; - if (player.hasSkill("jsrgqingjiao_" + name)) return false; - return player.canUse({ name: name, cards: ui.selected.cards }, target); - }, - content: function () { - var del = target.countCards("h") - player.countCards("h"); - var name = del > 0 ? "tuixinzhifu" : "chenghuodajie"; - player.useCard({ name: name }, target, cards); - player.addTempSkill("jsrgqingjiao_" + name, "phaseUseAfter"); - }, - ai: { - order: 7, - result: { - player: function (player, target) { - var name = target.countCards("h") > player.countCards("h") ? "tuixinzhifu" : "chenghuodajie"; - var list = []; - if (ui.selected.cards.length) list.addArray(ui.selected.cards); - var card = get.autoViewAs({ name: name }, list); - return get.effect(target, card, player, player); - }, - }, - }, - subSkill: { - tuixinzhifu: { - charlotte: true, - }, - chenghuodajie: { - charlotte: true, - }, - }, - }, - jsrgchengxu: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - locked: false, - filter: function (event, player) { - if (player.group != "shu") return false; - return game.hasPlayer(current => { - return current != player && current.group == player.group; - }); - }, - groupSkill: true, - content: function () { - trigger.directHit.addArray( - game.filterPlayer(current => { - return current != player && current.group == player.group; - }) - ); - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return player.group == "shu" && player.group == arg.target.group; - }, - }, - }, - //张郃 - jsrgqiongtu: { - audio: 2, - enable: "chooseToUse", - groupSkill: true, - viewAs: { - name: "wuxie", - suit: "none", - number: null, - isCard: true, - }, - filter: function (event, player) { - if (!player.countCards("he", card => _status.connectMode || get.type(card) != "basic")) return false; - return player.group == "qun" && !player.hasSkill("jsrgqiongtu_check"); - }, - viewAsFilter: function (player) { - if (!player.countCards("he", card => _status.connectMode || get.type(card) != "basic")) return false; - return player.group == "qun" && !player.hasSkill("jsrgqiongtu_check"); - }, - filterCard: function (card) { - return get.type(card) != "basic"; - }, - position: "he", - popname: true, - ignoreMod: true, - precontent: function () { - "step 0"; - player.logSkill("jsrgqiongtu"); - delete event.result.skill; - var card = event.result.cards[0]; - event.card = card; - event.result.card = { - name: event.result.card.name, - storage: { jsrgqiongtu: true }, - isCard: true, - }; - event.result.cards = []; - player.addToExpansion(card, player, "give").gaintag.add("jsrgqiongtu"); - player.addTempSkill("jsrgqiongtu_check"); - }, - marktext: "途", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - delete player.storage[skill]; - }, - subSkill: { - check: { - trigger: { - global: "useCardAfter", - }, - filter: function (event, player) { - return event.card.name == "wuxie" && event.card.storage && event.card.storage.jsrgqiongtu; - }, - forced: true, - popup: false, - charlotte: true, - content: function () { - "step 0"; - game.delayx(); - var evt = trigger.getParent(4); - if (evt.name == "phaseJudge") { - state = evt.cancelled; - } else { - state = evt._neutralized; - } - if (state) { - player.draw(); - } else { - player.changeGroup("wei"); - var cards = player.getExpansions("jsrgqiongtu"); - if (cards.length) player.gain(cards, "gain2"); - } - }, - }, - }, - }, - jsrgxianzhu: { - audio: 2, - enable: "chooseToUse", - filter: function (event, player) { - return ( - player.group == "wei" && - player.hasCard(card => { - return _status.connectMode || get.type(card) == "trick"; - }, "hs") - ); - }, - groupSkill: true, - locked: false, - viewAs: { - name: "sha", - storage: { jsrgxianzhu: true }, - }, - position: "hs", - filterCard: function (card) { - return get.type(card) == "trick"; - }, - check: function (card) { - var player = _status.event.player; - var cardx = { - name: "sha", - storage: { jsrgxianzhu: true }, - cards: [card], - }; - if ( - game.hasPlayer(current => { - return player.canUse(cardx, current) && get.effect(current, card, player, player) > 0 && get.effect(current, cardx, player, player) > 0; - }) - ) - return 15 - get.value(card); - return 0; - }, - onuse: function (links, player) { - player.addTempSkill("jsrgxianzhu_after"); - }, - mod: { - cardUsable: function (card) { - if (card.storage && card.storage.jsrgxianzhu) return Infinity; - }, - }, - subSkill: { - after: { - trigger: { - global: "damageSource", - }, - filter: function (event, player) { - var targets = event.getParent(2).targets; - if (!targets || targets.length != 1) return false; - if (!event.card || !event.card.storage || !event.card.storage.jsrgxianzhu) return false; - var target = event.player, - card = event.cards[0]; - if (!target.isIn()) return false; - if (get.type(card) != "trick") return false; - if (!player.canUse(card, target, false)) return false; - return true; - }, - forced: true, - charlotte: true, - group: "jsrgxianzhu_inf", - content: function () { - var card = { - name: trigger.cards[0].name, - isCard: true, - }; - player.useCard(card, trigger.player, false); - game.delayx(); - }, - }, - inf: { - trigger: { player: "useCard1" }, - forced: true, - popup: false, - firstDo: true, - filter: function (event, player) { - if (event.card.storage && event.card.storage.jsrgxianzhu && event.addCount !== false) return true; - return false; - }, - content: function () { - trigger.addCount = false; - var stat = player.getStat().card, - name = trigger.card.name; - if (typeof stat[name] == "number") stat[name]--; - }, - }, - }, - }, - //邹氏 - jsrgguyin: { - audio: 2, - trigger: { - player: "phaseZhunbeiBegin", - }, - check: function (event, player) { - return player.isTurnedOver() || game.countPlayer2(current => current.hasSex("male")) >= 2; - }, - content: function () { - "step 0"; - player.turnOver(); - "step 1"; - var targets = game.filterPlayer(current => current != player && current.hasSex("male")); - event.targets = targets; - player.line(targets); - game.delayx(); - "step 2"; - var target = targets.shift(); - event.target = target; - target - .chooseBool("是否响应" + get.translation(player) + "的【孤吟】?", "你可以翻面。") - .set("ai", () => { - return _status.event.bool; - }) - .set( - "bool", - (function () { - return target.isTurnedOver() || (get.attitude(target, player) > 0 && (game.countPlayer2(current => current.hasSex("male")) >= 3 || (target.getHp() <= 1 && player.hasSkill("jsrgzhangdeng")))); - })() - ); - "step 3"; - if (result.bool) { - target.turnOver(); - } - if (targets.length) event.goto(2); - "step 4"; - var targets = game.filterPlayer(current => { - return current == player || current.isTurnedOver(); - }); - event.targets = targets; - event.num = 0; - event.index = 0; - "step 5"; - var target = targets[event.index]; - if (target.isIn()) { - target.draw(); - event.num++; - } - event.index++; - if (event.index >= targets.length) event.index = 0; - "step 6"; - if (event.num >= game.countPlayer2(current => current.hasSex("male"))) event.finish(); - else event.goto(5); - }, - }, - jsrgzhangdeng: { - audio: 2, - trigger: { - global: "logSkill", - }, - filter: function (event, player) { - return ( - event.player - .getHistory("useSkill", evt => { - return evt.skill == "jsrgzhangdeng_jiu"; - }) - .map(evt => evt.event) - .indexOf(event.log_event) == 1 - ); - }, - global: "jsrgzhangdeng_jiu", - forced: true, - locked: false, - content: function () { - player.turnOver(false); - }, - subSkill: { - jiu: { - audio: "jsrgzhangdeng", - enable: "chooseToUse", - filter: function (event, player) { - return ( - player.isTurnedOver() && - game.hasPlayer(current => { - return current.hasSkill("jsrgzhangdeng") && current.isTurnedOver(); - }) - ); - }, - viewAs: { name: "jiu", isCard: true }, - viewAsFilter: function (player) { - return ( - player.isTurnedOver() && - game.hasPlayer(current => { - return current.hasSkill("jsrgzhangdeng") && current.isTurnedOver(); - }) - ); - }, - filterCard: () => false, - selectCard: -1, - precontent: function () { - player.logSkill("jsrgzhangdeng_jiu"); - var targets = game.filterPlayer(current => { - return current.hasSkill("jsrgzhangdeng") && current.isTurnedOver(); - }); - player.line(targets[0]); - delete event.result.skill; - }, - }, - }, - }, - //关羽 - jsrgguanjue: { - audio: 2, - trigger: { - player: ["useCard", "respond"], - }, - filter: function (event, player) { - return lib.suit.includes(get.suit(event.card)); - }, - forced: true, - content: function () { - "step 0"; - var targets = game.filterPlayer(current => current != player); - var suit = get.suit(trigger.card); - for (var target of targets) { - target.addTempSkill("jsrgguanjue_ban"); - target.markAuto("jsrgguanjue_ban", [suit]); - } - }, - subSkill: { - ban: { - onremove: true, - charlotte: true, - mod: { - cardEnabled: function (card, player) { - if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) return false; - }, - cardRespondable: function (card, player) { - if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) return false; - }, - cardSavable: function (card, player) { - if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) return false; - }, - }, - mark: true, - marktext: "绝", - intro: { - content: "本回合内不能使用或打出$的牌", - }, - }, - }, - }, - jsrgnianen: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - filter: function (event, player) { - if (!player.countCards("hes")) return false; - if (player.hasSkill("jsrgnianen_blocker")) return false; - for (var name of lib.inpile) { - if (get.type2(name) != "basic") continue; - var card = { name: name }; - if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) return true; - } - } - } - return false; - }, - derivation: "mashu", - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var name of lib.inpile) { - 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) == "basic" && event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) list.push(["基本", "", name]); - } - var dialog = ui.create.dialog("念恩", [list, "vcard"]); - dialog.direct = true; - return dialog; - }, - filter: function (button, player) { - return _status.event.getParent().filterCard(get.autoViewAs({ name: button.link[2], nature: button.link[3] }, "unsure"), 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: "jsrgnianen", - filterCard: true, - popname: true, - check: function (card) { - return 8 - get.value(card); - }, - position: "hes", - viewAs: { name: links[0][2], nature: links[0][3] }, - precontent: function () { - player.logSkill("jsrgnianen"); - delete event.result.skill; - var card = event.result.card; - if (get.color(card, player) != "red" || get.name(card) != "sha" || get.natureList(card).length) { - player.addTempSkill("jsrgnianen_blocker"); - player.addAdditionalSkill("jsrgnianen_blocker", "mashu"); - } - }, - }; - }, - 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.type2(name); - return type == "basic" && player.countCards("hes") > 0 && !player.hasSkill("jsrgnianen_blocker"); - }, - ai: { - fireAttack: true, - respondSha: true, - respondShan: true, - skillTagFilter: function (player) { - if (!player.countCards("hes") || player.hasSkill("jsrgnianen_blocker")) return false; - }, - order: 1, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - blocker: { - charlotte: true, - mark: true, - marktext: "恩", - intro: { content: "视为拥有〖马术〗" }, - }, - }, - }, - //生鱼片 - jsrglunshi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return game.hasPlayer(current => { - return current.inRangeOf(target); - }); - }, - content: function () { - "step 0"; - var num = game.countPlayer(current => { - return current.inRangeOf(target); - }); - var len = target.countCards("h"); - num = Math.max(0, Math.min(len + num, 5) - len); - if (num > 0) target.draw(num); - "step 1"; - var num = game.countPlayer(current => { - return current.inRange(target); - }); - if (num > 0) target.chooseToDiscard(num, "he", true, get.translation(player) + "对你发动了【论势】", "请弃置" + get.cnNumber(num) + "张牌"); - }, - ai: { - order: 6, - result: { - target: function (player, target) { - var num1 = game.countPlayer(current => { - return current.inRangeOf(target); - }), - num2 = game.countPlayer(current => { - return current.inRange(target); - }); - var len = target.countCards("h"); - num1 = Math.max(0, Math.min(len + num1, 5) - len); - return (num1 - num2 + 1) / 2; - }, - }, - }, - }, - jsrgguitu: { - audio: 2, - trigger: { - player: "phaseZhunbeiBegin", - }, - direct: true, - filter: function (event, player) { - return ( - game.countPlayer(current => { - return current.getEquips(1).length; - }) >= 2 - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt2("jsrgguitu"), - (card, player, target) => { - return target.getEquips(1).length; - }, - [1, 2] - ) - .set("filterOk", () => { - var num = 0; - for (var target of ui.selected.targets) { - num += target.getEquips(1).length; - } - return num >= 2; - }) - .set("ai", target => { - var sign = -1; - var val = 0; - if (ui.selected.targets.length) { - sign = 1; - var targetx = ui.selected.targets[0]; - var cards = targetx.getEquips(1); - var list = cards.map(card => { - return [card, get.value(card, targetx)]; - }); - list.sort((a, b) => { - return b[1] - a[1]; - }); - val = get.attitude(_status.event.player, targetx) * list[0][1]; - } - var cards = target.getEquips(1); - var list = cards.map(card => { - return [card, get.value(card, target)]; - }); - list.sort((a, b) => { - return b[1] - a[1]; - }); - return get.attitude(_status.event.player, target) * list[0][1] * sign - val; - }); - "step 1"; - if (result.bool) { - var targets = result.targets.slice(); - targets.sortBySeat(); - event.targets = targets; - player.logSkill("jsrgguitu", targets); - event.rangeList = targets.map(target => { - return target.getAttackRange(); - }); - var weapons = []; - for (var target of targets) { - weapons.addArray(target.getEquips(1)); - } - if (weapons.length > 2) { - var list = ["诡图:选择要交换的武器牌"]; - for (var target of targets) { - list.addArray(['
    ' + get.translation(target) + "的武器牌
    ", target.getEquips(1)]); - } - player - .chooseButton(list, true, 2) - .set("filterButton", button => { - var count = _status.event.count; - if (count == 1) return true; - for (var i = 0; i < ui.selected.buttons.length; i++) { - if (get.owner(button.link) == get.owner(ui.selected.buttons[i].link)) return false; - } - return true; - }) - .set("count", targets.length) - .set("ai", button => { - var player = _status.event.player; - var card = button.link; - var owner = get.owner(card); - var att = get.attitude(player, owner); - var val = -get.value(card) * att; - return val; - }); - } else event._result = { bool: true, links: weapons }; - } else event.finish(); - "step 2"; - if (result.bool) { - var links = result.links; - var list = []; - for (var target of targets) { - var weapons = target.getEquips(1); - weapons = weapons.filter(i => links.includes(i)); - if (weapons.length) { - list.push([target, weapons]); - } - } - if (list.length == 2) { - event.players = list.map(i => i[0]); - event.cards = list.map(i => i[1]); - } else { - event.players = [list[0][0], list[0][0]]; - event.cards = list[0][1]; - } - game.loseAsync({ - player: event.players[0], - target: event.players[1], - cards1: event.cards[0], - cards2: event.cards[1], - }).setContent("swapHandcardsx"); - } else event.finish(); - "step 3"; - for (var i = 0; i < event.cards[1].length; i++) { - if (get.position(event.cards[1][i], true) == "o") event.players[0].equip(event.cards[1][i]); - } - for (var i = 0; i < event.cards[0].length; i++) { - if (get.position(event.cards[0][i], true) == "o") event.players[1].equip(event.cards[0][i]); - } - "step 4"; - var rangeList = targets.map(target => { - return target.getAttackRange(); - }); - for (var i = 0; i < targets.length; i++) { - if (rangeList[i] < event.rangeList[i]) { - targets[i].recover(); - } - } - }, - }, - //甄宓 - jsrgjixiang: { - audio: 2, - trigger: { - global: ["chooseToUseBegin", "chooseToRespondBegin"], - }, - filter: function (event, player) { - if (player != _status.currentPhase) return false; - if (player == event.player) return false; - if (!player.countCards("he")) return false; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - if (player.getStorage("jsrgjixiang_used").includes(name)) continue; - var card = { name: name, isCard: true }; - if (event.filterCard(card, event.player, event)) return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(card, event.player, event)) return true; - } - } - } - return false; - }, - direct: true, - global: "jsrgjixiang_save", - content: function () { - "step 0"; - var list = []; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - var card = { name: name }; - if (trigger.filterCard(card, trigger.player, trigger)) list.push(name); - } - var listx = []; - for (var name of list) { - if (player.getStorage("jsrgjixiang_used").includes(name)) continue; - listx.push([get.type2(name), "", name]); - if (name == "sha") { - for (var nature of lib.inpile_nature) { - if (trigger.filterCard({ name: name, nature: nature }, player, trigger)) { - listx.push([get.type2(name), "", name, nature]); - } - } - } - } - var evt = trigger.getParent(); - var names = ""; - for (var i = 0; i < list.length; i++) { - names += "【" + get.translation(list[i]) + "】"; - names += i < list.length - 2 ? "、" : "或"; - } - names = names.slice(0, names.length - 1); - var reason = trigger.name == "chooseToUse" ? "使用" : "打出"; - var used = player.getStorage("jsrgjixiang_used").filter(name => list.includes(name)); - var str = get.translation(trigger.player) + (evt.card ? "因" + get.translation(evt.card) : "") + "需要" + reason + "一张" + names + ",是否弃置一张牌视为其" + reason + "之" + (used.length ? "(你不能以此法令其" + reason + get.translation(used) + ")" : "") + "?若如此做,你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。"; - event.str = str; - if (!listx.length) event.finish(); - else if (listx.length == 1) event._result = { bool: true, links: listx }; - else { - event.asked = true; - player.chooseButton(["###" + get.prompt("jsrgjixiang", trigger.player) + '###
    ' + str + "
    ", [listx, "vcard"]]).set("ai", () => Math.random() + 1); - } - event.list = list; - "step 1"; - if (result.bool) { - var name = result.links[0][2], - nature = result.links[0][3]; - var card = { name: name, nature: nature, isCard: true }; - event.card = card; - var evt = trigger.getParent(); - var reason = trigger.name == "chooseToUse" ? "使用" : "打出"; - var prompt = event.asked ? "济乡:是否弃置一张牌" + (trigger.filterTarget ? "并选择目标角色" : "") + "?" : get.prompt("jsrgjixiang", trigger.player); - var str = event.asked ? "若如此做,视为" + get.translation(trigger.player) + reason + get.translation(card) + ",然后你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。" : event.str; - var next = player.chooseCardTarget({ - prompt: prompt, - prompt2: str, - filterCard: lib.filter.cardDiscardable, - position: "he", - goon: get.attitude(player, trigger.player) > 1 && (evt.card ? get.effect(trigger.player, evt.card, evt.player, player) < 0 : get.effect(trigger.player, { name: event.list[0] }, trigger.player, player) > 0), - ai1: function (card) { - if (_status.event.goon) return 6 - get.value(card); - return 0; - }, - _get_card: card, - }); - var keys = ["filterTarget", "selectTarget", "ai2"]; - for (var key of keys) delete next[key]; - for (var i in trigger) { - if (!(i in next)) next[i] = trigger[i]; - } - next.filterTargetx = trigger.filterTarget || (() => false); - next.filterTarget = function (card, player, target) { - var filter = this.filterTargetx; - if (typeof filter != "function") filter = () => filter; - card = _status.event._get_card; - player = _status.event.getTrigger().player; - return this.filterTargetx.apply(this, arguments); - }; - if (typeof next.selectTarget != "number" && typeof next.selectTarget != "function" && get.itemtype(next.selectTarget) != "select") next.selectTarget = -1; - } else event.finish(); - "step 2"; - if (result.bool) { - var cardx = result.cards[0]; - var targets = result.targets || []; - event.targets = targets; - player.logSkill("jsrgjixiang", trigger.player); - player.addTempSkill("jsrgjixiang_used"); - player.markAuto("jsrgjixiang_used", [card.name]); - player.discard(cardx); - trigger.untrigger(); - trigger.set("responded", true); - var result = { - bool: true, - card: card, - }; - if (targets.length) result.targets = targets; - trigger.result = result; - player.draw(); - var phaseName; - for (var name of lib.phaseName) { - var evt = trigger.getParent(name); - if (!evt || evt.name != name) continue; - phaseName = name; - break; - } - if (phaseName) { - player.addTempSkill("jsrgjixiang_add", phaseName + "After"); - player.addMark("jsrgjixiang_add", 1, false); - } - } - }, - subSkill: { - used: { - charlotte: true, - onremove: true, - mark: true, - marktext: "乡", - intro: { - content: "已触发过牌名:$", - }, - }, - add: { - charlotte: true, - onremove: true, - mark: true, - intro: { - markcount: (storage, player) => 2 + (storage || 0), - content: (storage, player) => "〖称贤〗剩余可发动次数为" + (2 + (storage || 0)), - }, - }, - save: { - charlotte: true, - ai: { - save: true, - skillTagFilter: function (player, arg, target) { - return _status.currentPhase && _status.currentPhase != player && _status.currentPhase.hasSkill("jsrgjixiang") && _status.currentPhase.countCards("he"); - }, - }, - }, - }, - }, - jsrgchengxian: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (!player.countCards("hs")) return false; - if (2 + player.countMark("jsrgjixiang_add") <= 0) return false; - for (var name of lib.inpile) { - if (get.type(name) != "trick") continue; - if (player.getStorage("jsrgchengxian_used").includes(name)) continue; - if (event.filterCard({ name: name }, player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var name of lib.inpile) { - if (player.getStorage("jsrgchengxian_used").includes(name)) continue; - var info = get.info({ name: name }); - if (!info || info.type != "trick") continue; - if (info.notarget) continue; - if (!info.selectTarget) continue; - if (get.type(name) == "trick" && event.filterCard({ name: name }, player, event)) list.push(["锦囊", "", name]); - } - var dialog = ui.create.dialog("称贤", [list, "vcard"]); - return dialog; - }, - 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 { - audio: "jsrgchengxian", - filterCard: function (card, player) { - var num = game.countPlayer(current => { - return player.canUse(card, current); - }); - if (!num) return false; - var cardx = get.copy(lib.skill.jsrgchengxian_backup.viewAs); - cardx.cards = [card]; - var num2 = game.countPlayer(current => { - return player.canUse(cardx, current); - }); - return num == num2; - }, - popname: true, - check: function (card) { - return 8 - get.value(card); - }, - position: "hs", - viewAs: { name: links[0][2] }, - precontent: function () { - player.logSkill("jsrgchengxian"); - player.addTempSkill("jsrgjixiang_add"); - if (typeof player.storage.jsrgjixiang_add != "number") player.storage.jsrgjixiang_add = 0; - player.storage.jsrgjixiang_add--; - player.addTempSkill("jsrgchengxian_used"); - player.markAuto("jsrgchengxian_used", [event.result.card.name]); - delete event.result.skill; - }, - }; - }, - prompt: function (links, player) { - return "将一张合法目标数与" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "相同的手牌当此牌使用"; - }, - }, - //理解错了,下面这个不用了 - getNumber: function (card, player) { - var rangex = null; - var info = get.info(card); - if (!info) return null; - if (info.notarget) return null; - if (info.selectTarget != undefined) { - var select = get.select(info.selectTarget); - if (select[0] < 0) { - if (!info.toself) { - var count = game.countPlayer(current => { - return lib.filter.targetEnabled(card, player, current); - }); - } else count = 1; - rangex = [count, count]; - } else rangex = select; - } - return rangex; - }, - ai: { - order: 1, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - used: { - charlotte: true, - onremove: true, - mark: true, - intro: { - content: "已使用过$", - }, - }, - }, - }, - //张辽 - jsrgzhengbing: { - audio: 2, - enable: "phaseUse", - usable: 3, - filter: function (event, player) { - return player.group == "qun"; - }, - filterCard: lib.filter.cardRecastable, - check: function (card) { - var player = _status.event.player, - val = 5 + ["shan", "tao"].includes(get.name(card)) * 1.5; - if (player.needsToDiscard() > 2 && get.name(card) == "sha" && player.countCards("hs", "sha") > 1) val += 0.5; - return val - get.value(card); - }, - position: "he", - groupSkill: true, - lose: false, - discard: false, - delay: false, - content: function () { - "step 0"; - player.recast(cards); - switch (get.name(cards[0])) { - case "sha": - player.addTempSkill("jsrgzhengbing_sha"); - player.addMark("jsrgzhengbing_sha", 2, false); - break; - case "shan": - player.draw(); - break; - case "tao": - player.changeGroup("wei"); - } - }, - ai: { - order: 7, - result: { player: 1 }, - }, - subSkill: { - sha: { - charlotte: true, - onremove: true, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("jsrgzhengbing_sha"); - }, - }, - intro: { - content: "手牌上限+#", - }, - }, - }, - }, - jsrgtuwei: { - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - filter: function (event, player) { - return ( - player.group == "wei" && - game.hasPlayer(current => { - return player.inRange(current) && current.countGainableCards(player, "he") > 0; - }) - ); - }, - groupSkill: true, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("jsrgtuwei"), - "获得攻击范围内任意名角色的各一张牌。然后回合结束时这些角色中未受过伤害的角色依次获得你的一张牌。", - (card, player, target) => { - return player.inRange(target) && target.countGainableCards(player, "he") > 0; - }, - [1, Infinity] - ) - .set("ai", target => { - var player = _status.event.player; - return get.effect(target, { name: "shunshou_copy2" }, player, player); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.slice(); - targets.sortBySeat(); - player.logSkill("jsrgtuwei", targets); - player.gainMultiple(result.targets, "he"); - player.addTempSkill("jsrgtuwei_backfire"); - player.markAuto("jsrgtuwei_backfire", targets); - } - }, - subSkill: { - backfire: { - audio: "jsrgtuwei", - trigger: { - player: "phaseEnd", - }, - charlotte: true, - onremove: true, - forced: true, - filter: function (event, player) { - return player.getStorage("jsrgtuwei_backfire").some(target => { - return !target.getHistory("damage").length && target.isIn(); - }); - }, - content: function () { - "step 0"; - var targets = player.getStorage("jsrgtuwei_backfire").filter(target => { - return !target.getHistory("damage").length && target.isIn(); - }); - event.targets = targets.sortBySeat(); - "step 1"; - var target = targets.shift(); - if (target.isIn() && player.countGainableCards(target, "he")) { - target.line(player); - target.gainPlayerCard(player, true, "he"); - } - if (player.countCards("he") && targets.length) event.redo(); - }, - ai: { - effect: { - player: function (card, player, target) { - if (player != target && get.tag(card, "damage") && target && player.getStorage("jsrgtuwei_backfire").includes(target) && !target.getHistory("damage").length) return [1, 1, 1, 0]; - }, - }, - }, - }, - }, - }, - //许贡 - jsrgbiaozhao: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return game.countPlayer(current => current != player) >= 2; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("jsrgbiaozhao"), lib.filter.notMe, 2) - .set("ai", target => { - var player = _status.event.player; - var att = get.attitude(player, target); - if (!ui.selected.targets.length) return att * (Math.sqrt(target.countCards("hs")) + 0.1); - return -att / Math.sqrt(target.countCards("hs") + 0.1); - }) - .set("targetprompt", ["用牌无限制", "打你变疼"]); - "step 1"; - if (result.bool) { - var targets = result.targets; - player.logSkill("jsrgbiaozhao", targets); - player.addTempSkill("jsrgbiaozhao_syujin", { player: ["phaseBegin", "die"] }); - if (!player.storage.jsrgbiaozhao_syujin) player.storage.jsrgbiaozhao_syujin = []; - player.storage.jsrgbiaozhao_syujin.push(targets); - targets[0].addSkill("jsrgbiaozhao_A"); - targets[0].markAuto("jsrgbiaozhao_A", [targets[1]]); - targets[1].addSkill("jsrgbiaozhao_B"); - targets[1].addMark("jsrgbiaozhao_B" + player.playerid, 1, false); - targets[1].markAuto("jsrgbiaozhao_B", [player]); - } - }, - subSkill: { - syujin: { - charlotte: true, - onremove: function (player, skill) { - var list = player.storage.jsrgbiaozhao_syujin; - for (var targets of list) { - targets[0].unmarkAuto("jsrgbiaozhao_A", [targets[1]]); - targets[1].unmarkAuto("jsrgbiaozhao_B", [player]); - delete targets[1].storage["jsrgbiaozhao_B" + player.playerid]; - if (!targets[0].getStorage("jsrgbiaozhao_A")) targets[0].removeSkill("jsrgbiaozhao_A"); - if (!targets[1].getStorage("jsrgbiaozhao_B")) targets[1].removeSkill("jsrgbiaozhao_B"); - } - delete player.storage.jsrgbiaozhao_syujin; - }, - }, - A: { - charlotte: true, - onremove: true, - mark: true, - marktext: "表", - intro: { - content: "对$使用牌无次数和距离限制", - }, - mod: { - targetInRange: function (card, player, target) { - if (player.getStorage("jsrgbiaozhao_A").includes(target)) return true; - }, - cardUsableTarget: function (card, player, target) { - if (player.getStorage("jsrgbiaozhao_A").includes(target)) return true; - }, - }, - }, - B: { - trigger: { - source: "damageBegin1", - }, - charlotte: true, - forced: true, - onremove: function (player, skill) { - for (var i in player.storage) { - if (i.indexOf("jsrgbiaozhao_B") == 0) delete player.storage[i]; - } - }, - filter: function (event, player) { - return event.card && player.getStorage("jsrgbiaozhao_B").includes(event.player); - }, - content: function () { - trigger.num += player.countMark("jsrgbiaozhao_B" + trigger.player.playerid) || 1; - }, - mark: true, - marktext: "召", - intro: { - content: function (storage, player) { - var str = ""; - for (var target of storage) { - str += "对" + get.translation(target) + "使用牌造成的伤害+" + player.countMark("jsrgbiaozhao_B" + target.playerid); - } - return str; - }, - }, - }, - }, - }, - jsrgyechou: { - audio: 2, - trigger: { player: "die" }, - forceDie: true, - direct: true, - skillAnimation: true, - animationColor: "wood", - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("jsrgyechou"), lib.filter.notMe).set("ai", target => { - var player = _status.event.player; - return -get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("jsrgyechou", target); - target.addSkill("jsrgyechou_effect"); - target.addMark("jsrgyechou_effect", 1, false); - } - }, - subSkill: { - effect: { - trigger: { - player: "damageBegin3", - }, - filter: function (event, player) { - return event.num >= player.getHp(); - }, - forced: true, - charlotte: true, - onremove: true, - content: function () { - trigger.num *= 2 * player.countMark("jsrgyechou_effect"); - }, - mark: true, - marktext: "仇", - intro: { - content: "当你受到伤害值不小于体力值的伤害时,此伤害翻&倍", - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (target.hp == 1) return 2; - } - }, - }, - }, - }, - }, - }, - //淳于琼 - jsrgcangchu: { - audio: "recangchu", - trigger: { - global: "phaseJieshuBegin", - }, - filter: function (event, player) { - if (player.hasSkill("jsrgshishou_blocker")) return false; - return player.getHistory("gain").length; - }, - direct: true, - content: function () { - "step 0"; - var num = 0; - player.getHistory("gain", evt => { - num += evt.cards.length; - }); - event.num = num; - player.chooseTarget(get.prompt("jsrgcangchu"), "令至多" + get.cnNumber(num) + "名角色各摸" + get.cnNumber(num > game.countPlayer() ? 2 : 1) + "张牌", [1, num]).set("ai", target => { - var player = _status.event.player; - return get.attitude(player, target) / Math.sqrt(target.countCards("hs") + 1); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.slice(); - targets.sortBySeat(); - player.logSkill("jsrgcangchu", targets); - game.asyncDraw(targets, num > game.countPlayer() ? 2 : 1); - game.delayex(); - } - }, - }, - jsrgshishou: { - audio: "reshishou", - trigger: { - player: "useCard", - }, - forced: true, - filter: function (event, player) { - return event.card.name == "jiu"; - }, - group: "jsrgshishou_burn", - content: function () { - "step 0"; - player.draw(3); - player.addTempSkill("jsrgshishou_nouse"); - }, - mod: { - aiOrder: function (player, card, num) { - if (card.name == "jiu") return 0.01; - }, - }, - ai: { - halfneg: true, - effect: { - player_use: function (card, player, target) { - if (card.name == "jiu") return [1, 1]; - }, - }, - }, - subSkill: { - nouse: { - charlotte: true, - mod: { - cardEnabled: function (card, player) { - return false; - }, - cardUsable: function (card, player) { - return false; - }, - cardSavable: function (card, player) { - return false; - }, - }, - mark: true, - marktext: "失", - intro: { - content: "喝醉了,不能再使用牌", - }, - }, - burn: { - audio: "reshishou", - trigger: { - player: "damageEnd", - }, - forced: true, - filter: function (event, player) { - return event.hasNature("fire"); - }, - content: function () { - player.addTempSkill("jsrgshishou_blocker", { player: "phaseEnd" }); - }, - }, - blocker: { - charlotte: true, - mark: true, - marktext: "守", - intro: { - content: "〖仓储〗失效直到下回合结束", - }, - }, - }, - }, - //江山如故·起 - sbyingmen: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - if (!_status.characterlist) lib.skill.pingjian.initList(); - var characters = _status.characterlist.randomRemove(4); - lib.skill.sbyingmen.addVisitors(characters, player); - game.delayx(); - }, - group: "sbyingmen_reload", - subSkill: { - reload: { - trigger: { player: "phaseBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - return player.getStorage("sbyingmen").length < 4; - }, - content: function () { - if (!_status.characterlist) lib.skill.pingjian.initList(); - var characters = _status.characterlist.randomRemove(4 - player.getStorage("sbyingmen").length); - lib.skill.sbyingmen.addVisitors(characters, player); - game.delayx(); - }, - }, - }, - getSkills: function (characters, player) { - var skills = []; - for (var name of characters) { - if (Array.isArray(lib.character[name].skills)) { - for (var skill of lib.character[name].skills) { - var list = get.skillCategoriesOf(skill, player); - list.remove("锁定技"); - if (list.length > 0) continue; - var info = get.info(skill); - if (info && (!info.unique || info.gainable)) { - // lib.skill.rehuashen.createAudio(name,skill,'jsrg_xushao'); - skills.add(skill); - } - } - } - } - return skills; - }, - addVisitors: function (characters, player) { - player.addSkillBlocker("sbyingmen"); - game.log(player, "将", "#y" + get.translation(characters), "加入了", "#g“访客”"); - game.broadcastAll( - function (player, characters) { - player.tempname.addArray(characters); - player.$draw( - characters.map(function (name) { - var cardname = "huashen_card_" + name; - lib.card[cardname] = { - fullimage: true, - image: "character:" + name, - }; - lib.translate[cardname] = get.rawName2(name); - return game.createCard(cardname, " ", " "); - }), - "nobroadcast" - ); - }, - player, - characters - ); - player.markAuto("sbyingmen", characters); - var storage = player.getStorage("sbyingmen"); - var skills = lib.skill.sbyingmen.getSkills(storage, player); - player.addInvisibleSkill(skills); - }, - removeVisitors: function (characters, player) { - var skills = lib.skill.sbyingmen.getSkills(characters, player); - var characters2 = player.getStorage("sbyingmen").slice(0); - characters2.removeArray(characters); - skills.removeArray(lib.skill.sbyingmen.getSkills(characters2, player)); - game.broadcastAll((player, characters) => player.tempname.removeArray(characters), player, characters); - player.unmarkAuto("sbyingmen", characters); - _status.characterlist.addArray(characters); - player.removeInvisibleSkill(skills); - }, - onremove: function (player, skill) { - lib.skill.sbyingmen.removeVisitors(player.getSkills("sbyingmen"), player); - player.removeSkillBlocker("sbyingmen"); - }, - skillBlocker: function (skill, player) { - if (!player.invisibleSkills.includes(skill) || skill == "sbpingjian" || skill == "sbpingjian") return false; - return !player.hasSkill("sbpingjian"); - }, - marktext: "客", - intro: { - name: "访客", - mark: function (dialog, storage, player) { - if (!storage || !storage.length) return "当前没有“访客”"; - dialog.addSmall([storage, "character"]); - var skills = lib.skill.sbyingmen.getSkills(storage, player); - if (skills.length) dialog.addText("
  • 当前可用技能:" + get.translation(skills), false); - }, - }, - }, - sbpingjian: { - trigger: { player: ["useSkill", "logSkillBegin"] }, - forced: true, - locked: false, - filter: function (event, player) { - var skill = event.sourceSkill || event.skill; - return player.invisibleSkills.includes(skill) && lib.skill.sbyingmen.getSkills(player.getStorage("sbyingmen"), player).includes(skill); - }, - content: function () { - "step 0"; - var visitors = player.getStorage("sbyingmen").slice(0); - var drawers = visitors.filter(function (name) { - return lib.character[name].skills && lib.character[name].skills.includes(trigger.sourceSkill); - }); - event.drawers = drawers; - if (visitors.length == 1) event._result = { bool: true, links: visitors }; - else { - var dialog = ["评鉴:请选择移去一张“访客”"]; - if (drawers.length) dialog.push('
    如果移去' + get.translation(drawers) + ",则你摸一张牌
    "); - dialog.push([visitors, "character"]); - player.chooseButton(dialog, true); - } - "step 1"; - if (result.bool) { - lib.skill.sbyingmen.removeVisitors(result.links, player); - game.log(player, "移去了", "#y" + get.translation(result.links[0])); - if (event.drawers.includes(result.links[0])) { - player.addTempSkill("sbpingjian_draw"); - player.storage.sbpingjian_draw.push(trigger.skill); - } - } - }, - group: "sbpingjian_trigger", - subSkill: { - draw: { - charlotte: true, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - onremove: true, - trigger: { player: ["useSkillAfter", "logSkill"] }, - forced: true, - popup: false, - filter: function (event, player) { - return player.getStorage("sbpingjian_draw").includes(event.skill); - }, - content: function () { - player.storage.sbpingjian_draw.remove(trigger.skill); - player.draw(); - if (!player.storage.sbpingjian_draw.length) player.removeSkill("sbpingjian_draw"); - }, - }, - trigger: { - trigger: { player: "triggerInvisible" }, - forced: true, - forceDie: true, - popup: false, - charlotte: true, - priority: 10, - filter: function (event, player) { - if (event.revealed) return false; - var info = get.info(event.skill); - if (info.charlotte) return false; - var skills = lib.skill.sbyingmen.getSkills(player.getStorage("sbyingmen"), player); - game.expandSkills(skills); - return skills.includes(event.skill); - }, - content: function () { - "step 0"; - if (get.info(trigger.skill).silent) { - event.finish(); - } else { - var info = get.info(trigger.skill); - var event = trigger, - trigger = event._trigger; - var str; - var check = info.check; - if (info.prompt) str = info.prompt; - else { - if (typeof info.logTarget == "string") { - str = get.prompt(event.skill, trigger[info.logTarget], player); - } else if (typeof info.logTarget == "function") { - var logTarget = info.logTarget(trigger, player, trigger.triggername, trigger.indexedData); - if (get.itemtype(logTarget).indexOf("player") == 0) str = get.prompt(event.skill, logTarget, player); - } else { - str = get.prompt(event.skill, null, player); - } - } - if (typeof str == "function") { - str = str(trigger, player, trigger.triggername, trigger.indexedData); - } - var next = player.chooseBool("评鉴:" + str); - next.set("yes", !info.check || info.check(trigger, player, trigger.triggername, trigger.indexedData)); - next.set("hsskill", event.skill); - next.set("forceDie", true); - next.set("ai", function () { - return _status.event.yes; - }); - if (typeof info.prompt2 == "function") { - next.set("prompt2", info.prompt2(trigger, player, trigger.triggername, trigger.indexedData)); - } else if (typeof info.prompt2 == "string") { - next.set("prompt2", info.prompt2); - } else if (info.prompt2 != false) { - if (lib.dynamicTranslate[event.skill]) next.set("prompt2", lib.dynamicTranslate[event.skill](player, event.skill)); - else if (lib.translate[event.skill + "_info"]) next.set("prompt2", lib.translate[event.skill + "_info"]); - } - if (trigger.skillwarn) { - if (next.prompt2) { - next.set("prompt2", '' + trigger.skillwarn + "。" + next.prompt2); - } else { - next.set("prompt2", trigger.skillwarn); - } - } - } - "step 1"; - if (result.bool) { - if (!get.info(trigger.skill).cost) { - trigger.revealed = true; - } - } else { - trigger.untrigger(); - trigger.cancelled = true; - } - }, - }, - }, - ai: { - combo: "sbyingmen", - }, - }, - jsrgchaozheng: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - logTarget: function (event, player) { - return game.filterPlayer(i => i != player); - }, - prompt: "是否发动【朝争】?", - content: function () { - player.chooseToDebate(game.filterPlayer(i => i != player)).set("callback", lib.skill.jsrgchaozheng.callback); - }, - callback: function () { - var result = event.debateResult; - if (result.bool && result.opinion) { - var opinion = result.opinion, - targets = result.red.map(i => i[0]); - targets.sortBySeat(); - targets.forEach(i => i[opinion == "red" ? "recover" : "loseHp"]()); - if (targets.length == 0 || result.black.length == 0) player.draw(result.targets.length); - } - }, - }, - jsrgshenchong: { - audio: 2, - enable: "phaseUse", - limited: true, - filterTarget: lib.filter.notMe, - skillAnimation: true, - animationColor: "soil", - content: function () { - "step 0"; - player.awakenSkill("jsrgshenchong"); - target.addSkillLog("jsrgfeiyang"); - target.addSkillLog("jsrgbahu"); - "step 1"; - player.addSkill("jsrgshenchong_die"); - player.markAuto("jsrgshenchong_die", [target]); - }, - ai: { - order: 1, - result: { target: 1 }, - }, - subSkill: { - die: { - audio: "jsrgshenchong", - trigger: { player: "die" }, - charlotte: true, - forced: true, - forceDie: true, - filter: function (event, player) { - return player.getStorage("jsrgshenchong_die").length; - }, - content: function () { - var targets = player.getStorage("jsrgshenchong_die"); - player.line(targets); - targets.sortBySeat().forEach(current => { - current.clearSkills(true); - current.chooseToDiscard(current.countCards("h"), "h", true); - }); - }, - }, - }, - }, - jsrgfeiyang: { - trigger: { player: "phaseJudgeBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("j") && player.countCards("h") > 1; - }, - content: function () { - "step 0"; - player - .chooseToDiscard("h", 2, get.prompt("jsrgfeiyang"), "弃置两张手牌并弃置判定区里的一张牌") - .set("logSkill", "jsrgfeiyang") - .set("ai", function (card) { - if (_status.event.goon) return 6 - get.value(card); - return 0; - }) - .set( - "goon", - (() => { - if (player.hasSkillTag("rejudge") && player.countCards("j") < 2) return false; - return player.hasCard(function (card) { - if (get.tag(card, "damage") && get.damageEffect(player, player, _status.event.player, get.natureList(card)) >= 0) return false; - return ( - get.effect( - player, - { - name: card.viewAs || card.name, - cards: [card], - }, - player, - player - ) < 0 - ); - }, "j"); - })() - ); - "step 1"; - if (result.bool) { - player.discardPlayerCard(player, "j", true); - } - }, - }, - jsrgbahu: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - content: function () { - player.draw(); - }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - }, - jsrgjulian: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.hasZhuSkill("jsrgjulian") && lib.skill.jsrgjulian.logTarget(null, player).length; - }, - prompt: "是否发动【聚敛】?", - prompt2: "你可以获得其他所有群势力角色的各一张牌", - logTarget: function (event, player) { - return game.filterPlayer(current => { - return current.group == "qun" && current.countGainableCards(player, "he") > 0 && current != player; - }); - }, - content: function () { - game.filterPlayer(current => { - return current.group == "qun" && current != player; - }) - .sortBySeat() - .forEach(i => { - player.gainPlayerCard(i, "he", true); - }); - }, - group: "jsrgjulian_draw", - zhuSkill: true, - subSkill: { - draw: { - audio: "jsrgjulian", - trigger: { global: "gainAfter" }, - filter: function (event, player) { - var source = event.player; - if (source == player || source.group != "qun") return false; - var evt = event.getParent("phaseDraw"); - return (!evt || evt.player != source) && event.getParent().name == "draw" && event.getParent(2).name != "jsrgjulian_draw" && player.hasZhuSkill("jsrgjulian", event.player); - }, - direct: true, - usable: 2, - content: function () { - "step 0"; - var source = trigger.player; - event.source = source; - source.chooseBool("是否响应" + get.translation(player) + "的【聚敛】摸一张牌?"); - "step 1"; - if (result.bool) { - source.logSkill("jsrgjulian_draw", player); - source.draw(); - } else player.storage.counttrigger.jsrgjulian_draw--; - }, - }, - give: { - charlotte: true, - onremove: true, - }, - }, - }, - //何进 - jsrgzhaobing: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - var hs = player.getCards("h"); - if (!hs.length) return false; - for (var i of hs) { - if (!lib.filter.cardDiscardable(i, player, "jsrgzhaobing")) return false; - } - return true; - }, - content: function () { - "step 0"; - var cards = player.getCards("h"); - var num = cards.length; - var prompt2 = "弃置所有手牌,令至多" + get.cnNumber(num) + "名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力"; - player - .chooseTarget(get.prompt("jsrgzhaobing"), prompt2, [1, num], lib.filter.notMe) - .set("ai", target => { - if (!_status.event.goon) return 0; - return 2 - get.attitude(_status.event.player, target); - }) - .set( - "goon", - num / 2 < - game.countPlayer(current => { - return 2 - get.attitude(player, current) > 0; - }) - ); - "step 1"; - if (result.bool) { - player.logSkill("jsrgzhaobing", result.targets); - event.targets = result.targets; - event.targets.sortBySeat(); - player.chooseToDiscard(true, "h", player.countCards("h")); - } else event.finish(); - "step 2"; - var target = targets.shift(); - event.target = target; - target - .chooseCard("诏兵:交给" + get.translation(player) + "一张【杀】,或失去1点体力", card => { - return get.name(card) == "sha"; - }) - .set("ai", card => { - if (_status.event.goon) return 0; - return 6 - get.value(card); - }) - .set("goon", get.effect(target, { name: "losehp" }, target, target) >= 0); - "step 3"; - if (result.bool) target.give(result.cards, player, true); - else target.loseHp(); - if (targets.length) event.goto(2); - }, - ai: { - expose: 0.2, - }, - }, - jsrgzhuhuan: { - audio: "mouzhu", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - var hs = player.getCards("h", "sha"); - if (!hs.length) return false; - for (var i of hs) { - if (!lib.filter.cardDiscardable(i, player, "jsrgzhuhuan")) return false; - } - return true; - }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("jsrgzhuhuan"), lib.filter.notMe).set("ai", target => { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("jsrgzhuhuan", target); - var hs = player.getCards("h", "sha"); - event.num = hs.length; - player.discard(hs); - } else event.finish(); - "step 2"; - target - .chooseToDiscard(get.translation(player) + "对你发动了【诛宦】", "弃置" + get.cnNumber(num) + "张牌并失去1点体力;或点击“取消”令其回复1点体力且其摸" + get.cnNumber(num) + "张牌") - .set("ai", card => { - if (_status.event.goon) return 0; - return 5.5 - get.value(card); - }) - .set("goon", target.hp <= 2 || get.attitude(target, player) >= 0 || player.isHealthy()); - "step 3"; - if (result.bool) { - target.loseHp(); - } else { - player.draw(num); - player.recover(); - } - }, - ai: { - expose: 0.2, - }, - }, - jsrgyanhuo: { - inherit: "spyanhuo", - forced: true, - }, - //孙坚 - jsrgpingtao: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - var att = get.attitude(target, player); - target - .chooseCard(get.translation(player) + "对你发动了【平讨】", "交给其一张牌并令其此回合使用【杀】的次数上限+1;或点击“取消”令其视为对你使用一张【杀】", "he") - .set("ai", card => { - if (_status.event.give) { - if (card.name == "sha" || card.name == "tao" || card.name == "jiu") return 0; - return 8 - get.value(card); - } - if (_status.event.att < 0 && card.name == "sha") return -1; - return 4 - get.value(card); - }) - .set("give", (att >= 0 || (target.hp == 1 && target.countCards("hs", "shan") <= 1)) && get.effect(target, { name: "sha" }, player, target) < 0) - .set("att", att); - "step 1"; - if (result.bool) { - target.give(result.cards, player); - player.addTempSkill("jsrgpingtao_sha"); - player.addMark("jsrgpingtao_sha", 1, false); - } else if (player.canUse("sha", target, false)) { - player.useCard({ name: "sha", isCard: true }, target, false); - } - }, - ai: { - expose: 0.15, - order: 5, - result: { target: -1 }, - }, - subSkill: { - sha: { - charlotte: true, - onremove: true, - marktext: "讨", - intro: { - content: "本回合使用【杀】的次数上限+#", - }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("jsrgpingtao_sha"); - }, - }, - }, - }, - }, - jsrgjuelie: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return player.countCards("he") && event.card.name == "sha"; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt("jsrgjuelie", trigger.target), "当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌", [1, Infinity], "he") - .set("ai", card => { - if (ui.selected.cards.length >= _status.event.max) return 0; - if (_status.event.goon) return 4.5 - get.value(card); - return 0; - }) - .set("max", trigger.target.countDiscardableCards(player, "he")) - .set("goon", get.attitude(player, trigger.target) < 0) - .set("logSkill", ["jsrgjuelie_discard", trigger.target]); - "step 1"; - if (result.bool) { - var num = result.cards.length; - if (trigger.target.countDiscardableCards(player, "he")) player.discardPlayerCard("平讨:弃置" + get.translation(trigger.target) + get.cnNumber(num) + "张牌", num, "he", trigger.target, true); - } - /* - else event.finish(); - 'step 2' - if(player.isMinHandcard()||player.isMinHp()){ - var id=trigger.target.playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].extraDamage!='number'){ - map[id].extraDamage=0; - } - map[id].extraDamage++; - } - */ - }, - shaRelated: true, - ai: { - unequip_ai: true, - skillTagFilter: function (player, tag, arg) { - if (!arg || !arg.name || arg.name != "sha") return false; - if (!arg.target) return false; - var card = arg.target.getEquip(2); - return ( - card && - get.value(card) > 0 && - player.hasCard(cardx => { - return lib.filter.cardDiscardable(cardx, player, "jsrgjuelie_discard") && get.value(cardx) < 5; - }) - ); - }, - }, - group: "jsrgjuelie_pojun", - subSkill: { - pojun: { - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - if (!player.isMinHandcard() && !player.isMinHp()) return false; - return event.getParent().name == "sha"; - }, - forced: true, - locked: false, - logTarget: "player", - content: function () { - trigger.num++; - }, - }, - }, - }, - //皇甫嵩 - jsrgguanhuo: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return ( - event.card.storage && - event.card.storage.jsrgguanhuo && - !game.hasPlayer2(current => { - return current.hasHistory("damage", evt => evt.card == event.card); - }) - ); - }, - forced: true, - locked: false, - group: "jsrgguanhuo_viewas", - content: function () { - "step 0"; - var count = player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length; - if (count == 1) { - player.addTempSkill("jsrgguanhuo_ex", "phaseUseAfter"); - player.addMark("jsrgguanhuo_ex", 1, false); - trigger.targets.forEach(i => i.removeSkill("huogong2")); - } else { - player.removeSkills("jsrgguanhuo"); - } - }, - ai: { - effect: { - player: function (card, player) { - if (_status.event.getParent().skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length == 1) return "zeroplayertarget"; - if (_status.event.type == "phase" && _status.event.skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length > 1 && player.countCards("h") <= 3) return [0, 0]; - }, - }, - }, - subSkill: { - viewas: { - audio: "jsrgguanhuo", - enable: "phaseUse", - viewAs: { - name: "huogong", - isCard: true, - storage: { - jsrgguanhuo: true, - }, - }, - filterCard: () => false, - selectCard: -1, - prompt: "视为使用一张【火攻】", - ai: { - order: function (item, player) { - return get.order({ name: "huogong" }) + 0.01; - }, - }, - }, - ex: { - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - return event.card && event.card.name == "huogong" && event.getParent().type == "card"; - }, - forced: true, - charlotte: true, - onremove: true, - intro: { content: "当你造成渠道为【火攻】的伤害时,此伤害+#" }, - content: function () { - trigger.num += player.countMark("jsrgguanhuo_ex"); - }, - }, - }, - }, - jsrgjuxia: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - usable: 1, - countSkill: function (player) { - return player.getSkills(null, false, false).filter(function (skill) { - var info = get.info(skill); - if (!info || info.charlotte) return false; - if (info.zhuSkill) return player.hasZhuSkill(skill); - return true; - }).length; - }, - filter: function (event, player) { - return event.player != player && lib.skill.jsrgjuxia.countSkill(event.player) > lib.skill.jsrgjuxia.countSkill(player); - }, - direct: true, - content: function () { - "step 0"; - var goon = get.effect(player, trigger.card, trigger.player, trigger.player) < 1; - if (goon && !event.isMine() && !event.isOnline()) game.delayx(); - trigger.player - .chooseBool("是否对" + get.translation(player) + "发动【居下】?", "令" + get.translation(trigger.card) + "对其无效,然后其摸两张牌") - .set("ai", () => { - return _status.event.goon; - }) - .set("goon", goon); - "step 1"; - if (result.bool) { - trigger.player.logSkill("jsrgjuxia", player); - trigger.excluded.add(player); - player.draw(2); - } else player.storage.counttrigger.jsrgjuxia--; - }, - ai: { - effect: { - target: function (card, player, target) { - if (lib.skill.jsrgjuxia.countSkill(target) >= lib.skill.jsrgjuxia.countSkill(player)) return; - if (card && (card.cards || card.isCard) && get.attitude(target, player) > 0 && (!target.storage.counttrigger || !target.storage.counttrigger.jsrgjuxia)) return [0, 0.5, 0, 0.5]; - }, - }, - }, - }, - //许劭 - jsrgyingmen: { - audio: 2, - trigger: { - global: "phaseBefore", - player: ["enterGame", "phaseBegin"], - }, - forced: true, - filter: function (event, player, name) { - if (player.getStorage("jsrgyingmen").length >= 4) return false; - if (name == "phaseBefore") return game.phaseNumber == 0; - return event.name != "phase" || event.player == player; - }, - update: function (player) { - var id = player.playerid; - var characters = player.getStorage("jsrgyingmen"); - var skillName = "jsrgpingjian_" + id; - var skillsx = [], - skillsx2 = []; - var map = {}; - var skillsy = lib.skill[skillName] ? lib.skill[skillName].group : []; - for (var name of characters) { - var skills = lib.character[name][3].slice(); - skills = skills.filter(skill => { - var list = get.skillCategoriesOf(skill, player); - list.removeArray(["锁定技", "Charlotte"]); - if (list.length) return false; - var info = get.info(skill); - return info && (!info.unique || info.gainable); - }); - game.expandSkills(skills); - for (var i = 0; i < skills.length; i++) { - var skill = skills[i]; - var info = get.info(skill); - if (info.silent || info.charlotte) continue; - if (!info.forced && !info.frequent && (!info.mod || (info.charlotte && info.mod))) continue; - var infox = get.copy(info); - var newname = skill + "_" + id; - map[newname] = infox; - if (info.audio) infox.audio = typeof info.audio != "number" ? info.audio : skill; - // if(infox.group) delete infox.group; - if (infox.frequent) delete infox.frequent; - if (infox.forceDie) delete infox.forceDie; - var popup = infox.popup; - if (infox.forced && infox.direct) { - delete infox.direct; - infox.popup = false; - } - if (infox.forced && !infox.prompt2) { - var skillx = skill; - while (true) { - var prompt2 = lib.translate[skillx + "_info"]; - if (prompt2 && prompt2.length) { - infox.prompt2 = prompt2; - break; - } - var ind = skillx.lastIndexOf("_"); - if (ind == -1) break; - skillx = skillx.slice(0, ind); - } - } - if (popup != false && !infox.silent) infox.forced = false; - if (!infox.charlotte && infox.mod) delete infox.mod; - skillsx2.add(skill); - skills[i] = newname; - } - if (skills.length) { - skillsx.addArray(skills); - } - } - var skillsRemoving = skillsy.removeArray(skillsx); - player.removeSkill(skillsRemoving); - game.broadcastAll( - function (name, skillsx, skillsx2, id, map) { - for (var i in map) lib.skill[i] = map[i]; - lib.skill[name] = { - unique: true, - group: skillsx, - }; - lib.translate[name] = "评鉴"; - for (var i of skillsx2) { - lib.translate[i + "_" + id] = lib.translate[i]; - lib.translate[i + "_" + id + "_info"] = lib.translate[i + "_info"]; - } - }, - skillName, - skillsx, - skillsx2, - id, - map - ); - player.addSkill(skillName); - player.addSkill("jsrgpingjian_blocker"); - player.addSkillTrigger(skillName); - }, - bannedList: ["zishu", "weishu", "xinfu_zhanji", "kyouko_rongzhu"], - content: function () { - "step 0"; - if (!_status.characterlist) lib.skill.pingjian.initList(); - var num = player.getStorage("jsrgyingmen").length; - var list = []; - _status.characterlist.randomSort(); - for (var i = 0; i < _status.characterlist.length; i++) { - var name = _status.characterlist[i]; - var skills = lib.character[name][3].slice(); - if ( - skills.some(skill => { - return lib.skill.jsrgyingmen.bannedList.includes(skill); - }) - ) - continue; - list.push(name); - _status.characterlist.remove(name); - if (list.length >= 4 - num) break; - } - if (list.length) { - player.markAuto("jsrgyingmen", list); - if (player.hasSkill("jsrgpingjian", null, false, false)) lib.skill.jsrgyingmen.update(player); - 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 - ); - } - }, - ai: { - combo: "jsrgpingjian", - }, - marktext: "客", - intro: { - name: "访客(盈门/评鉴)", - mark: function (dialog, storage, player) { - dialog.addText("剩余“访客”"); - if (storage) dialog.addSmall([storage, "character"]); - else dialog.addText("无"); - }, - }, - }, - jsrgpingjian: { - audio: 2, - trigger: { player: ["logSkill", "useSkillAfter"] }, - forced: true, - locked: false, - onremove: function (player) { - player.removeSkill("jsrgpingjian_" + player.playerid); - }, - filter: function (event, player) { - var skill = event.skill, - name = event.event ? event.event.name : ""; - var visitors = player.getStorage("jsrgyingmen"); - for (var visitor of visitors) { - var skills = lib.character[visitor][3].slice(); - game.expandSkills(skills); - var info = get.info(skill); - if (info && (info.charlotte || info.silent)) continue; - if ( - skills.some(skillx => { - return skill.indexOf(skillx) == 0 || name.indexOf(skillx + "_" + player.playerid) == 0; - }) - ) - return true; - } - return false; - }, - content: function () { - "step 0"; - var current; - var skill = trigger.skill, - name = trigger.event ? trigger.event.name : ""; - var visitors = player.getStorage("jsrgyingmen"); - for (var visitor of visitors) { - var skills = lib.character[visitor][3].slice(); - game.expandSkills(skills); - var info = get.info(skill); - if (info && info.charlotte) continue; - if ( - skills.some(skillx => { - return skill.indexOf(skillx) == 0 || name.indexOf(skillx + "_" + player.playerid) == 0; - }) - ) { - current = visitor; - break; - } - } - event.current = current; - player - .chooseButton(['###评鉴:移去一名访客###
    若移去的访客为' + get.translation(current) + ",则你摸一张牌
    ", [player.getStorage("jsrgyingmen"), "character"]], true) - .set("ai", button => { - if (button.link == _status.event.toremove) return 1; - return Math.random(); - }) - .set( - "toremove", - (function () { - var list = player.getStorage("jsrgyingmen"); - var rand = Math.random(); - if (rand < 0.33) return list[0]; - if (rand < 0.66) return current; - return list.randomGet(); - })() - ); - "step 1"; - if (result.bool) { - var visitor = result.links[0]; - game.log(player, "从", "#y访客", "中移去了", "#g" + get.translation(visitor)); - player.popup(visitor); - player.unmarkAuto("jsrgyingmen", [visitor]); - _status.characterlist.add(visitor); - if (visitor == event.current) player.draw(); - lib.skill.jsrgyingmen.update(player); - } - }, - subSkill: { - blocker: { - init: function (player, skill) { - player.addSkillBlocker(skill); - }, - onremove: function (player, skill) { - player.removeSkillBlocker(skill); - }, - charlotte: true, - locked: true, - skillBlocker: function (skill, player) { - if (skill != "jsrgpingjian_" + player.playerid) return false; - if (player._jsrgpingjian_blockerChecking) return; - player._jsrgpingjian_blockerChecking = true; - var own = player.hasSkill("jsrgpingjian"); - delete player._jsrgpingjian_blockerChecking; - return !own; - }, - }, - }, - }, - //董白 - jsrgshichong: { - audio: 2, - zhuanhuanji: true, - trigger: { player: "useCardToPlayered" }, - direct: true, - filter: function (event, player) { - return event.target != player && event.targets.length == 1 && event.target.isIn() && event.target.countCards("h"); - }, - mark: true, - marktext: "☯", - intro: { - content: function (storage, player) { - var str = "转换技。当你使用牌指定其他角色为唯一目标后,"; - if (storage) return str + "目标角色可以交给你一张手牌。"; - return str + "你可以获得目标角色一张手牌。"; - }, - }, - content: function () { - "step 0"; - if (!player.storage.jsrgshichong) { - player - .chooseBool(get.prompt("jsrgshichong", trigger.target), "你可以获得该角色的一张手牌") - .set("ai", () => { - return _status.event.bool; - }) - .set("bool", get.attitude(player, trigger.target) <= 0); - } else { - trigger.target - .chooseCard("是否发动" + get.translation(player) + "的【恃宠】?", "你可以选择一张手牌,并交给该角色") - .set("ai", card => { - if (_status.event.goon) return 5 - get.value(card); - return 0 - get.value(card); - }) - .set("goon", get.attitude(trigger.target, player) > 2); - } - "step 1"; - if (result.bool) { - if (!player.storage.jsrgshichong) { - player.logSkill("jsrgshichong", trigger.target); - player.gainPlayerCard(trigger.target, "h", true); - } else { - trigger.target.logSkill("jsrgshichong", player); - trigger.target.give(result.cards, player); - } - player.changeZhuanhuanji("jsrgshichong"); - } - }, - }, - jsrglianzhu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: { color: "black" }, - position: "h", - filterTarget: lib.filter.notMe, - lose: false, - discard: false, - delay: false, - content: function () { - "step 0"; - player.showCards(cards, get.translation(player) + "发动了【连诛】"); - "step 1"; - player.give(cards, target); - "step 2"; - event.targets = game - .filterPlayer(current => { - return current.group == target.group && current != player; - }) - .sortBySeat(); - game.delayx(); - "step 3"; - var target = targets.shift(); - if (player.canUse("guohe", target)) { - player.useCard({ name: "guohe", isCard: true }, target); - } - if (targets.length) event.redo(); - }, - ai: { - order: 4, - result: { - target: function (player, target) { - var targets = game.filterPlayer(current => { - return current.group == target.group && current != player; - }); - var eff = targets.reduce((p, c) => { - return p + get.effect(c, { name: "guohe" }, player, player); - }, 0); - if (ui.selected.cards.length) eff += get.value(ui.selected.cards[0], target); - return eff; - }, - }, - }, - }, - //桥玄 - jsrgjuezhi: { - audio: 2, - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - if (_status.currentPhase != player || player.hasSkill("jsrgjuezhi_used", null, null, false)) return false; - return event.card && event.getParent().type == "card" && lib.skill.jsrgjuezhi.getNum(event.player, player) > 0; - }, - forced: true, - locked: false, - getNum: function (target, player) { - return target.countCards("e", card => { - var subtype = get.subtypes(card); - for (var i of subtype) { - if (player.hasDisabledSlot(i)) return true; - } - return false; - }); - }, - group: "jsrgjuezhi_disable", - content: function () { - player.addTempSkill("jsrgjuezhi_used", ["phaseZhunbeiAfter", "phaseJudgeAfter", "phaseDrawAfter", "phaseUseAfter", "phaseDiscardAfter", "phaseJieshuAfter"]); - trigger.num += lib.skill.jsrgjuezhi.getNum(trigger.player, player); - }, - subSkill: { - disable: { - audio: "jsrgjuezhi", - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - direct: true, - filter: function (event, player) { - var evt = event.getl(player); - return evt && evt.es && evt.es.length > 0; - }, - content: function () { - "step 0"; - event.cards = trigger.getl(player).es; - "step 1"; - var card = cards.shift(), - subtypes = get.subtypes(card).filter(slot => player.hasEnabledSlot(slot)); - event.subtypes = subtypes; - if (subtypes.length > 0) { - player.chooseBool(get.prompt("jsrgjuezhi_disable"), "废除你的" + get.translation(subtypes) + "栏").set("ai", () => 1); - } else event._result = { bool: false }; - "step 2"; - if (result.bool) { - player.logSkill("jsrgjuezhi_disable"); - player.disableEquip(event.subtypes); - } - if (cards.length > 0) event.goto(1); - }, - }, - used: { charlotte: true }, - }, - }, - jsrgjizhao: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("jsrgjizhao")).set("ai", target => { - var player = _status.event.player; - if (player.countCards("j")) return player == target ? 10 : 0.1; - return 6 - get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("jsrgjizhao", target); - target.chooseToUse({ - filterCard: function (card, player, event) { - if (get.itemtype(card) != "card" || (get.position(card) != "h" && get.position(card) != "s")) return false; - return lib.filter.filterCard.apply(this, arguments); - }, - prompt: "急召:使用一张手牌,否则" + get.translation(player) + "可以移动你区域里的一张牌", - addCount: false, - goon: target != player || !player.countCards("j"), - ai1: function (card) { - if (_status.event.goon) return get.order(card); - return 0; - }, - }); - } else { - event.finish(); - return; - } - "step 2"; - if (result.bool) { - event.finish(); - return; - } - var targets = game.filterPlayer(current => { - if (current == target) return false; - var hs = target.getCards("h"); - if (hs.length) return true; - var js = target.getCards("j"); - for (var i = 0; i < js.length; i++) { - if (current.canAddJudge(js[i])) return true; - } - if (current.isMin()) return false; - var es = target.getCards("e"); - for (var i = 0; i < es.length; i++) { - if (current.canEquip(es[i])) return true; - } - return false; - }); - if (targets.length) { - var next = player.chooseTarget(function (card, player, target) { - return _status.event.targets.includes(target); - }); - next.set("from", target); - next.set("targets", targets); - next.set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - var sgnatt = get.sgn(att); - var from = _status.event.from; - var es = from.getCards("e"); - var i; - var att2 = get.sgn(get.attitude(player, from)); - for (i = 0; i < es.length; i++) { - if (sgnatt != 0 && att2 != 0 && sgnatt != att2 && get.sgn(get.value(es[i], from)) == -att2 && get.sgn(get.effect(target, es[i], player, target)) == sgnatt && target.canEquip(es[i])) { - return Math.abs(att); - } - } - if ( - i == es.length && - (!from.countCards("j", function (card) { - return target.canAddJudge(card); - }) || - att2 <= 0) - ) { - if (from.countCards("h") > 0) return att; - return 0; - } - return -att * att2; - }); - next.set("targetprompt", "移动目标"); - next.set("prompt", "急召:是否移动" + get.translation(target) + "的一张牌?"); - } else event.finish(); - "step 3"; - if (result.bool) { - var target2 = result.targets[0]; - event.targets = [target, target2]; - player.line2(event.targets, "green"); - } else { - event.finish(); - } - "step 4"; - game.delay(); - "step 5"; - if (targets.length == 2) { - player - .choosePlayerCard( - "hej", - true, - function (button) { - var player = _status.event.player; - var targets0 = _status.event.targets0; - var targets1 = _status.event.targets1; - if (get.attitude(player, targets0) > 0 && get.attitude(player, targets1) < 0) { - if (get.position(button.link) == "j") return 12; - if (get.value(button.link, targets0) < 0 && get.effect(targets1, button.link, player, targets1) > 0) return 10; - return 0; - } else { - if (get.position(button.link) == "j") return -10; - if (get.position(button.link) == "h") return 10; - return get.value(button.link) * get.effect(targets1, button.link, player, targets1); - } - }, - targets[0] - ) - .set("targets0", targets[0]) - .set("targets1", targets[1]) - .set("filterButton", function (button) { - var targets1 = _status.event.targets1; - if (get.position(button.link) == "h") { - return true; - } else if (get.position(button.link) == "j") { - return targets1.canAddJudge(button.link); - } else { - return targets1.canEquip(button.link); - } - }); - } else { - event.finish(); - } - "step 6"; - if (result.bool && result.links.length) { - var link = result.links[0]; - if (get.position(link) == "h") event.targets[1].gain(link, event.targets[0], "giveAuto"); - else { - event.targets[0].$give(link, event.targets[1], false); - if (get.position(link) == "e") event.targets[1].equip(link); - else if (link.viewAs) event.targets[1].addJudge({ name: link.viewAs }, [link]); - else event.targets[1].addJudge(link); - } - game.log(event.targets[0], "的", get.position(link) == "h" ? "一张手牌" : link, "被移动给了", event.targets[1]); - game.delay(); - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "delay" && current < 0) { - if (target.countCards("j")) return; - return "zerotarget"; - } - }, - }, - }, - }, - //杨彪 - jsrgzhaohan: { - audio: "zhaohan", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - //locked:false, - filter: function (event, player) { - if (game.shuffleNumber == 0) return player.isDamaged(); - return true; - }, - content: function () { - player[game.shuffleNumber > 0 ? "loseHp" : "recover"](); - }, - }, - jsrgrangjie: { - audio: "rangjie", - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return player.canMoveCard(); - }, - check: function (event, player) { - return player.canMoveCard(true); - }, - content: function () { - "step 0"; - event.num = trigger.num; - "step 1"; - event.num--; - if (player.canMoveCard()) player.moveCard(true); - "step 2"; - if (result.bool) { - var card = result.card; - var suit = get.suit(card, false); - var cards = Array.from(ui.discardPile.childNodes); - var gains = []; - var history = game.getGlobalHistory("cardMove", evt => { - if (evt.name == "lose") return evt.position == ui.discardPile; - return evt.name == "cardsDiscard"; - }); - for (var i = history.length - 1; i >= 0; i--) { - var evt = history[i]; - var cards2 = evt.cards.filter(card => { - return cards.includes(card) && get.suit(card, false) == suit; - }); - if (cards2.length) { - gains.addArray(cards2); - cards.removeArray(cards2); - } - if (!cards.length) break; - } - if (gains.length) { - player.chooseButton(["让节:是否获得一张" + get.translation(suit) + "牌?", gains]).set("ai", get.buttonValue); - } else event._result = { bool: false }; - } - "step 3"; - if (result.bool) { - player.gain(result.links, "gain2"); - } - "step 4"; - if (event.num > 0 && player.hasSkill("jsrgrangjie")) { - player - .chooseBool(get.prompt2("jsrgrangjie")) - .set("ai", () => _status.event.bool) - .set("bool", lib.skill.jsrgrangjie.check(trigger, player)); - } else event.finish(); - "step 5"; - if (result.bool) { - player.logSkill("jsrgrangjie"); - event.goto(1); - } - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (target._jsrgrangjie_aiChecking) return; - target._jsrgrangjie_aiChecking = true; - var moveCard = target.canMoveCard(true); - delete target._jsrgrangjie_aiChecking; - if (!moveCard || !target.hasFriend()) return; - var num = 1; - if (get.attitude(player, target) > 0) { - if (player.needsToDiscard()) num = 0.5; - else num = 0.3; - } - if (target.hp >= 4) return [1, num * 2]; - if (target.hp == 3) return [1, num * 1.5]; - if (target.hp == 2) return [1, num * 0.5]; - } - }, - }, - }, - }, - jsrgyizheng: { - audio: "yizheng", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("h") > player.countCards("h") && player.canCompare(current); - }); - }, - filterTarget: function (card, player, current) { - return current.countCards("h") > player.countCards("h") && player.canCompare(current); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - target.skip("phaseDraw"); - target.addTempSkill("yizheng2", { player: "phaseDrawSkipped" }); - event.finish(); - } else { - target - .chooseControl("1", "2", "cancel") - .set("prompt", "是否对" + get.translation(player) + "造成至多2点伤害?") - .set("ai", () => { - return _status.event.choice; - }) - .set("choice", get.damageEffect(player, target, target) > 0 ? (get.attitude(target, player) > 0 ? 0 : 1) : "cancel2"); - } - "step 2"; - if (result.control != "cancel2") { - var num = result.index + 1; - target.line(player); - player.damage(target, num); - } - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (target.skipList.includes("phaseDraw") || target.hasSkill("pingkou")) return 0; - 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 -1; - return 0; - }, - }, - }, - }, - //孔融 - jsrglirang: { - audio: "splirang", - trigger: { global: "phaseDrawBegin" }, - direct: true, - filter: function (event, player) { - return event.player != player && !player.hasSkill("jsrglirang_used") && player.countCards("he") > 1; - }, - content: function () { - "step 0"; - player - .chooseCard(get.prompt("jsrglirang", trigger.player), "你可以选择两张牌,将这些牌交给该角色。若如此做,你获得其本回合弃牌阶段弃置的所有牌。", 2, "he") - .set("ai", card => { - if (!_status.event.give) return 0; - var player = _status.event.player, - target = _status.event.target; - return target.getUseValue(card) - player.getUseValue(card) + 0.5; - }) - .set("give", get.attitude(player, trigger.player) > 0) - .set("target", trigger.player); - "step 1"; - if (result.bool) { - player.logSkill("jsrglirang", trigger.player); - var cards = result.cards; - player.give(cards, trigger.player); - player.addTempSkill("jsrglirang_used", "roundStart"); - player.addTempSkill("jsrglirang_given"); - player.markAuto("jsrglirang_used", [trigger.player]); - } - }, - subSkill: { - used: { - charlotte: true, - onremove: true, - intro: { content: "本轮〖礼让〗目标:$" }, - }, - given: { - audio: "splirang", - trigger: { global: "phaseDiscardEnd" }, - filter: function (event, player) { - return event.player.hasHistory("lose", evt => { - return evt.type == "discard" && evt.getParent("phaseDiscard") == event && evt.cards2.filterInD("d").length > 0; - }); - }, - charlotte: true, - prompt2: function (event, player) { - var cards = []; - event.player.getHistory("lose", evt => { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) cards.addArray(evt.cards2.filterInD("d")); - }); - return "获得" + get.translation(cards); - }, - content: function () { - var cards = []; - trigger.player.getHistory("lose", evt => { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) cards.addArray(evt.cards2.filterInD("d")); - }); - player.gain(cards, "gain2"); - }, - }, - }, - }, - jsrgzhengyi: { - audio: 2, - trigger: { player: "damageBegin4" }, - filter: function (event, player) { - var list = player.getStorage("jsrglirang_used"); - if (!list.length) return false; - return !player.getHistory("damage").length && list[0].isIn(); - }, - direct: true, - content: function () { - "step 0"; - var target = player.getStorage("jsrglirang_used")[0]; - event.target = target; - target - .chooseBool("是否对" + get.translation(player) + "发动【争义】?", "将此" + (trigger.source ? "来源为" + get.translation(trigger.source) : "无来源") + "的" + trigger.num + "点伤害转移给你") - .set("ai", () => { - return _status.event.bool; - }) - .set("bool", get.damageEffect(player, trigger.source, target) > get.damageEffect(target, trigger.source, target)); - "step 1"; - if (result.bool) { - target.logSkill("jsrgzhengyi", player); - trigger.cancel(); - target.damage(trigger.source, trigger.nature, trigger.num).set("card", trigger.card).set("cards", trigger.cards); - } - }, - ai: { - combo: "jsrglirang", - }, - }, - //朱儁 - jsrgfendi: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return event.targets.length == 1 && event.card.name == "sha" && event.targets[0].countCards("h") > 0; - }, - usable: 1, - logTarget: "target", - content: function () { - "step 0"; - var target = trigger.target; - event.target = target; - player - .choosePlayerCard(target, "h", true, [1, Infinity], "分敌:展示" + get.translation(target) + "的任意张手牌") - .set("ai", button => { - if (_status.event.all) return 1; - if (ui.selected.buttons.length) return 0; - return Math.random(); - }) - .set( - "all", - !target.mayHaveShan( - player, - "use", - target.getCards("h", i => { - return i.hasGaintag("sha_notshan"); - }) - ) && Math.random() < 0.75 - ) - .set("forceAuto", true); - "step 1"; - if (result.bool) { - var cards = result.cards; - target.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【分敌】"); - target.addGaintag(cards, "jsrgfendi_tag"); - target.addTempSkill("jsrgfendi_blocker"); - player.addTempSkill("jsrgfendi_gain"); - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.jsrgfendi = cards.slice(); - player.storage.jsrgfendi_gain = target; - } else player.storage.counttrigger.jsrgfendi--; - }, - subSkill: { - blocker: { - trigger: { - player: ["damageBefore", "damageCancelled", "damageZero"], - target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], - global: ["useCardEnd"], - }, - forced: true, - popup: false, - charlotte: true, - content: function () { - player.removeSkill("jsrgfendi_blocker"); - }, - mod: { - cardEnabled: function (card, player) { - if (card.cards) { - for (var i of card.cards) { - if (!i.hasGaintag("jsrgfendi_tag")) return false; - } - } else if (get.itemtype(card) == "card") { - if (!card.hasGaintag("jsrgfendi_tag")) return false; - } - }, - cardRespondable: function (card, player) { - return lib.skill.jsrgfendi.cardEnabled.apply(this, arguments); - }, - cardSavable: function (card, player) { - return lib.skill.jsrgfendi.cardEnabled.apply(this, arguments); - }, - }, - }, - gain: { - trigger: { global: "damageSource" }, - charlotte: true, - forced: true, - direct: true, - onremove: true, - filter: function (event, player) { - if (!event.card || !event.card.storage) return false; - var cards = event.card.storage.jsrgfendi; - var target = player.storage.jsrgfendi_gain; - if (!cards || !target || !target.isIn()) return false; - var cardsx = target.getCards("h"); - cardsx.addArray(Array.from(ui.discardPile)); - return cards.some(i => cardsx.includes(i)); - //target.hasCard(card=>{ - // return card.hasGaintag('jsrgfendi_tag'); - //},'h'); - }, - content: function () { - var target = player.storage.jsrgfendi_gain; - player.logSkill("jsrgfendi_gain", target); - var cardsx = target.getCards("h"); - cardsx.addArray(Array.from(ui.discardPile)); - var cards = trigger.card.storage.jsrgfendi.filter(i => cardsx.includes(i)); - player.gain(cards, "give"); - }, - }, - }, - }, - jsrgjuxiang: { - audio: 2, - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - var evt = event.getParent("phaseDraw"); - if (evt && evt.name == "phaseDraw") return false; - var hs = player.getCards("h"); - var cards = event.getg(player).filter(i => hs.includes(i)); - if (!cards.length) return false; - for (var card of cards) { - if (!lib.filter.cardDiscardable(card, player, "jsrgjuxiang")) return false; - } - return true; - }, - check: function (event, player) { - var target = _status.currentPhase; - if (!target || get.attitude(player, target) <= 0) return false; - var evt = event.getParent("phaseDiscard"), - evt2 = event.getParent("phaseJieshu"); - if ((evt && evt.name == "phaseDiscard") || (evt2 && evt.name == "phaseJieshu")) return false; - if (target.getCardUsable({ name: "sha" }) >= target.countCards("hs", "sha")) return false; - if (!target.hasValueTarget({ name: "sha" })) return false; - var hs = player.getCards("h"); - var cards = event.getg(player).filter(i => hs.includes(i)); - var val = 0; - for (var i of cards) val += get.value(i); - if (val < 10) return true; - return false; - }, - prompt2: function (event, player) { - var hs = player.getCards("h"); - var cards = event.getg(player).filter(i => hs.includes(i)); - var target = _status.currentPhase; - var str = "弃置" + get.translation(cards); - if (target && target.isIn()) { - var list = []; - for (var card of cards) { - list.add(get.suit(card, player)); - } - var num = list.length; - str += ",然后令" + get.translation(target) + "于此回合额定的出牌阶段内使用【杀】的次数上限+" + num; - } - return str; - }, - content: function () { - "step 0"; - var hs = player.getCards("h"); - var cards = trigger.getg(player).filter(i => hs.includes(i)); - var list = []; - for (var card of cards) { - list.add(get.suit(card, player)); - } - event.num = list.length; - player.discard(cards); - "step 1"; - var target = _status.currentPhase; - if (target && target.isIn()) { - target.addTempSkill("jsrgjuxiang_sha"); - target.addMark("jsrgjuxiang_sha", num, false); - var evt = trigger.getParent("phaseUse"); - if (evt && evt.name == "phaseUse" && !evt.skill) { - evt.player.addTempSkill("jsrgjuxiang_buff", "phaseUseAfter"); - evt.player.addMark("jsrgjuxiang_buff", num, false); - } - } - }, - subSkill: { - sha: { - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - return !event.skill; - }, - silent: true, - charlotte: true, - forced: true, - onremove: true, - content: function () { - trigger.player.addTempSkill("jsrgjuxiang_buff", "phaseUseAfter"); - trigger.player.addMark("jsrgjuxiang_buff", player.countMark("jsrgjuxiang_sha"), false); - }, - }, - buff: { - charlotte: true, - intro: { content: "使用【杀】的次数上限+#" }, - onremove: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("jsrgjuxiang_buff"); - }, - }, - }, - }, - }, - //刘备 - jsrgjishan: { - audio: 2, - trigger: { global: "damageBegin4" }, - usable: 1, - filter: function (event, player) { - return player.hp > 0; - }, - logTarget: "player", - onremove: true, - prompt2: "失去1点体力并防止此伤害,然后你与其各摸一张牌", - check: function (event, player) { - return get.damageEffect(event.player, event.source, _status.event.player, event.nature) * event.num < get.effect(player, { name: "losehp" }, player, _status.event.player) + get.effect(player, { name: "draw" }, player, _status.event.player) + get.effect(event.player, { name: "draw" }, player, _status.event.player) / 2; - }, - group: "jsrgjishan_recover", - content: function () { - "step 0"; - trigger.cancel(); - player.loseHp(); - player.markAuto("jsrgjishan", [trigger.player]); - "step 1"; - if (player.isIn() && trigger.player.isIn()) { - var targets = [player, trigger.player]; - targets.sortBySeat(_status.currentPhase); - targets[0].draw("nodelay"); - targets[1].draw(); - } - }, - intro: { content: "已帮助$抵挡过伤害" }, - ai: { expose: 0.2 }, - subSkill: { - recover: { - audio: "jsrgjishan", - trigger: { source: "damageSource" }, - filter: function (event, player) { - return game.hasPlayer(current => { - return current.isMinHp() && player.getStorage("jsrgjishan").includes(current); - }); - }, - usable: 1, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("jsrgjishan_recover"), "令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力", (card, player, target) => { - return target.isMinHp() && player.getStorage("jsrgjishan").includes(target); - }) - .set("ai", target => { - return get.recoverEffect(target, _status.event.player, _status.event.player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("jsrgjishan_recover", target); - target.recover(); - } else player.storage.counttrigger.jsrgjishan_recover--; - }, - }, - }, - }, - jsrgzhenqiao: { - audio: 2, - trigger: { player: "useCardToTargeted" }, - forced: true, - shaRelated: true, - filter: function (event, player) { - return event.isFirstTarget && event.card.name == "sha" && player.hasEmptySlot(1); - }, - content: function () { - // trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); - // trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); - trigger.getParent().effectCount++; - }, - mod: { - attackRange: function (player, num) { - return num + 1; - }, - aiOrder: (player, card, num) => { - if (num > 0 && get.itemtype(card) === "card" && get.subtype(card) === "equip1" && !player.getEquip(1)) { - if ( - card.name !== "zhuge" || - player.getCardUsable("sha") || - !player.needsToDiscard() || - player.countCards("hs", i => { - return get.name(i) === "sha" && lib.filter.cardEnabled(i, player); - }) < 2 - ) - return 0; - } - }, - aiValue: (player, card, num) => { - if (num > 0 && get.itemtype(card) === "card" && card.name !== "zhuge" && get.subtype(card) === "equip1" && !player.getEquip(1)) return 0.01 * num; - }, - aiUseful: () => { - return lib.skill.jsrgzhenqiao.mod.aiValue.apply(this, arguments); - }, - }, - }, - //王允 - jsrgshelun: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(current => player.inRange(current)); - }, - filterTarget: function (card, player, target) { - return player.inRange(target); - }, - content: function () { - var num = player.countCards("h"); - var targets = game.filterPlayer(current => { - return current.countCards("h") <= num && current != target; - }); - player - .chooseToDebate(targets) - .set("callback", function () { - var result = event.debateResult; - if (result.bool && result.opinion) { - var opinion = result.opinion; - var target = event.getParent(2).target; - if (opinion == "red") player.discardPlayerCard(target, "he", true); - else target.damage(); - } - }) - .set("ai", card => { - var player = _status.event.player; - var color = player == _status.event.source || get.damageEffect(_status.event.getParent(2).target, player, player) > 0 ? "black" : "red"; - var val = 5 - get.value(card); - if (get.color(card) == color) val += 10; - return val; - }) - .set("aiCard", target => { - var color = target == _status.event.source || get.damageEffect(_status.event.getParent(2).target, target, target) > 0 ? "black" : "red"; - var hs = target.getCards("h", { color: color }); - if (!hs.length) hs = target.getCards("h"); - return { bool: true, cards: [hs.randomGet()] }; - }) - .set("target", target); - }, - ai: { - order: 8, - expose: 0.2, - result: { target: -1 }, - }, - }, - jsrgfayi: { - audio: 2, - trigger: { global: "chooseToDebateAfter" }, - filter: function (event, player) { - if (!event.targets.includes(player)) return false; - if (event.red.map(i => i[0]).includes(player)) return event.black.length; - if (event.black.map(i => i[0]).includes(player)) return event.red.length; - return false; - }, - direct: true, - content: function () { - "step 0"; - var targets = []; - if (trigger.red.map(i => i[0]).includes(player)) targets = trigger.black; - if (trigger.black.map(i => i[0]).includes(player)) targets = trigger.red; - player - .chooseTarget(get.prompt("jsrgfayi"), "对一名与你意见不同的角色造成1点伤害", (card, player, target) => { - return _status.event.targets.includes(target); - }) - .set( - "targets", - targets.map(i => i[0]) - ) - .set("ai", target => { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("jsrgfayi", target); - target.damage(); - } - }, - }, - jsrgtushe: { - audio: "xinfu_tushe", - mod: { - aiOrder(player, card, num) { - if (get.tag(card, "multitarget")) { - if (player.countCards("h", { type: "basic" })) return num / 10; - return num * 10; - } - if (get.type(card) === "basic") return num + 10; - }, - aiValue(player, card, num) { - if (card.name === "zhangba") { - let fact = n => { - if (n > 1) return n * fact(n - 1); - return 1; - }, - basic = 0; - return fact( - Math.min( - player.countCards("hs", i => { - if (get.tag(i, "multitarget")) return 2; - if (!["shan", "tao", "jiu"].includes(card.name)) return 1; - basic++; - }) / - (1 + basic), - player.getCardUsable("sha") - ) - ); - } - if (["shan", "tao", "jiu"].includes(card.name)) { - if (player.getEquip("zhangba") && player.countCards("hs") > 1) return 0.01; - return num / 2; - } - if (get.tag(card, "multitarget")) return num + game.players.length; - }, - aiUseful(player, card, num) { - if (get.name(card, player) === "shan") { - if ( - player.countCards("hs", i => { - if (card === i || (card.cards && card.cards.includes(i))) return false; - return get.name(i, player) === "shan"; - }) - ) - return -1; - return num / Math.pow(Math.max(1, player.hp), 2); - } - }, - }, - trigger: { - player: "useCardToPlayered", - }, - filter: function (event, player) { - if (get.type(event.card) == "equip") return false; - if (event.getParent().triggeredTargets3.length > 1) return false; - return event.targets.length > 0; - }, - check: function (event, player) { - return !player.countCards("h", { type: "basic" }); - }, - locked: false, - content: function () { - "step 0"; - player.showHandcards(); - "step 1"; - if (player.countCards("h", { type: "basic" })) event.finish(); - else player.chooseBool("图射:是否摸" + get.cnNumber(trigger.targets.length) + "张牌?").set("ai", () => 1); - "step 2"; - if (result.bool) { - player.draw(trigger.targets.length); - } - }, - ai: { - presha: true, - pretao: true, - threaten: 1.8, - effect: { - player(card, player, target) { - if ( - typeof card === "object" && - card.name !== "shan" && - get.type(card) !== "equip" && - !player.countCards("h", i => { - if (card === i || (card.cards && card.cards.includes(i))) return false; - return get.type(i) === "basic"; - }) - ) { - let targets = [], - evt = _status.event.getParent("useCard"); - targets.addArray(ui.selected.targets); - if (evt && evt.card == card) targets.addArray(evt.targets); - if (targets.length) return [1, targets.length]; - if (get.tag(card, "multitarget")) return [1, game.players.length - 1]; - return [1, 1]; - } - }, - }, - }, - }, - jsrgtongjue: { - audio: 2, - enable: "phaseUse", - usable: 1, - zhuSkill: true, - filter: function (event, player) { - return player.hasZhuSkill("jsrgtongjue") && game.hasPlayer(current => current != player && current.group == "qun"); - }, - filterCard: true, - selectCard: [1, Infinity], - filterTarget: function (card, player, target) { - return target != player && target.group == "qun"; - }, - selectTarget: [1, Infinity], - filterOk: function () { - return ui.selected.cards.length == ui.selected.targets.length; - }, - check: function (card) { - var player = _status.event.player; - if ( - player.hasCard(card => { - return player.hasValueTarget(card); - }, "hs") - ) { - return 3 - player.getUseValue(card); - } - return 3 - get.value(card); - }, - multiline: true, - multitarget: true, - delay: false, - discard: false, - lose: false, - content: function () { - "step 0"; - var list = []; - for (var i = 0; i < targets.length; i++) { - var target = targets[i]; - var card = cards[i]; - list.push([target, card]); - } - game.loseAsync({ - gain_list: list, - player: player, - cards: cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - "step 1"; - player.addTempSkill("jsrgtongjue_blocker"); - player.markAuto("jsrgtongjue_blocker", targets); - }, - ai: { - order: 5, - result: { - target: 1, - }, - }, - subSkill: { - blocker: { - charlotte: true, - onremove: true, - mod: { - playerEnabled: function (card, player, target) { - if (player.getStorage("jsrgtongjue_blocker").includes(target)) return false; - }, - }, - mark: true, - intro: { content: "$已经立牧自居,不可接近" }, - }, - }, - }, - //404曹操 - jsrgzhenglve: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - var zhu = get.zhu(player) || game.findPlayer(current => current.getSeatNum() == 1); - return event.player == zhu; - }, - locked: false, - group: "jsrgzhenglve_damage", - prompt2: function (event, player) { - var num = Math.min( - event.player.getHistory("sourceDamage").length > 0 ? 1 : 2, - game.countPlayer(current => { - return !current.hasMark("jsrgzhenglve_mark"); - }) - ); - if (num == 0) return "你可以摸一张牌"; - return "你可以摸一张牌并令" + get.cnNumber(num) + "名角色获得“猎”标记"; - }, - content: function () { - "step 0"; - player.draw(); - "step 1"; - var damaged = trigger.player.getHistory("sourceDamage").length > 0; - var num = damaged ? 1 : 2; - var targets = game.filterPlayer(current => { - return !current.hasMark("jsrgzhenglve_mark"); - }); - if (!targets.length) event.finish(); - else if (targets.length <= num) event._result = { bool: true, targets: targets }; - else - player - .chooseTarget("令" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "名角色获得“猎”标记", true, [1, num], (card, player, target) => { - return !target.hasMark("jsrgzhenglve_mark"); - }) - .set("ai", target => { - var att = get.attitude(_status.event.player, target); - return 100 - att; - }); - "step 2"; - if (result.bool) { - var targets = result.targets; - player.line(targets); - targets.forEach(i => i.addMark("jsrgzhenglve_mark", 1)); - } - }, - mod: { - cardUsableTarget: function (card, player, target) { - if (target.hasMark("jsrgzhenglve_mark")) return true; - }, - targetInRange: function (card, player, target) { - if (target.hasMark("jsrgzhenglve_mark")) return true; - }, - }, - subSkill: { - damage: { - audio: "jsrgzhenglve", - trigger: { source: "damageSource" }, - usable: 1, - filter: function (event, player) { - return event.player.hasMark("jsrgzhenglve_mark"); - }, - prompt2: function (event, player) { - var cards = event.cards || []; - return "摸一张牌" + (cards.filterInD().length ? "并获得" + get.translation(event.cards.filterInD()) : ""); - }, - content: function () { - "step 0"; - player.draw(); - var cards = trigger.cards; - if (cards && cards.filterInD().length) { - player.gain(cards.filterInD(), "gain2"); - } - }, - }, - mark: { - marktext: "猎", - intro: { - name: "猎(政略)", - name2: "猎", - markcount: () => 0, - content: "已拥有“猎”标记", - }, - }, - }, - }, - jsrghuilie: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - juexingji: true, - forced: true, - skillAnimation: true, - animationColor: "thunder", - derivation: ["jsrgpingrong", "feiying"], - filter: function (event, player) { - return game.countPlayer(current => current.hasMark("jsrgzhenglve_mark")) > 2; - }, - content: function () { - "step 0"; - player.awakenSkill("jsrghuilie"); - player.loseMaxHp(); - "step 1"; - player.addSkills(["jsrgpingrong", "feiying"]); - }, - ai: { - combo: "jsrgzhenglve", - }, - }, - jsrgpingrong: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - return !player.hasSkill("jsrgpingrong_used") && game.hasPlayer(current => current.hasMark("jsrgzhenglve_mark")); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("jsrghuilie"), "移去一名角色的“猎”,然后你执行一个额外回合。若你在此额外回合内未造成伤害,则你失去1点体力。", (card, player, target) => { - return target.hasMark("jsrgzhenglve_mark"); - }) - .set("ai", target => { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("jsrgpingrong", target); - player.addTempSkill("jsrgpingrong_used", "roundStart"); - target.removeMark("jsrgzhenglve_mark", target.countMark("jsrgzhenglve_mark")); - player.insertPhase(); - player.addSkill("jsrgpingrong_check"); - } - }, - subSkill: { - used: { charlotte: true }, - check: { - audio: "jsrgpingrong", - trigger: { player: "phaseAfter" }, - charlotte: true, - forced: true, - filter: function (event, player) { - return event.skill == "jsrgpingrong" && !player.getHistory("sourceDamage").length; - }, - content: function () { - player.loseHp(); - }, - }, - }, - ai: { - combo: "jsrgzhenglve" - }, - }, - //南华老仙 - jsrgshoushu: { - audio: 2, - forced: true, - trigger: { - //player:'enterGame', - //global:'phaseBefore', - global: "roundStart", - }, - filter: function (event, player) { - if ( - game.hasPlayer(function (current) { - return current.countCards("hej", "taipingyaoshu"); - }) - ) - return false; - return true; - //return event.name!='phase'||game.phaseNumber==0; - }, - direct: true, - group: "jsrgshoushu_destroy", - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("jsrgshoushu"), "将【太平要术】置入一名角色的装备区", (card, player, target) => { - var card = { name: "taipingyaoshu" }; - return target.canEquip(card, true); - }) - .set("ai", target => { - return target.getUseValue({ name: "taipingyaoshu" }) * get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("jsrgshoushu", target); - if (!lib.inpile.includes("taipingyaoshu")) { - lib.inpile.push("taipingyaoshu"); - } - event.card = game.createCard2("taipingyaoshu", "heart", 3); - } else event.finish(); - "step 2"; - if (card) target.equip(card); - }, - subSkill: { - destroy: { - audio: "jsrgshoushu", - trigger: { - global: ["loseEnd", "equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd"], - }, - forced: true, - filter: function (event, player) { - return game.hasPlayer(current => { - var evt = event.getl(current); - if (evt && evt.es) return evt.es.some(i => i.name == "taipingyaoshu"); - return false; - }); - }, - content: function () { - var cards = []; - game.countPlayer(current => { - var evt = trigger.getl(current); - if (evt && evt.es) return cards.addArray(evt.es.filter(i => i.name == "taipingyaoshu")); - }); - game.cardsGotoSpecial(cards); - game.log(cards, "被销毁了"); - }, - }, - }, - }, - jsrgxundao: { - audio: 2, - trigger: { player: "judge" }, - filter: function (event, player) { - return game.hasPlayer(current => current.countCards("he")); - }, - direct: true, - content: function () { - "step 0"; - var prompt2 = get.translation(player) + "(你)的" + (trigger.judgestr || "") + "判定为" + get.translation(player.judging[0]) + "," + "是否令至多两名角色依次弃置一张牌,然后选择其中一张作为新判定牌?"; - player - .chooseTarget(get.prompt("jsrgxundao"), prompt2, [1, 2], (card, player, target) => { - return target.countCards("he"); - }) - .set("ai", target => { - var player = _status.event.player; - if (!_status.event.todiscard) return 0; - if (_status.event.todiscard != "all") { - if (target == _status.event.todiscard) return 100; - } - return get.effect(target, { name: "guohe_copy2" }, player, player) / 2; - }) - .set( - "todiscard", - (function () { - if (trigger.judgestr == "闪电" && get.damageEffect(player, null, player, "thunder") >= 0) return "all"; - var friends = game.filterPlayer(i => get.attitude(i, player) > 0); - for (var friend of friends) { - var cardsx = friend.getCards("he", card => trigger.judge(card) > 0); - cardsx.sort((a, b) => { - return get.value(a) - get.value(b); - }); - if (cardsx.length) { - var card = cardsx[0]; - if (trigger.judge(player.judging[0]) >= 0) { - if (get.value(card) > 4) return false; - } - return get.owner(card); - } - } - return "all"; - })() - ); - "step 1"; - if (result.bool) { - var targets = result.targets; - targets.sortBySeat(_status.currentPhase); - event.targets = targets; - player.logSkill("jsrgxundao", targets); - event.cards = []; - } else event.finish(); - "step 2"; - var target = targets.shift(); - target.chooseToDiscard("寻道:请弃置一张牌" + (target == player ? "" : ",可能被作为新判定牌"), "he", true).set("ai", card => { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0.1; - if (attitude > 0) { - return result + 0.01; - } else { - return 0.01 - result; - } - }); - "step 3"; - if (result.bool) { - event.cards.addArray(result.cards); - } - if (targets.length) event.goto(2); - "step 4"; - var cards = event.cards.filterInD("d"); - if (cards.length) { - player.chooseButton(["寻道:选择一张作为新判定牌", cards], true).set("ai", button => { - return trigger.judge(button.link); - }); - } else event.finish(); - "step 5"; - if (result.bool) { - var card = result.links[0]; - event.card = card; - game.cardsGotoOrdering(card).relatedEvent = trigger; - } else event.finish(); - "step 6"; - if (player.judging[0].clone) { - game.broadcastAll( - function (card, card2, player) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - var node = player.$throwordered(card2.copy(), true); - node.classList.add("thrownhighlight"); - ui.arena.classList.add("thrownhighlight"); - }, - player.judging[0], - card, - player - ); - game.addVideo("deletenode", player, get.cardsInfo([player.judging[0].clone])); - } - game.cardsDiscard(player.judging[0]); - player.judging[0] = card; - trigger.orderingCards.add(card); - game.log(player, "的判定牌改为", card); - game.delay(2); - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - jsrglinghua: { - audio: 2, - trigger: { - player: ["phaseZhunbeiBegin", "phaseJieshuBegin"], - }, - prompt2: function (event, player) { - var zhunbei = event.name == "phaseZhunbei"; - return "进行目标为你" + (zhunbei ? "" : "且效果反转") + "的【闪电】判定。若你未因此受到伤害,你可以" + (zhunbei ? "令一名角色回复1点体力" : "对一名角色造成1点雷电伤害"); - }, - check: function (event, player) { - var e2 = player.getEquip(2); - if (e2 && e2.name == "taipingyaoshu") return true; - if ( - event.name == "phaseZhunbei" && - game.hasPlayer(current => { - return get.recoverEffect(current, player, player) >= 0; - }) - ) - return true; - if ( - event.name == "phaseJieshu" && - game.hasPlayer(current => { - return get.damageEffect(current, player, player, "thunder") >= 0; - }) && - player.hasSkillTag("rejudge") && - player.hasCard(card => { - return lib.card.shandian.judge(card) < 0; - }, "he") - ) - return true; - return false; - }, - content: function () { - "step 0"; - var next = (event.executeDelayCardEffect = player.executeDelayCardEffect("shandian")); - if (event.triggername != "phaseJieshuBegin") return; - next.judge = card => -lib.card.shandian.judge(card) - 4; - next.judge2 = result => !lib.card.shandian.judge2(result); - "step 1"; - var executeDelayCardEffect = event.executeDelayCardEffect; - if (!player.hasHistory("damage", evt => evt.getParent(2) == executeDelayCardEffect)) { - if (trigger.name == "phaseZhunbei") { - player.chooseTarget("灵化:是否令一名角色回复1点体力?").set("ai", target => { - var player = _status.event.player; - return get.recoverEffect(target, player, player); - }); - } else { - player.chooseTarget("灵化:是否对一名角色造成1点雷电伤害?").set("ai", target => { - var player = _status.event.player; - return get.damageEffect(target, player, player, "thunder"); - }); - } - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - if (trigger.name == "phaseZhunbei") target.recover(); - else target.damage("thunder"); - } - }, - ai: { - threaten: 2.8, - }, - }, - }, - characterReplace: {}, - dynamicTranslate: { - jsrgshichong: function (player) { - if (player.storage.jsrgshichong) return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; - return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; - }, - }, - translate: { - //江山如故·起 - jsrg_liuhong: "起刘宏", - jsrg_liuhong_prefix: "起", - jsrgchaozheng: "朝争", - jsrgchaozheng_info: "准备阶段,你可以令所有其他角色议事。若结果为:红色,意见为红色的角色各回复1点体力;黑色,意见为红色的角色各失去1点体力。然后若所有意见均相同,你摸X张牌(X为此次议事的角色数)。", - jsrgshenchong: "甚宠", - jsrgshenchong_info: "限定技。出牌阶段,你可以令一名其他角色获得〖飞扬〗、〖跋扈〗。若如此做,当你死亡时,其失去所有技能并弃置所有手牌。", - jsrgjulian: "聚敛", - jsrgjulian_info: "主公技。①其他群势力角色每回合限两次。当其不于摸牌阶段且不因〖聚敛〗摸牌后,其可以摸一张牌。②结束阶段,你可以获得所有其他群势力角色各一张牌。", - jsrgfeiyang: "飞扬", - jsrgfeiyang_info: "判定阶段开始时,若你的判定区里有牌,你可以弃置两张手牌并弃置你判定区里的一张牌。", - jsrgbahu: "跋扈", - jsrgbahu_info: "锁定技。①准备阶段,你摸一张牌。②你使用【杀】的次数上限+1。", - jsrg_hejin: "起何进", - jsrg_hejin_prefix: "起", - jsrgzhaobing: "诏兵", - jsrgzhaobing_info: "结束阶段,你可以弃置所有手牌,然后令至多X名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力(X为你本次弃置的牌数)。", - jsrgzhuhuan: "诛宦", - jsrgzhuhuan_info: "准备阶段,你可以展示所有手牌并弃置所有【杀】,然后令一名其他角色选择一项:1.弃置等量的牌,然后受到1点伤害;2.令你摸等量的牌,然后你回复1点体力。", - jsrgyanhuo: "延祸", - jsrgyanhuo_info: "锁定技。当你死亡时,你增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。", - jsrg_sunjian: "起孙坚", - jsrg_sunjian_prefix: "起", - jsrgpingtao: "平讨", - jsrgpingtao_info: "出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。", - jsrgjuelie: "绝烈", - jsrgjuelie_info: "①当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌并弃置其等量的牌。②若你的手牌数或体力值为全场最小,则你使用【杀】造成的伤害+1。", - jsrg_huangfusong: "起皇甫嵩", - jsrg_huangfusong_prefix: "起", - jsrgguanhuo: "观火", - jsrgguanhuo_info: "①出牌阶段,你可以视为使用一张【火攻】。②当你因〖观火①〗使用的【火攻】结算结束后,若此牌未造成过伤害,且:若{你此阶段发动〖观火①〗的次数为1,则你于此阶段造成渠道为【火攻】的伤害时,此伤害+1},否则你失去〖观火〗。", - jsrgjuxia: "居下", - jsrgjuxia_info: "每回合限一次。当其他角色使用牌指定你为目标后,若其技能数多于你,其可以令此牌对你无效,然后令你摸两张牌。", - jsrg_xushao: "起许劭", - jsrg_xushao_prefix: "起", - jsrgyingmen: "盈门", - jsrgyingmen_info: "锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。", - jsrgpingjian: "评鉴", - jsrgpingjian_info: "你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,你摸一张牌。", - jsrg_dongbai: "起董白", - jsrg_dongbai_prefix: "起", - jsrgshichong: "恃宠", - jsrgshichong_info: "转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。", - jsrglianzhu: "连诛", - jsrglianzhu_info: "出牌阶段限一次。你可以展示一张黑色手牌并交给一名其他角色,然后视为你对所有与其势力相同的其他角色依次使用一张【过河拆桥】。", - jsrg_qiaoxuan: "起桥玄", - jsrg_qiaoxuan_prefix: "起", - jsrgjuezhi: "绝质", - jsrgjuezhi_info: "①当你失去一张装备区里的装备牌后,你可以废除对应的装备栏。②你的回合每阶段限一次。当你使用牌对目标角色造成伤害时,你令此伤害+X(X为其装备区里的牌与你已废除的装备栏中相同副类别的数量)。", - jsrgjizhao: "急召", - jsrgjizhao_info: "准备阶段或结束阶段,你可以令一名角色选择一项:1.使用一张手牌;2.令你可以移动其区域里的一张牌。", - jsrg_yangbiao: "起杨彪", - jsrg_yangbiao_prefix: "起", - jsrgzhaohan: "昭汉", - jsrgzhaohan_info: "锁定技。准备阶段,若本局游戏:未洗过牌,你回复1点体力;洗过牌,你失去1点体力。", - jsrgrangjie: "让节", - jsrgrangjie_info: "当你受到1点伤害后,你可以移动场上的一张牌,然后你可以于弃牌堆中选择获得一张本回合进入弃牌堆且与此牌花色相同的牌。", - jsrgyizheng: "义争", - jsrgyizheng_info: "出牌阶段限一次。你可以与一名手牌数大于你的角色拼点。若你:赢,其跳过下一个摸牌阶段;没赢,其可以对你造成至多2点伤害。", - jsrg_kongrong: "起孔融", - jsrg_kongrong_prefix: "起", - jsrglirang: "礼让", - jsrglirang_info: "每轮限一次。其他角色的摸牌阶段开始时,你可以交给其两张牌。然后此回合的弃牌阶段结束时,你可以获得所有其于此阶段因弃置进入弃牌堆的牌。", - jsrgzhengyi: "争义", - jsrgzhengyi_info: "当你每回合首次受到伤害时,本轮因〖礼让〗得到过牌的其他角色可以将此伤害转移给其。", - jsrg_zhujun: "起朱儁", - jsrg_zhujun_prefix: "起", - jsrgfendi: "分敌", - jsrgfendi_tag: "分敌", - jsrgfendi_info: "每回合限一次。当你使用【杀】指定唯一目标后,你可以展示其任意张手牌,令其不能使用或打出对应实体牌不全为这些牌的牌直到此【杀】结算结束。然后当此【杀】对其造成伤害后,你于其手牌区或弃牌堆获得这些牌。", - jsrgjuxiang: "拒降", - jsrgjuxiang_info: "当你不于摸牌阶段得到牌后,你可以弃置之,令当前回合角色于此回合额定的出牌阶段内使用【杀】的次数上限+X(X为你以此法弃置的牌的花色数)。", - jsrg_liubei: "起刘备", - jsrg_liubei_prefix: "起", - jsrgjishan: "积善", - jsrgjishan_info: "①每回合限一次。当一名角色受到伤害时,你可以失去1点体力并防止此伤害,然后你与其各摸一张牌。②每回合限一次。当你造成伤害后,你可以令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力。", - jsrgzhenqiao: "振鞘", - jsrgzhenqiao_info: "锁定技。①你的攻击范围+1。②当你使用【杀】指定目标后,若你的武器栏为空且未废除,你令此【杀】的效果额外结算一次。", - jsrg_wangyun: "起王允", - jsrg_wangyun_prefix: "起", - jsrgshelun: "赦论", - jsrgshelun_info: "出牌阶段限一次。你可以选择一名你攻击范围内的角色,然后令除其外所有手牌数不大于你的角色议事。若结果为:红色,你弃置其一张牌;黑色,你对其造成1点伤害。", - jsrgfayi: "伐异", - jsrgfayi_info: "当你议事结算结束后,你可以对一名意见与你不同的角色造成1点伤害。", - jsrg_liuyan: "起刘焉", - jsrg_liuyan_prefix: "起", - jsrgtushe: "图射", - jsrgtushe_info: "当你使用非装备牌指定目标后,你可以展示所有手牌(无牌则不展示)。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。", - jsrgtongjue: "通绝", - jsrgtongjue_info: "主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。", - jsrg_caocao: "梦曹操", - jsrg_caocao_prefix: "梦", - jsrgzhenglve: "政略", - jsrgzhenglve_info: "①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为至多两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。", - jsrghuilie: "会猎", - jsrghuilie_info: "觉醒技。准备阶段,若有“猎”的角色数大于2,你减1点体力上限,然后获得〖平戎〗和〖飞影〗。", - jsrgpingrong: "平戎", - jsrgpingrong_info: "每轮限一次。一名角色的回合结束时,你可以移去一名角色的“猎”,然后你于此回合后执行一个额外回合。该回合结束后,若你于此回合未造成过伤害,你失去1点体力。", - jsrg_nanhualaoxian: "起南华老仙", - jsrg_nanhualaoxian_prefix: "起", - jsrgshoushu: "授术", - jsrgshoushu_info: "锁定技。①一轮游戏开始时,若场上没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。", - jsrgxundao: "寻道", - jsrgxundao_info: "当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。", - jsrglinghua: "灵化", - jsrglinghua_info: "①准备阶段,你可以执行目标角色为你的【闪电】效果。若你未因此受到伤害,你可以令一名角色回复1点体力。②结束阶段,你可以执行目标角色为你且判定效果反转的【闪电】效果。若你未因此受到伤害,你可以对一名角色造成1点雷电伤害。", - sbyingmen: "盈门", - sbyingmen_info: "锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。", - sbpingjian: "评鉴", - sbpingjian_info: "你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,则你于此技能结算结束时摸一张牌。", - //江山如故·承 - jsrg_sunce: "梦孙策", - jsrg_sunce_prefix: "梦", - jsrgduxing: "独行", - jsrgduxing_info: "出牌阶段限一次。你可以视为使用一张可以指定任意名目标角色的【决斗】,且所有目标角色的手牌均视为【杀】直到此牌结算结束。", - jsrgzhiheng: "猘横", - jsrgzhiheng_info: "锁定技。当你因执行牌的效果对目标角色造成伤害时,若其于此回合响应过你使用过的牌,此伤害+1。", - jsrgzhasi: "诈死", - jsrgzhasi_info: "限定技。当你受到伤害值不小于你的体力值的伤害时,你可以防止此伤害,然后失去〖猘横〗并获得〖制衡〗。然后你不计入距离和座次计算直到你对其他角色使用牌后或当你受到伤害后。", - jsrgbashi: "霸世", - jsrgbashi_info: "主公技。当你需要打出【杀】或【闪】时,你可以令其他吴势力角色选择是否打出一张【杀】或【闪】。若有角色响应,则视为你打出了一张【杀】或【闪】。", - jsrg_xuyou: "承许攸", - jsrg_xuyou_prefix: "承", - jsrglipan: "离叛", - jsrglipan_info: "回合结束时,你可以变更势力,然后摸X张牌并执行一个额外的出牌阶段。此阶段结束时,所有与你势力相同的角色依次可以将一张牌当【决斗】对你使用(X为与你势力相同的其他角色数)。", - jsrgqingxi: "轻袭", - jsrgqingxi_info: "群势力技。出牌阶段每名角色限一次。你可以选择一名手牌数小于你的角色,你将手牌数弃置至与其相同,然后视为对其使用一张刺【杀】。", - jsrgjinmie: "烬灭", - jsrgjinmie_info: "魏势力技。出牌阶段限一次。你可以选择一名手牌数大于你的角色,你视为对其使用一张火【杀】。当此牌造成伤害后,你将其手牌数弃置至与你相同。", - jsrg_lvbu: "承吕布", - jsrg_lvbu_prefix: "承", - jsrgwuchang: "无常", - jsrgwuchang_info: "锁定技。①当你获得其他角色的牌后,你变更势力为与其相同。②当你使用【杀】或【决斗】对与你势力相同的目标角色造成伤害时,此伤害+1,然后变更势力为群。", - jsrgqingjiao: "轻狡", - jsrgqingjiao_info: "群势力技。出牌阶段各限一次。你可以将一张牌当【推心置腹】/【趁火打劫】对一名手牌数大于/小于你的角色使用。", - jsrgchengxu: "乘虚", - jsrgchengxu_info: "蜀势力技。与你势力相同的其他角色不能响应你使用的牌。", - jsrg_zhanghe: "承张郃", - jsrg_zhanghe_prefix: "承", - jsrgqiongtu: "穷途", - jsrgqiongtu_info: "群势力技。每回合限一次。你可以将一张非基本牌置于武将牌上视为使用一张【无懈可击】。若此牌生效,你摸一张牌,否则你变更势力为魏并获得所有“穷途”牌。", - jsrgxianzhu: "先著", - jsrgxianzhu_info: "魏势力技。你可以将一张普通锦囊牌当无次数限制的【杀】使用。当此牌对唯一目标造成伤害后,你视为对该角色使用一张此普通锦囊牌。", - jsrg_zoushi: "承邹氏", - jsrg_zoushi_prefix: "承", - jsrgguyin: "孤吟", - jsrgguyin_info: "准备阶段,你可以翻面,且令所有其他男性角色依次选择是否翻面。然后你和所有背面朝上的角色轮流各摸一张牌,直到你们累计以此法得到X张牌(X为场上存活角色与死亡角色中男性角色数)。", - jsrgzhangdeng: "帐灯", - jsrgzhangdeng_info: "①当一名武将牌背面朝上的角色需要使用【酒】时,若你的武将牌背面朝上,其可以视为使用之。②当一名角色于一回合第二次发动〖帐灯①〗时,你将武将牌翻面至正面朝上。", - jsrg_guanyu: "承关羽", - jsrg_guanyu_prefix: "承", - jsrgguanjue: "冠绝", - jsrgguanjue_info: "锁定技。当你使用或打出有花色的牌时,你令所有其他角色于此回合内不能使用或打出该花色的牌。", - jsrgnianen: "念恩", - jsrgnianen_info: "你可以将一张牌当任意基本牌使用或打出,然后若此牌不为红色或你以此法使用或打出的牌不为普通【杀】,则直到此回合结束,该技能失效且你视为拥有〖马术〗。", - jsrg_chendeng: "承陈登", - jsrg_chendeng_prefix: "承", - jsrglunshi: "论势", - jsrglunshi_info: "出牌阶段限一次。你可以令一名角色摸等同于其攻击范围内角色数的牌(至多摸至五张),然后其弃置等同于攻击范围内含有其的角色数的牌。", - jsrgguitu: "诡图", - jsrgguitu_info: "准备阶段,你可以交换场上的两张武器牌,然后攻击范围以此法减少的角色回复1点体力。", - jsrg_zhenji: "承甄宓", - jsrg_zhenji_prefix: "承", - jsrgjixiang: "济乡", - jsrgjixiang_info: "回合内每种牌名限一次。当一名其他角色需要使用或打出一张基本牌时,你可以弃置一张牌令其视为使用或打出之,然后你摸一张牌并令〖称贤〗于此阶段可发动次数上限+1。", - jsrgchengxian: "称贤", - jsrgchengxian_info: "出牌阶段限两次。你可以将一张手牌当一张本回合未以此法使用过的普通锦囊牌使用(此转化牌须与以此法转化的手牌的合法目标数相同)。", - jsrg_zhangliao: "承张辽", - jsrg_zhangliao_prefix: "承", - jsrgzhengbing: "整兵", - jsrgzhengbing_info: "群势力技。出牌阶段限三次。你可以重铸一张牌,若此牌为:【杀】,你本回合手牌上限+2;【闪】,你摸一张牌;【桃】,你变更势力为魏。", - jsrgtuwei: "突围", - jsrgtuwei_info: "魏势力技。出牌阶段开始时,你可以获得攻击范围内任意名角色各一张牌。然后此回合结束时,这些角色中未于本回合受到过伤害的角色依次获得你的一张牌。", - jsrg_xugong: "承许贡", - jsrg_xugong_prefix: "承", - jsrgbiaozhao: "表召", - jsrgbiaozhao_info: "准备阶段,你可以选择两名其他角色A和B。直到你的下回合开始时或你死亡后,A对B使用牌无次数和距离限制,且B对你使用的牌造成的伤害+1。", - jsrgyechou: "业仇", - jsrgyechou_info: "当你死亡时,你可以令一名其他角色获得如下效果:当其受到伤害值不小于其体力值的伤害时,其令此伤害翻倍。", - jsrg_chunyuqiong: "承淳于琼", - jsrg_chunyuqiong_prefix: "承", - jsrgcangchu: "仓储", - jsrgcangchu_info: "一名角色的结束阶段,你可以令至多X名角色各摸一张牌,若X大于存活角色数,则改为各摸两张牌(X为你于此回合得到的牌数)。", - jsrgshishou: "失守", - jsrgshishou_info: "锁定技。①当你使用【酒】时,你摸三张牌,然后你本回合不能再使用牌。②当你受到火焰伤害后,你令〖仓储〗失效直到你的下回合结束后。", - //江山如故·转 - ying: "影", - ying_info: "当此牌进入弃牌堆后,系统将此牌移出游戏。", - jsrg_guojia: "梦郭嘉", - jsrg_guojia_prefix: "梦", - jsrgqingzi: "轻辎", - jsrgqingzi_info: "准备阶段,你可以弃置任意名其他角色装备区里的各一张牌,然后令这些角色获得〖神速〗直到你的下回合开始。", - jsrgdingce: "定策", - jsrgdingce_info: "当你受到伤害后,你可以依次弃置你与伤害来源的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。", - jsrgzhenfeng: "针锋", - jsrgzhenfeng_info: "出牌阶段每种类别各限一次。你可以视为使用一张存活角色的技能描述中包含的基本牌或普通锦囊牌(无距离和次数限制)。当此牌对技能描述中包含此牌的角色生效时,你对其造成1点伤害。", - jsrg_zhangfei: "转张飞", - jsrg_zhangfei_prefix: "转", - jsrgbaohe: "暴喝", - jsrgbaohe_info: "一名角色的出牌阶段结束时,你可以弃置两张牌,然后视为你对攻击范围内包含其的所有角色使用一张【杀】。当一名角色使用牌响应此【杀】后,此【杀】对后续目标角色造成的伤害+1。", - jsrgxushi: "虚势", - jsrgxushi_info: "出牌阶段限一次。你可以交给任意名角色各一张牌,然后你获得两倍数量的【影】。", - jsrg_machao: "转马超", - jsrg_machao_prefix: "转", - jsrgzhuiming: "追命", - jsrgzhuiming_info: "当你使用【杀】指定唯一目标后,你可以声明一种颜色并令目标角色弃置任意张牌,然后你展示目标角色一张牌。若此牌颜色与你声明的颜色相同,则此【杀】不计入次数限制、不可被响应且伤害+1。", - jsrg_lougui: "转娄圭", - jsrg_lougui_prefix: "转", - jsrgshacheng: "沙城", - jsrgshacheng_info: "①游戏开始时,你将牌堆顶的两张牌置于武将牌上,称为“城”。②当一名角色使用【杀】结算结束后,你可以移去一张“城”,令此牌的其中一名目标角色摸X张牌(X为该角色本回合失去过的牌数且至多为5)。", - jsrgninghan: "凝寒", - jsrgninghan_info: "锁定技。①所有角色手牌中的♣【杀】均视为冰【杀】。②当一名角色受到冰冻伤害后,你将造成此伤害的牌对应的实体牌置入“城”。", - jsrg_zhangren: "转张任", - jsrg_zhangren_prefix: "转", - jsrgfuni: "伏匿", - jsrgfuni_info: "锁定技。①你的攻击范围终值为0。②一轮游戏开始时,你令任意名角色获得共计X张【影】(X为存活角色数的一半,向上取整)。③当有牌进入弃牌堆后,若其中有【影】,你于本回合使用牌无距离限制且不能被响应。", - jsrgchuanxin: "穿心", - jsrgchuanxin_info: "一名角色的结束阶段,你可以将一张牌当【杀】使用。当一名角色受到渠道为此【杀】的伤害时,此伤害+Y(Y为其本回合回复过的体力值)。", - jsrg_huangzhong: "转黄忠", - jsrg_huangzhong_prefix: "转", - jsrgcuifeng: "摧锋", - jsrgcuifeng_info: "限定技。出牌阶段,你可以视为使用一张单目标的伤害类牌(无距离限制)。此回合结束时,若此牌未造成伤害或造成的伤害值大于1,你重置〖摧锋〗。", - jsrgdengnan: "登难", - jsrgdengnan_info: "限定技。出牌阶段,你可以视为使用一张非伤害类普通锦囊牌。此回合结束时,若此牌的目标均于此回合受到过伤害,你重置〖登难〗。", - jsrg_xiahourong: "转夏侯荣", - jsrg_xiahourong_prefix: "转", - jsrgfenjian: "奋剑", - jsrgfenjian_info: "每回合各限一次。当你需要对其他角色使用【决斗】或【桃】时,你可以令你本回合受到的伤害+1,视为使用之。", - jsrg_sunshangxiang: "转孙尚香", - jsrg_sunshangxiang_prefix: "转", - jsrgguiji: "闺忌", - jsrgguiji_info: "每回合限一次。出牌阶段,你可以与一名手牌数小于你的男性角色交换手牌。然后其下个出牌阶段结束时,你可以与其交换手牌。", - jsrgjiaohao: "骄豪", - jsrgjiaohao_info: "①其他角色的出牌阶段限一次。其可以将手牌中的一张装备牌置于你的装备区。②准备阶段,你获得X张【影】(X为你空置装备栏数的一半,向上取整)。", - jsrg_pangtong: "转庞统", - jsrg_pangtong_prefix: "转", - jsrgmanjuan: "漫卷", - jsrgmanjuan_info: "若你没有手牌,你可以如手牌般使用或打出于本回合进入弃牌堆的牌(每种点数每回合限一次)。", - jsrgyangming: "养名", - jsrgyangming_info: "出牌阶段限一次。你可以与一名角色拼点,若其:没赢,你可以与其重复此流程;赢,其摸X张牌,然后你回复1点体力(X为其此阶段没赢的次数)。", - jsrg_hansui: "转韩遂", - jsrg_hansui_prefix: "转", - jsrgniluan: "逆乱", - jsrgniluan_info: "准备阶段,你可以选择一项:1.弃置一张牌,对一名未对你造成过伤害的角色造成1点伤害;2.令一名对你造成过伤害的角色摸两张牌。", - jsrghuchou: "互雠", - jsrghuchou_info: "锁定技。当你对最后对你使用伤害类牌的角色造成伤害时,此伤害+1。", - jsrgjiemeng: "皆盟", - jsrgjiemeng_info: "主公技,锁定技。所有群势力角色至其他角色的距离-X(X为群势力角色数)。", - jsrg_zhangchu: "转张楚", - jsrg_zhangchu_prefix: "转", - jsrghuozhong: "惑众", - jsrghuozhong_info: "所有角色出牌阶段限一次。其可以将一张黑色非锦囊牌当【兵粮寸断】置于其判定区,然后令你摸两张牌。", - jsrgrihui: "日彗", - jsrgrihui_info: "①当你使用【杀】对目标角色造成伤害后,你可以令判定区有牌的其他角色各摸一张牌。②你于一回合内对判定区没有牌的角色使用的第一张【杀】无任何次数限制。", - jsrg_xiahouen: "转夏侯恩", - jsrg_xiahouen_prefix: "转", - jsrghujian: "护剑", - jsrghujian_info: "①游戏开始时,你从游戏外获得一张【赤血青锋】。②一名角色的回合结束时,此回合最后一名使用或打出牌的角色可以获得弃牌堆中的【赤血青锋】。", - jsrgshili: "恃力", - jsrgshili_info: "出牌阶段限一次。你可以将一张手牌中的装备牌当【决斗】使用。", - jsrg_fanjiangzhangda: "转范强张达", - jsrg_fanjiangzhangda_ab: "转范疆张达", - jsrg_fanjiangzhangda_prefix: "转", - jsrgfushan: "负山", - jsrgfushan_info: "出牌阶段开始时,所有其他角色可以依次交给你一张牌并令你此阶段使用【杀】的次数上限+1。此阶段结束时,若你使用【杀】的次数未达到上限且此阶段以此法交给你牌的角色均存活,你失去2点体力,否则你将手牌摸至体力上限。", - //江山如故·合 - jsrg_zhugeliang: "梦诸葛亮", - jsrg_zhugeliang_prefix: "梦", - jsrgwentian: "问天", - jsrgwentian_info: "①你可以将牌堆顶的牌当【无懈可击】/【火攻】使用,若此牌不为黑色/红色,〖问天〗于本轮失效。②每回合限一次。你的一个阶段开始时,你可以观看牌堆顶的五张牌,然后将其中一张牌交给一名其他角色,将其余牌以任意顺序置于牌堆顶或牌堆底。", - jsrgchushi: "出师", - jsrgchushi_info: "出牌阶段限一次。若你不为主公,你可以与主公议事。若结果为:红色,你与其各摸一张牌,若你与其手牌数之和小于7,重复此流程;黑色,当你于本轮内造成属性伤害时,此伤害+1。", - jsrgyinlve: "隐略", - jsrgyinlve_info: "每轮各限一次。当一名角色受到火焰/雷电伤害时,你可以防止此伤害,然后于当前回合结束后执行一个只有摸牌/弃牌阶段的回合。", - jsrg_jiangwei: "合姜维", - jsrg_jiangwei_prefix: "合", - jsrgjinfa: "矜伐", - jsrgjinfa_info: "出牌阶段限一次。你可以展示一张手牌,然后令所有体力上限不大于你的角色议事。若结果与此牌颜色:相同,你令其中至多两名角色将手牌摸至体力上限;不同,你获得两张【影】。然后若没有其他角色与你意见相同,你可以变更势力。", - jsrgfumou: "复谋", - jsrgfumou_info: "魏势力技。当你议事结算结束后,与你意见不同的角色本回合不能使用或打出与其意见颜色相同的牌,你可以将一张【影】当【出其不意】对一名与你意见不同的角色使用。", - jsrgxuanfeng: "选锋", - jsrgxuanfeng_info: "蜀势力技。你可以将一张【影】当无距离和次数限制的刺【杀】使用。", - jsrg_luxun: "合陆逊", - jsrg_luxun_prefix: "合", - jsrgyoujin: "诱进", - jsrgyoujin_info: "出牌阶段开始时,你可以与一名角色拼点,你与其本回合不能使用或打出点数小于自己拼点牌的手牌,且赢的角色视为对没赢的角色使用一张【杀】。", - jsrgdailao: "待劳", - jsrgdailao_info: "出牌阶段,若你没有可以使用的手牌,你可以展示所有手牌并摸两张牌,然后结束此回合。", - jsrgzhubei: "逐北", - jsrgzhubei_info: "锁定技。①当你对本回合受到过伤害的角色造成伤害时,此伤害+1。②你对本回合失去过最后手牌的角色使用牌无次数限制。", - jsrg_zhaoyun: "合赵云", - jsrg_zhaoyun_prefix: "合", - jsrglonglin: "龙临", - jsrglonglin_info: "其他角色于其出牌阶段内首次使用【杀】指定第一个目标后,你可以弃置一张牌令此【杀】无效,然后其可以视为对你使用一张【决斗】,你以此法造成伤害后,其本阶段不能再使用手牌。", - jsrgzhendan: "镇胆", - jsrgzhendan_info: "①你可以将一张非基本手牌当任意基本牌使用或打出。②当你受到伤害后,你摸X张牌并令该技能本轮失效(X为本轮所有角色执行过的回合数且至多为5)。③一轮游戏开始时,若上一轮该技能未因〖镇胆②〗失效过,你摸Y张牌(Y为上一轮所有角色执行过的回合数且至多为5)。", - jsrg_simayi: "合司马懿", - jsrg_simayi_prefix: "合", - jsrgyingshi: "鹰眎", - jsrgyingshi_info: "当你翻面时,你可以观看牌堆底的三张牌(若死亡角色数大于2则改为五张),然后将其中任意数量的牌以任意顺序置于牌堆顶,其余以任意顺序置于牌堆底。", - jsrgtuigu: "蜕骨", - jsrgtuigu_info: "①回合开始时,你可以翻面并令你本回合的手牌上限+X,然后摸X张牌并视为使用一张【解甲归田】(X为存活角色数的一半,向下取整),目标角色不能使用以此法得到的牌直到其回合结束。②一轮游戏开始时,若你上一轮未执行过回合(因〖蜕骨②〗执行的回合除外),你获得一个额外的回合。③当你失去装备牌里的牌后,你回复1点体力。", - jsrg_guoxun: "合郭循", - jsrg_guoxun_prefix: "合", - jsrgeqian: "遏前", - jsrgeqian_info: "①结束阶段,你可以蓄谋任意次。②当你使用【杀】或蓄谋牌指定其他角色为唯一目标后,你可以令此牌不计入次数限制并获得目标一张牌,然后其可以令你本回合至其的距离+2。", - jsrgfusha: "伏杀", - jsrgfusha_info: "限定技。出牌阶段,若你的攻击范围内仅有一名角色,你可以对其造成X点伤害(X为你的攻击范围,至多为游戏人数)。", - jsrg_sunlubansunluyu: "合大小虎", - jsrg_sunlubansunluyu_prefix: "合", - jsrgdaimou: "殆谋", - jsrgdaimou_info: "每回合各限一次。当一名角色使用【杀】指定其他角色/你为目标时,你可以用牌堆顶的牌蓄谋/你须弃置你区域里的一张蓄谋牌。", - jsrgfangjie: "芳洁", - jsrgfangjie_info: "准备阶段,若你没有蓄谋牌,你回复1点体力并摸一张牌,否则你可以弃置你区域里的任意张蓄谋牌并失去〖芳洁〗。", - jsrg_caofang: "合曹芳", - jsrg_caofang_prefix: "合", - jsrgzhaotu: "诏图", - jsrgzhaotu_info: "每轮限一次。你可以将一张红色非锦囊牌当【乐不思蜀】使用,然后当前回合结束后,目标执行一个手牌上限-2的额外回合。", - jsrgjingju: "惊惧", - jsrgjingju_info: "当你需要使用任意一种基本牌时,你可以将其他角色判定区里的一张牌移动至你的判定区,视为你使用之。", - jsrgweizhui: "危坠", - jsrgweizhui_info: "主公技。其他魏势力角色的结束阶段,其可以将一张黑色手牌当【过河拆桥】对你使用。", - jsrg_sunjun: "合孙峻", - jsrg_sunjun_prefix: "合", - jsrgyaoyan: "邀宴", - jsrgyaoyan_info: "准备阶段,你可以令所有角色依次选择是否于回合结束时议事,若议事结果为:红色,你获得任意名未议事的角色各一张手牌;黑色,你可以对一名议事的角色造成2点伤害。", - jsrgbazheng: "霸政", - jsrgbazheng_info: "当你参与的议事展示意见时,本回合受到过你伤害的角色意见视为与你相同。", - jsrg_liuyong: "合刘永", - jsrg_liuyong_prefix: "合", - jsrgdanxin: "丹心", - jsrgdanxin_info: "你可以将一张牌当【推心置腹】使用,你展示以此法交出与得到的牌,以此法得到♥牌的角色回复1点体力,然后你至目标角色的距离+1直到回合结束。", - jsrgfengxiang: "封乡", - jsrgfengxiang_info: "锁定技。当你受到伤害后,你与一名其他角色交换装备区里的所有牌。若你装备区里的牌因此减少,你摸等同于减少牌数的牌。", - jsrg_weiwenzhugezhi: "合卫温诸葛直", - jsrg_weiwenzhugezhi_prefix: "合", - jsrgfuhai: "浮海", - jsrgfuhai_info: "出牌阶段限一次。你可以令所有有手牌的其他角色同时展示一张手牌,然后你选择一个方向并摸X张牌(X为该方向上的角色展示的点数连续严格递增或严格递减的牌数,至少为1)。", - jsrg_zhangxuan: "合张嫙", - jsrg_zhangxuan_prefix: "合", - jsrgtongli: "同礼", - jsrgtongli_info: "当你于出牌阶段内使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内使用过的牌数相等,则你可以展示所有手牌,令此牌额外结算一次。", - jsrgshezang: "奢葬", - jsrgshezang_info: "每轮限一次。当你或你回合内的其他角色进入濒死状态时,你可以亮出牌堆顶的四张牌,获得其中任意张花色各不相同的牌。", - jsrg_gaoxiang: "合高翔", - jsrg_gaoxiang_prefix: "合", - jsrgchiying: "驰应", - jsrgchiying_info: "出牌阶段限一次。你可以选择一名角色,令其攻击范围内的其他角色依次弃置一张牌。若以此法弃置的基本牌数不大于其体力值,其获得这些基本牌。", - jsrg_guozhao: "合郭照", - jsrg_guozhao_prefix: "合", - jsrgpianchong: "偏宠", - jsrgpianchong_info: "一名角色的结束阶段,若你于此回合内失去过牌,你可以判定。若结果为红色/黑色,你摸此回合进入弃牌堆的红色/黑色牌数量的牌。", - jsrgzunwei: "尊位", - jsrgzunwei_info: "出牌阶段限一次。你可以选择一名其他角色并选择执行一项,然后移除该选项:1.将手牌数摸至与该角色相同(最多摸五张);2.将其装备牌移至你的装备区,直到你装备区的牌数不少于其;3.将体力值回复至与该角色相同。", - - xumou_jsrg: "蓄谋", - xumou_jsrg_info: "“蓄谋”牌可在判定区内重复存在。判定阶段开始时,你选择一项:⒈使用此牌对应的实体牌,然后本阶段不能再使用此牌名的牌;⒉将所有的“蓄谋”牌置入弃牌堆。", - - jiangshanrugu_qi: "江山如故·起", - jiangshanrugu_cheng: "江山如故·承", - jiangshanrugu_zhuan: "江山如故·转", - jiangshanrugu_he: "江山如故·合", - }, - }; -}); diff --git a/character/jsrg/card.js b/character/jsrg/card.js new file mode 100644 index 000000000..bab19cd63 --- /dev/null +++ b/character/jsrg/card.js @@ -0,0 +1,51 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + xumou_jsrg: { + type: "special_delay", + allowDuplicate: true, + blankCard: true, + fullimage: true, + wuxieable: false, + effect() { + "step 0"; + var card = get.autoViewAs(event.cards[0]); + card.storage.xumou_jsrg = true; + player.chooseUseTarget(card, event.cards, `蓄谋:是否使用${get.translation(card)}?`, `请选择要使用的目标。若不使用此牌,则判定区内的所有“蓄谋”牌都将被置入弃牌堆。`); + "step 1"; + if (!result.bool) { + var cards = player.getCards("j", card => { + return (card.viewAs || card.name) == "xumou_jsrg"; + }); + if (cards.length > 0) player.loseToDiscardpile(cards); + } else { + player.addTempSkill("xumou_jsrg_temp", "phaseChange"); + player.markAuto("xumou_jsrg_temp", [event.cards[0].name]); + } + }, + }, + ying: { + audio: true, + fullskin: true, + type: "basic", + cardcolor: "spade", + enable: false, + destroy: "discardPile", + getYing(count) { + var cards = []; + if (typeof count != "number") count = 1; + while (count--) { + let card = game.createCard("ying", "spade", 1); + cards.push(card); + } + return cards; + }, + ai: { + basic: { + useful: 0, + value: 0, + }, + }, + }, +}; +export default cards; diff --git a/character/jsrg/character.js b/character/jsrg/character.js new file mode 100644 index 000000000..f585dc619 --- /dev/null +++ b/character/jsrg/character.js @@ -0,0 +1,61 @@ +const characters = { + //起 + jsrg_liuhong: ["male", "qun", 4, ["jsrgchaozheng", "jsrgshenchong", "jsrgjulian"], ["zhu"]], + jsrg_hejin: ["male", "qun", 4, ["jsrgzhaobing", "jsrgzhuhuan", "jsrgyanhuo"]], + jsrg_sunjian: ["male", "qun", 4, ["jsrgpingtao", "jsrgjuelie"]], + jsrg_huangfusong: ["male", "qun", 4, ["jsrgguanhuo", "jsrgjuxia"]], + jsrg_xushao: ["male", "qun", 3, ["sbyingmen", "sbpingjian"]], + jsrg_dongbai: ["female", "qun", 3, ["jsrgshichong", "jsrglianzhu"]], + jsrg_qiaoxuan: ["male", "qun", 3, ["jsrgjuezhi", "jsrgjizhao"]], + jsrg_yangbiao: ["male", "qun", "3/4", ["jsrgzhaohan", "jsrgrangjie", "jsrgyizheng"]], + jsrg_kongrong: ["male", "qun", 3, ["jsrglirang", "jsrgzhengyi"]], + jsrg_zhujun: ["male", "qun", 4, ["jsrgfendi", "jsrgjuxiang"]], + jsrg_liubei: ["male", "qun", 4, ["jsrgjishan", "jsrgzhenqiao"]], + jsrg_wangyun: ["male", "qun", 3, ["jsrgshelun", "jsrgfayi"], ["clan:太原王氏"]], + jsrg_liuyan: ["male", "qun", 3, ["xinfu_limu", "jsrgtushe", "jsrgtongjue"], ["zhu"]], + jsrg_caocao: ["male", "qun", 4, ["jsrgzhenglve", "jsrghuilie"]], + jsrg_nanhualaoxian: ["male", "qun", 3, ["jsrgshoushu", "jsrgxundao", "jsrglinghua"]], + //承 + jsrg_sunce: ["male", "wu", 4, ["jsrgduxing", "jsrgzhiheng", "jsrgzhasi", "jsrgbashi"], ["zhu"]], + jsrg_xuyou: ["male", "wei", 3, ["jsrglipan", "jsrgqingxi", "jsrgjinmie"], ["doublegroup:wei:qun"]], + jsrg_lvbu: ["male", "qun", 5, ["jsrgwuchang", "jsrgqingjiao", "jsrgchengxu"], ["doublegroup:shu:qun"]], + jsrg_zhanghe: ["male", "wei", 4, ["jsrgqiongtu", "jsrgxianzhu"], ["doublegroup:wei:qun"]], + jsrg_zoushi: ["female", "qun", 3, ["jsrgguyin", "jsrgzhangdeng"]], + jsrg_guanyu: ["male", "shu", 5, ["jsrgguanjue", "jsrgnianen"], ["border:wei"]], + jsrg_chendeng: ["male", "qun", 3, ["jsrglunshi", "jsrgguitu"]], + jsrg_zhenji: ["female", "qun", 3, ["jsrgjixiang", "jsrgchengxian"]], + jsrg_zhangliao: ["male", "qun", 4, ["jsrgzhengbing", "jsrgtuwei"], ["doublegroup:wei:qun"]], + jsrg_xugong: ["male", "wu", 3, ["jsrgbiaozhao", "jsrgyechou"]], + jsrg_chunyuqiong: ["male", "qun", 4, ["jsrgcangchu", "jsrgshishou"]], + //转 + jsrg_guojia: ["male", "wei", 3, ["jsrgqingzi", "jsrgdingce", "jsrgzhenfeng"]], + jsrg_zhangfei: ["male", "shu", 5, ["jsrgbaohe", "jsrgxushi"]], + jsrg_machao: ["male", "qun", 4, ["jsrgzhuiming", "mashu"]], + jsrg_lougui: ["male", "wei", 3, ["jsrgshacheng", "jsrgninghan"]], + jsrg_zhangren: ["male", "qun", 4, ["jsrgfuni", "jsrgchuanxin"]], + jsrg_huangzhong: ["male", "shu", 4, ["jsrgcuifeng", "jsrgdengnan"]], + jsrg_xiahourong: ["male", "wei", 4, ["jsrgfenjian"]], + jsrg_sunshangxiang: ["female", "wu", 3, ["jsrgguiji", "jsrgjiaohao"]], + jsrg_pangtong: ["male", "qun", 3, ["jsrgmanjuan", "jsrgyangming"]], + jsrg_hansui: ["male", "qun", 4, ["jsrgniluan", "jsrghuchou", "jsrgjiemeng"], ["zhu"]], + jsrg_zhangchu: ["female", "qun", 3, ["jsrghuozhong", "jsrgrihui"]], + jsrg_xiahouen: ["male", "wei", 4, ["jsrghujian", "jsrgshili"], ["die_audio:tw_xiahouen"]], + jsrg_fanjiangzhangda: ["male", "wu", 5, ["jsrgfushan"]], + //合 + jsrg_zhugeliang: ["male", "shu", 3, ["jsrgwentian", "jsrgchushi", "jsrgyinlve"]], + jsrg_jiangwei: ["male", "shu", 4, ["jsrgjinfa", "jsrgfumou", "jsrgxuanfeng"], ["border:wei"]], + jsrg_luxun: ["male", "wu", 3, ["jsrgyoujin", "jsrgdailao", "jsrgzhubei"]], + jsrg_zhaoyun: ["male", "shu", 4, ["jsrglonglin", "jsrgzhendan"]], + jsrg_simayi: ["male", "wei", 4, ["jsrgyingshi", "jsrgtuigu"]], + jsrg_guoxun: ["male", "wei", 4, ["jsrgeqian", "jsrgfusha"]], + jsrg_sunlubansunluyu: ["female", "wu", 3, ["jsrgdaimou", "jsrgfangjie"]], + jsrg_caofang: ["male", "wei", "3/4", ["jsrgzhaotu", "jsrgjingju", "jsrgweizhui"], ["zhu"]], + jsrg_sunjun: ["male", "wu", 4, ["jsrgyaoyan", "jsrgbazheng"]], + jsrg_liuyong: ["male", "shu", 3, ["jsrgdanxin", "jsrgfengxiang"]], + jsrg_weiwenzhugezhi: ["male", "wu", 4, ["jsrgfuhai"]], + jsrg_zhangxuan: ["female", "wu", 4, ["jsrgtongli", "jsrgshezang"]], + jsrg_gaoxiang: ["male", "shu", 4, ["jsrgchiying"]], + jsrg_guozhao: ["female", "wei", 3, ["jsrgpianchong", "jsrgzunwei"]], +}; + +export default characters; diff --git a/character/jsrg/characterFilter.js b/character/jsrg/characterFilter.js new file mode 100644 index 000000000..fe783af16 --- /dev/null +++ b/character/jsrg/characterFilter.js @@ -0,0 +1,10 @@ +const characterFilters = { + jsrg_xushao(mode) { + return mode != "guozhan"; + }, + jsrg_jiangwei(mode) { + return mode !== "guozhan"; + }, +}; + +export default characterFilters; diff --git a/character/jsrg/characterReplace.js b/character/jsrg/characterReplace.js new file mode 100644 index 000000000..2092d9297 --- /dev/null +++ b/character/jsrg/characterReplace.js @@ -0,0 +1,3 @@ +const characterReplaces = {}; + +export default characterReplaces; diff --git a/character/jsrg/dynamicTranslate.js b/character/jsrg/dynamicTranslate.js new file mode 100644 index 000000000..1bbedf0ff --- /dev/null +++ b/character/jsrg/dynamicTranslate.js @@ -0,0 +1,10 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + jsrgshichong(player) { + if (player.storage.jsrgshichong) return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; + return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; + }, +}; + +export default dynamicTranslates; diff --git a/character/jsrg/index.js b/character/jsrg/index.js new file mode 100644 index 000000000..380845720 --- /dev/null +++ b/character/jsrg/index.js @@ -0,0 +1,32 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "jsrg", + connect: true, + character: { ...characters }, + characterSort: { + jsrg: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/jsrg/intro.js b/character/jsrg/intro.js new file mode 100644 index 000000000..a2fe1742e --- /dev/null +++ b/character/jsrg/intro.js @@ -0,0 +1,15 @@ +const characterIntro = { + qiaoxuan: "桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。", + lougui: "娄圭,字子伯,荆州南阳郡(治今河南南阳)人。曹魏时期著名谋士、将军,娄圭年轻时与曹操有交情,曾经随曹操平定冀州,南征刘表,击破马超,立有功劳,连曹操都感叹他的计谋。 后来曹操和他的儿子们一起出去游玩,娄圭当时也一起随行。因言语不当,被南郡(治今湖北荆州)人习授举报,曹操认为有意诽谤,遭杀害。在小说《三国演义》里,娄圭被设定为京兆人(今陕西西安),隐居终南山,道号“梦梅居士”。于第59回登场。", + xiahourong: "夏侯荣(207年—219年) ,字幼权,名将夏侯渊之子。建安二十四年(219年)汉中之战,父亲夏侯渊战死后,夏侯荣不愿逃跑,随后拔剑冲入敌阵,战死。", + guoxun: "郭脩(?~253年),一作郭循,字孝先,凉州西平人,三国时期曹魏官员。原为曹魏中郎,被蜀汉将领姜维俘虏后降蜀汉,任左将军,后来刺杀了蜀汉大将军费祎。被曹魏追封为长乐乡侯,谥曰威侯。", + caofang: "曹芳(232年-274年),字兰卿,沛国谯县(今安徽省亳州市)人。三国时期曹魏第三位皇帝(239年1月22日-254年10月17日在位),疑为魏武帝曹操曾孙,任城威王曹彰之孙,任城王曹楷之子。太和六年(232年),生于任城王府。青龙三年(235年),选为魏明帝曹叡养子,册封齐王。景初三年(239年),立为皇太子,同日魏明帝曹叡病死,曹芳正式即位,由大将军曹爽和太尉司马懿共同辅政。正始十年,经历高平陵之变,曹爽倒台,政权落入司马氏手中。嘉平六年(254年),中书令李丰和光禄大夫张缉图谋废掉司马师,改立夏侯玄为大将军。司马师平定叛乱后,将曹芳废为齐王,拥戴高贵乡公曹髦继位。西晋建立后,册封邵陵县公。泰始十年(274年),曹芳病逝,终年四十三岁,谥号为厉。", + sunjun: "孙峻(219年-256年10月19日),字子远,扬州吴郡富春(今浙江省杭州市)人,昭义中郎将孙静曾孙,定武中郎将孙暠之孙,散骑侍郎孙恭之子。三国时期吴国宗室、权臣。孙峻从小弓马娴熟,胆量非凡。孙权晚年时,孙峻担任武卫都尉,掌握军权,然后又任侍中,开始涉足朝政。孙权临终前,孙峻接受遗诏同诸葛恪、滕胤共同辅佐朝政。此后,其身兼武卫将军,一直主持宫廷的值班、守卫等要害部门,并被封为都乡侯。孙峻生性喜好专断,容不下诸葛恪,于是与吴主孙亮密谋发动政变,在酒宴中设伏兵杀死诸葛恪。孙峻谋杀诸葛恪之后,升任丞相、大将军,督察内外一切军务,假节,晋封富春侯。此后,孙峻独揽朝政。孙峻在任职期间,滥施刑杀,淫乱宫女,和全公主孙鲁班私通。五凤元年(254年),吴侯孙英企图谋杀孙峻,后来事情被泄露,孙英自杀。时隔一年,吴国将军孙仪、张怡、林恂等人乘蜀国使节来访之机,共同谋划诛杀孙峻。后被孙峻发觉,孙仪自杀,林恂等被认为有罪诛死。太平元年(256年),孙峻梦见被诸葛恪所击,因惊悸恐惧发病而死,时年38岁。", + sunlubansunluyu: "孙鲁班,孙权之女。孙鲁班与孙权二子孙和不睦。孙权长子孙登死后,孙和被立为太子。孙鲁班向孙权进谗言废孙和太子之位,孙和被废后忧愤而死。
    孙鲁育,又名小虎,孙权与步练师之女。吴后期,孙鲁班诬陷孙鲁育参与谋反,于是孙峻杀害了孙鲁育。", + jsrg_caocao: "初平元年二月,董卓徙天子都长安,焚洛阳宫室,众诸侯畏卓兵强,莫敢进。操怒斥众人:“为人臣而临此境,当举义兵以诛暴乱,大众已合,诸君何疑?此一战而天下定矣!”遂引兵汴水,遇卓将徐荣,大破之。操迎天子,攻吕布,伐袁术,安汉室,拜为征西将军。是时,袁绍兼四州之地,将攻许都。操欲扫清寰宇,兴复汉室,遂屯兵官渡。既克绍,操曰:“若天命在吾,吾为周文王矣。”", + jsrg_sunce: "建安五年,操、绍相拒于官渡,孙策欲阴袭许昌,迎汉帝,遂密治兵,部署诸将。未发,会为许贡门客所刺,将计就计,尽托江东于权,诈死以待天时。八月,操、绍决战,孙策亲冒矢石,斩将刈旗,得扬、豫之地。曹操败走冀、青,刘备远遁荆、益。而后历时七年,孙策三分天下已有其二,帝于洛阳,建霸王未竟之功业。权表求吴王,封为仲帝,共治天下。", + jsrg_guojia: "初平元年二月,郭嘉拜见袁绍,闻曹操怒斥众诸侯,乃对曰:“董卓于汴水或有埋伏,慎之!”曹操未从,果败于徐荣。三月,曹操与郭嘉论天下事:“使孤成大业者,必此人也。”郭嘉从破袁绍,讨谭、尚,连战数克,计定辽东。时年三十八,征乌桓归途郭嘉因劳染疾,命悬之际竟意外饮下柳皮醋水而愈。建安十三年,曹操屯兵赤壁,郭嘉识破连环之计,议上中下三策,可胜刘备。尚未献策,曹操便决意采纳上策,“奉孝之才,足胜孤百倍,卿言上策,如何不取?”由此,赤壁战后曹操尽得天下。", + jsrg_zhugeliang: "建兴六年春,汉丞相诸葛亮使赵云、邓芝为先锋,马谡为副将拒箕谷,牵制曹真主力。自率三十万大军攻祁山,三郡叛魏应亮,关中响震。曹叡命张郃拒亮,亮使定军山降将姜维与郃战于街亭,张郃久攻不下。后曹真强攻赵云军,赵云死战,坚守箕谷,马谡、邓芝当场战死忠勇殉国。……既克张郃,曹真溃逃,曹叡弃守长安,迁都邺城。十月,司马懿击退孙权,回援曹真。而后三年,丞相所到之处,无不望风而降,皆箪食壶浆,以迎汉军。尽收豫、徐、兖、并之地,建兴十年春,司马懿父子三人死于诸葛武侯火计,同年,孙权上表称臣,至此四海清平,大汉一统。而后诸葛亮荐蒋琬为丞相,姜维为大将军,自回隆中归隐,后主挽留再三,皆不受。魏延亦辞官相随,侍奉左右。后主时有不决之事,便往隆中拜访相父,均未得面,童子答曰外出云游,遗数锦囊,拆而视之,皆治国之良策也。", +}; + +export default characterIntro; diff --git a/character/jsrg/pinyin.js b/character/jsrg/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/jsrg/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/jsrg/skill.js b/character/jsrg/skill.js new file mode 100644 index 000000000..86da960b3 --- /dev/null +++ b/character/jsrg/skill.js @@ -0,0 +1,8518 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //江山如故·合 + //蓄谋临时禁用 + xumou_jsrg_temp: { + charlotte: true, + onremove: true, + mod: { + cardEnabled(card, player) { + if (!card.storage || !card.storage.xumou_jsrg) return; + if (player.getStorage("xumou_jsrg_temp").includes(get.name(card, false))) return false; + }, + }, + }, + //404诸葛亮 + jsrgwentian: { + audio: 2, + trigger: { + player: ["phaseZhunbeiBegin", "phaseJudgeBegin", "phaseDrawBegin", "phaseUseBegin", "phaseDiscardBegin", "phaseJieshuBegin"], + }, + usable: 1, + prompt2: "观看牌堆顶的五张牌,将其中一张交给其他角色,并将其余牌置于牌堆顶或牌堆底", + group: "jsrgwentian_viewas", + async content(event, trigger, player) { + const cards = get.cards(5); + game.cardsGotoOrdering(cards); + const { result } = await player.chooseButton(["问天:将一张牌交给一名其他角色", cards], true); + if (result.bool) { + const { result: result2 } = await player.chooseTarget(`将${get.translation(result.links)}交给一名其他角色`, lib.filter.notMe, true).set("ai", target => { + return get.attitude(get.player(), target); + }); + if (result2.bool) { + cards.removeArray(result.links); + const target = result2.targets[0]; + player.line(target, "green"); + await target.gain(result.links, "gain2").set("giver", player); + } + } + const next = player.chooseToMove(); + next.set("list", [["牌堆顶", cards.filterInD()], ["牌堆底"]]); + next.set("prompt", "问天:点击将牌移动到牌堆顶或牌堆底"); + next.processAI = list => { + const cards = list[0][1], + player = _status.event.player; + const top = []; + const judges = player.getCards("j"); + let stopped = false; + if (!player.hasWuxie()) { + for (let i = 0; i < judges.length; i++) { + const judge = get.judge(judges[i]); + cards.sort((a, b) => judge(b) - judge(a)); + if (judge(cards[0]) < 0) { + stopped = true; + break; + } else { + top.unshift(cards.shift()); + } + } + } + let bottom; + if (!stopped) { + cards.sort((a, b) => 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]; + }; + const { + result: { moved }, + } = await next; + const top = moved[0]; + const bottom = moved[1]; + top.reverse(); + game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); + game.asyncDelayx(); + }, + subSkill: { + viewas: { + audio: "jsrgwentian", + enable: "chooseToUse", + filter: function (event, player) { + for (const name of ["wuxie", "huogong"]) { + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) return true; + } + return false; + }, + hiddenCard: function (player, name) { + if (player.isTempBanned("jsrgwentian")) return false; + return name == "wuxie"; + }, + viewAs: function (cards, player) { + const event = get.event(), + filter = event._backup.filterCard; + for (const name of ["wuxie", "huogong"]) { + if (filter(get.autoViewAs({ name }, "unsure"), player, event)) return { name }; + } + return null; + }, + filterCard: () => false, + selectCard: -1, + prompt: function () { + const player = get.player(); + const event = get.event(), + filter = event._backup.filterCard; + let str = "将牌堆顶的牌当【"; + for (const name of ["wuxie", "huogong"]) { + if (filter({ name }, player, event)) { + str += get.translation(name); + break; + } + } + str += "】使用"; + return str; + }, + precontent() { + player.logSkill("jsrgwentian"); + const cards = get.cards(); + event.result.cards = cards; + delete event.result.skill; + game.cardsGotoOrdering(cards); + const color = event.result.card.name == "wuxie" ? "black" : "red"; + if (get.color(cards, false) != color) { + player.tempBanSkill("jsrgwentian", "roundStart"); + } + }, + }, + }, + }, + jsrgchushi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + const zhu = get.zhu(player); + if (!zhu || !zhu.isZhu2() || !zhu.countCards("h")) return false; + return !player.isZhu2() && player.countCards("h"); + }, + async content(event, trigger, player) { + player + .chooseToDebate( + game.filterPlayer(current => { + return (current == player || current.isZhu2()) && current.countCards("h"); + }) + ) + .set("callback", async event => { + const result = event.debateResult; + if (result.bool && result.opinion) { + const { opinion, targets } = result; + targets.sortBySeat(); + if (opinion == "red") { + do { + for (const current of targets) { + await current.draw(); + } + } while ( + targets + .map(current => { + return current.countCards("h"); + }) + .reduce((p, c) => { + return p + c; + }, 0) < 7 + ); + } else { + player.addMark("jsrgchushi_add", 1, false); + player.addTempSkill("jsrgchushi_add", "roundStart"); + } + } + }); + }, + subSkill: { + add: { + audio: "jsrgchushi", + trigger: { source: "damageBegin1" }, + filter: function (event) { + return event.hasNature("linked"); + }, + forced: true, + charlotte: true, + onremove: true, + async content(_, trigger, player) { + trigger.num += player.countMark("jsrgchushi_add"); + }, + ai: { + damageBonus: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "damageBonus") return arg && arg.card && game.hasNature(arg.card, "linked"); + }, + }, + intro: { + content: "造成的属性伤害+#", + }, + }, + }, + }, + jsrgyinlve: { + audio: 2, + trigger: { + global: "damageBegin4", + }, + filter: function (event, player) { + return event.player.isIn() && ["fire", "thunder"].some(n => !player.hasSkill(`jsrgyinlve_${n}`) && event.hasNature(n)); + }, + check: function (event, player) { + if (get.damageEffect(event.player, event.source, player, get.natureList(event.nature)) < -5) return true; + return false; + }, + logTarget: "player", + async content(event, trigger, player) { + trigger.cancel(); + const natures = ["fire", "thunder"]; + let index; + if (natures.every(n => !player.hasSkill(`jsrgyinlve_${n}`) && trigger.hasNature(n))) { + const { result } = await player.chooseControl(["摸牌阶段", "弃牌阶段"]).set("prompt", "请选择要新回合内仅有的阶段"); + index = result.index; + } else index = [0, 1].find(i => !player.hasSkill(`jsrgyinlve_${natures[i]}`) && trigger.hasNature(natures[i])); + player.addTempSkill(`jsrgyinlve_${natures[index]}`, "roundStart"); + player.insertPhase().set("phaseList", [["phaseDraw", "phaseDiscard"][index]]); + }, + subSkill: { + fire: { charlotte: true }, + thunder: { charlotte: true }, + }, + }, + //姜维 + jsrgjinfa: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "h", + discard: false, + lose: false, + delay: false, + check: function () { + return 1 + Math.random(); + }, + async content(event, trigger, player) { + await player.showCards(event.cards); + player + .chooseToDebate( + game.filterPlayer(current => { + return current.maxHp <= player.maxHp; + }) + ) + .set("callback", async event => { + const result = event.debateResult; + if (result.bool && result.opinion) { + const { cards: fixedCards } = event.getParent("jsrgjinfa"); + const color = get.color(fixedCards); + const { opinion, targets } = result; + if (opinion == color) { + const { result } = await player + .chooseTarget("是否令至多两名参与议事的角色将手牌摸至体力上限?", [1, 2], (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("targets", targets) + .set("ai", target => { + const player = get.player(); + const att = get.attitude(player, target); + if (att <= 0) return -1; + return att * Math.sqrt(Math.max(0.1, target.maxHp - target.countCards("h"))); + }); + if (result.bool) { + const targets = result.targets; + targets.sortBySeat(); + player.line(targets, "green"); + for (const current of targets) { + if (current.countCards("h") < current.maxHp) await current.drawTo(current.maxHp); + } + } + } else { + await player.gain(lib.card.ying.getYing(2), "gain2"); + } + } + const { red, black } = result; + if ((red.length == 1 && red[0][0] == player) || (black.length == 1 && black[0][0] == player)) { + const list = lib.group.slice(); + list.remove(player.group); + list.push("cancel2"); + const { + result: { control }, + } = await player + .chooseControl(list) + .set("prompt", "是否变更势力?") + .set("ai", () => { + if (!get.event("change")) return "cancel2"; + const controls = get.event("controls"); + const groups = ["wei", "shu"].filter(g => controls.includes(g)); + if (groups.length) return groups.randomGet(); + return controls.randomGet(); + }) + .set("change", ["wei", "shu"].includes(player.group) ? Math.random() < 0.5 : true); + if (control != "cancel2") { + player.popup(control + "2", get.groupnature(control, "raw")); + player.changeGroup(control); + } + } + }); + }, + ai: { + order: function (item, player) { + if (player.countCards("h") == 1) return 10; + return 1; + }, + result: { + player: 1, + }, + }, + }, + jsrgfumou: { + audio: 2, + trigger: { global: "chooseToDebateAfter" }, + groupSkill: true, + forced: true, + locked: false, + filter: function (event, player) { + if (player.group != "wei") return false; + if (!event.targets.includes(player)) return false; + if (event.red.some(i => i[0] == player)) return event.black.length; + if (event.black.some(i => i[0] == player)) return event.red.length; + return false; + }, + async content(event, trigger, player) { + const targets = []; + if (trigger.red.some(i => i[0] == player)) targets.addArray(trigger.black.map(i => i[0])); + if (trigger.black.some(i => i[0] == player)) targets.addArray(trigger.red.map(i => i[0])); + player.line(targets, "thunder"); + targets.forEach(target => { + target.addTempSkill("jsrgfumou_forbid"); + target.markAuto( + "jsrgfumou_forbid", + ["red", "black"].filter(color => { + return trigger[color].some(i => i[0] == target); + }) + ); + }); + game.broadcastAll(targets => { + lib.skill.jsrgfumou_backup.targets = targets; + }, targets); + const next = player.chooseToUse(); + next.set("openskilldialog", `是否将一张【影】当【出其不意】对一名与你意见不同的角色使用?`); + next.set("norestore", true); + next.set("_backupevent", "jsrgfumou_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("jsrgfumou_backup"); + }, + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card" && get.name(card) == "ying"; + }, + viewAs: { + name: "chuqibuyi", + }, + selectCard: 1, + position: "hs", + log: false, + filterTarget: function (card, player, target) { + const targets = lib.skill.jsrgfumou_backup.targets; + if (!targets.includes(target) || ui.selected.targets.containsSome(targets)) return false; + return lib.filter.targetEnabled.apply(this, arguments); + }, + ai1: function (card) { + return 6 - get.value(card); + }, + precontent: function () { + delete event.result.skill; + }, + }, + forbid: { + charlotte: true, + onremove: true, + mod: { + cardEnabled: function (card, player) { + const color = get.color(card); + if (color != "unsure" && player.getStorage("jsrgfumou_forbid").includes(color)) return false; + }, + cardRespondable: function (card, player) { + const color = get.color(card); + if (color != "unsure" && player.getStorage("jsrgfumou_forbid").includes(color)) return false; + }, + cardSavable: function (card, player) { + const color = get.color(card); + if (color != "unsure" && player.getStorage("jsrgfumou_forbid").includes(color)) return false; + }, + }, + mark: true, + intro: { + content: "本回合不能使用或打出$牌", + }, + }, + }, + }, + jsrgxuanfeng: { + audio: 2, + enable: "chooseToUse", + filterCard: { name: "ying" }, + position: "hs", + groupSkill: true, + locked: false, + viewAs: { + name: "sha", + nature: "stab", + storage: { jsrgxuanfeng: true }, + }, + viewAsFilter(player) { + if (player.group != "shu") return false; + if (!player.countCards("hs", "ying")) return false; + }, + prompt: "将一张【影】当无距离和次数限制的刺【杀】使用", + check(card) { + const val = get.value(card); + return 5 - val; + }, + mod: { + targetInRange: function (card, player, target) { + if (card.storage && card.storage.jsrgxuanfeng) return true; + }, + cardUsable: function (card) { + if (card.storage && card.storage.jsrgxuanfeng) return Infinity; + }, + }, + ai: { + order: 2, + }, + }, + //陆逊 + jsrgyoujin: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(current => { + return player.canCompare(current); + }); + }, + direct: true, + async content(event, trigger, player) { + const { result } = await player + .chooseTarget(get.prompt2("jsrgyoujin"), (card, player, target) => { + return player.canCompare(target); + }) + .set("ai", target => { + if (!get.event("goon")) return 0; + return -get.attitude(get.player(), target); + }) + .set("goon", player.countCards("hs", ["shan", "caochuan"]) || player.getHp() >= 3); + if (!result.bool) return; + const { targets } = result, + target = targets[0]; + player.logSkill("jsrgyoujin", target); + const { result: result2 } = await player.chooseToCompare(target).set("small", true); + player.addTempSkill("jsrgyoujin_forbid"); + player.markAuto("jsrgyoujin_forbid", [result2.num1]); + target.addTempSkill("jsrgyoujin_forbid"); + target.markAuto("jsrgyoujin_forbid", [result2.num2]); + if (!result2.tie) { + const targets = [target, player]; + if (result2.bool) targets.reverse(); + const sha = new lib.element.VCard({ name: "sha" }); + if (targets[0].canUse(sha, targets[1], false)) { + targets[0].useCard(sha, targets[1], false); + } + } + }, + subSkill: { + forbid: { + charlotte: true, + onremove: true, + mod: { + cardEnabled2: function (card, player) { + if (get.itemtype(card) == "card" && player.getStorage("jsrgyoujin_forbid").some(num => num > get.number(card))) return false; + }, + }, + mark: true, + intro: { + content: "本回合不能使用或打出点数小于$的手牌", + }, + }, + }, + }, + jsrgdailao: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return !player.hasCard(card => { + return player.hasUseTarget(card, true, true); + }); + }, + async content(event, trigger, player) { + await player.showHandcards(); + await player.draw(2); + const evt = event.getParent("phase"); + if (evt) { + game.resetSkills(); + _status.event = evt; + _status.event.finish(); + _status.event.untrigger(true); + } + }, + ai: { + order: 0.0001, + result: { player: 1 }, + }, + }, + jsrgzhubei: { + audio: 2, + trigger: { source: "damageBegin1" }, + forced: true, + init(player) { + player.addSkill("jsrgzhubei_record"); + }, + filter(event, player) { + return event.player.hasHistory("damage", evt => { + return evt.source == player; + }); + }, + logTarget: "player", + async content(event, trigger, player) { + trigger.num++; + }, + subSkill: { + record: { + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + charlotte: true, + silent: true, + filter(event, player) { + return game.hasPlayer(current => { + if (current.countCards("h")) return false; + const evt = event.getl(current); + return evt && evt.hs && evt.hs.length; + }); + }, + async content(event, trigger, player) { + game.countPlayer(current => { + if (current.countCards("h")) return false; + const evt = trigger.getl(current); + if (evt && evt.hs && evt.hs.length) current.addTempSkill("jsrgzhubei_lost"); + }); + }, + }, + lost: { charlotte: true }, + }, + mod: { + cardUsableTarget(card, player, target) { + if (target.hasSkill("jsrgzhubei_lost")) return true; + }, + }, + }, + //赵云 + jsrglonglin: { + audio: 2, + trigger: { + global: "useCardToPlayered", + }, + usable: 1, + filter(event, player) { + if (event.player == player) return false; + if (event.card.name != "sha") return false; + return event.isFirstTarget && event.player.isPhaseUsing(); + }, + direct: true, + async content(event, trigger, player) { + const juedou = new lib.element.VCard({ name: "juedou", storage: { jsrglonglin: true } }); + const { result } = await player + .chooseToDiscard(get.prompt2("jsrglonglin"), "he") + .set("ai", card => { + if (get.event("goon")) return 5 - get.value(card); + return 0; + }) + .set( + "goon", + (trigger.player.canUse(juedou, player) ? Math.max(0, get.effect(player, juedou, trigger.player, trigger.player)) : 0) + + trigger.targets + .map(target => { + return get.effect(target, trigger.card, trigger.player, player); + }) + .reduce((p, c) => { + return p + c; + }, 0) < + -4 + ) + .set("logSkill", ["jsrglonglin", trigger.player]); + if (result.bool) { + trigger.excluded.addArray(trigger.targets); + game.asyncDelayx(); + if (trigger.player.canUse(juedou, player)) { + const { result } = await trigger.player.chooseBool(`是否视为对${get.translation(player)}使用一张【决斗】?`).set("choice", get.effect(player, juedou, trigger.player, trigger.player) >= 0); + if (result.bool) { + player.addTempSkill("jsrglonglin_source"); + trigger.player.useCard(juedou, player); + } + } + } + }, + subSkill: { + source: { + trigger: { source: "damageSource" }, + charlotte: true, + forced: true, + popup: false, + filter(event, player) { + return event.card && event.card.storage && event.card.storage.jsrglonglin; + }, + async content(event, trigger, player) { + player.line(trigger.player); + trigger.player.addTempSkill("jsrglonglin_forbid"); + }, + }, + forbid: { + mod: { + cardEnabled: function (card, player) { + if (!card.cards) return; + if (card.cards.some(cardx => get.position(cardx) == "h")) return false; + }, + cardSavable: function (card, player) { + if (!card.cards) return; + if (card.cards.some(cardx => get.position(cardx) == "h")) return false; + }, + }, + charlotte: true, + mark: true, + intro: { + content: "不能使用手牌", + }, + }, + }, + }, + jsrgzhendan: { + audio: 2, + trigger: { + player: "damageEnd", + global: "roundStart", + }, + filter(event, player) { + let count = 0; + let roundCount = 1 + (event.name != "damage"); + const curLen = player.actionHistory.length; + for (let i = curLen - 1; i >= 0; i--) { + if ( + roundCount == 1 && + game.hasPlayer(current => { + const history = current.actionHistory[i]; + if (!history.isMe || history.isSkipped) return false; + return true; + }) + ) { + count++; + } + if (player.actionHistory[i].isRound) roundCount--; + if (roundCount <= 0) break; + } + if (!player.storage.jsrgzhendan_mark && count > 0) return true; + return false; + }, + forced: true, + locked: false, + group: "jsrgzhendan_viewas", + async content(event, trigger, player) { + let count = 0; + let roundCount = 1 + (trigger.name != "damage"); + const curLen = player.actionHistory.length; + for (let i = curLen - 1; i >= 0; i--) { + if ( + roundCount == 1 && + game.hasPlayer(current => { + const history = current.actionHistory[i]; + if (!history.isMe || history.isSkipped) return false; + return true; + }) + ) { + count++; + } + if (player.actionHistory[i].isRound) roundCount--; + if (roundCount <= 0) break; + } + count = Math.min(5, count); + await player.draw(count); + if (trigger.name == "damage") { + player.tempBanSkill("jsrgzhendan", "roundStart"); + player.storage.jsrgzhendan_mark = true; + player + .when({ global: "roundStart" }) + .assign({ + lastDo: true, + }) + .then(() => { + delete player.storage.jsrgzhendan_mark; + }); + } + }, + subSkill: { + viewas: { + audio: "jsrgzhendan", + enable: ["chooseToUse", "chooseToRespond"], + filter(event, player) { + if (event.type == "wuxie") return false; + if ( + !_status.connectMode && + !player.countCards("hs", card => { + return get.type2(card) != "basic"; + }) + ) + return false; + return get.inpileVCardList(info => { + if (info[0] != "basic") return false; + return event.filterCard(get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), player, event); + }).length; + }, + chooseButton: { + dialog(event, player) { + const vcards = get.inpileVCardList(info => { + if (info[0] != "basic") return false; + return event.filterCard(get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), player, event); + }); + return ui.create.dialog("镇胆", [vcards, "vcard"]); + }, + check(button) { + if (get.event().getParent().type != "phase") return 1; + return get.player().getUseValue({ name: button.link[2], nature: button.link[3] }); + }, + backup(links, player) { + return { + audio: "jsrgzhendan", + popname: true, + viewAs: { name: links[0][2], nature: links[0][3] }, + filterCard(card, player) { + return get.type2(card) != "basic"; + }, + selectCard: 1, + position: "hs", + }; + }, + prompt(links, player) { + return "将一张非基本手牌当" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用或打出"; + }, + }, + hiddenCard(player, name) { + return get.type(name) == "basic" && player.countCards("hs") > 0; + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player) { + return player.countCards("hs") > 0; + }, + order: 0.5, + result: { + player(player) { + if (get.event().dying) { + return get.attitude(player, get.event().dying); + } + return 1; + }, + }, + }, + }, + viewas_backup: {}, + }, + }, + //司马懿 + jsrgyingshi: { + audio: 2, + trigger: { player: "turnOverAfter" }, + async content(event, trigger, player) { + const number = game.dead.length > 2 ? 5 : 3; + const cards = get.bottomCards(number); + game.cardsGotoOrdering(cards); + const next = player.chooseToMove(); + next.set("list", [["牌堆顶"], ["牌堆底", cards.reverse()]]); + next.set("prompt", "鹰眎:点击将牌移动到牌堆顶或牌堆底"); + next.processAI = list => { + const cards = list[1][1], + player = _status.event.player; + const top = []; + const judges = player.getCards("j"); + let stopped = false; + if (!player.hasWuxie()) { + for (let i = 0; i < judges.length; i++) { + const judge = get.judge(judges[i]); + cards.sort((a, b) => judge(b) - judge(a)); + if (judge(cards[0]) < 0) { + stopped = true; + break; + } else { + top.unshift(cards.shift()); + } + } + } + let bottom; + if (!stopped) { + cards.sort((a, b) => 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]; + }; + const { + result: { moved }, + } = await next; + const top = moved[0]; + const bottom = moved[1]; + top.reverse(); + game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); + game.asyncDelayx(); + }, + }, + jsrgtuigu: { + audio: 2, + trigger: { player: "phaseBegin" }, + prompt2(event, player) { + const num = Math.floor(game.countPlayer() / 2); + return `你翻面,令你本回合的手牌上限+${num},摸${get.cnNumber(num)}张牌,视为使用一张【解甲归田】(目标角色不能使用这些牌直到其下回合结束)。`; + }, + group: ["jsrgtuigu_insert", "jsrgtuigu_recover"], + async content(event, trigger, player) { + await player.turnOver(); + const num = Math.floor(game.countPlayer() / 2); + player.addTempSkill("jsrgtuigu_handcard"); + player.addMark("jsrgtuigu_handcard", num, false); + await player.draw(num); + const jiejia = new lib.element.VCard({ name: "jiejia", storage: { jsrgtuigu: true } }); + if (player.hasUseTarget(jiejia)) { + player.addTempSkill("jsrgtuigu_block"); + player.chooseUseTarget(jiejia, true); + } + }, + subSkill: { + insert: { + audio: "jsrgtuigu", + trigger: { global: "roundStart" }, + filter(event, player) { + const curLen = player.actionHistory.length; + if (curLen <= 2) return false; + for (let i = curLen - 2; i >= 0; i--) { + const history = player.actionHistory[i]; + if (history.isMe && !history.isSkipped && !history._jsrgtuigu) return false; + if (history.isRound) break; + } + return true; + }, + forced: true, + locked: false, + async content(event, trigger, player) { + const evt = trigger, + evtx = player.insertPhase(); + player + .when("phaseBeforeStart") + .filter(evtt => evtt == evtx) + .then(() => { + game.players + .slice() + .concat(game.dead) + .forEach(current => { + current.getHistory()._jsrgtuigu = true; + current.getStat()._jsrgtuigu = true; + }); + }); + if (evt.player != player && !evt._finished) { + evt.finish(); + evt._triggered = 5; + const evtxx = evt.player.insertPhase(); + delete evtxx.skill; + } + }, + }, + recover: { + audio: "jsrgtuigu", + trigger: { + player: "loseAfter", + global: ["gainAfter", "equipAfter", "addJudgeAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + if (player.isHealthy()) return false; + const evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; + }, + forced: true, + locked: false, + async content(event, trigger, player) { + player.recover(); + }, + }, + handcard: { + markimage: "image/card/handcard.png", + intro: { + content(storage, player) { + return "手牌上限+" + storage; + }, + }, + onremove: true, + charlotte: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("jsrgtuigu_handcard"); + }, + }, + }, + block: { + trigger: { global: "gainAfter" }, + filter(event, player) { + if (event.getParent().name != "jiejia") return false; + const card = event.getParent(2).card; + if (card && card.storage && card.storage.jsrgtuigu) return true; + return false; + }, + charlotte: true, + forced: true, + silent: true, + content() { + trigger.player.addGaintag(trigger.cards, "jsrgtuigu"); + trigger.player.addTempSkill("jsrgtuigu_blocked", { player: "phaseAfter" }); + }, + }, + blocked: { + mod: { + cardEnabled2(card) { + if (get.itemtype(card) == "card" && card.hasGaintag("jsrgtuigu")) return false; + }, + }, + charlotte: true, + forced: true, + popup: false, + onremove(player) { + player.removeGaintag("jsrgtuigu"); + }, + }, + }, + }, + //郭循 + jsrgeqian: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget || event.targets.length != 1 || event.target == player) return false; + if (event.card.name == "sha") return true; + return event.getParent(3).name == "xumou_jsrg"; + }, + prompt2(event, player) { + return `令${get.translation(event.card)}不计入次数限制,且你获得${get.translation(event.target)}一张牌,然后其可以令你本回合至其的距离+2`; + }, + group: "jsrgeqian_prepare", + logTarget: "target", + async content(event, trigger, player) { + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; + } + await player.gainPlayerCard(trigger.target, "he", true); + const { + result: { bool }, + } = await trigger.target.chooseBool(`是否令${get.translation(player)}至你的距离于本回合内+2?`).set("ai", () => true); + if (bool) { + player.addTempSkill("jsrgeqian_distance"); + if (!player.storage.jsrgeqian_distance) player.storage.jsrgeqian_distance = {}; + const id = trigger.target.playerid; + if (typeof player.storage.jsrgeqian_distance[id] != "number") player.storage.jsrgeqian_distance[id] = 0; + player.storage.jsrgeqian_distance[id] += 2; + player.markSkill("jsrgeqian_distance"); + } + }, + subSkill: { + prepare: { + audio: "jsrgeqian", + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.countCards("h"); + }, + direct: true, + async content(event, trigger, player) { + while (player.countCards("h") > 0) { + const { + result: { bool, cards }, + } = await player.chooseCard(get.prompt("jsrgeqian"), "你可以蓄谋任意次").set("ai", card => { + const player = get.player(); + if (player.hasValueTarget(card)) return player.getUseValue(card); + return 0; + }); + if (!bool) break; + await player.addJudge({ name: "xumou_jsrg" }, cards); + } + }, + }, + distance: { + onremove: true, + charlotte: true, + mod: { + globalFrom(player, target, distance) { + if (!player.storage.jsrgeqian_distance) return; + const dis = player.storage.jsrgeqian_distance[target.playerid]; + if (typeof dis == "number") return distance + dis; + }, + }, + intro: { + content(storage, player) { + if (!storage) return; + const map = _status.connectMode ? lib.playerOL : game.playerMap; + let str = `你本回合:`; + for (const id in storage) { + str += "
  • 至" + get.translation(map[id]) + "的距离+" + storage[id]; + } + return str; + }, + }, + }, + }, + }, + jsrgfusha: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "fire", + filter(event, player) { + return ( + game.countPlayer(current => { + return player.inRange(current); + }) == 1 + ); + }, + filterTarget(card, player, target) { + return player.inRange(target); + }, + selectTarget: -1, + async content(event, trigger, player) { + player.awakenSkill("jsrgfusha"); + event.target.damage(Math.min(game.countPlayer(), player.getAttackRange())); + }, + ai: { + order: 1, + result: { + target: -2, + }, + }, + }, + //大小虎 + jsrgdaimou: { + audio: 2, + trigger: { + global: "useCardToPlayer", + }, + filter(event, player) { + if (event.card.name != "sha") return false; + if (event.target != player) return !player.hasSkill("jsrgdaimou_other"); + return ( + !player.hasSkill("jsrgdaimou_me") && + player.hasCard(card => { + return (card.viewAs || card.name) == "xumou_jsrg" && lib.filter.cardDiscardable(card, player, "jsrgdaimou"); + }, "j") + ); + }, + direct: true, + async content(event, trigger, player) { + if (trigger.target == player) { + player.logSkill("jsrgdaimou"); + player.addTempSkill("jsrgdaimou_me"); + const { + result: { bool, links }, + } = await player + .chooseButton( + [ + "殆谋:请弃置区域里的一张蓄谋牌", + player.getCards("j", card => { + return (card.viewAs || card.name) == "xumou_jsrg"; + }), + ], + true + ) + .set("filterButton", button => { + return lib.filter.cardDiscardable(button.link, get.player(), "jsrgdaimou"); + }) + .set("ai", button => { + const player = get.player(); + return 1 / Math.max(0.01, player.getUseValue(button.link)); + }); + if (bool) { + player.discard(links); + } + } else { + const { + result: { bool }, + } = await player.chooseBool(get.prompt("jsrgdaimou"), "你可以用牌堆顶的牌蓄谋").set("ai", () => true); + if (bool) { + player.logSkill("jsrgdaimou"); + player.addTempSkill("jsrgdaimou_other"); + player.addJudge({ name: "xumou_jsrg" }, get.cards()); + } + } + }, + subSkill: { + me: { charlotte: true }, + other: { charlotte: true }, + }, + }, + jsrgfangjie: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + async content(event, trigger, player) { + if ( + !player.hasCard(card => { + return (card.viewAs || card.name) == "xumou_jsrg"; + }, "j") + ) { + player.logSkill("jsrgfangjie"); + await player.recover(); + await player.draw(); + } else { + const { + result: { bool, links }, + } = await player + .chooseButton( + [ + "是否弃置区域里的任意张蓄谋牌并失去〖芳洁〗?", + player.getCards("j", card => { + return (card.viewAs || card.name) == "xumou_jsrg"; + }), + ], + [1, Infinity] + ) + .set("filterButton", button => { + return lib.filter.cardDiscardable(button.link, get.player(), "jsrgdaimou"); + }) + .set("ai", () => 0); + if (bool) { + player.logSkill("jsrgfangjie"); + await player.discard(links); + player.removeSkills("jsrgfangjie"); + } + } + }, + }, + //曹芳 + jsrgzhaotu: { + audio: 2, + enable: "chooseToUse", + viewAs: { name: "lebu" }, + position: "hes", + round: 1, + viewAsFilter(player) { + return player.countCards("hes"); + }, + filterCard(card, player) { + return get.color(card) == "red" && get.type2(card) != "trick"; + }, + onuse(result, player) { + player.tempBanSkill("jsrgzhaotu", null, false); + result.targets[0].insertPhase(); + result.targets[0].addTempSkill("jsrgzhaotu_handcard", { player: "phaseAfter" }); + result.targets[0].addMark("jsrgzhaotu_handcard", 2, false); + }, + subSkill: { + handcard: { + intro: { + content(storage, player) { + return "手牌上限-" + storage; + }, + }, + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num - player.countMark("jsrgzhaotu_handcard"); + }, + }, + }, + }, + ai: { + order: 5, + result: { + target(player, target) { + let dis = 0.5 - 0.75 * target.needsToDiscard(2, null, true); + if (dis > 0) return dis; + if (player.hasSkill("jsrgjingju") && player.hasZhuSkill("jsrgweizhui") && get.attitude(player, target) > 0) + return game.countPlayer(current => { + if (current === player || current === target || current.group !== "wei") return false; + return player.hasZhuSkill("jsrgweizhui", current) && get.attitude(player, current) > 0; + }); + return dis; + }, + }, + }, + }, + jsrgjingju: { + audio: 2, + enable: "chooseToUse", + filter(event, player) { + if (event.type == "wuxie" || event.jsrgjingju) return false; + if ( + !player.canMoveCard( + null, + false, + game.filterPlayer(i => i != player), + player, + card => { + return get.position(card) == "j"; + } + ) + ) + return false; + return get.inpileVCardList(info => { + if (info[0] != "basic") return false; + return event.filterCard(get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), player, event); + }).length; + }, + chooseButton: { + dialog: function (event, player) { + const vcards = get.inpileVCardList(info => { + if (info[0] != "basic") return false; + return event.filterCard(get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), player, event); + }); + return ui.create.dialog("惊惧", [vcards, "vcard"], "hidden"); + }, + check: function (button) { + let player = _status.event.player; + if (get.event().getParent().type != "phase") return 1; + return ( + get.player().getUseValue({ name: button.link[2], nature: button.link[3] }) + + game.countPlayer(current => { + if (current === player || current.group !== "wei") return false; + return player.hasZhuSkill("jsrgweizhui", current) && get.attitude(player, current) > 0; + }) + ); + }, + backup: function (links, player) { + return { + filterCard: () => false, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + selectCard: -1, + precontent() { + "step 0"; + player + .moveCard( + `惊惧:将其他角色判定区里的牌移动至你的判定区`, + game.filterPlayer(i => i != player), + player, + card => { + return get.position(card) == "j"; + } + ) + .set("logSkill", "jsrgjingju"); + "step 1"; + if (result.bool) { + delete event.result.skill; + } else { + event.getParent().jsrgjingju = true; + event.getParent().goto(0); + delete event.getParent().openskilldialog; + event.finish(); + } + "step 2"; + game.delayx(); + }, + }; + }, + prompt: function (links, player) { + return "选择" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】的目标"; + }, + }, + ai: { + order: function () { + const player = get.player(), + event = _status.event; + if ( + player.canMoveCard(null, false, game.filterPlayer(), player, card => { + return get.position(card) == "j"; + }) + ) { + if (event.type == "dying") { + if (event.filterCard({ name: "tao" }, player, event)) { + return 0.5; + } + } else { + if (event.filterCard({ name: "tao" }, player, event) || event.filterCard({ name: "shan" }, player, event)) { + return 4; + } + if (event.filterCard({ name: "sha" }, player, event)) { + return 2.9; + } + } + } + return 0; + }, + save: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + return player.canMoveCard(null, false, game.filterPlayer(), player, card => { + return get.position(card) == "j"; + }); + }, + result: { + player: function (player) { + if (get.event().type == "dying") { + return get.attitude(player, get.event().dying); + } + return 1; + }, + }, + }, + }, + jsrgweizhui: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + zhuSkill: true, + direct: true, + filter(event, player) { + return player != event.player && event.player.group == "wei" && event.player.isIn() && player.hasZhuSkill("jsrgweizhui", event.player); + }, + async content(event, trigger, player) { + const { + result: { bool, cards }, + } = await trigger.player + .chooseCard(`是否响应${get.translation(player)}的主公技【危坠】?`, "将一张黑色手牌当【过河拆桥】对其使用", (card, player) => { + if (get.color(card) != "black") return false; + return player.canUse(get.autoViewAs({ name: "guohe" }, [card]), get.event("target")); + }) + .set("target", player) + .set("ai", card => { + if (get.effect(get.event("target"), get.autoViewAs({ name: "guohe" }, [card]), player) <= 0) return 0; + return 7 - get.value(card); + }); + if (bool) { + trigger.player.logSkill("jsrgweizhui", player); + trigger.player.useCard(get.autoViewAs({ name: "guohe" }, cards), cards, player); + } + }, + }, + //孙峻 + jsrgyaoyan: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + prompt: "是否发动【邀宴】?", + logTarget: () => game.filterPlayer(), + async content(event, trigger, player) { + const targets = game.filterPlayer(); + const toDebateList = []; + while (targets.length) { + const current = targets.shift(); + const { + result: { bool }, + } = await current.chooseBool(`是否响应${get.translation(player)}的【邀宴】,于回合结束参与议事?`).set("ai", () => Math.random() < 0.5); + if (bool) { + toDebateList.add(current); + current.popup("同意", "wood"); + game.log(current, "#g同意", "参加", player, "的议事"); + } else { + current.popup("拒绝", "fire"); + game.log(current, "#r拒绝", "参加", player, "的议事"); + } + } + if (toDebateList.length) { + player.addTempSkill("jsrgyaoyan_hold"); + player.markAuto("jsrgyaoyan_hold", toDebateList); + } + }, + subSkill: { + hold: { + trigger: { player: "phaseEnd" }, + charlotte: true, + forced: true, + popup: false, + onremove: true, + filter(event, player) { + return player.getStorage("jsrgyaoyan_hold").some(i => i.isIn()); + }, + async content(event, trigger, player) { + player.chooseToDebate(player.getStorage("jsrgyaoyan_hold").filter(i => i.isIn())).set("callback", async event => { + const { bool, opinion, targets } = event.debateResult; + if (bool && opinion) { + if (opinion == "red") { + const notDebated = game.filterPlayer().removeArray(targets); + if (notDebated.length) { + const { result } = await player + .chooseTarget("获得任意名未议事的角色的各一张手牌", [1, Infinity], true, (card, player, target) => { + return get.event("targets").includes(target) && target.countGainableCards(player, "h"); + }) + .set("targets", notDebated) + .set("ai", target => { + const player = get.player(); + const att = get.attitude(player, target); + return -att; + }); + if (result.bool) { + const targets = result.targets; + targets.sortBySeat(); + player.line(targets, "green"); + for (const current of targets) { + await player.gainPlayerCard(current, "h", true); + } + } + } + } else { + const { + result: { bool, targets: targets2 }, + } = await player + .chooseTarget("是否对一名议事的角色造成2点伤害?", (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("targets", targets) + .set("ai", target => { + const player = get.player(); + const eff = get.damageEffect(target, player, player); + return eff; + }); + if (bool) { + player.line(targets2[0]); + targets2[0].damage(2); + } + } + } + }); + }, + }, + }, + }, + jsrgbazheng: { + audio: 2, + trigger: { global: "debateShowOpinion" }, + filter(event, player) { + if (!event.targets.includes(player)) return false; + const damagedPlayers = player + .getHistory("sourceDamage") + .map(evt => evt.player) + .toUniqued(); + let dissent; + const colors = ["red", "black"]; + for (const color of colors) { + if (event[color].some(i => i[0] == player)) { + dissent = colors.find(i => i != color); + break; + } + } + return event[dissent].some(i => damagedPlayers.includes(i[0])); + }, + forced: true, + locked: false, + direct: true, + async content(event, trigger, player) { + let myOpinion, dissent; + const colors = ["red", "black"]; + for (const color of colors) { + if (trigger[color].some(i => i[0] == player)) { + myOpinion = color; + dissent = colors.find(i => i != color); + break; + } + } + const damagedPlayers = player + .getHistory("sourceDamage") + .map(evt => evt.player) + .toUniqued(); + let dissident = []; + for (let i = 0; i < trigger[dissent].length; i++) { + const pair = trigger[dissent][i]; + if (damagedPlayers.includes(pair[0])) { + dissident.push(pair[0]); + trigger[myOpinion].push(pair); + trigger[dissent].splice(i--, 1); + } + } + player.logSkill("jsrgbazheng", dissident); + }, + }, + //刘永 + jsrgdanxin: { + audio: 2, + enable: "chooseToUse", + viewAs: { + name: "tuixinzhifu", + storage: { jsrgdanxin: true }, + }, + filterCard: true, + position: "hes", + precontent() { + player.addTempSkill("jsrgdanxin_effect"); + }, + subSkill: { + effect: { + audio: "jsrgdanxin", + trigger: { + global: "gainAfter", + }, + filter(event, player) { + const level = event.player != player ? 1 : 2; + if (event.player != player && event.getParent(level).name != "tuixinzhifu") return false; + if (event.player == player && event.getParent(level).name != "tuixinzhifu") return false; + const card = event.getParent(level + 1).card; + return card && card.storage && card.storage.jsrgdanxin; + }, + forced: true, + popup: false, + charlotte: true, + async content(event, trigger, player) { + const level = trigger.player != player ? 1 : 2; + const { targets } = trigger.getParent(level + 1); + await player.showCards(trigger.cards); + if (trigger.cards.some(card => get.suit(card) == "heart")) { + const owners = trigger.cards + .filter(card => get.suit(card) == "heart") + .map(card => get.owner(card)) + .toUniqued(); + for (const owner of owners) { + if (owner && owner.isIn()) await owner.recover(); + } + } + if (trigger.player == player) return; + player.addTempSkill("jsrgdanxin_distance"); + if (!player.storage.jsrgdanxin_distance) player.storage.jsrgdanxin_distance = {}; + const id = targets[0].playerid; + if (typeof player.storage.jsrgdanxin_distance[id] != "number") player.storage.jsrgdanxin_distance[id] = 0; + player.storage.jsrgdanxin_distance[id]++; + player.markSkill("jsrgdanxin_distance"); + }, + }, + distance: { + onremove: true, + charlotte: true, + mod: { + globalFrom(player, target, distance) { + if (!player.storage.jsrgdanxin_distance) return; + const dis = player.storage.jsrgdanxin_distance[target.playerid]; + if (typeof dis == "number") return distance + dis; + }, + }, + intro: { + content(storage, player) { + if (!storage) return; + const map = _status.connectMode ? lib.playerOL : game.playerMap; + let str = `你本回合:`; + for (const id in storage) { + str += "
  • 至" + get.translation(map[id]) + "的距离+" + storage[id]; + } + return str; + }, + }, + }, + }, + }, + jsrgfengxiang: { + audio: "fengxiang", + trigger: { player: "damageEnd" }, + forced: true, + direct: true, + filter(event, player) { + return game.hasPlayer(current => { + return current.countCards("e"); + }); + }, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "封乡:与一名其他角色交换装备区里的所有牌", + (card, player, target) => { + return target.countCards("e") + player.countCards("e") > 0 && player != target; + }, + true + ) + .set("ai", target => { + const player = get.player(); + const att = get.attitude(player, target); + let delta = get.value(target.getCards("e"), player) - get.value(player.getCards("e"), player); + if (att > 0) { + if (delta < 0) delta += att / 3; + } else { + if (delta < 0) delta -= att / 3; + } + return delta; + }); + if (bool) { + player.logSkill("jsrgfengxiang", targets[0]); + const num = player.countCards("e"); + await player.swapEquip(targets[0]); + const delta = num - player.countCards("e"); + if (delta > 0) player.draw(delta); + } + }, + }, + jsrgfuhai: { + audio: "xinfu_fuhai", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.hasPlayer(current => { + return current.countCards("h") && current != player; + }); + }, + filterTarget(card, player, target) { + return target.countCards("h") && target != player; + }, + selectTarget: -1, + multitarget: true, + multiline: true, + async content(event, trigger, player) { + const targets = event.targets.sortBySeat(); + const next = player + .chooseCardOL(targets, "请展示一张手牌", true) + .set("ai", card => { + return -get.value(card); + }) + .set("aiCard", target => { + const hs = target.getCards("h"); + return { bool: true, cards: [hs.randomGet()] }; + }); + next._args.remove("glow_result"); + const { result } = await next; + const cards = []; + const videoId = lib.status.videoId++; + for (let i = 0; i < targets.length; i++) { + cards.push(result[i].cards[0]); + game.log(targets[i], "展示了", result[i].cards[0]); + } + game.broadcastAll( + (targets, cards, id, player) => { + var dialog = ui.create.dialog(get.translation(player) + "发动了【浮海】", cards); + dialog.videoId = id; + const getName = target => { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + }; + for (let i = 0; i < targets.length; i++) { + dialog.buttons[i].querySelector(".info").innerHTML = getName(targets[i]) + "|" + get.strNumber(cards[i].number); + } + }, + targets, + cards, + videoId, + player + ); + await game.asyncDelay(4); + game.broadcastAll("closeDialog", videoId); + let clock = -1, + anticlock = -1; + for (let j = 0; j < 2; j++) { + let increase = -Infinity, + decrease = Infinity, + count = 0; + for (let i = 0; i < targets.length; i++) { + const number = get.number(cards[i], false); + let flag = false; + if (number > increase) { + increase = number; + flag = true; + } else increase = Infinity; + if (number < decrease) { + decrease = number; + flag = true; + } else decrease = -Infinity; + if (flag) count++; + else break; + } + targets.reverse(); + cards.reverse(); + if (j == 0) anticlock = Math.max(1, count); + else clock = Math.max(1, count); + } + const { + result: { index }, + } = await player + .chooseControl(`↖顺时针(${clock})`, `逆时针(${anticlock})↗`) + .set("prompt", "请选择一个方向,摸对应数量的牌") + .set("ai", () => get.event("choice")) + .set("choice", clock > anticlock ? 0 : 1); + player.draw(index == 0 ? clock : anticlock); + }, + ai: { + order: 8, + result: { player: 1 }, + }, + }, + //张嫙 + jsrgtongli: { + audio: "tongli", + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget) return false; + const type = get.type(event.card); + if (type != "basic" && type != "trick") return false; + const hs = player.getCards("h"); + if (!hs.length) return false; + const evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + const num1 = player.getHistory("useCard", evtx => { + return evtx.getParent("phaseUse") == evt; + }).length; + if (hs.length < num1) return false; + const list = []; + for (const i of hs) list.add(get.suit(i, player)); + return list.length == num1; + }, + prompt2(event, player) { + let str = "展示所有手牌,额外结算一次"; + if (event.card.name == "sha" && game.hasNature(event.card)) str += get.translation(event.card.nature); + return str + "【" + get.translation(event.card.name) + "】"; + }, + check(event, player) { + return !get.tag(event.card, "norepeat"); + }, + async content(event, trigger, player) { + await player.showHandcards(); + trigger.getParent().effectCount++; + }, + }, + jsrgshezang: { + audio: "shezang", + round: 1, + trigger: { global: "dying" }, + frequent: true, + filter(event, player) { + return event.player == player || player == _status.currentPhase; + }, + async content(event, trigger, player) { + const cards = get.cards(4); + game.cardsGotoOrdering(cards); + const videoId = lib.status.videoId++; + game.broadcastAll( + (player, id, cards) => { + let str = "奢葬"; + if (player == game.me && !_status.auto) { + str += ":获得任意张花色各不相同的牌"; + } + const dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + videoId, + cards + ); + const time = get.utc(); + game.addVideo("showCards", player, ["奢葬", get.cardsInfo(event.cards)]); + game.addVideo("delay", null, 2); + const list = []; + for (const i of cards) list.add(get.suit(i, false)); + const next = player.chooseButton([1, list.length]); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.suit(ui.selected.buttons[i].link) == get.suit(button.link)) return false; + } + return true; + }); + next.set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + const { result } = await next; + if (result.bool && result.links) { + const time2 = 1000 - (get.utc() - time); + if (time2 > 0) { + await game.asyncDelay(0, time2); + } + game.broadcastAll("closeDialog", videoId); + player.gain(result.links, "gain2"); + } + }, + }, + jsrgchiying: { + audio: "dcchiying", + enable: "phaseUse", + usable: 1, + filterTarget: true, + async content(event, trigger, player) { + const target = event.target; + const targets = game.filterPlayer(current => target.inRange(current) && current != player).sortBySeat(player); + if (!targets.length) return; + while (targets.length) { + const current = targets.shift(); + if (current.countCards("he")) await current.chooseToDiscard("驰应:请弃置一张牌", "he", true); + } + let cards = []; + game.getGlobalHistory("cardMove", evt => { + if (evt.getParent(3) == event) { + cards.addArray(evt.cards.filter(card => get.type(card) == "basic")); + } + }); + if (cards.length <= target.getHp()) { + cards = cards.filterInD("d"); + if (cards.length) target.gain(cards, "gain2"); + } + }, + ai: { + order: 6, + result: { + target(player, target) { + const targets = game.filterPlayer(current => target.inRange(current) && current != player); + let eff = 0; + for (const targetx of targets) { + let effx = get.effect(targetx, { name: "guohe_copy2" }, player, target); + if (get.attitude(player, targetx) < 0) effx /= 2; + eff += effx; + } + return eff * (get.attitude(player, target) <= 0 ? 0.75 : 1); + }, + }, + }, + }, + //郭照 + jsrgpianchong: { + audio: "pianchong", + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + return player.getHistory("lose").length; + }, + frequent: true, + async content(event, trigger, player) { + const { result } = await player.judge(); + let num = 0; + game.getGlobalHistory("cardMove", evt => { + if (evt.name != "cardsDiscard") { + if (evt.name != "lose" || evt.position != ui.discardPile) return false; + } + num += evt.cards.filter(i => get.color(i, false) == result.color).length; + }); + if (num > 0) player.draw(num); + }, + }, + jsrgzunwei: { + audio: "zunwei", + enable: "phaseUse", + usable: 1, + filter(event, player) { + const storage = player.getStorage("jsrgzunwei"); + return ( + storage.length < 3 && + game.hasPlayer(current => { + return (player.isDamaged() && current.getHp() > player.getHp() && !storage.includes(2)) || (current.countCards("h") > player.countCards("h") && !storage.includes(0)) || (current.countCards("e") > player.countCards("e") && !storage.includes(1)); + }) + ); + }, + chooseButton: { + dialog(event, player) { + const list = ["选择手牌数大于你的一名角色", "选择装备数大于你的一名角色", "选择体力值大于你的一名角色"]; + const choiceList = ui.create.dialog("尊位:请选择一项", "forcebutton", "hidden"); + choiceList.add([ + list.map((item, i) => { + if (player.getStorage("jsrgzunwei").includes(i)) item = `${item}`; + return [i, item]; + }), + "textbutton", + ]); + return choiceList; + }, + filter(button) { + const player = get.player(); + if (player.getStorage("jsrgzunwei").includes(button.link)) return false; + if (button.link == 2) { + if (!player.isDamaged()) return false; + return game.hasPlayer(current => { + return current.getHp() > player.getHp(); + }); + } + if (button.link == 0) { + return game.hasPlayer(current => { + return current.countCards("h") > player.countCards("h"); + }); + } + if (button.link == 1) { + return game.hasPlayer(current => { + return current.countCards("e") > player.countCards("e"); + }); + } + }, + backup(links) { + const next = get.copy(lib.skill.jsrgzunwei.backups[links[0]]); + next.audio = "zunwei"; + next.filterCard = function () { + return false; + }; + next.selectCard = -1; + return next; + }, + check(button) { + const player = get.player(); + switch (button.link) { + case 2: { + const target = game.findPlayer(function (current) { + return current.isMaxHp(); + }); + return (Math.min(target.hp, player.maxHp) - player.hp) * 2; + } + case 0: { + const target = game.findPlayer(function (current) { + return current.isMaxHandcard(); + }); + return Math.min(5, target.countCards("h") - player.countCards("h")) * 0.8; + } + case 1: { + const target = game.findPlayer(function (current) { + return current.isMaxEquip(); + }); + return (target.countCards("e") - player.countCards("e")) * 1.4; + } + } + }, + prompt(links) { + return ["选择一名手牌数大于你的其他角色,将手牌数摸至与其相同(至多摸五张)", "选择一名装备区内牌数大于你的其他角色,将其装备区里的牌移至你的装备区,直到你装备数不小于其", "选择一名体力值大于你的其他角色,将体力值回复至与其相同"][links[0]]; + }, + }, + backups: [ + { + filterTarget(card, player, target) { + return target.countCards("h") > player.countCards("h"); + }, + async content(event, trigger, player) { + player.draw(Math.min(5, event.target.countCards("h") - player.countCards("h"))); + if (!player.storage.jsrgzunwei) player.storage.jsrgzunwei = []; + player.storage.jsrgzunwei.add(0); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return Math.min(5, target.countCards("h") - player.countCards("h")); + }, + }, + }, + }, + { + filterTarget(card, player, target) { + return target.countCards("e") > player.countCards("e"); + }, + async content(event, trigger, player) { + if (!player.storage.jsrgzunwei) player.storage.jsrgzunwei = []; + player.storage.jsrgzunwei.add(1); + const target = event.target; + do { + if ( + !target.countCards("e", card => { + return player.canEquip(card); + }) + ) + break; + const { + result: { bool, links }, + } = await player + .chooseButton([`尊位:将${get.translation(target)}的一张装备牌移至你的区域内`, target.getCards("e")], true) + .set("filterButton", button => { + return get.player().canEquip(button.link); + }) + .set("ai", get.buttonValue); + if (bool) { + target.$give(links[0], player, false); + await player.equip(links[0]); + } + } while (player.countCards("e") < target.countCards("e")); + }, + ai: { + order: 10, + result: { + player(player, target) { + return target.countCards("e") - player.countCards("e"); + }, + }, + }, + }, + { + filterTarget(card, player, target) { + if (player.isHealthy()) return false; + return target.hp > player.hp; + }, + async content(event, trigger, player) { + player.recover(event.target.hp - player.hp); + if (!player.storage.jsrgzunwei) player.storage.jsrgzunwei = []; + player.storage.jsrgzunwei.add(2); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return Math.min(target.hp, player.maxHp) - player.hp; + }, + }, + }, + }, + ], + ai: { + order: 10, + result: { + player: 1, + }, + }, + subSkill: { + backup: {}, + }, + }, + //江山如故·转 + //404郭嘉 + jsrgqingzi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(current => { + if (current == player) return false; + return current.hasCard(card => { + return lib.filter.canBeDiscarded(card, player, current); + }, "e"); + }); + }, + derivation: "xinshensu", + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("jsrgqingzi"), "弃置任意名其他角色装备区里的一张牌,然后令这些角色获得〖神速〗直到你的下回合开始", [1, Infinity], (card, player, target) => { + return ( + target != player && + target.hasCard(card => { + return lib.filter.canBeDiscarded(card, player, target); + }, "e") + ); + }) + .set("ai", target => { + var player = _status.event.player; + return target.hasCard(card => { + return (lib.filter.canBeDiscarded(card, player, target) && get.value(card, target) > 3) || (target.hp == 1 && get.value(card, target) > 0); + }); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.slice(); + targets.sortBySeat(); + event.targets = targets; + event.num = 0; + player.logSkill("jsrgqingzi", targets); + player.addSkill("jsrgqingzi_clear"); + } else event.finish(); + "step 2"; + var target = targets[num]; + if ( + target.hasCard(card => { + return lib.filter.canBeDiscarded(card, player, target); + }, "e") + ) { + player.discardPlayerCard(target, "e", true); + target.addAdditionalSkills("jsrgqingzi_" + player.playerid, "xinshensu"); + player.markAuto("jsrgqingzi_clear", [target]); + } + event.num++; + if (event.num < targets.length) event.redo(); + }, + subSkill: { + clear: { + audio: "jsrgqingzi", + charlotte: true, + trigger: { + global: "die", + player: "phaseBegin", + }, + forced: true, + popup: false, + forceDie: true, + onremove: true, + filter: function (event, player) { + if (event.name == "die") { + return player == event.player || player.getStorage("jsrgqingzi_clear").includes(event.player); + } + return player.getStorage("jsrgqingzi_clear").length > 0; + }, + content: function () { + "step 0"; + var targets = player.getStorage("jsrgqingzi_clear"); + if (trigger.name == "die" && player == trigger.player) { + for (var target of targets) { + target.removeAdditionalSkill(`jsrgqingzi_${player.playerid}`); + } + player.removeSkill("jsrgqingzi_clear"); + event.finish(); + return; + } + if (trigger.name == "phase") event.targets = targets.slice(0).sortBySeat(); + else event.targets = [trigger.player]; + "step 1"; + var target = targets.shift(); + var storage = player.getStorage("jsrgqingzi_clear"); + if (storage.includes(target)) { + storage.remove(target); + target.removeAdditionalSkill(`jsrgqingzi_${player.playerid}`); + } + if (targets.length > 0) { + event.redo(); + } else if (!storage.length) { + player.removeSkill("jsrgqingzi_clear"); + } + }, + }, + }, + }, + jsrgdingce: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return player.hasCard(card => { + return lib.filter.cardDiscardable(card, player, "jsrgdingce"); + }); + }, + direct: true, + content: function () { + "step 0"; + var target = trigger.source; + event.target = target; + player + .chooseToDiscard(get.prompt("jsrgdingce", target), "弃置你与其的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。") + .set("ai", card => { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set( + "goon", + get.attitude(player, target) < 0 || + player + .getCards("h") + .concat(target.getCards("h")) + .filter(card => { + return get.value(card) < 5.5; + }).length >= 2 + ) + .set("logSkill", ["jsrgdingce", target]); + "step 1"; + if (result.bool) { + event.card = result.cards[0]; + if (target.countDiscardableCards(player, "h")) { + var next = player.discardPlayerCard(target, "h", true); + if (target == player) + next.set("ai", button => { + var card = button.link; + return (get.color(card, false) == _status.event.color ? 7.5 : 5) - get.value(card); + }).set("color", get.color(event.card, false)); + } else event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.cards[0]; + if (get.color(event.card, false) == get.color(card, false)) { + game.delayex(); + player.chooseUseTarget("dongzhuxianji", true); + } + } + }, + }, + jsrgzhenfeng: { + audio: 2, + enable: "phaseUse", + locked: false, + filter: function (event, player) { + if (!event.jsrgzhenfeng) return false; + return event.jsrgzhenfeng.some(info => + event.filterCard( + { + name: info[2], + nature: info[3], + storage: { jsrgzhenfeng: true }, + isCard: true, + }, + player, + event + ) + ); + }, + onChooseToUse: function (event) { + if (!event.jsrgzhenfeng && !game.online) { + var str = ""; + game.countPlayer(current => { + current.getSkills(null, false, false).forEach(skill => { + var info = get.info(skill); + if (!info || info.charlotte) return; + var translation = get.skillInfoTranslation(skill, current); + str += translation; + }); + }); + event.set("jsrgzhenfeng", lib.skill.jsrgzhenfeng.getInclusion(str, null, event.player)); + } + }, + getInclusion: function (str, checkCard, player) { + let list = []; + const names = Object.keys(lib.card); + for (const name of names) { + let type = get.type(name); + if (!["basic", "trick"].includes(type)) continue; + if (player && player.getStorage("jsrgzhenfeng_effect").includes(type)) continue; + const reg = `【${get.translation(name)}】`; + if (name == "sha") { + if (str.includes(reg)) { + if (checkCard && checkCard.name == name) return true; + list.push([type, "", name]); + } + for (let nature of lib.inpile_nature) { + const reg1 = `【${get.translation(nature) + get.translation(name)}】`, + reg2 = `${get.translation(nature)}【${get.translation(name)}】`; + if (str.includes(reg1) || str.includes(reg2)) { + if (checkCard && checkCard.name == name && checkCard.nature == nature) return true; + list.push([type, "", name, nature]); + } + } + } else { + if (!str.includes(reg)) continue; + if (checkCard && checkCard.name == name) return true; + list.push([type, "", name]); + } + } + if (checkCard) return false; + return list; + }, + chooseButton: { + dialog: function (event, player) { + var list = event.jsrgzhenfeng.filter(info => { + return event.filterCard( + { + name: info[2], + nature: info[3], + storage: { jsrgzhenfeng: true }, + isCard: true, + }, + player, + event + ); + }); + return ui.create.dialog("针锋", [list, "vcard"]); + }, + filter: function (button, player) { + return _status.event.getParent().filterCard( + { + name: button.link[2], + nature: button.link[3], + storage: { jsrgzhenfeng: true }, + isCard: true, + }, + player, + _status.event.getParent() + ); + }, + check: function (button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], + storage: { jsrgzhenfeng: true }, + isCard: true, + }; + var eff = player.getUseValue(card); + if (["wugu", "zhulu_card", "yiyi", "lulitongxin", "lianjunshengyan", "diaohulishan"].includes(button.link[2])) eff /= 5; + var info = get.info(card); + if (info.toself) { + var str = player + .getSkills(null, false, false) + .map(skill => { + var info = get.info(skill); + if (!info || info.charlotte) return; + return get.skillInfoTranslation(skill, player); + }) + .join("\n"); + if (lib.skill.jsrgzhenfeng.getInclusion(str, card)) eff += get.damageEffect(player, player, player); + } + return eff; + }, + backup: function (links, player) { + return { + audio: "jsrgzhenfeng", + filterCard: () => false, + selectCard: -1, + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + storage: { jsrgzhenfeng: true }, + isCard: true, + }, + precontent: function () { + delete event.result.skill; + player.logSkill("jsrgzhenfeng"); + event.getParent().addCount = false; + player.addTempSkill("jsrgzhenfeng_effect", "phaseUseAfter"); + player.markAuto("jsrgzhenfeng_effect", [get.type(event.result.card)]); + }, + }; + }, + prompt: function (links, player) { + return "视为使用一张" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]); + }, + }, + mod: { + cardUsable: function (card) { + if (card.storage && card.storage.jsrgzhenfeng) return Infinity; + }, + targetInRange: function (card) { + if (card.storage && card.storage.jsrgzhenfeng) return true; + }, + }, + ai: { + order: 1, + result: { + player: 1, + }, + }, + subSkill: { + effect: { + audio: "jsrgzhenfeng", + trigger: { + global: "useCardToBegin", + }, + charlotte: true, + forced: true, + onremove: true, + filter: function (event, player) { + if (!event.card.storage || !event.card.storage.jsrgzhenfeng) return false; + // debugger + var str = event.target + .getSkills(null, false, false) + .map(skill => { + var info = get.info(skill); + if (!info || info.charlotte) return; + return get.skillInfoTranslation(skill, event.target); + }) + .join("\n"); + return lib.skill.jsrgzhenfeng.getInclusion(str, event.card); + }, + logTarget: "target", + content: function () { + trigger.target.damage(); + }, + }, + }, + }, + //张飞 + jsrgbaohe: { + audio: 2, + trigger: { global: "phaseUseEnd" }, + filter: function (event, player) { + return ( + player.countCards("he") >= 2 && + game.hasPlayer(current => { + return current.inRange(event.player) && player.canUse("sha", current, false); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("jsrgbaohe"), 2, "he") + .set("ai", card => { + var val = _status.event.val; + if (val > 20) return 6 - get.value(card); + if (val > 0) return 4 - get.value(card); + return 0; + }) + .set( + "val", + game + .filterPlayer(current => { + return current.inRange(trigger.player) && player.canUse("sha", current, false); + }) + .map(i => get.effect(i, { name: "sha" }, player, player)) + .reduce((p, c) => { + return p + c; + }, 0) + ) + .set("logSkill", "jsrgbaohe"); + "step 1"; + if (result.bool) { + var targets = game.filterPlayer(current => { + return current.inRange(trigger.player) && player.canUse("sha", current, false); + }); + if (targets.length) { + game.delayex(); + player.useCard({ name: "sha", isCard: true, storage: { jsrgbaohe: true } }, targets, false); + player.addTempSkill("jsrgbaohe_add"); + } + } + }, + subSkill: { + add: { + audio: "jsrgbaohe", + trigger: { + global: "useCard", + }, + charlotte: true, + forced: true, + filter: function (event, player) { + let evt = event.getParent(3), + respondTo = event.respondTo; + if (evt.name != "useCard" || !Array.isArray(respondTo) || !respondTo[1].storage || !respondTo[1].storage.jsrgbaohe) return false; + return evt.targets.length > evt.num + 1; + }, + logTarget: function (event) { + let evt = event.getParent(3); + return evt.targets.slice(evt.num + 1); + }, + content: function () { + "step 0"; + var evt = trigger.getParent(3); + var targets = evt.targets.slice(evt.num + 1); + var map = evt.customArgs; + for (var target of targets) { + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") { + map[id].extraDamage = 0; + } + map[id].extraDamage++; + } + game.delayx(); + }, + }, + }, + }, + jsrgxushi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + selectTarget: [1, Infinity], + position: "he", + filterOk: function () { + return ui.selected.cards.length == ui.selected.targets.length; + }, + check: function (card) { + var player = get.player(); + if ( + ui.selected.cards.length >= + game.countPlayer(current => { + return current != player && get.attitude(player, current) > 0; + }) + ) + return 0; + return 5 - get.value(card); + }, + prompt: "按顺序选择卡牌和角色,并将卡牌交给对应顺序的角色。然后你获得两倍数量的【影】。", + complexSelect: true, + multitarget: true, + multiline: true, + discard: false, + lose: false, + delay: false, + contentBefore: function () { + event.getParent()._jsrgxushi_targets = targets.slice(); + }, + content: function () { + "step 0"; + var targets = event.getParent()._jsrgxushi_targets; + var list = []; + for (var i = 0; i < targets.length; i++) { + var target = targets[i]; + var card = cards[i]; + list.push([target, card]); + player.line(target); + } + game.loseAsync({ + gain_list: list, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + "step 1"; + player.gain(lib.card.ying.getYing(2 * cards.length), "gain2"); + }, + ai: { + order: 2.5, + result: { + target: function (player, target) { + var card = ui.selected.cards[ui.selected.targets.length]; + if (!card) return 0; + if (get.value(card) < 0) return -1; + if (get.value(card) < 1.5 && player.hasSkill("jsrgbaohe")) return (get.sgnAttitude(player, target) + 0.01) / 5; + return Math.sqrt(5 - Math.min(4, target.countCards("h"))); + }, + }, + }, + }, + jsrgzhuiming: { + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return event.isFirstTarget && event.targets.length == 1 && event.target.isIn(); + }, + direct: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger, + target = trigger.target; + var colors = Object.keys(lib.color).remove("none"); + var result = yield player + .chooseControl(colors, "cancel2") + .set("prompt", get.prompt("jsrgzhuiming")) + .set("prompt2", `声明一种颜色并令${get.translation(trigger.target)}弃置任意张牌`) + .set("ai", () => { + var player = get.player(), + target = get.event("target"), + att = get.attitude(player, target) > 0 ? 1 : -1; + var list = get + .event("controls") + .map(i => [ + i, + target + .getCards("he") + .map(get.value) + .reduce((p, c) => p + c, 0), + ]) + .sort((a, b) => { + return att * (a[1] - b[1]); + }); + return list[0][0]; + }) + .set("target", target); + var color = result.control; + if (color == "cancel2") { + event.finish(); + return; + } + player.logSkill("jsrgzhuiming", target); + player.popup(color, color == "red" ? "fire" : "thunder"); + game.log(player, "声明了", color); + var prompt = `追命:${get.translation(player)}声明了${get.translation(color)}`, + prompt2 = `请弃置任意张牌,然后其展示你一张牌,若此牌颜色为${get.translation(color)},此【杀】不计入次数限制、不可被响应且伤害+1`; + yield target + .chooseToDiscard(prompt, prompt2, [1, Infinity], "he", true) + .set("ai", card => { + var color = get.event("color"), + player = get.player(); + if (get.position(card) == "e" && get.color(card) == color) return 2; + if (player.getHp() <= 2 && get.color(card) == color) return Math.random() < 0.5; + return 0; + }) + .set("color", color); + if (target.countCards("he")) + result = yield player + .choosePlayerCard(target, "he", true) + .set("ai", button => { + var color = get.event("color"), + att = get.event("att"); + if (get.position(button.link) == "e" && get.color(button.link) == color) { + return 100 * att; + } + return 1 + Math.random(); + }) + .set("color", color) + .set("att", get.attitude(player, target) > 0 ? 1 : -1); + else { + event.finish(); + return; + } + var card = result.cards[0]; + player.showCards(card, `${get.translation(target)}因【追命】被展示`); + if (get.color(card) == color) { + trigger.directHit.addArray(game.players); + var evt = trigger.getParent(); + if (evt.addCount !== false) { + evt.addCount = false; + player.getStat().card.sha--; + } + var map = trigger.getParent().customArgs; + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") { + map[id].extraDamage = 0; + } + map[id].extraDamage++; + game.log(trigger.card, "不计入次数限制、不可被响应、伤害+1"); + } + }, + }, + //娄圭 + jsrgshacheng: { + audio: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return event.targets.some(i => i.isIn() && i.hasHistory("lose", evt => evt.cards2.length)) && player.getExpansions("jsrgshacheng").length; + }, + direct: true, + group: "jsrgshacheng_build", + content: function () { + "step 0"; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + var targets = trigger.targets.filter(i => i.isIn() && i.hasHistory("lose", evt => evt.cards2.length)); + player + .chooseTarget(get.prompt("jsrgshacheng"), "令一名目标角色摸X张牌,然后移去一张“城”(X为对应角色本回合失去过的牌数且至多为5)", (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("targets", targets) + .set("ai", target => { + return target == get.event("targetx") ? 1 : 0; + }) + .set( + "targetx", + (() => { + let info = []; + targets.filter(target => { + let att = get.attitude(player, target); + if (att <= 0) return false; + if (Math.abs(att) > 1) att = Math.sign(att) * Math.sqrt(Math.abs(att)); + info.push([ + target, + att * + target + .getHistory("lose") + .map(evt => evt.cards2.length) + .reduce((p, c) => p + c, 0), + ]); + return false; + }); + if (!info.length) return null; + info = info.sort((a, b) => { + return b[1] - a[1]; + })[0]; + if (info[1] <= 0) return null; + return info[0]; + })() + ); + "step 1"; + if (result.bool) { + event.target = result.targets[0]; + var cards = player.getExpansions("jsrgshacheng"); + if (cards.length == 1) event._result = { bool: true, links: cards }; + else player.chooseButton([`沙城:移去一张“城”`, cards], true); + } else { + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + event.finish(); + } + "step 2"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (result.bool) { + player.logSkill("jsrgshacheng", target); + player.loseToDiscardpile(result.links); + target.draw( + Math.min( + 5, + target + .getHistory("lose") + .map(evt => evt.cards2.length) + .reduce((p, c) => p + c, 0) + ) + ); + } + }, + marktext: "城", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + subSkill: { + build: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + var cards = get.cards(2); + player.addToExpansion(cards, "gain2").gaintag.add("jsrgshacheng"); + }, + }, + }, + }, + jsrgninghan: { + audio: 2, + init: player => { + game.addGlobalSkill("jsrgninghan_frozen"); + }, + onremove: player => { + if (!game.hasPlayer(current => current.hasSkill("jsrgninghan"), true)) game.removeGlobalSkill("jsrgninghan_frozen"); + }, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (!event.hasNature("ice")) return false; + return event.cards && event.cards.filterInD().length; + }, + forced: true, + content: function () { + var cards = trigger.cards.filterInD(); + player.addToExpansion(cards, "gain2").gaintag.add("jsrgshacheng"); + }, + subSkill: { + frozen: { + mod: { + cardnature: function (card, player) { + if (card.name === "sha" && get.suit(card) === "club") return "ice"; + }, + aiOrder: (player, card, num) => { + if (num && card.name === "sha" && game.hasNature(card, "ice")) { + let lg = game.findPlayer(current => current.hasSkill("jsrgninghan")); + if (lg) return num + 0.15 * Math.sign(get.attitude(player, lg)); + } + }, + }, + trigger: { player: "dieAfter" }, + filter: (event, player) => { + return !game.hasPlayer(current => !current.hasSkill("jsrgninghan"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("jsrgninghan_frozen"); + }, + }, + }, + ai: { + combo: "jsrgshacheng", + }, + }, + //张任 + jsrgfuni: { + audio: 2, + trigger: { global: "roundStart" }, + group: ["jsrgfuni_unlimit", "jsrgfuni_zero"], + forced: true, + direct: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + var count = Math.ceil(game.countPlayer() / 2); + var result = yield player.chooseTarget(`伏匿:请选择至多${get.cnNumber(count)}名角色`, `令这些角色获得共计${get.cnNumber(count)}张【影】`, true, [1, count]).set("ai", target => { + return get.attitude(get.player(), target) + get.event().getRand(target.playerid); + }); + if (result.bool) { + var targets = result.targets.slice().sortBySeat(_status.currentPhase); + player.logSkill("jsrgfuni", targets); + } else event.finish(); + yield null; + var num = count / targets.length; + if (num == 1 || num == count) { + result = { + bool: true, + links: targets.map(current => { + return `${num}|${current.playerid}`; + }), + }; + } else { + var dialog = ["伏匿:选择每名角色要获得的【影】数"]; + var len = count - targets.length + 1; + for (var target of targets) { + dialog.addArray([ + `
    ${get.translation(target)}
    `, + [ + Array.from({ length: len }).map((_, i) => { + return [`${i + 1}|${target.playerid}`, get.cnNumber(i + 1, true)]; + }), + "tdnodes", + ], + ]); + } + result = yield player + .chooseButton(dialog, true) + .set("filterButton", button => { + var total = 0, + info = button.link.split("|"); + var numFix = 0; + for (var buttonx of ui.selected.buttons) { + var infox = buttonx.link.split("|"); + var num = parseInt(infox[0]); + total += num; + if (infox[1] == info[1]) numFix = num; + } + return total + parseInt(info[0]) - numFix <= get.event("count"); + }) + .set("count", count) + .set("filterOk", () => { + var total = 0; + for (var buttonx of ui.selected.buttons) { + total += parseInt(buttonx.link.split("|")[0]); + } + return total == get.event("count"); + }) + .set("selectButton", () => { + return [get.event("len"), Math.max(get.event("len"), ui.selected.buttons.length) + 1]; + }) + .set("len", targets.length) + .set("custom", { + add: {}, + replace: { + button: function (button) { + if (!_status.event.isMine()) return; + if (button.classList.contains("selectable") == false) return; + if (button.classList.contains("selected")) { + ui.selected.buttons.remove(button); + button.classList.remove("selected"); + if (_status.multitarget || _status.event.complexSelect) { + game.uncheck(); + game.check(); + } + } else { + var current = button.parentNode.querySelector(".selected"); + if (current) { + ui.selected.buttons.remove(current); + current.classList.remove("selected"); + } + button.classList.add("selected"); + ui.selected.buttons.add(button); + } + game.check(); + }, + }, + }) + .set("processAI", () => { + return get.event("aiResult"); + }) + .set( + "aiResult", + (() => { + var result = targets.map(i => { + return [i == player ? 2 : 1, i.playerid]; + }); + var rest = count - targets.length - 1; + while (rest--) result[Math.floor(Math.random() * result.length)][0]++; + return { + bool: true, + links: result.map(i => `${i[0]}|${i[1]}`), + }; + })() + ); + } + if (result.bool) { + var links = result.links; + var list = []; + for (var link of links) { + var info = link.split("|"); + var id = info[1]; + var target = (_status.connectMode ? lib.playerOL : game.playerMap)[id]; + player.line(target); + var yings = lib.card.ying.getYing(parseInt(info[0])); + list.push([target, yings]); + game.log(target, "获得了", yings); + } + game.loseAsync({ + gain_list: list, + animate: "gain2", + }).setContent("gaincardMultiple"); + } + }, + subSkill: { + zero: { + priority: Infinity, + mod: { + attackRange: () => 0, + }, + }, + unlimit: { + audio: "jsrgfuni", + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter"], + }, + filter: function (event, player) { + return event.getd().some(i => get.name(i, false) == "ying"); + }, + forced: true, + content: function () { + player.addTempSkill("jsrgfuni_buff"); + }, + }, + buff: { + charlotte: true, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + content: function () { + trigger.directHit.addArray(game.players); + game.log(trigger.card, "不可被响应"); + }, + mark: true, + intro: { + content: "使用牌无距离限制且不能被响应", + }, + mod: { + targetInRange: () => true, + }, + }, + }, + ai: { + expose: 0.15, + halfneg: true, + }, + }, + jsrgchuanxin: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + player.countCards("hes") && + game.hasPlayer(current => + player.canUse( + { + name: "sha", + storage: { jsrgchuanxin: true }, + }, + current + ) + ) + ); + }, + direct: true, + content: function () { + var next = player.chooseToUse(); + next.set("openskilldialog", `###${get.prompt("jsrgchuanxin")}###将一张牌当【杀】使用,且当一名角色受到此【杀】伤害时,此伤害+X(X为其本回合回复过的体力值)。`); + next.set("norestore", true); + next.set("_backupevent", "jsrgchuanxin_backup"); + next.set("addCount", false); + next.set("logSkill", "jsrgchuanxin"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("jsrgchuanxin_backup"); + }, + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card"; + }, + viewAs: { + name: "sha", + storage: { jsrgchuanxin: true }, + }, + selectCard: 1, + position: "hes", + ai1: function (card) { + var player = get.player(); + var maxVal = 5.5; + if (get.name(card, false) == "ying" && player.hasSkill("jsrgchuanxin")) maxVal -= 3; + return maxVal - get.value(card); + }, + precontent: function () { + delete event.result.skill; + player.addTempSkill("jsrgchuanxin_add"); + }, + }, + add: { + trigger: { global: "damageBegin3" }, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.jsrgchuanxin) return false; + if (event.getParent().type != "card") return false; + return game.hasGlobalHistory("changeHp", evt => { + return evt.getParent().name == "recover" && evt.player == event.player; + }); + }, + forced: true, + charlotte: true, + content: function () { + var num = game + .getGlobalHistory("changeHp", evt => { + return evt.getParent().name == "recover" && evt.player == trigger.player; + }) + .map(evt => evt.num) + .reduce((p, c) => p + c, 0); + trigger.num += num; + game.log(trigger.card, "的伤害+" + num); + }, + }, + }, + }, + //黄忠 + jsrgcuifeng: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + locked: false, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if (!info || info.notarget || (info.selectTarget && info.selectTarget != 1) || !get.tag({ name: name }, "damage")) continue; + if (name == "sha") { + list.push(["基本", "", "sha"]); + for (var nature of lib.inpile_nature) list.push(["基本", "", name, nature]); + } else if (get.type(name) == "trick") list.push(["锦囊", "", name]); + else if (get.type(name) == "basic") 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], + isCard: true, + storage: { jsrgcuifeng: true }, + }, + player, + _status.event.getParent() + ); + }, + check: function (button) { + var player = _status.event.player; + var effect = player.getUseValue({ + name: button.link[2], + nature: button.link[3], + storage: { jsrgcuifeng: true }, + }); + if (effect > 0) return effect; + return 0; + }, + backup: function (links, player) { + return { + audio: "jsrgcuifeng", + selectCard: -1, + filterCard: () => false, + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + storage: { jsrgcuifeng: true }, + }, + precontent: function () { + player.logSkill("jsrgcuifeng"); + player.awakenSkill("jsrgcuifeng"); + delete event.result.skill; + if (!player.storage.jsrgcuifeng_check) + player + .when("phaseEnd") + .then(() => { + var num = 0; + player.checkHistory("sourceDamage", evt => { + if (evt.card.storage.jsrgcuifeng) num += evt.num; + }); + if (num == 0 || num > 1) { + player.restoreSkill("jsrgcuifeng"); + game.log(player, "重置了", "#g【摧锋】"); + } + delete player.storage.jsrgcuifeng_check; + }) + .translation("摧锋"); + player.setStorage("jsrgcuifeng_check", true); + }, + }; + }, + prompt: function (links, player) { + return "请选择" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "的目标"; + }, + }, + mod: { + targetInRange: card => { + if (card.storage && card.storage.jsrgcuifeng) return true; + }, + }, + ai: { + order: 1.9, + result: { + player: 1, + }, + }, + }, + jsrgdengnan: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if (!info || info.type != "trick" || info.notarget || get.tag({ name: name }, "damage")) continue; + list.push(["锦囊", "", name]); + } + return ui.create.dialog("登难", [list, "vcard"]); + }, + filter: function (button, player) { + return _status.event.getParent().filterCard({ name: button.link[2], isCard: true }, player, _status.event.getParent()); + }, + check: function (button) { + var player = _status.event.player; + return player.getUseValue(button.link[2]); + }, + backup: function (links, player) { + return { + audio: "jsrgdengnan", + selectCard: -1, + filterCard: () => false, + popname: true, + viewAs: { + name: links[0][2], + isCard: true, + storage: { jsrgdengnan: true }, + }, + precontent: function () { + player.logSkill("jsrgdengnan"); + player.awakenSkill("jsrgdengnan"); + delete event.result.skill; + if (!player.storage.jsrgdengnan_check) + player + .when("phaseEnd") + .then(() => { + var targets = []; + player.checkHistory("useCard", evt => { + if (evt.card.storage.jsrgdengnan) targets.addArray(evt.targets); + }); + if ( + targets.every(current => { + return current.hasHistory("damage"); + }) + ) { + player.restoreSkill("jsrgdengnan"); + game.log(player, "重置了", "#g【登难】"); + } + delete player.storage.jsrgdengnan_check; + }) + .translation("登难"); + player.setStorage("jsrgdengnan_check", true); + }, + }; + }, + prompt: function (links, player) { + return "请选择" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "的目标"; + }, + }, + ai: { + order: 2, + result: { + player: 1, + }, + }, + }, + //夏侯荣 + jsrgfenjian: { + audio: 2, + enable: "chooseToUse", + locked: false, + filter: function (event, player) { + return ["juedou", "tao"].some(name => { + return ( + !player.getStorage("jsrgfenjian_used").includes(name) && + event.filterCard( + { + name: name, + isCard: true, + storage: { jsrgfenjian: true }, + }, + player, + event + ) + ); + }); + }, + hiddenCard: function (player, name) { + if (["juedou", "tao"].some(i => i == name && !player.getStorage("jsrgfenjian_used").includes(name))) return true; + return false; + }, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("奋剑", [["juedou", "tao"].filter(name => !player.getStorage("jsrgfenjian_used").includes(name)), "vcard"]); + dialog.direct = true; + return dialog; + }, + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard( + { + name: button.link[2], + isCard: true, + storage: { jsrgfenjian: true }, + }, + player, + evt + ); + }, + check: function (button) { + if (button.link[2] === "tao") { + let dying = _status.event.getParent(2).dying; + if (dying) + return get.effect( + dying, + { + name: "tao", + isCard: true, + storage: { jsrgfenjian: true }, + }, + _status.event.player + ); + } + return _status.event.player.getUseValue({ + name: button.link[2], + isCard: true, + storage: { jsrgfenjian: true }, + }); + }, + backup: function (links) { + return { + audio: "jsrgfenjian", + viewAs: { + name: links[0][2], + isCard: true, + storage: { jsrgfenjian: true }, + }, + filterCard: () => false, + selectCard: -1, + precontent: function () { + player.logSkill("jsrgfenjian"); + delete event.result.skill; + player.addTempSkill("jsrgfenjian_effect"); + player.addMark("jsrgfenjian_effect", 1, false); + if (!player.storage.jsrgfenjian_used) + player.when({ global: "phaseAfter" }).then(() => { + delete player.storage.jsrgfenjian_used; + }); + player.markAuto("jsrgfenjian_used", [event.result.card.name]); + }, + }; + }, + prompt: function (links) { + return "奋剑:令你本回合受到的伤害+1,视为使用" + get.translation(links[0][2]); + }, + }, + mod: { + targetEnabled: function (card, player, target) { + if (player == target && card.storage && card.storage.jsrgfenjian) return false; + }, + }, + ai: { + order: function (item, player) { + return Math.max(get.order({ name: "juedou" }), get.order({ name: "tao" })) + 0.2; + }, + result: { + player: player => { + if (_status.event.dying) return 2 * get.sgnAttitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { + effect: { + audio: "jsrgfenjian", + charlotte: true, + trigger: { player: "damageBegin3" }, + forced: true, + onremove: true, + content: function () { + trigger.num += player.countMark("jsrgfenjian_effect"); + }, + intro: { content: "本回合受到的伤害+#" }, + }, + }, + }, + //孙尚香 + jsrgguiji: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("jsrgguiji_used")) return false; + return game.hasPlayer(current => lib.skill.jsrgguiji.filterTarget("keiki", player, current)); + }, + filterTarget: function (card, player, target) { + return target.countCards("h") < player.countCards("h") && target.hasSex("male"); + }, + content: function () { + "step 0"; + player.swapHandcards(target); + player.addSkill("jsrgguiji_swapback"); + player.markAuto("jsrgguiji_swapback", target); + player.addTempSkill("jsrgguiji_used"); + }, + ai: { + order: 6, + result: { + target: function (player, target) { + var val = player + .getCards("h") + .map(i => get.value(i)) + .reduce((p, c) => p + c, 0); + var val2 = target + .getCards("h") + .map(i => get.value(i)) + .reduce((p, c) => p + c, 0); + return val - val2; + }, + }, + }, + subSkill: { + used: { charlotte: true }, + swapback: { + audio: "jsrgguiji", + trigger: { + global: ["phaseUseEnd", "dieAfter"], + }, + filter: function (event, player) { + return player.getStorage("jsrgguiji_swapback").includes(event.player); + }, + charlotte: true, + direct: true, + check: function (event, player) { + return ( + player + .getCards("h") + .map(i => get.value(i)) + .reduce((p, c) => p + c, 0) < + event.player + .getCards("h") + .map(i => get.value(i)) + .reduce((p, c) => p + c, 0) + + 4 * Math.random() + ); + }, + content: function () { + "step 0"; + if (trigger.name == "phaseUse") { + player + .chooseBool(get.prompt("jsrgguiji_swapback", trigger.player), "与其交换手牌。") + .set("ai", () => { + return get.event("bool"); + }) + .set("bool", lib.skill.jsrgguiji_swapback.check(trigger, player) > 0); + } else { + player.unmarkAuto("jsrgguiji_swapback", [trigger.player]); + event.finish(); + } + "step 1"; + if (result.bool) { + player.logSkill("jsrgguiji_swapback", trigger.player); + player.swapHandcards(trigger.player); + } + player.unmarkAuto("jsrgguiji_swapback", [trigger.player]); + }, + intro: { + content: "$的下个出牌阶段结束时,你可以与其交换手牌", + }, + }, + }, + }, + jsrgjiaohao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return [1, 2, 3, 4, 5].some(i => player.countEmptySlot(i)); + }, + forced: true, + locked: false, + global: "jsrgjiaohao_g", + content: function () { + "step 0"; + var count = Math.ceil([1, 2, 3, 4, 5].map(i => player.countEmptySlot(i)).reduce((p, c) => p + c, 0) / 2); + player.gain(lib.card.ying.getYing(count), "gain2"); + }, + subSkill: { + g: { + audio: "jsrgjiaohao", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => { + if (current == player || !current.hasSkill("jsrgjiaohao")) return false; + return player.hasCard(card => { + return get.type(card) == "equip" && current.canEquip(card); + }); + }); + }, + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + return target != player && target.hasSkill("jsrgjiaohao") && target.canEquip(card); + }, + selectTarget: function () { + var num = game.countPlayer(current => { + return current.hasSkill("jsrgjiaohao"); + }); + return num > 1 ? 1 : -1; + }, + filterCard: function (card) { + return get.type(card) == "equip"; + }, + check: function (card) { + var player = get.player(); + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); + } + return 6 - get.value(card); + }, + prompt: function () { + var list = game.filterPlayer(current => { + return current.hasSkill("jsrgjiaohao"); + }); + return `将一张装备牌置于${get.translation(list)}${list.length > 1 ? "中的一人" : ""}的装备区`; + }, + discard: false, + lose: false, + prepare: function (cards, player, targets) { + player.$give(cards, targets[0], false); + }, + content: function () { + target.equip(cards[0]); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + var card = ui.selected.cards[0]; + if (card) return get.effect(target, card, target, target); + return 0; + }, + }, + }, + }, + }, + }, + //庞统 + jsrgmanjuan: { + audio: 2, + trigger: { + player: "loseEnd", + global: ["equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd"], + }, + filter: function (event, player) { + return (player.countCards("h") == 0) ^ player.hasSkill("jsrgmanjuan_in"); + }, + forced: true, + locked: false, + firstDo: true, + silent: true, + content: function () { + "step 0"; + if (!player.countCards("h")) { + var cards = []; + game.checkGlobalHistory("cardMove", evt => { + if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") { + cards.addArray(evt.cards.filterInD("d")); + } + }); + var cardsx = cards.map(card => { + var cardx = ui.create.card(); + cardx.init(get.cardInfo(card)); + cardx._cardid = card.cardid; + return cardx; + }); + player.directgains(cardsx, null, "jsrgmanjuan"); + player.addSkill("jsrgmanjuan_in"); + } else { + player.removeSkill("jsrgmanjuan_in"); + } + }, + subSkill: { + in: { + audio: "jsrgmanjuan", + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], + }, + forced: true, + locked: false, + silent: true, + filter: function (event, player) { + var cards = event.getd(); + return cards.length; + }, + onremove: function (player) { + var cards2 = player.getCards("s", card => { + return card.hasGaintag("jsrgmanjuan"); + }); + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards2, + player + ); + } + cards2.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + group: ["jsrgmanjuan_use", "jsrgmanjuan_lose"], + content: function () { + var cards = []; + var idList = player.getCards("s", card => card.hasGaintag("jsrgmanjuan")).map(i => i._cardid); + game.checkGlobalHistory("cardMove", evt => { + if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") { + cards.addArray(evt.cards.filter(i => get.position(i, true) == "d" && !idList.includes(i.cardid))); + } + }); + var cards2 = cards.map(card => { + var cardx = ui.create.card(); + cardx.init(get.cardInfo(card)); + cardx._cardid = card.cardid; + return cardx; + }); + player.directgains(cards2, null, "jsrgmanjuan"); + }, + mod: { + cardEnabled2: function (card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("jsrgmanjuan") && player.getStorage("jsrgmanjuan_used").includes(get.number(card, false))) return false; + }, + }, + }, + use: { + trigger: { + player: ["useCardBefore", "respondBefore"], + }, + charlotte: true, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + var cards = player.getCards("s", card => card.hasGaintag("jsrgmanjuan") && card._cardid); + return ( + event.cards && + event.cards.some(card => { + return cards.includes(card); + }) + ); + }, + content: function () { + var idList = player.getCards("s", card => card.hasGaintag("jsrgmanjuan")).map(i => i._cardid); + var cards = []; + game.checkGlobalHistory("cardMove", evt => { + if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") { + cards.addArray(evt.cards.filter(i => idList.includes(i.cardid))); + } + }); + var cards2 = []; + for (var card of trigger.cards) { + var cardx = cards.find(cardx => cardx.cardid == card._cardid); + if (cardx) cards2.push(cardx); + } + var cards3 = trigger.cards.slice(); + trigger.cards = cards2; + trigger.card.cards = cards2; + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards3, + player + ); + } + cards3.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + if (!player.storage.jsrgmanjuan_used) { + player.when({ global: "phaseAfter" }).then(() => { + delete player.storage.jsrgmanjuan_used; + }); + } + player.markAuto( + "jsrgmanjuan_used", + cards3.map(card => get.number(card, false)) + ); + }, + }, + lose: { + trigger: { + global: ["loseEnd", "equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd", "cardsGotoOrderingBegin", "phaseAfter"], + }, + charlotte: true, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (event.name == "phase") return true; + var idList = player.getCards("s", card => card.hasGaintag("jsrgmanjuan")).map(i => i._cardid); + return ( + event.cards && + event.cards.some(card => { + return idList.includes(card.cardid); + }) + ); + }, + content: function () { + var cards2; + if (trigger.name == "phase") { + cards2 = player.getCards("s", card => { + return card.hasGaintag("jsrgmanjuan"); + }); + } else { + var idList = []; + game.checkGlobalHistory("cardMove", evt => { + if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") { + idList.addArray(evt.cards.filter(i => get.position(i, true) == "d").map(i => i.cardid)); + } + }); + cards2 = player.getCards("s", card => { + return card.hasGaintag("jsrgmanjuan") && !idList.includes(card._cardid); + }); + } + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards2, + player + ); + } + cards2.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + }, + }, + }, + jsrgyangming: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => { + return player.canCompare(current); + }); + }, + filterTarget: function (card, player, current) { + return player.canCompare(current); + }, + content: function () { + "step 0"; + event.num = 0; + "step 1"; + player.chooseToCompare(target).set( + "small", + get.attitude(player, target) > 0 && + (player.countCards("h", card => { + return get.value(card) < 6; + }) <= 1 || + target.countCards("h", card => { + return get.value(card) < 6; + }) <= 1) + ); + "step 2"; + if (result.winner != target) { + if (!player.canCompare(target)) event._result = { bool: false }; + else + player + .chooseBool("是否与其重复此拼点流程?") + .set("ai", () => get.event("bool")) + .set("bool", get.effect(target, "jsrgyangming", player, player) > 0); + event.num++; + } else { + if (event.num) target.draw(event.num); + player.recover(); + event.finish(); + } + "step 3"; + if (result.bool) { + event.goto(1); + } + }, + ai: { + order: 1, + expose: 0.15, + result: { + target: function (player, target) { + var maxnum = 0; + var cards2 = target.getCards("h"); + for (var i = 0; i < cards2.length; i++) { + if (get.number(cards2[i]) > maxnum) { + maxnum = get.number(cards2[i]); + } + } + if (maxnum > 10) maxnum = 10; + if (maxnum < 5 && cards2.length > 1) maxnum = 5; + var cards = player.getCards("h"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) < maxnum) return 1; + } + return 0; + }, + }, + }, + }, + //韩遂 + jsrgniluan: { + audio: "niluan", + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + var damaged = game.filterPlayer(current => { + return current.hasAllHistory("sourceDamage", evt => evt.player == player); + }); + var undamaged = game.filterPlayer().removeArray(damaged); + player.chooseCardTarget({ + prompt: get.prompt("jsrgniluan"), + prompt2: `${undamaged.length ? "选择一张牌弃置并选择一名未对你造成过伤害的角色,你对其造成1点伤害" : ""}${undamaged.length && damaged.length ? ";
    或" : ""}${damaged.length ? "仅选择一名对你造成过伤害的角色,你令其摸两张牌" : ""}。`, + damaged: damaged, + aiTarget: (() => { + if ( + undamaged.includes(player) && + !undamaged.some(i => { + if (i === player) return false; + let att = get.attitude(player, i); + if (att > 0) return true; + return att < 0 && i.getHp(true) + i.hujia < 2; + }) && + (player.hp > 2 || get.damageEffect(player, player, player) >= 0) + ) + return player; + var info = game + .filterPlayer() + .map(current => { + let damage = undamaged.includes(current), + card = { name: damage ? "damage" : "draw" }; + return [current, get.effect(current, card, player, player) * (damage ? 0.7 : 2)]; + }) + .sort((a, b) => b[1] - a[1])[0]; + if (info[1] > 0) return info[0]; + return null; + })(), + filterCard: lib.filter.cardDiscardable, + selectCard: function () { + if (get.event("damaged").length == 0) return 1; + if (get.event("damaged").length == game.countPlayer()) return 0; + return [0, 1]; + }, + position: "he", + filterTarget: function (card, player, target) { + var damaged = get.event("damaged"); + return damaged.includes(target) ^ (ui.selected.cards.length > 0); + }, + selectTarget: 1, + ai1: function (card) { + if (get.event("damaged").includes(get.event("aiTarget"))) return 0; + return 6 - get.value(card); + }, + ai2: function (target) { + return target == get.event("aiTarget") ? 10 : 0; + }, + }); + "step 1"; + if (result.bool) { + var cards = result.cards, + target = result.targets[0]; + player.logSkill("jsrgniluan", target); + if (cards && cards.length) { + player.discard(cards); + game.delayex(); + target.damage(); + } else { + target.draw(2); + } + } + }, + }, + jsrghuchou: { + audio: 2, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + const history = _status.globalHistory; + for (let i = history.length - 1; i >= 0; i--) { + let evts = history[i]["useCard"]; + for (let j = evts.length - 1; j >= 0; j--) { + var evt = evts[j]; + let card = evt.card, + targets = evt.targets; + if (!get.tag(card, "damage") || !targets.includes(player)) continue; + return event.player == evt.player; + } + } + return false; + }, + forced: true, + content: function () { + trigger.num++; + }, + ai: { + damageBonus: true, + skillTagFilter: (player, tag, arg) => { + if (tag === "damageBonus" && arg && arg.target) { + const history = _status.globalHistory; + for (let i = history.length - 1; i >= 0; i--) { + let evts = history[i]["useCard"]; + for (let j = evts.length - 1; j >= 0; j--) { + var evt = evts[j]; + let card = evt.card, + targets = evt.targets; + if (!get.tag(card, "damage") || !targets.includes(player)) continue; + return arg.target === evt.player; + } + } + return false; + } + }, + effect: { + player: (card, player, target) => { + if ( + get.tag(card, "damage") && + target && + lib.skill.jsrghuchou.ai.skillTagFilter(player, "damageBonus", { + card: card, + target: target, + }) && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ) + return [1, 0, 2, 0]; + }, + }, + }, + }, + jsrgjiemeng: { + audio: 2, + zhuSkill: true, + forced: true, + init: () => { + game.addGlobalSkill("jsrgjiemeng_effect"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("jsrgjiemeng"), true)) game.removeGlobalSkill("jsrgjiemeng_effect"); + }, + subSkill: { + effect: { + mod: { + globalFrom: function (from, to, distance) { + if (from.group != "qun") return; + if (to.hasZhuSkill("jsrgjiemeng")) return; + return distance - game.countPlayer(current => current.group == "qun"); + }, + }, + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("jsrgjiemeng"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("jsrgjiemeng_effect"); + }, + }, + }, + }, + //张楚 + jsrghuozhong: { + audio: "dcjizhong", + global: "jsrghuozhong_g", + subSkill: { + g: { + audio: "dcjizhong", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.hasJudge("bingliang")) return false; + if (!game.hasPlayer(current => current.hasSkill("jsrghuozhong"))) return false; + return player.countCards("hes", card => get.color(card) == "black" && get.type2(card) != "trick") > 0; + }, + viewAs: { name: "bingliang" }, + position: "hes", + discard: false, + prompt: function () { + var list = game.filterPlayer(target => { + return target.hasSkill("jsrghuozhong"); + }); + return `将一张黑色非锦囊牌当【兵粮寸断】置于自己的判定区,然后令${get.translation(list)}${list.length > 1 ? "中的一人" : ""}摸两张牌。`; + }, + filterCard: function (card, player, event) { + return get.color(card) == "black" && get.type2(card) != "trick" && player.canAddJudge({ name: "bingliang", cards: [card] }); + }, + selectTarget: -1, + filterTarget: function (card, player, target) { + return player == target; + }, + check: function (card) { + return 6 - get.value(card); + }, + precontent: function* (event, map) { + var player = map.player; + var targets = game.filterPlayer(current => current.hasSkill("jsrghuozhong")); + var result; + if (targets.length) result = { bool: true, targets: targets }; + else + result = yield player + .chooseTarget("请选择一名传教士,发动其的【惑众】", true, (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("targets", targets); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrghuozhong", target); + var next = game.createEvent("jsrghuozhong_draw", false); + next.set("player", player); + next.set("target", target); + event.next.remove(next); + event.getParent().after.push(next); + next.setContent(function () { + target.draw(2); + }); + } + }, + ai: { + result: { + player: function (player) { + if (game.hasPlayer(current => get.attitude(player, current) > 2 && current.hasSkill("jsrghuozhong"))) return 1; + return 0; + }, + }, + order: 9, + }, + }, + }, + }, + jsrgrihui: { + audio: "dcrihui", + locked: false, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return ( + event.getParent().type == "card" && + event.card && + event.card.name == "sha" && + game.hasPlayer(current => { + return current != player && current.countCards("j"); + }) + ); + }, + prompt: "是否发动【日彗】?", + prompt2: function (event, player) { + var list = game.filterPlayer(current => { + return current != player && current.countCards("j"); + }); + return `令${get.translation(list)}${list.length > 1 ? "各" : ""}摸一张牌。`; + }, + logTarget: function (event, player) { + return game.filterPlayer(current => { + return current != player && current.countCards("j"); + }); + }, + group: "jsrgrihui_sha", + content: function () { + game.asyncDraw(lib.skill.jsrgrihui.logTarget(trigger, player)); + }, + mod: { + cardUsableTarget: function (card, player, target) { + if (card.name == "sha" && !player.getStorage("jsrgrihui_targeted").includes(target)) return true; + }, + }, + subSkill: { + sha: { + trigger: { player: "useCardToPlayered" }, + forced: true, + silent: true, + firstDo: true, + content: function () { + player.addTempSkill("jsrgrihui_targeted"); + player.markAuto("jsrgrihui_targeted", trigger.target); + }, + }, + targeted: { + charlotte: true, + onremove: true, + }, + }, + }, + //夏侯恩 + jsrghujian: { + audio: "twfujian", + trigger: { + global: "phaseEnd", + }, + filter: function (event, player) { + if (!Array.from(ui.discardPile.childNodes).some(i => i.name == "chixueqingfeng")) return false; + return game.hasGlobalHistory("everything", evt => ["useCard", "respond"].includes(evt.name) && evt.player.isIn()); + }, + popup: false, + forced: true, + locked: false, + group: "jsrghujian_begin", + content: function () { + "step 0"; + var cards = Array.from(ui.discardPile.childNodes).filter(i => i.name == "chixueqingfeng"); + if (cards.length) { + event.cards = cards; + var history = _status.globalHistory, + target = null; + for (var i = history.length - 1; i >= 0 && !target; i--) { + var evts = history[i]["everything"]; + for (var j = evts.length - 1; j >= 0; j--) { + var evt = evts[j]; + if (!["useCard", "respond"].includes(evt.name)) continue; + target = evt.player; + break; + } + } + if (target && target.isIn()) { + event.target = target; + target.chooseBool(`是否响应${get.translation(player)}的【护剑】?`, "获得弃牌堆里的【赤血青锋】。"); + } else event.finish(); + } else event.finish(); + "step 1"; + if (result.bool) { + player.logSkill("jsrghujian"); + player.line(target); + target.gain(cards, "gain2"); + } + }, + subSkill: { + begin: { + audio: "twfujian", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + player.gain(game.createCard2("chixueqingfeng", "spade", 6), "gain2"); + }, + }, + }, + }, + jsrgshili: { + audio: "twjianwei", + enable: "phaseUse", + usable: 1, + viewAs: { + name: "juedou", + }, + filterCard: { type: "equip" }, + position: "hs", + viewAsFilter: function (player) { + return player.hasCard({ type: "equip" }, "hs"); + }, + check: function (card) { + return (get.name(card, false) == "chixueqingfeng" ? 20 : 12) - _status.event.player.getUseValue(card); + }, + ai: { + order: 0.001, + }, + }, + //范疆张达 + jsrgfushan: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return game.hasPlayer(i => i != player); + }, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger, + targets = game.filterPlayer(i => i != player); + var shas = player.mayHaveSha(target, "use", null, "count") - player.getCardUsable("sha", true); + for (var target of targets) { + var att = get.attitude(target, player); + var result = yield target + .chooseCard("he", `负山:是否交给${get.translation(player)}一张牌?`, `若如此做,其此阶段使用【杀】的次数上限+1`) + .set("att", att) + .set("ai", card => { + if (!get.event("goon")) return -get.value(card); + var isSha = get.name(card, get.event("target")) == "sha"; + if (get.event("att") < 0) return (isSha ? 0 : 5) - get.value(card); + return (isSha ? 10 : 0) - get.value(card); + }) + .set("goon", (att > 0 && shas >= 0) || (att < 0 && target.hp > player.getCardUsable("sha", true) && shas < -1 / Math.max(1, player.hp))) + .set("target", player); + if (result.bool) { + target.give(result.cards, player); + target.line(player); + player.addTempSkill("jsrgfushan_sha", "phaseAfter"); + player.addMark("jsrgfushan_sha", 1, false); + player.markAuto("jsrgfushan_given", target); + } + } + player + .when("phaseUseAfter") + .filter(evt => evt == trigger) + .then(() => { + player.logSkill("jsrgfushan"); + if ( + player.getCardUsable("sha", true) > + player.getHistory("useCard", evt => { + return evt.getParent("phaseUse") == trigger && evt.card.name == "sha" && evt.addCount !== false; + }).length && + player.storage.jsrgfushan_given && + player.storage.jsrgfushan_given.every(i => i.isIn()) + ) { + player.loseHp(2); + } else { + player.drawTo(player.maxHp); + } + delete player.storage.jsrgfushan_given; + }); + }, + subSkill: { + sha: { + charlotte: true, + onremove: true, + marktext: "负", + intro: { content: "使用【杀】的次数上限+#" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("jsrgfushan_sha"); + }, + }, + }, + }, + }, + //江山如故·承 + //404孙策 + jsrgduxing: { + audio: 2, + enable: "phaseUse", + viewAs: { + name: "juedou", + storage: { jsrgduxing: true }, + isCard: true, + }, + viewAsFilter: function (player) { + if (player.hasSkill("jsrgduxing_used")) return false; + }, + filterCard: () => false, + selectCard: -1, + selectTarget: [1, Infinity], + precontent: function () { + player.logSkill("jsrgduxing"); + delete event.result.skill; + var targets = event.result.targets; + for (var target of targets) { + target.addTempSkill("jsrgduxing_allsha"); + } + player.addTempSkill("jsrgduxing_restore"); + player.addTempSkill("jsrgduxing_used", "phaseUseAfter"); + }, + ai: { + order: 5, + result: { + player: function (player, target) { + var eff = Math.sign(get.effect(target, { name: "juedou" }, player, player)); + if ( + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: { name: "juedou" }, + }, + true + ) || + ui.selected.targets.concat(target).reduce((p, c) => { + return p + c.countCards("h"); + }, 0) < player.countCards("h", "sha") + ) { + return 0; + } + return -114514; + }, + target: -1.5, + }, + }, + subSkill: { + allsha: { + charlotte: true, + mod: { + cardname: function (card, player, name) { + return "sha"; + }, + }, + }, + used: { + charlotte: true, + }, + restore: { + charlotte: true, + trigger: { + global: "useCardAfter", + }, + forced: true, + popup: false, + forceDie: true, + forceOut: true, + filter: function (event, player) { + return event.card.name == "juedou" && event.card.storage && event.card.storage.jsrgduxing; + }, + content: function () { + game.countPlayer(current => { + current.removeSkill("jsrgduxing_allsha"); + }, true); + }, + }, + }, + }, + jsrgzhiheng: { + audio: 2, + trigger: { + source: "damageBegin1", + }, + forced: true, + filter: function (event, player) { + if (event.getParent().type != "card") return false; + var respondEvts = []; + respondEvts.addArray(event.player.getHistory("useCard")).addArray(event.player.getHistory("respond")); + respondEvts = respondEvts.filter(i => i.respondTo).map(evt => evt.respondTo); + return respondEvts.some(list => { + return list[0] == player; + }); + }, + content: function () { + trigger.num++; + }, + }, + jsrgzhasi: { + audio: 2, + trigger: { + player: "damageBegin4", + }, + limited: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return event.num >= player.getHp(); + }, + content: function () { + player.awakenSkill("jsrgzhasi"); + trigger.cancel(); + player.changeSkills(["rezhiheng"], ["jsrgzhiheng"]); + player.addSkill("jsrgzhasi_undist"); + }, + derivation: "rezhiheng", + subSkill: { + undist: { + group: "undist", + trigger: { + player: ["useCardAfter", "damageEnd"], + }, + filter: function (event, player) { + if (event.name == "useCard") + return event.targets.some(target => { + return target != player; + }); + return true; + }, + forced: true, + popup: false, + charlotte: true, + content: function () { + player.removeSkill("jsrgzhasi_undist"); + }, + mark: true, + intro: { + content: "诈死中,不计入距离和座次的计算", + }, + }, + }, + }, + jsrgbashi: { + audio: 2, + trigger: { player: "chooseToRespondBefore" }, + zhuSkill: true, + filter: function (event, player) { + if (event.responded) return false; + if (player.storage.jsrgbashiing) return false; + if (!player.hasZhuSkill("jsrgbashi")) return false; + if (!event.filterCard({ name: "sha" }, player, event) && !event.filterCard({ name: "shan" }, player, event)) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wu"; + }); + }, + check: function (event, player) { + if (get.damageEffect(player, event.player, player) >= 0) return false; + return true; + }, + content: function () { + "step 0"; + event.targets = game.filterPlayer(); + "step 1"; + var target = event.targets.shift(); + event.target = target; + if (!target) event.finish(); + else if (!target.isIn() || target == player) event.redo(); + else if (target.group == "wu") { + if ((target == game.me && !_status.auto) || get.attitude(target, player) > 2 || target.isOnline()) { + player.storage.jsrgbashiing = true; + var list = ["sha", "shan"].filter(name => trigger.filterCard({ name: name }, player, trigger)); + var names = list.map(i => "【" + get.translation(i) + "】").join("或"); + var next = target.chooseToRespond("是否替" + get.translation(player) + "打出一张" + names + "?", { name: list }); + next.set("ai", function () { + var event = _status.event; + return get.attitude(event.player, event.source) - 2; + }); + next.set("skillwarn", "替" + get.translation(player) + "打出一张" + names); + next.autochoose = function () { + if (!lib.filter.autoRespondSha.apply(this, arguments)) return false; + return lib.filter.autoRespondShan.apply(this, arguments); + }; + next.set("source", player); + } + } + "step 2"; + delete player.storage.jsrgbashiing; + if (result.bool) { + event.finish(); + var name = result.card.name; + trigger.result = { bool: true, card: { name: name, isCard: true } }; + trigger.responded = true; + trigger.animate = false; + if (typeof target.ai.shown == "number" && target.ai.shown < 0.95) { + target.ai.shown += 0.3; + if (target.ai.shown > 0.95) target.ai.shown = 0.95; + } + } else { + event.goto(1); + } + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "use") return false; + if (player.storage.jsrgbashiing) return false; + if (!player.hasZhuSkill("jsrgbashi")) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wu"; + }); + }, + }, + }, + //许攸 + jsrglipan: { + forbid: ["guozhan"], + audio: 2, + trigger: { + player: "phaseEnd", + }, + direct: true, + content: function () { + "step 0"; + var list = lib.group.slice(); + list.remove(player.group); + var getV = function (group) { + var val = 1; + if (group == "wei" || group == "qun") val++; + game.countPlayer(current => { + if (current.group != group) return false; + var att = get.attitude(player, current); + if (att > 0) val++; + else if (att == 0) val += 0.5; + else val--; + }); + return val; + }; + var maxGroup = list.slice().sort((a, b) => { + return getV(b) - getV(a); + })[0]; + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("jsrglipan")) + .set("prompt2", "变更为另一个势力") + .set("ai", () => { + return _status.event.choice; + }) + .set("choice", maxGroup); + "step 1"; + var group = result.control; + if (group == "cancel2") return; + player.logSkill("jsrglipan"); + player.popup(group + "2", get.groupnature(group, "raw")); + player.changeGroup(group); + var num = game.countPlayer(current => { + return current.group == group && current != player; + }); + if (num > 0) player.draw(num); + var next = player.phaseUse(); + next.jsrglipan = true; + event.next.remove(next); + trigger.next.push(next); + player.addTempSkill("jsrglipan_backfire"); + }, + subSkill: { + backfire: { + trigger: { + player: "phaseUseEnd", + }, + charlotte: true, + forced: true, + popup: false, + filter: function (event, player) { + return event.jsrglipan; + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => { + return current.group == player.group; + }); + targets.sortBySeat(); + event.targets = targets; + "step 1"; + var target = targets.shift(); + event.target = target; + if (target && target.isIn() && target.canUse({ name: "juedou" }, player)) { + target.chooseCardTarget({ + position: "hes", + prompt: "是否将一张牌当【决斗】对" + get.translation(player) + "使用?", + filterCard: function (card, player) { + return player.canUse(get.autoViewAs({ name: "juedou" }, [card]), _status.event.getParent().player); + }, + filterTarget: function (card, player, target) { + var source = _status.event.getParent().player; + if (target != source && !ui.selected.targets.includes(source)) return false; + card = get.autoViewAs({ name: "juedou" }, [card]); + return lib.filter.filterTarget.apply(this, arguments); + }, + selectTarget: function () { + var card = get.card(), + player = get.player(); + if (!card) return; + card = get.autoViewAs({ name: "juedou" }, [card]); + var range = [1, 1]; + game.checkMod(card, player, range, "selectTarget", player); + return range; + }, + ai1: function (card) { + var player = _status.event.player, + target = _status.event.getParent().player; + var eff = get.effect(target, get.autoViewAs({ name: "juedou" }, [card]), player, player); + if (eff <= 0) return 0; + return (player.hp == 1 ? 10 : 6) - get.value(card); + }, + ai2: function (target) { + if (target == _status.event.getParent().player) return 100; + return get.effect(target, { name: "juedou" }, _status.event.player); + }, + }); + } + "step 2"; + if (result.bool) { + var cards = result.cards; + var cardx = get.autoViewAs({ name: "juedou" }, cards); + var targets = result.targets.filter(targetx => { + return target.canUse(cardx, targetx); + }); + if (targets.length) target.useCard(cardx, cards, targets); + } + if (targets.length) event.goto(1); + }, + }, + }, + }, + jsrgqingxi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (player.group != "qun") return false; + return game.hasPlayer(current => lib.skill.jsrgqingxi.filterTarget("", player, current)); + }, + groupSkill: true, + filterTarget: function (card, player, target) { + if (target.countCards("h") >= player.countCards("h")) return false; + return !player.getStorage("jsrgqingxi_used").includes(target); + }, + content: function () { + "step 0"; + player.addTempSkill("jsrgqingxi_used", "phaseUseAfter"); + player.markAuto("jsrgqingxi_used", [target]); + var num = player.countCards("h") - target.countCards("h"); + if (num > 0) player.chooseToDiscard(num, true, "轻袭:弃置" + get.cnNumber(num) + "张手牌"); + "step 1"; + var card = { + name: "sha", + nature: "stab", + isCard: true, + }; + if (player.canUse(card, target, false)) player.useCard(card, target, false); + }, + ai: { + order: 8, + result: { + target: (player, target) => { + let num = player.countCards("h") - target.countCards("h"), + eff = get.effect(target, { name: "sha", nature: "stab" }, player, target), + val = 0, + ph = _status.event.getTempCache("jsrgqingxi_result", "ph"); + if (!ph) { + ph = player.getCards("h").sort((a, b) => { + return get.value(a) - get.value(b); + }); + _status.event.putTempCache("jsrgqingxi_result", "ph", ph); + } + ph.slice(0, num).forEach(i => { + val += get.value(i, player); + }); + eff = Math.sign(eff) * Math.sqrt(Math.abs(eff)); + if (val > 2 * Math.abs(eff)) return 0; + return eff / num; + }, + }, + }, + subSkill: { + used: { + onremove: true, + charlotte: true, + }, + }, + }, + jsrgjinmie: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.group != "wei") return false; + return game.hasPlayer(current => current.countCards("h") > player.countCards("h")); + }, + groupSkill: true, + filterTarget: function (card, player, target) { + return target.countCards("h") > player.countCards("h"); + }, + content: function () { + "step 0"; + var card = { + name: "sha", + nature: "fire", + storage: { jsrgjinmie: target }, + isCard: true, + }; + if (player.canUse(card, target, false)) { + player.useCard(card, target, false); + player.addTempSkill("jsrgjinmie_effect"); + } + }, + ai: { + order: 0.5, + result: { + target: function (player, target) { + var eff = get.effect(target, { name: "sha", nature: "fire" }, player, target) / 30; + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + eff *= 2; + var del = target.countCards("h") - player.countCards("h") + 1.5; + eff *= Math.sqrt(del); + return eff; + }, + }, + }, + subSkill: { + effect: { + trigger: { + source: "damageSource", + }, + filter: function (event, player) { + return event.card && event.card.storage && event.card.storage.jsrgjinmie && event.card.storage.jsrgjinmie.isIn(); + }, + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; + var target = trigger.card.storage.jsrgjinmie; + var del = target.countCards("h") - player.countCards("h"); + if (del > 0) { + player.line(target); + player.discardPlayerCard(target, "h", true, del); + } + // else if(del<0){ + // player.line(target); + // target.draw(-del); + // } + }, + }, + }, + }, + //吕布 + jsrgwuchang: { + forbid: ["guozhan"], + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + forced: true, + filter: function (event, player) { + var cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer(current => { + if (current == player) return false; + return event.getl(current).cards2.length; + }); + }, + group: "jsrgwuchang_add", + content: function () { + "step 0"; + var targets = game.filterPlayer(current => { + if (current == player) return false; + return trigger.getl(current).cards2.length; + }); + var target = targets[0]; + player.changeGroup(target.group); + player.popup(target.group + "2", get.groupnature(target.group, "raw")); + }, + subSkill: { + add: { + trigger: { + source: "damageBegin1", + }, + filter: function (event, player) { + if (!event.card || !["sha", "juedou"].includes(event.card.name) || event.getParent().type != "card") return false; + return event.player.group == player.group; + }, + forced: true, + content: function () { + "step 0"; + trigger.num++; + var group = "qun"; + player.changeGroup(group); + player.popup(group + "2", get.groupnature(group, "raw")); + }, + }, + }, + }, + jsrgqingjiao: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (player.group != "qun") return false; + if (!player.countCards("hes")) return false; + return ( + (!player.hasSkill("jsrgqingjiao_tuixinzhifu") && + game.hasPlayer(current => { + return current.countCards("h") > player.countCards("h"); + })) || + (!player.hasSkill("jsrgqingjiao_chenghuodajie") && + game.hasPlayer(current => { + return current.countCards("h") < player.countCards("h"); + })) + ); + }, + groupSkill: true, + position: "hes", + filterCard: true, + selectCard: 1, + discard: false, + lose: false, + delay: false, + filterTarget: function (card, player, target) { + var mod = game.checkMod(ui.selected.cards[0], player, "unchanged", "cardEnabled2", player); + if (!mod) return false; + var del = target.countCards("h") - player.countCards("h"); + if (del == 0) return false; + var name = del > 0 ? "tuixinzhifu" : "chenghuodajie"; + if (player.hasSkill("jsrgqingjiao_" + name)) return false; + return player.canUse({ name: name, cards: ui.selected.cards }, target); + }, + content: function () { + var del = target.countCards("h") - player.countCards("h"); + var name = del > 0 ? "tuixinzhifu" : "chenghuodajie"; + player.useCard({ name: name }, target, cards); + player.addTempSkill("jsrgqingjiao_" + name, "phaseUseAfter"); + }, + ai: { + order: 7, + result: { + player: function (player, target) { + var name = target.countCards("h") > player.countCards("h") ? "tuixinzhifu" : "chenghuodajie"; + var list = []; + if (ui.selected.cards.length) list.addArray(ui.selected.cards); + var card = get.autoViewAs({ name: name }, list); + return get.effect(target, card, player, player); + }, + }, + }, + subSkill: { + tuixinzhifu: { + charlotte: true, + }, + chenghuodajie: { + charlotte: true, + }, + }, + }, + jsrgchengxu: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + if (player.group != "shu") return false; + return game.hasPlayer(current => { + return current != player && current.group == player.group; + }); + }, + groupSkill: true, + content: function () { + trigger.directHit.addArray( + game.filterPlayer(current => { + return current != player && current.group == player.group; + }) + ); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return player.group == "shu" && player.group == arg.target.group; + }, + }, + }, + //张郃 + jsrgqiongtu: { + audio: 2, + enable: "chooseToUse", + groupSkill: true, + viewAs: { + name: "wuxie", + suit: "none", + number: null, + isCard: true, + }, + filter: function (event, player) { + if (!player.countCards("he", card => _status.connectMode || get.type(card) != "basic")) return false; + return player.group == "qun" && !player.hasSkill("jsrgqiongtu_check"); + }, + viewAsFilter: function (player) { + if (!player.countCards("he", card => _status.connectMode || get.type(card) != "basic")) return false; + return player.group == "qun" && !player.hasSkill("jsrgqiongtu_check"); + }, + filterCard: function (card) { + return get.type(card) != "basic"; + }, + position: "he", + popname: true, + ignoreMod: true, + precontent: function () { + "step 0"; + player.logSkill("jsrgqiongtu"); + delete event.result.skill; + var card = event.result.cards[0]; + event.card = card; + event.result.card = { + name: event.result.card.name, + storage: { jsrgqiongtu: true }, + isCard: true, + }; + event.result.cards = []; + player.addToExpansion(card, player, "give").gaintag.add("jsrgqiongtu"); + player.addTempSkill("jsrgqiongtu_check"); + }, + marktext: "途", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + delete player.storage[skill]; + }, + subSkill: { + check: { + trigger: { + global: "useCardAfter", + }, + filter: function (event, player) { + return event.card.name == "wuxie" && event.card.storage && event.card.storage.jsrgqiongtu; + }, + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; + game.delayx(); + var evt = trigger.getParent(4); + if (evt.name == "phaseJudge") { + state = evt.cancelled; + } else { + state = evt._neutralized; + } + if (state) { + player.draw(); + } else { + player.changeGroup("wei"); + var cards = player.getExpansions("jsrgqiongtu"); + if (cards.length) player.gain(cards, "gain2"); + } + }, + }, + }, + }, + jsrgxianzhu: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + return ( + player.group == "wei" && + player.hasCard(card => { + return _status.connectMode || get.type(card) == "trick"; + }, "hs") + ); + }, + groupSkill: true, + locked: false, + viewAs: { + name: "sha", + storage: { jsrgxianzhu: true }, + }, + position: "hs", + filterCard: function (card) { + return get.type(card) == "trick"; + }, + check: function (card) { + var player = _status.event.player; + var cardx = { + name: "sha", + storage: { jsrgxianzhu: true }, + cards: [card], + }; + if ( + game.hasPlayer(current => { + return player.canUse(cardx, current) && get.effect(current, card, player, player) > 0 && get.effect(current, cardx, player, player) > 0; + }) + ) + return 15 - get.value(card); + return 0; + }, + onuse: function (links, player) { + player.addTempSkill("jsrgxianzhu_after"); + }, + mod: { + cardUsable: function (card) { + if (card.storage && card.storage.jsrgxianzhu) return Infinity; + }, + }, + subSkill: { + after: { + trigger: { + global: "damageSource", + }, + filter: function (event, player) { + var targets = event.getParent(2).targets; + if (!targets || targets.length != 1) return false; + if (!event.card || !event.card.storage || !event.card.storage.jsrgxianzhu) return false; + var target = event.player, + card = event.cards[0]; + if (!target.isIn()) return false; + if (get.type(card) != "trick") return false; + if (!player.canUse(card, target, false)) return false; + return true; + }, + forced: true, + charlotte: true, + group: "jsrgxianzhu_inf", + content: function () { + var card = { + name: trigger.cards[0].name, + isCard: true, + }; + player.useCard(card, trigger.player, false); + game.delayx(); + }, + }, + inf: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (event.card.storage && event.card.storage.jsrgxianzhu && event.addCount !== false) return true; + return false; + }, + content: function () { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; + }, + }, + }, + }, + //邹氏 + jsrgguyin: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + }, + check: function (event, player) { + return player.isTurnedOver() || game.countPlayer2(current => current.hasSex("male")) >= 2; + }, + content: function () { + "step 0"; + player.turnOver(); + "step 1"; + var targets = game.filterPlayer(current => current != player && current.hasSex("male")); + event.targets = targets; + player.line(targets); + game.delayx(); + "step 2"; + var target = targets.shift(); + event.target = target; + target + .chooseBool("是否响应" + get.translation(player) + "的【孤吟】?", "你可以翻面。") + .set("ai", () => { + return _status.event.bool; + }) + .set( + "bool", + (function () { + return target.isTurnedOver() || (get.attitude(target, player) > 0 && (game.countPlayer2(current => current.hasSex("male")) >= 3 || (target.getHp() <= 1 && player.hasSkill("jsrgzhangdeng")))); + })() + ); + "step 3"; + if (result.bool) { + target.turnOver(); + } + if (targets.length) event.goto(2); + "step 4"; + var targets = game.filterPlayer(current => { + return current == player || current.isTurnedOver(); + }); + event.targets = targets; + event.num = 0; + event.index = 0; + "step 5"; + var target = targets[event.index]; + if (target.isIn()) { + target.draw(); + event.num++; + } + event.index++; + if (event.index >= targets.length) event.index = 0; + "step 6"; + if (event.num >= game.countPlayer2(current => current.hasSex("male"))) event.finish(); + else event.goto(5); + }, + }, + jsrgzhangdeng: { + audio: 2, + trigger: { + global: "logSkill", + }, + filter: function (event, player) { + return ( + event.player + .getHistory("useSkill", evt => { + return evt.skill == "jsrgzhangdeng_jiu"; + }) + .map(evt => evt.event) + .indexOf(event.log_event) == 1 + ); + }, + global: "jsrgzhangdeng_jiu", + forced: true, + locked: false, + content: function () { + player.turnOver(false); + }, + subSkill: { + jiu: { + audio: "jsrgzhangdeng", + enable: "chooseToUse", + filter: function (event, player) { + return ( + player.isTurnedOver() && + game.hasPlayer(current => { + return current.hasSkill("jsrgzhangdeng") && current.isTurnedOver(); + }) + ); + }, + viewAs: { name: "jiu", isCard: true }, + viewAsFilter: function (player) { + return ( + player.isTurnedOver() && + game.hasPlayer(current => { + return current.hasSkill("jsrgzhangdeng") && current.isTurnedOver(); + }) + ); + }, + filterCard: () => false, + selectCard: -1, + precontent: function () { + player.logSkill("jsrgzhangdeng_jiu"); + var targets = game.filterPlayer(current => { + return current.hasSkill("jsrgzhangdeng") && current.isTurnedOver(); + }); + player.line(targets[0]); + delete event.result.skill; + }, + }, + }, + }, + //关羽 + jsrgguanjue: { + audio: 2, + trigger: { + player: ["useCard", "respond"], + }, + filter: function (event, player) { + return lib.suit.includes(get.suit(event.card)); + }, + forced: true, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => current != player); + var suit = get.suit(trigger.card); + for (var target of targets) { + target.addTempSkill("jsrgguanjue_ban"); + target.markAuto("jsrgguanjue_ban", [suit]); + } + }, + subSkill: { + ban: { + onremove: true, + charlotte: true, + mod: { + cardEnabled: function (card, player) { + if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) return false; + }, + cardRespondable: function (card, player) { + if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) return false; + }, + cardSavable: function (card, player) { + if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) return false; + }, + }, + mark: true, + marktext: "绝", + intro: { + content: "本回合内不能使用或打出$的牌", + }, + }, + }, + }, + jsrgnianen: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + if (!player.countCards("hes")) return false; + if (player.hasSkill("jsrgnianen_blocker")) return false; + for (var name of lib.inpile) { + if (get.type2(name) != "basic") continue; + var card = { name: name }; + if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) return true; + } + } + } + return false; + }, + derivation: "mashu", + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + 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) == "basic" && event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) list.push(["基本", "", name]); + } + var dialog = ui.create.dialog("念恩", [list, "vcard"]); + dialog.direct = true; + return dialog; + }, + filter: function (button, player) { + return _status.event.getParent().filterCard(get.autoViewAs({ name: button.link[2], nature: button.link[3] }, "unsure"), 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: "jsrgnianen", + filterCard: true, + popname: true, + check: function (card) { + return 8 - get.value(card); + }, + position: "hes", + viewAs: { name: links[0][2], nature: links[0][3] }, + precontent: function () { + player.logSkill("jsrgnianen"); + delete event.result.skill; + var card = event.result.card; + if (get.color(card, player) != "red" || get.name(card) != "sha" || get.natureList(card).length) { + player.addTempSkill("jsrgnianen_blocker"); + player.addAdditionalSkill("jsrgnianen_blocker", "mashu"); + } + }, + }; + }, + 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.type2(name); + return type == "basic" && player.countCards("hes") > 0 && !player.hasSkill("jsrgnianen_blocker"); + }, + ai: { + fireAttack: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + if (!player.countCards("hes") || player.hasSkill("jsrgnianen_blocker")) return false; + }, + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { + blocker: { + charlotte: true, + mark: true, + marktext: "恩", + intro: { content: "视为拥有〖马术〗" }, + }, + }, + }, + //生鱼片 + jsrglunshi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return game.hasPlayer(current => { + return current.inRangeOf(target); + }); + }, + content: function () { + "step 0"; + var num = game.countPlayer(current => { + return current.inRangeOf(target); + }); + var len = target.countCards("h"); + num = Math.max(0, Math.min(len + num, 5) - len); + if (num > 0) target.draw(num); + "step 1"; + var num = game.countPlayer(current => { + return current.inRange(target); + }); + if (num > 0) target.chooseToDiscard(num, "he", true, get.translation(player) + "对你发动了【论势】", "请弃置" + get.cnNumber(num) + "张牌"); + }, + ai: { + order: 6, + result: { + target: function (player, target) { + var num1 = game.countPlayer(current => { + return current.inRangeOf(target); + }), + num2 = game.countPlayer(current => { + return current.inRange(target); + }); + var len = target.countCards("h"); + num1 = Math.max(0, Math.min(len + num1, 5) - len); + return (num1 - num2 + 1) / 2; + }, + }, + }, + }, + jsrgguitu: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + }, + direct: true, + filter: function (event, player) { + return ( + game.countPlayer(current => { + return current.getEquips(1).length; + }) >= 2 + ); + }, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt2("jsrgguitu"), + (card, player, target) => { + return target.getEquips(1).length; + }, + [1, 2] + ) + .set("filterOk", () => { + var num = 0; + for (var target of ui.selected.targets) { + num += target.getEquips(1).length; + } + return num >= 2; + }) + .set("ai", target => { + var sign = -1; + var val = 0; + if (ui.selected.targets.length) { + sign = 1; + var targetx = ui.selected.targets[0]; + var cards = targetx.getEquips(1); + var list = cards.map(card => { + return [card, get.value(card, targetx)]; + }); + list.sort((a, b) => { + return b[1] - a[1]; + }); + val = get.attitude(_status.event.player, targetx) * list[0][1]; + } + var cards = target.getEquips(1); + var list = cards.map(card => { + return [card, get.value(card, target)]; + }); + list.sort((a, b) => { + return b[1] - a[1]; + }); + return get.attitude(_status.event.player, target) * list[0][1] * sign - val; + }); + "step 1"; + if (result.bool) { + var targets = result.targets.slice(); + targets.sortBySeat(); + event.targets = targets; + player.logSkill("jsrgguitu", targets); + event.rangeList = targets.map(target => { + return target.getAttackRange(); + }); + var weapons = []; + for (var target of targets) { + weapons.addArray(target.getEquips(1)); + } + if (weapons.length > 2) { + var list = ["诡图:选择要交换的武器牌"]; + for (var target of targets) { + list.addArray(['
    ' + get.translation(target) + "的武器牌
    ", target.getEquips(1)]); + } + player + .chooseButton(list, true, 2) + .set("filterButton", button => { + var count = _status.event.count; + if (count == 1) return true; + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.owner(button.link) == get.owner(ui.selected.buttons[i].link)) return false; + } + return true; + }) + .set("count", targets.length) + .set("ai", button => { + var player = _status.event.player; + var card = button.link; + var owner = get.owner(card); + var att = get.attitude(player, owner); + var val = -get.value(card) * att; + return val; + }); + } else event._result = { bool: true, links: weapons }; + } else event.finish(); + "step 2"; + if (result.bool) { + var links = result.links; + var list = []; + for (var target of targets) { + var weapons = target.getEquips(1); + weapons = weapons.filter(i => links.includes(i)); + if (weapons.length) { + list.push([target, weapons]); + } + } + if (list.length == 2) { + event.players = list.map(i => i[0]); + event.cards = list.map(i => i[1]); + } else { + event.players = [list[0][0], list[0][0]]; + event.cards = list[0][1]; + } + game.loseAsync({ + player: event.players[0], + target: event.players[1], + cards1: event.cards[0], + cards2: event.cards[1], + }).setContent("swapHandcardsx"); + } else event.finish(); + "step 3"; + for (var i = 0; i < event.cards[1].length; i++) { + if (get.position(event.cards[1][i], true) == "o") event.players[0].equip(event.cards[1][i]); + } + for (var i = 0; i < event.cards[0].length; i++) { + if (get.position(event.cards[0][i], true) == "o") event.players[1].equip(event.cards[0][i]); + } + "step 4"; + var rangeList = targets.map(target => { + return target.getAttackRange(); + }); + for (var i = 0; i < targets.length; i++) { + if (rangeList[i] < event.rangeList[i]) { + targets[i].recover(); + } + } + }, + }, + //甄宓 + jsrgjixiang: { + audio: 2, + trigger: { + global: ["chooseToUseBegin", "chooseToRespondBegin"], + }, + filter: function (event, player) { + if (player != _status.currentPhase) return false; + if (player == event.player) return false; + if (!player.countCards("he")) return false; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (player.getStorage("jsrgjixiang_used").includes(name)) continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, event.player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, event.player, event)) return true; + } + } + } + return false; + }, + direct: true, + global: "jsrgjixiang_save", + content: function () { + "step 0"; + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + var card = { name: name }; + if (trigger.filterCard(card, trigger.player, trigger)) list.push(name); + } + var listx = []; + for (var name of list) { + if (player.getStorage("jsrgjixiang_used").includes(name)) continue; + listx.push([get.type2(name), "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if (trigger.filterCard({ name: name, nature: nature }, player, trigger)) { + listx.push([get.type2(name), "", name, nature]); + } + } + } + } + var evt = trigger.getParent(); + var names = ""; + for (var i = 0; i < list.length; i++) { + names += "【" + get.translation(list[i]) + "】"; + names += i < list.length - 2 ? "、" : "或"; + } + names = names.slice(0, names.length - 1); + var reason = trigger.name == "chooseToUse" ? "使用" : "打出"; + var used = player.getStorage("jsrgjixiang_used").filter(name => list.includes(name)); + var str = get.translation(trigger.player) + (evt.card ? "因" + get.translation(evt.card) : "") + "需要" + reason + "一张" + names + ",是否弃置一张牌视为其" + reason + "之" + (used.length ? "(你不能以此法令其" + reason + get.translation(used) + ")" : "") + "?若如此做,你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。"; + event.str = str; + if (!listx.length) event.finish(); + else if (listx.length == 1) event._result = { bool: true, links: listx }; + else { + event.asked = true; + player.chooseButton(["###" + get.prompt("jsrgjixiang", trigger.player) + '###
    ' + str + "
    ", [listx, "vcard"]]).set("ai", () => Math.random() + 1); + } + event.list = list; + "step 1"; + if (result.bool) { + var name = result.links[0][2], + nature = result.links[0][3]; + var card = { name: name, nature: nature, isCard: true }; + event.card = card; + var evt = trigger.getParent(); + var reason = trigger.name == "chooseToUse" ? "使用" : "打出"; + var prompt = event.asked ? "济乡:是否弃置一张牌" + (trigger.filterTarget ? "并选择目标角色" : "") + "?" : get.prompt("jsrgjixiang", trigger.player); + var str = event.asked ? "若如此做,视为" + get.translation(trigger.player) + reason + get.translation(card) + ",然后你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。" : event.str; + var next = player.chooseCardTarget({ + prompt: prompt, + prompt2: str, + filterCard: lib.filter.cardDiscardable, + position: "he", + goon: get.attitude(player, trigger.player) > 1 && (evt.card ? get.effect(trigger.player, evt.card, evt.player, player) < 0 : get.effect(trigger.player, { name: event.list[0] }, trigger.player, player) > 0), + ai1: function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }, + _get_card: card, + }); + var keys = ["filterTarget", "selectTarget", "ai2"]; + for (var key of keys) delete next[key]; + for (var i in trigger) { + if (!(i in next)) next[i] = trigger[i]; + } + next.filterTargetx = trigger.filterTarget || (() => false); + next.filterTarget = function (card, player, target) { + var filter = this.filterTargetx; + if (typeof filter != "function") filter = () => filter; + card = _status.event._get_card; + player = _status.event.getTrigger().player; + return this.filterTargetx.apply(this, arguments); + }; + if (typeof next.selectTarget != "number" && typeof next.selectTarget != "function" && get.itemtype(next.selectTarget) != "select") next.selectTarget = -1; + } else event.finish(); + "step 2"; + if (result.bool) { + var cardx = result.cards[0]; + var targets = result.targets || []; + event.targets = targets; + player.logSkill("jsrgjixiang", trigger.player); + player.addTempSkill("jsrgjixiang_used"); + player.markAuto("jsrgjixiang_used", [card.name]); + player.discard(cardx); + trigger.untrigger(); + trigger.set("responded", true); + var result = { + bool: true, + card: card, + }; + if (targets.length) result.targets = targets; + trigger.result = result; + player.draw(); + var phaseName; + for (var name of lib.phaseName) { + var evt = trigger.getParent(name); + if (!evt || evt.name != name) continue; + phaseName = name; + break; + } + if (phaseName) { + player.addTempSkill("jsrgjixiang_add", phaseName + "After"); + player.addMark("jsrgjixiang_add", 1, false); + } + } + }, + subSkill: { + used: { + charlotte: true, + onremove: true, + mark: true, + marktext: "乡", + intro: { + content: "已触发过牌名:$", + }, + }, + add: { + charlotte: true, + onremove: true, + mark: true, + intro: { + markcount: (storage, player) => 2 + (storage || 0), + content: (storage, player) => "〖称贤〗剩余可发动次数为" + (2 + (storage || 0)), + }, + }, + save: { + charlotte: true, + ai: { + save: true, + skillTagFilter: function (player, arg, target) { + return _status.currentPhase && _status.currentPhase != player && _status.currentPhase.hasSkill("jsrgjixiang") && _status.currentPhase.countCards("he"); + }, + }, + }, + }, + }, + jsrgchengxian: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.countCards("hs")) return false; + if (2 + player.countMark("jsrgjixiang_add") <= 0) return false; + for (var name of lib.inpile) { + if (get.type(name) != "trick") continue; + if (player.getStorage("jsrgchengxian_used").includes(name)) continue; + if (event.filterCard({ name: name }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (player.getStorage("jsrgchengxian_used").includes(name)) continue; + var info = get.info({ name: name }); + if (!info || info.type != "trick") continue; + if (info.notarget) continue; + if (!info.selectTarget) continue; + if (get.type(name) == "trick" && event.filterCard({ name: name }, player, event)) list.push(["锦囊", "", name]); + } + var dialog = ui.create.dialog("称贤", [list, "vcard"]); + return dialog; + }, + 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 { + audio: "jsrgchengxian", + filterCard: function (card, player) { + var num = game.countPlayer(current => { + return player.canUse(card, current); + }); + if (!num) return false; + var cardx = get.copy(lib.skill.jsrgchengxian_backup.viewAs); + cardx.cards = [card]; + var num2 = game.countPlayer(current => { + return player.canUse(cardx, current); + }); + return num == num2; + }, + popname: true, + check: function (card) { + return 8 - get.value(card); + }, + position: "hs", + viewAs: { name: links[0][2] }, + precontent: function () { + player.logSkill("jsrgchengxian"); + player.addTempSkill("jsrgjixiang_add"); + if (typeof player.storage.jsrgjixiang_add != "number") player.storage.jsrgjixiang_add = 0; + player.storage.jsrgjixiang_add--; + player.addTempSkill("jsrgchengxian_used"); + player.markAuto("jsrgchengxian_used", [event.result.card.name]); + delete event.result.skill; + }, + }; + }, + prompt: function (links, player) { + return "将一张合法目标数与" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "相同的手牌当此牌使用"; + }, + }, + //理解错了,下面这个不用了 + getNumber: function (card, player) { + var rangex = null; + var info = get.info(card); + if (!info) return null; + if (info.notarget) return null; + if (info.selectTarget != undefined) { + var select = get.select(info.selectTarget); + if (select[0] < 0) { + if (!info.toself) { + var count = game.countPlayer(current => { + return lib.filter.targetEnabled(card, player, current); + }); + } else count = 1; + rangex = [count, count]; + } else rangex = select; + } + return rangex; + }, + ai: { + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { + used: { + charlotte: true, + onremove: true, + mark: true, + intro: { + content: "已使用过$", + }, + }, + }, + }, + //张辽 + jsrgzhengbing: { + audio: 2, + enable: "phaseUse", + usable: 3, + filter: function (event, player) { + return player.group == "qun"; + }, + filterCard: lib.filter.cardRecastable, + check: function (card) { + var player = _status.event.player, + val = 5 + ["shan", "tao"].includes(get.name(card)) * 1.5; + if (player.needsToDiscard() > 2 && get.name(card) == "sha" && player.countCards("hs", "sha") > 1) val += 0.5; + return val - get.value(card); + }, + position: "he", + groupSkill: true, + lose: false, + discard: false, + delay: false, + content: function () { + "step 0"; + player.recast(cards); + switch (get.name(cards[0])) { + case "sha": + player.addTempSkill("jsrgzhengbing_sha"); + player.addMark("jsrgzhengbing_sha", 2, false); + break; + case "shan": + player.draw(); + break; + case "tao": + player.changeGroup("wei"); + } + }, + ai: { + order: 7, + result: { player: 1 }, + }, + subSkill: { + sha: { + charlotte: true, + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("jsrgzhengbing_sha"); + }, + }, + intro: { + content: "手牌上限+#", + }, + }, + }, + }, + jsrgtuwei: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + filter: function (event, player) { + return ( + player.group == "wei" && + game.hasPlayer(current => { + return player.inRange(current) && current.countGainableCards(player, "he") > 0; + }) + ); + }, + groupSkill: true, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("jsrgtuwei"), + "获得攻击范围内任意名角色的各一张牌。然后回合结束时这些角色中未受过伤害的角色依次获得你的一张牌。", + (card, player, target) => { + return player.inRange(target) && target.countGainableCards(player, "he") > 0; + }, + [1, Infinity] + ) + .set("ai", target => { + var player = _status.event.player; + return get.effect(target, { name: "shunshou_copy2" }, player, player); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.slice(); + targets.sortBySeat(); + player.logSkill("jsrgtuwei", targets); + player.gainMultiple(result.targets, "he"); + player.addTempSkill("jsrgtuwei_backfire"); + player.markAuto("jsrgtuwei_backfire", targets); + } + }, + subSkill: { + backfire: { + audio: "jsrgtuwei", + trigger: { + player: "phaseEnd", + }, + charlotte: true, + onremove: true, + forced: true, + filter: function (event, player) { + return player.getStorage("jsrgtuwei_backfire").some(target => { + return !target.getHistory("damage").length && target.isIn(); + }); + }, + content: function () { + "step 0"; + var targets = player.getStorage("jsrgtuwei_backfire").filter(target => { + return !target.getHistory("damage").length && target.isIn(); + }); + event.targets = targets.sortBySeat(); + "step 1"; + var target = targets.shift(); + if (target.isIn() && player.countGainableCards(target, "he")) { + target.line(player); + target.gainPlayerCard(player, true, "he"); + } + if (player.countCards("he") && targets.length) event.redo(); + }, + ai: { + effect: { + player: function (card, player, target) { + if (player != target && get.tag(card, "damage") && target && player.getStorage("jsrgtuwei_backfire").includes(target) && !target.getHistory("damage").length) return [1, 1, 1, 0]; + }, + }, + }, + }, + }, + }, + //许贡 + jsrgbiaozhao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.countPlayer(current => current != player) >= 2; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("jsrgbiaozhao"), lib.filter.notMe, 2) + .set("ai", target => { + var player = _status.event.player; + var att = get.attitude(player, target); + if (!ui.selected.targets.length) return att * (Math.sqrt(target.countCards("hs")) + 0.1); + return -att / Math.sqrt(target.countCards("hs") + 0.1); + }) + .set("targetprompt", ["用牌无限制", "打你变疼"]); + "step 1"; + if (result.bool) { + var targets = result.targets; + player.logSkill("jsrgbiaozhao", targets); + player.addTempSkill("jsrgbiaozhao_syujin", { player: ["phaseBegin", "die"] }); + if (!player.storage.jsrgbiaozhao_syujin) player.storage.jsrgbiaozhao_syujin = []; + player.storage.jsrgbiaozhao_syujin.push(targets); + targets[0].addSkill("jsrgbiaozhao_A"); + targets[0].markAuto("jsrgbiaozhao_A", [targets[1]]); + targets[1].addSkill("jsrgbiaozhao_B"); + targets[1].addMark("jsrgbiaozhao_B" + player.playerid, 1, false); + targets[1].markAuto("jsrgbiaozhao_B", [player]); + } + }, + subSkill: { + syujin: { + charlotte: true, + onremove: function (player, skill) { + var list = player.storage.jsrgbiaozhao_syujin; + for (var targets of list) { + targets[0].unmarkAuto("jsrgbiaozhao_A", [targets[1]]); + targets[1].unmarkAuto("jsrgbiaozhao_B", [player]); + delete targets[1].storage["jsrgbiaozhao_B" + player.playerid]; + if (!targets[0].getStorage("jsrgbiaozhao_A")) targets[0].removeSkill("jsrgbiaozhao_A"); + if (!targets[1].getStorage("jsrgbiaozhao_B")) targets[1].removeSkill("jsrgbiaozhao_B"); + } + delete player.storage.jsrgbiaozhao_syujin; + }, + }, + A: { + charlotte: true, + onremove: true, + mark: true, + marktext: "表", + intro: { + content: "对$使用牌无次数和距离限制", + }, + mod: { + targetInRange: function (card, player, target) { + if (player.getStorage("jsrgbiaozhao_A").includes(target)) return true; + }, + cardUsableTarget: function (card, player, target) { + if (player.getStorage("jsrgbiaozhao_A").includes(target)) return true; + }, + }, + }, + B: { + trigger: { + source: "damageBegin1", + }, + charlotte: true, + forced: true, + onremove: function (player, skill) { + for (var i in player.storage) { + if (i.indexOf("jsrgbiaozhao_B") == 0) delete player.storage[i]; + } + }, + filter: function (event, player) { + return event.card && player.getStorage("jsrgbiaozhao_B").includes(event.player); + }, + content: function () { + trigger.num += player.countMark("jsrgbiaozhao_B" + trigger.player.playerid) || 1; + }, + mark: true, + marktext: "召", + intro: { + content: function (storage, player) { + var str = ""; + for (var target of storage) { + str += "对" + get.translation(target) + "使用牌造成的伤害+" + player.countMark("jsrgbiaozhao_B" + target.playerid); + } + return str; + }, + }, + }, + }, + }, + jsrgyechou: { + audio: 2, + trigger: { player: "die" }, + forceDie: true, + direct: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("jsrgyechou"), lib.filter.notMe).set("ai", target => { + var player = _status.event.player; + return -get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrgyechou", target); + target.addSkill("jsrgyechou_effect"); + target.addMark("jsrgyechou_effect", 1, false); + } + }, + subSkill: { + effect: { + trigger: { + player: "damageBegin3", + }, + filter: function (event, player) { + return event.num >= player.getHp(); + }, + forced: true, + charlotte: true, + onremove: true, + content: function () { + trigger.num *= 2 * player.countMark("jsrgyechou_effect"); + }, + mark: true, + marktext: "仇", + intro: { + content: "当你受到伤害值不小于体力值的伤害时,此伤害翻&倍", + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target.hp == 1) return 2; + } + }, + }, + }, + }, + }, + }, + //淳于琼 + jsrgcangchu: { + audio: "recangchu", + trigger: { + global: "phaseJieshuBegin", + }, + filter: function (event, player) { + if (player.hasSkill("jsrgshishou_blocker")) return false; + return player.getHistory("gain").length; + }, + direct: true, + content: function () { + "step 0"; + var num = 0; + player.getHistory("gain", evt => { + num += evt.cards.length; + }); + event.num = num; + player.chooseTarget(get.prompt("jsrgcangchu"), "令至多" + get.cnNumber(num) + "名角色各摸" + get.cnNumber(num > game.countPlayer() ? 2 : 1) + "张牌", [1, num]).set("ai", target => { + var player = _status.event.player; + return get.attitude(player, target) / Math.sqrt(target.countCards("hs") + 1); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.slice(); + targets.sortBySeat(); + player.logSkill("jsrgcangchu", targets); + game.asyncDraw(targets, num > game.countPlayer() ? 2 : 1); + game.delayex(); + } + }, + }, + jsrgshishou: { + audio: "reshishou", + trigger: { + player: "useCard", + }, + forced: true, + filter: function (event, player) { + return event.card.name == "jiu"; + }, + group: "jsrgshishou_burn", + content: function () { + "step 0"; + player.draw(3); + player.addTempSkill("jsrgshishou_nouse"); + }, + mod: { + aiOrder: function (player, card, num) { + if (card.name == "jiu") return 0.01; + }, + }, + ai: { + halfneg: true, + effect: { + player_use: function (card, player, target) { + if (card.name == "jiu") return [1, 1]; + }, + }, + }, + subSkill: { + nouse: { + charlotte: true, + mod: { + cardEnabled: function (card, player) { + return false; + }, + cardUsable: function (card, player) { + return false; + }, + cardSavable: function (card, player) { + return false; + }, + }, + mark: true, + marktext: "失", + intro: { + content: "喝醉了,不能再使用牌", + }, + }, + burn: { + audio: "reshishou", + trigger: { + player: "damageEnd", + }, + forced: true, + filter: function (event, player) { + return event.hasNature("fire"); + }, + content: function () { + player.addTempSkill("jsrgshishou_blocker", { player: "phaseEnd" }); + }, + }, + blocker: { + charlotte: true, + mark: true, + marktext: "守", + intro: { + content: "〖仓储〗失效直到下回合结束", + }, + }, + }, + }, + //江山如故·起 + sbyingmen: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + if (!_status.characterlist) lib.skill.pingjian.initList(); + var characters = _status.characterlist.randomRemove(4); + lib.skill.sbyingmen.addVisitors(characters, player); + game.delayx(); + }, + group: "sbyingmen_reload", + subSkill: { + reload: { + trigger: { player: "phaseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.getStorage("sbyingmen").length < 4; + }, + content: function () { + if (!_status.characterlist) lib.skill.pingjian.initList(); + var characters = _status.characterlist.randomRemove(4 - player.getStorage("sbyingmen").length); + lib.skill.sbyingmen.addVisitors(characters, player); + game.delayx(); + }, + }, + }, + getSkills: function (characters, player) { + var skills = []; + for (var name of characters) { + if (Array.isArray(lib.character[name].skills)) { + for (var skill of lib.character[name].skills) { + var list = get.skillCategoriesOf(skill, player); + list.remove("锁定技"); + if (list.length > 0) continue; + var info = get.info(skill); + if (info && (!info.unique || info.gainable)) { + // lib.skill.rehuashen.createAudio(name,skill,'jsrg_xushao'); + skills.add(skill); + } + } + } + } + return skills; + }, + addVisitors: function (characters, player) { + player.addSkillBlocker("sbyingmen"); + game.log(player, "将", "#y" + get.translation(characters), "加入了", "#g“访客”"); + game.broadcastAll( + function (player, characters) { + player.tempname.addArray(characters); + player.$draw( + characters.map(function (name) { + var cardname = "huashen_card_" + name; + lib.card[cardname] = { + fullimage: true, + image: "character:" + name, + }; + lib.translate[cardname] = get.rawName2(name); + return game.createCard(cardname, " ", " "); + }), + "nobroadcast" + ); + }, + player, + characters + ); + player.markAuto("sbyingmen", characters); + var storage = player.getStorage("sbyingmen"); + var skills = lib.skill.sbyingmen.getSkills(storage, player); + player.addInvisibleSkill(skills); + }, + removeVisitors: function (characters, player) { + var skills = lib.skill.sbyingmen.getSkills(characters, player); + var characters2 = player.getStorage("sbyingmen").slice(0); + characters2.removeArray(characters); + skills.removeArray(lib.skill.sbyingmen.getSkills(characters2, player)); + game.broadcastAll((player, characters) => player.tempname.removeArray(characters), player, characters); + player.unmarkAuto("sbyingmen", characters); + _status.characterlist.addArray(characters); + player.removeInvisibleSkill(skills); + }, + onremove: function (player, skill) { + lib.skill.sbyingmen.removeVisitors(player.getSkills("sbyingmen"), player); + player.removeSkillBlocker("sbyingmen"); + }, + skillBlocker: function (skill, player) { + if (!player.invisibleSkills.includes(skill) || skill == "sbpingjian" || skill == "sbpingjian") return false; + return !player.hasSkill("sbpingjian"); + }, + marktext: "客", + intro: { + name: "访客", + mark: function (dialog, storage, player) { + if (!storage || !storage.length) return "当前没有“访客”"; + dialog.addSmall([storage, "character"]); + var skills = lib.skill.sbyingmen.getSkills(storage, player); + if (skills.length) dialog.addText("
  • 当前可用技能:" + get.translation(skills), false); + }, + }, + }, + sbpingjian: { + trigger: { player: ["useSkill", "logSkillBegin"] }, + forced: true, + locked: false, + filter: function (event, player) { + var skill = event.sourceSkill || event.skill; + return player.invisibleSkills.includes(skill) && lib.skill.sbyingmen.getSkills(player.getStorage("sbyingmen"), player).includes(skill); + }, + content: function () { + "step 0"; + var visitors = player.getStorage("sbyingmen").slice(0); + var drawers = visitors.filter(function (name) { + return lib.character[name].skills && lib.character[name].skills.includes(trigger.sourceSkill); + }); + event.drawers = drawers; + if (visitors.length == 1) event._result = { bool: true, links: visitors }; + else { + var dialog = ["评鉴:请选择移去一张“访客”"]; + if (drawers.length) dialog.push('
    如果移去' + get.translation(drawers) + ",则你摸一张牌
    "); + dialog.push([visitors, "character"]); + player.chooseButton(dialog, true); + } + "step 1"; + if (result.bool) { + lib.skill.sbyingmen.removeVisitors(result.links, player); + game.log(player, "移去了", "#y" + get.translation(result.links[0])); + if (event.drawers.includes(result.links[0])) { + player.addTempSkill("sbpingjian_draw"); + player.storage.sbpingjian_draw.push(trigger.skill); + } + } + }, + group: "sbpingjian_trigger", + subSkill: { + draw: { + charlotte: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + onremove: true, + trigger: { player: ["useSkillAfter", "logSkill"] }, + forced: true, + popup: false, + filter: function (event, player) { + return player.getStorage("sbpingjian_draw").includes(event.skill); + }, + content: function () { + player.storage.sbpingjian_draw.remove(trigger.skill); + player.draw(); + if (!player.storage.sbpingjian_draw.length) player.removeSkill("sbpingjian_draw"); + }, + }, + trigger: { + trigger: { player: "triggerInvisible" }, + forced: true, + forceDie: true, + popup: false, + charlotte: true, + priority: 10, + filter: function (event, player) { + if (event.revealed) return false; + var info = get.info(event.skill); + if (info.charlotte) return false; + var skills = lib.skill.sbyingmen.getSkills(player.getStorage("sbyingmen"), player); + game.expandSkills(skills); + return skills.includes(event.skill); + }, + content: function () { + "step 0"; + if (get.info(trigger.skill).silent) { + event.finish(); + } else { + var info = get.info(trigger.skill); + var event = trigger, + trigger = event._trigger; + var str; + var check = info.check; + if (info.prompt) str = info.prompt; + else { + if (typeof info.logTarget == "string") { + str = get.prompt(event.skill, trigger[info.logTarget], player); + } else if (typeof info.logTarget == "function") { + var logTarget = info.logTarget(trigger, player, trigger.triggername, trigger.indexedData); + if (get.itemtype(logTarget).indexOf("player") == 0) str = get.prompt(event.skill, logTarget, player); + } else { + str = get.prompt(event.skill, null, player); + } + } + if (typeof str == "function") { + str = str(trigger, player, trigger.triggername, trigger.indexedData); + } + var next = player.chooseBool("评鉴:" + str); + next.set("yes", !info.check || info.check(trigger, player, trigger.triggername, trigger.indexedData)); + next.set("hsskill", event.skill); + next.set("forceDie", true); + next.set("ai", function () { + return _status.event.yes; + }); + if (typeof info.prompt2 == "function") { + next.set("prompt2", info.prompt2(trigger, player, trigger.triggername, trigger.indexedData)); + } else if (typeof info.prompt2 == "string") { + next.set("prompt2", info.prompt2); + } else if (info.prompt2 != false) { + if (lib.dynamicTranslate[event.skill]) next.set("prompt2", lib.dynamicTranslate[event.skill](player, event.skill)); + else if (lib.translate[event.skill + "_info"]) next.set("prompt2", lib.translate[event.skill + "_info"]); + } + if (trigger.skillwarn) { + if (next.prompt2) { + next.set("prompt2", '' + trigger.skillwarn + "。" + next.prompt2); + } else { + next.set("prompt2", trigger.skillwarn); + } + } + } + "step 1"; + if (result.bool) { + if (!get.info(trigger.skill).cost) { + trigger.revealed = true; + } + } else { + trigger.untrigger(); + trigger.cancelled = true; + } + }, + }, + }, + ai: { + combo: "sbyingmen", + }, + }, + jsrgchaozheng: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + logTarget: function (event, player) { + return game.filterPlayer(i => i != player); + }, + prompt: "是否发动【朝争】?", + content: function () { + player.chooseToDebate(game.filterPlayer(i => i != player)).set("callback", lib.skill.jsrgchaozheng.callback); + }, + callback: function () { + var result = event.debateResult; + if (result.bool && result.opinion) { + var opinion = result.opinion, + targets = result.red.map(i => i[0]); + targets.sortBySeat(); + targets.forEach(i => i[opinion == "red" ? "recover" : "loseHp"]()); + if (targets.length == 0 || result.black.length == 0) player.draw(result.targets.length); + } + }, + }, + jsrgshenchong: { + audio: 2, + enable: "phaseUse", + limited: true, + filterTarget: lib.filter.notMe, + skillAnimation: true, + animationColor: "soil", + content: function () { + "step 0"; + player.awakenSkill("jsrgshenchong"); + target.addSkillLog("jsrgfeiyang"); + target.addSkillLog("jsrgbahu"); + "step 1"; + player.addSkill("jsrgshenchong_die"); + player.markAuto("jsrgshenchong_die", [target]); + }, + ai: { + order: 1, + result: { target: 1 }, + }, + subSkill: { + die: { + audio: "jsrgshenchong", + trigger: { player: "die" }, + charlotte: true, + forced: true, + forceDie: true, + filter: function (event, player) { + return player.getStorage("jsrgshenchong_die").length; + }, + content: function () { + var targets = player.getStorage("jsrgshenchong_die"); + player.line(targets); + targets.sortBySeat().forEach(current => { + current.clearSkills(true); + current.chooseToDiscard(current.countCards("h"), "h", true); + }); + }, + }, + }, + }, + jsrgfeiyang: { + trigger: { player: "phaseJudgeBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("j") && player.countCards("h") > 1; + }, + content: function () { + "step 0"; + player + .chooseToDiscard("h", 2, get.prompt("jsrgfeiyang"), "弃置两张手牌并弃置判定区里的一张牌") + .set("logSkill", "jsrgfeiyang") + .set("ai", function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set( + "goon", + (() => { + if (player.hasSkillTag("rejudge") && player.countCards("j") < 2) return false; + return player.hasCard(function (card) { + if (get.tag(card, "damage") && get.damageEffect(player, player, _status.event.player, get.natureList(card)) >= 0) return false; + return ( + get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) < 0 + ); + }, "j"); + })() + ); + "step 1"; + if (result.bool) { + player.discardPlayerCard(player, "j", true); + } + }, + }, + jsrgbahu: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + player.draw(); + }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + jsrgjulian: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hasZhuSkill("jsrgjulian") && lib.skill.jsrgjulian.logTarget(null, player).length; + }, + prompt: "是否发动【聚敛】?", + prompt2: "你可以获得其他所有群势力角色的各一张牌", + logTarget: function (event, player) { + return game.filterPlayer(current => { + return current.group == "qun" && current.countGainableCards(player, "he") > 0 && current != player; + }); + }, + content: function () { + game.filterPlayer(current => { + return current.group == "qun" && current != player; + }) + .sortBySeat() + .forEach(i => { + player.gainPlayerCard(i, "he", true); + }); + }, + group: "jsrgjulian_draw", + zhuSkill: true, + subSkill: { + draw: { + audio: "jsrgjulian", + trigger: { global: "gainAfter" }, + filter: function (event, player) { + var source = event.player; + if (source == player || source.group != "qun") return false; + var evt = event.getParent("phaseDraw"); + return (!evt || evt.player != source) && event.getParent().name == "draw" && event.getParent(2).name != "jsrgjulian_draw" && player.hasZhuSkill("jsrgjulian", event.player); + }, + direct: true, + usable: 2, + content: function () { + "step 0"; + var source = trigger.player; + event.source = source; + source.chooseBool("是否响应" + get.translation(player) + "的【聚敛】摸一张牌?"); + "step 1"; + if (result.bool) { + source.logSkill("jsrgjulian_draw", player); + source.draw(); + } else player.storage.counttrigger.jsrgjulian_draw--; + }, + }, + give: { + charlotte: true, + onremove: true, + }, + }, + }, + //何进 + jsrgzhaobing: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of hs) { + if (!lib.filter.cardDiscardable(i, player, "jsrgzhaobing")) return false; + } + return true; + }, + content: function () { + "step 0"; + var cards = player.getCards("h"); + var num = cards.length; + var prompt2 = "弃置所有手牌,令至多" + get.cnNumber(num) + "名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力"; + player + .chooseTarget(get.prompt("jsrgzhaobing"), prompt2, [1, num], lib.filter.notMe) + .set("ai", target => { + if (!_status.event.goon) return 0; + return 2 - get.attitude(_status.event.player, target); + }) + .set( + "goon", + num / 2 < + game.countPlayer(current => { + return 2 - get.attitude(player, current) > 0; + }) + ); + "step 1"; + if (result.bool) { + player.logSkill("jsrgzhaobing", result.targets); + event.targets = result.targets; + event.targets.sortBySeat(); + player.chooseToDiscard(true, "h", player.countCards("h")); + } else event.finish(); + "step 2"; + var target = targets.shift(); + event.target = target; + target + .chooseCard("诏兵:交给" + get.translation(player) + "一张【杀】,或失去1点体力", card => { + return get.name(card) == "sha"; + }) + .set("ai", card => { + if (_status.event.goon) return 0; + return 6 - get.value(card); + }) + .set("goon", get.effect(target, { name: "losehp" }, target, target) >= 0); + "step 3"; + if (result.bool) target.give(result.cards, player, true); + else target.loseHp(); + if (targets.length) event.goto(2); + }, + ai: { + expose: 0.2, + }, + }, + jsrgzhuhuan: { + audio: "mouzhu", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + var hs = player.getCards("h", "sha"); + if (!hs.length) return false; + for (var i of hs) { + if (!lib.filter.cardDiscardable(i, player, "jsrgzhuhuan")) return false; + } + return true; + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("jsrgzhuhuan"), lib.filter.notMe).set("ai", target => { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jsrgzhuhuan", target); + var hs = player.getCards("h", "sha"); + event.num = hs.length; + player.discard(hs); + } else event.finish(); + "step 2"; + target + .chooseToDiscard(get.translation(player) + "对你发动了【诛宦】", "弃置" + get.cnNumber(num) + "张牌并失去1点体力;或点击“取消”令其回复1点体力且其摸" + get.cnNumber(num) + "张牌") + .set("ai", card => { + if (_status.event.goon) return 0; + return 5.5 - get.value(card); + }) + .set("goon", target.hp <= 2 || get.attitude(target, player) >= 0 || player.isHealthy()); + "step 3"; + if (result.bool) { + target.loseHp(); + } else { + player.draw(num); + player.recover(); + } + }, + ai: { + expose: 0.2, + }, + }, + jsrgyanhuo: { + inherit: "spyanhuo", + forced: true, + }, + //孙坚 + jsrgpingtao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + var att = get.attitude(target, player); + target + .chooseCard(get.translation(player) + "对你发动了【平讨】", "交给其一张牌并令其此回合使用【杀】的次数上限+1;或点击“取消”令其视为对你使用一张【杀】", "he") + .set("ai", card => { + if (_status.event.give) { + if (card.name == "sha" || card.name == "tao" || card.name == "jiu") return 0; + return 8 - get.value(card); + } + if (_status.event.att < 0 && card.name == "sha") return -1; + return 4 - get.value(card); + }) + .set("give", (att >= 0 || (target.hp == 1 && target.countCards("hs", "shan") <= 1)) && get.effect(target, { name: "sha" }, player, target) < 0) + .set("att", att); + "step 1"; + if (result.bool) { + target.give(result.cards, player); + player.addTempSkill("jsrgpingtao_sha"); + player.addMark("jsrgpingtao_sha", 1, false); + } else if (player.canUse("sha", target, false)) { + player.useCard({ name: "sha", isCard: true }, target, false); + } + }, + ai: { + expose: 0.15, + order: 5, + result: { target: -1 }, + }, + subSkill: { + sha: { + charlotte: true, + onremove: true, + marktext: "讨", + intro: { + content: "本回合使用【杀】的次数上限+#", + }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("jsrgpingtao_sha"); + }, + }, + }, + }, + }, + jsrgjuelie: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return player.countCards("he") && event.card.name == "sha"; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt("jsrgjuelie", trigger.target), "当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌", [1, Infinity], "he") + .set("ai", card => { + if (ui.selected.cards.length >= _status.event.max) return 0; + if (_status.event.goon) return 4.5 - get.value(card); + return 0; + }) + .set("max", trigger.target.countDiscardableCards(player, "he")) + .set("goon", get.attitude(player, trigger.target) < 0) + .set("logSkill", ["jsrgjuelie_discard", trigger.target]); + "step 1"; + if (result.bool) { + var num = result.cards.length; + if (trigger.target.countDiscardableCards(player, "he")) player.discardPlayerCard("平讨:弃置" + get.translation(trigger.target) + get.cnNumber(num) + "张牌", num, "he", trigger.target, true); + } + /* + else event.finish(); + 'step 2' + if(player.isMinHandcard()||player.isMinHp()){ + var id=trigger.target.playerid; + var map=trigger.getParent().customArgs; + if(!map[id]) map[id]={}; + if(typeof map[id].extraDamage!='number'){ + map[id].extraDamage=0; + } + map[id].extraDamage++; + } + */ + }, + shaRelated: true, + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.name || arg.name != "sha") return false; + if (!arg.target) return false; + var card = arg.target.getEquip(2); + return ( + card && + get.value(card) > 0 && + player.hasCard(cardx => { + return lib.filter.cardDiscardable(cardx, player, "jsrgjuelie_discard") && get.value(cardx) < 5; + }) + ); + }, + }, + group: "jsrgjuelie_pojun", + subSkill: { + pojun: { + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + if (!player.isMinHandcard() && !player.isMinHp()) return false; + return event.getParent().name == "sha"; + }, + forced: true, + locked: false, + logTarget: "player", + content: function () { + trigger.num++; + }, + }, + }, + }, + //皇甫嵩 + jsrgguanhuo: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.jsrgguanhuo && + !game.hasPlayer2(current => { + return current.hasHistory("damage", evt => evt.card == event.card); + }) + ); + }, + forced: true, + locked: false, + group: "jsrgguanhuo_viewas", + content: function () { + "step 0"; + var count = player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length; + if (count == 1) { + player.addTempSkill("jsrgguanhuo_ex", "phaseUseAfter"); + player.addMark("jsrgguanhuo_ex", 1, false); + trigger.targets.forEach(i => i.removeSkill("huogong2")); + } else { + player.removeSkills("jsrgguanhuo"); + } + }, + ai: { + effect: { + player: function (card, player) { + if (_status.event.getParent().skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length == 1) return "zeroplayertarget"; + if (_status.event.type == "phase" && _status.event.skill == "jsrgguanhuo_viewas" && player.getHistory("useSkill", evt => evt.skill == "jsrgguanhuo_viewas").length > 1 && player.countCards("h") <= 3) return [0, 0]; + }, + }, + }, + subSkill: { + viewas: { + audio: "jsrgguanhuo", + enable: "phaseUse", + viewAs: { + name: "huogong", + isCard: true, + storage: { + jsrgguanhuo: true, + }, + }, + filterCard: () => false, + selectCard: -1, + prompt: "视为使用一张【火攻】", + ai: { + order: function (item, player) { + return get.order({ name: "huogong" }) + 0.01; + }, + }, + }, + ex: { + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return event.card && event.card.name == "huogong" && event.getParent().type == "card"; + }, + forced: true, + charlotte: true, + onremove: true, + intro: { content: "当你造成渠道为【火攻】的伤害时,此伤害+#" }, + content: function () { + trigger.num += player.countMark("jsrgguanhuo_ex"); + }, + }, + }, + }, + jsrgjuxia: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + usable: 1, + countSkill: function (player) { + return player.getSkills(null, false, false).filter(function (skill) { + var info = get.info(skill); + if (!info || info.charlotte) return false; + if (info.zhuSkill) return player.hasZhuSkill(skill); + return true; + }).length; + }, + filter: function (event, player) { + return event.player != player && lib.skill.jsrgjuxia.countSkill(event.player) > lib.skill.jsrgjuxia.countSkill(player); + }, + direct: true, + content: function () { + "step 0"; + var goon = get.effect(player, trigger.card, trigger.player, trigger.player) < 1; + if (goon && !event.isMine() && !event.isOnline()) game.delayx(); + trigger.player + .chooseBool("是否对" + get.translation(player) + "发动【居下】?", "令" + get.translation(trigger.card) + "对其无效,然后其摸两张牌") + .set("ai", () => { + return _status.event.goon; + }) + .set("goon", goon); + "step 1"; + if (result.bool) { + trigger.player.logSkill("jsrgjuxia", player); + trigger.excluded.add(player); + player.draw(2); + } else player.storage.counttrigger.jsrgjuxia--; + }, + ai: { + effect: { + target: function (card, player, target) { + if (lib.skill.jsrgjuxia.countSkill(target) >= lib.skill.jsrgjuxia.countSkill(player)) return; + if (card && (card.cards || card.isCard) && get.attitude(target, player) > 0 && (!target.storage.counttrigger || !target.storage.counttrigger.jsrgjuxia)) return [0, 0.5, 0, 0.5]; + }, + }, + }, + }, + //许劭 + jsrgyingmen: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame", "phaseBegin"], + }, + forced: true, + filter: function (event, player, name) { + if (player.getStorage("jsrgyingmen").length >= 4) return false; + if (name == "phaseBefore") return game.phaseNumber == 0; + return event.name != "phase" || event.player == player; + }, + update: function (player) { + var id = player.playerid; + var characters = player.getStorage("jsrgyingmen"); + var skillName = "jsrgpingjian_" + id; + var skillsx = [], + skillsx2 = []; + var map = {}; + var skillsy = lib.skill[skillName] ? lib.skill[skillName].group : []; + for (var name of characters) { + var skills = lib.character[name][3].slice(); + skills = skills.filter(skill => { + var list = get.skillCategoriesOf(skill, player); + list.removeArray(["锁定技", "Charlotte"]); + if (list.length) return false; + var info = get.info(skill); + return info && (!info.unique || info.gainable); + }); + game.expandSkills(skills); + for (var i = 0; i < skills.length; i++) { + var skill = skills[i]; + var info = get.info(skill); + if (info.silent || info.charlotte) continue; + if (!info.forced && !info.frequent && (!info.mod || (info.charlotte && info.mod))) continue; + var infox = get.copy(info); + var newname = skill + "_" + id; + map[newname] = infox; + if (info.audio) infox.audio = typeof info.audio != "number" ? info.audio : skill; + // if(infox.group) delete infox.group; + if (infox.frequent) delete infox.frequent; + if (infox.forceDie) delete infox.forceDie; + var popup = infox.popup; + if (infox.forced && infox.direct) { + delete infox.direct; + infox.popup = false; + } + if (infox.forced && !infox.prompt2) { + var skillx = skill; + while (true) { + var prompt2 = lib.translate[skillx + "_info"]; + if (prompt2 && prompt2.length) { + infox.prompt2 = prompt2; + break; + } + var ind = skillx.lastIndexOf("_"); + if (ind == -1) break; + skillx = skillx.slice(0, ind); + } + } + if (popup != false && !infox.silent) infox.forced = false; + if (!infox.charlotte && infox.mod) delete infox.mod; + skillsx2.add(skill); + skills[i] = newname; + } + if (skills.length) { + skillsx.addArray(skills); + } + } + var skillsRemoving = skillsy.removeArray(skillsx); + player.removeSkill(skillsRemoving); + game.broadcastAll( + function (name, skillsx, skillsx2, id, map) { + for (var i in map) lib.skill[i] = map[i]; + lib.skill[name] = { + unique: true, + group: skillsx, + }; + lib.translate[name] = "评鉴"; + for (var i of skillsx2) { + lib.translate[i + "_" + id] = lib.translate[i]; + lib.translate[i + "_" + id + "_info"] = lib.translate[i + "_info"]; + } + }, + skillName, + skillsx, + skillsx2, + id, + map + ); + player.addSkill(skillName); + player.addSkill("jsrgpingjian_blocker"); + player.addSkillTrigger(skillName); + }, + bannedList: ["zishu", "weishu", "xinfu_zhanji", "kyouko_rongzhu"], + content: function () { + "step 0"; + if (!_status.characterlist) lib.skill.pingjian.initList(); + var num = player.getStorage("jsrgyingmen").length; + var list = []; + _status.characterlist.randomSort(); + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + var skills = lib.character[name][3].slice(); + if ( + skills.some(skill => { + return lib.skill.jsrgyingmen.bannedList.includes(skill); + }) + ) + continue; + list.push(name); + _status.characterlist.remove(name); + if (list.length >= 4 - num) break; + } + if (list.length) { + player.markAuto("jsrgyingmen", list); + if (player.hasSkill("jsrgpingjian", null, false, false)) lib.skill.jsrgyingmen.update(player); + 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 + ); + } + }, + ai: { + combo: "jsrgpingjian", + }, + marktext: "客", + intro: { + name: "访客(盈门/评鉴)", + mark: function (dialog, storage, player) { + dialog.addText("剩余“访客”"); + if (storage) dialog.addSmall([storage, "character"]); + else dialog.addText("无"); + }, + }, + }, + jsrgpingjian: { + audio: 2, + trigger: { player: ["logSkill", "useSkillAfter"] }, + forced: true, + locked: false, + onremove: function (player) { + player.removeSkill("jsrgpingjian_" + player.playerid); + }, + filter: function (event, player) { + var skill = event.skill, + name = event.event ? event.event.name : ""; + var visitors = player.getStorage("jsrgyingmen"); + for (var visitor of visitors) { + var skills = lib.character[visitor][3].slice(); + game.expandSkills(skills); + var info = get.info(skill); + if (info && (info.charlotte || info.silent)) continue; + if ( + skills.some(skillx => { + return skill.indexOf(skillx) == 0 || name.indexOf(skillx + "_" + player.playerid) == 0; + }) + ) + return true; + } + return false; + }, + content: function () { + "step 0"; + var current; + var skill = trigger.skill, + name = trigger.event ? trigger.event.name : ""; + var visitors = player.getStorage("jsrgyingmen"); + for (var visitor of visitors) { + var skills = lib.character[visitor][3].slice(); + game.expandSkills(skills); + var info = get.info(skill); + if (info && info.charlotte) continue; + if ( + skills.some(skillx => { + return skill.indexOf(skillx) == 0 || name.indexOf(skillx + "_" + player.playerid) == 0; + }) + ) { + current = visitor; + break; + } + } + event.current = current; + player + .chooseButton(['###评鉴:移去一名访客###
    若移去的访客为' + get.translation(current) + ",则你摸一张牌
    ", [player.getStorage("jsrgyingmen"), "character"]], true) + .set("ai", button => { + if (button.link == _status.event.toremove) return 1; + return Math.random(); + }) + .set( + "toremove", + (function () { + var list = player.getStorage("jsrgyingmen"); + var rand = Math.random(); + if (rand < 0.33) return list[0]; + if (rand < 0.66) return current; + return list.randomGet(); + })() + ); + "step 1"; + if (result.bool) { + var visitor = result.links[0]; + game.log(player, "从", "#y访客", "中移去了", "#g" + get.translation(visitor)); + player.popup(visitor); + player.unmarkAuto("jsrgyingmen", [visitor]); + _status.characterlist.add(visitor); + if (visitor == event.current) player.draw(); + lib.skill.jsrgyingmen.update(player); + } + }, + subSkill: { + blocker: { + init: function (player, skill) { + player.addSkillBlocker(skill); + }, + onremove: function (player, skill) { + player.removeSkillBlocker(skill); + }, + charlotte: true, + locked: true, + skillBlocker: function (skill, player) { + if (skill != "jsrgpingjian_" + player.playerid) return false; + if (player._jsrgpingjian_blockerChecking) return; + player._jsrgpingjian_blockerChecking = true; + var own = player.hasSkill("jsrgpingjian"); + delete player._jsrgpingjian_blockerChecking; + return !own; + }, + }, + }, + }, + //董白 + jsrgshichong: { + audio: 2, + zhuanhuanji: true, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return event.target != player && event.targets.length == 1 && event.target.isIn() && event.target.countCards("h"); + }, + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + var str = "转换技。当你使用牌指定其他角色为唯一目标后,"; + if (storage) return str + "目标角色可以交给你一张手牌。"; + return str + "你可以获得目标角色一张手牌。"; + }, + }, + content: function () { + "step 0"; + if (!player.storage.jsrgshichong) { + player + .chooseBool(get.prompt("jsrgshichong", trigger.target), "你可以获得该角色的一张手牌") + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.attitude(player, trigger.target) <= 0); + } else { + trigger.target + .chooseCard("是否发动" + get.translation(player) + "的【恃宠】?", "你可以选择一张手牌,并交给该角色") + .set("ai", card => { + if (_status.event.goon) return 5 - get.value(card); + return 0 - get.value(card); + }) + .set("goon", get.attitude(trigger.target, player) > 2); + } + "step 1"; + if (result.bool) { + if (!player.storage.jsrgshichong) { + player.logSkill("jsrgshichong", trigger.target); + player.gainPlayerCard(trigger.target, "h", true); + } else { + trigger.target.logSkill("jsrgshichong", player); + trigger.target.give(result.cards, player); + } + player.changeZhuanhuanji("jsrgshichong"); + } + }, + }, + jsrglianzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: { color: "black" }, + position: "h", + filterTarget: lib.filter.notMe, + lose: false, + discard: false, + delay: false, + content: function () { + "step 0"; + player.showCards(cards, get.translation(player) + "发动了【连诛】"); + "step 1"; + player.give(cards, target); + "step 2"; + event.targets = game + .filterPlayer(current => { + return current.group == target.group && current != player; + }) + .sortBySeat(); + game.delayx(); + "step 3"; + var target = targets.shift(); + if (player.canUse("guohe", target)) { + player.useCard({ name: "guohe", isCard: true }, target); + } + if (targets.length) event.redo(); + }, + ai: { + order: 4, + result: { + target: function (player, target) { + var targets = game.filterPlayer(current => { + return current.group == target.group && current != player; + }); + var eff = targets.reduce((p, c) => { + return p + get.effect(c, { name: "guohe" }, player, player); + }, 0); + if (ui.selected.cards.length) eff += get.value(ui.selected.cards[0], target); + return eff; + }, + }, + }, + }, + //桥玄 + jsrgjuezhi: { + audio: 2, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + if (_status.currentPhase != player || player.hasSkill("jsrgjuezhi_used", null, null, false)) return false; + return event.card && event.getParent().type == "card" && lib.skill.jsrgjuezhi.getNum(event.player, player) > 0; + }, + forced: true, + locked: false, + getNum: function (target, player) { + return target.countCards("e", card => { + var subtype = get.subtypes(card); + for (var i of subtype) { + if (player.hasDisabledSlot(i)) return true; + } + return false; + }); + }, + group: "jsrgjuezhi_disable", + content: function () { + player.addTempSkill("jsrgjuezhi_used", ["phaseZhunbeiAfter", "phaseJudgeAfter", "phaseDrawAfter", "phaseUseAfter", "phaseDiscardAfter", "phaseJieshuAfter"]); + trigger.num += lib.skill.jsrgjuezhi.getNum(trigger.player, player); + }, + subSkill: { + disable: { + audio: "jsrgjuezhi", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; + }, + content: function () { + "step 0"; + event.cards = trigger.getl(player).es; + "step 1"; + var card = cards.shift(), + subtypes = get.subtypes(card).filter(slot => player.hasEnabledSlot(slot)); + event.subtypes = subtypes; + if (subtypes.length > 0) { + player.chooseBool(get.prompt("jsrgjuezhi_disable"), "废除你的" + get.translation(subtypes) + "栏").set("ai", () => 1); + } else event._result = { bool: false }; + "step 2"; + if (result.bool) { + player.logSkill("jsrgjuezhi_disable"); + player.disableEquip(event.subtypes); + } + if (cards.length > 0) event.goto(1); + }, + }, + used: { charlotte: true }, + }, + }, + jsrgjizhao: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("jsrgjizhao")).set("ai", target => { + var player = _status.event.player; + if (player.countCards("j")) return player == target ? 10 : 0.1; + return 6 - get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jsrgjizhao", target); + target.chooseToUse({ + filterCard: function (card, player, event) { + if (get.itemtype(card) != "card" || (get.position(card) != "h" && get.position(card) != "s")) return false; + return lib.filter.filterCard.apply(this, arguments); + }, + prompt: "急召:使用一张手牌,否则" + get.translation(player) + "可以移动你区域里的一张牌", + addCount: false, + goon: target != player || !player.countCards("j"), + ai1: function (card) { + if (_status.event.goon) return get.order(card); + return 0; + }, + }); + } else { + event.finish(); + return; + } + "step 2"; + if (result.bool) { + event.finish(); + return; + } + var targets = game.filterPlayer(current => { + if (current == target) return false; + var hs = target.getCards("h"); + if (hs.length) return true; + var js = target.getCards("j"); + for (var i = 0; i < js.length; i++) { + if (current.canAddJudge(js[i])) return true; + } + if (current.isMin()) return false; + var es = target.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (current.canEquip(es[i])) return true; + } + return false; + }); + if (targets.length) { + var next = player.chooseTarget(function (card, player, target) { + return _status.event.targets.includes(target); + }); + next.set("from", target); + next.set("targets", targets); + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var sgnatt = get.sgn(att); + var from = _status.event.from; + var es = from.getCards("e"); + var i; + var att2 = get.sgn(get.attitude(player, from)); + for (i = 0; i < es.length; i++) { + if (sgnatt != 0 && att2 != 0 && sgnatt != att2 && get.sgn(get.value(es[i], from)) == -att2 && get.sgn(get.effect(target, es[i], player, target)) == sgnatt && target.canEquip(es[i])) { + return Math.abs(att); + } + } + if ( + i == es.length && + (!from.countCards("j", function (card) { + return target.canAddJudge(card); + }) || + att2 <= 0) + ) { + if (from.countCards("h") > 0) return att; + return 0; + } + return -att * att2; + }); + next.set("targetprompt", "移动目标"); + next.set("prompt", "急召:是否移动" + get.translation(target) + "的一张牌?"); + } else event.finish(); + "step 3"; + if (result.bool) { + var target2 = result.targets[0]; + event.targets = [target, target2]; + player.line2(event.targets, "green"); + } else { + event.finish(); + } + "step 4"; + game.delay(); + "step 5"; + if (targets.length == 2) { + player + .choosePlayerCard( + "hej", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if (get.attitude(player, targets0) > 0 && get.attitude(player, targets1) < 0) { + if (get.position(button.link) == "j") return 12; + if (get.value(button.link, targets0) < 0 && get.effect(targets1, button.link, player, targets1) > 0) return 10; + return 0; + } else { + if (get.position(button.link) == "j") return -10; + if (get.position(button.link) == "h") return 10; + return get.value(button.link) * get.effect(targets1, button.link, player, targets1); + } + }, + targets[0] + ) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + var targets1 = _status.event.targets1; + if (get.position(button.link) == "h") { + return true; + } else if (get.position(button.link) == "j") { + return targets1.canAddJudge(button.link); + } else { + return targets1.canEquip(button.link); + } + }); + } else { + event.finish(); + } + "step 6"; + if (result.bool && result.links.length) { + var link = result.links[0]; + if (get.position(link) == "h") event.targets[1].gain(link, event.targets[0], "giveAuto"); + else { + event.targets[0].$give(link, event.targets[1], false); + if (get.position(link) == "e") event.targets[1].equip(link); + else if (link.viewAs) event.targets[1].addJudge({ name: link.viewAs }, [link]); + else event.targets[1].addJudge(link); + } + game.log(event.targets[0], "的", get.position(link) == "h" ? "一张手牌" : link, "被移动给了", event.targets[1]); + game.delay(); + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "delay" && current < 0) { + if (target.countCards("j")) return; + return "zerotarget"; + } + }, + }, + }, + }, + //杨彪 + jsrgzhaohan: { + audio: "zhaohan", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + //locked:false, + filter: function (event, player) { + if (game.shuffleNumber == 0) return player.isDamaged(); + return true; + }, + content: function () { + player[game.shuffleNumber > 0 ? "loseHp" : "recover"](); + }, + }, + jsrgrangjie: { + audio: "rangjie", + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return player.canMoveCard(); + }, + check: function (event, player) { + return player.canMoveCard(true); + }, + content: function () { + "step 0"; + event.num = trigger.num; + "step 1"; + event.num--; + if (player.canMoveCard()) player.moveCard(true); + "step 2"; + if (result.bool) { + var card = result.card; + var suit = get.suit(card, false); + var cards = Array.from(ui.discardPile.childNodes); + var gains = []; + var history = game.getGlobalHistory("cardMove", evt => { + if (evt.name == "lose") return evt.position == ui.discardPile; + return evt.name == "cardsDiscard"; + }); + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + var cards2 = evt.cards.filter(card => { + return cards.includes(card) && get.suit(card, false) == suit; + }); + if (cards2.length) { + gains.addArray(cards2); + cards.removeArray(cards2); + } + if (!cards.length) break; + } + if (gains.length) { + player.chooseButton(["让节:是否获得一张" + get.translation(suit) + "牌?", gains]).set("ai", get.buttonValue); + } else event._result = { bool: false }; + } + "step 3"; + if (result.bool) { + player.gain(result.links, "gain2"); + } + "step 4"; + if (event.num > 0 && player.hasSkill("jsrgrangjie")) { + player + .chooseBool(get.prompt2("jsrgrangjie")) + .set("ai", () => _status.event.bool) + .set("bool", lib.skill.jsrgrangjie.check(trigger, player)); + } else event.finish(); + "step 5"; + if (result.bool) { + player.logSkill("jsrgrangjie"); + event.goto(1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target._jsrgrangjie_aiChecking) return; + target._jsrgrangjie_aiChecking = true; + var moveCard = target.canMoveCard(true); + delete target._jsrgrangjie_aiChecking; + if (!moveCard || !target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.5; + else num = 0.3; + } + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; + } + }, + }, + }, + }, + jsrgyizheng: { + audio: "yizheng", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h") && player.canCompare(current); + }); + }, + filterTarget: function (card, player, current) { + return current.countCards("h") > player.countCards("h") && player.canCompare(current); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + target.skip("phaseDraw"); + target.addTempSkill("yizheng2", { player: "phaseDrawSkipped" }); + event.finish(); + } else { + target + .chooseControl("1", "2", "cancel") + .set("prompt", "是否对" + get.translation(player) + "造成至多2点伤害?") + .set("ai", () => { + return _status.event.choice; + }) + .set("choice", get.damageEffect(player, target, target) > 0 ? (get.attitude(target, player) > 0 ? 0 : 1) : "cancel2"); + } + "step 2"; + if (result.control != "cancel2") { + var num = result.index + 1; + target.line(player); + player.damage(target, num); + } + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.skipList.includes("phaseDraw") || target.hasSkill("pingkou")) return 0; + 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 -1; + return 0; + }, + }, + }, + }, + //孔融 + jsrglirang: { + audio: "splirang", + trigger: { global: "phaseDrawBegin" }, + direct: true, + filter: function (event, player) { + return event.player != player && !player.hasSkill("jsrglirang_used") && player.countCards("he") > 1; + }, + content: function () { + "step 0"; + player + .chooseCard(get.prompt("jsrglirang", trigger.player), "你可以选择两张牌,将这些牌交给该角色。若如此做,你获得其本回合弃牌阶段弃置的所有牌。", 2, "he") + .set("ai", card => { + if (!_status.event.give) return 0; + var player = _status.event.player, + target = _status.event.target; + return target.getUseValue(card) - player.getUseValue(card) + 0.5; + }) + .set("give", get.attitude(player, trigger.player) > 0) + .set("target", trigger.player); + "step 1"; + if (result.bool) { + player.logSkill("jsrglirang", trigger.player); + var cards = result.cards; + player.give(cards, trigger.player); + player.addTempSkill("jsrglirang_used", "roundStart"); + player.addTempSkill("jsrglirang_given"); + player.markAuto("jsrglirang_used", [trigger.player]); + } + }, + subSkill: { + used: { + charlotte: true, + onremove: true, + intro: { content: "本轮〖礼让〗目标:$" }, + }, + given: { + audio: "splirang", + trigger: { global: "phaseDiscardEnd" }, + filter: function (event, player) { + return event.player.hasHistory("lose", evt => { + return evt.type == "discard" && evt.getParent("phaseDiscard") == event && evt.cards2.filterInD("d").length > 0; + }); + }, + charlotte: true, + prompt2: function (event, player) { + var cards = []; + event.player.getHistory("lose", evt => { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) cards.addArray(evt.cards2.filterInD("d")); + }); + return "获得" + get.translation(cards); + }, + content: function () { + var cards = []; + trigger.player.getHistory("lose", evt => { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) cards.addArray(evt.cards2.filterInD("d")); + }); + player.gain(cards, "gain2"); + }, + }, + }, + }, + jsrgzhengyi: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + var list = player.getStorage("jsrglirang_used"); + if (!list.length) return false; + return !player.getHistory("damage").length && list[0].isIn(); + }, + direct: true, + content: function () { + "step 0"; + var target = player.getStorage("jsrglirang_used")[0]; + event.target = target; + target + .chooseBool("是否对" + get.translation(player) + "发动【争义】?", "将此" + (trigger.source ? "来源为" + get.translation(trigger.source) : "无来源") + "的" + trigger.num + "点伤害转移给你") + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.damageEffect(player, trigger.source, target) > get.damageEffect(target, trigger.source, target)); + "step 1"; + if (result.bool) { + target.logSkill("jsrgzhengyi", player); + trigger.cancel(); + target.damage(trigger.source, trigger.nature, trigger.num).set("card", trigger.card).set("cards", trigger.cards); + } + }, + ai: { + combo: "jsrglirang", + }, + }, + //朱儁 + jsrgfendi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.targets.length == 1 && event.card.name == "sha" && event.targets[0].countCards("h") > 0; + }, + usable: 1, + logTarget: "target", + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + player + .choosePlayerCard(target, "h", true, [1, Infinity], "分敌:展示" + get.translation(target) + "的任意张手牌") + .set("ai", button => { + if (_status.event.all) return 1; + if (ui.selected.buttons.length) return 0; + return Math.random(); + }) + .set( + "all", + !target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) && Math.random() < 0.75 + ) + .set("forceAuto", true); + "step 1"; + if (result.bool) { + var cards = result.cards; + target.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【分敌】"); + target.addGaintag(cards, "jsrgfendi_tag"); + target.addTempSkill("jsrgfendi_blocker"); + player.addTempSkill("jsrgfendi_gain"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.jsrgfendi = cards.slice(); + player.storage.jsrgfendi_gain = target; + } else player.storage.counttrigger.jsrgfendi--; + }, + subSkill: { + blocker: { + trigger: { + player: ["damageBefore", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], + global: ["useCardEnd"], + }, + forced: true, + popup: false, + charlotte: true, + content: function () { + player.removeSkill("jsrgfendi_blocker"); + }, + mod: { + cardEnabled: function (card, player) { + if (card.cards) { + for (var i of card.cards) { + if (!i.hasGaintag("jsrgfendi_tag")) return false; + } + } else if (get.itemtype(card) == "card") { + if (!card.hasGaintag("jsrgfendi_tag")) return false; + } + }, + cardRespondable: function (card, player) { + return lib.skill.jsrgfendi.cardEnabled.apply(this, arguments); + }, + cardSavable: function (card, player) { + return lib.skill.jsrgfendi.cardEnabled.apply(this, arguments); + }, + }, + }, + gain: { + trigger: { global: "damageSource" }, + charlotte: true, + forced: true, + direct: true, + onremove: true, + filter: function (event, player) { + if (!event.card || !event.card.storage) return false; + var cards = event.card.storage.jsrgfendi; + var target = player.storage.jsrgfendi_gain; + if (!cards || !target || !target.isIn()) return false; + var cardsx = target.getCards("h"); + cardsx.addArray(Array.from(ui.discardPile)); + return cards.some(i => cardsx.includes(i)); + //target.hasCard(card=>{ + // return card.hasGaintag('jsrgfendi_tag'); + //},'h'); + }, + content: function () { + var target = player.storage.jsrgfendi_gain; + player.logSkill("jsrgfendi_gain", target); + var cardsx = target.getCards("h"); + cardsx.addArray(Array.from(ui.discardPile)); + var cards = trigger.card.storage.jsrgfendi.filter(i => cardsx.includes(i)); + player.gain(cards, "give"); + }, + }, + }, + }, + jsrgjuxiang: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.name == "phaseDraw") return false; + var hs = player.getCards("h"); + var cards = event.getg(player).filter(i => hs.includes(i)); + if (!cards.length) return false; + for (var card of cards) { + if (!lib.filter.cardDiscardable(card, player, "jsrgjuxiang")) return false; + } + return true; + }, + check: function (event, player) { + var target = _status.currentPhase; + if (!target || get.attitude(player, target) <= 0) return false; + var evt = event.getParent("phaseDiscard"), + evt2 = event.getParent("phaseJieshu"); + if ((evt && evt.name == "phaseDiscard") || (evt2 && evt.name == "phaseJieshu")) return false; + if (target.getCardUsable({ name: "sha" }) >= target.countCards("hs", "sha")) return false; + if (!target.hasValueTarget({ name: "sha" })) return false; + var hs = player.getCards("h"); + var cards = event.getg(player).filter(i => hs.includes(i)); + var val = 0; + for (var i of cards) val += get.value(i); + if (val < 10) return true; + return false; + }, + prompt2: function (event, player) { + var hs = player.getCards("h"); + var cards = event.getg(player).filter(i => hs.includes(i)); + var target = _status.currentPhase; + var str = "弃置" + get.translation(cards); + if (target && target.isIn()) { + var list = []; + for (var card of cards) { + list.add(get.suit(card, player)); + } + var num = list.length; + str += ",然后令" + get.translation(target) + "于此回合额定的出牌阶段内使用【杀】的次数上限+" + num; + } + return str; + }, + content: function () { + "step 0"; + var hs = player.getCards("h"); + var cards = trigger.getg(player).filter(i => hs.includes(i)); + var list = []; + for (var card of cards) { + list.add(get.suit(card, player)); + } + event.num = list.length; + player.discard(cards); + "step 1"; + var target = _status.currentPhase; + if (target && target.isIn()) { + target.addTempSkill("jsrgjuxiang_sha"); + target.addMark("jsrgjuxiang_sha", num, false); + var evt = trigger.getParent("phaseUse"); + if (evt && evt.name == "phaseUse" && !evt.skill) { + evt.player.addTempSkill("jsrgjuxiang_buff", "phaseUseAfter"); + evt.player.addMark("jsrgjuxiang_buff", num, false); + } + } + }, + subSkill: { + sha: { + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return !event.skill; + }, + silent: true, + charlotte: true, + forced: true, + onremove: true, + content: function () { + trigger.player.addTempSkill("jsrgjuxiang_buff", "phaseUseAfter"); + trigger.player.addMark("jsrgjuxiang_buff", player.countMark("jsrgjuxiang_sha"), false); + }, + }, + buff: { + charlotte: true, + intro: { content: "使用【杀】的次数上限+#" }, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("jsrgjuxiang_buff"); + }, + }, + }, + }, + }, + //刘备 + jsrgjishan: { + audio: 2, + trigger: { global: "damageBegin4" }, + usable: 1, + filter: function (event, player) { + return player.hp > 0; + }, + logTarget: "player", + onremove: true, + prompt2: "失去1点体力并防止此伤害,然后你与其各摸一张牌", + check: function (event, player) { + return get.damageEffect(event.player, event.source, _status.event.player, event.nature) * event.num < get.effect(player, { name: "losehp" }, player, _status.event.player) + get.effect(player, { name: "draw" }, player, _status.event.player) + get.effect(event.player, { name: "draw" }, player, _status.event.player) / 2; + }, + group: "jsrgjishan_recover", + content: function () { + "step 0"; + trigger.cancel(); + player.loseHp(); + player.markAuto("jsrgjishan", [trigger.player]); + "step 1"; + if (player.isIn() && trigger.player.isIn()) { + var targets = [player, trigger.player]; + targets.sortBySeat(_status.currentPhase); + targets[0].draw("nodelay"); + targets[1].draw(); + } + }, + intro: { content: "已帮助$抵挡过伤害" }, + ai: { expose: 0.2 }, + subSkill: { + recover: { + audio: "jsrgjishan", + trigger: { source: "damageSource" }, + filter: function (event, player) { + return game.hasPlayer(current => { + return current.isMinHp() && player.getStorage("jsrgjishan").includes(current); + }); + }, + usable: 1, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("jsrgjishan_recover"), "令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力", (card, player, target) => { + return target.isMinHp() && player.getStorage("jsrgjishan").includes(target); + }) + .set("ai", target => { + return get.recoverEffect(target, _status.event.player, _status.event.player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrgjishan_recover", target); + target.recover(); + } else player.storage.counttrigger.jsrgjishan_recover--; + }, + }, + }, + }, + jsrgzhenqiao: { + audio: 2, + trigger: { player: "useCardToTargeted" }, + forced: true, + shaRelated: true, + filter: function (event, player) { + return event.isFirstTarget && event.card.name == "sha" && player.hasEmptySlot(1); + }, + content: function () { + // trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); + // trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); + trigger.getParent().effectCount++; + }, + mod: { + attackRange: function (player, num) { + return num + 1; + }, + aiOrder: (player, card, num) => { + if (num > 0 && get.itemtype(card) === "card" && get.subtype(card) === "equip1" && !player.getEquip(1)) { + if ( + card.name !== "zhuge" || + player.getCardUsable("sha") || + !player.needsToDiscard() || + player.countCards("hs", i => { + return get.name(i) === "sha" && lib.filter.cardEnabled(i, player); + }) < 2 + ) + return 0; + } + }, + aiValue: (player, card, num) => { + if (num > 0 && get.itemtype(card) === "card" && card.name !== "zhuge" && get.subtype(card) === "equip1" && !player.getEquip(1)) return 0.01 * num; + }, + aiUseful: () => { + return lib.skill.jsrgzhenqiao.mod.aiValue.apply(this, arguments); + }, + }, + }, + //王允 + jsrgshelun: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => player.inRange(current)); + }, + filterTarget: function (card, player, target) { + return player.inRange(target); + }, + content: function () { + var num = player.countCards("h"); + var targets = game.filterPlayer(current => { + return current.countCards("h") <= num && current != target; + }); + player + .chooseToDebate(targets) + .set("callback", function () { + var result = event.debateResult; + if (result.bool && result.opinion) { + var opinion = result.opinion; + var target = event.getParent(2).target; + if (opinion == "red") player.discardPlayerCard(target, "he", true); + else target.damage(); + } + }) + .set("ai", card => { + var player = _status.event.player; + var color = player == _status.event.source || get.damageEffect(_status.event.getParent(2).target, player, player) > 0 ? "black" : "red"; + var val = 5 - get.value(card); + if (get.color(card) == color) val += 10; + return val; + }) + .set("aiCard", target => { + var color = target == _status.event.source || get.damageEffect(_status.event.getParent(2).target, target, target) > 0 ? "black" : "red"; + var hs = target.getCards("h", { color: color }); + if (!hs.length) hs = target.getCards("h"); + return { bool: true, cards: [hs.randomGet()] }; + }) + .set("target", target); + }, + ai: { + order: 8, + expose: 0.2, + result: { target: -1 }, + }, + }, + jsrgfayi: { + audio: 2, + trigger: { global: "chooseToDebateAfter" }, + filter: function (event, player) { + if (!event.targets.includes(player)) return false; + if (event.red.map(i => i[0]).includes(player)) return event.black.length; + if (event.black.map(i => i[0]).includes(player)) return event.red.length; + return false; + }, + direct: true, + content: function () { + "step 0"; + var targets = []; + if (trigger.red.map(i => i[0]).includes(player)) targets = trigger.black; + if (trigger.black.map(i => i[0]).includes(player)) targets = trigger.red; + player + .chooseTarget(get.prompt("jsrgfayi"), "对一名与你意见不同的角色造成1点伤害", (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set( + "targets", + targets.map(i => i[0]) + ) + .set("ai", target => { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrgfayi", target); + target.damage(); + } + }, + }, + jsrgtushe: { + audio: "xinfu_tushe", + mod: { + aiOrder(player, card, num) { + if (get.tag(card, "multitarget")) { + if (player.countCards("h", { type: "basic" })) return num / 10; + return num * 10; + } + if (get.type(card) === "basic") return num + 10; + }, + aiValue(player, card, num) { + if (card.name === "zhangba") { + let fact = n => { + if (n > 1) return n * fact(n - 1); + return 1; + }, + basic = 0; + return fact( + Math.min( + player.countCards("hs", i => { + if (get.tag(i, "multitarget")) return 2; + if (!["shan", "tao", "jiu"].includes(card.name)) return 1; + basic++; + }) / + (1 + basic), + player.getCardUsable("sha") + ) + ); + } + if (["shan", "tao", "jiu"].includes(card.name)) { + if (player.getEquip("zhangba") && player.countCards("hs") > 1) return 0.01; + return num / 2; + } + if (get.tag(card, "multitarget")) return num + game.players.length; + }, + aiUseful(player, card, num) { + if (get.name(card, player) === "shan") { + if ( + player.countCards("hs", i => { + if (card === i || (card.cards && card.cards.includes(i))) return false; + return get.name(i, player) === "shan"; + }) + ) + return -1; + return num / Math.pow(Math.max(1, player.hp), 2); + } + }, + }, + trigger: { + player: "useCardToPlayered", + }, + filter: function (event, player) { + if (get.type(event.card) == "equip") return false; + if (event.getParent().triggeredTargets3.length > 1) return false; + return event.targets.length > 0; + }, + check: function (event, player) { + return !player.countCards("h", { type: "basic" }); + }, + locked: false, + content: function () { + "step 0"; + player.showHandcards(); + "step 1"; + if (player.countCards("h", { type: "basic" })) event.finish(); + else player.chooseBool("图射:是否摸" + get.cnNumber(trigger.targets.length) + "张牌?").set("ai", () => 1); + "step 2"; + if (result.bool) { + player.draw(trigger.targets.length); + } + }, + ai: { + presha: true, + pretao: true, + threaten: 1.8, + effect: { + player(card, player, target) { + if ( + typeof card === "object" && + card.name !== "shan" && + get.type(card) !== "equip" && + !player.countCards("h", i => { + if (card === i || (card.cards && card.cards.includes(i))) return false; + return get.type(i) === "basic"; + }) + ) { + let targets = [], + evt = _status.event.getParent("useCard"); + targets.addArray(ui.selected.targets); + if (evt && evt.card == card) targets.addArray(evt.targets); + if (targets.length) return [1, targets.length]; + if (get.tag(card, "multitarget")) return [1, game.players.length - 1]; + return [1, 1]; + } + }, + }, + }, + }, + jsrgtongjue: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuSkill: true, + filter: function (event, player) { + return player.hasZhuSkill("jsrgtongjue") && game.hasPlayer(current => current != player && current.group == "qun"); + }, + filterCard: true, + selectCard: [1, Infinity], + filterTarget: function (card, player, target) { + return target != player && target.group == "qun"; + }, + selectTarget: [1, Infinity], + filterOk: function () { + return ui.selected.cards.length == ui.selected.targets.length; + }, + check: function (card) { + var player = _status.event.player; + if ( + player.hasCard(card => { + return player.hasValueTarget(card); + }, "hs") + ) { + return 3 - player.getUseValue(card); + } + return 3 - get.value(card); + }, + multiline: true, + multitarget: true, + delay: false, + discard: false, + lose: false, + content: function () { + "step 0"; + var list = []; + for (var i = 0; i < targets.length; i++) { + var target = targets[i]; + var card = cards[i]; + list.push([target, card]); + } + game.loseAsync({ + gain_list: list, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + "step 1"; + player.addTempSkill("jsrgtongjue_blocker"); + player.markAuto("jsrgtongjue_blocker", targets); + }, + ai: { + order: 5, + result: { + target: 1, + }, + }, + subSkill: { + blocker: { + charlotte: true, + onremove: true, + mod: { + playerEnabled: function (card, player, target) { + if (player.getStorage("jsrgtongjue_blocker").includes(target)) return false; + }, + }, + mark: true, + intro: { content: "$已经立牧自居,不可接近" }, + }, + }, + }, + //404曹操 + jsrgzhenglve: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + var zhu = get.zhu(player) || game.findPlayer(current => current.getSeatNum() == 1); + return event.player == zhu; + }, + locked: false, + group: "jsrgzhenglve_damage", + prompt2: function (event, player) { + var num = Math.min( + event.player.getHistory("sourceDamage").length > 0 ? 1 : 2, + game.countPlayer(current => { + return !current.hasMark("jsrgzhenglve_mark"); + }) + ); + if (num == 0) return "你可以摸一张牌"; + return "你可以摸一张牌并令" + get.cnNumber(num) + "名角色获得“猎”标记"; + }, + content: function () { + "step 0"; + player.draw(); + "step 1"; + var damaged = trigger.player.getHistory("sourceDamage").length > 0; + var num = damaged ? 1 : 2; + var targets = game.filterPlayer(current => { + return !current.hasMark("jsrgzhenglve_mark"); + }); + if (!targets.length) event.finish(); + else if (targets.length <= num) event._result = { bool: true, targets: targets }; + else + player + .chooseTarget("令" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "名角色获得“猎”标记", true, [1, num], (card, player, target) => { + return !target.hasMark("jsrgzhenglve_mark"); + }) + .set("ai", target => { + var att = get.attitude(_status.event.player, target); + return 100 - att; + }); + "step 2"; + if (result.bool) { + var targets = result.targets; + player.line(targets); + targets.forEach(i => i.addMark("jsrgzhenglve_mark", 1)); + } + }, + mod: { + cardUsableTarget: function (card, player, target) { + if (target.hasMark("jsrgzhenglve_mark")) return true; + }, + targetInRange: function (card, player, target) { + if (target.hasMark("jsrgzhenglve_mark")) return true; + }, + }, + subSkill: { + damage: { + audio: "jsrgzhenglve", + trigger: { source: "damageSource" }, + usable: 1, + filter: function (event, player) { + return event.player.hasMark("jsrgzhenglve_mark"); + }, + prompt2: function (event, player) { + var cards = event.cards || []; + return "摸一张牌" + (cards.filterInD().length ? "并获得" + get.translation(event.cards.filterInD()) : ""); + }, + content: function () { + "step 0"; + player.draw(); + var cards = trigger.cards; + if (cards && cards.filterInD().length) { + player.gain(cards.filterInD(), "gain2"); + } + }, + }, + mark: { + marktext: "猎", + intro: { + name: "猎(政略)", + name2: "猎", + markcount: () => 0, + content: "已拥有“猎”标记", + }, + }, + }, + }, + jsrghuilie: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "thunder", + derivation: ["jsrgpingrong", "feiying"], + filter: function (event, player) { + return game.countPlayer(current => current.hasMark("jsrgzhenglve_mark")) > 2; + }, + content: function () { + "step 0"; + player.awakenSkill("jsrghuilie"); + player.loseMaxHp(); + "step 1"; + player.addSkills(["jsrgpingrong", "feiying"]); + }, + ai: { + combo: "jsrgzhenglve", + }, + }, + jsrgpingrong: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + return !player.hasSkill("jsrgpingrong_used") && game.hasPlayer(current => current.hasMark("jsrgzhenglve_mark")); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("jsrghuilie"), "移去一名角色的“猎”,然后你执行一个额外回合。若你在此额外回合内未造成伤害,则你失去1点体力。", (card, player, target) => { + return target.hasMark("jsrgzhenglve_mark"); + }) + .set("ai", target => { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrgpingrong", target); + player.addTempSkill("jsrgpingrong_used", "roundStart"); + target.removeMark("jsrgzhenglve_mark", target.countMark("jsrgzhenglve_mark")); + player.insertPhase(); + player.addSkill("jsrgpingrong_check"); + } + }, + subSkill: { + used: { charlotte: true }, + check: { + audio: "jsrgpingrong", + trigger: { player: "phaseAfter" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return event.skill == "jsrgpingrong" && !player.getHistory("sourceDamage").length; + }, + content: function () { + player.loseHp(); + }, + }, + }, + ai: { + combo: "jsrgzhenglve", + }, + }, + //南华老仙 + jsrgshoushu: { + audio: 2, + forced: true, + trigger: { + //player:'enterGame', + //global:'phaseBefore', + global: "roundStart", + }, + filter: function (event, player) { + if ( + game.hasPlayer(function (current) { + return current.countCards("hej", "taipingyaoshu"); + }) + ) + return false; + return true; + //return event.name!='phase'||game.phaseNumber==0; + }, + direct: true, + group: "jsrgshoushu_destroy", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("jsrgshoushu"), "将【太平要术】置入一名角色的装备区", (card, player, target) => { + var card = { name: "taipingyaoshu" }; + return target.canEquip(card, true); + }) + .set("ai", target => { + return target.getUseValue({ name: "taipingyaoshu" }) * get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jsrgshoushu", target); + if (!lib.inpile.includes("taipingyaoshu")) { + lib.inpile.push("taipingyaoshu"); + } + event.card = game.createCard2("taipingyaoshu", "heart", 3); + } else event.finish(); + "step 2"; + if (card) target.equip(card); + }, + subSkill: { + destroy: { + audio: "jsrgshoushu", + trigger: { + global: ["loseEnd", "equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd"], + }, + forced: true, + filter: function (event, player) { + return game.hasPlayer(current => { + var evt = event.getl(current); + if (evt && evt.es) return evt.es.some(i => i.name == "taipingyaoshu"); + return false; + }); + }, + content: function () { + var cards = []; + game.countPlayer(current => { + var evt = trigger.getl(current); + if (evt && evt.es) return cards.addArray(evt.es.filter(i => i.name == "taipingyaoshu")); + }); + game.cardsGotoSpecial(cards); + game.log(cards, "被销毁了"); + }, + }, + }, + }, + jsrgxundao: { + audio: 2, + trigger: { player: "judge" }, + filter: function (event, player) { + return game.hasPlayer(current => current.countCards("he")); + }, + direct: true, + content: function () { + "step 0"; + var prompt2 = get.translation(player) + "(你)的" + (trigger.judgestr || "") + "判定为" + get.translation(player.judging[0]) + "," + "是否令至多两名角色依次弃置一张牌,然后选择其中一张作为新判定牌?"; + player + .chooseTarget(get.prompt("jsrgxundao"), prompt2, [1, 2], (card, player, target) => { + return target.countCards("he"); + }) + .set("ai", target => { + var player = _status.event.player; + if (!_status.event.todiscard) return 0; + if (_status.event.todiscard != "all") { + if (target == _status.event.todiscard) return 100; + } + return get.effect(target, { name: "guohe_copy2" }, player, player) / 2; + }) + .set( + "todiscard", + (function () { + if (trigger.judgestr == "闪电" && get.damageEffect(player, null, player, "thunder") >= 0) return "all"; + var friends = game.filterPlayer(i => get.attitude(i, player) > 0); + for (var friend of friends) { + var cardsx = friend.getCards("he", card => trigger.judge(card) > 0); + cardsx.sort((a, b) => { + return get.value(a) - get.value(b); + }); + if (cardsx.length) { + var card = cardsx[0]; + if (trigger.judge(player.judging[0]) >= 0) { + if (get.value(card) > 4) return false; + } + return get.owner(card); + } + } + return "all"; + })() + ); + "step 1"; + if (result.bool) { + var targets = result.targets; + targets.sortBySeat(_status.currentPhase); + event.targets = targets; + player.logSkill("jsrgxundao", targets); + event.cards = []; + } else event.finish(); + "step 2"; + var target = targets.shift(); + target.chooseToDiscard("寻道:请弃置一张牌" + (target == player ? "" : ",可能被作为新判定牌"), "he", true).set("ai", card => { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0.1; + if (attitude > 0) { + return result + 0.01; + } else { + return 0.01 - result; + } + }); + "step 3"; + if (result.bool) { + event.cards.addArray(result.cards); + } + if (targets.length) event.goto(2); + "step 4"; + var cards = event.cards.filterInD("d"); + if (cards.length) { + player.chooseButton(["寻道:选择一张作为新判定牌", cards], true).set("ai", button => { + return trigger.judge(button.link); + }); + } else event.finish(); + "step 5"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + game.cardsGotoOrdering(card).relatedEvent = trigger; + } else event.finish(); + "step 6"; + if (player.judging[0].clone) { + game.broadcastAll( + function (card, card2, player) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + var node = player.$throwordered(card2.copy(), true); + node.classList.add("thrownhighlight"); + ui.arena.classList.add("thrownhighlight"); + }, + player.judging[0], + card, + player + ); + game.addVideo("deletenode", player, get.cardsInfo([player.judging[0].clone])); + } + game.cardsDiscard(player.judging[0]); + player.judging[0] = card; + trigger.orderingCards.add(card); + game.log(player, "的判定牌改为", card); + game.delay(2); + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + jsrglinghua: { + audio: 2, + trigger: { + player: ["phaseZhunbeiBegin", "phaseJieshuBegin"], + }, + prompt2: function (event, player) { + var zhunbei = event.name == "phaseZhunbei"; + return "进行目标为你" + (zhunbei ? "" : "且效果反转") + "的【闪电】判定。若你未因此受到伤害,你可以" + (zhunbei ? "令一名角色回复1点体力" : "对一名角色造成1点雷电伤害"); + }, + check: function (event, player) { + var e2 = player.getEquip(2); + if (e2 && e2.name == "taipingyaoshu") return true; + if ( + event.name == "phaseZhunbei" && + game.hasPlayer(current => { + return get.recoverEffect(current, player, player) >= 0; + }) + ) + return true; + if ( + event.name == "phaseJieshu" && + game.hasPlayer(current => { + return get.damageEffect(current, player, player, "thunder") >= 0; + }) && + player.hasSkillTag("rejudge") && + player.hasCard(card => { + return lib.card.shandian.judge(card) < 0; + }, "he") + ) + return true; + return false; + }, + content: function () { + "step 0"; + var next = (event.executeDelayCardEffect = player.executeDelayCardEffect("shandian")); + if (event.triggername != "phaseJieshuBegin") return; + next.judge = card => -lib.card.shandian.judge(card) - 4; + next.judge2 = result => !lib.card.shandian.judge2(result); + "step 1"; + var executeDelayCardEffect = event.executeDelayCardEffect; + if (!player.hasHistory("damage", evt => evt.getParent(2) == executeDelayCardEffect)) { + if (trigger.name == "phaseZhunbei") { + player.chooseTarget("灵化:是否令一名角色回复1点体力?").set("ai", target => { + var player = _status.event.player; + return get.recoverEffect(target, player, player); + }); + } else { + player.chooseTarget("灵化:是否对一名角色造成1点雷电伤害?").set("ai", target => { + var player = _status.event.player; + return get.damageEffect(target, player, player, "thunder"); + }); + } + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + if (trigger.name == "phaseZhunbei") target.recover(); + else target.damage("thunder"); + } + }, + ai: { + threaten: 2.8, + }, + }, +}; + +export default skills; diff --git a/character/jsrg/sort.js b/character/jsrg/sort.js new file mode 100644 index 000000000..eea451785 --- /dev/null +++ b/character/jsrg/sort.js @@ -0,0 +1,15 @@ +const characterSort = { + jiangshanrugu_qi: ["jsrg_liuhong", "jsrg_hejin", "jsrg_sunjian", "jsrg_huangfusong", "jsrg_xushao", "jsrg_dongbai", "jsrg_qiaoxuan", "jsrg_yangbiao", "jsrg_kongrong", "jsrg_zhujun", "jsrg_liubei", "jsrg_wangyun", "jsrg_liuyan", "jsrg_caocao", "jsrg_nanhualaoxian"], + jiangshanrugu_cheng: ["jsrg_sunce", "jsrg_xuyou", "jsrg_lvbu", "jsrg_zhanghe", "jsrg_zoushi", "jsrg_guanyu", "jsrg_chendeng", "jsrg_zhenji", "jsrg_zhangliao", "jsrg_xugong", "jsrg_chunyuqiong"], + jiangshanrugu_zhuan: ["jsrg_guojia", "jsrg_zhangfei", "jsrg_machao", "jsrg_lougui", "jsrg_zhangren", "jsrg_huangzhong", "jsrg_xiahourong", "jsrg_sunshangxiang", "jsrg_pangtong", "jsrg_hansui", "jsrg_zhangchu", "jsrg_xiahouen", "jsrg_fanjiangzhangda"], + jiangshanrugu_he: ["jsrg_zhugeliang", "jsrg_jiangwei", "jsrg_luxun", "jsrg_zhaoyun", "jsrg_simayi", "jsrg_guoxun", "jsrg_sunlubansunluyu", "jsrg_caofang", "jsrg_sunjun", "jsrg_liuyong", "jsrg_weiwenzhugezhi", "jsrg_zhangxuan", "jsrg_gaoxiang", "jsrg_guozhao"], +}; + +const characterSortTranslate = { + jiangshanrugu_qi: "江山如故·起", + jiangshanrugu_cheng: "江山如故·承", + jiangshanrugu_zhuan: "江山如故·转", + jiangshanrugu_he: "江山如故·合", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/jsrg/translate.js b/character/jsrg/translate.js new file mode 100644 index 000000000..e136441b6 --- /dev/null +++ b/character/jsrg/translate.js @@ -0,0 +1,361 @@ +const translates = { + //江山如故·起 + jsrg_liuhong: "起刘宏", + jsrg_liuhong_prefix: "起", + jsrgchaozheng: "朝争", + jsrgchaozheng_info: "准备阶段,你可以令所有其他角色议事。若结果为:红色,意见为红色的角色各回复1点体力;黑色,意见为红色的角色各失去1点体力。然后若所有意见均相同,你摸X张牌(X为此次议事的角色数)。", + jsrgshenchong: "甚宠", + jsrgshenchong_info: "限定技。出牌阶段,你可以令一名其他角色获得〖飞扬〗、〖跋扈〗。若如此做,当你死亡时,其失去所有技能并弃置所有手牌。", + jsrgjulian: "聚敛", + jsrgjulian_info: "主公技。①其他群势力角色每回合限两次。当其不于摸牌阶段且不因〖聚敛〗摸牌后,其可以摸一张牌。②结束阶段,你可以获得所有其他群势力角色各一张牌。", + jsrgfeiyang: "飞扬", + jsrgfeiyang_info: "判定阶段开始时,若你的判定区里有牌,你可以弃置两张手牌并弃置你判定区里的一张牌。", + jsrgbahu: "跋扈", + jsrgbahu_info: "锁定技。①准备阶段,你摸一张牌。②你使用【杀】的次数上限+1。", + jsrg_hejin: "起何进", + jsrg_hejin_prefix: "起", + jsrgzhaobing: "诏兵", + jsrgzhaobing_info: "结束阶段,你可以弃置所有手牌,然后令至多X名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力(X为你本次弃置的牌数)。", + jsrgzhuhuan: "诛宦", + jsrgzhuhuan_info: "准备阶段,你可以展示所有手牌并弃置所有【杀】,然后令一名其他角色选择一项:1.弃置等量的牌,然后受到1点伤害;2.令你摸等量的牌,然后你回复1点体力。", + jsrgyanhuo: "延祸", + jsrgyanhuo_info: "锁定技。当你死亡时,你增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。", + jsrg_sunjian: "起孙坚", + jsrg_sunjian_prefix: "起", + jsrgpingtao: "平讨", + jsrgpingtao_info: "出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。", + jsrgjuelie: "绝烈", + jsrgjuelie_info: "①当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌并弃置其等量的牌。②若你的手牌数或体力值为全场最小,则你使用【杀】造成的伤害+1。", + jsrg_huangfusong: "起皇甫嵩", + jsrg_huangfusong_prefix: "起", + jsrgguanhuo: "观火", + jsrgguanhuo_info: "①出牌阶段,你可以视为使用一张【火攻】。②当你因〖观火①〗使用的【火攻】结算结束后,若此牌未造成过伤害,且:若{你此阶段发动〖观火①〗的次数为1,则你于此阶段造成渠道为【火攻】的伤害时,此伤害+1},否则你失去〖观火〗。", + jsrgjuxia: "居下", + jsrgjuxia_info: "每回合限一次。当其他角色使用牌指定你为目标后,若其技能数多于你,其可以令此牌对你无效,然后令你摸两张牌。", + jsrg_xushao: "起许劭", + jsrg_xushao_prefix: "起", + jsrgyingmen: "盈门", + jsrgyingmen_info: "锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。", + jsrgpingjian: "评鉴", + jsrgpingjian_info: "你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,你摸一张牌。", + jsrg_dongbai: "起董白", + jsrg_dongbai_prefix: "起", + jsrgshichong: "恃宠", + jsrgshichong_info: "转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。", + jsrglianzhu: "连诛", + jsrglianzhu_info: "出牌阶段限一次。你可以展示一张黑色手牌并交给一名其他角色,然后视为你对所有与其势力相同的其他角色依次使用一张【过河拆桥】。", + jsrg_qiaoxuan: "起桥玄", + jsrg_qiaoxuan_prefix: "起", + jsrgjuezhi: "绝质", + jsrgjuezhi_info: "①当你失去一张装备区里的装备牌后,你可以废除对应的装备栏。②你的回合每阶段限一次。当你使用牌对目标角色造成伤害时,你令此伤害+X(X为其装备区里的牌与你已废除的装备栏中相同副类别的数量)。", + jsrgjizhao: "急召", + jsrgjizhao_info: "准备阶段或结束阶段,你可以令一名角色选择一项:1.使用一张手牌;2.令你可以移动其区域里的一张牌。", + jsrg_yangbiao: "起杨彪", + jsrg_yangbiao_prefix: "起", + jsrgzhaohan: "昭汉", + jsrgzhaohan_info: "锁定技。准备阶段,若本局游戏:未洗过牌,你回复1点体力;洗过牌,你失去1点体力。", + jsrgrangjie: "让节", + jsrgrangjie_info: "当你受到1点伤害后,你可以移动场上的一张牌,然后你可以于弃牌堆中选择获得一张本回合进入弃牌堆且与此牌花色相同的牌。", + jsrgyizheng: "义争", + jsrgyizheng_info: "出牌阶段限一次。你可以与一名手牌数大于你的角色拼点。若你:赢,其跳过下一个摸牌阶段;没赢,其可以对你造成至多2点伤害。", + jsrg_kongrong: "起孔融", + jsrg_kongrong_prefix: "起", + jsrglirang: "礼让", + jsrglirang_info: "每轮限一次。其他角色的摸牌阶段开始时,你可以交给其两张牌。然后此回合的弃牌阶段结束时,你可以获得所有其于此阶段因弃置进入弃牌堆的牌。", + jsrgzhengyi: "争义", + jsrgzhengyi_info: "当你每回合首次受到伤害时,本轮因〖礼让〗得到过牌的其他角色可以将此伤害转移给其。", + jsrg_zhujun: "起朱儁", + jsrg_zhujun_prefix: "起", + jsrgfendi: "分敌", + jsrgfendi_tag: "分敌", + jsrgfendi_info: "每回合限一次。当你使用【杀】指定唯一目标后,你可以展示其任意张手牌,令其不能使用或打出对应实体牌不全为这些牌的牌直到此【杀】结算结束。然后当此【杀】对其造成伤害后,你于其手牌区或弃牌堆获得这些牌。", + jsrgjuxiang: "拒降", + jsrgjuxiang_info: "当你不于摸牌阶段得到牌后,你可以弃置之,令当前回合角色于此回合额定的出牌阶段内使用【杀】的次数上限+X(X为你以此法弃置的牌的花色数)。", + jsrg_liubei: "起刘备", + jsrg_liubei_prefix: "起", + jsrgjishan: "积善", + jsrgjishan_info: "①每回合限一次。当一名角色受到伤害时,你可以失去1点体力并防止此伤害,然后你与其各摸一张牌。②每回合限一次。当你造成伤害后,你可以令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力。", + jsrgzhenqiao: "振鞘", + jsrgzhenqiao_info: "锁定技。①你的攻击范围+1。②当你使用【杀】指定目标后,若你的武器栏为空且未废除,你令此【杀】的效果额外结算一次。", + jsrg_wangyun: "起王允", + jsrg_wangyun_prefix: "起", + jsrgshelun: "赦论", + jsrgshelun_info: "出牌阶段限一次。你可以选择一名你攻击范围内的角色,然后令除其外所有手牌数不大于你的角色议事。若结果为:红色,你弃置其一张牌;黑色,你对其造成1点伤害。", + jsrgfayi: "伐异", + jsrgfayi_info: "当你议事结算结束后,你可以对一名意见与你不同的角色造成1点伤害。", + jsrg_liuyan: "起刘焉", + jsrg_liuyan_prefix: "起", + jsrgtushe: "图射", + jsrgtushe_info: "当你使用非装备牌指定目标后,你可以展示所有手牌(无牌则不展示)。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。", + jsrgtongjue: "通绝", + jsrgtongjue_info: "主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。", + jsrg_caocao: "梦曹操", + jsrg_caocao_prefix: "梦", + jsrgzhenglve: "政略", + jsrgzhenglve_info: "①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为至多两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。", + jsrghuilie: "会猎", + jsrghuilie_info: "觉醒技。准备阶段,若有“猎”的角色数大于2,你减1点体力上限,然后获得〖平戎〗和〖飞影〗。", + jsrgpingrong: "平戎", + jsrgpingrong_info: "每轮限一次。一名角色的回合结束时,你可以移去一名角色的“猎”,然后你于此回合后执行一个额外回合。该回合结束后,若你于此回合未造成过伤害,你失去1点体力。", + jsrg_nanhualaoxian: "起南华老仙", + jsrg_nanhualaoxian_prefix: "起", + jsrgshoushu: "授术", + jsrgshoushu_info: "锁定技。①一轮游戏开始时,若场上没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。", + jsrgxundao: "寻道", + jsrgxundao_info: "当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。", + jsrglinghua: "灵化", + jsrglinghua_info: "①准备阶段,你可以执行目标角色为你的【闪电】效果。若你未因此受到伤害,你可以令一名角色回复1点体力。②结束阶段,你可以执行目标角色为你且判定效果反转的【闪电】效果。若你未因此受到伤害,你可以对一名角色造成1点雷电伤害。", + sbyingmen: "盈门", + sbyingmen_info: "锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。", + sbpingjian: "评鉴", + sbpingjian_info: "你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,则你于此技能结算结束时摸一张牌。", + //江山如故·承 + jsrg_sunce: "梦孙策", + jsrg_sunce_prefix: "梦", + jsrgduxing: "独行", + jsrgduxing_info: "出牌阶段限一次。你可以视为使用一张可以指定任意名目标角色的【决斗】,且所有目标角色的手牌均视为【杀】直到此牌结算结束。", + jsrgzhiheng: "猘横", + jsrgzhiheng_info: "锁定技。当你因执行牌的效果对目标角色造成伤害时,若其于此回合响应过你使用过的牌,此伤害+1。", + jsrgzhasi: "诈死", + jsrgzhasi_info: "限定技。当你受到伤害值不小于你的体力值的伤害时,你可以防止此伤害,然后失去〖猘横〗并获得〖制衡〗。然后你不计入距离和座次计算直到你对其他角色使用牌后或当你受到伤害后。", + jsrgbashi: "霸世", + jsrgbashi_info: "主公技。当你需要打出【杀】或【闪】时,你可以令其他吴势力角色选择是否打出一张【杀】或【闪】。若有角色响应,则视为你打出了一张【杀】或【闪】。", + jsrg_xuyou: "承许攸", + jsrg_xuyou_prefix: "承", + jsrglipan: "离叛", + jsrglipan_info: "回合结束时,你可以变更势力,然后摸X张牌并执行一个额外的出牌阶段。此阶段结束时,所有与你势力相同的角色依次可以将一张牌当【决斗】对你使用(X为与你势力相同的其他角色数)。", + jsrgqingxi: "轻袭", + jsrgqingxi_info: "群势力技。出牌阶段每名角色限一次。你可以选择一名手牌数小于你的角色,你将手牌数弃置至与其相同,然后视为对其使用一张刺【杀】。", + jsrgjinmie: "烬灭", + jsrgjinmie_info: "魏势力技。出牌阶段限一次。你可以选择一名手牌数大于你的角色,你视为对其使用一张火【杀】。当此牌造成伤害后,你将其手牌数弃置至与你相同。", + jsrg_lvbu: "承吕布", + jsrg_lvbu_prefix: "承", + jsrgwuchang: "无常", + jsrgwuchang_info: "锁定技。①当你获得其他角色的牌后,你变更势力为与其相同。②当你使用【杀】或【决斗】对与你势力相同的目标角色造成伤害时,此伤害+1,然后变更势力为群。", + jsrgqingjiao: "轻狡", + jsrgqingjiao_info: "群势力技。出牌阶段各限一次。你可以将一张牌当【推心置腹】/【趁火打劫】对一名手牌数大于/小于你的角色使用。", + jsrgchengxu: "乘虚", + jsrgchengxu_info: "蜀势力技。与你势力相同的其他角色不能响应你使用的牌。", + jsrg_zhanghe: "承张郃", + jsrg_zhanghe_prefix: "承", + jsrgqiongtu: "穷途", + jsrgqiongtu_info: "群势力技。每回合限一次。你可以将一张非基本牌置于武将牌上视为使用一张【无懈可击】。若此牌生效,你摸一张牌,否则你变更势力为魏并获得所有“穷途”牌。", + jsrgxianzhu: "先著", + jsrgxianzhu_info: "魏势力技。你可以将一张普通锦囊牌当无次数限制的【杀】使用。当此牌对唯一目标造成伤害后,你视为对该角色使用一张此普通锦囊牌。", + jsrg_zoushi: "承邹氏", + jsrg_zoushi_prefix: "承", + jsrgguyin: "孤吟", + jsrgguyin_info: "准备阶段,你可以翻面,且令所有其他男性角色依次选择是否翻面。然后你和所有背面朝上的角色轮流各摸一张牌,直到你们累计以此法得到X张牌(X为场上存活角色与死亡角色中男性角色数)。", + jsrgzhangdeng: "帐灯", + jsrgzhangdeng_info: "①当一名武将牌背面朝上的角色需要使用【酒】时,若你的武将牌背面朝上,其可以视为使用之。②当一名角色于一回合第二次发动〖帐灯①〗时,你将武将牌翻面至正面朝上。", + jsrg_guanyu: "承关羽", + jsrg_guanyu_prefix: "承", + jsrgguanjue: "冠绝", + jsrgguanjue_info: "锁定技。当你使用或打出有花色的牌时,你令所有其他角色于此回合内不能使用或打出该花色的牌。", + jsrgnianen: "念恩", + jsrgnianen_info: "你可以将一张牌当任意基本牌使用或打出,然后若此牌不为红色或你以此法使用或打出的牌不为普通【杀】,则直到此回合结束,该技能失效且你视为拥有〖马术〗。", + jsrg_chendeng: "承陈登", + jsrg_chendeng_prefix: "承", + jsrglunshi: "论势", + jsrglunshi_info: "出牌阶段限一次。你可以令一名角色摸等同于其攻击范围内角色数的牌(至多摸至五张),然后其弃置等同于攻击范围内含有其的角色数的牌。", + jsrgguitu: "诡图", + jsrgguitu_info: "准备阶段,你可以交换场上的两张武器牌,然后攻击范围以此法减少的角色回复1点体力。", + jsrg_zhenji: "承甄宓", + jsrg_zhenji_prefix: "承", + jsrgjixiang: "济乡", + jsrgjixiang_info: "回合内每种牌名限一次。当一名其他角色需要使用或打出一张基本牌时,你可以弃置一张牌令其视为使用或打出之,然后你摸一张牌并令〖称贤〗于此阶段可发动次数上限+1。", + jsrgchengxian: "称贤", + jsrgchengxian_info: "出牌阶段限两次。你可以将一张手牌当一张本回合未以此法使用过的普通锦囊牌使用(此转化牌须与以此法转化的手牌的合法目标数相同)。", + jsrg_zhangliao: "承张辽", + jsrg_zhangliao_prefix: "承", + jsrgzhengbing: "整兵", + jsrgzhengbing_info: "群势力技。出牌阶段限三次。你可以重铸一张牌,若此牌为:【杀】,你本回合手牌上限+2;【闪】,你摸一张牌;【桃】,你变更势力为魏。", + jsrgtuwei: "突围", + jsrgtuwei_info: "魏势力技。出牌阶段开始时,你可以获得攻击范围内任意名角色各一张牌。然后此回合结束时,这些角色中未于本回合受到过伤害的角色依次获得你的一张牌。", + jsrg_xugong: "承许贡", + jsrg_xugong_prefix: "承", + jsrgbiaozhao: "表召", + jsrgbiaozhao_info: "准备阶段,你可以选择两名其他角色A和B。直到你的下回合开始时或你死亡后,A对B使用牌无次数和距离限制,且B对你使用的牌造成的伤害+1。", + jsrgyechou: "业仇", + jsrgyechou_info: "当你死亡时,你可以令一名其他角色获得如下效果:当其受到伤害值不小于其体力值的伤害时,其令此伤害翻倍。", + jsrg_chunyuqiong: "承淳于琼", + jsrg_chunyuqiong_prefix: "承", + jsrgcangchu: "仓储", + jsrgcangchu_info: "一名角色的结束阶段,你可以令至多X名角色各摸一张牌,若X大于存活角色数,则改为各摸两张牌(X为你于此回合得到的牌数)。", + jsrgshishou: "失守", + jsrgshishou_info: "锁定技。①当你使用【酒】时,你摸三张牌,然后你本回合不能再使用牌。②当你受到火焰伤害后,你令〖仓储〗失效直到你的下回合结束后。", + //江山如故·转 + ying: "影", + ying_info: "当此牌进入弃牌堆后,系统将此牌移出游戏。", + jsrg_guojia: "梦郭嘉", + jsrg_guojia_prefix: "梦", + jsrgqingzi: "轻辎", + jsrgqingzi_info: "准备阶段,你可以弃置任意名其他角色装备区里的各一张牌,然后令这些角色获得〖神速〗直到你的下回合开始。", + jsrgdingce: "定策", + jsrgdingce_info: "当你受到伤害后,你可以依次弃置你与伤害来源的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。", + jsrgzhenfeng: "针锋", + jsrgzhenfeng_info: "出牌阶段每种类别各限一次。你可以视为使用一张存活角色的技能描述中包含的基本牌或普通锦囊牌(无距离和次数限制)。当此牌对技能描述中包含此牌的角色生效时,你对其造成1点伤害。", + jsrg_zhangfei: "转张飞", + jsrg_zhangfei_prefix: "转", + jsrgbaohe: "暴喝", + jsrgbaohe_info: "一名角色的出牌阶段结束时,你可以弃置两张牌,然后视为你对攻击范围内包含其的所有角色使用一张【杀】。当一名角色使用牌响应此【杀】后,此【杀】对后续目标角色造成的伤害+1。", + jsrgxushi: "虚势", + jsrgxushi_info: "出牌阶段限一次。你可以交给任意名角色各一张牌,然后你获得两倍数量的【影】。", + jsrg_machao: "转马超", + jsrg_machao_prefix: "转", + jsrgzhuiming: "追命", + jsrgzhuiming_info: "当你使用【杀】指定唯一目标后,你可以声明一种颜色并令目标角色弃置任意张牌,然后你展示目标角色一张牌。若此牌颜色与你声明的颜色相同,则此【杀】不计入次数限制、不可被响应且伤害+1。", + jsrg_lougui: "转娄圭", + jsrg_lougui_prefix: "转", + jsrgshacheng: "沙城", + jsrgshacheng_info: "①游戏开始时,你将牌堆顶的两张牌置于武将牌上,称为“城”。②当一名角色使用【杀】结算结束后,你可以移去一张“城”,令此牌的其中一名目标角色摸X张牌(X为该角色本回合失去过的牌数且至多为5)。", + jsrgninghan: "凝寒", + jsrgninghan_info: "锁定技。①所有角色手牌中的♣【杀】均视为冰【杀】。②当一名角色受到冰冻伤害后,你将造成此伤害的牌对应的实体牌置入“城”。", + jsrg_zhangren: "转张任", + jsrg_zhangren_prefix: "转", + jsrgfuni: "伏匿", + jsrgfuni_info: "锁定技。①你的攻击范围终值为0。②一轮游戏开始时,你令任意名角色获得共计X张【影】(X为存活角色数的一半,向上取整)。③当有牌进入弃牌堆后,若其中有【影】,你于本回合使用牌无距离限制且不能被响应。", + jsrgchuanxin: "穿心", + jsrgchuanxin_info: "一名角色的结束阶段,你可以将一张牌当【杀】使用。当一名角色受到渠道为此【杀】的伤害时,此伤害+Y(Y为其本回合回复过的体力值)。", + jsrg_huangzhong: "转黄忠", + jsrg_huangzhong_prefix: "转", + jsrgcuifeng: "摧锋", + jsrgcuifeng_info: "限定技。出牌阶段,你可以视为使用一张单目标的伤害类牌(无距离限制)。此回合结束时,若此牌未造成伤害或造成的伤害值大于1,你重置〖摧锋〗。", + jsrgdengnan: "登难", + jsrgdengnan_info: "限定技。出牌阶段,你可以视为使用一张非伤害类普通锦囊牌。此回合结束时,若此牌的目标均于此回合受到过伤害,你重置〖登难〗。", + jsrg_xiahourong: "转夏侯荣", + jsrg_xiahourong_prefix: "转", + jsrgfenjian: "奋剑", + jsrgfenjian_info: "每回合各限一次。当你需要对其他角色使用【决斗】或【桃】时,你可以令你本回合受到的伤害+1,视为使用之。", + jsrg_sunshangxiang: "转孙尚香", + jsrg_sunshangxiang_prefix: "转", + jsrgguiji: "闺忌", + jsrgguiji_info: "每回合限一次。出牌阶段,你可以与一名手牌数小于你的男性角色交换手牌。然后其下个出牌阶段结束时,你可以与其交换手牌。", + jsrgjiaohao: "骄豪", + jsrgjiaohao_info: "①其他角色的出牌阶段限一次。其可以将手牌中的一张装备牌置于你的装备区。②准备阶段,你获得X张【影】(X为你空置装备栏数的一半,向上取整)。", + jsrg_pangtong: "转庞统", + jsrg_pangtong_prefix: "转", + jsrgmanjuan: "漫卷", + jsrgmanjuan_info: "若你没有手牌,你可以如手牌般使用或打出于本回合进入弃牌堆的牌(每种点数每回合限一次)。", + jsrgyangming: "养名", + jsrgyangming_info: "出牌阶段限一次。你可以与一名角色拼点,若其:没赢,你可以与其重复此流程;赢,其摸X张牌,然后你回复1点体力(X为其此阶段没赢的次数)。", + jsrg_hansui: "转韩遂", + jsrg_hansui_prefix: "转", + jsrgniluan: "逆乱", + jsrgniluan_info: "准备阶段,你可以选择一项:1.弃置一张牌,对一名未对你造成过伤害的角色造成1点伤害;2.令一名对你造成过伤害的角色摸两张牌。", + jsrghuchou: "互雠", + jsrghuchou_info: "锁定技。当你对最后对你使用伤害类牌的角色造成伤害时,此伤害+1。", + jsrgjiemeng: "皆盟", + jsrgjiemeng_info: "主公技,锁定技。所有群势力角色至其他角色的距离-X(X为群势力角色数)。", + jsrg_zhangchu: "转张楚", + jsrg_zhangchu_prefix: "转", + jsrghuozhong: "惑众", + jsrghuozhong_info: "所有角色出牌阶段限一次。其可以将一张黑色非锦囊牌当【兵粮寸断】置于其判定区,然后令你摸两张牌。", + jsrgrihui: "日彗", + jsrgrihui_info: "①当你使用【杀】对目标角色造成伤害后,你可以令判定区有牌的其他角色各摸一张牌。②你于一回合内对判定区没有牌的角色使用的第一张【杀】无任何次数限制。", + jsrg_xiahouen: "转夏侯恩", + jsrg_xiahouen_prefix: "转", + jsrghujian: "护剑", + jsrghujian_info: "①游戏开始时,你从游戏外获得一张【赤血青锋】。②一名角色的回合结束时,此回合最后一名使用或打出牌的角色可以获得弃牌堆中的【赤血青锋】。", + jsrgshili: "恃力", + jsrgshili_info: "出牌阶段限一次。你可以将一张手牌中的装备牌当【决斗】使用。", + jsrg_fanjiangzhangda: "转范强张达", + jsrg_fanjiangzhangda_ab: "转范疆张达", + jsrg_fanjiangzhangda_prefix: "转", + jsrgfushan: "负山", + jsrgfushan_info: "出牌阶段开始时,所有其他角色可以依次交给你一张牌并令你此阶段使用【杀】的次数上限+1。此阶段结束时,若你使用【杀】的次数未达到上限且此阶段以此法交给你牌的角色均存活,你失去2点体力,否则你将手牌摸至体力上限。", + //江山如故·合 + jsrg_zhugeliang: "梦诸葛亮", + jsrg_zhugeliang_prefix: "梦", + jsrgwentian: "问天", + jsrgwentian_info: "①你可以将牌堆顶的牌当【无懈可击】/【火攻】使用,若此牌不为黑色/红色,〖问天〗于本轮失效。②每回合限一次。你的一个阶段开始时,你可以观看牌堆顶的五张牌,然后将其中一张牌交给一名其他角色,将其余牌以任意顺序置于牌堆顶或牌堆底。", + jsrgchushi: "出师", + jsrgchushi_info: "出牌阶段限一次。若你不为主公,你可以与主公议事。若结果为:红色,你与其各摸一张牌,若你与其手牌数之和小于7,重复此流程;黑色,当你于本轮内造成属性伤害时,此伤害+1。", + jsrgyinlve: "隐略", + jsrgyinlve_info: "每轮各限一次。当一名角色受到火焰/雷电伤害时,你可以防止此伤害,然后于当前回合结束后执行一个只有摸牌/弃牌阶段的回合。", + jsrg_jiangwei: "合姜维", + jsrg_jiangwei_prefix: "合", + jsrgjinfa: "矜伐", + jsrgjinfa_info: "出牌阶段限一次。你可以展示一张手牌,然后令所有体力上限不大于你的角色议事。若结果与此牌颜色:相同,你令其中至多两名角色将手牌摸至体力上限;不同,你获得两张【影】。然后若没有其他角色与你意见相同,你可以变更势力。", + jsrgfumou: "复谋", + jsrgfumou_info: "魏势力技。当你议事结算结束后,与你意见不同的角色本回合不能使用或打出与其意见颜色相同的牌,你可以将一张【影】当【出其不意】对一名与你意见不同的角色使用。", + jsrgxuanfeng: "选锋", + jsrgxuanfeng_info: "蜀势力技。你可以将一张【影】当无距离和次数限制的刺【杀】使用。", + jsrg_luxun: "合陆逊", + jsrg_luxun_prefix: "合", + jsrgyoujin: "诱进", + jsrgyoujin_info: "出牌阶段开始时,你可以与一名角色拼点,你与其本回合不能使用或打出点数小于自己拼点牌的手牌,且赢的角色视为对没赢的角色使用一张【杀】。", + jsrgdailao: "待劳", + jsrgdailao_info: "出牌阶段,若你没有可以使用的手牌,你可以展示所有手牌并摸两张牌,然后结束此回合。", + jsrgzhubei: "逐北", + jsrgzhubei_info: "锁定技。①当你对本回合受到过伤害的角色造成伤害时,此伤害+1。②你对本回合失去过最后手牌的角色使用牌无次数限制。", + jsrg_zhaoyun: "合赵云", + jsrg_zhaoyun_prefix: "合", + jsrglonglin: "龙临", + jsrglonglin_info: "其他角色于其出牌阶段内首次使用【杀】指定第一个目标后,你可以弃置一张牌令此【杀】无效,然后其可以视为对你使用一张【决斗】,你以此法造成伤害后,其本阶段不能再使用手牌。", + jsrgzhendan: "镇胆", + jsrgzhendan_info: "①你可以将一张非基本手牌当任意基本牌使用或打出。②当你受到伤害后,你摸X张牌并令该技能本轮失效(X为本轮所有角色执行过的回合数且至多为5)。③一轮游戏开始时,若上一轮该技能未因〖镇胆②〗失效过,你摸Y张牌(Y为上一轮所有角色执行过的回合数且至多为5)。", + jsrg_simayi: "合司马懿", + jsrg_simayi_prefix: "合", + jsrgyingshi: "鹰眎", + jsrgyingshi_info: "当你翻面时,你可以观看牌堆底的三张牌(若死亡角色数大于2则改为五张),然后将其中任意数量的牌以任意顺序置于牌堆顶,其余以任意顺序置于牌堆底。", + jsrgtuigu: "蜕骨", + jsrgtuigu_info: "①回合开始时,你可以翻面并令你本回合的手牌上限+X,然后摸X张牌并视为使用一张【解甲归田】(X为存活角色数的一半,向下取整),目标角色不能使用以此法得到的牌直到其回合结束。②一轮游戏开始时,若你上一轮未执行过回合(因〖蜕骨②〗执行的回合除外),你获得一个额外的回合。③当你失去装备牌里的牌后,你回复1点体力。", + jsrg_guoxun: "合郭循", + jsrg_guoxun_prefix: "合", + jsrgeqian: "遏前", + jsrgeqian_info: "①结束阶段,你可以蓄谋任意次。②当你使用【杀】或蓄谋牌指定其他角色为唯一目标后,你可以令此牌不计入次数限制并获得目标一张牌,然后其可以令你本回合至其的距离+2。", + jsrgfusha: "伏杀", + jsrgfusha_info: "限定技。出牌阶段,若你的攻击范围内仅有一名角色,你可以对其造成X点伤害(X为你的攻击范围,至多为游戏人数)。", + jsrg_sunlubansunluyu: "合大小虎", + jsrg_sunlubansunluyu_prefix: "合", + jsrgdaimou: "殆谋", + jsrgdaimou_info: "每回合各限一次。当一名角色使用【杀】指定其他角色/你为目标时,你可以用牌堆顶的牌蓄谋/你须弃置你区域里的一张蓄谋牌。", + jsrgfangjie: "芳洁", + jsrgfangjie_info: "准备阶段,若你没有蓄谋牌,你回复1点体力并摸一张牌,否则你可以弃置你区域里的任意张蓄谋牌并失去〖芳洁〗。", + jsrg_caofang: "合曹芳", + jsrg_caofang_prefix: "合", + jsrgzhaotu: "诏图", + jsrgzhaotu_info: "每轮限一次。你可以将一张红色非锦囊牌当【乐不思蜀】使用,然后当前回合结束后,目标执行一个手牌上限-2的额外回合。", + jsrgjingju: "惊惧", + jsrgjingju_info: "当你需要使用任意一种基本牌时,你可以将其他角色判定区里的一张牌移动至你的判定区,视为你使用之。", + jsrgweizhui: "危坠", + jsrgweizhui_info: "主公技。其他魏势力角色的结束阶段,其可以将一张黑色手牌当【过河拆桥】对你使用。", + jsrg_sunjun: "合孙峻", + jsrg_sunjun_prefix: "合", + jsrgyaoyan: "邀宴", + jsrgyaoyan_info: "准备阶段,你可以令所有角色依次选择是否于回合结束时议事,若议事结果为:红色,你获得任意名未议事的角色各一张手牌;黑色,你可以对一名议事的角色造成2点伤害。", + jsrgbazheng: "霸政", + jsrgbazheng_info: "当你参与的议事展示意见时,本回合受到过你伤害的角色意见视为与你相同。", + jsrg_liuyong: "合刘永", + jsrg_liuyong_prefix: "合", + jsrgdanxin: "丹心", + jsrgdanxin_info: "你可以将一张牌当【推心置腹】使用,你展示以此法交出与得到的牌,以此法得到♥牌的角色回复1点体力,然后你至目标角色的距离+1直到回合结束。", + jsrgfengxiang: "封乡", + jsrgfengxiang_info: "锁定技。当你受到伤害后,你与一名其他角色交换装备区里的所有牌。若你装备区里的牌因此减少,你摸等同于减少牌数的牌。", + jsrg_weiwenzhugezhi: "合卫温诸葛直", + jsrg_weiwenzhugezhi_prefix: "合", + jsrgfuhai: "浮海", + jsrgfuhai_info: "出牌阶段限一次。你可以令所有有手牌的其他角色同时展示一张手牌,然后你选择一个方向并摸X张牌(X为该方向上的角色展示的点数连续严格递增或严格递减的牌数,至少为1)。", + jsrg_zhangxuan: "合张嫙", + jsrg_zhangxuan_prefix: "合", + jsrgtongli: "同礼", + jsrgtongli_info: "当你于出牌阶段内使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内使用过的牌数相等,则你可以展示所有手牌,令此牌额外结算一次。", + jsrgshezang: "奢葬", + jsrgshezang_info: "每轮限一次。当你或你回合内的其他角色进入濒死状态时,你可以亮出牌堆顶的四张牌,获得其中任意张花色各不相同的牌。", + jsrg_gaoxiang: "合高翔", + jsrg_gaoxiang_prefix: "合", + jsrgchiying: "驰应", + jsrgchiying_info: "出牌阶段限一次。你可以选择一名角色,令其攻击范围内的其他角色依次弃置一张牌。若以此法弃置的基本牌数不大于其体力值,其获得这些基本牌。", + jsrg_guozhao: "合郭照", + jsrg_guozhao_prefix: "合", + jsrgpianchong: "偏宠", + jsrgpianchong_info: "一名角色的结束阶段,若你于此回合内失去过牌,你可以判定。若结果为红色/黑色,你摸此回合进入弃牌堆的红色/黑色牌数量的牌。", + jsrgzunwei: "尊位", + jsrgzunwei_info: "出牌阶段限一次。你可以选择一名其他角色并选择执行一项,然后移除该选项:1.将手牌数摸至与该角色相同(最多摸五张);2.将其装备牌移至你的装备区,直到你装备区的牌数不少于其;3.将体力值回复至与该角色相同。", + + xumou_jsrg: "蓄谋", + xumou_jsrg_info: "“蓄谋”牌可在判定区内重复存在。判定阶段开始时,你选择一项:⒈使用此牌对应的实体牌,然后本阶段不能再使用此牌名的牌;⒉将所有的“蓄谋”牌置入弃牌堆。", +}; + +export default translates; diff --git a/character/jsrg/voices.js b/character/jsrg/voices.js new file mode 100644 index 000000000..1a9b5bf22 --- /dev/null +++ b/character/jsrg/voices.js @@ -0,0 +1,293 @@ +export default { + "#jsrgchaozheng1": null, + "#jsrgchaozheng2": null, + "#jsrgshenchong1": null, + "#jsrgshenchong2": null, + "#jsrgjulian1": null, + "#jsrgjulian2": null, + "#jsrg_liuhong:die": "权利的滋味,让人沉沦。", + "#jsrgzhaobing1": null, + "#jsrgzhaobing2": null, + "#mouzhu1": "宦官专权,今必诛之。", + "#mouzhu2": "汝等罪大恶极,快快伏法。", + "#yanhuo1": "乱世,才刚刚开始……", + "#yanhuo2": "你很快就笑不出来了……", + "#jsrg_hejin:die": "不能遗祸世间……", + "#jsrgpingtao1": null, + "#jsrgpingtao2": null, + "#jsrgjuelie1": null, + "#jsrgjuelie2": null, + "#jsrg_sunjian:die": "有埋伏!呃……啊!!", + "#jsrgguanhuo1": null, + "#jsrgguanhuo2": null, + "#jsrgjuxia1": null, + "#jsrgjuxia2": null, + "#jsrg_huangfusong:die": "吾只恨黄巾未平,不能报效朝廷……", + "#sbyingmen": null, + "#sbyingmen1": null, + "#sbyingmen2": null, + "#sbpingjian": null, + "#sbpingjian1": null, + "#sbpingjian2": null, + "#jsrg_xushao:die": "守节好耻,不可逡巡……", + "#jsrgshichong1": null, + "#jsrgshichong2": null, + "#jsrglianzhu1": null, + "#jsrglianzhu2": null, + "#jsrg_dongbai:die": "放肆,我要让爷爷赐你们死罪!", + "#jsrgjuezhi1": null, + "#jsrgjuezhi2": null, + "#jsrgjizhao1": null, + "#jsrgjizhao2": null, + "#jsrg_qiaoxuan:die": null, + "#zhaohan1": "天道昭昭,再兴如光武亦可期。", + "#zhaohan2": "汉祚将终,我又岂能无憾。", + "#rangjie1": "公既执掌权柄,又何必令君臣遭乱。", + "#rangjie2": "公虽权倾朝野,亦当尊圣上之意。", + "#yizheng1": "一人劫天子,一人质公卿,此可行邪?", + "#yizheng2": "诸军举事,当上顺天心,奈何如是!", + "#jsrg_yangbiao:die": "未能效死佑汉,只因宗族之重……", + "#splirang": null, + "#splirang1": "人之所至,礼之所及。", + "#splirang2": "施之以礼,还之以德。", + "#jsrgzhengyi1": null, + "#jsrgzhengyi2": null, + "#jsrg_kongrong:die": "覆巢之下,岂有完卵……", + "#jsrgfendi1": null, + "#jsrgfendi2": null, + "#jsrgjuxiang1": null, + "#jsrgjuxiang2": null, + "#jsrg_zhujun:die": "乞降不受,愿一战!", + "#jsrgjishan1": null, + "#jsrgjishan2": null, + "#jsrgzhenqiao1": null, + "#jsrgzhenqiao2": null, + "#jsrg_liubei:die": "这就是桃园吗?", + "#jsrgshelun1": null, + "#jsrgshelun2": null, + "#jsrgfayi1": null, + "#jsrgfayi2": null, + "#jsrg_wangyun:die": "努力谢关东诸公,勤以国家为念!", + "#xinfu_limu1": "米贼作乱,吾必为益州自保。", + "#xinfu_limu2": "废史立牧,可得一方安定。", + "#xinfu_tushe1": "非英杰不图?吾既谋之且射毕!", + "#xinfu_tushe2": "汉室衰微,朝纲祸乱,必图后福。", + "#jsrgtongjue1": null, + "#jsrgtongjue2": null, + "#jsrg_liuyan:die": "背疮难治,世子难继。", + "#jsrgzhenglve1": null, + "#jsrgzhenglve2": null, + "#jsrghuilie1": null, + "#jsrghuilie2": null, + "#jsrg_caocao:die": "霸业未成未成啊!", + "#jsrgshoushu1": null, + "#jsrgshoushu2": null, + "#jsrgxundao1": null, + "#jsrgxundao2": null, + "#jsrglinghua1": null, + "#jsrglinghua2": null, + "#jsrg_nanhualaoxian:die": "天机求而近,执而远……", + "#jsrgduxing1": null, + "#jsrgduxing2": null, + "#jsrgzhiheng1": null, + "#jsrgzhiheng2": null, + "#jsrgzhasi1": null, + "#jsrgzhasi2": null, + "#jsrgbashi1": null, + "#jsrgbashi2": null, + "#jsrg_sunce:die": "内事不决问张昭,外事不决问周瑜……", + "#jsrglipan1": null, + "#jsrglipan2": null, + "#jsrgqingxi1": null, + "#jsrgqingxi2": null, + "#jsrgjinmie1": null, + "#jsrgjinmie2": null, + "#jsrg_xuyou:die": "阿瞒,没有我你得不到冀州啊!", + "#jsrgwuchang1": null, + "#jsrgwuchang2": null, + "#jsrgqingjiao1": null, + "#jsrgqingjiao2": null, + "#jsrgchengxu1": null, + "#jsrgchengxu2": null, + "#jsrg_lvbu:die": "不可能!", + "#jsrgqiongtu1": null, + "#jsrgqiongtu2": null, + "#jsrgxianzhu1": null, + "#jsrgxianzhu2": null, + "#jsrg_zhanghe:die": "啊……膝盖……中箭了……", + "#jsrgguyin1": null, + "#jsrgguyin2": null, + "#jsrgzhangdeng1": null, + "#jsrgzhangdeng2": null, + "#jsrg_zoushi:die": "年老色衰了吗……", + "#jsrgguanjue1": null, + "#jsrgguanjue2": null, + "#jsrgnianen1": null, + "#jsrgnianen2": null, + "#jsrg_guanyu:die": "什么?此地名叫麦城?", + "#jsrglunshi1": null, + "#jsrglunshi2": null, + "#jsrgguitu1": null, + "#jsrgguitu2": null, + "#jsrg_chendeng:die": "诸卿何患无令君乎?", + "#jsrgjixiang1": null, + "#jsrgjixiang2": null, + "#jsrgchengxian1": null, + "#jsrgchengxian2": null, + "#jsrg_zhenji:die": "悼良会之永绝兮,哀一逝而异乡。", + "#jsrgzhengbing1": null, + "#jsrgzhengbing2": null, + "#jsrgtuwei1": null, + "#jsrgtuwei2": null, + "#jsrg_zhangliao:die": "真的没想到……", + "#jsrgbiaozhao1": null, + "#jsrgbiaozhao2": null, + "#jsrgyechou1": null, + "#jsrgyechou2": null, + "#jsrg_xugong:die": "终究……还是被其所害……", + "#recangchu1": "广积粮草,有备无患。", + "#recangchu2": "吾奉命于此、建仓储粮。", + "#reshishou1": "腹痛骤发,痛不可当。", + "#reshishou2": "火光冲天,悔不当初。", + "#jsrg_chunyuqiong:die": "子远老贼,吾死当追汝之魂!", + "#jsrgqingzi1": null, + "#jsrgqingzi2": null, + "#jsrgdingce1": null, + "#jsrgdingce2": null, + "#jsrgzhenfeng1": null, + "#jsrgzhenfeng2": null, + "#jsrg_guojia:die": "咳,咳……", + "#jsrgbaohe1": null, + "#jsrgbaohe2": null, + "#jsrgxushi1": null, + "#jsrgxushi2": null, + "#jsrg_zhangfei:die": "实在是,杀不动了……", + "#jsrgzhuiming1": null, + "#jsrgzhuiming2": null, + "#mashu": null, + "#mashu1": null, + "#mashu2": null, + "#jsrg_machao:die": "(马蹄声)", + "#jsrgshacheng1": null, + "#jsrgshacheng2": null, + "#jsrgninghan1": null, + "#jsrgninghan2": null, + "#jsrg_lougui:die": null, + "#jsrgfuni1": null, + "#jsrgfuni2": null, + "#jsrgchuanxin1": null, + "#jsrgchuanxin2": null, + "#jsrg_zhangren:die": "老臣,绝不事二主!", + "#jsrgcuifeng1": null, + "#jsrgcuifeng2": null, + "#jsrgdengnan1": null, + "#jsrgdengnan2": null, + "#jsrg_huangzhong:die": "不得不服老啦~", + "#jsrgfenjian1": null, + "#jsrgfenjian2": null, + "#jsrg_xiahourong:die": null, + "#jsrgguiji1": null, + "#jsrgguiji2": null, + "#jsrgjiaohao1": null, + "#jsrgjiaohao2": null, + "#jsrg_sunshangxiang:die": "不!还不可以死!", + "#jsrgmanjuan1": null, + "#jsrgmanjuan2": null, + "#jsrgyangming1": null, + "#jsrgyangming2": null, + "#jsrg_pangtong:die": "看来我命中注定将丧命于此……", + "#niluan1": "如果不能功成名就,那就干脆为祸一方!", + "#niluan2": "哈哈哈哈哈,天下之事皆无常!", + "#jsrghuchou1": null, + "#jsrghuchou2": null, + "#jsrgjiemeng1": null, + "#jsrgjiemeng2": null, + "#jsrg_hansui:die": "马侄儿为何……啊!", + "#dcjizhong1": "聚八方之众,昭黄天之明。", + "#dcjizhong2": "联苦厄黎庶,传大道太平。", + "#dcrihui1": "甲子双至,黄巾再起。", + "#dcrihui2": "日中必彗,操刀必割。", + "#jsrg_zhangchu:die": "苦难不尽,黄天不死……", + "#twfujian1": "得此宝剑,如虎添翼!", + "#twfujian2": "丞相至宝,汝岂配用之?啊!……", + "#twjianwei1": "小小匹夫,可否闻长坂剑神之名号?", + "#twjianwei2": "此剑吹毛得过,削铁如泥。", + "#jsrg_xiahouen:die": "长坂剑神,也陨落了……", + "#jsrgfushan1": null, + "#jsrgfushan2": null, + "#jsrg_fanjiangzhangda:die": "吴侯救我!", + "#jsrgwentian1": null, + "#jsrgwentian2": null, + "#jsrgchushi1": null, + "#jsrgchushi2": null, + "#jsrgyinlve1": null, + "#jsrgyinlve2": null, + "#jsrg_zhugeliang:die": "将星陨落,天命难违。", + "#jsrgjinfa1": null, + "#jsrgjinfa2": null, + "#jsrgfumou1": null, + "#jsrgfumou2": null, + "#jsrgxuanfeng1": null, + "#jsrgxuanfeng2": null, + "#jsrg_jiangwei:die": "我计不成,乃天命也……", + "#jsrgyoujin1": null, + "#jsrgyoujin2": null, + "#jsrgdailao1": null, + "#jsrgdailao2": null, + "#jsrgzhubei1": null, + "#jsrgzhubei2": null, + "#jsrg_luxun:die": "我还是太年轻了……", + "#jsrglonglin1": null, + "#jsrglonglin2": null, + "#jsrgzhendan1": null, + "#jsrgzhendan2": null, + "#jsrg_zhaoyun:die": "这,就是失败的滋味吗?", + "#jsrgyingshi1": null, + "#jsrgyingshi2": null, + "#jsrgtuigu1": null, + "#jsrgtuigu2": null, + "#jsrg_simayi:die": "难道真是天意难违?", + "#jsrgeqian1": null, + "#jsrgeqian2": null, + "#jsrgfusha1": null, + "#jsrgfusha2": null, + "#jsrg_guoxun:die": null, + "#jsrgdaimou1": null, + "#jsrgdaimou2": null, + "#jsrgfangjie1": null, + "#jsrgfangjie2": null, + "#jsrg_sunlubansunluyu:die": null, + "#jsrgzhaotu1": null, + "#jsrgzhaotu2": null, + "#jsrgjingju1": null, + "#jsrgjingju2": null, + "#jsrgweizhui1": null, + "#jsrgweizhui2": null, + "#jsrg_caofang:die": "匹夫无罪,怀璧其罪……", + "#jsrgyaoyan1": null, + "#jsrgyaoyan2": null, + "#jsrgbazheng1": null, + "#jsrgbazheng2": null, + "#jsrg_sunjun:die": null, + "#jsrgdanxin1": null, + "#jsrgdanxin2": null, + "#fengxiang1": "北风摧蜀地,王爵换乡侯。", + "#fengxiang2": "汉皇可负我,我不负父兄。", + "#jsrg_liuyong:die": "他日若是凛风起,你自长哭我自笑。", + "#xinfu_fuhai1": "跨海南征,波涛起浮。", + "#xinfu_fuhai2": "宦海沉浮,生死难料!", + "#jsrg_weiwenzhugezhi:die": "吾皆海岱清士,岂料生死易逝……", + "#tongli1": "胞妹殊礼,妾幸同之。", + "#tongli2": "夫妻之礼,举案齐眉。", + "#shezang1": "世间千百物,物物皆相思。", + "#shezang2": "伊人将逝,何物为葬?", + "#jsrg_zhangxuan:die": "陛下,臣妾绝无异心!", + "#dcchiying1": "今诱老贼来此,必折其父子于上方谷。", + "#dcchiying2": "列柳城既失,当下唯死守阳平关。", + "#jsrg_gaoxiang:die": "老贼不死,实天意也……", + "#pianchong1": "得陛下怜爱,恩宠不衰。", + "#pianchong2": "谬蒙圣恩,光授殊宠。", + "#zunwei1": "处尊居显,位极椒房。", + "#zunwei2": "自在东宫,及即尊位。", + "#jsrg_guozhao:die": "我的出身,不配为后?", +}; diff --git a/character/key/card.js b/character/key/card.js index 718aa86aa..c81cd0193 100644 --- a/character/key/card.js +++ b/character/key/card.js @@ -11,12 +11,12 @@ const cards = { content() { "step 0"; target.draw(); - ("step 1"); + "step 1"; var hs = target.getCards("he"); if (!hs.length) event.finish(); else if (hs.length == 1) event._result = { bool: true, cards: hs }; else target.chooseCard("he", true, "选择一张牌置入仁库"); - ("step 2"); + "step 2"; if (result.bool) { var card = result.cards[0]; target.$throw(card, 1000); @@ -33,10 +33,8 @@ const cards = { var color = get.color(cards[0], false), type = get.type(cards[0], false); for (var i = 1; i < cards.length; i++) { - if (color && get.color(cards[i], false) != color) - color = false; - if (type && get.type(cards[i], false) != type) - type = false; + if (color && get.color(cards[i], false) != color) color = false; + if (type && get.type(cards[i], false) != type) type = false; if (!color && !type) return false; } return true; diff --git a/character/key/skill.js b/character/key/skill.js index 5648c385f..3fd200e91 100644 --- a/character/key/skill.js +++ b/character/key/skill.js @@ -9,16 +9,15 @@ const skills = { player: "enterGame", }, forced: true, - filter: (event) => { + filter: event => { return event.name != "phase" || game.phaseNumber == 0; }, content() { "step 0"; player.drawTo(8); - ("step 1"); + "step 1"; var hs = player.getCards("h"); - if (hs.length > 0) - player.addShownCards(hs, "visible_fuuko_xingdiao"); + if (hs.length > 0) player.addShownCards(hs, "visible_fuuko_xingdiao"); }, mod: { ignoredHandcard(card) { @@ -27,10 +26,7 @@ const skills = { } }, cardDiscardable(card, player, name) { - if ( - name == "phaseDiscard" && - card.hasGaintag("visible_fuuko_xingdiao") - ) { + if (name == "phaseDiscard" && card.hasGaintag("visible_fuuko_xingdiao")) { return false; } }, @@ -41,50 +37,23 @@ const skills = { gain: { enable: "phaseUse", filter: (event, player) => { - return game.hasPlayer((current) => - lib.skill.fuuko_xingdiao_gain.filterTarget( - null, - player, - current - ) - ); + return game.hasPlayer(current => lib.skill.fuuko_xingdiao_gain.filterTarget(null, player, current)); }, filterTarget: (card, player, target) => { - return ( - target != player && - target.hasCard( - (card) => card.hasGaintag("visible_fuuko_xingdiao"), - "h" - ) && - !target.getStorage("fuuko_xingdiao").includes(player) && - target.hasSkill("fuuko_xingdiao") - ); + return target != player && target.hasCard(card => card.hasGaintag("visible_fuuko_xingdiao"), "h") && !target.getStorage("fuuko_xingdiao").includes(player) && target.hasSkill("fuuko_xingdiao"); }, selectTarget: () => { - const num = game.countPlayer((current) => - lib.skill.fuuko_xingdiao_gain.filterTarget( - null, - _status.event.player, - current - ) - ); + const num = game.countPlayer(current => lib.skill.fuuko_xingdiao_gain.filterTarget(null, _status.event.player, current)); return num > 1 ? 1 : -1; }, content() { "step 0"; target.markAuto("fuuko_xingdiao", [player]); - var cards = target.getCards("h", (card) => - card.hasGaintag("visible_fuuko_xingdiao") - ); + var cards = target.getCards("h", card => card.hasGaintag("visible_fuuko_xingdiao")); if (!cards.length) event.finish(); - else if (cards.length == 1) - event._result = { bool: true, links: cards }; - else - player.chooseButton(true, [ - "选择获得" + get.translation(target) + "的一张“星”", - cards, - ]); - ("step 1"); + else if (cards.length == 1) event._result = { bool: true, links: cards }; + else player.chooseButton(true, ["选择获得" + get.translation(target) + "的一张“星”", cards]); + "step 1"; if (result.bool) { player.gain(result.links, target, "give"); target.draw(); @@ -102,21 +71,14 @@ const skills = { fuuko_chuanyuan: { trigger: { player: "loseAfter", - global: [ - "gainAfter", - "equipAfter", - "addJudgeAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], + global: ["gainAfter", "equipAfter", "addJudgeAfter", "loseAsyncAfter", "addToExpansionAfter"], }, forced: true, filter(event, player) { const evt = event.getl(player); if (!evt.hs.length) return false; for (let i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("visible_fuuko_xingdiao")) - return true; + if (evt.gaintag_map[i].includes("visible_fuuko_xingdiao")) return true; } return false; }, @@ -125,32 +87,25 @@ const skills = { gains = [], draws = 0; var map = evt.gaintag_map; - var cards = evt.hs.filter((card) => { - return ( - map[card.cardid] && - map[card.cardid].includes("visible_fuuko_xingdiao") - ); + var cards = evt.hs.filter(card => { + return map[card.cardid] && map[card.cardid].includes("visible_fuuko_xingdiao"); }); - cards.forEach((card) => { + cards.forEach(card => { var suit = get.suit(card, player), num = get.number(card, player); var card2 = get.cardPile2(function (card) { if (gains.includes(card)) return false; - return ( - get.suit(card, player) == suit && - get.number(card, player) == num - ); + return get.suit(card, player) == suit && get.number(card, player) == num; }); if (card2) gains.push(card2); else draws++; }); - if (gains.length) - player.gain(gains, "gain2").gaintag.add("fuuko_chuanyuan"); + if (gains.length) player.gain(gains, "gain2").gaintag.add("fuuko_chuanyuan"); if (draws) player.draw(draws).gaintag = ["fuuko_chuanyuan"]; player.addSkill("fuuko_chuanyuan_effect"); }, ai: { - combo: "fuuko_xingdiao" + combo: "fuuko_xingdiao", }, subSkill: { effect: { @@ -177,11 +132,10 @@ const skills = { firstDo: true, filter(event, player) { if (event.addCount === false) return false; - return player.hasHistory("lose", (evt) => { + return player.hasHistory("lose", evt => { if (evt.getParent() != event) return false; for (let i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("fuuko_chuanyuan")) - return true; + if (evt.gaintag_map[i].includes("fuuko_chuanyuan")) return true; } }); //return false; @@ -210,30 +164,16 @@ const skills = { mod: { cardEnabled(card) { if (get.itemtype(card) == "card") { - if (card.hasGaintag("iriya_yinji_tag")) - return false; + if (card.hasGaintag("iriya_yinji_tag")) return false; } else if (card.isCard && card.cards) { - if ( - card.cards.some((card) => - card.hasGaintag("iriya_yinji_tag") - ) - ) - return false; + if (card.cards.some(card => card.hasGaintag("iriya_yinji_tag"))) return false; } }, aiValue(player, card, num) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("iriya_yinji_tag") - ) - return num / 10000; + if (get.itemtype(card) == "card" && card.hasGaintag("iriya_yinji_tag")) return num / 10000; }, aiUseful(player, card, num) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("iriya_yinji_tag") - ) - return num / 10000; + if (get.itemtype(card) == "card" && card.hasGaintag("iriya_yinji_tag")) return num / 10000; }, }, }, @@ -243,12 +183,11 @@ const skills = { enable: "phaseUse", filterCard: true, selectCard: [2, Infinity], - promptfunc: () => - "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。", + promptfunc: () => "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。", position: "he", getType(cards, player) { var nums = cards - .map((card) => { + .map(card => { var num = get.number(card, player); if (num <= 2) return num + 13; return num; @@ -256,8 +195,7 @@ const skills = { .sort((a, b) => a - b), len = nums.length; if (len == 1) return ["单张", nums[0], 1]; - if (len == 2) - return nums[1] == nums[0] ? ["对子", nums[0], 1] : null; + if (len == 2) return nums[1] == nums[0] ? ["对子", nums[0], 1] : null; var map = {}; for (var i = 0; i < len; i++) { var count = get.numOf(nums, nums[i]); @@ -281,11 +219,7 @@ const skills = { return ["单顺", nums[0], len]; } else if (map[1].length == 2 && map[4] && len == 6) { return ["四带二", map[4][0], 1]; - } else if ( - map[3] && - map[1].length == map[3].length && - len == map[1].length * 4 - ) { + } else if (map[3] && map[1].length == map[3].length && len == map[1].length * 4) { if (map[3].length == 1) return ["三带一", map[3][0], 1]; for (var i = 0; i < map[3].length - 1; i++) { if (map[3][i + 1] - map[3][i] != 1) return null; @@ -303,11 +237,7 @@ const skills = { return ["双顺", nums[0], len]; } else if (map[4] && len == 6) { return ["四带二", map[4][0], 1]; - } else if ( - map[3] && - map[2].length == map[3].length && - len == map[2].length * 5 - ) { + } else if (map[3] && map[2].length == map[3].length && len == map[2].length * 5) { if (map[3].length == 1) return ["三带二", map[3][0], 1]; for (var i = 0; i < map[3].length - 1; i++) { if (map[3][i + 1] - map[3][i] != 1) return null; @@ -330,12 +260,7 @@ const skills = { return null; }, filterOk() { - return Array.isArray( - lib.skill.iriya_haozhi.getType( - ui.selected.cards, - _status.event.player - ) - ); + return Array.isArray(lib.skill.iriya_haozhi.getType(ui.selected.cards, _status.event.player)); }, check(card) { var player = _status.event.player; @@ -346,16 +271,14 @@ const skills = { if (num <= 2) return num + 13; return num; }, - hasEnemy = game.hasPlayer( - (current) => get.attitude(player, current) < 0 - ); + hasEnemy = game.hasPlayer(current => get.attitude(player, current) < 0); //所有手牌 var nums = player .getCards("he", function (card) { return lib.filter.cardDiscardable(card, player); }) - .map((card) => getNum(card, player)); - var numu = ui.selected.cards.map((card) => getNum(card, player)); + .map(card => getNum(card, player)); + var numu = ui.selected.cards.map(card => getNum(card, player)); var num = getNum(card, player); if (!_status.event._iriya_haozhi_type) { for (var type of types) { @@ -372,11 +295,7 @@ const skills = { case "三顺": if (!hasEnemy) break; for (var i of nums) { - if ( - i < 14 && - get.numOf(nums, i) >= 3 && - get.numOf(nums, i + 1) >= 3 - ) { + if (i < 14 && get.numOf(nums, i) >= 3 && get.numOf(nums, i + 1) >= 3) { _status.event._iriya_haozhi_type = "三顺"; break; } @@ -388,9 +307,7 @@ const skills = { if (i < 13 && get.numOf(nums, i) >= 2) { for (var j = 1; j < 3; j++) { if (get.numOf(nums, i + j) < 2) break; - if (j == 2) - _status.event._iriya_haozhi_type = - "双顺"; + if (j == 2) _status.event._iriya_haozhi_type = "双顺"; } } } @@ -401,9 +318,7 @@ const skills = { if (i < 11) { for (var j = 1; j < 5; j++) { if (!nums.includes(i + j)) break; - if (j == 4) - _status.event._iriya_haozhi_type = - "单顺"; + if (j == 4) _status.event._iriya_haozhi_type = "单顺"; } } } @@ -428,8 +343,7 @@ const skills = { } if (_status.event._iriya_haozhi_type) break; } - if (!_status.event._iriya_haozhi_type) - _status.event._iriya_haozhi_type = "要不起"; + if (!_status.event._iriya_haozhi_type) _status.event._iriya_haozhi_type = "要不起"; } if (_status.event._iriya_haozhi_type == "要不起") return 0; //复用响应AI @@ -443,11 +357,7 @@ const skills = { if ( count > 1 && player.hasCard(function (cardx) { - return ( - cardx != card && - getNum(cardx, player) == num && - cardx.hasGaintag("iriya_yinji_tag") - ); + return cardx != card && getNum(cardx, player) == num && cardx.hasGaintag("iriya_yinji_tag"); }, "he") ) return 4 - get.value(card); @@ -500,9 +410,7 @@ const skills = { len = map[_status.event._iriya_haozhi_type][0], addNum = map[_status.event._iriya_haozhi_type][1]; if (numu.length >= len) return 0; - var numt = - numu[numu.length - 1] + - (numu.length % (1 + addNum) == 0 ? 1 : 0); + var numt = numu[numu.length - 1] + (numu.length % (1 + addNum) == 0 ? 1 : 0); if (num == numt) return 10 + addNum - get.value(card); return 0; } @@ -520,31 +428,21 @@ const skills = { }, nums = player .getCards("he", function (card) { - return lib.filter.cardDiscardable( - card, - player, - "iriya_haozhi" - ); + return lib.filter.cardDiscardable(card, player, "iriya_haozhi"); }) - .map((card) => getNum(card, player)); + .map(card => getNum(card, player)); var num = getNum(card, player); if (!ui.selected.cards.length) { var count = get.numOf(nums, num); - if ( - count >= 4 && - (type[0] != "炸弹" || num > type[1] || count > type[2]) - ) - return 15; + if (count >= 4 && (type[0] != "炸弹" || num > type[1] || count > type[2])) return 15; switch (type[0]) { case "对子": - if (count > 1 && num > type[1]) - return 8 - get.value(card); + if (count > 1 && num > type[1]) return 8 - get.value(card); break; case "三张": case "三带一": case "三带二": - if (count > 2 && num > type[1]) - return 9 - get.value(card); + if (count > 2 && num > type[1]) return 9 - get.value(card); break; case "单顺": if (num <= type[1] || num > 15 - type[2]) return 0; @@ -553,12 +451,7 @@ const skills = { } return 10 - get.value(card); case "双顺": - if ( - num <= type[1] || - count < 2 || - num > 15 - type[2] / 2 - ) - return 0; + if (num <= type[1] || count < 2 || num > 15 - type[2] / 2) return 0; for (var i = 1; i < type[2] / 2; i++) { if (get.numOf(nums, num + i) < 2) return 0; } @@ -566,15 +459,8 @@ const skills = { case "三顺": case "单带飞机": case "双带飞机": - var size = - 3 + - ["三顺", "单带飞机", "双带飞机"].indexOf(type[0]); - if ( - num <= type[1] || - count < 3 || - num > 15 - type[2] / size - ) - return 0; + var size = 3 + ["三顺", "单带飞机", "双带飞机"].indexOf(type[0]); + if (num <= type[1] || count < 3 || num > 15 - type[2] / size) return 0; for (var i = 1; i < type[2] / size; i++) { if (get.numOf(nums, num + i) < 2) return 0; } @@ -582,20 +468,11 @@ const skills = { } return 0; } else { - var numu = ui.selected.cards.map((card) => - getNum(card, player) - ); + var numu = ui.selected.cards.map(card => getNum(card, player)); var numx = numu[0]; if (num == numx) { var count = get.numOf(nums, numx); - if ( - count >= 4 && - (type[0] != "炸弹" || - num > type[1] || - count > type[2]) && - numu.length < (type[0] == "炸弹" ? type2 : 4) - ) - return 15; + if (count >= 4 && (type[0] != "炸弹" || num > type[1] || count > type[2]) && numu.length < (type[0] == "炸弹" ? type2 : 4)) return 15; } switch (type[0]) { case "对子": @@ -607,14 +484,12 @@ const skills = { if (num == numu[0]) return 9 - get.value(card); return 0; case "三带一": - if (numu.length == 3 || num == numu[0]) - return 9 - get.value(card); + if (numu.length == 3 || num == numu[0]) return 9 - get.value(card); return 0; case "三带二": if (numu.length >= 5) return false; if (numu.length == 3) { - if (num == numu[0] || get.numOf(nums, num) < 2) - return 0; + if (num == numu[0] || get.numOf(nums, num) < 2) return 0; } else if (numu.length == 4) { return num == numu[3] ? 9 - get.value(card) : 0; } @@ -625,22 +500,17 @@ const skills = { case "三顺": if (numu.length >= type[2]) return 0; var addNum = ["单顺", "双顺", "三顺"].indexOf(type[0]); - var numt = - numu[numu.length - 1] + - (numu.length % (1 + addNum) == 0 ? 1 : 0); + var numt = numu[numu.length - 1] + (numu.length % (1 + addNum) == 0 ? 1 : 0); if (num == numt) return 10 + addNum - get.value(card); return 0; case "单带飞机": if (numu.length >= type[2]) return 0; var len = (type[2] / 4) * 3; if (numu.length < len) { - var numt = - numu[numu.length - 1] + - (numu.length % 3 == 0 ? 1 : 0); + var numt = numu[numu.length - 1] + (numu.length % 3 == 0 ? 1 : 0); if (num == numt) return 12 - get.value(card); } else { - if (num >= numu[0] || num <= numu[len - 1]) - return 0; + if (num >= numu[0] || num <= numu[len - 1]) return 0; return 12 - get.value(card); } return 0; @@ -648,22 +518,14 @@ const skills = { if (numu.length >= type[2]) return 0; var len = (type[2] / 5) * 3; if (numu.length < len) { - var numt = - numu[numu.length - 1] + - (numu.length % 3 == 0 ? 1 : 0); + var numt = numu[numu.length - 1] + (numu.length % 3 == 0 ? 1 : 0); if (num == numt) return 12 - get.value(card); } else { if ((numu.length - len) % 2 == 0) { - if ( - numu.includes(num) || - get.numOf(nums, num) < 2 - ) - return 0; + if (numu.includes(num) || get.numOf(nums, num) < 2) return 0; return 12 - get.value(card); } else { - return num == numu[numu.length - 1] - ? 12 - get.value(card) - : 0; + return num == numu[numu.length - 1] ? 12 - get.value(card) : 0; } } return 0; @@ -678,20 +540,12 @@ const skills = { event.current_type = lib.skill.iriya_haozhi.getType(cards, player); event.current_cards = cards.slice(0); if (!event.current_type) event.finish(); - ("step 1"); + "step 1"; var target = event.players.shift(); - if ( - (target != player || event.current != player) && - target.isIn() && - target.countCards("h") >= Math.min(cards.length, 4) - ) { + if ((target != player || event.current != player) && target.isIn() && target.countCards("h") >= Math.min(cards.length, 4)) { event.target = target; target.addTempSkill("iriya_haozhi_temp", { - global: [ - "discardBefore", - "chooseToDiscardEnd", - "phaseAfter", - ], + global: ["discardBefore", "chooseToDiscardEnd", "phaseAfter"], }); var trans = get.translation(event.current); var cardsn = (function (cards, player) { @@ -704,9 +558,7 @@ const skills = { var numa = getn(a, player), numb = getn(b, player); if (numa != numb) return numa - numb; - return lib.suit.indexOf( - get.suit(a, player) - get.suit(b, player) - ); + return lib.suit.indexOf(get.suit(a, player) - get.suit(b, player)); }); var str = ""; for (var i of cards) { @@ -716,25 +568,10 @@ const skills = { } return str.slice(1); })(event.current_cards, event.current); - var next = target.chooseToDiscard( - "是否响应" + - trans + - "的" + - get.translation(event.current_type[0]) + - "?", - trans + - "的牌组为" + - cardsn + - "。您此时可以点击“整理手牌”,将手牌按点数排序。", - [2, Infinity], - "he" - ); + var next = target.chooseToDiscard("是否响应" + trans + "的" + get.translation(event.current_type[0]) + "?", trans + "的牌组为" + cardsn + "。您此时可以点击“整理手牌”,将手牌按点数排序。", [2, Infinity], "he"); next.set("type", event.current_type); next.set("filterOk", function () { - var type = lib.skill.iriya_haozhi.getType( - ui.selected.cards, - _status.event.player - ); + var type = lib.skill.iriya_haozhi.getType(ui.selected.cards, _status.event.player); if (!type) return false; var ptype = _status.event.type; if (type[0] == "炸弹") { @@ -744,29 +581,22 @@ const skills = { } return true; } - return ( - type[0] == ptype[0] && - type[2] == ptype[2] && - type[1] > ptype[1] - ); + return type[0] == ptype[0] && type[2] == ptype[2] && type[1] > ptype[1]; }); next.set("goon", get.attitude(target, event.current) < 0); next.set("ai", lib.skill.iriya_haozhi.respondAI); } else if (event.players.length > 0) event.redo(); else event.goto(3); - ("step 2"); + "step 2"; if (result.bool) { event.current = target; - event.current_type = lib.skill.iriya_haozhi.getType( - result.cards.slice(0), - target - ); + event.current_type = lib.skill.iriya_haozhi.getType(result.cards.slice(0), target); event.current_cards = result.cards.slice(0); if (!event.current_type) event.finish(); event.current.addExpose(0.5); } if (event.players.length > 0) event.goto(1); - ("step 3"); + "step 3"; var current = event.current, type = 0; if (!current.isIn()) return; @@ -808,15 +638,13 @@ const skills = { }, content1() { "step 0"; - player - .chooseTarget([1, 2], "是否令至多两名角色各摸一张牌?") - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }); - ("step 1"); + player.chooseTarget([1, 2], "是否令至多两名角色各摸一张牌?").set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + "step 1"; if (result.bool) { var targets = result.targets.sortBySeat(); player.line(targets); @@ -827,32 +655,19 @@ const skills = { content2() { "step 0"; player - .chooseTarget( - [1, 3], - "是否弃置至多三名角色的各一张牌?", - function (card, player, target) { - return ( - target != player && - target.hasCard(function (card) { - return lib.filter.canBeDiscarded( - card, - player, - target - ); - }, "he") - ); - } - ) + .chooseTarget([1, 3], "是否弃置至多三名角色的各一张牌?", function (card, player, target) { + return ( + target != player && + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ); + }) .set("ai", function (target) { var player = _status.event.player; - return get.effect( - target, - { name: "guohe_copy2" }, - player, - player - ); + return get.effect(target, { name: "guohe_copy2" }, player, player); }); - ("step 1"); + "step 1"; if (result.bool) { var targets = result.targets.sortBySeat(); player.line(targets, "green"); @@ -860,53 +675,35 @@ const skills = { player.discardPlayerCard(target, true, "he"); } } - ("step 2"); + "step 2"; //player.recover(); player.draw(); }, content3() { "step 0"; event.count = 0; - ("step 1"); + "step 1"; var next = player - .chooseTarget( - "是否弃置一名其他角色的一张牌?", - function (card, player, target) { - return ( - target != player && - target.hasCard(function (card) { - return lib.filter.canBeDiscarded( - card, - player, - target - ); - }, "he") - ); - } - ) + .chooseTarget("是否弃置一名其他角色的一张牌?", function (card, player, target) { + return ( + target != player && + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ); + }) .set("ai", function (target) { var player = _status.event.player; - return get.effect( - target, - { name: "guohe_copy2" }, - player, - player - ); + return get.effect(target, { name: "guohe_copy2" }, player, player); }); - if (event.color) - next.set( - "prompt2", - "若你弃置的牌为" + - get.translation(event.color) + - ",则你可以重复此流程" - ); - ("step 2"); + if (event.color) next.set("prompt2", "若你弃置的牌为" + get.translation(event.color) + ",则你可以重复此流程"); + "step 2"; if (result.bool) { var target = result.targets[0]; player.line(target, "fire"); player.discardPlayerCard(target, true, "he"); } else event.goto(4); - ("step 3"); + "step 3"; if (result.bool) { event.count++; var card = result.cards[0], @@ -916,52 +713,34 @@ const skills = { event.goto(1); } else if (color == event.color) event.goto(1); } - ("step 4"); + "step 4"; if (event.count > 0) player.draw(event.count); }, content4() { "step 0"; event.count = 0; - ("step 1"); + "step 1"; var next = player - .chooseTarget( - "是否获得一名其他角色的一张牌?", - function (card, player, target) { - return ( - target != player && - target.hasCard(function (card) { - return lib.filter.canBeGained( - card, - player, - target - ); - }, "he") - ); - } - ) + .chooseTarget("是否获得一名其他角色的一张牌?", function (card, player, target) { + return ( + target != player && + target.hasCard(function (card) { + return lib.filter.canBeGained(card, player, target); + }, "he") + ); + }) .set("ai", function (target) { var player = _status.event.player; - return get.effect( - target, - { name: "shunshou_copy2" }, - player, - player - ); + return get.effect(target, { name: "shunshou_copy2" }, player, player); }); - if (event.color) - next.set( - "prompt2", - "若你得到的牌为" + - get.translation(event.color) + - ",则你可以重复此流程" - ); - ("step 2"); + if (event.color) next.set("prompt2", "若你得到的牌为" + get.translation(event.color) + ",则你可以重复此流程"); + "step 2"; if (result.bool) { var target = result.targets[0]; player.line(target, "fire"); player.gainPlayerCard(target, true, "he"); } else event.goto(4); - ("step 3"); + "step 3"; if (result.bool) { event.count++; var card = result.cards[0], @@ -972,45 +751,34 @@ const skills = { } else if (color == event.color) event.goto(1); //player.draw(); } - ("step 4"); + "step 4"; if (event.count > 0) player.recover(event.count); }, content5() { "step 0"; - player - .chooseTarget( - [1, 3], - "是否令至多三名其他角色翻面?", - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.isTurnedOver()) return 10 * att; - return -6 * att; - }); - ("step 1"); + player.chooseTarget([1, 3], "是否令至多三名其他角色翻面?", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.isTurnedOver()) return 10 * att; + return -6 * att; + }); + "step 1"; if (result.bool) { var targets = result.targets.sortBySeat(); player.line(targets, "thunder"); event.targets = targets; for (var target of targets) target.turnOver(); } - ("step 2"); + "step 2"; player - .chooseTarget( - "是否对一名目标角色造成1点火属性伤害?", - function (card, player, target) { - return _status.event - .getParent() - .targets.includes(target); - } - ) + .chooseTarget("是否对一名目标角色造成1点火属性伤害?", function (card, player, target) { + return _status.event.getParent().targets.includes(target); + }) .set("ai", function (target) { var player = _status.event.player; return get.damageEffect(target, player, player, "fire"); }); - ("step 3"); + "step 3"; if (result.bool) { var target = result.targets[0]; player.line(target, "fire"); @@ -1019,22 +787,13 @@ const skills = { }, content6() { "step 0"; - player - .chooseTarget( - "是否对一名其他角色进行核打击?", - "你对该角色造成2点雷属性伤害,然后该角色翻面,弃置装备区内的所有牌和四张手牌。", - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.isTurnedOver()) - return ( - -6 * att * Math.sqrt(2 + target.countCards("he")) - ); - return -att * Math.sqrt(2 + target.countCards("he")); - }); - ("step 1"); + player.chooseTarget("是否对一名其他角色进行核打击?", "你对该角色造成2点雷属性伤害,然后该角色翻面,弃置装备区内的所有牌和四张手牌。", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.isTurnedOver()) return -6 * att * Math.sqrt(2 + target.countCards("he")); + return -att * Math.sqrt(2 + target.countCards("he")); + }); + "step 1"; if (result.bool) { var target = result.targets[0]; event.target = target; @@ -1042,10 +801,10 @@ const skills = { target.damage("thunder", 2); target.turnOver(); } else event.finish(); - ("step 2"); + "step 2"; var num = target.countCards("e"); if (num > 0) target.chooseToDiscard("e", true, num); - ("step 3"); + "step 3"; var num = target.countCards("h"); if (num > 0) target.chooseToDiscard("h", true, Math.min(4, num)); }, @@ -1074,72 +833,40 @@ const skills = { if (trigger.addCount !== false) { trigger.addCount = false; var stat = player.getStat().card; - if (stat[card.name] && stat[card.name] > 0) - stat[card.name]--; + if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; } var info = get.info(card); if (info.allowMultiple == false) event.finish(); if (trigger.targets && !info.multitarget) { if ( game.hasPlayer(function (current) { - return ( - !trigger.targets.includes(current) && - lib.filter.targetEnabled2( - card, - player, - current - ) - ); + return !trigger.targets.includes(current) && lib.filter.targetEnabled2(card, player, current); }) ) { - var prompt2 = - "为" + - get.translation(card) + - "增加" + - (num > 1 ? "至多" : "") + - get.cnNumber(num) + - "个目标"; + var prompt2 = "为" + get.translation(card) + "增加" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "个目标"; player - .chooseTarget( - get.prompt("iriya_haozhi_extra"), - [1, num], - function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes( - target - ) && - lib.filter.targetEnabled2( - _status.event.card, - player, - target - ) - ); - } - ) + .chooseTarget(get.prompt("iriya_haozhi_extra"), [1, num], function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) .set("prompt2", prompt2) .set("ai", function (target) { var trigger = _status.event.getTrigger(); var player = _status.event.player; - return get.effect( - target, - trigger.card, - player, - player - ); + return get.effect(target, trigger.card, player, player); }) .set("card", trigger.card) .set("targets", trigger.targets); } } - ("step 1"); + "step 1"; if (result.bool) { if (!event.isMine() && !event.isOnline()) game.delayx(); event.targets = result.targets; } else { event.finish(); } - ("step 2"); + "step 2"; if (event.targets) { player.logSkill("iriya_haozhi_extra", event.targets); trigger.targets.addArray(event.targets); @@ -1166,25 +893,17 @@ const skills = { "step 0"; var target = trigger.target; event.target = target; - target.showHandcards( - get.translation(player) + - "对" + - get.translation(target) + - "发动了【落刀】" - ); - ("step 1"); + target.showHandcards(get.translation(player) + "对" + get.translation(target) + "发动了【落刀】"); + "step 1"; if ( target.hasCard(function (card) { return get.name(card, target) == "shan"; }, "h") ) { - player - .discardPlayerCard(target, true, "h", "visible") - .set("filterButton", function (button) { - return get.name(button.link) == "shan"; - }); - } else if (player.countCards("he") > 0) - player.chooseToDiscard("he", true); + player.discardPlayerCard(target, true, "h", "visible").set("filterButton", function (button) { + return get.name(button.link) == "shan"; + }); + } else if (player.countCards("he") > 0) player.chooseToDiscard("he", true); }, }, satomi_daohai: { @@ -1197,37 +916,21 @@ const skills = { ); }, check(event, player) { - return ( - player.getUseValue({ name: "wugu" }) + - player.getUseValue({ name: "lebu" }) > - 0 - ); + return player.getUseValue({ name: "wugu" }) + player.getUseValue({ name: "lebu" }) > 0; }, content() { "step 0"; player.chooseUseTarget("wugu", true); - ("step 1"); + "step 1"; if (result.bool) { var cards = []; player.getHistory("gain", function (evt) { - if ( - evt.getParent().name == "wugu" && - evt.getParent(4) == event - ) { + if (evt.getParent().name == "wugu" && evt.getParent(4) == event) { cards.addArray(evt.cards); } }); cards = cards.filter(function (card) { - return ( - player.getCards("h").includes(card) && - game.checkMod( - card, - player, - "unchanged", - "cardEnabled2", - player - ) - ); + return player.getCards("h").includes(card) && game.checkMod(card, player, "unchanged", "cardEnabled2", player); }); if (cards.length) { player.chooseCardTarget({ @@ -1237,36 +940,21 @@ const skills = { }, cards: cards, filterTarget(card, player, target) { - var card = get.autoViewAs( - { name: "lebu" }, - ui.selected.cards - ); + var card = get.autoViewAs({ name: "lebu" }, ui.selected.cards); return player.canUse(card, target); }, ai1: () => 1, ai2(target) { var player = _status.event.player, - card = get.autoViewAs( - { name: "lebu" }, - ui.selected.cards - ); - return get.effect( - target, - { name: "lebu" }, - player, - player - ); + card = get.autoViewAs({ name: "lebu" }, ui.selected.cards); + return get.effect(target, { name: "lebu" }, player, player); }, }); } else event.finish(); } else event.finish(); - ("step 2"); + "step 2"; if (result.bool) { - player.useCard( - { name: "lebu" }, - result.cards, - result.targets[0] - ); + player.useCard({ name: "lebu" }, result.cards, result.targets[0]); } }, }, @@ -1297,38 +985,21 @@ const skills = { }, }, erika_yousheng: { - init: (player) => { + init: player => { player.addSkill("erika_yousheng_mamori"); }, dutySkill: true, group: ["erika_yousheng_achieve", "erika_yousheng_fail"], trigger: { global: "useCardToTarget" }, filter(event, player) { - return ( - player.getStorage("erika_yousheng").includes(event.target) && - (event.card.name == "sha" || - (get.type2(event.card, false) == "trick" && - get.tag(event.card, "damage") > 0)) && - player.countMark("erika_yousheng_ruka") + 1 <= - player.countCards("he") - ); + return player.getStorage("erika_yousheng").includes(event.target) && (event.card.name == "sha" || (get.type2(event.card, false) == "trick" && get.tag(event.card, "damage") > 0)) && player.countMark("erika_yousheng_ruka") + 1 <= player.countCards("he"); }, intro: { content: "已保护$", }, async cost(event, trigger, player) { const num = player.countMark("erika_yousheng_ruka") + 1; - event.result = await player - .chooseToDiscard( - "he", - num, - get.prompt("erika_yousheng", trigger.target), - "弃置" + - num + - "张牌,并转移" + - get.translation(trigger.card) - ) - .forResult(); + event.result = await player.chooseToDiscard("he", num, get.prompt("erika_yousheng", trigger.target), "弃置" + num + "张牌,并转移" + get.translation(trigger.card)).forResult(); }, async content(event, trigger, player) { player.discard(event.cards); @@ -1350,11 +1021,7 @@ const skills = { skillAnimation: "legend", animationColor: "water", filter(event, player) { - return ( - player.storage.erika_yousheng && - event.num < 0 && - !player.hujia - ); + return player.storage.erika_yousheng && event.num < 0 && !player.hujia; }, content() { "step 0"; @@ -1368,7 +1035,7 @@ const skills = { }); player.line(list, "green"); game.asyncDraw(list, 3); - ("step 1"); + "step 1"; game.delayx(); }, }, @@ -1376,15 +1043,7 @@ const skills = { trigger: { global: "damageEnd" }, forced: true, filter(event, player) { - return ( - player - .getStorage("erika_yousheng") - .includes(event.player) && - event.card && - (event.card.name == "sha" || - (get.type2(event.card, false) == "trick" && - get.tag(event.card, "damage") > 0)) - ); + return player.getStorage("erika_yousheng").includes(event.player) && event.card && (event.card.name == "sha" || (get.type2(event.card, false) == "trick" && get.tag(event.card, "damage") > 0)); }, content() { player.awakenSkill("erika_yousheng"); @@ -1402,12 +1061,7 @@ const skills = { animationColor: "wood", async cost(event, trigger, player) { event.result = await player - .chooseTarget( - get.prompt("erika_yousheng"), - [1, 2], - lib.filter.notMe, - "选择至多两名其他角色。你减2点体力上限并获得3点护甲。" - ) + .chooseTarget(get.prompt("erika_yousheng"), [1, 2], lib.filter.notMe, "选择至多两名其他角色。你减2点体力上限并获得3点护甲。") .set("ai", function (ruka) { return -1; }) @@ -1424,25 +1078,14 @@ const skills = { trigger: { global: "useCardAfter" }, charlotte: true, filter(event, player) { - return ( - event["erika_yousheng_" + player.playerid] && - event.cards.filterInD().length > 0 - ); + return event["erika_yousheng_" + player.playerid] && event.cards.filterInD().length > 0; }, async cost(event, trigger, player) { event.result = await player - .chooseTarget( - "是否令一名原目标角色获得" + - get.translation(trigger.cards.filterInD()) + - "?", - function (card, player, target) { - return _status.event.targets.includes(target); - } - ) - .set( - "targets", - trigger["erika_yousheng_" + player.playerid] - ) + .chooseTarget("是否令一名原目标角色获得" + get.translation(trigger.cards.filterInD()) + "?", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("targets", trigger["erika_yousheng_" + player.playerid]) .forResult(); }, async content(event, trigger, player) { @@ -1458,15 +1101,13 @@ const skills = { trigger: { target: "useCardToTargeted" }, forced: true, filter(event, player) { - if (event.player == player || event.player != _status.currentPhase) - return false; + if (event.player == player || event.player != _status.currentPhase) return false; var index = event.player .getHistory("useCard", function (evt) { return evt.targets.includes(player); }) .indexOf(event.getParent()); - if (index == 2) - return event.player.isIn() && player.countCards("he") > 0; + if (index == 2) return event.player.isIn() && player.countCards("he") > 0; return index < 2 && index > -1; }, logTarget: "player", @@ -1478,16 +1119,12 @@ const skills = { }) .indexOf(trigger.getParent()); if (index == 2) { - player.chooseCard( - "he", - true, - "三礼:交给" + get.translation(trigger.player) + "一张牌" - ); + player.chooseCard("he", true, "三礼:交给" + get.translation(trigger.player) + "一张牌"); } else { player.draw(); event.finish(); } - ("step 1"); + "step 1"; if (result.bool) { player.give(result.cards, trigger.player); } @@ -1501,21 +1138,11 @@ const skills = { async cost(event, trigger, player) { const num = player.getHistory("useCard", function (evt) { - return ( - evt.card.name == "sha" || - (get.type(evt.card) == "trick" && - get.tag(evt.card, "damage") > 0) - ); + return evt.card.name == "sha" || (get.type(evt.card) == "trick" && get.tag(evt.card, "damage") > 0); }).length + 1; event.result = await player - .chooseTarget( - get.prompt("liyingxia_zhenjun"), - [1, num], - "令至多" + get.cnNumber(num) + "名角色各摸一张牌" - ) - .set("ai", (serafu) => - get.attitude(_status.event.player, serafu) - ) + .chooseTarget(get.prompt("liyingxia_zhenjun"), [1, num], "令至多" + get.cnNumber(num) + "名角色各摸一张牌") + .set("ai", serafu => get.attitude(_status.event.player, serafu)) .forResult(); }, content() { @@ -1545,20 +1172,13 @@ const skills = { liyingxia_wumai: { trigger: { global: "roundStart" }, filter(event, player) { - return ( - player.group == "shu" && - (player.getStorage("liyingxia_wumai").length < 4 || - game.hasPlayer((current) => current.isDamaged())) - ); + return player.group == "shu" && (player.getStorage("liyingxia_wumai").length < 4 || game.hasPlayer(current => current.isDamaged())); }, async cost(event, trigger, player) { var list = lib.skill.liyingxia_wumai.derivation.slice(0); list.removeArray(player.getStorage("liyingxia_wumai")); if (list.length) { - const { result } = await player - .chooseControl(list, "cancel2") - .set("prompt", get.prompt("liyingxia_wumai")) - .set("prompt2", "获得一个技能直到本轮结束"); + const { result } = await player.chooseControl(list, "cancel2").set("prompt", get.prompt("liyingxia_wumai")).set("prompt2", "获得一个技能直到本轮结束"); if (result.control !== "cancel2") { event.result = { bool: true, @@ -1571,14 +1191,9 @@ const skills = { } else { const num = Math.min( 3, - game.countPlayer((current) => current.isDamaged()) - ); - const { result } = await player.chooseBool( - get.prompt("liyingxia_wumai") + - "(可摸" + - get.cnNumber(num) + - "张牌)" + game.countPlayer(current => current.isDamaged()) ); + const { result } = await player.chooseBool(get.prompt("liyingxia_wumai") + "(可摸" + get.cnNumber(num) + "张牌)"); if (result.bool) { event.result = { bool: true, @@ -1615,15 +1230,7 @@ const skills = { for (var i = 1; i < history.length; i++) { if (get.type2(history[i].card, false) != type) { const result = await player - .chooseButton([ - "列阵:是否视为使用其中一种牌?", - [ - ["kano_paibingbuzhen"].concat( - get.zhinangs() - ), - "vcard", - ], - ]) + .chooseButton(["列阵:是否视为使用其中一种牌?", [["kano_paibingbuzhen"].concat(get.zhinangs()), "vcard"]]) .set("filterButton", function (button) { return _status.event.player.hasUseTarget({ name: button.link[2], @@ -1649,10 +1256,7 @@ const skills = { } } var str = _status.renku.length ? "获得仁库中的所有牌" : "摸两张牌"; - event.result = await player - .chooseBool(get.prompt("kano_liezhen"), str) - .set("frequentSkill", "kano_liezhen") - .forResult(); + event.result = await player.chooseBool(get.prompt("kano_liezhen"), str).set("frequentSkill", "kano_liezhen").forResult(); }, async content(event, trigger, player) { const result = event.cost_data; @@ -1675,12 +1279,7 @@ const skills = { trigger: { target: "useCardToTargeted" }, charlotte: true, filter(event, player) { - return ( - _status.renku.length > 0 && - (event.card.name == "sha" || - (get.type(event.card) == "trick" && - get.tag(event.card, "damage") > 0)) - ); + return _status.renku.length > 0 && (event.card.name == "sha" || (get.type(event.card) == "trick" && get.tag(event.card, "damage") > 0)); }, check(trigger, player) { return get.effect(player, trigger.card, trigger.player, player) < 0; @@ -1688,7 +1287,7 @@ const skills = { content() { "step 0"; player.judge(); - ("step 1"); + "step 1"; var bool = false, type = get.type2(result.card.name); for (var i of _status.renku) { @@ -1699,23 +1298,15 @@ const skills = { } if (bool) { player - .chooseButton([ - "是否移去一张牌,令" + - get.translation(trigger.card) + - "对你无效?", - _status.renku, - ]) + .chooseButton(["是否移去一张牌,令" + get.translation(trigger.card) + "对你无效?", _status.renku]) .set("types", [result.suit, type]) .set("filterButton", function (button) { var types = _status.event.types; - return ( - get.suit(button.link, false) == types[0] || - get.type2(button.link, false) == types[1] - ); + return get.suit(button.link, false) == types[0] || get.type2(button.link, false) == types[1]; }) .set("ai", () => 1); } else event.finish(); - ("step 2"); + "step 2"; if (result.bool) { var card = result.links[0]; player.$throw(card, 1000); @@ -1781,22 +1372,20 @@ const skills = { content() { "step 0"; player.draw(); - ("step 1"); + "step 1"; if (player.countCards("he") > 0) { player.chooseCard("he", true, "潜梦:选择一张牌置于牌堆中"); } else event.finish(); - ("step 2"); + "step 2"; if (result.bool) { var card = result.cards[0]; player.storage.mia_qianmeng = card; player.$throw(card, 1000); player.lose(card, ui.cardPile).insert_index = function () { - return ui.cardPile.childNodes[ - Math.ceil(ui.cardPile.childNodes.length / 2) - ]; + return ui.cardPile.childNodes[Math.ceil(ui.cardPile.childNodes.length / 2)]; }; } else event.finish(); - ("step 3"); + "step 3"; game.delayx(); }, onremove: true, @@ -1812,10 +1401,7 @@ const skills = { if (event.name == "gain") { var source = event.player, cards = event.getg(source); - return ( - cards.includes(card) && - source.getCards("hejsx").includes(card) - ); + return cards.includes(card) && source.getCards("hejsx").includes(card); } else { if (event.type != "gain") return false; var owner = get.owner(card); @@ -1831,9 +1417,8 @@ const skills = { var card = player.storage.mia_qianmeng, owner = get.owner(card); if (owner && owner != player) owner.give(card, player); - ("step 1"); - if (player.hp < player.maxHp) - player.recover(player.maxHp - player.hp); + "step 1"; + if (player.hp < player.maxHp) player.recover(player.maxHp - player.hp); player.changeSkills(["mia_fengfa"], ["mia_shihui"]); }, }, @@ -1844,15 +1429,7 @@ const skills = { return get.itemtype(player.storage.mia_qianmeng) == "card"; }, async cost(event, trigger, player) { - event.result = await player - .chooseTarget( - get.prompt("mia_qianmeng"), - "令一名角色获得牌堆中所有点数为" + - player.storage.mia_qianmeng.number + - "的牌", - lib.filter.notMe - ) - .forResult(); + event.result = await player.chooseTarget(get.prompt("mia_qianmeng"), "令一名角色获得牌堆中所有点数为" + player.storage.mia_qianmeng.number + "的牌", lib.filter.notMe).forResult(); }, async content(event, trigger, player) { game.log(player, "使命失败"); @@ -1862,8 +1439,7 @@ const skills = { cards = []; for (var i = 0; i < ui.cardPile.childNodes.length; i++) { var card = ui.cardPile.childNodes[i]; - if (card.number == num && card.suit == suit) - cards.push(card); + if (card.number == num && card.suit == suit) cards.push(card); } if (cards.length) await target.gain(cards, "gain2"); }, @@ -1900,11 +1476,7 @@ const skills = { direct: true, content() { player.addTempSkill("kotomi_qinji2"); - player.chooseUseTarget( - { name: "wanjian", isCard: true }, - get.prompt("kotomi_qinji"), - "视为使用一张【万箭齐发】" - ).logSkill = "kotomi_qinji"; + player.chooseUseTarget({ name: "wanjian", isCard: true }, get.prompt("kotomi_qinji"), "视为使用一张【万箭齐发】").logSkill = "kotomi_qinji"; }, }, kotomi_qinji2: { @@ -1926,13 +1498,7 @@ const skills = { enable: "phaseUse", usable: 1, filter(event, player) { - return ( - !player.hasSkill("kotomi_chuanxiang") && - player.countCards( - "e", - lib.skill.kotomi_chuanxiang2.filterCard - ) > 0 - ); + return !player.hasSkill("kotomi_chuanxiang") && player.countCards("e", lib.skill.kotomi_chuanxiang2.filterCard) > 0; }, filterCard(card, player) { if (!player) player = _status.event.player; @@ -1949,21 +1515,13 @@ const skills = { var player = _status.event.player; if ( game.hasPlayer(function (current) { - return ( - current.hasSkill("kotomi_chuanxiang") && - get.attitude(player, current) > 0 - ); + return current.hasSkill("kotomi_chuanxiang") && get.attitude(player, current) > 0; }) ) { var subtype = get.subtype(card, false); if ( player.countCards("hs", function (cardx) { - return ( - get.type(cardx) == "equip" && - get.subtype(cardx, false) == subtype && - player.canUse(cardx, player) && - get.effect(player, cardx, player, player) > 0 - ); + return get.type(cardx) == "equip" && get.subtype(cardx, false) == subtype && player.canUse(cardx, player) && get.effect(player, cardx, player, player) > 0; }) ) return 8; @@ -1975,11 +1533,7 @@ const skills = { var players = game.filterPlayer(function (current) { return current.hasSkill("kotomi_chuanxiang"); }); - return ( - "将一张装备牌传给其他角色,然后令" + - get.translation(players) + - "摸一张牌。若传给该角色,则其改为摸两张牌。" - ); + return "将一张装备牌传给其他角色,然后令" + get.translation(players) + "摸一张牌。若传给该角色,则其改为摸两张牌。"; }, prepare: "give", discard: false, @@ -1993,7 +1547,7 @@ const skills = { game.asyncDraw(list, function (targetx) { return targetx == target ? 2 : 1; }); - ("step 1"); + "step 1"; game.delayx(); }, ai: { @@ -2033,16 +1587,12 @@ const skills = { "step 0"; if (!target.countCards("h")) event.finish(); else player.choosePlayerCard(target, "h", true); - ("step 1"); + "step 1"; player.showCards(result.cards); event.cards2 = result.cards; - ("step 2"); + "step 2"; target.$give(event.cards2, player, false); - target.loseToSpecial( - event.cards2, - "asara_yingwei", - player - ).visible = true; + target.loseToSpecial(event.cards2, "asara_yingwei", player).visible = true; var card1 = cards[0], card2 = event.cards2[0]; if (card1.suit == card2.suit) player.draw(2); @@ -2058,16 +1608,7 @@ const skills = { asara_yingwei: { trigger: { player: "yingbian" }, forced: true, - filter: (event, player) => - event.card.isCard && - player.hasHistory( - "lose", - (evt) => - evt.getParent() == event && - Object.values(evt.gaintag_map).some((value) => - value.includes("asara_yingwei") - ) - ), + filter: (event, player) => event.card.isCard && player.hasHistory("lose", evt => evt.getParent() == event && Object.values(evt.gaintag_map).some(value => value.includes("asara_yingwei"))), content: () => { trigger.forceYingbian = true; }, @@ -2103,8 +1644,7 @@ const skills = { var createDialog = function (player, id) { if (_status.connectMode) lib.configOL.choose_timeout = "30"; if (player == game.me) return; - var str = - get.translation(player) + "正在表演《小空飞天》...
    "; + var str = get.translation(player) + "正在表演《小空飞天》...
    "; ui.create.dialog(str).videoId = id; }; var chooseButton = function () { @@ -2121,7 +1661,7 @@ const skills = { } else { switchToAuto(); } - ("step 1"); + "step 1"; game.broadcastAll( function (id, time) { if (_status.connectMode) lib.configOL.choose_timeout = time; @@ -2143,18 +1683,16 @@ const skills = { var list = []; var list2 = []; for (var i = 0; i < 5; i++) { - if (lib.skill.yukito_kongwu.moves[i].filter(player, true)) - list.push(i); + if (lib.skill.yukito_kongwu.moves[i].filter(player, true)) list.push(i); else list2.push(i); } - if (list.length >= result.score) - list = list.randomGets(result.score); + if (list.length >= result.score) list = list.randomGets(result.score); else list.addArray(list2.randomGets(result.score - list.length)); list.sort(); var next = player.chooseButton([ "控物:请选择一项", [ - list.map((i) => { + list.map(i => { return [i, lib.skill.yukito_kongwu.moves[i].prompt]; }), "textbutton", @@ -2162,21 +1700,13 @@ const skills = { ]); next.set("forced", true); next.set("filterButton", function (button) { - return lib.skill.yukito_kongwu.moves[button.link].filter( - _status.event.player - ); + return lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player); }); next.set("ai", function (button) { - if ( - lib.skill.yukito_kongwu.moves[button.link].filter( - _status.event.player, - true - ) - ) - return 1 + Math.random(); + if (lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player, true)) return 1 + Math.random(); return Math.random(); }); - ("step 2"); + "step 2"; var num = result.links[0]; switch (num) { case 0: @@ -2196,67 +1726,53 @@ const skills = { event.finish(); break; } - ("step 3"); - player - .chooseTarget(true, "令一名角色摸两张牌") - .set("ai", function (target) { - var player = _status.event.player; - var att = - get.attitude(player, target) / - Math.sqrt(1 + target.countCards("h")); - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }); - ("step 4"); + "step 3"; + player.chooseTarget(true, "令一名角色摸两张牌").set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + "step 4"; if (result.bool) { var target = result.targets[0]; player.line(target, "green"); target.draw(2); } event.finish(); - ("step 5"); - player - .chooseTarget(true, "对一名角色造成1点伤害") - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - ("step 6"); + "step 5"; + player.chooseTarget(true, "对一名角色造成1点伤害").set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 6"; if (result.bool) { var target = result.targets[0]; player.line(target, "green"); target.damage(); } event.finish(); - ("step 7"); + "step 7"; player - .chooseTarget( - true, - "令一名已受伤的角色回复1点体力", - function (card, player, target) { - return target.isDamaged(); - } - ) + .chooseTarget(true, "令一名已受伤的角色回复1点体力", function (card, player, target) { + return target.isDamaged(); + }) .set("ai", function (target) { var player = _status.event.player; return get.recoverEffect(target, player, player); }); - ("step 8"); + "step 8"; if (result.bool) { var target = result.targets[0]; player.line(target, "green"); target.recover(); } event.finish(); - ("step 9"); + "step 9"; player - .chooseTarget( - true, - "弃置一名角色区域内的两张牌", - function (card, player, target) { - return target.countDiscardableCards(player, "hej") > 0; - } - ) + .chooseTarget(true, "弃置一名角色区域内的两张牌", function (card, player, target) { + return target.countDiscardableCards(player, "hej") > 0; + }) .set("ai", function (target) { return -get.attitude(_status.event.player, target); }); @@ -2286,11 +1802,7 @@ const skills = { prompt: "令一名已受伤的角色回复1点体力", filter(player, ai) { return game.hasPlayer(function (current) { - if (current.isDamaged()) - return ( - !ai || - get.recoverEffect(current, player, player) > 0 - ); + if (current.isDamaged()) return !ai || get.recoverEffect(current, player, player) > 0; }); }, }, @@ -2299,29 +1811,16 @@ const skills = { filter(player, ai) { return game.hasPlayer(function (current) { return ( - current.countDiscardableCards( - player, - "hej", - function (card) { - if (!ai) return true; - return ( - get.buttonValue({ - link: card, - }) * - get.attitude(player, current) > - 0 - ); - } - ) >= - (ai - ? 1 - : Math.min( - 2, - current.countDiscardableCards( - player, - "hej" - ) - )) + current.countDiscardableCards(player, "hej", function (card) { + if (!ai) return true; + return ( + get.buttonValue({ + link: card, + }) * + get.attitude(player, current) > + 0 + ); + }) >= (ai ? 1 : Math.min(2, current.countDiscardableCards(player, "hej"))) ); }); }, @@ -2343,10 +1842,7 @@ const skills = { enable: "chooseToUse", limited: true, filter(event, player) { - return ( - event.type == "dying" && - (player.name1 == "key_yukito" || player.name2 == "key_yukito") - ); + return event.type == "dying" && (player.name1 == "key_yukito" || player.name2 == "key_yukito"); }, filterTarget(card, player, target) { return target == _status.event.dying; @@ -2358,12 +1854,12 @@ const skills = { "step 0"; player.awakenSkill("yukito_yaxiang"); player.reinitCharacter("key_yukito", "key_crow", false); - ("step 1"); + "step 1"; if (target.hp < 3) target.recover(3 - target.hp); - ("step 2"); + "step 2"; var cards = target.getCards("j"); if (cards.length) target.discard(cards); - ("step 3"); + "step 3"; target.addSkills("misuzu_zhongyuan"); }, derivation: "misuzu_zhongyuan", @@ -2375,33 +1871,18 @@ const skills = { if (get.attitude(player, target) < 4) return false; if ( player.countCards("h", function (card) { - var mod2 = game.checkMod( - card, - player, - "unchanged", - "cardEnabled2", - player - ); + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); if (mod2 != "unchanged") return mod2; - var mod = game.checkMod( - card, - player, - target, - "unchanged", - "cardSavable", - player - ); + var mod = game.checkMod(card, player, target, "unchanged", "cardSavable", player); if (mod != "unchanged") return mod; var savable = get.info(card).savable; - if (typeof savable == "function") - savable = savable(card, player, target); + if (typeof savable == "function") savable = savable(card, player, target); return savable; }) >= 1 - target.hp ) return false; - if (target == player || target == get.zhu(player)) - return true; + if (target == player || target == get.zhu(player)) return true; return !player.hasUnknown(); }, }, @@ -2414,12 +1895,7 @@ const skills = { logTarget: "player", cost() { "step 0"; - var str = - "你的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - ",是否发动【终愿】修改判定结果?"; + var str = "你的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + ",是否发动【终愿】修改判定结果?"; if (player.isUnderControl()) { game.swapPlayerAuto(player); } @@ -2445,32 +1921,25 @@ const skills = { table.style.position = "relative"; var listi = ["spade", "heart", "club", "diamond"]; for (var i = 0; i < listi.length; i++) { - var td = ui.create.div( - ".shadowed.reduce_radius.pointerdiv.tdnode" - ); + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); td.link = listi[i]; table.appendChild(td); - td.innerHTML = - "" + get.translation(listi[i]) + ""; - td.addEventListener( - lib.config.touchscreen ? "touchend" : "click", - function () { - if (_status.dragged) return; - if (_status.justdragged) return; - _status.tempNoButton = true; - setTimeout(function () { - _status.tempNoButton = false; - }, 500); - var link = this.link; - var current = - this.parentNode.querySelector(".bluebg"); - if (current) { - current.classList.remove("bluebg"); - } - this.classList.add("bluebg"); - event._result.suit = link; + td.innerHTML = "" + get.translation(listi[i]) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); } - ); + this.classList.add("bluebg"); + event._result.suit = link; + }); } dialog.content.appendChild(table); dialog.addText("点数"); @@ -2480,32 +1949,26 @@ const skills = { table2.style.width = "100%"; table2.style.position = "relative"; for (var i = 1; i < 14; i++) { - var td = ui.create.div( - ".shadowed.reduce_radius.pointerdiv.tdnode" - ); + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); td.link = i; table2.appendChild(td); var num = i; td.innerHTML = "" + get.strNumber(num) + ""; - td.addEventListener( - lib.config.touchscreen ? "touchend" : "click", - function () { - if (_status.dragged) return; - if (_status.justdragged) return; - _status.tempNoButton = true; - setTimeout(function () { - _status.tempNoButton = false; - }, 500); - var link = this.link; - var current = - this.parentNode.querySelector(".bluebg"); - if (current) { - current.classList.remove("bluebg"); - } - this.classList.add("bluebg"); - event._result.number = link; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); } - ); + this.classList.add("bluebg"); + event._result.number = link; + }); } dialog.content.appendChild(table2); dialog.add("  "); @@ -2519,22 +1982,18 @@ const skills = { game.resume(); _status.imchoosing = false; }; - event.control = ui.create.control( - "ok", - "cancel2", - function (link) { - var result = event._result; - if (link == "cancel2") result.bool = false; - else { - if (!result.number || !result.suit) return; - result.bool = true; - } - event.dialog.close(); - event.control.close(); - game.resume(); - _status.imchoosing = false; + event.control = ui.create.control("ok", "cancel2", function (link) { + var result = event._result; + if (link == "cancel2") result.bool = false; + else { + if (!result.number || !result.suit) return; + result.bool = true; } - ); + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }); for (var i = 0; i < event.dialog.buttons.length; i++) { event.dialog.buttons[i].classList.add("selectable"); } @@ -2550,7 +2009,7 @@ const skills = { } else { switchToAuto(); } - ("step 1"); + "step 1"; var map = event.result || result; if (map.bool) { event.result = { @@ -2562,20 +2021,13 @@ const skills = { async content(event, trigger, player) { var map = event.cost_data; player.awakenSkill("misuzu_zhongyuan"); - game.log( - player, - "将判定结果修改为了", - "#g" + get.translation(map.suit + 2) + get.strNumber(map.number) - ); + game.log(player, "将判定结果修改为了", "#g" + get.translation(map.suit + 2) + get.strNumber(map.number)); trigger.fixedResult = { suit: map.suit, color: get.color({ suit: map.suit }), number: map.number, }; - player.popup( - get.translation(map.suit + 2) + get.strNumber(map.number), - "thunder" - ); + player.popup(get.translation(map.suit + 2) + get.strNumber(map.number), "thunder"); event.getParent("arrangeTrigger").finish(); }, }, @@ -2594,15 +2046,11 @@ const skills = { filter(event, player) { var card = event.card; var info = get.info(card); - if (info.type != "trick" || info.allowMultiple == false) - return false; + if (info.type != "trick" || info.allowMultiple == false) return false; if (event.targets && !info.multitarget) { if ( game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current); }) ) { return true; @@ -2613,20 +2061,10 @@ const skills = { async cost(event, trigger, player) { var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; event.result = await player - .chooseTarget( - get.prompt("chihaya_liewu"), - function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2( - _status.event.card, - player, - target - ) - ); - } - ) + .chooseTarget(get.prompt("chihaya_liewu"), function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) .set("prompt2", prompt2) .set("ai", function (target) { var trigger = _status.event.getTrigger(); @@ -2662,16 +2100,10 @@ const skills = { audio: 2, enable: "phaseUse", position: "he", - filter: (event, player) => - player.hasCard( - (card) => lib.skill.chihaya_huairou.filterCard(card, player), - lib.skill.chihaya_huairou.position - ), - filterCard: (card, player) => - get.type(card) == "equip" && player.canRecast(card), + filter: (event, player) => player.hasCard(card => lib.skill.chihaya_huairou.filterCard(card, player), lib.skill.chihaya_huairou.position), + filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), check(card) { - if (!_status.event.player.hasEquipableSlot(get.subtype(card))) - return 5; + if (!_status.event.player.hasEquipableSlot(get.subtype(card))) return 5; return 3 - get.value(card); }, content() { @@ -2694,9 +2126,7 @@ const skills = { mark: true, intro: { content(storage, player) { - return storage - ? "每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。" - : "每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌。"; + return storage ? "每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。" : "每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌。"; }, }, marktext: "☯", @@ -2704,40 +2134,19 @@ const skills = { player.storage.chihaya_youfeng = false; }, hiddenCard(player, name) { - if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) - return false; - if ( - player.hasSkill( - "chihaya_youfeng_" + - (player.storage.chihaya_youfeng || false) - ) - ) - return false; + if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) return false; + if (player.hasSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false))) return false; var type = get.type(name); if (player.storage.chihaya_youfeng) return type == "basic"; return type == "trick"; }, filter(event, player) { - if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) - return false; - if ( - player.hasSkill( - "chihaya_youfeng_" + - (player.storage.chihaya_youfeng || false) - ) - ) - return false; + if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) return false; + if (player.hasSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false))) return false; var type = player.storage.chihaya_youfeng ? "basic" : "trick"; for (var name of lib.inpile) { if (get.type(name) != type) continue; - if ( - event.filterCard( - { name: name, isCard: true }, - player, - event - ) - ) - return true; + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; } return false; }, @@ -2756,17 +2165,10 @@ const skills = { const list = []; for (const name of lib.inpile) { if (get.type(name) != type) continue; - if ( - event.filterCard( - { name: name, isCard: true }, - player, - event - ) - ) { + if (event.filterCard({ name: name, isCard: true }, player, event)) { list.push([type, "", name]); if (name == "sha") { - for (let j of lib.inpile_nature) - list.push([type, "", name, j]); + for (let j of lib.inpile_nature) list.push([type, "", name, j]); } } } @@ -2774,11 +2176,7 @@ const skills = { return dialog; }, filter(button) { - if ( - ui.selected.buttons.length && - typeof button.link == typeof ui.selected.buttons[0].link - ) - return false; + if (ui.selected.buttons.length && typeof button.link == typeof ui.selected.buttons[0].link) return false; return true; }, select() { @@ -2808,13 +2206,7 @@ const skills = { case 1: { if ( game.hasPlayer(function (current) { - return ( - (get.realAttitude || get.attitude)( - player, - current - ) < 0 && - get.distance(player, current) > 1 - ); + return (get.realAttitude || get.attitude)(player, current) < 0 && get.distance(player, current) > 1; }) ) return 0; @@ -2839,28 +2231,12 @@ const skills = { }); return 1; } - if ( - ![ - "chuqibuyi", - "shuiyanqijunx", - "juedou", - "nanman", - "wanjian", - "shunshou", - "zhujinqiyuan", - ].includes(name) - ) - return 0; + if (!["chuqibuyi", "shuiyanqijunx", "juedou", "nanman", "wanjian", "shunshou", "zhujinqiyuan"].includes(name)) return 0; var card = { name: name, isCard: true }; if (["shunshou", "zhujinqiyuan"].includes(card.name)) { if ( !game.hasPlayer(function (current) { - return ( - get.attitude(player, current) != 0 && - get.distance(player, current) <= 1 && - player.canUse(card, current) && - get.effect(current, card, player, player) > 0 - ); + return get.attitude(player, current) != 0 && get.distance(player, current) <= 1 && player.canUse(card, current) && get.effect(current, card, player, player) > 0; }) ) return 0; @@ -2885,11 +2261,7 @@ const skills = { player.logSkill("chihaya_youfeng"); player.gainMaxHp(); delete event.result.skill; - player.addTempSkill( - "chihaya_youfeng_" + - (player.storage.chihaya_youfeng || false), - "roundStart" - ); + player.addTempSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false), "roundStart"); player.changeZhuanhuanji("chihaya_youfeng"); }, }; @@ -2911,37 +2283,20 @@ const skills = { popname: true, precontent() { player.logSkill("chihaya_youfeng"); - player.disableEquip( - lib.skill.chihaya_youfeng_backup.equip - ); + player.disableEquip(lib.skill.chihaya_youfeng_backup.equip); delete event.result.skill; - player.addTempSkill( - "chihaya_youfeng_" + - (player.storage.chihaya_youfeng || false), - "roundStart" - ); + player.addTempSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false), "roundStart"); player.changeZhuanhuanji("chihaya_youfeng"); }, }; }, prompt(links, player) { - if (links.length == 1) - return ( - "增加1点体力上限,视为使用" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) - ); + if (links.length == 1) return "增加1点体力上限,视为使用" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]); if (typeof links[1] == "number") links.reverse(); var equip = "equip" + links[0]; var name = links[1][2]; var nature = links[1][3]; - return ( - "废除自己的" + - get.translation(equip) + - "栏,视为使用" + - (get.translation(nature) || "") + - get.translation(name) - ); + return "废除自己的" + get.translation(equip) + "栏,视为使用" + (get.translation(nature) || "") + get.translation(name); }, }, ai: { @@ -2949,11 +2304,7 @@ const skills = { respondShan: true, skillTagFilter(player, tag, arg) { if (arg == "respond") return false; - if ( - !player.storage.chihaya_youfeng || - player.hasSkill("chihaya_youfeng_true") - ) - return false; + if (!player.storage.chihaya_youfeng || player.hasSkill("chihaya_youfeng_true")) return false; }, order: 1, result: { @@ -2977,15 +2328,11 @@ const skills = { filter(event, player) { var card = event.card; var info = get.info(card); - if (info.type != "trick" || info.allowMultiple == false) - return false; + if (info.type != "trick" || info.allowMultiple == false) return false; if (event.targets && !info.multitarget) { if ( game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current); }) ) { return true; @@ -2997,20 +2344,10 @@ const skills = { async cost(event, trigger, player) { var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; const { result } = await player - .chooseTarget( - get.prompt("rumi_shuwu"), - function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2( - _status.event.card, - player, - target - ) - ); - } - ) + .chooseTarget(get.prompt("rumi_shuwu"), function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) .set("prompt2", prompt2) .set("ai", function (target) { var trigger = _status.event.getTrigger(); @@ -3034,20 +2371,13 @@ const skills = { if (player.hp <= 3) return true; if ( player.getHistory("useCard", function (evt) { - return ( - evt.card.name == "sha" && - evt.addCount !== false && - evt.getParent("phaseUse") == event - ); + return evt.card.name == "sha" && evt.addCount !== false && evt.getParent("phaseUse") == event; }).length <= 1 ) return true; if ( player.getHistory("sourceDamage", function (evt) { - return ( - get.type(evt.card, false) == "trick" && - evt.getParent("phaseUse") == event - ); + return get.type(evt.card, false) == "trick" && evt.getParent("phaseUse") == event; }).length == 0 ) return true; @@ -3058,20 +2388,13 @@ const skills = { if (player.hp <= 3) num++; if ( player.getHistory("useCard", function (evt) { - return ( - evt.card.name == "sha" && - evt.addCount !== false && - evt.getParent("phaseUse") == trigger - ); + return evt.card.name == "sha" && evt.addCount !== false && evt.getParent("phaseUse") == trigger; }).length <= 1 ) num++; if ( player.getHistory("sourceDamage", function (evt) { - return ( - get.type(evt.card, false) == "trick" && - evt.getParent("phaseUse") == trigger - ); + return get.type(evt.card, false) == "trick" && evt.getParent("phaseUse") == trigger; }).length == 0 ) num++; @@ -3111,10 +2434,7 @@ const skills = { if (event.targets && !info.multitarget) { if ( game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current); }) ) { return true; @@ -3133,20 +2453,10 @@ const skills = { } var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; const { result: result2 } = await player - .chooseTarget( - get.prompt("sakuya_junbu"), - function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2( - _status.event.card, - player, - target - ) - ); - } - ) + .chooseTarget(get.prompt("sakuya_junbu"), function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) .set("prompt2", prompt2) .set("ai", function (target) { var trigger = _status.event.getTrigger(); @@ -3177,10 +2487,7 @@ const skills = { forced: true, sub: true, filter(event, player) { - return ( - !player.hasEnabledSlot() && - event.getParent().type == "card" - ); + return !player.hasEnabledSlot() && event.getParent().type == "card"; }, logTarget: "player", content() { @@ -3195,21 +2502,11 @@ const skills = { trigger: { global: "phaseUseEnd" }, noHidden: true, filter(event, player) { - return ( - player != event.player && - player.hasSkill("hiroto_huyu") && - !player.hasSkill("hiroto_zonglve") && - event.player.countCards("h") > 0 - ); + return player != event.player && player.hasSkill("hiroto_huyu") && !player.hasSkill("hiroto_zonglve") && event.player.countCards("h") > 0; }, async cost(event, trigger, player) { event.result = await trigger.player - .chooseCard( - 2, - "h", - "是否对" + get.translation(player) + "发动【虎驭】?", - "将两张手牌交给该角色,然后令其获得〖纵略〗并于下回合获得该角色得到的所有牌" - ) + .chooseCard(2, "h", "是否对" + get.translation(player) + "发动【虎驭】?", "将两张手牌交给该角色,然后令其获得〖纵略〗并于下回合获得该角色得到的所有牌") .set( "goon", (function () { @@ -3252,8 +2549,7 @@ const skills = { cards = cards.filter(function (card) { return he.includes(card); }); - if (cards.length) - target.gain(cards, player, "giveAuto", "bySelf"); + if (cards.length) target.gain(cards, player, "giveAuto", "bySelf"); } }, mark: "character", @@ -3264,8 +2560,7 @@ const skills = { trigger: { player: "gainBegin" }, silent: true, filter(event, player) { - if (player == _status.currentPhase) - event.gaintag.add("hiroto_huyu2"); + if (player == _status.currentPhase) event.gaintag.add("hiroto_huyu2"); return false; }, }, @@ -3292,13 +2587,13 @@ const skills = { content() { "step 0"; player.choosePlayerCard(true, target, "h"); - ("step 1"); + "step 1"; event.card = result.cards[0]; player.$compare(cards[0], target, event.card); game.log(player, "展示了", cards[0]); game.log(target, "展示了", event.card); game.delay(3.5); - ("step 2"); + "step 2"; game.broadcastAll(ui.clear); if (get.color(cards[0], player) == get.color(card, target)) { target.damage("nocard"); @@ -3348,11 +2643,7 @@ const skills = { for (var i = 1; i < all; i++) { var array = []; for (var j = 0; j < l; j++) { - if ( - Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > - 0 - ) - array.push(cards[j]); + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) array.push(cards[j]); } var num = 0; for (var k of array) { @@ -3388,10 +2679,7 @@ const skills = { }, check(card) { var evt = _status.event; - if (!evt.shizuku_sizhi_choice) - evt.shizuku_sizhi_choice = lib.skill.shizuku_sizhi.getResult( - evt.player.getCards("he") - ); + if (!evt.shizuku_sizhi_choice) evt.shizuku_sizhi_choice = lib.skill.shizuku_sizhi.getResult(evt.player.getCards("he")); if (!evt.shizuku_sizhi_choice.includes(card)) return 0; return 1; }, @@ -3413,49 +2701,29 @@ const skills = { targetInRange(card) { if (!card.cards || !card.cards.length) return; for (var i of card.cards) { - if ( - !i.hasGaintag("shizuku_sizhi2") || - get.color(i) != "black" - ) - return; + if (!i.hasGaintag("shizuku_sizhi2") || get.color(i) != "black") return; } return true; }, cardUsable(card) { if (!card.cards || !card.cards.length) return; for (var i of card.cards) { - if ( - !i.hasGaintag("shizuku_sizhi2") || - get.color(i) != "black" - ) - return; + if (!i.hasGaintag("shizuku_sizhi2") || get.color(i) != "black") return; } return Infinity; }, ignoredHandcard(card, player) { - if ( - card.hasGaintag("shizuku_sizhi2") && - get.color(card) == "red" - ) { + if (card.hasGaintag("shizuku_sizhi2") && get.color(card) == "red") { return true; } }, cardDiscardable(card, player, name) { - if ( - name == "phaseDiscard" && - card.hasGaintag("shizuku_sizhi2") && - get.color(card) == "red" - ) { + if (name == "phaseDiscard" && card.hasGaintag("shizuku_sizhi2") && get.color(card) == "red") { return false; } }, aiOrder(player, card, num) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("shizuku_sizhi2") && - get.color(card) == "black" - ) - return num - 0.1; + if (get.itemtype(card) == "card" && card.hasGaintag("shizuku_sizhi2") && get.color(card) == "black") return num - 0.1; }, }, }, @@ -3465,12 +2733,10 @@ const skills = { content() { "step 0"; player.judge(); - ("step 1"); + "step 1"; var num = result.number; var next = player.chooseToDiscard( - "是否弃置任意张点数之和为" + - get.cnNumber(num) + - "的牌并回复1点体力?", + "是否弃置任意张点数之和为" + get.cnNumber(num) + "的牌并回复1点体力?", function (card) { var num = 0; for (var i = 0; i < ui.selected.cards.length; i++) { @@ -3500,12 +2766,7 @@ const skills = { for (var i = 1; i < all; i++) { var array = []; for (var j = 0; j < l; j++) { - if ( - Math.floor( - (i % Math.pow(2, j + 1)) / Math.pow(2, j) - ) > 0 - ) - array.push(cards[j]); + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) array.push(cards[j]); } var numx = 0; for (var k of array) { @@ -3526,7 +2787,7 @@ const skills = { if (!_status.event.cardResult.includes(card)) return 0; return 6 - get.value(card); }); - ("step 2"); + "step 2"; if (result.bool) player.recover(); }, }, @@ -3549,11 +2810,7 @@ const skills = { var cards = []; while (cards.length < 4) { var card = get.cardPile2(function (card) { - return ( - !cards.includes(card) && - !names.includes(card.name) && - get.type(card) == "basic" - ); + return !cards.includes(card) && !names.includes(card.name) && get.type(card) == "basic"; }); if (card) { cards.push(card); @@ -3575,9 +2832,7 @@ const skills = { return event.name != "phase" || game.phaseNumber == 0; }, content() { - player - .addToExpansion(get.cards(game.countGroup()), "draw") - .gaintag.add("shiroha_yuzhao"); + player.addToExpansion(get.cards(game.countGroup()), "draw").gaintag.add("shiroha_yuzhao"); }, marktext: "兆", intro: { @@ -3608,24 +2863,16 @@ const skills = { trigger: { global: "phaseBegin" }, forced: true, filter(event, player) { - return ( - player.getExpansions("shiroha_yuzhao").length > 0 && - get.distance(event.player, player) <= 1 - ); + return player.getExpansions("shiroha_yuzhao").length > 0 && get.distance(event.player, player) <= 1; }, content() { "step 0"; event.num = game.countGroup(); - player - .addToExpansion(get.cards(event.num)) - .gaintag.add("shiroha_yuzhao"); - ("step 1"); + player.addToExpansion(get.cards(event.num)).gaintag.add("shiroha_yuzhao"); + "step 1"; var next = player.chooseToMove(), num = game.countGroup(); - next.set( - "prompt", - "预兆:将" + get.cnNumber(num) + "张牌置于牌堆顶" - ); + next.set("prompt", "预兆:将" + get.cnNumber(num) + "张牌置于牌堆顶"); next.set("num", num); next.set("forced", true); next.set("filterOk", function (moved) { @@ -3635,19 +2882,13 @@ const skills = { if (to != 1) return true; return moved[1].length < _status.event.num; }); - next.set("list", [ - [ - get.translation(player) + "(你)的“兆”", - player.getExpansions("shiroha_yuzhao"), - ], - ["牌堆顶"], - ]); + next.set("list", [[get.translation(player) + "(你)的“兆”", player.getExpansions("shiroha_yuzhao")], ["牌堆顶"]]); next.set("processAI", function (list) { var cards = list[0][1], cards2 = cards.randomRemove(_status.event.num); return [cards, cards2]; }); - ("step 2"); + "step 2"; if (result && result.bool) { var cards = result.moved[1]; player.lose(cards, ui.cardPile, "insert"); @@ -3662,11 +2903,7 @@ const skills = { source: "damageBegin1", }, filter(event, player, name) { - if ( - !player.storage.shiroha_jiezhao && - player.hasSkill("shiroha_guying_temp") - ) - return false; + if (!player.storage.shiroha_jiezhao && player.hasSkill("shiroha_guying_temp")) return false; if (name == "damageBegin3") return true; return player != event.player; }, @@ -3677,22 +2914,11 @@ const skills = { cost() { "step 0"; var num = event.triggername == "damageBegin3" ? -1 : 1; - if ( - player.storage.shiroha_jiezhao || - !player.hasSkill("shiroha_guying") - ) { - if (num > 0) - player.chooseBool( - get.prompt("shiroha_guying", trigger.player), - "进行判定。若判定结果为黑色,则即将对其造成的伤害+1" - ); - else - player.chooseBool( - get.prompt("shiroha_guying"), - "进行判定。若判定结果为红色,则即将受到的伤害-1" - ); + if (player.storage.shiroha_jiezhao || !player.hasSkill("shiroha_guying")) { + if (num > 0) player.chooseBool(get.prompt("shiroha_guying", trigger.player), "进行判定。若判定结果为黑色,则即将对其造成的伤害+1"); + else player.chooseBool(get.prompt("shiroha_guying"), "进行判定。若判定结果为红色,则即将受到的伤害-1"); } else event._result = { bool: true }; - ("step 1"); + "step 1"; event.result = result; }, content() { @@ -3701,16 +2927,11 @@ const skills = { event.num = num; player.addTempSkill("shiroha_guying_temp"); player.judge(function (card) { - return get.color(card) == - (_status.event.getParent("shiroha_guying").num > 0 - ? "black" - : "red") - ? 2 - : 0; + return get.color(card) == (_status.event.getParent("shiroha_guying").num > 0 ? "black" : "red") ? 2 : 0; }).judge2 = function (result) { return result.bool ? true : false; }; - ("step 1"); + "step 1"; if (result.bool) trigger.num += num; }, }, @@ -3718,56 +2939,27 @@ const skills = { shiroha_jiezhao: { trigger: { global: "judge" }, filter(event, player) { - return ( - player.getExpansions("shiroha_yuzhao").length && - event.player.isIn() - ); + return player.getExpansions("shiroha_yuzhao").length && event.player.isIn(); }, async cost(event, trigger, player) { const list = player.getExpansions("shiroha_yuzhao"); const { result } = await player - .chooseButton( - [ - get.translation(trigger.player) + - "的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - "," + - get.prompt("shiroha_jiezhao"), - list, - "hidden", - ], - function (button) { - var card = button.link; - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = - trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - return result * attitude; - } - ) + .chooseButton([get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("shiroha_jiezhao"), list, "hidden"], function (button) { + var card = button.link; + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + return result * attitude; + }) .set("judging", trigger.player.judging[0]) .set("filterButton", function (button) { var player = _status.event.player; var card = button.link; - var mod2 = game.checkMod( - card, - player, - "unchanged", - "cardEnabled2", - player - ); + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); if (mod2 != "unchanged") return mod2; - var mod = game.checkMod( - card, - player, - "unchanged", - "cardRespondable", - player - ); + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); if (mod != "unchanged") return mod; return true; }); @@ -3779,26 +2971,15 @@ const skills = { popup: false, async content(event, trigger, player) { const cards = event.cards; - await player.respond( - cards, - "shiroha_jiezhao", - "highlight", - "noOrdering" - ); + await player.respond(cards, "shiroha_jiezhao", "highlight", "noOrdering"); if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove( - "thrownhighlight" - ); + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); game.broadcast(function (card) { if (card.clone) { card.clone.classList.remove("thrownhighlight"); } }, trigger.player.judging[0]); - game.addVideo( - "deletenode", - player, - get.cardsInfo([trigger.player.judging[0].clone]) - ); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); } const oldJudgeCard = trigger.player.judging[0]; trigger.player.judging[0] = cards[0]; @@ -3810,17 +2991,9 @@ const skills = { player.storage.shiroha_jiezhao = true; player.gainMaxHp(); player.recover(); - var list = [ - "umi_chaofan", - "ao_xishi", - "tsumugi_mugyu", - "kamome_jieban", - ]; + var list = ["umi_chaofan", "ao_xishi", "tsumugi_mugyu", "kamome_jieban"]; var skill = list.randomGet(); - player.flashAvatar( - "shiroha_jiezhao", - "key_" + skill.split("_")[0] - ); + player.flashAvatar("shiroha_jiezhao", "key_" + skill.split("_")[0]); await player.addSkills(skill); } }, @@ -3831,12 +3004,7 @@ const skills = { }, combo: "shiroha_yuzhao", }, - derivation: [ - "umi_chaofan", - "ao_xishi", - "tsumugi_mugyu", - "kamome_jieban", - ], + derivation: ["umi_chaofan", "ao_xishi", "tsumugi_mugyu", "kamome_jieban"], }, //高城丈士朗 jojiro_shensu: { @@ -3848,33 +3016,21 @@ const skills = { async cost(event, trigger, player) { const check = player.countCards("h") > 2; event.result = await player - .chooseTarget( - get.prompt("jojiro_shensu"), - "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", - function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - } - ) + .chooseTarget(get.prompt("jojiro_shensu"), "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }) .set("check", check) .set("ai", function (target) { if (!_status.event.check) return 0; - return get.effect( - target, - { name: "sha" }, - _status.event.player - ); + return get.effect(target, { name: "sha" }, _status.event.player); }) .forResult(); }, async content(event, trigger, player) { await trigger.cancel(); player.skip("phaseDraw"); - await player.useCard( - { name: "sha", isCard: true }, - event.targets[0], - false - ); + await player.useCard({ name: "sha", isCard: true }, event.targets[0], false); }, }, jojiro_shensu2: { @@ -3887,13 +3043,9 @@ const skills = { event.result = await player .chooseCardTarget({ prompt: get.prompt("jojiro_shensu"), - prompt2: - "弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", + prompt2: "弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", filterCard(card, player) { - return ( - get.type(card) == "equip" && - lib.filter.cardDiscardable(card, player) - ); + return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); }, position: "he", filterTarget(card, player, target) { @@ -3906,11 +3058,7 @@ const skills = { }, ai2(target) { if (_status.event.check) return 0; - return get.effect( - target, - { name: "sha" }, - _status.event.player - ); + return get.effect(target, { name: "sha" }, _status.event.player); }, check: check, }) @@ -3919,48 +3067,29 @@ const skills = { async content(event, trigger, player) { await trigger.cancel(); await player.discard(event.cards[0]); - await player.useCard( - { name: "sha", isCard: true }, - event.targets[0] - ); + await player.useCard({ name: "sha", isCard: true }, event.targets[0]); }, }, jojiro_shensu4: { trigger: { player: "phaseDiscardBefore" }, async cost(event, trigger, player) { - var check = - player.needsToDiscard() || - player.isTurnedOver() || - (player.hasSkill("shebian") && player.canMoveCard(true, true)); + var check = player.needsToDiscard() || player.isTurnedOver() || (player.hasSkill("shebian") && player.canMoveCard(true, true)); event.result = await player - .chooseTarget( - get.prompt("jojiro_shensu"), - "跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】", - function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - } - ) + .chooseTarget(get.prompt("jojiro_shensu"), "跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】", function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }) .set("check", check) .set("ai", function (target) { if (!_status.event.check) return 0; - return get.effect( - target, - { name: "sha" }, - _status.event.player, - _status.event.player - ); + return get.effect(target, { name: "sha" }, _status.event.player, _status.event.player); }) .forResult(); }, async content(event, trigger, player) { await trigger.cancel(); await player.turnOver(); - await player.useCard( - { name: "sha", isCard: true }, - event.targets[0], - false - ); + await player.useCard({ name: "sha", isCard: true }, event.targets[0], false); }, }, jojiro_shunying: { @@ -3974,11 +3103,8 @@ const skills = { "step 0"; var num = player.getHistory("skipped").length; event.num = num; - player.chooseToMoveChess( - num, - "瞬影:移动至多" + get.cnNumber(num) + "格或失去1点体力" - ); - ("step 1"); + player.chooseToMoveChess(num, "瞬影:移动至多" + get.cnNumber(num) + "格或失去1点体力"); + "step 1"; if (!result.bool) player.loseHp(); else player.draw(num); }, @@ -3999,14 +3125,7 @@ const skills = { for (var i of list) { if (!player.hasMark("kotori_yumo_" + i)) { player.addMark("kotori_yumo_" + i, 1, false); - game.log( - player, - "获得了一个", - lib.translate["kotori_yumo_" + i].replace( - /魔物/g, - "【魔物】" - ) - ); + game.log(player, "获得了一个", lib.translate["kotori_yumo_" + i].replace(/魔物/g, "【魔物】")); } } }, @@ -4025,14 +3144,7 @@ const skills = { var group = trigger.player.group; player.popup("驭魔", get.groupnature(group)); player.addMark("kotori_yumo_" + group, 1, false); - game.log( - player, - "获得了一个", - lib.translate["kotori_yumo_" + group].replace( - /魔物/g, - "【魔物】" - ) - ); + game.log(player, "获得了一个", lib.translate["kotori_yumo_" + group].replace(/魔物/g, "【魔物】")); }, }, kotori_yumo_gain: { @@ -4048,37 +3160,24 @@ const skills = { const list = ["wei", "shu", "wu", "qun", "key", "jin"]; const list2 = []; for (const i of list) { - if (player.hasMark("kotori_yumo_" + i)) - list2.push("kotori_skill_" + i); + if (player.hasMark("kotori_yumo_" + i)) list2.push("kotori_skill_" + i); } list2.push("cancel2"); const { control } = await player .chooseControl(list2) - .set( - "prompt", - "###是否发动【驭魔】?###弃置对应的标记并获得下列技能中的一个,或点取消,不获得技能" - ) + .set("prompt", "###是否发动【驭魔】?###弃置对应的标记并获得下列技能中的一个,或点取消,不获得技能") .set( "choice", (function () { if ( list2.includes("kotori_skill_shu") && player.countCards("h", function (card) { - return ( - get.name(card, player) == "sha" && - player.getUseValue(card) > 0 - ); + return get.name(card, player) == "sha" && player.getUseValue(card) > 0; }) > 1 ) return "kotori_skill_shu"; - if (list2.includes("kotori_skill_key") && player.hp > 1) - return "kotori_skill_key"; - if ( - list2.includes("kotori_skill_qun") && - player.isDamaged() && - player.needsToDiscard() > 1 - ) - return "kotori_skill_qun"; + if (list2.includes("kotori_skill_key") && player.hp > 1) return "kotori_skill_key"; + if (list2.includes("kotori_skill_qun") && player.isDamaged() && player.needsToDiscard() > 1) return "kotori_skill_qun"; return "cancel2"; })() ) @@ -4096,20 +3195,9 @@ const skills = { if (result.control != "cancel2") { var name = "kotori_yumo_" + result.control.slice(13); player.removeMark(name, 1, false); - game.log( - player, - "移去了一个", - lib.translate[name].replace(/魔物/g, "【魔物】") - ); + game.log(player, "移去了一个", lib.translate[name].replace(/魔物/g, "【魔物】")); player.addTempSkills(result.control); - game.log( - player, - "获得了技能", - lib.translate[name].replace( - /魔物/g, - "【" + get.translation(result.control) + "】" - ) - ); + game.log(player, "获得了技能", lib.translate[name].replace(/魔物/g, "【" + get.translation(result.control) + "】")); } }, }, @@ -4131,10 +3219,7 @@ const skills = { return 6 - get.value(card); }, ai2(target) { - return ( - (1 / (1 + target.countCards("he"))) * - -get.attitude(_status.event.player, target) - ); + return (1 / (1 + target.countCards("he"))) * -get.attitude(_status.event.player, target); }, }) .forResult(); @@ -4142,11 +3227,8 @@ const skills = { content() { "step 0"; player.discard(cards); - targets[0].chooseToDiscard( - "弃置一张牌,或令" + get.translation(player) + "摸一张牌", - "he" - ).ai = lib.skill.zhiheng.check; - ("step 1"); + targets[0].chooseToDiscard("弃置一张牌,或令" + get.translation(player) + "摸一张牌", "he").ai = lib.skill.zhiheng.check; + "step 1"; if (!result.bool) player.draw(); }, }, @@ -4161,11 +3243,7 @@ const skills = { filter(event, player) { return ( player.getHistory("useCard", function (evt) { - return ( - evt.card && - evt.card.name == "sha" && - evt.getParent("phaseUse") == event - ); + return evt.card && evt.card.name == "sha" && evt.getParent("phaseUse") == event; }).length > 1 ); }, @@ -4187,10 +3265,7 @@ const skills = { trigger: { player: "phaseDiscardBegin" }, forced: true, filter(event, player) { - return ( - player.getDamagedHp() > 1 || - player.countCards("h") - player.getHp() > 1 - ); + return player.getDamagedHp() > 1 || player.countCards("h") - player.getHp() > 1; }, content() { var num = 0; @@ -4206,9 +3281,9 @@ const skills = { content() { "step 0"; player.draw(); - ("step 1"); + "step 1"; player.changeHujia(1); - ("step 2"); + "step 2"; var evt = event.getParent("phase"); if (evt && evt.after) { var next = player.loseHp(); @@ -4232,11 +3307,7 @@ const skills = { return ( hs.length > 0 && player.getHistory("gain", function (evt) { - if ( - evt.getParent().name != "draw" || - evt.getParent("phaseDraw") != event - ) - return false; + if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != event) return false; for (var i of evt.cards) { if (hs.includes(i)) return true; } @@ -4249,11 +3320,7 @@ const skills = { cards = [], suits = []; player.getHistory("gain", function (evt) { - if ( - evt.getParent().name != "draw" || - evt.getParent("phaseDraw") != event - ) - return false; + if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != event) return false; for (var i of evt.cards) { if (hs.includes(i)) { cards.add(i); @@ -4268,11 +3335,7 @@ const skills = { cards = [], suits = []; player.getHistory("gain", function (evt) { - if ( - evt.getParent().name != "draw" || - evt.getParent("phaseDraw") != trigger - ) - return false; + if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != trigger) return false; for (var i of evt.cards) { if (hs.includes(i)) { cards.add(i); @@ -4341,42 +3404,22 @@ const skills = { var bool = false; var list = ["wei", "shu", "wu", "qun", "key", "jin"]; for (var i of list) { - if ( - player.hasMark("kotori_yumo_" + i) && - !player - .getStorage("kotori_huazhan2") - .includes("kotori_yumo_" + i) - ) { + if (player.hasMark("kotori_yumo_" + i) && !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i)) { bool = true; break; } } - return ( - bool && - event.filterCard( - { name: "kaihua", isCard: true }, - player, - event - ) - ); + return bool && event.filterCard({ name: "kaihua", isCard: true }, player, event); }, chooseButton: { dialog(event, player) { - return ui.create.dialog( - "###花绽###" + lib.translate.kotori_huazhan_info - ); + return ui.create.dialog("###花绽###" + lib.translate.kotori_huazhan_info); }, chooseControl(event, player) { var list = ["wei", "shu", "wu", "qun", "key", "jin"]; var list2 = []; for (var i of list) { - if ( - player.hasMark("kotori_yumo_" + i) && - !player - .getStorage("kotori_huazhan2") - .includes("kotori_yumo_" + i) - ) - list2.push("kotori_yumo_" + i); + if (player.hasMark("kotori_yumo_" + i) && !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i)) list2.push("kotori_yumo_" + i); } list2.push("cancel2"); return list2; @@ -4386,13 +3429,7 @@ const skills = { var list = ["wei", "shu", "wu", "qun", "key", "jin"]; var list2 = []; for (var i of list) { - if ( - player.hasMark("kotori_yumo_" + i) && - !player - .getStorage("kotori_huazhan2") - .includes("kotori_yumo_" + i) - ) - list2.push("kotori_yumo_" + i); + if (player.hasMark("kotori_yumo_" + i) && !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i)) list2.push("kotori_yumo_" + i); } if (list2.includes("kotori_yumo_wei")) return "kotori_yumo_wei"; if (list2.includes("kotori_yumo_wu")) return "kotori_yumo_wu"; @@ -4418,22 +3455,13 @@ const skills = { precontent() { delete event.result.skill; var name = lib.skill.kotori_huazhan_backup.markname; - if (!player.storage.kotori_huazhan2) - player.storage.kotori_huazhan2 = []; + if (!player.storage.kotori_huazhan2) player.storage.kotori_huazhan2 = []; player.storage.kotori_huazhan2.push(name); player.addTempSkill("kotori_huazhan2"); player.popup("花绽", get.groupnature(name.slice(12))); - game.log( - player, - "发动了技能", - lib.translate[name].replace(/魔物/g, "【花绽】") - ); + game.log(player, "发动了技能", lib.translate[name].replace(/魔物/g, "【花绽】")); player.removeMark(name, 1, false); - game.log( - player, - "移去了一个", - lib.translate[name].replace(/魔物/g, "【魔物】") - ); + game.log(player, "移去了一个", lib.translate[name].replace(/魔物/g, "【魔物】")); }, }; }, @@ -4444,8 +3472,7 @@ const skills = { player(player) { if ( player.countCards("he", function (card) { - if (get.type(card, player) == "equip") - return get.value(card) < 6; + if (get.type(card, player) == "equip") return get.value(card) < 6; return get.value(card) < 5; }) < 2 ) @@ -4453,7 +3480,7 @@ const skills = { return player.getUseValue({ name: "kaihua" }); }, }, - combo: "kotori_yumo" + combo: "kotori_yumo", }, }, kotori_huazhan2: { onremove: true, charlotte: true }, @@ -4461,19 +3488,10 @@ const skills = { ryoichi_baoyi: { trigger: { player: "loseAfter", - global: [ - "gainAfter", - "equipAfter", - "addJudgeAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], + global: ["gainAfter", "equipAfter", "addJudgeAfter", "loseAsyncAfter", "addToExpansionAfter"], }, filterTarget(card, player, target) { - return ( - target != player && - (target.hasSex("female") || target.countCards("hej") > 0) - ); + return target != player && (target.hasSex("female") || target.countCards("hej") > 0); }, filter(event, player) { var evt = event.getl(player); @@ -4491,43 +3509,29 @@ const skills = { "step 0"; event.count = trigger.getl(player).es.length; player.draw(event.count); - ("step 1"); + "step 1"; event.count--; if ( game.hasPlayer(function (target) { - return lib.skill.ryoichi_baoyi.filterTarget( - null, - player, - target - ); + return lib.skill.ryoichi_baoyi.filterTarget(null, player, target); }) ) { - player - .chooseTarget( - true, - lib.skill.ryoichi_baoyi.filterTarget, - "请选择【爆衣】的目标" - ) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); + player.chooseTarget(true, lib.skill.ryoichi_baoyi.filterTarget, "请选择【爆衣】的目标").set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); } else event.finish(); - ("step 2"); + "step 2"; if (result.bool && result.targets && result.targets.length) { var target = result.targets[0]; player.line(target, "green"); if (target.hasSex("female")) target.loseHp(); else player.discardPlayerCard(target, 2, "hej", true); } else event.finish(); - ("step 3"); + "step 3"; if ( event.count && game.hasPlayer(function (target) { - return lib.skill.ryoichi_baoyi.filterTarget( - null, - player, - target - ); + return lib.skill.ryoichi_baoyi.filterTarget(null, player, target); }) ) event.goto(1); @@ -4536,8 +3540,7 @@ const skills = { ryoichi_tuipi: { mod: { targetEnabled(card) { - if (card.name == "shunshou" || card.name == "guohe") - return false; + if (card.name == "shunshou" || card.name == "guohe") return false; }, }, trigger: { player: "phaseDiscardBegin" }, @@ -4547,13 +3550,7 @@ const skills = { }, phaseDiscardContent() { "step 0"; - event.num = Math.max( - 0, - player.countCards( - "he", - (card) => !player.canIgnoreHandcard(card) - ) - player.getHandcardLimit() - ); + event.num = Math.max(0, player.countCards("he", card => !player.canIgnoreHandcard(card)) - player.getHandcardLimit()); if (event.num <= 0) event.finish(); else { if (lib.config.show_phase_prompt) { @@ -4561,9 +3558,9 @@ const skills = { } } event.trigger("phaseDiscard"); - ("step 1"); + "step 1"; player.chooseToDiscard(num, true, "he"); - ("step 2"); + "step 2"; event.cards = result.cards; }, }, @@ -4582,26 +3579,19 @@ const skills = { }, trigger: { global: "phaseBeginStart" }, filter(event, player) { - return ( - player != event.player && - !event.player._trueMe && - !player.getStorage("yuu_lveduo").includes(event.player) && - !player.isTurnedOver() && - !player.hasSkill("yuu_lveduo4") - ); + return player != event.player && !event.player._trueMe && !player.getStorage("yuu_lveduo").includes(event.player) && !player.isTurnedOver() && !player.hasSkill("yuu_lveduo4"); }, charlotte: true, check(event, player) { if (get.attitude(player, event.player) > 0) return false; - if (event.player.hasJudge("lebu") || !event.player.needsToDiscard()) - return false; + if (event.player.hasJudge("lebu") || !event.player.needsToDiscard()) return false; return true; }, logTarget: "player", content() { "step 0"; player.turnOver(); - ("step 1"); + "step 1"; if (player.isTurnedOver()) { player.addTempSkill("yuu_lveduo4", "roundStart"); if (!player.storage.yuu_lveduo) player.storage.yuu_lveduo = []; @@ -4641,17 +3631,14 @@ const skills = { } delete target._trueMe; target.removeSkill("yuu_lveduo3"); - var skills = target - .getStockSkills(true, true) - .filter(function (skill) { - var info = get.info(skill); - return info && info.charlotte == true; - }); + var skills = target.getStockSkills(true, true).filter(function (skill) { + var info = get.info(skill); + return info && info.charlotte == true; + }); if (skills.length) { target.removeSkills(skills); player.addSkills(skills); - lib.translate.yuu_lveduo_info = - lib.translate.yuu_lveduo_full_info; + lib.translate.yuu_lveduo_info = lib.translate.yuu_lveduo_full_info; } if (target.name == "key_yusa") { delete target.storage.dualside; @@ -4685,8 +3672,7 @@ const skills = { player.removeSkill("yuu_lveduo3"); }, onremove(player) { - if (player._trueMe && player._trueMe.isTurnedOver()) - player._trueMe.turnOver(); + if (player._trueMe && player._trueMe.isTurnedOver()) player._trueMe.turnOver(); }, }, yuu_lveduo4: { charlotte: true }, @@ -4698,7 +3684,7 @@ const skills = { "step 0"; var num = game.roundNumber; if (num && typeof num == "number") player.draw(Math.min(3, num)); - ("step 1"); + "step 1"; trigger.phaseList.splice(trigger.num, 0, "phaseUse|godan_yuanyi"); }, }, @@ -4728,19 +3714,11 @@ const skills = { skillAnimation: true, animationColor: "water", filter(event, player) { - return ( - player != event.player && !player.storage.abyusa_jueqing_rewrite - ); + return player != event.player && !player.storage.abyusa_jueqing_rewrite; }, prompt2(event, player) { var num = get.cnNumber(2 * event.num, true); - return ( - "令即将对其造成的伤害翻倍至" + - num + - "点,并令自己失去" + - get.cnNumber(event.num) + - "点体力" - ); + return "令即将对其造成的伤害翻倍至" + num + "点,并令自己失去" + get.cnNumber(event.num) + "点体力"; }, check(event, player) { return ( @@ -4842,8 +3820,7 @@ const skills = { filterTarget(card, player, target) { if (player == target) return false; var card = ui.selected.cards[0]; - if (get.type(card, false) == "delay") - return target.canAddJudge({ name: card.name }); + if (get.type(card, false) == "delay") return target.canAddJudge({ name: card.name }); return target.canEquip(card); }, discard: false, @@ -4854,22 +3831,17 @@ const skills = { var card = cards[0]; if (get.type(card, false) == "equip") target.equip(card); else target.addJudge(card); - ("step 1"); + "step 1"; var list = []; for (var i of lib.inpile) { var type = get.type(i); - if (type == "basic" || type == "trick") - list.push([type, "", i]); + if (type == "basic" || type == "trick") list.push([type, "", i]); if (i == "sha") { - for (var j of lib.inpile_nature) - list.push([type, "", i, j]); + for (var j of lib.inpile_nature) list.push([type, "", i, j]); } } player - .chooseButton([ - "是否视为使用一张基本牌或普通锦囊牌?", - [list, "vcard"], - ]) + .chooseButton(["是否视为使用一张基本牌或普通锦囊牌?", [list, "vcard"]]) .set("filterButton", function (button) { return player.hasUseTarget({ name: button.link[2], @@ -4884,7 +3856,7 @@ const skills = { isCard: true, }); }); - ("step 2"); + "step 2"; if (result.bool) { player.chooseUseTarget(true, { name: result.links[0][2], @@ -4929,18 +3901,12 @@ const skills = { async cost(event, trigger, player) { const list = []; trigger.player.getHistory("useCard", function (evt) { - if ( - !evt.isPhaseUsing() || - !["basic", "trick"].includes(get.type(evt.card)) - ) - return; - if (evt.card.name == "sha" && evt.card.nature) - list.add("sha:" + evt.card.nature); + if (!evt.isPhaseUsing() || !["basic", "trick"].includes(get.type(evt.card))) return; + if (evt.card.name == "sha" && evt.card.nature) list.add("sha:" + evt.card.nature); else list.add(evt.card.name); }); for (var i = 0; i < list.length; i++) { - if (list[i].indexOf("sha:") == 0) - list[i] = ["基本", "", "sha", list[i].slice(4)]; + if (list[i].indexOf("sha:") == 0) list[i] = ["基本", "", "sha", list[i].slice(4)]; else list[i] = [get.type(list[i]), "", list[i]]; } const { result } = await player @@ -4992,18 +3958,15 @@ const skills = { forced: true, content() { "step 0"; - if (!player.countDiscardableCards(player, "ej")) - event._result = { bool: false }; + if (!player.countDiscardableCards(player, "ej")) event._result = { bool: false }; else - player - .discardPlayerCard(player, "ej") - .set("ai", function (button) { - var card = button.link; - var player = _status.event.player; - if (get.position(card) == "j") return 7 + Math.random(); - return 4 + player.needsToDiscard() - get.value(card); - }); - ("step 1"); + player.discardPlayerCard(player, "ej").set("ai", function (button) { + var card = button.link; + var player = _status.event.player; + if (get.position(card) == "j") return 7 + Math.random(); + return 4 + player.needsToDiscard() - get.value(card); + }); + "step 1"; if (!result.bool) player.skip("phaseUse"); }, }, @@ -5023,11 +3986,7 @@ const skills = { }, mod: { canBeDiscarded(card) { - if ( - get.position(card) == "e" && - ["equip1", "equip5"].includes(get.subtype(card)) - ) - return false; + if (get.position(card) == "e" && ["equip1", "equip5"].includes(get.subtype(card))) return false; }, }, }, @@ -5037,9 +3996,7 @@ const skills = { miki_zhiluo: { trigger: { global: "phaseEnd" }, filter(event, player) { - return ( - !event.player.countCards("e") && player.inRange(event.player) - ); + return !event.player.countCards("e") && player.inRange(event.player); }, locked: true, async cost(event, trigger, player) { @@ -5048,21 +4005,9 @@ const skills = { const { index } = await player .chooseControl() .set("prompt", "制裸:请选择一项") - .set("choiceList", [ - "摸一张牌", - "视为对" + - get.translation(trigger.player) + - "使用一张【杀】", - ]) + .set("choiceList", ["摸一张牌", "视为对" + get.translation(trigger.player) + "使用一张【杀】"]) .set("ai", function () { - if ( - get.effect( - _status.event.getTrigger().player, - { name: "sha" }, - _status.event.player - ) > 0 - ) - return 1; + if (get.effect(_status.event.getTrigger().player, { name: "sha" }, _status.event.player) > 0) return 1; return 0; }) .forResult(); @@ -5074,12 +4019,7 @@ const skills = { if (result.index == 0) { player.logSkill("miki_zhiluo"); player.draw(); - } else - player.useCard( - { name: "sha", isCard: true }, - trigger.player, - "miki_zhiluo" - ); + } else player.useCard({ name: "sha", isCard: true }, trigger.player, "miki_zhiluo"); }, }, miki_hydrogladiator_skill: { @@ -5092,12 +4032,7 @@ const skills = { return ( event.getParent().name == "sha" && game.hasPlayer(function (current) { - return ( - (current == event.player || - (current != player && - get.distance(current, event.player) <= 1)) && - current.countDiscardableCards(player, "he") > 0 - ); + return (current == event.player || (current != player && get.distance(current, event.player) <= 1)) && current.countDiscardableCards(player, "he") > 0; }) ); }, @@ -5107,24 +4042,15 @@ const skills = { var choiceList = []; if (trigger.player.countDiscardableCards(player, "he") > 0) { list.push(true); - choiceList.push( - "弃置" + get.translation(trigger.player) + "的两张牌" - ); + choiceList.push("弃置" + get.translation(trigger.player) + "的两张牌"); } if ( game.hasPlayer(function (current) { - return ( - current != player && - get.distance(current, trigger.player) <= 1 - ); + return current != player && get.distance(current, trigger.player) <= 1; }) ) { list.push(false); - choiceList.push( - "弃置所有至" + - get.translation(trigger.player) + - "距离为1的角色的各一张牌" - ); + choiceList.push("弃置所有至" + get.translation(trigger.player) + "距离为1的角色的各一张牌"); } event.list = list; if (list.length == 1) event._result = { index: 0 }; @@ -5137,25 +4063,13 @@ const skills = { var player = _status.event.player; var source = _status.event.getTrigger().player; var num = game.countPlayer(function (current) { - if ( - current != player && - get.distance(current, source) <= 1 && - current.countDiscardableCards(player, "he") > 0 - ) - return -get.sgn(get.attitude(player, current)); + if (current != player && get.distance(current, source) <= 1 && current.countDiscardableCards(player, "he") > 0) return -get.sgn(get.attitude(player, current)); }); - if ( - num > - Math.min( - 2, - source.countDiscardableCards(player, "he") - ) - ) - return 1; + if (num > Math.min(2, source.countDiscardableCards(player, "he"))) return 1; return 0; }); } - ("step 1"); + "step 1"; if (event.list[result.index]) { event.result = { bool: true, @@ -5168,10 +4082,7 @@ const skills = { cost_data: { type: "multiple" }, targets: game .filterPlayer(function (current) { - return ( - current != player && - get.distance(current, trigger.player) <= 1 - ); + return current != player && get.distance(current, trigger.player) <= 1; }) .sortBySeat(), }; @@ -5183,10 +4094,9 @@ const skills = { player.discardPlayerCard(targets[0], "he", 2, true); event.finish(); } - ("step 1"); + "step 1"; var target = targets.shift(); - if (target.countDiscardableCards(player, "he") > 0) - player.discardPlayerCard(target, "he", true); + if (target.countDiscardableCards(player, "he") > 0) player.discardPlayerCard(target, "he", true); if (targets.length) event.redo(); }, }, @@ -5210,11 +4120,7 @@ const skills = { }, async cost(event, trigger, player) { event.result = await player - .chooseTarget( - get.prompt("shiorimiyuki_banyin"), - "令一名其他角色回复1点体力", - lib.filter.notMe - ) + .chooseTarget(get.prompt("shiorimiyuki_banyin"), "令一名其他角色回复1点体力", lib.filter.notMe) .set("ai", function (target) { var player = _status.event.player; return get.recoverEffect(target, player, player); @@ -5241,8 +4147,7 @@ const skills = { return 3; }) .forResult(); - if (control != "cancel2") - event.result = { bool: true, cost_data: index }; + if (control != "cancel2") event.result = { bool: true, cost_data: index }; }, async content(event, trigger, player) { let num = 1 + event.cost_data; @@ -5260,18 +4165,10 @@ const skills = { charlotte: true, mod: { aiOrder(player, card, num) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("shiorimiyuki_tingxian") - ) - return num + 2; + if (get.itemtype(card) == "card" && card.hasGaintag("shiorimiyuki_tingxian")) return num + 2; }, aiValue(player, card, num) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("shiorimiyuki_tingxian") - ) - return 0; + if (get.itemtype(card) == "card" && card.hasGaintag("shiorimiyuki_tingxian")) return 0; }, }, filter(event, player) { @@ -5354,51 +4251,25 @@ const skills = { event = event || _status.event; var filter = event._backup.filterCard; var name = get.suit(card, player); - if (name == "club" && filter({ name: "shan" }, player, event)) - return true; - if ( - name == "diamond" && - filter({ name: "sha", nature: "thunder" }, player, event) - ) - return true; - if (name == "spade" && filter({ name: "wuxie" }, player, event)) - return true; - if (name == "heart" && filter({ name: "tao" }, player, event)) - return true; + if (name == "club" && filter({ name: "shan" }, player, event)) return true; + if (name == "diamond" && filter({ name: "sha", nature: "thunder" }, player, event)) return true; + if (name == "spade" && filter({ name: "wuxie" }, player, event)) return true; + if (name == "heart" && filter({ name: "tao" }, player, event)) return true; return false; }, filter(event, player) { if (player.hasSkill("shizuru_nianli_round")) return false; var filter = event.filterCard; - if ( - filter({ name: "sha", nature: "thunder" }, player, event) && - player.countCards("h", { suit: "diamond" }) - ) - return true; - if ( - filter({ name: "shan" }, player, event) && - player.countCards("h", { suit: "club" }) - ) - return true; - if ( - filter({ name: "tao" }, player, event) && - player.countCards("h", { suit: "heart" }) - ) - return true; - if ( - filter({ name: "wuxie" }, player, event) && - player.countCards("h", { suit: "spade" }) - ) - return true; + if (filter({ name: "sha", nature: "thunder" }, player, event) && player.countCards("h", { suit: "diamond" })) return true; + if (filter({ name: "shan" }, player, event) && player.countCards("h", { suit: "club" })) return true; + if (filter({ name: "tao" }, player, event) && player.countCards("h", { suit: "heart" })) return true; + if (filter({ name: "wuxie" }, player, event) && player.countCards("h", { suit: "spade" })) return true; return false; }, precontent() { player.logSkill("shizuru_nianli"); player.addTempSkill("shizuru_nianli_round", "roundStart"); - player.showCards( - get.translation(player) + "发动了【念力】", - event.result.cards.slice(0) - ); + player.showCards(get.translation(player) + "发动了【念力】", event.result.cards.slice(0)); event.result.card.cards = []; event.result.cards = []; delete event.result.skill; @@ -5462,11 +4333,7 @@ const skills = { return _status.connectMode || get.suit(card) == "spade"; }) > 0 && !player.hasSkill("shizuru_nianli_round") ); - if (name == "tao") - return ( - player.countCards("h", { suit: "heart" }) > 0 && - !player.hasSkill("shizuru_nianli_round") - ); + if (name == "tao") return player.countCards("h", { suit: "heart" }) > 0 && !player.hasSkill("shizuru_nianli_round"); return false; }, group: "shizuru_nianli_clear", @@ -5492,17 +4359,11 @@ const skills = { trigger: { global: ["useCard", "respond"] }, usable: 1, filter(event, player) { - return ( - Array.isArray(event.respondTo) && - event.respondTo[0] != event.player && - [event.respondTo[0], event.player].includes(player) - ); + return Array.isArray(event.respondTo) && event.respondTo[0] != event.player && [event.respondTo[0], event.player].includes(player); }, async cost(event, trigger, player) { event.type = get.type(trigger.card) == "basic"; - var prompt = event.type - ? "令一名角色摸两张牌或弃置两张牌" - : "令一名角色回复1点体力或对其造成1点伤害"; + var prompt = event.type ? "令一名角色摸两张牌或弃置两张牌" : "令一名角色回复1点体力或对其造成1点伤害"; event.result = await player .chooseTarget(get.prompt("shizuru_benzhan"), prompt) .set("ai", function (target) { @@ -5511,15 +4372,9 @@ const skills = { var att = get.attitude(player, target); if (target.hasSkillTag("nogain")) return -att; if (target.countCards("he") == 1 && att < 0) att /= 2; - return ( - Math.abs(att) * - (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))) - ); + return Math.abs(att) * (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))); } - return Math.max( - get.recoverEffect(target, player, player), - get.damageEffect(target, player, player) - ); + return Math.max(get.recoverEffect(target, player, player), get.damageEffect(target, player, player)); }) .forResult(); }, @@ -5532,18 +4387,10 @@ const skills = { var list; if (event.type) { if (!target.countCards("he")) event._result = { index: 0 }; - else - list = [ - "令" + trans + "摸两张牌", - "令" + trans + "弃置两张牌", - ]; + else list = ["令" + trans + "摸两张牌", "令" + trans + "弃置两张牌"]; } else { if (target.isHealthy()) event._result = { index: 1 }; - else - list = [ - "令" + trans + "回复1点体力", - "对" + trans + "造成1点伤害", - ]; + else list = ["令" + trans + "回复1点体力", "对" + trans + "造成1点伤害"]; } player .chooseControl() @@ -5551,18 +4398,14 @@ const skills = { .set( "choice", (function () { - if (event.type) - return get.attitude(player, target) > 0 ? 0 : 1; - return get.recoverEffect(target, player, player) > - get.damageEffect(target, player, player) - ? 0 - : 1; + if (event.type) return get.attitude(player, target) > 0 ? 0 : 1; + return get.recoverEffect(target, player, player) > get.damageEffect(target, player, player) ? 0 : 1; })() ) .set("ai", function () { return _status.event.choice; }); - ("step 1"); + "step 1"; player.addExpose(0.2); if (event.type) { if (result.index == 0) target.draw(2); @@ -5576,12 +4419,7 @@ const skills = { //岬镜子 kyoko_juwu: { trigger: { - global: [ - "loseAfter", - "cardsDiscardAfter", - "loseAsyncAfter", - "equipAfter", - ], + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], }, filter(event, player) { if (player == _status.currentPhase) return false; @@ -5589,11 +4427,7 @@ const skills = { if (!cards.length) return false; cards.removeArray(event.getd(player)); for (var card of cards) { - if ( - get.position(card, true) == "d" && - get.type(card, null, false) == "equip" - ) - return true; + if (get.position(card, true) == "d" && get.type(card, null, false) == "equip") return true; } return false; }, @@ -5604,20 +4438,11 @@ const skills = { var cards = trigger.getd(); cards.removeArray(trigger.getd(player)); cards = cards.filter(function (card) { - if ( - get.position(card, true) == "d" && - get.type(card, null, false) == "equip" - ) - return true; + if (get.position(card, true) == "d" && get.type(card, null, false) == "equip") return true; + }); + const { result } = await player.chooseButton([get.prompt("kyoko_juwu"), cards], [1, cards.length]).set("ai", function () { + return 1; }); - const { result } = await player - .chooseButton( - [get.prompt("kyoko_juwu"), cards], - [1, cards.length] - ) - .set("ai", function () { - return 1; - }); if (result.bool) event.result = { bool: true, @@ -5645,10 +4470,7 @@ const skills = { if (!num || (event.name == "phaseUse") == num > 3) return false; return ( player.getHistory("useCard", function (evt) { - return ( - event.name != "phaseUse" || - evt.getParent("phaseUse") == event - ); + return event.name != "phaseUse" || evt.getParent("phaseUse") == event; }).length >= player.hp ); }, @@ -5667,11 +4489,8 @@ const skills = { if (list.length >= player.hp) break; } if (list.length >= player.hp) event.goon = true; - else - player - .chooseControl("摸牌阶段", "出牌阶段") - .set("prompt", "精策:选择要执行的额外阶段"); - ("step 1"); + else player.chooseControl("摸牌阶段", "出牌阶段").set("prompt", "精策:选择要执行的额外阶段"); + "step 1"; if (event.goon || result.index == 0) { var next = player.phaseDraw(); event.next.remove(next); @@ -5712,28 +4531,21 @@ const skills = { event.cards ); event.time = get.utc(); - game.addVideo("showCards", player, [ - "涉猎", - get.cardsInfo(event.cards), - ]); + game.addVideo("showCards", player, ["涉猎", get.cardsInfo(event.cards)]); game.addVideo("delay", null, 2); - ("step 1"); + "step 1"; var next = player.chooseButton([0, 5], true); next.set("dialog", event.videoId); next.set("filterButton", function (button) { for (var i = 0; i < ui.selected.buttons.length; i++) { - if ( - get.suit(ui.selected.buttons[i].link) == - get.suit(button.link) - ) - return false; + if (get.suit(ui.selected.buttons[i].link) == get.suit(button.link)) return false; } return true; }); next.set("ai", function (button) { return get.value(button.link, _status.event.player); }); - ("step 2"); + "step 2"; if (result.bool && result.links) { event.cards2 = result.links; } else { @@ -5743,7 +4555,7 @@ const skills = { if (time > 0) { game.delay(0, time); } - ("step 3"); + "step 3"; game.broadcastAll("closeDialog", event.videoId); var cards2 = event.cards2; player.gain(cards2, "log", "gain2"); @@ -5758,8 +4570,7 @@ const skills = { }, prompt() { var str = "弃置任意张牌并摸等量的牌"; - if (lib.skill.kyoko_zhengyi.count(_status.event.player) > 3) - str += ",若弃置了所有手牌则多摸一张牌。"; + if (lib.skill.kyoko_zhengyi.count(_status.event.player) > 3) str += ",若弃置了所有手牌则多摸一张牌。"; return str; }, filterCard: lib.filter.cardDiscardable, @@ -5779,8 +4590,7 @@ const skills = { player.discard(cards); event.num = 1; var hs = player.getCards("h"); - if (!hs.length || lib.skill.kyoko_zhengyi.count(player) < 4) - event.num = 0; + if (!hs.length || lib.skill.kyoko_zhengyi.count(player) < 4) event.num = 0; else for (var i = 0; i < hs.length; i++) { if (!cards.includes(hs[i])) { @@ -5788,7 +4598,7 @@ const skills = { break; } } - ("step 1"); + "step 1"; player.draw(event.num + cards.length); }, ai: { @@ -5817,11 +4627,7 @@ const skills = { return ( num - game.countPlayer(function (current) { - return ( - current != from && - current.hasSkill("yuzuru_bujin") && - current.isFriendOf(from) - ); + return current != from && current.hasSkill("yuzuru_bujin") && current.isFriendOf(from); }) ); }, @@ -5856,10 +4662,7 @@ const skills = { var num = player.maxHp - player.hp; player.recover(num); player.draw(num); - if ( - _status.characterlist && - _status.characterlist.includes("key_midori") - ) { + if (_status.characterlist && _status.characterlist.includes("key_midori")) { player.reinitCharacter("key_mio", "key_midori", false); } }, @@ -5873,11 +4676,7 @@ const skills = { }, filterTarget(card, player, target) { var stat = player.getStat("midori_nonghuan"); - return ( - target != player && - (!stat || !stat.includes(target)) && - target.countGainableCards(player, "hej") > 0 - ); + return target != player && (!stat || !stat.includes(target)) && target.countGainableCards(player, "hej") > 0; }, content() { "step 0"; @@ -5886,32 +4685,24 @@ const skills = { stat.midori_nonghuan.push(target); player.gainPlayerCard(target, "hej", true); player.draw(); - ("step 1"); - if (player.countCards("he") > 0) - player.chooseCard( - "he", - true, - "交给" + get.translation(target) + "一张牌" - ); + "step 1"; + if (player.countCards("he") > 0) player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); else event.goto(3); - ("step 2"); + "step 2"; player.give(result.cards, target); - ("step 3"); + "step 3"; var history = game.getGlobalHistory("cardMove"); for (var i = 0; i < history.length; i++) { - if (history[i].getParent("midori_nonghuan") == event) - history.splice(i--, 1); + if (history[i].getParent("midori_nonghuan") == event) history.splice(i--, 1); } game.countPlayer2(function (current) { var history = current.getHistory("lose"); for (var i = 0; i < history.length; i++) { - if (history[i].getParent("midori_nonghuan") == event) - history.splice(i--, 1); + if (history[i].getParent("midori_nonghuan") == event) history.splice(i--, 1); } var history = current.getHistory("gain"); for (var i = 0; i < history.length; i++) { - if (history[i].getParent("midori_nonghuan") == event) - history.splice(i--, 1); + if (history[i].getParent("midori_nonghuan") == event) history.splice(i--, 1); } }); }, @@ -5919,16 +4710,10 @@ const skills = { order: 9, result: { player() { - return lib.card.shunshou.ai.result.player.apply( - this, - arguments - ); + return lib.card.shunshou.ai.result.player.apply(this, arguments); }, target() { - return lib.card.shunshou.ai.result.target.apply( - this, - arguments - ); + return lib.card.shunshou.ai.result.target.apply(this, arguments); }, }, }, @@ -5951,10 +4736,7 @@ const skills = { var num = player.maxHp - player.hp; player.recover(num); player.draw(num); - if ( - _status.characterlist && - _status.characterlist.includes("key_mio") - ) { + if (_status.characterlist && _status.characterlist.includes("key_mio")) { player.reinitCharacter("key_midori", "key_mio", false); } }, @@ -5979,15 +4761,7 @@ const skills = { var player = _status.event.player; if ( game.countPlayer(function (current) { - return ( - player.canUse("mapodoufu", current) && - get.effect( - current, - { name: "mapodoufu" }, - player, - player - ) > 0 - ); + return player.canUse("mapodoufu", current) && get.effect(current, { name: "mapodoufu" }, player, player) > 0; }) > 1 ) return 6 - get.value(card); @@ -5999,17 +4773,11 @@ const skills = { trigger: { global: ["useCard", "respond"] }, usable: 1, filter(event, player) { - return ( - Array.isArray(event.respondTo) && - event.respondTo[0] != event.player && - [event.respondTo[0], event.player].includes(player) - ); + return Array.isArray(event.respondTo) && event.respondTo[0] != event.player && [event.respondTo[0], event.player].includes(player); }, async cost(event, trigger, player) { event.type = get.type(trigger.card) == "basic"; - var prompt = event.type - ? "令一名角色摸两张牌或弃置两张牌" - : "令一名角色回复1点体力或对其造成1点伤害"; + var prompt = event.type ? "令一名角色摸两张牌或弃置两张牌" : "令一名角色回复1点体力或对其造成1点伤害"; event.result = await player .chooseTarget(get.prompt("kanade_benzhan"), prompt) .set("ai", function (target) { @@ -6018,15 +4786,9 @@ const skills = { var att = get.attitude(player, target); if (target.hasSkillTag("nogain")) return -att; if (target.countCards("he") == 1 && att < 0) att /= 2; - return ( - Math.abs(att) * - (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))) - ); + return Math.abs(att) * (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))); } - return Math.max( - get.recoverEffect(target, player, player), - get.damageEffect(target, player, player) - ); + return Math.max(get.recoverEffect(target, player, player), get.damageEffect(target, player, player)); }) .forResult(); }, @@ -6039,18 +4801,10 @@ const skills = { var list; if (event.type) { if (!target.countCards("he")) event._result = { index: 0 }; - else - list = [ - "令" + trans + "摸两张牌", - "令" + trans + "弃置两张牌", - ]; + else list = ["令" + trans + "摸两张牌", "令" + trans + "弃置两张牌"]; } else { if (target.isHealthy()) event._result = { index: 1 }; - else - list = [ - "令" + trans + "回复1点体力", - "对" + trans + "造成1点伤害", - ]; + else list = ["令" + trans + "回复1点体力", "对" + trans + "造成1点伤害"]; } player .chooseControl() @@ -6058,18 +4812,14 @@ const skills = { .set( "choice", (function () { - if (event.type) - return get.attitude(player, target) > 0 ? 0 : 1; - return get.recoverEffect(target, player, player) > - get.damageEffect(target, player, player) - ? 0 - : 1; + if (event.type) return get.attitude(player, target) > 0 ? 0 : 1; + return get.recoverEffect(target, player, player) > get.damageEffect(target, player, player) ? 0 : 1; })() ) .set("ai", function () { return _status.event.choice; }); - ("step 1"); + "step 1"; player.addExpose(0.2); if (event.type) { if (result.index == 0) target.draw(2); @@ -6092,10 +4842,7 @@ const skills = { }, filterCard() { if (ui.selected.targets.length) return false; - return lib.filter.cardDiscardable.apply( - this, - arguments - ); + return lib.filter.cardDiscardable.apply(this, arguments); }, selectTarget() { if (!ui.selected.cards.length) return [1, 1]; @@ -6115,8 +4862,7 @@ const skills = { return player.getDamagedHp() * 2 - get.value(card); }, ai2(target) { - if (player.hp < 4 || target.hasSkillTag("nogain")) - return 0; + if (player.hp < 4 || target.hasSkillTag("nogain")) return 0; return get.attitude(_status.event.player, target); }, }) @@ -6134,13 +4880,7 @@ const skills = { }, }, yuzuru_deyi: { - derivation: [ - "yuzuru_kunfen", - "yuzuru_quji", - "yuzuru_wangsheng", - "yuzuru_kunfen_rewrite", - "yuzuru_quji_rewrite", - ], + derivation: ["yuzuru_kunfen", "yuzuru_quji", "yuzuru_wangsheng", "yuzuru_kunfen_rewrite", "yuzuru_quji_rewrite"], trigger: { global: "dieAfter" }, forced: true, unique: true, @@ -6149,10 +4889,7 @@ const skills = { animationColor: "orange", content() { player.awakenSkill("yuzuru_deyi"); - player.changeSkills( - ["yuzuru_kunfen", "yuzuru_quji", "yuzuru_wangsheng"], - ["yuzuru_wuxin"] - ); + player.changeSkills(["yuzuru_kunfen", "yuzuru_quji", "yuzuru_wangsheng"], ["yuzuru_wuxin"]); player.loseMaxHp(); player.recover(); }, @@ -6164,7 +4901,7 @@ const skills = { "step 0"; if (!player.storage._yuzuru_sss) player.loseHp(); player.draw(2); - ("step 1"); + "step 1"; if (player.countCards("he") < 2) event.finish(); else { player.chooseCardTarget({ @@ -6174,8 +4911,7 @@ const skills = { position: "he", ai1(card) { var player = _status.event.player; - if (player.maxHp - player.hp == 1 && card.name == "du") - return 30; + if (player.maxHp - player.hp == 1 && card.name == "du") return 30; var check = player.countCards("h") - 2; if (check < 1) return 0; if (player.hp > 1 && check < 2) return 0; @@ -6183,16 +4919,12 @@ const skills = { }, ai2(target) { var att = get.attitude(_status.event.player, target); - if ( - ui.selected.cards.length == 1 && - ui.selected.cards[0].name == "du" - ) - return 1 - att; + if (ui.selected.cards.length == 1 && ui.selected.cards[0].name == "du") return 1 - att; return att - 2; }, }); } - ("step 2"); + "step 2"; if (result.bool) player.give(result.cards, result.targets[0]); }, }, @@ -6217,22 +4949,15 @@ const skills = { }, complexSelect: true, check(card) { - if ( - !_status.event.player.storage._yuzuru_sss && - get.color(card) == "black" - ) - return -1; + if (!_status.event.player.storage._yuzuru_sss && get.color(card) == "black") return -1; return 9 - get.value(card); }, line: { color: [194, 117, 92] }, content() { "step 0"; target.recover(); - ("step 1"); - if ( - target == targets[targets.length - 1] && - !player.storage._yuzuru_sss - ) { + "step 1"; + if (target == targets[targets.length - 1] && !player.storage._yuzuru_sss) { for (var i = 0; i < cards.length; i++) { if (get.color(cards[i], player) == "black") { player.loseHp(); @@ -6271,30 +4996,23 @@ const skills = { if ( get.suit(card, false) == "heart" && game.hasPlayer(function (current) { - return ( - current.hasSkill("kanade_mapo") && - get.attitude(player, current) > 0 - ); + return current.hasSkill("kanade_mapo") && get.attitude(player, current) > 0; }) ) return 1; return 0; }, ai2(kanade) { - if ( - kanade.hasSkill("kanade_mapo") && - get.attitude(_status.event.player, kanade) > 0 - ) - return 2; + if (kanade.hasSkill("kanade_mapo") && get.attitude(_status.event.player, kanade) > 0) return 2; return 0; }, }); } else event.goto(2); - ("step 1"); + "step 1"; if (result.bool) player.give(result.cards, result.targets[0]); - ("step 2"); + "step 2"; player.loseMaxHp(); - ("step 3"); + "step 3"; if (player.hp < 2) player.recover(2 - player.hp); }, }, @@ -6306,12 +5024,7 @@ const skills = { }, forced: true, filter(event, player, name) { - return ( - (name == "useCard" || - name == "respond" || - event.player != player) && - get.suit(event.card) == "diamond" - ); + return (name == "useCard" || name == "respond" || event.player != player) && get.suit(event.card) == "diamond"; }, content() { player.draw(); @@ -6327,37 +5040,19 @@ const skills = { content() { "step 0"; player.draw(); - ("step 1"); + "step 1"; if (!trigger.player.countCards("h")) event.finish(); else - player - .chooseButton([ - "选择一张牌作为「蝶」", - trigger.player.getCards("h"), - ]) - .set("ai", function (button) { - var val = get.buttonValue(button); - if ( - get.attitude( - _status.event.player, - get.owner(button.link) - ) <= 0 - ) - return 10 + val; - if (val <= 0) return 20; - if ( - button.link.name == "tao" || - button.link.name == "jiu" - ) - return 0; - return 1 / val; - }); - ("step 2"); + player.chooseButton(["选择一张牌作为「蝶」", trigger.player.getCards("h")]).set("ai", function (button) { + var val = get.buttonValue(button); + if (get.attitude(_status.event.player, get.owner(button.link)) <= 0) return 10 + val; + if (val <= 0) return 20; + if (button.link.name == "tao" || button.link.name == "jiu") return 0; + return 1 / val; + }); + "step 2"; if (result.bool) { - player - .addToExpansion(result.links, trigger.player, "give") - .set("log", false) - .gaintag.add("ao_diegui"); + player.addToExpansion(result.links, trigger.player, "give").set("log", false).gaintag.add("ao_diegui"); game.log(result.links, "飞向了", player); } }, @@ -6367,22 +5062,14 @@ const skills = { const cardSuit = get.suit(card, false); const list = player.getExpansions("ao_diegui"); for (let i = 0; i < list.length; i++) { - if ( - cardSuit === "unsure" || - get.suit(list[i], false) === cardSuit - ) - return true; + if (cardSuit === "unsure" || get.suit(list[i], false) === cardSuit) return true; } }, cardUsable(card, player) { const cardSuit = get.suit(card, false); const list = player.getExpansions("ao_diegui"); for (let i = 0; i < list.length; i++) { - if ( - cardSuit === "unsure" || - get.suit(list[i], false) === cardSuit - ) - return Infinity; + if (cardSuit === "unsure" || get.suit(list[i], false) === cardSuit) return Infinity; } }, maxHandcard(player, num) { @@ -6424,11 +5111,7 @@ const skills = { }, chooseButton: { dialog(event, player) { - return ui.create.dialog( - "蝶归", - player.getExpansions("ao_diegui"), - "hidden" - ); + return ui.create.dialog("蝶归", player.getExpansions("ao_diegui"), "hidden"); }, backup(links, player) { return { @@ -6444,11 +5127,7 @@ const skills = { ai: { result: { target(player, target) { - if ( - target != player && - target.hasSkillTag("nogain") - ) - return 0; + if (target != player && target.hasSkillTag("nogain")) return 0; var num = 1; if (target.isTurnedOver()) num += 2; if (target.isLinked()) num += 0.5; @@ -6459,20 +5138,16 @@ const skills = { }; }, prompt(links, player) { - return ( - "选择一名角色,令其获得" + - get.translation(links[0]) + - ",摸两张牌并将武将牌复原。" - ); + return "选择一名角色,令其获得" + get.translation(links[0]) + ",摸两张牌并将武将牌复原。"; }, }, contentx() { "step 0"; player.give(lib.skill.ao_diegui_backup.card, target, "visible"); target.draw(2); - ("step 1"); + "step 1"; target.link(false); - ("step 2"); + "step 2"; target.turnOver(false); }, intro: { @@ -6503,21 +5178,12 @@ const skills = { }, content() { "step 0"; - player - .chooseButton( - [ - "请选择" + get.translation(target) + "的一张手牌", - target.getCards("h"), - ], - true - ) - .set("ai", get.buttonValue); - ("step 1"); + player.chooseButton(["请选择" + get.translation(target) + "的一张手牌", target.getCards("h")], true).set("ai", get.buttonValue); + "step 1"; if (result.bool) { var card = result.links[0]; event.card = card; - if (!lib.filter.cardEnabled(card, target)) - event._result = { bool: false }; + if (!lib.filter.cardEnabled(card, target)) event._result = { bool: false }; else { var targets = game.players.slice(0); var info = get.info(card); @@ -6526,19 +5192,10 @@ const skills = { var select = get.copy(info.selectTarget); if (select == undefined) { range = [1, 1]; - } else if (typeof select == "number") - range = [select, select]; - else if (get.itemtype(select) == "select") - range = select; - else if (typeof select == "function") - range = select(card, player); - game.checkMod( - card, - target, - range, - "selectTarget", - target - ); + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, target, range, "selectTarget", target); } if (info.notarget || range[1] == -1) { if (range[1] == -1) { @@ -6555,30 +5212,12 @@ const skills = { } } else event.targets2 = []; var next = player.chooseBool(); - next.set( - "prompt", - event.prompt || - "是否令" + - get.translation(target) + - (event.targets2.length ? "对" : "") + - get.translation(event.targets2) + - "使用" + - get.translation(card) + - "?" - ); - next.set( - "prompt2", - "或点「取消」,令其将此牌置入弃牌堆" - ); + next.set("prompt", event.prompt || "是否令" + get.translation(target) + (event.targets2.length ? "对" : "") + get.translation(event.targets2) + "使用" + get.translation(card) + "?"); + next.set("prompt2", "或点「取消」,令其将此牌置入弃牌堆"); next.ai = function () { var eff = 0; for (var i = 0; i < event.targets2.length; i++) { - eff += get.effect( - event.targets2[i], - card, - target, - player - ); + eff += get.effect(event.targets2[i], card, target, player); } return eff > 0; }; @@ -6586,24 +5225,12 @@ const skills = { var next = player.chooseTarget(); next.set("_get_card", card); next.set("source", target); - next.set( - "filterTarget", - function (card, player, target) { - return lib.filter.filterTarget( - _status.event._get_card, - _status.event.source, - target - ); - } - ); + next.set("filterTarget", function (card, player, target) { + return lib.filter.filterTarget(_status.event._get_card, _status.event.source, target); + }); next.set("ai", function (target) { var evt = _status.event; - return get.effect( - target, - evt._get_card, - evt.source, - evt.player - ); + return get.effect(target, evt._get_card, evt.source, evt.player); }); next.set("selectTarget", function () { var card = get.card(), @@ -6612,45 +5239,22 @@ const skills = { var range; var select = get.copy(get.info(card).selectTarget); if (select == undefined) { - if (get.info(card).filterTarget == undefined) - return [0, 0]; + if (get.info(card).filterTarget == undefined) return [0, 0]; range = [1, 1]; - } else if (typeof select == "number") - range = [select, select]; - else if (get.itemtype(select) == "select") - range = select; - else if (typeof select == "function") - range = select(card, player); - game.checkMod( - card, - player, - range, - "selectTarget", - player - ); + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, player, range, "selectTarget", player); return range; }); - next.set( - "prompt", - event.prompt || - "选择" + - get.translation(target) + - "使用" + - get.translation(card) + - "的目标" - ); + next.set("prompt", event.prompt || "选择" + get.translation(target) + "使用" + get.translation(card) + "的目标"); next.set("prompt2", "或点「取消」令其将此牌置入弃牌堆"); } } } else event.finish(); - ("step 2"); + "step 2"; if (result.bool) { - target.useCard( - card, - event.targets2 || result.targets, - false, - "noai" - ); + target.useCard(card, event.targets2 || result.targets, false, "noai"); player.draw(); } else { target.lose(card, ui.discardPile); @@ -6688,27 +5292,16 @@ const skills = { if (event.name == "damage") { return event.player.isAlive() && event.player != source; } else if (event.name == "lose") { - if ( - event.type != "discard" || - event.player == source || - event.player.isDead() - ) - return false; - if ( - (event.discarder || event.getParent(2).player) == - event.player - ) - return false; + if (event.type != "discard" || event.player == source || event.player.isDead()) return false; + if ((event.discarder || event.getParent(2).player) == event.player) return false; if (!event.getl(event.player).hs.length) return false; return true; } else if (event.name == "gain") { - if (event.giver || event.getParent().name == "gift") - return false; + if (event.giver || event.getParent().name == "gift") return false; var cards = event.getg(event.player); if (!cards.length) return false; return game.hasPlayer(function (current) { - if (current == event.player || current == source) - return false; + if (current == event.player || current == source) return false; var hs = event.getl(current).hs; for (var i of hs) { if (cards.includes(i)) return true; @@ -6716,13 +5309,7 @@ const skills = { return false; }); } else if (event.type == "gain") { - if ( - event.giver || - !event.player || - event.player == source || - event.player.isDead() - ) - return false; + if (event.giver || !event.player || event.player == source || event.player.isDead()) return false; var hs = event.getl(event.player); return game.hasPlayer(function (current) { if (current == event.player) return false; @@ -6734,11 +5321,7 @@ const skills = { } else if (event.type == "discard") { if (!event.discarder) return false; return game.hasPlayer(function (current) { - return ( - current != source && - current != event.discarder && - event.getl(current).hs.length > 0 - ); + return current != source && current != event.discarder && event.getl(current).hs.length > 0; }); } return false; @@ -6754,8 +5337,7 @@ const skills = { const cards = trigger.getg(trigger.player); targets.addArray( game.filterPlayer(function (current) { - if (current === trigger.player || current === source) - return false; + if (current === trigger.player || current === source) return false; const hs = trigger.getl(current).hs; for (const i of hs) { if (cards.includes(i)) return true; @@ -6763,17 +5345,10 @@ const skills = { return false; }) ); - } else if ( - trigger.name == "loseAsync" && - trigger.type == "discard" - ) { + } else if (trigger.name == "loseAsync" && trigger.type == "discard") { targets.addArray( game.filterPlayer(function (current) { - return ( - current != trigger.discarder && - current != source && - trigger.getl(current).hs.length > 0 - ); + return current != trigger.discarder && current != source && trigger.getl(current).hs.length > 0; }) ); } else targets.push(trigger.player); @@ -6783,8 +5358,7 @@ const skills = { logTarget: (event, player, triggername, target) => target, check(event, player, triggername, target) { const source = _status.currentPhase; - if (source && source.isIn() && get.attitude(player, source) > 0) - return false; + if (source && source.isIn() && get.attitude(player, source) > 0) return false; return get.attitude(player, target) > 0; }, async content(event, trigger, player) { @@ -6808,11 +5382,7 @@ const skills = { locked: true, intro: { content(s) { - return ( - "计算与其他角色的距离时始终从" + - (s ? "逆" : "顺") + - "时针计算" - ); + return "计算与其他角色的距离时始终从" + (s ? "逆" : "顺") + "时针计算"; }, }, content() { @@ -6823,71 +5393,37 @@ const skills = { left_hand: true, right_hand: true, skillTagFilter(player, tag) { - return ( - (player.storage.tomoya_shangxian == true) == - (tag == "left_hand") - ); + return (player.storage.tomoya_shangxian == true) == (tag == "left_hand"); }, }, }, tomoya_wangjin: { trigger: { global: "phaseJieshuBegin" }, filter(event, player) { - return ( - player != event.player && - !player.hasSkill( - "tomoya_wangjin_" + player.inRange(event.player) - ) - ); + return player != event.player && !player.hasSkill("tomoya_wangjin_" + player.inRange(event.player)); }, logTarget: "player", check(event, player) { var target = event.player; var bool = player.inRange(target); if (!bool) { - if (target.hp > player.hp) - return ( - get.effect( - target, - { name: "sha", isCard: true }, - player, - player - ) > 0 - ); + if (target.hp > player.hp) return get.effect(target, { name: "sha", isCard: true }, player, player) > 0; var temp = target; while (true) { temp = temp.getNext(); - if (temp == target || temp == _status.roundStart) - return true; + if (temp == target || temp == _status.roundStart) return true; if (temp == player) continue; - if ( - temp.hp > player.hp && - !player.inRange(temp) && - get.effect( - temp, - { name: "sha", isCard: true }, - player, - player - ) > 0 - ) - return false; + if (temp.hp > player.hp && !player.inRange(temp) && get.effect(temp, { name: "sha", isCard: true }, player, player) > 0) return false; } } if (get.attitude(player, target) < 2) return false; - if (target.hp < player.hp && !target.hasSkillTag("nogain")) - return true; + if (target.hp < player.hp && !target.hasSkillTag("nogain")) return true; var temp = target; while (true) { temp = temp.getNext(); if (temp == target || temp == _status.roundStart) return true; if (temp == player) continue; - if ( - temp.hp < player.hp && - player.inRange(temp) && - get.attitude(player, target) >= 2 && - !temp.hasSkillTag("nogain") - ) - return false; + if (temp.hp < player.hp && player.inRange(temp) && get.attitude(player, target) >= 2 && !temp.hasSkillTag("nogain")) return false; } }, content() { @@ -6897,29 +5433,24 @@ const skills = { if (event.bool) { trigger.player.draw(); } else player.draw(2); - ("step 1"); + "step 1"; if (event.bool) { if (trigger.player.hp < player.hp) player.draw(); else event.finish(); } else { - if (player.countDiscardableCards(trigger.player, "h") > 0) - trigger.player.discardPlayerCard(player, "h", true); + if (player.countDiscardableCards(trigger.player, "h") > 0) trigger.player.discardPlayerCard(player, "h", true); else event.finish(); } - ("step 2"); + "step 2"; if (event.bool) { - player.chooseCard( - "h", - "是否交给" + get.translation(trigger.player) + "一张牌?" - ); + player.chooseCard("h", "是否交给" + get.translation(trigger.player) + "一张牌?"); } else { event.finish(); if (player.hp >= trigger.player.hp) return; var card = { name: "sha", isCard: true }; - if (player.canUse(card, trigger.player, false)) - player.useCard(card, trigger.player, false); + if (player.canUse(card, trigger.player, false)) player.useCard(card, trigger.player, false); } - ("step 3"); + "step 3"; if (result.bool) player.give(result.cards, target); }, subSkill: { @@ -6936,9 +5467,7 @@ const skills = { }, forced: true, filter(event, player) { - return ( - get.itemtype(event.source) == "player" && event.bySelf != true - ); + return get.itemtype(event.source) == "player" && event.bySelf != true; }, check(event, player) { return get.attitude(player, event.source) > 0; @@ -6977,12 +5506,8 @@ const skills = { "step 0"; event.giver = trigger.turn; event.gainner = event.giver == player ? trigger.target : player; - event.giver.chooseCard( - "he", - true, - "交给" + get.translation(event.gainner) + "一张牌" - ); - ("step 1"); + event.giver.chooseCard("he", true, "交给" + get.translation(event.gainner) + "一张牌"); + "step 1"; event.giver.give(result.cards, event.gainner); }, }, @@ -7034,8 +5559,7 @@ const skills = { return event.skill == "hinata_qiulve"; }, content() { - if (get.color(trigger.card) == "red") - trigger.directHit.addArray(game.players); + if (get.color(trigger.card) == "red") trigger.directHit.addArray(game.players); else if (trigger.addCount !== false) { trigger.addCount = false; var stat = player.getStat().card; @@ -7049,37 +5573,23 @@ const skills = { //这个也是chooseToUse 改不了 direct: true, filter(event, player) { - return ( - player != event.player && - event.targets && - event.targets.includes(player) && - (_status.connectMode || player.hasSha()) - ); + return player != event.player && event.targets && event.targets.includes(player) && (_status.connectMode || player.hasSha()); }, content() { "step 0"; player.chooseToUse({ logSkill: "hinata_ehou", preTarget: trigger.player, - prompt: - "是否发动【扼喉】,对" + - get.translation(trigger.player) + - "使用一张【杀】?", + prompt: "是否发动【扼喉】,对" + get.translation(trigger.player) + "使用一张【杀】?", filterCard(card, player) { - return ( - get.name(card) == "sha" && - lib.filter.filterCard.apply(this, arguments) - ); + return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); }, filterTarget(card, player, target) { - return ( - target == _status.event.preTarget && - lib.filter.filterTarget.apply(this, arguments) - ); + return target == _status.event.preTarget && lib.filter.filterTarget.apply(this, arguments); }, addCount: false, }); - ("step 1"); + "step 1"; if ( result.bool && player.getHistory("sourceDamage", function (evt) { @@ -7100,25 +5610,14 @@ const skills = { }).judge2 = function (result) { return result.bool; }; - ("step 1"); - if (result.bool && game.hasPlayer((current) => current != player)) { - player - .chooseTarget( - lib.filter.notMe, - true, - "选择一名其他角色,对其造成1点雷属性伤害" - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect( - target, - player, - player, - "thunder" - ); - }); + "step 1"; + if (result.bool && game.hasPlayer(current => current != player)) { + player.chooseTarget(lib.filter.notMe, true, "选择一名其他角色,对其造成1点雷属性伤害").set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "thunder"); + }); } else event.finish(); - ("step 2"); + "step 2"; var target = result.targets[0]; player.addExpose(0.2); player.line(target, "thunder"); @@ -7159,12 +5658,9 @@ const skills = { }, async cost(event, trigger, player) { event.result = await player - .chooseTarget( - get.prompt2("riki_spwenji"), - function (card, player, target) { - return target != player && target.countCards("he"); - } - ) + .chooseTarget(get.prompt2("riki_spwenji"), function (card, player, target) { + return target != player && target.countCards("he"); + }) .set("ai", function (target) { var att = get.attitude(_status.event.player, target); if (att > 0) return Math.sqrt(att) / 10; @@ -7176,18 +5672,11 @@ const skills = { "step 0"; target = targets[0]; event.target = target; - target.chooseCard( - "he", - true, - "问计:将一张牌交给" + get.translation(player) - ); - ("step 1"); + target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); + "step 1"; if (result.bool) { player.addTempSkill("riki_spwenji_respond"); - player.storage.riki_spwenji_respond = get.type2( - result.cards[0], - target - ); + player.storage.riki_spwenji_respond = get.type2(result.cards[0], target); event.target.give(result.cards, player, true); } }, @@ -7200,10 +5689,7 @@ const skills = { charlotte: true, audio: "riki_spwenji", filter(event, player) { - return ( - get.type2(event.card) == - player.storage.riki_spwenji_respond - ); + return get.type2(event.card) == player.storage.riki_spwenji_respond; }, content() { trigger.directHit.addArray(game.players); @@ -7211,10 +5697,7 @@ const skills = { ai: { directHit_ai: true, skillTagFilter(player, tag, arg) { - return ( - get.type2(arg.card) == - player.storage.riki_spwenji_respond - ); + return get.type2(arg.card) == player.storage.riki_spwenji_respond; }, }, }, @@ -7238,8 +5721,7 @@ const skills = { filter(event, player) { var num = 0; player.getAllHistory("gain", function (evt) { - if (evt.getParent().name == "riki_spwenji") - num += evt.cards.length; + if (evt.getParent().name == "riki_spwenji") num += evt.cards.length; }); return num >= 3; }, @@ -7259,22 +5741,15 @@ const skills = { player: "phaseUseBegin", }, filter(event, player) { - return game.hasPlayer((current) => player.canCompare(current)); + return game.hasPlayer(current => player.canCompare(current)); }, async cost(event, trigger, player) { event.result = await player - .chooseTarget( - get.prompt2("riki_chongzhen"), - function (card, player, target) { - return player.canCompare(target); - } - ) + .chooseTarget(get.prompt2("riki_chongzhen"), function (card, player, target) { + return player.canCompare(target); + }) .set("ai", function (target) { - return ( - (-get.attitude(player, target) * - (1 + target.countCards("e"))) / - (1 + target.countCards("j")) - ); + return (-get.attitude(player, target) * (1 + target.countCards("e"))) / (1 + target.countCards("j")); }) .forResult(); }, @@ -7283,29 +5758,19 @@ const skills = { var target = targets[0]; event.target = target; player.chooseToCompare(target); - ("step 1"); + "step 1"; if (result.bool) { var num = 0; if (target.countCards("h")) num++; if (target.countCards("e")) num++; if (target.countCards("j")) num++; if (num) { - player - .gainPlayerCard(target, num, "hej", true) - .set("filterButton", function (button) { - for ( - var i = 0; - i < ui.selected.buttons.length; - i++ - ) { - if ( - get.position(button.link) == - get.position(ui.selected.buttons[i].link) - ) - return false; - } - return true; - }); + player.gainPlayerCard(target, num, "hej", true).set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.position(button.link) == get.position(ui.selected.buttons[i].link)) return false; + } + return true; + }); } } else { player.addTempSkill("zishou2", "phaseEnd"); @@ -7331,9 +5796,8 @@ const skills = { content() { "step 0"; player.chooseToCompare(target); - ("step 1"); - if (result.bool) - player.addTempSkill("yuiko_fenglun2", "phaseUseEnd"); + "step 1"; + if (result.bool) player.addTempSkill("yuiko_fenglun2", "phaseUseEnd"); }, ai: { order: 10, @@ -7370,24 +5834,13 @@ const skills = { }, filter(event, player) { if (event.preserve) return false; - return ( - [event.card1, event.card2].filterInD("od").length > 0 - ); + return [event.card1, event.card2].filterInD("od").length > 0; }, prompt2(event, player) { - return ( - "获得" + - get.translation( - [event.card1, event.card2].filterInD("od") - ) - ); + return "获得" + get.translation([event.card1, event.card2].filterInD("od")); }, content() { - player.gain( - [trigger.card1, trigger.card2].filterInD("od"), - "gain2", - "log" - ); + player.gain([trigger.card1, trigger.card2].filterInD("od"), "gain2", "log"); }, }, }, @@ -7403,8 +5856,7 @@ const skills = { return event.card.name == "sha"; }, content() { - if (trigger.name == "useCard") - trigger.directHit.addArray(game.players); + if (trigger.name == "useCard") trigger.directHit.addArray(game.players); else trigger.directHit.add(player); }, ai: { @@ -7419,11 +5871,7 @@ const skills = { ai: { directHit_ai: true, skillTagFilter(player, tag, arg) { - return ( - arg.card.name == "sha" && - (arg.target.hasSkill("doruji_feiqu") || - arg.target.hasSkill("godan_feiqu")) - ); + return arg.card.name == "sha" && (arg.target.hasSkill("doruji_feiqu") || arg.target.hasSkill("godan_feiqu")); }, }, }, @@ -7456,11 +5904,7 @@ const skills = { var num = card.number; if (num > 10) return 8 - val; var player = _status.event.player; - if ( - player.getUseValue(card, null, true) > - player.getUseValue({ name: "guohe" }) - ) - return 0; + if (player.getUseValue(card, null, true) > player.getUseValue({ name: "guohe" })) return 0; if (num > 6) return 6 - val; return 3 - val; }, @@ -7471,8 +5915,7 @@ const skills = { var list = ["令" + trans + "摸一张牌"]; event.addIndex = 0; if (num > 6) { - if (target.countDiscardableCards(player, "hej") > 0) - list.push("弃置" + trans + "区域内的一张牌"); + if (target.countDiscardableCards(player, "hej") > 0) list.push("弃置" + trans + "区域内的一张牌"); else event.addIndex++; } if (num > 10) list.push("对" + trans + "造成1点伤害"); @@ -7485,7 +5928,7 @@ const skills = { .set("ai", function () { return _status.event.index; }); - ("step 1"); + "step 1"; if (result.index > 0) result.index += event.addIndex; switch (result.index) { case 0: @@ -7505,13 +5948,8 @@ const skills = { target(player, target) { var card = ui.selected.cards[0]; if (card) { - if (card.number > 10) - return get.damageEffect(target, player, target); - if (card.number > 6) - return lib.card.guohe.ai.result.target.apply( - this, - arguments - ); + if (card.number > 10) return get.damageEffect(target, player, target); + if (card.number > 6) return lib.card.guohe.ai.result.target.apply(this, arguments); return 1; } }, @@ -7537,9 +5975,7 @@ const skills = { prompt() { var player = _status.event.player; var list = game.filterPlayer(function (target) { - return ( - target != player && target.hasZhuSkill("akane_yifu", player) - ); + return target != player && target.hasZhuSkill("akane_yifu", player); }); var str = "将一张手牌交给" + get.translation(list); if (list.length > 1) str += "中的一人"; @@ -7549,39 +5985,25 @@ const skills = { if (player.group != "key") return false; if (player.countCards("h") == 0) return 0; return game.hasPlayer(function (target) { - return ( - target != player && - target.hasZhuSkill("akane_yifu", player) && - !target.hasSkill("akane_yifu3") - ); + return target != player && target.hasZhuSkill("akane_yifu", player) && !target.hasSkill("akane_yifu3"); }); }, filterCard: true, filterTarget(card, player, target) { - return ( - target != player && - target.hasZhuSkill("akane_yifu", player) && - !target.hasSkill("akane_yifu3") - ); + return target != player && target.hasZhuSkill("akane_yifu", player) && !target.hasSkill("akane_yifu3"); }, content() { "step 0"; player.give(cards, target); target.addTempSkill("akane_yifu3", "phaseUseEnd"); target.draw(); - ("step 1"); + "step 1"; if (target.countCards("h") > 0) - target - .chooseCard( - "h", - true, - "交给" + get.translation(player) + "一张牌" - ) - .set("ai", function (card) { - return 14 - get.value(card); - }); + target.chooseCard("h", true, "交给" + get.translation(player) + "一张牌").set("ai", function (card) { + return 14 - get.value(card); + }); else event.finish(); - ("step 2"); + "step 2"; target.give(result.cards, player); }, ai: { @@ -7625,15 +6047,13 @@ const skills = { return event.num > 1 && range < 3; }, content() { - trigger.num = - event.triggername == "damageBegin4" ? 1 : trigger.num + 1; + trigger.num = event.triggername == "damageBegin4" ? 1 : trigger.num + 1; }, ai: { filterDamage: true, skillTagFilter(player, tag, arg) { if (arg && arg.player) { - if (arg.player.hasSkillTag("jueqing", false, player)) - return false; + if (arg.player.hasSkillTag("jueqing", false, player)) return false; if (arg.player.getAttackRange() < 3) return true; } return false; @@ -7650,10 +6070,8 @@ const skills = { if (player != event.respondTo[0]) return false; if (!player.hasSkill("sasami_funan_jiexun")) { var cards = []; - if (get.itemtype(event.respondTo[1]) == "card") - cards.push(event.respondTo[1]); - else if (event.respondTo[1].cards) - cards.addArray(event.respondTo[1].cards); + if (get.itemtype(event.respondTo[1]) == "card") cards.push(event.respondTo[1]); + else if (event.respondTo[1].cards) cards.addArray(event.respondTo[1].cards); return cards.filterInD("od").length > 0; } else return event.cards.filterInD("od").length > 0; }, @@ -7662,17 +6080,13 @@ const skills = { "step 0"; if (!player.hasSkill("sasami_funan_jiexun")) { var cards = []; - if (get.itemtype(trigger.respondTo[1]) == "card") - cards.push(trigger.respondTo[1]); - else if (trigger.respondTo[1].cards) - cards.addArray(trigger.respondTo[1].cards); + if (get.itemtype(trigger.respondTo[1]) == "card") cards.push(trigger.respondTo[1]); + else if (trigger.respondTo[1].cards) cards.addArray(trigger.respondTo[1].cards); cards = cards.filterInD("od"); - trigger.player - .gain(cards, "gain2", "log") - .gaintag.add("sasami_funan"); + trigger.player.gain(cards, "gain2", "log").gaintag.add("sasami_funan"); trigger.player.addTempSkill("sasami_funan_use"); } - ("step 1"); + "step 1"; var cards = trigger.cards.filterInD("od"); player.gain(cards, "log", "gain2"); }, @@ -7684,10 +6098,7 @@ const skills = { charlotte: true, mod: { cardEnabled2(card, player) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("sasami_funan") - ) { + if (get.itemtype(card) == "card" && card.hasGaintag("sasami_funan")) { return false; } }, @@ -7714,7 +6125,7 @@ const skills = { player.judge(function () { return 0; }); - ("step 1"); + "step 1"; var target = trigger.target; var map = trigger.customArgs; var id = target.playerid; @@ -7736,8 +6147,7 @@ const skills = { } if (result.suit == "diamond" || result.suit == "club") { target.addTempSkill("fengyin"); - if (target.countDiscardableCards(player, "he") > 0) - player.discardPlayerCard(target, "he", true); + if (target.countDiscardableCards(player, "he") > 0) player.discardPlayerCard(target, "he", true); } }, }, @@ -7756,32 +6166,23 @@ const skills = { "step 0"; var evt = event.getParent("phase"); if (evt && evt.player == player) evt.sunohara_chengshuang = true; - player - .chooseControl("male", "female") - .set("prompt", "成双:请选择自己的性别"); - ("step 1"); + player.chooseControl("male", "female").set("prompt", "成双:请选择自己的性别"); + "step 1"; var sex = result.control; game.broadcastAll( function (player, sex) { player.sex = sex; - if (player.marks && player.marks.sunohara_chengshuang) - player.marks.sunohara_chengshuang.firstChild.innerHTML = - sex == "male" ? "♂" : "♀"; + if (player.marks && player.marks.sunohara_chengshuang) player.marks.sunohara_chengshuang.firstChild.innerHTML = sex == "male" ? "♂" : "♀"; }, player, sex ); - game.log( - player, - "将性别变更为", - "#g" + get.translation(sex) + "性" - ); + game.log(player, "将性别变更为", "#g" + get.translation(sex) + "性"); }, mark: true, intro: { content(storage, player) { - if (player.sex == "unknown" || player.sex == "double") - return "当前性别未确定"; + if (player.sex == "unknown" || player.sex == "double") return "当前性别未确定"; return "当前性别:" + get.translation(player.sex); }, }, @@ -7795,54 +6196,39 @@ const skills = { return game.phaseNumber > 1; }, prompt2(event, player) { - if (player.sex == "unknown" || player.sex == "double") - return "选择自己的性别"; - return ( - "将自己的性别变更为" + (player.sex == "male" ? "女性" : "男性") - ); + if (player.sex == "unknown" || player.sex == "double") return "选择自己的性别"; + return "将自己的性别变更为" + (player.sex == "male" ? "女性" : "男性"); }, content() { "step 0"; - if (player.sex == "unknown" || player.sex == "double") - player - .chooseControl("male", "female") - .set("prompt", "成双:请选择自己的性别"); + if (player.sex == "unknown" || player.sex == "double") player.chooseControl("male", "female").set("prompt", "成双:请选择自己的性别"); else event._result = { control: player.sex == "male" ? "female" : "male", }; - ("step 1"); + "step 1"; var sex = result.control; game.broadcastAll( function (player, sex) { player.sex = sex; - if (player.marks && player.marks.sunohara_chengshuang) - player.marks.sunohara_chengshuang.firstChild.innerHTML = - sex == "male" ? "♂" : "♀"; + if (player.marks && player.marks.sunohara_chengshuang) player.marks.sunohara_chengshuang.firstChild.innerHTML = sex == "male" ? "♂" : "♀"; }, player, sex ); - game.log( - player, - "将性别变更为", - "#g" + get.translation(sex) + "性" - ); + game.log(player, "将性别变更为", "#g" + get.translation(sex) + "性"); }, }, sunohara_tiaoyin: { enable: "phaseUse", usable: 1, filterTarget(card, player, target) { - return ( - target != player && target.countGainableCards(player, "hej") > 0 - ); + return target != player && target.countGainableCards(player, "hej") > 0; }, selectCard: [1, 4], filterCard(card) { for (var i = 0; i < ui.selected.cards.length; i++) { - if (get.suit(ui.selected.cards[i]) == get.suit(card)) - return false; + if (get.suit(ui.selected.cards[i]) == get.suit(card)) return false; } return true; }, @@ -7854,8 +6240,7 @@ const skills = { }, line: { color: [239, 204, 96] }, content() { - if (target.countGainableCards(player, "hej") > 0) - player.gainPlayerCard(target, "hej", "visible"); + if (target.countGainableCards(player, "hej") > 0) player.gainPlayerCard(target, "hej", "visible"); }, contentAfter() { var bool = false; @@ -7871,21 +6256,14 @@ const skills = { order: 6, result: { target(player, target) { - return lib.card.shunshou.ai.result.target.apply( - this, - arguments - ); + return lib.card.shunshou.ai.result.target.apply(this, arguments); }, player(player, target) { if (target.sameSexAs(player)) return 0; for (var i = 0; i < ui.selected.targets.length; i++) { - if (ui.selected.targets[i].differentSexFrom(player)) - return 0; + if (ui.selected.targets[i].differentSexFrom(player)) return 0; } - return get.attitude(player, target) < 0 && - target.countCards("h", "tao") > 0 - ? 1 - : -2; + return get.attitude(player, target) < 0 && target.countCards("h", "tao") > 0 ? 1 : -2; }, }, }, @@ -7894,37 +6272,20 @@ const skills = { trigger: { player: "damageEnd" }, line: { color: [145, 149, 179] }, async cost(event, trigger, player) { - const num = - !trigger.source || - trigger.source.isDead() || - trigger.source.differentSexFrom(player) - ? 3 - : 1; + const num = !trigger.source || trigger.source.isDead() || trigger.source.differentSexFrom(player) ? 3 : 1; event.result = await player - .chooseTarget( - get.prompt("sunohara_jianren"), - "令一名角色摸" + get.cnNumber(num) + "张牌。" - ) + .chooseTarget(get.prompt("sunohara_jianren"), "令一名角色摸" + get.cnNumber(num) + "张牌。") .set("ai", function (target) { var att = get.attitude(player, target); if (att <= 0) return 0; - if ( - target.hasSkillTag("nogain") && - target != _status.currentPhase - ) - return 0.1; + if (target.hasSkillTag("nogain") && target != _status.currentPhase) return 0.1; return att / (1 + 0.1 * target.countCards("h")); }) .forResult(); }, async content(event, trigger, player) { const target = event.targets[0]; - const num = - !trigger.source || - trigger.source.isDead() || - trigger.source.differentSexFrom(player) - ? 3 - : 1; + const num = !trigger.source || trigger.source.isDead() || trigger.source.differentSexFrom(player) ? 3 : 1; target.draw(num); }, }, @@ -7944,26 +6305,18 @@ const skills = { var cards = trigger.cards.filterInD("od"); player.gain(cards, "gain2", "log"); event.count = cards.length; - ("step 1"); + "step 1"; var cards = player.getCards("he"); if (cards.length == 0) { event.finish(); return; } else if (cards.length <= event.count) { event._result = { bool: true, cards: cards }; - } else - player.chooseCard( - true, - "he", - event.count, - "请选择要置于武将牌上的牌" - ); - ("step 2"); + } else player.chooseCard(true, "he", event.count, "请选择要置于武将牌上的牌"); + "step 2"; if (result.bool && result.cards.length) { var cards = result.cards; - player - .addToExpansion(cards, player, "give") - .gaintag.add("shiina_qingshen"); + player.addToExpansion(cards, player, "give").gaintag.add("shiina_qingshen"); } }, intro: { @@ -7987,19 +6340,12 @@ const skills = { animalList: ["key_inari", "key_doruji"], trigger: { global: "phaseBegin" }, filter(event, player) { - if (lib.skill.shiina_feiyan.animalList.includes(event.player.name)) - return false; - return ( - player.getExpansions("shiina_qingshen").length > 0 && - player.inRange(event.player) - ); + if (lib.skill.shiina_feiyan.animalList.includes(event.player.name)) return false; + return player.getExpansions("shiina_qingshen").length > 0 && player.inRange(event.player); }, async cost(event, trigger, player) { const { result } = await player - .chooseButton([ - get.prompt("shiina_feiyan", trigger.player), - player.getExpansions("shiina_qingshen"), - ]) + .chooseButton([get.prompt("shiina_feiyan", trigger.player), player.getExpansions("shiina_qingshen")]) .set("goon", get.attitude(player, trigger.player) < 0 ? 1 : -1) .set("ai", function () { return _status.event.goon; @@ -8015,10 +6361,7 @@ const skills = { await player.loseToDiscardpile(event.cards); const cardToUse = { name: "sha", isCard: true }; if (lib.filter.targetEnabled(cardToUse, player, trigger.player)) { - const { card } = await player.useCard( - cardToUse, - trigger.player - ); + const { card } = await player.useCard(cardToUse, trigger.player); console.log(card); if ( !player.hasHistory("sourceDamage", function (evt) { @@ -8042,10 +6385,7 @@ const skills = { return get.attitude(player, event.target) < 0; }, filter(event, player) { - return ( - event.card.name == "sha" && - event.getParent(2).name == "shiina_feiyan" - ); + return event.card.name == "sha" && event.getParent(2).name == "shiina_feiyan"; }, logTarget: "target", content() { @@ -8056,20 +6396,14 @@ const skills = { if (!trigger.target.hasSkill("fengyin")) { trigger.target.addTempSkill("fengyin"); } - ("step 1"); + "step 1"; var suit = get.suit(result.card); var target = trigger.target; var num = target.countCards("h", "shan"); target - .chooseToDiscard( - "请弃置一张" + - get.translation(suit) + - "牌,否则不能使用闪抵消此杀", - "he", - function (card) { - return get.suit(card) == _status.event.suit; - } - ) + .chooseToDiscard("请弃置一张" + get.translation(suit) + "牌,否则不能使用闪抵消此杀", "he", function (card) { + return get.suit(card) == _status.event.suit; + }) .set("ai", function (card) { var num = _status.event.num; if (num == 0) return 0; @@ -8078,7 +6412,7 @@ const skills = { }) .set("num", num) .set("suit", suit); - ("step 2"); + "step 2"; if (!result.bool) { trigger.getParent().directHit.add(trigger.target); } @@ -8088,30 +6422,13 @@ const skills = { inari_baiwei: { enable: ["chooseToUse", "chooseToRespond"], hiddenCard(player, name) { - return ( - name != "du" && - get.type(name) == "basic" && - player.countCards("hes", { suit: "diamond" }) > 0 - ); + return name != "du" && get.type(name) == "basic" && player.countCards("hes", { suit: "diamond" }) > 0; }, filter(event, player) { - if ( - event.type == "wuxie" || - !player.countCards("hse", { suit: "diamond" }) - ) - return false; + if (event.type == "wuxie" || !player.countCards("hse", { suit: "diamond" })) return false; for (var i = 0; i < lib.inpile.length; i++) { var name = lib.inpile[i]; - if ( - name != "du" && - get.type(name) == "basic" && - event.filterCard( - get.autoViewAs({ name: name }, "unsure"), - player, - event - ) - ) - return true; + if (name != "du" && get.type(name) == "basic" && event.filterCard(get.autoViewAs({ name: name }, "unsure"), player, event)) return true; } return false; }, @@ -8123,8 +6440,7 @@ const skills = { if (name == "du") continue; if (name == "sha") { list.push(["基本", "", "sha"]); - for (var j of lib.inpile_nature) - list.push(["基本", "", name, j]); + for (var j of lib.inpile_nature) list.push(["基本", "", name, j]); } else if (get.type(name) == "basic") { list.push(["基本", "", name]); } @@ -8132,13 +6448,7 @@ const skills = { return ui.create.dialog("摆尾", [list, "vcard"], "hidden"); }, filter(button, player) { - return _status.event - .getParent() - .filterCard( - get.autoViewAs({ name: button.link[2] }, "unsure"), - player, - _status.event.getParent() - ); + return _status.event.getParent().filterCard(get.autoViewAs({ name: button.link[2] }, "unsure"), player, _status.event.getParent()); }, check(button) { if (_status.event.getParent().type == "phase") { @@ -8147,8 +6457,7 @@ const skills = { name: button.link[2], nature: button.link[3], }; - if (player.getUseValue(fakecard) > 0) - return get.order(fakecard); + if (player.getUseValue(fakecard) > 0) return get.order(fakecard); return 0; } return 1; @@ -8167,12 +6476,7 @@ const skills = { }; }, prompt(links, player) { - return ( - "将一张♦牌当做" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) + - "使用或打出" - ); + return "将一张♦牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用或打出"; }, }, ai: { @@ -8181,10 +6485,7 @@ const skills = { var max = 0; for (var i = 0; i < lib.inpile.length; i++) { var name = lib.inpile[i]; - if ( - get.type(name) == "basic" && - player.getUseValue({ name: name }) > 0 - ) { + if (get.type(name) == "basic" && player.getUseValue({ name: name }) > 0) { var temp = get.order({ name: name }); if (temp > max) max = temp; } @@ -8200,10 +6501,7 @@ const skills = { respondSha: true, fireAttack: true, skillTagFilter(player, tag) { - return ( - tag == "fireAttack" || - player.countCards("he", { suit: "diamond" }) > 0 - ); + return tag == "fireAttack" || player.countCards("he", { suit: "diamond" }) > 0; }, }, group: ["inari_baiwei_draw"], @@ -8248,18 +6546,14 @@ const skills = { }, async cost(event, trigger, player) { event.result = await player - .chooseTarget( - get.prompt2("saya_powei"), - function (card, saya, kyousuke) { - return kyousuke.hp > saya.hp; - } - ) + .chooseTarget(get.prompt2("saya_powei"), function (card, saya, kyousuke) { + return kyousuke.hp > saya.hp; + }) .set("ai", function (target) { var player = _status.event.player; var att = get.attitude(player, target); if (att >= -2) return 0; - if (target != get.zhu(target) && player.hasUnknown()) - return 0; + if (target != get.zhu(target) && player.hasUnknown()) return 0; if (target.getEquip(3) && !player.getEquip(4)) att /= 2; if (player.hp <= 1) att *= 1.5; return -att; @@ -8281,19 +6575,14 @@ const skills = { event.stat = true; event.current = event["player" + event.stat]; game.countPlayer2(function (current) { - if (current != event.playertrue && current != event.playerfalse) - current.addSkill("saya_nodis"); + if (current != event.playertrue && current != event.playerfalse) current.addSkill("saya_nodis"); }); event.playertrue.addSkill("saya_judge"); - ("step 1"); + "step 1"; event.count++; event.current.phase().set("type", "saya_powei"); - ("step 2"); - if ( - event.count == 9 || - event.playertrue.isDead() || - event.playerfalse.isDead() - ) { + "step 2"; + if (event.count == 9 || event.playertrue.isDead() || event.playerfalse.isDead()) { game.countPlayer2(function (current) { current.removeSkill("saya_nodis"); current.removeSkill("saya_judge"); @@ -8315,10 +6604,7 @@ const skills = { forced: true, popup: false, filter(event, player) { - return ( - event.type == "saya_powei" && - player == event.getParent().playertrue - ); + return event.type == "saya_powei" && player == event.getParent().playertrue; }, content() { "step 0"; @@ -8327,7 +6613,7 @@ const skills = { }).judge2 = function (result) { return result.bool ? true : false; }; - ("step 1"); + "step 1"; if (result.bool) { player.line(trigger.getParent().playerfalse); trigger.getParent().playerfalse.damage(); @@ -8376,21 +6662,16 @@ const skills = { var target = targets[0]; event.target = target; target.gain(event.cards, "gain2", "log"); - ("step 2"); + "step 2"; target.chooseToUse({ cards: cards, filterCard(card) { - if ( - get.itemtype(card) != "card" || - !_status.event.cards || - !_status.event.cards.includes(card) - ) - return false; + if (get.itemtype(card) != "card" || !_status.event.cards || !_status.event.cards.includes(card)) return false; return lib.filter.filterCard.apply(this, arguments); }, prompt: "是否使用得到的牌中的一张?", }); - ("step 3"); + "step 3"; if (result.bool) player.draw(); }, }, @@ -8409,23 +6690,14 @@ const skills = { if (name == "boss_mengpohuihun") continue; if (name == "sha") { list.push(["基本", "", "sha"]); - for (var j of lib.inpile_nature) - list.push(["基本", "", name, j]); - } else if (get.type(name) == "trick") - list.push(["锦囊", "", name]); - else if (get.type(name) == "basic") - list.push(["基本", "", name]); + for (var j of lib.inpile_nature) list.push(["基本", "", name, j]); + } else if (get.type(name) == "trick") list.push(["锦囊", "", name]); + else if (get.type(name) == "basic") list.push(["基本", "", name]); } return ui.create.dialog("双掣", [list, "vcard"]); }, filter(button, player) { - return _status.event - .getParent() - .filterCard( - { name: button.link[2] }, - player, - _status.event.getParent() - ); + return _status.event.getParent().filterCard({ name: button.link[2] }, player, _status.event.getParent()); }, check(button) { var player = _status.event.player; @@ -8455,12 +6727,7 @@ const skills = { }; }, prompt(links, player) { - return ( - "请选择" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) + - "的目标" - ); + return "请选择" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "的目标"; }, }, ai: { @@ -8470,8 +6737,7 @@ const skills = { var cards = player.getCards("he").sort(function (a, b) { return get.value(a) - get.value(b); }); - var num = - (player.getStat("skill").haruka_shuangche || 0) + 1; + var num = (player.getStat("skill").haruka_shuangche || 0) + 1; if (player.needsToDiscard() >= num) return 1; if (player.hp > 2) return 1; if (cards.length >= num) { @@ -8497,22 +6763,14 @@ const skills = { content() { "step 0"; var num = player.getStat("skill").haruka_shuangche || 1; - player - .chooseToDiscard( - "###双掣:请选择一项###选择弃置" + - get.cnNumber(num) + - "张牌,或失去1点体力且令〖双掣〗失效至回合结束", - num, - "he" - ) - .set("ai", function (card) { - var total = 12; - for (var i = 0; i < ui.selected.cards.length; i++) { - total -= get.value(ui.selected.cards[i]); - } - return total - get.value(card); - }); - ("step 1"); + player.chooseToDiscard("###双掣:请选择一项###选择弃置" + get.cnNumber(num) + "张牌,或失去1点体力且令〖双掣〗失效至回合结束", num, "he").set("ai", function (card) { + var total = 12; + for (var i = 0; i < ui.selected.cards.length; i++) { + total -= get.value(ui.selected.cards[i]); + } + return total - get.value(card); + }); + "step 1"; if (!result.bool) { player.addTempSkill("haruka_kanata"); player.loseHp(); @@ -8541,15 +6799,10 @@ const skills = { }, async cost(event, trigger, player) { event.result = await player - .chooseCard( - "he", - [1, player.countCards("he")], - get.prompt2("tsumugi_huilang") - ) + .chooseCard("he", [1, player.countCards("he")], get.prompt2("tsumugi_huilang")) .set("ai", function (card) { if (get.position(card) != "h") return -1; - if (!["shan", "wuxie", "caochuan"].includes(get.name(card))) - return 9; + if (!["shan", "wuxie", "caochuan"].includes(get.name(card))) return 9; return 5 - get.value(card); }) .forResult(); @@ -8557,9 +6810,7 @@ const skills = { async content(event, trigger, player) { const cards = event.cards; player.addSkill("tsumugi_huilang2"); - player - .addToExpansion("giveAuto", cards, player) - .gaintag.add("tsumugi_huilang2"); + player.addToExpansion("giveAuto", cards, player).gaintag.add("tsumugi_huilang2"); }, }, tsumugi_huilang2: { @@ -8580,23 +6831,18 @@ const skills = { var cards = player.getExpansions("tsumugi_huilang2"); event.num = cards.length; player.gain(cards, "draw"); - ("step 1"); - player - .chooseTarget( - [1, num], - "是否令至多" + get.cnNumber(num) + "名角色各摸一张牌?" - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - ("step 2"); + "step 1"; + player.chooseTarget([1, num], "是否令至多" + get.cnNumber(num) + "名角色各摸一张牌?").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 2"; if (result.bool) { var targets = result.targets; player.line(targets, lib.skill.tsumugi_huilang.line); targets.sortBySeat(); game.asyncDraw(targets); } else event.finish(); - ("step 3"); + "step 3"; game.delay(); }, }, @@ -8610,17 +6856,8 @@ const skills = { target: "useCardToTargeted", }, filter(event, player) { - if ( - !( - event.card.name == "juedou" || - (event.card.name == "sha" && get.color(event.card) == "red") - ) - ) - return false; - return ( - player == event.target || - event.getParent().triggeredTargets3.length == 1 - ); + if (!(event.card.name == "juedou" || (event.card.name == "sha" && get.color(event.card) == "red"))) return false; + return player == event.target || event.getParent().triggeredTargets3.length == 1; }, frequent: true, content() { @@ -8629,12 +6866,10 @@ const skills = { ai: { effect: { target(card, player, target) { - if (card.name == "sha" && get.color(card) == "red") - return [1, 0.6]; + if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; }, player(card, player, target) { - if (card.name == "sha" && get.color(card) == "red") - return [1, 1]; + if (card.name == "sha" && get.color(card) == "red") return [1, 1]; }, }, }, @@ -8647,46 +6882,23 @@ const skills = { if (player.storage._ichiban_no_takaramono) list.push("cancel2"); const { control, index } = await player .chooseControl(...list) - .set("choiceList", [ - "令此阶段内的所有红色牌视为【杀】", - "令此阶段内的所有【杀】视为【决斗】", - ]) - .set( - "prompt", - player.storage._ichiban_no_takaramono - ? get.prompt("yui_lieyin") - : "烈音:请选择一项" - ) + .set("choiceList", ["令此阶段内的所有红色牌视为【杀】", "令此阶段内的所有【杀】视为【决斗】"]) + .set("prompt", player.storage._ichiban_no_takaramono ? get.prompt("yui_lieyin") : "烈音:请选择一项") .set("ai", function () { var player = _status.event.player; var shas = player.countCards("h", "sha"); if (shas > 0) { if ( game.hasPlayer(function (current) { - return ( - get.attitude(player, current) < 0 && - player.canUse("juedou", current) && - !current.hasSha() && - get.effect( - current, - { name: "juedou" }, - player, - player - ) > 0 - ); + return get.attitude(player, current) < 0 && player.canUse("juedou", current) && !current.hasSha() && get.effect(current, { name: "juedou" }, player, player) > 0; }) ) return 1; - if (player.storage._ichiban_no_takaramono) - return "cancel2"; + if (player.storage._ichiban_no_takaramono) return "cancel2"; } if ( player.countCards("h", function (card) { - return ( - get.color(card) == "red" && - card.name != "sha" && - player.hasValueTarget(card) - ); + return get.color(card) == "red" && card.name != "sha" && player.hasValueTarget(card); }) == 0 ) return 0; @@ -8702,10 +6914,7 @@ const skills = { } }, async content(event, trigger, player) { - player.addTempSkill( - `yui_lieyin${event.cost_data.index}`, - "phaseUseEnd" - ); + player.addTempSkill(`yui_lieyin${event.cost_data.index}`, "phaseUseEnd"); }, }, yui_lieyin0: { @@ -8736,8 +6945,7 @@ const skills = { if (num != 1) return num > 1; var draw = 0; player.getAllHistory("gain", function (evt) { - if (evt.getParent(2).name == "yui_jiang") - draw += evt.cards.length; + if (evt.getParent(2).name == "yui_jiang") draw += evt.cards.length; }); return draw >= 3; }, @@ -8753,15 +6961,11 @@ const skills = { yui_yinhang: { trigger: { player: "changeHp" }, locked: true, - getIndex: (event) => Math.abs(event.num), + getIndex: event => Math.abs(event.num), line: { color: [253, 153, 182] }, async cost(event, trigger, player) { event.result = await player - .chooseTarget( - [1, 2], - get.prompt("yui_yinhang"), - "令至多两名角色各摸一张牌" - ) + .chooseTarget([1, 2], get.prompt("yui_yinhang"), "令至多两名角色各摸一张牌") .set("ai", function (target) { return get.attitude(_status.event.player, target); }) @@ -8789,12 +6993,7 @@ const skills = { var hs = player.getCards("h"); for (var i = 0; i < hs.length; i++) { if (player.canUse(hs[i], target)) { - var eff2 = get.effect( - target, - hs[i], - player, - player - ); + var eff2 = get.effect(target, hs[i], player, player); if (eff2 > 0) eff += eff2; } } @@ -8807,9 +7006,9 @@ const skills = { var target = targets[0]; event.target = target; player.draw(); - ("step 1"); + "step 1"; player.chooseToPSS(target); - ("step 2"); + "step 2"; if (result.tie) event.goto(1); else if (result.bool) target.damage(); else target.addTempSkill("yoshino_fail", "phaseUseEnd"); @@ -8827,8 +7026,7 @@ const skills = { locked: false, mod: { cardUsable(card, player, num) { - if (card.name == "sha" && player.hasDisabledSlot(1)) - return num + 1; + if (card.name == "sha" && player.hasDisabledSlot(1)) return num + 1; }, globalFrom(from, to, distance) { if (from.hasDisabledSlot(4)) return distance - 1; @@ -8842,12 +7040,7 @@ const skills = { filter(event, player) { var list = ["equip1", "equip2", "equip3", "equip4", "equip5"]; for (var i = 0; i < list.length; i++) { - if ( - player.hasEnabledSlot(list[i]) && - (!player.storage.kengo_guidui2 || - !player.storage.kengo_guidui2.includes(list[i])) - ) - return true; + if (player.hasEnabledSlot(list[i]) && (!player.storage.kengo_guidui2 || !player.storage.kengo_guidui2.includes(list[i]))) return true; } return false; }, @@ -8855,37 +7048,24 @@ const skills = { "step 0"; var list = ["equip1", "equip2", "equip3", "equip4", "equip5"]; for (var i = 0; i < list.length; i++) { - if ( - !player.hasEnabledSlot(list[i]) || - (player.storage.kengo_guidui2 && - player.storage.kengo_guidui2.includes(list[i])) - ) - list.splice(i--, 1); + if (!player.hasEnabledSlot(list[i]) || (player.storage.kengo_guidui2 && player.storage.kengo_guidui2.includes(list[i]))) list.splice(i--, 1); } - player - .chooseControl(list) - .set("prompt", "请选择废除一个装备栏").ai = function () { + player.chooseControl(list).set("prompt", "请选择废除一个装备栏").ai = function () { if ( list.includes("equip1") && player.hasEmptySlot("equip1") && player.countCards("h", function (card) { - return ( - card.name == "sha" && player.getUseValue(card) > 0 - ); + return card.name == "sha" && player.getUseValue(card) > 0; }) ) return "equip1"; - if (list.includes("equip3") && player.hasEmptySlot("equip3")) - return "equip3"; - if (list.includes("equip4") && player.hasEmptySlot("equip4")) - return "equip4"; - if (list.includes("equip5") && player.hasEmptySlot("equip5")) - return "equip5"; - if (list.includes("equip2") && player.hasEmptySlot("equip2")) - return "equip2"; + if (list.includes("equip3") && player.hasEmptySlot("equip3")) return "equip3"; + if (list.includes("equip4") && player.hasEmptySlot("equip4")) return "equip4"; + if (list.includes("equip5") && player.hasEmptySlot("equip5")) return "equip5"; + if (list.includes("equip2") && player.hasEmptySlot("equip2")) return "equip2"; return list.randomGet(); }; - ("step 1"); + "step 1"; player.disableEquip(result.control); player.draw(2); }, @@ -8899,11 +7079,7 @@ const skills = { trigger: { player: "useCardToPlayered" }, forced: true, filter(event, player) { - return ( - event.card.name == "sha" && - player.hasDisabledSlot(1) && - event.target.countCards("he") > 0 - ); + return event.card.name == "sha" && player.hasDisabledSlot(1) && event.target.countCards("he") > 0; }, logTarget: "target", content() { @@ -8943,8 +7119,7 @@ const skills = { } } player.enableEquip(list); - if (!player.storage.kengo_guidui2) - player.storage.kengo_guidui2 = []; + if (!player.storage.kengo_guidui2) player.storage.kengo_guidui2 = []; player.storage.kengo_guidui2.addArray(list); }, }, @@ -8954,14 +7129,10 @@ const skills = { trigger: { player: "changeHp" }, locked: true, line: { color: [235, 96, 138] }, - getIndex: (event) => Math.abs(event.num), + getIndex: event => Math.abs(event.num), async cost(event, trigger, player) { event.result = await player - .chooseTarget( - [1, 2], - get.prompt("iwasawa_yinhang"), - "令至多两名角色各摸一张牌" - ) + .chooseTarget([1, 2], get.prompt("iwasawa_yinhang"), "令至多两名角色各摸一张牌") .set("ai", function (target) { return get.attitude(_status.event.player, target); }) @@ -8983,8 +7154,7 @@ const skills = { }, content() { if (trigger.name == "dying") trigger.cancel(); - else if (event.triggername == "phaseBeginStart") - player.addTempSkill("iwasawa_fenyin"); + else if (event.triggername == "phaseBeginStart") player.addTempSkill("iwasawa_fenyin"); else player.die(); }, nobracket: true, @@ -9008,14 +7178,8 @@ const skills = { list.add(card.suit); } game.getGlobalHistory("cardMove", function (evt) { - if ( - evt == event || - evt.getParent() == event || - (evt.name != "lose" && evt.name != "cardsDiscard") - ) - return false; - if (evt.name == "lose" && evt.position != ui.discardPile) - return false; + if (evt == event || evt.getParent() == event || (evt.name != "lose" && evt.name != "cardsDiscard")) return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; for (var i = 0; i < evt.cards.length; i++) { var card = evt.cards[i]; list.remove(card.suit); @@ -9034,14 +7198,8 @@ const skills = { list2.add(suit); } game.getGlobalHistory("cardMove", function (evt) { - if ( - evt == trigger || - evt.getParent() == trigger || - (evt.name != "lose" && evt.name != "cardsDiscard") - ) - return false; - if (evt.name == "lose" && evt.position != ui.discardPile) - return false; + if (evt == trigger || evt.getParent() == trigger || (evt.name != "lose" && evt.name != "cardsDiscard")) return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; for (var i = 0; i < evt.cards.length; i++) { var card = evt.cards[i]; var suit = card.suit; @@ -9075,13 +7233,7 @@ const skills = { aiOrder(player, card, num) { if (typeof card == "object" && player == _status.currentPhase) { var evt = player.getLastUsed(); - if ( - evt && - evt.card && - get.color(evt.card) != "none" && - get.color(card) != "none" && - get.color(evt.card) != get.color(card) - ) { + if (evt && evt.card && get.color(evt.card) != "none" && get.color(card) != "none" && get.color(evt.card) != get.color(card)) { return num + 10; } } @@ -9097,13 +7249,7 @@ const skills = { if (!evt) return false; var color1 = get.color(evt.card); var color2 = get.color(event.card); - return ( - color1 && - color2 && - color1 != "none" && - color2 != "none" && - color1 != color2 - ); + return color1 && color2 && color1 != "none" && color2 != "none" && color1 != color2; }, content() { player.draw(); @@ -9123,20 +7269,12 @@ const skills = { "step 0"; player .chooseControl("防止伤害", "增加伤害") - .set( - "prompt", - "暴拳:防止即将对" + - get.translation(trigger.player) + - "造成的伤害,或失去1点体力上限并令此伤害+2" - ) - .set( - "choice", - get.attitude(player, trigger.player) >= 0 ? 0 : 1 - ) + .set("prompt", "暴拳:防止即将对" + get.translation(trigger.player) + "造成的伤害,或失去1点体力上限并令此伤害+2") + .set("choice", get.attitude(player, trigger.player) >= 0 ? 0 : 1) .set("ai", function () { return _status.event.choice; }); - ("step 1"); + "step 1"; if (result.control == "增加伤害") { player.loseMaxHp(); trigger.num += 2; @@ -9145,12 +7283,7 @@ const skills = { ai: { effect: { player(card, player, target) { - if ( - target && - get.attitude(player, target) > 0 && - get.tag(card, "damage") - ) - return "zeroplayertarget"; + if (target && get.attitude(player, target) > 0 && get.tag(card, "damage")) return "zeroplayertarget"; }, }, }, @@ -9175,30 +7308,23 @@ const skills = { var name = get.translation(player); target .chooseControl() - .set("choiceList", [ - "令" + name + "摸一张牌", - "回复1点体力,然后交给" + name + "一张牌", - ]) + .set("choiceList", ["令" + name + "摸一张牌", "回复1点体力,然后交给" + name + "一张牌"]) .set("ai", function () { return 1; }); } - ("step 1"); + "step 1"; if (result.index == 0) { player.draw(); event.finish(); } else { target.recover(); } - ("step 2"); + "step 2"; if (target != player && target.countCards("he") > 0) { - target.chooseCard( - "交给" + get.translation(player) + "一张牌", - "he", - true - ); + target.chooseCard("交给" + get.translation(player) + "一张牌", "he", true); } else event.finish(); - ("step 3"); + "step 3"; target.give(result.cards, player, "giveAuto"); }, ai: { @@ -9218,28 +7344,20 @@ const skills = { charlotte: true, trigger: { player: "useSkillAfter" }, filter(event, player) { - return ( - event.skill == "yusa_yanyi" && - !player.storage.dualside_over && - Array.isArray(player.storage.dualside) - ); + return event.skill == "yusa_yanyi" && !player.storage.dualside_over && Array.isArray(player.storage.dualside); }, content() { player.turnOver(); }, ai: { - combo: "yusa_yanyi" + combo: "yusa_yanyi", }, }, misa_yusa: { charlotte: true, trigger: { player: "misa_yehuoAfter" }, filter(event, player) { - return ( - event.bool === true && - !player.storage.dualside_over && - Array.isArray(player.storage.dualside) - ); + return event.bool === true && !player.storage.dualside_over && Array.isArray(player.storage.dualside); }, content() { player.turnOver(); @@ -9252,18 +7370,10 @@ const skills = { line: { color: [236, 137, 52] }, filter(event, player) { var target = event.player; - return ( - player.inRange(target) && - player.countCards("he") >= get.distance(player, target) - ); + return player.inRange(target) && player.countCards("he") >= get.distance(player, target); }, async cost(event, trigger, player) { - var next = player.chooseToDiscard( - "he", - get.distance(player, trigger.player) || 1, - get.prompt2("misa_yehuo", trigger.player), - "chooseonly" - ); + var next = player.chooseToDiscard("he", get.distance(player, trigger.player) || 1, get.prompt2("misa_yehuo", trigger.player), "chooseonly"); next.set("ai", function (card) { var val = _status.event.val; for (var i = 0; i < ui.selected.cards.length; i++) { @@ -9278,19 +7388,14 @@ const skills = { content() { "step 0"; player.discard(cards); - ("step 1"); + "step 1"; event.bool = true; if (trigger.numFixed) event._result = { index: 0 }; else if (trigger.player.isIn()) { var name = get.translation(trigger.player); - player - .chooseControl() - .set("choiceList", [ - "对" + name + "造成1点火属性伤害", - "令" + name + "此出牌阶段的额定摸牌数改为0", - ]); + player.chooseControl().set("choiceList", ["对" + name + "造成1点火属性伤害", "令" + name + "此出牌阶段的额定摸牌数改为0"]); } else event.finish(); - ("step 2"); + "step 2"; if (result.index == 0) trigger.player.damage("fire"); else trigger.changeToZero(); }, @@ -9306,30 +7411,12 @@ const skills = { }, async cost(event, trigger, player) { event.forceDie = true; - var ask = trigger.player.chooseCard( - "he", - get.prompt("yukine_wenzhou") - ); + var ask = trigger.player.chooseCard("he", get.prompt("yukine_wenzhou")); if (player === trigger.player) { - ask.set( - "prompt2", - "选择一张牌,然后从牌堆中获得一张与此牌类型相同的牌。本回合内使用与此牌类型相同的牌时不可被其他角色响应。" - ); - } else - ask.set( - "prompt2", - "将一张牌交给" + - get.translation(player) + - "然后其可以选择:交给你一张牌;或令你从牌堆中获得一张与此牌类型相同的牌,且你本回合内使用与此牌类型相同的牌时不可被响应。" - ); + ask.set("prompt2", "选择一张牌,然后从牌堆中获得一张与此牌类型相同的牌。本回合内使用与此牌类型相同的牌时不可被其他角色响应。"); + } else ask.set("prompt2", "将一张牌交给" + get.translation(player) + "然后其可以选择:交给你一张牌;或令你从牌堆中获得一张与此牌类型相同的牌,且你本回合内使用与此牌类型相同的牌时不可被响应。"); ask.set("ai", function (card) { - if ( - get.attitude( - _status.event.player, - _status.event.getParent().player - ) > 0 - ) - return 10 - get.value(card); + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) return 10 - get.value(card); return -1; }); event.result = await ask.forResult(); @@ -9338,35 +7425,21 @@ const skills = { "step 0"; event.forceDie = true; event.type = get.type(cards[0], "trick"); - if (trigger.player != player) - trigger.player.give(cards, player, "giveAuto"); - ("step 1"); + if (trigger.player != player) trigger.player.give(cards, player, "giveAuto"); + "step 1"; if (player == trigger.player || player.countCards("he") == 0) { event._result = { index: 1 }; } else { player .chooseControl() - .set("choiceList", [ - "将一张牌交给" + get.translation(trigger.player), - "令" + - get.translation(trigger.player) + - "从牌堆中获得一张" + - get.translation(event.type) + - "牌,且其本回合内使用与此牌名称相同的牌时不可被响应", - ]) + .set("choiceList", ["将一张牌交给" + get.translation(trigger.player), "令" + get.translation(trigger.player) + "从牌堆中获得一张" + get.translation(event.type) + "牌,且其本回合内使用与此牌名称相同的牌时不可被响应"]) .set("forceDie", true) .set("ai", function () { - if ( - get.attitude( - _status.event.player, - _status.event.getTrigger().player - ) > 0 - ) - return 1; + if (get.attitude(_status.event.player, _status.event.getTrigger().player) > 0) return 1; return 0; }); } - ("step 2"); + "step 2"; event.index = result.index; if (result.index == 1) { var magic = get.cardPile2(function (card) { @@ -9378,22 +7451,12 @@ const skills = { trigger.player.gain(magic, "draw"); } else event.finish(); } else - player - .chooseCard( - "he", - true, - "选择要交给" + get.translation(trigger.player) + "的牌" - ) - .set("ai", function (card) { - return -get.value( - card, - _status.event.getTrigger().player - ); - }); - ("step 3"); + player.chooseCard("he", true, "选择要交给" + get.translation(trigger.player) + "的牌").set("ai", function (card) { + return -get.value(card, _status.event.getTrigger().player); + }); + "step 3"; if (event.index == 1) game.updateRoundNumber(); - else if (result.bool) - player.give(result.cards, trigger.player, "giveAuto"); + else if (result.bool) player.give(result.cards, trigger.player, "giveAuto"); }, }, yukine_magic: { @@ -9402,10 +7465,7 @@ const skills = { popup: false, charlotte: true, filter(event, player) { - return ( - player.storage.yukine_magic && - player.storage.yukine_magic.includes(event.card.name) - ); + return player.storage.yukine_magic && player.storage.yukine_magic.includes(event.card.name); }, content() { trigger.directHit.addArray( @@ -9422,10 +7482,7 @@ const skills = { ai: { directHit_ai: true, skillTagFilter(player, tag, arg) { - return ( - player.storage.yukine_magic && - player.storage.yukine_magic.includes(arg.card.name) - ); + return player.storage.yukine_magic && player.storage.yukine_magic.includes(arg.card.name); }, }, }, @@ -9437,8 +7494,7 @@ const skills = { }, forced: true, filter(event, player, name) { - if (name == "useCardToTarget" && player == event.player) - return false; + if (name == "useCardToTarget" && player == event.player) return false; if (get.color(event.card) != "red") return false; if (get.tag(event.card, "damage")) return false; return ["basic", "trick"].includes(get.type(event.card)); @@ -9450,41 +7506,24 @@ const skills = { if (info.multitarget || info.allowMultiple === false) bool = false; else { var list = game.filterPlayer(function (current) { - return ( - !trigger.targets.includes(current) && - lib.filter.targetEnabled2( - trigger.card, - trigger.player, - current - ) - ); + return !trigger.targets.includes(current) && lib.filter.targetEnabled2(trigger.card, trigger.player, current); }); if (!list.length) bool = false; } if (bool) player - .chooseTarget( - "甜口:为" + - get.translation(trigger.card) + - "增加一个额外目标,或点【取消】摸一张牌。", - function (candy, komari, rin) { - return _status.event.rin_chan.includes(rin); - } - ) + .chooseTarget("甜口:为" + get.translation(trigger.card) + "增加一个额外目标,或点【取消】摸一张牌。", function (candy, komari, rin) { + return _status.event.rin_chan.includes(rin); + }) .set("rin_chan", list) .set("ai", function (target) { var evt = _status.event; - return get.effect( - target, - evt.candy, - evt.source, - evt.player - ); + return get.effect(target, evt.candy, evt.source, evt.player); }) .set("candy", trigger.card) .set("", trigger.player); else event._result = { bool: false }; - ("step 1"); + "step 1"; if (result.bool) { var rin = result.targets[0]; trigger.targets.push(rin); @@ -9517,7 +7556,7 @@ const skills = { return "一"; }) .set("prompt", "血殇:请选择自己受到的伤害的点数"); - ("step 1"); + "step 1"; var num = event.map[result.control] || 1; event.num = num > 1 ? 2 : 1; event.list = game @@ -9527,7 +7566,7 @@ const skills = { .sortBySeat(); player.damage(num); player.line(event.list, { color: [255, 224, 172] }); - ("step 2"); + "step 2"; if (!player.hasSkill(event.name)) return; else { event.list.shift().damage(num); @@ -9541,10 +7580,7 @@ const skills = { popup: false, charlotte: true, filter(event, player) { - return ( - event.getParent(2).name == "komari_xueshang" && - event.getParent(2).player == player - ); + return event.getParent(2).name == "komari_xueshang" && event.getParent(2).player == player; }, content() { player.removeSkills("komari_xueshang"); @@ -9565,8 +7601,7 @@ const skills = { return 7 - get.value(ingredient); }, filterCard(ingredient) { - if (ui.selected.cards.length) - return get.suit(ingredient) != get.suit(ui.selected.cards[0]); + if (ui.selected.cards.length) return get.suit(ingredient) != get.suit(ui.selected.cards[0]); return true; }, line: { color: [251, 193, 217] }, @@ -9574,7 +7609,7 @@ const skills = { content() { "step 0"; player.draw(); - ("step 1"); + "step 1"; if (player.hp > 2) target.recover(); else if (player.hp == 2) target.draw(2); else target.damage("fire", "nosource"); @@ -9584,10 +7619,8 @@ const skills = { result: { target(umi, takahara) { if (umi.hp > 2 && takahara.isDamaged()) return 2.2; - if (umi.hp == 2 && !takahara.hasSkillTag("nogain")) - return 2; - if (umi.hp < 2) - return get.damageEffect(takahara, umi, umi, "fire"); + if (umi.hp == 2 && !takahara.hasSkillTag("nogain")) return 2; + if (umi.hp < 2) return get.damageEffect(takahara, umi, umi, "fire"); }, }, }, @@ -9603,7 +7636,7 @@ const skills = { content() { "step 0"; player.loseHp(); - ("step 1"); + "step 1"; player.draw(2); player.insertPhase(); player.storage.umi_shiroha = trigger.player; @@ -9638,17 +7671,15 @@ const skills = { player.reinitCharacter("key_umi", "key_umi2", false); player.recover(game.countGroup() || 1); if (!game.dead.length) event.finish(); - ("step 1"); + "step 1"; var chara = []; var skills = []; for (var i = 0; i < game.dead.length; i++) { var name = game.dead[i].name; var name2 = game.dead[i].name2; var skill = []; - if (name && lib.character[name]) - skill.addArray(lib.character[name][3]); - if (name2 && lib.character[name2]) - skill.addArray(lib.character[name2][3]); + if (name && lib.character[name]) skill.addArray(lib.character[name][3]); + if (name2 && lib.character[name2]) skill.addArray(lib.character[name2][3]); if (skill.length) { chara.push(game.dead[i]); skills.push(skill); @@ -9658,9 +7689,8 @@ const skills = { event.chara = chara; event.skills = skills; event.chosen = []; - ("step 2"); - var next = - player.chooseTarget("是否获得一名已死亡角色的一个技能?"); + "step 2"; + var next = player.chooseTarget("是否获得一名已死亡角色的一个技能?"); next.set("chara", event.chara); next.set("skills", event.skills); next.set("chosen", event.chosen); @@ -9669,15 +7699,14 @@ const skills = { var evt = _status.event; if (!evt.chosen.length) return true; var skills = evt.skills[evt.chara.indexOf(target)]; - if (skills.length == 1 && skills[0] == evt.chosen[0]) - return false; + if (skills.length == 1 && skills[0] == evt.chosen[0]) return false; return true; }); next.set("deadTarget", true); next.set("ai", function () { return Math.random(); }); - ("step 3"); + "step 3"; if (!result.bool) event.finish(); else { event.temp = result.targets[0]; @@ -9688,13 +7717,12 @@ const skills = { list.removeArray(event.chosen); player.chooseControl(list).set("prompt", "选择获得一个技能"); } - ("step 4"); + "step 4"; //player.addSkills(result.control,get.groupnature(event.temp.group)||'key'); player.addSkills(result.control); var info = get.info(result.control); if (info.zhuSkill) { - if (!player.storage.zhuSkill_umi_qihuan) - player.storage.zhuSkill_umi_qihuan = []; + if (!player.storage.zhuSkill_umi_qihuan) player.storage.zhuSkill_umi_qihuan = []; player.storage.zhuSkill_umi_qihuan.push(result.control); } event.chosen.push(result.control); @@ -9738,13 +7766,8 @@ const skills = { logTarget: "player", content() { "step 0"; - player.gain( - trigger.player.getCards("j"), - trigger.player, - "give", - "bySelf" - ); - ("step 1"); + player.gain(trigger.player.getCards("j"), trigger.player, "give", "bySelf"); + "step 1"; if (player.hp > 1) player.loseHp(); }, }, @@ -9769,7 +7792,7 @@ const skills = { return card.name == "sha" || get.type(card) == "trick"; }); if (card) player.gain(card, "gain2", "log"); - ("step 1"); + "step 1"; game.updateRoundNumber(); }, }, @@ -9793,9 +7816,8 @@ const skills = { content() { "step 0"; player.give(cards, target); - ("step 1"); - if (!target.getCards("h").includes(cards[0])) - event._result = { bool: false }; + "step 1"; + if (!target.getCards("h").includes(cards[0])) event._result = { bool: false }; else target.chooseUseTarget( cards[0], @@ -9804,7 +7826,7 @@ const skills = { }), "请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段" ); - ("step 2"); + "step 2"; if (result.bool) game.asyncDraw([player, target]); else { target.addTempSkill("yuri_xingdong_mark", "phaseJudgeSkipped"); @@ -9815,7 +7837,7 @@ const skills = { }); event.finish(); } - ("step 3"); + "step 3"; game.delay(); }, ai: { @@ -9829,26 +7851,13 @@ const skills = { if (info.selectTarget == -1) { var eff = 0; game.countPlayer(function (current) { - if ( - current != player && - target.canUse(card, current) - ) - eff += get.effect( - current, - card, - target, - target - ); + if (current != player && target.canUse(card, current)) eff += get.effect(current, card, target, target); }); if (eff > 0 || get.value(card) < 3) return eff; return 0; } else if ( game.hasPlayer(function (current) { - return ( - current != player && - target.canUse(card, current) && - get.effect(current, card, target, target) > 0 - ); + return current != player && target.canUse(card, current) && get.effect(current, card, target, target) > 0; }) ) return 1.5; @@ -9883,9 +7892,7 @@ const skills = { }, async cost(event, trigger, player) { event.result = await trigger.player - .chooseBool( - "是否发动" + get.translation(player) + "的【忘隙】?" - ) + .chooseBool("是否发动" + get.translation(player) + "的【忘隙】?") .set("forceDie", true) .forResult(); }, @@ -9894,18 +7901,14 @@ const skills = { player.awakenSkill("yuri_wangxi"); var identity = "zhong"; if (_status.mode == "purple") { - if (["rNei", "bNei"].includes(player.identity)) - identity = player.identity; - else if (["rZhu", "rZhong", "bNei"].includes(player.identity)) - identity = "rZhong"; + if (["rNei", "bNei"].includes(player.identity)) identity = player.identity; + else if (["rZhu", "rZhong", "bNei"].includes(player.identity)) identity = "rZhong"; else identity = "bZhong"; } game.broadcastAll( function (source, identity) { if (source.node.dieidentity) { - source.node.dieidentity.innerHTML = get.translation( - identity + 2 - ); + source.node.dieidentity.innerHTML = get.translation(identity + 2); } source.revive(2, false); source.identity = identity; @@ -9922,7 +7925,7 @@ const skills = { await trigger.player.draw(); }, ai: { - combo: "yuri_xingdong" + combo: "yuri_xingdong", }, }, //枣恭介 @@ -9934,24 +7937,16 @@ const skills = { }, filterCard: true, selectCard() { - if (ui.selected.targets.length) - return [1, ui.selected.targets[0].countCards("he")]; + if (ui.selected.targets.length) return [1, ui.selected.targets[0].countCards("he")]; return [1, Infinity]; }, filterTarget(event, player, target) { - return ( - target != player && - target.countCards("he") >= Math.max(1, ui.selected.cards.length) - ); + return target != player && target.countCards("he") >= Math.max(1, ui.selected.cards.length); }, check(card) { if ( !game.hasPlayer(function (current) { - return ( - current != _status.event.player && - get.attitude(_status.event.player, current) < 0 && - current.countCards("he") > ui.selected.cards.length - ); + return current != _status.event.player && get.attitude(_status.event.player, current) < 0 && current.countCards("he") > ui.selected.cards.length; }) ) return 0; @@ -9963,8 +7958,7 @@ const skills = { var num = get.cnNumber(cards.length); var trans = get.translation(player); var prompt = "弃置" + num + "张牌,然后" + trans + "摸一张牌"; - if (cards.length > 1) - prompt += ";或弃置一张牌,然后" + trans + "摸" + num + "张牌"; + if (cards.length > 1) prompt += ";或弃置一张牌,然后" + trans + "摸" + num + "张牌"; var next = target.chooseToDiscard(prompt, "he", true); next.numx = cards.length; next.selectCard = function () { @@ -9982,25 +7976,20 @@ const skills = { return 7 - get.value(card); return -1; }; - ("step 1"); + "step 1"; if (result.bool) { if (result.cards.length == cards.length) player.draw(); else player.draw(cards.length); event.cardsx.addArray(result.cards); for (var i = 0; i < event.cardsx.length; i++) { - if (get.position(event.cardsx[i]) != "d") - event.cardsx.splice(i--, 1); + if (get.position(event.cardsx[i]) != "d") event.cardsx.splice(i--, 1); } } else event.finish(); - ("step 2"); + "step 2"; if (event.cardsx.length) { - player.chooseButton( - ["请按顺序将卡牌置于牌堆顶(先选择的在上)", event.cardsx], - true, - event.cardsx.length - ); + player.chooseButton(["请按顺序将卡牌置于牌堆顶(先选择的在上)", event.cardsx], true, event.cardsx.length); } else event.finish(); - ("step 3"); + "step 3"; if (result.bool) { var cardsx = result.links; while (cardsx.length) { @@ -10053,8 +8042,7 @@ const skills = { trigger.cancel(); player.recover(trigger.num); } else { - var another = - trigger[trigger.source == player ? "player" : "source"]; + var another = trigger[trigger.source == player ? "player" : "source"]; player.line(another, { color: [220, 90, 139] }); another.gain(game.createCard2("du"), "gain2"); } @@ -10075,26 +8063,22 @@ const skills = { var es = player.getCards("e"); event.count = es.length; player.discard(es); - ("step 1"); + "step 1"; event.count--; if ( game.hasPlayer(function (current) { return current.countDiscardableCards(player, "ej") > 0; }) ) { - player.chooseTarget( - "请选择一名角色,弃置其装备区或判定区内的一张牌。", - true, - function (card, player, target) { - return target.countDiscardableCards(player, "ej") > 0; - } - ).ai = function (target) { + player.chooseTarget("请选择一名角色,弃置其装备区或判定区内的一张牌。", true, function (card, player, target) { + return target.countDiscardableCards(player, "ej") > 0; + }).ai = function (target) { var att = get.attitude(_status.event.player, target); if (target.countCards("j") && att > 0) return att * 1.5; return -att; }; } else event.finish(); - ("step 2"); + "step 2"; if (result.bool && result.targets && result.targets.length) { var target = result.targets[0]; player.line(target, { color: [220, 90, 139] }); diff --git a/character/key/sort.js b/character/key/sort.js index 6c41b10db..e784705ca 100644 --- a/character/key/sort.js +++ b/character/key/sort.js @@ -1,35 +1,35 @@ -const characterSort = { - key_one: ["key_rumi"], - key_kanon: ["key_shiori", "key_kaori", "key_akiko"], - key_air: ["key_haruko", "key_yukito", "key_crow", "key_kano"], - key_clannad: ["key_yukine", "key_sunohara", "key_tomoya", "key_nagisa", "key_kotomi", "key_fuuko"], - key_littlebusters: ["key_kyousuke", "key_komari", "key_masato", "key_kengo", "key_saya", "key_harukakanata", "key_rin", "key_sasami", "key_doruji", "key_yuiko", "key_riki", "key_mio", "key_midori"], - key_rewrite: ["key_lucia", "key_akane", "key_shizuru", "key_kotori", "key_sakuya", "key_chihaya", "key_asara"], - key_angelbeats: ["sp_key_yuri", "key_yuri", "key_iwasawa", "key_yoshino", "key_yui", "key_shiina", "key_hisako", "key_hinata", "key_noda", "key_ayato", "key_yuzuru", "sp_key_kanade", "key_shiorimiyuki", "key_abyusa", "key_godan"], - key_charlotte: ["key_yusa", "key_misa", "key_yuu", "key_jojiro"], - key_harmonia: ["key_rei"], - key_kamisamaninattahi: ["key_hiroto", "key_youta"], - key_summerpockets: ["key_umi", "key_umi2", "key_tsumugi", "key_inari", "key_ao", "key_kyoko", "key_miki", "key_ryoichi", "key_shiroha", "key_shizuku"], - key_loopers: ["key_mia"], - key_lunaria: ["key_iriya"], - key_heavenburnsred: ["db_key_liyingxia", "key_erika", "key_satomi"], -}; - -const characterSortTranslate = { - key_one: "ONE ~辉之季节~", - key_kanon: "Kanon", - key_air: "AIR", - key_clannad: "Clannad", - key_littlebusters: "Little Busters!", - key_rewrite: "Rewrite", - key_angelbeats: "Angel Beats!", - key_charlotte: "Charlotte", - key_harmonia: "Harmonia", - key_summerpockets: "Summer Pockets", - key_kamisamaninattahi: "成神之日", - key_loopers: "Loopers", - key_lunaria: "LUNARiA", - key_heavenburnsred: "炽焰天穹", -}; - -export { characterSort, characterSortTranslate }; +const characterSort = { + key_one: ["key_rumi"], + key_kanon: ["key_shiori", "key_kaori", "key_akiko"], + key_air: ["key_haruko", "key_yukito", "key_crow", "key_kano"], + key_clannad: ["key_yukine", "key_sunohara", "key_tomoya", "key_nagisa", "key_kotomi", "key_fuuko"], + key_littlebusters: ["key_kyousuke", "key_komari", "key_masato", "key_kengo", "key_saya", "key_harukakanata", "key_rin", "key_sasami", "key_doruji", "key_yuiko", "key_riki", "key_mio", "key_midori"], + key_rewrite: ["key_lucia", "key_akane", "key_shizuru", "key_kotori", "key_sakuya", "key_chihaya", "key_asara"], + key_angelbeats: ["sp_key_yuri", "key_yuri", "key_iwasawa", "key_yoshino", "key_yui", "key_shiina", "key_hisako", "key_hinata", "key_noda", "key_ayato", "key_yuzuru", "sp_key_kanade", "key_shiorimiyuki", "key_abyusa", "key_godan"], + key_charlotte: ["key_yusa", "key_misa", "key_yuu", "key_jojiro"], + key_harmonia: ["key_rei"], + key_kamisamaninattahi: ["key_hiroto", "key_youta"], + key_summerpockets: ["key_umi", "key_umi2", "key_tsumugi", "key_inari", "key_ao", "key_kyoko", "key_miki", "key_ryoichi", "key_shiroha", "key_shizuku"], + key_loopers: ["key_mia"], + key_lunaria: ["key_iriya"], + key_heavenburnsred: ["db_key_liyingxia", "key_erika", "key_satomi"], +}; + +const characterSortTranslate = { + key_one: "ONE ~辉之季节~", + key_kanon: "Kanon", + key_air: "AIR", + key_clannad: "Clannad", + key_littlebusters: "Little Busters!", + key_rewrite: "Rewrite", + key_angelbeats: "Angel Beats!", + key_charlotte: "Charlotte", + key_harmonia: "Harmonia", + key_summerpockets: "Summer Pockets", + key_kamisamaninattahi: "成神之日", + key_loopers: "Loopers", + key_lunaria: "LUNARiA", + key_heavenburnsred: "炽焰天穹", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/key/translate.js b/character/key/translate.js index 8048b9474..aff3e6bb0 100644 --- a/character/key/translate.js +++ b/character/key/translate.js @@ -78,127 +78,93 @@ const translates = { key_iriya_ab: "喵呜喵呼", key_fuuko: "伊吹风子", lucia_duqu: "毒躯", - lucia_duqu_info: - "锁定技,①当你对其他角色造成伤害或受到其他角色的伤害时,你令对方获得一张花色点数随机的【毒】。
    ②当你因【毒】失去体力时,你改为回复等量的体力。", + lucia_duqu_info: "锁定技,①当你对其他角色造成伤害或受到其他角色的伤害时,你令对方获得一张花色点数随机的【毒】。
    ②当你因【毒】失去体力时,你改为回复等量的体力。", lucia_zhenren: "振刃", - lucia_zhenren_info: - "锁定技,每个结束阶段,若你的装备区内有牌,则你弃置之。然后,你依次弃置场上的X张牌。(X为你以此法弃置的牌数)", + lucia_zhenren_info: "锁定技,每个结束阶段,若你的装备区内有牌,则你弃置之。然后,你依次弃置场上的X张牌。(X为你以此法弃置的牌数)", nk_shekong: "设控", - nk_shekong_info: - "出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色(不能超过该角色的牌数),然后令其选择一项:弃置一张牌并令你摸X张牌,或弃置X张牌并令你摸一张牌。然后,你将你与其弃置的且位于弃牌堆中的牌以任意顺序置于牌堆顶。", + nk_shekong_info: "出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色(不能超过该角色的牌数),然后令其选择一项:弃置一张牌并令你摸X张牌,或弃置X张牌并令你摸一张牌。然后,你将你与其弃置的且位于弃牌堆中的牌以任意顺序置于牌堆顶。", key_huanjie: "幻界", - key_huanjie_info: - "锁定技,当你进行判定或摸牌时,你改为从牌堆的另一端获取相应的牌。", + key_huanjie_info: "锁定技,当你进行判定或摸牌时,你改为从牌堆的另一端获取相应的牌。", yuri_xingdong: "行动", - yuri_xingdong_info: - "锁定技,出牌阶段开始时,你获得一张【杀】或普通锦囊牌。出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。", + yuri_xingdong_info: "锁定技,出牌阶段开始时,你获得一张【杀】或普通锦囊牌。出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。", //目标角色跳过阶段的同时 该回合不能发动〖整经(郑玄)〗 yuri_wangxi: "忘隙", - yuri_wangxi_info: - "主公技,限定技,当有角色因你发动的【行动】而死亡后,若其身份不为【明忠】,则其可以将身份改为忠臣并重新加入游戏,然后将势力改为与你相同,将体力值回复至2点并摸一张牌。", + yuri_wangxi_info: "主公技,限定技,当有角色因你发动的【行动】而死亡后,若其身份不为【明忠】,则其可以将身份改为忠臣并重新加入游戏,然后将势力改为与你相同,将体力值回复至2点并摸一张牌。", haruko_haofang: "豪放", - haruko_haofang_info: - "锁定技,你的延时锦囊牌视为【无中生有】。当你因执行【无中生有】的效果而摸牌时,你令摸牌数+2。", + haruko_haofang_info: "锁定技,你的延时锦囊牌视为【无中生有】。当你因执行【无中生有】的效果而摸牌时,你令摸牌数+2。", haruko_zhuishi: "追逝", - haruko_zhuishi_info: - "一名角色的判定阶段开始时,若其判定区内有牌,则你可以获得其判定区内的所有牌。若你的体力值大于1,你失去1点体力。", + haruko_zhuishi_info: "一名角色的判定阶段开始时,若其判定区内有牌,则你可以获得其判定区内的所有牌。若你的体力值大于1,你失去1点体力。", umi_chaofan: "炒饭", - umi_chaofan_info: - "出牌阶段限一次,你可以弃置两张花色不同的手牌并选择一名其他角色。你摸一张牌,若你的体力值:大于2,目标角色回复1点体力;等于2,目标角色摸两张牌;小于2,目标角色受到1点无来源且对应渠道为这两张牌的火焰伤害。", + umi_chaofan_info: "出牌阶段限一次,你可以弃置两张花色不同的手牌并选择一名其他角色。你摸一张牌,若你的体力值:大于2,目标角色回复1点体力;等于2,目标角色摸两张牌;小于2,目标角色受到1点无来源且对应渠道为这两张牌的火焰伤害。", umi_lunhui: "轮回", - umi_lunhui_info: - "一名其他角色的回合结束时,若你的手牌数小于体力值,则你可以失去1点体力。若如此做,你摸两张牌并进行一个额外回合,且你于此回合内计算与此角色的距离视为1。", + umi_lunhui_info: "一名其他角色的回合结束时,若你的手牌数小于体力值,则你可以失去1点体力。若如此做,你摸两张牌并进行一个额外回合,且你于此回合内计算与此角色的距离视为1。", umi_shiroha: "轮回 - 延时效果", umi_qihuan: "七幻", - umi_qihuan_info: - "限定技,当你处于濒死状态时,你可以移去此武将牌。若如此做,你回复X点体力(X为场上势力数)。然后,你可获得场上已死亡角色武将牌上的至多两个技能。", + umi_qihuan_info: "限定技,当你处于濒死状态时,你可以移去此武将牌。若如此做,你回复X点体力(X为场上势力数)。然后,你可获得场上已死亡角色武将牌上的至多两个技能。", komari_tiankou: "甜口", - komari_tiankou_info: - "锁定技,当你使用红色的非伤害性基本牌/锦囊牌选择目标时,或成为其他角色使用的这些牌的目标时,你选择一项:1.摸一张牌;2.为此牌增加一个目标。", + komari_tiankou_info: "锁定技,当你使用红色的非伤害性基本牌/锦囊牌选择目标时,或成为其他角色使用的这些牌的目标时,你选择一项:1.摸一张牌;2.为此牌增加一个目标。", komari_xueshang: "血殇", - komari_xueshang_info: - "锁定技,蓄能技,当有角色死亡时,你对自己造成1点伤害,然后对所有其他角色依次造成1点伤害。当有角色因此法进入濒死状态时,你加1点体力上限并回复1点体力,然后失去此技能并终止此技能的所有后续结算。", + komari_xueshang_info: "锁定技,蓄能技,当有角色死亡时,你对自己造成1点伤害,然后对所有其他角色依次造成1点伤害。当有角色因此法进入濒死状态时,你加1点体力上限并回复1点体力,然后失去此技能并终止此技能的所有后续结算。", yukine_wenzhou: "问咒", - yukine_wenzhou_info: - "一名角色的出牌阶段开始时,其可以交给你一张牌。若如此做,你选择一项:交给其一张牌,或令其从牌堆中获得一张与此牌类型相同的牌,且其于此阶段内使用与此牌牌名相同的牌时无法被响应。", + yukine_wenzhou_info: "一名角色的出牌阶段开始时,其可以交给你一张牌。若如此做,你选择一项:交给其一张牌,或令其从牌堆中获得一张与此牌类型相同的牌,且其于此阶段内使用与此牌牌名相同的牌时无法被响应。", //如果对自己发动【问咒】,则自己可以响应这些牌。但其他角色发动【问咒】时,该角色自己并不能响应 yusa_yanyi: "演艺", - yusa_yanyi_info: - "出牌阶段限一次,你可以指定至多X名与你距离不大于你的体力值的角色。这些角色选择一项:①令你摸一张牌。②回复1点体力,然后交给你一张牌。(X为你的攻击范围且至少为1)", + yusa_yanyi_info: "出牌阶段限一次,你可以指定至多X名与你距离不大于你的体力值的角色。这些角色选择一项:①令你摸一张牌。②回复1点体力,然后交给你一张牌。(X为你的攻击范围且至少为1)", misa_yehuo: "业火", - misa_yehuo_info: - "一名角色的摸牌阶段开始时,若其在你的攻击范围内,你可以弃置X张牌并选择一项:①对其造成1点火属性伤害。②令其于此摸牌阶段放弃摸牌。(X为你与其的的距离)", + misa_yehuo_info: "一名角色的摸牌阶段开始时,若其在你的攻击范围内,你可以弃置X张牌并选择一项:①对其造成1点火属性伤害。②令其于此摸牌阶段放弃摸牌。(X为你与其的的距离)", yusa_misa: "通灵", yusa_misa_info: "当你发动的〖演艺〗结算完成之后,你可以将武将牌翻面。", misa_yusa: "归魂", misa_yusa_info: "当你发动的〖业火〗结算完成后,你可以将武将牌翻面。", masato_baoquan: "暴拳", - masato_baoquan_info: - "锁定技,当你即将造成伤害时,你选择一项:1.令此伤害+2并减1点体力上限。2.防止此伤害。", + masato_baoquan_info: "锁定技,当你即将造成伤害时,你选择一项:1.令此伤害+2并减1点体力上限。2.防止此伤害。", iwasawa_yinhang: "引吭", - iwasawa_yinhang_info: - "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", + iwasawa_yinhang_info: "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", iwasawa_mysong: "My Song", - iwasawa_mysong_info: - "锁定技,当你即将进行濒死结算时,取消之。回合开始时,若你的体力值小于1,则你获得技能〖奋音〗直到回合结束。回合结束时,若你的体力值小于1,你死亡。", + iwasawa_mysong_info: "锁定技,当你即将进行濒死结算时,取消之。回合开始时,若你的体力值小于1,则你获得技能〖奋音〗直到回合结束。回合结束时,若你的体力值小于1,你死亡。", iwasawa_fenyin: "奋音", - iwasawa_fenyin_info: - "你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。", + iwasawa_fenyin_info: "你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。", iwasawa_refenyin: "奋音", - iwasawa_refenyin_info: - "锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。", + iwasawa_refenyin_info: "锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。", //卡牌花色的计算不受〖红颜〗等技能的影响 kengo_weishang: "伪伤", kengo_weishang_sha: "伪伤", kengo_weishang_shan: "伪伤", - kengo_weishang_info: - "出牌阶段限一次,你可以废除一个装备栏并摸两张牌。若你的武器栏已废除,则你使用【杀】的次数上限+1,且当你使用【杀】指定目标后,目标角色弃置一张牌;若你的防具栏已废除,则你可以将一张牌当做【闪】使用或打出;若你的攻击/防御坐骑栏已废除,则你至其他角色的距离-1/其他角色至你的距离-1。", + kengo_weishang_info: "出牌阶段限一次,你可以废除一个装备栏并摸两张牌。若你的武器栏已废除,则你使用【杀】的次数上限+1,且当你使用【杀】指定目标后,目标角色弃置一张牌;若你的防具栏已废除,则你可以将一张牌当做【闪】使用或打出;若你的攻击/防御坐骑栏已废除,则你至其他角色的距离-1/其他角色至你的距离-1。", kengo_guidui: "归队", - kengo_guidui_info: - "锁定技,准备阶段,若你有已废除的装备栏,则你恢复这些装备栏,且本局游戏内发动【伪伤】时不能废除这些装备栏。", + kengo_guidui_info: "锁定技,准备阶段,若你有已废除的装备栏,则你恢复这些装备栏,且本局游戏内发动【伪伤】时不能废除这些装备栏。", yoshino_jueyi: "决义", - yoshino_jueyi_info: - "出牌阶段开始时,你可以选择一名其他角色。你摸一张牌并与其猜拳(平局则重来)。若你赢,你对其造成1点伤害。若你没赢,你本阶段内使用牌时不能指定其为目标。", + yoshino_jueyi_info: "出牌阶段开始时,你可以选择一名其他角色。你摸一张牌并与其猜拳(平局则重来)。若你赢,你对其造成1点伤害。若你没赢,你本阶段内使用牌时不能指定其为目标。", yui_jiang: "激昂", - yui_jiang_info: - "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", + yui_jiang_info: "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", yui_lieyin: "烈音", - yui_lieyin_info: - "锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。", + yui_lieyin_info: "锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。", yui_takaramono: "珍宝", - yui_takaramono_info: - "觉醒技,准备阶段,若你满足以下条件中的至少两个:①体力值不大于1;②场上有已死亡的角色;③已因〖激昂〗累计获得过至少三张牌;则你获得技能〖引吭〗,将〖烈音〗描述中的「你选择」改为「你可选择」,然后加1点体力上限并回复1点体力。", + yui_takaramono_info: "觉醒技,准备阶段,若你满足以下条件中的至少两个:①体力值不大于1;②场上有已死亡的角色;③已因〖激昂〗累计获得过至少三张牌;则你获得技能〖引吭〗,将〖烈音〗描述中的「你选择」改为「你可选择」,然后加1点体力上限并回复1点体力。", //ユイ/孙笨双将组合时,孙笨的〖激昂〗不计入〖珍宝〗的次数统计 yui_yinhang: "引吭", - yui_yinhang_info: - "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", + yui_yinhang_info: "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", tsumugi_mugyu: "姆啾", - tsumugi_mugyu_info: - "当你成为牌的目标后,若你的手牌数小于体力上限,则你可以摸一张牌。", + tsumugi_mugyu_info: "当你成为牌的目标后,若你的手牌数小于体力上限,则你可以摸一张牌。", tsumugi_huilang: "回廊", tsumugi_huilang2: "回廊", - tsumugi_huilang_info: - "回合结束时,你可以将任意张牌扣置于武将牌下(均称为「隐」)。回合开始时,你获得所有「隐」,然后可令等量的角色各摸一张牌。", + tsumugi_huilang_info: "回合结束时,你可以将任意张牌扣置于武将牌下(均称为「隐」)。回合开始时,你获得所有「隐」,然后可令等量的角色各摸一张牌。", //〖回廊〗涉及的所有卡牌移动的结算不会触发〖良姻〗 haruka_shuangche: "双掣", kanata_shuangche: "双掣", haruka_shuangche_backup: "双掣", - haruka_shuangche_info: - "出牌阶段,你可以视为使用任意基本牌或普通锦囊牌。此牌结算完成后,你选择一项:1.弃置X张牌。2.失去1点体力且本回合内不能再发动〖双掣〗。(X为你于此回合内发动过〖双掣〗的次数)", + haruka_shuangche_info: "出牌阶段,你可以视为使用任意基本牌或普通锦囊牌。此牌结算完成后,你选择一项:1.弃置X张牌。2.失去1点体力且本回合内不能再发动〖双掣〗。(X为你于此回合内发动过〖双掣〗的次数)", //你不能以此法使用〖回魂〗 saya_shouji: "授计", - saya_shouji_info: - "每回合限一次,当你使用的牌结算完成后,你可以将此牌对应的所有实体牌交给一名其他角色。其可以使用这些牌中的一张,若如此做,你摸一张牌。", + saya_shouji_info: "每回合限一次,当你使用的牌结算完成后,你可以将此牌对应的所有实体牌交给一名其他角色。其可以使用这些牌中的一张,若如此做,你摸一张牌。", saya_powei: "破围", - saya_powei_info: - "限定技,回合结束后,你可以选择一名体力值大于你的其他角色。你与其交替进行额外回合,直到你与其中的一名角色死亡或进行到九个回合。你于回合开始时进行判定,若结果为红色,则你对其造成1点伤害。此过程中其他角色不计入距离和座次计算。", + saya_powei_info: "限定技,回合结束后,你可以选择一名体力值大于你的其他角色。你与其交替进行额外回合,直到你与其中的一名角色死亡或进行到九个回合。你于回合开始时进行判定,若结果为红色,则你对其造成1点伤害。此过程中其他角色不计入距离和座次计算。", saya_judge: "破围", saya_nodis: "破围", //〖破围〗不会因为〖铁骑〗无效 inari_baiwei: "摆尾", inari_baiwei_draw: "摆尾", - inari_baiwei_info: - "你可以将一张♦牌当做任意基本牌使用或打出。此牌结算完成后,你摸一张牌。", + inari_baiwei_info: "你可以将一张♦牌当做任意基本牌使用或打出。此牌结算完成后,你摸一张牌。", //你不能以此法使用【毒】 inari_baiwei_backup: "摆尾", inari_baiwei_sha: "摆尾", @@ -206,257 +172,183 @@ const translates = { inari_huhun: "狐魂", inari_huhun_info: "锁定技,你的♣牌的花色均视为♦。你的手牌上限+1。", shiina_qingshen: "轻身", - shiina_qingshen_info: - "当你受到或造成伤害后,你可以获得此次伤害的渠道对应的实体牌,然后将等量的牌置于你的武将牌上,称为「轻」。锁定技,你的手牌上限和攻击范围+X(X为「轻」数)。", + shiina_qingshen_info: "当你受到或造成伤害后,你可以获得此次伤害的渠道对应的实体牌,然后将等量的牌置于你的武将牌上,称为「轻」。锁定技,你的手牌上限和攻击范围+X(X为「轻」数)。", shiina_feiyan: "飞燕", - shiina_feiyan_info: - "一名其他角色的回合开始时,若其在你的攻击范围内,则你可以将一张「轻」置于弃牌堆,然后视为对其使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。你于此【杀】的结算流程中视为拥有技能〖铁骑〗。", + shiina_feiyan_info: "一名其他角色的回合开始时,若其在你的攻击范围内,则你可以将一张「轻」置于弃牌堆,然后视为对其使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。你于此【杀】的结算流程中视为拥有技能〖铁骑〗。", shiina_retieji: "铁骑", //你不能对稻荷和多鲁基发动〖飞燕〗 sunohara_chengshuang: "成双", sunohara_chengshuang_phase: "成双", - sunohara_chengshuang_info: - "锁定技,游戏开始时,你选择你的性别。回合开始时,你可以切换你的性别。", + sunohara_chengshuang_info: "锁定技,游戏开始时,你选择你的性别。回合开始时,你可以切换你的性别。", sunohara_tiaoyin: "挑引", - sunohara_tiaoyin_info: - "出牌阶段限一次,你可以弃置任意张花色各不相同的手牌,然后获得等量角色区域内的各一张牌。若你以此法获得了异性角色区域内的牌,则你失去1点体力。", + sunohara_tiaoyin_info: "出牌阶段限一次,你可以弃置任意张花色各不相同的手牌,然后获得等量角色区域内的各一张牌。若你以此法获得了异性角色区域内的牌,则你失去1点体力。", sunohara_jianren: "坚忍", - sunohara_jianren_info: - "当你受到伤害后,你可以令一名角色摸一张牌。若伤害无来源或来源与你性别不同,则改为摸三张牌。", + sunohara_jianren_info: "当你受到伤害后,你可以令一名角色摸一张牌。若伤害无来源或来源与你性别不同,则改为摸三张牌。", rin_baoqiu: "暴球", - rin_baoqiu_info: - "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", + rin_baoqiu_info: "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", sasami_miaobian: "喵变", - sasami_miaobian_info: - "当你的体力值变为:3以下时,你获得技能〖公清〗,2以下时,你获得技能〖复难〗,1以下时,你获得技能〖暴球〗。", + sasami_miaobian_info: "当你的体力值变为:3以下时,你获得技能〖公清〗,2以下时,你获得技能〖复难〗,1以下时,你获得技能〖暴球〗。", sasami_gongqing: "公清", - sasami_gongqing_info: - "锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", + sasami_gongqing_info: "锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", sasami_funan: "复难", - sasami_funan_info: - "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。", + sasami_funan_info: "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。", sasami_baoqiu: "暴球", - sasami_baoqiu_info: - "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", + sasami_baoqiu_info: "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", akane_jugu: "巨贾", - akane_jugu_info: - "锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。", + akane_jugu_info: "锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。", akane_quanqing: "权倾", - akane_quanqing_info: - "出牌阶段,你可选择:1.弃置一张点数大于10的牌并对攻击范围内的一名其他角色造成1点伤害;2.弃置一张点数大于6的牌并弃置攻击范围内的一名其他角色区域内的一张牌。3.弃置一张牌并令攻击范围内的一名其他角色摸一张牌。", + akane_quanqing_info: "出牌阶段,你可选择:1.弃置一张点数大于10的牌并对攻击范围内的一名其他角色造成1点伤害;2.弃置一张点数大于6的牌并弃置攻击范围内的一名其他角色区域内的一张牌。3.弃置一张牌并令攻击范围内的一名其他角色摸一张牌。", akane_yifu: "蚁附", akane_yifu2: "蚁附", - akane_yifu_info: - "主公技,其他键势力角色的出牌阶段限一次,其可交给你一张手牌。然后你摸一张牌,并将一张手牌交给该角色。", + akane_yifu_info: "主公技,其他键势力角色的出牌阶段限一次,其可交给你一张手牌。然后你摸一张牌,并将一张手牌交给该角色。", doruji_feiqu: "肥躯", - doruji_feiqu_info: - "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", + doruji_feiqu_info: "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", yuiko_fenglun: "锋论", - yuiko_fenglun_info: - "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本阶段内使用牌没有次数和距离限制。", + yuiko_fenglun_info: "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本阶段内使用牌没有次数和距离限制。", yuiko_dilve: "底略", - yuiko_dilve_info: - "你可以使用牌堆底的一张牌进行拼点。当你拼点后,你可以获得两张拼点牌。", + yuiko_dilve_info: "你可以使用牌堆底的一张牌进行拼点。当你拼点后,你可以获得两张拼点牌。", riki_spwenji: "问计", - riki_spwenji_info: - "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。", + riki_spwenji_info: "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。", riki_nvzhuang: "女装", - riki_nvzhuang_info: - "锁定技,此武将牌视为包含女性性别。结束阶段,若你:有手牌,你摸一张牌;没有手牌,你摸两张牌。", + riki_nvzhuang_info: "锁定技,此武将牌视为包含女性性别。结束阶段,若你:有手牌,你摸一张牌;没有手牌,你摸两张牌。", riki_mengzhong: "梦终", - riki_mengzhong_info: - "觉醒技,准备阶段,若你已因〖问计〗获得了三张或更多的牌,则你加1点体力上限并回复1点体力,失去〖问计〗并获得〖重振〗。", + riki_mengzhong_info: "觉醒技,准备阶段,若你已因〖问计〗获得了三张或更多的牌,则你加1点体力上限并回复1点体力,失去〖问计〗并获得〖重振〗。", riki_chongzhen: "重振", - riki_chongzhen_info: - "出牌阶段开始时,你可以与一名角色拼点。若你赢,你获得该角色手牌区,装备区,判定区的各一张牌;若你没赢,你于此阶段内使用牌时不能指定其他角色为目标。", + riki_chongzhen_info: "出牌阶段开始时,你可以与一名角色拼点。若你赢,你获得该角色手牌区,装备区,判定区的各一张牌;若你没赢,你于此阶段内使用牌时不能指定其他角色为目标。", hisako_yinbao: "音爆", - hisako_yinbao_info: - "当你受到伤害/回复体力后,你可以判定。若结果为♠,则你对一名其他角色造成1点雷属性伤害。", + hisako_yinbao_info: "当你受到伤害/回复体力后,你可以判定。若结果为♠,则你对一名其他角色造成1点雷属性伤害。", hisako_zhuanyun: "转运", hisako_zhuanyun_info: "锁定技,你的判定会朝向对你有利的方向倾斜。", hinata_qiulve: "球略", - hinata_qiulve_info: - "你可以将一张非基本牌当做【杀】使用或打出(无距离限制)。你以此法使用的红色【杀】不可被响应,黑色【杀】不计入使用次数限制。", + hinata_qiulve_info: "你可以将一张非基本牌当做【杀】使用或打出(无距离限制)。你以此法使用的红色【杀】不可被响应,黑色【杀】不计入使用次数限制。", hinata_ehou: "扼喉", - hinata_ehou_info: - "其他角色对你使用的牌结算完成后,你可对其使用一张【杀】。若此【杀】造成伤害,则你摸一张牌。", + hinata_ehou_info: "其他角色对你使用的牌结算完成后,你可对其使用一张【杀】。若此【杀】造成伤害,则你摸一张牌。", noda_fengcheng: "奉承", noda_fengcheng_info: "锁定技,其他角色交给你牌后,其摸一张牌。", noda_xunxin: "寻衅", noda_xunxin2: "寻衅", - noda_xunxin_info: - "出牌阶段限X次,你可以视为对一名体力值不小于你的角色使用【决斗】。若如此做,此【决斗】结算完成后,没赢的角色交给赢的角色一张牌。(X为你的体力值)", + noda_xunxin_info: "出牌阶段限X次,你可以视为对一名体力值不小于你的角色使用【决斗】。若如此做,此【决斗】结算完成后,没赢的角色交给赢的角色一张牌。(X为你的体力值)", tomoya_shangxian: "伤弦", - tomoya_shangxian_info: - "锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。", + tomoya_shangxian_info: "锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。", tomoya_wangjin: "往今", - tomoya_wangjin_info: - "每项每轮各限一次。一名其他角色的回合结束时,若其:在你的攻击范围内,你可令其摸一张牌。若其的体力值小于你,则你摸一张牌,并可交给其一张牌。不在你的攻击范围内,则你摸两张牌,并令其弃置你的一张手牌。若其的体力值大于你,则你视为对其使用一张【杀】(无距离限制)。", + tomoya_wangjin_info: "每项每轮各限一次。一名其他角色的回合结束时,若其:在你的攻击范围内,你可令其摸一张牌。若其的体力值小于你,则你摸一张牌,并可交给其一张牌。不在你的攻击范围内,则你摸两张牌,并令其弃置你的一张手牌。若其的体力值大于你,则你视为对其使用一张【杀】(无距离限制)。", nagisa_tiandu: "天妒", nagisa_tiandu_info: "当你的判定牌生效后,你可以获得此牌。", nagisa_fuxin: "抚心", - nagisa_fuxin_info: - "当一名角色于回合外受到伤害,或其手牌被其他角色弃置或获得后,你可以令其判定。若结果为:红色,其摸一张牌。黑色,当前回合角色弃置一张牌。", + nagisa_fuxin_info: "当一名角色于回合外受到伤害,或其手牌被其他角色弃置或获得后,你可以令其判定。若结果为:红色,其摸一张牌。黑色,当前回合角色弃置一张牌。", ayato_jianshen: "僭神", ayato_jianshen_info: "锁定技,你手牌中的【杀】均视为神属性。", ayato_zonghuan: "纵幻", - ayato_zonghuan_info: - "出牌阶段限一次,你可以观看一名其他角色的手牌,然后选择一项:将其中的一张牌置入弃牌堆,或以该角色的视角使用其中的一张,然后摸一张牌。", + ayato_zonghuan_info: "出牌阶段限一次,你可以观看一名其他角色的手牌,然后选择一项:将其中的一张牌置入弃牌堆,或以该角色的视角使用其中的一张,然后摸一张牌。", ao_xishi: "习事", - ao_xishi_info: - "锁定技,当你使用或打出♦牌时,或其他角色使用♦牌指定你为目标后,你摸一张牌。", + ao_xishi_info: "锁定技,当你使用或打出♦牌时,或其他角色使用♦牌指定你为目标后,你摸一张牌。", ao_kuihun: "窥魂", - ao_kuihun_info: - "其他角色进入濒死状态时,你可以摸一张牌,然后观看其手牌并将其中一张牌置于你的武将牌上,称为「蝶」。你使用与一张「蝶」花色相同的牌时无距离和次数限制。你的手牌上限+X(X为蝶数)。", + ao_kuihun_info: "其他角色进入濒死状态时,你可以摸一张牌,然后观看其手牌并将其中一张牌置于你的武将牌上,称为「蝶」。你使用与一张「蝶」花色相同的牌时无距离和次数限制。你的手牌上限+X(X为蝶数)。", ao_shixin: "释心", - ao_shixin_info: - "觉醒技,准备阶段,若你的「蝶」中包含至少三种花色,则你加1点体力上限并回复1点体力,失去〖窥魂〗并获得〖蝶归〗。", + ao_shixin_info: "觉醒技,准备阶段,若你的「蝶」中包含至少三种花色,则你加1点体力上限并回复1点体力,失去〖窥魂〗并获得〖蝶归〗。", ao_diegui: "蝶归", ao_diegui_backup: "蝶归", - ao_diegui_info: - "出牌阶段限一次,你可以将一张「蝶」交给一名角色,该角色摸两张牌并复原武将牌。", + ao_diegui_info: "出牌阶段限一次,你可以将一张「蝶」交给一名角色,该角色摸两张牌并复原武将牌。", yuzuru_wuxin: "无心", - yuzuru_wuxin_info: - "结束阶段,你可以选择一项:失去1点体力并令一名角色摸两张牌,或弃置两张牌并回复1点体力。", + yuzuru_wuxin_info: "结束阶段,你可以选择一项:失去1点体力并令一名角色摸两张牌,或弃置两张牌并回复1点体力。", yuzuru_deyi: "得义", - yuzuru_deyi_info: - "觉醒技,当有其他角色死亡后,你减1点体力上限并回复1点体力,失去技能〖无心〗,获得技能〖往生〗〖困奋〗和〖去疾〗。", + yuzuru_deyi_info: "觉醒技,当有其他角色死亡后,你减1点体力上限并回复1点体力,失去技能〖无心〗,获得技能〖往生〗〖困奋〗和〖去疾〗。", yuzuru_wangsheng: "往生", - yuzuru_wangsheng_info: - "觉醒技,当你即将死亡时,你防止此次死亡。你可以将任意张牌交给一名其他角色,然后减1点体力上限并将体力回复至2点,修改技能〖困奋〗和〖去疾〗。", + yuzuru_wangsheng_info: "觉醒技,当你即将死亡时,你防止此次死亡。你可以将任意张牌交给一名其他角色,然后减1点体力上限并将体力回复至2点,修改技能〖困奋〗和〖去疾〗。", yuzuru_kunfen: "困奋", - yuzuru_kunfen_info: - "锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。", + yuzuru_kunfen_info: "锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。", yuzuru_quji: "去疾", - yuzuru_quji_info: - "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)", + yuzuru_quji_info: "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)", yuzuru_kunfen_rewrite: "困奋·改", - yuzuru_kunfen_rewrite_info: - "锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。", + yuzuru_kunfen_rewrite_info: "锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。", yuzuru_quji_rewrite: "去疾·改", - yuzuru_quji_rewrite_info: - "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)", + yuzuru_quji_rewrite_info: "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)", yuzuru_bujin: "步进", - yuzuru_bujin_info: - "锁定技,己方其他角色计算与其他角色的距离-1且摸牌阶段的额定摸牌数+1。", + yuzuru_bujin_info: "锁定技,己方其他角色计算与其他角色的距离-1且摸牌阶段的额定摸牌数+1。", kanade_mapo: "麻婆", - kanade_mapo_info: - "你可以将一张♥牌当做【麻婆豆腐】使用。你使用的【麻婆豆腐】可以多指定一个目标。", + kanade_mapo_info: "你可以将一张♥牌当做【麻婆豆腐】使用。你使用的【麻婆豆腐】可以多指定一个目标。", kanade_benzhan: "奔战", - kanade_benzhan_info: - "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", + kanade_benzhan_info: "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", mio_tuifu: "推腐", mio_tuifu_info: "锁定技,当一名角色对一名同性角色造成伤害时,你摸一张牌。", mio_tishen: "替身", - mio_tishen_info: - "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鸟】。", + mio_tishen_info: "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鸟】。", midori_nonghuan: "弄幻", - midori_nonghuan_info: - "出牌阶段限X次(X为你的体力值),你可以获得一名本阶段内未选择过的其他角色的区域内的一张牌。你摸一张牌,然后将一张牌交给该角色。然后你清除此技能结算过程中所有卡牌移动事件的移动记录。", + midori_nonghuan_info: "出牌阶段限X次(X为你的体力值),你可以获得一名本阶段内未选择过的其他角色的区域内的一张牌。你摸一张牌,然后将一张牌交给该角色。然后你清除此技能结算过程中所有卡牌移动事件的移动记录。", //即技能结算完成后,所有涉及到的牌移动事件不会再被getHistory获取 midori_tishen: "替身", - midori_tishen_info: - "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鱼】。", + midori_tishen_info: "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鱼】。", kyoko_juwu: "聚物", - kyoko_juwu_info: - "你的回合外,当有装备牌进入弃牌堆后,若这些牌不是从你的区域移动的,则你可以获得这些牌。", + kyoko_juwu_info: "你的回合外,当有装备牌进入弃牌堆后,若这些牌不是从你的区域移动的,则你可以获得这些牌。", kyoko_zhengyi: "整遗", - kyoko_zhengyi_info: - "锁定技,若你装备区的花色数:大于等于1,你视为拥有〖精策〗;大于等于2,你视为拥有〖涉猎〗:大于等于3,你视为拥有〖制衡〗;大于等于4,你将〖精策〗和〖制衡〗改为界限突破版本。", + kyoko_zhengyi_info: "锁定技,若你装备区的花色数:大于等于1,你视为拥有〖精策〗;大于等于2,你视为拥有〖涉猎〗:大于等于3,你视为拥有〖制衡〗;大于等于4,你将〖精策〗和〖制衡〗改为界限突破版本。", kyoko_jingce: "精策", kyoko_shelie: "涉猎", kyoko_zhiheng: "制衡", shizuru_nianli: "念力", - shizuru_nianli_info: - "每轮限一次,你可以展示一张♦/♣/♥/♠手牌,然后视为使用一张不计入次数限制和记录的雷【杀】/【闪】/【桃】/【无懈可击】。", + shizuru_nianli_info: "每轮限一次,你可以展示一张♦/♣/♥/♠手牌,然后视为使用一张不计入次数限制和记录的雷【杀】/【闪】/【桃】/【无懈可击】。", shizuru_benzhan: "奔战", - shizuru_benzhan_info: - "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", + shizuru_benzhan_info: "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", shiorimiyuki_banyin: "伴音", - shiorimiyuki_banyin_info: - "当你受到伤害或回复体力后,你可令一名其他角色回复1点体力。", + shiorimiyuki_banyin_info: "当你受到伤害或回复体力后,你可令一名其他角色回复1点体力。", shiorimiyuki_tingxian: "铤险", - shiorimiyuki_tingxian_info: - "出牌阶段开始时,你可以摸至多三张牌。若如此做,你回复1点体力,且此阶段结束时你失去X点体力。(X为你得到的牌中仍在手牌区的牌的数量)", + shiorimiyuki_tingxian_info: "出牌阶段开始时,你可以摸至多三张牌。若如此做,你回复1点体力,且此阶段结束时你失去X点体力。(X为你得到的牌中仍在手牌区的牌的数量)", shiorimiyuki_tingxian2: "铤险", miki_shenqiang: "神枪", - miki_shenqiang_info: - "锁定技,游戏开始时,你将一张【海德洛格拉迪尔特·改】和一张【望远镜】置入你的装备区。你装备区内的武器牌和宝物牌不能被其他角色弃置。", + miki_shenqiang_info: "锁定技,游戏开始时,你将一张【海德洛格拉迪尔特·改】和一张【望远镜】置入你的装备区。你装备区内的武器牌和宝物牌不能被其他角色弃置。", miki_huanmeng: "幻梦", - miki_huanmeng_info: - "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)", + miki_huanmeng_info: "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)", miki_zhiluo: "治裸", - miki_zhiluo_info: - "锁定技,一名其他角色的回合结束时,若其在你的攻击范围内且其装备区内没有牌,则你选择:①摸一张牌。②视为对其使用一张【杀】。", + miki_zhiluo_info: "锁定技,一名其他角色的回合结束时,若其在你的攻击范围内且其装备区内没有牌,则你选择:①摸一张牌。②视为对其使用一张【杀】。", miki_hydrogladiator: "海德洛", - miki_hydrogladiator_info: - "全名为【海德洛格拉迪尔特·改】。锁定技,当你因执行【杀】的效果而对目标角色造成伤害后,你弃置所有至目标角色距离为1的其他角色的一张牌或弃置其两张牌。", + miki_hydrogladiator_info: "全名为【海德洛格拉迪尔特·改】。锁定技,当你因执行【杀】的效果而对目标角色造成伤害后,你弃置所有至目标角色距离为1的其他角色的一张牌或弃置其两张牌。", miki_hydrogladiator_skill: "海德洛格拉迪尔特·改", miki_binoculars: "望远镜", miki_binoculars_info: "锁定技,其他角色的手牌对你可见。", shiori_huijuan: "绘卷", shiori_huijuan_discard: "绘卷", - shiori_huijuan_info: - "锁定技,其他角色的结束阶段开始时,你可以视为使用一张该角色本回合出牌阶段内使用过的基本牌或普通锦囊牌。准备阶段开始时,若你自上个回合起以此法使用的牌数不小于X,则你选择一项:①弃置装备区或判定区内的一张牌。②跳过本回合的出牌阶段。(X为场上玩家数的一半且至少为2)", + shiori_huijuan_info: "锁定技,其他角色的结束阶段开始时,你可以视为使用一张该角色本回合出牌阶段内使用过的基本牌或普通锦囊牌。准备阶段开始时,若你自上个回合起以此法使用的牌数不小于X,则你选择一项:①弃置装备区或判定区内的一张牌。②跳过本回合的出牌阶段。(X为场上玩家数的一半且至少为2)", kaori_siyuan: "思愿", - kaori_siyuan_info: - "出牌阶段,你可以将一张装备牌或延时锦囊牌置于一名其他角色的装备区内,然后可以视为使用一张基本牌或普通锦囊牌。", + kaori_siyuan_info: "出牌阶段,你可以将一张装备牌或延时锦囊牌置于一名其他角色的装备区内,然后可以视为使用一张基本牌或普通锦囊牌。", akiko_dongcha: "洞察", - akiko_dongcha_info_identity: - "锁定技,其他角色的手牌对你可见。游戏开始时,你令其他角色的身份牌对你可见。", + akiko_dongcha_info_identity: "锁定技,其他角色的手牌对你可见。游戏开始时,你令其他角色的身份牌对你可见。", akiko_dongcha_info: "锁定技,其他角色的手牌对你可见。", abyusa_jueqing: "绝情", - abyusa_jueqing_info: - "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。", + abyusa_jueqing_info: "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。", abyusa_jueqing_1st: "绝情", abyusa_jueqing_rewrite: "绝情·改", abyusa_jueqing_rewrite_info: "锁定技,你即将造成的伤害均视为失去体力。", abyusa_dunying: "遁影", - abyusa_dunying_info: - "锁定技,其他角色计算与你的距离时+X。准备阶段和结束阶段,你摸X张牌(X为你已损失的体力值)。", + abyusa_dunying_info: "锁定技,其他角色计算与你的距离时+X。准备阶段和结束阶段,你摸X张牌(X为你已损失的体力值)。", godan_yuanyi: "远忆", - godan_yuanyi_info: - "锁定技,回合开始时,你摸X张牌并进行一个额外的出牌阶段。(X为游戏轮数且至多为3)", + godan_yuanyi_info: "锁定技,回合开始时,你摸X张牌并进行一个额外的出牌阶段。(X为游戏轮数且至多为3)", godan_feiqu: "肥躯", - godan_feiqu_info: - "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", + godan_feiqu_info: "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", godan_xiaoyuan: "消元", - godan_xiaoyuan_info: - "觉醒技,当你扣减体力时,若你的体力值小于4,则你减3点体力上限并摸三张牌,失去【肥躯】。", + godan_xiaoyuan_info: "觉醒技,当你扣减体力时,若你的体力值小于4,则你减3点体力上限并摸三张牌,失去【肥躯】。", yuu_lveduo: "掠夺", - yuu_lveduo_info: - "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", - yuu_lveduo_full_info: - "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面,获得该角色武将牌上所有的带有「Charlotte」标签的技能,且该角色失去这些技能。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", + yuu_lveduo_info: "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", + yuu_lveduo_full_info: "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面,获得该角色武将牌上所有的带有「Charlotte」标签的技能,且该角色失去这些技能。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", ryoichi_baoyi: "爆衣", - ryoichi_baoyi_info: - "锁定技,当你失去装备区内的一张牌后,你摸一张牌,然后选择一项:①令一名其他女性角色失去1点体力。②弃置一名其他非女性角色区域内的两张牌。", + ryoichi_baoyi_info: "锁定技,当你失去装备区内的一张牌后,你摸一张牌,然后选择一项:①令一名其他女性角色失去1点体力。②弃置一名其他非女性角色区域内的两张牌。", ryoichi_tuipi: "褪皮", - ryoichi_tuipi_info: - "锁定技,你不是【顺手牵羊】和【过河拆桥】的合法目标。你装备区的牌于弃牌阶段内计入手牌上限。", + ryoichi_tuipi_info: "锁定技,你不是【顺手牵羊】和【过河拆桥】的合法目标。你装备区的牌于弃牌阶段内计入手牌上限。", kotori_yumo: "驭魔", kotori_yumo_damage: "驭魔", kotori_yumo_gain: "驭魔", - kotori_yumo_info: - "锁定技,游戏开始时,你获得蓝色、红色、绿色、黄色、灰色魔物各一个。当有角色受到伤害后,若你没有对应的标记,你根据其势力获得一个对应魔物:魏:蓝、蜀:红、吴:绿、群:黄、灰:晋、键:紫。回合开始时,你可以弃置一个对应的魔物并获得以下技能之一直到回合结束:蓝:魏业、红:蜀义、绿:吴耀、黄:群心、灰:晋势、紫:键魂。", + kotori_yumo_info: "锁定技,游戏开始时,你获得蓝色、红色、绿色、黄色、灰色魔物各一个。当有角色受到伤害后,若你没有对应的标记,你根据其势力获得一个对应魔物:魏:蓝、蜀:红、吴:绿、群:黄、灰:晋、键:紫。回合开始时,你可以弃置一个对应的魔物并获得以下技能之一直到回合结束:蓝:魏业、红:蜀义、绿:吴耀、黄:群心、灰:晋势、紫:键魂。", kotori_skill_wei: "魏业", - kotori_skill_wei_info: - "回合开始时,你可以弃置一张牌并指定一名其他角色,该角色须弃置一张牌,否则你摸一张牌。", + kotori_skill_wei_info: "回合开始时,你可以弃置一张牌并指定一名其他角色,该角色须弃置一张牌,否则你摸一张牌。", kotori_skill_shu: "蜀义", - kotori_skill_shu_info: - "你使用【杀】上限+1;出牌阶段结束时,若你于此阶段使用【杀】次数不少于2,摸一张牌。", + kotori_skill_shu_info: "你使用【杀】上限+1;出牌阶段结束时,若你于此阶段使用【杀】次数不少于2,摸一张牌。", kotori_skill_wu: "吴耀", - kotori_skill_wu_info: - "回合结束时,若你的手牌数不等于你的体力值,则你摸一张牌。", + kotori_skill_wu_info: "回合结束时,若你的手牌数不等于你的体力值,则你摸一张牌。", kotori_skill_qun: "群心", - kotori_skill_qun_info: - "锁定技,弃牌阶段开始时,若你的手牌数比体力值多2或更多,你本回合手牌上限+1;若你已损失体力值大于1,你手牌上限+1。", + kotori_skill_qun_info: "锁定技,弃牌阶段开始时,若你的手牌数比体力值多2或更多,你本回合手牌上限+1;若你已损失体力值大于1,你手牌上限+1。", kotori_skill_key: "键魂", - kotori_skill_key_info: - "出牌阶段限一次,你可以摸一张牌并获得1点护甲。若如此做,你于当前回合结束时失去1点体力。", + kotori_skill_key_info: "出牌阶段限一次,你可以摸一张牌并获得1点护甲。若如此做,你于当前回合结束时失去1点体力。", kotori_skill_jin: "晋势", - kotori_skill_jin_info: - "摸牌阶段结束时,你可以展示你于此阶段内因摸牌而得到的牌。若这些牌的花色均不同,则你摸一张牌。", + kotori_skill_jin_info: "摸牌阶段结束时,你可以展示你于此阶段内因摸牌而得到的牌。若这些牌的花色均不同,则你摸一张牌。", kotori_yumo_wei: '魔物', kotori_yumo_shu: '魔物', kotori_yumo_wu: '魔物', @@ -464,157 +356,106 @@ const translates = { kotori_yumo_key: '魔物', kotori_yumo_jin: '魔物', kotori_huazhan: "花绽", - kotori_huazhan_info: - "每回合每种魔物限一次,你可将一个蓝色/红色/绿色/黄色/紫色/灰色魔物当做【树上开花】使用。", + kotori_huazhan_info: "每回合每种魔物限一次,你可将一个蓝色/红色/绿色/黄色/紫色/灰色魔物当做【树上开花】使用。", jojiro_shensu: "神速", - jojiro_shensu_info: - "你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。", + jojiro_shensu_info: "你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。", jojiro_shensu1: "神速", jojiro_shensu2: "神速", jojiro_shensu4: "神速", jojiro_shunying: "瞬影", - jojiro_shunying_info: - "锁定技,回合结束时,若你本回合内跳过了阶段,则你选择一项:1.失去1点体力。2.移动至多X格并摸X张牌(X为你本回合内跳过的阶段数)。", + jojiro_shunying_info: "锁定技,回合结束时,若你本回合内跳过了阶段,则你选择一项:1.失去1点体力。2.移动至多X格并摸X张牌(X为你本回合内跳过的阶段数)。", shiroha_yuzhao: "预兆", shiroha_yuzhao_umi: "预兆", - shiroha_yuzhao_info: - "锁定技,游戏开始时,你将牌堆顶的X张牌扣置于你的武将牌上,称为「兆」。一名角色的回合开始时,若你有「兆」且其至你的距离不大于1,则你将牌堆顶的X张牌扣置为「兆」,然后将等量的「兆」置于牌堆顶。(X为势力数)", + shiroha_yuzhao_info: "锁定技,游戏开始时,你将牌堆顶的X张牌扣置于你的武将牌上,称为「兆」。一名角色的回合开始时,若你有「兆」且其至你的距离不大于1,则你将牌堆顶的X张牌扣置为「兆」,然后将等量的「兆」置于牌堆顶。(X为势力数)", shiroha_guying: "孤影", - shiroha_guying_info: - "锁定技,每回合限一次,当你受到伤害/对其他角色造成伤害时,你进行判定。若结果为红色/黑色,此伤害-1/+1。", + shiroha_guying_info: "锁定技,每回合限一次,当你受到伤害/对其他角色造成伤害时,你进行判定。若结果为红色/黑色,此伤害-1/+1。", shiroha_guying_rewrite: "孤影·改", - shiroha_guying_rewrite_info: - "当你受到伤害/对其他角色造成伤害时,你可进行判定。若结果为红色/黑色,此伤害-1/+1。", + shiroha_guying_rewrite_info: "当你受到伤害/对其他角色造成伤害时,你可进行判定。若结果为红色/黑色,此伤害-1/+1。", shiroha_jiezhao: "解兆", - shiroha_jiezhao_info: - "一名角色的判定牌生效前,你可打出一张「兆」代替之。当你以此法移去最后一张「兆」后,你加1点体力上限并回复1点体力,然后修改〖孤影〗并随机获得以下技能中的一个:〖炒饭〗/〖习事〗/〖呣啾〗/〖结伴〗。", + shiroha_jiezhao_info: "一名角色的判定牌生效前,你可打出一张「兆」代替之。当你以此法移去最后一张「兆」后,你加1点体力上限并回复1点体力,然后修改〖孤影〗并随机获得以下技能中的一个:〖炒饭〗/〖习事〗/〖呣啾〗/〖结伴〗。", //猴年马月爆料再利用 shizuku_sizhi: "思智", shizuku_sizhi2: "思智", - shizuku_sizhi_info: - "出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离和次数限制,红色牌本回合不计入手牌上限。", + shizuku_sizhi_info: "出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离和次数限制,红色牌本回合不计入手牌上限。", shizuku_biyi: "避忆", - shizuku_biyi_info: - "当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。", + shizuku_biyi_info: "当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。", shizuku_sanhua: "散花", - shizuku_sanhua_info: - "当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。", + shizuku_sanhua_info: "当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。", hiroto_huyu: "虎驭", hiroto_huyu2: "虎驭", - hiroto_huyu_info: - "其他角色的出牌阶段结束时,若你没有技能〖纵略〗,则其可将两张手牌交给你。若如此做,你获得〖纵略〗。你的下回合结束时,你失去〖纵略〗并将本回合内得到的所有牌交给该角色。", + hiroto_huyu_info: "其他角色的出牌阶段结束时,若你没有技能〖纵略〗,则其可将两张手牌交给你。若如此做,你获得〖纵略〗。你的下回合结束时,你失去〖纵略〗并将本回合内得到的所有牌交给该角色。", hiroto_zonglve: "纵略", - hiroto_zonglve_info: - "锁定技,你的手牌上限+3。出牌阶段限一次,你可以将一张手牌背面朝下放置,并展示一名其他角色的一张手牌。若这两张牌:颜色相同,你对其造成1点伤害并弃置其展示的牌。颜色不同,你获得该角色区域内的两张牌。", + hiroto_zonglve_info: "锁定技,你的手牌上限+3。出牌阶段限一次,你可以将一张手牌背面朝下放置,并展示一名其他角色的一张手牌。若这两张牌:颜色相同,你对其造成1点伤害并弃置其展示的牌。颜色不同,你获得该角色区域内的两张牌。", hiroto_tuolao: "脱牢", - hiroto_tuolao_info: - "觉醒技,回合结束后,若此回合不是你的第一个回合且你本轮内未因〖虎驭〗失去过牌,则你摸三张牌,失去〖虎驭〗并获得〖纵略〗。", + hiroto_tuolao_info: "觉醒技,回合结束后,若此回合不是你的第一个回合且你本轮内未因〖虎驭〗失去过牌,则你摸三张牌,失去〖虎驭〗并获得〖纵略〗。", sakuya_junbu: "均步", - sakuya_junbu_info: - "锁定技,若你已废除的装备栏数量:≥1,你使用牌无距离限制。≥2,你使用牌无次数限制。≥3,你使用牌时可以多指定一个目标。≥4,你使用的牌不可被响应。≥5,你使用牌造成伤害时失去1点体力,令此伤害+1。", + sakuya_junbu_info: "锁定技,若你已废除的装备栏数量:≥1,你使用牌无距离限制。≥2,你使用牌无次数限制。≥3,你使用牌时可以多指定一个目标。≥4,你使用的牌不可被响应。≥5,你使用牌造成伤害时失去1点体力,令此伤害+1。", rumi_shuwu: "淑武", rumi_shuwu2: "淑武", - rumi_shuwu_info: - "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。出牌阶段结束时,你令X=0,且每满足一项便令X+1:①你于本阶段内使用【杀】的次数不大于1。②你于本阶段内未使用锦囊牌造成过伤害。③你的体力值不大于3。你摸X张牌,且本回合手牌上限+X。", + rumi_shuwu_info: "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。出牌阶段结束时,你令X=0,且每满足一项便令X+1:①你于本阶段内使用【杀】的次数不大于1。②你于本阶段内未使用锦囊牌造成过伤害。③你的体力值不大于3。你摸X张牌,且本回合手牌上限+X。", chihaya_liewu: "烈武", chihaya_liewu2: "烈武", - chihaya_liewu_info: - "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。当你首次废除最后一个装备栏后,你减4点体力上限并获得技能〖怀柔〗。", + chihaya_liewu_info: "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。当你首次废除最后一个装备栏后,你减4点体力上限并获得技能〖怀柔〗。", chihaya_youfeng: "游凤", - chihaya_youfeng_info: - "转换技,阴,每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。", + chihaya_youfeng_info: "转换技,阴,每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。", chihaya_huairou: "怀柔", chihaya_huairou_info: "出牌阶段,你可以重铸装备牌。", yukito_kongwu: "控物", - yukito_kongwu_info: - "出牌阶段限一次,你可以表演《小空飞天》。若如此做,你从以下项目中随机选择X项,并执行其中的一项:①令一名角色摸两张牌。②对一名角色造成1点伤害。③令一名已受伤的角色回复1点体力。④弃置一名角色区域内的两张牌。⑤移动场上的一张牌。若X=0,则你弃置两张牌。(X为你的得分)", + yukito_kongwu_info: "出牌阶段限一次,你可以表演《小空飞天》。若如此做,你从以下项目中随机选择X项,并执行其中的一项:①令一名角色摸两张牌。②对一名角色造成1点伤害。③令一名已受伤的角色回复1点体力。④弃置一名角色区域内的两张牌。⑤移动场上的一张牌。若X=0,则你弃置两张牌。(X为你的得分)", yukito_yaxiang: "鸦翔", - yukito_yaxiang_info: - "限定技,当有角色进入濒死状态时,你可移去此武将牌,然后令该角色将体力值回复至3点,弃置判定区的所有牌并获得技能〖终愿〗。", + yukito_yaxiang_info: "限定技,当有角色进入濒死状态时,你可移去此武将牌,然后令该角色将体力值回复至3点,弃置判定区的所有牌并获得技能〖终愿〗。", misuzu_zhongyuan: "终愿", - misuzu_zhongyuan_info: - "限定技。当你的判定结果生效时,你可将判定结果改为任意花色和点数并结束此时机。", + misuzu_zhongyuan_info: "限定技。当你的判定结果生效时,你可将判定结果改为任意花色和点数并结束此时机。", asara_shelu: "摄录", - asara_shelu_info: - "出牌阶段限一次,你可以弃置一张牌,然后展示一名其他角色的一张手牌并将其置于你的武将牌上,称为“影”。若你以此法弃置的牌和展示的牌:花色相同,则你摸两张牌。点数相同,则你回复1点体力。", + asara_shelu_info: "出牌阶段限一次,你可以弃置一张牌,然后展示一名其他角色的一张手牌并将其置于你的武将牌上,称为“影”。若你以此法弃置的牌和展示的牌:花色相同,则你摸两张牌。点数相同,则你回复1点体力。", asara_yingwei: "影威", - asara_yingwei_info: - "你可以如手牌般使用或打出“影”。锁定技,当你使用“影”时,强制触发对应的应变效果。", + asara_yingwei_info: "你可以如手牌般使用或打出“影”。锁定技,当你使用“影”时,强制触发对应的应变效果。", kotomi_qinji: "琴击", - kotomi_qinji_info: - "出牌阶段开始时,你可视为使用使用【万箭齐发】。你以此法使用【万箭齐发】造成的伤害视为失去体力。", + kotomi_qinji_info: "出牌阶段开始时,你可视为使用使用【万箭齐发】。你以此法使用【万箭齐发】造成的伤害视为失去体力。", kotomi_chuanxiang: "传箱", kotomi_chuanxiang2: "传箱", - kotomi_chuanxiang_info: - "其他角色的出牌阶段限一次,其可以将装备区内的一张牌移动到另一名角色的装备区内,然后你摸一张牌。若你是目标角色,则你改为摸两张牌。", + kotomi_chuanxiang_info: "其他角色的出牌阶段限一次,其可以将装备区内的一张牌移动到另一名角色的装备区内,然后你摸一张牌。若你是目标角色,则你改为摸两张牌。", mia_shihui: "时迴", - mia_shihui_info: - "锁定技,摸牌阶段,你改为摸X+1张牌(X为你上回合弃置的牌数);结束阶段,你弃置一张牌并回复1点体力。", + mia_shihui_info: "锁定技,摸牌阶段,你改为摸X+1张牌(X为你上回合弃置的牌数);结束阶段,你弃置一张牌并回复1点体力。", mia_qianmeng: "潜梦", - mia_qianmeng_info: - "使命技。①游戏开始时,你摸一张牌,然后将一张牌置于牌堆的正中央。②使命:当有角色获得“潜梦”牌时,其将此牌交给你。你将体力值回复至上限,失去〖时迴〗并获得〖风发〗。③失败:当你死亡时,你可令一名角色获得牌堆中所有与“潜梦”牌花色点数相同的牌。", + mia_qianmeng_info: "使命技。①游戏开始时,你摸一张牌,然后将一张牌置于牌堆的正中央。②使命:当有角色获得“潜梦”牌时,其将此牌交给你。你将体力值回复至上限,失去〖时迴〗并获得〖风发〗。③失败:当你死亡时,你可令一名角色获得牌堆中所有与“潜梦”牌花色点数相同的牌。", mia_fengfa: "风发", - mia_fengfa_info: - "锁定技。摸牌阶段,你多摸X张牌(X为你上回合使用过的牌数)。", + mia_fengfa_info: "锁定技。摸牌阶段,你多摸X张牌(X为你上回合使用过的牌数)。", kano_liezhen: "列阵", - kano_liezhen_info: - "结束阶段,若你本回合内使用过牌且这些牌的类型:不均相同,你可视为使用【排兵布阵】或智囊;均相同,你获得仁库中的所有牌(没有则改为摸两张牌)。", + kano_liezhen_info: "结束阶段,若你本回合内使用过牌且这些牌的类型:不均相同,你可视为使用【排兵布阵】或智囊;均相同,你获得仁库中的所有牌(没有则改为摸两张牌)。", kano_paibingbuzhen: "排兵布阵", - kano_paibingbuzhen_info: - "出牌阶段,对至多三名角色使用。目标角色摸一张牌,然后将一张牌置入仁库。若仁库中的牌类型或颜色均相同,则你摸一张牌。", + kano_paibingbuzhen_info: "出牌阶段,对至多三名角色使用。目标角色摸一张牌,然后将一张牌置入仁库。若仁库中的牌类型或颜色均相同,则你摸一张牌。", kano_poyu: "破羽", - kano_poyu_info: - "当你成为【杀】或伤害性锦囊牌的目标后,若仁库中有牌,你可判定。然后你可从仁库中移去一张与此牌类型或花色相同的牌,令此牌对你无效。", + kano_poyu_info: "当你成为【杀】或伤害性锦囊牌的目标后,若仁库中有牌,你可判定。然后你可从仁库中移去一张与此牌类型或花色相同的牌,令此牌对你无效。", liyingxia_sanli: "三礼", - liyingxia_sanli_info: - "锁定技。其他角色于其回合内前两次使用牌指定你为目标后,你摸一张牌;第三次使用牌指定你为目标后,你交给其一张牌。", + liyingxia_sanli_info: "锁定技。其他角色于其回合内前两次使用牌指定你为目标后,你摸一张牌;第三次使用牌指定你为目标后,你交给其一张牌。", liyingxia_zhenjun: "振军", - liyingxia_zhenjun_info: - "键势力技。结束阶段,你可以令至多X+1名角色各摸一张牌,且这些角色于自己的下个回合内第一次造成的伤害+1(X为你本回合内使用【杀】和伤害性锦囊牌的次数)。", + liyingxia_zhenjun_info: "键势力技。结束阶段,你可以令至多X+1名角色各摸一张牌,且这些角色于自己的下个回合内第一次造成的伤害+1(X为你本回合内使用【杀】和伤害性锦囊牌的次数)。", liyingxia_wumai: "武脉", - liyingxia_wumai_info: - "蜀势力技。一轮游戏开始时,你可以选择获得其中一个未选择过的技能直到本轮结束:〖八阵〗/〖集智〗/〖观星〗/〖游龙〗。若均已选择过,则你可以摸X张牌(X为场上已受伤的角色数且至多为3)。", + liyingxia_wumai_info: "蜀势力技。一轮游戏开始时,你可以选择获得其中一个未选择过的技能直到本轮结束:〖八阵〗/〖集智〗/〖观星〗/〖游龙〗。若均已选择过,则你可以摸X张牌(X为场上已受伤的角色数且至多为3)。", erika_shisong: "识诵", - erika_shisong_info: - "锁定技。①你的手牌上限+X(X为你的护甲数)。②当你于回合内使用第Y张牌时,若此牌与你上回合使用的第Y张牌类型相同,则你摸一张牌。", + erika_shisong_info: "锁定技。①你的手牌上限+X(X为你的护甲数)。②当你于回合内使用第Y张牌时,若此牌与你上回合使用的第Y张牌类型相同,则你摸一张牌。", erika_yousheng: "佑生", - erika_yousheng_info: - "使命技。①限定技。一轮游戏开始时,你可以选择至多两名其他角色。你减2点体力上限并增加3点护甲。②当你〖佑生①〗选择的角色成为【杀】或伤害类锦囊牌的目标时,你可以弃置X张牌并将此目标转移给自己(X为你本轮内发动过〖佑生②〗的次数)。此牌结算结束后,你可令一名原目标角色获得此牌。③成功:当你失去最后的护甲后,若你已发动过〖佑生①〗,则你和所有〖佑生①〗选择的角色各摸三张牌。④失败:当一名〖佑生①〗选择的角色因【杀】或伤害类锦囊牌而受到伤害时,你失去所有护甲并弃置等量的牌。", - erika_yousheng_append: - 'Death is not the end of life, but the completion of life.', + erika_yousheng_info: "使命技。①限定技。一轮游戏开始时,你可以选择至多两名其他角色。你减2点体力上限并增加3点护甲。②当你〖佑生①〗选择的角色成为【杀】或伤害类锦囊牌的目标时,你可以弃置X张牌并将此目标转移给自己(X为你本轮内发动过〖佑生②〗的次数)。此牌结算结束后,你可令一名原目标角色获得此牌。③成功:当你失去最后的护甲后,若你已发动过〖佑生①〗,则你和所有〖佑生①〗选择的角色各摸三张牌。④失败:当一名〖佑生①〗选择的角色因【杀】或伤害类锦囊牌而受到伤害时,你失去所有护甲并弃置等量的牌。", + erika_yousheng_append: 'Death is not the end of life, but the completion of life.', satomi_luodao: "落刀", - satomi_luodao_info: - "当你使用【杀】指定目标后,你可以展示目标角色的所有手牌。若其中:有【闪】,则你弃置其中的一张【闪】;没有【闪】,则你弃置一张牌。", + satomi_luodao_info: "当你使用【杀】指定目标后,你可以展示目标角色的所有手牌。若其中:有【闪】,则你弃置其中的一张【闪】;没有【闪】,则你弃置一张牌。", satomi_daohai: "稻海", - satomi_daohai_info: - "结束阶段,若你本回合内弃置过牌,则你可以视为使用一张【五谷丰登】。然后你可以将你于此【五谷丰登】中得到的牌当做【乐不思蜀】使用。", - satomi_daohai_append: - '五穀豊穣、刈り入れ時だね!', + satomi_daohai_info: "结束阶段,若你本回合内弃置过牌,则你可以视为使用一张【五谷丰登】。然后你可以将你于此【五谷丰登】中得到的牌当做【乐不思蜀】使用。", + satomi_daohai_append: '五穀豊穣、刈り入れ時だね!', tenzen_fenghuan: "封还", - tenzen_fenghuan_info: - "其他角色使用的【杀】或伤害性锦囊牌结算结束后,若你是此牌的唯一目标,则你可以弃置任意张点数之和大于等于此牌点数两倍的牌,然后视为对其使用一张名称相同的牌。", + tenzen_fenghuan_info: "其他角色使用的【杀】或伤害性锦囊牌结算结束后,若你是此牌的唯一目标,则你可以弃置任意张点数之和大于等于此牌点数两倍的牌,然后视为对其使用一张名称相同的牌。", tenzen_retianquan: "天全", - tenzen_retianquan_info: - "每回合限一次。当你使用【杀】指定目标后,你可失去1点体力或弃置一张牌,然后亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。这些牌中每有一张基本牌,响应此牌所需的【闪】的数量便+1。此牌结算结束后,若此牌造成过伤害,则你获得展示牌中的所有非基本牌。", + tenzen_retianquan_info: "每回合限一次。当你使用【杀】指定目标后,你可失去1点体力或弃置一张牌,然后亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。这些牌中每有一张基本牌,响应此牌所需的【闪】的数量便+1。此牌结算结束后,若此牌造成过伤害,则你获得展示牌中的所有非基本牌。", iriya_yinji: "殷极", - iriya_yinji_info: - "锁定技。出牌阶段开始时,你将手牌摸至17张。你不能直接使用以此法得到的牌。", + iriya_yinji_info: "锁定技。出牌阶段开始时,你将手牌摸至17张。你不能直接使用以此法得到的牌。", iriya_haozhi: "豪掷", - iriya_haozhi_info: - "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。" + - "对子:其可以令至多两名角色各摸一张牌。" + - "三带:其可以弃置至多三名其他角色的各一张牌,然后摸一张牌。" + - "单顺:其可以弃置一名其他角色的一张牌。若其未以此法弃置过颜色相同的牌,则其可以重复此流程。然后其摸等量的牌。" + - "双顺:其可以获得一名其他角色的一张牌。若其未以此法获得过颜色相同的牌,则其可以重复此流程。然后其回复等量的体力。" + - "三顺/飞机:其可以令至多3名其他角色翻面,然后对其中一名角色造成1点火属性伤害。" + - "炸弹/四带二:其可以对一名角色造成2点雷属性伤害,然后目标角色翻面,弃置装备区的所有牌和四张手牌。", + iriya_haozhi_info: "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。" + "对子:其可以令至多两名角色各摸一张牌。" + "三带:其可以弃置至多三名其他角色的各一张牌,然后摸一张牌。" + "单顺:其可以弃置一名其他角色的一张牌。若其未以此法弃置过颜色相同的牌,则其可以重复此流程。然后其摸等量的牌。" + "双顺:其可以获得一名其他角色的一张牌。若其未以此法获得过颜色相同的牌,则其可以重复此流程。然后其回复等量的体力。" + "三顺/飞机:其可以令至多3名其他角色翻面,然后对其中一名角色造成1点火属性伤害。" + "炸弹/四带二:其可以对一名角色造成2点雷属性伤害,然后目标角色翻面,弃置装备区的所有牌和四张手牌。", visible_fuuko_xingdiao: '', fuuko_xingdiao: "星雕", - fuuko_xingdiao_info: - "锁定技。游戏开始时,你将手牌摸至8张,然后将所有手牌明置(称为“星”,不计入手牌上限)。每名其他角色限一次,其可以于出牌阶段选择获得你的一张“星”,然后你摸一张牌。", + fuuko_xingdiao_info: "锁定技。游戏开始时,你将手牌摸至8张,然后将所有手牌明置(称为“星”,不计入手牌上限)。每名其他角色限一次,其可以于出牌阶段选择获得你的一张“星”,然后你摸一张牌。", fuuko_chuanyuan: "传愿", - fuuko_chuanyuan_info: - "锁定技。当你失去一张“星”后,你回复1点体力,然后从牌堆中获得一张和“星”花色点数相同的牌(没有则改为摸一张牌,且使用此牌无距离和次数限制)。", + fuuko_chuanyuan_info: "锁定技。当你失去一张“星”后,你回复1点体力,然后从牌堆中获得一张和“星”花色点数相同的牌(没有则改为摸一张牌,且使用此牌无距离和次数限制)。", }; export default translates; diff --git a/character/key/voices.js b/character/key/voices.js index 412e49203..6407f2a48 100644 --- a/character/key/voices.js +++ b/character/key/voices.js @@ -1,10 +1,10 @@ -export default { - "#yuri_xingdong1": "では、オペレーション・スターーート!!", - "#yuri_xingdong2": "では、オペレーション・スタート!", - "#yuri_xingdong3": "では、オペレーションスタート!", - "#yuri_xingdong_gain1": "…さすがね、あたしの勘。", - "#yuri_xingdong_gain2": "あたしの予想ではね。", - "#yuri_wangxi1": "賢明ね。これでようやくあなたにも戦線で戦う目的が生まれたってわけね。", - "#yuri_wangxi2": "落ち着いて…ここは地獄なんかじゃないわ。", - "#key_yuri:die": "ひどい…リーダーね。", -}; \ No newline at end of file +export default { + "#yuri_xingdong1": "では、オペレーション・スターーート!!", + "#yuri_xingdong2": "では、オペレーション・スタート!", + "#yuri_xingdong3": "では、オペレーションスタート!", + "#yuri_xingdong_gain1": "…さすがね、あたしの勘。", + "#yuri_xingdong_gain2": "あたしの予想ではね。", + "#yuri_wangxi1": "賢明ね。これでようやくあなたにも戦線で戦う目的が生まれたってわけね。", + "#yuri_wangxi2": "落ち着いて…ここは地獄なんかじゃないわ。", + "#key_yuri:die": "ひどい…リーダーね。", +}; diff --git a/character/mobile.js b/character/mobile.js deleted file mode 100644 index f852560d6..000000000 --- a/character/mobile.js +++ /dev/null @@ -1,18568 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "mobile", - //connectBanned:['miheng'], - connect: true, - characterSort: { - mobile: { - mobile_default: ["mb_sp_guanqiujian", "mb_caomao", "chengji", "lizhaojiaobo", "xin_huojun", "muludawang", "mb_chengui", "mb_huban", "mb_xianglang", "yanxiang", "xin_wuban", "laimin", "baoxin", "jiangji", "liwei", "xin_guozhao", "miheng", "taoqian", "lingcao", "sunru", "lifeng", "zhuling", "liuye", "zhaotongzhaoguang", "majun", "simazhao", "wangyuanji", "pangdegong", "shenpei", "hujinding", "zhangyì", "jiakui", "yangbiao", "chendeng", "dongcheng", "yangyi", "dengzhi", "zhengxuan", "sp_sufei", "furong", "dingyuan", "simashi", "yanghuiyu", "hucheer", "gongsunkang", "nanhualaoxian", "zhouqun", "qiaozhou", "fuqian", "simafu", "mayuanyi", "yanpu", "sunhanhua", "sp_maojie", "peixiu", "sp_jianggan", "ruanhui", "xin_mamidi", "sp_caosong", "yangfu", "wangjun", "sp_pengyang", "qianzhao", "shichangshi", "yangfeng"], - mobile_yijiang: ["yj_zhanghe", "yj_zhangliao", "yj_xuhuang", "yj_ganning", "yj_huangzhong", "yj_weiyan", "yj_zhoubuyi"], - mobile_standard: ["xin_xiahoudun", "xin_zhangfei"], - mobile_shenhua_feng: ["re_xiaoqiao", "xin_zhoutai"], - mobile_shenhua_huo: ["re_pangtong", "re_sp_zhugeliang", "re_xunyu", "re_dianwei", "re_yanwen", "xin_yuanshao"], - mobile_shenhua_lin: ["re_dongzhuo", "re_sunjian", "re_zhurong"], - mobile_shenhua_shan: ["re_liushan", "re_dengai", "re_jiangwei", "re_caiwenji", "re_zhangzhang", "re_sunben"], - mobile_shenhua_yin: ["xin_sunliang"], - mobile_shenhua_lei: ["re_guanqiujian"], - mobile_yijiang1: ["re_xusheng", "re_lingtong", "ol_yujin", "re_wuguotai", "re_gaoshun", "re_caozhi"], - mobile_yijiang2: ["xin_liaohua", "xin_caozhang", "re_liubiao", "re_handang", "xin_chengpu", "xin_gongsunzan", "re_zhonghui", "re_bulianshi"], - mobile_yijiang3: ["re_liru", "xin_jianyong", "xin_zhuran", "xin_guohuai", "xin_panzhangmazhong", "xin_fuhuanghou", "re_yufan"], - mobile_yijiang4: ["xin_zhoucang", "xin_caifuren", "xin_guyong", "xin_sunluban", "xin_caozhen", "xin_jushou", "xin_wuyi", "xin_zhuhuan", "re_chenqun"], - mobile_yijiang5: ["xin_zhangyi", "xin_sunxiu", "xin_quancong", "xin_zhuzhi", "xin_caoxiu"], - mobile_yijiang67: ["re_jikang"], - mobile_changshi: ["scs_zhangrang", "scs_zhaozhong", "scs_sunzhang", "scs_bilan", "scs_xiayun", "scs_hankui", "scs_lisong", "scs_duangui", "scs_guosheng", "scs_gaowang"], - mobile_sp: ["old_yuanshu", "re_wangyun", "re_baosanniang", "re_weiwenzhugezhi", "re_zhanggong", "re_xugong", "re_heqi", "liuzan", "xin_hansui", "mb_sunluyu"], - }, - }, - character: { - mb_sp_guanqiujian: ["male", "wei", 4, ["mbcuizhen", "mbkuili"]], - mb_caomao: ["male", "wei", 3, ["mbqianlong", "mbweitong"], ["zhu"]], - chengji: ["male", "wei", 4, ["mbkuangli", "mbxiongsi"]], - lizhaojiaobo: ["male", "wei", 4, ["mbzuoyou", "mbshishou"]], - yangfeng: ["male", "qun", 4, ["mbxuetu", "mbweiming"]], - xin_huojun: ["male", "shu", 4, ["sidai", "jieyu"], ["character:tw_huojun", "die_audio:tw_huojun"]], - muludawang: ["male", "qun", "3/3/1", ["shoufa", "zhoulin", "yuxiang"]], - mb_chengui: ["male", "qun", 3, ["guimou", "zhouxian"]], - mb_huban: ["male", "wei", 4, ["mbyilie"]], - mb_xianglang: ["male", "shu", 3, ["naxue", "yijie"]], - yanxiang: ["male", "qun", 3, ["kujian", "twruilian"], ["die_audio:tw_yanxiang"]], - mb_sunluyu: ["female", "wu", 3, ["mbmeibu", "mbmumu"]], - xin_wuban: ["male", "shu", 4, ["xinjintao"], ["clan:陈留吴氏", "character:wuban"]], - baoxin: ["male", "qun", 4, ["mutao", "yimou"], ["die_audio:tw_baoxin"]], - jiangji: ["male", "wei", 3, ["twjichou", "jilun"], ["character:tw_jiangji", "die_audio:tw_jiangji"]], - liwei: ["male", "shu", 4, ["jiaohua"], ["die_audio:tw_liwei"]], - laimin: ["male", "shu", 3, ["laishou", "luanqun"]], - yj_zhoubuyi: ["male", "wei", 3, ["mbhuiyao", "mbquesong"]], - xin_guozhao: ["female", "wei", 3, ["yichong", "wufei"]], - xin_zhangyi: ["male", "shu", 4, ["xinwurong", "shizhi"]], - xin_sunliang: ["male", "wu", 3, ["xinzhizheng", "xinkuizhu", "xinlijun"], ["zhu"]], - re_xiaoqiao: ["female", "wu", 3, ["retianxiang", "xinhongyan"]], - shichangshi: ["male", "qun", 1, ["mbdanggu", "mbmowang"], ["sex:male_castrated"]], - re_zhangzhang: ["male", "wu", 3, ["rezhijian", "guzheng"]], - qianzhao: ["male", "wei", 4, ["mbshihe", "mbzhenfu"]], - re_yanwen: ["male", "qun", 4, ["reshuangxiong"]], - xin_zhoutai: ["male", "wu", 4, ["buqu", "new_fenji"]], - re_caozhi: ["male", "wei", 3, ["reluoying", "rejiushi", "chengzhang"]], - yj_weiyan: ["male", "qun", 5, ["mbguli", "mbaosi"]], - re_chenqun: ["male", "wei", 3, ["redingpin", "refaen"]], - xin_caoxiu: ["male", "wei", 4, ["qianju", "xinqingxi"]], - xin_zhuhuan: ["male", "wu", 4, ["fenli", "xinpingkou"]], - sp_pengyang: ["male", "shu", 3, ["spdaming", "spxiaoni"]], - wangjun: ["male", "qun", 4, ["zhujian", "duansuo"]], - xin_zhuzhi: ["male", "wu", 4, ["sbanguo"]], - xin_wuyi: ["male", "shu", 4, ["sbbenxi"]], - yangfu: ["male", "wei", 4, ["jiebing", "hannan"]], - sp_caosong: ["male", "wei", 3, ["yijin", "guanzong"]], - re_liru: ["male", "qun", 3, ["rejuece", "remieji", "xinfencheng"]], - re_dianwei: ["male", "wei", 4, ["reqiangxi"]], - xin_mamidi: ["male", "qun", 3, ["chengye", "buxu"]], - ruanhui: ["female", "wei", 3, ["mingcha", "jingzhong"]], - xin_quancong: ["male", "wu", 4, ["sbyaoming"]], - re_xunyu: ["male", "wei", 3, ["quhu", "rejieming"], ["clan:颍川荀氏"]], - xin_jushou: ["male", "qun", "2/3/3", ["xinjianying", "shibei"]], - re_bulianshi: ["female", "wu", 3, ["reanxu", "zhuiyi"]], - re_caiwenji: ["female", "qun", 3, ["rebeige", "duanchang"]], - sp_jianggan: ["male", "wei", 3, ["mbdaoshu", "spdaizui"]], - peixiu: ["male", "qun", 3, ["xingtu", "juezhi"]], - re_gaoshun: ["male", "qun", 4, ["rexianzhen", "rejinjiu"]], - re_wuguotai: ["female", "wu", 3, ["reganlu", "buyi"]], - xin_sunxiu: ["male", "wu", 3, ["mobileyanzhu", "mobilexingxue", "zhaofu"], ["zhu"]], - sp_maojie: ["male", "wei", 3, ["bingqing", "yingfeng"]], - yj_huangzhong: ["male", "qun", 4, ["spshidi", "spyishi", "spqishe"]], - re_yufan: ["male", "wu", 3, ["zhiyan", "rezongxuan"]], - sunhanhua: ["female", "wu", 3, ["chongxu", "miaojian", "shhlianhua"]], - yanpu: ["male", "qun", 3, ["huantu", "bihuo"]], - mayuanyi: ["male", "qun", 4, ["jibing", "wangjing", "moucuan"]], - simafu: ["male", "wei", 3, ["xunde", "chenjie"]], - fuqian: ["male", "shu", 4, ["jueyong", "poxiang"]], - xin_caozhen: ["male", "wei", 4, ["discretesidi"]], - xin_sunluban: ["female", "wu", 3, ["xinzenhui", "xinjiaojin"]], - qiaozhou: ["male", "shu", 3, ["zhiming", "xingbu"]], - xin_guyong: ["male", "wu", 3, ["xinshenxing", "xinbingyi"]], - re_zhonghui: ["male", "wei", 4, ["requanji", "zili"], ["clan:颍川钟氏"]], - xin_caifuren: ["female", "qun", 3, ["xinqieting", "xianzhou"]], - xin_zhoucang: ["male", "shu", 4, ["mobilezhongyong"]], - ol_yujin: ["male", "wei", 4, ["rejieyue"]], - zhouqun: ["male", "shu", 3, ["tiansuan"]], - re_zhurong: ["female", "shu", 4, ["juxiang", "relieren"]], - re_jiangwei: ["male", "shu", 4, ["retiaoxin", "zhiji"]], - nanhualaoxian: ["male", "qun", 3, ["yufeng", "tianshu"]], - re_handang: ["male", "wu", 4, ["regongji", "jiefan"]], - re_dengai: ["male", "wei", 4, ["retuntian", "zaoxian"]], - xin_fuhuanghou: ["female", "qun", 3, ["xinzhuikong", "xinqiuyuan"]], - xin_panzhangmazhong: ["male", "wu", 4, ["xinduodao", "xinanjian"]], - xin_guohuai: ["male", "wei", 4, ["mobilejingce"]], - gongsunkang: ["male", "qun", 4, ["juliao", "taomie"]], - xin_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "liyong"]], - xin_hansui: ["male", "qun", "4/4/1", ["xinniluan", "xiaoxi_hansui"]], - hucheer: ["male", "qun", 4, ["daoji"]], - re_lingtong: ["male", "wu", 4, ["rexuanfeng"]], - re_liubiao: ["male", "qun", 3, ["zishou", "rezongshi"]], - simashi: ["male", "wei", 4, ["baiyi", "jinglve", "shanli"]], - yanghuiyu: ["female", "wei", 3, ["hongyi", "requanfeng"]], - xin_zhuran: ["male", "wu", 4, ["mobiledanshou"]], - xin_gongsunzan: ["male", "qun", 4, ["xinyicong", "qiaomeng"]], - dingyuan: ["male", "qun", 4, ["beizhu"]], - xin_jianyong: ["male", "shu", 3, ["xinqiaoshui", "xinjyzongshi"]], - xin_caozhang: ["male", "wei", 4, ["rejiangchi"]], - xin_liaohua: ["male", "shu", 4, ["redangxian", "refuli"]], - furong: ["male", "shu", 4, ["xuewei", "liechi"]], - re_dongzhuo: ["male", "qun", 8, ["rejiuchi", "roulin", "benghuai", "baonue"], ["zhu"]], - re_xusheng: ["male", "wu", 4, ["repojun"]], - sp_sufei: ["male", "qun", 4, ["zhengjian", "gaoyuan"]], - yj_zhangliao: ["male", "qun", 4, ["weifeng"]], - yj_zhanghe: ["male", "qun", 4, ["xinzhilve"]], - yj_xuhuang: ["male", "qun", 4, ["xinxhzhiyan"]], - yj_ganning: ["male", "qun", 4, ["gnjinfan", "gnsheque"]], - re_sunjian: ["male", "wu", 4, ["gzyinghun", "repolu"]], - zhengxuan: ["male", "qun", 3, ["zhengjing"]], - dengzhi: ["male", "shu", 3, ["jimeng", "shuaiyan"]], - xin_chengpu: ["male", "wu", 4, ["relihuo", "chunlao"]], - yangyi: ["male", "shu", 3, ["duoduan", "gongsun"]], - dongcheng: ["male", "qun", 4, ["chengzhao"]], - re_pangtong: ["male", "shu", 3, ["xinlianhuan", "niepan"]], - re_guanqiujian: ["male", "wei", 4, ["rezhengrong", "rehongju"]], - chendeng: ["male", "qun", 3, ["zhouxuan", "fengji"]], - re_heqi: ["male", "wu", 4, ["reqizhou", "reshanxi"]], - yangbiao: ["male", "qun", 3, ["zhaohan", "rangjie", "yizheng"]], - re_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "rehuoji", "rekanpo"]], - xin_xiahoudun: ["male", "wei", 4, ["reganglie", "xinqingjian"]], - zhangyì: ["male", "shu", 4, ["rezhiyi"]], - jiakui: ["male", "wei", 3, ["zhongzuo", "wanlan"]], - re_jikang: ["male", "wei", 3, ["new_qingxian", "new_juexiang"]], - miheng: ["male", "qun", 3, ["kuangcai", "shejian"]], - taoqian: ["male", "qun", 3, ["zhaohuo", "yixiang", "yirang"]], - liuzan: ["male", "wu", 4, ["fenyin"]], - lingcao: ["male", "wu", 4, ["dujin"]], - sunru: ["female", "wu", 3, ["yingjian", "shixin"]], - lifeng: ["male", "shu", 3, ["tunchu", "shuliang"]], - zhuling: ["male", "wei", 4, ["xinzhanyi"]], - liuye: ["male", "wei", 3, ["polu", "choulve"]], - zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "xinfu_longyuan"]], - majun: ["male", "wei", 3, ["xinfu_jingxie1", "qiaosi"]], - simazhao: ["male", "wei", 3, ["xinfu_daigong", "xinfu_zhaoxin"]], - wangyuanji: ["female", "wei", 3, ["xinfu_qianchong", "xinfu_shangjian"]], - pangdegong: ["male", "qun", 3, ["xinfu_pingcai", "xinfu_pdgyingshi"]], - old_yuanshu: ["male", "qun", 4, ["xinyongsi", "yjixi"]], - - shenpei: ["male", "qun", "2/3", ["shouye", "liezhi"]], - re_wangyun: ["male", "qun", 3, ["relianji", "remoucheng"], ["clan:太原王氏"]], - - re_baosanniang: ["female", "shu", 3, ["meiyong", "rexushen", "rezhennan"]], - - hujinding: ["female", "shu", "2/6", ["renshi", "wuyuan", "huaizi"]], - - re_zhanggong: ["male", "wei", 3, ["reqianxin", "rezhenxing"]], - re_xugong: ["male", "qun", 3, ["rebiaozhao", "yechou"], ["doublegroup:wu:qun"]], - re_weiwenzhugezhi: ["male", "wu", 4, ["refuhai"]], - - xin_yuanshao: ["male", "qun", 4, ["reluanji", "xueyi"], ["zhu"]], - re_liushan: ["male", "shu", 3, ["xiangle", "refangquan", "ruoyu"], ["zhu"]], - re_sunben: ["male", "wu", 4, ["jiang", "rehunzi", "zhiba"], ["zhu"]], - - scs_zhangrang: ["male", "qun", "", ["scstaoluan"], ["unseen", "sex:male_castrated"]], - scs_zhaozhong: ["male", "qun", "", ["scschiyan"], ["unseen", "sex:male_castrated"]], - scs_sunzhang: ["male", "qun", "", ["scszimou"], ["unseen", "sex:male_castrated"]], - scs_bilan: ["male", "qun", "", ["scspicai"], ["unseen", "sex:male_castrated"]], - scs_xiayun: ["male", "qun", "", ["scsyaozhuo"], ["unseen", "sex:male_castrated"]], - scs_hankui: ["male", "qun", "", ["scsxiaolu"], ["unseen", "sex:male_castrated"]], - scs_lisong: ["male", "qun", "", ["scskuiji"], ["unseen", "sex:male_castrated"]], - scs_duangui: ["male", "qun", "", ["scschihe"], ["unseen", "sex:male_castrated"]], - scs_guosheng: ["male", "qun", "", ["scsniqu"], ["unseen", "sex:male_castrated"]], - scs_gaowang: ["male", "qun", "", ["scsmiaoyu"], ["unseen", "sex:male_castrated"]], - }, - characterIntro: { - lizhaojiaobo: "李昭(?—约公元260年),三国时期曹魏官吏,官拜冗从仆射,为魏帝曹髦的亲信。
    焦伯,三国时期人物,魏帝曹髦护卫,官拜黄门从官。
    曹髦见自己权力威势日渐削弱,感到不胜忿恨,于公元260年(甘露五年)五月初六夜里,令李昭和焦伯等在陵云台布署甲士,出讨司马昭,但最终失败,曹髦为成济所弑,李昭和焦伯等应该也战死。在《三国演义》里,焦伯挺枪出战成济,亦被成济所杀。", - chengji: "成济(?~260年6月21日),三国时期曹魏官员。官至太子舍人。在魏帝曹髦起兵讨司马昭时,受到司马昭之心腹贾充指使,刺死曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。", - yangfeng: "杨奉(?-197年/198年),东汉末年将领。杨奉早年参加白波军起义,曾经帮助李傕对抗郭汜,后来背叛李傕。兴平二年,加号兴义将军,护送汉献帝刘协东归雒阳,颇有功勋,加号车骑将军,屯兵于梁县。建安元年,随着汉献帝迁都许县,失去权力,先后依附于袁术、吕布,劫掠徐州和扬州地区。建安二年(一说三年),带兵进犯刘备领地,被刘备诱杀。", - muludawang: "古典小说《三国演义》中的虚构人物,八纳洞主,孟获盟友。擅驱兽法,能行风雨,控制猛兽并指挥它们作战。在法术帮助下最初对蜀军取得一些胜利,但在诸葛亮的喷火木兽将他的动物吓跑后战败,最后死于乱军之中。", - laimin: "来敏(165年—261年),字敬达,义阳新野人,东汉太中大夫来歙之后,司空来艳之子,三国时期蜀汉官员。东汉末年,逢董卓之乱,来敏跟随姐夫黄琬到荆州避难,黄琬是刘璋祖母的侄子,来敏又与姐姐来氏入蜀,被刘璋引为宾客。来敏喜欢读书,尤其喜欢《左氏春秋》。刘备平定益州后,以来敏为典学校尉,后立太子,来敏为家令。刘禅继位后,任命来敏为虎贲中郎将,诸葛亮驻汉中,请来敏为军祭酒、辅军将军。却因其口出狂言而被罢官,诸葛亮死后,来敏历任大长秋、光禄大夫、执慎将军等职,期间多次因说错话而被免官,蜀汉景耀年间,来敏去世,时年九十七岁。", - shichangshi: "十常侍,指中国东汉(公元25年—220年)灵帝时期(168年-189年)操纵政权的十二个宦官:张让、赵忠、夏恽、郭胜、孙璋、毕岚、栗嵩、段珪、高望、张恭、韩悝、宋典(在小说《三国演义》里,十常侍指的是指张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人),他们都任职中常侍。玩弄小皇帝于股掌之中,以至灵帝称“张常侍是我父,赵常侍是我母”。十常侍自己横征暴敛,卖官鬻爵,他们的父兄子弟遍布天下,横行乡里,祸害百姓,无官敢管。人民不堪剥削、压迫,纷纷起来反抗。当时一些比较清醒的官吏,已看出宦官集团的黑暗腐败,导致大规模农民起义的形势。郎中张钧在给皇帝的奏章中明确指出,黄巾起义是外戚宦官专权逼出来的,他说:“张角所以能兴兵作乱,万人所以乐附之者,其源皆由十常侍多放父兄、子弟、婚宗、宾客典据州郡,辜确财利,侵略百姓,百姓之怨无所告诉,故谋议不轨,聚为‘盗贼’。”后被曹操、袁绍所歼。", - sunzhang: "孙璋(?-189年?)东汉末期汉灵帝的宦官,官居中常侍,为十常侍之一,在张让、赵忠之下位居第三。光熹元年(189年),张让、赵忠、段珪等诛杀何进,袁绍率军入宫,诛杀孙璋。", - bilan: "毕岚(?—189),东汉宦官,十常侍之一。十常侍朋比为奸,祸乱朝纲,制造出党锢之祸,后被袁绍诛杀。另外,毕岚曾制造翻车,用于取河水洒路。", - xiayun: "夏恽(?—189),东汉宦官,十常侍之一。后被袁绍、曹操诛于翠花楼前。", - hankui: "韩悝(?—189),东汉宦官,十常侍之一。后被袁绍所诛。", - lisong: "栗嵩,东汉宦官,十常侍之一,与张让等人均一同任职中常侍。", - duangui: "段珪(?—189),东汉宦官,十常侍之一。段珪与张让、赵忠等人朋比为奸,党同伐异,横征暴敛,卖官鬻爵,引起了以何进为首的外戚集团的不满。何进谋诛宦官,却不纳曹操、陈琳之谏,多结外镇军阀,翘首京师,与袁绍等谋诛宦竖。终于事泄,被宦官集团查知。张让、段珪等人先下手为强,斩杀何进于嘉德殿前,却也引起了京师的变乱。袁绍等人趁机带兵冲入皇宫,大肆诛杀太监。洛阳卫军变乱后,段珪与张让等人劫持少帝刘辩、陈留王刘协出逃,后被杀。", - guosheng: "郭胜,南阳宛(今河南南阳)人。汉灵帝时为中常侍,与张让、赵忠等狼狈为奸,并皆封侯。曾助同乡何进、何太后贵幸。后被袁绍等人率兵诛灭。", - gaowang: "高望(?~189年),京兆人,东汉宦官,十常侍之一,为小黄门兼任尚药监,颇得皇子刘辩的信任。中平六年(189年),张让等人杀害大将军何进,袁绍与王匡等人率兵杀入雒阳端门,在承明堂上斩杀中常侍高望。", - qianzhao: "牵招(?—231年),字子经,安平郡观津县(今河北省武邑县)人。三国时期曹魏名将。牵招早年师从乐隐,与刘备成为刎颈之交。投靠冀州牧袁绍,担任冀州从事,统领乌丸突骑。袁绍死后,跟随冀州刺史袁尚,受到并州牧高干加害,投奔丞相曹操,授军谋掾。从平乌丸,出任护乌丸校尉。举茂才出身,从平汉中,授中护军。拜平虏校尉,平定东莱郡叛乱。魏文帝曹丕时期,授护鲜卑校尉,驻扎昌平,迁右中郎将、雁门太守,遏制鲜卑轲比能发展壮大。魏明帝即位,赐爵关内侯,营救护乌丸校尉田豫。太和五年,去世。", - fuqian: "傅佥(?~263年),义阳(治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。", - wangjun: "王濬(207年~286年),字士治,小名阿童,弘农郡湖县(今河南省灵宝市阌乡)人。西晋时期名将。王濬出身世家,博学多闻,容颜英俊,多谋善战。举秀才出身,起家河东郡从事。泰始八年(272年),担任广汉太守,平定益州叛乱,迁益州刺史。利用长江上游地势之利,修造战船,组建强大的水军。上书晋武帝,促成晋灭吴之战。咸宁六年(280年),率兵顺流而下,熔毁横江铁链,攻克丹阳郡,率先攻取石头城,接受吴末帝孙皓投降,完成西晋统一大业。凭借功勋,拜辅国将军、步兵校尉,册封襄阳侯。为避猜忌,纵情享受,累迁特进、抚军大将军、开府仪同三司、散骑常侍、后军将军等。太康六年十二月(286年1月18日),王濬去世,享年八十岁,谥号为“武”,安葬于柏谷山。", - yangfu: "杨阜(172年—244年),字义山,汉天水冀县(今甘谷县东南)人。三国时期曹魏名臣。汉献帝建安初年,任凉州从事,旋拜安定长史;韦康任刺史后辟为别驾,改任州参军;后因讨马超有功,赐爵关内侯。曹操征汉中时,杨阜担任益州刺史,回来后又担任武都太守。魏明帝时,由将作大匠改少府。杨阜不但卓识远见,而且刚正不阿,敢于直言,对朝廷弊政多有诤谏,六次进言谏魏明帝应勤政爱民,魏明帝对他颇有敬畏之心。杨阜勤政廉洁,在宫内担任少府时,专管宝器、珍膳、衣物等,而他死后则家无馀财。皇帝让杨阜的孙子杨豹继任了少府之职。原甘谷县文昌宫西侧有杨氏家祠,内悬“两代尚书”匾额。", - ruanhui: "阮氏女,是指三国时期曹魏名士许允之妻阮氏,陈留尉氏人。阮氏女是中国古代四大丑女之一,貌丑而见识非凡。她出身士族之家,是卫尉阮共(字伯彦)之女、阮侃(字德如)之妹。嫁与许允后生有二子:许奇,官至司隶校尉;许猛,官至幽州刺史。", - peixiu: "裴秀(224年-271年4月3日),字季彦。河东郡闻喜县(今山西省闻喜县)人。[1]魏晋时期名臣、地图学家,东汉尚书令裴茂之孙、曹魏光禄大夫裴潜之子。出身河东裴氏,少年时便颇有名气,后被大将军曹爽辟为掾属,袭爵清阳亭侯,又迁黄门侍郎。高平陵之变后,因是曹爽的故吏而被罢免。此后历任廷尉正、安东将军及卫将军司马,参与谋划军国之政,参与平定诸葛诞叛乱。因功转任尚书,进封鲁阳乡侯。魏元帝继位后,进爵鲁阳县侯,任尚书仆射。咸熙元年(264年),受命负责修改官制,又提议恢复五等爵制。五等制恢复后,获封济川侯。他建议立司马炎为世子,司马炎继位晋王后,拜裴秀为尚书令、右光禄大夫。西晋建立后,加左光禄大夫,封钜鹿郡公。泰始三年(267年),升任司空。泰始七年(271年),裴秀因服食寒食散后饮冷酒而逝世,年四十八,谥号“元”。有文集三卷。裴秀作《禹贡地域图》,开创了中国古代地图绘制学。李约瑟称他为“中国科学制图学之父”,与古希腊著名地图学家托勒密齐名,是世界古代地图学史上东西辉映的两颗灿烂明星。为纪念这位中国地图科学创始人而设立的“裴秀奖”,每两年评选一次,是中国地图学界最高奖项。由于他的贡献突出,联合国天文组织将月球正面的一个环形山命名为“裴秀环形山”,", - liucheng: "游卡桌游的原创人物。设定为黄忠的妻子。", - jiangwan: "蒋琬(?-246年),字公琰。零陵郡湘乡县人。三国时期蜀汉政治家,与诸葛亮、董允、费祎合称“蜀汉四相”。蒋琬最初随刘备入蜀,为广都县长。因其不理政事,惹怒刘备,在诸葛亮的劝说下才免于一死。后重获启用,受到诸葛亮的悉心培养,累官丞相长史兼抚军将军。建兴十二年(234年),诸葛亮去世,蒋琬继其执政,拜尚书令,又加行都护、假节,领益州刺史,再迁大将军,录尚书事,封安阳亭侯。延熙元年(238年),受命开府,加大司马,总揽蜀汉军政。曾制定由水路进攻曹魏的计划,但未被采纳。延熙九年(246年),蒋琬病逝,谥号为恭。", - sunhanhua: "孙寒华,三国时女仙。梁·陶弘景《真诰》卷一三、五代·杜光庭《墉城集仙录》卷七:其父孙贲为孙权堂兄,寒华少时与杜契有私情,后从杜契受玄白之要,颜容日少。周旋吴越诸山十馀年,得道仙去。《鉴后集》卷四:一云即吴大帝孙权之女。于茅山修道,道成,冲虚而去,因号其山为华姥山。山在茅山崇禧观前。《神异典》卷二五九人于明代,误。", - yanpu: "阎圃,生卒年不详,是益州巴西安汉(今四川省南充市)人。张鲁割据巴、汉,就以阎圃为功曹。东汉末年人物,本为张鲁部下谋士,后随张鲁一同投降曹操,封平乐乡侯。", - mayuanyi: "马元义(?—184年6月7日),东汉末年黄巾之乱的组织者之一,是黄巾大方首领。光和六年(183年),马元义奉黄巾军首领张角之命,筹划起事的准备工作。马元义聚集荆州、扬州信徒数万人约定于邺城相会,并收买中常侍封谞、徐奉等为内应,准备于次年(甲子年)三月初五(戊申日)内外同时起事。由于张角弟子济南人唐周的告密,马元义于于中平元年(184年)正月在河内郡山阳县被捕,送往洛阳车裂,同时被杀的还有教众近千人。由于马元义的被杀,迫使张角提前于二月起兵发动叛乱。", - simafu: "司马孚(180年-272年4月3日),字叔达。河内郡温县(今河南温县)人。三国曹魏至西晋初年重臣,西晋宗室,东汉京兆尹司马防第三子,晋宣帝司马懿之弟。自曹操时代起,司马孚就任文学掾,而后历仕魏国五代皇帝,累迁至太傅。司马孚在“高平陵事变”之际,协助司马懿控制京师,诛杀曹爽一党。后又督军成功防御吴、蜀的进攻,为司马氏政权的稳固多有功劳。但他性格十分谨慎,自司马懿执掌大权起,便逐渐引退,更未直接参与司马氏废立魏帝的谋划。西晋代魏后,司马孚进拜太宰,封安平王。晋武帝司马炎对他十分尊宠,但他并不以此为荣,至死仍以魏臣自称。泰始八年二月壬辰日(272年4月3日),司马孚去世,年九十三。武帝为其举哀三日,葬礼规格比照东汉东平献王刘苍,赐谥献王。", - sunchen: "孙綝(231年-259年1月18日),字子通,吴郡富春(今浙江杭州市富阳区)人。三国时期吴国宗室、权臣,昭义中郎将孙静曾孙、定武中郎将孙暠之孙、安民都尉孙绰的儿子。门荫入仕,初任偏将军。太平元年(256年),升任侍中、武卫将军、都督中外诸军事。掌权以后,诛杀大司马滕胤、骠骑将军吕据等重臣,升任大将军,册封永宁县侯。嗜好杀戮,与皇帝孙亮的矛盾激化,最终废黜孙亮,拥立琅琊王孙休即位,累迁丞相、荆州牧。永安元年十二月(259年1月),在左将军张布的协助下,遭到皇帝孙休捕杀,时年二十八岁,削除宗籍,改姓故氏。", - qiaozhou: "谯周(201年-270年),字允南,巴西郡西充国县(今四川西充县槐树镇)人。三国时期蜀汉大臣、学者、儒学家、史学家。幼年丧父,少读典籍,精研六经,颇晓天文,成为蜀地大儒之一,门下有陈寿、罗宪等学生。诸葛亮担任益州牧时,授劝学从事。诸葛亮死后,不顾朝令,前往奔丧。后主刘禅册立太子时,授太子仆,迁太子家令、光禄大夫。反对姜维北伐,著《仇国论》,力陈北伐之失。炎兴元年(263年),邓艾攻打成都时期,力劝刘禅投降,“有全国之功”,投降魏国后,受封阳城亭侯,迁骑都尉。泰始六年(270年),授散骑常侍,同年去世,时年七十岁。", - gongsunkang: "公孙康(生卒年不详),辽东襄平(今辽宁辽阳)人。东汉末年辽东地区割据军阀,辽东太守公孙度长子(一作庶子)、车骑将军公孙恭之兄。公孙康在其父死后继任辽东太守。建安十二年(207年),擒斩图谋不轨的袁尚、袁熙兄弟,将其首级献予曹操,被拜为左将军,封襄平侯。建安十四年(209年),公孙康大破高句丽,陷其国都,并讨伐韩濊,设置带方郡。死后因二子年幼,由公孙恭继任。曹丕称帝后,被追赠为大司马。", - zhouqun: "周群(生卒年不详),字仲直,巴西阆中(今四川阆中)人。周群年少时随父周舒学习占验天算之术。后来刘璋聘请周群为师友从事,其预言大多得以应验。刘备割据益州,任命周群为儒林校尉。曾劝说刘备攻汉中必定不利,事后得到应验,被举荐为茂才。", - dongzhao: "董昭(156年-236年7月4日),字公仁,济阴定陶(今山东省菏泽市定陶区)人。东汉末年曹魏谋士、重臣、开国元勋。董昭年轻时被举为孝廉,后担任袁绍帐下参军。多有战功,但是袁绍听信谗言,董昭不得已离开袁绍投奔张杨。张杨率军迎接汉献帝时,董昭随行,并拜为议郎。后与曹操在洛阳相见,又建议曹操将汉献帝迎接到许昌。董昭自此成为曹操的谋士。建安年间(198年)历任河南尹、冀州牧、徐州牧、魏郡太守等职,多有功劳,深受曹操器重。曹操受封魏公、魏王的谋划都是出自董昭之手。曹丕继魏王位后,董昭任将作大匠。曹丕称帝后,升任大鸿胪。此后先后担任侍中、太常、光禄大夫、太仆等重要职位。魏明帝曹叡即位后转任卫尉。太和六年(232年)升任司徒。青龙四年(236年)卒,时年八十一,谥曰定。", - nanhualaoxian: "南华老仙,是古典小说《三国演义》中的虚拟人物。其原型来自道教典籍中对庄子的封号,又称“南华仙人”、“南华真人”等。在古典小说《三国演义》通行本的第一回中,描述了南华老仙将《太平要术》赠送给张角的情节。", - chenzhen: "陈震(?—公元235年),字孝起。荆州南阳郡(今河南南阳)人。三国时期蜀汉官员。刘备领荆州牧时,辟陈震为从事。后随刘备入蜀,为蜀郡北部都尉、汶山太守、犍为太守。建兴三年(225年),拜尚书,迁尚书令。建兴七年(229年),孙权称帝。蜀汉以陈震为卫尉,前往祝贺,与孙权开坛歃盟,交分天下。还蜀,封城阳亭侯。建兴十三年(235年),卒。", - hucheer: "胡车儿(生卒年不详),东汉末年武将,初从张绣,为其心腹猛将,勇冠三军,与贾诩交情甚佳。宛城大战后,张绣投降曹操,曹操爱胡车儿之骁勇,手以黄金与之。后因曹操私纳张绣亡叔张济的遗孀邹氏,张绣深感其辱,欲杀曹操,与贾诩商议后决心反曹。《三国演义》中,作者考虑到典韦的勇猛,便增加了令胡车儿盗走典韦的双戟的情节。最终典韦、曹昂(曹操长子)、曹安民(曹操侄子)皆死于此次战斗。野史说胡车儿跟随曹操征战,被赵云在长坂坡上红枪挑死。", - simashi: "司马师(208年~255年3月23日),字子元,河内温县(今河南省温县)人。三国时期曹魏权臣,西晋王朝的奠基人之一,晋宣帝司马懿与宣穆皇后张春华的长子,晋文帝司马昭的同母兄,晋武帝司马炎的伯父。司马师沉着坚强,雄才大略,早年与夏侯玄、何晏齐名。高平陵政变后,以功封长平乡侯,旋加卫将军。司马懿死后,以抚军大将军辅政,独揽朝廷大权,次年升为大将军。掌权后,他制定选拔官吏的法规,命百官推荐贤才,整顿纲纪,使其各有职掌,朝野肃然。司马师也有卓越的军事才能,曾用计于新城之战击溃吴国诸葛恪的大军。嘉平六年(254年),魏帝曹芳与中书令李丰等人密谋除司马师,事情泄露,司马师杀死参与者,迫郭太后废曹芳,改立高贵乡公曹髦为帝。次年,亲自率兵平定毌丘俭、文钦之乱。回师途中病死,时年四十八岁,谥号“忠武”。后被追尊为晋景王。西晋建立后,被追尊为景皇帝,庙号世宗。", - yanghuiyu: "羊徽瑜(214年-278年),泰山南城(今山东新泰)人,晋景帝司马师第三任妻子。羊徽瑜出身官宦世家泰山羊氏,她是南阳太守羊续的孙女,上党太守羊衜之女;其母为东汉名士左中郎将蔡邕之女、蔡文姬的姐妹。羊徽瑜聪慧贤德,嫁给司马师后未有子女。以司马师之弟司马昭的次子司马攸为继子。司马师死后,司马攸侍奉羊徽瑜非常孝顺。泰始元年(265年),司马昭长子司马炎受禅登基,建立西晋,追谥伯父司马师为景皇帝。泰始二年(266年),尊奉羊徽瑜为景皇后,因居弘训宫,故称弘训太后。咸宁四年(278年),羊徽瑜去世,时年六十五岁,谥号景献皇后,与司马师合葬峻平陵。", - dingyuan: "丁原(?—189年),字建阳,兖州泰山郡南城县(山东省平邑县郑城镇)人。东汉末年军阀,官拜执金吾、并州刺史。任并州刺史期间,他亲近、善待主簿吕布,又调遣部下张杨、张辽等名将到洛阳任职。汉灵帝驾崩后,带兵进入洛阳,担任执金吾,并与大将军何进谋划诛杀十常侍,但不久事情败露,何进被宦官杀死。在宦官被诛灭之后,丁原与军阀董卓在废帝问题上意见不合产生矛盾,于是董卓诱使吕布将其杀害,其势力亦被吞并。", - furong: "傅肜(?-222年),义阳(今湖北枣阳)人,三国时蜀汉将领。刘备攻伐吴国时,傅肜为别督。后刘备被陆逊击败,傅肜率部断后,奋战至死。死前怒斥道:“吴狗!何有汉将军降者!”", - zhengxuan: "郑玄(127年-200年),字康成。北海郡高密县(今山东省高密市)人。东汉末年儒家学者、经学大师。郑玄曾入太学攻《京氏易》、《公羊春秋》及《三统历》、《九章算术》,又从张恭祖学《古文尚书》、《周礼》和《左传》等,最后从马融学古文经。游学归里之后,复客耕东莱,聚徒授课,弟子达数千人,家贫好学,终为大儒。党锢之祸起,遭禁锢,杜门注疏,潜心著述。晚年守节不仕,却遭逼迫从军,最终病逝于元城,年七十四。郑玄治学以古文经学为主,兼采今文经学。他遍注儒家经典,以毕生精力整理古代文化遗产,使经学进入了一个“小统一时代”。著有《天文七政论》、《中侯》等书,共百万余言,世称“郑学”,为汉代经学的集大成者。唐贞观年间,列郑玄于二十二“先师”之列,配享孔庙。宋代时被追封为高密伯。后人建有郑公祠以纪念。", - dengzhi: "邓芝(178年-251年),字伯苗。义阳郡新野县(今河南新野)人。东汉名将邓禹之后,三国时期蜀汉重臣。邓芝早年曾被预言能位至大将,后被刘备任为郫令,升迁为广汉太守。因任官公廉且有治绩,被征入朝为尚书。刘备逝世后,奉命出使吴国,成功修复两国关系,并深为吴大帝孙权所赏识。建兴六年(228年),丞相诸葛亮策划北伐,命邓芝与大将赵云佯攻郿城,以吸引魏国曹真军主力。建兴十二年(234年),迁前军师、前将军,领兖州刺史,封阳武亭侯,不久督领江州。延熙六年(243年),迁车骑将军,后授假节。又率军平定涪陵叛乱。延熙十四年(251年),邓芝病逝。邓芝性格正直、简单,不刻意修饰情绪。他为将二十多年,赏罚明断,体恤士卒。身上的衣食取自官府,从未经营过私产,妻儿甚至还有忍饥挨饿之时,死时家中也没有多余财物。", - yangyi: "杨仪(?-235年),字威公,襄阳(今湖北襄阳)人,三国时期蜀汉官员。最初为荆州刺史傅群的主簿,后投奔关羽,任为功曹。关羽遣其至成都,大受刘备赞赏,擢为尚书。因与尚书令刘巴不和,调为弘农太守。建兴三年(225年)任丞相参军,此后一直跟随诸葛亮战斗。亮卒,他部署安全退军。诸葛亮在生前定蒋琬继己任,杨仪仅拜中军师。建兴十三年(235年),因多出怨言,被削职流放至汉嘉郡。但杨仪仍不自省,又上书诽谤,言辞激烈,最后下狱,自杀身亡。", - dongcheng: "董承(?~200年),字号不详,冀州河间人(今河北献县)人。东汉末年外戚大臣,汉灵帝母亲董太后侄子,汉献帝嫔妃董贵人之父。初从西凉军,为董卓女婿牛辅部曲。护卫汉献帝刘协从长安东归洛阳,拜为卫将军,受封列侯。建安四年(199年),拜车骑将军。自称领受汉献帝衣带诏,联合刘备、种辑、吴子兰、王子服、吴硕等人密谋诛杀曹操。五年正月,图谋泄露,董承诸人及董贵人全部遇害。", - chendeng: "陈登(163—201),字元龙,下邳淮浦(今江苏涟水西)人。东汉末年将领、官员。沛相陈珪之子。为人爽朗,性格沈静,智谋过人,少年时有扶世济民之志,并且博览群书,学识渊博。二十五岁时,举孝廉,任东阳县长。虽然年轻,但他能够体察民情,抚弱育孤,深得百姓敬重。后来,徐州牧陶谦提拔他为典农校尉,主管一州农业生产。他亲自考察徐州的土壤状况,开发水利,发展农田灌溉,使汉末迭遭破坏的徐州农业得到一定程度的恢复,百姓们安居乐业,“秔稻丰积”。建安初奉使赴许,向曹操献灭吕布之策,被授广陵太守。以灭吕布有功,加伏波将军。又迁东城太守。年三十九卒。其子陈肃,魏文帝时追陈登之功,为郎中。", - yangbiao: "杨彪(142年-225年),字文先。弘农郡华阴县(今陕西华阴)人。东汉末年名臣,太尉杨赐之子、名士杨修之父。杨彪少年时受家学熏陶,初举孝廉、茂才。其后征拜为议郎,参与续写《东观汉记》。任京兆尹时,揭发黄门令王甫的贪赃行为,使其被定罪诛杀。累任侍中、五官中郎将、卫尉等职。汉献帝时,遍历三公(司空、司徒、太尉)之职。权臣董卓意图迁都时,他据理力争。献帝东迁时,杨彪尽节护主。曹操挟献帝定都许县后,将杨彪下狱,获释后又任太常。他见汉室衰微,便诈称脚疾,不理世事。曹魏建立后,拒绝出任太尉,改光禄大夫,待以客礼。黄初六年(225年),杨彪去世,年八十四。其著作现仅存《答曹公书》一篇。", - zhangyì: "张翼(?-264年),字伯恭,益州犍为郡武阳县人。三国时期蜀汉将领。历任梓潼、广汉、蜀郡三郡太守,出任庲降都督,后随诸葛亮和姜维北伐,官至左车骑将军,领冀州刺史。初封关内侯,进爵都亭侯。蜀汉灭亡后,魏将钟会密谋造反,成都大乱,张翼亦为乱兵所杀。张翼是蜀汉第三任庲降都督,由于执法严厉,不得南夷欢心。在北伐上,张翼认为国小民疲,不应滥用武力,是蜀汉朝廷当时极少敢当朝和姜维争辩北伐问题的大臣。", - jiakui: "贾逵(174年—228年),本名贾衢,字梁道,河东襄陵人(今山西临汾县)。汉末三国时期魏国名臣,西晋开国功臣贾充父亲。初为并州郡吏,迁渑池县令,拜弘农太守,历仕曹操、曹丕、曹叡三世,是曹魏政权中具有军政才干的人物,终其一生为魏国统一事业作出卓越贡献。担任豫州刺史期间,兴修水利,凿通运河二百余里,时称“贾侯渠”,便利民生。随同曹丕伐吴,进封阳里亭侯,加号建威将军。石亭之战,率军救出曹休。太和二年,去世,赠本官,谥号为肃,《唐会要》将其尊为魏晋八君子之一。", - shenpei: "审配(?-204年),字正南,魏郡阴安(今河北清丰北)人。为人正直, 袁绍领冀州,审配被委以腹心之任,并总幕府。河北平定,袁绍以审配、逢纪统军事,审配恃其强盛,力主与曹操决战。曾率领弓弩手大破曹军于官渡。官渡战败,审配二子被俘,反因此受谮见疑,幸得逢纪力保。袁绍病死,审配等矫诏立袁尚为嗣,导致兄弟相争,被曹操各个击破。曹操围邺,审配死守数月,终城破被擒,拒不投降,慷慨受死。", - hujinding: "胡金定,女,传说中关羽之妻。关索之母,配偶关羽,出处《花关索传》和元代《三国志评话》民间传说人物。", - }, - characterTitle: {}, - card: { - ly_piliche: { - fullskin: true, - //vanish:true, - derivation: "liuye", - cardcolor: "diamond", - type: "equip", - subtype: "equip1", - distance: { attackFrom: -8 }, - skills: ["ly_piliche"], - //destroy:'polu' - }, - wolong_card: { - type: "takaramono", - fullskin: true, - //derivation:"pangdegong", - }, - fengchu_card: { - type: "takaramono", - fullskin: true, - //derivation:"pangdegong", - }, - xuanjian_card: { - fullskin: true, - type: "takaramono", - //derivation:"pangdegong", - }, - shuijing_card: { - fullskin: true, - type: "takaramono", - //derivation:"pangdegong", - }, - rewrite_bagua: { - derivation: "majun", - //cardimage:"bagua", - fullskin: true, - type: "equip", - subtype: "equip2", - ai: { - basic: { - equipValue: 7.5, - }, - }, - skills: ["rw_bagua_skill"], - }, - rewrite_baiyin: { - derivation: "majun", - fullskin: true, - //cardimage:"baiyin", - type: "equip", - subtype: "equip2", - loseDelay: false, - onLose: function () { - player.addTempSkill("rw_baiyin_skill_lose"); - }, - skills: ["rw_baiyin_skill"], - tag: { - recover: 1, - }, - ai: { - order: 9.5, - equipValue: function (card, player) { - if (player.hp == player.maxHp) return 5; - if (player.countCards("h", "rewrite_baiyin")) return 6; - return 0; - }, - basic: { - equipValue: 5, - }, - }, - }, - rewrite_lanyinjia: { - derivation: "majun", - //cardimage:"lanyinjia", - fullskin: true, - type: "equip", - subtype: "equip2", - skills: ["rw_lanyinjia", "lanyinjia2"], - ai: { - equipValue: 6, - basic: { - equipValue: 1, - }, - }, - }, - rewrite_renwang: { - derivation: "majun", - //cardimage:"renwang", - fullskin: true, - type: "equip", - subtype: "equip2", - skills: ["rw_renwang_skill"], - ai: { - basic: { - equipValue: 7.5, - }, - }, - }, - rewrite_tengjia: { - derivation: "majun", - //cardimage:"tengjia", - fullskin: true, - type: "equip", - subtype: "equip2", - //cardnature:"fire", - ai: { - equipValue: function (card, player) { - if (player.hasSkillTag("maixie") && player.hp > 1) return 0; - if (player.hasSkillTag("noDirectDamage")) return 10; - if (get.damageEffect(player, player, player, "fire") >= 0) return 10; - var num = - 3 - - game.countPlayer(function (current) { - return get.attitude(current, player) < 0; - }); - if (player.hp == 1) num += 4; - if (player.hp == 2) num += 1; - if (player.hp == 3) num--; - if (player.hp > 3) num -= 4; - return num; - }, - basic: { - equipValue: 3, - }, - }, - skills: ["rw_tengjia1", "rw_tengjia2", "rw_tengjia3", "rw_tengjia4"], - }, - rewrite_zhuge: { - derivation: "majun", - //cardimage:"zhuge", - distance: { - attackFrom: -2, - }, - fullskin: true, - type: "equip", - subtype: "equip1", - ai: { - equipValue: function (card, player) { - if ( - !game.hasPlayer(function (current) { - return player.canUse("sha", current) && get.effect(current, { name: "sha" }, player, player) > 0; - }) - ) { - return 1; - } - if (player.hasSha() && _status.currentPhase == player) { - if (player.getEquip("zhuge") || player.getCardUsable("sha") == 0) { - return 10; - } - } - var num = player.countCards("h", "sha"); - if (num > 1) return 6 + num; - return 3 + num; - }, - basic: { - equipValue: 5, - }, - tag: { - valueswap: 1, - }, - }, - skills: ["rw_zhuge_skill"], - }, - }, - characterFilter: { - simashi: function (mode) { - if (["boss", "chess", "tafang", "stone"].includes(mode)) return false; - if (mode == "versus") return _status.mode != "three"; - return true; - }, - }, - skill: { - //李昭焦伯 - mbzuoyou: { - audio: 2, - enable: "phaseUse", - usable: 1, - zhuanhuanji: true, - filterTarget(card, player, target) { - if (player.storage.mbzuoyou) return target.countCards("h") >= 2; - return true; - }, - async content(event, trigger, player) { - const storage = player.storage.mbzuoyou, - target = event.target; - if (event.name === "mbzuoyou") player.changeZhuanhuanji("mbzuoyou"); - if (!storage) { - await target.draw(2); - await target.chooseToDiscard(1, true, "h"); - } else { - await target.chooseToDiscard(target === player ? "佐佑" : `${get.translation(player)}对你发动了【佐佑】`, "请弃置两张手牌,然后获得1点护甲", 2, true); - await target.changeHujia(1, null, true); - } - }, - mark: true, - marktext: "☯", - intro: { - content(storage, player) { - if (!storage) return "转换技。出牌阶段限一次,你可以令一名角色摸两张牌,然后其弃置一张手牌。"; - return "转换技。出牌阶段限一次,你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。"; - }, - }, - ai: { - order(item, player) { - if ( - player.storage.mbzuoyou && - game.hasPlayer(current => { - return current !== player && get.effect(current, "mbzuoyou", player, player) > 0; - }) - ) - return get.order({ name: "zengbin" }) + 0.1; - return 2; - }, - result: { - target(player, target) { - let eff = 0; - if (player.storage.mbzuoyou) eff = target.hujia < 5 ? 1 : 0; - else eff = 1; - if (target === player && player.hasSkill("mbshishou")) eff /= 10; - return eff; - }, - }, - }, - }, - mbshishou: { - audio: 2, - trigger: { player: "useSkillAfter" }, - filter(event, player) { - return event.skill === "mbzuoyou" && !event.targets.includes(player); - }, - forced: true, - async content(event, trigger, player) { - await lib.skill.mbzuoyou.content( - { - target: player, - }, - {}, - player - ); - }, - ai: { - combo: "mbzuoyou", - }, - }, - //成济 - mbkuangli: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return game.hasPlayer(current => current !== player); - }, - forced: true, - group: ["mbkuangli_target", "mbkuangli_remove"], - async content(event, trigger, player) { - let targets = game.filterPlayer(current => current !== player).randomSort(); - targets = targets.slice(0, Math.ceil(Math.random() * targets.length)); - targets.sortBySeat(); - player.line(targets, "thunder"); - targets.forEach(current => { - current.addSkill("mbkuangli_mark"); - }); - await game.asyncDelayx(); - }, - subSkill: { - target: { - audio: "mbkuangli", - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - return event.target.hasSkill("mbkuangli_mark") && [player, event.target].some(current => current.countCards("he")); - }, - forced: true, - logTarget: "target", - usable: 2, - async content(event, trigger, player) { - const target = trigger.target; - const playerCards = player.getCards("he", card => { - return lib.filter.cardDiscardable(card, player, "mbkuangli"); - }); - if (playerCards.length > 0) await player.discard(playerCards.randomGet()); - const targetCards = target.getCards("he", card => { - return lib.filter.cardDiscardable(card, target, "mbkuangli"); - }); - if (targetCards.length > 0) await target.discard(targetCards.randomGet()); - await game.asyncDelayx(); - await player.draw(); - await game.asyncDelayx(); - }, - ai: { - effect: { - player(card, player, target, current) { - if (!target) return; - const counttrigger = player.storage.counttrigger; - if (counttrigger && counttrigger.mbkuangli_target && counttrigger.mbkuangli_target >= lib.skill.mbkuangli_target.usable) return; - if (target.hasSkill("mbkuangli_mark")) { - if (get.attitude(player, target) > 0) return 0.75; - return 1.25; - } - }, - }, - }, - }, - remove: { - audio: "mbkuangli", - trigger: { player: "phaseEnd" }, - filter(event, player) { - return game.hasPlayer(current => current.hasSkill("mbkuangli_mark")); - }, - forced: true, - async content(event, trigger, player) { - game.countPlayer(current => { - if (current.hasSkill("mbkuangli_mark")) { - player.line(current); - current.removeSkill("mbkuangli_mark"); - } - }); - }, - }, - mark: { - mark: true, - marktext: "戾", - charlotte: true, - intro: { - name: "狂戾", - name2: "狂戾", - content: "已拥有“狂戾”标记", - }, - }, - }, - }, - mbxiongsi: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return player.countCards("h") >= 3; - }, - limited: true, - skillAnimation: true, - animationColor: "fire", - filterCard: true, - selectCard: [-1, -2], - async content(event, trigger, player) { - player.awakenSkill("mbxiongsi"); - const targets = game.filterPlayer(current => current !== player); - for (const target of targets) { - player.line(target, "thunder"); - await target.loseHp(); - } - }, - ai: { - order(item, player) { - if (get.effect(player, "mbxiongsi", player) <= 0) return 1; - if ( - player.countCards("h") > 3 && - player.countCards("h", card => { - return player.hasValueTarget(card); - }) > 0 - ) - return 0.1; - return 8; - }, - result: { - player(player) { - let eff = 0; - game.countPlayer(current => { - let effx = get.effect(current, { name: "losehp" }, player, player); - if (get.attitude(player, current) < -6 && current.getHp() <= 1) effx *= 1.3; - eff += effx; - }); - eff *= player.getHp() + player.countCards("hs", card => player.canSaveCard(card, player)) <= 2 ? 1.5 : 0.35; - eff -= player - .getCards("h") - .map(card => { - if (lib.filter.cardDiscardable(card, player, "mbxiongsi")) return get.value(card); - return 0; - }) - .reduce((p, c) => p + c, 0); - if (eff > 0) return 2; - return -1; - }, - }, - }, - }, - //SP母兵脸 - mbcuizhen: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter(event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - game.hasPlayer(current => { - return current !== player && current.hasEnabledSlot(1); - }) && - get.mode() == "identity" - ); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt("mbcuizhen"), "废除至多两名其他角色的武器栏", [1, 2], (card, player, target) => { - return target !== player && target.hasEnabledSlot(1); - }) - .set("ai", target => { - return -get.attitude(get.player(), target); - }) - .forResult(); - }, - group: ["mbcuizhen_inphase", "mbcuizhen_draw"], - async content(event, trigger, player) { - const targets = event.targets.slice().sortBySeat(); - for (const target of targets) { - await target.disableEquip(1); - } - await game.asyncDelay(); - }, - subSkill: { - inphase: { - audio: "mbcuizhen", - trigger: { - player: "useCardToPlayered", - }, - filter(event, player) { - if (!player.isPhaseUsing()) return false; - if (!get.tag(event.card, "damage")) return false; - const target = event.target; - return target !== player && target.countCards("h") >= target.getHp() && target.hasEnabledSlot(1); - }, - prompt2: "废除其的武器栏", - logTarget: "target", - check(event, player) { - return get.attitude(player, event.target) <= 0; - }, - async content(event, trigger, player) { - await trigger.target.disableEquip(1); - await game.asyncDelayx(); - }, - }, - draw: { - audio: "mbcuizhen", - trigger: { player: "phaseDrawBegin2" }, - forced: true, - locked: false, - filter(event, player) { - return ( - !event.numFixed && - game.hasPlayer(current => { - return current.hasDisabledSlot(1); - }) - ); - }, - async content(event, trigger, player) { - trigger.num += Math.min( - 2, - game.countPlayer(current => { - return current.countDisabledSlot(1); - }) - ); - }, - }, - }, - }, - mbkuili: { - audio: 2, - trigger: { - player: "damageEnd", - }, - filter(event, player) { - return player.countCards("h") > 0 || (event.source && event.source.isIn() && event.source.hasDisabledSlot(1)); - }, - forced: true, - async content(event, trigger, player) { - if (player.countCards("h") > 0) { - await player.chooseToDiscard(`溃离:请弃置${get.cnNumber(trigger.num)}张手牌`, trigger.num, true); - } - const source = trigger.source; - if (source && source.isIn() && source.hasDisabledSlot(1)) { - player.line(source, "green"); - await source.enableEquip(1, player); - } - }, - ai: { - neg: true, - }, - }, - //曹髦 史?! - mbqianlong: { - audio: 6, - trigger: { - player: ["mbqianlong_beginAfter", "mbqianlong_addAfter", "mbweitongAfter"], - }, - filter(event, player) { - let skills = []; - if (player.additionalSkills && player.additionalSkills.mbqianlong) skills.addArray(player.additionalSkills.mbqianlong); - return player.countMark("mbqianlong") >= 25 * skills.length; - }, - forced: true, - locked: false, - beginMarkCount: 20, - maxMarkCount: 100, - derivation: ["mbcmqingzheng", "mbcmjiushi", "mbcmfangzhu", "mbjuejin"], - addMark(player, num) { - num = Math.min(num, lib.skill.mbqianlong.maxMarkCount - player.countMark("mbqianlong")); - player.addMark("mbqianlong", num); - }, - group: ["mbqianlong_begin", "mbqianlong_add"], - async content(event, trigger, player) { - player.addAdditionalSkill("mbqianlong", lib.skill.mbqianlong.derivation.slice(0, Math.floor(player.countMark("mbqianlong") / 25))); - }, - marktext: "道", - intro: { - name: "道心(潜龙)", - name2: "道心", - content: "当前道心数为#", - }, - subSkill: { - begin: { - audio: "mbqianlong", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - locked: false, - async content(event, trigger, player) { - lib.skill.mbqianlong.addMark(player, lib.skill.mbqianlong.beginMarkCount); - }, - }, - add: { - audio: "mbqianlong", - trigger: { - player: ["gainAfter", "damageEnd"], - source: "damageSource", - global: "loseAsyncAfter", - }, - filter(event, player) { - if (player.countMark("mbqianlong") >= lib.skill.mbqianlong.maxMarkCount) return false; - if (event.name === "damage") return event.num > 0; - return event.getg(player).length > 0; - }, - getIndex(event, player, triggername) { - if (event.name === "damage") return event.num; - return 1; - }, - forced: true, - locked: false, - async content(event, trigger, player) { - let toAdd = 5 * (1 + (trigger.name === "damage") + (event.triggername === "damageSource")); - lib.skill.mbqianlong.addMark(player, toAdd); - }, - }, - }, - }, - mbweitong: { - audio: 1, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter(event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - game.hasPlayer(current => { - return current !== player && current.group === "wei" && player.hasZhuSkill("mbweitong", current); - }) - ); - }, - zhuSkill: true, - forced: true, - locked: false, - async content(event, trigger, player) { - lib.skill.mbqianlong.addMark( - player, - 20 * - game.countPlayer(current => { - return current !== player && current.group === "wei" && player.hasZhuSkill("mbweitong", current); - }) - ); - }, - ai: { - combo: "mbqianlong", - }, - }, - mbcmqingzheng: { - audio: "sbqingzheng", - audioname: ["mb_caomao"], - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return player.countCards("h") > 0; - }, - direct: true, - content() { - "step 0"; - var num = 2; - var prompt = "###" + get.prompt("sbqingzheng") + "###弃置" + get.cnNumber(num) + "种花色的所有牌"; - var next = player.chooseButton([prompt, [lib.suit.map(i => ["", "", "lukai_" + i]), "vcard"]], num); - next.set("filterButton", button => { - var player = _status.event.player; - var cards = player.getCards("h", { suit: button.link[2].slice(6) }); - return cards.length > 0 && cards.filter(card => lib.filter.cardDiscardable(card, player, "sbqingzheng")).length == cards.length; - }); - next.set("ai", button => { - var player = _status.event.player; - return ( - 15 - - player - .getCards("h", { suit: button.link[2].slice(6) }) - .map(i => get.value(i)) - .reduce((p, c) => p + c, 0) - ); - }); - next.set("custom", { - replace: { - button: function (button) { - if (!_status.event.isMine()) return; - if (button.classList.contains("selectable") == false) return; - var cards = _status.event.player.getCards("h", { - suit: button.link[2].slice(6), - }); - if (cards.length) { - var chosen = cards.filter(i => ui.selected.cards.includes(i)).length == cards.length; - if (chosen) { - ui.selected.cards.removeArray(cards); - cards.forEach(card => { - card.classList.remove("selected"); - card.updateTransform(false); - }); - } else { - ui.selected.cards.addArray(cards); - cards.forEach(card => { - card.classList.add("selected"); - card.updateTransform(true); - }); - } - } - if (button.classList.contains("selected")) { - ui.selected.buttons.remove(button); - button.classList.remove("selected"); - if (_status.multitarget || _status.event.complexSelect) { - game.uncheck(); - game.check(); - } - } else { - button.classList.add("selected"); - ui.selected.buttons.add(button); - } - var custom = _status.event.custom; - if (custom && custom.add && custom.add.button) { - custom.add.button(); - } - game.check(); - }, - }, - add: next.custom.add, - }); - "step 1"; - if (result.bool) { - var cards = result.cards; - if (!cards.length) { - var suits = result.links.map(i => i[2].slice(6)); - cards = player.getCards("h", card => suits.includes(get.suit(card, player))); - } - event.cards = cards; - if (!cards.length) event.finish(); - else - player - .chooseTarget("清正:观看一名其他角色的手牌并弃置其中一种花色的所有牌", (card, player, target) => { - return target != player && target.countCards("h"); - }) - .set("ai", target => { - var player = _status.event.player, - att = get.attitude(player, target); - if (att >= 0) return 0; - return 1 - att / 2 + Math.sqrt(target.countCards("h")); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("sbqingzheng", target); - player.discard(cards); - var list = []; - var dialog = ["清正:弃置" + get.translation(target) + "一种花色的所有牌"]; - for (var suit of lib.suit.concat("none")) { - if (target.countCards("h", { suit: suit })) { - dialog.push('
    ' + get.translation(suit + "2") + "牌
    "); - dialog.push(target.getCards("h", { suit: suit })); - list.push(suit); - } - } - if (list.length) { - player - .chooseControl(list) - .set("dialog", dialog) - .set("ai", () => { - return _status.event.control; - }) - .set( - "control", - (() => { - var getv = cards => cards.map(i => get.value(i)).reduce((p, c) => p + c, 0); - return list.sort((a, b) => { - return getv(target.getCards("h", { suit: b })) - getv(target.getCards("h", { suit: a })); - })[0]; - })() - ); - } - } else event.finish(); - "step 3"; - var cards2 = target.getCards("h", { suit: result.control }); - event.cards2 = cards2; - target.discard(cards2, "notBySelf").set("discarder", player); - "step 4"; - if (event.cards2.length < cards.length) target.damage(); - }, - }, - mbcmjiushi: { - audio: "rejiushi", - inherit: "rejiushi", - group: ["rejiushi1", "mbcmjiushi_check", "mbcmjiushi_turnback", "mbcmjiushi_gain"], - subSkill: { - check: { - trigger: { player: "damageBegin3" }, - silent: true, - firstDo: true, - filter(event, player) { - return player.isTurnedOver(); - }, - content() { - trigger.mbcmjiushi = true; - }, - }, - turnback: { - audio: "rejiushi", - audioname: ["mb_caomao"], - trigger: { player: "damageEnd" }, - check(event, player) { - return player.isTurnedOver(); - }, - filter(event, player) { - return event.mbcmjiushi; - }, - prompt(event, player) { - return "是否发动【酒诗】,将武将牌翻面?"; - }, - content() { - delete trigger.mbcmjiushi; - player.turnOver(); - }, - }, - gain: { - audio: "rejiushi", - audioname: ["mb_caomao"], - trigger: { player: "turnOverAfter" }, - frequent: true, - prompt: "是否发动【酒诗】,获得牌堆中的一张锦囊牌?", - content() { - var card = get.cardPile2(function (card) { - return get.type2(card) == "trick"; - }); - if (card) player.gain(card, "gain2"); - }, - }, - }, - }, - mbcmfangzhu: { - audio: "sbfangzhu", - audioname: ["mb_caomao"], - inherit: "sbfangzhu", - filter(event, player) { - return game.hasPlayer(current => current !== player); - }, - usable: 1, - chooseButton: { - dialog() { - const dialog = ui.create.dialog("放逐:令一名其他角色...", "hidden"); - dialog.add([ - [ - [1, "不能使用手牌中的非锦囊牌直到其回合结束"], - [2, "非Charlotte技能失效直到其回合结束"], - ], - "textbutton", - ]); - return dialog; - }, - check(button) { - const player = get.player(); - if (button.link === 2) { - if ( - game.hasPlayer(target => { - if (target.hasSkill("mbcmfangzhu_ban") || target.hasSkill("fengyin") || target.hasSkill("baiban")) return false; - return ( - get.attitude(player, target) < 0 && - ["name", "name1", "name2"] - .map((sum, name) => { - if (target[name] && (name != "name1" || target.name != target.name1)) { - if (get.character(target[name])) return get.rank(target[name], true); - } - return 0; - }) - .reduce((p, c) => { - return p + c; - }, 0) > 5 - ); - }) - ) - return 6; - } - return button.link === 1 ? 1 : 0; - }, - backup(links, player) { - return { - num: links[0], - audio: "sbfangzhu", - filterCard: () => false, - selectCard: -1, - filterTarget(card, player, target) { - if (target == player) return false; - const num = lib.skill.mbcmfangzhu_backup.num, - storage = target.getStorage("mbcmfangzhu_ban"); - return num != 1 || !storage.length; - }, - async content(event, trigger, player) { - const target = event.target; - const num = lib.skill.mbcmfangzhu_backup.num; - switch (num) { - case 1: - target.addTempSkill("mbcmfangzhu_ban", { player: "phaseEnd" }); - target.markAuto("mbcmfangzhu_ban", ["trick"]); - break; - case 2: - target.addTempSkill("mbcmfangzhu_baiban", { player: "phaseEnd" }); - break; - } - }, - ai: { - result: { - target(player, target) { - switch (lib.skill.mbcmfangzhu_backup.num) { - case 1: - return -target.countCards("h", card => get.type(card) != "trick") - 1; - case 2: - return -target.getSkills(null, null, false).reduce((sum, skill) => { - return sum + Math.max(get.skillRank(skill, "out"), get.skillRank(skill, "in")); - }, 0); - } - }, - }, - }, - }; - }, - prompt(links, player) { - const str = "###放逐###"; - switch (links[0]) { - case 1: - return str + "令一名其他角色不能使用手牌中的非锦囊牌直到其回合结束"; - case 2: - return str + "令一名其他角色的非Charlotte技能失效直到其回合结束"; - } - }, - }, - ai: { - order: 10, - result: { - player(player) { - return game.hasPlayer(current => get.attitude(player, current) < 0) ? 1 : 0; - }, - }, - }, - subSkill: { - backup: {}, - baiban: { - inherit: "baiban", - marktext: "逐", - }, - ban: { - charlotte: true, - onremove: true, - mark: true, - marktext: "禁", - intro: { - markcount: () => 0, - content(storage) { - if (storage.length > 1) return "不能使用手牌"; - return "不能使用手牌中的非" + get.translation(storage[0]) + "牌"; - }, - }, - mod: { - cardEnabled(card, player) { - const storage = player.getStorage("mbcmfangzhu_ban"); - const hs = player.getCards("h"), - cards = [card]; - if (Array.isArray(card.cards)) cards.addArray(card.cards); - if (cards.containsSome(...hs) && !storage.includes(get.type2(card))) return false; - }, - cardSavable(card, player) { - const storage = player.getStorage("mbcmfangzhu_ban"); - const hs = player.getCards("h"), - cards = [card]; - if (Array.isArray(card.cards)) cards.addArray(card.cards); - if (cards.containsSome(...hs) && !storage.includes(get.type2(card))) return false; - }, - }, - }, - }, - }, - mbjuejin: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "thunder", - filterCard: () => false, - selectCard: [-1, -2], - filterTarget: true, - selectTarget: -1, - multiline: true, - async contentBefore(event, trigger, player) { - player.awakenSkill("mbjuejin"); - }, - async content(event, trigger, player) { - const target = event.target; - const delt = target.getHp(true) - 1, - num = Math.abs(delt); - await target[delt > 0 ? "loseHp" : "recover"](num); - if (num > 0) await target.changeHujia(num, null, true); - }, - async contentAfter(event, trigger, player) { - game.addGlobalSkill("mbjuejin_xiangsicunwei"); - player.$fullscreenpop("向死存魏!", "thunder"); - }, - ai: { - order: 0.1, - result: { - player(player) { - let eff = 1; - game.countPlayer(current => { - const att = get.attitude(player, current), - num = Math.abs(current.getHp(true) - 1); - const delt = Math.max(0, num + current.hujia - 5); - eff -= att * delt; - }); - return eff > 0 ? 1 : 0; - }, - }, - }, - subSkill: { - xiangsicunwei: { - trigger: { - global: ["loseAfter", "equipAfter", "loseAsyncAfter", "cardsDiscardAfter"], - }, - forced: true, - silent: true, - firstDo: true, - filter(event, player) { - const nameList = ["shan", "tao", "jiu"]; - return event.getd().some(card => { - return nameList.includes(get.name(card, false)) && get.position(card, true) === "d"; - }); - }, - async content(event, trigger, player) { - const nameList = ["shan", "tao", "jiu"]; - const cards = trigger.getd().filter(card => { - return nameList.includes(get.name(card, false)) && get.position(card, true) === "d"; - }); - await game.cardsGotoSpecial(cards); - game.log(cards, "被移出了游戏"); - }, - }, - }, - }, - //杨奉 - mbxuetu: { - audio: 2, - audioname: ["re_yangfeng"], - enable: "phaseUse", - usable: 2, - filter(event, player) { - if (player.countMark("mbxuetu_status") !== 1 && player.getStat("skill").mbxuetu) return false; - if (!player.storage.mbxuetu) return player.countCards("he"); - return true; - }, - zhuanhuanji2(skill, player) { - return player.countMark("mbxuetu_status") !== 1; - }, - filterCard(card, player) { - if (player.countMark("mbxuetu_status") > 1) return false; - if (player.countMark("mbxuetu_status") === 1) { - if (player.getStorage("mbxuetu_used").includes(false)) return false; - return true; - } - return !player.storage.mbxuetu; - }, - selectCard() { - const player = get.player(); - if (player.countMark("mbxuetu_status") > 1) return -1; - if (player.countMark("mbxuetu_status") === 1) { - if (player.getStorage("mbxuetu_used").includes(false)) return -1; - if (player.getStorage("mbxuetu_used").includes(true)) return 1; - return [0, 1]; - } - return !player.storage.mbxuetu ? 1 : -1; - }, - check(card) { - return 6 - get.value(card); - }, - prompt() { - const player = get.player(), - storage = player.storage.mbxuetu, - status = player.countMark("mbxuetu_status"); - if (status === 0) { - if (storage) return "转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。"; - return "转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。"; - } else if (status === 1) { - return "出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。"; - } else { - if (storage) return "转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。"; - return "转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。"; - } - }, - position: "he", - filterTarget: true, - onremove: ["mbxuetu", "mbxuetu_status"], - derivation: ["mbxuetu_achieve", "mbxuetu_fail"], - async content(event, trigger, player) { - const target = event.targets[0], - storage = Boolean(player.storage.mbxuetu); - const status = player.countMark("mbxuetu_status"); - player.changeZhuanhuanji("mbxuetu"); - if (status < 2) { - if (!player.storage.mbxuetu_used) { - player.when(["phaseUseAfter", "mbweiming_achieveAfter"]).then(() => { - delete player.storage.mbxuetu_used; - }); - } - player.markAuto("mbxuetu_used", [status === 0 ? storage : !event.cards.length]); - if ((status === 0 && !storage) || (status === 1 && event.cards.length)) { - await target.recover(); - } else { - await player.loseHp(); - await target.draw(2); - } - } else { - if (!storage) { - await player.recover(); - await target.chooseToDiscard(2, true, "he"); - } else { - await player.draw(); - await target.damage(); - } - } - }, - mark: true, - marktext: "☯", - intro: { - content: (storage, player) => { - if (!player.countMark("mbxuetu_status")) { - if (storage) return "转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。"; - return "转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。"; - } else { - if (storage) return "转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。"; - return "转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。"; - } - }, - }, - ai: { - order(item, player) { - const status = player.countMark("mbxuetu_status"); - if (status > 1) return Math.max(get.order({ name: "guohe" }), get.order({ name: "chuqibuyi" })); - if (status === 1 || player.storage.mbxuetu) return 9; - return 2; - }, - result: { - target(player, target) { - const status = player.countMark("mbxuetu_status"); - if (status > 1) { - if (player.storage.mbxuetu) return -get.damageEffect(target, player, player) / 10; - return -2; - } - if ((status === 0 && player.storage.mbxuetu) || (status === 1 && !ui.selected.cards.length)) return 2; - const eff = get.recoverEffect(target, player, player); - return eff > 0 ? 2 : eff < 0 ? -get.sgnAttitude(player, target) : 0; - }, - player(player, target) { - const status = player.countMark("mbxuetu_status"); - if (status > 1) { - if (player.storage.mbxuetu) return 1; - return get.recoverEffect(player, player) / 6; - } - if (status === 1 || !player.storage.mbxuetu) return -0.5; - const eff = get.effect(player, { name: "losehp" }, player, player); - if (eff >= 0) return Math.min(1, eff / 2); - const hp = - player.getHp() + - player.countCards("hes", card => { - return player.canSaveCard(card, player); - }); - return -1.5 * Math.max(0, 3 - hp); - }, - }, - }, - }, - mbweiming: { - audio: 3, - dutySkill: true, - locked: true, - group: ["mbweiming_achieve", "mbweiming_fail", "mbweiming_effect"], - intro: { - content: "已记录$", - }, - subSkill: { - effect: { - audio: "mbweiming1.mp3", - trigger: { - player: "phaseUseBegin", - }, - filter(event, player) { - return game.hasPlayer(current => { - return !player.getStorage("mbweiming").includes(current); - }); - }, - forced: true, - direct: true, - async content(event, trigger, player) { - const targets = await player - .chooseTarget("威命:记录一名未记录过的角色", "当你杀死没有被记录过的角色后,则〖威命〗使命成功;如果在你杀死这些角色中的一名之前,有被记录过的角色死亡,则你〖威命〗使命失败。", true) - .set("filterTarget", (card, player, target) => { - return !player.getStorage("mbweiming").includes(target); - }) - .set("ai", target => { - if (target === player) return 1; - return 1 + (Math.sqrt(Math.abs(get.attitude(player, target))) * Math.abs(get.threaten(target))) / Math.sqrt(target.getHp() + 1) / Math.sqrt(target.countCards("hes") + 1); - }) - .forResultTargets(); - if (targets && targets.length > 0) { - const target = targets[0]; - player.logSkill("mbweiming_effect", target); - player.markAuto("mbweiming", target); - } - }, - }, - achieve: { - audio: "mbweiming2.mp3", - trigger: { - source: "dieAfter", - }, - filter(event, player) { - return !player.getStorage("mbweiming").includes(event.player); - }, - dutySkill: true, - forced: true, - skillAnimation: true, - animationColor: "fire", - async content(event, trigger, player) { - game.log(player, "成功完成使命"); - player.awakenSkill("mbweiming"); - player.storage.mbxuetu_status = 1; - player.unmarkSkill("mbxuetu"); - await game.asyncDelayx(); - }, - }, - fail: { - audio: "mbweiming3.mp3", - trigger: { - global: "dieAfter", - }, - filter(event, player) { - return player.getStorage("mbweiming").includes(event.player); - }, - dutySkill: true, - forced: true, - async content(event, trigger, player) { - game.log(player, "使命失败"); - player.awakenSkill("mbweiming"); - player.storage.mbxuetu_status = 2; - game.broadcastAll(player => { - player.tempname.add("re_yangfeng"); - }, player); - await game.asyncDelayx(); - }, - }, - }, - ai: { - combo: "mbxuetu", - }, - }, - //霍骏 - sidai: { - audio: "twsidai", - enable: "phaseUse", - usable: 1, - locked: false, - limited: true, - skillAnimation: true, - animationColor: "fire", - filter: function (event, player) { - var cards = player.getCards("h", { type: "basic" }); - if (!cards.length) return false; - for (var i of cards) { - if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; - } - return event.filterCard(get.autoViewAs({ name: "sha", storage: { sidai: true } }, cards), player, event); - }, - viewAs: { name: "sha", storage: { sidai: true } }, - filterCard: { type: "basic" }, - selectCard: -1, - check: () => 1, - onuse: function (result, player) { - player.awakenSkill("sidai"); - player.addTempSkill("sidai_tao"); - player.addTempSkill("sidai_shan"); - }, - ai: { - order: function (item, player) { - return get.order({ name: "sha" }, player) + 0.1; - }, - result: { - target: function (player, target) { - var cards = ui.selected.cards.slice(0); - var names = []; - for (var i of cards) names.add(i.name); - if (names.length < player.hp) return 0; - if (player.hasUnknown() && (player.identity != "fan" || !target.isZhu)) return 0; - if (get.attitude(player, target) >= 0) return -20; - return lib.card.sha.ai.result.target.apply(this, arguments); - }, - }, - }, - subSkill: { - tao: { - trigger: { source: "damageSource" }, - filter: function (event, player) { - if (!event.card || !event.card.storage || !event.card.storage.sidai || !event.player.isIn()) return false; - for (var i of event.cards) { - if (i.name == "tao") return true; - } - return false; - }, - forced: true, - popup: false, - content: function () { - trigger.player.loseMaxHp(); - }, - }, - shan: { - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - if (!event.card || !event.card.storage || !event.card.storage.sidai || !event.target.isIn()) return false; - for (var i of event.cards) { - if (i.name == "shan") return true; - } - return false; - }, - forced: true, - popup: false, - content: function () { - "step 0"; - trigger.target.chooseToDiscard("h", { type: "basic" }, "弃置一张基本牌,否则不能响应" + get.translation(trigger.card)).set("ai", function (card) { - var player = _status.event.player; - if ( - player.hasCard("hs", function (cardx) { - return cardx != card && get.name(cardx, player) == "shan"; - }) - ) - return 12 - get.value(card); - return 0; - }); - "step 1"; - if (!result.bool) trigger.directHit.add(trigger.target); - }, - }, - }, - }, - jieyu: { - audio: "twjieyu", - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - for (let i = 0; i < ui.discardPile.childElementCount; i++) { - if (get.type(ui.discardPile.childNodes[i], false) == "basic") return true; - } - return false; - }, - prompt2: function (event, player) { - const num = lib.skill.jieyu.getNum(player); - return "获得弃牌堆中" + get.cnNumber(num) + "张" + (num > 1 ? "牌名各不相同的" : "") + "基本牌"; - }, - async content(event, trigger, player) { - const num = lib.skill.jieyu.getNum(player, event); - let gains = [], - names = []; - for (let i = 0; i < ui.discardPile.childElementCount; i++) { - let card = ui.discardPile.childNodes[i]; - if (get.type(card, false) == "basic" && !names.includes(card.name)) { - gains.push(card); - names.push(card.name); - } - } - if (gains.length) player.gain(gains.randomGets(Math.min(gains.length, num)), "gain2"); - }, - getNum: function (player, event) { - let num = get.mode() == "identity" ? 3 : 4; - const history = game.getAllGlobalHistory("everything"); - for (let i = history.length - 1; i >= 0; i--) { - const evt = history[i]; - if (evt.name == "jieyu" && evt.player == player) { - if (!event || evt != event) break; - } - if (evt.name == "useCard" && evt.player != player && evt.targets && evt.targets.includes(player) && get.tag(evt.card, "damage")) { - num--; - if (num == 1) break; - } - } - return num; - }, - }, - //木鹿大王 - shoufa: { - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - filter: function (event, player, name) { - if (name == "damageSource" && player.getHistory("sourceDamage").indexOf(event) != 0) return false; - return game.hasPlayer(target => { - const num = get.mode() == "doudizhu" ? 1 : 2; - if (name == "damageEnd" && get.distance(player, target) <= num) return false; - if (name == "damageSource" && get.distance(player, target) > num) return false; - const zhoufa = player.storage.zhoulin_zhoufa; - if (!zhoufa) return true; - if (zhoufa == "豹" || zhoufa == "兔") return true; - if (zhoufa == "鹰") return target.countCards("he"); - return target.countDiscardableCards(player, "e"); - }); - }, - direct: true, - async content(event, trigger, player) { - const zhoufa = player.storage.zhoulin_zhoufa; - const str = zhoufa ? ["令其受到1点无来源伤害", "你随机获得其一张牌", "你随机弃置其装备区的一张牌", "令其摸一张牌"][["豹", "鹰", "熊", "兔"].indexOf(zhoufa)] : "令其随机执行一个效果"; - const nodoudizhu = get.mode() == "doudizhu" ? "距离" + (event.triggername == "damageEnd" ? "" : "不") + "大于1的" : "距离" + (event.triggername == "damageEnd" ? "" : "不") + "大于2的"; - const { - result: { bool, targets }, - } = await player - .chooseTarget(get.prompt("shoufa"), "选择一名" + nodoudizhu + "角色," + str, (card, player, target) => { - const name = _status.event.triggername; - const num = get.mode() == "doudizhu" ? 1 : 2; - if (name == "damageEnd" && get.distance(player, target) <= num) return false; - if (name == "damageSource" && get.distance(player, target) > num) return false; - const zhoufa = player.storage.zhoulin_zhoufa; - if (!zhoufa) return true; - if (zhoufa == "豹" || zhoufa == "兔") return true; - if (zhoufa == "鹰") return target.countCards("he"); - return target.countDiscardableCards(player, "e"); - }) - .set("ai", target => { - const player = _status.event.player; - const zhoufa = player.storage.zhoulin_zhoufa; - if (!zhoufa) return -get.attitude(player, target); - switch (zhoufa) { - case "豹": - return get.damageEffect(target, player, player); - case "鹰": - return get.effect(target, { name: "guohe_copy2" }, player, player); - case "熊": - let att = get.attitude(player, target), - eff = 0; - target.getCards("e", card => { - var val = get.value(card, target); - eff = Math.max(eff, -val * att); - }); - return eff; - case "兔": - return get.effect(target, { name: "draw" }, player, player); - } - }) - .set("triggername", event.triggername); - if (!bool) return; - const target = targets[0]; - player.logSkill("shoufa", target); - const shoufa = zhoufa ? zhoufa : ["豹", "鹰", "熊", "兔"].randomGet(); - game.log(target, "执行", "#g" + shoufa, "效果"); - switch (shoufa) { - case "豹": - target.damage("nosource"); - break; - case "鹰": - player.gain(target.getGainableCards(player, "he").randomGet(), target, "giveAuto"); - break; - case "熊": - target.discard(target.getGainableCards(player, "e").randomGet()).discarder = player; - break; - case "兔": - target.draw(); - break; - } - }, - }, - yuxiang: { - mod: { - globalFrom(from, to, distance) { - if (from.hujia > 0) return distance - 1; - }, - globalTo(from, to, distance) { - if (to.hujia > 0) return distance + 1; - }, - }, - audio: true, - trigger: { player: "damageBegin2" }, - filter: function (event, player) { - return player.hujia > 0 && event.hasNature("fire"); - }, - forced: true, - async content(event, trigger, player) { - trigger.num++; - }, - }, - zhoulin: { - audio: 2, - limited: true, - unique: true, - enable: "phaseUse", - skillAnimation: true, - animationColor: "fire", - async content(event, trigger, player) { - player.awakenSkill("zhoulin"); - player.changeHujia(2, null, true); - const { - result: { control }, - } = await player - .chooseControl("豹", "鹰", "熊", "兔") - .set("ai", () => "豹") - .set("prompt", "选择一个固定效果"); - if (control) { - player.popup(control); - game.log(player, "选择了", "#g" + control, "效果"); - player.addTempSkill("zhoulin_zhoufa"); - player.storage.zhoulin_zhoufa = control; - player.markSkill("zhoulin_zhoufa"); - game.broadcastAll( - function (player, zhoufa) { - if (player.marks.zhoulin_zhoufa) player.marks.zhoulin_zhoufa.firstChild.innerHTML = zhoufa; - }, - player, - control - ); - } - }, - ai: { - order: 12, - result: { player: 1 }, - }, - subSkill: { - zhoufa: { - charlotte: true, - onremove: true, - intro: { content: "已选择$效果" }, - }, - }, - }, - //陈珪 - guimou: { - audio: 2, - trigger: { - global: "phaseBefore", - player: ["enterGame", "phaseEnd", "phaseZhunbeiBegin"], - }, - filter: function (event, player, name) { - if (event.name == "phaseZhunbei" || name == "phaseEnd") return true; - return event.name != "phase" || game.phaseNumber == 0; - }, - direct: true, - locked: true, - content: function* (event, map) { - var player = map.player, - trigger = map.trigger; - if (trigger.name != "phaseZhunbei") { - player.logSkill("guimou"); - var result, - choiceList = ["惩罚期间使用牌最少的角色", "惩罚期间弃置牌最少的角色", "惩罚期间得到牌最少的角色"]; - if (trigger.name != "phase" || game.phaseNumber == 0) result = { index: get.rand(0, 2) }; - else - result = yield player - .chooseControl() - .set("choiceList", choiceList) - .set("ai", () => get.rand(0, 2)); - var str = choiceList[result.index]; - game.log(player, "选择", "#g" + str); - player.addSkill("guimou_" + result.index); - return; - } - var targets = []; - for (var i = 0; i <= 2; i++) { - var skill = "guimou_" + i; - if (player.hasSkill(skill)) { - var storage = player.storage[skill], - nums = storage[0].slice(); - var targetx = nums.sort((a, b) => storage[1][storage[0].indexOf(a)] - storage[1][storage[0].indexOf(b)]); - targetx = targetx.filter(target => storage[1][storage[0].indexOf(target)] == storage[1][storage[0].indexOf(targetx[0])]); - targets.addArray(targetx); - player.removeSkill(skill); - } - } - targets = targets.filter(target => target != player && target.countCards("h")); - if (targets.length) { - var result = yield player - .chooseTarget( - "请选择【诡谋】的目标", - "观看一名可选择的角色的手牌并选择其中一张牌,然后你可以此牌交给另一名其他角色或弃置此牌", - (card, player, target) => { - return _status.event.targets.includes(target) && target.countCards("h"); - }, - true - ) - .set("ai", target => { - return Math.sqrt(Math.min(3, target.countCards("h"))) * get.effect(target, { name: "guohe_copy2" }, player, player); - }) - .set("targets", targets); - if (result.bool) { - var target = result.targets[0]; - player.logSkill("guimou", target); - player.addExpose(0.3); - var result2 = yield player - .choosePlayerCard(target, "h", "visible", true) - .set("ai", button => { - return get.value(button.link); - }) - .set("prompt", "诡谋:请选择" + get.translation(target) + "的一张手牌") - .set("prompt2", '
    将选择的牌交给另一名其他角色或弃置此牌
    '); - if (result2.bool) { - var cards = result2.links.slice(), - result3; - if (!game.hasPlayer(targetx => targetx != player && targetx != target)) result3 = { bool: false }; - else - result3 = yield player - .chooseTarget("是否令另一名其他角色获得" + get.translation(cards) + "?", (card, player, target) => { - return target != player && target != _status.event.target; - }) - .set("ai", target => get.attitude(_status.event.player, target)) - .set("target", target); - if (result3.bool) { - var targetx = result3.targets[0]; - player.line(targetx); - targetx.gain(cards, target, "give"); - } else target.discard(cards).discarder = player; - } - } - } - }, - subSkill: { - 0: { - charlotte: true, - onremove: true, - init: function (player, skill) { - if (!player.storage[skill]) { - player.storage[skill] = [[], []]; - var targets = game.filterPlayer().sortBySeat(player); - targets.forEach(target => { - player.storage[skill][0].push(target); - player.storage[skill][1].push(0); - }); - } - }, - mark: true, - intro: { - markcount: storage => 0, - content: function (storage, player) { - var str = "当前使用牌数排行榜"; - var lose = storage[1].slice().sort((a, b) => a - b)[0]; - storage[0].forEach(target => { - str += "
  • "; - var score = storage[1][storage[0].indexOf(target)]; - if (score == lose) str += ""; - str += " " + get.translation(target) + " "; - str += score + "张"; - if (score == lose) str += ""; - }); - return str; - }, - }, - trigger: { global: "useCard1" }, - forced: true, - popup: false, - content: function () { - var storage = player.storage["guimou_0"]; - if (!storage[0].includes(trigger.player)) { - storage[0].push(trigger.player); - storage[1].push(0); - } - storage[1][storage[0].indexOf(trigger.player)]++; - }, - }, - 1: { - charlotte: true, - onremove: true, - init: function (player, skill) { - if (!player.storage[skill]) { - player.storage[skill] = [[], []]; - var targets = game.filterPlayer().sortBySeat(player); - targets.forEach(target => { - player.storage[skill][0].push(target); - player.storage[skill][1].push(0); - }); - } - }, - mark: true, - intro: { - markcount: storage => 0, - content: function (storage, player) { - var str = "当前弃置牌数排行榜"; - var lose = storage[1].slice().sort((a, b) => a - b)[0]; - storage[0].forEach(target => { - str += "
  • "; - var score = storage[1][storage[0].indexOf(target)]; - if (score == lose) str += ""; - str += " " + get.translation(target) + " "; - str += score + "张"; - if (score == lose) str += ""; - }); - return str; - }, - }, - trigger: { global: ["loseAfter", "loseAsyncAfter"] }, - filter: function (event, player) { - return event.type == "discard" && game.hasPlayer(target => event.getl(target).cards2.length); - }, - forced: true, - popup: false, - content: function () { - var storage = player.storage["guimou_1"]; - var targets = game.filterPlayer(target => trigger.getl(target).cards2.length); - targets.forEach(target => { - if (!storage[0].includes(target)) { - storage[0].push(target); - storage[1].push(0); - } - storage[1][storage[0].indexOf(target)] += trigger.getl(target).cards2.length; - }); - }, - }, - 2: { - charlotte: true, - onremove: true, - init: function (player, skill) { - if (!player.storage[skill]) { - player.storage[skill] = [[], []]; - var targets = game.filterPlayer().sortBySeat(player); - targets.forEach(target => { - player.storage[skill][0].push(target); - player.storage[skill][1].push(0); - }); - } - }, - mark: true, - intro: { - markcount: storage => 0, - content: function (storage, player) { - var str = "当前得到牌数排行榜"; - var lose = storage[1].slice().sort((a, b) => a - b)[0]; - storage[0].forEach(target => { - str += "
  • "; - var score = storage[1][storage[0].indexOf(target)]; - if (score == lose) str += ""; - str += " " + get.translation(target) + " "; - str += score + "张"; - if (score == lose) str += ""; - }); - return str; - }, - }, - trigger: { global: ["gainAfter", "loseAsyncAfter"] }, - forced: true, - popup: false, - content: function () { - var storage = player.storage["guimou_2"]; - var targets = game.filterPlayer(target => trigger.getg(target).length); - targets.forEach(target => { - if (!storage[0].includes(target)) { - storage[0].push(target); - storage[1].push(0); - } - storage[1][storage[0].indexOf(target)] += trigger.getg(target).length; - }); - }, - }, - }, - }, - zhouxian: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - return event.player != player && get.tag(event.card, "damage"); - }, - forced: true, - logTarget: "player", - content: function* (event, map) { - var player = map.player, - trigger = map.trigger, - target = trigger.player; - var cards = get.cards(3); - yield game.cardsDiscard(cards); - player.showCards(cards, get.translation(player) + "发动了【州贤】"); - var result = yield target - .chooseToDiscard("he", "州贤:弃置一张其中有的类别的牌,或令此牌对" + get.translation(player) + "无效", (card, player) => { - return _status.event.cards.some(cardx => get.type2(cardx) == get.type2(card)); - }) - .set("cards", cards) - .set("ai", card => { - if (!_status.event.goon) return 0; - return 7.5 - get.value(card); - }) - .set("goon", get.effect(player, trigger.card, target, target) > 0); - if (!result.bool) trigger.getParent().excluded.add(player); - }, - ai: { - effect: { - target_use: function (card, player, target, current) { - if (get.tag(card, "damage") && get.attitude(player, target) < 0 && target != player) { - if (_status.event.name == "zhouxian") return; - if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; - var bs = player.getDiscardableCards(player, "he"); - bs.remove(card); - if (card.cards) bs.removeArray(card.cards); - else bs.removeArray(ui.selected.cards); - var cardx = Array.from(ui.cardPile.childNodes).slice(0, 3); - bs = bs.filter(i => cardx.some(j => get.type2(j) == get.type2(i))); - if (!bs.length) return "zerotarget"; - if (bs.length <= 2) { - if (bs.some(bsi => get.value(bsi) < 7)) return [1, 0, 1, -0.5]; - return [1, 0, 0.3, 0]; - } - return [1, 0, 1, -0.5]; - } - }, - }, - }, - }, - //胡班 - mbyilie: { - audio: 3, - trigger: { global: "phaseBefore", player: "enterGame" }, - filter: function (event, player) { - return !player.storage.mbyilie2 && (event.name != "phase" || game.phaseNumber == 0); - }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("mbyilie"), lib.filter.notMe).set("ai", function (target) { - var player = _status.event.player; - return Math.max(1 + get.attitude(player, target) * get.threaten(target), Math.random()); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("mbyilie", target); - player.storage.mbyilie2 = target; - player.addSkill("mbyilie2"); - } - }, - marktext: "烈", - intro: { - name2: "烈", - content: "mark", - }, - group: "mbyilie3", - }, - mbyilie2: { - charlotte: true, - audio: "mbyilie", - trigger: { global: ["damageBegin4", "damageSource"] }, - filter: function (event, player, name) { - var target = player.storage.mbyilie2; - if (name == "damageSource") return event.source == target && event.player != target && player.isDamaged(); - return event.player == target && player.countMark("mbyilie") < 2; - }, - forced: true, - logTarget: function (event, player) { - return player.storage.mbyilie2; - }, - content: function () { - if (event.triggername == "damageSource") player.recover(); - else { - player.addMark("mbyilie", trigger.num); - trigger.cancel(); - } - }, - }, - mbyilie3: { - audio: "mbyilie", - trigger: { player: "phaseEnd" }, - filter: function (event, player) { - return player.hasMark("mbyilie"); - }, - forced: true, - content: function () { - "step 0"; - player.draw(); - "step 1"; - var num = player.countMark("mbyilie"); - if (num) { - player.loseHp(num); - player.removeMark("mbyilie", num); - } - }, - }, - //向朗 - naxue: { - audio: 2, - trigger: { player: "phaseUseBefore" }, - check: function (event, player) { - var cards = player.getCards("h", card => player.hasValueTarget(card)); - if (!cards.length) return true; - if (!(player.hp >= 2 && player.countCards("h") <= player.hp + 1)) return false; - return game.hasPlayer(function (target) { - if (target.hasJudge("lebu") || target == player) return false; - if (get.attitude(player, target) > 4) { - return get.threaten(target) / Math.sqrt(target.hp + 1) / Math.sqrt(target.countCards("h") + 1) > 0; - } - return false; - }); - }, - content: function* (event, map) { - var player = map.player; - map.trigger.cancel(); - var num = player.countDiscardableCards(player, "he"); - if (num) { - var result = yield player.chooseToDiscard("纳学:是否弃置任意张牌并摸等量的牌?", "he", [1, num]).set("ai", lib.skill.zhiheng.check); - if (result.bool) yield player.draw(result.cards.length); - } - if (player.countCards("h")) { - var result2 = yield player.chooseCardTarget({ - prompt: "是否交给至多两名其他角色各一张手牌?", - prompt2: "先按顺序选中所有要给出的牌,然后再按顺序选择等量的目标角色。", - selectCard: [1, 2], - filterCard: true, - filterTarget: lib.filter.notMe, - selectTarget: function () { - return ui.selected.cards.length; - }, - filterOk: () => { - return ui.selected.cards.length == ui.selected.targets.length; - }, - position: "h", - ai1: function (card) { - if (card.name == "du") return 10; - else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; - var player = _status.event.player; - if ( - ui.selected.cards.length > 4 || - !game.hasPlayer(function (current) { - return get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); - }) - ) - return 0; - return 1 / Math.max(0.1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (ui.selected.cards[0].name == "du") return -att; - if (target.hasSkillTag("nogain")) att /= 6; - return att; - }, - }); - if (result2.bool) { - const list = []; - for (let i = 0; i < result2.targets.length; i++) { - list.push([result2.targets[i], result2.cards[i]]); - player.line(result2.targets[i]); - } - game.loseAsync({ - gain_list: list, - player: player, - cards: result2.cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - } - } - }, - }, - yijie: { - audio: 2, - trigger: { player: "die" }, - filter: function (event, player) { - return game.hasPlayer(target => target != player); - }, - forced: true, - forceDie: true, - skillAnimation: true, - animationColor: "orange", - logTarget: function (event, player) { - return game.filterPlayer(target => target != player); - }, - content: function () { - "step 0"; - var targets = game.filterPlayer(target => target != player); - var sum = targets.reduce((num, target) => (num += target.hp), 0); - sum = Math.max(1, Math.floor(sum / targets.length)); - event.num = sum; - event.targets = targets; - "step 1"; - var target = targets.shift(); - var delta = target.hp - num; - if (delta != 0) { - target[delta > 0 ? "loseHp" : "recover"](Math.abs(delta)); - } - if (targets.length) event.redo(); - }, - }, - //阎象 - kujian: { - audio: "twkujian", - inherit: "twkujian", - selectCard: [1, 2], - content: function () { - player.give(cards, target).gaintag.add("twkujianx"); - player.addSkill("kujian_draw"); - player.addSkill("twkujian_discard"); - }, - subSkill: { - draw: { - charlotte: true, - audio: "twkujian", - trigger: { global: ["useCardAfter", "respondAfter"] }, - filter: function (event, player) { - return event.player.hasHistory("lose", evt => { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("twkujianx")) return true; - } - }); - }, - forced: true, - logTarget: "player", - content: function () { - "step 0"; - game.asyncDraw([player, trigger.player], 2); - "step 1"; - game.delayx(); - }, - }, - }, - }, - //手杀差异化孙鲁育 - mbmumu: { - audio: "mumu", - inherit: "new_mumu", - filter: function (event, player) { - return game.hasPlayer(current => { - return current.countCards("e") > 0; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("mbmumu"), "弃置场上的一张装备牌,或者获得场上的一张防具牌。", function (card, player, target) { - return target.countCards("e") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (target.getEquip(2) && player.hasEmptySlot(2)) { - return -2 * att; - } - return -att; - }); - "step 1"; - if (result.bool && result.targets && result.targets.length) { - event.target = result.targets[0]; - player.logSkill("mbmumu", event.target); - player.line(event.target, "green"); - var e = event.target.getEquips(2); - event.e = e; - if (e.length > 0) { - player.chooseControl("弃置一张装备牌", "获得一张防具牌").set("ai", function () { - if (_status.event.player.getEquips(2).length > 0) { - return "弃置一张装备牌"; - } - return "获得一张防具牌"; - }); - } else { - event.choice = "弃置一张装备牌"; - } - } else event.finish(); - "step 2"; - var choice = event.choice || result.control; - if (choice == "弃置一张装备牌") { - player.discardPlayerCard(event.target, "e", true); - } else { - if (event.e) { - player.gain(event.e, event.target, "give", "bySelf"); - player.addTempSkill("new_mumu2"); - } - } - }, - }, - mbmeibu: { - inherit: "new_meibu", - derivation: ["mbzhixi"], - content: function () { - "step 0"; - var check = lib.skill.new_meibu.checkx(trigger, player); - player - .chooseToDiscard(get.prompt2("mbmeibu", trigger.player), "he") - .set("ai", function (card) { - if (_status.event.check) return 6 - get.value(card); - return 0; - }) - .set("check", check) - .set("logSkill", ["mbmeibu", trigger.player]); - "step 1"; - if (result.bool) { - var target = trigger.player; - var card = result.cards[0]; - player.line(target, "green"); - target.addTempSkills("mbzhixi", "phaseUseAfter"); - if (card.name != "sha" && get.type(card) != "trick" && get.color(card) != "black") { - target.addTempSkill("new_meibu_range", "phaseUseAfter"); - target.markAuto("new_meibu_range", player); - } - target.markSkillCharacter("mbmeibu", player, "魅步", "锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。"); - } - }, - }, - mbzhixi: { - mod: { - cardEnabled: function (card, player) { - if (player.countMark("mbzhixi") >= player.hp) return false; - }, - cardUsable: function (card, player) { - if (player.countMark("mbzhixi") >= player.hp) return false; - }, - cardRespondable: function (card, player) { - if (player.countMark("mbzhixi") >= player.hp) return false; - }, - cardSavable: function (card, player) { - if (player.countMark("mbzhixi") >= player.hp) return false; - }, - }, - trigger: { - player: "useCard1", - }, - forced: true, - popup: false, - firstDo: true, - init: function (player, skill) { - player.storage[skill] = 0; - var evt = _status.event.getParent("phaseUse"); - if (evt && evt.player == player) { - player.getHistory("useCard", function (evtx) { - if (evtx.getParent("phaseUse") == evt) { - player.storage[skill]++; - } - }); - } - }, - onremove: function (player) { - player.unmarkSkill("mbmeibu"); - delete player.storage.mbzhixi; - }, - content: function () { - player.addMark("mbzhixi", 1, false); - if (get.type2(trigger.card) == "trick") { - var evt = trigger.getParent("phaseUse"); - if (evt && evt.player == player) { - evt.skipped = true; - game.log(player, "结束了出牌阶段"); - } - } - }, - ai: { - presha: true, - pretao: true, - neg: true, - nokeep: true, - }, - }, - //庞统 - xinlianhuan: { - audio: 2, - audioname: ["ol_pangtong"], - inherit: "lianhuan", - group: "xinlianhuan_add", - subSkill: { - add: { - audio: "xinlianhuan", - audioname: ["ol_pangtong"], - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (event.card.name != "tiesuo") return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(current => { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); - }) - ) - return true; - } - return false; - }, - charlotte: true, - forced: true, - popup: false, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("xinlianhuan"), "为" + get.translation(trigger.card) + "额外指定一个目标", (card, player, target) => { - return !_status.event.sourcex.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); - }) - .set("sourcex", trigger.targets) - .set("ai", function (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.delayex(); - } else event.finish(); - "step 2"; - if (result.bool) { - var targets = result.targets; - player.logSkill("xinlianhuan_add", targets); - trigger.targets.addArray(targets); - game.log(targets, "也成为了", trigger.card, "的目标"); - } - }, - }, - }, - }, - //吴班 - xinjintao: { - audio: "jintao", - inherit: "jintao", - content: function () { - var evt = trigger.getParent("phaseUse"); - var index = player - .getHistory("useCard", function (evtx) { - return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; - }) - .indexOf(trigger); - if (index == 0) { - game.log(trigger.card, "不可被响应"); - trigger.directHit.addArray(game.players); - } else { - game.log(trigger.card, "伤害+1"); - if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; - trigger.baseDamage++; - } - }, - }, - //鲍信 - mutao: { - audio: "twmutao", - inherit: "twmutao", - content: function () { - "step 0"; - event.togive = target.getNext(); - var cards = target.getCards("h", { name: "sha" }); - if (!cards.length) { - game.log("但", target, "没有", "#y杀", "!"); - event.finish(); - } else target.addToExpansion(cards, target, "give").gaintag.add("mutao"); - "step 1"; - var card = target.getExpansions("mutao").randomGet(); - target.give(card, event.togive); - "step 2"; - if (target.getExpansions("mutao").length) { - event.togive = event.togive.getNext(); - event.goto(1); - } else { - target.line(event.togive); - event.togive.damage(Math.min(2, event.togive.countCards("h", { name: "sha" })), target); - } - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - }, - yimou: { - audio: "twyimou", - inherit: "twyimou", - content: function () { - "step 0"; - if (trigger.player != player) player.addExpose(0.3); - var target = get.translation(trigger.player); - var choiceList = ["令" + target + "获得牌堆里的一张【杀】", "令" + target + "将一张牌交给另一名角色,然后" + target + "摸一张牌"]; - var list = ["选项一"]; - if (trigger.player.countCards("h")) list.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - player - .chooseControl(list) - .set("prompt", "毅谋:请选择一项") - .set("choiceList", choiceList) - .set("ai", function () { - var evt = _status.event.getTrigger(), - list = _status.event.list; - var player = _status.event.player; - var target = evt.player; - if (target.countCards("h") && list.includes("选项二")) return "选项二"; - return "选项一"; - }) - .set("list", list); - "step 1"; - event.choice = result.control; - "step 2"; - if (event.choice != "选项二") { - var card = get.cardPile2(function (card) { - return card.name == "sha"; - }); - if (card) trigger.player.gain(card, "gain2"); - else game.log("但牌堆里已经没有", "#y杀", "了!"); - if (event.choice == "选项一") event.finish(); - } - "step 3"; - if (event.choice != "选项一") { - if (trigger.player.countCards("h")) - trigger.player.chooseCardTarget({ - prompt: "毅谋:将一张手牌交给另一名其他角色", - filterCard: true, - forced: true, - filterTarget: lib.filter.notMe, - ai1: function (card) { - return 1 / Math.max(0.1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) att /= 9; - return 4 + att; - }, - }); - else event.finish(); - } - "step 4"; - var target = result.targets[0]; - trigger.player.line(target); - trigger.player.give(result.cards, target); - trigger.player.draw(); - }, - }, - //蒋济 - jilun: { - audio: "twjilun", - inherit: "twjilun", - filter: function (event, player) { - return player.hasSkill("twjichou", null, false, false); - }, - content: function () { - "step 0"; - var choices = ["选项一"]; - var choiceList = ["摸两张牌", "获得一个“机论”标记"]; - if ( - !player.getStorage("twjichou").length || - !player.getStorage("twjichou").filter(function (name) { - return !player.getStorage("jilun").includes(name) && player.hasUseTarget({ name: name }); - }).length - ) - choiceList[1] = '' + choiceList[1] + ""; - else choices.push("选项二"); - player - .chooseControl(choices, "cancel2") - .set("choiceList", choiceList) - .set("prompt", get.prompt("jilun")) - .set("ai", () => { - if (_status.event.choiceList.length == 1 || !player.getStorage("twjichou").length) return 0; - var val = player.getUseValue({ name: "wuzhong" }); - for (var name of player.getStorage("twjichou")) { - if (player.getStorage("jilun").includes(name)) continue; - if (player.getUseValue({ name: name }) > val) return 1; - } - return 0; - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("jilun"); - if (result.control == "选项一") player.draw(2); - else player.addMark("jilun_mark", 1); - } - }, - group: "jilun_effect", - subSkill: { - mark: { - intro: { content: "mark" }, - }, - effect: { - audio: "twjilun", - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.hasMark("jilun_mark"); - }, - forced: true, - content: function () { - "step 0"; - if ( - !player.getStorage("twjichou").length || - !player.getStorage("twjichou").filter(function (name) { - return !player.getStorage("jilun").includes(name) && player.hasUseTarget({ name: name }); - }).length - ) { - if (player.hasMark("jilun_mark")) player.removeMark("jilun_mark", player.countMark("jilun_mark")); - event.finish(); - return; - } - var list = []; - for (var name of player.getStorage("twjichou")) { - if (!player.getStorage("jilun").includes(name)) { - list.push(["锦囊", "", name]); - } - } - player - .chooseButton(['###机论:请选择你要执行的选项###
  • 失去1枚“机论”标记,视为使用一张〖急筹〗已记录但〖机论〗未记录的普通锦囊牌
  • 失去所有“机论”标记', [list, "vcard"]]) - .set("filterButton", function (button) { - return _status.event.player.hasUseTarget({ name: button.link[2] }); - }) - .set("ai", function (button) { - return _status.event.getParent().player.getUseValue({ name: button.link[2] }, null, true); - }); - "step 1"; - if (result.bool) { - player.removeMark("jilun_mark", 1); - var card = { name: result.links[0][2], isCard: true }; - player.chooseUseTarget(card, true); - player.markAuto("jilun", [card.name]); - player.syncStorage("jilun"); - } else { - player.removeMark("jilun_mark", player.countMark("jilun_mark")); - event.finish(); - } - "step 2"; - if (player.hasMark("jilun_mark")) event.goto(0); - }, - }, - }, - ai: { - combo: "twjichou", - }, - }, - //李遗 - jiaohua: { - onremove: true, - audio: "twjiaohua", - enable: "phaseUse", - usable: 2, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog("###教化###选择一种牌的类型,令一名角色从牌堆获得此类型的一张牌"); - }, - chooseControl: function (event, player) { - var list = ["basic", "trick", "equip"].filter(type => !player.getStorage("jiaohua").includes(type)); - list.push("cancel2"); - return list; - }, - check: function (event, player) { - var list = ["trick", "equip", "basic"].filter(type => !player.getStorage("jiaohua").includes(type)); - return list[0]; - }, - backup: function (result, player) { - return { - type: result.control, - audio: "twjiaohua", - filterCard: () => false, - selectCard: -1, - filterTarget: true, - content: function () { - "step 0"; - var type = lib.skill.jiaohua_backup.type; - var card = get.cardPile2(card => get.type2(card) == type); - if (card) target.gain(card, "gain2"); - else game.log("但牌堆里已经没有", "#y" + get.translation(type) + "牌", "了!"); - "step 1"; - player.markAuto("jiaohua", [lib.skill.jiaohua_backup.type]); - "step 2"; - if (!["basic", "trick", "equip"].some(type => !player.getStorage("jiaohua").includes(type))) { - player.popup("教化"); - player.unmarkAuto("jiaohua", player.getStorage("jiaohua")); - game.log(player, "清空了", "#g【教化】", "记录"); - } - }, - ai: { - result: { target: 1 }, - }, - }; - }, - prompt: function (result, player) { - return "令一名角色从牌堆中获得一张" + get.translation(result.control) + "牌"; - }, - }, - ai: { - order: 7, - result: { player: 1 }, - }, - intro: { content: "已记录$牌" }, - }, - //来敏 - laishou: { - audio: 3, - trigger: { player: ["damageBegin4", "phaseZhunbeiBegin"] }, - filter: function (event, player) { - var num = 9; - if (event.name == "damage") return event.num >= player.getHp() && player.maxHp < num; - return player.maxHp >= num; - }, - forced: true, - content: function () { - if (trigger.name == "damage") { - player.gainMaxHp(trigger.num); - trigger.cancel(); - } else player.die(); - }, - }, - luanqun: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("h"); - }, - usable: 1, - content: function () { - "step 0"; - var targets = game.filterPlayer(current => current.countCards("h")).sortBySeat(); - event.targets = targets; - var next = player - .chooseCardOL(targets, "乱群:请选择要展示的牌", true) - .set("ai", function (card) { - return -get.value(card); - }) - .set("source", player); - next.aiCard = function (target) { - var hs = target.getCards("h"); - return { bool: true, cards: [hs.randomGet()] }; - }; - next._args.remove("glow_result"); - "step 1"; - var cards = []; - event.videoId = lib.status.videoId++; - for (var i = 0; i < targets.length; i++) cards.push(result[i].cards[0]); - event.cards = cards; - game.log(player, "展示了", targets, "的", cards); - game.broadcastAll( - function (targets, cards, id, player) { - var dialog = ui.create.dialog(get.translation(player) + "发动了【乱群】", cards); - dialog.videoId = id; - var getName = function (target) { - if (target._tempTranslate) return target._tempTranslate; - var name = target.name; - if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; - return get.translation(name); - }; - for (var i = 0; i < targets.length; i++) { - dialog.buttons[i].querySelector(".info").innerHTML = getName(targets[i]) + get.translation(cards[i].suit); - } - }, - targets, - cards, - event.videoId, - player - ); - game.delay(4); - "step 2"; - game.broadcastAll("closeDialog", event.videoId); - var card = cards[targets.indexOf(player)]; - var cardx = cards.filter(cardy => cardy != card && get.color(cardy, targets[cards.indexOf(cardy)]) == get.color(card, player)); - if (cardx.length) { - player - .chooseButton(["乱群:是否获得其中的一张牌", cardx]) - .set("forceAuto", true) - .set("ai", function (button) { - var cards = _status.event.list[0]; - var targets = _status.event.list[1]; - var player = _status.event.player; - if (get.attitude(player, targets[cards.indexOf(button.link)]) > 0) return 0; - return get.value(button.link, player); - }) - .set("list", [cards, targets]); - } else event.goto(4); - "step 3"; - if (result.bool) { - var card = result.links[0]; - player.gain(card, get.owner(card), "give"); - } - "step 4"; - var card = cards[targets.indexOf(player)]; - targets = targets.filter(target => get.color(cards[targets.indexOf(target)], target) != get.color(card, player)); - if (targets.length) { - player.line(targets); - targets.forEach(target => { - target.addTempSkill("luanqun_effect", { player: "phaseUseAfter" }); - target.markAuto("luanqun_effect", [player]); - }); - } - }, - ai: { - order: 9, - result: { - player: function (player, target) { - if (player.hasSkill("laishou")) return 1; - return player.hp >= 2 ? 1 : 0; - }, - }, - }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - intro: { content: "出牌阶段第一张【杀】只能指定$为目标,且此牌不可被响应" }, - mod: { - playerEnabled: function (card, player, target) { - if (!player.isPhaseUsing()) return; - if (card.name == "sha" && !player.getStorage("luanqun_effect").includes(target)) return false; - }, - }, - trigger: { player: "useCard1" }, - filter: function (event, player) { - return player.isPhaseUsing() && event.card.name == "sha"; - }, - forced: true, - content: function () { - trigger.directHit.addArray(player.getStorage("luanqun_effect")); - player.removeSkill("luanqun_effect"); - }, - }, - }, - }, - //☆周不疑 - mbhuiyao: { - audio: 2, - enable: "phaseUse", - usable: 1, - // filterTarget:lib.filter.notMe, - content: function () { - "step 0"; - player.damage("nosource"); - "step 1"; - if (game.countPlayer() < 2) event.finish(); - if (game.countPlayer() == 2) - event._result = { - bool: true, - targets: [game.findPlayer(i => i != player), player], - }; - else - player - .chooseTarget( - `慧夭:请选择两名角色`, - `令不为你的第一名角色视为对第二名角色造成过1点伤害。`, - (card, player, target) => { - if (!ui.selected.targets.length) return player != target; - return true; - }, - 2, - true - ) - .set("multitarget", true) - .set("targetprompt", ["伤害来源", "受伤角色"]) - .set("ai", target => { - return target == get.event("aiTargets")[ui.selected.targets.length] ? 10 : 0; - }) - .set("aiTargets", lib.skill.mbhuiyao.getUnrealDamageTargets(player, [game.filterPlayer(i => i != player), game.filterPlayer()], true)); - "step 2"; - if (result.bool) { - var targets = result.targets; - player.line2(targets, "green"); - game.delaye(); - targets[1].damage(targets[0], "unreal"); - } - }, - getUnrealDamageTargets: (player, lists, forced) => { - const targets = [null, null]; - let sourceList, targetList; - if (lists.length == 2 && lists.every(l => Array.isArray(l))) { - sourceList = lists[0]; - targetList = lists[1]; - } else { - sourceList = lists.slice(); - targetList = lists.slice(); - } - const list = targetList - .map(current => { - const _hp = current.hp, - _maxhp = current.maxHp; - current.hp = 100; - current.maxHp = 100; - const att = -get.sgnAttitude(player, current); - let val = get.damageEffect(current, player, current) * att; - current.getSkills(null, false, false).forEach(skill => { - const info = get.info(skill); - if (info && info.ai && (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend)) val = Math[val > 0 ? "max" : "min"](val > 0 ? 0.1 : -0.1, val + 2 * att); - }); - const eff = 100 / val + 15; - current.hp = _hp; - current.maxHp = _maxhp; - return [current, eff]; - }) - .sort((a, b) => b[1] - a[1])[0]; - if (list[1] < 0 && !forced) return targets; - const targetx = list[0]; - targets[1] = targetx; - const list2 = sourceList - .filter(i => i != targetx) - .map(current => { - const _hp = targetx.hp, - _maxhp = targetx.maxHp; - targetx.hp = 100; - targetx.maxHp = 100; - const att = -get.sgnAttitude(player, current); - const eff = get.damageEffect(targetx, current, current) * att; - targetx.hp = _hp; - targetx.maxHp = _maxhp; - return [current, eff]; - }) - .sort((a, b) => b[1] - a[1])[0]; - if (!list2) return targets; - targets[0] = list2[0]; - return targets; - }, - ai: { - order: 6, - result: { - player: function (player) { - if (player.getHp() + player.countCards("hs", card => player.canSaveCard(card, player)) <= 1) return 0; - var limit = 25; - var quesong = player.hasSkill("mbquesong") && !player.getStat().damaged; - if (quesong) { - limit -= 7.5; - } - if ( - quesong && - game.hasPlayer(target => { - var att = get.attitude(player, target); - if (att < 0) return false; - return ( - att * - Math.sqrt( - Math.max( - 1, - [1, 2, 3, 4].reduce((p, c) => p + target.countEmptySlot(c), 0) - ) - ) >= - 10 || target.getHp() <= 2 - ); - }) - ) - return 1; - if ( - !quesong && - game.hasPlayer(target => { - if (target == player) return false; - var _hp = target.hp, - _maxhp = target.maxHp; - target.hp = 100; - target.maxHp = 100; - var att = -get.sgnAttitude(player, target); - var val = get.damageEffect(target, player, target) * att; - target.getSkills(null, false, false).forEach(skill => { - var info = get.info(skill); - if (info && info.ai && (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend)) val = Math[val > 0 ? "max" : "min"](val > 0 ? 0.1 : -0.1, val + 2 * att); - }); - var eff = 100 / val; - target.hp = _hp; - target.maxHp = _maxhp; - if (eff < limit) return false; - return true; - }) - ) - return 1; - return 0; - }, - }, - }, - }, - mbquesong: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.getHistory("damage").length; - }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("mbquesong")).set("ai", target => { - var player = _status.event.player; - if (get.attitude(player, target) <= 0) return 0; - var len = lib.skill.mbquesong.getNum(target), - hp = target.getHp(); - return len + target.isTurnedOver() * 2 + (1.5 * Math.min(4, target.getDamagedHp())) / (hp + 1); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("mbquesong", target); - var len = lib.skill.mbquesong.getNum(target); - if (target.isHealthy()) event._result = { index: 0 }; - else { - target - .chooseControl() - .set("choiceList", ["摸" + get.cnNumber(len) + "张牌并复原武将牌", "回复1点体力"]) - .set("prompt", "雀颂:请选择一项") - .set("ai", () => { - var player = _status.event.player; - var len = _status.event.len; - return get.effect(player, { name: "draw" }, player, player) * len >= get.recoverEffect(player, player, player) ? 0 : 1; - }) - .set("len", len); - } - } else event.finish(); - "step 2"; - if (result.index == 1) { - target.recover(); - event.finish(); - } else target.draw(lib.skill.mbquesong.getNum(target)); - "step 3"; - target.link(false); - "step 4"; - target.turnOver(false); - }, - getNum: function (player) { - return player.countCards("e", card => get.subtype(card) != "equip5") >= 3 ? 2 : 3; - }, - ai: { - expose: 0.2, - maixie: true, - skillTagFilter: function (player, tag) { - if (player.getStat().damaged) return false; - }, - }, - }, - //郭照 - yichong: { - initSkill: function (skill) { - if (!lib.skill[skill]) { - lib.skill[skill] = { - charlotte: true, - onremove: true, - mark: true, - marktext: "雀", - intro: { - markcount: function (storage) { - return (storage || 0).toString(); - }, - content: function (storage) { - return "已被掠夺" + (storage || 0) + "张牌"; - }, - }, - }; - lib.translate[skill] = "易宠"; - lib.translate[skill + "_bg"] = "雀"; - } - }, - getLimit: 1, - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt("yichong"), "选择一名其他角色并选择一个花色,获得其此花色的所有牌并令其获得“雀”标记", lib.filter.notMe).set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att > 0) return 0; - var getNum = function (player) { - var list = []; - for (var i of lib.suit) list.push(player.countCards("he", { suit: i }) + 3); - return list.sort((a, b) => b - a)[0]; - }; - return getNum(target) + target.countCards("h") / 10; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("yichong", target); - event.target = target; - player - .chooseControl(lib.suit.slice(0).reverse()) - .set("prompt", "请声明一个花色") - .set("ai", function () { - var target = _status.event.target, - cards = target.getCards("he"); - var suits = lib.suit.slice(0); - suits.sort(function (a, b) { - var num = function (suit) { - return cards.filter(function (card) { - return get.suit(card) == suit; - }).length; - }; - return num(b) - num(a); - }); - return suits[0]; - }) - .set("target", target); - } else event.finish(); - "step 2"; - var suit = result.control; - event.suit = suit; - player.chat(get.translation(suit + 2)); - game.log(player, "选择了", "#y" + get.translation(suit + 2)); - if (target.countCards("e", { suit: suit })) player.gain(target.getCards("e", { suit: suit }), target, "giveAuto"); - "step 3"; - var suit = event.suit; - if (target.countCards("h", { suit: suit })) { - player.chooseButton(["选择获得其中一张牌", target.getCards("h", { suit: suit })], true).set("ai", button => get.value(button.link)); - } else event.goto(5); - "step 4"; - if (result.bool) { - var card = result.links[0]; - if (lib.filter.canBeGained(card, player, target)) player.gain(card, target, "giveAuto", "bySelf"); - else game.log("但", card, "不能被", player, "获得!"); - } - "step 5"; - var suit = event.suit; - player.storage.yichong = suit; - player.markSkill("yichong"); - var skill = "yichong_" + player.playerid; - game.broadcastAll(lib.skill.yichong.initSkill, skill); - game.broadcastAll( - function (player, suit) { - if (player.marks.yichong) player.marks.yichong.firstChild.innerHTML = get.translation(suit); - }, - player, - suit - ); - game.countPlayer(function (current) { - current.removeSkill("yichong_" + player.playerid); - if (current == target) target.addSkill("yichong_" + player.playerid); - }); - player.addTempSkill("yichong_clear", { player: "phaseBegin" }); - }, - onremove: true, - intro: { content: "拥有“雀”标记的角色得到$牌后,你获得之" }, - group: "yichong_gain", - subSkill: { - gain: { - audio: "yichong", - trigger: { global: ["gainAfter", "loseAsyncAfter"] }, - filter: function (event, player) { - if (!player.storage.yichong) return false; - return game.hasPlayer(function (current) { - if (!event.getg(current).length || !current.hasSkill("yichong_" + player.playerid)) return false; - if (current.countMark("yichong_" + player.playerid) >= lib.skill.yichong.getLimit) return false; - return event.getg(current).some(card => get.suit(card, current) == player.storage.yichong && lib.filter.canBeGained(card, current, player)); - }); - }, - forced: true, - content: function () { - "step 0"; - var target = game.findPlayer(function (current) { - if (!trigger.getg(current).length || !current.hasSkill("yichong_" + player.playerid)) return false; - if (current.countMark("yichong_" + player.playerid) >= lib.skill.yichong.getLimit) return false; - return trigger.getg(current).some(card => get.suit(card, current) == player.storage.yichong && lib.filter.canBeGained(card, current, player)); - }); - event.target = target; - var cards = trigger.getg(target).filter(card => get.suit(card, target) == player.storage.yichong && lib.filter.canBeGained(card, target, player)); - if (cards.length <= lib.skill.yichong.getLimit - target.countMark("yichong_" + player.playerid)) event._result = { bool: true, links: cards }; - else { - var num = lib.skill.yichong.getLimit - target.countMark("yichong_" + player.playerid); - player.chooseButton(["易宠:获得其中的" + get.cnNumber(num) + "张牌", cards], num, true).set("ai", function (button) { - return get.value(button.link); - }); - } - "step 1"; - if (result.bool) { - player.gain(result.links, target, "give"); - target.addMark("yichong_" + player.playerid, result.links.length, false); - } - }, - }, - clear: { - charlotte: true, - onremove: function (player) { - game.countPlayer(function (current) { - current.removeSkill("yichong_" + player.playerid); - }); - }, - }, - }, - }, - wufei: { - audio: 2, - trigger: { player: ["useCardToPlayered", "damageEnd"] }, - filter: function (event, player) { - var target = game.findPlayer(current => current.hasSkill("yichong_" + player.playerid)); - if (!target) return false; - if (event.name == "damage") return target.hp > 3; - return event.isFirstTarget && (event.card.name == "sha" || (get.type(event.card) == "trick" && get.tag(event.card, "damage"))); - }, - direct: true, - content: function () { - "step 0"; - var target = game.findPlayer(current => current.hasSkill("yichong_" + player.playerid)); - event.target = target; - if (trigger.name == "damage") { - player.chooseBool(get.prompt("wufei", target), "令" + get.translation(target) + "受到1点无来源伤害").set("choice", get.damageEffect(target, player, player) > 0); - } else { - player.logSkill("wufei", target); - player.addTempSkill("wufei_effect"); - player.markAuto("wufei_effect", [trigger.card]); - game.log(target, "成为了", trigger.card, "的伤害来源"); - event.finish(); - } - "step 1"; - if (result.bool) { - player.logSkill("wufei", target); - target.damage("nosource"); - } - }, - subSkill: { - effect: { - charlotte: true, - trigger: { source: "damageBefore" }, - filter: function (event, player) { - if (!event.card) return false; - return player.getStorage("wufei_effect").includes(event.card); - }, - forced: true, - popup: false, - firstDo: true, - content: function () { - var target = game.findPlayer(current => current.hasSkill("yichong_" + player.playerid)); - if (!target) delete trigger.source; - else trigger.source = target; - }, - }, - }, - ai: { - combo: "yichong", - }, - }, - //张嶷 - xinwurong: { - audio: 3, - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - player - .chooseToDuiben(target) - .set("title", "谋弈") - .set("namelist", ["反抗", "归顺", "镇压", "安抚"]) - .set("translationList", [`对方选择镇压:${get.translation(player)}对你造成1点伤害,然后其摸1张牌
    对方选择安抚:${get.translation(player)}受到1点伤害,然后其摸2张牌`, `对方选择镇压:${get.translation(player)}获得你1张牌,然后其交给你2张牌
    对方选择安抚:你须交给${get.translation(player)}两张牌(若你牌数不足2张,则改为其令你跳过你下个摸牌阶段)`, `对方选择反抗:你对${get.translation(target)}造成1点伤害,然后你摸1张牌
    对方选择归顺:你获得${get.translation(target)}1张牌,然后你交给其2张牌`, `对方选择反抗:你受到1点伤害,然后你摸2张牌
    对方选择归顺:${get.translation(target)}须交给你两张牌(若其牌数不足两张,则改为令其跳过其下个摸牌阶段)`]) - .set("ai", button => 1 + Math.random()); - "step 1"; - if (result.bool) { - if (result.player == "db_def1") { - target.damage(); - player.draw(); - event.finish(); - } else { - var cards = target.getCards("he"); - if (cards.length < 2) { - target.skip("phaseDraw"); - target.addTempSkill("xinwurong_skip", { player: "phaseDrawSkipped" }); - event.finish(); - } else if (cards.length == 2) event._result = { bool: true, cards: cards }; - else target.chooseCard("怃戎:交给" + get.translation(player) + "两张牌", 2, true, "he"); - } - } else { - if (result.player == "db_def1") { - player.gainPlayerCard(target, "he", true); - event.goto(3); - } else { - player.damage(); - player.draw(2); - event.finish(); - } - } - "step 2"; - if (result.bool) player.gain(result.cards, target, "giveAuto"); - event.finish(); - "step 3"; - var cards = player.getCards("he"); - if (!cards.length) event.finish(); - else if (cards.length <= 2) event._result = { bool: true, cards: cards }; - else player.chooseCard("怃戎:交给" + get.translation(target) + "两张牌", 2, true, "he"); - "step 4"; - if (result.bool) target.gain(result.cards, player, "giveAuto"); - }, - ai: { - order: 7, - result: { - player: 1, - target: -1, - }, - }, - subSkill: { - skip: { - charlotte: true, - mark: true, - intro: { content: "跳过下个摸牌阶段" }, - }, - }, - }, - //孙亮 - xinkuizhu: { - audio: "nzry_kuizhu", - trigger: { player: "phaseDiscardAfter" }, - filter: function (event, player) { - return player.getHistory("lose", function (evt) { - return evt.type == "discard" && evt.getParent("phaseDiscard") == event; - }).length; - }, - direct: true, - content: function () { - "step 0"; - var cards = []; - player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) cards.addArray(evt.cards2); - }); - event.num = cards.length; - event.str1 = "令至多" + event.num + "名角色摸一张牌"; - event.str2 = "对任意名体力值之和为" + event.num + "的角色造成1点伤害"; - player - .chooseControl("cancel2") - .set("ai", function () { - if ( - game.countPlayer(function (current) { - return get.attitude(player, current) < 0 && current.hp == event.num; - }) > 0 && - event.num <= 3 - ) - return 1; - return 0; - }) - .set("choiceList", [event.str1, event.str2]) - .set("prompt", "是否发动【溃诛】?"); - "step 1"; - if (result.control == "cancel2") event.finish(); - event.control = [event.str1, event.str2][result.index]; - "step 2"; - var str = "请选择〖溃诛〗的目标"; - if (event.bool == false) str = "
    所选目标体力之和不足" + event.num + ",请重选"; - if (event.control == event.str2) { - player - .chooseTarget(str, function (card, player, target) { - var targets = ui.selected.targets; - var num = 0; - for (var i = 0; i < targets.length; i++) num += targets[i].hp; - return num + target.hp <= _status.event.num; - }) - .set("ai", function (target) { - if (ui.selected.targets[0] != undefined) return -1; - return get.attitude(player, target) < 0; - }) - .set("promptbar", "none") - .set("num", event.num) - .set("selectTarget", function () { - var targets = ui.selected.targets; - var num = 0; - for (var i = 0; i < targets.length; i++) num += targets[i].hp; - if (num == _status.event.num) return ui.selected.targets.length; - return ui.selected.targets.length + 1; - }); - } else { - player.chooseTarget("请选择〖溃诛〗的目标", "令至多" + get.cnNumber(event.num) + "名角色各摸一张牌", [1, event.num]).set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - } - "step 3"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - if (event.control == event.str1) { - player.logSkill("xinkuizhu", targets); - game.asyncDraw(targets); - } else { - var num = 0; - for (var i = 0; i < targets.length; i++) num += targets[i].hp; - if (num < event.num) { - event.bool = false; - event.goto(2); - } else { - player.logSkill("xinkuizhu", targets); - for (var i of targets) i.damage(); - if (targets.length >= 2) player.loseHp(); - } - } - } - }, - }, - xinzhizheng: { - audio: "nzry_zhizheng", - mod: { - playerEnabled: function (card, player, target) { - var info = get.info(card); - if (target != player && (!info || !info.singleCard || !ui.selected.targets.length) && player.isPhaseUsing() && !target.inRange(player)) return false; - }, - }, - trigger: { player: "phaseUseEnd" }, - filter: function (event, player) { - return ( - player.getHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == event; - }).length < - game.countPlayer(function (current) { - return current != player && !current.inRange(player); - }) && - game.hasPlayer(function (target) { - return target != player && !target.inRange(player) && target.countDiscardableCards(player, "he"); - }) - ); - }, - forced: true, - content: function () { - "step 0"; - player - .chooseTarget("请选择〖掣政〗的目标", "弃置一名攻击范围内不包含你的角色的一张牌", true, function (card, player, target) { - return target != player && !target.inRange(player) && target.countDiscardableCards(player, "he"); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy2" }, player, player); - }); - "step 1"; - if (result.bool) { - player.line(result.targets); - player.discardPlayerCard(result.targets[0], "he", true); - } - }, - }, - xinlijun: { - unique: true, - audio: "nzry_lijun1", - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - if (_status.currentPhase != event.player || event.player.group != "wu") return false; - if (!player.hasZhuSkill("xinlijun", event.player) || player == event.player) return false; - return event.cards.filterInD().length; - }, - zhuSkill: true, - direct: true, - content: function () { - "step 0"; - trigger.player.chooseBool(get.prompt("xinlijun"), "将" + get.translation(trigger.cards) + "交给" + get.translation(player)).set("choice", get.attitude(trigger.player, player) > 0); - "step 1"; - if (result.bool) { - player.logSkill("xinlijun", trigger.player); - player.gain(trigger.cards.filterInD(), "gain2"); - player - .chooseBool() - .set("prompt", "是否令" + get.translation(trigger.player) + "摸一张牌?") - .set("choice", get.attitude(player, trigger.player) > 0); - } else event.finish(); - "step 2"; - if (result.bool) trigger.player.draw(); - }, - }, - //十常侍 - mbdanggu: { - audio: 2, - trigger: { - player: "enterGame", - global: "phaseBefore", - }, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - derivation: ["mbdanggu_faq", "mbdanggu_faq2"], - forced: true, - unique: true, - onremove: function (player) { - delete player.storage.mbdanggu; - delete player.storage.mbdanggu_current; - if (lib.skill.mbdanggu.isSingleShichangshi(player)) { - game.broadcastAll(function (player) { - player.name1 = player.name; - player.smoothAvatar(false); - player.node.avatar.setBackground(player.name, "character"); - player.node.name.innerHTML = get.slimName(player.name); - delete player.name2; - player.classList.remove("fullskin2"); - player.node.avatar2.classList.add("hidden"); - player.node.name2.innerHTML = ""; - if (player == game.me && ui.fakeme) { - ui.fakeme.style.backgroundImage = player.node.avatar.style.backgroundImage; - } - }, player); - } - }, - changshi: [ - ["scs_zhangrang", "scstaoluan"], - ["scs_zhaozhong", "scschiyan"], - ["scs_sunzhang", "scszimou"], - ["scs_bilan", "scspicai"], - ["scs_xiayun", "scsyaozhuo"], - ["scs_hankui", "scsxiaolu"], - ["scs_lisong", "scskuiji"], - ["scs_duangui", "scschihe"], - ["scs_guosheng", "scsniqu"], - ["scs_gaowang", "scsmiaoyu"], - ], - conflictMap: function (player) { - if (!_status.changshiMap) { - _status.changshiMap = { - scs_zhangrang: [], - scs_zhaozhong: [], - scs_sunzhang: [], - scs_bilan: ["scs_hankui"], - scs_xiayun: [], - scs_hankui: ["scs_bilan"], - scs_lisong: [], - scs_duangui: ["scs_guosheng"], - scs_guosheng: ["scs_duangui"], - scs_gaowang: [], - }; - if (!get.isLuckyStar(player)) { - var list = lib.skill.mbdanggu.changshi.map(i => i[0]); - for (var i of list) { - var select = list.filter(scs => scs != i && !_status.changshiMap[i].includes(i)); - _status.changshiMap[i].addArray(select.randomGets(get.rand(0, select.length))); - } - } - } - return _status.changshiMap; - }, - group: "mbdanggu_back", - content: function () { - "step 0"; - var list = lib.skill.mbdanggu.changshi.map(i => i[0]); - player.markAuto("mbdanggu", 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.$draw(cards, "nobroadcast"); - }, - player, - list - ); - "step 1"; - var next = game.createEvent("mbdanggu_clique"); - next.player = player; - next.setContent(lib.skill.mbdanggu.contentx); - }, - contentx: function () { - "step 0"; - var list = player.getStorage("mbdanggu").slice(); - var first = list.randomRemove(); - event.first = first; - var others = list.randomGets(4); - if (others.length == 1) event._result = { bool: true, links: others }; - else { - var map = { - scs_bilan: "scs_hankui", - scs_hankui: "scs_bilan", - scs_duangui: "scs_guosheng", - scs_guosheng: "scs_duangui", - }, - map2 = lib.skill.mbdanggu.conflictMap(player); - var conflictList = others.filter(changshi => { - if (map[first] && others.some(changshi2 => map[first] == changshi2)) return map[first] == changshi; - else return map2[first].includes(changshi); - }), - list = others.slice(); - if (conflictList.length) { - var conflict = conflictList.randomGet(); - list.remove(conflict); - game.broadcastAll( - function (changshi, player) { - if (lib.config.background_speak) { - if (player.isUnderControl(true)) game.playAudio("skill", changshi + "_enter"); - } - }, - conflict, - player - ); - } - player - .chooseButton(["党锢:请选择结党对象", [[first], "character"], '
    可选常侍
    ', [others, "character"]], true) - .set("filterButton", button => { - return _status.event.canChoose.includes(button.link); - }) - .set("canChoose", list) - .set("ai", button => Math.random() * 10); - } - "step 1"; - if (result.bool) { - var first = event.first; - var chosen = result.links[0]; - var skills = []; - var list = lib.skill.mbdanggu.changshi; - var changshis = [first, chosen]; - player.unmarkAuto("mbdanggu", changshis); - player.storage.mbdanggu_current = changshis; - for (var changshi of changshis) { - for (var cs of list) { - if (changshi == cs[0]) skills.push(cs[1]); - } - } - if (lib.skill.mbdanggu.isSingleShichangshi(player)) { - game.broadcastAll( - function (player, first, chosen) { - player.name1 = first; - player.node.avatar.setBackground(first, "character"); - player.node.name.innerHTML = get.slimName(first); - player.name2 = chosen; - player.classList.add("fullskin2"); - player.node.avatar2.classList.remove("hidden"); - player.node.avatar2.setBackground(chosen, "character"); - player.node.name2.innerHTML = get.slimName(chosen); - if (player == game.me && ui.fakeme) { - ui.fakeme.style.backgroundImage = player.node.avatar.style.backgroundImage; - } - }, - player, - first, - chosen - ); - } - game.log(player, "选择了常侍", "#y" + get.translation(changshis)); - if (skills.length) { - player.addAdditionalSkill("mbdanggu", skills); - var str = ""; - for (var i of skills) { - str += "【" + get.translation(i) + "】、"; - player.popup(i); - } - str = str.slice(0, -1); - game.log(player, "获得了技能", "#g" + str); - } - } - }, - isSingleShichangshi: function (player) { - var map = lib.skill.mbdanggu.conflictMap(player); - return player.name == "shichangshi" && ((map[player.name1] && map[player.name2]) || (map[player.name1] && !player.name2) || (!player.name1 && !player.name2) || (player.name == player.name1 && !player.name2)); - }, - mod: { - aiValue: function (player, card, num) { - if (["shan", "tao", "wuxie", "caochuan"].includes(card.name)) return num / 10; - }, - aiUseful: function () { - return lib.skill.mbdanggu.mod.aiValue.apply(this, arguments); - }, - }, - ai: { - combo: "mbmowang", - nokeep: true, - }, - intro: { - mark: function (dialog, storage, player) { - dialog.addText("剩余常侍"); - dialog.addSmall([storage, "character"]); - if (player.storage.mbdanggu_current && player.isIn()) { - dialog.addText("当前常侍"); - dialog.addSmall([player.storage.mbdanggu_current, "character"]); - } - }, - }, - subSkill: { - back: { - audio: "mbdanggu", - trigger: { global: "restEnd" }, - filter: function (event, player) { - return event.getTrigger().player == player; - }, - forced: true, - content: function () { - "step 0"; - delete player.storage.mbdanggu_current; - if (lib.skill.mbdanggu.isSingleShichangshi(player)) { - game.broadcastAll(function (player) { - player.name1 = player.name; - player.smoothAvatar(false); - player.node.avatar.setBackground(player.name, "character"); - player.node.name.innerHTML = get.slimName(player.name); - delete player.name2; - player.classList.remove("fullskin2"); - player.node.avatar2.classList.add("hidden"); - player.node.name2.innerHTML = ""; - if (player == game.me && ui.fakeme) { - ui.fakeme.style.backgroundImage = player.node.avatar.style.backgroundImage; - } - }, player); - } - "step 1"; - var next = game.createEvent("mbdanggu_clique"); - next.player = player; - next.setContent(lib.skill.mbdanggu.contentx); - player.draw(); - }, - }, - }, - }, - mbmowang: { - audio: 2, - trigger: { player: "dieBefore" }, - filter: function (event, player) { - return player.getStorage("mbdanggu").length && event.getParent().name != "giveup" && player.maxHp > 0; - }, - derivation: "mbmowang_faq", - forced: true, - direct: true, - priority: 15, - group: ["mbmowang_die", "mbmowang_return"], - content: function () { - if (_status.mbmowang_return && _status.mbmowang_return[player.playerid]) { - trigger.cancel(); - } else { - player.logSkill("mbmowang"); - game.broadcastAll(function () { - if (lib.config.background_speak) game.playAudio("die", "shichangshiRest"); - }); - trigger.setContent(lib.skill.mbmowang.dieContent); - trigger.includeOut = true; - } - }, - ai: { - combo: "mbdanggu", - neg: true, - }, - dieContent: function () { - "step 0"; - event.forceDie = true; - if (source) { - game.log(player, "被", source, "杀害"); - if (source.stat[source.stat.length - 1].kill == undefined) { - source.stat[source.stat.length - 1].kill = 1; - } else { - source.stat[source.stat.length - 1].kill++; - } - } else { - game.log(player, "阵亡"); - } - if (player.isIn() && (!_status.mbmowang_return || !_status.mbmowang_return[player.playerid])) { - event.reserveOut = true; - game.log(player, "进入了修整状态"); - game.log(player, "移出了游戏"); - //game.addGlobalSkill('mbmowang_return'); - if (!_status.mbmowang_return) _status.mbmowang_return = {}; - _status.mbmowang_return[player.playerid] = 1; - } else event.finish(); - if (!game.countPlayer()) game.over(); - else if (player.hp != 0) { - player.changeHp(0 - player.hp, false).forceDie = true; - } - game.broadcastAll(function (player) { - if (player.isLinked()) { - if (get.is.linked2(player)) { - player.classList.toggle("linked2"); - } else { - player.classList.toggle("linked"); - } - } - if (player.isTurnedOver()) { - player.classList.toggle("turnedover"); - } - }, player); - game.addVideo("link", player, player.isLinked()); - game.addVideo("turnOver", player, player.classList.contains("turnedover")); - "step 1"; - event.trigger("die"); - "step 2"; - if (event.reserveOut) { - if (!game.reserveDead) { - for (var mark in player.marks) { - if (mark == "mbdanggu") continue; - player.unmarkSkill(mark); - } - var count = 1; - var list = Array.from(player.node.marks.childNodes); - if (list.some(i => i.name == "mbdanggu")) count++; - while (player.node.marks.childNodes.length > count) { - var node = player.node.marks.lastChild; - if (node.name == "mbdanggu") { - node = node.previousSibling; - } - node.remove(); - } - game.broadcast( - function (player, count) { - while (player.node.marks.childNodes.length > count) { - var node = player.node.marks.lastChild; - if (node.name == "mbdanggu") { - node = node.previousSibling; - } - node.remove(); - } - }, - player, - count - ); - } - for (var i in player.tempSkills) { - player.removeSkill(i); - } - var skills = player.getSkills(); - for (var i = 0; i < skills.length; i++) { - if (lib.skill[skills[i]].temp) { - player.removeSkill(skills[i]); - } - } - event.cards = player.getCards("hejsx"); - if (event.cards.length) { - player.discard(event.cards).forceDie = true; - } - } - "step 3"; - if (event.reserveOut) { - game.broadcastAll( - function (player, list) { - player.classList.add("out"); - if (list.includes(player.name1) || player.name1 == "shichangshi") { - player.smoothAvatar(false); - player.node.avatar.setBackground(player.name1 + "_dead", "character"); - } - if (list.includes(player.name2) || player.name2 == "shichangshi") { - player.smoothAvatar(true); - player.node.avatar2.setBackground(player.name2 + "_dead", "character"); - } - }, - player, - lib.skill.mbdanggu.changshi.map(i => i[0]) - ); - } - if (source && lib.config.border_style == "auto" && (lib.config.autoborder_count == "kill" || lib.config.autoborder_count == "mix")) { - switch (source.node.framebg.dataset.auto) { - case "gold": - case "silver": - source.node.framebg.dataset.auto = "gold"; - break; - case "bronze": - source.node.framebg.dataset.auto = "silver"; - break; - default: - source.node.framebg.dataset.auto = lib.config.autoborder_start || "bronze"; - } - if (lib.config.autoborder_count == "kill") { - source.node.framebg.dataset.decoration = source.node.framebg.dataset.auto; - } else { - var dnum = 0; - for (var j = 0; j < source.stat.length; j++) { - if (source.stat[j].damage != undefined) dnum += source.stat[j].damage; - } - source.node.framebg.dataset.decoration = ""; - switch (source.node.framebg.dataset.auto) { - case "bronze": - if (dnum >= 4) source.node.framebg.dataset.decoration = "bronze"; - break; - case "silver": - if (dnum >= 8) source.node.framebg.dataset.decoration = "silver"; - break; - case "gold": - if (dnum >= 12) source.node.framebg.dataset.decoration = "gold"; - break; - } - } - source.classList.add("topcount"); - } - }, - subSkill: { - die: { - audio: "mbmowang", - trigger: { player: "phaseAfter" }, - forced: true, - forceDie: true, - content: function () { - "step 0"; - if (lib.skill.mbdanggu.isSingleShichangshi(player)) { - if (!player.getStorage("mbdanggu").length) { - game.broadcastAll(function (player) { - player.name1 = player.name; - player.smoothAvatar(false); - player.node.avatar.setBackground(player.name + "_dead", "character"); - player.node.name.innerHTML = get.slimName(player.name); - delete player.name2; - player.classList.remove("fullskin2"); - player.node.avatar2.classList.add("hidden"); - player.node.name2.innerHTML = ""; - if (player == game.me && ui.fakeme) { - ui.fakeme.style.backgroundImage = player.node.avatar.style.backgroundImage; - } - }, player); - } - } - if (!player.getStorage("mbdanggu").length) { - game.delay(); - } - "step 1"; - player.die(); - }, - }, - return: { - trigger: { player: "phaseBefore" }, - forced: true, - charlotte: true, - silent: true, - forceDie: true, - forceOut: true, - filter: function (event, player) { - return !event._mbmowang_return && event.player.isOut() && _status.mbmowang_return[event.player.playerid]; - }, - content: function () { - "step 0"; - trigger._mbmowang_return = true; - game.broadcastAll(function (player) { - player.classList.remove("out"); - }, trigger.player); - game.log(trigger.player, "移回了游戏"); - delete _status.mbmowang_return[trigger.player.playerid]; - trigger.player.recover(trigger.player.maxHp - trigger.player.hp); - game.broadcastAll(function (player) { - if (player.name1 == "shichangshi") { - player.smoothAvatar(false); - player.node.avatar.setBackground(player.name1, "character"); - } - if (player.name2 == "shichangshi") { - player.smoothAvatar(true); - player.node.avatar2.setBackground(player.name2, "character"); - } - }, trigger.player); - "step 1"; - event.trigger("restEnd"); - }, - }, - }, - }, - //张让 - scstaoluan: { - audio: 1, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("hes") > 0; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - if (name == "sha") { - list.push(["基本", "", "sha"]); - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } else if (get.type(name) == "trick") list.push(["锦囊", "", name]); - else if (get.type(name) == "basic") 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) { - var player = _status.event.player; - if (player.countCards("hs", button.link[2]) > 0) return 0; - if (button.link[2] == "wugu") return; - var effect = player.getUseValue(button.link[2]); - if (effect > 0) return effect; - return 0; - }, - backup: function (links, player) { - return { - filterCard: true, - audio: "scstaoluan", - selectCard: 1, - popname: true, - check: function (card) { - return 6 - get.value(card); - }, - position: "hes", - viewAs: { name: links[0][2], nature: links[0][3] }, - }; - }, - prompt: function (links, player) { - return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; - }, - }, - ai: { - order: 4, - result: { - player: 1, - }, - threaten: 1.9, - }, - }, - //赵忠 - scschiyan: { - audio: 1, - shaRelated: true, - trigger: { player: "useCardToPlayered" }, - direct: true, - filter: function (event, player) { - return event.card.name == "sha" && event.target.hp > 0 && event.target.countCards("he") > 0; - }, - content: function () { - "step 0"; - var next = player.choosePlayerCard(trigger.target, "he", get.prompt("scschiyan", trigger.target)); - next.set("ai", function (button) { - if (!_status.event.goon) return 0; - var val = get.value(button.link); - if (button.link == _status.event.target.getEquip(2)) return 2 * (val + 3); - return val; - }); - next.set("goon", get.attitude(player, trigger.target) <= 0); - next.set("forceAuto", true); - "step 1"; - if (result.bool) { - var target = trigger.target; - player.logSkill("scschiyan", target); - target.addSkill("scschiyan_get"); - target.addToExpansion("giveAuto", result.cards, target).gaintag.add("scschiyan_get"); - } - }, - ai: { - unequip_ai: true, - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (get.attitude(player, arg.target) > 0) return false; - if (tag == "directHit_ai") return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); - if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; - return false; - }, - }, - group: "scschiyan_damage", - subSkill: { - get: { - trigger: { global: "phaseEnd" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return player.getExpansions("scschiyan_get").length > 0; - }, - content: function () { - "step 0"; - var cards = player.getExpansions("scschiyan_get"); - player.gain(cards, "draw"); - game.log(player, "收回了" + get.cnNumber(cards.length) + "张“鸱咽”牌"); - "step 1"; - player.removeSkill("scschiyan_get"); - }, - intro: { - markcount: "expansion", - mark: function (dialog, storage, player) { - var cards = player.getExpansions("scschiyan_get"); - if (player.isUnderControl(true)) dialog.addAuto(cards); - else return "共有" + get.cnNumber(cards.length) + "张牌"; - }, - }, - }, - damage: { - audio: "scschiyan", - trigger: { source: "damageBegin1" }, - forced: true, - locked: false, - logTarget: "player", - filter: function (event, player) { - var target = event.player; - return event.getParent().name == "sha" && player.countCards("h") >= target.countCards("h") && player.countCards("e") >= target.countCards("e"); - }, - content: function () { - trigger.num++; - }, - }, - }, - }, - //孙璋 - scszimou: { - audio: 1, - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - var num = player.getHistory("useCard", evtx => evtx.getParent("phaseUse") == evt).length; - return num == 2 || num == 4 || num == 6; - }, - content: function () { - var evt = trigger.getParent("phaseUse"); - var num = player.getHistory("useCard", evtx => evtx.getParent("phaseUse") == evt).length; - var cards = []; - if (num == 2) { - var card = get.cardPile2(card => { - return ["jiu", "xionghuangjiu"].includes(card.name); - }); - if (card) cards.push(card); - } else if (num == 4) { - var card = get.cardPile2(card => { - return card.name == "sha"; - }); - if (card) cards.push(card); - } else if (num == 6) { - var card = get.cardPile2(card => { - return card.name == "juedou"; - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - }, - }, - //毕岚 - scspicai: { - audio: 1, - enable: "phaseUse", - usable: 1, - frequent: true, - content: function () { - "step 0"; - event.cards = []; - event.suits = []; - "step 1"; - player - .judge(function (result) { - var evt = _status.event.getParent("scspicai"); - if (evt && evt.suits && evt.suits.includes(get.suit(result))) return 0; - return 1; - }) - .set("callback", lib.skill.scspicai.callback).judge2 = function (result) { - return result.bool ? true : false; - }; - "step 2"; - var cards = cards.filterInD(); - if (cards.length) - player.chooseTarget("将" + get.translation(cards) + "交给一名角色", true).set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }); - else event.finish(); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - target.gain(cards, "gain2").giver = player; - } else event.finish(); - }, - callback: function () { - "step 0"; - var evt = event.getParent(2); - event.getParent().orderingCards.remove(event.judgeResult.card); - evt.cards.push(event.judgeResult.card); - if (event.getParent().result.bool) { - evt.suits.push(event.getParent().result.suit); - player.chooseBool("是否继续发动【庀材】?").set("frequentSkill", "scspicai"); - } else event._result = { bool: false }; - "step 1"; - if (result.bool) event.getParent(2).redo(); - }, - ai: { - order: 9, - result: { - player: 1, - }, - }, - }, - //夏恽 - scsyaozhuo: { - audio: 1, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return player.canCompare(current); - }); - }, - filterTarget: function (card, player, current) { - return player.canCompare(current); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - target.skip("phaseDraw"); - target.addTempSkill("scsyaozhuo_skip", { player: "phaseDrawSkipped" }); - } else player.chooseToDiscard(2, true, "he"); - }, - subSkill: { - skip: { - mark: true, - intro: { content: "跳过下一个摸牌阶段" }, - }, - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (target.skipList.includes("phaseDraw") || target.hasSkill("pingkou")) return 0; - 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 - 2 && hs[0].number > 5) return -1; - return 0; - }, - }, - }, - }, - //韩悝 - scsxiaolu: { - audio: 1, - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - player.draw(2); - "step 1"; - var num = player.countCards("he"); - if (!num) event.finish(); - else if (num < 2) event._result = { index: 1 }; - else - player - .chooseControl() - .set("choiceList", ["将两张牌交给一名其他角色", "弃置两张牌"]) - .set("ai", function () { - if ( - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0; - }) - ) - return 0; - return 1; - }); - "step 2"; - if (result.index == 0) { - player.chooseCardTarget({ - position: "he", - filterCard: true, - selectCard: 2, - filterTarget: function (card, player, target) { - return player != target; - }, - ai1: function (card) { - return get.unuseful(card); - }, - ai2: function (target) { - var att = get.attitude(_status.event.player, target); - if (target.hasSkillTag("nogain")) att /= 10; - if (target.hasJudge("lebu")) att /= 5; - return att; - }, - prompt: "选择两张牌,交给一名其他角色", - forced: true, - }); - } else { - player.chooseToDiscard(2, true, "he"); - event.finish(); - } - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.give(result.cards, target); - } - }, - ai: { - order: 9, - result: { player: 2 }, - }, - }, - //栗嵩 - scskuiji: { - audio: 1, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - event.list1 = []; - event.list2 = []; - if (player.countCards("h") > 0) { - var chooseButton = player.chooseButton(4, ["你的手牌", player.getCards("h"), get.translation(target.name) + "的手牌", target.getCards("h")]); - } else { - var chooseButton = player.chooseButton(4, [get.translation(target.name) + "的手牌", target.getCards("h")]); - } - chooseButton.set("target", target); - chooseButton.set("ai", function (button) { - var player = _status.event.player; - var target = _status.event.target; - var ps = []; - var ts = []; - for (var i = 0; i < ui.selected.buttons.length; i++) { - var card = ui.selected.buttons[i].link; - if (target.getCards("h").includes(card)) ts.push(card); - else ps.push(card); - } - var card = button.link; - var owner = get.owner(card); - var val = get.value(card) || 1; - if (owner == target) { - return 2 * val; - } - return 7 - val; - }); - chooseButton.set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if (get.suit(button.link) == get.suit(ui.selected.buttons[i].link)) return false; - } - return true; - }); - "step 1"; - if (result.bool) { - var list = result.links; - for (var i = 0; i < list.length; i++) { - if (get.owner(list[i]) == player) { - event.list1.push(list[i]); - } else { - event.list2.push(list[i]); - } - } - if (event.list1.length && event.list2.length) { - game.loseAsync({ - lose_list: [ - [player, event.list1], - [target, event.list2], - ], - discarder: player, - }).setContent("discardMultiple"); - } else if (event.list2.length) { - target.discard(event.list2); - } else player.discard(event.list1); - } - }, - ai: { - order: 13, - result: { - target: -1, - }, - }, - }, - //段珪 - scschihe: { - audio: 1, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return event.targets.length == 1 && event.card.name == "sha"; - }, - prompt2: function (event, player) { - var str = "亮出牌堆顶的两张牌并增加伤害;且"; - str += "令" + get.translation(event.target) + "不能使用"; - str += "这两张牌所包含的花色"; - str += "的牌响应" + get.translation(event.card); - return str; - }, - logTarget: "target", - locked: false, - check: function (event, player) { - var target = event.target; - if (get.attitude(player, target) > 0) return false; - return true; - }, - content: function () { - var num = 2; - var evt = trigger.getParent(); - var suit = get.suit(trigger.card); - var suits = []; - if (num > 0) { - if (typeof evt.baseDamage != "number") evt.baseDamage = 1; - var cards = get.cards(num); - player.showCards(cards.slice(0), get.translation(player) + "发动了【叱吓】"); - while (cards.length > 0) { - var card = cards.pop(); - var suitx = get.suit(card, false); - suits.add(suitx); - if (suit == suitx) evt.baseDamage++; - } - game.updateRoundNumber(); - } - evt._scschihe_player = player; - var target = trigger.target; - target.addTempSkill("scschihe_block"); - if (!target.storage.scschihe_block) target.storage.scschihe_block = []; - target.storage.scschihe_block.push([evt.card, suits]); - lib.skill.scschihe.updateBlocker(target); - }, - updateBlocker: function (player) { - var list = [], - storage = player.storage.scschihe_block; - if (storage && storage.length) { - for (var i of storage) list.addArray(i[1]); - } - player.storage.scschihe_blocker = list; - }, - ai: { - threaten: 2.5, - halfneg: true, - }, - subSkill: { - block: { - mod: { - cardEnabled: function (card, player) { - if (!player.storage.scschihe_blocker) return; - var suit = get.suit(card); - if (suit == "none" || suit == "unsure") return; - var evt = _status.event; - if (evt.name != "chooseToUse") evt = evt.getParent("chooseToUse"); - if (!evt || !evt.respondTo || evt.respondTo[1].name != "sha") return; - if (player.storage.scschihe_blocker.includes(suit)) return false; - }, - }, - trigger: { - player: ["damageBefore", "damageCancelled", "damageZero"], - target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], - global: ["useCardEnd"], - }, - forced: true, - firstDo: true, - charlotte: true, - popup: false, - onremove: function (player) { - delete player.storage.scschihe_block; - delete player.storage.scschihe_blocker; - }, - filter: function (event, player) { - if (!event.card || !player.storage.scschihe_block) return false; - for (var i of player.storage.scschihe_block) { - if (i[0] == event.card) return true; - } - return false; - }, - content: function () { - var storage = player.storage.scschihe_block; - for (var i = 0; i < storage.length; i++) { - if (storage[i][0] == trigger.card) { - storage.splice(i--, 1); - } - } - if (!storage.length) player.removeSkill("scschihe_block"); - else lib.skill.scschihe.updateBlocker(target); - }, - }, - }, - }, - //郭胜 - scsniqu: { - audio: 1, - enable: "phaseUse", - usable: 1, - filterTarget: true, - selectTarget: 1, - content: function () { - target.damage("fire"); - }, - ai: { - expose: 0.2, - order: 5, - result: { - target: function (player, target) { - return get.damageEffect(target, player, target, "fire") / 10; - }, - }, - }, - }, - //高望 - scsanruo: { - audio: 1, - enable: ["chooseToUse", "chooseToRespond"], - prompt: "将一张♥牌当做桃,♦牌当做火杀,♣牌当做闪,♠牌当做无懈可击使用或打出", - viewAs: function (cards, player) { - var name = false; - var nature = null; - switch (get.suit(cards[0], player)) { - case "club": - name = "shan"; - break; - case "diamond": - name = "sha"; - nature = "fire"; - break; - case "spade": - name = "wuxie"; - break; - case "heart": - name = "tao"; - break; - } - if (name) return { name: name, nature: nature }; - return null; - }, - check: function (card) { - var player = _status.event.player; - if (_status.event.type == "phase") { - var max = 0; - var name2; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hes", function (card) { - return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; - }) > 0 && - player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 - ) { - var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); - if (temp > max) { - max = temp; - name2 = map[name]; - } - } - } - if (name2 == get.suit(card, player)) return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); - return 0; - } - return 1; - }, - position: "hes", - filterCard: function (card, player, event) { - event = event || _status.event; - var filter = event._backup.filterCard; - var name = get.suit(card, player); - if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; - if (name == "diamond" && filter({ name: "sha", cards: [card], nature: "fire" }, player, event)) return true; - if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) return true; - if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; - return false; - }, - filter: function (event, player) { - var filter = event.filterCard; - if (filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && player.countCards("hes", { suit: "diamond" })) return true; - if (filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && player.countCards("hes", { suit: "club" })) return true; - if (filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && player.countCards("hes", { suit: "heart" })) return true; - if (filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && player.countCards("hes", { suit: "spade" })) return true; - return false; - }, - precontent: function () { - "step 0"; - player.addTempSkill("scsanruo_effect"); - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag) { - var name; - switch (tag) { - case "respondSha": - name = "diamond"; - break; - case "respondShan": - name = "club"; - break; - case "save": - name = "heart"; - break; - } - if (!player.countCards("hes", { suit: name })) return false; - }, - order: function (item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hes", function (card) { - return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; - }) > 0 && - player.getUseValue({ - name: name, - nature: name == "sha" ? "fire" : null, - }) > 0 - ) { - var temp = get.order({ - name: name, - nature: name == "sha" ? "fire" : null, - }); - if (temp > max) max = temp; - } - } - max /= 1.1; - return max; - } - return 2; - }, - }, - hiddenCard: function (player, name) { - if (name == "wuxie" && _status.connectMode && player.countCards("hes") > 0) return true; - if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; - if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; - }, - subSkill: { - effect: { - audio: "scsanruo", - trigger: { - player: ["useCard", "respond"], - }, - filter: function (event, player) { - return event.skill == "scsanruo"; - }, - direct: true, - forced: true, - charlotte: true, - content: function () { - "step 0"; - var name = trigger.card.name; - var next = game.createEvent("scsanruo_" + name); - next.player = player; - next.setContent(lib.skill.scsanruo_effect[name == "shan" ? "sha" : name] || function () {}); - }, - sha: function () { - "step 0"; - var trigger = event.getParent().getTrigger(); - if (trigger.name == "useCard") { - var target = lib.skill.chongzhen.logTarget(trigger, player); - } else { - var target = trigger.source; - } - event.target = target; - if (!target || !target.countGainableCards(player, "he")) event._result = { bool: false }; - else - player - .chooseBool(get.prompt("scsanruo_effect", target), "获得该角色的一张牌") - .set("ai", () => { - return _status.event.goon; - }) - .set("goon", get.attitude(player, target) < 1); - "step 1"; - if (result.bool) { - player.logSkill("scsanruo_effect", target); - player.gainPlayerCard(target, "he", true); - } - }, - tao: function () { - "step 0"; - player - .chooseTarget(get.prompt("scsanruo"), "获得一名其他角色的一张牌", (card, player, target) => { - return target.countGainableCards(player, "he") && target != player; - }) - .set("ai", target => { - return 1 - get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("scsanruo_effect", target); - player.gainPlayerCard(target, "he", true); - } - }, - wuxie: function () { - "step 0"; - var trigger = event.getParent().getTrigger(); - if (!trigger.respondTo) { - event.finish(); - return; - } - var target = trigger.respondTo[0]; - event.target = target; - if (!target || !target.countGainableCards(player, player == target ? "e" : "he")) event._result = { bool: false }; - else - player - .chooseBool(get.prompt("scsanruo_effect", target), "获得该角色的一张牌") - .set("ai", () => { - return _status.event.goon; - }) - .set("goon", get.attitude(player, target) < 1); - "step 1"; - if (result.bool) { - player.logSkill("scsanruo_effect", target); - player.gainPlayerCard(target, player == target ? "e" : "he", true); - } - }, - }, - }, - }, - scsmiaoyu: { - audio: "scsanruo", - enable: ["chooseToUse", "chooseToRespond"], - prompt: "将至多两张♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】使用或打出", - viewAs: function (cards, player) { - var name = false; - var nature = null; - switch (get.suit(cards[0], player)) { - case "club": - name = "shan"; - break; - case "diamond": - name = "sha"; - nature = "fire"; - break; - case "spade": - name = "wuxie"; - break; - case "heart": - name = "tao"; - break; - } - //返回判断结果 - if (name) return { name: name, nature: nature }; - return null; - }, - check: function (card) { - if (ui.selected.cards.length) return 0; - var player = _status.event.player; - if (_status.event.type == "phase") { - var max = 0; - var name2; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hes", function (card) { - return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; - }) > 0 && - player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 - ) { - var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); - if (temp > max) { - max = temp; - name2 = map[name]; - } - } - } - if (name2 == get.suit(card, player)) return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); - return 0; - } - return 1; - }, - selectCard: [1, 2], - complexCard: true, - position: "hes", - filterCard: function (card, player, event) { - if (ui.selected.cards.length) return get.suit(card, player) == get.suit(ui.selected.cards[0], player); - event = event || _status.event; - var filter = event._backup.filterCard; - var name = get.suit(card, player); - if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; - if (name == "diamond" && filter({ name: "sha", cards: [card], nature: "fire" }, player, event)) return true; - if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) return true; - if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; - return false; - }, - filter: function (event, player) { - var filter = event.filterCard; - if (filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && player.countCards("hes", { suit: "diamond" })) return true; - if (filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && player.countCards("hes", { suit: "club" })) return true; - if (filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && player.countCards("hes", { suit: "heart" })) return true; - if (filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && player.countCards("hes", { suit: "spade" })) return true; - return false; - }, - precontent: function () { - player.addTempSkill("scsmiaoyu_num"); - player.addTempSkill("scsmiaoyu_discard"); - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag) { - var name; - switch (tag) { - case "respondSha": - name = "diamond"; - break; - case "respondShan": - name = "club"; - break; - case "save": - name = "heart"; - break; - } - if (!player.countCards("hes", { suit: name })) return false; - }, - order: function (item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hes", function (card) { - return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; - }) > 0 && - player.getUseValue({ - name: name, - nature: name == "sha" ? "fire" : null, - }) > 0 - ) { - var temp = get.order({ - name: name, - nature: name == "sha" ? "fire" : null, - }); - if (temp > max) max = temp; - } - } - max /= 1.1; - return max; - } - return 2; - }, - }, - hiddenCard: function (player, name) { - if (name == "wuxie" && _status.connectMode && player.countCards("hs") > 0) return true; - if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; - if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; - }, - subSkill: { - num: { - charlotte: true, - trigger: { player: "useCard" }, - filter: function (event) { - return ["sha", "tao"].includes(event.card.name) && event.skill == "scsmiaoyu" && event.cards && event.cards.length == 2; - }, - forced: true, - popup: false, - content: function () { - trigger.baseDamage++; - }, - }, - discard: { - charlotte: true, - trigger: { player: ["useCardAfter", "respondAfter"] }, - autodelay: function (event) { - return event.name == "respond" ? 0.5 : false; - }, - filter: function (event, player) { - return ["shan", "wuxie"].includes(event.card.name) && event.skill == "scsmiaoyu" && event.cards && event.cards.length == 2 && _status.currentPhase && _status.currentPhase != player && _status.currentPhase.countDiscardableCards(player, "he"); - }, - forced: true, - popup: false, - content: function () { - player.line(_status.currentPhase, "green"); - player.discardPlayerCard(_status.currentPhase, "he", true); - }, - }, - }, - }, - //牵招 - mbshihe: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(current => player.canCompare(current)); - }, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - target.addTempSkill("mbshihe_prevent", { player: "phaseAfter" }); - target.markAuto("mbshihe_prevent", [player]); - } else { - var cards = player.getCards("he", card => { - return lib.filter.cardDiscardable(card, player, "mbshihe"); - }); - if (cards.length > 0) player.discard(cards.randomGet()); - } - }, - ai: { - order: 6, - result: { - player: function (player, target) { - if ((get.realAttitude || get.attitude)(target, player) >= 0 || get.damageEffect(player, target, player) >= 0) return 0; - var card = player.getCards("h").sort(function (a, b) { - return get.number(b) - get.number(a); - })[0]; - return get.number(card) >= 10 || (get.number(card) >= 7 && target.countCards("h") <= 2) ? 1 : -1; - }, - }, - }, - subSkill: { - prevent: { - trigger: { source: "damageBegin2" }, - filter: function (event, player) { - if (get.mode() == "identity") return player.getStorage("mbshihe_prevent").includes(event.player); - return player.getStorage("mbshihe_prevent").some(target => event.player.isFriendOf(target)); - }, - onremove: true, - forced: true, - charlotte: true, - content: function () { - trigger.cancel(); - }, - mark: true, - marktext: "吓", - intro: { - content: function (storage, player) { - var targets = storage.filter(i => i.isIn()); - return "被" + get.translation(targets) + "吓到了,对他" + (targets.length > 1 ? "们" : "") + (get.mode() != "identity" ? "和他的友方角色" : "") + "打不出伤害"; - }, - }, - ai: { - effect: { - player: function (card, player, target, current) { - if (get.tag(card, "damage")) { - var bool = false; - if (get.mode() == "identity" && player.getStorage("mbshihe_prevent").includes(target)) bool = true; - if (get.mode() != "identity" && player.getStorage("mbshihe_prevent").some(targetx => target.isFriendOf(targetx))) bool = true; - if (bool) return "zeroplayertarget"; - } - }, - }, - }, - }, - }, - }, - mbzhenfu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.hasHistory("lose", evt => { - return evt.type == "discard"; - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("mbzhenfu"), "令一名其他角色获得1点护甲", (card, player, target) => { - return target != player && target.hujia < 5; - }) - .set("ai", target => { - return Math.max(0, get.threaten(target)) * get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("mbzhenfu", target); - target.changeHujia(1, null, true); - } - }, - ai: { - expose: 0.2, - }, - }, - //☆胃炎 - mbguli: { - audio: 2, - enable: "phaseUse", - filterCard: true, - selectCard: -1, - position: "h", - filter: function (event, player) { - if (player.hasSkill("mbguli_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: { mbguli: true }, - }, - onuse: function (links, player) { - player.addTempSkill("mbguli_used", "phaseUseAfter"); - }, - ai: { - order: 1, - threaten: 1.14, - unequip_ai: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.name == "sha" && arg.card && arg.card.storage && arg.card.storage.mbguli) return true; - return false; - }, - }, - subSkill: { - used: { - audio: "mbguli", - trigger: { global: "useCardAfter" }, - charlotte: true, - prompt2: "失去1点体力,然后将手牌摸至体力上限", - check: function (event, player) { - var num = player.maxHp - player.countCards("h"); - return (num >= 3 && player.hp >= 2) || (num >= 2 && player.hp >= 3); - }, - filter: function (event, player) { - return ( - event.card.storage && - event.card.storage.mbguli && - game.hasPlayer2(current => { - return current.hasHistory("sourceDamage", evt => evt.card == event.card); - }) - ); - }, - content: function () { - "step 0"; - player.loseHp(); - "step 1"; - player.drawTo(player.maxHp); - }, - group: "mbguli_unequip", - }, - unequip: { - trigger: { - player: "useCardToPlayered", - }, - filter: function ({ card }) { - return card.name == "sha" && card.storage && card.storage.mbguli; - }, - forced: true, - popup: false, - logTarget: "target", - content: function () { - trigger.target.addTempSkill("qinggang2"); - trigger.target.storage.qinggang2.add(trigger.card); - trigger.target.markSkill("qinggang2"); - }, - }, - }, - }, - mbaosi: { - audio: 2, - trigger: { source: "damageSource" }, - forced: true, - filter: function (event, player) { - return player.inRange(event.player) && player.isPhaseUsing() && event.player.isIn() && !player.getStorage("mbaosi_inf").includes(event.player); - }, - logTarget: "player", - content: function () { - player.addTempSkill("mbaosi_inf", "phaseUseAfter"); - player.markAuto("mbaosi_inf", [trigger.player]); - }, - subSkill: { - inf: { - charlotte: true, - onremove: true, - forced: true, - intro: { content: "对$使用牌无次数限制" }, - mod: { - cardUsableTarget: function (card, player, target) { - if (player.getStorage("mbaosi_inf").includes(target)) return true; - }, - }, - }, - }, - }, - // 界曹休 - xinqingxi: { - audio: 2, - usable: 1, - trigger: { source: "damageBegin1" }, - check: function (event, player) { - return get.attitude(player, event.player) < 0; - }, - filter: function (event, player) { - return event.player != player; - }, - content: function () { - "step 0"; - var num = Math.max(1, 4 - get.distance(player, trigger.player)); - if (trigger.player.countCards("h") < num) { - event._result = { bool: false }; - } else { - trigger.player.chooseToDiscard(num, "弃置" + get.cnNumber(num) + "张手牌,或令" + get.translation(player) + "对你造成的此伤害+1").set("ai", function (card) { - var player = _status.event.player; - if (player.hp == 1) { - if (get.type(card) == "basic") { - return 8 - get.value(card); - } else { - return 10 - get.value(card); - } - } else { - if (num > 2) { - return 0; - } - return 8 - get.value(card); - } - }); - } - "step 1"; - if (!result.bool) { - trigger.num++; - } - }, - }, - // 界朱桓 - xinpingkou: { - audio: 2, - trigger: { player: "phaseEnd" }, - direct: true, - filter: function (event, player) { - return player.getHistory("skipped").length > 0; - }, - content: function () { - "step 0"; - player - .chooseTarget([1, player.getHistory("skipped").length], get.prompt2("xinpingkou"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - player.logSkill("xinpingkou", result.targets); - event.targets = result.targets.slice(0).sortBySeat(); - } else { - event.finish(); - } - "step 2"; - if (event.targets && event.targets.length) { - event.targets.shift().damage(); - event.redo(); - } - "step 3"; - var card = get.cardPile2(card => get.type(card, false) == "equip"); - if (card) player.gain(card, "gain2"); - }, - ai: { - combo: "fenli", - effect: { - target: function (card) { - if (card.name == "lebu" || card.name == "bingliang") return 0.5; - }, - }, - }, - }, - // 彭羕 - spdaming: { - audio: 3, - trigger: { global: "phaseBefore", player: "enterGame" }, - forced: true, - locked: false, - global: "spdaming_give", - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - change: function (player, num) { - if (!player.storage.spdaming) player.storage.spdaming = 0; - if (!num) return; - player.storage.spdaming += num; - player.markSkill("spdaming"); - game.log(player, (num > 0 ? "获得了" : "减少了") + get.cnNumber(Math.abs(num)) + "点“达命”值"); - }, - content: function () { - lib.skill.spdaming.change(player, 1); - }, - intro: { - name: "达命值", - markcount: function (storage, player) { - return (storage || 0).toString(); - }, - content: "当前有#点“达命”值", - }, - subSkill: { - used: { charlotte: true }, - give: { - audio: 2, - enable: "phaseUse", - nopop: true, - filter: function (event, player) { - if (!player.countCards("he")) return false; - return game.hasPlayer(current => { - return current != player && current.hasSkill("spdaming") && !current.hasSkill("spdaming_used"); - }); - }, - selectCard: 1, - filterCard: true, - filterTarget: function (card, player, target) { - return target.hasSkill("spdaming") && !target.hasSkill("spdaming_used"); - }, - selectTarget: function () { - var player = _status.event.player; - var targets = game.filterPlayer(current => { - return current != player && current.hasSkill("spdaming") && !current.hasSkill("spdaming_used"); - }); - return targets.length > 1 ? 1 : -1; - }, - complexSelect: true, - prompt: function () { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("spdaming") && !current.hasSkill("spdaming_used"); - }); - return "将一张牌交给" + get.translation(targets) + (targets.length > 1 ? "中的一人" : ""); - }, - position: "he", - discard: false, - lose: false, - delay: false, - check: function (card) { - var player = _status.event.player; - if ( - game.hasPlayer(current => { - return lib.skill.spdaming_give.filterTarget(null, player, current) && get.attitude(player, current) > 0; - }) - ) { - return 6 + Math.random() - get.value(card) / 15; - } - return 0; - }, - content: function () { - "step 0"; - game.trySkillAudio("spdaming", target); - player.give(cards, target); - if (!game.hasPlayer(current => current != player && current != target)) event.finish(); - target.addTempSkill("spdaming_used", "phaseUseAfter"); - "step 1"; - var type = get.type(cards[0], "trick", target); - event.cardtype = type; - var str = get.translation(type), - user = get.translation(player); - target - .chooseTarget("达命:选择另一名其他角色", "若该角色有" + str + "牌,其将一张该类型的牌交给" + user + ",你获得1点“达命”值;否则你将" + get.translation(cards) + "交给" + user, (card, player, target) => { - return target != player && target != _status.event.getParent().player; - }) - .set("ai", target => 1 - get.attitude(_status.event.player, target)); - "step 2"; - if (result.bool) { - var targetx = result.targets[0], - type = event.cardtype; - target.line(targetx); - event.targetx = targetx; - if (targetx.countCards("he", { type: type }) > 0) { - targetx - .chooseCard("交给" + get.translation(player) + "一张" + get.translation(type) + "牌", "he", true, card => { - return get.type(card) == _status.event.getParent().cardtype; - }) - .set("ai", card => 10 - get.value(card)); - } else { - var cards = cards.filter(i => get.owner(i) == target); - if (cards.length) target.give(cards, player); - event.finish(); - } - } else event.finish(); - "step 3"; - if (result.bool) { - event.targetx.give(result.cards, player); - event.targetx.line(player); - lib.skill.spdaming.change(target, 1); - game.delayx(); - } - }, - ai: { - expose: 0.2, - order: 10, - result: { target: 1 }, - }, - }, - }, - }, - spxiaoni: { - audio: 2, - enable: "phaseUse", - usable: 1, - locked: false, - filter: function (event, player) { - return (player.storage.spdaming || 0) > 0; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var name of lib.inpile) { - if (name == "sha") { - list.push(["基本", "", "sha"]); - for (var i of lib.inpile_nature) list.push(["基本", "", "sha", i]); - } - if (!get.tag({ name: name }, "damage")) continue; - if (get.type2(name) == "trick") list.push(["锦囊", "", name]); - } - return ui.create.dialog("嚣逆", [list, "vcard"]); - }, - filter: function (button, player) { - return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent()); - }, - check: function (button) { - var player = _status.event.player; - if (player.countCards("hs", button.link[2]) > 0) return 0; - var effect = player.getUseValue(button.link[2]); - if (effect > 0) return effect; - return 0; - }, - backup: function (links, player) { - return { - filterCard: true, - audio: "spxiaoni", - selectCard: 1, - popname: true, - check: function (card) { - return 6 - get.value(card); - }, - position: "hes", - viewAs: { name: links[0][2], nature: links[0][3] }, - onuse: function (result, player) { - lib.skill.spdaming.change(player, -result.targets.length); - }, - }; - }, - prompt: function (links, player) { - return "将一张牌当" + (get.translation(links[0][3]) || "") + "【" + get.translation(links[0][2]) + "】使用"; - }, - }, - mod: { - maxHandcardBase: function (player, num) { - return Math.min(Math.max(0, player.storage.spdaming || 0), player.hp); - }, - }, - ai: { - order: 4, - result: { - player: 1, - }, - threaten: 1.4, - combo: "spdaming", - }, - subSkill: { - backup: {}, - }, - }, - // 灭霸 - zhujian: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.countCards("e") > 0; - }, - selectTarget: [2, Infinity], - multiline: true, - multitarget: true, - filter: function (event, player) { - return game.countPlayer(current => current.countCards("e") > 0) >= 2; - }, - content: function () { - game.asyncDraw(targets); - }, - ai: { - order: 8, - result: { target: 1 }, - }, - }, - duansuo: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.isLinked(); - }, - selectTarget: [1, Infinity], - multiline: true, - multitarget: true, - filter: function (event, player) { - return game.countPlayer(current => current.isLinked()); - }, - content: function () { - "step 0"; - event.targets = targets.sortBySeat(); - for (var i of event.targets) { - i.link(false); - } - "step 1"; - for (var i of targets) { - i.damage("fire"); - } - }, - ai: { - order: 2, - result: { target: -1 }, - }, - }, - // 界朱治 - sbanguo: { - audio: 3, - trigger: { global: "phaseBefore", player: "enterGame" }, - forced: true, - locked: false, - direct: true, - group: ["sbanguo_move", "sbanguo_damage", "sbanguo_dying"], - filter: function (event, player) { - return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); - }, - content: function () { - "step 0"; - player.chooseTarget("安国:令一名其他角色获得“安国”标记", lib.filter.notMe, true); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbanguo", target); - target.addMark("sbanguo_mark", 1, false); - target.addAdditionalSkill("sbanguo_" + player.playerid, "sbanguo_mark"); - target.addMark("sbanguo_marked", 1, false); - } - }, - subSkill: { - mark: { - onremove: true, - marktext: "安", - charlotte: true, - intro: { - name: "安国", - name2: "安国", - content: "已拥有“安国”标记", - }, - mod: { - maxHandcardBase: function (player, num) { - return player.maxHp; - }, - }, - }, - move: { - audio: "sbanguo", - direct: true, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return game.hasPlayer(current => current.hasSkill("sbanguo_mark")) && game.hasPlayer(current => !current.hasMark("sbanguo_marked") && current != player); - }, - content: function () { - "step 0"; - var targets = game.filterPlayer(current => current.hasSkill("sbanguo_mark")); - var prompt2 = targets.length == 1 ? "将" + get.translation(targets[0]) + "的“安国”交给一名未获得过“安国”的其他角色" : "选择一名有“安国”的角色,将该标记交给一名未获得过“安国”的其他角色"; - player - .chooseTarget(get.prompt("sbanguo"), prompt2, targets.length == 1 ? 1 : 2, (card, player, target) => { - if (ui.selected.targets.length == 0 && _status.event.targets.length > 1) return target.hasSkill("sbanguo_mark"); - return !target.hasMark("sbanguo_marked") && target != player; - }) - .set("ai", target => { - var player = _status.event.player; - if (ui.selected.targets.length == 0 && _status.event.targets.length > 1) return -get.attitude(player, target); - return get.attitude(player, _status.event.targets[0]) < get.attitude(player, target); - }) - .set("targets", targets); - "step 1"; - if (result.bool) { - var targets = result.targets; - if (targets.length == 1) { - var target1 = game.filterPlayer(current => current.hasSkill("sbanguo_mark"))[0]; - var target2 = targets[0]; - } else { - var target1 = targets[0]; - var target2 = targets[1]; - } - player.logSkill("sbanguo_move", target2, false); - player.line2([target1, target2], "green"); - var map = target1.additionalSkills; - for (var key in map) { - if (key.indexOf("sbanguo_") != 0) continue; - var id = parseInt(key.slice(8)); - target1.removeAdditionalSkill("sbanguo_" + id); - target2.addMark("sbanguo_mark", 1, false); - target2.addAdditionalSkill("sbanguo_" + id, "sbanguo_mark"); - target2.addMark("sbanguo_marked", 1, false); - } - } - }, - }, - damage: { - audio: "sbanguo", - forced: true, - locked: false, - trigger: { player: "damageBegin4" }, - filter: function (event, player) { - if (!game.hasPlayer(current => current.hasSkill("sbanguo_mark"))) return false; - if (event.source && event.source.isIn() && event.source.hasSkill("sbanguo_mark")) return false; - return event.num >= player.hp; - }, - content: function () { - trigger.cancel(); - }, - ai: { - nofire: true, - nothunder: true, - nodamage: true, - effect: { - target: function (card, player, target, current) { - if (!game.hasPlayer(current => current.hasSkill("sbanguo_mark"))) return; - if (player.hasSkill("sbanguo_mark")) return; - if (get.tag(card, "damage")) { - if (target.hp <= 1) return [0, 0]; - return 0.5; - } - }, - }, - }, - }, - dying: { - audio: "sbanguo", - forced: true, - locked: false, - trigger: { global: "dying" }, - filter: function (event, player) { - var skills = event.player.additionalSkills["sbanguo_" + player.playerid]; - return skills && skills.length; - }, - logTarget: "player", - content: function () { - "step 0"; - trigger.player.removeAdditionalSkill("sbanguo_" + player.playerid); - var num = 1 - trigger.player.hp; - if (num > 0) trigger.player.recover(num); - "step 1"; - var hp = player.hp - 1, - maxhp = player.maxHp - 1; - if (hp > 0 && maxhp > 0) { - player - .chooseControl() - .set("prompt", "安国:请选择一项") - .set("choiceList", ["失去" + hp + "点体力,令" + get.translation(trigger.player) + "获得1点护甲", "减" + maxhp + "点体力上限,令" + get.translation(trigger.player) + "获得1点护甲"]) - .set("ai", () => "选项一"); - } else if (hp > 0) event._result = { control: "选项一" }; - else if (maxhp > 0) event._result = { control: "选项二" }; - else event.finish(); - "step 2"; - if (result.control == "选项一") { - var num = player.hp - 1; - if (num > 0) player.loseHp(num); - } else { - var num = player.maxHp - 1; - if (num > 0) player.loseMaxHp(num); - } - trigger.player.changeHujia(1, null, true); - }, - }, - }, - }, - // 界吴懿 - sbbenxi: { - audio: 3, - trigger: { - player: "phaseUseBegin", - }, - filter: function (event, player) { - return player.countDiscardableCards(player, "he") > 0; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt2("sbbenxi"), [1, Infinity], "he") - .set("logSkill", "sbbenxi") - .set("ai", card => { - var player = _status.event.player; - if (ui.selected.cards.length < _status.event.num) return 100 - (get.useful(card, player) + player.getUseValue(card) / 3); - return 0; - }) - .set( - "num", - (function () { - var count = 0; - var list = [], - list2 = []; - var targets = game.filterPlayer(current => get.distance(player, current) >= 1); - var cards = player.getCards("hs", card => { - return player.hasUseTarget(card, false) && ["basic", "trick"].includes(get.type(card, false, player)) && get.info(card).allowMultiple != false; - }); - var cards2 = player - .getCards("he") - .filter(i => lib.filter.cardDiscardable(i, player, "sbbenxi")) - .sort((a, b) => { - return get.useful(a, player) + player.getUseValue(a) / 3 - (get.useful(b, player) + player.getUseValue(b) / 3); - }); - for (var i = 0; i < cards2.length; i++) { - count = 0; - list = []; - for (var card of cards) { - var num = i + 1; - if (cards2.slice(0, num).includes(card)) continue; - if (get.tag(card, "damage") && i > 0) count += get.effect(player, { name: "draw" }, player); - var targets2 = targets.filter(current => { - return player.canUse(card, current, false) && get.distance(player, current) <= num && get.effect(current, card, player, player) > 0; - }); - targets2 = targets2.map(target => get.effect(target, card, player, player)).sort((a, b) => b - a); - targets2.slice(0, num).forEach(eff => (count += eff)); - list.push(count - 1.2 * get.value(cards2[i])); - } - var val = list.sort((a, b) => b - a)[0]; - if (!isNaN(val)) list2.push([val, i]); - } - list2 = list2.filter(i => i[0] > 0); - if (!list2.length) return 0; - return list2.sort((a, b) => b[0] - a[0])[0][1]; - })() - ); - "step 1"; - if (result.bool) { - var num = result.cards.length; - player.addTempSkill("sbbenxi_effect", "phaseUseAfter"); - player.addTempSkill("sbbenxi_effect2", "phaseUseAfter"); - player.addMark("sbbenxi_effect2", num, false); - } - }, - subSkill: { - effect: { - audio: "sbbenxi", - trigger: { player: "useCard2" }, - forced: true, - charlotte: true, - direct: true, - onremove: true, - filter: function (event, player) { - var type = get.type(event.card, false); - return type == "basic" || type == "trick"; - }, - content: function () { - "step 0"; - var num = player.countMark("sbbenxi_effect2"); - player.removeSkill("sbbenxi_effect"); - player.addTempSkill("sbbenxi_effect3", "phaseUseAfter"); - player.markAuto("sbbenxi_effect3", [trigger.card]); - var filter = function (event, player) { - var card = event.card, - info = get.info(card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && get.distance(player, current) == 1; - }) - ) { - return true; - } - } - return false; - }; - if (!filter(trigger, player)) event.finish(); - else { - var prompt = "为" + get.translation(trigger.card) + "增加至多" + get.cnNumber(num) + "个距离为1的目标?"; - trigger.player - .chooseTarget(get.prompt("sbbenxi_effect"), prompt, [1, num], function (card, player, target) { - var player = _status.event.player; - return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target) && get.distance(player, target) == 1; - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - } - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - } else event.finish(); - "step 2"; - player.logSkill("sbbenxi_effect", result.targets); - game.log(result.targets, "也成为了", trigger.card, "的目标"); - trigger.targets.addArray(result.targets); - }, - ai: { - effect: { - target: function (card, player, target) { - if (player.canUse(card, target) && get.distance(player, target) != 1) return 1.2; - }, - }, - }, - }, - effect2: { - audio: "sbbenxi", - trigger: { - global: "useCardAfter", - }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - return ( - player.getStorage("sbbenxi_effect3").includes(event.card) && - game.hasPlayer2(current => { - return current.hasHistory("damage", evt => { - return event.card == evt.card; - }); - }) - ); - }, - content: function () { - player.draw(5); - }, - mod: { - aiOrder: function (player, card, num) { - var evt = _status.event.getParent("phaseUse"); - if (!evt || evt.player != player) return; - if ( - player.hasHistory("useCard", evtx => { - return evtx.getParent("phaseUse") == evt && ["basic", "trick"].includes(get.type(evtx.card)); - }) - ) - return; - if (get.tag(card, "damage") || get.type(card) == "equip") return num + 10; - }, - globalFrom: function (from, to, distance) { - return distance - from.countMark("sbbenxi_effect2"); - }, - }, - marktext: "奔", - intro: { - content: function (storage, player) { - var str = "于此阶段至其他角色的距离-" + storage; - if (player.hasSkill("sbbenxi_effect")) str += ";使用下一张基本牌或普通锦囊牌选择目标后,可以增加" + get.cnNumber(storage) + "个目标"; - return str; - }, - }, - }, - effect3: { - forced: true, - charlotte: true, - popup: false, - onremove: true, - }, - }, - }, - // 杨阜 - jiebing: { - audio: 2, - trigger: { - player: "damageEnd", - }, - direct: true, - forced: true, - filter: function (event, player) { - return game.hasPlayer(current => { - return current != event.source && current != player && current.countGainableCards(player, "he"); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget("借兵:选择一名其他角色", get.skillInfoTranslation("jiebing"), true, (card, player, target) => { - return player != target && target != _status.event.getTrigger().source && target.countGainableCards(player, "he"); - }) - .set("ai", target => get.effect(target, { name: "shunshou_copy2" }, player, player) /** (target.countCards('he')>1?1.5:1)*/); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("jiebing", target); - if (target.ai.shown > 0) player.addExpose(0.15); - var cards = target.getGainableCards(player, "he").randomGets(1); - event.cards = cards; - player.gain(target, cards, "give", "bySelf"); - player.showCards(cards, "借兵"); - } else event.finish(); - "step 2"; - for (var card of cards) { - if (get.type(card) == "equip" && player.hasUseTarget(card) && get.owner(card) == player) { - player.chooseUseTarget(card, true); - } - } - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (player != target && !player.getFriends().length) return; - if ( - game.hasPlayer(current => { - return current != player && get.attitude(player, current) > 0 && current.countGainableCards(target, "he") > 0; - }) - ) - return [1, 1]; - } - }, - }, - }, - }, - hannan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return !player.hasSkillTag("noCompareSource"); - }, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (!result.tie) { - var players = [player, target]; - if (result.bool) players.reverse(); - players[1].line(players[0], "thunder"); - players[0].damage(players[1], 2); - } - }, - ai: { - order: 7, - result: { - target: function (player, target) { - var hs = player.getCards("h").sort(function (a, b) { - return get.number(b) - get.number(a); - }); - var ts = target.getCards("h").sort(function (a, b) { - return get.number(b) - get.number(a); - }); - if (!hs.length || !ts.length) return 0; - if (get.number(hs[0]) > get.number(ts[0]) || get.number(hs[0]) - ts.length >= 9 + Math.min(2, player.hp / 2)) return get.sgnAttitude(player, target) * get.damageEffect(target, player, player); - return 0; - }, - }, - }, - }, - // 曹嵩 - yijin: { - audio: 3, - trigger: { player: "phaseUseBegin" }, - forced: true, - direct: true, - group: ["yijin_upstart", "yijin_die"], - filter: function (event, player) { - if (!game.hasPlayer(current => current != player && !lib.skill.yijin.getKane(current).length)) return false; - return lib.skill.yijin.getKane(player).length; - }, - getKane: function (player) { - var list = lib.skill.yijin.derivation; - return list.filter(mark => player.hasMark(mark)); - }, - derivation: ["yijin_wushi", "yijin_jinmi", "yijin_guxiong", "yijin_tongshen", "yijin_yongbi", "yijin_houren"], - getValue: function (player, mark, target) { - let dis = Math.sqrt(get.distance(player, target, "absolute")); - if (target.isTurnedOver()) dis++; - let draw = get.effect(target, { name: "draw" }, target, target); - switch (mark.slice(6)) { - case "wushi": - if (target.hasJudge("bingliang")) return 12 / (1 + target.getCardUsable("sha", true)); - return (5 * draw) / dis + 12 / (1 + target.getCardUsable("sha", true)); - case "jinmi": - if (target.hasJudge("lebu") && !target.hasCard({ name: "wuxie" }, "hs")) return (draw * target.needsToDiscard(2.2)) / dis; - return get.effect(target, { name: "lebu" }, player, target) + (draw * target.needsToDiscard(2.2)) / dis; - case "guxiong": - if (target.hasJudge("lebu")) return (-draw * target.needsToDiscard(3)) / dis; - return (get.effect(target, { name: "losehp" }, target, target) * 2) / dis - (draw * target.needsToDiscard(3)) / dis; - case "tongshen": - if (target.isMin()) return 0; - var eff = -get.damageEffect(target, player, target); - if (eff <= 0) return 0; - if (target.hp < 2) return eff * dis * 2; - if (target.hp < 3 && target.countCards("he") < 3) return eff * dis * 1.5; - if (target.hp > 3) return (eff * dis) / target.hp; - return eff * dis; - case "yongbi": - if (target.hasJudge("bingliang") && !target.hasCard({ name: "wuxie" }, "hs")) return 0; - return (get.effect(target, { name: "bingliang" }, player, target) * 2) / dis; - case "houren": - return (Math.min(5, 2 + target.getDamagedHp()) * get.recoverEffect(target, player, target)) / dis; - } - }, - content: function () { - "step 0"; - player - .chooseTarget("亿金:令一名其他角色获得1枚“金”", true, (card, player, target) => { - return player != target && !lib.skill.yijin.getKane(target).length; - }) - .set("ai", target => { - let player = _status.event.player, - att = get.attitude(player, target), - kane = lib.skill.yijin.getKane(player); - if (Math.abs(att) > 1) att = Math.sign(att) * Math.sqrt(Math.abs(att)); - return Math.max.apply( - Math.max, - kane.map(i => { - return att * lib.skill.yijin.getValue(player, i, target); - }) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("yijin", target); - var kane = lib.skill.yijin.getKane(player); - var choiceList = kane.map(i => { - return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + "
    " + get.skillInfoTranslation(i, player) + "
    "; - }); - player - .chooseControl(kane) - .set("choiceList", choiceList) - .set("displayIndex", false) - .set("prompt", "选择令" + get.translation(target) + "获得的“金”") - .set("ai", () => { - let controls = _status.event.controls, - player = _status.event.player, - target = _status.event.getParent().target, - att = get.attitude(player, target); - if (Math.abs(att) > 1) att = Math.sign(att) * Math.sqrt(Math.abs(att)); - let list = controls.map(i => { - return [i, att * lib.skill.yijin.getValue(player, i, target)]; - }); - list.sort((a, b) => b[1] - a[1]); - if (list.length) return list[0][0]; - return controls.randomGet(); - }); - } else event.finish(); - "step 2"; - var kane = result.control; - player.removeMark(kane, 1); - player.popup(kane, "metal"); - player.addSkill("yijin_clear"); - target.addMark(kane, 1); - target.addAdditionalSkill("yijin_" + player.playerid, kane); - game.delayx(); - }, - subSkill: { - mark: { - mark: true, - marktext: "金", - intro: { - name: "金(膴仕)", - name2: "金(膴仕)", - markcount: function (storage, player) { - return lib.skill.yijin.getKane(player).length; - }, - content: function (storage, player) { - return "剩余金:" + get.translation(lib.skill.yijin.getKane(player)); - }, - }, - }, - upstart: { - audio: "yijin", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - var kane = lib.skill.yijin.derivation; - for (var mark of kane) { - player.addMark(mark, 1, false); - player.unmarkSkill(mark); - } - player.addSkill("yijin_mark"); - }, - }, - die: { - audio: "yijin", - trigger: { player: "phaseBegin" }, - forced: true, - check: () => false, - filter: function (event, player) { - return !lib.skill.yijin.getKane(player).length; - }, - content: function () { - player.die(); - }, - }, - clear: { - trigger: { - global: "phaseAfter", - player: "die", - }, - charlotte: true, - forced: true, - popup: false, - forceDie: true, - filter: function (event, player) { - if (event.name == "die") return true; - return lib.skill.yijin.getKane(event.player).length && event.player.additionalSkills["yijin_" + player.playerid]; - }, - content: function () { - "step 0"; - if (trigger.name == "die") { - game.countPlayer(current => { - var skills = current.additionalSkills["yijin_" + player.playerid]; - if (skills && skills.length) { - current.removeAdditionalSkill("yijin_" + player.playerid); - for (var i of skills) { - trigger.player.removeSkill(i); - } - } - }); - event.finish(); - return; - } else { - const skills = trigger.player.additionalSkills["yijin_" + player.playerid]; - for (const mark of skills) trigger.player.removeMark(mark, 1); - } - "step 1"; - trigger.player.removeAdditionalSkill("yijin_" + player.playerid); - }, - }, - wushi: { - charlotte: true, - forced: true, - trigger: { player: "phaseDrawBegin2" }, - content: function () { - trigger.num += 4; - }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - marktext: "金", - intro: { - name: "金(膴仕)", - name2: "金(膴仕)", - content: "摸牌阶段多摸四张牌;使用【杀】的次数上限+1", - }, - }, - jinmi: { - charlotte: true, - forced: true, - trigger: { player: "phaseBegin" }, - content: function () { - player.skip("phaseUse"); - player.skip("phaseDiscard"); - }, - marktext: "金", - intro: { - name: "金(金迷)", - name2: "金(金迷)", - content: "回合开始时,跳过下一个出牌阶段和弃牌阶段", - }, - }, - guxiong: { - charlotte: true, - forced: true, - trigger: { player: "phaseUseBegin" }, - content: function () { - player.loseHp(); - }, - ai: { - neg: true, - nokeep: true, - }, - mod: { - maxHandcard: function (player, num) { - return num - 3; - }, - }, - marktext: "金", - intro: { - name: "金(贾凶)", - name2: "金(贾凶)", - content: "出牌阶段开始时,失去1点体力;手牌上限-3", - }, - }, - tongshen: { - charlotte: true, - forced: true, - trigger: { player: "damageBegin4" }, - filter: function (event) { - return !event.hasNature("thunder"); - }, - content: function () { - trigger.cancel(); - }, - ai: { - nofire: true, - nodamage: true, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage") && !get.tag(card, "thunderDamage")) return [0, 0]; - }, - }, - }, - marktext: "金", - intro: { - name: "金(通神)", - name2: "金(通神)", - content: "当你受到非雷电伤害时,防止之", - }, - }, - yongbi: { - charlotte: true, - forced: true, - trigger: { player: "phaseZhunbeiBegin" }, - content: function () { - player.skip("phaseDraw"); - }, - ai: { - neg: true, - nokeep: true, - }, - marktext: "金", - intro: { - name: "金(拥蔽)", - name2: "金(拥蔽)", - content: "准备阶段,跳过下一个摸牌阶段", - }, - }, - houren: { - charlotte: true, - forced: true, - trigger: { player: "phaseEnd" }, - content: function () { - player.recover(3); - }, - marktext: "金", - intro: { - name: "金(厚任)", - name2: "金(厚任)", - content: "回合结束时,回复3点体力", - }, - }, - }, - }, - guanzong: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.countPlayer(current => current != player) >= 2; - }, - filterTarget: lib.filter.notMe, - selectTarget: 2, - multitarget: true, - targetprompt: ["伤害来源", "受伤角色"], - content: function () { - targets[1].damage(targets[0], "unreal"); - }, - ai: { - result: { - target: function (player, target) { - if (game.countPlayer(i => i != player) < 2) return 0; - var list = game - .filterPlayer(current => current != player) - .map(current => { - var _hp = current.hp, - _maxhp = current.maxHp; - current.hp = 10; - current.maxHp = 10; - var att = -get.sgnAttitude(player, current); - var val = get.damageEffect(current, player, current) * att; - current.getSkills(null, false, false).forEach(skill => { - var info = get.info(skill); - if (info && info.ai && (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend)) val = Math[val > 0 ? "max" : "min"](val > 0 ? 0.1 : -0.1, val + 2 * att); - }); - var eff = 100 / val + 15; - current.hp = _hp; - current.maxHp = _maxhp; - return [current, eff]; - }) - .sort((a, b) => b[1] - a[1])[0]; - if (list[1] < 0) return 0; - var targetx = list[0], - sign = get.sgnAttitude(player, target); - if (ui.selected.targets.length) return target == targetx ? sign : 0; - return ( - sign * - (game - .filterPlayer(current => { - return current != player && current != targetx; - }) - .map(current => { - var _hp = targetx.hp, - _maxhp = targetx.maxHp; - targetx.hp = 10; - targetx.maxHp = 10; - var eff = -get.damageEffect(targetx, current, current); - targetx.hp = _hp; - targetx.maxHp = _maxhp; - return [current, eff]; - }) - .sort((a, b) => b[1] - a[1])[0][0] == target - ? 10 - : 1) - ); - }, - }, - order: 9.5, - expose: 0.2, - }, - }, - //马日磾 - chengye: { - audio: 3, - liujing_filter: [ - function (card) { - return get.type(card, false) == "trick" && get.tag(card, "damage", null, false) > 0; - }, - card => get.type(card, false) == "basic", - card => get.name(card, false) == "wuxie", - card => get.name(card, false) == "wuzhong", - card => get.name(card, false) == "lebu", - card => get.type(card, false) == "equip", - ], - getLiujing: function (player, index) { - var filter = lib.skill.chengye.liujing_filter[index], - expansion = player.getExpansions("chengye"); - for (var i of expansion) { - if (filter(i)) return i; - } - return false; - }, - trigger: { - global: ["useCardAfter", "loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - forced: true, - filter: function (event, player) { - if (player == event.player) return false; - if (event.name == "useCard") { - if (!event.card.isCard) return false; - var cards = event.cards.filterInD(); - if (!cards.length) return false; - } else if (event.name != "cardsDiscard") { - var cards = event.getd(null, "cards2").filter(function (card) { - if (get.position(card, true) != "d") return false; - var type = get.type(card, false); - return type == "delay" || type == "equip"; - }); - cards.removeArray(event.getd(player, "cards2")); - if (!cards.length) return false; - } else { - var evtx = event.getParent(); - if (evtx.name != "orderingDiscard") return false; - var evt2 = evtx.relatedEvent || evtx.getParent(); - if (evt2.name != "phaseJudge" || evt2.player == player) return; - var cards = event.cards.filter(function (card) { - if (get.position(card, true) != "d") return false; - var type = get.type(card, false); - return type == "delay"; - }); - if (!cards.length) return false; - } - for (var i = 0; i < 6; i++) { - if (lib.skill.chengye.getLiujing(player, i)) continue; - for (var j of cards) { - if (lib.skill.chengye.liujing_filter[i](j)) return true; - } - } - return false; - }, - content: function () { - var cards, - cards2 = []; - if (trigger.name == "useCard") { - cards = trigger.cards.filterInD(); - } else if (trigger.name != "cardsDiscard") { - cards = trigger.getd().filter(function (card) { - if (card.original == "j" || get.position(card, true) != "d") return false; - var type = get.type(card, false); - return type == "delay" || type == "equip"; - }); - cards.removeArray(trigger.getd(player)); - } else { - cards = trigger.cards.filter(function (card) { - if (get.position(card, true) != "d") return false; - var type = get.type(card, false); - return type == "delay"; - }); - } - for (var i = 0; i < 6; i++) { - if (lib.skill.chengye.getLiujing(player, i)) continue; - for (var j of cards) { - if (lib.skill.chengye.liujing_filter[i](j)) { - cards.remove(j); - cards2.push(j); - break; - } - } - if (!cards.length) break; - } - player.addToExpansion(cards2, "gain2").gaintag.add("chengye"); - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - marktext: "经", - intro: { - name: "六经", - markcount: "expansion", - content: "expansion", - mark: function (dialog, storage, player) { - var list = ["《诗经》", "《尚书》", "《仪礼》", "《易经》", "《乐经》", "《春秋》"]; - var desc = ["伤害类锦囊牌", "基本牌", "无懈可击", "无中生有", "乐不思蜀", "装备牌"]; - for (var i = 0; i < 6; i++) { - dialog.addText(list[i]); - var card = lib.skill.chengye.getLiujing(player, i); - if (!card) dialog.addText("(缺少 " + desc[i] + ")"); - else dialog.addSmall([card]); - } - }, - }, - group: "chengye_gain", - subSkill: { - gain: { - audio: "chengye", - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return player.getExpansions("chengye").length >= 6; - }, - forced: true, - content: function () { - player.gain(player.getExpansions("chengye"), "gain2"); - }, - }, - }, - }, - buxu: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - var num = (player.getStat("skill").buxu || 0) + 1; - return player.countCards("he") >= num && player.getExpansions("chengye").length < 6; - }, - chooseButton: { - chooseControl: function (event, player) { - var list = ["诗经", "尚书", "仪礼", "易经", "乐经", "春秋"]; - var choices = []; - for (var i = 0; i < 6; i++) { - if (!lib.skill.chengye.getLiujing(player, i)) choices.push(list[i]); - } - choices.push("cancel2"); - return choices; - }, - check: function (event, player) { - var list = [4, 3, 5, 0, 2, 1]; - for (var i of list) { - if (!lib.skill.chengye.getLiujing(player, i)) { - return ["诗经", "尚书", "仪礼", "易经", "乐经", "春秋"][i]; - } - } - return "cancel2"; - }, - dialog: function (event, player) { - var num = (player.getStat("skill").buxu || 0) + 1; - return ui.create.dialog("###补叙###弃置" + get.cnNumber(num) + "张牌并补充一张“六经”"); - }, - prompt: function (links, player) { - var num = (player.getStat("skill").buxu || 0) + 1; - return "弃置" + get.cnNumber(num) + "张牌并补充一张《" + links.control + "》"; - }, - backup: function (links, player) { - return { - audio: "buxu", - index: ["诗经", "尚书", "仪礼", "易经", "乐经", "春秋"].indexOf(links.control), - filterCard: true, - position: "he", - selectCard: (player.getStat("skill").buxu || 0) + 1, - ai1: function (card) { - var player = _status.event.player; - if ( - player.needsToDiscard(0, (i, player) => { - return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); - }) - ) - return 10 / Math.max(0.1, get.value(card)); - return 5 - (player.getStat("skill").buxu || 0) - get.value(card); - }, - ai2: () => 1, - content: function () { - var filter = lib.skill.chengye.liujing_filter[lib.skill.buxu_backup.index]; - var card = get.cardPile(filter); - if (card) player.addToExpansion(card, "gain2").gaintag.add("chengye"); - }, - ai: { result: { player: 1 } }, - }; - }, - }, - ai: { - combo: "chengye", - order: 0.2, - result: { player: 1 }, - }, - }, - //阮慧 - mingcha: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - forced: true, - locked: false, - filter: event => !event.numFixed, - content: function () { - "step 0"; - var cards = game.cardsGotoOrdering(get.cards(3)).cards, - cards2 = cards.slice(0); - event.cards = cards.filter(function (i) { - return get.number(i) < 9; - }); - // while(cards2.length>0){ - // var card=cards2.pop(); - // card.fix(); - // ui.cardPile.insertBefore(card,ui.cardPile.firstChild); - // } - // game.updateRoundNumber(); - player.showCards(cards, get.translation(player) + "发动了【明察】"); - if (!event.cards.length) event.finish(); - "step 1"; - player.chooseBool("是否放弃摸牌并获得" + get.translation(cards)).set("goon", trigger.num - cards.length <= 1); - "step 2"; - if (result.bool) { - trigger.changeToZero(); - player.gain(cards, "gain2"); - } else event.finish(); - "step 3"; - player - .chooseTarget("是否随机获得其他角色的一张牌?", function (card, player, target) { - return target != player && target.countCards("he") > 0; - }) - .set("ai", function (target) { - return 3 - get.attitude(player, target); - }); - "step 4"; - if (result.bool) { - var target = result.targets[0], - cards = target.getGainableCards(player, "he"); - player.line(target, "green"); - if (cards.length) player.gain(cards.randomGet(), target, "giveAuto", "bySelf"); - } - }, - }, - jingzhong: { - audio: 2, - trigger: { player: "phaseDiscardAfter" }, - filter: function (event, player) { - var num = 0; - player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) { - for (var i of evt.cards2) { - if (get.color(i, player) == "black") num++; - } - } - }); - return num > 1; - }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt("jingzhong"), "获得一名其他角色下回合出牌阶段内使用的牌", lib.filter.notMe).set("ai", function (target) { - return Math.sqrt(target.countCards("h")) * get.threaten(target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("jingzhong", target); - player.addSkill("jingzhong_effect"); - player.markAuto("jingzhong_effect", [target]); - game.delayx(); - } - }, - subSkill: { - effect: { - trigger: { global: "useCardAfter" }, - forced: true, - charlotte: true, - filter: function (event, player) { - if (!player.getStorage("jingzhong_effect").includes(event.player) || !event.cards.filterInD().length) return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != event.player) return false; - return ( - player.getHistory("useSkill", function (evtx) { - return evtx.skill == "jingzhong_effect" && evtx.event.getParent("phaseUse") == evt; - }).length < 3 - ); - }, - logTarget: "player", - content: function () { - player.gain(trigger.cards.filterInD(), "gain2"); - }, - mark: true, - intro: { content: "已指定$为目标" }, - group: "jingzhong_remove", - }, - remove: { - trigger: { global: "phaseAfter" }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - filter: function (event, player) { - return player.getStorage("jingzhong_effect").includes(event.player); - }, - content: function () { - var storage = player.getStorage("jingzhong_effect"); - storage.remove(trigger.player); - if (!storage.length) player.removeSkill("jingzhong_effect"); - }, - }, - }, - }, - //全琮 - sbyaoming: { - audio: 2, - chargeSkill: true, - enable: "phaseUse", - filter: function (event, player) { - return player.countMark("charge") > 0; - }, - filterTarget: true, - prompt: function () { - var num = _status.event.player.storage.sbyaoming_status; - var list = ["弃置一名手牌数不小于你的角色的一张牌", ";或令一名手牌数不大于你的角色摸一张牌"]; - if (typeof num == "number") list[num] += "(上次选择)"; - return list[0] + list[1]; - }, - content: function () { - "step 0"; - player.removeMark("charge", 1); - var num = target.countCards("h"), - num2 = player.countCards("h"); - if (num == num2 && target.countCards("he") > 0) { - var choice = get.attitude(player, target) > 0 ? 1 : 0; - var str = get.translation(target), - choiceList = ["弃置" + str + "的一张牌", "令" + str + "摸一张牌"]; - if (typeof player.storage.sbyaoming_status == "number") choiceList[player.storage.sbyaoming_status] += "(上次选择)"; - var next = player.chooseControl().set("choiceList", choiceList); - next.set("ai_choice", choice); - next.set("ai", () => _status.event.ai_choice); - } else event._result = { index: num > num2 ? 0 : 1 }; - "step 1"; - if (result.index == 0) { - player.discardPlayerCard(target, true, "he"); - } else target.draw(); - if (typeof player.storage.sbyaoming_status == "number" && result.index != player.storage.sbyaoming_status) { - player.addMark("charge", 1); - delete player.storage.sbyaoming_status; - } else { - player.storage.sbyaoming_status = result.index; - } - }, - ai: { - order: 6, - result: { - player: function (player, target) { - var att = get.attitude(player, target), - eff = [0, 0]; - var hs = player.countCards("h"), - ht = target.countCards("h"); - if (hs >= ht) { - eff[0] = get.effect(target, { name: "draw" }, player, player); - if (player.storage.sbyaoming_status == 0) eff[0] *= 1.2; - } - if (hs <= ht) { - eff[1] = get.effect(target, { name: "guohe_copy2" }, player, player); - if (player.storage.sbyaoming_status == 1) eff[1] *= 1.2; - } - return Math.max.apply(Math, eff); - }, - }, - }, - group: ["sbyaoming_damage", "sbyaoming_init"], - subSkill: { - damage: { - trigger: { player: "damageEnd" }, - direct: true, - content: function () { - "step 0"; - var num = Math.min(trigger.num, 4 - player.countMark("charge")); - if (num > 0) { - player.logSkill("sbyaoming_damage"); - player.addMark("charge", num); - game.delayx(); - } - "step 1"; - player.chooseTarget(get.prompt("sbyaoming"), lib.skill.sbyaoming.prompt()).set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, "sbyaoming", player, player); - }); - "step 2"; - if (result.bool) { - player.useSkill("sbyaoming", result.targets); - } - }, - }, - init: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter: function (event, player) { - return (event.name != "phase" || game.phaseNumber == 0) && player.countMark("charge") < 4; - }, - content: function () { - player.addMark("charge", Math.min(2, 4 - player.countMark("charge"))); - }, - }, - }, - }, - //手杀界荀彧 - rejieming: { - audio: 2, - trigger: { - player: "damageEnd", - }, - direct: true, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - player.chooseTarget(get.prompt("rejieming"), "令一名角色摸两张牌。然后若其手牌数少于体力上限,你摸一张牌").set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 2) { - if (target.maxHp - target.countCards("h") > 2) return 2 * att; - return att; - } - return att / 3; - }); - "step 2"; - if (result.bool) { - event.current = result.targets[0]; - player.logSkill("rejieming", event.current); - player.line(event.current, "thunder"); - event.current.draw(2); - event.count--; - } else event.finish(); - "step 3"; - if (event.current.countCards("h") < event.current.maxHp) { - player.draw(); - } - "step 4"; - if (event.count > 0 && player.hasSkill("rejieming")) event.goto(1); - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage") && target.hp > 1) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - var max = 0; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (get.attitude(target, players[i]) > 0) { - max = Math.max(Math.min(5, players[i].hp) - players[i].countCards("h"), max); - } - } - switch (max) { - case 0: - return 2; - case 1: - return 1.5; - case 2: - return [1, 2]; - default: - return [0, max]; - } - } - if ((card.name == "tao" || card.name == "caoyao") && target.hp > 1 && target.countCards("h") <= target.hp) return [0, 0]; - }, - }, - }, - }, - //沮授 - xinjianying: { - audio: 2, - subfrequent: ["draw"], - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - if (!player.countCards("he")) return false; - for (var i of lib.inpile) { - if (i != "du" && get.type(i, false) == "basic") { - if (event.filterCard({ name: i }, player, event)) return true; - if (i == "sha") { - for (var j of lib.inpile_nature) { - if (event.filterCard({ name: i, nature: j }, player, event)) return true; - } - } - } - } - return false; - }, - onChooseToUse: function (event) { - if (event.type == "phase" && !game.online) { - var last = event.player.getLastUsed(); - if (last && last.getParent("phaseUse") == event.getParent()) { - var suit = get.suit(last.card, false); - if (suit != "none") event.set("xinjianying_suit", suit); - } - } - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - var suit = event.xinjianying_suit || "", - str = get.translation(suit); - for (var i of lib.inpile) { - if (i != "du" && get.type(i, false) == "basic") { - if (event.filterCard({ name: i }, player, event)) list.push(["基本", str, i]); - if (i == "sha") { - for (var j of lib.inpile_nature) { - if (event.filterCard({ name: i, nature: j }, player, event)) list.push(["基本", str, i, j]); - } - } - } - } - return ui.create.dialog("渐营", [list, "vcard"]); - }, - check: function (button) { - if (button.link[2] == "jiu") return 0; - return _status.event.player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }, - backup: function (links, player) { - var next = { - audio: "xinjianying", - filterCard: true, - popname: true, - position: "he", - viewAs: { - name: links[0][2], - nature: links[0][3], - }, - ai1: function (card) { - return 7 - _status.event.player.getUseValue(card, null, true); - }, - }; - if (_status.event.xinjianying_suit) next.viewAs.suit = _status.event.xinjianying_suit; - return next; - }, - prompt: function (links) { - return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + (_status.event.xinjianying_suit ? "(" + get.translation(_status.event.xinjianying_suit) + ")" : "") + "使用"; - }, - }, - ai: { - order: function (item, player) { - if (_status.event.xinjianying_suit) return 16; - return 3; - }, - result: { player: 7 }, - }, - group: ["xinjianying_draw", "jianying_mark"], - init: function (player) { - if (player.isPhaseUsing()) { - var evt = _status.event.getParent("phaseUse"); - var history = player.getHistory("useCard", function (evt2) { - return evt2.getParent("phaseUse") == evt; - }); - if (history.length) { - var trigger = history[history.length - 1]; - player.storage.jianying_mark = trigger.card; - player.markSkill("jianying_mark"); - game.broadcastAll( - function (player, suit) { - if (player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML = get.translation(suit); - }, - player, - get.suit(trigger.card, player) - ); - player.when("phaseUseAfter").then(() => { - player.unmarkSkill("jianying_mark"); - delete player.storage.jianying_mark; - }); - } - } - }, - onremove: function (player) { - player.unmarkSkill("jianying_mark"); - delete player.storage.jianying_mark; - }, - subSkill: { - draw: { inherit: "jianying", audio: "xinjianying" }, - }, - }, - //步练师 - reanxu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - game.countPlayer() > 2 && - game.hasPlayer(function (current) { - return current != player && current.countCards("he"); - }) - ); - }, - selectTarget: 2, - filterTarget: function (card, player, target) { - if (target == player) return false; - if (!ui.selected.targets.length) return target.countCards("he") > 0; - return target != ui.selected.targets[0] && ui.selected.targets[0].countGainableCards(target, "he") > 0; - }, - multitarget: true, - targetprompt: ["被拿牌", "得到牌"], - content: function () { - "step 0"; - targets[1].gainPlayerCard(targets[0], "he", true); - "step 1"; - if ( - targets[0].getHistory("lose", function (evt) { - return evt.getParent(3) == event && !evt.es.length; - }).length - ) - player.draw(); - "step 2"; - if (targets[0].isIn() && targets[1].isIn() && targets[0].countCards("h") != targets[1].countCards("h")) { - event.target = targets[targets[0].countCards("h") > targets[1].countCards("h") ? 1 : 0]; - player.chooseBool("是否令" + get.translation(event.target) + "摸一张牌?").set("ai", function () { - var evt = _status.event.getParent(); - return get.attitude(evt.player, evt.target) > 0; - }); - } else event.finish(); - "step 3"; - if (result.bool) target.draw(); - }, - ai: { - expose: 0.2, - threaten: 2, - order: 9, - result: { - player: function (player, target) { - if (ui.selected.targets.length) return 0.01; - return target.countCards("e") ? 0 : 0.5; - }, - target: function (player, target) { - if (ui.selected.targets.length) { - player = target; - target = ui.selected.targets[0]; - if (get.attitude(player, target) > 1) { - return 0; - } - return target.countCards("h") - player.countCards("h") > (target.countCards("e") ? 2 : 1) ? 2 : 1; - } else { - if (get.attitude(player, target) <= 0) - return target.countCards("he", function (card) { - return card.name == "tengjia" || get.value(card) > 0; - }) > 0 - ? -1.5 - : 1.5; - return target.countCards("he", function (card) { - return card.name != "tengjia" && get.value(card) <= 0; - }) > 0 - ? 1.5 - : -1.5; - } - }, - }, - }, - }, - //蒋干 - spdaoshu: { - audio: 3, - group: "spdaoshu_effect", - subSkill: { - effect: { - audio: "spdaoshu1", - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - var goon = event.player != player && (get.mode() == "identity" || get.mode() == "guozhan" || event.player.isEnemyOf(player)); - return goon && event.player.countCards("h") > 0 && event.player.hasUseTarget({ name: "jiu", isCard: true }, null, true); - }, - round: 1, - logTarget: "player", - prompt2: () => lib.translate.spdaoshu_info, - check: function (event, player) { - var target = event.player; - var att = get.attitude(player, target); - if (att > 0) return false; - if (att == 0) return !player.inRangeOf(target); - return true; - }, - content: function () { - "step 0"; - event.target = trigger.player; - event.target.chooseUseTarget("jiu", true); - "step 1"; - if (!target.countCards("h")) { - event.finish(); - return; - } - var list = []; - for (var i of lib.inpile) { - if (get.type(i) == "basic") list.push(i); - } - if (!list.length) { - event.finish(); - return; - } - target - .chooseControl(list) - .set("prompt", "请声明一种基本牌") - .set("ai", () => _status.event.rand) - .set("rand", get.rand(0, list.length - 1)); - "step 2"; - event.cardname = result.control; - target.chat("我声明" + get.translation(event.cardname)); - game.log(target, "声明的牌名为", "#y" + get.translation(event.cardname)); - game.delayx(); - player - .chooseControl("有!", "没有!") - .set("prompt", "你觉得" + get.translation(target) + "的手牌区里有" + get.translation(event.cardname) + "吗?") - .set("ai", function () { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var rand = - { - sha: 0.273, - shan: 0.149, - tao: 0.074, - jiu: 0.031, - }[event.cardname] || 0.1; - return 1 - Math.pow(1 - rand, target.countCards("h")) > 0.5 ? "有!" : "没有!"; - })() - ); - "step 3"; - player.chat(result.control); - game.log(player, "认为", "#y" + result.control); - game.delayx(); - "step 4"; - var bool1 = result.index == 0; - var bool2 = target.hasCard(function (card) { - return get.name(card, target) == event.cardname; - }, "h"); - if (bool1 == bool2) { - player.popup("判断正确", "wood"); - game.broadcastAll(function () { - if (lib.config.background_speak) game.playAudio("skill", "spdaoshu2"); - }); - player.gainPlayerCard(target, "h", 2, true); - //var cards=target.getCards('h',function(card){ - // return lib.filter.canBeGained(card,player,target); - //}).randomGets(5); - //if(cards.length>0) player.gain(cards,target,'giveAuto','bySelf'); - } else { - player.popup("判断错误", "fire"); - game.broadcastAll(function () { - if (lib.config.background_speak) game.playAudio("skill", "spdaoshu3"); - }); - //player.addTempSkill('spdaoshu_respond'); - } - }, - ai: { expose: 0.3 }, - }, - respond: { - trigger: { global: "useCard1" }, - forced: true, - popup: false, - filter: function (event, player) { - return event.player == _status.currentPhase; - }, - content: function () { - trigger.directHit.add(player); - }, - }, - }, - }, - spdaoshu1: { audio: true }, - mbdaoshu: { - audio: 3, - group: "mbdaoshu_use", - subSkill: { - use: { - audio: "mbdaoshu1", - enable: "phaseUse", - filter: function (event, player) { - return game.hasPlayer(target => target != player && target.countCards("h") > 2); - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 2; - }, - usable: 1, - prompt: () => lib.translate.mbdaoshu_info, - content: function* (event, map) { - var player = map.player, - target = event.target; - var targets = [player], - names = lib.inpile.randomGets(3); - if (!names.length) return; - var map = {}; - names.forEach(name => (map[get.translation(name)] = name)); - if (get.mode() != "identity" && get.mode() != "guozhan") targets.addArray(player.getFriends()); - targets.remove(target); - targets.sortBySeat(); - var result = yield target - .chooseButton(["盗书:请选择伪装的牌和牌名", target.getCards("h"), [Object.keys(map), "tdnodes"]], 2, true) - .set("filterButton", button => { - var map = _status.event.map; - if (!ui.selected.buttons.length) return true; - if (typeof button.link == typeof ui.selected.buttons[0].link) return false; - if (typeof button.link == "string") return get.name(ui.selected.buttons[0].link, false) != map[button.link]; - return map[ui.selected.buttons[0].link] != get.name(button.link, false); - }) - .set("ai", button => { - var map = _status.event.map; - if (!ui.selected.buttons.length) { - if (typeof button.link == "object") { - if (Object.values(map).some(name => lib.card.list.some(card => card[0] == get.suit(button.link, false) && card[1] == get.number(button.link, false) && card[2] == name))) return 5; - return 3.5 + Math.random(); - } - return 0; - } - if (typeof button.link == "string") { - var cardx = ui.selected.buttons[0].link; - if (lib.card.list.some(card => card[0] == get.suit(cardx, false) && card[1] == get.number(cardx, false) && card[2] == map[button.link])) return 2 + Math.random(); - return 1; - } - return 0; - }) - .set("map", map); - if (result.bool) { - var guessWinner = []; - if (typeof result.links[0] == "string") result.links.reverse(); - var OriginCard = result.links[0], - ChangeName = map[result.links[1]], - cards = target.getCards("h").slice(); - var card = game.createCard(ChangeName, get.suit(OriginCard, false), get.number(OriginCard, false)); - cards[cards.indexOf(OriginCard)] = card; - if (_status.connectMode) { - var list = targets.map(target2 => [target2, ["请猜测" + get.translation(target) + "伪装的手牌", cards], true]); - var result2 = yield player - .chooseButtonOL(list) - .set("switchToAuto", () => (_status.event.result = "ai")) - .set("processAI", () => { - var cards = _status.event.cards.slice(); - var card = cards.find(card => lib.card.list.some(cardx => cardx[2] == card.name) && !lib.card.list.some(cardx => cardx[2] == card.name && cardx[0] == get.suit(card, false) && cardx[0] == get.number(card, false))); - return { - bool: true, - links: card ? card : cards.randomGet(), - }; - }) - .set("cards", cards); - for (var i in result2) { - if (result2[i].links[0] == card) guessWinner.push(lib.playerOL[i]); - } - } else { - var guessTargets = targets.slice(); - while (guessTargets.length) { - var target2 = guessTargets.shift(); - var result2 = yield target2 - .chooseButton(["请猜测" + get.translation(target) + "伪装的手牌", cards], true) - .set("ai", button => { - var cards = _status.event.cards.slice(); - var card = cards.find(card => lib.card.list.some(cardx => cardx[2] == get.name(card, false)) && !lib.card.list.some(cardx => cardx[2] == get.name(card, false) && cardx[0] == get.suit(card, false) && cardx[0] == get.number(card, false))); - return button.link == card ? 3 : 1 + Math.random(); - }) - .set("cards", cards); - if (result2.bool) { - if (result2.links[0] == card) guessWinner.push(target2); - } - } - } - targets.forEach(target2 => { - if (guessWinner.includes(target2)) { - target2.popup("判断正确", "wood"); - game.log(target2, "猜测", "#g正确"); - game.broadcastAll(() => { - if (lib.config.background_speak) game.playAudio("skill", "mbdaoshu2"); - }); - target2.line(target); - target.damage(1, target2); - } else { - target2.popup("判断错误", "fire"); - game.log(target2, "猜测", "#y错误"); - game.broadcastAll(() => { - if (lib.config.background_speak) game.playAudio("skill", "mbdaoshu3"); - }); - if (target2.countCards("h") >= 2) target2.discard(target2.getCards("h").randomGets(2)); - else target2.loseHp(); - } - }); - } - }, - ai: { - order: 9, - result: { - target: function (player, target) { - return -1 / target.countCards("h"); - }, - }, - }, - }, - }, - }, - mbdaoshu1: { audio: true }, - spdaizui: { - audio: 2, - trigger: { player: "damageBegin2" }, - limited: true, - logTarget: "source", - filter: function (event, player) { - return event.num >= player.hp && event.source && event.source.isIn() && event.cards && event.cards.filterInD().length > 0; - }, - prompt2: function (event) { - return "防止即将受到的" + get.cnNumber(event.num) + "点伤害,并令" + get.translation(event.source) + "将" + get.translation(event.cards.filterInD()) + "置于武将牌上且回合结束时收回"; - }, - skillAnimation: true, - animationColor: "thunder", - content: function () { - player.awakenSkill("spdaizui"); - trigger.source.addSkill("spdaizui2"); - trigger.source.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("spdaizui2"); - trigger.cancel(); - }, - }, - spdaizui2: { - trigger: { global: "phaseEnd" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return player.getExpansions("spdaizui2").length > 0; - }, - content: function () { - "step 0"; - var cards = player.getExpansions("spdaizui2"); - player.gain(cards, "gain2"); - "step 1"; - player.removeSkill("spdaizui2"); - }, - marktext: "释", - intro: { - markcount: "expansion", - content: "expansion", - }, - }, - //裴秀 - xingtu: { - trigger: { player: "useCard" }, - filter: function (event, player) { - var evt = lib.skill.dcjianying.getLastUsed(player, event); - if (!evt || !evt.card) return false; - var num1 = get.number(event.card), - num2 = get.number(evt.card); - return typeof num1 == "number" && typeof num2 == "number" && num2 % num1 == 0; - }, - forced: true, - content: function () { - player.draw(); - }, - mod: { - cardUsable: function (card, player) { - if (typeof card == "object") { - var evt = lib.skill.dcjianying.getLastUsed(player); - if (!evt || !evt.card) return; - var num1 = get.number(card), - num2 = get.number(evt.card); - if (num1 === "unsure" || (typeof num1 == "number" && typeof num2 == "number" && num1 % num2 == 0)) return Infinity; - } - }, - aiOrder: function (player, card, num) { - if (typeof card == "object") { - var evt = lib.skill.dcjianying.getLastUsed(player); - if (!evt || !evt.card) return; - var num1 = get.number(card), - num2 = (num2 = get.number(evt.card)); - if (num1 === "unsure" || (typeof num1 == "number" && typeof num2 == "number" && num2 % num1 == 0)) return num + 5; - } - }, - }, - init: function (player) { - player.addSkill("xingtu_mark"); - var history = player.getAllHistory("useCard"); - if (history.length) { - var trigger = history[history.length - 1], - num = get.number(trigger.card); - player.storage.xingtu_mark = num; - player[typeof num != "number" ? "unmarkSkill" : "markSkill"]("xingtu_mark"); - } - }, - onremove: function (player) { - player.removeSkill("xingtu_mark"); - player.removeGaintag("xingtu1"); - player.removeGaintag("xingtu2"); - delete player.storage.xingtu_mark; - }, - subSkill: { - mark: { - charlotte: true, - trigger: { - player: ["useCard1", "gainAfter"], - global: "loseAsyncAfter", - }, - filter: function (event, player, name) { - if (!player.countCards("h")) return false; - return name == "useCard1" || event.getg(player).length; - }, - direct: true, - firstDo: true, - content: function () { - "step 0"; - player.removeGaintag("xingtu1"); - player.removeGaintag("xingtu2"); - if (event.triggername == "useCard1") { - var num = get.number(trigger.card, player); - player.storage.xingtu_mark = num; - player[typeof num != "number" ? "unmarkSkill" : "markSkill"]("xingtu_mark"); - if (typeof num != "number") event.finish(); - } - "step 1"; - var cards1 = [], - cards2 = [], - num = player.storage.xingtu_mark; - player.getCards("h").forEach(card => { - var numx = get.number(card, player); - if (typeof numx == "number") { - if (numx % num == 0) cards1.push(card); - if (num % numx == 0) cards2.push(card); - } - }); - player.addGaintag(cards1, "xingtu1"); - player.addGaintag(cards2, "xingtu2"); - }, - intro: { content: "上一张牌的点数:#" }, - }, - }, - }, - juezhi: { - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("he") > 1; - }, - filterCard: true, - position: "he", - selectCard: [2, Infinity], - check: function (card) { - if (ui.selected.cards.length > 1) return 0; - var player = _status.event.player; - if (player.hasSkill("xingtu") && player.storage.xingtu) { - var cards = player.getCards("he"); - var num = player.storage.xingtu, - stop = false; - for (var i = 0; i <= cards.length; i++) { - if (i != cards.length) { - var num1 = get.number(cards[i], player); - if (typeof num1 != "number") continue; - for (var j = 0; j < cards.length; j++) { - if (i == j) continue; - var num2 = get.number(cards[j], player); - if (typeof num2 != "number") continue; - var sum = num1 + num2; - if (sum % num == 0 || num % sum == 0) { - stop = true; - break; - } - } - if (stop) break; - } - } - if (i != cards.length) { - var cardx = [cards[i], cards[j]]; - if (cardx.includes(card)) return 10 - get.value(card); - } - } - return 5 - get.value(card); - }, - content: function () { - var num = 0; - for (var i of cards) num += get.number(i, player); - num = num % 13; - if (num == 0) num = 13; - var card = get.cardPile2(function (card) { - return get.number(card, false) == num; - }); - if (card) player.gain(card, "gain2"); - }, - ai: { - order: 1, - result: { player: 1 }, - }, - }, - reganlu: { - enable: "phaseUse", - usable: 1, - audio: 2, - selectTarget: 2, - delay: 0, - filterTarget: function (card, player, target) { - if (target.isMin()) return false; - if (ui.selected.targets.length == 0) return true; - if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0) return false; - return target == player || ui.selected.targets[0] == player || Math.abs(ui.selected.targets[0].countCards("e") - target.countCards("e")) <= player.maxHp - player.hp; - }, - multitarget: true, - multiline: true, - content: function () { - targets[0].swapEquip(targets[1]); - }, - ai: { - order: 10, - threaten: function (player, target) { - return 0.8 * Math.max(1 + target.maxHp - target.hp); - }, - result: { - target: function (player, target) { - var list1 = []; - var list2 = []; - var num = player.maxHp - player.hp; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (get.attitude(player, players[i]) > 0) list1.push(players[i]); - else if (get.attitude(player, players[i]) < 0) list2.push(players[i]); - } - list1.sort(function (a, b) { - return a.countCards("e") - b.countCards("e"); - }); - list2.sort(function (a, b) { - return b.countCards("e") - a.countCards("e"); - }); - var delta; - for (var i = 0; i < list1.length; i++) { - for (var j = 0; j < list2.length; j++) { - delta = list2[j].countCards("e") - list1[i].countCards("e"); - if (delta <= 0) continue; - if (delta <= num || list1[i] == player || list2[j] == player) { - if (target == list1[i] || target == list2[j]) { - return get.attitude(player, target); - } - return 0; - } - } - } - return 0; - }, - }, - }, - }, - //孙休 - mobilexingxue: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return (player.storage.mobileyanzhu ? player.maxHp : player.hp) > 0; - }, - direct: true, - content: function () { - "step 0"; - var num = player.storage.mobileyanzhu ? player.maxHp : player.hp; - player.chooseTarget([1, num], get.prompt2("mobilexingxue")).set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.countCards("he")) return att; - return att / 10; - }); - "step 1"; - if (result.bool) { - player.logSkill("mobilexingxue", result.targets); - event.targets = result.targets; - event.targets2 = event.targets.slice(0); - event.targets.sort(lib.sort.seat); - } else { - event.finish(); - } - "step 2"; - if (event.targets.length) { - var target = event.targets.shift(); - target.draw(); - event.current = target; - } else { - event.finish(); - } - "step 3"; - if (event.current && event.current.countCards("he")) { - if (!player.storage.mobileyanzhu || event.targets2.length == 1) event.current.chooseCard("选择一张牌置于牌堆顶", "he", true); - else - event.current.chooseCardTarget({ - prompt: "将一张牌置于牌堆顶,或交给其他目标角色", - filterCard: true, - position: "he", - filterTarget: function (card, player, target) { - return target != player && _status.event.getParent().targets2.includes(target); - }, - forced: true, - selectTarget: [0, 1], - ai1: card => 6 - get.value(card), - ai2: target => get.attitude(_status.event.player, target), - }); - } else { - event.goto(2); - } - "step 4"; - if (result && result.cards) { - event.card = result.cards[0]; - if (!result.targets || !result.targets.length) { - event.current.lose(result.cards, ui.cardPile, "insert"); - game.broadcastAll(function (player) { - var cardx = ui.create.card(); - cardx.classList.add("infohidden"); - cardx.classList.add("infoflip"); - player.$throw(cardx, 1000, "nobroadcast"); - }, event.current); - } else { - event.current.give(result.cards, result.targets[0]); - } - } else { - event.card = null; - } - "step 5"; - event.goto(2); - }, - derivation: "mobilexingxuex", - }, - mobileyanzhu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.countCards("hej") > 0 && target != player; - }, - content: function () { - "step 0"; - if (target.countCards("e")) { - target - .chooseBool("是否将装备区内的所有牌交给" + get.translation(player) + "?", "若选择“取消”,则其将获得你区域里的一张牌") - .set("ai", function () { - if (_status.event.effect > 0) return false; - if (_status.event.player.countCards("e") >= 3) return false; - return true; - }) - .set("effect", get.effect(target, { name: "shunshou" }, player, target)); - } else { - player.gainPlayerCard(target, true, "he"); - event.finish(); - } - "step 1"; - if (result.bool) { - var es = target.getCards("e"); - target.give(es, player, "give"); - player.removeSkills("mobileyanzhu"); - player.storage.mobileyanzhu = true; - player.popup("兴学"); - game.log(player, "修改了技能", "#g【兴学】"); - } else { - player.gainPlayerCard(target, true, "hej"); - } - }, - ai: { - order: 6, - result: { - target: function (player, target) { - var ne = target.countCards("e"), - nj = target.countCards("j"); - if (nj) return 2.5; - if (!ne) return -2; - if (ne >= 2) return -ne; - return 0; - }, - }, - }, - }, - //毛玠 - bingqing: { - audio: 2, - trigger: { player: "useCardAfter" }, - direct: true, - filter: function (event, player) { - var suit = get.suit(event.card); - if (!lib.suit.includes(suit)) return false; - var evt = event.getParent("phaseUse"); - if (!evt || player != evt.player) return false; - var list = [], - history = player.getHistory("useCard"); - if (history.length < 2) return false; - for (var i of history) { - if (i.getParent("phaseUse") != evt) continue; - var suit2 = get.suit(i.card); - if (!lib.suit.includes(suit2)) continue; - if (i != event && suit2 == suit) return false; - if (i.finished) list.add(suit2); - } - return list.length > 1 && list.length < 5; - }, - content: function () { - "step 0"; - var suit = get.suit(trigger.card); - var evt = event.getParent("phaseUse"); - var list = [], - history = player.getHistory("useCard"); - for (var i of history) { - if (i.getParent("phaseUse") != evt) continue; - var suit2 = get.suit(i.card); - if (!lib.suit.includes(suit2)) continue; - if (i.finished) list.add(suit2); - } - var prompt, filterTarget, ai; - switch (list.length) { - case 2: - prompt = "令一名角色摸两张牌"; - filterTarget = function (card, player, target) { - return true; - }; - ai = function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (target.hasSkill("nogain")) att /= 10; - return att / Math.sqrt(Math.min(5, 1 + target.countCards("h"))); - }; - break; - case 3: - prompt = "弃置一名角色区域内的一张牌"; - filterTarget = function (card, player, target) { - return target.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, target); - }, "hej"); - }; - ai = function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy" }, player, player); - }; - break; - case 4: - prompt = "对一名其他角色造成1点伤害"; - filterTarget = function (card, player, target) { - return target != player; - }; - ai = function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }; - break; - default: - event.finish(); - return; - } - event.num = list.length; - player.chooseTarget(get.prompt("bingqing"), prompt, filterTarget).set("ai", ai); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("bingqing", target); - event.target = target; - event.goto(num); - } else event.finish(); - "step 2"; - target.draw(2); - event.finish(); - "step 3"; - player.discardPlayerCard(target, true, "hej"); - event.finish(); - "step 4"; - target.damage(); - }, - }, - yingfeng: { - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("yingfeng"), "令一名角色获得“奉”标记", function (card, player, target) { - return !target.hasSkill("yingfeng_mark"); - }) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att <= 0) return 0; - var eff = 0.1; - var preTarget = game.findPlayer(function (current) { - return current != target && current.hasSkill("yingfeng_mark"); - }); - if (preTarget) { - if (get.attitude(player, preTarget) < 0) eff += 4; - else if (preTarget.hasValueTarget({ name: "sha" }, false) && !preTarget.hasValueTarget({ name: "sha" })) eff -= 3; - } - if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) eff += 3; - if (player == target) att *= 1.2; - return 0.01 + att * eff; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("yingfeng", target); - target.addAdditionalSkill("yingfeng_" + player.playerid, "yingfeng_mark"); - game.countPlayer(function (current) { - if (current != target && current.hasSkill("yingfeng_mark")) { - current.removeSkill("yingfeng_mark"); - current.removeAdditionalSkill("yingfeng_" + player.playerid); - } - }); - } - }, - subSkill: { - mark: { - charlotte: true, - mark: true, - marktext: "奉", - mod: { - targetInRange: () => true, - }, - intro: { content: "使用牌无距离限制" }, - }, - }, - }, - //猩黄忠 - spshidi: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - forced: true, - zhuanhuanji: "number", - filter: function (event, player) { - return player.countMark("spshidi") % 2 == ["phaseJieshu", "phaseZhunbei"].indexOf(event.name); - }, - content: function () { - player.changeZhuanhuanji("spshidi"); - }, - mod: { - globalFrom: function (from, to, distance) { - if (from.countMark("spshidi") % 2 == 0) return distance - 1; - }, - globalTo: function (from, to, distance) { - if (to.countMark("spshidi") % 2 == 1) return distance + 1; - }, - aiOrder: function (player, card, num) { - if (player.countMark("spshidi") % 2 == 0 && card.name == "sha" && get.color(card) == "black") return num + 0.1; - }, - }, - mark: true, - marktext: "☯", - intro: { - content: function (storage, player) { - return "已转换过" + (storage || 0) + "次"; - }, - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (!arg || !arg.card || !arg.target || arg.card.name != "sha") return false; - return player.countMark("spshidi") % 2 == 0 && get.color(arg.card) == "black"; - }, - }, - group: ["spshidi_use", "spshidi_beused"], - subSkill: { - use: { - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - return event.card.name == "sha" && player.countMark("spshidi") % 2 == 0 && get.color(event.card, false) == "black"; - }, - content: function () { - trigger.directHit.addArray(game.players); - }, - }, - beused: { - trigger: { target: "useCardToTargeted" }, - forced: true, - filter: function (event, player) { - return event.card.name == "sha" && player.countMark("spshidi") % 2 == 1 && get.color(event.card, false) == "red"; - }, - content: function () { - trigger.directHit.add(player); - }, - }, - }, - }, - spyishi: { - audio: 2, - trigger: { source: "damageBegin2" }, - filter: function (event, player) { - return player != event.player && event.player.countCards("e") > 0; - }, - check: function (event, player) { - return ( - get.damageEffect(event.player, player, player) < 0 || - (!event.player.hasSkillTag("noe") && - event.player.hasCard(function (card) { - return get.value(card) > 6; - }, "e")) - ); - }, - logTarget: "player", - content: function () { - trigger.num--; - player.gainPlayerCard(trigger.player, "e", true); - }, - }, - spqishe: { - enable: "chooseToUse", - viewAs: { name: "jiu" }, - filterCard: { type: "equip" }, - position: "hes", - viewAsFilter: function (player) { - return player.hasCard({ type: "equip" }, "ehs"); - }, - check: function (card) { - if (_status.event.type == "dying") return 1 / (get.value(card) || 0.5); - return 5 - get.value(card); - }, - locked: false, - mod: { - maxHandcard: function (player, num) { - return num + player.countCards("e"); - }, - }, - }, - //虞翻 - rezongxuan: { - inherit: "zongxuan", - group: "rezongxuan_place", - }, - rezongxuan_place: { - audio: "rezongxuan", - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - player.draw(); - "step 1"; - player.chooseCard("he", true, "将一张牌置于牌堆顶"); - "step 2"; - if (result && result.cards) { - event.card = result.cards[0]; - player.lose(result.cards, ui.cardPile, "insert"); - game.log(player, "将", get.position(event.card) == "h" ? "一张牌" : event.card, "置于牌堆顶"); - game.broadcastAll(function (player) { - var cardx = ui.create.card(); - cardx.classList.add("infohidden"); - cardx.classList.add("infoflip"); - player.$throw(cardx, 1000, "nobroadcast"); - }, player); - } else event.finish(); - }, - ai: { - order: 1, - result: { player: 1 }, - }, - }, - //孙寒华 - chongxu: { - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - player.chooseToPlayBeatmap(lib.skill.chongxu.beatmaps.randomGet()); - "step 1"; - var score = Math.floor(Math.min(5, result.accuracy / 17)); - event.score = score; - game.log(player, "的演奏评级为", "#y" + result.rank[0], ",获得积分点数", "#y" + score, "分"); - if (score < 3) { - if (score >= 2) player.draw(); - event.finish(); - return; - } - var list = []; - if (player.countMark("miaojian") < 2 && player.hasSkill("miaojian")) list.push("修改【妙剑】"); - if (player.countMark("shhlianhua") < 2 && player.hasSkill("shhlianhua")) list.push("修改【莲华】"); - if (list.length) { - list.push("全部摸牌"); - player.chooseControl(list).set("prompt", "冲虚:修改技能" + (score == 5 ? "并摸一张牌" : "") + ";或摸" + Math.floor(score / 2) + "张牌"); - } else event._result = { control: "全部摸牌" }; - "step 2"; - var score = event.score; - if (result.control != "全部摸牌") { - score -= 3; - var skill = result.control == "修改【妙剑】" ? "miaojian" : "shhlianhua"; - player.addMark(skill, 1, false); - game.log(player, "修改了技能", "#g【" + get.translation(skill) + "】"); - } - if (score > 1) player.draw(Math.floor(score / 2)); - }, - ai: { - order: 10, - result: { - player: 1, - }, - }, - beatmaps: [ - { - //歌曲名称 - name: "鳥の詩", - //歌曲文件名(默认在audio/effect文件夹下 若要重定向到扩展 请写为'ext:扩展名称/文件名'的格式) - filename: "tori_no_uta", - //每个音符的开始时间点(毫秒,相对未偏移的开始播放时间) - timeleap: [1047, 3012, 4978, 5469, 5961, 6452, 6698, 7435, 8909, 10875, 12840], - //开始播放时间的偏移量(毫秒) - current: -110, - //判定栏高度(相对整个对话框高度比例) - judgebar_height: 0.16, - //Good/Great/Prefect的位置判定范围(百分比,相对于整个对话框。以滑条的底部作为判定基准) - range1: [84, 110], - range2: [90, 104], - range3: [94, 100], - //滑条每相对于整个对话框下落1%所需的时间(毫秒) - speed: 25, - }, - { - name: "竹取飛翔 ~ Lunatic Princess", - filename: "taketori_hishou", - timeleap: [1021, 1490, 1959, 2896, 3834, 4537, 4771, 5709, 6646, 7585, 8039, 8494, 9403, 10291, 11180, 11832, 12049, 12920, 13345, 13771, 14196], - current: -110, - judgebar_height: 0.16, - range1: [84, 110], - range2: [90, 104], - range3: [94, 100], - speed: 25, - node_color: "linear-gradient(rgba(250, 170, 190, 1), rgba(240, 160, 180, 1))", - judgebar_color: "linear-gradient(rgba(240, 120, 243, 1), rgba(245, 106, 230, 1))", - }, - { - name: "ignotus", - filename: "ignotus", - //Number of tracks - //轨道数量 - number_of_tracks: 4, - //Customize the track to generate for every note (0 is the first track) - //自定义每个音符生成的轨道(0是第一个轨道) - mapping: [0, 2, 3, 1, 1, 0, 3, 0, 0, 3, 0, 0, 2, 1, 2], - //Convert from beats (0 is the first beat) to timeleap - //将节拍(0是第一拍)转换为开始时间点 - timeleap: game.generateBeatmapTimeleap(170, [0, 4, 8, 12, 14, 16, 16.5, 23.5, 24, 31, 32, 40, 45, 46, 47]), - current: -110, - judgebar_height: 0.16, - range1: [84, 110], - range2: [90, 104], - range3: [94, 100], - speed: 25, - node_color: "linear-gradient(rgba(240, 250, 240, 1), rgba(230, 240, 230, 1))", - judgebar_color: "linear-gradient(rgba(161, 59, 150, 1), rgba(58, 43, 74, 1))", - }, - { - name: "Super Mario 3D World Theme", - filename: "sm3dw_overworld", - //Random (Randomly choose tracks to generate notes each play) - //随机(每次演奏时音符会随机选择轨道生成) - mapping: "random", - timeleap: [0, 1071, 1518, 2054, 4018, 4286, 5357, 6429, 7500, 8571, 9643, 10714, 11786, 12321, 12589, 12857, 13929, 15000, 16071, 17143, 18214, 18482, 18750, 19018, 19286, 20357], - current: -110, - judgebar_height: 0.16, - range1: [84, 110], - range2: [90, 104], - range3: [94, 100], - speed: 25, - node_color: "linear-gradient(rgba(120, 130, 240, 1), rgba(100, 100, 230, 1))", - judgebar_color: "linear-gradient(rgba(230, 40, 30, 1), rgba(220, 30, 10, 1))", - }, - { - name: "只因你太美", - filename: "chicken_you_are_so_beautiful", - number_of_tracks: 7, - mapping: [3, 6, 4, 5, 6, 2, 3, 2, 1, 2, 0, 4, 3, 6, 5, 4, 3, 6, 3, 2, 3, 1, 0, 1, 2, 3, 4, 5, 6], - timeleap: game.generateBeatmapTimeleap(107, [2, 3.5, 4.5, 5.5, 6.5, 8.5, 10, 11.5, 12.5, 13.5, 14.5, 15.5, 18, 19.5, 20.5, 21.5, 22.5, 24.5, 26, 27.5, 28.5, 29.5, 30.5, 31, 31.5, 32, 32.5, 33, 33.5]), - //Hitsound file name (By default in the audio/effect folder. To redirect to the extension, please write in the format of 'ext:extension_name') - //打击音文件名(默认在audio/effect文件夹下 若要重定向到扩展 请写为'ext:扩展名称'的格式) - hitsound: "chickun.wav", - current: -110, - judgebar_height: 0.16, - range1: [84, 110], - range2: [90, 104], - range3: [94, 100], - speed: 25, - node_color: "linear-gradient(#99f, #66c)", - judgebar_color: "linear-gradient(#ccf, #99c)", - }, - { - name: "Croatian Rhapsody", - filename: "croatian_rhapsody", - mapping: [4, 1, 2, 1, 0, 0, 4, 5, 1, 3, 2, 1, 0, 0], - timeleap: game.generateBeatmapTimeleap(96, [4, 6, 8, 9, 10, 11, 12, 13.5, 14, 15.5, 16, 17, 18, 19]), - current: -110, - judgebar_height: 0.16, - range1: [84, 110], - range2: [90, 104], - range3: [94, 100], - speed: 25, - node_color: "linear-gradient(#fff, #ccc)", - judgebar_color: "linear-gradient(#fff, #ccc)", - }, - { - name: "罗刹海市", - filename: "rakshasa_sea_city", - number_of_tracks: 7, - mapping: "random", - timeleap: game.generateBeatmapTimeleap(150, [0, 2, 4, 6, 7, 9, 11, 13, 14, 16, 18, 20, 21, 23, 25, 27]), - current: -110, - judgebar_height: 0.16, - range1: [84, 110], - range2: [90, 104], - range3: [94, 100], - speed: 25, - node_color: "linear-gradient(#333, #000)", - judgebar_color: "linear-gradient(#c66, #933)", - }, - { - name: "Pigstep (Stereo Mix)", - filename: "pigstep", - number_of_tracks: 16, - timeleap: game.generateBeatmapTimeleap(170, [3, 4, 6, 6.5, 7.5, 11, 12, 14, 14.5, 15.5, 19, 20, 22, 22.5, 23.5, 27, 28, 30, 30.5, 31.5, 35, 36, 38, 38.5, 39.5, 43, 44, 46, 46.5, 47.5, 51, 52, 54, 54.5, 55.5, 59, 60, 62, 62.5]), - current: -110, - judgebar_height: 0.16, - range1: [84, 110], - range2: [90, 104], - range3: [94, 100], - speed: 25, - node_color: "linear-gradient(#066, #033)", - judgebar_color: "linear-gradient(#633, #300)", - }, - ], - derivation: "chongxu_faq", - }, - miaojian: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - var level = player.countMark("miaojian"); - if (event.filterCard({ name: "sha", nature: "stab" }, player, event)) { - if (level == 2) return true; - if ( - level == 1 && - player.hasCard(function (card) { - return get.type2(card) == "basic"; - }, "hs") - ) - return true; - if ( - level == 0 && - player.hasCard(function (card) { - return get.name(card) == "sha"; - }, "hs") - ) - return true; - } - if (event.filterCard({ name: "wuzhong" }, player, event)) { - if (level == 2) return true; - if ( - level == 1 && - player.hasCard(function (card) { - return get.type2(card) != "basic"; - }, "hes") - ) - return true; - if ( - level == 0 && - player.hasCard(function (card) { - return get.type2(card) == "trick"; - }, "hs") - ) - return true; - } - return false; - }, - chooseButton: { - dialog: function () { - return ui.create.dialog("妙剑", [ - [ - ["基本", "", "sha", "stab"], - ["锦囊", "", "wuzhong"], - ], - "vcard", - ]); - }, - filter: function (button, player) { - var event = _status.event.getParent(), - level = player.countMark("miaojian"); - if (button.link[2] == "sha") { - if (!event.filterCard({ name: "sha", nature: "stab" }, player, event)) return false; - if (level == 2) return true; - if (level == 1) - return player.hasCard(function (card) { - return get.type2(card) == "basic"; - }, "hs"); - return ( - level == 0 && - player.hasCard(function (card) { - return get.name(card) == "sha"; - }, "hs") - ); - } - if (button.link[2] == "wuzhong") { - if (!event.filterCard({ name: "wuzhong" }, player, event)) return false; - if (level == 2) return true; - if (level == 1) - return player.hasCard(function (card) { - return get.type2(card) != "basic"; - }, "hes"); - return ( - level == 0 && - player.hasCard(function (card) { - return get.type2(card) == "trick"; - }, "hs") - ); - } - }, - check: function (button) { - var card = { name: button.link[2], nature: button.link[3] }, - player = _status.event.player; - return get.value(card, player) * get.sgn(player.getUseValue(card)); - }, - backup: function (links, player) { - var index = links[0][2] == "sha" ? 0 : 1, - level = player.countMark("miaojian"); - var next = { - audio: "miaojian", - filterCard: [ - [ - function (card) { - return get.name(card) == "sha"; - }, - function (card) { - return get.type(card) == "basic"; - }, - () => false, - ], - [ - function (card) { - return get.type2(card) == "trick"; - }, - function (card) { - return get.type(card) != "basic"; - }, - () => false, - ], - ][index][level], - position: "hes", - check: function (card) { - if (card) return 6.5 - get.value(card); - return 1; - }, - viewAs: [ - { - name: "sha", - nature: "stab", - }, - { - name: "wuzhong", - }, - ][index], - }; - if (level == 2) { - next.selectCard = -1; - next.viewAs.isCard = true; - } - return next; - }, - prompt: function (links, player) { - var index = links[0][2] == "sha" ? 0 : 1, - level = player.countMark("miaojian"); - return [ - ["将一张【杀】当做刺【杀】使用", "将一张基本牌当做刺【杀】使用", "请选择刺【杀】的目标"], - ["将一张锦囊牌当做【无中生有】使用", "将一张非基本牌当做【无中生有】使用", "请选择【无中生有】的目标"], - ][index][level]; - }, - }, - onremove: true, - derivation: ["miaojian1", "miaojian2"], - subSkill: { backup: { audio: "miaojian" } }, - ai: { - order: 7, - result: { player: 1 }, - }, - }, - shhlianhua: { - audio: 2, - derivation: ["shhlianhua1", "shhlianhua2"], - trigger: { target: "useCardToTargeted" }, - forced: true, - locked: false, - filter: event => event.card.name == "sha", - content: function () { - "step 0"; - player.draw(); - var level = player.countMark("shhlianhua"); - if (!level) event.finish(); - else if (level == 2) event.goto(2); - else - player - .judge(function (result) { - return get.suit(result) == "spade" ? 1 : -1; - }) - .set("judge2", result => result.bool); - "step 1"; - if (result.bool) trigger.excluded.add(player); - event.finish(); - "step 2"; - var eff = get.effect(player, trigger.card, trigger.player, trigger.player); - trigger.player - .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(trigger.card) + "对" + get.translation(player) + "无效") - .set("ai", function (card) { - if (_status.event.eff > 0) { - return 10 - get.value(card); - } - return 0; - }) - .set("eff", eff); - "step 3"; - if (result.bool == false) { - trigger.getParent().excluded.add(player); - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (card.name == "sha" && current < 0) return 0.7; - }, - }, - }, - }, - //阎圃 - huantu: { - audio: 2, - trigger: { global: "phaseDrawBefore" }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0 && !player.hasSkill("huantu_round") && player.inRange(event.player); - }, - checkx: function (event, player) { - var target = event.player; - return get.attitude(player, target) > 0 && (target.hasSkill("pingkou") || target.skipList.includes("phaseUse") || (target.isDamaged() && target.hp <= 2) || target.needsToDiscard()); - }, - content: function () { - "step 0"; - player - .chooseCard(get.prompt("huantu", trigger.player), "交给其一张牌并令其暂时跳过摸牌阶段", "he") - .set("ai", function (card) { - if (!_status.event.checkx) return 0; - return 1 + Math.random(); - }) - .set("checkx", lib.skill.huantu.checkx(trigger, player)); - "step 1"; - if (result.bool) { - player.addTempSkill("huantu_round", "roundStart"); - player.logSkill("huantu", trigger.player); - player.give(result.cards, trigger.player); - trigger.cancel(); - player.addTempSkill("huantu_effect"); - } - }, - subSkill: { - round: { - charlotte: true, - mark: true, - intro: { content: "本轮已发动" }, - }, - effect: { - audio: "huantu", - trigger: { global: "phaseJieshuBegin" }, - forced: true, - charlotte: true, - logTarget: "player", - filter: function (event, player) { - return event.player.isIn(); - }, - content: function () { - "step 0"; - var str = get.translation(trigger.player); - player - .chooseControl() - .set("choiceList", ["令" + str + "回复1点体力并摸两张牌", "摸三张牌,然后交给" + str + "两张手牌"]) - .set("choice", trigger.player.isDamaged() ? 0 : 1); - "step 1"; - if (result.index == 0) { - trigger.player.recover(); - trigger.player.draw(2); - event.finish(); - } else { - event.target = trigger.player; - player.draw(3); - } - "step 2"; - var hs = player.getCards("h"); - if (hs.length && target.isIn() && player.isIn()) { - if (hs.length <= 2) event._result = { bool: true, cards: hs }; - else player.chooseCard("h", 2, true, "交给" + get.translation(target) + "两张手牌"); - } else event.finish(); - "step 3"; - if (result.bool) player.give(result.cards, trigger.player); - }, - }, - }, - }, - bihuo: { - trigger: { global: "dyingAfter" }, - logTarget: "player", - limited: true, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return event.player.isIn(); - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - content: function () { - player.awakenSkill("bihuo"); - trigger.player.draw(3); - trigger.player.addTempSkill("bihuo_effect", "roundStart"); - trigger.player.addMark("bihuo_effect", game.countPlayer(), false); - }, - subSkill: { - effect: { - onremove: true, - charlotte: true, - mod: { - globalTo: function (from, to, distance) { - return distance + to.countMark("bihuo_effect"); - }, - }, - intro: { content: "其他角色至你的距离+#" }, - }, - }, - }, - //马元义 - jibing: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - filter: function (event, player) { - return player.getExpansions("jibing").length > 0 && (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) || event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)); - }, - chooseButton: { - dialog: function (event, player) { - var dialog = ui.create.dialog("集兵", "hidden"); - if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) { - dialog._chooseButton = 2; - var list = ["sha", "shan"]; - dialog.add([ - list.map(i => { - return [i, get.translation(i)]; - }), - "tdnodes", - ]); - } else dialog._cardName = event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) ? "sha" : "shan"; - dialog.add(player.getExpansions("jibing")); - return dialog; - }, - filter: function (button) { - var evt = _status.event, - player = _status.event.player; - if (evt.dialog) { - if (!evt.dialog._chooseButton) { - var evt2 = _status.event.getParent(); - return evt2.filterCard(get.autoViewAs({ name: evt.dialog._cardName }, [button.link]), player, evt2); - } - if (ui.selected.buttons.length) { - var str = ui.selected.buttons[0].link; - if (typeof str != "string" || typeof button.link == "string") return false; - var evt2 = _status.event.getParent(); - return evt2.filterCard(get.autoViewAs({ name: str }, [button.link]), player, evt2); - } - return typeof button.link == "string"; - } - return false; - }, - select: function () { - return _status.event.dialog ? _status.event.dialog._chooseButton || 1 : 1; - }, - backup: function (links, player) { - var card, name; - if (links.length == 2) { - name = links[0]; - card = links[1]; - } else { - card = links[0]; - var event = _status.event; - name = event.filterCard(get.autoViewAs({ name: "sha" }, [card]), player, event) ? "sha" : "shan"; - } - return { - audio: "jibing", - filterCard: function (card) { - return card == lib.skill.jibing_backup.card; - }, - selectCard: -1, - position: "x", - viewAs: { name: name }, - card: card, - }; - }, - prompt: function (links, player) { - return "请选择【杀】的目标"; - }, - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - return player.getExpansions("jibing").length > 0; - }, - order: function (item, player) { - if (player.hasSkill("binghuo")) return 6; - return 1; - }, - result: { - player: 1, - }, - }, - group: "jibing_place", - subSkill: { - place: { - audio: "jibing", - trigger: { player: "phaseDrawBegin1" }, - prompt2: "摸牌阶段开始时,若你的“兵”数小于势力数,则你可以改为将牌堆顶的两张牌置于你的武将牌上,称为“兵”。", - filter: function (event, player) { - return !event.numFixed && player.getExpansions("jibing").length < game.countGroup(); - }, - content: function () { - trigger.changeToZero(); - var cards = get.cards(2); - player.addToExpansion(cards, "gain2").gaintag.add("jibing"); - }, - }, - backup: { audio: "jibing" }, - }, - intro: { content: "expansion", markcount: "expansion" }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - }, - wangjing: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - filter: function (event, player) { - if (event.skill != "jibing_backup") return false; - var target = lib.skill.wangjing.logTarget(event, player); - return target && target.isMaxHp(); - }, - logTarget: function (event, player) { - if (event.name == "respond") return event.source; - if (event.card.name == "sha") return event.targets[0]; - return event.respondTo[0]; - }, - forced: true, - content: function () { - player.draw(); - }, - ai: { - combo: "jibing", - mingzhi: false, - effect: { - target: function (card, player, target, current) { - if ((get.tag(card, "respondShan") || get.tag(card, "respondSha")) && target.getExpansions("jibing").length > 0 && player.isMaxHp()) { - if (get.attitude(target, player) <= 0) { - return [0, 0, 1, 0.3]; - } - } - }, - }, - }, - }, - moucuan: { - audio: 2, - derivation: "binghuo", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "metal", - filter: function (event, player) { - return player.getExpansions("jibing").length >= game.countGroup(); - }, - content: function () { - player.awakenSkill("moucuan"); - player.loseMaxHp(); - player.addSkills("binghuo"); - }, - ai: { combo: "jibing" }, - }, - binghuo: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return ( - player.hasHistory("useCard", function (evt) { - return evt.skill == "jibing_backup"; - }) || - player.hasHistory("respond", function (evt) { - return evt.skill == "jibing_backup"; - }) - ); - }, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("binghuo")).set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("binghuo", target); - target.judge(function (card) { - if (get.color(card) == "black") return -2; - return 0.1; - }).judge2 = function (result) { - return result.bool === false ? true : false; - }; - } else event.finish(); - "step 2"; - if (result.bool == false) target.damage("thunder"); - }, - ai: { combo: "jibing", expose: 0.2 }, - }, - //司马孚 - xunde: { - audio: 2, - trigger: { global: "damageEnd" }, - filter: function (event, player) { - return event.player.isIn() && get.distance(player, event.player) <= 1; - }, - logTarget: "player", - check: function (event, player) { - return get.attitude(player, event.player) > 0 && (!event.source || get.attitude(player, event.source) < 0); - }, - content: function () { - "step 0"; - player.judge().set("callback", function () { - if (event.judgeResult.number > 5) { - var player = event.getParent(2)._trigger.player; - if (get.position(card, true) == "o") player.gain(card, "gain2"); - } - }); - "step 1"; - if (result.number < 7) { - var source = trigger.source; - if (source && source.isIn() && source.countCards("h") > 0) { - player.line(source); - source.chooseToDiscard("h", true); - } - } - }, - }, - chenjie: { - audio: 2, - trigger: { global: "judge" }, - filter: function (event, player) { - var suit = get.suit(event.player.judging[0], event.player); - return ( - player.countCards("hes", function (card) { - if (_status.connectMode && get.position(card) != "e") return true; - return get.suit(card) == suit; - }) > 0 - ); - }, - direct: true, - preHidden: true, - content: function () { - "step 0"; - var suit = get.suit(trigger.player.judging[0], trigger.player); - player - .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("chenjie"), "hes", function (card) { - if (get.suit(card) != _status.event.suit) return false; - var player = _status.event.player; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - }) - .set("ai", function (card) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0.1; - if (attitude > 0) { - return result + 0.01; - } else { - return 0.01 - result; - } - }) - .set("judging", trigger.player.judging[0]) - .set("suit", suit) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - event.card = result.cards[0]; - player.respond(result.cards, "highlight", "chenjie", "noOrdering"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = card; - trigger.orderingCards.add(card); - game.log(trigger.player, "的判定牌改为", card); - player.draw(2); - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 0.1, - }, - }, - }, - //傅佥 - jueyong: { - audio: 2, - trigger: { target: "useCardToTarget" }, - forced: true, - filter: function (event, player) { - return event.card.name != "jiu" && event.card.name != "tao" && event.targets.length == 1 && event.card.isCard && event.cards.length == 1 && event.getParent(2).name != "jueyong_timeout" && get.position(event.cards[0], true) == "o" && event.card.name == event.cards[0].name && (!player.storage.jueyong || player.storage.jueyong[0].length < player.getHp()); - }, - content: function () { - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - trigger.untrigger(); - var card = trigger.cards[0]; - player.addToExpansion(card, "gain2").gaintag.add("jueyong"); - if (!player.storage.jueyong) player.storage.jueyong = [[], []]; - player.storage.jueyong[0].push(card); - player.storage.jueyong[1].push(trigger.player); - game.delayx(); - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - delete player.storage[skill]; - }, - intro: { - markcount: function (storage) { - if (!storage) return 0; - return storage[0].length; - }, - mark: function (dialog, storage, player) { - if (!storage) return; - dialog.addAuto(storage[0]); - dialog.addText(get.translation(storage[1])); - }, - onunmark: function (storage, player) { - player.storage.jueyong = [[], []]; - }, - }, - ai: { - reverseEquip: true, - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "equip" && !get.tag(card, "gifts") && target.storage.jueyong && target.storage.jueyong[1].length) { - var result1 = get.equipResult(player, target, card.name), - subtype = get.subtype(card); - for (var i of target.storage.jueyong[0]) { - if (get.subtype(i, false) == subtype && get.equipResult(target, target, i.name) >= result1) return "zerotarget"; - } - } - }, - }, - }, - group: "jueyong_timeout", - subSkill: { - timeout: { - audio: "jueyong", - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return player.storage.jueyong && player.storage.jueyong[0].length > 0; //=Math.max(1,player.getDamagedHp()); - }, - content: function () { - var list = player.storage.jueyong, - card = list[0].shift(), - source = list[1].shift(); - if (player.getExpansions("jueyong").includes(card)) { - if (source && source.isIn() && source.canUse(card, player, false)) source.useCard(card, player, false); - else player.loseToDiscardpile(card); - } - if (list[0].length) event.redo(); - }, - }, - }, - }, - poxiang: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: (event, player) => player.countCards("he") > 0, - filterCard: true, - filterTarget: lib.filter.notMe, - position: "he", - discard: false, - lose: false, - delay: false, - check: function (card) { - var player = _status.event.player; - if ( - !player.storage.jueyong || - !player.storage.jueyong[0].length || - (player.hp <= 1 && - !player.storage.jueyong[0].some(function (card) { - return get.tag(card, "damage") > 0; - })) || - !player.storage.jueyong[0].some(function (card) { - return get.effect(player, card, player.storage.jueyong[1][player.storage.jueyong[0].indexOf(card)], player) < 0; - }) - ) - return -1; - return 20 - get.value(card); - }, - content: function () { - "step 0"; - player.give(cards, target); - player.draw(3).gaintag = ["poxiang"]; - player.addTempSkill("poxiang_mark"); - "step 1"; - var cards = player.getExpansions("jueyong"); - if (cards.length) player.loseToDiscardpile(cards); - player.unmarkSkill("jueyong"); - player.loseHp(); - "step 2"; - //player.skip('phaseDiscard'); - game.delayx(); - }, - ai: { - order: 12, - result: { - player: 4, - target: 1, - }, - }, - subSkill: { - mark: { - charlotte: true, - onremove: function (player) { - player.removeGaintag("poxiang"); - }, - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("poxiang")) { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("poxiang")) { - return false; - } - }, - }, - }, - }, - }, - //曹真 - disordersidi: { audio: 2 }, - discretesidi: { - audio: "disordersidi", - trigger: { player: "useCardAfter" }, - direct: true, - filter: function (event, player) { - return ( - get.type(event.card, false) != "delay" && - game.hasPlayer(function (current) { - return player != current && (!player.storage.discretesidi || !player.storage.discretesidi.includes(current)); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("discretesidi"), "选择两名角色a,b建立二元序偶,或仅选择一名角色,建立二元序偶", [1, 2], function (card, player, target) { - if (ui.selected.targets.length) return true; - return target != player && (!player.storage.discretesidi || !player.storage.discretesidi.includes(target)); - }) - .set("complexTarget", true) - .set("complexSelect", true) - .set("targetprompt", ["第一元素", "第二元素"]) - .set("ai", function (target) { - var player = _status.event.player; - if (!ui.selected.targets.length) { - if (target.getEnemies().length == 1) return 2 + Math.random(); - return 1 + Math.random(); - } - var targetx = ui.selected.targets[0]; - if (targetx.getEnemies().includes(target) && targetx.inRange(target)) return Math.random() - 0.5; - return 0; - }).animate = false; - "step 1"; - if (result.bool && result.targets.length) { - var targets = result.targets; - player.logSkill("discretesidi", targets[0]); - if (targets.length == 1) targets.push(targets[0]); - if (!player.storage.discretesidi) player.storage.discretesidi = []; - if (!player.storage.discretesidi2) player.storage.discretesidi2 = []; - player.storage.discretesidi.push(targets[0]); - player.storage.discretesidi2.push(targets[1]); - player.markSkill("discretesidi"); - game.delayx(); - } - }, - intro: { - content: function (storage, player) { - if ((player == game.me || player.isUnderControl()) && !game.observe) { - var str = "R={ "; - for (var i = 0; i < storage.length; i++) { - str += "<" + get.translation(storage[i]) + ", " + get.translation(player.storage.discretesidi2[i]) + ">"; - if (i < storage.length - 1) str += ", "; - } - str += " }"; - return str; - } - return "已指定" + get.translation(storage) + "为目标"; - }, - }, - onremove: function (player) { - delete player.storage.discretesidi; - delete player.storage.discretesidi2; - }, - group: ["discretesidi_clear", "discretesidi_exec"], - subSkill: { - clear: { - trigger: { global: ["useCardToPlayered", "die"] }, - forced: true, - popup: false, - locked: false, - filter: function (event, player) { - if (!player.storage.discretesidi || !player.storage.discretesidi.includes(event.player)) return false; - if (event.name == "die") return true; - if (get.type(event.card, false) != "delay") { - var index = player.storage.discretesidi.indexOf(event.player); - return index != -1 && (player.storage.discretesidi2[index] != event.target || event.targets.length != 1); - } - return false; - }, - content: function () { - player.storage.discretesidi2.splice(player.storage.discretesidi.indexOf(trigger.player), 1); - player.unmarkAuto("discretesidi", [trigger.player]); - }, - }, - exec: { - audio: "disordersidi", - trigger: { global: "useCardToPlayered" }, - forced: true, - locked: false, - filter: function (event, player) { - if (get.type(event.card, false) == "delay" || !player.storage.discretesidi || event.targets.length != 1) return false; - var index = player.storage.discretesidi.indexOf(event.player); - return index != -1 && player.storage.discretesidi2[index] == event.target; - }, - logTarget: "player", - content: function () { - "step 0"; - player.storage.discretesidi2.splice(player.storage.discretesidi.indexOf(trigger.player), 1); - player.unmarkAuto("discretesidi", [trigger.player]); - if (trigger.target == player) { - player.draw(); - event.finish(); - return; - } - var target = trigger.player; - event.target = target; - player - .chooseControl("cancel2") - .set("choiceList", ["取消" + get.translation(trigger.card) + "的所有目标并对" + get.translation(target) + "造成1点伤害", "摸两张牌"]) - .set("ai", function () { - var player = _status.event.player, - evt = _status.event.getTrigger(); - if (get.damageEffect(evt.player, player, player) > 0 && get.effect(evt.target, evt.card, evt.player, player) < 0) return 0; - return 1; - }); - "step 1"; - if (result.index == 0) { - trigger.cancel(); - trigger.targets.length = 0; - trigger.getParent().triggeredTargets1.length = 0; - if (!_status.dying.length) target.damage(); - } else if (result.index == 1) player.draw(2); - }, - }, - }, - }, - //孙鲁班 - xinzenhui: { - audio: 2, - trigger: { player: "useCardToPlayer" }, - filter: function (event, player) { - if (event.targets.length != 1) return false; - var card = event.card; - if (card.name != "sha" && (get.type(card, null, false) != "trick" || get.color(card, false) != "black")) return false; - if (!player.isPhaseUsing() || player.hasSkill("xinzenhui2")) return false; - return game.hasPlayer(function (current) { - return current != player && current != event.target && lib.filter.targetEnabled2(card, player, current) && lib.filter.targetInRange(card, player, current); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("xinzenhui"), function (card, player, target) { - if (player == target) return false; - var evt = _status.event.getTrigger(); - return !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return Math.max(target.countGainableCards(player, "he") ? get.effect(target, { name: "shunshou_copy2" }, player, player) : 0, get.effect(target, trigger.card, player, player)); - }); - "step 1"; - if (result.bool) { - player.addTempSkill("xinzenhui2", "phaseUseAfter"); - var target = result.targets[0], - str = get.translation(target); - event.target = target; - player.logSkill("xinzenhui", target); - if (!target.countGainableCards(player, "he")) event._result = { index: 0 }; - else - player - .chooseControl() - .set("choiceList", ["令" + str + "也成为" + get.translation(trigger.card) + "的目标", "获得" + str + "的一张牌,然后其成为" + get.translation(trigger.card) + "的使用者"]) - .set("ai", function () { - var trigger = _status.event.getTrigger(); - var player = _status.event.player, - target = _status.event.getParent().target; - return (target.countGainableCards(player, "he") ? get.effect(target, { name: "shunshou_copy2" }, player, player) : 0) > get.effect(target, trigger.card, player, player) ? 1 : 0; - }); - } else event.finish(); - "step 2"; - if (result.index == 1) { - trigger.untrigger(); - trigger.getParent().player = event.target; - game.log(event.target, "成为了", trigger.card, "的使用者"); - player.gainPlayerCard(target, true, "he"); - } else { - game.log(event.target, "成为了", trigger.card, "的额外目标"); - trigger.getParent().targets.push(event.target); - } - }, - }, - xinzenhui2: {}, - xinjiaojin: { - audio: 2, - trigger: { player: "damageBegin4" }, - filter: function (event, player) { - return player.countCards("he", { type: "equip" }) && event.source && event.source.hasSex("male"); - }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseToDiscard("he", "骄矜:是否弃置一张装备牌防止伤害?", function (card, player) { - return get.type(card) == "equip"; - }); - next.set("ai", function (card) { - var player = _status.event.player; - if (player.hp == 1 || _status.event.getTrigger().num > 1) { - return 9 - get.value(card); - } - if (player.hp == 2) { - return 8 - get.value(card); - } - return 7 - get.value(card); - }); - next.logSkill = "xinjiaojin"; - "step 1"; - if (result.bool) { - game.delay(0.5); - trigger.cancel(); - } - }, - }, - //新华歆 - yuanqing: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - forced: true, - filter: function (event, player) { - return player.hasHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == event; - }); - }, - content: function () { - var map = {}, - cards = []; - player.getHistory("useCard", function (evt) { - if (evt.getParent("phaseUse") == trigger) { - var type = get.type2(evt.card, false); - if (!map[type]) map[type] = []; - } - }); - for (var i = 0; i < ui.discardPile.childNodes.length; i++) { - var card = ui.discardPile.childNodes[i], - type = get.type2(card, false); - if (map[type]) map[type].push(card); - } - for (var i in map) { - if (map[i].length) cards.push(map[i].randomGet()); - } - if (cards.length) { - player.$gain2(cards, false); - game.cardsGotoSpecial(cards, "toRenku"); - game.log(player, "将", cards, "置入了仁库"); - game.delayx(); - } - }, - init: function (player) { - player.storage.renku = true; - }, - }, - shuchen: { - audio: 2, - init: function (player) { - player.storage.renku = true; - }, - trigger: { global: "dying" }, - forced: true, - filter: function (event, player) { - return _status.renku.length > 3; - }, - logTarget: "player", - content: function () { - player.gain(_status.renku, "gain2", "fromRenku"); - _status.renku.length = 0; - game.updateRenku(); - trigger.player.recover(); - }, - }, - //谯周 - zhiming: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "phaseDiscardEnd"] }, - frequent: true, - content: function () { - "step 0"; - player.draw(); - "step 1"; - if (player.countCards("he") > 0) { - var next = player.chooseCard("he", "是否将一张牌置于牌堆顶?"); - if (trigger.name == "phaseZhunbei") { - next.set("ai", function (card) { - var player = _status.event.player, - js = player.getCards("j"); - if (js.length) { - var judge = get.judge(js[0]); - if (judge && judge(card) >= 0) return 20 - get.value(card); - } - return 0; - }); - } else - next.set("ai", function (card) { - var player = _status.event.player, - js = player.next.getCards("j"); - if (js.length) { - var judge = get.judge(js[0]); - if (judge && (judge(card) + 0.01) * get.attitude(player, player.next) > 0) return 20 - get.value(card); - } - return 0; - }); - } else event.finish(); - "step 2"; - if (result.bool) { - player.$throw(get.position(result.cards[0]) == "e" ? result.cards[0] : 1, 1000); - game.log(player, "将", get.position(result.cards[0]) == "e" ? result.cards[0] : "#y一张手牌", "置于了牌堆顶"); - player.lose(result.cards, ui.cardPile, "insert"); - } else event.finish(); - "step 3"; - game.updateRoundNumber(); - game.delayx(); - }, - ai: { guanxing: true }, - }, - xingbu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - prompt2: "亮出牌堆顶的三张牌,并可以根据其中红色牌的数量,令一名其他角色获得一种效果", - content: function () { - "step 0"; - var cards = get.cards(3); - //for(var i=cards.length-1;i--;i>=0){ - // ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); - //} - game.updateRoundNumber(); - event.cards = cards; - //game.cardsGotoOrdering(cards); - player.showCards(cards, get.translation(player) + "发动了【星卜】"); - "step 1"; - var num = 0; - for (var i of cards) { - if (get.color(i, false) == "red") num++; - } - player.chooseTarget("是否选择一名其他角色获得星卜效果(" + get.cnNumber(num) + "张)?", lib.filter.notMe).set("ai", function (target) { - var player = _status.event.player, - num = _status.event.getParent().num; - var att = get.attitude(player, target); - if (num < 3) att *= -1; - if (num == 2 && target.hasJudge("lebu")) att *= -1.4; - return att; - }); - if (num == 0) num = 1; - event.num = num; - "step 2"; - if (result.bool) { - var skill = "xingbu_effect" + num, - target = result.targets[0]; - player.line(target, "green"); - game.log(player, "选择了", target); - target.addTempSkill(skill, { player: "phaseEnd" }); - target.addMark(skill, 1, false); - game.delayx(); - } - }, - subSkill: { - effect1: { - charlotte: true, - onremove: true, - intro: { content: "准备阶段开始时弃置#张手牌" }, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - player.chooseToDiscard("h", true, player.countMark("xingbu_effect1")); - }, - }, - effect2: { - charlotte: true, - onremove: true, - intro: { content: "使用【杀】的次数上限-#,跳过弃牌阶段" }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num - player.countMark("xingbu_effect2"); - }, - }, - trigger: { player: "phaseDiscardBegin" }, - forced: true, - content: function () { - trigger.cancel(); - }, - }, - effect3: { - charlotte: true, - onremove: true, - intro: { content: "摸牌阶段多摸2*#张牌,使用【杀】的次数上限+#。" }, - trigger: { player: ["phaseDrawBegin2"] }, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - if (trigger.name == "phaseDraw") trigger.num += player.countMark("xingbu_effect3") * 2; - }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("xingbu_effect3"); - }, - }, - }, - }, - }, - //顾雍 - xinshenxing: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return (player.getStat("skill").xinshenxing || 0) < player.hp && player.countCards("he") > 1; - }, - selectCard: 2, - position: "he", - check: function (card) { - if (!ui.selected.cards.length || get.color(card) != get.color(ui.selected.cards[0])) return 6.5 - get.value(card); - return 6.5 - get.value(card) - get.value(ui.selected.cards[0]); - }, - filterCard: true, - content: function () { - player.draw(get.color(cards) == "none" ? 2 : 1); - }, - ai: { - order: 1, - result: { player: 1 }, - }, - }, - xinbingyi: { - audio: "bingyi", - audioname: ["xin_guyong"], - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterx: function (event, player) { - var cards = player.getCards("h"); - if (cards.length == 1) return true; - var color = get.color(cards[0], player), - type = get.type2(cards[0], player); - for (var i = 1; i < cards.length; i++) { - if (color && get.color(cards[i], player) != color) color = false; - if (type && get.type2(cards[i], player) != type) type = false; - if (!color && !type) return false; - } - return true; - }, - direct: true, - content: function () { - "step 0"; - if (lib.skill.xinbingyi.filterx(trigger, player)) { - player - .chooseTarget(get.prompt("xinbingyi"), "展示所有手牌,并选择至多" + get.cnNumber(player.countCards("h")) + "名角色各摸一张牌", [0, player.countCards("h")], function (card, player, target) { - return true; - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - } else - player.chooseBool(get.prompt("bingyi"), "展示所有手牌").ai = function () { - return false; - }; - "step 1"; - if (result.bool) { - player.logSkill("xinbingyi"); - player.showHandcards(get.translation(player) + "发动了【秉壹】"); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (targets && targets.length) { - player.line(targets, "green"); - targets.sortBySeat(); - game.asyncDraw(targets); - } - }, - ai: { - expose: 0.1, - }, - }, - //钟会 - requanji: { - audio: 2, - trigger: { player: ["damageEnd", "phaseUseEnd"] }, - frequent: true, - locked: false, - notemp: true, - filter: function (event, player) { - if (event.name == "phaseUse") return player.countCards("h") > player.hp; - return event.num > 0; - }, - content: function () { - "step 0"; - event.count = trigger.num || 1; - "step 1"; - event.count--; - player.draw(); - "step 2"; - if (player.countCards("h")) { - player.chooseCard("将一张手牌置于武将牌上作为“权”", true); - } else { - event.goto(4); - } - "step 3"; - if (result.cards && result.cards.length) { - player.addToExpansion(result.cards, player, "give").gaintag.add("quanji"); - } - "step 4"; - if (event.count > 0 && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { - player.chooseBool(get.prompt2("requanji")).set("frequentSkill", event.name); - } else event.finish(); - "step 5"; - if (result.bool) { - player.logSkill("requanji"); - event.goto(1); - } - }, - mod: { - maxHandcard(player, num) { - return num + player.getExpansions("quanji").length; - }, - aiOrder(player, card, num) { - if (num <= 0 || typeof card !== "object" || !player.isPhaseUsing() || !player.hasSkill("zili") || player.needsToDiscard()) return num; - if (player.getExpansions("quanji").length < 3 && player.getUseValue(card) < Math.min(4, (player.hp * player.hp) / 4)) return 0; - }, - }, - onremove: function (player, skill) { - var cards = player.getExpansions("quanji"); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { - maixie: true, - maixie_hp: true, - threaten: 0.8, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; - if (!target.hasSkill("paiyi") && target.hp > 1) return [0.5, get.tag(card, "damage") * 1.5]; - if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5]; - if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; - } - }, - }, - }, - }, - //蔡夫人 - xinqieting: { - audio: 2, - trigger: { global: "phaseEnd" }, - direct: true, - filter: function (event, player) { - return ( - player != event.player && - event.player.getHistory("sourceDamage", function (evt) { - return evt.player != event.player; - }).length == 0 - ); - }, - content: function () { - "step 0"; - var list = ["摸一张牌"], - target = trigger.player, - str = get.translation(target); - event.target = target; - event.addIndex = 0; - if (target.countCards("h") > 0) list.push("观看" + str + "的两张手牌并获得其中一张"); - else event.addIndex++; - if ( - target.countCards("e", function (card) { - return player.canEquip(card); - }) > 0 - ) - list.push("将" + str + "装备区内的一张牌移动至自己的装备区"); - player - .chooseControl("cancel2") - .set("choiceList", list) - .set("prompt", get.prompt("xinqieting", target)) - .set("ai", function () { - var evt = _status.event.getParent(); - if (get.attitude(evt.player, evt.target) > 0) return 0; - var val = evt.target.hasSkillTag("noe") ? 6 : 0; - if ( - evt.target.countCards("e", function (card) { - return evt.player.canEquip(card) && get.value(card, evt.target) > val && get.effect(evt.player, card, evt.player, evt.player) > 0; - }) > 0 - ) - return 2 - evt.addIndex; - if (evt.target.countCards("h") > 0) return 1; - return 0; - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("xinqieting", target); - if (result.index == 0) { - player.draw(); - event.finish(); - } else if (result.index + event.addIndex == 1) { - player.choosePlayerCard(target, "h", 2, true); - player.addExpose(0.2); - event.goto(3); - } else { - player.addExpose(0.1); - player - .choosePlayerCard(target, "e", true) - .set("filterButton", function (button) { - return _status.event.player.canEquip(button.link); - }) - .set("ai", function (button) { - var player = _status.event.player; - return get.effect(player, button.link, player, player); - }); - } - } else event.finish(); - "step 2"; - if (result.bool) { - var card = result.cards[0]; - target.$give(card, player, false); - game.delay(0.5); - player.equip(card); - } - event.finish(); - "step 3"; - if (result.bool) player.chooseButton(["选择获得一张牌", result.cards], true); - else event.finish(); - "step 4"; - if (result.bool) { - var card = result.links[0]; - if (lib.filter.canBeGained(card, player, target)) player.gain(card, target, "giveAuto", "bySelf"); - else game.log("但", card, "不能被", player, "获得!"); - } - }, - }, - mobilezhongyong: { - audio: 2, - trigger: { player: "useCardAfter" }, - direct: true, - filter: function (event, player) { - if (event.card.name != "sha" || !event.isPhaseUsing(player)) return false; - if (event.cards.filterInD().length > 0) return true; - var list = lib.skill.mobilezhongyong.getResponds(event); - if (list.length) { - for (var evt of list) { - if (evt.cards.filterInD("od").length > 0) return true; - } - } - return false; - }, - getResponds: function (event) { - var list = []; - for (var i of event.targets) { - list.addArray( - i.getHistory("useCard", function (evt) { - return evt.card.name == "shan" && evt.respondTo && evt.respondTo[1] == event.card; - }) - ); - } - return list; - }, - content: function () { - "step 0"; - event.shas = trigger.cards.filterInD(); - var list = lib.skill.mobilezhongyong.getResponds(trigger); - if (list.length) { - event.shans = []; - for (var evt of list) { - event.shans.addArray(evt.cards.filterInD("od")); - } - event.goto(2); - } else - player.chooseBool(get.prompt("mobilezhongyong"), "获得" + get.translation(event.shas)).set("ai", function () { - var evt = _status.event.getParent(); - return get.value(evt.shas, evt.player) > 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("mobilezhongyong"); - player.addTempSkill("mobilezhongyong_buff"); - player.gain(event.shas, "gain2").gaintag.add("mobilezhongyong"); - } - event.finish(); - "step 2"; - var shans = get.translation(event.shans), - choiceList = ["获得" + shans]; - if ( - game.hasPlayer(function (current) { - return current != player && !trigger.targets.includes(current); - }) - ) { - if (event.shas.length) choiceList[0] += ",然后可以令另一名其他角色获得" + get.translation(event.shas); - choiceList.push("令另一名其他角色获得" + shans + ",然后你于本回合内使用【杀】的次数上限+1且下一张【杀】的伤害值基数+1"); - } - player - .chooseControl("cancel2") - .set("choiceList", choiceList) - .set("prompt", get.prompt("mobilezhongyong")) - .set("ai", function () { - var evt = _status.event.getParent(), - player = evt.player, - tri = _status.event.getTrigger(); - if ( - game.hasPlayer(function (current) { - return current != player && !tri.targets.includes(current) && get.attitude(player, current) > 0; - }) && - player.countCards("hs", function (card) { - return get.name(card) == "sha" && player.hasValueTarget(card); - }) > player.getCardUsable({ name: "sha" }) - ) - return 1; - return 0; - }); - "step 3"; - if (result.index == 0) { - player.logSkill("mobilezhongyong"); - player.addTempSkill("mobilezhongyong_buff"); - player.gain(event.shans, "gain2").gaintag.add("mobilezhongyong"); - } else event.goto(6); - "step 4"; - event.shas = event.shas.filterInD("od"); - if ( - event.shas.length && - game.hasPlayer(function (current) { - return current != player && !trigger.targets.includes(current); - }) - ) { - player - .chooseTarget("是否令一名其他角色获得" + get.translation(event.shas) + "?", function (card, player, target) { - return target != player && !_status.event.getTrigger().targets.includes(target); - }) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att <= 0) return att; - if (target.hasSkillTag("nogain")) return att / 10; - if (!target.hasSha()) return 2 * att; - return att; - }); - } else event.finish(); - "step 5"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.gain(event.shas, "gain2"); - } - event.finish(); - "step 6"; - player - .chooseTarget("令一名其他角色获得" + get.translation(event.shans), true, function (card, player, target) { - return target != player && !_status.event.getTrigger().targets.includes(target); - }) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att <= 0) return att; - if (target.hasSkillTag("nogain")) return att / 10; - if (!target.hasShan()) return 2 * att; - return att; - }); - "step 7"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("mobilezhongyong", target); - target.gain(event.shans, "gain2"); - player.addTempSkill("mobilezhongyong_buff"); - player.addMark("mobilezhongyong_buff", 1, false); - player.addMark("mobilezhongyong_damage", 1, false); - } - }, - subSkill: { - buff: { - mod: { - cardEnabled2: function (card, player) { - if (get.itemtype(card) == "card" && card.hasGaintag("mobilezhongyong")) return false; - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("mobilezhongyong_buff"); - }, - }, - trigger: { player: "useCard1" }, - firstDo: true, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player) { - return event.card.name == "sha" && player.countMark("mobilezhongyong_damage") > 0; - }, - content: function () { - trigger.baseDamage += player.storage.mobilezhongyong_damage; - delete player.storage.mobilezhongyong_damage; - }, - onremove: function (player) { - delete player.storage.mobilezhongyong_buff; - delete player.storage.mobilezhongyong_damage; - player.removeGaintag("mobilezhongyong"); - }, - }, - }, - }, - rejieyue: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: get.prompt2("rejieyue"), - filterCard: true, - position: "he", - filterTarget: lib.filter.notMe, - ai1: function (card) { - var player = _status.event.player; - if (get.name(card) == "du") return 20; - if (get.position(card) == "e" && get.value(card) <= 0) return 14; - if ( - get.position(card) == "h" && - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0 && current.getUseValue(card) > player.getUseValue(card) && current.getUseValue(card) > player.getUseValue(card); - }) - ) - return 12; - if ( - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0; - }) - ) { - if (card.name == "wuxie") return 11; - if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; - } - return 6 / Math.max(1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player; - var card = ui.selected.cards[0]; - var att = get.attitude(player, target); - if (card.name == "du") return -6 * att; - if (att > 0) { - if (get.position(card) == "h" && target.getUseValue(card) > player.getUseValue(card)) return 4 * att; - if (get.value(card, target) > get.value(card, player)) return 2 * att; - return 1.2 * att; - } - return (-att * Math.min(4, target.countCards("he"))) / 4; - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("rejieyue", target); - player.give(result.cards, target); - } else event.finish(); - "step 2"; - var num = 0; - if (target.countCards("h")) num++; - if (target.countCards("e")) num++; - if (num > 0) { - var next = target.chooseCard("he", num, "选择保留每个区域的各一张牌,然后弃置其余的牌。或点取消,令" + get.translation(player) + "摸三张牌", function (card) { - for (var i = 0; i < ui.selected.cards.length; i++) { - if (get.position(ui.selected.cards[i]) == get.position(card)) return false; - } - return true; - }); - next.set("complexCard", true); - next.set("goon", get.attitude(target, player) >= 0); - next.set("maxNum", num); - next.set("ai", function (card) { - if (_status.event.goon) return -1; - var num = _status.event.maxNum; - if (ui.selected.cards.length >= num - 1) { - var cards = player.getCards("he", function (cardx) { - return cardx != card && !ui.selected.cards.includes(cardx); - }); - var val = 0; - for (var cardx of cards) val += get.value(cardx); - if (val >= 14) return 0; - } - return get.value(card); - }); - } else event._result = { bool: false }; - "step 3"; - if (!result.bool) player.draw(3); - else { - var cards = target.getCards("he"); - cards.removeArray(result.cards); - if (cards.length) target.discard(cards); - } - }, - ai: { - threaten: 1.3, - expose: 0.2, - }, - }, - tiansuan: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return !player.storage.tiansuan2; - }, - content: function () { - "step 0"; - player - .chooseControl("上上签", "上签", "中签", "下签", "下下签", "cancel2") - .set("prompt", "天算:是否增加其中一个命运签的权重?") - .set("ai", function () { - return Math.random() < 0.5 ? 0 : 4; - }); - "step 1"; - var list = [0, 1, 1, 2, 2, 2, 3, 3, 4]; - if (result.control != "cancel2") list.push(result.index); - var num = list.randomGet(); - event.num = num; - var str = get.translation(player) + "抽取的命运签为:" + lib.skill["tiansuan2_" + num].name; - game.log(player, "抽取出了", "#g" + lib.skill["tiansuan2_" + num].name); - event.dialog = ui.create.dialog(str); - event.videoId = lib.status.videoId++; - game.broadcast("createDialog", event.videoId, str); - game.pause(); - setTimeout(function () { - game.resume(); - }, 1500); - "step 2"; - event.dialog.close(); - game.broadcast("closeDialog", event.videoId); - player.chooseTarget(true, "令一名角色获得“" + lib.skill["tiansuan2_" + num].name + "”").set("ai", lib.skill["tiansuan2_" + num].aiCheck); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - game.log(player, "令", target, "获得了命运签"); - player.storage.tiansuan2 = target; - player.storage.tiansuan3 = "tiansuan2_" + num; - player.addTempSkill("tiansuan2", { player: "phaseBegin" }); - target.addSkill("tiansuan2_" + num); - if (num < 2 && target.countGainableCards(player, target == player ? "e" : "he") > 0) { - var next = player.gainPlayerCard(target, target == player ? "e" : "he", true); - if (num == 0) next.visible = true; - } else game.delayx(); - } - }, - derivation: "tiansuan_faq", - ai: { - order: 7, - result: { - player: 1, - }, - }, - }, - tiansuan2: { - charlotte: true, - onremove: function (player, skill) { - if (player.storage.tiansuan2) player.storage.tiansuan2.removeSkill(player.storage.tiansuan3); - delete player.storage.tiansuan2; - delete player.storage.tiansuan3; - }, - }, - tiansuan2_0: { - name: "上上签", - trigger: { player: "damageBegin4" }, - forced: true, - charlotte: true, - content: function () { - trigger.cancel(); - }, - mark: true, - intro: { - content: "当你受到伤害时,防止此伤害。", - }, - aiCheck: function (target) { - if (target.hasSkill("tiansuan2_0")) return 0; - var player = _status.event.player; - var att = get.attitude(player, target); - if ( - target.countCards("e", function (card) { - return get.value(card, target) <= 0; - }) - ) - att *= 2; - return att / Math.sqrt(Math.max(1, target.hp)); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) return "zerotarget"; - }, - }, - }, - }, - tiansuan2_1: { - name: "上签", - trigger: { player: "damageBegin4" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return event.num > 1; - }, - content: function () { - trigger.num = 1; - }, - group: "tiansuan2_damage", - mark: true, - intro: { - content: "当你受到伤害时,你令伤害值改为1;当你受到1点伤害后,你摸一张牌。", - }, - aiCheck: function (target) { - if (target.hasSkill("tiansuan2_1")) return 0; - var player = _status.event.player; - var att = get.attitude(player, target); - if ( - target.countCards("e", function (card) { - return get.value(card, target) <= 0; - }) - ) - att *= 2; - if (target.hp == 1) return att / 2; - return att / Math.sqrt(Math.max(1, target.hp)); - }, - ai: { - filterDamage: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.player) { - if (arg.player.hasSkillTag("jueqing", false, player)) return false; - } - }, - effect: { - target: function (card, player, target, current) { - if (target && target.hp > 1 && get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) return 0.8; - }, - }, - }, - }, - tiansuan2_damage: { - trigger: { player: "damageEnd" }, - charlotte: true, - content: function () { - player.draw(trigger.num); - }, - }, - tiansuan2_2: { - name: "中签", - trigger: { player: "damageBegin4" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return event.num > 1; - }, - content: function () { - trigger.num = 1; - }, - mark: true, - intro: { - content: "当你受到伤害时,你令伤害属性改为火属性并将伤害值改为1。", - }, - aiCheck: function (target) { - if (target.hasSkill("tiansuan2_2")) return 0; - var player = _status.event.player; - target.addSkill("tiansuan2_ai"); - var num = get.damageEffect(target, player, player, "fire"); - target.removeSkill("tiansuan2_ai"); - return num; - }, - group: ["tiansuan2_fire", "tiansuan2_ai"], - }, - tiansuan2_ai: { - ai: { - filterDamage: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.player) { - if (arg.player.hasSkillTag("jueqing", false, player)) return false; - } - }, - }, - }, - tiansuan2_fire: { - trigger: { player: "damageBefore" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return !event.hasNature("fire"); - }, - content: function () { - game.setNature(trigger, "fire"); - }, - }, - tiansuan2_3: { - name: "下签", - trigger: { player: "damageBegin3" }, - forced: true, - charlotte: true, - content: function () { - trigger.num++; - }, - mark: true, - intro: { - content: "当你受到伤害时,你令此伤害+1。", - }, - aiCheck: function (target) { - if (target.hasSkill("tiansuan2_3")) return 0; - var player = _status.event.player; - var att = get.attitude(player, target); - return -att / Math.sqrt(Math.max(1, target.hp)); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target) && current < 0) return 1.3; - }, - }, - }, - }, - tiansuan2_4: { - name: "下下签", - trigger: { player: "damageBegin3" }, - forced: true, - charlotte: true, - content: function () { - trigger.num++; - }, - mod: { - cardEnabled: function (card, player) { - if (card.name == "tao" || card.name == "jiu") return false; - }, - cardSavable: function (card, player) { - if (card.name == "tao" || card.name == "jiu") return false; - }, - }, - mark: true, - intro: { - content: "当你受到伤害时,你令此伤害+1。你不能使用【酒】或【桃】。", - }, - aiCheck: function (target) { - if (target.hasSkill("tiansuan2_4")) return 0; - var player = _status.event.player; - var att = get.attitude(player, target); - return -att / Math.sqrt(Math.max(1, target.hp)); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target) && current < 0) return 1.3; - }, - }, - }, - }, - relieren: { - shaRelated: true, - audio: 2, - audioname: ["boss_lvbu3"], - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return event.card.name == "sha" && player.canCompare(event.target); - }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - //priority:5, - content: function () { - "step 0"; - player.chooseToCompare(trigger.target).clear = false; - "step 1"; - if (result.bool) { - if (trigger.target.countGainableCards(player, "he")) player.gainPlayerCard(trigger.target, true, "he"); - ui.clear(); - } else { - var card1 = result.player; - var card2 = result.target; - if (get.position(card1) == "d") trigger.target.gain(card1, "gain2"); - if (get.position(card2) == "d") player.gain(card2, "gain2"); - } - }, - }, - retiaoxin: { - audio: "tiaoxin", - audioname: ["sp_jiangwei", "xiahouba", "re_jiangwei"], - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player && target.countCards("he"); - }, - content: function () { - "step 0"; - 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); - "step 1"; - if (result.bool == false && target.countCards("he") > 0) { - player.discardPlayerCard(target, "he", true); - } else { - event.finish(); - } - }, - ai: { - order: 4, - expose: 0.2, - result: { - target: -1, - player: function (player, target) { - if (!target.canUse("sha", player)) return 0; - if (target.countCards("h") == 0) return 0; - if (target.countCards("h") == 1) return -0.1; - if (player.hp <= 2) return -2; - if (player.countCards("h", "shan") == 0) return -1; - return -0.5; - }, - }, - threaten: 1.1, - }, - }, - //南华老仙 - yufeng: { - inherit: "yufeng_old", - content: function () { - "step 0"; - if (_status.connectMode) event.time = lib.configOL.choose_timeout; - event.videoId = lib.status.videoId++; - var maxScore = Math.max(2, 1 + player.countMark("yufeng")); - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - game.pause(); - game.countChoose(); - setTimeout(function () { - _status.imchoosing = false; - var max = Math.max(2, 1 + player.countMark("yufeng")); - var score = Math.random() < 0.5 ? max : get.rand(1, max); - event._result = { - bool: true, - score: score, - win: score >= max, - }; - if (event.dialog) event.dialog.close(); - if (event.control) event.control.close(); - game.resume(); - }, 5000); - }; - var createDialog = function (player, id) { - if (_status.connectMode) lib.configOL.choose_timeout = "30"; - if (player == game.me) return; - var str = get.translation(player) + "正在表演《御风飞行》...
    "; - ui.create.dialog(str).videoId = id; - }; - var chooseButton = function (maxScore) { - lib.skill.yufeng.$playFlappyBird(maxScore); - }; - //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog, player, event.videoId); - if (event.isMine()) { - chooseButton(maxScore); - } else if (event.isOnline()) { - event.player.send(chooseButton, maxScore); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 1"; - game.broadcastAll( - function (id, time) { - if (_status.connectMode) lib.configOL.choose_timeout = time; - var dialog = get.idDialog(id); - if (dialog) { - dialog.close(); - } - }, - event.videoId, - event.time - ); - var result = event.result || result; - player.popup(get.cnNumber(result.score) + "分", result.win ? "wood" : "fire"); - game.log(player, "御风飞行", result.win ? "#g成功" : "#y失败"); - game.log(player, "获得了", "#g" + result.score + "分"); - var max = player.countMark("yufeng"); - if (!result.win) { - if (result.score) player.draw(result.score); - if (max) player.removeMark("yufeng", max, false); - event.finish(); - } else { - if (max < 2) player.addMark("yufeng", 1, false); - event.score = result.score; - player - .chooseTarget("请选择【御风】的目标", [1, result.score], function (card, player, target) { - return target != player && !target.hasSkill("yufeng2"); - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = -get.attitude(player, target), - attx = att * 2; - if (att <= 0 || target.hasSkill("xinfu_pdgyingshi")) return 0; - if (target.hasJudge("lebu")) attx -= att; - if (target.hasJudge("bingliang")) attx -= att; - return attx / Math.max(2.25, Math.sqrt(target.countCards("h") + 1)); - }); - } - "step 2"; - if (result.bool) { - result.targets.sortBySeat(); - player.line(result.targets, "green"); - game.log(result.targets, "获得了", "#y“御风”", "效果"); - for (var i of result.targets) i.addSkill("yufeng2"); - if (event.score > result.targets.length) player.draw(event.score - result.targets.length); - } else player.draw(event.score); - }, - $playFlappyBird: function (maxScore, title) { - //Forked from: https://github.com/aaarafat/JS-Flappy-Bird - - const event = _status.event; - const dialog = ui.create.dialog("forcebutton", "hidden"); - dialog.textPrompt = dialog.add('
    准备好了吗?
    '); - dialog.classList.add("fixed"); - dialog.classList.add("scroll1"); - dialog.classList.add("scroll2"); - dialog.classList.add("fullwidth"); - dialog.classList.add("fullheight"); - dialog.classList.add("noupdate"); - const updateText = function (str) { - dialog.textPrompt.innerHTML = '
    ' + str + "
    "; - }; - - const canvas = document.createElement("canvas"); - dialog.appendChild(canvas); - canvas.style.position = "absolute"; - canvas.style.width = "276px"; - canvas.style.height = "414px"; - canvas.style.left = "calc(50% - 141px)"; - canvas.style.top = "calc(50% - 200px)"; - canvas.width = 276; - canvas.height = 414; - canvas.style.border = "3px solid"; - - const RAD = Math.PI / 180; - const ctx = canvas.getContext("2d"); - let frames = 0; - let dx = 0.1; - let previousDOMHighResTimeStamp = performance.now(); - let deltaTime = 0; - const state = { - curr: 0, - getReady: 0, - Play: 1, - gameOver: 2, - gameSuccess: 3, - }; - const SFX = { - start: new Audio(), - flap: new Audio(), - score: new Audio(), - hit: new Audio(), - die: new Audio(), - played: false, - }; - const gnd = { - sprite: new Image(), - x: 0, - y: 0, - draw: function () { - this.y = parseFloat(canvas.height - this.sprite.height); - ctx.drawImage(this.sprite, this.x, this.y); - }, - update: function () { - if (state.curr == state.gameOver || state.curr == state.gameSuccess) return; - this.x -= dx * deltaTime; - const halfWidth = this.sprite.width / 4; - if (this.x <= -halfWidth) this.x += halfWidth; - }, - }; - const bg = { - sprite: new Image(), - x: 0, - y: 0, - draw: function () { - let y = parseFloat(canvas.height - this.sprite.height); - ctx.drawImage(this.sprite, this.x, y); - }, - }; - const pipe = { - top: { sprite: new Image() }, - bot: { sprite: new Image() }, - gap: 127, - moved: true, - pipes: [], - numberOfPipes: 1, - timeElapsed: 0, - draw: function () { - for (let i = 0; i < this.pipes.length; i++) { - let p = this.pipes[i]; - ctx.drawImage(this.top.sprite, p.x, p.y); - ctx.drawImage(this.bot.sprite, p.x, p.y + parseFloat(this.top.sprite.height) + this.gap); - } - }, - update: function () { - if (state.curr != state.Play) return; - this.timeElapsed += deltaTime; - if (this.timeElapsed >= 1600) { - this.timeElapsed -= 1600; - this.pipes.push({ - x: parseFloat(canvas.width), - y: -210 * Math.min(Math.random() * 0.8 + 1.2, 1.8), - }); - } - this.pipes.forEach(pipe => { - pipe.x -= dx * deltaTime; - }); - if (this.pipes.length && this.pipes[0].x < -this.top.sprite.width) { - this.pipes.shift(); - this.moved = true; - } - }, - }; - const bird = { - animations: [{ sprite: new Image() }, { sprite: new Image() }, { sprite: new Image() }, { sprite: new Image() }], - rotatation: 0, - x: 50, - y: 100, - speed: 0, - gravity: 0.0004, - thrust: 0.18, - frame: 0, - timeElapsed: 0, - totalTimeElapsed: 0, - draw: function () { - let h = this.animations[this.frame].sprite.height; - let w = this.animations[this.frame].sprite.width; - ctx.save(); - ctx.translate(this.x, this.y); - ctx.rotate(this.rotatation * RAD); - ctx.drawImage(this.animations[this.frame].sprite, -w / 2, -h / 2); - ctx.restore(); - }, - update: function () { - this.totalTimeElapsed += deltaTime; - let r = parseFloat(this.animations[0].sprite.width) / 2; - switch (state.curr) { - case state.getReady: - case state.gameSuccess: - this.rotatation = 0; - this.timeElapsed += deltaTime; - if (this.timeElapsed >= 200) { - this.timeElapsed -= 200; - this.y += Math.sin((this.totalTimeElapsed / 10) * RAD); - this.frame++; - } - break; - case state.Play: - this.timeElapsed += deltaTime; - if (this.timeElapsed >= 100) { - this.timeElapsed -= 100; - this.frame++; - } - this.y += this.speed * deltaTime; - this.setRotation(); - this.speed += this.gravity * deltaTime; - if (UI.score.curr >= maxScore) { - state.curr = state.gameSuccess; - this.timeElapsed = 0; - updateText(`${title || "御风飞行"}表演成功!`); - setTimeout(switchToAuto, 2000); - } else if (this.y + r >= gnd.y || this.collisioned()) { - state.curr = state.gameOver; - this.timeElapsed = 0; - updateText(`${title || "御风飞行"}表演失败……`); - setTimeout(switchToAuto, 2000); - } - break; - case state.gameOver: - this.frame = 1; - if (this.y + r < gnd.y) { - this.y += this.speed * deltaTime; - this.setRotation(); - this.speed += this.gravity * deltaTime; - } else { - this.speed = 0; - this.y = gnd.y - r; - this.rotatation = 90; - if (!SFX.played) { - Promise.resolve(SFX.die.play()).catch(() => void 0); - SFX.played = true; - } - } - break; - } - const animationsLength = this.animations.length; - if (this.frame >= animationsLength) this.frame -= animationsLength; - }, - flap: function () { - if (this.y <= 0) return; - const flap = SFX.flap; - flap.currentTime = 0; - if (flap.paused) Promise.resolve(flap.play()).catch(() => void 0); - this.speed = -this.thrust; - }, - setRotation: function () { - if (this.speed <= 0) { - this.rotatation = Math.max(-25, (-25 * this.speed) / (-1 * this.thrust)); - } else if (this.speed > 0) { - this.rotatation = Math.min(90, (90 * this.speed) / (this.thrust * 2)); - } - }, - collisioned: function () { - if (!pipe.pipes.length) return; - let bird = this.animations[0].sprite; - let x = pipe.pipes[0].x; - let y = pipe.pipes[0].y; - let r = bird.height / 4 + bird.width / 4; - let roof = y + parseFloat(pipe.top.sprite.height); - let floor = roof + pipe.gap; - let w = parseFloat(pipe.top.sprite.width); - if (this.x + r >= x) { - if (this.x + r < x + w) { - if (this.y - r <= roof || this.y + r >= floor) { - Promise.resolve(SFX.hit.play()).catch(() => void 0); - return true; - } - } else if (pipe.moved) { - updateText(`当前分数:${++UI.score.curr}`); - const score = SFX.score; - score.currentTime = 0; - if (score.paused) Promise.resolve(score.play()).catch(() => void 0); - pipe.moved = false; - } - } - }, - }; - const UI = { - getReady: { sprite: new Image() }, - gameOver: { sprite: new Image() }, - gameClear: { sprite: new Image() }, - tap: [{ sprite: new Image() }, { sprite: new Image() }], - score: { - curr: 0, - best: 0, - }, - x: 0, - y: 0, - tx: 0, - ty: 0, - frame: 0, - timeElapsed: 0, - draw: function () { - switch (state.curr) { - case state.getReady: - this.y = parseFloat(canvas.height - this.getReady.sprite.height) / 2; - this.x = parseFloat(canvas.width - this.getReady.sprite.width) / 2; - this.tx = parseFloat(canvas.width - this.tap[0].sprite.width) / 2; - this.ty = this.y + this.getReady.sprite.height - this.tap[0].sprite.height; - ctx.drawImage(this.getReady.sprite, this.x, this.y); - ctx.drawImage(this.tap[this.frame].sprite, this.tx, this.ty); - break; - case state.gameOver: - case state.gameSuccess: - this.y = parseFloat(canvas.height - this.gameOver.sprite.height) / 2; - this.x = parseFloat(canvas.width - this.gameOver.sprite.width) / 2; - this.tx = parseFloat(canvas.width - this.tap[0].sprite.width) / 2; - this.ty = this.y + this.gameOver.sprite.height - this.tap[0].sprite.height; - ctx.drawImage((state.curr == state.gameOver ? this.gameOver : this.gameClear).sprite, this.x, this.y); - } - }, - update: function () { - if (state.curr == state.Play) return; - this.timeElapsed += deltaTime; - if (this.timeElapsed >= 200) { - this.timeElapsed -= 200; - this.frame++; - } - const tapLength = this.tap.length; - if (this.frame >= tapLength) this.frame -= tapLength; - }, - }; - gnd.sprite.src = lib.assetURL + "image/flappybird/ground.png"; - bg.sprite.src = lib.assetURL + "image/flappybird/BG.png"; - pipe.top.sprite.src = lib.assetURL + "image/flappybird/toppipe.png"; - pipe.bot.sprite.src = lib.assetURL + "image/flappybird/botpipe.png"; - UI.gameOver.sprite.src = lib.assetURL + "image/flappybird/gameover.png"; - UI.gameClear.sprite.src = lib.assetURL + "image/flappybird/gameclear.png"; - UI.getReady.sprite.src = lib.assetURL + "image/flappybird/getready.png"; - UI.tap[0].sprite.src = lib.assetURL + "image/flappybird/tap/t0.png"; - UI.tap[1].sprite.src = lib.assetURL + "image/flappybird/tap/t1.png"; - bird.animations[0].sprite.src = lib.assetURL + "image/flappybird/bird/b0.png"; - bird.animations[1].sprite.src = lib.assetURL + "image/flappybird/bird/b1.png"; - bird.animations[2].sprite.src = lib.assetURL + "image/flappybird/bird/b2.png"; - bird.animations[3].sprite.src = lib.assetURL + "image/flappybird/bird/b0.png"; - - SFX.start.src = lib.assetURL + "audio/effect/flappybird_start.wav"; - SFX.flap.src = lib.assetURL + "audio/effect/flappybird_flap.wav"; - SFX.score.src = lib.assetURL + "audio/effect/flappybird_score.wav"; - SFX.hit.src = lib.assetURL + "audio/effect/flappybird_hit.wav"; - SFX.die.src = lib.assetURL + "audio/effect/flappybird_die.wav"; - - const gameLoop = domHighResTimeStamp => { - if (frames < 0) return; - deltaTime = domHighResTimeStamp - previousDOMHighResTimeStamp; - previousDOMHighResTimeStamp = domHighResTimeStamp; - update(); - draw(); - frames++; - window.requestAnimationFrame(gameLoop); - }; - - const update = function () { - bird.update(); - gnd.update(); - pipe.update(); - UI.update(); - }; - - const draw = function () { - ctx.fillStyle = "#30c0df"; - ctx.fillRect(0, 0, canvas.width, canvas.height); - bg.draw(); - pipe.draw(); - - bird.draw(); - gnd.draw(); - UI.draw(); - }; - - const click = function () { - switch (state.curr) { - case state.getReady: - state.curr = state.Play; - bird.timeElapsed = 0; - Promise.resolve(SFX.start.play()).catch(() => void 0); - updateText(`当前分数:${UI.score.curr}`); - break; - case state.Play: - bird.flap(); - } - }; - const switchToAuto = function () { - event._result = { - bool: true, - score: UI.score.curr, - win: UI.score.curr >= maxScore, - }; - dialog.close(); - game.resume(); - _status.imchoosing = false; - frames = -1; - document.removeEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", click); - }; - - dialog.open(); - game.pause(); - game.countChoose(); - - document.addEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", click); - window.requestAnimationFrame(gameLoop); - }, - }, - yufeng_old: { - audio: 2, - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - if (_status.connectMode) event.time = lib.configOL.choose_timeout; - event.videoId = lib.status.videoId++; - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - game.pause(); - game.countChoose(); - setTimeout(function () { - _status.imchoosing = false; - var max = Math.max(2, 1 + game.me.countMark("yufeng")); - var score = Math.random() < 0.5 ? max : get.rand(1, max); - event._result = { - bool: true, - score: score, - win: score >= max, - }; - if (event.dialog) event.dialog.close(); - if (event.control) event.control.close(); - game.resume(); - }, 5000); - }; - var createDialog = function (player, id) { - if (_status.connectMode) lib.configOL.choose_timeout = "30"; - if (player == game.me) return; - var str = get.translation(player) + "正在表演《御风飞行》...
    "; - ui.create.dialog(str).videoId = id; - }; - var chooseButton = function () { - var roundmenu = false; - if (ui.roundmenu && ui.roundmenu.display != "none") { - roundmenu = true; - ui.roundmenu.style.display = "none"; - } - var event = _status.event; - event.settleed = false; - event.score = 0; - event.dialog = ui.create.dialog("forcebutton", "hidden"); - event.dialog.textPrompt = event.dialog.add('
    准备好了吗?准备好了的话就点击屏幕开始吧!
    '); - var max = Math.max(2, 1 + game.me.countMark("yufeng")); - event.dialog.textPrompt.style["z-index"] = 10; - event.switchToAuto = function () { - event._result = { - bool: true, - score: event.score, - win: event.score >= max, - }; - event.dialog.close(); - game.resume(); - _status.imchoosing = false; - if (roundmenu) ui.roundmenu.style.display = ""; - }; - event.dialog.classList.add("fixed"); - event.dialog.classList.add("scroll1"); - event.dialog.classList.add("scroll2"); - event.dialog.classList.add("fullwidth"); - event.dialog.classList.add("fullheight"); - event.dialog.classList.add("noupdate"); - event.dialog.style.overflow = "hidden"; - event.dialog.open(); - - var height = event.dialog.offsetHeight; - var width = event.dialog.offsetWidth; - var top = 50; - var speed = 0; - var start = false; - - var bird = ui.create.div(""); - bird.style["background-image"] = "linear-gradient(rgba(240, 235, 3, 1), rgba(230, 225, 5, 1))"; - bird.style["border-radius"] = "3px"; - var pipes = []; - bird.style.position = "absolute"; - bird.style.height = "40px"; - bird.style.width = "40px"; - bird.style.left = Math.ceil(width / 3) + "px"; - bird.style.top = (top / 100) * height + "px"; - bird.updatePosition = function () { - bird.style.transform = "translateY(" + ((top / 100) * height - bird.offsetTop) + "px)"; - }; - event.dialog.appendChild(bird); - var isDead = function () { - if (top > 100 || top < 0) return true; - var btop = top; - var bleft = 100 / 3; - var bdown = btop + 5; - var bright = bleft + 5; - for (var i of pipes) { - var left2 = i.left; - var right2 = left2 + 10; - var bottom2 = i.height1; - var top2 = i.height2; - - if (left2 > bright || right2 < bleft) continue; - if (btop < bottom2) return true; - if (bdown > top2) return true; - return false; - } - return false; - }; - - var fly = function () { - if (!start) { - start = true; - event.dialog.textPrompt.innerHTML = '
    当前分数:' + event.score + "
    "; - speed = -4; - event.fly = setInterval(function () { - top += speed; - if (top < 0) top = 0; - bird.updatePosition(); - for (var i of pipes) { - i.left -= 0.5; - i.updateLeft(); - } - speed += 0.5; - if (speed > 2.5) speed = 2.5; - - if (isDead() == true) { - event.settle(); - } - }, 35); - var addPipe = function () { - var num = get.rand(5, 55); - - var pipe1 = ui.create.div(""); - pipe1.style["background-image"] = "linear-gradient(rgba(57, 133, 4, 1), rgba(60, 135, 6, 1))"; - pipe1.style["border-radius"] = "3px"; - pipe1.style.position = "absolute"; - pipe1.height1 = num; - pipe1.height2 = num + 50; - pipe1.left = 110; - pipe1.num = 1; - pipe1.style.height = Math.ceil((height * num) / 100) + "px"; - pipe1.style.width = width / 10 + "px"; - pipe1.style.left = (pipe1.left * width) / 100 + "px"; - pipe1.style.top = "0px"; - - var pipe2 = ui.create.div(""); - pipe2.style["background-image"] = "linear-gradient(rgba(57, 133, 4, 1), rgba(60, 135, 6, 1))"; - pipe2.style["border-radius"] = "3px"; - pipe1.pipe2 = pipe2; - pipe2.style.position = "absolute"; - pipe2.style.height = Math.ceil(((100 - pipe1.height2) * height) / 100) + "px"; - pipe2.style.width = width / 10 + "px"; - pipe2.style.left = (pipe1.left * width) / 100 + "px"; - pipe2.style.top = Math.ceil((pipe1.height2 * height) / 100) + "px"; - pipes.add(pipe1); - event.dialog.appendChild(pipe1); - event.dialog.appendChild(pipe2); - pipe1.updateLeft = function () { - this.style.transform = "translateX(" + ((this.left / 100) * width - this.offsetLeft) + "px)"; - this.pipe2.style.transform = "translateX(" + ((this.left / 100) * width - this.pipe2.offsetLeft) + "px)"; - if (this.left < 25 && !this.score) { - this.score = true; - event.score++; - event.dialog.textPrompt.innerHTML = '
    当前分数:' + event.score + "
    "; - if (event.score >= max) { - event.settle(); - } - } - if (this.left < -15) { - this.remove(); - this.pipe2.remove(); - pipes.remove(this); - } - }; - }; - event.addPipe = setInterval(addPipe, 2500); - } else if (speed > 0) { - speed = -4; - } - }; - document.addEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", fly); - - event.settle = function () { - clearInterval(event.fly); - clearInterval(event.addPipe); - document.removeEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", fly); - setTimeout(function () { - event.switchToAuto(); - }, 1000); - }; - - game.pause(); - game.countChoose(); - }; - //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog, player, event.videoId); - if (event.isMine()) { - chooseButton(); - } else if (event.isOnline()) { - event.player.send(chooseButton); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 1"; - game.broadcastAll( - function (id, time) { - if (_status.connectMode) lib.configOL.choose_timeout = time; - var dialog = get.idDialog(id); - if (dialog) { - dialog.close(); - } - }, - event.videoId, - event.time - ); - var result = event.result || result; - player.popup(get.cnNumber(result.score) + "分", result.win ? "wood" : "fire"); - game.log(player, "御风飞行", result.win ? "#g成功" : "#y失败"); - game.log(player, "获得了", "#g" + result.score + "分"); - var max = player.countMark("yufeng"); - if (!result.win) { - if (result.score) player.draw(result.score); - if (max) player.removeMark("yufeng", max, false); - event.finish(); - } else { - if (max < 2) player.addMark("yufeng", 1, false); - event.score = result.score; - player - .chooseTarget("请选择【御风】的目标", [1, result.score], function (card, player, target) { - return target != player && !target.hasSkill("yufeng2"); - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = -get.attitude(player, target), - attx = att * 2; - if (att <= 0 || target.hasSkill("xinfu_pdgyingshi")) return 0; - if (target.hasJudge("lebu")) attx -= att; - if (target.hasJudge("bingliang")) attx -= att; - return attx / Math.max(2.25, Math.sqrt(target.countCards("h") + 1)); - }); - } - "step 2"; - if (result.bool) { - result.targets.sortBySeat(); - player.line(result.targets, "green"); - game.log(result.targets, "获得了", "#y“御风”", "效果"); - for (var i of result.targets) i.addSkill("yufeng2"); - if (event.score > result.targets.length) player.draw(event.score - result.targets.length); - } else player.draw(event.score); - }, - ai: { - order: 10, - result: { player: 1 }, - threaten: 3.2, - }, - }, - yufeng2: { - trigger: { player: "phaseZhunbeiBegin" }, - audio: false, - forced: true, - charlotte: true, - content: function () { - "step 0"; - player.removeSkill("yufeng2"); - player.judge(); - "step 1"; - if (result.color == "red") player.skip("phaseDraw"); - else { - player.skip("phaseUse"); - player.skip("phaseDiscard"); - } - }, - mark: true, - intro: { - content: "准备阶段时进行判定,结果为红则跳过摸牌阶段,为黑则跳过出牌阶段和弃牌阶段", - }, - ai: { - order: 7, - result: { - player: 1, - }, - }, - }, - tianshu: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return ( - player.countCards("he") && - !game.hasPlayer(function (current) { - return current.countCards("ej", "taipingyaoshu"); - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: get.prompt2("tianshu"), - filterCard: true, - position: "he", - ai1: function (card) { - return 5 - get.value(card); - }, - ai2: function (target) { - var player = _status.event.player; - if (get.attitude(player, target) > 0 && !target.hasEmptySlot(2)) return 0; - return get.attitude(player, target); - }, - }); - "step 1"; - if (!result.bool) { - event.finish(); - return; - } - var target = result.targets[0]; - event.target = target; - player.logSkill("tianshu", target); - player.discard(result.cards); - if (!lib.inpile.includes("taipingyaoshu")) { - lib.inpile.push("taipingyaoshu"); - event.card = game.createCard2("taipingyaoshu", "heart", 3); - } else { - event.card = get.cardPile(function (card) { - return card.name == "taipingyaoshu"; - }); - } - if (!event.card) event.finish(); - else target.gain(event.card, "gain2"); - "step 2"; - if (target.getCards("h").includes(card) && get.name(card, target) == "taipingyaoshu") target.chooseUseTarget(card, "nopopup", true); - }, - }, - //界伏寿 - xinzhuikong: { - audio: 2, - trigger: { global: "phaseZhunbeiBegin" }, - check: function (event, player) { - if (get.attitude(player, event.player) < -2) { - var cards = player.getCards("h"); - if (cards.length > player.hp) return true; - for (var i = 0; i < cards.length; i++) { - var useful = get.useful(cards[i]); - if (useful < 5) return true; - if (cards[i].number > 7 && useful < 7) return true; - } - } - return false; - }, - logTarget: "player", - filter: function (event, player) { - return !player.hasSkill("xinzhuikong2") && player.hp <= event.player.hp && player.canCompare(event.player); - }, - content: function () { - "step 0"; - player.addTempSkill("xinzhuikong2", "roundStart"); - player.chooseToCompare(trigger.player).set("small", player.hp > 1 && get.effect(player, { name: "sha" }, trigger.player, player) > 0 && Math.random() < 0.9); - "step 1"; - if (result.bool) { - trigger.player.addTempSkill("zishou2"); - event.finish(); - } else if (result.target && get.position(result.target) == "d") player.gain(result.target, "gain2", "log"); - "step 2"; - var card = { name: "sha", isCard: true }; - if (trigger.player.canUse(card, player, false)) trigger.player.useCard(card, player, false); - }, - }, - xinzhuikong2: { charlotte: true }, - xinqiuyuan: { - audio: 2, - trigger: { target: "useCardToTarget" }, - direct: true, - filter: function (event, player) { - return ( - event.card.name == "sha" && - game.hasPlayer(function (current) { - return current != player && !event.targets.includes(current) && lib.filter.targetEnabled(event.card, event.player, current); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("xinqiuyuan"), function (card, player, target) { - var evt = _status.event.getTrigger(); - return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled(evt.card, evt.player, target); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, trigger.player, player) + 0.1; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("xinqiuyuan", target); - event.target = target; - target - .chooseCard( - function (card, player) { - var name = get.name(card, player); - return name != "sha" && get.type(name) == "basic"; - }, - "h", - "交给" + get.translation(player) + "一张不为【杀】的基本牌,或成为此杀的额外目标" - ) - .set("ai", function (card) { - return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1; - }) - .set("sourcex", player); - game.delay(); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - target.give(result.cards, player); - game.delay(); - } else { - trigger.getParent().targets.push(event.target); - trigger.getParent().triggeredTargets2.push(event.target); - game.log(event.target, "成为了", trigger.card, "的额外目标"); - } - }, - ai: { - expose: 0.2, - effect: { - target: function (card, player, target) { - if (card.name != "sha") return; - var players = game.filterPlayer(); - if (get.attitude(player, target) <= 0) { - for (var i = 0; i < players.length; i++) { - var target2 = players[i]; - if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, target) > 0 && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) < 0) { - if (target.hp == target.maxHp) return 0.3; - return 0.6; - } - } - } else { - for (var i = 0; i < players.length; i++) { - var target2 = players[i]; - if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) > 0) { - if (player.canUse(card, target2)) return; - if (target.hp == target.maxHp) return [0, 1]; - return [0, 0]; - } - } - } - }, - }, - }, - }, - //界潘璋马忠 - xinduodao: { - audio: 2, - trigger: { player: "damageEnd" }, - logTarget: "source", - filter: function (event, player) { - var source = event.source; - if (!source) return false; - var cards = source.getEquips(1); - return cards.some(card => lib.filter.canBeGained(card, player, source)); - }, - prompt2: function (event, player) { - var source = event.source; - var cards = source.getEquips(1).filter(card => lib.filter.canBeGained(card, player, source)); - return "获得其装备区中的" + get.translation(cards); - }, - check: function (event, player) { - return (get.attitude(player, event.source) + 0.1) * get.value(event.source.getEquip(1), event.source); - }, - content: function () { - var source = trigger.source; - var cards = source.getEquips(1).filter(card => lib.filter.canBeGained(card, player, source)); - player.gain(cards, source, "give", "bySelf"); - }, - }, - xinanjian: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - forced: true, - logTarget: "target", - filter: function (event, player) { - return event.card.name == "sha" && !player.inRangeOf(event.target); - }, - content: function () { - "step 0"; - var card = get.translation(trigger.card); - var target = get.translation(trigger.target); - player - .chooseControl() - .set("prompt", "暗箭:请选择一项") - .set("choiceList", ["令" + target + "不能响应" + card, "令" + card + "对" + target + "的伤害值基数+1"]) - .set("ai", function () { - var target = _status.event.getTrigger().target; - var player = _status.event.player; - var num = target.mayHaveShan( - player, - "use", - target.getCards("h", i => { - return i.hasGaintag("sha_notshan"); - }) - ) - ? 0 - : 1; - if (get.attitude(player, target) > 0) num = 1 - num; - return num; - }); - "step 1"; - if (result.index == 0) { - game.log(player, "令", trigger.card, "不能被", trigger.target, "响应"); - trigger.directHit.push(trigger.target); - } else { - game.log(player, "令", trigger.card, "对", trigger.target, "的伤害+1"); - var id = trigger.target.playerid; - var map = trigger.customArgs; - if (!map[id]) map[id] = {}; - if (!map[id].extraDamage) map[id].extraDamage = 0; - map[id].extraDamage++; - } - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (!arg || !arg.card || !arg.target || arg.card.name != "sha" || arg.target.inRange(player) || get.attitude(player, arg.target) > 0) return false; - }, - }, - }, - //界郭笨 - mobilejingce: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - filter: function (event, player) { - var num = 0; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name != "cardsDiscard") return; - var evtx = evt.getParent(); - if (evtx.name != "orderingDiscard") return false; - var evt2 = evtx.relatedEvent || evtx.getParent(); - if (evt2 && (evt2.name == "useCard" || evt2.name == "respond")) num += evt.cards.length; - }); - return num >= player.hp; - }, - content: function () { - player.draw(2); - }, - group: "mobilejingce_count", - intro: { - content: function (num, player) { - if (num == 0) return "一张都没有?就这?"; - if (num < player.hp) return "才" + get.cnNumber(num) + "张?就这?"; - return "卧槽,牛逼啊,居然" + get.cnNumber(num) + "张了!"; - }, - }, - }, - mobilejingce_count: { - trigger: { - global: ["cardsDiscardEnd", "phaseBefore"], - player: "phaseAfter", - }, - silent: true, - firstDo: true, - filter: function (evt, player) { - if (evt.name == "phase") return true; - if (player != _status.currentPhase) return false; - var evtx = evt.getParent(); - if (evtx.name != "orderingDiscard") return false; - var evt2 = evtx.relatedEvent || evtx.getParent(); - return evt2 && (evt2.name == "useCard" || evt2.name == "respond"); - }, - content: function () { - if (trigger.name == "phase") player.unmarkSkill("mobilejingce"); - else { - var num = 0; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name != "cardsDiscard") return; - var evtx = evt.getParent(); - if (evtx.name != "orderingDiscard") return false; - var evt2 = evtx.relatedEvent || evtx.getParent(); - if (evt2 && (evt2.name == "useCard" || evt2.name == "respond")) num += evt.cards.length; - }); - player.storage.mobilejingce = num; - player.markSkill("mobilejingce"); - } - }, - }, - //公孙康 - juliao: { - mod: { - globalTo: function (from, to, distance) { - return distance + game.countGroup() - 1; - }, - }, - }, - taomie: { - audio: 3, - group: ["taomie1", "taomie2", "taomie3"], - trigger: { source: "damageBegin1" }, - forced: true, - locked: false, - direct: true, - filter: function (event, player) { - return event.player.hasMark("taomie"); - }, - content: function () { - "step 0"; - player.logSkill(Math.random() < 0.5 ? "taomie2" : "taomie3", trigger.player); - var target = get.translation(trigger.player); - player - .chooseControl() - .set("prompt", "讨灭:请选择一项") - .set("choiceList", ["令即将对" + target + "造成的伤害+1", "获得" + target + "的一张牌,并可将其交给另一名其他角色", "依次执行以上所有选项,并移去" + target + "的“讨灭”标记"]) - .set("ai", function () { - var evt = _status.event.getTrigger(); - var player = _status.event.player; - var target = evt.player; - var bool1 = !target.hasSkillTag("filterDamage", null, { - player: player, - card: evt.card, - }); - var bool2 = get.effect(target, { name: "shunshou" }, player, player) > 0; - if (bool1 && bool2 && target.hp <= evt.num + 1) return 2; - if (bool1) return 0; - return 1; - }); - "step 1"; - if (result.index == 2) { - trigger.taomie_player = trigger.player; - trigger.player.addTempSkill("taomie4"); - } - if (result.index != 1) { - trigger.num++; - } - if (result.index != 0 && trigger.player.countGainableCards(player, "hej") > 0) { - player.gainPlayerCard(trigger.player, "hej", true); - } else event.finish(); - "step 2"; - var card = result.cards[0]; - if ( - card && - player.getCards("h").includes(card) && - game.hasPlayer(function (current) { - return current != player && current != trigger.player; - }) - ) { - event.card = card; - player - .chooseTarget("是否将" + get.translation(card) + "交给一名其他角色?", function (card, player, target) { - return target != player && target != _status.event.getTrigger().player; - }) - .set("ai", function (target) { - var player = _status.event.player; - var card = _status.event.getParent().card; - if (target.hasSkillTag("nogain") || !player.needsToDiscard() || (get.tag(card, "damage") && player.hasValueTarget(card, null, false) && get.effect(_status.event.getTrigger().player, card, null, false) > 0)) return 0; - return get.attitude(player, target) / (1 + target.countCards("h")); - }); - } else event.finish(); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - player.give(card, target); - } - }, - mod: { - inRangeOf: function (from, to) { - if (from.hasMark("taomie")) return true; - }, - inRange: function (from, to) { - if (to.hasMark("taomie")) return true; - }, - }, - intro: { - content: "mark", - }, - ai: { - effect: { - player: function (card, player, target) { - if (target && get.tag(card, "damage") && target.hasMark("taomie")) { - if (player.hasSkillTag("jueqing", false, target)) return; - if (get.attitude(player, target) > 0) { - return 0.7; - } - return 1.2; - } - }, - }, - }, - }, - taomie1: { - audio: true, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - logTarget: function (trigger, player) { - if (player == trigger.player) return trigger.source; - return trigger.player; - }, - filter: function (event, player) { - var target = lib.skill.taomie1.logTarget(event, player); - return target && target.isIn() && !target.hasMark("taomie"); - }, - check: function (event, player) { - var target = lib.skill.taomie1.logTarget(event, player); - if (get.attitude(player, target) > 0) return false; - var target0 = game.findPlayer(function (current) { - return current.hasMark("taomie"); - }); - if (!target0) return true; - var eff1 = 0, - eff2 = 0; - player.countCards("h", function (card) { - if (!get.tag(card, "damage")) return false; - if (player.hasValueTarget(card, null, true) > 0) { - if (player.canUse(card, target, null, true)) { - var eff = get.effect(target, card, player, player); - if (eff > 0) eff1 += eff; - } - if (player.canUse(card, target0, null, true)) { - var eff = get.effect(target0, card, player, player); - if (eff > 0) eff2 += eff; - } - } - }); - return eff1 > eff2; - }, - prompt2: function (event, player) { - var target = lib.skill.taomie1.logTarget(event, player); - var str = "令" + get.translation(target) + "获得“讨灭”标记"; - if ( - game.hasPlayer(function (current) { - return current.hasMark("taomie"); - }) - ) - str += ",并移去场上已有的“讨灭”标记"; - return str; - }, - content: function () { - game.countPlayer(function (current) { - var num = current.countMark("taomie"); - if (num) current.removeMark("taomie"); - }); - lib.skill.taomie1.logTarget(trigger, player).addMark("taomie", 1); - }, - }, - taomie2: { audio: true }, - taomie3: { audio: true }, - taomie4: { - trigger: { - global: ["damageAfter", "damageCancelled", "damageZero"], - player: "dieBegin", - }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return player.hasMark("taomie") && (event.name == "die" || event.taomie_player == player); - }, - content: function () { - player.removeMark("taomie", player.countMark("taomie")); - player.removeSkill("taomie2"); - }, - }, - //铁骑飞 - liyong: { - audio: "retishen", - trigger: { player: "shaMiss" }, - forced: true, - filter: function (event, player) { - return player.isPhaseUsing(); - }, - content: function () { - trigger.getParent().liyong = true; - player.addTempSkill("liyong2", "phaseUseEnd"); - }, - }, - liyong2: { - audio: "retishen", - mark: true, - intro: { - content: "铁骑!强命!加伤!然后掉血嘞…", - }, - trigger: { player: "useCardToPlayered" }, - forced: true, - filter: function (event, player) { - if (!event.card || event.card.name != "sha") return false; - var evt = event.getParent(); - if (evt.liyong) return false; - var history = player.getHistory("useCard", function (evt) { - return evt.card.name == "sha"; - }); - var evt2 = history[history.indexOf(evt) - 1]; - return evt2 && evt2.liyong; - }, - logTarget: "target", - content: function () { - var target = trigger.target; - target.addTempSkill("fengyin"); - trigger.directHit.add(target); - var id = target.playerid; - var map = trigger.customArgs; - if (!map[id]) map[id] = {}; - if (!map[id].extraDamage) map[id].extraDamage = 0; - map[id].extraDamage++; - trigger.getParent().liyong2 = true; - }, - group: ["liyong3", "liyong4"], - }, - liyong3: { - trigger: { source: "damageSource" }, - forced: true, - popup: false, - filter: function (event, player) { - return event.card && event.card.name == "sha" && event.player.isIn() && event.getParent(2).liyong2 == true; - }, - content: function () { - player.loseHp(); - }, - }, - liyong4: { - trigger: { player: "useCardAfter" }, - forced: true, - silent: true, - filter: function (evt, player) { - if (!evt.card || evt.card.name != "sha") return false; - if (evt.liyong) return false; - var history = player.getHistory("useCard", function (evt) { - return evt.card.name == "sha"; - }); - var evt2 = history[history.indexOf(evt) - 1]; - return evt2 && evt2.liyong; - }, - content: function () { - player.removeSkill("liyong2"); - }, - }, - //韩遂 - xinniluan: { - trigger: { global: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return ( - player != event.player && - event.player.isIn() && - event.player.getHistory("useCard", function (evt) { - if (evt.targets && evt.targets.length) { - var targets = evt.targets.slice(0); - while (targets.includes(event.player)) targets.remove(event.player); - return targets.length > 0; - } - return false; - }).length > 0 && - (_status.connectMode || player.hasSha()) - ); - }, - content: function () { - "step 0"; - player.chooseToUse({ - logSkill: "xinniluan", - preTarget: trigger.player, - prompt: "是否发动【逆乱】,对" + get.translation(trigger.player) + "使用一张【杀】?", - filterCard: function (card, player) { - return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); - }, - filterTarget: function (card, player, target) { - return target == _status.event.preTarget && lib.filter.targetEnabled.apply(this, arguments); - }, - addCount: false, - }); - "step 1"; - if ( - result.bool && - player.getHistory("sourceDamage", function (evt) { - return evt.getParent(4) == event; - }).length && - trigger.player.countDiscardableCards(player, "he") > 0 - ) - player.discardPlayerCard(trigger.player, true, "he").boolline = true; - }, - }, - xiaoxi_hansui: { - audio: 2, - enable: ["chooseToRespond", "chooseToUse"], - filterCard: function (card, player) { - return get.color(card) == "black"; - }, - position: "hse", - viewAs: { name: "sha" }, - viewAsFilter: function (player) { - if (!player.countCards("hse", { color: "black" })) return false; - }, - prompt: "将一张黑色牌当杀使用或打出", - check: function (card) { - return 4.5 - get.value(card); - }, - ai: { - skillTagFilter: function (player) { - if (!player.countCards("hes", { color: "black" })) return false; - }, - respondSha: true, - }, - }, - //胡车儿 - daoji: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.countCards("he", function (card) { - return get.type(card) != "basic"; - }) && - game.hasPlayer(function (target) { - return target != player && target.countCards("e") > 0; - }) - ); - }, - filterCard: function (card) { - return get.type(card) != "basic"; - }, - position: "he", - filterTarget: function (card, player, target) { - return target != player && target.countCards("e") > 0; - }, - check: function (card) { - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) < 0 && get.damageEffect(current, player, player) > 0 && current.getEquip(1); - }) - ) - return 8 - get.value(card); - return 5 - get.value(card); - }, - content: function () { - "step 0"; - player.gainPlayerCard(target, "e", true).set("ai", function (button) { - var card = button.link; - var player = _status.event.player; - if (get.subtype(card) == "equip1" && get.damageEffect(_status.event.target, player, player) > 0) return 6 + get.value(card); - return get.value(card); - }); - "step 1"; - if (!result || !result.bool || !result.cards || !result.cards.length) { - event.finish(); - return; - } - var card = result.cards[0]; - event.card = card; - if (player.getCards("h").includes(card) && get.type(card) == "equip") player.chooseUseTarget(card, true).nopopup = true; - "step 2"; - if (get.subtype(card, false) == "equip1") target.damage(); - }, - ai: { - order: 6, - result: { - target: function (player, current) { - if (get.damageEffect(current, player, player) > 0 && current.getEquip(1)) return -1.5; - return -1; - }, - }, - }, - }, - //司马师夫妇 - //垃圾 - baiyi: { - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - selectTarget: 2, - limited: true, - skillAnimation: false, - //animationColor:'thunder', - filter: function (event, player) { - return player.isDamaged() && game.players.length > 2; - }, - multitarget: true, - multiline: true, - changeSeat: true, - contentBefore: function () { - player.$fullscreenpop("败移", "thunder"); - }, - content: function () { - player.awakenSkill("baiyi"); - game.broadcastAll( - function (target1, target2) { - game.swapSeat(target1, target2); - }, - targets[0], - targets[1] - ); - }, - ai: { - order: function () { - return get.order({ name: "tao" }) + 1; - }, - result: { - target: function (player, target) { - if (player.hasUnknown() && target != player.next && target != player.previous) return 0; - var distance = Math.pow(get.distance(player, target, "absolute"), 2); - if (!ui.selected.targets.length) return distance; - var distance2 = Math.pow(get.distance(player, ui.selected.targets[0], "absolute"), 2); - return Math.min(0, distance - distance2); - }, - }, - }, - }, - jinglve: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - if (player.hasSkill("jinglve2")) return false; - return game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }); - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - if (!player.storage.jinglve4) player.storage.jinglve4 = []; - player.storage.jinglve4.add(target); - player.chooseButton(["选择一张牌作为「死士」", target.getCards("h")], true).set("ai", function (button) { - var target = _status.event.getParent().target; - var card = button.link; - var val = target.getUseValue(card); - if (val > 0) return val; - return get.value(card); - }); - "step 1"; - if (result.bool) { - player.storage.jinglve2 = target; - player.storage.jinglve3 = result.links[0]; - player.addSkill("jinglve2"); - } - }, - ai: { - order: 12, - result: { - target: -1, - }, - }, - }, - jinglve2: { - mark: true, - intro: { - name: "死士", - mark: function (dialog, content, player) { - dialog.addText("记录目标"); - dialog.add([content]); - if (player == game.me || player.isUnderControl()) { - dialog.addText("死士牌"); - dialog.add([player.storage.jinglve3]); - } - }, - }, - onremove: function (player) { - delete player.storage.jinglve2; - delete player.storage.jinglve3; - }, - trigger: { global: ["dieEnd", "loseEnd", "gainEnd"] }, - silent: true, - lastDo: true, - charlotte: true, - filter: function (event, player) { - if (event.name != "gain" && event.player != player.storage.jinglve2) return false; - return event.name == "die" || (event.cards.includes(player.storage.jinglve3) && (event.name == "gain" || (event.position != ui.ordering && event.position != ui.discardPile))); - }, - content: function () { - player.removeSkill("jinglve2"); - }, - group: "jinglve3", - }, - jinglve3: { - audio: "jinglve", - trigger: { - global: ["loseAfter", "useCard", "phaseAfter", "cardsDiscardAfter", "loseAsyncAfter"], - }, - filter: function (event, player) { - if (event.player && event.player != player.storage.jinglve2) return false; - var card = player.storage.jinglve3; - if (event.name == "phase") return event.player.getCards("hej").includes(card); - if (event.name == "useCard") return event.cards.includes(card); - return get.position(card, true) == "d" && event.getd().includes(card); - }, - forced: true, - charlotte: true, - logTarget: "player", - content: function () { - if (trigger.name == "useCard") { - trigger.all_excluded = true; - trigger.targets.length = 0; - } else { - if (trigger.name == "phase") { - player.gain(player.storage.jinglve3, trigger.player, "giveAuto", "bySelf"); - } else if (get.position(player.storage.jinglve3, true) == "d") player.gain(player.storage.jinglve3, "gain2"); - } - player.removeSkill("jinglve2"); - }, - }, - shanli: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - juexingji: true, - forced: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return player.storage.baiyi && player.getStorage("jinglve4").length > 1; - }, - content: function () { - "step 0"; - player.awakenSkill("shanli"); - player.loseMaxHp(); - player.chooseTarget(true, "选择【擅立】的目标").set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target == game.me || (target.isUnderControl() && target.isOnline())) return 2 * att; - return att; - }); - "step 1"; - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - game.log(player, "拥立", target); - var list = []; - if (!_status.characterlist) { - if (_status.connectMode) var list = get.charactersOL(); - else { - var list = []; - for (var i in lib.character) { - if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue; - list.push(i); - } - } - game.countPlayer2(function (current) { - list.remove(current.name); - list.remove(current.name1); - list.remove(current.name2); - if (current.storage.rehuashen && current.storage.rehuashen.character) list.removeArray(current.storage.rehuashen.character); - }); - _status.characterlist = list; - } - _status.characterlist.randomSort(); - var chara = []; - var skills = []; - for (var i of _status.characterlist) { - if (i == "key_yuri") continue; - var character = lib.character[i]; - if (character && character[3]) { - for (var j of character[3]) { - if (skills.includes(j) || j == "yuri_wangxi" || target.hasSkill("j")) continue; - var info = get.info(j); - if (info && info.zhuSkill) { - skills.add(j); - chara.add(i); - continue; - } - } - } - if (skills.length >= 3) break; - } - if (!skills.length) { - event.finish(); - return; - } - event.chara = chara; - event.skills = skills; - player.chooseControl(skills).set("dialog", ["选择令" + get.translation(target) + "获得一个技能", [chara, "character"]]); - "step 2"; - target.addSkills(result.control); - target.setAvatarQueue(target.name1 || target.name, [event.chara[event.skills.indexOf(result.control)]]); - }, - ai: { - combo: "baiyi", - }, - }, - hongyi: { - audio: 2, - enable: "phaseUse", - usable: 1, - //filter:function(event,player){ - // return player.countCards('he')>=Math.min(2,game.dead.length); - //}, - //selectCard:function(){ - // return Math.min(2,game.dead.length); - //}, - //filterCard:true, - filterTarget: lib.filter.notMe, - check: function (card) { - var num = Math.min(2, game.dead.length); - if (!num) return 1; - if (num == 1) return 7 - get.value(card); - return 5 - get.value(card); - }, - position: "he", - content: function () { - player.addTempSkill("hongyi2", { player: "phaseBeginStart" }); - player.storage.hongyi2.add(target); - player.markSkill("hongyi2"); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (target.hasJudge("lebu")) return -0.5; - return -1 - target.countCards("h"); - }, - }, - }, - }, - hongyi2: { - audio: "hongyi", - trigger: { global: "damageBegin1" }, - charlotte: true, - forced: true, - logTarget: "source", - filter: function (event, player) { - return player.storage.hongyi2.includes(event.source); - }, - content: function () { - "step 0"; - trigger.source.judge(); - "step 1"; - if (result.color == "black") trigger.num--; - else trigger.player.draw(); - }, - onremove: true, - intro: { - content: "已选中$为技能目标", - }, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - }, - requanfeng: { - audio: "quanfeng", - enable: "chooseToUse", - limited: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return event.type == "dying" && player == event.dying; - }, - content: function () { - player.awakenSkill("requanfeng"); - player.gainMaxHp(2); - player.recover(4); - }, - ai: { - save: true, - skillTagFilter: function (player, tag, arg) { - return player == arg; - }, - order: 10, - result: { - player: 1, - }, - }, - group: "requanfeng_gain", - }, - requanfeng_gain: { - audio: "quanfeng", - trigger: { global: "die" }, - filter: function (event, player) { - return ( - player.hasSkill("hongyi") && - event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { - var info = get.info(skill); - return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; - }).length > 0 - ); - }, - logTarget: "player", - skillAnimation: true, - animationColor: "thunder", - prompt2: "(限定技)失去技能【劝封】,并获得该角色武将牌上的所有技能,然后加1点体力上限并回复1点体力", - check: (event, player) => { - if ( - event.player - .getStockSkills("仲村由理", "天下第一") - .filter(skill => { - let info = get.info(skill); - return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; - }) - .some(i => { - let info = get.info(i); - if (info && info.ai) return info.ai.neg || info.ai.halfneg; - }) - ) - return false; - return true; - }, - content: function () { - player.awakenSkill("requanfeng"); - player.removeSkills("hongyi"); - var skills = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { - var info = get.info(skill); - return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; - }); - if (skills.length) { - player.addSkills(skills); - game.broadcastAll(function (list) { - game.expandSkills(list); - for (var i of list) { - var info = lib.skill[i]; - if (!info) continue; - if (!info.audioname2) info.audioname2 = {}; - info.audioname2.yanghuiyu = "quanfeng"; - } - }, skills); - } - player.gainMaxHp(); - player.recover(); - }, - }, - quanfeng: { - audio: 2, - trigger: { global: "die" }, - filter: function (event, player) { - return ( - event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { - var info = get.info(skill); - return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; - }).length > 0 - ); - }, - logTarget: "player", - skillAnimation: true, - limited: true, - forced: true, - animationColor: "thunder", - content: function () { - "step 0"; - player.awakenSkill("quanfeng"); - var list = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { - var info = get.info(skill); - return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; - }); - if (list.length == 1) event._result = { control: list[0] }; - else - player - .chooseControl(list) - .set("prompt", "选择获得" + get.translation(trigger.player) + "的一个技能") - .set("forceDie", true) - .set("ai", function () { - return list.randomGet(); - }); - "step 1"; - player.addSkills(result.control); - game.broadcastAll(function (skill) { - var list = [skill]; - game.expandSkills(list); - for (var i of list) { - var info = lib.skill[i]; - if (!info) continue; - if (!info.audioname2) info.audioname2 = {}; - info.audioname2.yanghuiyu = "quanfeng"; - } - }, result.control); - player.gainMaxHp(); - player.recover(); - }, - }, - //手杀界朱然 - //设计师你改技能有瘾🐴 - mobiledanshou: { - trigger: { global: "phaseJieshuBegin" }, - audio: 2, - direct: true, - filter: function (event, player) { - if (player == event.player) return false; - var num = event.player.getHistory("useCard", function (evt) { - return evt.targets.includes(player); - }).length; - return num == 0 || (event.player.isIn() && num <= player.countCards("he")); - }, - content: function () { - "step 0"; - var num = trigger.player.getHistory("useCard", function (evt) { - return evt.targets.includes(player); - }).length; - event.num = num; - if (num == 0) { - if (player.hasSkill("mobiledanshou")) event._result = { bool: true }; - else player.chooseBool("是否发动【胆守】摸一张牌?", lib.translate.mobiledanshou_info); - } else event.goto(2); - "step 1"; - if (result.bool) { - player.logSkill("mobiledanshou"); - player.draw(); - } - event.finish(); - "step 2"; - player - .chooseToDiscard(num, get.prompt("mobiledanshou", trigger.player), "弃置" + get.translation(num) + "张牌并对其造成1点伤害", "he") - .set("ai", function (card) { - if (!_status.event.goon) return 0; - var num = _status.event.getParent().num; - if (num == 1) return 8 - get.value(card); - if (num == 2) return 6.5 - get.value(card); - return 5 - get.value(card); - }) - .set("goon", get.damageEffect(trigger.player, player, player) > 0).logSkill = ["mobiledanshou", trigger.player]; - "step 3"; - if (result.bool) { - player.addExpose(0.2); - trigger.player.damage(); - } - }, - }, - //丁原 - //程序员和设计师至少有一个脑子有坑 - beizhu: { - audio: 3, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (target) { - return lib.skill.beizhu.filterTarget(null, player, target); - }); - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.addTempSkill("beizhu_draw"); - player.viewHandcards(target); - "step 1"; - var cards = target.getCards("h", "sha"); - if (cards.length) { - event.cards = cards; - event.goto(5); - } else player.discardPlayerCard("he", target, "visible", true); - "step 2"; - player.chooseBool("是否令" + get.translation(target) + "获得一张【杀】?").set("choice", get.attitude(player, target) > 0); - "step 3"; - if (result.bool) { - var card = get.cardPile2(function (card) { - return card.name == "sha"; - }); - if (card) target.gain(card, "gain2"); - } else event.finish(); - "step 4"; - game.updateRoundNumber(); - event.finish(); - "step 5"; - var hs = target.getCards("h"); - cards = cards.filter(function (card) { - return ( - hs.includes(card) && - get.name(card, target) == "sha" && - target.canUse( - { - name: "sha", - isCard: true, - cards: [card], - }, - player, - false - ) - ); - }); - if (cards.length) { - var card = cards.randomRemove(1)[0]; - target.useCard(player, false, card).card.beizhu = true; - event.redo(); - } - }, - ai: { - order: 7, - threaten: 1.14 + 5.14, - result: { - player: function (player, target) { - var eff = get.effect(target, { name: "guohe_copy2" }, player, player); - var cards = target.getCards("h", { name: "sha" }); - if (!cards.length) return eff; - return eff / (cards.length + 3); - }, - }, - }, - }, - beizhu_draw: { - trigger: { player: "damageEnd" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return event.card && event.card.beizhu; - }, - content: function () { - player.draw(trigger.num); - }, - }, - //新简雍 - xinqiaoshui: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) player.addTempSkill("qiaoshui3", "phaseUseEnd"); - else { - player.addTempSkill("qiaoshui2", "phaseUseEnd"); - } - }, - ai: { - order: function (item, player) { - if ( - player.countCards("h", function (card) { - return player.hasValueTarget(card); - }) - ) - return 10; - return 1; - }, - result: { - target: function (player, target) { - if ( - player.countCards("h", function (card) { - return player.hasValueTarget(card); - }) - ) { - if (player.hasSkill("qiaoshui3")) return 0; - var nd = !player.needsToDiscard(); - if ( - player.hasCard(function (card) { - if (get.position(card) != "h") return false; - var val = get.value(card); - if (nd && val < 0) return true; - if (val <= 5) { - return card.number >= 12; - } - if (val <= 6) { - return card.number >= 13; - } - return false; - }) - ) - return -1; - return 0; - } - return -1; - }, - }, - }, - }, - xinjyzongshi: { - audio: 2, - trigger: { - player: ["chooseToCompareAfter", "compareMultipleAfter"], - target: ["chooseToCompareAfter", "compareMultipleAfter"], - }, - filter: function (event, player) { - if (event.preserve) return false; - if (event.name == "compareMultiple") return true; - return !event.compareMultiple; - }, - frequent: true, - content: function () { - "step 0"; - var str = '
    牌堆顶'; - var cards = get.cards(); - if (trigger.name == "chooseToCompare" && trigger.compareMeanwhile) { - var result = trigger.result; - var list = [[result.num1[0], result.player]]; - list.addArray( - result.num2.map(function (card, i) { - return [card, result.targets[i]]; - }) - ); - list.sort(function (a, b) { - return a[0] - b[0]; - }); - if (list[0][0] < list[1][0] && get.position(list[0][1], true) == "o") { - str += "/拼点牌"; - cards.push(list[0][1]); - } - } else { - if (player == trigger.player) { - if (trigger.num1 > trigger.num2 && get.position(trigger.card2, true) == "o") { - str += "/拼点牌"; - cards.push(trigger.card2); - } else if (trigger.num1 < trigger.num2 && get.position(trigger.card1, true) == "o") { - str += "/拼点牌"; - cards.push(trigger.card1); - } - } else { - if (trigger.num1 < trigger.num2 && get.position(trigger.card1, true) == "o") { - str += "/拼点牌"; - cards.push(trigger.card1); - } else if (trigger.num1 > trigger.num2 && get.position(trigger.card2, true) == "o") { - str += "/拼点牌"; - cards.push(trigger.card2); - } - } - } - str += "
    "; - event.cards = cards; - player.chooseButton(["纵适:选择要获得的牌", str, cards], true).set("ai", get.buttonValue); - "step 1"; - if (result.bool) { - var draw = result.links[0] == cards[0]; - player.gain(result.links, draw ? "draw" : "gain2").log = false; - game.log(player, "获得了", draw ? "牌堆顶的一张牌" : result.links); - if (!draw) { - cards[0].fix(); - ui.cardPile.insertBefore(cards[0], ui.cardPile.firstChild); - game.updateRoundNumber(); - } - } - }, - }, - //通渠张恭 - rezhenxing: { - audio: "xinfu_zhenxing", - trigger: { - player: ["damageEnd", "phaseJieshuBegin"], - }, - frequent: true, - content: function () { - "step 0"; - event.cards = get.cards(3); - player - .chooseButton(["【镇行】:请选择要获得的牌", event.cards]) - .set("filterButton", function (button) { - var cards = _status.event.cards; - for (var i = 0; i < cards.length; i++) { - if (button.link != cards[i] && get.suit(cards[i]) == get.suit(button.link)) return false; - } - return true; - }) - .set("ai", function (button) { - return get.value(button.link); - }) - .set("cards", event.cards); - "step 1"; - for (var i = event.cards.length - 1; i >= 0; i--) { - if (result.bool && result.links.includes(event.cards[i])) { - player.gain(event.cards[i], "gain2"); - } else { - event.cards[i].fix(); - ui.cardPile.insertBefore(event.cards[i], ui.cardPile.childNodes[0]); - } - } - game.updateRoundNumber(); - }, - }, - //芙蓉,手杀界廖化,手杀界曹彰 - rejiangchi: { - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - direct: true, - content: function () { - "step 0"; - var list = ["弃牌", "摸牌", "取消"]; - if (!player.countCards("he")) list.remove("弃牌"); - player - .chooseControl(list, function () { - var player = _status.event.player; - if (list.includes("弃牌")) { - if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) { - return "弃牌"; - } - if (player.countCards("h", "sha") > 2) { - return "弃牌"; - } - } - if (!player.countCards("h", "sha")) { - return "摸牌"; - } - return "cancel2"; - }) - .set("prompt", get.prompt2("rejiangchi")); - "step 1"; - if (result.control == "弃牌") { - player.chooseToDiscard(true, "he"); - player.addTempSkill("jiangchi2", "phaseUseEnd"); - player.logSkill("rejiangchi"); - } else if (result.control == "摸牌") { - player.draw(); - player.addTempSkill("rejiangchi3", "phaseUseEnd"); - player.logSkill("rejiangchi"); - } - }, - }, - rejiangchi3: { - mod: { - cardEnabled: function (card) { - if (card.name == "sha") return false; - }, - }, - }, - refuli: { - skillAnimation: true, - animationColor: "soil", - audio: 2, - unique: true, - limited: true, - enable: "chooseToUse", - mark: true, - filter: function (event, player) { - if (event.type != "dying") return false; - if (player != event.dying) return false; - return true; - }, - content: function () { - "step 0"; - player.awakenSkill("refuli"); - event.num = game.countGroup(); - if (event.num > player.hp) player.recover(event.num - player.hp); - "step 1"; - if (player.isMaxHp(true)) player.turnOver(); - }, - ai: { - save: true, - skillTagFilter: function (player, arg, target) { - return player == target; - }, - result: { - player: 10, - }, - threaten: function (player, target) { - if (!target.storage.refuli) return 0.9; - }, - }, - }, - redangxian: { - trigger: { player: "phaseBegin" }, - forced: true, - audio: "dangxian", - audioname: ["guansuo", "xin_liaohua"], - content: function () { - "step 0"; - var card = get.discardPile(function (card) { - return card.name == "sha"; - }); - if (card) player.gain(card, "gain2"); - "step 1"; - game.updateRoundNumber(); - var next = player.phaseUse(); - event.next.remove(next); - trigger.next.push(next); - }, - }, - xuewei: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("xuewei"), lib.filter.notMe).set("ai", function (target) { - var player = _status.event.player; - if (player == get.zhu(player) && player.hp <= 2) return 0; - return get.attitude(player, target) - 4; - }).animate = false; - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("xuewei"); - player.addTempSkill("xuewei2", { player: "phaseBegin" }); - player.storage.xuewei2 = target; - } - }, - ai: { - threaten: 1.05, - }, - }, - xuewei2: { - audio: "xuewei", - forced: true, - onremove: true, - trigger: { global: "damageBegin4" }, - charlotte: true, - filter: function (event, player) { - return event.player == player.storage.xuewei2; - }, - logTarget: "player", - content: function () { - player.removeSkill("xuewei2"); - trigger.cancel(); - player.damage(trigger.num, trigger.source || "nosource"); - if (trigger.source && trigger.source.isIn()) trigger.source.damage(trigger.num, trigger.nature, player); - }, - }, - liechi: { - trigger: { player: "dying" }, - forced: true, - filter: function (event, player) { - return event.getParent().name == "damage" && event.source && event.source.countCards("he"); - }, - audio: 2, - content: function () { - trigger.source.chooseToDiscard("he", true); - }, - }, - rejiuchi: { - group: ["jiuchi"], - audioname: ["re_dongzhuo"], - trigger: { source: "damage" }, - forced: true, - popup: false, - locked: false, - audio: "jiuchi", - filter: function (event, player) { - return event.card && event.card.name == "sha" && event.getParent(2).jiu == true && !player.hasSkill("rejiuchi_air"); - }, - content: function () { - player.logSkill("jiuchi"); - player.addTempSkill("rejiuchi_air"); - }, - subSkill: { - air: {}, - }, - }, - //苏飞,新贾逵 - tongqu: { - audio: 2, - trigger: { - global: ["phaseBefore", "dying", "phaseDrawBegin2"], - player: ["enterGame", "phaseZhunbeiBegin"], - }, - direct: true, - filter: function (event, player) { - if (event.name == "phaseDraw") return event.player.hasMark("tongqu"); - if (event.name == "dying") return event.player.hasMark("tongqu"); - if (event.name == "phaseZhunbei") - return game.hasPlayer(function (current) { - return !current.hasMark("tongqu"); - }); - return !player.hasMark("tongqu") && (event.name != "phase" || game.phaseNumber == 0); - }, - content: function () { - "step 0"; - if (trigger.name == "phaseDraw") { - player.logSkill("tongqu", trigger.player); - trigger.player.draw("nodelay"); - trigger.player.addTempSkill("tongqu2", "phaseDrawAfter"); - event.finish(); - } else if (trigger.name == "dying") { - player.logSkill("tongqu", trigger.player); - trigger.player.removeMark("tongqu", 1); - event.finish(); - } else if (trigger.name == "phaseZhunbei") { - player - .chooseTarget(get.prompt2("tongqu"), function (card, player, target) { - return !target.hasMark("tongqu"); - }) - .set("ai", function (target) { - if (_status.event.player.hp < 3) return 0; - return get.attitude(_status.event.player, target); - }); - } else { - player.logSkill("tongqu"); - player.addMark("tongqu", 1); - event.finish(); - } - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.loseHp(); - player.logSkill("tongqu", target); - target.addMark("tongqu", 1); - } - }, - marktext: "渠", - intro: { content: "mark", name2: "渠" }, - }, - tongqu2: { - trigger: { player: "phaseDrawEnd" }, - forced: true, - silent: true, - filter: function (event, player) { - var bool = game.hasPlayer(function (current) { - return current != player && current.hasMark("tongqu"); - }); - return ( - player.countCards("he", function (card) { - if (bool) return true; - return lib.filter.cardDiscardable(card, player); - }) > 0 - ); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - forced: true, - position: "he", - filterCard: true, - filterTarget: function (card, player, target) { - return player != target && target.hasMark("tongqu"); - }, - selectTarget: function () { - if (ui.selected.cards.length && !lib.filter.cardDiscardable(ui.selected.cards[0], _status.event.player)) return [1, 1]; - return [0, 1]; - }, - prompt: "弃置一张牌,或将一张牌交给一名有“渠”的其他角色", - ai1: function (card) { - var player = _status.event.player; - if (get.name(card) == "du") return 20; - if (get.position(card) == "e" && get.value(card) <= 0) return 14; - if ( - get.position(card) == "h" && - game.hasPlayer(function (current) { - return current != player && current.hasMark("tongqu") && get.attitude(player, current) > 0 && current.getUseValue(card) > player.getUseValue(card) && current.getUseValue(card) > player.getUseValue(card); - }) - ) - return 12; - if ( - game.hasPlayer(function (current) { - return current != player && current.hasMark("tongqu") && get.attitude(player, current) > 0; - }) - ) { - if (card.name == "wuxie") return 11; - if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; - } - return 6 / Math.max(1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player; - var card = ui.selected.cards[0]; - var att = get.attitude(player, target); - if (card.name == "du") return -6 * att; - if (att > 0) { - if (get.position(card) == "h" && target.getUseValue(card) > player.getUseValue(card)) return 4 * att; - if (target.hasUseTarget(card)) return 2 * att; - return 1.2 * att; - } - return 0; - }, - }); - "step 1"; - if (result.bool) { - if (result.targets.length) { - event.target = result.targets[0]; - player.give(result.cards, event.target); - event.card = result.cards[0]; - } else { - player.discard(result.cards); - event.finish(); - } - } - "step 2"; - if (target.getCards("h").includes(card) && get.type(card) == "equip") { - target.chooseUseTarget(card, true); - } - }, - }, - xinwanlan: { - audio: "wanlan", - trigger: { global: "damageBegin4" }, - filter: function (event, player) { - return event.player.hp <= event.num && player.countCards("e") >= 1; - }, - logTarget: "player", - check: function (event, player) { - if (get.attitude(player, event.player) < 4) return false; - if (player.countCards("hs", card => player.canSaveCard(card, event.player)) >= 1 + event.num - event.player.hp) return false; - if (event.player == player || event.player == get.zhu(player)) return true; - return !player.hasUnknown(); - }, - content: function () { - player.discard(player.getCards("e")); - trigger.cancel(); - }, - }, - zhengjian: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - locked: true, - direct: true, - content: function () { - "step 0"; - player.chooseTarget("请选择【诤荐】的目标", lib.translate.zhengjian_info).set("ai", function (target) { - if (target.hasSkill("zhengjian_mark")) return 0; - if (player == target) return 0.5; - return get.attitude(_status.event.player, target) * (1 + target.countCards("h")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("zhengjian", target); - target.addSkill("zhengjian_mark"); - } - }, - group: "zhengjian_draw", - ai: { - notemp: true, - }, - }, - zhengjian_draw: { - audio: "zhengjian", - trigger: { player: "phaseBegin" }, - forced: true, - filter: function (event) { - return game.hasPlayer(function (current) { - return current.hasSkill("zhengjian_mark"); - }); - }, - logTarget: function (event) { - return game.filterPlayer(function (current) { - return current.hasSkill("zhengjian_mark"); - }); - }, - content: function () { - "step 0"; - var list = game.filterPlayer(function (current) { - return current.countMark("zhengjian_mark") > 0; - }); - if (list.length > 1) { - event.delay = true; - game.asyncDraw(list, function (target) { - return Math.min(5, target.maxHp, target.countMark("zhengjian_mark")); - }); - } else if (list.length == 1) list[0].draw(Math.min(5, list[0].maxHp, list[0].countMark("zhengjian_mark"))); - "step 1"; - game.countPlayer(function (current) { - current.removeSkill("zhengjian_mark"); - }); - if (event.delay) game.delayx(); - }, - }, - zhengjian_mark: { - trigger: { player: ["useCard1", "respond"] }, - silent: true, - firstDo: true, - onremove: true, - charlotte: true, - content: function () { - player.addMark("zhengjian_mark", 1, false); - }, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = 0; - }, - mark: true, - intro: { - content: "已使用/打出过#张牌", - }, - }, - gaoyuan: { - audio: 2, - trigger: { target: "useCardToTarget" }, - direct: true, - filter: function (event, player) { - if (event.card.name != "sha") return false; - if (player.countCards("he") == 0) return false; - return game.hasPlayer(function (current) { - return current != event.player && current != player && current.hasSkill("zhengjian_mark") && lib.filter.targetEnabled(event.card, event.player, current); - }); - }, - content: function () { - "step 0"; - var next = player.chooseCardTarget({ - position: "he", - filterCard: lib.filter.cardDiscardable, - filterTarget: function (card, player, target) { - var trigger = _status.event; - if (target != player && target != trigger.source) { - if (target.hasSkill("zhengjian_mark") && lib.filter.targetEnabled(trigger.card, trigger.source, target)) return true; - } - return false; - }, - ai1: function (card) { - return get.unuseful(card) + 9; - }, - ai2: function (target) { - if (_status.event.player.countCards("h", "shan")) { - return -get.attitude(_status.event.player, target); - } - if (get.attitude(_status.event.player, target) < 5) { - return 6 - get.attitude(_status.event.player, target); - } - if (_status.event.player.hp == 1 && player.countCards("h", "shan") == 0) { - return 10 - get.attitude(_status.event.player, target); - } - if (_status.event.player.hp == 2 && player.countCards("h", "shan") == 0) { - return 8 - get.attitude(_status.event.player, target); - } - return -1; - }, - prompt: get.prompt("gaoyuan"), - prompt2: "弃置一张牌,将此【杀】转移给一名有“诤”的角色", - source: trigger.player, - card: trigger.card, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill(event.name, target); - player.discard(result.cards); - var evt = trigger.getParent(); - evt.triggeredTargets2.remove(player); - evt.targets.remove(player); - evt.targets.push(target); - } - }, - ai: { - combo: "zhengjian", - }, - }, - //一 将 成 名 - zhilve: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - content: function () { - "step 0"; - if (!player.canMoveCard()) event._result = { index: 1 }; - else - player - .chooseControl() - .set("choiceList", ["移动场上的一张牌", "本回合的摸牌阶段多摸一张牌且第一张杀无距离次数限制"]) - .set("ai", function () { - return 1; - }); - "step 1"; - if (result.index == 1) { - player.addTempSkill("zhilve_yingzi"); - if ( - !player.getHistory("useCard", function (card) { - return card.card.name == "sha"; - }).length - ) - player.addTempSkill("zhilve_xiandeng"); - event.finish(); - } else player.moveCard(true); - "step 2"; - if (result.position == "e") player.loseHp(); - else player.addTempSkill("zhilve_dis"); - }, - subSkill: { - dis: { - mod: { - maxHandcard: function (player, num) { - return num - 1; - }, - }, - }, - yingzi: { - trigger: { player: "phaseDrawBegin2" }, - popup: false, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.num++; - }, - }, - xiandeng: { - mod: { - targetInRange: function (card, player) { - if (card.name == "sha") return true; - }, - }, - trigger: { player: "useCard1" }, - forced: true, - popup: false, - firstDo: true, - filter: function (event, player) { - return event.card.name == "sha"; - }, - content: function () { - player.removeSkill(event.name); - if (trigger.addCount !== false) { - trigger.addCount = false; - var stat = player.getStat("card"); - if (stat && stat.sha) stat.sha--; - } - }, - }, - }, - }, - xhzhiyan: { - enable: "phaseUse", - audio: 2, - filter: function (event, player) { - return player.countCards("h") != player.maxHp; - }, - filterCard: true, - selectCard: function () { - var player = _status.event.player; - var num = Math.max(0, player.countCards("h") - player.maxHp); - return [num, num]; - }, - check: function (card) { - var player = _status.event.player; - if ( - player.getUseValue(card) <= 0 && - game.hasPlayer(function (current) { - return current != player && get.value(card, current) * get.attitude(player, current) > 0; - }) - ) - return 1; - return 0; - }, - content: function () { - "step 0"; - if (!cards.length) { - player.draw(player.maxHp - player.countCards("h")); - player.addTempSkill("zishou2"); - event.finish(); - } else { - cards = cards.filterInD("d"); - if (cards.length) - player.chooseButton(["是否将其中的一张牌交给一名其他角色?", cards]).set("", function (button) { - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return current != player && get.value(button.link, current) * get.attitude(player, current) > 0; - }) - ) - return Math.abs(get.value(button.link)); - return 0; - }); - else event.finish(); - } - "step 1"; - if (result.bool && game.hasPlayer(current => current != player)) { - event.card = result.links[0]; - player.chooseTarget(true, lib.filter.notMe, "选择一名其他角色获得" + get.translation(event.card)).set("ai", function (target) { - return get.value(_status.event.getParent().card, target) * get.attitude(_status.event.player, target); - }); - } else event.finish(); - "step 2"; - var target = result.targets[0]; - player.line(target, "green"); - target.gain(card, "gain2", "log"); - }, - ai: { - order: function (obj, player) { - if (player.countCards("h") > player.maxHp) return 10; - return 0.5; - }, - result: { - player: 1, - }, - }, - }, - //水 果 忍 者 - zhengjing_guanju: { audio: true }, - zhengjing: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return !player.hasSkill("zhengjing3"); - }, - content: function () { - "step 0"; - //game.trySkillAudio('zhengjing_guanju',player); - if (_status.connectMode) event.time = lib.configOL.choose_timeout; - var cards = []; - var names = []; - while (true) { - var card = get.cardPile(function (carde) { - return carde.name != "du" && !names.includes(carde.name); - }); - if (card) { - cards.push(card); - names.push(card.name); - if (get.mode() == "doudizhu") { - if (cards.length == 1 && !get.isLuckyStar(player) && Math.random() < 0.33) break; - if (cards.length == 2 && !get.isLuckyStar(player) && Math.random() < 0.5) break; - if (cards.length >= 3) break; - } else { - if (cards.length == 3 && !get.isLuckyStar(player) && Math.random() < 0.33) break; - if (cards.length == 4 && !get.isLuckyStar(player) && Math.random() < 0.5) break; - if (cards.length >= 5) break; - } - } else break; - } - event.cards = cards; - if (!cards.length) { - event.finish(); - return; - } - event.videoId = lib.status.videoId++; - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - names.remove("du"); - game.pause(); - game.countChoose(); - setTimeout(function () { - _status.imchoosing = false; - event._result = { - bool: true, - links: names.slice(0), - }; - if (event.dialog) event.dialog.close(); - if (event.control) event.control.close(); - game.resume(); - }, 5000); - }; - var createDialog = function (player, id) { - if (_status.connectMode) lib.configOL.choose_timeout = "30"; - if (player == game.me) return; - var str = get.translation(player) + "正在整理经书...
    "; - ui.create.dialog(str).videoId = id; - }; - var chooseButton = function (list) { - var roundmenu = false; - if (ui.roundmenu && ui.roundmenu.display != "none") { - roundmenu = true; - ui.roundmenu.style.display = "none"; - } - var event = _status.event; - event.settleed = false; - event.finishedx = []; - event.map = {}; - var names = list.slice(0); - event.zhengjing_nodes = []; - names.push("du"); - names.randomSort(); - var names2 = names.slice(0); - for (var i = 0; i < 2; i++) { - names2.randomSort(); - names = names.concat(names2); - } - - event.zhengjing = names; - for (var i of list) { - event.map[i] = 0; - } - event.dialog = ui.create.dialog("forcebutton", "hidden"); - event.dialog.textPrompt = event.dialog.add('
    及时点击卡牌,但不要点到毒了!
    '); - var str = '
    '; - for (var i of list) { - str += get.translation(i) + ":" + Math.min(2, event.map[i]) + "/2 "; - } - str += "
    "; - event.dialog.textPrompt2 = event.dialog.add(str); - event.switchToAuto = function () { - event._result = { - bool: true, - links: event.finishedx.slice(0), - }; - event.dialog.close(); - game.resume(); - _status.imchoosing = false; - if (roundmenu) ui.roundmenu.style.display = ""; - }; - event.dialog.classList.add("fixed"); - event.dialog.classList.add("scroll1"); - event.dialog.classList.add("scroll2"); - event.dialog.classList.add("fullwidth"); - event.dialog.classList.add("fullheight"); - event.dialog.classList.add("noupdate"); - event.dialog.open(); - event.settle = function (du) { - if (event.settleed) return; - event.settleed = true; - event.dialog.textPrompt2.innerHTML = ""; - if (du) { - if (lib.config.background_speak) game.playAudio("skill", "zhengjing_boom"); - event.dialog.textPrompt.innerHTML = '
    叫你别点毒你非得点 这下翻车了吧
    '; - } else { - if (lib.config.background_speak) game.playAudio("skill", "zhengjing_finish"); - event.dialog.textPrompt.innerHTML = '
    整理经典结束!共整理出' + get.cnNumber(event.finishedx.length) + "份经典
    "; - } - while (event.zhengjing_nodes.length) { - event.zhengjing_nodes.shift().delete(); - } - setTimeout(function () { - event.switchToAuto(); - }, 1000); - }; - - var click = function () { - var name = this.name; - if (name == "du") { - event.zhengjing.length = 0; - event.settle(true); - } else { - if (lib.config.background_speak) game.playAudio("skill", "zhengjing_click"); - event.map[name]++; - if (event.map[name] > 1) event.finishedx.add(name); - if (event.finishedx.length < list.length) { - var str = '
    '; - for (var i of list) { - str += get.translation(i) + ":" + Math.min(2, event.map[i]) + "/2 "; - } - str += "
    "; - event.dialog.textPrompt2.innerHTML = str; - } else { - event.zhengjing.length = 0; - event.settle(); - } - } - event.zhengjing_nodes.remove(this); - this.style.transition = "all 0.5s"; - this.style.transform = "scale(1.2)"; - this.delete(); - }; - var addNode = function () { - if (event.zhengjing.length) { - var card = ui.create.card(ui.special, "noclick", true); - card.init(["", "", event.zhengjing.shift()]); - card.addEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", click); - event.zhengjing_nodes.push(card); - card.style.position = "absolute"; - var rand1 = Math.round(Math.random() * 100); - var rand2 = Math.round(Math.random() * 100); - var rand3 = Math.round(Math.random() * 40) - 20; - card.style.left = "calc(" + rand1 + "% - " + rand1 + "px)"; - card.style.top = "calc(" + rand2 + "% - " + rand2 + "px)"; - card.style.transform = "scale(0.8) rotate(" + rand3 + "deg)"; - card.style.opacity = 0; - event.dialog.appendChild(card); - ui.refresh(card); - card.style.opacity = 1; - card.style.transform = "scale(1) rotate(" + rand3 + "deg)"; - } - if (event.zhengjing_nodes.length > (event.zhengjing.length > 0 ? 2 : 0)) event.zhengjing_nodes.shift().delete(); - if (event.zhengjing.length || event.zhengjing_nodes.length) - setTimeout(function () { - addNode(); - }, 800); - else event.settle(); - }; - - game.pause(); - game.countChoose(); - addNode(); - }; - //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog, player, event.videoId); - if (event.isMine()) { - chooseButton(names); - } else if (event.isOnline()) { - event.player.send(chooseButton, names); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 1"; - game.broadcastAll( - function (id, time) { - if (_status.connectMode) lib.configOL.choose_timeout = time; - var dialog = get.idDialog(id); - if (dialog) { - dialog.close(); - } - }, - event.videoId, - event.time - ); - var result = event.result || result; - for (var i = 0; i < cards.length; i++) { - //if(cards.length==1) break; - if (!result.links.includes(cards[i].name)) cards.splice(i--, 1); - } - if (cards.length) { - player.showCards(cards, get.translation(player) + "整理出了以下经典"); - game.cardsGotoOrdering(cards); - } else { - game.log(player, "并没有整理出经典"); - player.popup("杯具"); - event.finish(); - } - "step 2"; - game.updateRoundNumber(); - player.chooseTarget(true, "将整理出的经典置于一名角色的武将牌上").set("ai", function (target) { - if (target.hasSkill("xinfu_pdgyingshi")) return 0; - var player = _status.event.player; - var cards = _status.event.getParent().cards; - var att = get.attitude(player, target); - return -att; - //if(cards.length==1) return -att; - // if(player==target) att/=2; - // if(target.hasSkill('pingkou')) att*=1.4; - // att*=(1+target.countCards('j')/2); - // return att; - }); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "thunder"); - } - "step 4"; - if (cards.length == 1) { - event._result = { bool: true, moved: [cards, []] }; - return; - } - var next = player.chooseToMove("整经:请分配整理出的经典", true); - next.set("list", [["置于" + get.translation(target) + "的武将牌上", cards], ["自己获得"]]); - next.set("filterMove", function (from, to, moved) { - if (moved[0].length == 1 && to == 1 && from.link == moved[0][0]) return false; - return true; - }); - next.set("filterOk", function (moved) { - return moved[0].length > 0; - }); - next.set("processAI", function (list) { - var cards = list[0][1].slice(0).sort(function (a, b) { - return get.value(a) - get.value(b); - }); - return [cards.splice(0, 1), cards]; - }); - "step 5"; - if (result.bool) { - var cards = result.moved[0], - gains = result.moved[1]; - target.addSkill("zhengjing2"); - target.addToExpansion(cards, "gain2").gaintag.add("zhengjing2"); - if (gains.length) player.gain(gains, "gain2"); - } - }, - ai: { - order: 10, - result: { player: 1 }, - threaten: 3.2, - }, - }, - //恁就是仲村由理? - zhengjing2: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - charlotte: true, - intro: { content: "expansion", markcount: "expansion" }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - content: function () { - "step 0"; - player.gain(player.getExpansions("zhengjing2"), "gain2"); - player.skip("phaseJudge"); - player.skip("phaseDraw"); - "step 1"; - player.removeSkill("zhengjing2"); - }, - }, - zhengjing3: {}, - //邓芝 - jimeng: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countGainableCards(player, "he") > 0; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("jimeng"), function (card, player, target) { - return target != player && target.countGainableCards(player, "he") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - if (player.hp > 1 && get.attitude(player, target) < 2) return 0; - return get.effect(target, { name: "shunshou" }, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("jimeng", target); - player.gainPlayerCard(target, "he", true); - } else event.finish(); - "step 2"; - var hs = player.getCards("he"); - if (player.hp > 0 && hs.length) { - if (hs.length <= player.hp) event._result = { bool: true, cards: hs }; - else player.chooseCard(player.hp, true, "交给" + get.translation(target) + get.cnNumber(player.hp) + "张牌", "he", true); - } else event.finish(); - "step 3"; - player.give(result.cards, target); - }, - }, - shuaiyan: { - audio: 2, - trigger: { player: "phaseDiscardBegin" }, - filter: function (event, player) { - return player.countCards("h") > 1; - }, - check: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("he") && lib.skill.shuaiyan.check2(current, player); - }); - }, - check2: function (target, player) { - if (get.itemtype(player) != "player") player = _status.event.player; - return -get.attitude(player, target) / target.countCards("he"); - }, - content: function () { - "step 0"; - player.showHandcards(get.translation(player) + "发动了【率言】"); - "step 1"; - var filter = function (card, player, target) { - return player != target && target.countCards("he") > 0; - }; - if ( - game.hasPlayer(function (current) { - return filter("我约等于白板", player, current); - }) - ) { - player.chooseTarget(true, filter, "选择一名其他角色,令其交给你一张牌").set("ai", lib.skill.shuaiyan.check2); - } else event.finish(); - "step 2"; - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); - "step 3"; - target.give(result.cards, player); - }, - }, - relihuo: { - audio: 2, - group: ["relihuo_baigei", "relihuo_damage"], - trigger: { player: "useCard1" }, - filter: function (event, player) { - if (event.card.name == "sha" && !game.hasNature(event.card)) return true; - }, - check: function (event, player) { - return false; - }, - content: function () { - game.setNature(trigger.card, "fire"); - trigger.relihuo = true; - }, - }, - relihuo_damage: { - trigger: { source: "damageBegin1" }, - forced: true, - audio: "relihuo", - filter: function (event, player) { - return event.getParent(2).relihuo == true && event.player.isLinked(); - }, - content: function () { - trigger.num++; - }, - }, - relihuo_baigei: { - trigger: { player: "useCardAfter" }, - forced: true, - audio: "relihuo", - filter: function (event, player) { - if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; - var num = 0; - player.getHistory("sourceDamage", function (evt) { - if (evt.card == event.card) num += evt.num; - }); - return num > 1; - }, - content: function () { - var num = 0; - player.getHistory("sourceDamage", function (evt) { - if (evt.card == trigger.card) num += evt.num; - }); - player.loseHp(Math.floor(num / 2)); - }, - }, - gongsun: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 1; - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: get.prompt2("gongsun"), - selectCard: 2, - filterCard: lib.filter.cardDiscardable, - filterTarget: lib.filter.notMe, - position: "he", - ai1: function (card) { - var friend = 0, - enemy = 0, - player = _status.event.player; - var num = game.countPlayer(function (target) { - var att = get.attitude(player, target); - if (att < 0) enemy++; - if (target != player && att > 0) friend++; - return true; - }); - if (num > friend + enemy + 2) return 0; - if (friend < enemy) return 0; - if (card.name == "sha") return 10 - enemy; - return 10 - enemy - get.value(card); - }, - ai2: function (target) { - return -get.attitude(_status.event.player, target) * (1 + target.countCards("h")); - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("gongsun", target); - player.discard(result.cards); - player.addTempSkill("gongsun_shadow", { player: ["phaseBegin", "die"] }); - var list = []; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - if (get.type(name) == "trick") list.push(["锦囊", "", name]); - else if (get.type(name) == "basic") list.push(["基本", "", name]); - } - player.chooseButton(["请选择一个牌名", [list, "vcard"], true]).set("ai", function (button) { - return button.link[2] == "sha" ? 1 : 0; - }); - } else event.finish(); - "step 2"; - player.storage.gongsun_shadow.push([target, result.links[0][2]]); - player.popup(result.links[0][2], "soil"); - game.log(player, "选择了", "" + get.translation(result.links[0][2])); - player.markSkill("gongsun_shadow"); - }, - }, - gongsun_shadow: { - global: "gongsun_shadow2", - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - marktext: "损", - onremove: true, - intro: { - content: function (shadow) { - var str = ""; - for (var i = 0; i < shadow.length; i++) { - if (i > 0) str += "
    "; - str += get.translation(shadow[i][0]); - str += ":"; - str += get.translation(shadow[i][1]); - } - return str; - }, - }, - mod: { - cardEnabled: function (card, player) { - var list = player.storage.gongsun_shadow; - for (var i = 0; i < list.length; i++) { - if (list[i][1] == card.name) return false; - } - }, - cardRespondable: function (card, player) { - var list = player.storage.gongsun_shadow; - for (var i = 0; i < list.length; i++) { - if (list[i][1] == card.name) return false; - } - }, - cardSavable: function (card, player) { - var list = player.storage.gongsun_shadow; - for (var i = 0; i < list.length; i++) { - if (list[i][1] == card.name) return false; - } - }, - cardDiscardable: function (card, player) { - var list = player.storage.gongsun_shadow; - for (var i = 0; i < list.length; i++) { - if (list[i][1] == card.name) return false; - } - }, - }, - }, - gongsun_shadow2: { - mod: { - cardEnabled: function (card, player) { - if ( - game.hasPlayer(function (current) { - var list = current.storage.gongsun_shadow; - if (!list) return false; - for (var i = 0; i < list.length; i++) { - if (list[i][0] == player && list[i][1] == card.name) return true; - } - return false; - }) - ) - return false; - }, - cardSavable: function (card, player) { - if ( - game.hasPlayer(function (current) { - var list = current.storage.gongsun_shadow; - if (!list) return false; - for (var i = 0; i < list.length; i++) { - if (list[i][0] == player && list[i][1] == card.name) return true; - } - return false; - }) - ) - return false; - }, - cardRespondable: function (card, player) { - if ( - game.hasPlayer(function (current) { - var list = current.storage.gongsun_shadow; - if (!list) return false; - for (var i = 0; i < list.length; i++) { - if (list[i][0] == player && list[i][1] == card.name) return true; - } - return false; - }) - ) - return false; - }, - cardDiscardable: function (card, player) { - if ( - game.hasPlayer(function (current) { - var list = current.storage.gongsun_shadow; - if (!list) return false; - for (var i = 0; i < list.length; i++) { - if (list[i][0] == player && list[i][1] == card.name) return true; - } - return false; - }) - ) - return false; - }, - }, - }, - duoduan: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - direct: true, - filter: function (event, player) { - return event.card.name == "sha" && player.countCards("he") > 0 && !player.hasSkill("duoduan_im"); - }, - content: function () { - "step 0"; - player - .chooseCard("he", get.prompt2("duoduan"), lib.filter.cardRecastable) - .set("ai", function (card) { - if (_status.event.goon) return 8 - get.value(card); - return 0; - }) - .set( - "goon", - (function () { - if (get.attitude(trigger.player, player) > 0) return true; - if (!trigger.player.countCards("he")) return true; - if (!player.hasShan()) return true; - return event.getRand() < 0.5; - })() - ); - "step 1"; - if (result.bool) { - player.addTempSkill("duoduan_im"); - player.logSkill("duoduan", trigger.player); - player.recast(result.cards); - } else event.finish(); - "step 2"; - var sha = get.translation(trigger.card); - if ( - !trigger.player.countCards("he", function (card) { - return lib.filter.cardDiscardable(card, trigger.player, "duoduan"); - }) - ) - event.finish(); - else - player - .chooseControl() - .set("choiceList", ["令其摸两张牌,然后令" + sha + "对你无效", "令其弃置一张牌,然后你不可响应" + sha]) - .set("prompt", "度断:令" + get.translation(trigger.player) + "执行一项") - .set("ai", function () { - var player = _status.event.player; - var source = _status.event.getTrigger().player; - if (get.attitude(player, source) > 0) return 0; - if (!player.hasShan() && player.hp >= 2) return 1; - return 0; - }); - "step 3"; - if (result.index == 0) event.goto(5); - else trigger.player.chooseToDiscard("弃置一张牌令" + get.translation(player) + "不能闪避此【杀】", "he", true); - "step 4"; - if (result.bool) { - trigger.directHit.add(player); - } - event.finish(); - "step 5"; - trigger.player.draw(2); - trigger.excluded.add(player); - }, - }, - duoduan_im: { - //'im' refers to 'Iwasawa Masami' in 'Angel Beats!' - //Although she disappeared in the Episode 3 of the anime, but her route in the game is really worth to play. - }, - chengzhao: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - var num = 0; - player.getHistory("gain", function (evt) { - num += evt.cards.length; - }); - if (num < 2) return false; - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return player != current && player.canCompare(current); - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("chengzhao"), function (card, player, target) { - return player.canCompare(target); - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target) / target.countCards("h"); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("chengzhao", target); - player.chooseToCompare(target); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = { name: "sha", isCard: true }; - if (player.canUse(card, target, false)) player.useCard(card, target, false).card.chengzhao = true; - } - }, - ai: { - unequip: true, - skillTagFilter: function (player, tag, arg) { - if (!arg || !arg.card || arg.card.chengzhao != true) return false; - }, - }, - }, - rezhengrong: { - trigger: { player: "useCardAfter" }, - direct: true, - audio: "drlt_zhenrong", - filter: function (event, player) { - if (!event.targets) return false; - if (!event.isPhaseUsing(player)) return false; - var bool = false; - for (var i = 0; i < event.targets.length; i++) { - if (event.targets[i] != player) { - bool = true; - break; - } - } - if (!bool) return false; - return ( - player - .getAllHistory("useCard", function (evt) { - if (!evt.isPhaseUsing(player)) return false; - for (var i = 0; i < evt.targets.length; i++) { - if (evt.targets[i] != player) return true; - } - return false; - }) - .indexOf(event) % - 2 == - 1 - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("rezhengrong"), "将一名其他角色的随机一张牌置于你的武将牌上,成为「荣」", function (card, player, target) { - return target != player && target.countCards("he") > 0; - }) - .set("ai", function (target) { - return (1 - get.attitude(_status.event.player, target)) / target.countCards("he"); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = result.targets[0]; - player.logSkill("rezhengrong", target); - var card = target.getCards("he").randomGet(); - player.addToExpansion(card, target, "give").gaintag.add("rezhengrong"); - } - }, - marktext: "荣", - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - }, - rehongju: { - trigger: { player: "phaseZhunbeiBegin" }, - audio: "drlt_hongju", - forced: true, - unique: true, - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - derivation: "reqingce", - filter: function (event, player) { - return player.getExpansions("rezhengrong").length >= 3 && game.dead.length > 0; - }, - content: function () { - "step 0"; - player.awakenSkill("rehongju"); - player.draw(player.getExpansions("rezhengrong").length); - "step 1"; - if (player.countCards("h") == 0) event.goto(3); - else { - var dialog = ["请选择要交换的手牌和「荣」,或点「取消」", '
    「征荣」牌
    ', player.getExpansions("rezhengrong"), '
    手牌区
    ', player.getCards("h")]; - var next = player.chooseButton(dialog); - next.set("filterButton", function (button) { - var ss = _status.event.player.getExpansions("rezhengrong"); - var hs = _status.event.player.getCards("h"); - var sn = 0; - var hn = 0; - var ub = ui.selected.buttons; - for (var i = 0; i < ub.length; i++) { - if (ss.includes(ub[i].link)) sn++; - else hn++; - } - return !((sn >= hs.length && ss.includes(button.link)) || (hn >= ss.length && hs.includes(button.link))); - }); - next.set("selectButton", function () { - if (ui.selected.buttons.length == 0) return 2; - var ss = _status.event.player.getExpansions("rezhengrong"); - var hs = _status.event.player.getCards("h"); - var sn = 0; - var hn = 0; - var ub = ui.selected.buttons; - for (var i = 0; i < ub.length; i++) { - if (ss.includes(ub[i].link)) sn++; - else hn++; - } - if (sn != hn) return 2 * Math.max(sn, hn); - else { - if (sn == ss.length || hn == hs.length || sn == hs.length || hn == ss.length) return ub.length; - return [ub.length, ub.length + 1]; - } - }); - next.set("ai", function () { - return -1; - }); - } - "step 2"; - if (result.bool) { - var gains = []; - var pushs = []; - var expansions = player.getExpansions("rezhengrong"); - for (var i = 0; i < result.links.length; i++) { - var card = result.links[i]; - if (expansions.includes(card)) gains.push(card); - else pushs.push(card); - } - player.addToExpansion(pushs, player, "give").gaintag.add("rezhengrong"); - player.gain(gains, "gain2"); - } - "step 3"; - player.addSkills("reqingce"); - player.loseMaxHp(); - }, - ai: { - combo: "rezhengrong", - }, - }, - reqingce: { - enable: "phaseUse", - audio: "drlt_qingce", - filter: function (event, player) { - return player.getExpansions("rezhengrong").length > 0; - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog("请选择要移去的「荣」", player.getExpansions("rezhengrong"), "hidden"); - }, - backup: function (links, player) { - return { - card: links[0], - filterCard: function () { - return false; - }, - selectCard: -1, - filterTarget: function (card, player, target) { - return target.countDiscardableCards(player, "ej") > 0; - }, - delay: false, - audio: "drlt_qingce", - content: lib.skill.reqingce.contentx, - ai: { - result: { - target: function (player, target) { - var att = get.attitude(player, target); - if ( - att > 0 && - (target.countCards("j") > 0 || - target.countCards("e", function (card) { - return get.value(card, target) < 0; - })) - ) - return 2; - if (att < 0 && target.countCards("e") > 0 && !target.hasSkillTag("noe")) return -1; - return 0; - }, - }, - }, - }; - }, - prompt: function (links, player) { - return "弃置一名角色装备区或判定区内的一张牌"; - }, - }, - contentx: function () { - "step 0"; - var card = lib.skill.reqingce_backup.card; - player.loseToDiscardpile(card); - "step 1"; - if (target.countDiscardableCards(player, "ej") > 0) { - player.discardPlayerCard("ej", true, target); - } - }, - ai: { - combo: "rezhengrong", - order: 8, - result: { - player: function (player) { - if ( - game.hasPlayer(function (current) { - var att = get.attitude(player, current); - if ((att > 0 && current.countCards("j") > 0) || (att < 0 && current.countCards("e") > 0)) return true; - return false; - }) - ) - return 1; - return 0; - }, - }, - }, - }, - fengji: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return typeof player.storage.fengji == "number" && player.countCards("h") >= player.storage.fengji; - }, - content: function () { - player.draw(2); - player.addTempSkill("fengji3"); - }, - group: "fengji2", - intro: { - content: "上回合结束时的手牌数:#", - }, - }, - fengji2: { - trigger: { player: "phaseEnd" }, - silent: true, - content: function () { - player.storage.fengji = player.countCards("h"); - if (player.hasSkill("fengji")) player.markSkill("fengji"); - }, - }, - fengji3: { - mod: { - maxHandcardBase: function (player, num) { - return player.maxHp; - }, - }, - }, - zhouxuan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - filterCard: true, - position: "he", - filterTarget: lib.filter.notMe, - check: function (card) { - return 6 - get.value(card); - }, - content: function () { - "step 0"; - player.addSkill("zhouxuan2"); - target.addTempSkill("zhouxuan_ai", { player: "phaseUseAfter" }); - player.storage.zhouxuan2 = {}; - player.storage.zhouxuan2.player = target; - var list = []; - var basic = []; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - var type = get.type(name, "trick"); - if (type == "basic") { - list.push(name); - basic.push(name); - } else list.add(type); - } - event.basic = basic; - player - .chooseControl(list) - .set("prompt", "请选择一种基本牌的名称或非基本牌的类别") - .set("ai", function () { - var player = _status.event.player; - var target = player.storage.zhouxuan2.player; - var cards = target.getCards("h", function (card) { - return target.hasUseTarget(card); - }); - var map = {}; - for (var i = 0; i < cards.length; i++) { - var type = get.type(cards[i], "trick"); - map[type == "basic" ? get.name(cards[i]) : type] = true; - } - if (map.equip) return "equip"; - if (map.trick) return "trick"; - if (map.sha) return "sha"; - if (map.tao) return "tao"; - return 0; - }); - "step 1"; - player.storage.zhouxuan2.card = result.control; - if (event.basic.includes(result.control)) player.storage.zhouxuan2.isbasic = true; - player.markSkill("zhouxuan2"); - }, - ai: { - order: 1, - result: { - player: function (player, target) { - if (get.attitude(player, target) > 0) - return ( - Math.max(1, target.hp) * - target.countCards("h", function (card) { - return target.getUseValue(card) > 0; - }) - ); - return 0; - }, - }, - }, - }, - zhouxuan_ai: { - mod: { - aiOrder: function (player, card, num) { - if ( - game.hasPlayer(function (current) { - return current.storage.zhouxuan2 && current.storage.zhouxuan2.player == player && get.attitude(player, current) > 0 && (current.storage.zhouxuan2.isbasic ? card.name : get.type(card, "trick")) == current.storage.zhouxuan2.card; - }) - ) - return num + 10; - }, - }, - }, - zhouxuan2: { - intro: { - mark: function (player, storage) { - return get.translation(storage.player) + "使用或打出下一张牌时,若此牌为" + get.translation(storage.card) + (storage.isbasic ? "" : "牌") + ",你观看牌堆顶的三张牌并分配给任意角色"; - }, - }, - audio: "zhouxuan", - forced: true, - charlotte: true, - trigger: { global: ["useCard", "respond"] }, - filter: function (event, player) { - if (event.zhouxuanable) return true; - if (player.storage.zhouxuan2) { - var map = player.storage.zhouxuan2; - if (map.player != event.player) return false; - delete player.storage.zhouxuan2; - player.unmarkSkill("zhouxuan2"); - if (map.card != (map.isbasic ? event.card.name : get.type(event.card, "trick"))) return false; - event.zhouxuanable = true; - return true; - } - return false; - }, - logTarget: "player", - content: function () { - "step 0"; - event.cards = game.cardsGotoOrdering(get.cards(3)).cards; - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - "step 1"; - if (event.cards.length > 1) { - player.chooseCardButton("周旋:请选择要分配的牌", true, event.cards, [1, event.cards.length]).set("ai", function (button) { - if (ui.selected.buttons.length == 0) return 1; - return 0; - }); - } else if (event.cards.length == 1) { - event._result = { links: event.cards.slice(0), bool: true }; - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - event.cards.removeArray(result.links); - event.togive = result.links.slice(0); - player - .chooseTarget("选择一名角色获得" + get.translation(result.links), true) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (_status.event.enemy) { - return -att; - } else if (att > 0) { - return att / (1 + target.countCards("h")); - } else { - return att / 100; - } - }) - .set("enemy", get.value(event.togive[0], player, "raw") < 0); - } - "step 3"; - if (result.targets.length) { - var id = result.targets[0].playerid, - map = event.given_map; - if (!map[id]) map[id] = []; - map[id].addArray(event.togive); - } - if (cards.length > 0) event.goto(1); - "step 4"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - var list = []; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - list.push([source, event.given_map[i]]); - } - game.loseAsync({ - gain_list: list, - giver: player, - animate: "draw", - }).setContent("gaincardMultiple"); - }, - }, - reshanxi: { - audio: "shanxi", - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return ( - player.hp > 0 && - player.countCards("h", function (card) { - if (_status.connectMode) return true; - return get.color(card) == "red" && get.type(card) == "basic"; - }) > 0 - ); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - filterCard: function (card) { - return get.color(card) == "red" && get.type(card) == "basic" && lib.filter.cardDiscardable.apply(this, arguments); - }, - filterTarget: function (card, player, target) { - return player != target && target.countCards("he") > 0; - }, - prompt: get.prompt("reshanxi"), - prompt2: "弃置一张红色基本牌并选择一名其他角色,将其的至多X张牌置于其武将牌上直到回合结束。(X为你的体力值)", - ai1: function () { - return -1; - }, - }); - "step 1"; - if (result.bool) { - event.target = result.targets[0]; - player.logSkill("reshanxi", event.target); - player.discard(result.cards); - } else event.finish(); - "step 2"; - var max = Math.min(player.hp, target.countCards("he")); - if (max > 0 && target.isIn()) { - player - .choosePlayerCard("he", target, true, [1, max]) - .set("forceAuto", true) - .set("prompt", "将" + get.translation(target) + "的至多" + get.cnNumber(max) + "张牌置于其武将牌上"); - } else event.finish(); - "step 3"; - target.addSkill("reshanxi2"); - target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("reshanxi2"); - }, - }, - reshanxi2: { - trigger: { global: "phaseEnd" }, - forced: true, - popup: false, - charlotte: true, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - content: function () { - "step 0"; - var cards = player.getExpansions("reshanxi2"); - if (cards.length) player.gain(cards, "draw"); - "step 1"; - player.removeSkill("reshanxi2"); - }, - intro: { - markcount: "expansion", - mark: function (dialog, storage, player) { - var cards = player.getExpansions("reshanxi2"); - if (player.isUnderControl(true)) dialog.addAuto(cards); - else return "共有" + get.cnNumber(cards.length) + "张牌"; - }, - }, - }, - reqizhou: { - trigger: { player: ["equipEnd", "loseEnd"] }, - forced: true, - popup: false, - derivation: ["reyingzi", "qixi", "rexuanfeng"], - filter: function (event, player) { - if (player.equiping) return false; - var suits = []; - var es = player.getCards("e"); - for (var i = 0; i < es.length; i++) { - suits.add(get.suit(es[i])); - } - if (suits.length > 3) suits.length = 3; - if (player.additionalSkills.reqizhou) { - return player.additionalSkills.reqizhou.length != suits.length; - } else { - return suits.length > 0; - } - }, - content: function () { - lib.skill.reqizhou.init(player, "reqizhou"); - }, - init: function (player, skill) { - var suits = []; - var es = player.getCards("e"); - for (var i = 0; i < es.length; i++) { - suits.add(get.suit(es[i])); - } - if (suits.length > 3) suits.length = 3; - player.removeAdditionalSkill(skill); - switch (suits.length) { - case 1: - player.addAdditionalSkill(skill, ["reyingzi"]); - break; - case 2: - player.addAdditionalSkill(skill, ["reyingzi", "qixi"]); - break; - case 3: - player.addAdditionalSkill(skill, ["reyingzi", "qixi", "rexuanfeng"]); - break; - } - }, - ai: { - threaten: 1.2, - }, - }, - zhaohan: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return player.phaseNumber < 8; - }, - check: function (event, player) { - return player.phaseNumber < 3; - }, - content: function () { - if (player.phaseNumber < 5) { - player.gainMaxHp(); - player.recover(); - } else player.loseMaxHp(); - }, - }, - rangjie: { - audio: 2, - trigger: { player: "damageEnd" }, - direct: true, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - var choiceList = ["获得一张指定类型的牌"]; - if (player.canMoveCard()) choiceList.push("移动场上的一张牌"); - player - .chooseControl("cancel2") - .set("choiceList", choiceList) - .set("prompt", get.prompt("rangjie")) - .set("ai", function () { - var player = _status.event.player; - if (player.canMoveCard(true)) return 1; - return 0; - }); - "step 2"; - if (result.control == "cancel2") event.finish(); - else { - player.logSkill("rangjie"); - player.draw(); - if (result.index == 0) { - player - .chooseControl("basic", "trick", "equip") - .set("prompt", "选择获得一种类型的牌") - .set("ai", function () { - var player = _status.event.player; - if (player.hp <= 3 && !player.countCards("h", { name: ["shan", "tao"] })) return "basic"; - if (player.countCards("he", { type: "equip" }) < 2) return "equip"; - return "trick"; - }); - } else { - player.moveCard(true); - event.goto(4); - } - } - "step 3"; - var card = get.cardPile2(function (card) { - return get.type(card, "trick") == result.control; - }); - if (card) player.gain(card, "gain2", "log"); - "step 4"; - if (event.count > 0 && player.hasSkill("rangjie")) event.goto(1); - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - var num = 1; - if (get.attitude(player, target) > 0) { - if (player.needsToDiscard()) num = 0.7; - else num = 0.5; - } - if (target.hp >= 4) return [1, num * 2]; - if (target.hp == 3) return [1, num * 1.5]; - if (target.hp == 2) return [1, num * 0.5]; - } - }, - }, - }, - }, - yizheng: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.hp <= player.hp && player.canCompare(current); - }); - }, - filterTarget: function (card, player, current) { - return current.hp <= player.hp && player.canCompare(current); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - target.skip("phaseDraw"); - target.addTempSkill("yizheng2", { player: "phaseDrawSkipped" }); - } else player.loseMaxHp(); - }, - ai: { - order: 1, - result: { - player: (player, target) => { - let hs = player.getCards("h").sort(function (a, b) { - return get.number(b) - get.number(a); - }); - if (!hs.length) return 0; - let a = get.number(hs[0]), - b = 4; - if (player.getDamagedHp()) b = 2; - return -b * (1 - Math.pow((a - 1) / 13, target.countCards("h"))); - }, - target: (player, target) => { - if (target.skipList.includes("phaseDraw") || target.hasSkill("pingkou") || target.hasSkill("xinpingkou")) return 0; - let hs = player.getCards("h").sort(function (a, b) { - return get.number(b) - get.number(a); - }); - if (!hs.length) return 0; - return -Math.pow((get.number(hs[0]) - 1) / 13, target.countCards("h")) * 2; - }, - }, - }, - }, - yizheng2: { - mark: true, - intro: { content: "跳过下回合的摸牌阶段" }, - }, - rw_zhuge_skill: { - equipSkill: true, - audio: true, - firstDo: true, - trigger: { player: "useCard1" }, - forced: true, - filter: function (event, player) { - return !event.audioed && event.card.name == "sha" && player.countUsed("sha", true) > 1 && event.getParent().type == "phase"; - }, - content: function () { - trigger.audioed = true; - }, - mod: { - cardUsable: function (card, player, num) { - var cards = player.getEquips("rewrite_zhuge"); - if (card.name == "sha") { - if (!cards.length || player.hasSkill("rw_zhuge_skill", null, false) || cards.some(card => card != _status.rw_zhuge_temp && !ui.selected.cards.includes(card))) { - if (get.is.versus() || get.is.changban()) { - return num + 3; - } - return Infinity; - } - } - }, - cardEnabled2: function (card, player) { - if (!_status.event.addCount_extra || player.hasSkill("rw_zhuge_skill", null, false)) return; - var cards = player.getEquips("rewrite_zhuge"); - if (card && cards.includes(card)) { - try { - var cardz = get.card(); - } catch (e) { - return; - } - if (!cardz || cardz.name != "sha") return; - _status.rw_zhuge_temp = card; - var bool = lib.filter.cardUsable(get.autoViewAs({ name: "sha" }, ui.selected.cards.concat([card])), player); - delete _status.rw_zhuge_temp; - if (!bool) return false; - } - }, - }, - }, - xinqingjian: { - audio: "qingjian", - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - direct: true, - usable: 1, - filter: function (event, player) { - return event.getg(player).length && event.getParent("phaseDraw").player != player && player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player.chooseCard(get.prompt2("xinqingjian"), "he", [1, player.countCards("he")]).ai = function () { - return -1; - }; - "step 1"; - if (result.bool) { - player.logSkill("xinqingjian"); - player.addSkill("xinqingjian2"); - player.addToExpansion(result.cards, "giveAuto", player).gaintag.add("xinqingjian2"); - } else player.storage.counttrigger.xinqingjian--; - }, - }, - xinqingjian2: { - audio: "xinqingjian", - charlotte: true, - trigger: { global: "phaseEnd" }, - forced: true, - filter: function (event, player) { - return player.getExpansions("xinqingjian2").length > 0; - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - content: function () { - "step 0"; - var cards = player.getExpansions("xinqingjian2"); - player.chooseTarget(true, lib.filter.notMe).set("createDialog", ["清俭:将这些牌交给一名角色" + (cards.length > 1 ? ",然后摸一张牌" : ""), cards]); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "thunder"); - if (player.give(player.getExpansions("xinqingjian2"), target).cards.length > 1) player.draw(); - } - "step 2"; - player.removeSkill("xinqingjian2"); - }, - intro: { - markcount: "expansion", - mark: function (dialog, storage, player) { - var cards = player.getExpansions("xinqingjian2"); - if (player.isUnderControl(true)) dialog.addAuto(cards); - else return "共有" + get.cnNumber(cards.length) + "张牌"; - }, - }, - }, - zhongzuo: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.getHistory("damage").length > 0 || player.getHistory("sourceDamage").length > 0; - }, - content: function () { - "step 0"; - player.chooseTarget(get.prompt("zhongzuo"), "令一名角色摸两张牌。若其已受伤,则你摸一张牌。").set("ai", function (target) { - if (target.hasSkillTag("nogain")) return target.isDamaged() ? 0 : 1; - let att = get.attitude(_status.event.player, target); - if (att <= 0) return 0; - if (target.isDamaged()) return 1 + att / 5; - return att / 5; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("zhongzuo", target); - target.draw(2); - if (target.isDamaged()) player.draw(); - } - }, - }, - wanlan: { - audio: 2, - trigger: { global: "dying" }, - check: function (event, player) { - if (get.attitude(player, event.player) < 4) return false; - if (player.countCards("hs", card => player.canSaveCard(card, event.player)) >= 1 - event.player.hp) return false; - if (event.player == player || event.player == get.zhu(player)) return true; - if (_status.currentPhase && get.damageEffect(_status.currentPhase, player, player) < 0) return false; - return !player.hasUnknown(); - }, - limited: true, - unique: true, - filter: function (event, player) { - return event.player.hp <= 0; - }, - skillAnimation: true, - animationColor: "thunder", - logTarget: "player", - content: function () { - "step 0"; - player.awakenSkill("wanlan"); - var hs = player.getCards("h"); - if (hs.length) player.discard(hs); - "step 1"; - var num = 1 - trigger.player.hp; - if (num) trigger.player.recover(num); - "step 2"; - if (_status.currentPhase && _status.currentPhase.isIn()) { - var next = _status.currentPhase.damage(); - event.next.remove(next); - trigger.after.push(next); - } - }, - }, - rezhiyi: { - audio: "zhiyi", - trigger: { global: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return ( - player.getHistory("useCard", function (card) { - return get.type(card.card) == "basic"; - }).length > 0 || - player.getHistory("respond", function (card) { - return get.type(card.card) == "basic"; - }).length > 0 - ); - }, - content: function () { - "step 0"; - var list = []; - player.getHistory("useCard", function (evt) { - if (get.type(evt.card) != "basic") return; - var name = evt.card.name; - if (name == "sha") { - var nature = evt.card.nature; - switch (nature) { - case "fire": - name = "huosha"; - break; - case "thunder": - name = "leisha"; - break; - case "kami": - name = "kamisha"; - break; - case "ice": - name = "icesha"; - break; - case "stab": - name = "cisha"; - break; - } - } - list.add(name); - }); - player.getHistory("respond", function (evt) { - if (get.type(evt.card) != "basic") return; - var name = evt.card.name; - if (name == "sha") { - var nature = evt.card.nature; - switch (nature) { - case "fire": - name = "huosha"; - break; - case "thunder": - name = "leisha"; - break; - case "kami": - name = "kamisha"; - break; - case "ice": - name = "icesha"; - break; - case "stab": - name = "cisha"; - break; - } - } - list.add(name); - }); - player.chooseButton( - [ - "执义:选择要使用的牌,或点取消摸一张牌", - [ - list.map(function (name) { - return ["基本", "", name]; - }), - "vcard", - ], - ], - function (button) { - return _status.event.player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }, - function (button) { - return _status.event.player.hasUseTarget({ - name: button.link[2], - nature: button.link[3], - }); - } - ); - "step 1"; - if (!result.bool) player.draw(); - else player.chooseUseTarget({ name: result.links[0][2], isCard: true, nature: result.links[0][3] }, true); - }, - }, - zhiyi: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - forced: true, - filter: function (event, player) { - if (get.type(event.card) != "basic") return false; - var history = player - .getHistory("useCard", function (evt) { - return get.type(evt.card) == "basic"; - }) - .concat( - player.getHistory("respond", function (evt) { - return get.type(evt.card) == "basic"; - }) - ); - return history.length == 1 && history[0] == event; - }, - content: function () { - "step 0"; - var info = get.info(trigger.card); - if (!info || !info.enable) event._result = { index: 0 }; - else { - var evt = trigger; - if (evt.respondTo && evt.getParent("useCard").name == "useCard") evt = evt.getParent("useCard"); - event.evt = evt; - player - .chooseControl() - .set("prompt", "执义:请选择一项") - .set("choiceList", [ - "摸一张牌", - "于" + - get.translation(evt.card) + - "的使用结算结束之后视为使用一张" + - get.translation({ - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - }), - ]) - .set("ai", function () { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var card = { - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - }; - if (card.name == "sha") { - if (player.getUseValue(card) > 0) return 1; - } else if (card.name == "tao") { - var hp = player.maxHp - player.hp; - if (trigger.targets.includes(player)) hp--; - return hp > 0 ? 1 : 0; - } - return 0; - })() - ); - } - "step 1"; - if (result.index == 0) { - player.draw(); - } else { - var next = player.chooseUseTarget({ name: trigger.card.name, nature: trigger.card.nature, isCard: true }, false, true); - _status.event.next.remove(next); - event.evt.after.push(next); - next.logSkill = "zhiyi"; - } - }, - }, - //表演测试 - qiaosi_map: { charlotte: true }, - qiaosi: { - audio: "xinfu_qiaosi", - derivation: "qiaosi_map", - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - event.videoId = lib.status.videoId++; - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - game.pause(); - game.countChoose(); - setTimeout(function () { - _status.imchoosing = false; - event._result = { - bool: true, - links: ["qiaosi_c1", "qiaosi_c6"].concat(["qiaosi_c2", "qiaosi_c3", "qiaosi_c4", "qiaosi_c5"].randomGets(1)), - }; - if (event.dialog) event.dialog.close(); - if (event.controls) { - for (var i of event.controls) i.close(); - } - game.resume(); - }, 5000); - }; - var createDialog = function (player, id) { - if (player == game.me) return; - var str = get.translation(player) + "正在表演...
    "; - for (var i = 1; i < 7; i++) { - str += get.translation("qiaosi_c" + i); - if (i % 3 != 0) str += "  "; - if (i == 3) str += "
    "; - } - ui.create.dialog(str, "forcebutton").videoId = id; - }; - var chooseButton = function (player) { - var event = _status.event; - player = player || event.player; - event.status = { - qiaosi_c1: 0, - qiaosi_c2: 0, - qiaosi_c3: 0, - qiaosi_c4: 0, - qiaosi_c5: 0, - qiaosi_c6: 0, - }; - event.map = { - qiaosi_c1: [40, 60], - qiaosi_c2: [80, 120], - qiaosi_c3: [90, 110], - qiaosi_c4: [90, 110], - qiaosi_c5: [80, 120], - qiaosi_c6: [40, 60], - }; - event.finishedx = []; - event.str = '请开始你的表演
    qiaosi_c1% qiaosi_c2% qiaosi_c3%
    qiaosi_c4%qiaosi_c5% qiaosi_c6%'; - event.dialog = ui.create.dialog(event.str, "forcebutton", "hidden"); - event.dialog.addText("
  • 点击下方的按钮,可以增加按钮对应的角色的「表演完成度」。对于不同的角色,点击时增加的完成度不同,最终获得的牌也不同。一次表演最多只能完成3名角色的进度。", false); - event.dialog.open(); - for (var i in event.status) { - event.dialog.content.childNodes[0].innerHTML = event.dialog.content.childNodes[0].innerHTML.replace(i, event.status[i]); - } - for (var i = 0; i < event.dialog.buttons.length; i++) { - event.dialog.buttons[i].classList.add("pointerdiv"); - } - (event.switchToAuto = function () { - event._result = { - bool: true, - links: event.finishedx.slice(0), - }; - event.dialog.close(); - for (var i of event.controls) i.close(); - game.resume(); - _status.imchoosing = false; - }), - (event.controls = []); - for (var i = 1; i <= 6; i++) - event.controls.push( - ui.create.control("qiaosi_c" + i, function (link) { - var event = _status.event; - if (event.finishedx.includes(link)) return; - event.status[link] += get.rand.apply(get, event.map[link]); - if (event.status[link] >= 100) { - event.status[link] = 100; - var str = event.str.slice(0); - for (var i in event.status) { - str = str.replace(i, event.status[i]); - } - event.dialog.content.childNodes[0].innerHTML = str; - event.finishedx.push(link); - if (event.finishedx.length >= 3) { - event._result = { - bool: true, - links: event.finishedx.slice(0), - }; - event.dialog.close(); - for (var i of event.controls) i.close(); - game.resume(); - _status.imchoosing = false; - } - } else { - var str = event.str.slice(0); - for (var i in event.status) { - str = str.replace(i, event.status[i]); - } - event.dialog.content.childNodes[0].innerHTML = str; - } - }) - ); - for (var i = 0; i < event.dialog.buttons.length; i++) { - event.dialog.buttons[i].classList.add("selectable"); - } - game.pause(); - game.countChoose(); - }; - //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog, player, event.videoId); - if (event.isMine()) { - chooseButton(); - } else if (event.isOnline()) { - event.player.send(chooseButton, event.player); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 1"; - game.broadcastAll("closeDialog", event.videoId); - var map = event.result || result; - //game.print(map); - if (!map || !map.bool || !map.links) { - game.log(player, "表演失败"); - event.finish(); - return; - } - var list = map.links; - if (!list.length) { - game.log(player, "表演失败"); - event.finish(); - return; - } - var cards = []; - var list2 = []; - if (list.includes("qiaosi_c1")) { - list2.push("trick"); - list2.push("trick"); - } - if (list.includes("qiaosi_c2")) { - if (list.includes("qiaosi_c1")) list2.push(["sha", "jiu"]); - else list2.push(Math.random() < 0.66 ? "equip" : ["sha", "jiu"]); - } - if (list.includes("qiaosi_c3")) { - list2.push([Math.random() < 0.66 ? "sha" : "jiu"]); - } - if (list.includes("qiaosi_c4")) { - list2.push([Math.random() < 0.66 ? "shan" : "tao"]); - } - if (list.includes("qiaosi_c5")) { - if (list.includes("qiaosi_c6")) list2.push(["shan", "tao"]); - else list2.push(Math.random() < 0.66 ? "trick" : ["shan", "tao"]); - } - if (list.includes("qiaosi_c6")) { - list2.push("equip"); - list2.push("equip"); - } - while (list2.length) { - var filter = list2.shift(); - var card = get.cardPile(function (x) { - if (cards.includes(x)) return false; - if (typeof filter == "string" && get.type(x, "trick") == filter) return true; - if (typeof filter == "object" && filter.includes(x.name)) return true; - }); - if (card) cards.push(card); - else { - var card = get.cardPile(function (x) { - return !cards.includes(x); - }); - if (card) cards.push(card); - } - } - if (cards.length) { - event.cards = cards; - event.num = cards.length; - player.showCards(cards); - } else event.finish(); - "step 2"; - player.gain(event.cards, "gain2"); - player - .chooseControl() - .set("choiceList", ["将" + get.cnNumber(event.num) + "张牌交给一名其他角色", "弃置" + get.cnNumber(event.num) + "张牌"]) - .set("ai", function () { - if ( - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 2; - }) - ) - return 0; - return 1; - }); - "step 3"; - if (result.index == 0) { - player.chooseCardTarget({ - position: "he", - filterCard: true, - selectCard: event.num, - filterTarget: function (card, player, target) { - return player != target; - }, - ai1: function (card) { - return 1; - }, - ai2: function (target) { - var att = get.attitude(_status.event.player, target); - if (target.hasSkillTag("nogain")) att /= 10; - if (target.hasJudge("lebu")) att /= 5; - return att; - }, - prompt: "选择" + get.cnNumber(event.num) + "张牌,交给一名其他角色。", - forced: true, - }); - } else { - player.chooseToDiscard(event.num, true, "he"); - event.finish(); - } - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.give(result.cards, target); - } - }, - ai: { - order: 10, - result: { player: 1 }, - threaten: 3.2, - }, - }, - refuhai: { - audio: "xinfu_fuhai", - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - event.current = player.next; - event.upper = []; - event.lower = []; - event.acted = []; - event.num = 0; - event.stopped = false; - "step 1"; - event.acted.push(event.current); - event.current.chooseControl("潮起", "潮落").set("prompt", "潮鸣起乎?潮鸣落乎?").ai = function () { - return Math.random() < 0.5 ? 0 : 1; - }; - "step 2"; - if (!event.chosen) event.chosen = result.control; - if (event.chosen != result.control) event.stopped = true; - if (!event.stopped) event.num++; - if (result.control == "潮起") { - event.upper.push(event.current); - } else event.lower.push(event.current); - event.current = event.current.next; - if (event.current != player && !event.acted.includes(event.current)) event.goto(1); - "step 3"; - for (var i = 0; i < event.acted.length; i++) { - var bool = event.upper.includes(event.acted[i]); - game.log(event.acted[i], "选择了", bool ? "#g潮起" : "#y潮落"); - event.acted[i].popup(bool ? "潮起" : "潮落", bool ? "wood" : "orange"); - } - game.delay(1); - "step 4"; - if (num > 1) player.draw(num); - }, - ai: { - order: 10, - result: { player: 1 }, - }, - }, - rebiaozhao: { - audio: "biaozhao", - intro: { - content: "expansion", - markcount: "expansion", - }, - trigger: { - player: "phaseJieshuBegin", - }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0 && !player.getExpansions("rebiaozhao").length; - }, - content: function () { - "step 0"; - player.chooseCard("he", get.prompt("rebiaozhao"), "将一张牌置于武将牌上作为“表”").ai = function (card) { - return 6 - get.value(card); - }; - "step 1"; - if (result.bool) { - player.logSkill("rebiaozhao"); - player.addToExpansion(player, "give", result.cards).gaintag.add("rebiaozhao"); - } - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { notemp: true }, - group: ["rebiaozhao2", "rebiaozhao3"], - }, - rebiaozhao2: { - trigger: { - global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - forced: true, - audio: "biaozhao", - filter: function (event, player) { - var cards = player.getExpansions("rebiaozhao"), - cards2 = event.getd(); - if (!cards.length || !cards2.length) return false; - var num = get.number(cards[0]); - var cards = event.getd(); - for (var card of cards) { - if (get.number(card) == num) return true; - } - return false; - }, - content: function () { - player.loseToDiscardpile(player.getExpansions("rebiaozhao")); - player.loseHp(); - }, - }, - rebiaozhao3: { - trigger: { - player: "phaseZhunbeiBegin", - }, - forced: true, - charlotte: true, - audio: "biaozhao", - filter: function (event, player) { - return player.getExpansions("rebiaozhao").length > 0; - }, - content: function () { - "step 0"; - player.loseToDiscardpile(player.getExpansions("rebiaozhao")); - "step 1"; - player.chooseTarget("令一名角色摸三张牌并回复1点体力", true).ai = function (target) { - var num = 2; - if (target.isDamaged()) num++; - return num * get.attitude(_status.event.player, target); - }; - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.draw(3); - target.recover(); - } - }, - }, - reqianxin: { - audio: "xinfu_qianxin", - enable: "phaseUse", - usable: 1, - filterCard: true, - selectCard: function () { - return [1, Math.min(2, game.players.length - 1)]; - }, - check: function (card) { - return 6 - get.value(card); - }, - discard: false, - lose: false, - delay: false, - content: function () { - var targets = game - .filterPlayer(function (current) { - return current != player; - }) - .randomGets(cards.length); - var map = []; - for (var i = 0; i < targets.length; i++) { - var target = targets[i]; - target.addSkill("reqianxin2"); - target.storage.reqianxin2.push([cards[i], player]); - map.push([target, cards[i]]); - } - game.loseAsync({ - gain_list: map, - player: player, - cards: cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - }, - ai: { - order: 1, - result: { - player: 1, - }, - }, - }, - reqianxin2: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - popup: false, - charlotte: true, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - onremove: true, - filter: function (event, player) { - var list = player.storage.reqianxin2; - if (Array.isArray(list)) { - var hs = player.getCards("h"); - for (var i = 0; i < list.length; i++) { - if (hs.includes(list[i][0]) && list[i][1].isIn()) return true; - } - } - return false; - }, - content: function () { - "step 0"; - var current = player.storage.reqianxin2.shift(); - event.source = current[1]; - if (!event.source.isIn() || !player.getCards("h").includes(current[0])) event.goto(3); - "step 1"; - source.logSkill("reqianxin", player); - player - .chooseControl() - .set("choiceList", ["令" + get.translation(source) + "摸两张牌", "令自己本回合的手牌上限-2"]) - .set("prompt", get.translation(source) + "发动了【遣信】,请选择一项") - .set("source", source) - .set("ai", function () { - var player = _status.event.player; - if (get.attitude(player, _status.event.source) > 0) return 0; - if (player.maxHp - player.countCards("h") > 1) return 1; - return Math.random() > 0.5 ? 0 : 1; - }); - "step 2"; - if (result.index == 0) source.draw(2); - else { - player.addTempSkill("reqianxin3"); - player.addMark("reqianxin3", 2, false); - } - "step 3"; - if (player.storage.reqianxin2.length) event.goto(0); - else player.removeSkill("reqianxin2"); - }, - }, - reqianxin3: { - onremove: true, - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("reqianxin3"); - }, - }, - }, - renshi: { - audio: 2, - trigger: { player: "damageBegin4" }, - forced: true, - filter: function (event, player) { - return player.isDamaged() && event.card && event.card.name == "sha"; - }, - content: function () { - "step 0"; - trigger.cancel(); - if (trigger.cards) { - var cards = trigger.cards.filterInD(); - if (cards.length) player.gain(cards, "gain2", "log"); - } - "step 1"; - player.loseMaxHp(); - }, - ai: { - halfneg: true, - filterDamage: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.card && arg.card.name == "sha") return true; - return false; - }, - }, - }, - wuyuan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h", "sha") > 0; - }, - filterCard: { name: "sha" }, - filterTarget: lib.filter.notMe, - check: function (card) { - var player = _status.event.player; - if ( - get.color(card) == "red" && - game.hasPlayer(function (current) { - return current != player && current.isDamaged() && get.attitude(player, current) > 2; - }) - ) - return 2; - if (get.natureList(card).length) return 1.5; - return 1; - }, - discard: false, - lose: false, - delay: false, - content: function () { - "step 0"; - player.give(cards, target, "give"); - player.recover(); - "step 1"; - var num = 1; - if (get.natureList(cards[0]).length) num++; - target.draw(num); - if (get.color(cards[0]) == "red") target.recover(); - }, - ai: { - order: 1, - result: { - player: function (player, target) { - if (player.isDamaged()) return 1; - return 0; - }, - target: function (player, target) { - if (ui.selected.cards.length) { - var num = 1; - if (get.natureList(ui.selected.cards[0]).length) num++; - if (target.hasSkillTag("nogain")) num = 0; - if (get.color(ui.selected.cards[0]) == "red") return num + 2; - else return num + 1; - } - return 1; - }, - }, - }, - }, - huaizi: { - mod: { - maxHandcardBase: function (player, num) { - return player.maxHp; - }, - }, - //audio:2, - //trigger:{player:'phaseDiscardBegin'}, - forced: true, - firstDo: true, - filter: function (event, player) { - return player.isDamaged() && player.countCards("h") > player.hp; - }, - content: function () {}, - }, - rexushen: { - derivation: ["new_rewusheng", "redangxian"], - audio: "xinfu_xushen", - limited: true, - enable: "phaseUse", - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.hasSex("male"); - }); - }, - skillAnimation: true, - animationColor: "fire", - content: function () { - player.addSkill("rexushen2"); - player.awakenSkill("rexushen"); - player.loseHp( - game.countPlayer(function (current) { - return current.hasSex("male"); - }) - ); - }, - ai: { - order: 10, - result: { - player: function (player) { - if ( - player.hp != - game.countPlayer(function (current) { - return current.hasSex("male"); - }) - ) - return 0; - return game.hasPlayer(function (current) { - return get.attitude(player, current) > 4 && current.countCards("h", "tao"); - }) - ? 1 - : 0; - }, - }, - }, - }, - rexushen2: { - charlotte: true, - subSkill: { - count: { - trigger: { - player: "recoverBegin", - }, - forced: true, - silent: true, - popup: false, - filter: function (event, player) { - if (!event.source) return false; - if (!player.isDying()) return false; - var evt = event.getParent("dying").getParent(2); - return evt.name == "rexushen" && evt.player == player; - }, - content: function () { - trigger.rexushen = true; - }, - sub: true, - }, - }, - group: ["rexushen2_count"], - trigger: { - player: "recoverAfter", - }, - filter: function (event, player) { - if (player.isDying()) return false; - return event.rexushen == true; - }, - direct: true, - silent: true, - popup: false, - content: function () { - "step 0"; - player.removeSkill("rexushen2"); - player.chooseBool("是否令" + get.translation(trigger.source) + "获得技能〖武圣〗和〖当先〗").ai = function () { - return get.attitude(player, trigger.source) > 0; - }; - "step 1"; - if (result.bool) { - player.line(trigger.source, "fire"); - trigger.source.addSkills(["new_rewusheng", "redangxian"]); - } - }, - }, - rezhennan: { - audio: "xinfu_zhennan", - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - return event.player != player && event.targets && event.targets.length && event.targets.length > event.player.hp; - }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseToDiscard(get.prompt("rezhennan", trigger.player), "弃置一张牌并对其造成1点伤害", "he"); - next.set("logSkill", ["rezhennan", trigger.player]); - next.set("ai", function (card) { - var player = _status.event.player; - var target = _status.event.getTrigger().player; - if (get.damageEffect(target, player, player) > 0) return 7 - get.value(card); - return -1; - }); - "step 1"; - if (result.bool) trigger.player.damage(); - }, - }, - meiyong: { - inherit: "xinfu_wuniang", - audio: "xinfu_wuniang", - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("meiyong"), "获得一名其他角色的一张牌,然后其摸一张牌。", function (card, player, target) { - if (player == target) return false; - return target.countGainableCards(player, "he") > 0; - }) - .set("ai", function (target) { - return 10 - get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("meiyong", target); - player.gainPlayerCard(target, "he", true); - } else event.finish(); - "step 2"; - target.draw(); - }, - }, - relianji: { - audio: "wylianji", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.players.length > 1; - }, - filterTarget: lib.filter.notMe, - targetprompt: ["打人", "被打"], - selectTarget: 2, - multitarget: true, - content: function () { - "step 0"; - game.delay(0.5); - if (!targets[0].hasEquipableSlot(1)) event.goto(2); - "step 1"; - var target = targets[0]; - var equip1 = get.cardPile2(function (card) { - return get.subtype(card) == "equip1" && target.canUse(card, target); - }); - if (!equip1) { - player.popup("连计失败"); - game.log("牌堆中无装备"); - event.finish(); - return; - } - if (equip1.name == "qinggang" && !lib.inpile.includes("qibaodao")) { - equip1.remove(); - equip1 = game.createCard("qibaodao", equip1.suit, equip1.number); - } - target.$draw(equip1); - target.chooseUseTarget(equip1, "noanimate", "nopopup", true); - "step 2"; - game.updateRoundNumber(); - var list = ["nanman", "wanjian", "huogong", "juedou", "sha"]; - var list2 = game.players.slice(0); - list2.remove(player); - for (var i = 0; i < list.length; i++) { - if (!targets[0].canUse(list[i], targets[1], false)) list.splice(i--, 1); - } - if (!list.length) return; - var name = list.randomGet(); - if (name == "nanman" || name == "wanjian") { - for (var i = 0; i < list2.length; i++) { - if (!targets[0].canUse(name, list2[i], false)) list2.splice(i--, 1); - } - } else list2 = targets[1]; - targets[0].useCard({ name: name, isCard: true }, list2, "noai"); - game.delay(0.5); - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if (ui.selected.targets.length == 0) { - return 1; - } else { - return -1; - } - }, - }, - expose: 0.4, - threaten: 3, - }, - group: "relianji_count", - subSkill: { - count: { - sub: true, - forced: true, - popup: false, - silent: true, - trigger: { global: "damageEnd" }, - filter: function (event, player) { - var evt = event.getParent(3); - return evt && evt.name == "relianji" && evt.player == player; - }, - content: function () { - if (!player.storage.relianji) player.storage.relianji = 0; - player.storage.relianji++; - event.trigger("remoucheng_awaken"); - }, - }, - }, - }, - remoucheng: { - derivation: "jingong", - trigger: { - player: "remoucheng_awaken", - }, - forced: true, - filter: function (event, player) { - return player.storage.relianji && player.storage.relianji > 2; - }, - audio: "moucheng", - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - content: function () { - player.awakenSkill("remoucheng"); - player.changeSkills(["jingong", "relianji"]); - player.gainMaxHp(); - player.recover(); - }, - ai: { - combo: "relianji", - }, - }, - shouye: { - audio: 2, - group: "shouye_after", - trigger: { target: "useCardToTarget" }, - filter: function (event, player) { - return event.player != player && event.targets.length == 1; - }, - check: function (event, player) { - if (event.player == game.me || event.player.isOnline()) return get.attitude(player, event.player) < 0; - return get.effect(player, event.card, event.player, player) < 0; - }, - usable: 1, - logTarget: "player", - content: function () { - "step 0"; - player.line(trigger.player, "green"); - player.chooseToDuiben(trigger.player); - "step 1"; - if (result.bool) { - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - trigger.getParent().shouyeer = player; - } - }, - subSkill: { - after: { - sub: true, - trigger: { global: "useCardAfter" }, - forced: true, - silent: true, - popup: false, - filter: function (event, player) { - if (event.shouyeer != player) return false; - if (event.cards) { - for (var i = 0; i < event.cards.length; i++) { - if (event.cards[i].isInPile()) return true; - } - } - return false; - }, - content: function () { - var list = []; - for (var i = 0; i < trigger.cards.length; i++) { - if (trigger.cards[i].isInPile()) { - list.push(trigger.cards[i]); - } - } - player.gain(list, "gain2", "log"); - }, - }, - }, - }, - liezhi: { - audio: 2, - group: "liezhi_damage", - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter: function (event, player) { - return !player.hasSkill("liezhi_disable"); - }, - content: function () { - "step 0"; - player.chooseTarget(get.prompt("liezhi"), "弃置至多两名其他角色区域内的各一张牌", [1, 2], function (card, player, target) { - return target != player && target.countDiscardableCards(player, "hej") > 0; - }).ai = function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe" }, player, player); - }; - "step 1"; - if (result.bool) { - result.targets.sortBySeat(); - event.targets = result.targets; - player.line(result.targets, "green"); - player.logSkill("liezhi", result.targets); - } else event.finish(); - "step 2"; - event.current = targets.shift(); - player.discardPlayerCard(event.current, "hej", true); - if (targets.length) event.redo(); - }, - subSkill: { - disable: { - sub: true, - trigger: { player: "phaseAfter" }, - forced: true, - silent: true, - popup: false, - charlotte: true, - //filter:function(event){return !event.liezhi}, - content: function () { - player.removeSkill("liezhi_disable"); - }, - }, - damage: { - trigger: { player: "damage" }, - forced: true, - silent: true, - popup: false, - content: function () { - player.addSkill("liezhi_disable"); - }, - }, - }, - }, - xinzhanyi: { - audio: "zhanyi", - enable: "phaseUse", - usable: 1, - filterCard: true, - position: "he", - check: function (card) { - var player = _status.event.player; - if (player.hp < 3) return 0; - var type = get.type(card, "trick"); - if (type == "trick") { - return 6 - get.value(card); - } else if (type == "equip") { - if ( - player.hasSha() && - game.hasPlayer(function (current) { - return player.canUse("sha", current) && get.attitude(player, current) < 0 && get.effect(current, { name: "sha" }, player, player) > 0; - }) - ) { - return 6 - get.value(card); - } - } - return 0; - }, - content: function () { - player.loseHp(); - switch (get.type(cards[0], "trick", cards[0].original == "h" ? player : false)) { - case "basic": - player.addTempSkill("xinzhanyi_basic"); - player.addMark("xinzhanyi_basic1", 1, false); - break; - case "equip": - player.addTempSkill("xinzhanyi_equip"); - break; - case "trick": - player.addTempSkill("xinzhanyi_trick"); - player.draw(3); - break; - } - }, - ai: { - order: 9.1, - result: { - player: 1, - }, - }, - }, - xinzhanyi_basic1: { - trigger: { player: "useCard" }, - filter: function (event, player) { - return get.type(event.card, false) == "basic" && player.hasMark("xinzhanyi_basic1"); - }, - forced: true, - silent: true, - popup: false, - content: function () { - if (!trigger.baseDamage) trigger.baseDamage = 1; - var num = player.countMark("xinzhanyi_basic1"); - trigger.baseDamage += num; - player.removeMark("xinzhanyi_basic1", num, false); - game.log(trigger.card, "的伤害值/回复值", "#y+" + num); - }, - }, - xinzhanyi_basic: { - group: ["xinzhanyi_basic1"], - onremove: function (p, s) { - delete p.storage[s + 1]; - }, - hiddenCard: function (player, name) { - return get.type(name) == "basic" && player.countCards("h", { type: "basic" }) > 0; - }, - enable: "chooseToUse", - filter: function (event, player) { - if ( - !player.hasCard(function (card) { - return get.type(card) == "basic"; - }, "hs") - ) - return false; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) list.push(["基本", "", name]); - if (name != "sha") continue; - for (var j of lib.inpile_nature) { - if (event.filterCard({ name: name, nature: j }, player, event)) list.push(["基本", "", "sha", j]); - } - } - return ui.create.dialog("战意", [list, "vcard"], "hidden"); - }, - check: function (button) { - var player = _status.event.player; - var card = { name: button.link[2], nature: button.link[3] }; - if ( - game.hasPlayer(function (current) { - return player.canUse(card, current) && get.effect(current, card, player, player) > 0; - }) - ) { - switch (button.link[2]) { - case "tao": - return 5; - case "jiu": { - if (player.countCards("hs", { type: "basic" }) >= 2) return 3; - } - case "sha": - if (button.link[3] == "fire") return 2.95; - else if (button.link[3] == "thunder" || button.link[3] == "ice") return 2.92; - else return 2.9; - } - } - return 0; - }, - backup: function (links, player) { - return { - audio: "zhanyi", - filterCard: function (card, player, target) { - return get.type(card) == "basic"; - }, - check: function (card, player, target) { - return 9 - get.value(card); - }, - viewAs: { name: links[0][2], nature: links[0][3] }, - position: "hs", - popname: true, - }; - }, - prompt: function (links, player) { - return "将一张基本牌当做" + get.translation(links[0][3] || "") + get.translation(links[0][2]) + "使用"; - }, - }, - ai: { - order: function () { - var player = _status.event.player; - var event = _status.event; - if (event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0 && player.countCards("hs", { type: "basic" }) >= 2) { - return 3.3; - } - return 3.1; - }, - respondSha: true, - skillTagFilter: function (player, tag, arg) { - if ( - player.hasCard(function (card) { - return get.type(card) == "basic"; - }, "hs") - ) { - if (tag == "respondSha") { - if (arg != "use") return false; - } - } else { - return false; - } - }, - result: { - player: 1, - }, - }, - }, - xinzhanyi_equip: { - audio: "zhanyi", - trigger: { player: "useCardToPlayered" }, - forced: true, - filter: function (event, player) { - return event.card.name == "sha" && event.target.countCards("he") > 0 && event.targets.length == 1; - }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - content: function () { - "step 0"; - trigger.target.chooseToDiscard("he", true, 2); - "step 1"; - if (result.bool && result.cards && result.cards.length) { - if (result.cards.length == 1) { - event._result = { bool: true, links: result.cards.slice(0) }; - } else - player.chooseButton(["选择获得其中的一张牌", result.cards.slice(0)], true).ai = function (button) { - return get.value(button.link); - }; - } else event.finish(); - "step 2"; - if (result.links) player.gain(result.links, "gain2"); - }, - }, - xinzhanyi_trick: { - mod: { - wuxieRespondable: function () { - return false; - }, - }, - }, - xinfu_daigong: { - usable: 1, - audio: 2, - trigger: { - player: "damageBegin4", - }, - filter: function (event, player) { - return event.source != undefined && player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.showHandcards(); - "step 1"; - var cards = player.getCards("h"); - var suits = []; - for (var i = 0; i < cards.length; i++) { - suits.add(get.suit(cards[i])); - } - trigger.source - .chooseCard("he", "交给" + get.translation(player) + "一张满足条件的牌,否则防止此伤害。", function (card) { - return !_status.event.suits.includes(get.suit(card)); - }) - .set("suits", suits).ai = function (card) { - var player = _status.event.player; - var target = _status.event.getParent("xinfu_daigong").player; - if (get.damageEffect(target, player, player) > 0) return 6.5 - get.value(card); - return 0; - }; - "step 2"; - if (result.bool) { - trigger.source.give(result.cards, player, true); - } else trigger.cancel(); - }, - }, - xinfu_zhaoxin: { - group: ["zhaoxin_give"], - intro: { - content: "expansion", - markcount: "expansion", - }, - enable: "phaseUse", - usable: 1, - audio: 2, - filter: function (event, player) { - return player.countCards("h") > 0 && player.getExpansions("xinfu_zhaoxin").length < 3; - }, - filterCard: true, - selectCard: function () { - var player = _status.event.player; - return [1, 3 - player.getExpansions("xinfu_zhaoxin").length]; - }, - discard: false, - lose: false, - delay: false, - content: function () { - player.addToExpansion(player, "give", cards).gaintag.add("xinfu_zhaoxin"); - player.draw(cards.length); - }, - check: function (card) { - return 6 - get.value(card); - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { - order: 1, - result: { - player: 1, - }, - }, - }, - zhaoxin_give: { - trigger: { - global: "phaseDrawAfter", - }, - filter: function (event, player) { - if (!player.getExpansions("xinfu_zhaoxin").length) return false; - return player == event.player || player.inRange(event.player); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseCardButton(get.prompt("xinfu_zhaoxin", trigger.player), player.getExpansions("xinfu_zhaoxin"), function (button) { - return true; - }) - .set("ai", function (button) { - return 1 + Math.random(); - }); - "step 1"; - if (result.bool) { - event.card = result.links[0]; - player.logSkill("xinfu_zhaoxin", target); - player.line(trigger.player, "thunder"); - player.showCards(event.card); - } else event.finish(); - "step 2"; - trigger.player.chooseBool("是否获得" + get.translation(event.card) + "?").ai = function () { - return get.attitude(trigger.player, player) > 0; - }; - "step 3"; - if (result.bool) { - trigger.player.gain(event.card, "give", player, "bySelf"); - player.chooseBool("是否对" + get.translation(trigger.player) + "造成1点伤害?").ai = function () { - return get.damageEffect(trigger.player, player, player) > 0; - }; - } else { - trigger.player.chat("拒绝"); - event.finish(); - } - "step 4"; - if (result.bool) { - trigger.player.damage("nocard"); - } - }, - }, - xinfu_qianchong: { - audio: 3, - group: ["qc_weimu", "qc_mingzhe"], - subSkill: { - effect: { - charlotte: true, - onremove: true, - mod: { - cardUsable: function (card, player) { - var type = get.type2(card); - if (player.getStorage("xinfu_qianchong_effect").includes(type)) return Infinity; - }, - targetInRange: function (card, player) { - var type = get.type2(card); - if (player.getStorage("xinfu_qianchong_effect").includes(type)) return true; - }, - }, - }, - }, - trigger: { - player: "phaseUseBegin", - }, - direct: true, - filter: function (event, player) { - var es = player.getCards("e"); - if (!es.length) return true; - var col = get.color(es[0]); - for (var i = 0; i < es.length; i++) { - if (get.color(es[i]) != col) return true; - } - return false; - }, - content: function () { - "step 0"; - var list = ["basic", "trick", "equip", "cancel2"]; - list.removeArray(player.getStorage("xinfu_qianchong_effect")); - if (list.length > 1) { - player - .chooseControl(list) - .set("ai", function () { - return list[0]; - }) - .set("prompt", get.prompt("xinfu_qianchong")) - .set("prompt2", "你可以选择一种类别的牌,然后你本回合内使用该类别的牌时没有次数和距离限制。"); - } else event.finish(); - "step 1"; - if (result.control && result.control != "cancel2") { - player.logSkill("xinfu_qianchong"); - var type = result.control; - player.addTempSkill("xinfu_qianchong_effect"); - player.markAuto("xinfu_qianchong_effect", [type]); - var str = get.translation(type) + "牌"; - game.log(player, "声明了", "#y" + str); - player.popup(str, "thunder"); - } - }, - }, - qc_weimu: { - audio: "xinfu_qianchong", - mod: { - targetEnabled: function (card, player, target) { - var bool = true; - var es = target.getCards("e"); - if (!es.length) bool = false; - for (var i = 0; i < es.length; i++) { - if (get.color(es[i]) != "black") bool = false; - } - if (bool && (get.type(card) == "trick" || get.type(card) == "delay") && get.color(card) == "black") return false; - }, - }, - }, - qc_mingzhe: { - audio: "xinfu_qianchong", - trigger: { - player: ["useCard", "respond", "loseAfter"], - global: "loseAsyncAfter", - }, - frequent: true, - filter: function (event, player) { - if (player.hasSkill("mingzhe")) return false; - if (player == _status.currentPhase) return false; - var es = player.getCards("e"); - if (!es.length) return false; - for (var i = 0; i < es.length; i++) { - if (get.color(es[i]) != "red") return false; - } - if (event.name.indexOf("lose") != 0) return get.color(event.card) == "red"; - if (event.type != "discard") return false; - var evt = event.getl(player); - if (evt.cards2) { - for (var i = 0; i < evt.cards2.length; i++) { - if (get.color(evt.cards2[i]) == "red") return true; - } - } - return false; - }, - content: function () { - "step 0"; - event.count = 1; - if (trigger.name.indexOf("lose") == 0) { - event.count = 0; - var evt = trigger.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (get.color(evt.cards2[i]) == "red") event.count++; - } - } - "step 1"; - player.draw(); - event.count--; - "step 2"; - if (event.count && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { - player.chooseBool(get.prompt2("mingzhe")).set("frequentSkill", event.name); - } else event.finish(); - "step 3"; - if (result.bool) { - player.logSkill("qc_mingzhe"); - event.goto(1); - } - }, - ai: { - threaten: 0.7, - }, - }, - xinfu_shangjian: { - trigger: { - global: "phaseJieshuBegin", - }, - audio: 2, - filter: function (event, player) { - var num = 0; - player.getHistory("lose", function (evt) { - var evt2 = evt.getParent(); - if (evt2.name == "useCard" && evt2.player == player && get.type(evt2.card, null, false) == "equip") return; - if (evt.cards2) num += evt.cards2.length; - }); - return num > 0 && num <= player.hp; - }, - forced: true, - content: function () { - "step 0"; - var num = 0; - player.getHistory("lose", function (evt) { - var evt2 = evt.getParent(); - if (evt2.name == "useCard" && evt2.player == player && get.type(evt2.card, null, false) == "equip") return; - if (evt.cards2) num += evt.cards2.length; - }); - if (num > 0) { - player.draw(num); - } - }, - }, - rw_bagua_skill: { - inherit: "bagua_skill", - audio: true, - content: function () { - "step 0"; - player.judge("rewrite_bagua", function (card) { - return get.suit(card) != "spade" ? 1.5 : -0.5; - }).judge2 = function (result) { - return result.bool; - }; - "step 1"; - if (result.judge > 0) { - trigger.untrigger(); - trigger.set("responded", true); - trigger.result = { bool: true, card: { name: "shan" } }; - } - }, - }, - rw_baiyin_skill: { - inherit: "baiyin_skill", - audio: true, - subSkill: { - lose: { - audio: "rw_baiyin_skill", - forced: true, - charlotte: true, - equipSkill: true, - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter: (event, player) => { - if (player.hasSkillTag("unequip2")) return false; - var evt = event.getl(player); - return evt && evt.es.some(card => card.name == "rewrite_baiyin"); - }, - content: function () { - var evt = trigger.getl(player); - evt.es.forEach(card => { - if (card.name == "rewrite_baiyin") { - player.recover(); - player.draw(2); - } - }); - }, - }, - }, - }, - rw_lanyinjia: { - inherit: "lanyinjia", - audio: "lanyinjia", - }, - rw_minguangkai_cancel: { - inherit: "minguangkai_cancel", - }, - rw_minguangkai_link: { - inherit: "minguangkai_link", - trigger: { - player: "linkBefore", - }, - forced: true, - //priority:20, - filter: function (event, player) { - return !player.isLinked(); - }, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (["tiesuo", "lulitongxin"].includes(card.name)) { - return "zerotarget"; - } - }, - }, - }, - }, - rw_renwang_skill: { - inherit: "renwang_skill", - audio: true, - filter: function (event, player) { - if (player.hasSkillTag("unequip2")) return false; - if ( - event.player.hasSkillTag("unequip", false, { - name: event.card ? event.card.name : null, - target: player, - card: event.card, - }) - ) - return false; - return event.card.name == "sha" && (get.suit(event.card) == "heart" || get.color(event.card) == "black"); - }, - ai: { - effect: { - target: function (card, player, target) { - if (typeof card !== "object" || target.hasSkillTag("unequip2")) return; - if ( - player.hasSkillTag("unequip", false, { - name: card ? card.name : null, - target: player, - card: card, - }) || - player.hasSkillTag("unequip_ai", false, { - name: card ? card.name : null, - target: player, - card: card, - }) - ) - return; - if (card.name == "sha" && ["spade", "club", "heart"].includes(get.suit(card))) return "zeroplayertarget"; - }, - }, - }, - }, - rw_tengjia1: { - inherit: "tengjia1", - audio: true, - }, - rw_tengjia2: { - inherit: "tengjia2", - audio: true, - }, - rw_tengjia3: { - audio: "rw_tengjia1", - inherit: "rw_minguangkai_link", - ai: { - effect: { - target: function (card, player, target, current) { - if (["tiesuo", "lulitongxin"].includes(card.name)) { - return "zeroplayertarget"; - } - }, - }, - }, - }, - rw_tengjia4: { - inherit: "tengjia3", - audio: "rw_tengjia1", - }, - xinfu_pingcai: { - subSkill: { backup: {} }, - wolong_card: function () { - "step 0"; - var ingame = game.hasPlayer(function (current) { - return ["sp_zhugeliang", "re_sp_zhugeliang", "ol_sp_zhugeliang", "prp_zhugeliang"].includes(current.name) || ["sp_zhugeliang", "re_sp_zhugeliang", "ol_sp_zhugeliang", "prp_zhugeliang"].includes(current.name2); - }) - ? true - : false; - var prompt = "请选择"; - prompt += ingame ? "至多两名" : "一名"; - prompt += "角色,对其造成1点火焰伤害"; - var range = ingame ? [1, 2] : [1, 1]; - player.chooseTarget(prompt, range).set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player, "fire"); - }); - "step 1"; - if (result.bool && result.targets.length) { - player.line(result.targets, "fire"); - result.targets.sortBySeat(); - for (var i = 0; i < result.targets.length; i++) { - result.targets[i].damage("fire"); - } - } - }, - fengchu_card: function () { - "step 0"; - var ingame = game.hasPlayer(function (current) { - return ["re_pangtong", "pangtong", "ol_pangtong"].includes(current.name) || ["re_pangtong", "pangtong", "ol_pangtong"].includes(current.name2); - }) - ? true - : false; - var prompt = "请选择"; - prompt += ingame ? "至多四名" : "至多三名"; - prompt += "要横置的角色"; - var range = ingame ? [1, 4] : [1, 3]; - player.chooseTarget(prompt, range).set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "tiesuo" }, player, player); - }); - "step 1"; - if (result.bool && result.targets.length) { - player.line(result.targets, "green"); - result.targets.sortBySeat(); - for (var i = 0; i < result.targets.length; i++) { - result.targets[i].link(); - } - } - }, - xuanjian_card: function () { - "step 0"; - event.ingame = game.hasPlayer(function (current) { - return ["re_xushu", "xin_xushu", "xushu", "dc_xushu"].includes(current.name) || ["re_xushu", "xin_xushu", "xushu", "dc_xushu"].includes(current.name2); - }) - ? true - : false; - var prompt = "请选择一名角色,令其回复1点体力并摸一张牌"; - prompt += event.ingame ? ",然后你摸一张牌。" : "。"; - player.chooseTarget(prompt).set("ai", function (target) { - var player = _status.event.player; - return get.attitude(player, target) * (target.isDamaged() ? 2 : 1); - }); - "step 1"; - if (result.bool && result.targets.length) { - var target = result.targets[0]; - player.line(target, "thunder"); - target.draw(); - target.recover(); - if (event.ingame) player.draw(); - } - }, - shuijing_card: function () { - "step 0"; - event.ingame = game.hasPlayer(function (current) { - return current.name == "simahui" || current.name2 == "simahui"; - }) - ? true - : false; - var prompt = "将一名角色装备区中的"; - prompt += event.ingame ? "一张牌" : "防具牌"; - prompt += "移动到另一名角色的装备区中"; - var next = player.chooseTarget(2, function (card, player, target) { - if (ui.selected.targets.length) { - if (!_status.event.ingame) { - var cards = ui.selected.targets[0].getEquips(2); - return cards.some(card => target.canEquip(card)); - } - var from = ui.selected.targets[0]; - if (target.isMin()) return false; - var es = from.getCards("e"); - for (var i = 0; i < es.length; i++) { - if (target.canEquip(es[i])) return true; - } - return false; - } else { - if (!event.ingame) { - if (target.getEquips(2).length) return true; - return false; - } - return target.countCards("e") > 0; - } - }); - next.set("ingame", event.ingame); - next.set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (ui.selected.targets.length == 0) { - if (att < 0) { - if ( - game.hasPlayer(function (current) { - if (get.attitude(player, current) > 0) { - var es = target.getCards("e"); - for (var i = 0; i < es.length; i++) { - if (current.canEquip(es[i])) return true; - } - return false; - } - }) - ) - return -att; - } - return 0; - } - if (att > 0) { - var es = ui.selected.targets[0].getCards("e"); - var i; - for (i = 0; i < es.length; i++) { - if (target.canEquip(es[i])) break; - } - if (i == es.length) return 0; - } - return -att * get.attitude(player, ui.selected.targets[0]); - }); - next.set("multitarget", true); - next.set("targetprompt", ["被移走", "移动目标"]); - next.set("prompt", prompt); - "step 1"; - if (result.bool) { - player.line2(result.targets, "green"); - event.targets = result.targets; - } else event.finish(); - "step 2"; - game.delay(); - "step 3"; - if (targets.length == 2) { - if (!event.ingame) { - var cards = targets[0].getEquips(2); - if (cards.length == 1) - event._result = { - bool: true, - links: cards, - }; - else { - player - .choosePlayerCard( - "e", - true, - function (button) { - return get.equipValue(button.link); - }, - targets[0] - ) - .set("targets0", targets[0]) - .set("targets1", targets[1]) - .set("filterButton", function (button) { - if (!get.subtypes(button.link, false).includes("equip2")) return false; - var targets1 = _status.event.targets1; - return targets1.canEquip(button.link); - }); - } - } else { - player - .choosePlayerCard( - "e", - true, - function (button) { - return get.equipValue(button.link); - }, - targets[0] - ) - .set("targets0", targets[0]) - .set("targets1", targets[1]) - .set("filterButton", function (button) { - var targets1 = _status.event.targets1; - return targets1.canEquip(button.link); - }); - } - } else event.finish(); - "step 4"; - if (result.bool && result.links.length) { - var link = result.links[0]; - if (get.position(link) == "e") event.targets[1].equip(link); - else if (link.viewAs) event.targets[1].addJudge({ name: link.viewAs }, [link]); - else event.targets[1].addJudge(link); - event.targets[0].$give(link, event.targets[1], false); - game.delay(); - } - }, - audio: true, - enable: "phaseUse", - usable: 1, - chooseButton: { - dialog: function () { - var list = ["wolong", "fengchu", "xuanjian", "shuijing"]; - for (var i = 0; i < list.length; i++) { - list[i] = ["", "", list[i] + "_card"]; - } - return ui.create.dialog("评才", [list, "vcard"]); - }, - check: function (button) { - var name = button.link[2]; - var player = _status.event.player; - if (name == "xuanjian_card") { - if ( - game.hasPlayer(function (current) { - return current.isDamaged() && current.hp < 3 && get.attitude(player, current) > 1; - }) - ) - return 1 + Math.random(); - else return 1; - } else if (name == "wolong_card") { - if ( - game.hasPlayer(function (current) { - return get.damageEffect(current, player, player, "fire") > 0; - }) - ) - return 1.2 + Math.random(); - else return 0.5; - } else return 0.6; - }, - backup: function (links, player) { - return { - audio: "xinfu_pingcai", - filterCard: () => false, - selectCard: -1, - takara: links[0][2], - content: lib.skill.xinfu_pingcai.contentx, - }; - }, - }, - contentx: function () { - "step 0"; - event.pingcai_delayed = true; - var name = lib.skill.xinfu_pingcai_backup.takara; - event.cardname = name; - event.videoId = lib.status.videoId++; - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - game.pause(); - game.countChoose(); - event.timeout = setTimeout(function () { - _status.imchoosing = false; - event._result = { - bool: true, - }; - game.resume(); - }, 9000); - }; - var createDialog = function (player, id, name) { - if (player == game.me) return; - var dialog = ui.create.dialog("forcebutton", "hidden"); - var str = get.translation(player) + "正在擦拭宝物上的灰尘…"; - var canSkip = !_status.connectMode; - if (canSkip) str += "
    (点击宝物可以跳过等待AI操作)"; - dialog.textPrompt = dialog.add('
    ' + str + "
    "); - dialog.classList.add("fixed"); - dialog.classList.add("scroll1"); - dialog.classList.add("scroll2"); - dialog.classList.add("fullwidth"); - dialog.classList.add("fullheight"); - dialog.classList.add("noupdate"); - dialog.videoId = id; - - var canvas2 = document.createElement("canvas"); - dialog.canvas_viewer = canvas2; - dialog.appendChild(canvas2); - canvas2.classList.add("grayscale"); - canvas2.style.position = "absolute"; - canvas2.style.width = "249px"; - canvas2.style.height = "249px"; - canvas2.style["border-radius"] = "6px"; - canvas2.style.left = "calc(50% - 125px)"; - canvas2.style.top = "calc(50% - 125px)"; - canvas2.width = 249; - canvas2.height = 249; - canvas2.style.border = "3px solid"; - - var ctx2 = canvas2.getContext("2d"); - var img = new Image(); - img.src = lib.assetURL + "image/card/" + name + ".png"; - img.onload = function () { - ctx2.drawImage(this, 0, 0, this.width, this.height, 0, 0, canvas2.width, canvas2.height); - }; - if (canSkip) { - var skip = function () { - if (event.pingcai_delayed) { - delete event.pingcai_delayed; - clearTimeout(event.timeout); - event._result = { - bool: true, - }; - game.resume(); - canvas2.removeEventListener(lib.config.touchscreen ? "touchend" : "click", skip); - } - }; - canvas2.addEventListener(lib.config.touchscreen ? "touchend" : "click", skip); - } - dialog.open(); - }; - var chooseButton = function (id, name) { - var event = _status.event; - _status.xinfu_pingcai_finished = false; - - var dialog = ui.create.dialog("forcebutton", "hidden"); - dialog.textPrompt = dialog.add('
    擦拭掉宝物上的灰尘吧!
    '); - event.switchToAuto = function () { - event._result = { - bool: _status.xinfu_pingcai_finished, - }; - game.resume(); - _status.imchoosing = false; - _status.xinfu_pingcai_finished = true; - }; - dialog.classList.add("fixed"); - dialog.classList.add("scroll1"); - dialog.classList.add("scroll2"); - dialog.classList.add("fullwidth"); - dialog.classList.add("fullheight"); - dialog.classList.add("noupdate"); - dialog.videoId = id; - - var canvas = document.createElement("canvas"); - var canvas2 = document.createElement("canvas"); - - dialog.appendChild(canvas2); - dialog.appendChild(canvas); - - canvas.style.position = "absolute"; - canvas.style.width = "249px"; - canvas.style.height = "249px"; - canvas.style["border-radius"] = "6px"; - canvas.style.left = "calc(50% - 125px)"; - canvas.style.top = "calc(50% - 125px)"; - canvas.width = 249; - canvas.height = 249; - canvas.style.border = "3px solid"; - - canvas2.style.position = "absolute"; - canvas2.style.width = "249px"; - canvas2.style.height = "249px"; - canvas2.style["border-radius"] = "6px"; - canvas2.style.left = "calc(50% - 125px)"; - canvas2.style.top = "calc(50% - 125px)"; - canvas2.width = 249; - canvas2.height = 249; - canvas2.style.border = "3px solid"; - - var ctx = canvas.getContext("2d"); - var ctx2 = canvas2.getContext("2d"); - - var img = new Image(); - img.src = lib.assetURL + "image/card/" + name + ".png"; - img.onload = function () { - ctx2.drawImage(this, 0, 0, this.width, this.height, 0, 0, canvas2.width, canvas2.height); - }; - - ctx.fillStyle = "lightgray"; - ctx.fillRect(0, 0, canvas.width, canvas.height); - - canvas.onmousedown = function (ev) { - //if(_status.xinfu_pingcai_finished) return; - canvas.onmousemove = function (e) { - if (_status.xinfu_pingcai_finished) return; - ctx.beginPath(); - ctx.clearRect(e.offsetX - 16, e.offsetY - 16, 32, 32); - var data = ctx.getImageData(canvas.width * 0.1, canvas.height * 0.1, canvas.width * 0.8, canvas.height * 0.8).data; - var sum = 0; - for (var i = 3; i < data.length; i += 4) { - if (data[i] == 0) { - sum++; - } - } - if (sum >= canvas.width * canvas.height * 0.6) { - //ctx.clearRect(0,0,canvas.width,canvas.height); - if (!_status.xinfu_pingcai_finished) { - _status.xinfu_pingcai_finished = true; - event.switchToAuto(); - } - } - }; - }; - canvas.ontouchstart = function (ev) { - //if(_status.xinfu_pingcai_finished) return; - canvas.ontouchmove = function (e) { - if (_status.xinfu_pingcai_finished) return; - ctx.beginPath(); - var rect = canvas.getBoundingClientRect(); - var X = ((e.touches[0].clientX - rect.left) / rect.width) * canvas.width; - var Y = ((e.touches[0].clientY - rect.top) / rect.height) * canvas.height; - ctx.clearRect(X - 16, Y - 16, 32, 32); - var data = ctx.getImageData(canvas.width * 0.1, canvas.height * 0.1, canvas.width * 0.8, canvas.height * 0.8).data; - var sum = 0; - for (var i = 3; i < data.length; i += 4) { - if (data[i] == 0) { - sum++; - } - } - if (sum >= canvas.width * canvas.height * 0.6) { - if (!_status.xinfu_pingcai_finished) { - _status.xinfu_pingcai_finished = true; - event.switchToAuto(); - } - } - }; - }; - canvas.onmouseup = function (ev) { - canvas.onmousemove = null; - }; - canvas.ontouchend = function (ev) { - canvas.ontouchmove = null; - }; - - dialog.open(); - - game.pause(); - game.countChoose(); - }; - //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog, player, event.videoId, name); - if (event.isMine()) { - chooseButton(event.videoId, name); - } else if (event.isOnline()) { - event.player.send(chooseButton, event.videoId, name); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 1"; - var result = event.result || result; - if (!result) result = { bool: false }; - event._result = result; - game.broadcastAll( - function (id, result, player) { - _status.xinfu_pingcai_finished = true; - var dialog = get.idDialog(id); - if (dialog) { - dialog.textPrompt.innerHTML = '
    ' + (get.translation(player) + "擦拭宝物" + (result.bool ? "成功!" : "失败…")) + "
    "; - if (result.bool && dialog.canvas_viewer) dialog.canvas_viewer.classList.remove("grayscale"); - } - if (!_status.connectMode) delete event.pingcai_delayed; - }, - event.videoId, - result, - player - ); - game.delay(2.5); - "step 2"; - game.broadcastAll("closeDialog", event.videoId); - if (result.bool) { - player.logSkill("pcaudio_" + event.cardname); - event.insert(lib.skill.xinfu_pingcai[event.cardname], { - player: player, - }); - } - }, - ai: { - order: 7, - fireAttack: true, - threaten: 1.7, - result: { - player: 1, - }, - }, - }, - xinfu_pdgyingshi: { - mod: { - targetEnabled: function (card, player, target) { - if (get.type(card) == "delay") { - return false; - } - }, - }, - trigger: { - player: ["phaseZhunbeiBefore", "phaseJieshuBefore"], - }, - forced: true, - audio: 2, - group: "xinfu_pdgyingshi2", - content: function () { - trigger.cancel(); - game.log(player, "跳过了", event.triggername == "phaseZhunbeiBefore" ? "准备阶段" : "结束阶段"); - }, - }, - xinfu_pdgyingshi2: { - popup: false, - trigger: { - player: "phaseJudgeBefore", - }, - forced: true, - content: function () { - trigger.cancel(); - game.log(player, "跳过了判定阶段"); - }, - }, - pcaudio_wolong_card: { - audio: true, - }, - pcaudio_fengchu_card: { - audio: true, - }, - pcaudio_shuijing_card: { - audio: true, - }, - pcaudio_xuanjian_card: { - audio: true, - }, - yizan_use: { - audio: "yizan_respond_shan", - intro: { - content: "已发动过#次", - }, - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - if (get.type(name) != "basic") return false; - if (!player.storage.yizan && player.countCards("hes") < 2) return false; - return player.hasCard(function (card) { - return get.type(card) == "basic"; - }, "hs"); - }, - filter: function (event, player) { - if (!player.storage.yizan && player.countCards("hes") < 2) return false; - if ( - !player.hasCard(function (card) { - return get.type(card) == "basic"; - }, "hs") - ) - return false; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - if (event.filterCard(get.autoViewAs({ name, nature }, "unsure"), player, event)) return true; - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) { - list.push(["基本", "", name]); - } - if (name == "sha") { - for (var nature of lib.inpile_nature) { - if (event.filterCard(get.autoViewAs({ name, nature }, "unsure"), player, event)) list.push(["基本", "", "sha", nature]); - } - } - } - return ui.create.dialog("翊赞", [list, "vcard"], "hidden"); - }, - check: function (button) { - var player = _status.event.player; - var card = { name: button.link[2], nature: button.link[3] }; - if ( - _status.event.getParent().type != "phase" || - game.hasPlayer(function (current) { - return player.canUse(card, current) && get.effect(current, card, player, player) > 0; - }) - ) { - switch (button.link[2]) { - case "tao": - case "shan": - return 5; - case "jiu": { - if (player.storage.yizan && player.countCards("hs", { type: "basic" }) > 2) return 3; - } - case "sha": - if (button.link[3] == "fire") return 2.95; - else if (button.link[3] == "thunder" || button.link[3] == "ice") return 2.92; - else return 2.9; - } - } - return 0; - }, - backup: function (links, player) { - return { - audio: "yizan_respond_shan", - filterCard: function (card, player, target) { - if (player.storage.yizan) return get.type(card) == "basic"; - else if (ui.selected.cards.length) { - if (get.type(ui.selected.cards[0]) == "basic") return true; - return get.type(card) == "basic"; - } - return true; - }, - complexCard: true, - selectCard: function () { - var player = _status.event.player; - if (player.storage.yizan) return 1; - return 2; - }, - check: function (card, player, target) { - if (!ui.selected.cards.length && get.type(card) == "basic") return 6; - else return 6 - get.value(card); - }, - viewAs: { name: links[0][2], nature: links[0][3] }, - position: "hes", - popname: true, - precontent: function () { - player.addMark("yizan_use", 1, false); - }, - }; - }, - prompt: function (links, player) { - var str = player.storage.yizan ? "一张基本牌" : "两张牌(其中至少应有一张基本牌)"; - return "将" + str + "当做" + get.translation(links[0][3] || "") + get.translation(links[0][2]) + "使用或打出"; - }, - }, - ai: { - order: function () { - var player = _status.event.player; - var event = _status.event; - if (event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0 && player.storage.yizan && player.countCards("hs", { type: "basic" }) > 2) { - return 3.3; - } - return 3.1; - }, - skillTagFilter: function (player, tag, arg) { - if (tag == "fireAttack") return true; - if (!player.storage.yizan && player.countCards("hes") < 2) return false; - if ( - !player.hasCard(function (card) { - return get.type(card) == "basic"; - }, "hes") - ) { - return false; - } - }, - result: { - player: 1, - }, - respondSha: true, - respondShan: true, - fireAttack: true, - }, - }, - yizan_respond_shan: { - audio: 2, - }, - xinfu_longyuan: { - audio: 2, - forced: true, - unique: true, - juexingji: true, - trigger: { - player: "phaseZhunbeiBegin", - }, - skillAnimation: true, - animationColor: "orange", - filter: function (event, player) { - return player.countMark("yizan_use") >= 3; - }, - content: function () { - player.awakenSkill("xinfu_longyuan"); - player.storage.yizan = true; - }, - derivation: "yizan_rewrite", - ai: { - combo: "yizan_use", - }, - }, - xinfu_jingxie: { - audio: 2, - video: function (player, info) { - var l2 = player.getCards(info[0] ? "e" : "h"), - l1 = info[1]; - for (var j = 0; j < l2.length; j++) { - if (l2[j].suit == l1[0] && l2[j].number == l1[1] && l2[j].name == l1[2]) { - l2[j].init([l2[j].suit, l2[j].number, "rewrite_" + l2[j].name]); - break; - } - } - }, - }, - xinfu_jingxie1: { - group: ["xinfu_jingxie2"], - position: "he", - audio: "xinfu_jingxie", - enable: "phaseUse", - filter: function (event, player) { - var he = player.getCards("he"); - for (var i = 0; i < he.length; i++) { - if (["bagua", "baiyin", "lanyinjia", "renwang", "tengjia", "zhuge"].includes(he[i].name)) return true; - } - return false; - }, - filterCard: function (card) { - return ["bagua", "baiyin", "lanyinjia", "renwang", "tengjia", "zhuge"].includes(card.name); - }, - discard: false, - lose: false, - delay: false, - check: function () { - return 1; - }, - content: function () { - "step 0"; - player.showCards(cards); - "step 1"; - var card = cards[0]; - var bool = get.position(card) == "e"; - if (bool) player.removeEquipTrigger(card); - game.addVideo("skill", player, ["xinfu_jingxie", [bool, get.cardInfo(card)]]); - game.broadcastAll(function (card) { - card.init([card.suit, card.number, "rewrite_" + card.name]); - }, card); - if (bool) { - var info = get.info(card); - if (info.skills) { - for (var i = 0; i < info.skills.length; i++) { - player.addSkillTrigger(info.skills[i]); - } - } - } - }, - ai: { - basic: { - order: 10, - }, - result: { - player: 1, - }, - }, - }, - xinfu_jingxie2: { - prompt: "重铸一张防具牌,然后将体力回复至1点。", - audio: "xinfu_jingxie", - enable: "chooseToUse", - filterCard: (card, player) => get.subtype(card) == "equip2" && player.canRecast(card), - filter: (event, player) => { - if (event.type != "dying") return false; - if (player != event.dying) return false; - return player.hasCard(card => lib.skill.xinfu_jingxie2.filterCard(card, player), "he"); - }, - position: "he", - discard: false, - lose: false, - delay: false, - content: function () { - "step 0"; - player.recast(cards); - "step 1"; - var num = 1 - player.hp; - if (num) player.recover(num); - }, - ai: { - order: 0.5, - skillTagFilter: function (player, arg, target) { - if (player != target) return false; - return player.hasCard(card => (_status.connectMode && get.position(card) == "h") || (get.subtype(card) == "equip2" && player.canRecast(card)), "he"); - }, - save: true, - result: { - player: function (player) { - return 10; - }, - }, - }, - }, - xinfu_qiaosi: { - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - if (get.isLuckyStar(player)) { - event.num = 6; - player.throwDice(6); - } else player.throwDice(); - "step 1"; - event.cards = get.cards(event.num); - player.showCards(event.cards); - "step 2"; - player.gain(event.cards, "gain2"); - player - .chooseControl() - .set("choiceList", ["将" + get.cnNumber(event.num) + "张牌交给一名其他角色", "弃置" + get.cnNumber(event.num) + "张牌"]) - .set("ai", function () { - if ( - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 2; - }) - ) - return 0; - return 1; - }); - "step 3"; - if (result.index == 0) { - player.chooseCardTarget({ - position: "he", - filterCard: true, - selectCard: event.num, - filterTarget: function (card, player, target) { - return player != target; - }, - ai1: function (card) { - return 1; - }, - ai2: function (target) { - var att = get.attitude(_status.event.player, target); - return att; - }, - prompt: "请选择要送人的卡牌", - forced: true, - }); - } else { - player.chooseToDiscard(event.num, true, "he"); - event.finish(); - } - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.give(result.cards, target); - } - }, - ai: { - order: 7.5, - result: { - player: 1, - }, - }, - }, - zhaohuo: { - audio: 2, - audioname: ["re_taoqian"], - trigger: { global: "dying" }, - forced: true, - //priority:12, - filter: function (event, player) { - return event.player != player && player.maxHp > 1; - }, - content: function () { - "step 0"; - event.num = player.maxHp - 1; - player.loseMaxHp(event.num, true); - "step 1"; - player.draw(event.num); - }, - ai: { - halfneg: true - }, - }, - yixiang: { - audio: 2, - audioname: ["re_taoqian"], - trigger: { target: "useCardToTargeted" }, - frequent: true, - filter: function (event, player) { - if (event.player.hp <= player.hp) return false; - //if(event.targets.length>1) return false; - var hs = player.getCards("h"); - var names = ["sha", "shan", "tao", "jiu", "du"]; - for (var i = 0; i < hs.length; i++) { - names.remove(hs[i].name); - } - if (!names.length) return false; - for (var i = 0; i < ui.cardPile.childElementCount; i++) { - if (names.includes(ui.cardPile.childNodes[i].name)) { - return true; - } - } - return false; - }, - usable: 1, - content: function () { - var hs = player.getCards("h"); - var list = []; - var names = ["sha", "shan", "tao", "jiu", "du"]; - for (var i = 0; i < hs.length; i++) { - names.remove(hs[i].name); - } - for (var i = 0; i < ui.cardPile.childElementCount; i++) { - if (names.includes(ui.cardPile.childNodes[i].name)) { - list.push(ui.cardPile.childNodes[i]); - } - } - if (list.length) { - player.gain(list.randomGet(), "draw"); - } - }, - }, - yirang: { - audio: 2, - audioname: ["re_taoqian"], - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - if ( - !player.countCards("he", function (card) { - return get.type(card) != "basic"; - }) - ) { - return false; - } - return game.hasPlayer(function (current) { - return current.maxHp > player.maxHp; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("yirang"), function (card, player, target) { - return target.maxHp > player.maxHp; - }) - .set("ai", function (target) { - return (get.attitude(_status.event.player, target) - 2) * target.maxHp; - }); - "step 1"; - if (result.bool) { - var cards = player.getCards("he", function (card) { - return get.type(card) != "basic"; - }); - var target = result.targets[0]; - var types = []; - for (var i = 0; i < cards.length; i++) { - types.add(get.type(cards[i], "trick")); - } - player.logSkill("yirang", target); - player.give(cards, target); - player.gainMaxHp(target.maxHp - player.maxHp, true); - player.recover(types.length); - game.delay(); - } - }, - }, - kuangcai: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return !event.player.isMad(); - }, - content: function () { - game.broadcastAll(function (player) { - player.forceCountChoose = { phaseUse: 5 }; - }, player); - player.addSkill("kuangcai_use"); - player.addSkill("kuangcai_cancel"); - //ui.auto.hide(); - }, - subSkill: { - use: { - mod: { - cardUsable: function (card) { - if (get.info(card) && get.info(card).forceUsable) return; - return Infinity; - }, - targetInRange: function () { - return true; - }, - aiOrder: function (player, card, num) { - var name = get.name(card); - if (name == "tao") return num + 7 + Math.pow(player.getDamagedHp(), 2); - if (name == "sha") return num + 6; - if (get.subtype(card) == "equip2") return num + get.value(card) / 3; - }, - }, - trigger: { player: "useCard" }, - forced: true, - charlotte: true, - silent: true, - popup: false, - filter: function (event, player) { - if (!player.forceCountChoose || !player.forceCountChoose.phaseUse) { - return false; - } - return true; - }, - content: function () { - player.draw(); - if (player.forceCountChoose.phaseUse == 1) { - var evt = event.getParent("phaseUse"); - if (evt) evt.skipped = true; - } else - game.broadcastAll(function (player) { - player.forceCountChoose.phaseUse--; - }, player); - }, - }, - cancel: { - trigger: { player: "phaseUseEnd" }, - firstDo: true, - silent: true, - charlotte: true, - content: function () { - game.broadcastAll(function (player) { - delete player.forceCountChoose; - }, player); - //ui.auto.show(); - player.removeSkill("kuangcai_use"); - player.removeSkill("kuangcai_cancel"); - }, - }, - }, - ai: { - threaten: 4.5, - }, - }, - shejian: { - audio: 2, - trigger: { player: "phaseDiscardEnd" }, - direct: true, - filter: function (event, player) { - var cards = []; - player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) cards.addArray(evt.cards2); - }); - if (cards) { - if (cards.length < 2) return false; - var suits = []; - for (var i = 0; i < cards.length; i++) { - var suit = get.suit(cards[i]); - if (suits.includes(suit)) { - return false; - } else { - suits.push(suit); - } - } - return true; - } - return false; - }, - content: function () { - "step 0"; - player.chooseTarget(get.prompt("shejian"), "弃置一名其他角色的一张牌", function (card, player, target) { - if (player == target) return false; - return target.countDiscardableCards(player, "he") > 0; - }).ai = function (target) { - return -get.attitude(player, target); - }; - "step 1"; - if (result.bool) { - player.logSkill("shejian", result.targets); - player.discardPlayerCard(result.targets[0], "he", true); - } else { - event.finish(); - } - }, - }, - shixin: { - audio: 2, - trigger: { player: "damageBegin4" }, - filter: function (event) { - return event.hasNature("fire"); - }, - forced: true, - content: function () { - trigger.cancel(); - }, - ai: { - nofire: true, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "fireDamage")) return "zerotarget"; - }, - }, - }, - }, - fenyin: { - locked: false, - mod: { - aiOrder: function (player, card, num) { - if (typeof card == "object" && player == _status.currentPhase) { - var evt = player.getLastUsed(); - if (evt && evt.card && get.color(evt.card) != "none" && get.color(card) != "none" && get.color(evt.card) != get.color(card)) { - return num + 10; - } - } - }, - }, - audio: 2, - trigger: { player: "useCard" }, - frequent: true, - //usable:3, - filter: function (event, player) { - if (_status.currentPhase != player) return false; - var evt = player.getLastUsed(1); - if (!evt) return false; - var color1 = get.color(evt.card); - var color2 = get.color(event.card); - return color1 && color2 && color1 != "none" && color2 != "none" && color1 != color2; - }, - content: function () { - player.draw(); - }, - ai: { - threaten: 3, - }, - }, - dujin: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - frequent: true, - preHidden: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.num += 1 + Math.ceil(player.countCards("e") / 2); - }, - }, - yingjian: { - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - audio: "qingyi", - content: function () { - player.chooseUseTarget("###是否发动【影箭】?###视为使用一张没有距离限制的【杀】", { name: "sha" }, false, "nodistance").logSkill = "yingjian"; - }, - ai: { - threaten: function (player, target) { - return 1.6; - }, - }, - }, - tunchu: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - frequent: true, - preHidden: true, - locked: false, - filter: function (event, player) { - if (event.numFixed || player.getExpansions("tunchu").length) return false; - return true; - }, - content: function () { - trigger.num += 2; - player.addTempSkill("tunchu_choose", "phaseDrawAfter"); - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - mod: { - cardEnabled: function (card, player) { - if (player.getExpansions("tunchu").length && card.name == "sha") { - return false; - } - }, - }, - subSkill: { - choose: { - trigger: { player: "phaseDrawEnd" }, - forced: true, - popup: false, - charlotte: true, - content: function () { - "step 0"; - player.removeSkill("tunchu_choose"); - var nh = player.countCards("h"); - if (nh) { - player.chooseCard("h", [1, nh], "将任意张手牌置于你的武将牌上").set("ai", function (card) { - var player = _status.event.player; - var count = game.countPlayer(function (current) { - return get.attitude(player, current) > 2 && current.hp - current.countCards("h") > 1; - }); - if (ui.selected.cards.length >= count) return -get.value(card); - return 5 - get.value(card); - }); - } else { - event.finish(); - } - "step 1"; - if (result.bool) { - player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("tunchu"); - } - }, - }, - }, - }, - shuliang: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.getExpansions("tunchu").length > 0 && event.player.countCards("h") < event.player.hp && event.player.isIn(); - }, - content: function () { - "step 0"; - var goon = get.attitude(player, trigger.player) > 0; - player - .chooseCardButton(get.prompt("shuliang", trigger.player), player.getExpansions("tunchu")) - .set("ai", function () { - if (_status.event.goon) return 1; - return 0; - }) - .set("goon", goon); - "step 1"; - if (result.bool) { - player.logSkill("shuliang", trigger.player); - player.loseToDiscardpile(result.links); - trigger.player.draw(2); - } - }, - ai: { combo: "tunchu" }, - }, - choulve: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("he"); - }); - }, - content: function () { - "step 0"; - var str = "令一名其他角色交给你一张牌"; - var history = player.getAllHistory("damage", function (evt) { - return evt.card && evt.card.name && lib.card[evt.card.name]; - }); - if (history.length) event.cardname = history[history.length - 1].card.name; - if (event.cardname) { - str += "若其如此做,视为你使用【" + get.translation(event.cardname) + "】"; - } - var goon = true; - if (event.cardname) { - goon = game.hasPlayer(function (current) { - return player.canUse(event.cardname, current) && get.effect(current, { name: event.cardname }, player, player) > 0; - }); - } - player - .chooseTarget(get.prompt("choulve"), str, function (card, player, target) { - return target != player && target.countCards("he"); - }) - .set("ai", function (target) { - if (!_status.event.goon) return 0; - var player = _status.event.player; - if (get.attitude(player, target) >= 0 && get.attitude(target, player) >= 0) { - return Math.sqrt(target.countCards("he")); - } - return 0; - }) - .set("goon", goon); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("choulve", target); - target - .chooseCard("he", "是否交给" + get.translation(player) + "一张牌?", event.cardname ? "若如此做,视为" + get.translation(player) + "使用【" + get.translation(event.cardname) + "】" : null) - .set("ai", function (card) { - if (_status.event.goon) return 7 - get.value(card); - return 0; - }) - .set("goon", get.attitude(target, player) > 1); - event.target = target; - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - event.target.give(result.cards, player); - if (event.cardname) { - player.chooseUseTarget(event.cardname, true, false); - } - } - }, - }, - polu: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - if (!lib.inpile.includes("ly_piliche")) return true; - return !!get.cardPile(function (card) { - return card.name == "ly_piliche"; - }); - }, - content: function () { - var card; - if (!lib.inpile.includes("ly_piliche")) { - card = game.createCard2("ly_piliche", "diamond", 1); - lib.inpile.push("ly_piliche"); - } else - card = get.cardPile(function (card) { - return card.name == "ly_piliche"; - }); - player.chooseUseTarget(card, true, "nopopup"); - }, - group: "polu_damage", - subSkill: { - damage: { - trigger: { player: "damageEnd" }, - forced: true, - filter: function (event, player) { - return !player.getEquips("ly_piliche").length; - }, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - player.draw(); - "step 2"; - var card = get.cardPile2(function (card) { - return get.subtype(card, false) == "equip1" && player.canUse(card, player); - }); - if (card) player.chooseUseTarget(card, true, "nopopup"); - "step 3"; - if (event.count > 0 && !player.getEquips("ly_piliche").length) event.goto(1); - }, - }, - }, - }, - ly_piliche: { - trigger: { source: "damageSource" }, - check: function (event, player) { - return get.attitude(player, event.player) * get.value(event.player.getDiscardableCards(player, "e"), event.player) <= 0; - }, - filter: function (event, player) { - return player != event.player && event.player.countDiscardableCards(player, "e") > 0; - }, - logTarget: "player", - content: function () { - player.discardPlayerCard(trigger.player, "e", true, trigger.player.countCards("e")); - }, - }, - xinzhilve: { - enable: "phaseUse", - audio: "zhilve", - usable: 1, - chooseButton: { - dialog: function (event, player) { - var list = ["移动场上的一张牌", "摸一张牌并视为使用一张【杀】"]; - var choiceList = ui.create.dialog("知略:失去1点体力并...", "forcebutton", "hidden"); - choiceList.add([ - list.map((item, i) => { - return [i, item]; - }), - "textbutton", - ]); - return choiceList; - }, - filter: function (button, player) { - if (button.link == 0) return player.canMoveCard(); - return player.hasUseTarget({ name: "sha", isCard: true }, false); - }, - check: function (button) { - return button.link; - }, - backup: function (links) { - return lib.skill["xinzhilve_" + ["move", "use"][links[0]]]; - }, - prompt: function () { - return "请选择【杀】的目标"; - }, - }, - ai: { - order: function (item, player) { - return get.order({ name: "sha" }) + 0.1; - }, - result: { - player: function (player) { - if (player.hp > 2 && player.hasValueTarget({ name: "sha" })) return 1; - return 0; - }, - }, - }, - }, - xinzhilve_move: { - audio: "zhilve", - filterCard: function () { - return false; - }, - selectCard: -1, - delay: false, - content: function () { - "step 0"; - event.forceDie = true; - if (!player.canMoveCard(null, event.nojudge)) { - event.finish(); - return; - } - var next = player.chooseTarget(2, function (card, player, target) { - if (ui.selected.targets.length) { - var from = ui.selected.targets[0]; - var js = from.getCards("j"); - for (var i = 0; i < js.length; i++) { - if (_status.event.nojudge) break; - if (target.canAddJudge(js[i])) return true; - } - if (target.isMin()) return false; - var es = from.getCards("e"); - for (var i = 0; i < es.length; i++) { - if (target.canEquip(es[i])) return true; - } - return false; - } else { - var range = "ej"; - if (_status.event.nojudge) range = "e"; - return target.countCards(range) > 0; - } - }); - next.set("nojudge", event.nojudge || false); - next.set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - var sgnatt = get.sgn(att); - if (ui.selected.targets.length == 0) { - if (att > 0) { - if ( - !_status.event.nojudge && - target.countCards("j", function (card) { - return game.hasPlayer(function (current) { - return current.canAddJudge(card) && get.attitude(player, current) < 0; - }); - }) - ) - return 14; - if ( - target.countCards("e", function (card) { - return ( - get.value(card, target) < 0 && - game.hasPlayer(function (current) { - return current != target && get.attitude(player, current) < 0 && current.canEquip(card); - }) - ); - }) > 0 - ) - return 9; - } else if (att < 0) { - if ( - game.hasPlayer(function (current) { - if (current != target && get.attitude(player, current) > 0) { - var es = target.getCards("e"); - for (var i = 0; i < es.length; i++) { - if (get.value(es[i], target) > 0 && current.canEquip(es[i]) && get.value(es[i], current) > 0) return true; - } - } - }) - ) { - return -att; - } - } - return 0; - } - var es = ui.selected.targets[0].getCards("e"); - var i; - var att2 = get.sgn(get.attitude(player, ui.selected.targets[0])); - for (i = 0; i < es.length; i++) { - if (sgnatt != 0 && att2 != 0 && get.sgn(get.value(es[i], ui.selected.targets[0])) == -att2 && get.sgn(get.value(es[i], target)) == sgnatt && target.canEquip(es[i])) { - return Math.abs(att); - } - } - if ( - i == es.length && - (_status.event.nojudge || - !ui.selected.targets[0].countCards("j", function (card) { - return target.canAddJudge(card); - })) - ) { - return 0; - } - return -att * get.attitude(player, ui.selected.targets[0]); - }); - next.set("multitarget", true); - next.set("targetprompt", _status.event.targetprompt || ["被移走", "移动目标"]); - next.set("prompt", event.prompt || "移动场上的一张牌"); - if (event.prompt2) next.set("prompt2", event.prompt2); - if (event.forced) next.set("forced", true); - "step 1"; - event.result = result; - if (result.bool) { - player.line2(result.targets, "green"); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - game.delay(); - "step 3"; - if (targets.length == 2) { - player - .choosePlayerCard( - "ej", - true, - function (button) { - var player = _status.event.player; - var targets0 = _status.event.targets0; - var targets1 = _status.event.targets1; - if (get.attitude(player, targets0) > 0 && get.attitude(player, targets1) < 0) { - if (get.position(button.link) == "j") return 12; - if (get.value(button.link, targets0) < 0) return 10; - return 0; - } else { - if (get.position(button.link) == "j") return -10; - return get.equipValue(button.link); - } - }, - targets[0] - ) - .set("nojudge", event.nojudge || false) - .set("targets0", targets[0]) - .set("targets1", targets[1]) - .set("filterButton", function (button) { - var targets1 = _status.event.targets1; - if (get.position(button.link) == "j") { - if (_status.event.nojudge) return false; - return targets1.canAddJudge(button.link); - } else { - return targets1.canEquip(button.link); - } - }); - } else { - event.finish(); - } - "step 4"; - if (result.bool && result.links.length) { - player.loseHp(); - } - "step 5"; - if (result.bool && result.links.length) { - var link = result.links[0]; - if (get.position(link) == "e") { - event.targets[1].equip(link); - } else if (link.viewAs) { - event.targets[1].addJudge({ name: link.viewAs }, [link]); - } else { - event.targets[1].addJudge(link); - } - event.targets[0].$give(link, event.targets[1]); - event.result.card = link; - event.result.position = get.position(link); - game.delay(); - player.addTempSkill("xinzhilve_mark"); - player.addMark("xinzhilve_mark", 1, false); - } - }, - }, - xinzhilve_use: { - audio: "zhilve", - filterCard: function () { - return false; - }, - selectCard: -1, - filterTarget: function (card, player, target) { - return player.canUse({ name: "sha", isCard: true }, target, false); - }, - content: function () { - player.loseHp(); - player.draw(); - player.useCard({ name: "sha", isCard: true }, false, target).forceDie = true; - player.addTempSkill("xinzhilve_mark"); - player.addMark("xinzhilve_mark", 1, false); - }, - ai: { - result: { - target: function (player, target) { - return get.effect(target, { name: "sha" }, player, target); - }, - }, - }, - }, - xinzhilve_mark: { - intro: { content: "本回合手牌上限+#" }, - onremove: true, - charlotte: true, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("xinzhilve_mark"); - }, - }, - }, - xinxhzhiyan: { - audio: "xhzhiyan", - enable: "phaseUse", - filter: function (event, player) { - return (!player.hasSkill("xinxhzhiyan_true") && player.countCards("h") > player.hp) || (!player.hasSkill("xinxhzhiyan_false") && player.countCards("h") < player.maxHp); - }, - filterCard: true, - selectCard: function () { - var player = _status.event.player; - if (player.hasSkill("xinxhzhiyan_true")) return 0; - var num = Math.max(0, player.countCards("h") - player.hp); - if (ui.selected.cards.length || player.hasSkill("xinxhzhiyan_false") || player.countCards("h") >= player.maxHp) return [num, num]; - return [0, num]; - }, - filterTarget: lib.filter.notMe, - selectTarget: function () { - if (ui.selected.cards.length) return [1, 1]; - return [0, 0]; - }, - check: function (card) { - var player = _status.event.player; - var checkx = function (card) { - if ( - player.getUseValue(card, null, true) <= 0 && - game.hasPlayer(function (current) { - return current != player && get.value(card, current) > 0 && get.attitude(player, current) > 0; - }) - ) - return 2; - return 1; - }; - if ( - player.countCards("h", function (card) { - return checkx(card) > 0; - }) < - player.countCards("h") - player.hp - ) - return 0; - return checkx(card); - }, - delay: false, - discard: false, - lose: false, - content: function () { - var bool = cards && cards.length > 0; - player.addTempSkill("xinxhzhiyan_" + bool, "phaseUseEnd"); - if (!bool) { - player.draw(player.maxHp - player.countCards("h")); - } else { - player.give(cards, target); - } - }, - ai: { - order: function (obj, player) { - if (player.countCards("h") > player.hp) return 10; - return 0.5; - }, - result: { - player: function (player, target) { - if (!ui.selected.cards.length && player.countCards("h") < player.maxHp) return 1; - return 0; - }, - target: 1, - }, - }, - }, - xinxhzhiyan_true: {}, - xinxhzhiyan_false: { - mod: { - playerEnabled: function (card, player, target) { - if (player != target && (!get.info(card) || !get.info(card).singleCard || !ui.selected.targets.length)) return false; - }, - }, - mark: true, - intro: { - content: "不能对其他角色使用牌", - }, - }, - weifeng: { - audio: 2, - trigger: { player: "useCardAfter" }, - forced: true, - filter: function (event, player) { - if ( - !event.targets || - !event.targets.filter(function (target) { - return target != player && !target.storage.weifeng2; - }).length - ) - return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - if (!get.tag(event.card, "damage")) return false; - if (!["basic", "trick"].includes(get.type(event.card))) return false; - return ( - player - .getHistory("useCard", function (ev) { - return ev.getParent("phaseUse") == evt && get.tag(ev.card, "damage") && ["basic", "trick"].includes(get.type(ev.card)); - }) - .indexOf(event) == 0 && - game.hasPlayer(function (current) { - return current != player && !current.storage.weifeng2 && event.targets.includes(current); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(true, "威风:请选择一个目标,令其获得一个【惧(" + get.translation(trigger.card.name) + ")】标记", function (card, player, target) { - return player != target && !target.storage.weifeng2 && _status.event.getTrigger().targets.includes(target); - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - target.storage.weifeng2 = trigger.card.name; - player.line(target, "green"); - game.log(target, "获得了一个", "#g【惧(" + get.translation(trigger.card.name) + ")】", "标记"); - target.markSkill("weifeng2"); - player.addSkill("weifeng3"); - } - }, - }, - weifeng2: { - intro: { - content: "当前“惧”标记名称:$", - onunmark: function (storage, player) { - if (player.storage.weifeng2) { - game.log(player, "移去了一个", "#g【惧(" + get.translation(player.storage.weifeng2) + ")】", "标记"); - delete player.storage.weifeng2; - } - }, - }, - marktext: "惧", - }, - weifeng3: { - trigger: { - global: "damageBegin3", - player: ["phaseZhunbeiBegin", "dieBegin"], - }, - forced: true, - popup: false, - filter: function (event, player) { - if (event.name != "damage") return true; - return event.player != player && typeof event.player.storage.weifeng2 == "string"; - }, - content: function () { - if (trigger.name == "damage") { - player.logSkill("weifeng", trigger.player); - if (trigger.card && trigger.card.name == trigger.player.storage.weifeng2) trigger.num++; - else if (trigger.player.countGainableCards(player, "he") > 0) player.gainPlayerCard(trigger.player, "he", true); - trigger.player.unmarkSkill("weifeng2"); - } else { - game.countPlayer(function (current) { - if (current.storage.weifeng2) current.unmarkSkill("weifeng2"); - }); - player.removeSkill("weifeng3"); - } - }, - }, - gnjinfan: { - trigger: { player: "phaseDiscardBegin" }, - direct: true, - locked: false, - audio: 2, - filter: function (event, player) { - var list = []; - player.getCards("s", function (card) { - if (card.hasGaintag("gnjinfan")) list.add(get.suit(card)); - }); - if (list.length >= lib.suit.length) return false; - return ( - player.countCards("h", function (card) { - return _status.connectMode || !list.includes(get.suit(card)); - }) > 0 - ); - }, - content: function () { - "step 0"; - player - .chooseCard( - "h", - get.prompt("gnjinfan"), - "将任意张手牌当做“铃”置于武将牌上", - [ - 1, - (function () { - var list = []; - var list2 = []; - player.getCards("s", function (card) { - if (card.hasGaintag("gnjinfan")) list.add(get.suit(card)); - }); - player.getCards("h", function (card) { - list2.add(get.suit(card)); - }); - list2.removeArray(list); - return Math.max(1, list2.length); - })(), - ], - function (card, player) { - return ( - !player.countCards("s", function (cardx) { - return cardx.hasGaintag("gnjinfan") && get.suit(cardx, false) == get.suit(card, player); - }) && - !ui.selected.cards.filter(function (cardx) { - return get.suit(cardx, player) == get.suit(card, player); - }).length - ); - } - ) - .set("ai", function (card) { - var player = _status.event.player; - if (player.hasUseTarget(card) && !player.hasValueTarget(card)) return 0; - if (["sha", "shan", "wuxie", "caochuan"].includes(card.name)) return 2 + Math.random(); - return 1 + Math.random(); - }) - .set("complexCard", true); - "step 1"; - if (result.bool) { - player.logSkill("gnjinfan"); - game.log(player, "将", result.cards, "放到了武将牌上"); - player.loseToSpecial(result.cards, "gnjinfan").visible = true; - } else event.finish(); - "step 2"; - player.markSkill("gnjinfan"); - }, - group: ["gnjinfan_gain"], - marktext: "铃", - intro: { - mark: function (dialog, storage, player) { - dialog.addAuto( - player.getCards("s", function (card) { - return card.hasGaintag("gnjinfan"); - }) - ); - }, - markcount: function (storage, player) { - return player.getCards("s", function (card) { - return card.hasGaintag("gnjinfan"); - }).length; - }, - onunmark: function (storage, player) { - var cards = player.getCards("s", function (card) { - return card.hasGaintag("gnjinfan"); - }); - if (cards.length) { - player.lose(cards, ui.discardPile); - player.$throw(cards, 1000); - game.log(cards, "进入了弃牌堆"); - } - }, - }, - mod: { - aiOrder: function (player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("gnjinfan")) return num + 0.5; - }, - }, - }, - gnjinfan_gain: { - audio: "gnjinfan", - trigger: { player: "loseAfter" }, - forced: true, - filter: function (event, player) { - if (!event.ss || !event.ss.length) return false; - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("gnjinfan")) return true; - return false; - } - }, - content: function () { - "step 0"; - var cards = []; - for (var i of trigger.ss) { - if (!trigger.gaintag_map[i.cardid] || !trigger.gaintag_map[i.cardid].includes("gnjinfan")) continue; - var suit = get.suit(i, false); - var card = get.cardPile2(function (card) { - return !cards.includes(card) && get.suit(card, false) == suit; - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - var num = player.getCards("s", function (card) { - return card.hasGaintag("gnjinfan"); - }).length; - if (num) player.markSkill("gnjinfan"); - else player.unmarkSkill("gnjinfan"); - "step 1"; - game.updateRoundNumber(); - }, - }, - gnsheque: { - audio: 2, - trigger: { global: "phaseZhunbeiBegin" }, - direct: true, - filter: function (event, player) { - return event.player.isIn() && event.player.countCards("e") > 0 && lib.filter.targetEnabled({ name: "sha" }, player, event.player) && (player.hasSha() || (_status.connectMode && player.countCards("h") > 0)); - }, - content: function () { - player - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "射却:是否对" + get.translation(trigger.player) + "使用一张杀?") - .set("logSkill", "gnsheque") - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", trigger.player) - .set("oncard", function (card) { - try { - card.gnsheque_tag = true; - } catch (e) { - alert("发生了一个导致【射却】无法正常触发无视防具效果的错误。请关闭十周年UI/手杀ui等扩展以解决"); - } - }); - }, - ai: { - unequip: true, - unequip_ai: true, - skillTagFilter: function (player, tag, arg) { - if (tag == "unequip_ai") { - if (_status.event.getParent().name != "gnsheque") return false; - } else if (!arg || !arg.card || !arg.card.gnsheque_tag) return false; - }, - }, - }, - _doublegroup_choice: { - trigger: { - global: "gameStart", - player: "enterGame", - }, - forced: true, - charlotte: true, - firstDo: true, - popup: false, - filter: function (event, player) { - return get.mode() != "guozhan" && get.is.double(player.name1) && !player._groupChosen; - }, - content: function () { - "step 0"; - player._groupChosen = true; - player.chooseControl(get.is.double(player.name1, true)).set("prompt", "请选择你的势力"); - "step 1"; - player.changeGroup(result.control); - }, - }, - }, - dynamicTranslate: { - yizan_use: function (player) { - if (player.storage.yizan) return "你可以将一张基本牌当做任意基本牌使用或打出。"; - return "你可以将两张牌(其中至少一张为基本牌)当做任意基本牌使用或打出。"; - }, - miaojian: function (player) { - return ["出牌阶段限一次。你可将一张【杀】当做刺【杀】使用,或将一张锦囊牌当做【无中生有】使用。", "出牌阶段限一次。你可将一张基本牌当做刺【杀】使用,或将一张非基本牌当做【无中生有】使用。", "出牌阶段限一次。你可视为使用一张刺【杀】或【无中生有】。"][player.countMark("miaojian")]; - }, - shhlianhua: function (player) { - return ["当你成为【杀】的目标后,你摸一张牌。", "当你成为【杀】的目标后,你摸一张牌。然后你进行判定,若结果为黑桃,则此【杀】对你无效。", "当你成为【杀】的目标后,你摸一张牌。然后此【杀】的使用者选择一项:①弃置一张牌。②令此【杀】对你无效。"][player.countMark("shhlianhua")]; - }, - spshidi: function (player) { - if (player.countMark("spshidi") % 2 == 0) return '转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。'; - return '转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。'; - }, - mobilexingxue: function (player) { - return lib.translate[(player.storage.mobileyanzhu ? "mobilexingxuex" : "mobilexingxue") + "_info"]; - }, - shoufa: function (player) { - const zhoufa = player.storage.zhoulin_zhoufa; - const nodoudizhu = get.mode() == "doudizhu" ? "与你距离大于/不大于1的" : "与你距离大于/不大于2的"; - if (!zhoufa) return "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名" + nodoudizhu + "角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。"; - let str = "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名" + nodoudizhu + "角色,"; - str += ["令其受到1点无来源伤害", "你随机获得其一张牌", "你随机弃置其装备区的一张牌", "令其摸一张牌"][["豹", "鹰", "熊", "兔"].indexOf(zhoufa)]; - return str + "。"; - }, - mbxuetu(player) { - const xuetu = player.storage.mbxuetu, - status = player.countMark("mbxuetu_status"); - if (status === 0) { - if (!xuetu) return '转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。'; - return '转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。'; - } else if (status === 1) { - return lib.translate.mbxuetu_achieve_info; - } else { - if (!xuetu) return '转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。'; - return '转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。'; - } - }, - mbzuoyou(player) { - const mbzuoyou = player.storage.mbzuoyou; - if (mbzuoyou) return '转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。'; - return '转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。'; - }, - }, - perfectPair: { - simazhao: ["simayi", "jin_simayi", "jin_wangyuanji"], - xugong: ["yanbaihu"], - }, - characterReplace: { - caochun: ["caochun", "old_caochun"], - majun: ["majun", "old_majun"], - zhanggong: ["zhanggong", "re_zhanggong"], - baosanniang: ["xin_baosanniang", "re_baosanniang", "baosanniang"], - heqi: ["re_heqi", "heqi"], - weiwenzhugezhi: ["weiwenzhugezhi", "re_weiwenzhugezhi", "jsrg_weiwenzhugezhi"], - xugong: ["xugong", "re_xugong", "jsrg_xugong"], - liuzan: ["re_liuzan", "liuzan"], - sufei: ["yj_sufei", "sp_sufei", "xf_sufei"], - jiakui: ["jiakui", "old_jiakui"], - shenpei: ["shenpei", "sp_shenpei"], - sunru: ["dc_sunru", "sunru"], - liuye: ["dc_liuye", "liuye"], - zhaotongzhaoguang: ["dc_zhaotongzhaoguang", "zhaotongzhaoguang"], - yangbiao: ["yangbiao", "dc_yangbiao", "jsrg_yangbiao"], - qiaozhou: ["yj_qiaozhou", "qiaozhou"], - sunhanhua: ["dc_sunhanhua", "sunhanhua"], - zhoubuyi: ["zhoubuyi", "yj_zhoubuyi"], - }, - translate: { - liuzan: "手杀留赞", - liuzan_prefix: "手杀", - re_sp_zhugeliang: "手杀界卧龙", - re_sp_zhugeliang_prefix: "手杀界", - ly_piliche: "霹雳车", - ly_piliche_info: "当你对其他角色造成伤害后,你可以弃置其装备区内的所有牌。", - polu: "破橹", - polu_info: "锁定技,回合开始时,若【霹雳车】未加入游戏或在牌堆/弃牌堆内,则你使用之;当你受到1点伤害后,若你的装备区里没有【霹雳车】,则你摸一张牌并使用牌堆中的一张随机武器牌。", - choulve: "筹略", - choulve_info: "出牌阶段开始时,你可以令一名其他角色交给你一张牌,若其如此做,视为你使用上一张对你过造成伤害且不为延时锦囊牌的牌。", - tunchu: "屯储", - tunchu_info: "摸牌阶段,若你没有「粮」,你可以多摸两张牌。若如此做,摸牌阶段结束时,你可以将任意张手牌置于你的武将上,称为「粮」,只要你的武将牌上有「粮」,你便不能使用【杀】。", - shuliang: "输粮", - shuliang_info: "一名角色的结束阶段开始时,若其手牌数少于体力值,你可以移去一张「粮」,然后该角色摸两张牌。", - fenyin: "奋音", - yingjian: "影箭", - fenyin_info: "你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。", - yingjian_info: "准备阶段开始时,你可以视为使用一张无距离限制的【杀】。", - dujin: "独进", - dujin_info: "摸牌阶段,你可以多摸X+1张牌(X为你装备区里牌数的一半且向上取整)。", - shixin: "释衅", - shixin_info: "锁定技,当你受到火属性伤害时,你防止此伤害。", - zhaohuo: "招祸", - zhaohuo_info: "锁定技,当其他角色进入濒死状态时,你将体力上限调整为1点。若你的体力上限因此减少,则你摸X张牌。(X为你以此法减少的体力上限)", - yixiang: "义襄", - yixiang_info: "每名角色的回合限一次,当你成为一名角色使用牌的目标后,若该角色的体力值大于你的体力值,你可以随机获得牌堆里的一张你没有的基本牌。", - yirang: "揖让", - yirang_info: "出牌阶段开始时,你可以将所有非基本牌交给一名体力上限大于你的其他角色,然后调整体力上限至与该角色相同并回复X点体力(X为你以此法交给其的牌的类别数)。", - kuangcai: "狂才", - kuangcai_info: "出牌阶段开始时,你可以令你此阶段内的主动出牌时间变为5秒。若如此做,你于此阶段内使用牌没距离和次数限制,且每当你于此阶段内使用牌时,你摸一张牌且主动出牌时间-1秒。若主动出牌时间减至0,则你结束出牌阶段。", - shejian: "舌剑", - shejian_info: "弃牌阶段结束时,若你于此阶段弃置的所有牌花色均不相同,则你可以弃置一名其他角色的一张牌。", - xinfu_daigong: "怠攻", - xinfu_daigong_info: "每回合限一次。当你受到伤害时,你可以展示所有手牌,然后令伤害来源选择一项:交给你一张与你所有手牌花色均不相同的一张牌,或防止此伤害。", - xinfu_zhaoxin: "昭心", - xinfu_zhaoxin_info: "出牌阶段限一次,你可以将任意张手牌置于武将牌上并摸等量的牌,称之为「望」(你至多拥有三张「望」)。你或你攻击范围内的一名其他角色的摸牌阶段结束后,其可以获得一张由你选择的「望」,然后你可以对其造成1点伤害。", - zhaoxin_give: "昭心", - zhaoxin_give_info: "", - xinfu_qianchong: "谦冲", - xinfu_qianchong_info: "锁定技,若你的装备区内有牌且:均为红色,则你视为拥有技能〖明哲〗。均为黑色,则你视为拥有技能〖帷幕〗。若均不满足,则出牌阶段开始时,你可以选择一种类别的牌,然后你本回合内使用该类别的牌时没有次数和距离限制。", - qc_weimu: "帷幕", - qc_weimu_info: "", - qc_mingzhe: "明哲", - qc_mingzhe_info: "", - xinfu_shangjian: "尚俭", - xinfu_shangjian_info: "锁定技。一名角色的结束阶段开始时,若你于此回合内不因使用装备牌而失去了X张或更少的牌,则你摸等量的牌(X为你的体力值)。", - rw_bagua_skill: "先天八卦阵", - rw_bagua_skill_info: "当你需要使用或打出一张【闪】时,你可以进行判定,若判定结果不为黑桃,视为你使用或打出了一张【闪】。", - rw_baiyin_skill: "照月狮子盔", - rw_baiyin_skill_info: "锁定技,当你受到大于1的伤害时,你将伤害值改为1;当你失去装备区里的【照月狮子盔】时,你回复1点体力并摸两张牌。", - rw_lanyinjia: "精银甲", - rw_lanyinjia_info: "你可以将一张手牌当做【闪】使用或打出。锁定技,【精银甲】不会无效。", - rw_minguangkai_cancel: "耀光铠", - rw_minguangkai_cancel_info: "锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", - rw_minguangkai_link: "耀光铠", - rw_minguangkai_link_info: "锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", - rw_renwang_skill: "仁王金刚盾", - rw_renwang_skill_info: "黑色【杀】和红桃【杀】对你无效。", - rw_tengjia1: "桐油百韧甲", - rw_tengjia1_info: "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", - rw_tengjia2: "桐油百韧甲", - rw_tengjia2_info: "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", - rw_tengjia3: "桐油百韧甲", - rw_tengjia3_info: "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", - rw_tengjia4: "桐油百韧甲", - rewrite_bagua: "先天八卦阵", - rewrite_bagua_info: "当你需要使用或打出一张【闪】时,你可以进行判定,若判定结果不为黑桃,视为你使用或打出了一张【闪】。", - rewrite_baiyin: "照月狮子盔", - rewrite_baiyin_info: "锁定技,当你受到大于1的伤害时,你将伤害值改为1;当你失去装备区里的【照月狮子盔】时,你回复1点体力并摸两张牌。", - rewrite_lanyinjia: "精银甲", - rewrite_lanyinjia_info: "你可以将一张手牌当做【闪】使用或打出。锁定技,【精银甲】不会无效。", - rewrite_minguangkai: "耀光铠", - rewrite_minguangkai_info: "锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", - rewrite_renwang: "仁王金刚盾", - rewrite_renwang_info: "黑色【杀】和红桃【杀】对你无效。", - rewrite_tengjia: "桐油百韧甲", - rewrite_tengjia_info: "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", - rewrite_zhuge: "元戎精械弩", - rewrite_zhuge_info: "锁定技,你于出牌阶段内使用【杀】无次数限制。", - rw_zhuge_skill: "诸葛连弩", - rw_zhuge_skill_info: "锁定技,你于出牌阶段内使用【杀】无次数限制。", - takaramono: "宝物", - wolong_card: "卧龙", - wolong_card_info: "对一名角色造成1点火焰伤害。若场上有存活的诸葛亮(火),则改为对至多两名角色各造成1点火焰伤害。", - fengchu_card: "凤雏", - fengchu_card_info: "横置至多三名角色。若场上有存活的庞统(火),则改为横置至多四名角色。", - xuanjian_card: "玄剑", - xuanjian_card_info: "令一名角色摸一张牌并回复1点体力。若场上有存活的徐庶(将/界),则改为令一名角色摸一张牌并回复1点体力,然后你摸一张牌。", - shuijing_card: "水镜", - shuijing_card_info: "将一名角色装备区内的防具牌移动到另一名角色对应区域。若场上有存活的司马徽,则改为将1名角色装备区内的1件装备移动到另1角色对应区域。", - xinfu_pingcai: "评才", - xinfu_pingcai_info: "出牌阶段限一次,你可以挑选一个宝物并擦拭掉其上面的灰尘。然后,你可以根据宝物类型执行对应的效果。", - xinfu_pdgyingshi: "隐世", - xinfu_pdgyingshi2: "隐世", - xinfu_pdgyingshi_info: "锁定技,你始终跳过准备阶段,判定阶段,结束阶段。你不能被选择为延时锦囊牌的目标。", - pcaudio_wolong_card: "卧龙", - pcaudio_wolong_card_info: "", - pcaudio_fengchu_card: "凤雏", - pcaudio_fengchu_card_info: "", - pcaudio_shuijing_card: "水镜", - pcaudio_shuijing_card_info: "", - pcaudio_xuanjian_card: "玄剑", - pcaudio_xuanjian_card_info: "", - yizan_respond_sha: "翊赞", - yizan_respond_sha_info: "", - yizan_use: "翊赞", - yizan_use_backup: "翊赞", - yizan_use_info: "你可以将两张牌(其中至少一张为基本牌)当做任意基本牌使用或打出。", - yizan_respond_shan: "翊赞", - yizan_respond_shan_info: "", - xinfu_longyuan: "龙渊", - xinfu_longyuan_info: "觉醒技,准备阶段,若你本局游戏内发动过〖翊赞〗的次数大于等于3,则你修改〖翊赞〗。", - yizan_rewrite: "翊赞·改", - yizan_rewrite_info: "你可以将一张基本牌当做任意基本牌使用或打出。", - yizan_count: "翊赞", - yizan_count_info: "", - xinfu_jingxie1: "精械", - xinfu_jingxie1_info: "出牌阶段,你可以展示一张未强化过的【诸葛连弩】或标准包/军争包/SP包中的防具牌,然后对其进行强化。当你处于濒死状态时,你可以重铸一张防具牌,然后将体力回复至1点。", - xinfu_jingxie2: "精械", - xinfu_jingxie2_info: "", - xinfu_qiaosi: "巧思", - xinfu_qiaosi_info: "出牌阶段限一次,你可以投掷一枚六面骰子,亮出牌堆顶的X张牌并获得之。然后,你选择一项:1.交给一名其他角色X张牌。2.弃置X张牌。(X为骰子的点数)", - xin_xiahoudun: "手杀界夏侯惇", - xin_xiahoudun_prefix: "手杀界", - xinqingjian: "清俭", - xinqingjian2: "清俭", - xinqingjian_info: "每回合限一次。当你不因摸牌阶段的额定摸牌而得到牌后,你可以将任意张牌扣置于武将牌上。回合结束时,你将这些牌交给一名其他角色。若这些牌的数量大于1,你摸一张牌。", - zhangyì: "张翼", - jiakui: "贾逵", - zhiyi: "执义", - zhiyi_info: "锁定技,当你于一回合内使用或打出第一张基本牌时,你选择一项:1.摸一张牌。2.于此牌A(若此牌是因响应牌B而使用或打出的,则改为牌B)的使用或打出流程结算完成后,视为使用一张与此牌名称和属性相同的卡牌。", - rezhiyi: "执义", - rezhiyi_info: "锁定技,一名角色的结束阶段开始时,若你本回合内使用或打出过基本牌,则你选择一项:1.摸一张牌。2.视为使用一张你本回合内使用或打出过的基本牌。", - zhongzuo: "忠佐", - zhongzuo_info: "一名角色的结束阶段开始时,若你于此回合内造成或受到过伤害,则你可以令一名角色摸两张牌。若该角色已受伤,则你摸一张牌。", - wanlan: "挽澜", - wanlan_info: "限定技,当一名角色进入濒死状态时,你可以弃置所有手牌(无牌可不弃)。其回复体力至1点,然后你对当前回合角色造成1点伤害。", - re_jikang: "手杀嵇康", - re_jikang_prefix: "手杀", - shenpei: "审配", - re_wangyun: "手杀王允", - re_wangyun_prefix: "手杀", - relianji: "连计", - relianji_info: "出牌阶段限一次,你可以选择两名其他角色。第一名角色随机使用牌堆中的一张武器牌,然后这名角色视为对另一名角色随机使用一张下列的牌名的牌:【决斗】、【火攻】、【南蛮入侵】、【万箭齐发】或普【杀】。然后若此牌造成伤害,你获得X枚“连计”标记(X为此次扣减的体力值点数)。", - remoucheng: "谋逞", - remoucheng_info: "觉醒技,当一名角色因〖连计〗造成伤害后,若你拥有的“连计”标记数大于2,你加1点体力上限,回复1点体力,失去“连计”,获得“矜功”。", - - shouye: "守邺", - shouye_info: "每回合限一次。当其他角色使用牌指定你为唯一目标时,你可以与其进行【对策】。若你赢,则你取消此牌的目标,且你于此牌结算完成后获得其对应的所有实体牌。", - liezhi: "烈直", - liezhi_info: "准备阶段,你可以依次弃置至多两名其他角色区域内的各一张牌。若你受到过伤害,则〖烈直〗于你的下个回合无效。", - - xinzhanyi: "战意", - xinzhanyi_info: "出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作杀、酒或桃使用,且你本回合第一次以此法使用的牌的回复值/伤害值+1;锦囊牌,摸三张牌且你使用的牌不能被【无懈可击】响应;装备牌,你使用【杀】指定唯一目标后,其弃置两张牌,然后你获得其中的一张。", - xinzhanyi_basic_backup: "战意", - xinzhanyi_basic: "战意", - xinzhanyi_equip: "战意", - - meiyong: "姝勇", - meiyong_info: "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后其摸一张牌。", - rexushen: "许身", - rexushen_info: "限定技,出牌阶段,你可以失去X点体力(X为场上男性角色的数量)。若你以此法进入了濒死状态,则当你因一名角色而脱离此濒死状态后,你可以令其获得技能〖武圣〗和〖当先〗。", - rezhennan: "镇南", - rezhennan_info: "当你成为其他角色使用的牌的目标后,若此牌的目标数大于该角色的体力值,则你可以弃置一张牌并对其造成1点伤害。", - - hujinding: "手杀胡金定", - hujinding_prefix: "手杀", - huaizi: "怀子", - huaizi_info: "锁定技,你的手牌上限为你的体力上限。", - renshi: "仁释", - renshi_info: "锁定技,当你受到【杀】的伤害时,若你已受伤,则你防止此伤害并获得此【杀】对应的所有实体牌,然后减1点体力上限。", - wuyuan: "武缘", - wuyuan_info: "出牌阶段限一次,你可将一张【杀】交给一名其他角色,然后你回复1点体力,其摸一张牌。若此【杀】为:红色【杀】,其回复1点体力;属性【杀】,其改为摸两张牌。", - - re_weiwenzhugezhi: "手杀卫温诸葛直", - re_weiwenzhugezhi_prefix: "手杀", - gz_re_xugong: "许贡", - re_xugong: "手杀许贡", - re_xugong_prefix: "手杀", - re_zhanggong: "手杀张恭", - re_zhanggong_prefix: "手杀", - reqianxin: "遣信", - reqianxin_info: "出牌阶段限一次,你可将至多两张手牌随机交给等量的其他角色,称为「信」。这些角色的准备阶段开始时,若其手牌中有「信」,则其选择一项:令你摸两张牌,本回合手牌上限-2。", - rebiaozhao: "表召", - rebiaozhao_info: "结束阶段,你可以将一张牌置于武将牌上,称为「表」。当有一张与「表」点数相同的牌进入弃牌堆后,你将「表」置入弃牌堆并失去1点体力。准备阶段,若你的武将牌上有「表」,则你移去「表」并选择一名角色,该角色回复1点体力并摸三张牌。", - rebiaozhao2: "表召", - rebiaozhao2_info: "", - rebiaozhao3: "表召", - rebiaozhao3_info: "", - refuhai: "浮海", - refuhai_info: "出牌阶段限一次,你可令其他角色同时在「潮起」和「潮落」中选择一项,并依次展示这些角色的选项。若从你下家开始选择了相同选项的角色数目大于1,则你摸X张牌(X为连续相同结果的数量)。", - qiaosi: "巧思", - qiaosi_info: "出牌阶段限一次,你可以表演「大键角色图」并根据表演结果获得相应的牌。然后,你选择一项:1.弃置X张牌。2.将X张牌交给一名其他角色。(X为你以此法得到的牌数)", - qiaosi_map: "大键角色图", - qiaosi_map_info: "
  • 星野 梦美:锦囊牌*2
  • 能美 库特莉亚芙卡:装备牌/【杀】/【酒】*1
  • 友利 奈绪:【杀】/【酒】*1
  • 神尾 观铃:【闪】/【桃】*1
  • 伊吹 风子:锦囊牌/【闪】/【桃】*1
  • 仲村 由理:装备牌*2
  • Illustration:うら;Twitter:@ura530", - qiaosi_c1: ' ', - //星野 梦美 - qiaosi_c2: ' ', - //能美 库特莉亚芙卡 - qiaosi_c3: ' ', - //友利 奈绪 - qiaosi_c4: ' ', - //神尾 观铃 - qiaosi_c5: ' ', - //伊吹 风子 - qiaosi_c6: ' ', - //仲村 由理 - - yangbiao: "手杀杨彪", - yangbiao_prefix: "手杀", - zhaohan: "昭汉", - zhaohan_info: "锁定技,你的第1-4个准备阶段开始时,你加1点体力上限并回复1点体力,你的第5-7个准备阶段开始时,你减1点体力上限。", - rangjie: "让节", - rangjie_info: "当你受到1点伤害后,你可以选择一项并摸一张牌:获得牌堆里你选择的类型的一张牌,或移动场上的一张牌。", - yizheng: "义争", - yizheng2: "义争", - yizheng_info: "出牌阶段限一次,你可以和一名体力值不大于你的其他角色拼点。若你赢,其跳过下个摸牌阶段。若你没赢,你减1点体力上限。", - re_heqi: "手杀贺齐", - re_heqi_prefix: "手杀", - reqizhou: "绮胄", - reqizhou_info: "锁定技,你根据装备区里牌的花色数获得以下技能:1种或以上:〖英姿〗;2种或以上:〖奇袭〗;3种或以上:〖旋风〗。", - reshanxi: "闪袭", - reshanxi2: "闪袭", - reshanxi_info: "出牌阶段开始时,你可以弃置一张红色基本牌并选择一名有牌的其他角色,将其的至多X张牌置于其的武将牌上(X为你的体力值)。回合结束时,该角色获得这些牌。", - chendeng: "手杀陈登", - chendeng_prefix: "手杀", - zhouxuan: "周旋", - zhouxuan2: "周旋", - zhouxuan_info: "出牌阶段限一次,你可以弃置一张牌并指定一名角色,然后选择一个基本牌的名称或非基本牌的类型。其使用或打出下一张牌时,若此牌的名称或类型和你选择的相同,则你观看牌堆顶的三张牌,然后将这些牌以任意分割方式交给任意名角色。", - fengji: "丰积", - fengji_info: "锁定技,回合结束时,你记录你的手牌数。准备阶段开始时,若你的手牌数不小于你记录的手牌数,则你摸两张牌且本回合手牌上限为体力上限。", - re_guanqiujian: "手杀毌丘俭", - re_guanqiujian_prefix: "手杀", - rezhengrong: "征荣", - rehongju: "鸿举", - reqingce: "清侧", - reqingce_backup: "清侧", - rezhengrong_info: "当你于出牌阶段使用的指定了其他角色为目标的牌结算完成后,若此牌是你本局游戏内于出牌阶段使用的指定了其他角色为目标的第偶数张牌,则你可以将一名其他角色角色的随机一张牌置于你的武将牌上,称为「荣」。", - rehongju_info: "觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3且有角色死亡,则你摸等同于「荣」数量的牌。然后可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。", - reqingce_info: "出牌阶段,你可以将一张「荣」置入弃牌堆,然后弃置场上的一张牌。", - re_pangtong: "手杀界庞统", - re_pangtong_prefix: "手杀界", - dongcheng: "手杀董承", - dongcheng_prefix: "手杀", - chengzhao: "承诏", - chengzhao_info: "一名角色的结束阶段,若你于本回合内获得了两张以上的牌,则你可以与一名其他角色拼点。若你赢,你视为对其使用一张无视防具的【杀】。", - yangyi: "手杀杨仪", - yangyi_prefix: "手杀", - duoduan: "度断", - duoduan_info: "每回合限一次,当你成为【杀】的目标后,你可以重铸一张牌。若如此做,你选择一项:①令使用者摸两张牌,且此【杀】无效。②令使用弃置一张牌,且你不能响应此【杀】。", - gongsun: "共损", - gongsun_info: "出牌阶段开始时,你可以弃置两张牌并指定一名其他角色。你选择一个基本牌或普通锦囊牌的牌名。直到你的下回合开始或你死亡,你与其不能使用或打出或弃置此名称的牌。", - gongsun_shadow: "共损", - xin_chengpu: "手杀界程普", - xin_chengpu_prefix: "手杀界", - relihuo: "疠火", - relihuo_damage: "疠火", - relihuo_baigei: "疠火", - relihuo_info: "当你使用普【杀】时,你可以将此杀改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)。", - dengzhi: "手杀邓芝", - dengzhi_prefix: "手杀", - jimeng: "急盟", - jimeng_info: "出牌阶段开始时,你可以获得一名其他角色的一张牌,然后交给该角色X张牌(X为你当前体力值)。", - shuaiyan: "率言", - shuaiyan_info: "弃牌阶段开始时,若你的手牌数大于1,则你可以展示所有手牌,然后你令一名其他角色交给你一张牌。", - zhengxuan: "郑玄", - zhengjing: "整经", - zhengjing_info: "出牌阶段,你可以整理卡牌。然后,你将整理出的卡牌中的至少一张作为“经”置于一名角色的武将牌上,然后获得其余的牌。该角色的准备阶段获得这些牌,且跳过此回合的判定和摸牌阶段。", - zhengjing2: "整经", - - mobile_yijiang: "将星独具", - yj_zhanghe: "☆张郃", - yj_zhanghe_prefix: "☆", - yj_zhangliao: "☆张辽", - yj_zhangliao_prefix: "☆", - yj_xuhuang: "☆徐晃", - yj_xuhuang_prefix: "☆", - yj_ganning: "☆甘宁", - yj_ganning_prefix: "☆", - xhzhiyan: "治严", - xhzhiyan_info: "出牌阶段,若你的手牌数不等于体力上限,则你可以将手牌摸至/弃至手牌上限,然后本回合不能对其他角色使用牌/可以将弃置的一张牌交给一名其他角色。", - zhilve: "知略", - zhilve_info: "锁定技,准备阶段,你选择一项:1.移动场上装备区的一张牌并失去1点体力。2.移动场上判定区的一张牌并令本回合手牌上限-1。3.本回合摸牌阶段多摸一张牌且使用的第一张【杀】无距离限制且不计入次数限制。", - xinzhilve: "知略", - xinzhilve_backup: "知略", - xinzhilve_mark: "知略", - xinzhilve_info: "出牌阶段限一次,你可以失去1点体力并选择一项:1.移动场上的一张牌;2.视为使用一张无距离限制且不计入次数限制的【杀】并摸一张牌。然后你本回合的手牌上限+1。", - xinxhzhiyan: "治严", - xinxhzhiyan_false: "治严", - xinxhzhiyan_info: "出牌阶段每项各限一次,若你的手牌数:大于体力值,则你可以将X张手牌交给一名其他角色(X为你的手牌数与体力值之差);小于体力上限,则你可以摸X张牌且本阶段内不能再对其他角色使用牌。(X为你的手牌数与体力上限之差)", - weifeng: "威风", - weifeng2: "威风", - weifeng3: "威风", - weifeng_info: "锁定技,当你于出牌阶段内使用第一张伤害性基本牌或普通锦囊牌后,你令此牌的一名没有“惧”的其他目标角色获得一枚名称为此牌牌名的“惧”。有“惧”的角色受到伤害时,其移去“惧”,然后若造成伤害的牌名称和“惧”:相同,此伤害+1;不同,你获得该角色的一张牌。准备阶段开始时或你死亡时,你移去场上的所有“惧”。", - gnjinfan: "锦帆", - gnjinfan_gain: "锦帆", - gnjinfan_info: "弃牌阶段开始时,你可将任意张手牌置于武将牌上,称为“铃”(每种花色的“铃”限一张)。你可以如手牌般使用或打出“铃”。当有“铃”移动到处理区后,你从牌堆中获得与“铃”花色相同的一张牌。", - gnsheque: "射却", - gnsheque_info: "一名其他角色的准备阶段开始时,若其装备区内有牌,则你可以对其使用一张【杀】(无距离关系的限制且无视防具)。", - sp_sufei: "手杀苏飞", - sp_sufei_prefix: "手杀", - zhengjian: "诤荐", - zhengjian_draw: "诤荐", - zhengjian_mark: "诤荐", - zhengjian_info: "锁定技,结束阶段,你令一名角色获得一枚“诤”。回合开始时,你令有“诤”的角色移去“诤”并摸X张牌(X为其最后一次获得“诤”后使用和打出的牌数,且至多不能超过其体力上限或5)。", - gaoyuan: "告援", - gaoyuan_info: "当你成为【杀】的目标时,你可弃置一张牌将此【杀】转移给一名有“诤”且不是此【杀】使用者的其他角色。", - tongqu: "通渠", - tongqu_info: "游戏开始时,你拥有一个“渠”标记。准备阶段,你可以失去1点体力令一名没有“渠”标记的角色获得“渠”标记。有“渠”的角色摸牌阶段额外摸一张牌,然后将一张牌交给其他有“渠”的角色或弃置。若以此法给出的是装备牌则使用之。当有“渠”的角色进入濒死状态时,移除其“渠”标记。", - xinwanlan: "挽澜", - xinwanlan_info: "当一名角色受到伤害值不小于体力值的伤害时,你可以弃置装备区中的所有牌(至少一张) 防止此伤害。", - re_xusheng: "手杀界徐盛", - re_xusheng_prefix: "手杀界", - re_dongzhuo: "手杀界董卓", - re_dongzhuo_prefix: "手杀界", - rejiuchi: "酒池", - rejiuchi_info: "你可以将一张黑桃手牌当做【酒】使用。当你于回合内使用带有【酒】效果的【杀】造成伤害时,你令你的〖崩坏〗失效直到回合结束。", - furong: "手杀傅肜", - furong_prefix: "手杀", - xuewei: "血卫", - xuewei_info: "准备阶段,你可以选择一名其他角色(仅自己可见)。若如此做,直到你的下回合开始前,当其第一次受到伤害时,你防止此伤害,改为由你受到等量的伤害并对伤害来源造成等量同属性的伤害。", - liechi: "烈斥", - liechi_info: "锁定技,当你进入濒死状态时,伤害来源弃置一张牌。", - xin_liaohua: "手杀界廖化", - xin_liaohua_prefix: "手杀界", - redangxian: "当先", - redangxian_info: "锁定技,回合开始时,你从弃牌堆中获得一张【杀】并进行一个额外的出牌阶段。", - refuli: "伏枥", - refuli_info: "限定技,当你处于濒死状态时,你可以将体力值回复至X点(X为势力数)。然后若你的体力值为全场唯一最多,你翻面。", - xin_caozhang: "手杀界曹彰", - xin_caozhang_prefix: "手杀界", - rejiangchi: "将驰", - rejiangchi_info: "出牌阶段开始时,你可以选择一项:1、摸一张牌,若如此做,你本阶段内不能使用【杀】。 2、弃置一张牌,若如此做,此阶段你使用【杀】无距离限制且你可以额外使用一张【杀】。", - rezhenxing: "镇行", - rezhenxing_info: "结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", - xin_jianyong: "手杀界简雍", - xin_jianyong_prefix: "手杀界", - xinqiaoshui: "巧说", - xinqiaoshui_info: "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,则你本阶段内使用的下一张基本牌或普通锦囊牌可以增加减少一个目标。若你没赢,你本阶段内不能使用锦囊牌。", - xinjyzongshi: "纵适", - xinjyzongshi_info: "当你拼点后,你可以观看牌堆顶的一张牌,然后选择一项:获得此牌,或获得两张拼点牌中点数较小的一张。", - dingyuan: "手杀丁原", - dingyuan_prefix: "手杀", - beizhu: "备诛", - beizhu_draw: "备诛", - beizhu_info: "出牌阶段限一次,你可以观看一名其他角色的手牌。若其中:没有【杀】,你弃置其一张牌,然后你可令其获得牌堆中的一张【杀】;有【杀】,其依次对你使用这些【杀】,当你因此受到1点伤害后,你摸一张牌。", - xin_zhuran: "手杀界朱然", - xin_zhuran_prefix: "手杀界", - mobiledanshou: "胆守", - mobiledanshou_info: "一名其他角色的结束阶段开始时,若X:为0,你摸一张牌;不等于0,你可弃置X张牌并对其造成1点伤害(X为其本回合内使用的目标包含你的牌的数量)。", - yanghuiyu: "羊徽瑜", - hongyi: "弘仪", - hongyi2: "弘仪", - hongyi_info: "出牌阶段限一次,你可以选择一名其他角色。你的下回合开始前,该角色造成伤害时进行判定,若结果为:黑色,此伤害-1。红色,受到伤害的角色摸一张牌。", - requanfeng: "劝封", - requanfeng_gain: "劝封", - requanfeng_info: "限定技。①其他角色死亡时,你可失去〖弘仪〗,然后获得其武将牌上的所有非主公技,非隐匿技和非Charlotte技,加1点体力上限并回复1点体力。②当你处于濒死状态时,你可以加2点体力上限,然后回复4点体力。", - quanfeng: "劝封", - quanfeng_info: "锁定技,限定技,一名角色死亡时,你选择获得其的一个技能(主公技,限定技,觉醒技,隐匿技,使命技,带有Charlotte标签的技能除外),然后加1点体力上限并回复1点体力。", - simashi: "手杀司马师", - simashi_prefix: "手杀", - baiyi: "败移", - baiyi_info: "限定技,出牌阶段,若你已受伤,你可以交换两名其他角色的座次。", - jinglve: "景略", - jinglve2: "景略", - jinglve3: "景略", - jinglve_info: "出牌阶段限一次,若场上没有与你对应的「死士」牌,则你可以观看一名其他角色的手牌,将其中一张牌标记为「死士」。当其使用对应的实体牌中包含「死士」的牌时,你取消此牌的所有目标。当「死士」牌不因使用而进入弃牌堆,或其回合结束后,若「死士」牌仍在其区域内,则你获得此牌。", - shanli: "擅立", - shanli_info: "觉醒技,准备阶段,若你已发动过〖败移〗且对至少两名角色发动过〖景略〗,则你减1点体力上限并选择一名角色。系统随机选择三个不为〖忘隙(仲村由理)〗的主公技,然后你选择其中一个技能,令其获得之。其将交互表情中的【拖鞋】和【酒杯】替换为【枷锁】和【玉玺】。", - re_lingtong: "手杀界凌统", - re_lingtong_prefix: "手杀界", - re_liubiao: "手杀界刘表", - re_liubiao_prefix: "手杀界", - hucheer: "手杀胡车儿", - hucheer_prefix: "手杀", - daoji: "盗戟", - daoji_info: "出牌阶段限一次,你可以弃置一张非基本牌并选择一名装备区里有牌的其他角色,你获得其装备区中的一张牌并使用之。若你以此法得到的牌是武器牌,则你使用此牌后对其造成1点伤害。", - xin_hansui: "手杀韩遂", - xin_hansui_prefix: "手杀", - xinniluan: "逆乱", - xinniluan_info: "其他角色的结束阶段,若其本回合对除其以外的角色使用过牌,则你可以对其使用一张【杀】。若以此法使用的【杀】造成伤害,则你弃置其一张牌。", - xiaoxi_hansui: "骁袭", - xiaoxi_hansui_info: "你可以将一张黑色牌当做【杀】使用或打出。", - xin_zhangfei: "手杀界张飞", - xin_zhangfei_prefix: "手杀界", - liyong: "厉勇", - liyong2: "厉勇", - liyong3: "厉勇", - liyong_info: "锁定技,若你于出牌阶段内使用的【杀】被【闪】抵消,则你获得如下效果:你本回合使用的下一张【杀】不可被响应且伤害+1,指定的目标本回合非锁定技失效,当此【杀】造成伤害后,若目标角色未死亡,你失去1点体力。", - gongsunkang: "公孙康", - juliao: "据辽", - juliao_info: "锁定技,其他角色计算与你的距离始终+X(X为场上势力数-1)。", - taomie: "讨灭", - taomie1: "讨灭", - taomie2: "讨灭", - taomie3: "讨灭", - taomie4: "讨灭", - taomie_info: "当你受到伤害后或当你造成伤害后,你可以令伤害来源或受伤角色获得“讨灭”标记(如场上已有标记则转移给该角色);你和拥有“讨灭”标记的角色视为在彼此的攻击范围内,且当你对该角色造成伤害时,选择一项:1. 此伤害+1;2. 你获得其区域内的一张牌并可将之交给另一名角色;3. 依次执行前两项并于伤害结算后弃置其“讨灭”标记。", - xin_guohuai: "手杀界郭淮", - xin_guohuai_prefix: "手杀界", - mobilejingce: "精策", - mobilejingce_info: "结束阶段,若此回合因使用或打出而置入弃牌堆的牌的数量不小于你的体力值,则你可以摸两张牌。", - xin_panzhangmazhong: "手杀界潘璋马忠", - xin_panzhangmazhong_prefix: "手杀界", - xinduodao: "夺刀", - xinduodao_info: "当你受到伤害后,你可以获得伤害来源装备区里的武器牌。", - xinanjian: "暗箭", - xinanjian_info: "锁定技,当你使用【杀】指定目标后,若你不在目标角色攻击范围内,你选择一项:1. 令其无法响应此【杀】;2. 其受到此【杀】造成的伤害+1。", - xin_fuhuanghou: "手杀界伏寿", - xin_fuhuanghou_prefix: "手杀界", - xinzhuikong: "惴恐", - xinzhuikong_info: "每轮限一次,其他角色的回合开始时,若其体力值不小于你,你可与其拼点。若你赢,其本回合无法使用牌指定除其以外的角色为目标;若你没赢,你获得其拼点的牌,然后其视为对你使用一张【杀】。", - xinqiuyuan: "求援", - xinqiuyuan_info: "当你成为【杀】的目标时,你可以令另一名其他角色交给你一张除【杀】以外的基本牌,否则其也成为此【杀】的目标。", - xin_gongsunzan: "手杀界公孙瓒", - xin_gongsunzan_prefix: "手杀界", - re_dengai: "手杀界邓艾", - re_dengai_prefix: "手杀界", - flappybird: "飞鸟", - flappybird_info: "出牌阶段,你可游玩一局Flappy Bird。", - re_handang: "手杀界韩当", - re_handang_prefix: "手杀界", - nanhualaoxian: "手杀南华老仙", - nanhualaoxian_prefix: "手杀", - yufeng: "御风", - yufeng2: "御风", - yufeng_info: "出牌阶段限一次,你可以表演“御风飞行”。若表演失败,则你摸X张牌。若表演成功,则你可以选择至多X名其他角色获得“御风”效果,然后摸X-Y张牌(准备阶段开始时,你进行判定。若结果为:红色,你跳过摸牌阶段;黑色,你跳过出牌阶段和弃牌阶段。X为你的得分。Y为你选择的角色数)。", - tianshu: "天书", - tianshu_info: "出牌阶段开始时,若场上没有【太平要术】,则你可以弃置一张牌并选择一名角色。该角色获得并使用【太平要术】。", - re_jiangwei: "手杀界姜维", - re_jiangwei_prefix: "手杀界", - retiaoxin: "挑衅", - retiaoxin_info: "出牌阶段限一次,你可以指定一名有牌的其他角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。", - re_zhurong: "手杀界祝融", - re_zhurong_prefix: "手杀界", - relieren: "烈刃", - relieren_info: "当你使用【杀】指定目标后,你可以和目标角色进行拼点。若你赢,你获得其一张牌。若你没赢,你获得对方的拼点牌,其获得你的拼点牌。", - zhouqun: "周群", - tiansuan: "天算", - tiansuan_info: "出牌阶段限一次,若场上没有因你产生的“命运签”,则你可以抽取一张“命运签”,然后令一名角色获得“命运签”直到你的下回合开始。若你以此法抽取的“命运签”为:上上签,你观看其手牌;上上签/上签,你获得其区域内的一张牌。", - tiansuan_faq: "【命运签】说明", - tiansuan_faq_info: "当你抽取“命运签”时,你可以令其中一种命运签的权重+1。
    上上签(权重1):当你受到伤害时,防止此伤害。
    上签(权重2):当你受到伤害时,你令伤害值改为1;当你受到1点伤害后,你摸一张牌。
    中签(权重3):当你受到伤害时,你令伤害属性改为火属性并将伤害值改为1。
    下签(权重2):当你受到伤害时,你令此伤害+1。
    下下签(权重1):当你受到伤害时,你令此伤害+1。你不能使用【酒】或【桃】。", - tiansuan2_0: "命运签", - tiansuan2_1: "命运签", - tiansuan2_2: "命运签", - tiansuan2_damage: "命运签", - tiansuan2_fire: "命运签", - tiansuan2_3: "命运签", - tiansuan2_4: "命运签", - ol_yujin: "手杀界于禁", - ol_yujin_prefix: "手杀界", - rejieyue: "节钺", - rejieyue_info: "结束阶段开始时,你可以将一张牌交给一名其他角色。然后其选择一项:令你摸三张牌:或其保留一张手牌和装备区的牌,然后弃置其余的牌。", - xin_zhoucang: "手杀界周仓", - xin_zhoucang_prefix: "手杀界", - mobilezhongyong: "忠勇", - mobilezhongyong_info: "当你于出牌阶段内使用的【杀】结算结束后,若没有目标角色使用【闪】响应过此【杀】,则你可获得此【杀】;否则你可选择一项:①获得目标角色使用的【闪】,然后可将此【杀】交给另一名其他角色。②将目标角色使用的【闪】交给另一名其他角色,然后你本回合使用【杀】的次数上限+1且下一张【杀】的伤害值基数+1。(你不能使用本回合因执行〖忠勇〗的效果得到的牌)", - xin_caifuren: "手杀界蔡夫人", - xin_caifuren_prefix: "手杀界", - xinqieting: "窃听", - xinqieting_info: "其他角色的回合结束时,若其本回合内未对其他角色造成过伤害,则你可选择一项:①摸一张牌。②观看其两张手牌并获得其中的一张。③将其装备区内的一张牌移动至你的装备区。", - xinguixiu: "闺秀", - xinguixiu_info: "锁定技。结束阶段,若你的体力值为:奇数,你摸一张牌;偶数,你回复1点体力。", - re_zhonghui: "手杀界钟会", - re_zhonghui_prefix: "手杀界", - requanji: "权计", - requanji_info: "出牌阶段结束时,若你的手牌数大于体力值,或当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。", - xin_guyong: "手杀界顾雍", - xin_guyong_prefix: "手杀界", - xinshenxing: "慎行", - xinshenxing_info: "出牌阶段限X次(X为你的体力值),你可以弃置两张牌,然后摸一张牌。若这两张牌颜色不同,则改为摸两张牌。", - xinbingyi: "秉壹", - xinbingyi_info: "结束阶段,你可展示所有手牌。若这些牌的颜色或类型均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数)。", - qiaozhou: "手杀谯周", - qiaozhou_prefix: "手杀", - zhiming: "知命", - zhiming_info: "准备阶段开始时或弃牌阶段结束时,你摸一张牌,然后可以将一张牌置于牌堆顶。", - xingbu: "星卜", - xingbu_info: "结束阶段,你可以亮出牌堆顶的三张牌,然后你可以根据X值(X为这三张牌中红色牌的数量),令一名其他角色获得对应的效果直到其下回合结束:①三张:其摸牌阶段多摸两张牌,使用【杀】的次数上限+1。②两张:其使用【杀】的次数上限-1,跳过弃牌阶段。③小于两张:其于准备阶段开始时弃置一张手牌。", - xin_sunluban: "手杀界孙鲁班", - xin_sunluban_prefix: "手杀界", - xinzenhui: "谮毁", - xinzenhui_info: "出牌阶段限一次。当你使用【杀】或黑色普通锦囊牌指定目标时,你可选择另一名能成为此牌目标的其他角色并选择一项:①令其也成为此牌的目标。②获得其一张牌,然后将此牌的使用者改为该角色。", - xinjiaojin: "骄矜", - xinjiaojin_info: "当你受到男性角色造成的伤害时,你可以弃置一张装备牌并防止此伤害。", - xin_caozhen: "手杀界曹真", - xin_caozhen_prefix: "手杀界", - discretesidi: "司敌", - discretesidi_info: "①当你使用的不为延时锦囊牌的牌结算结束后,你可选择一名R内不存在以a为第一序偶的二元序偶的其他角色a,并选择一名角色b,在关系R内建立二元序偶<a,b>(b对其他角色不可见)。②一名角色a使用不为延时锦囊牌的牌指定b为目标时,若(aRb)∧(此牌目标数为1)为真,则{你从R内移除<a,b>,且:若b为你,你摸一张牌;若b不为你,你可选择:⒈取消此牌的目标,然后若场上没有处于濒死状态的角色,则你对a造成1点伤害。⒉摸两张牌};否则{你清除R内以a为第一元素的二元序偶}。", - fuqian: "傅佥", - jueyong: "绝勇", - jueyong_info: "锁定技。①当你不因〖绝勇〗成为唯一牌的目标时,若此牌不为转化牌且对应的实体牌牌数为1且不为【桃】或【酒】且你的“绝”数小于你的体力值,则你将此牌置于你的武将牌上,称为“绝”,且取消此牌的目标。②结束阶段开始时,若你有“绝”,则你令所有“绝”的原使用者依次对你使用所有“绝”,将无法使用的“绝”置入弃牌堆。", - poxiang: "破降", - poxiang_info: "出牌阶段限一次。你可以将一张牌交给一名其他角色。你摸三张牌(不计入本回合的手牌上限),移去所有“绝”并失去1点体力。", - simafu: "手杀司马孚", - simafu_prefix: "手杀", - xunde: "勋德", - xunde_info: "一名角色受到伤害后,若你至其的距离不大于1,则你可判定。若判定结果:大于5,你令该角色获得判定牌;小于7,你令伤害来源弃置一张手牌。", - chenjie: "臣节", - chenjie_info: "一名角色的判定牌生效前,你可打出一张花色相同的牌。系统将你打出的牌作为新判定牌,将原判定牌置入弃牌堆。然后你摸两张牌。", - mayuanyi: "马元义", - jibing: "集兵", - jibing_info: "①摸牌阶段开始时,若你的“兵”数小于势力数,则你可以改为将牌堆顶的两张牌置于你的武将牌上,称为“兵”。②你可以将一张“兵”当做【杀】或【闪】使用或打出。", - wangjing: "往京", - wangjing_info: "锁定技。当你因〖集兵〗而使用或打出牌时,若对方是场上体力值最高的角色,则你摸一张牌。", - moucuan: "谋篡", - moucuan_info: "觉醒技。准备阶段,若你的“兵”数不小于势力数,则你减1点体力上限并获得〖兵祸〗。", - binghuo: "兵祸", - binghuo_info: "一名角色的结束阶段开始时,若你本回合内因〖集兵〗而使用或打出过牌,则你可令一名角色判定。若判定结果为黑色,则你对其造成1点雷属性伤害。", - yanpu: "阎圃", - huantu: "缓图", - huantu_info: "每轮限一次。一名角色的摸牌阶段开始前,若其在你攻击范围内,则你可以交给其一张牌并令其跳过此阶段。然后你于此回合的结束阶段选择一项:①令其回复1点体力并摸两张牌。②你摸三张牌,然后交给其两张手牌。", - bihuo: "避祸", - bihuo_info: "限定技。一名角色脱离濒死状态时,你可以令其摸三张牌,然后其他角色计算至其的距离时+X直到本轮结束(X为角色数)。", - sunhanhua: "手杀孙寒华", - sunhanhua_prefix: "手杀", - chongxu: "冲虚", - chongxu_info: "出牌阶段限一次,你可以随机演奏一首音乐,并根据完成度来获得相应的分数(至多五分)。然后你可修改〖妙剑〗或〖莲华〗(消耗3分),并使用剩余的分数进行摸牌(每张2分)。", - chongxu_faq: "目前的曲库", - chongxu_faq_info: " 
    《鸟之诗》- 折户伸治
    《竹取飛翔 ~ Lunatic Princess》- ZUN
    《ignotus》- ak+q
    《Super Mario 3D World Theme》- 横田真人
    《只因你太美》- SWIN-S
    《Croatian Rhapsody》- Maksim
    《罗刹海市》- 刀郎
    《Pigstep (Stereo Mix)》- Lena Raine", - miaojian: "妙剑", - miaojian_info: "出牌阶段限一次。你可将一张【杀】当做刺【杀】使用,或将一张锦囊牌当做【无中生有】使用。", - miaojian1: "妙剑·改", - miaojian1_info: "出牌阶段限一次。你可将一张基本牌当做刺【杀】使用,或将一张非基本牌当做【无中生有】使用。", - miaojian2: "妙剑·极", - miaojian2_info: "出牌阶段限一次。你可视为使用一张刺【杀】或【无中生有】。", - shhlianhua: "莲华", - shhlianhua_info: "当你成为【杀】的目标后,你摸一张牌。", - shhlianhua1: "莲华·改", - shhlianhua1_info: "当你成为【杀】的目标后,你摸一张牌。然后你进行判定,若结果为黑桃,则此【杀】对你无效。", - shhlianhua2: "莲华·极", - shhlianhua2_info: "当你成为【杀】的目标后,你摸一张牌。然后此【杀】的使用者选择一项:①弃置一张牌。②令此【杀】对你无效。", - re_yufan: "手杀界虞翻", - re_yufan_prefix: "手杀界", - rezongxuan: "纵玄", - rezongxuan_place: "纵玄", - rezongxuan_info: "当你的牌因弃置而进入弃牌堆后,你可以将其以任意顺序置于牌堆顶。出牌阶段限一次,你可以摸一张牌,然后将一张牌置于牌堆顶。", - yj_huangzhong: "☆黄忠", - yj_huangzhong_prefix: "☆", - spshidi: "势敌", - spshidi_info: "转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。", - spyishi: "义释", - spyishi_info: "当你对装备区有牌的其他角色造成伤害时,你可令此伤害-1,然后获得其装备区内的一张牌。", - spqishe: "骑射", - spqishe_info: "你可以将一张装备牌当做【酒】使用。你的手牌上限+X(X为你装备区内的牌数)。", - sp_maojie: "毛玠", - bingqing: "秉清", - bingqing_info: "当你于出牌阶段内使用的牌结算结束后,若你于本阶段内使用的所有已结算结束的其他牌与此牌花色均不相同,则你可根据X的值执行对应效果:为2,你令一名角色摸两张牌;为3,你弃置一名角色区域内的一张牌;为4,你对一名其他角色造成1点伤害。(X为你本阶段内使用过的已结算结束的牌中包含的花色数)", - yingfeng: "迎奉", - yingfeng_info: "准备阶段,你可以令一名角色获得“奉”标记并移除场上所有其他的“奉”标记。有“奉”标记的角色使用牌没有距离限制。", - xin_sunxiu: "手杀界孙休", - xin_sunxiu_prefix: "手杀界", - mobileyanzhu: "宴诛", - mobileyanzhu_info: "出牌阶段限一次,你可以令一名有牌的其他角色选择一项:①你获得其装备区里所有的牌,然后你失去技能〖宴诛〗并修改技能〖兴学〗。②你获得其区域里的一张牌。", - mobilexingxue: "兴学", - mobilexingxue_info: "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值)。", - mobilexingxuex: "兴学·改", - mobilexingxuex_info: "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶或交给一名其他目标角色(X为你的体力上限)。", - re_wuguotai: "手杀界吴国太", - re_wuguotai_prefix: "手杀界", - reganlu: "甘露", - reganlu_info: "出牌阶段限一次,你可以选择装备区牌数之差的绝对值不大于X的两名角色或包含你在内的两名角色,然后交换这两名角色装备区内的牌。(X为你已损失的体力值)", - taoqian: "手杀陶谦", - taoqian_prefix: "手杀", - miheng: "手杀祢衡", - miheng_prefix: "手杀", - re_gaoshun: "手杀界高顺", - re_gaoshun_prefix: "手杀界", - peixiu: "裴秀", - xingtu: "行图", - xingtu1: "倍数", - xingtu2: "约数", - xingtu_info: "锁定技。你使用点数为X的倍数的牌无次数限制,你使用点数为X的约数的牌时摸一张牌(X为你本局游戏使用的上一张牌的点数)。", - juezhi: "爵制", - juezhi_info: "出牌阶段,你可以弃置至少两张牌,然后从牌堆中获得一张点数为Y的牌(Y为这些牌的点数和对13取余,余数为0时Y取13)。", - sp_jianggan: "手杀蒋干", - sp_jianggan_prefix: "手杀", - spdaoshu: "盗书", - spdaoshu_info: "每轮限一次。一名敌方角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", - spdaoshu_info_identity: "每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", - spdaoshu_info_guozhan: "每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", - mbdaoshu: "盗书", - mbdaoshu_info: "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你和队友观看其手牌并猜测其伪装的手牌,猜对的角色对其造成1点伤害,猜错的角色随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", - mbdaoshu_info_identity: "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", - mbdaoshu_info_guozhan: "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", - spdaizui: "戴罪", - spdaizui2: "戴罪", - spdaizui_info: "限定技。当你受到伤害值不小于体力值的伤害时,你可防止此伤害并将此伤害渠道对应的所有实体牌置于伤害来源的武将牌上,称为“释”。本回合结束时,其获得所有“释”。", - re_caiwenji: "手杀界蔡琰", - re_caiwenji_prefix: "手杀界", - re_bulianshi: "手杀界步练师", - re_bulianshi_prefix: "手杀界", - reanxu: "安恤", - reanxu_info: "出牌阶段限一次,你可以选择两名其他角色,令其中一名角色获得另一名角色的一张牌。若以此法移动的牌不来自装备区,则你摸一张牌。然后你可以令二者中手牌数较少的一名角色摸一张牌。", - xin_jushou: "手杀界沮授", - xin_jushou_prefix: "手杀界", - xinjianying: "渐营", - xinjianying_info: "①当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。②出牌阶段限一次,你可以将一张牌当做任意基本牌使用。若你于此阶段内使用的上一张牌有花色,则此牌的花色视为上一张牌的花色。", - re_xunyu: "手杀界荀彧", - re_xunyu_prefix: "手杀界", - rejieming: "节命", - rejieming_info: "当你受到1点伤害后,你可以令一名角色摸两张牌。然后若其手牌数小于体力上限,则你摸一张牌。", - xin_quancong: "手杀界全琮", - xin_quancong_prefix: "手杀界", - sbyaoming: "邀名", - sbyaoming_info: "蓄力技(2/4)。①当你受到1点伤害后,你可以获得1点蓄力值。②出牌阶段或当你受到伤害后,你可消耗1点蓄力值并选择一项:⒈弃置一名手牌数不小于你的角色的一张牌。⒉令一名手牌数不大于你的角色摸一张牌。若你上次发动〖邀名②〗时未获得过蓄力值且你选择的选项和上次不同,则你获得1点蓄力值。", - ruanhui: "阮慧", - mingcha: "明察", - mingcha_info: "摸牌阶段开始时,你亮出牌堆顶的三张牌。若这三张牌中有点数小于9的牌,则你可以放弃摸牌并获得这些牌,然后你可以获得一名其他角色的随机一张牌。", - jingzhong: "敬重", - jingzhong_info: "弃牌阶段结束时,若你于本阶段内弃置过至少两张黑色牌,则你可以选择一名其他角色并获得如下效果直到其回合结束:每阶段限三次,其于出牌阶段内使用的牌结算结束后,你获得此牌对应的实体牌。", - xin_mamidi: "手杀马日磾", - xin_mamidi_prefix: "手杀", - chengye: "承业", - chengye_info: "锁定技。①其他角色使用的非转化牌结算结束后,或其他角色的装备牌和延时锦囊牌进入弃牌堆后,或有延时锦囊牌因其他角色执行判定阶段的流程而进入弃牌堆后,若你的“六经”有空缺的位置可以置入此牌,则你将此牌置于你武将牌上,填补“六经”的对应位置。②出牌阶段开始时,若你的“六经”没有空缺的位置,则你获得所有“六经”。", - chengye_append: '
  • 《诗经》:伤害类锦囊牌
  • 《尚书》:基本牌
  • 《仪礼》:无懈可击
  • 《易经》:无中生有
  • 《乐经》:乐不思蜀
  • 《春秋》:装备牌', - buxu: "补叙", - buxu_backup: "补叙", - buxu_info: "出牌阶段,若你的“六经”中有空缺的位置,则你可以弃置X+1张牌并选择一种空缺的“六经”(X为你本阶段内发动过〖补叙〗的次数)。系统从牌堆或弃牌堆中检索一张对应的牌,然后你将此牌置于你武将牌上,填补“六经”的对应位置。", - re_dianwei: "手杀界典韦", - re_dianwei_prefix: "手杀界", - liuye: "手杀刘晔", - liuye_prefix: "手杀", - sp_caosong: "手杀曹嵩", - sp_caosong_prefix: "手杀", - yijin: "亿金", - yijin_info: "锁定技。①游戏开始时,你获得“膴仕”、“金迷”、“贾凶”、“通神”、“拥蔽”、“厚任”各1枚(均称为“金”)。②出牌阶段开始时,你选择一名没有“金”的其他角色。你交给其1枚“金”,且令其获得对应效果。③一名角色的回合结束后,若其有你交给其的“金”,其移去此“金”。④当你死亡时,移去场上所有你交出的“金”。⑤回合开始时,若你没有“金”,你死亡。", - yijin_wushi: "膴仕", - yijin_wushi_info: "锁定技。①摸牌阶段,你多摸四张牌。②你使用【杀】的次数上限+1。", - yijin_jinmi: "金迷", - yijin_jinmi_info: "锁定技。回合开始时,你跳过下一个出牌阶段和弃牌阶段。", - yijin_guxiong: "贾凶", - yijin_guxiong_info: "锁定技。①出牌阶段开始时,你失去1点体力。②你的手牌上限-3。", - yijin_tongshen: "通神", - yijin_tongshen_info: "锁定技。当你受到非雷电伤害时,防止之。", - yijin_yongbi: "拥蔽", - yijin_yongbi_info: "锁定技。准备阶段,你跳过下一个摸牌阶段。", - yijin_houren: "厚任", - yijin_houren_info: "锁定技。回合结束时,你回复3点体力。", - guanzong: "惯纵", - guanzong_info: "出牌阶段限一次。你可以令一名其他角色视为对另一名其他角色造成过1点伤害。", - yangfu: "杨阜", - jiebing: "借兵", - jiebing_info: "锁定技。当你受到伤害后,你选择来源外的一名其他角色,随机获得其一张牌并展示。若此牌为装备牌,你使用之。", - hannan: "扞难", - hannan_info: "出牌阶段限一次。你可以与一名角色拼点,赢的角色对没赢的角色造成2点伤害。", - xin_wuyi: "手杀界吴懿", - xin_wuyi_prefix: "手杀界", - sbbenxi: "奔袭", - sbbenxi_info: "出牌阶段开始时,你可以弃置至少一张牌,然后你于此阶段获得如下效果:①你至其他角色距离-X;②当你使用的下一张基本牌或普通锦囊牌A选择目标后,你可以额外指定X名距离为1的角色为目标;③牌A结算结束后,若此牌造成过伤害,你摸五张牌(X为你以此法弃置的牌数)。", - xin_zhuzhi: "手杀界朱治", - xin_zhuzhi_prefix: "手杀界", - sbanguo: "安国", - sbanguo_info: "①游戏开始时,你令一名其他角色获得1枚“安国”标记(有“安国”的角色手牌上限基数等于体力上限)。②出牌阶段开始时,你可以将一名有“安国”的角色的所有“安国”移动给一名本局游戏未获得过“安国”的其他角色。③当你受到伤害时,若有有“安国”的角色且伤害值不小于你的体力值且此伤害没有来源或来源没有“安国”,防止此伤害。④一名角色进入濒死状态时,若其有你因〖安国①〗获得的“安国”,你移去其该“安国”,令其将体力回复至1点。然后你选择一项:1.若你的体力值大于1,你失去体力至1点;2.若你的体力上限大于1,你将体力上限减至1。最后你令其获得1点护甲。", - wangjun: "手杀王濬", - wangjun_prefix: "手杀", - zhujian: "筑舰", - zhujian_info: "出牌阶段限一次。你可以令至少两名装备区里有牌的角色各摸一张牌。", - duansuo: "断索", - duansuo_info: "出牌阶段限一次。你可以重置任意名处于连环状态的角色,然后对这些角色各造成1点火焰伤害。", - sp_pengyang: "手杀彭羕", - sp_pengyang_prefix: "手杀", - spdaming: "达命", - spdaming_info: "①游戏开始时,你获得1点“达命”值。②其他角色A的出牌阶段限一次。其可以交给你一张牌,然后你选择另一名其他角色B。若B有与此牌相同类型的牌,其将一张该类型的牌交给A,你获得1点“达命”值;否则你将此牌交给A。", - spxiaoni: "嚣逆", - spxiaoni_info: "①出牌阶段限一次。若你的“达命”值大于0,你可以将一张牌当任意一种【杀】或伤害类锦囊牌使用。然后你减少等同于此牌指定目标数的“达命”值。②你的手牌上限基数为X(X为“达命”值,且至多为你的体力值,至少为0)。", - xin_zhuhuan: "手杀界朱桓", - xin_zhuhuan_prefix: "手杀界", - xinpingkou: "平寇", - xinpingkou_info: "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。然后你从牌堆中获得一张装备牌。", - xin_caoxiu: "手杀界曹休", - xin_caoxiu_prefix: "手杀界", - xinqingxi: "倾袭", - xinqingxi_info: "每回合限一次。当你对其他角色造成伤害时,你可以令其选择一项:1.弃置X张手牌(X为4减去你至其的距离,至少为1);2.令此伤害+1。", - yj_weiyan: "☆魏延", - yj_weiyan_prefix: "☆", - mbguli: "孤厉", - mbguli_info: "出牌阶段限一次。你可以将所有手牌当做一张无视防具的【杀】使用。此牌结算结束后,若此牌造成过伤害,你可以失去1点体力并将手牌摸至X张(X为你的体力上限)。", - mbaosi: "骜肆", - mbaosi_info: "锁定技。当你于出牌阶段对一名攻击范围内的角色造成伤害后,你于此阶段对其使用牌无次数限制。", - xin_zhoutai: "手杀界周泰", - xin_zhoutai_prefix: "手杀界", - re_yanwen: "手杀界颜良文丑", - re_yanwen_prefix: "手杀界", - qianzhao: "手杀牵招", - qianzhao_prefix: "手杀", - mbshihe: "势吓", - mbshihe_info_identity: "出牌阶段限一次。你可以与一名角色拼点。若你:赢,当其于其下回合结束前对你造成伤害时,取消之;没赢,你随机弃置一张牌。", - mbshihe_info: "出牌阶段限一次。你可以与一名角色拼点。若你:赢,当其于其下回合结束前对你和你的友方角色造成伤害时,取消之;没赢,你随机弃置一张牌。", - mbzhenfu: "镇抚", - mbzhenfu_info: "结束阶段,若你本回合因弃置失去过牌,你可以令一名其他角色获得1点护甲。", - shichangshi: "十常侍", - mbdanggu: "党锢", - mbdanggu_info: "锁定技。①游戏开始时,你获得十张“常侍”牌,然后你进行一次结党。②当你修整结束后,你进行一次结党并摸一张牌。③若你有亮出的“常侍”牌,你视为拥有这些牌的技能。", - mbdanggu_faq: "关于结党", - mbdanggu_faq_info: "
    系统随机选择一张未亮出过的“常侍”牌,然后选择四张未亮出过的“常侍”牌。你观看前者,然后从后者中选择一名认可前者的“常侍”牌。然后若此时不为双将模式,你将这两张武将牌作为你的武将牌(不移除原有技能);否则你获得这两张武将牌上的技能。", - mbdanggu_faq2: "关于认可", - mbdanggu_faq2_info: "
    双向不认可常侍为固定组合:
  • 郭胜、段珪
  • 韩悝、毕岚
    单向不认可常侍为系统随机分配。
    每次结党至多存在一张不认可主将的常侍牌,且若此次结党仅有一张常侍牌,则不会存在不认可情况。", - mbmowang: "殁亡", - mbmowang_info: "锁定技。①当你死亡前,若你有未亮出的“常侍”牌且体力上限大于0,你将死亡改为修整至你的下个回合开始前,然后你复原武将牌,且不于此次死亡事件中进行展示身份牌、检测游戏胜利条件与执行奖惩的流程。②回合结束后,你死亡。", - mbmowang_faq: "关于修整", - mbmowang_faq_info: "
    将武将牌移出游戏(视为你存活)。当该角色修整结束,其移回游戏。", - scs_zhangrang: "张让", - scstaoluan: "滔乱", - scstaoluan_info: "出牌阶段限一次。你可以将一张牌当任意一种基本牌或普通锦囊牌使用。", - scs_zhaozhong: "赵忠", - scschiyan: "鸱咽", - scschiyan_info: "①当你使用【杀】指定目标后,你可以将其的一张牌置于其武将牌上,然后其于当前回合结束时获得这些牌。②当你因执行【杀】的效果对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,此伤害+1。", - scs_sunzhang: "孙璋", - scszimou: "自谋", - scszimou_info: "锁定技。出牌阶段,当你使用第二/四/六张牌时,你从牌堆中获得一张【酒】/【杀】/【决斗】。", - scs_bilan: "毕岚", - scspicai: "庀材", - scspicai_info: "出牌阶段限一次。你可进行判定牌不置入弃牌堆的判定。若判定结果与本次发动技能时的其他判定结果的花色均不相同,则你可以重复此流程。然后你将所有位于处理区的判定牌交给一名角色。", - scs_xiayun: "夏恽", - scsyaozhuo: "谣诼", - scsyaozhuo_info: "出牌阶段限一次。你可以与一名角色拼点,若你赢,其跳过下一个摸牌阶段;若你没赢,你弃置两张牌。", - scs_hankui: "韩悝", - scsxiaolu: "宵赂", - scsxiaolu_info: "出牌阶段限一次。你可以摸两张牌,然后选择一项:1.弃置两张牌;2.将两张牌交给一名其他角色。", - scs_lisong: "栗嵩", - scskuiji: "窥机", - scskuiji_info: "出牌阶段限一次。你可以观看一名其他角色的手牌,然后弃置你与其的共计四张花色各不相同的手牌。", - scs_duangui: "段珪", - scschihe: "叱吓", - scschihe_info: "当你使用【杀】指定唯一目标后,你可亮出牌堆顶的两张牌,令此【杀】的伤害值基数+X(X为亮出牌中花色与此【杀】相同的牌数),且目标角色不能使用亮出牌包含的花色的牌响应此【杀】。", - scs_guosheng: "郭胜", - scsniqu: "逆取", - scsniqu_info: "出牌阶段限一次。你可以对一名角色造成1点火焰伤害。", - scs_gaowang: "高望", - scsanruo: "安弱", - scsanruo_info: "你可以将一张♥牌当【桃】、♦牌当火【杀】、♣牌当【闪】、♠牌当【无懈可击】使用。当你以此法使用或打出【杀】或【闪】时,你可以获得对方的一张牌;当你以此法使用【桃】时,你可以获得一名其他角色的一张牌;当你以此法使用【无懈可击】时,你可以获得此牌响应的普通锦囊牌的使用者的一张牌。", - scsmiaoyu: "妙语", - scsmiaoyu_info: "你可以将至多两张相同花色的牌按照以下规则使用或打出:♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。", - re_xiaoqiao: "手杀界小乔", - re_xiaoqiao_prefix: "手杀界", - xin_sunliang: "手杀孙亮", - xin_sunliang_prefix: "手杀", - xinkuizhu: "溃诛", - xinkuizhu_info: "弃牌阶段结束后,你可以选择一项:1.令至多X名角色各摸一张牌。2.对任意名体力值之和为X的角色造成1点伤害,若你以此法选择的角色数不小于2,你失去1点体力。(X为你此阶段弃置的牌数)", - xinzhizheng: "掣政", - xinzhizheng_info: "锁定技,你的出牌阶段内,攻击范围内不包含你的其他角色不能成为你使用牌的目标。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。", - xinlijun: "立军", - xinlijun_info: "主公技,其他吴势力角色于其回合内使用【杀】结算完毕后,其可以将此【杀】对应的实体牌交给你,然后你可以令其摸一张牌。", - xin_zhangyi: "手杀界张嶷", - xin_zhangyi_prefix: "手杀界", - xinwurong: "怃戎", - xinwurong_info: "出牌阶段限一次,你可以与一名其他角色进行谋弈:
  • 若你选择“镇压”且其选择“反抗”,你对其造成1点伤害,然后你摸一张牌。
  • 若你选择“安抚”且其选择“归顺”,其须交给你两张牌(若其牌数不足两张,则改为令其跳过其下个摸牌阶段)。
  • 若你选择“镇压”且其选择“归顺”,你获得其一张牌,然后你交给其两张牌。
  • 若你选择“安抚”且其选择“反抗”,你受到1点伤害,然后你摸两张牌。", - xin_guozhao: "手杀郭照", - xin_guozhao_prefix: "手杀", - yichong: "易宠", - yichong_info: "①准备阶段,你可以选择一名其他角色并选择一个花色,然后你获得其所有此花色的装备牌和其一张此花色的手牌,移除场上的所有“雀”标记,令其获得“雀”标记直到你的下个回合开始。②拥有“雀”标记的角色获得你最后一次发动〖易宠①〗选择的花色的牌后,你获得这些牌(你至多通过每个“雀”得到一张牌)。", - wufei: "诬诽", - wufei_info: "若场上存在拥有“雀”标记的角色A,则:①当你使用【杀】或伤害类锦囊牌指定第一个目标后,你令A成为此牌伤害来源。②当你受到伤害后,若A的体力值大于3,则你可以令A受到1点无来源伤害。", - yj_zhoubuyi: "☆周不疑", - yj_zhoubuyi_prefix: "☆", - mbhuiyao: "慧夭", - mbhuiyao_info: "出牌阶段限一次。你可以受到1点无来源伤害,然后你选择一名其他角色,令其视为对另一名角色造成过1点伤害。", - mbquesong: "雀颂", - mbquesong_info: "一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸X张牌并复原武将牌(X为3,若其装备区非宝物牌牌数不小于三张则X为2);2.回复1点体力。", - xin_yuanshao: "手杀界袁绍", - xin_yuanshao_prefix: "手杀界", - re_baosanniang: "手杀鲍三娘", - re_baosanniang_prefix: "手杀", - re_liushan: "手杀界刘禅", - re_liushan_prefix: "手杀界", - re_sunben: "界孙笨", - re_sunben_prefix: "界", - re_zhangzhang: "手杀界张昭张纮", - re_zhangzhang_prefix: "手杀界", - re_caozhi: "手杀界曹植", - re_caozhi_prefix: "手杀界", - re_sunjian: "手杀界孙坚", - re_sunjian_prefix: "手杀界", - sunru: "手杀孙茹", - sunru_prefix: "手杀", - pangdegong: "手杀庞德公", - pangdegong_prefix: "手杀", - zhaotongzhaoguang: "手杀赵统赵广", - zhaotongzhaoguang_prefix: "手杀", - re_liru: "手杀界李儒", - re_liru_prefix: "手杀界", - re_chenqun: "手杀界陈群", - re_chenqun_prefix: "手杀界", - old_yuanshu: "手杀袁术", - old_yuanshu_prefix: "手杀", - baoxin: "鲍信", - mutao: "募讨", - mutao_info: "出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】置于武将牌上,然后将这些牌依次随机交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。", - yimou: "毅谋", - yimou_info: "当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色,然后摸一张牌。", - jiangji: "手杀蒋济", - jiangji_prefix: "手杀", - jilun: "机论", - jilun_info: "①当你受到伤害后,若你拥有技能〖急筹〗,则你可以一项:1.摸两张牌。2.获得1枚“机论”标记。②一名角色的结束阶段,若你拥有“机论”,则重复选择执行以下项直到你没有“机论”标记:1.失去1枚“机论”标记,视为使用一张〖急筹①〗记录过且未被〖机论②〗记录过的普通锦囊牌并记录此牌牌名。2.失去所有“机论”标记。", - liwei: "李遗", - jiaohua: "教化", - jiaohua_backup: "教化", - jiaohua_info: "出牌阶段限两次,你可以选择一个未被〖教化〗记录过的牌的类型,令一名角色从牌堆中获得一张此类型的牌,然后记录此类型,若基本、锦囊、装备均已被你发动〖教化〗记录,则你清空〖教化〗记录。", - laimin: "来敏", - laishou: "来寿", - laishou_info: "锁定技。①当你受到伤害值大于等于你的体力值的伤害时,若你的体力上限小于9,你防止此伤害并增加等量体力上限。②准备阶段,若你的体力上限不小于9,你死亡。", - luanqun: "乱群", - luanqun_info: "出牌阶段限一次,若你有手牌,则你可以令所有有手牌的角色同时展示一张手牌,然后你可以获得其中一张与你展示的牌颜色相同的展示牌,所有本次展示牌颜色与你展示的牌颜色不同的角色的下个出牌阶段使用的第一张【杀】只能对你使用,且此【杀】不可被响应。", - xin_wuban: "吴班", - xinjintao: "进讨", - xinjintao_info: "锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】不可被响应,第二张【杀】伤害+1。", - xinlianhuan: "连环", - xinlianhuan_info: "你可以将一张♣手牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。", - mb_sunluyu: "手杀孙鲁育", - mb_sunluyu_prefix: "手杀", - mbmumu: "穆穆", - mbmumu_info: "出牌阶段开始时,你可以选择一项:1.弃置场上的一张装备牌;2.获得场上的一张防具牌,然后你本回合不能使用或打出【杀】。", - mbmeibu: "魅步", - mbmeibu_info: "其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。", - mbzhixi: "止息", - mbzhixi_info: "锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。", - yanxiang: "阎象", - kujian: "苦谏", - kujian_info: "出牌阶段限一次,你可以将至多两张手牌称为“谏”并交给一名其他角色,然后你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸两张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。", - mb_xianglang: "手杀向朗", - mb_xianglang_prefix: "手杀", - naxue: "纳学", - naxue_info: "你可以跳过出牌阶段。若如此做,你可以弃置任意张牌并摸等量的牌,然后你可以交给至多两名其他角色各一张手牌。", - yijie: "遗诫", - yijie_info: "锁定技。当你死亡时,你令所有其他角色将体力回复或失去至X(X为所有其他角色的体力之和除以所有其他角色数,向下取整,且X至少为1)。", - mb_chengui: "手杀陈珪", - mb_chengui_prefix: "手杀", - guimou: "诡谋", - guimou_info: "锁定技。游戏开始时/回合结束时,你随机/须选择以下一项直到你的下个准备阶段:①记录场上期间角色使用牌数;②记录期间场上角色弃置牌数;③记录期间场上角色获得牌数。准备阶段,你可以选择一名场上对应记录数值最少的其他角色,观看其手牌并选择其中一张牌,然后你将此牌交给另一名其他角色或弃置此牌。", - zhouxian: "州贤", - zhouxian_info: "锁定技。当你成为其他角色使用的伤害类卡牌的目标后,你亮出牌堆顶的三张牌,然后其须选择一项:①弃置一张与亮出牌之一类别相同的牌;②令此牌对你无效。", - mb_huban: "手杀胡班", - mb_huban_prefix: "手杀", - mbyilie: "义烈", - mbyilie2: "义烈", - mbyilie3: "义烈", - mbyilie_info: "锁定技。①游戏开始时,你选择一名其他角色,然后你获得以下效果:其受到伤害时,若你没有“烈”,则你获得等同于伤害值的“烈”标记,然后防止此伤害;其对其他角色造成伤害后,你回复1点体力。②结束阶段,若你拥有“烈”标记,你摸一张牌并失去X点体力,然后移去所有“烈”(X为你拥有的“烈”标记数)。", - muludawang: "木鹿大王", - shoufa: "兽法", - shoufa_info: "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名与你距离大于/不大于2的角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。", - shoufa_info_doudizhu: "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名与你距离大于/不大于1的角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。", - yuxiang: "御象", - yuxiang_info: "锁定技,若你有护甲值,则:①你计算与其他角色的距离-1,其他角色计算与你的距离+1;②当你受到火焰伤害时,此伤害+1。", - zhoulin: "咒鳞", - zhoulin_info: "限定技,出牌阶段,你可以获得2点护甲值,然后选择一个“兽法”效果,你发动〖兽法〗的执行效果改为你选择的效果直到你的下个回合结束。", - xin_huojun: "手杀霍峻", - xin_huojun_prefix: "手杀", - sidai: "伺怠", - sidai_info: "限定技,出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限。", - jieyu: "竭御", - jieyu_info: "结束阶段,你可以从弃牌堆中获得共X张不同牌名的基本牌(X为4-你上次发动〖竭御〗至今你成为其他角色使用伤害类卡牌目标的次数,且X至少为1)。", - jieyu_info_identity: "结束阶段,你可以从弃牌堆中获得共X张不同牌名的基本牌(X为3-你上次发动〖竭御〗至今你成为其他角色使用伤害类卡牌目标的次数,且X至少为1)。", - yangfeng: "杨奉", - mbxuetu: "血途", - mbxuetu_info: "转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。", - mbxuetu_achieve: "血途·成功", - mbxuetu_achieve_info: "出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。", - mbxuetu_fail: "血途·失败", - mbxuetu_fail_info: "转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。", - mbweiming: "威命", - mbweiming_info: "使命技,锁定技。①出牌阶段开始时,你记录一名未以此法记录过的角色。②成功:当你杀死一名未被〖威命①〗记录过的角色后,修改〖血途〗为成功版本。③失败:当一名被〖威命①〗记录过的角色死亡后,你修改〖血途〗为失败版本。", - lizhaojiaobo: "李昭焦伯", - mbzuoyou: "佐佑", - mbzuoyou_info: "转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张手牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。", - mbshishou: "侍守", - mbshishou_info: "锁定技。当你发动〖佐佑〗后,若目标角色不为你,你执行〖佐佑〗中目标角色未执行的一项。", - chengji: "成济", - mbkuangli: "狂戾", - mbkuangli_info: "锁定技。①出牌阶段开始时,你随机令场上任意名其他角色获得“狂戾”标记。②出牌阶段限两次。当你使用牌指定有“狂戾”的角色为目标后,你与其各随机弃置一张牌,然后你摸一张牌。③回合结束时,你移除所有角色的“狂戾”。", - mbxiongsi: "凶肆", - mbxiongsi_info: "限定技。出牌阶段,若你的手牌数不少于三张,你可以弃置所有手牌,然后令所有其他角色依次失去1点体力。", - mb_sp_guanqiujian: "SP毌丘俭", - mb_sp_guanqiujian_prefix: "SP", - mbcuizhen: "摧阵", - mbcuizhen_info_identity: "①游戏开始时,你可以废除至多两名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。", - mbcuizhen_info: "①当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。②摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。", - mbkuili: "溃离", - mbkuili_info: "锁定技。当你受到伤害后,你弃置等同于伤害值的手牌;若来源有被废除的武器栏,你令其恢复武器栏。", - mb_caomao: "手杀曹髦", - mb_caomao_prefix: "手杀", - mbqianlong: "潜龙", - mbqianlong_info: "①游戏开始时,你获得20枚“道心”标记。②当你得到牌后/受到1点伤害后/造成1点伤害后,你获得5/10/15枚“道心”(上限为100枚)。③若你的“道心”数不小于25/50/75/100,你视为拥有〖清正〗/〖酒诗〗/〖放逐〗/〖决进〗。", - mbcmqingzheng: "清正", - mbcmqingzheng_info: "出牌阶段开始时,你可以弃置两种花色的所有手牌,并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。", - mbcmjiushi: "酒诗", - mbcmjiushi_info: "①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌背面向上,你可以翻面。③当你翻面后,你获得牌堆里的一张锦囊牌。", - mbcmfangzhu: "放逐", - mbcmfangzhu_info: "出牌阶段限一次。你可以选择一名其他角色,选择一项:⒈令其不能使用手牌中的非锦囊牌直到其回合结束;⒉令其所有非Charlotte技能失效直到其回合结束。", - mbjuejin: "决进", - mbjuejin_info: "限定技。出牌阶段,你可以令所有角色依次将体力回复或失去至1并获得X点护甲(X为一名角色以此法变化的体力值)。然后你增加如下“向死存魏”的全局技能:当有牌进入弃牌堆后,系统将这些牌中的【闪】、【桃】和【酒】移出游戏。", - mbweitong: "卫统", - mbweitong_info: "主公技。游戏开始时,若你有〖潜龙〗,你获得20X枚“道心”(X为其他魏势力角色数)。", - - mobile_standard: "手杀异构·标准包", - mobile_shenhua_feng: "手杀异构·其疾如风", - mobile_shenhua_huo: "手杀异构·侵掠如火", - mobile_shenhua_lin: "手杀异构·其徐如林", - mobile_shenhua_shan: "手杀异构·不动如山", - mobile_shenhua_yin: "手杀异构·难知如阴", - mobile_shenhua_lei: "手杀异构·动如雷霆", - mobile_yijiang1: "手杀异构·将1", - mobile_yijiang2: "手杀异构·将2", - mobile_yijiang3: "手杀异构·将3", - mobile_yijiang4: "手杀异构·将4", - mobile_yijiang5: "手杀异构·将5", - mobile_yijiang67: "手杀异构·原创设计", - mobile_sp: "手杀异构·SP", - mobile_default: "袖里乾坤", - mobile_others: "其他", - mobile_changshi: "十常侍单体", - }, - }; -}); diff --git a/character/mobile/card.js b/character/mobile/card.js new file mode 100644 index 000000000..3aca5cf16 --- /dev/null +++ b/character/mobile/card.js @@ -0,0 +1,167 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + ly_piliche: { + fullskin: true, + //vanish:true, + derivation: "liuye", + cardcolor: "diamond", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -8 }, + skills: ["ly_piliche"], + //destroy:'polu' + }, + wolong_card: { + type: "takaramono", + fullskin: true, + //derivation:"pangdegong", + }, + fengchu_card: { + type: "takaramono", + fullskin: true, + //derivation:"pangdegong", + }, + xuanjian_card: { + fullskin: true, + type: "takaramono", + //derivation:"pangdegong", + }, + shuijing_card: { + fullskin: true, + type: "takaramono", + //derivation:"pangdegong", + }, + rewrite_bagua: { + derivation: "majun", + //cardimage:"bagua", + fullskin: true, + type: "equip", + subtype: "equip2", + ai: { + basic: { + equipValue: 7.5, + }, + }, + skills: ["rw_bagua_skill"], + }, + rewrite_baiyin: { + derivation: "majun", + fullskin: true, + //cardimage:"baiyin", + type: "equip", + subtype: "equip2", + loseDelay: false, + onLose: function () { + player.addTempSkill("rw_baiyin_skill_lose"); + }, + skills: ["rw_baiyin_skill"], + tag: { + recover: 1, + }, + ai: { + order: 9.5, + equipValue: function (card, player) { + if (player.hp == player.maxHp) return 5; + if (player.countCards("h", "rewrite_baiyin")) return 6; + return 0; + }, + basic: { + equipValue: 5, + }, + }, + }, + rewrite_lanyinjia: { + derivation: "majun", + //cardimage:"lanyinjia", + fullskin: true, + type: "equip", + subtype: "equip2", + skills: ["rw_lanyinjia", "lanyinjia2"], + ai: { + equipValue: 6, + basic: { + equipValue: 1, + }, + }, + }, + rewrite_renwang: { + derivation: "majun", + //cardimage:"renwang", + fullskin: true, + type: "equip", + subtype: "equip2", + skills: ["rw_renwang_skill"], + ai: { + basic: { + equipValue: 7.5, + }, + }, + }, + rewrite_tengjia: { + derivation: "majun", + //cardimage:"tengjia", + fullskin: true, + type: "equip", + subtype: "equip2", + //cardnature:"fire", + ai: { + equipValue: function (card, player) { + if (player.hasSkillTag("maixie") && player.hp > 1) return 0; + if (player.hasSkillTag("noDirectDamage")) return 10; + if (get.damageEffect(player, player, player, "fire") >= 0) return 10; + var num = + 3 - + game.countPlayer(function (current) { + return get.attitude(current, player) < 0; + }); + if (player.hp == 1) num += 4; + if (player.hp == 2) num += 1; + if (player.hp == 3) num--; + if (player.hp > 3) num -= 4; + return num; + }, + basic: { + equipValue: 3, + }, + }, + skills: ["rw_tengjia1", "rw_tengjia2", "rw_tengjia3", "rw_tengjia4"], + }, + rewrite_zhuge: { + derivation: "majun", + //cardimage:"zhuge", + distance: { + attackFrom: -2, + }, + fullskin: true, + type: "equip", + subtype: "equip1", + ai: { + equipValue: function (card, player) { + if ( + !game.hasPlayer(function (current) { + return player.canUse("sha", current) && get.effect(current, { name: "sha" }, player, player) > 0; + }) + ) { + return 1; + } + if (player.hasSha() && _status.currentPhase == player) { + if (player.getEquip("zhuge") || player.getCardUsable("sha") == 0) { + return 10; + } + } + var num = player.countCards("h", "sha"); + if (num > 1) return 6 + num; + return 3 + num; + }, + basic: { + equipValue: 5, + }, + tag: { + valueswap: 1, + }, + }, + skills: ["rw_zhuge_skill"], + }, +}; +export default cards; diff --git a/character/mobile/character.js b/character/mobile/character.js new file mode 100644 index 000000000..30230b694 --- /dev/null +++ b/character/mobile/character.js @@ -0,0 +1,159 @@ +const characters = { + mb_sp_guanqiujian: ["male", "wei", 4, ["mbcuizhen", "mbkuili"]], + mb_caomao: ["male", "wei", 3, ["mbqianlong", "mbweitong"], ["zhu"]], + chengji: ["male", "wei", 4, ["mbkuangli", "mbxiongsi"]], + lizhaojiaobo: ["male", "wei", 4, ["mbzuoyou", "mbshishou"]], + yangfeng: ["male", "qun", 4, ["mbxuetu", "mbweiming"]], + xin_huojun: ["male", "shu", 4, ["sidai", "jieyu"], ["character:tw_huojun", "die_audio:tw_huojun"]], + muludawang: ["male", "qun", "3/3/1", ["shoufa", "zhoulin", "yuxiang"]], + mb_chengui: ["male", "qun", 3, ["guimou", "zhouxian"]], + mb_huban: ["male", "wei", 4, ["mbyilie"]], + mb_xianglang: ["male", "shu", 3, ["naxue", "yijie"]], + yanxiang: ["male", "qun", 3, ["kujian", "twruilian"], ["die_audio:tw_yanxiang"]], + mb_sunluyu: ["female", "wu", 3, ["mbmeibu", "mbmumu"]], + xin_wuban: ["male", "shu", 4, ["xinjintao"], ["clan:陈留吴氏", "character:wuban"]], + baoxin: ["male", "qun", 4, ["mutao", "yimou"], ["die_audio:tw_baoxin"]], + jiangji: ["male", "wei", 3, ["twjichou", "jilun"], ["character:tw_jiangji", "die_audio:tw_jiangji"]], + liwei: ["male", "shu", 4, ["jiaohua"], ["die_audio:tw_liwei"]], + laimin: ["male", "shu", 3, ["laishou", "luanqun"]], + yj_zhoubuyi: ["male", "wei", 3, ["mbhuiyao", "mbquesong"]], + xin_guozhao: ["female", "wei", 3, ["yichong", "wufei"]], + xin_zhangyi: ["male", "shu", 4, ["xinwurong", "shizhi"]], + xin_sunliang: ["male", "wu", 3, ["xinzhizheng", "xinkuizhu", "xinlijun"], ["zhu"]], + re_xiaoqiao: ["female", "wu", 3, ["retianxiang", "xinhongyan"]], + shichangshi: ["male", "qun", 1, ["mbdanggu", "mbmowang"], ["sex:male_castrated"]], + re_zhangzhang: ["male", "wu", 3, ["rezhijian", "guzheng"]], + qianzhao: ["male", "wei", 4, ["mbshihe", "mbzhenfu"]], + re_yanwen: ["male", "qun", 4, ["reshuangxiong"]], + xin_zhoutai: ["male", "wu", 4, ["buqu", "new_fenji"]], + re_caozhi: ["male", "wei", 3, ["reluoying", "rejiushi", "chengzhang"]], + yj_weiyan: ["male", "qun", 5, ["mbguli", "mbaosi"]], + re_chenqun: ["male", "wei", 3, ["redingpin", "refaen"]], + xin_caoxiu: ["male", "wei", 4, ["qianju", "xinqingxi"]], + xin_zhuhuan: ["male", "wu", 4, ["fenli", "xinpingkou"]], + sp_pengyang: ["male", "shu", 3, ["spdaming", "spxiaoni"]], + wangjun: ["male", "qun", 4, ["zhujian", "duansuo"]], + xin_zhuzhi: ["male", "wu", 4, ["sbanguo"]], + xin_wuyi: ["male", "shu", 4, ["sbbenxi"]], + yangfu: ["male", "wei", 4, ["jiebing", "hannan"]], + sp_caosong: ["male", "wei", 3, ["yijin", "guanzong"]], + re_liru: ["male", "qun", 3, ["rejuece", "remieji", "xinfencheng"]], + re_dianwei: ["male", "wei", 4, ["reqiangxi"]], + xin_mamidi: ["male", "qun", 3, ["chengye", "buxu"]], + ruanhui: ["female", "wei", 3, ["mingcha", "jingzhong"]], + xin_quancong: ["male", "wu", 4, ["sbyaoming"]], + re_xunyu: ["male", "wei", 3, ["quhu", "rejieming"], ["clan:颍川荀氏"]], + xin_jushou: ["male", "qun", "2/3/3", ["xinjianying", "shibei"]], + re_bulianshi: ["female", "wu", 3, ["reanxu", "zhuiyi"]], + re_caiwenji: ["female", "qun", 3, ["rebeige", "duanchang"]], + sp_jianggan: ["male", "wei", 3, ["mbdaoshu", "spdaizui"]], + peixiu: ["male", "qun", 3, ["xingtu", "juezhi"]], + re_gaoshun: ["male", "qun", 4, ["rexianzhen", "rejinjiu"]], + re_wuguotai: ["female", "wu", 3, ["reganlu", "buyi"]], + xin_sunxiu: ["male", "wu", 3, ["mobileyanzhu", "mobilexingxue", "zhaofu"], ["zhu"]], + sp_maojie: ["male", "wei", 3, ["bingqing", "yingfeng"]], + yj_huangzhong: ["male", "qun", 4, ["spshidi", "spyishi", "spqishe"]], + re_yufan: ["male", "wu", 3, ["zhiyan", "rezongxuan"]], + sunhanhua: ["female", "wu", 3, ["chongxu", "miaojian", "shhlianhua"]], + yanpu: ["male", "qun", 3, ["huantu", "bihuo"]], + mayuanyi: ["male", "qun", 4, ["jibing", "wangjing", "moucuan"]], + simafu: ["male", "wei", 3, ["xunde", "chenjie"]], + fuqian: ["male", "shu", 4, ["jueyong", "poxiang"]], + xin_caozhen: ["male", "wei", 4, ["discretesidi"]], + xin_sunluban: ["female", "wu", 3, ["xinzenhui", "xinjiaojin"]], + qiaozhou: ["male", "shu", 3, ["zhiming", "xingbu"]], + xin_guyong: ["male", "wu", 3, ["xinshenxing", "xinbingyi"]], + re_zhonghui: ["male", "wei", 4, ["requanji", "zili"], ["clan:颍川钟氏"]], + xin_caifuren: ["female", "qun", 3, ["xinqieting", "xianzhou"]], + xin_zhoucang: ["male", "shu", 4, ["mobilezhongyong"]], + ol_yujin: ["male", "wei", 4, ["rejieyue"]], + zhouqun: ["male", "shu", 3, ["tiansuan"]], + re_zhurong: ["female", "shu", 4, ["juxiang", "relieren"]], + re_jiangwei: ["male", "shu", 4, ["retiaoxin", "zhiji"]], + nanhualaoxian: ["male", "qun", 3, ["yufeng", "tianshu"]], + re_handang: ["male", "wu", 4, ["regongji", "jiefan"]], + re_dengai: ["male", "wei", 4, ["retuntian", "zaoxian"]], + xin_fuhuanghou: ["female", "qun", 3, ["xinzhuikong", "xinqiuyuan"]], + xin_panzhangmazhong: ["male", "wu", 4, ["xinduodao", "xinanjian"]], + xin_guohuai: ["male", "wei", 4, ["mobilejingce"]], + gongsunkang: ["male", "qun", 4, ["juliao", "taomie"]], + xin_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "liyong"]], + xin_hansui: ["male", "qun", "4/4/1", ["xinniluan", "xiaoxi_hansui"]], + hucheer: ["male", "qun", 4, ["daoji"]], + re_lingtong: ["male", "wu", 4, ["rexuanfeng"]], + re_liubiao: ["male", "qun", 3, ["zishou", "rezongshi"]], + simashi: ["male", "wei", 4, ["baiyi", "jinglve", "shanli"]], + yanghuiyu: ["female", "wei", 3, ["hongyi", "requanfeng"]], + xin_zhuran: ["male", "wu", 4, ["mobiledanshou"]], + xin_gongsunzan: ["male", "qun", 4, ["xinyicong", "qiaomeng"]], + dingyuan: ["male", "qun", 4, ["beizhu"]], + xin_jianyong: ["male", "shu", 3, ["xinqiaoshui", "xinjyzongshi"]], + xin_caozhang: ["male", "wei", 4, ["rejiangchi"]], + xin_liaohua: ["male", "shu", 4, ["redangxian", "refuli"]], + furong: ["male", "shu", 4, ["xuewei", "liechi"]], + re_dongzhuo: ["male", "qun", 8, ["rejiuchi", "roulin", "benghuai", "baonue"], ["zhu"]], + re_xusheng: ["male", "wu", 4, ["repojun"]], + sp_sufei: ["male", "qun", 4, ["zhengjian", "gaoyuan"]], + yj_zhangliao: ["male", "qun", 4, ["weifeng"]], + yj_zhanghe: ["male", "qun", 4, ["xinzhilve"]], + yj_xuhuang: ["male", "qun", 4, ["xinxhzhiyan"]], + yj_ganning: ["male", "qun", 4, ["gnjinfan", "gnsheque"]], + re_sunjian: ["male", "wu", 4, ["gzyinghun", "repolu"]], + zhengxuan: ["male", "qun", 3, ["zhengjing"]], + dengzhi: ["male", "shu", 3, ["jimeng", "shuaiyan"]], + xin_chengpu: ["male", "wu", 4, ["relihuo", "chunlao"]], + yangyi: ["male", "shu", 3, ["duoduan", "gongsun"]], + dongcheng: ["male", "qun", 4, ["chengzhao"]], + re_pangtong: ["male", "shu", 3, ["xinlianhuan", "niepan"]], + re_guanqiujian: ["male", "wei", 4, ["rezhengrong", "rehongju"]], + chendeng: ["male", "qun", 3, ["zhouxuan", "fengji"]], + re_heqi: ["male", "wu", 4, ["reqizhou", "reshanxi"]], + yangbiao: ["male", "qun", 3, ["zhaohan", "rangjie", "yizheng"]], + re_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "rehuoji", "rekanpo"]], + xin_xiahoudun: ["male", "wei", 4, ["reganglie", "xinqingjian"]], + zhangyì: ["male", "shu", 4, ["rezhiyi"]], + jiakui: ["male", "wei", 3, ["zhongzuo", "wanlan"]], + re_jikang: ["male", "wei", 3, ["new_qingxian", "new_juexiang"]], + miheng: ["male", "qun", 3, ["kuangcai", "shejian"]], + taoqian: ["male", "qun", 3, ["zhaohuo", "yixiang", "yirang"]], + liuzan: ["male", "wu", 4, ["fenyin"]], + lingcao: ["male", "wu", 4, ["dujin"]], + sunru: ["female", "wu", 3, ["yingjian", "shixin"]], + lifeng: ["male", "shu", 3, ["tunchu", "shuliang"]], + zhuling: ["male", "wei", 4, ["xinzhanyi"]], + liuye: ["male", "wei", 3, ["polu", "choulve"]], + zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "xinfu_longyuan"]], + majun: ["male", "wei", 3, ["xinfu_jingxie1", "qiaosi"]], + simazhao: ["male", "wei", 3, ["xinfu_daigong", "xinfu_zhaoxin"]], + wangyuanji: ["female", "wei", 3, ["xinfu_qianchong", "xinfu_shangjian"]], + pangdegong: ["male", "qun", 3, ["xinfu_pingcai", "xinfu_pdgyingshi"]], + old_yuanshu: ["male", "qun", 4, ["xinyongsi", "yjixi"]], + + shenpei: ["male", "qun", "2/3", ["shouye", "liezhi"]], + re_wangyun: ["male", "qun", 3, ["relianji", "remoucheng"], ["clan:太原王氏"]], + + re_baosanniang: ["female", "shu", 3, ["meiyong", "rexushen", "rezhennan"]], + + hujinding: ["female", "shu", "2/6", ["renshi", "wuyuan", "huaizi"]], + + re_zhanggong: ["male", "wei", 3, ["reqianxin", "rezhenxing"]], + re_xugong: ["male", "qun", 3, ["rebiaozhao", "yechou"], ["doublegroup:wu:qun"]], + re_weiwenzhugezhi: ["male", "wu", 4, ["refuhai"]], + + xin_yuanshao: ["male", "qun", 4, ["reluanji", "xueyi"], ["zhu"]], + re_liushan: ["male", "shu", 3, ["xiangle", "refangquan", "ruoyu"], ["zhu"]], + re_sunben: ["male", "wu", 4, ["jiang", "rehunzi", "zhiba"], ["zhu"]], + + scs_zhangrang: ["male", "qun", "", ["scstaoluan"], ["unseen", "sex:male_castrated"]], + scs_zhaozhong: ["male", "qun", "", ["scschiyan"], ["unseen", "sex:male_castrated"]], + scs_sunzhang: ["male", "qun", "", ["scszimou"], ["unseen", "sex:male_castrated"]], + scs_bilan: ["male", "qun", "", ["scspicai"], ["unseen", "sex:male_castrated"]], + scs_xiayun: ["male", "qun", "", ["scsyaozhuo"], ["unseen", "sex:male_castrated"]], + scs_hankui: ["male", "qun", "", ["scsxiaolu"], ["unseen", "sex:male_castrated"]], + scs_lisong: ["male", "qun", "", ["scskuiji"], ["unseen", "sex:male_castrated"]], + scs_duangui: ["male", "qun", "", ["scschihe"], ["unseen", "sex:male_castrated"]], + scs_guosheng: ["male", "qun", "", ["scsniqu"], ["unseen", "sex:male_castrated"]], + scs_gaowang: ["male", "qun", "", ["scsmiaoyu"], ["unseen", "sex:male_castrated"]], +}; + +export default characters; diff --git a/character/mobile/characterFilter.js b/character/mobile/characterFilter.js new file mode 100644 index 000000000..d3db292b7 --- /dev/null +++ b/character/mobile/characterFilter.js @@ -0,0 +1,9 @@ +const characterFilters = { + simashi(mode) { + if (["boss", "chess", "tafang", "stone"].includes(mode)) return false; + if (mode == "versus") return _status.mode != "three"; + return true; + }, +}; + +export default characterFilters; diff --git a/character/mobile/characterReplace.js b/character/mobile/characterReplace.js new file mode 100644 index 000000000..3b0e878c4 --- /dev/null +++ b/character/mobile/characterReplace.js @@ -0,0 +1,22 @@ +const characterReplaces = { + caochun: ["caochun", "old_caochun"], + majun: ["majun", "old_majun"], + zhanggong: ["zhanggong", "re_zhanggong"], + baosanniang: ["xin_baosanniang", "re_baosanniang", "baosanniang"], + heqi: ["re_heqi", "heqi"], + weiwenzhugezhi: ["weiwenzhugezhi", "re_weiwenzhugezhi", "jsrg_weiwenzhugezhi"], + xugong: ["xugong", "re_xugong", "jsrg_xugong"], + liuzan: ["re_liuzan", "liuzan"], + sufei: ["yj_sufei", "sp_sufei", "xf_sufei"], + jiakui: ["jiakui", "old_jiakui"], + shenpei: ["shenpei", "sp_shenpei"], + sunru: ["dc_sunru", "sunru"], + liuye: ["dc_liuye", "liuye"], + zhaotongzhaoguang: ["dc_zhaotongzhaoguang", "zhaotongzhaoguang"], + yangbiao: ["yangbiao", "dc_yangbiao", "jsrg_yangbiao"], + qiaozhou: ["yj_qiaozhou", "qiaozhou"], + sunhanhua: ["dc_sunhanhua", "sunhanhua"], + zhoubuyi: ["zhoubuyi", "yj_zhoubuyi"], +}; + +export default characterReplaces; diff --git a/character/mobile/dynamicTranslate.js b/character/mobile/dynamicTranslate.js new file mode 100644 index 000000000..19e072036 --- /dev/null +++ b/character/mobile/dynamicTranslate.js @@ -0,0 +1,48 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + yizan_use(player) { + if (player.storage.yizan) return "你可以将一张基本牌当做任意基本牌使用或打出。"; + return "你可以将两张牌(其中至少一张为基本牌)当做任意基本牌使用或打出。"; + }, + miaojian(player) { + return ["出牌阶段限一次。你可将一张【杀】当做刺【杀】使用,或将一张锦囊牌当做【无中生有】使用。", "出牌阶段限一次。你可将一张基本牌当做刺【杀】使用,或将一张非基本牌当做【无中生有】使用。", "出牌阶段限一次。你可视为使用一张刺【杀】或【无中生有】。"][player.countMark("miaojian")]; + }, + shhlianhua(player) { + return ["当你成为【杀】的目标后,你摸一张牌。", "当你成为【杀】的目标后,你摸一张牌。然后你进行判定,若结果为黑桃,则此【杀】对你无效。", "当你成为【杀】的目标后,你摸一张牌。然后此【杀】的使用者选择一项:①弃置一张牌。②令此【杀】对你无效。"][player.countMark("shhlianhua")]; + }, + spshidi(player) { + if (player.countMark("spshidi") % 2 == 0) return '转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。'; + return '转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。'; + }, + mobilexingxue(player) { + return lib.translate[(player.storage.mobileyanzhu ? "mobilexingxuex" : "mobilexingxue") + "_info"]; + }, + shoufa(player) { + const zhoufa = player.storage.zhoulin_zhoufa; + const nodoudizhu = get.mode() == "doudizhu" ? "与你距离大于/不大于1的" : "与你距离大于/不大于2的"; + if (!zhoufa) return "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名" + nodoudizhu + "角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。"; + let str = "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名" + nodoudizhu + "角色,"; + str += ["令其受到1点无来源伤害", "你随机获得其一张牌", "你随机弃置其装备区的一张牌", "令其摸一张牌"][["豹", "鹰", "熊", "兔"].indexOf(zhoufa)]; + return str + "。"; + }, + mbxuetu(player) { + const xuetu = player.storage.mbxuetu, + status = player.countMark("mbxuetu_status"); + if (status === 0) { + if (!xuetu) return '转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。'; + return '转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。'; + } else if (status === 1) { + return lib.translate.mbxuetu_achieve_info; + } else { + if (!xuetu) return '转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。'; + return '转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。'; + } + }, + mbzuoyou(player) { + const mbzuoyou = player.storage.mbzuoyou; + if (mbzuoyou) return '转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。'; + return '转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。'; + }, +}; +export default dynamicTranslates; diff --git a/character/mobile/index.js b/character/mobile/index.js new file mode 100644 index 000000000..1f1e88303 --- /dev/null +++ b/character/mobile/index.js @@ -0,0 +1,34 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "mobile", + connect: true, + character: { ...characters }, + characterSort: { + mobile: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/mobile/intro.js b/character/mobile/intro.js new file mode 100644 index 000000000..95f177ca8 --- /dev/null +++ b/character/mobile/intro.js @@ -0,0 +1,52 @@ +const characterIntro = { + lizhaojiaobo: "李昭(?—约公元260年),三国时期曹魏官吏,官拜冗从仆射,为魏帝曹髦的亲信。
    焦伯,三国时期人物,魏帝曹髦护卫,官拜黄门从官。
    曹髦见自己权力威势日渐削弱,感到不胜忿恨,于公元260年(甘露五年)五月初六夜里,令李昭和焦伯等在陵云台布署甲士,出讨司马昭,但最终失败,曹髦为成济所弑,李昭和焦伯等应该也战死。在《三国演义》里,焦伯挺枪出战成济,亦被成济所杀。", + chengji: "成济(?~260年6月21日),三国时期曹魏官员。官至太子舍人。在魏帝曹髦起兵讨司马昭时,受到司马昭之心腹贾充指使,刺死曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。", + yangfeng: "杨奉(?-197年/198年),东汉末年将领。杨奉早年参加白波军起义,曾经帮助李傕对抗郭汜,后来背叛李傕。兴平二年,加号兴义将军,护送汉献帝刘协东归雒阳,颇有功勋,加号车骑将军,屯兵于梁县。建安元年,随着汉献帝迁都许县,失去权力,先后依附于袁术、吕布,劫掠徐州和扬州地区。建安二年(一说三年),带兵进犯刘备领地,被刘备诱杀。", + muludawang: "古典小说《三国演义》中的虚构人物,八纳洞主,孟获盟友。擅驱兽法,能行风雨,控制猛兽并指挥它们作战。在法术帮助下最初对蜀军取得一些胜利,但在诸葛亮的喷火木兽将他的动物吓跑后战败,最后死于乱军之中。", + laimin: "来敏(165年—261年),字敬达,义阳新野人,东汉太中大夫来歙之后,司空来艳之子,三国时期蜀汉官员。东汉末年,逢董卓之乱,来敏跟随姐夫黄琬到荆州避难,黄琬是刘璋祖母的侄子,来敏又与姐姐来氏入蜀,被刘璋引为宾客。来敏喜欢读书,尤其喜欢《左氏春秋》。刘备平定益州后,以来敏为典学校尉,后立太子,来敏为家令。刘禅继位后,任命来敏为虎贲中郎将,诸葛亮驻汉中,请来敏为军祭酒、辅军将军。却因其口出狂言而被罢官,诸葛亮死后,来敏历任大长秋、光禄大夫、执慎将军等职,期间多次因说错话而被免官,蜀汉景耀年间,来敏去世,时年九十七岁。", + shichangshi: "十常侍,指中国东汉(公元25年—220年)灵帝时期(168年-189年)操纵政权的十二个宦官:张让、赵忠、夏恽、郭胜、孙璋、毕岚、栗嵩、段珪、高望、张恭、韩悝、宋典(在小说《三国演义》里,十常侍指的是指张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人),他们都任职中常侍。玩弄小皇帝于股掌之中,以至灵帝称“张常侍是我父,赵常侍是我母”。十常侍自己横征暴敛,卖官鬻爵,他们的父兄子弟遍布天下,横行乡里,祸害百姓,无官敢管。人民不堪剥削、压迫,纷纷起来反抗。当时一些比较清醒的官吏,已看出宦官集团的黑暗腐败,导致大规模农民起义的形势。郎中张钧在给皇帝的奏章中明确指出,黄巾起义是外戚宦官专权逼出来的,他说:“张角所以能兴兵作乱,万人所以乐附之者,其源皆由十常侍多放父兄、子弟、婚宗、宾客典据州郡,辜确财利,侵略百姓,百姓之怨无所告诉,故谋议不轨,聚为‘盗贼’。”后被曹操、袁绍所歼。", + sunzhang: "孙璋(?-189年?)东汉末期汉灵帝的宦官,官居中常侍,为十常侍之一,在张让、赵忠之下位居第三。光熹元年(189年),张让、赵忠、段珪等诛杀何进,袁绍率军入宫,诛杀孙璋。", + bilan: "毕岚(?—189),东汉宦官,十常侍之一。十常侍朋比为奸,祸乱朝纲,制造出党锢之祸,后被袁绍诛杀。另外,毕岚曾制造翻车,用于取河水洒路。", + xiayun: "夏恽(?—189),东汉宦官,十常侍之一。后被袁绍、曹操诛于翠花楼前。", + hankui: "韩悝(?—189),东汉宦官,十常侍之一。后被袁绍所诛。", + lisong: "栗嵩,东汉宦官,十常侍之一,与张让等人均一同任职中常侍。", + duangui: "段珪(?—189),东汉宦官,十常侍之一。段珪与张让、赵忠等人朋比为奸,党同伐异,横征暴敛,卖官鬻爵,引起了以何进为首的外戚集团的不满。何进谋诛宦官,却不纳曹操、陈琳之谏,多结外镇军阀,翘首京师,与袁绍等谋诛宦竖。终于事泄,被宦官集团查知。张让、段珪等人先下手为强,斩杀何进于嘉德殿前,却也引起了京师的变乱。袁绍等人趁机带兵冲入皇宫,大肆诛杀太监。洛阳卫军变乱后,段珪与张让等人劫持少帝刘辩、陈留王刘协出逃,后被杀。", + guosheng: "郭胜,南阳宛(今河南南阳)人。汉灵帝时为中常侍,与张让、赵忠等狼狈为奸,并皆封侯。曾助同乡何进、何太后贵幸。后被袁绍等人率兵诛灭。", + gaowang: "高望(?~189年),京兆人,东汉宦官,十常侍之一,为小黄门兼任尚药监,颇得皇子刘辩的信任。中平六年(189年),张让等人杀害大将军何进,袁绍与王匡等人率兵杀入雒阳端门,在承明堂上斩杀中常侍高望。", + qianzhao: "牵招(?—231年),字子经,安平郡观津县(今河北省武邑县)人。三国时期曹魏名将。牵招早年师从乐隐,与刘备成为刎颈之交。投靠冀州牧袁绍,担任冀州从事,统领乌丸突骑。袁绍死后,跟随冀州刺史袁尚,受到并州牧高干加害,投奔丞相曹操,授军谋掾。从平乌丸,出任护乌丸校尉。举茂才出身,从平汉中,授中护军。拜平虏校尉,平定东莱郡叛乱。魏文帝曹丕时期,授护鲜卑校尉,驻扎昌平,迁右中郎将、雁门太守,遏制鲜卑轲比能发展壮大。魏明帝即位,赐爵关内侯,营救护乌丸校尉田豫。太和五年,去世。", + fuqian: "傅佥(?~263年),义阳(治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。", + wangjun: "王濬(207年~286年),字士治,小名阿童,弘农郡湖县(今河南省灵宝市阌乡)人。西晋时期名将。王濬出身世家,博学多闻,容颜英俊,多谋善战。举秀才出身,起家河东郡从事。泰始八年(272年),担任广汉太守,平定益州叛乱,迁益州刺史。利用长江上游地势之利,修造战船,组建强大的水军。上书晋武帝,促成晋灭吴之战。咸宁六年(280年),率兵顺流而下,熔毁横江铁链,攻克丹阳郡,率先攻取石头城,接受吴末帝孙皓投降,完成西晋统一大业。凭借功勋,拜辅国将军、步兵校尉,册封襄阳侯。为避猜忌,纵情享受,累迁特进、抚军大将军、开府仪同三司、散骑常侍、后军将军等。太康六年十二月(286年1月18日),王濬去世,享年八十岁,谥号为“武”,安葬于柏谷山。", + yangfu: "杨阜(172年—244年),字义山,汉天水冀县(今甘谷县东南)人。三国时期曹魏名臣。汉献帝建安初年,任凉州从事,旋拜安定长史;韦康任刺史后辟为别驾,改任州参军;后因讨马超有功,赐爵关内侯。曹操征汉中时,杨阜担任益州刺史,回来后又担任武都太守。魏明帝时,由将作大匠改少府。杨阜不但卓识远见,而且刚正不阿,敢于直言,对朝廷弊政多有诤谏,六次进言谏魏明帝应勤政爱民,魏明帝对他颇有敬畏之心。杨阜勤政廉洁,在宫内担任少府时,专管宝器、珍膳、衣物等,而他死后则家无馀财。皇帝让杨阜的孙子杨豹继任了少府之职。原甘谷县文昌宫西侧有杨氏家祠,内悬“两代尚书”匾额。", + ruanhui: "阮氏女,是指三国时期曹魏名士许允之妻阮氏,陈留尉氏人。阮氏女是中国古代四大丑女之一,貌丑而见识非凡。她出身士族之家,是卫尉阮共(字伯彦)之女、阮侃(字德如)之妹。嫁与许允后生有二子:许奇,官至司隶校尉;许猛,官至幽州刺史。", + peixiu: "裴秀(224年-271年4月3日),字季彦。河东郡闻喜县(今山西省闻喜县)人。[1]魏晋时期名臣、地图学家,东汉尚书令裴茂之孙、曹魏光禄大夫裴潜之子。出身河东裴氏,少年时便颇有名气,后被大将军曹爽辟为掾属,袭爵清阳亭侯,又迁黄门侍郎。高平陵之变后,因是曹爽的故吏而被罢免。此后历任廷尉正、安东将军及卫将军司马,参与谋划军国之政,参与平定诸葛诞叛乱。因功转任尚书,进封鲁阳乡侯。魏元帝继位后,进爵鲁阳县侯,任尚书仆射。咸熙元年(264年),受命负责修改官制,又提议恢复五等爵制。五等制恢复后,获封济川侯。他建议立司马炎为世子,司马炎继位晋王后,拜裴秀为尚书令、右光禄大夫。西晋建立后,加左光禄大夫,封钜鹿郡公。泰始三年(267年),升任司空。泰始七年(271年),裴秀因服食寒食散后饮冷酒而逝世,年四十八,谥号“元”。有文集三卷。裴秀作《禹贡地域图》,开创了中国古代地图绘制学。李约瑟称他为“中国科学制图学之父”,与古希腊著名地图学家托勒密齐名,是世界古代地图学史上东西辉映的两颗灿烂明星。为纪念这位中国地图科学创始人而设立的“裴秀奖”,每两年评选一次,是中国地图学界最高奖项。由于他的贡献突出,联合国天文组织将月球正面的一个环形山命名为“裴秀环形山”,", + liucheng: "游卡桌游的原创人物。设定为黄忠的妻子。", + jiangwan: "蒋琬(?-246年),字公琰。零陵郡湘乡县人。三国时期蜀汉政治家,与诸葛亮、董允、费祎合称“蜀汉四相”。蒋琬最初随刘备入蜀,为广都县长。因其不理政事,惹怒刘备,在诸葛亮的劝说下才免于一死。后重获启用,受到诸葛亮的悉心培养,累官丞相长史兼抚军将军。建兴十二年(234年),诸葛亮去世,蒋琬继其执政,拜尚书令,又加行都护、假节,领益州刺史,再迁大将军,录尚书事,封安阳亭侯。延熙元年(238年),受命开府,加大司马,总揽蜀汉军政。曾制定由水路进攻曹魏的计划,但未被采纳。延熙九年(246年),蒋琬病逝,谥号为恭。", + sunhanhua: "孙寒华,三国时女仙。梁·陶弘景《真诰》卷一三、五代·杜光庭《墉城集仙录》卷七:其父孙贲为孙权堂兄,寒华少时与杜契有私情,后从杜契受玄白之要,颜容日少。周旋吴越诸山十馀年,得道仙去。《鉴后集》卷四:一云即吴大帝孙权之女。于茅山修道,道成,冲虚而去,因号其山为华姥山。山在茅山崇禧观前。《神异典》卷二五九人于明代,误。", + yanpu: "阎圃,生卒年不详,是益州巴西安汉(今四川省南充市)人。张鲁割据巴、汉,就以阎圃为功曹。东汉末年人物,本为张鲁部下谋士,后随张鲁一同投降曹操,封平乐乡侯。", + mayuanyi: "马元义(?—184年6月7日),东汉末年黄巾之乱的组织者之一,是黄巾大方首领。光和六年(183年),马元义奉黄巾军首领张角之命,筹划起事的准备工作。马元义聚集荆州、扬州信徒数万人约定于邺城相会,并收买中常侍封谞、徐奉等为内应,准备于次年(甲子年)三月初五(戊申日)内外同时起事。由于张角弟子济南人唐周的告密,马元义于于中平元年(184年)正月在河内郡山阳县被捕,送往洛阳车裂,同时被杀的还有教众近千人。由于马元义的被杀,迫使张角提前于二月起兵发动叛乱。", + simafu: "司马孚(180年-272年4月3日),字叔达。河内郡温县(今河南温县)人。三国曹魏至西晋初年重臣,西晋宗室,东汉京兆尹司马防第三子,晋宣帝司马懿之弟。自曹操时代起,司马孚就任文学掾,而后历仕魏国五代皇帝,累迁至太傅。司马孚在“高平陵事变”之际,协助司马懿控制京师,诛杀曹爽一党。后又督军成功防御吴、蜀的进攻,为司马氏政权的稳固多有功劳。但他性格十分谨慎,自司马懿执掌大权起,便逐渐引退,更未直接参与司马氏废立魏帝的谋划。西晋代魏后,司马孚进拜太宰,封安平王。晋武帝司马炎对他十分尊宠,但他并不以此为荣,至死仍以魏臣自称。泰始八年二月壬辰日(272年4月3日),司马孚去世,年九十三。武帝为其举哀三日,葬礼规格比照东汉东平献王刘苍,赐谥献王。", + sunchen: "孙綝(231年-259年1月18日),字子通,吴郡富春(今浙江杭州市富阳区)人。三国时期吴国宗室、权臣,昭义中郎将孙静曾孙、定武中郎将孙暠之孙、安民都尉孙绰的儿子。门荫入仕,初任偏将军。太平元年(256年),升任侍中、武卫将军、都督中外诸军事。掌权以后,诛杀大司马滕胤、骠骑将军吕据等重臣,升任大将军,册封永宁县侯。嗜好杀戮,与皇帝孙亮的矛盾激化,最终废黜孙亮,拥立琅琊王孙休即位,累迁丞相、荆州牧。永安元年十二月(259年1月),在左将军张布的协助下,遭到皇帝孙休捕杀,时年二十八岁,削除宗籍,改姓故氏。", + qiaozhou: "谯周(201年-270年),字允南,巴西郡西充国县(今四川西充县槐树镇)人。三国时期蜀汉大臣、学者、儒学家、史学家。幼年丧父,少读典籍,精研六经,颇晓天文,成为蜀地大儒之一,门下有陈寿、罗宪等学生。诸葛亮担任益州牧时,授劝学从事。诸葛亮死后,不顾朝令,前往奔丧。后主刘禅册立太子时,授太子仆,迁太子家令、光禄大夫。反对姜维北伐,著《仇国论》,力陈北伐之失。炎兴元年(263年),邓艾攻打成都时期,力劝刘禅投降,“有全国之功”,投降魏国后,受封阳城亭侯,迁骑都尉。泰始六年(270年),授散骑常侍,同年去世,时年七十岁。", + gongsunkang: "公孙康(生卒年不详),辽东襄平(今辽宁辽阳)人。东汉末年辽东地区割据军阀,辽东太守公孙度长子(一作庶子)、车骑将军公孙恭之兄。公孙康在其父死后继任辽东太守。建安十二年(207年),擒斩图谋不轨的袁尚、袁熙兄弟,将其首级献予曹操,被拜为左将军,封襄平侯。建安十四年(209年),公孙康大破高句丽,陷其国都,并讨伐韩濊,设置带方郡。死后因二子年幼,由公孙恭继任。曹丕称帝后,被追赠为大司马。", + zhouqun: "周群(生卒年不详),字仲直,巴西阆中(今四川阆中)人。周群年少时随父周舒学习占验天算之术。后来刘璋聘请周群为师友从事,其预言大多得以应验。刘备割据益州,任命周群为儒林校尉。曾劝说刘备攻汉中必定不利,事后得到应验,被举荐为茂才。", + dongzhao: "董昭(156年-236年7月4日),字公仁,济阴定陶(今山东省菏泽市定陶区)人。东汉末年曹魏谋士、重臣、开国元勋。董昭年轻时被举为孝廉,后担任袁绍帐下参军。多有战功,但是袁绍听信谗言,董昭不得已离开袁绍投奔张杨。张杨率军迎接汉献帝时,董昭随行,并拜为议郎。后与曹操在洛阳相见,又建议曹操将汉献帝迎接到许昌。董昭自此成为曹操的谋士。建安年间(198年)历任河南尹、冀州牧、徐州牧、魏郡太守等职,多有功劳,深受曹操器重。曹操受封魏公、魏王的谋划都是出自董昭之手。曹丕继魏王位后,董昭任将作大匠。曹丕称帝后,升任大鸿胪。此后先后担任侍中、太常、光禄大夫、太仆等重要职位。魏明帝曹叡即位后转任卫尉。太和六年(232年)升任司徒。青龙四年(236年)卒,时年八十一,谥曰定。", + nanhualaoxian: "南华老仙,是古典小说《三国演义》中的虚拟人物。其原型来自道教典籍中对庄子的封号,又称“南华仙人”、“南华真人”等。在古典小说《三国演义》通行本的第一回中,描述了南华老仙将《太平要术》赠送给张角的情节。", + chenzhen: "陈震(?—公元235年),字孝起。荆州南阳郡(今河南南阳)人。三国时期蜀汉官员。刘备领荆州牧时,辟陈震为从事。后随刘备入蜀,为蜀郡北部都尉、汶山太守、犍为太守。建兴三年(225年),拜尚书,迁尚书令。建兴七年(229年),孙权称帝。蜀汉以陈震为卫尉,前往祝贺,与孙权开坛歃盟,交分天下。还蜀,封城阳亭侯。建兴十三年(235年),卒。", + hucheer: "胡车儿(生卒年不详),东汉末年武将,初从张绣,为其心腹猛将,勇冠三军,与贾诩交情甚佳。宛城大战后,张绣投降曹操,曹操爱胡车儿之骁勇,手以黄金与之。后因曹操私纳张绣亡叔张济的遗孀邹氏,张绣深感其辱,欲杀曹操,与贾诩商议后决心反曹。《三国演义》中,作者考虑到典韦的勇猛,便增加了令胡车儿盗走典韦的双戟的情节。最终典韦、曹昂(曹操长子)、曹安民(曹操侄子)皆死于此次战斗。野史说胡车儿跟随曹操征战,被赵云在长坂坡上红枪挑死。", + simashi: "司马师(208年~255年3月23日),字子元,河内温县(今河南省温县)人。三国时期曹魏权臣,西晋王朝的奠基人之一,晋宣帝司马懿与宣穆皇后张春华的长子,晋文帝司马昭的同母兄,晋武帝司马炎的伯父。司马师沉着坚强,雄才大略,早年与夏侯玄、何晏齐名。高平陵政变后,以功封长平乡侯,旋加卫将军。司马懿死后,以抚军大将军辅政,独揽朝廷大权,次年升为大将军。掌权后,他制定选拔官吏的法规,命百官推荐贤才,整顿纲纪,使其各有职掌,朝野肃然。司马师也有卓越的军事才能,曾用计于新城之战击溃吴国诸葛恪的大军。嘉平六年(254年),魏帝曹芳与中书令李丰等人密谋除司马师,事情泄露,司马师杀死参与者,迫郭太后废曹芳,改立高贵乡公曹髦为帝。次年,亲自率兵平定毌丘俭、文钦之乱。回师途中病死,时年四十八岁,谥号“忠武”。后被追尊为晋景王。西晋建立后,被追尊为景皇帝,庙号世宗。", + yanghuiyu: "羊徽瑜(214年-278年),泰山南城(今山东新泰)人,晋景帝司马师第三任妻子。羊徽瑜出身官宦世家泰山羊氏,她是南阳太守羊续的孙女,上党太守羊衜之女;其母为东汉名士左中郎将蔡邕之女、蔡文姬的姐妹。羊徽瑜聪慧贤德,嫁给司马师后未有子女。以司马师之弟司马昭的次子司马攸为继子。司马师死后,司马攸侍奉羊徽瑜非常孝顺。泰始元年(265年),司马昭长子司马炎受禅登基,建立西晋,追谥伯父司马师为景皇帝。泰始二年(266年),尊奉羊徽瑜为景皇后,因居弘训宫,故称弘训太后。咸宁四年(278年),羊徽瑜去世,时年六十五岁,谥号景献皇后,与司马师合葬峻平陵。", + dingyuan: "丁原(?—189年),字建阳,兖州泰山郡南城县(山东省平邑县郑城镇)人。东汉末年军阀,官拜执金吾、并州刺史。任并州刺史期间,他亲近、善待主簿吕布,又调遣部下张杨、张辽等名将到洛阳任职。汉灵帝驾崩后,带兵进入洛阳,担任执金吾,并与大将军何进谋划诛杀十常侍,但不久事情败露,何进被宦官杀死。在宦官被诛灭之后,丁原与军阀董卓在废帝问题上意见不合产生矛盾,于是董卓诱使吕布将其杀害,其势力亦被吞并。", + furong: "傅肜(?-222年),义阳(今湖北枣阳)人,三国时蜀汉将领。刘备攻伐吴国时,傅肜为别督。后刘备被陆逊击败,傅肜率部断后,奋战至死。死前怒斥道:“吴狗!何有汉将军降者!”", + zhengxuan: "郑玄(127年-200年),字康成。北海郡高密县(今山东省高密市)人。东汉末年儒家学者、经学大师。郑玄曾入太学攻《京氏易》、《公羊春秋》及《三统历》、《九章算术》,又从张恭祖学《古文尚书》、《周礼》和《左传》等,最后从马融学古文经。游学归里之后,复客耕东莱,聚徒授课,弟子达数千人,家贫好学,终为大儒。党锢之祸起,遭禁锢,杜门注疏,潜心著述。晚年守节不仕,却遭逼迫从军,最终病逝于元城,年七十四。郑玄治学以古文经学为主,兼采今文经学。他遍注儒家经典,以毕生精力整理古代文化遗产,使经学进入了一个“小统一时代”。著有《天文七政论》、《中侯》等书,共百万余言,世称“郑学”,为汉代经学的集大成者。唐贞观年间,列郑玄于二十二“先师”之列,配享孔庙。宋代时被追封为高密伯。后人建有郑公祠以纪念。", + dengzhi: "邓芝(178年-251年),字伯苗。义阳郡新野县(今河南新野)人。东汉名将邓禹之后,三国时期蜀汉重臣。邓芝早年曾被预言能位至大将,后被刘备任为郫令,升迁为广汉太守。因任官公廉且有治绩,被征入朝为尚书。刘备逝世后,奉命出使吴国,成功修复两国关系,并深为吴大帝孙权所赏识。建兴六年(228年),丞相诸葛亮策划北伐,命邓芝与大将赵云佯攻郿城,以吸引魏国曹真军主力。建兴十二年(234年),迁前军师、前将军,领兖州刺史,封阳武亭侯,不久督领江州。延熙六年(243年),迁车骑将军,后授假节。又率军平定涪陵叛乱。延熙十四年(251年),邓芝病逝。邓芝性格正直、简单,不刻意修饰情绪。他为将二十多年,赏罚明断,体恤士卒。身上的衣食取自官府,从未经营过私产,妻儿甚至还有忍饥挨饿之时,死时家中也没有多余财物。", + yangyi: "杨仪(?-235年),字威公,襄阳(今湖北襄阳)人,三国时期蜀汉官员。最初为荆州刺史傅群的主簿,后投奔关羽,任为功曹。关羽遣其至成都,大受刘备赞赏,擢为尚书。因与尚书令刘巴不和,调为弘农太守。建兴三年(225年)任丞相参军,此后一直跟随诸葛亮战斗。亮卒,他部署安全退军。诸葛亮在生前定蒋琬继己任,杨仪仅拜中军师。建兴十三年(235年),因多出怨言,被削职流放至汉嘉郡。但杨仪仍不自省,又上书诽谤,言辞激烈,最后下狱,自杀身亡。", + dongcheng: "董承(?~200年),字号不详,冀州河间人(今河北献县)人。东汉末年外戚大臣,汉灵帝母亲董太后侄子,汉献帝嫔妃董贵人之父。初从西凉军,为董卓女婿牛辅部曲。护卫汉献帝刘协从长安东归洛阳,拜为卫将军,受封列侯。建安四年(199年),拜车骑将军。自称领受汉献帝衣带诏,联合刘备、种辑、吴子兰、王子服、吴硕等人密谋诛杀曹操。五年正月,图谋泄露,董承诸人及董贵人全部遇害。", + chendeng: "陈登(163—201),字元龙,下邳淮浦(今江苏涟水西)人。东汉末年将领、官员。沛相陈珪之子。为人爽朗,性格沈静,智谋过人,少年时有扶世济民之志,并且博览群书,学识渊博。二十五岁时,举孝廉,任东阳县长。虽然年轻,但他能够体察民情,抚弱育孤,深得百姓敬重。后来,徐州牧陶谦提拔他为典农校尉,主管一州农业生产。他亲自考察徐州的土壤状况,开发水利,发展农田灌溉,使汉末迭遭破坏的徐州农业得到一定程度的恢复,百姓们安居乐业,“秔稻丰积”。建安初奉使赴许,向曹操献灭吕布之策,被授广陵太守。以灭吕布有功,加伏波将军。又迁东城太守。年三十九卒。其子陈肃,魏文帝时追陈登之功,为郎中。", + yangbiao: "杨彪(142年-225年),字文先。弘农郡华阴县(今陕西华阴)人。东汉末年名臣,太尉杨赐之子、名士杨修之父。杨彪少年时受家学熏陶,初举孝廉、茂才。其后征拜为议郎,参与续写《东观汉记》。任京兆尹时,揭发黄门令王甫的贪赃行为,使其被定罪诛杀。累任侍中、五官中郎将、卫尉等职。汉献帝时,遍历三公(司空、司徒、太尉)之职。权臣董卓意图迁都时,他据理力争。献帝东迁时,杨彪尽节护主。曹操挟献帝定都许县后,将杨彪下狱,获释后又任太常。他见汉室衰微,便诈称脚疾,不理世事。曹魏建立后,拒绝出任太尉,改光禄大夫,待以客礼。黄初六年(225年),杨彪去世,年八十四。其著作现仅存《答曹公书》一篇。", + zhangyì: "张翼(?-264年),字伯恭,益州犍为郡武阳县人。三国时期蜀汉将领。历任梓潼、广汉、蜀郡三郡太守,出任庲降都督,后随诸葛亮和姜维北伐,官至左车骑将军,领冀州刺史。初封关内侯,进爵都亭侯。蜀汉灭亡后,魏将钟会密谋造反,成都大乱,张翼亦为乱兵所杀。张翼是蜀汉第三任庲降都督,由于执法严厉,不得南夷欢心。在北伐上,张翼认为国小民疲,不应滥用武力,是蜀汉朝廷当时极少敢当朝和姜维争辩北伐问题的大臣。", + jiakui: "贾逵(174年—228年),本名贾衢,字梁道,河东襄陵人(今山西临汾县)。汉末三国时期魏国名臣,西晋开国功臣贾充父亲。初为并州郡吏,迁渑池县令,拜弘农太守,历仕曹操、曹丕、曹叡三世,是曹魏政权中具有军政才干的人物,终其一生为魏国统一事业作出卓越贡献。担任豫州刺史期间,兴修水利,凿通运河二百余里,时称“贾侯渠”,便利民生。随同曹丕伐吴,进封阳里亭侯,加号建威将军。石亭之战,率军救出曹休。太和二年,去世,赠本官,谥号为肃,《唐会要》将其尊为魏晋八君子之一。", + shenpei: "审配(?-204年),字正南,魏郡阴安(今河北清丰北)人。为人正直, 袁绍领冀州,审配被委以腹心之任,并总幕府。河北平定,袁绍以审配、逢纪统军事,审配恃其强盛,力主与曹操决战。曾率领弓弩手大破曹军于官渡。官渡战败,审配二子被俘,反因此受谮见疑,幸得逢纪力保。袁绍病死,审配等矫诏立袁尚为嗣,导致兄弟相争,被曹操各个击破。曹操围邺,审配死守数月,终城破被擒,拒不投降,慷慨受死。", + hujinding: "胡金定,女,传说中关羽之妻。关索之母,配偶关羽,出处《花关索传》和元代《三国志评话》民间传说人物。", +}; + +export default characterIntro; diff --git a/character/mobile/perfectPairs.js b/character/mobile/perfectPairs.js new file mode 100644 index 000000000..a1bb2abd2 --- /dev/null +++ b/character/mobile/perfectPairs.js @@ -0,0 +1,4 @@ +export default { + simazhao: ["simayi", "jin_simayi", "jin_wangyuanji"], + xugong: ["yanbaihu"], +}; diff --git a/character/mobile/pinyin.js b/character/mobile/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/mobile/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/mobile/skill.js b/character/mobile/skill.js new file mode 100644 index 000000000..bae758c35 --- /dev/null +++ b/character/mobile/skill.js @@ -0,0 +1,17195 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //李昭焦伯 + mbzuoyou: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuanhuanji: true, + filterTarget(card, player, target) { + if (player.storage.mbzuoyou) return target.countCards("h") >= 2; + return true; + }, + async content(event, trigger, player) { + const storage = player.storage.mbzuoyou, + target = event.target; + if (event.name === "mbzuoyou") player.changeZhuanhuanji("mbzuoyou"); + if (!storage) { + await target.draw(2); + await target.chooseToDiscard(1, true, "h"); + } else { + await target.chooseToDiscard(target === player ? "佐佑" : `${get.translation(player)}对你发动了【佐佑】`, "请弃置两张手牌,然后获得1点护甲", 2, true); + await target.changeHujia(1, null, true); + } + }, + mark: true, + marktext: "☯", + intro: { + content(storage, player) { + if (!storage) return "转换技。出牌阶段限一次,你可以令一名角色摸两张牌,然后其弃置一张手牌。"; + return "转换技。出牌阶段限一次,你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。"; + }, + }, + ai: { + order(item, player) { + if ( + player.storage.mbzuoyou && + game.hasPlayer(current => { + return current !== player && get.effect(current, "mbzuoyou", player, player) > 0; + }) + ) + return get.order({ name: "zengbin" }) + 0.1; + return 2; + }, + result: { + target(player, target) { + let eff = 0; + if (player.storage.mbzuoyou) eff = target.hujia < 5 ? 1 : 0; + else eff = 1; + if (target === player && player.hasSkill("mbshishou")) eff /= 10; + return eff; + }, + }, + }, + }, + mbshishou: { + audio: 2, + trigger: { player: "useSkillAfter" }, + filter(event, player) { + return event.skill === "mbzuoyou" && !event.targets.includes(player); + }, + forced: true, + async content(event, trigger, player) { + await lib.skill.mbzuoyou.content( + { + target: player, + }, + {}, + player + ); + }, + ai: { + combo: "mbzuoyou", + }, + }, + //成济 + mbkuangli: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(current => current !== player); + }, + forced: true, + group: ["mbkuangli_target", "mbkuangli_remove"], + async content(event, trigger, player) { + let targets = game.filterPlayer(current => current !== player).randomSort(); + targets = targets.slice(0, Math.ceil(Math.random() * targets.length)); + targets.sortBySeat(); + player.line(targets, "thunder"); + targets.forEach(current => { + current.addSkill("mbkuangli_mark"); + }); + await game.asyncDelayx(); + }, + subSkill: { + target: { + audio: "mbkuangli", + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return event.target.hasSkill("mbkuangli_mark") && [player, event.target].some(current => current.countCards("he")); + }, + forced: true, + logTarget: "target", + usable: 2, + async content(event, trigger, player) { + const target = trigger.target; + const playerCards = player.getCards("he", card => { + return lib.filter.cardDiscardable(card, player, "mbkuangli"); + }); + if (playerCards.length > 0) await player.discard(playerCards.randomGet()); + const targetCards = target.getCards("he", card => { + return lib.filter.cardDiscardable(card, target, "mbkuangli"); + }); + if (targetCards.length > 0) await target.discard(targetCards.randomGet()); + await game.asyncDelayx(); + await player.draw(); + await game.asyncDelayx(); + }, + ai: { + effect: { + player(card, player, target, current) { + if (!target) return; + const counttrigger = player.storage.counttrigger; + if (counttrigger && counttrigger.mbkuangli_target && counttrigger.mbkuangli_target >= lib.skill.mbkuangli_target.usable) return; + if (target.hasSkill("mbkuangli_mark")) { + if (get.attitude(player, target) > 0) return 0.75; + return 1.25; + } + }, + }, + }, + }, + remove: { + audio: "mbkuangli", + trigger: { player: "phaseEnd" }, + filter(event, player) { + return game.hasPlayer(current => current.hasSkill("mbkuangli_mark")); + }, + forced: true, + async content(event, trigger, player) { + game.countPlayer(current => { + if (current.hasSkill("mbkuangli_mark")) { + player.line(current); + current.removeSkill("mbkuangli_mark"); + } + }); + }, + }, + mark: { + mark: true, + marktext: "戾", + charlotte: true, + intro: { + name: "狂戾", + name2: "狂戾", + content: "已拥有“狂戾”标记", + }, + }, + }, + }, + mbxiongsi: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countCards("h") >= 3; + }, + limited: true, + skillAnimation: true, + animationColor: "fire", + filterCard: true, + selectCard: [-1, -2], + async content(event, trigger, player) { + player.awakenSkill("mbxiongsi"); + const targets = game.filterPlayer(current => current !== player); + for (const target of targets) { + player.line(target, "thunder"); + await target.loseHp(); + } + }, + ai: { + order(item, player) { + if (get.effect(player, "mbxiongsi", player) <= 0) return 1; + if ( + player.countCards("h") > 3 && + player.countCards("h", card => { + return player.hasValueTarget(card); + }) > 0 + ) + return 0.1; + return 8; + }, + result: { + player(player) { + let eff = 0; + game.countPlayer(current => { + let effx = get.effect(current, { name: "losehp" }, player, player); + if (get.attitude(player, current) < -6 && current.getHp() <= 1) effx *= 1.3; + eff += effx; + }); + eff *= player.getHp() + player.countCards("hs", card => player.canSaveCard(card, player)) <= 2 ? 1.5 : 0.35; + eff -= player + .getCards("h") + .map(card => { + if (lib.filter.cardDiscardable(card, player, "mbxiongsi")) return get.value(card); + return 0; + }) + .reduce((p, c) => p + c, 0); + if (eff > 0) return 2; + return -1; + }, + }, + }, + }, + //SP母兵脸 + mbcuizhen: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + game.hasPlayer(current => { + return current !== player && current.hasEnabledSlot(1); + }) && + get.mode() == "identity" + ); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("mbcuizhen"), "废除至多两名其他角色的武器栏", [1, 2], (card, player, target) => { + return target !== player && target.hasEnabledSlot(1); + }) + .set("ai", target => { + return -get.attitude(get.player(), target); + }) + .forResult(); + }, + group: ["mbcuizhen_inphase", "mbcuizhen_draw"], + async content(event, trigger, player) { + const targets = event.targets.slice().sortBySeat(); + for (const target of targets) { + await target.disableEquip(1); + } + await game.asyncDelay(); + }, + subSkill: { + inphase: { + audio: "mbcuizhen", + trigger: { + player: "useCardToPlayered", + }, + filter(event, player) { + if (!player.isPhaseUsing()) return false; + if (!get.tag(event.card, "damage")) return false; + const target = event.target; + return target !== player && target.countCards("h") >= target.getHp() && target.hasEnabledSlot(1); + }, + prompt2: "废除其的武器栏", + logTarget: "target", + check(event, player) { + return get.attitude(player, event.target) <= 0; + }, + async content(event, trigger, player) { + await trigger.target.disableEquip(1); + await game.asyncDelayx(); + }, + }, + draw: { + audio: "mbcuizhen", + trigger: { player: "phaseDrawBegin2" }, + forced: true, + locked: false, + filter(event, player) { + return ( + !event.numFixed && + game.hasPlayer(current => { + return current.hasDisabledSlot(1); + }) + ); + }, + async content(event, trigger, player) { + trigger.num += Math.min( + 2, + game.countPlayer(current => { + return current.countDisabledSlot(1); + }) + ); + }, + }, + }, + }, + mbkuili: { + audio: 2, + trigger: { + player: "damageEnd", + }, + filter(event, player) { + return player.countCards("h") > 0 || (event.source && event.source.isIn() && event.source.hasDisabledSlot(1)); + }, + forced: true, + async content(event, trigger, player) { + if (player.countCards("h") > 0) { + await player.chooseToDiscard(`溃离:请弃置${get.cnNumber(trigger.num)}张手牌`, trigger.num, true); + } + const source = trigger.source; + if (source && source.isIn() && source.hasDisabledSlot(1)) { + player.line(source, "green"); + await source.enableEquip(1, player); + } + }, + ai: { + neg: true, + }, + }, + //曹髦 史?! + mbqianlong: { + audio: 6, + trigger: { + player: ["mbqianlong_beginAfter", "mbqianlong_addAfter", "mbweitongAfter"], + }, + filter(event, player) { + let skills = []; + if (player.additionalSkills && player.additionalSkills.mbqianlong) skills.addArray(player.additionalSkills.mbqianlong); + return player.countMark("mbqianlong") >= 25 * skills.length; + }, + forced: true, + locked: false, + beginMarkCount: 20, + maxMarkCount: 100, + derivation: ["mbcmqingzheng", "mbcmjiushi", "mbcmfangzhu", "mbjuejin"], + addMark(player, num) { + num = Math.min(num, lib.skill.mbqianlong.maxMarkCount - player.countMark("mbqianlong")); + player.addMark("mbqianlong", num); + }, + group: ["mbqianlong_begin", "mbqianlong_add"], + async content(event, trigger, player) { + player.addAdditionalSkill("mbqianlong", lib.skill.mbqianlong.derivation.slice(0, Math.floor(player.countMark("mbqianlong") / 25))); + }, + marktext: "道", + intro: { + name: "道心(潜龙)", + name2: "道心", + content: "当前道心数为#", + }, + subSkill: { + begin: { + audio: "mbqianlong", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + locked: false, + async content(event, trigger, player) { + lib.skill.mbqianlong.addMark(player, lib.skill.mbqianlong.beginMarkCount); + }, + }, + add: { + audio: "mbqianlong", + trigger: { + player: ["gainAfter", "damageEnd"], + source: "damageSource", + global: "loseAsyncAfter", + }, + filter(event, player) { + if (player.countMark("mbqianlong") >= lib.skill.mbqianlong.maxMarkCount) return false; + if (event.name === "damage") return event.num > 0; + return event.getg(player).length > 0; + }, + getIndex(event, player, triggername) { + if (event.name === "damage") return event.num; + return 1; + }, + forced: true, + locked: false, + async content(event, trigger, player) { + let toAdd = 5 * (1 + (trigger.name === "damage") + (event.triggername === "damageSource")); + lib.skill.mbqianlong.addMark(player, toAdd); + }, + }, + }, + }, + mbweitong: { + audio: 1, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + game.hasPlayer(current => { + return current !== player && current.group === "wei" && player.hasZhuSkill("mbweitong", current); + }) + ); + }, + zhuSkill: true, + forced: true, + locked: false, + async content(event, trigger, player) { + lib.skill.mbqianlong.addMark( + player, + 20 * + game.countPlayer(current => { + return current !== player && current.group === "wei" && player.hasZhuSkill("mbweitong", current); + }) + ); + }, + ai: { + combo: "mbqianlong", + }, + }, + mbcmqingzheng: { + audio: "sbqingzheng", + audioname: ["mb_caomao"], + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return player.countCards("h") > 0; + }, + direct: true, + content() { + "step 0"; + var num = 2; + var prompt = "###" + get.prompt("sbqingzheng") + "###弃置" + get.cnNumber(num) + "种花色的所有牌"; + var next = player.chooseButton([prompt, [lib.suit.map(i => ["", "", "lukai_" + i]), "vcard"]], num); + next.set("filterButton", button => { + var player = _status.event.player; + var cards = player.getCards("h", { suit: button.link[2].slice(6) }); + return cards.length > 0 && cards.filter(card => lib.filter.cardDiscardable(card, player, "sbqingzheng")).length == cards.length; + }); + next.set("ai", button => { + var player = _status.event.player; + return ( + 15 - + player + .getCards("h", { suit: button.link[2].slice(6) }) + .map(i => get.value(i)) + .reduce((p, c) => p + c, 0) + ); + }); + next.set("custom", { + replace: { + button: function (button) { + if (!_status.event.isMine()) return; + if (button.classList.contains("selectable") == false) return; + var cards = _status.event.player.getCards("h", { + suit: button.link[2].slice(6), + }); + if (cards.length) { + var chosen = cards.filter(i => ui.selected.cards.includes(i)).length == cards.length; + if (chosen) { + ui.selected.cards.removeArray(cards); + cards.forEach(card => { + card.classList.remove("selected"); + card.updateTransform(false); + }); + } else { + ui.selected.cards.addArray(cards); + cards.forEach(card => { + card.classList.add("selected"); + card.updateTransform(true); + }); + } + } + if (button.classList.contains("selected")) { + ui.selected.buttons.remove(button); + button.classList.remove("selected"); + if (_status.multitarget || _status.event.complexSelect) { + game.uncheck(); + game.check(); + } + } else { + button.classList.add("selected"); + ui.selected.buttons.add(button); + } + var custom = _status.event.custom; + if (custom && custom.add && custom.add.button) { + custom.add.button(); + } + game.check(); + }, + }, + add: next.custom.add, + }); + "step 1"; + if (result.bool) { + var cards = result.cards; + if (!cards.length) { + var suits = result.links.map(i => i[2].slice(6)); + cards = player.getCards("h", card => suits.includes(get.suit(card, player))); + } + event.cards = cards; + if (!cards.length) event.finish(); + else + player + .chooseTarget("清正:观看一名其他角色的手牌并弃置其中一种花色的所有牌", (card, player, target) => { + return target != player && target.countCards("h"); + }) + .set("ai", target => { + var player = _status.event.player, + att = get.attitude(player, target); + if (att >= 0) return 0; + return 1 - att / 2 + Math.sqrt(target.countCards("h")); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("sbqingzheng", target); + player.discard(cards); + var list = []; + var dialog = ["清正:弃置" + get.translation(target) + "一种花色的所有牌"]; + for (var suit of lib.suit.concat("none")) { + if (target.countCards("h", { suit: suit })) { + dialog.push('
    ' + get.translation(suit + "2") + "牌
    "); + dialog.push(target.getCards("h", { suit: suit })); + list.push(suit); + } + } + if (list.length) { + player + .chooseControl(list) + .set("dialog", dialog) + .set("ai", () => { + return _status.event.control; + }) + .set( + "control", + (() => { + var getv = cards => cards.map(i => get.value(i)).reduce((p, c) => p + c, 0); + return list.sort((a, b) => { + return getv(target.getCards("h", { suit: b })) - getv(target.getCards("h", { suit: a })); + })[0]; + })() + ); + } + } else event.finish(); + "step 3"; + var cards2 = target.getCards("h", { suit: result.control }); + event.cards2 = cards2; + target.discard(cards2, "notBySelf").set("discarder", player); + "step 4"; + if (event.cards2.length < cards.length) target.damage(); + }, + }, + mbcmjiushi: { + audio: "rejiushi", + inherit: "rejiushi", + group: ["rejiushi1", "mbcmjiushi_check", "mbcmjiushi_turnback", "mbcmjiushi_gain"], + subSkill: { + check: { + trigger: { player: "damageBegin3" }, + silent: true, + firstDo: true, + filter(event, player) { + return player.isTurnedOver(); + }, + content() { + trigger.mbcmjiushi = true; + }, + }, + turnback: { + audio: "rejiushi", + audioname: ["mb_caomao"], + trigger: { player: "damageEnd" }, + check(event, player) { + return player.isTurnedOver(); + }, + filter(event, player) { + return event.mbcmjiushi; + }, + prompt(event, player) { + return "是否发动【酒诗】,将武将牌翻面?"; + }, + content() { + delete trigger.mbcmjiushi; + player.turnOver(); + }, + }, + gain: { + audio: "rejiushi", + audioname: ["mb_caomao"], + trigger: { player: "turnOverAfter" }, + frequent: true, + prompt: "是否发动【酒诗】,获得牌堆中的一张锦囊牌?", + content() { + var card = get.cardPile2(function (card) { + return get.type2(card) == "trick"; + }); + if (card) player.gain(card, "gain2"); + }, + }, + }, + }, + mbcmfangzhu: { + audio: "sbfangzhu", + audioname: ["mb_caomao"], + inherit: "sbfangzhu", + filter(event, player) { + return game.hasPlayer(current => current !== player); + }, + usable: 1, + chooseButton: { + dialog() { + const dialog = ui.create.dialog("放逐:令一名其他角色...", "hidden"); + dialog.add([ + [ + [1, "不能使用手牌中的非锦囊牌直到其回合结束"], + [2, "非Charlotte技能失效直到其回合结束"], + ], + "textbutton", + ]); + return dialog; + }, + check(button) { + const player = get.player(); + if (button.link === 2) { + if ( + game.hasPlayer(target => { + if (target.hasSkill("mbcmfangzhu_ban") || target.hasSkill("fengyin") || target.hasSkill("baiban")) return false; + return ( + get.attitude(player, target) < 0 && + ["name", "name1", "name2"] + .map((sum, name) => { + if (target[name] && (name != "name1" || target.name != target.name1)) { + if (get.character(target[name])) return get.rank(target[name], true); + } + return 0; + }) + .reduce((p, c) => { + return p + c; + }, 0) > 5 + ); + }) + ) + return 6; + } + return button.link === 1 ? 1 : 0; + }, + backup(links, player) { + return { + num: links[0], + audio: "sbfangzhu", + filterCard: () => false, + selectCard: -1, + filterTarget(card, player, target) { + if (target == player) return false; + const num = lib.skill.mbcmfangzhu_backup.num, + storage = target.getStorage("mbcmfangzhu_ban"); + return num != 1 || !storage.length; + }, + async content(event, trigger, player) { + const target = event.target; + const num = lib.skill.mbcmfangzhu_backup.num; + switch (num) { + case 1: + target.addTempSkill("mbcmfangzhu_ban", { player: "phaseEnd" }); + target.markAuto("mbcmfangzhu_ban", ["trick"]); + break; + case 2: + target.addTempSkill("mbcmfangzhu_baiban", { player: "phaseEnd" }); + break; + } + }, + ai: { + result: { + target(player, target) { + switch (lib.skill.mbcmfangzhu_backup.num) { + case 1: + return -target.countCards("h", card => get.type(card) != "trick") - 1; + case 2: + return -target.getSkills(null, null, false).reduce((sum, skill) => { + return sum + Math.max(get.skillRank(skill, "out"), get.skillRank(skill, "in")); + }, 0); + } + }, + }, + }, + }; + }, + prompt(links, player) { + const str = "###放逐###"; + switch (links[0]) { + case 1: + return str + "令一名其他角色不能使用手牌中的非锦囊牌直到其回合结束"; + case 2: + return str + "令一名其他角色的非Charlotte技能失效直到其回合结束"; + } + }, + }, + ai: { + order: 10, + result: { + player(player) { + return game.hasPlayer(current => get.attitude(player, current) < 0) ? 1 : 0; + }, + }, + }, + subSkill: { + backup: {}, + baiban: { + inherit: "baiban", + marktext: "逐", + }, + ban: { + charlotte: true, + onremove: true, + mark: true, + marktext: "禁", + intro: { + markcount: () => 0, + content(storage) { + if (storage.length > 1) return "不能使用手牌"; + return "不能使用手牌中的非" + get.translation(storage[0]) + "牌"; + }, + }, + mod: { + cardEnabled(card, player) { + const storage = player.getStorage("mbcmfangzhu_ban"); + const hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + if (cards.containsSome(...hs) && !storage.includes(get.type2(card))) return false; + }, + cardSavable(card, player) { + const storage = player.getStorage("mbcmfangzhu_ban"); + const hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + if (cards.containsSome(...hs) && !storage.includes(get.type2(card))) return false; + }, + }, + }, + }, + }, + mbjuejin: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filterCard: () => false, + selectCard: [-1, -2], + filterTarget: true, + selectTarget: -1, + multiline: true, + async contentBefore(event, trigger, player) { + player.awakenSkill("mbjuejin"); + }, + async content(event, trigger, player) { + const target = event.target; + const delt = target.getHp(true) - 1, + num = Math.abs(delt); + await target[delt > 0 ? "loseHp" : "recover"](num); + if (num > 0) await target.changeHujia(num, null, true); + }, + async contentAfter(event, trigger, player) { + game.addGlobalSkill("mbjuejin_xiangsicunwei"); + player.$fullscreenpop("向死存魏!", "thunder"); + }, + ai: { + order: 0.1, + result: { + player(player) { + let eff = 1; + game.countPlayer(current => { + const att = get.attitude(player, current), + num = Math.abs(current.getHp(true) - 1); + const delt = Math.max(0, num + current.hujia - 5); + eff -= att * delt; + }); + return eff > 0 ? 1 : 0; + }, + }, + }, + subSkill: { + xiangsicunwei: { + trigger: { + global: ["loseAfter", "equipAfter", "loseAsyncAfter", "cardsDiscardAfter"], + }, + forced: true, + silent: true, + firstDo: true, + filter(event, player) { + const nameList = ["shan", "tao", "jiu"]; + return event.getd().some(card => { + return nameList.includes(get.name(card, false)) && get.position(card, true) === "d"; + }); + }, + async content(event, trigger, player) { + const nameList = ["shan", "tao", "jiu"]; + const cards = trigger.getd().filter(card => { + return nameList.includes(get.name(card, false)) && get.position(card, true) === "d"; + }); + await game.cardsGotoSpecial(cards); + game.log(cards, "被移出了游戏"); + }, + }, + }, + }, + //杨奉 + mbxuetu: { + audio: 2, + audioname: ["re_yangfeng"], + enable: "phaseUse", + usable: 2, + filter(event, player) { + if (player.countMark("mbxuetu_status") !== 1 && player.getStat("skill").mbxuetu) return false; + if (!player.storage.mbxuetu) return player.countCards("he"); + return true; + }, + zhuanhuanji2(skill, player) { + return player.countMark("mbxuetu_status") !== 1; + }, + filterCard(card, player) { + if (player.countMark("mbxuetu_status") > 1) return false; + if (player.countMark("mbxuetu_status") === 1) { + if (player.getStorage("mbxuetu_used").includes(false)) return false; + return true; + } + return !player.storage.mbxuetu; + }, + selectCard() { + const player = get.player(); + if (player.countMark("mbxuetu_status") > 1) return -1; + if (player.countMark("mbxuetu_status") === 1) { + if (player.getStorage("mbxuetu_used").includes(false)) return -1; + if (player.getStorage("mbxuetu_used").includes(true)) return 1; + return [0, 1]; + } + return !player.storage.mbxuetu ? 1 : -1; + }, + check(card) { + return 6 - get.value(card); + }, + prompt() { + const player = get.player(), + storage = player.storage.mbxuetu, + status = player.countMark("mbxuetu_status"); + if (status === 0) { + if (storage) return "转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。"; + return "转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。"; + } else if (status === 1) { + return "出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。"; + } else { + if (storage) return "转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。"; + return "转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。"; + } + }, + position: "he", + filterTarget: true, + onremove: ["mbxuetu", "mbxuetu_status"], + derivation: ["mbxuetu_achieve", "mbxuetu_fail"], + async content(event, trigger, player) { + const target = event.targets[0], + storage = Boolean(player.storage.mbxuetu); + const status = player.countMark("mbxuetu_status"); + player.changeZhuanhuanji("mbxuetu"); + if (status < 2) { + if (!player.storage.mbxuetu_used) { + player.when(["phaseUseAfter", "mbweiming_achieveAfter"]).then(() => { + delete player.storage.mbxuetu_used; + }); + } + player.markAuto("mbxuetu_used", [status === 0 ? storage : !event.cards.length]); + if ((status === 0 && !storage) || (status === 1 && event.cards.length)) { + await target.recover(); + } else { + await player.loseHp(); + await target.draw(2); + } + } else { + if (!storage) { + await player.recover(); + await target.chooseToDiscard(2, true, "he"); + } else { + await player.draw(); + await target.damage(); + } + } + }, + mark: true, + marktext: "☯", + intro: { + content: (storage, player) => { + if (!player.countMark("mbxuetu_status")) { + if (storage) return "转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。"; + return "转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。"; + } else { + if (storage) return "转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。"; + return "转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。"; + } + }, + }, + ai: { + order(item, player) { + const status = player.countMark("mbxuetu_status"); + if (status > 1) return Math.max(get.order({ name: "guohe" }), get.order({ name: "chuqibuyi" })); + if (status === 1 || player.storage.mbxuetu) return 9; + return 2; + }, + result: { + target(player, target) { + const status = player.countMark("mbxuetu_status"); + if (status > 1) { + if (player.storage.mbxuetu) return -get.damageEffect(target, player, player) / 10; + return -2; + } + if ((status === 0 && player.storage.mbxuetu) || (status === 1 && !ui.selected.cards.length)) return 2; + const eff = get.recoverEffect(target, player, player); + return eff > 0 ? 2 : eff < 0 ? -get.sgnAttitude(player, target) : 0; + }, + player(player, target) { + const status = player.countMark("mbxuetu_status"); + if (status > 1) { + if (player.storage.mbxuetu) return 1; + return get.recoverEffect(player, player) / 6; + } + if (status === 1 || !player.storage.mbxuetu) return -0.5; + const eff = get.effect(player, { name: "losehp" }, player, player); + if (eff >= 0) return Math.min(1, eff / 2); + const hp = + player.getHp() + + player.countCards("hes", card => { + return player.canSaveCard(card, player); + }); + return -1.5 * Math.max(0, 3 - hp); + }, + }, + }, + }, + mbweiming: { + audio: 3, + dutySkill: true, + locked: true, + group: ["mbweiming_achieve", "mbweiming_fail", "mbweiming_effect"], + intro: { + content: "已记录$", + }, + subSkill: { + effect: { + audio: "mbweiming1.mp3", + trigger: { + player: "phaseUseBegin", + }, + filter(event, player) { + return game.hasPlayer(current => { + return !player.getStorage("mbweiming").includes(current); + }); + }, + forced: true, + direct: true, + async content(event, trigger, player) { + const targets = await player + .chooseTarget("威命:记录一名未记录过的角色", "当你杀死没有被记录过的角色后,则〖威命〗使命成功;如果在你杀死这些角色中的一名之前,有被记录过的角色死亡,则你〖威命〗使命失败。", true) + .set("filterTarget", (card, player, target) => { + return !player.getStorage("mbweiming").includes(target); + }) + .set("ai", target => { + if (target === player) return 1; + return 1 + (Math.sqrt(Math.abs(get.attitude(player, target))) * Math.abs(get.threaten(target))) / Math.sqrt(target.getHp() + 1) / Math.sqrt(target.countCards("hes") + 1); + }) + .forResultTargets(); + if (targets && targets.length > 0) { + const target = targets[0]; + player.logSkill("mbweiming_effect", target); + player.markAuto("mbweiming", target); + } + }, + }, + achieve: { + audio: "mbweiming2.mp3", + trigger: { + source: "dieAfter", + }, + filter(event, player) { + return !player.getStorage("mbweiming").includes(event.player); + }, + dutySkill: true, + forced: true, + skillAnimation: true, + animationColor: "fire", + async content(event, trigger, player) { + game.log(player, "成功完成使命"); + player.awakenSkill("mbweiming"); + player.storage.mbxuetu_status = 1; + player.unmarkSkill("mbxuetu"); + await game.asyncDelayx(); + }, + }, + fail: { + audio: "mbweiming3.mp3", + trigger: { + global: "dieAfter", + }, + filter(event, player) { + return player.getStorage("mbweiming").includes(event.player); + }, + dutySkill: true, + forced: true, + async content(event, trigger, player) { + game.log(player, "使命失败"); + player.awakenSkill("mbweiming"); + player.storage.mbxuetu_status = 2; + game.broadcastAll(player => { + player.tempname.add("re_yangfeng"); + }, player); + await game.asyncDelayx(); + }, + }, + }, + ai: { + combo: "mbxuetu", + }, + }, + //霍骏 + sidai: { + audio: "twsidai", + enable: "phaseUse", + usable: 1, + locked: false, + limited: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + var cards = player.getCards("h", { type: "basic" }); + if (!cards.length) return false; + for (var i of cards) { + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; + } + return event.filterCard(get.autoViewAs({ name: "sha", storage: { sidai: true } }, cards), player, event); + }, + viewAs: { name: "sha", storage: { sidai: true } }, + filterCard: { type: "basic" }, + selectCard: -1, + check: () => 1, + onuse: function (result, player) { + player.awakenSkill("sidai"); + player.addTempSkill("sidai_tao"); + player.addTempSkill("sidai_shan"); + }, + ai: { + order: function (item, player) { + return get.order({ name: "sha" }, player) + 0.1; + }, + result: { + target: function (player, target) { + var cards = ui.selected.cards.slice(0); + var names = []; + for (var i of cards) names.add(i.name); + if (names.length < player.hp) return 0; + if (player.hasUnknown() && (player.identity != "fan" || !target.isZhu)) return 0; + if (get.attitude(player, target) >= 0) return -20; + return lib.card.sha.ai.result.target.apply(this, arguments); + }, + }, + }, + subSkill: { + tao: { + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.sidai || !event.player.isIn()) return false; + for (var i of event.cards) { + if (i.name == "tao") return true; + } + return false; + }, + forced: true, + popup: false, + content: function () { + trigger.player.loseMaxHp(); + }, + }, + shan: { + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.sidai || !event.target.isIn()) return false; + for (var i of event.cards) { + if (i.name == "shan") return true; + } + return false; + }, + forced: true, + popup: false, + content: function () { + "step 0"; + trigger.target.chooseToDiscard("h", { type: "basic" }, "弃置一张基本牌,否则不能响应" + get.translation(trigger.card)).set("ai", function (card) { + var player = _status.event.player; + if ( + player.hasCard("hs", function (cardx) { + return cardx != card && get.name(cardx, player) == "shan"; + }) + ) + return 12 - get.value(card); + return 0; + }); + "step 1"; + if (!result.bool) trigger.directHit.add(trigger.target); + }, + }, + }, + }, + jieyu: { + audio: "twjieyu", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + for (let i = 0; i < ui.discardPile.childElementCount; i++) { + if (get.type(ui.discardPile.childNodes[i], false) == "basic") return true; + } + return false; + }, + prompt2: function (event, player) { + const num = lib.skill.jieyu.getNum(player); + return "获得弃牌堆中" + get.cnNumber(num) + "张" + (num > 1 ? "牌名各不相同的" : "") + "基本牌"; + }, + async content(event, trigger, player) { + const num = lib.skill.jieyu.getNum(player, event); + let gains = [], + names = []; + for (let i = 0; i < ui.discardPile.childElementCount; i++) { + let card = ui.discardPile.childNodes[i]; + if (get.type(card, false) == "basic" && !names.includes(card.name)) { + gains.push(card); + names.push(card.name); + } + } + if (gains.length) player.gain(gains.randomGets(Math.min(gains.length, num)), "gain2"); + }, + getNum: function (player, event) { + let num = get.mode() == "identity" ? 3 : 4; + const history = game.getAllGlobalHistory("everything"); + for (let i = history.length - 1; i >= 0; i--) { + const evt = history[i]; + if (evt.name == "jieyu" && evt.player == player) { + if (!event || evt != event) break; + } + if (evt.name == "useCard" && evt.player != player && evt.targets && evt.targets.includes(player) && get.tag(evt.card, "damage")) { + num--; + if (num == 1) break; + } + } + return num; + }, + }, + //木鹿大王 + shoufa: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + filter: function (event, player, name) { + if (name == "damageSource" && player.getHistory("sourceDamage").indexOf(event) != 0) return false; + return game.hasPlayer(target => { + const num = get.mode() == "doudizhu" ? 1 : 2; + if (name == "damageEnd" && get.distance(player, target) <= num) return false; + if (name == "damageSource" && get.distance(player, target) > num) return false; + const zhoufa = player.storage.zhoulin_zhoufa; + if (!zhoufa) return true; + if (zhoufa == "豹" || zhoufa == "兔") return true; + if (zhoufa == "鹰") return target.countCards("he"); + return target.countDiscardableCards(player, "e"); + }); + }, + direct: true, + async content(event, trigger, player) { + const zhoufa = player.storage.zhoulin_zhoufa; + const str = zhoufa ? ["令其受到1点无来源伤害", "你随机获得其一张牌", "你随机弃置其装备区的一张牌", "令其摸一张牌"][["豹", "鹰", "熊", "兔"].indexOf(zhoufa)] : "令其随机执行一个效果"; + const nodoudizhu = get.mode() == "doudizhu" ? "距离" + (event.triggername == "damageEnd" ? "" : "不") + "大于1的" : "距离" + (event.triggername == "damageEnd" ? "" : "不") + "大于2的"; + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt("shoufa"), "选择一名" + nodoudizhu + "角色," + str, (card, player, target) => { + const name = _status.event.triggername; + const num = get.mode() == "doudizhu" ? 1 : 2; + if (name == "damageEnd" && get.distance(player, target) <= num) return false; + if (name == "damageSource" && get.distance(player, target) > num) return false; + const zhoufa = player.storage.zhoulin_zhoufa; + if (!zhoufa) return true; + if (zhoufa == "豹" || zhoufa == "兔") return true; + if (zhoufa == "鹰") return target.countCards("he"); + return target.countDiscardableCards(player, "e"); + }) + .set("ai", target => { + const player = _status.event.player; + const zhoufa = player.storage.zhoulin_zhoufa; + if (!zhoufa) return -get.attitude(player, target); + switch (zhoufa) { + case "豹": { + return get.damageEffect(target, player, player); + } + case "鹰": { + return get.effect(target, { name: "guohe_copy2" }, player, player); + } + case "熊": { + let att = get.attitude(player, target), + eff = 0; + target.getCards("e", card => { + var val = get.value(card, target); + eff = Math.max(eff, -val * att); + }); + return eff; + } + case "兔": { + return get.effect(target, { name: "draw" }, player, player); + } + } + }) + .set("triggername", event.triggername); + if (!bool) return; + const target = targets[0]; + player.logSkill("shoufa", target); + const shoufa = zhoufa ? zhoufa : ["豹", "鹰", "熊", "兔"].randomGet(); + game.log(target, "执行", "#g" + shoufa, "效果"); + switch (shoufa) { + case "豹": + target.damage("nosource"); + break; + case "鹰": + player.gain(target.getGainableCards(player, "he").randomGet(), target, "giveAuto"); + break; + case "熊": + target.discard(target.getGainableCards(player, "e").randomGet()).discarder = player; + break; + case "兔": + target.draw(); + break; + } + }, + }, + yuxiang: { + mod: { + globalFrom(from, to, distance) { + if (from.hujia > 0) return distance - 1; + }, + globalTo(from, to, distance) { + if (to.hujia > 0) return distance + 1; + }, + }, + audio: true, + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + return player.hujia > 0 && event.hasNature("fire"); + }, + forced: true, + async content(event, trigger, player) { + trigger.num++; + }, + }, + zhoulin: { + audio: 2, + limited: true, + unique: true, + enable: "phaseUse", + skillAnimation: true, + animationColor: "fire", + async content(event, trigger, player) { + player.awakenSkill("zhoulin"); + player.changeHujia(2, null, true); + const { + result: { control }, + } = await player + .chooseControl("豹", "鹰", "熊", "兔") + .set("ai", () => "豹") + .set("prompt", "选择一个固定效果"); + if (control) { + player.popup(control); + game.log(player, "选择了", "#g" + control, "效果"); + player.addTempSkill("zhoulin_zhoufa"); + player.storage.zhoulin_zhoufa = control; + player.markSkill("zhoulin_zhoufa"); + game.broadcastAll( + function (player, zhoufa) { + if (player.marks.zhoulin_zhoufa) player.marks.zhoulin_zhoufa.firstChild.innerHTML = zhoufa; + }, + player, + control + ); + } + }, + ai: { + order: 12, + result: { player: 1 }, + }, + subSkill: { + zhoufa: { + charlotte: true, + onremove: true, + intro: { content: "已选择$效果" }, + }, + }, + }, + //陈珪 + guimou: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame", "phaseEnd", "phaseZhunbeiBegin"], + }, + filter: function (event, player, name) { + if (event.name == "phaseZhunbei" || name == "phaseEnd") return true; + return event.name != "phase" || game.phaseNumber == 0; + }, + direct: true, + locked: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + if (trigger.name != "phaseZhunbei") { + player.logSkill("guimou"); + var result, + choiceList = ["惩罚期间使用牌最少的角色", "惩罚期间弃置牌最少的角色", "惩罚期间得到牌最少的角色"]; + if (trigger.name != "phase" || game.phaseNumber == 0) result = { index: get.rand(0, 2) }; + else + result = yield player + .chooseControl() + .set("choiceList", choiceList) + .set("ai", () => get.rand(0, 2)); + var str = choiceList[result.index]; + game.log(player, "选择", "#g" + str); + player.addSkill("guimou_" + result.index); + return; + } + var targets = []; + for (var i = 0; i <= 2; i++) { + var skill = "guimou_" + i; + if (player.hasSkill(skill)) { + var storage = player.storage[skill], + nums = storage[0].slice(); + var targetx = nums.sort((a, b) => storage[1][storage[0].indexOf(a)] - storage[1][storage[0].indexOf(b)]); + targetx = targetx.filter(target => storage[1][storage[0].indexOf(target)] == storage[1][storage[0].indexOf(targetx[0])]); + targets.addArray(targetx); + player.removeSkill(skill); + } + } + targets = targets.filter(target => target != player && target.countCards("h")); + if (targets.length) { + var result = yield player + .chooseTarget( + "请选择【诡谋】的目标", + "观看一名可选择的角色的手牌并选择其中一张牌,然后你可以此牌交给另一名其他角色或弃置此牌", + (card, player, target) => { + return _status.event.targets.includes(target) && target.countCards("h"); + }, + true + ) + .set("ai", target => { + return Math.sqrt(Math.min(3, target.countCards("h"))) * get.effect(target, { name: "guohe_copy2" }, player, player); + }) + .set("targets", targets); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("guimou", target); + player.addExpose(0.3); + var result2 = yield player + .choosePlayerCard(target, "h", "visible", true) + .set("ai", button => { + return get.value(button.link); + }) + .set("prompt", "诡谋:请选择" + get.translation(target) + "的一张手牌") + .set("prompt2", '
    将选择的牌交给另一名其他角色或弃置此牌
    '); + if (result2.bool) { + var cards = result2.links.slice(), + result3; + if (!game.hasPlayer(targetx => targetx != player && targetx != target)) result3 = { bool: false }; + else + result3 = yield player + .chooseTarget("是否令另一名其他角色获得" + get.translation(cards) + "?", (card, player, target) => { + return target != player && target != _status.event.target; + }) + .set("ai", target => get.attitude(_status.event.player, target)) + .set("target", target); + if (result3.bool) { + var targetx = result3.targets[0]; + player.line(targetx); + targetx.gain(cards, target, "give"); + } else target.discard(cards).discarder = player; + } + } + } + }, + subSkill: { + 0: { + charlotte: true, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) { + player.storage[skill] = [[], []]; + var targets = game.filterPlayer().sortBySeat(player); + targets.forEach(target => { + player.storage[skill][0].push(target); + player.storage[skill][1].push(0); + }); + } + }, + mark: true, + intro: { + markcount: storage => 0, + content: function (storage, player) { + var str = "当前使用牌数排行榜"; + var lose = storage[1].slice().sort((a, b) => a - b)[0]; + storage[0].forEach(target => { + str += "
  • "; + var score = storage[1][storage[0].indexOf(target)]; + if (score == lose) str += ""; + str += " " + get.translation(target) + " "; + str += score + "张"; + if (score == lose) str += ""; + }); + return str; + }, + }, + trigger: { global: "useCard1" }, + forced: true, + popup: false, + content: function () { + var storage = player.storage["guimou_0"]; + if (!storage[0].includes(trigger.player)) { + storage[0].push(trigger.player); + storage[1].push(0); + } + storage[1][storage[0].indexOf(trigger.player)]++; + }, + }, + 1: { + charlotte: true, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) { + player.storage[skill] = [[], []]; + var targets = game.filterPlayer().sortBySeat(player); + targets.forEach(target => { + player.storage[skill][0].push(target); + player.storage[skill][1].push(0); + }); + } + }, + mark: true, + intro: { + markcount: storage => 0, + content: function (storage, player) { + var str = "当前弃置牌数排行榜"; + var lose = storage[1].slice().sort((a, b) => a - b)[0]; + storage[0].forEach(target => { + str += "
  • "; + var score = storage[1][storage[0].indexOf(target)]; + if (score == lose) str += ""; + str += " " + get.translation(target) + " "; + str += score + "张"; + if (score == lose) str += ""; + }); + return str; + }, + }, + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + return event.type == "discard" && game.hasPlayer(target => event.getl(target).cards2.length); + }, + forced: true, + popup: false, + content: function () { + var storage = player.storage["guimou_1"]; + var targets = game.filterPlayer(target => trigger.getl(target).cards2.length); + targets.forEach(target => { + if (!storage[0].includes(target)) { + storage[0].push(target); + storage[1].push(0); + } + storage[1][storage[0].indexOf(target)] += trigger.getl(target).cards2.length; + }); + }, + }, + 2: { + charlotte: true, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) { + player.storage[skill] = [[], []]; + var targets = game.filterPlayer().sortBySeat(player); + targets.forEach(target => { + player.storage[skill][0].push(target); + player.storage[skill][1].push(0); + }); + } + }, + mark: true, + intro: { + markcount: storage => 0, + content: function (storage, player) { + var str = "当前得到牌数排行榜"; + var lose = storage[1].slice().sort((a, b) => a - b)[0]; + storage[0].forEach(target => { + str += "
  • "; + var score = storage[1][storage[0].indexOf(target)]; + if (score == lose) str += ""; + str += " " + get.translation(target) + " "; + str += score + "张"; + if (score == lose) str += ""; + }); + return str; + }, + }, + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + forced: true, + popup: false, + content: function () { + var storage = player.storage["guimou_2"]; + var targets = game.filterPlayer(target => trigger.getg(target).length); + targets.forEach(target => { + if (!storage[0].includes(target)) { + storage[0].push(target); + storage[1].push(0); + } + storage[1][storage[0].indexOf(target)] += trigger.getg(target).length; + }); + }, + }, + }, + }, + zhouxian: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return event.player != player && get.tag(event.card, "damage"); + }, + forced: true, + logTarget: "player", + content: function* (event, map) { + var player = map.player, + trigger = map.trigger, + target = trigger.player; + var cards = get.cards(3); + yield game.cardsDiscard(cards); + player.showCards(cards, get.translation(player) + "发动了【州贤】"); + var result = yield target + .chooseToDiscard("he", "州贤:弃置一张其中有的类别的牌,或令此牌对" + get.translation(player) + "无效", (card, player) => { + return _status.event.cards.some(cardx => get.type2(cardx) == get.type2(card)); + }) + .set("cards", cards) + .set("ai", card => { + if (!_status.event.goon) return 0; + return 7.5 - get.value(card); + }) + .set("goon", get.effect(player, trigger.card, target, target) > 0); + if (!result.bool) trigger.getParent().excluded.add(player); + }, + ai: { + effect: { + target_use: function (card, player, target, current) { + if (get.tag(card, "damage") && get.attitude(player, target) < 0 && target != player) { + if (_status.event.name == "zhouxian") return; + if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; + var bs = player.getDiscardableCards(player, "he"); + bs.remove(card); + if (card.cards) bs.removeArray(card.cards); + else bs.removeArray(ui.selected.cards); + var cardx = Array.from(ui.cardPile.childNodes).slice(0, 3); + bs = bs.filter(i => cardx.some(j => get.type2(j) == get.type2(i))); + if (!bs.length) return "zerotarget"; + if (bs.length <= 2) { + if (bs.some(bsi => get.value(bsi) < 7)) return [1, 0, 1, -0.5]; + return [1, 0, 0.3, 0]; + } + return [1, 0, 1, -0.5]; + } + }, + }, + }, + }, + //胡班 + mbyilie: { + audio: 3, + trigger: { global: "phaseBefore", player: "enterGame" }, + filter: function (event, player) { + return !player.storage.mbyilie2 && (event.name != "phase" || game.phaseNumber == 0); + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("mbyilie"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + return Math.max(1 + get.attitude(player, target) * get.threaten(target), Math.random()); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mbyilie", target); + player.storage.mbyilie2 = target; + player.addSkill("mbyilie2"); + } + }, + marktext: "烈", + intro: { + name2: "烈", + content: "mark", + }, + group: "mbyilie3", + }, + mbyilie2: { + charlotte: true, + audio: "mbyilie", + trigger: { global: ["damageBegin4", "damageSource"] }, + filter: function (event, player, name) { + var target = player.storage.mbyilie2; + if (name == "damageSource") return event.source == target && event.player != target && player.isDamaged(); + return event.player == target && player.countMark("mbyilie") < 2; + }, + forced: true, + logTarget: function (event, player) { + return player.storage.mbyilie2; + }, + content: function () { + if (event.triggername == "damageSource") player.recover(); + else { + player.addMark("mbyilie", trigger.num); + trigger.cancel(); + } + }, + }, + mbyilie3: { + audio: "mbyilie", + trigger: { player: "phaseEnd" }, + filter: function (event, player) { + return player.hasMark("mbyilie"); + }, + forced: true, + content: function () { + "step 0"; + player.draw(); + "step 1"; + var num = player.countMark("mbyilie"); + if (num) { + player.loseHp(num); + player.removeMark("mbyilie", num); + } + }, + }, + //向朗 + naxue: { + audio: 2, + trigger: { player: "phaseUseBefore" }, + check: function (event, player) { + var cards = player.getCards("h", card => player.hasValueTarget(card)); + if (!cards.length) return true; + if (!(player.hp >= 2 && player.countCards("h") <= player.hp + 1)) return false; + return game.hasPlayer(function (target) { + if (target.hasJudge("lebu") || target == player) return false; + if (get.attitude(player, target) > 4) { + return get.threaten(target) / Math.sqrt(target.hp + 1) / Math.sqrt(target.countCards("h") + 1) > 0; + } + return false; + }); + }, + content: function* (event, map) { + var player = map.player; + map.trigger.cancel(); + var num = player.countDiscardableCards(player, "he"); + if (num) { + var result = yield player.chooseToDiscard("纳学:是否弃置任意张牌并摸等量的牌?", "he", [1, num]).set("ai", lib.skill.zhiheng.check); + if (result.bool) yield player.draw(result.cards.length); + } + if (player.countCards("h")) { + var result2 = yield player.chooseCardTarget({ + prompt: "是否交给至多两名其他角色各一张手牌?", + prompt2: "先按顺序选中所有要给出的牌,然后再按顺序选择等量的目标角色。", + selectCard: [1, 2], + filterCard: true, + filterTarget: lib.filter.notMe, + selectTarget: function () { + return ui.selected.cards.length; + }, + filterOk: () => { + return ui.selected.cards.length == ui.selected.targets.length; + }, + position: "h", + ai1: function (card) { + if (card.name == "du") return 10; + else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + var player = _status.event.player; + if ( + ui.selected.cards.length > 4 || + !game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); + }) + ) + return 0; + return 1 / Math.max(0.1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -att; + if (target.hasSkillTag("nogain")) att /= 6; + return att; + }, + }); + if (result2.bool) { + const list = []; + for (let i = 0; i < result2.targets.length; i++) { + list.push([result2.targets[i], result2.cards[i]]); + player.line(result2.targets[i]); + } + game.loseAsync({ + gain_list: list, + player: player, + cards: result2.cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + } + } + }, + }, + yijie: { + audio: 2, + trigger: { player: "die" }, + filter: function (event, player) { + return game.hasPlayer(target => target != player); + }, + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "orange", + logTarget: function (event, player) { + return game.filterPlayer(target => target != player); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(target => target != player); + var sum = targets.reduce((num, target) => (num += target.hp), 0); + sum = Math.max(1, Math.floor(sum / targets.length)); + event.num = sum; + event.targets = targets; + "step 1"; + var target = targets.shift(); + var delta = target.hp - num; + if (delta != 0) { + target[delta > 0 ? "loseHp" : "recover"](Math.abs(delta)); + } + if (targets.length) event.redo(); + }, + }, + //阎象 + kujian: { + audio: "twkujian", + inherit: "twkujian", + selectCard: [1, 2], + content: function () { + player.give(cards, target).gaintag.add("twkujianx"); + player.addSkill("kujian_draw"); + player.addSkill("twkujian_discard"); + }, + subSkill: { + draw: { + charlotte: true, + audio: "twkujian", + trigger: { global: ["useCardAfter", "respondAfter"] }, + filter: function (event, player) { + return event.player.hasHistory("lose", evt => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; + } + }); + }, + forced: true, + logTarget: "player", + content: function () { + "step 0"; + game.asyncDraw([player, trigger.player], 2); + "step 1"; + game.delayx(); + }, + }, + }, + }, + //手杀差异化孙鲁育 + mbmumu: { + audio: "mumu", + inherit: "new_mumu", + filter: function (event, player) { + return game.hasPlayer(current => { + return current.countCards("e") > 0; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("mbmumu"), "弃置场上的一张装备牌,或者获得场上的一张防具牌。", function (card, player, target) { + return target.countCards("e") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (target.getEquip(2) && player.hasEmptySlot(2)) { + return -2 * att; + } + return -att; + }); + "step 1"; + if (result.bool && result.targets && result.targets.length) { + event.target = result.targets[0]; + player.logSkill("mbmumu", event.target); + player.line(event.target, "green"); + var e = event.target.getEquips(2); + event.e = e; + if (e.length > 0) { + player.chooseControl("弃置一张装备牌", "获得一张防具牌").set("ai", function () { + if (_status.event.player.getEquips(2).length > 0) { + return "弃置一张装备牌"; + } + return "获得一张防具牌"; + }); + } else { + event.choice = "弃置一张装备牌"; + } + } else event.finish(); + "step 2"; + var choice = event.choice || result.control; + if (choice == "弃置一张装备牌") { + player.discardPlayerCard(event.target, "e", true); + } else { + if (event.e) { + player.gain(event.e, event.target, "give", "bySelf"); + player.addTempSkill("new_mumu2"); + } + } + }, + }, + mbmeibu: { + inherit: "new_meibu", + derivation: ["mbzhixi"], + content: function () { + "step 0"; + var check = lib.skill.new_meibu.checkx(trigger, player); + player + .chooseToDiscard(get.prompt2("mbmeibu", trigger.player), "he") + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }) + .set("check", check) + .set("logSkill", ["mbmeibu", trigger.player]); + "step 1"; + if (result.bool) { + var target = trigger.player; + var card = result.cards[0]; + player.line(target, "green"); + target.addTempSkills("mbzhixi", "phaseUseAfter"); + if (card.name != "sha" && get.type(card) != "trick" && get.color(card) != "black") { + target.addTempSkill("new_meibu_range", "phaseUseAfter"); + target.markAuto("new_meibu_range", player); + } + target.markSkillCharacter("mbmeibu", player, "魅步", "锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。"); + } + }, + }, + mbzhixi: { + mod: { + cardEnabled: function (card, player) { + if (player.countMark("mbzhixi") >= player.hp) return false; + }, + cardUsable: function (card, player) { + if (player.countMark("mbzhixi") >= player.hp) return false; + }, + cardRespondable: function (card, player) { + if (player.countMark("mbzhixi") >= player.hp) return false; + }, + cardSavable: function (card, player) { + if (player.countMark("mbzhixi") >= player.hp) return false; + }, + }, + trigger: { + player: "useCard1", + }, + forced: true, + popup: false, + firstDo: true, + init: function (player, skill) { + player.storage[skill] = 0; + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.player == player) { + player.getHistory("useCard", function (evtx) { + if (evtx.getParent("phaseUse") == evt) { + player.storage[skill]++; + } + }); + } + }, + onremove: function (player) { + player.unmarkSkill("mbmeibu"); + delete player.storage.mbzhixi; + }, + content: function () { + player.addMark("mbzhixi", 1, false); + if (get.type2(trigger.card) == "trick") { + var evt = trigger.getParent("phaseUse"); + if (evt && evt.player == player) { + evt.skipped = true; + game.log(player, "结束了出牌阶段"); + } + } + }, + ai: { + presha: true, + pretao: true, + neg: true, + nokeep: true, + }, + }, + //庞统 + xinlianhuan: { + audio: 2, + audioname: ["ol_pangtong"], + inherit: "lianhuan", + group: "xinlianhuan_add", + subSkill: { + add: { + audio: "xinlianhuan", + audioname: ["ol_pangtong"], + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "tiesuo") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(current => { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); + }) + ) + return true; + } + return false; + }, + charlotte: true, + forced: true, + popup: false, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("xinlianhuan"), "为" + get.translation(trigger.card) + "额外指定一个目标", (card, player, target) => { + return !_status.event.sourcex.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("sourcex", trigger.targets) + .set("ai", function (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.delayex(); + } else event.finish(); + "step 2"; + if (result.bool) { + var targets = result.targets; + player.logSkill("xinlianhuan_add", targets); + trigger.targets.addArray(targets); + game.log(targets, "也成为了", trigger.card, "的目标"); + } + }, + }, + }, + }, + //吴班 + xinjintao: { + audio: "jintao", + inherit: "jintao", + content: function () { + var evt = trigger.getParent("phaseUse"); + var index = player + .getHistory("useCard", function (evtx) { + return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; + }) + .indexOf(trigger); + if (index == 0) { + game.log(trigger.card, "不可被响应"); + trigger.directHit.addArray(game.players); + } else { + game.log(trigger.card, "伤害+1"); + if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; + trigger.baseDamage++; + } + }, + }, + //鲍信 + mutao: { + audio: "twmutao", + inherit: "twmutao", + content: function () { + "step 0"; + event.togive = target.getNext(); + var cards = target.getCards("h", { name: "sha" }); + if (!cards.length) { + game.log("但", target, "没有", "#y杀", "!"); + event.finish(); + } else target.addToExpansion(cards, target, "give").gaintag.add("mutao"); + "step 1"; + var card = target.getExpansions("mutao").randomGet(); + target.give(card, event.togive); + "step 2"; + if (target.getExpansions("mutao").length) { + event.togive = event.togive.getNext(); + event.goto(1); + } else { + target.line(event.togive); + event.togive.damage(Math.min(2, event.togive.countCards("h", { name: "sha" })), target); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + }, + yimou: { + audio: "twyimou", + inherit: "twyimou", + content: function () { + "step 0"; + if (trigger.player != player) player.addExpose(0.3); + var target = get.translation(trigger.player); + var choiceList = ["令" + target + "获得牌堆里的一张【杀】", "令" + target + "将一张牌交给另一名角色,然后" + target + "摸一张牌"]; + var list = ["选项一"]; + if (trigger.player.countCards("h")) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + player + .chooseControl(list) + .set("prompt", "毅谋:请选择一项") + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event.getTrigger(), + list = _status.event.list; + var player = _status.event.player; + var target = evt.player; + if (target.countCards("h") && list.includes("选项二")) return "选项二"; + return "选项一"; + }) + .set("list", list); + "step 1"; + event.choice = result.control; + "step 2"; + if (event.choice != "选项二") { + var card = get.cardPile2(function (card) { + return card.name == "sha"; + }); + if (card) trigger.player.gain(card, "gain2"); + else game.log("但牌堆里已经没有", "#y杀", "了!"); + if (event.choice == "选项一") event.finish(); + } + "step 3"; + if (event.choice != "选项一") { + if (trigger.player.countCards("h")) + trigger.player.chooseCardTarget({ + prompt: "毅谋:将一张手牌交给另一名其他角色", + filterCard: true, + forced: true, + filterTarget: lib.filter.notMe, + ai1: function (card) { + return 1 / Math.max(0.1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 9; + return 4 + att; + }, + }); + else event.finish(); + } + "step 4"; + var target = result.targets[0]; + trigger.player.line(target); + trigger.player.give(result.cards, target); + trigger.player.draw(); + }, + }, + //蒋济 + jilun: { + audio: "twjilun", + inherit: "twjilun", + filter: function (event, player) { + return player.hasSkill("twjichou", null, false, false); + }, + content: function () { + "step 0"; + var choices = ["选项一"]; + var choiceList = ["摸两张牌", "获得一个“机论”标记"]; + if ( + !player.getStorage("twjichou").length || + !player.getStorage("twjichou").filter(function (name) { + return !player.getStorage("jilun").includes(name) && player.hasUseTarget({ name: name }); + }).length + ) + choiceList[1] = '' + choiceList[1] + ""; + else choices.push("选项二"); + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("jilun")) + .set("ai", () => { + if (_status.event.choiceList.length == 1 || !player.getStorage("twjichou").length) return 0; + var val = player.getUseValue({ name: "wuzhong" }); + for (var name of player.getStorage("twjichou")) { + if (player.getStorage("jilun").includes(name)) continue; + if (player.getUseValue({ name: name }) > val) return 1; + } + return 0; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("jilun"); + if (result.control == "选项一") player.draw(2); + else player.addMark("jilun_mark", 1); + } + }, + group: "jilun_effect", + subSkill: { + mark: { + intro: { content: "mark" }, + }, + effect: { + audio: "twjilun", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hasMark("jilun_mark"); + }, + forced: true, + content: function () { + "step 0"; + if ( + !player.getStorage("twjichou").length || + !player.getStorage("twjichou").filter(function (name) { + return !player.getStorage("jilun").includes(name) && player.hasUseTarget({ name: name }); + }).length + ) { + if (player.hasMark("jilun_mark")) player.removeMark("jilun_mark", player.countMark("jilun_mark")); + event.finish(); + return; + } + var list = []; + for (var name of player.getStorage("twjichou")) { + if (!player.getStorage("jilun").includes(name)) { + list.push(["锦囊", "", name]); + } + } + player + .chooseButton(['###机论:请选择你要执行的选项###
  • 失去1枚“机论”标记,视为使用一张〖急筹〗已记录但〖机论〗未记录的普通锦囊牌
  • 失去所有“机论”标记', [list, "vcard"]]) + .set("filterButton", function (button) { + return _status.event.player.hasUseTarget({ name: button.link[2] }); + }) + .set("ai", function (button) { + return _status.event.getParent().player.getUseValue({ name: button.link[2] }, null, true); + }); + "step 1"; + if (result.bool) { + player.removeMark("jilun_mark", 1); + var card = { name: result.links[0][2], isCard: true }; + player.chooseUseTarget(card, true); + player.markAuto("jilun", [card.name]); + player.syncStorage("jilun"); + } else { + player.removeMark("jilun_mark", player.countMark("jilun_mark")); + event.finish(); + } + "step 2"; + if (player.hasMark("jilun_mark")) event.goto(0); + }, + }, + }, + ai: { + combo: "twjichou", + }, + }, + //李遗 + jiaohua: { + onremove: true, + audio: "twjiaohua", + enable: "phaseUse", + usable: 2, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("###教化###选择一种牌的类型,令一名角色从牌堆获得此类型的一张牌"); + }, + chooseControl: function (event, player) { + var list = ["basic", "trick", "equip"].filter(type => !player.getStorage("jiaohua").includes(type)); + list.push("cancel2"); + return list; + }, + check: function (event, player) { + var list = ["trick", "equip", "basic"].filter(type => !player.getStorage("jiaohua").includes(type)); + return list[0]; + }, + backup: function (result, player) { + return { + type: result.control, + audio: "twjiaohua", + filterCard: () => false, + selectCard: -1, + filterTarget: true, + content: function () { + "step 0"; + var type = lib.skill.jiaohua_backup.type; + var card = get.cardPile2(card => get.type2(card) == type); + if (card) target.gain(card, "gain2"); + else game.log("但牌堆里已经没有", "#y" + get.translation(type) + "牌", "了!"); + "step 1"; + player.markAuto("jiaohua", [lib.skill.jiaohua_backup.type]); + "step 2"; + if (!["basic", "trick", "equip"].some(type => !player.getStorage("jiaohua").includes(type))) { + player.popup("教化"); + player.unmarkAuto("jiaohua", player.getStorage("jiaohua")); + game.log(player, "清空了", "#g【教化】", "记录"); + } + }, + ai: { + result: { target: 1 }, + }, + }; + }, + prompt: function (result, player) { + return "令一名角色从牌堆中获得一张" + get.translation(result.control) + "牌"; + }, + }, + ai: { + order: 7, + result: { player: 1 }, + }, + intro: { content: "已记录$牌" }, + }, + //来敏 + laishou: { + audio: 3, + trigger: { player: ["damageBegin4", "phaseZhunbeiBegin"] }, + filter: function (event, player) { + var num = 9; + if (event.name == "damage") return event.num >= player.getHp() && player.maxHp < num; + return player.maxHp >= num; + }, + forced: true, + content: function () { + if (trigger.name == "damage") { + player.gainMaxHp(trigger.num); + trigger.cancel(); + } else player.die(); + }, + }, + luanqun: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h"); + }, + usable: 1, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => current.countCards("h")).sortBySeat(); + event.targets = targets; + var next = player + .chooseCardOL(targets, "乱群:请选择要展示的牌", true) + .set("ai", function (card) { + return -get.value(card); + }) + .set("source", player); + next.aiCard = function (target) { + var hs = target.getCards("h"); + return { bool: true, cards: [hs.randomGet()] }; + }; + next._args.remove("glow_result"); + "step 1"; + var cards = []; + event.videoId = lib.status.videoId++; + for (var i = 0; i < targets.length; i++) cards.push(result[i].cards[0]); + event.cards = cards; + game.log(player, "展示了", targets, "的", cards); + game.broadcastAll( + function (targets, cards, id, player) { + var dialog = ui.create.dialog(get.translation(player) + "发动了【乱群】", cards); + dialog.videoId = id; + var getName = function (target) { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + }; + for (var i = 0; i < targets.length; i++) { + dialog.buttons[i].querySelector(".info").innerHTML = getName(targets[i]) + get.translation(cards[i].suit); + } + }, + targets, + cards, + event.videoId, + player + ); + game.delay(4); + "step 2"; + game.broadcastAll("closeDialog", event.videoId); + var card = cards[targets.indexOf(player)]; + var cardx = cards.filter(cardy => cardy != card && get.color(cardy, targets[cards.indexOf(cardy)]) == get.color(card, player)); + if (cardx.length) { + player + .chooseButton(["乱群:是否获得其中的一张牌", cardx]) + .set("forceAuto", true) + .set("ai", function (button) { + var cards = _status.event.list[0]; + var targets = _status.event.list[1]; + var player = _status.event.player; + if (get.attitude(player, targets[cards.indexOf(button.link)]) > 0) return 0; + return get.value(button.link, player); + }) + .set("list", [cards, targets]); + } else event.goto(4); + "step 3"; + if (result.bool) { + var card = result.links[0]; + player.gain(card, get.owner(card), "give"); + } + "step 4"; + var card = cards[targets.indexOf(player)]; + targets = targets.filter(target => get.color(cards[targets.indexOf(target)], target) != get.color(card, player)); + if (targets.length) { + player.line(targets); + targets.forEach(target => { + target.addTempSkill("luanqun_effect", { player: "phaseUseAfter" }); + target.markAuto("luanqun_effect", [player]); + }); + } + }, + ai: { + order: 9, + result: { + player: function (player, target) { + if (player.hasSkill("laishou")) return 1; + return player.hp >= 2 ? 1 : 0; + }, + }, + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + intro: { content: "出牌阶段第一张【杀】只能指定$为目标,且此牌不可被响应" }, + mod: { + playerEnabled: function (card, player, target) { + if (!player.isPhaseUsing()) return; + if (card.name == "sha" && !player.getStorage("luanqun_effect").includes(target)) return false; + }, + }, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return player.isPhaseUsing() && event.card.name == "sha"; + }, + forced: true, + content: function () { + trigger.directHit.addArray(player.getStorage("luanqun_effect")); + player.removeSkill("luanqun_effect"); + }, + }, + }, + }, + //☆周不疑 + mbhuiyao: { + audio: 2, + enable: "phaseUse", + usable: 1, + // filterTarget:lib.filter.notMe, + content: function () { + "step 0"; + player.damage("nosource"); + "step 1"; + if (game.countPlayer() < 2) event.finish(); + if (game.countPlayer() == 2) + event._result = { + bool: true, + targets: [game.findPlayer(i => i != player), player], + }; + else + player + .chooseTarget( + `慧夭:请选择两名角色`, + `令不为你的第一名角色视为对第二名角色造成过1点伤害。`, + (card, player, target) => { + if (!ui.selected.targets.length) return player != target; + return true; + }, + 2, + true + ) + .set("multitarget", true) + .set("targetprompt", ["伤害来源", "受伤角色"]) + .set("ai", target => { + return target == get.event("aiTargets")[ui.selected.targets.length] ? 10 : 0; + }) + .set("aiTargets", lib.skill.mbhuiyao.getUnrealDamageTargets(player, [game.filterPlayer(i => i != player), game.filterPlayer()], true)); + "step 2"; + if (result.bool) { + var targets = result.targets; + player.line2(targets, "green"); + game.delaye(); + targets[1].damage(targets[0], "unreal"); + } + }, + getUnrealDamageTargets: (player, lists, forced) => { + const targets = [null, null]; + let sourceList, targetList; + if (lists.length == 2 && lists.every(l => Array.isArray(l))) { + sourceList = lists[0]; + targetList = lists[1]; + } else { + sourceList = lists.slice(); + targetList = lists.slice(); + } + const list = targetList + .map(current => { + const _hp = current.hp, + _maxhp = current.maxHp; + current.hp = 100; + current.maxHp = 100; + const att = -get.sgnAttitude(player, current); + let val = get.damageEffect(current, player, current) * att; + current.getSkills(null, false, false).forEach(skill => { + const info = get.info(skill); + if (info && info.ai && (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend)) val = Math[val > 0 ? "max" : "min"](val > 0 ? 0.1 : -0.1, val + 2 * att); + }); + const eff = 100 / val + 15; + current.hp = _hp; + current.maxHp = _maxhp; + return [current, eff]; + }) + .sort((a, b) => b[1] - a[1])[0]; + if (list[1] < 0 && !forced) return targets; + const targetx = list[0]; + targets[1] = targetx; + const list2 = sourceList + .filter(i => i != targetx) + .map(current => { + const _hp = targetx.hp, + _maxhp = targetx.maxHp; + targetx.hp = 100; + targetx.maxHp = 100; + const att = -get.sgnAttitude(player, current); + const eff = get.damageEffect(targetx, current, current) * att; + targetx.hp = _hp; + targetx.maxHp = _maxhp; + return [current, eff]; + }) + .sort((a, b) => b[1] - a[1])[0]; + if (!list2) return targets; + targets[0] = list2[0]; + return targets; + }, + ai: { + order: 6, + result: { + player: function (player) { + if (player.getHp() + player.countCards("hs", card => player.canSaveCard(card, player)) <= 1) return 0; + var limit = 25; + var quesong = player.hasSkill("mbquesong") && !player.getStat().damaged; + if (quesong) { + limit -= 7.5; + } + if ( + quesong && + game.hasPlayer(target => { + var att = get.attitude(player, target); + if (att < 0) return false; + return ( + att * + Math.sqrt( + Math.max( + 1, + [1, 2, 3, 4].reduce((p, c) => p + target.countEmptySlot(c), 0) + ) + ) >= + 10 || target.getHp() <= 2 + ); + }) + ) + return 1; + if ( + !quesong && + game.hasPlayer(target => { + if (target == player) return false; + var _hp = target.hp, + _maxhp = target.maxHp; + target.hp = 100; + target.maxHp = 100; + var att = -get.sgnAttitude(player, target); + var val = get.damageEffect(target, player, target) * att; + target.getSkills(null, false, false).forEach(skill => { + var info = get.info(skill); + if (info && info.ai && (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend)) val = Math[val > 0 ? "max" : "min"](val > 0 ? 0.1 : -0.1, val + 2 * att); + }); + var eff = 100 / val; + target.hp = _hp; + target.maxHp = _maxhp; + if (eff < limit) return false; + return true; + }) + ) + return 1; + return 0; + }, + }, + }, + }, + mbquesong: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getHistory("damage").length; + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("mbquesong")).set("ai", target => { + var player = _status.event.player; + if (get.attitude(player, target) <= 0) return 0; + var len = lib.skill.mbquesong.getNum(target), + hp = target.getHp(); + return len + target.isTurnedOver() * 2 + (1.5 * Math.min(4, target.getDamagedHp())) / (hp + 1); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("mbquesong", target); + var len = lib.skill.mbquesong.getNum(target); + if (target.isHealthy()) event._result = { index: 0 }; + else { + target + .chooseControl() + .set("choiceList", ["摸" + get.cnNumber(len) + "张牌并复原武将牌", "回复1点体力"]) + .set("prompt", "雀颂:请选择一项") + .set("ai", () => { + var player = _status.event.player; + var len = _status.event.len; + return get.effect(player, { name: "draw" }, player, player) * len >= get.recoverEffect(player, player, player) ? 0 : 1; + }) + .set("len", len); + } + } else event.finish(); + "step 2"; + if (result.index == 1) { + target.recover(); + event.finish(); + } else target.draw(lib.skill.mbquesong.getNum(target)); + "step 3"; + target.link(false); + "step 4"; + target.turnOver(false); + }, + getNum: function (player) { + return player.countCards("e", card => get.subtype(card) != "equip5") >= 3 ? 2 : 3; + }, + ai: { + expose: 0.2, + maixie: true, + skillTagFilter: function (player, tag) { + if (player.getStat().damaged) return false; + }, + }, + }, + //郭照 + yichong: { + initSkill: function (skill) { + if (!lib.skill[skill]) { + lib.skill[skill] = { + charlotte: true, + onremove: true, + mark: true, + marktext: "雀", + intro: { + markcount: function (storage) { + return (storage || 0).toString(); + }, + content: function (storage) { + return "已被掠夺" + (storage || 0) + "张牌"; + }, + }, + }; + lib.translate[skill] = "易宠"; + lib.translate[skill + "_bg"] = "雀"; + } + }, + getLimit: 1, + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("yichong"), "选择一名其他角色并选择一个花色,获得其此花色的所有牌并令其获得“雀”标记", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0) return 0; + var getNum = function (player) { + var list = []; + for (var i of lib.suit) list.push(player.countCards("he", { suit: i }) + 3); + return list.sort((a, b) => b - a)[0]; + }; + return getNum(target) + target.countCards("h") / 10; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("yichong", target); + event.target = target; + player + .chooseControl(lib.suit.slice(0).reverse()) + .set("prompt", "请声明一个花色") + .set("ai", function () { + var target = _status.event.target, + cards = target.getCards("he"); + var suits = lib.suit.slice(0); + suits.sort(function (a, b) { + var num = function (suit) { + return cards.filter(function (card) { + return get.suit(card) == suit; + }).length; + }; + return num(b) - num(a); + }); + return suits[0]; + }) + .set("target", target); + } else event.finish(); + "step 2"; + var suit = result.control; + event.suit = suit; + player.chat(get.translation(suit + 2)); + game.log(player, "选择了", "#y" + get.translation(suit + 2)); + if (target.countCards("e", { suit: suit })) player.gain(target.getCards("e", { suit: suit }), target, "giveAuto"); + "step 3"; + var suit = event.suit; + if (target.countCards("h", { suit: suit })) { + player.chooseButton(["选择获得其中一张牌", target.getCards("h", { suit: suit })], true).set("ai", button => get.value(button.link)); + } else event.goto(5); + "step 4"; + if (result.bool) { + var card = result.links[0]; + if (lib.filter.canBeGained(card, player, target)) player.gain(card, target, "giveAuto", "bySelf"); + else game.log("但", card, "不能被", player, "获得!"); + } + "step 5"; + var suit = event.suit; + player.storage.yichong = suit; + player.markSkill("yichong"); + var skill = "yichong_" + player.playerid; + game.broadcastAll(lib.skill.yichong.initSkill, skill); + game.broadcastAll( + function (player, suit) { + if (player.marks.yichong) player.marks.yichong.firstChild.innerHTML = get.translation(suit); + }, + player, + suit + ); + game.countPlayer(function (current) { + current.removeSkill("yichong_" + player.playerid); + if (current == target) target.addSkill("yichong_" + player.playerid); + }); + player.addTempSkill("yichong_clear", { player: "phaseBegin" }); + }, + onremove: true, + intro: { content: "拥有“雀”标记的角色得到$牌后,你获得之" }, + group: "yichong_gain", + subSkill: { + gain: { + audio: "yichong", + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + if (!player.storage.yichong) return false; + return game.hasPlayer(function (current) { + if (!event.getg(current).length || !current.hasSkill("yichong_" + player.playerid)) return false; + if (current.countMark("yichong_" + player.playerid) >= lib.skill.yichong.getLimit) return false; + return event.getg(current).some(card => get.suit(card, current) == player.storage.yichong && lib.filter.canBeGained(card, current, player)); + }); + }, + forced: true, + content: function () { + "step 0"; + var target = game.findPlayer(function (current) { + if (!trigger.getg(current).length || !current.hasSkill("yichong_" + player.playerid)) return false; + if (current.countMark("yichong_" + player.playerid) >= lib.skill.yichong.getLimit) return false; + return trigger.getg(current).some(card => get.suit(card, current) == player.storage.yichong && lib.filter.canBeGained(card, current, player)); + }); + event.target = target; + var cards = trigger.getg(target).filter(card => get.suit(card, target) == player.storage.yichong && lib.filter.canBeGained(card, target, player)); + if (cards.length <= lib.skill.yichong.getLimit - target.countMark("yichong_" + player.playerid)) event._result = { bool: true, links: cards }; + else { + var num = lib.skill.yichong.getLimit - target.countMark("yichong_" + player.playerid); + player.chooseButton(["易宠:获得其中的" + get.cnNumber(num) + "张牌", cards], num, true).set("ai", function (button) { + return get.value(button.link); + }); + } + "step 1"; + if (result.bool) { + player.gain(result.links, target, "give"); + target.addMark("yichong_" + player.playerid, result.links.length, false); + } + }, + }, + clear: { + charlotte: true, + onremove: function (player) { + game.countPlayer(function (current) { + current.removeSkill("yichong_" + player.playerid); + }); + }, + }, + }, + }, + wufei: { + audio: 2, + trigger: { player: ["useCardToPlayered", "damageEnd"] }, + filter: function (event, player) { + var target = game.findPlayer(current => current.hasSkill("yichong_" + player.playerid)); + if (!target) return false; + if (event.name == "damage") return target.hp > 3; + return event.isFirstTarget && (event.card.name == "sha" || (get.type(event.card) == "trick" && get.tag(event.card, "damage"))); + }, + direct: true, + content: function () { + "step 0"; + var target = game.findPlayer(current => current.hasSkill("yichong_" + player.playerid)); + event.target = target; + if (trigger.name == "damage") { + player.chooseBool(get.prompt("wufei", target), "令" + get.translation(target) + "受到1点无来源伤害").set("choice", get.damageEffect(target, player, player) > 0); + } else { + player.logSkill("wufei", target); + player.addTempSkill("wufei_effect"); + player.markAuto("wufei_effect", [trigger.card]); + game.log(target, "成为了", trigger.card, "的伤害来源"); + event.finish(); + } + "step 1"; + if (result.bool) { + player.logSkill("wufei", target); + target.damage("nosource"); + } + }, + subSkill: { + effect: { + charlotte: true, + trigger: { source: "damageBefore" }, + filter: function (event, player) { + if (!event.card) return false; + return player.getStorage("wufei_effect").includes(event.card); + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + var target = game.findPlayer(current => current.hasSkill("yichong_" + player.playerid)); + if (!target) delete trigger.source; + else trigger.source = target; + }, + }, + }, + ai: { + combo: "yichong", + }, + }, + //张嶷 + xinwurong: { + audio: 3, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + player + .chooseToDuiben(target) + .set("title", "谋弈") + .set("namelist", ["反抗", "归顺", "镇压", "安抚"]) + .set("translationList", [`对方选择镇压:${get.translation(player)}对你造成1点伤害,然后其摸1张牌
    对方选择安抚:${get.translation(player)}受到1点伤害,然后其摸2张牌`, `对方选择镇压:${get.translation(player)}获得你1张牌,然后其交给你2张牌
    对方选择安抚:你须交给${get.translation(player)}两张牌(若你牌数不足2张,则改为其令你跳过你下个摸牌阶段)`, `对方选择反抗:你对${get.translation(target)}造成1点伤害,然后你摸1张牌
    对方选择归顺:你获得${get.translation(target)}1张牌,然后你交给其2张牌`, `对方选择反抗:你受到1点伤害,然后你摸2张牌
    对方选择归顺:${get.translation(target)}须交给你两张牌(若其牌数不足两张,则改为令其跳过其下个摸牌阶段)`]) + .set("ai", button => 1 + Math.random()); + "step 1"; + if (result.bool) { + if (result.player == "db_def1") { + target.damage(); + player.draw(); + event.finish(); + } else { + var cards = target.getCards("he"); + if (cards.length < 2) { + target.skip("phaseDraw"); + target.addTempSkill("xinwurong_skip", { player: "phaseDrawSkipped" }); + event.finish(); + } else if (cards.length == 2) event._result = { bool: true, cards: cards }; + else target.chooseCard("怃戎:交给" + get.translation(player) + "两张牌", 2, true, "he"); + } + } else { + if (result.player == "db_def1") { + player.gainPlayerCard(target, "he", true); + event.goto(3); + } else { + player.damage(); + player.draw(2); + event.finish(); + } + } + "step 2"; + if (result.bool) player.gain(result.cards, target, "giveAuto"); + event.finish(); + "step 3"; + var cards = player.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length <= 2) event._result = { bool: true, cards: cards }; + else player.chooseCard("怃戎:交给" + get.translation(target) + "两张牌", 2, true, "he"); + "step 4"; + if (result.bool) target.gain(result.cards, player, "giveAuto"); + }, + ai: { + order: 7, + result: { + player: 1, + target: -1, + }, + }, + subSkill: { + skip: { + charlotte: true, + mark: true, + intro: { content: "跳过下个摸牌阶段" }, + }, + }, + }, + //孙亮 + xinkuizhu: { + audio: "nzry_kuizhu", + trigger: { player: "phaseDiscardAfter" }, + filter: function (event, player) { + return player.getHistory("lose", function (evt) { + return evt.type == "discard" && evt.getParent("phaseDiscard") == event; + }).length; + }, + direct: true, + content: function () { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) cards.addArray(evt.cards2); + }); + event.num = cards.length; + event.str1 = "令至多" + event.num + "名角色摸一张牌"; + event.str2 = "对任意名体力值之和为" + event.num + "的角色造成1点伤害"; + player + .chooseControl("cancel2") + .set("ai", function () { + if ( + game.countPlayer(function (current) { + return get.attitude(player, current) < 0 && current.hp == event.num; + }) > 0 && + event.num <= 3 + ) + return 1; + return 0; + }) + .set("choiceList", [event.str1, event.str2]) + .set("prompt", "是否发动【溃诛】?"); + "step 1"; + if (result.control == "cancel2") event.finish(); + event.control = [event.str1, event.str2][result.index]; + "step 2"; + var str = "请选择〖溃诛〗的目标"; + if (event.bool == false) str = "
    所选目标体力之和不足" + event.num + ",请重选"; + if (event.control == event.str2) { + player + .chooseTarget(str, function (card, player, target) { + var targets = ui.selected.targets; + var num = 0; + for (var i = 0; i < targets.length; i++) num += targets[i].hp; + return num + target.hp <= _status.event.num; + }) + .set("ai", function (target) { + if (ui.selected.targets[0] != undefined) return -1; + return get.attitude(player, target) < 0; + }) + .set("promptbar", "none") + .set("num", event.num) + .set("selectTarget", function () { + var targets = ui.selected.targets; + var num = 0; + for (var i = 0; i < targets.length; i++) num += targets[i].hp; + if (num == _status.event.num) return ui.selected.targets.length; + return ui.selected.targets.length + 1; + }); + } else { + player.chooseTarget("请选择〖溃诛〗的目标", "令至多" + get.cnNumber(event.num) + "名角色各摸一张牌", [1, event.num]).set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + } + "step 3"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + if (event.control == event.str1) { + player.logSkill("xinkuizhu", targets); + game.asyncDraw(targets); + } else { + var num = 0; + for (var i = 0; i < targets.length; i++) num += targets[i].hp; + if (num < event.num) { + event.bool = false; + event.goto(2); + } else { + player.logSkill("xinkuizhu", targets); + for (var i of targets) i.damage(); + if (targets.length >= 2) player.loseHp(); + } + } + } + }, + }, + xinzhizheng: { + audio: "nzry_zhizheng", + mod: { + playerEnabled: function (card, player, target) { + var info = get.info(card); + if (target != player && (!info || !info.singleCard || !ui.selected.targets.length) && player.isPhaseUsing() && !target.inRange(player)) return false; + }, + }, + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return ( + player.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; + }).length < + game.countPlayer(function (current) { + return current != player && !current.inRange(player); + }) && + game.hasPlayer(function (target) { + return target != player && !target.inRange(player) && target.countDiscardableCards(player, "he"); + }) + ); + }, + forced: true, + content: function () { + "step 0"; + player + .chooseTarget("请选择〖掣政〗的目标", "弃置一名攻击范围内不包含你的角色的一张牌", true, function (card, player, target) { + return target != player && !target.inRange(player) && target.countDiscardableCards(player, "he"); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + "step 1"; + if (result.bool) { + player.line(result.targets); + player.discardPlayerCard(result.targets[0], "he", true); + } + }, + }, + xinlijun: { + unique: true, + audio: "nzry_lijun1", + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (_status.currentPhase != event.player || event.player.group != "wu") return false; + if (!player.hasZhuSkill("xinlijun", event.player) || player == event.player) return false; + return event.cards.filterInD().length; + }, + zhuSkill: true, + direct: true, + content: function () { + "step 0"; + trigger.player.chooseBool(get.prompt("xinlijun"), "将" + get.translation(trigger.cards) + "交给" + get.translation(player)).set("choice", get.attitude(trigger.player, player) > 0); + "step 1"; + if (result.bool) { + player.logSkill("xinlijun", trigger.player); + player.gain(trigger.cards.filterInD(), "gain2"); + player + .chooseBool() + .set("prompt", "是否令" + get.translation(trigger.player) + "摸一张牌?") + .set("choice", get.attitude(player, trigger.player) > 0); + } else event.finish(); + "step 2"; + if (result.bool) trigger.player.draw(); + }, + }, + //十常侍 + mbdanggu: { + audio: 2, + trigger: { + player: "enterGame", + global: "phaseBefore", + }, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + derivation: ["mbdanggu_faq", "mbdanggu_faq2"], + forced: true, + unique: true, + onremove: function (player) { + delete player.storage.mbdanggu; + delete player.storage.mbdanggu_current; + if (lib.skill.mbdanggu.isSingleShichangshi(player)) { + game.broadcastAll(function (player) { + player.name1 = player.name; + player.smoothAvatar(false); + player.node.avatar.setBackground(player.name, "character"); + player.node.name.innerHTML = get.slimName(player.name); + delete player.name2; + player.classList.remove("fullskin2"); + player.node.avatar2.classList.add("hidden"); + player.node.name2.innerHTML = ""; + if (player == game.me && ui.fakeme) { + ui.fakeme.style.backgroundImage = player.node.avatar.style.backgroundImage; + } + }, player); + } + }, + changshi: [ + ["scs_zhangrang", "scstaoluan"], + ["scs_zhaozhong", "scschiyan"], + ["scs_sunzhang", "scszimou"], + ["scs_bilan", "scspicai"], + ["scs_xiayun", "scsyaozhuo"], + ["scs_hankui", "scsxiaolu"], + ["scs_lisong", "scskuiji"], + ["scs_duangui", "scschihe"], + ["scs_guosheng", "scsniqu"], + ["scs_gaowang", "scsmiaoyu"], + ], + conflictMap: function (player) { + if (!_status.changshiMap) { + _status.changshiMap = { + scs_zhangrang: [], + scs_zhaozhong: [], + scs_sunzhang: [], + scs_bilan: ["scs_hankui"], + scs_xiayun: [], + scs_hankui: ["scs_bilan"], + scs_lisong: [], + scs_duangui: ["scs_guosheng"], + scs_guosheng: ["scs_duangui"], + scs_gaowang: [], + }; + if (!get.isLuckyStar(player)) { + var list = lib.skill.mbdanggu.changshi.map(i => i[0]); + for (var i of list) { + var select = list.filter(scs => scs != i && !_status.changshiMap[i].includes(i)); + _status.changshiMap[i].addArray(select.randomGets(get.rand(0, select.length))); + } + } + } + return _status.changshiMap; + }, + group: "mbdanggu_back", + content: function () { + "step 0"; + var list = lib.skill.mbdanggu.changshi.map(i => i[0]); + player.markAuto("mbdanggu", 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.$draw(cards, "nobroadcast"); + }, + player, + list + ); + "step 1"; + var next = game.createEvent("mbdanggu_clique"); + next.player = player; + next.setContent(lib.skill.mbdanggu.contentx); + }, + contentx: function () { + "step 0"; + var list = player.getStorage("mbdanggu").slice(); + var first = list.randomRemove(); + event.first = first; + var others = list.randomGets(4); + if (others.length == 1) event._result = { bool: true, links: others }; + else { + var map = { + scs_bilan: "scs_hankui", + scs_hankui: "scs_bilan", + scs_duangui: "scs_guosheng", + scs_guosheng: "scs_duangui", + }, + map2 = lib.skill.mbdanggu.conflictMap(player); + var conflictList = others.filter(changshi => { + if (map[first] && others.some(changshi2 => map[first] == changshi2)) return map[first] == changshi; + else return map2[first].includes(changshi); + }), + list = others.slice(); + if (conflictList.length) { + var conflict = conflictList.randomGet(); + list.remove(conflict); + game.broadcastAll( + function (changshi, player) { + if (lib.config.background_speak) { + if (player.isUnderControl(true)) game.playAudio("skill", changshi + "_enter"); + } + }, + conflict, + player + ); + } + player + .chooseButton(["党锢:请选择结党对象", [[first], "character"], '
    可选常侍
    ', [others, "character"]], true) + .set("filterButton", button => { + return _status.event.canChoose.includes(button.link); + }) + .set("canChoose", list) + .set("ai", button => Math.random() * 10); + } + "step 1"; + if (result.bool) { + var first = event.first; + var chosen = result.links[0]; + var skills = []; + var list = lib.skill.mbdanggu.changshi; + var changshis = [first, chosen]; + player.unmarkAuto("mbdanggu", changshis); + player.storage.mbdanggu_current = changshis; + for (var changshi of changshis) { + for (var cs of list) { + if (changshi == cs[0]) skills.push(cs[1]); + } + } + if (lib.skill.mbdanggu.isSingleShichangshi(player)) { + game.broadcastAll( + function (player, first, chosen) { + player.name1 = first; + player.node.avatar.setBackground(first, "character"); + player.node.name.innerHTML = get.slimName(first); + player.name2 = chosen; + player.classList.add("fullskin2"); + player.node.avatar2.classList.remove("hidden"); + player.node.avatar2.setBackground(chosen, "character"); + player.node.name2.innerHTML = get.slimName(chosen); + if (player == game.me && ui.fakeme) { + ui.fakeme.style.backgroundImage = player.node.avatar.style.backgroundImage; + } + }, + player, + first, + chosen + ); + } + game.log(player, "选择了常侍", "#y" + get.translation(changshis)); + if (skills.length) { + player.addAdditionalSkill("mbdanggu", skills); + var str = ""; + for (var i of skills) { + str += "【" + get.translation(i) + "】、"; + player.popup(i); + } + str = str.slice(0, -1); + game.log(player, "获得了技能", "#g" + str); + } + } + }, + isSingleShichangshi: function (player) { + var map = lib.skill.mbdanggu.conflictMap(player); + return player.name == "shichangshi" && ((map[player.name1] && map[player.name2]) || (map[player.name1] && !player.name2) || (!player.name1 && !player.name2) || (player.name == player.name1 && !player.name2)); + }, + mod: { + aiValue: function (player, card, num) { + if (["shan", "tao", "wuxie", "caochuan"].includes(card.name)) return num / 10; + }, + aiUseful: function () { + return lib.skill.mbdanggu.mod.aiValue.apply(this, arguments); + }, + }, + ai: { + combo: "mbmowang", + nokeep: true, + }, + intro: { + mark: function (dialog, storage, player) { + dialog.addText("剩余常侍"); + dialog.addSmall([storage, "character"]); + if (player.storage.mbdanggu_current && player.isIn()) { + dialog.addText("当前常侍"); + dialog.addSmall([player.storage.mbdanggu_current, "character"]); + } + }, + }, + subSkill: { + back: { + audio: "mbdanggu", + trigger: { global: "restEnd" }, + filter: function (event, player) { + return event.getTrigger().player == player; + }, + forced: true, + content: function () { + "step 0"; + delete player.storage.mbdanggu_current; + if (lib.skill.mbdanggu.isSingleShichangshi(player)) { + game.broadcastAll(function (player) { + player.name1 = player.name; + player.smoothAvatar(false); + player.node.avatar.setBackground(player.name, "character"); + player.node.name.innerHTML = get.slimName(player.name); + delete player.name2; + player.classList.remove("fullskin2"); + player.node.avatar2.classList.add("hidden"); + player.node.name2.innerHTML = ""; + if (player == game.me && ui.fakeme) { + ui.fakeme.style.backgroundImage = player.node.avatar.style.backgroundImage; + } + }, player); + } + "step 1"; + var next = game.createEvent("mbdanggu_clique"); + next.player = player; + next.setContent(lib.skill.mbdanggu.contentx); + player.draw(); + }, + }, + }, + }, + mbmowang: { + audio: 2, + trigger: { player: "dieBefore" }, + filter: function (event, player) { + return player.getStorage("mbdanggu").length && event.getParent().name != "giveup" && player.maxHp > 0; + }, + derivation: "mbmowang_faq", + forced: true, + direct: true, + priority: 15, + group: ["mbmowang_die", "mbmowang_return"], + content: function () { + if (_status.mbmowang_return && _status.mbmowang_return[player.playerid]) { + trigger.cancel(); + } else { + player.logSkill("mbmowang"); + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("die", "shichangshiRest"); + }); + trigger.setContent(lib.skill.mbmowang.dieContent); + trigger.includeOut = true; + } + }, + ai: { + combo: "mbdanggu", + neg: true, + }, + dieContent: function () { + "step 0"; + event.forceDie = true; + if (source) { + game.log(player, "被", source, "杀害"); + if (source.stat[source.stat.length - 1].kill == undefined) { + source.stat[source.stat.length - 1].kill = 1; + } else { + source.stat[source.stat.length - 1].kill++; + } + } else { + game.log(player, "阵亡"); + } + if (player.isIn() && (!_status.mbmowang_return || !_status.mbmowang_return[player.playerid])) { + event.reserveOut = true; + game.log(player, "进入了修整状态"); + game.log(player, "移出了游戏"); + //game.addGlobalSkill('mbmowang_return'); + if (!_status.mbmowang_return) _status.mbmowang_return = {}; + _status.mbmowang_return[player.playerid] = 1; + } else event.finish(); + if (!game.countPlayer()) game.over(); + else if (player.hp != 0) { + player.changeHp(0 - player.hp, false).forceDie = true; + } + game.broadcastAll(function (player) { + if (player.isLinked()) { + if (get.is.linked2(player)) { + player.classList.toggle("linked2"); + } else { + player.classList.toggle("linked"); + } + } + if (player.isTurnedOver()) { + player.classList.toggle("turnedover"); + } + }, player); + game.addVideo("link", player, player.isLinked()); + game.addVideo("turnOver", player, player.classList.contains("turnedover")); + "step 1"; + event.trigger("die"); + "step 2"; + if (event.reserveOut) { + if (!game.reserveDead) { + for (var mark in player.marks) { + if (mark == "mbdanggu") continue; + player.unmarkSkill(mark); + } + var count = 1; + var list = Array.from(player.node.marks.childNodes); + if (list.some(i => i.name == "mbdanggu")) count++; + while (player.node.marks.childNodes.length > count) { + var node = player.node.marks.lastChild; + if (node.name == "mbdanggu") { + node = node.previousSibling; + } + node.remove(); + } + game.broadcast( + function (player, count) { + while (player.node.marks.childNodes.length > count) { + var node = player.node.marks.lastChild; + if (node.name == "mbdanggu") { + node = node.previousSibling; + } + node.remove(); + } + }, + player, + count + ); + } + for (var i in player.tempSkills) { + player.removeSkill(i); + } + var skills = player.getSkills(); + for (var i = 0; i < skills.length; i++) { + if (lib.skill[skills[i]].temp) { + player.removeSkill(skills[i]); + } + } + event.cards = player.getCards("hejsx"); + if (event.cards.length) { + player.discard(event.cards).forceDie = true; + } + } + "step 3"; + if (event.reserveOut) { + game.broadcastAll( + function (player, list) { + player.classList.add("out"); + if (list.includes(player.name1) || player.name1 == "shichangshi") { + player.smoothAvatar(false); + player.node.avatar.setBackground(player.name1 + "_dead", "character"); + } + if (list.includes(player.name2) || player.name2 == "shichangshi") { + player.smoothAvatar(true); + player.node.avatar2.setBackground(player.name2 + "_dead", "character"); + } + }, + player, + lib.skill.mbdanggu.changshi.map(i => i[0]) + ); + } + if (source && lib.config.border_style == "auto" && (lib.config.autoborder_count == "kill" || lib.config.autoborder_count == "mix")) { + switch (source.node.framebg.dataset.auto) { + case "gold": + case "silver": + source.node.framebg.dataset.auto = "gold"; + break; + case "bronze": + source.node.framebg.dataset.auto = "silver"; + break; + default: + source.node.framebg.dataset.auto = lib.config.autoborder_start || "bronze"; + } + if (lib.config.autoborder_count == "kill") { + source.node.framebg.dataset.decoration = source.node.framebg.dataset.auto; + } else { + var dnum = 0; + for (var j = 0; j < source.stat.length; j++) { + if (source.stat[j].damage != undefined) dnum += source.stat[j].damage; + } + source.node.framebg.dataset.decoration = ""; + switch (source.node.framebg.dataset.auto) { + case "bronze": + if (dnum >= 4) source.node.framebg.dataset.decoration = "bronze"; + break; + case "silver": + if (dnum >= 8) source.node.framebg.dataset.decoration = "silver"; + break; + case "gold": + if (dnum >= 12) source.node.framebg.dataset.decoration = "gold"; + break; + } + } + source.classList.add("topcount"); + } + }, + subSkill: { + die: { + audio: "mbmowang", + trigger: { player: "phaseAfter" }, + forced: true, + forceDie: true, + content: function () { + "step 0"; + if (lib.skill.mbdanggu.isSingleShichangshi(player)) { + if (!player.getStorage("mbdanggu").length) { + game.broadcastAll(function (player) { + player.name1 = player.name; + player.smoothAvatar(false); + player.node.avatar.setBackground(player.name + "_dead", "character"); + player.node.name.innerHTML = get.slimName(player.name); + delete player.name2; + player.classList.remove("fullskin2"); + player.node.avatar2.classList.add("hidden"); + player.node.name2.innerHTML = ""; + if (player == game.me && ui.fakeme) { + ui.fakeme.style.backgroundImage = player.node.avatar.style.backgroundImage; + } + }, player); + } + } + if (!player.getStorage("mbdanggu").length) { + game.delay(); + } + "step 1"; + player.die(); + }, + }, + return: { + trigger: { player: "phaseBefore" }, + forced: true, + charlotte: true, + silent: true, + forceDie: true, + forceOut: true, + filter: function (event, player) { + return !event._mbmowang_return && event.player.isOut() && _status.mbmowang_return[event.player.playerid]; + }, + content: function () { + "step 0"; + trigger._mbmowang_return = true; + game.broadcastAll(function (player) { + player.classList.remove("out"); + }, trigger.player); + game.log(trigger.player, "移回了游戏"); + delete _status.mbmowang_return[trigger.player.playerid]; + trigger.player.recover(trigger.player.maxHp - trigger.player.hp); + game.broadcastAll(function (player) { + if (player.name1 == "shichangshi") { + player.smoothAvatar(false); + player.node.avatar.setBackground(player.name1, "character"); + } + if (player.name2 == "shichangshi") { + player.smoothAvatar(true); + player.node.avatar2.setBackground(player.name2, "character"); + } + }, trigger.player); + "step 1"; + event.trigger("restEnd"); + }, + }, + }, + }, + //张让 + scstaoluan: { + audio: 1, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("hes") > 0; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if (name == "sha") { + list.push(["基本", "", "sha"]); + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } else if (get.type(name) == "trick") list.push(["锦囊", "", name]); + else if (get.type(name) == "basic") 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) { + var player = _status.event.player; + if (player.countCards("hs", button.link[2]) > 0) return 0; + if (button.link[2] == "wugu") return; + var effect = player.getUseValue(button.link[2]); + if (effect > 0) return effect; + return 0; + }, + backup: function (links, player) { + return { + filterCard: true, + audio: "scstaoluan", + selectCard: 1, + popname: true, + check: function (card) { + return 6 - get.value(card); + }, + position: "hes", + viewAs: { name: links[0][2], nature: links[0][3] }, + }; + }, + prompt: function (links, player) { + return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 4, + result: { + player: 1, + }, + threaten: 1.9, + }, + }, + //赵忠 + scschiyan: { + audio: 1, + shaRelated: true, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && event.target.hp > 0 && event.target.countCards("he") > 0; + }, + content: function () { + "step 0"; + var next = player.choosePlayerCard(trigger.target, "he", get.prompt("scschiyan", trigger.target)); + next.set("ai", function (button) { + if (!_status.event.goon) return 0; + var val = get.value(button.link); + if (button.link == _status.event.target.getEquip(2)) return 2 * (val + 3); + return val; + }); + next.set("goon", get.attitude(player, trigger.target) <= 0); + next.set("forceAuto", true); + "step 1"; + if (result.bool) { + var target = trigger.target; + player.logSkill("scschiyan", target); + target.addSkill("scschiyan_get"); + target.addToExpansion("giveAuto", result.cards, target).gaintag.add("scschiyan_get"); + } + }, + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (get.attitude(player, arg.target) > 0) return false; + if (tag == "directHit_ai") return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; + return false; + }, + }, + group: "scschiyan_damage", + subSkill: { + get: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("scschiyan_get").length > 0; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("scschiyan_get"); + player.gain(cards, "draw"); + game.log(player, "收回了" + get.cnNumber(cards.length) + "张“鸱咽”牌"); + "step 1"; + player.removeSkill("scschiyan_get"); + }, + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("scschiyan_get"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + }, + }, + damage: { + audio: "scschiyan", + trigger: { source: "damageBegin1" }, + forced: true, + locked: false, + logTarget: "player", + filter: function (event, player) { + var target = event.player; + return event.getParent().name == "sha" && player.countCards("h") >= target.countCards("h") && player.countCards("e") >= target.countCards("e"); + }, + content: function () { + trigger.num++; + }, + }, + }, + }, + //孙璋 + scszimou: { + audio: 1, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var num = player.getHistory("useCard", evtx => evtx.getParent("phaseUse") == evt).length; + return num == 2 || num == 4 || num == 6; + }, + content: function () { + var evt = trigger.getParent("phaseUse"); + var num = player.getHistory("useCard", evtx => evtx.getParent("phaseUse") == evt).length; + var cards = []; + if (num == 2) { + var card = get.cardPile2(card => { + return ["jiu", "xionghuangjiu"].includes(card.name); + }); + if (card) cards.push(card); + } else if (num == 4) { + var card = get.cardPile2(card => { + return card.name == "sha"; + }); + if (card) cards.push(card); + } else if (num == 6) { + var card = get.cardPile2(card => { + return card.name == "juedou"; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + }, + }, + //毕岚 + scspicai: { + audio: 1, + enable: "phaseUse", + usable: 1, + frequent: true, + content: function () { + "step 0"; + event.cards = []; + event.suits = []; + "step 1"; + player + .judge(function (result) { + var evt = _status.event.getParent("scspicai"); + if (evt && evt.suits && evt.suits.includes(get.suit(result))) return 0; + return 1; + }) + .set("callback", lib.skill.scspicai.callback).judge2 = function (result) { + return result.bool ? true : false; + }; + "step 2"; + var cards = cards.filterInD(); + if (cards.length) + player.chooseTarget("将" + get.translation(cards) + "交给一名角色", true).set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + else event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.gain(cards, "gain2").giver = player; + } else event.finish(); + }, + callback: function () { + "step 0"; + var evt = event.getParent(2); + event.getParent().orderingCards.remove(event.judgeResult.card); + evt.cards.push(event.judgeResult.card); + if (event.getParent().result.bool) { + evt.suits.push(event.getParent().result.suit); + player.chooseBool("是否继续发动【庀材】?").set("frequentSkill", "scspicai"); + } else event._result = { bool: false }; + "step 1"; + if (result.bool) event.getParent(2).redo(); + }, + ai: { + order: 9, + result: { + player: 1, + }, + }, + }, + //夏恽 + scsyaozhuo: { + audio: 1, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return player.canCompare(current); + }); + }, + filterTarget: function (card, player, current) { + return player.canCompare(current); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + target.skip("phaseDraw"); + target.addTempSkill("scsyaozhuo_skip", { player: "phaseDrawSkipped" }); + } else player.chooseToDiscard(2, true, "he"); + }, + subSkill: { + skip: { + mark: true, + intro: { content: "跳过下一个摸牌阶段" }, + }, + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.skipList.includes("phaseDraw") || target.hasSkill("pingkou")) return 0; + 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 - 2 && hs[0].number > 5) return -1; + return 0; + }, + }, + }, + }, + //韩悝 + scsxiaolu: { + audio: 1, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + player.draw(2); + "step 1"; + var num = player.countCards("he"); + if (!num) event.finish(); + else if (num < 2) event._result = { index: 1 }; + else + player + .chooseControl() + .set("choiceList", ["将两张牌交给一名其他角色", "弃置两张牌"]) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) + return 0; + return 1; + }); + "step 2"; + if (result.index == 0) { + player.chooseCardTarget({ + position: "he", + filterCard: true, + selectCard: 2, + filterTarget: function (card, player, target) { + return player != target; + }, + ai1: function (card) { + return get.unuseful(card); + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 5; + return att; + }, + prompt: "选择两张牌,交给一名其他角色", + forced: true, + }); + } else { + player.chooseToDiscard(2, true, "he"); + event.finish(); + } + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.give(result.cards, target); + } + }, + ai: { + order: 9, + result: { player: 2 }, + }, + }, + //栗嵩 + scskuiji: { + audio: 1, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + event.list1 = []; + event.list2 = []; + if (player.countCards("h") > 0) { + var chooseButton = player.chooseButton(4, ["你的手牌", player.getCards("h"), get.translation(target.name) + "的手牌", target.getCards("h")]); + } else { + var chooseButton = player.chooseButton(4, [get.translation(target.name) + "的手牌", target.getCards("h")]); + } + chooseButton.set("target", target); + chooseButton.set("ai", function (button) { + var player = _status.event.player; + var target = _status.event.target; + var ps = []; + var ts = []; + for (var i = 0; i < ui.selected.buttons.length; i++) { + var card = ui.selected.buttons[i].link; + if (target.getCards("h").includes(card)) ts.push(card); + else ps.push(card); + } + var card = button.link; + var owner = get.owner(card); + var val = get.value(card) || 1; + if (owner == target) { + return 2 * val; + } + return 7 - val; + }); + chooseButton.set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.suit(button.link) == get.suit(ui.selected.buttons[i].link)) return false; + } + return true; + }); + "step 1"; + if (result.bool) { + var list = result.links; + for (var i = 0; i < list.length; i++) { + if (get.owner(list[i]) == player) { + event.list1.push(list[i]); + } else { + event.list2.push(list[i]); + } + } + if (event.list1.length && event.list2.length) { + game.loseAsync({ + lose_list: [ + [player, event.list1], + [target, event.list2], + ], + discarder: player, + }).setContent("discardMultiple"); + } else if (event.list2.length) { + target.discard(event.list2); + } else player.discard(event.list1); + } + }, + ai: { + order: 13, + result: { + target: -1, + }, + }, + }, + //段珪 + scschihe: { + audio: 1, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.targets.length == 1 && event.card.name == "sha"; + }, + prompt2: function (event, player) { + var str = "亮出牌堆顶的两张牌并增加伤害;且"; + str += "令" + get.translation(event.target) + "不能使用"; + str += "这两张牌所包含的花色"; + str += "的牌响应" + get.translation(event.card); + return str; + }, + logTarget: "target", + locked: false, + check: function (event, player) { + var target = event.target; + if (get.attitude(player, target) > 0) return false; + return true; + }, + content: function () { + var num = 2; + var evt = trigger.getParent(); + var suit = get.suit(trigger.card); + var suits = []; + if (num > 0) { + if (typeof evt.baseDamage != "number") evt.baseDamage = 1; + var cards = get.cards(num); + player.showCards(cards.slice(0), get.translation(player) + "发动了【叱吓】"); + while (cards.length > 0) { + var card = cards.pop(); + var suitx = get.suit(card, false); + suits.add(suitx); + if (suit == suitx) evt.baseDamage++; + } + game.updateRoundNumber(); + } + evt._scschihe_player = player; + var target = trigger.target; + target.addTempSkill("scschihe_block"); + if (!target.storage.scschihe_block) target.storage.scschihe_block = []; + target.storage.scschihe_block.push([evt.card, suits]); + lib.skill.scschihe.updateBlocker(target); + }, + updateBlocker: function (player) { + var list = [], + storage = player.storage.scschihe_block; + if (storage && storage.length) { + for (var i of storage) list.addArray(i[1]); + } + player.storage.scschihe_blocker = list; + }, + ai: { + threaten: 2.5, + halfneg: true, + }, + subSkill: { + block: { + mod: { + cardEnabled: function (card, player) { + if (!player.storage.scschihe_blocker) return; + var suit = get.suit(card); + if (suit == "none" || suit == "unsure") return; + var evt = _status.event; + if (evt.name != "chooseToUse") evt = evt.getParent("chooseToUse"); + if (!evt || !evt.respondTo || evt.respondTo[1].name != "sha") return; + if (player.storage.scschihe_blocker.includes(suit)) return false; + }, + }, + trigger: { + player: ["damageBefore", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], + global: ["useCardEnd"], + }, + forced: true, + firstDo: true, + charlotte: true, + popup: false, + onremove: function (player) { + delete player.storage.scschihe_block; + delete player.storage.scschihe_blocker; + }, + filter: function (event, player) { + if (!event.card || !player.storage.scschihe_block) return false; + for (var i of player.storage.scschihe_block) { + if (i[0] == event.card) return true; + } + return false; + }, + content: function () { + var storage = player.storage.scschihe_block; + for (var i = 0; i < storage.length; i++) { + if (storage[i][0] == trigger.card) { + storage.splice(i--, 1); + } + } + if (!storage.length) player.removeSkill("scschihe_block"); + else lib.skill.scschihe.updateBlocker(target); + }, + }, + }, + }, + //郭胜 + scsniqu: { + audio: 1, + enable: "phaseUse", + usable: 1, + filterTarget: true, + selectTarget: 1, + content: function () { + target.damage("fire"); + }, + ai: { + expose: 0.2, + order: 5, + result: { + target: function (player, target) { + return get.damageEffect(target, player, target, "fire") / 10; + }, + }, + }, + }, + //高望 + scsanruo: { + audio: 1, + enable: ["chooseToUse", "chooseToRespond"], + prompt: "将一张♥牌当做桃,♦牌当做火杀,♣牌当做闪,♠牌当做无懈可击使用或打出", + viewAs: function (cards, player) { + var name = false; + var nature = null; + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "fire"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; + } + if (name) return { name: name, nature: nature }; + return null; + }, + check: function (card) { + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; + var name2; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 + ) { + var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); + if (temp > max) { + max = temp; + name2 = map[name]; + } + } + } + if (name2 == get.suit(card, player)) return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); + return 0; + } + return 1; + }, + position: "hes", + filterCard: function (card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; + if (name == "diamond" && filter({ name: "sha", cards: [card], nature: "fire" }, player, event)) return true; + if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) return true; + if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; + return false; + }, + filter: function (event, player) { + var filter = event.filterCard; + if (filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && player.countCards("hes", { suit: "diamond" })) return true; + if (filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && player.countCards("hes", { suit: "club" })) return true; + if (filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && player.countCards("hes", { suit: "heart" })) return true; + if (filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && player.countCards("hes", { suit: "spade" })) return true; + return false; + }, + precontent: function () { + "step 0"; + player.addTempSkill("scsanruo_effect"); + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + var name; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; + } + if (!player.countCards("hes", { suit: name })) return false; + }, + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; + } + } + max /= 1.1; + return max; + } + return 2; + }, + }, + hiddenCard: function (player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hes") > 0) return true; + if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; + if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; + }, + subSkill: { + effect: { + audio: "scsanruo", + trigger: { + player: ["useCard", "respond"], + }, + filter: function (event, player) { + return event.skill == "scsanruo"; + }, + direct: true, + forced: true, + charlotte: true, + content: function () { + "step 0"; + var name = trigger.card.name; + var next = game.createEvent("scsanruo_" + name); + next.player = player; + next.setContent(lib.skill.scsanruo_effect[name == "shan" ? "sha" : name] || function () {}); + }, + sha: function () { + "step 0"; + var trigger = event.getParent().getTrigger(); + if (trigger.name == "useCard") { + var target = lib.skill.chongzhen.logTarget(trigger, player); + } else { + var target = trigger.source; + } + event.target = target; + if (!target || !target.countGainableCards(player, "he")) event._result = { bool: false }; + else + player + .chooseBool(get.prompt("scsanruo_effect", target), "获得该角色的一张牌") + .set("ai", () => { + return _status.event.goon; + }) + .set("goon", get.attitude(player, target) < 1); + "step 1"; + if (result.bool) { + player.logSkill("scsanruo_effect", target); + player.gainPlayerCard(target, "he", true); + } + }, + tao: function () { + "step 0"; + player + .chooseTarget(get.prompt("scsanruo"), "获得一名其他角色的一张牌", (card, player, target) => { + return target.countGainableCards(player, "he") && target != player; + }) + .set("ai", target => { + return 1 - get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("scsanruo_effect", target); + player.gainPlayerCard(target, "he", true); + } + }, + wuxie: function () { + "step 0"; + var trigger = event.getParent().getTrigger(); + if (!trigger.respondTo) { + event.finish(); + return; + } + var target = trigger.respondTo[0]; + event.target = target; + if (!target || !target.countGainableCards(player, player == target ? "e" : "he")) event._result = { bool: false }; + else + player + .chooseBool(get.prompt("scsanruo_effect", target), "获得该角色的一张牌") + .set("ai", () => { + return _status.event.goon; + }) + .set("goon", get.attitude(player, target) < 1); + "step 1"; + if (result.bool) { + player.logSkill("scsanruo_effect", target); + player.gainPlayerCard(target, player == target ? "e" : "he", true); + } + }, + }, + }, + }, + scsmiaoyu: { + audio: "scsanruo", + enable: ["chooseToUse", "chooseToRespond"], + prompt: "将至多两张♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】使用或打出", + viewAs: function (cards, player) { + var name = false; + var nature = null; + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "fire"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; + } + //返回判断结果 + if (name) return { name: name, nature: nature }; + return null; + }, + check: function (card) { + if (ui.selected.cards.length) return 0; + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; + var name2; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 + ) { + var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); + if (temp > max) { + max = temp; + name2 = map[name]; + } + } + } + if (name2 == get.suit(card, player)) return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); + return 0; + } + return 1; + }, + selectCard: [1, 2], + complexCard: true, + position: "hes", + filterCard: function (card, player, event) { + if (ui.selected.cards.length) return get.suit(card, player) == get.suit(ui.selected.cards[0], player); + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; + if (name == "diamond" && filter({ name: "sha", cards: [card], nature: "fire" }, player, event)) return true; + if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) return true; + if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; + return false; + }, + filter: function (event, player) { + var filter = event.filterCard; + if (filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && player.countCards("hes", { suit: "diamond" })) return true; + if (filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && player.countCards("hes", { suit: "club" })) return true; + if (filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && player.countCards("hes", { suit: "heart" })) return true; + if (filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && player.countCards("hes", { suit: "spade" })) return true; + return false; + }, + precontent: function () { + player.addTempSkill("scsmiaoyu_num"); + player.addTempSkill("scsmiaoyu_discard"); + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + var name; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; + } + if (!player.countCards("hes", { suit: name })) return false; + }, + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; + } + } + max /= 1.1; + return max; + } + return 2; + }, + }, + hiddenCard: function (player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hs") > 0) return true; + if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; + if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; + }, + subSkill: { + num: { + charlotte: true, + trigger: { player: "useCard" }, + filter: function (event) { + return ["sha", "tao"].includes(event.card.name) && event.skill == "scsmiaoyu" && event.cards && event.cards.length == 2; + }, + forced: true, + popup: false, + content: function () { + trigger.baseDamage++; + }, + }, + discard: { + charlotte: true, + trigger: { player: ["useCardAfter", "respondAfter"] }, + autodelay: function (event) { + return event.name == "respond" ? 0.5 : false; + }, + filter: function (event, player) { + return ["shan", "wuxie"].includes(event.card.name) && event.skill == "scsmiaoyu" && event.cards && event.cards.length == 2 && _status.currentPhase && _status.currentPhase != player && _status.currentPhase.countDiscardableCards(player, "he"); + }, + forced: true, + popup: false, + content: function () { + player.line(_status.currentPhase, "green"); + player.discardPlayerCard(_status.currentPhase, "he", true); + }, + }, + }, + }, + //牵招 + mbshihe: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => player.canCompare(current)); + }, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + target.addTempSkill("mbshihe_prevent", { player: "phaseAfter" }); + target.markAuto("mbshihe_prevent", [player]); + } else { + var cards = player.getCards("he", card => { + return lib.filter.cardDiscardable(card, player, "mbshihe"); + }); + if (cards.length > 0) player.discard(cards.randomGet()); + } + }, + ai: { + order: 6, + result: { + player: function (player, target) { + if ((get.realAttitude || get.attitude)(target, player) >= 0 || get.damageEffect(player, target, player) >= 0) return 0; + var card = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); + })[0]; + return get.number(card) >= 10 || (get.number(card) >= 7 && target.countCards("h") <= 2) ? 1 : -1; + }, + }, + }, + subSkill: { + prevent: { + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + if (get.mode() == "identity") return player.getStorage("mbshihe_prevent").includes(event.player); + return player.getStorage("mbshihe_prevent").some(target => event.player.isFriendOf(target)); + }, + onremove: true, + forced: true, + charlotte: true, + content: function () { + trigger.cancel(); + }, + mark: true, + marktext: "吓", + intro: { + content: function (storage, player) { + var targets = storage.filter(i => i.isIn()); + return "被" + get.translation(targets) + "吓到了,对他" + (targets.length > 1 ? "们" : "") + (get.mode() != "identity" ? "和他的友方角色" : "") + "打不出伤害"; + }, + }, + ai: { + effect: { + player: function (card, player, target, current) { + if (get.tag(card, "damage")) { + var bool = false; + if (get.mode() == "identity" && player.getStorage("mbshihe_prevent").includes(target)) bool = true; + if (get.mode() != "identity" && player.getStorage("mbshihe_prevent").some(targetx => target.isFriendOf(targetx))) bool = true; + if (bool) return "zeroplayertarget"; + } + }, + }, + }, + }, + }, + }, + mbzhenfu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hasHistory("lose", evt => { + return evt.type == "discard"; + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("mbzhenfu"), "令一名其他角色获得1点护甲", (card, player, target) => { + return target != player && target.hujia < 5; + }) + .set("ai", target => { + return Math.max(0, get.threaten(target)) * get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mbzhenfu", target); + target.changeHujia(1, null, true); + } + }, + ai: { + expose: 0.2, + }, + }, + //☆胃炎 + mbguli: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: -1, + position: "h", + filter: function (event, player) { + if (player.hasSkill("mbguli_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: { mbguli: true }, + }, + onuse: function (links, player) { + player.addTempSkill("mbguli_used", "phaseUseAfter"); + }, + ai: { + order: 1, + threaten: 1.14, + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.name == "sha" && arg.card && arg.card.storage && arg.card.storage.mbguli) return true; + return false; + }, + }, + subSkill: { + used: { + audio: "mbguli", + trigger: { global: "useCardAfter" }, + charlotte: true, + prompt2: "失去1点体力,然后将手牌摸至体力上限", + check: function (event, player) { + var num = player.maxHp - player.countCards("h"); + return (num >= 3 && player.hp >= 2) || (num >= 2 && player.hp >= 3); + }, + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.mbguli && + game.hasPlayer2(current => { + return current.hasHistory("sourceDamage", evt => evt.card == event.card); + }) + ); + }, + content: function () { + "step 0"; + player.loseHp(); + "step 1"; + player.drawTo(player.maxHp); + }, + group: "mbguli_unequip", + }, + unequip: { + trigger: { + player: "useCardToPlayered", + }, + filter: function ({ card }) { + return card.name == "sha" && card.storage && card.storage.mbguli; + }, + forced: true, + popup: false, + logTarget: "target", + content: function () { + trigger.target.addTempSkill("qinggang2"); + trigger.target.storage.qinggang2.add(trigger.card); + trigger.target.markSkill("qinggang2"); + }, + }, + }, + }, + mbaosi: { + audio: 2, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + return player.inRange(event.player) && player.isPhaseUsing() && event.player.isIn() && !player.getStorage("mbaosi_inf").includes(event.player); + }, + logTarget: "player", + content: function () { + player.addTempSkill("mbaosi_inf", "phaseUseAfter"); + player.markAuto("mbaosi_inf", [trigger.player]); + }, + subSkill: { + inf: { + charlotte: true, + onremove: true, + forced: true, + intro: { content: "对$使用牌无次数限制" }, + mod: { + cardUsableTarget: function (card, player, target) { + if (player.getStorage("mbaosi_inf").includes(target)) return true; + }, + }, + }, + }, + }, + // 界曹休 + xinqingxi: { + audio: 2, + usable: 1, + trigger: { source: "damageBegin1" }, + check: function (event, player) { + return get.attitude(player, event.player) < 0; + }, + filter: function (event, player) { + return event.player != player; + }, + content: function () { + "step 0"; + var num = Math.max(1, 4 - get.distance(player, trigger.player)); + if (trigger.player.countCards("h") < num) { + event._result = { bool: false }; + } else { + trigger.player.chooseToDiscard(num, "弃置" + get.cnNumber(num) + "张手牌,或令" + get.translation(player) + "对你造成的此伤害+1").set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1) { + if (get.type(card) == "basic") { + return 8 - get.value(card); + } else { + return 10 - get.value(card); + } + } else { + if (num > 2) { + return 0; + } + return 8 - get.value(card); + } + }); + } + "step 1"; + if (!result.bool) { + trigger.num++; + } + }, + }, + // 界朱桓 + xinpingkou: { + audio: 2, + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.getHistory("skipped").length > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget([1, player.getHistory("skipped").length], get.prompt2("xinpingkou"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + player.logSkill("xinpingkou", result.targets); + event.targets = result.targets.slice(0).sortBySeat(); + } else { + event.finish(); + } + "step 2"; + if (event.targets && event.targets.length) { + event.targets.shift().damage(); + event.redo(); + } + "step 3"; + var card = get.cardPile2(card => get.type(card, false) == "equip"); + if (card) player.gain(card, "gain2"); + }, + ai: { + combo: "fenli", + effect: { + target: function (card) { + if (card.name == "lebu" || card.name == "bingliang") return 0.5; + }, + }, + }, + }, + // 彭羕 + spdaming: { + audio: 3, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + global: "spdaming_give", + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + change: function (player, num) { + if (!player.storage.spdaming) player.storage.spdaming = 0; + if (!num) return; + player.storage.spdaming += num; + player.markSkill("spdaming"); + game.log(player, (num > 0 ? "获得了" : "减少了") + get.cnNumber(Math.abs(num)) + "点“达命”值"); + }, + content: function () { + lib.skill.spdaming.change(player, 1); + }, + intro: { + name: "达命值", + markcount: function (storage, player) { + return (storage || 0).toString(); + }, + content: "当前有#点“达命”值", + }, + subSkill: { + used: { charlotte: true }, + give: { + audio: 2, + enable: "phaseUse", + nopop: true, + filter: function (event, player) { + if (!player.countCards("he")) return false; + return game.hasPlayer(current => { + return current != player && current.hasSkill("spdaming") && !current.hasSkill("spdaming_used"); + }); + }, + selectCard: 1, + filterCard: true, + filterTarget: function (card, player, target) { + return target.hasSkill("spdaming") && !target.hasSkill("spdaming_used"); + }, + selectTarget: function () { + var player = _status.event.player; + var targets = game.filterPlayer(current => { + return current != player && current.hasSkill("spdaming") && !current.hasSkill("spdaming_used"); + }); + return targets.length > 1 ? 1 : -1; + }, + complexSelect: true, + prompt: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("spdaming") && !current.hasSkill("spdaming_used"); + }); + return "将一张牌交给" + get.translation(targets) + (targets.length > 1 ? "中的一人" : ""); + }, + position: "he", + discard: false, + lose: false, + delay: false, + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer(current => { + return lib.skill.spdaming_give.filterTarget(null, player, current) && get.attitude(player, current) > 0; + }) + ) { + return 6 + Math.random() - get.value(card) / 15; + } + return 0; + }, + content: function () { + "step 0"; + game.trySkillAudio("spdaming", target); + player.give(cards, target); + if (!game.hasPlayer(current => current != player && current != target)) event.finish(); + target.addTempSkill("spdaming_used", "phaseUseAfter"); + "step 1"; + var type = get.type(cards[0], "trick", target); + event.cardtype = type; + var str = get.translation(type), + user = get.translation(player); + target + .chooseTarget("达命:选择另一名其他角色", "若该角色有" + str + "牌,其将一张该类型的牌交给" + user + ",你获得1点“达命”值;否则你将" + get.translation(cards) + "交给" + user, (card, player, target) => { + return target != player && target != _status.event.getParent().player; + }) + .set("ai", target => 1 - get.attitude(_status.event.player, target)); + "step 2"; + if (result.bool) { + var targetx = result.targets[0], + type = event.cardtype; + target.line(targetx); + event.targetx = targetx; + if (targetx.countCards("he", { type: type }) > 0) { + targetx + .chooseCard("交给" + get.translation(player) + "一张" + get.translation(type) + "牌", "he", true, card => { + return get.type(card) == _status.event.getParent().cardtype; + }) + .set("ai", card => 10 - get.value(card)); + } else { + var cards = cards.filter(i => get.owner(i) == target); + if (cards.length) target.give(cards, player); + event.finish(); + } + } else event.finish(); + "step 3"; + if (result.bool) { + event.targetx.give(result.cards, player); + event.targetx.line(player); + lib.skill.spdaming.change(target, 1); + game.delayx(); + } + }, + ai: { + expose: 0.2, + order: 10, + result: { target: 1 }, + }, + }, + }, + }, + spxiaoni: { + audio: 2, + enable: "phaseUse", + usable: 1, + locked: false, + filter: function (event, player) { + return (player.storage.spdaming || 0) > 0; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (name == "sha") { + list.push(["基本", "", "sha"]); + for (var i of lib.inpile_nature) list.push(["基本", "", "sha", i]); + } + if (!get.tag({ name: name }, "damage")) continue; + if (get.type2(name) == "trick") list.push(["锦囊", "", name]); + } + return ui.create.dialog("嚣逆", [list, "vcard"]); + }, + filter: function (button, player) { + return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent()); + }, + check: function (button) { + var player = _status.event.player; + if (player.countCards("hs", button.link[2]) > 0) return 0; + var effect = player.getUseValue(button.link[2]); + if (effect > 0) return effect; + return 0; + }, + backup: function (links, player) { + return { + filterCard: true, + audio: "spxiaoni", + selectCard: 1, + popname: true, + check: function (card) { + return 6 - get.value(card); + }, + position: "hes", + viewAs: { name: links[0][2], nature: links[0][3] }, + onuse: function (result, player) { + lib.skill.spdaming.change(player, -result.targets.length); + }, + }; + }, + prompt: function (links, player) { + return "将一张牌当" + (get.translation(links[0][3]) || "") + "【" + get.translation(links[0][2]) + "】使用"; + }, + }, + mod: { + maxHandcardBase: function (player, num) { + return Math.min(Math.max(0, player.storage.spdaming || 0), player.hp); + }, + }, + ai: { + order: 4, + result: { + player: 1, + }, + threaten: 1.4, + combo: "spdaming", + }, + subSkill: { + backup: {}, + }, + }, + // 灭霸 + zhujian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("e") > 0; + }, + selectTarget: [2, Infinity], + multiline: true, + multitarget: true, + filter: function (event, player) { + return game.countPlayer(current => current.countCards("e") > 0) >= 2; + }, + content: function () { + game.asyncDraw(targets); + }, + ai: { + order: 8, + result: { target: 1 }, + }, + }, + duansuo: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.isLinked(); + }, + selectTarget: [1, Infinity], + multiline: true, + multitarget: true, + filter: function (event, player) { + return game.countPlayer(current => current.isLinked()); + }, + content: function () { + "step 0"; + event.targets = targets.sortBySeat(); + for (var i of event.targets) { + i.link(false); + } + "step 1"; + for (var i of targets) { + i.damage("fire"); + } + }, + ai: { + order: 2, + result: { target: -1 }, + }, + }, + // 界朱治 + sbanguo: { + audio: 3, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + direct: true, + group: ["sbanguo_move", "sbanguo_damage", "sbanguo_dying"], + filter: function (event, player) { + return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + player.chooseTarget("安国:令一名其他角色获得“安国”标记", lib.filter.notMe, true); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbanguo", target); + target.addMark("sbanguo_mark", 1, false); + target.addAdditionalSkill("sbanguo_" + player.playerid, "sbanguo_mark"); + target.addMark("sbanguo_marked", 1, false); + } + }, + subSkill: { + mark: { + onremove: true, + marktext: "安", + charlotte: true, + intro: { + name: "安国", + name2: "安国", + content: "已拥有“安国”标记", + }, + mod: { + maxHandcardBase: function (player, num) { + return player.maxHp; + }, + }, + }, + move: { + audio: "sbanguo", + direct: true, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return game.hasPlayer(current => current.hasSkill("sbanguo_mark")) && game.hasPlayer(current => !current.hasMark("sbanguo_marked") && current != player); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => current.hasSkill("sbanguo_mark")); + var prompt2 = targets.length == 1 ? "将" + get.translation(targets[0]) + "的“安国”交给一名未获得过“安国”的其他角色" : "选择一名有“安国”的角色,将该标记交给一名未获得过“安国”的其他角色"; + player + .chooseTarget(get.prompt("sbanguo"), prompt2, targets.length == 1 ? 1 : 2, (card, player, target) => { + if (ui.selected.targets.length == 0 && _status.event.targets.length > 1) return target.hasSkill("sbanguo_mark"); + return !target.hasMark("sbanguo_marked") && target != player; + }) + .set("ai", target => { + var player = _status.event.player; + if (ui.selected.targets.length == 0 && _status.event.targets.length > 1) return -get.attitude(player, target); + return get.attitude(player, _status.event.targets[0]) < get.attitude(player, target); + }) + .set("targets", targets); + "step 1"; + if (result.bool) { + var targets = result.targets; + if (targets.length == 1) { + var target1 = game.filterPlayer(current => current.hasSkill("sbanguo_mark"))[0]; + var target2 = targets[0]; + } else { + var target1 = targets[0]; + var target2 = targets[1]; + } + player.logSkill("sbanguo_move", target2, false); + player.line2([target1, target2], "green"); + var map = target1.additionalSkills; + for (var key in map) { + if (key.indexOf("sbanguo_") != 0) continue; + var id = parseInt(key.slice(8)); + target1.removeAdditionalSkill("sbanguo_" + id); + target2.addMark("sbanguo_mark", 1, false); + target2.addAdditionalSkill("sbanguo_" + id, "sbanguo_mark"); + target2.addMark("sbanguo_marked", 1, false); + } + } + }, + }, + damage: { + audio: "sbanguo", + forced: true, + locked: false, + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + if (!game.hasPlayer(current => current.hasSkill("sbanguo_mark"))) return false; + if (event.source && event.source.isIn() && event.source.hasSkill("sbanguo_mark")) return false; + return event.num >= player.hp; + }, + content: function () { + trigger.cancel(); + }, + ai: { + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (!game.hasPlayer(current => current.hasSkill("sbanguo_mark"))) return; + if (player.hasSkill("sbanguo_mark")) return; + if (get.tag(card, "damage")) { + if (target.hp <= 1) return [0, 0]; + return 0.5; + } + }, + }, + }, + }, + dying: { + audio: "sbanguo", + forced: true, + locked: false, + trigger: { global: "dying" }, + filter: function (event, player) { + var skills = event.player.additionalSkills["sbanguo_" + player.playerid]; + return skills && skills.length; + }, + logTarget: "player", + content: function () { + "step 0"; + trigger.player.removeAdditionalSkill("sbanguo_" + player.playerid); + var num = 1 - trigger.player.hp; + if (num > 0) trigger.player.recover(num); + "step 1"; + var hp = player.hp - 1, + maxhp = player.maxHp - 1; + if (hp > 0 && maxhp > 0) { + player + .chooseControl() + .set("prompt", "安国:请选择一项") + .set("choiceList", ["失去" + hp + "点体力,令" + get.translation(trigger.player) + "获得1点护甲", "减" + maxhp + "点体力上限,令" + get.translation(trigger.player) + "获得1点护甲"]) + .set("ai", () => "选项一"); + } else if (hp > 0) event._result = { control: "选项一" }; + else if (maxhp > 0) event._result = { control: "选项二" }; + else event.finish(); + "step 2"; + if (result.control == "选项一") { + var num = player.hp - 1; + if (num > 0) player.loseHp(num); + } else { + var num = player.maxHp - 1; + if (num > 0) player.loseMaxHp(num); + } + trigger.player.changeHujia(1, null, true); + }, + }, + }, + }, + // 界吴懿 + sbbenxi: { + audio: 3, + trigger: { + player: "phaseUseBegin", + }, + filter: function (event, player) { + return player.countDiscardableCards(player, "he") > 0; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("sbbenxi"), [1, Infinity], "he") + .set("logSkill", "sbbenxi") + .set("ai", card => { + var player = _status.event.player; + if (ui.selected.cards.length < _status.event.num) return 100 - (get.useful(card, player) + player.getUseValue(card) / 3); + return 0; + }) + .set( + "num", + (function () { + var count = 0; + var list = [], + list2 = []; + var targets = game.filterPlayer(current => get.distance(player, current) >= 1); + var cards = player.getCards("hs", card => { + return player.hasUseTarget(card, false) && ["basic", "trick"].includes(get.type(card, false, player)) && get.info(card).allowMultiple != false; + }); + var cards2 = player + .getCards("he") + .filter(i => lib.filter.cardDiscardable(i, player, "sbbenxi")) + .sort((a, b) => { + return get.useful(a, player) + player.getUseValue(a) / 3 - (get.useful(b, player) + player.getUseValue(b) / 3); + }); + for (var i = 0; i < cards2.length; i++) { + count = 0; + list = []; + for (var card of cards) { + var num = i + 1; + if (cards2.slice(0, num).includes(card)) continue; + if (get.tag(card, "damage") && i > 0) count += get.effect(player, { name: "draw" }, player); + var targets2 = targets.filter(current => { + return player.canUse(card, current, false) && get.distance(player, current) <= num && get.effect(current, card, player, player) > 0; + }); + targets2 = targets2.map(target => get.effect(target, card, player, player)).sort((a, b) => b - a); + targets2.slice(0, num).forEach(eff => (count += eff)); + list.push(count - 1.2 * get.value(cards2[i])); + } + var val = list.sort((a, b) => b - a)[0]; + if (!isNaN(val)) list2.push([val, i]); + } + list2 = list2.filter(i => i[0] > 0); + if (!list2.length) return 0; + return list2.sort((a, b) => b[0] - a[0])[0][1]; + })() + ); + "step 1"; + if (result.bool) { + var num = result.cards.length; + player.addTempSkill("sbbenxi_effect", "phaseUseAfter"); + player.addTempSkill("sbbenxi_effect2", "phaseUseAfter"); + player.addMark("sbbenxi_effect2", num, false); + } + }, + subSkill: { + effect: { + audio: "sbbenxi", + trigger: { player: "useCard2" }, + forced: true, + charlotte: true, + direct: true, + onremove: true, + filter: function (event, player) { + var type = get.type(event.card, false); + return type == "basic" || type == "trick"; + }, + content: function () { + "step 0"; + var num = player.countMark("sbbenxi_effect2"); + player.removeSkill("sbbenxi_effect"); + player.addTempSkill("sbbenxi_effect3", "phaseUseAfter"); + player.markAuto("sbbenxi_effect3", [trigger.card]); + var filter = function (event, player) { + var card = event.card, + info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && get.distance(player, current) == 1; + }) + ) { + return true; + } + } + return false; + }; + if (!filter(trigger, player)) event.finish(); + else { + var prompt = "为" + get.translation(trigger.card) + "增加至多" + get.cnNumber(num) + "个距离为1的目标?"; + trigger.player + .chooseTarget(get.prompt("sbbenxi_effect"), prompt, [1, num], function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target) && get.distance(player, target) == 1; + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + } + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + "step 2"; + player.logSkill("sbbenxi_effect", result.targets); + game.log(result.targets, "也成为了", trigger.card, "的目标"); + trigger.targets.addArray(result.targets); + }, + ai: { + effect: { + target: function (card, player, target) { + if (player.canUse(card, target) && get.distance(player, target) != 1) return 1.2; + }, + }, + }, + }, + effect2: { + audio: "sbbenxi", + trigger: { + global: "useCardAfter", + }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return ( + player.getStorage("sbbenxi_effect3").includes(event.card) && + game.hasPlayer2(current => { + return current.hasHistory("damage", evt => { + return event.card == evt.card; + }); + }) + ); + }, + content: function () { + player.draw(5); + }, + mod: { + aiOrder: function (player, card, num) { + var evt = _status.event.getParent("phaseUse"); + if (!evt || evt.player != player) return; + if ( + player.hasHistory("useCard", evtx => { + return evtx.getParent("phaseUse") == evt && ["basic", "trick"].includes(get.type(evtx.card)); + }) + ) + return; + if (get.tag(card, "damage") || get.type(card) == "equip") return num + 10; + }, + globalFrom: function (from, to, distance) { + return distance - from.countMark("sbbenxi_effect2"); + }, + }, + marktext: "奔", + intro: { + content: function (storage, player) { + var str = "于此阶段至其他角色的距离-" + storage; + if (player.hasSkill("sbbenxi_effect")) str += ";使用下一张基本牌或普通锦囊牌选择目标后,可以增加" + get.cnNumber(storage) + "个目标"; + return str; + }, + }, + }, + effect3: { + forced: true, + charlotte: true, + popup: false, + onremove: true, + }, + }, + }, + // 杨阜 + jiebing: { + audio: 2, + trigger: { + player: "damageEnd", + }, + direct: true, + forced: true, + filter: function (event, player) { + return game.hasPlayer(current => { + return current != event.source && current != player && current.countGainableCards(player, "he"); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget("借兵:选择一名其他角色", get.skillInfoTranslation("jiebing"), true, (card, player, target) => { + return player != target && target != _status.event.getTrigger().source && target.countGainableCards(player, "he"); + }) + .set("ai", target => get.effect(target, { name: "shunshou_copy2" }, player, player) /** (target.countCards('he')>1?1.5:1)*/); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jiebing", target); + if (target.ai.shown > 0) player.addExpose(0.15); + var cards = target.getGainableCards(player, "he").randomGets(1); + event.cards = cards; + player.gain(target, cards, "give", "bySelf"); + player.showCards(cards, "借兵"); + } else event.finish(); + "step 2"; + for (var card of cards) { + if (get.type(card) == "equip" && player.hasUseTarget(card) && get.owner(card) == player) { + player.chooseUseTarget(card, true); + } + } + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (player != target && !player.getFriends().length) return; + if ( + game.hasPlayer(current => { + return current != player && get.attitude(player, current) > 0 && current.countGainableCards(target, "he") > 0; + }) + ) + return [1, 1]; + } + }, + }, + }, + }, + hannan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.hasSkillTag("noCompareSource"); + }, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (!result.tie) { + var players = [player, target]; + if (result.bool) players.reverse(); + players[1].line(players[0], "thunder"); + players[0].damage(players[1], 2); + } + }, + ai: { + order: 7, + result: { + target: function (player, target) { + var hs = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); + }); + var ts = target.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); + }); + if (!hs.length || !ts.length) return 0; + if (get.number(hs[0]) > get.number(ts[0]) || get.number(hs[0]) - ts.length >= 9 + Math.min(2, player.hp / 2)) return get.sgnAttitude(player, target) * get.damageEffect(target, player, player); + return 0; + }, + }, + }, + }, + // 曹嵩 + yijin: { + audio: 3, + trigger: { player: "phaseUseBegin" }, + forced: true, + direct: true, + group: ["yijin_upstart", "yijin_die"], + filter: function (event, player) { + if (!game.hasPlayer(current => current != player && !lib.skill.yijin.getKane(current).length)) return false; + return lib.skill.yijin.getKane(player).length; + }, + getKane: function (player) { + var list = lib.skill.yijin.derivation; + return list.filter(mark => player.hasMark(mark)); + }, + derivation: ["yijin_wushi", "yijin_jinmi", "yijin_guxiong", "yijin_tongshen", "yijin_yongbi", "yijin_houren"], + getValue: function (player, mark, target) { + let dis = Math.sqrt(get.distance(player, target, "absolute")); + if (target.isTurnedOver()) dis++; + let draw = get.effect(target, { name: "draw" }, target, target); + switch (mark.slice(6)) { + case "wushi": + if (target.hasJudge("bingliang")) return 12 / (1 + target.getCardUsable("sha", true)); + return (5 * draw) / dis + 12 / (1 + target.getCardUsable("sha", true)); + case "jinmi": + if (target.hasJudge("lebu") && !target.hasCard({ name: "wuxie" }, "hs")) return (draw * target.needsToDiscard(2.2)) / dis; + return get.effect(target, { name: "lebu" }, player, target) + (draw * target.needsToDiscard(2.2)) / dis; + case "guxiong": + if (target.hasJudge("lebu")) return (-draw * target.needsToDiscard(3)) / dis; + return (get.effect(target, { name: "losehp" }, target, target) * 2) / dis - (draw * target.needsToDiscard(3)) / dis; + case "tongshen": + if (target.isMin()) return 0; + var eff = -get.damageEffect(target, player, target); + if (eff <= 0) return 0; + if (target.hp < 2) return eff * dis * 2; + if (target.hp < 3 && target.countCards("he") < 3) return eff * dis * 1.5; + if (target.hp > 3) return (eff * dis) / target.hp; + return eff * dis; + case "yongbi": + if (target.hasJudge("bingliang") && !target.hasCard({ name: "wuxie" }, "hs")) return 0; + return (get.effect(target, { name: "bingliang" }, player, target) * 2) / dis; + case "houren": + return (Math.min(5, 2 + target.getDamagedHp()) * get.recoverEffect(target, player, target)) / dis; + } + }, + content: function () { + "step 0"; + player + .chooseTarget("亿金:令一名其他角色获得1枚“金”", true, (card, player, target) => { + return player != target && !lib.skill.yijin.getKane(target).length; + }) + .set("ai", target => { + let player = _status.event.player, + att = get.attitude(player, target), + kane = lib.skill.yijin.getKane(player); + if (Math.abs(att) > 1) att = Math.sign(att) * Math.sqrt(Math.abs(att)); + return Math.max.apply( + Math.max, + kane.map(i => { + return att * lib.skill.yijin.getValue(player, i, target); + }) + ); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("yijin", target); + var kane = lib.skill.yijin.getKane(player); + var choiceList = kane.map(i => { + return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + "
    " + get.skillInfoTranslation(i, player) + "
    "; + }); + player + .chooseControl(kane) + .set("choiceList", choiceList) + .set("displayIndex", false) + .set("prompt", "选择令" + get.translation(target) + "获得的“金”") + .set("ai", () => { + let controls = _status.event.controls, + player = _status.event.player, + target = _status.event.getParent().target, + att = get.attitude(player, target); + if (Math.abs(att) > 1) att = Math.sign(att) * Math.sqrt(Math.abs(att)); + let list = controls.map(i => { + return [i, att * lib.skill.yijin.getValue(player, i, target)]; + }); + list.sort((a, b) => b[1] - a[1]); + if (list.length) return list[0][0]; + return controls.randomGet(); + }); + } else event.finish(); + "step 2"; + var kane = result.control; + player.removeMark(kane, 1); + player.popup(kane, "metal"); + player.addSkill("yijin_clear"); + target.addMark(kane, 1); + target.addAdditionalSkill("yijin_" + player.playerid, kane); + game.delayx(); + }, + subSkill: { + mark: { + mark: true, + marktext: "金", + intro: { + name: "金(膴仕)", + name2: "金(膴仕)", + markcount: function (storage, player) { + return lib.skill.yijin.getKane(player).length; + }, + content: function (storage, player) { + return "剩余金:" + get.translation(lib.skill.yijin.getKane(player)); + }, + }, + }, + upstart: { + audio: "yijin", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + var kane = lib.skill.yijin.derivation; + for (var mark of kane) { + player.addMark(mark, 1, false); + player.unmarkSkill(mark); + } + player.addSkill("yijin_mark"); + }, + }, + die: { + audio: "yijin", + trigger: { player: "phaseBegin" }, + forced: true, + check: () => false, + filter: function (event, player) { + return !lib.skill.yijin.getKane(player).length; + }, + content: function () { + player.die(); + }, + }, + clear: { + trigger: { + global: "phaseAfter", + player: "die", + }, + charlotte: true, + forced: true, + popup: false, + forceDie: true, + filter: function (event, player) { + if (event.name == "die") return true; + return lib.skill.yijin.getKane(event.player).length && event.player.additionalSkills["yijin_" + player.playerid]; + }, + content: function () { + "step 0"; + if (trigger.name == "die") { + game.countPlayer(current => { + var skills = current.additionalSkills["yijin_" + player.playerid]; + if (skills && skills.length) { + current.removeAdditionalSkill("yijin_" + player.playerid); + for (var i of skills) { + trigger.player.removeSkill(i); + } + } + }); + event.finish(); + return; + } else { + const skills = trigger.player.additionalSkills["yijin_" + player.playerid]; + for (const mark of skills) trigger.player.removeMark(mark, 1); + } + "step 1"; + trigger.player.removeAdditionalSkill("yijin_" + player.playerid); + }, + }, + wushi: { + charlotte: true, + forced: true, + trigger: { player: "phaseDrawBegin2" }, + content: function () { + trigger.num += 4; + }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + marktext: "金", + intro: { + name: "金(膴仕)", + name2: "金(膴仕)", + content: "摸牌阶段多摸四张牌;使用【杀】的次数上限+1", + }, + }, + jinmi: { + charlotte: true, + forced: true, + trigger: { player: "phaseBegin" }, + content: function () { + player.skip("phaseUse"); + player.skip("phaseDiscard"); + }, + marktext: "金", + intro: { + name: "金(金迷)", + name2: "金(金迷)", + content: "回合开始时,跳过下一个出牌阶段和弃牌阶段", + }, + }, + guxiong: { + charlotte: true, + forced: true, + trigger: { player: "phaseUseBegin" }, + content: function () { + player.loseHp(); + }, + ai: { + neg: true, + nokeep: true, + }, + mod: { + maxHandcard: function (player, num) { + return num - 3; + }, + }, + marktext: "金", + intro: { + name: "金(贾凶)", + name2: "金(贾凶)", + content: "出牌阶段开始时,失去1点体力;手牌上限-3", + }, + }, + tongshen: { + charlotte: true, + forced: true, + trigger: { player: "damageBegin4" }, + filter: function (event) { + return !event.hasNature("thunder"); + }, + content: function () { + trigger.cancel(); + }, + ai: { + nofire: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && !get.tag(card, "thunderDamage")) return [0, 0]; + }, + }, + }, + marktext: "金", + intro: { + name: "金(通神)", + name2: "金(通神)", + content: "当你受到非雷电伤害时,防止之", + }, + }, + yongbi: { + charlotte: true, + forced: true, + trigger: { player: "phaseZhunbeiBegin" }, + content: function () { + player.skip("phaseDraw"); + }, + ai: { + neg: true, + nokeep: true, + }, + marktext: "金", + intro: { + name: "金(拥蔽)", + name2: "金(拥蔽)", + content: "准备阶段,跳过下一个摸牌阶段", + }, + }, + houren: { + charlotte: true, + forced: true, + trigger: { player: "phaseEnd" }, + content: function () { + player.recover(3); + }, + marktext: "金", + intro: { + name: "金(厚任)", + name2: "金(厚任)", + content: "回合结束时,回复3点体力", + }, + }, + }, + }, + guanzong: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.countPlayer(current => current != player) >= 2; + }, + filterTarget: lib.filter.notMe, + selectTarget: 2, + multitarget: true, + targetprompt: ["伤害来源", "受伤角色"], + content: function () { + targets[1].damage(targets[0], "unreal"); + }, + ai: { + result: { + target: function (player, target) { + if (game.countPlayer(i => i != player) < 2) return 0; + var list = game + .filterPlayer(current => current != player) + .map(current => { + var _hp = current.hp, + _maxhp = current.maxHp; + current.hp = 10; + current.maxHp = 10; + var att = -get.sgnAttitude(player, current); + var val = get.damageEffect(current, player, current) * att; + current.getSkills(null, false, false).forEach(skill => { + var info = get.info(skill); + if (info && info.ai && (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend)) val = Math[val > 0 ? "max" : "min"](val > 0 ? 0.1 : -0.1, val + 2 * att); + }); + var eff = 100 / val + 15; + current.hp = _hp; + current.maxHp = _maxhp; + return [current, eff]; + }) + .sort((a, b) => b[1] - a[1])[0]; + if (list[1] < 0) return 0; + var targetx = list[0], + sign = get.sgnAttitude(player, target); + if (ui.selected.targets.length) return target == targetx ? sign : 0; + return ( + sign * + (game + .filterPlayer(current => { + return current != player && current != targetx; + }) + .map(current => { + var _hp = targetx.hp, + _maxhp = targetx.maxHp; + targetx.hp = 10; + targetx.maxHp = 10; + var eff = -get.damageEffect(targetx, current, current); + targetx.hp = _hp; + targetx.maxHp = _maxhp; + return [current, eff]; + }) + .sort((a, b) => b[1] - a[1])[0][0] == target + ? 10 + : 1) + ); + }, + }, + order: 9.5, + expose: 0.2, + }, + }, + //马日磾 + chengye: { + audio: 3, + liujing_filter: [ + function (card) { + return get.type(card, false) == "trick" && get.tag(card, "damage", null, false) > 0; + }, + card => get.type(card, false) == "basic", + card => get.name(card, false) == "wuxie", + card => get.name(card, false) == "wuzhong", + card => get.name(card, false) == "lebu", + card => get.type(card, false) == "equip", + ], + getLiujing: function (player, index) { + var filter = lib.skill.chengye.liujing_filter[index], + expansion = player.getExpansions("chengye"); + for (var i of expansion) { + if (filter(i)) return i; + } + return false; + }, + trigger: { + global: ["useCardAfter", "loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + forced: true, + filter: function (event, player) { + if (player == event.player) return false; + if (event.name == "useCard") { + if (!event.card.isCard) return false; + var cards = event.cards.filterInD(); + if (!cards.length) return false; + } else if (event.name != "cardsDiscard") { + var cards = event.getd(null, "cards2").filter(function (card) { + if (get.position(card, true) != "d") return false; + var type = get.type(card, false); + return type == "delay" || type == "equip"; + }); + cards.removeArray(event.getd(player, "cards2")); + if (!cards.length) return false; + } else { + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + if (evt2.name != "phaseJudge" || evt2.player == player) return; + var cards = event.cards.filter(function (card) { + if (get.position(card, true) != "d") return false; + var type = get.type(card, false); + return type == "delay"; + }); + if (!cards.length) return false; + } + for (var i = 0; i < 6; i++) { + if (lib.skill.chengye.getLiujing(player, i)) continue; + for (var j of cards) { + if (lib.skill.chengye.liujing_filter[i](j)) return true; + } + } + return false; + }, + content: function () { + var cards, + cards2 = []; + if (trigger.name == "useCard") { + cards = trigger.cards.filterInD(); + } else if (trigger.name != "cardsDiscard") { + cards = trigger.getd().filter(function (card) { + if (card.original == "j" || get.position(card, true) != "d") return false; + var type = get.type(card, false); + return type == "delay" || type == "equip"; + }); + cards.removeArray(trigger.getd(player)); + } else { + cards = trigger.cards.filter(function (card) { + if (get.position(card, true) != "d") return false; + var type = get.type(card, false); + return type == "delay"; + }); + } + for (var i = 0; i < 6; i++) { + if (lib.skill.chengye.getLiujing(player, i)) continue; + for (var j of cards) { + if (lib.skill.chengye.liujing_filter[i](j)) { + cards.remove(j); + cards2.push(j); + break; + } + } + if (!cards.length) break; + } + player.addToExpansion(cards2, "gain2").gaintag.add("chengye"); + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + marktext: "经", + intro: { + name: "六经", + markcount: "expansion", + content: "expansion", + mark: function (dialog, storage, player) { + var list = ["《诗经》", "《尚书》", "《仪礼》", "《易经》", "《乐经》", "《春秋》"]; + var desc = ["伤害类锦囊牌", "基本牌", "无懈可击", "无中生有", "乐不思蜀", "装备牌"]; + for (var i = 0; i < 6; i++) { + dialog.addText(list[i]); + var card = lib.skill.chengye.getLiujing(player, i); + if (!card) dialog.addText("(缺少 " + desc[i] + ")"); + else dialog.addSmall([card]); + } + }, + }, + group: "chengye_gain", + subSkill: { + gain: { + audio: "chengye", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.getExpansions("chengye").length >= 6; + }, + forced: true, + content: function () { + player.gain(player.getExpansions("chengye"), "gain2"); + }, + }, + }, + }, + buxu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + var num = (player.getStat("skill").buxu || 0) + 1; + return player.countCards("he") >= num && player.getExpansions("chengye").length < 6; + }, + chooseButton: { + chooseControl: function (event, player) { + var list = ["诗经", "尚书", "仪礼", "易经", "乐经", "春秋"]; + var choices = []; + for (var i = 0; i < 6; i++) { + if (!lib.skill.chengye.getLiujing(player, i)) choices.push(list[i]); + } + choices.push("cancel2"); + return choices; + }, + check: function (event, player) { + var list = [4, 3, 5, 0, 2, 1]; + for (var i of list) { + if (!lib.skill.chengye.getLiujing(player, i)) { + return ["诗经", "尚书", "仪礼", "易经", "乐经", "春秋"][i]; + } + } + return "cancel2"; + }, + dialog: function (event, player) { + var num = (player.getStat("skill").buxu || 0) + 1; + return ui.create.dialog("###补叙###弃置" + get.cnNumber(num) + "张牌并补充一张“六经”"); + }, + prompt: function (links, player) { + var num = (player.getStat("skill").buxu || 0) + 1; + return "弃置" + get.cnNumber(num) + "张牌并补充一张《" + links.control + "》"; + }, + backup: function (links, player) { + return { + audio: "buxu", + index: ["诗经", "尚书", "仪礼", "易经", "乐经", "春秋"].indexOf(links.control), + filterCard: true, + position: "he", + selectCard: (player.getStat("skill").buxu || 0) + 1, + ai1: function (card) { + var player = _status.event.player; + if ( + player.needsToDiscard(0, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) + return 10 / Math.max(0.1, get.value(card)); + return 5 - (player.getStat("skill").buxu || 0) - get.value(card); + }, + ai2: () => 1, + content: function () { + var filter = lib.skill.chengye.liujing_filter[lib.skill.buxu_backup.index]; + var card = get.cardPile(filter); + if (card) player.addToExpansion(card, "gain2").gaintag.add("chengye"); + }, + ai: { result: { player: 1 } }, + }; + }, + }, + ai: { + combo: "chengye", + order: 0.2, + result: { player: 1 }, + }, + }, + //阮慧 + mingcha: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + forced: true, + locked: false, + filter: event => !event.numFixed, + content: function () { + "step 0"; + var cards = game.cardsGotoOrdering(get.cards(3)).cards, + cards2 = cards.slice(0); + event.cards = cards.filter(function (i) { + return get.number(i) < 9; + }); + // while(cards2.length>0){ + // var card=cards2.pop(); + // card.fix(); + // ui.cardPile.insertBefore(card,ui.cardPile.firstChild); + // } + // game.updateRoundNumber(); + player.showCards(cards, get.translation(player) + "发动了【明察】"); + if (!event.cards.length) event.finish(); + "step 1"; + player.chooseBool("是否放弃摸牌并获得" + get.translation(cards)).set("goon", trigger.num - cards.length <= 1); + "step 2"; + if (result.bool) { + trigger.changeToZero(); + player.gain(cards, "gain2"); + } else event.finish(); + "step 3"; + player + .chooseTarget("是否随机获得其他角色的一张牌?", function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("ai", function (target) { + return 3 - get.attitude(player, target); + }); + "step 4"; + if (result.bool) { + var target = result.targets[0], + cards = target.getGainableCards(player, "he"); + player.line(target, "green"); + if (cards.length) player.gain(cards.randomGet(), target, "giveAuto", "bySelf"); + } + }, + }, + jingzhong: { + audio: 2, + trigger: { player: "phaseDiscardAfter" }, + filter: function (event, player) { + var num = 0; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) { + for (var i of evt.cards2) { + if (get.color(i, player) == "black") num++; + } + } + }); + return num > 1; + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("jingzhong"), "获得一名其他角色下回合出牌阶段内使用的牌", lib.filter.notMe).set("ai", function (target) { + return Math.sqrt(target.countCards("h")) * get.threaten(target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jingzhong", target); + player.addSkill("jingzhong_effect"); + player.markAuto("jingzhong_effect", [target]); + game.delayx(); + } + }, + subSkill: { + effect: { + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if (!player.getStorage("jingzhong_effect").includes(event.player) || !event.cards.filterInD().length) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + player.getHistory("useSkill", function (evtx) { + return evtx.skill == "jingzhong_effect" && evtx.event.getParent("phaseUse") == evt; + }).length < 3 + ); + }, + logTarget: "player", + content: function () { + player.gain(trigger.cards.filterInD(), "gain2"); + }, + mark: true, + intro: { content: "已指定$为目标" }, + group: "jingzhong_remove", + }, + remove: { + trigger: { global: "phaseAfter" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return player.getStorage("jingzhong_effect").includes(event.player); + }, + content: function () { + var storage = player.getStorage("jingzhong_effect"); + storage.remove(trigger.player); + if (!storage.length) player.removeSkill("jingzhong_effect"); + }, + }, + }, + }, + //全琮 + sbyaoming: { + audio: 2, + chargeSkill: true, + enable: "phaseUse", + filter: function (event, player) { + return player.countMark("charge") > 0; + }, + filterTarget: true, + prompt: function () { + var num = _status.event.player.storage.sbyaoming_status; + var list = ["弃置一名手牌数不小于你的角色的一张牌", ";或令一名手牌数不大于你的角色摸一张牌"]; + if (typeof num == "number") list[num] += "(上次选择)"; + return list[0] + list[1]; + }, + content: function () { + "step 0"; + player.removeMark("charge", 1); + var num = target.countCards("h"), + num2 = player.countCards("h"); + if (num == num2 && target.countCards("he") > 0) { + var choice = get.attitude(player, target) > 0 ? 1 : 0; + var str = get.translation(target), + choiceList = ["弃置" + str + "的一张牌", "令" + str + "摸一张牌"]; + if (typeof player.storage.sbyaoming_status == "number") choiceList[player.storage.sbyaoming_status] += "(上次选择)"; + var next = player.chooseControl().set("choiceList", choiceList); + next.set("ai_choice", choice); + next.set("ai", () => _status.event.ai_choice); + } else event._result = { index: num > num2 ? 0 : 1 }; + "step 1"; + if (result.index == 0) { + player.discardPlayerCard(target, true, "he"); + } else target.draw(); + if (typeof player.storage.sbyaoming_status == "number" && result.index != player.storage.sbyaoming_status) { + player.addMark("charge", 1); + delete player.storage.sbyaoming_status; + } else { + player.storage.sbyaoming_status = result.index; + } + }, + ai: { + order: 6, + result: { + player: function (player, target) { + var att = get.attitude(player, target), + eff = [0, 0]; + var hs = player.countCards("h"), + ht = target.countCards("h"); + if (hs >= ht) { + eff[0] = get.effect(target, { name: "draw" }, player, player); + if (player.storage.sbyaoming_status == 0) eff[0] *= 1.2; + } + if (hs <= ht) { + eff[1] = get.effect(target, { name: "guohe_copy2" }, player, player); + if (player.storage.sbyaoming_status == 1) eff[1] *= 1.2; + } + return Math.max.apply(Math, eff); + }, + }, + }, + group: ["sbyaoming_damage", "sbyaoming_init"], + subSkill: { + damage: { + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + var num = Math.min(trigger.num, 4 - player.countMark("charge")); + if (num > 0) { + player.logSkill("sbyaoming_damage"); + player.addMark("charge", num); + game.delayx(); + } + "step 1"; + player.chooseTarget(get.prompt("sbyaoming"), lib.skill.sbyaoming.prompt()).set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, "sbyaoming", player, player); + }); + "step 2"; + if (result.bool) { + player.useSkill("sbyaoming", result.targets); + } + }, + }, + init: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.countMark("charge") < 4; + }, + content: function () { + player.addMark("charge", Math.min(2, 4 - player.countMark("charge"))); + }, + }, + }, + }, + //手杀界荀彧 + rejieming: { + audio: 2, + trigger: { + player: "damageEnd", + }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + player.chooseTarget(get.prompt("rejieming"), "令一名角色摸两张牌。然后若其手牌数少于体力上限,你摸一张牌").set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 2) { + if (target.maxHp - target.countCards("h") > 2) return 2 * att; + return att; + } + return att / 3; + }); + "step 2"; + if (result.bool) { + event.current = result.targets[0]; + player.logSkill("rejieming", event.current); + player.line(event.current, "thunder"); + event.current.draw(2); + event.count--; + } else event.finish(); + "step 3"; + if (event.current.countCards("h") < event.current.maxHp) { + player.draw(); + } + "step 4"; + if (event.count > 0 && player.hasSkill("rejieming")) event.goto(1); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + var max = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) > 0) { + max = Math.max(Math.min(5, players[i].hp) - players[i].countCards("h"), max); + } + } + switch (max) { + case 0: + return 2; + case 1: + return 1.5; + case 2: + return [1, 2]; + default: + return [0, max]; + } + } + if ((card.name == "tao" || card.name == "caoyao") && target.hp > 1 && target.countCards("h") <= target.hp) return [0, 0]; + }, + }, + }, + }, + //沮授 + xinjianying: { + audio: 2, + subfrequent: ["draw"], + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (!player.countCards("he")) return false; + for (var i of lib.inpile) { + if (i != "du" && get.type(i, false) == "basic") { + if (event.filterCard({ name: i }, player, event)) return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: i, nature: j }, player, event)) return true; + } + } + } + } + return false; + }, + onChooseToUse: function (event) { + if (event.type == "phase" && !game.online) { + var last = event.player.getLastUsed(); + if (last && last.getParent("phaseUse") == event.getParent()) { + var suit = get.suit(last.card, false); + if (suit != "none") event.set("xinjianying_suit", suit); + } + } + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + var suit = event.xinjianying_suit || "", + str = get.translation(suit); + for (var i of lib.inpile) { + if (i != "du" && get.type(i, false) == "basic") { + if (event.filterCard({ name: i }, player, event)) list.push(["基本", str, i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: i, nature: j }, player, event)) list.push(["基本", str, i, j]); + } + } + } + } + return ui.create.dialog("渐营", [list, "vcard"]); + }, + check: function (button) { + if (button.link[2] == "jiu") return 0; + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }, + backup: function (links, player) { + var next = { + audio: "xinjianying", + filterCard: true, + popname: true, + position: "he", + viewAs: { + name: links[0][2], + nature: links[0][3], + }, + ai1: function (card) { + return 7 - _status.event.player.getUseValue(card, null, true); + }, + }; + if (_status.event.xinjianying_suit) next.viewAs.suit = _status.event.xinjianying_suit; + return next; + }, + prompt: function (links) { + return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + (_status.event.xinjianying_suit ? "(" + get.translation(_status.event.xinjianying_suit) + ")" : "") + "使用"; + }, + }, + ai: { + order: function (item, player) { + if (_status.event.xinjianying_suit) return 16; + return 3; + }, + result: { player: 7 }, + }, + group: ["xinjianying_draw", "jianying_mark"], + init: function (player) { + if (player.isPhaseUsing()) { + var evt = _status.event.getParent("phaseUse"); + var history = player.getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == evt; + }); + if (history.length) { + var trigger = history[history.length - 1]; + player.storage.jianying_mark = trigger.card; + player.markSkill("jianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML = get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); + player.when("phaseUseAfter").then(() => { + player.unmarkSkill("jianying_mark"); + delete player.storage.jianying_mark; + }); + } + } + }, + onremove: function (player) { + player.unmarkSkill("jianying_mark"); + delete player.storage.jianying_mark; + }, + subSkill: { + draw: { inherit: "jianying", audio: "xinjianying" }, + }, + }, + //步练师 + reanxu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + game.countPlayer() > 2 && + game.hasPlayer(function (current) { + return current != player && current.countCards("he"); + }) + ); + }, + selectTarget: 2, + filterTarget: function (card, player, target) { + if (target == player) return false; + if (!ui.selected.targets.length) return target.countCards("he") > 0; + return target != ui.selected.targets[0] && ui.selected.targets[0].countGainableCards(target, "he") > 0; + }, + multitarget: true, + targetprompt: ["被拿牌", "得到牌"], + content: function () { + "step 0"; + targets[1].gainPlayerCard(targets[0], "he", true); + "step 1"; + if ( + targets[0].getHistory("lose", function (evt) { + return evt.getParent(3) == event && !evt.es.length; + }).length + ) + player.draw(); + "step 2"; + if (targets[0].isIn() && targets[1].isIn() && targets[0].countCards("h") != targets[1].countCards("h")) { + event.target = targets[targets[0].countCards("h") > targets[1].countCards("h") ? 1 : 0]; + player.chooseBool("是否令" + get.translation(event.target) + "摸一张牌?").set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target) > 0; + }); + } else event.finish(); + "step 3"; + if (result.bool) target.draw(); + }, + ai: { + expose: 0.2, + threaten: 2, + order: 9, + result: { + player: function (player, target) { + if (ui.selected.targets.length) return 0.01; + return target.countCards("e") ? 0 : 0.5; + }, + target: function (player, target) { + if (ui.selected.targets.length) { + player = target; + target = ui.selected.targets[0]; + if (get.attitude(player, target) > 1) { + return 0; + } + return target.countCards("h") - player.countCards("h") > (target.countCards("e") ? 2 : 1) ? 2 : 1; + } else { + if (get.attitude(player, target) <= 0) + return target.countCards("he", function (card) { + return card.name == "tengjia" || get.value(card) > 0; + }) > 0 + ? -1.5 + : 1.5; + return target.countCards("he", function (card) { + return card.name != "tengjia" && get.value(card) <= 0; + }) > 0 + ? 1.5 + : -1.5; + } + }, + }, + }, + }, + //蒋干 + spdaoshu: { + audio: 3, + group: "spdaoshu_effect", + subSkill: { + effect: { + audio: "spdaoshu1", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + var goon = event.player != player && (get.mode() == "identity" || get.mode() == "guozhan" || event.player.isEnemyOf(player)); + return goon && event.player.countCards("h") > 0 && event.player.hasUseTarget({ name: "jiu", isCard: true }, null, true); + }, + round: 1, + logTarget: "player", + prompt2: () => lib.translate.spdaoshu_info, + check: function (event, player) { + var target = event.player; + var att = get.attitude(player, target); + if (att > 0) return false; + if (att == 0) return !player.inRangeOf(target); + return true; + }, + content: function () { + "step 0"; + event.target = trigger.player; + event.target.chooseUseTarget("jiu", true); + "step 1"; + if (!target.countCards("h")) { + event.finish(); + return; + } + var list = []; + for (var i of lib.inpile) { + if (get.type(i) == "basic") list.push(i); + } + if (!list.length) { + event.finish(); + return; + } + target + .chooseControl(list) + .set("prompt", "请声明一种基本牌") + .set("ai", () => _status.event.rand) + .set("rand", get.rand(0, list.length - 1)); + "step 2"; + event.cardname = result.control; + target.chat("我声明" + get.translation(event.cardname)); + game.log(target, "声明的牌名为", "#y" + get.translation(event.cardname)); + game.delayx(); + player + .chooseControl("有!", "没有!") + .set("prompt", "你觉得" + get.translation(target) + "的手牌区里有" + get.translation(event.cardname) + "吗?") + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var rand = + { + sha: 0.273, + shan: 0.149, + tao: 0.074, + jiu: 0.031, + }[event.cardname] || 0.1; + return 1 - Math.pow(1 - rand, target.countCards("h")) > 0.5 ? "有!" : "没有!"; + })() + ); + "step 3"; + player.chat(result.control); + game.log(player, "认为", "#y" + result.control); + game.delayx(); + "step 4"; + var bool1 = result.index == 0; + var bool2 = target.hasCard(function (card) { + return get.name(card, target) == event.cardname; + }, "h"); + if (bool1 == bool2) { + player.popup("判断正确", "wood"); + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spdaoshu2"); + }); + player.gainPlayerCard(target, "h", 2, true); + //var cards=target.getCards('h',function(card){ + // return lib.filter.canBeGained(card,player,target); + //}).randomGets(5); + //if(cards.length>0) player.gain(cards,target,'giveAuto','bySelf'); + } else { + player.popup("判断错误", "fire"); + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spdaoshu3"); + }); + //player.addTempSkill('spdaoshu_respond'); + } + }, + ai: { expose: 0.3 }, + }, + respond: { + trigger: { global: "useCard1" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.player == _status.currentPhase; + }, + content: function () { + trigger.directHit.add(player); + }, + }, + }, + }, + spdaoshu1: { audio: true }, + mbdaoshu: { + audio: 3, + group: "mbdaoshu_use", + subSkill: { + use: { + audio: "mbdaoshu1", + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer(target => target != player && target.countCards("h") > 2); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 2; + }, + usable: 1, + prompt: () => lib.translate.mbdaoshu_info, + content: function* (event, map) { + var player = map.player, + target = event.target; + var targets = [player], + names = lib.inpile.randomGets(3); + if (!names.length) return; + var map = {}; + names.forEach(name => (map[get.translation(name)] = name)); + if (get.mode() != "identity" && get.mode() != "guozhan") targets.addArray(player.getFriends()); + targets.remove(target); + targets.sortBySeat(); + var result = yield target + .chooseButton(["盗书:请选择伪装的牌和牌名", target.getCards("h"), [Object.keys(map), "tdnodes"]], 2, true) + .set("filterButton", button => { + var map = _status.event.map; + if (!ui.selected.buttons.length) return true; + if (typeof button.link == typeof ui.selected.buttons[0].link) return false; + if (typeof button.link == "string") return get.name(ui.selected.buttons[0].link, false) != map[button.link]; + return map[ui.selected.buttons[0].link] != get.name(button.link, false); + }) + .set("ai", button => { + var map = _status.event.map; + if (!ui.selected.buttons.length) { + if (typeof button.link == "object") { + if (Object.values(map).some(name => lib.card.list.some(card => card[0] == get.suit(button.link, false) && card[1] == get.number(button.link, false) && card[2] == name))) return 5; + return 3.5 + Math.random(); + } + return 0; + } + if (typeof button.link == "string") { + var cardx = ui.selected.buttons[0].link; + if (lib.card.list.some(card => card[0] == get.suit(cardx, false) && card[1] == get.number(cardx, false) && card[2] == map[button.link])) return 2 + Math.random(); + return 1; + } + return 0; + }) + .set("map", map); + if (result.bool) { + var guessWinner = []; + if (typeof result.links[0] == "string") result.links.reverse(); + var OriginCard = result.links[0], + ChangeName = map[result.links[1]], + cards = target.getCards("h").slice(); + var card = game.createCard(ChangeName, get.suit(OriginCard, false), get.number(OriginCard, false)); + cards[cards.indexOf(OriginCard)] = card; + if (_status.connectMode) { + var list = targets.map(target2 => [target2, ["请猜测" + get.translation(target) + "伪装的手牌", cards], true]); + var result2 = yield player + .chooseButtonOL(list) + .set("switchToAuto", () => (_status.event.result = "ai")) + .set("processAI", () => { + var cards = _status.event.cards.slice(); + var card = cards.find(card => lib.card.list.some(cardx => cardx[2] == card.name) && !lib.card.list.some(cardx => cardx[2] == card.name && cardx[0] == get.suit(card, false) && cardx[0] == get.number(card, false))); + return { + bool: true, + links: card ? card : cards.randomGet(), + }; + }) + .set("cards", cards); + for (var i in result2) { + if (result2[i].links[0] == card) guessWinner.push(lib.playerOL[i]); + } + } else { + var guessTargets = targets.slice(); + while (guessTargets.length) { + var target2 = guessTargets.shift(); + var result2 = yield target2 + .chooseButton(["请猜测" + get.translation(target) + "伪装的手牌", cards], true) + .set("ai", button => { + var cards = _status.event.cards.slice(); + var card = cards.find(card => lib.card.list.some(cardx => cardx[2] == get.name(card, false)) && !lib.card.list.some(cardx => cardx[2] == get.name(card, false) && cardx[0] == get.suit(card, false) && cardx[0] == get.number(card, false))); + return button.link == card ? 3 : 1 + Math.random(); + }) + .set("cards", cards); + if (result2.bool) { + if (result2.links[0] == card) guessWinner.push(target2); + } + } + } + targets.forEach(target2 => { + if (guessWinner.includes(target2)) { + target2.popup("判断正确", "wood"); + game.log(target2, "猜测", "#g正确"); + game.broadcastAll(() => { + if (lib.config.background_speak) game.playAudio("skill", "mbdaoshu2"); + }); + target2.line(target); + target.damage(1, target2); + } else { + target2.popup("判断错误", "fire"); + game.log(target2, "猜测", "#y错误"); + game.broadcastAll(() => { + if (lib.config.background_speak) game.playAudio("skill", "mbdaoshu3"); + }); + if (target2.countCards("h") >= 2) target2.discard(target2.getCards("h").randomGets(2)); + else target2.loseHp(); + } + }); + } + }, + ai: { + order: 9, + result: { + target: function (player, target) { + return -1 / target.countCards("h"); + }, + }, + }, + }, + }, + }, + mbdaoshu1: { audio: true }, + spdaizui: { + audio: 2, + trigger: { player: "damageBegin2" }, + limited: true, + logTarget: "source", + filter: function (event, player) { + return event.num >= player.hp && event.source && event.source.isIn() && event.cards && event.cards.filterInD().length > 0; + }, + prompt2: function (event) { + return "防止即将受到的" + get.cnNumber(event.num) + "点伤害,并令" + get.translation(event.source) + "将" + get.translation(event.cards.filterInD()) + "置于武将牌上且回合结束时收回"; + }, + skillAnimation: true, + animationColor: "thunder", + content: function () { + player.awakenSkill("spdaizui"); + trigger.source.addSkill("spdaizui2"); + trigger.source.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("spdaizui2"); + trigger.cancel(); + }, + }, + spdaizui2: { + trigger: { global: "phaseEnd" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("spdaizui2").length > 0; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("spdaizui2"); + player.gain(cards, "gain2"); + "step 1"; + player.removeSkill("spdaizui2"); + }, + marktext: "释", + intro: { + markcount: "expansion", + content: "expansion", + }, + }, + //裴秀 + xingtu: { + trigger: { player: "useCard" }, + filter: function (event, player) { + var evt = lib.skill.dcjianying.getLastUsed(player, event); + if (!evt || !evt.card) return false; + var num1 = get.number(event.card), + num2 = get.number(evt.card); + return typeof num1 == "number" && typeof num2 == "number" && num2 % num1 == 0; + }, + forced: true, + content: function () { + player.draw(); + }, + mod: { + cardUsable: function (card, player) { + if (typeof card == "object") { + var evt = lib.skill.dcjianying.getLastUsed(player); + if (!evt || !evt.card) return; + var num1 = get.number(card), + num2 = get.number(evt.card); + if (num1 === "unsure" || (typeof num1 == "number" && typeof num2 == "number" && num1 % num2 == 0)) return Infinity; + } + }, + aiOrder: function (player, card, num) { + if (typeof card == "object") { + var evt = lib.skill.dcjianying.getLastUsed(player); + if (!evt || !evt.card) return; + var num1 = get.number(card), + num2 = (num2 = get.number(evt.card)); + if (num1 === "unsure" || (typeof num1 == "number" && typeof num2 == "number" && num2 % num1 == 0)) return num + 5; + } + }, + }, + init: function (player) { + player.addSkill("xingtu_mark"); + var history = player.getAllHistory("useCard"); + if (history.length) { + var trigger = history[history.length - 1], + num = get.number(trigger.card); + player.storage.xingtu_mark = num; + player[typeof num != "number" ? "unmarkSkill" : "markSkill"]("xingtu_mark"); + } + }, + onremove: function (player) { + player.removeSkill("xingtu_mark"); + player.removeGaintag("xingtu1"); + player.removeGaintag("xingtu2"); + delete player.storage.xingtu_mark; + }, + subSkill: { + mark: { + charlotte: true, + trigger: { + player: ["useCard1", "gainAfter"], + global: "loseAsyncAfter", + }, + filter: function (event, player, name) { + if (!player.countCards("h")) return false; + return name == "useCard1" || event.getg(player).length; + }, + direct: true, + firstDo: true, + content: function () { + "step 0"; + player.removeGaintag("xingtu1"); + player.removeGaintag("xingtu2"); + if (event.triggername == "useCard1") { + var num = get.number(trigger.card, player); + player.storage.xingtu_mark = num; + player[typeof num != "number" ? "unmarkSkill" : "markSkill"]("xingtu_mark"); + if (typeof num != "number") event.finish(); + } + "step 1"; + var cards1 = [], + cards2 = [], + num = player.storage.xingtu_mark; + player.getCards("h").forEach(card => { + var numx = get.number(card, player); + if (typeof numx == "number") { + if (numx % num == 0) cards1.push(card); + if (num % numx == 0) cards2.push(card); + } + }); + player.addGaintag(cards1, "xingtu1"); + player.addGaintag(cards2, "xingtu2"); + }, + intro: { content: "上一张牌的点数:#" }, + }, + }, + }, + juezhi: { + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") > 1; + }, + filterCard: true, + position: "he", + selectCard: [2, Infinity], + check: function (card) { + if (ui.selected.cards.length > 1) return 0; + var player = _status.event.player; + if (player.hasSkill("xingtu") && player.storage.xingtu) { + var cards = player.getCards("he"); + var num = player.storage.xingtu, + stop = false; + for (var i = 0; i <= cards.length; i++) { + if (i != cards.length) { + var num1 = get.number(cards[i], player); + if (typeof num1 != "number") continue; + for (var j = 0; j < cards.length; j++) { + if (i == j) continue; + var num2 = get.number(cards[j], player); + if (typeof num2 != "number") continue; + var sum = num1 + num2; + if (sum % num == 0 || num % sum == 0) { + stop = true; + break; + } + } + if (stop) break; + } + } + if (i != cards.length) { + var cardx = [cards[i], cards[j]]; + if (cardx.includes(card)) return 10 - get.value(card); + } + } + return 5 - get.value(card); + }, + content: function () { + var num = 0; + for (var i of cards) num += get.number(i, player); + num = num % 13; + if (num == 0) num = 13; + var card = get.cardPile2(function (card) { + return get.number(card, false) == num; + }); + if (card) player.gain(card, "gain2"); + }, + ai: { + order: 1, + result: { player: 1 }, + }, + }, + reganlu: { + enable: "phaseUse", + usable: 1, + audio: 2, + selectTarget: 2, + delay: 0, + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + if (ui.selected.targets.length == 0) return true; + if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0) return false; + return target == player || ui.selected.targets[0] == player || Math.abs(ui.selected.targets[0].countCards("e") - target.countCards("e")) <= player.maxHp - player.hp; + }, + multitarget: true, + multiline: true, + content: function () { + targets[0].swapEquip(targets[1]); + }, + ai: { + order: 10, + threaten: function (player, target) { + return 0.8 * Math.max(1 + target.maxHp - target.hp); + }, + result: { + target: function (player, target) { + var list1 = []; + var list2 = []; + var num = player.maxHp - player.hp; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 0) list1.push(players[i]); + else if (get.attitude(player, players[i]) < 0) list2.push(players[i]); + } + list1.sort(function (a, b) { + return a.countCards("e") - b.countCards("e"); + }); + list2.sort(function (a, b) { + return b.countCards("e") - a.countCards("e"); + }); + var delta; + for (var i = 0; i < list1.length; i++) { + for (var j = 0; j < list2.length; j++) { + delta = list2[j].countCards("e") - list1[i].countCards("e"); + if (delta <= 0) continue; + if (delta <= num || list1[i] == player || list2[j] == player) { + if (target == list1[i] || target == list2[j]) { + return get.attitude(player, target); + } + return 0; + } + } + } + return 0; + }, + }, + }, + }, + //孙休 + mobilexingxue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return (player.storage.mobileyanzhu ? player.maxHp : player.hp) > 0; + }, + direct: true, + content: function () { + "step 0"; + var num = player.storage.mobileyanzhu ? player.maxHp : player.hp; + player.chooseTarget([1, num], get.prompt2("mobilexingxue")).set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countCards("he")) return att; + return att / 10; + }); + "step 1"; + if (result.bool) { + player.logSkill("mobilexingxue", result.targets); + event.targets = result.targets; + event.targets2 = event.targets.slice(0); + event.targets.sort(lib.sort.seat); + } else { + event.finish(); + } + "step 2"; + if (event.targets.length) { + var target = event.targets.shift(); + target.draw(); + event.current = target; + } else { + event.finish(); + } + "step 3"; + if (event.current && event.current.countCards("he")) { + if (!player.storage.mobileyanzhu || event.targets2.length == 1) event.current.chooseCard("选择一张牌置于牌堆顶", "he", true); + else + event.current.chooseCardTarget({ + prompt: "将一张牌置于牌堆顶,或交给其他目标角色", + filterCard: true, + position: "he", + filterTarget: function (card, player, target) { + return target != player && _status.event.getParent().targets2.includes(target); + }, + forced: true, + selectTarget: [0, 1], + ai1: card => 6 - get.value(card), + ai2: target => get.attitude(_status.event.player, target), + }); + } else { + event.goto(2); + } + "step 4"; + if (result && result.cards) { + event.card = result.cards[0]; + if (!result.targets || !result.targets.length) { + event.current.lose(result.cards, ui.cardPile, "insert"); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, event.current); + } else { + event.current.give(result.cards, result.targets[0]); + } + } else { + event.card = null; + } + "step 5"; + event.goto(2); + }, + derivation: "mobilexingxuex", + }, + mobileyanzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("hej") > 0 && target != player; + }, + content: function () { + "step 0"; + if (target.countCards("e")) { + target + .chooseBool("是否将装备区内的所有牌交给" + get.translation(player) + "?", "若选择“取消”,则其将获得你区域里的一张牌") + .set("ai", function () { + if (_status.event.effect > 0) return false; + if (_status.event.player.countCards("e") >= 3) return false; + return true; + }) + .set("effect", get.effect(target, { name: "shunshou" }, player, target)); + } else { + player.gainPlayerCard(target, true, "he"); + event.finish(); + } + "step 1"; + if (result.bool) { + var es = target.getCards("e"); + target.give(es, player, "give"); + player.removeSkills("mobileyanzhu"); + player.storage.mobileyanzhu = true; + player.popup("兴学"); + game.log(player, "修改了技能", "#g【兴学】"); + } else { + player.gainPlayerCard(target, true, "hej"); + } + }, + ai: { + order: 6, + result: { + target: function (player, target) { + var ne = target.countCards("e"), + nj = target.countCards("j"); + if (nj) return 2.5; + if (!ne) return -2; + if (ne >= 2) return -ne; + return 0; + }, + }, + }, + }, + //毛玠 + bingqing: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + var suit = get.suit(event.card); + if (!lib.suit.includes(suit)) return false; + var evt = event.getParent("phaseUse"); + if (!evt || player != evt.player) return false; + var list = [], + history = player.getHistory("useCard"); + if (history.length < 2) return false; + for (var i of history) { + if (i.getParent("phaseUse") != evt) continue; + var suit2 = get.suit(i.card); + if (!lib.suit.includes(suit2)) continue; + if (i != event && suit2 == suit) return false; + if (i.finished) list.add(suit2); + } + return list.length > 1 && list.length < 5; + }, + content: function () { + "step 0"; + var suit = get.suit(trigger.card); + var evt = event.getParent("phaseUse"); + var list = [], + history = player.getHistory("useCard"); + for (var i of history) { + if (i.getParent("phaseUse") != evt) continue; + var suit2 = get.suit(i.card); + if (!lib.suit.includes(suit2)) continue; + if (i.finished) list.add(suit2); + } + var prompt, filterTarget, ai; + switch (list.length) { + case 2: + prompt = "令一名角色摸两张牌"; + filterTarget = function (card, player, target) { + return true; + }; + ai = function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (target.hasSkill("nogain")) att /= 10; + return att / Math.sqrt(Math.min(5, 1 + target.countCards("h"))); + }; + break; + case 3: + prompt = "弃置一名角色区域内的一张牌"; + filterTarget = function (card, player, target) { + return target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "hej"); + }; + ai = function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy" }, player, player); + }; + break; + case 4: + prompt = "对一名其他角色造成1点伤害"; + filterTarget = function (card, player, target) { + return target != player; + }; + ai = function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }; + break; + default: + event.finish(); + return; + } + event.num = list.length; + player.chooseTarget(get.prompt("bingqing"), prompt, filterTarget).set("ai", ai); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("bingqing", target); + event.target = target; + event.goto(num); + } else event.finish(); + "step 2"; + target.draw(2); + event.finish(); + "step 3"; + player.discardPlayerCard(target, true, "hej"); + event.finish(); + "step 4"; + target.damage(); + }, + }, + yingfeng: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("yingfeng"), "令一名角色获得“奉”标记", function (card, player, target) { + return !target.hasSkill("yingfeng_mark"); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return 0; + var eff = 0.1; + var preTarget = game.findPlayer(function (current) { + return current != target && current.hasSkill("yingfeng_mark"); + }); + if (preTarget) { + if (get.attitude(player, preTarget) < 0) eff += 4; + else if (preTarget.hasValueTarget({ name: "sha" }, false) && !preTarget.hasValueTarget({ name: "sha" })) eff -= 3; + } + if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) eff += 3; + if (player == target) att *= 1.2; + return 0.01 + att * eff; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("yingfeng", target); + target.addAdditionalSkill("yingfeng_" + player.playerid, "yingfeng_mark"); + game.countPlayer(function (current) { + if (current != target && current.hasSkill("yingfeng_mark")) { + current.removeSkill("yingfeng_mark"); + current.removeAdditionalSkill("yingfeng_" + player.playerid); + } + }); + } + }, + subSkill: { + mark: { + charlotte: true, + mark: true, + marktext: "奉", + mod: { + targetInRange: () => true, + }, + intro: { content: "使用牌无距离限制" }, + }, + }, + }, + //猩黄忠 + spshidi: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + zhuanhuanji: "number", + filter: function (event, player) { + return player.countMark("spshidi") % 2 == ["phaseJieshu", "phaseZhunbei"].indexOf(event.name); + }, + content: function () { + player.changeZhuanhuanji("spshidi"); + }, + mod: { + globalFrom: function (from, to, distance) { + if (from.countMark("spshidi") % 2 == 0) return distance - 1; + }, + globalTo: function (from, to, distance) { + if (to.countMark("spshidi") % 2 == 1) return distance + 1; + }, + aiOrder: function (player, card, num) { + if (player.countMark("spshidi") % 2 == 0 && card.name == "sha" && get.color(card) == "black") return num + 0.1; + }, + }, + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + return "已转换过" + (storage || 0) + "次"; + }, + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.card || !arg.target || arg.card.name != "sha") return false; + return player.countMark("spshidi") % 2 == 0 && get.color(arg.card) == "black"; + }, + }, + group: ["spshidi_use", "spshidi_beused"], + subSkill: { + use: { + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countMark("spshidi") % 2 == 0 && get.color(event.card, false) == "black"; + }, + content: function () { + trigger.directHit.addArray(game.players); + }, + }, + beused: { + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countMark("spshidi") % 2 == 1 && get.color(event.card, false) == "red"; + }, + content: function () { + trigger.directHit.add(player); + }, + }, + }, + }, + spyishi: { + audio: 2, + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return player != event.player && event.player.countCards("e") > 0; + }, + check: function (event, player) { + return ( + get.damageEffect(event.player, player, player) < 0 || + (!event.player.hasSkillTag("noe") && + event.player.hasCard(function (card) { + return get.value(card) > 6; + }, "e")) + ); + }, + logTarget: "player", + content: function () { + trigger.num--; + player.gainPlayerCard(trigger.player, "e", true); + }, + }, + spqishe: { + enable: "chooseToUse", + viewAs: { name: "jiu" }, + filterCard: { type: "equip" }, + position: "hes", + viewAsFilter: function (player) { + return player.hasCard({ type: "equip" }, "ehs"); + }, + check: function (card) { + if (_status.event.type == "dying") return 1 / (get.value(card) || 0.5); + return 5 - get.value(card); + }, + locked: false, + mod: { + maxHandcard: function (player, num) { + return num + player.countCards("e"); + }, + }, + }, + //虞翻 + rezongxuan: { + inherit: "zongxuan", + group: "rezongxuan_place", + }, + rezongxuan_place: { + audio: "rezongxuan", + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + player.draw(); + "step 1"; + player.chooseCard("he", true, "将一张牌置于牌堆顶"); + "step 2"; + if (result && result.cards) { + event.card = result.cards[0]; + player.lose(result.cards, ui.cardPile, "insert"); + game.log(player, "将", get.position(event.card) == "h" ? "一张牌" : event.card, "置于牌堆顶"); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, player); + } else event.finish(); + }, + ai: { + order: 1, + result: { player: 1 }, + }, + }, + //孙寒华 + chongxu: { + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + player.chooseToPlayBeatmap(lib.skill.chongxu.beatmaps.randomGet()); + "step 1"; + var score = Math.floor(Math.min(5, result.accuracy / 17)); + event.score = score; + game.log(player, "的演奏评级为", "#y" + result.rank[0], ",获得积分点数", "#y" + score, "分"); + if (score < 3) { + if (score >= 2) player.draw(); + event.finish(); + return; + } + var list = []; + if (player.countMark("miaojian") < 2 && player.hasSkill("miaojian")) list.push("修改【妙剑】"); + if (player.countMark("shhlianhua") < 2 && player.hasSkill("shhlianhua")) list.push("修改【莲华】"); + if (list.length) { + list.push("全部摸牌"); + player.chooseControl(list).set("prompt", "冲虚:修改技能" + (score == 5 ? "并摸一张牌" : "") + ";或摸" + Math.floor(score / 2) + "张牌"); + } else event._result = { control: "全部摸牌" }; + "step 2"; + var score = event.score; + if (result.control != "全部摸牌") { + score -= 3; + var skill = result.control == "修改【妙剑】" ? "miaojian" : "shhlianhua"; + player.addMark(skill, 1, false); + game.log(player, "修改了技能", "#g【" + get.translation(skill) + "】"); + } + if (score > 1) player.draw(Math.floor(score / 2)); + }, + ai: { + order: 10, + result: { + player: 1, + }, + }, + beatmaps: [ + { + //歌曲名称 + name: "鳥の詩", + //歌曲文件名(默认在audio/effect文件夹下 若要重定向到扩展 请写为'ext:扩展名称/文件名'的格式) + filename: "tori_no_uta", + //每个音符的开始时间点(毫秒,相对未偏移的开始播放时间) + timeleap: [1047, 3012, 4978, 5469, 5961, 6452, 6698, 7435, 8909, 10875, 12840], + //开始播放时间的偏移量(毫秒) + current: -110, + //判定栏高度(相对整个对话框高度比例) + judgebar_height: 0.16, + //Good/Great/Prefect的位置判定范围(百分比,相对于整个对话框。以滑条的底部作为判定基准) + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + //滑条每相对于整个对话框下落1%所需的时间(毫秒) + speed: 25, + }, + { + name: "竹取飛翔 ~ Lunatic Princess", + filename: "taketori_hishou", + timeleap: [1021, 1490, 1959, 2896, 3834, 4537, 4771, 5709, 6646, 7585, 8039, 8494, 9403, 10291, 11180, 11832, 12049, 12920, 13345, 13771, 14196], + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(rgba(250, 170, 190, 1), rgba(240, 160, 180, 1))", + judgebar_color: "linear-gradient(rgba(240, 120, 243, 1), rgba(245, 106, 230, 1))", + }, + { + name: "ignotus", + filename: "ignotus", + //Number of tracks + //轨道数量 + number_of_tracks: 4, + //Customize the track to generate for every note (0 is the first track) + //自定义每个音符生成的轨道(0是第一个轨道) + mapping: [0, 2, 3, 1, 1, 0, 3, 0, 0, 3, 0, 0, 2, 1, 2], + //Convert from beats (0 is the first beat) to timeleap + //将节拍(0是第一拍)转换为开始时间点 + timeleap: game.generateBeatmapTimeleap(170, [0, 4, 8, 12, 14, 16, 16.5, 23.5, 24, 31, 32, 40, 45, 46, 47]), + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(rgba(240, 250, 240, 1), rgba(230, 240, 230, 1))", + judgebar_color: "linear-gradient(rgba(161, 59, 150, 1), rgba(58, 43, 74, 1))", + }, + { + name: "Super Mario 3D World Theme", + filename: "sm3dw_overworld", + //Random (Randomly choose tracks to generate notes each play) + //随机(每次演奏时音符会随机选择轨道生成) + mapping: "random", + timeleap: [0, 1071, 1518, 2054, 4018, 4286, 5357, 6429, 7500, 8571, 9643, 10714, 11786, 12321, 12589, 12857, 13929, 15000, 16071, 17143, 18214, 18482, 18750, 19018, 19286, 20357], + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(rgba(120, 130, 240, 1), rgba(100, 100, 230, 1))", + judgebar_color: "linear-gradient(rgba(230, 40, 30, 1), rgba(220, 30, 10, 1))", + }, + { + name: "只因你太美", + filename: "chicken_you_are_so_beautiful", + number_of_tracks: 7, + mapping: [3, 6, 4, 5, 6, 2, 3, 2, 1, 2, 0, 4, 3, 6, 5, 4, 3, 6, 3, 2, 3, 1, 0, 1, 2, 3, 4, 5, 6], + timeleap: game.generateBeatmapTimeleap(107, [2, 3.5, 4.5, 5.5, 6.5, 8.5, 10, 11.5, 12.5, 13.5, 14.5, 15.5, 18, 19.5, 20.5, 21.5, 22.5, 24.5, 26, 27.5, 28.5, 29.5, 30.5, 31, 31.5, 32, 32.5, 33, 33.5]), + //Hitsound file name (By default in the audio/effect folder. To redirect to the extension, please write in the format of 'ext:extension_name') + //打击音文件名(默认在audio/effect文件夹下 若要重定向到扩展 请写为'ext:扩展名称'的格式) + hitsound: "chickun.wav", + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(#99f, #66c)", + judgebar_color: "linear-gradient(#ccf, #99c)", + }, + { + name: "Croatian Rhapsody", + filename: "croatian_rhapsody", + mapping: [4, 1, 2, 1, 0, 0, 4, 5, 1, 3, 2, 1, 0, 0], + timeleap: game.generateBeatmapTimeleap(96, [4, 6, 8, 9, 10, 11, 12, 13.5, 14, 15.5, 16, 17, 18, 19]), + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(#fff, #ccc)", + judgebar_color: "linear-gradient(#fff, #ccc)", + }, + { + name: "罗刹海市", + filename: "rakshasa_sea_city", + number_of_tracks: 7, + mapping: "random", + timeleap: game.generateBeatmapTimeleap(150, [0, 2, 4, 6, 7, 9, 11, 13, 14, 16, 18, 20, 21, 23, 25, 27]), + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(#333, #000)", + judgebar_color: "linear-gradient(#c66, #933)", + }, + { + name: "Pigstep (Stereo Mix)", + filename: "pigstep", + number_of_tracks: 16, + timeleap: game.generateBeatmapTimeleap(170, [3, 4, 6, 6.5, 7.5, 11, 12, 14, 14.5, 15.5, 19, 20, 22, 22.5, 23.5, 27, 28, 30, 30.5, 31.5, 35, 36, 38, 38.5, 39.5, 43, 44, 46, 46.5, 47.5, 51, 52, 54, 54.5, 55.5, 59, 60, 62, 62.5]), + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(#066, #033)", + judgebar_color: "linear-gradient(#633, #300)", + }, + ], + derivation: "chongxu_faq", + }, + miaojian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var level = player.countMark("miaojian"); + if (event.filterCard({ name: "sha", nature: "stab" }, player, event)) { + if (level == 2) return true; + if ( + level == 1 && + player.hasCard(function (card) { + return get.type2(card) == "basic"; + }, "hs") + ) + return true; + if ( + level == 0 && + player.hasCard(function (card) { + return get.name(card) == "sha"; + }, "hs") + ) + return true; + } + if (event.filterCard({ name: "wuzhong" }, player, event)) { + if (level == 2) return true; + if ( + level == 1 && + player.hasCard(function (card) { + return get.type2(card) != "basic"; + }, "hes") + ) + return true; + if ( + level == 0 && + player.hasCard(function (card) { + return get.type2(card) == "trick"; + }, "hs") + ) + return true; + } + return false; + }, + chooseButton: { + dialog: function () { + return ui.create.dialog("妙剑", [ + [ + ["基本", "", "sha", "stab"], + ["锦囊", "", "wuzhong"], + ], + "vcard", + ]); + }, + filter: function (button, player) { + var event = _status.event.getParent(), + level = player.countMark("miaojian"); + if (button.link[2] == "sha") { + if (!event.filterCard({ name: "sha", nature: "stab" }, player, event)) return false; + if (level == 2) return true; + if (level == 1) + return player.hasCard(function (card) { + return get.type2(card) == "basic"; + }, "hs"); + return ( + level == 0 && + player.hasCard(function (card) { + return get.name(card) == "sha"; + }, "hs") + ); + } + if (button.link[2] == "wuzhong") { + if (!event.filterCard({ name: "wuzhong" }, player, event)) return false; + if (level == 2) return true; + if (level == 1) + return player.hasCard(function (card) { + return get.type2(card) != "basic"; + }, "hes"); + return ( + level == 0 && + player.hasCard(function (card) { + return get.type2(card) == "trick"; + }, "hs") + ); + } + }, + check: function (button) { + var card = { name: button.link[2], nature: button.link[3] }, + player = _status.event.player; + return get.value(card, player) * get.sgn(player.getUseValue(card)); + }, + backup: function (links, player) { + var index = links[0][2] == "sha" ? 0 : 1, + level = player.countMark("miaojian"); + var next = { + audio: "miaojian", + filterCard: [ + [ + function (card) { + return get.name(card) == "sha"; + }, + function (card) { + return get.type(card) == "basic"; + }, + () => false, + ], + [ + function (card) { + return get.type2(card) == "trick"; + }, + function (card) { + return get.type(card) != "basic"; + }, + () => false, + ], + ][index][level], + position: "hes", + check: function (card) { + if (card) return 6.5 - get.value(card); + return 1; + }, + viewAs: [ + { + name: "sha", + nature: "stab", + }, + { + name: "wuzhong", + }, + ][index], + }; + if (level == 2) { + next.selectCard = -1; + next.viewAs.isCard = true; + } + return next; + }, + prompt: function (links, player) { + var index = links[0][2] == "sha" ? 0 : 1, + level = player.countMark("miaojian"); + return [ + ["将一张【杀】当做刺【杀】使用", "将一张基本牌当做刺【杀】使用", "请选择刺【杀】的目标"], + ["将一张锦囊牌当做【无中生有】使用", "将一张非基本牌当做【无中生有】使用", "请选择【无中生有】的目标"], + ][index][level]; + }, + }, + onremove: true, + derivation: ["miaojian1", "miaojian2"], + subSkill: { backup: { audio: "miaojian" } }, + ai: { + order: 7, + result: { player: 1 }, + }, + }, + shhlianhua: { + audio: 2, + derivation: ["shhlianhua1", "shhlianhua2"], + trigger: { target: "useCardToTargeted" }, + forced: true, + locked: false, + filter: event => event.card.name == "sha", + content: function () { + "step 0"; + player.draw(); + var level = player.countMark("shhlianhua"); + if (!level) event.finish(); + else if (level == 2) event.goto(2); + else + player + .judge(function (result) { + return get.suit(result) == "spade" ? 1 : -1; + }) + .set("judge2", result => result.bool); + "step 1"; + if (result.bool) trigger.excluded.add(player); + event.finish(); + "step 2"; + var eff = get.effect(player, trigger.card, trigger.player, trigger.player); + trigger.player + .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(trigger.card) + "对" + get.translation(player) + "无效") + .set("ai", function (card) { + if (_status.event.eff > 0) { + return 10 - get.value(card); + } + return 0; + }) + .set("eff", eff); + "step 3"; + if (result.bool == false) { + trigger.getParent().excluded.add(player); + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && current < 0) return 0.7; + }, + }, + }, + }, + //阎圃 + huantu: { + audio: 2, + trigger: { global: "phaseDrawBefore" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0 && !player.hasSkill("huantu_round") && player.inRange(event.player); + }, + checkx: function (event, player) { + var target = event.player; + return get.attitude(player, target) > 0 && (target.hasSkill("pingkou") || target.skipList.includes("phaseUse") || (target.isDamaged() && target.hp <= 2) || target.needsToDiscard()); + }, + content: function () { + "step 0"; + player + .chooseCard(get.prompt("huantu", trigger.player), "交给其一张牌并令其暂时跳过摸牌阶段", "he") + .set("ai", function (card) { + if (!_status.event.checkx) return 0; + return 1 + Math.random(); + }) + .set("checkx", lib.skill.huantu.checkx(trigger, player)); + "step 1"; + if (result.bool) { + player.addTempSkill("huantu_round", "roundStart"); + player.logSkill("huantu", trigger.player); + player.give(result.cards, trigger.player); + trigger.cancel(); + player.addTempSkill("huantu_effect"); + } + }, + subSkill: { + round: { + charlotte: true, + mark: true, + intro: { content: "本轮已发动" }, + }, + effect: { + audio: "huantu", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + logTarget: "player", + filter: function (event, player) { + return event.player.isIn(); + }, + content: function () { + "step 0"; + var str = get.translation(trigger.player); + player + .chooseControl() + .set("choiceList", ["令" + str + "回复1点体力并摸两张牌", "摸三张牌,然后交给" + str + "两张手牌"]) + .set("choice", trigger.player.isDamaged() ? 0 : 1); + "step 1"; + if (result.index == 0) { + trigger.player.recover(); + trigger.player.draw(2); + event.finish(); + } else { + event.target = trigger.player; + player.draw(3); + } + "step 2"; + var hs = player.getCards("h"); + if (hs.length && target.isIn() && player.isIn()) { + if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else player.chooseCard("h", 2, true, "交给" + get.translation(target) + "两张手牌"); + } else event.finish(); + "step 3"; + if (result.bool) player.give(result.cards, trigger.player); + }, + }, + }, + }, + bihuo: { + trigger: { global: "dyingAfter" }, + logTarget: "player", + limited: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return event.player.isIn(); + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + content: function () { + player.awakenSkill("bihuo"); + trigger.player.draw(3); + trigger.player.addTempSkill("bihuo_effect", "roundStart"); + trigger.player.addMark("bihuo_effect", game.countPlayer(), false); + }, + subSkill: { + effect: { + onremove: true, + charlotte: true, + mod: { + globalTo: function (from, to, distance) { + return distance + to.countMark("bihuo_effect"); + }, + }, + intro: { content: "其他角色至你的距离+#" }, + }, + }, + }, + //马元义 + jibing: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + return player.getExpansions("jibing").length > 0 && (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) || event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)); + }, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("集兵", "hidden"); + if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) { + dialog._chooseButton = 2; + var list = ["sha", "shan"]; + dialog.add([ + list.map(i => { + return [i, get.translation(i)]; + }), + "tdnodes", + ]); + } else dialog._cardName = event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) ? "sha" : "shan"; + dialog.add(player.getExpansions("jibing")); + return dialog; + }, + filter: function (button) { + var evt = _status.event, + player = _status.event.player; + if (evt.dialog) { + if (!evt.dialog._chooseButton) { + var evt2 = _status.event.getParent(); + return evt2.filterCard(get.autoViewAs({ name: evt.dialog._cardName }, [button.link]), player, evt2); + } + if (ui.selected.buttons.length) { + var str = ui.selected.buttons[0].link; + if (typeof str != "string" || typeof button.link == "string") return false; + var evt2 = _status.event.getParent(); + return evt2.filterCard(get.autoViewAs({ name: str }, [button.link]), player, evt2); + } + return typeof button.link == "string"; + } + return false; + }, + select: function () { + return _status.event.dialog ? _status.event.dialog._chooseButton || 1 : 1; + }, + backup: function (links, player) { + var card, name; + if (links.length == 2) { + name = links[0]; + card = links[1]; + } else { + card = links[0]; + var event = _status.event; + name = event.filterCard(get.autoViewAs({ name: "sha" }, [card]), player, event) ? "sha" : "shan"; + } + return { + audio: "jibing", + filterCard: function (card) { + return card == lib.skill.jibing_backup.card; + }, + selectCard: -1, + position: "x", + viewAs: { name: name }, + card: card, + }; + }, + prompt: function (links, player) { + return "请选择【杀】的目标"; + }, + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + return player.getExpansions("jibing").length > 0; + }, + order: function (item, player) { + if (player.hasSkill("binghuo")) return 6; + return 1; + }, + result: { + player: 1, + }, + }, + group: "jibing_place", + subSkill: { + place: { + audio: "jibing", + trigger: { player: "phaseDrawBegin1" }, + prompt2: "摸牌阶段开始时,若你的“兵”数小于势力数,则你可以改为将牌堆顶的两张牌置于你的武将牌上,称为“兵”。", + filter: function (event, player) { + return !event.numFixed && player.getExpansions("jibing").length < game.countGroup(); + }, + content: function () { + trigger.changeToZero(); + var cards = get.cards(2); + player.addToExpansion(cards, "gain2").gaintag.add("jibing"); + }, + }, + backup: { audio: "jibing" }, + }, + intro: { content: "expansion", markcount: "expansion" }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + }, + wangjing: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + if (event.skill != "jibing_backup") return false; + var target = lib.skill.wangjing.logTarget(event, player); + return target && target.isMaxHp(); + }, + logTarget: function (event, player) { + if (event.name == "respond") return event.source; + if (event.card.name == "sha") return event.targets[0]; + return event.respondTo[0]; + }, + forced: true, + content: function () { + player.draw(); + }, + ai: { + combo: "jibing", + mingzhi: false, + effect: { + target: function (card, player, target, current) { + if ((get.tag(card, "respondShan") || get.tag(card, "respondSha")) && target.getExpansions("jibing").length > 0 && player.isMaxHp()) { + if (get.attitude(target, player) <= 0) { + return [0, 0, 1, 0.3]; + } + } + }, + }, + }, + }, + moucuan: { + audio: 2, + derivation: "binghuo", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "metal", + filter: function (event, player) { + return player.getExpansions("jibing").length >= game.countGroup(); + }, + content: function () { + player.awakenSkill("moucuan"); + player.loseMaxHp(); + player.addSkills("binghuo"); + }, + ai: { combo: "jibing" }, + }, + binghuo: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.hasHistory("useCard", function (evt) { + return evt.skill == "jibing_backup"; + }) || + player.hasHistory("respond", function (evt) { + return evt.skill == "jibing_backup"; + }) + ); + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("binghuo")).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("binghuo", target); + target.judge(function (card) { + if (get.color(card) == "black") return -2; + return 0.1; + }).judge2 = function (result) { + return result.bool === false ? true : false; + }; + } else event.finish(); + "step 2"; + if (result.bool == false) target.damage("thunder"); + }, + ai: { combo: "jibing", expose: 0.2 }, + }, + //司马孚 + xunde: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return event.player.isIn() && get.distance(player, event.player) <= 1; + }, + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) > 0 && (!event.source || get.attitude(player, event.source) < 0); + }, + content: function () { + "step 0"; + player.judge().set("callback", function () { + if (event.judgeResult.number > 5) { + var player = event.getParent(2)._trigger.player; + if (get.position(card, true) == "o") player.gain(card, "gain2"); + } + }); + "step 1"; + if (result.number < 7) { + var source = trigger.source; + if (source && source.isIn() && source.countCards("h") > 0) { + player.line(source); + source.chooseToDiscard("h", true); + } + } + }, + }, + chenjie: { + audio: 2, + trigger: { global: "judge" }, + filter: function (event, player) { + var suit = get.suit(event.player.judging[0], event.player); + return ( + player.countCards("hes", function (card) { + if (_status.connectMode && get.position(card) != "e") return true; + return get.suit(card) == suit; + }) > 0 + ); + }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + var suit = get.suit(trigger.player.judging[0], trigger.player); + player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("chenjie"), "hes", function (card) { + if (get.suit(card) != _status.event.suit) return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0.1; + if (attitude > 0) { + return result + 0.01; + } else { + return 0.01 - result; + } + }) + .set("judging", trigger.player.judging[0]) + .set("suit", suit) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + event.card = result.cards[0]; + player.respond(result.cards, "highlight", "chenjie", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = card; + trigger.orderingCards.add(card); + game.log(trigger.player, "的判定牌改为", card); + player.draw(2); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 0.1, + }, + }, + }, + //傅佥 + jueyong: { + audio: 2, + trigger: { target: "useCardToTarget" }, + forced: true, + filter: function (event, player) { + return event.card.name != "jiu" && event.card.name != "tao" && event.targets.length == 1 && event.card.isCard && event.cards.length == 1 && event.getParent(2).name != "jueyong_timeout" && get.position(event.cards[0], true) == "o" && event.card.name == event.cards[0].name && (!player.storage.jueyong || player.storage.jueyong[0].length < player.getHp()); + }, + content: function () { + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + trigger.untrigger(); + var card = trigger.cards[0]; + player.addToExpansion(card, "gain2").gaintag.add("jueyong"); + if (!player.storage.jueyong) player.storage.jueyong = [[], []]; + player.storage.jueyong[0].push(card); + player.storage.jueyong[1].push(trigger.player); + game.delayx(); + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + delete player.storage[skill]; + }, + intro: { + markcount: function (storage) { + if (!storage) return 0; + return storage[0].length; + }, + mark: function (dialog, storage, player) { + if (!storage) return; + dialog.addAuto(storage[0]); + dialog.addText(get.translation(storage[1])); + }, + onunmark: function (storage, player) { + player.storage.jueyong = [[], []]; + }, + }, + ai: { + reverseEquip: true, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.tag(card, "gifts") && target.storage.jueyong && target.storage.jueyong[1].length) { + var result1 = get.equipResult(player, target, card.name), + subtype = get.subtype(card); + for (var i of target.storage.jueyong[0]) { + if (get.subtype(i, false) == subtype && get.equipResult(target, target, i.name) >= result1) return "zerotarget"; + } + } + }, + }, + }, + group: "jueyong_timeout", + subSkill: { + timeout: { + audio: "jueyong", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.storage.jueyong && player.storage.jueyong[0].length > 0; //=Math.max(1,player.getDamagedHp()); + }, + content: function () { + var list = player.storage.jueyong, + card = list[0].shift(), + source = list[1].shift(); + if (player.getExpansions("jueyong").includes(card)) { + if (source && source.isIn() && source.canUse(card, player, false)) source.useCard(card, player, false); + else player.loseToDiscardpile(card); + } + if (list[0].length) event.redo(); + }, + }, + }, + }, + poxiang: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: (event, player) => player.countCards("he") > 0, + filterCard: true, + filterTarget: lib.filter.notMe, + position: "he", + discard: false, + lose: false, + delay: false, + check: function (card) { + var player = _status.event.player; + if ( + !player.storage.jueyong || + !player.storage.jueyong[0].length || + (player.hp <= 1 && + !player.storage.jueyong[0].some(function (card) { + return get.tag(card, "damage") > 0; + })) || + !player.storage.jueyong[0].some(function (card) { + return get.effect(player, card, player.storage.jueyong[1][player.storage.jueyong[0].indexOf(card)], player) < 0; + }) + ) + return -1; + return 20 - get.value(card); + }, + content: function () { + "step 0"; + player.give(cards, target); + player.draw(3).gaintag = ["poxiang"]; + player.addTempSkill("poxiang_mark"); + "step 1"; + var cards = player.getExpansions("jueyong"); + if (cards.length) player.loseToDiscardpile(cards); + player.unmarkSkill("jueyong"); + player.loseHp(); + "step 2"; + //player.skip('phaseDiscard'); + game.delayx(); + }, + ai: { + order: 12, + result: { + player: 4, + target: 1, + }, + }, + subSkill: { + mark: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("poxiang"); + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("poxiang")) { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("poxiang")) { + return false; + } + }, + }, + }, + }, + }, + //曹真 + disordersidi: { audio: 2 }, + discretesidi: { + audio: "disordersidi", + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + return ( + get.type(event.card, false) != "delay" && + game.hasPlayer(function (current) { + return player != current && (!player.storage.discretesidi || !player.storage.discretesidi.includes(current)); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("discretesidi"), "选择两名角色a,b建立二元序偶,或仅选择一名角色,建立二元序偶", [1, 2], function (card, player, target) { + if (ui.selected.targets.length) return true; + return target != player && (!player.storage.discretesidi || !player.storage.discretesidi.includes(target)); + }) + .set("complexTarget", true) + .set("complexSelect", true) + .set("targetprompt", ["第一元素", "第二元素"]) + .set("ai", function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) { + if (target.getEnemies().length == 1) return 2 + Math.random(); + return 1 + Math.random(); + } + var targetx = ui.selected.targets[0]; + if (targetx.getEnemies().includes(target) && targetx.inRange(target)) return Math.random() - 0.5; + return 0; + }).animate = false; + "step 1"; + if (result.bool && result.targets.length) { + var targets = result.targets; + player.logSkill("discretesidi", targets[0]); + if (targets.length == 1) targets.push(targets[0]); + if (!player.storage.discretesidi) player.storage.discretesidi = []; + if (!player.storage.discretesidi2) player.storage.discretesidi2 = []; + player.storage.discretesidi.push(targets[0]); + player.storage.discretesidi2.push(targets[1]); + player.markSkill("discretesidi"); + game.delayx(); + } + }, + intro: { + content: function (storage, player) { + if ((player == game.me || player.isUnderControl()) && !game.observe) { + var str = "R={ "; + for (var i = 0; i < storage.length; i++) { + str += "<" + get.translation(storage[i]) + ", " + get.translation(player.storage.discretesidi2[i]) + ">"; + if (i < storage.length - 1) str += ", "; + } + str += " }"; + return str; + } + return "已指定" + get.translation(storage) + "为目标"; + }, + }, + onremove: function (player) { + delete player.storage.discretesidi; + delete player.storage.discretesidi2; + }, + group: ["discretesidi_clear", "discretesidi_exec"], + subSkill: { + clear: { + trigger: { global: ["useCardToPlayered", "die"] }, + forced: true, + popup: false, + locked: false, + filter: function (event, player) { + if (!player.storage.discretesidi || !player.storage.discretesidi.includes(event.player)) return false; + if (event.name == "die") return true; + if (get.type(event.card, false) != "delay") { + var index = player.storage.discretesidi.indexOf(event.player); + return index != -1 && (player.storage.discretesidi2[index] != event.target || event.targets.length != 1); + } + return false; + }, + content: function () { + player.storage.discretesidi2.splice(player.storage.discretesidi.indexOf(trigger.player), 1); + player.unmarkAuto("discretesidi", [trigger.player]); + }, + }, + exec: { + audio: "disordersidi", + trigger: { global: "useCardToPlayered" }, + forced: true, + locked: false, + filter: function (event, player) { + if (get.type(event.card, false) == "delay" || !player.storage.discretesidi || event.targets.length != 1) return false; + var index = player.storage.discretesidi.indexOf(event.player); + return index != -1 && player.storage.discretesidi2[index] == event.target; + }, + logTarget: "player", + content: function () { + "step 0"; + player.storage.discretesidi2.splice(player.storage.discretesidi.indexOf(trigger.player), 1); + player.unmarkAuto("discretesidi", [trigger.player]); + if (trigger.target == player) { + player.draw(); + event.finish(); + return; + } + var target = trigger.player; + event.target = target; + player + .chooseControl("cancel2") + .set("choiceList", ["取消" + get.translation(trigger.card) + "的所有目标并对" + get.translation(target) + "造成1点伤害", "摸两张牌"]) + .set("ai", function () { + var player = _status.event.player, + evt = _status.event.getTrigger(); + if (get.damageEffect(evt.player, player, player) > 0 && get.effect(evt.target, evt.card, evt.player, player) < 0) return 0; + return 1; + }); + "step 1"; + if (result.index == 0) { + trigger.cancel(); + trigger.targets.length = 0; + trigger.getParent().triggeredTargets1.length = 0; + if (!_status.dying.length) target.damage(); + } else if (result.index == 1) player.draw(2); + }, + }, + }, + }, + //孙鲁班 + xinzenhui: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (event.targets.length != 1) return false; + var card = event.card; + if (card.name != "sha" && (get.type(card, null, false) != "trick" || get.color(card, false) != "black")) return false; + if (!player.isPhaseUsing() || player.hasSkill("xinzenhui2")) return false; + return game.hasPlayer(function (current) { + return current != player && current != event.target && lib.filter.targetEnabled2(card, player, current) && lib.filter.targetInRange(card, player, current); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xinzenhui"), function (card, player, target) { + if (player == target) return false; + var evt = _status.event.getTrigger(); + return !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return Math.max(target.countGainableCards(player, "he") ? get.effect(target, { name: "shunshou_copy2" }, player, player) : 0, get.effect(target, trigger.card, player, player)); + }); + "step 1"; + if (result.bool) { + player.addTempSkill("xinzenhui2", "phaseUseAfter"); + var target = result.targets[0], + str = get.translation(target); + event.target = target; + player.logSkill("xinzenhui", target); + if (!target.countGainableCards(player, "he")) event._result = { index: 0 }; + else + player + .chooseControl() + .set("choiceList", ["令" + str + "也成为" + get.translation(trigger.card) + "的目标", "获得" + str + "的一张牌,然后其成为" + get.translation(trigger.card) + "的使用者"]) + .set("ai", function () { + var trigger = _status.event.getTrigger(); + var player = _status.event.player, + target = _status.event.getParent().target; + return (target.countGainableCards(player, "he") ? get.effect(target, { name: "shunshou_copy2" }, player, player) : 0) > get.effect(target, trigger.card, player, player) ? 1 : 0; + }); + } else event.finish(); + "step 2"; + if (result.index == 1) { + trigger.untrigger(); + trigger.getParent().player = event.target; + game.log(event.target, "成为了", trigger.card, "的使用者"); + player.gainPlayerCard(target, true, "he"); + } else { + game.log(event.target, "成为了", trigger.card, "的额外目标"); + trigger.getParent().targets.push(event.target); + } + }, + }, + xinzenhui2: {}, + xinjiaojin: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) && event.source && event.source.hasSex("male"); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard("he", "骄矜:是否弃置一张装备牌防止伤害?", function (card, player) { + return get.type(card) == "equip"; + }); + next.set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1 || _status.event.getTrigger().num > 1) { + return 9 - get.value(card); + } + if (player.hp == 2) { + return 8 - get.value(card); + } + return 7 - get.value(card); + }); + next.logSkill = "xinjiaojin"; + "step 1"; + if (result.bool) { + game.delay(0.5); + trigger.cancel(); + } + }, + }, + //新华歆 + yuanqing: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + return player.hasHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; + }); + }, + content: function () { + var map = {}, + cards = []; + player.getHistory("useCard", function (evt) { + if (evt.getParent("phaseUse") == trigger) { + var type = get.type2(evt.card, false); + if (!map[type]) map[type] = []; + } + }); + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var card = ui.discardPile.childNodes[i], + type = get.type2(card, false); + if (map[type]) map[type].push(card); + } + for (var i in map) { + if (map[i].length) cards.push(map[i].randomGet()); + } + if (cards.length) { + player.$gain2(cards, false); + game.cardsGotoSpecial(cards, "toRenku"); + game.log(player, "将", cards, "置入了仁库"); + game.delayx(); + } + }, + init: function (player) { + player.storage.renku = true; + }, + }, + shuchen: { + audio: 2, + init: function (player) { + player.storage.renku = true; + }, + trigger: { global: "dying" }, + forced: true, + filter: function (event, player) { + return _status.renku.length > 3; + }, + logTarget: "player", + content: function () { + player.gain(_status.renku, "gain2", "fromRenku"); + _status.renku.length = 0; + game.updateRenku(); + trigger.player.recover(); + }, + }, + //谯周 + zhiming: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseDiscardEnd"] }, + frequent: true, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (player.countCards("he") > 0) { + var next = player.chooseCard("he", "是否将一张牌置于牌堆顶?"); + if (trigger.name == "phaseZhunbei") { + next.set("ai", function (card) { + var player = _status.event.player, + js = player.getCards("j"); + if (js.length) { + var judge = get.judge(js[0]); + if (judge && judge(card) >= 0) return 20 - get.value(card); + } + return 0; + }); + } else + next.set("ai", function (card) { + var player = _status.event.player, + js = player.next.getCards("j"); + if (js.length) { + var judge = get.judge(js[0]); + if (judge && (judge(card) + 0.01) * get.attitude(player, player.next) > 0) return 20 - get.value(card); + } + return 0; + }); + } else event.finish(); + "step 2"; + if (result.bool) { + player.$throw(get.position(result.cards[0]) == "e" ? result.cards[0] : 1, 1000); + game.log(player, "将", get.position(result.cards[0]) == "e" ? result.cards[0] : "#y一张手牌", "置于了牌堆顶"); + player.lose(result.cards, ui.cardPile, "insert"); + } else event.finish(); + "step 3"; + game.updateRoundNumber(); + game.delayx(); + }, + ai: { guanxing: true }, + }, + xingbu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + prompt2: "亮出牌堆顶的三张牌,并可以根据其中红色牌的数量,令一名其他角色获得一种效果", + content: function () { + "step 0"; + var cards = get.cards(3); + //for(var i=cards.length-1;i--;i>=0){ + // ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); + //} + game.updateRoundNumber(); + event.cards = cards; + //game.cardsGotoOrdering(cards); + player.showCards(cards, get.translation(player) + "发动了【星卜】"); + "step 1"; + var num = 0; + for (var i of cards) { + if (get.color(i, false) == "red") num++; + } + player.chooseTarget("是否选择一名其他角色获得星卜效果(" + get.cnNumber(num) + "张)?", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + num = _status.event.getParent().num; + var att = get.attitude(player, target); + if (num < 3) att *= -1; + if (num == 2 && target.hasJudge("lebu")) att *= -1.4; + return att; + }); + if (num == 0) num = 1; + event.num = num; + "step 2"; + if (result.bool) { + var skill = "xingbu_effect" + num, + target = result.targets[0]; + player.line(target, "green"); + game.log(player, "选择了", target); + target.addTempSkill(skill, { player: "phaseEnd" }); + target.addMark(skill, 1, false); + game.delayx(); + } + }, + subSkill: { + effect1: { + charlotte: true, + onremove: true, + intro: { content: "准备阶段开始时弃置#张手牌" }, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + player.chooseToDiscard("h", true, player.countMark("xingbu_effect1")); + }, + }, + effect2: { + charlotte: true, + onremove: true, + intro: { content: "使用【杀】的次数上限-#,跳过弃牌阶段" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num - player.countMark("xingbu_effect2"); + }, + }, + trigger: { player: "phaseDiscardBegin" }, + forced: true, + content: function () { + trigger.cancel(); + }, + }, + effect3: { + charlotte: true, + onremove: true, + intro: { content: "摸牌阶段多摸2*#张牌,使用【杀】的次数上限+#。" }, + trigger: { player: ["phaseDrawBegin2"] }, + forced: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + if (trigger.name == "phaseDraw") trigger.num += player.countMark("xingbu_effect3") * 2; + }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("xingbu_effect3"); + }, + }, + }, + }, + }, + //顾雍 + xinshenxing: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return (player.getStat("skill").xinshenxing || 0) < player.hp && player.countCards("he") > 1; + }, + selectCard: 2, + position: "he", + check: function (card) { + if (!ui.selected.cards.length || get.color(card) != get.color(ui.selected.cards[0])) return 6.5 - get.value(card); + return 6.5 - get.value(card) - get.value(ui.selected.cards[0]); + }, + filterCard: true, + content: function () { + player.draw(get.color(cards) == "none" ? 2 : 1); + }, + ai: { + order: 1, + result: { player: 1 }, + }, + }, + xinbingyi: { + audio: "bingyi", + audioname: ["xin_guyong"], + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterx: function (event, player) { + var cards = player.getCards("h"); + if (cards.length == 1) return true; + var color = get.color(cards[0], player), + type = get.type2(cards[0], player); + for (var i = 1; i < cards.length; i++) { + if (color && get.color(cards[i], player) != color) color = false; + if (type && get.type2(cards[i], player) != type) type = false; + if (!color && !type) return false; + } + return true; + }, + direct: true, + content: function () { + "step 0"; + if (lib.skill.xinbingyi.filterx(trigger, player)) { + player + .chooseTarget(get.prompt("xinbingyi"), "展示所有手牌,并选择至多" + get.cnNumber(player.countCards("h")) + "名角色各摸一张牌", [0, player.countCards("h")], function (card, player, target) { + return true; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + } else + player.chooseBool(get.prompt("bingyi"), "展示所有手牌").ai = function () { + return false; + }; + "step 1"; + if (result.bool) { + player.logSkill("xinbingyi"); + player.showHandcards(get.translation(player) + "发动了【秉壹】"); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (targets && targets.length) { + player.line(targets, "green"); + targets.sortBySeat(); + game.asyncDraw(targets); + } + }, + ai: { + expose: 0.1, + }, + }, + //钟会 + requanji: { + audio: 2, + trigger: { player: ["damageEnd", "phaseUseEnd"] }, + frequent: true, + locked: false, + notemp: true, + filter: function (event, player) { + if (event.name == "phaseUse") return player.countCards("h") > player.hp; + return event.num > 0; + }, + content: function () { + "step 0"; + event.count = trigger.num || 1; + "step 1"; + event.count--; + player.draw(); + "step 2"; + if (player.countCards("h")) { + player.chooseCard("将一张手牌置于武将牌上作为“权”", true); + } else { + event.goto(4); + } + "step 3"; + if (result.cards && result.cards.length) { + player.addToExpansion(result.cards, player, "give").gaintag.add("quanji"); + } + "step 4"; + if (event.count > 0 && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { + player.chooseBool(get.prompt2("requanji")).set("frequentSkill", event.name); + } else event.finish(); + "step 5"; + if (result.bool) { + player.logSkill("requanji"); + event.goto(1); + } + }, + mod: { + maxHandcard(player, num) { + return num + player.getExpansions("quanji").length; + }, + aiOrder(player, card, num) { + if (num <= 0 || typeof card !== "object" || !player.isPhaseUsing() || !player.hasSkill("zili") || player.needsToDiscard()) return num; + if (player.getExpansions("quanji").length < 3 && player.getUseValue(card) < Math.min(4, (player.hp * player.hp) / 4)) return 0; + }, + }, + onremove: function (player, skill) { + var cards = player.getExpansions("quanji"); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { + maixie: true, + maixie_hp: true, + threaten: 0.8, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; + if (!target.hasSkill("paiyi") && target.hp > 1) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; + } + }, + }, + }, + }, + //蔡夫人 + xinqieting: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.getHistory("sourceDamage", function (evt) { + return evt.player != event.player; + }).length == 0 + ); + }, + content: function () { + "step 0"; + var list = ["摸一张牌"], + target = trigger.player, + str = get.translation(target); + event.target = target; + event.addIndex = 0; + if (target.countCards("h") > 0) list.push("观看" + str + "的两张手牌并获得其中一张"); + else event.addIndex++; + if ( + target.countCards("e", function (card) { + return player.canEquip(card); + }) > 0 + ) + list.push("将" + str + "装备区内的一张牌移动至自己的装备区"); + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("prompt", get.prompt("xinqieting", target)) + .set("ai", function () { + var evt = _status.event.getParent(); + if (get.attitude(evt.player, evt.target) > 0) return 0; + var val = evt.target.hasSkillTag("noe") ? 6 : 0; + if ( + evt.target.countCards("e", function (card) { + return evt.player.canEquip(card) && get.value(card, evt.target) > val && get.effect(evt.player, card, evt.player, evt.player) > 0; + }) > 0 + ) + return 2 - evt.addIndex; + if (evt.target.countCards("h") > 0) return 1; + return 0; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("xinqieting", target); + if (result.index == 0) { + player.draw(); + event.finish(); + } else if (result.index + event.addIndex == 1) { + player.choosePlayerCard(target, "h", 2, true); + player.addExpose(0.2); + event.goto(3); + } else { + player.addExpose(0.1); + player + .choosePlayerCard(target, "e", true) + .set("filterButton", function (button) { + return _status.event.player.canEquip(button.link); + }) + .set("ai", function (button) { + var player = _status.event.player; + return get.effect(player, button.link, player, player); + }); + } + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.cards[0]; + target.$give(card, player, false); + game.delay(0.5); + player.equip(card); + } + event.finish(); + "step 3"; + if (result.bool) player.chooseButton(["选择获得一张牌", result.cards], true); + else event.finish(); + "step 4"; + if (result.bool) { + var card = result.links[0]; + if (lib.filter.canBeGained(card, player, target)) player.gain(card, target, "giveAuto", "bySelf"); + else game.log("但", card, "不能被", player, "获得!"); + } + }, + }, + mobilezhongyong: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (event.card.name != "sha" || !event.isPhaseUsing(player)) return false; + if (event.cards.filterInD().length > 0) return true; + var list = lib.skill.mobilezhongyong.getResponds(event); + if (list.length) { + for (var evt of list) { + if (evt.cards.filterInD("od").length > 0) return true; + } + } + return false; + }, + getResponds: function (event) { + var list = []; + for (var i of event.targets) { + list.addArray( + i.getHistory("useCard", function (evt) { + return evt.card.name == "shan" && evt.respondTo && evt.respondTo[1] == event.card; + }) + ); + } + return list; + }, + content: function () { + "step 0"; + event.shas = trigger.cards.filterInD(); + var list = lib.skill.mobilezhongyong.getResponds(trigger); + if (list.length) { + event.shans = []; + for (var evt of list) { + event.shans.addArray(evt.cards.filterInD("od")); + } + event.goto(2); + } else + player.chooseBool(get.prompt("mobilezhongyong"), "获得" + get.translation(event.shas)).set("ai", function () { + var evt = _status.event.getParent(); + return get.value(evt.shas, evt.player) > 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("mobilezhongyong"); + player.addTempSkill("mobilezhongyong_buff"); + player.gain(event.shas, "gain2").gaintag.add("mobilezhongyong"); + } + event.finish(); + "step 2"; + var shans = get.translation(event.shans), + choiceList = ["获得" + shans]; + if ( + game.hasPlayer(function (current) { + return current != player && !trigger.targets.includes(current); + }) + ) { + if (event.shas.length) choiceList[0] += ",然后可以令另一名其他角色获得" + get.translation(event.shas); + choiceList.push("令另一名其他角色获得" + shans + ",然后你于本回合内使用【杀】的次数上限+1且下一张【杀】的伤害值基数+1"); + } + player + .chooseControl("cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("mobilezhongyong")) + .set("ai", function () { + var evt = _status.event.getParent(), + player = evt.player, + tri = _status.event.getTrigger(); + if ( + game.hasPlayer(function (current) { + return current != player && !tri.targets.includes(current) && get.attitude(player, current) > 0; + }) && + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card); + }) > player.getCardUsable({ name: "sha" }) + ) + return 1; + return 0; + }); + "step 3"; + if (result.index == 0) { + player.logSkill("mobilezhongyong"); + player.addTempSkill("mobilezhongyong_buff"); + player.gain(event.shans, "gain2").gaintag.add("mobilezhongyong"); + } else event.goto(6); + "step 4"; + event.shas = event.shas.filterInD("od"); + if ( + event.shas.length && + game.hasPlayer(function (current) { + return current != player && !trigger.targets.includes(current); + }) + ) { + player + .chooseTarget("是否令一名其他角色获得" + get.translation(event.shas) + "?", function (card, player, target) { + return target != player && !_status.event.getTrigger().targets.includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return att; + if (target.hasSkillTag("nogain")) return att / 10; + if (!target.hasSha()) return 2 * att; + return att; + }); + } else event.finish(); + "step 5"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(event.shas, "gain2"); + } + event.finish(); + "step 6"; + player + .chooseTarget("令一名其他角色获得" + get.translation(event.shans), true, function (card, player, target) { + return target != player && !_status.event.getTrigger().targets.includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return att; + if (target.hasSkillTag("nogain")) return att / 10; + if (!target.hasShan()) return 2 * att; + return att; + }); + "step 7"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mobilezhongyong", target); + target.gain(event.shans, "gain2"); + player.addTempSkill("mobilezhongyong_buff"); + player.addMark("mobilezhongyong_buff", 1, false); + player.addMark("mobilezhongyong_damage", 1, false); + } + }, + subSkill: { + buff: { + mod: { + cardEnabled2: function (card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("mobilezhongyong")) return false; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("mobilezhongyong_buff"); + }, + }, + trigger: { player: "useCard1" }, + firstDo: true, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return event.card.name == "sha" && player.countMark("mobilezhongyong_damage") > 0; + }, + content: function () { + trigger.baseDamage += player.storage.mobilezhongyong_damage; + delete player.storage.mobilezhongyong_damage; + }, + onremove: function (player) { + delete player.storage.mobilezhongyong_buff; + delete player.storage.mobilezhongyong_damage; + player.removeGaintag("mobilezhongyong"); + }, + }, + }, + }, + rejieyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt2("rejieyue"), + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + ai1: function (card) { + var player = _status.event.player; + if (get.name(card) == "du") return 20; + if (get.position(card) == "e" && get.value(card) <= 0) return 14; + if ( + get.position(card) == "h" && + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0 && current.getUseValue(card) > player.getUseValue(card) && current.getUseValue(card) > player.getUseValue(card); + }) + ) + return 12; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) { + if (card.name == "wuxie") return 11; + if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; + } + return 6 / Math.max(1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player; + var card = ui.selected.cards[0]; + var att = get.attitude(player, target); + if (card.name == "du") return -6 * att; + if (att > 0) { + if (get.position(card) == "h" && target.getUseValue(card) > player.getUseValue(card)) return 4 * att; + if (get.value(card, target) > get.value(card, player)) return 2 * att; + return 1.2 * att; + } + return (-att * Math.min(4, target.countCards("he"))) / 4; + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("rejieyue", target); + player.give(result.cards, target); + } else event.finish(); + "step 2"; + var num = 0; + if (target.countCards("h")) num++; + if (target.countCards("e")) num++; + if (num > 0) { + var next = target.chooseCard("he", num, "选择保留每个区域的各一张牌,然后弃置其余的牌。或点取消,令" + get.translation(player) + "摸三张牌", function (card) { + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.position(ui.selected.cards[i]) == get.position(card)) return false; + } + return true; + }); + next.set("complexCard", true); + next.set("goon", get.attitude(target, player) >= 0); + next.set("maxNum", num); + next.set("ai", function (card) { + if (_status.event.goon) return -1; + var num = _status.event.maxNum; + if (ui.selected.cards.length >= num - 1) { + var cards = player.getCards("he", function (cardx) { + return cardx != card && !ui.selected.cards.includes(cardx); + }); + var val = 0; + for (var cardx of cards) val += get.value(cardx); + if (val >= 14) return 0; + } + return get.value(card); + }); + } else event._result = { bool: false }; + "step 3"; + if (!result.bool) player.draw(3); + else { + var cards = target.getCards("he"); + cards.removeArray(result.cards); + if (cards.length) target.discard(cards); + } + }, + ai: { + threaten: 1.3, + expose: 0.2, + }, + }, + tiansuan: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return !player.storage.tiansuan2; + }, + content: function () { + "step 0"; + player + .chooseControl("上上签", "上签", "中签", "下签", "下下签", "cancel2") + .set("prompt", "天算:是否增加其中一个命运签的权重?") + .set("ai", function () { + return Math.random() < 0.5 ? 0 : 4; + }); + "step 1"; + var list = [0, 1, 1, 2, 2, 2, 3, 3, 4]; + if (result.control != "cancel2") list.push(result.index); + var num = list.randomGet(); + event.num = num; + var str = get.translation(player) + "抽取的命运签为:" + lib.skill["tiansuan2_" + num].name; + game.log(player, "抽取出了", "#g" + lib.skill["tiansuan2_" + num].name); + event.dialog = ui.create.dialog(str); + event.videoId = lib.status.videoId++; + game.broadcast("createDialog", event.videoId, str); + game.pause(); + setTimeout(function () { + game.resume(); + }, 1500); + "step 2"; + event.dialog.close(); + game.broadcast("closeDialog", event.videoId); + player.chooseTarget(true, "令一名角色获得“" + lib.skill["tiansuan2_" + num].name + "”").set("ai", lib.skill["tiansuan2_" + num].aiCheck); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.log(player, "令", target, "获得了命运签"); + player.storage.tiansuan2 = target; + player.storage.tiansuan3 = "tiansuan2_" + num; + player.addTempSkill("tiansuan2", { player: "phaseBegin" }); + target.addSkill("tiansuan2_" + num); + if (num < 2 && target.countGainableCards(player, target == player ? "e" : "he") > 0) { + var next = player.gainPlayerCard(target, target == player ? "e" : "he", true); + if (num == 0) next.visible = true; + } else game.delayx(); + } + }, + derivation: "tiansuan_faq", + ai: { + order: 7, + result: { + player: 1, + }, + }, + }, + tiansuan2: { + charlotte: true, + onremove: function (player, skill) { + if (player.storage.tiansuan2) player.storage.tiansuan2.removeSkill(player.storage.tiansuan3); + delete player.storage.tiansuan2; + delete player.storage.tiansuan3; + }, + }, + tiansuan2_0: { + name: "上上签", + trigger: { player: "damageBegin4" }, + forced: true, + charlotte: true, + content: function () { + trigger.cancel(); + }, + mark: true, + intro: { + content: "当你受到伤害时,防止此伤害。", + }, + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_0")) return 0; + var player = _status.event.player; + var att = get.attitude(player, target); + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) + ) + att *= 2; + return att / Math.sqrt(Math.max(1, target.hp)); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) return "zerotarget"; + }, + }, + }, + }, + tiansuan2_1: { + name: "上签", + trigger: { player: "damageBegin4" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.num > 1; + }, + content: function () { + trigger.num = 1; + }, + group: "tiansuan2_damage", + mark: true, + intro: { + content: "当你受到伤害时,你令伤害值改为1;当你受到1点伤害后,你摸一张牌。", + }, + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_1")) return 0; + var player = _status.event.player; + var att = get.attitude(player, target); + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) + ) + att *= 2; + if (target.hp == 1) return att / 2; + return att / Math.sqrt(Math.max(1, target.hp)); + }, + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; + } + }, + effect: { + target: function (card, player, target, current) { + if (target && target.hp > 1 && get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) return 0.8; + }, + }, + }, + }, + tiansuan2_damage: { + trigger: { player: "damageEnd" }, + charlotte: true, + content: function () { + player.draw(trigger.num); + }, + }, + tiansuan2_2: { + name: "中签", + trigger: { player: "damageBegin4" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.num > 1; + }, + content: function () { + trigger.num = 1; + }, + mark: true, + intro: { + content: "当你受到伤害时,你令伤害属性改为火属性并将伤害值改为1。", + }, + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_2")) return 0; + var player = _status.event.player; + target.addSkill("tiansuan2_ai"); + var num = get.damageEffect(target, player, player, "fire"); + target.removeSkill("tiansuan2_ai"); + return num; + }, + group: ["tiansuan2_fire", "tiansuan2_ai"], + }, + tiansuan2_ai: { + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; + } + }, + }, + }, + tiansuan2_fire: { + trigger: { player: "damageBefore" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !event.hasNature("fire"); + }, + content: function () { + game.setNature(trigger, "fire"); + }, + }, + tiansuan2_3: { + name: "下签", + trigger: { player: "damageBegin3" }, + forced: true, + charlotte: true, + content: function () { + trigger.num++; + }, + mark: true, + intro: { + content: "当你受到伤害时,你令此伤害+1。", + }, + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_3")) return 0; + var player = _status.event.player; + var att = get.attitude(player, target); + return -att / Math.sqrt(Math.max(1, target.hp)); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target) && current < 0) return 1.3; + }, + }, + }, + }, + tiansuan2_4: { + name: "下下签", + trigger: { player: "damageBegin3" }, + forced: true, + charlotte: true, + content: function () { + trigger.num++; + }, + mod: { + cardEnabled: function (card, player) { + if (card.name == "tao" || card.name == "jiu") return false; + }, + cardSavable: function (card, player) { + if (card.name == "tao" || card.name == "jiu") return false; + }, + }, + mark: true, + intro: { + content: "当你受到伤害时,你令此伤害+1。你不能使用【酒】或【桃】。", + }, + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_4")) return 0; + var player = _status.event.player; + var att = get.attitude(player, target); + return -att / Math.sqrt(Math.max(1, target.hp)); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target) && current < 0) return 1.3; + }, + }, + }, + }, + relieren: { + shaRelated: true, + audio: 2, + audioname: ["boss_lvbu3"], + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && player.canCompare(event.target); + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + //priority:5, + content: function () { + "step 0"; + player.chooseToCompare(trigger.target).clear = false; + "step 1"; + if (result.bool) { + if (trigger.target.countGainableCards(player, "he")) player.gainPlayerCard(trigger.target, true, "he"); + ui.clear(); + } else { + var card1 = result.player; + var card2 = result.target; + if (get.position(card1) == "d") trigger.target.gain(card1, "gain2"); + if (get.position(card2) == "d") player.gain(card2, "gain2"); + } + }, + }, + retiaoxin: { + audio: "tiaoxin", + audioname: ["sp_jiangwei", "xiahouba", "re_jiangwei"], + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he"); + }, + content: function () { + "step 0"; + 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); + "step 1"; + if (result.bool == false && target.countCards("he") > 0) { + player.discardPlayerCard(target, "he", true); + } else { + event.finish(); + } + }, + ai: { + order: 4, + expose: 0.2, + result: { + target: -1, + player: function (player, target) { + if (!target.canUse("sha", player)) return 0; + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; + return -0.5; + }, + }, + threaten: 1.1, + }, + }, + //南华老仙 + yufeng: { + inherit: "yufeng_old", + content: function () { + "step 0"; + if (_status.connectMode) event.time = lib.configOL.choose_timeout; + event.videoId = lib.status.videoId++; + var maxScore = Math.max(2, 1 + player.countMark("yufeng")); + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + game.pause(); + game.countChoose(); + setTimeout(function () { + _status.imchoosing = false; + var max = Math.max(2, 1 + player.countMark("yufeng")); + var score = Math.random() < 0.5 ? max : get.rand(1, max); + event._result = { + bool: true, + score: score, + win: score >= max, + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + game.resume(); + }, 5000); + }; + var createDialog = function (player, id) { + if (_status.connectMode) lib.configOL.choose_timeout = "30"; + if (player == game.me) return; + var str = get.translation(player) + "正在表演《御风飞行》...
    "; + ui.create.dialog(str).videoId = id; + }; + var chooseButton = function (maxScore) { + lib.skill.yufeng.$playFlappyBird(maxScore); + }; + //event.switchToAuto=switchToAuto; + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { + chooseButton(maxScore); + } else if (event.isOnline()) { + event.player.send(chooseButton, maxScore); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 1"; + game.broadcastAll( + function (id, time) { + if (_status.connectMode) lib.configOL.choose_timeout = time; + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + }, + event.videoId, + event.time + ); + var result = event.result || result; + player.popup(get.cnNumber(result.score) + "分", result.win ? "wood" : "fire"); + game.log(player, "御风飞行", result.win ? "#g成功" : "#y失败"); + game.log(player, "获得了", "#g" + result.score + "分"); + var max = player.countMark("yufeng"); + if (!result.win) { + if (result.score) player.draw(result.score); + if (max) player.removeMark("yufeng", max, false); + event.finish(); + } else { + if (max < 2) player.addMark("yufeng", 1, false); + event.score = result.score; + player + .chooseTarget("请选择【御风】的目标", [1, result.score], function (card, player, target) { + return target != player && !target.hasSkill("yufeng2"); + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = -get.attitude(player, target), + attx = att * 2; + if (att <= 0 || target.hasSkill("xinfu_pdgyingshi")) return 0; + if (target.hasJudge("lebu")) attx -= att; + if (target.hasJudge("bingliang")) attx -= att; + return attx / Math.max(2.25, Math.sqrt(target.countCards("h") + 1)); + }); + } + "step 2"; + if (result.bool) { + result.targets.sortBySeat(); + player.line(result.targets, "green"); + game.log(result.targets, "获得了", "#y“御风”", "效果"); + for (var i of result.targets) i.addSkill("yufeng2"); + if (event.score > result.targets.length) player.draw(event.score - result.targets.length); + } else player.draw(event.score); + }, + $playFlappyBird: function (maxScore, title) { + //Forked from: https://github.com/aaarafat/JS-Flappy-Bird + + const event = _status.event; + const dialog = ui.create.dialog("forcebutton", "hidden"); + dialog.textPrompt = dialog.add('
    准备好了吗?
    '); + dialog.classList.add("fixed"); + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + dialog.classList.add("noupdate"); + const updateText = function (str) { + dialog.textPrompt.innerHTML = '
    ' + str + "
    "; + }; + + const canvas = document.createElement("canvas"); + dialog.appendChild(canvas); + canvas.style.position = "absolute"; + canvas.style.width = "276px"; + canvas.style.height = "414px"; + canvas.style.left = "calc(50% - 141px)"; + canvas.style.top = "calc(50% - 200px)"; + canvas.width = 276; + canvas.height = 414; + canvas.style.border = "3px solid"; + + const RAD = Math.PI / 180; + const ctx = canvas.getContext("2d"); + let frames = 0; + let dx = 0.1; + let previousDOMHighResTimeStamp = performance.now(); + let deltaTime = 0; + const state = { + curr: 0, + getReady: 0, + Play: 1, + gameOver: 2, + gameSuccess: 3, + }; + const SFX = { + start: new Audio(), + flap: new Audio(), + score: new Audio(), + hit: new Audio(), + die: new Audio(), + played: false, + }; + const gnd = { + sprite: new Image(), + x: 0, + y: 0, + draw: function () { + this.y = parseFloat(canvas.height - this.sprite.height); + ctx.drawImage(this.sprite, this.x, this.y); + }, + update: function () { + if (state.curr == state.gameOver || state.curr == state.gameSuccess) return; + this.x -= dx * deltaTime; + const halfWidth = this.sprite.width / 4; + if (this.x <= -halfWidth) this.x += halfWidth; + }, + }; + const bg = { + sprite: new Image(), + x: 0, + y: 0, + draw: function () { + let y = parseFloat(canvas.height - this.sprite.height); + ctx.drawImage(this.sprite, this.x, y); + }, + }; + const pipe = { + top: { sprite: new Image() }, + bot: { sprite: new Image() }, + gap: 127, + moved: true, + pipes: [], + numberOfPipes: 1, + timeElapsed: 0, + draw: function () { + for (let i = 0; i < this.pipes.length; i++) { + let p = this.pipes[i]; + ctx.drawImage(this.top.sprite, p.x, p.y); + ctx.drawImage(this.bot.sprite, p.x, p.y + parseFloat(this.top.sprite.height) + this.gap); + } + }, + update: function () { + if (state.curr != state.Play) return; + this.timeElapsed += deltaTime; + if (this.timeElapsed >= 1600) { + this.timeElapsed -= 1600; + this.pipes.push({ + x: parseFloat(canvas.width), + y: -210 * Math.min(Math.random() * 0.8 + 1.2, 1.8), + }); + } + this.pipes.forEach(pipe => { + pipe.x -= dx * deltaTime; + }); + if (this.pipes.length && this.pipes[0].x < -this.top.sprite.width) { + this.pipes.shift(); + this.moved = true; + } + }, + }; + const bird = { + animations: [{ sprite: new Image() }, { sprite: new Image() }, { sprite: new Image() }, { sprite: new Image() }], + rotatation: 0, + x: 50, + y: 100, + speed: 0, + gravity: 0.0004, + thrust: 0.18, + frame: 0, + timeElapsed: 0, + totalTimeElapsed: 0, + draw: function () { + let h = this.animations[this.frame].sprite.height; + let w = this.animations[this.frame].sprite.width; + ctx.save(); + ctx.translate(this.x, this.y); + ctx.rotate(this.rotatation * RAD); + ctx.drawImage(this.animations[this.frame].sprite, -w / 2, -h / 2); + ctx.restore(); + }, + update: function () { + this.totalTimeElapsed += deltaTime; + let r = parseFloat(this.animations[0].sprite.width) / 2; + switch (state.curr) { + case state.getReady: + case state.gameSuccess: + this.rotatation = 0; + this.timeElapsed += deltaTime; + if (this.timeElapsed >= 200) { + this.timeElapsed -= 200; + this.y += Math.sin((this.totalTimeElapsed / 10) * RAD); + this.frame++; + } + break; + case state.Play: + this.timeElapsed += deltaTime; + if (this.timeElapsed >= 100) { + this.timeElapsed -= 100; + this.frame++; + } + this.y += this.speed * deltaTime; + this.setRotation(); + this.speed += this.gravity * deltaTime; + if (UI.score.curr >= maxScore) { + state.curr = state.gameSuccess; + this.timeElapsed = 0; + updateText(`${title || "御风飞行"}表演成功!`); + setTimeout(switchToAuto, 2000); + } else if (this.y + r >= gnd.y || this.collisioned()) { + state.curr = state.gameOver; + this.timeElapsed = 0; + updateText(`${title || "御风飞行"}表演失败……`); + setTimeout(switchToAuto, 2000); + } + break; + case state.gameOver: + this.frame = 1; + if (this.y + r < gnd.y) { + this.y += this.speed * deltaTime; + this.setRotation(); + this.speed += this.gravity * deltaTime; + } else { + this.speed = 0; + this.y = gnd.y - r; + this.rotatation = 90; + if (!SFX.played) { + Promise.resolve(SFX.die.play()).catch(() => void 0); + SFX.played = true; + } + } + break; + } + const animationsLength = this.animations.length; + if (this.frame >= animationsLength) this.frame -= animationsLength; + }, + flap: function () { + if (this.y <= 0) return; + const flap = SFX.flap; + flap.currentTime = 0; + if (flap.paused) Promise.resolve(flap.play()).catch(() => void 0); + this.speed = -this.thrust; + }, + setRotation: function () { + if (this.speed <= 0) { + this.rotatation = Math.max(-25, (-25 * this.speed) / (-1 * this.thrust)); + } else if (this.speed > 0) { + this.rotatation = Math.min(90, (90 * this.speed) / (this.thrust * 2)); + } + }, + collisioned: function () { + if (!pipe.pipes.length) return; + let bird = this.animations[0].sprite; + let x = pipe.pipes[0].x; + let y = pipe.pipes[0].y; + let r = bird.height / 4 + bird.width / 4; + let roof = y + parseFloat(pipe.top.sprite.height); + let floor = roof + pipe.gap; + let w = parseFloat(pipe.top.sprite.width); + if (this.x + r >= x) { + if (this.x + r < x + w) { + if (this.y - r <= roof || this.y + r >= floor) { + Promise.resolve(SFX.hit.play()).catch(() => void 0); + return true; + } + } else if (pipe.moved) { + updateText(`当前分数:${++UI.score.curr}`); + const score = SFX.score; + score.currentTime = 0; + if (score.paused) Promise.resolve(score.play()).catch(() => void 0); + pipe.moved = false; + } + } + }, + }; + const UI = { + getReady: { sprite: new Image() }, + gameOver: { sprite: new Image() }, + gameClear: { sprite: new Image() }, + tap: [{ sprite: new Image() }, { sprite: new Image() }], + score: { + curr: 0, + best: 0, + }, + x: 0, + y: 0, + tx: 0, + ty: 0, + frame: 0, + timeElapsed: 0, + draw: function () { + switch (state.curr) { + case state.getReady: + this.y = parseFloat(canvas.height - this.getReady.sprite.height) / 2; + this.x = parseFloat(canvas.width - this.getReady.sprite.width) / 2; + this.tx = parseFloat(canvas.width - this.tap[0].sprite.width) / 2; + this.ty = this.y + this.getReady.sprite.height - this.tap[0].sprite.height; + ctx.drawImage(this.getReady.sprite, this.x, this.y); + ctx.drawImage(this.tap[this.frame].sprite, this.tx, this.ty); + break; + case state.gameOver: + case state.gameSuccess: + this.y = parseFloat(canvas.height - this.gameOver.sprite.height) / 2; + this.x = parseFloat(canvas.width - this.gameOver.sprite.width) / 2; + this.tx = parseFloat(canvas.width - this.tap[0].sprite.width) / 2; + this.ty = this.y + this.gameOver.sprite.height - this.tap[0].sprite.height; + ctx.drawImage((state.curr == state.gameOver ? this.gameOver : this.gameClear).sprite, this.x, this.y); + } + }, + update: function () { + if (state.curr == state.Play) return; + this.timeElapsed += deltaTime; + if (this.timeElapsed >= 200) { + this.timeElapsed -= 200; + this.frame++; + } + const tapLength = this.tap.length; + if (this.frame >= tapLength) this.frame -= tapLength; + }, + }; + gnd.sprite.src = lib.assetURL + "image/flappybird/ground.png"; + bg.sprite.src = lib.assetURL + "image/flappybird/BG.png"; + pipe.top.sprite.src = lib.assetURL + "image/flappybird/toppipe.png"; + pipe.bot.sprite.src = lib.assetURL + "image/flappybird/botpipe.png"; + UI.gameOver.sprite.src = lib.assetURL + "image/flappybird/gameover.png"; + UI.gameClear.sprite.src = lib.assetURL + "image/flappybird/gameclear.png"; + UI.getReady.sprite.src = lib.assetURL + "image/flappybird/getready.png"; + UI.tap[0].sprite.src = lib.assetURL + "image/flappybird/tap/t0.png"; + UI.tap[1].sprite.src = lib.assetURL + "image/flappybird/tap/t1.png"; + bird.animations[0].sprite.src = lib.assetURL + "image/flappybird/bird/b0.png"; + bird.animations[1].sprite.src = lib.assetURL + "image/flappybird/bird/b1.png"; + bird.animations[2].sprite.src = lib.assetURL + "image/flappybird/bird/b2.png"; + bird.animations[3].sprite.src = lib.assetURL + "image/flappybird/bird/b0.png"; + + SFX.start.src = lib.assetURL + "audio/effect/flappybird_start.wav"; + SFX.flap.src = lib.assetURL + "audio/effect/flappybird_flap.wav"; + SFX.score.src = lib.assetURL + "audio/effect/flappybird_score.wav"; + SFX.hit.src = lib.assetURL + "audio/effect/flappybird_hit.wav"; + SFX.die.src = lib.assetURL + "audio/effect/flappybird_die.wav"; + + const gameLoop = domHighResTimeStamp => { + if (frames < 0) return; + deltaTime = domHighResTimeStamp - previousDOMHighResTimeStamp; + previousDOMHighResTimeStamp = domHighResTimeStamp; + update(); + draw(); + frames++; + window.requestAnimationFrame(gameLoop); + }; + + const update = function () { + bird.update(); + gnd.update(); + pipe.update(); + UI.update(); + }; + + const draw = function () { + ctx.fillStyle = "#30c0df"; + ctx.fillRect(0, 0, canvas.width, canvas.height); + bg.draw(); + pipe.draw(); + + bird.draw(); + gnd.draw(); + UI.draw(); + }; + + const click = function () { + switch (state.curr) { + case state.getReady: + state.curr = state.Play; + bird.timeElapsed = 0; + Promise.resolve(SFX.start.play()).catch(() => void 0); + updateText(`当前分数:${UI.score.curr}`); + break; + case state.Play: + bird.flap(); + } + }; + const switchToAuto = function () { + event._result = { + bool: true, + score: UI.score.curr, + win: UI.score.curr >= maxScore, + }; + dialog.close(); + game.resume(); + _status.imchoosing = false; + frames = -1; + document.removeEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", click); + }; + + dialog.open(); + game.pause(); + game.countChoose(); + + document.addEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", click); + window.requestAnimationFrame(gameLoop); + }, + }, + yufeng_old: { + audio: 2, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + if (_status.connectMode) event.time = lib.configOL.choose_timeout; + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + game.pause(); + game.countChoose(); + setTimeout(function () { + _status.imchoosing = false; + var max = Math.max(2, 1 + game.me.countMark("yufeng")); + var score = Math.random() < 0.5 ? max : get.rand(1, max); + event._result = { + bool: true, + score: score, + win: score >= max, + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + game.resume(); + }, 5000); + }; + var createDialog = function (player, id) { + if (_status.connectMode) lib.configOL.choose_timeout = "30"; + if (player == game.me) return; + var str = get.translation(player) + "正在表演《御风飞行》...
    "; + ui.create.dialog(str).videoId = id; + }; + var chooseButton = function () { + var roundmenu = false; + if (ui.roundmenu && ui.roundmenu.display != "none") { + roundmenu = true; + ui.roundmenu.style.display = "none"; + } + var event = _status.event; + event.settleed = false; + event.score = 0; + event.dialog = ui.create.dialog("forcebutton", "hidden"); + event.dialog.textPrompt = event.dialog.add('
    准备好了吗?准备好了的话就点击屏幕开始吧!
    '); + var max = Math.max(2, 1 + game.me.countMark("yufeng")); + event.dialog.textPrompt.style["z-index"] = 10; + event.switchToAuto = function () { + event._result = { + bool: true, + score: event.score, + win: event.score >= max, + }; + event.dialog.close(); + game.resume(); + _status.imchoosing = false; + if (roundmenu) ui.roundmenu.style.display = ""; + }; + event.dialog.classList.add("fixed"); + event.dialog.classList.add("scroll1"); + event.dialog.classList.add("scroll2"); + event.dialog.classList.add("fullwidth"); + event.dialog.classList.add("fullheight"); + event.dialog.classList.add("noupdate"); + event.dialog.style.overflow = "hidden"; + event.dialog.open(); + + var height = event.dialog.offsetHeight; + var width = event.dialog.offsetWidth; + var top = 50; + var speed = 0; + var start = false; + + var bird = ui.create.div(""); + bird.style["background-image"] = "linear-gradient(rgba(240, 235, 3, 1), rgba(230, 225, 5, 1))"; + bird.style["border-radius"] = "3px"; + var pipes = []; + bird.style.position = "absolute"; + bird.style.height = "40px"; + bird.style.width = "40px"; + bird.style.left = Math.ceil(width / 3) + "px"; + bird.style.top = (top / 100) * height + "px"; + bird.updatePosition = function () { + bird.style.transform = "translateY(" + ((top / 100) * height - bird.offsetTop) + "px)"; + }; + event.dialog.appendChild(bird); + var isDead = function () { + if (top > 100 || top < 0) return true; + var btop = top; + var bleft = 100 / 3; + var bdown = btop + 5; + var bright = bleft + 5; + for (var i of pipes) { + var left2 = i.left; + var right2 = left2 + 10; + var bottom2 = i.height1; + var top2 = i.height2; + + if (left2 > bright || right2 < bleft) continue; + if (btop < bottom2) return true; + if (bdown > top2) return true; + return false; + } + return false; + }; + + var fly = function () { + if (!start) { + start = true; + event.dialog.textPrompt.innerHTML = '
    当前分数:' + event.score + "
    "; + speed = -4; + event.fly = setInterval(function () { + top += speed; + if (top < 0) top = 0; + bird.updatePosition(); + for (var i of pipes) { + i.left -= 0.5; + i.updateLeft(); + } + speed += 0.5; + if (speed > 2.5) speed = 2.5; + + if (isDead() == true) { + event.settle(); + } + }, 35); + var addPipe = function () { + var num = get.rand(5, 55); + + var pipe1 = ui.create.div(""); + pipe1.style["background-image"] = "linear-gradient(rgba(57, 133, 4, 1), rgba(60, 135, 6, 1))"; + pipe1.style["border-radius"] = "3px"; + pipe1.style.position = "absolute"; + pipe1.height1 = num; + pipe1.height2 = num + 50; + pipe1.left = 110; + pipe1.num = 1; + pipe1.style.height = Math.ceil((height * num) / 100) + "px"; + pipe1.style.width = width / 10 + "px"; + pipe1.style.left = (pipe1.left * width) / 100 + "px"; + pipe1.style.top = "0px"; + + var pipe2 = ui.create.div(""); + pipe2.style["background-image"] = "linear-gradient(rgba(57, 133, 4, 1), rgba(60, 135, 6, 1))"; + pipe2.style["border-radius"] = "3px"; + pipe1.pipe2 = pipe2; + pipe2.style.position = "absolute"; + pipe2.style.height = Math.ceil(((100 - pipe1.height2) * height) / 100) + "px"; + pipe2.style.width = width / 10 + "px"; + pipe2.style.left = (pipe1.left * width) / 100 + "px"; + pipe2.style.top = Math.ceil((pipe1.height2 * height) / 100) + "px"; + pipes.add(pipe1); + event.dialog.appendChild(pipe1); + event.dialog.appendChild(pipe2); + pipe1.updateLeft = function () { + this.style.transform = "translateX(" + ((this.left / 100) * width - this.offsetLeft) + "px)"; + this.pipe2.style.transform = "translateX(" + ((this.left / 100) * width - this.pipe2.offsetLeft) + "px)"; + if (this.left < 25 && !this.score) { + this.score = true; + event.score++; + event.dialog.textPrompt.innerHTML = '
    当前分数:' + event.score + "
    "; + if (event.score >= max) { + event.settle(); + } + } + if (this.left < -15) { + this.remove(); + this.pipe2.remove(); + pipes.remove(this); + } + }; + }; + event.addPipe = setInterval(addPipe, 2500); + } else if (speed > 0) { + speed = -4; + } + }; + document.addEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", fly); + + event.settle = function () { + clearInterval(event.fly); + clearInterval(event.addPipe); + document.removeEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", fly); + setTimeout(function () { + event.switchToAuto(); + }, 1000); + }; + + game.pause(); + game.countChoose(); + }; + //event.switchToAuto=switchToAuto; + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { + chooseButton(); + } else if (event.isOnline()) { + event.player.send(chooseButton); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 1"; + game.broadcastAll( + function (id, time) { + if (_status.connectMode) lib.configOL.choose_timeout = time; + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + }, + event.videoId, + event.time + ); + var result = event.result || result; + player.popup(get.cnNumber(result.score) + "分", result.win ? "wood" : "fire"); + game.log(player, "御风飞行", result.win ? "#g成功" : "#y失败"); + game.log(player, "获得了", "#g" + result.score + "分"); + var max = player.countMark("yufeng"); + if (!result.win) { + if (result.score) player.draw(result.score); + if (max) player.removeMark("yufeng", max, false); + event.finish(); + } else { + if (max < 2) player.addMark("yufeng", 1, false); + event.score = result.score; + player + .chooseTarget("请选择【御风】的目标", [1, result.score], function (card, player, target) { + return target != player && !target.hasSkill("yufeng2"); + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = -get.attitude(player, target), + attx = att * 2; + if (att <= 0 || target.hasSkill("xinfu_pdgyingshi")) return 0; + if (target.hasJudge("lebu")) attx -= att; + if (target.hasJudge("bingliang")) attx -= att; + return attx / Math.max(2.25, Math.sqrt(target.countCards("h") + 1)); + }); + } + "step 2"; + if (result.bool) { + result.targets.sortBySeat(); + player.line(result.targets, "green"); + game.log(result.targets, "获得了", "#y“御风”", "效果"); + for (var i of result.targets) i.addSkill("yufeng2"); + if (event.score > result.targets.length) player.draw(event.score - result.targets.length); + } else player.draw(event.score); + }, + ai: { + order: 10, + result: { player: 1 }, + threaten: 3.2, + }, + }, + yufeng2: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: false, + forced: true, + charlotte: true, + content: function () { + "step 0"; + player.removeSkill("yufeng2"); + player.judge(); + "step 1"; + if (result.color == "red") player.skip("phaseDraw"); + else { + player.skip("phaseUse"); + player.skip("phaseDiscard"); + } + }, + mark: true, + intro: { + content: "准备阶段时进行判定,结果为红则跳过摸牌阶段,为黑则跳过出牌阶段和弃牌阶段", + }, + ai: { + order: 7, + result: { + player: 1, + }, + }, + }, + tianshu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ( + player.countCards("he") && + !game.hasPlayer(function (current) { + return current.countCards("ej", "taipingyaoshu"); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt2("tianshu"), + filterCard: true, + position: "he", + ai1: function (card) { + return 5 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0 && !target.hasEmptySlot(2)) return 0; + return get.attitude(player, target); + }, + }); + "step 1"; + if (!result.bool) { + event.finish(); + return; + } + var target = result.targets[0]; + event.target = target; + player.logSkill("tianshu", target); + player.discard(result.cards); + if (!lib.inpile.includes("taipingyaoshu")) { + lib.inpile.push("taipingyaoshu"); + event.card = game.createCard2("taipingyaoshu", "heart", 3); + } else { + event.card = get.cardPile(function (card) { + return card.name == "taipingyaoshu"; + }); + } + if (!event.card) event.finish(); + else target.gain(event.card, "gain2"); + "step 2"; + if (target.getCards("h").includes(card) && get.name(card, target) == "taipingyaoshu") target.chooseUseTarget(card, "nopopup", true); + }, + }, + //界伏寿 + xinzhuikong: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + check: function (event, player) { + if (get.attitude(player, event.player) < -2) { + var cards = player.getCards("h"); + if (cards.length > player.hp) return true; + for (var i = 0; i < cards.length; i++) { + var useful = get.useful(cards[i]); + if (useful < 5) return true; + if (cards[i].number > 7 && useful < 7) return true; + } + } + return false; + }, + logTarget: "player", + filter: function (event, player) { + return !player.hasSkill("xinzhuikong2") && player.hp <= event.player.hp && player.canCompare(event.player); + }, + content: function () { + "step 0"; + player.addTempSkill("xinzhuikong2", "roundStart"); + player.chooseToCompare(trigger.player).set("small", player.hp > 1 && get.effect(player, { name: "sha" }, trigger.player, player) > 0 && Math.random() < 0.9); + "step 1"; + if (result.bool) { + trigger.player.addTempSkill("zishou2"); + event.finish(); + } else if (result.target && get.position(result.target) == "d") player.gain(result.target, "gain2", "log"); + "step 2"; + var card = { name: "sha", isCard: true }; + if (trigger.player.canUse(card, player, false)) trigger.player.useCard(card, player, false); + }, + }, + xinzhuikong2: { charlotte: true }, + xinqiuyuan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasPlayer(function (current) { + return current != player && !event.targets.includes(current) && lib.filter.targetEnabled(event.card, event.player, current); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xinqiuyuan"), function (card, player, target) { + var evt = _status.event.getTrigger(); + return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled(evt.card, evt.player, target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, trigger.player, player) + 0.1; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xinqiuyuan", target); + event.target = target; + target + .chooseCard( + function (card, player) { + var name = get.name(card, player); + return name != "sha" && get.type(name) == "basic"; + }, + "h", + "交给" + get.translation(player) + "一张不为【杀】的基本牌,或成为此杀的额外目标" + ) + .set("ai", function (card) { + return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1; + }) + .set("sourcex", player); + game.delay(); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + target.give(result.cards, player); + game.delay(); + } else { + trigger.getParent().targets.push(event.target); + trigger.getParent().triggeredTargets2.push(event.target); + game.log(event.target, "成为了", trigger.card, "的额外目标"); + } + }, + ai: { + expose: 0.2, + effect: { + target: function (card, player, target) { + if (card.name != "sha") return; + var players = game.filterPlayer(); + if (get.attitude(player, target) <= 0) { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, target) > 0 && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) < 0) { + if (target.hp == target.maxHp) return 0.3; + return 0.6; + } + } + } else { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) > 0) { + if (player.canUse(card, target2)) return; + if (target.hp == target.maxHp) return [0, 1]; + return [0, 0]; + } + } + } + }, + }, + }, + }, + //界潘璋马忠 + xinduodao: { + audio: 2, + trigger: { player: "damageEnd" }, + logTarget: "source", + filter: function (event, player) { + var source = event.source; + if (!source) return false; + var cards = source.getEquips(1); + return cards.some(card => lib.filter.canBeGained(card, player, source)); + }, + prompt2: function (event, player) { + var source = event.source; + var cards = source.getEquips(1).filter(card => lib.filter.canBeGained(card, player, source)); + return "获得其装备区中的" + get.translation(cards); + }, + check: function (event, player) { + return (get.attitude(player, event.source) + 0.1) * get.value(event.source.getEquip(1), event.source); + }, + content: function () { + var source = trigger.source; + var cards = source.getEquips(1).filter(card => lib.filter.canBeGained(card, player, source)); + player.gain(cards, source, "give", "bySelf"); + }, + }, + xinanjian: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + forced: true, + logTarget: "target", + filter: function (event, player) { + return event.card.name == "sha" && !player.inRangeOf(event.target); + }, + content: function () { + "step 0"; + var card = get.translation(trigger.card); + var target = get.translation(trigger.target); + player + .chooseControl() + .set("prompt", "暗箭:请选择一项") + .set("choiceList", ["令" + target + "不能响应" + card, "令" + card + "对" + target + "的伤害值基数+1"]) + .set("ai", function () { + var target = _status.event.getTrigger().target; + var player = _status.event.player; + var num = target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ? 0 + : 1; + if (get.attitude(player, target) > 0) num = 1 - num; + return num; + }); + "step 1"; + if (result.index == 0) { + game.log(player, "令", trigger.card, "不能被", trigger.target, "响应"); + trigger.directHit.push(trigger.target); + } else { + game.log(player, "令", trigger.card, "对", trigger.target, "的伤害+1"); + var id = trigger.target.playerid; + var map = trigger.customArgs; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; + map[id].extraDamage++; + } + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.card || !arg.target || arg.card.name != "sha" || arg.target.inRange(player) || get.attitude(player, arg.target) > 0) return false; + }, + }, + }, + //界郭笨 + mobilejingce: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + var num = 0; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "cardsDiscard") return; + var evtx = evt.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + if (evt2 && (evt2.name == "useCard" || evt2.name == "respond")) num += evt.cards.length; + }); + return num >= player.hp; + }, + content: function () { + player.draw(2); + }, + group: "mobilejingce_count", + intro: { + content: function (num, player) { + if (num == 0) return "一张都没有?就这?"; + if (num < player.hp) return "才" + get.cnNumber(num) + "张?就这?"; + return "卧槽,牛逼啊,居然" + get.cnNumber(num) + "张了!"; + }, + }, + }, + mobilejingce_count: { + trigger: { + global: ["cardsDiscardEnd", "phaseBefore"], + player: "phaseAfter", + }, + silent: true, + firstDo: true, + filter: function (evt, player) { + if (evt.name == "phase") return true; + if (player != _status.currentPhase) return false; + var evtx = evt.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + return evt2 && (evt2.name == "useCard" || evt2.name == "respond"); + }, + content: function () { + if (trigger.name == "phase") player.unmarkSkill("mobilejingce"); + else { + var num = 0; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "cardsDiscard") return; + var evtx = evt.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + if (evt2 && (evt2.name == "useCard" || evt2.name == "respond")) num += evt.cards.length; + }); + player.storage.mobilejingce = num; + player.markSkill("mobilejingce"); + } + }, + }, + //公孙康 + juliao: { + mod: { + globalTo: function (from, to, distance) { + return distance + game.countGroup() - 1; + }, + }, + }, + taomie: { + audio: 3, + group: ["taomie1", "taomie2", "taomie3"], + trigger: { source: "damageBegin1" }, + forced: true, + locked: false, + direct: true, + filter: function (event, player) { + return event.player.hasMark("taomie"); + }, + content: function () { + "step 0"; + player.logSkill(Math.random() < 0.5 ? "taomie2" : "taomie3", trigger.player); + var target = get.translation(trigger.player); + player + .chooseControl() + .set("prompt", "讨灭:请选择一项") + .set("choiceList", ["令即将对" + target + "造成的伤害+1", "获得" + target + "的一张牌,并可将其交给另一名其他角色", "依次执行以上所有选项,并移去" + target + "的“讨灭”标记"]) + .set("ai", function () { + var evt = _status.event.getTrigger(); + var player = _status.event.player; + var target = evt.player; + var bool1 = !target.hasSkillTag("filterDamage", null, { + player: player, + card: evt.card, + }); + var bool2 = get.effect(target, { name: "shunshou" }, player, player) > 0; + if (bool1 && bool2 && target.hp <= evt.num + 1) return 2; + if (bool1) return 0; + return 1; + }); + "step 1"; + if (result.index == 2) { + trigger.taomie_player = trigger.player; + trigger.player.addTempSkill("taomie4"); + } + if (result.index != 1) { + trigger.num++; + } + if (result.index != 0 && trigger.player.countGainableCards(player, "hej") > 0) { + player.gainPlayerCard(trigger.player, "hej", true); + } else event.finish(); + "step 2"; + var card = result.cards[0]; + if ( + card && + player.getCards("h").includes(card) && + game.hasPlayer(function (current) { + return current != player && current != trigger.player; + }) + ) { + event.card = card; + player + .chooseTarget("是否将" + get.translation(card) + "交给一名其他角色?", function (card, player, target) { + return target != player && target != _status.event.getTrigger().player; + }) + .set("ai", function (target) { + var player = _status.event.player; + var card = _status.event.getParent().card; + if (target.hasSkillTag("nogain") || !player.needsToDiscard() || (get.tag(card, "damage") && player.hasValueTarget(card, null, false) && get.effect(_status.event.getTrigger().player, card, null, false) > 0)) return 0; + return get.attitude(player, target) / (1 + target.countCards("h")); + }); + } else event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + player.give(card, target); + } + }, + mod: { + inRangeOf: function (from, to) { + if (from.hasMark("taomie")) return true; + }, + inRange: function (from, to) { + if (to.hasMark("taomie")) return true; + }, + }, + intro: { + content: "mark", + }, + ai: { + effect: { + player: function (card, player, target) { + if (target && get.tag(card, "damage") && target.hasMark("taomie")) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.attitude(player, target) > 0) { + return 0.7; + } + return 1.2; + } + }, + }, + }, + }, + taomie1: { + audio: true, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + logTarget: function (trigger, player) { + if (player == trigger.player) return trigger.source; + return trigger.player; + }, + filter: function (event, player) { + var target = lib.skill.taomie1.logTarget(event, player); + return target && target.isIn() && !target.hasMark("taomie"); + }, + check: function (event, player) { + var target = lib.skill.taomie1.logTarget(event, player); + if (get.attitude(player, target) > 0) return false; + var target0 = game.findPlayer(function (current) { + return current.hasMark("taomie"); + }); + if (!target0) return true; + var eff1 = 0, + eff2 = 0; + player.countCards("h", function (card) { + if (!get.tag(card, "damage")) return false; + if (player.hasValueTarget(card, null, true) > 0) { + if (player.canUse(card, target, null, true)) { + var eff = get.effect(target, card, player, player); + if (eff > 0) eff1 += eff; + } + if (player.canUse(card, target0, null, true)) { + var eff = get.effect(target0, card, player, player); + if (eff > 0) eff2 += eff; + } + } + }); + return eff1 > eff2; + }, + prompt2: function (event, player) { + var target = lib.skill.taomie1.logTarget(event, player); + var str = "令" + get.translation(target) + "获得“讨灭”标记"; + if ( + game.hasPlayer(function (current) { + return current.hasMark("taomie"); + }) + ) + str += ",并移去场上已有的“讨灭”标记"; + return str; + }, + content: function () { + game.countPlayer(function (current) { + var num = current.countMark("taomie"); + if (num) current.removeMark("taomie"); + }); + lib.skill.taomie1.logTarget(trigger, player).addMark("taomie", 1); + }, + }, + taomie2: { audio: true }, + taomie3: { audio: true }, + taomie4: { + trigger: { + global: ["damageAfter", "damageCancelled", "damageZero"], + player: "dieBegin", + }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.hasMark("taomie") && (event.name == "die" || event.taomie_player == player); + }, + content: function () { + player.removeMark("taomie", player.countMark("taomie")); + player.removeSkill("taomie2"); + }, + }, + //铁骑飞 + liyong: { + audio: "retishen", + trigger: { player: "shaMiss" }, + forced: true, + filter: function (event, player) { + return player.isPhaseUsing(); + }, + content: function () { + trigger.getParent().liyong = true; + player.addTempSkill("liyong2", "phaseUseEnd"); + }, + }, + liyong2: { + audio: "retishen", + mark: true, + intro: { + content: "铁骑!强命!加伤!然后掉血嘞…", + }, + trigger: { player: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + if (!event.card || event.card.name != "sha") return false; + var evt = event.getParent(); + if (evt.liyong) return false; + var history = player.getHistory("useCard", function (evt) { + return evt.card.name == "sha"; + }); + var evt2 = history[history.indexOf(evt) - 1]; + return evt2 && evt2.liyong; + }, + logTarget: "target", + content: function () { + var target = trigger.target; + target.addTempSkill("fengyin"); + trigger.directHit.add(target); + var id = target.playerid; + var map = trigger.customArgs; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; + map[id].extraDamage++; + trigger.getParent().liyong2 = true; + }, + group: ["liyong3", "liyong4"], + }, + liyong3: { + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.player.isIn() && event.getParent(2).liyong2 == true; + }, + content: function () { + player.loseHp(); + }, + }, + liyong4: { + trigger: { player: "useCardAfter" }, + forced: true, + silent: true, + filter: function (evt, player) { + if (!evt.card || evt.card.name != "sha") return false; + if (evt.liyong) return false; + var history = player.getHistory("useCard", function (evt) { + return evt.card.name == "sha"; + }); + var evt2 = history[history.indexOf(evt) - 1]; + return evt2 && evt2.liyong; + }, + content: function () { + player.removeSkill("liyong2"); + }, + }, + //韩遂 + xinniluan: { + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.isIn() && + event.player.getHistory("useCard", function (evt) { + if (evt.targets && evt.targets.length) { + var targets = evt.targets.slice(0); + while (targets.includes(event.player)) targets.remove(event.player); + return targets.length > 0; + } + return false; + }).length > 0 && + (_status.connectMode || player.hasSha()) + ); + }, + content: function () { + "step 0"; + player.chooseToUse({ + logSkill: "xinniluan", + preTarget: trigger.player, + prompt: "是否发动【逆乱】,对" + get.translation(trigger.player) + "使用一张【杀】?", + filterCard: function (card, player) { + return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); + }, + filterTarget: function (card, player, target) { + return target == _status.event.preTarget && lib.filter.targetEnabled.apply(this, arguments); + }, + addCount: false, + }); + "step 1"; + if ( + result.bool && + player.getHistory("sourceDamage", function (evt) { + return evt.getParent(4) == event; + }).length && + trigger.player.countDiscardableCards(player, "he") > 0 + ) + player.discardPlayerCard(trigger.player, true, "he").boolline = true; + }, + }, + xiaoxi_hansui: { + audio: 2, + enable: ["chooseToRespond", "chooseToUse"], + filterCard: function (card, player) { + return get.color(card) == "black"; + }, + position: "hse", + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + if (!player.countCards("hse", { color: "black" })) return false; + }, + prompt: "将一张黑色牌当杀使用或打出", + check: function (card) { + return 4.5 - get.value(card); + }, + ai: { + skillTagFilter: function (player) { + if (!player.countCards("hes", { color: "black" })) return false; + }, + respondSha: true, + }, + }, + //胡车儿 + daoji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + return get.type(card) != "basic"; + }) && + game.hasPlayer(function (target) { + return target != player && target.countCards("e") > 0; + }) + ); + }, + filterCard: function (card) { + return get.type(card) != "basic"; + }, + position: "he", + filterTarget: function (card, player, target) { + return target != player && target.countCards("e") > 0; + }, + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) < 0 && get.damageEffect(current, player, player) > 0 && current.getEquip(1); + }) + ) + return 8 - get.value(card); + return 5 - get.value(card); + }, + content: function () { + "step 0"; + player.gainPlayerCard(target, "e", true).set("ai", function (button) { + var card = button.link; + var player = _status.event.player; + if (get.subtype(card) == "equip1" && get.damageEffect(_status.event.target, player, player) > 0) return 6 + get.value(card); + return get.value(card); + }); + "step 1"; + if (!result || !result.bool || !result.cards || !result.cards.length) { + event.finish(); + return; + } + var card = result.cards[0]; + event.card = card; + if (player.getCards("h").includes(card) && get.type(card) == "equip") player.chooseUseTarget(card, true).nopopup = true; + "step 2"; + if (get.subtype(card, false) == "equip1") target.damage(); + }, + ai: { + order: 6, + result: { + target: function (player, current) { + if (get.damageEffect(current, player, player) > 0 && current.getEquip(1)) return -1.5; + return -1; + }, + }, + }, + }, + //司马师夫妇 + //垃圾 + baiyi: { + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + selectTarget: 2, + limited: true, + skillAnimation: false, + //animationColor:'thunder', + filter: function (event, player) { + return player.isDamaged() && game.players.length > 2; + }, + multitarget: true, + multiline: true, + changeSeat: true, + contentBefore: function () { + player.$fullscreenpop("败移", "thunder"); + }, + content: function () { + player.awakenSkill("baiyi"); + game.broadcastAll( + function (target1, target2) { + game.swapSeat(target1, target2); + }, + targets[0], + targets[1] + ); + }, + ai: { + order: function () { + return get.order({ name: "tao" }) + 1; + }, + result: { + target: function (player, target) { + if (player.hasUnknown() && target != player.next && target != player.previous) return 0; + var distance = Math.pow(get.distance(player, target, "absolute"), 2); + if (!ui.selected.targets.length) return distance; + var distance2 = Math.pow(get.distance(player, ui.selected.targets[0], "absolute"), 2); + return Math.min(0, distance - distance2); + }, + }, + }, + }, + jinglve: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.hasSkill("jinglve2")) return false; + return game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + if (!player.storage.jinglve4) player.storage.jinglve4 = []; + player.storage.jinglve4.add(target); + player.chooseButton(["选择一张牌作为「死士」", target.getCards("h")], true).set("ai", function (button) { + var target = _status.event.getParent().target; + var card = button.link; + var val = target.getUseValue(card); + if (val > 0) return val; + return get.value(card); + }); + "step 1"; + if (result.bool) { + player.storage.jinglve2 = target; + player.storage.jinglve3 = result.links[0]; + player.addSkill("jinglve2"); + } + }, + ai: { + order: 12, + result: { + target: -1, + }, + }, + }, + jinglve2: { + mark: true, + intro: { + name: "死士", + mark: function (dialog, content, player) { + dialog.addText("记录目标"); + dialog.add([content]); + if (player == game.me || player.isUnderControl()) { + dialog.addText("死士牌"); + dialog.add([player.storage.jinglve3]); + } + }, + }, + onremove: function (player) { + delete player.storage.jinglve2; + delete player.storage.jinglve3; + }, + trigger: { global: ["dieEnd", "loseEnd", "gainEnd"] }, + silent: true, + lastDo: true, + charlotte: true, + filter: function (event, player) { + if (event.name != "gain" && event.player != player.storage.jinglve2) return false; + return event.name == "die" || (event.cards.includes(player.storage.jinglve3) && (event.name == "gain" || (event.position != ui.ordering && event.position != ui.discardPile))); + }, + content: function () { + player.removeSkill("jinglve2"); + }, + group: "jinglve3", + }, + jinglve3: { + audio: "jinglve", + trigger: { + global: ["loseAfter", "useCard", "phaseAfter", "cardsDiscardAfter", "loseAsyncAfter"], + }, + filter: function (event, player) { + if (event.player && event.player != player.storage.jinglve2) return false; + var card = player.storage.jinglve3; + if (event.name == "phase") return event.player.getCards("hej").includes(card); + if (event.name == "useCard") return event.cards.includes(card); + return get.position(card, true) == "d" && event.getd().includes(card); + }, + forced: true, + charlotte: true, + logTarget: "player", + content: function () { + if (trigger.name == "useCard") { + trigger.all_excluded = true; + trigger.targets.length = 0; + } else { + if (trigger.name == "phase") { + player.gain(player.storage.jinglve3, trigger.player, "giveAuto", "bySelf"); + } else if (get.position(player.storage.jinglve3, true) == "d") player.gain(player.storage.jinglve3, "gain2"); + } + player.removeSkill("jinglve2"); + }, + }, + shanli: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.storage.baiyi && player.getStorage("jinglve4").length > 1; + }, + content: function () { + "step 0"; + player.awakenSkill("shanli"); + player.loseMaxHp(); + player.chooseTarget(true, "选择【擅立】的目标").set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target == game.me || (target.isUnderControl() && target.isOnline())) return 2 * att; + return att; + }); + "step 1"; + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + game.log(player, "拥立", target); + var list = []; + if (!_status.characterlist) { + if (_status.connectMode) var list = get.charactersOL(); + else { + var list = []; + for (var i in lib.character) { + if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue; + list.push(i); + } + } + game.countPlayer2(function (current) { + list.remove(current.name); + list.remove(current.name1); + list.remove(current.name2); + if (current.storage.rehuashen && current.storage.rehuashen.character) list.removeArray(current.storage.rehuashen.character); + }); + _status.characterlist = list; + } + _status.characterlist.randomSort(); + var chara = []; + var skills = []; + for (var i of _status.characterlist) { + if (i == "key_yuri") continue; + var character = lib.character[i]; + if (character && character[3]) { + for (var j of character[3]) { + if (skills.includes(j) || j == "yuri_wangxi" || target.hasSkill("j")) continue; + var info = get.info(j); + if (info && info.zhuSkill) { + skills.add(j); + chara.add(i); + continue; + } + } + } + if (skills.length >= 3) break; + } + if (!skills.length) { + event.finish(); + return; + } + event.chara = chara; + event.skills = skills; + player.chooseControl(skills).set("dialog", ["选择令" + get.translation(target) + "获得一个技能", [chara, "character"]]); + "step 2"; + target.addSkills(result.control); + target.setAvatarQueue(target.name1 || target.name, [event.chara[event.skills.indexOf(result.control)]]); + }, + ai: { + combo: "baiyi", + }, + }, + hongyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + //filter:function(event,player){ + // return player.countCards('he')>=Math.min(2,game.dead.length); + //}, + //selectCard:function(){ + // return Math.min(2,game.dead.length); + //}, + //filterCard:true, + filterTarget: lib.filter.notMe, + check: function (card) { + var num = Math.min(2, game.dead.length); + if (!num) return 1; + if (num == 1) return 7 - get.value(card); + return 5 - get.value(card); + }, + position: "he", + content: function () { + player.addTempSkill("hongyi2", { player: "phaseBeginStart" }); + player.storage.hongyi2.add(target); + player.markSkill("hongyi2"); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.hasJudge("lebu")) return -0.5; + return -1 - target.countCards("h"); + }, + }, + }, + }, + hongyi2: { + audio: "hongyi", + trigger: { global: "damageBegin1" }, + charlotte: true, + forced: true, + logTarget: "source", + filter: function (event, player) { + return player.storage.hongyi2.includes(event.source); + }, + content: function () { + "step 0"; + trigger.source.judge(); + "step 1"; + if (result.color == "black") trigger.num--; + else trigger.player.draw(); + }, + onremove: true, + intro: { + content: "已选中$为技能目标", + }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + }, + requanfeng: { + audio: "quanfeng", + enable: "chooseToUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return event.type == "dying" && player == event.dying; + }, + content: function () { + player.awakenSkill("requanfeng"); + player.gainMaxHp(2); + player.recover(4); + }, + ai: { + save: true, + skillTagFilter: function (player, tag, arg) { + return player == arg; + }, + order: 10, + result: { + player: 1, + }, + }, + group: "requanfeng_gain", + }, + requanfeng_gain: { + audio: "quanfeng", + trigger: { global: "die" }, + filter: function (event, player) { + return ( + player.hasSkill("hongyi") && + event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }).length > 0 + ); + }, + logTarget: "player", + skillAnimation: true, + animationColor: "thunder", + prompt2: "(限定技)失去技能【劝封】,并获得该角色武将牌上的所有技能,然后加1点体力上限并回复1点体力", + check: (event, player) => { + if ( + event.player + .getStockSkills("仲村由理", "天下第一") + .filter(skill => { + let info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }) + .some(i => { + let info = get.info(i); + if (info && info.ai) return info.ai.neg || info.ai.halfneg; + }) + ) + return false; + return true; + }, + content: function () { + player.awakenSkill("requanfeng"); + player.removeSkills("hongyi"); + var skills = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }); + if (skills.length) { + player.addSkills(skills); + game.broadcastAll(function (list) { + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.yanghuiyu = "quanfeng"; + } + }, skills); + } + player.gainMaxHp(); + player.recover(); + }, + }, + quanfeng: { + audio: 2, + trigger: { global: "die" }, + filter: function (event, player) { + return ( + event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; + }).length > 0 + ); + }, + logTarget: "player", + skillAnimation: true, + limited: true, + forced: true, + animationColor: "thunder", + content: function () { + "step 0"; + player.awakenSkill("quanfeng"); + var list = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; + }); + if (list.length == 1) event._result = { control: list[0] }; + else + player + .chooseControl(list) + .set("prompt", "选择获得" + get.translation(trigger.player) + "的一个技能") + .set("forceDie", true) + .set("ai", function () { + return list.randomGet(); + }); + "step 1"; + player.addSkills(result.control); + game.broadcastAll(function (skill) { + var list = [skill]; + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.yanghuiyu = "quanfeng"; + } + }, result.control); + player.gainMaxHp(); + player.recover(); + }, + }, + //手杀界朱然 + //设计师你改技能有瘾🐴 + mobiledanshou: { + trigger: { global: "phaseJieshuBegin" }, + audio: 2, + direct: true, + filter: function (event, player) { + if (player == event.player) return false; + var num = event.player.getHistory("useCard", function (evt) { + return evt.targets.includes(player); + }).length; + return num == 0 || (event.player.isIn() && num <= player.countCards("he")); + }, + content: function () { + "step 0"; + var num = trigger.player.getHistory("useCard", function (evt) { + return evt.targets.includes(player); + }).length; + event.num = num; + if (num == 0) { + if (player.hasSkill("mobiledanshou")) event._result = { bool: true }; + else player.chooseBool("是否发动【胆守】摸一张牌?", lib.translate.mobiledanshou_info); + } else event.goto(2); + "step 1"; + if (result.bool) { + player.logSkill("mobiledanshou"); + player.draw(); + } + event.finish(); + "step 2"; + player + .chooseToDiscard(num, get.prompt("mobiledanshou", trigger.player), "弃置" + get.translation(num) + "张牌并对其造成1点伤害", "he") + .set("ai", function (card) { + if (!_status.event.goon) return 0; + var num = _status.event.getParent().num; + if (num == 1) return 8 - get.value(card); + if (num == 2) return 6.5 - get.value(card); + return 5 - get.value(card); + }) + .set("goon", get.damageEffect(trigger.player, player, player) > 0).logSkill = ["mobiledanshou", trigger.player]; + "step 3"; + if (result.bool) { + player.addExpose(0.2); + trigger.player.damage(); + } + }, + }, + //丁原 + //程序员和设计师至少有一个脑子有坑 + beizhu: { + audio: 3, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return lib.skill.beizhu.filterTarget(null, player, target); + }); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.addTempSkill("beizhu_draw"); + player.viewHandcards(target); + "step 1"; + var cards = target.getCards("h", "sha"); + if (cards.length) { + event.cards = cards; + event.goto(5); + } else player.discardPlayerCard("he", target, "visible", true); + "step 2"; + player.chooseBool("是否令" + get.translation(target) + "获得一张【杀】?").set("choice", get.attitude(player, target) > 0); + "step 3"; + if (result.bool) { + var card = get.cardPile2(function (card) { + return card.name == "sha"; + }); + if (card) target.gain(card, "gain2"); + } else event.finish(); + "step 4"; + game.updateRoundNumber(); + event.finish(); + "step 5"; + var hs = target.getCards("h"); + cards = cards.filter(function (card) { + return ( + hs.includes(card) && + get.name(card, target) == "sha" && + target.canUse( + { + name: "sha", + isCard: true, + cards: [card], + }, + player, + false + ) + ); + }); + if (cards.length) { + var card = cards.randomRemove(1)[0]; + target.useCard(player, false, card).card.beizhu = true; + event.redo(); + } + }, + ai: { + order: 7, + threaten: 1.14 + 5.14, + result: { + player: function (player, target) { + var eff = get.effect(target, { name: "guohe_copy2" }, player, player); + var cards = target.getCards("h", { name: "sha" }); + if (!cards.length) return eff; + return eff / (cards.length + 3); + }, + }, + }, + }, + beizhu_draw: { + trigger: { player: "damageEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.card && event.card.beizhu; + }, + content: function () { + player.draw(trigger.num); + }, + }, + //新简雍 + xinqiaoshui: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) player.addTempSkill("qiaoshui3", "phaseUseEnd"); + else { + player.addTempSkill("qiaoshui2", "phaseUseEnd"); + } + }, + ai: { + order: function (item, player) { + if ( + player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) + return 10; + return 1; + }, + result: { + target: function (player, target) { + if ( + player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) { + if (player.hasSkill("qiaoshui3")) return 0; + var nd = !player.needsToDiscard(); + if ( + player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (nd && val < 0) return true; + if (val <= 5) { + return card.number >= 12; + } + if (val <= 6) { + return card.number >= 13; + } + return false; + }) + ) + return -1; + return 0; + } + return -1; + }, + }, + }, + }, + xinjyzongshi: { + audio: 2, + trigger: { + player: ["chooseToCompareAfter", "compareMultipleAfter"], + target: ["chooseToCompareAfter", "compareMultipleAfter"], + }, + filter: function (event, player) { + if (event.preserve) return false; + if (event.name == "compareMultiple") return true; + return !event.compareMultiple; + }, + frequent: true, + content: function () { + "step 0"; + var str = '
    牌堆顶'; + var cards = get.cards(); + if (trigger.name == "chooseToCompare" && trigger.compareMeanwhile) { + var result = trigger.result; + var list = [[result.num1[0], result.player]]; + list.addArray( + result.num2.map(function (card, i) { + return [card, result.targets[i]]; + }) + ); + list.sort(function (a, b) { + return a[0] - b[0]; + }); + if (list[0][0] < list[1][0] && get.position(list[0][1], true) == "o") { + str += "/拼点牌"; + cards.push(list[0][1]); + } + } else { + if (player == trigger.player) { + if (trigger.num1 > trigger.num2 && get.position(trigger.card2, true) == "o") { + str += "/拼点牌"; + cards.push(trigger.card2); + } else if (trigger.num1 < trigger.num2 && get.position(trigger.card1, true) == "o") { + str += "/拼点牌"; + cards.push(trigger.card1); + } + } else { + if (trigger.num1 < trigger.num2 && get.position(trigger.card1, true) == "o") { + str += "/拼点牌"; + cards.push(trigger.card1); + } else if (trigger.num1 > trigger.num2 && get.position(trigger.card2, true) == "o") { + str += "/拼点牌"; + cards.push(trigger.card2); + } + } + } + str += "
    "; + event.cards = cards; + player.chooseButton(["纵适:选择要获得的牌", str, cards], true).set("ai", get.buttonValue); + "step 1"; + if (result.bool) { + var draw = result.links[0] == cards[0]; + player.gain(result.links, draw ? "draw" : "gain2").log = false; + game.log(player, "获得了", draw ? "牌堆顶的一张牌" : result.links); + if (!draw) { + cards[0].fix(); + ui.cardPile.insertBefore(cards[0], ui.cardPile.firstChild); + game.updateRoundNumber(); + } + } + }, + }, + //通渠张恭 + rezhenxing: { + audio: "xinfu_zhenxing", + trigger: { + player: ["damageEnd", "phaseJieshuBegin"], + }, + frequent: true, + content: function () { + "step 0"; + event.cards = get.cards(3); + player + .chooseButton(["【镇行】:请选择要获得的牌", event.cards]) + .set("filterButton", function (button) { + var cards = _status.event.cards; + for (var i = 0; i < cards.length; i++) { + if (button.link != cards[i] && get.suit(cards[i]) == get.suit(button.link)) return false; + } + return true; + }) + .set("ai", function (button) { + return get.value(button.link); + }) + .set("cards", event.cards); + "step 1"; + for (var i = event.cards.length - 1; i >= 0; i--) { + if (result.bool && result.links.includes(event.cards[i])) { + player.gain(event.cards[i], "gain2"); + } else { + event.cards[i].fix(); + ui.cardPile.insertBefore(event.cards[i], ui.cardPile.childNodes[0]); + } + } + game.updateRoundNumber(); + }, + }, + //芙蓉,手杀界廖化,手杀界曹彰 + rejiangchi: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + direct: true, + content: function () { + "step 0"; + var list = ["弃牌", "摸牌", "取消"]; + if (!player.countCards("he")) list.remove("弃牌"); + player + .chooseControl(list, function () { + var player = _status.event.player; + if (list.includes("弃牌")) { + if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) { + return "弃牌"; + } + if (player.countCards("h", "sha") > 2) { + return "弃牌"; + } + } + if (!player.countCards("h", "sha")) { + return "摸牌"; + } + return "cancel2"; + }) + .set("prompt", get.prompt2("rejiangchi")); + "step 1"; + if (result.control == "弃牌") { + player.chooseToDiscard(true, "he"); + player.addTempSkill("jiangchi2", "phaseUseEnd"); + player.logSkill("rejiangchi"); + } else if (result.control == "摸牌") { + player.draw(); + player.addTempSkill("rejiangchi3", "phaseUseEnd"); + player.logSkill("rejiangchi"); + } + }, + }, + rejiangchi3: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + }, + refuli: { + skillAnimation: true, + animationColor: "soil", + audio: 2, + unique: true, + limited: true, + enable: "chooseToUse", + mark: true, + filter: function (event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; + return true; + }, + content: function () { + "step 0"; + player.awakenSkill("refuli"); + event.num = game.countGroup(); + if (event.num > player.hp) player.recover(event.num - player.hp); + "step 1"; + if (player.isMaxHp(true)) player.turnOver(); + }, + ai: { + save: true, + skillTagFilter: function (player, arg, target) { + return player == target; + }, + result: { + player: 10, + }, + threaten: function (player, target) { + if (!target.storage.refuli) return 0.9; + }, + }, + }, + redangxian: { + trigger: { player: "phaseBegin" }, + forced: true, + audio: "dangxian", + audioname: ["guansuo", "xin_liaohua"], + content: function () { + "step 0"; + var card = get.discardPile(function (card) { + return card.name == "sha"; + }); + if (card) player.gain(card, "gain2"); + "step 1"; + game.updateRoundNumber(); + var next = player.phaseUse(); + event.next.remove(next); + trigger.next.push(next); + }, + }, + xuewei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("xuewei"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + if (player == get.zhu(player) && player.hp <= 2) return 0; + return get.attitude(player, target) - 4; + }).animate = false; + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xuewei"); + player.addTempSkill("xuewei2", { player: "phaseBegin" }); + player.storage.xuewei2 = target; + } + }, + ai: { + threaten: 1.05, + }, + }, + xuewei2: { + audio: "xuewei", + forced: true, + onremove: true, + trigger: { global: "damageBegin4" }, + charlotte: true, + filter: function (event, player) { + return event.player == player.storage.xuewei2; + }, + logTarget: "player", + content: function () { + player.removeSkill("xuewei2"); + trigger.cancel(); + player.damage(trigger.num, trigger.source || "nosource"); + if (trigger.source && trigger.source.isIn()) trigger.source.damage(trigger.num, trigger.nature, player); + }, + }, + liechi: { + trigger: { player: "dying" }, + forced: true, + filter: function (event, player) { + return event.getParent().name == "damage" && event.source && event.source.countCards("he"); + }, + audio: 2, + content: function () { + trigger.source.chooseToDiscard("he", true); + }, + }, + rejiuchi: { + group: ["jiuchi"], + audioname: ["re_dongzhuo"], + trigger: { source: "damage" }, + forced: true, + popup: false, + locked: false, + audio: "jiuchi", + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.getParent(2).jiu == true && !player.hasSkill("rejiuchi_air"); + }, + content: function () { + player.logSkill("jiuchi"); + player.addTempSkill("rejiuchi_air"); + }, + subSkill: { + air: {}, + }, + }, + //苏飞,新贾逵 + tongqu: { + audio: 2, + trigger: { + global: ["phaseBefore", "dying", "phaseDrawBegin2"], + player: ["enterGame", "phaseZhunbeiBegin"], + }, + direct: true, + filter: function (event, player) { + if (event.name == "phaseDraw") return event.player.hasMark("tongqu"); + if (event.name == "dying") return event.player.hasMark("tongqu"); + if (event.name == "phaseZhunbei") + return game.hasPlayer(function (current) { + return !current.hasMark("tongqu"); + }); + return !player.hasMark("tongqu") && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + if (trigger.name == "phaseDraw") { + player.logSkill("tongqu", trigger.player); + trigger.player.draw("nodelay"); + trigger.player.addTempSkill("tongqu2", "phaseDrawAfter"); + event.finish(); + } else if (trigger.name == "dying") { + player.logSkill("tongqu", trigger.player); + trigger.player.removeMark("tongqu", 1); + event.finish(); + } else if (trigger.name == "phaseZhunbei") { + player + .chooseTarget(get.prompt2("tongqu"), function (card, player, target) { + return !target.hasMark("tongqu"); + }) + .set("ai", function (target) { + if (_status.event.player.hp < 3) return 0; + return get.attitude(_status.event.player, target); + }); + } else { + player.logSkill("tongqu"); + player.addMark("tongqu", 1); + event.finish(); + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.loseHp(); + player.logSkill("tongqu", target); + target.addMark("tongqu", 1); + } + }, + marktext: "渠", + intro: { content: "mark", name2: "渠" }, + }, + tongqu2: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + silent: true, + filter: function (event, player) { + var bool = game.hasPlayer(function (current) { + return current != player && current.hasMark("tongqu"); + }); + return ( + player.countCards("he", function (card) { + if (bool) return true; + return lib.filter.cardDiscardable(card, player); + }) > 0 + ); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + forced: true, + position: "he", + filterCard: true, + filterTarget: function (card, player, target) { + return player != target && target.hasMark("tongqu"); + }, + selectTarget: function () { + if (ui.selected.cards.length && !lib.filter.cardDiscardable(ui.selected.cards[0], _status.event.player)) return [1, 1]; + return [0, 1]; + }, + prompt: "弃置一张牌,或将一张牌交给一名有“渠”的其他角色", + ai1: function (card) { + var player = _status.event.player; + if (get.name(card) == "du") return 20; + if (get.position(card) == "e" && get.value(card) <= 0) return 14; + if ( + get.position(card) == "h" && + game.hasPlayer(function (current) { + return current != player && current.hasMark("tongqu") && get.attitude(player, current) > 0 && current.getUseValue(card) > player.getUseValue(card) && current.getUseValue(card) > player.getUseValue(card); + }) + ) + return 12; + if ( + game.hasPlayer(function (current) { + return current != player && current.hasMark("tongqu") && get.attitude(player, current) > 0; + }) + ) { + if (card.name == "wuxie") return 11; + if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; + } + return 6 / Math.max(1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player; + var card = ui.selected.cards[0]; + var att = get.attitude(player, target); + if (card.name == "du") return -6 * att; + if (att > 0) { + if (get.position(card) == "h" && target.getUseValue(card) > player.getUseValue(card)) return 4 * att; + if (target.hasUseTarget(card)) return 2 * att; + return 1.2 * att; + } + return 0; + }, + }); + "step 1"; + if (result.bool) { + if (result.targets.length) { + event.target = result.targets[0]; + player.give(result.cards, event.target); + event.card = result.cards[0]; + } else { + player.discard(result.cards); + event.finish(); + } + } + "step 2"; + if (target.getCards("h").includes(card) && get.type(card) == "equip") { + target.chooseUseTarget(card, true); + } + }, + }, + xinwanlan: { + audio: "wanlan", + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + return event.player.hp <= event.num && player.countCards("e") >= 1; + }, + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) < 4) return false; + if (player.countCards("hs", card => player.canSaveCard(card, event.player)) >= 1 + event.num - event.player.hp) return false; + if (event.player == player || event.player == get.zhu(player)) return true; + return !player.hasUnknown(); + }, + content: function () { + player.discard(player.getCards("e")); + trigger.cancel(); + }, + }, + zhengjian: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + locked: true, + direct: true, + content: function () { + "step 0"; + player.chooseTarget("请选择【诤荐】的目标", lib.translate.zhengjian_info).set("ai", function (target) { + if (target.hasSkill("zhengjian_mark")) return 0; + if (player == target) return 0.5; + return get.attitude(_status.event.player, target) * (1 + target.countCards("h")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhengjian", target); + target.addSkill("zhengjian_mark"); + } + }, + group: "zhengjian_draw", + ai: { + notemp: true, + }, + }, + zhengjian_draw: { + audio: "zhengjian", + trigger: { player: "phaseBegin" }, + forced: true, + filter: function (event) { + return game.hasPlayer(function (current) { + return current.hasSkill("zhengjian_mark"); + }); + }, + logTarget: function (event) { + return game.filterPlayer(function (current) { + return current.hasSkill("zhengjian_mark"); + }); + }, + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current.countMark("zhengjian_mark") > 0; + }); + if (list.length > 1) { + event.delay = true; + game.asyncDraw(list, function (target) { + return Math.min(5, target.maxHp, target.countMark("zhengjian_mark")); + }); + } else if (list.length == 1) list[0].draw(Math.min(5, list[0].maxHp, list[0].countMark("zhengjian_mark"))); + "step 1"; + game.countPlayer(function (current) { + current.removeSkill("zhengjian_mark"); + }); + if (event.delay) game.delayx(); + }, + }, + zhengjian_mark: { + trigger: { player: ["useCard1", "respond"] }, + silent: true, + firstDo: true, + onremove: true, + charlotte: true, + content: function () { + player.addMark("zhengjian_mark", 1, false); + }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = 0; + }, + mark: true, + intro: { + content: "已使用/打出过#张牌", + }, + }, + gaoyuan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + direct: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (player.countCards("he") == 0) return false; + return game.hasPlayer(function (current) { + return current != event.player && current != player && current.hasSkill("zhengjian_mark") && lib.filter.targetEnabled(event.card, event.player, current); + }); + }, + content: function () { + "step 0"; + var next = player.chooseCardTarget({ + position: "he", + filterCard: lib.filter.cardDiscardable, + filterTarget: function (card, player, target) { + var trigger = _status.event; + if (target != player && target != trigger.source) { + if (target.hasSkill("zhengjian_mark") && lib.filter.targetEnabled(trigger.card, trigger.source, target)) return true; + } + return false; + }, + ai1: function (card) { + return get.unuseful(card) + 9; + }, + ai2: function (target) { + if (_status.event.player.countCards("h", "shan")) { + return -get.attitude(_status.event.player, target); + } + if (get.attitude(_status.event.player, target) < 5) { + return 6 - get.attitude(_status.event.player, target); + } + if (_status.event.player.hp == 1 && player.countCards("h", "shan") == 0) { + return 10 - get.attitude(_status.event.player, target); + } + if (_status.event.player.hp == 2 && player.countCards("h", "shan") == 0) { + return 8 - get.attitude(_status.event.player, target); + } + return -1; + }, + prompt: get.prompt("gaoyuan"), + prompt2: "弃置一张牌,将此【杀】转移给一名有“诤”的角色", + source: trigger.player, + card: trigger.card, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill(event.name, target); + player.discard(result.cards); + var evt = trigger.getParent(); + evt.triggeredTargets2.remove(player); + evt.targets.remove(player); + evt.targets.push(target); + } + }, + ai: { + combo: "zhengjian", + }, + }, + //一 将 成 名 + zhilve: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + "step 0"; + if (!player.canMoveCard()) event._result = { index: 1 }; + else + player + .chooseControl() + .set("choiceList", ["移动场上的一张牌", "本回合的摸牌阶段多摸一张牌且第一张杀无距离次数限制"]) + .set("ai", function () { + return 1; + }); + "step 1"; + if (result.index == 1) { + player.addTempSkill("zhilve_yingzi"); + if ( + !player.getHistory("useCard", function (card) { + return card.card.name == "sha"; + }).length + ) + player.addTempSkill("zhilve_xiandeng"); + event.finish(); + } else player.moveCard(true); + "step 2"; + if (result.position == "e") player.loseHp(); + else player.addTempSkill("zhilve_dis"); + }, + subSkill: { + dis: { + mod: { + maxHandcard: function (player, num) { + return num - 1; + }, + }, + }, + yingzi: { + trigger: { player: "phaseDrawBegin2" }, + popup: false, + forced: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num++; + }, + }, + xiandeng: { + mod: { + targetInRange: function (card, player) { + if (card.name == "sha") return true; + }, + }, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + player.removeSkill(event.name); + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat("card"); + if (stat && stat.sha) stat.sha--; + } + }, + }, + }, + }, + xhzhiyan: { + enable: "phaseUse", + audio: 2, + filter: function (event, player) { + return player.countCards("h") != player.maxHp; + }, + filterCard: true, + selectCard: function () { + var player = _status.event.player; + var num = Math.max(0, player.countCards("h") - player.maxHp); + return [num, num]; + }, + check: function (card) { + var player = _status.event.player; + if ( + player.getUseValue(card) <= 0 && + game.hasPlayer(function (current) { + return current != player && get.value(card, current) * get.attitude(player, current) > 0; + }) + ) + return 1; + return 0; + }, + content: function () { + "step 0"; + if (!cards.length) { + player.draw(player.maxHp - player.countCards("h")); + player.addTempSkill("zishou2"); + event.finish(); + } else { + cards = cards.filterInD("d"); + if (cards.length) + player.chooseButton(["是否将其中的一张牌交给一名其他角色?", cards]).set("", function (button) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current != player && get.value(button.link, current) * get.attitude(player, current) > 0; + }) + ) + return Math.abs(get.value(button.link)); + return 0; + }); + else event.finish(); + } + "step 1"; + if (result.bool && game.hasPlayer(current => current != player)) { + event.card = result.links[0]; + player.chooseTarget(true, lib.filter.notMe, "选择一名其他角色获得" + get.translation(event.card)).set("ai", function (target) { + return get.value(_status.event.getParent().card, target) * get.attitude(_status.event.player, target); + }); + } else event.finish(); + "step 2"; + var target = result.targets[0]; + player.line(target, "green"); + target.gain(card, "gain2", "log"); + }, + ai: { + order: function (obj, player) { + if (player.countCards("h") > player.maxHp) return 10; + return 0.5; + }, + result: { + player: 1, + }, + }, + }, + //水 果 忍 者 + zhengjing_guanju: { audio: true }, + zhengjing: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.hasSkill("zhengjing3"); + }, + content: function () { + "step 0"; + //game.trySkillAudio('zhengjing_guanju',player); + if (_status.connectMode) event.time = lib.configOL.choose_timeout; + var cards = []; + var names = []; + while (true) { + var card = get.cardPile(function (carde) { + return carde.name != "du" && !names.includes(carde.name); + }); + if (card) { + cards.push(card); + names.push(card.name); + if (get.mode() == "doudizhu") { + if (cards.length == 1 && !get.isLuckyStar(player) && Math.random() < 0.33) break; + if (cards.length == 2 && !get.isLuckyStar(player) && Math.random() < 0.5) break; + if (cards.length >= 3) break; + } else { + if (cards.length == 3 && !get.isLuckyStar(player) && Math.random() < 0.33) break; + if (cards.length == 4 && !get.isLuckyStar(player) && Math.random() < 0.5) break; + if (cards.length >= 5) break; + } + } else break; + } + event.cards = cards; + if (!cards.length) { + event.finish(); + return; + } + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + names.remove("du"); + game.pause(); + game.countChoose(); + setTimeout(function () { + _status.imchoosing = false; + event._result = { + bool: true, + links: names.slice(0), + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + game.resume(); + }, 5000); + }; + var createDialog = function (player, id) { + if (_status.connectMode) lib.configOL.choose_timeout = "30"; + if (player == game.me) return; + var str = get.translation(player) + "正在整理经书...
    "; + ui.create.dialog(str).videoId = id; + }; + var chooseButton = function (list) { + var roundmenu = false; + if (ui.roundmenu && ui.roundmenu.display != "none") { + roundmenu = true; + ui.roundmenu.style.display = "none"; + } + var event = _status.event; + event.settleed = false; + event.finishedx = []; + event.map = {}; + var names = list.slice(0); + event.zhengjing_nodes = []; + names.push("du"); + names.randomSort(); + var names2 = names.slice(0); + for (var i = 0; i < 2; i++) { + names2.randomSort(); + names = names.concat(names2); + } + + event.zhengjing = names; + for (var i of list) { + event.map[i] = 0; + } + event.dialog = ui.create.dialog("forcebutton", "hidden"); + event.dialog.textPrompt = event.dialog.add('
    及时点击卡牌,但不要点到毒了!
    '); + var str = '
    '; + for (var i of list) { + str += get.translation(i) + ":" + Math.min(2, event.map[i]) + "/2 "; + } + str += "
    "; + event.dialog.textPrompt2 = event.dialog.add(str); + event.switchToAuto = function () { + event._result = { + bool: true, + links: event.finishedx.slice(0), + }; + event.dialog.close(); + game.resume(); + _status.imchoosing = false; + if (roundmenu) ui.roundmenu.style.display = ""; + }; + event.dialog.classList.add("fixed"); + event.dialog.classList.add("scroll1"); + event.dialog.classList.add("scroll2"); + event.dialog.classList.add("fullwidth"); + event.dialog.classList.add("fullheight"); + event.dialog.classList.add("noupdate"); + event.dialog.open(); + event.settle = function (du) { + if (event.settleed) return; + event.settleed = true; + event.dialog.textPrompt2.innerHTML = ""; + if (du) { + if (lib.config.background_speak) game.playAudio("skill", "zhengjing_boom"); + event.dialog.textPrompt.innerHTML = '
    叫你别点毒你非得点 这下翻车了吧
    '; + } else { + if (lib.config.background_speak) game.playAudio("skill", "zhengjing_finish"); + event.dialog.textPrompt.innerHTML = '
    整理经典结束!共整理出' + get.cnNumber(event.finishedx.length) + "份经典
    "; + } + while (event.zhengjing_nodes.length) { + event.zhengjing_nodes.shift().delete(); + } + setTimeout(function () { + event.switchToAuto(); + }, 1000); + }; + + var click = function () { + var name = this.name; + if (name == "du") { + event.zhengjing.length = 0; + event.settle(true); + } else { + if (lib.config.background_speak) game.playAudio("skill", "zhengjing_click"); + event.map[name]++; + if (event.map[name] > 1) event.finishedx.add(name); + if (event.finishedx.length < list.length) { + var str = '
    '; + for (var i of list) { + str += get.translation(i) + ":" + Math.min(2, event.map[i]) + "/2 "; + } + str += "
    "; + event.dialog.textPrompt2.innerHTML = str; + } else { + event.zhengjing.length = 0; + event.settle(); + } + } + event.zhengjing_nodes.remove(this); + this.style.transition = "all 0.5s"; + this.style.transform = "scale(1.2)"; + this.delete(); + }; + var addNode = function () { + if (event.zhengjing.length) { + var card = ui.create.card(ui.special, "noclick", true); + card.init(["", "", event.zhengjing.shift()]); + card.addEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", click); + event.zhengjing_nodes.push(card); + card.style.position = "absolute"; + var rand1 = Math.round(Math.random() * 100); + var rand2 = Math.round(Math.random() * 100); + var rand3 = Math.round(Math.random() * 40) - 20; + card.style.left = "calc(" + rand1 + "% - " + rand1 + "px)"; + card.style.top = "calc(" + rand2 + "% - " + rand2 + "px)"; + card.style.transform = "scale(0.8) rotate(" + rand3 + "deg)"; + card.style.opacity = 0; + event.dialog.appendChild(card); + ui.refresh(card); + card.style.opacity = 1; + card.style.transform = "scale(1) rotate(" + rand3 + "deg)"; + } + if (event.zhengjing_nodes.length > (event.zhengjing.length > 0 ? 2 : 0)) event.zhengjing_nodes.shift().delete(); + if (event.zhengjing.length || event.zhengjing_nodes.length) + setTimeout(function () { + addNode(); + }, 800); + else event.settle(); + }; + + game.pause(); + game.countChoose(); + addNode(); + }; + //event.switchToAuto=switchToAuto; + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { + chooseButton(names); + } else if (event.isOnline()) { + event.player.send(chooseButton, names); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 1"; + game.broadcastAll( + function (id, time) { + if (_status.connectMode) lib.configOL.choose_timeout = time; + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + }, + event.videoId, + event.time + ); + var result = event.result || result; + for (var i = 0; i < cards.length; i++) { + //if(cards.length==1) break; + if (!result.links.includes(cards[i].name)) cards.splice(i--, 1); + } + if (cards.length) { + player.showCards(cards, get.translation(player) + "整理出了以下经典"); + game.cardsGotoOrdering(cards); + } else { + game.log(player, "并没有整理出经典"); + player.popup("杯具"); + event.finish(); + } + "step 2"; + game.updateRoundNumber(); + player.chooseTarget(true, "将整理出的经典置于一名角色的武将牌上").set("ai", function (target) { + if (target.hasSkill("xinfu_pdgyingshi")) return 0; + var player = _status.event.player; + var cards = _status.event.getParent().cards; + var att = get.attitude(player, target); + return -att; + //if(cards.length==1) return -att; + // if(player==target) att/=2; + // if(target.hasSkill('pingkou')) att*=1.4; + // att*=(1+target.countCards('j')/2); + // return att; + }); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "thunder"); + } + "step 4"; + if (cards.length == 1) { + event._result = { bool: true, moved: [cards, []] }; + return; + } + var next = player.chooseToMove("整经:请分配整理出的经典", true); + next.set("list", [["置于" + get.translation(target) + "的武将牌上", cards], ["自己获得"]]); + next.set("filterMove", function (from, to, moved) { + if (moved[0].length == 1 && to == 1 && from.link == moved[0][0]) return false; + return true; + }); + next.set("filterOk", function (moved) { + return moved[0].length > 0; + }); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(a) - get.value(b); + }); + return [cards.splice(0, 1), cards]; + }); + "step 5"; + if (result.bool) { + var cards = result.moved[0], + gains = result.moved[1]; + target.addSkill("zhengjing2"); + target.addToExpansion(cards, "gain2").gaintag.add("zhengjing2"); + if (gains.length) player.gain(gains, "gain2"); + } + }, + ai: { + order: 10, + result: { player: 1 }, + threaten: 3.2, + }, + }, + //恁就是仲村由理? + zhengjing2: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + charlotte: true, + intro: { content: "expansion", markcount: "expansion" }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + content: function () { + "step 0"; + player.gain(player.getExpansions("zhengjing2"), "gain2"); + player.skip("phaseJudge"); + player.skip("phaseDraw"); + "step 1"; + player.removeSkill("zhengjing2"); + }, + }, + zhengjing3: {}, + //邓芝 + jimeng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countGainableCards(player, "he") > 0; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("jimeng"), function (card, player, target) { + return target != player && target.countGainableCards(player, "he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (player.hp > 1 && get.attitude(player, target) < 2) return 0; + return get.effect(target, { name: "shunshou" }, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jimeng", target); + player.gainPlayerCard(target, "he", true); + } else event.finish(); + "step 2"; + var hs = player.getCards("he"); + if (player.hp > 0 && hs.length) { + if (hs.length <= player.hp) event._result = { bool: true, cards: hs }; + else player.chooseCard(player.hp, true, "交给" + get.translation(target) + get.cnNumber(player.hp) + "张牌", "he", true); + } else event.finish(); + "step 3"; + player.give(result.cards, target); + }, + }, + shuaiyan: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + filter: function (event, player) { + return player.countCards("h") > 1; + }, + check: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he") && lib.skill.shuaiyan.check2(current, player); + }); + }, + check2: function (target, player) { + if (get.itemtype(player) != "player") player = _status.event.player; + return -get.attitude(player, target) / target.countCards("he"); + }, + content: function () { + "step 0"; + player.showHandcards(get.translation(player) + "发动了【率言】"); + "step 1"; + var filter = function (card, player, target) { + return player != target && target.countCards("he") > 0; + }; + if ( + game.hasPlayer(function (current) { + return filter("我约等于白板", player, current); + }) + ) { + player.chooseTarget(true, filter, "选择一名其他角色,令其交给你一张牌").set("ai", lib.skill.shuaiyan.check2); + } else event.finish(); + "step 2"; + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + "step 3"; + target.give(result.cards, player); + }, + }, + relihuo: { + audio: 2, + group: ["relihuo_baigei", "relihuo_damage"], + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; + }, + check: function (event, player) { + return false; + }, + content: function () { + game.setNature(trigger.card, "fire"); + trigger.relihuo = true; + }, + }, + relihuo_damage: { + trigger: { source: "damageBegin1" }, + forced: true, + audio: "relihuo", + filter: function (event, player) { + return event.getParent(2).relihuo == true && event.player.isLinked(); + }, + content: function () { + trigger.num++; + }, + }, + relihuo_baigei: { + trigger: { player: "useCardAfter" }, + forced: true, + audio: "relihuo", + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + var num = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.card == event.card) num += evt.num; + }); + return num > 1; + }, + content: function () { + var num = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.card == trigger.card) num += evt.num; + }); + player.loseHp(Math.floor(num / 2)); + }, + }, + gongsun: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 1; + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt2("gongsun"), + selectCard: 2, + filterCard: lib.filter.cardDiscardable, + filterTarget: lib.filter.notMe, + position: "he", + ai1: function (card) { + var friend = 0, + enemy = 0, + player = _status.event.player; + var num = game.countPlayer(function (target) { + var att = get.attitude(player, target); + if (att < 0) enemy++; + if (target != player && att > 0) friend++; + return true; + }); + if (num > friend + enemy + 2) return 0; + if (friend < enemy) return 0; + if (card.name == "sha") return 10 - enemy; + return 10 - enemy - get.value(card); + }, + ai2: function (target) { + return -get.attitude(_status.event.player, target) * (1 + target.countCards("h")); + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("gongsun", target); + player.discard(result.cards); + player.addTempSkill("gongsun_shadow", { player: ["phaseBegin", "die"] }); + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if (get.type(name) == "trick") list.push(["锦囊", "", name]); + else if (get.type(name) == "basic") list.push(["基本", "", name]); + } + player.chooseButton(["请选择一个牌名", [list, "vcard"], true]).set("ai", function (button) { + return button.link[2] == "sha" ? 1 : 0; + }); + } else event.finish(); + "step 2"; + player.storage.gongsun_shadow.push([target, result.links[0][2]]); + player.popup(result.links[0][2], "soil"); + game.log(player, "选择了", "" + get.translation(result.links[0][2])); + player.markSkill("gongsun_shadow"); + }, + }, + gongsun_shadow: { + global: "gongsun_shadow2", + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + marktext: "损", + onremove: true, + intro: { + content: function (shadow) { + var str = ""; + for (var i = 0; i < shadow.length; i++) { + if (i > 0) str += "
    "; + str += get.translation(shadow[i][0]); + str += ":"; + str += get.translation(shadow[i][1]); + } + return str; + }, + }, + mod: { + cardEnabled: function (card, player) { + var list = player.storage.gongsun_shadow; + for (var i = 0; i < list.length; i++) { + if (list[i][1] == card.name) return false; + } + }, + cardRespondable: function (card, player) { + var list = player.storage.gongsun_shadow; + for (var i = 0; i < list.length; i++) { + if (list[i][1] == card.name) return false; + } + }, + cardSavable: function (card, player) { + var list = player.storage.gongsun_shadow; + for (var i = 0; i < list.length; i++) { + if (list[i][1] == card.name) return false; + } + }, + cardDiscardable: function (card, player) { + var list = player.storage.gongsun_shadow; + for (var i = 0; i < list.length; i++) { + if (list[i][1] == card.name) return false; + } + }, + }, + }, + gongsun_shadow2: { + mod: { + cardEnabled: function (card, player) { + if ( + game.hasPlayer(function (current) { + var list = current.storage.gongsun_shadow; + if (!list) return false; + for (var i = 0; i < list.length; i++) { + if (list[i][0] == player && list[i][1] == card.name) return true; + } + return false; + }) + ) + return false; + }, + cardSavable: function (card, player) { + if ( + game.hasPlayer(function (current) { + var list = current.storage.gongsun_shadow; + if (!list) return false; + for (var i = 0; i < list.length; i++) { + if (list[i][0] == player && list[i][1] == card.name) return true; + } + return false; + }) + ) + return false; + }, + cardRespondable: function (card, player) { + if ( + game.hasPlayer(function (current) { + var list = current.storage.gongsun_shadow; + if (!list) return false; + for (var i = 0; i < list.length; i++) { + if (list[i][0] == player && list[i][1] == card.name) return true; + } + return false; + }) + ) + return false; + }, + cardDiscardable: function (card, player) { + if ( + game.hasPlayer(function (current) { + var list = current.storage.gongsun_shadow; + if (!list) return false; + for (var i = 0; i < list.length; i++) { + if (list[i][0] == player && list[i][1] == card.name) return true; + } + return false; + }) + ) + return false; + }, + }, + }, + duoduan: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countCards("he") > 0 && !player.hasSkill("duoduan_im"); + }, + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt2("duoduan"), lib.filter.cardRecastable) + .set("ai", function (card) { + if (_status.event.goon) return 8 - get.value(card); + return 0; + }) + .set( + "goon", + (function () { + if (get.attitude(trigger.player, player) > 0) return true; + if (!trigger.player.countCards("he")) return true; + if (!player.hasShan()) return true; + return event.getRand() < 0.5; + })() + ); + "step 1"; + if (result.bool) { + player.addTempSkill("duoduan_im"); + player.logSkill("duoduan", trigger.player); + player.recast(result.cards); + } else event.finish(); + "step 2"; + var sha = get.translation(trigger.card); + if ( + !trigger.player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, trigger.player, "duoduan"); + }) + ) + event.finish(); + else + player + .chooseControl() + .set("choiceList", ["令其摸两张牌,然后令" + sha + "对你无效", "令其弃置一张牌,然后你不可响应" + sha]) + .set("prompt", "度断:令" + get.translation(trigger.player) + "执行一项") + .set("ai", function () { + var player = _status.event.player; + var source = _status.event.getTrigger().player; + if (get.attitude(player, source) > 0) return 0; + if (!player.hasShan() && player.hp >= 2) return 1; + return 0; + }); + "step 3"; + if (result.index == 0) event.goto(5); + else trigger.player.chooseToDiscard("弃置一张牌令" + get.translation(player) + "不能闪避此【杀】", "he", true); + "step 4"; + if (result.bool) { + trigger.directHit.add(player); + } + event.finish(); + "step 5"; + trigger.player.draw(2); + trigger.excluded.add(player); + }, + }, + duoduan_im: { + //'im' refers to 'Iwasawa Masami' in 'Angel Beats!' + //Although she disappeared in the Episode 3 of the anime, but her route in the game is really worth to play. + }, + chengzhao: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + var num = 0; + player.getHistory("gain", function (evt) { + num += evt.cards.length; + }); + if (num < 2) return false; + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return player != current && player.canCompare(current); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("chengzhao"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) / target.countCards("h"); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("chengzhao", target); + player.chooseToCompare(target); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = { name: "sha", isCard: true }; + if (player.canUse(card, target, false)) player.useCard(card, target, false).card.chengzhao = true; + } + }, + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.card || arg.card.chengzhao != true) return false; + }, + }, + }, + rezhengrong: { + trigger: { player: "useCardAfter" }, + direct: true, + audio: "drlt_zhenrong", + filter: function (event, player) { + if (!event.targets) return false; + if (!event.isPhaseUsing(player)) return false; + var bool = false; + for (var i = 0; i < event.targets.length; i++) { + if (event.targets[i] != player) { + bool = true; + break; + } + } + if (!bool) return false; + return ( + player + .getAllHistory("useCard", function (evt) { + if (!evt.isPhaseUsing(player)) return false; + for (var i = 0; i < evt.targets.length; i++) { + if (evt.targets[i] != player) return true; + } + return false; + }) + .indexOf(event) % + 2 == + 1 + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("rezhengrong"), "将一名其他角色的随机一张牌置于你的武将牌上,成为「荣」", function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("ai", function (target) { + return (1 - get.attitude(_status.event.player, target)) / target.countCards("he"); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = result.targets[0]; + player.logSkill("rezhengrong", target); + var card = target.getCards("he").randomGet(); + player.addToExpansion(card, target, "give").gaintag.add("rezhengrong"); + } + }, + marktext: "荣", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + }, + rehongju: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: "drlt_hongju", + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + derivation: "reqingce", + filter: function (event, player) { + return player.getExpansions("rezhengrong").length >= 3 && game.dead.length > 0; + }, + content: function () { + "step 0"; + player.awakenSkill("rehongju"); + player.draw(player.getExpansions("rezhengrong").length); + "step 1"; + if (player.countCards("h") == 0) event.goto(3); + else { + var dialog = ["请选择要交换的手牌和「荣」,或点「取消」", '
    「征荣」牌
    ', player.getExpansions("rezhengrong"), '
    手牌区
    ', player.getCards("h")]; + var next = player.chooseButton(dialog); + next.set("filterButton", function (button) { + var ss = _status.event.player.getExpansions("rezhengrong"); + var hs = _status.event.player.getCards("h"); + var sn = 0; + var hn = 0; + var ub = ui.selected.buttons; + for (var i = 0; i < ub.length; i++) { + if (ss.includes(ub[i].link)) sn++; + else hn++; + } + return !((sn >= hs.length && ss.includes(button.link)) || (hn >= ss.length && hs.includes(button.link))); + }); + next.set("selectButton", function () { + if (ui.selected.buttons.length == 0) return 2; + var ss = _status.event.player.getExpansions("rezhengrong"); + var hs = _status.event.player.getCards("h"); + var sn = 0; + var hn = 0; + var ub = ui.selected.buttons; + for (var i = 0; i < ub.length; i++) { + if (ss.includes(ub[i].link)) sn++; + else hn++; + } + if (sn != hn) return 2 * Math.max(sn, hn); + else { + if (sn == ss.length || hn == hs.length || sn == hs.length || hn == ss.length) return ub.length; + return [ub.length, ub.length + 1]; + } + }); + next.set("ai", function () { + return -1; + }); + } + "step 2"; + if (result.bool) { + var gains = []; + var pushs = []; + var expansions = player.getExpansions("rezhengrong"); + for (var i = 0; i < result.links.length; i++) { + var card = result.links[i]; + if (expansions.includes(card)) gains.push(card); + else pushs.push(card); + } + player.addToExpansion(pushs, player, "give").gaintag.add("rezhengrong"); + player.gain(gains, "gain2"); + } + "step 3"; + player.addSkills("reqingce"); + player.loseMaxHp(); + }, + ai: { + combo: "rezhengrong", + }, + }, + reqingce: { + enable: "phaseUse", + audio: "drlt_qingce", + filter: function (event, player) { + return player.getExpansions("rezhengrong").length > 0; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("请选择要移去的「荣」", player.getExpansions("rezhengrong"), "hidden"); + }, + backup: function (links, player) { + return { + card: links[0], + filterCard: function () { + return false; + }, + selectCard: -1, + filterTarget: function (card, player, target) { + return target.countDiscardableCards(player, "ej") > 0; + }, + delay: false, + audio: "drlt_qingce", + content: lib.skill.reqingce.contentx, + ai: { + result: { + target: function (player, target) { + var att = get.attitude(player, target); + if ( + att > 0 && + (target.countCards("j") > 0 || + target.countCards("e", function (card) { + return get.value(card, target) < 0; + })) + ) + return 2; + if (att < 0 && target.countCards("e") > 0 && !target.hasSkillTag("noe")) return -1; + return 0; + }, + }, + }, + }; + }, + prompt: function (links, player) { + return "弃置一名角色装备区或判定区内的一张牌"; + }, + }, + contentx: function () { + "step 0"; + var card = lib.skill.reqingce_backup.card; + player.loseToDiscardpile(card); + "step 1"; + if (target.countDiscardableCards(player, "ej") > 0) { + player.discardPlayerCard("ej", true, target); + } + }, + ai: { + combo: "rezhengrong", + order: 8, + result: { + player: function (player) { + if ( + game.hasPlayer(function (current) { + var att = get.attitude(player, current); + if ((att > 0 && current.countCards("j") > 0) || (att < 0 && current.countCards("e") > 0)) return true; + return false; + }) + ) + return 1; + return 0; + }, + }, + }, + }, + fengji: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return typeof player.storage.fengji == "number" && player.countCards("h") >= player.storage.fengji; + }, + content: function () { + player.draw(2); + player.addTempSkill("fengji3"); + }, + group: "fengji2", + intro: { + content: "上回合结束时的手牌数:#", + }, + }, + fengji2: { + trigger: { player: "phaseEnd" }, + silent: true, + content: function () { + player.storage.fengji = player.countCards("h"); + if (player.hasSkill("fengji")) player.markSkill("fengji"); + }, + }, + fengji3: { + mod: { + maxHandcardBase: function (player, num) { + return player.maxHp; + }, + }, + }, + zhouxuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + check: function (card) { + return 6 - get.value(card); + }, + content: function () { + "step 0"; + player.addSkill("zhouxuan2"); + target.addTempSkill("zhouxuan_ai", { player: "phaseUseAfter" }); + player.storage.zhouxuan2 = {}; + player.storage.zhouxuan2.player = target; + var list = []; + var basic = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + var type = get.type(name, "trick"); + if (type == "basic") { + list.push(name); + basic.push(name); + } else list.add(type); + } + event.basic = basic; + player + .chooseControl(list) + .set("prompt", "请选择一种基本牌的名称或非基本牌的类别") + .set("ai", function () { + var player = _status.event.player; + var target = player.storage.zhouxuan2.player; + var cards = target.getCards("h", function (card) { + return target.hasUseTarget(card); + }); + var map = {}; + for (var i = 0; i < cards.length; i++) { + var type = get.type(cards[i], "trick"); + map[type == "basic" ? get.name(cards[i]) : type] = true; + } + if (map.equip) return "equip"; + if (map.trick) return "trick"; + if (map.sha) return "sha"; + if (map.tao) return "tao"; + return 0; + }); + "step 1"; + player.storage.zhouxuan2.card = result.control; + if (event.basic.includes(result.control)) player.storage.zhouxuan2.isbasic = true; + player.markSkill("zhouxuan2"); + }, + ai: { + order: 1, + result: { + player: function (player, target) { + if (get.attitude(player, target) > 0) + return ( + Math.max(1, target.hp) * + target.countCards("h", function (card) { + return target.getUseValue(card) > 0; + }) + ); + return 0; + }, + }, + }, + }, + zhouxuan_ai: { + mod: { + aiOrder: function (player, card, num) { + if ( + game.hasPlayer(function (current) { + return current.storage.zhouxuan2 && current.storage.zhouxuan2.player == player && get.attitude(player, current) > 0 && (current.storage.zhouxuan2.isbasic ? card.name : get.type(card, "trick")) == current.storage.zhouxuan2.card; + }) + ) + return num + 10; + }, + }, + }, + zhouxuan2: { + intro: { + mark: function (player, storage) { + return get.translation(storage.player) + "使用或打出下一张牌时,若此牌为" + get.translation(storage.card) + (storage.isbasic ? "" : "牌") + ",你观看牌堆顶的三张牌并分配给任意角色"; + }, + }, + audio: "zhouxuan", + forced: true, + charlotte: true, + trigger: { global: ["useCard", "respond"] }, + filter: function (event, player) { + if (event.zhouxuanable) return true; + if (player.storage.zhouxuan2) { + var map = player.storage.zhouxuan2; + if (map.player != event.player) return false; + delete player.storage.zhouxuan2; + player.unmarkSkill("zhouxuan2"); + if (map.card != (map.isbasic ? event.card.name : get.type(event.card, "trick"))) return false; + event.zhouxuanable = true; + return true; + } + return false; + }, + logTarget: "player", + content: function () { + "step 0"; + event.cards = game.cardsGotoOrdering(get.cards(3)).cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + "step 1"; + if (event.cards.length > 1) { + player.chooseCardButton("周旋:请选择要分配的牌", true, event.cards, [1, event.cards.length]).set("ai", function (button) { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + } else if (event.cards.length == 1) { + event._result = { links: event.cards.slice(0), bool: true }; + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + event.cards.removeArray(result.links); + event.togive = result.links.slice(0); + player + .chooseTarget("选择一名角色获得" + get.translation(result.links), true) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + } + "step 3"; + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; + map[id].addArray(event.togive); + } + if (cards.length > 0) event.goto(1); + "step 4"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + list.push([source, event.given_map[i]]); + } + game.loseAsync({ + gain_list: list, + giver: player, + animate: "draw", + }).setContent("gaincardMultiple"); + }, + }, + reshanxi: { + audio: "shanxi", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.hp > 0 && + player.countCards("h", function (card) { + if (_status.connectMode) return true; + return get.color(card) == "red" && get.type(card) == "basic"; + }) > 0 + ); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: function (card) { + return get.color(card) == "red" && get.type(card) == "basic" && lib.filter.cardDiscardable.apply(this, arguments); + }, + filterTarget: function (card, player, target) { + return player != target && target.countCards("he") > 0; + }, + prompt: get.prompt("reshanxi"), + prompt2: "弃置一张红色基本牌并选择一名其他角色,将其的至多X张牌置于其武将牌上直到回合结束。(X为你的体力值)", + ai1: function () { + return -1; + }, + }); + "step 1"; + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("reshanxi", event.target); + player.discard(result.cards); + } else event.finish(); + "step 2"; + var max = Math.min(player.hp, target.countCards("he")); + if (max > 0 && target.isIn()) { + player + .choosePlayerCard("he", target, true, [1, max]) + .set("forceAuto", true) + .set("prompt", "将" + get.translation(target) + "的至多" + get.cnNumber(max) + "张牌置于其武将牌上"); + } else event.finish(); + "step 3"; + target.addSkill("reshanxi2"); + target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("reshanxi2"); + }, + }, + reshanxi2: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + content: function () { + "step 0"; + var cards = player.getExpansions("reshanxi2"); + if (cards.length) player.gain(cards, "draw"); + "step 1"; + player.removeSkill("reshanxi2"); + }, + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("reshanxi2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + }, + }, + reqizhou: { + trigger: { player: ["equipEnd", "loseEnd"] }, + forced: true, + popup: false, + derivation: ["reyingzi", "qixi", "rexuanfeng"], + filter: function (event, player) { + if (player.equiping) return false; + var suits = []; + var es = player.getCards("e"); + for (var i = 0; i < es.length; i++) { + suits.add(get.suit(es[i])); + } + if (suits.length > 3) suits.length = 3; + if (player.additionalSkills.reqizhou) { + return player.additionalSkills.reqizhou.length != suits.length; + } else { + return suits.length > 0; + } + }, + content: function () { + lib.skill.reqizhou.init(player, "reqizhou"); + }, + init: function (player, skill) { + var suits = []; + var es = player.getCards("e"); + for (var i = 0; i < es.length; i++) { + suits.add(get.suit(es[i])); + } + if (suits.length > 3) suits.length = 3; + player.removeAdditionalSkill(skill); + switch (suits.length) { + case 1: + player.addAdditionalSkill(skill, ["reyingzi"]); + break; + case 2: + player.addAdditionalSkill(skill, ["reyingzi", "qixi"]); + break; + case 3: + player.addAdditionalSkill(skill, ["reyingzi", "qixi", "rexuanfeng"]); + break; + } + }, + ai: { + threaten: 1.2, + }, + }, + zhaohan: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.phaseNumber < 8; + }, + check: function (event, player) { + return player.phaseNumber < 3; + }, + content: function () { + if (player.phaseNumber < 5) { + player.gainMaxHp(); + player.recover(); + } else player.loseMaxHp(); + }, + }, + rangjie: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + var choiceList = ["获得一张指定类型的牌"]; + if (player.canMoveCard()) choiceList.push("移动场上的一张牌"); + player + .chooseControl("cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("rangjie")) + .set("ai", function () { + var player = _status.event.player; + if (player.canMoveCard(true)) return 1; + return 0; + }); + "step 2"; + if (result.control == "cancel2") event.finish(); + else { + player.logSkill("rangjie"); + player.draw(); + if (result.index == 0) { + player + .chooseControl("basic", "trick", "equip") + .set("prompt", "选择获得一种类型的牌") + .set("ai", function () { + var player = _status.event.player; + if (player.hp <= 3 && !player.countCards("h", { name: ["shan", "tao"] })) return "basic"; + if (player.countCards("he", { type: "equip" }) < 2) return "equip"; + return "trick"; + }); + } else { + player.moveCard(true); + event.goto(4); + } + } + "step 3"; + var card = get.cardPile2(function (card) { + return get.type(card, "trick") == result.control; + }); + if (card) player.gain(card, "gain2", "log"); + "step 4"; + if (event.count > 0 && player.hasSkill("rangjie")) event.goto(1); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; + } + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; + } + }, + }, + }, + }, + yizheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.hp <= player.hp && player.canCompare(current); + }); + }, + filterTarget: function (card, player, current) { + return current.hp <= player.hp && player.canCompare(current); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + target.skip("phaseDraw"); + target.addTempSkill("yizheng2", { player: "phaseDrawSkipped" }); + } else player.loseMaxHp(); + }, + ai: { + order: 1, + result: { + player: (player, target) => { + let hs = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); + }); + if (!hs.length) return 0; + let a = get.number(hs[0]), + b = 4; + if (player.getDamagedHp()) b = 2; + return -b * (1 - Math.pow((a - 1) / 13, target.countCards("h"))); + }, + target: (player, target) => { + if (target.skipList.includes("phaseDraw") || target.hasSkill("pingkou") || target.hasSkill("xinpingkou")) return 0; + let hs = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); + }); + if (!hs.length) return 0; + return -Math.pow((get.number(hs[0]) - 1) / 13, target.countCards("h")) * 2; + }, + }, + }, + }, + yizheng2: { + mark: true, + intro: { content: "跳过下回合的摸牌阶段" }, + }, + rw_zhuge_skill: { + equipSkill: true, + audio: true, + firstDo: true, + trigger: { player: "useCard1" }, + forced: true, + filter: function (event, player) { + return !event.audioed && event.card.name == "sha" && player.countUsed("sha", true) > 1 && event.getParent().type == "phase"; + }, + content: function () { + trigger.audioed = true; + }, + mod: { + cardUsable: function (card, player, num) { + var cards = player.getEquips("rewrite_zhuge"); + if (card.name == "sha") { + if (!cards.length || player.hasSkill("rw_zhuge_skill", null, false) || cards.some(card => card != _status.rw_zhuge_temp && !ui.selected.cards.includes(card))) { + if (get.is.versus() || get.is.changban()) { + return num + 3; + } + return Infinity; + } + } + }, + cardEnabled2: function (card, player) { + if (!_status.event.addCount_extra || player.hasSkill("rw_zhuge_skill", null, false)) return; + var cards = player.getEquips("rewrite_zhuge"); + if (card && cards.includes(card)) { + try { + var cardz = get.card(); + } catch (e) { + return; + } + if (!cardz || cardz.name != "sha") return; + _status.rw_zhuge_temp = card; + var bool = lib.filter.cardUsable(get.autoViewAs({ name: "sha" }, ui.selected.cards.concat([card])), player); + delete _status.rw_zhuge_temp; + if (!bool) return false; + } + }, + }, + }, + xinqingjian: { + audio: "qingjian", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + direct: true, + usable: 1, + filter: function (event, player) { + return event.getg(player).length && event.getParent("phaseDraw").player != player && player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player.chooseCard(get.prompt2("xinqingjian"), "he", [1, player.countCards("he")]).ai = function () { + return -1; + }; + "step 1"; + if (result.bool) { + player.logSkill("xinqingjian"); + player.addSkill("xinqingjian2"); + player.addToExpansion(result.cards, "giveAuto", player).gaintag.add("xinqingjian2"); + } else player.storage.counttrigger.xinqingjian--; + }, + }, + xinqingjian2: { + audio: "xinqingjian", + charlotte: true, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return player.getExpansions("xinqingjian2").length > 0; + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + content: function () { + "step 0"; + var cards = player.getExpansions("xinqingjian2"); + player.chooseTarget(true, lib.filter.notMe).set("createDialog", ["清俭:将这些牌交给一名角色" + (cards.length > 1 ? ",然后摸一张牌" : ""), cards]); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); + if (player.give(player.getExpansions("xinqingjian2"), target).cards.length > 1) player.draw(); + } + "step 2"; + player.removeSkill("xinqingjian2"); + }, + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("xinqingjian2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + }, + }, + zhongzuo: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.getHistory("damage").length > 0 || player.getHistory("sourceDamage").length > 0; + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("zhongzuo"), "令一名角色摸两张牌。若其已受伤,则你摸一张牌。").set("ai", function (target) { + if (target.hasSkillTag("nogain")) return target.isDamaged() ? 0 : 1; + let att = get.attitude(_status.event.player, target); + if (att <= 0) return 0; + if (target.isDamaged()) return 1 + att / 5; + return att / 5; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhongzuo", target); + target.draw(2); + if (target.isDamaged()) player.draw(); + } + }, + }, + wanlan: { + audio: 2, + trigger: { global: "dying" }, + check: function (event, player) { + if (get.attitude(player, event.player) < 4) return false; + if (player.countCards("hs", card => player.canSaveCard(card, event.player)) >= 1 - event.player.hp) return false; + if (event.player == player || event.player == get.zhu(player)) return true; + if (_status.currentPhase && get.damageEffect(_status.currentPhase, player, player) < 0) return false; + return !player.hasUnknown(); + }, + limited: true, + unique: true, + filter: function (event, player) { + return event.player.hp <= 0; + }, + skillAnimation: true, + animationColor: "thunder", + logTarget: "player", + content: function () { + "step 0"; + player.awakenSkill("wanlan"); + var hs = player.getCards("h"); + if (hs.length) player.discard(hs); + "step 1"; + var num = 1 - trigger.player.hp; + if (num) trigger.player.recover(num); + "step 2"; + if (_status.currentPhase && _status.currentPhase.isIn()) { + var next = _status.currentPhase.damage(); + event.next.remove(next); + trigger.after.push(next); + } + }, + }, + rezhiyi: { + audio: "zhiyi", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return ( + player.getHistory("useCard", function (card) { + return get.type(card.card) == "basic"; + }).length > 0 || + player.getHistory("respond", function (card) { + return get.type(card.card) == "basic"; + }).length > 0 + ); + }, + content: function () { + "step 0"; + var list = []; + player.getHistory("useCard", function (evt) { + if (get.type(evt.card) != "basic") return; + var name = evt.card.name; + if (name == "sha") { + var nature = evt.card.nature; + switch (nature) { + case "fire": + name = "huosha"; + break; + case "thunder": + name = "leisha"; + break; + case "kami": + name = "kamisha"; + break; + case "ice": + name = "icesha"; + break; + case "stab": + name = "cisha"; + break; + } + } + list.add(name); + }); + player.getHistory("respond", function (evt) { + if (get.type(evt.card) != "basic") return; + var name = evt.card.name; + if (name == "sha") { + var nature = evt.card.nature; + switch (nature) { + case "fire": + name = "huosha"; + break; + case "thunder": + name = "leisha"; + break; + case "kami": + name = "kamisha"; + break; + case "ice": + name = "icesha"; + break; + case "stab": + name = "cisha"; + break; + } + } + list.add(name); + }); + player.chooseButton( + [ + "执义:选择要使用的牌,或点取消摸一张牌", + [ + list.map(function (name) { + return ["基本", "", name]; + }), + "vcard", + ], + ], + function (button) { + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }, + function (button) { + return _status.event.player.hasUseTarget({ + name: button.link[2], + nature: button.link[3], + }); + } + ); + "step 1"; + if (!result.bool) player.draw(); + else player.chooseUseTarget({ name: result.links[0][2], isCard: true, nature: result.links[0][3] }, true); + }, + }, + zhiyi: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + if (get.type(event.card) != "basic") return false; + var history = player + .getHistory("useCard", function (evt) { + return get.type(evt.card) == "basic"; + }) + .concat( + player.getHistory("respond", function (evt) { + return get.type(evt.card) == "basic"; + }) + ); + return history.length == 1 && history[0] == event; + }, + content: function () { + "step 0"; + var info = get.info(trigger.card); + if (!info || !info.enable) event._result = { index: 0 }; + else { + var evt = trigger; + if (evt.respondTo && evt.getParent("useCard").name == "useCard") evt = evt.getParent("useCard"); + event.evt = evt; + player + .chooseControl() + .set("prompt", "执义:请选择一项") + .set("choiceList", [ + "摸一张牌", + "于" + + get.translation(evt.card) + + "的使用结算结束之后视为使用一张" + + get.translation({ + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }), + ]) + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }; + if (card.name == "sha") { + if (player.getUseValue(card) > 0) return 1; + } else if (card.name == "tao") { + var hp = player.maxHp - player.hp; + if (trigger.targets.includes(player)) hp--; + return hp > 0 ? 1 : 0; + } + return 0; + })() + ); + } + "step 1"; + if (result.index == 0) { + player.draw(); + } else { + var next = player.chooseUseTarget({ name: trigger.card.name, nature: trigger.card.nature, isCard: true }, false, true); + _status.event.next.remove(next); + event.evt.after.push(next); + next.logSkill = "zhiyi"; + } + }, + }, + //表演测试 + qiaosi_map: { charlotte: true }, + qiaosi: { + audio: "xinfu_qiaosi", + derivation: "qiaosi_map", + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + game.pause(); + game.countChoose(); + setTimeout(function () { + _status.imchoosing = false; + event._result = { + bool: true, + links: ["qiaosi_c1", "qiaosi_c6"].concat(["qiaosi_c2", "qiaosi_c3", "qiaosi_c4", "qiaosi_c5"].randomGets(1)), + }; + if (event.dialog) event.dialog.close(); + if (event.controls) { + for (var i of event.controls) i.close(); + } + game.resume(); + }, 5000); + }; + var createDialog = function (player, id) { + if (player == game.me) return; + var str = get.translation(player) + "正在表演...
    "; + for (var i = 1; i < 7; i++) { + str += get.translation("qiaosi_c" + i); + if (i % 3 != 0) str += "  "; + if (i == 3) str += "
    "; + } + ui.create.dialog(str, "forcebutton").videoId = id; + }; + var chooseButton = function (player) { + var event = _status.event; + player = player || event.player; + event.status = { + qiaosi_c1: 0, + qiaosi_c2: 0, + qiaosi_c3: 0, + qiaosi_c4: 0, + qiaosi_c5: 0, + qiaosi_c6: 0, + }; + event.map = { + qiaosi_c1: [40, 60], + qiaosi_c2: [80, 120], + qiaosi_c3: [90, 110], + qiaosi_c4: [90, 110], + qiaosi_c5: [80, 120], + qiaosi_c6: [40, 60], + }; + event.finishedx = []; + event.str = '请开始你的表演
    qiaosi_c1% qiaosi_c2% qiaosi_c3%
    qiaosi_c4%qiaosi_c5% qiaosi_c6%'; + event.dialog = ui.create.dialog(event.str, "forcebutton", "hidden"); + event.dialog.addText("
  • 点击下方的按钮,可以增加按钮对应的角色的「表演完成度」。对于不同的角色,点击时增加的完成度不同,最终获得的牌也不同。一次表演最多只能完成3名角色的进度。", false); + event.dialog.open(); + for (var i in event.status) { + event.dialog.content.childNodes[0].innerHTML = event.dialog.content.childNodes[0].innerHTML.replace(i, event.status[i]); + } + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("pointerdiv"); + } + (event.switchToAuto = function () { + event._result = { + bool: true, + links: event.finishedx.slice(0), + }; + event.dialog.close(); + for (var i of event.controls) i.close(); + game.resume(); + _status.imchoosing = false; + }), + (event.controls = []); + for (var i = 1; i <= 6; i++) + event.controls.push( + ui.create.control("qiaosi_c" + i, function (link) { + var event = _status.event; + if (event.finishedx.includes(link)) return; + event.status[link] += get.rand.apply(get, event.map[link]); + if (event.status[link] >= 100) { + event.status[link] = 100; + var str = event.str.slice(0); + for (var i in event.status) { + str = str.replace(i, event.status[i]); + } + event.dialog.content.childNodes[0].innerHTML = str; + event.finishedx.push(link); + if (event.finishedx.length >= 3) { + event._result = { + bool: true, + links: event.finishedx.slice(0), + }; + event.dialog.close(); + for (var i of event.controls) i.close(); + game.resume(); + _status.imchoosing = false; + } + } else { + var str = event.str.slice(0); + for (var i in event.status) { + str = str.replace(i, event.status[i]); + } + event.dialog.content.childNodes[0].innerHTML = str; + } + }) + ); + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("selectable"); + } + game.pause(); + game.countChoose(); + }; + //event.switchToAuto=switchToAuto; + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { + chooseButton(); + } else if (event.isOnline()) { + event.player.send(chooseButton, event.player); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 1"; + game.broadcastAll("closeDialog", event.videoId); + var map = event.result || result; + //game.print(map); + if (!map || !map.bool || !map.links) { + game.log(player, "表演失败"); + event.finish(); + return; + } + var list = map.links; + if (!list.length) { + game.log(player, "表演失败"); + event.finish(); + return; + } + var cards = []; + var list2 = []; + if (list.includes("qiaosi_c1")) { + list2.push("trick"); + list2.push("trick"); + } + if (list.includes("qiaosi_c2")) { + if (list.includes("qiaosi_c1")) list2.push(["sha", "jiu"]); + else list2.push(Math.random() < 0.66 ? "equip" : ["sha", "jiu"]); + } + if (list.includes("qiaosi_c3")) { + list2.push([Math.random() < 0.66 ? "sha" : "jiu"]); + } + if (list.includes("qiaosi_c4")) { + list2.push([Math.random() < 0.66 ? "shan" : "tao"]); + } + if (list.includes("qiaosi_c5")) { + if (list.includes("qiaosi_c6")) list2.push(["shan", "tao"]); + else list2.push(Math.random() < 0.66 ? "trick" : ["shan", "tao"]); + } + if (list.includes("qiaosi_c6")) { + list2.push("equip"); + list2.push("equip"); + } + while (list2.length) { + var filter = list2.shift(); + var card = get.cardPile(function (x) { + if (cards.includes(x)) return false; + if (typeof filter == "string" && get.type(x, "trick") == filter) return true; + if (typeof filter == "object" && filter.includes(x.name)) return true; + }); + if (card) cards.push(card); + else { + var card = get.cardPile(function (x) { + return !cards.includes(x); + }); + if (card) cards.push(card); + } + } + if (cards.length) { + event.cards = cards; + event.num = cards.length; + player.showCards(cards); + } else event.finish(); + "step 2"; + player.gain(event.cards, "gain2"); + player + .chooseControl() + .set("choiceList", ["将" + get.cnNumber(event.num) + "张牌交给一名其他角色", "弃置" + get.cnNumber(event.num) + "张牌"]) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 2; + }) + ) + return 0; + return 1; + }); + "step 3"; + if (result.index == 0) { + player.chooseCardTarget({ + position: "he", + filterCard: true, + selectCard: event.num, + filterTarget: function (card, player, target) { + return player != target; + }, + ai1: function (card) { + return 1; + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 5; + return att; + }, + prompt: "选择" + get.cnNumber(event.num) + "张牌,交给一名其他角色。", + forced: true, + }); + } else { + player.chooseToDiscard(event.num, true, "he"); + event.finish(); + } + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.give(result.cards, target); + } + }, + ai: { + order: 10, + result: { player: 1 }, + threaten: 3.2, + }, + }, + refuhai: { + audio: "xinfu_fuhai", + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + event.current = player.next; + event.upper = []; + event.lower = []; + event.acted = []; + event.num = 0; + event.stopped = false; + "step 1"; + event.acted.push(event.current); + event.current.chooseControl("潮起", "潮落").set("prompt", "潮鸣起乎?潮鸣落乎?").ai = function () { + return Math.random() < 0.5 ? 0 : 1; + }; + "step 2"; + if (!event.chosen) event.chosen = result.control; + if (event.chosen != result.control) event.stopped = true; + if (!event.stopped) event.num++; + if (result.control == "潮起") { + event.upper.push(event.current); + } else event.lower.push(event.current); + event.current = event.current.next; + if (event.current != player && !event.acted.includes(event.current)) event.goto(1); + "step 3"; + for (var i = 0; i < event.acted.length; i++) { + var bool = event.upper.includes(event.acted[i]); + game.log(event.acted[i], "选择了", bool ? "#g潮起" : "#y潮落"); + event.acted[i].popup(bool ? "潮起" : "潮落", bool ? "wood" : "orange"); + } + game.delay(1); + "step 4"; + if (num > 1) player.draw(num); + }, + ai: { + order: 10, + result: { player: 1 }, + }, + }, + rebiaozhao: { + audio: "biaozhao", + intro: { + content: "expansion", + markcount: "expansion", + }, + trigger: { + player: "phaseJieshuBegin", + }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0 && !player.getExpansions("rebiaozhao").length; + }, + content: function () { + "step 0"; + player.chooseCard("he", get.prompt("rebiaozhao"), "将一张牌置于武将牌上作为“表”").ai = function (card) { + return 6 - get.value(card); + }; + "step 1"; + if (result.bool) { + player.logSkill("rebiaozhao"); + player.addToExpansion(player, "give", result.cards).gaintag.add("rebiaozhao"); + } + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { notemp: true }, + group: ["rebiaozhao2", "rebiaozhao3"], + }, + rebiaozhao2: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + forced: true, + audio: "biaozhao", + filter: function (event, player) { + var cards = player.getExpansions("rebiaozhao"), + cards2 = event.getd(); + if (!cards.length || !cards2.length) return false; + var num = get.number(cards[0]); + var cards = event.getd(); + for (var card of cards) { + if (get.number(card) == num) return true; + } + return false; + }, + content: function () { + player.loseToDiscardpile(player.getExpansions("rebiaozhao")); + player.loseHp(); + }, + }, + rebiaozhao3: { + trigger: { + player: "phaseZhunbeiBegin", + }, + forced: true, + charlotte: true, + audio: "biaozhao", + filter: function (event, player) { + return player.getExpansions("rebiaozhao").length > 0; + }, + content: function () { + "step 0"; + player.loseToDiscardpile(player.getExpansions("rebiaozhao")); + "step 1"; + player.chooseTarget("令一名角色摸三张牌并回复1点体力", true).ai = function (target) { + var num = 2; + if (target.isDamaged()) num++; + return num * get.attitude(_status.event.player, target); + }; + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.draw(3); + target.recover(); + } + }, + }, + reqianxin: { + audio: "xinfu_qianxin", + enable: "phaseUse", + usable: 1, + filterCard: true, + selectCard: function () { + return [1, Math.min(2, game.players.length - 1)]; + }, + check: function (card) { + return 6 - get.value(card); + }, + discard: false, + lose: false, + delay: false, + content: function () { + var targets = game + .filterPlayer(function (current) { + return current != player; + }) + .randomGets(cards.length); + var map = []; + for (var i = 0; i < targets.length; i++) { + var target = targets[i]; + target.addSkill("reqianxin2"); + target.storage.reqianxin2.push([cards[i], player]); + map.push([target, cards[i]]); + } + game.loseAsync({ + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + }, + ai: { + order: 1, + result: { + player: 1, + }, + }, + }, + reqianxin2: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + popup: false, + charlotte: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + onremove: true, + filter: function (event, player) { + var list = player.storage.reqianxin2; + if (Array.isArray(list)) { + var hs = player.getCards("h"); + for (var i = 0; i < list.length; i++) { + if (hs.includes(list[i][0]) && list[i][1].isIn()) return true; + } + } + return false; + }, + content: function () { + "step 0"; + var current = player.storage.reqianxin2.shift(); + event.source = current[1]; + if (!event.source.isIn() || !player.getCards("h").includes(current[0])) event.goto(3); + "step 1"; + source.logSkill("reqianxin", player); + player + .chooseControl() + .set("choiceList", ["令" + get.translation(source) + "摸两张牌", "令自己本回合的手牌上限-2"]) + .set("prompt", get.translation(source) + "发动了【遣信】,请选择一项") + .set("source", source) + .set("ai", function () { + var player = _status.event.player; + if (get.attitude(player, _status.event.source) > 0) return 0; + if (player.maxHp - player.countCards("h") > 1) return 1; + return Math.random() > 0.5 ? 0 : 1; + }); + "step 2"; + if (result.index == 0) source.draw(2); + else { + player.addTempSkill("reqianxin3"); + player.addMark("reqianxin3", 2, false); + } + "step 3"; + if (player.storage.reqianxin2.length) event.goto(0); + else player.removeSkill("reqianxin2"); + }, + }, + reqianxin3: { + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("reqianxin3"); + }, + }, + }, + renshi: { + audio: 2, + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return player.isDamaged() && event.card && event.card.name == "sha"; + }, + content: function () { + "step 0"; + trigger.cancel(); + if (trigger.cards) { + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2", "log"); + } + "step 1"; + player.loseMaxHp(); + }, + ai: { + halfneg: true, + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") return true; + return false; + }, + }, + }, + wuyuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", "sha") > 0; + }, + filterCard: { name: "sha" }, + filterTarget: lib.filter.notMe, + check: function (card) { + var player = _status.event.player; + if ( + get.color(card) == "red" && + game.hasPlayer(function (current) { + return current != player && current.isDamaged() && get.attitude(player, current) > 2; + }) + ) + return 2; + if (get.natureList(card).length) return 1.5; + return 1; + }, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.give(cards, target, "give"); + player.recover(); + "step 1"; + var num = 1; + if (get.natureList(cards[0]).length) num++; + target.draw(num); + if (get.color(cards[0]) == "red") target.recover(); + }, + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.isDamaged()) return 1; + return 0; + }, + target: function (player, target) { + if (ui.selected.cards.length) { + var num = 1; + if (get.natureList(ui.selected.cards[0]).length) num++; + if (target.hasSkillTag("nogain")) num = 0; + if (get.color(ui.selected.cards[0]) == "red") return num + 2; + else return num + 1; + } + return 1; + }, + }, + }, + }, + huaizi: { + mod: { + maxHandcardBase: function (player, num) { + return player.maxHp; + }, + }, + //audio:2, + //trigger:{player:'phaseDiscardBegin'}, + forced: true, + firstDo: true, + filter: function (event, player) { + return player.isDamaged() && player.countCards("h") > player.hp; + }, + content: function () {}, + }, + rexushen: { + derivation: ["new_rewusheng", "redangxian"], + audio: "xinfu_xushen", + limited: true, + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.hasSex("male"); + }); + }, + skillAnimation: true, + animationColor: "fire", + content: function () { + player.addSkill("rexushen2"); + player.awakenSkill("rexushen"); + player.loseHp( + game.countPlayer(function (current) { + return current.hasSex("male"); + }) + ); + }, + ai: { + order: 10, + result: { + player: function (player) { + if ( + player.hp != + game.countPlayer(function (current) { + return current.hasSex("male"); + }) + ) + return 0; + return game.hasPlayer(function (current) { + return get.attitude(player, current) > 4 && current.countCards("h", "tao"); + }) + ? 1 + : 0; + }, + }, + }, + }, + rexushen2: { + charlotte: true, + subSkill: { + count: { + trigger: { + player: "recoverBegin", + }, + forced: true, + silent: true, + popup: false, + filter: function (event, player) { + if (!event.source) return false; + if (!player.isDying()) return false; + var evt = event.getParent("dying").getParent(2); + return evt.name == "rexushen" && evt.player == player; + }, + content: function () { + trigger.rexushen = true; + }, + sub: true, + }, + }, + group: ["rexushen2_count"], + trigger: { + player: "recoverAfter", + }, + filter: function (event, player) { + if (player.isDying()) return false; + return event.rexushen == true; + }, + direct: true, + silent: true, + popup: false, + content: function () { + "step 0"; + player.removeSkill("rexushen2"); + player.chooseBool("是否令" + get.translation(trigger.source) + "获得技能〖武圣〗和〖当先〗").ai = function () { + return get.attitude(player, trigger.source) > 0; + }; + "step 1"; + if (result.bool) { + player.line(trigger.source, "fire"); + trigger.source.addSkills(["new_rewusheng", "redangxian"]); + } + }, + }, + rezhennan: { + audio: "xinfu_zhennan", + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return event.player != player && event.targets && event.targets.length && event.targets.length > event.player.hp; + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt("rezhennan", trigger.player), "弃置一张牌并对其造成1点伤害", "he"); + next.set("logSkill", ["rezhennan", trigger.player]); + next.set("ai", function (card) { + var player = _status.event.player; + var target = _status.event.getTrigger().player; + if (get.damageEffect(target, player, player) > 0) return 7 - get.value(card); + return -1; + }); + "step 1"; + if (result.bool) trigger.player.damage(); + }, + }, + meiyong: { + inherit: "xinfu_wuniang", + audio: "xinfu_wuniang", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("meiyong"), "获得一名其他角色的一张牌,然后其摸一张牌。", function (card, player, target) { + if (player == target) return false; + return target.countGainableCards(player, "he") > 0; + }) + .set("ai", function (target) { + return 10 - get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("meiyong", target); + player.gainPlayerCard(target, "he", true); + } else event.finish(); + "step 2"; + target.draw(); + }, + }, + relianji: { + audio: "wylianji", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.players.length > 1; + }, + filterTarget: lib.filter.notMe, + targetprompt: ["打人", "被打"], + selectTarget: 2, + multitarget: true, + content: function () { + "step 0"; + game.delay(0.5); + if (!targets[0].hasEquipableSlot(1)) event.goto(2); + "step 1"; + var target = targets[0]; + var equip1 = get.cardPile2(function (card) { + return get.subtype(card) == "equip1" && target.canUse(card, target); + }); + if (!equip1) { + player.popup("连计失败"); + game.log("牌堆中无装备"); + event.finish(); + return; + } + if (equip1.name == "qinggang" && !lib.inpile.includes("qibaodao")) { + equip1.remove(); + equip1 = game.createCard("qibaodao", equip1.suit, equip1.number); + } + target.$draw(equip1); + target.chooseUseTarget(equip1, "noanimate", "nopopup", true); + "step 2"; + game.updateRoundNumber(); + var list = ["nanman", "wanjian", "huogong", "juedou", "sha"]; + var list2 = game.players.slice(0); + list2.remove(player); + for (var i = 0; i < list.length; i++) { + if (!targets[0].canUse(list[i], targets[1], false)) list.splice(i--, 1); + } + if (!list.length) return; + var name = list.randomGet(); + if (name == "nanman" || name == "wanjian") { + for (var i = 0; i < list2.length; i++) { + if (!targets[0].canUse(name, list2[i], false)) list2.splice(i--, 1); + } + } else list2 = targets[1]; + targets[0].useCard({ name: name, isCard: true }, list2, "noai"); + game.delay(0.5); + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if (ui.selected.targets.length == 0) { + return 1; + } else { + return -1; + } + }, + }, + expose: 0.4, + threaten: 3, + }, + group: "relianji_count", + subSkill: { + count: { + sub: true, + forced: true, + popup: false, + silent: true, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + var evt = event.getParent(3); + return evt && evt.name == "relianji" && evt.player == player; + }, + content: function () { + if (!player.storage.relianji) player.storage.relianji = 0; + player.storage.relianji++; + event.trigger("remoucheng_awaken"); + }, + }, + }, + }, + remoucheng: { + derivation: "jingong", + trigger: { + player: "remoucheng_awaken", + }, + forced: true, + filter: function (event, player) { + return player.storage.relianji && player.storage.relianji > 2; + }, + audio: "moucheng", + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + player.awakenSkill("remoucheng"); + player.changeSkills(["jingong", "relianji"]); + player.gainMaxHp(); + player.recover(); + }, + ai: { + combo: "relianji", + }, + }, + shouye: { + audio: 2, + group: "shouye_after", + trigger: { target: "useCardToTarget" }, + filter: function (event, player) { + return event.player != player && event.targets.length == 1; + }, + check: function (event, player) { + if (event.player == game.me || event.player.isOnline()) return get.attitude(player, event.player) < 0; + return get.effect(player, event.card, event.player, player) < 0; + }, + usable: 1, + logTarget: "player", + content: function () { + "step 0"; + player.line(trigger.player, "green"); + player.chooseToDuiben(trigger.player); + "step 1"; + if (result.bool) { + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + trigger.getParent().shouyeer = player; + } + }, + subSkill: { + after: { + sub: true, + trigger: { global: "useCardAfter" }, + forced: true, + silent: true, + popup: false, + filter: function (event, player) { + if (event.shouyeer != player) return false; + if (event.cards) { + for (var i = 0; i < event.cards.length; i++) { + if (event.cards[i].isInPile()) return true; + } + } + return false; + }, + content: function () { + var list = []; + for (var i = 0; i < trigger.cards.length; i++) { + if (trigger.cards[i].isInPile()) { + list.push(trigger.cards[i]); + } + } + player.gain(list, "gain2", "log"); + }, + }, + }, + }, + liezhi: { + audio: 2, + group: "liezhi_damage", + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return !player.hasSkill("liezhi_disable"); + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("liezhi"), "弃置至多两名其他角色区域内的各一张牌", [1, 2], function (card, player, target) { + return target != player && target.countDiscardableCards(player, "hej") > 0; + }).ai = function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe" }, player, player); + }; + "step 1"; + if (result.bool) { + result.targets.sortBySeat(); + event.targets = result.targets; + player.line(result.targets, "green"); + player.logSkill("liezhi", result.targets); + } else event.finish(); + "step 2"; + event.current = targets.shift(); + player.discardPlayerCard(event.current, "hej", true); + if (targets.length) event.redo(); + }, + subSkill: { + disable: { + sub: true, + trigger: { player: "phaseAfter" }, + forced: true, + silent: true, + popup: false, + charlotte: true, + //filter:function(event){return !event.liezhi}, + content: function () { + player.removeSkill("liezhi_disable"); + }, + }, + damage: { + trigger: { player: "damage" }, + forced: true, + silent: true, + popup: false, + content: function () { + player.addSkill("liezhi_disable"); + }, + }, + }, + }, + xinzhanyi: { + audio: "zhanyi", + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + check: function (card) { + var player = _status.event.player; + if (player.hp < 3) return 0; + var type = get.type(card, "trick"); + if (type == "trick") { + return 6 - get.value(card); + } else if (type == "equip") { + if ( + player.hasSha() && + game.hasPlayer(function (current) { + return player.canUse("sha", current) && get.attitude(player, current) < 0 && get.effect(current, { name: "sha" }, player, player) > 0; + }) + ) { + return 6 - get.value(card); + } + } + return 0; + }, + content: function () { + player.loseHp(); + switch (get.type(cards[0], "trick", cards[0].original == "h" ? player : false)) { + case "basic": + player.addTempSkill("xinzhanyi_basic"); + player.addMark("xinzhanyi_basic1", 1, false); + break; + case "equip": + player.addTempSkill("xinzhanyi_equip"); + break; + case "trick": + player.addTempSkill("xinzhanyi_trick"); + player.draw(3); + break; + } + }, + ai: { + order: 9.1, + result: { + player: 1, + }, + }, + }, + xinzhanyi_basic1: { + trigger: { player: "useCard" }, + filter: function (event, player) { + return get.type(event.card, false) == "basic" && player.hasMark("xinzhanyi_basic1"); + }, + forced: true, + silent: true, + popup: false, + content: function () { + if (!trigger.baseDamage) trigger.baseDamage = 1; + var num = player.countMark("xinzhanyi_basic1"); + trigger.baseDamage += num; + player.removeMark("xinzhanyi_basic1", num, false); + game.log(trigger.card, "的伤害值/回复值", "#y+" + num); + }, + }, + xinzhanyi_basic: { + group: ["xinzhanyi_basic1"], + onremove: function (p, s) { + delete p.storage[s + 1]; + }, + hiddenCard: function (player, name) { + return get.type(name) == "basic" && player.countCards("h", { type: "basic" }) > 0; + }, + enable: "chooseToUse", + filter: function (event, player) { + if ( + !player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hs") + ) + return false; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) list.push(["基本", "", name]); + if (name != "sha") continue; + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: name, nature: j }, player, event)) list.push(["基本", "", "sha", j]); + } + } + return ui.create.dialog("战意", [list, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + game.hasPlayer(function (current) { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + switch (button.link[2]) { + case "tao": + return 5; + case "jiu": { + if (player.countCards("hs", { type: "basic" }) >= 2) return 3; + return 0; + } + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder" || button.link[3] == "ice") return 2.92; + else return 2.9; + } + } + return 0; + }, + backup: function (links, player) { + return { + audio: "zhanyi", + filterCard: function (card, player, target) { + return get.type(card) == "basic"; + }, + check: function (card, player, target) { + return 9 - get.value(card); + }, + viewAs: { name: links[0][2], nature: links[0][3] }, + position: "hs", + popname: true, + }; + }, + prompt: function (links, player) { + return "将一张基本牌当做" + get.translation(links[0][3] || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + if (event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0 && player.countCards("hs", { type: "basic" }) >= 2) { + return 3.3; + } + return 3.1; + }, + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if ( + player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hs") + ) { + if (tag == "respondSha") { + if (arg != "use") return false; + } + } else { + return false; + } + }, + result: { + player: 1, + }, + }, + }, + xinzhanyi_equip: { + audio: "zhanyi", + trigger: { player: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countCards("he") > 0 && event.targets.length == 1; + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + content: function () { + "step 0"; + trigger.target.chooseToDiscard("he", true, 2); + "step 1"; + if (result.bool && result.cards && result.cards.length) { + if (result.cards.length == 1) { + event._result = { bool: true, links: result.cards.slice(0) }; + } else + player.chooseButton(["选择获得其中的一张牌", result.cards.slice(0)], true).ai = function (button) { + return get.value(button.link); + }; + } else event.finish(); + "step 2"; + if (result.links) player.gain(result.links, "gain2"); + }, + }, + xinzhanyi_trick: { + mod: { + wuxieRespondable: function () { + return false; + }, + }, + }, + xinfu_daigong: { + usable: 1, + audio: 2, + trigger: { + player: "damageBegin4", + }, + filter: function (event, player) { + return event.source != undefined && player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.showHandcards(); + "step 1"; + var cards = player.getCards("h"); + var suits = []; + for (var i = 0; i < cards.length; i++) { + suits.add(get.suit(cards[i])); + } + trigger.source + .chooseCard("he", "交给" + get.translation(player) + "一张满足条件的牌,否则防止此伤害。", function (card) { + return !_status.event.suits.includes(get.suit(card)); + }) + .set("suits", suits).ai = function (card) { + var player = _status.event.player; + var target = _status.event.getParent("xinfu_daigong").player; + if (get.damageEffect(target, player, player) > 0) return 6.5 - get.value(card); + return 0; + }; + "step 2"; + if (result.bool) { + trigger.source.give(result.cards, player, true); + } else trigger.cancel(); + }, + }, + xinfu_zhaoxin: { + group: ["zhaoxin_give"], + intro: { + content: "expansion", + markcount: "expansion", + }, + enable: "phaseUse", + usable: 1, + audio: 2, + filter: function (event, player) { + return player.countCards("h") > 0 && player.getExpansions("xinfu_zhaoxin").length < 3; + }, + filterCard: true, + selectCard: function () { + var player = _status.event.player; + return [1, 3 - player.getExpansions("xinfu_zhaoxin").length]; + }, + discard: false, + lose: false, + delay: false, + content: function () { + player.addToExpansion(player, "give", cards).gaintag.add("xinfu_zhaoxin"); + player.draw(cards.length); + }, + check: function (card) { + return 6 - get.value(card); + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { + order: 1, + result: { + player: 1, + }, + }, + }, + zhaoxin_give: { + trigger: { + global: "phaseDrawAfter", + }, + filter: function (event, player) { + if (!player.getExpansions("xinfu_zhaoxin").length) return false; + return player == event.player || player.inRange(event.player); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCardButton(get.prompt("xinfu_zhaoxin", trigger.player), player.getExpansions("xinfu_zhaoxin"), function (button) { + return true; + }) + .set("ai", function (button) { + return 1 + Math.random(); + }); + "step 1"; + if (result.bool) { + event.card = result.links[0]; + player.logSkill("xinfu_zhaoxin", target); + player.line(trigger.player, "thunder"); + player.showCards(event.card); + } else event.finish(); + "step 2"; + trigger.player.chooseBool("是否获得" + get.translation(event.card) + "?").ai = function () { + return get.attitude(trigger.player, player) > 0; + }; + "step 3"; + if (result.bool) { + trigger.player.gain(event.card, "give", player, "bySelf"); + player.chooseBool("是否对" + get.translation(trigger.player) + "造成1点伤害?").ai = function () { + return get.damageEffect(trigger.player, player, player) > 0; + }; + } else { + trigger.player.chat("拒绝"); + event.finish(); + } + "step 4"; + if (result.bool) { + trigger.player.damage("nocard"); + } + }, + }, + xinfu_qianchong: { + audio: 3, + group: ["qc_weimu", "qc_mingzhe"], + subSkill: { + effect: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player) { + var type = get.type2(card); + if (player.getStorage("xinfu_qianchong_effect").includes(type)) return Infinity; + }, + targetInRange: function (card, player) { + var type = get.type2(card); + if (player.getStorage("xinfu_qianchong_effect").includes(type)) return true; + }, + }, + }, + }, + trigger: { + player: "phaseUseBegin", + }, + direct: true, + filter: function (event, player) { + var es = player.getCards("e"); + if (!es.length) return true; + var col = get.color(es[0]); + for (var i = 0; i < es.length; i++) { + if (get.color(es[i]) != col) return true; + } + return false; + }, + content: function () { + "step 0"; + var list = ["basic", "trick", "equip", "cancel2"]; + list.removeArray(player.getStorage("xinfu_qianchong_effect")); + if (list.length > 1) { + player + .chooseControl(list) + .set("ai", function () { + return list[0]; + }) + .set("prompt", get.prompt("xinfu_qianchong")) + .set("prompt2", "你可以选择一种类别的牌,然后你本回合内使用该类别的牌时没有次数和距离限制。"); + } else event.finish(); + "step 1"; + if (result.control && result.control != "cancel2") { + player.logSkill("xinfu_qianchong"); + var type = result.control; + player.addTempSkill("xinfu_qianchong_effect"); + player.markAuto("xinfu_qianchong_effect", [type]); + var str = get.translation(type) + "牌"; + game.log(player, "声明了", "#y" + str); + player.popup(str, "thunder"); + } + }, + }, + qc_weimu: { + audio: "xinfu_qianchong", + mod: { + targetEnabled: function (card, player, target) { + var bool = true; + var es = target.getCards("e"); + if (!es.length) bool = false; + for (var i = 0; i < es.length; i++) { + if (get.color(es[i]) != "black") bool = false; + } + if (bool && (get.type(card) == "trick" || get.type(card) == "delay") && get.color(card) == "black") return false; + }, + }, + }, + qc_mingzhe: { + audio: "xinfu_qianchong", + trigger: { + player: ["useCard", "respond", "loseAfter"], + global: "loseAsyncAfter", + }, + frequent: true, + filter: function (event, player) { + if (player.hasSkill("mingzhe")) return false; + if (player == _status.currentPhase) return false; + var es = player.getCards("e"); + if (!es.length) return false; + for (var i = 0; i < es.length; i++) { + if (get.color(es[i]) != "red") return false; + } + if (event.name.indexOf("lose") != 0) return get.color(event.card) == "red"; + if (event.type != "discard") return false; + var evt = event.getl(player); + if (evt.cards2) { + for (var i = 0; i < evt.cards2.length; i++) { + if (get.color(evt.cards2[i]) == "red") return true; + } + } + return false; + }, + content: function () { + "step 0"; + event.count = 1; + if (trigger.name.indexOf("lose") == 0) { + event.count = 0; + var evt = trigger.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (get.color(evt.cards2[i]) == "red") event.count++; + } + } + "step 1"; + player.draw(); + event.count--; + "step 2"; + if (event.count && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { + player.chooseBool(get.prompt2("mingzhe")).set("frequentSkill", event.name); + } else event.finish(); + "step 3"; + if (result.bool) { + player.logSkill("qc_mingzhe"); + event.goto(1); + } + }, + ai: { + threaten: 0.7, + }, + }, + xinfu_shangjian: { + trigger: { + global: "phaseJieshuBegin", + }, + audio: 2, + filter: function (event, player) { + var num = 0; + player.getHistory("lose", function (evt) { + var evt2 = evt.getParent(); + if (evt2.name == "useCard" && evt2.player == player && get.type(evt2.card, null, false) == "equip") return; + if (evt.cards2) num += evt.cards2.length; + }); + return num > 0 && num <= player.hp; + }, + forced: true, + content: function () { + "step 0"; + var num = 0; + player.getHistory("lose", function (evt) { + var evt2 = evt.getParent(); + if (evt2.name == "useCard" && evt2.player == player && get.type(evt2.card, null, false) == "equip") return; + if (evt.cards2) num += evt.cards2.length; + }); + if (num > 0) { + player.draw(num); + } + }, + }, + rw_bagua_skill: { + inherit: "bagua_skill", + audio: true, + content: function () { + "step 0"; + player.judge("rewrite_bagua", function (card) { + return get.suit(card) != "spade" ? 1.5 : -0.5; + }).judge2 = function (result) { + return result.bool; + }; + "step 1"; + if (result.judge > 0) { + trigger.untrigger(); + trigger.set("responded", true); + trigger.result = { bool: true, card: { name: "shan" } }; + } + }, + }, + rw_baiyin_skill: { + inherit: "baiyin_skill", + audio: true, + subSkill: { + lose: { + audio: "rw_baiyin_skill", + forced: true, + charlotte: true, + equipSkill: true, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: (event, player) => { + if (player.hasSkillTag("unequip2")) return false; + var evt = event.getl(player); + return evt && evt.es.some(card => card.name == "rewrite_baiyin"); + }, + content: function () { + var evt = trigger.getl(player); + evt.es.forEach(card => { + if (card.name == "rewrite_baiyin") { + player.recover(); + player.draw(2); + } + }); + }, + }, + }, + }, + rw_lanyinjia: { + inherit: "lanyinjia", + audio: "lanyinjia", + }, + rw_minguangkai_cancel: { + inherit: "minguangkai_cancel", + }, + rw_minguangkai_link: { + inherit: "minguangkai_link", + trigger: { + player: "linkBefore", + }, + forced: true, + //priority:20, + filter: function (event, player) { + return !player.isLinked(); + }, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (["tiesuo", "lulitongxin"].includes(card.name)) { + return "zerotarget"; + } + }, + }, + }, + }, + rw_renwang_skill: { + inherit: "renwang_skill", + audio: true, + filter: function (event, player) { + if (player.hasSkillTag("unequip2")) return false; + if ( + event.player.hasSkillTag("unequip", false, { + name: event.card ? event.card.name : null, + target: player, + card: event.card, + }) + ) + return false; + return event.card.name == "sha" && (get.suit(event.card) == "heart" || get.color(event.card) == "black"); + }, + ai: { + effect: { + target: function (card, player, target) { + if (typeof card !== "object" || target.hasSkillTag("unequip2")) return; + if ( + player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return; + if (card.name == "sha" && ["spade", "club", "heart"].includes(get.suit(card))) return "zeroplayertarget"; + }, + }, + }, + }, + rw_tengjia1: { + inherit: "tengjia1", + audio: true, + }, + rw_tengjia2: { + inherit: "tengjia2", + audio: true, + }, + rw_tengjia3: { + audio: "rw_tengjia1", + inherit: "rw_minguangkai_link", + ai: { + effect: { + target: function (card, player, target, current) { + if (["tiesuo", "lulitongxin"].includes(card.name)) { + return "zeroplayertarget"; + } + }, + }, + }, + }, + rw_tengjia4: { + inherit: "tengjia3", + audio: "rw_tengjia1", + }, + xinfu_pingcai: { + subSkill: { backup: {} }, + wolong_card: function () { + "step 0"; + var ingame = game.hasPlayer(function (current) { + return ["sp_zhugeliang", "re_sp_zhugeliang", "ol_sp_zhugeliang", "prp_zhugeliang"].includes(current.name) || ["sp_zhugeliang", "re_sp_zhugeliang", "ol_sp_zhugeliang", "prp_zhugeliang"].includes(current.name2); + }) + ? true + : false; + var prompt = "请选择"; + prompt += ingame ? "至多两名" : "一名"; + prompt += "角色,对其造成1点火焰伤害"; + var range = ingame ? [1, 2] : [1, 1]; + player.chooseTarget(prompt, range).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "fire"); + }); + "step 1"; + if (result.bool && result.targets.length) { + player.line(result.targets, "fire"); + result.targets.sortBySeat(); + for (var i = 0; i < result.targets.length; i++) { + result.targets[i].damage("fire"); + } + } + }, + fengchu_card: function () { + "step 0"; + var ingame = game.hasPlayer(function (current) { + return ["re_pangtong", "pangtong", "ol_pangtong"].includes(current.name) || ["re_pangtong", "pangtong", "ol_pangtong"].includes(current.name2); + }) + ? true + : false; + var prompt = "请选择"; + prompt += ingame ? "至多四名" : "至多三名"; + prompt += "要横置的角色"; + var range = ingame ? [1, 4] : [1, 3]; + player.chooseTarget(prompt, range).set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "tiesuo" }, player, player); + }); + "step 1"; + if (result.bool && result.targets.length) { + player.line(result.targets, "green"); + result.targets.sortBySeat(); + for (var i = 0; i < result.targets.length; i++) { + result.targets[i].link(); + } + } + }, + xuanjian_card: function () { + "step 0"; + event.ingame = game.hasPlayer(function (current) { + return ["re_xushu", "xin_xushu", "xushu", "dc_xushu"].includes(current.name) || ["re_xushu", "xin_xushu", "xushu", "dc_xushu"].includes(current.name2); + }) + ? true + : false; + var prompt = "请选择一名角色,令其回复1点体力并摸一张牌"; + prompt += event.ingame ? ",然后你摸一张牌。" : "。"; + player.chooseTarget(prompt).set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target) * (target.isDamaged() ? 2 : 1); + }); + "step 1"; + if (result.bool && result.targets.length) { + var target = result.targets[0]; + player.line(target, "thunder"); + target.draw(); + target.recover(); + if (event.ingame) player.draw(); + } + }, + shuijing_card: function () { + "step 0"; + event.ingame = game.hasPlayer(function (current) { + return current.name == "simahui" || current.name2 == "simahui"; + }) + ? true + : false; + var prompt = "将一名角色装备区中的"; + prompt += event.ingame ? "一张牌" : "防具牌"; + prompt += "移动到另一名角色的装备区中"; + var next = player.chooseTarget(2, function (card, player, target) { + if (ui.selected.targets.length) { + if (!_status.event.ingame) { + var cards = ui.selected.targets[0].getEquips(2); + return cards.some(card => target.canEquip(card)); + } + var from = ui.selected.targets[0]; + if (target.isMin()) return false; + var es = from.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (target.canEquip(es[i])) return true; + } + return false; + } else { + if (!event.ingame) { + if (target.getEquips(2).length) return true; + return false; + } + return target.countCards("e") > 0; + } + }); + next.set("ingame", event.ingame); + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (ui.selected.targets.length == 0) { + if (att < 0) { + if ( + game.hasPlayer(function (current) { + if (get.attitude(player, current) > 0) { + var es = target.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (current.canEquip(es[i])) return true; + } + return false; + } + }) + ) + return -att; + } + return 0; + } + if (att > 0) { + var es = ui.selected.targets[0].getCards("e"); + var i; + for (i = 0; i < es.length; i++) { + if (target.canEquip(es[i])) break; + } + if (i == es.length) return 0; + } + return -att * get.attitude(player, ui.selected.targets[0]); + }); + next.set("multitarget", true); + next.set("targetprompt", ["被移走", "移动目标"]); + next.set("prompt", prompt); + "step 1"; + if (result.bool) { + player.line2(result.targets, "green"); + event.targets = result.targets; + } else event.finish(); + "step 2"; + game.delay(); + "step 3"; + if (targets.length == 2) { + if (!event.ingame) { + var cards = targets[0].getEquips(2); + if (cards.length == 1) + event._result = { + bool: true, + links: cards, + }; + else { + player + .choosePlayerCard( + "e", + true, + function (button) { + return get.equipValue(button.link); + }, + targets[0] + ) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + if (!get.subtypes(button.link, false).includes("equip2")) return false; + var targets1 = _status.event.targets1; + return targets1.canEquip(button.link); + }); + } + } else { + player + .choosePlayerCard( + "e", + true, + function (button) { + return get.equipValue(button.link); + }, + targets[0] + ) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + var targets1 = _status.event.targets1; + return targets1.canEquip(button.link); + }); + } + } else event.finish(); + "step 4"; + if (result.bool && result.links.length) { + var link = result.links[0]; + if (get.position(link) == "e") event.targets[1].equip(link); + else if (link.viewAs) event.targets[1].addJudge({ name: link.viewAs }, [link]); + else event.targets[1].addJudge(link); + event.targets[0].$give(link, event.targets[1], false); + game.delay(); + } + }, + audio: true, + enable: "phaseUse", + usable: 1, + chooseButton: { + dialog: function () { + var list = ["wolong", "fengchu", "xuanjian", "shuijing"]; + for (var i = 0; i < list.length; i++) { + list[i] = ["", "", list[i] + "_card"]; + } + return ui.create.dialog("评才", [list, "vcard"]); + }, + check: function (button) { + var name = button.link[2]; + var player = _status.event.player; + if (name == "xuanjian_card") { + if ( + game.hasPlayer(function (current) { + return current.isDamaged() && current.hp < 3 && get.attitude(player, current) > 1; + }) + ) + return 1 + Math.random(); + else return 1; + } else if (name == "wolong_card") { + if ( + game.hasPlayer(function (current) { + return get.damageEffect(current, player, player, "fire") > 0; + }) + ) + return 1.2 + Math.random(); + else return 0.5; + } else return 0.6; + }, + backup: function (links, player) { + return { + audio: "xinfu_pingcai", + filterCard: () => false, + selectCard: -1, + takara: links[0][2], + content: lib.skill.xinfu_pingcai.contentx, + }; + }, + }, + contentx: function () { + "step 0"; + event.pingcai_delayed = true; + var name = lib.skill.xinfu_pingcai_backup.takara; + event.cardname = name; + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + game.pause(); + game.countChoose(); + event.timeout = setTimeout(function () { + _status.imchoosing = false; + event._result = { + bool: true, + }; + game.resume(); + }, 9000); + }; + var createDialog = function (player, id, name) { + if (player == game.me) return; + var dialog = ui.create.dialog("forcebutton", "hidden"); + var str = get.translation(player) + "正在擦拭宝物上的灰尘…"; + var canSkip = !_status.connectMode; + if (canSkip) str += "
    (点击宝物可以跳过等待AI操作)"; + dialog.textPrompt = dialog.add('
    ' + str + "
    "); + dialog.classList.add("fixed"); + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + dialog.classList.add("noupdate"); + dialog.videoId = id; + + var canvas2 = document.createElement("canvas"); + dialog.canvas_viewer = canvas2; + dialog.appendChild(canvas2); + canvas2.classList.add("grayscale"); + canvas2.style.position = "absolute"; + canvas2.style.width = "249px"; + canvas2.style.height = "249px"; + canvas2.style["border-radius"] = "6px"; + canvas2.style.left = "calc(50% - 125px)"; + canvas2.style.top = "calc(50% - 125px)"; + canvas2.width = 249; + canvas2.height = 249; + canvas2.style.border = "3px solid"; + + var ctx2 = canvas2.getContext("2d"); + var img = new Image(); + img.src = lib.assetURL + "image/card/" + name + ".png"; + img.onload = function () { + ctx2.drawImage(this, 0, 0, this.width, this.height, 0, 0, canvas2.width, canvas2.height); + }; + if (canSkip) { + var skip = function () { + if (event.pingcai_delayed) { + delete event.pingcai_delayed; + clearTimeout(event.timeout); + event._result = { + bool: true, + }; + game.resume(); + canvas2.removeEventListener(lib.config.touchscreen ? "touchend" : "click", skip); + } + }; + canvas2.addEventListener(lib.config.touchscreen ? "touchend" : "click", skip); + } + dialog.open(); + }; + var chooseButton = function (id, name) { + var event = _status.event; + _status.xinfu_pingcai_finished = false; + + var dialog = ui.create.dialog("forcebutton", "hidden"); + dialog.textPrompt = dialog.add('
    擦拭掉宝物上的灰尘吧!
    '); + event.switchToAuto = function () { + event._result = { + bool: _status.xinfu_pingcai_finished, + }; + game.resume(); + _status.imchoosing = false; + _status.xinfu_pingcai_finished = true; + }; + dialog.classList.add("fixed"); + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + dialog.classList.add("noupdate"); + dialog.videoId = id; + + var canvas = document.createElement("canvas"); + var canvas2 = document.createElement("canvas"); + + dialog.appendChild(canvas2); + dialog.appendChild(canvas); + + canvas.style.position = "absolute"; + canvas.style.width = "249px"; + canvas.style.height = "249px"; + canvas.style["border-radius"] = "6px"; + canvas.style.left = "calc(50% - 125px)"; + canvas.style.top = "calc(50% - 125px)"; + canvas.width = 249; + canvas.height = 249; + canvas.style.border = "3px solid"; + + canvas2.style.position = "absolute"; + canvas2.style.width = "249px"; + canvas2.style.height = "249px"; + canvas2.style["border-radius"] = "6px"; + canvas2.style.left = "calc(50% - 125px)"; + canvas2.style.top = "calc(50% - 125px)"; + canvas2.width = 249; + canvas2.height = 249; + canvas2.style.border = "3px solid"; + + var ctx = canvas.getContext("2d"); + var ctx2 = canvas2.getContext("2d"); + + var img = new Image(); + img.src = lib.assetURL + "image/card/" + name + ".png"; + img.onload = function () { + ctx2.drawImage(this, 0, 0, this.width, this.height, 0, 0, canvas2.width, canvas2.height); + }; + + ctx.fillStyle = "lightgray"; + ctx.fillRect(0, 0, canvas.width, canvas.height); + + canvas.onmousedown = function (ev) { + //if(_status.xinfu_pingcai_finished) return; + canvas.onmousemove = function (e) { + if (_status.xinfu_pingcai_finished) return; + ctx.beginPath(); + ctx.clearRect(e.offsetX - 16, e.offsetY - 16, 32, 32); + var data = ctx.getImageData(canvas.width * 0.1, canvas.height * 0.1, canvas.width * 0.8, canvas.height * 0.8).data; + var sum = 0; + for (var i = 3; i < data.length; i += 4) { + if (data[i] == 0) { + sum++; + } + } + if (sum >= canvas.width * canvas.height * 0.6) { + //ctx.clearRect(0,0,canvas.width,canvas.height); + if (!_status.xinfu_pingcai_finished) { + _status.xinfu_pingcai_finished = true; + event.switchToAuto(); + } + } + }; + }; + canvas.ontouchstart = function (ev) { + //if(_status.xinfu_pingcai_finished) return; + canvas.ontouchmove = function (e) { + if (_status.xinfu_pingcai_finished) return; + ctx.beginPath(); + var rect = canvas.getBoundingClientRect(); + var X = ((e.touches[0].clientX - rect.left) / rect.width) * canvas.width; + var Y = ((e.touches[0].clientY - rect.top) / rect.height) * canvas.height; + ctx.clearRect(X - 16, Y - 16, 32, 32); + var data = ctx.getImageData(canvas.width * 0.1, canvas.height * 0.1, canvas.width * 0.8, canvas.height * 0.8).data; + var sum = 0; + for (var i = 3; i < data.length; i += 4) { + if (data[i] == 0) { + sum++; + } + } + if (sum >= canvas.width * canvas.height * 0.6) { + if (!_status.xinfu_pingcai_finished) { + _status.xinfu_pingcai_finished = true; + event.switchToAuto(); + } + } + }; + }; + canvas.onmouseup = function (ev) { + canvas.onmousemove = null; + }; + canvas.ontouchend = function (ev) { + canvas.ontouchmove = null; + }; + + dialog.open(); + + game.pause(); + game.countChoose(); + }; + //event.switchToAuto=switchToAuto; + game.broadcastAll(createDialog, player, event.videoId, name); + if (event.isMine()) { + chooseButton(event.videoId, name); + } else if (event.isOnline()) { + event.player.send(chooseButton, event.videoId, name); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 1"; + var result = event.result || result; + if (!result) result = { bool: false }; + event._result = result; + game.broadcastAll( + function (id, result, player) { + _status.xinfu_pingcai_finished = true; + var dialog = get.idDialog(id); + if (dialog) { + dialog.textPrompt.innerHTML = '
    ' + (get.translation(player) + "擦拭宝物" + (result.bool ? "成功!" : "失败…")) + "
    "; + if (result.bool && dialog.canvas_viewer) dialog.canvas_viewer.classList.remove("grayscale"); + } + if (!_status.connectMode) delete event.pingcai_delayed; + }, + event.videoId, + result, + player + ); + game.delay(2.5); + "step 2"; + game.broadcastAll("closeDialog", event.videoId); + if (result.bool) { + player.logSkill("pcaudio_" + event.cardname); + event.insert(lib.skill.xinfu_pingcai[event.cardname], { + player: player, + }); + } + }, + ai: { + order: 7, + fireAttack: true, + threaten: 1.7, + result: { + player: 1, + }, + }, + }, + xinfu_pdgyingshi: { + mod: { + targetEnabled: function (card, player, target) { + if (get.type(card) == "delay") { + return false; + } + }, + }, + trigger: { + player: ["phaseZhunbeiBefore", "phaseJieshuBefore"], + }, + forced: true, + audio: 2, + group: "xinfu_pdgyingshi2", + content: function () { + trigger.cancel(); + game.log(player, "跳过了", event.triggername == "phaseZhunbeiBefore" ? "准备阶段" : "结束阶段"); + }, + }, + xinfu_pdgyingshi2: { + popup: false, + trigger: { + player: "phaseJudgeBefore", + }, + forced: true, + content: function () { + trigger.cancel(); + game.log(player, "跳过了判定阶段"); + }, + }, + pcaudio_wolong_card: { + audio: true, + }, + pcaudio_fengchu_card: { + audio: true, + }, + pcaudio_shuijing_card: { + audio: true, + }, + pcaudio_xuanjian_card: { + audio: true, + }, + yizan_use: { + audio: "yizan_respond_shan", + intro: { + content: "已发动过#次", + }, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if (get.type(name) != "basic") return false; + if (!player.storage.yizan && player.countCards("hes") < 2) return false; + return player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hs"); + }, + filter: function (event, player) { + if (!player.storage.yizan && player.countCards("hes") < 2) return false; + if ( + !player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hs") + ) + return false; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if (event.filterCard(get.autoViewAs({ name, nature }, "unsure"), player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) { + list.push(["基本", "", name]); + } + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if (event.filterCard(get.autoViewAs({ name, nature }, "unsure"), player, event)) list.push(["基本", "", "sha", nature]); + } + } + } + return ui.create.dialog("翊赞", [list, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + _status.event.getParent().type != "phase" || + game.hasPlayer(function (current) { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + switch (button.link[2]) { + case "tao": + case "shan": + return 5; + case "jiu": { + if (player.storage.yizan && player.countCards("hs", { type: "basic" }) > 2) return 3; + return 0; + } + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder" || button.link[3] == "ice") return 2.92; + else return 2.9; + } + } + return 0; + }, + backup: function (links, player) { + return { + audio: "yizan_respond_shan", + filterCard: function (card, player, target) { + if (player.storage.yizan) return get.type(card) == "basic"; + else if (ui.selected.cards.length) { + if (get.type(ui.selected.cards[0]) == "basic") return true; + return get.type(card) == "basic"; + } + return true; + }, + complexCard: true, + selectCard: function () { + var player = _status.event.player; + if (player.storage.yizan) return 1; + return 2; + }, + check: function (card, player, target) { + if (!ui.selected.cards.length && get.type(card) == "basic") return 6; + else return 6 - get.value(card); + }, + viewAs: { name: links[0][2], nature: links[0][3] }, + position: "hes", + popname: true, + precontent: function () { + player.addMark("yizan_use", 1, false); + }, + }; + }, + prompt: function (links, player) { + var str = player.storage.yizan ? "一张基本牌" : "两张牌(其中至少应有一张基本牌)"; + return "将" + str + "当做" + get.translation(links[0][3] || "") + get.translation(links[0][2]) + "使用或打出"; + }, + }, + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + if (event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0 && player.storage.yizan && player.countCards("hs", { type: "basic" }) > 2) { + return 3.3; + } + return 3.1; + }, + skillTagFilter: function (player, tag, arg) { + if (tag == "fireAttack") return true; + if (!player.storage.yizan && player.countCards("hes") < 2) return false; + if ( + !player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hes") + ) { + return false; + } + }, + result: { + player: 1, + }, + respondSha: true, + respondShan: true, + fireAttack: true, + }, + }, + yizan_respond_shan: { + audio: 2, + }, + xinfu_longyuan: { + audio: 2, + forced: true, + unique: true, + juexingji: true, + trigger: { + player: "phaseZhunbeiBegin", + }, + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { + return player.countMark("yizan_use") >= 3; + }, + content: function () { + player.awakenSkill("xinfu_longyuan"); + player.storage.yizan = true; + }, + derivation: "yizan_rewrite", + ai: { + combo: "yizan_use", + }, + }, + xinfu_jingxie: { + audio: 2, + video: function (player, info) { + var l2 = player.getCards(info[0] ? "e" : "h"), + l1 = info[1]; + for (var j = 0; j < l2.length; j++) { + if (l2[j].suit == l1[0] && l2[j].number == l1[1] && l2[j].name == l1[2]) { + l2[j].init([l2[j].suit, l2[j].number, "rewrite_" + l2[j].name]); + break; + } + } + }, + }, + xinfu_jingxie1: { + group: ["xinfu_jingxie2"], + position: "he", + audio: "xinfu_jingxie", + enable: "phaseUse", + filter: function (event, player) { + var he = player.getCards("he"); + for (var i = 0; i < he.length; i++) { + if (["bagua", "baiyin", "lanyinjia", "renwang", "tengjia", "zhuge"].includes(he[i].name)) return true; + } + return false; + }, + filterCard: function (card) { + return ["bagua", "baiyin", "lanyinjia", "renwang", "tengjia", "zhuge"].includes(card.name); + }, + discard: false, + lose: false, + delay: false, + check: function () { + return 1; + }, + content: function () { + "step 0"; + player.showCards(cards); + "step 1"; + var card = cards[0]; + var bool = get.position(card) == "e"; + if (bool) player.removeEquipTrigger(card); + game.addVideo("skill", player, ["xinfu_jingxie", [bool, get.cardInfo(card)]]); + game.broadcastAll(function (card) { + card.init([card.suit, card.number, "rewrite_" + card.name]); + }, card); + if (bool) { + var info = get.info(card); + if (info.skills) { + for (var i = 0; i < info.skills.length; i++) { + player.addSkillTrigger(info.skills[i]); + } + } + } + }, + ai: { + basic: { + order: 10, + }, + result: { + player: 1, + }, + }, + }, + xinfu_jingxie2: { + prompt: "重铸一张防具牌,然后将体力回复至1点。", + audio: "xinfu_jingxie", + enable: "chooseToUse", + filterCard: (card, player) => get.subtype(card) == "equip2" && player.canRecast(card), + filter: (event, player) => { + if (event.type != "dying") return false; + if (player != event.dying) return false; + return player.hasCard(card => lib.skill.xinfu_jingxie2.filterCard(card, player), "he"); + }, + position: "he", + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.recast(cards); + "step 1"; + var num = 1 - player.hp; + if (num) player.recover(num); + }, + ai: { + order: 0.5, + skillTagFilter: function (player, arg, target) { + if (player != target) return false; + return player.hasCard(card => (_status.connectMode && get.position(card) == "h") || (get.subtype(card) == "equip2" && player.canRecast(card)), "he"); + }, + save: true, + result: { + player: function (player) { + return 10; + }, + }, + }, + }, + xinfu_qiaosi: { + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + if (get.isLuckyStar(player)) { + event.num = 6; + player.throwDice(6); + } else player.throwDice(); + "step 1"; + event.cards = get.cards(event.num); + player.showCards(event.cards); + "step 2"; + player.gain(event.cards, "gain2"); + player + .chooseControl() + .set("choiceList", ["将" + get.cnNumber(event.num) + "张牌交给一名其他角色", "弃置" + get.cnNumber(event.num) + "张牌"]) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 2; + }) + ) + return 0; + return 1; + }); + "step 3"; + if (result.index == 0) { + player.chooseCardTarget({ + position: "he", + filterCard: true, + selectCard: event.num, + filterTarget: function (card, player, target) { + return player != target; + }, + ai1: function (card) { + return 1; + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + return att; + }, + prompt: "请选择要送人的卡牌", + forced: true, + }); + } else { + player.chooseToDiscard(event.num, true, "he"); + event.finish(); + } + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.give(result.cards, target); + } + }, + ai: { + order: 7.5, + result: { + player: 1, + }, + }, + }, + zhaohuo: { + audio: 2, + audioname: ["re_taoqian"], + trigger: { global: "dying" }, + forced: true, + //priority:12, + filter: function (event, player) { + return event.player != player && player.maxHp > 1; + }, + content: function () { + "step 0"; + event.num = player.maxHp - 1; + player.loseMaxHp(event.num, true); + "step 1"; + player.draw(event.num); + }, + ai: { + halfneg: true, + }, + }, + yixiang: { + audio: 2, + audioname: ["re_taoqian"], + trigger: { target: "useCardToTargeted" }, + frequent: true, + filter: function (event, player) { + if (event.player.hp <= player.hp) return false; + //if(event.targets.length>1) return false; + var hs = player.getCards("h"); + var names = ["sha", "shan", "tao", "jiu", "du"]; + for (var i = 0; i < hs.length; i++) { + names.remove(hs[i].name); + } + if (!names.length) return false; + for (var i = 0; i < ui.cardPile.childElementCount; i++) { + if (names.includes(ui.cardPile.childNodes[i].name)) { + return true; + } + } + return false; + }, + usable: 1, + content: function () { + var hs = player.getCards("h"); + var list = []; + var names = ["sha", "shan", "tao", "jiu", "du"]; + for (var i = 0; i < hs.length; i++) { + names.remove(hs[i].name); + } + for (var i = 0; i < ui.cardPile.childElementCount; i++) { + if (names.includes(ui.cardPile.childNodes[i].name)) { + list.push(ui.cardPile.childNodes[i]); + } + } + if (list.length) { + player.gain(list.randomGet(), "draw"); + } + }, + }, + yirang: { + audio: 2, + audioname: ["re_taoqian"], + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + if ( + !player.countCards("he", function (card) { + return get.type(card) != "basic"; + }) + ) { + return false; + } + return game.hasPlayer(function (current) { + return current.maxHp > player.maxHp; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yirang"), function (card, player, target) { + return target.maxHp > player.maxHp; + }) + .set("ai", function (target) { + return (get.attitude(_status.event.player, target) - 2) * target.maxHp; + }); + "step 1"; + if (result.bool) { + var cards = player.getCards("he", function (card) { + return get.type(card) != "basic"; + }); + var target = result.targets[0]; + var types = []; + for (var i = 0; i < cards.length; i++) { + types.add(get.type(cards[i], "trick")); + } + player.logSkill("yirang", target); + player.give(cards, target); + player.gainMaxHp(target.maxHp - player.maxHp, true); + player.recover(types.length); + game.delay(); + } + }, + }, + kuangcai: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return !event.player.isMad(); + }, + content: function () { + game.broadcastAll(function (player) { + player.forceCountChoose = { phaseUse: 5 }; + }, player); + player.addSkill("kuangcai_use"); + player.addSkill("kuangcai_cancel"); + //ui.auto.hide(); + }, + subSkill: { + use: { + mod: { + cardUsable: function (card) { + if (get.info(card) && get.info(card).forceUsable) return; + return Infinity; + }, + targetInRange: function () { + return true; + }, + aiOrder: function (player, card, num) { + var name = get.name(card); + if (name == "tao") return num + 7 + Math.pow(player.getDamagedHp(), 2); + if (name == "sha") return num + 6; + if (get.subtype(card) == "equip2") return num + get.value(card) / 3; + }, + }, + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + silent: true, + popup: false, + filter: function (event, player) { + if (!player.forceCountChoose || !player.forceCountChoose.phaseUse) { + return false; + } + return true; + }, + content: function () { + player.draw(); + if (player.forceCountChoose.phaseUse == 1) { + var evt = event.getParent("phaseUse"); + if (evt) evt.skipped = true; + } else + game.broadcastAll(function (player) { + player.forceCountChoose.phaseUse--; + }, player); + }, + }, + cancel: { + trigger: { player: "phaseUseEnd" }, + firstDo: true, + silent: true, + charlotte: true, + content: function () { + game.broadcastAll(function (player) { + delete player.forceCountChoose; + }, player); + //ui.auto.show(); + player.removeSkill("kuangcai_use"); + player.removeSkill("kuangcai_cancel"); + }, + }, + }, + ai: { + threaten: 4.5, + }, + }, + shejian: { + audio: 2, + trigger: { player: "phaseDiscardEnd" }, + direct: true, + filter: function (event, player) { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) cards.addArray(evt.cards2); + }); + if (cards) { + if (cards.length < 2) return false; + var suits = []; + for (var i = 0; i < cards.length; i++) { + var suit = get.suit(cards[i]); + if (suits.includes(suit)) { + return false; + } else { + suits.push(suit); + } + } + return true; + } + return false; + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("shejian"), "弃置一名其他角色的一张牌", function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he") > 0; + }).ai = function (target) { + return -get.attitude(player, target); + }; + "step 1"; + if (result.bool) { + player.logSkill("shejian", result.targets); + player.discardPlayerCard(result.targets[0], "he", true); + } else { + event.finish(); + } + }, + }, + shixin: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter: function (event) { + return event.hasNature("fire"); + }, + forced: true, + content: function () { + trigger.cancel(); + }, + ai: { + nofire: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "fireDamage")) return "zerotarget"; + }, + }, + }, + }, + fenyin: { + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (typeof card == "object" && player == _status.currentPhase) { + var evt = player.getLastUsed(); + if (evt && evt.card && get.color(evt.card) != "none" && get.color(card) != "none" && get.color(evt.card) != get.color(card)) { + return num + 10; + } + } + }, + }, + audio: 2, + trigger: { player: "useCard" }, + frequent: true, + //usable:3, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + var evt = player.getLastUsed(1); + if (!evt) return false; + var color1 = get.color(evt.card); + var color2 = get.color(event.card); + return color1 && color2 && color1 != "none" && color2 != "none" && color1 != color2; + }, + content: function () { + player.draw(); + }, + ai: { + threaten: 3, + }, + }, + dujin: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + preHidden: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num += 1 + Math.ceil(player.countCards("e") / 2); + }, + }, + yingjian: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + audio: "qingyi", + content: function () { + player.chooseUseTarget("###是否发动【影箭】?###视为使用一张没有距离限制的【杀】", { name: "sha" }, false, "nodistance").logSkill = "yingjian"; + }, + ai: { + threaten: function (player, target) { + return 1.6; + }, + }, + }, + tunchu: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + preHidden: true, + locked: false, + filter: function (event, player) { + if (event.numFixed || player.getExpansions("tunchu").length) return false; + return true; + }, + content: function () { + trigger.num += 2; + player.addTempSkill("tunchu_choose", "phaseDrawAfter"); + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + mod: { + cardEnabled: function (card, player) { + if (player.getExpansions("tunchu").length && card.name == "sha") { + return false; + } + }, + }, + subSkill: { + choose: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; + player.removeSkill("tunchu_choose"); + var nh = player.countCards("h"); + if (nh) { + player.chooseCard("h", [1, nh], "将任意张手牌置于你的武将牌上").set("ai", function (card) { + var player = _status.event.player; + var count = game.countPlayer(function (current) { + return get.attitude(player, current) > 2 && current.hp - current.countCards("h") > 1; + }); + if (ui.selected.cards.length >= count) return -get.value(card); + return 5 - get.value(card); + }); + } else { + event.finish(); + } + "step 1"; + if (result.bool) { + player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("tunchu"); + } + }, + }, + }, + }, + shuliang: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("tunchu").length > 0 && event.player.countCards("h") < event.player.hp && event.player.isIn(); + }, + content: function () { + "step 0"; + var goon = get.attitude(player, trigger.player) > 0; + player + .chooseCardButton(get.prompt("shuliang", trigger.player), player.getExpansions("tunchu")) + .set("ai", function () { + if (_status.event.goon) return 1; + return 0; + }) + .set("goon", goon); + "step 1"; + if (result.bool) { + player.logSkill("shuliang", trigger.player); + player.loseToDiscardpile(result.links); + trigger.player.draw(2); + } + }, + ai: { combo: "tunchu" }, + }, + choulve: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he"); + }); + }, + content: function () { + "step 0"; + var str = "令一名其他角色交给你一张牌"; + var history = player.getAllHistory("damage", function (evt) { + return evt.card && evt.card.name && lib.card[evt.card.name]; + }); + if (history.length) event.cardname = history[history.length - 1].card.name; + if (event.cardname) { + str += "若其如此做,视为你使用【" + get.translation(event.cardname) + "】"; + } + var goon = true; + if (event.cardname) { + goon = game.hasPlayer(function (current) { + return player.canUse(event.cardname, current) && get.effect(current, { name: event.cardname }, player, player) > 0; + }); + } + player + .chooseTarget(get.prompt("choulve"), str, function (card, player, target) { + return target != player && target.countCards("he"); + }) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + var player = _status.event.player; + if (get.attitude(player, target) >= 0 && get.attitude(target, player) >= 0) { + return Math.sqrt(target.countCards("he")); + } + return 0; + }) + .set("goon", goon); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("choulve", target); + target + .chooseCard("he", "是否交给" + get.translation(player) + "一张牌?", event.cardname ? "若如此做,视为" + get.translation(player) + "使用【" + get.translation(event.cardname) + "】" : null) + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) > 1); + event.target = target; + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + event.target.give(result.cards, player); + if (event.cardname) { + player.chooseUseTarget(event.cardname, true, false); + } + } + }, + }, + polu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + if (!lib.inpile.includes("ly_piliche")) return true; + return !!get.cardPile(function (card) { + return card.name == "ly_piliche"; + }); + }, + content: function () { + var card; + if (!lib.inpile.includes("ly_piliche")) { + card = game.createCard2("ly_piliche", "diamond", 1); + lib.inpile.push("ly_piliche"); + } else + card = get.cardPile(function (card) { + return card.name == "ly_piliche"; + }); + player.chooseUseTarget(card, true, "nopopup"); + }, + group: "polu_damage", + subSkill: { + damage: { + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return !player.getEquips("ly_piliche").length; + }, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + player.draw(); + "step 2"; + var card = get.cardPile2(function (card) { + return get.subtype(card, false) == "equip1" && player.canUse(card, player); + }); + if (card) player.chooseUseTarget(card, true, "nopopup"); + "step 3"; + if (event.count > 0 && !player.getEquips("ly_piliche").length) event.goto(1); + }, + }, + }, + }, + ly_piliche: { + trigger: { source: "damageSource" }, + check: function (event, player) { + return get.attitude(player, event.player) * get.value(event.player.getDiscardableCards(player, "e"), event.player) <= 0; + }, + filter: function (event, player) { + return player != event.player && event.player.countDiscardableCards(player, "e") > 0; + }, + logTarget: "player", + content: function () { + player.discardPlayerCard(trigger.player, "e", true, trigger.player.countCards("e")); + }, + }, + xinzhilve: { + enable: "phaseUse", + audio: "zhilve", + usable: 1, + chooseButton: { + dialog: function (event, player) { + var list = ["移动场上的一张牌", "摸一张牌并视为使用一张【杀】"]; + var choiceList = ui.create.dialog("知略:失去1点体力并...", "forcebutton", "hidden"); + choiceList.add([ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ]); + return choiceList; + }, + filter: function (button, player) { + if (button.link == 0) return player.canMoveCard(); + return player.hasUseTarget({ name: "sha", isCard: true }, false); + }, + check: function (button) { + return button.link; + }, + backup: function (links) { + return lib.skill["xinzhilve_" + ["move", "use"][links[0]]]; + }, + prompt: function () { + return "请选择【杀】的目标"; + }, + }, + ai: { + order: function (item, player) { + return get.order({ name: "sha" }) + 0.1; + }, + result: { + player: function (player) { + if (player.hp > 2 && player.hasValueTarget({ name: "sha" })) return 1; + return 0; + }, + }, + }, + }, + xinzhilve_move: { + audio: "zhilve", + filterCard: function () { + return false; + }, + selectCard: -1, + delay: false, + content: function () { + "step 0"; + event.forceDie = true; + if (!player.canMoveCard(null, event.nojudge)) { + event.finish(); + return; + } + var next = player.chooseTarget(2, function (card, player, target) { + if (ui.selected.targets.length) { + var from = ui.selected.targets[0]; + var js = from.getCards("j"); + for (var i = 0; i < js.length; i++) { + if (_status.event.nojudge) break; + if (target.canAddJudge(js[i])) return true; + } + if (target.isMin()) return false; + var es = from.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (target.canEquip(es[i])) return true; + } + return false; + } else { + var range = "ej"; + if (_status.event.nojudge) range = "e"; + return target.countCards(range) > 0; + } + }); + next.set("nojudge", event.nojudge || false); + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var sgnatt = get.sgn(att); + if (ui.selected.targets.length == 0) { + if (att > 0) { + if ( + !_status.event.nojudge && + target.countCards("j", function (card) { + return game.hasPlayer(function (current) { + return current.canAddJudge(card) && get.attitude(player, current) < 0; + }); + }) + ) + return 14; + if ( + target.countCards("e", function (card) { + return ( + get.value(card, target) < 0 && + game.hasPlayer(function (current) { + return current != target && get.attitude(player, current) < 0 && current.canEquip(card); + }) + ); + }) > 0 + ) + return 9; + } else if (att < 0) { + if ( + game.hasPlayer(function (current) { + if (current != target && get.attitude(player, current) > 0) { + var es = target.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (get.value(es[i], target) > 0 && current.canEquip(es[i]) && get.value(es[i], current) > 0) return true; + } + } + }) + ) { + return -att; + } + } + return 0; + } + var es = ui.selected.targets[0].getCards("e"); + var i; + var att2 = get.sgn(get.attitude(player, ui.selected.targets[0])); + for (i = 0; i < es.length; i++) { + if (sgnatt != 0 && att2 != 0 && get.sgn(get.value(es[i], ui.selected.targets[0])) == -att2 && get.sgn(get.value(es[i], target)) == sgnatt && target.canEquip(es[i])) { + return Math.abs(att); + } + } + if ( + i == es.length && + (_status.event.nojudge || + !ui.selected.targets[0].countCards("j", function (card) { + return target.canAddJudge(card); + })) + ) { + return 0; + } + return -att * get.attitude(player, ui.selected.targets[0]); + }); + next.set("multitarget", true); + next.set("targetprompt", _status.event.targetprompt || ["被移走", "移动目标"]); + next.set("prompt", event.prompt || "移动场上的一张牌"); + if (event.prompt2) next.set("prompt2", event.prompt2); + if (event.forced) next.set("forced", true); + "step 1"; + event.result = result; + if (result.bool) { + player.line2(result.targets, "green"); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + game.delay(); + "step 3"; + if (targets.length == 2) { + player + .choosePlayerCard( + "ej", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if (get.attitude(player, targets0) > 0 && get.attitude(player, targets1) < 0) { + if (get.position(button.link) == "j") return 12; + if (get.value(button.link, targets0) < 0) return 10; + return 0; + } else { + if (get.position(button.link) == "j") return -10; + return get.equipValue(button.link); + } + }, + targets[0] + ) + .set("nojudge", event.nojudge || false) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + var targets1 = _status.event.targets1; + if (get.position(button.link) == "j") { + if (_status.event.nojudge) return false; + return targets1.canAddJudge(button.link); + } else { + return targets1.canEquip(button.link); + } + }); + } else { + event.finish(); + } + "step 4"; + if (result.bool && result.links.length) { + player.loseHp(); + } + "step 5"; + if (result.bool && result.links.length) { + var link = result.links[0]; + if (get.position(link) == "e") { + event.targets[1].equip(link); + } else if (link.viewAs) { + event.targets[1].addJudge({ name: link.viewAs }, [link]); + } else { + event.targets[1].addJudge(link); + } + event.targets[0].$give(link, event.targets[1]); + event.result.card = link; + event.result.position = get.position(link); + game.delay(); + player.addTempSkill("xinzhilve_mark"); + player.addMark("xinzhilve_mark", 1, false); + } + }, + }, + xinzhilve_use: { + audio: "zhilve", + filterCard: function () { + return false; + }, + selectCard: -1, + filterTarget: function (card, player, target) { + return player.canUse({ name: "sha", isCard: true }, target, false); + }, + content: function () { + player.loseHp(); + player.draw(); + player.useCard({ name: "sha", isCard: true }, false, target).forceDie = true; + player.addTempSkill("xinzhilve_mark"); + player.addMark("xinzhilve_mark", 1, false); + }, + ai: { + result: { + target: function (player, target) { + return get.effect(target, { name: "sha" }, player, target); + }, + }, + }, + }, + xinzhilve_mark: { + intro: { content: "本回合手牌上限+#" }, + onremove: true, + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("xinzhilve_mark"); + }, + }, + }, + xinxhzhiyan: { + audio: "xhzhiyan", + enable: "phaseUse", + filter: function (event, player) { + return (!player.hasSkill("xinxhzhiyan_true") && player.countCards("h") > player.hp) || (!player.hasSkill("xinxhzhiyan_false") && player.countCards("h") < player.maxHp); + }, + filterCard: true, + selectCard: function () { + var player = _status.event.player; + if (player.hasSkill("xinxhzhiyan_true")) return 0; + var num = Math.max(0, player.countCards("h") - player.hp); + if (ui.selected.cards.length || player.hasSkill("xinxhzhiyan_false") || player.countCards("h") >= player.maxHp) return [num, num]; + return [0, num]; + }, + filterTarget: lib.filter.notMe, + selectTarget: function () { + if (ui.selected.cards.length) return [1, 1]; + return [0, 0]; + }, + check: function (card) { + var player = _status.event.player; + var checkx = function (card) { + if ( + player.getUseValue(card, null, true) <= 0 && + game.hasPlayer(function (current) { + return current != player && get.value(card, current) > 0 && get.attitude(player, current) > 0; + }) + ) + return 2; + return 1; + }; + if ( + player.countCards("h", function (card) { + return checkx(card) > 0; + }) < + player.countCards("h") - player.hp + ) + return 0; + return checkx(card); + }, + delay: false, + discard: false, + lose: false, + content: function () { + var bool = cards && cards.length > 0; + player.addTempSkill("xinxhzhiyan_" + bool, "phaseUseEnd"); + if (!bool) { + player.draw(player.maxHp - player.countCards("h")); + } else { + player.give(cards, target); + } + }, + ai: { + order: function (obj, player) { + if (player.countCards("h") > player.hp) return 10; + return 0.5; + }, + result: { + player: function (player, target) { + if (!ui.selected.cards.length && player.countCards("h") < player.maxHp) return 1; + return 0; + }, + target: 1, + }, + }, + }, + xinxhzhiyan_true: {}, + xinxhzhiyan_false: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target && (!get.info(card) || !get.info(card).singleCard || !ui.selected.targets.length)) return false; + }, + }, + mark: true, + intro: { + content: "不能对其他角色使用牌", + }, + }, + weifeng: { + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + filter: function (event, player) { + if ( + !event.targets || + !event.targets.filter(function (target) { + return target != player && !target.storage.weifeng2; + }).length + ) + return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + if (!get.tag(event.card, "damage")) return false; + if (!["basic", "trick"].includes(get.type(event.card))) return false; + return ( + player + .getHistory("useCard", function (ev) { + return ev.getParent("phaseUse") == evt && get.tag(ev.card, "damage") && ["basic", "trick"].includes(get.type(ev.card)); + }) + .indexOf(event) == 0 && + game.hasPlayer(function (current) { + return current != player && !current.storage.weifeng2 && event.targets.includes(current); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(true, "威风:请选择一个目标,令其获得一个【惧(" + get.translation(trigger.card.name) + ")】标记", function (card, player, target) { + return player != target && !target.storage.weifeng2 && _status.event.getTrigger().targets.includes(target); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + target.storage.weifeng2 = trigger.card.name; + player.line(target, "green"); + game.log(target, "获得了一个", "#g【惧(" + get.translation(trigger.card.name) + ")】", "标记"); + target.markSkill("weifeng2"); + player.addSkill("weifeng3"); + } + }, + }, + weifeng2: { + intro: { + content: "当前“惧”标记名称:$", + onunmark: function (storage, player) { + if (player.storage.weifeng2) { + game.log(player, "移去了一个", "#g【惧(" + get.translation(player.storage.weifeng2) + ")】", "标记"); + delete player.storage.weifeng2; + } + }, + }, + marktext: "惧", + }, + weifeng3: { + trigger: { + global: "damageBegin3", + player: ["phaseZhunbeiBegin", "dieBegin"], + }, + forced: true, + popup: false, + filter: function (event, player) { + if (event.name != "damage") return true; + return event.player != player && typeof event.player.storage.weifeng2 == "string"; + }, + content: function () { + if (trigger.name == "damage") { + player.logSkill("weifeng", trigger.player); + if (trigger.card && trigger.card.name == trigger.player.storage.weifeng2) trigger.num++; + else if (trigger.player.countGainableCards(player, "he") > 0) player.gainPlayerCard(trigger.player, "he", true); + trigger.player.unmarkSkill("weifeng2"); + } else { + game.countPlayer(function (current) { + if (current.storage.weifeng2) current.unmarkSkill("weifeng2"); + }); + player.removeSkill("weifeng3"); + } + }, + }, + gnjinfan: { + trigger: { player: "phaseDiscardBegin" }, + direct: true, + locked: false, + audio: 2, + filter: function (event, player) { + var list = []; + player.getCards("s", function (card) { + if (card.hasGaintag("gnjinfan")) list.add(get.suit(card)); + }); + if (list.length >= lib.suit.length) return false; + return ( + player.countCards("h", function (card) { + return _status.connectMode || !list.includes(get.suit(card)); + }) > 0 + ); + }, + content: function () { + "step 0"; + player + .chooseCard( + "h", + get.prompt("gnjinfan"), + "将任意张手牌当做“铃”置于武将牌上", + [ + 1, + (function () { + var list = []; + var list2 = []; + player.getCards("s", function (card) { + if (card.hasGaintag("gnjinfan")) list.add(get.suit(card)); + }); + player.getCards("h", function (card) { + list2.add(get.suit(card)); + }); + list2.removeArray(list); + return Math.max(1, list2.length); + })(), + ], + function (card, player) { + return ( + !player.countCards("s", function (cardx) { + return cardx.hasGaintag("gnjinfan") && get.suit(cardx, false) == get.suit(card, player); + }) && + !ui.selected.cards.filter(function (cardx) { + return get.suit(cardx, player) == get.suit(card, player); + }).length + ); + } + ) + .set("ai", function (card) { + var player = _status.event.player; + if (player.hasUseTarget(card) && !player.hasValueTarget(card)) return 0; + if (["sha", "shan", "wuxie", "caochuan"].includes(card.name)) return 2 + Math.random(); + return 1 + Math.random(); + }) + .set("complexCard", true); + "step 1"; + if (result.bool) { + player.logSkill("gnjinfan"); + game.log(player, "将", result.cards, "放到了武将牌上"); + player.loseToSpecial(result.cards, "gnjinfan").visible = true; + } else event.finish(); + "step 2"; + player.markSkill("gnjinfan"); + }, + group: ["gnjinfan_gain"], + marktext: "铃", + intro: { + mark: function (dialog, storage, player) { + dialog.addAuto( + player.getCards("s", function (card) { + return card.hasGaintag("gnjinfan"); + }) + ); + }, + markcount: function (storage, player) { + return player.getCards("s", function (card) { + return card.hasGaintag("gnjinfan"); + }).length; + }, + onunmark: function (storage, player) { + var cards = player.getCards("s", function (card) { + return card.hasGaintag("gnjinfan"); + }); + if (cards.length) { + player.lose(cards, ui.discardPile); + player.$throw(cards, 1000); + game.log(cards, "进入了弃牌堆"); + } + }, + }, + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("gnjinfan")) return num + 0.5; + }, + }, + }, + gnjinfan_gain: { + audio: "gnjinfan", + trigger: { player: "loseAfter" }, + forced: true, + filter: function (event, player) { + if (!event.ss || !event.ss.length) return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("gnjinfan")) return true; + return false; + } + }, + content: function () { + "step 0"; + var cards = []; + for (var i of trigger.ss) { + if (!trigger.gaintag_map[i.cardid] || !trigger.gaintag_map[i.cardid].includes("gnjinfan")) continue; + var suit = get.suit(i, false); + var card = get.cardPile2(function (card) { + return !cards.includes(card) && get.suit(card, false) == suit; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + var num = player.getCards("s", function (card) { + return card.hasGaintag("gnjinfan"); + }).length; + if (num) player.markSkill("gnjinfan"); + else player.unmarkSkill("gnjinfan"); + "step 1"; + game.updateRoundNumber(); + }, + }, + gnsheque: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return event.player.isIn() && event.player.countCards("e") > 0 && lib.filter.targetEnabled({ name: "sha" }, player, event.player) && (player.hasSha() || (_status.connectMode && player.countCards("h") > 0)); + }, + content: function () { + player + .chooseToUse( + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + "射却:是否对" + get.translation(trigger.player) + "使用一张杀?" + ) + .set("logSkill", "gnsheque") + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", trigger.player) + .set("oncard", function (card) { + try { + card.gnsheque_tag = true; + } catch (e) { + alert("发生了一个导致【射却】无法正常触发无视防具效果的错误。请关闭十周年UI/手杀ui等扩展以解决"); + } + }); + }, + ai: { + unequip: true, + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "unequip_ai") { + if (_status.event.getParent().name != "gnsheque") return false; + } else if (!arg || !arg.card || !arg.card.gnsheque_tag) return false; + }, + }, + }, + _doublegroup_choice: { + trigger: { + global: "gameStart", + player: "enterGame", + }, + forced: true, + charlotte: true, + firstDo: true, + popup: false, + filter: function (event, player) { + return get.mode() != "guozhan" && get.is.double(player.name1) && !player._groupChosen; + }, + content: function () { + "step 0"; + player._groupChosen = true; + player.chooseControl(get.is.double(player.name1, true)).set("prompt", "请选择你的势力"); + "step 1"; + player.changeGroup(result.control); + }, + }, +}; + +export default skills; diff --git a/character/mobile/sort.js b/character/mobile/sort.js new file mode 100644 index 000000000..984f8ac2b --- /dev/null +++ b/character/mobile/sort.js @@ -0,0 +1,41 @@ +const characterSort = { + mobile_default: ["mb_sp_guanqiujian", "mb_caomao", "chengji", "lizhaojiaobo", "xin_huojun", "muludawang", "mb_chengui", "mb_huban", "mb_xianglang", "yanxiang", "xin_wuban", "laimin", "baoxin", "jiangji", "liwei", "xin_guozhao", "miheng", "taoqian", "lingcao", "sunru", "lifeng", "zhuling", "liuye", "zhaotongzhaoguang", "majun", "simazhao", "wangyuanji", "pangdegong", "shenpei", "hujinding", "zhangyì", "jiakui", "yangbiao", "chendeng", "dongcheng", "yangyi", "dengzhi", "zhengxuan", "sp_sufei", "furong", "dingyuan", "simashi", "yanghuiyu", "hucheer", "gongsunkang", "nanhualaoxian", "zhouqun", "qiaozhou", "fuqian", "simafu", "mayuanyi", "yanpu", "sunhanhua", "sp_maojie", "peixiu", "sp_jianggan", "ruanhui", "xin_mamidi", "sp_caosong", "yangfu", "wangjun", "sp_pengyang", "qianzhao", "shichangshi", "yangfeng"], + mobile_yijiang: ["yj_zhanghe", "yj_zhangliao", "yj_xuhuang", "yj_ganning", "yj_huangzhong", "yj_weiyan", "yj_zhoubuyi"], + mobile_standard: ["xin_xiahoudun", "xin_zhangfei"], + mobile_shenhua_feng: ["re_xiaoqiao", "xin_zhoutai"], + mobile_shenhua_huo: ["re_pangtong", "re_sp_zhugeliang", "re_xunyu", "re_dianwei", "re_yanwen", "xin_yuanshao"], + mobile_shenhua_lin: ["re_dongzhuo", "re_sunjian", "re_zhurong"], + mobile_shenhua_shan: ["re_liushan", "re_dengai", "re_jiangwei", "re_caiwenji", "re_zhangzhang", "re_sunben"], + mobile_shenhua_yin: ["xin_sunliang"], + mobile_shenhua_lei: ["re_guanqiujian"], + mobile_yijiang1: ["re_xusheng", "re_lingtong", "ol_yujin", "re_wuguotai", "re_gaoshun", "re_caozhi"], + mobile_yijiang2: ["xin_liaohua", "xin_caozhang", "re_liubiao", "re_handang", "xin_chengpu", "xin_gongsunzan", "re_zhonghui", "re_bulianshi"], + mobile_yijiang3: ["re_liru", "xin_jianyong", "xin_zhuran", "xin_guohuai", "xin_panzhangmazhong", "xin_fuhuanghou", "re_yufan"], + mobile_yijiang4: ["xin_zhoucang", "xin_caifuren", "xin_guyong", "xin_sunluban", "xin_caozhen", "xin_jushou", "xin_wuyi", "xin_zhuhuan", "re_chenqun"], + mobile_yijiang5: ["xin_zhangyi", "xin_sunxiu", "xin_quancong", "xin_zhuzhi", "xin_caoxiu"], + mobile_yijiang67: ["re_jikang"], + mobile_changshi: ["scs_zhangrang", "scs_zhaozhong", "scs_sunzhang", "scs_bilan", "scs_xiayun", "scs_hankui", "scs_lisong", "scs_duangui", "scs_guosheng", "scs_gaowang"], + mobile_sp: ["old_yuanshu", "re_wangyun", "re_baosanniang", "re_weiwenzhugezhi", "re_zhanggong", "re_xugong", "re_heqi", "liuzan", "xin_hansui", "mb_sunluyu"], +}; + +const characterSortTranslate = { + mobile_standard: "手杀异构·标准包", + mobile_shenhua_feng: "手杀异构·其疾如风", + mobile_shenhua_huo: "手杀异构·侵掠如火", + mobile_shenhua_lin: "手杀异构·其徐如林", + mobile_shenhua_shan: "手杀异构·不动如山", + mobile_shenhua_yin: "手杀异构·难知如阴", + mobile_shenhua_lei: "手杀异构·动如雷霆", + mobile_yijiang1: "手杀异构·将1", + mobile_yijiang2: "手杀异构·将2", + mobile_yijiang3: "手杀异构·将3", + mobile_yijiang4: "手杀异构·将4", + mobile_yijiang5: "手杀异构·将5", + mobile_yijiang67: "手杀异构·原创设计", + mobile_sp: "手杀异构·SP", + mobile_default: "袖里乾坤", + mobile_others: "其他", + mobile_changshi: "十常侍单体", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/mobile/translate.js b/character/mobile/translate.js new file mode 100644 index 000000000..6d1e530fe --- /dev/null +++ b/character/mobile/translate.js @@ -0,0 +1,899 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const translates = { + liuzan: "手杀留赞", + liuzan_prefix: "手杀", + re_sp_zhugeliang: "手杀界卧龙", + re_sp_zhugeliang_prefix: "手杀界", + ly_piliche: "霹雳车", + ly_piliche_info: "当你对其他角色造成伤害后,你可以弃置其装备区内的所有牌。", + polu: "破橹", + polu_info: "锁定技,回合开始时,若【霹雳车】未加入游戏或在牌堆/弃牌堆内,则你使用之;当你受到1点伤害后,若你的装备区里没有【霹雳车】,则你摸一张牌并使用牌堆中的一张随机武器牌。", + choulve: "筹略", + choulve_info: "出牌阶段开始时,你可以令一名其他角色交给你一张牌,若其如此做,视为你使用上一张对你过造成伤害且不为延时锦囊牌的牌。", + tunchu: "屯储", + tunchu_info: "摸牌阶段,若你没有「粮」,你可以多摸两张牌。若如此做,摸牌阶段结束时,你可以将任意张手牌置于你的武将上,称为「粮」,只要你的武将牌上有「粮」,你便不能使用【杀】。", + shuliang: "输粮", + shuliang_info: "一名角色的结束阶段开始时,若其手牌数少于体力值,你可以移去一张「粮」,然后该角色摸两张牌。", + fenyin: "奋音", + yingjian: "影箭", + fenyin_info: "你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。", + yingjian_info: "准备阶段开始时,你可以视为使用一张无距离限制的【杀】。", + dujin: "独进", + dujin_info: "摸牌阶段,你可以多摸X+1张牌(X为你装备区里牌数的一半且向上取整)。", + shixin: "释衅", + shixin_info: "锁定技,当你受到火属性伤害时,你防止此伤害。", + zhaohuo: "招祸", + zhaohuo_info: "锁定技,当其他角色进入濒死状态时,你将体力上限调整为1点。若你的体力上限因此减少,则你摸X张牌。(X为你以此法减少的体力上限)", + yixiang: "义襄", + yixiang_info: "每名角色的回合限一次,当你成为一名角色使用牌的目标后,若该角色的体力值大于你的体力值,你可以随机获得牌堆里的一张你没有的基本牌。", + yirang: "揖让", + yirang_info: "出牌阶段开始时,你可以将所有非基本牌交给一名体力上限大于你的其他角色,然后调整体力上限至与该角色相同并回复X点体力(X为你以此法交给其的牌的类别数)。", + kuangcai: "狂才", + kuangcai_info: "出牌阶段开始时,你可以令你此阶段内的主动出牌时间变为5秒。若如此做,你于此阶段内使用牌没距离和次数限制,且每当你于此阶段内使用牌时,你摸一张牌且主动出牌时间-1秒。若主动出牌时间减至0,则你结束出牌阶段。", + shejian: "舌剑", + shejian_info: "弃牌阶段结束时,若你于此阶段弃置的所有牌花色均不相同,则你可以弃置一名其他角色的一张牌。", + xinfu_daigong: "怠攻", + xinfu_daigong_info: "每回合限一次。当你受到伤害时,你可以展示所有手牌,然后令伤害来源选择一项:交给你一张与你所有手牌花色均不相同的一张牌,或防止此伤害。", + xinfu_zhaoxin: "昭心", + xinfu_zhaoxin_info: "出牌阶段限一次,你可以将任意张手牌置于武将牌上并摸等量的牌,称之为「望」(你至多拥有三张「望」)。你或你攻击范围内的一名其他角色的摸牌阶段结束后,其可以获得一张由你选择的「望」,然后你可以对其造成1点伤害。", + zhaoxin_give: "昭心", + zhaoxin_give_info: "", + xinfu_qianchong: "谦冲", + xinfu_qianchong_info: "锁定技,若你的装备区内有牌且:均为红色,则你视为拥有技能〖明哲〗。均为黑色,则你视为拥有技能〖帷幕〗。若均不满足,则出牌阶段开始时,你可以选择一种类别的牌,然后你本回合内使用该类别的牌时没有次数和距离限制。", + qc_weimu: "帷幕", + qc_weimu_info: "", + qc_mingzhe: "明哲", + qc_mingzhe_info: "", + xinfu_shangjian: "尚俭", + xinfu_shangjian_info: "锁定技。一名角色的结束阶段开始时,若你于此回合内不因使用装备牌而失去了X张或更少的牌,则你摸等量的牌(X为你的体力值)。", + rw_bagua_skill: "先天八卦阵", + rw_bagua_skill_info: "当你需要使用或打出一张【闪】时,你可以进行判定,若判定结果不为黑桃,视为你使用或打出了一张【闪】。", + rw_baiyin_skill: "照月狮子盔", + rw_baiyin_skill_info: "锁定技,当你受到大于1的伤害时,你将伤害值改为1;当你失去装备区里的【照月狮子盔】时,你回复1点体力并摸两张牌。", + rw_lanyinjia: "精银甲", + rw_lanyinjia_info: "你可以将一张手牌当做【闪】使用或打出。锁定技,【精银甲】不会无效。", + rw_minguangkai_cancel: "耀光铠", + rw_minguangkai_cancel_info: "锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", + rw_minguangkai_link: "耀光铠", + rw_minguangkai_link_info: "锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", + rw_renwang_skill: "仁王金刚盾", + rw_renwang_skill_info: "黑色【杀】和红桃【杀】对你无效。", + rw_tengjia1: "桐油百韧甲", + rw_tengjia1_info: "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", + rw_tengjia2: "桐油百韧甲", + rw_tengjia2_info: "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", + rw_tengjia3: "桐油百韧甲", + rw_tengjia3_info: "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", + rw_tengjia4: "桐油百韧甲", + rewrite_bagua: "先天八卦阵", + rewrite_bagua_info: "当你需要使用或打出一张【闪】时,你可以进行判定,若判定结果不为黑桃,视为你使用或打出了一张【闪】。", + rewrite_baiyin: "照月狮子盔", + rewrite_baiyin_info: "锁定技,当你受到大于1的伤害时,你将伤害值改为1;当你失去装备区里的【照月狮子盔】时,你回复1点体力并摸两张牌。", + rewrite_lanyinjia: "精银甲", + rewrite_lanyinjia_info: "你可以将一张手牌当做【闪】使用或打出。锁定技,【精银甲】不会无效。", + rewrite_minguangkai: "耀光铠", + rewrite_minguangkai_info: "锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", + rewrite_renwang: "仁王金刚盾", + rewrite_renwang_info: "黑色【杀】和红桃【杀】对你无效。", + rewrite_tengjia: "桐油百韧甲", + rewrite_tengjia_info: "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", + rewrite_zhuge: "元戎精械弩", + rewrite_zhuge_info: "锁定技,你于出牌阶段内使用【杀】无次数限制。", + rw_zhuge_skill: "诸葛连弩", + rw_zhuge_skill_info: "锁定技,你于出牌阶段内使用【杀】无次数限制。", + takaramono: "宝物", + wolong_card: "卧龙", + wolong_card_info: "对一名角色造成1点火焰伤害。若场上有存活的诸葛亮(火),则改为对至多两名角色各造成1点火焰伤害。", + fengchu_card: "凤雏", + fengchu_card_info: "横置至多三名角色。若场上有存活的庞统(火),则改为横置至多四名角色。", + xuanjian_card: "玄剑", + xuanjian_card_info: "令一名角色摸一张牌并回复1点体力。若场上有存活的徐庶(将/界),则改为令一名角色摸一张牌并回复1点体力,然后你摸一张牌。", + shuijing_card: "水镜", + shuijing_card_info: "将一名角色装备区内的防具牌移动到另一名角色对应区域。若场上有存活的司马徽,则改为将1名角色装备区内的1件装备移动到另1角色对应区域。", + xinfu_pingcai: "评才", + xinfu_pingcai_info: "出牌阶段限一次,你可以挑选一个宝物并擦拭掉其上面的灰尘。然后,你可以根据宝物类型执行对应的效果。", + xinfu_pdgyingshi: "隐世", + xinfu_pdgyingshi2: "隐世", + xinfu_pdgyingshi_info: "锁定技,你始终跳过准备阶段,判定阶段,结束阶段。你不能被选择为延时锦囊牌的目标。", + pcaudio_wolong_card: "卧龙", + pcaudio_wolong_card_info: "", + pcaudio_fengchu_card: "凤雏", + pcaudio_fengchu_card_info: "", + pcaudio_shuijing_card: "水镜", + pcaudio_shuijing_card_info: "", + pcaudio_xuanjian_card: "玄剑", + pcaudio_xuanjian_card_info: "", + yizan_respond_sha: "翊赞", + yizan_respond_sha_info: "", + yizan_use: "翊赞", + yizan_use_backup: "翊赞", + yizan_use_info: "你可以将两张牌(其中至少一张为基本牌)当做任意基本牌使用或打出。", + yizan_respond_shan: "翊赞", + yizan_respond_shan_info: "", + xinfu_longyuan: "龙渊", + xinfu_longyuan_info: "觉醒技,准备阶段,若你本局游戏内发动过〖翊赞〗的次数大于等于3,则你修改〖翊赞〗。", + yizan_rewrite: "翊赞·改", + yizan_rewrite_info: "你可以将一张基本牌当做任意基本牌使用或打出。", + yizan_count: "翊赞", + yizan_count_info: "", + xinfu_jingxie1: "精械", + xinfu_jingxie1_info: "出牌阶段,你可以展示一张未强化过的【诸葛连弩】或标准包/军争包/SP包中的防具牌,然后对其进行强化。当你处于濒死状态时,你可以重铸一张防具牌,然后将体力回复至1点。", + xinfu_jingxie2: "精械", + xinfu_jingxie2_info: "", + xinfu_qiaosi: "巧思", + xinfu_qiaosi_info: "出牌阶段限一次,你可以投掷一枚六面骰子,亮出牌堆顶的X张牌并获得之。然后,你选择一项:1.交给一名其他角色X张牌。2.弃置X张牌。(X为骰子的点数)", + xin_xiahoudun: "手杀界夏侯惇", + xin_xiahoudun_prefix: "手杀界", + xinqingjian: "清俭", + xinqingjian2: "清俭", + xinqingjian_info: "每回合限一次。当你不因摸牌阶段的额定摸牌而得到牌后,你可以将任意张牌扣置于武将牌上。回合结束时,你将这些牌交给一名其他角色。若这些牌的数量大于1,你摸一张牌。", + zhangyì: "张翼", + jiakui: "贾逵", + zhiyi: "执义", + zhiyi_info: "锁定技,当你于一回合内使用或打出第一张基本牌时,你选择一项:1.摸一张牌。2.于此牌A(若此牌是因响应牌B而使用或打出的,则改为牌B)的使用或打出流程结算完成后,视为使用一张与此牌名称和属性相同的卡牌。", + rezhiyi: "执义", + rezhiyi_info: "锁定技,一名角色的结束阶段开始时,若你本回合内使用或打出过基本牌,则你选择一项:1.摸一张牌。2.视为使用一张你本回合内使用或打出过的基本牌。", + zhongzuo: "忠佐", + zhongzuo_info: "一名角色的结束阶段开始时,若你于此回合内造成或受到过伤害,则你可以令一名角色摸两张牌。若该角色已受伤,则你摸一张牌。", + wanlan: "挽澜", + wanlan_info: "限定技,当一名角色进入濒死状态时,你可以弃置所有手牌(无牌可不弃)。其回复体力至1点,然后你对当前回合角色造成1点伤害。", + re_jikang: "手杀嵇康", + re_jikang_prefix: "手杀", + shenpei: "审配", + re_wangyun: "手杀王允", + re_wangyun_prefix: "手杀", + relianji: "连计", + relianji_info: "出牌阶段限一次,你可以选择两名其他角色。第一名角色随机使用牌堆中的一张武器牌,然后这名角色视为对另一名角色随机使用一张下列的牌名的牌:【决斗】、【火攻】、【南蛮入侵】、【万箭齐发】或普【杀】。然后若此牌造成伤害,你获得X枚“连计”标记(X为此次扣减的体力值点数)。", + remoucheng: "谋逞", + remoucheng_info: "觉醒技,当一名角色因〖连计〗造成伤害后,若你拥有的“连计”标记数大于2,你加1点体力上限,回复1点体力,失去“连计”,获得“矜功”。", + + shouye: "守邺", + shouye_info: "每回合限一次。当其他角色使用牌指定你为唯一目标时,你可以与其进行【对策】。若你赢,则你取消此牌的目标,且你于此牌结算完成后获得其对应的所有实体牌。", + liezhi: "烈直", + liezhi_info: "准备阶段,你可以依次弃置至多两名其他角色区域内的各一张牌。若你受到过伤害,则〖烈直〗于你的下个回合无效。", + + xinzhanyi: "战意", + xinzhanyi_info: "出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作杀、酒或桃使用,且你本回合第一次以此法使用的牌的回复值/伤害值+1;锦囊牌,摸三张牌且你使用的牌不能被【无懈可击】响应;装备牌,你使用【杀】指定唯一目标后,其弃置两张牌,然后你获得其中的一张。", + xinzhanyi_basic_backup: "战意", + xinzhanyi_basic: "战意", + xinzhanyi_equip: "战意", + + meiyong: "姝勇", + meiyong_info: "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后其摸一张牌。", + rexushen: "许身", + rexushen_info: "限定技,出牌阶段,你可以失去X点体力(X为场上男性角色的数量)。若你以此法进入了濒死状态,则当你因一名角色而脱离此濒死状态后,你可以令其获得技能〖武圣〗和〖当先〗。", + rezhennan: "镇南", + rezhennan_info: "当你成为其他角色使用的牌的目标后,若此牌的目标数大于该角色的体力值,则你可以弃置一张牌并对其造成1点伤害。", + + hujinding: "手杀胡金定", + hujinding_prefix: "手杀", + huaizi: "怀子", + huaizi_info: "锁定技,你的手牌上限为你的体力上限。", + renshi: "仁释", + renshi_info: "锁定技,当你受到【杀】的伤害时,若你已受伤,则你防止此伤害并获得此【杀】对应的所有实体牌,然后减1点体力上限。", + wuyuan: "武缘", + wuyuan_info: "出牌阶段限一次,你可将一张【杀】交给一名其他角色,然后你回复1点体力,其摸一张牌。若此【杀】为:红色【杀】,其回复1点体力;属性【杀】,其改为摸两张牌。", + + re_weiwenzhugezhi: "手杀卫温诸葛直", + re_weiwenzhugezhi_prefix: "手杀", + gz_re_xugong: "许贡", + re_xugong: "手杀许贡", + re_xugong_prefix: "手杀", + re_zhanggong: "手杀张恭", + re_zhanggong_prefix: "手杀", + reqianxin: "遣信", + reqianxin_info: "出牌阶段限一次,你可将至多两张手牌随机交给等量的其他角色,称为「信」。这些角色的准备阶段开始时,若其手牌中有「信」,则其选择一项:令你摸两张牌,本回合手牌上限-2。", + rebiaozhao: "表召", + rebiaozhao_info: "结束阶段,你可以将一张牌置于武将牌上,称为「表」。当有一张与「表」点数相同的牌进入弃牌堆后,你将「表」置入弃牌堆并失去1点体力。准备阶段,若你的武将牌上有「表」,则你移去「表」并选择一名角色,该角色回复1点体力并摸三张牌。", + rebiaozhao2: "表召", + rebiaozhao2_info: "", + rebiaozhao3: "表召", + rebiaozhao3_info: "", + refuhai: "浮海", + refuhai_info: "出牌阶段限一次,你可令其他角色同时在「潮起」和「潮落」中选择一项,并依次展示这些角色的选项。若从你下家开始选择了相同选项的角色数目大于1,则你摸X张牌(X为连续相同结果的数量)。", + qiaosi: "巧思", + qiaosi_info: "出牌阶段限一次,你可以表演「大键角色图」并根据表演结果获得相应的牌。然后,你选择一项:1.弃置X张牌。2.将X张牌交给一名其他角色。(X为你以此法得到的牌数)", + qiaosi_map: "大键角色图", + qiaosi_map_info: "
  • 星野 梦美:锦囊牌*2
  • 能美 库特莉亚芙卡:装备牌/【杀】/【酒】*1
  • 友利 奈绪:【杀】/【酒】*1
  • 神尾 观铃:【闪】/【桃】*1
  • 伊吹 风子:锦囊牌/【闪】/【桃】*1
  • 仲村 由理:装备牌*2
  • Illustration:うら;Twitter:@ura530", + qiaosi_c1: ' ', + //星野 梦美 + qiaosi_c2: ' ', + //能美 库特莉亚芙卡 + qiaosi_c3: ' ', + //友利 奈绪 + qiaosi_c4: ' ', + //神尾 观铃 + qiaosi_c5: ' ', + //伊吹 风子 + qiaosi_c6: ' ', + //仲村 由理 + + yangbiao: "手杀杨彪", + yangbiao_prefix: "手杀", + zhaohan: "昭汉", + zhaohan_info: "锁定技,你的第1-4个准备阶段开始时,你加1点体力上限并回复1点体力,你的第5-7个准备阶段开始时,你减1点体力上限。", + rangjie: "让节", + rangjie_info: "当你受到1点伤害后,你可以选择一项并摸一张牌:获得牌堆里你选择的类型的一张牌,或移动场上的一张牌。", + yizheng: "义争", + yizheng2: "义争", + yizheng_info: "出牌阶段限一次,你可以和一名体力值不大于你的其他角色拼点。若你赢,其跳过下个摸牌阶段。若你没赢,你减1点体力上限。", + re_heqi: "手杀贺齐", + re_heqi_prefix: "手杀", + reqizhou: "绮胄", + reqizhou_info: "锁定技,你根据装备区里牌的花色数获得以下技能:1种或以上:〖英姿〗;2种或以上:〖奇袭〗;3种或以上:〖旋风〗。", + reshanxi: "闪袭", + reshanxi2: "闪袭", + reshanxi_info: "出牌阶段开始时,你可以弃置一张红色基本牌并选择一名有牌的其他角色,将其的至多X张牌置于其的武将牌上(X为你的体力值)。回合结束时,该角色获得这些牌。", + chendeng: "手杀陈登", + chendeng_prefix: "手杀", + zhouxuan: "周旋", + zhouxuan2: "周旋", + zhouxuan_info: "出牌阶段限一次,你可以弃置一张牌并指定一名角色,然后选择一个基本牌的名称或非基本牌的类型。其使用或打出下一张牌时,若此牌的名称或类型和你选择的相同,则你观看牌堆顶的三张牌,然后将这些牌以任意分割方式交给任意名角色。", + fengji: "丰积", + fengji_info: "锁定技,回合结束时,你记录你的手牌数。准备阶段开始时,若你的手牌数不小于你记录的手牌数,则你摸两张牌且本回合手牌上限为体力上限。", + re_guanqiujian: "手杀毌丘俭", + re_guanqiujian_prefix: "手杀", + rezhengrong: "征荣", + rehongju: "鸿举", + reqingce: "清侧", + reqingce_backup: "清侧", + rezhengrong_info: "当你于出牌阶段使用的指定了其他角色为目标的牌结算完成后,若此牌是你本局游戏内于出牌阶段使用的指定了其他角色为目标的第偶数张牌,则你可以将一名其他角色角色的随机一张牌置于你的武将牌上,称为「荣」。", + rehongju_info: "觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3且有角色死亡,则你摸等同于「荣」数量的牌。然后可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。", + reqingce_info: "出牌阶段,你可以将一张「荣」置入弃牌堆,然后弃置场上的一张牌。", + re_pangtong: "手杀界庞统", + re_pangtong_prefix: "手杀界", + dongcheng: "手杀董承", + dongcheng_prefix: "手杀", + chengzhao: "承诏", + chengzhao_info: "一名角色的结束阶段,若你于本回合内获得了两张以上的牌,则你可以与一名其他角色拼点。若你赢,你视为对其使用一张无视防具的【杀】。", + yangyi: "手杀杨仪", + yangyi_prefix: "手杀", + duoduan: "度断", + duoduan_info: "每回合限一次,当你成为【杀】的目标后,你可以重铸一张牌。若如此做,你选择一项:①令使用者摸两张牌,且此【杀】无效。②令使用弃置一张牌,且你不能响应此【杀】。", + gongsun: "共损", + gongsun_info: "出牌阶段开始时,你可以弃置两张牌并指定一名其他角色。你选择一个基本牌或普通锦囊牌的牌名。直到你的下回合开始或你死亡,你与其不能使用或打出或弃置此名称的牌。", + gongsun_shadow: "共损", + xin_chengpu: "手杀界程普", + xin_chengpu_prefix: "手杀界", + relihuo: "疠火", + relihuo_damage: "疠火", + relihuo_baigei: "疠火", + relihuo_info: "当你使用普【杀】时,你可以将此杀改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)。", + dengzhi: "手杀邓芝", + dengzhi_prefix: "手杀", + jimeng: "急盟", + jimeng_info: "出牌阶段开始时,你可以获得一名其他角色的一张牌,然后交给该角色X张牌(X为你当前体力值)。", + shuaiyan: "率言", + shuaiyan_info: "弃牌阶段开始时,若你的手牌数大于1,则你可以展示所有手牌,然后你令一名其他角色交给你一张牌。", + zhengxuan: "郑玄", + zhengjing: "整经", + zhengjing_info: "出牌阶段,你可以整理卡牌。然后,你将整理出的卡牌中的至少一张作为“经”置于一名角色的武将牌上,然后获得其余的牌。该角色的准备阶段获得这些牌,且跳过此回合的判定和摸牌阶段。", + zhengjing2: "整经", + + mobile_yijiang: "将星独具", + yj_zhanghe: "☆张郃", + yj_zhanghe_prefix: "☆", + yj_zhangliao: "☆张辽", + yj_zhangliao_prefix: "☆", + yj_xuhuang: "☆徐晃", + yj_xuhuang_prefix: "☆", + yj_ganning: "☆甘宁", + yj_ganning_prefix: "☆", + xhzhiyan: "治严", + xhzhiyan_info: "出牌阶段,若你的手牌数不等于体力上限,则你可以将手牌摸至/弃至手牌上限,然后本回合不能对其他角色使用牌/可以将弃置的一张牌交给一名其他角色。", + zhilve: "知略", + zhilve_info: "锁定技,准备阶段,你选择一项:1.移动场上装备区的一张牌并失去1点体力。2.移动场上判定区的一张牌并令本回合手牌上限-1。3.本回合摸牌阶段多摸一张牌且使用的第一张【杀】无距离限制且不计入次数限制。", + xinzhilve: "知略", + xinzhilve_backup: "知略", + xinzhilve_mark: "知略", + xinzhilve_info: "出牌阶段限一次,你可以失去1点体力并选择一项:1.移动场上的一张牌;2.视为使用一张无距离限制且不计入次数限制的【杀】并摸一张牌。然后你本回合的手牌上限+1。", + xinxhzhiyan: "治严", + xinxhzhiyan_false: "治严", + xinxhzhiyan_info: "出牌阶段每项各限一次,若你的手牌数:大于体力值,则你可以将X张手牌交给一名其他角色(X为你的手牌数与体力值之差);小于体力上限,则你可以摸X张牌且本阶段内不能再对其他角色使用牌。(X为你的手牌数与体力上限之差)", + weifeng: "威风", + weifeng2: "威风", + weifeng3: "威风", + weifeng_info: "锁定技,当你于出牌阶段内使用第一张伤害性基本牌或普通锦囊牌后,你令此牌的一名没有“惧”的其他目标角色获得一枚名称为此牌牌名的“惧”。有“惧”的角色受到伤害时,其移去“惧”,然后若造成伤害的牌名称和“惧”:相同,此伤害+1;不同,你获得该角色的一张牌。准备阶段开始时或你死亡时,你移去场上的所有“惧”。", + gnjinfan: "锦帆", + gnjinfan_gain: "锦帆", + gnjinfan_info: "弃牌阶段开始时,你可将任意张手牌置于武将牌上,称为“铃”(每种花色的“铃”限一张)。你可以如手牌般使用或打出“铃”。当有“铃”移动到处理区后,你从牌堆中获得与“铃”花色相同的一张牌。", + gnsheque: "射却", + gnsheque_info: "一名其他角色的准备阶段开始时,若其装备区内有牌,则你可以对其使用一张【杀】(无距离关系的限制且无视防具)。", + sp_sufei: "手杀苏飞", + sp_sufei_prefix: "手杀", + zhengjian: "诤荐", + zhengjian_draw: "诤荐", + zhengjian_mark: "诤荐", + zhengjian_info: "锁定技,结束阶段,你令一名角色获得一枚“诤”。回合开始时,你令有“诤”的角色移去“诤”并摸X张牌(X为其最后一次获得“诤”后使用和打出的牌数,且至多不能超过其体力上限或5)。", + gaoyuan: "告援", + gaoyuan_info: "当你成为【杀】的目标时,你可弃置一张牌将此【杀】转移给一名有“诤”且不是此【杀】使用者的其他角色。", + tongqu: "通渠", + tongqu_info: "游戏开始时,你拥有一个“渠”标记。准备阶段,你可以失去1点体力令一名没有“渠”标记的角色获得“渠”标记。有“渠”的角色摸牌阶段额外摸一张牌,然后将一张牌交给其他有“渠”的角色或弃置。若以此法给出的是装备牌则使用之。当有“渠”的角色进入濒死状态时,移除其“渠”标记。", + xinwanlan: "挽澜", + xinwanlan_info: "当一名角色受到伤害值不小于体力值的伤害时,你可以弃置装备区中的所有牌(至少一张) 防止此伤害。", + re_xusheng: "手杀界徐盛", + re_xusheng_prefix: "手杀界", + re_dongzhuo: "手杀界董卓", + re_dongzhuo_prefix: "手杀界", + rejiuchi: "酒池", + rejiuchi_info: "你可以将一张黑桃手牌当做【酒】使用。当你于回合内使用带有【酒】效果的【杀】造成伤害时,你令你的〖崩坏〗失效直到回合结束。", + furong: "手杀傅肜", + furong_prefix: "手杀", + xuewei: "血卫", + xuewei_info: "准备阶段,你可以选择一名其他角色(仅自己可见)。若如此做,直到你的下回合开始前,当其第一次受到伤害时,你防止此伤害,改为由你受到等量的伤害并对伤害来源造成等量同属性的伤害。", + liechi: "烈斥", + liechi_info: "锁定技,当你进入濒死状态时,伤害来源弃置一张牌。", + xin_liaohua: "手杀界廖化", + xin_liaohua_prefix: "手杀界", + redangxian: "当先", + redangxian_info: "锁定技,回合开始时,你从弃牌堆中获得一张【杀】并进行一个额外的出牌阶段。", + refuli: "伏枥", + refuli_info: "限定技,当你处于濒死状态时,你可以将体力值回复至X点(X为势力数)。然后若你的体力值为全场唯一最多,你翻面。", + xin_caozhang: "手杀界曹彰", + xin_caozhang_prefix: "手杀界", + rejiangchi: "将驰", + rejiangchi_info: "出牌阶段开始时,你可以选择一项:1、摸一张牌,若如此做,你本阶段内不能使用【杀】。 2、弃置一张牌,若如此做,此阶段你使用【杀】无距离限制且你可以额外使用一张【杀】。", + rezhenxing: "镇行", + rezhenxing_info: "结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", + xin_jianyong: "手杀界简雍", + xin_jianyong_prefix: "手杀界", + xinqiaoshui: "巧说", + xinqiaoshui_info: "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,则你本阶段内使用的下一张基本牌或普通锦囊牌可以增加减少一个目标。若你没赢,你本阶段内不能使用锦囊牌。", + xinjyzongshi: "纵适", + xinjyzongshi_info: "当你拼点后,你可以观看牌堆顶的一张牌,然后选择一项:获得此牌,或获得两张拼点牌中点数较小的一张。", + dingyuan: "手杀丁原", + dingyuan_prefix: "手杀", + beizhu: "备诛", + beizhu_draw: "备诛", + beizhu_info: "出牌阶段限一次,你可以观看一名其他角色的手牌。若其中:没有【杀】,你弃置其一张牌,然后你可令其获得牌堆中的一张【杀】;有【杀】,其依次对你使用这些【杀】,当你因此受到1点伤害后,你摸一张牌。", + xin_zhuran: "手杀界朱然", + xin_zhuran_prefix: "手杀界", + mobiledanshou: "胆守", + mobiledanshou_info: "一名其他角色的结束阶段开始时,若X:为0,你摸一张牌;不等于0,你可弃置X张牌并对其造成1点伤害(X为其本回合内使用的目标包含你的牌的数量)。", + yanghuiyu: "羊徽瑜", + hongyi: "弘仪", + hongyi2: "弘仪", + hongyi_info: "出牌阶段限一次,你可以选择一名其他角色。你的下回合开始前,该角色造成伤害时进行判定,若结果为:黑色,此伤害-1。红色,受到伤害的角色摸一张牌。", + requanfeng: "劝封", + requanfeng_gain: "劝封", + requanfeng_info: "限定技。①其他角色死亡时,你可失去〖弘仪〗,然后获得其武将牌上的所有非主公技,非隐匿技和非Charlotte技,加1点体力上限并回复1点体力。②当你处于濒死状态时,你可以加2点体力上限,然后回复4点体力。", + quanfeng: "劝封", + quanfeng_info: "锁定技,限定技,一名角色死亡时,你选择获得其的一个技能(主公技,限定技,觉醒技,隐匿技,使命技,带有Charlotte标签的技能除外),然后加1点体力上限并回复1点体力。", + simashi: "手杀司马师", + simashi_prefix: "手杀", + baiyi: "败移", + baiyi_info: "限定技,出牌阶段,若你已受伤,你可以交换两名其他角色的座次。", + jinglve: "景略", + jinglve2: "景略", + jinglve3: "景略", + jinglve_info: "出牌阶段限一次,若场上没有与你对应的「死士」牌,则你可以观看一名其他角色的手牌,将其中一张牌标记为「死士」。当其使用对应的实体牌中包含「死士」的牌时,你取消此牌的所有目标。当「死士」牌不因使用而进入弃牌堆,或其回合结束后,若「死士」牌仍在其区域内,则你获得此牌。", + shanli: "擅立", + shanli_info: "觉醒技,准备阶段,若你已发动过〖败移〗且对至少两名角色发动过〖景略〗,则你减1点体力上限并选择一名角色。系统随机选择三个不为〖忘隙(仲村由理)〗的主公技,然后你选择其中一个技能,令其获得之。其将交互表情中的【拖鞋】和【酒杯】替换为【枷锁】和【玉玺】。", + re_lingtong: "手杀界凌统", + re_lingtong_prefix: "手杀界", + re_liubiao: "手杀界刘表", + re_liubiao_prefix: "手杀界", + hucheer: "手杀胡车儿", + hucheer_prefix: "手杀", + daoji: "盗戟", + daoji_info: "出牌阶段限一次,你可以弃置一张非基本牌并选择一名装备区里有牌的其他角色,你获得其装备区中的一张牌并使用之。若你以此法得到的牌是武器牌,则你使用此牌后对其造成1点伤害。", + xin_hansui: "手杀韩遂", + xin_hansui_prefix: "手杀", + xinniluan: "逆乱", + xinniluan_info: "其他角色的结束阶段,若其本回合对除其以外的角色使用过牌,则你可以对其使用一张【杀】。若以此法使用的【杀】造成伤害,则你弃置其一张牌。", + xiaoxi_hansui: "骁袭", + xiaoxi_hansui_info: "你可以将一张黑色牌当做【杀】使用或打出。", + xin_zhangfei: "手杀界张飞", + xin_zhangfei_prefix: "手杀界", + liyong: "厉勇", + liyong2: "厉勇", + liyong3: "厉勇", + liyong_info: "锁定技,若你于出牌阶段内使用的【杀】被【闪】抵消,则你获得如下效果:你本回合使用的下一张【杀】不可被响应且伤害+1,指定的目标本回合非锁定技失效,当此【杀】造成伤害后,若目标角色未死亡,你失去1点体力。", + gongsunkang: "公孙康", + juliao: "据辽", + juliao_info: "锁定技,其他角色计算与你的距离始终+X(X为场上势力数-1)。", + taomie: "讨灭", + taomie1: "讨灭", + taomie2: "讨灭", + taomie3: "讨灭", + taomie4: "讨灭", + taomie_info: "当你受到伤害后或当你造成伤害后,你可以令伤害来源或受伤角色获得“讨灭”标记(如场上已有标记则转移给该角色);你和拥有“讨灭”标记的角色视为在彼此的攻击范围内,且当你对该角色造成伤害时,选择一项:1. 此伤害+1;2. 你获得其区域内的一张牌并可将之交给另一名角色;3. 依次执行前两项并于伤害结算后弃置其“讨灭”标记。", + xin_guohuai: "手杀界郭淮", + xin_guohuai_prefix: "手杀界", + mobilejingce: "精策", + mobilejingce_info: "结束阶段,若此回合因使用或打出而置入弃牌堆的牌的数量不小于你的体力值,则你可以摸两张牌。", + xin_panzhangmazhong: "手杀界潘璋马忠", + xin_panzhangmazhong_prefix: "手杀界", + xinduodao: "夺刀", + xinduodao_info: "当你受到伤害后,你可以获得伤害来源装备区里的武器牌。", + xinanjian: "暗箭", + xinanjian_info: "锁定技,当你使用【杀】指定目标后,若你不在目标角色攻击范围内,你选择一项:1. 令其无法响应此【杀】;2. 其受到此【杀】造成的伤害+1。", + xin_fuhuanghou: "手杀界伏寿", + xin_fuhuanghou_prefix: "手杀界", + xinzhuikong: "惴恐", + xinzhuikong_info: "每轮限一次,其他角色的回合开始时,若其体力值不小于你,你可与其拼点。若你赢,其本回合无法使用牌指定除其以外的角色为目标;若你没赢,你获得其拼点的牌,然后其视为对你使用一张【杀】。", + xinqiuyuan: "求援", + xinqiuyuan_info: "当你成为【杀】的目标时,你可以令另一名其他角色交给你一张除【杀】以外的基本牌,否则其也成为此【杀】的目标。", + xin_gongsunzan: "手杀界公孙瓒", + xin_gongsunzan_prefix: "手杀界", + re_dengai: "手杀界邓艾", + re_dengai_prefix: "手杀界", + flappybird: "飞鸟", + flappybird_info: "出牌阶段,你可游玩一局Flappy Bird。", + re_handang: "手杀界韩当", + re_handang_prefix: "手杀界", + nanhualaoxian: "手杀南华老仙", + nanhualaoxian_prefix: "手杀", + yufeng: "御风", + yufeng2: "御风", + yufeng_info: "出牌阶段限一次,你可以表演“御风飞行”。若表演失败,则你摸X张牌。若表演成功,则你可以选择至多X名其他角色获得“御风”效果,然后摸X-Y张牌(准备阶段开始时,你进行判定。若结果为:红色,你跳过摸牌阶段;黑色,你跳过出牌阶段和弃牌阶段。X为你的得分。Y为你选择的角色数)。", + tianshu: "天书", + tianshu_info: "出牌阶段开始时,若场上没有【太平要术】,则你可以弃置一张牌并选择一名角色。该角色获得并使用【太平要术】。", + re_jiangwei: "手杀界姜维", + re_jiangwei_prefix: "手杀界", + retiaoxin: "挑衅", + retiaoxin_info: "出牌阶段限一次,你可以指定一名有牌的其他角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。", + re_zhurong: "手杀界祝融", + re_zhurong_prefix: "手杀界", + relieren: "烈刃", + relieren_info: "当你使用【杀】指定目标后,你可以和目标角色进行拼点。若你赢,你获得其一张牌。若你没赢,你获得对方的拼点牌,其获得你的拼点牌。", + zhouqun: "周群", + tiansuan: "天算", + tiansuan_info: "出牌阶段限一次,若场上没有因你产生的“命运签”,则你可以抽取一张“命运签”,然后令一名角色获得“命运签”直到你的下回合开始。若你以此法抽取的“命运签”为:上上签,你观看其手牌;上上签/上签,你获得其区域内的一张牌。", + tiansuan_faq: "【命运签】说明", + tiansuan_faq_info: "当你抽取“命运签”时,你可以令其中一种命运签的权重+1。
    上上签(权重1):当你受到伤害时,防止此伤害。
    上签(权重2):当你受到伤害时,你令伤害值改为1;当你受到1点伤害后,你摸一张牌。
    中签(权重3):当你受到伤害时,你令伤害属性改为火属性并将伤害值改为1。
    下签(权重2):当你受到伤害时,你令此伤害+1。
    下下签(权重1):当你受到伤害时,你令此伤害+1。你不能使用【酒】或【桃】。", + tiansuan2_0: "命运签", + tiansuan2_1: "命运签", + tiansuan2_2: "命运签", + tiansuan2_damage: "命运签", + tiansuan2_fire: "命运签", + tiansuan2_3: "命运签", + tiansuan2_4: "命运签", + ol_yujin: "手杀界于禁", + ol_yujin_prefix: "手杀界", + rejieyue: "节钺", + rejieyue_info: "结束阶段开始时,你可以将一张牌交给一名其他角色。然后其选择一项:令你摸三张牌:或其保留一张手牌和装备区的牌,然后弃置其余的牌。", + xin_zhoucang: "手杀界周仓", + xin_zhoucang_prefix: "手杀界", + mobilezhongyong: "忠勇", + mobilezhongyong_info: "当你于出牌阶段内使用的【杀】结算结束后,若没有目标角色使用【闪】响应过此【杀】,则你可获得此【杀】;否则你可选择一项:①获得目标角色使用的【闪】,然后可将此【杀】交给另一名其他角色。②将目标角色使用的【闪】交给另一名其他角色,然后你本回合使用【杀】的次数上限+1且下一张【杀】的伤害值基数+1。(你不能使用本回合因执行〖忠勇〗的效果得到的牌)", + xin_caifuren: "手杀界蔡夫人", + xin_caifuren_prefix: "手杀界", + xinqieting: "窃听", + xinqieting_info: "其他角色的回合结束时,若其本回合内未对其他角色造成过伤害,则你可选择一项:①摸一张牌。②观看其两张手牌并获得其中的一张。③将其装备区内的一张牌移动至你的装备区。", + xinguixiu: "闺秀", + xinguixiu_info: "锁定技。结束阶段,若你的体力值为:奇数,你摸一张牌;偶数,你回复1点体力。", + re_zhonghui: "手杀界钟会", + re_zhonghui_prefix: "手杀界", + requanji: "权计", + requanji_info: "出牌阶段结束时,若你的手牌数大于体力值,或当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。", + xin_guyong: "手杀界顾雍", + xin_guyong_prefix: "手杀界", + xinshenxing: "慎行", + xinshenxing_info: "出牌阶段限X次(X为你的体力值),你可以弃置两张牌,然后摸一张牌。若这两张牌颜色不同,则改为摸两张牌。", + xinbingyi: "秉壹", + xinbingyi_info: "结束阶段,你可展示所有手牌。若这些牌的颜色或类型均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数)。", + qiaozhou: "手杀谯周", + qiaozhou_prefix: "手杀", + zhiming: "知命", + zhiming_info: "准备阶段开始时或弃牌阶段结束时,你摸一张牌,然后可以将一张牌置于牌堆顶。", + xingbu: "星卜", + xingbu_info: "结束阶段,你可以亮出牌堆顶的三张牌,然后你可以根据X值(X为这三张牌中红色牌的数量),令一名其他角色获得对应的效果直到其下回合结束:①三张:其摸牌阶段多摸两张牌,使用【杀】的次数上限+1。②两张:其使用【杀】的次数上限-1,跳过弃牌阶段。③小于两张:其于准备阶段开始时弃置一张手牌。", + xin_sunluban: "手杀界孙鲁班", + xin_sunluban_prefix: "手杀界", + xinzenhui: "谮毁", + xinzenhui_info: "出牌阶段限一次。当你使用【杀】或黑色普通锦囊牌指定目标时,你可选择另一名能成为此牌目标的其他角色并选择一项:①令其也成为此牌的目标。②获得其一张牌,然后将此牌的使用者改为该角色。", + xinjiaojin: "骄矜", + xinjiaojin_info: "当你受到男性角色造成的伤害时,你可以弃置一张装备牌并防止此伤害。", + xin_caozhen: "手杀界曹真", + xin_caozhen_prefix: "手杀界", + discretesidi: "司敌", + discretesidi_info: "①当你使用的不为延时锦囊牌的牌结算结束后,你可选择一名R内不存在以a为第一序偶的二元序偶的其他角色a,并选择一名角色b,在关系R内建立二元序偶<a,b>(b对其他角色不可见)。②一名角色a使用不为延时锦囊牌的牌指定b为目标时,若(aRb)∧(此牌目标数为1)为真,则{你从R内移除<a,b>,且:若b为你,你摸一张牌;若b不为你,你可选择:⒈取消此牌的目标,然后若场上没有处于濒死状态的角色,则你对a造成1点伤害。⒉摸两张牌};否则{你清除R内以a为第一元素的二元序偶}。", + fuqian: "傅佥", + jueyong: "绝勇", + jueyong_info: "锁定技。①当你不因〖绝勇〗成为唯一牌的目标时,若此牌不为转化牌且对应的实体牌牌数为1且不为【桃】或【酒】且你的“绝”数小于你的体力值,则你将此牌置于你的武将牌上,称为“绝”,且取消此牌的目标。②结束阶段开始时,若你有“绝”,则你令所有“绝”的原使用者依次对你使用所有“绝”,将无法使用的“绝”置入弃牌堆。", + poxiang: "破降", + poxiang_info: "出牌阶段限一次。你可以将一张牌交给一名其他角色。你摸三张牌(不计入本回合的手牌上限),移去所有“绝”并失去1点体力。", + simafu: "手杀司马孚", + simafu_prefix: "手杀", + xunde: "勋德", + xunde_info: "一名角色受到伤害后,若你至其的距离不大于1,则你可判定。若判定结果:大于5,你令该角色获得判定牌;小于7,你令伤害来源弃置一张手牌。", + chenjie: "臣节", + chenjie_info: "一名角色的判定牌生效前,你可打出一张花色相同的牌。系统将你打出的牌作为新判定牌,将原判定牌置入弃牌堆。然后你摸两张牌。", + mayuanyi: "马元义", + jibing: "集兵", + jibing_info: "①摸牌阶段开始时,若你的“兵”数小于势力数,则你可以改为将牌堆顶的两张牌置于你的武将牌上,称为“兵”。②你可以将一张“兵”当做【杀】或【闪】使用或打出。", + wangjing: "往京", + wangjing_info: "锁定技。当你因〖集兵〗而使用或打出牌时,若对方是场上体力值最高的角色,则你摸一张牌。", + moucuan: "谋篡", + moucuan_info: "觉醒技。准备阶段,若你的“兵”数不小于势力数,则你减1点体力上限并获得〖兵祸〗。", + binghuo: "兵祸", + binghuo_info: "一名角色的结束阶段开始时,若你本回合内因〖集兵〗而使用或打出过牌,则你可令一名角色判定。若判定结果为黑色,则你对其造成1点雷属性伤害。", + yanpu: "阎圃", + huantu: "缓图", + huantu_info: "每轮限一次。一名角色的摸牌阶段开始前,若其在你攻击范围内,则你可以交给其一张牌并令其跳过此阶段。然后你于此回合的结束阶段选择一项:①令其回复1点体力并摸两张牌。②你摸三张牌,然后交给其两张手牌。", + bihuo: "避祸", + bihuo_info: "限定技。一名角色脱离濒死状态时,你可以令其摸三张牌,然后其他角色计算至其的距离时+X直到本轮结束(X为角色数)。", + sunhanhua: "手杀孙寒华", + sunhanhua_prefix: "手杀", + chongxu: "冲虚", + chongxu_info: "出牌阶段限一次,你可以随机演奏一首音乐,并根据完成度来获得相应的分数(至多五分)。然后你可修改〖妙剑〗或〖莲华〗(消耗3分),并使用剩余的分数进行摸牌(每张2分)。", + chongxu_faq: "目前的曲库", + chongxu_faq_info: " 
    《鸟之诗》- 折户伸治
    《竹取飛翔 ~ Lunatic Princess》- ZUN
    《ignotus》- ak+q
    《Super Mario 3D World Theme》- 横田真人
    《只因你太美》- SWIN-S
    《Croatian Rhapsody》- Maksim
    《罗刹海市》- 刀郎
    《Pigstep (Stereo Mix)》- Lena Raine", + miaojian: "妙剑", + miaojian_info: "出牌阶段限一次。你可将一张【杀】当做刺【杀】使用,或将一张锦囊牌当做【无中生有】使用。", + miaojian1: "妙剑·改", + miaojian1_info: "出牌阶段限一次。你可将一张基本牌当做刺【杀】使用,或将一张非基本牌当做【无中生有】使用。", + miaojian2: "妙剑·极", + miaojian2_info: "出牌阶段限一次。你可视为使用一张刺【杀】或【无中生有】。", + shhlianhua: "莲华", + shhlianhua_info: "当你成为【杀】的目标后,你摸一张牌。", + shhlianhua1: "莲华·改", + shhlianhua1_info: "当你成为【杀】的目标后,你摸一张牌。然后你进行判定,若结果为黑桃,则此【杀】对你无效。", + shhlianhua2: "莲华·极", + shhlianhua2_info: "当你成为【杀】的目标后,你摸一张牌。然后此【杀】的使用者选择一项:①弃置一张牌。②令此【杀】对你无效。", + re_yufan: "手杀界虞翻", + re_yufan_prefix: "手杀界", + rezongxuan: "纵玄", + rezongxuan_place: "纵玄", + rezongxuan_info: "当你的牌因弃置而进入弃牌堆后,你可以将其以任意顺序置于牌堆顶。出牌阶段限一次,你可以摸一张牌,然后将一张牌置于牌堆顶。", + yj_huangzhong: "☆黄忠", + yj_huangzhong_prefix: "☆", + spshidi: "势敌", + spshidi_info: "转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。", + spyishi: "义释", + spyishi_info: "当你对装备区有牌的其他角色造成伤害时,你可令此伤害-1,然后获得其装备区内的一张牌。", + spqishe: "骑射", + spqishe_info: "你可以将一张装备牌当做【酒】使用。你的手牌上限+X(X为你装备区内的牌数)。", + sp_maojie: "毛玠", + bingqing: "秉清", + bingqing_info: "当你于出牌阶段内使用的牌结算结束后,若你于本阶段内使用的所有已结算结束的其他牌与此牌花色均不相同,则你可根据X的值执行对应效果:为2,你令一名角色摸两张牌;为3,你弃置一名角色区域内的一张牌;为4,你对一名其他角色造成1点伤害。(X为你本阶段内使用过的已结算结束的牌中包含的花色数)", + yingfeng: "迎奉", + yingfeng_info: "准备阶段,你可以令一名角色获得“奉”标记并移除场上所有其他的“奉”标记。有“奉”标记的角色使用牌没有距离限制。", + xin_sunxiu: "手杀界孙休", + xin_sunxiu_prefix: "手杀界", + mobileyanzhu: "宴诛", + mobileyanzhu_info: "出牌阶段限一次,你可以令一名有牌的其他角色选择一项:①你获得其装备区里所有的牌,然后你失去技能〖宴诛〗并修改技能〖兴学〗。②你获得其区域里的一张牌。", + mobilexingxue: "兴学", + mobilexingxue_info: "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值)。", + mobilexingxuex: "兴学·改", + mobilexingxuex_info: "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶或交给一名其他目标角色(X为你的体力上限)。", + re_wuguotai: "手杀界吴国太", + re_wuguotai_prefix: "手杀界", + reganlu: "甘露", + reganlu_info: "出牌阶段限一次,你可以选择装备区牌数之差的绝对值不大于X的两名角色或包含你在内的两名角色,然后交换这两名角色装备区内的牌。(X为你已损失的体力值)", + taoqian: "手杀陶谦", + taoqian_prefix: "手杀", + miheng: "手杀祢衡", + miheng_prefix: "手杀", + re_gaoshun: "手杀界高顺", + re_gaoshun_prefix: "手杀界", + peixiu: "裴秀", + xingtu: "行图", + xingtu1: "倍数", + xingtu2: "约数", + xingtu_info: "锁定技。你使用点数为X的倍数的牌无次数限制,你使用点数为X的约数的牌时摸一张牌(X为你本局游戏使用的上一张牌的点数)。", + juezhi: "爵制", + juezhi_info: "出牌阶段,你可以弃置至少两张牌,然后从牌堆中获得一张点数为Y的牌(Y为这些牌的点数和对13取余,余数为0时Y取13)。", + sp_jianggan: "手杀蒋干", + sp_jianggan_prefix: "手杀", + spdaoshu: "盗书", + spdaoshu_info: "每轮限一次。一名敌方角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", + spdaoshu_info_identity: "每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", + spdaoshu_info_guozhan: "每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", + mbdaoshu: "盗书", + mbdaoshu_info: "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你和队友观看其手牌并猜测其伪装的手牌,猜对的角色对其造成1点伤害,猜错的角色随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", + mbdaoshu_info_identity: "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", + mbdaoshu_info_guozhan: "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", + spdaizui: "戴罪", + spdaizui2: "戴罪", + spdaizui_info: "限定技。当你受到伤害值不小于体力值的伤害时,你可防止此伤害并将此伤害渠道对应的所有实体牌置于伤害来源的武将牌上,称为“释”。本回合结束时,其获得所有“释”。", + re_caiwenji: "手杀界蔡琰", + re_caiwenji_prefix: "手杀界", + re_bulianshi: "手杀界步练师", + re_bulianshi_prefix: "手杀界", + reanxu: "安恤", + reanxu_info: "出牌阶段限一次,你可以选择两名其他角色,令其中一名角色获得另一名角色的一张牌。若以此法移动的牌不来自装备区,则你摸一张牌。然后你可以令二者中手牌数较少的一名角色摸一张牌。", + xin_jushou: "手杀界沮授", + xin_jushou_prefix: "手杀界", + xinjianying: "渐营", + xinjianying_info: "①当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。②出牌阶段限一次,你可以将一张牌当做任意基本牌使用。若你于此阶段内使用的上一张牌有花色,则此牌的花色视为上一张牌的花色。", + re_xunyu: "手杀界荀彧", + re_xunyu_prefix: "手杀界", + rejieming: "节命", + rejieming_info: "当你受到1点伤害后,你可以令一名角色摸两张牌。然后若其手牌数小于体力上限,则你摸一张牌。", + xin_quancong: "手杀界全琮", + xin_quancong_prefix: "手杀界", + sbyaoming: "邀名", + sbyaoming_info: "蓄力技(2/4)。①当你受到1点伤害后,你可以获得1点蓄力值。②出牌阶段或当你受到伤害后,你可消耗1点蓄力值并选择一项:⒈弃置一名手牌数不小于你的角色的一张牌。⒉令一名手牌数不大于你的角色摸一张牌。若你上次发动〖邀名②〗时未获得过蓄力值且你选择的选项和上次不同,则你获得1点蓄力值。", + ruanhui: "阮慧", + mingcha: "明察", + mingcha_info: "摸牌阶段开始时,你亮出牌堆顶的三张牌。若这三张牌中有点数小于9的牌,则你可以放弃摸牌并获得这些牌,然后你可以获得一名其他角色的随机一张牌。", + jingzhong: "敬重", + jingzhong_info: "弃牌阶段结束时,若你于本阶段内弃置过至少两张黑色牌,则你可以选择一名其他角色并获得如下效果直到其回合结束:每阶段限三次,其于出牌阶段内使用的牌结算结束后,你获得此牌对应的实体牌。", + xin_mamidi: "手杀马日磾", + xin_mamidi_prefix: "手杀", + chengye: "承业", + chengye_info: "锁定技。①其他角色使用的非转化牌结算结束后,或其他角色的装备牌和延时锦囊牌进入弃牌堆后,或有延时锦囊牌因其他角色执行判定阶段的流程而进入弃牌堆后,若你的“六经”有空缺的位置可以置入此牌,则你将此牌置于你武将牌上,填补“六经”的对应位置。②出牌阶段开始时,若你的“六经”没有空缺的位置,则你获得所有“六经”。", + chengye_append: '
  • 《诗经》:伤害类锦囊牌
  • 《尚书》:基本牌
  • 《仪礼》:无懈可击
  • 《易经》:无中生有
  • 《乐经》:乐不思蜀
  • 《春秋》:装备牌', + buxu: "补叙", + buxu_backup: "补叙", + buxu_info: "出牌阶段,若你的“六经”中有空缺的位置,则你可以弃置X+1张牌并选择一种空缺的“六经”(X为你本阶段内发动过〖补叙〗的次数)。系统从牌堆或弃牌堆中检索一张对应的牌,然后你将此牌置于你武将牌上,填补“六经”的对应位置。", + re_dianwei: "手杀界典韦", + re_dianwei_prefix: "手杀界", + liuye: "手杀刘晔", + liuye_prefix: "手杀", + sp_caosong: "手杀曹嵩", + sp_caosong_prefix: "手杀", + yijin: "亿金", + yijin_info: "锁定技。①游戏开始时,你获得“膴仕”、“金迷”、“贾凶”、“通神”、“拥蔽”、“厚任”各1枚(均称为“金”)。②出牌阶段开始时,你选择一名没有“金”的其他角色。你交给其1枚“金”,且令其获得对应效果。③一名角色的回合结束后,若其有你交给其的“金”,其移去此“金”。④当你死亡时,移去场上所有你交出的“金”。⑤回合开始时,若你没有“金”,你死亡。", + yijin_wushi: "膴仕", + yijin_wushi_info: "锁定技。①摸牌阶段,你多摸四张牌。②你使用【杀】的次数上限+1。", + yijin_jinmi: "金迷", + yijin_jinmi_info: "锁定技。回合开始时,你跳过下一个出牌阶段和弃牌阶段。", + yijin_guxiong: "贾凶", + yijin_guxiong_info: "锁定技。①出牌阶段开始时,你失去1点体力。②你的手牌上限-3。", + yijin_tongshen: "通神", + yijin_tongshen_info: "锁定技。当你受到非雷电伤害时,防止之。", + yijin_yongbi: "拥蔽", + yijin_yongbi_info: "锁定技。准备阶段,你跳过下一个摸牌阶段。", + yijin_houren: "厚任", + yijin_houren_info: "锁定技。回合结束时,你回复3点体力。", + guanzong: "惯纵", + guanzong_info: "出牌阶段限一次。你可以令一名其他角色视为对另一名其他角色造成过1点伤害。", + yangfu: "杨阜", + jiebing: "借兵", + jiebing_info: "锁定技。当你受到伤害后,你选择来源外的一名其他角色,随机获得其一张牌并展示。若此牌为装备牌,你使用之。", + hannan: "扞难", + hannan_info: "出牌阶段限一次。你可以与一名角色拼点,赢的角色对没赢的角色造成2点伤害。", + xin_wuyi: "手杀界吴懿", + xin_wuyi_prefix: "手杀界", + sbbenxi: "奔袭", + sbbenxi_info: "出牌阶段开始时,你可以弃置至少一张牌,然后你于此阶段获得如下效果:①你至其他角色距离-X;②当你使用的下一张基本牌或普通锦囊牌A选择目标后,你可以额外指定X名距离为1的角色为目标;③牌A结算结束后,若此牌造成过伤害,你摸五张牌(X为你以此法弃置的牌数)。", + xin_zhuzhi: "手杀界朱治", + xin_zhuzhi_prefix: "手杀界", + sbanguo: "安国", + sbanguo_info: "①游戏开始时,你令一名其他角色获得1枚“安国”标记(有“安国”的角色手牌上限基数等于体力上限)。②出牌阶段开始时,你可以将一名有“安国”的角色的所有“安国”移动给一名本局游戏未获得过“安国”的其他角色。③当你受到伤害时,若有有“安国”的角色且伤害值不小于你的体力值且此伤害没有来源或来源没有“安国”,防止此伤害。④一名角色进入濒死状态时,若其有你因〖安国①〗获得的“安国”,你移去其该“安国”,令其将体力回复至1点。然后你选择一项:1.若你的体力值大于1,你失去体力至1点;2.若你的体力上限大于1,你将体力上限减至1。最后你令其获得1点护甲。", + wangjun: "手杀王濬", + wangjun_prefix: "手杀", + zhujian: "筑舰", + zhujian_info: "出牌阶段限一次。你可以令至少两名装备区里有牌的角色各摸一张牌。", + duansuo: "断索", + duansuo_info: "出牌阶段限一次。你可以重置任意名处于连环状态的角色,然后对这些角色各造成1点火焰伤害。", + sp_pengyang: "手杀彭羕", + sp_pengyang_prefix: "手杀", + spdaming: "达命", + spdaming_info: "①游戏开始时,你获得1点“达命”值。②其他角色A的出牌阶段限一次。其可以交给你一张牌,然后你选择另一名其他角色B。若B有与此牌相同类型的牌,其将一张该类型的牌交给A,你获得1点“达命”值;否则你将此牌交给A。", + spxiaoni: "嚣逆", + spxiaoni_info: "①出牌阶段限一次。若你的“达命”值大于0,你可以将一张牌当任意一种【杀】或伤害类锦囊牌使用。然后你减少等同于此牌指定目标数的“达命”值。②你的手牌上限基数为X(X为“达命”值,且至多为你的体力值,至少为0)。", + xin_zhuhuan: "手杀界朱桓", + xin_zhuhuan_prefix: "手杀界", + xinpingkou: "平寇", + xinpingkou_info: "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。然后你从牌堆中获得一张装备牌。", + xin_caoxiu: "手杀界曹休", + xin_caoxiu_prefix: "手杀界", + xinqingxi: "倾袭", + xinqingxi_info: "每回合限一次。当你对其他角色造成伤害时,你可以令其选择一项:1.弃置X张手牌(X为4减去你至其的距离,至少为1);2.令此伤害+1。", + yj_weiyan: "☆魏延", + yj_weiyan_prefix: "☆", + mbguli: "孤厉", + mbguli_info: "出牌阶段限一次。你可以将所有手牌当做一张无视防具的【杀】使用。此牌结算结束后,若此牌造成过伤害,你可以失去1点体力并将手牌摸至X张(X为你的体力上限)。", + mbaosi: "骜肆", + mbaosi_info: "锁定技。当你于出牌阶段对一名攻击范围内的角色造成伤害后,你于此阶段对其使用牌无次数限制。", + xin_zhoutai: "手杀界周泰", + xin_zhoutai_prefix: "手杀界", + re_yanwen: "手杀界颜良文丑", + re_yanwen_prefix: "手杀界", + qianzhao: "手杀牵招", + qianzhao_prefix: "手杀", + mbshihe: "势吓", + mbshihe_info_identity: "出牌阶段限一次。你可以与一名角色拼点。若你:赢,当其于其下回合结束前对你造成伤害时,取消之;没赢,你随机弃置一张牌。", + mbshihe_info: "出牌阶段限一次。你可以与一名角色拼点。若你:赢,当其于其下回合结束前对你和你的友方角色造成伤害时,取消之;没赢,你随机弃置一张牌。", + mbzhenfu: "镇抚", + mbzhenfu_info: "结束阶段,若你本回合因弃置失去过牌,你可以令一名其他角色获得1点护甲。", + shichangshi: "十常侍", + mbdanggu: "党锢", + mbdanggu_info: "锁定技。①游戏开始时,你获得十张“常侍”牌,然后你进行一次结党。②当你修整结束后,你进行一次结党并摸一张牌。③若你有亮出的“常侍”牌,你视为拥有这些牌的技能。", + mbdanggu_faq: "关于结党", + mbdanggu_faq_info: "
    系统随机选择一张未亮出过的“常侍”牌,然后选择四张未亮出过的“常侍”牌。你观看前者,然后从后者中选择一名认可前者的“常侍”牌。然后若此时不为双将模式,你将这两张武将牌作为你的武将牌(不移除原有技能);否则你获得这两张武将牌上的技能。", + mbdanggu_faq2: "关于认可", + mbdanggu_faq2_info: "
    双向不认可常侍为固定组合:
  • 郭胜、段珪
  • 韩悝、毕岚
    单向不认可常侍为系统随机分配。
    每次结党至多存在一张不认可主将的常侍牌,且若此次结党仅有一张常侍牌,则不会存在不认可情况。", + mbmowang: "殁亡", + mbmowang_info: "锁定技。①当你死亡前,若你有未亮出的“常侍”牌且体力上限大于0,你将死亡改为修整至你的下个回合开始前,然后你复原武将牌,且不于此次死亡事件中进行展示身份牌、检测游戏胜利条件与执行奖惩的流程。②回合结束后,你死亡。", + mbmowang_faq: "关于修整", + mbmowang_faq_info: "
    将武将牌移出游戏(视为你存活)。当该角色修整结束,其移回游戏。", + scs_zhangrang: "张让", + scstaoluan: "滔乱", + scstaoluan_info: "出牌阶段限一次。你可以将一张牌当任意一种基本牌或普通锦囊牌使用。", + scs_zhaozhong: "赵忠", + scschiyan: "鸱咽", + scschiyan_info: "①当你使用【杀】指定目标后,你可以将其的一张牌置于其武将牌上,然后其于当前回合结束时获得这些牌。②当你因执行【杀】的效果对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,此伤害+1。", + scs_sunzhang: "孙璋", + scszimou: "自谋", + scszimou_info: "锁定技。出牌阶段,当你使用第二/四/六张牌时,你从牌堆中获得一张【酒】/【杀】/【决斗】。", + scs_bilan: "毕岚", + scspicai: "庀材", + scspicai_info: "出牌阶段限一次。你可进行判定牌不置入弃牌堆的判定。若判定结果与本次发动技能时的其他判定结果的花色均不相同,则你可以重复此流程。然后你将所有位于处理区的判定牌交给一名角色。", + scs_xiayun: "夏恽", + scsyaozhuo: "谣诼", + scsyaozhuo_info: "出牌阶段限一次。你可以与一名角色拼点,若你赢,其跳过下一个摸牌阶段;若你没赢,你弃置两张牌。", + scs_hankui: "韩悝", + scsxiaolu: "宵赂", + scsxiaolu_info: "出牌阶段限一次。你可以摸两张牌,然后选择一项:1.弃置两张牌;2.将两张牌交给一名其他角色。", + scs_lisong: "栗嵩", + scskuiji: "窥机", + scskuiji_info: "出牌阶段限一次。你可以观看一名其他角色的手牌,然后弃置你与其的共计四张花色各不相同的手牌。", + scs_duangui: "段珪", + scschihe: "叱吓", + scschihe_info: "当你使用【杀】指定唯一目标后,你可亮出牌堆顶的两张牌,令此【杀】的伤害值基数+X(X为亮出牌中花色与此【杀】相同的牌数),且目标角色不能使用亮出牌包含的花色的牌响应此【杀】。", + scs_guosheng: "郭胜", + scsniqu: "逆取", + scsniqu_info: "出牌阶段限一次。你可以对一名角色造成1点火焰伤害。", + scs_gaowang: "高望", + scsanruo: "安弱", + scsanruo_info: "你可以将一张♥牌当【桃】、♦牌当火【杀】、♣牌当【闪】、♠牌当【无懈可击】使用。当你以此法使用或打出【杀】或【闪】时,你可以获得对方的一张牌;当你以此法使用【桃】时,你可以获得一名其他角色的一张牌;当你以此法使用【无懈可击】时,你可以获得此牌响应的普通锦囊牌的使用者的一张牌。", + scsmiaoyu: "妙语", + scsmiaoyu_info: "你可以将至多两张相同花色的牌按照以下规则使用或打出:♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。", + re_xiaoqiao: "手杀界小乔", + re_xiaoqiao_prefix: "手杀界", + xin_sunliang: "手杀孙亮", + xin_sunliang_prefix: "手杀", + xinkuizhu: "溃诛", + xinkuizhu_info: "弃牌阶段结束后,你可以选择一项:1.令至多X名角色各摸一张牌。2.对任意名体力值之和为X的角色造成1点伤害,若你以此法选择的角色数不小于2,你失去1点体力。(X为你此阶段弃置的牌数)", + xinzhizheng: "掣政", + xinzhizheng_info: "锁定技,你的出牌阶段内,攻击范围内不包含你的其他角色不能成为你使用牌的目标。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。", + xinlijun: "立军", + xinlijun_info: "主公技,其他吴势力角色于其回合内使用【杀】结算完毕后,其可以将此【杀】对应的实体牌交给你,然后你可以令其摸一张牌。", + xin_zhangyi: "手杀界张嶷", + xin_zhangyi_prefix: "手杀界", + xinwurong: "怃戎", + xinwurong_info: "出牌阶段限一次,你可以与一名其他角色进行谋弈:
  • 若你选择“镇压”且其选择“反抗”,你对其造成1点伤害,然后你摸一张牌。
  • 若你选择“安抚”且其选择“归顺”,其须交给你两张牌(若其牌数不足两张,则改为令其跳过其下个摸牌阶段)。
  • 若你选择“镇压”且其选择“归顺”,你获得其一张牌,然后你交给其两张牌。
  • 若你选择“安抚”且其选择“反抗”,你受到1点伤害,然后你摸两张牌。", + xin_guozhao: "手杀郭照", + xin_guozhao_prefix: "手杀", + yichong: "易宠", + yichong_info: "①准备阶段,你可以选择一名其他角色并选择一个花色,然后你获得其所有此花色的装备牌和其一张此花色的手牌,移除场上的所有“雀”标记,令其获得“雀”标记直到你的下个回合开始。②拥有“雀”标记的角色获得你最后一次发动〖易宠①〗选择的花色的牌后,你获得这些牌(你至多通过每个“雀”得到一张牌)。", + wufei: "诬诽", + wufei_info: "若场上存在拥有“雀”标记的角色A,则:①当你使用【杀】或伤害类锦囊牌指定第一个目标后,你令A成为此牌伤害来源。②当你受到伤害后,若A的体力值大于3,则你可以令A受到1点无来源伤害。", + yj_zhoubuyi: "☆周不疑", + yj_zhoubuyi_prefix: "☆", + mbhuiyao: "慧夭", + mbhuiyao_info: "出牌阶段限一次。你可以受到1点无来源伤害,然后你选择一名其他角色,令其视为对另一名角色造成过1点伤害。", + mbquesong: "雀颂", + mbquesong_info: "一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸X张牌并复原武将牌(X为3,若其装备区非宝物牌牌数不小于三张则X为2);2.回复1点体力。", + xin_yuanshao: "手杀界袁绍", + xin_yuanshao_prefix: "手杀界", + re_baosanniang: "手杀鲍三娘", + re_baosanniang_prefix: "手杀", + re_liushan: "手杀界刘禅", + re_liushan_prefix: "手杀界", + re_sunben: "界孙笨", + re_sunben_prefix: "界", + re_zhangzhang: "手杀界张昭张纮", + re_zhangzhang_prefix: "手杀界", + re_caozhi: "手杀界曹植", + re_caozhi_prefix: "手杀界", + re_sunjian: "手杀界孙坚", + re_sunjian_prefix: "手杀界", + sunru: "手杀孙茹", + sunru_prefix: "手杀", + pangdegong: "手杀庞德公", + pangdegong_prefix: "手杀", + zhaotongzhaoguang: "手杀赵统赵广", + zhaotongzhaoguang_prefix: "手杀", + re_liru: "手杀界李儒", + re_liru_prefix: "手杀界", + re_chenqun: "手杀界陈群", + re_chenqun_prefix: "手杀界", + old_yuanshu: "手杀袁术", + old_yuanshu_prefix: "手杀", + baoxin: "鲍信", + mutao: "募讨", + mutao_info: "出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】置于武将牌上,然后将这些牌依次随机交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。", + yimou: "毅谋", + yimou_info: "当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色,然后摸一张牌。", + jiangji: "手杀蒋济", + jiangji_prefix: "手杀", + jilun: "机论", + jilun_info: "①当你受到伤害后,若你拥有技能〖急筹〗,则你可以一项:1.摸两张牌。2.获得1枚“机论”标记。②一名角色的结束阶段,若你拥有“机论”,则重复选择执行以下项直到你没有“机论”标记:1.失去1枚“机论”标记,视为使用一张〖急筹①〗记录过且未被〖机论②〗记录过的普通锦囊牌并记录此牌牌名。2.失去所有“机论”标记。", + liwei: "李遗", + jiaohua: "教化", + jiaohua_backup: "教化", + jiaohua_info: "出牌阶段限两次,你可以选择一个未被〖教化〗记录过的牌的类型,令一名角色从牌堆中获得一张此类型的牌,然后记录此类型,若基本、锦囊、装备均已被你发动〖教化〗记录,则你清空〖教化〗记录。", + laimin: "来敏", + laishou: "来寿", + laishou_info: "锁定技。①当你受到伤害值大于等于你的体力值的伤害时,若你的体力上限小于9,你防止此伤害并增加等量体力上限。②准备阶段,若你的体力上限不小于9,你死亡。", + luanqun: "乱群", + luanqun_info: "出牌阶段限一次,若你有手牌,则你可以令所有有手牌的角色同时展示一张手牌,然后你可以获得其中一张与你展示的牌颜色相同的展示牌,所有本次展示牌颜色与你展示的牌颜色不同的角色的下个出牌阶段使用的第一张【杀】只能对你使用,且此【杀】不可被响应。", + xin_wuban: "吴班", + xinjintao: "进讨", + xinjintao_info: "锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】不可被响应,第二张【杀】伤害+1。", + xinlianhuan: "连环", + xinlianhuan_info: "你可以将一张♣手牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。", + mb_sunluyu: "手杀孙鲁育", + mb_sunluyu_prefix: "手杀", + mbmumu: "穆穆", + mbmumu_info: "出牌阶段开始时,你可以选择一项:1.弃置场上的一张装备牌;2.获得场上的一张防具牌,然后你本回合不能使用或打出【杀】。", + mbmeibu: "魅步", + mbmeibu_info: "其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。", + mbzhixi: "止息", + mbzhixi_info: "锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。", + yanxiang: "阎象", + kujian: "苦谏", + kujian_info: "出牌阶段限一次,你可以将至多两张手牌称为“谏”并交给一名其他角色,然后你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸两张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。", + mb_xianglang: "手杀向朗", + mb_xianglang_prefix: "手杀", + naxue: "纳学", + naxue_info: "你可以跳过出牌阶段。若如此做,你可以弃置任意张牌并摸等量的牌,然后你可以交给至多两名其他角色各一张手牌。", + yijie: "遗诫", + yijie_info: "锁定技。当你死亡时,你令所有其他角色将体力回复或失去至X(X为所有其他角色的体力之和除以所有其他角色数,向下取整,且X至少为1)。", + mb_chengui: "手杀陈珪", + mb_chengui_prefix: "手杀", + guimou: "诡谋", + guimou_info: "锁定技。游戏开始时/回合结束时,你随机/须选择以下一项直到你的下个准备阶段:①记录场上期间角色使用牌数;②记录期间场上角色弃置牌数;③记录期间场上角色获得牌数。准备阶段,你可以选择一名场上对应记录数值最少的其他角色,观看其手牌并选择其中一张牌,然后你将此牌交给另一名其他角色或弃置此牌。", + zhouxian: "州贤", + zhouxian_info: "锁定技。当你成为其他角色使用的伤害类卡牌的目标后,你亮出牌堆顶的三张牌,然后其须选择一项:①弃置一张与亮出牌之一类别相同的牌;②令此牌对你无效。", + mb_huban: "手杀胡班", + mb_huban_prefix: "手杀", + mbyilie: "义烈", + mbyilie2: "义烈", + mbyilie3: "义烈", + mbyilie_info: "锁定技。①游戏开始时,你选择一名其他角色,然后你获得以下效果:其受到伤害时,若你没有“烈”,则你获得等同于伤害值的“烈”标记,然后防止此伤害;其对其他角色造成伤害后,你回复1点体力。②结束阶段,若你拥有“烈”标记,你摸一张牌并失去X点体力,然后移去所有“烈”(X为你拥有的“烈”标记数)。", + muludawang: "木鹿大王", + shoufa: "兽法", + shoufa_info: "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名与你距离大于/不大于2的角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。", + shoufa_info_doudizhu: "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名与你距离大于/不大于1的角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。", + yuxiang: "御象", + yuxiang_info: "锁定技,若你有护甲值,则:①你计算与其他角色的距离-1,其他角色计算与你的距离+1;②当你受到火焰伤害时,此伤害+1。", + zhoulin: "咒鳞", + zhoulin_info: "限定技,出牌阶段,你可以获得2点护甲值,然后选择一个“兽法”效果,你发动〖兽法〗的执行效果改为你选择的效果直到你的下个回合结束。", + xin_huojun: "手杀霍峻", + xin_huojun_prefix: "手杀", + sidai: "伺怠", + sidai_info: "限定技,出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限。", + jieyu: "竭御", + jieyu_info: "结束阶段,你可以从弃牌堆中获得共X张不同牌名的基本牌(X为4-你上次发动〖竭御〗至今你成为其他角色使用伤害类卡牌目标的次数,且X至少为1)。", + jieyu_info_identity: "结束阶段,你可以从弃牌堆中获得共X张不同牌名的基本牌(X为3-你上次发动〖竭御〗至今你成为其他角色使用伤害类卡牌目标的次数,且X至少为1)。", + yangfeng: "杨奉", + mbxuetu: "血途", + mbxuetu_info: "转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。", + mbxuetu_achieve: "血途·成功", + mbxuetu_achieve_info: "出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。", + mbxuetu_fail: "血途·失败", + mbxuetu_fail_info: "转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。", + mbweiming: "威命", + mbweiming_info: "使命技,锁定技。①出牌阶段开始时,你记录一名未以此法记录过的角色。②成功:当你杀死一名未被〖威命①〗记录过的角色后,修改〖血途〗为成功版本。③失败:当一名被〖威命①〗记录过的角色死亡后,你修改〖血途〗为失败版本。", + lizhaojiaobo: "李昭焦伯", + mbzuoyou: "佐佑", + mbzuoyou_info: "转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张手牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。", + mbshishou: "侍守", + mbshishou_info: "锁定技。当你发动〖佐佑〗后,若目标角色不为你,你执行〖佐佑〗中目标角色未执行的一项。", + chengji: "成济", + mbkuangli: "狂戾", + mbkuangli_info: "锁定技。①出牌阶段开始时,你随机令场上任意名其他角色获得“狂戾”标记。②出牌阶段限两次。当你使用牌指定有“狂戾”的角色为目标后,你与其各随机弃置一张牌,然后你摸一张牌。③回合结束时,你移除所有角色的“狂戾”。", + mbxiongsi: "凶肆", + mbxiongsi_info: "限定技。出牌阶段,若你的手牌数不少于三张,你可以弃置所有手牌,然后令所有其他角色依次失去1点体力。", + mb_sp_guanqiujian: "SP毌丘俭", + mb_sp_guanqiujian_prefix: "SP", + mbcuizhen: "摧阵", + mbcuizhen_info_identity: "①游戏开始时,你可以废除至多两名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。", + mbcuizhen_info: "①当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。②摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。", + mbkuili: "溃离", + mbkuili_info: "锁定技。当你受到伤害后,你弃置等同于伤害值的手牌;若来源有被废除的武器栏,你令其恢复武器栏。", + mb_caomao: "手杀曹髦", + mb_caomao_prefix: "手杀", + mbqianlong: "潜龙", + mbqianlong_info: "①游戏开始时,你获得20枚“道心”标记。②当你得到牌后/受到1点伤害后/造成1点伤害后,你获得5/10/15枚“道心”(上限为100枚)。③若你的“道心”数不小于25/50/75/100,你视为拥有〖清正〗/〖酒诗〗/〖放逐〗/〖决进〗。", + mbcmqingzheng: "清正", + mbcmqingzheng_info: "出牌阶段开始时,你可以弃置两种花色的所有手牌,并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。", + mbcmjiushi: "酒诗", + mbcmjiushi_info: "①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌背面向上,你可以翻面。③当你翻面后,你获得牌堆里的一张锦囊牌。", + mbcmfangzhu: "放逐", + mbcmfangzhu_info: "出牌阶段限一次。你可以选择一名其他角色,选择一项:⒈令其不能使用手牌中的非锦囊牌直到其回合结束;⒉令其所有非Charlotte技能失效直到其回合结束。", + mbjuejin: "决进", + mbjuejin_info: "限定技。出牌阶段,你可以令所有角色依次将体力回复或失去至1并获得X点护甲(X为一名角色以此法变化的体力值)。然后你增加如下“向死存魏”的全局技能:当有牌进入弃牌堆后,系统将这些牌中的【闪】、【桃】和【酒】移出游戏。", + mbweitong: "卫统", + mbweitong_info: "主公技。游戏开始时,若你有〖潜龙〗,你获得20X枚“道心”(X为其他魏势力角色数)。", +}; + +export default translates; diff --git a/character/mobile/voices.js b/character/mobile/voices.js new file mode 100644 index 000000000..f2cec8320 --- /dev/null +++ b/character/mobile/voices.js @@ -0,0 +1,727 @@ +export default { + "#mbcuizhen": null, + "#mbcuizhen1": "欲活命者,还不弃兵卸甲!", + "#mbcuizhen2": "全军大进,誓讨司马乱贼!", + "#mbkuili1": "此犹有转胜之机,吾等切不可自乱。", + "#mbkuili2": "不患败战于人,但恐军心已溃啊。", + "#mb_sp_guanqiujian:die": "汝不讨篡权逆臣,何杀吾讨贼义军……", + "#mbqianlong1": "朕为天子,岂忍威权而去!", + "#mbqianlong2": "朕行之决矣,正使死有何惧!", + "#mbqianlong3": "权臣震主,竟视天子于无物!", + "#mbqianlong4": "假以时日,必讨司马一族!", + "#mbqianlong5": "若安司马于外,或则皇权可收。", + "#mbqianlong6": "暗恤忠君之士,以待破敌之机。", + "#mbweitong1": "手无实权难卫统,朦胧沉睡,睡去还惊。", + "#mb_caomao:die": "纵不成身死,朕亦为太祖子孙,大魏君王……", + "#mbkuangli1": "我已受命弑君,汝等还不散去!", + "#mbkuangli2": "谁再聚众作乱,我就将其杀之!", + "#mbxiongsi1": "既想杀人灭口,那就同归于尽!", + "#mbxiongsi2": "贾充!你不仁就别怪我不义!", + "#chengji:die": "汝等要卸磨杀驴吗?额啊……", + "#mbzuoyou1": "陛下亲讨乱臣,臣等安不随护!", + "#mbzuoyou2": "纵有亡身之险,亦忠陛下一人。", + "#mbshishou1": "此乃天子御驾,尔等谁敢近前!", + "#mbshishou2": "吾等侍卫在侧,必保陛下无虞!", + "#lizhaojiaobo:die": "陛下!尔等乱臣,安敢弑君,额啊……", + "#mbxuetu1": "天子依仗在此,逆贼安扰圣驾。", + "#mbxuetu2": "末将救驾来迟,还望陛下恕罪。", + "#mbweiming1": "诸位东归洛阳,奉愿随驾以护。", + "#mbweiming2": "不遵皇命,视同倡乱之贼。", + "#mbweiming3": "布局良久,于今功亏一篑啊!", + "#yangfeng:die": "刘备!本共图吕布,何设鸿门相欺!", + "#twsidai1": "敌军疲乏,正是战机,随我杀!", + "#twsidai2": "敌军无备,随我冲锋!", + "#twjieyu1": "葭萌,蜀之咽喉,峻必竭力守之。", + "#twjieyu2": "吾头可得,城不可得。", + "#xin_huojun:die": "恨,不能与使君共成霸业……", + "#shoufa1": "虎豹豺狼,皆听我令!", + "#shoufa2": "毒蛇恶蝎,奉旨而行!", + "#zhoulin1": "本大王承天大法,岂与诸葛亮小计等同!", + "#zhoulin2": "料一山野书生,安识我南中御兽之术!", + "#yuxiang": "额啊啊,好大的火光啊!", + "#muludawang:die": "啊啊,诸葛亮神人降世,吾等难挡天威。", + "#guimou1": "不过卒合之师,岂是将军之敌乎?", + "#guimou2": "连鸡势不俱栖,依珪计便可一一解离。", + "#zhouxian1": "今未有苛暴之乱,汝敢言失政之语。", + "#zhouxian2": "曹将军神武应期,如何以以身试祸。", + "#mb_chengui:die": "布非忠良之士,将军宜早图之……", + "#mbyilie1": "禽兽尚且知义,而况于人乎?", + "#mbyilie2": "班虽无名,亦有忠义在骨!", + "#mbyilie3": "身不慕生,宁比泰山之重!", + "#mb_huban:die": "生虽微而志不可改,位虽卑而节不可夺……", + "#naxue1": "诸位正值年少,勿负此读书良时。", + "#naxue2": "老夫积书万卷,可供诸生阅览。", + "#yijie1": "《传》称师克在和不在众,此言天地和则万物生。", + "#yijie2": "君臣和则国家平,九族和则家族兴。", + "#mb_xianglang:die": "子曰:有教无类。惜哉,未入学者多矣……", + "#twkujian1": "吾之所言,皆为公之大业。", + "#twkujian2": "明公虽奕世克昌,未若有周之盛。", + "#twkujian3": "公岂徒有纳谏之名乎?", + "#twruilian1": "公若擅进庸肆,必失民心!", + "#twruilian2": "外敛虚进之势,内减弊民之政。", + "#yanxiang:die": "若遇明主,或可青史留名……", + "#meibu": null, + "#meibu1": "若要动手,就请先杀我吧!", + "#meibu2": "萧墙之乱,宫闱之衅,实为吴国之祸啊!", + "#mumu": null, + "#mumu1": "只求相夫教子,不求参政议事。", + "#mumu2": "立储乃国家大事,我们姐妹不便参与。", + "#mb_sunluyu:die": "姐姐,你且好自为之……", + "#jintao1": "一雪前耻,誓报前仇!", + "#jintao2": "量敌而进,直讨吴境!", + "#xin_wuban:die": "恨,杀不尽吴狗!", + "#twmutao1": "董贼暴乱,天下定当奋节讨之!", + "#twmutao2": "募州郡义士,讨祸国逆贼!", + "#twyimou1": "今畜士众之力,据其要害,贼可破之。", + "#twyimou2": "泰然若定,攻敌自溃!", + "#baoxin:die": "区区黄巾流寇,如何挡我?呃啊……", + "#twjichou1": "此危亡之时,当出此急谋。", + "#twjichou2": "急筹布画,运策捭阖。", + "#twjilun1": "时移不移,违天之祥也。", + "#twjilun2": "民望不因,违人之咎也。", + "#jiangji:die": "洛水之誓,言犹在耳……咳咳咳……", + "#twjiaohua1": "教民崇化,以定南疆。", + "#twjiaohua2": "知礼数,崇王化,则民不复叛矣。", + "#liwei:die": "安南重任,万不可轻之……", + "#laishou1": "黄耇鲐背,谓之永年。", + "#laishou2": "养怡和之福,得乔松之寿。", + "#laishou3": "福寿将终,竟未得期颐!", + "#luanqun1": "年过杖朝,自是从心所欲,何来逾矩之理?", + "#luanqun2": "位居执慎,博涉多闻,更应秉性而论!", + "#laimin:die": "狂嚣之言,一言十过啊……", + "#mbhuiyao1": "幸有仓舒为伴,吾不至居高寡寒。", + "#mbhuiyao2": "通悟而无笃学之念,则必盈天下之叹也。", + "#mbquesong1": "承白雀之瑞,显周公之德。", + "#mbquesong2": "挽汉室于危亡,继光武之中兴。", + "#yj_zhoubuyi:die": "慧童亡,天下伤……", + "#yichong1": "处椒房之尊,得陛下隆宠!", + "#yichong2": "三千宠爱?当聚于我一身!", + "#wufei1": "巫蛊实乃凶邪之术,陛下不可不察!", + "#wufei2": "妾不该多言,只怕陛下为其所害。", + "#xin_guozhao:die": "不觉泪下……沾衣裳……", + "#xinwurong1": "平乱羌!抚蛮夷!开旧道!复驿亭!", + "#xinwurong2": "识断明果,以肃越嵩千里蛮疆。", + "#xinwurong3": "蛮不从化,化不及蛮,此嶷之过矣。", + "#shizhi_xin_zhangyi1": null, + "#shizhi_xin_zhangyi2": null, + "#xin_zhangyi:die": "北伐未捷,臣必杀身以报陛下!", + "#nzry_zhizheng1": "风驰电掣,政权不怠!", + "#nzry_zhizheng2": "廉平掣政,实为艰事。", + "#nzry_kuizhu1": "子通专恣,必谋而诛之!", + "#nzry_kuizhu2": "孙綝久专,不可久忍,必溃诛!", + "#nzry_lijun11": "立于朝堂,定于军心。", + "#nzry_lijun12": "君立于朝堂,军侧于四方!", + "#xin_sunliang:die": "今日欲诛逆臣而不得,方知机事不密则害成…", + "#tianxiang_re_xiaoqiao1": "盈盈一笑,娇花照水~", + "#tianxiang_re_xiaoqiao2": "月容花貌难自弃。", + "#xinhongyan1": null, + "#xinhongyan2": null, + "#re_xiaoqiao:die": "周郎……等我……", + "#mbdanggu1": null, + "#mbdanggu2": null, + "#mbmowang1": null, + "#mbmowang2": null, + "#shichangshi:die": null, + "#rezhijian1": "为臣之道,在于直言无讳。", + "#rezhijian2": "谏言或逆耳,于国无一害。", + "#guzheng_re_zhangzhang1": "为君者,不可肆兴土木,奢费物力。", + "#guzheng_re_zhangzhang2": "安民固国,方可思动。", + "#re_zhangzhang:die": "只恨不能为东吴百姓再谋一日福祉……", + "#mbshihe1": "此举关乎福祸,还请峭王明察!", + "#mbshihe2": "汉乃天朝上国,岂是辽东下郡可比?", + "#mbzhenfu1": "储资粮,牧良畜,镇外贼,抚黎庶。", + "#mbzhenfu2": "通民户十万余众,镇大小夷虏晏息。", + "#qianzhao:die": "治边数载,虽不敢称功,亦可谓无过……", + "#shuangxiong_re_yanwen1": "哥哥,且看我与赵云一战!——先与他战个五十回合!", + "#shuangxiong_re_yanwen2": "此战如有你我一人在此,何惧华雄?——定叫他有去无回!", + "#re_yanwen:die": "不是叫你看好我身后吗……", + "#buqu1": "哼!这点小伤算什么。", + "#buqu2": "战如熊虎,不惜躯命!", + "#fenji1": "百战之身,奋勇趋前!", + "#fenji2": "两肋插刀,愿赴此躯!", + "#xin_zhoutai:die": "敌众我寡,无力回天……", + "#reluoying1": "转蓬离本根,飘摇随长风。", + "#reluoying2": "高树多悲风,海水扬其波。", + "#rejiushi1": "乐饮过三爵,缓带倾庶羞。", + "#rejiushi2": "归来宴平乐,美酒斗十千。", + "#chengzhang": null, + "#chengzhang1": "弦急悲声发,聆我慷慨言。", + "#chengzhang2": "盛时不再来,百年忽我遒。", + "#re_caozhi:die": "先民谁不死,知命复何忧?", + "#mbguli1": "今若弑此昏聩主,纵蒙恶名又如何?", + "#mbguli2": "韩玄少谋多忌,吾今当诛之!", + "#mbaosi1": "凶慢骜肆,天生狂骨!", + "#mbaosi2": "暴戾恣睢,傲视诸雄!", + "#yj_weiyan:die": "使君为何弃我而去……呃啊!", + "#redingpin1": "察举旧制已隳,简拔当立中正。", + "#redingpin2": "置州郡中正,以九品进退人才。", + "#refaen1": "法不可容之事,情或能原宥。", + "#refaen2": "严刑峻法,万望慎行。", + "#re_chenqun:die": "立身纯且粹,一死复何忧……", + "#qianju": null, + "#qianju1": null, + "#qianju2": null, + "#xinqingxi1": "此残兵败将,胜之若儿戏耳!", + "#xinqingxi2": "有休在此,主公何虑?哈哈哈哈!", + "#xin_caoxiu:die": "此战大败,休甚是羞惭啊……", + "#fenli_xin_zhuhuan1": "为主制客,乃百战百胜之势。", + "#fenli_xin_zhuhuan2": "诸位且与我勠力一战,自可得胜。", + "#xinpingkou1": "等候多时,为的便是今日之胜。", + "#xinpingkou2": "一鼓作气,击败疲敝之敌!", + "#xin_zhuhuan:die": "为将不行前而为人下,非可生受之辱……", + "#spdaming1": "幸蒙士元斟酌,诣公于葭萌,达命于蜀川。", + "#spdaming2": "论治图王,助吾主成就大业。", + "#spdaming3": "心大志广,愧公知遇之恩。", + "#spxiaoni1": "织席贩履之辈,果无用人之能乎?", + "#spxiaoni2": "古今天下,岂有重屠沽之流而轻贤达者乎?", + "#sp_pengyang:die": "招祸自咎,无不自己……", + "#zhujian1": "修橹筑楼舫,伺时补金瓯。", + "#zhujian2": "连舫披金甲,王气自可收。", + "#duansuo1": "吾心如炬,无碍寒江铁索。", + "#duansuo2": "熔金断索,克敌建功!", + "#wangjun:die": "问鼎金瓯碎,临江铁索寒……", + "#sbanguo1": "感文台知遇,自当鞠躬尽瘁,扶其身后之业。", + "#sbanguo2": "安国定邦,克成东南一统!", + "#sbanguo3": "孙氏为危难之际,吾当尽力辅之!", + "#xin_zhuzhi:die": "臣辅孙氏三代之业,今年近古稀,死而无憾。", + "#sbbenxi1": "战事唯论成败,何惜此等无用之物?", + "#sbbenxi2": "汝等惊弓之鸟,亦难逃吾奔战穷击!", + "#sbbenxi3": "袍染雍凉落日,马过岐山残雪!", + "#xin_wuyi:die": "吾等虽不惧蜀道之险,却亦难过这渭水长安……", + "#jiebing1": "敌寇势大,情况危急,只能多谢阁下。", + "#jiebing2": "将军借兵之恩,阜退敌后自当报还。", + "#hannan1": "贼寇虽勇,阜亦戮力以捍!", + "#hannan2": "纵使信布之勇,亦非无策可当!", + "#yangfu:die": "汝背父叛君,吾誓,杀……", + "#yijin1": "吾家资巨万,无惜此两贯三钱!", + "#yijin2": "小儿持金过闹市,哼!杀人何需我多劳!", + "#yijin3": "普天之下,竟有吾难市之职?", + "#guanzong1": "汝为叔父,怎可与小辈计较!", + "#guanzong2": "阿瞒生龙活虎,汝切勿胡言!", + "#sp_caosong:die": "长恨人心不如水,等闲平地起波澜……", + "#rejuece1": "束手就擒吧!", + "#rejuece2": "斩草除根,以绝后患!", + "#remieji1": "就是要让你无路可走!", + "#remieji2": "你也逃不了!", + "#xinfencheng_re_liru1": "千里皇城,尽作焦土!", + "#xinfencheng_re_liru2": "荣耀、权力、欲望、统统让这大火焚灭吧!", + "#re_liru:die": "吾等皆死于妇人之手矣!", + "#reqiangxi1": "铁戟双提八十斤,威风凛凛震乾坤!", + "#reqiangxi2": "勇字当头,义字当先!", + "#re_dianwei:die": "汝等小儿,竟敢害我!拿命来!", + "#chengye1": "勤学于未长,立志于未壮。", + "#chengye2": "志在坚且行,学在勤且久。", + "#chengye3": "承继族贤之业,弘彰孔儒之学。", + "#buxu1": "今世俗儒穿凿,不加补续,恐疑误后学。", + "#buxu2": "经籍去圣久远,文字多谬,当正定《六经》。", + "#xin_mamidi:die": "袁公路!汝怎可欺我!", + "#mingcha1": "明主可以理夺,怎可以情求之?", + "#mingcha2": "祸见于此,何免之有?", + "#jingzhong1": "妾所乏为容,试问君有几德?", + "#jingzhong2": "君好色轻德,何谓百德皆备?", + "#ruanhui:die": "贱妾茕茕守空房,忧来思君不敢忘……", + "#sbyaoming1": "山不让纤介,而成其危;海不辞丰盈,而成其邃。", + "#sbyaoming2": "取上方可得中,取下则无所得矣。", + "#xin_quancong:die": "吾逐名如筑室道谋,而是用终不溃于成。", + "#quhu_re_xunyu1": "驱虎伤敌,保我无虞。", + "#quhu_re_xunyu2": "无需费我一兵一卒。", + "#rejieming1": "因势利导,是为良计。", + "#rejieming2": "杀身成仁,不负皇恩。", + "#re_xunyu:die": "命不由人,徒叹奈何……", + "#xinjianying1": "良谋百出,渐定决战胜势!", + "#xinjianying2": "佳策数成,破敌垂手可得!", + "#shibei_xin_jushou1": "只有杀身士,绝无降曹夫!", + "#shibei_xin_jushou2": "心向袁氏,绝无背离可言!", + "#xin_jushou:die": "授,无愧主公之恩……", + "#reanxu1": "贤淑重礼,育人育己。", + "#reanxu2": "雨露均沾,后宫不乱。", + "#zhuiyi_re_bulianshi1": "化作桃园只为君。", + "#zhuiyi_re_bulianshi2": "魂若有灵,当助夫君。", + "#re_bulianshi:die": "今生先君逝,来世再侍君……", + "#beige_re_caiwenji1": "人多暴猛兮如虺蛇,控弦披甲兮为骄奢。", + "#beige_re_caiwenji2": "两拍张弦兮弦欲绝,志摧心折兮自悲嗟。", + "#duanchang_re_caiwenji1": "雁高飞兮邈难寻,空断肠兮思愔愔。", + "#duanchang_re_caiwenji2": "为天有眼兮,为何使我独飘流?", + "#re_caiwenji:die": "今别子兮归故乡,旧怨平兮新怨长!", + "#mbdaoshu1": "嗨!不过区区信件,何妨故友一观?", + "#mbdaoshu2": "幸吾有备而来,不然为汝所戏矣。", + "#mbdaoshu3": "亏我一世英名,竟上了周瑜的大当。", + "#spdaizui1": "望丞相权且记过,容干将功折罪啊!", + "#spdaizui2": "干,谢丞相不杀之恩!", + "#sp_jianggan:die": "唉!假信害我不浅啊!", + "#xingtu": null, + "#xingtu1": "制图之体有六,缺一不可言精。", + "#xingtu2": "图设分率,则宇内地域皆可绘于一尺。", + "#juezhi": null, + "#juezhi1": "复设五等之制,以解天下土崩之势。", + "#juezhi2": "表为建爵五等,实则藩卫帝室。", + "#peixiu:die": "既食寒石散,便不可饮冷酒啊……", + "#rexianzhen1": "陷阵之志,有死无生!", + "#rexianzhen2": "攻则破城,战则克敌。", + "#rejinjiu1": "耽此黄汤,岂不误事?", + "#rejinjiu2": "陷阵营中,不可饮酒。", + "#re_gaoshun:die": "可叹主公知而不用啊!", + "#reganlu1": "玄德实乃佳婿呀。", + "#reganlu2": "好一个郎才女貌,真是天作之合啊。", + "#buyi_re_wuguotai1": "有我在,定保贤婿无余!", + "#buyi_re_wuguotai2": "东吴,岂容汝等儿戏!", + "#re_wuguotai:die": "诸位卿家,还请尽力辅佐仲谋啊……", + "#mobileyanzhu1": "计设辞阳宴,只为断汝头!", + "#mobileyanzhu2": "何需待午正?即刻送汝行!", + "#mobilexingxue1": "古者建国,教学为先,为时养器!", + "#mobilexingxue2": "偃武修文,以崇大化!", + "#zhaofu": null, + "#zhaofu1": "奉朕之诏,擒此国贼!", + "#zhaofu2": "天子震怒,贼臣授首。", + "#xin_sunxiu:die": "不求外取城地,但保大吴永安……", + "#bingqing1": "常怀圣言,以是自励。", + "#bingqing2": "身受贵宠,不忘初心。", + "#yingfeng": null, + "#yingfeng1": "公内奉天子,外令诸侯,则天下可定。", + "#yingfeng2": "公怀奉君之心,则民有安固之志。", + "#sp_maojie:die": "废立大事,公不可不慎……", + "#spshidi1": "诈败以射之,其必死矣!", + "#spshidi2": "呃啊,中其拖刀计矣!", + "#spyishi1": "昨日释忠之恩,今吾虚射以报。", + "#spyishi2": "君刀不砍头颅,吾箭只射盔缨。", + "#spqishe": null, + "#spqishe1": "诱敌之计已成,吾且拈弓搭箭!", + "#spqishe2": "关羽即至吊桥,既已控弦,如何是好?", + "#yj_huangzhong:die": "关云长义释黄某,吾又安忍射之……", + "#zhiyan_re_yufan1": "失忠于信,何以侍君!", + "#zhiyan_re_yufan2": "恕臣耿直,犯言谏正!", + "#rezongxuan1": "凡夫俗子,怎识得卦象玄妙?", + "#rezongxuan2": "微妙玄通,深不可识。", + "#re_yufan:die": "唉,主公不能容我。", + "#chongxu": null, + "#chongxu1": "阳炁冲三关,斩尸除阴魔。", + "#chongxu2": "蒲团清静坐,神归了道真。", + "#miaojian1": "谨以三尺玄锋,代天行化,布令宣威。", + "#miaojian2": "布天罡,踏北斗,有秽皆除,无妖不斩。", + "#shhlianhua1": "刀兵水火,速离身形。", + "#shhlianhua2": "体有金光,覆映全身。", + "#sunhanhua:die": "天有寒暑,人有死生……", + "#huantu1": "今群雄蜂起,主公宜外收内敛,勿为祸先。", + "#huantu2": "昔陈胜之事,足为今日之师,望主公熟虑。", + "#bihuo": null, + "#bihuo1": "公以败兵之身投之,功轻且恐难保身也。", + "#bihuo2": "公不若附之他人与相拒,然后委质,功必多。", + "#yanpu:die": "公皆听吾计,圃岂敢不专……", + "#jibing1": "集荆、扬精兵,而后共举大义!", + "#jibing2": "教众快快集合,不可误了大事!", + "#wangjing1": "联络朝中中常侍,共抗朝廷不义师!", + "#wangjing2": "往来京城,与众常侍密谋举事!", + "#moucuan1": "汉失民心,天赐良机!", + "#moucuan2": "天下正主,正是大贤良师!", + "#mayuanyi:die": "唐周……无耻!", + "#xunde1": "陛下所托,臣必尽心尽力!", + "#xunde2": "纵吾荏弱难持,亦不推诿君命!", + "#chenjie1": "臣心怀二心,不可事君也。", + "#chenjie2": "竭力致身,以尽臣节。", + "#simafu:die": "身辅六公,亦难报此恩……", + "#jueyong1": "敌围何惧,有死而已!", + "#jueyong2": "身陷敌阵,战而弥勇!", + "#poxiang1": "王瓘既然假降,吾等可将计就计。", + "#poxiang2": "佥率已降两千魏兵,便可大破魏军主力。", + "#fuqian:die": null, + "#disordersidi1": "司敌之动,先发而制。", + "#disordersidi2": "料敌之行,伏兵灭之。", + "#xin_caozhen:die": "雍凉动乱,皆吾之过也……", + "#xinzenhui1": "本公主说你忤逆,岂能有假?", + "#xinzenhui2": "不用挣扎了,你们谁都逃不了!", + "#xinjiaojin1": "狂妄之徒!忘了你自己的身份了吗?", + "#xinjiaojin2": "和本公主比心机谋算?哼,可笑!", + "#xin_sunluban:die": "妹妹,姐姐是迫不得已……", + "#zhiming1": "天定人命,仅可一窥。", + "#zhiming2": "知命而行,尽诸人事。", + "#xingbu1": "天现祥瑞,此乃大吉之兆。", + "#xingbu2": "天象显异,北伐万不可期。", + "#qiaozhou:die": "老夫死不足惜,但求蜀地百姓无虞!", + "#xinshenxing1": "事前多思,事后少悔。", + "#xinshenxing2": "权衡斟酌,再虑一番。", + "#bingyi_xin_guyong1": "志爱公利,道德纯备。", + "#bingyi_xin_guyong2": "秉持吾志,一心为公。", + "#xin_guyong:die": "陛下厚爱,雍……", + "#requanji1": "备兵驯马,以待战机。", + "#requanji2": "避其锋芒,权且忍让。", + "#zili_re_zhonghui1": "金鳞,岂是池中之物!", + "#zili_re_zhonghui2": "千载一时,鼎足而立!", + "#re_zhonghui:die": "伯约,我已无力回天……", + "#xinqieting1": "密言?哼!早已入我耳中。", + "#xinqieting2": "此子不除,久必为患!", + "#xianzhou_xin_caifuren1": "既是诸位之议,妾身复有何疑?", + "#xianzhou_xin_caifuren2": "我虽女流,亦知献州乃为长久之计。", + "#xin_caifuren:die": "琮儿!啊啊……", + "#mobilezhongyong1": "关将军,接刀!", + "#mobilezhongyong2": "青龙三停刀,斩敌万千条!", + "#xin_zhoucang:die": "为将军操刀牵马,此生无憾。", + "#rejieyue1": "按丞相之命,此部今由余统摄。", + "#rejieyue2": "奉法行令,事上之节,岂有宽宥之理?", + "#ol_yujin:die": "忍辱偷生,无颜以面丞相厚恩!", + "#tiansuan1": "汝既持签问卜,亦当应天授命。", + "#tiansuan2": "尔若居正体道,福寿自当天成。", + "#zhouqun:die": "及时止损,过犹不及…", + "#juxiang1_re_zhurong1": "今日,就让这群汉人长长见识。", + "#juxiang1_re_zhurong2": "我的大象,终于有了用武之地。", + "#relieren1": "有我手中飞刀在,何惧蜀军!", + "#relieren2": "长矛,飞刀,烈火,都来吧!", + "#re_zhurong:die": "这群汉人使诈……", + "#tiaoxin_re_jiangwei1": "黄口竖子,何必上阵送命?", + "#tiaoxin_re_jiangwei2": "汝如欲大败而归,则可进军一战!", + "#zhiji_re_jiangwei1": "维定当奋身以复汉室。", + "#zhiji_re_jiangwei2": "丞相之志,维必竭力而为。", + "#re_jiangwei:die": "可惜大计未成,吾已身陨。", + "#yufeng1": "广开兮天门,纷吾乘兮玄云。", + "#yufeng2": "高飞兮安翔,乘清气兮御阴阳。", + "#tianshu1": "其耆欲深者,其天机浅。", + "#tianshu2": "杀生者不死,生生者不生。", + "#nanhualaoxian:die": "天机求而近,执而远……", + "#regongji": null, + "#regongji1": "射石饮羽,弦无虚发!", + "#regongji2": "驭马前行,弓急弦发!", + "#jiefan_re_handang1": "援军已至,看你们往哪里逃!", + "#jiefan_re_handang2": "长驱直入,迎刃而解。", + "#re_handang:die": "以暴讨贼,竟遭报应么……", + "#retuntian1": "休养生息,是为以备不虞。", + "#retuntian2": "战损难免,应以军务减之。", + "#zaoxian_re_dengai1": "用兵以险,则战之以胜!", + "#zaoxian_re_dengai2": "已至马阁山,宜速进军破蜀!", + "#re_dengai:die": "一片忠心,换来这般田地。", + "#xinzhuikong1": "万事必须小心为妙。", + "#xinzhuikong2": "我虽妇人,亦当铲除曹贼。", + "#xinqiuyuan1": "这是最后的希望了。", + "#xinqiuyuan2": "诛此国贼者,加官进爵!", + "#xin_fuhuanghou:die": "父亲大人,你竟如此优柔寡断……", + "#xinduodao1": "避其锋芒,夺其兵刃!", + "#xinduodao2": "好兵器啊!哈哈哈!", + "#xinanjian1": "看我一箭索命!", + "#xinanjian2": "明枪易躲,暗箭难防!", + "#xin_panzhangmazhong:die": "埋伏得这么好,怎会……", + "#mobilejingce1": "得一寸,进一尺。", + "#mobilejingce2": "良策佐君王,率征万精兵。", + "#xin_guohuai:die": "穷寇莫追……", + "#juliao": null, + "#juliao1": null, + "#juliao2": null, + "#taomie1": "犯我辽东疆界,必遭后报!", + "#taomie2": "韩濊之乱,再无可生之机!", + "#taomie3": "颅且远行万里,要席何用?", + "#gongsunkang:die": "枭雄一世,何有所憾!", + "#paoxiao_re_zhangfei1": "喝啊!", + "#paoxiao_re_zhangfei2": "今,必斩汝马下!", + "#retishen1": "谁,还敢过来一战?!", + "#retishen2": "欺我无谋?定要尔等血偿!", + "#xin_zhangfei:die": "实在是,杀不动了……", + "#xinniluan": null, + "#xinniluan1": "绝地反击的时候到了!", + "#xinniluan2": "胜者为王败者为寇。", + "#xiaoxi_hansui1": "先下手为强!", + "#xiaoxi_hansui2": "乌合之众,西凉何惧!", + "#xin_hansui:die": "中了曹贼的离间计……了……", + "#daoji1": "八十斤双戟?于我如探囊取物!", + "#daoji2": "以汝之矛,攻汝之盾!", + "#hucheer:die": "未料一伸手,便被……敌酋捉……", + "#xuanfeng_re_lingtong1": "短兵相接,让敌人丢盔弃甲!", + "#xuanfeng_re_lingtong2": "攻敌不备,看他们闻风而逃!", + "#re_lingtong:die": "先……停一下吧……", + "#zishou_re_liubiao1": "忍时待机,以期坐收渔利!", + "#zishou_re_liubiao2": "按兵不动,徐图荆襄霸业!", + "#rezongshi1": "这天下,尽是大汉疆土!", + "#rezongshi2": "汉室之威,犹然彰存!", + "#re_liubiao:die": "兴复大业,就靠你们了……", + "#baiyi": null, + "#baiyi1": "吾不听公休之言,以致须行此策。", + "#baiyi2": "诸将无过,且按吾之略再图破敌。", + "#jinglve1": "安待良机,自有舍身报吾之士。", + "#jinglve2": "察局备间,保诸事不虞。", + "#shanli1": "荡尘涤污,重整河山,便在今日!", + "#shanli2": "效伊尹霍光,以返天下清明。", + "#simashi:die": "吾家夙愿,得偿与否,尽看子上……", + "#hongyi1": "克明礼教,约束不端之行。", + "#hongyi2": "训成弘操,以扬正明之德。", + "#quanfeng1": "媛容德懿,应追谥之。", + "#quanfeng2": "景怀之号,方配得上前人之德。", + "#yanghuiyu:die": "桃符,一定要平安啊……", + "#mobiledanshou1": "此诚危难,我定当竭尽全力。", + "#mobiledanshou2": "大丈夫屈伸有道,不在一时胜负。", + "#xin_zhuran:die": "大耳贼就在眼前,快追……", + "#xinyicong": null, + "#xinyicong1": null, + "#xinyicong2": null, + "#qiaomeng1": "秣马厉兵,枕戈待战。", + "#qiaomeng2": "夺敌辎重,以为己用。", + "#xin_gongsunzan:die": "我军将败,我已无颜苟活于世……", + "#beizhu1": "检阅士卒,备将行之役。", + "#beizhu2": "点选将校,讨乱汉之贼。", + "#beizhu3": "乱贼势大,且暂勿力战。", + "#dingyuan:die": "奉先何故心变,啊!", + "#xinqiaoshui1": "此事听我一言,定有分明之理。", + "#xinqiaoshui2": "今日之事,听我一言便是。", + "#xinjyzongshi1": "空拘小节,难成大事。", + "#xinjyzongshi2": "繁文缛节,不过是缚人之物。", + "#xin_jianyong:die": "行事无矩,为人所恶矣。", + "#rejiangchi1": "将飞翼伏,三军整肃。", + "#rejiangchi2": "策马扬鞭,奔驰万里。", + "#xin_caozhang:die": "黄须金甲,也难敌骨肉毒心!", + "#dangxian_xin_liaohua1": "谁言蜀汉已无大将?", + "#dangxian_xin_liaohua2": "老将虽白发,宝刀刃犹锋!", + "#refuli1": "未破敌军,岂可轻易服输?", + "#refuli2": "看老夫再奋身一战!", + "#xin_liaohua:die": "垂垂老矣,已忘壮年雄心……", + "#xuewei1": "吾主之尊,岂容尔等贼寇近前?", + "#xuewei2": "血佑忠魂,身卫英主。", + "#liechi1": "吾受汉帝恩,岂容吴贼辱?", + "#liechi2": "汉将有死无降,怎会如吴狗一般?", + "#furong:die": "吾主既然得返,此番已是功成……", + "#jiuchi_re_dongzhuo1": "无酒不欢,来来来,再饮,再饮!", + "#jiuchi_re_dongzhuo2": "黄金美酒夜光杯,舍我其谁啊,哈哈哈哈哈哈!", + "#roulin_re_dongzhuo1": "美女,美酒,美食,嘿嘿,尽我享用!", + "#roulin_re_dongzhuo2": "嗯啊,尽享天下美味,哼哼哼哼哈哈哈哈!", + "#benghuai_re_dongzhuo1": "什么礼制纲常,我说的就是纲常!", + "#benghuai_re_dongzhuo2": "谁有权力,谁掌生死!", + "#baonue2_re_dongzhuo1": "不施严法,怎治乱民,休得啰嗦!", + "#baonue2_re_dongzhuo2": "天子在我手里,我怕谁!", + "#re_dongzhuo:die": "竖子,竟敢反我!", + "#repojun1": "犯大吴疆土者,盛必击而破之!", + "#repojun2": "若敢来犯,必叫你大败而归!", + "#re_xusheng:die": "盛只恨,不能再为主公,破敌致胜了。", + "#zhengjian1": "此人有雄猛逸才,还请明公观之。", + "#zhengjian2": "若明公得此人才,定当如虎添翼。", + "#gaoyuan1": "还请告知兴霸,请他务必相助。", + "#gaoyuan2": "如今事急,唯有兴霸可救。", + "#sp_sufei:die": "本可共图大业,奈何主公量狭器小啊……", + "#weifeng1": "广散惧义,尽泄敌之斗志。", + "#weifeng2": "若尔等惧我,自当卷甲以降。", + "#yj_zhangliao:die": "惑于女子而尽失战机,庸主误我啊。", + "#zhilve1": "将者,上不治天,下不治地,中不治人。", + "#zhilve2": "料敌之计,明敌之意,因况反制。", + "#yj_zhanghe:die": "若非小人作梗,何至官渡之败……", + "#xhzhiyan1": "治军严谨,方得精锐之师。", + "#xhzhiyan2": "精兵当严于律己,束身自修。", + "#yj_xuhuang:die": "唉,明主未遇,大功未成……", + "#gnjinfan1": "扬锦帆,劫四方,快意逍遥!", + "#gnjinfan2": "铃声所至之处,再无安宁!", + "#gnsheque1": "看我此箭,取那轻舟冒进之人性命!", + "#gnsheque2": "纵有劲甲良盾,也难挡我神射之威!", + "#yj_ganning:die": "铜铃声……怕是听不到了……", + "#yinghun_re_sunjian1": "义定四野,武匡海内。", + "#yinghun_re_sunjian2": "江东男儿,皆胸怀匡扶天下之志。", + "#repolu1": "斩敌复城,扬我江东军威!", + "#re_sunjian:die": "吾身虽死,忠勇须传。", + "#zhengjing1": "兼采今古,博学并蓄,择善以教之。", + "#zhengjing2": "君子需通六艺,亦当识明三礼。", + "#zhengxuan:die": "注易未毕,奈何寿数将近……", + "#jimeng1": "今日之言,皆是为保两国无虞。", + "#jimeng2": "天下之势已如水火,还望重修盟好。", + "#shuaiyan1": "并魏之日,想来便是两国争战之时。", + "#shuaiyan2": "在下所言,至诚至率。", + "#dengzhi:die": "使命既成,但死无妨!", + "#relihuo1": "此火只为全歼敌寇,无需妇人之仁。", + "#relihuo2": "战胜攻取,以火修功。", + "#chunlao_xin_chengpu1": "背下佳酿,以做庆功之用。", + "#chunlao_xin_chengpu2": "饮此壮行酒,当立先头功。", + "#xin_chengpu:die": "箭尽弓折,力竭人亡。", + "#duoduan1": "北伐之事,丞相亦听我定夺。", + "#duoduan2": "筹定规画,片刻既定!", + "#gongsun1": "我岂能与魏延这种莽夫共事!", + "#gongsun2": "早知如此,投靠魏国又如何!", + "#yangyi:die": "我功勋卓著,只为昏君奸臣所害,唉!", + "#chengzhao1": "定当为皇上诛杀首害!", + "#chengzhao2": "此诏字字诛心,岂能不斩曹贼!", + "#dongcheng:die": "九泉之下,我等着你曹贼到来!", + "#xinlianhuan1": "将多兵众,不可以敌,使其自累,以杀其势。", + "#xinlianhuan2": "善用兵者,运巧必防损,立谋虑中变。", + "#niepan_re_pangtong1": "凤凰折翅,涅槃再生。", + "#niepan_re_pangtong2": "九天之志,展翅翱翔。", + "#re_pangtong:die": "落……凤……坡……", + "#drlt_zhenrong1": "东征高句丽,保辽东安稳。", + "#drlt_zhenrong2": "跨海东征,家国俱荣。", + "#drlt_hongju1": "一举拿下,鸿途可得。", + "#drlt_hongju2": "鸿飞荣升,举重若轻。", + "#re_guanqiujian:die": "峥嵘一生,然被平民所击射!", + "#zhouxuan1": "孰为虎?孰为鹰?于吾都如棋子。", + "#zhouxuan2": "群雄逐鹿之际,唯有洞明时势方有所成。", + "#fengji1": "巡土田之宜,尽凿溉之利。", + "#fengji2": "养耆育孤,视民如伤,以丰定徐州。", + "#chendeng:die": "诸卿何患无令君乎?", + "#reqizhou": null, + "#reqizhou1": null, + "#reqizhou2": null, + "#shanxi1": "敌援未到,需要速战速决!", + "#shanxi2": "快马加鞭,赶在敌人戒备之前!", + "#re_heqi:die": "别拿走……我的装备!", + "#zhaohan1": "天道昭昭,再兴如光武亦可期。", + "#zhaohan2": "汉祚将终,我又岂能无憾。", + "#rangjie1": "公既执掌权柄,又何必令君臣遭乱。", + "#rangjie2": "公虽权倾朝野,亦当尊圣上之意。", + "#yizheng1": "一人劫天子,一人质公卿,此可行邪?", + "#yizheng2": "诸军举事,当上顺天心,奈何如是!", + "#yangbiao:die": "未能效死佑汉,只因宗族之重……", + "#bazhen_re_sp_zhugeliang1": "待得八阵图毕,必令敌军入阵。", + "#bazhen_re_sp_zhugeliang2": "八卦布阵,困兵十万,哈哈哈哈。", + "#rehuoji1": "火,尽可烧的再猛烈一些。", + "#rehuoji2": "行火必有因,烟火必素具。", + "#rekanpo1": "料事如神,随机应变。", + "#rekanpo2": "虚虚实实,兵无常势。", + "#re_sp_zhugeliang:die": "我的计谋竟被……", + "#reganglie1": "伤我者,十倍奉还!", + "#reganglie2": "哪个敢动我!", + "#qingjian1": "钱财,乃身外之物。", + "#qingjian2": "福生于清俭,德生于卑退。", + "#xin_xiahoudun:die": "两边都看不见了……", + "#zhiyi1": "岂可擅退而误国家之功?", + "#zhiyi2": "统摄不懈,只为破敌!", + "#zhangyì:die": "唯愿百姓,不受此乱所害,哎……", + "#zhongzuo1": "历经磨难,不改佐国之志。", + "#zhongzuo2": "建功立业,唯愿天下早定。", + "#wanlan1": "挽狂澜于既倒,扶大厦于将倾。", + "#wanlan2": "深受国恩,今日便是报偿之时!", + "#jiakui:die": "不斩孙权,九泉之下羞见先帝啊!", + "#qingxian1": "抚琴拨弦,悠然自得。", + "#qingxian2": "寄情于琴,合于天地。", + "#re_jikang:die": "多少遗恨,俱随琴音去。", + "#kuangcai1": "博古揽今,信手拈来。", + "#kuangcai2": "功名为尘,光阴为金。", + "#shejian1": "尔等竖子,不堪为伍!", + "#shejian2": "请君洗耳,听我之言。", + "#miheng:die": "呵呵呵呵……这天地都容不下我!……", + "#zhaohuo1": "我获罪于天,致使徐州之民,受此大难!", + "#zhaohuo2": "如此一来,徐州危矣……", + "#yixiang1": "一方有难,八方应援。", + "#yixiang2": "昔日有恩,还望此时来报。", + "#yirang1": "明公切勿推辞!", + "#yirang2": "万望明公可怜汉家城池为重!", + "#taoqian:die": "悔不该差使小人,招此祸患。", + "#fenyin1": "披发亢歌,至死不休!", + "#fenyin2": "力不竭,战不止!", + "#liuzan:die": "今病困若此,固命也。", + "#dujin1": "带兵十万,不如老夫多甲一件!", + "#dujin2": "轻舟独进,破敌先锋!", + "#lingcao:die": "呃啊!(扑通)此箭……何来……", + "#qingyi1": "没牌,又有何不可能的?", + "#qingyi2": "翩翩逸云端,仿若桃花仙。", + "#shixin1": "释怀之戾气,化君之不悦。", + "#shixin2": "星星之火,安能伤我?", + "#sunru:die": "佑我江东,虽死无怨。", + "#tunchu1": "屯粮事大,暂不与尔等计较。", + "#tunchu2": "屯粮待战,莫动刀枪。", + "#shuliang1": "将军驰劳,酒肉慰劳。", + "#shuliang2": "将军,牌来了。", + "#lifeng:die": "吾,有负丞相重托。", + "#zhanyi1": "以战养战,视敌而战。", + "#zhanyi2": "战,可以破敌。意,可以守御。", + "#zhuling:die": "此生得遇曹公,再无他求。", + "#polu1": "设此发石车,可破袁军高橹。", + "#polu2": "霹雳之声,震丧敌胆。", + "#choulve1": "依此计行,可安军心。", + "#choulve2": "破袁之策,吾已有计。", + "#liuye:die": "唉,于上不能佐君主,于下不能亲同僚,吾愧为佐世人臣。", + "#yizan_respond_shan1": "承吾父之勇,翊军立阵。", + "#yizan_respond_shan2": "继先帝之志,季兴大汉。", + "#xinfu_longyuan1": "金鳞岂是池中物,一遇风云便化龙。", + "#xinfu_longyuan2": "忍时待机,今日终于可以建功立业。", + "#zhaotongzhaoguang:die": "守业死战,不愧初心。", + "#xinfu_jingxie1": "军具精巧,方保无虞。", + "#xinfu_jingxie2": "巧则巧矣,未尽善也。", + "#xinfu_qiaosi": null, + "#xinfu_qiaosi1": "待我稍作思量,更益其巧。", + "#xinfu_qiaosi2": "虚争空言,不如思而试之。", + "#majun:die": "衡石不用,美玉见诬啊!", + "#xinfu_daigong1": "不急,只等敌军士气渐殆。", + "#xinfu_daigong2": "敌谋吾已尽料,可以长策縻之。", + "#xinfu_zhaoxin1": "吾心昭昭,何惧天下之口!", + "#xinfu_zhaoxin2": "公此行欲何为,吾自有量度。", + "#simazhao:die": "安世,接下来,就看你的了……", + "#xinfu_qianchong1": "宫闱之内,何必擅涉外事!", + "#xinfu_qianchong2": "谦瑾行事,方能多吉少恙。", + "#xinfu_qianchong3": "细行策划,只盼能助夫君一臂之力。", + "#xinfu_shangjian1": "如今乱世,当秉俭行之节。", + "#xinfu_shangjian2": "百姓尚处寒饥之困,吾等不可奢费财力。", + "#wangyuanji:die": "世事沉浮,非是一人可逆啊……", + "#xinfu_pingcai": "吾有众好友,分为卧龙、凤雏、水镜、元直。", + "#xinfu_pdgyingshi1": null, + "#xinfu_pdgyingshi2": null, + "#pangdegong:die": "吾知人而不自知,何等荒唐。", + "#yongsi1": "大汉天下,已半入我手!", + "#yongsi2": "玉玺在手,天下我有。", + "#weidi1": "我才是皇帝!", + "#weidi2": "你们都得听我的号令!", + "#old_yuanshu:die": "可恶!就差……一步了……", + "#shouye1": "敌军攻势渐怠,还望诸位依策坚守。", + "#shouye2": "袁幽州不日便至,当行策建功以报之。", + "#liezhi1": "只恨箭支太少,不能射杀汝等!", + "#liezhi2": "身陨事小,秉节事大。", + "#shenpei:die": "吾君在北,但求面北而亡!", + "#wylianji1": "两计扣用,以催强势。", + "#wylianji2": "容老夫细细思量。", + "#moucheng1": "董贼伏诛,天下太平!", + "#moucheng2": "叫天不应,叫地不灵,今天就是你的死期!", + "#re_wangyun:die": "努力谢关东诸公,勤以国家为念!", + "#xinfu_wuniang1": "虽为女子身,不输男儿郎。", + "#xinfu_wuniang2": "剑舞轻盈,沙场克敌。", + "#xinfu_xushen1": "救命之恩,涌泉相报。", + "#xinfu_xushen2": "解我危难,报君华彩。", + "#xinfu_zhennan1": "镇守南中,夫君无忧。", + "#xinfu_zhennan2": "与君携手,定平蛮夷。", + "#re_baosanniang:die": "我还想与你,共骑这雪花驹……", + "#renshi1": "巾帼于乱世,只能飘零如尘。", + "#renshi2": "还望您可以手下留情!", + "#wuyuan1": "夫君,此次出征,还望您记挂妾身!", + "#wuyuan2": "云长,一定要平安归来啊!", + "#huaizi": null, + "#huaizi1": null, + "#huaizi2": null, + "#hujinding:die": "云长,重逢不久,又要相别么……", + "#xinfu_qianxin1": "兵困绝地,将至如归!", + "#xinfu_qianxin2": "临危之际,速速来援!", + "#xinfu_zhenxing1": "东征西讨,募军百里挑一。", + "#xinfu_zhenxing2": "众口铄金,积毁销骨。", + "#re_zhanggong:die": "大漠孤烟,孤立无援啊。", + "#biaozhao1": "孙策宜加贵宠,须召还京邑!", + "#biaozhao2": "此人有祸患之像,望丞相慎之。", + "#yechou1": "会有人替我报仇的!", + "#yechou2": "我的门客,是不会放过你的!", + "#re_xugong:die": "终究……还是被其所害……", + "#xinfu_fuhai1": "跨海南征,波涛起浮。", + "#xinfu_fuhai2": "宦海沉浮,生死难料!", + "#re_weiwenzhugezhi:die": "吾皆海岱清士,岂料生死易逝……", + "#reluanji1": "万箭穿心,灭其士气!", + "#reluanji2": "卿当与本公同心戮力,共安社稷!", + "#xueyi1": "世受皇恩,威震海内。", + "#xueyi2": "四世三公,名贯天下。", + "#xin_yuanshao:die": "袁门不幸啊!", + "#xiangle_re_liushan1": "天府之国,自然民安国泰。", + "#xiangle_re_liushan2": "战事扰乱民生,不如作罢。", + "#refangquan1": "爱卿自行定夺便是。", + "#refangquan2": "北伐事重,相父全权处理即可啊!", + "#ruoyu_re_liushan1": "唯有自认庸主之名,方能保蜀地官民无虞啊!", + "#ruoyu_re_liushan2": "既无争雄天下之才,只好做守成之主。", + "#re_liushan:die": "实在有愧父皇与相父啊……", + "#jiang_re_sunben1": "我会把胜利带回江东。", + "#jiang_re_sunben2": "天下英雄,谁能与我一战?", + "#rehunzi1": "小霸王之名响彻天下,何人不知?", + "#rehunzi2": "江东已平,中原动荡,直取许昌。", + "#zhiba2_re_sunben1": "我的霸业才刚刚开始。", + "#zhiba2_re_sunben2": "汝是战是降,我皆奉陪。", + "#re_sunben:die": "大业未就,中世尔殒……", + "#scstaoluan1": "罗绮朱紫,皆若吾等手中傀儡。", + "#scs_zhangrang:die": "臣等殄灭,唯陛下自爱……(跳水声)", + "#scschiyan1": "逆臣乱党,都要受这啄心之刑。", + "#scs_zhaozhong:die": "咱家忠心可鉴啊!!", + "#scszimou1": "在宫里当差,还不是为这利字!", + "#scs_sunzhang:die": null, + "#scspicai1": "修得广厦千万,可庇汉室不倾。", + "#scs_bilan:die": null, + "#scsyaozhuo1": "上蔽天听,下诓朝野!", + "#scs_xiayun:die": null, + "#scsxiaolu1": "咱家上下打点,自是要费些银子。", + "#scs_hankui:die": null, + "#scskuiji1": "同道者为忠,殊途者为奸!", + "#scs_lisong:die": null, + "#scschihe1": "想见圣上?哼哼,你怕是没这个福分了!", + "#scs_duangui:die": null, + "#scsniqu1": "离心离德,为吾等所不容!", + "#scs_guosheng:die": null, + "#scsanruo1": "小伤无碍,安心修养便可。", + "#scs_gaowang:die": null, +}; diff --git a/character/offline.js b/character/offline.js deleted file mode 100644 index 9fdf308b4..000000000 --- a/character/offline.js +++ /dev/null @@ -1,8996 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "offline", - connect: true, - connectBanned: ["zhangliang"], - characterSort: { - offline: { - offline_star: [ - "jsp_ganfuren", - "sp_xiahoushi", - "jsp_zhaoyun", - "huangjinleishi", - "sp_pangtong", - "sp_daqiao", - "sp_ganning", - "sp_xiahoudun", - "sp_lvmeng", - "sp_zhangfei", - "sp_liubei", - "old_machao", - "zhangliang", - "jsp_caoren", - ], - offline_sticker: [ - "sp_gongsunzan", - "sp_simazhao", - "sp_wangyuanji", - "sp_xinxianying", - "sp_liuxie", - ], - offline_yijiang: ["ol_xinxianying"], - offline_luanwu: ["ns_lijue", "ns_zhangji", "ns_fanchou"], - offline_yongjian: [ - "ns_chendao", - "yj_caoang", - "yj_caocao", - "yj_liru", - "yj_caohong", - "yj_zhangfei", - "yongjian_ganning", - "yj_dongzhuo", - "yj_xuyou", - "yj_jiaxu", - "yj_zhenji", - ], - offline_piracyE: [ - "shen_jiaxu", - "pe_wangyun", - "pe_zhonghui", - "pe_sunchen", - "pe_mengda", - "pe_wenqin", - "ns_caoanmin", - "jiangqing", - "kongrong", - "jiling", - "tianfeng", - "mateng", - ], - offline_piracyS: [ - "ns_jiaxu", - "longyufei", - "ps_guanyu", - "ps1059_guojia", - "ps2070_guojia", - "ps2063_zhaoyun", - "ps2067_zhaoyun", - "ps1062_zhouyu", - "ps2080_zhouyu", - "ps_caozhi", - "ps_jin_simayi", - "ps_caopi", - "ps_simayi", - "ps2068_simayi", - "ps_machao", - "ps_zhugeliang", - "ps2066_zhugeliang", - "ps_jiaxu", - "ps_lvbu", - "ps_shen_machao", - "jsp_liubei", - ], - offline_piracyK: ["pk_sp_duyu"], - offline_vtuber: ["vtb_xiaosha", "vtb_xiaoshan", "vtb_xiaotao", "vtb_xiaole", "vtb_xiaojiu"], - offline_longyutao: ["drag_guanyu", "drag_caoren", "drag_lvchang"], - //offline_others:[""], - }, - }, - character: { - drag_guanyu: ["male", "shu", 4, ["dragchaojue", "dragjunshen"]], - drag_caoren: ["male", "wei", 4, ["draglizhong", "dragjuesui"]], - drag_lvchang: ["male", "wei", 3, ["dragjuwu", "dragshouxiang"]], - jsp_ganfuren: ["female", "shu", 3, ["shushen", "shenzhi"], ["character:gz_ganfuren"]], - ol_xinxianying: ["female", "wei", 3, ["xincaishi", "xinzhongjian"]], - zhangliang: ["male", "qun", 4, ["old_jijun", "old_fangtong"]], - jsp_caoren: ["male", "wei", 4, ["kuiwei", "yanzheng"]], - old_machao: ["male", "qun", 4, ["zhuiji", "oldcihuai"]], - vtb_xiaosha: ["female", "qun", 4, ["vtbguisha", "vtbshuli"]], - vtb_xiaoshan: ["female", "qun", 4, ["vtbshanwu", "vtbxianli"]], - vtb_xiaotao: ["female", "qun", 4, ["vtbtaoyan", "vtbyanli"]], - vtb_xiaole: ["female", "qun", 4, ["vtbleyu", "vtbyuanli"]], - vtb_xiaojiu: ["female", "qun", 4, ["vtbmeiniang", "vtbyaoli"]], - ps_shen_machao: ["male", "shen", 4, ["psshouli", "pshengwu"], ["qun"]], - mateng: ["male", "qun", 4, ["mashu", "xiongyi"]], - tianfeng: ["male", "qun", 3, ["sijian", "gzsuishi"]], - jiling: ["male", "qun", 4, ["shuangren"]], - kongrong: ["male", "qun", 3, ["zymingshi", "lirang"]], - jiangqing: ["male", "wu", 4, ["zyshangyi"]], - pk_sp_duyu: ["male", "qun", 4, ["pkwuku", "pksanchen"]], - ps_lvbu: ["male", "qun", 4, ["wushuang", "pssheji"]], - ps_jiaxu: ["male", "qun", 4, ["wansha", "psqupo", "psbaoquan"]], - ps_machao: ["male", "shu", 4, ["mashu", "tieji", "psweihou"]], - ps2066_zhugeliang: ["male", "shu", 3, ["pszhiji", "psjiefeng", "kongcheng"]], - ps_zhugeliang: ["male", "shu", 3, ["psguanxing", "pslongyin"]], - ps_simayi: ["male", "wei", 3, ["reguicai", "pshuxiao"]], - ps2068_simayi: ["male", "wei", 3, ["refankui", "reguicai", "pszhonghu"]], - ps_caopi: ["male", "wei", 3, ["psjianwei", "fangzhu", "songwei"], ["zhu"]], - ps_jin_simayi: ["male", "jin", 3, ["smyyingshi", "psquanyi"]], - ps_caozhi: ["male", "wei", 3, ["psliushang", "psqibu"]], - ps1062_zhouyu: ["male", "wu", 3, ["yingzi", "psoldshiyin"]], - ps2080_zhouyu: ["male", "wu", 3, ["psshiyin", "psquwu", "psliaozou"]], - ps2063_zhaoyun: ["male", "shu", 4, ["psqijin", "psqichu", "pslongxin"]], - ps2067_zhaoyun: ["male", "shu", 4, ["longdan", "pshuiqiang", "pshuntu"]], - ps1059_guojia: ["male", "wei", 3, ["tiandu", "psqizuo"]], - ps2070_guojia: ["male", "wei", 3, ["yiji", "psquanmou"]], - ps_guanyu: ["male", "shu", 4, ["wusheng", "pszhonghun", "nuzhan"]], - pe_wenqin: ["male", "wei", 4, ["gzjinfa"]], - pe_sunchen: ["male", "wu", 4, ["zyshilu", "zyxiongnve"]], - pe_mengda: ["male", "wei", 4, ["qiuan", "liangfan"]], - pe_zhonghui: ["male", "wei", 4, ["zyquanji", "zypaiyi"], ["clan:颍川钟氏"]], - pe_wangyun: ["male", "qun", 3, ["zylianji", "zymoucheng"], ["clan:太原王氏"]], - shen_jiaxu: ["male", "shen", 3, ["weimu", "zybishi", "zyjianbing"], ["qun"]], - yj_zhenji: ["female", "wei", 3, ["yjluoshen", "qingguo"]], - yj_jiaxu: ["male", "wei", 3, ["yjzhenlve", "yjjianshu", "yjyongdi"]], - yj_xuyou: ["male", "qun", 3, ["yjshicai", "yjchenggong", "yjzezhu"]], - yj_dongzhuo: ["male", "qun", 7, ["yjtuicheng", "yjyaoling", "yjshicha", "yjyongquan"], ["zhu"]], - yongjian_ganning: ["male", "wu", 4, ["yjjielve"]], - yj_zhangfei: ["male", "shu", 4, ["yjmangji"]], - yj_caohong: ["male", "wei", 4, ["yjlifeng"]], - yj_liru: ["male", "qun", 3, ["yjdumou", "yjweiquan", "yjrenwang"]], - yj_caocao: ["male", "qun", 4, ["yjxiandao", "yjsancai", "yjyibing"]], - longyufei: ["female", "shu", 3, ["longyi", "zhenjue"]], - sp_liubei: ["male", "shu", 4, ["zhaolie", "shichou"], ["zhu"]], - sp_zhangfei: ["male", "shu", 4, ["jie", "dahe"]], - sp_lvmeng: ["male", "wu", 3, ["tanhu", "mouduan"]], - sp_xiahoudun: ["male", "wei", 4, ["fenyong", "xuehen"], ["die_audio"]], - sp_ganning: ["male", "qun", 4, ["yinling", "junwei"]], - sp_daqiao: ["female", "wu", 3, ["yanxiao", "anxian"]], - sp_pangtong: ["male", "qun", 3, ["xinmanjuan", "zuixiang"]], - huangjinleishi: ["female", "qun", 3, ["fulu", "fuji"]], - jsp_zhaoyun: ["male", "qun", 3, ["chixin", "reyicong", "suiren"]], - sp_xiahoushi: ["female", "shu", 3, ["xinfu_yanyu", "xinfu_xiaode"]], - sp_gongsunzan: ["male", "qun", 4, ["spyicong", "sptuji"]], - sp_simazhao: ["male", "wei", 3, ["spzhaoxin", "splanggu"]], - sp_wangyuanji: ["female", "wei", 3, ["spfuluan", "spshude"]], - sp_xinxianying: ["female", "wei", 3, ["spmingjian", "spyinzhi"]], - sp_liuxie: ["male", "qun", 3, ["sphuangen", "sphantong"]], - ns_lijue: ["male", "qun", "4/6", ["nsfeixiong", "nscesuan"]], - ns_zhangji: ["male", "qun", 4, ["nslulve"]], - ns_fanchou: ["male", "qun", 4, ["nsyangwu"]], - ns_jiaxu: ["male", "qun", 3, ["nsyice", "luanwu"]], - ns_chendao: ["male", "shu", 4, ["nsjianglie"]], - yj_caoang: ["male", "wei", 4, ["yjxuepin"]], - ns_caoanmin: ["male", "wei", 4, ["nskuishe"]], - jsp_liubei: ["male", "qun", 4, ["jsprende"]], - }, - characterIntro: { - lvchang: - "吕常(161—221年),荆州南阳博望(今河南省南阳市方城县博望镇)人,汉末至三国时期曹魏将领。吕常曾担任曹魏横海将军、章陵太守,为武猛都尉厉节中郎将裨将军,封关内侯。常以中勇,显名州司,试守雉长,执戈秉戎,慎守易,兵不顿于敌国,坠不侵于四邻,拜武猛都尉厉节中郎将裨将军,封关内侯。王师南征,与充军从,奄有江汉,舍爵册勋,封阴德亭侯,领郡。鸠集荒散,为民统纪,三考有成,转拜平狄将军,改封卢亭侯,莅国赋政,十有三年。会蜀将关羽猖獗为寇,常御之,羽不能克。文帝加其庸,转拜横海将军,徙封西鄂都乡侯,食邑并七百户。年六十一,黄初二年正月卒。", - huangjinleishi: "黄巾军中负责施法的女祭司二人组。", - longyufei: - "《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。", - pk_sp_duyu: - "杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。", - ps_shen_machao: - "字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。", - xiaosha: - '2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为三国杀新手菜鸡,误打误撞参加了三国杀组织的《三国之星》选秀大赛,没想到一路靠着颜值和风风火火的爽快性格过关斩将吸粉无数,获得了冠军,成为官方签约的形象代言人。
    小杀现于B站还存在对应账号,但早已荒废。', - xiaoshan: - "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀同系不同班的同学,由于本身性格比较安静,所以和风风火火的小杀有些不对盘。知道小杀也玩三国杀后,外表高冷、内心傲娇的她偷偷也去玩了游戏,立志要在游戏里碾压她。
    小闪对应B站账号已销号。", - xiaotao: - "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀的亲妹妹,陪姐姐去拍摄代言宣传照的时候,被导演看中,觉得三国美貌姐妹花是非常好的噱头,于是一并签下。正所谓“三国姐妹花,永远不分家!”。
    小桃对应B站账号已销号。", - xiaole: "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上小乐家与小桃小杀家是世交,三人从小就认识。和小闪是同班同学,小乐很喜欢安静的小闪。和小酒是小杀介绍认识的,大家都是打三国杀的网友,在打游戏时候比较依赖小酒——躺赢人躺赢魂,躺赢都是人上人。
    小乐对应B站账号已销号。", - xiaojiu: - "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为非人类,是一只年龄成迷的神兽,真身是白泽。是小杀网上玩游戏认识的网友,爱好是喝酒,和小杀也有好酒友的关系。
    小酒对应B站账号已销号。", - }, - characterTitle: { - jsp_liubei: "S1019", - ns_caoanmin: "S1023", - longyufei: "S1044", - ps1059_guojia: "S1059", - ps_lvbu: "S1061", - ps1062_zhouyu: "S1062", - ps_jiaxu: "S1066", - ps_jin_simayi: "S1067", - ps_guanyu: "S2065", - ps2063_zhaoyun: "S2063", - ps2066_zhugeliang: "S2066", - ps2067_zhaoyun: "S2067", - ps2068_simayi: "S2068", - ps_machao: "S2069", - ps2070_guojia: "S2070", - ps_simayi: "S2073", - ps_zhugeliang: "S2073", - ps_caopi: "S2075", - ns_jiaxu: "S2079", - ps2080_zhouyu: "S2080", - ps_caozhi: "S2081", - ps_shen_machao: "SX015", - }, - perfectPair: {}, - card: { - yanxiao_card: { - type: "special_delay", - fullimage: true, - noEffect: true, - ai: { - basic: { - order: 1, - useful: 1, - value: 8, - }, - result: { - target: 1, - }, - }, - }, - }, - characterFilter: {}, - skill: { - //龙起襄樊 - //关羽 - //界界关羽 - 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"; - targets[0].chooseToCompare(targets[1]); - "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 = [ - "遗策:选择要放置的卡牌", - '
    (从左到右为从旧到新,后选择的后置入)
    ', - cards, - ]; - var cards2 = player.getExpansions("nsyice"); - cards2.reverse(); - if (cards2.length) { - dialog.push('
    原有“策”
    '); - dialog.push(cards2); - } - player - .chooseButton(dialog, true, cards.length) - .set("filterButton", function (button) { - return _status.event.cards.includes(button.link); - }) - .set("cards", cards); - } - "step 2"; - player.addToExpansion(result.links, "gain2").gaintag.add("nsyice"); - "step 3"; - var storage = player.getExpansions("nsyice"); - var bool = false; - for (var i = 0; i < storage.length; i++) { - for (var j = storage.length - 1; j > i; j--) { - if (get.number(storage[i]) == get.number(storage[j])) { - bool = true; - break; - } - } - if (bool) break; - } - if (bool) { - event.cards = storage.splice(i, j - i + 1); - } else event.finish(); - "step 4"; - var cardsx = []; - cardsx.push(cards.shift()); - cardsx.push(cards.pop()); - if (cards.length) player.gain(cards, "gain2"); - event.cards = cardsx; - "step 5"; - player.chooseButton(["将一张牌置于牌堆顶,将另一张牌置于牌堆底", cards], true); - "step 6"; - player.lose(event.cards, ui.cardPile).set("topper", result.links[0]).insert_index = - function (event, card) { - if (card == event.topper) return ui.cardPile.firstChild; - return null; - }; - if (_status.dying.length) event.finish(); - "step 7"; - player.chooseTarget("对一名角色造成1点伤害", true).set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 8"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - target.damage("nocard"); - } - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - marktext: "策", - intro: { - content: "expansion", - markcount: "expansion", - }, - }, - //用间篇 - yjxuepin: { - enable: "phaseUse", - usable: 1, - filterTarget: function (event, player, target) { - return player.inRange(target) && target.countDiscardableCards(player, "he") > 0; - }, - content: function () { - "step 0"; - player.loseHp(); - "step 1"; - if (target.countDiscardableCards(player, "he") > 0) - player.discardPlayerCard(target, 2, "he", true); - else event.finish(); - "step 2"; - if ( - result.bool && - result.cards.length == 2 && - get.type2(result.cards[0], result.cards[0].original == "h" ? target : false) == - get.type2(result.cards[1], result.cards[1].original == "h" ? target : false) - ) - player.recover(); - }, - ai: { - order: 4, - result: { - player: function (player, target) { - if (player.hp == 1) return -8; - if (target.countCards("e") > 1) return 0; - if (player.hp > 2 || target.countCards("h") > 1) return -0.5; - return -2; - }, - target: function (player, target) { - if (target.countDiscardableCards(player, "he") < 2) return 0; - return -2; - }, - }, - }, - }, - nsjianglie: { - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return event.card.name == "sha" && event.target.countCards("h") > 0; - }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - logTarget: "target", - content: function () { - "step 0"; - trigger.target.showHandcards(); - "step 1"; - var cards = trigger.target.getCards("h"); - var list = []; - for (var i = 0; i < cards.length; i++) { - list.add(get.color(cards[i])); - } - if (list.length == 1) event._result = { control: list[0] }; - else { - list.sort(); - trigger.target - .chooseControl(list) - .set("prompt", "选择弃置一种颜色的所有手牌") - .set("ai", function () { - var player = _status.event.player; - if ( - get.value(player.getCards("h", { color: "red" })) >= - get.value(player.getCards("h", { color: "black" })) - ) - return "black"; - return "red"; - }); - } - "step 2"; - trigger.target.discard(trigger.target.getCards("h", { color: result.control })); - }, - }, - //桌游志贴纸 - spyinzhi: { - trigger: { player: "damageEnd" }, - frequent: true, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - var cards = game.cardsGotoOrdering(get.cards(2)).cards; - player.showCards(cards); - event.count2 = 0; - for (var i = 0; i < cards.length; i++) { - if (get.suit(cards[i]) == "spade") { - event.count2++; - cards.splice(i--, 1); - } - } - event.cards = cards; - if (!event.count2 || !trigger.source) event.goto(4); - "step 2"; - event.count2--; - if (trigger.source.countCards("h") > 0) { - player - .chooseTarget( - "令一名角色获得" + get.translation(trigger.source) + "的一张手牌", - function (card, player, target) { - var source = _status.event.source; - return target != source && source.countGainableCards(target, "h") > 0; - } - ) - .set("source", trigger.source); - } else event.goto(4); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line([trigger.source, target], "green"); - target.gainPlayerCard(trigger.source, "h", true); - if (event.count2) event.goto(2); - } - "step 4"; - if (cards.length) player.gain(cards, "gain2", "log"); - "step 5"; - if ( - event.count > 0 && - player.hasSkill(event.name) && - !get.is.blocked(event.name, player) - ) { - player.chooseBool(get.prompt2("spyinzhi")).set("frequentSkill", event.name); - } else event.finish(); - "step 6"; - if (result.bool) { - player.logSkill("spyinzhi"); - event.goto(1); - } - }, - }, - spmingjian: { - trigger: { global: "phaseBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - var next = player.chooseCard(get.prompt2("spmingjian", trigger.player), "he"); - next.set("ai", function (card) { - var target = _status.event.getTrigger().player; - var player = _status.event.player; - if (get.attitude(player, target) > 0 && target.countCards("j") > 0) - return 5 - get.value(card); - return -1; - }); - next.set("filterCard", function (card, player) { - if (get.position(card) == "e") - return lib.filter.cardDiscardable.apply(this, arguments); - return true; - }); - //next.set('logSkill',['spmingjian',trigger.player]); - "step 1"; - if (result.bool) { - player.logSkill("spmingjian", trigger.player); - var card = result.cards[0]; - event.card = card; - if (get.position(card) == "e") event._result = { index: 0 }; - else if (!lib.filter.cardDiscardable(card, player, event)) - event._result = { index: 1 }; - else { - var name = get.translation(trigger.player); - player - .chooseControl() - .set("choiceList", [ - "令" + name + "跳过本回合的判定阶段", - "令" + name + "于本回合的判定中不触发「判定结果生效前」的时机", - ]) - .set("ai", function () { - return 0; - }); - } - } else event.finish(); - "step 2"; - if (result.index == 0) { - player.discard(card); - trigger.player.skip("phaseJudge"); - } else { - trigger.player - .addToExpansion(card, player, "giveAuto") - .gaintag.add("spmingjian_charlotte"); - trigger.player.addSkill("spmingjian_charlotte"); - } - }, - ai: { - expose: 0.25, - }, - }, - spmingjian_charlotte: { - trigger: { player: ["judgeBefore", "phaseAfter"] }, - forced: true, - firstDo: true, - silent: true, - popup: false, - charlotte: true, - content: function () { - if (trigger.name == "phase") player.removeSkill(event.name); - else trigger.noJudgeTrigger = true; - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - marktext: "鉴", - intro: { - name: "明鉴", - content: "expansion", - markcount: "expansion", - }, - }, - spshude: { - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - filter: function (event, player) { - return player.countCards("h") < player.maxHp; - }, - content: function () { - player.drawTo(player.maxHp); - }, - }, - spfuluan: { - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.inRange(target); - }, - selectCard: 3, - position: "he", - check: function (card) { - return 5 - get.value(card); - }, - complexCard: true, - filterCard: function (card, player) { - if (!ui.selected.cards.length) - return player.countCards("he", { suit: get.suit(card) }) > 2; - return get.suit(card) == get.suit(ui.selected.cards[0]); - }, - content: function () { - target.turnOver(); - player.addTempSkill("spfuluan2"); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (target.isTurnedOver()) return 2; - return -1; - }, - }, - }, - }, - spfuluan2: { - mod: { - cardEnabled: function (card) { - if (card.name == "sha") return false; - }, - }, - }, - spzhaoxin: { - trigger: { player: "phaseDrawEnd" }, - check: function (event, player) { - return player.getUseValue({ name: "sha", isCard: true }) > 0; - }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.showHandcards(); - "step 1"; - player.chooseUseTarget("sha", false); - }, - }, - splanggu: { - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return get.itemtype(event.source) == "player"; - }, - logTarget: "source", - content: function () { - "step 0"; - player.judge(); - "step 1"; - if (trigger.source.countCards("h") > 0) { - var next = player.discardPlayerCard(trigger.source, "h", [1, Infinity]); - next.set("suit", result.suit); - next.set("filterButton", function (button) { - return get.suit(button.link) == _status.event.suit; - }); - next.set("visible", true); - } - }, - group: "splanggu_rewrite", - }, - splanggu_rewrite: { - trigger: { player: "judge" }, - filter: function (event, player) { - return player.countCards("hs") > 0 && event.getParent().name == "splanggu"; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseCard( - "狼顾的判定结果为" + - get.translation(trigger.player.judging[0]) + - ",是否打出一张手牌进行代替?", - "hs", - function (card) { - var player = _status.event.player; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - } - ) - .set("ai", function (card) { - return -1; - }); - "step 1"; - if (result.bool) { - player.respond(result.cards, "highlight", "splanggu", "noOrdering"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo( - "deletenode", - player, - get.cardsInfo([trigger.player.judging[0].clone]) - ); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player, "的判定牌改为", result.cards[0]); - game.delay(2); - } - }, - }, - sphantong: { - trigger: { - player: "loseEnd", - }, - frequent: true, - filter: function (event, player) { - return ( - event.type == "discard" && - event.getParent(3).name == "phaseDiscard" && - event.cards.filterInD("d").length > 0 - ); - }, - content: function () { - if (!player.storage.sphantong) player.storage.sphantong = []; - var cards = trigger.cards.filterInD("d"); - player.storage.sphantong.addArray(cards); - player.$gain2(cards); - game.log(player, "将", cards, "置于武将牌上"); - player.markSkill("sphantong"); - }, - group: ["sphantong_gain"], - derivation: ["hujia", "jijiang", "jiuyuan", "xueyi"], - marktext: "诏", - intro: { - content: "cards", - onunmark: "throw", - }, - }, - sphantong_gain: { - trigger: { global: "phaseBegin" }, - direct: true, - filter: function (event, player) { - return player.storage.sphantong && player.storage.sphantong.length > 0; - }, - content: function () { - "step 0"; - player.chooseButton( - [get.prompt("sphantong"), player.storage.sphantong], - function (button) { - var player = _status.event.player; - if (_status.currentPhase == player) { - //血裔 - if ( - (player.hasJudge("lebu") || player.skipList.includes("phaseUse")) && - game.hasPlayer(function (current) { - return current != player && current.group == "qun"; - }) - ) - return 1; - //激将 - if ( - !player.hasJudge("lebu") && - !player.skipList.includes("phaseUse") && - game.hasPlayer(function (current) { - return ( - current != player && - current.group == "shu" && - current.hasSha() && - get.attitude(player, current) > 0 && - get.attitude(current, player) > 0 - ); - }) && - game.hasPlayer(function (target) { - return ( - player.canUse({ name: "sha" }, target) && - get.effect(target, { name: "sha" }, player, player) > 0 - ); - }) - ) - return 1; - } - //护驾 - else if ( - !player.hasShan() && - game.hasPlayer(function (current) { - return ( - current != player && - current.group == "wei" && - current.mayHaveShan(player, "respond") && - get.attitude(player, current) > 0 && - get.attitude(current, player) > 0 - ); - }) - ) - return 1; - return -1; - } - ); - "step 1"; - if (result.bool) { - player.logSkill("sphantong"); - var card = result.links[0]; - player.$throw(card); - game.log(player, "将", card, "置入了弃牌堆"); - player.storage.sphantong.remove(card); - player[player.storage.sphantong.length > 0 ? "markSkill" : "unmarkSkill"]( - "sphantong" - ); - game.cardsDiscard(card); - var list = ["hujia", "jijiang", "jiuyuan", "xueyi"]; - for (var i = 0; i < list.length; i++) { - if (player.hasSkill(list[i])) list.splice(i--, 1); - } - if (list.length) { - player - .chooseControl(list) - .set("prompt", "选择获得以下技能中的一个") - .set("ai", function () { - var player = _status.event.player; - if (_status.currentPhase == player) { - //血裔 - if ( - (player.hasJudge("lebu") || - player.skipList.includes("phaseUse")) && - game.hasPlayer(function (current) { - return current != player && current.group == "qun"; - }) - ) - return "xueyi"; - //激将 - if ( - !player.hasJudge("lebu") && - !player.skipList.includes("phaseUse") && - game.hasPlayer(function (current) { - return ( - current != player && - current.group == "shu" && - current.hasSha() && - get.attitude(player, current) > 0 && - get.attitude(current, player) > 0 - ); - }) && - game.hasPlayer(function (target) { - return ( - player.canUse({ name: "sha" }, target) && - get.effect(target, { name: "sha" }, player, player) > 0 - ); - }) - ) - return "jijiang"; - } - //护驾 - else if ( - !player.hasShan() && - game.hasPlayer(function (current) { - return ( - current != player && - current.group == "wei" && - current.mayHaveShan(player, "respond") && - get.attitude(player, current) > 0 && - get.attitude(current, player) > 0 - ); - }) - ) - return "hujia"; - }); - } else event.finish(); - } else event.finish(); - "step 2"; - var skill = result.control; - player.addTempSkills(skill); - // player.popup(skill,'wood'); - // game.log(player,'获得了技能','#g【'+get.translation(skill)+'】'); - }, - }, - sphuangen: { - trigger: { global: "useCardToPlayered" }, - filter: function (event, player) { - if (!event.isFirstTarget) return false; - if (get.type(event.card) != "trick") return false; - if (get.info(event.card).multitarget) return false; - if (event.targets.length < 2) return false; - return player.hp > 0; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("sphuangen"), - [1, Math.min(player.hp, trigger.targets.length)], - function (card, player, target) { - return _status.event.targets.includes(target); - } - ) - .set("ai", function (target) { - return -get.effect(target, trigger.card, trigger.player, _status.event.player); - }) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - player.logSkill("sphuangen", result.targets); - trigger.excluded.addArray(result.targets); - player.draw(); - } - }, - }, - spyicong: { - trigger: { player: "phaseDiscardEnd" }, - direct: true, - locked: false, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player - .chooseCard("he", [1, player.countCards("he")], get.prompt2("spyicong")) - .set("ai", function (card) { - if (card.name == "du") return 10; - if (ui.selected.cards.length) return -1; - return 4 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("spyicong"); - player.addToExpansion(result.cards, player, "give").gaintag.add("spyicong"); - } - }, - mod: { - globalTo: function (from, to, num) { - return num + to.getExpansions("spyicong").length; - }, - }, - marktext: "扈", - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - name: "义从", - content: function (storage, player) { - return "共有" + get.cnNumber(player.getExpansions("spyicong").length) + "张“扈”"; - }, - markcount: "expansion", - }, - }, - sptuji: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - return player.getExpansions("spyicong").length > 0; - }, - content: function () { - var cards = player.getExpansions("spyicong"); - var num = cards.length; - player.addMark("sptuji2", num, false); - player.addTempSkill("sptuji2"); - player.loseToDiscardpile(cards); - if (num <= 1) player.draw(); - }, - ai: { - combo: "spyicong" - }, - }, - sptuji2: { - onremove: true, - charlotte: true, - mod: { - globalFrom: function (from, to, num) { - return num - from.countMark("sptuji2"); - }, - }, - marktext: "突", - intro: { - name: "突骑", - content: "至其他角色的距离-#", - }, - }, - xinfu_yanyu: { - trigger: { - global: "phaseUseBegin", - }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - var next = player - .chooseToDiscard(get.prompt("xinfu_yanyu"), get.translation("xinfu_yanyu_info"), "he") - .set("logSkill", "xinfu_yanyu"); - if (player == trigger.player) { - next.set( - "goon", - (function () { - var map = { - basic: 0, - trick: 0.1, - }; - var hs = trigger.player.getCards("h"); - var sha = false; - var jiu = false; - for (var i = 0; i < hs.length; i++) { - if (trigger.player.hasValueTarget(hs[i])) { - if (hs[i].name == "sha" && !sha) { - sha = true; - map.basic += 2; - } - if (hs[i].name == "tao") map.basic += 6; - if (hs[i].name == "jiu") { - jiu = true; - map.basic += 2.5; - } - if (get.type(hs[i]) == "trick") - map.trick += get.value(hs[i], player, "raw"); - } - } - return map; - })() - ); - next.set("ai", function (card) { - var map = _status.event.goon; - var type = get.type(card, "trick"); - if (!map[type]) return -1; - return map[type] - get.value(card); - }); - } else { - next.set("ai", function (cardx) { - var map = { - basic: 0, - trick: 0, - }; - var hs = trigger.player.getCards("h"); - var sha = false; - var jiu = false; - for (var i = 0; i < hs.length; i++) { - if (hs[i] != cardx && trigger.player.hasValueTarget(hs[i])) { - if (hs[i].name == "sha" && !sha) { - sha = true; - map.basic += 2; - } - if (hs[i].name == "tao") map.basic += 6; - if (hs[i].name == "jiu") { - jiu = true; - map.basic += 3; - } - if (get.type(hs[i]) == "trick") map.trick += player.getUseValue(hs[i]); - } - } - var type = get.type(cardx, "trick"); - if (!map[type]) return -get.value(cardx); - return map[type] - get.value(cardx); - }); - } - "step 1"; - if (result.bool) { - player.storage.xinfu_yanyu = get.type(result.cards[0], "trick"); - player.addTempSkill("xinfu_yanyu2", "phaseUseAfter"); - } - }, - }, - xinfu_yanyu2: { - init: function (player, skill) { - player.storage[skill] = 0; - }, - onremove: function (player, skill) { - delete player.storage.xinfu_yanyu; - delete player.storage.xinfu_yanyu2; - }, - trigger: { - global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - direct: true, - filter: function (event, player) { - if (player.storage.xinfu_yanyu2 >= 3) return false; - var type = player.storage.xinfu_yanyu, - cards = event.getd(); - for (var i = 0; i < cards.length; i++) { - if (get.type(cards[i], "trick") == type && get.position(cards[i], true) == "d") - return true; - } - return false; - }, - content: function () { - "step 0"; - event.logged = false; - event.cards = []; - var type = player.storage.xinfu_yanyu; - var cards = trigger.getd(); - for (var i = 0; i < cards.length; i++) { - if (get.type(cards[i], "trick") == type && get.position(cards[i], true) == "d") - event.cards.push(cards[i]); - } - "step 1"; - if (player.storage.xinfu_yanyu2 >= 3) event.finish(); - else - player.chooseCardButton( - event.cards, - "【燕语】:是否将其中的一张牌交给一名角色?" - ).ai = function (card) { - if (card.name == "du") return 10; - return get.value(card); - }; - "step 2"; - if (result.bool) { - player.storage.xinfu_yanyu2++; - if (!event.logged) { - player.logSkill("xinfu_yanyu"); - player.addExpose(0.25); - event.logged = true; - } - event.togain = result.links[0]; - event.cards.remove(event.togain); - player - .chooseTarget(true, "请选择要获得" + get.translation(event.togain) + "的角色") - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - var card = _status.event.card; - var val = get.value(card); - if ( - player.storage.xinfu_yanyu2 < 3 && - target == _status.currentPhase && - target.hasValueTarget(card, null, true) - ) - att = att * 5; - else if ( - target == player && - !player.hasJudge("lebu") && - get.type(card) == "trick" - ) - att = att * 3; - if (target.hasSkillTag("nogain")) att /= 10; - return att * val; - }) - .set("card", event.togain); - } else event.finish(); - "step 3"; - var target = result.targets[0]; - player.line(target, "green"); - target.gain(event.togain, "gain2"); - if (event.cards.length) event.goto(1); - }, - }, - xinfu_xiaode: { - subSkill: { - remove: { - unique: true, - charlotte: true, - trigger: { - player: "phaseAfter", - }, - forced: true, - popup: false, - content: function () { - player.removeAdditionalSkill("xinfu_xiaode"); - player.removeSkill("xinfu_xiaode_remove"); - }, - }, - }, - trigger: { - global: "dieAfter", - }, - direct: true, - filter: function (skill, event) { - return !event.hasSkill("xinfu_xiaode_remove"); - }, - content: function () { - "step 0"; - var list = []; - var listm = []; - var listv = []; - if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3]; - else listm = lib.character[trigger.player.name][3]; - if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3]; - listm = listm.concat(listv); - var func = function (skill) { - var info = get.info(skill); - if ( - info.charlotte || - info.zhuSkill || - (info.unique && !info.limited) || - info.juexingji || - info.dutySkill || - info.hiddenSkill - ) - return false; - return true; - }; - for (var i = 0; i < listm.length; i++) { - if (func(listm[i])) list.add(listm[i]); - } - if (list.length) { - player - .chooseControl(list, "cancel2") - .set("prompt", get.prompt("xinfu_xiaode")) - .set("prompt2", get.translation("xinfu_xiaode_info")) - .set("ai", function () { - return list.randomGet(); - }); - } else event.finish(); - "step 1"; - if (result.control && result.control != "cancel2") { - player.logSkill("xinfu_xiaode"); - player.popup(result.control, "thunder"); - game.log(player, "获得了技能", "#g【" + get.translation(result.control) + "】"); - player.addAdditionalSkill("xinfu_xiaode", [result.control]); - player.addSkill("xinfu_xiaode_remove"); - } - }, - }, - chixin: { - group: ["chixin1", "chixin2"], - mod: { - cardUsableTarget: function (card, player, target) { - if (card.name == "sha" && !target.hasSkill("chixin3") && player.inRange(target)) - return true; - }, - }, - trigger: { player: "useCardToPlayered" }, - silent: true, - firstDo: true, - locked: false, - content: function () { - trigger.target.addTempSkill("chixin3"); - }, - }, - chixin1: { - enable: ["chooseToRespond", "chooseToUse"], - filterCard: { suit: "diamond" }, - position: "hes", - viewAs: { name: "sha" }, - prompt: "将一张♦牌当杀使用或打出", - check: function (card) { - return 5 - get.value(card); - }, - ai: { - respondSha: true, - }, - }, - chixin2: { - enable: ["chooseToUse", "chooseToRespond"], - filterCard: { suit: "diamond" }, - viewAs: { name: "shan" }, - position: "hes", - prompt: "将一张♦牌当闪使用或打出", - check: function (card) { - return 5 - get.value(card); - }, - ai: { - respondShan: true, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "respondShan") && current < 0) return 0.8; - }, - }, - }, - }, - chixin3: { charlotte: true }, - suiren: { - trigger: { player: "phaseZhunbeiBegin" }, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return !player.storage.suiren; - }, - intro: { - content: "limited", - }, - mark: true, - direct: true, - unique: true, - limited: true, - content: function () { - "step 0"; - var check = player.hp == 1 || (player.hp == 2 && player.countCards("h") <= 1); - player - .chooseTarget(get.prompt2("suiren")) - .set("ai", function (target) { - if (!_status.event.check) return 0; - return get.attitude(_status.event.player, target); - }) - .set("check", check); - "step 1"; - if (result.bool) { - player.storage.suiren = true; - player.awakenSkill("suiren"); - player.logSkill("suiren", result.targets); - player.removeSkills("reyicong"); - player.gainMaxHp(); - player.recover(); - result.targets[0].draw(3); - } - }, - }, - xinmanjuan: { - audio: "manjuan", - forced: true, - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - var hs = player.getCards("h"); - return ( - event.type != "xinmanjuan" && - event.getg(player).filter(function (card) { - return hs.includes(card); - }).length > 0 - ); - }, - content: function () { - "step 0"; - var hs = player.getCards("h"), - cards = trigger.getg(player).filter(function (card) { - return hs.includes(card); - }); - event.cards = cards; - event.rawCards = cards.slice(0); - player.loseToDiscardpile(cards); - if (_status.currentPhase != player) event.finish(); - "step 1"; - event.card = event.cards.shift(); - event.togain = []; - var number = get.number(event.card); - for (var i = 0; i < ui.discardPile.childNodes.length; i++) { - var current = ui.discardPile.childNodes[i]; - if (!event.rawCards.includes(current) && get.number(current) == number) - event.togain.push(current); - } - if (!event.togain.length) event.goto(4); - "step 2"; - player.chooseButton(["是否获得其中的一张牌?", event.togain]).ai = function (button) { - return get.value(button.link); - }; - "step 3"; - if (result.bool) { - player.gain(result.links[0], "gain2").type = "xinmanjuan"; - } - "step 4"; - if (event.cards.length) event.goto(1); - }, - ai: { - threaten: 4.2, - nogain: 1, - skillTagFilter: function (player) { - return player != _status.currentPhase; - }, - }, - }, - manjuan: { - audio: true, - trigger: { global: "loseAfter" }, - filter: function (event, player) { - if (event.type != "discard") return false; - if (event.player == player) return false; - if (!player.countCards("he")) return false; - for (var i = 0; i < event.cards2.length; i++) { - if (get.position(event.cards2[i], true) == "d") { - return true; - } - } - return false; - }, - direct: true, - unique: true, - gainable: true, - content: function () { - "step 0"; - if (trigger.delay == false) game.delay(); - "step 1"; - var cards = []; - var suits = ["club", "spade", "heart", "diamond"]; - for (var i = 0; i < trigger.cards2.length; i++) { - if (get.position(trigger.cards2[i], true) == "d") { - cards.push(trigger.cards2[i]); - suits.remove(get.suit(trigger.cards2[i])); - } - } - if (cards.length) { - var maxval = 0; - for (var i = 0; i < cards.length; i++) { - var tempval = get.value(cards[i]); - if (tempval > maxval) { - maxval = tempval; - } - } - maxval += cards.length - 1; - var next = player.chooseToDiscard("he", { suit: suits }); - next.set("ai", function (card) { - return _status.event.maxval - get.value(card); - }); - next.set("maxval", maxval); - next.set("dialog", [get.prompt(event.name), "hidden", cards]); - next.logSkill = event.name; - event.cards = cards; - } - "step 2"; - if (result.bool) { - player.gain(event.cards, "gain2", "log"); - } - }, - ai: { - threaten: 1.3, - }, - }, - zuixiang: { - skillAnimation: true, - animationColor: "gray", - audio: true, - unique: true, - limited: true, - trigger: { player: "phaseZhunbeiBegin" }, - content: function () { - "step 0"; - player.awakenSkill("zuixiang"); - event.cards = player.showCards(get.cards(3)).cards; - player.addToExpansion(event.cards, "gain2").gaintag.add("zuixiang2"); - "step 1"; - if (lib.skill.zuixiang.filterSame(cards)) { - player.gain(cards, "gain2").type = "xinmanjuan"; - } else { - trigger._zuixiang = true; - player.addSkill("zuixiang2"); - } - }, - filterSame: function (c) { - for (var i = 0; i < c.length; i++) { - for (var j = i + 1; j < c.length; j++) { - if (get.number(c[i]) == get.number(c[j])) return true; - } - } - return false; - }, - }, - zuixiang2: { - intro: { - content: "expansion", - markcount: "expansion", - }, - mod: { - cardEnabled: function (card, player) { - var type = get.type2(card); - var list = player.getExpansions("zuixiang2"); - for (var i of list) { - if (get.type2(i, false) == type) return false; - } - }, - cardRespondable: function () { - return lib.skill.zuixiang2.mod.cardEnabled.apply(this, arguments); - }, - cardSavable: function () { - return lib.skill.zuixiang2.mod.cardEnabled.apply(this, arguments); - }, - }, - trigger: { - player: "phaseZhunbeiBegin", - target: "useCardToBefore", - }, - forced: true, - charlotte: true, - filter: function (event, player) { - if (event.name == "phaseZhunbei") return !event._zuixiang; - var type = get.type2(event.card); - var list = player.getExpansions("zuixiang2"); - for (var i of list) { - if (get.type2(i) == type) return true; - } - return false; - }, - content: function () { - "step 0"; - if (event.triggername == "useCardToBefore") { - trigger.cancel(); - event.finish(); - return; - } - var cards = get.cards(3); - player.addToExpansion("gain2", cards).gaintag.add("zuixiang2"); - "step 1"; - var cards = player.getExpansions("zuixiang2"); - player.showCards(cards); - if (lib.skill.zuixiang.filterSame(cards)) { - player.gain(cards, "gain2", "log").type = "xinmanjuan"; - player.removeSkill("zuixiang2"); - } - }, - ai: { - effect: { - target: function (card, player, target) { - var type = get.type2(card); - var list = target.getExpansions("zuixiang2"); - for (var i of list) { - if (get.type2(i) == type) return "zeroplayertarget"; - } - }, - }, - }, - }, - yanxiao: { - audio: 2, - enable: "phaseUse", - filterCard: { suit: "diamond" }, - filterTarget: function (card, player, target) { - return target.canAddJudge({ name: "yanxiao_card" }); - }, - check: function (card) { - return 7 - get.value(card); - }, - position: "he", - filter: function (event, player) { - return player.countCards("he", { suit: "diamond" }) > 0; - }, - discard: false, - lose: false, - delay: false, - prepare: "give", - content: function () { - "step 0"; - game.addGlobalSkill("yanxiao_global"); - target.addJudge({ name: "yanxiao_card" }, cards); - "step 1"; - game.delay(); - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if ( - target.countCards("j", function (card) { - return ( - get.effect( - target, - { - name: card.viewAs || card.name, - cards: [card], - }, - target, - target - ) < 0 - ); - }) - ) - return 1; - return 0; - }, - }, - }, - }, - yanxiao_global: { - trigger: { player: "phaseJudgeBegin" }, - forced: true, - filter: function (event, player) { - return player.countCards("j") > 0 && player.hasJudge("yanxiao_card"); - }, - content: function () { - player.gain(player.getCards("j"), "gain2"); - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.type(card) == "delay" && target.hasJudge("yanxiao_card")) - return [0, 0, 0, 0.1]; - }, - }, - }, - }, - anxian: { - audio: 2, - group: ["anxian_source", "anxian_target"], - subSkill: { - source: { - audio: "anxian", - trigger: { source: "damageBegin2" }, - filter: function (event, player) { - return event.card && event.card.name == "sha"; - }, - check: function (event, player) { - if (get.damageEffect(event.player, player, player) <= 0) return true; - return false; - }, - content: function () { - "step 0"; - if (trigger.player.countCards("h")) { - trigger.player.chooseToDiscard(true); - } - "step 1"; - player.draw(); - trigger.cancel(); - }, - }, - target: { - audio: "anxian", - trigger: { target: "useCardToTargeted" }, - direct: true, - filter: function (event, player) { - return event.card.name == "sha" && player.countCards("h"); - }, - content: function () { - "step 0"; - var next = player.chooseToDiscard(get.prompt2("anxian")); - next.set("ai", function (card) { - var player = _status.event.player; - var trigger = _status.event.getTrigger(); - if (get.attitude(player, trigger.player) > 0) { - return 9 - get.value(card); - } - if (player.countCards("h", { name: "shan" })) return -1; - return 7 - get.value(card); - }); - next.logSkill = "anxian"; - "step 1"; - if (result.bool) { - trigger.player.draw(); - trigger.getParent().excluded.push(player); - } - }, - }, - }, - }, - junwei: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.getExpansions("yinling").length >= 3; - }, - content: function () { - "step 0"; - var cards = player.getExpansions("yinling"); - if (cards.length > 3) { - player - .chooseButton(3, [get.prompt("junwei"), "hidden", cards]) - .set("ai", function (button) { - return 1; - }); - } else { - player - .chooseBool() - .set("createDialog", [get.prompt("junwei"), "hidden", cards]) - .set("dialogselectx", true) - .set("choice", true); - event.cards = cards.slice(0); - } - "step 1"; - if (result.bool) { - player.logSkill("junwei"); - var cards = event.cards || result.links; - player.loseToDiscardpile(cards); - player - .chooseTarget(true, function (card, player, target) { - return player != target; - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target) / Math.sqrt(1 + target.hp); - }); - } else { - event.finish(); - } - "step 2"; - if (result.bool && result.targets && result.targets.length) { - var target = result.targets[0]; - player.line(result.targets); - event.target = target; - var nshan = target.countCards("h", function (card) { - if (_status.connectMode) return true; - return card.name == "shan"; - }); - if (nshan == 0) { - event.directfalse = true; - } else { - target - .chooseCard( - "交给" + get.translation(player) + "一张【闪】,或失去1点体力", - function (card) { - return card.name == "shan"; - } - ) - .set("ai", function (card) { - if (_status.event.nshan > 1) return 1; - if (_status.event.player.hp >= 3) return 0; - return 1; - }) - .set("nshan", nshan); - } - } else { - event.finish(); - } - "step 3"; - if (!event.directfalse && result.bool) game.delay(); - ui.clear(); - "step 4"; - if (!event.directfalse && result.bool) { - event.cards = result.cards; - event.target.$throw(result.cards); - player - .chooseTarget( - "将" + get.translation(event.cards) + "交给一名角色", - true, - function (card, player, target) { - return target != _status.event.getParent().target; - } - ) - .set("ai", function (target) { - return ( - get.attitude(_status.event.player, target) / - (target.countCards("h", "shan") + 1) - ); - }); - } else { - event.target.loseHp(); - delete event.cards; - } - "step 5"; - if (event.cards) { - player.line(result.targets, "green"); - result.targets[0].gain(event.cards, "gain2").giver = player; - game.log(player, "将", event.cards, "交给", result.targets[0]); - event.finish(); - } else { - if (event.target.countCards("e")) { - player.choosePlayerCard( - "e", - "将" + get.translation(event.target) + "的一张装备牌移出游戏", - true, - event.target - ); - } else { - event.finish(); - } - } - "step 6"; - if (result.bool) { - var card = result.links[0]; - target.addToExpansion(card, target, "give").gaintag.add("junwei2"); - target.addSkill("junwei2"); - } - }, - ai: { - combo: "yinling", - }, - }, - junwei2: { - mark: true, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - charlotte: true, - content: function () { - "step 0"; - var cards = player.getExpansions("junwei2").filter(function (card) { - return player.canEquip(card, true); - }); - if (cards.length) { - player.$give(cards[0], player, false); - game.delay(0.5); - player.equip(cards[0]); - event.redo(); - } - "step 1"; - player.removeSkill("junwei2"); - }, - }, - yinling: { - enable: "phaseUse", - filterCard: { color: "black" }, - position: "he", - marktext: "锦", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - filter: function (event, player) { - return ( - player.countCards("he", { color: "black" }) > 0 && - player.getExpansions("yinling").length < 4 - ); - }, - filterTarget: function (card, player, target) { - return target.countCards("he") > 0 && target != player; - }, - check: function (card) { - return 6 - get.value(card); - }, - content: function () { - "step 0"; - player.choosePlayerCard("hej", target, true); - "step 1"; - if (result.bool && result.links && result.links.length) { - player.addToExpansion(result.links, target, "give").gaintag.add("yinling"); - } - }, - ai: { - order: 10.1, - expose: 0.1, - result: { - target: function (player, target) { - if (target.hasSkill("tuntian")) return 0; - var es = target.getCards("e"); - var nh = target.countCards("h"); - var noe = es.length == 0 || target.hasSkillTag("noe"); - var noe2 = es.length == 1 && es[0].name == "baiyin" && target.hp < target.maxHp; - var noh = nh == 0 || target.hasSkillTag("noh"); - if (noh && noe) return 0; - if (noh && noe2) return 0.01; - if (get.attitude(player, target) <= 0) - return target.countCards("he") ? -1.5 : 1.5; - var js = target.getCards("j"); - if (js.length) { - var jj = js[0].viewAs ? { name: js[0].viewAs } : js[0]; - if (jj.name == "guohe") return 3; - if (js.length == 1 && get.effect(target, jj, target, player) >= 0) { - return -1.5; - } - return 2; - } - return -1.5; - }, - }, - }, - }, - fenyong: { - audio: 2, - trigger: { player: "damageEnd" }, - content: function () { - player.addTempSkill("fenyong2"); - }, - }, - fenyong2: { - audio: "fenyong", - mark: true, - intro: { - content: "防止你受到的所有伤害", - }, - trigger: { player: "damageBegin3" }, - forced: true, - content: function () { - trigger.cancel(); - }, - ai: { - maixie: true, - maixie_hp: true, - nofire: true, - nothunder: true, - nodamage: true, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage")) return [0, 0]; - }, - }, - }, - }, - xuehen: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - return player.hasSkill("fenyong2") && event.player.isIn(); - }, - content: function () { - "step 0"; - player.removeSkill("fenyong2"); - player - .chooseControl("弃牌", "出杀", function () { - var player = _status.event.player; - var trigger = _status.event.getTrigger(); - if (get.attitude(player, trigger.player) < 0) { - var he = trigger.player.countCards("he"); - if (he < 2) return "出杀"; - if (player.maxHp - player.hp >= 2 && he <= 3) { - return "弃牌"; - } - if (player.maxHp - player.hp >= 3 && he <= 5) { - return "弃牌"; - } - if (player.maxHp - player.hp > 3) { - return "弃牌"; - } - return "出杀"; - } - return "出杀"; - }) - .set( - "prompt", - "弃置" + - get.translation(trigger.player) + - get.cnNumber(player.maxHp - player.hp) + - "张牌,或对任意一名角色使用一张杀" - ); - "step 1"; - if (result.control == "弃牌") { - player.line(trigger.player, "green"); - if (player.hp < player.maxHp && trigger.player.countCards("he")) { - player.discardPlayerCard(trigger.player, true, "he", player.maxHp - player.hp); - } - } else { - player.chooseUseTarget({ name: "sha" }, true, false, "nodistance"); - } - }, - ai: { - combo: "fenyong", - }, - }, - mouduan: { - audio: 1, - init2: function (player) { - game.broadcastAll(function (player) { - player._mouduan_mark = player.mark("武", { - content: "拥有技能【激昂】、【谦逊】", - }); - }, player); - player.addAdditionalSkill("mouduan", ["jiang", "qianxun"]); - }, - onremove: function (player) { - game.broadcastAll(function (player) { - if (player._mouduan_mark) { - player._mouduan_mark.delete(); - delete player._mouduan_mark; - } - }, player); - player.removeAdditionalSkills("mouduan"); - }, - trigger: { player: "loseEnd" }, - forced: true, - locked: false, - filter: function (event, player) { - return ( - player._mouduan_mark && - player._mouduan_mark.name == "武" && - player.countCards("h") <= 2 - ); - }, - content: function () { - game.broadcastAll(function (player) { - if (!player._mouduan_mark) return; - player._mouduan_mark.name = "文"; - player._mouduan_mark.skill = "文"; - player._mouduan_mark.firstChild.innerHTML = "文"; - player._mouduan_mark.info.content = "拥有技能【英姿】、【克己】"; - }, player); - player.addAdditionalSkills("mouduan", ["yingzi", "keji"]); - }, - group: "mouduan2", - }, - mouduan2: { - audio: 1, - trigger: { global: "phaseZhunbeiBegin" }, - //priority:5, - filter: function (event, player) { - return ( - player._mouduan_mark && - player._mouduan_mark.name == "文" && - player.countCards("h") > 2 - ); - }, - direct: true, - content: function () { - "step 0"; - player.chooseToDiscard("he", "谋断:是否弃置一张牌将标记变为“武”?").ai = function () { - return -1; - }; - "step 1"; - if (result.bool && player.countCards("h") > 2) { - game.broadcastAll(function (player) { - if (!player._mouduan_mark) return; - player._mouduan_mark.name = "武"; - player._mouduan_mark.skill = "武"; - player._mouduan_mark.firstChild.innerHTML = "武"; - player._mouduan_mark.info.content = "拥有技能【激昂】、【谦逊】"; - }, player); - player.addAdditionalSkills("mouduan", ["jiang", "qianxun"]); - } - }, - }, - tanhu: { - audio: 1, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - target.addTempSkill("tanhu2"); - } - }, - ai: { - result: { - target: function (player, target) { - var hs = player.getCards("h"); - if (hs.length < 3) return 0; - var bool = false; - for (var i = 0; i < hs.length; i++) { - if (hs[i].number >= 9 && get.value(hs[i]) < 7) { - bool = true; - break; - } - } - if (!bool) return 0; - return -1; - }, - }, - order: 9, - }, - group: "tanhu3", - }, - tanhu2: { - mark: true, - intro: { - content: "已成为探虎目标", - }, - }, - tanhu3: { - mod: { - globalFrom: function (from, to) { - if (to.hasSkill("tanhu2")) return -Infinity; - }, - wuxieRespondable: function (card, player, target) { - if (target && target.hasSkill("tanhu2")) return false; - }, - }, - }, - jie: { - audio: 1, - trigger: { source: "damageBegin1" }, - filter: function (event) { - return ( - event.card && - event.card.name == "sha" && - get.color(event.card) == "red" && - event.notLink() - ); - }, - forced: true, - content: function () { - trigger.num++; - }, - }, - dahe: { - audio: true, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.chooseToCompare(target).set("preserve", "win"); - "step 1"; - if (result.bool && result.target) { - event.type = true; - event.card = result.target; - player - .chooseTarget( - "将" + get.translation(result.target) + "交给一名角色", - function (card, player, target) { - return target.hp <= player.hp; - } - ) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (_status.event.du) return -att; - return att; - }) - .set("du", event.card.name == "du"); - target.addTempSkill("dahe2"); - } else { - event.type = false; - if (player.countCards("h")) { - player.showHandcards(); - player.chooseToDiscard("h", true); - } - } - "step 2"; - if (event.type) { - if (result.bool) { - player.line(result.targets, "green"); - result.targets[0].gain(event.card, "gain2"); - } - } - }, - ai: { - result: { - target: function (player, target) { - var hs = player.getCards("h"); - if (hs.length < 3) return 0; - var bool = false; - for (var i = 0; i < hs.length; i++) { - if (hs[i].number >= 9 && get.value(hs[i]) < 7) { - bool = true; - break; - } - } - if (!bool) return 0; - if (player.canUse("sha", target) && player.countCards("h", "sha")) { - return -2; - } - return -0.5; - }, - }, - order: 9, - }, - }, - dahe2: { - mark: true, - intro: { - content: "非红桃闪无效", - }, - mod: { - cardRespondable: function (card, player) { - if (card.name == "shan") { - const suit = get.suit(card); - if (suit != "heart" && suit != "unsure") return false; - } - }, - cardEnabled: function (card, player) { - if (card.name == "shan") { - const suit = get.suit(card); - if (suit != "heart" && suit != "unsure") return false; - } - }, - }, - }, - shichou: { - //audio:1, - skillAnimation: true, - animationColor: "orange", - unique: true, - limited: true, - mark: false, - trigger: { player: "phaseZhunbeiBegin" }, - zhuSkill: true, - direct: true, - filter: function (event, player) { - if (!player.hasZhuSkill("shichou")) return false; - if (player.countCards("he") < 2) return false; - return game.hasPlayer(function (current) { - return current != player && current.group == "shu"; - }); - }, - init: function (player) { - if (player.hasZhuSkill("shichou")) { - player.markSkill("shichou"); - player.storage.shichou = false; - } - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: get.prompt2("shichou"), - selectCard: 2, - filterTarget: function (card, player, target) { - return target.group == "shu" && target != player; - }, - filterCard: true, - position: "he", - ai1: function (card) { - return 7 - get.value(card); - }, - ai2: function (target) { - var player = _status.event.player; - if (player.hasUnknown()) return 0; - var att = get.attitude(player, target); - if (att <= 0) { - if (target.hp == 1) return (10 - att) / 2; - return 10 - att; - } else { - if (target.hp == 1) return 0; - return (10 - att) / 4; - } - }, - }); - "step 1"; - if (!result.bool) return; - var target = result.targets[0]; - var cards = result.cards; - player.storage.shichou = true; - player.logSkill("shichou", target); - player.awakenSkill("shichou"); - player.give(cards, target); - player.storage.shichou_target = target; - player.addSkill("shichou2"); - target.markSkillCharacter( - "shichou", - player, - "誓仇", - "代替" + get.translation(player) + "承受伤害直到首次进入濒死状态" - ); - }, - intro: { - content: "limited", - }, - }, - shichou2: { - group: "shichou3", - trigger: { player: "damageBegin3" }, - forced: true, - popup: false, - content: function () { - trigger.player = player.storage.shichou_target; - trigger.shichou4 = true; - trigger.player.addSkill("shichou4"); - player.logSkill("shichou2", player.storage.shichou_target); - game.delay(0.5); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (get.attitude(player, target) > 0) return [0, 0]; - var eff = get.damageEffect(target.storage.shichou_target, player, target); - if (eff > 0) { - return [0, 1]; - } else if (eff < 0) { - return [0, -2]; - } else { - return [0, 0]; - } - } - }, - }, - }, - }, - shichou3: { - trigger: { global: ["dying", "dieBegin"] }, - forced: true, - popup: false, - //priority:10, - filter: function (event, player) { - return event.player == player.storage.shichou_target; - }, - content: function () { - trigger.player.unmarkSkill("shichou"); - delete player.storage.shichou_target; - player.removeSkill("shichou2"); - }, - }, - shichou4: { - trigger: { player: ["damageAfter", "damageCancelled"] }, - forced: true, - popup: false, - audio: false, - content: function () { - if (!trigger.shichou4) return; - if (event.triggername == "damageAfter" && trigger.num) { - player.draw(trigger.num); - } - player.removeSkill("shichou4"); - }, - }, - zhaolie: { - trigger: { player: "phaseDrawBegin2" }, - direct: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("zhaolie"), function (card, player, target) { - return target != player && player.inRange(target); - }) - .set("ai", function (target) { - var player = _status.event.player; - if (get.attitude(player, target) > 0) return 0; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - trigger.num--; - player.storage.zhaolie = result.targets[0]; - player.logSkill("zhaolie", result.targets); - player.addTempSkill("zhaolie2", "phaseDrawAfter"); - } - }, - }, - zhaolie2: { - trigger: { player: "phaseDrawEnd" }, - forced: true, - popup: false, - content: function () { - "step 0"; - event.cards = get.cards(3); - player.showCards(event.cards); - "step 1"; - event.basic = []; - event.nonbasic = []; - event.todis = []; - for (var i = 0; i < event.cards.length; i++) { - if (get.type(event.cards[i]) == "basic") { - if (event.cards[i].name == "tao") { - event.todis.push(event.cards[i]); - } else { - event.basic.push(event.cards[i]); - } - } else { - event.todis.push(event.cards[i]); - event.nonbasic.push(event.cards[i]); - } - } - game.cardsDiscard(event.todis); - var num = event.nonbasic.length; - if (num == 0) { - if (event.basic.length == 0) { - event.finish(); - return; - } - player.storage.zhaolie - .chooseTarget( - function (card, player, target) { - var source = _status.event.source; - return target == source || target == source.storage.zhaolie; - }, - true, - "选择一个目标获得" + get.translation(event.basic) - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .set("source", player); - } else { - player.storage.zhaolie - .chooseToDiscard( - num, - "he", - "弃置" + - get.cnNumber(num) + - "张牌并令" + - get.translation(player) + - "拿牌,或受到" + - get.cnNumber(num) + - "点伤害并拿牌" - ) - .set("ai", function (card) { - var player = _status.event.player; - switch (_status.event.num) { - case 1: - return player.hp > 1 ? 0 : 7 - get.value(card); - case 2: - return 8 - get.value(card); - case 3: - return 10 - get.value(card); - default: - return 0; - } - }) - .set("num", num); - } - "step 2"; - var num = event.nonbasic.length; - var undone = false; - if (num == 0) { - if (event.basic.length) { - result.targets[0].gain(event.basic, "gain2", "log"); - } - } else { - if (result.bool) { - if (event.basic.length) { - player.gain(event.basic, "gain2", "log"); - } - } else { - player.storage.zhaolie.damage(num); - if (event.basic.length) { - undone = true; - } - } - } - if (!undone) { - delete player.storage.zhaolie; - event.finish(); - } - "step 3"; - if (player.storage.zhaolie.isIn()) { - player.storage.zhaolie.gain(event.basic, "gain2", "log"); - } else { - game.cardsDiscard(event.basic); - } - delete player.storage.zhaolie; - }, - }, - fulu: { - trigger: { player: "useCard1" }, - filter: function (event, player) { - if (event.card.name == "sha" && !game.hasNature(event.card)) return true; - }, - audio: true, - check: function (event, player) { - var eff = 0; - for (var i = 0; i < event.targets.length; i++) { - var target = event.targets[i]; - var eff1 = get.damageEffect(target, player, player); - var eff2 = get.damageEffect(target, player, player, "thunder"); - eff += eff2; - eff -= eff1; - } - return eff >= 0; - }, - content: function () { - game.setNature(trigger.card, "thunder"); - if (get.itemtype(trigger.card) == "card") { - var next = game.createEvent("fulu_clear"); - next.card = trigger.card; - event.next.remove(next); - trigger.after.push(next); - next.setContent(function () { - game.setNature(card, []); - }); - } - }, - }, - fuji: { - trigger: { global: "damageBegin1" }, - filter: function (event) { - return event.source && event.source.isIn() && event.hasNature("thunder"); - }, - check: function (event, player) { - return get.attitude(player, event.source) > 0 && get.attitude(player, event.player) < 0; - }, - prompt: function (event) { - return ( - get.translation(event.source) + - "即将对" + - get.translation(event.player) + - "造成伤害," + - get.prompt("fuji") - ); - }, - logTarget: "source", - content: function () { - trigger.source.judge().callback = lib.skill.fuji.callback; - }, - callback: function () { - var evt = event.getParent(2); - if (event.judgeResult.color == "black") { - //game.cardsDiscard(card); - evt._trigger.num++; - } else { - evt._trigger.source.gain(card, "gain2"); - } - }, - }, - }, - characterReplace: {}, - dynamicTranslate: {}, - translate: { - sp_gongsunzan: "SP公孙瓒", - sp_gongsunzan_prefix: "SP", - sp_simazhao: "SP司马昭", - sp_simazhao_prefix: "SP", - sp_wangyuanji: "SP王元姬", - sp_wangyuanji_prefix: "SP", - sp_xinxianying: "SP辛宪英", - sp_xinxianying_prefix: "SP", - sp_liuxie: "SP刘协", - sp_liuxie_prefix: "SP", - spyicong_info: - "弃牌阶段结束时,你可以将任意张牌置于你的武将牌上,称为「扈」。每有一张「扈」,其他角色与你计算距离时便+1。", - spyicong: "义从", - sptuji: "突骑", - sptuji_info: - "准备开始时,你将所有「扈」置于弃牌堆,然后你本回合内计算与其他角色的距离时-X。若X不大于1,你摸一张牌。(X为以此法进入弃牌堆的「扈」的数量)", - sphuangen: "皇恩", - sphuangen_info: - "一名角色使用锦囊牌指定目标时,若此牌的目标数大于1,则你可以令此牌对其中的至多X个目标无效,然后摸一张牌。(X为你的体力值)", - sphantong: "汉统", - sphantong_gain: "汉统", - sphantong_info: - "当你的牌因弃牌阶段的游戏规则要求而进入弃牌堆后,你可以将这些牌置于你的武将牌上,称为「诏」。一名角色的回合开始时,你可以弃置一张「诏」并获得〖护驾〗/〖激将〗/〖救援〗/〖血裔〗中的一个技能直至当前回合结束。", - spzhaoxin: "昭心", - spzhaoxin_info: "摸牌阶段结束时,你可以展示所有手牌,然后视为使用一张【杀】。", - splanggu: "狼顾", - splanggu_rewrite: "狼顾", - splanggu_info: - "当你受到有来源的伤害后,你可以进行判定(此判定结果生效前,你可以打出一张手牌替换判定牌)。然后你可以观看伤害来源的手牌并弃置其中的任意张与判定结果花色相同的牌。", - spfuluan: "扶乱", - spfuluan_info: - "出牌阶段限一次,你可以弃置三张花色相同的牌并选择攻击范围内的一名角色。若如此做,该角色翻面且你不能使用【杀】直到回合结束。", - spshude: "淑德", - spshude_info: "结束阶段开始时,你可以将手牌补至体力上限。", - spmingjian: "明鉴", - spmingjian_info: - "一名角色的回合开始时,你可以选择一项:①弃置一张牌,然后其跳过本回合的判定阶段。②将一张手牌置于其武将牌上,然后其本回合内进行判定时不触发「判定结果生效前」的时机,且其回合结束时将此牌置入弃牌堆。", - spyinzhi: "隐智", - spyinzhi_info: - "当你受到1点伤害后,你可以亮出牌堆顶的两张牌。若其中有黑桃牌,则你可以进行至多X次「令一名角色获得伤害来源的一张手牌」的步骤。然后获得其余的牌。(X为其中黑桃牌的数量)", - yj_caoang: "用间曹昂", - yj_caoang_prefix: "用间", - yjxuepin: "血拼", - yjxuepin_info: - "出牌阶段限一次,你可以选择攻击范围内的一名角色并失去1点体力。你弃置其两张牌。若这两张牌类型相同,你回复1点体力。", - ns_chendao: "用间陈到", - ns_chendao_prefix: "用间", - nsjianglie: "将烈", - nsjianglie_info: "当你使用【杀】指定目标后,你可以令其展示所有手牌,然后弃置其中一种颜色的牌。", - ns_jiaxu: "★贾诩", - ns_jiaxu_prefix: "★", - nsyice: "遗策", - nsyice_info: - "锁定技,当你使用/打出/弃置的牌进入弃牌堆后,你将这些牌以任意顺序置于你的武将牌上,称为“策”。若这些“策”中有点数相同的牌,则你获得这两张牌中的所有牌,将这两张牌置于牌堆两端。若场上没有处于濒死状态的角色,则你对一名角色造成1点伤害。", - ns_lijue: "SP李傕", - ns_lijue_prefix: "SP", - ns_zhangji: "SP张济", - ns_zhangji_prefix: "SP", - nsfeixiong: "飞熊", - nsfeixiong_info: "出牌阶段开始时,你可以和一名其他角色拼点。赢的角色对没赢的角色造成1点伤害。", - nscesuan: "策算", - nscesuan_info: - "锁定技,当你受到伤害时,你防止此伤害并失去1点体力上限。若你因以此法失去体力上限导致体力值减少,则你摸一张牌。", - nslulve: "掳掠", - nslulve_info: - "出牌阶段限一次,你可以弃置X张牌并选择一名装备区内有牌的其他角色,然后对其造成1点伤害(X为其装备区内的牌数)。", - ns_fanchou: "SP樊稠", - ns_fanchou_prefix: "SP", - nsyangwu: "扬武", - nsyangwu_info: - "出牌阶段限一次,你可以弃置一张♥手牌并选择一名手牌数大于你的其他角色。你观看其手牌并获得其中的X张牌(X为其与你手牌数之差的一半且向上取整)。", - jsp_liubei: "★刘备", - jsp_liubei_prefix: "★", - jsprende: "仁德", - jsprende_info: - "出牌阶段,你可以将至少一张手牌交给其他角色;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌。", - ns_caoanmin: "战役篇曹安民", - ns_caoanmin_prefix: "战役篇", - nskuishe: "窥舍", - nskuishe_info: - "出牌阶段限一次,你可以选择一名其他角色A的一张牌,并将此牌交给不为A的一名角色。然后A可以对你使用一张【杀】。", - sp_xiahoushi: "SP夏侯氏", - sp_xiahoushi_prefix: "SP", - xinfu_yanyu: "燕语", - xinfu_yanyu_info: - "一名角色的出牌阶段开始时,你可以弃置一张牌。若如此做,则该出牌阶段内限三次,当一张与你弃置的牌类别相同的其他牌进入弃牌堆后,你可令任意一名角色获得此牌。", - xinfu_yanyu2: "燕语", - xinfu_xiaode: "孝德", - xinfu_xiaode_info: - "其他角色死亡后,你可以声明该角色武将牌上的一个技能(主公技、觉醒技、隐匿技、使命技除外)。若如此做,你获得此技能且不能再发动〖孝德〗直到你的回合结束。", - jsp_zhaoyun: "J.SP赵云", - jsp_zhaoyun_prefix: "J.SP", - chixin: "赤心", - chixin1: "赤心", - chixin2: "赤心", - chixin_info: - "你可以将♦牌当作【杀】或【闪】使用或打出。出牌阶段,你对在你攻击范围内且本回合内未成为过你使用的【杀】的目标的角色使用的【杀】没有次数限制。", - suiren: "随仁", - suiren_info: - "限定技,准备阶段开始时,你可以失去技能〖义从〗,然后加1点体力上限并回复1点体力,然后令一名角色摸三张牌。", - huangjinleishi: "黄巾雷使", - fulu: "符箓", - fulu_info: "当你声明使用普通【杀】后,你可以将此【杀】改为雷【杀】。", - fuji: "助祭", - fuji_info: - "当一名角色造成雷属性伤害时,你可以令其进行判定,若结果为黑色,此伤害+1;若结果为红色,该角色获得判定牌。", - sp_pangtong: "☆SP庞统", - sp_pangtong_prefix: "☆SP", - manjuan: "漫卷", - manjuan_info: "其他角色的牌因弃置而进入弃牌堆后,你可以弃置一张花色与之不同的牌,然后获得此牌。", - xinmanjuan: "漫卷", - xinmanjuan_info: - "锁定技,当你不因〖漫卷〗或〖醉乡〗而得到牌时,你将此牌置入弃牌堆。然后若此时处于你的回合内,则你可以从弃牌堆中选择获得一张与此牌点数相同的其他牌。", - zuixiang: "醉乡", - zuixiang2: "醉乡", - zuixiang_info: - "限定技。准备阶段开始时,你可以亮出牌堆顶的三张牌并置于你的武将牌上。你不能使用或打出与该些牌同类的牌,所有同类牌对你无效。之后的每个准备阶段,你须重复展示一次,直到这些牌中任意两张点数相同。然后,你获得这些牌。", - sp_daqiao: "☆SP大乔", - sp_daqiao_prefix: "☆SP", - yanxiao: "言笑", - yanxiao_info: - "出牌阶段,你可以将一张♦牌置于一名角色的判定区内。判定区内有〖言笑〗牌的角色下个判定阶段开始时,其获得判定区里的所有牌。", - anxian: "安娴", - anxian_info: - "当你使用【杀】对目标角色造成伤害时,你可以防止此伤害,令其弃置一张手牌,然后你摸一张牌;当你成为【杀】的目标后,你可以弃置一张手牌,令此【杀】对你无效,然后此【杀】的使用者摸一张牌。", - sp_ganning: "☆SP甘宁", - sp_ganning_prefix: "☆SP", - yinling: "银铃", - yinling_bg: "锦", - yinling_info: - "出牌阶段,若你的“锦”小于四张,你可以弃置一张黑色牌并指定一名其他角色。若如此做,你将其的一张牌置于你的武将牌上,称为“锦”。", - junwei: "军威", - junwei2: "军威", - junwei_info: - "结束阶段开始时,你可以移去三张“锦”。若如此做,你须指定一名角色并令其选择一项:1.展示一张【闪】,然后你将此【闪】交给一名其他角色。2.该角色失去1点体力,然后你将其装备区内的一张牌移出游戏。该角色的回合结束后,将以此法移出游戏的装备牌移回原处。", - sp_xiahoudun: "☆SP夏侯惇", - sp_xiahoudun_prefix: "☆SP", - fenyong: "愤勇", - fenyong2: "愤勇", - fenyong2_bg: "勇", - fenyong_info: - "每当你受到一次伤害后,你可以获得一枚「愤勇」标记;当你拥有「愤勇」标记时,防止你受到的所有伤害。", - xuehen: "雪恨", - xuehen_info: - "每个角色的结束阶段开始时,若你有愤勇标记,你弃置之,然后选择一项:1.弃置当前回合角色X张牌(X为你已损失的体力值);2.视为对一名任意角色使用一张【杀】。", - sp_lvmeng: "☆SP吕蒙", - sp_lvmeng_prefix: "☆SP", - tanhu: "探虎", - tanhu2: "探虎", - tanhu3: "探虎", - tanhu_info: - "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得以下效果直到回合结束:你与该角色的距离为1,你对该角色使用的普通锦囊牌不能被【无懈可击】响应。", - mouduan: "谋断", - mouduan_info: - "游戏开始时,你获得标记“武”并获得技能〖激昂〗和〖谦逊〗。当你失去手牌后,若手牌数不大于2,你须将你的标记变为“文”,将这两项技能改为〖英姿〗和〖克己〗。一名角色的回合开始前,你可弃一张牌将标记翻回。", - sp_zhangfei: "☆SP张飞", - sp_zhangfei_prefix: "☆SP", - jie: "嫉恶", - jie_info: "锁定技,当你使用红色【杀】造成伤害时,此伤害+1。", - dahe: "大喝", - dahe2: "大喝", - dahe2_bg: "喝", - dahe_info: - "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,该角色不能使用或打出不为♥花色的【闪】直到回合结束,且你可将该角色拼点的牌交给场上一名体力不多于你的角色。若你没赢,你须展示手牌并弃置其中的一张。", - sp_liubei: "☆SP刘备", - sp_liubei_prefix: "☆SP", - zhaolie: "昭烈", - zhaolie_info: - "摸牌阶段摸牌时,你可以少摸一张牌并指定攻击范围内的一名角色。你亮出牌堆顶的三张牌,将其中的非基本牌和【桃】置于弃牌堆,然后该角色选择一项:1.你对其造成X点伤害,然后其获得这些基本牌;2.其弃置X张牌,然后你获得这些基本牌。(X为其中非基本牌的数量)", - shichou: "誓仇", - shichou2: "誓仇", - shichou_info: - "主公技,限定技,准备阶段,你可指定一名蜀势力角色并交给其两张牌。本局游戏中,当你受到伤害时,改为该角色受到等量的伤害并摸等量的牌,直至该角色第一次进入濒死状态。", - longyufei: "龙羽飞", - longyi: "龙裔", - longyi_info: - "你可将所有手牌当做任意基本牌使用或打出。若此牌对应的实体牌中:有锦囊牌,你摸一张牌;有装备牌,此牌不可被响应。", - zhenjue: "阵绝", - zhenjue_info: - "一名角色的结束阶段开始时,若你没有手牌,则你可以令其选择一项:①弃置一张牌。②令你摸一张牌。", - //用间 - yj_caocao: "用间曹操", - yj_caocao_prefix: "用间", - yjxiandao: "献刀", - yjxiandao_info: - "每回合限一次。当你赠予其他角色一张牌后,你令其不能使用或打出与本次赠予移动的牌A花色相同的牌直到回合结束。然后若牌A:为锦囊牌,你摸两张牌。为装备牌,你获得其一张不为A的牌。为武器牌,你对其造成1点伤害。", - yjsancai: "散财", - yjsancai_info: - "出牌阶段限一次,你可以展示所有手牌。若这些牌的类别均相同,则你可以赠予一名其他角色一张手牌。", - yjyibing: "义兵", - yjyibing_info: - "当你不因赠予且不因〖义兵〗的嵌套结算而于摸牌阶段外得到牌时,你可以将此次得到的所有牌当做【杀】使用(无距离限制且不计入使用次数)。", - yj_caohong: "用间曹洪", - yj_caohong_prefix: "用间", - yjlifeng: "厉锋", - yjlifeng_info: - "①出牌阶段限一次。你可以获得弃牌堆里的一张装备牌。②你发动〖赠予〗可以选择手牌区里的装备牌或装备区里的牌。", - yj_zhangfei: "用间张飞", - yj_zhangfei_prefix: "用间", - yjmangji: "莽击", - yjmangji_info: - "锁定技。当你装备区里的牌数或体力值变化后,若你的体力值不小于1,你弃置一张手牌并视为使用一张【杀】。", - yongjian_ganning: "用间甘宁", - yongjian_ganning_prefix: "用间", - yjjielve: "劫掠", - yjjielve_info: - "你可以将两张颜色相同的牌当【趁火打劫】使用,若你以此法造成伤害,此技能于本回合失效。", - //什么?孙鲁班?谁会做这种离谱的东西 - yj_dongzhuo: "用间董卓", - yj_dongzhuo_prefix: "用间", - yjtuicheng: "推诚", - yjtuicheng_info: "你可以失去1点体力并视为使用一张【推心置腹】。", - yjyaoling: "耀令", - yjyaoling_info: - "出牌阶段结束时,你可以减1点体力上限并选择一名其他角色A和一名角色B,你令A选择一项:1.对B使用一张【杀】;2.你弃置其一张牌。", - yjshicha: "失察", - yjshicha_info: - "锁定技。弃牌阶段开始时,若你本回合未发动过〖推诚〗或〖耀令〗之一,你本回合的手牌上限为1。", - yjyongquan: "拥权", - yjyongquan_info: "主公技。结束阶段,其他群势力角色依次可以交给你一张牌。", - yj_liru: "用间李儒", - yj_liru_prefix: "用间", - yjdumou: "毒谋", - yjdumou_info: - "锁定技。你的回合内,其他角色的黑色手牌均视为【毒】,你的【毒】均视为【过河拆桥】。", - yjweiquan: "威权", - yjweiquan_info: - "限定技。出牌阶段,你可以选择至多X名角色(X为游戏轮数),然后选择一名角色A,这些角色依次将一张手牌交给A。然后若A的手牌数大于体力值,其插入执行一个仅有弃牌阶段的回合。", - yjrenwang: "人望", - yjrenwang_info: "出牌阶段限一次。你可以选择弃牌堆中的一张黑色基本牌,令一名角色获得之。", - yj_xuyou: "用间许攸", - yj_xuyou_prefix: "用间", - yjshicai: "恃才", - yjshicai_info: - "①回合内,牌堆顶的一张牌对你可见。②出牌阶段限一次。你可以弃置一张牌,展示并获得牌堆顶的一张牌。当此牌离开你的手牌区后,重置〖恃才②〗。", - yjchenggong: "逞功", - yjchenggong_info: "当一名角色使用牌指定第一个目标后,若此牌目标数大于1,你可以令其摸一张牌。", - yjzezhu: "择主", - yjzezhu_info: "出牌阶段限一次。你可以获得主公区域内的一张牌,然后交给其一张牌。", - yj_jiaxu: "用间贾诩", - yj_jiaxu_prefix: "用间", - yjzhenlve: "缜略", - yjzhenlve_info: "锁定技。①你使用的普通锦囊牌不能被响应。②你不能成为延时锦囊牌的目标。", - yjjianshu: "间书", - yjjianshu_info: - "出牌阶段限一次。你可以将一张手牌交给一名其他角色,令其与你选择的另一名其他角色拼点,没赢的角色失去1点体力。", - yjyongdi: "拥嫡", - yjyongdi_info: - "限定技。准备阶段,你可以令一名男性角色加1点体力上限并回复1点体力,然后若其武将牌上有主公技且其不为主公,其获得此主公技。", - yj_zhugedan: "用间诸葛诞", - yj_zhugedan_prefix: "用间", - yj_zhenji: "用间甄宓", - yj_zhenji_prefix: "用间", - yjluoshen: "洛神", - yjluoshen_info: "准备阶段,你可以判定并获得判定牌,且可重复此流程直到结果的颜色不同。", - //线下E系列 一战成名 战役篇官盗 - shen_jiaxu: "战役篇神贾诩", - shen_jiaxu_prefix: "战役篇神", - zybishi: "避世", - zybishi_info: "当你成为【杀】的目标后,你可以令使用者摸一张牌,然后令此【杀】无效。", - zyjianbing: "谏兵", - zyjianbing_info: - "当一名其他角色受到执行【杀】的效果而受到伤害时,你可以获得其一张牌。若此牌花色为♥,其回复1点体力。", - pe_wangyun: "战役篇王允", - pe_wangyun_prefix: "战役篇", - zylianji: "连计", - zylianji_info: - "出牌阶段结束时,若你于此阶段使用牌的类别数达到:1,你可以令一名角色摸一张牌;2,你可以回复1点体力;3,你可以跳过本回合剩余阶段,然后令一名其他角色执行一个仅有你于此回合未执行过的阶段的回合。", - zymoucheng: "谋逞", - zymoucheng_info: "每回合限一次。你可以将一张黑色牌当【借刀杀人】使用。", - pe_zhonghui: "战役篇钟会", - pe_zhonghui_prefix: "战役篇", - zyquanji: "权计", - zyquanji_info: - "①当你受到伤害后或使用牌对唯一目标造成伤害后,你可以摸一张牌并将一张牌置于武将上,称为“权”。②你的手牌上限+X(X为“权”数)。", - zypaiyi: "排异", - zypaiyi_backup: "排异", - zypaiyi_info: - "出牌阶段限一次。你可以移去一张“权”并令一名角色摸X张牌(X为“权”数,且至多为7),然后若其手牌数大于你,你对其造成1点伤害。", - pe_mengda: "战役篇孟达", - pe_mengda_prefix: "战役篇", - qiuan: "求安", - qiuan_info: - "当你受到伤害后,若此伤害的渠道有对应的实体牌且你的武将牌上没有“函”,则你可以防止此伤害并将这些牌置于你的武将牌上,称为“函”。", - liangfan: "量反", - liangfan2: "量反", - liangfan_info: - "锁定技,准备阶段开始时,若你的武将牌上有“函”,则你获得这些牌,然后失去1点体力。当你于此回合内因使用实体牌中包含“函”的牌且执行这些牌的效果而造成伤害后,你可以获得目标角色的一张牌。", - pe_sunchen: "战役篇孙綝", - pe_sunchen_prefix: "战役篇", - zyshilu: "嗜戮", - zyshilu_info: - "①一名角色死亡后,你可以将其武将牌置于你的武将牌上,称为“戮”,若杀死其的角色是你,你将一张武将牌堆里的牌置为“戮”。②回合开始时,你可以弃置至多X张牌,然后摸等量的牌(X为“戮”数)。", - zyxiongnve: "凶虐", - zyxiongnve_info: - "①出牌阶段开始时,你可以将一张“戮”置入武将牌堆并选择一项直到回合结束:1.当你造成伤害时,此伤害+1;2.当你对其他角色造成伤害时,获得其一张牌;3.你使用牌无次数限制。②出牌阶段结束时,你可以将两张“戮”置入武将牌堆,然后当你于下回合开始前受到其他角色造成的伤害时,此伤害-1。", - pe_wenqin: "战役篇文钦", - pe_wenqin_prefix: "战役篇", - gzjinfa: "矜伐", - gzjinfa_info: - "出牌阶段限一次。你可以弃置一张牌,令一名其他角色选择一项:1.令你获得其一张牌;2.交给你一张装备牌,若此牌花色为♠,其视为对你使用一张【杀】。", - zyshangyi: "尚义", - zyshangyi_info: - "出牌阶段限一次。你可以令一名其他角色观看你的手牌,然后你观看其手牌并可以弃置其中一张牌。", - zymingshi: "名士", - zymingshi_info: "锁定技。若你有空置的防具栏,属性【杀】对你无效。", - gzsuishi: "随势", - gzsuishi2: "随势", - gzsuishi_info: - "锁定技,其他角色进入濒死状态时,若伤害来源与你势力相同,你摸一张牌;其他角色死亡时,若其与你势力相同,你失去1点体力。", - //线下S系列 - ps_guanyu: "★关羽", - ps_guanyu_prefix: "★", - pszhonghun: "忠魂", - pszhonghun_info: "当你使用或打出红色牌时,你可以亮出牌堆顶的一张牌。若此牌为红色,你获得之。", - ps2070_guojia: "★郭嘉", - ps2070_guojia_prefix: "★", - psquanmou: "全谋", - psquanmou_info: - "当其他角色使用锦囊牌结算结束后,若你是此牌目标,你可以弃置一张与此牌颜色相同的手牌并获得之。", - ps1059_guojia: "★郭嘉", - ps1059_guojia_prefix: "★", - psqizuo: "奇佐", - psqizuo_info: - "当你攻击范围内的角色造成或受到伤害时,你可以弃置一张牌并判定,若此牌颜色与结果相同,你可以令此伤害+1或-1。", - ps2063_zhaoyun: "★赵云", - ps2063_zhaoyun_prefix: "★", - psqijin: "七进", - psqijin_info: "摸牌阶段,你可以改为亮出牌堆顶的七张牌,并获得其中一种颜色的所有牌。", - psqichu: "七出", - psqichu_info: - "每回合限一次。当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌。若其中有此牌,你可以使用或打出之。", - pslongxin: "龙心", - pslongxin_info: "判定阶段开始时,你可以弃置一张装备牌,然后弃置你判定区里的一张牌。", - ps2080_zhouyu: "★周瑜", - ps2080_zhouyu_prefix: "★", - psshiyin: "识音", - psshiyin_info: - "①游戏开始时,你可以将一张手牌置于武将牌上,称为“杂音”牌。②出牌阶段开始时,你可以用一张手牌替换“杂音”牌。", - psquwu: "曲误", - psquwu_info: "锁定技。你不能使用或打出与“杂音”牌花色相同的牌,且这些牌对你无效。", - psliaozou: "聊奏", - psliaozou_info: "出牌阶段,你可以展示所有手牌,若其中没有与“杂音”牌花色相同的牌,你摸一张牌。", - ps1062_zhouyu: "★周瑜", - ps1062_zhouyu_prefix: "★", - psoldshiyin: "识音", - psoldshiyin_info: - "当你于回合内得到牌后,你可以展示之,然后根据你展示的牌包含的花色数令你本回合使用的下一张牌获得对应效果:不小于1,不能被响应;不小于2,造成的伤害+1;不小于3,使用时摸一张牌。", - ps_caozhi: "★曹植", - ps_caozhi_prefix: "★", - psliushang: "流殇", - psliushang_info: - "锁定技。①摸牌阶段,你改为摸X+1张牌,然后依次将一张手牌置于所有其他角色的武将牌上,称为“流殇”牌(X为场上角色数且至少为3)。②其他角色的准备阶段,其选择一项:1.获得其“流殇”牌,且当其于本回合对你造成伤害时,防止此伤害;2.将其“流殇”牌置入弃牌堆。", - psqibu: "七步", - psqibu_info: - "限定技。当你进入濒死状态时,你可以亮出牌堆顶的七张牌,回复等同于其中♥牌数的体力,并获得所有♣牌。", - ps_jin_simayi: "★司马懿", - ps_jin_simayi_prefix: "★", - psquanyi: "权奕", - psquanyi_info: - "①出牌阶段限一次。你可以与一名角色拼点,赢的角色根据所有拼点牌的花色执行以下效果:♥,其获得没赢的角色区域里的一张牌;♦其对没赢的角色造成1点伤害;♠,其失去1点体力;♣,其弃置两张牌。②当你拼点时,你可以选择牌堆顶的牌作为拼点牌。", - ps2067_zhaoyun: "武将传赵云", - ps2067_zhaoyun_prefix: "武将传", - pshuiqiang: "回枪", - pshuiqiang_info: "当你使用的【杀】被【闪】抵消后,你可以对其使用一张【杀】。", - pshuntu: "魂突", - pshuntu_info: "出牌阶段限一次。当你使用【杀】对目标角色造成伤害后,你可以对其使用一张【杀】。", - ps_caopi: "★曹丕", - ps_caopi_prefix: "★", - psjianwei: "僭位", - psjianwei_info: "限定技。回合开始时,你可以失去1点体力,然后与一名其他角色交换区域里的所有牌。", - ps2068_simayi: "★司马懿", - ps2068_simayi_prefix: "★", - pszhonghu: "冢虎", - pszhonghu_info: - "当一名角色于你的回合外死亡后,你可以结束此回合,然后令所有角色于其回合开始前跳过此回合直到你的回合开始前。", - ps_simayi: "★司马懿", - ps_simayi_prefix: "★", - pshuxiao: "虎啸", - pshuxiao_info: - "回合开始时,你可以判定。若结果为基本牌或普通锦囊牌,你于本回合内获得如下效果:你可以将与结果点数或花色相同的手牌当与判定牌牌名和属性相同的牌使用。", - ps_zhugeliang: "★诸葛亮", - ps_zhugeliang_prefix: "★", - psguanxing: "观星", - psguanxing_info: "准备阶段,你可以观看牌堆顶的五张牌,并将其以任意顺序置于牌堆项或牌堆底。", - pslongyin: "龙吟", - pslongyin_info: - "每回合限一次。你可以将任意张点数和为13的牌当做任意一张基本牌或普通锦囊牌使用或打出。", - ps2066_zhugeliang: "武将传诸葛亮", - ps2066_zhugeliang_prefix: "武将传", - pszhiji: "智激", - pszhiji_info: - "出牌阶段限一次。你可以弃置两张手牌并选择两名势力不同的角色,视为这两名角色依次视为对对方使用一张【杀】。", - psjiefeng: "借风", - psjiefeng_info: - "出牌阶段,你可以弃置两张手牌,然后亮出牌堆顶五张牌。若其中有至少两张红色牌,你视为使用一张【万箭齐发】。", - ps_machao: "★马超", - ps_machao_prefix: "★", - psweihou: "威侯", - psweihou_info: - "当你判定前,你可以亮出牌堆顶的两张牌,选择其中一张作为你的本次判定结果,然后将另一张置入弃牌堆。", - ps_lvbu: "★吕布", - ps_lvbu_prefix: "★", - pssheji: "射戟", - pssheji_info: - "出牌阶段限一次。你可以将所有手牌当一张无距离限制的【杀】使用,然后当此【杀】对目标角色造成伤害后,你获得其装备区里的所有武器牌和坐骑牌。", - ps_jiaxu: "★贾诩", - ps_jiaxu_prefix: "★", - psqupo: "驱魄", - psqupo_info: - "一名角色A的回合开始时,你可以将一张牌交给另一名其他角色B。若此牌为:黑色,当A使用【杀】指定不为B的角色为目标时,A失去1点体力;红色,当B于本回合下一次受到伤害时,B失去1点体力。", - psbaoquan: "保全", - psbaoquan_info: "当你受到伤害时,你可以弃置一张锦囊牌并防止此伤害。", - //S特 - ps_shen_machao: "S特神马超", - ps_shen_machao_prefix: "S特神", - psshouli: "狩骊", - psshouli_info: - "锁定技。①游戏开始时,所有角色依次选择一项:1.使用一张坐骑牌,然后摸一张牌;2.随机从游戏外的八张坐骑牌指示物中使用一张。②你可以将场上一张进攻坐骑当【杀】,防御坐骑当【闪】使用或打出,若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。", - pshengwu: "横骛", - pshengwu_info: - "当你使用或打出牌时,若场上有该花色的装备牌,你可以弃置任意张该花色的手牌,然后摸X张牌(X为你弃置的牌数与场上与此牌花色相同的装备牌数之和)。", - //线下K系列木盒 - pk_sp_duyu: "K系列杜预", - pk_sp_duyu_prefix: "K系列", - pkwuku: "武库", - pkwuku_info: "锁定技。当有角色使用装备牌时,若你的“武库”数小于3,则你获得1枚“武库”。", - pksanchen: "三陈", - pksanchen_info: - "觉醒技。结束阶段,若你的“武库”数大于2,则你加1点体力上限并回复1点体力,然后获得〖灭吴〗。", - pkmiewu: "灭吴", - pkmiewu2: "灭吴", - pkmiewu_info: - "每回合限一次。你可移去1枚“武库”,视为使用或打出任意一张基本牌或普通锦囊牌,然后摸一张牌。", - //天书乱斗虚拟偶像 - vtb_xiaosha: "小杀", - vtbguisha: "瑰杀", - vtbguisha_info: - "当其他角色使用【杀】时,你可以弃置一张牌令此【杀】不计入次数,且此【杀】对目标角色造成的伤害+1。", - vtbshuli: "淑丽", - vtbshuli_info: "每回合限两次。当其他角色使用【杀】造成伤害后,你可以与其各摸一张牌。", - vtb_xiaoshan: "小闪", - vtbshanwu: "闪舞", - vtbshanwu_info: - "当其他角色成为【杀】的第一个目标时,你可以弃置一张【闪】,然后取消此【杀】的所有目标。", - vtbxianli: "娴丽", - vtbxianli_info: "每回合限两次。当你失去牌后,若其中有【闪】,你可以获得当前回合角色的一张牌。", - vtb_xiaotao: "小桃", - vtbtaoyan: "桃宴", - vtbtaoyan_info: - "回合开始时,你可以令至多两名其他角色摸一张牌并于游戏外获得一张【桃】(共五张且均为♥6)。", - vtbyanli: "妍丽", - vtbyanli_info: - "每轮限一次。一名角色于你的回合外进入濒死状态时,你可以令其回复至1点体力,然后其摸一张牌。", - vtb_xiaole: "小乐", - vtbleyu: "乐虞", - vtbleyu_info: - "一名角色的回合开始时,你可以弃置三张牌令其判定。若结果不为♥,其跳过本回合的出牌阶段。", - vtbyuanli: "媛丽", - vtbyuanli_info: "一名角色跳过出牌阶段后,你可以与一名其他角色各摸一张牌。", - vtb_xiaojiu: "小酒", - vtbmeiniang: "美酿", - vtbmeiniang_info: - "其他角色的出牌阶段开始时,你可以令其视为使用一张无次数限制且不计入次数的【酒】。", - vtbyaoli: "媱丽", - vtbyaoli_info: - "其他角色于其出牌阶段内使用【酒】后,你可以令其于本回合内使用的下一张【杀】不能被响应且可以额外指定一个目标。", - old_machao: "J.SP马超", - old_machao_prefix: "J.SP", - jsp_caoren: "☆SP曹仁", - jsp_caoren_prefix: "☆SP", - jsp_ganfuren: "SP甘夫人", - jsp_ganfuren_prefix: "SP", - zhangliang: "SP张梁", - zhangliang_prefix: "SP", - ol_xinxianying: "将辛宪英", - ol_xinxianying_prefix: "将", - jiangqing: "战役篇蒋钦", - jiangqing_prefix: "战役篇", - tianfeng: "战役篇田丰", - tianfeng_prefix: "战役篇", - jiling: "战役篇纪灵", - jiling_prefix: "战役篇", - kongrong: "战役篇孔融", - kongrong_prefix: "战役篇", - mateng: "战役篇马腾", - mateng_prefix: "战役篇", - drag_guanyu: "龙关羽", - drag_guanyu_prefix: "龙", - drag_caoren: "龙曹仁", - drag_caoren_prefix: "龙", - drag_lvchang: "龙吕常", - drag_lvchang_prefix: "龙", - dragchaojue: "超绝", - dragchaojue_info: - "准备阶段,你可以弃置一张手牌,然后令所有其他角色本回合不能使用或打出此花色的牌,然后这些角色依次选择一项:①正面朝上交给你一张牌;②本回合非锁定技失效。", - dragjunshen: "军神", - dragjunshen_info: - "①你可以将一张红色牌当作【杀】使用或打出。②当你使用〖军神①〗转化的【杀】造成伤害时,你可以令受伤角色选择弃置装备区的所有牌或令此伤害+1。③你使用方片【杀】无距离限制,使用红桃【杀】可以额外选择一个目标。", - draglizhong: "厉众", - draglizhong_info: - "结束阶段,你可以以任意顺序选择执行任意项:①将任意张装备牌置入任意名角色的装备区;②令你或任意名装备区里有牌的角色各摸一张牌。然后本次成为〖厉众②〗的角色于本轮手牌上限+2且可以将装备区的牌当作【无懈可击】使用。", - dragjuesui: "玦碎", - dragjuesui_info: - "每名角色限一次,一名角色进入濒死状态时,你可以令其选择是否将体力值回复至1点并废除装备栏。若其选择是,则其本局游戏获得以下效果:你可以将一张黑色非基本牌当作无次数限制的【杀】使用或打出。", - dragjuwu: "拒武", - dragjuwu_info: "锁定技,攻击范围内至少包含三名角色的角色使用的无属性【杀】对你无效。", - dragshouxiang: "守襄", - dragshouxiang_info: - "摸牌阶段,你可以额外摸X张牌。若如此做,你跳过出牌阶段,且本回合的弃牌阶段开始时,你可以交给至多X名角色各一张手牌。(X为攻击范围内包含你的角色)", - - offline_star: "桌游志·SP", - offline_sticker: "桌游志·贴纸", - offline_yijiang: "一将成名", - offline_luanwu: "文和乱武", - offline_yongjian: "用间篇", - offline_yongjian_prefix: "用间", - offline_feihongyingxue: "飞鸿映雪", - offline_piracyE: "官盗E系列·战役篇", - offline_piracyS: "官盗S系列", - offline_vtuber: "天书乱斗·虚拟偶像", - offline_piracyK: "官盗K系列", - offline_others: "线下其他系列", - offline_longyutao: "龙起襄樊", - }, - }; -}); diff --git a/character/offline/card.js b/character/offline/card.js new file mode 100644 index 000000000..d41c2e9c1 --- /dev/null +++ b/character/offline/card.js @@ -0,0 +1,20 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + yanxiao_card: { + type: "special_delay", + fullimage: true, + noEffect: true, + ai: { + basic: { + order: 1, + useful: 1, + value: 8, + }, + result: { + target: 1, + }, + }, + }, +}; +export default cards; diff --git a/character/offline/character.js b/character/offline/character.js new file mode 100644 index 000000000..360a057b5 --- /dev/null +++ b/character/offline/character.js @@ -0,0 +1,80 @@ +const characters = { + drag_guanyu: ["male", "shu", 4, ["dragchaojue", "dragjunshen"]], + drag_caoren: ["male", "wei", 4, ["draglizhong", "dragjuesui"]], + drag_lvchang: ["male", "wei", 3, ["dragjuwu", "dragshouxiang"]], + jsp_ganfuren: ["female", "shu", 3, ["shushen", "shenzhi"], ["character:gz_ganfuren"]], + ol_xinxianying: ["female", "wei", 3, ["xincaishi", "xinzhongjian"]], + zhangliang: ["male", "qun", 4, ["old_jijun", "old_fangtong"]], + jsp_caoren: ["male", "wei", 4, ["kuiwei", "yanzheng"]], + old_machao: ["male", "qun", 4, ["zhuiji", "oldcihuai"]], + vtb_xiaosha: ["female", "qun", 4, ["vtbguisha", "vtbshuli"]], + vtb_xiaoshan: ["female", "qun", 4, ["vtbshanwu", "vtbxianli"]], + vtb_xiaotao: ["female", "qun", 4, ["vtbtaoyan", "vtbyanli"]], + vtb_xiaole: ["female", "qun", 4, ["vtbleyu", "vtbyuanli"]], + vtb_xiaojiu: ["female", "qun", 4, ["vtbmeiniang", "vtbyaoli"]], + ps_shen_machao: ["male", "shen", 4, ["psshouli", "pshengwu"], ["qun"]], + mateng: ["male", "qun", 4, ["mashu", "xiongyi"]], + tianfeng: ["male", "qun", 3, ["sijian", "gzsuishi"]], + jiling: ["male", "qun", 4, ["shuangren"]], + kongrong: ["male", "qun", 3, ["zymingshi", "lirang"]], + jiangqing: ["male", "wu", 4, ["zyshangyi"]], + pk_sp_duyu: ["male", "qun", 4, ["pkwuku", "pksanchen"]], + ps_lvbu: ["male", "qun", 4, ["wushuang", "pssheji"]], + ps_jiaxu: ["male", "qun", 4, ["wansha", "psqupo", "psbaoquan"]], + ps_machao: ["male", "shu", 4, ["mashu", "tieji", "psweihou"]], + ps2066_zhugeliang: ["male", "shu", 3, ["pszhiji", "psjiefeng", "kongcheng"]], + ps_zhugeliang: ["male", "shu", 3, ["psguanxing", "pslongyin"]], + ps_simayi: ["male", "wei", 3, ["reguicai", "pshuxiao"]], + ps2068_simayi: ["male", "wei", 3, ["refankui", "reguicai", "pszhonghu"]], + ps_caopi: ["male", "wei", 3, ["psjianwei", "fangzhu", "songwei"], ["zhu"]], + ps_jin_simayi: ["male", "jin", 3, ["smyyingshi", "psquanyi"]], + ps_caozhi: ["male", "wei", 3, ["psliushang", "psqibu"]], + ps1062_zhouyu: ["male", "wu", 3, ["yingzi", "psoldshiyin"]], + ps2080_zhouyu: ["male", "wu", 3, ["psshiyin", "psquwu", "psliaozou"]], + ps2063_zhaoyun: ["male", "shu", 4, ["psqijin", "psqichu", "pslongxin"]], + ps2067_zhaoyun: ["male", "shu", 4, ["longdan", "pshuiqiang", "pshuntu"]], + ps1059_guojia: ["male", "wei", 3, ["tiandu", "psqizuo"]], + ps2070_guojia: ["male", "wei", 3, ["yiji", "psquanmou"]], + ps_guanyu: ["male", "shu", 4, ["wusheng", "pszhonghun", "nuzhan"]], + pe_wenqin: ["male", "wei", 4, ["gzjinfa"]], + pe_sunchen: ["male", "wu", 4, ["zyshilu", "zyxiongnve"]], + pe_mengda: ["male", "wei", 4, ["qiuan", "liangfan"]], + pe_zhonghui: ["male", "wei", 4, ["zyquanji", "zypaiyi"], ["clan:颍川钟氏"]], + pe_wangyun: ["male", "qun", 3, ["zylianji", "zymoucheng"], ["clan:太原王氏"]], + shen_jiaxu: ["male", "shen", 3, ["weimu", "zybishi", "zyjianbing"], ["qun"]], + yj_zhenji: ["female", "wei", 3, ["yjluoshen", "qingguo"]], + yj_jiaxu: ["male", "wei", 3, ["yjzhenlve", "yjjianshu", "yjyongdi"]], + yj_xuyou: ["male", "qun", 3, ["yjshicai", "yjchenggong", "yjzezhu"]], + yj_dongzhuo: ["male", "qun", 7, ["yjtuicheng", "yjyaoling", "yjshicha", "yjyongquan"], ["zhu"]], + yongjian_ganning: ["male", "wu", 4, ["yjjielve"]], + yj_zhangfei: ["male", "shu", 4, ["yjmangji"]], + yj_caohong: ["male", "wei", 4, ["yjlifeng"]], + yj_liru: ["male", "qun", 3, ["yjdumou", "yjweiquan", "yjrenwang"]], + yj_caocao: ["male", "qun", 4, ["yjxiandao", "yjsancai", "yjyibing"]], + longyufei: ["female", "shu", 3, ["longyi", "zhenjue"]], + sp_liubei: ["male", "shu", 4, ["zhaolie", "shichou"], ["zhu"]], + sp_zhangfei: ["male", "shu", 4, ["jie", "dahe"]], + sp_lvmeng: ["male", "wu", 3, ["tanhu", "mouduan"]], + sp_xiahoudun: ["male", "wei", 4, ["fenyong", "xuehen"], ["die_audio"]], + sp_ganning: ["male", "qun", 4, ["yinling", "junwei"]], + sp_daqiao: ["female", "wu", 3, ["yanxiao", "anxian"]], + sp_pangtong: ["male", "qun", 3, ["xinmanjuan", "zuixiang"]], + huangjinleishi: ["female", "qun", 3, ["fulu", "fuji"]], + jsp_zhaoyun: ["male", "qun", 3, ["chixin", "reyicong", "suiren"]], + sp_xiahoushi: ["female", "shu", 3, ["xinfu_yanyu", "xinfu_xiaode"]], + sp_gongsunzan: ["male", "qun", 4, ["spyicong", "sptuji"]], + sp_simazhao: ["male", "wei", 3, ["spzhaoxin", "splanggu"]], + sp_wangyuanji: ["female", "wei", 3, ["spfuluan", "spshude"]], + sp_xinxianying: ["female", "wei", 3, ["spmingjian", "spyinzhi"]], + sp_liuxie: ["male", "qun", 3, ["sphuangen", "sphantong"]], + ns_lijue: ["male", "qun", "4/6", ["nsfeixiong", "nscesuan"]], + ns_zhangji: ["male", "qun", 4, ["nslulve"]], + ns_fanchou: ["male", "qun", 4, ["nsyangwu"]], + ns_jiaxu: ["male", "qun", 3, ["nsyice", "luanwu"]], + ns_chendao: ["male", "shu", 4, ["nsjianglie"]], + yj_caoang: ["male", "wei", 4, ["yjxuepin"]], + ns_caoanmin: ["male", "wei", 4, ["nskuishe"]], + jsp_liubei: ["male", "qun", 4, ["jsprende"]], +}; + +export default characters; diff --git a/character/offline/characterFilter.js b/character/offline/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/offline/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/offline/characterReplace.js b/character/offline/characterReplace.js new file mode 100644 index 000000000..2092d9297 --- /dev/null +++ b/character/offline/characterReplace.js @@ -0,0 +1,3 @@ +const characterReplaces = {}; + +export default characterReplaces; diff --git a/character/offline/dynamicTranslate.js b/character/offline/dynamicTranslate.js new file mode 100644 index 000000000..cdee02b0a --- /dev/null +++ b/character/offline/dynamicTranslate.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = {}; +export default dynamicTranslates; diff --git a/character/offline/index.js b/character/offline/index.js new file mode 100644 index 000000000..c32c9ea9f --- /dev/null +++ b/character/offline/index.js @@ -0,0 +1,56 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "offline", + connect: true, + connectBanned: ["zhangliang"], + character: { ...characters }, + characterSort: { + offline: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: { + jsp_liubei: "S1019", + ns_caoanmin: "S1023", + longyufei: "S1044", + ps1059_guojia: "S1059", + ps_lvbu: "S1061", + ps1062_zhouyu: "S1062", + ps_jiaxu: "S1066", + ps_jin_simayi: "S1067", + ps_guanyu: "S2065", + ps2063_zhaoyun: "S2063", + ps2066_zhugeliang: "S2066", + ps2067_zhaoyun: "S2067", + ps2068_simayi: "S2068", + ps_machao: "S2069", + ps2070_guojia: "S2070", + ps_simayi: "S2073", + ps_zhugeliang: "S2073", + ps_caopi: "S2075", + ns_jiaxu: "S2079", + ps2080_zhouyu: "S2080", + ps_caozhi: "S2081", + ps_shen_machao: "SX015", + }, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/offline/intro.js b/character/offline/intro.js new file mode 100644 index 000000000..133d010f9 --- /dev/null +++ b/character/offline/intro.js @@ -0,0 +1,14 @@ +const characterIntro = { + lvchang: "吕常(161—221年),荆州南阳博望(今河南省南阳市方城县博望镇)人,汉末至三国时期曹魏将领。吕常曾担任曹魏横海将军、章陵太守,为武猛都尉厉节中郎将裨将军,封关内侯。常以中勇,显名州司,试守雉长,执戈秉戎,慎守易,兵不顿于敌国,坠不侵于四邻,拜武猛都尉厉节中郎将裨将军,封关内侯。王师南征,与充军从,奄有江汉,舍爵册勋,封阴德亭侯,领郡。鸠集荒散,为民统纪,三考有成,转拜平狄将军,改封卢亭侯,莅国赋政,十有三年。会蜀将关羽猖獗为寇,常御之,羽不能克。文帝加其庸,转拜横海将军,徙封西鄂都乡侯,食邑并七百户。年六十一,黄初二年正月卒。", + huangjinleishi: "黄巾军中负责施法的女祭司二人组。", + longyufei: "《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。", + pk_sp_duyu: "杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。", + ps_shen_machao: "字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。", + xiaosha: '2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为三国杀新手菜鸡,误打误撞参加了三国杀组织的《三国之星》选秀大赛,没想到一路靠着颜值和风风火火的爽快性格过关斩将吸粉无数,获得了冠军,成为官方签约的形象代言人。
    小杀现于B站还存在对应账号,但早已荒废。', + xiaoshan: "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀同系不同班的同学,由于本身性格比较安静,所以和风风火火的小杀有些不对盘。知道小杀也玩三国杀后,外表高冷、内心傲娇的她偷偷也去玩了游戏,立志要在游戏里碾压她。
    小闪对应B站账号已销号。", + xiaotao: "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀的亲妹妹,陪姐姐去拍摄代言宣传照的时候,被导演看中,觉得三国美貌姐妹花是非常好的噱头,于是一并签下。正所谓“三国姐妹花,永远不分家!”。
    小桃对应B站账号已销号。", + xiaole: "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上小乐家与小桃小杀家是世交,三人从小就认识。和小闪是同班同学,小乐很喜欢安静的小闪。和小酒是小杀介绍认识的,大家都是打三国杀的网友,在打游戏时候比较依赖小酒——躺赢人躺赢魂,躺赢都是人上人。
    小乐对应B站账号已销号。", + xiaojiu: "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为非人类,是一只年龄成迷的神兽,真身是白泽。是小杀网上玩游戏认识的网友,爱好是喝酒,和小杀也有好酒友的关系。
    小酒对应B站账号已销号。", +}; + +export default characterIntro; diff --git a/character/offline/pinyin.js b/character/offline/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/offline/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/offline/skill.js b/character/offline/skill.js new file mode 100644 index 000000000..9ea1ed88d --- /dev/null +++ b/character/offline/skill.js @@ -0,0 +1,7354 @@ +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"; + targets[0].chooseToCompare(targets[1]); + "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 = ["遗策:选择要放置的卡牌", '
    (从左到右为从旧到新,后选择的后置入)
    ', cards]; + var cards2 = player.getExpansions("nsyice"); + cards2.reverse(); + if (cards2.length) { + dialog.push('
    原有“策”
    '); + dialog.push(cards2); + } + player + .chooseButton(dialog, true, cards.length) + .set("filterButton", function (button) { + return _status.event.cards.includes(button.link); + }) + .set("cards", cards); + } + "step 2"; + player.addToExpansion(result.links, "gain2").gaintag.add("nsyice"); + "step 3"; + var storage = player.getExpansions("nsyice"); + var bool = false; + for (var i = 0; i < storage.length; i++) { + for (var j = storage.length - 1; j > i; j--) { + if (get.number(storage[i]) == get.number(storage[j])) { + bool = true; + break; + } + } + if (bool) break; + } + if (bool) { + event.cards = storage.splice(i, j - i + 1); + } else event.finish(); + "step 4"; + var cardsx = []; + cardsx.push(cards.shift()); + cardsx.push(cards.pop()); + if (cards.length) player.gain(cards, "gain2"); + event.cards = cardsx; + "step 5"; + player.chooseButton(["将一张牌置于牌堆顶,将另一张牌置于牌堆底", cards], true); + "step 6"; + player.lose(event.cards, ui.cardPile).set("topper", result.links[0]).insert_index = function (event, card) { + if (card == event.topper) return ui.cardPile.firstChild; + return null; + }; + if (_status.dying.length) event.finish(); + "step 7"; + player.chooseTarget("对一名角色造成1点伤害", true).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 8"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + target.damage("nocard"); + } + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + marktext: "策", + intro: { + content: "expansion", + markcount: "expansion", + }, + }, + //用间篇 + yjxuepin: { + enable: "phaseUse", + usable: 1, + filterTarget: function (event, player, target) { + return player.inRange(target) && target.countDiscardableCards(player, "he") > 0; + }, + content: function () { + "step 0"; + player.loseHp(); + "step 1"; + if (target.countDiscardableCards(player, "he") > 0) player.discardPlayerCard(target, 2, "he", true); + else event.finish(); + "step 2"; + if (result.bool && result.cards.length == 2 && get.type2(result.cards[0], result.cards[0].original == "h" ? target : false) == get.type2(result.cards[1], result.cards[1].original == "h" ? target : false)) player.recover(); + }, + ai: { + order: 4, + result: { + player: function (player, target) { + if (player.hp == 1) return -8; + if (target.countCards("e") > 1) return 0; + if (player.hp > 2 || target.countCards("h") > 1) return -0.5; + return -2; + }, + target: function (player, target) { + if (target.countDiscardableCards(player, "he") < 2) return 0; + return -2; + }, + }, + }, + }, + nsjianglie: { + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countCards("h") > 0; + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + logTarget: "target", + content: function () { + "step 0"; + trigger.target.showHandcards(); + "step 1"; + var cards = trigger.target.getCards("h"); + var list = []; + for (var i = 0; i < cards.length; i++) { + list.add(get.color(cards[i])); + } + if (list.length == 1) event._result = { control: list[0] }; + else { + list.sort(); + trigger.target + .chooseControl(list) + .set("prompt", "选择弃置一种颜色的所有手牌") + .set("ai", function () { + var player = _status.event.player; + if (get.value(player.getCards("h", { color: "red" })) >= get.value(player.getCards("h", { color: "black" }))) return "black"; + return "red"; + }); + } + "step 2"; + trigger.target.discard(trigger.target.getCards("h", { color: result.control })); + }, + }, + //桌游志贴纸 + spyinzhi: { + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + var cards = game.cardsGotoOrdering(get.cards(2)).cards; + player.showCards(cards); + event.count2 = 0; + for (var i = 0; i < cards.length; i++) { + if (get.suit(cards[i]) == "spade") { + event.count2++; + cards.splice(i--, 1); + } + } + event.cards = cards; + if (!event.count2 || !trigger.source) event.goto(4); + "step 2"; + event.count2--; + if (trigger.source.countCards("h") > 0) { + player + .chooseTarget("令一名角色获得" + get.translation(trigger.source) + "的一张手牌", function (card, player, target) { + var source = _status.event.source; + return target != source && source.countGainableCards(target, "h") > 0; + }) + .set("source", trigger.source); + } else event.goto(4); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line([trigger.source, target], "green"); + target.gainPlayerCard(trigger.source, "h", true); + if (event.count2) event.goto(2); + } + "step 4"; + if (cards.length) player.gain(cards, "gain2", "log"); + "step 5"; + if (event.count > 0 && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { + player.chooseBool(get.prompt2("spyinzhi")).set("frequentSkill", event.name); + } else event.finish(); + "step 6"; + if (result.bool) { + player.logSkill("spyinzhi"); + event.goto(1); + } + }, + }, + spmingjian: { + trigger: { global: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + var next = player.chooseCard(get.prompt2("spmingjian", trigger.player), "he"); + next.set("ai", function (card) { + var target = _status.event.getTrigger().player; + var player = _status.event.player; + if (get.attitude(player, target) > 0 && target.countCards("j") > 0) return 5 - get.value(card); + return -1; + }); + next.set("filterCard", function (card, player) { + if (get.position(card) == "e") return lib.filter.cardDiscardable.apply(this, arguments); + return true; + }); + //next.set('logSkill',['spmingjian',trigger.player]); + "step 1"; + if (result.bool) { + player.logSkill("spmingjian", trigger.player); + var card = result.cards[0]; + event.card = card; + if (get.position(card) == "e") event._result = { index: 0 }; + else if (!lib.filter.cardDiscardable(card, player, event)) event._result = { index: 1 }; + else { + var name = get.translation(trigger.player); + player + .chooseControl() + .set("choiceList", ["令" + name + "跳过本回合的判定阶段", "令" + name + "于本回合的判定中不触发「判定结果生效前」的时机"]) + .set("ai", function () { + return 0; + }); + } + } else event.finish(); + "step 2"; + if (result.index == 0) { + player.discard(card); + trigger.player.skip("phaseJudge"); + } else { + trigger.player.addToExpansion(card, player, "giveAuto").gaintag.add("spmingjian_charlotte"); + trigger.player.addSkill("spmingjian_charlotte"); + } + }, + ai: { + expose: 0.25, + }, + }, + spmingjian_charlotte: { + trigger: { player: ["judgeBefore", "phaseAfter"] }, + forced: true, + firstDo: true, + silent: true, + popup: false, + charlotte: true, + content: function () { + if (trigger.name == "phase") player.removeSkill(event.name); + else trigger.noJudgeTrigger = true; + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + marktext: "鉴", + intro: { + name: "明鉴", + content: "expansion", + markcount: "expansion", + }, + }, + spshude: { + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + return player.countCards("h") < player.maxHp; + }, + content: function () { + player.drawTo(player.maxHp); + }, + }, + spfuluan: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.inRange(target); + }, + selectCard: 3, + position: "he", + check: function (card) { + return 5 - get.value(card); + }, + complexCard: true, + filterCard: function (card, player) { + if (!ui.selected.cards.length) return player.countCards("he", { suit: get.suit(card) }) > 2; + return get.suit(card) == get.suit(ui.selected.cards[0]); + }, + content: function () { + target.turnOver(); + player.addTempSkill("spfuluan2"); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.isTurnedOver()) return 2; + return -1; + }, + }, + }, + }, + spfuluan2: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + }, + spzhaoxin: { + trigger: { player: "phaseDrawEnd" }, + check: function (event, player) { + return player.getUseValue({ name: "sha", isCard: true }) > 0; + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.showHandcards(); + "step 1"; + player.chooseUseTarget("sha", false); + }, + }, + splanggu: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return get.itemtype(event.source) == "player"; + }, + logTarget: "source", + content: function () { + "step 0"; + player.judge(); + "step 1"; + if (trigger.source.countCards("h") > 0) { + var next = player.discardPlayerCard(trigger.source, "h", [1, Infinity]); + next.set("suit", result.suit); + next.set("filterButton", function (button) { + return get.suit(button.link) == _status.event.suit; + }); + next.set("visible", true); + } + }, + group: "splanggu_rewrite", + }, + splanggu_rewrite: { + trigger: { player: "judge" }, + filter: function (event, player) { + return player.countCards("hs") > 0 && event.getParent().name == "splanggu"; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard("狼顾的判定结果为" + get.translation(trigger.player.judging[0]) + ",是否打出一张手牌进行代替?", "hs", function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + return -1; + }); + "step 1"; + if (result.bool) { + player.respond(result.cards, "highlight", "splanggu", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + game.delay(2); + } + }, + }, + sphantong: { + trigger: { + player: "loseEnd", + }, + frequent: true, + filter: function (event, player) { + return event.type == "discard" && event.getParent(3).name == "phaseDiscard" && event.cards.filterInD("d").length > 0; + }, + content: function () { + if (!player.storage.sphantong) player.storage.sphantong = []; + var cards = trigger.cards.filterInD("d"); + player.storage.sphantong.addArray(cards); + player.$gain2(cards); + game.log(player, "将", cards, "置于武将牌上"); + player.markSkill("sphantong"); + }, + group: ["sphantong_gain"], + derivation: ["hujia", "jijiang", "jiuyuan", "xueyi"], + marktext: "诏", + intro: { + content: "cards", + onunmark: "throw", + }, + }, + sphantong_gain: { + trigger: { global: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return player.storage.sphantong && player.storage.sphantong.length > 0; + }, + content: function () { + "step 0"; + player.chooseButton([get.prompt("sphantong"), player.storage.sphantong], function (button) { + var player = _status.event.player; + if (_status.currentPhase == player) { + //血裔 + if ( + (player.hasJudge("lebu") || player.skipList.includes("phaseUse")) && + game.hasPlayer(function (current) { + return current != player && current.group == "qun"; + }) + ) + return 1; + //激将 + if ( + !player.hasJudge("lebu") && + !player.skipList.includes("phaseUse") && + game.hasPlayer(function (current) { + return current != player && current.group == "shu" && current.hasSha() && get.attitude(player, current) > 0 && get.attitude(current, player) > 0; + }) && + game.hasPlayer(function (target) { + return player.canUse({ name: "sha" }, target) && get.effect(target, { name: "sha" }, player, player) > 0; + }) + ) + return 1; + } + //护驾 + else if ( + !player.hasShan() && + game.hasPlayer(function (current) { + return current != player && current.group == "wei" && current.mayHaveShan(player, "respond") && get.attitude(player, current) > 0 && get.attitude(current, player) > 0; + }) + ) + return 1; + return -1; + }); + "step 1"; + if (result.bool) { + player.logSkill("sphantong"); + var card = result.links[0]; + player.$throw(card); + game.log(player, "将", card, "置入了弃牌堆"); + player.storage.sphantong.remove(card); + player[player.storage.sphantong.length > 0 ? "markSkill" : "unmarkSkill"]("sphantong"); + game.cardsDiscard(card); + var list = ["hujia", "jijiang", "jiuyuan", "xueyi"]; + for (var i = 0; i < list.length; i++) { + if (player.hasSkill(list[i])) list.splice(i--, 1); + } + if (list.length) { + player + .chooseControl(list) + .set("prompt", "选择获得以下技能中的一个") + .set("ai", function () { + var player = _status.event.player; + if (_status.currentPhase == player) { + //血裔 + if ( + (player.hasJudge("lebu") || player.skipList.includes("phaseUse")) && + game.hasPlayer(function (current) { + return current != player && current.group == "qun"; + }) + ) + return "xueyi"; + //激将 + if ( + !player.hasJudge("lebu") && + !player.skipList.includes("phaseUse") && + game.hasPlayer(function (current) { + return current != player && current.group == "shu" && current.hasSha() && get.attitude(player, current) > 0 && get.attitude(current, player) > 0; + }) && + game.hasPlayer(function (target) { + return player.canUse({ name: "sha" }, target) && get.effect(target, { name: "sha" }, player, player) > 0; + }) + ) + return "jijiang"; + } + //护驾 + else if ( + !player.hasShan() && + game.hasPlayer(function (current) { + return current != player && current.group == "wei" && current.mayHaveShan(player, "respond") && get.attitude(player, current) > 0 && get.attitude(current, player) > 0; + }) + ) + return "hujia"; + }); + } else event.finish(); + } else event.finish(); + "step 2"; + var skill = result.control; + player.addTempSkills(skill); + // player.popup(skill,'wood'); + // game.log(player,'获得了技能','#g【'+get.translation(skill)+'】'); + }, + }, + sphuangen: { + trigger: { global: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget) return false; + if (get.type(event.card) != "trick") return false; + if (get.info(event.card).multitarget) return false; + if (event.targets.length < 2) return false; + return player.hp > 0; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("sphuangen"), [1, Math.min(player.hp, trigger.targets.length)], function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return -get.effect(target, trigger.card, trigger.player, _status.event.player); + }) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + player.logSkill("sphuangen", result.targets); + trigger.excluded.addArray(result.targets); + player.draw(); + } + }, + }, + spyicong: { + trigger: { player: "phaseDiscardEnd" }, + direct: true, + locked: false, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player.chooseCard("he", [1, player.countCards("he")], get.prompt2("spyicong")).set("ai", function (card) { + if (card.name == "du") return 10; + if (ui.selected.cards.length) return -1; + return 4 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("spyicong"); + player.addToExpansion(result.cards, player, "give").gaintag.add("spyicong"); + } + }, + mod: { + globalTo: function (from, to, num) { + return num + to.getExpansions("spyicong").length; + }, + }, + marktext: "扈", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + name: "义从", + content: function (storage, player) { + return "共有" + get.cnNumber(player.getExpansions("spyicong").length) + "张“扈”"; + }, + markcount: "expansion", + }, + }, + sptuji: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.getExpansions("spyicong").length > 0; + }, + content: function () { + var cards = player.getExpansions("spyicong"); + var num = cards.length; + player.addMark("sptuji2", num, false); + player.addTempSkill("sptuji2"); + player.loseToDiscardpile(cards); + if (num <= 1) player.draw(); + }, + ai: { + combo: "spyicong", + }, + }, + sptuji2: { + onremove: true, + charlotte: true, + mod: { + globalFrom: function (from, to, num) { + return num - from.countMark("sptuji2"); + }, + }, + marktext: "突", + intro: { + name: "突骑", + content: "至其他角色的距离-#", + }, + }, + xinfu_yanyu: { + trigger: { + global: "phaseUseBegin", + }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt("xinfu_yanyu"), get.translation("xinfu_yanyu_info"), "he").set("logSkill", "xinfu_yanyu"); + if (player == trigger.player) { + next.set( + "goon", + (function () { + var map = { + basic: 0, + trick: 0.1, + }; + var hs = trigger.player.getCards("h"); + var sha = false; + var jiu = false; + for (var i = 0; i < hs.length; i++) { + if (trigger.player.hasValueTarget(hs[i])) { + if (hs[i].name == "sha" && !sha) { + sha = true; + map.basic += 2; + } + if (hs[i].name == "tao") map.basic += 6; + if (hs[i].name == "jiu") { + jiu = true; + map.basic += 2.5; + } + if (get.type(hs[i]) == "trick") map.trick += get.value(hs[i], player, "raw"); + } + } + return map; + })() + ); + next.set("ai", function (card) { + var map = _status.event.goon; + var type = get.type(card, "trick"); + if (!map[type]) return -1; + return map[type] - get.value(card); + }); + } else { + next.set("ai", function (cardx) { + var map = { + basic: 0, + trick: 0, + }; + var hs = trigger.player.getCards("h"); + var sha = false; + var jiu = false; + for (var i = 0; i < hs.length; i++) { + if (hs[i] != cardx && trigger.player.hasValueTarget(hs[i])) { + if (hs[i].name == "sha" && !sha) { + sha = true; + map.basic += 2; + } + if (hs[i].name == "tao") map.basic += 6; + if (hs[i].name == "jiu") { + jiu = true; + map.basic += 3; + } + if (get.type(hs[i]) == "trick") map.trick += player.getUseValue(hs[i]); + } + } + var type = get.type(cardx, "trick"); + if (!map[type]) return -get.value(cardx); + return map[type] - get.value(cardx); + }); + } + "step 1"; + if (result.bool) { + player.storage.xinfu_yanyu = get.type(result.cards[0], "trick"); + player.addTempSkill("xinfu_yanyu2", "phaseUseAfter"); + } + }, + }, + xinfu_yanyu2: { + init: function (player, skill) { + player.storage[skill] = 0; + }, + onremove: function (player, skill) { + delete player.storage.xinfu_yanyu; + delete player.storage.xinfu_yanyu2; + }, + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + direct: true, + filter: function (event, player) { + if (player.storage.xinfu_yanyu2 >= 3) return false; + var type = player.storage.xinfu_yanyu, + cards = event.getd(); + for (var i = 0; i < cards.length; i++) { + if (get.type(cards[i], "trick") == type && get.position(cards[i], true) == "d") return true; + } + return false; + }, + content: function () { + "step 0"; + event.logged = false; + event.cards = []; + var type = player.storage.xinfu_yanyu; + var cards = trigger.getd(); + for (var i = 0; i < cards.length; i++) { + if (get.type(cards[i], "trick") == type && get.position(cards[i], true) == "d") event.cards.push(cards[i]); + } + "step 1"; + if (player.storage.xinfu_yanyu2 >= 3) event.finish(); + else + player.chooseCardButton(event.cards, "【燕语】:是否将其中的一张牌交给一名角色?").ai = function (card) { + if (card.name == "du") return 10; + return get.value(card); + }; + "step 2"; + if (result.bool) { + player.storage.xinfu_yanyu2++; + if (!event.logged) { + player.logSkill("xinfu_yanyu"); + player.addExpose(0.25); + event.logged = true; + } + event.togain = result.links[0]; + event.cards.remove(event.togain); + player + .chooseTarget(true, "请选择要获得" + get.translation(event.togain) + "的角色") + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var card = _status.event.card; + var val = get.value(card); + if (player.storage.xinfu_yanyu2 < 3 && target == _status.currentPhase && target.hasValueTarget(card, null, true)) att = att * 5; + else if (target == player && !player.hasJudge("lebu") && get.type(card) == "trick") att = att * 3; + if (target.hasSkillTag("nogain")) att /= 10; + return att * val; + }) + .set("card", event.togain); + } else event.finish(); + "step 3"; + var target = result.targets[0]; + player.line(target, "green"); + target.gain(event.togain, "gain2"); + if (event.cards.length) event.goto(1); + }, + }, + xinfu_xiaode: { + subSkill: { + remove: { + unique: true, + charlotte: true, + trigger: { + player: "phaseAfter", + }, + forced: true, + popup: false, + content: function () { + player.removeAdditionalSkill("xinfu_xiaode"); + player.removeSkill("xinfu_xiaode_remove"); + }, + }, + }, + trigger: { + global: "dieAfter", + }, + direct: true, + filter: function (skill, event) { + return !event.hasSkill("xinfu_xiaode_remove"); + }, + content: function () { + "step 0"; + var list = []; + var listm = []; + var listv = []; + if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3]; + else listm = lib.character[trigger.player.name][3]; + if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3]; + listm = listm.concat(listv); + var func = function (skill) { + var info = get.info(skill); + if (info.charlotte || info.zhuSkill || (info.unique && !info.limited) || info.juexingji || info.dutySkill || info.hiddenSkill) return false; + return true; + }; + for (var i = 0; i < listm.length; i++) { + if (func(listm[i])) list.add(listm[i]); + } + if (list.length) { + player + .chooseControl(list, "cancel2") + .set("prompt", get.prompt("xinfu_xiaode")) + .set("prompt2", get.translation("xinfu_xiaode_info")) + .set("ai", function () { + return list.randomGet(); + }); + } else event.finish(); + "step 1"; + if (result.control && result.control != "cancel2") { + player.logSkill("xinfu_xiaode"); + player.popup(result.control, "thunder"); + game.log(player, "获得了技能", "#g【" + get.translation(result.control) + "】"); + player.addAdditionalSkill("xinfu_xiaode", [result.control]); + player.addSkill("xinfu_xiaode_remove"); + } + }, + }, + chixin: { + group: ["chixin1", "chixin2"], + mod: { + cardUsableTarget: function (card, player, target) { + if (card.name == "sha" && !target.hasSkill("chixin3") && player.inRange(target)) return true; + }, + }, + trigger: { player: "useCardToPlayered" }, + silent: true, + firstDo: true, + locked: false, + content: function () { + trigger.target.addTempSkill("chixin3"); + }, + }, + chixin1: { + enable: ["chooseToRespond", "chooseToUse"], + filterCard: { suit: "diamond" }, + position: "hes", + viewAs: { name: "sha" }, + prompt: "将一张♦牌当杀使用或打出", + check: function (card) { + return 5 - get.value(card); + }, + ai: { + respondSha: true, + }, + }, + chixin2: { + enable: ["chooseToUse", "chooseToRespond"], + filterCard: { suit: "diamond" }, + viewAs: { name: "shan" }, + position: "hes", + prompt: "将一张♦牌当闪使用或打出", + check: function (card) { + return 5 - get.value(card); + }, + ai: { + respondShan: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.8; + }, + }, + }, + }, + chixin3: { charlotte: true }, + suiren: { + trigger: { player: "phaseZhunbeiBegin" }, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return !player.storage.suiren; + }, + intro: { + content: "limited", + }, + mark: true, + direct: true, + unique: true, + limited: true, + content: function () { + "step 0"; + var check = player.hp == 1 || (player.hp == 2 && player.countCards("h") <= 1); + player + .chooseTarget(get.prompt2("suiren")) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.attitude(_status.event.player, target); + }) + .set("check", check); + "step 1"; + if (result.bool) { + player.storage.suiren = true; + player.awakenSkill("suiren"); + player.logSkill("suiren", result.targets); + player.removeSkills("reyicong"); + player.gainMaxHp(); + player.recover(); + result.targets[0].draw(3); + } + }, + }, + xinmanjuan: { + audio: "manjuan", + forced: true, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + var hs = player.getCards("h"); + return ( + event.type != "xinmanjuan" && + event.getg(player).filter(function (card) { + return hs.includes(card); + }).length > 0 + ); + }, + content: function () { + "step 0"; + var hs = player.getCards("h"), + cards = trigger.getg(player).filter(function (card) { + return hs.includes(card); + }); + event.cards = cards; + event.rawCards = cards.slice(0); + player.loseToDiscardpile(cards); + if (_status.currentPhase != player) event.finish(); + "step 1"; + event.card = event.cards.shift(); + event.togain = []; + var number = get.number(event.card); + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var current = ui.discardPile.childNodes[i]; + if (!event.rawCards.includes(current) && get.number(current) == number) event.togain.push(current); + } + if (!event.togain.length) event.goto(4); + "step 2"; + player.chooseButton(["是否获得其中的一张牌?", event.togain]).ai = function (button) { + return get.value(button.link); + }; + "step 3"; + if (result.bool) { + player.gain(result.links[0], "gain2").type = "xinmanjuan"; + } + "step 4"; + if (event.cards.length) event.goto(1); + }, + ai: { + threaten: 4.2, + nogain: 1, + skillTagFilter: function (player) { + return player != _status.currentPhase; + }, + }, + }, + manjuan: { + audio: true, + trigger: { global: "loseAfter" }, + filter: function (event, player) { + if (event.type != "discard") return false; + if (event.player == player) return false; + if (!player.countCards("he")) return false; + for (var i = 0; i < event.cards2.length; i++) { + if (get.position(event.cards2[i], true) == "d") { + return true; + } + } + return false; + }, + direct: true, + unique: true, + gainable: true, + content: function () { + "step 0"; + if (trigger.delay == false) game.delay(); + "step 1"; + var cards = []; + var suits = ["club", "spade", "heart", "diamond"]; + for (var i = 0; i < trigger.cards2.length; i++) { + if (get.position(trigger.cards2[i], true) == "d") { + cards.push(trigger.cards2[i]); + suits.remove(get.suit(trigger.cards2[i])); + } + } + if (cards.length) { + var maxval = 0; + for (var i = 0; i < cards.length; i++) { + var tempval = get.value(cards[i]); + if (tempval > maxval) { + maxval = tempval; + } + } + maxval += cards.length - 1; + var next = player.chooseToDiscard("he", { suit: suits }); + next.set("ai", function (card) { + return _status.event.maxval - get.value(card); + }); + next.set("maxval", maxval); + next.set("dialog", [get.prompt(event.name), "hidden", cards]); + next.logSkill = event.name; + event.cards = cards; + } + "step 2"; + if (result.bool) { + player.gain(event.cards, "gain2", "log"); + } + }, + ai: { + threaten: 1.3, + }, + }, + zuixiang: { + skillAnimation: true, + animationColor: "gray", + audio: true, + unique: true, + limited: true, + trigger: { player: "phaseZhunbeiBegin" }, + content: function () { + "step 0"; + player.awakenSkill("zuixiang"); + event.cards = player.showCards(get.cards(3)).cards; + player.addToExpansion(event.cards, "gain2").gaintag.add("zuixiang2"); + "step 1"; + if (lib.skill.zuixiang.filterSame(cards)) { + player.gain(cards, "gain2").type = "xinmanjuan"; + } else { + trigger._zuixiang = true; + player.addSkill("zuixiang2"); + } + }, + filterSame: function (c) { + for (var i = 0; i < c.length; i++) { + for (var j = i + 1; j < c.length; j++) { + if (get.number(c[i]) == get.number(c[j])) return true; + } + } + return false; + }, + }, + zuixiang2: { + intro: { + content: "expansion", + markcount: "expansion", + }, + mod: { + cardEnabled: function (card, player) { + var type = get.type2(card); + var list = player.getExpansions("zuixiang2"); + for (var i of list) { + if (get.type2(i, false) == type) return false; + } + }, + cardRespondable: function () { + return lib.skill.zuixiang2.mod.cardEnabled.apply(this, arguments); + }, + cardSavable: function () { + return lib.skill.zuixiang2.mod.cardEnabled.apply(this, arguments); + }, + }, + trigger: { + player: "phaseZhunbeiBegin", + target: "useCardToBefore", + }, + forced: true, + charlotte: true, + filter: function (event, player) { + if (event.name == "phaseZhunbei") return !event._zuixiang; + var type = get.type2(event.card); + var list = player.getExpansions("zuixiang2"); + for (var i of list) { + if (get.type2(i) == type) return true; + } + return false; + }, + content: function () { + "step 0"; + if (event.triggername == "useCardToBefore") { + trigger.cancel(); + event.finish(); + return; + } + var cards = get.cards(3); + player.addToExpansion("gain2", cards).gaintag.add("zuixiang2"); + "step 1"; + var cards = player.getExpansions("zuixiang2"); + player.showCards(cards); + if (lib.skill.zuixiang.filterSame(cards)) { + player.gain(cards, "gain2", "log").type = "xinmanjuan"; + player.removeSkill("zuixiang2"); + } + }, + ai: { + effect: { + target: function (card, player, target) { + var type = get.type2(card); + var list = target.getExpansions("zuixiang2"); + for (var i of list) { + if (get.type2(i) == type) return "zeroplayertarget"; + } + }, + }, + }, + }, + yanxiao: { + audio: 2, + enable: "phaseUse", + filterCard: { suit: "diamond" }, + filterTarget: function (card, player, target) { + return target.canAddJudge({ name: "yanxiao_card" }); + }, + check: function (card) { + return 7 - get.value(card); + }, + position: "he", + filter: function (event, player) { + return player.countCards("he", { suit: "diamond" }) > 0; + }, + discard: false, + lose: false, + delay: false, + prepare: "give", + content: function () { + "step 0"; + game.addGlobalSkill("yanxiao_global"); + target.addJudge({ name: "yanxiao_card" }, cards); + "step 1"; + game.delay(); + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if ( + target.countCards("j", function (card) { + return ( + get.effect( + target, + { + name: card.viewAs || card.name, + cards: [card], + }, + target, + target + ) < 0 + ); + }) + ) + return 1; + return 0; + }, + }, + }, + }, + yanxiao_global: { + trigger: { player: "phaseJudgeBegin" }, + forced: true, + filter: function (event, player) { + return player.countCards("j") > 0 && player.hasJudge("yanxiao_card"); + }, + content: function () { + player.gain(player.getCards("j"), "gain2"); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.type(card) == "delay" && target.hasJudge("yanxiao_card")) return [0, 0, 0, 0.1]; + }, + }, + }, + }, + anxian: { + audio: 2, + group: ["anxian_source", "anxian_target"], + subSkill: { + source: { + audio: "anxian", + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return event.card && event.card.name == "sha"; + }, + check: function (event, player) { + if (get.damageEffect(event.player, player, player) <= 0) return true; + return false; + }, + content: function () { + "step 0"; + if (trigger.player.countCards("h")) { + trigger.player.chooseToDiscard(true); + } + "step 1"; + player.draw(); + trigger.cancel(); + }, + }, + target: { + audio: "anxian", + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countCards("h"); + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt2("anxian")); + next.set("ai", function (card) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + if (get.attitude(player, trigger.player) > 0) { + return 9 - get.value(card); + } + if (player.countCards("h", { name: "shan" })) return -1; + return 7 - get.value(card); + }); + next.logSkill = "anxian"; + "step 1"; + if (result.bool) { + trigger.player.draw(); + trigger.getParent().excluded.push(player); + } + }, + }, + }, + }, + junwei: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("yinling").length >= 3; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("yinling"); + if (cards.length > 3) { + player.chooseButton(3, [get.prompt("junwei"), "hidden", cards]).set("ai", function (button) { + return 1; + }); + } else { + player + .chooseBool() + .set("createDialog", [get.prompt("junwei"), "hidden", cards]) + .set("dialogselectx", true) + .set("choice", true); + event.cards = cards.slice(0); + } + "step 1"; + if (result.bool) { + player.logSkill("junwei"); + var cards = event.cards || result.links; + player.loseToDiscardpile(cards); + player + .chooseTarget(true, function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) / Math.sqrt(1 + target.hp); + }); + } else { + event.finish(); + } + "step 2"; + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(result.targets); + event.target = target; + var nshan = target.countCards("h", function (card) { + if (_status.connectMode) return true; + return card.name == "shan"; + }); + if (nshan == 0) { + event.directfalse = true; + } else { + target + .chooseCard("交给" + get.translation(player) + "一张【闪】,或失去1点体力", function (card) { + return card.name == "shan"; + }) + .set("ai", function (card) { + if (_status.event.nshan > 1) return 1; + if (_status.event.player.hp >= 3) return 0; + return 1; + }) + .set("nshan", nshan); + } + } else { + event.finish(); + } + "step 3"; + if (!event.directfalse && result.bool) game.delay(); + ui.clear(); + "step 4"; + if (!event.directfalse && result.bool) { + event.cards = result.cards; + event.target.$throw(result.cards); + player + .chooseTarget("将" + get.translation(event.cards) + "交给一名角色", true, function (card, player, target) { + return target != _status.event.getParent().target; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) / (target.countCards("h", "shan") + 1); + }); + } else { + event.target.loseHp(); + delete event.cards; + } + "step 5"; + if (event.cards) { + player.line(result.targets, "green"); + result.targets[0].gain(event.cards, "gain2").giver = player; + game.log(player, "将", event.cards, "交给", result.targets[0]); + event.finish(); + } else { + if (event.target.countCards("e")) { + player.choosePlayerCard("e", "将" + get.translation(event.target) + "的一张装备牌移出游戏", true, event.target); + } else { + event.finish(); + } + } + "step 6"; + if (result.bool) { + var card = result.links[0]; + target.addToExpansion(card, target, "give").gaintag.add("junwei2"); + target.addSkill("junwei2"); + } + }, + ai: { + combo: "yinling", + }, + }, + junwei2: { + mark: true, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + content: function () { + "step 0"; + var cards = player.getExpansions("junwei2").filter(function (card) { + return player.canEquip(card, true); + }); + if (cards.length) { + player.$give(cards[0], player, false); + game.delay(0.5); + player.equip(cards[0]); + event.redo(); + } + "step 1"; + player.removeSkill("junwei2"); + }, + }, + yinling: { + enable: "phaseUse", + filterCard: { color: "black" }, + position: "he", + marktext: "锦", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + filter: function (event, player) { + return player.countCards("he", { color: "black" }) > 0 && player.getExpansions("yinling").length < 4; + }, + filterTarget: function (card, player, target) { + return target.countCards("he") > 0 && target != player; + }, + check: function (card) { + return 6 - get.value(card); + }, + content: function () { + "step 0"; + player.choosePlayerCard("hej", target, true); + "step 1"; + if (result.bool && result.links && result.links.length) { + player.addToExpansion(result.links, target, "give").gaintag.add("yinling"); + } + }, + ai: { + order: 10.1, + expose: 0.1, + result: { + target: function (player, target) { + if (target.hasSkill("tuntian")) return 0; + var es = target.getCards("e"); + var nh = target.countCards("h"); + var noe = es.length == 0 || target.hasSkillTag("noe"); + var noe2 = es.length == 1 && es[0].name == "baiyin" && target.hp < target.maxHp; + var noh = nh == 0 || target.hasSkillTag("noh"); + if (noh && noe) return 0; + if (noh && noe2) return 0.01; + if (get.attitude(player, target) <= 0) return target.countCards("he") ? -1.5 : 1.5; + var js = target.getCards("j"); + if (js.length) { + var jj = js[0].viewAs ? { name: js[0].viewAs } : js[0]; + if (jj.name == "guohe") return 3; + if (js.length == 1 && get.effect(target, jj, target, player) >= 0) { + return -1.5; + } + return 2; + } + return -1.5; + }, + }, + }, + }, + fenyong: { + audio: 2, + trigger: { player: "damageEnd" }, + content: function () { + player.addTempSkill("fenyong2"); + }, + }, + fenyong2: { + audio: "fenyong", + mark: true, + intro: { + content: "防止你受到的所有伤害", + }, + trigger: { player: "damageBegin3" }, + forced: true, + content: function () { + trigger.cancel(); + }, + ai: { + maixie: true, + maixie_hp: true, + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) return [0, 0]; + }, + }, + }, + }, + xuehen: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.hasSkill("fenyong2") && event.player.isIn(); + }, + content: function () { + "step 0"; + player.removeSkill("fenyong2"); + player + .chooseControl("弃牌", "出杀", function () { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + if (get.attitude(player, trigger.player) < 0) { + var he = trigger.player.countCards("he"); + if (he < 2) return "出杀"; + if (player.maxHp - player.hp >= 2 && he <= 3) { + return "弃牌"; + } + if (player.maxHp - player.hp >= 3 && he <= 5) { + return "弃牌"; + } + if (player.maxHp - player.hp > 3) { + return "弃牌"; + } + return "出杀"; + } + return "出杀"; + }) + .set("prompt", "弃置" + get.translation(trigger.player) + get.cnNumber(player.maxHp - player.hp) + "张牌,或对任意一名角色使用一张杀"); + "step 1"; + if (result.control == "弃牌") { + player.line(trigger.player, "green"); + if (player.hp < player.maxHp && trigger.player.countCards("he")) { + player.discardPlayerCard(trigger.player, true, "he", player.maxHp - player.hp); + } + } else { + player.chooseUseTarget({ name: "sha" }, true, false, "nodistance"); + } + }, + ai: { + combo: "fenyong", + }, + }, + mouduan: { + audio: 1, + init2: function (player) { + game.broadcastAll(function (player) { + player._mouduan_mark = player.mark("武", { + content: "拥有技能【激昂】、【谦逊】", + }); + }, player); + player.addAdditionalSkill("mouduan", ["jiang", "qianxun"]); + }, + onremove: function (player) { + game.broadcastAll(function (player) { + if (player._mouduan_mark) { + player._mouduan_mark.delete(); + delete player._mouduan_mark; + } + }, player); + player.removeAdditionalSkills("mouduan"); + }, + trigger: { player: "loseEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + return player._mouduan_mark && player._mouduan_mark.name == "武" && player.countCards("h") <= 2; + }, + content: function () { + game.broadcastAll(function (player) { + if (!player._mouduan_mark) return; + player._mouduan_mark.name = "文"; + player._mouduan_mark.skill = "文"; + player._mouduan_mark.firstChild.innerHTML = "文"; + player._mouduan_mark.info.content = "拥有技能【英姿】、【克己】"; + }, player); + player.addAdditionalSkills("mouduan", ["yingzi", "keji"]); + }, + group: "mouduan2", + }, + mouduan2: { + audio: 1, + trigger: { global: "phaseZhunbeiBegin" }, + //priority:5, + filter: function (event, player) { + return player._mouduan_mark && player._mouduan_mark.name == "文" && player.countCards("h") > 2; + }, + direct: true, + content: function () { + "step 0"; + player.chooseToDiscard("he", "谋断:是否弃置一张牌将标记变为“武”?").ai = function () { + return -1; + }; + "step 1"; + if (result.bool && player.countCards("h") > 2) { + game.broadcastAll(function (player) { + if (!player._mouduan_mark) return; + player._mouduan_mark.name = "武"; + player._mouduan_mark.skill = "武"; + player._mouduan_mark.firstChild.innerHTML = "武"; + player._mouduan_mark.info.content = "拥有技能【激昂】、【谦逊】"; + }, player); + player.addAdditionalSkills("mouduan", ["jiang", "qianxun"]); + } + }, + }, + tanhu: { + audio: 1, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + target.addTempSkill("tanhu2"); + } + }, + ai: { + result: { + target: function (player, target) { + var hs = player.getCards("h"); + if (hs.length < 3) return 0; + var bool = false; + for (var i = 0; i < hs.length; i++) { + if (hs[i].number >= 9 && get.value(hs[i]) < 7) { + bool = true; + break; + } + } + if (!bool) return 0; + return -1; + }, + }, + order: 9, + }, + group: "tanhu3", + }, + tanhu2: { + mark: true, + intro: { + content: "已成为探虎目标", + }, + }, + tanhu3: { + mod: { + globalFrom: function (from, to) { + if (to.hasSkill("tanhu2")) return -Infinity; + }, + wuxieRespondable: function (card, player, target) { + if (target && target.hasSkill("tanhu2")) return false; + }, + }, + }, + jie: { + audio: 1, + trigger: { source: "damageBegin1" }, + filter: function (event) { + return event.card && event.card.name == "sha" && get.color(event.card) == "red" && event.notLink(); + }, + forced: true, + content: function () { + trigger.num++; + }, + }, + dahe: { + audio: true, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseToCompare(target).set("preserve", "win"); + "step 1"; + if (result.bool && result.target) { + event.type = true; + event.card = result.target; + player + .chooseTarget("将" + get.translation(result.target) + "交给一名角色", function (card, player, target) { + return target.hp <= player.hp; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.du) return -att; + return att; + }) + .set("du", event.card.name == "du"); + target.addTempSkill("dahe2"); + } else { + event.type = false; + if (player.countCards("h")) { + player.showHandcards(); + player.chooseToDiscard("h", true); + } + } + "step 2"; + if (event.type) { + if (result.bool) { + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "gain2"); + } + } + }, + ai: { + result: { + target: function (player, target) { + var hs = player.getCards("h"); + if (hs.length < 3) return 0; + var bool = false; + for (var i = 0; i < hs.length; i++) { + if (hs[i].number >= 9 && get.value(hs[i]) < 7) { + bool = true; + break; + } + } + if (!bool) return 0; + if (player.canUse("sha", target) && player.countCards("h", "sha")) { + return -2; + } + return -0.5; + }, + }, + order: 9, + }, + }, + dahe2: { + mark: true, + intro: { + content: "非红桃闪无效", + }, + mod: { + cardRespondable: function (card, player) { + if (card.name == "shan") { + const suit = get.suit(card); + if (suit != "heart" && suit != "unsure") return false; + } + }, + cardEnabled: function (card, player) { + if (card.name == "shan") { + const suit = get.suit(card); + if (suit != "heart" && suit != "unsure") return false; + } + }, + }, + }, + shichou: { + //audio:1, + skillAnimation: true, + animationColor: "orange", + unique: true, + limited: true, + mark: false, + trigger: { player: "phaseZhunbeiBegin" }, + zhuSkill: true, + direct: true, + filter: function (event, player) { + if (!player.hasZhuSkill("shichou")) return false; + if (player.countCards("he") < 2) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "shu"; + }); + }, + init: function (player) { + if (player.hasZhuSkill("shichou")) { + player.markSkill("shichou"); + player.storage.shichou = false; + } + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt2("shichou"), + selectCard: 2, + filterTarget: function (card, player, target) { + return target.group == "shu" && target != player; + }, + filterCard: true, + position: "he", + ai1: function (card) { + return 7 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + if (player.hasUnknown()) return 0; + var att = get.attitude(player, target); + if (att <= 0) { + if (target.hp == 1) return (10 - att) / 2; + return 10 - att; + } else { + if (target.hp == 1) return 0; + return (10 - att) / 4; + } + }, + }); + "step 1"; + if (!result.bool) return; + var target = result.targets[0]; + var cards = result.cards; + player.storage.shichou = true; + player.logSkill("shichou", target); + player.awakenSkill("shichou"); + player.give(cards, target); + player.storage.shichou_target = target; + player.addSkill("shichou2"); + target.markSkillCharacter("shichou", player, "誓仇", "代替" + get.translation(player) + "承受伤害直到首次进入濒死状态"); + }, + intro: { + content: "limited", + }, + }, + shichou2: { + group: "shichou3", + trigger: { player: "damageBegin3" }, + forced: true, + popup: false, + content: function () { + trigger.player = player.storage.shichou_target; + trigger.shichou4 = true; + trigger.player.addSkill("shichou4"); + player.logSkill("shichou2", player.storage.shichou_target); + game.delay(0.5); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (get.attitude(player, target) > 0) return [0, 0]; + var eff = get.damageEffect(target.storage.shichou_target, player, target); + if (eff > 0) { + return [0, 1]; + } else if (eff < 0) { + return [0, -2]; + } else { + return [0, 0]; + } + } + }, + }, + }, + }, + shichou3: { + trigger: { global: ["dying", "dieBegin"] }, + forced: true, + popup: false, + //priority:10, + filter: function (event, player) { + return event.player == player.storage.shichou_target; + }, + content: function () { + trigger.player.unmarkSkill("shichou"); + delete player.storage.shichou_target; + player.removeSkill("shichou2"); + }, + }, + shichou4: { + trigger: { player: ["damageAfter", "damageCancelled"] }, + forced: true, + popup: false, + audio: false, + content: function () { + if (!trigger.shichou4) return; + if (event.triggername == "damageAfter" && trigger.num) { + player.draw(trigger.num); + } + player.removeSkill("shichou4"); + }, + }, + zhaolie: { + trigger: { player: "phaseDrawBegin2" }, + direct: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("zhaolie"), function (card, player, target) { + return target != player && player.inRange(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) return 0; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + trigger.num--; + player.storage.zhaolie = result.targets[0]; + player.logSkill("zhaolie", result.targets); + player.addTempSkill("zhaolie2", "phaseDrawAfter"); + } + }, + }, + zhaolie2: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + popup: false, + content: function () { + "step 0"; + event.cards = get.cards(3); + player.showCards(event.cards); + "step 1"; + event.basic = []; + event.nonbasic = []; + event.todis = []; + for (var i = 0; i < event.cards.length; i++) { + if (get.type(event.cards[i]) == "basic") { + if (event.cards[i].name == "tao") { + event.todis.push(event.cards[i]); + } else { + event.basic.push(event.cards[i]); + } + } else { + event.todis.push(event.cards[i]); + event.nonbasic.push(event.cards[i]); + } + } + game.cardsDiscard(event.todis); + var num = event.nonbasic.length; + if (num == 0) { + if (event.basic.length == 0) { + event.finish(); + return; + } + player.storage.zhaolie + .chooseTarget( + function (card, player, target) { + var source = _status.event.source; + return target == source || target == source.storage.zhaolie; + }, + true, + "选择一个目标获得" + get.translation(event.basic) + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("source", player); + } else { + player.storage.zhaolie + .chooseToDiscard(num, "he", "弃置" + get.cnNumber(num) + "张牌并令" + get.translation(player) + "拿牌,或受到" + get.cnNumber(num) + "点伤害并拿牌") + .set("ai", function (card) { + var player = _status.event.player; + switch (_status.event.num) { + case 1: + return player.hp > 1 ? 0 : 7 - get.value(card); + case 2: + return 8 - get.value(card); + case 3: + return 10 - get.value(card); + default: + return 0; + } + }) + .set("num", num); + } + "step 2"; + var num = event.nonbasic.length; + var undone = false; + if (num == 0) { + if (event.basic.length) { + result.targets[0].gain(event.basic, "gain2", "log"); + } + } else { + if (result.bool) { + if (event.basic.length) { + player.gain(event.basic, "gain2", "log"); + } + } else { + player.storage.zhaolie.damage(num); + if (event.basic.length) { + undone = true; + } + } + } + if (!undone) { + delete player.storage.zhaolie; + event.finish(); + } + "step 3"; + if (player.storage.zhaolie.isIn()) { + player.storage.zhaolie.gain(event.basic, "gain2", "log"); + } else { + game.cardsDiscard(event.basic); + } + delete player.storage.zhaolie; + }, + }, + fulu: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; + }, + audio: true, + check: function (event, player) { + var eff = 0; + for (var i = 0; i < event.targets.length; i++) { + var target = event.targets[i]; + var eff1 = get.damageEffect(target, player, player); + var eff2 = get.damageEffect(target, player, player, "thunder"); + eff += eff2; + eff -= eff1; + } + return eff >= 0; + }, + content: function () { + game.setNature(trigger.card, "thunder"); + if (get.itemtype(trigger.card) == "card") { + var next = game.createEvent("fulu_clear"); + next.card = trigger.card; + event.next.remove(next); + trigger.after.push(next); + next.setContent(function () { + game.setNature(card, []); + }); + } + }, + }, + fuji: { + trigger: { global: "damageBegin1" }, + filter: function (event) { + return event.source && event.source.isIn() && event.hasNature("thunder"); + }, + check: function (event, player) { + return get.attitude(player, event.source) > 0 && get.attitude(player, event.player) < 0; + }, + prompt: function (event) { + return get.translation(event.source) + "即将对" + get.translation(event.player) + "造成伤害," + get.prompt("fuji"); + }, + logTarget: "source", + content: function () { + trigger.source.judge().callback = lib.skill.fuji.callback; + }, + callback: function () { + var evt = event.getParent(2); + if (event.judgeResult.color == "black") { + //game.cardsDiscard(card); + evt._trigger.num++; + } else { + evt._trigger.source.gain(card, "gain2"); + } + }, + }, +}; + +export default skills; diff --git a/character/offline/sort.js b/character/offline/sort.js new file mode 100644 index 000000000..f4bbcf6e9 --- /dev/null +++ b/character/offline/sort.js @@ -0,0 +1,31 @@ +const characterSort = { + offline_star: ["jsp_ganfuren", "sp_xiahoushi", "jsp_zhaoyun", "huangjinleishi", "sp_pangtong", "sp_daqiao", "sp_ganning", "sp_xiahoudun", "sp_lvmeng", "sp_zhangfei", "sp_liubei", "old_machao", "zhangliang", "jsp_caoren"], + offline_sticker: ["sp_gongsunzan", "sp_simazhao", "sp_wangyuanji", "sp_xinxianying", "sp_liuxie"], + offline_yijiang: ["ol_xinxianying"], + offline_luanwu: ["ns_lijue", "ns_zhangji", "ns_fanchou"], + offline_yongjian: ["ns_chendao", "yj_caoang", "yj_caocao", "yj_liru", "yj_caohong", "yj_zhangfei", "yongjian_ganning", "yj_dongzhuo", "yj_xuyou", "yj_jiaxu", "yj_zhenji"], + offline_piracyE: ["shen_jiaxu", "pe_wangyun", "pe_zhonghui", "pe_sunchen", "pe_mengda", "pe_wenqin", "ns_caoanmin", "jiangqing", "kongrong", "jiling", "tianfeng", "mateng"], + offline_piracyS: ["ns_jiaxu", "longyufei", "ps_guanyu", "ps1059_guojia", "ps2070_guojia", "ps2063_zhaoyun", "ps2067_zhaoyun", "ps1062_zhouyu", "ps2080_zhouyu", "ps_caozhi", "ps_jin_simayi", "ps_caopi", "ps_simayi", "ps2068_simayi", "ps_machao", "ps_zhugeliang", "ps2066_zhugeliang", "ps_jiaxu", "ps_lvbu", "ps_shen_machao", "jsp_liubei"], + offline_piracyK: ["pk_sp_duyu"], + offline_vtuber: ["vtb_xiaosha", "vtb_xiaoshan", "vtb_xiaotao", "vtb_xiaole", "vtb_xiaojiu"], + offline_longyutao: ["drag_guanyu", "drag_caoren", "drag_lvchang"], + //offline_others:[""], +}; + +const characterSortTranslate = { + offline_star: "桌游志·SP", + offline_sticker: "桌游志·贴纸", + offline_yijiang: "一将成名", + offline_luanwu: "文和乱武", + offline_yongjian: "用间篇", + offline_yongjian_prefix: "用间", + offline_feihongyingxue: "飞鸿映雪", + offline_piracyE: "官盗E系列·战役篇", + offline_piracyS: "官盗S系列", + offline_vtuber: "天书乱斗·虚拟偶像", + offline_piracyK: "官盗K系列", + offline_others: "线下其他系列", + offline_longyutao: "龙起襄樊", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/offline/translate.js b/character/offline/translate.js new file mode 100644 index 000000000..8aa549747 --- /dev/null +++ b/character/offline/translate.js @@ -0,0 +1,423 @@ +const translates = { + sp_gongsunzan: "SP公孙瓒", + sp_gongsunzan_prefix: "SP", + sp_simazhao: "SP司马昭", + sp_simazhao_prefix: "SP", + sp_wangyuanji: "SP王元姬", + sp_wangyuanji_prefix: "SP", + sp_xinxianying: "SP辛宪英", + sp_xinxianying_prefix: "SP", + sp_liuxie: "SP刘协", + sp_liuxie_prefix: "SP", + spyicong_info: "弃牌阶段结束时,你可以将任意张牌置于你的武将牌上,称为「扈」。每有一张「扈」,其他角色与你计算距离时便+1。", + spyicong: "义从", + sptuji: "突骑", + sptuji_info: "准备开始时,你将所有「扈」置于弃牌堆,然后你本回合内计算与其他角色的距离时-X。若X不大于1,你摸一张牌。(X为以此法进入弃牌堆的「扈」的数量)", + sphuangen: "皇恩", + sphuangen_info: "一名角色使用锦囊牌指定目标时,若此牌的目标数大于1,则你可以令此牌对其中的至多X个目标无效,然后摸一张牌。(X为你的体力值)", + sphantong: "汉统", + sphantong_gain: "汉统", + sphantong_info: "当你的牌因弃牌阶段的游戏规则要求而进入弃牌堆后,你可以将这些牌置于你的武将牌上,称为「诏」。一名角色的回合开始时,你可以弃置一张「诏」并获得〖护驾〗/〖激将〗/〖救援〗/〖血裔〗中的一个技能直至当前回合结束。", + spzhaoxin: "昭心", + spzhaoxin_info: "摸牌阶段结束时,你可以展示所有手牌,然后视为使用一张【杀】。", + splanggu: "狼顾", + splanggu_rewrite: "狼顾", + splanggu_info: "当你受到有来源的伤害后,你可以进行判定(此判定结果生效前,你可以打出一张手牌替换判定牌)。然后你可以观看伤害来源的手牌并弃置其中的任意张与判定结果花色相同的牌。", + spfuluan: "扶乱", + spfuluan_info: "出牌阶段限一次,你可以弃置三张花色相同的牌并选择攻击范围内的一名角色。若如此做,该角色翻面且你不能使用【杀】直到回合结束。", + spshude: "淑德", + spshude_info: "结束阶段开始时,你可以将手牌补至体力上限。", + spmingjian: "明鉴", + spmingjian_info: "一名角色的回合开始时,你可以选择一项:①弃置一张牌,然后其跳过本回合的判定阶段。②将一张手牌置于其武将牌上,然后其本回合内进行判定时不触发「判定结果生效前」的时机,且其回合结束时将此牌置入弃牌堆。", + spyinzhi: "隐智", + spyinzhi_info: "当你受到1点伤害后,你可以亮出牌堆顶的两张牌。若其中有黑桃牌,则你可以进行至多X次「令一名角色获得伤害来源的一张手牌」的步骤。然后获得其余的牌。(X为其中黑桃牌的数量)", + yj_caoang: "用间曹昂", + yj_caoang_prefix: "用间", + yjxuepin: "血拼", + yjxuepin_info: "出牌阶段限一次,你可以选择攻击范围内的一名角色并失去1点体力。你弃置其两张牌。若这两张牌类型相同,你回复1点体力。", + ns_chendao: "用间陈到", + ns_chendao_prefix: "用间", + nsjianglie: "将烈", + nsjianglie_info: "当你使用【杀】指定目标后,你可以令其展示所有手牌,然后弃置其中一种颜色的牌。", + ns_jiaxu: "★贾诩", + ns_jiaxu_prefix: "★", + nsyice: "遗策", + nsyice_info: "锁定技,当你使用/打出/弃置的牌进入弃牌堆后,你将这些牌以任意顺序置于你的武将牌上,称为“策”。若这些“策”中有点数相同的牌,则你获得这两张牌中的所有牌,将这两张牌置于牌堆两端。若场上没有处于濒死状态的角色,则你对一名角色造成1点伤害。", + ns_lijue: "SP李傕", + ns_lijue_prefix: "SP", + ns_zhangji: "SP张济", + ns_zhangji_prefix: "SP", + nsfeixiong: "飞熊", + nsfeixiong_info: "出牌阶段开始时,你可以和一名其他角色拼点。赢的角色对没赢的角色造成1点伤害。", + nscesuan: "策算", + nscesuan_info: "锁定技,当你受到伤害时,你防止此伤害并失去1点体力上限。若你因以此法失去体力上限导致体力值减少,则你摸一张牌。", + nslulve: "掳掠", + nslulve_info: "出牌阶段限一次,你可以弃置X张牌并选择一名装备区内有牌的其他角色,然后对其造成1点伤害(X为其装备区内的牌数)。", + ns_fanchou: "SP樊稠", + ns_fanchou_prefix: "SP", + nsyangwu: "扬武", + nsyangwu_info: "出牌阶段限一次,你可以弃置一张♥手牌并选择一名手牌数大于你的其他角色。你观看其手牌并获得其中的X张牌(X为其与你手牌数之差的一半且向上取整)。", + jsp_liubei: "★刘备", + jsp_liubei_prefix: "★", + jsprende: "仁德", + jsprende_info: "出牌阶段,你可以将至少一张手牌交给其他角色;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌。", + ns_caoanmin: "战役篇曹安民", + ns_caoanmin_prefix: "战役篇", + nskuishe: "窥舍", + nskuishe_info: "出牌阶段限一次,你可以选择一名其他角色A的一张牌,并将此牌交给不为A的一名角色。然后A可以对你使用一张【杀】。", + sp_xiahoushi: "SP夏侯氏", + sp_xiahoushi_prefix: "SP", + xinfu_yanyu: "燕语", + xinfu_yanyu_info: "一名角色的出牌阶段开始时,你可以弃置一张牌。若如此做,则该出牌阶段内限三次,当一张与你弃置的牌类别相同的其他牌进入弃牌堆后,你可令任意一名角色获得此牌。", + xinfu_yanyu2: "燕语", + xinfu_xiaode: "孝德", + xinfu_xiaode_info: "其他角色死亡后,你可以声明该角色武将牌上的一个技能(主公技、觉醒技、隐匿技、使命技除外)。若如此做,你获得此技能且不能再发动〖孝德〗直到你的回合结束。", + jsp_zhaoyun: "J.SP赵云", + jsp_zhaoyun_prefix: "J.SP", + chixin: "赤心", + chixin1: "赤心", + chixin2: "赤心", + chixin_info: "你可以将♦牌当作【杀】或【闪】使用或打出。出牌阶段,你对在你攻击范围内且本回合内未成为过你使用的【杀】的目标的角色使用的【杀】没有次数限制。", + suiren: "随仁", + suiren_info: "限定技,准备阶段开始时,你可以失去技能〖义从〗,然后加1点体力上限并回复1点体力,然后令一名角色摸三张牌。", + huangjinleishi: "黄巾雷使", + fulu: "符箓", + fulu_info: "当你声明使用普通【杀】后,你可以将此【杀】改为雷【杀】。", + fuji: "助祭", + fuji_info: "当一名角色造成雷属性伤害时,你可以令其进行判定,若结果为黑色,此伤害+1;若结果为红色,该角色获得判定牌。", + sp_pangtong: "☆SP庞统", + sp_pangtong_prefix: "☆SP", + manjuan: "漫卷", + manjuan_info: "其他角色的牌因弃置而进入弃牌堆后,你可以弃置一张花色与之不同的牌,然后获得此牌。", + xinmanjuan: "漫卷", + xinmanjuan_info: "锁定技,当你不因〖漫卷〗或〖醉乡〗而得到牌时,你将此牌置入弃牌堆。然后若此时处于你的回合内,则你可以从弃牌堆中选择获得一张与此牌点数相同的其他牌。", + zuixiang: "醉乡", + zuixiang2: "醉乡", + zuixiang_info: "限定技。准备阶段开始时,你可以亮出牌堆顶的三张牌并置于你的武将牌上。你不能使用或打出与该些牌同类的牌,所有同类牌对你无效。之后的每个准备阶段,你须重复展示一次,直到这些牌中任意两张点数相同。然后,你获得这些牌。", + sp_daqiao: "☆SP大乔", + sp_daqiao_prefix: "☆SP", + yanxiao: "言笑", + yanxiao_info: "出牌阶段,你可以将一张♦牌置于一名角色的判定区内。判定区内有〖言笑〗牌的角色下个判定阶段开始时,其获得判定区里的所有牌。", + anxian: "安娴", + anxian_info: "当你使用【杀】对目标角色造成伤害时,你可以防止此伤害,令其弃置一张手牌,然后你摸一张牌;当你成为【杀】的目标后,你可以弃置一张手牌,令此【杀】对你无效,然后此【杀】的使用者摸一张牌。", + sp_ganning: "☆SP甘宁", + sp_ganning_prefix: "☆SP", + yinling: "银铃", + yinling_bg: "锦", + yinling_info: "出牌阶段,若你的“锦”小于四张,你可以弃置一张黑色牌并指定一名其他角色。若如此做,你将其的一张牌置于你的武将牌上,称为“锦”。", + junwei: "军威", + junwei2: "军威", + junwei_info: "结束阶段开始时,你可以移去三张“锦”。若如此做,你须指定一名角色并令其选择一项:1.展示一张【闪】,然后你将此【闪】交给一名其他角色。2.该角色失去1点体力,然后你将其装备区内的一张牌移出游戏。该角色的回合结束后,将以此法移出游戏的装备牌移回原处。", + sp_xiahoudun: "☆SP夏侯惇", + sp_xiahoudun_prefix: "☆SP", + fenyong: "愤勇", + fenyong2: "愤勇", + fenyong2_bg: "勇", + fenyong_info: "每当你受到一次伤害后,你可以获得一枚「愤勇」标记;当你拥有「愤勇」标记时,防止你受到的所有伤害。", + xuehen: "雪恨", + xuehen_info: "每个角色的结束阶段开始时,若你有愤勇标记,你弃置之,然后选择一项:1.弃置当前回合角色X张牌(X为你已损失的体力值);2.视为对一名任意角色使用一张【杀】。", + sp_lvmeng: "☆SP吕蒙", + sp_lvmeng_prefix: "☆SP", + tanhu: "探虎", + tanhu2: "探虎", + tanhu3: "探虎", + tanhu_info: "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得以下效果直到回合结束:你与该角色的距离为1,你对该角色使用的普通锦囊牌不能被【无懈可击】响应。", + mouduan: "谋断", + mouduan_info: "游戏开始时,你获得标记“武”并获得技能〖激昂〗和〖谦逊〗。当你失去手牌后,若手牌数不大于2,你须将你的标记变为“文”,将这两项技能改为〖英姿〗和〖克己〗。一名角色的回合开始前,你可弃一张牌将标记翻回。", + sp_zhangfei: "☆SP张飞", + sp_zhangfei_prefix: "☆SP", + jie: "嫉恶", + jie_info: "锁定技,当你使用红色【杀】造成伤害时,此伤害+1。", + dahe: "大喝", + dahe2: "大喝", + dahe2_bg: "喝", + dahe_info: "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,该角色不能使用或打出不为♥花色的【闪】直到回合结束,且你可将该角色拼点的牌交给场上一名体力不多于你的角色。若你没赢,你须展示手牌并弃置其中的一张。", + sp_liubei: "☆SP刘备", + sp_liubei_prefix: "☆SP", + zhaolie: "昭烈", + zhaolie_info: "摸牌阶段摸牌时,你可以少摸一张牌并指定攻击范围内的一名角色。你亮出牌堆顶的三张牌,将其中的非基本牌和【桃】置于弃牌堆,然后该角色选择一项:1.你对其造成X点伤害,然后其获得这些基本牌;2.其弃置X张牌,然后你获得这些基本牌。(X为其中非基本牌的数量)", + shichou: "誓仇", + shichou2: "誓仇", + shichou_info: "主公技,限定技,准备阶段,你可指定一名蜀势力角色并交给其两张牌。本局游戏中,当你受到伤害时,改为该角色受到等量的伤害并摸等量的牌,直至该角色第一次进入濒死状态。", + longyufei: "龙羽飞", + longyi: "龙裔", + longyi_info: "你可将所有手牌当做任意基本牌使用或打出。若此牌对应的实体牌中:有锦囊牌,你摸一张牌;有装备牌,此牌不可被响应。", + zhenjue: "阵绝", + zhenjue_info: "一名角色的结束阶段开始时,若你没有手牌,则你可以令其选择一项:①弃置一张牌。②令你摸一张牌。", + //用间 + yj_caocao: "用间曹操", + yj_caocao_prefix: "用间", + yjxiandao: "献刀", + yjxiandao_info: "每回合限一次。当你赠予其他角色一张牌后,你令其不能使用或打出与本次赠予移动的牌A花色相同的牌直到回合结束。然后若牌A:为锦囊牌,你摸两张牌。为装备牌,你获得其一张不为A的牌。为武器牌,你对其造成1点伤害。", + yjsancai: "散财", + yjsancai_info: "出牌阶段限一次,你可以展示所有手牌。若这些牌的类别均相同,则你可以赠予一名其他角色一张手牌。", + yjyibing: "义兵", + yjyibing_info: "当你不因赠予且不因〖义兵〗的嵌套结算而于摸牌阶段外得到牌时,你可以将此次得到的所有牌当做【杀】使用(无距离限制且不计入使用次数)。", + yj_caohong: "用间曹洪", + yj_caohong_prefix: "用间", + yjlifeng: "厉锋", + yjlifeng_info: "①出牌阶段限一次。你可以获得弃牌堆里的一张装备牌。②你发动〖赠予〗可以选择手牌区里的装备牌或装备区里的牌。", + yj_zhangfei: "用间张飞", + yj_zhangfei_prefix: "用间", + yjmangji: "莽击", + yjmangji_info: "锁定技。当你装备区里的牌数或体力值变化后,若你的体力值不小于1,你弃置一张手牌并视为使用一张【杀】。", + yongjian_ganning: "用间甘宁", + yongjian_ganning_prefix: "用间", + yjjielve: "劫掠", + yjjielve_info: "你可以将两张颜色相同的牌当【趁火打劫】使用,若你以此法造成伤害,此技能于本回合失效。", + //什么?孙鲁班?谁会做这种离谱的东西 + yj_dongzhuo: "用间董卓", + yj_dongzhuo_prefix: "用间", + yjtuicheng: "推诚", + yjtuicheng_info: "你可以失去1点体力并视为使用一张【推心置腹】。", + yjyaoling: "耀令", + yjyaoling_info: "出牌阶段结束时,你可以减1点体力上限并选择一名其他角色A和一名角色B,你令A选择一项:1.对B使用一张【杀】;2.你弃置其一张牌。", + yjshicha: "失察", + yjshicha_info: "锁定技。弃牌阶段开始时,若你本回合未发动过〖推诚〗或〖耀令〗之一,你本回合的手牌上限为1。", + yjyongquan: "拥权", + yjyongquan_info: "主公技。结束阶段,其他群势力角色依次可以交给你一张牌。", + yj_liru: "用间李儒", + yj_liru_prefix: "用间", + yjdumou: "毒谋", + yjdumou_info: "锁定技。你的回合内,其他角色的黑色手牌均视为【毒】,你的【毒】均视为【过河拆桥】。", + yjweiquan: "威权", + yjweiquan_info: "限定技。出牌阶段,你可以选择至多X名角色(X为游戏轮数),然后选择一名角色A,这些角色依次将一张手牌交给A。然后若A的手牌数大于体力值,其插入执行一个仅有弃牌阶段的回合。", + yjrenwang: "人望", + yjrenwang_info: "出牌阶段限一次。你可以选择弃牌堆中的一张黑色基本牌,令一名角色获得之。", + yj_xuyou: "用间许攸", + yj_xuyou_prefix: "用间", + yjshicai: "恃才", + yjshicai_info: "①回合内,牌堆顶的一张牌对你可见。②出牌阶段限一次。你可以弃置一张牌,展示并获得牌堆顶的一张牌。当此牌离开你的手牌区后,重置〖恃才②〗。", + yjchenggong: "逞功", + yjchenggong_info: "当一名角色使用牌指定第一个目标后,若此牌目标数大于1,你可以令其摸一张牌。", + yjzezhu: "择主", + yjzezhu_info: "出牌阶段限一次。你可以获得主公区域内的一张牌,然后交给其一张牌。", + yj_jiaxu: "用间贾诩", + yj_jiaxu_prefix: "用间", + yjzhenlve: "缜略", + yjzhenlve_info: "锁定技。①你使用的普通锦囊牌不能被响应。②你不能成为延时锦囊牌的目标。", + yjjianshu: "间书", + yjjianshu_info: "出牌阶段限一次。你可以将一张手牌交给一名其他角色,令其与你选择的另一名其他角色拼点,没赢的角色失去1点体力。", + yjyongdi: "拥嫡", + yjyongdi_info: "限定技。准备阶段,你可以令一名男性角色加1点体力上限并回复1点体力,然后若其武将牌上有主公技且其不为主公,其获得此主公技。", + yj_zhugedan: "用间诸葛诞", + yj_zhugedan_prefix: "用间", + yj_zhenji: "用间甄宓", + yj_zhenji_prefix: "用间", + yjluoshen: "洛神", + yjluoshen_info: "准备阶段,你可以判定并获得判定牌,且可重复此流程直到结果的颜色不同。", + //线下E系列 一战成名 战役篇官盗 + shen_jiaxu: "战役篇神贾诩", + shen_jiaxu_prefix: "战役篇神", + zybishi: "避世", + zybishi_info: "当你成为【杀】的目标后,你可以令使用者摸一张牌,然后令此【杀】无效。", + zyjianbing: "谏兵", + zyjianbing_info: "当一名其他角色受到执行【杀】的效果而受到伤害时,你可以获得其一张牌。若此牌花色为♥,其回复1点体力。", + pe_wangyun: "战役篇王允", + pe_wangyun_prefix: "战役篇", + zylianji: "连计", + zylianji_info: "出牌阶段结束时,若你于此阶段使用牌的类别数达到:1,你可以令一名角色摸一张牌;2,你可以回复1点体力;3,你可以跳过本回合剩余阶段,然后令一名其他角色执行一个仅有你于此回合未执行过的阶段的回合。", + zymoucheng: "谋逞", + zymoucheng_info: "每回合限一次。你可以将一张黑色牌当【借刀杀人】使用。", + pe_zhonghui: "战役篇钟会", + pe_zhonghui_prefix: "战役篇", + zyquanji: "权计", + zyquanji_info: "①当你受到伤害后或使用牌对唯一目标造成伤害后,你可以摸一张牌并将一张牌置于武将上,称为“权”。②你的手牌上限+X(X为“权”数)。", + zypaiyi: "排异", + zypaiyi_backup: "排异", + zypaiyi_info: "出牌阶段限一次。你可以移去一张“权”并令一名角色摸X张牌(X为“权”数,且至多为7),然后若其手牌数大于你,你对其造成1点伤害。", + pe_mengda: "战役篇孟达", + pe_mengda_prefix: "战役篇", + qiuan: "求安", + qiuan_info: "当你受到伤害后,若此伤害的渠道有对应的实体牌且你的武将牌上没有“函”,则你可以防止此伤害并将这些牌置于你的武将牌上,称为“函”。", + liangfan: "量反", + liangfan2: "量反", + liangfan_info: "锁定技,准备阶段开始时,若你的武将牌上有“函”,则你获得这些牌,然后失去1点体力。当你于此回合内因使用实体牌中包含“函”的牌且执行这些牌的效果而造成伤害后,你可以获得目标角色的一张牌。", + pe_sunchen: "战役篇孙綝", + pe_sunchen_prefix: "战役篇", + zyshilu: "嗜戮", + zyshilu_info: "①一名角色死亡后,你可以将其武将牌置于你的武将牌上,称为“戮”,若杀死其的角色是你,你将一张武将牌堆里的牌置为“戮”。②回合开始时,你可以弃置至多X张牌,然后摸等量的牌(X为“戮”数)。", + zyxiongnve: "凶虐", + zyxiongnve_info: "①出牌阶段开始时,你可以将一张“戮”置入武将牌堆并选择一项直到回合结束:1.当你造成伤害时,此伤害+1;2.当你对其他角色造成伤害时,获得其一张牌;3.你使用牌无次数限制。②出牌阶段结束时,你可以将两张“戮”置入武将牌堆,然后当你于下回合开始前受到其他角色造成的伤害时,此伤害-1。", + pe_wenqin: "战役篇文钦", + pe_wenqin_prefix: "战役篇", + gzjinfa: "矜伐", + gzjinfa_info: "出牌阶段限一次。你可以弃置一张牌,令一名其他角色选择一项:1.令你获得其一张牌;2.交给你一张装备牌,若此牌花色为♠,其视为对你使用一张【杀】。", + zyshangyi: "尚义", + zyshangyi_info: "出牌阶段限一次。你可以令一名其他角色观看你的手牌,然后你观看其手牌并可以弃置其中一张牌。", + zymingshi: "名士", + zymingshi_info: "锁定技。若你有空置的防具栏,属性【杀】对你无效。", + gzsuishi: "随势", + gzsuishi2: "随势", + gzsuishi_info: "锁定技,其他角色进入濒死状态时,若伤害来源与你势力相同,你摸一张牌;其他角色死亡时,若其与你势力相同,你失去1点体力。", + //线下S系列 + ps_guanyu: "★关羽", + ps_guanyu_prefix: "★", + pszhonghun: "忠魂", + pszhonghun_info: "当你使用或打出红色牌时,你可以亮出牌堆顶的一张牌。若此牌为红色,你获得之。", + ps2070_guojia: "★郭嘉", + ps2070_guojia_prefix: "★", + psquanmou: "全谋", + psquanmou_info: "当其他角色使用锦囊牌结算结束后,若你是此牌目标,你可以弃置一张与此牌颜色相同的手牌并获得之。", + ps1059_guojia: "★郭嘉", + ps1059_guojia_prefix: "★", + psqizuo: "奇佐", + psqizuo_info: "当你攻击范围内的角色造成或受到伤害时,你可以弃置一张牌并判定,若此牌颜色与结果相同,你可以令此伤害+1或-1。", + ps2063_zhaoyun: "★赵云", + ps2063_zhaoyun_prefix: "★", + psqijin: "七进", + psqijin_info: "摸牌阶段,你可以改为亮出牌堆顶的七张牌,并获得其中一种颜色的所有牌。", + psqichu: "七出", + psqichu_info: "每回合限一次。当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌。若其中有此牌,你可以使用或打出之。", + pslongxin: "龙心", + pslongxin_info: "判定阶段开始时,你可以弃置一张装备牌,然后弃置你判定区里的一张牌。", + ps2080_zhouyu: "★周瑜", + ps2080_zhouyu_prefix: "★", + psshiyin: "识音", + psshiyin_info: "①游戏开始时,你可以将一张手牌置于武将牌上,称为“杂音”牌。②出牌阶段开始时,你可以用一张手牌替换“杂音”牌。", + psquwu: "曲误", + psquwu_info: "锁定技。你不能使用或打出与“杂音”牌花色相同的牌,且这些牌对你无效。", + psliaozou: "聊奏", + psliaozou_info: "出牌阶段,你可以展示所有手牌,若其中没有与“杂音”牌花色相同的牌,你摸一张牌。", + ps1062_zhouyu: "★周瑜", + ps1062_zhouyu_prefix: "★", + psoldshiyin: "识音", + psoldshiyin_info: "当你于回合内得到牌后,你可以展示之,然后根据你展示的牌包含的花色数令你本回合使用的下一张牌获得对应效果:不小于1,不能被响应;不小于2,造成的伤害+1;不小于3,使用时摸一张牌。", + ps_caozhi: "★曹植", + ps_caozhi_prefix: "★", + psliushang: "流殇", + psliushang_info: "锁定技。①摸牌阶段,你改为摸X+1张牌,然后依次将一张手牌置于所有其他角色的武将牌上,称为“流殇”牌(X为场上角色数且至少为3)。②其他角色的准备阶段,其选择一项:1.获得其“流殇”牌,且当其于本回合对你造成伤害时,防止此伤害;2.将其“流殇”牌置入弃牌堆。", + psqibu: "七步", + psqibu_info: "限定技。当你进入濒死状态时,你可以亮出牌堆顶的七张牌,回复等同于其中♥牌数的体力,并获得所有♣牌。", + ps_jin_simayi: "★司马懿", + ps_jin_simayi_prefix: "★", + psquanyi: "权奕", + psquanyi_info: "①出牌阶段限一次。你可以与一名角色拼点,赢的角色根据所有拼点牌的花色执行以下效果:♥,其获得没赢的角色区域里的一张牌;♦其对没赢的角色造成1点伤害;♠,其失去1点体力;♣,其弃置两张牌。②当你拼点时,你可以选择牌堆顶的牌作为拼点牌。", + ps2067_zhaoyun: "武将传赵云", + ps2067_zhaoyun_prefix: "武将传", + pshuiqiang: "回枪", + pshuiqiang_info: "当你使用的【杀】被【闪】抵消后,你可以对其使用一张【杀】。", + pshuntu: "魂突", + pshuntu_info: "出牌阶段限一次。当你使用【杀】对目标角色造成伤害后,你可以对其使用一张【杀】。", + ps_caopi: "★曹丕", + ps_caopi_prefix: "★", + psjianwei: "僭位", + psjianwei_info: "限定技。回合开始时,你可以失去1点体力,然后与一名其他角色交换区域里的所有牌。", + ps2068_simayi: "★司马懿", + ps2068_simayi_prefix: "★", + pszhonghu: "冢虎", + pszhonghu_info: "当一名角色于你的回合外死亡后,你可以结束此回合,然后令所有角色于其回合开始前跳过此回合直到你的回合开始前。", + ps_simayi: "★司马懿", + ps_simayi_prefix: "★", + pshuxiao: "虎啸", + pshuxiao_info: "回合开始时,你可以判定。若结果为基本牌或普通锦囊牌,你于本回合内获得如下效果:你可以将与结果点数或花色相同的手牌当与判定牌牌名和属性相同的牌使用。", + ps_zhugeliang: "★诸葛亮", + ps_zhugeliang_prefix: "★", + psguanxing: "观星", + psguanxing_info: "准备阶段,你可以观看牌堆顶的五张牌,并将其以任意顺序置于牌堆项或牌堆底。", + pslongyin: "龙吟", + pslongyin_info: "每回合限一次。你可以将任意张点数和为13的牌当做任意一张基本牌或普通锦囊牌使用或打出。", + ps2066_zhugeliang: "武将传诸葛亮", + ps2066_zhugeliang_prefix: "武将传", + pszhiji: "智激", + pszhiji_info: "出牌阶段限一次。你可以弃置两张手牌并选择两名势力不同的角色,视为这两名角色依次视为对对方使用一张【杀】。", + psjiefeng: "借风", + psjiefeng_info: "出牌阶段,你可以弃置两张手牌,然后亮出牌堆顶五张牌。若其中有至少两张红色牌,你视为使用一张【万箭齐发】。", + ps_machao: "★马超", + ps_machao_prefix: "★", + psweihou: "威侯", + psweihou_info: "当你判定前,你可以亮出牌堆顶的两张牌,选择其中一张作为你的本次判定结果,然后将另一张置入弃牌堆。", + ps_lvbu: "★吕布", + ps_lvbu_prefix: "★", + pssheji: "射戟", + pssheji_info: "出牌阶段限一次。你可以将所有手牌当一张无距离限制的【杀】使用,然后当此【杀】对目标角色造成伤害后,你获得其装备区里的所有武器牌和坐骑牌。", + ps_jiaxu: "★贾诩", + ps_jiaxu_prefix: "★", + psqupo: "驱魄", + psqupo_info: "一名角色A的回合开始时,你可以将一张牌交给另一名其他角色B。若此牌为:黑色,当A使用【杀】指定不为B的角色为目标时,A失去1点体力;红色,当B于本回合下一次受到伤害时,B失去1点体力。", + psbaoquan: "保全", + psbaoquan_info: "当你受到伤害时,你可以弃置一张锦囊牌并防止此伤害。", + //S特 + ps_shen_machao: "S特神马超", + ps_shen_machao_prefix: "S特神", + psshouli: "狩骊", + psshouli_info: "锁定技。①游戏开始时,所有角色依次选择一项:1.使用一张坐骑牌,然后摸一张牌;2.随机从游戏外的八张坐骑牌指示物中使用一张。②你可以将场上一张进攻坐骑当【杀】,防御坐骑当【闪】使用或打出,若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。", + pshengwu: "横骛", + pshengwu_info: "当你使用或打出牌时,若场上有该花色的装备牌,你可以弃置任意张该花色的手牌,然后摸X张牌(X为你弃置的牌数与场上与此牌花色相同的装备牌数之和)。", + //线下K系列木盒 + pk_sp_duyu: "K系列杜预", + pk_sp_duyu_prefix: "K系列", + pkwuku: "武库", + pkwuku_info: "锁定技。当有角色使用装备牌时,若你的“武库”数小于3,则你获得1枚“武库”。", + pksanchen: "三陈", + pksanchen_info: "觉醒技。结束阶段,若你的“武库”数大于2,则你加1点体力上限并回复1点体力,然后获得〖灭吴〗。", + pkmiewu: "灭吴", + pkmiewu2: "灭吴", + pkmiewu_info: "每回合限一次。你可移去1枚“武库”,视为使用或打出任意一张基本牌或普通锦囊牌,然后摸一张牌。", + //天书乱斗虚拟偶像 + vtb_xiaosha: "小杀", + vtbguisha: "瑰杀", + vtbguisha_info: "当其他角色使用【杀】时,你可以弃置一张牌令此【杀】不计入次数,且此【杀】对目标角色造成的伤害+1。", + vtbshuli: "淑丽", + vtbshuli_info: "每回合限两次。当其他角色使用【杀】造成伤害后,你可以与其各摸一张牌。", + vtb_xiaoshan: "小闪", + vtbshanwu: "闪舞", + vtbshanwu_info: "当其他角色成为【杀】的第一个目标时,你可以弃置一张【闪】,然后取消此【杀】的所有目标。", + vtbxianli: "娴丽", + vtbxianli_info: "每回合限两次。当你失去牌后,若其中有【闪】,你可以获得当前回合角色的一张牌。", + vtb_xiaotao: "小桃", + vtbtaoyan: "桃宴", + vtbtaoyan_info: "回合开始时,你可以令至多两名其他角色摸一张牌并于游戏外获得一张【桃】(共五张且均为♥6)。", + vtbyanli: "妍丽", + vtbyanli_info: "每轮限一次。一名角色于你的回合外进入濒死状态时,你可以令其回复至1点体力,然后其摸一张牌。", + vtb_xiaole: "小乐", + vtbleyu: "乐虞", + vtbleyu_info: "一名角色的回合开始时,你可以弃置三张牌令其判定。若结果不为♥,其跳过本回合的出牌阶段。", + vtbyuanli: "媛丽", + vtbyuanli_info: "一名角色跳过出牌阶段后,你可以与一名其他角色各摸一张牌。", + vtb_xiaojiu: "小酒", + vtbmeiniang: "美酿", + vtbmeiniang_info: "其他角色的出牌阶段开始时,你可以令其视为使用一张无次数限制且不计入次数的【酒】。", + vtbyaoli: "媱丽", + vtbyaoli_info: "其他角色于其出牌阶段内使用【酒】后,你可以令其于本回合内使用的下一张【杀】不能被响应且可以额外指定一个目标。", + old_machao: "J.SP马超", + old_machao_prefix: "J.SP", + jsp_caoren: "☆SP曹仁", + jsp_caoren_prefix: "☆SP", + jsp_ganfuren: "SP甘夫人", + jsp_ganfuren_prefix: "SP", + zhangliang: "SP张梁", + zhangliang_prefix: "SP", + ol_xinxianying: "将辛宪英", + ol_xinxianying_prefix: "将", + jiangqing: "战役篇蒋钦", + jiangqing_prefix: "战役篇", + tianfeng: "战役篇田丰", + tianfeng_prefix: "战役篇", + jiling: "战役篇纪灵", + jiling_prefix: "战役篇", + kongrong: "战役篇孔融", + kongrong_prefix: "战役篇", + mateng: "战役篇马腾", + mateng_prefix: "战役篇", + drag_guanyu: "龙关羽", + drag_guanyu_prefix: "龙", + drag_caoren: "龙曹仁", + drag_caoren_prefix: "龙", + drag_lvchang: "龙吕常", + drag_lvchang_prefix: "龙", + dragchaojue: "超绝", + dragchaojue_info: "准备阶段,你可以弃置一张手牌,然后令所有其他角色本回合不能使用或打出此花色的牌,然后这些角色依次选择一项:①正面朝上交给你一张牌;②本回合非锁定技失效。", + dragjunshen: "军神", + dragjunshen_info: "①你可以将一张红色牌当作【杀】使用或打出。②当你使用〖军神①〗转化的【杀】造成伤害时,你可以令受伤角色选择弃置装备区的所有牌或令此伤害+1。③你使用方片【杀】无距离限制,使用红桃【杀】可以额外选择一个目标。", + draglizhong: "厉众", + draglizhong_info: "结束阶段,你可以以任意顺序选择执行任意项:①将任意张装备牌置入任意名角色的装备区;②令你或任意名装备区里有牌的角色各摸一张牌。然后本次成为〖厉众②〗的角色于本轮手牌上限+2且可以将装备区的牌当作【无懈可击】使用。", + dragjuesui: "玦碎", + dragjuesui_info: "每名角色限一次,一名角色进入濒死状态时,你可以令其选择是否将体力值回复至1点并废除装备栏。若其选择是,则其本局游戏获得以下效果:你可以将一张黑色非基本牌当作无次数限制的【杀】使用或打出。", + dragjuwu: "拒武", + dragjuwu_info: "锁定技,攻击范围内至少包含三名角色的角色使用的无属性【杀】对你无效。", + dragshouxiang: "守襄", + dragshouxiang_info: "摸牌阶段,你可以额外摸X张牌。若如此做,你跳过出牌阶段,且本回合的弃牌阶段开始时,你可以交给至多X名角色各一张手牌。(X为攻击范围内包含你的角色)", +}; + +export default translates; diff --git a/character/offline/voices.js b/character/offline/voices.js new file mode 100644 index 000000000..13baf9419 --- /dev/null +++ b/character/offline/voices.js @@ -0,0 +1,419 @@ +export default { + "#dragchaojue": null, + "#dragchaojue1": null, + "#dragchaojue2": null, + "#dragjunshen": null, + "#dragjunshen1": null, + "#dragjunshen2": null, + "#drag_guanyu:die": "什么?此地名叫麦城?", + "#draglizhong": null, + "#draglizhong1": null, + "#draglizhong2": null, + "#dragjuesui": null, + "#dragjuesui1": null, + "#dragjuesui2": null, + "#drag_caoren:die": "长江以南,再无王土矣……", + "#dragjuwu": null, + "#dragjuwu1": null, + "#dragjuwu2": null, + "#dragshouxiang": null, + "#dragshouxiang1": null, + "#dragshouxiang2": null, + "#drag_lvchang:die": null, + "#shushen1": "船到桥头自然直。", + "#shushen2": "妾身无恙,相公请安心征战。", + "#shenzhi1": "子龙将军,一切都托付给你了。", + "#shenzhi2": "阿斗,相信妈妈,没事的。", + "#jsp_ganfuren:die": "请替我照顾好阿斗。", + "#caishi1": "清识难尚,至德可师。", + "#caishi2": "知书达礼,博古通今。", + "#zhongjian1": "浊世风云变幻,当以明眸洞察。", + "#zhongjian2": "心中自有明镜,可鉴奸佞忠良。", + "#ol_xinxianying:die": "吾一生明鉴,竟错看于你。", + "#xinfu_jijun1": "集万千义军,定天下大局!", + "#xinfu_jijun2": "集民力万千,亦可为军!", + "#xinfu_fangtong1": "统领方队,为民意所举!", + "#xinfu_fangtong2": "三十六方,必为大统!", + "#zhangliang:die": null, + "#kuiwei1": "休整片刻,且随我杀出一条血路。", + "#kuiwei2": "骑兵列队,准备突围。", + "#yanzheng1": "任你横行霸道,我自岿然不动。", + "#yanzheng2": "行伍严整,百战不殆。", + "#jsp_caoren:die": "城在人在,城破人亡。", + "#zhuiji": null, + "#zhuiji1": null, + "#zhuiji2": null, + "#cihuai": null, + "#cihuai1": null, + "#cihuai2": null, + "#old_machao:die": "(马蹄声)", + "#vtbguisha1": "瑰姿媚丽,沙场来战。", + "#vtbshuli1": "姿颜姝丽,决意于众。", + "#vtb_xiaosha:die": "哼!你欺负人家!", + "#vtbshanwu1": "见风起舞,胡步轻盈。", + "#vtbxianli1": "娴丽曼瑶,宜室宜家。", + "#vtb_xiaoshan:die": "……你欺负人家!", + "#vtbtaoyan1": "灿若桃花,琼华宴婉!", + "#vtbyanli1": "妍姿秀丽,翩然如花。", + "#vtb_xiaotao:die": "呜呜……你欺负人家……", + "#vtbleyu1": "虞歌爱晚,此间为乐。", + "#vtbyuanli1": "媛媛相携,心有灵犀。", + "#vtb_xiaole:die": "呜呜……你欺负人家……", + "#vtbmeiniang1": "桨醇轻启,酒香富裕。", + "#vtbyaoli1": "酾酒临江,慷慨而旋。", + "#vtb_xiaojiu:die": "呜呜……你欺负人家!", + "#shouli1": "赤骊骋疆,巡狩八荒!", + "#shouli2": "长缨在手,百骥可降!", + "#hengwu1": "横枪立马,独啸秋风!", + "#hengwu2": "世皆彳亍,唯我纵横!", + "#ps_shen_machao:die": null, + "#mashu": null, + "#mashu1": null, + "#mashu2": null, + "#xiongyi1": "此时不战,更待何时!", + "#xiongyi2": "弟兄们,我们的机会来啦!", + "#mateng:die": "儿子,为爹报仇啊……", + "#sijian1": "且听我最后一言!", + "#sijian2": "忠言逆耳啊!!", + "#suishi1": "一荣俱荣!", + "#suishi2": "一损俱损……", + "#tianfeng:die": "不纳吾言而反诛吾心,奈何奈何!!", + "#shuangren": null, + "#shuangren1": "吃我一箭!", + "#shuangren2": "仲国大将纪灵在此!", + "#jiling:die": "额,将军为何咆哮不断……", + "#mingshi1": "孔门之后,忠孝为先。", + "#mingshi2": "名士之风,仁义高洁。", + "#lirang1": "夫礼先王以承天之道,以治人之情。", + "#lirang2": "谦者,德之柄也,让者,礼之逐也。", + "#kongrong:die": "覆巢之下,岂有完卵……", + "#shangyi1": "大丈夫为人坦荡,看下手牌算什么。", + "#shangyi2": "敌情已了然于胸,即刻出发!", + "#jiangqing:die": null, + "#spwuku1": "损益万枢,竭世运机。", + "#spwuku2": "胸藏万卷,充盈如库。", + "#spsanchen1": "贼计已穷,陈兵吴地,可一鼓而下也。", + "#spsanchen2": "伐吴此举,十有九利,惟陛下察之。", + "#pk_sp_duyu:die": null, + "#wushuang1": "谁能挡我!", + "#wushuang2": "神挡杀神,佛挡杀佛!", + "#pssheji1": null, + "#pssheji2": null, + "#ps_lvbu:die": "不可能!", + "#wansha1": "神仙难救,神仙难救啊。", + "#wansha2": "我要你三更死,谁敢留你到五更!", + "#psqupo1": null, + "#psqupo2": null, + "#psbaoquan1": null, + "#psbaoquan2": null, + "#ps_jiaxu:die": "我的时辰也到了……", + "#tieji1": "全军突击!", + "#tieji2": "(马蹄声)", + "#psweihou": null, + "#psweihou1": null, + "#psweihou2": null, + "#ps_machao:die": "(马蹄声)", + "#pszhiji1": null, + "#pszhiji2": null, + "#psjiefeng1": null, + "#psjiefeng2": null, + "#kongcheng11": "(抚琴声)", + "#kongcheng12": "(抚琴声)", + "#ps2066_zhugeliang:die": "将星陨落,天命难违。", + "#guanxing1": "观今夜天象,知天下大事。", + "#guanxing2": "知天易,逆天难。", + "#pslongyin1": null, + "#pslongyin2": null, + "#ps_zhugeliang:die": "将星陨落,天命难违。", + "#reguicai1": "天命难违?哈哈哈哈哈……", + "#reguicai2": "才通天地,逆天改命!", + "#pshuxiao1": null, + "#pshuxiao2": null, + "#ps_simayi:die": "难道真是天意难违?", + "#refankui1": "哼,自作孽不可活!", + "#refankui2": "哼,正中下怀!", + "#pszhonghu1": null, + "#pszhonghu2": null, + "#ps2068_simayi:die": "难道真是天意难违?", + "#psjianwei1": null, + "#psjianwei2": null, + "#fangzhu1": "死罪可免,活罪难赦!", + "#fangzhu2": "给我翻过来!", + "#songwei21": "仙福永享,寿与天齐!", + "#songwei22": "千秋万载,一统江山!", + "#ps_caopi:die": "子建,子建……", + "#smyyingshi1": "鹰扬千里,明察秋毫。", + "#smyyingshi2": "鸢飞戾天,目入百川。", + "#psquanyi": null, + "#psquanyi1": null, + "#psquanyi2": null, + "#ps_jin_simayi:die": null, + "#psliushang1": null, + "#psliushang2": null, + "#psqibu": null, + "#psqibu1": null, + "#psqibu2": null, + "#ps_caozhi:die": "本是同根生,相煎何太急。", + "#yingzi1": "哈哈哈哈!", + "#yingzi2": "汝等看好了!", + "#psoldshiyin1": null, + "#psoldshiyin2": null, + "#ps1062_zhouyu:die": "既生瑜,何生……", + "#psshiyin1": null, + "#psshiyin2": null, + "#psquwu1": null, + "#psquwu2": null, + "#psliaozou1": null, + "#psliaozou2": null, + "#ps2080_zhouyu:die": "既生瑜,何生……", + "#psqijin1": null, + "#psqijin2": null, + "#psqichu1": null, + "#psqichu2": null, + "#pslongxin1": null, + "#pslongxin2": null, + "#ps2063_zhaoyun:die": "这,就是失败的滋味吗?", + "#longdan_sha1": "能进能退,乃真正法器!", + "#longdan_sha2": "吾乃常山赵子龙也!", + "#pshuiqiang1": null, + "#pshuiqiang2": null, + "#pshuntu1": null, + "#pshuntu2": null, + "#ps2067_zhaoyun:die": "这,就是失败的滋味吗?", + "#tiandu1": "罢了。", + "#tiandu2": "也好。", + "#psqizuo1": null, + "#psqizuo2": null, + "#ps1059_guojia:die": "咳,咳……", + "#yiji1": "就这样吧。", + "#yiji2": "哦?", + "#psquanmou1": null, + "#psquanmou2": null, + "#ps2070_guojia:die": "咳,咳……", + "#wusheng1": "关羽在此,尔等受死!", + "#wusheng2": "看尔乃插标卖首!", + "#zhongyi1": "忠义是为将之本。", + "#zhongyi2": "为国尽忠,天经地义。", + "#nuzhan1": null, + "#nuzhan2": null, + "#ps_guanyu:die": "什么?此地名叫麦城?", + "#gzjinfa1": "居功者,当自矜,为将者,当善伐。", + "#gzjinfa2": "此战伐敌所获,皆我之功!", + "#pe_wenqin:die": null, + "#gzshilu": null, + "#gzshilu1": "以杀立威,谁敢反我?", + "#gzshilu2": "将这些乱臣贼子,尽皆诛之!", + "#gzxiongnve": null, + "#gzxiongnve1": "当今天子乃我所立,他敢怎样?", + "#gzxiongnve2": "我兄弟三人同掌禁军,有何所惧?", + "#pe_sunchen:die": null, + "#qiuan1": "明公神文圣武,吾自当举城来降。", + "#qiuan2": "臣心不自安,乃君之过也。", + "#liangfan1": "今举兵投魏,必可封王拜相,一展宏图。", + "#liangfan2": "今举义军事若成,吾为复汉元勋也。", + "#pe_mengda:die": "吾一生寡信,今报应果然来矣...", + "#gzquanji1": "不露圭角,择时而发!", + "#gzquanji2": "晦养厚积,乘势而起!", + "#gzpaiyi1": "排斥异己,为王者必由之路!", + "#gzpaiyi2": "非吾友,则必敌也!", + "#pe_zhonghui:die": "伯约,让你失望了。", + "#wylianji1": "两计扣用,以催强势。", + "#wylianji2": "容老夫细细思量。", + "#zymoucheng": null, + "#zymoucheng1": null, + "#zymoucheng2": null, + "#pe_wangyun:die": "努力谢关东诸公,勤以国家为念!", + "#weimu1": "此计伤不到我。", + "#weimu2": "你奈我何?", + "#zybishi1": null, + "#zybishi2": null, + "#zyjianbing1": null, + "#zyjianbing2": null, + "#shen_jiaxu:die": "我的时辰也到了……", + "#luoshen1": "髣髴兮若轻云之蔽月。", + "#luoshen2": "飘飖兮若流风之回雪。", + "#qingguo1": "凌波微步,罗袜生尘。", + "#qingguo2": "体迅飞凫,飘忽若神。", + "#yj_zhenji:die": "悼良会之永绝兮,哀一逝而异乡。", + "#zhenlue1": null, + "#zhenlue2": null, + "#jianshu1": "来,让我看一出好戏吧。", + "#jianshu2": "纵有千军万马,离心则难成大事。", + "#yongdi1": "臣愿为世子,肝脑涂地。", + "#yongdi2": "嫡庶有别,尊卑有序。", + "#yj_jiaxu:die": "我的时辰也到了……", + "#spshicai1": "主公不听吾之言,实乃障目不见泰山也!", + "#spshicai2": "遣轻骑以袭许都,大事可成。", + "#chenggong1": "吾与主公患难之交也!", + "#chenggong2": "我豫州人才济济,元皓之辈,不堪大用。", + "#zezhu1": null, + "#zezhu2": null, + "#yj_xuyou:die": "阿瞒,没有我你得不到冀州啊!", + "#yjtuicheng1": null, + "#yjtuicheng2": null, + "#yjyaoling1": null, + "#yjyaoling2": null, + "#yjshicha1": null, + "#yjshicha2": null, + "#yjyongquan1": null, + "#yjyongquan2": null, + "#yj_dongzhuo:die": "为何人人……皆与我为敌?", + "#yjjielve1": null, + "#yjjielve2": null, + "#yongjian_ganning:die": "二十年后,又是一条好汉……", + "#yjmangji1": null, + "#yjmangji2": null, + "#yj_zhangfei:die": "实在是,杀不动了……", + "#yjlifeng1": null, + "#yjlifeng2": null, + "#yj_caohong:die": "福兮祸所伏……", + "#yjdumou1": null, + "#yjdumou2": null, + "#yjweiquan1": null, + "#yjweiquan2": null, + "#yjrenwang1": null, + "#yjrenwang2": null, + "#yj_liru:die": "如遇明主,大业必成……", + "#yjxiandao": null, + "#yjxiandao1": null, + "#yjxiandao2": null, + "#yjsancai": null, + "#yjsancai1": null, + "#yjsancai2": null, + "#yjyibing": null, + "#yjyibing1": null, + "#yjyibing2": null, + "#yj_caocao:die": "霸业未成未成啊!", + "#longyi": null, + "#longyi1": null, + "#longyi2": null, + "#zhenjue": null, + "#zhenjue1": null, + "#zhenjue2": null, + "#longyufei:die": null, + "#zhaolie": null, + "#zhaolie1": "不灭东吴,誓不归蜀!", + "#zhaolie2": "汝等勿劝,此战势在必行!", + "#shichou": null, + "#shichou1": "尔等叛贼,害我兄弟,饶不得汝!", + "#shichou2": "尔等叛贼,害我兄弟,饶不得汝!", + "#sp_liubei:die": "这就是桃园吗?", + "#jie1": null, + "#dahe": "燕人张飞在此!", + "#sp_zhangfei:die": "实在是,杀不动了……", + "#tanhu1": null, + "#mouduan1": null, + "#sp_lvmeng:die": "被看穿了吗……", + "#fenyong1": "放手一搏吧!", + "#fenyong2": "壮情豪胆,小伤何惧!", + "#xuehen1": null, + "#xuehen2": null, + "#sp_xiahoudun:die": "血染沙场,马革裹尸,快哉,快哉!", + "#yinling": null, + "#yinling1": null, + "#yinling2": null, + "#junwei": null, + "#junwei1": null, + "#junwei2": null, + "#sp_ganning:die": "二十年后,又是一条好汉……", + "#yanxiao1": "倾心一笑,愿君驻足。", + "#yanxiao2": "英雄壮志,红颜无怨。", + "#anxian1": "大恩不言谢哦~", + "#anxian2": "伯符,不用担心我!", + "#sp_daqiao:die": "伯符,我去了……", + "#manjuan": "漫卷纵酒,白首狂歌。", + "#zuixiang": "懵懵醉乡中,天下心中藏。", + "#sp_pangtong:die": "纵有治世才,难遇治世主。", + "#fulu": null, + "#fuji": null, + "#fuji1": null, + "#fuji2": null, + "#huangjinleishi:die": null, + "#chixin": null, + "#chixin1": null, + "#chixin2": null, + "#reyicong1": "变阵冲轭,以守代攻。", + "#reyicong2": "列阵锋矢,直取要害。", + "#suiren": null, + "#suiren1": null, + "#suiren2": null, + "#jsp_zhaoyun:die": "这,就是失败的滋味吗?", + "#xinfu_yanyu": null, + "#xinfu_yanyu1": null, + "#xinfu_yanyu2": null, + "#xinfu_xiaode": null, + "#xinfu_xiaode1": null, + "#xinfu_xiaode2": null, + "#sp_xiahoushi:die": "愿有来世,不负前缘……", + "#spyicong": null, + "#spyicong1": null, + "#spyicong2": null, + "#sptuji": null, + "#sptuji1": null, + "#sptuji2": null, + "#sp_gongsunzan:die": "我军将败,我已无颜苟活于世……", + "#spzhaoxin": null, + "#spzhaoxin1": null, + "#spzhaoxin2": null, + "#splanggu": null, + "#splanggu1": null, + "#splanggu2": null, + "#sp_simazhao:die": "安世,接下来,就看你的了……", + "#spfuluan": null, + "#spfuluan1": null, + "#spfuluan2": null, + "#spshude": null, + "#spshude1": null, + "#spshude2": null, + "#sp_wangyuanji:die": "世事沉浮,非是一人可逆啊……", + "#spmingjian": null, + "#spmingjian1": null, + "#spmingjian2": null, + "#spyinzhi": null, + "#spyinzhi1": null, + "#spyinzhi2": null, + "#sp_xinxianying:die": "吾一生明鉴,竟错看于你。", + "#sphuangen": null, + "#sphuangen1": null, + "#sphuangen2": null, + "#sphantong": null, + "#sphantong1": null, + "#sphantong2": null, + "#sp_liuxie:die": "为什么,不把复兴汉室的权力交给我……", + "#nsfeixiong": null, + "#nsfeixiong1": null, + "#nsfeixiong2": null, + "#nscesuan": null, + "#nscesuan1": null, + "#nscesuan2": null, + "#ns_lijue:die": "若无内讧,也不至如此。", + "#nslulve": null, + "#nslulve1": null, + "#nslulve2": null, + "#ns_zhangji:die": "哪,哪里来的乱箭?", + "#nsyangwu": null, + "#nsyangwu1": null, + "#nsyangwu2": null, + "#ns_fanchou:die": "唉,稚然,疑心甚重。", + "#nsyice": null, + "#nsyice1": null, + "#nsyice2": null, + "#luanwu1": "哭喊吧,哀求吧,挣扎吧,然后,死吧!", + "#luanwu2": "哼哼哼……坐山观虎斗!", + "#ns_jiaxu:die": "我的时辰也到了……", + "#nsjianglie": null, + "#nsjianglie1": null, + "#nsjianglie2": null, + "#ns_chendao:die": "我的白毦兵,再也不能为先帝出力了。", + "#yjxuepin": null, + "#yjxuepin1": null, + "#yjxuepin2": null, + "#yj_caoang:die": "典将军,还是你赢了……", + "#nskuishe": null, + "#nskuishe1": null, + "#nskuishe2": null, + "#ns_caoanmin:die": "伯父快走!", + "#rerende1": "施仁布泽,乃我大汉立国之本!", + "#rerende2": "同心同德,救困扶危!", + "#jsp_liubei:die": "这就是桃园吗?", +}; diff --git a/character/old.js b/character/old.js deleted file mode 100755 index aaf9d071f..000000000 --- a/character/old.js +++ /dev/null @@ -1,1517 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "old", - connect: true, - characterSort: { - old: { - old_standard: ["ol_yuanshu"], - old_shenhua: [ - "old_shen_zhaoyun", - "old_caocao", - "yuji", - "zhangjiao", - "old_zhugezhan", - "old_guanqiujian", - "xiahouyuan", - "weiyan", - "old_xiaoqiao", - "pangde", - "xuhuang", - "junk_sunquan", - "huangzhong", - "new_caoren", - "old_chendao", - ], - old_refresh: ["old_zhangfei", "old_huatuo", "old_zhaoyun", "ol_huaxiong", "old_guanyu"], - old_yijiang1: [ - "masu", - "xushu", - "xin_yujin", - "old_xusheng", - "old_lingtong", - "fazheng", - "old_gaoshun", - "re_yujin", - ], - old_yijiang2: [ - "old_zhonghui", - "madai", - "old_handang", - "old_liubiao", - "oldre_liubiao", - "old_guanzhang", - "old_wangyi", - ], - old_yijiang3: ["liru", "old_zhuran", "old_fuhuanghou", "old_caochong"], - old_yijiang4: ["old_caozhen", "old_chenqun", "old_zhuhuan", "old_caorui"], - old_yijiang5: ["old_caoxiu", "old_zhuzhi"], - old_yijiang67: ["ol_zhangrang", "old_huanghao", "old_liyan"], - old_sp: [ - "old_shixie", - "panfeng", - "old_wanglang", - "old_maliang", - "old_zhangxingcai", - "old_wangyun", - "old_dingfeng", - "old_guanyinping", - ], - old_yingbian: ["junk_simayi", "old_yangyan", "old_yangzhi"], - old_mobile: ["old_caochun"], - }, - }, - character: { - old_shixie: ["male", "qun", 3, ["biluan", "lixia"]], - panfeng: ["male", "qun", 4, ["kuangfu"]], - old_shen_zhaoyun: ["male", "shen", 2, ["oldjuejing", "oldlonghun"], ["shu"]], - old_guanyinping: ["female", "shu", 3, ["xueji_old", "oldhuxiao", "oldwuji"]], - old_caocao: ["male", "shen", 3, ["junkguixin", "feiying"], ["die_audio"]], - old_chendao: ["male", "shu", 4, ["drlt_wanglie"]], - old_liyan: ["male", "shu", 3, ["duliang", "fulin"]], - old_guanzhang: ["male", "shu", 4, ["old_fuhun"]], - new_caoren: ["male", "wei", 4, ["moon_jushou", "jiewei"]], - huangzhong: ["male", "shu", 4, ["liegong"]], - junk_sunquan: ["male", "shen", 4, ["dili", "yuheng"], ["wei"]], - old_dingfeng: ["male", "wu", 4, ["fenxun", "duanbing"]], - old_huanghao: ["male", "shu", 3, ["oldqinqing", "oldhuisheng"]], - oldre_liubiao: ["male", "qun", 3, ["zishou", "zongshi"]], - old_liubiao: ["male", "qun", 4, ["oldzishou", "zongshi"]], - old_gaoshun: ["male", "qun", 4, ["xianzhen", "jinjiu"]], - old_caorui: ["male", "wei", 3, ["huituo", "oldmingjian", "xingshuai"], ["zhu"]], - old_handang: ["male", "wu", 4, ["oldgongji", "oldjiefan"]], - old_yangzhi: ["female", "jin", 3, ["wanyi", "maihuo"]], - old_yangyan: ["female", "jin", 3, ["xuanbei", "xianwan"]], - madai: ["male", "shu", 4, ["mashu", "oldqianxi"]], - xuhuang: ["male", "wei", 4, ["gzduanliang"]], - junk_simayi: [ - "male", - "jin", - 3, - ["buchen", "smyyingshi", "xiongzhi", "quanbian"], - ["hiddenSkill"], - ], - fazheng: ["male", "shu", 3, ["enyuan", "xuanhuo"]], - ol_yuanshu: ["male", "qun", 4, ["wangzun", "tongji"]], - pangde: ["male", "qun", 4, ["mashu", "mengjin"]], - ol_huaxiong: ["male", "qun", 6, ["new_reyaowu"]], - old_wangyun: ["male", "qun", 4, ["wylianji", "moucheng"], ["clan:太原王氏"]], - old_xiaoqiao: ["female", "wu", 3, ["tianxiang", "hongyan"]], - weiyan: ["male", "shu", 4, ["kuanggu"]], - xiahouyuan: ["male", "wei", 4, ["shensu"]], - old_zhangxingcai: ["female", "shu", 3, ["oldshenxian", "qiangwu"]], - old_fuhuanghou: ["female", "qun", 3, ["oldzhuikong", "oldqiuyuan"]], - old_caochong: ["male", "wei", 3, ["oldrenxin", "oldchengxiang"]], - yuji: ["male", "qun", 3, ["old_guhuo"]], - zhangjiao: ["male", "qun", 3, ["leiji", "guidao", "huangtian"], ["zhu"]], - old_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "new_tishen"]], - old_zhaoyun: ["male", "shu", 4, ["longdan", "new_yajiao"]], - old_huatuo: ["male", "qun", 3, ["jijiu", "chulao"]], - old_guanyu: ["male", "shu", 4, ["wusheng", "yijue"]], - old_caochun: ["male", "wei", 4, ["shanjia"]], - masu: ["male", "shu", 3, ["xinzhan", "huilei"]], - xushu: ["male", "shu", 3, ["xswuyan", "jujian"], ["border:wei"]], - liru: ["male", "qun", 3, ["juece", "mieji", "fencheng"]], - xin_yujin: ["male", "wei", 4, ["jieyue"]], - //lusu:['male','wu',3,['haoshi','dimeng']], - //yuanshao:['male','qun',4,['luanji','xueyi'],['zhu']], - old_zhonghui: ["male", "wei", 3, ["zzhenggong", "zquanji", "zbaijiang"], ["clan:颍川钟氏"]], - old_xusheng: ["male", "wu", 4, ["pojun"]], - old_zhuran: ["male", "wu", 4, ["olddanshou"]], - old_lingtong: ["male", "wu", 4, ["oldxuanfeng"]], - old_caoxiu: ["male", "wei", 4, ["taoxi"]], - old_caozhen: ["male", "wei", 4, ["sidi"]], - old_maliang: ["male", "shu", 3, ["xiemu", "naman"]], - old_chenqun: ["male", "wei", 3, ["dingpin", "oldfaen"]], - old_zhuhuan: ["male", "wu", 4, ["youdi"]], - old_zhuzhi: ["male", "wu", 4, ["anguo"]], - - old_zhugezhan: ["male", "shu", 3, ["old_zuilun", "old_fuyin"]], - ol_zhangrang: ["male", "qun", 3, ["xintaoluan"], ["sex:male_castrated"]], - //ol_manchong:['male','wei',3,['yuce','junxing']], - old_guanqiujian: ["male", "wei", 4, ["drlt_zhenrong", "drlt_hongju"], []], - old_wanglang: ["male", "wei", 3, ["gushe", "jici"]], - old_wangyi: ["female", "wei", 3, ["oldzhenlie", "oldmiji"]], - re_yujin: ["male", "wei", 4, ["yizhong"]], - }, - skill: { - //山包初版神赵 - oldjuejing: { - audio: "xinjuejing", - trigger: { player: "phaseDrawBegin2" }, - filter: function (event, player) { - return !event.numFixed && player.getHp() < player.maxHp; - }, - forced: true, - content: function () { - trigger.num += player.getDamagedHp(); - }, - mod: { - maxHandcard: (player, num) => num + 2, - }, - }, - oldlonghun: { - audio: "relonghun", - inherit: "xinlonghun", - prompt: () => - `将${get.cnNumber( - Math.max(1, get.player().getHp()) - )}张♦牌当做杀,♥牌当做桃,♣牌当做闪,♠牌当做无懈可击使用或打出`, - selectCard: () => Math.max(1, get.player().getHp()), - complexCard: true, - precontent: function () { - delete event.result.skill; - player.logSkill("oldlonghun"); - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag) { - var name; - switch (tag) { - case "respondSha": - name = "diamond"; - break; - case "respondShan": - name = "club"; - break; - case "save": - name = "heart"; - break; - } - if (!player.countCards("hes", { suit: name })) return false; - }, - order: function (item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - var list = ["sha", "tao"]; - var map = { sha: "diamond", tao: "heart" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if ( - player.countCards("hes", function (card) { - return ( - (name != "sha" || get.value(card) < 5) && - get.suit(card, player) == map[name] - ); - }) >= Math.max(1, player.getHp()) && - player.getUseValue({ - name: name, - nature: name == "sha" ? "fire" : null, - }) > 0 - ) { - var temp = get.order({ - name: name, - nature: name == "sha" ? "fire" : null, - }); - if (temp > max) max = temp; - } - } - max /= 1.1; - return max; - } - return 2; - }, - }, - hiddenCard: function (player, name) { - if (name == "wuxie" && _status.connectMode && player.countCards("hes") > 0) return true; - if (name == "wuxie") - return ( - player.countCards("hes", { suit: "spade" }) >= Math.max(1, get.player().getHp()) - ); - if (name == "tao") - return ( - player.countCards("hes", { suit: "heart" }) >= Math.max(1, get.player().getHp()) - ); - }, - }, - //魏武帝 - junkguixin: { - forbid: ["guozhan"], - init: function () { - if (!_status.junkguixin) { - _status.junkguixin = []; - if (!_status.characterlist) { - lib.skill.pingjian.initList(); - } - for (const name of _status.characterlist) { - if (!lib.character[name][3]) continue; - _status.junkguixin.addArray( - lib.character[name][3].filter((skill) => { - var info = get.info(skill); - return info && info.zhuSkill && (!info.ai || !info.ai.combo); - }) - ); - } - } - }, - unique: true, - audio: "guixin", - trigger: { player: "phaseEnd" }, - direct: true, - content: function () { - "step 0"; - var controls = ["获得技能", "修改势力", "cancel2"]; - if (!_status.junkguixin.some((skill) => !player.hasSkill(skill, null, false, false))) - controls.shift(); - player - .chooseControl(controls) - .set("prompt", get.prompt2("junkguixin")) - .set("ai", () => (_status.event.controls.length == 3 ? "获得技能" : "cancel2")); - "step 1"; - if (result.control != "cancel2") { - var next = game.createEvent("junkguixinx"); - next.player = player; - next.setContent(lib.skill.junkguixin["content_" + result.control]); - } - }, - content_获得技能: function () { - "step 0"; - var list = _status.junkguixin - .slice() - .filter((skill) => !player.hasSkill(skill, null, false, false)); - if (!list.length) { - event.finish(); - return; - } - list = list.map((skill) => { - return [ - skill, - '", - ]; - }); - player - .chooseButton(["归心:选择获得一个主公技", [list, "textbutton"]], true) - .set("ai", (button) => 1 + Math.random()); - "step 1"; - if (result.bool) { - player.logSkill("junkguixin"); - player.addSkills(result.links[0]); - } - }, - content_修改势力: function () { - "step 0"; - player - .chooseTarget( - "请选择【归心】的目标", - "更改一名其他角色的势力", - lib.filter.notMe, - true - ) - .set("ai", (target) => 1 + Math.random()); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("junkguixin", target); - var list = lib.group.slice(); - list.removeArray(["shen", target.group]); - player - .chooseControl(list) - .set("prompt", "请选择" + get.translation(target) + "变更的势力") - .set("ai", () => _status.event.controls.randomGet()); - } else event.finish(); - "step 2"; - if (result.control) { - player.popup(get.translation(result.control + "2")); - target.changeGroup(result.control); - } - }, - }, - oldqinqing: { - audio: "qinqing", - mode: ["identity", "versus"], - available: function (mode) { - if (mode == "versus" && _status.mode != "four") return false; - if (mode == "identity" && _status.mode == "purple") return false; - }, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - var zhu = get.zhu(player); - if (!zhu || !zhu.isZhu) return false; - return game.hasPlayer(function (current) { - return current != zhu && current != player && current.inRange(zhu); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("dcqinqing"), function (card, player, target) { - var zhu = get.zhu(player); - return target != player && target.inRange(zhu); - }) - .set("ai", function (target) { - var zhu = get.zhu(player); - var he = target.countCards("he"); - if (get.attitude(_status.event.player, target) > 0) { - if (target.countCards("h") > zhu.countCards("h") + 1) return 0.1; - } else { - if (he > zhu.countCards("h") + 1) return 2; - if (he > 0) return 1; - } - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("dcqinqing", target); - if (target.countDiscardableCards(player, "he")) - player.discardPlayerCard(target, "he", true); - target.draw(); - } else { - event.finish(); - } - "step 2"; - var zhu = get.zhu(player); - if (zhu && zhu.isIn()) { - if (target.countCards("h") > zhu.countCards("h")) player.draw(); - } - }, - }, - oldhuisheng: { - audio: "huisheng", - trigger: { player: "damageBegin4" }, - direct: true, - filter: function (event, player) { - if (!player.countCards("he")) return false; - if (!event.source || event.source == player || !event.source.isIn()) return false; - if (player.storage.oldhuisheng && player.storage.oldhuisheng.includes(event.source)) - return false; - return true; - }, - init: function (player) { - if (player.storage.oldhuisheng) player.storage.oldhuisheng = []; - }, - content: function () { - "step 0"; - if (!player.storage.oldhuisheng) player.storage.oldhuisheng = []; - player.storage.oldhuisheng.push(trigger.source); - var att = get.attitude(player, trigger.source) > 0; - var goon = false; - if (player.hp == 1) { - goon = true; - } else { - var he = player.getCards("he"); - var num = 0; - for (var i = 0; i < he.length; i++) { - if (get.value(he[i]) < 8) { - num++; - if (num >= 2) { - goon = true; - break; - } - } - } - } - player - .chooseCard( - "he", - [1, player.countCards("he")], - get.prompt2("oldhuisheng", trigger.source) - ) - .set("ai", function (card) { - if (_status.event.att) { - return 10 - get.value(card); - } - if (_status.event.goon) { - return 8 - get.value(card); - } - if (!ui.selected.cards.length) { - return 7 - get.value(card); - } - return 0; - }) - .set("goon", goon) - .set("att", att); - "step 1"; - if (result.bool) { - player.logSkill("oldhuisheng", trigger.source); - game.delay(); - event.num = result.cards.length; - var goon = false; - if (event.num > 2 || get.attitude(trigger.source, player) >= 0) { - goon = true; - } - var forced = false; - var str = "获得其中一张牌并防止伤害"; - if (trigger.source.countCards("he") < event.num) { - forced = true; - } else { - str += ",或取消并弃置" + get.cnNumber(result.cards.length) + "张牌"; - } - trigger.source - .chooseButton([str, result.cards], forced) - .set("ai", function (button) { - if (_status.event.goon) { - return get.value(button.link); - } - return get.value(button.link) - 8; - }) - .set("goon", goon); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - var card = result.links[0]; - trigger.source.gain(card, player, "giveAuto", "bySelf"); - trigger.cancel(); - } else { - trigger.source.chooseToDiscard(event.num, true, "he"); - } - }, - }, - oldzishou: { - audio: "zishou", - audioname: ["re_liubiao"], - trigger: { player: "phaseDrawBegin2" }, - check: function (event, player) { - return ( - (player.countCards("h") <= 2 && player.getDamagedHp() >= 2) || - player.skipList.includes("phaseUse") - ); - }, - filter: function (event, player) { - return !event.numFixed && player.isDamaged(); - }, - content: function () { - trigger.num += player.getDamagedHp(); - player.skip("phaseUse"); - }, - ai: { - threaten: 1.5, - }, - }, - oldgongji: { - audio: "gongji", - enable: ["chooseToUse", "chooseToRespond"], - locked: false, - filterCard: { type: "equip" }, - position: "hes", - viewAs: { - name: "sha", - storage: { oldgongji: true }, - }, - viewAsFilter: function (player) { - if (!player.countCards("hes", { type: "equip" })) return false; - }, - prompt: "将一张装备牌当无距离限制的【杀】使用或打出", - check: function (card) { - var val = get.value(card); - if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); - return 5 - val; - }, - mod: { - targetInRange: function (card) { - if (card.storage && card.storage.oldgongji) return true; - }, - }, - ai: { - respondSha: true, - skillTagFilter: function (player) { - if (!player.countCards("hes", { type: "equip" })) return false; - }, - }, - }, - oldjiefan: { - audio: "jiefan", - enable: "chooseToUse", - filter: function (event, player) { - return event.type == "dying" && _status.currentPhase && _status.currentPhase.isIn(); - }, - direct: true, - content: function () { - player - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, get.prompt2("oldjiefan")) - .set("targetRequired", true) - .set("complexSelect", true) - .set("filterTarget", function (card, player, target) { - if ( - target != _status.currentPhase && - !ui.selected.targets.includes(_status.currentPhase) - ) - return false; - return lib.filter.filterTarget.apply(this, arguments); - }) - .set("logSkill", "oldjiefan") - .set("oncard", function () { - _status.event.player.addTempSkill("oldjiefan_recover"); - }) - .set("custom", { - add: {}, - replace: { - window: () => { - ui.click.cancel(); - }, - }, - }); - }, - ai: { - save: true, - order: 3, - result: { player: 1 }, - }, - subSkill: { - recover: { - // audio:'jiefan', - trigger: { source: "damageBegin2" }, - filter: function (event, player) { - return event.getParent(4).name == "oldjiefan"; - }, - forced: true, - popup: false, - charlotte: true, - content: function () { - trigger.cancel(); - var evt = event.getParent("_save"); - var card = { name: "tao", isCard: true }; - if (evt && evt.dying && player.canUse(card, evt.dying)) { - player.useCard(card, evt.dying, "oldjiefan_recover"); - } - }, - }, - }, - }, - oldmingjian: { - audio: "mingjian", - trigger: { player: "phaseUseBefore" }, - filter: function (event, player) { - return player.countCards("h"); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("oldmingjian"), - "跳过出牌阶段并将所有手牌交给一名其他角色,你结束此回合,然后其于此回合后获得一个额外的出牌阶段", - lib.filter.notMe - ) - .set("ai", (target) => { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) return 0.01 * att; - if (player.countCards("h") == player.countCards("h", "du")) return -att; - if (target.hasJudge("lebu")) att *= 1.25; - if (get.attitude(player, target) > 3) { - var basis = get.threaten(target) * att; - if ( - player == get.zhu(player) && - player.hp <= 2 && - player.countCards("h", "shan") && - !game.hasPlayer(function (current) { - return ( - get.attitude(current, player) > 3 && - current.countCards("h", "tao") > 0 - ); - }) - ) - return 0; - if (target.countCards("h") + player.countCards("h") > target.hp + 2) - return basis * 0.8; - return basis; - } - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("oldmingjian", target); - player.give(player.getCards("h"), target); - trigger.cancel(); - } else event.finish(); - "step 2"; - var evt = trigger.getParent("phase"); - if (evt) { - game.log(player, "结束了回合"); - evt.finish(); - } - var next = target.insertPhase(); - next._noTurnOver = true; - next.phaseList = ["phaseUse"]; - //next.setContent(lib.skill.oldmingjian.phase); - }, - phase: function () { - "step 0"; - player.phaseUse(); - "step 1"; - game.broadcastAll(function () { - if (ui.tempnowuxie) { - ui.tempnowuxie.close(); - delete ui.tempnowuxie; - } - }); - }, - }, - oldshenxian: { - audio: "shenxian", - inherit: "shenxian", - }, - old_guhuo: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - return lib.inpile.includes(name) && player.countCards("hs") > 0; - }, - filter: function (event, player) { - if (!player.countCards("hs")) 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; - if (i == "sha") { - for (var j of lib.inpile_nature) { - if ( - event.filterCard( - get.autoViewAs({ name: i, nature: j }, "unsure"), - player, - event - ) - ) - return true; - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i of lib.inpile) { - if (event.type != "phase") - if (!event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) - continue; - var type = get.type(i); - if (type == "basic" || type == "trick") list.push([type, "", i]); - if (i == "sha") { - if (event.type != "phase") - if ( - !event.filterCard( - get.autoViewAs({ name: i, nature: j }, "unsure"), - player, - event - ) - ) - continue; - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } - } - return ui.create.dialog("蛊惑", [list, "vcard"]); - }, - check: function (button) { - var player = _status.event.player; - var order = Math.max(0, get.order(card) + 1); - var enemyNum = game.countPlayer(function (current) { - return ( - current != player && - (get.realAttitude || get.attitude)(current, player) < 0 && - current.hp > 0 - ); - }); - var card = { name: button.link[2], nature: button.link[3] }; - if ( - player.isDying() && - !player.hasCard(function (cardx) { - if (get.suit(cardx) != "heart") return false; - var mod2 = game.checkMod(cardx, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod( - cardx, - player, - player, - "unchanged", - "cardSavable", - player - ); - if (mod != "unchanged") return mod; - var savable = get.info(cardx).savable; - if (typeof savable == "function") savable = savable(card, player, player); - return savable; - }, "hs") - ) { - if ( - !player.getStorage("old_guhuo_cheated").includes(card.name + card.nature) && - Math.random() < 0.4 - ) - return 1; - return 0; - } - var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; - if ( - player.getStorage("old_guhuo_cheated").includes(card.name + card.nature) && - !player.hasCard(function (cardx) { - if (card.name == cardx.name) { - if (card.name != "sha") return true; - return get.is.sameNature(card, cardx); - } - return false; - }, "hs") && - Math.random() < 0.7 - ) - return 0; - if (val <= 0) return 0; - if (enemyNum) { - if ( - !player.hasCard(function (cardx) { - if (card.name == cardx.name) { - if (card.name != "sha") return true; - return get.is.sameNature(card, cardx); - } - return false; - }, "hs") - ) { - if (get.value(card, player, "raw") < 6) - return Math.sqrt(val) * (0.25 + Math.random() / 1.5); - if (enemyNum <= 2) return Math.sqrt(val) / 1.5 + order * 10; - return 0; - } - return 3 * val + order * 10; - } - return val + order * 10; - }, - backup: function (links, player) { - return { - filterCard: function (card, player, target) { - var result = true; - var suit = card.suit, - number = card.number; - card.suit = "none"; - card.number = null; - var mod = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod != "unchanged") result = mod; - card.suit = suit; - card.number = number; - return result; - }, - selectCard: 1, - position: "hs", - ignoreMod: true, - aiUse: Math.random(), - viewAs: { - name: links[0][2], - nature: links[0][3], - suit: "none", - number: null, - }, - ai1: function (card) { - var player = _status.event.player; - var enemyNum = game.countPlayer(function (current) { - return ( - current != player && - (get.realAttitude || get.attitude)(current, player) < 0 && - current.hp > 0 - ); - }); - var cardx = lib.skill.old_guhuo_backup.viewAs; - if (enemyNum) { - if ( - (card.name == cardx.name && - (card.name != "sha" || get.is.sameNature(card, cardx))) || - player - .getStorage("old_guhuo_cheated") - .includes(card.name + card.nature) - ) - return (get.suit(card) == "heart" ? 8 : 4) + Math.random() * 3; - else if (lib.skill.old_guhuo_backup.aiUse < 0.5 && !player.isDying()) - return 0; - } - return get.value(cardx) - get.value(card); - }, - precontent: function () { - player.logSkill("old_guhuo"); - player.addTempSkill("old_guhuo_guess"); - var card = event.result.cards[0]; - event.result.card.suit = get.suit(card); - event.result.card.number = get.number(card); - }, - }; - }, - prompt: function (links, player) { - return ( - "将一张手牌当做" + - (links[0][3] ? get.translation(links[0][3]) : "") + - "【" + - get.translation(links[0][2]) + - "】" + - (_status.event.name == "chooseToRespond" ? "打出" : "使用") - ); - }, - }, - ai: { - save: true, - respondSha: true, - respondShan: true, - fireAttack: true, - skillTagFilter: function (player) { - if (!player.countCards("hs")) return false; - }, - threaten: 1.2, - order: 10, - result: { player: 1 }, - }, - subSkill: { - cheated: { - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - charlotte: true, - forced: true, - silent: true, - popup: false, - firstDo: true, - onremove: true, - filter: function (event, player) { - if (event.getParent().name == "draw") return true; - var cards = event.getg(player); - if (!cards.length) return false; - return game.hasPlayer((current) => { - if (current == player) return false; - var evt = event.getl(current); - if (evt && evt.cards && evt.cards.length) return true; - return false; - }); - }, - content: function () { - player.removeSkill("old_guhuo_cheated"); - }, - }, - }, - }, - old_guhuo_guess: { - audio: "old_guhuo", - trigger: { - player: ["useCardBefore", "respondBefore"], - }, - forced: true, - silent: true, - popup: false, - firstDo: true, - charlotte: true, - filter: function (event, player) { - return event.skill && event.skill.indexOf("old_guhuo_") == 0; - }, - content: function () { - "step 0"; - event.fake = false; - event.goon = true; - event.betrayers = []; - var card = trigger.cards[0]; - if ( - card.name != trigger.card.name || - (card.name == "sha" && !get.is.sameNature(trigger.card, card)) - ) - event.fake = true; - if (event.fake) { - player.addSkill("old_guhuo_cheated"); - player.markAuto("old_guhuo_cheated", [trigger.card.name + trigger.card.nature]); - } - player.popup(trigger.card.name, "metal"); - player.lose(card, ui.ordering).relatedEvent = trigger; - trigger.throw = false; - trigger.skill = "old_guhuo_backup"; - game.log( - player, - "声明", - trigger.targets && trigger.targets.length ? "对" : "", - trigger.targets || "", - trigger.name == "useCard" ? "使用" : "打出", - trigger.card - ); - event.prompt = - get.translation(player) + - "声明" + - (trigger.targets && trigger.targets.length - ? "对" + get.translation(trigger.targets) - : "") + - (trigger.name == "useCard" ? "使用" : "打出") + - (get.translation(trigger.card.nature) || "") + - get.translation(trigger.card.name) + - ",是否质疑?"; - event.targets = game - .filterPlayer((i) => i != player && i.hp > 0) - .sortBySeat(_status.currentPhase); - - game.broadcastAll( - function (card, player) { - _status.old_guhuoNode = card.copy("thrown"); - if (lib.config.cardback_style != "default") { - _status.old_guhuoNode.style.transitionProperty = "none"; - ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.classList.add("infohidden"); - ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.style.transitionProperty = ""; - } else { - _status.old_guhuoNode.classList.add("infohidden"); - } - _status.old_guhuoNode.style.transform = - "perspective(600px) rotateY(180deg) translateX(0)"; - player.$throwordered2(_status.old_guhuoNode); - }, - trigger.cards[0], - player - ); - event.onEnd01 = function () { - _status.old_guhuoNode.removeEventListener( - "webkitTransitionEnd", - _status.event.onEnd01 - ); - setTimeout(function () { - _status.old_guhuoNode.style.transition = "all ease-in 0.3s"; - _status.old_guhuoNode.style.transform = "perspective(600px) rotateY(270deg)"; - var onEnd = function () { - _status.old_guhuoNode.classList.remove("infohidden"); - _status.old_guhuoNode.style.transition = "all 0s"; - ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.style.transform = "perspective(600px) rotateY(-90deg)"; - ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.style.transition = ""; - ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.style.transform = ""; - _status.old_guhuoNode.removeEventListener("webkitTransitionEnd", onEnd); - }; - _status.old_guhuoNode.listenTransition(onEnd); - }, 300); - }; - if (!event.targets.length) event.goto(3); - "step 1"; - event.target = event.targets.shift(); - event.target - .chooseButton([event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true) - .set("ai", function (button) { - var player = _status.event.player; - var evt = _status.event.getParent("old_guhuo_guess"), - evtx = evt.getTrigger(); - if (!evt) return Math.random(); - var card = { name: evtx.card.name, nature: evtx.card.nature, isCard: true }; - var ally = button.link[2] == "reguhuo_ally"; - if (ally && (player.hp <= 1 || get.attitude(player, evt.player) >= 0)) return 1.1; - if (!ally && get.effect(player, { name: "losehp" }, player, player) >= 0) - return 10; - if (!ally && get.attitude(player, evt.player) < 0) { - if (evtx.name == "useCard") { - var eff = 0; - var targetsx = evtx.targets || []; - for (var target of targetsx) { - var isMe = target == evt.player; - eff += - get.effect(target, card, evt.player, player) / (isMe ? 1.35 : 1); - } - eff /= 1.5 * targetsx.length || 1; - if (eff > 0) return 0; - if (eff < -7) - return ( - (Math.random() + Math.pow(-(eff + 7) / 8, 2)) / - Math.sqrt(evt.betrayers.length + 1) + - (player.hp - 3) * 0.05 + - Math.max(0, 4 - evt.player.hp) * 0.05 - - (player.hp == 1 && !get.tag(card, "damage") ? 0.2 : 0) - ); - return ( - Math.pow( - (get.value(card, evt.player, "raw") - 4) / (eff == 0 ? 3.1 : 10), - 2 - ) / - Math.sqrt(evt.betrayers.length || 1) + - (player.hp - 3) * 0.05 + - Math.max(0, 4 - evt.player.hp) * 0.05 - ); - } - if ( - evt.player - .getStorage("old_guhuo_cheated") - .includes(card.name + card.nature) - ) - return Math.random() + 0.3; - } - return Math.random(); - }); - "step 2"; - if (result.links[0][2] == "reguhuo_betray") { - target.addExpose(0.2); - game.log(target, "#y质疑"); - target.popup("质疑!", "fire"); - event.betrayers.push(target); - } else { - game.log(target, "#g不质疑"); - target.popup("不质疑", "wood"); - } - if (targets.length) event.goto(1); - "step 3"; - game.delayx(); - game.broadcastAll(function (onEnd) { - _status.event.onEnd01 = onEnd; - if (_status.old_guhuoNode) _status.old_guhuoNode.listenTransition(onEnd, 300); - }, event.onEnd01); - "step 4"; - game.delay(2); - "step 5"; - if (!event.betrayers.length) { - event.goto(7); - } - "step 6"; - if (event.fake) { - for (var target of event.betrayers) { - target.popup("质疑正确", "wood"); - } - event.goon = false; - } else { - for (var target of event.betrayers) { - target.popup("质疑错误", "fire"); - target.loseHp(); - } - if (get.suit(trigger.cards[0], player) != "heart") { - event.goon = false; - } - } - "step 7"; - if (!event.goon) { - game.log(player, "声明的", trigger.card, "作废了"); - trigger.cancel(); - trigger.getParent().goto(0); - trigger.line = false; - } - "step 8"; - game.delay(); - "step 9"; - if (!event.goon) { - if (event.fake) game.asyncDraw(event.betrayers); - game.broadcastAll(ui.clear); - } - }, - }, - old_zuilun: { - audio: "xinfu_zuilun", - subSkill: { - e: {}, - h: {}, - }, - enable: "phaseUse", - usable: 2, - filterTarget: function (card, player, target) { - if (player == target) return false; - var pos = "he"; - if (player.hasSkill("old_zuilun_h")) pos = "e"; - if (player.hasSkill("old_zuilun_e")) pos = "h"; - return target.countGainableCards(player, pos) > 0; - }, - content: function () { - "step 0"; - var pos = "he"; - if (player.hasSkill("old_zuilun_h")) pos = "e"; - if (player.hasSkill("old_zuilun_e")) pos = "h"; - player.gainPlayerCard(target, pos, true); - "step 1"; - if (result.bool && result.cards && result.cards.length) { - target.draw(); - var pos = result.cards[0].original; - if (pos == "h" || pos == "e") - player.addTempSkill("old_zuilun_" + pos, "phaseUseAfter"); - } - }, - ai: { - order: 7, - result: { - target: -1, - }, - }, - }, - old_fuyin: { - mod: { - targetEnabled: function (card, player, target) { - if ( - (card.name == "juedou" || card.name == "sha" || card.name == "huogong") && - player != target && - player.countCards("h") >= target.countCards("h") && - target.hasEmptySlot(2) - ) - return false; - }, - }, - }, - old_jijun: { - marktext: "方", - audio: "xinfu_jijun", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - enable: "phaseUse", - filterCard: true, - selectCard: [1, Infinity], - filter: function (event, player) { - return player.countCards("h") > 0; - }, - check: function (card) { - var player = _status.event.player; - if (36 - player.getExpansions("old_jijun").length <= player.countCards("h")) return 1; - return 5 - get.value(card); - }, - discard: false, - lose: false, - content: function () { - player.addToExpansion(cards, player, "give").gaintag.add("old_jijun"); - }, - ai: { - order: 1, - result: { - player: 1 - }, - combo: "old_fangtong" - }, - }, - old_fangtong: { - trigger: { - player: "phaseJieshuBegin", - }, - audio: "xinfu_fangtong", - forced: true, - skillAnimation: true, - animationColor: "metal", - filter: function (event, player) { - return player.getExpansions("old_jijun").length > 35; - }, - content: function () { - var winners = player.getFriends(); - game.over(player == game.me || winners.includes(game.me)); - }, - ai:{ - combo: "oldjijun" - }, - }, - oldanxu: { - enable: "phaseUse", - usable: 1, - multitarget: true, - audio: 2, - filterTarget: function (card, player, target) { - if (player == target) return false; - var num = target.countCards("h"); - if (ui.selected.targets.length) { - return num < ui.selected.targets[0].countCards("h"); - } - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (num > players[i].countCards("h")) return true; - } - return false; - }, - selectTarget: 2, - content: function () { - "step 0"; - var gainner, giver; - if (targets[0].countCards("h") < targets[1].countCards("h")) { - gainner = targets[0]; - giver = targets[1]; - } else { - gainner = targets[1]; - giver = targets[0]; - } - gainner.gainPlayerCard(giver, "h", true).set("visible", true); - "step 1"; - if (result.bool && result.links.length && get.suit(result.links[0]) != "spade") { - player.draw(); - } - }, - ai: { - order: 10.5, - threaten: 2, - result: { - target: function (player, target) { - var num = target.countCards("h"); - var att = get.attitude(player, target); - if (ui.selected.targets.length == 0) { - if (att > 0) return -1; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - var num2 = players[i].countCards("h"); - var att2 = get.attitude(player, players[i]); - if (att2 >= 0 && num2 < num) return -1; - } - return 0; - } else { - return 1; - } - }, - player: 0.1, - }, - }, - }, - oldfaen: { - audio: "faen", - trigger: { global: ["turnOverAfter", "linkAfter"] }, - filter: function (event, player) { - if (event.name == "link") return event.player.isLinked(); - return true; - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - logTarget: "player", - content: function () { - trigger.player.draw(); - }, - ai: { - expose: 0.2, - }, - }, - oldxuanfeng: { - audio: "xuanfeng", - trigger: { - player: ["loseAfter"], - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - direct: true, - filter: function (event, player) { - var evt = event.getl(player); - return evt && evt.es && evt.es.length > 0; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("oldxuanfeng"), function (card, player, target) { - if (target == player) return false; - return get.distance(player, target) <= 1 || player.canUse("sha", target, false); - }) - .set("ai", function (target) { - if (get.distance(player, target) <= 1) { - return get.damageEffect(target, player, player) * 2; - } else { - return get.effect(target, { name: "sha" }, player, player); - } - }); - "step 1"; - if (result.bool) { - player.logSkill("oldxuanfeng", result.targets); - var target = result.targets[0]; - var distance = get.distance(player, target); - if (distance <= 1 && player.canUse("sha", target, false)) { - player.chooseControl("出杀", "造成伤害").set("ai", function () { - return "造成伤害"; - }); - event.target = target; - } else if (distance <= 1) { - target.damage(); - event.finish(); - } else { - player.useCard({ name: "sha", isCard: true }, target, false).animate = false; - game.delay(); - event.finish(); - } - } else { - event.finish(); - } - "step 2"; - var target = event.target; - if (result.control == "出杀") { - player.useCard({ name: "sha", isCard: true }, target, false).animate = false; - game.delay(); - } else { - target.damage(); - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "equip") return [1, 3]; - }, - }, - reverseEquip: true, - noe: true, - }, - }, - }, - translate: { - old_zhangxingcai: "旧张星彩", - old_zhangxingcai_prefix: "旧", - old_xusheng: "旧徐盛", - old_xusheng_prefix: "旧", - old_lingtong: "旧凌统", - old_lingtong_prefix: "旧", - old_zhuran: "旧朱然", - old_zhuran_prefix: "旧", - old_caoxiu: "旧曹休", - old_caoxiu_prefix: "旧", - old_caozhen: "旧曹真", - old_caozhen_prefix: "旧", - old_maliang: "旧马良", - old_maliang_prefix: "旧", - old_chenqun: "旧陈群", - old_chenqun_prefix: "旧", - old_zhuhuan: "旧朱桓", - old_zhuhuan_prefix: "旧", - old_zhuzhi: "旧朱治", - old_zhuzhi_prefix: "旧", - old_zhugezhan: "旧诸葛瞻", - old_zhugezhan_prefix: "旧", - yuji: "旧于吉", - yuji_prefix: "旧", - old_zhangfei: "新杀张飞", - old_zhangfei_prefix: "新杀", - old_huatuo: "OL华佗", - old_huatuo_prefix: "OL", - old_guanyu: "旧关羽", - old_guanyu_prefix: "旧", - ol_zhangrang: "旧张让", - ol_zhangrang_prefix: "旧", - ol_liaohua: "OL廖化", - ol_liaohua_prefix: "OL", - ol_zhuran: "OL朱然", - ol_zhuran_prefix: "OL", - ol_manchong: "OL满宠", - ol_manchong_prefix: "OL", - old_fuhuanghou: "旧伏寿", - old_fuhuanghou_prefix: "旧", - old_caochong: "旧曹冲", - old_caochong_prefix: "旧", - old_guanqiujian: "旧毌丘俭", - old_guanqiujian_prefix: "旧", - old_wangyun: "旧王允", - old_wangyun_prefix: "旧", - old_zhaoyun: "新杀赵云", - old_zhaoyun_prefix: "新杀", - ol_huaxiong: "旧华雄", - ol_huaxiong_prefix: "旧", - old_xiaoqiao: "旧小乔", - old_xiaoqiao_prefix: "旧", - old_wanglang: "旧王朗", - old_wanglang_prefix: "旧", - old_wangyi: "旧王异", - old_wangyi_prefix: "旧", - xin_yujin: "节钺于禁", - xin_yujin_prefix: "节钺", - re_yujin: "毅重于禁", - re_yujin_prefix: "毅重", - - old_guhuo: "蛊惑", - old_guhuo_info: - "你可以扣置一张手牌当做一张基本牌或普通锦囊牌使用或打出,体力值不为0的其他角色依次选择是否质疑。然后,若有质疑的角色,你展示此牌:若为假,此牌作废,这些角色摸一张牌;若为真,这些角色失去1点体力,且若此牌不为♥,此牌作废。", - old_guhuo_guess: "蛊惑", - old_jijun: "集军", - old_jijun_info: "出牌阶段,你可以将任意张手牌置于武将牌上,称为“方”。", - old_fangtong: "方统", - old_fangtong_info: "锁定技。结束阶段,若你的“方”数目不小于36,则以你的阵营胜利结束本局游戏。", - old_zuilun: "罪论", - old_zuilun_info: - "出牌阶段,你可以获得一名其他角色的一张牌(手牌、装备区各一次),然后该角色摸一张牌。", - old_fuyin: "父荫", - old_fuyin_info: - "锁定技。若你的装备区里没有防具牌,你不能成为手牌数不小于你的其他角色使用【杀】、【决斗】或【火攻】的目标。", - oldanxu: "安恤", - oldanxu_info: - "出牌阶段限一次。你可以选择手牌数不相等的两名其他角色,其中手牌少的角色获得手牌多的角色的一张手牌并展示之,然后若此牌不为黑桃,你摸一张牌。", - oldfaen: "法恩", - oldfaen_info: "当一名角色翻面或横置后,你可以令其摸一张牌。", - oldxuanfeng: "旋风", - oldxuanfeng_info: - "当你失去装备区里的牌后,你可以选择一项:1.视为对一名其他角色使用一张【杀】;2.对一名距离为1的角色造成1点伤害。", - ol_yuanshu: "旧袁术", - ol_yuanshu_prefix: "旧", - fazheng: "旧法正", - fazheng_prefix: "旧", - junk_simayi: "旧晋司马懿", - junk_simayi_prefix: "旧晋", - madai: "旧马岱", - madai_prefix: "旧", - old_yangzhi: "旧杨芷", - old_yangzhi_prefix: "旧", - old_yangyan: "旧杨艳", - old_yangyan_prefix: "旧", - old_caorui: "旧曹叡", - old_caorui_prefix: "旧", - oldmingjian: "明鉴", - oldmingjian_info: - "出牌阶段开始前,你可以跳过此阶段并将所有手牌交给一名其他角色。若如此做,你结束当前回合,然后其获得一个额外的回合(仅包含出牌阶段)。", - old_handang: "旧韩当", - old_handang_prefix: "旧", - oldgongji: "弓骑", - oldgongji_info: "你可以将一张装备牌当做无距离限制的【杀】使用或打出。", - oldjiefan: "解烦", - oldjiefan_info: - "当一名角色A于你的回合外处于濒死状态时,你可以对当前回合角色使用一张【杀】。当此【杀】造成伤害时,你防止此伤害,视为对A使用一张【桃】。", - old_gaoshun: "旧高顺", - old_gaoshun_prefix: "旧", - old_liubiao: "旧刘表", - old_liubiao_prefix: "旧", - oldre_liubiao: "RE刘表", - oldre_liubiao_prefix: "RE", - oldzishou: "自守", - oldzishou_info: - "摸牌阶段,若你已受伤,你可令额定摸牌数+X(X为你已损失的体力值),然后跳过下一个出牌阶段。", - old_huanghao: "旧黄皓", - old_huanghao_prefix: "旧", - oldqinqing: "寝情", - oldqinqing_info: - "结束阶段,你可以选择一名攻击范围内含有主公的其他角色,然后你弃置该角色的一张牌(无牌则不弃),并令其摸一张牌。若该角色的手牌数大于主公,你摸一张牌。", - oldhuisheng: "贿生", - oldhuisheng_info: - "每名角色限一次。当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张并防止此伤害;2.弃置等量的牌。", - old_dingfeng: "旧丁奉", - old_dingfeng_prefix: "旧", - junk_sunquan: "旧神孙权", - junk_sunquan_prefix: "旧神", - new_caoren: "旧曹仁", - new_caoren_prefix: "旧", - old_liyan: "旧李严", - old_liyan_prefix: "旧", - old_chendao: "旧陈到", - old_chendao_prefix: "旧", - old_caocao: "旧神曹操", - old_caocao_prefix: "旧神", - junkguixin: "归心", - junkguixin_info: - "回合结束时,你可以选择一项:①获得剩余武将牌堆的所有主公技的其中一个技能;②更改一名其他角色的势力。", - old_caochun: "旧曹纯", - old_caochun_prefix: "旧", - old_guanyinping: "旧关银屏", - old_guanyinping_prefix: "旧", - old_shen_zhaoyun: "旧神赵云", - old_shen_zhaoyun_prefix: "旧神", - oldjuejing: "绝境", - oldjuejing_info: "锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。", - oldlonghun: "龙魂", - oldlonghun_info: - "你可以将花色相同的Y张牌按下列规则使用或打出:♥当【桃】,♦当火【杀】,♣当【闪】,♠当普【无懈可击】(Y为你的体力值且至少为1)。", - panfeng: "旧潘凤", - panfeng_prefix: "旧", - old_shixie: "旧士燮", - old_shixie_prefix: "旧", - - old_standard: "标准包", - old_shenhua: "神话再临", - old_refresh: "界限突破", - old_yijiang1: "一将成名2011", - old_yijiang2: "一将成名2012", - old_yijiang3: "一将成名2013", - old_yijiang4: "一将成名2014", - old_yijiang5: "一将成名2015", - old_yijiang67: "原创设计", - old_sp: "SP", - old_yingbian: "文德武备", - old_mobile: "移动版", - }, - }; -}); diff --git a/character/old/card.js b/character/old/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/old/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/old/character.js b/character/old/character.js new file mode 100644 index 000000000..b1812a3ea --- /dev/null +++ b/character/old/character.js @@ -0,0 +1,69 @@ +const characters = { + old_shixie: ["male", "qun", 3, ["biluan", "lixia"]], + panfeng: ["male", "qun", 4, ["kuangfu"]], + old_shen_zhaoyun: ["male", "shen", 2, ["oldjuejing", "oldlonghun"], ["shu"]], + old_guanyinping: ["female", "shu", 3, ["xueji_old", "oldhuxiao", "oldwuji"]], + old_caocao: ["male", "shen", 3, ["junkguixin", "feiying"], ["die_audio"]], + old_chendao: ["male", "shu", 4, ["drlt_wanglie"]], + old_liyan: ["male", "shu", 3, ["duliang", "fulin"]], + old_guanzhang: ["male", "shu", 4, ["old_fuhun"]], + new_caoren: ["male", "wei", 4, ["moon_jushou", "jiewei"]], + huangzhong: ["male", "shu", 4, ["liegong"]], + junk_sunquan: ["male", "shen", 4, ["dili", "yuheng"], ["wei"]], + old_dingfeng: ["male", "wu", 4, ["fenxun", "duanbing"]], + old_huanghao: ["male", "shu", 3, ["oldqinqing", "oldhuisheng"]], + oldre_liubiao: ["male", "qun", 3, ["zishou", "zongshi"]], + old_liubiao: ["male", "qun", 4, ["oldzishou", "zongshi"]], + old_gaoshun: ["male", "qun", 4, ["xianzhen", "jinjiu"]], + old_caorui: ["male", "wei", 3, ["huituo", "oldmingjian", "xingshuai"], ["zhu"]], + old_handang: ["male", "wu", 4, ["oldgongji", "oldjiefan"]], + old_yangzhi: ["female", "jin", 3, ["wanyi", "maihuo"]], + old_yangyan: ["female", "jin", 3, ["xuanbei", "xianwan"]], + madai: ["male", "shu", 4, ["mashu", "oldqianxi"]], + xuhuang: ["male", "wei", 4, ["gzduanliang"]], + junk_simayi: ["male", "jin", 3, ["buchen", "smyyingshi", "xiongzhi", "quanbian"], ["hiddenSkill"]], + fazheng: ["male", "shu", 3, ["enyuan", "xuanhuo"]], + ol_yuanshu: ["male", "qun", 4, ["wangzun", "tongji"]], + pangde: ["male", "qun", 4, ["mashu", "mengjin"]], + ol_huaxiong: ["male", "qun", 6, ["new_reyaowu"]], + old_wangyun: ["male", "qun", 4, ["wylianji", "moucheng"], ["clan:太原王氏"]], + old_xiaoqiao: ["female", "wu", 3, ["tianxiang", "hongyan"]], + weiyan: ["male", "shu", 4, ["kuanggu"]], + xiahouyuan: ["male", "wei", 4, ["shensu"]], + old_zhangxingcai: ["female", "shu", 3, ["oldshenxian", "qiangwu"]], + old_fuhuanghou: ["female", "qun", 3, ["oldzhuikong", "oldqiuyuan"]], + old_caochong: ["male", "wei", 3, ["oldrenxin", "oldchengxiang"]], + yuji: ["male", "qun", 3, ["old_guhuo"]], + zhangjiao: ["male", "qun", 3, ["leiji", "guidao", "huangtian"], ["zhu"]], + old_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "new_tishen"]], + old_zhaoyun: ["male", "shu", 4, ["longdan", "new_yajiao"]], + old_huatuo: ["male", "qun", 3, ["jijiu", "chulao"]], + old_guanyu: ["male", "shu", 4, ["wusheng", "yijue"]], + old_caochun: ["male", "wei", 4, ["shanjia"]], + masu: ["male", "shu", 3, ["xinzhan", "huilei"]], + xushu: ["male", "shu", 3, ["xswuyan", "jujian"], ["border:wei"]], + liru: ["male", "qun", 3, ["juece", "mieji", "fencheng"]], + xin_yujin: ["male", "wei", 4, ["jieyue"]], + //lusu:['male','wu',3,['haoshi','dimeng']], + //yuanshao:['male','qun',4,['luanji','xueyi'],['zhu']], + old_zhonghui: ["male", "wei", 3, ["zzhenggong", "zquanji", "zbaijiang"], ["clan:颍川钟氏"]], + old_xusheng: ["male", "wu", 4, ["pojun"]], + old_zhuran: ["male", "wu", 4, ["olddanshou"]], + old_lingtong: ["male", "wu", 4, ["oldxuanfeng"]], + old_caoxiu: ["male", "wei", 4, ["taoxi"]], + old_caozhen: ["male", "wei", 4, ["sidi"]], + old_maliang: ["male", "shu", 3, ["xiemu", "naman"]], + old_chenqun: ["male", "wei", 3, ["dingpin", "oldfaen"]], + old_zhuhuan: ["male", "wu", 4, ["youdi"]], + old_zhuzhi: ["male", "wu", 4, ["anguo"]], + + old_zhugezhan: ["male", "shu", 3, ["old_zuilun", "old_fuyin"]], + ol_zhangrang: ["male", "qun", 3, ["xintaoluan"], ["sex:male_castrated"]], + //ol_manchong:['male','wei',3,['yuce','junxing']], + old_guanqiujian: ["male", "wei", 4, ["drlt_zhenrong", "drlt_hongju"], []], + old_wanglang: ["male", "wei", 3, ["gushe", "jici"]], + old_wangyi: ["female", "wei", 3, ["oldzhenlie", "oldmiji"]], + re_yujin: ["male", "wei", 4, ["yizhong"]], +}; + +export default characters; diff --git a/character/old/characterFilter.js b/character/old/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/old/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/old/characterReplace.js b/character/old/characterReplace.js new file mode 100644 index 000000000..2092d9297 --- /dev/null +++ b/character/old/characterReplace.js @@ -0,0 +1,3 @@ +const characterReplaces = {}; + +export default characterReplaces; diff --git a/character/old/dynamicTranslate.js b/character/old/dynamicTranslate.js new file mode 100644 index 000000000..cdee02b0a --- /dev/null +++ b/character/old/dynamicTranslate.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = {}; +export default dynamicTranslates; diff --git a/character/old/index.js b/character/old/index.js new file mode 100644 index 000000000..fa3c9c360 --- /dev/null +++ b/character/old/index.js @@ -0,0 +1,32 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "old", + connect: true, + character: { ...characters }, + characterSort: { + old: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/old/intro.js b/character/old/intro.js new file mode 100644 index 000000000..82d64b020 --- /dev/null +++ b/character/old/intro.js @@ -0,0 +1,3 @@ +const characterIntro = {}; + +export default characterIntro; diff --git a/character/old/pinyin.js b/character/old/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/old/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/old/skill.js b/character/old/skill.js new file mode 100644 index 000000000..f0ebe675b --- /dev/null +++ b/character/old/skill.js @@ -0,0 +1,1042 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //山包初版神赵 + oldjuejing: { + audio: "xinjuejing", + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { + return !event.numFixed && player.getHp() < player.maxHp; + }, + forced: true, + content: function () { + trigger.num += player.getDamagedHp(); + }, + mod: { + maxHandcard: (player, num) => num + 2, + }, + }, + oldlonghun: { + audio: "relonghun", + inherit: "xinlonghun", + prompt: () => `将${get.cnNumber(Math.max(1, get.player().getHp()))}张♦牌当做杀,♥牌当做桃,♣牌当做闪,♠牌当做无懈可击使用或打出`, + selectCard: () => Math.max(1, get.player().getHp()), + complexCard: true, + precontent: function () { + delete event.result.skill; + player.logSkill("oldlonghun"); + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + var name; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; + } + if (!player.countCards("hes", { suit: name })) return false; + }, + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return (name != "sha" || get.value(card) < 5) && get.suit(card, player) == map[name]; + }) >= Math.max(1, player.getHp()) && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; + } + } + max /= 1.1; + return max; + } + return 2; + }, + }, + hiddenCard: function (player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hes") > 0) return true; + if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) >= Math.max(1, get.player().getHp()); + if (name == "tao") return player.countCards("hes", { suit: "heart" }) >= Math.max(1, get.player().getHp()); + }, + }, + //魏武帝 + junkguixin: { + forbid: ["guozhan"], + init: function () { + if (!_status.junkguixin) { + _status.junkguixin = []; + if (!_status.characterlist) { + lib.skill.pingjian.initList(); + } + for (const name of _status.characterlist) { + if (!lib.character[name][3]) continue; + _status.junkguixin.addArray( + lib.character[name][3].filter(skill => { + var info = get.info(skill); + return info && info.zhuSkill && (!info.ai || !info.ai.combo); + }) + ); + } + } + }, + unique: true, + audio: "guixin", + trigger: { player: "phaseEnd" }, + direct: true, + content: function () { + "step 0"; + var controls = ["获得技能", "修改势力", "cancel2"]; + if (!_status.junkguixin.some(skill => !player.hasSkill(skill, null, false, false))) controls.shift(); + player + .chooseControl(controls) + .set("prompt", get.prompt2("junkguixin")) + .set("ai", () => (_status.event.controls.length == 3 ? "获得技能" : "cancel2")); + "step 1"; + if (result.control != "cancel2") { + var next = game.createEvent("junkguixinx"); + next.player = player; + next.setContent(lib.skill.junkguixin["content_" + result.control]); + } + }, + content_获得技能: function () { + "step 0"; + var list = _status.junkguixin.slice().filter(skill => !player.hasSkill(skill, null, false, false)); + if (!list.length) { + event.finish(); + return; + } + list = list.map(skill => { + return [skill, '"]; + }); + player.chooseButton(["归心:选择获得一个主公技", [list, "textbutton"]], true).set("ai", button => 1 + Math.random()); + "step 1"; + if (result.bool) { + player.logSkill("junkguixin"); + player.addSkills(result.links[0]); + } + }, + content_修改势力: function () { + "step 0"; + player.chooseTarget("请选择【归心】的目标", "更改一名其他角色的势力", lib.filter.notMe, true).set("ai", target => 1 + Math.random()); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("junkguixin", target); + var list = lib.group.slice(); + list.removeArray(["shen", target.group]); + player + .chooseControl(list) + .set("prompt", "请选择" + get.translation(target) + "变更的势力") + .set("ai", () => _status.event.controls.randomGet()); + } else event.finish(); + "step 2"; + if (result.control) { + player.popup(get.translation(result.control + "2")); + target.changeGroup(result.control); + } + }, + }, + oldqinqing: { + audio: "qinqing", + mode: ["identity", "versus"], + available: function (mode) { + if (mode == "versus" && _status.mode != "four") return false; + if (mode == "identity" && _status.mode == "purple") return false; + }, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + var zhu = get.zhu(player); + if (!zhu || !zhu.isZhu) return false; + return game.hasPlayer(function (current) { + return current != zhu && current != player && current.inRange(zhu); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("dcqinqing"), function (card, player, target) { + var zhu = get.zhu(player); + return target != player && target.inRange(zhu); + }) + .set("ai", function (target) { + var zhu = get.zhu(player); + var he = target.countCards("he"); + if (get.attitude(_status.event.player, target) > 0) { + if (target.countCards("h") > zhu.countCards("h") + 1) return 0.1; + } else { + if (he > zhu.countCards("h") + 1) return 2; + if (he > 0) return 1; + } + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dcqinqing", target); + if (target.countDiscardableCards(player, "he")) player.discardPlayerCard(target, "he", true); + target.draw(); + } else { + event.finish(); + } + "step 2"; + var zhu = get.zhu(player); + if (zhu && zhu.isIn()) { + if (target.countCards("h") > zhu.countCards("h")) player.draw(); + } + }, + }, + oldhuisheng: { + audio: "huisheng", + trigger: { player: "damageBegin4" }, + direct: true, + filter: function (event, player) { + if (!player.countCards("he")) return false; + if (!event.source || event.source == player || !event.source.isIn()) return false; + if (player.storage.oldhuisheng && player.storage.oldhuisheng.includes(event.source)) return false; + return true; + }, + init: function (player) { + if (player.storage.oldhuisheng) player.storage.oldhuisheng = []; + }, + content: function () { + "step 0"; + if (!player.storage.oldhuisheng) player.storage.oldhuisheng = []; + player.storage.oldhuisheng.push(trigger.source); + var att = get.attitude(player, trigger.source) > 0; + var goon = false; + if (player.hp == 1) { + goon = true; + } else { + var he = player.getCards("he"); + var num = 0; + for (var i = 0; i < he.length; i++) { + if (get.value(he[i]) < 8) { + num++; + if (num >= 2) { + goon = true; + break; + } + } + } + } + player + .chooseCard("he", [1, player.countCards("he")], get.prompt2("oldhuisheng", trigger.source)) + .set("ai", function (card) { + if (_status.event.att) { + return 10 - get.value(card); + } + if (_status.event.goon) { + return 8 - get.value(card); + } + if (!ui.selected.cards.length) { + return 7 - get.value(card); + } + return 0; + }) + .set("goon", goon) + .set("att", att); + "step 1"; + if (result.bool) { + player.logSkill("oldhuisheng", trigger.source); + game.delay(); + event.num = result.cards.length; + var goon = false; + if (event.num > 2 || get.attitude(trigger.source, player) >= 0) { + goon = true; + } + var forced = false; + var str = "获得其中一张牌并防止伤害"; + if (trigger.source.countCards("he") < event.num) { + forced = true; + } else { + str += ",或取消并弃置" + get.cnNumber(result.cards.length) + "张牌"; + } + trigger.source + .chooseButton([str, result.cards], forced) + .set("ai", function (button) { + if (_status.event.goon) { + return get.value(button.link); + } + return get.value(button.link) - 8; + }) + .set("goon", goon); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + var card = result.links[0]; + trigger.source.gain(card, player, "giveAuto", "bySelf"); + trigger.cancel(); + } else { + trigger.source.chooseToDiscard(event.num, true, "he"); + } + }, + }, + oldzishou: { + audio: "zishou", + audioname: ["re_liubiao"], + trigger: { player: "phaseDrawBegin2" }, + check: function (event, player) { + return (player.countCards("h") <= 2 && player.getDamagedHp() >= 2) || player.skipList.includes("phaseUse"); + }, + filter: function (event, player) { + return !event.numFixed && player.isDamaged(); + }, + content: function () { + trigger.num += player.getDamagedHp(); + player.skip("phaseUse"); + }, + ai: { + threaten: 1.5, + }, + }, + oldgongji: { + audio: "gongji", + enable: ["chooseToUse", "chooseToRespond"], + locked: false, + filterCard: { type: "equip" }, + position: "hes", + viewAs: { + name: "sha", + storage: { oldgongji: true }, + }, + viewAsFilter: function (player) { + if (!player.countCards("hes", { type: "equip" })) return false; + }, + prompt: "将一张装备牌当无距离限制的【杀】使用或打出", + check: function (card) { + var val = get.value(card); + if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); + return 5 - val; + }, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.oldgongji) return true; + }, + }, + ai: { + respondSha: true, + skillTagFilter: function (player) { + if (!player.countCards("hes", { type: "equip" })) return false; + }, + }, + }, + oldjiefan: { + audio: "jiefan", + enable: "chooseToUse", + filter: function (event, player) { + return event.type == "dying" && _status.currentPhase && _status.currentPhase.isIn(); + }, + direct: true, + content: function () { + player + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, get.prompt2("oldjiefan")) + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if (target != _status.currentPhase && !ui.selected.targets.includes(_status.currentPhase)) return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("logSkill", "oldjiefan") + .set("oncard", function () { + _status.event.player.addTempSkill("oldjiefan_recover"); + }) + .set("custom", { + add: {}, + replace: { + window: () => { + ui.click.cancel(); + }, + }, + }); + }, + ai: { + save: true, + order: 3, + result: { player: 1 }, + }, + subSkill: { + recover: { + // audio:'jiefan', + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return event.getParent(4).name == "oldjiefan"; + }, + forced: true, + popup: false, + charlotte: true, + content: function () { + trigger.cancel(); + var evt = event.getParent("_save"); + var card = { name: "tao", isCard: true }; + if (evt && evt.dying && player.canUse(card, evt.dying)) { + player.useCard(card, evt.dying, "oldjiefan_recover"); + } + }, + }, + }, + }, + oldmingjian: { + audio: "mingjian", + trigger: { player: "phaseUseBefore" }, + filter: function (event, player) { + return player.countCards("h"); + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("oldmingjian"), "跳过出牌阶段并将所有手牌交给一名其他角色,你结束此回合,然后其于此回合后获得一个额外的出牌阶段", lib.filter.notMe).set("ai", target => { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) return 0.01 * att; + if (player.countCards("h") == player.countCards("h", "du")) return -att; + if (target.hasJudge("lebu")) att *= 1.25; + if (get.attitude(player, target) > 3) { + var basis = get.threaten(target) * att; + if ( + player == get.zhu(player) && + player.hp <= 2 && + player.countCards("h", "shan") && + !game.hasPlayer(function (current) { + return get.attitude(current, player) > 3 && current.countCards("h", "tao") > 0; + }) + ) + return 0; + if (target.countCards("h") + player.countCards("h") > target.hp + 2) return basis * 0.8; + return basis; + } + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oldmingjian", target); + player.give(player.getCards("h"), target); + trigger.cancel(); + } else event.finish(); + "step 2"; + var evt = trigger.getParent("phase"); + if (evt) { + game.log(player, "结束了回合"); + evt.finish(); + } + var next = target.insertPhase(); + next._noTurnOver = true; + next.phaseList = ["phaseUse"]; + //next.setContent(lib.skill.oldmingjian.phase); + }, + phase: function () { + "step 0"; + player.phaseUse(); + "step 1"; + game.broadcastAll(function () { + if (ui.tempnowuxie) { + ui.tempnowuxie.close(); + delete ui.tempnowuxie; + } + }); + }, + }, + oldshenxian: { + audio: "shenxian", + inherit: "shenxian", + }, + old_guhuo: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + return lib.inpile.includes(name) && player.countCards("hs") > 0; + }, + filter: function (event, player) { + if (!player.countCards("hs")) 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; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard(get.autoViewAs({ name: i, nature: j }, "unsure"), player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of lib.inpile) { + if (event.type != "phase") if (!event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) continue; + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + if (event.type != "phase") if (!event.filterCard(get.autoViewAs({ name: i, nature: j }, "unsure"), player, event)) continue; + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } + } + return ui.create.dialog("蛊惑", [list, "vcard"]); + }, + check: function (button) { + var player = _status.event.player; + var order = Math.max(0, get.order(card) + 1); + var enemyNum = game.countPlayer(function (current) { + return current != player && (get.realAttitude || get.attitude)(current, player) < 0 && current.hp > 0; + }); + var card = { name: button.link[2], nature: button.link[3] }; + if ( + player.isDying() && + !player.hasCard(function (cardx) { + if (get.suit(cardx) != "heart") return false; + var mod2 = game.checkMod(cardx, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(cardx, player, player, "unchanged", "cardSavable", player); + if (mod != "unchanged") return mod; + var savable = get.info(cardx).savable; + if (typeof savable == "function") savable = savable(card, player, player); + return savable; + }, "hs") + ) { + if (!player.getStorage("old_guhuo_cheated").includes(card.name + card.nature) && Math.random() < 0.4) return 1; + return 0; + } + var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + if ( + player.getStorage("old_guhuo_cheated").includes(card.name + card.nature) && + !player.hasCard(function (cardx) { + if (card.name == cardx.name) { + if (card.name != "sha") return true; + return get.is.sameNature(card, cardx); + } + return false; + }, "hs") && + Math.random() < 0.7 + ) + return 0; + if (val <= 0) return 0; + if (enemyNum) { + if ( + !player.hasCard(function (cardx) { + if (card.name == cardx.name) { + if (card.name != "sha") return true; + return get.is.sameNature(card, cardx); + } + return false; + }, "hs") + ) { + if (get.value(card, player, "raw") < 6) return Math.sqrt(val) * (0.25 + Math.random() / 1.5); + if (enemyNum <= 2) return Math.sqrt(val) / 1.5 + order * 10; + return 0; + } + return 3 * val + order * 10; + } + return val + order * 10; + }, + backup: function (links, player) { + return { + filterCard: function (card, player, target) { + var result = true; + var suit = card.suit, + number = card.number; + card.suit = "none"; + card.number = null; + var mod = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod != "unchanged") result = mod; + card.suit = suit; + card.number = number; + return result; + }, + selectCard: 1, + position: "hs", + ignoreMod: true, + aiUse: Math.random(), + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + }, + ai1: function (card) { + var player = _status.event.player; + var enemyNum = game.countPlayer(function (current) { + return current != player && (get.realAttitude || get.attitude)(current, player) < 0 && current.hp > 0; + }); + var cardx = lib.skill.old_guhuo_backup.viewAs; + if (enemyNum) { + if ((card.name == cardx.name && (card.name != "sha" || get.is.sameNature(card, cardx))) || player.getStorage("old_guhuo_cheated").includes(card.name + card.nature)) return (get.suit(card) == "heart" ? 8 : 4) + Math.random() * 3; + else if (lib.skill.old_guhuo_backup.aiUse < 0.5 && !player.isDying()) return 0; + } + return get.value(cardx) - get.value(card); + }, + precontent: function () { + player.logSkill("old_guhuo"); + player.addTempSkill("old_guhuo_guess"); + var card = event.result.cards[0]; + event.result.card.suit = get.suit(card); + event.result.card.number = get.number(card); + }, + }; + }, + prompt: function (links, player) { + return "将一张手牌当做" + (links[0][3] ? get.translation(links[0][3]) : "") + "【" + get.translation(links[0][2]) + "】" + (_status.event.name == "chooseToRespond" ? "打出" : "使用"); + }, + }, + ai: { + save: true, + respondSha: true, + respondShan: true, + fireAttack: true, + skillTagFilter: function (player) { + if (!player.countCards("hs")) return false; + }, + threaten: 1.2, + order: 10, + result: { player: 1 }, + }, + subSkill: { + cheated: { + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + charlotte: true, + forced: true, + silent: true, + popup: false, + firstDo: true, + onremove: true, + filter: function (event, player) { + if (event.getParent().name == "draw") return true; + var cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer(current => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.length) return true; + return false; + }); + }, + content: function () { + player.removeSkill("old_guhuo_cheated"); + }, + }, + }, + }, + old_guhuo_guess: { + audio: "old_guhuo", + trigger: { + player: ["useCardBefore", "respondBefore"], + }, + forced: true, + silent: true, + popup: false, + firstDo: true, + charlotte: true, + filter: function (event, player) { + return event.skill && event.skill.indexOf("old_guhuo_") == 0; + }, + content: function () { + "step 0"; + event.fake = false; + event.goon = true; + event.betrayers = []; + var card = trigger.cards[0]; + if (card.name != trigger.card.name || (card.name == "sha" && !get.is.sameNature(trigger.card, card))) event.fake = true; + if (event.fake) { + player.addSkill("old_guhuo_cheated"); + player.markAuto("old_guhuo_cheated", [trigger.card.name + trigger.card.nature]); + } + player.popup(trigger.card.name, "metal"); + player.lose(card, ui.ordering).relatedEvent = trigger; + trigger.throw = false; + trigger.skill = "old_guhuo_backup"; + game.log(player, "声明", trigger.targets && trigger.targets.length ? "对" : "", trigger.targets || "", trigger.name == "useCard" ? "使用" : "打出", trigger.card); + event.prompt = get.translation(player) + "声明" + (trigger.targets && trigger.targets.length ? "对" + get.translation(trigger.targets) : "") + (trigger.name == "useCard" ? "使用" : "打出") + (get.translation(trigger.card.nature) || "") + get.translation(trigger.card.name) + ",是否质疑?"; + event.targets = game.filterPlayer(i => i != player && i.hp > 0).sortBySeat(_status.currentPhase); + + game.broadcastAll( + function (card, player) { + _status.old_guhuoNode = card.copy("thrown"); + if (lib.config.cardback_style != "default") { + _status.old_guhuoNode.style.transitionProperty = "none"; + ui.refresh(_status.old_guhuoNode); + _status.old_guhuoNode.classList.add("infohidden"); + ui.refresh(_status.old_guhuoNode); + _status.old_guhuoNode.style.transitionProperty = ""; + } else { + _status.old_guhuoNode.classList.add("infohidden"); + } + _status.old_guhuoNode.style.transform = "perspective(600px) rotateY(180deg) translateX(0)"; + player.$throwordered2(_status.old_guhuoNode); + }, + trigger.cards[0], + player + ); + event.onEnd01 = function () { + _status.old_guhuoNode.removeEventListener("webkitTransitionEnd", _status.event.onEnd01); + setTimeout(function () { + _status.old_guhuoNode.style.transition = "all ease-in 0.3s"; + _status.old_guhuoNode.style.transform = "perspective(600px) rotateY(270deg)"; + var onEnd = function () { + _status.old_guhuoNode.classList.remove("infohidden"); + _status.old_guhuoNode.style.transition = "all 0s"; + ui.refresh(_status.old_guhuoNode); + _status.old_guhuoNode.style.transform = "perspective(600px) rotateY(-90deg)"; + ui.refresh(_status.old_guhuoNode); + _status.old_guhuoNode.style.transition = ""; + ui.refresh(_status.old_guhuoNode); + _status.old_guhuoNode.style.transform = ""; + _status.old_guhuoNode.removeEventListener("webkitTransitionEnd", onEnd); + }; + _status.old_guhuoNode.listenTransition(onEnd); + }, 300); + }; + if (!event.targets.length) event.goto(3); + "step 1"; + event.target = event.targets.shift(); + event.target.chooseButton([event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true).set("ai", function (button) { + var player = _status.event.player; + var evt = _status.event.getParent("old_guhuo_guess"), + evtx = evt.getTrigger(); + if (!evt) return Math.random(); + var card = { name: evtx.card.name, nature: evtx.card.nature, isCard: true }; + var ally = button.link[2] == "reguhuo_ally"; + if (ally && (player.hp <= 1 || get.attitude(player, evt.player) >= 0)) return 1.1; + if (!ally && get.effect(player, { name: "losehp" }, player, player) >= 0) return 10; + if (!ally && get.attitude(player, evt.player) < 0) { + if (evtx.name == "useCard") { + var eff = 0; + var targetsx = evtx.targets || []; + for (var target of targetsx) { + var isMe = target == evt.player; + eff += get.effect(target, card, evt.player, player) / (isMe ? 1.35 : 1); + } + eff /= 1.5 * targetsx.length || 1; + if (eff > 0) return 0; + if (eff < -7) return (Math.random() + Math.pow(-(eff + 7) / 8, 2)) / Math.sqrt(evt.betrayers.length + 1) + (player.hp - 3) * 0.05 + Math.max(0, 4 - evt.player.hp) * 0.05 - (player.hp == 1 && !get.tag(card, "damage") ? 0.2 : 0); + return Math.pow((get.value(card, evt.player, "raw") - 4) / (eff == 0 ? 3.1 : 10), 2) / Math.sqrt(evt.betrayers.length || 1) + (player.hp - 3) * 0.05 + Math.max(0, 4 - evt.player.hp) * 0.05; + } + if (evt.player.getStorage("old_guhuo_cheated").includes(card.name + card.nature)) return Math.random() + 0.3; + } + return Math.random(); + }); + "step 2"; + if (result.links[0][2] == "reguhuo_betray") { + target.addExpose(0.2); + game.log(target, "#y质疑"); + target.popup("质疑!", "fire"); + event.betrayers.push(target); + } else { + game.log(target, "#g不质疑"); + target.popup("不质疑", "wood"); + } + if (targets.length) event.goto(1); + "step 3"; + game.delayx(); + game.broadcastAll(function (onEnd) { + _status.event.onEnd01 = onEnd; + if (_status.old_guhuoNode) _status.old_guhuoNode.listenTransition(onEnd, 300); + }, event.onEnd01); + "step 4"; + game.delay(2); + "step 5"; + if (!event.betrayers.length) { + event.goto(7); + } + "step 6"; + if (event.fake) { + for (var target of event.betrayers) { + target.popup("质疑正确", "wood"); + } + event.goon = false; + } else { + for (var target of event.betrayers) { + target.popup("质疑错误", "fire"); + target.loseHp(); + } + if (get.suit(trigger.cards[0], player) != "heart") { + event.goon = false; + } + } + "step 7"; + if (!event.goon) { + game.log(player, "声明的", trigger.card, "作废了"); + trigger.cancel(); + trigger.getParent().goto(0); + trigger.line = false; + } + "step 8"; + game.delay(); + "step 9"; + if (!event.goon) { + if (event.fake) game.asyncDraw(event.betrayers); + game.broadcastAll(ui.clear); + } + }, + }, + old_zuilun: { + audio: "xinfu_zuilun", + subSkill: { + e: {}, + h: {}, + }, + enable: "phaseUse", + usable: 2, + filterTarget: function (card, player, target) { + if (player == target) return false; + var pos = "he"; + if (player.hasSkill("old_zuilun_h")) pos = "e"; + if (player.hasSkill("old_zuilun_e")) pos = "h"; + return target.countGainableCards(player, pos) > 0; + }, + content: function () { + "step 0"; + var pos = "he"; + if (player.hasSkill("old_zuilun_h")) pos = "e"; + if (player.hasSkill("old_zuilun_e")) pos = "h"; + player.gainPlayerCard(target, pos, true); + "step 1"; + if (result.bool && result.cards && result.cards.length) { + target.draw(); + var pos = result.cards[0].original; + if (pos == "h" || pos == "e") player.addTempSkill("old_zuilun_" + pos, "phaseUseAfter"); + } + }, + ai: { + order: 7, + result: { + target: -1, + }, + }, + }, + old_fuyin: { + mod: { + targetEnabled: function (card, player, target) { + if ((card.name == "juedou" || card.name == "sha" || card.name == "huogong") && player != target && player.countCards("h") >= target.countCards("h") && target.hasEmptySlot(2)) return false; + }, + }, + }, + old_jijun: { + marktext: "方", + audio: "xinfu_jijun", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + filter: function (event, player) { + return player.countCards("h") > 0; + }, + check: function (card) { + var player = _status.event.player; + if (36 - player.getExpansions("old_jijun").length <= player.countCards("h")) return 1; + return 5 - get.value(card); + }, + discard: false, + lose: false, + content: function () { + player.addToExpansion(cards, player, "give").gaintag.add("old_jijun"); + }, + ai: { + order: 1, + result: { + player: 1, + }, + combo: "old_fangtong", + }, + }, + old_fangtong: { + trigger: { + player: "phaseJieshuBegin", + }, + audio: "xinfu_fangtong", + forced: true, + skillAnimation: true, + animationColor: "metal", + filter: function (event, player) { + return player.getExpansions("old_jijun").length > 35; + }, + content: function () { + var winners = player.getFriends(); + game.over(player == game.me || winners.includes(game.me)); + }, + ai: { + combo: "oldjijun", + }, + }, + oldanxu: { + enable: "phaseUse", + usable: 1, + multitarget: true, + audio: 2, + filterTarget: function (card, player, target) { + if (player == target) return false; + var num = target.countCards("h"); + if (ui.selected.targets.length) { + return num < ui.selected.targets[0].countCards("h"); + } + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (num > players[i].countCards("h")) return true; + } + return false; + }, + selectTarget: 2, + content: function () { + "step 0"; + var gainner, giver; + if (targets[0].countCards("h") < targets[1].countCards("h")) { + gainner = targets[0]; + giver = targets[1]; + } else { + gainner = targets[1]; + giver = targets[0]; + } + gainner.gainPlayerCard(giver, "h", true).set("visible", true); + "step 1"; + if (result.bool && result.links.length && get.suit(result.links[0]) != "spade") { + player.draw(); + } + }, + ai: { + order: 10.5, + threaten: 2, + result: { + target: function (player, target) { + var num = target.countCards("h"); + var att = get.attitude(player, target); + if (ui.selected.targets.length == 0) { + if (att > 0) return -1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var num2 = players[i].countCards("h"); + var att2 = get.attitude(player, players[i]); + if (att2 >= 0 && num2 < num) return -1; + } + return 0; + } else { + return 1; + } + }, + player: 0.1, + }, + }, + }, + oldfaen: { + audio: "faen", + trigger: { global: ["turnOverAfter", "linkAfter"] }, + filter: function (event, player) { + if (event.name == "link") return event.player.isLinked(); + return true; + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + logTarget: "player", + content: function () { + trigger.player.draw(); + }, + ai: { + expose: 0.2, + }, + }, + oldxuanfeng: { + audio: "xuanfeng", + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("oldxuanfeng"), function (card, player, target) { + if (target == player) return false; + return get.distance(player, target) <= 1 || player.canUse("sha", target, false); + }) + .set("ai", function (target) { + if (get.distance(player, target) <= 1) { + return get.damageEffect(target, player, player) * 2; + } else { + return get.effect(target, { name: "sha" }, player, player); + } + }); + "step 1"; + if (result.bool) { + player.logSkill("oldxuanfeng", result.targets); + var target = result.targets[0]; + var distance = get.distance(player, target); + if (distance <= 1 && player.canUse("sha", target, false)) { + player.chooseControl("出杀", "造成伤害").set("ai", function () { + return "造成伤害"; + }); + event.target = target; + } else if (distance <= 1) { + target.damage(); + event.finish(); + } else { + player.useCard({ name: "sha", isCard: true }, target, false).animate = false; + game.delay(); + event.finish(); + } + } else { + event.finish(); + } + "step 2"; + var target = event.target; + if (result.control == "出杀") { + player.useCard({ name: "sha", isCard: true }, target, false).animate = false; + game.delay(); + } else { + target.damage(); + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip") return [1, 3]; + }, + }, + reverseEquip: true, + noe: true, + }, + }, +}; + +export default skills; diff --git a/character/old/sort.js b/character/old/sort.js new file mode 100644 index 000000000..949539057 --- /dev/null +++ b/character/old/sort.js @@ -0,0 +1,31 @@ +const characterSort = { + old_standard: ["ol_yuanshu"], + old_shenhua: ["old_shen_zhaoyun", "old_caocao", "yuji", "zhangjiao", "old_zhugezhan", "old_guanqiujian", "xiahouyuan", "weiyan", "old_xiaoqiao", "pangde", "xuhuang", "junk_sunquan", "huangzhong", "new_caoren", "old_chendao"], + old_refresh: ["old_zhangfei", "old_huatuo", "old_zhaoyun", "ol_huaxiong", "old_guanyu"], + old_yijiang1: ["masu", "xushu", "xin_yujin", "old_xusheng", "old_lingtong", "fazheng", "old_gaoshun", "re_yujin"], + old_yijiang2: ["old_zhonghui", "madai", "old_handang", "old_liubiao", "oldre_liubiao", "old_guanzhang", "old_wangyi"], + old_yijiang3: ["liru", "old_zhuran", "old_fuhuanghou", "old_caochong"], + old_yijiang4: ["old_caozhen", "old_chenqun", "old_zhuhuan", "old_caorui"], + old_yijiang5: ["old_caoxiu", "old_zhuzhi"], + old_yijiang67: ["ol_zhangrang", "old_huanghao", "old_liyan"], + old_sp: ["old_shixie", "panfeng", "old_wanglang", "old_maliang", "old_zhangxingcai", "old_wangyun", "old_dingfeng", "old_guanyinping"], + old_yingbian: ["junk_simayi", "old_yangyan", "old_yangzhi"], + old_mobile: ["old_caochun"], +}; + +const characterSortTranslate = { + old_standard: "标准包", + old_shenhua: "神话再临", + old_refresh: "界限突破", + old_yijiang1: "一将成名2011", + old_yijiang2: "一将成名2012", + old_yijiang3: "一将成名2013", + old_yijiang4: "一将成名2014", + old_yijiang5: "一将成名2015", + old_yijiang67: "原创设计", + old_sp: "SP", + old_yingbian: "文德武备", + old_mobile: "移动版", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/old/translate.js b/character/old/translate.js new file mode 100644 index 000000000..93d55c57f --- /dev/null +++ b/character/old/translate.js @@ -0,0 +1,146 @@ +const translates = { + old_zhangxingcai: "旧张星彩", + old_zhangxingcai_prefix: "旧", + old_xusheng: "旧徐盛", + old_xusheng_prefix: "旧", + old_lingtong: "旧凌统", + old_lingtong_prefix: "旧", + old_zhuran: "旧朱然", + old_zhuran_prefix: "旧", + old_caoxiu: "旧曹休", + old_caoxiu_prefix: "旧", + old_caozhen: "旧曹真", + old_caozhen_prefix: "旧", + old_maliang: "旧马良", + old_maliang_prefix: "旧", + old_chenqun: "旧陈群", + old_chenqun_prefix: "旧", + old_zhuhuan: "旧朱桓", + old_zhuhuan_prefix: "旧", + old_zhuzhi: "旧朱治", + old_zhuzhi_prefix: "旧", + old_zhugezhan: "旧诸葛瞻", + old_zhugezhan_prefix: "旧", + yuji: "旧于吉", + yuji_prefix: "旧", + old_zhangfei: "新杀张飞", + old_zhangfei_prefix: "新杀", + old_huatuo: "OL华佗", + old_huatuo_prefix: "OL", + old_guanyu: "旧关羽", + old_guanyu_prefix: "旧", + ol_zhangrang: "旧张让", + ol_zhangrang_prefix: "旧", + ol_liaohua: "OL廖化", + ol_liaohua_prefix: "OL", + ol_zhuran: "OL朱然", + ol_zhuran_prefix: "OL", + ol_manchong: "OL满宠", + ol_manchong_prefix: "OL", + old_fuhuanghou: "旧伏寿", + old_fuhuanghou_prefix: "旧", + old_caochong: "旧曹冲", + old_caochong_prefix: "旧", + old_guanqiujian: "旧毌丘俭", + old_guanqiujian_prefix: "旧", + old_wangyun: "旧王允", + old_wangyun_prefix: "旧", + old_zhaoyun: "新杀赵云", + old_zhaoyun_prefix: "新杀", + ol_huaxiong: "旧华雄", + ol_huaxiong_prefix: "旧", + old_xiaoqiao: "旧小乔", + old_xiaoqiao_prefix: "旧", + old_wanglang: "旧王朗", + old_wanglang_prefix: "旧", + old_wangyi: "旧王异", + old_wangyi_prefix: "旧", + xin_yujin: "节钺于禁", + xin_yujin_prefix: "节钺", + re_yujin: "毅重于禁", + re_yujin_prefix: "毅重", + + old_guhuo: "蛊惑", + old_guhuo_info: "你可以扣置一张手牌当做一张基本牌或普通锦囊牌使用或打出,体力值不为0的其他角色依次选择是否质疑。然后,若有质疑的角色,你展示此牌:若为假,此牌作废,这些角色摸一张牌;若为真,这些角色失去1点体力,且若此牌不为♥,此牌作废。", + old_guhuo_guess: "蛊惑", + old_jijun: "集军", + old_jijun_info: "出牌阶段,你可以将任意张手牌置于武将牌上,称为“方”。", + old_fangtong: "方统", + old_fangtong_info: "锁定技。结束阶段,若你的“方”数目不小于36,则以你的阵营胜利结束本局游戏。", + old_zuilun: "罪论", + old_zuilun_info: "出牌阶段,你可以获得一名其他角色的一张牌(手牌、装备区各一次),然后该角色摸一张牌。", + old_fuyin: "父荫", + old_fuyin_info: "锁定技。若你的装备区里没有防具牌,你不能成为手牌数不小于你的其他角色使用【杀】、【决斗】或【火攻】的目标。", + oldanxu: "安恤", + oldanxu_info: "出牌阶段限一次。你可以选择手牌数不相等的两名其他角色,其中手牌少的角色获得手牌多的角色的一张手牌并展示之,然后若此牌不为黑桃,你摸一张牌。", + oldfaen: "法恩", + oldfaen_info: "当一名角色翻面或横置后,你可以令其摸一张牌。", + oldxuanfeng: "旋风", + oldxuanfeng_info: "当你失去装备区里的牌后,你可以选择一项:1.视为对一名其他角色使用一张【杀】;2.对一名距离为1的角色造成1点伤害。", + ol_yuanshu: "旧袁术", + ol_yuanshu_prefix: "旧", + fazheng: "旧法正", + fazheng_prefix: "旧", + junk_simayi: "旧晋司马懿", + junk_simayi_prefix: "旧晋", + madai: "旧马岱", + madai_prefix: "旧", + old_yangzhi: "旧杨芷", + old_yangzhi_prefix: "旧", + old_yangyan: "旧杨艳", + old_yangyan_prefix: "旧", + old_caorui: "旧曹叡", + old_caorui_prefix: "旧", + oldmingjian: "明鉴", + oldmingjian_info: "出牌阶段开始前,你可以跳过此阶段并将所有手牌交给一名其他角色。若如此做,你结束当前回合,然后其获得一个额外的回合(仅包含出牌阶段)。", + old_handang: "旧韩当", + old_handang_prefix: "旧", + oldgongji: "弓骑", + oldgongji_info: "你可以将一张装备牌当做无距离限制的【杀】使用或打出。", + oldjiefan: "解烦", + oldjiefan_info: "当一名角色A于你的回合外处于濒死状态时,你可以对当前回合角色使用一张【杀】。当此【杀】造成伤害时,你防止此伤害,视为对A使用一张【桃】。", + old_gaoshun: "旧高顺", + old_gaoshun_prefix: "旧", + old_liubiao: "旧刘表", + old_liubiao_prefix: "旧", + oldre_liubiao: "RE刘表", + oldre_liubiao_prefix: "RE", + oldzishou: "自守", + oldzishou_info: "摸牌阶段,若你已受伤,你可令额定摸牌数+X(X为你已损失的体力值),然后跳过下一个出牌阶段。", + old_huanghao: "旧黄皓", + old_huanghao_prefix: "旧", + oldqinqing: "寝情", + oldqinqing_info: "结束阶段,你可以选择一名攻击范围内含有主公的其他角色,然后你弃置该角色的一张牌(无牌则不弃),并令其摸一张牌。若该角色的手牌数大于主公,你摸一张牌。", + oldhuisheng: "贿生", + oldhuisheng_info: "每名角色限一次。当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张并防止此伤害;2.弃置等量的牌。", + old_dingfeng: "旧丁奉", + old_dingfeng_prefix: "旧", + junk_sunquan: "旧神孙权", + junk_sunquan_prefix: "旧神", + new_caoren: "旧曹仁", + new_caoren_prefix: "旧", + old_liyan: "旧李严", + old_liyan_prefix: "旧", + old_chendao: "旧陈到", + old_chendao_prefix: "旧", + old_caocao: "旧神曹操", + old_caocao_prefix: "旧神", + junkguixin: "归心", + junkguixin_info: "回合结束时,你可以选择一项:①获得剩余武将牌堆的所有主公技的其中一个技能;②更改一名其他角色的势力。", + old_caochun: "旧曹纯", + old_caochun_prefix: "旧", + old_guanyinping: "旧关银屏", + old_guanyinping_prefix: "旧", + old_shen_zhaoyun: "旧神赵云", + old_shen_zhaoyun_prefix: "旧神", + oldjuejing: "绝境", + oldjuejing_info: "锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。", + oldlonghun: "龙魂", + oldlonghun_info: "你可以将花色相同的Y张牌按下列规则使用或打出:♥当【桃】,♦当火【杀】,♣当【闪】,♠当普【无懈可击】(Y为你的体力值且至少为1)。", + panfeng: "旧潘凤", + panfeng_prefix: "旧", + old_shixie: "旧士燮", + old_shixie_prefix: "旧", +}; + +export default translates; diff --git a/character/old/voices.js b/character/old/voices.js new file mode 100644 index 000000000..ff8b4c563 --- /dev/null +++ b/character/old/voices.js @@ -0,0 +1 @@ +export default {}; diff --git a/character/onlyOL.js b/character/onlyOL.js deleted file mode 100644 index 999b8fd08..000000000 --- a/character/onlyOL.js +++ /dev/null @@ -1,1943 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "onlyOL", - connect: true, - character: { - ol_sb_jiangwei: ["male", "shu", 4, ["olsbzhuri", "olsbranji"]], - ol_caozhang: ["male", "wei", 4, ["oljiangchi"], ["die_audio:xin_caozhang"]], - ol_jianyong: [ - "male", - "shu", - 3, - ["olqiaoshui", "jyzongshi"], - ["tempname:re_jianyong", "die_audio:re_jianyong"], - ], - ol_lingtong: ["male", "wu", 4, ["olxuanfeng"], ["die_audio:re_lingtong"]], - ol_sb_guanyu: ["male", "shu", 4, ["olsbweilin", "olsbduoshou"]], - ol_sb_taishici: ["male", "wu", 4, ["olsbdulie", "olsbdouchan"]], - ol_gaoshun: ["male", "qun", 4, ["olxianzhen", "decadejinjiu"], ["die_audio:re_gaoshun"]], - ol_sb_yuanshao: [ - "male", - "qun", - 4, - ["olsbhetao", "olsbshenli", "olsbyufeng", "olsbshishou"], - ["zhu"], - ], - ol_yufan: [ - "male", - "wu", - 3, - ["olzongxuan", "olzhiyan"], - ["tempname:re_yufan", "die_audio:re_yufan"], - ], - ol_chengpu: [ - "male", - "wu", - 4, - ["dclihuo", "olchunlao"], - ["tempname:xin_chengpu", "die_audio:xin_chengpu"], - ], - ol_wangyi: ["female", "wei", 3, ["olzhenlie", "olmiji"]], - }, - characterSort: { - onlyOL: { - onlyOL_yijiang1: ["ol_jianyong", "ol_lingtong", "ol_gaoshun"], - onlyOL_yijiang2: ["ol_caozhang", "ol_chengpu", "ol_wangyi"], - onlyOL_yijiang3: ["ol_yufan"], - onlyOL_sb: ["ol_sb_jiangwei", "ol_sb_guanyu", "ol_sb_taishici", "ol_sb_yuanshao"], - }, - }, - characterIntro: {}, - characterReplace: {}, - characterSubstitute: { - ol_sb_yuanshao: [], - }, - card: { - sizhaojian: { - derivation: "ol_sb_yuanshao", - cardcolor: "diamond", - fullskin: true, - type: "equip", - subtype: "equip1", - get destroy() { - return !lib.card.sizhaojian.inShanShanFestival(); - }, - inShanShanFestival() { - //闪闪节外离开装备区会销毁 - const date = new Date(); - return date.getMonth() + 1 == 3 && date.getDate() >= 2 && date.getDate() <= 15; - }, - distance: { attackFrom: -1 }, - ai: { basic: { equipValue: 7 } }, - skills: ["olsbyufeng_sizhaojian"], - }, - }, - skill: { - //王异 - olzhenlie: { - audio: 2, - inherit: "zhenlie", - async content(event, trigger, player) { - const target = trigger.player; - if (get.attitude(player, target) < 0 && target.countDiscardableCards(player, "he")) - player.addTempSkill("zhenlie_lose"); - await player.loseHp(); - player.removeSkill("zhenlie_lose"); - trigger.getParent().excluded.add(player); - if (!player.isIn()) return; - const goon = target.hasCard((card) => { - if (get.position(card) == "h") return true; - return lib.filter.canBeGained(card, player, target); - }, "he"); - if (goon || player.isDamaged()) { - let result; - if (goon && player.isDamaged()) - result = await player - .chooseControl() - .set("choiceList", [ - "获得" + get.translation(target) + "的一张牌", - "发动一次〖秘计〗", - ]) - .set("ai", () => { - const player = get.event("player"), - target = get.event().getTrigger().player; - return get.effect(target, { name: "shunshou_copy2" }, player, player) > - get.effect(player, { name: "draw" }, player, player) * - player.getDamagedHp() - ? 0 - : 1; - }) - .forResult(); - else result = { index: goon ? 0 : 1 }; - if (result.index == 0) { - await player.gainPlayerCard(target, "he", true); - } else { - await player.useSkill("olmiji"); - } - } - }, - }, - olmiji: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return player.isDamaged(); - }, - async content(event, trigger, player) { - let num = player.getDamagedHp(); - await player.draw(num); - if (player.countCards("he") && game.hasPlayer((target) => target != player)) { - if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); - let given_map = []; - while ( - num > 0 && - player.hasCard((card) => !card.hasGaintag("olsujian_given"), "he") - ) { - const { - result: { bool, cards, targets }, - } = await player.chooseCardTarget({ - filterCard(card, player) { - return !card.hasGaintag("olsujian_given"); - }, - selectCard: [1, num], - position: "he", - filterTarget: lib.filter.notMe, - prompt: "秘计:请选择要分配的卡牌和目标", - prompt2: "(还可分配" + num + "张)", - ai1(card) { - return !ui.selected.cards.length && card.name == "du" ? 1 : 0; - }, - ai2(target) { - const player = get.event("player"); - const card = ui.selected.cards[0]; - if (card) return get.value(card, target) * get.attitude(player, target); - return 0; - }, - }); - if (bool) { - num -= cards.length; - const target = targets[0]; - if (given_map.some((i) => i[0] == target)) { - given_map[ - given_map.indexOf(given_map.find((i) => i[0] == target)) - ][1].addArray(cards); - } else given_map.push([target, cards]); - player.addGaintag(cards, "olsujian_given"); - } else break; - } - if (_status.connectMode) { - game.broadcastAll(() => { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - if (given_map.length) { - await game - .loseAsync({ - gain_list: given_map, - player: player, - cards: given_map.slice().map((list) => list[1]), - giver: player, - animate: "giveAuto", - }) - .setContent("gaincardMultiple"); - } - } - }, - }, - //程普 - dclihuo: { - audio: "relihuo", - trigger: { player: "useCard1" }, - filter(event, player) { - return event.card.name == "sha" && !game.hasNature(event.card, "fire"); - }, - check(event, player) { - let card = new lib.element.VCard(get.copy(event.card)); - game.setNature(card, "fire"); - const eff1 = event.targets.reduce((sum, target) => { - return sum + get.effect(target, event.card, player, player); - }, 0); - let targets = event.targets.slice(); - if (get.info("lihuo2").filter(event, player)) { - let targetx = game.filterPlayer((target) => { - return ( - !targets.includes(target) && - player.canUse(card, target) && - get.effect(target, card, player, player) > 0 - ); - }); - if (targetx.length) - targets.add( - targetx.sort((a, b) => { - return ( - get.effect(b, card, player, player) - - get.effect(a, card, player, player) - ); - })[0] - ); - } - const eff2 = targets.reduce((sum, target) => { - return sum + get.effect(target, card, player, player); - }, 0); - return eff2 > eff1; - }, - content() { - game.log(player, "将", trigger.card, "改为了火属性"); - game.setNature(trigger.card, "fire"); - player - .when("useCardAfter") - .filter((evt) => evt == trigger) - .then(() => { - if ( - game.hasPlayer2((target) => { - return target.getHistory( - "damage", - (evt) => evt.card && evt.card == trigger.card - ).length; - }) - ) { - player - .chooseToDiscard("he", "疠火:弃置一张牌,或失去1点体力") - .set("ai", (card) => { - const player = get.event("player"); - if ( - (get.name(card) == "tao" || get.name(card) == "jiu") && - lib.filter.cardSavable(card, player, player) - ) - return -1; - if (player.hp <= 1) { - if ( - cards.length < player.getEnemies().length && - player.hasCard((cardx) => { - return ( - (get.name(cardx) == "tao" || - get.name(cardx) == "jiu") && - lib.filter.cardSavable(cardx, player, player) - ); - }, "hs") - ) - return 7 - get.value(card); - return -1; - } - return ( - 24 - - 5 * cards.length - - 2 * Math.min(4, player.getHp()) - - get.value(card) - ); - }); - } else event.finish(); - }) - .then(() => { - if (!result.bool) player.loseHp(); - }); - }, - ai: { fireAttack: true }, - group: "dclihuo_add", - subSkill: { - add: { - inherit: "lihuo2", - async content(event, trigger, player) { - const { - result: { bool, targets }, - } = await player - .chooseTarget( - get.prompt("dclihuo"), - "为" + get.translation(trigger.card) + "增加一个目标", - (card, player, target) => { - const trigger = get.event().getTrigger(); - return ( - !trigger.targets.includes(target) && - player.canUse(trigger.card, target) - ); - } - ) - .set("card", trigger.card) - .set("ai", (target) => { - const player = get.event("player"), - trigger = get.event().getTrigger(); - return get.effect(target, trigger.card, player, player); - }); - if (bool) { - player.logSkill("dclihuo", targets); - trigger.targets.addArray(targets); - } - }, - }, - }, - }, - olchunlao: { - audio: "chunlao", - audioname: ["xin_chengpu"], - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - filter(event, player) { - if (event.type != "discard" || event.getlx === false) return false; - const evt = event.getl(player); - return ( - evt && evt.cards2 && evt.cards2.some((i) => i.name == "sha" && get.position(i) == "d") - ); - }, - forced: true, - locked: false, - content() { - const evt = trigger.getl(player); - player - .addToExpansion( - evt.cards2.filter((i) => i.name == "sha" && get.position(i) == "d"), - "gain2" - ) - .gaintag.add("olchunlao"); - }, - ai: { - effect: { - player(card, player, target) { - if (_status.currentPhase != player) return; - if ( - card.name == "sha" && - !player.getExpansions("olchunlao").length && - target.hp > 1 - ) { - return "zeroplayertarget"; - } - }, - }, - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: "olchunlao_save", - subSkill: { - save: { - inherit: "chunlao2", - filter(event, player) { - return ( - event.type == "dying" && - event.dying && - event.dying.hp <= 0 && - player.getExpansions("olchunlao").length - ); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - const { - result: { bool, links }, - } = await player.chooseCardButton( - get.translation("olchunlao"), - player.getExpansions("olchunlao"), - true - ); - if (bool) { - player.logSkill("olchunlao", target); - await player.loseToDiscardpile(links); - event.type = "dying"; - await target.useCard({ name: "jiu", isCard: true }, target); - } - }, - ai: { - save: true, - skillTagFilter(player) { - return player.getExpansions("olchunlao").length; - }, - order: 6, - result: { target: 1 }, - }, - }, - }, - }, - //虞翻 - olzongxuan: { - audio: "rezongxuan", - trigger: { global: ["loseAfter", "loseAsyncAfter"] }, - filter(event, player) { - if (event.type != "discard" || event.getlx === false) return false; - return get.info("olzongxuan").getCards(event, player).length; - }, - check(event, player) { - if (event.getParent(3).name != "phaseDiscard") return false; - const cards = get.info("olzongxuan").getCards(event, player); - return game.hasPlayer((target) => { - if ( - cards.some((i) => get.type(i, target) == "equip") && - (get.attitude(player, target) > 0 || - get.recoverEffect(target, player, player) > 0) - ) - return true; - if ( - cards.some((i) => get.type(i, target) != "equip") && - target.getHp() >= player.getHp() && - get.effect(target, { name: "losehp" }, player, player) > 0 - ) - return true; - return false; - }); - }, - async content(event, trigger, player) { - const { - result: { bool, moved }, - } = await player - .chooseToMove("纵玄:将任意张牌置于牌堆顶", true) - .set("list", [ - ["本次弃置的牌", get.info("olzongxuan").getCards(trigger, player)], - ["牌堆顶"], - ]) - .set("filterOk", (moved) => moved[1].length) - .set("processAI", (list) => { - const player = get.event("player"); - const cards = list[0][1].slice(), - cards2 = cards.filter((card) => { - return game.hasPlayer((target) => { - if ( - get.type(card, target) == "equip" && - (get.attitude(player, target) > 0 || - get.recoverEffect(target, player, player) > 0) - ) - return true; - if ( - get.type(card, target) != "equip" && - target.getHp() >= player.getHp() && - get.effect(target, { name: "losehp" }, player, player) > 0 - ) - return true; - return false; - }); - }), - cards3 = cards2.length ? cards2.randomGet() : cards.randomGet(); - return [[], [cards3]]; - }); - if (bool) { - let cards = moved[1].slice(); - game.log(player, "将", cards, "置于了牌堆顶"); - while (cards.length) { - ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); - } - } - }, - getCards(event, player) { - let cards = []; - for (const target of [player, player.getPrevious()]) { - const evt = event.getl(target); - if (evt && evt.cards2 && evt.cards2.some((i) => get.position(i) == "d")) - cards.addArray(evt.cards2.filter((i) => get.position(i) == "d")); - } - return cards; - }, - }, - olzhiyan: { - audio: "zhiyan", - audioname: ["re_yufan"], - trigger: { global: "phaseJieshuBegin" }, - filter(event, player) { - return event.player == player || event.player == player.getPrevious(); - }, - direct: true, - async content(event, trigger, player) { - const { - result: { bool, targets }, - } = await player - .chooseTarget(get.prompt2("olzhiyan")) - .set("ai", (target) => { - const player = get.event("player"), - cards = get.event("cards"); - if (!cards.length) return 0; - const card = cards[0], - att = get.attitude(player, target); - if ( - get.type(card, target) == "equip" && - (get.attitude(player, target) > 0 || - get.recoverEffect(target, player, player) > 0) - ) - return get.recoverEffect(target, player, player) * 20 + att / 114514; - if (get.type(card, target) != "equip") { - if (target.getHp() >= player.getHp()) - return ( - get.effect(target, { name: "losehp" }, player, player) * 20 - - att / 114514 - ); - return get.effect(target, { name: "draw" }, player, player); - } - return 0; - }) - .set("cards", Array.from(ui.cardPile.childNodes || []) || []); - if (bool) { - const target = targets[0]; - player.logSkill("olzhiyan", target); - const { result } = await target.draw("visible"); - if (result) { - const card = result[0]; - if (get.type(card, target) == "equip") { - if (target.getCards("h").includes(card) && target.hasUseTarget(card)) { - const { - result: { bool }, - } = await target.chooseUseTarget(card, true, "nopopup"); - if (bool) await target.recover(); - } - } else if (target.getHp() >= player.getHp()) await target.loseHp(); - } - } - }, - ai: { expose: 0.2 }, - }, - //OL谋袁绍 - //真·四世三公——袁神,启动 - olsbhetao: { - audio: 3, - audioname: ["ol_sb_yuanshao_shadow"], - trigger: { global: "useCardToPlayered" }, - filter(event, player) { - return ( - event.player != player && - event.isFirstTarget && - event.targets.length > 1 && - player.countCards("he", (card) => { - if (get.position(card) == "h" && _status.connectMode) return true; - return ( - get.color(card) == get.color(event.card) && - lib.filter.cardDiscardable(card, player) - ); - }) - ); - }, - direct: true, - async content(event, trigger, player) { - const { - result: { bool, cards, targets }, - } = await player - .chooseCardTarget({ - prompt: get.prompt("olsbhetao"), - filterCard(card, player) { - return ( - get.color(card) == get.color(get.event().getTrigger().card) && - lib.filter.cardDiscardable(card, player) - ); - }, - position: "he", - filterTarget(card, player, target) { - return get.event().getTrigger().targets.includes(target); - }, - ai1(card) { - return 7.5 - get.value(card); - }, - ai2(target) { - const player = get.event("player"), - trigger = get.event().getTrigger(); - const att = get.attitude(player, target), - eff = get.effect(target, trigger.card, trigger.player, player); - if (trigger.card.name == "tiesuo") - return eff > 0 ? 0 : get.sgn(att) * (2 + get.sgn(att)); - const sum = trigger.targets.reduce( - (i, j) => i + get.effect(j, trigger.card, trigger.player, player), - 0 - ); - return get.sgn(att) * (eff * 2 - sum); - }, - }) - .set( - "prompt2", - "弃置一张" + - get.translation(get.color(trigger.card)) + - "牌,令" + - get.translation(trigger.card) + - "改为对其中一个目标结算两次" - ); - if (bool) { - const target = targets[0]; - player.logSkill("olsbhetao", target); - player.changeSkin("olsbhetao", "ol_sb_yuanshao"); - player.discard(cards); - trigger.getParent().effectCount++; - trigger - .getParent() - .excluded.addArray( - game.filterPlayer((i) => trigger.targets.includes(i) && target != i) - ); - } - }, - ai: { threaten: 3.5 }, - global: "olsbhetao_ai", - subSkill: { - ai: { - effect: { - player(card, player) { - if ( - !game.hasPlayer((target) => { - return ( - target.hasSkill("olsbhetao") && - (get.attitude(player, target) < 0 || - get.attitude(target, player) < 0) - ); - }) || - game.countPlayer((target) => { - return player.canUse(card, target); - }) < 2 - ) - return; - const select = get.copy(get.info(card).selectTarget); - let range; - if (select == undefined) range = [1, 1]; - else if (typeof select == "number") range = [select, select]; - else if (get.itemtype(select) == "select") range = select; - else if (typeof select == "function") range = select(card, player); - game.checkMod(card, player, range, "selectTarget", player); - if ( - range[1] == -1 || - (range[1] > 1 && ui.selected.targets && ui.selected.targets.length) - ) - return "zeroplayertarget"; - }, - }, - }, - }, - }, - olsbshenli: { - audio: 3, - audioname: ["ol_sb_yuanshao_shadow"], - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - if (!player.isPhaseUsing() || player.hasSkill("olsbshenli_used")) return false; - return ( - event.card.name == "sha" && - game.hasPlayer((target) => { - return ( - !event.targets.includes(target) && player.canUse(event.card, target, false) - ); - }) && - event.isFirstTarget - ); - }, - check(event, player) { - const targets = game.filterPlayer((target) => player.canUse(event.card, target, false)); - const num1 = event.targets.reduce( - (sum, target) => sum + get.effect(target, event.card, player, player), - 0 - ); - const num2 = targets.reduce( - (sum, target) => sum + get.effect(target, event.card, player, player), - 0 - ); - if (num2 >= num1) return true; - let num = event.baseDamage || 1; - if (event.extraDamage) num += event.extraDamage; - let extra_num = 0; - for (const target of targets) { - if ( - target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) && - !player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: event.card, - }, - true - ) - ) { - if (player.hasSkill("jueqing") || target.hasSkill("gangzhi")) extra_num--; - else if ( - target.hasSkillTag("filterDamage", null, { - player: event.player, - card: event.card, - }) - ) - extra_num++; - } else extra_num += num; - } - const sum = targets.length + extra_num; - return ( - num2 + - (sum > player.countCards("h") ? Math.min(5, sum) : 0) + - (sum > player.getHp() ? num2 : 0) >= - num1 - ); - }, - async content(event, trigger, player) { - player.changeSkin("olsbshenli", "ol_sb_yuanshao_shadow"); - player.addTempSkill("olsbshenli_used", "phaseUseAfter"); - trigger.getParent().targets.addArray( - game.filterPlayer((target) => { - return ( - !trigger.targets.includes(target) && - player.canUse(trigger.card, target, false) - ); - }) - ); - player - .when("useCardAfter") - .filter((evt) => evt == trigger.getParent()) - .then(() => { - const sum = player - .getHistory("sourceDamage", (evt) => evt.card && evt.card == trigger.card) - .reduce((num, evt) => { - return num + evt.num; - }, 0); - const bool = sum > player.countCards("h"), - goon = sum > player.getHp(); - if (bool) player.draw(Math.min(5, sum)); - if (goon) { - const targets = game.filterPlayer( - (target) => - trigger.targets.includes(target) && - player.canUse(trigger.card, target, false) - ); - if ( - targets.length && - (!trigger.cards || - !trigger.cards.length || - trigger.cards.every((card) => { - return !get.owner(card); - })) - ) - player.useCard(trigger.card, targets, false); - } - }); - }, - ai: { threaten: 3.5 }, - subSkill: { used: { charlotte: true } }, - }, - olsbyufeng: { - audio: 2, - audioname2: { - ol_sb_yuanshao_shadow: "olsbyufeng_ol_sb_yuanshao_shadow", - }, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter(event, player) { - const card = - get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); - return (event.name != "phase" || game.phaseNumber == 0) && player.canEquip(card, true); - }, - forced: true, - locked: false, - async content(event, trigger, player) { - if (lib.card.sizhaojian.inShanShanFestival()) { - game.broadcastAll(() => lib.inpile.add("sizhaojian")); - } - const card = - get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); - if (get.owner(card)) get.owner(card).$give(card, player, false); - else { - player.$gain2(card, false); - game.delayx(); - } - player.equip(card); - }, - subSkill: { - ol_sb_yuanshao_shadow: { - audio: 1, - }, - sizhaojian: { - equipSkill: true, - mod: { - aiOrder(player, card, num) { - if (card.name == "sha" && typeof get.number(card) == "number") - return num + get.number(card) / 114514; - }, - }, - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - return event.card.name == "sha" && typeof get.number(event.card) == "number"; - }, - forced: true, - locked: false, - logTarget: "target", - async content(event, trigger, player) { - const target = trigger.target; - target.addTempSkill("olsbyufeng_block"); - target.markAuto("olsbyufeng_block", [trigger.card]); - }, - }, - block: { - mod: { - cardEnabled(card, player) { - if (!player.storage.olsbyufeng_block) return; - const storage = player.getStorage("olsbyufeng_block"); - let evt = _status.event; - if (evt.name != "chooseToUse") evt = evt.getParent("chooseToUse"); - if (!evt || !evt.respondTo || !storage.includes(evt.respondTo[1])) return; - const num = get.number(card); - if ( - num != "unsure" && - typeof num == "number" && - num < get.number(evt.respondTo[1]) - ) - return false; - }, - }, - onremove(player) { - delete player.storage.olsbyufeng_block; - }, - charlotte: true, - trigger: { - player: ["damageBefore", "damageCancelled", "damageZero"], - target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], - global: ["useCardEnd"], - }, - filter(event, player) { - if (!event.card || !player.storage.olsbyufeng_block) return false; - return player.getStorage("olsbyufeng_block").includes(event.card); - }, - forced: true, - popup: false, - firstDo: true, - content() { - player.unmarkAuto("olsbyufeng_block", [trigger.card]); - if (!player.getStorage("olsbyufeng_block").length) - player.removeSkill("olsbyufeng_block"); - }, - }, - }, - }, - olsbshishou: { - unique: true, - audio: 3, - audioname: ["ol_sb_yuanshao_shadow"], - trigger: { - global: [ - "loseAfter", - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter(event, player) { - if (player.getEquip(1)) return false; - const card = - get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); - if (!player.canEquip(card, true)) return false; - return game.hasPlayer((target) => { - if (target == player || target.group != "qun") return false; - const evt = event.getl(target); - return evt && evt.player == target && evt.es && evt.es.length > 0; - }); - }, - direct: true, - zhuSkill: true, - async content(event, trigger, player) { - const targets = game - .filterPlayer((target) => { - if (target == player || target.group != "qun") return false; - const evt = trigger.getl(target); - return evt && evt.player == target && evt.es && evt.es.length > 0; - }) - .sortBySeat(); - const card = - get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); - for (const target of targets) { - const { - result: { bool }, - } = await target - .chooseBool( - get.prompt("olsbshishou", player), - "将" + get.translation(card) + "置入" + get.translation(player) + "的装备区中" - ) - .set("choice", get.attitude(target, player) > 0); - if (bool) { - target.logSkill("olsbshishou", player); - if (get.owner(card)) get.owner(card).$give(card, player, false); - else { - player.$gain2(card, false); - game.delayx(); - } - player.equip(card); - break; - } - } - }, - ai: { combo: "olsbyufeng" }, - }, - //界高顺 - olxianzhen: { - audio: "rexianzhen", - inherit: "xianzhen", - async content(event, trigger, player) { - const target = event.target; - const { - result: { bool }, - } = await player.chooseToCompare(target); - if (bool) { - player.storage.xinxianzhen = target; - player.addTempSkill("xinxianzhen2"); - } else { - player.markAuto("olxianzhen_buff", [target]); - player.addTempSkill("olxianzhen_buff"); - } - }, - subSkill: { - buff: { - charlotte: true, - onremove: true, - mod: { - playerEnabled(card, player, target) { - if ( - get.name(card, player) == "sha" && - player.getStorage("olxianzhen_buff").includes(target) - ) - return false; - }, - ignoredHandcard(card, player) { - if (get.name(card, player) == "sha") return true; - }, - cardDiscardable(card, player, name) { - if (name == "phaseDiscard" && get.name(card, player) == "sha") return false; - }, - }, - }, - }, - }, - //新OL谋关羽 - olsbweilin: { - audio: 2, - enable: "chooseToUse", - filter(event, player) { - return get - .inpileVCardList((info) => { - const name = info[2]; - if (name != "sha" && name != "jiu") return false; - return get.type(name) == "basic"; - }) - .some((card) => - player.hasCard( - (cardx) => - event.filterCard( - { name: card[2], nature: card[3], cards: [cardx] }, - player, - event - ), - "hes" - ) - ); - }, - usable: 1, - chooseButton: { - dialog(event, player) { - const list = get - .inpileVCardList((info) => { - const name = info[2]; - if (name != "sha" && name != "jiu") return false; - return get.type(name) == "basic"; - }) - .filter((card) => - player.hasCard( - (cardx) => - event.filterCard( - { name: card[2], nature: card[3], cards: [cardx] }, - player, - event - ), - "hes" - ) - ); - return ui.create.dialog("威临", [list, "vcard"]); - }, - filter(button, player) { - return _status.event - .getParent() - .filterCard( - { name: button.link[2], nature: button.link[3] }, - player, - _status.event.getParent() - ); - }, - check(button) { - if (_status.event.getParent().type != "phase") return 1; - const player = get.event("player"), - value = player.getUseValue({ name: button.link[2], nature: button.link[3] }); - if ( - button.link[2] == "sha" && - !player.getHistory("useCard", (evt) => get.type(evt.card) == "basic").length - ) { - if (value > 0) return value + 20; - } - return value; - }, - backup(links, player) { - return { - audio: "olsbweilin", - filterCard: true, - popname: true, - check(card) { - const name = lib.skill.olsbweilin_backup.viewAs.name, - color = get.color(card); - const phase = _status.event.getParent().type == "phase"; - if (phase && name == "sha" && color == "red") return 10 - get.value(card); - if (name == "tao") - return ( - 7 + - [-2, 0, 2][["black", "red", "none"].indexOf(color)] - - get.value(card) - ); - return 6 - get.value(card); - }, - position: "hse", - viewAs: { name: links[0][2], nature: links[0][3] }, - precontent() { - if (!player.storage.olsbweilin_backup) { - player.storage.olsbweilin_backup = true; - player - .when("useCardToTargeted") - .filter( - (evt) => - evt.getParent().skill == "olsbweilin_backup" && - evt.getParent().triggeredTargets3.length == evt.targets.length - ) - .then(() => { - delete player.storage.olsbweilin_backup; - const targets = trigger.targets.slice().sortBySeat(); - player.line(targets); - for (const target of targets) { - target.addTempSkill("olsbweilin_wusheng"); - target.markAuto("olsbweilin_wusheng", [ - get.color(trigger.card), - ]); - } - }); - } - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if (get.event("skill") != "olsbweilin_backup") return false; - return ( - arg && - arg.card && - arg.card.name == "sha" && - get.color(arg.card) == "red" - ); - }, - }, - }; - }, - prompt(links, player) { - return ( - "将一张牌当作" + - (get.translation(links[0][3]) || "") + - "【" + - get.translation(links[0][2]) + - "】使用" - ); - }, - }, - hiddenCard(player, name) { - if (!lib.inpile.includes(name) || name != "jiu") return false; - return ( - get.type(name) == "basic" && - !player.getStat("skill").olsbweilin && - player.countCards("hes") - ); - }, - ai: { - fireAttack: true, - respondSha: true, - skillTagFilter(player, tag, arg) { - if (arg == "respond") return false; - if (player.getStat("skill").olsbweilin || !player.countCards("hes")) return false; - }, - order(item, player) { - if ( - player && - _status.event.type == "phase" && - player.hasValueTarget({ name: "sha" }, true, true) - ) { - let max = 0, - names = get.inpileVCardList((info) => { - const name = info[2]; - if (name != "sha" && name != "jiu") return false; - return get.type(name) == "basic"; - }); - names = names.map((namex) => { - return { name: namex[2], nature: namex[3] }; - }); - names.forEach((card) => { - if (player.getUseValue(card) > 0) { - let temp = get.order(card); - if (card.name == "jiu") { - let cards = player.getCards("hs", (cardx) => get.value(cardx) < 8); - cards.sort((a, b) => get.value(a) - get.value(b)); - if ( - !cards.some( - (cardx) => - get.name(cardx) == "sha" && - !cards.slice(0, 2).includes(cardx) - ) - ) - temp = 0; - } - if (temp > max) max = temp; - } - }); - if (max > 0) max += 15; - return max; - } - return 0.5; - }, - result: { - player(player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - backup: {}, - wusheng: { - charlotte: true, - onremove: true, - mod: { - cardname(card, player) { - if (player.getStorage("olsbweilin_wusheng").includes(get.color(card))) - return "sha"; - }, - }, - intro: { content: "手牌中所有$牌均视为【杀】" }, - }, - }, - }, - olsbduoshou: { - init(player) { - if (player.getHistory("useCard", (evt) => get.color(evt.card) == "red").length) - player.addTempSkill("olsbduoshou_used"); - }, - mod: { - targetInRange(card, player, target) { - if (get.color(card) == "red" && !player.hasSkill("olsbduoshou_used")) return true; - }, - }, - audio: 2, - trigger: { - player: "useCard", - source: "damageSource", - }, - filter(event, player) { - if (event.name == "damage") return player.getHistory("sourceDamage").indexOf(event) == 0; - if (get.color(event.card) == "red" && !player.hasSkill("olsbduoshou_used")) return true; - return ( - get.type(event.card) == "basic" && - player.getHistory("useCard", (evt) => get.type(evt.card) == "basic").indexOf(event) == - 0 - ); - }, - forced: true, - async content(event, trigger, player) { - if (trigger.name == "damage") player.draw(); - else { - if (get.color(trigger.card) == "red" && !player.hasSkill("olsbduoshou_used")) { - game.log(trigger.card, "无距离限制"); - player.addTempSkill("olsbduoshou_used"); - } - if ( - get.type(trigger.card) == "basic" && - player - .getHistory("useCard", (evt) => get.type(evt.card) == "basic") - .indexOf(trigger) == 0 - ) { - game.log(trigger.card, "不计入次数上限"); - if (trigger.addCount !== false) { - trigger.addCount = false; - const stat = player.stat[player.stat.length - 1].card; - if (typeof stat[trigger.card.name] === "number") stat[trigger.card.name]--; - } - } - } - }, - subSkill: { used: { charlotte: true } }, - }, - //OL谋太史慈 - olsbdulie: { - audio: 2, - trigger: { target: "useCardToTarget" }, - filter(event, player) { - if (event.player == player || !event.isFirstTarget || event.targets.length != 1) - return false; - if (player.getAttackRange() <= 0) return; - return ["basic", "trick"].includes(get.type(event.card)); - }, - prompt2(event, player) { - return ( - "令" + - get.translation(event.card) + - "额外结算一次,此牌结算完毕后,你摸等同于你攻击范围的牌" - ); - }, - check(event, player) { - const num = Math.min(5, player.getAttackRange()); - if (get.effect(player, event.card, event.player, player) > 0) return true; - if ( - event.card.name == "guohe" || - event.card.name == "shunshou" || - event.card.name == "zhujinqiyuan" - ) - return num > (event.effectCount || 0); - if (!get.tag(event.card, "damage")) return true; - return num > 1; - }, - usable: 1, - async content(event, trigger, player) { - trigger.getParent().effectCount++; - player - .when({ global: "useCardAfter" }) - .filter((evt) => evt == trigger.getParent()) - .then(() => { - const num = Math.min(5, player.getAttackRange()); - if (num > 0) player.draw(num); - }); - }, - }, - olsbdouchan: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - async content(event, trigger, player) { - const card = get.cardPile2((card) => card.name == "juedou"); - if (card) player.gain(card, "gain2"); - else if (player.countMark("olsbdouchan") < game.players.length + game.dead.length) - player.addMark("olsbdouchan", 1, false); - }, - mod: { - attackRange(player, num) { - return num + player.countMark("olsbdouchan"); - }, - cardUsable(card, player, num) { - if (card.name == "sha") return num + player.countMark("olsbdouchan"); - }, - }, - intro: { content: "
  • 攻击距离+#
  • 使用【杀】的次数上限+#" }, - }, - //OL谋关羽 - //可以和手杀谋关羽组成卧龙凤雏了 - olsbfumeng: { - audio: 2, - trigger: { global: "roundStart" }, - filter(event, player) { - return player.countCards("h", (card) => { - if (_status.connectMode) return true; - return get.name(card, player) != "sha"; - }); - }, - direct: true, - async content(event, trigger, player) { - const { - result: { bool, cards }, - } = await player - .chooseCard(get.prompt2("olsbfumeng"), [1, Infinity], (card, player) => { - return get.name(card, player) != "sha"; - }) - .set("ai", (card) => { - const player = get.event("player"); - if (player.hasSkill("olsbfumeng")) return 7 - get.value(card); - return 4.5 - get.value(card); - }); - if (!bool) return; - player.logSkill("olsbfumeng"); - player.addSkill("olsbfumeng_buff"); - player.addGaintag(cards, "olsbfumeng_buff"); - }, - subSkill: { - buff: { - charlotte: true, - mod: { - cardname: function (card) { - if (get.itemtype(card) == "card" && card.hasGaintag("olsbfumeng_buff")) - return "sha"; - }, - }, - }, - }, - }, - olsbguidao: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - if (event.olsbguidao_num > 2) return false; - const card = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); - return ( - game.hasPlayer((target) => { - return player.canUse(card, target, false); - }) && - player.countCards("he", (cardx) => { - return player.canRecast(cardx); - }) >= 2 && - player.countCards("he", (cardx) => { - return get.name(cardx, player) == "sha" && player.canRecast(cardx); - }) >= event.olsbguidao_num - ); - }, - onChooseToUse(event) { - if (!game.online && !event.olsbguidao_num) { - const player = event.player, - history = player.getHistory("custom", (evt) => evt.olsbguidao_num); - if (!history.length) event.set("olsbguidao_num", 1); - else { - const evt = history[history.length - 1]; - event.set("olsbguidao_num", evt.olsbguidao_num); - } - } - }, - filterCard(card, player) { - const num = get.event("olsbguidao_num"); - if ( - ui.selected.cards.filter((cardx) => get.name(cardx, player) == "sha").length < num && - get.name(card, player) != "sha" - ) - return false; - return player.canRecast(card); - }, - selectCard: 2, - position: "he", - check(card) { - const player = get.event("player"); - if (get.name(card, player) == "sha") return 1 / (get.value(card) || 0.5); - return 7 - get.value(card); - }, - complexCard: true, - lose: false, - discard: false, - delay: 0, - filterTarget(card, player, target) { - const cardx = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); - return player.canUse(cardx, target, false); - }, - prompt() { - let str = "重铸两张牌"; - const num = get.event("olsbguidao_num"); - if (num > 0) str += "(至少重铸" + get.cnNumber(num) + "张【杀】)"; - str += "并视为使用【决斗】"; - return str; - }, - async content(event, trigger, player) { - const target = event.target, - cards = event.cards; - player.getHistory("custom").push({ - olsbguidao_num: cards.filter((card) => get.name(card, player) == "sha").length + 1, - }); - const card = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); - await player.recast(cards); - player.addTempSkill("olsbguidao_buff"); - if (player.canUse(card, target, false)) player.useCard(card, target, false); - }, - ai: { - order(item, player) { - const card = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); - const order = get.order(card, player); - if (order <= 0) return 0; - return order + 0.1; - }, - result: { - target(player, target) { - const card = new lib.element.VCard({ - name: "juedou", - storage: { olsbguidao: true }, - }); - return ( - get.sgn(get.attitude(player, target)) * - get.effect(target, card, player, player) - ); - }, - }, - }, - subSkill: { - buff: { - charlotte: true, - trigger: { global: "damageBegin3" }, - filter(event, player) { - if (!event.card || !event.card.storage || !event.card.storage.olsbguidao) - return false; - if (!event.source || event.source != player) return false; - const evt = event.getParent("useCard"); - return evt.player == player && evt.targets.includes(event.player); - }, - forced: true, - popup: false, - async content(event, trigger, player) { - const target = trigger.player; - const { - result: { control }, - } = await target - .chooseControl("【杀】更多", "非【杀】更多") - .set( - "prompt", - "归刀:请猜测" + - get.translation(player) + - "手牌中【杀】与非【杀】牌数哪个更多" - ) - .set( - "prompt2", - "若猜错,则" + get.translation(trigger.card) + "对你造成的伤害+1" - ) - .set("ai", () => _status.event.controls.randomGet()); - const goon1 = - player.countCards("h", (card) => get.name(card, player) == "sha") >= - player.countCards("h", (card) => get.name(card, player) != "sha"); - const goon2 = - player.countCards("h", (card) => get.name(card, player) != "sha") >= - player.countCards("h", (card) => get.name(card, player) == "sha"); - if ((goon1 && control == "【杀】更多") || (goon2 && control == "非【杀】更多")) { - target.popup("洗具"); - game.log(target, "猜测", "#g正确"); - } else { - target.popup("杯具"); - game.log(target, "猜测", "#y错误"); - trigger.increase("num"); - } - }, - }, - }, - }, - //OL谋姜维 - olsbzhuri: { - audio: 2, - trigger: { - player: [ - "phaseZhunbeiEnd", - "phaseJudgeEnd", - "phaseDrawEnd", - "phaseUseEnd", - "phaseDiscardEnd", - "phaseJieshuEnd", - ], - }, - filter: function (event, player) { - if (player.hasSkill("olsbzhuri_block")) return false; - if (!game.hasPlayer((target) => player.canCompare(target))) return false; - return ( - player.getHistory("gain", (evt) => evt.getParent(event.name) == event).length + - player.getHistory( - "lose", - (evt) => evt.getParent(event.name) == event && evt.hs.length - ).length - ); - }, - direct: true, - content: function* (event, map) { - var player = map.player; - var trigger = map.trigger; - var result = yield player - .chooseTarget( - get.prompt("olsbzhuri"), - "与一名角色进行拼点,若你赢,你可以使用其中的一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合失效", - (card, player, target) => { - return player.canCompare(target); - } - ) - .set("ai", (target) => { - var player = _status.event.player; - var ts = target.getCards("h").sort((a, b) => get.number(a) - get.number(b)); - if (get.attitude(player, target) < 0) { - var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); - var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); - if (get.number(hs[0]) > get.number(ts[0])) return 1; - if (get.effect(player, { name: "losehp" }, player, player) > 0) - return Math.random() + 0.2; - if (player.getHp() > 2) return Math.random() - 0.5; - return 0; - } - return 0; - }); - if (result.bool) { - var target = result.targets[0]; - player.logSkill("olsbzhuri", target); - var result2 = yield player.chooseToCompare(target); - if (result2.bool) { - var cards = [result2.player, result2.target].filterInD("d"); - cards = cards.filter((card) => player.hasUseTarget(card)); - if (cards.length) { - var result3 = yield player - .chooseButton(["是否使用其中的牌?", cards]) - .set("ai", (button) => _status.event.player.getUseValue(button.link)); - if (result3.bool) { - var card = result3.links[0]; - player.$gain2(card, false); - game.delayx(); - player.chooseUseTarget(true, card, false); - } - } - } else { - var list = lib.skill.olsbranji.getList(trigger); - var result3 = yield player - .chooseControl("失去体力", "技能失效") - .set("prompt", "逐日:失去1点体力,或令此技能于本回合失效") - .set("ai", () => { - var player = _status.event.player; - if (player.getHp() > 2) { - var list = _status.event.list; - list.removeArray(player.skipList); - if (list.includes("phaseDraw") || list.includes("phaseUse")) - return "失去体力"; - } - if (get.effect(player, { name: "losehp" }, player, player) > 0) - return "失去体力"; - return "技能失效"; - }) - .set("list", list.slice(trigger.getParent().num, list.length)); - player[result3.control == "失去体力" ? "loseHp" : "addTempSkill"]( - result3.control == "失去体力" ? 1 : "olsbzhuri_block" - ); - } - } - }, - subSkill: { - block: { - charlotte: true, - mark: true, - marktext: '', - intro: { content: "追不动太阳了" }, - }, - }, - }, - olsbranji: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - prompt2: function (event, player) { - var str = "获得技能"; - var num = lib.skill.olsbranji.getNum(player); - if (num >= player.getHp()) str += "【困奋】"; - if (num == player.getHp()) str += "和"; - if (num <= player.getHp()) str += "【诈降】"; - str += ",然后"; - var num1 = player.countCards("h") - player.getHandcardLimit(); - if (num1 || player.isDamaged()) { - if (num1) - str += - num1 < 0 - ? "摸" + get.cnNumber(-num1) + "张牌" - : "弃置" + get.cnNumber(num1) + "张牌"; - if (num1 && player.isDamaged()) str += "或"; - if (player.isDamaged()) str += "回复" + player.getDamagedHp() + "点体力"; - str += ",最后"; - } - str += "你不能回复体力直到你杀死角色。"; - return str; - }, - check: function (event, player) { - var num = lib.skill.olsbranji.getNum(player); - if (num == player.getHp()) return true; - return ( - player.getHandcardLimit() - player.countCards("h") >= 3 || player.getDamagedHp() >= 2 - ); - }, - limited: true, - skillAnimation: true, - animationColor: "fire", - content: function* (event, map) { - var player = map.player; - var trigger = map.trigger; - player.awakenSkill("olsbranji"); - var num = lib.skill.olsbranji.getNum(player); - const skills = []; - if (num >= player.getHp()) { - skills.push("kunfen"); - player.storage.kunfen = true; - } - if (num <= player.getHp()) skills.push("zhaxiang"); - player.addSkills(skills); - if (player.countCards("h") != player.getHandcardLimit() || player.isDamaged()) { - var result, - num1 = player.countCards("h") - player.getHandcardLimit(); - if (!num1) result = { index: 1 }; - else if (player.isHealthy()) result = { index: 0 }; - else { - result = yield player - .chooseControl("手牌数", "体力值") - .set("choiceList", [ - num1 < 0 - ? "摸" + get.cnNumber(-num1) + "张牌" - : "弃置" + get.cnNumber(num1) + "张牌", - "回复" + player.getDamagedHp() + "点体力", - ]) - .set("ai", () => { - var player = _status.event.player; - var list = _status.event.list; - var num1 = get.effect(player, { name: "draw" }, player, player); - var num2 = get.recoverEffect(player, player, player); - return num1 * list[0] > num2 * list[1] ? 0 : 1; - }) - .set("list", [-num1, player.getDamagedHp()]); - } - if (result.index == 0) { - if (num1 < 0) yield player.drawTo(player.getHandcardLimit()); - else yield player.chooseToDiscard(num1, "h", true); - } else { - yield player.recover(player.maxHp - player.hp); - } - } - player.addSkill("olsbranji_norecover"); - player.when({ source: "dieAfter" }).then(() => player.removeSkill("olsbranji_norecover")); - }, - derivation: ["kunfenx", "zhaxiang"], - getList: function (event) { - return event.getParent().phaseList.map((list) => list.split("|")[0]); - }, - getNum: function (player) { - return player - .getHistory("useCard", (evt) => { - return lib.phaseName.some((name) => { - return evt.getParent(name).name == name; - }); - }) - .reduce((list, evt) => { - return list.add( - evt.getParent(lib.phaseName.find((name) => evt.getParent(name).name == name)) - ); - }, []).length; - }, - subSkill: { - norecover: { - charlotte: true, - mark: true, - intro: { content: "不能回复体力" }, - trigger: { player: "recoverBefore" }, - forced: true, - firstDo: true, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.tag(card, "recover")) return "zeroplayertarget"; - }, - }, - }, - }, - }, - }, - kunfenx: { - audio: "kunfen", - audioname: ["ol_sb_jiangwei"], - }, - //界曹彰 - oljiangchi: { - audio: "rejiangchi", - trigger: { player: "phaseDrawEnd" }, - direct: true, - content: function* (event, map) { - var player = map.player; - var choiceList = [ - "摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。", - "重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。", - ], - list = ["cancel2"]; - if (player.countCards("he", (card) => player.canRecast(card))) list.unshift("重铸,+1"); - else choiceList[1] = '' + choiceList[1] + ""; - list.unshift("摸牌,-1"); - var result = yield player - .chooseControl(list) - .set("ai", () => { - var player = _status.event.player; - var controls = _status.event.controls.slice(); - if ( - controls.includes("重铸,+1") && - player.countCards( - "hs", - (card) => get.name(card) == "sha" && player.hasValueTarget(card) - ) >= 2 - ) - return "重铸,+1"; - return "摸牌,-1"; - }) - .set("choiceList", choiceList) - .set("prompt", get.prompt("oljiangchi")); - if (result.control != "cancel2") { - player.logSkill("oljiangchi"); - if (result.control == "摸牌,-1") { - player.draw(); - player.addTempSkill("oljiangchi_less"); - player.addMark("oljiangchi_less", 1, false); - } else { - var result2 = yield player.chooseCard( - "he", - "将驰:请重铸一张牌", - true, - (card, player) => player.canRecast(card) - ); - if (result2.bool) { - player.recast(result2.cards); - player.addTempSkill("oljiangchi_more"); - player.addMark("oljiangchi_more", 1, false); - } - } - } - }, - subSkill: { - less: { - charlotte: true, - onremove: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num - player.countMark("oljiangchi_less"); - }, - ignoredHandcard: function (card, player) { - if (card.name == "sha") return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.name == "sha") return false; - }, - }, - }, - more: { - charlotte: true, - onremove: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("oljiangchi_more"); - }, - targetInRange: function (card, player) { - if (card.name == "sha") return true; - }, - }, - }, - }, - }, - //界简雍 - olqiaoshui: { - audio: "reqiaoshui", - inherit: "reqiaoshui", - filter: function (event, player) { - return player.countCards("h") > 0 && !player.hasSkill("olqiaoshui_used"); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) player.addTempSkill("qiaoshui3", { player: "phaseUseAfter" }); - else { - player.addTempSkill("qiaoshui2"); - player.addTempSkill("olqiaoshui_used"); - } - }, - subSkill: { - used: { - charlotte: true, - mark: true, - marktext: '', - intro: { content: "被迫闭嘴" }, - }, - }, - }, - //界凌统 - olxuanfeng: { - audio: "xuanfeng", - audioname: ["boss_lvbu3"], - audioname2: { - lingtong: "xuanfeng", - ol_lingtong: "xuanfeng_re_lingtong", - }, - trigger: { - player: ["loseAfter"], - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter: function (event, player) { - var evt = event.getl(player); - return evt && (evt.es.length || evt.cards2.length > 1); - }, - direct: true, - content: function () { - "step 0"; - event.count = 2; - event.logged = false; - "step 1"; - player - .chooseTarget( - get.prompt("olxuanfeng"), - "弃置一名其他角色的一张牌", - function (card, player, target) { - if (player == target) return false; - return target.countDiscardableCards(player, "he"); - } - ) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - "step 2"; - if (result.bool) { - if (!event.logged) { - player.logSkill("olxuanfeng", result.targets); - event.logged = true; - } else player.line(result.targets[0], "green"); - player.discardPlayerCard(result.targets[0], "he", true); - event.count--; - } else event.finish(); - "step 3"; - if (event.count) event.goto(1); - }, - ai: { - reverseEquip: true, - noe: true, - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; - }, - }, - }, - }, - xuanfeng_re_lingtong: { audio: 2 }, - }, - dynamicTranslate: {}, - translate: { - ol_lingtong: "OL界凌统", - ol_lingtong_prefix: "OL界", - olxuanfeng: "旋风", - olxuanfeng_info: - "当你一次性失去至少两张牌后,或失去装备区的牌后,你可以依次弃置一至两名其他角色的共计两张牌。", - ol_jianyong: "OL界简雍", - ol_jianyong_prefix: "OL界", - olqiaoshui: "巧说", - olqiaoshui_info: - "出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,此技能于本回合失效且本回合你不能使用锦囊牌。", - ol_caozhang: "OL界曹彰", - ol_caozhang_prefix: "OL界", - oljiangchi: "将驰", - oljiangchi_info: - "摸牌阶段结束时,你可以选择一项:①摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。②重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。", - ol_sb_jiangwei: "OL谋姜维", - ol_sb_jiangwei_prefix: "OL谋", - olsbzhuri: "逐日", - olsbzhuri_info: - "你的阶段结束时,若你本阶段失去过手牌或得到过牌,则你可以与一名角色拼点。若你赢,你可以使用其中一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合无效。", - olsbranji: "燃己", - olsbranji_info: - "限定技,结束阶段。若你本回合使用过牌的阶段数大于等于/小于等于体力值,你可以获得技能〖困奋〗/〖诈降〗(同时满足则都获得,以此法获得的〖困奋〗直接修改为非锁定技)。若如此做,你将手牌数调整至手牌上限或将体力值回复至体力上限,然后你不能回复体力直到你杀死角色。", - kunfenx: "困奋", - kunfenx_info: "结束阶段开始时,你可以失去1点体力,然后摸两张牌。", - ol_sb_guanyu: "OL谋关羽", - ol_sb_guanyu_prefix: "OL谋", - olsbfumeng: "赴梦", - olsbfumeng_info: "一轮游戏开始时,你可以令任意张手牌的牌名视为【杀】。", - olsbguidao: "归刀", - olsbguidao_info: - "出牌阶段,你可以重铸两张牌并视为使用一张【决斗】(重铸的【杀】数须比本回合上次发动〖归刀〗重铸的【杀】数多)。目标角色受到此牌伤害时,其须猜测你手牌中牌名为【杀】的牌数量多还是牌名不为【杀】的牌数多,若其猜错,则此【决斗】对其造成的伤害+1。", - ol_sb_taishici: "OL谋太史慈", - ol_sb_taishici_prefix: "OL谋", - olsbdulie: "笃烈", - olsbdulie_info: - "每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的唯一目标时,你可以令此牌额外结算一次。若如此做,此牌结算完毕后,你摸X张牌(X为你的攻击范围且至多为5)。", - olsbdouchan: "斗缠", - olsbdouchan_info: - "锁定技,准备阶段,你从牌堆中获得一张【决斗】,若牌堆没有【决斗】,则你的攻击范围和出牌阶段使用【杀】的次数上限+1(增加次数不超过游戏人数)。", - olsbweilin: "威临", - olsbweilin_info: - "每回合限一次,你可以将一张牌当作任意【杀】或【酒】使用,且你以此法使用的牌指定最后一个目标后,你令所有目标角色本回合与此牌颜色相同的手牌均视为【杀】。", - olsbduoshou: "夺首", - olsbduoshou_info: - "锁定技。①你每回合使用的第一张红色牌无距离限制。②你每回合使用的第一张基本牌不计入使用次数。③你每回合第一次造成伤害后,你摸一张牌。", - ol_gaoshun: "OL界高顺", - ol_gaoshun_prefix: "OL界", - olxianzhen: "陷阵", - olxianzhen_info: - "出牌阶段限一次,你可以与一名角色拼点。若你赢,本回合你无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标;若你没赢,本回合你不能对其使用【杀】且你的【杀】不计入手牌上限。", - ol_sb_yuanshao: "OL谋袁绍", - ol_sb_yuanshao_prefix: "OL谋", - olsbhetao: "合讨", - olsbhetao_info: - "其他角色使用牌执行第一个目标后,若此牌指定的目标数大于1,则你可以弃置一张与此牌颜色相同的牌并令此牌改为对其中一名目标角色结算两次。", - olsbshenli: "神离", - olsbshenli_info: - "出牌阶段限一次,当你使用【杀】指定目标后,你可以令所有可成为此牌目标的其他角色均成为此牌目标,此牌结算完毕后,若你因此牌造成的伤害值X:大于你的手牌数,你摸X张牌(至多摸五张);大于你的体力值,你再次对所有目标角色中可以成为此牌目标的角色使用此牌。", - olsbyufeng: "玉锋", - olsbyufeng_sizhaojian: "思召剑", - olsbyufeng_block: "思召剑", - olsbyufeng_info: "游戏开始时,你将【思召剑】置入装备区。", - sizhaojian: "思召剑", - sizhaojian_info: - "当你使用有点数的【杀】指定目标后,你令目标角色只能使用无点数或点数大于等于此【杀】的【闪】响应此牌。", - sizhaojian_append: - '【思召剑】于闪闪节(3月2日-3月15日)外离开装备区后,销毁此牌', - olsbshishou: "士首", - olsbshishou_info: - "主公技,其他群势力角色失去装备区的牌后,若你的装备区中没有武器牌,其可将【思召剑】置入你的装备区。", - ol_yufan: "OL界虞翻", - ol_yufan_prefix: "OL界", - olzongxuan: "纵玄", - olzongxuan_info: - "当你或你的上家因弃置而失去牌后,你可以将位于弃牌堆的这些牌中的任意牌以任意顺序置于牌堆顶。", - olzhiyan: "直言", - olzhiyan_info: - "你或你的上家的结束阶段,你可以令一名角色正面朝上摸一张牌,然后若此牌:为装备牌,则其使用此牌并回复1点体力;不为装备牌且其体力值大于等于你,则其失去1点体力。", - ol_chengpu: "OL界程普", - ol_chengpu_prefix: "OL界", - dclihuo: "疠火", - dclihuo_info: - "①你使用的非火【杀】可以改为火【杀】,若如此做,此牌结算完毕后,若此牌造成过伤害,则你弃置一张牌或失去1点体力。②你使用火【杀】可以额外指定一个目标。", - olchunlao: "醇醪", - olchunlao_info: - "①当你的【杀】因弃置进入弃牌堆后,你将位于弃牌堆的这些牌称为“醇”置于武将牌上。②一名角色处于濒死状态时,你可以将一张“醇”置入弃牌堆,然后令其视为使用一张【酒】。", - ol_wangyi: "OL界王异", - ol_wangyi_prefix: "OL界", - olzhenlie: "贞烈", - olzhenlie_info: - "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后你选择一项:①获得使用者的一张牌;②发动一次〖秘计〗。", - olmiji: "秘计", - olmiji_info: - "结束阶段,若你已受伤,则你可以摸X张牌,然后你可以将至多X张牌任意分配给其他角色(X为你已损失的体力值)。", - - onlyOL_yijiang1: "OL专属·将1", - onlyOL_yijiang2: "OL专属·将2", - onlyOL_yijiang3: "OL专属·将3", - onlyOL_sb: "OL专属·上兵伐谋", - }, - }; -}); diff --git a/character/onlyOL/card.js b/character/onlyOL/card.js new file mode 100644 index 000000000..79fd4d814 --- /dev/null +++ b/character/onlyOL/card.js @@ -0,0 +1,23 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + sizhaojian: { + derivation: "ol_sb_yuanshao", + cardcolor: "diamond", + fullskin: true, + type: "equip", + subtype: "equip1", + get destroy() { + return !lib.card.sizhaojian.inShanShanFestival(); + }, + inShanShanFestival() { + //闪闪节外离开装备区会销毁 + const date = new Date(); + return date.getMonth() + 1 == 3 && date.getDate() >= 2 && date.getDate() <= 15; + }, + distance: { attackFrom: -1 }, + ai: { basic: { equipValue: 7 } }, + skills: ["olsbyufeng_sizhaojian"], + }, +}; +export default cards; diff --git a/character/onlyOL/character.js b/character/onlyOL/character.js new file mode 100644 index 000000000..76cabc879 --- /dev/null +++ b/character/onlyOL/character.js @@ -0,0 +1,15 @@ +const characters = { + ol_sb_jiangwei: ["male", "shu", 4, ["olsbzhuri", "olsbranji"]], + ol_caozhang: ["male", "wei", 4, ["oljiangchi"], ["die_audio:xin_caozhang"]], + ol_jianyong: ["male", "shu", 3, ["olqiaoshui", "jyzongshi"], ["tempname:re_jianyong", "die_audio:re_jianyong"]], + ol_lingtong: ["male", "wu", 4, ["olxuanfeng"], ["die_audio:re_lingtong"]], + ol_sb_guanyu: ["male", "shu", 4, ["olsbweilin", "olsbduoshou"]], + ol_sb_taishici: ["male", "wu", 4, ["olsbdulie", "olsbdouchan"]], + ol_gaoshun: ["male", "qun", 4, ["olxianzhen", "decadejinjiu"], ["die_audio:re_gaoshun"]], + ol_sb_yuanshao: ["male", "qun", 4, ["olsbhetao", "olsbshenli", "olsbyufeng", "olsbshishou"], ["zhu"]], + ol_yufan: ["male", "wu", 3, ["olzongxuan", "olzhiyan"], ["tempname:re_yufan", "die_audio:re_yufan"]], + ol_chengpu: ["male", "wu", 4, ["dclihuo", "olchunlao"], ["tempname:xin_chengpu", "die_audio:xin_chengpu"]], + ol_wangyi: ["female", "wei", 3, ["olzhenlie", "olmiji"]], +}; + +export default characters; diff --git a/character/onlyOL/characterFilter.js b/character/onlyOL/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/onlyOL/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/onlyOL/characterReplace.js b/character/onlyOL/characterReplace.js new file mode 100644 index 000000000..2092d9297 --- /dev/null +++ b/character/onlyOL/characterReplace.js @@ -0,0 +1,3 @@ +const characterReplaces = {}; + +export default characterReplaces; diff --git a/character/onlyOL/dynamicTranslate.js b/character/onlyOL/dynamicTranslate.js new file mode 100644 index 000000000..cdee02b0a --- /dev/null +++ b/character/onlyOL/dynamicTranslate.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = {}; +export default dynamicTranslates; diff --git a/character/onlyOL/index.js b/character/onlyOL/index.js new file mode 100644 index 000000000..7c814dc6d --- /dev/null +++ b/character/onlyOL/index.js @@ -0,0 +1,35 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "onlyOL", + connect: true, + character: { ...characters }, + characterSort: { + onlyOL: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + characterSubstitute: { + ol_sb_yuanshao: [], + }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/onlyOL/intro.js b/character/onlyOL/intro.js new file mode 100644 index 000000000..82d64b020 --- /dev/null +++ b/character/onlyOL/intro.js @@ -0,0 +1,3 @@ +const characterIntro = {}; + +export default characterIntro; diff --git a/character/onlyOL/pinyin.js b/character/onlyOL/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/onlyOL/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/onlyOL/skill.js b/character/onlyOL/skill.js new file mode 100644 index 000000000..a6d981727 --- /dev/null +++ b/character/onlyOL/skill.js @@ -0,0 +1,1428 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //王异 + olzhenlie: { + audio: 2, + inherit: "zhenlie", + async content(event, trigger, player) { + const target = trigger.player; + if (get.attitude(player, target) < 0 && target.countDiscardableCards(player, "he")) player.addTempSkill("zhenlie_lose"); + await player.loseHp(); + player.removeSkill("zhenlie_lose"); + trigger.getParent().excluded.add(player); + if (!player.isIn()) return; + const goon = target.hasCard(card => { + if (get.position(card) == "h") return true; + return lib.filter.canBeGained(card, player, target); + }, "he"); + if (goon || player.isDamaged()) { + let result; + if (goon && player.isDamaged()) + result = await player + .chooseControl() + .set("choiceList", ["获得" + get.translation(target) + "的一张牌", "发动一次〖秘计〗"]) + .set("ai", () => { + const player = get.event("player"), + target = get.event().getTrigger().player; + return get.effect(target, { name: "shunshou_copy2" }, player, player) > get.effect(player, { name: "draw" }, player, player) * player.getDamagedHp() ? 0 : 1; + }) + .forResult(); + else result = { index: goon ? 0 : 1 }; + if (result.index == 0) { + await player.gainPlayerCard(target, "he", true); + } else { + await player.useSkill("olmiji"); + } + } + }, + }, + olmiji: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.isDamaged(); + }, + async content(event, trigger, player) { + let num = player.getDamagedHp(); + await player.draw(num); + if (player.countCards("he") && game.hasPlayer(target => target != player)) { + if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); + let given_map = []; + while (num > 0 && player.hasCard(card => !card.hasGaintag("olsujian_given"), "he")) { + const { + result: { bool, cards, targets }, + } = await player.chooseCardTarget({ + filterCard(card, player) { + return !card.hasGaintag("olsujian_given"); + }, + selectCard: [1, num], + position: "he", + filterTarget: lib.filter.notMe, + prompt: "秘计:请选择要分配的卡牌和目标", + prompt2: "(还可分配" + num + "张)", + ai1(card) { + return !ui.selected.cards.length && card.name == "du" ? 1 : 0; + }, + ai2(target) { + const player = get.event("player"); + const card = ui.selected.cards[0]; + if (card) return get.value(card, target) * get.attitude(player, target); + return 0; + }, + }); + if (bool) { + num -= cards.length; + const target = targets[0]; + if (given_map.some(i => i[0] == target)) { + given_map[given_map.indexOf(given_map.find(i => i[0] == target))][1].addArray(cards); + } else given_map.push([target, cards]); + player.addGaintag(cards, "olsujian_given"); + } else break; + } + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (given_map.length) { + await game + .loseAsync({ + gain_list: given_map, + player: player, + cards: given_map.slice().map(list => list[1]), + giver: player, + animate: "giveAuto", + }) + .setContent("gaincardMultiple"); + } + } + }, + }, + //程普 + dclihuo: { + audio: "relihuo", + trigger: { player: "useCard1" }, + filter(event, player) { + return event.card.name == "sha" && !game.hasNature(event.card, "fire"); + }, + check(event, player) { + let card = new lib.element.VCard(get.copy(event.card)); + game.setNature(card, "fire"); + const eff1 = event.targets.reduce((sum, target) => { + return sum + get.effect(target, event.card, player, player); + }, 0); + let targets = event.targets.slice(); + if (get.info("lihuo2").filter(event, player)) { + let targetx = game.filterPlayer(target => { + return !targets.includes(target) && player.canUse(card, target) && get.effect(target, card, player, player) > 0; + }); + if (targetx.length) + targets.add( + targetx.sort((a, b) => { + return get.effect(b, card, player, player) - get.effect(a, card, player, player); + })[0] + ); + } + const eff2 = targets.reduce((sum, target) => { + return sum + get.effect(target, card, player, player); + }, 0); + return eff2 > eff1; + }, + content() { + game.log(player, "将", trigger.card, "改为了火属性"); + game.setNature(trigger.card, "fire"); + player + .when("useCardAfter") + .filter(evt => evt == trigger) + .then(() => { + if ( + game.hasPlayer2(target => { + return target.getHistory("damage", evt => evt.card && evt.card == trigger.card).length; + }) + ) { + player.chooseToDiscard("he", "疠火:弃置一张牌,或失去1点体力").set("ai", card => { + const player = get.event("player"); + if ((get.name(card) == "tao" || get.name(card) == "jiu") && lib.filter.cardSavable(card, player, player)) return -1; + if (player.hp <= 1) { + if ( + cards.length < player.getEnemies().length && + player.hasCard(cardx => { + return (get.name(cardx) == "tao" || get.name(cardx) == "jiu") && lib.filter.cardSavable(cardx, player, player); + }, "hs") + ) + return 7 - get.value(card); + return -1; + } + return 24 - 5 * cards.length - 2 * Math.min(4, player.getHp()) - get.value(card); + }); + } else event.finish(); + }) + .then(() => { + if (!result.bool) player.loseHp(); + }); + }, + ai: { fireAttack: true }, + group: "dclihuo_add", + subSkill: { + add: { + inherit: "lihuo2", + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt("dclihuo"), "为" + get.translation(trigger.card) + "增加一个目标", (card, player, target) => { + const trigger = get.event().getTrigger(); + return !trigger.targets.includes(target) && player.canUse(trigger.card, target); + }) + .set("card", trigger.card) + .set("ai", target => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + return get.effect(target, trigger.card, player, player); + }); + if (bool) { + player.logSkill("dclihuo", targets); + trigger.targets.addArray(targets); + } + }, + }, + }, + }, + olchunlao: { + audio: "chunlao", + audioname: ["xin_chengpu"], + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + filter(event, player) { + if (event.type != "discard" || event.getlx === false) return false; + const evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.some(i => i.name == "sha" && get.position(i) == "d"); + }, + forced: true, + locked: false, + content() { + const evt = trigger.getl(player); + player + .addToExpansion( + evt.cards2.filter(i => i.name == "sha" && get.position(i) == "d"), + "gain2" + ) + .gaintag.add("olchunlao"); + }, + ai: { + effect: { + player(card, player, target) { + if (_status.currentPhase != player) return; + if (card.name == "sha" && !player.getExpansions("olchunlao").length && target.hp > 1) { + return "zeroplayertarget"; + } + }, + }, + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "olchunlao_save", + subSkill: { + save: { + inherit: "chunlao2", + filter(event, player) { + return event.type == "dying" && event.dying && event.dying.hp <= 0 && player.getExpansions("olchunlao").length; + }, + async content(event, trigger, player) { + const target = event.targets[0]; + const { + result: { bool, links }, + } = await player.chooseCardButton(get.translation("olchunlao"), player.getExpansions("olchunlao"), true); + if (bool) { + player.logSkill("olchunlao", target); + await player.loseToDiscardpile(links); + event.type = "dying"; + await target.useCard({ name: "jiu", isCard: true }, target); + } + }, + ai: { + save: true, + skillTagFilter(player) { + return player.getExpansions("olchunlao").length; + }, + order: 6, + result: { target: 1 }, + }, + }, + }, + }, + //虞翻 + olzongxuan: { + audio: "rezongxuan", + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + filter(event, player) { + if (event.type != "discard" || event.getlx === false) return false; + return get.info("olzongxuan").getCards(event, player).length; + }, + check(event, player) { + if (event.getParent(3).name != "phaseDiscard") return false; + const cards = get.info("olzongxuan").getCards(event, player); + return game.hasPlayer(target => { + if (cards.some(i => get.type(i, target) == "equip") && (get.attitude(player, target) > 0 || get.recoverEffect(target, player, player) > 0)) return true; + if (cards.some(i => get.type(i, target) != "equip") && target.getHp() >= player.getHp() && get.effect(target, { name: "losehp" }, player, player) > 0) return true; + return false; + }); + }, + async content(event, trigger, player) { + const { + result: { bool, moved }, + } = await player + .chooseToMove("纵玄:将任意张牌置于牌堆顶", true) + .set("list", [["本次弃置的牌", get.info("olzongxuan").getCards(trigger, player)], ["牌堆顶"]]) + .set("filterOk", moved => moved[1].length) + .set("processAI", list => { + const player = get.event("player"); + const cards = list[0][1].slice(), + cards2 = cards.filter(card => { + return game.hasPlayer(target => { + if (get.type(card, target) == "equip" && (get.attitude(player, target) > 0 || get.recoverEffect(target, player, player) > 0)) return true; + if (get.type(card, target) != "equip" && target.getHp() >= player.getHp() && get.effect(target, { name: "losehp" }, player, player) > 0) return true; + return false; + }); + }), + cards3 = cards2.length ? cards2.randomGet() : cards.randomGet(); + return [[], [cards3]]; + }); + if (bool) { + let cards = moved[1].slice(); + game.log(player, "将", cards, "置于了牌堆顶"); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); + } + } + }, + getCards(event, player) { + let cards = []; + for (const target of [player, player.getPrevious()]) { + const evt = event.getl(target); + if (evt && evt.cards2 && evt.cards2.some(i => get.position(i) == "d")) cards.addArray(evt.cards2.filter(i => get.position(i) == "d")); + } + return cards; + }, + }, + olzhiyan: { + audio: "zhiyan", + audioname: ["re_yufan"], + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + return event.player == player || event.player == player.getPrevious(); + }, + direct: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt2("olzhiyan")) + .set("ai", target => { + const player = get.event("player"), + cards = get.event("cards"); + if (!cards.length) return 0; + const card = cards[0], + att = get.attitude(player, target); + if (get.type(card, target) == "equip" && (get.attitude(player, target) > 0 || get.recoverEffect(target, player, player) > 0)) return get.recoverEffect(target, player, player) * 20 + att / 114514; + if (get.type(card, target) != "equip") { + if (target.getHp() >= player.getHp()) return get.effect(target, { name: "losehp" }, player, player) * 20 - att / 114514; + return get.effect(target, { name: "draw" }, player, player); + } + return 0; + }) + .set("cards", Array.from(ui.cardPile.childNodes || []) || []); + if (bool) { + const target = targets[0]; + player.logSkill("olzhiyan", target); + const { result } = await target.draw("visible"); + if (result) { + const card = result[0]; + if (get.type(card, target) == "equip") { + if (target.getCards("h").includes(card) && target.hasUseTarget(card)) { + const { + result: { bool }, + } = await target.chooseUseTarget(card, true, "nopopup"); + if (bool) await target.recover(); + } + } else if (target.getHp() >= player.getHp()) await target.loseHp(); + } + } + }, + ai: { expose: 0.2 }, + }, + //OL谋袁绍 + //真·四世三公——袁神,启动 + olsbhetao: { + audio: 3, + audioname: ["ol_sb_yuanshao_shadow"], + trigger: { global: "useCardToPlayered" }, + filter(event, player) { + return ( + event.player != player && + event.isFirstTarget && + event.targets.length > 1 && + player.countCards("he", card => { + if (get.position(card) == "h" && _status.connectMode) return true; + return get.color(card) == get.color(event.card) && lib.filter.cardDiscardable(card, player); + }) + ); + }, + direct: true, + async content(event, trigger, player) { + const { + result: { bool, cards, targets }, + } = await player + .chooseCardTarget({ + prompt: get.prompt("olsbhetao"), + filterCard(card, player) { + return get.color(card) == get.color(get.event().getTrigger().card) && lib.filter.cardDiscardable(card, player); + }, + position: "he", + filterTarget(card, player, target) { + return get.event().getTrigger().targets.includes(target); + }, + ai1(card) { + return 7.5 - get.value(card); + }, + ai2(target) { + const player = get.event("player"), + trigger = get.event().getTrigger(); + const att = get.attitude(player, target), + eff = get.effect(target, trigger.card, trigger.player, player); + if (trigger.card.name == "tiesuo") return eff > 0 ? 0 : get.sgn(att) * (2 + get.sgn(att)); + const sum = trigger.targets.reduce((i, j) => i + get.effect(j, trigger.card, trigger.player, player), 0); + return get.sgn(att) * (eff * 2 - sum); + }, + }) + .set("prompt2", "弃置一张" + get.translation(get.color(trigger.card)) + "牌,令" + get.translation(trigger.card) + "改为对其中一个目标结算两次"); + if (bool) { + const target = targets[0]; + player.logSkill("olsbhetao", target); + player.changeSkin("olsbhetao", "ol_sb_yuanshao"); + player.discard(cards); + trigger.getParent().effectCount++; + trigger.getParent().excluded.addArray(game.filterPlayer(i => trigger.targets.includes(i) && target != i)); + } + }, + ai: { threaten: 3.5 }, + global: "olsbhetao_ai", + subSkill: { + ai: { + effect: { + player(card, player) { + if ( + !game.hasPlayer(target => { + return target.hasSkill("olsbhetao") && (get.attitude(player, target) < 0 || get.attitude(target, player) < 0); + }) || + game.countPlayer(target => { + return player.canUse(card, target); + }) < 2 + ) + return; + const select = get.copy(get.info(card).selectTarget); + let range; + if (select == undefined) range = [1, 1]; + else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, player, range, "selectTarget", player); + if (range[1] == -1 || (range[1] > 1 && ui.selected.targets && ui.selected.targets.length)) return "zeroplayertarget"; + }, + }, + }, + }, + }, + olsbshenli: { + audio: 3, + audioname: ["ol_sb_yuanshao_shadow"], + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!player.isPhaseUsing() || player.hasSkill("olsbshenli_used")) return false; + return ( + event.card.name == "sha" && + game.hasPlayer(target => { + return !event.targets.includes(target) && player.canUse(event.card, target, false); + }) && + event.isFirstTarget + ); + }, + check(event, player) { + const targets = game.filterPlayer(target => player.canUse(event.card, target, false)); + const num1 = event.targets.reduce((sum, target) => sum + get.effect(target, event.card, player, player), 0); + const num2 = targets.reduce((sum, target) => sum + get.effect(target, event.card, player, player), 0); + if (num2 >= num1) return true; + let num = event.baseDamage || 1; + if (event.extraDamage) num += event.extraDamage; + let extra_num = 0; + for (const target of targets) { + if ( + target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: event.card, + }, + true + ) + ) { + if (player.hasSkill("jueqing") || target.hasSkill("gangzhi")) extra_num--; + else if ( + target.hasSkillTag("filterDamage", null, { + player: event.player, + card: event.card, + }) + ) + extra_num++; + } else extra_num += num; + } + const sum = targets.length + extra_num; + return num2 + (sum > player.countCards("h") ? Math.min(5, sum) : 0) + (sum > player.getHp() ? num2 : 0) >= num1; + }, + async content(event, trigger, player) { + player.changeSkin("olsbshenli", "ol_sb_yuanshao_shadow"); + player.addTempSkill("olsbshenli_used", "phaseUseAfter"); + trigger.getParent().targets.addArray( + game.filterPlayer(target => { + return !trigger.targets.includes(target) && player.canUse(trigger.card, target, false); + }) + ); + player + .when("useCardAfter") + .filter(evt => evt == trigger.getParent()) + .then(() => { + const sum = player + .getHistory("sourceDamage", evt => evt.card && evt.card == trigger.card) + .reduce((num, evt) => { + return num + evt.num; + }, 0); + const bool = sum > player.countCards("h"), + goon = sum > player.getHp(); + if (bool) player.draw(Math.min(5, sum)); + if (goon) { + const targets = game.filterPlayer(target => trigger.targets.includes(target) && player.canUse(trigger.card, target, false)); + if ( + targets.length && + (!trigger.cards || + !trigger.cards.length || + trigger.cards.every(card => { + return !get.owner(card); + })) + ) + player.useCard(trigger.card, targets, false); + } + }); + }, + ai: { threaten: 3.5 }, + subSkill: { used: { charlotte: true } }, + }, + olsbyufeng: { + audio: 2, + audioname2: { + ol_sb_yuanshao_shadow: "olsbyufeng_ol_sb_yuanshao_shadow", + }, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + const card = get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); + return (event.name != "phase" || game.phaseNumber == 0) && player.canEquip(card, true); + }, + forced: true, + locked: false, + async content(event, trigger, player) { + if (lib.card.sizhaojian.inShanShanFestival()) { + game.broadcastAll(() => lib.inpile.add("sizhaojian")); + } + const card = get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); + if (get.owner(card)) get.owner(card).$give(card, player, false); + else { + player.$gain2(card, false); + game.delayx(); + } + player.equip(card); + }, + subSkill: { + ol_sb_yuanshao_shadow: { + audio: 1, + }, + sizhaojian: { + equipSkill: true, + mod: { + aiOrder(player, card, num) { + if (card.name == "sha" && typeof get.number(card) == "number") return num + get.number(card) / 114514; + }, + }, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return event.card.name == "sha" && typeof get.number(event.card) == "number"; + }, + forced: true, + locked: false, + logTarget: "target", + async content(event, trigger, player) { + const target = trigger.target; + target.addTempSkill("olsbyufeng_block"); + target.markAuto("olsbyufeng_block", [trigger.card]); + }, + }, + block: { + mod: { + cardEnabled(card, player) { + if (!player.storage.olsbyufeng_block) return; + const storage = player.getStorage("olsbyufeng_block"); + let evt = _status.event; + if (evt.name != "chooseToUse") evt = evt.getParent("chooseToUse"); + if (!evt || !evt.respondTo || !storage.includes(evt.respondTo[1])) return; + const num = get.number(card); + if (num != "unsure" && typeof num == "number" && num < get.number(evt.respondTo[1])) return false; + }, + }, + onremove(player) { + delete player.storage.olsbyufeng_block; + }, + charlotte: true, + trigger: { + player: ["damageBefore", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], + global: ["useCardEnd"], + }, + filter(event, player) { + if (!event.card || !player.storage.olsbyufeng_block) return false; + return player.getStorage("olsbyufeng_block").includes(event.card); + }, + forced: true, + popup: false, + firstDo: true, + content() { + player.unmarkAuto("olsbyufeng_block", [trigger.card]); + if (!player.getStorage("olsbyufeng_block").length) player.removeSkill("olsbyufeng_block"); + }, + }, + }, + }, + olsbshishou: { + unique: true, + audio: 3, + audioname: ["ol_sb_yuanshao_shadow"], + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + if (player.getEquip(1)) return false; + const card = get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); + if (!player.canEquip(card, true)) return false; + return game.hasPlayer(target => { + if (target == player || target.group != "qun") return false; + const evt = event.getl(target); + return evt && evt.player == target && evt.es && evt.es.length > 0; + }); + }, + direct: true, + zhuSkill: true, + async content(event, trigger, player) { + const targets = game + .filterPlayer(target => { + if (target == player || target.group != "qun") return false; + const evt = trigger.getl(target); + return evt && evt.player == target && evt.es && evt.es.length > 0; + }) + .sortBySeat(); + const card = get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); + for (const target of targets) { + const { + result: { bool }, + } = await target.chooseBool(get.prompt("olsbshishou", player), "将" + get.translation(card) + "置入" + get.translation(player) + "的装备区中").set("choice", get.attitude(target, player) > 0); + if (bool) { + target.logSkill("olsbshishou", player); + if (get.owner(card)) get.owner(card).$give(card, player, false); + else { + player.$gain2(card, false); + game.delayx(); + } + player.equip(card); + break; + } + } + }, + ai: { combo: "olsbyufeng" }, + }, + //界高顺 + olxianzhen: { + audio: "rexianzhen", + inherit: "xianzhen", + async content(event, trigger, player) { + const target = event.target; + const { + result: { bool }, + } = await player.chooseToCompare(target); + if (bool) { + player.storage.xinxianzhen = target; + player.addTempSkill("xinxianzhen2"); + } else { + player.markAuto("olxianzhen_buff", [target]); + player.addTempSkill("olxianzhen_buff"); + } + }, + subSkill: { + buff: { + charlotte: true, + onremove: true, + mod: { + playerEnabled(card, player, target) { + if (get.name(card, player) == "sha" && player.getStorage("olxianzhen_buff").includes(target)) return false; + }, + ignoredHandcard(card, player) { + if (get.name(card, player) == "sha") return true; + }, + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && get.name(card, player) == "sha") return false; + }, + }, + }, + }, + }, + //新OL谋关羽 + olsbweilin: { + audio: 2, + enable: "chooseToUse", + filter(event, player) { + return get + .inpileVCardList(info => { + const name = info[2]; + if (name != "sha" && name != "jiu") return false; + return get.type(name) == "basic"; + }) + .some(card => player.hasCard(cardx => event.filterCard({ name: card[2], nature: card[3], cards: [cardx] }, player, event), "hes")); + }, + usable: 1, + chooseButton: { + dialog(event, player) { + const list = get + .inpileVCardList(info => { + const name = info[2]; + if (name != "sha" && name != "jiu") return false; + return get.type(name) == "basic"; + }) + .filter(card => player.hasCard(cardx => event.filterCard({ name: card[2], nature: card[3], cards: [cardx] }, player, event), "hes")); + return ui.create.dialog("威临", [list, "vcard"]); + }, + filter(button, player) { + return _status.event.getParent().filterCard({ name: button.link[2], nature: button.link[3] }, player, _status.event.getParent()); + }, + check(button) { + if (_status.event.getParent().type != "phase") return 1; + const player = get.event("player"), + value = player.getUseValue({ name: button.link[2], nature: button.link[3] }); + if (button.link[2] == "sha" && !player.getHistory("useCard", evt => get.type(evt.card) == "basic").length) { + if (value > 0) return value + 20; + } + return value; + }, + backup(links, player) { + return { + audio: "olsbweilin", + filterCard: true, + popname: true, + check(card) { + const name = lib.skill.olsbweilin_backup.viewAs.name, + color = get.color(card); + const phase = _status.event.getParent().type == "phase"; + if (phase && name == "sha" && color == "red") return 10 - get.value(card); + if (name == "tao") return 7 + [-2, 0, 2][["black", "red", "none"].indexOf(color)] - get.value(card); + return 6 - get.value(card); + }, + position: "hse", + viewAs: { name: links[0][2], nature: links[0][3] }, + precontent() { + if (!player.storage.olsbweilin_backup) { + player.storage.olsbweilin_backup = true; + player + .when("useCardToTargeted") + .filter(evt => evt.getParent().skill == "olsbweilin_backup" && evt.getParent().triggeredTargets3.length == evt.targets.length) + .then(() => { + delete player.storage.olsbweilin_backup; + const targets = trigger.targets.slice().sortBySeat(); + player.line(targets); + for (const target of targets) { + target.addTempSkill("olsbweilin_wusheng"); + target.markAuto("olsbweilin_wusheng", [get.color(trigger.card)]); + } + }); + } + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (get.event("skill") != "olsbweilin_backup") return false; + return arg && arg.card && arg.card.name == "sha" && get.color(arg.card) == "red"; + }, + }, + }; + }, + prompt(links, player) { + return "将一张牌当作" + (get.translation(links[0][3]) || "") + "【" + get.translation(links[0][2]) + "】使用"; + }, + }, + hiddenCard(player, name) { + if (!lib.inpile.includes(name) || name != "jiu") return false; + return get.type(name) == "basic" && !player.getStat("skill").olsbweilin && player.countCards("hes"); + }, + ai: { + fireAttack: true, + respondSha: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond") return false; + if (player.getStat("skill").olsbweilin || !player.countCards("hes")) return false; + }, + order(item, player) { + if (player && _status.event.type == "phase" && player.hasValueTarget({ name: "sha" }, true, true)) { + let max = 0, + names = get.inpileVCardList(info => { + const name = info[2]; + if (name != "sha" && name != "jiu") return false; + return get.type(name) == "basic"; + }); + names = names.map(namex => { + return { name: namex[2], nature: namex[3] }; + }); + names.forEach(card => { + if (player.getUseValue(card) > 0) { + let temp = get.order(card); + if (card.name == "jiu") { + let cards = player.getCards("hs", cardx => get.value(cardx) < 8); + cards.sort((a, b) => get.value(a) - get.value(b)); + if (!cards.some(cardx => get.name(cardx) == "sha" && !cards.slice(0, 2).includes(cardx))) temp = 0; + } + if (temp > max) max = temp; + } + }); + if (max > 0) max += 15; + return max; + } + return 0.5; + }, + result: { + player(player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { + backup: {}, + wusheng: { + charlotte: true, + onremove: true, + mod: { + cardname(card, player) { + if (player.getStorage("olsbweilin_wusheng").includes(get.color(card))) return "sha"; + }, + }, + intro: { content: "手牌中所有$牌均视为【杀】" }, + }, + }, + }, + olsbduoshou: { + init(player) { + if (player.getHistory("useCard", evt => get.color(evt.card) == "red").length) player.addTempSkill("olsbduoshou_used"); + }, + mod: { + targetInRange(card, player, target) { + if (get.color(card) == "red" && !player.hasSkill("olsbduoshou_used")) return true; + }, + }, + audio: 2, + trigger: { + player: "useCard", + source: "damageSource", + }, + filter(event, player) { + if (event.name == "damage") return player.getHistory("sourceDamage").indexOf(event) == 0; + if (get.color(event.card) == "red" && !player.hasSkill("olsbduoshou_used")) return true; + return get.type(event.card) == "basic" && player.getHistory("useCard", evt => get.type(evt.card) == "basic").indexOf(event) == 0; + }, + forced: true, + async content(event, trigger, player) { + if (trigger.name == "damage") player.draw(); + else { + if (get.color(trigger.card) == "red" && !player.hasSkill("olsbduoshou_used")) { + game.log(trigger.card, "无距离限制"); + player.addTempSkill("olsbduoshou_used"); + } + if (get.type(trigger.card) == "basic" && player.getHistory("useCard", evt => get.type(evt.card) == "basic").indexOf(trigger) == 0) { + game.log(trigger.card, "不计入次数上限"); + if (trigger.addCount !== false) { + trigger.addCount = false; + const stat = player.stat[player.stat.length - 1].card; + if (typeof stat[trigger.card.name] === "number") stat[trigger.card.name]--; + } + } + } + }, + subSkill: { used: { charlotte: true } }, + }, + //OL谋太史慈 + olsbdulie: { + audio: 2, + trigger: { target: "useCardToTarget" }, + filter(event, player) { + if (event.player == player || !event.isFirstTarget || event.targets.length != 1) return false; + if (player.getAttackRange() <= 0) return; + return ["basic", "trick"].includes(get.type(event.card)); + }, + prompt2(event, player) { + return "令" + get.translation(event.card) + "额外结算一次,此牌结算完毕后,你摸等同于你攻击范围的牌"; + }, + check(event, player) { + const num = Math.min(5, player.getAttackRange()); + if (get.effect(player, event.card, event.player, player) > 0) return true; + if (event.card.name == "guohe" || event.card.name == "shunshou" || event.card.name == "zhujinqiyuan") return num > (event.effectCount || 0); + if (!get.tag(event.card, "damage")) return true; + return num > 1; + }, + usable: 1, + async content(event, trigger, player) { + trigger.getParent().effectCount++; + player + .when({ global: "useCardAfter" }) + .filter(evt => evt == trigger.getParent()) + .then(() => { + const num = Math.min(5, player.getAttackRange()); + if (num > 0) player.draw(num); + }); + }, + }, + olsbdouchan: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + async content(event, trigger, player) { + const card = get.cardPile2(card => card.name == "juedou"); + if (card) player.gain(card, "gain2"); + else if (player.countMark("olsbdouchan") < game.players.length + game.dead.length) player.addMark("olsbdouchan", 1, false); + }, + mod: { + attackRange(player, num) { + return num + player.countMark("olsbdouchan"); + }, + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("olsbdouchan"); + }, + }, + intro: { content: "
  • 攻击距离+#
  • 使用【杀】的次数上限+#" }, + }, + //OL谋关羽 + //可以和手杀谋关羽组成卧龙凤雏了 + olsbfumeng: { + audio: 2, + trigger: { global: "roundStart" }, + filter(event, player) { + return player.countCards("h", card => { + if (_status.connectMode) return true; + return get.name(card, player) != "sha"; + }); + }, + direct: true, + async content(event, trigger, player) { + const { + result: { bool, cards }, + } = await player + .chooseCard(get.prompt2("olsbfumeng"), [1, Infinity], (card, player) => { + return get.name(card, player) != "sha"; + }) + .set("ai", card => { + const player = get.event("player"); + if (player.hasSkill("olsbfumeng")) return 7 - get.value(card); + return 4.5 - get.value(card); + }); + if (!bool) return; + player.logSkill("olsbfumeng"); + player.addSkill("olsbfumeng_buff"); + player.addGaintag(cards, "olsbfumeng_buff"); + }, + subSkill: { + buff: { + charlotte: true, + mod: { + cardname: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("olsbfumeng_buff")) return "sha"; + }, + }, + }, + }, + }, + olsbguidao: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + if (event.olsbguidao_num > 2) return false; + const card = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); + return ( + game.hasPlayer(target => { + return player.canUse(card, target, false); + }) && + player.countCards("he", cardx => { + return player.canRecast(cardx); + }) >= 2 && + player.countCards("he", cardx => { + return get.name(cardx, player) == "sha" && player.canRecast(cardx); + }) >= event.olsbguidao_num + ); + }, + onChooseToUse(event) { + if (!game.online && !event.olsbguidao_num) { + const player = event.player, + history = player.getHistory("custom", evt => evt.olsbguidao_num); + if (!history.length) event.set("olsbguidao_num", 1); + else { + const evt = history[history.length - 1]; + event.set("olsbguidao_num", evt.olsbguidao_num); + } + } + }, + filterCard(card, player) { + const num = get.event("olsbguidao_num"); + if (ui.selected.cards.filter(cardx => get.name(cardx, player) == "sha").length < num && get.name(card, player) != "sha") return false; + return player.canRecast(card); + }, + selectCard: 2, + position: "he", + check(card) { + const player = get.event("player"); + if (get.name(card, player) == "sha") return 1 / (get.value(card) || 0.5); + return 7 - get.value(card); + }, + complexCard: true, + lose: false, + discard: false, + delay: 0, + filterTarget(card, player, target) { + const cardx = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); + return player.canUse(cardx, target, false); + }, + prompt() { + let str = "重铸两张牌"; + const num = get.event("olsbguidao_num"); + if (num > 0) str += "(至少重铸" + get.cnNumber(num) + "张【杀】)"; + str += "并视为使用【决斗】"; + return str; + }, + async content(event, trigger, player) { + const target = event.target, + cards = event.cards; + player.getHistory("custom").push({ + olsbguidao_num: cards.filter(card => get.name(card, player) == "sha").length + 1, + }); + const card = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); + await player.recast(cards); + player.addTempSkill("olsbguidao_buff"); + if (player.canUse(card, target, false)) player.useCard(card, target, false); + }, + ai: { + order(item, player) { + const card = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); + const order = get.order(card, player); + if (order <= 0) return 0; + return order + 0.1; + }, + result: { + target(player, target) { + const card = new lib.element.VCard({ + name: "juedou", + storage: { olsbguidao: true }, + }); + return get.sgn(get.attitude(player, target)) * get.effect(target, card, player, player); + }, + }, + }, + subSkill: { + buff: { + charlotte: true, + trigger: { global: "damageBegin3" }, + filter(event, player) { + if (!event.card || !event.card.storage || !event.card.storage.olsbguidao) return false; + if (!event.source || event.source != player) return false; + const evt = event.getParent("useCard"); + return evt.player == player && evt.targets.includes(event.player); + }, + forced: true, + popup: false, + async content(event, trigger, player) { + const target = trigger.player; + const { + result: { control }, + } = await target + .chooseControl("【杀】更多", "非【杀】更多") + .set("prompt", "归刀:请猜测" + get.translation(player) + "手牌中【杀】与非【杀】牌数哪个更多") + .set("prompt2", "若猜错,则" + get.translation(trigger.card) + "对你造成的伤害+1") + .set("ai", () => _status.event.controls.randomGet()); + const goon1 = player.countCards("h", card => get.name(card, player) == "sha") >= player.countCards("h", card => get.name(card, player) != "sha"); + const goon2 = player.countCards("h", card => get.name(card, player) != "sha") >= player.countCards("h", card => get.name(card, player) == "sha"); + if ((goon1 && control == "【杀】更多") || (goon2 && control == "非【杀】更多")) { + target.popup("洗具"); + game.log(target, "猜测", "#g正确"); + } else { + target.popup("杯具"); + game.log(target, "猜测", "#y错误"); + trigger.increase("num"); + } + }, + }, + }, + }, + //OL谋姜维 + olsbzhuri: { + audio: 2, + trigger: { + player: ["phaseZhunbeiEnd", "phaseJudgeEnd", "phaseDrawEnd", "phaseUseEnd", "phaseDiscardEnd", "phaseJieshuEnd"], + }, + filter: function (event, player) { + if (player.hasSkill("olsbzhuri_block")) return false; + if (!game.hasPlayer(target => player.canCompare(target))) return false; + return player.getHistory("gain", evt => evt.getParent(event.name) == event).length + player.getHistory("lose", evt => evt.getParent(event.name) == event && evt.hs.length).length; + }, + direct: true, + content: function* (event, map) { + var player = map.player; + var trigger = map.trigger; + var result = yield player + .chooseTarget(get.prompt("olsbzhuri"), "与一名角色进行拼点,若你赢,你可以使用其中的一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合失效", (card, player, target) => { + return player.canCompare(target); + }) + .set("ai", target => { + var player = _status.event.player; + var ts = target.getCards("h").sort((a, b) => get.number(a) - get.number(b)); + if (get.attitude(player, target) < 0) { + var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + if (get.number(hs[0]) > get.number(ts[0])) return 1; + if (get.effect(player, { name: "losehp" }, player, player) > 0) return Math.random() + 0.2; + if (player.getHp() > 2) return Math.random() - 0.5; + return 0; + } + return 0; + }); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olsbzhuri", target); + var result2 = yield player.chooseToCompare(target); + if (result2.bool) { + var cards = [result2.player, result2.target].filterInD("d"); + cards = cards.filter(card => player.hasUseTarget(card)); + if (cards.length) { + var result3 = yield player.chooseButton(["是否使用其中的牌?", cards]).set("ai", button => _status.event.player.getUseValue(button.link)); + if (result3.bool) { + var card = result3.links[0]; + player.$gain2(card, false); + game.delayx(); + player.chooseUseTarget(true, card, false); + } + } + } else { + var list = lib.skill.olsbranji.getList(trigger); + var result3 = yield player + .chooseControl("失去体力", "技能失效") + .set("prompt", "逐日:失去1点体力,或令此技能于本回合失效") + .set("ai", () => { + var player = _status.event.player; + if (player.getHp() > 2) { + var list = _status.event.list; + list.removeArray(player.skipList); + if (list.includes("phaseDraw") || list.includes("phaseUse")) return "失去体力"; + } + if (get.effect(player, { name: "losehp" }, player, player) > 0) return "失去体力"; + return "技能失效"; + }) + .set("list", list.slice(trigger.getParent().num, list.length)); + player[result3.control == "失去体力" ? "loseHp" : "addTempSkill"](result3.control == "失去体力" ? 1 : "olsbzhuri_block"); + } + } + }, + subSkill: { + block: { + charlotte: true, + mark: true, + marktext: '', + intro: { content: "追不动太阳了" }, + }, + }, + }, + olsbranji: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + prompt2: function (event, player) { + var str = "获得技能"; + var num = lib.skill.olsbranji.getNum(player); + if (num >= player.getHp()) str += "【困奋】"; + if (num == player.getHp()) str += "和"; + if (num <= player.getHp()) str += "【诈降】"; + str += ",然后"; + var num1 = player.countCards("h") - player.getHandcardLimit(); + if (num1 || player.isDamaged()) { + if (num1) str += num1 < 0 ? "摸" + get.cnNumber(-num1) + "张牌" : "弃置" + get.cnNumber(num1) + "张牌"; + if (num1 && player.isDamaged()) str += "或"; + if (player.isDamaged()) str += "回复" + player.getDamagedHp() + "点体力"; + str += ",最后"; + } + str += "你不能回复体力直到你杀死角色。"; + return str; + }, + check: function (event, player) { + var num = lib.skill.olsbranji.getNum(player); + if (num == player.getHp()) return true; + return player.getHandcardLimit() - player.countCards("h") >= 3 || player.getDamagedHp() >= 2; + }, + limited: true, + skillAnimation: true, + animationColor: "fire", + content: function* (event, map) { + var player = map.player; + var trigger = map.trigger; + player.awakenSkill("olsbranji"); + var num = lib.skill.olsbranji.getNum(player); + const skills = []; + if (num >= player.getHp()) { + skills.push("kunfen"); + player.storage.kunfen = true; + } + if (num <= player.getHp()) skills.push("zhaxiang"); + player.addSkills(skills); + if (player.countCards("h") != player.getHandcardLimit() || player.isDamaged()) { + var result, + num1 = player.countCards("h") - player.getHandcardLimit(); + if (!num1) result = { index: 1 }; + else if (player.isHealthy()) result = { index: 0 }; + else { + result = yield player + .chooseControl("手牌数", "体力值") + .set("choiceList", [num1 < 0 ? "摸" + get.cnNumber(-num1) + "张牌" : "弃置" + get.cnNumber(num1) + "张牌", "回复" + player.getDamagedHp() + "点体力"]) + .set("ai", () => { + var player = _status.event.player; + var list = _status.event.list; + var num1 = get.effect(player, { name: "draw" }, player, player); + var num2 = get.recoverEffect(player, player, player); + return num1 * list[0] > num2 * list[1] ? 0 : 1; + }) + .set("list", [-num1, player.getDamagedHp()]); + } + if (result.index == 0) { + if (num1 < 0) yield player.drawTo(player.getHandcardLimit()); + else yield player.chooseToDiscard(num1, "h", true); + } else { + yield player.recover(player.maxHp - player.hp); + } + } + player.addSkill("olsbranji_norecover"); + player.when({ source: "dieAfter" }).then(() => player.removeSkill("olsbranji_norecover")); + }, + derivation: ["kunfenx", "zhaxiang"], + getList: function (event) { + return event.getParent().phaseList.map(list => list.split("|")[0]); + }, + getNum: function (player) { + return player + .getHistory("useCard", evt => { + return lib.phaseName.some(name => { + return evt.getParent(name).name == name; + }); + }) + .reduce((list, evt) => { + return list.add(evt.getParent(lib.phaseName.find(name => evt.getParent(name).name == name))); + }, []).length; + }, + subSkill: { + norecover: { + charlotte: true, + mark: true, + intro: { content: "不能回复体力" }, + trigger: { player: "recoverBefore" }, + forced: true, + firstDo: true, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "recover")) return "zeroplayertarget"; + }, + }, + }, + }, + }, + }, + kunfenx: { + audio: "kunfen", + audioname: ["ol_sb_jiangwei"], + }, + //界曹彰 + oljiangchi: { + audio: "rejiangchi", + trigger: { player: "phaseDrawEnd" }, + direct: true, + content: function* (event, map) { + var player = map.player; + var choiceList = ["摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。", "重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。"], + list = ["cancel2"]; + if (player.countCards("he", card => player.canRecast(card))) list.unshift("重铸,+1"); + else choiceList[1] = '' + choiceList[1] + ""; + list.unshift("摸牌,-1"); + var result = yield player + .chooseControl(list) + .set("ai", () => { + var player = _status.event.player; + var controls = _status.event.controls.slice(); + if (controls.includes("重铸,+1") && player.countCards("hs", card => get.name(card) == "sha" && player.hasValueTarget(card)) >= 2) return "重铸,+1"; + return "摸牌,-1"; + }) + .set("choiceList", choiceList) + .set("prompt", get.prompt("oljiangchi")); + if (result.control != "cancel2") { + player.logSkill("oljiangchi"); + if (result.control == "摸牌,-1") { + player.draw(); + player.addTempSkill("oljiangchi_less"); + player.addMark("oljiangchi_less", 1, false); + } else { + var result2 = yield player.chooseCard("he", "将驰:请重铸一张牌", true, (card, player) => player.canRecast(card)); + if (result2.bool) { + player.recast(result2.cards); + player.addTempSkill("oljiangchi_more"); + player.addMark("oljiangchi_more", 1, false); + } + } + } + }, + subSkill: { + less: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num - player.countMark("oljiangchi_less"); + }, + ignoredHandcard: function (card, player) { + if (card.name == "sha") return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.name == "sha") return false; + }, + }, + }, + more: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("oljiangchi_more"); + }, + targetInRange: function (card, player) { + if (card.name == "sha") return true; + }, + }, + }, + }, + }, + //界简雍 + olqiaoshui: { + audio: "reqiaoshui", + inherit: "reqiaoshui", + filter: function (event, player) { + return player.countCards("h") > 0 && !player.hasSkill("olqiaoshui_used"); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) player.addTempSkill("qiaoshui3", { player: "phaseUseAfter" }); + else { + player.addTempSkill("qiaoshui2"); + player.addTempSkill("olqiaoshui_used"); + } + }, + subSkill: { + used: { + charlotte: true, + mark: true, + marktext: '', + intro: { content: "被迫闭嘴" }, + }, + }, + }, + //界凌统 + olxuanfeng: { + audio: "xuanfeng", + audioname: ["boss_lvbu3"], + audioname2: { + lingtong: "xuanfeng", + ol_lingtong: "xuanfeng_re_lingtong", + }, + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + var evt = event.getl(player); + return evt && (evt.es.length || evt.cards2.length > 1); + }, + direct: true, + content: function () { + "step 0"; + event.count = 2; + event.logged = false; + "step 1"; + player + .chooseTarget(get.prompt("olxuanfeng"), "弃置一名其他角色的一张牌", function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he"); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 2"; + if (result.bool) { + if (!event.logged) { + player.logSkill("olxuanfeng", result.targets); + event.logged = true; + } else player.line(result.targets[0], "green"); + player.discardPlayerCard(result.targets[0], "he", true); + event.count--; + } else event.finish(); + "step 3"; + if (event.count) event.goto(1); + }, + ai: { + reverseEquip: true, + noe: true, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, + }, + }, + xuanfeng_re_lingtong: { audio: 2 }, +}; + +export default skills; diff --git a/character/onlyOL/sort.js b/character/onlyOL/sort.js new file mode 100644 index 000000000..0756254df --- /dev/null +++ b/character/onlyOL/sort.js @@ -0,0 +1,15 @@ +const characterSort = { + onlyOL_yijiang1: ["ol_jianyong", "ol_lingtong", "ol_gaoshun"], + onlyOL_yijiang2: ["ol_caozhang", "ol_chengpu", "ol_wangyi"], + onlyOL_yijiang3: ["ol_yufan"], + onlyOL_sb: ["ol_sb_jiangwei", "ol_sb_guanyu", "ol_sb_taishici", "ol_sb_yuanshao"], +}; + +const characterSortTranslate = { + onlyOL_yijiang1: "OL专属·将1", + onlyOL_yijiang2: "OL专属·将2", + onlyOL_yijiang3: "OL专属·将3", + onlyOL_sb: "OL专属·上兵伐谋", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/onlyOL/translate.js b/character/onlyOL/translate.js new file mode 100644 index 000000000..b593a0622 --- /dev/null +++ b/character/onlyOL/translate.js @@ -0,0 +1,77 @@ +const translates = { + ol_lingtong: "OL界凌统", + ol_lingtong_prefix: "OL界", + olxuanfeng: "旋风", + olxuanfeng_info: "当你一次性失去至少两张牌后,或失去装备区的牌后,你可以依次弃置一至两名其他角色的共计两张牌。", + ol_jianyong: "OL界简雍", + ol_jianyong_prefix: "OL界", + olqiaoshui: "巧说", + olqiaoshui_info: "出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,此技能于本回合失效且本回合你不能使用锦囊牌。", + ol_caozhang: "OL界曹彰", + ol_caozhang_prefix: "OL界", + oljiangchi: "将驰", + oljiangchi_info: "摸牌阶段结束时,你可以选择一项:①摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。②重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。", + ol_sb_jiangwei: "OL谋姜维", + ol_sb_jiangwei_prefix: "OL谋", + olsbzhuri: "逐日", + olsbzhuri_info: "你的阶段结束时,若你本阶段失去过手牌或得到过牌,则你可以与一名角色拼点。若你赢,你可以使用其中一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合无效。", + olsbranji: "燃己", + olsbranji_info: "限定技,结束阶段。若你本回合使用过牌的阶段数大于等于/小于等于体力值,你可以获得技能〖困奋〗/〖诈降〗(同时满足则都获得,以此法获得的〖困奋〗直接修改为非锁定技)。若如此做,你将手牌数调整至手牌上限或将体力值回复至体力上限,然后你不能回复体力直到你杀死角色。", + kunfenx: "困奋", + kunfenx_info: "结束阶段开始时,你可以失去1点体力,然后摸两张牌。", + ol_sb_guanyu: "OL谋关羽", + ol_sb_guanyu_prefix: "OL谋", + olsbfumeng: "赴梦", + olsbfumeng_info: "一轮游戏开始时,你可以令任意张手牌的牌名视为【杀】。", + olsbguidao: "归刀", + olsbguidao_info: "出牌阶段,你可以重铸两张牌并视为使用一张【决斗】(重铸的【杀】数须比本回合上次发动〖归刀〗重铸的【杀】数多)。目标角色受到此牌伤害时,其须猜测你手牌中牌名为【杀】的牌数量多还是牌名不为【杀】的牌数多,若其猜错,则此【决斗】对其造成的伤害+1。", + ol_sb_taishici: "OL谋太史慈", + ol_sb_taishici_prefix: "OL谋", + olsbdulie: "笃烈", + olsbdulie_info: "每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的唯一目标时,你可以令此牌额外结算一次。若如此做,此牌结算完毕后,你摸X张牌(X为你的攻击范围且至多为5)。", + olsbdouchan: "斗缠", + olsbdouchan_info: "锁定技,准备阶段,你从牌堆中获得一张【决斗】,若牌堆没有【决斗】,则你的攻击范围和出牌阶段使用【杀】的次数上限+1(增加次数不超过游戏人数)。", + olsbweilin: "威临", + olsbweilin_info: "每回合限一次,你可以将一张牌当作任意【杀】或【酒】使用,且你以此法使用的牌指定最后一个目标后,你令所有目标角色本回合与此牌颜色相同的手牌均视为【杀】。", + olsbduoshou: "夺首", + olsbduoshou_info: "锁定技。①你每回合使用的第一张红色牌无距离限制。②你每回合使用的第一张基本牌不计入使用次数。③你每回合第一次造成伤害后,你摸一张牌。", + ol_gaoshun: "OL界高顺", + ol_gaoshun_prefix: "OL界", + olxianzhen: "陷阵", + olxianzhen_info: "出牌阶段限一次,你可以与一名角色拼点。若你赢,本回合你无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标;若你没赢,本回合你不能对其使用【杀】且你的【杀】不计入手牌上限。", + ol_sb_yuanshao: "OL谋袁绍", + ol_sb_yuanshao_prefix: "OL谋", + olsbhetao: "合讨", + olsbhetao_info: "其他角色使用牌执行第一个目标后,若此牌指定的目标数大于1,则你可以弃置一张与此牌颜色相同的牌并令此牌改为对其中一名目标角色结算两次。", + olsbshenli: "神离", + olsbshenli_info: "出牌阶段限一次,当你使用【杀】指定目标后,你可以令所有可成为此牌目标的其他角色均成为此牌目标,此牌结算完毕后,若你因此牌造成的伤害值X:大于你的手牌数,你摸X张牌(至多摸五张);大于你的体力值,你再次对所有目标角色中可以成为此牌目标的角色使用此牌。", + olsbyufeng: "玉锋", + olsbyufeng_sizhaojian: "思召剑", + olsbyufeng_block: "思召剑", + olsbyufeng_info: "游戏开始时,你将【思召剑】置入装备区。", + sizhaojian: "思召剑", + sizhaojian_info: "当你使用有点数的【杀】指定目标后,你令目标角色只能使用无点数或点数大于等于此【杀】的【闪】响应此牌。", + sizhaojian_append: '【思召剑】于闪闪节(3月2日-3月15日)外离开装备区后,销毁此牌', + olsbshishou: "士首", + olsbshishou_info: "主公技,其他群势力角色失去装备区的牌后,若你的装备区中没有武器牌,其可将【思召剑】置入你的装备区。", + ol_yufan: "OL界虞翻", + ol_yufan_prefix: "OL界", + olzongxuan: "纵玄", + olzongxuan_info: "当你或你的上家因弃置而失去牌后,你可以将位于弃牌堆的这些牌中的任意牌以任意顺序置于牌堆顶。", + olzhiyan: "直言", + olzhiyan_info: "你或你的上家的结束阶段,你可以令一名角色正面朝上摸一张牌,然后若此牌:为装备牌,则其使用此牌并回复1点体力;不为装备牌且其体力值大于等于你,则其失去1点体力。", + ol_chengpu: "OL界程普", + ol_chengpu_prefix: "OL界", + dclihuo: "疠火", + dclihuo_info: "①你使用的非火【杀】可以改为火【杀】,若如此做,此牌结算完毕后,若此牌造成过伤害,则你弃置一张牌或失去1点体力。②你使用火【杀】可以额外指定一个目标。", + olchunlao: "醇醪", + olchunlao_info: "①当你的【杀】因弃置进入弃牌堆后,你将位于弃牌堆的这些牌称为“醇”置于武将牌上。②一名角色处于濒死状态时,你可以将一张“醇”置入弃牌堆,然后令其视为使用一张【酒】。", + ol_wangyi: "OL界王异", + ol_wangyi_prefix: "OL界", + olzhenlie: "贞烈", + olzhenlie_info: "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后你选择一项:①获得使用者的一张牌;②发动一次〖秘计〗。", + olmiji: "秘计", + olmiji_info: "结束阶段,若你已受伤,则你可以摸X张牌,然后你可以将至多X张牌任意分配给其他角色(X为你已损失的体力值)。", +}; + +export default translates; diff --git a/character/onlyOL/voices.js b/character/onlyOL/voices.js new file mode 100644 index 000000000..eb6b0fe9c --- /dev/null +++ b/character/onlyOL/voices.js @@ -0,0 +1,60 @@ +export default { + "#olsbzhuri1": "效逐日之夸父,怀忠志而长存。", + "#olsbzhuri2": "知天命而不顺,履穷途而强为。", + "#olsbranji1": "此身为薪,炬成灰亦昭大汉长明!", + "#olsbranji2": "维之一腔骨血,可驱驰来北马否?", + "#ol_sb_jiangwei:die": "姜维姜维……又将何为?", + "#rejiangchi1": "将飞翼伏,三军整肃。", + "#rejiangchi2": "策马扬鞭,奔驰万里。", + "#ol_caozhang:die": "黄须金甲,也难敌骨肉毒心!", + "#reqiaoshui1": "慧心妙舌,难题可解。", + "#reqiaoshui2": "巧言善辩,应对自如。", + "#jyzongshi_re_jianyong1": "能断大事者,不拘小节。", + "#jyzongshi_re_jianyong2": "闲暇自得,威仪不肃。", + "#ol_jianyong:die": "此景竟无言以对。", + "#xuanfeng_re_lingtong1": "短兵相接,让敌人丢盔弃甲!", + "#xuanfeng_re_lingtong2": "攻敌不备,看他们闻风而逃!", + "#ol_lingtong:die": "先……停一下吧……", + "#olsbweilin1": "汝等鼠辈,岂敢与某相抗!", + "#olsbweilin2": "义襄千里,威震华夏!", + "#olsbduoshou1": "今日之敌,必死于我刀下!", + "#olsbduoshou2": "青龙所向,战无不胜!", + "#ol_sb_guanyu:die": "玉碎不改白,竹焚不毁节……", + "#olsbdulie1": "秉同难共患之义,莫敢辞也。", + "#olsbdulie2": "慈赴府君之急,死又何惧尔?", + "#olsbdouchan1": "此时不捉孙策,更待何时!", + "#olsbdouchan2": "有胆气者,都随我来!", + "#ol_sb_taishici:die": "人生得遇知己,死又何憾……", + "#rexianzhen1": "陷阵之志,有死无生!", + "#rexianzhen2": "攻则破城,战则克敌。", + "#rejinjiu1": "耽此黄汤,岂不误事?", + "#rejinjiu2": "陷阵营中,不可饮酒。", + "#ol_gaoshun:die": "可叹主公知而不用啊!", + "#olsbhetao1": "合诸侯之群力,扶大汉之将倾。", + "#olsbhetao2": "猛虎啸于山野,群士执戈相待。", + "#olsbhetao3": "合兵讨贼,其利断金!", + "#olsbshenli1": "沧海之水难覆,将倾之厦难扶。", + "#olsbshenli2": "诸君心怀苟且,安能并力西向?", + "#olsbshenli3": "联军离心,各逐其利。", + "#olsbyufeng1": "梦神人授剑,怀神兵济世。", + "#olsbyufeng2": "哼!我剑也未尝不利!", + "#olsbshishou1": "今执牛耳,当为天下之先。", + "#olsbshishou2": "士者不徒手而战,况其首乎。", + "#olsbshishou3": "吾居群士之首,可配剑履否?", + "#ol_sb_yuanshao:die": "众人合而无力,徒负大义也……", + "#rezongxuan1": "凡夫俗子,怎识得卦象玄妙?", + "#rezongxuan2": "微妙玄通,深不可识。", + "#zhiyan_re_yufan1": "失忠于信,何以侍君!", + "#zhiyan_re_yufan2": "恕臣耿直,犯言谏正!", + "#ol_yufan:die": "唉,主公不能容我啊!", + "#relihuo1": "此火只为全歼敌寇,无需妇人之仁。", + "#relihuo2": "战胜攻取,以火修功。", + "#chunlao_xin_chengpu1": "背下佳酿,以做庆功之用。", + "#chunlao_xin_chengpu2": "饮此壮行酒,当立先头功。", + "#ol_chengpu:die": "箭尽弓折,力竭人亡。", + "#olzhenlie1": null, + "#olzhenlie2": null, + "#olmiji1": null, + "#olmiji2": null, + "#ol_wangyi:die": "月儿,不要责怪你爹爹……", +}; diff --git a/character/refresh/card.js b/character/refresh/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/refresh/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/refresh/character.js b/character/refresh/character.js new file mode 100644 index 000000000..acaf776ec --- /dev/null +++ b/character/refresh/character.js @@ -0,0 +1,135 @@ +const characters = { + re_xushu: ["male", "shu", 4, ["zhuhai", "qianxin"]], + re_lidian: ["male", "wei", 3, ["xunxun", "xinwangxi"]], + re_zhongyao: ["male", "wei", 3, ["rehuomo", "zuoding"], ["clan:颍川钟氏"]], + xin_zhangliang: ["male", "qun", 4, ["rejijun", "refangtong"]], + re_simalang: ["male", "wei", 3, ["requji", "rejunbing"]], + re_zhugedan: ["male", "wei", 4, ["regongao", "rejuyi"]], + re_caorui: ["male", "wei", 3, ["huituo", "remingjian", "rexingshuai"], ["zhu"]], + re_caochong: ["male", "wei", 3, ["rechengxiang", "renxin"]], + ol_zhangzhang: ["male", "wu", 3, ["olzhijian", "olguzheng"]], + re_jsp_huangyueying: ["female", "qun", 3, ["rejiqiao", "relinglong"]], + re_zhangsong: ["male", "shu", 3, ["qiangzhi", "rexiantu"]], + re_zhuzhi: ["male", "wu", 4, ["reanguo"]], + dc_caozhi: ["male", "wei", 3, ["reluoying", "dcjiushi"]], + ol_huangzhong: ["male", "shu", 4, ["xinliegong", "remoshi"]], + re_wenpin: ["male", "wei", 5, ["rezhenwei"]], + re_guanzhang: ["male", "shu", 4, ["fuhun", "retongxin"]], + re_mazhong: ["male", "shu", 4, ["refuman"]], + dc_chenqun: ["male", "wei", 3, ["repindi", "dcfaen"]], + re_sundeng: ["male", "wu", 4, ["rekuangbi"]], + re_caiyong: ["male", "qun", 3, ["rebizhuan", "retongbo"]], + re_chengong: ["male", "qun", 3, ["remingce", "zhichi"]], + re_xunyou: ["male", "wei", 3, ["reqice", "rezhiyu"], ["clan:颍川荀氏"]], + dc_liru: ["male", "qun", 3, ["xinjuece", "dcmieji", "dcfencheng"]], + re_zhuhuan: ["male", "wu", 4, ["refenli", "repingkou"]], + ol_dianwei: ["male", "wei", 4, ["olqiangxi", "olningwu"]], + re_sp_taishici: ["male", "qun", 4, ["rejixu"]], + re_liufeng: ["male", "shu", 4, ["rexiansi"]], + ol_xunyu: ["male", "wei", 3, ["quhu", "oljieming"], ["clan:颍川荀氏"]], + re_liuchen: ["male", "shu", 4, ["rezhanjue", "reqinwang"], ["zhu"]], + dc_gongsunzan: ["male", "qun", 4, ["dcyicong", "dcqiaomeng"]], + re_duji: ["male", "wei", 3, ["reandong", "reyingshi"]], + re_jushou: ["male", "qun", 3, ["dcjianying", "dcshibei"]], + re_zhanghe: ["male", "wei", 4, ["reqiaobian"]], + dc_xushu: ["male", "shu", 4, ["rezhuhai", "xsqianxin"]], + xin_gaoshun: ["male", "qun", 4, ["decadexianzhen", "decadejinjiu"]], + re_guohuanghou: ["female", "wei", 3, ["rejiaozhao", "redanxin"]], + re_xiahoushi: ["female", "shu", 3, ["reqiaoshi", "reyanyu"]], + ol_lusu: ["male", "wu", 3, ["olhaoshi", "oldimeng"]], + re_jiaxu: ["male", "qun", 3, ["rewansha", "reluanwu", "reweimu"]], + re_guyong: ["male", "wu", 3, ["reshenxing", "rebingyi"]], + xin_zhonghui: ["male", "wei", 4, ["xinquanji", "xinzili"], ["clan:颍川钟氏"]], + re_caifuren: ["female", "qun", 3, ["reqieting", "rexianzhou"]], + re_guanping: ["male", "shu", 4, ["relongyin", "jiezhong"]], + re_guotufengji: ["male", "qun", 3, ["rejigong", "shifei"]], + re_zhoucang: ["male", "shu", 4, ["rezhongyong"]], + ol_zhurong: ["female", "shu", 4, ["juxiang", "lieren", "changbiao"]], + re_zhangchunhua: ["female", "wei", 3, ["rejueqing", "reshangshi"]], + re_gongsunyuan: ["male", "qun", 4, ["rehuaiyi"]], + re_caozhen: ["male", "wei", 4, ["residi"]], + re_fuhuanghou: ["female", "qun", 3, ["rezhuikong", "reqiuyuan"]], + re_fazheng: ["male", "shu", 3, ["reenyuan", "rexuanhuo"]], + xin_lingtong: ["male", "wu", 4, ["decadexuanfeng", "yongjin"]], + xin_liubiao: ["male", "qun", 3, ["decadezishou", "decadezongshi"]], + re_caoxiu: ["male", "wei", 4, ["qianju", "reqingxi"]], + re_sunxiu: ["male", "wu", 3, ["reyanzhu", "rexingxue", "zhaofu"], ["zhu"]], + ol_dengai: ["male", "wei", 4, ["oltuntian", "olzaoxian"]], + re_gongsunzan: ["male", "qun", 4, ["reqiaomeng", "reyicong"]], + re_manchong: ["male", "wei", 3, ["rejunxing", "yuce"]], + xin_yufan: ["male", "wu", 3, ["xinzhiyan", "xinzongxuan"]], + dc_bulianshi: ["female", "wu", 3, ["dcanxu", "dczhuiyi"]], + re_hanhaoshihuan: ["male", "wei", 4, ["reshenduan", "reyonglve"]], + re_panzhangmazhong: ["male", "wu", 4, ["reduodao", "reanjian"]], + re_wangyi: ["female", "wei", 4, ["zhenlie", "miji"]], + re_madai: ["male", "shu", 4, ["mashu", "reqianxi"]], + xin_xusheng: ["male", "wu", 4, ["decadepojun"]], + re_taishici: ["male", "wu", 4, ["tianyi", "hanzhan"]], + re_masu: ["male", "shu", 3, ["resanyao", "rezhiman"]], + re_sunluban: ["female", "wu", 3, ["rechanhui", "rejiaojin"]], + xin_handang: ["male", "wu", 4, ["xingongji", "xinjiefan"]], + yujin_yujin: ["male", "wei", 4, ["decadezhenjun"]], + re_caozhang: ["male", "wei", 4, ["xinjiangchi"]], + re_chengpu: ["male", "wu", 4, ["ollihuo", "rechunlao"]], + re_quancong: ["male", "wu", 4, ["xinyaoming"]], + re_liaohua: ["male", "shu", 4, ["xindangxian", "xinfuli"]], + re_guohuai: ["male", "wei", 4, ["decadejingce"]], + re_wuyi: ["male", "shu", 4, ["xinbenxi"], ["clan:陈留吴氏"]], + re_zhuran: ["male", "wu", 4, ["xindanshou"]], + ol_pangtong: ["male", "shu", 3, ["ollianhuan", "olniepan"], []], + re_zhangyi: ["male", "shu", 5, ["rewurong", "reshizhi"]], + xin_wuguotai: ["female", "wu", 3, ["xinganlu", "xinbuyi"]], + re_caocao: ["male", "wei", 4, ["new_rejianxiong", "rehujia"], ["zhu"]], + re_simayi: ["male", "wei", 3, ["refankui", "reguicai"]], + re_guojia: ["male", "wei", 3, ["tiandu", "new_reyiji"]], + re_zhangliao: ["male", "wei", 4, ["new_retuxi"]], + re_xuzhu: ["male", "wei", 4, ["new_reluoyi"]], + re_xiahoudun: ["male", "wei", 4, ["reganglie", "new_qingjian"]], + re_zhangfei: ["male", "shu", 4, ["olpaoxiao", "oltishen"]], + re_zhaoyun: ["male", "shu", 4, ["ollongdan", "olyajiao"]], + re_guanyu: ["male", "shu", 4, ["new_rewusheng", "new_yijue"]], + re_machao: ["male", "shu", 4, ["mashu", "retieji"]], + re_zhouyu: ["male", "wu", 3, ["reyingzi", "refanjian"]], + re_lvmeng: ["male", "wu", 4, ["keji", "qinxue", "rebotu"]], + re_ganning: ["male", "wu", 4, ["qixi", "fenwei"]], + re_luxun: ["male", "wu", 3, ["reqianxun", "relianying"]], + re_daqiao: ["female", "wu", 3, ["reguose", "liuli"]], + re_huanggai: ["male", "wu", 4, ["rekurou", "zhaxiang"]], + re_lvbu: ["male", "qun", 5, ["wushuang", "new_liyu"]], + re_huatuo: ["male", "qun", 3, ["jijiu", "new_reqingnang"]], + re_liubei: ["male", "shu", 4, ["rerende", "rejijiang"], ["zhu"]], + re_diaochan: ["female", "qun", 3, ["lijian", "rebiyue"]], + re_huangyueying: ["female", "shu", 3, ["rejizhi", "reqicai"]], + re_sunquan: ["male", "wu", 4, ["rezhiheng", "rejiuyuan"], ["zhu"]], + re_sunshangxiang: ["female", "wu", 3, ["xiaoji", "rejieyin"]], + re_zhenji: ["female", "wei", 3, ["reluoshen", "reqingguo"]], + re_zhugeliang: ["male", "shu", 3, ["reguanxing", "kongcheng"]], + re_huaxiong: ["male", "qun", 6, ["reyaowu", "shizhan"]], + + re_zhangjiao: ["male", "qun", 3, ["xinleiji", "xinguidao", "xinhuangtian"], ["zhu"]], + xin_yuji: ["male", "qun", 3, ["reguhuo"]], + re_zuoci: ["male", "qun", 3, ["rehuashen", "rexinsheng"]], + + ol_xiahouyuan: ["male", "wei", 4, ["xinshensu", "shebian"]], + caoren: ["male", "wei", 4, ["xinjushou", "xinjiewei"]], + ol_weiyan: ["male", "shu", 4, ["xinkuanggu", "reqimou"]], + ol_xiaoqiao: ["female", "wu", 3, ["oltianxiang", "olhongyan", "piaoling"]], + zhoutai: ["male", "wu", 4, ["buqu", "fenji"]], + ol_pangde: ["male", "qun", 4, ["mashu", "rejianchu"]], + ol_xuhuang: ["male", "wei", 4, ["olduanliang", "oljiezi"]], + ol_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "olhuoji", "olkanpo", "cangzhuo"], []], + ol_yanwen: ["male", "qun", 4, ["olshuangxiong"], []], + ol_yuanshao: ["male", "qun", 4, ["olluanji", "olxueyi"], ["zhu"]], + re_menghuo: ["male", "shu", 4, ["huoshou", "rezaiqi"]], + ol_dongzhuo: ["male", "qun", 8, ["oljiuchi", "roulin", "benghuai", "olbaonue"], ["zhu"]], + ol_sunjian: ["male", "wu", "4/5", ["gzyinghun", "wulie"]], + re_caopi: ["male", "wei", 3, ["rexingshang", "refangzhu", "songwei"], ["zhu"]], + ol_jiangwei: ["male", "shu", 4, ["oltiaoxin", "olzhiji"]], + ol_caiwenji: ["female", "qun", 3, ["olbeige", "duanchang"]], + ol_liushan: ["male", "shu", 3, ["xiangle", "olfangquan", "olruoyu"], ["zhu"]], + + re_sunce: ["male", "wu", 4, ["oljiang", "olhunzi", "olzhiba"], ["zhu"]], + re_jianyong: ["male", "shu", 3, ["reqiaoshui", "jyzongshi"]], +}; + +export default characters; diff --git a/character/refresh/characterFilter.js b/character/refresh/characterFilter.js new file mode 100644 index 000000000..9edfe5e6b --- /dev/null +++ b/character/refresh/characterFilter.js @@ -0,0 +1,7 @@ +const characterFilters = { + re_zuoci(mode) { + return mode != "guozhan"; + }, +}; + +export default characterFilters; diff --git a/character/refresh/characterReplace.js b/character/refresh/characterReplace.js new file mode 100644 index 000000000..2092d9297 --- /dev/null +++ b/character/refresh/characterReplace.js @@ -0,0 +1,3 @@ +const characterReplaces = {}; + +export default characterReplaces; diff --git a/character/refresh/dynamicTranslate.js b/character/refresh/dynamicTranslate.js new file mode 100644 index 000000000..54f855bdc --- /dev/null +++ b/character/refresh/dynamicTranslate.js @@ -0,0 +1,12 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + rejiushi(player) { + if (player.storage.chengzhang) return "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。"; + return "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面并获得牌堆中的一张随机锦囊。"; + }, + rejiaozhao(player) { + return ["出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。", "出牌阶段限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用(你不是此牌的合法目标)。", "出牌阶段每种类型各限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用。"][player.countMark("redanxin")]; + }, +}; +export default dynamicTranslates; diff --git a/character/refresh/index.js b/character/refresh/index.js new file mode 100644 index 000000000..fa33a9f9b --- /dev/null +++ b/character/refresh/index.js @@ -0,0 +1,34 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "refresh", + connect: true, + character: { ...characters }, + characterSort: { + refresh: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/refresh/intro.js b/character/refresh/intro.js new file mode 100644 index 000000000..b1bae3656 --- /dev/null +++ b/character/refresh/intro.js @@ -0,0 +1,8 @@ +const characterIntro = { + jsp_huangyueying: "荆州沔南白水人,沔阳名士黄承彦之女,诸葛亮之妻,诸葛瞻之母。容貌甚丑,而有奇才:上通天文,下察地理,韬略近于诸书无所不晓,诸葛亮在南阳闻其贤而迎娶。", + re_gongsunzan: "群雄之一。出身贵族,因母地位卑贱,只当了郡中小吏。他貌美,声音洪亮,机智善辩。后随卢植于缑氏山中读书,粗通经传。", + re_lidian: "字曼成,曹操麾下将领。李典深明大义,不与人争功,崇尚学习与高贵儒雅,尊重博学之士,在军中被称为长者。李典有长者之风,官至破虏将军,三十六岁去世。魏文帝曹丕继位后追谥号为愍侯。", + sunben: " ", +}; + +export default characterIntro; diff --git a/character/refresh/perfectPairs.js b/character/refresh/perfectPairs.js new file mode 100644 index 000000000..bdb5d5532 --- /dev/null +++ b/character/refresh/perfectPairs.js @@ -0,0 +1,5 @@ +export default { + sunben: ["zhouyu", "taishici", "daqiao"], + re_xushu: ["zhaoyun", "sp_zhugeliang"], + re_guohuai: ["xiahouyuan", "zhanghe"], +}; diff --git a/character/refresh/pinyin.js b/character/refresh/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/refresh/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/refresh/skill.js b/character/refresh/skill.js new file mode 100644 index 000000000..c834b3b1c --- /dev/null +++ b/character/refresh/skill.js @@ -0,0 +1,15400 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + ollianhuan: { + audio: "xinlianhuan", + audioname: ["ol_pangtong"], + hiddenCard: (player, name) => { + return name == "tiesuo" && player.hasCard(card => get.suit(card) == "club", "she"); + }, + filter: function (event, player) { + if (!player.hasCard(card => get.suit(card) == "club", "she")) return false; + return event.type == "phase" || event.filterCard({ name: "tiesuo" }, player, event); + }, + position: "hes", + inherit: "lianhuan", + group: "ollianhuan_add", + subSkill: { + add: { + audio: "xinlianhuan", + audioname: ["ol_pangtong"], + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "tiesuo") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(current => { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); + }) + ) + return true; + } + return false; + }, + charlotte: true, + forced: true, + popup: false, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("ollianhuan"), "为" + get.translation(trigger.card) + "额外指定一个目标", (card, player, target) => { + return !_status.event.sourcex.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("sourcex", trigger.targets) + .set("ai", function (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.delayex(); + } else event.finish(); + "step 2"; + if (result.bool) { + var targets = result.targets; + player.logSkill("ollianhuan_add", targets); + trigger.targets.addArray(targets); + game.log(targets, "也成为了", trigger.card, "的目标"); + } + }, + }, + }, + }, + rehuomo: { + audio: "huomo", + audioname: ["huzhao", "re_zhongyao"], + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (get.type(name) != "basic") return false; + const list = player.getStorage("rehuomo"); + if (list.includes(name)) return false; + return player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "eh"); + }, + filter: function (event, player) { + if ( + event.type == "wuxie" || + !player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "eh") + ) + return false; + const list = player.getStorage("rehuomo"); + for (let name of lib.inpile) { + if (get.type(name) != "basic" || list.includes(name)) continue; + let card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (name == "sha") { + for (let nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + const vcards = []; + const list = player.getStorage("rehuomo"); + for (let name of lib.inpile) { + if (get.type(name) != "basic" || list.includes(name)) continue; + let card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); + if (name == "sha") { + for (let nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name, nature]); + } + } + } + return ui.create.dialog("活墨", [vcards, "vcard"], "hidden"); + }, + check: function (button) { + const player = _status.event.player; + const card = { name: button.link[2], nature: button.link[3] }; + if ( + game.hasPlayer(function (current) { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + switch (button.link[2]) { + case "tao": + return 5; + case "jiu": + return 3.01; + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder") return 2.92; + else return 2.9; + case "shan": + return 1; + } + } + return 0; + }, + backup: function (links, player) { + return { + check: function (card) { + return 1 / Math.max(0.1, get.value(card)); + }, + filterCard: function (card) { + return get.type(card) != "basic" && get.color(card) == "black"; + }, + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, + }, + position: "he", + popname: true, + ignoreMod: true, + precontent: function () { + player.logSkill("rehuomo"); + var card = event.result.cards[0]; + game.log(player, "将", card, "置于牌堆顶"); + player.loseToDiscardpile(card, ui.cardPile, "visible", "insert").log = false; + var viewAs = { + name: event.result.card.name, + nature: event.result.card.nature, + }; + event.result.card = viewAs; + event.result.cards = []; + if (!player.storage.rehuomo) { + player.when({ global: "phaseAfter" }).then(() => { + player.unmarkSkill("rehuomo"); + }); + } + player.markAuto("rehuomo", viewAs.name); + }, + }; + }, + prompt: function (links, player) { + return "将一张黑色非基本牌置于牌堆顶并视为使用一张" + get.translation(links[0][3] || "") + get.translation(links[0][2]); + }, + }, + marktext: "墨", + intro: { + content: "本回合已因〖活墨〗使用过$", + onunmark: true, + }, + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + var list = player.getStorage("rehuomo"); + if (!list.includes("jiu") && event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0) { + return 3.1; + } + return 2.9; + }, + respondSha: true, + fireAttack: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "fireAttack") return true; + if ( + player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "he") + ) { + var list = player.getStorage("rehuomo"); + if (tag == "respondSha") { + if (arg != "use") return false; + if (list.includes("sha")) return false; + } else if (tag == "respondShan") { + if (list.includes("shan")) return false; + } + } else { + return false; + } + }, + result: { + player: 1, + }, + }, + }, + //界张梁 + rejijun: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return event.targets && event.targets.includes(player); + }, + frequent: true, + content: function () { + player.judge(card => 1).callback = lib.skill.rejijun.callback; + }, + callback: function () { + if (typeof card.number == "number") player.addToExpansion(card, "gain2").gaintag.add("rejijun"); + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + marktext: "方", + ai: { combo: "refangtong" }, + }, + refangtong: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h"); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard(get.prompt2("refangtong"), (card, player) => typeof card.number == "number") + .set("ai", card => { + var player = _status.event.player; + if (!game.hasPlayer(target => target != player && get.damageEffect(target, player, player, "thunder") > 0)) return 0; + if ( + player.getExpansions("rejijun").reduce(function (num, card) { + return num + get.number(card, false); + }, 0) > 36 + ) + return 1 / (get.value(card) || 0.5); + else { + if (lib.skill.refangtong.thunderEffect(card, player)) return 10 - get.value(card); + return 5 - get.value(card); + } + }); + "step 1"; + if (result.bool) { + player.logSkill("refangtong"); + player.addToExpansion(result.cards, player, "give").gaintag.add("rejijun"); + } else event.finish(); + "step 2"; + player.chooseButton(["###是否移去任意张“方”,对一名其他角色造成1点雷属性伤害?###若你移去的“方”的点数和大于36,则改为造成3点雷属性伤害", player.getExpansions("rejijun")], [1, player.getExpansions("rejijun").length]).set("ai", button => { + var player = _status.event.player; + var cards = player.getExpansions("rejijun"); + if ( + cards.reduce(function (num, card) { + return num + get.number(card, false); + }, 0) <= 36 + ) { + if (!ui.selected.buttons.length) return 1 / get.number(button.link, false); + return 0; + } else { + var num = 0, + list = []; + cards.sort((a, b) => get.number(b, false) - get.number(a, false)); + for (var i = 0; i < cards.length; i++) { + list.push(cards[i]); + num += get.number(cards[i], false); + if (num > 36) break; + } + return list.includes(button.link) ? 1 : 0; + } + }); + "step 3"; + if (result.bool) { + var bool = + result.links.reduce(function (num, card) { + return num + get.number(card, false); + }, 0) > 36; + event.bool = bool; + player.loseToDiscardpile(result.links); + player.chooseTarget("请选择一名其他角色", "对其造成" + (bool ? 3 : 1) + "点雷属性伤害", lib.filter.notMe).set("ai", target => get.damageEffect(target, _status.event.player, _status.event.player, "thunder")); + } else event.finish(); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + target.damage(event.bool ? 3 : 1, "thunder"); + } + }, + thunderEffect: function (card, player) { + var cards = player.getExpansions("rejijun"), + num = 0; + cards.push(card); + if ( + cards.reduce(function (num, card) { + return num + get.number(card, false); + }, 0) <= 36 + ) + return false; + cards.sort((a, b) => get.number(b, false) - get.number(a, false)); + var bool = false; + for (var i = 0; i < cards.length; i++) { + if (cards[i] == card) bool = true; + num += get.number(cards[i], false); + if (num > 36) break; + } + return bool; + }, + ai: { combo: "rejijun" }, + }, + //界司马朗 + requji: { + inherit: "quji", + content: function () { + "step 0"; + target.recover(); + "step 1"; + if (target.isDamaged()) target.draw(); + "step 2"; + if (target == targets[targets.length - 1] && cards.some(card => get.color(card, player) == "black")) player.loseHp(); + }, + }, + rejunbing: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player.countCards("h") < event.player.getHp(); + }, + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + event.player = player; + event.target = target; + target.chooseBool(target == player ? get.prompt("rejunbing") : "是否响应" + get.translation(player) + "的【郡兵】?", "摸一张牌" + (target == player ? "" : ",将所有手牌交给" + get.translation(player) + ",然后其可以交给你等量张牌")).set("choice", get.attitude(target, player) > 0); + "step 1"; + if (result.bool) { + player.logSkill("rejunbing", target); + if (target != player) game.log(target, "响应了", player, "的", "#g【郡兵】"); + target.draw(); + } else event.finish(); + "step 2"; + var cards = target.getCards("h"); + if (target == player || !cards.length) { + event.finish(); + return; + } + target.give(cards, player); + event.num = cards.length; + "step 3"; + if (player.countCards("he") < num) event.finish(); + else + player + .chooseCard("郡兵:是否还给" + get.translation(target) + get.translation(num) + "张牌?", "he", num) + .set("ai", card => { + var player = _status.event.player; + var target = _status.event.target; + if (get.attitude(player, target) <= 0) { + if (card.name == "du") return 1145141919810; + return -get.value(card); + } + return 6 - get.value(card); + }) + .set("target", target); + "step 4"; + if (result.bool) player.give(result.cards, target); + }, + }, + //界诸葛诞 + regongao: { + audio: 2, + trigger: { global: "dying" }, + filter: function (event, player) { + if (player == event.player) return false; + return !player.getAllHistory("useSkill", evt => evt.skill == "regongao" && evt.targets[0] == event.player).length; + }, + forced: true, + logTarget: "player", + content: function () { + player.gainMaxHp(); + player.recover(); + }, + }, + rejuyi: { + unique: true, + audio: 2, + derivation: ["benghuai", "reweizhong"], + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.maxHp > game.countPlayer() && player.isDamaged(); + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + player.awakenSkill("rejuyi"); + "step 1"; + player.drawTo(player.maxHp); + "step 2"; + player.addSkills(["benghuai", "reweizhong"]); + }, + }, + reweizhong: { + audio: 2, + inherit: "weizhong", + content: function () { + player.draw(2); + }, + }, + //堪比界曹冲的界曹叡 + remingjian: { + inherit: "mingjian", + content: function () { + player.give(cards, target); + target.addTempSkill("remingjian_buff", { player: "phaseAfter" }); + if (!target.storage.remingjian_buff) target.storage.remingjian_buff = []; + target.storage.remingjian_buff.push(player); + target.markSkill("remingjian_buff"); + }, + subSkill: { + buff: { + charlotte: true, + mark: true, + marktext: "鉴", + intro: { + content: (storage, player) => { + const num = storage.length; + return `
  • 被${get.translation(storage.toUniqued())}鉴识
  • 手牌上限+${num},出杀次数+${num}`; + }, + }, + onremove: true, + trigger: { + source: "damageSource", + }, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + return player.getHistory("sourceDamage").indexOf(event) == 0 && player.getStorage("remingjian_buff").some(i => i.isIn()); + }, + content: function* (event, map) { + const player = map.player; + const masters = player + .getStorage("remingjian_buff") + .filter(i => i.isIn()) + .toUniqued() + .sortBySeat(_status.currentPhase); + while (masters.length) { + const master = masters.shift(); + if (!master.isIn()) continue; + const result = yield player.chooseBool(`是否令${get.translation(master)}发动一次〖恢拓〗?`).set("choice", get.attitude(player, master) > 0); + if (!result.bool) continue; + if (!player.isUnderControl(true) && !event.isOnline()) game.delayx(); + player.logSkill("remingjian_buff", master); + const next = game.createEvent("huituo"); + next.setContent(lib.skill.huituo.content); + next.player = master; + next.forced = true; + next._trigger = map.trigger; + yield next; + } + }, + mod: { + maxHandcard: function (player, num) { + return num + player.getStorage("remingjian_buff").length; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.getStorage("remingjian_buff").length; + }, + }, + }, + }, + }, + rexingshuai: { + audio: 2, + skillAnimation: true, + animationColor: "thunder", + trigger: { player: "dying" }, + zhuSkill: true, + filter: function (event, player) { + if (player.hp > 0) return false; + if (!player.hasZhuSkill("rexingshuai")) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wei"; + }); + }, + limited: true, + mark: true, + content: function () { + "step 0"; + player.awakenSkill("rexingshuai"); + var targets = game.filterPlayer(); + targets.sortBySeat(_status.currentPhase); + targets.remove(player); + event.targets = targets; + event.damages = []; + player.addSkill("rexingshuai_restore"); + "step 1"; + if (event.targets.length) { + var current = event.targets.shift(); + if (current.group == "wei") { + current + .chooseBool("是否令" + get.translation(player) + "回复1点体力?") + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.target) > 2; + }) + .set("target", player); + event.current = current; + } else { + event.redo(); + } + } else { + event.goto(3); + } + "step 2"; + if (result.bool) { + event.damages.push(event.current); + event.current.line(player, "green"); + game.log(event.current, "令", player, "回复1点体力"); + player.recover(); + } + if (event.targets.length) { + event.goto(1); + } + "step 3"; + if (event.damages.length) { + var next = game.createEvent("rexingshuai_next"); + event.next.remove(next); + trigger.after.push(next); + next.targets = event.damages; + next.setContent(function () { + targets.shift().damage(); + if (targets.length) event.redo(); + }); + } + }, + subSkill: { + restore: { + trigger: { + global: "dieAfter", + }, + charlotte: true, + forced: true, + filter: function (event, player) { + return event.source && event.source.isIn() && event.source.hasSkill("mingjian2"); + }, + content: function () { + player.restoreSkill("rexingshuai"); + game.log(player, "重置了", "#g【兴衰】"); + }, + }, + }, + }, + //不想突破可以不突破的界曹冲 + rechengxiang: { + audio: 2, + group: "rechengxiang_gain", + trigger: { + player: "rechengxiang_gainEnd", + }, + direct: true, + subfrequent: ["gain"], + filter: function (event, player) { + return ( + event.cards2 && + event.cards2 + .map(card => { + return get.number(card); + }) + .reduce((sum, num) => { + return (sum += num); + }, 0) == 13 + ); + }, + content: function () { + "step 0"; + player.link(false); + "step 1"; + player.turnOver(false); + }, + subSkill: { + gain: { + inherit: "chengxiang", + audio: "rechengxiang", + }, + }, + }, + //OL界二张 + olzhijian: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + filterCard: function (card) { + return get.type(card) == "equip"; + }, + position: "he", + check: function (card) { + var player = _status.currentPhase; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); + } + return 6 - get.value(card); + }, + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + return player != target && target.canEquip(card, true); + }, + content: function () { + target.equip(cards[0]); + player.draw(); + }, + discard: false, + lose: false, + prepare: function (cards, player, targets) { + player.$give(cards, targets[0], false); + }, + ai: { + basic: { + order: 10, + }, + result: { + target: function (player, target) { + var card = ui.selected.cards[0]; + if (card) return get.effect(target, card, target, target); + return 0; + }, + }, + threaten: 1.35, + }, + }, + olguzheng: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], + }, + filter: function (event, player) { + if (event.type != "discard") return false; + if (player.hasSkill("olguzheng_used")) return false; + var phaseName; + for (var name of lib.phaseName) { + var evt = event.getParent(name); + if (!evt || evt.name != name) continue; + phaseName = name; + break; + } + if (!phaseName) return false; + return game.hasPlayer(current => { + if (current == player) return false; + var evt = event.getl(current); + if (!evt || !evt.cards2 || evt.cards2.filterInD("d").length < 2) return false; + return true; + }); + }, + checkx: function (event, player, cards) { + if (cards.length > 2 || get.attitude(player, event.player) > 0) return true; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i], event.player, "raw") < 0) return true; + } + return false; + }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + var targets = [], + cardsList = []; + var players = game.filterPlayer().sortBySeat(_status.currentPhase); + for (var current of players) { + if (current == player) continue; + var cards = []; + var evt = trigger.getl(current); + if (!evt || !evt.cards2) continue; + var cardsx = evt.cards2.filterInD("d"); + cards.addArray(cardsx); + if (cards.length) { + targets.push(current); + cardsList.push(cards); + } + } + event.targets = targets; + event.cardsList = cardsList; + "step 1"; + var target = targets.shift(); + var cards = event.cardsList.shift(); + event.target = target; + event.cards = cards; + player + .chooseButton(2, [get.prompt("olguzheng", target), '被选择的牌将成为对方收回的牌', cards, [["获得剩余的牌", "放弃剩余的牌"], "tdnodes"]]) + .set("filterButton", function (button) { + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) return false; + return true; + }) + .set("check", lib.skill.olguzheng.checkx(trigger, player, cards)) + .set("ai", function (button) { + if (typeof button.link == "string") { + return button.link == "获得剩余的牌" ? 1 : 0; + } + if (_status.event.check) { + return 20 - get.value(button.link, _status.event.getTrigger().player); + } + return 0; + }) + .setHiddenSkill("olguzheng"); + "step 2"; + if (result.bool) { + player.logSkill("olguzheng", target); + player.addTempSkill("olguzheng_used", ["phaseZhunbeiAfter", "phaseDrawAfter", "phaseJudgeAfter", "phaseUseAfter", "phaseDiscardAfter", "phaseJieshuAfter"]); + if (typeof result.links[0] != "string") result.links.reverse(); + var card = result.links[1]; + target.gain(card, "gain2"); + event.cards.remove(card); + if (result.links[0] != "获得剩余的牌") event.finish(); + } else if (event.targets.length) event.goto(1); + else event.finish(); + "step 3"; + var cards = cards.filterInD("d"); + if (cards.length > 0) player.gain(cards, "gain2"); + }, + ai: { + threaten: 1.3, + expose: 0.2, + }, + subSkill: { + used: { + charlotte: true, + }, + }, + }, + //SP黄月英 + rejiqiao: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("rejiqiao"), [1, player.countCards("he")], "he") + .set("ai", function (card) { + if (card.name == "bagua") return 10; + return 7 - get.value(card); + }) + .set("logSkill", "rejiqiao"); + "step 1"; + if (result.bool) { + var num = result.cards.length; + for (var i of result.cards) { + if (get.type(i, false) == "equip") num++; + } + event.cards = game.cardsGotoOrdering(get.cards(num)).cards; + player.showCards(event.cards); + } else { + event.finish(); + } + "step 2"; + var gained = []; + var tothrow = []; + for (var i = 0; i < event.cards.length; i++) { + if (get.type(event.cards[i]) != "equip") { + gained.push(event.cards[i]); + } else { + tothrow.push(event.cards[i]); + } + } + player.gain(gained, "gain2"); + }, + ai: { + threaten: 1.6, + }, + }, + relinglong: { + audio: 2, + trigger: { + player: ["loseAfter", "disableEquipAfter", "enableEquipAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter", "phaseBefore"], + }, + forced: true, + onremove: true, + derivation: "reqicai", + filter: function (event, player) { + if (event.name == "disableEquip" || event.name == "enableEquip") { + if (!event.slots.includes("equip5")) return false; + } else if (event.name != "phase" && (event.name != "equip" || event.player != player)) { + var evt = event.getl(player); + if (!evt || !evt.es || !evt.es.some(i => get.subtypes(i).includes("equip5"))) return false; + } + var skills = player.additionalSkills["relinglong"]; + return (skills && skills.length > 0) != player.hasEmptySlot(5); + }, + direct: true, + content: function () { + player.removeAdditionalSkill("relinglong"); + if (player.hasEmptySlot(5)) { + player.addAdditionalSkill("relinglong", ["reqicai"]); + } + }, + group: ["linglong_bagua", "relinglong_directhit"], + mod: { + maxHandcard: function (player, num) { + if (!player.hasEmptySlot(3) || !player.hasEmptySlot(4)) return; + return num + 2; + }, + }, + subSkill: { + directhit: { + audio: "relinglong", + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha" && get.type(event.card, false) != "trick") return false; + for (var i = 2; i < 6; i++) { + if (!player.hasEmptySlot(i)) return false; + } + return true; + }, + content: function () { + trigger.directHit.addArray(game.players); + game.log(trigger.card, "不可被响应"); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.card || !arg.target || (arg.card.name != "sha" && get.type(arg.card, false) != "trick")) return false; + for (var i = 2; i < 6; i++) { + if (!player.hasEmptySlot(i)) return false; + } + return true; + }, + }, + }, + }, + }, + //张松 + rexiantu: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player != player; + }, + logTarget: "player", + check: function (event, player) { + if (get.attitude(_status.event.player, event.player) < 1) return false; + return player.hp > 1 || player.hasCard(card => (get.name(card) === "tao" || get.name(card) === "jiu") && lib.filter.cardEnabled(card, player), "hs"); + }, + content: function () { + "step 0"; + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); + player.draw(2); + "step 1"; + var cards = player.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length <= 2) event._result = { cards: cards }; + else + player.chooseCard(2, "he", true, "交给" + get.translation(trigger.player) + "两张牌").set("ai", function (card) { + if (ui.selected.cards.length && card.name == ui.selected.cards[0].name) return -1; + if (get.tag(card, "damage")) return 1; + if (get.type(card) == "equip") return 1; + return 0; + }); + "step 2"; + player.give(result.cards, trigger.player); + trigger.player.addTempSkill("rexiantu_check", "phaseUseAfter"); + trigger.player.markAuto("rexiantu_check", [player]); + }, + ai: { + threaten: function (player, target) { + return ( + 1 + + game.countPlayer(current => { + if (current != target && get.attitude(target, current) > 0) return 0.5; + return 0; + }) + ); + }, + expose: 0.3, + }, + subSkill: { + check: { + charlotte: true, + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + onremove: true, + filter: function (event, player) { + return !player.getHistory("sourceDamage", evt => { + return evt.getParent("phaseUse") == event; + }).length; + }, + content: function () { + var targets = player.getStorage("rexiantu_check"); + targets.sortBySeat(); + for (var i of targets) { + if (i.isIn()) { + i.loseHp(); + } + } + player.removeSkill("rexiantu_check"); + }, + }, + }, + }, + //新服公孙瓒 + dcyicong: { + trigger: { + player: ["changeHp"], + }, + audio: 2, + forced: true, + filter: function (event, player) { + return get.sgn(player.getDamagedHp() - 1.5) != get.sgn(player.getDamagedHp() - 1.5 + event.num); + }, + content: function () {}, + mod: { + globalFrom: function (from, to, current) { + return current - 1; + }, + globalTo: function (from, to, current) { + if (to.getDamagedHp() >= 2) return current + 1; + }, + }, + ai: { + threaten: 0.8, + }, + }, + //朱治 + reanguo: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + if (target.isMinHandcard()) { + target.draw(); + event.h = true; + } + "step 1"; + if (target.isMinHp() && target.isDamaged()) { + target.recover(); + event.hp = true; + } + "step 2"; + var equip = get.cardPile(function (card) { + return get.type(card) == "equip" && target.hasUseTarget(card); + }); + if (target.isMinEquip() && equip) { + target.chooseUseTarget(equip, "nothrow", "nopopup", true); + event.e = true; + } + "step 3"; + game.updateRoundNumber(); + if (!event.h && player.isMinHandcard()) { + player.draw(); + event.h = true; + } + "step 4"; + if (!event.hp && player.isMinHp() && player.isDamaged()) { + player.recover(); + event.hp = true; + } + "step 5"; + if (!event.e && player.isMinEquip()) { + var equip = get.cardPile(function (card) { + return get.type(card) == "equip" && player.hasUseTarget(card); + }); + if (equip) { + player.chooseUseTarget(equip, "nothrow", "nopopup", true); + event.e = true; + } + } + "step 6"; + if (event.h && event.hp && event.e) { + player.chooseCard("安国:是否重铸任意张牌?", [1, Infinity], lib.filter.cardRecastable, "he").set("ai", card => { + return 6 - get.value(card); + }); + } else event.finish(); + "step 7"; + if (result.bool) { + player.recast(result.cards); + } + }, + ai: { + threaten: 1.65, + order: 9, + result: { + player: function (player, target) { + if (get.attitude(player, target) <= 0) { + if (target.isMinHandcard() || target.isMinEquip() || target.isMinHp()) return -1; + } + var num = 0; + if (player.isMinHandcard() || target.isMinHandcard()) num++; + if (player.isMinEquip() || target.isMinEquip()) num++; + if ((player.isMinHp() && player.isDamaged()) || (target.isMinHp() && target.isDamaged())) num += 2.1; + return num; + }, + }, + }, + }, + //颜良文丑 + olshuangxiong: { + audio: 2, + trigger: { player: "phaseDrawEnd" }, + direct: true, + filter: (event, player) => player.countCards("he") > 0, + content: function () { + "step 0"; + player + .chooseToDiscard("he", get.prompt("olshuangxiong"), "弃置一张牌,然后你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用") + .set("ai", function (card) { + let player = _status.event.player; + if (!_status.event.goon || player.skipList.includes("phaseUse")) return -get.value(card); + let color = get.color(card), + effect = 0, + cards = player.getCards("hes"), + sha = false; + for (var cardx of cards) { + if (cardx == card || get.color(cardx) == color) continue; + var cardy = get.autoViewAs({ name: "juedou" }, [cardx]), + eff1 = player.getUseValue(cardy); + if (get.position(cardx) == "e") { + var eff2 = get.value(cardx); + if (eff1 > eff2) effect += eff1 - eff2; + continue; + } else if (get.name(cardx) == "sha") { + if (sha) { + effect += eff1; + continue; + } else sha = true; + } + var eff2 = player.getUseValue(cardx, null, true); + if (eff1 > eff2) effect += eff1 - eff2; + } + return effect - get.value(card); + }) + .set("goon", player.hasValueTarget({ name: "juedou" }) && !player.hasSkill("olshuangxiong_effect")).logSkill = "olshuangxiong"; + "step 1"; + if (result.bool) { + var color = get.color(result.cards[0], player); + player.markAuto("olshuangxiong_effect", [color]); + player.addTempSkill("olshuangxiong_effect"); + } + }, + group: "olshuangxiong_jianxiong", + subSkill: { + effect: { + audio: "olshuangxiong", + enable: "chooseToUse", + viewAs: { name: "juedou" }, + position: "hes", + viewAsFilter: function (player) { + return player.hasCard(card => lib.skill.olshuangxiong_effect.filterCard(card, player), "hes"); + }, + filterCard: function (card, player) { + var color = get.color(card), + colors = player.getStorage("olshuangxiong_effect"); + for (var i of colors) { + if (color != i) return true; + } + return false; + }, + prompt: function () { + var colors = _status.event.player.getStorage("olshuangxiong_effect"); + var str = "将一张颜色"; + for (var i = 0; i < colors.length; i++) { + if (i > 0) str += "或"; + str += "不为"; + str += get.translation(colors[i]); + } + str += "的牌当做【决斗】使用"; + return str; + }, + check: function (card) { + var player = _status.event.player; + if (get.position(card) == "e") { + var raw = get.value(card); + var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card])); + return eff - raw; + } + var raw = player.getUseValue(card, null, true); + var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card])); + return eff - raw; + }, + onremove: true, + charlotte: true, + ai: { order: 7 }, + }, + jianxiong: { + audio: "olshuangxiong", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.hasHistory("damage", function (evt) { + //Disable Umi Kato's chaofan + return evt.card && evt.cards && evt.cards.some(card => get.position(card, true)); + }); + }, + content: function () { + var cards = []; + player.getHistory("damage", function (evt) { + if (evt.card && evt.cards) cards.addArray(evt.cards.filter(card => get.position(card, true))); + }); + if (cards.length) player.gain(cards, "gain2"); + }, + }, + }, + }, + //新李典 + xinwangxi: { + audio: "wangxi", + trigger: { player: "damageEnd", source: "damageSource" }, + filter: function (event) { + if (event._notrigger.includes(event.player)) return false; + return event.num && event.source && event.player && event.player.isIn() && event.source.isIn() && event.source != event.player; + }, + check: function (event, player) { + if (player.isPhaseUsing()) return true; + if (event.player == player) return get.attitude(player, event.source) > -5; + return get.attitude(player, event.player) > -5; + }, + logTarget: function (event, player) { + if (event.player == player) return event.source; + return event.player; + }, + preHidden: true, + content: function () { + "step 0"; + event.count = trigger.num; + event.target = lib.skill.xinwangxi.logTarget(trigger, player); + "step 1"; + player.draw(2); + event.count--; + "step 2"; + var cards = player.getCards("he"); + if (cards.length > 0 && target.isIn()) { + if (cards.length == 1) event._result = { bool: true, cards: cards }; + else player.chooseCard("he", "忘隙:交给" + get.translation(target) + "一张牌", true); + } else event.goto(4); + "step 3"; + if (result.bool) { + player.give(result.cards, target); + } + "step 4"; + if (event.count && target.isIn() && player.hasSkill("xinwangxi")) { + player.chooseBool(get.prompt2("xinwangxi", target)); + } else event.finish(); + "step 5"; + if (result.bool) { + player.logSkill("xinwangxi", target); + event.goto(1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + }, + }, + //OL界火诸葛 + olhuoji: { + audio: "rehuoji", + audioname: ["ol_sp_zhugeliang"], + trigger: { player: "huogongBegin" }, + forced: true, + locked: false, + popup: false, + group: "olhuoji_viewAs", + content: function () { + trigger.setContent(lib.skill.olhuoji.huogongContent); + }, + huogongContent: function () { + "step 0"; + if (target.countCards("h") == 0) { + event.finish(); + return; + } + event._result = { cards: target.getCards("h").randomGets(1) }; + "step 1"; + target.showCards(result.cards).setContent(function () {}); + event.dialog = ui.create.dialog(get.translation(target) + "展示的手牌", result.cards); + event.videoId = lib.status.videoId++; + + game.broadcast("createDialog", event.videoId, get.translation(target) + "展示的手牌", result.cards); + game.addVideo("cardDialog", null, [get.translation(target) + "展示的手牌", get.cardsInfo(result.cards), event.videoId]); + event.card2 = result.cards[0]; + game.log(target, "展示了", event.card2); + event._result = {}; + player + .chooseToDiscard({ color: get.color(event.card2) }, "he", function (card) { + var evt = _status.event.getParent(); + if (get.damageEffect(evt.target, evt.player, evt.player, "fire") > 0) { + return 7 - get.value(card, evt.player); + } + return -1; + }) + .set("prompt", false); + game.delay(2); + "step 2"; + if (result.bool) { + target.damage("fire"); + } else { + target.addTempSkill("huogong2"); + } + event.dialog.close(); + game.addVideo("cardDialog", null, event.videoId); + game.broadcast("closeDialog", event.videoId); + }, + subSkill: { viewAs: { inherit: "rehuoji", audio: "rehuoji" } }, + }, + olkanpo: { + audio: "rekanpo", + audioname: ["ol_sp_zhugeliang", "ol_pangtong"], + trigger: { player: "useCard" }, + forced: true, + locked: false, + popup: false, + group: "olkanpo_viewAs", + filter: function (event, player) { + return event.card.name == "wuxie"; + }, + content: function () { + trigger.directHit.addArray(game.players); + }, + subSkill: { viewAs: { inherit: "rekanpo", audio: "rekanpo" } }, + }, + //新杀界曹植 + dcjiushi: { + audio: 2, + trigger: { + player: "useCardAfter", + }, + filter: function (event, player) { + return event.card.name == "jiu"; + }, + forced: true, + locked: false, + content: function () { + player.addTempSkill("dcjiushi_sha", { player: "phaseEnd" }); + player.addMark("dcjiushi_sha", 1, false); + }, + group: ["dcjiushi_use", "dcjiushi_record", "dcjiushi_damage"], + subSkill: { + use: { + audio: "dcjiushi", + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (name == "jiu") return !player.isTurnedOver(); + return false; + }, + filter: function (event, player) { + if (player.isTurnedOver()) return false; + return event.filterCard({ name: "jiu", isCard: true }, player, event); + }, + content: function () { + if (_status.event.getParent(2).type == "dying") { + event.dying = player; + event.type = "dying"; + } + player.turnOver(); + player.useCard({ name: "jiu", isCard: true }, player); + }, + ai: { + order: 5, + result: { + player: function (player) { + if (_status.event.parent.name == "phaseUse") { + if (player.countCards("h", "jiu") > 0) return 0; + if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1) return 0; + if (!player.countCards("h", "sha")) return 0; + var targets = []; + var target; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) < 0) { + if (player.canUse("sha", players[i], true, true)) { + targets.push(players[i]); + } + } + } + if (targets.length) { + target = targets[0]; + } else { + return 0; + } + var num = get.effect(target, { name: "sha" }, player, player); + for (var i = 1; i < targets.length; i++) { + var num2 = get.effect(targets[i], { name: "sha" }, player, player); + if (num2 > num) { + target = targets[i]; + num = num2; + } + } + if (num <= 0) return 0; + var e2 = target.getEquip(2); + if (e2) { + if (e2.name == "tengjia") { + if ( + !player.countCards("h", { + name: "sha", + nature: "fire", + }) && + !player.getEquip("zhuque") + ) + return 0; + } + if (e2.name == "renwang") { + if (!player.countCards("h", { name: "sha", color: "red" })) return 0; + } + if (e2.name == "baiyin") return 0; + } + if (player.getEquip("guanshi") && player.countCards("he") > 2) return 1; + return target.countCards("h") > 3 ? 0 : 1; + } + if (player == _status.event.dying || player.isTurnedOver()) return 3; + }, + }, + effect: { + target: function (card, player, target) { + if (card.name == "guiyoujie") return [0, 0.5]; + if (target.isTurnedOver()) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target.hp == 1) return; + return [1, target.countCards("h") / 2]; + } + } + }, + }, + }, + }, + record: { + trigger: { player: "damageBegin3" }, + silent: true, + firstDo: true, + filter: function (event, player) { + return player.isTurnedOver(); + }, + content: function () { + trigger.dcjiushi = true; + }, + }, + damage: { + audio: "dcjiushi", + trigger: { player: "damageEnd" }, + check: function (event, player) { + return player.isTurnedOver(); + }, + prompt: "是否发动【酒诗】,将武将牌翻面?", + filter: function (event, player) { + if (event.dcjiushi) { + return true; + } + return false; + }, + content: function () { + delete trigger.dcjiushi; + player.turnOver(); + }, + }, + sha: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("dcjiushi_sha"); + }, + }, + }, + }, + }, + //OL界黄忠 + remoshi: { + audio: 2, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + return event.player.isIn() && event.card && event.card.name == "sha" && event.cards.filterInD("od").length && event.notLink() && [2, 3, 4].some(i => event.player.getEquips(i).length > 0); + }, + group: "remoshi_retrieve", + content: function () { + trigger.player.addSkill("remoshi_stuck"); + trigger.player.addToExpansion(trigger.cards.filterInD("od"), "gain2").gaintag.add("remoshi_stuck"); + }, + subSkill: { + retrieve: { + audio: "remoshi", + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + var keys = ["equip2", "equip3", "equip4"]; + return game.hasPlayer(current => { + if (event.name == "gain" && current == player) return false; + var cards = current.getExpansions("remoshi_stuck"); + if (!cards.length) return false; + var evt = event.getl(current); + if (evt && evt.cards2 && evt.cards2.some(i => get.subtypes(i).some(slot => keys.includes(slot)))) return true; + }); + }, + direct: true, + forced: true, + content: function () { + "step 0"; + var keys = ["equip2", "equip3", "equip4"]; + var targets = game.filterPlayer(current => { + var cards = current.getExpansions("remoshi_stuck"); + if (!cards.length) return false; + var evt = trigger.getl(current); + if (evt && evt.cards2 && evt.cards2.some(i => get.subtypes(i).some(slot => keys.includes(slot)))) return true; + }); + event.targets = targets; + "step 1"; + var target = targets.shift(); + var cards = target.getExpansions("remoshi_stuck"); + if (cards.length) { + player.logSkill("remoshi_retrieve", target); + player.gain(cards, target, "give", "bySelf"); + game.delayx(); + } + if (targets.length) event.redo(); + }, + }, + stuck: { + marktext: "矢", + charlotte: true, + intro: { + name: "没矢", + name2: "矢", + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + }, + }, + }, + //界文聘 + rezhenwei: { + audio: "zhenwei", + inherit: "zhenwei", + filter: function (event, player) { + if (player == event.target) return false; + if (!player.countCards("he")) return false; + if (event.targets.length > 1) return false; + if (!event.target) return false; + if (event.target.hp > player.hp) return false; + var card = event.card; + if (card.name == "sha") return true; + if (get.color(card) == "black" && get.type(card, "trick") == "trick") return true; + return false; + }, + }, + //界关张…… + retongxin: { + mod: { + attackRange: (player, num) => num + 2, + }, + }, + //马忠 + refuman: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + if (target == player) return false; + var stat = player.getStat("skill").refuman_targets; + return !stat || !stat.includes(target); + }, + filter: function (event, player) { + return player.countCards("h") > 0 && game.hasPlayer(current => lib.skill.refuman.filterTarget(null, player, current)); + }, + filterCard: true, + content: function () { + var card = get.discardPile(card => card.name == "sha"); + if (card) { + target.gain(card, "gain2").gaintag.add("refuman"); + target.addTempSkill("refuman2", { player: "phaseAfter" }); + player.addSkill("refuman_draw"); + } + var stat = player.getStat("skill"); + if (!stat.refuman_targets) stat.refuman_targets = []; + stat.refuman_targets.push(target); + }, + check: function (card) { + return get.discardPile(card => card.name == "sha") ? 6 - get.value(card) : 0; + }, + ai: { + order: 2, + result: { + target: function (player, target) { + if (!target.hasSha()) return 1.2; + return 1; + }, + }, + }, + subSkill: { + draw: { + trigger: { global: ["useCard", "respond"] }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("refuman")) return true; + } + return false; + }); + }, + logTarget: "player", + content: function () { + game.asyncDraw([trigger.player, player]); + }, + }, + }, + }, + refuman2: { + onremove: function (player) { + player.removeGaintag("refuman"); + }, + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("refuman")) return num + 1; + }, + }, + }, + //十周年陈群 + repindi: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + return !player.getStorage("repindi_target").includes(target); + }, + filterCard: function (card, player) { + return !player.getStorage("repindi_type").includes(get.type2(card)); + }, + check: function (card) { + var num = _status.event.player.getStat("skill").repindi || 0; + return 6 + num - get.value(card); + }, + position: "he", + content: function () { + "step 0"; + player.addTempSkill("repindi_clear", ["phaseUseAfter", "phaseAfter"]); + player.markAuto("repindi_target", [target]); + player.markAuto("repindi_type", [get.type2(cards[0], cards[0].original == "h" ? player : false)]); + event.num = player.getStat("skill").repindi; + player.syncStorage(); + if (target.countCards("he") == 0) event._result = { index: 0 }; + else { + player + .chooseControlList(["令" + get.translation(target) + "摸" + get.cnNumber(event.num) + "张牌", "令" + get.translation(target) + "弃置" + get.cnNumber(event.num) + "张牌"], function () { + return _status.event.choice; + }) + .set("choice", get.attitude(player, target) > 0 ? 0 : 1); + } + "step 1"; + if (result.index == 0) { + target.draw(event.num); + } else { + target.chooseToDiscard(event.num, "he", true); + } + "step 2"; + if (target.isDamaged()) { + player.link(); + } + }, + subSkill: { + clear: { + trigger: { player: "phaseAfter" }, + charlotte: true, + silent: true, + onremove: function (player) { + delete player.storage.repindi_target; + delete player.storage.repindi_type; + }, + }, + }, + ai: { + order: 8, + threaten: 1.9, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + var num = (player.getStat("skill").repindi || 0) + 1; + if (att <= 0 && target.countCards("he") < num) return 0; + return get.sgn(att); + }, + }, + }, + }, + //十周年孙登 + rekuangbi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("rekuangbi"), (card, player, target) => { + return target.countCards("he") > 0 && target != player; + }) + .set("ai", target => { + var player = _status.event.player; + if (_status.event.goon) return get.attitude(player, target) * Math.sqrt(target.countCards("he")); + return (-get.attitude(player, target) / (target.countCards("he") + 1)) * 10; + }) + .set("goon", player.countCards("hs", card => player.hasValueTarget(card)) >= 2); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("rekuangbi", target); + target.chooseCard("匡弼:将至多三张牌置于" + get.translation(player) + "的武将牌上", "he", [1, 3], true).set("ai", card => { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { + return 7 - get.value(card); + } + return -get.value(card); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + player.addToExpansion(result.cards, target, "give").gaintag.add("rekuangbi_effect"); + player.addTempSkill("rekuangbi_effect", "phaseUseEnd"); + player.markAuto("rekuangbi_effect", [target]); + } + }, + subSkill: { + effect: { + trigger: { player: "useCard" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player.getExpansions("rekuangbi_effect").length > 0; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("rekuangbi_effect"); + var suit = get.suit(trigger.card), + cardsx = cards.filter(card => get.suit(card) == suit); + var len = cardsx.length; + if (len > 1) { + player + .chooseButton(["匡弼:移去一张同花色的“匡弼”牌", cards], true) + .set("filterButton", button => { + return get.suit(button.link) == _status.event.suit; + }) + .set("suit", suit); + } else if (len == 1) { + event._result = { bool: true, links: cardsx }; + } else { + event._result = { bool: false, links: [cards.randomGet()] }; + } + "step 1"; + if (result.links && result.links.length) { + player.loseToDiscardpile(result.links); + game.delayx(); + } + if (result.bool) { + player.draw("nodelay"); + var target = player.getStorage("rekuangbi_effect")[0]; + if (target && target.isIn()) target.draw(); + } else { + player.draw(); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + delete player.storage[skill]; + }, + }, + }, + }, + //十周年蔡邕 + rebizhuan: { + audio: 2, + trigger: { + player: "useCard", + target: "useCardToTargeted", + }, + filter: function (event, player) { + if (event.name != "useCard" && event.player == event.target) return false; + var num = 4 + Math.min(player.countMark("retongbo"), game.countPlayer()); + if (player.getExpansions("rebizhuan").length >= num) return false; + return get.suit(event.card) == "spade"; + }, + marktext: "书", + intro: { + name: "辟撰(书)", + name2: "书", + content: "expansion", + markcount: "expansion", + }, + frequent: true, + locked: false, + content: function () { + player.addToExpansion(get.cards(), "gain2").gaintag.add("rebizhuan"); + }, + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("rebizhuan").length; + }, + }, + }, + retongbo: { + audio: 2, + trigger: { player: "phaseDrawAfter" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("rebizhuan").length > 0 && player.countCards("he") > 0; + }, + content: function () { + "step 0"; + var next = player.chooseToMove("通博:是否交换“书”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的“书”", player.getExpansions("rebizhuan")], + ["你的牌", player.getCards("he")], + ]); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]), + cards2 = []; + cards.sort((a, b) => { + return get.useful(a) - get.useful(b); + }); + cards2 = cards.splice(0, player.getExpansions("rebizhuan").length); + return [cards2, cards]; + }); + "step 1"; + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("rebizhuan")); + gains.removeArray(player.getCards("he")); + if (!pushs.length || pushs.length != gains.length) { + event.finish(); + return; + } + player.logSkill("retongbo"); + player.addToExpansion(pushs, "give", player).gaintag.add("rebizhuan"); + player.gain(gains, "gain2"); + } + "step 2"; + event.cards = player.getExpansions("rebizhuan").slice(0); + if (event.cards.length < 4) event.finish(); + else { + event.given = []; + var list = []; + event.cards.forEach(i => list.add(get.suit(i))); + if (list.length >= 4 && player.hp <= 2) event.four = true; + } + "step 3"; + if (event.given.length < 4) { + player + .chooseCardButton("是否将" + get.cnNumber(4 - event.given.length) + "张“书”交给任意名其他角色?", event.cards, [1, 4 - event.given.length], event.given.length > 0) + .set("ai", function (button) { + if (!_status.event.goon) return 0; + var four = _status.event.getParent().four, + given = _status.event.getParent().given; + if (four) return get.value(button.link) + (given.map(i => get.suit(i)).includes(get.suit(button.link)) ? 0 : 10); + if (ui.selected.buttons.length == 0) return get.value(button.link); + return 0; + }) + .set( + "goon", + game.hasPlayer(current => current != player && get.attitude(player, current) > 0) + ); + } else { + event.goto(6); + } + "step 4"; + if (result.bool) { + for (var i = 0; i < result.links.length; i++) { + event.cards.remove(result.links[i]); + } + event.togive = result.links.slice(0); + event.given.addArray(event.togive); + player + .chooseTarget("将" + get.translation(result.links) + "交给一名其他角色", true, function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + } else { + event.finish(); + } + "step 5"; + if (result.targets.length) { + result.targets[0].gain(event.togive, "draw").giver = player; + player.line(result.targets[0], "green"); + game.log(result.targets[0], "获得了" + get.cnNumber(event.togive.length) + "张", "#g“书”"); + if (event.given.length < 4) event.goto(3); + } + "step 6"; + if (event.given.length == 4) { + var suits = lib.suit.slice(0); + event.given.forEach(i => suits.remove(get.suit(i, player))); + if (suits.length == 0) { + player.recover(); + player.addMark("retongbo", 1, false); + } + } + }, + marktext: "博", + intro: { + content: function (storage, player) { + var num = 4 + Math.min(storage, game.countPlayer()); + return "“书”的上限+" + num; + }, + }, + ai: { + combo: "rebizhuan", + }, + }, + //十周年陈宫 + remingce: { + enable: "phaseUse", + usable: 1, + audio: 2, + position: "he", + filterCard: function (card) { + return get.name(card) == "sha" || get.type(card) == "equip"; + }, + filter: function (event, player) { + return player.countCards("h", "sha") > 0 || player.countCards("he", { type: "equip" }) > 0; + }, + check: function (card) { + return 8 - get.value(card); + }, + selectTarget: 2, + multitarget: true, + discard: false, + lose: false, + targetprompt: ["得到牌", "出杀目标"], + filterTarget: function (card, player, target) { + if (ui.selected.targets.length == 0) { + return player != target; + } + return true; + }, + delay: false, + content: function () { + "step 0"; + player.give(cards, targets[0], "visible"); + "step 1"; + if (!targets[0].canUse({ name: "sha", isCard: true }, targets[1], false, false)) event._result = { control: "选项二" }; + else + targets[0] + .chooseControl() + .set("ai", function () { + var player = _status.event.player, + target = _status.event.target; + return get.effect(target, { name: "sha", isCard: true }, player, player) > 0 ? 0 : 1; + }) + .set("choiceList", ["视为对" + get.translation(targets[1]) + "使用一张【杀】,若此杀造成伤害则执行选项二", "你与" + get.translation(player) + "各摸一张牌"]) + .set("target", targets[1]) + .set("prompt", "对" + get.translation(targets[1]) + "使用一张杀,或摸一张牌"); + "step 2"; + if (result.control == "选项二") { + game.asyncDraw([player, targets[0]]); + event.finish(); + } else { + targets[0].useCard({ name: "sha", isCard: true }, targets[1]); + } + "step 3"; + if ( + targets[0].hasHistory("useCard", evt => { + return evt.getParent() == event && targets[0].hasHistory("sourceDamage", evtx => evt.card == evtx.card); + }) + ) { + game.asyncDraw([player, targets[0]]); + } + }, + ai: { + result: { + player: function (player) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 1 && get.attitude(players[i], player) > 1) { + return 1; + } + } + return 0; + }, + target: function (player, target) { + if (ui.selected.targets.length) { + return -0.1; + } + return 1; + }, + }, + order: 8.5, + expose: 0.2, + }, + }, + // 界荀攸 + reqice: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + const hs = player.getCards("h"); + if (!hs.length) return false; + if ((player.getStat("skill").reqice || 0) >= player.countMark("reqice_mark") + 1) return false; + if ( + hs.some(card => { + const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + return mod2 === false; + }) + ) + return false; + return lib.inpile.some(name => { + if (get.type(name) != "trick") return false; + const card = get.autoViewAs({ name }, hs); + return event.filterCard(card, player, event); + }); + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + if (get.type(lib.inpile[i]) == "trick") list.push(["锦囊", "", lib.inpile[i]]); + } + return ui.create.dialog(get.translation("reqice"), [list, "vcard"]); + }, + filter: function (button, player) { + const event = _status.event.getParent(), + card = get.autoViewAs( + { + name: button.link[2], + }, + player.getCards("h") + ); + return event.filterCard(card, player, event); + }, + check: function (button) { + var player = _status.event.player; + var effect = player.getUseValue(button.link[2]); + if (player.countCards("hs", button.link[2]) > 0) return 0; + if ((player.getStat("skill").reqice || 0) < player.countMark("reqice_mark") + 1) { + if (["draw", "gain"].some(i => get.tag(button.link[2], i) >= 1)) return effect * 5; + } + if (effect > 0) return effect; + return 0; + }, + backup: function (links, player) { + return { + filterCard: true, + selectCard: -1, + position: "h", + audio: "reqice", + popname: true, + viewAs: { name: links[0][2] }, + }; + }, + prompt: function (links, player) { + return "将所有手牌当【" + get.translation(links[0][2]) + "】使用"; + }, + }, + ai: { + order: 1, + result: { + player: function (player) { + var num = 0; + var cards = player.getCards("h"); + if (cards.length >= 3 && player.hp >= 3 && player.countMark("reqice_mark") < 2) return 0; + for (var i = 0; i < cards.length; i++) { + num += Math.max(0, get.value(cards[i], player, "raw")); + } + num /= cards.length; + num /= (player.countMark("reqice_mark") + 1) * 1.3; + num *= Math.min(cards.length, player.hp); + return 13 - num; + }, + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && !player.getStat("skill").reqice && player.hasCard(card => get.name(card) != "tao", "h"); + }, + threaten: 1.7, + }, + subSkill: { + bakcup: {}, + mark: { + charlotte: true, + onremove: true, + intro: { + name2: "奇策", + content: "mark", + }, + }, + }, + }, + rezhiyu: { + audio: 2, + trigger: { player: "damageEnd" }, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (!player.countCards("h")) event.finish(); + else player.showHandcards(); + "step 2"; + if (!trigger.source || !trigger.source.isIn()) event._result = { bool: false, cards: [] }; + else trigger.source.chooseToDiscard("智愚:请弃置一张手牌", true); + "step 3"; + var cards = player.getCards("h"); + var color = get.color(cards[0], player); + var bool = true; + for (var i = 1; i < cards.length; i++) { + if (get.color(cards[i], player) != color) { + bool = false; + break; + } + } + if (bool) { + var cards = result.cards.filterInD("d"); + if (cards.length) { + player.gain(cards, "gain2"); + } + player.addMark("reqice_mark", 1); + player.addTempSkill("reqice_mark", { player: "phaseAfter" }); + } + }, + ai: { + maixie_defend: true, + threaten: 0.85, + }, + }, + oljiang: { + audio: "jiang", + inherit: "jiang", + group: "oljiang_gain", + subSkill: { + gain: { + audio: "jiang", + audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + usable: 1, + filter: function (event, player) { + if (player.hp < 1 || event.type != "discard" || event.position != ui.discardPile) return false; + var filter = card => card.name == "juedou" || (card.name == "sha" && get.color(card, false) == "red"); + var cards = event.getd().filter(filter); + if (!cards.filter(card => get.position(card, true) == "d").length) return false; + var searched = false; + if ( + game.getGlobalHistory("cardMove", function (evt) { + if (searched || evt.type != "discard" || evt.position != ui.discardPile) return false; + var evtx = evt; + if (evtx.getlx === false) evtx = evt.getParent(); + var cards = evtx.getd().filter(filter); + if (!cards.length) return false; + searched = true; + return evtx != event; + }).length > 0 + ) + return false; + return true; + }, + prompt2: function (event, player) { + var cards = event.getd().filter(function (card) { + return (card.name == "juedou" || (card.name == "sha" && get.color(card, false) == "red")) && get.position(card, true) == "d"; + }); + return "失去1点体力并获得" + get.translation(cards); + }, + check: function (event, player) { + return player.hp > 1 && !player.storage.olhunzi; + }, + content: function () { + player.loseHp(); + var cards = trigger.getd().filter(function (card) { + return (card.name == "juedou" || (card.name == "sha" && get.color(card, false) == "red")) && get.position(card, true) == "d"; + }); + if (cards.length > 0) player.gain(cards, "gain2"); + }, + }, + }, + }, + //李儒 + dcmieji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hasCard(lib.skill.dcmieji.filterCard, "eh"); + }, + position: "he", + filterCard: function (card) { + if (get.subtype(card) == "equip1") return true; + return get.color(card) == "black" && get.type(card, "trick") == "trick"; + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + discard: false, + delay: false, + check: function (card) { + return 8 - get.value(card); + }, + loseTo: "cardPile", + insert: true, + visible: true, + content: function () { + "step 0"; + player.showCards(cards); + "step 1"; + target.chooseToDiscard("he", true).set("prompt", "请弃置一张锦囊牌,或依次弃置两张非锦囊牌。"); + "step 2"; + if ( + (!result.cards || get.type(result.cards[0], "trick", result.cards[0].original == "h" ? target : false) != "trick") && + target.countCards("he", function (card) { + return get.type(card, "trick") != "trick"; + }) + ) { + target + .chooseToDiscard("he", true, function (card) { + return get.type(card, "trick") != "trick"; + }) + .set("prompt", "请弃置第二张非锦囊牌"); + } + }, + ai: { + order: 9, + result: { + target: -1, + }, + }, + }, + dcfencheng: { + skillAnimation: "epic", + animationColor: "fire", + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + return player != target; + }, + limited: true, + line: "fire", + content: function () { + "step 0"; + player.awakenSkill("dcfencheng"); + event.num = 1; + event.targets = game.filterPlayer(current => current != player); + event.targets.sortBySeat(target); + "step 1"; + if (event.targets.length) { + var target = event.targets.shift(); + if (!target.isIn()) { + event.redo(); + return; + } + event.target = target; + player.line(target, "fire"); + var res = get.damageEffect(target, player, target, "fire"); + target + .chooseToDiscard("he", "弃置至少" + get.cnNumber(event.num) + "张牌或受到2点火焰伤害", [num, Infinity]) + .set("ai", function (card) { + if (ui.selected.cards.length >= _status.event.getParent().num) return -1; + if (_status.event.player.hasSkillTag("nofire")) return -1; + if (_status.event.res >= 0) return 6 - get.value(card); + if (get.type(card) != "basic") { + return 10 - get.value(card); + } + return 8 - get.value(card); + }) + .set("res", res); + } else { + event.finish(); + } + "step 2"; + if (!result.bool) { + event.target.damage(2, "fire"); + event.num = 1; + } else { + event.num = result.cards.length + 1; + event.goto(1); + } + "step 3"; + game.delayx(); + event.goto(1); + }, + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.hasUnknown(2)) return 0; + var num = 0, + eff = 0, + players = game + .filterPlayer(function (current) { + return current != player; + }) + .sortBySeat(target); + for (var target of players) { + if (get.damageEffect(target, player, target, "fire") >= 0) { + num = 0; + continue; + } + var shao = false; + num++; + if ( + target.countCards("he", function (card) { + if (get.type(card) != "basic") { + return get.value(card) < 10; + } + return get.value(card) < 8; + }) < num + ) + shao = true; + if (shao) { + eff -= 4 * (get.realAttitude || get.attitude)(player, target); + num = 0; + } else eff -= (num * (get.realAttitude || get.attitude)(player, target)) / 4; + } + if (eff < 4) return 0; + return eff; + }, + }, + }, + }, + //朱桓 + refenli: { + audio: 2, + group: ["refenli_draw", "refenli_use", "refenli_discard"], + subfrequent: ["discard"], + subSkill: { + draw: { + audio: "refenli", + trigger: { player: "phaseJudgeBefore" }, + prompt: "是否发动【奋励】跳过判定和摸牌阶段?", + filter: function (event, player) { + return player.isMaxHandcard(); + }, + check: function (event, player) { + if (player.hasJudge("lebu") || player.hasJudge("bingliang")) return true; + if (player.getHistory("skipped").length > 0) return false; + return game.hasPlayer(function (current) { + return get.attitude(player, current) < 0 && current.hp == 1 && get.damageEffect(current, player, player) > 0; + }); + }, + content: function () { + trigger.cancel(); + player.skip("phaseDraw"); + }, + }, + use: { + audio: "refenli", + trigger: { player: "phaseUseBefore" }, + prompt: "是否发动【奋励】跳过出牌阶段?", + filter: function (event, player) { + return player.isMaxHp(); + }, + check: function (event, player) { + if (!player.needsToDiscard() || (player.countCards("e") && player.isMaxEquip())) return true; + if (player.getHistory("skipped").length > 0) return false; + return game.hasPlayer(function (current) { + return get.attitude(player, current) < 0 && current.hp == 1 && get.damageEffect(current, player, player) > 0; + }); + }, + content: function () { + trigger.cancel(); + }, + }, + discard: { + audio: "refenli", + trigger: { player: "phaseDiscardBefore" }, + prompt: "是否发动【奋励】跳过弃牌阶段?", + frequent: true, + filter: function (event, player) { + return player.isMaxEquip() && player.countCards("e"); + }, + content: function () { + trigger.cancel(); + }, + }, + }, + ai: { + combo: "repingkou", + }, + }, + repingkou: { + audio: 2, + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.getHistory("skipped").length > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget([1, player.getHistory("skipped").length], get.prompt2("repingkou"), "对至多" + get.cnNumber(num) + "名其他角色各造成1点伤害。若你选择的角色数小于最大角色数,则你可以弃置其中一名目标角色装备区内的一张牌", function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + player.logSkill("repingkou", result.targets); + event.targets = result.targets.slice(0).sortBySeat(); + event.num = 0; + } else { + event.finish(); + } + "step 2"; + var target = targets[event.num]; + if (target.isIn()) target.damage(); + event.num++; + if (event.num < targets.length) event.redo(); + else if (event.num == player.getHistory("skipped").length) event.finish(); + "step 3"; + var targets2 = targets.filter(function (target) { + return target.countDiscardableCards(player, "e") > 0; + }); + if (targets2.length > 0) { + player + .chooseTarget("是否弃置一名目标角色的一张装备牌?", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("targets", targets2) + .set("ai", function (target) { + var att = get.attitude(player, target), + eff = 0; + target.getCards("e", function (card) { + var val = get.value(card, target); + eff = Math.max(eff, -val * att); + }); + return eff; + }); + } else event.finish(); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, "e", true); + } + }, + ai: { + combo: "fenli", + effect: { + target: function (card) { + if (card.name == "lebu" || card.name == "bingliang") return 0.5; + }, + }, + }, + }, + //典韦 + olqiangxi: { + audio: "qiangxi", + audioname: ["ol_dianwei", "boss_lvbu3"], + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + if (player.hp < 1 && !player.hasCard(card => lib.skill.olqiangxi.filterCard(card), "he")) return false; + return game.hasPlayer(current => lib.skill.olqiangxi.filterTarget(null, player, current)); + }, + filterCard: function (card) { + return get.subtype(card) == "equip1"; + }, + position: "he", + filterTarget: function (card, player, target) { + if (target == player) return false; + var stat = player.getStat()._olqiangxi; + return !stat || !stat.includes(target); + }, + selectCard: function () { + if (_status.event.player.hp < 1) return 1; + return [0, 1]; + }, + content: function () { + var stat = player.getStat(); + if (!stat._olqiangxi) stat._olqiangxi = []; + stat._olqiangxi.push(target); + if (!cards.length) player.damage("nosource", "nocard"); + target.damage("nocard"); + }, + ai: { + damage: true, + order: 8, + result: { + player: function (player, target) { + if (ui.selected.cards.length) return 0; + if (player.hp >= target.hp) return -0.9; + if (player.hp <= 2) return -10; + return get.damageEffect(player, player, player); + }, + target: function (player, target) { + if (!ui.selected.cards.length) { + if (player.hp < 2) return 0; + if (player.hp == 2 && target.hp >= 2) return 0; + if (target.hp > player.hp) return 0; + } + return get.damageEffect(target, player, target); + }, + }, + threaten: 1.5, + }, + }, + olningwu: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (player != event.player && player != event.source) return false; + return event.player.getHistory("damage").indexOf(event) == 1; + }, + logTarget: "player", + forced: true, + content: function () { + player.draw(); + player.discardPlayerCard(trigger.player, true, "ej"); + }, + }, + //群太史慈 + rejixu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hp > 0 && player.countCards("h") > 0; + }, + filterTarget: lib.filter.notMe, + selectTarget: function () { + return [1, _status.event.player.hp]; + }, + multitarget: true, + multiline: true, + content: function () { + "step 0"; + targets.sortBySeat(); + event.num = 0; + "step 1"; + if (!event.caicuolist) event.caicuolist = []; + targets[event.num].chooseBool("是否押杀?").ai = function (event, player) { + var evt = _status.event.getParent(); + if (get.attitude(targets[event.num], evt.player) > 0) return evt.player.countCards("h", "sha") ? false : true; + if ( + evt.player.hasKnownCards(targets[event.num], c => { + return c.name == "sha"; + }) + ) { + return true; + } + return Math.random() < 0.5; + }; + "step 2"; + if (result.bool) { + targets[event.num].chat("有杀"); + game.log(targets[event.num], "认为", player, "#g有杀"); + if (!player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); + } else { + targets[event.num].chat("没杀"); + game.log(targets[event.num], "认为", player, "#y没有杀"); + if (player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); + } + event.num++; + game.delay(); + if (event.num < targets.length) event.goto(1); + "step 3"; + player.popup(player.countCards("h", "sha") ? "有杀" : "没杀"); + game.log(player, player.countCards("h", "sha") ? "有杀" : "没杀"); + if (event.caicuolist.length > 0) { + if (player.countCards("h", "sha")) { + player.markAuto("rejixu_sha", event.caicuolist); + player.addTempSkill("rejixu_sha", "phaseUseAfter"); + player.draw(event.caicuolist.length); + event.finish(); + } else { + event.num = 0; + } + } else event.finish(); + "step 4"; + var target = event.caicuolist[event.num]; + if (target.countCards("he") > 0) { + player.line(target); + player.discardPlayerCard(true, "he", target); + } + event.num++; + if (event.num < event.caicuolist.length) event.redo(); + else player.draw(event.caicuolist.length); + }, + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.6; + }, + result: { + target: function (player, target) { + if (player.countCards("h", "sha")) { + return get.effect(target, { name: "sha" }, player, target); + } else { + return get.effect(target, { name: "guohe_copy2" }, player, target); + } + }, + }, + expose: 0.4, + }, + subSkill: { + sha: { + audio: "rejixu", + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.getStorage("rejixu_sha").length; + }, + }, + charlotte: true, + onremove: true, + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + for (var target of player.getStorage("rejixu_sha")) { + if (event.targets.includes(target) || !target.isIn()) return false; + if (lib.filter.targetEnabled2(event.card, player, target)) return true; + } + return false; + }, + prompt: "是否发动【击虚】?", + prompt2: function (event, player) { + var list = player.getStorage("rejixu_sha").filter(function (target) { + if (event.targets.includes(target) || !target.isIn()) return false; + return lib.filter.targetEnabled2(event.card, player, target); + }); + return "令" + get.translation(list) + "也成为" + get.translation(event.card) + "的目标"; + }, + logTarget: function (event, player) { + return player.getStorage("rejixu_sha").filter(function (target) { + if (event.targets.includes(target) || !target.isIn()) return false; + return lib.filter.targetEnabled2(event.card, player, target); + }); + }, + check: function (event, player) { + var eff = 0; + var list = player.getStorage("rejixu_sha").filter(function (target) { + if (event.targets.includes(target) || !target.isIn()) return false; + return lib.filter.targetEnabled2(event.card, player, target); + }); + for (var i of list) eff += get.effect(i, event.card, player, player); + return eff > 0; + }, + content: function () { + var list = player.getStorage("rejixu_sha").filter(function (target) { + if (trigger.targets.includes(target) || !target.isIn()) return false; + return lib.filter.targetEnabled2(trigger.card, player, target); + }); + if (list.length > 0) { + trigger.targets.addArray(list); + game.log(list, "也成为了", trigger.card, "的目标"); + } + }, + }, + }, + }, + //界刘封 + rexiansi: { + inherit: "xiansi", + audio: "xiansi", + audioname: ["re_liufeng"], + group: ["rexiansi2", "xiansix"], + }, + rexiansi2: { + enable: "chooseToUse", + filter: function (event, player) { + return player.getExpansions("xiansi").length > Math.max(0, player.hp) && event.filterCard({ name: "sha", isCard: true }, player, event); + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("陷嗣", player.getExpansions("xiansi"), "hidden"); + }, + backup: function (links, player) { + return { + viewAs: { name: "sha", isCard: true }, + filterCard: () => false, + selectCard: -1, + card: links[0], + precontent: function () { + player.logSkill("rexiansi"); + player.loseToDiscardpile(lib.skill.rexiansi2_backup.card); + delete event.result.skill; + }, + }; + }, + prompt: () => "请选择【杀】的目标", + }, + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.6; + }, + result: { player: 1 }, + }, + }, + //界荀彧 + oljieming: { + audio: 2, + trigger: { player: ["damageEnd", "die"] }, + direct: true, + forceDie: true, + filter: function (event, player) { + if (event.name == "die") return true; + return player.isIn(); + }, + content: function () { + "step 0"; + event.count = trigger.num || 1; + "step 1"; + event.count--; + player + .chooseTarget(get.prompt2("oljieming"), function (card, player, target) { + return target.maxHp > 0; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var draw = Math.min(5, target.maxHp) - target.countCards("h"); + if (draw >= 0) { + if (target.hasSkillTag("nogain")) att /= 6; + if (att > 2) { + return Math.sqrt(draw + 1) * att; + } + return att / 3; + } + if (draw < -1) { + if (target.hasSkillTag("nogain")) att *= 6; + if (att < -2) { + return -Math.sqrt(1 - draw) * att; + } + } + return 0; + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oljieming", target); + target.draw(Math.min(5, target.maxHp)); + } else event.finish(); + "step 3"; + var num = target.countCards("h") - Math.min(5, target.maxHp); + if (num > 0) target.chooseToDiscard("h", true, num); + "step 4"; + if (event.count > 0 && player.isIn() && player.hasSkill("oljieming")) event.goto(1); + }, + ai: { + expose: 0.2, + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + var max = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) > 0) { + max = Math.max(Math.min(5, players[i].hp) - players[i].countCards("h"), max); + } + } + switch (max) { + case 0: + return 2; + case 1: + return 1.5; + case 2: + return [1, 2]; + default: + return [0, max]; + } + } + if ((card.name == "tao" || card.name == "caoyao") && target.hp > 1 && target.countCards("h") <= target.hp) return [0, 0]; + }, + }, + }, + }, + //OL华雄 + shizhan: { + audio: 2, + enable: "phaseUse", + usable: 2, + filterTarget: function (card, player, target) { + return target != player && target.canUse("juedou", player); + }, + content: function () { + target.useCard({ name: "juedou", isCard: true }, player, "noai"); + }, + ai: { + order: 2, + result: { + player: function (player, target) { + return get.effect(player, { name: "juedou", isCard: true }, target, player); + }, + }, + }, + }, + //刘谌 + rezhanjue: { + audio: 2, + enable: "phaseUse", + filterCard: function (card) { + return !card.hasGaintag("reqinwang"); + }, + selectCard: -1, + position: "h", + filter: function (event, player) { + var stat = player.getStat().skill; + if (stat.rezhanjue_draw && stat.rezhanjue_draw >= 3) return false; + var hs = player.getCards("h", function (card) { + return !card.hasGaintag("reqinwang"); + }); + if (!hs.length) return false; + for (var i = 0; i < hs.length; i++) { + var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; + } + return event.filterCard(get.autoViewAs({ name: "juedou" }, hs)); + }, + viewAs: { name: "juedou" }, + onuse: function (links, player) { + player.addTempSkill("rezhanjue_effect", "phaseUseEnd"); + }, + ai: { + order: 1, + tag: { + respond: 2, + respondSha: 2, + damage: 1, + }, + result: { + target: -1.5, + player: function (player, target) { + if ( + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: { name: "juedou" }, + }, + true + ) + ) { + return 0; + } + if (get.damageEffect(target, player, target) > 0 && get.attitude(player, target) > 0 && get.attitude(target, player) > 0) { + return 0; + } + var hs1 = target.getCards("h", "sha"); + var hs2 = player.getCards("h", function (card) { + return card.hasGaintag("reqinwang") && get.name(card) == "sha"; + }); + if (hs1.length > hs2.length + 1) { + return -2; + } + var hsx = target.getCards("h"); + if (hsx.length > 2 && hs2.length == 0 && hsx[0].number < 6) { + return -2; + } + if (hsx.length > 3 && hs2.length == 0) { + return -2; + } + if (hs1.length > hs2.length && (!hs2.length || hs1[0].number > hs2[0].number)) { + return -2; + } + return -0.5; + }, + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + player.countSkill("rezhanjue_draw") < 3 && + player.hasCard(card => { + return get.name(card) !== "tao" && !card.hasGaintag("reqinwang"); + }, "h") + ); + }, + }, + }, + rezhanjue_effect: { + audio: false, + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + charlotte: true, + onremove: function (player) { + delete player.getStat().skill.rezhanjue_draw; + }, + filter: function (event, player) { + return event.skill == "rezhanjue"; + }, + content: function () { + "step 0"; + var stat = player.getStat().skill; + if (!stat.rezhanjue_draw) stat.rezhanjue_draw = 0; + stat.rezhanjue_draw++; + player.draw("nodelay"); + var list = game.filterPlayer(function (current) { + if ( + current.getHistory("damage", function (evt) { + return evt.card == trigger.card; + }).length > 0 + ) { + if (current == player) { + stat.rezhanjue_draw++; + } + return true; + } + return false; + }); + if (list.length) { + list.sortBySeat(); + game.asyncDraw(list); + } + "step 1"; + game.delay(); + }, + }, + reqinwang: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuSkill: true, + filter: function (event, player) { + if (!player.hasZhuSkill("reqinwang")) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "shu" && player.hasZhuSkill("reqinwang", current); + }); + }, + selectTarget: -1, + filterTarget: function (card, player, current) { + return current != player && current.group == "shu" && player.hasZhuSkill("reqinwang", current); + }, + content: function () { + "step 0"; + if ( + target.hasCard(function (card) { + return _status.connectMode || get.name(card, target) == "sha"; + }, "h") + ) { + target + .chooseCard( + "是否交给" + get.translation(player) + "一张【杀】?", + function (card, player) { + return get.name(card, player) == "sha"; + }, + "h" + ) + .set("goon", get.attitude(target, player) > 0) + .set("ai", function (card) { + return _status.event.goon ? 1 : 0; + }); + } else event.finish(); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + target.give(card, player).gaintag.add("reqinwang"); + player.addTempSkill("reqinwang_clear"); + player.chooseBool("是否令" + get.translation(target) + "摸一张牌?"); + } else event.finish(); + "step 2"; + if (result.bool) target.draw(); + }, + ai: { + order: 5, + result: { player: 1 }, + }, + subSkill: { + clear: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("reqinwang"); + }, + }, + }, + }, + //公孙瓒 + dcqiaomeng: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + if (!event.isFirstTarget || get.color(event.card) != "black") return false; + for (var i of event.targets) { + if ( + i != player && + i.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, i); + }, "he") + ) + return true; + } + return false; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("dcqiaomeng"), "选择一名不为自己的目标角色,然后弃置其一张牌。若以此法弃置的牌为:装备牌,你获得此牌;锦囊牌,你令" + get.translation(trigger.card) + "不可被响应。", function (card, player, target) { + return ( + target != player && + _status.event.getTrigger().targets.includes(target) && + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcqiaomeng", target); + player.discardPlayerCard(target, true, "he"); + } else event.finish(); + "step 2"; + if (result.bool && result.cards && result.cards.length) { + //为了体现白马义从野性纯真的美 直接获取卡牌原类型 不考虑维系区域 + var card = result.cards[0], + type = get.type2(card, false); + if (type == "trick") trigger.directHit.addArray(game.filterPlayer(current => current != player)); + if (type == "equip" && get.position(card, true) == "d") player.gain(card, "gain2"); + } + }, + }, + //杜畿 + reandong: { + audio: 2, + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + return event.source && event.source.isIn(); + }, + logTarget: "source", + content: function () { + "step 0"; + var target = trigger.source, + str = get.translation(player); + var bool = player.storage.reandong; + if (bool) str = "自己"; + var choiceList = ["防止" + str + "即将受到的伤害,且本回合内红桃牌不计入" + (bool ? get.translation(target) : "自己") + "的手牌上限。"]; + if (!target.countCards("h")) choiceList.push("令" + str + "下次发动〖安东〗时改为自行选择"); + else choiceList.push("令" + str + "观看你的手牌并获得所有红桃牌"); + if (bool) { + delete player.storage.reandong; + player.chooseControl().set("choiceList", choiceList).set("prompt", "安东:请选择一项"); + } else { + target + .chooseControl() + .set("choiceList", choiceList) + .set("prompt", "安东:请选择一项") + .set("ai", function (event, player) { + var target = _status.event.getParent().player; + var player = _status.event.player; + if (get.attitude(player, target) > 0) return 0; + return 1; + }); + } + "step 1"; + var target = trigger.source; + if (result.index == 0) { + target.addTempSkill("reandong_ignore"); + trigger.cancel(); + game.delayx(); + } else { + if (!target.countCards("h")) { + player.storage.reandong = true; + game.delayx(); + } else { + player.viewHandcards(target); + var cards = target.getCards("h", function (card) { + return get.suit(card, target) == "heart"; + }); + if (cards.length > 0) player.gain(cards, target, "give", "bySelf"); + } + } + }, + ai: { + maixie: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target && get.attitude(player, target) < 0) { + var cards = player.getCards("h", function (cardx) { + return card != cardx && (!card.cards || !card.cards.includes(cardx)) && get.suit(cardx) == "heart"; + }); + if (!cards.length) return; + for (var i of cards) { + if (get.name(i, target) == "tao") return "zeroplayertarget"; + } + if (get.value(cards, target) >= 6 + target.getDamagedHp()) return "zeroplayertarget"; + return [1, 0.6]; + } + }, + }, + }, + subSkill: { + ignore: { + mod: { + ignoredHandcard: function (card, player) { + if (get.suit(card) == "heart") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.suit(card) == "heart") return false; + }, + }, + charlotte: true, + marktext: "♥", + intro: "红桃牌于本回合内不计入手牌上限", + }, + }, + }, + reyingshi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0 && game.countPlayer() > 1; + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt("reyingshi"), + prompt2: "操作提示:选择一张作为赏金的手牌,然后选择作为赏金猎人的角色A和作为出杀目标的其他角色B", + filterCard: true, + selectTarget: 2, + position: "h", + filterTarget: function (card, player, target) { + if (!ui.selected.targets.length) return true; + return target != player; + }, + complexTarget: true, + targetprompt: ["出杀", "被杀"], + complexSelect: true, + ai1: function (card) { + return 1 / Math.max(1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) { + var att = get.attitude(player, target); + if (att < 0) return 0; + if (target.hasSha()) return Math.pow(target.countCards("h") + 1, 1.1) * (player == target ? 3 : 1); + return Math.sqrt(1 + target.countCards("h")); + } + return get.effect(target, { name: "sha" }, ui.selected.targets[0], player); + }, + }); + "step 1"; + if (result.bool) { + var targets = result.targets; + event.targets = targets; + player.logSkill("reyingshi", targets[1]); + var card = result.cards[0]; + event.card = card; + player.showCards(card, get.translation(player) + "对" + get.translation(targets[1]) + "发动了【应势】"); + player.line(targets[0], "fire"); + } else event.finish(); + "step 2"; + var next = targets[0].chooseToUse( + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.cardEnabled.apply(this, arguments) && lib.filter.targetEnabled(card, player, (event || _status.event).sourcex); + }, + "###是否对" + get.translation(targets[1]) + "使用一张【杀】?###若选择使用,则获得赏金(" + get.translation(card) + ")。若造成伤害,则再从牌堆中获得与此牌花色点数相同的牌作为额外赏金。" + ); + next.set("addCount", false); + next.set("complexSelect", true); + next.set("filterTarget", function (card, player, target) { + if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false; + return lib.filter.targetEnabled.apply(this, arguments); + }); + next.set("sourcex", targets[1]); + "step 3"; + var target = targets[0]; + if (result.bool && target.isIn()) { + var cards = [], + slice = 0; + if (player != target && player.getCards("h").includes(card)) { + cards.push(card); + slice++; + } + if ( + target.hasHistory("useCard", function (evt) { + if (evt.getParent(2) != event) return false; + return target.hasHistory("sourceDamage", function (evtx) { + return evtx.card == evt.card; + }); + }) + ) { + var suit = get.suit(card), + number = get.number(card); + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (card.suit == suit && card.number == number) cards.push(card); + } + if (cards.length > 0) { + if (!slice) target.gain(cards, "gain2"); + else { + setTimeout( + function () { + target.$gain2(cards.slice(slice), true); + }, + get.delayx(200, 200) + ); + target.gain(cards, player, "give"); + } + } + } else { + if (cards.length > 0) target.gain(cards, player, "give"); + } + } + }, + }, + //十周年沮授 + dcshibei: { + trigger: { player: "damageEnd" }, + forced: true, + audio: 2, + check: function (event, player) { + return player.getHistory("damage").indexOf(event) == 0; + }, + filter: function (event, player) { + var index = player.getHistory("damage").indexOf(event); + return index == 0 || index == 1; + }, + content: function () { + if (player.getHistory("damage").indexOf(trigger) > 0) { + player.loseHp(); + } else { + player.recover(); + } + }, + subSkill: { + damaged: {}, + ai: {}, + }, + ai: { + maixie_defend: true, + threaten: 0.9, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing")) return; + if (target.hujia) return; + if (player._shibei_tmp) return; + if (target.hasSkill("shibei_ai")) return; + if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return; + if (get.tag(card, "damage")) { + if (target.getHistory("damage").length > 0) { + return [1, -2]; + } else { + if (get.attitude(player, target) > 0 && target.hp > 1) { + return 0; + } + if ( + get.attitude(player, target) < 0 && + !player.hasSkillTag("damageBonus", "e", { + target: target, + card: card, + }) + ) { + if (card.name == "sha") return; + var sha = false; + player._shibei_tmp = true; + var num = player.countCards("h", function (card) { + if (card.name == "sha") { + if (sha) { + return false; + } else { + sha = true; + } + } + return get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0; + }); + delete player._shibei_tmp; + if (player.hasSkillTag("damage")) { + num++; + } + if (num < 2) { + var enemies = player.getEnemies(); + if (enemies.length == 1 && enemies[0] == target && player.needsToDiscard()) { + return; + } + return 0; + } + } + } + } + }, + }, + }, + }, + dcjianying: { + audio: 2, + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (typeof card == "object" && player.isPhaseUsing()) { + var evt = lib.skill.dcjianying.getLastUsed(player); + if (evt && evt.card && ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || (evt.card.number && evt.card.number == get.number(card)))) { + return num + 10; + } + } + }, + }, + trigger: { player: "useCard" }, + frequent: true, + getLastUsed: function (player, event) { + var history = player.getAllHistory("useCard"); + var index; + if (event) index = history.indexOf(event) - 1; + else index = history.length - 1; + if (index >= 0) return history[index]; + return false; + }, + filter: function (event, player) { + var evt = lib.skill.dcjianying.getLastUsed(player, event); + if (!evt || !evt.card) return false; + return (lib.suit.includes(get.suit(evt.card)) && get.suit(evt.card) == get.suit(event.card)) || (typeof get.number(evt.card, false) == "number" && get.number(evt.card, false) == get.number(event.card)); + }, + content: function () { + player.draw(); + }, + group: "dcjianying_mark", + init: function (player) { + var history = player.getAllHistory("useCard"); + if (history.length) { + var trigger = history[history.length - 1]; + if (get.suit(trigger.card, player) == "none" || typeof get.number(trigger.card, player) != "number") return; + player.storage.dcjianying_mark = trigger.card; + player.markSkill("dcjianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.dcjianying_mark) player.marks.dcjianying_mark.firstChild.innerHTML = get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); + } + }, + onremove: function (player) { + player.unmarkSkill("dcjianying_mark"); + delete player.storage.dcjianying_mark; + }, + subSkill: { + mark: { + charlotte: true, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + content: function () { + if (get.suit(trigger.card, player) == "none" || typeof get.number(trigger.card, player) != "number") player.unmarkSkill("dcjianying_mark"); + else { + player.storage.dcjianying_mark = trigger.card; + player.markSkill("dcjianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.dcjianying_mark) player.marks.dcjianying_mark.firstChild.innerHTML = get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); + } + }, + intro: { + markcount: function (card, player) { + var num = get.number(card, player); + var list = [1, 11, 12, 13]; + if (list.includes(num)) return ["A", "J", "Q", "K"][list.indexOf(num)]; + return parseFloat(num); + }, + content: function (card, player) { + var suit = get.suit(card, player); + var num = get.number(card, player); + var str = "
  • 上一张牌的花色:" + get.translation(suit); + str += "
  • 上一张牌的点数:"; + var list = [1, 11, 12, 13]; + if (list.includes(num)) str += ["A(1)", "J(11)", "Q(12)", "K(13)"][list.indexOf(num)]; + else str += parseFloat(num); + return str; + }, + }, + }, + }, + }, + //十周年步练师 + dcanxu: { + enable: "phaseUse", + usable: 1, + multitarget: true, + audio: 2, + filterTarget: function (card, player, target) { + if (player == target) return false; + var num = target.countCards("h"); + if (ui.selected.targets.length) { + return num < ui.selected.targets[0].countCards("h"); + } + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (num > players[i].countCards("h")) return true; + } + return false; + }, + selectTarget: 2, + content: function () { + "step 0"; + var gainner, giver; + if (targets[0].countCards("h") < targets[1].countCards("h")) { + gainner = targets[0]; + giver = targets[1]; + } else { + gainner = targets[1]; + giver = targets[0]; + } + gainner.gainPlayerCard(giver, true, "h", "visibleMove"); + event.gainner = gainner; + event.giver = giver; + "step 1"; + if (result.cards) { + var card = result.cards[0]; + if (event.gainner.getCards("h").includes(card) && get.suit(card, event.gainner) != "spade") player.draw(); + } + if (event.gainner.countCards("h") == event.giver.countCards("h")) player.recover(); + }, + ai: { + order: 10.5, + threaten: 2.3, + result: { + target: function (player, target) { + var num = target.countCards("h"); + var att = get.attitude(player, target); + if (ui.selected.targets.length == 0) { + if (att > 0) return -1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var num2 = players[i].countCards("h"); + var att2 = get.attitude(player, players[i]); + if (num2 < num) { + if (att2 > 0) return -3; + return -1; + } + } + return 0; + } else { + return 1; + } + }, + player: 1, + }, + }, + }, + dczhuiyi: { + audio: 2, + trigger: { player: "die" }, + direct: true, + skillAnimation: true, + animationColor: "wood", + forceDie: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("dczhuiyi"), function (card, player, target) { + return player != target && _status.event.sourcex != target; + }) + .set("forceDie", true) + .set("ai", function (target) { + var num = get.attitude(_status.event.player, target); + if (num > 0) { + if (target.hp == 1) { + num += 2; + } + if (target.hp < target.maxHp) { + num += 2; + } + } + return num; + }) + .set("sourcex", trigger.source); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dczhuiyi", target); + player.line(target, "green"); + target.recover(); + target.draw(game.countPlayer()); + } + }, + ai: { + expose: 0.5, + }, + }, + //OL界蔡文姬 + olbeige: { + audio: "beige", + audioname: ["ol_caiwenji"], + trigger: { global: "damageEnd" }, + logTarget: "player", + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.player.isIn() && player.countCards("he") > 0; + }, + check: function (event, player) { + let att = get.attitude(player, event.player); + if (event.player.hasSkill("xinleiji")) return att > 0; + if (att > 0 || event.player.isHealthy()) return true; + if (!event.source) return true; + att = get.attitude(player, event.source); + return att <= 0 || event.source.isTurnedOver(); + }, + prompt2: "令其进行判定,然后你可根据判定结果,弃置一张牌并令其执行对应效果。", + content: function () { + "step 0"; + event.target = trigger.player; + event.source = trigger.source; + trigger.player.judge(); + "step 1"; + event.judgeResult = get.copy(result); + var str = "是否弃置一张牌", + strt = get.translation(target), + strs = get.translation(source), + goon = 0; + switch (result.suit) { + case "heart": + if (target.isIn() && target.isDamaged()) { + str += ",令" + strt + "回复1点体力"; + goon = get.recoverEffect(target, player, player); + } + break; + case "diamond": + if (target.isIn()) { + str += ",令" + strt + "摸两张牌"; + goon = 2 * get.effect(target, { name: "draw" }, player, player); + } + break; + case "spade": + if (source && source.isIn()) { + str += ",令" + strs + "翻" + (source.isTurnedOver() ? "回正" : "") + "面"; + goon = get.attitude(player, source) * (source.isTurnedOver() ? 2 : -2); + } + break; + case "club": + if (source && source.isIn()) { + str += ",令" + strs + "弃置两张牌"; + var cards = source + .getCards("he") + .sort(function (a, b) { + return get.value(a, source) - get.value(b, source); + }) + .slice(0, 2); + for (var i of cards) goon += get.value(i, source); + goon *= -get.sgn(get.attitude(player, source)); + } + break; + } + str += "?"; + var str2 = "若弃置点数为" + get.strNumber(result.number) + "的牌则收回自己弃置的牌"; + if (get.position(result.card, true) == "d") { + str2 += ";若弃置花色为" + get.translation(result.suit) + "的牌则获得" + get.translation(result.card); + } + player + .chooseToDiscard("he", str, str2) + .set("goon", goon) + .set("ai", function (card) { + var goon = _status.event.goon; + var player = _status.event.player; + var result = _status.event.getParent().judgeResult; + var eff = Math.min(7, goon); + if (eff <= 0) return 0; + if (get.suit(card, player) == result.suit) eff += get.value(result.card, player); + if (get.number(card, player) == result.number) return eff; + return eff - get.value(card); + }); + "step 2"; + if (result.bool) { + event.card = result.cards[0]; + switch (event.judgeResult.suit) { + case "heart": + if (target.isIn() && target.isDamaged()) target.recover(); + break; + case "diamond": + if (target.isIn()) target.draw(2); + break; + case "spade": + if (source && source.isIn()) source.turnOver(); + player.addExpose(0.1); + break; + case "club": + if (source && source.isIn() && source.countCards("he") > 0) source.chooseToDiscard(2, "he", true); + player.addExpose(0.1); + break; + } + } else event.finish(); + "step 3"; + var gains = []; + if (get.position(event.judgeResult.card, true) == "d" && get.suit(card, player) == event.judgeResult.suit) gains.push(event.judgeResult.card); + if (get.position(card, true) == "d" && get.number(card, player) == event.judgeResult.number) gains.push(card); + if (gains.length) player.gain(gains, "gain2"); + }, + }, + //OL界张郃 + reqiaobian: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + player.addMark("reqiaobian", 2); + game.delayx(); + }, + marktext: "变", + intro: { + name2: "变", + content: function (storage, player) { + var str = "共有" + (storage || 0) + "个标记"; + if (player.storage.reqiaobian_jieshu) { + str = "
  • " + str + "
  • 已记录手牌数:" + get.translation(player.storage.reqiaobian_jieshu); + } + return str; + }, + }, + group: ["reqiaobian_judge", "reqiaobian_draw", "reqiaobian_use", "reqiaobian_discard", "reqiaobian_jieshu"], + subSkill: { + judge: { + audio: "reqiaobian", + trigger: { player: "phaseJudgeBefore" }, + direct: true, + filter: function (event, player) { + return player.hasMark("reqiaobian") || player.hasCard(card => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), "he"); + }, + check: function (event, player) { + return player.hasCard(function (card) { + return ( + get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) < 0 + ); + }, "j"); + }, + content: function () { + "step 0"; + var choices = []; + if (player.hasMark("reqiaobian")) choices.push("弃置标记"); + if (player.hasCard(card => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), "he")) choices.push("弃置牌"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "巧变:是否跳过判定阶段?") + .set("ai", function () { + var evt = _status.event; + if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player)) return 0; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + if (result.control == "弃置牌") { + player.chooseToDiscard("he", true).logSkill = event.name; + } else { + player.logSkill(event.name); + player.removeMark("reqiaobian", 1); + } + } else event.finish(); + "step 2"; + trigger.cancel(); + }, + }, + draw: { + audio: "reqiaobian", + trigger: { player: "phaseDrawBefore" }, + direct: true, + filter: function (event, player) { + return player.hasMark("reqiaobian") || player.hasCard(card => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), "he"); + }, + check: function (event, player) { + return ( + game.countPlayer(function (current) { + if (current == player || current.countGainableCards(player, "h") == 0) return false; + var att = get.attitude(player, current); + if (current.hasSkill("tuntian")) return att > 0; + return att < 1; + }) > 1 + ); + }, + content: function () { + "step 0"; + var choices = []; + if (player.hasMark("reqiaobian")) choices.push("弃置标记"); + if (player.hasCard(card => lib.filter.cardDiscardable(card, player, "reqiaobian_draw"), "he")) choices.push("弃置牌"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "巧变:是否跳过摸牌阶段?") + .set("ai", function () { + var evt = _status.event; + if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player)) return 0; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + if (result.control == "弃置牌") { + player.chooseToDiscard("he", true).logSkill = event.name; + } else { + player.logSkill(event.name); + player.removeMark("reqiaobian", 1); + } + } else event.finish(); + "step 2"; + trigger.cancel(); + if (game.hasPlayer(current => current.countGainableCards(player, "h") > 0)) { + player + .chooseTarget("是否获得至多两名其他角色的各一张手牌?", [1, 2], function (card, player, target) { + return target != player && target.countGainableCards(player, "h") > 0; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + }); + } else event.finish(); + "step 3"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); + player.gainMultiple(targets); + } + }, + }, + use: { + audio: "reqiaobian", + trigger: { player: "phaseUseBefore" }, + direct: true, + filter: function (event, player) { + return player.hasMark("reqiaobian") || player.hasCard(card => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), "he"); + }, + check: function (event, player) { + if ( + player.countCards("h", function (card) { + return player.hasValueTarget(card, null, true); + }) > 1 + ) + return false; + return game.hasPlayer(function (current) { + var att = get.sgn(get.attitude(player, current)); + if (att != 0) { + var es = current.getCards("e"); + for (var i = 0; i < es.length; i++) { + if ( + game.hasPlayer(function (current2) { + if (get.sgn(get.value(es[i], current)) != -att || get.value(es[i], current) < 5) return false; + var att2 = get.sgn(get.attitude(player, current2)); + if (att == att2 || att2 != get.sgn(get.effect(current2, es[i], player, current2))) return false; + return current != current2 && !current2.isMin() && current2.canEquip(es[i]); + }) + ) { + return true; + } + } + } + if (att > 0) { + var js = current.getCards("j", function (card) { + return ( + get.effect( + current, + { + name: card.viewAs || card.name, + cards: [card], + }, + current, + current + ) < -2 + ); + }); + for (var i = 0; i < js.length; i++) { + if ( + game.hasPlayer(function (current2) { + var att2 = get.attitude(player, current2); + if (att2 >= 0) return false; + return current != current2 && current2.canAddJudge(js[i]); + }) + ) { + return true; + } + } + } + }); + }, + content: function () { + "step 0"; + var choices = []; + if (player.hasMark("reqiaobian")) choices.push("弃置标记"); + if (player.hasCard(card => lib.filter.cardDiscardable(card, player, "reqiaobian_use"), "he")) choices.push("弃置牌"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "巧变:是否跳过出牌阶段?") + .set("ai", function () { + var evt = _status.event; + if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player)) return 0; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + if (result.control == "弃置牌") { + player.chooseToDiscard("he", true).logSkill = event.name; + } else { + player.logSkill(event.name); + player.removeMark("reqiaobian", 1); + } + } else event.finish(); + "step 2"; + trigger.cancel(); + player.moveCard(); + }, + }, + discard: { + audio: "reqiaobian", + trigger: { player: "phaseDiscardBefore" }, + direct: true, + filter: function (event, player) { + return player.hasMark("reqiaobian") || player.hasCard(card => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), "he"); + }, + check: function (event, player) { + return player.needsToDiscard(); + }, + content: function () { + "step 0"; + var choices = []; + if (player.hasMark("reqiaobian")) choices.push("弃置标记"); + if (player.hasCard(card => lib.filter.cardDiscardable(card, player, "reqiaobian_discard"), "he")) choices.push("弃置牌"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "巧变:是否跳过弃牌阶段?") + .set("ai", function () { + var evt = _status.event; + if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player)) return 0; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + if (result.control == "弃置牌") { + player.chooseToDiscard("he", true).logSkill = event.name; + } else { + player.logSkill(event.name); + player.removeMark("reqiaobian", 1); + } + } else event.finish(); + "step 2"; + trigger.cancel(); + }, + }, + jieshu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return !player.getStorage("reqiaobian_jieshu").includes(player.countCards("h")); + }, + content: function () { + player.addMark("reqiaobian", 1); + player.markAuto("reqiaobian_jieshu", [player.countCards("h")]); + player.storage.reqiaobian_jieshu.sort(); + }, + }, + }, + }, + //十周年徐庶 + rezhuhai: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player != event.player && event.player.getHistory("sourceDamage").length > 0 && event.player.isIn() && (player.countCards("h") > 0 || player.canUse("guohe", event.player)); + }, + content: function () { + "step 0"; + var target = trigger.player; + var choiceList = ["将一张手牌当做【杀】对其使用", "视为对其使用一张【过河拆桥】"]; + var bool = false, + hs = player.getCards("h"); + for (var i of hs) { + if (game.checkMod(i, player, "unchanged", "cardEnabled2", player) !== false && player.canUse(get.autoViewAs({ name: "sha" }, [i]), target, false)) { + bool = true; + break; + } + } + var choices = []; + if (bool) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (player.canUse("guohe", target)) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", get.prompt("rezhuhai", target)) + .set("ai", function () { + var choices = _status.event.controls; + var eff1 = 0, + eff2 = 0; + var player = _status.event.player, + target = _status.event.getTrigger().player; + if (choices.includes("选项一")) eff1 = get.effect(target, { name: "sha" }, player, player); + if (choices.includes("选项二")) eff2 = get.effect(target, { name: "guohe" }, player, player); + if (eff1 > 0 && ((player.hasSkill("xsqianxin") && player.isDamaged()) || eff1 > eff2)) return "选项一"; + if (eff2 > 0) return "选项二"; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + if (result.control == "选项一") { + player + .chooseCard( + "h", + true, + function (card, player) { + if (!game.checkMod(card, player, "unchanged", "cardEnabled2", player)) return false; + return player.canUse(get.autoViewAs({ name: "sha" }, [card]), _status.event.getTrigger().player, false); + }, + "选择一张手牌当做【杀】对" + get.translation(trigger.player) + "使用" + ) + .set("ai", function (card) { + var player = _status.event.player; + return get.effect(_status.event.getTrigger().player, get.autoViewAs({ name: "sha" }, [card]), player, player) / Math.max(1, get.value(card)); + }); + } else { + player.useCard({ name: "guohe", isCard: true }, trigger.player, "rezhuhai"); + event.finish(); + } + } else event.finish(); + "step 2"; + if (result.bool) { + player.useCard({ name: "sha" }, result.cards, "rezhuhai", trigger.player, false); + } + }, + }, + xsqianxin: { + trigger: { source: "damageSource" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { + return player.isDamaged(); + }, + content: function () { + player.awakenSkill("xsqianxin"); + player.loseMaxHp(); + player.addSkills("rejianyan"); + }, + derivation: "rejianyan", + }, + rejianyan: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return game.hasPlayer(current => current.group == "key" || current.hasSex("male")); + }, + chooseButton: { + dialog: function () { + return ui.create.dialog("###荐言###" + get.translation("rejianyan_info")); + }, + chooseControl: function (event, player) { + var list = []; + if (!player.hasSkill("rejianyan_color")) list.addArray(["red", "black"]); + if (!player.hasSkill("rejianyan_type")) list.addArray(["basic", "trick", "equip"]); + list.push("cancel2"); + return list; + }, + check: function () { + if (!_status.event.player.hasSkill("rejianyan_color")) return "red"; + return "trick"; + }, + backup: function (result, player) { + return { + audio: "rejianyan", + filterCard: () => false, + selectCard: -1, + info: result.control, + content: function () { + "step 0"; + var card = false, + info = lib.skill.rejianyan_backup.info; + if (info == "red" || info == "black") { + player.addTempSkill("rejianyan_color", "phaseUseEnd"); + card = get.cardPile2(function (card) { + return get.color(card) == info; + }); + } else { + player.addTempSkill("rejianyan_type", "phaseUseEnd"); + card = get.cardPile2(function (card) { + return get.type(card) == info; + }); + } + if (card) { + event.card = card; + player.showCards(card, get.translation(player) + "发动了【荐言】"); + } else event.finish(); + "step 1"; + player + .chooseTarget(true, "选择一名角色获得" + get.translation(card), function (card, player, target) { + return target.group == "key" || target.hasSex("male"); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkill("nogain")) att /= 10; + return att / Math.sqrt(get.distance(player, target, "absolute")); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(card, "gain2"); + } + }, + ai: { result: { player: 1 } }, + }; + }, + }, + ai: { + order: 8, + result: { + player: function (player, target) { + if (game.hasPlayer(current => (current.group == "key" || current.hasSex("male")) && get.attitude(player, current) > 0)) return 1; + return 0; + }, + }, + }, + subSkill: { type: {}, color: {}, backup: {} }, + }, + //野兽高顺 + decadexianzhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + filter: function (event, player) { + return player.countCards("h") > 0 && !player.hasSkill("decadexianzhen2") && !player.hasSkill("decadexianzhen3"); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + player.storage.decadexianzhen2 = target; + player.addTempSkill("decadexianzhen2"); + } else { + player.addTempSkill("decadexianzhen3"); + } + }, + ai: { + order: function (name, player) { + var cards = player.getCards("h"); + if (player.countCards("h", "sha") == 0) { + return 1; + } + for (var i = 0; i < cards.length; i++) { + if (cards[i].name != "sha" && get.number(cards[i]) > 11 && get.value(cards[i]) < 7) { + return 9; + } + } + return get.order({ name: "sha" }) - 1; + }, + result: { + player: function (player) { + if (player.countCards("h", "sha") > 0) return 0; + var num = player.countCards("h"); + if (num > player.hp) return 0; + if (num == 1) return -2; + if (num == 2) return -1; + return -0.7; + }, + target: function (player, target) { + var num = target.countCards("h"); + if (num == 1) return -1; + if (num == 2) return -0.7; + return -0.5; + }, + }, + threaten: 1.3, + }, + }, + decadexianzhen2: { + audio: "decadexianzhen", + charlotte: true, + onremove: true, + mod: { + targetInRange: function (card, player, target) { + if (target == player.storage.decadexianzhen2) return true; + }, + cardUsableTarget: function (card, player, target) { + if (target == player.storage.decadexianzhen2) return true; + }, + }, + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (arg.target != player.storage.decadexianzhen2) return false; + }, + }, + group: "decadexianzhen2_damage", + subSkill: { + damage: { + audio: "decadexianzhen", + trigger: { source: "damageBegin1" }, + forced: true, + filter: function (event, player) { + return ( + event.card && + event.player == player.storage.decadexianzhen2 && + !player.hasHistory("custom", function (evt) { + return evt.name == "decadexianzhen" && evt.cardname == event.card.name; + }) + ); + }, + logTarget: "player", + content: function () { + trigger.num++; + player.getHistory("custom").push({ + name: "decadexianzhen", + cardname: trigger.card.name, + }); + }, + }, + }, + }, + decadexianzhen3: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + ignoredHandcard: function (card, player) { + if (get.name(card) == "sha") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.name(card) == "sha") { + return false; + } + }, + }, + }, + decadejinjiu: { + global: "decadejinjiu_global", + mod: { + cardname(card) { + if (card.name == "jiu") return "sha"; + }, + cardnumber(card) { + if (card.name == "jiu") return 13; + }, + }, + audio: 2, + audioname2: { + ol_gaoshun: "rejinjiu", + }, + trigger: { player: ["useCard1", "respond"] }, + filter(event, player) { + return event.card.name == "sha" && !event.skill && event.cards && event.cards.length == 1 && event.cards[0].name == "jiu"; + }, + forced: true, + firstDo: true, + content() {}, + subSkill: { + global: { + mod: { + cardEnabled(card, player) { + if (card.name == "jiu") { + var source = _status.currentPhase; + if (source && source != player && source.hasSkill("decadejinjiu")) return false; + } + }, + cardSavable(card, player) { + if (card.name == "jiu") { + var source = _status.currentPhase; + if (source && source != player && source.hasSkill("decadejinjiu")) return false; + } + }, + }, + }, + }, + }, + rebotu: { + audio: "botu", + trigger: { player: "phaseEnd" }, + frequent: true, + filter: function (event, player) { + if (player.countMark("rebotu_count") >= Math.min(3, game.countPlayer())) return false; + var suits = []; + game.getGlobalHistory("cardMove", function (evt) { + if (suits.length >= 4) return; + if (evt.name == "lose") { + if (evt.position == ui.discardPile) { + for (var i of evt.cards) suits.add(get.suit(i, false)); + } + } else { + if (evt.name == "cardsDiscard") { + for (var i of evt.cards) suits.add(get.suit(i, false)); + } + } + }); + return suits.length >= 4; + }, + content: function () { + player.addTempSkill("rebotu_count", "roundStart"); + player.addMark("rebotu_count", 1, false); + player.insertPhase(); + }, + group: "rebotu_mark", + subSkill: { + count: { + onremove: true, + charlotte: true, + }, + mark: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter"], + player: "phaseAfter", + }, + forced: true, + firstDo: true, + silent: true, + filter: function (event, player) { + if (event.name == "phase") return true; + if (player != _status.currentPhase) return false; + if (event.name == "lose") return event.position == ui.discardPile; + return true; + }, + content: function () { + if (trigger.name == "phase") { + player.unmarkSkill("rebotu_mark"); + return; + } + var suits = []; + game.getGlobalHistory("cardMove", function (evt) { + if (suits.length >= 4) return; + if (evt.name == "lose") { + if (evt.position == ui.discardPile) { + for (var i of evt.cards) suits.add(get.suit(i, false)); + } + } else { + if (evt.name == "cardsDiscard") { + for (var i of evt.cards) suits.add(get.suit(i, false)); + } + } + }); + player.storage.rebotu_mark = suits; + player.markSkill("rebotu_mark"); + }, + intro: { + onunmark: true, + content: "本回合已有$花色的牌进入过弃牌堆", + }, + }, + }, + }, + xinganlu: { + enable: "phaseUse", + usable: 1, + audio: 2, + selectTarget: 2, + delay: 0, + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + if (ui.selected.targets.length == 0) return true; + if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0) return false; + return true; + }, + multitarget: true, + multiline: true, + content: function () { + "step 0"; + targets[0].swapEquip(targets[1]); + "step 1"; + game.delayx(); + var num = Math.abs(targets[0].countCards("e") - targets[1].countCards("e")); + if (num > player.getDamagedHp()) player.chooseToDiscard("h", 2, true); + }, + ai: { + order: 10, + expose: 0.2, + threaten: function (player, target) { + return 0.8 * Math.max(1 + target.maxHp - target.hp); + }, + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return -get.value(target.getCards("e"), target); + var target2 = ui.selected.targets[0]; + var eff_target = get.value(target2.getCards("e"), target) - get.value(target.getCards("e"), target); + if (get.sgn(eff_target) == get.sgn(-get.value(target2.getCards("e"), target2))) return 0; + return eff_target; + }, + }, + }, + }, + xinbuyi: { + audio: 2, + trigger: { global: "dying" }, + filter: function (event, player) { + return event.player.countCards("h") > 0; + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + content: function () { + "step 0"; + if (player == trigger.player) + player.chooseCard("h", true).set("ai", function (card) { + if (get.type(card) != "basic") return 100 - get.value(card); + return 0; + }); + else player.choosePlayerCard("h", trigger.player, true); + "step 1"; + var card = result.cards[0], + target = trigger.player; + player.showCards(card, get.translation(player) + "对" + (player == target ? "自己" : get.translation(target)) + "发动了【补益】"); + if (get.type(card, target) != "basic") { + target.discard(card); + target.recover(); + if (target.countCards("h") == 1) target.draw(); + } + }, + logTarget: "player", + }, + rejiaozhao: { + audio: 2, + enable: "phaseUse", + group: "rejiaozhao_base", + locked: false, + mod: { + targetEnabled: function (card, player, target) { + if (player == target && card.storage && card.storage.rejiaozhao) return false; + }, + }, + filter: function (event, player) { + return player.hasMark("redanxin") && player.countCards("h") && player.getStorage("rejiaozhao_clear").length < player.countMark("redanxin"); + }, + chooseButton: { + dialog: function (event, player) { + var list = [], + storage = player.getStorage("rejiaozhao_clear"); + for (var name of lib.inpile) { + var type = get.type(name); + if ((type == "basic" || type == "trick") && !storage.includes(type)) { + list.push([type, "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) list.push([type, "", name, nature]); + } + } + } + return ui.create.dialog("矫诏", [list, "vcard"]); + }, + filter: function (button, player) { + var card = { name: button.link[2], nature: button.link[3] }; + if (player.countMark("redanxin") < 2) card.storage = { rejiaozhao: true }; + var evt = _status.event.getParent(); + return evt.filterCard(card, player, evt); + }, + check: function (button) { + var card = { name: button.link[2], nature: button.link[3] }, + player = _status.event.player; + if (player.countMark("redanxin") < 2) card.storage = { rejiaozhao: true }; + return player.getUseValue(card, null, true); + }, + backup: function (links, player) { + var next = { + audio: "redanxin", + viewAs: { name: links[0][2], nature: links[0][3] }, + filterCard: true, + position: "h", + popname: true, + ai1: card => 8 - get.value(card), + onuse: function (result, player) { + player.addTempSkill("rejiaozhao_clear", "phaseUseAfter"); + player.markAuto("rejiaozhao_clear", [get.type(result.card)]); + }, + }; + if (player.countMark("redanxin") < 2) next.viewAs.storage = { rejiaozhao: true }; + return next; + }, + prompt: function (links) { + return "将一张手牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 6, + result: { + player: 1, + }, + }, + derivation: ["rejiaozhao_lv2", "rejiaozhao_lv3"], + subSkill: { + clear: { onremove: true }, + base: { + audio: "rejiaozhao", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.hasMark("redanxin")) return false; + return player.countCards("h") > 0 && game.hasPlayer(current => current != player); + }, + filterCard: true, + position: "h", + discard: false, + lose: false, + check: function (card) { + return 1 / Math.max(1, _status.event.player.getUseValue(card)); + }, + prompt: "出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。", + content: function () { + "step 0"; + player.showCards(cards); + "step 1"; + var targets = game.filterPlayer(); + targets.remove(player); + targets.sort(function (a, b) { + return Math.max(1, get.distance(player, a)) - Math.max(1, get.distance(player, b)); + }); + var distance = Math.max(1, get.distance(player, targets[0])); + for (var i = 1; i < targets.length; i++) { + if (Math.max(1, get.distance(player, targets[i])) > distance) { + targets.splice(i); + break; + } + } + player + .chooseTarget("请选择【矫诏】的目标", true, function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("targets", targets); + "step 2"; + if (!result.bool) { + event.finish(); + return; + } + var target = result.targets[0]; + event.target = target; + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if (name == "sha") { + list.push(["基本", "", "sha"]); + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } else if (get.type(name) == "basic") list.push(["基本", "", name]); + else if (get.type(name) == "trick") list.push(["锦囊", "", name]); + } + target + .chooseButton(["矫诏", [list, "vcard"]], true) + .set("ai", function (button) { + var player = _status.event.getParent().player, + card = { + name: button.link[2], + nature: button.link[3], + storage: { + rejiaozhao: true, + }, + }; + return player.getUseValue(card, null, true) * _status.event.att; + }) + .set("att", get.attitude(event.target, player) > 0 ? 1 : -1); + "step 3"; + var chosen = result.links[0][2]; + var nature = result.links[0][3]; + var fakecard = { + name: chosen, + storage: { rejiaozhao: true }, + }; + if (nature) fakecard.nature = nature; + event.target.showCards( + game.createCard({ + name: chosen, + nature: nature, + suit: cards[0].suit, + number: cards[0].number, + }), + get.translation(event.target) + "声明了" + get.translation(chosen) + ); + game.broadcastAll( + (player, fakecard) => { + player.storage.rejiaozhao_viewas = fakecard; + }, + player, + fakecard + ); + cards[0].addGaintag("rejiaozhao"); + player.addTempSkill("rejiaozhao_viewas", "phaseUseEnd"); + }, + ai: { + order: 9, + result: { + player: 1, + }, + }, + }, + backup: { audio: "rejiaozhao" }, + viewas: { + enable: "phaseUse", + mod: { + targetEnabled: function (card, player, target) { + if (player == target && card.storage && card.storage.rejiaozhao) return false; + }, + }, + filter: function (event, player) { + if (!player.storage.rejiaozhao_viewas) return false; + var cards = player.getCards("h", function (card) { + return card.hasGaintag("rejiaozhao"); + }); + if (!cards.length) return false; + if (!game.checkMod(cards[0], player, "unchanged", "cardEnabled2", player)) return false; + var card = get.autoViewAs(player.storage.rejiaozhao_viewas, cards); + return event.filterCard(card, player, event); + }, + viewAs: function (cards, player) { + return player.storage.rejiaozhao_viewas; + }, + filterCard: function (card) { + return card.hasGaintag("rejiaozhao"); + }, + selectCard: -1, + position: "h", + popname: true, + prompt: function () { + return "将“矫诏”牌当做" + get.translation(_status.event.player.storage.rejiaozhao_viewas) + "使用"; + }, + onremove: function (player) { + player.removeGaintag("rejiaozhao"); + delete player.storage.rejiaozhao_viewas; + }, + ai: { order: 8 }, + }, + }, + }, + redanxin: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { + player.draw(); + if (player.countMark("redanxin") < 2) player.addMark("redanxin", 1, false); + }, + intro: { content: "当前升级等级。:Lv#" }, + ai: { + maixie: true, + effect: { + target: (card, player, target) => { + if (!get.tag(card, "damage")) return; + if (target.hp + target.hujia < 2 || player.hasSkillTag("jueqing", false, target)) return 2; + if (target.countMark("redanxin") > 1) return [1, 1]; + return [1, 0.8 * target.hp - 0.4]; + }, + }, + }, + }, + //马岱 + reqianxi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (player.hasCard(card => lib.filter.cardDiscardable(card, player, "reqianxi"), "he")) player.chooseToDiscard("he", true); + else event.finish(); + "step 2"; + if (result.bool && game.hasPlayer(current => current != player && get.distance(player, current) <= 1)) { + var color = get.color(result.cards[0], player); + event.color = color; + color = get.translation(color); + player + .chooseTarget(true, "选择【潜袭】的目标", "令其本回合不能使用或打出" + color + "牌,且" + color + "防具失效,且回复体力时,你摸两张牌", function (card, player, target) { + return target != player && get.distance(player, target) <= 1; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) * Math.sqrt(1 + target.countCards("he")); + }); + } else event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.storage.reqianxi_effect = [event.color, player]; + target.addTempSkill("reqianxi_effect"); + } + }, + subSkill: { + effect: { + mark: true, + intro: { + markcount: () => 0, + content: function (storage, player) { + var color = get.translation(storage[0]), + source = get.translation(storage[1]); + return "本回合不能使用或打出" + color + "牌,且" + color + "防具失效,且回复体力时," + source + "摸两张牌"; + }, + }, + charlotte: true, + onremove: true, + mod: { + cardEnabled2: function (card, player) { + if (get.itemtype(card) == "card" && get.color(card) == player.getStorage("reqianxi_effect")[0]) return false; + }, + }, + trigger: { player: "recoverEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + return player.storage.reqianxi_effect && player.storage.reqianxi_effect[1].isIn(); + }, + content: function () { + var target = player.storage.reqianxi_effect[1]; + target.logSkill("reqianxi", player); + target.draw(2); + }, + ai: { + unequip2: true, + skillTagFilter: function (player) { + var evt = _status.event, + color = player.getStorage("reqianxi_effect")[0]; + if (evt.name == "lose" && evt.loseEquip) { + var card = evt.cards[evt.num]; + if (card && get.subtype(card, false) == "equip2" && get.color(card) == color) return true; + return false; + } else { + var equip = player.getEquip(2); + if (equip && get.color(equip) == color) return true; + return false; + } + }, + }, + }, + }, + }, + //徐晃 + olduanliang: { + audio: 2, + locked: false, + enable: "chooseToUse", + filterCard: function (card) { + return get.type2(card) != "trick" && get.color(card) == "black"; + }, + filter: function (event, player) { + return player.hasCard(card => get.type2(card) != "trick" && get.color(card) == "black", "hes"); + }, + position: "hes", + viewAs: { name: "bingliang" }, + prompt: "将一张黑色非锦囊牌当做兵粮寸断使用", + check: function (card) { + return 6 - get.value(card); + }, + ai: { + order: 9, + }, + mod: { + targetInRange: function (card, player, target) { + if (card.name == "bingliang" && !player.getStat("damage")) return true; + }, + }, + }, + oljiezi: { + audio: 2, + trigger: { global: ["phaseDrawSkipped", "phaseDrawCancelled"] }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("oljiezi"), "你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。").set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (!target.hasMark("oljiezi") && target.isMinHandcard()) att *= 2; + return att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("oljiezi", target); + if (!target.hasMark("oljiezi") && target.isMinHandcard()) target.addMark("oljiezi", 1); + else target.draw(); + } + }, + marktext: "辎", + intro: { + name2: "辎", + content: "mark", + onunmark: true, + }, + group: "oljiezi_extra", + subSkill: { + extra: { + audio: "oljiezi", + trigger: { global: "phaseDrawAfter" }, + forced: true, + filter: function (event, player) { + return event.player.hasMark("oljiezi"); + }, + logTarget: "player", + content: function () { + var next = trigger.player.phaseDraw(); + event.next.remove(next); + trigger.getParent().next.add(next); + trigger.player.removeMark("oljiezi", trigger.player.countMark("oljiezi")); + }, + }, + }, + }, + //界护驾 + rehujia: { + audio: "hujia", + inherit: "hujia", + filter: function (event, player) { + if (event.responded) return false; + if (player.storage.hujiaing) return false; + if (!player.hasZhuSkill("rehujia")) return false; + if (!event.filterCard({ name: "shan" }, player, event)) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wei"; + }); + }, + ai: { + respondShan: true, + skillTagFilter: function (player) { + if (player.storage.hujiaing) return false; + if (!player.hasZhuSkill("rehujia")) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wei"; + }); + }, + }, + group: "rehujia_draw", + subSkill: { + draw: { + trigger: { global: ["useCard", "respond"] }, + usable: 1, + direct: true, + filter: function (event, player) { + return event.card.name == "shan" && event.player != player && event.player.group == "wei" && event.player.isIn() && event.player != _status.currentPhase && player.hasZhuSkill("rehujia"); + }, + content: function () { + "step 0"; + trigger.player.chooseBool("护驾:是否令" + get.translation(player) + "摸一张牌?").set("ai", function () { + var evt = _status.event; + return get.attitude(evt.player, evt.getParent().player) > 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("rehujia"); + trigger.player.line(player, "fire"); + player.draw(); + } else player.storage.counttrigger.rehujia_draw--; + }, + }, + }, + }, + //夏侯氏 + reqiaoshi: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player != player && event.player.countCards("h") == player.countCards("h") && event.player.isIn(); + }, + check: function (event, player) { + return get.attitude(player, event.player) >= 0; + }, + //priority:-5, + logTarget: "player", + content: function () { + "step 0"; + game.asyncDraw([trigger.player, player]); + "step 1"; + game.delayx(); + if (player.isIn() && trigger.player.isIn()) { + var getGainSuit = function (player) { + var last = player.getHistory("gain", function (evt) { + return evt.getParent(2) == event; + }); + if (last.length) { + var evt = last.pop(); + if (evt.cards.length == 1 && player.getCards("h").includes(evt.cards[0])) return get.suit(evt.cards[0], player); + } else return player; + }; + if (getGainSuit(player) == getGainSuit(trigger.player)) player.chooseBool("是否继续发动【樵拾】?", "和" + get.translation(trigger.player) + "各摸一张牌"); + } else event.finish(); + "step 2"; + if (result.bool) event.goto(0); + }, + ai: { + expose: 0.1, + }, + }, + reyanyu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.hasCard(card => lib.skill.reyanyu.filterCard(card, player), "h"); + }, + filterCard: (card, player) => get.name(card) == "sha" && player.canRecast(card), + discard: false, + lose: false, + delay: false, + content: function () { + player.recast(cards); + }, + ai: { + basic: { + order: 1, + }, + result: { + player: 1, + }, + }, + group: "reyanyu2", + }, + reyanyu2: { + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: (event, player) => player.hasHistory("useSkill", evt => evt.skill == "reyanyu" && evt.event.getParent(2) == event) && game.hasPlayer(target => target.hasSex("male") && target != player), + content: function () { + "step 0"; + event.num = Math.min(3, player.getHistory("useSkill", evt => evt.skill == "reyanyu" && evt.event.getParent(2) == trigger).length); + player + .chooseTarget(get.prompt("reyanyu"), "令一名男性角色摸" + get.cnNumber(event.num) + "张牌", function (card, player, target) { + return target.hasSex("male") && target != player; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + player.logSkill("reyanyu", result.targets); + result.targets[0].draw(event.num); + } + }, + }, + //虞翻 + xinzongxuan: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + if (event.type != "discard") return false; + var evt = event.getl(player); + if (!evt || !evt.cards2) return false; + for (var i = 0; i < evt.cards2.length; i++) { + if (get.position(evt.cards2[i]) == "d") { + return true; + } + } + return false; + }, + check: function (trigger, player) { + if (trigger.getParent(3).name == "phaseDiscard") return true; + if ( + !game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); + }) + ) + return false; + var cards = trigger.getl(player).cards2; + for (var i = 0; i < cards.length; i++) { + if (get.position(cards[i], true) == "d" && get.type2(cards[i], false) == "trick") { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var cards = [], + cards2 = trigger.getl(player).cards2; + for (var i = 0; i < cards2.length; i++) { + if (get.position(cards2[i], true) == "d") { + cards.push(cards2[i]); + } + } + var next = player.chooseToMove("纵玄:将任意张牌置于牌堆顶", true); + next.set("list", [["本次弃置的牌(请将要给出的锦囊牌留在这里)", cards], ["牌堆顶"]]); + next.set("filterOk", function (moved) { + if (moved[0].length == 1 && get.type2(moved[0][0], false) == "trick") return true; + return moved[1].length > 0; + }); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0), + player = _status.event.player; + var result = [[], []]; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); + }) + ) { + var max_val = 0; + var max_card = false; + for (var i of cards) { + if (get.type2(i, false) == "trick") { + var val = get.value(i, "raw"); + if (val > max_val) { + max_card = i; + max_val = val; + } + } + } + if (max_card) { + result[0].push(max_card); + cards.remove(max_card); + } + } + if (cards.length) { + var max_val = 0; + var max_card = false; + var equip = game.hasPlayer(function (current) { + return current.isDamaged() && get.recoverEffect(current, player, player) > 0; + }); + for (var i of cards) { + var val = get.value(i); + var type = get.type2(i, false); + if (type == "basic") val += 3; + if (type == "equip" && equip) val += 9; + if (max_val == 0 || val > max_val) { + max_card = i; + max_val = val; + } + } + if (max_card) { + result[1].push(max_card); + cards.remove(max_card); + } + result[0].addArray(cards); + } + return result; + }); + "step 1"; + if (result.bool) { + var cards = result.moved[1].slice(0); + if (cards.length) { + game.log(player, "将", cards, "置于了牌堆顶"); + while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); + } + var list = result.moved[0].filter(function (i) { + return get.type2(i, false) == "trick"; + }); + if (list.length && game.hasPlayer(current => current != player)) { + var next = player + .chooseButton(["是否将一张锦囊牌交给一名其他角色?", list]) + .set("ai", function (button) { + if (_status.event.goon) return Math.max(0.1, get.value(button.link, "raw")); + return 0; + }) + .set( + "goon", + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); + }) + ); + if (!result.moved[1].length) next.set("forced", true); + } else event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget(lib.filter.notMe, true, "令一名其他角色获得" + get.translation(card)) + .set("card", card) + .set("ai", function (target) { + var card = _status.event.card, + player = _status.event.player; + var eff = Math.max(0.1, get.value(card, target)) * get.attitude(player, target); + if (target.hasSkill("nogain")) eff /= 10; + return eff; + }); + } else event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(card, "gain2"); + } + }, + }, + xinzhiyan: { + audio: "zhiyan", + audioname: ["gexuan", "re_yufan", "xin_yufan"], + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("zhiyan"), "令一名角色摸一张牌并展示之。若为基本牌则你摸一张牌;若为装备牌,则其回复1点体力").set("ai", function (target) { + return get.attitude(_status.event.player, target) * (target.isDamaged() ? 2 : 1); + }); + "step 1"; + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("xinzhiyan", result.targets); + event.bool = false; + event.target.draw("visible"); + } else { + event.finish(); + } + "step 2"; + var card = result[0]; + event.card = card; + if (get.type(card) == "basic") player.draw(); + "step 3"; + if (get.type(card) == "equip") { + if (target.getCards("h").includes(card) && target.hasUseTarget(card)) { + event.target.chooseUseTarget(card, true, "nopopup"); + game.delay(); + } + event.bool = true; + } + "step 4"; + if (event.bool) target.recover(); + }, + ai: { + expose: 0.2, + threaten: 1.2, + }, + }, + //新主公技 + xinhuangtian: { + unique: true, + audio: "xinhuangtian2", + audioname: ["zhangjiao", "re_zhangjiao"], + global: "xinhuangtian2", + zhuSkill: true, + }, + xinhuangtian2: { + audio: 2, + enable: "phaseUse", + discard: false, + lose: false, + delay: false, + line: true, + prepare: function (cards, player, targets) { + targets[0].logSkill("xinhuangtian"); + }, + prompt: function () { + var player = _status.event.player; + var list = game.filterPlayer(function (target) { + return target != player && target.hasZhuSkill("xinhuangtian", player); + }); + var str = "将一张【闪】或黑桃手牌交给" + get.translation(list); + if (list.length > 1) str += "中的一人"; + return str; + }, + filter: function (event, player) { + if (player.group != "qun") return false; + if ( + !game.hasPlayer(function (target) { + return target != player && target.hasZhuSkill("xinhuangtian", player) && !target.hasSkill("xinhuangtian3"); + }) + ) + return false; + return player.hasCard(function (card) { + return lib.skill.xinhuangtian2.filterCard(card, player); + }, "h"); + }, + filterCard: function (card, player) { + return get.name(card, player) == "shan" || get.suit(card, player) == "spade"; + }, + log: false, + visible: true, + filterTarget: function (card, player, target) { + return target != player && target.hasZhuSkill("xinhuangtian", player) && !target.hasSkill("xinhuangtian3"); + }, + //usable:1, + //forceaudio:true, + content: function () { + player.give(cards, target); + target.addTempSkill("xinhuangtian3", "phaseUseEnd"); + }, + ai: { + expose: 0.3, + order: 10, + result: { + target: 5, + }, + }, + }, + xinhuangtian3: {}, + rejijiang: { + audio: "jijiang1", + audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], + unique: true, + group: ["rejijiang1", "rejijiang3"], + zhuSkill: true, + filter: function (event, player) { + if ( + !player.hasZhuSkill("rejijiang") || + !game.hasPlayer(function (current) { + return current != player && current.group == "shu"; + }) + ) + return false; + return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3")); + }, + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { name: "sha" }, + filterCard: function () { + return false; + }, + selectCard: -1, + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.3; + }, + respondSha: true, + skillTagFilter: function (player) { + if ( + !player.hasZhuSkill("rejijiang") || + !game.hasPlayer(function (current) { + return current != player && current.group == "shu"; + }) + ) + return false; + }, + }, + }, + rejijiang1: { + audio: "jijiang1", + audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], + trigger: { player: ["useCardBegin", "respondBegin"] }, + logTarget: "targets", + filter: function (event, player) { + return event.skill == "rejijiang"; + }, + forced: true, + content: function () { + "step 0"; + delete trigger.skill; + trigger.getParent().set("jijiang", true); + "step 1"; + if (event.current == undefined) event.current = player.next; + if (event.current == player) { + player.addTempSkill("jijiang3"); + event.finish(); + trigger.cancel(); + trigger.getParent().goto(0); + } else if (event.current.group == "shu") { + var next = event.current.chooseToRespond("是否替" + get.translation(player) + "打出一张杀?", { name: "sha" }); + next.set("ai", function () { + var event = _status.event; + return get.attitude(event.player, event.source) - 2; + }); + next.set("source", player); + next.set("jijiang", true); + next.set("skillwarn", "替" + get.translation(player) + "打出一张杀"); + next.noOrdering = true; + next.autochoose = lib.filter.autoRespondSha; + } else { + event.current = event.current.next; + event.redo(); + } + "step 2"; + if (result.bool) { + event.finish(); + trigger.card = result.card; + trigger.cards = result.cards; + trigger.throw = false; + if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) { + event.current.ai.shown += 0.3; + if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; + } + } else { + event.current = event.current.next; + event.goto(1); + } + }, + }, + rejijiang3: { + trigger: { global: ["useCard", "respond"] }, + usable: 1, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && event.player != player && event.player.group == "shu" && event.player.isIn() && event.player != _status.currentPhase && player.hasZhuSkill("rejijiang"); + }, + content: function () { + "step 0"; + trigger.player.chooseBool("激将:是否令" + get.translation(player) + "摸一张牌?").set("ai", function () { + var evt = _status.event; + return get.attitude(evt.player, evt.getParent().player) > 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("rejijiang"); + trigger.player.line(player, "fire"); + player.draw(); + } else player.storage.counttrigger.rejijiang3--; + }, + }, + //鲁肃 + olhaoshi: { + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { + return !event.numFixed; + }, + check: function (event, player) { + return ( + player.countCards("h") + 2 + event.num <= 5 || + game.hasPlayer(function (target) { + return ( + player !== target && + !game.hasPlayer(function (current) { + return current !== player && current !== target && current.countCards("h") < target.countCards("h"); + }) && + get.attitude(player, target) > 0 + ); + }) + ); + }, + content: function () { + trigger.num += 2; + player.addTempSkill("olhaoshi_give", "phaseDrawAfter"); + }, + subSkill: { + give: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return player.countCards("h") > 5; + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(function (target) { + return ( + target != player && + !game.hasPlayer(function (current) { + return current != player && current != target && current.countCards("h") < target.countCards("h"); + }) + ); + }), + num = Math.floor(player.countCards("h") / 2); + player.chooseCardTarget({ + position: "h", + filterCard: true, + filterTarget: function (card, player, target) { + return _status.event.targets.includes(target); + }, + targets: targets, + selectTarget: targets.length == 1 ? -1 : 1, + selectCard: num, + prompt: "将" + get.cnNumber(num) + "张手牌交给一名手牌数最少的其他角色", + forced: true, + ai1: function (card) { + var goon = false, + player = _status.event.player; + for (var i of _status.event.targets) { + if (get.attitude(i, player) > 0 && get.attitude(player, i) > 0) goon = true; + break; + } + if (goon) { + if ( + !player.hasValueTarget(card) || + (card.name == "sha" && + player.countCards("h", function (cardx) { + return cardx.name == "sha" && !ui.selected.cards.includes(cardx); + }) > player.getCardUsable("sha")) + ) + return 2; + return Math.max(2, get.value(card) / 4); + } + return 1 / Math.max(1, get.value(card)); + }, + ai2: function (target) { + return get.attitude(_status.event.player, target); + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.give(result.cards, target); + player.markAuto("olhaoshi_help", [target]); + player.addTempSkill("olhaoshi_help", { player: "phaseBeginStart" }); + } + }, + }, + help: { + trigger: { target: "useCardToTargeted" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + if (!player.storage.olhaoshi_help || !player.storage.olhaoshi_help.length) return false; + if (event.card.name != "sha" && get.type(event.card) != "trick") return false; + for (var i of player.storage.olhaoshi_help) { + if (i.countCards("h") > 0) return true; + } + return false; + }, + content: function () { + "step 0"; + if (!event.targets) event.targets = player.storage.olhaoshi_help.slice(0).sortBySeat(); + event.target = event.targets.shift(); + event.target + .chooseCard("h", "好施:是否将一张手牌交给" + get.translation(player) + "?") + .set("ai", function (card) { + var player = _status.event.player, + target = _status.event.getTrigger().player; + if (!_status.event.goon) { + if (get.value(card, player) < 0 || get.value(card, target) < 0) return 1; + return 0; + } + var cardx = _status.event.getTrigger().card; + if (card.name == "shan" && get.tag(cardx, "respondShan") && target.countCards("h", "shan") < player.countCards("h", "shan")) return 2; + if (card.name == "sha" && (cardx.name == "juedou" || (get.tag(card, "respondSha") && target.countCards("h", "sha") < player.countCards("h", "sha")))) return 2; + if (get.value(card, target) > get.value(card, player) || target.getUseValue(card) > player.getUseValue(card)) return 1; + if (player.hasSkillTag("noh")) return 0.5 / Math.max(1, get.value(card, player)); + return 0; + }) + .set("goon", get.attitude(event.target, player) > 0); + "step 1"; + if (result.bool) { + target.logSkill("olhaoshi_help", player); + target.give(result.cards, player); + } + if (targets.length) event.goto(0); + }, + }, + }, + }, + oldimeng: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => lib.skill.oldimeng.filterTarget(null, player, current)); + }, + selectTarget: 2, + complexTarget: true, + filterTarget: function (card, player, target) { + if (target == player) return false; + var ps = player.countCards("he"); + if (!ui.selected.targets.length) { + var hs = target.countCards("h"); + return game.hasPlayer(function (current) { + if (current == player || current == target) return false; + var cs = current.countCards("h"); + return (hs > 0 || cs > 0) && Math.abs(hs - cs) <= ps; + }); + } + var current = ui.selected.targets[0], + hs = target.countCards("h"), + cs = current.countCards("h"); + return (hs > 0 || cs > 0) && Math.abs(hs - cs) <= ps; + }, + multitarget: true, + multiline: true, + content: function () { + targets[0].swapHandcards(targets[1]); + var num = Math.abs(targets[0].countCards("h") - targets[1].countCards("h")); + if (num > 0) { + player.addMark("oldimeng_discard", num, false); + player.addTempSkill("oldimeng_discard", "phaseUseAfter"); + } + }, + ai: { + threaten: 4.5, + pretao: true, + nokeep: true, + order: 1, + expose: 0.2, + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return -Math.sqrt(target.countCards("h")); + var h1 = ui.selected.targets[0].getCards("h"), + h2 = target.getCards("h"); + if (h2.length > h1.length) return 0; + var delval = get.value(h2, target) - get.value(h1, ui.selected.targets[0]); + if (delval >= 0) return 0; + return -delval * (h1.length - h2.length); + }, + }, + }, + subSkill: { + discard: { + trigger: { player: "phaseUseEnd" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + player.chooseToDiscard("he", true, player.countMark("oldimeng_discard")); + }, + }, + }, + }, + //贾诩 + rewansha: { + audio: "wansha", + audioname: ["re_jiaxu", "shen_simayi", "boss_lvbu3"], + global: "rewansha_global", + trigger: { global: "dyingBegin" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return player == _status.currentPhase; + }, + content: function () { + game.countPlayer(function (current) { + if (current != player && current != trigger.player) current.addSkillBlocker("rewansha_fengyin"); + }); + player.addTempSkill("rewansha_clear"); + }, + subSkill: { + global: { + mod: { + cardEnabled: function (card, player) { + var source = _status.currentPhase; + if (card.name == "tao" && source && source != player && source.hasSkill("rewansha") && !player.isDying()) return false; + }, + cardSavable: function (card, player) { + var source = _status.currentPhase; + if (card.name == "tao" && source && source != player && source.hasSkill("rewansha") && !player.isDying()) return false; + }, + }, + }, + fengyin: { + inherit: "fengyin", + }, + clear: { + trigger: { global: "dyingAfter" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return !_status.dying.length; + }, + content: function () { + player.removeSkill("rewansha_clear"); + }, + onremove: function () { + game.countPlayer2(function (current) { + current.removeSkillBlocker("rewansha_fengyin"); + }); + }, + }, + }, + }, + reluanwu: { + audio: "luanwu", + audioname: ["re_jiaxu"], + unique: true, + enable: "phaseUse", + limited: true, + skillAnimation: "epic", + animationColor: "thunder", + filterTarget: function (card, player, target) { + return target != player; + }, + selectTarget: -1, + multiline: true, + contentBefore: function () { + player.awakenSkill("reluanwu"); + }, + content: function () { + "step 0"; + target + .chooseToUse( + "乱武:使用一张杀或失去1点体力", + function (card) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + function (card, player, target) { + if (player == target) return false; + var dist = get.distance(player, target); + if (dist > 1) { + if ( + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) < dist; + }) + ) { + return false; + } + } + return lib.filter.filterTarget.apply(this, arguments); + } + ) + .set("ai2", function () { + return get.effect_use.apply(this, arguments) - _status.event.effect; + }) + .set("effect", get.effect(target, { name: "losehp" }, target, target)); + "step 1"; + if (result.bool == false) { + target.loseHp(); + } + }, + contentAfter: function () { + player.chooseUseTarget("sha", "是否使用一张【杀】?", false, "nodistance"); + }, + ai: { + order: 1, + result: { + player: function (player) { + if (lib.config.mode == "identity" && game.zhu.isZhu && player.identity == "fan") { + if (game.zhu.hp == 1 && game.zhu.countCards("h") <= 2) return 1; + } + var num = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var att = get.attitude(player, players[i]); + if (att > 0) att = 1; + if (att < 0) att = -1; + if (players[i] != player && players[i].hp <= 3) { + if (players[i].countCards("h") == 0) num += att / players[i].hp; + else if (players[i].countCards("h") == 1) num += att / 2 / players[i].hp; + else if (players[i].countCards("h") == 2) num += att / 4 / players[i].hp; + } + if (players[i].hp == 1) num += att * 1.5; + } + if (player.hp == 1) { + return -num; + } + if (player.hp == 2) { + return -game.players.length / 4 - num; + } + return -game.players.length / 3 - num; + }, + }, + }, + }, + reweimu: { + audio: 2, + mod: { + targetEnabled: function (card) { + if (get.type2(card) == "trick" && get.color(card) == "black") return false; + }, + }, + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return player == _status.currentPhase; + }, + content: function () { + trigger.cancel(); + var num = trigger.num; + player.draw(2 * num); + }, + ai: { + effect: { + target: function (card, player, target) { + if (target == _status.currentPhase && get.tag(card, "damage")) return [0, 1]; + }, + }, + }, + }, + //顾雍 + reshenxing: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") >= Math.min(2, player.getStat("skill").reshenxing || 0); + }, + selectCard: function () { + return Math.min(2, _status.event.player.getStat("skill").reshenxing || 0); + }, + prompt: function () { + return "弃置" + get.cnNumber(Math.min(2, _status.event.player.getStat("skill").reshenxing || 0)) + "张牌并摸一张牌"; + }, + check: function (card) { + var num = _status.event.player.countCards("h", { color: get.color(card) }); + if (get.position(card) == "e") num++; + return (Math.max(4, 7.1 - num) - get.value(card)) / num; + }, + filterCard: true, + position: "he", + content: function () { + player.draw(); + }, + ai: { + order: function (item, player) { + if (!player.getStat("skill").reshenxing) return 10; + return 1; + }, + result: { player: 1 }, + }, + }, + rebingyi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterx: function (player) { + var cards = player.getCards("h"); + if (cards.length == 1) return true; + var color = get.color(cards[0], player); + for (var i = 1; i < cards.length; i++) { + if (get.color(cards[i], player) != color) return false; + } + return true; + }, + filtery: function (player) { + var cards = player.getCards("h"); + if (cards.length == 1) return true; + var color = get.number(cards[0], player); + for (var i = 1; i < cards.length; i++) { + if (get.number(cards[i], player) != color) return false; + } + return true; + }, + async cost(event, trigger, player) { + const selfDraw = lib.skill.rebingyi.filtery(player), + asyncDraw = lib.skill.rebingyi.filterx(player); + if (asyncDraw) { + const num = player.countCards("h"); + const result = await player + .chooseTarget(get.prompt("rebingyi"), `展示所有手牌,并选择至多${get.cnNumber(num)}名角色各摸一张牌${selfDraw ? "" : ",然后你摸一张牌"}`, [0, num]) + .set("ai", function (target) { + return get.attitude(get.player(), target); + }) + .forResult(); + if (result.bool) + event.result = { + bool: result.bool, + cost_data: { + asyncDraw, + selfDraw, + targets: result.targets, + }, + }; + } else { + event.result = await player + .chooseBool(get.prompt("rebingyi"), `展示所有手牌${selfDraw ? "" : ",然后你摸一张牌"}`) + .set("choice", selfDraw) + .set("ai", () => get.event().choice) + .forResult(); + event.result.cost_data = { selfDraw }; + } + }, + async content(event, trigger, player) { + await player.showHandcards(get.translation(player) + "发动了【秉壹】"); + const data = event.cost_data; + if (data.asyncDraw && data.targets && data.targets.length) { + const targets = data.targets.sortBySeat(); + await game.asyncDraw(targets); + } + if (data.selfDraw) { + player.draw(); + } + }, + }, + //钟会 + xinquanji: { + audio: 2, + trigger: { + player: ["damageEnd"], + global: ["gainAfter", "loseAsyncAfter"], + }, + filter: function (event, player) { + if (event.name == "damage") return true; + if (event.name == "loseAsync") { + if (event.type != "gain" || event.giver) return false; + var cards = event.getl(player).cards2; + return game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if (cards.includes(i)) return true; + } + return false; + }); + } + if (player == event.player) return false; + if (event.giver || event.getParent().name == "gift") return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; + }, + frequent: true, + content: function () { + "step 0"; + event.count = trigger.name == "damage" ? trigger.num : 1; + "step 1"; + event.count--; + player.draw(); + "step 2"; + var hs = player.getCards("h"); + if (hs.length) { + if (hs.length == 1) event._result = { bool: true, cards: hs }; + else player.chooseCard("h", true, "选择一张手牌作为“权”"); + } else event.goto(4); + "step 3"; + if (result.bool && result.cards && result.cards.length) { + player.addToExpansion(result.cards, "giveAuto", player).gaintag.add("xinquanji"); + } + "step 4"; + if (event.count > 0 && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { + player.chooseBool(get.prompt2("xinquanji")).set("frequentSkill", event.name); + } else event.finish(); + "step 5"; + if (result.bool) { + player.logSkill("xinquanji"); + event.goto(1); + } + }, + locked: false, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("xinquanji").length; + }, + }, + ai: { + maixie: true, + maixie_hp: true, + threaten: 0.8, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage") && !target.storage.xinzili) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; + if (!target.hasSkill("xinpaiyi") && target.hp > 1) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; + } + }, + }, + }, + }, + xinzili: { + derivation: "xinpaiyi", + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.getExpansions("xinquanji").length > 2; + }, + content: function () { + player.awakenSkill("xinzili"); + player.recover(); + player.draw(2); + player.loseMaxHp(); + player.addSkills("xinpaiyi"); + }, + ai: { + combo: "xinquanji", + }, + }, + xinpaiyi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.getExpansions("xinquanji").length > 0 && (!player.hasSkill("xinpaiyi_0") || !player.hasSkill("xinpaiyi_1")); + }, + chooseButton: { + check: function (button) { + if (typeof button.link == "object") return 1; + var player = _status.event.player, + num = player.getExpansions("xinquanji").length - 1; + if (button.link == 1) { + if ( + game.countPlayer(function (current) { + return get.damageEffect(current, player, player) > 0; + }) < num + ) + return 0.5; + return 2; + } + if (num < 2) return 0; + return 1; + }, + dialog: function (event, player) { + var dialog = ui.create.dialog("权计", "hidden"); + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + var list = ["摸牌", "造成伤害"]; + dialog.add([ + list.map((item, i) => { + return [i, item]; + }), + "tdnodes", + ]); + dialog.add(player.getExpansions("xinquanji")); + return dialog; + }, + select: 2, + filter: function (button, player) { + if (typeof button.link == "number" && player.hasSkill("xinpaiyi_" + button.link)) return false; + if (ui.selected.buttons.length) return typeof ui.selected.buttons[0].link != typeof button.link; + return true; + }, + backup: function (links) { + if (typeof links[0] == "object") links.reverse(); + var next = get.copy(lib.skill["xinpaiyi_backup" + links[0]]); + next.card = links[1]; + return next; + }, + prompt: function (links, player) { + if (typeof links[0] == "object") links.reverse(); + var num = get.cnNumber(Math.max(1, player.getExpansions("xinquanji").length - 1)), + card = get.translation(links[1]); + if (links[0] == 0) return "移去" + card + "并令一名角色摸" + num + "张牌"; + return "移去" + card + "并对至多" + num + "名角色造成1点伤害"; + }, + }, + ai: { + order: 1, + result: { player: 1 }, + combo: "xinquanji", + }, + subSkill: { + 0: {}, + 1: {}, + backup0: { + audio: "xinpaiyi", + filterCard: () => false, + selectCard: -1, + filterTarget: true, + delay: false, + content: function () { + "step 0"; + player.addTempSkill("xinpaiyi_0", "phaseUseEnd"); + var card = lib.skill.xinpaiyi_backup.card; + player.loseToDiscardpile(card); + "step 1"; + target.draw(Math.max(1, player.getExpansions("xinquanji").length)); + }, + ai: { + result: { + target: function (player, target) { + if (target.hasSkill("nogain")) return 0; + if (player == target && !player.needsToDiscard()) return 3; + return 1; + }, + }, + }, + }, + backup1: { + audio: "xinpaiyi", + filterCard: () => false, + selectCard: -1, + filterTarget: true, + delay: false, + multitarget: true, + multiline: true, + selectTarget: function () { + return [1, Math.max(1, _status.event.player.getExpansions("xinquanji").length - 1)]; + }, + content: function () { + "step 0"; + targets.sortBySeat(); + player.addTempSkill("xinpaiyi_1", "phaseUseEnd"); + var card = lib.skill.xinpaiyi_backup.card; + player.loseToDiscardpile(card); + "step 1"; + for (var i of targets) i.damage(); + }, + ai: { + tag: { + damage: 1, + }, + result: { + target: -1.5, + }, + }, + }, + }, + }, + //界蔡夫人 + reqieting: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + filter: function (event, player) { + var target = event.player; + if (player == target) return false; + if (!target.getHistory("sourceDamage").length) { + var cards = target.getCards("e"); + for (var i of cards) { + if (player.canEquip(i)) return true; + } + } + return ( + target.getHistory("useCard", function (evt) { + return ( + evt.targets && + evt.targets.filter(function (i) { + return i != target; + }).length > 0 + ); + }).length == 0 + ); + }, + frequent: true, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + event.logged = false; + var list = []; + if (!target.getHistory("sourceDamage").length) { + var cards = target.getCards("e"); + for (var i of cards) { + if (player.canEquip(i)) list.push(i); + } + } + if (list.length) { + player + .choosePlayerCard(target, "e", get.prompt("reqieting", target)) + .set("list", list) + .set("filterButton", function (button) { + return _status.event.list.includes(button.link); + }) + .set("ai", function (button) { + var evt = _status.event, + val = get.value(button.link); + if (evt.target.hasSkillTag("noe")) val -= 4; + if (evt.att > 0 == val > 0) return 0; + return get.effect(evt.player, button.link, evt.player, evt.player); + }) + .set("att", get.attitude(player, target)); + } else event.goto(2); + "step 1"; + if (result.bool) { + player.logSkill("reqieting", target); + event.logged = true; + var card = result.links[0]; + target.$give(card, player, false); + game.delay(0.5); + player.equip(card); + } + if ( + target.getHistory("useCard", function (evt) { + return ( + evt.targets && + evt.targets.filter(function (i) { + return i != target; + }).length > 0 + ); + }).length != 0 + ) + event.finish(); + "step 2"; + player.chooseBool("是否发动【窃听】摸一张牌?").set("frequentSkill", "reqieting"); + "step 3"; + if (result.bool) { + if (!event.logged) player.logSkill("reqieting", target); + player.draw(); + } + }, + }, + rexianzhou: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.countCards("e") > 0; + }, + filterCard: true, + position: "e", + selectCard: -1, + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.awakenSkill("rexianzhou"); + player.give(cards, target); + player.recover(cards.length); + "step 1"; + var list = game.filterPlayer(function (current) { + return target.inRange(current); + }); + if (list.length) { + var max = Math.min(list.length, cards.length); + target + .chooseTarget(true, [1, max], "对至多" + get.cnNumber(max) + "名范围内的角色各造成1点伤害", function (card, player, target) { + return _status.event.list.includes(target); + }) + .set("list", list) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); + for (var i of targets) i.damage("nocard"); + } + }, + ai: { + order: 1, + result: { + target: 1, + player: function (player) { + var bool = true, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 2 && get.attitude(players[i], player) > 2) { + bool = false; + break; + } + } + if (bool) return -10; + if (player.hp == 1) return 1; + if (game.phaseNumber < game.players.length) return -10; + if (player.countCards("e") + player.hp <= player.maxHp) return 1; + return -10; + }, + }, + }, + }, + //界关平 + relongyin: { + audio: 2, + shaRelated: true, + init: player => { + game.addGlobalSkill("relongyin_order"); + }, + onremove: player => { + if (!game.hasPlayer(current => current.hasSkill("relongyin"), true)) game.removeGlobalSkill("relongyin_order"); + }, + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countCards("he") > 0 && event.player.isPhaseUsing(); + }, + content: function () { + "step 0"; + var go = false; + if (get.attitude(player, trigger.player) > 0) { + if (get.color(trigger.card) == "red") { + go = true; + } else if (trigger.addCount === false || !trigger.player.isPhaseUsing()) go = false; + else if (!trigger.player.hasSkill("paoxiao") && !trigger.player.hasSkill("tanlin3") && !trigger.player.hasSkill("zhaxiang2") && !trigger.player.hasSkill("fengnu") && !trigger.player.getEquip("zhuge")) { + var nh = trigger.player.countCards("h"); + if (player == trigger.player) { + go = player.countCards("h", "sha") > 0; + } else if (nh >= 4) { + go = true; + } else if (player.countCards("h", "sha")) { + if (nh == 3) { + go = Math.random() < 0.8; + } else if (nh == 2) { + go = Math.random() < 0.5; + } + } else if (nh >= 3) { + if (nh == 3) { + go = Math.random() < 0.5; + } else if (nh == 2) { + go = Math.random() < 0.2; + } + } + } + } + //AI停顿 + if ( + go && + !event.isMine() && + !event.isOnline() && + player.hasCard(function (card) { + return get.value(card) < 6 && lib.filter.cardDiscardable(card, player, event.name); + }, "he") + ) { + game.delayx(); + } + var next = player.chooseToDiscard(get.prompt("longyin"), "弃置一张牌" + (get.color(trigger.card) == "red" ? "并摸一张牌" : "") + ",令" + get.translation(trigger.player) + "本次使用的【杀】不计入使用次数", "he"); + next.logSkill = ["relongyin", trigger.player]; + next.set("ai", function (card) { + if (_status.event.go) { + return 6 - get.value(card); + } + return 0; + }); + next.set("go", go); + "step 1"; + if (result.bool) { + if (trigger.addCount !== false) { + trigger.addCount = false; + trigger.player.getStat().card.sha--; + } + if (get.color(trigger.card) == "red") { + player.draw(); + } + if (get.number(result.cards[0], player) == get.number(trigger.card)) player.restoreSkill("jiezhong"); + } + }, + ai: { + expose: 0.2, + }, + subSkill: { + order: { + mod: { + aiOrder: (player, card, num) => { + if (num && card.name === "sha" && get.color(card) === "red") { + let gp = game.findPlayer(current => { + return current.hasSkill("relongyin") && current.hasCard(i => true, "he"); + }); + if (gp) return num + 0.15 * Math.sign(get.attitude(player, gp)); + } + }, + }, + trigger: { player: "dieAfter" }, + filter: (event, player) => { + return !game.hasPlayer(current => current.hasSkill("relongyin"), true); + }, + silent: true, + forceDie: true, + charlotte: true, + content: () => { + game.removeGlobalSkill("relongyin_order"); + }, + }, + }, + }, + jiezhong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + limited: true, + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { + return player.countCards("h") < player.maxHp; + }, + content: function () { + player.awakenSkill("jiezhong"); + player.draw(Math.min(5, player.maxHp - player.countCards("h"))); + }, + }, + //新郭淮 + decadejingce: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + return player.getHistory("useCard").length >= player.hp; + }, + content: function () { + "step 0"; + var list = [], + history = player.getHistory("useCard"); + for (var i of history) { + list.add(get.suit(i.card)); + if (list.length >= player.hp) break; + } + if (list.length >= player.hp) event.goon = true; + else player.chooseControl("摸牌阶段", "出牌阶段").set("prompt", "精策:选择要执行的额外阶段"); + "step 1"; + if (event.goon || result.index == 0) { + var next = player.phaseDraw(); + event.next.remove(next); + trigger.getParent().next.push(next); + } + if (event.goon || result.index == 1) { + var next = player.phaseUse(); + event.next.remove(next); + trigger.getParent().next.push(next); + } + }, + }, + //新于禁 + decadezhenjun: { + audio: 2, + trigger: { + player: ["phaseZhunbeiBegin", "phaseJieshuBegin"], + }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("he") > 0; + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("decadezhenjun"), function (card, player, target) { + return target.countCards("he") > 0; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) * (target.countCards("e") + 1); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var num = Math.max(target.countCards("h") - target.hp, 1); + player.logSkill("decadezhenjun", target); + player.discardPlayerCard(num, target, true); + } + "step 2"; + if (result.cards && result.cards.length) { + for (var i = 0; i < result.cards.length; i++) { + if (get.type(result.cards[i]) == "equip") { + event.finish(); + return; + } + } + event.num = result.cards.length; + if (event.num > 0) { + var prompt = "弃置一张牌,或令" + get.translation(event.target) + "摸" + get.cnNumber(event.num) + "张牌"; + player.chooseToDiscard(prompt, "he").ai = function (card) { + return 7 - get.value(card); + }; + } else event.finish(); + } else event.finish(); + "step 3"; + if (!result.bool) { + event.target.draw(event.num); + } + }, + }, + //界姜维 + oltiaoxin: { + audio: "tiaoxin", + audioname: ["sp_jiangwei", "xiahouba", "re_jiangwei", "gz_jiangwei", "ol_jiangwei"], + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + if (player.getStat("skill").oltiaoxin) return !player.hasSkill("oltiaoxin2"); + return true; + }, + filterTarget: function (card, player, target) { + return target != player && target.inRange(player) && target.countCards("he") > 0; + }, + content: function () { + "step 0"; + 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); + "step 1"; + if ( + result.bool && + player.getHistory("damage", function (evt) { + return evt.getParent().type == "card" && evt.getParent(4) == event; + }).length > 0 + ) + player.addTempSkill("oltiaoxin2", "phaseUseEnd"); + else if (target.countDiscardableCards(player, "he") > 0) player.discardPlayerCard(target, "he", true).boolline = true; + }, + ai: { + order: 4, + expose: 0.2, + result: { + target: -1, + player: function (player, target) { + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; + return -0.5; + }, + }, + threaten: 1.1, + }, + }, + oltiaoxin2: {}, + olzhiji: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + unique: true, + juexingji: true, + //priority:-10, + derivation: "reguanxing", + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + filter: function (event, player) { + if (player.storage.zhiji) return false; + return player.countCards("h") == 0; + }, + content: function () { + "step 0"; + player.awakenSkill("olzhiji"); + player.chooseDrawRecover(2, true); + "step 1"; + player.loseMaxHp(); + player.addSkills("reguanxing"); + }, + }, + //界郭图张嶷 + rejigong: { + audio: 2, + direct: true, + trigger: { player: "phaseUseBegin" }, + content: function () { + "step 0"; + player + .chooseControl("一张", "两张", "三张", "cancel2") + .set("prompt", get.prompt2("rejigong")) + .set("ai", () => "三张"); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("rejigong"); + player.addTempSkill("rejigong2"); + player.draw(1 + result.index); + } + }, + }, + rejigong2: { + audio: "rejigong", + mod: { + maxHandcardBase: function (player) { + if (game.online) return player.getStat("damage") || 0; + var num = 0; + player.getHistory("sourceDamage", function (evt) { + num += evt.num; + }); + return num; + }, + }, + trigger: { player: "phaseDiscardBegin" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if (player.isHealthy()) return false; + var num = 0; + player.getHistory("sourceDamage", function (evt) { + num += evt.num; + }); + if (!num) return false; + var num2 = 0; + player.getHistory("gain", function (evt) { + var evtx = evt.getParent(2); + if (evtx.name == "rejigong" && evtx.player == player) num2 += evt.cards.length; + }); + return num >= num2; + }, + content: function () { + player.recover(); + }, + }, + reshizhi: { + mod: { + cardname: function (card, player) { + if (card.name == "shan" && player.hp == 1) return "sha"; + }, + }, + trigger: { source: "damageEnd" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && player.hp == 1 && event.cards && event.cards.length == 1 && event.cards[0].name == "shan"; + }, + content: function () { + player.recover(); + }, + ai: { + halfneg: true, + }, + }, + //界陈群 + redingpin: { + audio: 2, + enable: "phaseUse", + onChooseToUse: function (event) { + if (event.type != "phase" || game.online) return; + var list = [], + player = event.player; + player.getHistory("useCard", function (evt) { + list.add(get.type2(evt.card)); + }); + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent(2).redingpin_ignore) return; + for (var i of evt.cards2) { + list.add(get.type2(i, evt.hs.includes(i) ? player : false)); + } + }); + event.set("redingpin_types", list); + }, + filter: function (event, player) { + var list = event.redingpin_types || []; + return ( + player.countCards("he", function (card) { + return !list.includes(get.type2(card)); + }) > 0 + ); + }, + filterCard: function (card) { + var list = _status.event.redingpin_types || []; + return !list.includes(get.type2(card)); + }, + position: "he", + filterTarget: function (card, player, target) { + return !target.hasSkill("redingpin2"); + }, + content: function () { + "step 0"; + target.judge(function (card) { + var evt = _status.event.getParent("redingpin"), + suit = get.suit(card); + switch (suit) { + case "club": + case "spade": + return evt.target.hp; + case "diamond": + return get.sgn(get.attitude(evt.target, evt.player)) * -3; + } + return 0; + }).judge2 = function (result) { + if (result.color == "black") return true; + return false; + }; + "step 1"; + switch (result.suit) { + case "spade": + case "club": + if (target.hp > 0) target.draw(Math.min(3, target.hp)); + target.addTempSkill("redingpin2"); + break; + case "heart": + event.getParent().redingpin_ignore = true; + break; + case "diamond": + player.turnOver(); + break; + } + }, + ai: { + order: 9, + result: { + target: function (player, target) { + if (player.isTurnedOver()) return target.hp; + var card = ui.cardPile.firstChild; + if (!card) return; + if (get.color(card) == "black") return target.hp; + return 0; + }, + }, + }, + }, + redingpin2: { charlotte: true }, + refaen: { + audio: 2, + audioname: ["dc_chenqun"], + trigger: { global: ["turnOverAfter", "linkAfter"] }, + logTarget: "player", + filter: function (event, player) { + if (event.name == "link") return event.player.isLinked(); + return true; + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + content: function () { + trigger.player.draw(); + }, + }, + dcfaen: { + audio: "refaen", + audioname: ["dc_chenqun"], + trigger: { global: ["turnOverAfter", "linkAfter"] }, + logTarget: "player", + filter: function (event, player) { + if (event.name == "link") return event.player.isLinked(); + return !event.player.isTurnedOver(); + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + content: function () { + trigger.player.draw(); + }, + }, + //界曹彰 + xinjiangchi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + var list = ["摸一张牌", "摸两张牌,本回合内不能使用或打出【杀】"]; + if ( + player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "xinjiangchi") > 0; + }) > 0 + ) + list.push("弃置一张牌,本回合可以多使用一张【杀】且无距离限制"); + player + .chooseControl("cancel2") + .set("prompt", get.prompt("xinjiangchi")) + .set("choiceList", list) + .set("ai", function () { + var player = _status.event.player; + if ( + !player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card, false); + }) + ) + return 1; + return 0; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("xinjiangchi"); + switch (result.index) { + case 0: { + player.draw(); + break; + } + case 1: { + player.draw(2); + player.addTempSkill("xinjiangchi_less"); + break; + } + case 2: { + player.chooseToDiscard("he", true); + player.addTempSkill("xinjiangchi_more"); + break; + } + } + } + }, + subSkill: { + less: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + cardRespondable: function (card) { + if (card.name == "sha") return false; + }, + }, + charlotte: true, + }, + more: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + targetInRange: function (card) { + if (card.name == "sha") return true; + }, + }, + charlotte: true, + }, + }, + }, + //界周仓和程普 + ollihuo: { + mod: { + aiOrder: function (player, card, num) { + if (card.name == "sha" && !player.getHistory("useCard").length) return num + 7; + }, + }, + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; + return false; + }, + audio: "lihuo", + locked: false, + prompt2: function (event) { + return "将" + get.translation(event.card) + "改为火属性"; + }, + audioname: ["re_chengpu"], + check: function (event, player) { + return ( + (event.baseDamage > 1 || player.getHistory("useCard").indexOf(event) == 0) && + (player.hp > 1 || player.getExpansions("rechunlao").length) && + game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current) && get.attitude(player, current) < 0 && !current.hasShan() && get.effect(current, { name: "sha", nature: "fire" }, player, player) > 0; + }) + ); + }, + content: function () { + game.setNature(trigger.card, "fire"); + trigger.lihuo_changed = true; + }, + group: ["ollihuo2", "ollihuo3", "ollihuo4"], + ai: { + fireAttack: true, + }, + }, + ollihuo2: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("ollihuo"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { + return !_status.event.sourcex.includes(target) && lib.filter.targetInRange(_status.event.card, player, target) && lib.filter.targetEnabled(_status.event.card, player, target); + }) + .set("sourcex", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }); + "step 1"; + if (result.bool) { + if (!event.isMine() && !_status.connectMode) game.delayx(); + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + player.logSkill("ollihuo", event.target); + trigger.targets.push(event.target); + }, + }, + ollihuo3: { + trigger: { player: "useCardEnd" }, + filter: function (event, player) { + return ( + event.lihuo_changed == true && + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length > 0 + ); + }, + forced: true, + audio: "lihuo", + audioname: ["re_chengpu"], + content: function () { + player.loseHp(); + }, + }, + ollihuo4: { + trigger: { player: "useCardAfter" }, + frequent: true, + audio: "lihuo", + audioname: ["re_chengpu"], + filter: function (event, player) { + return event.card.name == "sha" && player.getHistory("useCard").indexOf(event) == 0 && event.cards.filterInD().length > 0; + }, + content: function () { + var cards = trigger.cards.filterInD(); + player.addToExpansion("gain2", cards).gaintag.add("rechunlao"); + }, + }, + rezhongyong: { + trigger: { player: "useCardAfter" }, + audio: 2, + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + event.cards = trigger.cards.filterInD(); + game.countPlayer2(function (current) { + current.getHistory("useCard", function (evt) { + if (evt.card.name == "shan" && evt.getParent(3) == trigger) event.cards.addArray(evt.cards.filterInD("od")); + }); + }); + if (!event.cards.length) event.finish(); + player + .chooseTarget(get.prompt2("rezhongyong"), "令一名其他角色获得" + get.translation(event.cards), function (card, player, target) { + return !_status.event.source.includes(target) && target != player; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("source", trigger.targets); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("rezhongyong", target); + target.gain(cards, "gain2"); + var red = false, + black = false; + for (var i of cards) { + var color = get.color(i, false); + if (color == "red") red = true; + if (color == "black") black = true; + if (red && black) break; + } + if (red) + target + .chooseToUse("是否使用一张杀?", { name: "sha" }) + .set("filterTarget", function (card, player, target) { + return target != _status.event.sourcex && _status.event.sourcex.inRange(target) && lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player) + .set("addCount", false); + if (black) target.draw(); + } + }, + }, + //长标 + changbiao: { + audio: 2, + mod: { + targetInRange: function (card, player, target) { + if (card.changbiao) return true; + }, + }, + enable: "phaseUse", + usable: 1, + viewAs: { + name: "sha", + changbiao: true, + }, + locked: false, + filter: function (event, player) { + return player.countCards("hs") > 0; + }, + filterCard: true, + selectCard: [1, Infinity], + position: "hs", + check: function (card) { + let player = _status.event.player; + if (ui.selected.cards.length) { + let list = game + .filterPlayer(function (current) { + return current !== player && player.canUse("sha", current, false) && get.effect(current, { name: "sha" }, player, player) > 0; + }) + .sort(function (a, b) { + return get.effect(b, { name: "sha" }, player, player) - get.effect(a, { name: "sha" }, player, player); + }); + if (!list.length) return 0; + let target = list[0], + cards = ui.selected.cards.concat([card]), + color = []; + for (let i of cards) { + if (!color.includes(get.color(i, player))) color.add(get.color(i, player)); + } + if (color.length !== 1) color[0] = "none"; + if ( + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: { + name: "sha", + suit: "none", + color: color[0], + cards: cards, + isCard: true, + }, + }, + true + ) + ) + return 6.5 - get.value(card, player); + if ( + Math.random() * target.countCards("hs") < 1 || + player.needsToDiscard(0, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) + return 6 - get.value(card, player); + return 0; + } + return 6.3 - get.value(card); + }, + onuse: function (result, player) { + player.addTempSkill("changbiao_draw"); + }, + subSkill: { + draw: { + trigger: { player: "phaseUseEnd" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + player.getHistory("sourceDamage", function (evxt) { + var evt = evxt.getParent(); + return evt && evt.name == "sha" && evt.skill == "changbiao" && evt.getParent("phaseUse") == event; + }).length > 0 + ); + }, + content: function () { + var num = 0; + player.getHistory("sourceDamage", function (evxt) { + var evt = evxt.getParent(); + if (evt && evt.name == "sha" && evt.skill == "changbiao" && evt.getParent("phaseUse") == trigger) num += evt.cards.length; + }); + player.draw(num); + }, + }, + }, + ai: { + order: function (item, player) { + return ( + get.order({ name: "sha" }, player) + + 0.3 * + (Math.min( + player.getCardUsable("sha"), + player.countCards("hs", "sha") + + player.hasCard(function (card) { + return card.name != "sha" && get.value(card, player) < 6.3; + }, "hs") + ? 1 + : 0 + ) > 1 + ? -1 + : 1) + ); + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") { + let num = 0; + if (arg && (!arg.card || get.name(arg.card) !== "tao")) return false; + player.getHistory("sourceDamage", function (evxt) { + let evt = evxt.getParent(); + if (evt && evt.name == "sha" && evt.skill == "changbiao") num += evt.cards.length; + }); + return player.needsToDiscard(num) > 0; + } + }, + }, + }, + //国钟会 + gzquanji: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + frequent: true, + preHidden: true, + filter: function (event, player, name) { + //if(name=='damageEnd') return true; + //if(!event.card) return false; + if ( + player.hasHistory("useSkill", function (evt) { + return evt.skill == "gzquanji" && evt.event.triggername == name; + }) + ) + return false; + return true; + }, + 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("gzquanji"); + } + }, + 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("gzquanji").length; + }, + }, + }, + gzpaiyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.getExpansions("gzquanji").length > 0; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("排异", player.getExpansions("gzquanji"), "hidden"); + }, + backup: function (links, player) { + return { + audio: "gzpaiyi", + filterTarget: true, + filterCard: function () { + return false; + }, + selectCard: -1, + card: links[0], + delay: false, + content: lib.skill.gzpaiyi.contentx, + ai: { + order: 10, + result: { + target: function (player, target) { + if (target != player) return 0; + if (player.getExpansions("gzquanji").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.gzpaiyi_backup.card; + player.loseToDiscardpile(card); + "step 1"; + var num = player.getExpansions("gzquanji").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("gzquanji").length; + if (num == 1) return 8; + return 1; + }, + result: { + player: 1, + }, + }, + }, + gzquanji2: { charlotte: true }, + xingongji: { + enable: "phaseUse", + usable: 1, + audio: 2, + position: "he", + filterCard: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + check: function (card) { + var base = 0, + player = _status.event.player, + suit = get.suit(card, player), + added = false, + added2 = false, + added3; + if ( + get.type(card) == "equip" && + game.hasPlayer(function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + }) + ) + base += 6; + var hs = player.getCards("h"); + var muniu = player.getEquip("muniu"); + if (muniu && card != muniu && muniu.cards) hs = hs.concat(muniu.cards); + for (var i of hs) { + if (i != card && get.name(i) == "sha") { + if (get.suit(i, player) == suit) { + if (player.hasValueTarget(i, false)) { + added3 = true; + base += 5.5; + } + } else { + if (player.hasValueTarget(i, false)) added2 = true; + if (!added && !player.hasValueTarget(i, null, true) && player.hasValueTarget(i, false, true)) { + base += 4; + added = true; + } + } + } + } + if (added3 && !added2) base -= 4.5; + return base - get.value(card); + }, + content: function () { + "step 0"; + if (!player.storage.xingongji2) player.storage.xingongji2 = []; + player.storage.xingongji2.add(get.suit(cards[0], player)); + player.addTempSkill("xingongji2"); + "step 1"; + if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") { + player + .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) { + return player != target && target.countCards("he") > 0; + }) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + return -att * 0.8; + }); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.line(result.targets, "green"); + player.discardPlayerCard(result.targets[0], "he", true); + } + }, + ai: { + order: 4.5, + result: { + player: 1, + }, + }, + }, + xingongji2: { + charlotte: true, + onremove: true, + mod: { + attackRangeBase: function () { + return Infinity; + }, + cardUsable: function (card, player) { + if (card.name == "sha") { + const suit = get.suit(card); + if (suit === "unsure" || player.storage.xingongji2.includes(suit)) return Infinity; + } + }, + aiOrder: function (player, card, num) { + if (get.name(card) == "sha" && !player.storage.xingongji2.includes(get.suit(card))) return num + 1; + }, + }, + mark: true, + intro: { + content: "使用$花色的杀无次数限制", + }, + }, + xinjiefan: { + skillAnimation: true, + animationColor: "wood", + audio: 2, + unique: true, + limited: true, + enable: "phaseUse", + filterTarget: true, + content: function () { + "step 0"; + player.awakenSkill("xinjiefan"); + event.players = game.filterPlayer(function (current) { + return current != target && current.inRange(target); + }); + event.players.sortBySeat(); + "step 1"; + if (event.players.length) { + event.current = event.players.shift(); + event.current.addTempClass("target"); + player.line(event.current, "green"); + if (event.current.countCards("he") && target.isIn()) { + event.current + .chooseToDiscard({ subtype: "equip1" }, "he", "弃置一张武器牌或让" + get.translation(target) + "摸一张牌") + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.target) < 0) return 7 - get.value(card); + return -1; + }) + .set("target", target); + event.tempbool = false; + } else { + event.tempbool = true; + } + } else { + if (game.roundNumber <= 1) player.addTempSkill("xinjiefan2"); + event.finish(); + } + "step 2"; + if (event.tempbool || result.bool == false) { + target.draw(); + } + event.goto(1); + }, + ai: { + order: 5, + result: { + target: function (player, target) { + if (player.hp > 2 && game.roundNumber > 1) { + if (game.phaseNumber < game.players.length * 2) return 0; + } + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != target && players[i].inRange(target)) { + num++; + } + } + return num; + }, + }, + }, + }, + xinjiefan2: { + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + content: function () { + player.restoreSkill("xinjiefan"); + }, + }, + residi: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + if (_status.connectMode) return true; + return get.type(card) != "basic"; + }) > 0 + ); + }, + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt("residi"), "将一张非基本牌置于武将牌上作为“司”", function (card, player) { + return get.type(card) != "basic"; + }) + .set("ai", function (card) { + if (get.position(card) == "e") return 5 + player.hp - get.value(card); + return 7 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("residi"); + player.addToExpansion(result.cards, "give", player).gaintag.add("residi"); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "residi_push", + ai: { notemp: true }, + }, + residi_push: { + trigger: { global: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return event.player != player && player.getExpansions("residi").length > 0; + }, + content: function () { + "step 0"; + player.chooseButton([get.prompt("residi", trigger.player), player.getExpansions("residi")]).set("ai", function (button) { + var player = _status.event.player; + var target = _status.event.getTrigger().player; + if (get.attitude(player, target) > -1) return 0; + var card = button.link; + var color = get.color(button.link, false); + var eff = target.countCards("h", function (card) { + return get.color(card, target) == color && target.hasValueTarget(card); + }); + if ( + !target.countCards("h", function (card) { + return get.color(card, target) == color && get.name(card, target) == "sha" && target.hasValueTarget(card); + }) + ) + eff += 1.5; + if ( + !target.countCards("h", function (card) { + return get.color(card, target) == color && get.type2(card, target) == "trick" && target.hasValueTarget(card); + }) + ) + eff += 1.5; + return eff - 1; + }); + "step 1"; + if (result.bool) { + if (!trigger.residi) trigger.residi = []; + trigger.residi.push(player); + var card = result.links[0]; + var target = trigger.player; + player.logSkill("residi", target); + player.loseToDiscardpile(card); + var color = get.color(card, false); + if (!target.storage.residi2) target.storage.residi2 = []; + target.storage.residi2.add(color); + target.addTempSkill("residi2", "phaseUseAfter"); + target.markSkill("residi2"); + player.addTempSkill("residi3", "phaseUseAfter"); + } + }, + }, + residi2: { + onremove: true, + mod: { + cardEnabled: function (card, player) { + if (player.getStorage("residi2").includes(get.color(card, player))) return false; + }, + cardRespondable: function (card, player) { + if (player.getStorage("residi2").includes(get.color(card, player))) return false; + }, + cardSavable: function (card, player) { + if (player.getStorage("residi2").includes(get.color(card, player))) return false; + }, + }, + intro: { + content: "不能使用或打出$牌", + }, + marktext: "敌", + }, + residi3: { + audio: "residi", + trigger: { global: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + if (!event.residi || !event.residi.includes(player)) return false; + var sha = player.canUse("sha", event.player, false), + trick = true; + event.player.getHistory("useCard", function (evt) { + if (evt.getParent("phaseUse") != event) return false; + if (sha && evt.card.name == "sha") sha = false; + if (trick && get.type2(evt.card, false) == "trick") trick = false; + }); + return sha || trick; + }, + content: function () { + var sha = player.canUse("sha", trigger.player, false), + trick = true; + trigger.player.getHistory("useCard", function (evt) { + if (evt.getParent("phaseUse") != trigger) return false; + if (sha && evt.card.name == "sha") sha = false; + if (trick && get.type2(evt.card, false) == "trick") trick = false; + }); + if (sha) player.useCard({ name: "sha", isCard: true }, trigger.player); + if (trick) player.draw(2); + }, + }, + rehuaiyi: { + audio: 2, + enable: "phaseUse", + usable: 2, + delay: false, + filter: function (event, player) { + return player.countCards("h") > 0 && (!player.getStat("skill").rehuaiyi || player.hasSkill("rehuaiyi2")); + }, + content: function () { + "step 0"; + player.showHandcards(); + if (get.color(player.getCards("h")) != "none") { + player.draw(); + player.addTempSkill("rehuaiyi2", "phaseUseEnd"); + event.finish(); + } + "step 1"; + player.chooseControl("红色", "黑色").set("ai", function () { + var player = _status.event.player; + if (player.countCards("h", { color: "red" }) == 1 && player.countCards("h", { color: "black" }) > 1) return "红色"; + return "黑色"; + }); + "step 2"; + event.control = result.control; + var cards; + if (event.control == "红色") { + cards = player.getCards("h", { color: "red" }); + } else { + cards = player.getCards("h", { color: "black" }); + } + player.discard(cards); + event.num = cards.length; + "step 3"; + player + .chooseTarget("请选择至多" + get.cnNumber(event.num) + "名有牌的其他角色,获得这些角色的各一张牌。", [1, event.num], function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) + 0.5; + }); + "step 4"; + if (result.bool && result.targets) { + player.line(result.targets, "green"); + event.targets = result.targets; + event.targets.sort(lib.sort.seat); + event.gained = 0; + } else { + event.finish(); + } + "step 5"; + if (player.isIn() && event.targets.length) { + player.gainPlayerCard(event.targets.shift(), "he", true); + } else event.finish(); + "step 6"; + if (result.bool) { + event.gained += result.cards.length; + } + if (event.targets.length) event.goto(5); + "step 7"; + if (event.gained > 1) player.loseHp(); + }, + ai: { + order: function (item, player) { + if (player.countCards("h", { color: "red" }) == 0) return 10; + if (player.countCards("h", { color: "black" }) == 0) return 10; + return 1; + }, + result: { + player: 1, + }, + }, + }, + rehuaiyi2: {}, + rezhuikong: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + check: function (event, player) { + if (get.attitude(player, event.player) < -2) { + var cards = player.getCards("h"); + if (cards.length > player.hp) return true; + for (var i = 0; i < cards.length; i++) { + var useful = get.useful(cards[i]); + if (useful < 5) return true; + if (get.number(cards[i]) > 7 && useful < 7) return true; + } + } + return false; + }, + logTarget: "player", + filter: function (event, player) { + return player.hp < player.maxHp && player.canCompare(event.player); + }, + content: function () { + "step 0"; + player.chooseToCompare(trigger.player).set("small", player.hp > 1 && get.effect(player, { name: "sha" }, trigger.player, player) > 0 && Math.random() < 0.9); + "step 1"; + if (result.bool) { + trigger.player.addTempSkill("zishou2"); + event.finish(); + } else if (result.target && get.position(result.target) == "d") player.gain(result.target, "gain2", "log"); + "step 2"; + var card = { name: "sha", isCard: true }; + if (trigger.player.canUse(card, player, false)) trigger.player.useCard(card, player, false); + }, + }, + reqiuyuan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasPlayer(function (current) { + return current != player && !event.targets.includes(current) && lib.filter.targetEnabled(event.card, event.player, current); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("reqiuyuan"), function (card, player, target) { + var evt = _status.event.getTrigger(); + return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled(evt.card, evt.player, target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, trigger.player, player) + 0.1; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("reqiuyuan", target); + event.target = target; + target + .chooseCard( + function (card, player) { + var name = get.name(card, player); + return name != "sha" && get.type(name) == "basic"; + }, + "h", + "交给" + get.translation(player) + "一张不为【杀】的基本牌,或成为此杀的额外目标且不可响应此【杀】" + ) + .set("ai", function (card) { + return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1; + }) + .set("sourcex", player); + game.delay(); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + target.give(result.cards, player); + game.delay(); + } else { + trigger.getParent().targets.push(event.target); + trigger.getParent().triggeredTargets2.push(event.target); + trigger.directHit.push(event.target); + game.log(event.target, "成为了", trigger.card, "的额外目标"); + } + }, + ai: { + expose: 0.2, + effect: { + target: function (card, player, target) { + if (card.name != "sha") return; + var players = game.filterPlayer(); + if (get.attitude(player, target) <= 0) { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, target) > 0 && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) < 0) { + if (target.hp == target.maxHp) return 0.3; + return 0.6; + } + } + } else { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) > 0) { + if (player.canUse(card, target2)) return; + if (target.hp == target.maxHp) return [0, 1]; + return [0, 0]; + } + } + } + }, + }, + }, + }, + reenyuan: { + audio: 2, + group: ["reenyuan1", "reenyuan2"], + }, + reenyuan1: { + audio: "reenyuan", + trigger: { player: "gainEnd" }, + filter: function (event, player) { + if (!event.source || event.source == player || !event.source.isIn() || event.cards.length < 2) return false; + var evt = event.getl(event.source); + return evt && evt.cards2 && evt.cards2.length > 1; + }, + check: function (event, player) { + return get.attitude(player, event.source) > 0; + }, + logTarget: "source", + prompt2: "令该角色摸一张牌", + content: function () { + trigger.source.draw(); + }, + }, + reenyuan2: { + audio: "reenyuan", + trigger: { player: "damageEnd" }, + logTarget: "source", + filter: function (event, player) { + return event.source && event.source != player && event.source.isIn(); + }, + check: function (event, player) { + var att = get.attitude(player, event.source); + var num = event.source.countCards("h"); + if (att <= 0) return true; + if (num > 2) return true; + if (num) return att < 4; + return false; + }, + prompt2: "令该角色选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。", + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + var target = trigger.source; + event.count--; + if (!target.countCards("h")) event._result = { bool: false }; + else + target.chooseCard("h", "恩怨:将一张手牌交给" + get.translation(player) + ",或失去1点体力").set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { + if (get.suit(card) != "heart") return 15 - get.value(card); + return 11 - get.value(card); + } else { + var num = 12 - _status.event.player.hp * 2; + if (get.suit(card) != "heart") num -= 2; + return num - get.value(card); + } + }); + "step 2"; + var target = trigger.source; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + target.give(card, player); + } else { + target.loseHp(); + event.goto(4); + } + "step 3"; + if (get.suit(card) != "heart") player.draw(); + "step 4"; + var target = trigger.source; + if (target.isIn() && event.count > 0 && player.hasSkill("reenyuan")) + player.chooseBool(get.prompt("reenyuan", target), "令该角色选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。").set("ai", function () { + var evt = _status.event.getTrigger(); + return lib.skill.reenyuan2.check(evt, evt.player); + }); + else event.finish(); + "step 5"; + if (result.bool) { + player.logSkill("reenyuan2", trigger.source); + event.goto(1); + } + }, + }, + rexuanhuo: { + audio: 2, + trigger: { player: "phaseDrawEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 1 && game.countPlayer() > 2; + }, + content: function () { + "step 0"; + var ai2 = function (target) { + var player = _status.event.player; + if (get.attitude(player, target) <= 0) return 0; + var list = [null, "juedou"].concat(lib.inpile_nature); + if (target.hasSkill("ayato_zenshen")) list.push("kami"); + var num = Math.max.apply( + Math, + list.map(function (i) { + if (i == "juedou") return target.getUseValue({ name: "juedou", isCard: true }, false); + var card = { name: "sha", nature: i, isCard: true }; + return target.getUseValue(card, false); + }) + ); + if (target.hasSkillTag("nogain")) num /= 4; + return num; + }; + player.chooseCardTarget({ + prompt: get.prompt2("rexuanhuo"), + filterCard: true, + selectCard: 2, + position: "h", + filterTarget: lib.filter.notMe, + goon: game.hasPlayer(function (current) { + return current != player && ai2(player, current) > 0; + }), + ai1: function (card) { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }, + ai2: ai2, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("rexuanhuo", target); + player.give(result.cards, target); + } else event.finish(); + "step 2"; + if ( + game.hasPlayer(function (current) { + return current != player && current != target; + }) + ) + player + .chooseTarget( + function (card, player, target) { + return target != player && target != _status.event.target; + }, + "选择" + get.translation(target) + "使用【杀】或【决斗】的目标", + true + ) + .set("target", target) + .set("ai", function (target) { + var evt = _status.event; + var list = [null, "juedou"].concat(lib.inpile_nature); + if (evt.target.hasSkill("ayato_zenshen")) list.push("kami"); + return Math.max.apply( + Math, + list.map(function (i) { + var card = { name: "sha", isCard: true }; + if (i == "juedou") card.name = "juedou"; + else if (i) card.nature = i; + if (!evt.target.canUse(card, target, false)) return 0; + return get.effect(target, card, evt.target, evt.player); + }) + ); + }); + else event.finish(); + "step 3"; + var target2 = result.targets[0]; + event.target2 = target2; + player.line(target2); + game.log(player, "选择了", target2); + var list = lib.inpile_nature.slice(0); + list.unshift(null); + var vcards = []; + if (target.hasSkill("ayato_zenshen")) list.add("kami"); + for (var i of list) { + if (target.canUse({ name: "sha", isCard: true, nature: i }, target2, false)) vcards.push(["基本", "", "sha", i]); + } + if (target.canUse({ name: "juedou", isCard: true }, target2, false)) vcards.push(["基本", "", "juedou"]); + if (!vcards.length) { + if (!target.countCards("h")) event.finish(); + else event._result = { index: 1 }; + } else if (!target.countCards("h")) { + event.vcards = vcards; + event._result = { index: 0 }; + } else { + event.vcards = vcards; + target.chooseControl().set("choiceList", ["视为对" + get.translation(target2) + "使用任意一种【杀】或【决斗】", "将所有手牌交给" + get.translation(player)]); + } + "step 4"; + if (result.index == 0) { + if (event.vcards.length == 1) event._result = { links: event.vcards, bool: true }; + else + target.chooseButton(["请选择要对" + get.translation(event.target2) + "使用的牌", [event.vcards, "vcard"]], true).set("ai", function (button) { + var player = _status.event.player; + return get.effect(_status.event.getParent().target2, { name: button.link[2], isCard: true, nature: button.link[3] }, player, player); + }); + } else { + target.give(target.getCards("h"), player, "giveAuto"); + event.finish(); + } + "step 5"; + if (result.bool) target.useCard({ name: result.links[0][2], isCard: true, nature: result.links[0][3] }, false, event.target2); + }, + ai: { + expose: 0.17, + fireAttack: true, + skillTagFilter: function (player) { + return player.hasFriend(); + }, + }, + }, + decadezongshi: { + audio: 2, + mod: { + maxHandcard: function (player, num) { + return num + game.countGroup(); + }, + }, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + return player != _status.currentPhase && player.countCards("h") >= player.getHandcardLimit() && (get.type(event.card) == "delay" || get.color(event.card) == "none"); + }, + content: function () { + trigger.excluded.add(player); + }, + ai: { + effect: { + target: function (card, player, target) { + if (target != _status.currentPhase && target.countCards("h") >= target.getHandcardLimit() && (get.type(card) == "delay" || get.color(card) == "none")) return "zerotarget"; + }, + }, + }, + }, + decadezishou: { + audio: 2, + inherit: "rezishou", + group: "decadezishou_zhiheng", + ai: { + threaten: 1.8, + }, + }, + decadezishou_zhiheng: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + !player.getHistory("useCard", function (evt) { + return ( + evt.targets.filter(function (target) { + return target != player; + }).length > 0 + ); + }).length + ); + }, + content: function () { + "step 0"; + var list = []; + var hs = player.getCards("h"); + for (var i of hs) { + list.add(get.suit(i, player)); + } + player + .chooseToDiscard("h", get.prompt("decadezishou"), "弃置任意张花色不同的手牌并摸等量的牌", [1, list.length], function (card, player) { + if (ui.selected.cards.length) { + var suit = get.suit(card, player); + for (var i of ui.selected.cards) { + if (get.suit(i, player) == suit) return false; + } + } + return true; + }) + .set("ai", lib.skill.zhiheng.check) + .set("complexCard", true).logSkill = "decadezishou"; + "step 1"; + if (result.bool) { + player.draw(result.cards.length); + } + }, + }, + yongjin: { + audio: 2, + audioname: ["xin_lingtong"], + unique: true, + limited: true, + skillAnimation: true, + animationColor: "wood", + enable: "phaseUse", + filter: function (event, player, cards) { + return game.hasPlayer(function (current) { + var es = current.getCards("e", function (card) { + return !cards || !cards.includes(card); + }); + for (var i = 0; i < es.length; i++) { + if ( + game.hasPlayer(function (current2) { + return current != current2 && !current2.isMin() && current2.canEquip(es[i]); + }) + ) { + return true; + } + } + }); + }, + content: function () { + "step 0"; + player.awakenSkill("yongjin"); + event.count = 3; + event.cards = []; + "step 1"; + event.count--; + if (!lib.skill.yongjin.filter(null, player, cards)) { + event.finish(); + return; + } + var next = player.chooseTarget(2, function (card, player, target) { + if (ui.selected.targets.length) { + var from = ui.selected.targets[0]; + if (target.isMin()) return false; + var es = from.getCards("e", function (card) { + return !_status.event.cards.includes(card); + }); + for (var i = 0; i < es.length; i++) { + if (target.canEquip(es[i])) return true; + } + return false; + } else { + return ( + target.countCards("e", function (card) { + return !_status.event.cards.includes(card); + }) > 0 + ); + } + }); + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var sgnatt = get.sgn(att); + if (ui.selected.targets.length == 0) { + if (target == player && player.hasSkill("decadexuanfeng")) { + if ( + player.countCards("e", function (card) { + return ( + !_status.event.cards.includes(card) && + game.hasPlayer(function (current) { + return current != target && current.canEquip(card) && get.effect(current, card, player, player) < 0; + }) + ); + }) > 0 + ) + return 18; + return 7; + } else if (att > 0) { + if ( + target.countCards("e", function (card) { + return ( + get.value(card, target) < 0 && + !_status.event.cards.includes(card) && + game.hasPlayer(function (current) { + return current != target && current.canEquip(card) && get.effect(current, card, player, player) < 0; + }) + ); + }) > 0 + ) + return 9; + } else if (att < 0) { + if ( + game.hasPlayer(function (current) { + if (current != target && get.attitude(player, current) > 0) { + var es = target.getCards("e", function (card) { + return !_status.event.cards.includes(card); + }); + for (var i = 0; i < es.length; i++) { + if (get.value(es[i], target) > 0 && current.canEquip(card) && get.effect(current, es[i], player, current) > 0) return true; + } + } + }) + ) { + return -att; + } + } + return 0; + } + var es = ui.selected.targets[0].getCards("e", function (card) { + return !_status.event.cards.includes(card); + }); + var i; + var att2 = get.sgn(get.attitude(player, ui.selected.targets[0])); + for (i = 0; i < es.length; i++) { + if (ui.selected.targets[0] == player && player.hasSkill("decadexuanfeng")) { + var bool = game.hasPlayer(function (current) { + return get.attitude(player, current) < 0 && current.countDiscardableCards(player, "he") > 0 && get.damageEffect(current, player, player) > 0; + }); + if ( + bool && + player.countCards("e", function (card) { + return !_status.event.cards.includes(card) && target.canEquip(card) && get.effect(target, card, player, player) > 0; + }) + ) + return 2.5 * Math.abs(att); + else if (bool) return 1 / Math.max(1, Math.abs(att)); + else return get.damageEffect(target, player, player); + } + if (sgnatt != 0 && att2 != 0 && sgnatt != att2 && get.sgn(get.value(es[i], ui.selected.targets[0])) == -att2 && get.sgn(get.effect(target, es[i], player, target)) == sgnatt && target.canEquip(es[i])) { + return Math.abs(att); + } + } + if (i == es.length) { + return 0; + } + return -att * get.attitude(player, ui.selected.targets[0]); + }); + next.set("multitarget", true); + next.set("cards", cards); + next.set("targetprompt", ["被移走", "移动目标"]); + next.set("prompt", "移动场上的一张装备牌"); + "step 2"; + if (result.bool) { + player.line2(result.targets, "green"); + event.targets = result.targets; + } else { + event.finish(); + } + "step 3"; + game.delay(); + "step 4"; + if (targets.length == 2) { + player + .choosePlayerCard( + "e", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if (get.attitude(player, targets0) > 0 && get.attitude(player, targets1) < 0) { + if (get.value(button.link, targets0) < 0 && get.effect(targets1, button.link, player, targets1) > 0) return 10; + return 0; + } else { + return get.value(button.link) * get.effect(targets1, button.link, player, player); + } + }, + targets[0] + ) + .set("nojudge", event.nojudge || false) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + if (_status.event.cards.includes(button.link)) return false; + var targets1 = _status.event.targets1; + return targets1.canEquip(button.link); + }) + .set("cards", cards); + } else { + event.finish(); + } + "step 5"; + if (result.bool && result.links.length) { + var link = result.links[0]; + cards.add(link); + event.targets[1].equip(link); + event.targets[0].$give(link, event.targets[1]); + game.delay(); + } else event.finish(); + "step 6"; + if (event.count > 0) event.goto(1); + }, + ai: { + order: 7, + result: { + player: function (player) { + var num = 0; + var friends = game.filterPlayer(function (current) { + return get.attitude(player, current) >= 4; + }); + var vacancies = { + equip1: 0, + equip2: 0, + equip3: 0, + equip4: 0, + equip5: 0, + }; + for (var i = 0; i < friends.length; i++) { + for (var j = 1; j <= 5; j++) { + if (friends[i].hasEmptySlot(j)) { + vacancies["equip" + j]++; + } + } + } + var sources = game.filterPlayer(function (current) { + return ((current == player && current.hasSkill("decadexuanfeng")) || get.attitude(player, current) < 0) && current.countCards("e"); + }); + for (var i = 0; i < sources.length; i++) { + var es = sources[i].getCards("e"); + for (var j = 0; j < es.length; j++) { + var type = get.subtype(es[j]); + if (sources[i] == player || (vacancies[type] > 0 && get.value(es[j]) > 0)) { + num++; + if ( + sources[i] == player && + vacancies[type] && + game.hasPlayer(function (current) { + return get.attitude(player, current) < 0 && current.countDiscardableCards(player, "he") > 0 && get.damageEffect(current, player, player) > 0; + }) + ) + num += 0.5; + if (num >= 3) { + return 1; + } + vacancies[type]--; + } + } + } + if (num && player.hp == 1) { + return 0.5; + } + return 0; + }, + }, + }, + }, + decadexuanfeng: { + audio: "xuanfeng", + audioname: ["boss_lvbu3", "re_heqi", "xin_lingtong"], + trigger: { + player: ["loseAfter", "phaseDiscardEnd"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + if (_status.dying.length) return false; + if (event.name == "phaseDiscard") { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt && evt.type == "discard" && evt.getParent("phaseDiscard") == event && evt.hs) cards.addArray(evt.hs); + }); + return cards.length > 1; + } else { + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; + } + }, + content: function () { + "step 0"; + event.count = 2; + event.targets = []; + event.logged = false; + "step 1"; + event.count--; + player + .chooseTarget(get.prompt("decadexuanfeng"), "弃置一名其他角色的一张牌", function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he"); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 2"; + if (result.bool) { + if (!event.logged) { + player.logSkill("decadexuanfeng", result.targets); + event.logged = true; + } else player.line(result.targets[0], "green"); + targets.add(result.targets[0]); + player.discardPlayerCard(result.targets[0], "he", true); + } else if (!targets.length) event.finish(); + "step 3"; + if (event.count) event.goto(1); + else if (player == _status.currentPhase) { + player + .chooseTarget("是否对一名目标角色造成1点伤害", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("targets", targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + } else event.finish(); + "step 4"; + if (result.bool) { + player.line(result.targets[0], "thunder"); + result.targets[0].damage(); + } + }, + ai: { + effect: { + player_use: function (card, player, target) { + if ( + player == target && + get.type(card) == "equip" && + player.countCards("hes", function (cardx) { + return card != cardx && (!card.cards || !card.cards.includes(cardx)) && (player.hasSkill("yongjin") || get.subtype(card) == get.subtype(cardx)) && (get.position(cardx) == "e" || player.canUse(cardx, player)); + }) > 0 + ) + return; + if ( + !game.hasPlayer(function (current) { + return get.attitude(player, current) < 0 && current.countDiscardableCards(player, "he") > 0 && get.damageEffect(current, player, player) > 0; + }) + ) + return; + if ( + typeof card == "object" && + player.isPhaseUsing() && + player.needsToDiscard() == 2 && + card.cards && + card.cards.filter(function (i) { + return get.position(i) == "h"; + }).length > 0 && + !get.tag(card, "draw") && + !get.tag(card, "gain") && + !(get.tag(card, "discard") && target == player && player.countCards("e") > 0) + ) + return "zeroplayertarget"; + }, + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + if (get.tag(card, "damage") && target.hp > 2) { + var num1 = target.countCards("h"), + num2 = target.getHandcardLimit(); + if (num1 > num2) return [1, 1]; + if (num1 == num2) return [1.1, _status.event.player == target ? 3 : 0.5]; + if (num1 == num2 - 1) return [0.1, _status.event.player == target ? 4.5 : 0.1]; + } + if (typeof card == "object" && (card.name == "shunshou" || card.name == "guohe" || card.name == "zhujinqiyuan") && target.countCards("h") > 0 && get.attitude(player, target) < 0) return [1, -1]; + }, + }, + reverseEquip: true, + noe: true, + expose: 0.2, + }, + }, + oltuntian: { + inherit: "tuntian", + filter: function (event, player) { + if (player == _status.currentPhase) { + if (event.type != "discard") return false; + var evt = event.getl(player); + return ( + evt && + evt.cards2 && + evt.cards2.filter(function (i) { + return get.name(i, evt.hs.includes(i) ? player : false) == "sha"; + }).length > 0 + ); + } + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; + }, + }, + olzaoxian: { + inherit: "zaoxian", + content: function () { + player.awakenSkill("olzaoxian"); + player.loseMaxHp(); + player.addSkills("jixi"); + player.insertPhase(); + }, + ai: { + combo: "oltuntian", + }, + }, + rejunxing: { + enable: "phaseUse", + audio: 2, + usable: 1, + filterCard: true, + selectCard: [1, Infinity], + filter: function (event, player) { + return player.countCards("h") > 0; + }, + check: function (card) { + if (ui.selected.cards.length) return -1; + return 6 - get.value(card); + }, + filterTarget: function (card, player, target) { + return player != target; + }, + content: function () { + "step 0"; + target.chooseToDiscard(cards.length, "弃置" + get.cnNumber(cards.length) + "张牌并失去1点体力,或点取消将武将牌翻面并摸" + get.cnNumber(cards.length) + "张牌", "he").set("ai", function (card) { + if (cards.length > 3 || target.hasSkillTag("noturn") || target.isTurnedOver() || ((get.name(card) == "tao" || get.name(card) == "jiu") && lib.filter.cardSavable(card, target, target))) return -1; + if (target.hp <= 1) { + if ( + cards.length < target.getEnemies().length && + target.hasCard(cardx => { + return (get.name(cardx) == "tao" || get.name(cardx) == "jiu") && lib.filter.cardSavable(cardx, target, target); + }, "hs") + ) + return 7 - get.value(card); + return -1; + } + return 24 - 5 * cards.length - 2 * Math.min(4, target.hp) - get.value(card); + }); + "step 1"; + if (!result.bool) { + target.turnOver(); + target.draw(cards.length); + } else target.loseHp(); + }, + ai: { + order: 2, + threaten: 1.8, + result: { + target: function (player, target) { + if (target.hasSkillTag("noturn")) return 0; + if (target.isTurnedOver()) return 2; + return -1 / (target.countCards("h") + 1); + }, + }, + }, + }, + rejuece: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current != player && + current.getHistory("lose", function (evt) { + return evt.cards2 && evt.cards2.length > 0; + }).length > 0 + ); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("rejuece"), "对一名本回合失去过牌的其他角色造成1点伤害", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set( + "targets", + game.filterPlayer(function (current) { + return ( + current != player && + current.getHistory("lose", function (evt) { + return evt.cards2 && evt.cards2.length > 0; + }).length > 0 + ); + }) + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("rejuece", target); + target.damage(); + } + }, + }, + remieji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", { type: ["trick", "delay"], color: "black" }); + }, + filterCard: function (card) { + return get.color(card) == "black" && get.type(card, "trick") == "trick"; + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; + }, + discard: false, + delay: false, + loseTo: "cardPile", + insert: true, + visible: true, + check: function (card) { + return 8 - get.value(card); + }, + content: function () { + "step 0"; + player.showCards(cards); + "step 1"; + if ( + !target.countCards("he", function (card) { + if (get.type2(card) == "trick") return true; + return lib.filter.cardDiscardable(card, target, "remieji"); + }) + ) + event.finish(); + else + target + .chooseCard("he", true, function (card, player) { + if (get.type2(card) == "trick") return true; + return lib.filter.cardDiscardable(card, player, "remieji"); + }) + .set("prompt", "选择交给" + get.translation(player) + "一张锦囊牌,或依次弃置两张非锦囊牌。"); + "step 2"; + if (result.cards && result.cards.length) { + if (get.type2(result.cards[0]) == "trick") { + target.give(result.cards, player); + event.finish(); + } else target.discard(result.cards); + } else event.finish(); + "step 3"; + if ( + target.countCards("he", function (card) { + return get.type2(card) != "trick"; + }) + ) + target.chooseToDiscard("he", true, function (card) { + return get.type2(card) != "trick"; + }); + }, + ai: { + order: 9, + result: { + target: -1, + }, + }, + }, + decadelihuo: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; + return false; + }, + audio: "lihuo", + prompt2: function (event) { + return "将" + get.translation(event.card) + "改为火属性"; + }, + audioname: ["re_chengpu"], + check: function (event, player) { + return ( + event.baseDamage > 1 && + game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current) && get.attitude(player, current) < 0 && !current.hasShan() && get.effect(current, { name: "sha", nature: "fire" }, player, player) > 0; + }) + ); + }, + content: function () { + game.setNature(trigger.card, "fire"); + }, + group: ["decadelihuo2", "decadelihuo3"], + ai: { + fireAttack: true, + }, + }, + decadelihuo2: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("decadelihuo"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { + return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); + }) + .set("sourcex", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }); + "step 1"; + if (result.bool) { + if (!event.isMine() && !_status.connectMode) game.delayx(); + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + player.logSkill("decadelihuo", event.target); + trigger.targets.push(event.target); + }, + }, + decadelihuo3: { + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasNature(event.card, "fire") && + event.targets.length > 1 && + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length > 0 + ); + }, + forced: true, + audio: "lihuo", + audioname: ["re_chengpu"], + content: function () { + player.loseHp(); + }, + }, + decadechunlao: { + audio: "chunlao", + audioname: ["re_chengpu"], + enable: "chooseToUse", + viewAs: { name: "jiu", isCard: true }, + viewAsFilter: function (player) { + return !player.isLinked(); + }, + filter: function (event, player) { + return !player.isLinked(); + }, + filterCard: function () { + return false; + }, + selectCard: -1, + precontent: function () { + player.logSkill("decadechunlao"); + player.link(); + delete event.result.skill; + }, + group: ["decadechunlao2", "decadechunlaox"], + ai: { + jiuOther: true, + }, + }, + decadechunlaox: { + trigger: { player: "damageBegin2" }, + silent: true, + lastDo: true, + filter: function (event, player) { + return !player.isLinked(); + }, + content: function () { + trigger.decadechunlaox = true; + }, + }, + decadechunlao2: { + trigger: { + source: "damageSource", + player: "damageEnd", + }, + prompt: "是否发动【醇醪】将武将牌重置?", + filter: function (event, player) { + return player.isLinked() && event.num > 1 && !event.decadechunlaox; + }, + content: function () { + player.link(); + }, + }, + oltianxiang: { + audio: "tianxiang", + audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"], + trigger: { player: "damageBegin4" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.suit(card, player) == "heart"; + }) > 0 && event.num > 0 + ); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: function (card, player) { + return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); + }, + filterTarget: function (card, player, target) { + return player != target; + }, + position: "he", + ai1: function (card) { + return 10 - get.value(card); + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + var trigger = _status.event.getTrigger(); + var da = 0; + if (_status.event.player.hp == 1) { + da = 10; + } + var eff = get.damageEffect(target, trigger.source, target); + if (att == 0) return 0.1 + da; + if (eff >= 0 && att > 0) { + return att + da; + } + if (att > 0 && target.hp > 1) { + if (target.maxHp - target.hp >= 3) return att * 1.1 + da; + if (target.maxHp - target.hp >= 2) return att * 0.9 + da; + } + return -att + da; + }, + prompt: get.prompt("oltianxiang"), + prompt2: lib.translate.oltianxiang_info, + }); + "step 1"; + if (result.bool) { + player.discard(result.cards); + var target = result.targets[0]; + player + .chooseControlList( + true, + function (event, player) { + var target = _status.event.target; + var att = get.attitude(player, target); + if (target.hasSkillTag("maihp")) att = -att; + if (att > 0) { + return 0; + } else { + return 1; + } + }, + ["令" + get.translation(target) + "受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)", "令" + get.translation(target) + "失去1点体力,然后获得" + get.translation(result.cards)] + ) + .set("target", target); + player.logSkill(event.name, target); + trigger.cancel(); + event.target = target; + event.card = result.cards[0]; + } else { + event.finish(); + } + "step 2"; + if (typeof result.index == "number") { + event.index = result.index; + if (result.index) { + event.related = event.target.loseHp(); + } else { + event.related = event.target.damage(trigger.source || "nosource", "nocard"); + } + } else event.finish(); + "step 3"; + if (event.related.cancelled || target.isDead()) return; + if (event.index && card.isInPile()) target.gain(card, "gain2"); + else if (target.getDamagedHp()) target.draw(Math.min(5, target.getDamagedHp())); + }, + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; + }, + }, + }, + }, + olhongyan: { + audio: "rehongyan", + mod: { + suit: function (card, suit) { + if (suit == "spade") return "heart"; + }, + maxHandcardBase: function (player, num) { + if ( + player.countCards("e", function (card) { + return get.suit(card, player) == "heart"; + }) + ) + return player.maxHp; + }, + }, + }, + piaoling: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + "step 0"; + player.judge(function (card) { + return get.suit(card) == "heart" ? 2 : 0; + }).judge2 = function (result) { + return result.bool ? true : false; + }; + "step 1"; + event.card = result.card; + if (result.bool && get.position(event.card, true) == "d") { + player.chooseTarget("令一名角色获得" + get.translation(event.card) + ",或点【取消】将其置于牌堆顶").set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (player == target) att /= 2; + return att; + }); + } else event.finish(); + "step 2"; + if (result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(card, "gain2", "log"); + if (player == target) player.chooseToDiscard("he", true); + } else { + card.fix(); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + game.updateRoundNumber(); + } + }, + }, + xinyicong: { + mod: { + globalFrom: function (from, to, current) { + return current - Math.max(0, from.hp - 1); + }, + globalTo: function (from, to, current) { + return current + Math.max(0, to.getDamagedHp() - 1); + }, + }, + ai: { + threaten: 0.8, + }, + }, + rezongshi: { + audio: 2, + mod: { + maxHandcard: function (player, num) { + return num + game.countGroup(); + }, + }, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.countCards("h") > player.hp; + }, + content: function () { + player.addTempSkill("rezongshi_paoxiao"); + }, + }, + rezongshi_paoxiao: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return Infinity; + }, + }, + }, + olbaonue: { + audio: 2, + unique: true, + zhuSkill: true, + trigger: { global: "damageSource" }, + filter: function (event, player) { + if (player == event.source || !event.source || event.source.group != "qun") return false; + return player.hasZhuSkill("olbaonue", event.source); + }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + player.chooseBool("是否发动【暴虐】?").set("choice", get.attitude(player, player) > 0); + "step 2"; + if (result.bool) { + player.logSkill("olbaonue", trigger.source); + player + .judge(function (card) { + if (get.suit(card) == "spade") return 4; + return 0; + }) + .set("callback", function () { + if (event.judgeResult.suit == "spade") { + player.recover(); + if (get.position(event.judgeResult.card, true) == "o") player.gain(event.judgeResult.card, "gain2", "log"); + } + }).judge2 = function (result) { + return result.bool ? true : false; + }; + } else { + event.finish(); + } + "step 3"; + if (event.count && lib.skill.olbaonue.filter(trigger, player)) event.goto(1); + }, + }, + rezishou: { + audio: "zishou", + audioname: ["re_liubiao"], + trigger: { player: "phaseDrawBegin2" }, + check: function (event, player) { + return ( + player.countCards("h") <= (player.hasSkill("zongshi") ? player.maxHp : player.hp - 2) || + player.skipList.includes("phaseUse") || + !player.countCards("h", function (card) { + return get.tag(card, "damage") && player.hasUseTarget(card); + }) + ); + }, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num += game.countGroup(); + player.addTempSkill("rezishou2"); + }, + ai: { + threaten: 1.5, + }, + }, + rezishou2: { + audio: "rezishou", + trigger: { + source: "damageBegin2", + //player:'phaseJieshuBegin', + }, + forced: true, + filter: function (event, player) { + if (event.name == "damage") return event.player != player; + if (player.getHistory("skipped").includes("phaseUse")) return false; + return ( + player.getHistory("useCard", function (evt) { + if (evt.targets && evt.targets.length && evt.isPhaseUsing()) { + var targets = evt.targets.slice(0); + while (targets.includes(player)) targets.remove(player); + return targets.length > 0; + } + return false; + }).length == 0 + ); + }, + popup: false, + content: function () { + "step 0"; + if (trigger.name == "damage") { + player.logSkill("rezishou", trigger.player); + trigger.cancel(); + event.finish(); + return; + } else { + var filterTarget = function (card, player, target) { + return ( + target != player && + target.countCards("e", function (card) { + return player.canEquip(card); + }) + ); + }; + if ( + game.hasPlayer(function (current) { + return filterTarget(null, player, current); + }) + ) + player.chooseTarget(filterTarget, "是否将一名其他角色装备区内的一张牌移动到自己的装备区?").set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0 && !target.hasSkillTag("noe")) return 0; + var num = 0; + target.countCards("e", function (card) { + if (player.canEquip(card)) { + var eff = get.effect(player, card, player, player); + if (eff > num) num = eff; + } + }); + if (num <= 0) return 0; + if (att < 0) return num * -att; + return 1 / num; + }); + else event.finish(); + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("rezishou", target); + player.choosePlayerCard(target, "e", "将一张装备牌移至你的装备区").set("filterButton", function (button) { + return _status.event.player.canEquip(button.link); + }); + } else event.finish(); + "step 2"; + if (result && result.links && result.links.length) { + game.delay(2); + target.$give(result.links[0], player, false); + player.equip(result.links[0]); + player.addExpose(0.2); + } + }, + ai: { + effect: { + player: function (card, player, target) { + if (get.tag(card, "damage")) return "zeroplayertarget"; + }, + }, + }, + }, + decadepojun: { + shaRelated: true, + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && event.target.hp > 0 && event.target.countCards("he") > 0; + }, + content: function () { + "step 0"; + var next = player.choosePlayerCard(trigger.target, "he", [1, Math.min(trigger.target.hp, trigger.target.countCards("he"))], get.prompt("decadepojun", trigger.target)); + next.set("ai", function (button) { + if (!_status.event.goon) return 0; + var val = get.value(button.link); + if (button.link == _status.event.target.getEquip(2)) return 2 * (val + 3); + return val; + }); + next.set("goon", get.attitude(player, trigger.target) <= 0); + next.set("forceAuto", true); + "step 1"; + if (result.bool) { + event.cards = result.cards; + var target = trigger.target; + player.logSkill("decadepojun", trigger.target); + target.addSkill("decadepojun2"); + target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("decadepojun2"); + } else event.finish(); + "step 2"; + var discard = false, + draw = false; + for (var i of cards) { + var type = get.type2(i); + if (type == "equip") discard = true; + if (type == "trick") draw = true; + } + if (discard) { + event.equip = true; + player + .chooseButton( + [ + "选择一张牌置入弃牌堆", + cards.filter(function (card) { + return get.type(card) == "equip"; + }), + ], + true + ) + .set("ai", function (button) { + return get.value(button.link, _status.event.getTrigger().target); + }); + } + if (draw) event.draw = true; + "step 3"; + if (event.equip && result.links && result.links.length) { + trigger.target.loseToDiscardpile(result.links); + } + if (event.draw) player.draw(); + }, + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (get.attitude(player, arg.target) > 0) return false; + if (tag == "directHit_ai") return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; + return false; + }, + }, + }, + decadepojun2: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("decadepojun2").length > 0; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("decadepojun2"); + player.gain(cards, "draw"); + game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌"); + "step 1"; + player.removeSkill("decadepojun2"); + }, + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("decadepojun2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + }, + }, + hanzhan: { + audio: 2, + trigger: { + global: "chooseToCompareBegin", + }, + filter: function (event, player) { + if (player == event.player) return true; + if (event.targets) return event.targets.includes(player); + return player == event.target; + }, + logTarget: function (event, player) { + if (player != event.player) return event.player; + return event.targets || event.target; + }, + prompt2: function (event, player) { + return "令其改为使用随机的手牌进行拼点"; + }, + check: function (trigger, player) { + var num = 0; + var targets = player == trigger.player ? (trigger.targets ? trigger.targets.slice(0) : [trigger.target]) : [trigger.player]; + while (targets.length) { + var target = targets.shift(); + if (target.getCards("h").length > 1) num -= get.attitude(player, target); + } + return num > 0; + }, + content: function () { + var targets = player == trigger.player ? (trigger.targets ? trigger.targets.slice(0) : [trigger.target]) : [trigger.player]; + if (!trigger.fixedResult) trigger.fixedResult = {}; + while (targets.length) { + var target = targets.shift(); + var hs = target.getCards("h"); + if (hs.length) trigger.fixedResult[target.playerid] = hs.randomGet(); + } + }, + group: "hanzhan_gain", + subfrequent: ["gain"], + }, + hanzhan_gain: { + trigger: { + global: "chooseToCompareAfter", + }, + audio: "hanzhan", + filter: function (event, player) { + if (event.preserve) return false; + if (player != event.player && player != event.target && (!event.targets || !event.targets.includes(player))) return false; + for (var i of event.lose_list) { + if (Array.isArray(i[1])) { + for (var j of i[1]) { + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") return true; + } + } else { + var j = i[1]; + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") return true; + } + } + return false; + }, + frequent: true, + prompt2: function (event, player) { + var cards = [], + max = 0; + for (var i of event.lose_list) { + if (Array.isArray(i[1])) { + for (var j of i[1]) { + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") { + var num = get.number(j, i[0]); + if (num > max) { + cards = []; + max = num; + } + if (num == max) cards.push(j); + } + } + } else { + var j = i[1]; + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") { + var num = get.number(j, i[0]); + if (num > max) { + cards = []; + max = num; + } + if (num == max) cards.push(j); + } + } + } + return "获得" + get.translation(cards); + }, + content: function () { + var cards = [], + max = 0; + for (var i of trigger.lose_list) { + if (Array.isArray(i[1])) { + for (var j of i[1]) { + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") { + var num = get.number(j, i[0]); + if (num > max) { + cards = []; + max = num; + } + if (num == max) cards.push(j); + } + } + } else { + var j = i[1]; + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") { + var num = get.number(j, i[0]); + if (num > max) { + cards = []; + max = num; + } + if (num == max) cards.push(j); + } + } + } + player.gain(cards, "gain2"); + }, + }, + rejianchu: { + shaRelated: true, + audio: 2, + audioname: ["re_pangde"], + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countDiscardableCards(player, "he") > 0; + }, + direct: true, + content: function () { + "step 0"; + player + .discardPlayerCard(trigger.target, get.prompt("rejianchu", trigger.target)) + .set("ai", function (button) { + if (!_status.event.att) return 0; + if (get.position(button.link) == "e") { + if (get.subtype(button.link) == "equip2") return 2 * get.value(button.link); + return get.value(button.link); + } + return 1; + }) + .set("logSkill", ["rejianchu", trigger.target]) + .set("att", get.attitude(player, trigger.target) <= 0); + "step 1"; + if (result.bool && result.links && result.links.length) { + if (get.type(result.links[0], null, result.links[0].original == "h" ? player : false) != "basic") { + trigger.getParent().directHit.add(trigger.target); + player.addTempSkill("rejianchu2"); + player.addMark("rejianchu2", 1, false); + } else if (trigger.cards) { + var list = []; + for (var i = 0; i < trigger.cards.length; i++) { + if (get.position(trigger.cards[i], true) == "o") list.push(trigger.cards[i]); + } + if (list.length) trigger.target.gain(list, "gain2", "log"); + } + } + }, + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "directHit_ai") + return ( + arg.card.name == "sha" && + arg.target.countCards("e", function (card) { + return get.value(card) > 1; + }) > 0 + ); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; + return false; + }, + }, + }, + rejianchu2: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("rejianchu2"); + }, + }, + onremove: true, + }, + wulie: { + trigger: { player: "phaseJieshuBegin" }, + audio: 2, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "wood", + unique: true, + filter: function (event, player) { + return player.hp > 0; + }, + content: function () { + "step 0"; + player.chooseTarget([1, player.hp], get.prompt2("wulie"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + if (player.hasUnknown()) return 0; + if (player.hp - ui.selected.targets.length > 1 + player.countCards("hs", card => player.canSaveCard(card, player))) return get.attitude(player, target); + return 0; + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("wulie", targets); + player.awakenSkill("wulie"); + player.loseHp(targets.length); + while (targets.length) { + targets[0].addSkill("wulie2"); + targets.shift().addMark("wulie2"); + } + } + }, + }, + wulie2: { + marktext: "烈", + intro: { name2: "烈", content: "mark" }, + trigger: { player: "damageBegin3" }, + forced: true, + content: function () { + trigger.cancel(); + player.removeMark("wulie2", 1); + if (!player.storage.wulie2) player.removeSkill("wulie2"); + }, + }, + regongji: { + mod: { + attackRangeBase: function (player) { + if (player.getEquips(3).length > 0 || player.getEquips(4).length > 0) return Infinity; + }, + }, + locked: false, + enable: "phaseUse", + usable: 1, + position: "he", + filter: function (event, player) { + return player.hasCard(function (card) { + return lib.skill.regongji.filterCard(card); + }, "eh"); + }, + filterCard: function (card, player) { + return get.type(card) != "basic"; + }, + filterTarget: function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }, + check: function (card) { + return 4.5 - get.value(card); + }, + content: function () { + if (target.countDiscardableCards(player, "he") > 0) player.discardPlayerCard(target, "he", true); + }, + ai: { + order: 5, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + var nh = target.countCards("h"); + if (att > 0) { + if (target.getEquip("baiyin") && target.isDamaged() && get.recoverEffect(target, player, player) > 0) { + if (target.hp == 1 && !target.hujia) return 1.6; + if (target.hp == 2) return 0.01; + return 0; + } + } + var es = target.getCards("e"); + var noe = es.length == 0 || target.hasSkillTag("noe"); + var noe2 = es.length == 1 && es[0].name != "tengjia" && get.value(es[0]) <= 0; + var noh = nh == 0 || target.hasSkillTag("noh"); + if (noh && (noe || noe2)) return 0; + if (att <= 0 && !target.countCards("he")) return 1.5; + return -1.5; + }, + }, + tag: { + loseCard: 1, + discard: 1, + }, + }, + }, + ollongdan: { + mod: { + aiValue: function (player, card, num) { + if (card.name != "sha" && card.name != "shan") return; + var geti = function () { + var cards = player.getCards("hs", function (card) { + return card.name == "sha" || card.name == "shan"; + }); + if (cards.includes(card)) { + return cards.indexOf(card); + } + return cards.length; + }; + return Math.max(num, [7, 5, 5, 3][Math.min(geti(), 3)]); + }, + aiUseful: function () { + return lib.skill.ollongdan.mod.aiValue.apply(this, arguments); + }, + }, + locked: false, + audio: "longdan_sha", + audioname: ["re_zhaoyun"], + audioname2: { tongyuan: "longdan_tongyuan" }, + hiddenCard: function (player, name) { + if (name == "tao") return player.countCards("hs", "jiu") > 0; + if (name == "jiu") return player.countCards("hs", "tao") > 0; + return false; + }, + enable: ["chooseToUse", "chooseToRespond"], + position: "hs", + prompt: "将杀当做闪,或将闪当做杀,或将桃当做酒,或将酒当做桃使用或打出", + viewAs: function (cards, player) { + if (cards.length) { + var name = false; + switch (get.name(cards[0], player)) { + case "sha": + name = "shan"; + break; + case "shan": + name = "sha"; + break; + case "tao": + name = "jiu"; + break; + case "jiu": + name = "tao"; + break; + } + if (name) return { name: name }; + } + return null; + }, + check: function (card) { + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; + var name2; + var list = ["sha", "tao", "jiu"]; + var map = { sha: "shan", tao: "jiu", jiu: "tao" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if (player.countCards("hs", map[name]) > (name == "jiu" ? 1 : 0) && player.getUseValue({ name: name }) > 0) { + var temp = get.order({ name: name }); + if (temp > max) { + max = temp; + name2 = map[name]; + } + } + } + if (name2 == get.name(card, player)) return 1; + return 0; + } + return 1; + }, + filterCard: function (card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.name(card, player); + if (name == "sha" && filter({ name: "shan", cards: [card] }, player, event)) return true; + if (name == "shan" && filter({ name: "sha", cards: [card] }, player, event)) return true; + if (name == "tao" && filter({ name: "jiu", cards: [card] }, player, event)) return true; + if (name == "jiu" && filter({ name: "tao", cards: [card] }, player, event)) return true; + return false; + }, + filter: function (event, player) { + var filter = event.filterCard; + if (filter(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && player.countCards("hs", "shan")) return true; + if (filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && player.countCards("hs", "sha")) return true; + if (filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && player.countCards("hs", "jiu")) return true; + if (filter(get.autoViewAs({ name: "jiu" }, "unsure"), player, event) && player.countCards("hs", "tao")) return true; + return false; + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + var name; + switch (tag) { + case "respondSha": + name = "shan"; + break; + case "respondShan": + name = "sha"; + break; + } + if (!player.countCards("hs", name)) return false; + }, + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao", "jiu"]; + var map = { sha: "shan", tao: "jiu", jiu: "tao" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if (player.countCards("hs", map[name]) > (name == "jiu" ? 1 : 0) && player.getUseValue({ name: name }) > 0) { + var temp = get.order({ name: name }); + if (temp > max) max = temp; + } + } + if (max > 0) max += 0.3; + return max; + } + return 4; + }, + }, + }, + olyajiao: { + audio: "reyajiao", + trigger: { player: "loseAfter" }, + frequent: true, + filter: function (event, player) { + return player != _status.currentPhase && event.hs && event.hs.length > 0 && ["useCard", "respond"].includes(event.getParent().name); + }, + content: function () { + "step 0"; + event.card = get.cards()[0]; + game.cardsGotoOrdering(event.card); + event.videoId = lib.status.videoId++; + var judgestr = get.translation(player) + "发动了【涯角】"; + game.addVideo("judge1", player, [get.cardInfo(event.card), judgestr, event.videoId]); + game.broadcastAll( + function (player, card, str, id, cardid) { + var event; + if (game.online) { + event = {}; + } else { + event = _status.event; + } + if (game.chess) { + event.node = card.copy("thrown", "center", ui.arena).addTempClass("start"); + } else { + event.node = player.$throwordered(card.copy(), true); + } + if (lib.cardOL) lib.cardOL[cardid] = event.node; + event.node.cardid = cardid; + event.node.classList.add("thrownhighlight"); + ui.arena.classList.add("thrownhighlight"); + event.dialog = ui.create.dialog(str); + event.dialog.classList.add("center"); + event.dialog.videoId = id; + }, + player, + event.card, + judgestr, + event.videoId, + get.id() + ); + + game.log(player, "展示了", event.card); + game.delay(2); + if (get.type(event.card, "trick") == get.type(trigger.getParent().card, "trick")) { + player + .chooseTarget("选择获得此牌的角色") + .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 (att > 0) { + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }) + .set("du", event.card.name == "du"); + } else { + event.disbool = true; + player + .chooseTarget("是否弃置攻击范围内包含你的一名角色区域内的一张牌?", function (card, player, target) { + return target.inRange(player) && target.countDiscardableCards(player, "hej") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe" }, player, player); + }); + } + "step 1"; + if (event.disbool) { + if (result.bool) { + player.line(result.targets[0], "green"); + player.discardPlayerCard(result.targets[0], "hej", true); + } + event.dialog.close(); + game.addVideo("judge2", null, event.videoId); + game.addVideo("deletenode", player, [get.cardInfo(event.node)]); + event.node.delete(); + game.broadcast( + function (id, card) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + if (card.clone) { + card.clone.delete(); + } + ui.arena.classList.remove("thrownhighlight"); + }, + event.videoId, + event.card + ); + ui.arena.classList.remove("thrownhighlight"); + } else if (result.targets) { + event.dialog.close(); + game.addVideo("judge2", null, event.videoId); + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "log"); + event.node.moveDelete(result.targets[0]); + game.addVideo("gain2", result.targets[0], [get.cardInfo(event.node)]); + ui.arena.classList.remove("thrownhighlight"); + game.broadcast( + function (card, target, id) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + ui.arena.classList.remove("thrownhighlight"); + if (card.clone) { + card.clone.moveDelete(target); + } + }, + event.card, + result.targets[0], + event.videoId + ); + } else { + game.addVideo("deletenode", player, [get.cardInfo(event.node)]); + event.node.delete(); + game.broadcast( + function (id) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + if (card.clone) { + card.clone.delete(); + } + ui.arena.classList.remove("thrownhighlight"); + }, + event.videoId, + event.card + ); + event.dialog.close(); + game.addVideo("judge2", null, event.videoId); + ui.arena.classList.remove("thrownhighlight"); + } + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "respond") && target.countCards("h") > 1) return [1, 0.2]; + }, + }, + }, + }, + olpaoxiao: { + audio: "paoxiao", + audioname: ["re_zhangfei", "guanzhang", "xiahouba", "re_guanzhang"], + trigger: { player: "shaMiss" }, + forced: true, + content: function () { + player.addTempSkill("olpaoxiao2"); + player.addMark("olpaoxiao2", 1, false); + }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return Infinity; + }, + }, + }, + olpaoxiao2: { + trigger: { source: "damageBegin1" }, + forced: true, + audio: "paoxiao", + audioname: ["re_zhangfei", "guanzhang", "xiahouba", "re_guanzhang"], + filter: function (event, player) { + return event.card && event.card.name == "sha" && player.countMark("olpaoxiao2") > 0; + }, + onremove: true, + content: function () { + trigger.num += player.countMark("olpaoxiao2"); + player.removeSkill("olpaoxiao2"); + }, + intro: { content: "本回合内下一次使用【杀】造成伤害时令伤害值+#" }, + }, + oltishen: { + audio: "retishen", + unique: true, + mark: true, + skillAnimation: true, + animationColor: "soil", + limited: true, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (player.storage.oltishen) return false; + return player.isDamaged(); + }, + check: function (event, player) { + if (player.hp <= 2 || player.getDamagedHp() > 2) return true; + if (player.getDamagedHp() <= 1) return false; + return player.getDamagedHp() < game.roundNumber; + }, + content: function () { + player.awakenSkill("oltishen"); + player.recover(player.maxHp - player.hp); + player.draw(player.maxHp - player.hp); + }, + intro: { + content: "limited", + }, + }, + rexuanfeng: { + audio: "xuanfeng", + audioname: ["boss_lvbu3", "re_heqi", "re_lingtong"], + trigger: { + player: ["loseAfter", "phaseDiscardEnd"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + if ( + !game.hasPlayer(function (current) { + return current != player && current.countCards("he") > 0; + }) + ) + return false; + if (event.name == "phaseDiscard") { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt && evt.type == "discard" && evt.getParent("phaseDiscard") == event && evt.hs) cards.addArray(evt.hs); + }); + return cards.length > 1; + } + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; + }, + content: function () { + "step 0"; + var list = ["弃置至多两名其他角色的合计两张牌"]; + if (lib.skill.rexuanfeng.canMoveCard(player)) list.push("将一名其他角色装备区内的一张牌移动到另一名角色的装备区内"); + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("prompt", get.prompt("rexuanfeng")) + .set("ai", function () { + if (lib.skill.rexuanfeng.canMoveCard(player, true)) return 1; + return 0; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("rexuanfeng"); + if (result.index == 1) event.goto(5); + else event.count = 2; + } else event.finish(); + "step 2"; + player + .chooseTarget("弃置一名其他角色的一张牌", function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he"); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 3"; + if (result.bool) { + player.line(result.targets[0], "green"); + player.discardPlayerCard(result.targets[0], "he", true); + event.count--; + } else event.finish(); + "step 4"; + if (event.count) event.goto(2); + else event.finish(); + "step 5"; + var next = player.chooseTarget(2, function (card, player, target) { + if (player == target) return false; + if (ui.selected.targets.length) { + var from = ui.selected.targets[0]; + if (target.isMin()) return false; + var es = from.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (target.canEquip(es[i])) return true; + } + return false; + } else { + return target.countCards("e") > 0; + } + }); + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var sgnatt = get.sgn(att); + if (ui.selected.targets.length == 0) { + if (att > 0) { + if ( + target.countCards("e", function (card) { + return ( + get.value(card, target) < 0 && + game.hasPlayer(function (current) { + return current != player && current != target && get.attitude(player, current) < 0 && current.canEquip(card) && get.effect(current, card, player, player) > 0; + }) + ); + }) > 0 + ) + return 9; + } else if (att < 0) { + if ( + game.hasPlayer(function (current) { + if (current != target && current != player && get.attitude(player, current) > 0) { + var es = target.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (get.value(es[i], target) > 0 && current.canEquip(es[i]) && get.effect(current, es[i], player, player) > 0) return true; + } + } + }) + ) { + return -att; + } + } + return 0; + } + var es = ui.selected.targets[0].getCards("e"); + var i; + var att2 = get.sgn(get.attitude(player, ui.selected.targets[0])); + for (i = 0; i < es.length; i++) { + if (sgnatt != 0 && att2 != 0 && sgnatt != att2 && get.sgn(get.value(es[i], ui.selected.targets[0])) == -att2 && get.sgn(get.value(es[i], target)) == sgnatt && target.canEquip(es[i])) { + return Math.abs(att); + } + } + if (i == es.length) { + return 0; + } + return -att * get.attitude(player, ui.selected.targets[0]); + }); + next.set("multitarget", true); + next.set("targetprompt", ["被移走", "移动目标"]); + next.set("prompt", event.prompt || "移动场上的一张装备牌"); + next.set("forced", true); + "step 6"; + if (result.bool) { + player.line2(result.targets, "green"); + event.targets = result.targets; + } else { + event.finish(); + } + "step 7"; + game.delay(); + "step 8"; + if (targets.length == 2) { + player + .choosePlayerCard( + "e", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if (get.attitude(player, targets0) > get.attitude(player, targets1)) { + if (get.value(button.link, targets0) < 0) return get.effect(targets1, button.link, player, player); + return 0; + } else { + return get.value(button.link, targets0) * get.effect(targets1, button.link, player, player); + } + }, + targets[0] + ) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + var targets1 = _status.event.targets1; + return targets1.canEquip(button.link); + }); + } else { + event.finish(); + } + "step 9"; + if (result.bool && result.links.length) { + var link = result.links[0]; + event.targets[1].equip(link); + event.targets[0].$give(link, event.targets[1]); + game.delay(); + event.result = { bool: true }; + } + }, + canMoveCard: function (player, withatt) { + return game.hasPlayer(function (current) { + if (player == current) return false; + var att = get.sgn(get.attitude(player, current)); + if (!withatt || att != 0) { + var es = current.getCards("e"); + for (var i = 0; i < es.length; i++) { + if ( + game.hasPlayer(function (current2) { + if (player == current2) return false; + if (withatt) { + if (get.sgn(get.value(es[i], current)) != -att) return false; + var att2 = get.sgn(get.attitude(player, current2)); + if (att == att2 || att2 != get.sgn(get.value(es[i], current2))) return false; + } + return current != current2 && !current2.isMin() && current2.canEquip(es[i]); + }) + ) { + return true; + } + } + } + }); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, + reverseEquip: true, + noe: true, + }, + }, + rechunlao: { + trigger: { player: "phaseUseEnd" }, + direct: true, + audio: 2, + filter: function (event, player) { + return player.countCards("h") > 0 && (_status.connectMode || player.countCards("h", "sha") > 0) && !player.getExpansions("rechunlao").length; + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + content: function () { + "step 0"; + player.chooseCard([1, Math.max(1, player.countCards("h", "sha"))], get.prompt("rechunlao"), "将任意张【杀】置于武将牌上作为“醇”", { name: "sha" }).set("ai", function () { + return 1; + }); + "step 1"; + if (result.bool) { + player.logSkill("rechunlao"); + player.addToExpansion("gain2", result.cards).gaintag.add("rechunlao"); + } + }, + ai: { + threaten: 1.4, + }, + group: "rechunlao2", + }, + rechunlao2: { + enable: "chooseToUse", + filter: function (event, player) { + return event.type == "dying" && event.dying && event.dying.hp <= 0 && player.getExpansions("rechunlao").length > 0; + }, + filterTarget: function (card, player, target) { + return target == _status.event.dying; + }, + direct: true, + delay: false, + selectTarget: -1, + content: function () { + "step 0"; + player.chooseCardButton(get.translation("rechunlao"), player.getExpansions("rechunlao"), true); + "step 1"; + if (result.bool) { + player.logSkill("rechunlao"); + event.type = "dying"; + player.loseToDiscardpile(result.links); + target.useCard({ name: "jiu", isCard: true }, target); + var natures = get.natureList(result.links[0]); + if (natures.includes("fire")) player.recover(); + if (natures.includes("thunder")) player.draw(2); + } + }, + ai: { + order: 6, + skillTagFilter: function (player) { + return player.getExpansions("rechunlao").length > 0; + }, + save: true, + result: { + target: 3, + }, + threaten: 1.6, + }, + }, + reluoying: { + audio: 2, + audioname: ["dc_caozhi"], + group: ["reluoying_discard", "reluoying_judge"], + subfrequent: ["judge"], + subSkill: { + discard: { + audio: "reluoying", + audioname: ["dc_caozhi"], + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false) return false; + var cards = event.cards.slice(0); + var evt = event.getl(player); + if (evt && evt.cards) cards.removeArray(evt.cards); + for (var i = 0; i < cards.length; i++) { + if (cards[i].original != "j" && get.suit(cards[i], event.player) == "club" && get.position(cards[i], true) == "d") { + return true; + } + } + return false; + }, + direct: true, + content: function () { + "step 0"; + if (trigger.delay == false) game.delay(); + "step 1"; + var cards = [], + cards2 = trigger.cards.slice(0), + evt = trigger.getl(player); + if (evt && evt.cards) cards2.removeArray(evt.cards); + for (var i = 0; i < cards2.length; i++) { + if (cards2[i].original != "j" && get.suit(cards2[i], trigger.player) == "club" && get.position(cards2[i], true) == "d") { + cards.push(cards2[i]); + } + } + if (cards.length) { + player.chooseButton(["落英:选择要获得的牌", cards], [1, cards.length]).set("ai", function (button) { + return get.value(button.link, _status.event.player, "raw"); + }); + } + "step 2"; + if (result.bool) { + player.logSkill(event.name); + player.gain(result.links, "gain2", "log"); + } + }, + }, + judge: { + audio: "reluoying", + audioname: ["dc_caozhi"], + trigger: { global: "cardsDiscardAfter" }, + direct: true, + filter: function (event, player) { + var evt = event.getParent().relatedEvent; + if (!evt || evt.name != "judge") return; + if (evt.player == player) return false; + if (get.position(event.cards[0], true) != "d") return false; + return get.suit(event.cards[0]) == "club"; + }, + content: function () { + "step 0"; + player.chooseButton(["落英:选择要获得的牌", trigger.cards], [1, trigger.cards.length]).set("ai", function (button) { + return get.value(button.link, _status.event.player, "raw"); + }); + "step 1"; + if (result.bool) { + player.logSkill(event.name); + player.gain(result.links, "gain2", "log"); + } + }, + }, + }, + }, + chengzhang: { + trigger: { player: "phaseZhunbeiBegin" }, + derivation: "rejiushi_mark", + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + filter: function (event, player) { + var num = 0; + player.getAllHistory("sourceDamage", function (evt) { + num += evt.num; + }); + if (num >= 7) return true; + player.getAllHistory("damage", function (evt) { + num += evt.num; + }); + return num > 7; + }, + content: function () { + player.markSkill("rejiushi_mark"); + player.awakenSkill("chengzhang"); + player.storage.chengzhang = true; + player.recover(); + player.draw(); + }, + }, + rejiushi: { + audio: 2, + audioname: ["mb_caomao"], + group: ["rejiushi1", "rejiushi2", "rejiushi3", "rejiushi_gain"], + subfrequent: ["gain"], + subSkill: { + gain: { + audio: "rejiushi", + trigger: { player: "turnOverAfter" }, + frequent: true, + filter: function (event, player) { + return player.storage.chengzhang == true; + }, + prompt: "是否发动【酒诗】,获得牌堆中的一张锦囊牌?", + content: function () { + var card = get.cardPile2(function (card) { + return get.type2(card) == "trick"; + }); + if (card) player.gain(card, "gain2", "log"); + }, + }, + }, + }, + rejiushi1: { + hiddenCard: function (player, name) { + if (name == "jiu") return !player.isTurnedOver(); + return false; + }, + audio: "rejiushi", + audioname: ["mb_caomao"], + enable: "chooseToUse", + filter: function (event, player) { + if (player.classList.contains("turnedover")) return false; + return event.filterCard({ name: "jiu", isCard: true }, player, event); + }, + content: function () { + if (_status.event.getParent(2).type == "dying") { + event.dying = player; + event.type = "dying"; + } + player.turnOver(); + player.useCard({ name: "jiu", isCard: true }, player); + }, + ai: { + order: 5, + result: { + player: function (player) { + if (_status.event.parent.name == "phaseUse") { + if (player.countCards("h", "jiu") > 0) return 0; + if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1) return 0; + if (!player.countCards("h", "sha")) return 0; + var targets = []; + var target; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) < 0) { + if (player.canUse("sha", players[i], true, true)) { + targets.push(players[i]); + } + } + } + if (targets.length) { + target = targets[0]; + } else { + return 0; + } + var num = get.effect(target, { name: "sha" }, player, player); + for (var i = 1; i < targets.length; i++) { + var num2 = get.effect(targets[i], { name: "sha" }, player, player); + if (num2 > num) { + target = targets[i]; + num = num2; + } + } + if (num <= 0) return 0; + var e2 = target.getEquip(2); + if (e2) { + if (e2.name == "tengjia") { + if (!player.countCards("h", { name: "sha", nature: "fire" }) && !player.getEquip("zhuque")) return 0; + } + if (e2.name == "renwang") { + if (!player.countCards("h", { name: "sha", color: "red" })) return 0; + } + if (e2.name == "baiyin") return 0; + } + if (player.getEquip("guanshi") && player.countCards("he") > 2) return 1; + return target.countCards("h") > 3 ? 0 : 1; + } + if (player == _status.event.dying || player.isTurnedOver()) return 3; + }, + }, + effect: { + target: function (card, player, target) { + if (card.name == "guiyoujie") return [0, 0.5]; + if (target.isTurnedOver()) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target.hp == 1) return; + return [1, target.countCards("h") / 2]; + } + } + }, + }, + }, + }, + rejiushi2: { + trigger: { player: "damageBegin3" }, + silent: true, + firstDo: true, + filter: function (event, player) { + return player.classList.contains("turnedover"); + }, + content: function () { + trigger.rejiushi = true; + }, + }, + rejiushi3: { + audio: "rejiushi", + trigger: { player: "damageEnd" }, + check: function (event, player) { + return player.isTurnedOver(); + }, + filter: function (event, player) { + if (event.rejiushi) { + return true; + } + return false; + }, + prompt: function (event, player) { + var str = "是否发动【酒诗】,将武将牌翻面"; + if (!player.storage.chengzhang) str += ",并获得牌堆中的一张锦囊牌"; + str += "?"; + return str; + }, + content: function () { + delete trigger.rejiushi; + player.turnOver(); + if (!player.storage.chengzhang) { + var card = get.cardPile2(function (card) { + return get.type2(card) == "trick"; + }); + if (card) player.gain(card, "gain2", "log"); + } + }, + }, + rejiushi_mark: { + mark: true, + marktext: "改", + intro: { + content: "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。", + }, + }, + rehongyan: { + audio: 2, + mod: { + suit: function (card, suit) { + if (suit == "spade") return "heart"; + }, + }, + trigger: { player: "loseEnd" }, + filter: function (event, player) { + if (player == _status.currentPhase || !event.visible || player.hp <= player.countCards("h")) return false; + for (var i = 0; i < event.cards2.length; i++) { + if (get.suit(event.cards2[i], player) == "heart") return true; + } + return false; + }, + frequent: true, + content: function () { + player.draw(); + }, + }, + reqimou: { + unique: true, + limited: true, + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return !player.storage.reqimou; + }, + init: function (player) { + player.storage.reqimou = false; + }, + mark: true, + intro: { + content: "limited", + }, + skillAnimation: true, + animationColor: "orange", + content: function () { + "step 0"; + var num = player.hp - 1; + if (player.countCards("hs", { name: ["tao", "jiu"] })) { + num = player.hp; + } + var map = {}; + var list = []; + for (var i = 1; i <= player.hp; i++) { + var cn = get.cnNumber(i, true); + map[cn] = i; + list.push(cn); + } + event.map = map; + player.awakenSkill("reqimou"); + player.storage.reqimou = true; + player + .chooseControl(list, function () { + return get.cnNumber(_status.event.goon, true); + }) + .set("prompt", "失去任意点体力") + .set("goon", num); + "step 1"; + var num = event.map[result.control] || 1; + player.storage.reqimou2 = num; + player.loseHp(num); + player.draw(num); + player.addTempSkill("reqimou2"); + }, + ai: { + order: 14, + result: { + player: function (player) { + if (player.hp < 3) return false; + var mindist = player.hp; + if (player.countCards("hs", card => player.canSaveCard(card, player))) mindist++; + if ( + game.hasPlayer(function (current) { + return get.distance(player, current) <= mindist && player.canUse("sha", current, false) && get.effect(current, { name: "sha" }, player, player) > 0; + }) + ) { + return 1; + } + return 0; + }, + }, + }, + }, + reqimou2: { + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (typeof player.storage.reqimou2 == "number" && card.name == "sha") { + return num + player.storage.reqimou2; + } + }, + globalFrom: function (from, to, distance) { + if (typeof from.storage.reqimou2 == "number") { + return distance - from.storage.reqimou2; + } + }, + }, + }, + olniepan: { + audio: 2, + unique: true, + enable: "chooseToUse", + mark: true, + skillAnimation: true, + limited: true, + animationColor: "orange", + init: function (player) { + player.storage.olniepan = false; + }, + filter: function (event, player) { + if (player.storage.olniepan) return false; + if (event.type == "dying") { + if (player != event.dying) return false; + return true; + } + return false; + }, + content: function () { + "step 0"; + player.awakenSkill("olniepan"); + player.storage.olniepan = true; + player.discard(player.getCards("hej")); + "step 1"; + player.link(false); + "step 2"; + player.turnOver(false); + "step 3"; + player.draw(3); + "step 4"; + if (player.hp < 3) { + player.recover(3 - player.hp); + } + "step 5"; + player.chooseControl("bazhen", "olhuoji", "olkanpo").set("prompt", "选择获得一个技能").ai = function () { + return ["olhuoji", "bazhen"].randomGet(); + }; + "step 6"; + player.addSkills(result.control); + }, + derivation: ["bazhen", "olhuoji", "olkanpo"], + ai: { + order: 1, + skillTagFilter: function (player, tag, target) { + if (player != target || player.storage.olniepan) return false; + }, + save: true, + result: { + player: function (player) { + if (player.hp <= 0) return 10; + if (player.hp <= 2 && player.countCards("he") <= 1) return 10; + return 0; + }, + }, + threaten: function (player, target) { + if (!target.storage.olniepan) return 0.6; + }, + }, + intro: { + content: "limited", + }, + }, + rewurong: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + if (target.countCards("h") == 0 || player.countCards("h") == 0) { + event.finish(); + return; + } + "step 1"; + var sendback = function () { + if (_status.event != event) { + return function () { + event.resultOL = _status.event.resultOL; + }; + } + }; + if (player.isOnline()) { + player.wait(sendback); + event.ol = true; + player.send(function () { + game.me.chooseCard(true).set("glow_result", true).ai = function () { + return Math.random(); + }; + game.resume(); + }); + } else { + event.localPlayer = true; + var hasShan = !target.countCards("h", "shan"); + player.chooseCard(true).set("glow_result", true).ai = function (card) { + if (hasShan && get.name(card) == "sha") return 1; + return Math.random(); + }; + } + if (target.isOnline()) { + target.wait(sendback); + event.ol = true; + target.send(function () { + var rand = Math.random() < 0.4; + game.me.chooseCard(true).set("glow_result", true).ai = function (card) { + if (rand) return card.name == "shan" ? 1 : 0; + return card.name == "shan" ? 0 : 1; + }; + game.resume(); + }); + } else { + event.localTarget = true; + } + "step 2"; + if (event.localPlayer) { + event.card1 = result.cards[0]; + } + if (event.localTarget) { + var rand = Math.random() < 0.4; + target.chooseCard(true).set("glow_result", true).ai = function (card) { + if (rand) return card.name == "shan" ? 1 : 0; + return card.name == "shan" ? 0 : 1; + }; + } + "step 3"; + if (event.localTarget) { + event.card2 = result.cards[0]; + } + if (!event.resultOL && event.ol) { + game.pause(); + } + "step 4"; + try { + if (!event.card1) event.card1 = event.resultOL[player.playerid].cards[0]; + if (!event.card2) event.card2 = event.resultOL[target.playerid].cards[0]; + if (!event.card1 || !event.card2) { + throw "err"; + } + } catch (e) { + console.log(e); + event.finish(); + return; + } + game.broadcastAll( + function (card1, card2) { + card1.classList.remove("glow"); + card2.classList.remove("glow"); + }, + event.card1, + event.card2 + ); + "step 5"; + game.broadcastAll(function () { + ui.arena.classList.add("thrownhighlight"); + }); + game.addVideo("thrownhighlight1"); + player.$compare(event.card1, target, event.card2); + game.delay(4); + "step 6"; + var next = game.createEvent("showCards"); + next.player = player; + next.cards = [event.card1]; + next.setContent("emptyEvent"); + game.log(player, "展示了", event.card1); + "step 7"; + var next = game.createEvent("showCards"); + next.player = target; + next.cards = [event.card2]; + next.setContent("emptyEvent"); + game.log(target, "展示了", event.card2); + "step 8"; + var name1 = get.name(event.card1); + var name2 = get.name(event.card2); + if (name1 == "sha" && name2 != "shan") { + //player.discard(event.card1).set('animate',false); + target.$gain2(event.card2); + var clone = event.card1.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; + clone.delete(); + game.addVideo("deletenode", player, get.cardsInfo([clone])); + } + game.broadcast(function (card) { + var clone = card.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; + clone.delete(); + } + }, event.card1); + target.damage("nocard"); + } else if (name1 != "sha" && name2 == "shan") { + //player.discard(event.card1).set('animate',false); + target.$gain2(event.card2); + var clone = event.card1.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; + clone.delete(); + game.addVideo("deletenode", player, get.cardsInfo([clone])); + } + game.broadcast(function (card) { + var clone = card.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; + clone.delete(); + } + }, event.card1); + player.gainPlayerCard(target, true, "he"); + } else { + player.$gain2(event.card1); + target.$gain2(event.card2); + } + game.broadcastAll(function () { + ui.arena.classList.remove("thrownhighlight"); + }); + game.addVideo("thrownhighlight2"); + }, + ai: { + order: 6, + result: { + target: -1, + }, + }, + }, + cangzhuo: { + trigger: { player: "phaseDiscardBegin" }, + frequent: true, + audio: 2, + filter: function (event, player) { + return ( + player.getHistory("useCard", function (card) { + return get.type(card.card, "trick") == "trick"; + }).length == 0 + ); + }, + content: function () { + player.addTempSkill("cangzhuo2"); + }, + }, + cangzhuo2: { + mod: { + ignoredHandcard: function (card, player) { + if (get.type(card, "trick") == "trick") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.type(card, "trick") == "trick") return false; + }, + }, + }, + shebian: { + trigger: { player: "turnOverEnd" }, + check: function (event, player) { + return player.canMoveCard(true, true); + }, + filter: function (event, player) { + return player.canMoveCard(null, true); + }, + content: function () { + player.moveCard().nojudge = true; + }, + }, + rexianzhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.player && get.name(result.player, player) == "sha") player.addTempSkill("rexianzhen4"); + if (result.bool) { + player.storage[event.name] = target; + player.addTempSkill(event.name + 2); + } else { + player.addTempSkill(event.name + 3); + } + }, + ai: { + order: function (name, player) { + var cards = player.getCards("h"); + if (player.countCards("h", "sha") == 0) { + return 1; + } + for (var i = 0; i < cards.length; i++) { + if (cards[i].name != "sha" && get.number(cards[i]) > 11 && get.value(cards[i]) < 7) { + return 9; + } + } + return get.order({ name: "sha" }) - 1; + }, + result: { + player: function (player) { + if (player.countCards("h", "sha") > 0) return 0; + var num = player.countCards("h"); + if (num > player.hp) return 0; + if (num == 1) return -2; + if (num == 2) return -1; + return -0.7; + }, + target: function (player, target) { + var num = target.countCards("h"); + if (num == 1) return -1; + if (num == 2) return -0.7; + return -0.5; + }, + }, + threaten: 1.3, + }, + }, + rexianzhen2: { + charlotte: true, + mod: { + targetInRange: function (card, player, target) { + if (target == player.storage.rexianzhen) return true; + }, + cardUsableTarget: function (card, player, target) { + if (target == player.storage.rexianzhen) return true; + }, + }, + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (arg.target != player.storage.rexianzhen) return false; + }, + }, + }, + rexianzhen3: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + }, + rexianzhen4: { + mod: { + ignoredHandcard: function (card, player) { + if (get.name(card) == "sha") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.name(card) == "sha") { + return false; + } + }, + }, + }, + rejinjiu: { + mod: { + cardname: function (card, player) { + if (card.name == "jiu") return "sha"; + }, + }, + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", "jiu")) return false; + }, + respondSha: true, + }, + audio: 2, + trigger: { player: ["useCard1", "respond"] }, + firstDo: true, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && !event.skill && event.cards.length == 1 && event.cards[0].name == "jiu"; + }, + content: function () {}, + group: "rejinjiu2", + global: "rejinjiu3", + }, + rejinjiu3: { + mod: { + cardEnabled: function (card, player) { + if (card.name == "jiu" && _status.currentPhase && _status.currentPhase != player && _status.currentPhase.hasSkill("rejinjiu")) return false; + }, + cardSavable: function (card, player) { + if (card.name == "jiu" && _status.currentPhase && _status.currentPhase != player && _status.currentPhase.hasSkill("rejinjiu")) return false; + }, + }, + }, + rejinjiu2: { + audio: "rejinjiu", + forced: true, + trigger: { player: "damageBegin3" }, + filter: function (event, player) { + return event.getParent(2).jiu == true; + }, + content: function () { + trigger.num -= trigger.getParent(2).jiu_add; + }, + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + return arg && arg.jiu == true; + }, + }, + }, + repojun: { + shaRelated: true, + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && event.target.hp > 0 && event.target.countCards("he") > 0; + }, + content: function () { + "step 0"; + var next = player.choosePlayerCard(trigger.target, "he", [1, Math.min(trigger.target.hp, trigger.target.countCards("he"))], get.prompt("repojun", trigger.target)); + next.set("ai", function (button) { + if (!_status.event.goon) return 0; + var val = get.value(button.link); + if (button.link == _status.event.target.getEquip(2)) return 2 * (val + 3); + return val; + }); + next.set("goon", get.attitude(player, trigger.target) <= 0); + next.set("forceAuto", true); + "step 1"; + if (result.bool) { + var target = trigger.target; + player.logSkill("repojun", target); + target.addSkill("repojun2"); + target.addToExpansion("giveAuto", result.cards, target).gaintag.add("repojun2"); + } + }, + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (get.attitude(player, arg.target) > 0) return false; + if (tag == "directHit_ai") return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; + return false; + }, + }, + group: "repojun3", + }, + repojun3: { + audio: "repojun", + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + var target = event.player; + return event.card && event.card.name == "sha" && player.countCards("h") >= target.countCards("h") && player.countCards("e") >= target.countCards("e"); + }, + forced: true, + locked: false, + logTarget: "player", + content: function () { + trigger.num++; + }, + }, + repojun2: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("repojun2").length > 0; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("repojun2"); + player.gain(cards, "draw"); + game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌"); + "step 1"; + player.removeSkill("repojun2"); + }, + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("repojun2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + }, + }, + sishu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("sishu")).ai = function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countMark("sishu2") % 2 == 1) return -att; + return att; + }; + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sishu", target); + target.addSkill("sishu2"); + target.addMark("sishu2", 1, false); + } + }, + }, + sishu2: { + charlotte: true, + marktext: "思", + intro: { + name: "思蜀", + content: "本局游戏内计算【乐不思蜀】的效果时反转#次", + }, + mod: { + judge: function (player, result) { + if (_status.event.cardname == "lebu" && player.countMark("sishu2") % 2 == 1) { + if (result.bool == false) { + result.bool = true; + } else { + result.bool = false; + } + } + }, + }, + }, + olruoyu: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + unique: true, + juexingji: true, + zhuSkill: true, + keepSkill: true, + derivation: ["rejijiang", "sishu"], + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + if (!player.hasZhuSkill("olruoyu")) return false; + return player.isMinHp(); + }, + content: function () { + "step 0"; + player.awakenSkill("olruoyu"); + player.gainMaxHp(); + "step 1"; + if (player.hp < 3) player.recover(3 - player.hp); + player.addSkills(["sishu", "rejijiang"]); + }, + }, + olfangquan: { + audio: 2, + audioname: ["shen_caopi"], + trigger: { player: "phaseUseBefore" }, + filter: function (event, player) { + return player.countCards("h") > 0 && !player.hasSkill("olfangquan3"); + }, + direct: true, + content: function () { + "step 0"; + var fang = player.countMark("olfangquan2") == 0 && player.hp >= 2 && player.countCards("h") <= player.hp + 2; + player + .chooseBool(get.prompt2("olfangquan")) + .set("ai", function () { + if (!_status.event.fang) return false; + return game.hasPlayer(function (target) { + if (target.hasJudge("lebu") || target == player) return false; + if (get.attitude(player, target) > 4) { + return get.threaten(target) / Math.sqrt(target.hp + 1) / Math.sqrt(target.countCards("h") + 1) > 0; + } + return false; + }); + }) + .set("fang", fang); + "step 1"; + if (result.bool) { + player.logSkill("olfangquan"); + trigger.cancel(); + player.addTempSkill("olfangquan2"); + player.addMark("olfangquan2", 1, false); + } + }, + }, + olfangquan2: { + trigger: { player: "phaseDiscardBegin" }, + forced: true, + popup: false, + audio: false, + onremove: true, + content: function () { + "step 0"; + event.count = player.countMark(event.name); + player.removeMark(event.name, event.count, false); + "step 1"; + event.count--; + player.chooseToDiscard("是否弃置一张牌并令一名其他角色进行一个额外回合?").set("logSkill", "olfangquan").ai = function (card) { + return 20 - get.value(card); + }; + "step 2"; + if (result.bool) { + player.chooseTarget(true, "请选择进行额外回合的目标角色", lib.filter.notMe).ai = function (target) { + if (target.hasJudge("lebu")) return -1; + if (get.attitude(player, target) > 4) { + return get.threaten(target) / Math.sqrt(target.hp + 1) / Math.sqrt(target.countCards("h") + 1); + } + return -1; + }; + } else event.finish(); + "step 3"; + var target = result.targets[0]; + player.line(target, "fire"); + target.markSkillCharacter("olfangquan", player, "放权", "进行一个额外回合"); + target.insertPhase(); + target.addSkill("olfangquan3"); + if (event.count > 0) event.goto(1); + }, + }, + olfangquan3: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + audio: false, + content: function () { + player.unmarkSkill("olfangquan"); + player.removeSkill("olfangquan3"); + }, + }, + olluanji: { + inherit: "luanji", + audioname: ["shen_caopi"], + audio: 2, + line: false, + group: "olluanji_remove", + check: function (card) { + return 7 - get.value(card); + }, + }, + olluanji_remove: { + trigger: { player: "useCard2" }, + direct: true, + filter: function (event, player) { + return event.card.name == "wanjian" && event.targets.length > 0; + }, + line: false, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("olluanji"), "为" + get.translation(trigger.card) + "减少一个目标", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("targets", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return -get.effect(target, _status.event.getTrigger().card, player, player); + }); + "step 1"; + if (result.bool) { + player.logSkill("olluanji", result.targets); + trigger.targets.remove(result.targets[0]); + } + }, + }, + olxueyi: { + audio: 2, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + zhuSkill: true, + unique: true, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.hasZhuSkill("olxueyi"); + }, + content: function () { + // player.storage.olxueyi_inited=true; + var num = game.countPlayer(function (current) { + return current.group == "qun"; + }); + if (num) player.addMark("olxueyi", num * 2); + }, + marktext: "裔", + intro: { + name2: "裔", + content: "mark", + }, + mod: { + maxHandcard: function (player, num) { + if (player.hasZhuSkill("olxueyi")) return num + player.countMark("olxueyi"); + }, + }, + group: "olxueyi_draw", + }, + olxueyi_draw: { + audio: "olxueyi", + trigger: { player: "phaseUseBegin" }, + prompt2: "弃置一枚「裔」标记,然后摸一张牌", + check: function (event, player) { + return player.getUseValue("wanjian") > 0 || !player.needsToDiscard(); + }, + filter: function (event, player) { + return player.hasZhuSkill("olxueyi") && player.hasMark("olxueyi"); + }, + content: function () { + player.removeMark("olxueyi", 1); + player.draw(); + }, + }, + olhunzi: { + audio: 2, + audioname: ["re_sunyi"], + inherit: "hunzi", + content: function () { + player.awakenSkill(event.name); + player.loseMaxHp(); + //player.recover(); + player.addSkills(["reyingzi", "gzyinghun"]); + player.addTempSkill("olhunzi_effect"); + }, + subSkill: { + effect: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + player.chooseDrawRecover(2, true); + }, + }, + }, + }, + olzhiba: { + audio: 2, + unique: true, + zhuSkill: true, + global: "olzhiba2", + }, + olzhiba2: { + ai: { + order: 1, + result: { + target: function (player, target) { + if (player.hasZhuSkill("olzhiba") && !player.hasSkill("olzhiba3") && target.group == "wu") { + if ( + player.countCards("h", function (card) { + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return get.number(card) >= 12; + } + if (val <= 6) { + return get.number(card) >= 13; + } + return false; + }) > 0 + ) + return -1; + return 0; + } else { + if (player.countCards("h", "du") && get.attitude(player, target) < 0) return -1; + if (player.countCards("h") <= player.hp) return 0; + var maxnum = 0; + var cards2 = target.getCards("h"); + for (var i = 0; i < cards2.length; i++) { + if (get.number(cards2[i]) > maxnum) { + maxnum = get.number(cards2[i]); + } + } + if (maxnum > 10) maxnum = 10; + if (maxnum < 5 && cards2.length > 1) maxnum = 5; + var cards = player.getCards("h"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) < maxnum) return 1; + } + return 0; + } + }, + }, + }, + enable: "phaseUse", + //usable:1, + prompt: "请选择〖制霸〗的目标", + filter: function (event, player) { + if ( + player.hasZhuSkill("olzhiba") && + !player.hasSkill("olzhiba3") && + game.hasPlayer(function (current) { + return current != player && current.group == "wu" && player.canCompare(current); + }) + ) + return true; + return ( + player.group == "wu" && + game.hasPlayer(function (current) { + return current != player && current.hasZhuSkill("olzhiba", player) && !current.hasSkill("olzhiba3") && player.canCompare(current); + }) + ); + }, + filterTarget: function (card, player, target) { + if (player.hasZhuSkill("olzhiba") && !player.hasSkill("olzhiba3") && target.group == "wu" && player.canCompare(target)) return true; + return player.group == "wu" && target.hasZhuSkill("olzhiba", player) && !target.hasSkill("olzhiba3") && player.canCompare(target); + }, + prepare: function (cards, player, targets) { + if (player.hasZhuSkill("olzhiba")) player.logSkill("olzhiba"); + if (targets[0].hasZhuSkill("olzhiba", player)) targets[0].logSkill("olzhiba"); + }, + direct: true, + clearTime: true, + contentBefore: function () { + "step 0"; + var list = []; + if (player.hasZhuSkill("olzhiba") && targets[0].group == "wu" && !player.hasSkill("olzhiba3")) list.push(player); + if (player.group == "wu" && targets[0].hasZhuSkill("olzhiba") && !targets[0].hasSkill("olzhiba3")) list.push(targets[0]); + if (list.length == 1) { + event.target = list[0]; + event.goto(2); + } else + player + .chooseTarget(true, "请选择获得所有拼点牌的角色", function (card, player, target) { + return _status.event.list.includes(target); + }) + .set("list", list); + "step 1"; + event.target = result.targets[0]; + "step 2"; + target.addTempSkill("olzhiba3", "phaseUseEnd"); + if (target == targets[0]) { + target + .chooseBool("是否接受来自" + get.translation(player) + "的拼点请求?") + .set( + "choice", + get.attitude(target, player) > 0 || + target.countCards("h", function (card) { + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return get.number(card) >= 12; + } + if (val <= 6) { + return get.number(card) >= 13; + } + return false; + }) > 0 + ) + .set("ai", function () { + return _status.event.choice; + }); + } else event._result = { bool: true }; + "step 3"; + if (result.bool) event.getParent().zhiba_target = target; + else { + game.log(target, "拒绝了", player, "的拼点请求"); + target.chat("拒绝"); + } + }, + content: function () { + "step 0"; + event.source = event.getParent().zhiba_target; + if (!event.source) { + event.finish(); + } + "step 1"; + player.chooseToCompare(target).set("small", target == source && get.attitude(player, target) > 0).clear = false; + "step 2"; + if ((player == source && result.bool) || (target == source && !result.bool)) { + event.cards = [result.player, result.target].filterInD("d"); + if (!event.cards.length) event.finish(); + else + source + .chooseControl("ok", "cancel2") + .set("dialog", ["是否获得拼点牌?", event.cards]) + .set("ai", function () { + if (get.value(event.cards, source, "raw") <= 0) return false; + return true; + }); + } else event.finish(); + "step 3"; + if (result.control != "cancel2") source.gain(event.cards, "gain2", "log"); + else ui.clear(); + }, + }, + olzhiba3: {}, + rehuashen: { + unique: true, + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame", "phaseBegin", "phaseEnd", "rehuashen"], + }, + filter: function (event, player, name) { + if (event.name != "phase") return true; + if (name == "phaseBefore") return game.phaseNumber == 0; + return player.storage.rehuashen && player.storage.rehuashen.character.length > 0; + }, + direct: true, + content: function () { + "step 0"; + var name = event.triggername; + if (trigger.name != "phase" || (name == "phaseBefore" && game.phaseNumber == 0)) { + player.logSkill("rehuashen"); + lib.skill.rehuashen.addHuashens(player, 3); + event.logged = true; + } + _status.noclearcountdown = true; + event.videoId = lib.status.videoId++; + var cards = player.storage.rehuashen.character.slice(0); + var skills = []; + var sto = player.storage.rehuashen; + for (var i in player.storage.rehuashen.map) { + skills.addArray(player.storage.rehuashen.map[i]); + } + var cond = "out"; + if (event.triggername == "phaseBegin") { + cond = "in"; + } + skills.randomSort(); + skills.sort(function (a, b) { + return get.skillRank(b, cond) - get.skillRank(a, cond); + }); + event.aiChoice = skills[0]; + var choice = "更换技能"; + if (event.aiChoice == player.storage.rehuashen.current2 || get.skillRank(event.aiChoice, cond) < 1) choice = "弃置化身"; + if (player.isOnline2()) { + player.send( + function (cards, id) { + var dialog = ui.create.dialog("是否发动【化身】?", [cards, (item, type, position, noclick, node) => lib.skill.rehuashen.$createButton(item, type, position, noclick, node)]); + dialog.videoId = id; + }, + cards, + event.videoId + ); + } + event.dialog = ui.create.dialog(get.prompt("rehuashen"), [cards, (item, type, position, noclick, node) => lib.skill.rehuashen.$createButton(item, type, position, noclick, node)]); + event.dialog.videoId = event.videoId; + if (!event.isMine()) { + event.dialog.style.display = "none"; + } + if (event.logged) event._result = { control: "更换技能" }; + else + player + .chooseControl("弃置化身", "更换技能", "cancel2") + .set("ai", function () { + return _status.event.choice; + }) + .set("choice", choice); + "step 1"; + event.control = result.control; + if (event.control == "cancel2") { + if (player.isOnline2()) { + player.send("closeDialog", event.videoId); + } + delete _status.noclearcountdown; + if (!_status.noclearcountdown) { + game.stopCountChoose(); + } + event.dialog.close(); + event.finish(); + return; + } + if (!event.logged) { + player.logSkill("rehuashen"); + event.logged = true; + } + var next = player.chooseButton(true).set("dialog", event.videoId); + if (event.control == "弃置化身") { + next.set("selectButton", [1, 2]); + next.set("filterButton", function (button) { + return button.link != _status.event.current; + }); + next.set("current", player.storage.rehuashen.current); + } else { + next.set("ai", function (button) { + return player.storage.rehuashen.map[button.link].includes(_status.event.choice) ? 2.5 : 1 + Math.random(); + }); + next.set("choice", event.aiChoice); + } + var prompt = event.control == "弃置化身" ? "选择制衡至多两张化身" : "选择要切换的化身"; + var func = function (id, prompt) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.content.childNodes[0].innerHTML = prompt; + } + }; + if (player.isOnline2()) { + player.send(func, event.videoId, prompt); + } else if (event.isMine()) { + func(event.videoId, prompt); + } + "step 2"; + if (result.bool && event.control != "弃置化身") { + event.card = result.links[0]; + var func = function (card, id) { + var dialog = get.idDialog(id); + if (dialog) { + for (var i = 0; i < dialog.buttons.length; i++) { + if (dialog.buttons[i].link == card) { + dialog.buttons[i].classList.add("selectedx"); + } else { + dialog.buttons[i].classList.add("unselectable"); + } + } + } + }; + if (player.isOnline2()) { + player.send(func, event.card, event.videoId); + } else if (event.isMine()) { + func(event.card, event.videoId); + } + var list = player.storage.rehuashen.map[event.card].slice(0); + list.push("返回"); + player + .chooseControl(list) + .set("choice", event.aiChoice) + .set("ai", function () { + return _status.event.choice; + }); + } else { + lib.skill.rehuashen.removeHuashen(player, result.links.slice(0)); + lib.skill.rehuashen.addHuashens(player, result.links.length); + } + "step 3"; + if (result.control == "返回") { + var func = function (id) { + var dialog = get.idDialog(id); + if (dialog) { + for (var i = 0; i < dialog.buttons.length; i++) { + dialog.buttons[i].classList.remove("selectedx"); + dialog.buttons[i].classList.remove("unselectable"); + } + } + }; + if (player.isOnline2()) { + player.send(func, event.videoId); + } else if (event.isMine()) { + func(event.videoId); + } + event._result = { control: "更换技能" }; + event.goto(1); + return; + } + if (player.isOnline2()) { + player.send("closeDialog", event.videoId); + } + event.dialog.close(); + delete _status.noclearcountdown; + if (!_status.noclearcountdown) { + game.stopCountChoose(); + } + if (event.control == "弃置化身") return; + if (player.storage.rehuashen.current != event.card) { + const old = player.storage.rehuashen.current; + player.storage.rehuashen.current = event.card; + game.broadcastAll( + function (player, character, old) { + player.tempname.remove(old); + player.tempname.add(character); + player.sex = lib.character[event.card][0]; + }, + player, + event.card, + old + ); + game.log(player, "将性别变为了", "#y" + get.translation(lib.character[event.card][0]) + "性"); + player.changeGroup(lib.character[event.card][1]); + } + var link = result.control; + player.storage.rehuashen.current2 = link; + if (!player.additionalSkills.rehuashen || !player.additionalSkills.rehuashen.includes(link)) { + player.addAdditionalSkills("rehuashen", link); + player.flashAvatar("rehuashen", event.card); + player.syncStorage("rehuashen"); + player.updateMarks("rehuashen"); + // lib.skill.rehuashen.createAudio(event.card,link,'re_zuoci'); + } + }, + init: function (player, skill) { + if (!player.storage[skill]) + player.storage[skill] = { + character: [], + map: {}, + }; + player.when("dieBegin").then(() => { + const name = player.name ? player.name : player.name1; + if (name) { + const sex = get.character(name).sex; + const group = get.character(name).group; + if (player.sex != sex) { + game.broadcastAll( + (player, sex) => { + player.sex = sex; + }, + player, + sex + ); + game.log(player, "将性别变为了", "#y" + get.translation(sex) + "性"); + } + if (player.group != group) player.changeGroup(group); + } + }); + }, + banned: ["lisu", "sp_xiahoudun", "xushao", "jsrg_xushao", "zhoutai", "old_zhoutai", "shixie", "xin_zhoutai", "dc_shixie", "old_shixie"], + bannedType: ["Charlotte", "主公技", "觉醒技", "限定技", "隐匿技", "使命技"], + addHuashen: function (player) { + if (!player.storage.rehuashen) return; + if (!_status.characterlist) { + lib.skill.pingjian.initList(); + } + _status.characterlist.randomSort(); + for (let i = 0; i < _status.characterlist.length; i++) { + let name = _status.characterlist[i]; + if (name.indexOf("zuoci") != -1 || name.indexOf("key_") == 0 || name.indexOf("sp_key_") == 0 || get.is.double(name) || lib.skill.rehuashen.banned.includes(name) || player.storage.rehuashen.character.includes(name)) continue; + let skills = lib.character[name][3].filter(skill => { + const categories = get.skillCategoriesOf(skill); + return !categories.some(type => lib.skill.rehuashen.bannedType.includes(type)); + }); + if (skills.length) { + player.storage.rehuashen.character.push(name); + player.storage.rehuashen.map[name] = skills; + _status.characterlist.remove(name); + return name; + } + } + }, + addHuashens: function (player, num) { + var list = []; + for (var i = 0; i < num; i++) { + var name = lib.skill.rehuashen.addHuashen(player); + if (name) list.push(name); + } + if (list.length) { + player.syncStorage("rehuashen"); + player.updateMarks("rehuashen"); + game.log(player, "获得了", get.cnNumber(list.length) + "张", "#g化身"); + lib.skill.rehuashen.drawCharacter(player, list); + } + }, + removeHuashen: function (player, links) { + player.storage.rehuashen.character.removeArray(links); + _status.characterlist.addArray(links); + game.log(player, "移去了", get.cnNumber(links.length) + "张", "#g化身"); + }, + drawCharacter: function (player, list) { + game.broadcastAll( + function (player, list) { + if (player.isUnderControl(true)) { + 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 + ); + }, + $createButton: function (item, type, position, noclick, node) { + node = ui.create.buttonPresets.character(item, "character", position, noclick); + const info = lib.character[item]; + const skills = info[3].filter(function (skill) { + const categories = get.skillCategoriesOf(skill); + return !categories.some(type => lib.skill.rehuashen.bannedType.includes(type)); + }); + if (skills.length) { + const skillstr = skills.map(i => `[${get.translation(i)}]`).join("
    "); + const skillnode = ui.create.caption(`
    ${skillstr}
    `, node); + skillnode.style.left = "2px"; + skillnode.style.bottom = "2px"; + } + node._customintro = function (uiintro, evt) { + const character = node.link, + characterInfo = get.character(node.link); + let capt = get.translation(character); + if (characterInfo) { + capt += `  ${get.translation(characterInfo.sex)}`; + let charactergroup; + const charactergroups = get.is.double(character, true); + if (charactergroups) charactergroup = charactergroups.map(i => get.translation(i)).join("/"); + else charactergroup = get.translation(characterInfo.group); + capt += `  ${charactergroup}`; + } + uiintro.add(capt); + + if (lib.characterTitle[node.link]) { + uiintro.addText(get.colorspan(lib.characterTitle[node.link])); + } + for (let i = 0; i < skills.length; i++) { + if (lib.translate[skills[i] + "_info"]) { + let translation = lib.translate[skills[i] + "_ab"] || get.translation(skills[i]).slice(0, 2); + if (lib.skill[skills[i]] && lib.skill[skills[i]].nobracket) { + uiintro.add('
    ' + get.translation(skills[i]) + "
    " + get.skillInfoTranslation(skills[i]) + "
    "); + } else { + uiintro.add('
    【' + translation + "】
    " + get.skillInfoTranslation(skills[i]) + "
    "); + } + if (lib.translate[skills[i] + "_append"]) { + uiintro._place_text = uiintro.add('
    ' + lib.translate[skills[i] + "_append"] + "
    "); + } + } + } + }; + return node; + }, + // createAudio:(character,skillx,name)=>{ + // var skills=game.expandSkills([skillx]); + // skills=skills.filter(skill=>get.info(skill)); + // if(!skills.length) return; + // var skillss=skills.filter(skill=>get.info(skill).derivation); + // if(skillss.length){ + // skillss.forEach(skill=>{ + // var derivationSkill=get.info(skill).derivation; + // skills[Array.isArray(derivationSkill)?'addArray':'add'](derivationSkill); + // }); + // } + // skills.forEach(skill=>{ + // var info=lib.skill[skill]; + // if(info){ + // if(!info.audioname2) info.audioname2={}; + // if(info.audioname&&info.audioname.includes(character)){ + // if(info.audio){ + // if(typeof info.audio=='string') skill=info.audio; + // if(Array.isArray(info.audio)) skill=info.audio[0]; + // } + // if(!lib.skill[skill+'_'+character]) lib.skill[skill+'_'+character]={audio:2}; + // info.audioname2[name]=(skill+'_'+character); + // } + // else if(info.audioname2[character]){ + // info.audioname2[name]=info.audioname2[character]; + // } + // else{ + // if(info.audio){ + // if(typeof info.audio=='string') skill=info.audio; + // if(Array.isArray(info.audio)) skill=info.audio[0]; + // } + // info.audioname2[name]=skill; + // } + // } + // }); + // }, + mark: true, + intro: { + onunmark: function (storage, player) { + _status.characterlist.addArray(storage.character); + storage.character = []; + }, + mark: function (dialog, storage, player) { + if (storage && storage.current) dialog.addSmall([[storage.current], (item, type, position, noclick, node) => lib.skill.rehuashen.$createButton(item, type, position, noclick, node)]); + if (storage && storage.current2) dialog.add('
    【' + get.translation(lib.translate[storage.current2 + "_ab"] || get.translation(storage.current2).slice(0, 2)) + "】
    " + get.skillInfoTranslation(storage.current2, player) + "
    "); + if (storage && storage.character.length) { + if (player.isUnderControl(true)) { + dialog.addSmall([storage.character, (item, type, position, noclick, node) => lib.skill.rehuashen.$createButton(item, type, position, noclick, node)]); + } else { + dialog.addText("共有" + get.cnNumber(storage.character.length) + "张“化身”"); + } + } else { + return "没有化身"; + } + }, + content: function (storage, player) { + return "共有" + get.cnNumber(storage.character.length) + "张“化身”"; + }, + markcount: function (storage, player) { + if (storage && storage.character) return storage.character.length; + return 0; + }, + }, + }, + rexinsheng: { + unique: true, + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { + "step 0"; + event.num = trigger.num; + "step 1"; + lib.skill.rehuashen.addHuashens(player, 1); + "step 2"; + if (--event.num > 0 && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { + player.chooseBool(get.prompt2("rexinsheng")).set("frequentSkill", event.name); + } else event.finish(); + "step 3"; + if (result.bool && player.hasSkill("rexinsheng")) { + player.logSkill("rexinsheng"); + event.goto(1); + } + }, + ai: { + combo: "rehuasheng", + }, + }, + reguhuo: { + audio: 2, + derivation: "rechanyuan", + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + return lib.inpile.includes(name) && player.countCards("h") > 0 && !player.hasSkill("reguhuo_phase"); + }, + filter: function (event, player) { + if (!player.countCards("hs") || player.hasSkill("reguhuo_phase")) 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; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard(get.autoViewAs({ name: i, nature: j }, "unsure"), player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function () { + var list = []; + for (var i of lib.inpile) { + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } + } + return ui.create.dialog("蛊惑", [list, "vcard"]); + }, + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard(get.autoViewAs({ name: button.link[2], nature: button.link[3] }, "unsure"), player, evt); + }, + check: function (button) { + var player = _status.event.player; + var rand = _status.event.getParent().getRand("reguhuo"); + var hasEnemy = game.hasPlayer(function (current) { + return current != player && !current.hasSkill("rechanyuan") && (get.realAttitude || get.attitude)(current, player) < 0; + }); + var card = { name: button.link[2], nature: button.link[3] }; + var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + if (val <= 0) return 0; + if (hasEnemy && rand > 0.3) { + if ( + !player.countCards("h", function (cardx) { + if (card.name == cardx.name) { + if (card.name != "sha") return true; + return get.is.sameNature(card, cardx); + } + return false; + }) + ) + return 0; + return 3 * val; + } + return val; + }, + backup: function (links, player) { + return { + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + }, + filterCard: function (card, player, target) { + var result = true; + var suit = card.suit, + number = card.number; + card.suit = "none"; + card.number = null; + var mod = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod != "unchanged") result = mod; + card.suit = suit; + card.number = number; + return result; + }, + position: "hs", + ignoreMod: true, + ai1: function (card) { + var player = _status.event.player; + var hasEnemy = game.hasPlayer(function (current) { + return current != player && !current.hasSkill("rechanyuan") && (get.realAttitude || get.attitude)(current, player) < 0; + }); + var rand = _status.event.getRand("reguhuo"); + var cardx = lib.skill.reguhuo_backup.viewAs; + if (hasEnemy && rand > 0.3) { + if (card.name == cardx.name && (card.name != "sha" || get.is.sameNature(card, cardx))) return 10; + return 0; + } + return 6 - get.value(card); + }, + precontent: function () { + player.logSkill("reguhuo"); + player.addTempSkill("reguhuo_guess"); + var card = event.result.cards[0]; + event.result.card.suit = get.suit(card); + event.result.card.number = get.number(card); + }, + }; + }, + prompt: function (links) { + return "将一张手牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + fireAttack: true, + respondShan: true, + respondSha: true, + skillTagFilter: function (player) { + if (!player.countCards("hs") || player.hasSkill("reguhuo_phase")) return false; + }, + order: 10, + result: { + player: 1, + }, + threaten: 1.3, + }, + }, + reguhuo_guess: { + trigger: { + player: ["useCardBefore", "respondBefore"], + }, + forced: true, + silent: true, + popup: false, + charlotte: true, + firstDo: true, + filter: function (event, player) { + return event.skill && event.skill.indexOf("reguhuo_") == 0; + }, + content: function () { + "step 0"; + player.addTempSkill("reguhuo_phase"); + event.fake = false; + var card = trigger.cards[0]; + if (card.name != trigger.card.name || (card.name == "sha" && !get.is.sameNature(trigger.card, card))) event.fake = true; + //player.logSkill('reguhuo'); + player.line(trigger.targets, get.nature(trigger.card)); + event.cardTranslate = get.translation(trigger.card.name); + trigger.card.number = get.number(card); + trigger.card.suit = get.suit(card); + //trigger.line=false; + trigger.skill = "reguhuo_backup"; + if (trigger.card.name == "sha" && get.natureList(trigger.card).length) event.cardTranslate = get.translation(trigger.card.nature) + event.cardTranslate; + player.popup(event.cardTranslate, trigger.name == "useCard" ? "metal" : "wood"); + event.prompt = "是否质疑" + get.translation(player) + "声明的" + event.cardTranslate + "?"; + game.log(player, "声明了", "#y" + event.cardTranslate); + event.targets = game + .filterPlayer(function (current) { + return current != player && !current.hasSkill("rechanyuan"); + }) + .sortBySeat(); + event.targets2 = event.targets.slice(0); + player.lose(card, ui.ordering).relatedEvent = trigger; + if (!event.targets.length) event.goto(5); + else if (_status.connectMode) event.goto(3); + event.betrays = []; + "step 1"; + event.target = targets.shift(); + event.target.chooseButton([event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true, function (button) { + var player = _status.event.player; + var evt = _status.event.getParent("reguhuo_guess"); + if (!evt) return Math.random(); + var ally = button.link[2] == "reguhuo_ally"; + if (ally && (player.hp <= 1 || get.attitude(player, evt.player) >= 0)) return 1.1; + return Math.random(); + }); + "step 2"; + if (result.links[0][2] == "reguhuo_betray") { + event.betrays.push(target); + target.addExpose(0.2); + } + event.goto(targets.length ? 1 : 5); + "step 3"; + var list = event.targets.map(function (target) { + return [target, [event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true]; + }); + player + .chooseButtonOL(list) + .set("switchToAuto", function () { + _status.event.result = "ai"; + }) + .set("processAI", function () { + var choice = Math.random() > 0.5 ? "reguhuo_ally" : "reguhuo_betray"; + var player = _status.event.player; + var evt = _status.event.getParent("reguhuo_guess"); + if (player.hp <= 1 || (evt && (get.realAttitude || get.attitude)(player, evt.player) >= 0)) choice = "reguhuo_ally"; + return { + bool: true, + links: [["", "", choice]], + }; + }); + "step 4"; + for (var i in result) { + if (result[i].links[0][2] == "reguhuo_betray") { + event.betrays.push(lib.playerOL[i]); + lib.playerOL[i].addExpose(0.2); + } + } + "step 5"; + for (var i of event.targets2) { + var b = event.betrays.includes(i); + i.popup(b ? "质疑" : "不质疑", b ? "fire" : "wood"); + game.log(i, b ? "#y质疑" : "#g不质疑"); + } + game.delay(); + "step 6"; + player.showCards(trigger.cards); + if (event.betrays.length) { + event.betrays.sortBySeat(); + if (event.fake) { + game.asyncDraw(event.betrays); + trigger.cancel(); + trigger.getParent().goto(0); + game.log(player, "声明的", "#y" + event.cardTranslate, "作废了"); + } else { + var next = game.createEvent("reguhuo_final", false); + event.next.remove(next); + trigger.after.push(next); + next.targets = event.betrays; + next.setContent(lib.skill.reguhuo_guess.contentx); + event.finish(); + } + } else event.finish(); + "step 7"; + game.delayx(); + }, + contentx: function () { + "step 0"; + event.target = targets.shift(); + event.target.chooseToDiscard("弃置一张牌或失去1点体力").set("ai", function (card) { + return 9 - get.value(card); + }); + "step 1"; + if (!result.bool) target.loseHp(); + "step 2"; + target.addSkills("rechanyuan"); + if (targets.length) event.goto(0); + }, + }, + reguhuo_backup: {}, + reguhuo_phase: {}, + rechanyuan: { + init: function (player, skill) { + if (player.hp <= 1) { + player.logSkill(skill); + player.addSkill("rechanyuan_log"); + } + player.addSkillBlocker(skill); + }, + onremove: function (player, skill) { + player.removeSkill("rechanyuan_log"); + player.removeSkillBlocker(skill); + }, + skillBlocker: function (skill, player) { + return skill != "chanyuan" && skill != "rechanyuan" && !lib.skill[skill].charlotte && player.hp <= 1; + }, + mark: true, + intro: { + content: function (storage, player, skill) { + var str = "
  • 锁定技,你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值不大于1时,你的其他技能失效。"; + var list = player.getSkills(null, false, false).filter(function (i) { + return lib.skill.rechanyuan.skillBlocker(i, player); + }); + if (list.length) str += "
  • 失效技能:" + get.translation(list); + return str; + }, + }, + audio: 2, + trigger: { player: "changeHp" }, + filter: function (event, player) { + return player.hp <= 1 != player.hasSkill("rechanyuan_log"); + }, + direct: true, + locked: true, + content: function () { + if (player.hp <= 1) { + player.logSkill("rechanyuan"); + player.addSkill("rechanyuan_log"); + } else player.removeSkill("rechanyuan_log"); + }, + subSkill: { + log: { charlotte: true }, + }, + }, + botu: { + audio: 2, + trigger: { player: "phaseAfter" }, + frequent: true, + filter: function (event, player) { + var history = player.getHistory("useCard", function (evt) { + return evt.isPhaseUsing(); + }); + var suits = []; + for (var i = 0; i < history.length; i++) { + var suit = get.suit(history[i].card); + if (suit) suits.add(suit); + } + return suits.length == 4; + }, + content: function () { + player.insertPhase(); + }, + }, + xinleiji: { + group: "xinleiji_misa", + audio: 2, + derivation: "xinleiji_faq", + audioname: ["boss_qinglong"], + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + return event.card.name == "shan" || (event.name == "useCard" && event.card.name == "shandian"); + }, + judgeCheck: function (card, bool) { + var suit = get.suit(card); + if (suit == "spade") { + if (bool && get.number(card) > 1 && get.number(card) < 10) return 5; + return 4; + } + if (suit == "club") return 2; + return 0; + }, + content: function () { + player.judge(lib.skill.xinleiji.judgeCheck).judge2 = function (result) { + return result.bool ? true : false; + }; + }, + ai: { + useShan: true, + effect: { + target: function (card, player, target, current) { + let name; + if (typeof card == "object") { + if (card.viewAs) name = card.viewAs; + else name = get.name(card); + } + if ( + name == "shandian" || + (get.tag(card, "respondShan") && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + )) + ) { + let club = 0, + spade = 0; + if ( + game.hasPlayer(function (current) { + return get.attitude(target, current) < 0 && get.damageEffect(current, target, target, "thunder") > 0; + }) + ) { + club = 2; + spade = 4; + } + if (!target.isHealthy()) club += 2; + if (!club && !spade) return 1; + if (name === "sha") { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return; + } else if (!target.mayHaveShan(player)) return 1 - 0.1 * Math.min(5, target.countCards("hs")); + if (!target.hasSkillTag("rejudge")) return [1, (club + spade) / 4]; + let pos = player == target || player.hasSkillTag("viewHandcard", null, target, true) ? "hes" : "e", + better = club > spade ? "club" : "spade", + max = 0; + target.hasCard(function (cardx) { + if (get.suit(cardx) == better) { + max = 2; + return true; + } + if (spade && get.color(cardx) == "black") max = 1; + }, pos); + if (max == 2) return [1, Math.max(club, spade)]; + if (max == 1) return [1, Math.min(club, spade)]; + if (pos == "e") return [1, Math.min((Math.max(1, target.countCards("hs")) * (club + spade)) / 4, Math.max(club, spade))]; + return [1, (club + spade) / 4]; + } + if (name == "lebu" || name == "bingliang") return [target.hasSkillTag("rejudge") ? 0.4 : 1, 2, target.hasSkillTag("rejudge") ? 0.4 : 1, 0]; + }, + }, + }, + }, + xinleiji_misa: { + audio: "xinleiji", + trigger: { player: "judgeEnd" }, + direct: true, + disableReason: ["暴虐", "助祭", "弘仪", "孤影"], + filter: function (event, player) { + return !lib.skill.xinleiji_misa.disableReason.includes(event.judgestr) && ["spade", "club"].includes(event.result.suit); + }, + content: function () { + "step 0"; + event.num = 1 + ["club", "spade"].indexOf(trigger.result.suit); + event.logged = false; + if (event.num == 1 && player.isDamaged()) { + event.logged = true; + player.logSkill("xinleiji"); + player.recover(); + } + player.chooseTarget("雷击:是否对一名角色造成" + event.num + "点雷电伤害?").ai = function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "thunder"); + }; + "step 1"; + if (result.bool && result.targets && result.targets.length) { + if (!event.logged) player.logSkill("xinleiji", result.targets); + else player.line(result.targets, "thunder"); + result.targets[0].damage(event.num, "thunder"); + } + }, + }, + xinguidao: { + audio: 2, + mod: { + aiOrder: function (player, card, num) { + if (num > 0 && get.itemtype(card) == "card" && get.color(card) == "black" && get.type(card) == "equip") num * 1.35; + }, + aiValue: function (player, card, num) { + if (num > 0 && get.itemtype(card) == "card" && get.color(card) == "black") return num * 1.15; + }, + aiUseful: function (player, card, num) { + if (num > 0 && get.itemtype(card) == "card" && get.color(card) == "black") return num * 1.35; + }, + }, + locked: false, + trigger: { global: "judge" }, + filter: function (event, player) { + return player.countCards("hes", { color: "black" }) > 0; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("xinguidao"), "hes", function (card) { + if (get.color(card) != "black") return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) { + if (trigger.player != player) return 0; + if ( + game.hasPlayer(function (current) { + return get.attitude(player, current) < 0; + }) + ) { + var checkx = lib.skill.xinleiji.judgeCheck(card, true) - lib.skill.xinleiji.judgeCheck(judging); + if (checkx > 0) return checkx; + } + return 0; + } + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.bool) { + player.respond(result.cards, "highlight", "xinguidao", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.$gain2(trigger.player.judging[0]); + player.gain(trigger.player.judging[0]); + var card = result.cards[0]; + if (get.suit(card) == "spade" && get.number(card) > 1 && get.number(card) < 10) player.draw("nodelay"); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + } + "step 3"; + game.delay(2); + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + reqingguo: { + mod: { + aiValue: function (player, card, num) { + if (get.name(card) != "shan" && get.color(card) != "black") return; + var cards = player.getCards("hs", function (card) { + return get.name(card) == "shan" || get.color(card) == "black"; + }); + cards.sort(function (a, b) { + return (get.name(b) == "shan" ? 1 : 2) - (get.name(a) == "shan" ? 1 : 2); + }); + var geti = function () { + if (cards.includes(card)) { + return cards.indexOf(card); + } + return cards.length; + }; + if (get.name(card) == "shan") return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6.5, 4, 3][Math.min(geti(), 2)]); + }, + aiUseful: function () { + return lib.skill.reqingguo.mod.aiValue.apply(this, arguments); + }, + }, + locked: false, + audio: 2, + enable: ["chooseToRespond", "chooseToUse"], + filterCard: function (card) { + return get.color(card) == "black"; + }, + position: "hes", + viewAs: { name: "shan" }, + viewAsFilter: function (player) { + if (!player.countCards("hes", { color: "black" })) return false; + }, + prompt: "将一张黑色牌当闪打出", + check: function () { + return 1; + }, + ai: { + order: 2, + respondShan: true, + skillTagFilter: function (player) { + if (!player.countCards("hes", { color: "black" })) return false; + }, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.6; + }, + }, + }, + }, + reqiangxi: { + subSkill: { + off: { + sub: true, + }, + }, + audio: 2, + enable: "phaseUse", + filterCard: function (card) { + return get.subtype(card) == "equip1"; + }, + selectCard: function () { + return [0, 1]; + }, + filterTarget: function (card, player, target) { + if (player == target) return false; + if (target.hasSkill("reqiangxi_off")) return false; + return player.inRange(target); + }, + content: function () { + "step 0"; + if (cards.length == 0) { + player.loseHp(); + } + "step 1"; + target.addTempSkill("reqiangxi_off"); + target.damage("nocard"); + }, + check: function (card) { + return 10 - get.value(card); + }, + position: "he", + ai: { + order: 8.5, + result: { + target: function (player, target) { + if (!ui.selected.cards.length) { + if (player.hp < 2) return 0; + if (target.hp >= player.hp) return 0; + } + return get.damageEffect(target, player); + }, + }, + }, + threaten: 1.5, + }, + rehuoji: { + position: "hes", + audio: 2, + audioname: ["ol_sp_zhugeliang", "ol_pangtong"], + enable: "chooseToUse", + filterCard: function (card) { + return get.color(card) == "red"; + }, + viewAs: { + name: "huogong", + }, + viewAsFilter: function (player) { + if (!player.countCards("hes", { color: "red" })) return false; + }, + prompt: "将一张红色牌当火攻使用", + check: function (card) { + var player = get.player(); + if (player.countCards("h") > player.hp) { + return 6 - get.value(card); + } + return 4 - get.value(card); + }, + ai: { + fireAttack: true, + }, + }, + rekanpo: { + mod: { + aiValue: function (player, card, num) { + if (get.name(card) != "wuxie" && get.color(card) != "black") return; + var cards = player.getCards("hs", function (card) { + return get.name(card) == "wuxie" || get.color(card) == "black"; + }); + cards.sort(function (a, b) { + return (get.name(b) == "wuxie" ? 1 : 2) - (get.name(a) == "wuxie" ? 1 : 2); + }); + var geti = function () { + if (cards.includes(card)) { + return cards.indexOf(card); + } + return cards.length; + }; + if (get.name(card) == "wuxie") return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6, 4, 3][Math.min(geti(), 2)]); + }, + aiUseful: function () { + return lib.skill.rekanpo.mod.aiValue.apply(this, arguments); + }, + }, + locked: false, + audio: 2, + audioname: ["ol_sp_zhugeliang", "ol_pangtong"], + position: "hes", + enable: "chooseToUse", + filterCard: function (card) { + return get.color(card) == "black"; + }, + viewAsFilter: function (player) { + return player.countCards("hes", { color: "black" }) > 0; + }, + viewAs: { + name: "wuxie", + }, + prompt: "将一张黑色牌当无懈可击使用", + check: function (card) { + return 8 - get.value(card); + }, + }, + reshuangxiong: { + audio: "shuangxiong", + audioname: ["re_yanwen"], + group: ["reshuangxiong1", "reshuangxiong2"], + }, + reshuangxiong1: { + audio: "shuangxiong1", + audioname2: { + re_yanwen: "shuangxiong_re_yanwen1", + }, + trigger: { player: "phaseDrawBegin1" }, + check: function (event, player) { + if (player.countCards("h") > player.hp) return true; + if (player.countCards("h") > 3) return true; + return false; + }, + filter: function (event, player) { + return !event.numFixed; + }, + prompt2: function () { + return "放弃摸牌,然后亮出牌堆顶的两张牌并选择获得其中的一张。本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用"; + }, + content: function () { + "step 0"; + trigger.changeToZero(); + event.cards = get.cards(2); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str; + if (player == game.me && !_status.auto) { + str = "【双雄】选择获得其中一张牌"; + } else { + 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 next = player.chooseButton([1, 1], true); + next.set("dialog", event.videoId); + next.set("ai", function (button) { + var player = _status.event.player; + var color = get.color(button.link); + var value = get.value(button.link, player); + if (player.countCards("h", { color: color }) > player.countCards("h", ["red", "black"].remove(color)[0])) value += 5; + return value; + }); + "step 2"; + if (result.bool && result.links) { + var cards2 = []; + for (var i = 0; i < result.links.length; i++) { + cards2.push(result.links[i]); + cards.remove(result.links[i]); + } + game.cardsDiscard(cards); + event.card2 = cards2[0]; + } + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); + } + "step 3"; + game.broadcastAll("closeDialog", event.videoId); + var card2 = event.card2; + player.gain(card2, "gain2"); + player.addTempSkill("shuangxiong2"); + player.markAuto("shuangxiong2", [get.color(card2, false)]); + }, + }, + reshuangxiong2: { + trigger: { + player: "damageEnd", + }, + direct: true, + filter: function (event, player) { + var evt = event.getParent(); + return (evt && evt.name == "juedou" && evt[player == evt.player ? "targetCards" : "playerCards"].length) > 0; + }, + content: function () { + "step 0"; + var evt = trigger.getParent(); + var cards = evt[player == evt.player ? "targetCards" : "playerCards"].slice(0); + for (var i = 0; i < cards.length; i++) { + if (get.position(cards[i]) != "d") cards.remove(cards[i--]); + } + if (!cards.length) event.finish(); + else { + event.cards = cards; + player.chooseBool("是否发动【双雄】,获得" + get.translation(event.cards) + "?").ai = function () { + return true; + }; + } + "step 1"; + if (result.bool) { + player.logSkill("reshuangxiong"); + player.gain(cards, "gain2"); + } + }, + }, + new_yajiao: { + audio: "reyajiao", + trigger: { + player: "loseEnd", + }, + frequent: true, + filter: function (event, player) { + return player != _status.currentPhase && event.hs && event.hs.length > 0 && ["useCard", "respond"].includes(event.getParent().name); + }, + content: function () { + "step 0"; + event.card = get.cards(); + player.showCards(event.card); + event.same = false; + if (get.type(event.card[0], "trick") == get.type(trigger.getParent().card, "trick")) event.same = true; + player + .chooseTarget("选择获得此牌的角色", true) + .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 (!_status.event.same) att += target == _status.event.player ? 1 : 0; + if (att > 0) { + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }) + .set("du", event.card.name == "du") + .set("same", event.same); + "step 1"; + if (result.targets) { + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "gain2"); + if (!event.same) player.chooseToDiscard(true, "he"); + } + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "respond") && target.countCards("h") > 1) return [1, 0.2]; + }, + }, + }, + }, + new_liyu: { + audio: "liyu", + trigger: { + source: "damageSource", + }, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.player != player && event.player.isIn() && event.player.countGainableCards(player, "hej") > 0; + }, + direct: true, + content: function () { + "step 0"; + player + .gainPlayerCard(get.prompt("new_liyu", trigger.player), trigger.player, "hej", "visibleMove") + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.target; + if (get.attitude(player, target) > 0 && get.position(button.link) === "j") return 4 + get.value(button.link); + if (get.type(button.link) === "equip") return _status.event.juedou; + return 3; + }) + .set( + "juedou", + (() => { + if ( + get.attitude(player, trigger.player) > 0 && + game.hasPlayer(function (current) { + return player.canUse({ name: "juedou" }, current) && current != trigger.player && current != player && get.effect(current, { name: "juedou" }, player, _status.event.player) > 2; + }) + ) + return 5; + if ( + game.hasPlayer(function (current) { + return player.canUse({ name: "juedou" }, current) && current != trigger.player && current != player && get.effect(current, { name: "juedou" }, player, _status.event.player) < 0; + }) + ) + return 1; + return 4; + })() + ) + .set("logSkill", ["new_liyu", trigger.player]); + "step 1"; + if (result.bool) { + if (get.type(result.cards[0]) != "equip") { + trigger.player.draw(); + event.finish(); + } else { + if ( + !game.hasPlayer(function (current) { + return current != player && current != trigger.player && player.canUse("juedou", current); + }) + ) { + event.finish(); + return; + } + trigger.player + .chooseTarget( + true, + function (card, player, target) { + var evt = _status.event.getParent(); + return evt.player.canUse({ name: "juedou" }, target) && target != _status.event.player; + }, + "请选择一名角色,视为" + get.translation(player) + "对其使用【决斗】" + ) + .set("ai", function (target) { + var evt = _status.event.getParent(); + return get.effect(target, { name: "juedou" }, evt.player, _status.event.player) - 2; + }); + } + } else event.finish(); + "step 2"; + if (result.targets) { + player.useCard({ name: "juedou", isCard: true }, result.targets[0], "noai"); + } + }, + ai: { + halfneg: true, + }, + }, + new_retuxi: { + audio: "retuxi", + trigger: { + player: "phaseDrawBegin2", + }, + direct: true, + preHidden: true, + filter: function (event, player) { + return ( + event.num > 0 && + !event.numFixed && + game.hasPlayer(function (target) { + return target.countCards("h") > 0 && player != target; + }) + ); + }, + content: function () { + "step 0"; + var num = get.copy(trigger.num); + if (get.mode() == "guozhan" && num > 2) num = 2; + player + .chooseTarget( + get.prompt("new_retuxi"), + "获得至多" + get.translation(num) + "名角色的各一张手牌,然后少摸等量的牌", + [1, num], + function (card, player, target) { + return target.countCards("h") > 0 && player != target; + }, + function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + } + ) + .setHiddenSkill("new_retuxi"); + "step 1"; + if (result.bool) { + result.targets.sortBySeat(); + player.logSkill("new_retuxi", result.targets); + player.gainMultiple(result.targets); + trigger.num -= result.targets.length; + } else { + event.finish(); + } + "step 2"; + if (trigger.num <= 0) game.delay(); + }, + ai: { + threaten: 1.6, + expose: 0.2, + }, + }, + new_reyiji: { + audio: "reyiji", + trigger: { + player: "damageEnd", + }, + frequent: true, + filter: function (event) { + return event.num > 0; + }, + getIndex(event, player, triggername) { + return event.num; + }, + content: function () { + "step 0"; + player.draw(2); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + event.num = 2; + "step 1"; + player.chooseCardTarget({ + filterCard: function (card) { + return get.itemtype(card) == "card" && !card.hasGaintag("reyiji_tag"); + }, + filterTarget: lib.filter.notMe, + selectCard: [1, event.num], + prompt: "请选择要分配的卡牌和目标", + ai1: function (card) { + if (!ui.selected.cards.length) return 1; + return 0; + }, + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + var val = target.getUseValue(card); + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); + }, + }); + "step 2"; + if (result.bool) { + var res = result.cards, + target = result.targets[0].playerid; + player.addGaintag(res, "reyiji_tag"); + event.num -= res.length; + if (!event.given_map[target]) event.given_map[target] = []; + event.given_map[target].addArray(res); + if (event.num > 0) event.goto(1); + } else if (event.num == 2) { + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + event.finish(); + } + "step 3"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var map = [], + cards = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.18); + map.push([source, event.given_map[i]]); + cards.addArray(event.given_map[i]); + } + game.loseAsync({ + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + }, + ai: { + maixie: true, + maixie_hp: true, + result: { + effect: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; + } + if (player.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; + } + }, + }, + threaten: 0.6, + }, + }, + new_rejianxiong: { + audio: "rejianxiong", + audioname: ["shen_caopi"], + trigger: { + player: "damageEnd", + }, + content: function () { + "step 0"; + if (get.itemtype(trigger.cards) == "cards" && get.position(trigger.cards[0], true) == "o") { + player.gain(trigger.cards, "gain2"); + } + player.draw("nodelay"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target) { + var cards = card.cards, + evt = _status.event; + if (evt.player == target && card.name == "damage" && evt.getParent().type == "card") cards = evt.getParent().cards.filterInD(); + if (target.hp <= 1) return; + if (get.itemtype(cards) != "cards") return; + for (var i of cards) { + if (get.name(i, target) == "tao") return [1, 5]; + } + if (get.value(cards, target) >= 7 + target.getDamagedHp()) return [1, 3]; + return [1, 0.6]; + } + }, + }, + }, + }, + new_reluoyi: { + audio: "reluoyi", + trigger: { + player: "phaseDrawBegin1", + }, + forced: true, + locked: false, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + "step 0"; + var cards = get.cards(3); + game.cardsGotoOrdering(cards); + player.showCards(cards, "裸衣"); + var cardsx = []; + for (var i = 0; i < cards.length; i++) { + if (get.type(cards[i]) == "basic" || cards[i].name == "juedou" || (get.type(cards[i]) == "equip" && get.subtype(cards[i]) == "equip1")) { + cardsx.push(cards[i]); + } + } + event.cards = cardsx; + player.chooseBool("是否放弃摸牌" + (cardsx.length ? ",改为获得" + get.translation(cardsx) : "") + "?").ai = function () { + var num = 3; + return cardsx.length >= trigger.num; + }; + "step 1"; + if (result.bool) { + if (cards.length) player.gain(cards, "gain2"); + //game.cardsDiscard(cards2); + player.addTempSkill("reluoyi2", { player: "phaseBefore" }); + trigger.changeToZero(); + } + //else game.cardsDiscard(cards); + }, + }, + new_rewusheng: { + mod: { + targetInRange: function (card) { + if (get.suit(card) == "diamond" && card.name == "sha") return true; + }, + }, + locked: false, + audio: "wusheng", + audioname: ["re_guanyu", "guanzhang", "jsp_guanyu", "guansuo", "re_guanzhang", "dc_jsp_guanyu"], + audioname2: { + dc_guansuo: "wusheng_guansuo", + }, + enable: ["chooseToRespond", "chooseToUse"], + filterCard: function (card, player) { + if (get.zhu(player, "shouyue")) return true; + return get.color(card) == "red"; + }, + position: "hes", + viewAs: { + name: "sha", + }, + viewAsFilter: function (player) { + if (get.zhu(player, "shouyue")) { + if (!player.countCards("hes")) return false; + } else { + if (!player.countCards("hes", { color: "red" })) return false; + } + }, + prompt: "将一张红色牌当杀使用或打出", + check: function (card) { + var val = get.value(card); + if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); + return 5 - val; + }, + ai: { + respondSha: true, + skillTagFilter: function (player) { + if (get.zhu(player, "shouyue")) { + if (!player.countCards("hes")) return false; + } else { + if (!player.countCards("hes", { color: "red" })) return false; + } + }, + }, + }, + wusheng_guansuo: { audio: 2 }, + new_yijue: { + audio: "yijue", + enable: "phaseUse", + usable: 1, + position: "he", + filterTarget: function (card, player, target) { + return player != target && target.countCards("h"); + }, + filterCard: true, + check: function (card) { + return 8 - get.value(card); + }, + content: function () { + "step 0"; + if (!target.countCards("h")) { + event.finish(); + return; + } else + target.chooseCard(true, "h").set("ai", function (card) { + var player = _status.event.player; + if ((player.hasShan() || player.hp < 3) && get.color(card) == "black") return 0.5; + return Math.max(1, 20 - get.value(card)); + }); + "step 1"; + target.showCards(result.cards); + event.card2 = result.cards[0]; + if (get.color(event.card2) == "black") { + if (!target.hasSkill("fengyin")) { + target.addTempSkill("fengyin"); + } + target.addTempSkill("new_yijue2"); + event.finish(); + } else if (get.color(event.card2) == "red") { + player.gain(event.card2, target, "give", "bySelf"); + if (target.hp < target.maxHp) { + player.chooseBool("是否让目标回复1点体力?").ai = function (event, player) { + return get.recoverEffect(target, player, player) > 0; + }; + } + } + "step 2"; + if (result.bool) { + target.recover(); + } + }, + ai: { + result: { + target: function (player, target) { + var hs = player.getCards("h"); + if (hs.length < 3) return 0; + if (target.countCards("h") > target.hp + 1 && get.recoverEffect(target) > 0) { + return 1; + } + if (player.canUse("sha", target) && (player.countCards("h", "sha") || player.countCards("he", { color: "red" }))) { + return -2; + } + return -0.5; + }, + }, + order: 9, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg.target.hasSkillTag("new_yijue2")) return false; + }, + }, + }, + new_yijue2: { + trigger: { + player: "damageBegin1", + }, + filter: function (event) { + return event.source && event.source == _status.currentPhase && event.card && event.card.name == "sha" && get.suit(event.card) == "heart" && event.notLink(); + }, + popup: false, + forced: true, + charlotte: true, + content: function () { + trigger.num++; + }, + mark: true, + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; + }, + }, + intro: { + content: "不能使用或打出手牌", + }, + }, + paoxiao_re_zhangfei: { audio: 2 }, + new_repaoxiao: { + audio: "paoxiao", + firstDo: true, + audioname2: { + old_guanzhang: "old_fuhun", + xin_zhangfei: "paoxiao_re_zhangfei", + dc_xiahouba: "paoxiao_xiahouba", + }, + audioname: ["re_zhangfei", "guanzhang", "xiahouba", "re_guanzhang"], + trigger: { player: "useCard1" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && (!event.audioed || !player.hasSkill("new_repaoxiao2")); + }, + content: function () { + trigger.audioed = true; + player.addTempSkill("new_repaoxiao2"); + }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return Infinity; + }, + }, + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (!get.zhu(player, "shouyue")) return false; + if (arg && arg.name == "sha") return true; + return false; + }, + }, + }, + new_repaoxiao2: { + charlotte: true, + mod: { + targetInRange: function (card, player) { + if (card.name == "sha") return true; + }, + }, + }, + new_tishen: { + trigger: { + player: "phaseUseEnd", + }, + check: function (event, player) { + var num = 0; + var he = player.getCards("he"); + for (var i = 0; i < he.length; i++) { + if (get.type(he[i], "trick") == "trick") { + num++; + } + if (get.type(he[i]) == "equip") { + var subtype = get.subtype(he[i]); + if (subtype == "equip3" || subtype == "equip4" || subtype == "equip6") { + num++; + } + } + } + return num == 0 || num <= player.countCards("h") - player.getHandcardLimit(); + }, + content: function () { + var list = []; + var he = player.getCards("he"); + for (var i = 0; i < he.length; i++) { + if (get.type(he[i], "trick") == "trick") { + list.push(he[i]); + } + if (get.type(he[i]) == "equip") { + var subtype = get.subtype(he[i]); + if (subtype == "equip3" || subtype == "equip4" || subtype == "equip6") { + list.push(he[i]); + } + } + } + if (list.length) player.discard(list); + player.addTempSkill("new_tishen2", { player: "phaseBefore" }); + }, + audio: "retishen", + }, + new_tishen2: { + audio: "retishen", + trigger: { + global: "useCardAfter", + }, + filter: function (event, player) { + return event.card.name == "sha" && event.targets && event.targets.includes(player) && !player.hasHistory("damage", evt => evt.card == event.card) && event.cards.filterInD("od").length; + }, + forced: true, + charlotte: true, + content: function () { + player.gain(trigger.cards.filterInD("od"), "gain2"); + }, + }, + new_qingjian: { + audio: "qingjian", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + direct: true, + usable: 1, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.player == player) return false; + return event.getg(player).length > 0; + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + position: "he", + filterCard: true, + selectCard: [1, Infinity], + filterTarget: function (card, player, target) { + return player != target; + }, + ai1: function (card) { + if (card.name != "du" && get.attitude(_status.event.player, _status.currentPhase) < 0 && _status.currentPhase.needsToDiscard()) return -1; + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.type(ui.selected.cards[i]) == get.type(card) || (ui.selected.cards[i].name == "du" && card.name != "du")) return -1; + } + if (card.name == "du") return 20; + return _status.event.player.countCards("h") - _status.event.player.hp; + }, + ai2: function (target) { + if (get.attitude(_status.event.player, _status.currentPhase) < 0) return -1; + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; + return 1 - att; + } + if (target.countCards("h") > _status.event.player.countCards("h")) return 0; + return att - 4; + }, + prompt: get.prompt2("new_qingjian"), + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + var cards = result.cards; + var type = []; + for (var i = 0; i < cards.length; i++) { + type.add(get.type2(cards[i])); + } + player.logSkill("new_qingjian", target); + player.give(cards, target); + var current = _status.currentPhase; + if (current) { + current.addTempSkill("qingjian_add"); + current.addMark("qingjian_add", type.length); + } + } else player.storage.counttrigger.new_qingjian--; + }, + ai: { + expose: 0.3, + }, + }, + qingjian_add: { + mark: true, + intro: { + content: "手牌上限+#", + }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("qingjian_add"); + }, + }, + onremove: true, + }, + new_reqingnang: { + subSkill: { + off: { + sub: true, + }, + off2: { + sub: true, + }, + }, + audio: 2, + enable: "phaseUse", + filterCard: true, + check: function (card) { + var player = _status.event.player; + if ( + game.countPlayer(function (current) { + return get.recoverEffect(current, player, player) > 0 && get.attitude(player, current) > 2; + }) > 1 && + get.color(card) == "black" && + player.countCards("h", { color: "red" }) > 0 + ) + return 3 - get.value(card); + return 9 - get.value(card); + }, + filter: function (event, player) { + return !player.hasSkill("new_reqingnang_off2"); + }, + filterTarget: function (card, player, target) { + if (target.hp >= target.maxHp || target.hasSkill("new_reqingnang_off")) return false; + return true; + }, + content: function () { + target.addTempSkill("new_reqingnang_off"); + if (get.color(cards[0]) == "black") player.addTempSkill("new_reqingnang_off2"); + target.recover(); + }, + ai: { + order: 9, + result: { + target: function (player, target) { + if (target.hp == 1) return 5; + if (player == target && player.countCards("h") > player.hp) return 5; + return 2; + }, + }, + threaten: 2, + }, + }, + reyaowu: { + trigger: { player: "damageBegin3" }, + audio: "new_reyaowu", + forced: true, + filter: function (event) { + return event.card && (get.color(event.card) != "red" || (event.source && event.source.isIn())); + }, + content: function () { + trigger[get.color(trigger.card) != "red" ? "player" : "source"].draw(); + }, + ai: { + effect: { + target: (card, player, target) => { + if (typeof card !== "object" || !get.tag(card, "damage") || target.hasSkill("gangzhi")) return; + if (player.hasSkillTag("jueqing", null, true)) return; + if (get.color(card) === "red") return [1, 0, 1, 0.6]; + return [1, 0.6]; + }, + }, + }, + }, + new_reyaowu: { + trigger: { + player: "damageBegin3", + }, + //priority:1, + audio: 2, + audioname: ["sb_huaxiong"], + filter: function (event) { + return event.card && event.card.name == "sha" && (get.color(event.card) != "red" || (event.source && event.source.isIn())); + }, + forced: true, + content: function () { + if (get.color(trigger.card) != "red") player.draw(); + else trigger.source.chooseDrawRecover(true); + }, + ai: { + effect: { + target: (card, player, target, current) => { + if (card.name == "sha") { + if (get.color(card) == "red") { + let num = player.isDamaged() ? 1.6 : 0.7; + if (get.attitude(player, target) > 0 && player.hp < 3) return [1, 0, 1, num]; + return [1, 0, 1, num / 2]; + } + return [1, 0.6]; + } + }, + }, + }, + }, + reguanxing: { + audio: "guanxing", + audioname: ["jiangwei", "re_jiangwei", "re_zhugeliang", "gexuan", "ol_jiangwei"], + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + frequent: true, + filter: function (event, player, name) { + if (name == "phaseJieshuBegin") { + return player.hasSkill("reguanxing_on"); + } + return true; + }, + content: function () { + "step 0"; + var num = game.countPlayer() < 4 ? 3 : 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 target = _status.event.getTrigger().name == "phaseZhunbei" ? player : player.next; + var att = get.sgn(get.attitude(player, target)); + var top = []; + var judges = target.getCards("j"); + var stopped = false; + if (player != target || !target.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)) * att; + }); + if (judge(cards[0]) * att < 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)) * att; + }); + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) break; + top.unshift(cards.shift()); + } + } + bottom = cards; + return [top, bottom]; + }; + "step 1"; + var top = result.moved[0]; + var bottom = result.moved[1]; + top.reverse(); + game.cardsGotoPile(top.concat(bottom), ["top_cards", top], function (event, card) { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + if (event.triggername == "phaseZhunbeiBegin" && top.length == 0) { + player.addTempSkill("reguanxing_on"); + } + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); + "step 2"; + game.delayx(); + }, + subSkill: { + on: { charlotte: true }, + }, + }, + reluoshen: { + audio: 2, + locked: false, + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + content: function () { + "step 0"; + player.addTempSkill("reluoshen_add"); + event.cards = []; + "step 1"; + var next = player.judge(function (card) { + if (get.color(card) == "black") return 1.5; + return -1.5; + }); + next.judge2 = function (result) { + return result.bool; + }; + if (get.mode() != "guozhan" && !player.hasSkillTag("rejudge")) + next.set("callback", function () { + if (event.judgeResult.color == "black" && get.position(card, true) == "o") { + player.gain(card, "gain2").gaintag.add("reluoshen"); + } + }); + else + next.set("callback", function () { + if (event.judgeResult.color == "black") event.getParent().orderingCards.remove(card); + }); + "step 2"; + if (result.bool) { + event.cards.push(result.card); + player.chooseBool("是否再次发动【洛神】?").set("frequentSkill", "reluoshen"); + } 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").gaintag.add("reluoshen"); + } + event.finish(); + } + "step 3"; + if (result.bool) { + event.goto(1); + } 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").gaintag.add("reluoshen"); + } + } + }, + subSkill: { + add: { + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("reluoshen")) { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("reluoshen")) { + return false; + } + }, + }, + onremove: function (player) { + player.removeGaintag("reluoshen"); + }, + }, + }, + }, + rejieyin: { + audio: 2, + enable: "phaseUse", + filterCard: true, + usable: 1, + position: "he", + filter: function (event, player) { + return player.countCards("he") > 0; + }, + check: function (card) { + var player = _status.event.player; + if (get.position(card) == "e") { + var subtype = get.subtype(card); + if ( + !game.hasPlayer(function (current) { + return current != player && current.hp != player.hp && get.attitude(player, current) > 0 && !current.countCards("e", { subtype: subtype }); + }) + ) { + return 0; + } + if (player.countCards("h", { subtype: subtype })) return 20 - get.value(card); + return 10 - get.value(card); + } else { + if (player.countCards("e")) return 0; + if (player.countCards("h", { type: "equip" })) return 0; + return 8 - get.value(card); + } + }, + filterTarget: function (card, player, target) { + if (!target.hasSex("male")) return false; + var card = ui.selected.cards[0]; + if (!card) return false; + if (get.position(card) == "e" && !target.canEquip(card)) return false; + return true; + }, + discard: false, + delay: false, + lose: false, + content: function () { + "step 0"; + if (get.position(cards[0]) == "e") event._result = { index: 0 }; + else if (get.type(cards[0]) != "equip" || !target.canEquip(cards[0])) event._result = { index: 1 }; + else + player.chooseControl().set("choiceList", ["将" + get.translation(cards[0]) + "置入" + get.translation(target) + "的装备区", "弃置" + get.translation(cards[0])]).ai = function () { + return 1; + }; + "step 1"; + if (result.index == 0) { + player.$give(cards, target, false); + target.equip(cards[0]); + } else { + player.discard(cards); + } + "step 2"; + if (player.hp > target.hp) { + player.draw(); + if (target.isDamaged()) target.recover(); + } else if (player.hp < target.hp) { + target.draw(); + if (player.isDamaged()) player.recover(); + } + }, + ai: { + order: function () { + var player = _status.event.player; + var es = player.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (player.countCards("h", { subtype: get.subtype(es[i]) })) return 10; + } + return 2; + }, + result: { + target: function (player, target) { + var goon = function () { + var es = player.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (player.countCards("h", { subtype: get.subtype(es[i]) })) return true; + } + return false; + }; + if (player.hp < target.hp) { + if (player.isHealthy()) { + if (!player.needsToDiscard(1) || goon()) return 0.1; + return 0; + } + return 1.5; + } + if (player.hp > target.hp) { + if (target.isHealthy()) { + if (!player.needsToDiscard(1) || goon()) return 0.1; + return 0; + } + return 1; + } + return 0; + }, + }, + }, + }, + rejiuyuan: { + audio: 2, + zhuSkill: true, + trigger: { global: "recoverBefore" }, + direct: true, + filter: function (event, player) { + return player != event.player && event.player.group == "wu" && player.hp <= event.player.hp && event.getParent().name != "rejiuyuan" && player.hasZhuSkill("rejiuyuan", event.player); + }, + content: function () { + "step 0"; + trigger.player.chooseBool("是否对" + get.translation(player) + "发动【救援】?", "改为令其回复1点体力,然后你摸一张牌").set("ai", function () { + var evt = _status.event; + return get.attitude(evt.player, evt.getParent().player) > 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("rejiuyuan"); + trigger.player.line(player, "green"); + trigger.cancel(); + player.recover(); + trigger.player.draw(); + } + }, + }, + rezhiheng: { + audio: 2, + audioname: ["shen_caopi"], + mod: { + aiOrder: function (player, card, num) { + if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip") return num; + let eq = player.getEquip(get.subtype(card)); + if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp)) return 0; + }, + }, + locked: false, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: lib.filter.cardDiscardable, + discard: false, + lose: false, + delay: false, + selectCard: [1, Infinity], + check: function (card) { + var player = _status.event.player; + if ( + get.position(card) == "h" && + !player.countCards("h", "du") && + (player.hp > 2 || + !player.countCards("h", function (card) { + return get.value(card) >= 8; + })) + ) { + return 1; + } + return 6 - get.value(card); + }, + content: function () { + "step 0"; + player.discard(cards); + event.num = 1; + var hs = player.getCards("h"); + if (!hs.length) event.num = 0; + for (var i = 0; i < hs.length; i++) { + if (!cards.includes(hs[i])) { + event.num = 0; + break; + } + } + "step 1"; + player.draw(event.num + cards.length); + }, + //group:'rezhiheng_draw', + subSkill: { + draw: { + trigger: { player: "loseEnd" }, + silent: true, + filter: function (event, player) { + if (event.getParent(2).skill != "rezhiheng" && event.getParent(2).skill != "jilue_zhiheng") return false; + if (player.countCards("h")) return false; + for (var i = 0; i < event.cards.length; i++) { + if (event.cards[i].original == "h") return true; + } + return false; + }, + content: function () { + player.addTempSkill("rezhiheng_delay", trigger.getParent(2).skill + "After"); + }, + }, + delay: {}, + }, + ai: { + order: function (item, player) { + if (player.hasCard(i => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; + return 10; + }, + result: { + player: 1, + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") return (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && !player.getStat().skill.rezhiheng && player.hasCard(card => get.name(card) !== "tao", "h"); + }, + threaten: 1.55, + }, + }, + reqicai: { + mod: { + targetInRange: function (card, player, target, now) { + var type = get.type(card); + if (type == "trick" || type == "delay") return true; + }, + canBeDiscarded: function (card) { + if (get.position(card) == "e" && ["equip2", "equip5"].includes(get.subtype(card))) return false; + }, + }, + }, + rejizhi: { + audio: 2, + audioname: ["lukang"], + locked: false, + trigger: { player: "useCard" }, + frequent: true, + filter: function (event) { + return get.type(event.card, "trick") == "trick" && event.card.isCard; + }, + init: function (player) { + player.storage.rejizhi = 0; + }, + content: function () { + "step 0"; + player.draw(); + "step 1"; + event.card = result[0]; + if (get.type(event.card) == "basic") { + player + .chooseBool("是否弃置" + get.translation(event.card) + "并令本回合手牌上限+1?") + .set("ai", function (evt, player) { + return _status.currentPhase == player && player.needsToDiscard(-3) && _status.event.value < 6; + }) + .set("value", get.value(event.card, player)); + } + "step 2"; + if (result.bool) { + player.discard(event.card); + player.storage.rejizhi++; + if (_status.currentPhase == player) { + player.markSkill("rejizhi"); + } + } + }, + ai: { + threaten: 1.4, + noautowuxie: true, + }, + mod: { + maxHandcard: function (player, num) { + return num + player.storage.rejizhi; + }, + }, + intro: { + content: "本回合手牌上限+#", + }, + group: "rejizhi_clear", + subSkill: { + clear: { + trigger: { global: "phaseAfter" }, + silent: true, + content: function () { + player.storage.rejizhi = 0; + player.unmarkSkill("rejizhi"); + }, + }, + }, + }, + rebiyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + var num = 1; + if (!player.countCards("h")) { + num = 2; + } + player.draw(num); + }, + }, + rerende: { + audio: 2, + audioname: ["gz_jun_liubei", "shen_caopi"], + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + discard: false, + lose: false, + delay: false, + filterTarget: function (card, player, target) { + if (player.storage.rerende2 && player.storage.rerende2.includes(target)) return false; + return player != target; + }, + onremove: ["rerende", "rerende2"], + 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.rerende < 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.rerende) { + var next = game.createEvent("rerende_clear"); + _status.event.next.remove(next); + evt.after.push(next); + evt.rerende = true; + next.player = player; + next.setContent(lib.skill.rerende1.content); + } + if (!Array.isArray(player.storage.rerende2)) { + player.storage.rerende2 = []; + } + player.storage.rerende2.push(target); + player.give(cards, target); + "step 1"; + if (typeof player.storage.rerende != "number") { + player.storage.rerende = 0; + } + if (player.storage.rerende >= 0) { + player.storage.rerende += cards.length; + if (player.storage.rerende >= 2) { + var list = []; + if ( + lib.filter.cardUsable({ name: "sha" }, 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 }, player, event.getParent("chooseToUse")) && + game.hasPlayer(function (current) { + return player.canUse({ name: "sha", nature: i }, current); + }) + ) { + list.push(["基本", "", "sha", i]); + } + } + if ( + lib.filter.cardUsable({ name: "tao" }, player, event.getParent("chooseToUse")) && + game.hasPlayer(function (current) { + return player.canUse("tao", current); + }) + ) { + list.push(["基本", "", "tao"]); + } + if ( + lib.filter.cardUsable({ name: "jiu" }, 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.rerende = -1; + } else { + event.finish(); + } + } else { + event.finish(); + } + "step 2"; + if (result && result.bool && result.links[0]) { + var card = { name: result.links[0][2], nature: result.links[0][3] }; + player.chooseUseTarget(card, true); + } + }, + ai: { + fireAttack: true, + order: function (skill, player) { + if (player.hp < player.maxHp && player.storage.rerende < 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.rerende < 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, + }, + }, + rerende1: { + trigger: { player: "phaseUseBegin" }, + silent: true, + content: function () { + player.storage.rerende = 0; + player.storage.rerende2 = []; + }, + }, + liyu: { + audio: 2, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.player.isIn() && event.player.countGainableCards(player, "he") > 0; + }, + check: function () { + return false; + }, + content: function () { + "step 0"; + trigger.player + .chooseTarget(function (card, player, target) { + var evt = _status.event.getParent(); + return evt.player.canUse({ name: "juedou" }, target) && target != _status.event.player; + }, get.prompt("liyu")) + .set("ai", function (target) { + var evt = _status.event.getParent(); + return get.effect(target, { name: "juedou" }, evt.player, _status.event.player) - 2; + }); + "step 1"; + if (result.bool) { + player.gainPlayerCard(trigger.player, "he", true); + event.target = result.targets[0]; + trigger.player.line(player, "green"); + } else { + event.finish(); + } + "step 2"; + if (event.target) { + player.useCard({ name: "juedou", isCard: true }, event.target, "noai"); + } + }, + ai: { + halfneg: true, + }, + }, + /*reqicai:{ + trigger:{player:'equipEnd'}, + frequent:true, + content:function(){ + player.draw(); + }, + mod:{ + targetInRange:function(card,player,target,now){ + var type=get.type(card); + if(type=='trick'||type=='delay') return true; + } + }, + },*/ + retuxi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + direct: true, + filter: function (event) { + return event.num > 0; + }, + content: function () { + "step 0"; + player.chooseTarget( + get.prompt("retuxi"), + [1, trigger.num], + function (card, player, target) { + return target.countCards("h") > 0 && player != target && target.countCards("h") >= player.countCards("h"); + }, + function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + } + ); + "step 1"; + if (result.bool) { + player.logSkill("retuxi", result.targets); + player.gainMultiple(result.targets); + trigger.num -= result.targets.length; + } else { + event.finish(); + } + "step 2"; + if (trigger.num <= 0) game.delay(); + }, + ai: { + threaten: 1.6, + expose: 0.2, + }, + }, + reguicai: { + audio: 2, + trigger: { global: "judge" }, + direct: true, + filter: function (event, player) { + return player.countCards("hes") > 0; + }, + content: function () { + "step 0"; + player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("reguicai"), "hes", function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result - get.value(card) / 2; + } else { + return -result - get.value(card) / 2; + } + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.bool) { + player.respond(result.cards, "reguicai", "highlight", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + game.delay(2); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + refankui: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return event.source && event.source.countGainableCards(player, event.source != player ? "he" : "e") && event.num > 0; + }, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + player.gainPlayerCard(get.prompt("refankui", trigger.source), trigger.source, get.buttonValue, trigger.source != player ? "he" : "e").set("logSkill", [event.name, trigger.source]); + "step 2"; + if (result.bool && event.count > 0 && trigger.source.countGainableCards(player, trigger.source != player ? "he" : "e") > 0 && player.hasSkill(event.name)) event.goto(1); + }, + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.countCards("he") > 1 && get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; + if (get.attitude(target, player) < 0) return [1, 1]; + } + }, + }, + }, + }, + reluoyi: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + check: function (event, player) { + if (player.countCards("h", "sha")) return true; + return Math.random() < 0.5; + }, + content: function () { + "step 0"; + player.addTempSkill("reluoyi2", { player: "phaseBefore" }); + trigger.cancel(null, null, "notrigger"); + "step 1"; + event.cards = get.cards(3); + player.showCards(event.cards, "裸衣"); + "step 2"; + for (var i = 0; i < cards.length; i++) { + if (get.type(cards[i]) != "basic" && cards[i].name != "juedou" && (get.type(cards[i]) != "equip" || get.subtype(cards[i]) != "equip1")) { + cards[i].discard(); + cards.splice(i--, 1); + } + } + player.gain(cards, "gain2"); + }, + }, + reluoyi2: { + trigger: { source: "damageBegin1" }, + filter: function (event) { + return event.card && (event.card.name == "sha" || event.card.name == "juedou") && event.notLink(); + }, + forced: true, + content: function () { + trigger.num++; + }, + ai: { + damageBonus: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "damageBonus") return arg && arg.card && (arg.card.name === "sha" || arg.card.name === "juedou"); + }, + }, + }, + reganglie: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source != undefined && event.num > 0; + }, + check: function (event, player) { + return get.attitude(player, event.source) <= 0; + }, + logTarget: "source", + preHidden: true, + content: function () { + "step 0"; + event.num = trigger.num; + if (get.mode() == "guozhan") event.num = 1; + "step 1"; + player.judge(function (card) { + if (get.color(card) == "red") return 1; + return 0; + }); + "step 2"; + if (result.color == "black") { + if (trigger.source.countCards("he")) { + player.discardPlayerCard(trigger.source, "he", true); + } + } else if (trigger.source.isIn()) { + trigger.source.damage(); + } + event.num--; + if (event.num > 0 && player.hasSkill("reganglie")) { + player.chooseBool(get.prompt2("reganglie")); + } else { + event.finish(); + } + "step 3"; + if (result.bool) { + player.logSkill("reganglie", trigger.source); + event.goto(1); + } + }, + ai: { + maixie_defend: true, + expose: 0.4, + }, + }, + qinxue: { + skillAnimation: true, + animationColor: "wood", + audio: 2, + unique: true, + juexingji: true, + derivation: "gongxin", + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + filter: function (event, player) { + if (player.countCards("h") >= player.hp + 2) return true; + return false; + }, + content: function () { + player.awakenSkill("qinxue"); + player.loseMaxHp(); + player.chooseDrawRecover(2, true); + player.addSkills("gongxin"); + }, + }, + qingjian: { + audio: 2, + unique: true, + trigger: { player: "gainAfter" }, + direct: true, + usable: 4, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.player == player) return false; + return event.getg(player).length > 0; + }, + content: function () { + "step 0"; + event.cards = trigger.getg(player); + "step 1"; + player.chooseCardTarget({ + filterCard: function (card) { + return _status.event.getParent().cards.includes(card); + }, + selectCard: [1, event.cards.length], + filterTarget: function (card, player, target) { + return player != target; + }, + ai1: function (card) { + if (ui.selected.cards.length > 0) return -1; + if (card.name == "du") return 20; + return _status.event.player.countCards("h") - _status.event.player.hp; + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; + return 1 - att; + } + if (target.countCards("h") > _status.event.player.countCards("h")) return 0; + return att - 4; + }, + prompt: "请选择要送人的卡牌", + }); + "step 2"; + if (result.bool) { + player.storage.qingjian++; + player.logSkill("qingjian", result.targets); + result.targets[0].gain(result.cards, player, "give"); + for (var i = 0; i < result.cards.length; i++) { + event.cards.remove(result.cards[i]); + } + if (event.cards.length) event.goto(1); + } else { + player.storage.counttrigger.qingjian--; + } + }, + ai: { + expose: 0.3, + }, + }, + reyingzi: { + audio: 2, + audioname: ["heqi", "sunce", "gexuan", "re_sunben", "re_sunce", "re_heqi"], + audioname2: { re_sunyi: "reyingzi_re_sunyi" }, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + preHidden: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num++; + }, + ai: { + threaten: 1.5, + }, + mod: { + maxHandcardBase: function (player, num) { + return player.maxHp; + }, + }, + }, + refanjian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + return player != target; + }, + filterCard: true, + check: function (card) { + return 8 - get.value(card); + }, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + target.storage.refanjian = cards[0]; + player.give(cards[0], target); + "step 1"; + var suit = get.suit(target.storage.refanjian); + if (!target.countCards("h")) event._result = { control: "refanjian_hp" }; + else + target.chooseControl("refanjian_card", "refanjian_hp").ai = function (event, player) { + var cards = player.getCards("he", { suit: get.suit(player.storage.refanjian) }); + if (cards.length == 1) return 0; + if (cards.length >= 2) { + for (var i = 0; i < cards.length; i++) { + if (get.tag(cards[i], "save")) return 1; + } + } + if (player.hp == 1) return 0; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i]) >= 8) return 1; + } + if (cards.length > 2 && player.hp > 2) return 1; + if (cards.length > 3) return 1; + return 0; + }; + "step 2"; + if (result.control == "refanjian_card") { + target.showHandcards(); + } else { + target.loseHp(); + event.finish(); + } + "step 3"; + var suit = get.suit(target.storage.refanjian); + target.discard( + target.getCards("he", function (i) { + return get.suit(i) == suit && lib.filter.cardDiscardable(i, target, "refanjian"); + }) + ); + delete target.storage.refanjian; + }, + ai: { + order: 9, + result: { + target: function (player, target) { + return -target.countCards("he") - (player.countCards("h", "du") ? 1 : 0); + }, + }, + threaten: 2, + }, + }, + reqianxun: { + audio: 2, + trigger: { + target: "useCardToBegin", + player: "judgeBefore", + }, + filter: function (event, player) { + if (player.countCards("h") == 0) return false; + if (event.getParent().name == "phaseJudge") { + return true; + } + if (event.name == "judge") return false; + if (event.targets && event.targets.length > 1) return false; + if (event.card && get.type(event.card) == "trick" && event.player != player) return true; + }, + content: function () { + var cards = player.getCards("h"); + player.addToExpansion(cards, "giveAuto", player).gaintag.add("reqianxun2"); + player.addSkill("reqianxun2"); + }, + ai: { + effect: function (card, player, target) { + if (player == target || !target.hasFriend()) return; + var type = get.type(card); + var nh = Math.min( + target.countCards(), + game.countPlayer(i => get.attitude(target, i) > 0) + ); + if (type == "trick") { + if (!get.tag(card, "multitarget") || get.info(card).singleCard) { + if (get.tag(card, "damage")) return [1.5, nh - 1]; + return [1, nh]; + } + } else if (type == "delay") return [0.5, 0.5]; + }, + }, + }, + reqianxun2: { + trigger: { global: "phaseEnd" }, + forced: true, + audio: false, + content: function () { + var cards = player.getExpansions("reqianxun2"); + if (cards.length) player.gain(cards, "draw"); + player.removeSkill("reqianxun2"); + }, + intro: { + mark: function (dialog, storage, player) { + var cards = player.getExpansions("reqianxun2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + markcount: "expansion", + }, + }, + relianying: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + if (player.countCards("h")) return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length; + }, + content: function () { + "step 0"; + var num = trigger.getl(player).hs.length; + player.chooseTarget(get.prompt("relianying"), "令至多" + get.cnNumber(num) + "名角色各摸一张牌", [1, num]).ai = function (target) { + var player = _status.event.player; + if (player == target) return get.attitude(player, target) + 10; + return get.attitude(player, target); + }; + "step 1"; + if (result.bool) { + player.logSkill("relianying", result.targets); + game.asyncDraw(result.targets); + } else event.finish(); + "step 2"; + game.delay(); + }, + ai: { + threaten: 0.8, + effect: { + target: function (card) { + if (card.name == "guohe" || card.name == "liuxinghuoyu") return 0.5; + }, + }, + noh: true, + }, + }, + retishen: { + audio: 2, + unique: true, + mark: true, + skillAnimation: true, + animationColor: "soil", + limited: true, + trigger: { player: "phaseZhunbeiBegin" }, + init: function (player) { + player.storage.retishen = false; + }, + filter: function (event, player) { + if (player.storage.retishen) return false; + if (typeof player.storage.retishen2 == "number") { + return player.hp < player.storage.retishen2; + } + return false; + }, + check: function (event, player) { + if (player.hp <= 1) return true; + return player.hp < player.storage.retishen2 - 1; + }, + content: function () { + player.awakenSkill("retishen"); + player.recover(player.storage.retishen2 - player.hp); + player.draw(player.storage.retishen2 - player.hp); + player.storage.retishen = true; + }, + intro: { + mark: function (dialog, content, player) { + if (player.storage.retishen) return; + if (typeof player.storage.retishen2 != "number") { + return "上回合体力:无"; + } + return "上回合体力:" + player.storage.retishen2; + }, + content: "limited", + }, + group: ["retishen2"], + }, + retishen2: { + trigger: { player: "phaseJieshuBegin" }, + priority: -10, + silent: true, + content: function () { + player.storage.retishen2 = player.hp; + game.broadcast(function (player) { + player.storage.retishen2 = player.hp; + }, player); + game.addVideo("storage", player, ["retishen2", player.storage.retishen2]); + }, + intro: { + content: function (storage, player) { + if (player.storage.retishen) return; + return "上回合体力:" + storage; + }, + }, + }, + reyajiao: { + audio: 2, + trigger: { player: ["respond", "useCard"] }, + frequent: true, + filter: function (event, player) { + return player != _status.currentPhase && get.itemtype(event.cards) == "cards"; + }, + content: function () { + "step 0"; + event.card = get.cards()[0]; + game.broadcast(function (card) { + ui.arena.classList.add("thrownhighlight"); + card.copy("thrown", "center", "thrownhighlight", ui.arena).addTempClass("start"); + }, event.card); + event.node = event.card.copy("thrown", "center", "thrownhighlight", ui.arena).addTempClass("start"); + ui.arena.classList.add("thrownhighlight"); + game.addVideo("thrownhighlight1"); + game.addVideo("centernode", null, get.cardInfo(event.card)); + if (get.type(event.card, "trick") == get.type(trigger.card, "trick")) { + player + .chooseTarget("选择获得此牌的角色") + .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 (att > 0) { + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }) + .set("du", event.card.name == "du"); + } else { + player.chooseBool("是否弃置" + get.translation(event.card) + "?"); + event.disbool = true; + } + game.delay(2); + "step 1"; + if (event.disbool) { + if (!result.bool) { + game.log(player, "展示了", event.card); + ui.cardPile.insertBefore(event.card, ui.cardPile.firstChild); + } else { + game.log(player, "展示并弃掉了", event.card); + event.card.discard(); + } + game.addVideo("deletenode", player, [get.cardInfo(event.node)]); + event.node.delete(); + game.broadcast(function (card) { + ui.arena.classList.remove("thrownhighlight"); + if (card.clone) { + card.clone.delete(); + } + }, event.card); + } else if (result.targets) { + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "log"); + event.node.moveDelete(result.targets[0]); + game.addVideo("gain2", result.targets[0], [get.cardInfo(event.node)]); + game.broadcast( + function (card, target) { + ui.arena.classList.remove("thrownhighlight"); + if (card.clone) { + card.clone.moveDelete(target); + } + }, + event.card, + result.targets[0] + ); + } else { + game.log(player, "展示并弃掉了", event.card); + event.card.discard(); + game.addVideo("deletenode", player, [get.cardInfo(event.node)]); + event.node.delete(); + game.broadcast(function (card) { + ui.arena.classList.remove("thrownhighlight"); + if (card.clone) { + card.clone.delete(); + } + }, event.card); + } + game.addVideo("thrownhighlight2"); + ui.arena.classList.remove("thrownhighlight"); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "respond") && target.countCards("h") > 1) return [1, 0.2]; + }, + }, + }, + }, + rejianxiong: { + audio: 2, + audioname: ["shen_caopi"], + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return get.itemtype(event.cards) == "cards" && get.position(event.cards[0], true) == "o"; + }, + content: function () { + player.gain(trigger.cards); + player.$gain2(trigger.cards); + player.draw(); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage")) return [1, 0.55]; + }, + }, + }, + }, + rejianxiong_old: { + audio: "rejianxiong", + audioname2: { + gz_caocao: "jianxiong", + }, + trigger: { player: "damageEnd" }, + async cost(event, trigger, player) { + let list = ["摸牌"]; + if (get.itemtype(trigger.cards) == "cards" && trigger.cards.filterInD().length) { + list.push("拿牌"); + } + list.push("cancel2"); + const { + result: { control }, + } = await player + .chooseControl(list) + .set("prompt", get.prompt2("rejianxiong_old")) + .set("ai", () => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + const cards = trigger.cards.filterInD(); + if (get.event().controls.includes("拿牌")) { + if ( + cards.reduce((sum, card) => { + return sum + (card.name == "du" ? -1 : 1); + }, 0) > 1 || + player.getUseValue(cards[0]) > 6 + ) + return "拿牌"; + } + return "摸牌"; + }); + event.result = { bool: control != "cancel2", cost_data: control }; + }, + async content(event, trigger, player) { + if (event.cost_data == "摸牌") await player.draw(); + else await player.gain(trigger.cards.filterInD(), "gain2"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target) return [1, 0.6]; + }, + }, + }, + }, + reyiji: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + filter: function (event) { + return event.num > 0; + }, + content: function () { + "step 0"; + event.num = 1; + event.count = 1; + "step 1"; + player.gain(get.cards(2)); + player.$draw(2); + "step 2"; + player.chooseCardTarget({ + filterCard: true, + selectCard: [1, 2], + filterTarget: function (card, player, target) { + return player != target && target != event.temp; + }, + ai1: function (card) { + if (ui.selected.cards.length > 0) return -1; + if (card.name == "du") return 20; + return _status.event.player.countCards("h") - _status.event.player.hp; + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; + return 1 - att; + } + return att - 4; + }, + prompt: "请选择要送人的卡牌", + }); + "step 3"; + if (result.bool) { + player.lose(result.cards, ui.special, "toStorage"); + if (result.targets[0].hasSkill("reyiji2")) { + result.targets[0].storage.reyiji2 = result.targets[0].storage.reyiji2.concat(result.cards); + } else { + result.targets[0].addSkill("reyiji2"); + result.targets[0].storage.reyiji2 = result.cards; + } + player.$give(result.cards.length, result.targets[0], false); + player.line(result.targets, "green"); + game.addVideo("storage", result.targets[0], ["reyiji2", get.cardsInfo(result.targets[0].storage.reyiji2), "cards"]); + if (num == 1) { + event.temp = result.targets[0]; + event.num++; + event.goto(2); + } else if (event.count < trigger.num) { + delete event.temp; + event.num = 1; + event.count++; + event.goto(1); + } + } else if (event.count < trigger.num) { + delete event.temp; + event.num = 1; + event.count++; + event.goto(1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + result: { + effect: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; + } + if (player.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; + } + }, + }, + threaten: 0.6, + }, + }, + reyiji2: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + mark: true, + popup: "遗计拿牌", + audio: false, + content: function () { + player.$draw(player.storage.reyiji2.length); + player.gain(player.storage.reyiji2, "fromStorage"); + delete player.storage.reyiji2; + player.removeSkill("reyiji2"); + game.delay(); + }, + intro: { + content: "cardCount", + }, + }, + yijue: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("h"); + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseToCompare(target).set("small", true); + "step 1"; + if (result.bool) { + if (!target.hasSkill("fengyin")) { + target.addTempSkill("fengyin"); + } + target.addTempSkill("yijue2"); + event.finish(); + } else if (target.hp < target.maxHp) { + player.chooseBool("是否让目标回复1点体力?").ai = function (event, player) { + return get.recoverEffect(target, player, player) > 0; + }; + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + target.recover(); + } + }, + ai: { + result: { + target: function (player, target) { + var hs = player.getCards("h"); + if (hs.length < 3) return 0; + var bool = false; + for (var i = 0; i < hs.length; i++) { + if (get.number(hs[i]) >= 9 && get.value(hs[i]) < 7) { + bool = true; + break; + } + } + if (!bool) return 0; + if (target.countCards("h") > target.hp + 1 && get.recoverEffect(target) > 0) { + return 1; + } + if (player.canUse("sha", target) && (player.countCards("h", "sha") || player.countCards("he", { color: "red" }))) { + return -2; + } + return -0.5; + }, + }, + order: 9, + }, + }, + yijue2: { + mark: true, + mod: { + cardEnabled: function () { + return false; + }, + cardRespondable: function () { + return false; + }, + cardSavable: function () { + return false; + }, + }, + intro: { + content: "不能使用或打出卡牌", + }, + }, + retieji: { + shaRelated: true, + audio: 2, + audioname: ["boss_lvbu3"], + trigger: { player: "useCardToPlayered" }, + check: function (event, player) { + return get.attitude(player, event.target) <= 0; + }, + filter: function (event, player) { + return event.card.name == "sha"; + }, + logTarget: "target", + content: function () { + "step 0"; + player.judge(function () { + return 0; + }); + if (!trigger.target.hasSkill("fengyin")) { + trigger.target.addTempSkill("fengyin"); + } + "step 1"; + var suit = result.suit; + var target = trigger.target; + var num = target.countCards("h", "shan"); + target + .chooseToDiscard("请弃置一张" + get.translation(suit) + "牌,否则不能使用闪抵消此杀", "he", function (card) { + return get.suit(card) == _status.event.suit; + }) + .set("ai", function (card) { + var num = _status.event.num; + if (num == 0) return 0; + if (card.name == "shan") return num > 1 ? 2 : 0; + return 8 - get.value(card); + }) + .set("num", num) + .set("suit", suit); + "step 2"; + if (!result.bool) { + trigger.getParent().directHit.add(trigger.target); + } + }, + ai: { + ignoreSkill: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "directHit_ai") { + return get.attitude(player, arg.target) <= 0; + } + if (!arg || arg.isLink || !arg.card || arg.card.name != "sha") return false; + if (!arg.target || get.attitude(player, arg.target) >= 0) return false; + if (!arg.skill || !lib.skill[arg.skill] || lib.skill[arg.skill].charlotte || get.is.locked(arg.skill) || !arg.target.getSkills(true, false).includes(arg.skill)) return false; + }, + directHit_ai: true, + }, + }, + reyicong: { + trigger: { + player: ["changeHp"], + }, + audio: 2, + audioname2: { gongsunzan: "yicong" }, + forced: true, + filter: function (event, player) { + return get.sgn(player.hp - 2.5) != get.sgn(player.hp - 2.5 - event.num); + }, + content: function () {}, + mod: { + globalFrom: function (from, to, current) { + return current - 1; + }, + globalTo: function (from, to, current) { + if (to.hp <= 2) return current + 1; + }, + }, + ai: { + threaten: 0.8, + }, + }, + reqiaomeng: { + audio: "qiaomeng", + trigger: { source: "damageSource" }, + direct: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.player.countDiscardableCards(player, "hej"); + }, + content: function () { + "step 0"; + player.discardPlayerCard(get.prompt("reqiaomeng", trigger.player), "hej", trigger.player).set("logSkill", ["reqiaomeng", trigger.player]); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + if (get.position(card) == "d") { + if (get.subtype(card) == "equip3" || get.subtype(card) == "equip4" || get.subtype(card) == "equip6") { + player.gain(card, player, "gain2"); + } + } + } + }, + }, + qiaomeng: { + audio: 2, + trigger: { source: "damageSource" }, + direct: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.cards && get.color(event.cards) == "black" && event.player.countDiscardableCards(player, "hej"); + }, + content: function () { + "step 0"; + player.discardPlayerCard(get.prompt("qiaomeng", trigger.player), "e", trigger.player).set("logSkill", ["qiaomeng", trigger.player]); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + if (get.position(card) == "d") { + if (get.subtype(card) == "equip3" || get.subtype(card) == "equip4" || get.subtype(card) == "equip6") { + player.gain(card, player, "gain2"); + } + } + } + }, + }, + rekurou: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + check: function (card) { + return 8 - get.value(card); + }, + position: "he", + content: function () { + player.loseHp(); + }, + ai: { + order: 8, + result: { + player: function (player) { + return get.effect(player, { name: "losehp" }, player, player); + }, + }, + neg: true, + }, + }, + zhaxiang: { + audio: 2, + audioname: ["ol_sb_jiangwei"], + trigger: { player: "loseHpEnd" }, + forced: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + player.draw(3); + if (player.isPhaseUsing()) { + player.addTempSkill("zhaxiang2"); + player.addMark("zhaxiang2", 1, false); + } + "step 2"; + if (event.count > 0 && player.hasSkill("zhaxiang") && !get.is.blocked("zhaxiang", player)) { + player.logSkill("zhaxiang"); + event.goto(1); + } + }, + ai: { + maihp: true, + effect: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, 1]; + return 1.2; + } + if (get.tag(card, "loseHp")) { + if (target.hp <= 1) return; + var using = target.isPhaseUsing(); + if (target.hp <= 2) return [1, player.countCards("h") <= 1 && using ? 3 : 0]; + if (using && target.countCards("h", { name: "sha", color: "red" })) return [1, 3]; + return [ + 1, + target.countCards("h") <= target.hp || + (using && + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) < 0 && player.inRange(current); + })) + ? 3 + : 2, + ]; + } + }, + }, + }, + zhaxiang2: { + mod: { + targetInRange: function (card, player, target, now) { + if (card.name == "sha" && get.color(card) == "red") return true; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.storage.zhaxiang2; + }, + }, + charlotte: true, + onremove: true, + audio: "zhaxiang", + audioname: ["ol_sb_jiangwei"], + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && get.color(event.card) == "red"; + }, + forced: true, + content: function () { + trigger.directHit.addArray(game.players); + }, + intro: { + content: "
  • 使用【杀】的次数上限+#
  • 使用红色【杀】无距离限制且不能被【闪】响应", + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg.card.name == "sha" && get.color(arg.card) == "red"; + }, + }, + }, + zhuhai: { + audio: 2, + audioname: ["gz_re_xushu"], + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return event.player.isIn() && event.player.getStat("damage") && lib.filter.targetEnabled({ name: "sha" }, player, event.player) && (player.hasSha() || (_status.connectMode && player.countCards("h") > 0)); + }, + content: function () { + player + .chooseToUse( + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + "诛害:是否对" + get.translation(trigger.player) + "使用一张杀?" + ) + .set("logSkill", "zhuhai") + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", trigger.player); + }, + }, + qianxin: { + skillAnimation: true, + animationColor: "orange", + audio: 2, + unique: true, + juexingji: true, + trigger: { source: "damageSource" }, + forced: true, + derivation: "jianyan", + filter: function (event, player) { + return player.hp < player.maxHp; + }, + content: function () { + player.awakenSkill("qianxin"); + player.addSkills("jianyan"); + player.loseMaxHp(); + }, + }, + jianyan: { + audio: 2, + enable: "phaseUse", + usable: 1, + delay: false, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.hasSex("male"); + }); + }, + content: function () { + "step 0"; + player.chooseControl(["red", "black", "basic", "trick", "equip"]).set("ai", function () { + var player = _status.event.player; + if (!player.hasShan()) return "basic"; + if (player.countCards("e") <= 1) return "equip"; + if (player.countCards("h") > 2) return "trick"; + return "red"; + }); + "step 1"; + event.card = get.cardPile(function (card) { + if (get.color(card) == result.control) return true; + if (get.type(card, "trick") == result.control) return true; + return false; + }, "cardPile"); + if (!event.card) { + event.finish(); + return; + } + player.showCards([event.card]); + "step 2"; + player + .chooseTarget(true, "选择一名男性角色送出" + get.translation(event.card), function (card, player, target) { + return target.hasSex("male"); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.neg) return -att; + return att; + }) + .set("neg", get.value(event.card, player, "raw") < 0); + "step 3"; + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "gain2"); + }, + ai: { + order: 9, + result: { + player: function (player) { + if ( + game.hasPlayer(function (current) { + return current.hasSex("male") && get.attitude(player, current) > 0; + }) + ) + return 2; + return 0; + }, + }, + threaten: 1.2, + }, + }, + reguose: { + audio: 2, + enable: "phaseUse", + usable: 1, + discard: false, + lose: false, + delay: false, + filter: function (event, player) { + return player.countCards("hes", { suit: "diamond" }) > 0; + }, + position: "hes", + filterCard: { suit: "diamond" }, + filterTarget: function (card, player, target) { + if (get.position(ui.selected.cards[0]) != "s" && lib.filter.cardDiscardable(ui.selected.cards[0], player, "reguose") && target.hasJudge("lebu")) return true; + if (player == target) return false; + if (!game.checkMod(ui.selected.cards[0], player, "unchanged", "cardEnabled2", player)) return false; + return player.canUse({ name: "lebu", cards: ui.selected.cards }, target); + }, + check: function (card) { + return 7 - get.value(card); + }, + content: function () { + if (target.hasJudge("lebu")) { + player.discard(cards); + target.discard(target.getJudge("lebu")); + } else { + player.useCard({ name: "lebu" }, target, cards).audio = false; + } + player.draw(); + }, + ai: { + result: { + target: function (player, target) { + if (target.hasJudge("lebu")) return -get.effect(target, { name: "lebu" }, player, target); + return get.effect(target, { name: "lebu" }, player, target); + }, + }, + order: 9, + }, + }, + fenwei: { + skillAnimation: true, + animationColor: "wood", + audio: 2, + audioname: ["heqi"], + unique: true, + mark: true, + limited: true, + trigger: { global: "useCardToPlayered" }, + //priority:5, + filter: function (event, player) { + if (event.getParent().triggeredTargets3.length > 1) return false; + if (get.type(event.card) != "trick") return false; + if (get.info(event.card).multitarget) return false; + if (event.targets.length < 2) return false; + if (player.storage.fenwei) return false; + return true; + }, + init: function (player) { + player.storage.fenwei = false; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("fenwei"), [1, trigger.targets.length], function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + if (game.phaseNumber > game.players.length * 2 && trigger.targets.length >= game.players.length - 1 && !trigger.excluded.includes(target)) { + return -get.effect(target, trigger.card, trigger.player, _status.event.player); + } + return -1; + }) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + player.awakenSkill("fenwei"); + player.logSkill("fenwei", result.targets); + player.storage.fenwei = true; + trigger.getParent().excluded.addArray(result.targets); + game.delay(); + } + }, + intro: { + content: "limited", + }, + }, + chulao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + if (player == target) return false; + if (target.group == "unknown") return false; + for (var i = 0; i < ui.selected.targets.length; i++) { + if (ui.selected.targets[i].group == target.group) return false; + } + return target.countCards("he") > 0; + }, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterCard: true, + position: "he", + selectTarget: [1, Infinity], + check: function (card) { + if (get.suit(card) == "spade") return 8 - get.value(card); + return 5 - get.value(card); + }, + content: function () { + "step 0"; + if (num == 0 && get.suit(cards[0]) == "spade") player.draw(); + player.choosePlayerCard(targets[num], "he", true); + "step 1"; + if (result.bool) { + if (result.links.length) targets[num].discard(result.links[0]); + if (get.suit(result.links[0]) == "spade") targets[num].draw(); + } + }, + ai: { + result: { + target: -1, + }, + threaten: 1.2, + order: 3, + }, + }, + xunxun: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + preHidden: true, + content: function () { + "step 0"; + var cards = get.cards(4); + game.cardsGotoOrdering(cards); + var next = player.chooseToMove("恂恂:将两张牌置于牌堆顶", true); + next.set("list", [["牌堆顶", cards], ["牌堆底"]]); + next.set("filterMove", function (from, to, moved) { + if (to == 1 && moved[1].length >= 2) return false; + return true; + }); + next.set("filterOk", function (moved) { + return moved[1].length == 2; + }); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(b) - get.value(a); + }); + return [cards, cards.splice(2)]; + }); + "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]); + } + game.updateRoundNumber(); + game.delayx(); + }, + }, + wangxi: { + audio: 2, + trigger: { player: "damageEnd", source: "damageSource" }, + filter: function (event) { + if (event._notrigger.includes(event.player)) return false; + return event.num && event.source && event.player && event.player.isIn() && event.source.isIn() && event.source != event.player; + }, + check: function (event, player) { + if (player.isPhaseUsing()) return true; + if (event.player == player) return get.attitude(player, event.source) > -3; + return get.attitude(player, event.player) > -3; + }, + logTarget: function (event, player) { + if (event.player == player) return event.source; + return event.player; + }, + preHidden: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + game.asyncDraw([trigger.player, trigger.source]); + event.count--; + "step 2"; + game.delay(); + "step 3"; + if (event.count && player.hasSkill("wangxi")) { + player.chooseBool(get.prompt2("wangxi", lib.skill.wangxi.logTarget(trigger, player))); + } else event.finish(); + "step 4"; + if (result.bool) { + player.logSkill("wangxi", lib.skill.wangxi.logTarget(trigger, player)); + event.goto(1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + }, + }, + refangquan: { + audio: 2, + trigger: { player: "phaseUseBefore" }, + filter: function (event, player) { + return player.countCards("h") > 0 && !player.hasSkill("fangquan3"); + }, + direct: true, + content: function () { + "step 0"; + var fang = player.countMark("fangquan2") == 0 && player.hp >= 2 && player.countCards("h") <= player.maxHp + 1; + player + .chooseBool(get.prompt2("refangquan")) + .set("ai", function () { + if (!_status.event.fang) return false; + return game.hasPlayer(function (target) { + if (target.hasJudge("lebu") || target == player) return false; + if (get.attitude(player, target) > 4) { + return get.threaten(target) / Math.sqrt(target.hp + 1) / Math.sqrt(target.countCards("h") + 1) > 0; + } + return false; + }); + }) + .set("fang", fang); + "step 1"; + if (result.bool) { + player.logSkill("refangquan"); + trigger.cancel(); + player.addTempSkill("fangquan2", "phaseAfter"); + player.addMark("fangquan2", 1, false); + player.addTempSkill("refangquan2"); + //player.storage.fangquan=result.targets[0]; + } + }, + }, + refangquan2: { + mod: { + maxHandcardBase: function (player, num) { + return player.maxHp; + }, + }, + }, + rehunzi: { + inherit: "hunzi", + filter: function (event, player) { + return player.hp <= 2 && !player.storage.rehunzi; + }, + ai: { + threaten: function (player, target) { + if (target.hp <= 2) return 2; + return 0.5; + }, + maixie: true, + effect: { + target: function (card, player, target) { + if (!target.hasFriend()) return; + if (target.hp === 3 && get.tag(card, "damage") == 1 && !target.isTurnedOver() && _status.currentPhase != target && get.distance(_status.currentPhase, target, "absolute") <= 3) return [0.5, 1]; + if (target.hp === 1 && get.tag(card, "recover") && !target.isTurnedOver() && _status.currentPhase !== target && get.distance(_status.currentPhase, target, "absolute") <= 3) return [1, -3]; + }, + }, + }, + }, + rezhijian: { + inherit: "zhijian", + group: ["rezhijian_use"], + subfrequent: ["use"], + subSkill: { + use: { + audio: "rezhijian", + trigger: { player: "useCard" }, + frequent: true, + filter: function (event, player) { + return get.type(event.card) == "equip"; + }, + prompt: "是否发动【直谏】摸一张牌?", + content: function () { + player.draw("nodelay"); + }, + }, + }, + }, + retuntian: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + frequent: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; + }, + content: function () { + player.judge(function (card) { + return 1; + }).callback = lib.skill.retuntian.callback; + }, + callback: function () { + "step 0"; + if (event.judgeResult.suit == "heart") { + player.gain(card, "gain2"); + event.finish(); + } else if (get.mode() == "guozhan") { + player.chooseBool("是否将" + get.translation(card) + "作为“田”置于武将牌上?").set("frequentSkill", "retuntian").ai = function () { + return true; + }; + } else event.directbool = true; + "step 1"; + if (!result.bool && !event.directbool) { + //game.cardsDiscard(card); + return; + } + player.addToExpansion(card, "gain2").gaintag.add("tuntian"); + }, + group: "tuntian_dist", + locked: false, + ai: { + effect: { + target: function () { + return lib.skill.tuntian.ai.effect.target.apply(this, arguments); + }, + }, + threaten: function (player, target) { + if (target.countCards("h") == 0) return 2; + return 0.5; + }, + nodiscard: true, + nolose: true, + }, + }, + rebeige: { + audio: "beige", + audioname: ["re_caiwenji"], + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.source && event.player.classList.contains("dead") == false && player.countCards("he"); + }, + direct: true, + checkx: function (event, player) { + var att1 = get.attitude(player, event.player); + var att2 = get.attitude(player, event.source); + return att1 > 0 && att2 <= 0; + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard("he", get.prompt2("rebeige", trigger.player)); + var check = lib.skill.beige.checkx(trigger, player); + next.set("ai", function (card) { + if (_status.event.goon) return 8 - get.value(card); + return 0; + }); + next.set("logSkill", "rebeige"); + next.set("goon", check); + "step 1"; + if (result.bool) { + trigger.player.judge(); + } else { + event.finish(); + } + "step 2"; + switch (result.suit) { + case "heart": + trigger.player.recover(trigger.num); + break; + case "diamond": + trigger.player.draw(3); + break; + case "club": + trigger.source.chooseToDiscard("he", 2, true); + break; + case "spade": + trigger.source.turnOver(); + break; + } + }, + ai: { + expose: 0.3, + }, + }, + rexingshang: { + audio: 2, + trigger: { global: "die" }, + filter: function (event, player) { + return player.isDamaged() || event.player.countCards("he") > 0; + }, + direct: true, + content: function () { + "step 0"; + var choice = []; + if (player.isDamaged()) choice.push("回复体力"); + if (trigger.player.countCards("he")) choice.push("获得牌"); + choice.push("cancel2"); + player + .chooseControl(choice) + .set("prompt", get.prompt2("rexingshang")) + .set("ai", function () { + if (choice.length == 2) return 0; + if (get.value(trigger.player.getCards("he")) > 8) return 1; + return 0; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill(event.name, trigger.player); + if (result.control == "获得牌") { + event.togain = trigger.player.getCards("he"); + player.gain(event.togain, trigger.player, "giveAuto", "bySelf"); + } else player.recover(); + } + }, + }, + refangzhu: { + audio: 2, + trigger: { + player: "damageEnd", + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("refangzhu"), function (card, player, target) { + return player != target; + }).ai = function (target) { + if (target.hasSkillTag("noturn")) return 0; + var player = _status.event.player; + if (get.attitude(_status.event.player, target) == 0) return 0; + if (get.attitude(_status.event.player, target) > 0) { + if (target.classList.contains("turnedover")) return 1000 - target.countCards("h"); + if (player.getDamagedHp() < 3) return -1; + return 100 - target.countCards("h"); + } else { + if (target.classList.contains("turnedover")) return -1; + if (player.getDamagedHp() >= 3) return -1; + return 1 + target.countCards("h"); + } + }; + "step 1"; + if (result.bool) { + player.logSkill("refangzhu", result.targets); + event.target = result.targets[0]; + if (player.isHealthy()) event._result = { bool: false }; + else + event.target + .chooseToDiscard("he", player.getDamagedHp()) + .set("ai", function (card) { + var player = _status.event.player; + if (player.isTurnedOver() || _status.event.getTrigger().player.getDamagedHp() > 2) return -1; + return player.hp * player.hp - get.value(card); + }) + .set("prompt", "弃置" + get.cnNumber(player.getDamagedHp()) + "张牌并失去1点体力;或选择不弃置,将武将牌翻面并摸" + get.cnNumber(player.getDamagedHp()) + "张牌。"); + } else event.finish(); + "step 2"; + if (result.bool) { + event.target.loseHp(); + } else { + if (player.isDamaged()) event.target.draw(player.getDamagedHp()); + event.target.turnOver(); + } + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; + if (target.hp <= 1) return; + if (!target.hasFriend()) return; + var hastarget = false; + var turnfriend = false; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) < 0 && !players[i].isTurnedOver()) { + hastarget = true; + } + if (get.attitude(target, players[i]) > 0 && players[i].isTurnedOver()) { + hastarget = true; + turnfriend = true; + } + } + if (get.attitude(player, target) > 0 && !hastarget) return; + if (turnfriend || target.hp == target.maxHp) return [0.5, 1]; + if (target.hp > 1) return [1, 0.5]; + } + }, + }, + }, + }, + repolu: { + audio: 1, + trigger: { + source: "dieAfter", + player: "die", + }, + forceDie: true, + filter: function (event, player, name) { + return name == "die" || player.isIn(); + }, + direct: true, + content: function () { + "step 0"; + if (!player.storage.repolu) player.storage.repolu = 0; + event.num = player.storage.repolu + 1; + player.chooseTarget([1, Infinity], get.prompt("repolu"), "令任意名角色摸" + get.cnNumber(event.num) + "张牌").set("forceDie", true).ai = function (target) { + return get.attitude(_status.event.player, target); + }; + "step 1"; + if (result.bool) { + player.storage.repolu++; + result.targets.sortBySeat(); + player.logSkill("repolu", result.targets); + game.asyncDraw(result.targets, num); + } else event.finish(); + "step 2"; + game.delay(); + }, + }, + oljiuchi: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "jiu") return Infinity; + }, + }, + audio: 2, + enable: "chooseToUse", + filterCard: function (card) { + return get.suit(card) == "spade"; + }, + viewAs: { name: "jiu" }, + position: "hs", + viewAsFilter: function (player) { + return player.hasCard(card => get.suit(card) == "spade", "hs"); + }, + prompt: "将一张黑桃手牌当酒使用", + check: function (cardx, player) { + if (player && player == cardx.player) return true; + if (_status.event.type == "dying") return 1; + var player = _status.event.player; + var shas = player.getCards("hs", function (card) { + return card != cardx && get.name(card, player) == "sha"; + }); + if (!shas.length) return -1; + if (shas.length > 1 && (player.getCardUsable("sha") > 1 || player.countCards("hs", "zhuge"))) { + return 0; + } + shas.sort(function (a, b) { + return get.order(b) - get.order(a); + }); + var card = false; + if (shas.length) { + for (var i = 0; i < shas.length; i++) { + if (shas[i] != cardx && lib.filter.filterCard(shas[i], player)) { + card = shas[i]; + break; + } + } + } + if (card) { + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + !current.hasShan() && + current.hp + current.countCards("h", { name: ["tao", "jiu"] }) > 1 + (player.storage.jiu || 0) && + player.canUse(card, current, true, true) && + !current.hasSkillTag("filterDamage", null, { + player: player, + card: card, + jiu: true, + }) && + get.effect(current, card, player) > 0 + ); + }) + ) { + return 4 - get.value(cardx); + } + } + return -1; + }, + ai: { + threaten: 1.5, + }, + trigger: { source: "damageEnd" }, + locked: false, + forced: true, + filter: function (event, player) { + if (event.name == "chooseToUse") return player.hasCard(card => get.suit(card) == "spade", "hs"); + return event.card && event.card.name == "sha" && event.getParent(2).jiu == true && !player.hasSkill("oljiuchi_air"); + }, + content: function () { + player.logSkill("oljiuchi"); + player.addTempSkill("oljiuchi_air"); + }, + subSkill: { + air: {}, + }, + }, + rezaiqi: { + count: function () { + var num = 0; + game.countPlayer2(function (current) { + current.getHistory("lose", function (evt) { + if (evt.position == ui.discardPile) { + for (var i = 0; i < evt.cards.length; i++) { + if (get.color(evt.cards[i]) == "red") num++; + } + } + }); + }); + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name == "cardsDiscard") { + for (var i = 0; i < evt.cards.length; i++) { + if (get.color(evt.cards[i]) == "red") num++; + } + } + }); + return num; + }, + audio: 2, + direct: true, + filter: function (event, player) { + return lib.skill.rezaiqi.count() > 0; + }, + trigger: { + player: "phaseJieshuBegin", + }, + content: function () { + "step 0"; + player.chooseTarget([1, lib.skill.rezaiqi.count()], get.prompt2("rezaiqi")).ai = function (target) { + return get.attitude(_status.event.player, target); + }; + "step 1"; + if (result.bool) { + var targets = result.targets; + targets.sortBySeat(); + player.line(targets, "fire"); + player.logSkill("rezaiqi", targets); + event.targets = targets; + } else event.finish(); + "step 2"; + event.current = targets.shift(); + if (player.isHealthy()) event._result = { index: 0 }; + else + event.current + .chooseControl() + .set("choiceList", ["摸一张牌", "令" + get.translation(player) + "回复1点体力"]) + .set("ai", function () { + if (get.attitude(event.current, player) > 0) return 1; + return 0; + }); + "step 3"; + if (result.index == 1) { + event.current.line(player); + player.recover(); + } else event.current.draw(); + game.delay(); + if (targets.length) event.goto(2); + }, + }, +}; + +export default skills; diff --git a/character/refresh/sort.js b/character/refresh/sort.js new file mode 100644 index 000000000..38d2f812b --- /dev/null +++ b/character/refresh/sort.js @@ -0,0 +1,31 @@ +const characterSort = { + refresh_standard: ["re_caocao", "re_simayi", "re_guojia", "re_zhangliao", "re_xuzhu", "re_xiahoudun", "re_zhangfei", "re_zhaoyun", "re_guanyu", "re_machao", "re_zhouyu", "re_lvmeng", "re_ganning", "re_luxun", "re_daqiao", "re_huanggai", "re_lvbu", "re_huatuo", "re_liubei", "re_diaochan", "re_huangyueying", "re_sunquan", "re_sunshangxiang", "re_zhenji", "re_zhugeliang", "re_huaxiong", "re_gongsunzan", "re_lidian", "re_xushu"], + refresh_feng: ["caoren", "ol_xiahouyuan", "ol_weiyan", "ol_xiaoqiao", "zhoutai", "re_zhangjiao", "xin_yuji", "ol_huangzhong"], + refresh_huo: ["ol_sp_zhugeliang", "ol_xunyu", "ol_dianwei", "ol_yanwen", "ol_pangtong", "ol_yuanshao", "ol_pangde", "re_taishici"], + refresh_lin: ["re_menghuo", "ol_sunjian", "re_caopi", "ol_xuhuang", "ol_dongzhuo", "ol_zhurong", "re_jiaxu", "ol_lusu"], + refresh_shan: ["ol_jiangwei", "ol_caiwenji", "ol_liushan", "ol_zhangzhang", "re_zuoci", "re_sunce", "ol_dengai", "re_zhanghe"], + refresh_yijiang1: ["xin_wuguotai", "xin_gaoshun", "dc_caozhi", "yujin_yujin", "re_masu", "xin_xusheng", "re_fazheng", "xin_lingtong", "re_zhangchunhua", "dc_xushu", "re_chengong"], + refresh_yijiang2: ["re_madai", "re_wangyi", "xin_handang", "xin_zhonghui", "re_liaohua", "re_chengpu", "re_caozhang", "dc_bulianshi", "xin_liubiao", "re_xunyou", "re_guanzhang"], + refresh_yijiang3: ["re_jianyong", "re_guohuai", "re_zhuran", "re_panzhangmazhong", "xin_yufan", "dc_liru", "re_manchong", "re_fuhuanghou", "re_guanping", "re_liufeng", "re_caochong"], + refresh_yijiang4: ["re_sunluban", "re_wuyi", "re_hanhaoshihuan", "re_caozhen", "re_zhoucang", "dc_chenqun", "re_caifuren", "re_guyong", "re_jushou", "re_zhuhuan", "re_zhangsong"], + refresh_yijiang5: ["re_zhangyi", "re_quancong", "re_caoxiu", "re_sunxiu", "re_gongsunyuan", "re_guotufengji", "re_xiahoushi", "re_liuchen", "re_zhuzhi", "re_caorui", "re_zhongyao"], + refresh_yijiang6: ["re_guohuanghou", "re_sundeng"], + refresh_xinghuo: ["xin_zhangliang", "re_zhugedan", "re_simalang", "re_duji", "dc_gongsunzan", "re_sp_taishici", "re_caiyong", "re_mazhong", "re_wenpin", "re_jsp_huangyueying"], +}; + +const characterSortTranslate = { + refresh_standard: "界限突破·标", + refresh_feng: "界限突破·风", + refresh_huo: "界限突破·火", + refresh_lin: "界限突破·林", + refresh_shan: "界限突破·山", + refresh_yijiang1: "界限突破·将1", + refresh_yijiang2: "界限突破·将2", + refresh_yijiang3: "界限突破·将3", + refresh_yijiang4: "界限突破·将4", + refresh_yijiang5: "界限突破·将5", + refresh_yijiang6: "界限突破·原6", + refresh_xinghuo: "界限突破·星火", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/refresh/translate.js b/character/refresh/translate.js new file mode 100644 index 000000000..aed4bb9c5 --- /dev/null +++ b/character/refresh/translate.js @@ -0,0 +1,829 @@ +const translates = { + re_zhangliao: "界张辽", + re_zhangliao_prefix: "界", + re_simayi: "界司马懿", + re_simayi_prefix: "界", + re_xuzhu: "界许褚", + re_xuzhu_prefix: "界", + re_xiahoudun: "界夏侯惇", + re_xiahoudun_prefix: "界", + re_lvmeng: "界吕蒙", + re_lvmeng_prefix: "界", + re_zhouyu: "界周瑜", + re_zhouyu_prefix: "界", + re_luxun: "界陆逊", + re_luxun_prefix: "界", + re_zhaoyun: "界赵云", + re_zhaoyun_prefix: "界", + re_guanyu: "界关羽", + re_guanyu_prefix: "界", + re_zhangfei: "界张飞", + re_zhangfei_prefix: "界", + re_machao: "界马超", + re_machao_prefix: "界", + re_caocao: "界曹操", + re_caocao_prefix: "界", + re_guojia: "界郭嘉", + re_guojia_prefix: "界", + re_lvbu: "界吕布", + re_lvbu_prefix: "界", + re_huanggai: "界黄盖", + re_huanggai_prefix: "界", + re_daqiao: "界大乔", + re_daqiao_prefix: "界", + re_ganning: "界甘宁", + re_ganning_prefix: "界", + re_huatuo: "界华佗", + re_huatuo_prefix: "界", + re_liubei: "界刘备", + re_liubei_prefix: "界", + + re_diaochan: "界貂蝉", + re_diaochan_prefix: "界", + re_huangyueying: "界黄月英", + re_huangyueying_prefix: "界", + re_sunquan: "界孙权", + re_sunquan_prefix: "界", + re_sunshangxiang: "界孙尚香", + re_sunshangxiang_prefix: "界", + re_zhugeliang: "界诸葛亮", + re_zhugeliang_prefix: "界", + re_zhenji: "界甄宓", + re_zhenji_prefix: "界", + re_huaxiong: "界华雄", + re_huaxiong_prefix: "界", + + ol_sp_zhugeliang: "界卧龙", + ol_sp_zhugeliang_prefix: "界", + re_zhangjiao: "界张角", + re_zhangjiao_prefix: "界", + re_sunce: "界孙策", + re_sunce_prefix: "界", + ol_yuanshao: "界袁绍", + ol_yuanshao_prefix: "界", + ol_liushan: "界刘禅", + ol_liushan_prefix: "界", + + olfangquan: "放权", + olfangquan_info: "出牌阶段开始前,你可以跳过此阶段。若如此做,弃牌阶段开始时,你可以弃置一张手牌,令一名其他角色进行一个额外回合。", + olruoyu: "若愚", + olruoyu_info: "主公技,觉醒技,准备阶段,若你的体力值为全场最少,则你加1点体力上限,将体力回复至3点,然后获得技能〖思蜀〗和〖激将〗。", + sishu: "思蜀", + sishu_info: "出牌阶段开始时,你可以选择一名角色。该角色本局游戏内【乐不思蜀】的判定效果反转。", + olluanji: "乱击", + olluanji_info: "你可以将两张花色相同的手牌当做【万箭齐发】使用。当你使用【万箭齐发】选择目标后,你可以为此牌减少一个目标。", + olluanji_remove: "乱击", + olxueyi: "血裔", + olxueyi_info: "主公技,锁定技。①游戏开始时,你获得2X个“裔”标记(X为场上群势力角色的数目)。②出牌阶段开始时,你可以移去一个“裔”标记,然后摸一张牌。③你的手牌上限+Y(Y为“裔”标记数)。", + olxueyi_draw: "血裔", + olhunzi: "魂姿", + olhunzi_info: "觉醒技,准备阶段,若你的体力值为1,你减1点体力上限并获得技能〖英姿〗和〖英魂〗;本回合的结束阶段,你摸两张牌或回复1点体力。", + olzhiba: "制霸", + olzhiba_info: "主公技,其他吴势力的角色的出牌阶段限一次,其可以与你拼点(你可拒绝此拼点)。若其没赢,你可以获得两张拼点牌。你的出牌阶段限一次,你可以和一名吴势力角色拼点,若你赢,你获得两张拼点牌。", + olzhiba2: "制霸", + xinleiji: "雷击", + xinleiji_misa: "雷击", + xinguidao: "鬼道", + xinleiji_info: "①当你使用【闪】或【闪电】,或打出【闪】时,你可以进行判定。②当你的判定的判定牌生效后,若结果为:黑桃,你可对一名角色造成2点雷电伤害;梅花:你回复1点体力并可对一名角色造成1点雷电伤害。", + xinleiji_append: '不能触发〖雷击〗的判定:〖暴虐〗、〖助祭〗、
    〖弘仪〗、〖孤影〗。
    ', + xinleiji_faq: "不能触发〖雷击〗的判定", + xinleiji_faq_info: "
    董卓/界董卓〖暴虐〗
    黄巾雷使〖助祭〗
    羊徽瑜〖弘仪〗
    鸣濑白羽〖孤影〗", + xinguidao_info: "一名角色的判定牌生效前,你可以打出一张黑色牌作为判定牌并获得原判定牌。若你以此法打出的牌为黑桃2-9,则你摸一张牌。", + xinhuangtian: "黄天", + xinhuangtian2: "黄天", + xinhuangtian_info: "主公技。其他群势力角色的出牌阶段限一次,该角色可以交给你一张【闪】或黑桃手牌。", + reqiangxi: "强袭", + reqiangxi_info: "出牌阶段对每名其他角色限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张武器牌并对你攻击范围内的一名其他角色造成1点伤害。", + rehuoji: "火计", + rehuoji_info: "你可一张红色牌当作【火攻】使用。", + rekanpo: "看破", + rekanpo_info: "你可以将一张黑色牌当作【无懈可击】使用。", + reshuangxiong: "双雄", + reshuangxiong1: "双雄", + reshuangxiong2: "双雄", + reshuangxiong_info: "摸牌阶段,你可以放弃摸牌。若如此做,你亮出牌堆顶的两张牌并选择获得其中的一张。然后,你本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用。当你受到【决斗】造成的伤害时,你可以获得对方于此决斗中打出的所有【杀】。", + + reguanxing: "观星", + reguanxing_info: "准备阶段,你可以观看牌堆顶的五张牌(存活角色小于4时改为三张),并将其以任意顺序置于牌堆项或牌堆底,若你将〖观星〗的牌都放在了牌堆底,则你可以在结束阶段再次发动〖观星〗。", + reluoshen: "洛神", + reluoshen_info: "准备阶段,你可以进行判定,若结果为黑色则获得此判定牌,且可重复此流程直到出现红色的判定结果。你通过〖洛神〗得到的牌不计入当前回合的手牌上限。", + reluoshen_info_guozhan: "准备阶段,你可以进行判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过〖洛神〗得到的牌不计入当前回合的手牌上限(结果为黑色的判定牌于此过程中不会进入弃牌堆)。", + rejieyin: "结姻", + rejieyin_info: "出牌阶段限一次,你可以选择一名男性角色并弃置一张手牌或将装备区内的一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。", + rebiyue: "闭月", + rebiyue_info: "结束阶段,你可以摸一张牌,若你没有手牌,则改为摸两张牌。", + rejizhi: "集智", + rejizhi_info: "当你使用锦囊牌时,你可以摸一张牌。若此牌为基本牌,则你可以弃置之,然后令本回合手牌上限+1。", + reqicai: "奇才", + reqicai_info: "锁定技,你使用锦囊牌无距离限制,你装备区内的防具牌和宝物牌不能被其他角色弃置。", + rezhiheng: "制衡", + rezhiheng_info: "出牌阶段限一次,你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。", + rejiuyuan: "救援", + rejiuyuan_info: "主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,则其可以选择令你回复1点体力,然后其摸一张牌。", + + new_yajiao: "涯角", + new_yajiao_info: "每当你于回合外使用或打出牌时,你可以亮出牌堆顶的一张牌,并将其交给一名角色。若此牌与你此次使用或打出的牌类别不同,则你弃置一张牌。", + new_liyu: "利驭", + new_liyu_info: "当你使用【杀】对一名其他角色造成伤害后,你可以获得其区域内的一张牌。若此牌不为装备牌,则其摸一张牌。若此牌为装备牌,则视为你对其选择的另一名角色使用一张【决斗】。", + new_retuxi: "突袭", + new_retuxi_info: "摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。", + new_retuxi_info_guozhan: "摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。", + reyiji_tag: "已分配", + new_reyiji: "遗计", + new_reyiji_info: "当你受到1点伤害后,你可以摸两张牌,然后可以将至多两张手牌交给其他角色。", + new_rejianxiong: "奸雄", + new_rejianxiong_info: "当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。", + new_reluoyi: "裸衣", + new_reluoyi_info: "摸牌阶段开始时,你亮出牌堆顶的三张牌。然后,你可以放弃摸牌。若如此做,你获得其中的基本牌、武器牌和【决斗】,且直到你的下回合开始,你使用的【杀】或【决斗】造成伤害时,此伤害+1。否则,你将这些牌置入弃牌堆。", + new_rewusheng: "武圣", + new_rewusheng_info: "你可以将一张红色牌当做【杀】使用或打出。你使用的方片杀没有距离限制。", + new_yijue: "义绝", + new_yijue_info: "出牌阶段限一次,你可以弃置一张牌并令一名有手牌的其他角色展示一张手牌。若此牌为黑色,则该角色不能使用或打出牌,非锁定技失效且受到来自你的红桃【杀】的伤害+1直到回合结束。若此牌为红色,则你可以获得此牌,并可以令其回复1点体力。", + new_yijue2: "义绝", + new_yijue2_info: "", + new_repaoxiao: "咆哮", + new_repaoxiao_info: "锁定技,出牌阶段,你使用【杀】没有数量限制。若你于此出牌阶段内使用过【杀】,则你本回合内使用【杀】没有距离限制。", + new_tishen: "替身", + new_tishen_info: "出牌阶段结束时,你可以弃置你所有的锦囊牌与坐骑牌。若如此做,直到你的下个回合开始,当一张【杀】结算结束后,若你是此牌目标且你未受到此牌伤害,你获得此牌对应的所有实体牌。", + new_tishen2: "替身", + new_tishen2_info: "", + new_qingjian: "清俭", + new_qingjian_info: "当你于摸牌阶段外得到牌后,你可以展示任意张牌并交给一名其他角色。然后,当前回合角色本回合的手牌上限+X(X为你给出的牌中包含的类别数)。每回合限一次。", + qingjian_add: "清俭", + qingjian_add_info: "", + new_reqingnang: "青囊", + new_reqingnang_info: "出牌阶段,你可以弃置一张手牌,令一名本回合内未成为过〖青囊〗的目标的角色回复1点体力。若你弃置的是黑色牌,则你本回合内不能再发动〖青囊〗。", + new_reyaowu: "耀武", + new_reyaowu_info: "锁定技,当一名角色使用【杀】对你造成伤害时,若此杀为红色,该角色回复1点体力或摸一张牌。否则你摸一张牌。", + reyaowu: "耀武", + reyaowu_info: "锁定技,当你受到牌造成的伤害时,若此牌为红色,则伤害来源摸一张牌;否则你摸一张牌。", + reqingguo: "倾国", + reqingguo_info: "你可以将一张黑色牌当做【闪】使用或打出。", + + qinxue: "勤学", + retuxi: "突袭", + reluoyi: "裸衣", + reluoyi2: "裸衣", + reganglie: "刚烈", + qingjian: "清俭", + reyingzi: "英姿", + refanjian: "反间", + refanjian_card: "弃牌", + refanjian_hp: "失去体力", + reqianxun: "谦逊", + reqianxun2: "谦逊", + relianying: "连营", + retishen: "替身", + retishen2: "替身", + reyajiao: "涯角", + rejianxiong: "奸雄", + rejianxiong_mopai: "摸牌", + rejianxiong_napai: "拿牌", + reyiji: "遗计", + reyiji2: "遗计", + yijue: "义绝", + yijue2: "义绝", + retieji: "铁骑", + refankui: "反馈", + reyicong: "义从", + qiaomeng: "趫猛", + rekurou: "苦肉", + zhaxiang: "诈降", + zhaxiang2: "诈降", + zhuhai: "诛害", + qianxin: "潜心", + jianyan: "荐言", + reguicai: "鬼才", + xunxun: "恂恂", + wangxi: "忘隙", + reguose: "国色", + fenwei: "奋威", + chulao: "除疠", + liyu: "利驭", + rerende: "仁德", + rerende_info: "出牌阶段,你可以将至少一张手牌交给其他角色,然后你于此阶段内不能再以此法交给该角色牌;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌。", + liyu_info: "当你使用【杀】对一名其他角色造成伤害后,该角色可令你获得其一张牌,若如此做,则视为你对其选择的另一名角色使用一张【决斗】。", + xunxun_info: "摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", + wangxi_info: "每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。", + reguose_info: "出牌阶段限一次,你可以选择一项:将一张方片花色牌当做【乐不思蜀】使用;或弃置一张方片花色牌并弃置场上的一张【乐不思蜀】。选择完成后,你摸一张牌。", + fenwei_info: "限定技,当一名角色使用的锦囊牌指定了至少两名角色为目标时,你可以令此牌对其中任意名角色无效。", + chulao_info: "出牌阶段限一次,若你有牌,你可以选择任意名势力各不相同的其他角色,你弃置你和这些角色的各一张牌。然后以此法弃置黑桃牌的角色各摸一张牌。", + reguicai_info: "在任意角色的判定牌生效前,你可以打出一张牌代替之。", + zhuhai_info: "一名其他角色的结束阶段开始时,若该角色本回合造成过伤害,你可以对其使用一张【杀】。", + qianxin_info: "觉醒技,当你造成一次伤害后,若你已受伤,你须减1点体力上限,并获得技能“荐言”。", + jianyan_info: "出牌阶段限一次,你可以声明一种牌的类别或颜色,并亮出牌库中第一张符合你声明的牌,然后你令一名男性角色获得此牌。", + rekurou_info: "出牌阶段限一次,你可以弃置一张牌,然后失去1点体力。", + zhaxiang_info: "锁定技。当你失去1点体力后,你摸三张牌。然后若此时是你的出牌阶段,则你本回合获得此下效果:使用【杀】的次数上限+1,使用红色【杀】无距离限制且不能被【闪】响应。", + qiaomeng_info: "当你使用黑色【杀】对一名角色造成伤害后,你可以弃置该角色装备区里的一张牌,若此牌是坐骑牌,你于此牌置入弃牌堆后获得之。", + reyicong_info: "锁定技,你计算与其他角色的距离时-1。若你的体力值不大于2,则其他角色计算与你的距离时+1。", + refankui_info: "每当你受到1点伤害后,你可以获得伤害来源的一张牌。", + retieji_info: "当你使用【杀】指定一名角色为目标后,你可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。", + yijue_info: "出牌阶段限一次,你可以与一名其他角色拼点,若你赢,则直到回合结束,该角色不能使用或打出手牌且其非锁定技失效,若你没赢,你可令该角色回复1点体力。", + reyiji_info: "每当你受到1点伤害后,你可以摸两张牌。然后你可以在至多两名角色的武将牌旁边分别扣置至多两张手牌,这些角色的下个摸牌阶段开始时,该角色获得其武将牌旁的这些牌。", + rejianxiong_info: "每当你受到伤害后,你可以获得对你造成伤害的牌,然后摸一张牌。", + reyajiao_info: "每当你于回合外使用或打出一张手牌时,你可以亮出牌堆顶的一张牌,若此牌与你此次使用或打出的牌类别相同,你可以将之交给任意一名角色;若不同则你可以将之置入弃牌堆。", + retishen_info: "限定技,准备阶段开始时,你可以将体力回复至等同于你上回合结束时的体力值,然后你每以此法回复1点体力,便摸一张牌。", + reqianxun_info: "每当一张延时类锦囊牌或其他角色使用的普通锦囊牌生效时,若你是此牌的唯一目标,你可以将所有手牌置于你的武将牌上,若如此做,此回合结束时,你获得你武将牌上的所有牌。", + relianying_info: "当你失去最后的手牌时,你可以令至多X名角色各摸一张牌(X为你此次失去的手牌数)。", + reyingzi_info: "锁定技,摸牌阶段摸牌时,你额外摸一张牌;你的手牌上限为你的体力上限。", + refanjian_info: "出牌阶段限一次,你可以展示一张手牌并将此牌交给一名其他角色。然后该角色选择一项:展示其手牌并弃置所有与此牌花色相同的牌,或失去1点体力。", + qingjian_info: "每当你于摸牌阶段外得到牌时,你可以将其中任意牌以任意顺序交给其他角色,每回合最多发动四次。", + qinxue_info: "觉醒技。准备阶段或结束阶段开始时,若你的手牌数减体力值大于1,则你减1点体力上限,回复1点体力或摸两张牌,获得技能〖攻心〗。", + retuxi_info: "摸牌阶段摸牌时,你可以少摸任意张牌,然后选择等量的手牌数大于或等于你的其他角色,获得这些角色的各一张手牌。", + reluoyi_info: "你可以跳过摸牌阶段,然后亮出牌堆顶的三张牌,获得其中的基本牌、武器牌和【决斗】,若如此做,直到你的下回合开始,你为伤害来源的【杀】或【决斗】造成的伤害+1。", + reganglie_info: "当你受到1点伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害;黑色,你弃置伤害来源一张牌。", + reganglie_info_guozhan: "当你受到伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害;黑色,你弃置伤害来源一张牌。", + botu: "博图", + botu_info: "回合结束时,若你本回合出牌阶段内使用的牌包含四种花色,则你可以进行一个额外回合。", + rebotu: "博图", + rebotu_info: "每轮限X次。回合结束时,若本回合内置入弃牌堆的牌中包含至少四种花色,则你可获得一个额外的回合。(X为存活角色数且至多为3)", + + xin_yuji: "界于吉", + xin_yuji_prefix: "界", + re_zuoci: "界左慈", + re_zuoci_prefix: "界", + reguhuo: "蛊惑", + reguhuo_info: "每名角色的回合限一次,你可以扣置一张手牌当作一张基本牌或普通锦囊牌使用或打出。其他角色同时选择是否质疑。然后,你展示此牌。若有质疑的角色:若此牌为假,则此牌作废,且所有质疑者各摸一张牌;为真,则所有质疑角色于此牌结算完成后依次弃置一张牌或失去1点体力,并获得技能〖缠怨〗。", + reguhuo_guess: "蛊惑", + reguhuo_guess_info: "", + rechanyuan: "缠怨", + rechanyuan_info: "锁定技,你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值不大于1时,你的其他技能失效。", + reguhuo_ally: "信任", + reguhuo_betray: "质疑", + reguhuo_ally_bg: "真", + reguhuo_betray_bg: "假", + rehuashen: "化身", + rehuashen_info: "游戏开始时,你随机获得三张未加入游戏的武将牌,选一张置于你面前并声明该武将牌的一项技能,你拥有该技能且同时将性别和势力属性变成与该武将相同直到该化身被替换。回合开始时或回合结束时,你可以选择一项:①弃置至多两张未展示的化身牌并重新获得等量化身牌;②更换所展示的化身牌或技能。(你不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能)。", + rexinsheng: "新生", + rexinsheng_info: "当你受到1点伤害后,你可以获得一张新的化身牌。", + re_menghuo: "界孟获", + re_menghuo_prefix: "界", + re_caopi: "界曹丕", + re_caopi_prefix: "界", + oljiuchi: "酒池", + oljiuchi_info: "你可以将一张黑桃手牌当做【酒】使用。你使用【酒】无次数限制,且当你于回合内使用带有【酒】效果的【杀】造成伤害后,你令你的〖崩坏〗失效直到回合结束。", + repolu: "破虏", + repolu_info: "当你杀死一名角色/死亡时,你可以令任意名角色摸X+1张牌。(X为你此前发动过〖破虏〗的次数)", + rexingshang: "行殇", + rexingshang_info: "当其他角色死亡后,你可以选择一项:回复1点体力,或获得其所有牌。", + refangzhu: "放逐", + refangzhu_info: "当你受到伤害后,你可以令一名其他角色选择一项:摸X张牌并将武将牌翻面,或弃置X张牌并失去1点体力。(X为你已损失的体力值)", + rezaiqi: "再起", + rezaiqi_info: "结束阶段开始时,你可以令至多X名角色选择一项:1.摸一张牌,2.令你回复1点体力(X为本回合进入弃牌堆的红色牌数)。", + ol_caiwenji: "界蔡琰", + ol_caiwenji_prefix: "界", + retuntian: "屯田", + rebeige: "悲歌", + retuntian_info: "①当你于回合外失去牌后,你可以判定。若判定结果为♥,你获得此判定牌。否则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。", + rebeige_info: "当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复X点体力(X为伤害点数);♦︎该角色摸三张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。", + rehunzi: "魂姿", + rehunzi_info: "觉醒技,准备阶段,若你的体力值不大于2,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。", + rezhijian: "直谏", + rezhijian_info: "出牌阶段,你可以将手牌中的一张装备牌置于一名其他角色装备区里(不得替换原装备),然后摸一张牌。当你使用装备牌时,你可以摸一张牌。", + refangquan: "放权", + refangquan_info: "你可跳过你的出牌阶段,若如此做,你本回合的手牌上限为你的体力上限,且回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。", + xin_gaoshun: "界高顺", + xin_gaoshun_prefix: "界", + repojun: "破军", + repojun2: "破军", + repojun3: "破军", + repojun_info: "当你使用【杀】指定目标后,你可以将其的至多X张牌置于其武将牌上(X为其体力值),然后其于当前回合结束时获得这些牌。当你使用【杀】对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,则此伤害+1。", + rexianzhen: "陷阵", + rexianzhen_info: "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本回合内对其使用牌没有次数和距离限制且无视其防具。若你没赢,你本回合内不能使用【杀】。若你以此法失去的拼点牌为【杀】,则你的【杀】不计入本回合的手牌上限。", + rejinjiu: "禁酒", + rejinjiu_info: "锁定技,你的【酒】均视为【杀】。其他角色不能于你的回合内使用【酒】。当你受到酒【杀】的伤害时,你令此伤害-X(X为影响过此【杀】的伤害值的【酒】的数量)。", + rejinjiu2: "禁酒", + rejinjiu3: "禁酒", + ol_xiahouyuan: "界夏侯渊", + ol_xiahouyuan_prefix: "界", + shebian: "设变", + shebian_info: "当你的武将牌翻面后,你可以移动场上的一张装备牌。", + cangzhuo: "藏拙", + cangzhuo_info: "弃牌阶段开始时,若你本回合内没有使用过锦囊牌,则你的锦囊牌不计入手牌上限。", + re_zhangyi: "界张嶷", + re_zhangyi_prefix: "界", + rewurong: "怃戎", + rewurong_info: "出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你获得其一张牌。", + ol_pangtong: "界庞统", + ol_pangtong_prefix: "界", + olniepan: "涅槃", + olniepan_info: "限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。然后你选择获得以下技能中的一个:〖八阵〗/〖火计〗/〖看破〗。", + ol_weiyan: "界魏延", + ol_weiyan_prefix: "界", + reqimou: "奇谋", + reqimou_info: "限定技,出牌阶段,你可以失去任意点体力并摸等量的牌,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。", + ol_xiaoqiao: "界小乔", + ol_xiaoqiao_prefix: "界", + rehongyan: "红颜", + rehongyan_info: "锁定技,你区域内的黑桃牌和黑桃判定牌均视为红桃。当你于回合外正面朝上失去红桃牌后,若你的手牌数小于体力值,你摸一张牌。", + reluoying: "落英", + reluoying_discard: "落英", + reluoying_judge: "落英", + reluoying_info: "当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。", + rejiushi: "酒诗", + rejiushi_info: "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面并获得牌堆中的一张随机锦囊。", + rejiushi1: "酒诗", + rejiushi3: "酒诗", + rejiushi_mark: "酒诗·改", + rejiushi_mark_info: "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。", + chengzhang: "成章", + chengzhang_info: "觉醒技,准备阶段开始时,若你造成伤害与受到伤害值之和累计7点或以上,则你回复1点体力并摸一张牌,然后改写〖酒诗〗。", + re_wuyi: "界吴懿", + re_wuyi_prefix: "界", + re_zhuran: "界朱然", + re_zhuran_prefix: "界", + re_quancong: "界全琮", + re_quancong_prefix: "界", + re_liaohua: "界廖化", + re_liaohua_prefix: "界", + re_guohuai: "界郭淮", + re_guohuai_prefix: "界", + re_chengpu: "界程普", + re_chengpu_prefix: "界", + rechunlao: "醇醪", + rechunlao2: "醇醪", + rechunlao_info: "出牌阶段结束时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】,然后若此“醇”的属性为:火,你回复1点体力、雷,你摸两张牌。", + re_caozhang: "界曹彰", + re_caozhang_prefix: "界", + yujin_yujin: "界于禁", + yujin_yujin_prefix: "界", + rexuanfeng: "旋风", + rexuanfeng_info: "当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌,或将一名其他角色装备区内的一张牌移动到另一名其他角色的装备区内。", + olpaoxiao: "咆哮", + olpaoxiao2: "咆哮", + olpaoxiao_info: "①锁定技,你使用【杀】无次数限制。②锁定技,当你使用的【杀】被【闪】抵消时,你获得一枚“咆”(→)当你因【杀】造成伤害时,你弃置所有“咆”并令伤害值+X(X为“咆”数)。回合结束后,你弃置所有“咆”。", + oltishen: "替身", + oltishen_info: "限定技,准备阶段,你可以将体力回复至上限,然后摸X张牌(X为你回复的体力值)。", + ollongdan: "龙胆", + ollongdan_info: "你可以将一张【杀】当做【闪】、【闪】当做【杀】、【酒】当做【桃】、【桃】当做【酒】使用或打出。", + olyajiao: "涯角", + olyajiao_info: "当你于回合外因使用或打出而失去手牌后,你可以亮出牌堆顶的一张牌。若这两张牌的类别相同,你可以将展示的牌交给一名角色;若类别不同,你可弃置攻击范围内包含你的角色区域里的一张牌。", + regongji: "弓骑", + regongji_info: "出牌阶段限一次,你可以弃置一张非基本牌,然后弃置一名其他角色的一张牌。锁定技,当你的装备区内有坐骑牌时,你的攻击范围无限。", + ol_sunjian: "界孙坚", + ol_sunjian_prefix: "界", + wulie: "武烈", + wulie2: "武烈", + wulie_info: "限定技,结束阶段,你可以失去任意点体力并指定等量的其他角色。这些角色各获得一枚「烈」。有「烈」的角色受到伤害时,其移去一枚「烈」,然后防止此伤害。", + re_sunluban: "界孙鲁班", + re_sunluban_prefix: "界", + re_masu: "界马谡", + re_masu_prefix: "界", + ol_pangde: "界庞德", + ol_pangde_prefix: "界", + rejianchu: "鞬出", + rejianchu_info: "当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌不为基本牌,此【杀】不可被【闪】响应且你本回合使用【杀】的次数上限+1,为基本牌,该角色获得此【杀】。", + re_taishici: "界太史慈", + re_taishici_prefix: "界", + hanzhan: "酣战", + hanzhan_gain: "酣战", + hanzhan_info: "①当你发起拼点时,或成为拼点的目标时,你可以令对方选择拼点牌的方式改为随机选择一张手牌。②当你拼点结束后,你可以获得本次拼点的拼点牌中点数最大的【杀】。", + re_jianyong: "界简雍", + re_jianyong_prefix: "界", + xin_xusheng: "界徐盛", + xin_xusheng_prefix: "界", + decadepojun: "破军", + decadepojun2: "破军", + decadepojun_info: "当你使用【杀】指定目标后,你可以将其的至多X张牌置于其武将牌上(X为其体力值)。若这些牌中:有装备牌,你将这些装备牌中的一张置于弃牌堆;有锦囊牌,你摸一张牌。其于回合结束时获得其武将牌上的这些牌。", + re_wangyi: "界王异", + re_wangyi_prefix: "界", + guanzhang: "关兴张苞", + rezishou: "自守", + rezishou2: "自守", + rezishou_info: "摸牌阶段,你可以多摸X张牌(X为存活势力数)。若如此做,本回合你对其他角色造成伤害时,防止此伤害。", + rezongshi: "宗室", + rezongshi_info: "锁定技,你的手牌上限+X(X为存活势力数)。准备阶段,若你的手牌数大于体力值,则你本回合内使用【杀】无次数限制。", + ol_dongzhuo: "界董卓", + ol_dongzhuo_prefix: "界", + olbaonue: "暴虐", + olbaonue_info: "主公技,其他群雄角色造成1点伤害后,你可进行判定,若为♠,你回复1点体力并获得判定牌。", + re_panzhangmazhong: "界潘璋马忠", + re_panzhangmazhong_prefix: "界", + re_hanhaoshihuan: "界韩浩史涣", + re_hanhaoshihuan_prefix: "界", + xinyicong: "义从", + xinyicong_info: "锁定技,你计算与其他角色的距离时-X,其他角色计算与你的距离时+Y。(X为你的体力值-1,Y为你的已损失体力值-1)", + oltianxiang: "天香", + oltianxiang_info: "当你受到伤害时,你可以弃置一张红桃牌,防止此伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。", + olhongyan: "红颜", + olhongyan_info: "锁定技,你的黑桃牌的花色视为红桃。若你的装备区内有红桃牌,则你的手牌上限基数视为体力上限。", + piaoling: "飘零", + piaoling_info: "结束阶段,你可以进行判定。若判定结果为红桃,则你选择一项:1.将此牌交给一名角色。若你交给了自己,则你弃置一张牌。2.将此牌置于牌堆顶。", + decadelihuo: "疠火", + decadelihuo2: "疠火", + decadelihuo3: "疠火", + decadelihuo_info: "当你声明使用普【杀】后,你可以将此【杀】改为火【杀】。当你使用火【杀】选择目标时,可以选择一个额外目标。你使用的火【杀】结算完成后,若此【杀】的目标数大于1且你因此【杀】造成过伤害,则你失去1点体力。", + decadechunlao: "醇醪", + decadechunlao2: "醇醪", + decadechunlao_info: "你可以对其他角色使用【酒(使用方法②)】。当你需要使用【酒】时,若你的武将牌未横置,则你可以将武将牌横置,然后视为使用【酒】。当你受到或造成伤害后,若伤害值大于1且你的武将牌横置,则你可以重置武将牌。", + rejuece: "绝策", + rejuece_info: "结束阶段,你可以对一名本回合内失去过牌的角色造成1点伤害。", + remieji: "灭计", + remieji_info: "出牌阶段限一次,你可以将一张黑色锦囊牌置于牌堆顶,然后令一名有牌的其他角色选择一项:交给你一张锦囊牌,或依次弃置两张非锦囊牌。", + re_manchong: "界满宠", + re_manchong_prefix: "界", + rejunxing: "峻刑", + rejunxing_info: "出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色。该角色选择一项:1.弃置X张牌并失去1点体力。2.翻面并摸X张牌。(X为你弃置的牌数)", + re_gongsunzan: "界公孙瓒", + re_gongsunzan_prefix: "界", + reqiaomeng: "趫猛", + reqiaomeng_info: "当你使用【杀】对一名角色造成伤害后,你可以弃置该角色区域内的一张牌。若此牌为坐骑牌,则你于此弃置事件结算结束后获得此牌。", + ol_dengai: "界邓艾", + ol_dengai_prefix: "界", + oltuntian: "屯田", + olzaoxian: "凿险", + oltuntian_info: "①当你于回合外失去牌后,或于回合内因弃置而失去【杀】后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。", + olzaoxian_info: "觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。你于当前回合结束后进行一个额外的回合。", + re_sunxiu: "界孙休", + re_sunxiu_prefix: "界", + re_caoxiu: "界曹休", + re_caoxiu_prefix: "界", + xin_lingtong: "界凌统", + xin_lingtong_prefix: "界", + decadexuanfeng: "旋风", + decadexuanfeng_info: "当你于弃牌阶段弃置过至少两张牌,或当你失去装备区里的牌后,若场上没有处于濒死状态的角色,则你可以弃置至多两名其他角色的共计两张牌。若此时处于你的回合内,你可以对其中一名目标角色造成1点伤害。", + yongjin: "勇进", + yongjin_info: "限定技,出牌阶段,你可以依次移动场上的至多三张不同的装备牌。", + xin_liubiao: "界刘表", + xin_liubiao_prefix: "界", + decadezishou: "自守", + decadezishou_zhiheng: "自守", + decadezishou_info: "摸牌阶段,你可以多摸X张牌(X为存活势力数);然后本回合你对其他角色造成伤害时,防止此伤害。结束阶段,若你本回合没有使用牌指定其他角色为目标,你可以弃置任意张花色不同的手牌,然后摸等量的牌。", + decadezongshi: "宗室", + decadezongshi_info: "锁定技,你的手牌上限+X(X为存活势力数)。你的回合外,若你的手牌数大于等于手牌上限,则当你成为延时类锦囊牌或无颜色的牌的目标后,你令此牌对你无效。", + re_fazheng: "界法正", + re_fazheng_prefix: "界", + reenyuan: "恩怨", + reenyuan1: "恩怨", + reenyuan2: "恩怨", + reenyuan_info: "当你获得一名其他角色的至少两张牌后,你可以令其摸一张牌。当你受到1点伤害后,你可令伤害来源选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。", + rexuanhuo: "眩惑", + rexuanhuo_info: "摸牌阶段结束时,你可以交给一名其他角色两张手牌,然后该角色选择一项:1. 视为对你选择的另一名角色使用任意一种【杀】或【决斗】,2. 交给你所有手牌。", + re_fuhuanghou: "界伏寿", + re_fuhuanghou_prefix: "界", + reqiuyuan: "求援", + reqiuyuan_info: "当你成为【杀】的目标时,你可选择另一名其他角色。除非该角色交给你一张除【杀】以外的基本牌,否则其也成为此【杀】的目标且该角色不能响应此【杀】。", + rezhuikong: "惴恐", + rezhuikong_info: "其他角色的回合开始时,若你已受伤,你可与其拼点:若你赢,本回合该角色只能对自己使用牌;若你没赢,你获得其拼点的牌,然后其视为对你使用一张【杀】。", + re_gongsunyuan: "界公孙渊", + re_gongsunyuan_prefix: "界", + rehuaiyi: "怀异", + rehuaiyi_info: "出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色:全部相同,你摸一张牌,并将此技能于本阶段内改为“限两次”,然后终止此技能的结算流程;不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。", + re_caozhen: "界曹真", + re_caozhen_prefix: "界", + residi: "司敌", + residi_push: "司敌", + residi2: "司敌", + residi3: "司敌", + residi_info: "结束阶段,你可以将一张非基本牌置于武将牌上,称为“司”。其他角色的出牌阶段开始时,你可以移去一张“司”。若如此做,其本阶段内不能使用或打出与“司”颜色相同的牌。此阶段结束时,若其于此阶段内未使用过:【杀】,你视为对其使用一张【杀】。锦囊牌,你摸两张牌。", + gz_re_xushu: "徐庶", + re_zhangchunhua: "界张春华", + re_zhangchunhua_prefix: "界", + xin_handang: "界韩当", + xin_handang_prefix: "界", + xingongji: "弓骑", + xingongji2: "弓骑", + xingongji_info: "出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限且使用与此牌花色相同的【杀】无次数限制直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。", + xinjiefan: "解烦", + xinjiefan_info: "限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。然后若游戏轮数为1,则你于此回合结束时恢复此技能。", + gzquanji: "权计", + gzquanji_info: "每回合每项各限一次。当你受到伤害后或造成伤害后,你可以摸一张牌,然后你将一张牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。", + gzpaiyi: "排异", + gzpaiyi_backup: "排异", + gzpaiyi_info: "出牌阶段限一次。你可以移去一张“权”并选择一名角色。令其摸X张牌(X为你的“权”数且至多为7)。然后若其手牌数大于你,则你对其造成1点伤害。", + ol_zhurong: "界祝融", + ol_zhurong_prefix: "界", + changbiao: "长标", + changbiao_info: "出牌阶段限一次,你可以将任意张手牌当做【杀】使用(无距离限制)。若你因此【杀】对目标角色造成过伤害,则你于出牌阶段结束时摸X张牌(X为此【杀】对应的实体牌数量)。", + re_zhoucang: "界周仓", + re_zhoucang_prefix: "界", + rezhongyong: "忠勇", + rezhongyong_info: "当你使用【杀】后,你可以将此【杀】以及目标角色使用的【闪】交给一名其他角色,若其获得的牌中有红色,则其可以对你攻击范围内的角色使用一张【杀】。若其获得的牌中有黑色,其摸一张牌。", + ollihuo: "疠火", + ollihuo2: "疠火", + ollihuo3: "疠火", + ollihuo4: "疠火", + ollihuo_info: "你使用普通的【杀】可以改为火【杀】,若此【杀】造成过伤害,你失去1点体力;你使用火【杀】可以多选择一个目标。你每回合使用的第一张牌如果是【杀】,则此【杀】结算完毕后可置于你的武将牌上。", + xinjiangchi: "将驰", + xinjiangchi_info: "出牌阶段开始时,你可选择:①摸一张牌。②摸两张牌,然后本回合内不能使用或打出【杀】。③弃置一张牌,然后本回合内可以多使用一张【杀】,且使用【杀】无距离限制。", + redingpin: "定品", + redingpin_info: "出牌阶段,你可以弃置一张本回合未使用过/弃置过的类型的牌并选择一名角色。其进行判定,若结果为:黑色,其摸X张牌(X为其体力值且至多为3)且本回合内不能再成为〖定品〗的目标;红桃,你令此次弃置的牌不计入〖定品〗弃置牌合法性的检测;方片,你将武将牌翻面。", + refaen: "法恩", + refaen_info: "一名角色翻面或横置后,你可令其摸一张牌。", + dcfaen: "法恩", + dcfaen_info: "一名角色翻至正面或横置后,你可令其摸一张牌。", + reshizhi: "矢志", + reshizhi_info: "锁定技,若你的体力值为1,则你的【闪】视为【杀】,且当你使用对应的实体牌为一张【闪】的非转化普通杀造成伤害后,你回复1点体力。", + re_guotufengji: "界郭图逢纪", + re_guotufengji_prefix: "界", + rejigong: "急攻", + rejigong2: "急攻", + rejigong_info: "出牌阶段开始时,你可以摸至多三张牌。若如此做,你本回合的手牌上限基数改为X,且弃牌阶段结束时,若X不小于Y,则你回复1点体力。(X为你本回合内造成的伤害值之和,Y为你本回合内因〖急攻〗摸牌而得到的牌的数量总和)", + ol_jiangwei: "界姜维", + ol_jiangwei_prefix: "界", + oltiaoxin: "挑衅", + oltiaoxin_info: "出牌阶段限一次,你可以选择一名攻击范围内包含你的角色。然后除非该角色对你使用一张【杀】且此【杀】对你造成伤害,否则你弃置其一张牌,然后将此技能于此出牌阶段内修改为出牌阶段限两次。", + olzhiji: "志继", + olzhiji_info: "觉醒技,准备阶段或结束阶段,若你没有手牌,你回复1点体力或摸两张牌,然后减1点体力上限,获得〖观星〗。", + decadezhenjun: "镇军", + decadezhenjun_info: "准备阶段或结束阶段,你可以弃置一名角色X张牌(X为其手牌数减体力值且至少为1),若其中没有装备牌,你选择一项:1.你弃一张牌;2.该角色摸等量的牌。", + decadejingce: "精策", + decadejingce_info: "结束阶段,若你本回合使用过的牌数不小于你的体力值,则你可执行一个摸牌阶段或出牌阶段;若这些牌包含的花色数也不小于你的体力值,则你将“或”改为“并”。", + re_guanping: "界关平", + re_guanping_prefix: "界", + relongyin: "龙吟", + relongyin_info: "当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数。若此【杀】为红色,则你摸一张牌;若你以此法弃置的牌与此【杀】点数相同,则你重置“竭忠”。", + jiezhong: "竭忠", + jiezhong_info: "限定技,出牌阶段开始时,你可以将手牌补至体力上限(至多摸五张)。", + re_caifuren: "界蔡夫人", + re_caifuren_prefix: "界", + reqieting: "窃听", + reqieting_info: "其他角色的回合结束时,若其本回合内未造成过伤害,则你可将其装备区内的一张牌置于你的装备区内;若其本回合内未对其他角色使用过牌,则你可摸一张牌。", + rexianzhou: "献州", + rexianzhou_info: "限定技。出牌阶段,你可将装备区内的所有牌交给一名其他角色。你回复X点体力,然后对其攻击范围内的至多X名角色各造成1点伤害(X为你以此法给出的牌数)。", + xin_zhonghui: "界钟会", + xin_zhonghui_prefix: "界", + xinquanji: "权计", + xinquanji_info: "①当你受到1点伤害后,或其他角色不因你的赠予或交给而得到你的牌后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”。②你的手牌上限+X(X为“权”的数量)。", + xinzili: "自立", + xinzili_info: "觉醒技。准备阶段,若你的“权”数大于2,则你回复1点体力并摸两张牌,减1点体力上限并获得〖排异〗。", + xinpaiyi: "排异", + xinpaiyi_backup: "排异", + xinpaiyi_info: "出牌阶段每项各限一次,你可移去一张“权”并选择一项:①令一名角色摸X张牌。②对至多X名角色各造成1点伤害。(X为“权”数)", + re_guyong: "界顾雍", + re_guyong_prefix: "界", + reshenxing: "慎行", + reshenxing_info: "出牌阶段,你可以弃置X张牌(X为你本阶段内发动过〖慎行〗的次数且至少为0,至多为2),然后摸一张牌。", + rebingyi: "秉壹", + rebingyi_info: "结束阶段,你可展示所有手牌。若这些牌:颜色均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数);点数均相同,则你摸一张牌。", + re_jiaxu: "界贾诩", + re_jiaxu_prefix: "界", + rewansha: "完杀", + rewansha_info: "锁定技。①你的回合内,不处于濒死状态的其他角色不能使用【桃】。②当有角色于你的回合内进入濒死状态时,你令其以外的所有其他角色的非锁定技失效直到此濒死状态结算结束。", + reluanwu: "乱武", + reluanwu_info: "限定技,出牌阶段,你可令所有其他角色依次选择一项:①对距离最近(或之一)的角色使用一张【杀】;②失去1点体力。结算完成后,你可视为使用一张【杀】(无距离限制)。", + reweimu: "帷幕", + reweimu_info: "锁定技。①你不能成为黑色锦囊牌的目标。②当你于回合内受到伤害时,你防止此伤害并摸2X张牌(X为伤害值)。", + ol_lusu: "界鲁肃", + ol_lusu_prefix: "界", + olhaoshi: "好施", + olhaoshi_info: "摸牌阶段开始时,你可以多摸两张牌。然后摸牌阶段结束时,若你的手牌数大于5,则你将手牌数的一半(向下取整)交给一名手牌最少其他角色并获得如下效果直到你下回合开始:当你成为【杀】或普通锦囊牌的目标后,其可以交给你一张手牌。", + oldimeng: "缔盟", + oldimeng_info: "出牌阶段限一次,你可令两名满足X≤Y的其他角色交换手牌并获得如下效果:出牌阶段结束时,你弃置X张牌(X为这两名角色手牌数之差的绝对值;Y为你的牌数)。", + + rejijiang: "激将", + rejijiang1: "激将", + rejijiang2: "激将", + rejijiang_info: "主公技。①当你需要使用或打出【杀】时,你可以令其他蜀势力角色依次选择是否打出一张【杀】。若有角色响应,则你视为使用或打出了此【杀】。②每回合限一次。当有蜀势力角色于回合外使用或打出【杀】时,其可以令你摸一张牌。", + xin_yufan: "界虞翻", + xin_yufan_prefix: "界", + xinzongxuan: "纵玄", + xinzongxuan_info: "当你的牌因弃置而进入弃牌堆后,你可将其中的任意张牌置于牌堆顶。若剩余的牌中有锦囊牌,则你可以令一名其他角色获得其中的一张。", + xinzhiyan: "直言", + xinzhiyan_info: "结束阶段开始时,你可令一名角色摸一张牌(正面朝上移动)。若此牌为基本牌,则你摸一张牌。若此牌为装备牌,则其回复1点体力并使用此装备牌。", + re_xiahoushi: "界夏侯氏", + re_xiahoushi_prefix: "界", + reqiaoshi: "樵拾", + reqiaoshi_info: "其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。若这两张牌花色相同,则你可以重复此步骤。", + reyanyu: "燕语", + reyanyu2: "燕语", + reyanyu_info: "①出牌阶段,你可以重铸【杀】。②出牌阶段结束时,你可以令一名其他男性角色摸X张牌(X为你本阶段内发动过〖燕语①〗的次数且至多为3)。", + rehujia: "护驾", + rehujia_info: "主公技。①当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。②每回合限一次。当有魏势力角色于回合外使用或打出【闪】时,其可以令你摸一张牌。", + ol_xuhuang: "界徐晃", + ol_xuhuang_prefix: "界", + olduanliang: "断粮", + olduanliang_info: "你可以将一张黑色非锦囊牌当做【兵粮寸断】使用。若你于当前回合内未造成过伤害,则你使用【兵粮寸断】无距离限制。", + oljiezi: "截辎", + oljiezi_info: "①当有角色跳过摸牌阶段后,你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。②一名角色的摸牌阶段结束时,若其有“辎”,则你移去其“辎”,然后令其获得一个额外的摸牌阶段。", + re_madai: "界马岱", + re_madai_prefix: "界", + reqianxi: "潜袭", + reqianxi_info: "准备阶段开始时,你可摸一张牌,然后弃置一张牌并选择一名距离为1的其他角色。该角色于本回合内:{不能使用或打出与此牌颜色相同的牌,且其装备区内与此牌颜色相同的防具牌无效,且当其回复体力时,你摸两张牌。}", + re_guohuanghou: "界郭皇后", + re_guohuanghou_prefix: "界", + rejiaozhao: "矫诏", + rejiaozhao_info: "出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。", + rejiaozhao_lv2: "矫诏·升级 Lv.1", + rejiaozhao_lv2_info: "出牌阶段限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用(你不是此牌的合法目标)。", + rejiaozhao_lv3: "矫诏·升级 Lv.2", + rejiaozhao_lv3_info: "出牌阶段每种类型各限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用。", + redanxin: "殚心", + redanxin_info: "当你受到伤害后,你可以摸一张牌并升级〖矫诏〗。", + xin_wuguotai: "界吴国太", + xin_wuguotai_prefix: "界", + xinganlu: "甘露", + xinganlu_info: "出牌阶段限一次。你可以令两名角色交换装备区内的牌,然后若这两名角色装备区内牌数差的绝对值大于你已损失的体力值,则你弃置两张手牌。", + xinbuyi: "补益", + xinbuyi_info: "一名角色进入濒死状态时,你可展示其一张手牌。若此牌不为基本牌,则其弃置此牌并回复1点体力。若其以此法弃置的牌移动前为其的唯一一张手牌,则其摸一张牌。", + decadexianzhen: "陷阵", + decadexianzhen2: "陷阵", + decadexianzhen_info: "每回合限一次。出牌阶段,你可以和一名其他角色拼点。若你赢:本回合你无视该角色的防具,且对其使用牌没有次数和距离限制,且本回合对其使用牌造成伤害时,此伤害+1(每种牌名每回合限一次);若你没赢:你本回合内不能使用【杀】,且【杀】不计入手牌上限。", + decadejinjiu: "禁酒", + decadejinjiu_info: "锁定技。你的【酒】的牌名均视为【杀】且点数视为K;你的回合内,其他角色不能使用【酒】。", + dc_xushu: "新杀徐庶", + dc_xushu_prefix: "新杀", + rezhuhai: "诛害", + rezhuhai_info: "其他角色的回合结束时,若其本回合内造成过伤害,则你可以选择一项:⒈将一张手牌当做【杀】对其使用。⒉视为对其使用一张【过河拆桥】。", + xsqianxin: "潜心", + xsqianxin_info: "觉醒技。当你造成伤害后,若你已受伤,则你减1点体力上限并获得〖荐言〗。", + rejianyan: "荐言", + rejianyan_info: "出牌阶段每项各限一次。你可选择一种颜色或一种牌的类别,然后系统从牌堆中检索出一张满足该条件的牌并展示之。然后你将此牌交给一名男性角色或Key势力角色。", + re_zhanghe: "界张郃", + re_zhanghe_prefix: "界", + reqiaobian: "巧变", + reqiaobian_info: "①游戏开始时,你获得两枚“变”。②判定阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段。③摸牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段,然后可以获得至多两名其他角色的各一张手牌。④出牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段,然后你可以移动场上的一张牌。⑤弃牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段。⑥结束阶段,若你的〖巧变⑥〗记录中不包含你的手牌数,则你获得一枚“变”并记录你的手牌数。", + olbeige: "悲歌", + olbeige_info: "当有角色受到渠道为【杀】的伤害后,若你有牌,你可令其进行判定。然后你可弃置一张牌,根据判定结果执行以下的一个选项:♥,其回复1点体力;♦,其摸两张牌;♣,伤害来源弃置两张牌️;♠,伤害来源将武将牌翻面。若你弃置的牌与判定结果:点数相同,则你获得你弃置的牌;花色相同,则你获得判定牌。", + dc_bulianshi: "界步练师", + dc_bulianshi_prefix: "界", + dcanxu: "安恤", + dcanxu_info: "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌;若这两名角色手牌数相等,则你回复1点体力。", + dczhuiyi: "追忆", + dczhuiyi_info: "当你死亡时,你可以令一名不为击杀者的其他角色摸X张牌(X为存活角色数),然后其回复1点体力。", + re_jushou: "界沮授", + re_jushou_prefix: "界", + dcshibei: "矢北", + dcshibei_info: "锁定技,当你于一回合内第一次受到伤害后,你回复1点体力;当你于一回合内第二次受到伤害后,你失去1点体力。", + dcjianying: "渐营", + dcjianying_info: "当你使用与你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。", + re_duji: "界杜畿", + re_duji_prefix: "界", + reandong: "安东", + reandong_info: "当你受到其他角色造成的伤害时,你可以令伤害来源选择一项:⒈防止此伤害。然后其♥牌不计入本回合的手牌上限;⒉你观看其手牌并获得其中的所有♥牌,若其没有手牌,则你下次发动〖安东〗时改为自行选择。", + reyingshi: "应势", + reyingshi_info: "出牌阶段开始时,你可以展示一张手牌,选择一名角色A和一名其他角色B。A可以对B使用一张【杀】,然后获得你展示的牌。若A因此【杀】造成过伤害,则A获得牌堆中与展示牌花色点数相同的其他牌。", + dcqiaomeng: "趫猛", + dcqiaomeng_info: "当你使用黑色牌指定第一个目标后,你可以弃置目标角色中一名其他角色的一张牌。若你以此法弃置的牌为:装备牌,你获得此牌;锦囊牌,你令此牌不可被响应。", + dc_gongsunzan: "新杀公孙瓒", + dc_gongsunzan_prefix: "新杀", + re_liuchen: "界刘谌", + re_liuchen_prefix: "界", + rezhanjue: "战绝", + rezhanjue_effect: "战绝", + rezhanjue_info: "出牌阶段,若你本阶段内因〖战绝〗得到过的牌数小于3,则你可以将所有不具有“勤王”标记的手牌当做【决斗】使用。此【决斗】使用结算结束后,你摸一张牌。然后所有因此【决斗】受到过伤害的角色也各摸一张牌。", + reqinwang: "勤王", + reqinwang_info: "主公技。出牌阶段限一次,你可以令所有其他蜀势力角色依次选择是否交给你一张【杀】,然后你可以令选择是的角色摸一张牌。", + shizhan: "势斩", + shizhan_info: "出牌阶段限两次,你可以选择一名其他角色。该角色视为对你使用一张【决斗】。", + ol_xunyu: "界荀彧", + ol_xunyu_prefix: "界", + oljieming: "节命", + oljieming_info: "当你受到1点伤害后或死亡时,你可令一名角色摸X张牌。然后若其手牌数大于X,则其将手牌弃置至X张(X为其体力上限且至多为5)。", + re_liufeng: "界刘封", + re_liufeng_prefix: "界", + rexiansi: "陷嗣", + rexiansi2: "陷嗣", + rexiansi_info: "①准备阶段开始时,你可以将一至两名角色的各一张牌置于你的武将牌上,称为“逆”。②当一名角色需要对你使用【杀】时,其可以移去两张“逆”,然后视为对你使用一张【杀】。③若你的“逆”数大于体力值,则你可以移去一张“逆”并视为使用一张【杀】。", + re_sp_taishici: "界SP太史慈", + re_sp_taishici_prefix: "界SP", + rejixu: "击虚", + rejixu_info: "出牌阶段限一次。若你有手牌,则你可以选择至多X名角色,令这些角色猜测你的手牌区中是否有【杀】。若你:有【杀】,则你本阶段使用【杀】的次数上限+Y,且当你于本阶段内使用【杀】指定目标后,你可以令这Y名角色也成为此【杀】的目标;没有【杀】,则你弃置这Y名角色的各一张牌。然后你摸Y张牌(X为你的体力值,Y为这些角色中猜错的角色数)。", + ol_dianwei: "界典韦", + ol_dianwei_prefix: "界", + olqiangxi: "强袭", + olqiangxi_info: "出牌阶段限两次。你可以弃置一张武器牌或受到1点无来源伤害,然后对一名本回合内未成为过〖强袭〗目标的其他角色造成1点伤害。", + olningwu: "狞恶", + olningwu_info: "锁定技。当一名角色A于一回合内第二次受到伤害后,若A或伤害来源为你,则你摸一张牌,然后弃置其装备区或判定区内的一张牌。", + re_zhuhuan: "界朱桓", + re_zhuhuan_prefix: "界", + refenli: "奋励", + refenli_info: "若你的手牌数为全场最多,你可以跳过判定阶段和摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。", + //破界石不值钱了 就逮着免费突破硬削是吧 + repingkou: "平寇", + repingkou_info: "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。若你选择的角色数小于X,则你可以弃置其中一名角色装备区内的一张牌。", + dc_liru: "界李儒", + dc_liru_prefix: "界", + dcmieji: "灭计", + dcmieji_info: "出牌阶段限一次,你可以展示一张武器牌或黑色锦囊牌。你将此牌置于牌堆顶,然后令一名有手牌的其他角色选择一项:⒈弃置一张锦囊牌;⒉依次弃置两张非锦囊牌。", + dcfencheng: "焚城", + dcfencheng_info: "限定技。出牌阶段,你可以指定一名其他角色,令从其开始的其他角色依次选择一项:⒈弃置至少X张牌(X为上一名角色弃置的牌数+1)。⒉你对其造成2点火焰伤害。", + oljiang: "激昂", + oljiang_info: "①当你使用【决斗】或红色【杀】指定第一个目标后,或成为【决斗】或红色【杀】的目标后,你可以摸一张牌。②当有【决斗】或红色【杀】于每回合内首次因弃置而进入弃牌堆后,你可以失去1点体力并获得这些牌。", + re_xunyou: "界荀攸", + re_xunyou_prefix: "界", + reqice: "奇策", + reqice_info: "出牌阶段限X次(X为你的“奇策”数+1),你可以将所有手牌当做任意一张普通锦囊牌使用。", + rezhiyu: "智愚", + rezhiyu_info: "当你受到伤害后,你可以摸一张牌,然后展示所有手牌,令伤害来源弃置一张手牌。若你展示的牌颜色均相同,你获得1枚“奇策”直到下回合结束且获得来源弃置的牌。", + re_caiyong: "界蔡邕", + re_caiyong_prefix: "界", + rebizhuan: "辟撰", + rebizhuan_bg: "书", + rebizhuan_info: "①当你使用♠牌时,或成为其他角色使用♠牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”(你至多拥有四张“书”)。②你的手牌上限+X(X为“书”数)。", + retongbo: "通博", + retongbo_info: "摸牌阶段结束时,你可以用任意手牌交换等量“书”。然后若“书”数至少为4,你可以将四张“书”任意交给其他角色。若你交出的牌花色各不相同,你回复1点体力且“书”的上限+1(至多增加等同存活角色数的上限)。", + re_chengong: "界陈宫", + re_chengong_prefix: "界", + remingce: "明策", + remingce_info: "出牌阶段限一次。你可以将一张【杀】或装备牌交给一名其他角色,其选择一项:1.视为对你选择的另一名角色使用一张【杀】,且若此牌造成伤害,则执行选项2;2.你与其各摸一张牌。", + re_sundeng: "界孙登", + re_sundeng_prefix: "界", + rekuangbi: "匡弼", + rekuangbi_info: "出牌阶段开始时,你可以令一名其他角色将至多三张牌置于你的武将牌上直到此阶段结束。然后当你使用牌时,若你:有与此牌花色相同的“匡弼”牌,你移去其中一张并与其各摸一张牌;没有与此牌花色相同的“匡弼”牌,你随机移去一张“匡弼”牌并摸一张牌。", + dc_chenqun: "界陈群", + dc_chenqun_prefix: "界", + repindi: "品第", + repindi_info: "出牌阶段每名角色限一次。你可以弃置一张本阶段未以此法弃置过的类型的牌并选择一名角色,你选择一项:1.其摸X张牌;2.其弃置X张牌(X为你本回合发动〖品第〗的次数)。然后若其已受伤,你横置或重置。", + re_mazhong: "界马忠", + re_mazhong_prefix: "界", + refuman: "抚蛮", + refuman_info: "出牌阶段每名角色限一次。你可以弃置一张牌,令一名其他角色从弃牌堆中获得一张【杀】。然后其于其下个回合结束前使用或打出此牌时,你与其各摸一张牌。", + re_guanzhang: "界关兴张苞", + re_guanzhang_prefix: "界", + retongxin: "同心", + retongxin_info: "锁定技。你的攻击范围+2。", + re_wenpin: "界文聘", + re_wenpin_prefix: "界", + rezhenwei: "镇卫", + rezhenwei_info: "当一名其他角色成为【杀】或黑色锦囊牌的目标时,若该角色的体力值不大于你且此牌的目标角色数为1,你可以弃置一张牌并选择一项:1.摸一张牌,然后将此【杀】或黑色锦囊牌的目标转移给你;2.令此【杀】或黑色锦囊牌无效且将此【杀】或黑色锦囊牌置于使用者的武将牌上,然后当前回合结束后,使用者获得这些牌。", + ol_huangzhong: "界黄忠", + ol_huangzhong_prefix: "界", + remoshi: "没矢", + remoshi_info: "锁定技。①当你使用【杀】对目标角色造成伤害后,若其装备区里有防具牌或坐骑牌,你将此【杀】对应的实体牌置于其武将牌上。②当有“没矢”牌的角色失去防具牌或坐骑牌后,你获得其“没矢”牌。", + dc_caozhi: "界曹植", + dc_caozhi_prefix: "界", + dcjiushi: "酒诗", + dcjiushi_info: "①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌于受到伤害时背面向上,你可以翻面。③当你使用【酒】后,你使用【杀】的次数上限+1直到你的下个回合结束。", + olhuoji: "火计", + olhuoji_info: "①你可以将一张红色牌当【火攻】使用。②你使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。", + olkanpo: "看破", + olkanpo_info: "①你可以将一张黑色牌当【无懈可击】使用。②你使用的【无懈可击】不可被响应。", + xinwangxi: "忘隙", + xinwangxi_info: "当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可以摸两张牌,然后交给其一张牌。", + ol_yanwen: "界颜良文丑", + ol_yanwen_prefix: "界", + olshuangxiong: "双雄", + olshuangxiong_info: "①摸牌阶段结束时,你可以弃置一张牌。若如此做,你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用。②结束阶段,你从弃牌堆中获得本回合内对你造成伤害的所有牌。", + re_zhuzhi: "界朱治", + re_zhuzhi_prefix: "界", + reanguo: "安国", + reanguo_info: "出牌阶段限一次。你可以选择一名其他角色,若其:手牌数为全场最少,其摸一张牌;体力值为全场最低,其回复1点体力;装备区内牌数为全场最少,其随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。若你与其执行了全部分支,你可以重铸任意张牌。", + dcyicong: "义从", + dcyicong_info: "锁定技。①你至其他角色的距离-1。②若你已损失的体力值不小于2,则其他角色至你的距离+1。", + re_zhangsong: "界张松", + re_zhangsong_prefix: "界", + rexiantu: "献图", + rexiantu_info: "其他角色的出牌阶段开始时,你可以摸两张牌,然后将两张牌交给该角色。然后此阶段结束时,若其于此阶段没有造成过伤害,你失去1点体力。", + re_jsp_huangyueying: "界SP黄月英", + re_jsp_huangyueying_prefix: "界SP", + rejiqiao: "机巧", + rejiqiao_info: "出牌阶段开始时,你可以弃置任意张牌,然后亮出牌堆顶X张牌(X为你以此法弃置的牌数与其中装备牌数之和),你获得其中所有非装备牌。", + relinglong: "玲珑", + relinglong_info: "锁定技。若你的装备区:有空置的防具栏,你视为拥有〖八卦阵〗;有空置的两种坐骑栏,你的手牌上限+2;有空置的宝物栏,你视为拥有〖奇才〗;以上均满足:你使用的【杀】或普通锦囊牌不可被响应。", + ol_zhangzhang: "界张昭张纮", + ol_zhangzhang_prefix: "界", + olzhijian: "直谏", + olzhijian_info: "出牌阶段,你可以将一张装备牌置于其他角色的装备区(可替换原装备),然后摸一张牌。", + olguzheng: "固政", + olguzheng_info: "每阶段限一次。当其他角色的至少两张牌因弃置而进入弃牌堆后,你可以令其获得其中一张牌,然后你可以获得剩余的牌。", + re_caochong: "界曹冲", + re_caochong_prefix: "界", + rechengxiang: "称象", + rechengxiang_info: "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。若你得到的牌点数之和为13,你复原武将牌。", + re_caorui: "界曹叡", + re_caorui_prefix: "界", + remingjian: "明鉴", + remingjian_info: "出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合获得如下效果:1.手牌上限与使用【杀】的次数上限+1;2.当该角色首次造成伤害后,其可以令你发动一次〖恢拓〗。", + rexingshuai: "兴衰", + rexingshuai_info: "主公技,限定技。当你进入濒死状态时,你可令其他魏势力角色依次选择是否令你回复1点体力。然后这些角色依次受到1点伤害。有〖明鉴〗效果的角色于其回合内杀死角色后,你重置〖兴衰〗。", + xin_zhangliang: "界张梁", + xin_zhangliang_prefix: "界", + rejijun: "集军", + rejijun_info: "当你使用目标角色含有自己的牌结算完毕后,你可以进行一次判定并将判定牌置于武将牌上,称为“方”。", + refangtong: "方统", + refangtong_info: "结束阶段,你可以将一张手牌置于武将牌上,称为“方”。若如此做,你可以移去任意张“方”并对一名其他角色造成1点雷属性伤害(若你移去的“方”的点数和大于36,则改为造成3点雷属性伤害)。", + re_simalang: "界司马朗", + re_simalang_prefix: "界", + requji: "去疾", + requji_info: "出牌阶段限一次,你可以弃置至多X张牌并令等量名角色回复1点体力,然后仍处于受伤状态的目标角色摸一张牌,若你以此法弃置了黑色牌,你失去1点体力(X为你已损失的体力值)。", + rejunbing: "郡兵", + rejunbing_info: "一名角色的结束阶段,若其手牌数小于其体力值,其可以摸一张牌并将所有手牌交给你,然后你可以交给其等量的牌。", + re_zhugedan: "界诸葛诞", + re_zhugedan_prefix: "界", + regongao: "功獒", + regongao_info: "锁定技。一名其他角色首次进入濒死状态时,你增加1点体力上限,然后回复1点体力。", + rejuyi: "举义", + rejuyi_info: "觉醒技。准备阶段,若你已受伤,且你的体力上限大于场上的存活角色数,你将手牌数摸至体力上限,然后获得技能〖崩坏〗和〖威重〗。", + reweizhong: "威重", + reweizhong_info: "锁定技。当你的体力上限增加或减少时,你摸两张牌。", + re_zhongyao: "界钟繇", + re_zhongyao_prefix: "界", + rehuomo: "活墨", + rehuomo_info: "每种牌名每回合限一次。当你需要使用一张基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。", + zhoutai: "界周泰", + zhoutai_prefix: "界", + caoren: "界曹仁", + caoren_prefix: "界", + ollianhuan: "连环", + ollianhuan_info: "你可以将一张♣牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。", + re_lidian: "界李典", + gz_re_lidian: "李典", + re_lidian_prefix: "界", + re_xushu: "界徐庶", + re_xushu_prefix: "界", + rejianxiong_old: "奸雄", + rejianxiong_old_info: "当你受到伤害后,你可以摸一张牌或获得对你造成伤害的牌。", +}; + +export default translates; diff --git a/character/refresh/voices.js b/character/refresh/voices.js new file mode 100644 index 000000000..1c3eef4fd --- /dev/null +++ b/character/refresh/voices.js @@ -0,0 +1,637 @@ +export default { + "#zhuhai1": "善恶有报,天道轮回!", + "#zhuhai2": "早知今日,何必当初!", + "#qianxin1": "既遇明主,天下可图!", + "#qianxin2": "弃武从文,安邦卫国!", + "#re_xushu:die": "母亲……孩儿……尽孝来了。", + "#xunxun1": "众将死战,非我之功。", + "#xunxun2": "爱兵如子,胜乃可全。", + "#wangxi1": "大丈夫,何拘小节。", + "#wangxi2": "前尘往事,莫再提起。", + "#re_lidian:die": "报国杀敌,虽死犹荣……", + "#huomo_re_zhongyao1": "笔墨抒胸臆,妙手成汗青。", + "#huomo_re_zhongyao2": "胸蕴大家之行,则下笔如有神助。", + "#zuoding_re_zhongyao1": "腹有大才,可助阁下成事。", + "#zuoding_re_zhongyao2": "胸有良策,可济将军之危。", + "#re_zhongyao:die": "人有寿终日,笔有墨尽时。", + "#rejijun1": null, + "#rejijun2": null, + "#refangtong1": null, + "#refangtong2": null, + "#xin_zhangliang:die": null, + "#requji1": null, + "#requji2": null, + "#rejunbing1": null, + "#rejunbing2": null, + "#re_simalang:die": "微功未效,有辱国恩……", + "#regongao1": null, + "#regongao2": null, + "#rejuyi1": null, + "#rejuyi2": null, + "#re_zhugedan:die": "诸葛一氏定会为我复仇!", + "#huituo_re_caorui1": null, + "#huituo_re_caorui2": null, + "#remingjian1": null, + "#remingjian2": null, + "#rexingshuai1": null, + "#rexingshuai2": null, + "#re_caorui:die": "悔不该耽于逸乐,至有今日……", + "#rechengxiang1": "冲有一法,可得其重。", + "#rechengxiang2": "待我细细算来。", + "#renxin_re_caochong1": "见死而不救,非仁者所为。", + "#renxin_re_caochong2": "遇难而不援,非我之道也。", + "#re_caochong:die": "父亲,兄长……", + "#olzhijian1": "君有恙,臣等当舍命除之。", + "#olzhijian2": "臣有言在喉,不吐不快。", + "#olguzheng1": "兴国为任,可驱百里之行。", + "#olguzheng2": "固政之责,在君亦在臣。", + "#ol_zhangzhang:die": "老臣年迈,无力为继……", + "#rejiqiao1": "机关将作之术,在乎手巧心灵。", + "#rejiqiao2": "机巧藏于心,亦如君之容。", + "#relinglong1": "我夫所赠之玫,遗香自长存。", + "#relinglong2": "心有玲珑罩,不殇春与秋。", + "#re_jsp_huangyueying:die": "此心欲留夏,奈何秋风起……", + "#qiangzhi_re_zhangsong1": "过目难忘,千载在我腹间。", + "#qiangzhi_re_zhangsong2": "吾目为镜,可照世间文字。", + "#rexiantu1": "此图载益州山水,请君纳之。", + "#rexiantu2": "我献梧木一株,为引凤而来。", + "#re_zhangsong:die": "恨未见使君,入主益州……", + "#reanguo1": "非武不可安邦,非兵不可定国。", + "#reanguo2": "天下纷乱,正是吾等用武之时。", + "#re_zhuzhi:die": "刀在人在,刀折人亡……", + "#reluoying_dc_caozhi1": "花落断情伤,心碎斩痴妄。", + "#reluoying_dc_caozhi2": "流水不言恨,落英难解愁。", + "#dcjiushi1": "花开易见落难寻。", + "#dcjiushi2": "金樽盛清酒,烟景入诗篇。", + "#dc_caozhi:die": "一生轻松待来生……", + "#liegong_ol_huangzhong1": "龙骨成镞,矢破苍穹!", + "#liegong_ol_huangzhong2": "凤翎为羽,箭没坚城!", + "#remoshi1": null, + "#remoshi2": null, + "#ol_huangzhong:die": "末将,有负主公重托……", + "#zhenwei_re_wenpin1": "想攻城,问过我没有?", + "#zhenwei_re_wenpin2": "有我坐镇,我军焉能有失?", + "#re_wenpin:die": "没想到,敌军的攻势如此凌厉。", + "#fuhun_re_guanzhang1": "擎刀执矛,以效先父之法!", + "#fuhun_re_guanzhang2": "苍天在上,儿必不堕父亲威名!", + "#retongxin": null, + "#retongxin1": null, + "#retongxin2": null, + "#re_guanzhang:die": "马革裹尸,九泉之下无愧见父……", + "#refuman1": "蛮夷畏威,杀之积怨,抚之怀德。", + "#refuman2": "以威镇夷,宜抚之,勿戾之。", + "#re_mazhong:die": "愿付此生,见汉蛮一家。", + "#repindi1": "以九品论才,正是栋梁之谋。", + "#repindi2": "置州郡中正,可为百年之政。", + "#refaen_dc_chenqun1": "国法虽严,然不外乎于情。", + "#refaen_dc_chenqun2": "律令如铁,亦有可商榷之处。", + "#dc_chenqun:die": "吾身虽亡,然吾志当遗百年……", + "#rekuangbi1": "江东多娇,士当弼国以全方圆。", + "#rekuangbi2": "吴垒锦绣,卿当匡佐使延万年。", + "#re_sundeng:die": "此别无期,此恨绵绵。", + "#rebizhuan1": "笔书石碑以助群儒正道。", + "#rebizhuan2": "正定六经是为天下之法。", + "#retongbo1": "博览诗书通古圣之学。", + "#retongbo2": "通读经典悟群贤之道。", + "#re_caiyong:die": "乞受刑罚,以求继承汉史?", + "#remingce1": "阁下若纳此谋,则大业可成也!", + "#remingce2": "形势如此,将军可按计行事。", + "#zhichi_re_chengong1": "不若先行退避,再做打算。", + "#zhichi_re_chengong2": "敌势汹汹,不宜与其交锋。", + "#re_chengong:die": "一步迟,步步迟啊!", + "#reqice1": "攸已有妙计在胸,此事不足为虑。", + "#reqice2": "主公勿虑,攸有奇策,可解此局。", + "#rezhiyu1": "经达权变,大智若愚。", + "#rezhiyu2": "微末伎俩,让阁下见笑了。", + "#re_xunyou:die": "再不能替主公出谋了。", + "#juece_dc_liru1": "乏谋少计,别做无谓挣扎了!", + "#juece_dc_liru2": "缺兵少粮,看你还能如何应对?", + "#dcmieji1": "欲成大事,当弃则弃,怎可优柔寡断?", + "#dcmieji2": "所谓智斗,便是以兑子入局取势,而后成杀。", + "#dcfencheng1": "堆薪聚垛,以燃焚天之焰!", + "#dcfencheng2": "就让这熊熊烈焰,为尔等送葬!", + "#dc_liru:die": "多行不义,必自毙……", + "#refenli1": "兵威已振,怎能踟蹰不前?", + "#refenli2": "敌势汹汹,自当奋勇以对。", + "#repingkou1": "群寇蜂起,以军平之。", + "#repingkou2": "所到之处,寇患皆平。", + "#re_zhuhuan:die": "憾老死病榻,恨未马革裹尸。", + "#qiangxi_ol_dianwei1": "典韦来也,谁敢一战。", + "#qiangxi_ol_dianwei2": "双戟青罡,百死无生!", + "#olningwu1": "古之恶来,今之典韦!", + "#olningwu2": "宁为刀俎,不为鱼肉。", + "#ol_dianwei:die": "为将者,怎可徒手而亡?", + "#rejixu1": "辨坚识钝,可解充栋之牛!", + "#rejixu2": "以锐欺虚,可击泰山之踵!", + "#re_sp_taishici:die": "危而不救为怯,救而不得为庸。", + "#xiansi_re_liufeng1": "此皆孟达之过也!", + "#xiansi_re_liufeng2": "非我不救,实乃孟达谗言。", + "#re_liufeng:die": "父亲,儿实无异心……", + "#quhu_ol_xunyu1": "两虎相斗,旁观成败。", + "#quhu_ol_xunyu2": "驱兽相争,坐收渔利。", + "#oljieming1": "含气在胸,有进无退。", + "#oljieming2": "蕴节于形,生死无惧。", + "#ol_xunyu:die": "一招不慎,为虎所噬……", + "#rezhanjue1": "千里锦绣江山,岂能拱手相让!", + "#rezhanjue2": "先帝一生心血,安可坐以待毙!", + "#reqinwang1": "大江潮来,怎无忠勇之士?", + "#reqinwang2": "泰山倾崩,可有坚贞之臣?", + "#re_liuchen:die": "儿欲死战,父亲何故先降……", + "#dcyicong1": "恩义聚骠骑,百战从公孙!", + "#dcyicong2": "义从呼啸至,白马抖精神!", + "#dcqiaomeng1": "猛士骁锐,可慑百蛮失蹄!", + "#dcqiaomeng2": "锐士志猛,可凭白手夺马!", + "#dc_gongsunzan:die": "良弓断,白马亡。", + "#reandong1": "青龙映木,星出其东则天下安。", + "#reandong2": "以身涉险,剑伐不臣而定河东。", + "#reyingshi1": "大势如潮,可应之而不可逆之。", + "#reyingshi2": "应大势伐贼者,当以重酬彰之。", + "#re_duji:die": "公无渡河,公竟渡河。", + "#dcjianying1": "步步为营,缓缓而进。", + "#dcjianying2": "以强击弱,何必心急?", + "#dcshibei1": "宁向北而死,不面南而生。", + "#dcshibei2": "主公在北,吾心亦在北!", + "#re_jushou:die": "身处河南,魂归河北...", + "#reqiaobian1": "顺势而变,则胜矣。", + "#reqiaobian2": "万物变化,固无休息。", + "#re_zhanghe:die": "何处之流矢……", + "#rezhuhai1": "霜刃出鞘,诛恶方还。", + "#rezhuhai2": "心有不平,拔剑相向。", + "#xsqianxin": null, + "#xsqianxin1": "弃剑执笔,修习韬略。", + "#xsqianxin2": "休武兴文,专研筹划。", + "#dc_xushu:die": "忠孝之德,庶两者皆空。", + "#decadexianzhen1": "精练整齐,每战必克!", + "#decadexianzhen2": "陷阵杀敌,好不爽快!", + "#decadejinjiu1": "好酒之徒,难堪大任,不入我营!", + "#decadejinjiu2": "饮酒误事,必当严禁!", + "#xin_gaoshun:die": "力尽于布,与之偕死。", + "#rejiaozhao1": "事关社稷,万望阁下谨慎行事。", + "#rejiaozhao2": "为续江山,还请爱卿仔细观之。", + "#redanxin1": "殚精出谋,以保社稷。", + "#redanxin2": "竭心筹划,求续魏统。", + "#re_guohuanghou:die": "哀家愧对先帝。", + "#reqiaoshi1": "暖风细雨,心有灵犀。", + "#reqiaoshi2": "樵采城郭外,忽见郎君来。", + "#reyanyu1": "边功未成,还请郎君努力。", + "#reyanyu2": "郎君有意倾心诉,妾身心中相思埋。", + "#re_xiahoushi:die": "天气渐寒,郎君如今安在?", + "#olhaoshi": null, + "#olhaoshi1": "仗义疏财,深得人心。", + "#olhaoshi2": "招聚少年,给其衣食。", + "#oldimeng": null, + "#oldimeng1": "深知其奇,相与亲结。", + "#oldimeng2": "同盟之人,言归于好。", + "#ol_lusu:die": "一生为国,纵死无憾……", + "#wansha_re_jiaxu1": "有谁敢试试?", + "#wansha_re_jiaxu2": "斩草务尽,以绝后患。", + "#luanwu_re_jiaxu1": "一切都在我的掌控中!", + "#luanwu_re_jiaxu2": "这乱世还不够乱!", + "#reweimu1": "此伤与我无关。", + "#reweimu2": "还是另寻他法吧。", + "#re_jiaxu:die": "此劫,我亦有所算……", + "#reshenxing1": "谋而后动,行不容差。", + "#reshenxing2": "谋略之道,需慎之又慎。", + "#rebingyi1": "秉持心性,心口如一。", + "#rebingyi2": "秉忠职守,一生不事二主。", + "#re_guyong:die": "君不可不慎呐……", + "#xinquanji1": "操权弄略,舍小利,而谋大计!", + "#xinquanji2": "大丈夫行事,岂较一兵一将之得失?", + "#xinzili1": "烧去剑阁八百里,蜀中自有一片天!", + "#xinzili2": "天下风流出我辈,一遇风云便化龙。", + "#xin_zhonghui:die": "这就是……自食恶果的下场吗?", + "#reqieting1": "谋略未定,窃听以察先机。", + "#reqieting2": "所见相同,何必畏我?", + "#rexianzhou1": "举州请降,高枕无忧。", + "#rexianzhou2": "州固可贵,然不及我儿安危。", + "#re_caifuren:die": "枉费妾身机关算尽……", + "#relongyin1": "风云将起,龙虎齐鸣!", + "#relongyin2": "武圣龙威,破敌无惧!", + "#jiezhong1": "犯我疆土者,竭忠尽节以灭之。", + "#jiezhong2": "竭力尽能以立功于国,忠心不二。", + "#re_guanping:die": "黄泉路远,儿愿为父亲牵马执鞭……", + "#rejigong1": "此时不战,更待何时!", + "#rejigong2": "箭在弦上,不得不发!", + "#shifei_re_guotufengji1": "若依吾计而行,许昌旦夕可破!", + "#shifei_re_guotufengji2": "先锋怯战,非谋策之过。", + "#re_guotufengji:die": "主公,我还有一计啊!", + "#rezhongyong1": "赤兔北奔,马踏鼠胆之辈!", + "#rezhongyong2": "青龙夜照,刀斩悖主之贼!", + "#re_zhoucang:die": "愿随将军赴死!", + "#juxiang1_ol_zhurong1": "巨象冲锋,踏平敌阵!", + "#juxiang1_ol_zhurong2": "南兵象阵,刀枪不入!", + "#lieren_ol_zhurong1": "烈火飞刃,例无虚发!", + "#lieren_ol_zhurong2": "烈刃一出,谁与争锋?", + "#changbiao1": "长标如虹,以伐蜀汉!", + "#changbiao2": "长标在此,谁敢拦我?", + "#ol_zhurong:die": "这汉人,竟……如此厉害……", + "#rejueqing1": "不知情之所起,亦不知情之所终。", + "#rejueqing2": "唯有情字最伤人!", + "#reshangshi1": "半生韶华随流水,思君不见撷落花。", + "#reshangshi2": "西风知我意,送我三尺秋。", + "#re_zhangchunhua:die": "仲达负我!", + "#rehuaiyi1": "曹刘可王,孤亦可王!", + "#rehuaiyi2": "汉失其鹿,天下豪杰当共逐之。", + "#re_gongsunyuan:die": "大星落,君王死……", + "#residi1": "总算困住你了!", + "#residi2": "你出得了手吗?", + "#re_caozhen:die": "未竟之业,请你们务必继续!", + "#rezhuikong1": "曹贼!你怎可如此不尊汉室!", + "#rezhuikong2": "密信之事,不可被曹贼知晓。", + "#reqiuyuan1": "陛下,我不想离开。", + "#reqiuyuan2": "将军此事,可有希望。", + "#re_fuhuanghou:die": "这幽禁之地,好冷……", + "#reenyuan1": "善因得善果,恶因得恶报!", + "#reenyuan2": "私我者赠之琼瑶,厌我者报之斧钺!", + "#rexuanhuo1": "光以眩目,言以惑人。", + "#rexuanhuo2": "我法孝直如何会害你?", + "#re_fazheng:die": "恨未得见吾主,君临天下……", + "#xuanfeng_xin_lingtong1": "风动扬帆起,枪出敌军溃!", + "#xuanfeng_xin_lingtong2": "御风而动,敌军四散!", + "#yongjin_xin_lingtong1": "鏖兵卫主,勇足以却敌!", + "#yongjin_xin_lingtong2": "勇不可挡,进则无退!", + "#xin_lingtong:die": "风萧而力去,风残……而力尽……", + "#decadezishou1": "恩威并著,从容自保!", + "#decadezishou2": "据有荆州,以观世事!", + "#decadezongshi1": "汉室江山,气数未尽!", + "#decadezongshi2": "我刘氏一族,皆海内之俊杰也!", + "#xin_liubiao:die": "人心不古!", + "#qianju": null, + "#qianju1": null, + "#qianju2": null, + "#reqingxi1": "虎豹骑倾巢而动,安有不胜之理?", + "#reqingxi2": "任尔等固若金汤,虎豹骑可破之!", + "#re_caoxiu:die": "奈何痈发背薨!", + "#reyanzhu1": "觥筹交错,杀人于无形!", + "#reyanzhu2": "子烈设宴,意在汝项上人头!", + "#rexingxue1": "案古置学官,以敦王化,以隆风俗。", + "#rexingxue2": "志善好学,未来可期!", + "#zhaofu": null, + "#zhaofu1": "奉朕之诏,擒此国贼!", + "#zhaofu2": "天子震怒,贼臣授首。", + "#re_sunxiu:die": "盛世未成,实为憾事!", + "#oltuntian1": "兵农一体,以屯养战。", + "#oltuntian2": "垦田南山,志在西川。", + "#olzaoxian1": "良田厚土,足平蜀道之难!", + "#olzaoxian2": "效仿五丁开川,赢粮直捣黄龙!", + "#ol_dengai:die": "钟会!你为何害我!", + "#qiaomeng1": "秣马厉兵,枕戈待战。", + "#qiaomeng2": "夺敌辎重,以为己用。", + "#reyicong1": "变阵冲轭,以守代攻。", + "#reyicong2": "列阵锋矢,直取要害。", + "#re_gongsunzan:die": "皇图霸业梦,付之,一炬中……", + "#rejunxing1": "严法尚公,岂分贵贱而异施?", + "#rejunxing2": "情理可容之事,法未必能容!", + "#yuce_re_manchong1": "骄之以利,示之以慑!", + "#yuce_re_manchong2": "虽举得于外,则福生于内矣。", + "#re_manchong:die": "宠一生为公,无愧忠俭之节。", + "#zhiyan_xin_yufan1": "此事,臣有一言要讲。", + "#zhiyan_xin_yufan2": "还望将军听我一言。", + "#xinzongxuan1": "天命所定,乃天数之法。", + "#xinzongxuan2": "因果循坏,已有定数。", + "#xin_yufan:die": "若听谏言,何至如此……", + "#dcanxu1": "温言呢喃,消君之愁。", + "#dcanxu2": "吴侬软语,以解君忧。", + "#dczhuiyi1": "别后庭中树,相思几度攀。", + "#dczhuiyi2": "空馀宫阙恨,因此寄相思。", + "#dc_bulianshi:die": "还请至尊多保重……", + "#reshenduan1": "行军断策需慎之又慎!", + "#reshenduan2": "为将者务当慎行谨断!", + "#reyonglve1": "兵势勇健,战胜攻取,无不如志!", + "#reyonglve2": "雄才大略,举无遗策,威震四海!", + "#re_hanhaoshihuan:die": "末将愧对主公知遇之恩!", + "#reduodao1": "避其锋芒,夺其兵刃!", + "#reduodao2": "好兵器啊!哈哈哈!", + "#reanjian1": "看我一箭索命!", + "#reanjian2": "明枪易躲,暗箭难防!", + "#re_panzhangmazhong:die": "埋伏得这么好,怎会……", + "#zhenlie_re_wangyi1": "女子,亦可有坚贞气节!", + "#zhenlie_re_wangyi2": "品德端正,心中不移。", + "#miji_re_wangyi1": "秘计已成,定助夫君得胜。", + "#miji_re_wangyi2": "秘计在此,将军必凯旋而归。", + "#re_wangyi:die": "秘计不成,此城难守……", + "#mashu": null, + "#mashu1": null, + "#mashu2": null, + "#reqianxi1": "暗影深处,袭敌斩首!", + "#reqianxi2": "哼,出不了牌了吧?", + "#re_madai:die": "丞相临终使命,岱已达成。", + "#decadepojun1": "奋身出命,为国建功!", + "#decadepojun2": "披甲持戟,先登陷陈!", + "#xin_xusheng:die": "文向已无憾矣!", + "#tianyi_re_taishici1": "天降大任,速战解围!", + "#tianyi_re_taishici2": "义不从之,天必不佑!", + "#hanzhan1": "伯符,且与我一战!", + "#hanzhan2": "与君酣战,快哉快哉!", + "#re_taishici:die": "无妄之灾,难以避免……", + "#resanyao1": "蜚短流长,以基所毁,敌军自溃。", + "#resanyao2": "群言谣混,积是成非!", + "#zhiman_re_masu1": "断其粮草,不战而胜!", + "#zhiman_re_masu2": "用兵之道,攻心为上!", + "#re_masu:die": "谡虽死无恨于黄壤也……", + "#rechanhui1": "萋兮斐兮,谋欲谮人!", + "#rechanhui2": "稍稍谮毁,万劫不复!", + "#rejiaojin1": "凭汝之力,何不自鉴?", + "#rejiaojin2": "万金之躯,岂容狎侮!", + "#re_sunluban:die": "谁敢动哀家一根寒毛!", + "#xingongji1": "马踏飞箭,弓骑无双!", + "#xingongji2": "提弓上马,箭砺八方!", + "#xinjiefan1": "烦忧千万,且看我一刀解之。", + "#xinjiefan2": "莫道雄兵属北地,解烦威名天下扬。", + "#xin_handang:die": "三石雕弓今尤在,不见当年挽弓人……", + "#decadezhenjun1": "奉令无犯,当敌制决!", + "#decadezhenjun2": "质中性一,守执节义,自当无坚不陷。", + "#yujin_yujin:die": "如今临危处难,却负丞相三十年之赏识,唉……", + "#xinjiangchi1": "率师而行,所向皆破!", + "#xinjiangchi2": "数从征伐,志意慷慨,不避险阻!", + "#re_caozhang:die": "奈何病薨!", + "#lihuo_re_chengpu1": "叛军者,非烈火灼身难泄吾恨。", + "#lihuo_re_chengpu2": "投敌于火,烧炙其身,皮焦肉烂!", + "#rechunlao1": "醉里披甲执坚,梦中杀敌破阵。", + "#rechunlao2": "醇醪须与明君饮,沙场无还亦不悔。", + "#re_chengpu:die": "病疠缠身,终天命难违……", + "#xinyaoming1": "养威持重,不营小利。", + "#xinyaoming2": "则天而行,作功邀名。", + "#re_quancong:die": "患难可共济,生死……不同当……", + "#dangxian_re_liaohua1": "竭诚当先,一举克定!", + "#dangxian_re_liaohua2": "一马当先,奋勇杀敌!", + "#xinfuli1": "匡扶汉室,死而后已!", + "#xinfuli2": "一息尚存,不忘君恩!", + "#re_liaohua:die": "汉室,气数已尽……", + "#decadejingce1": "精细入微,策敌制胜。", + "#decadejingce2": "妙策如神,精兵强将,安有不胜之理?", + "#re_guohuai:die": "岂料姜维……空手接箭!", + "#xinbenxi1": "北伐曹魏,以弱制强!", + "#xinbenxi2": "引军汉中,以御敌袭!", + "#re_wuyi:die": "远道疲敝,寡不敌众,唉!", + "#xindanshou1": "胆识过人而劲勇,则见敌无所畏惧", + "#xindanshou2": "胆守有余,可堪大任!", + "#re_zhuran:die": "真不愧是……常胜将军……", + "#xinlianhuan_ol_pangtong1": "连环之策,攻敌之计。", + "#xinlianhuan_ol_pangtong2": "锁链连舟,困步难行。", + "#olniepan1": "烈火脱胎,涅槃重生。", + "#olniepan2": "破而后立,方有大成。", + "#ol_pangtong:die": "骥飞羽落,坡道归尘……", + "#rewurong": null, + "#rewurong1": "策略以入算,果烈以立威!", + "#rewurong2": "诈与和亲,不攻可得!", + "#reshizhi": null, + "#reshizhi1": null, + "#reshizhi2": null, + "#re_zhangyi:die": "挥师未捷,杀身以报!", + "#xinganlu1": "纳采问名,而后交换文定。", + "#xinganlu2": "兵戈相向,何如化戈为帛?", + "#xinbuyi1": "有老身在,阁下勿忧。", + "#xinbuyi2": "如此佳婿,谁敢伤之?", + "#xin_wuguotai:die": "爱女已去,老身何存?", + "#rejianxiong1": "燕雀,安知鸿鹄之志!", + "#rejianxiong2": "夫英雄者,胸怀大志,腹有良谋!", + "#hujia_re_caocao1": "大胆逆贼,谁可擒之!", + "#hujia_re_caocao2": "护卫何在!", + "#re_caocao:die": "华佗何在?……", + "#refankui1": "哼,自作孽不可活!", + "#refankui2": "哼,正中下怀!", + "#reguicai1": "天命难违?哈哈哈哈哈……", + "#reguicai2": "才通天地,逆天改命!", + "#re_simayi:die": "我的气数,就到这里了么?", + "#tiandu_re_guojia1": "天意如此。", + "#tiandu_re_guojia2": "那,就这样吧。", + "#reyiji1": "锦囊妙策,终定社稷。", + "#reyiji2": "依此计行,辽东可定。", + "#re_guojia:die": "咳,咳咳咳……", + "#retuxi1": "快马突袭,占尽先机!", + "#retuxi2": "马似飞影,枪如霹雳!", + "#re_zhangliao:die": "被敌人占了先机……呃……", + "#reluoyi1": "过来打一架,对,就是你!", + "#reluoyi2": "废话少说,放马过来吧!", + "#re_xuzhu:die": "丞相,末将尽力了!", + "#reganglie1": "伤我者,十倍奉还!", + "#reganglie2": "哪个敢动我!", + "#qingjian1": "钱财,乃身外之物。", + "#qingjian2": "福生于清俭,德生于卑退。", + "#re_xiahoudun:die": "诸多败绩,有负丞相重托……", + "#paoxiao_re_zhangfei1": "喝啊!", + "#paoxiao_re_zhangfei2": "今,必斩汝马下!", + "#retishen1": "谁,还敢过来一战?!", + "#retishen2": "欺我无谋?定要尔等血偿!", + "#re_zhangfei:die": "桃园一拜,此生…无憾……", + "#longdan_sha_re_zhaoyun1": "龙威虎胆,斩敌破阵!", + "#longdan_sha_re_zhaoyun2": "进退自如,游刃有余!", + "#reyajiao1": "策马驱前,斩敌当先!", + "#reyajiao2": "遍寻天下,但求一败!", + "#re_zhaoyun:die": "你们谁…还敢再上……", + "#wusheng_re_guanyu1": "刀锋所向,战无不克!", + "#wusheng_re_guanyu2": "逆贼,哪里走!", + "#yijue1": "恩已断,义当绝!", + "#yijue2": "关某,向来恩怨分明!", + "#re_guanyu:die": "桃园一拜,恩义常在……", + "#retieji1": "目标敌阵,全军突击!", + "#retieji2": "敌人阵型已乱,随我杀!", + "#re_machao:die": "请将我,葬在西凉……", + "#reyingzi1": "哈哈哈哈哈哈哈哈……!", + "#reyingzi2": "伯符,且看我这一手!", + "#refanjian1": "与我为敌,就当这般生不如死!", + "#refanjian2": "抉择吧!在苦与痛的地狱中!", + "#re_zhouyu:die": "既生瑜,何生亮!……既生瑜,何生亮……!", + "#keji_re_lvmeng1": "蓄力待时,不争首功。", + "#keji_re_lvmeng2": "最好的机会,还在等着我。", + "#qinxue1": "勤以修身,学以报国。", + "#qinxue2": "兵书熟读,了然于胸。", + "#botu1": "今日起兵,渡江攻敌!", + "#botu2": "时机已到,全军出击!。", + "#re_lvmeng:die": "你,给我等着!", + "#qixi_re_ganning1": "弟兄们,准备动手!", + "#qixi_re_ganning2": "你用不了这么多了!", + "#fenwei1": "哼!敢欺我东吴无人。", + "#fenwei2": "奋勇当先,威名远扬!", + "#re_ganning:die": "别管我,继续上!", + "#reqianxun1": "满招损,谦受益。", + "#reqianxun2": "谦谦君子,温润如玉。", + "#relianying1": "生生不息,源源不绝。", + "#relianying2": "失之淡然,得之坦然。", + "#re_luxun:die": "我的未竟之业……", + "#reguose1": "旅途劳顿,请下马休整吧~", + "#reguose2": "还没到休息的时候!", + "#liuli_re_daqiao1": "伯符不在身边,我要自己保重!", + "#liuli_re_daqiao2": "帮帮人家嘛~", + "#re_daqiao:die": "伯符,再也没人能欺负我了……", + "#rekurou1": "我这把老骨头,不算什么!", + "#rekurou2": "为成大业,死不足惜!", + "#zhaxiang1": "铁锁连舟而行,东吴水师可破!", + "#zhaxiang2": "两军阵前,不斩降将!", + "#re_huanggai:die": "盖,有负公瑾重托……", + "#wushuang_re_lvbu1": "三个齐上,也不是我的对手!", + "#wushuang_re_lvbu2": "还有哪个敢挑战我!?", + "#liyu1": "人不为己,天诛地灭。", + "#liyu2": "大丈夫,相时而动。", + "#re_lvbu:die": "我竟然输了……不可能!", + "#jijiu_re_huatuo1": "妙手仁心,药到病除。", + "#jijiu_re_huatuo2": "救死扶伤,悬壶济世。", + "#new_reqingnang1": "舒活筋络,方解病痛之苦。", + "#new_reqingnang2": "悬丝诊脉,顽疾可医。", + "#re_huatuo:die": "生老病死,命不可违。", + "#rerende1": "施仁布泽,乃我大汉立国之本!", + "#rerende2": "同心同德,救困扶危!", + "#jijiang1_re_liubei1": "哪位将军,替我拿下此贼!", + "#jijiang1_re_liubei2": "欺我军无人乎?!", + "#re_liubei:die": "汉室未兴,祖宗未耀,朕实不忍此时西去……", + "#lijian_re_diaochan1": "赢家,才能得到我~", + "#lijian_re_diaochan2": "这场比赛,将军可要赢哦~", + "#rebiyue1": "梦蝶幻月,如沫虚妄。", + "#rebiyue2": "水映月明,芙蓉照倩影。", + "#re_diaochan:die": "我的任务,终于完成了……", + "#rejizhi1": "得上通,智集心。", + "#rejizhi2": "集万千才智,致巧趣鲜用。", + "#reqicai": null, + "#reqicai1": null, + "#reqicai2": null, + "#re_huangyueying:die": "我的面容,有吓到你吗?", + "#rezhiheng1": "制衡互牵,大局可安。", + "#rezhiheng2": "不急不躁,稳谋应对。", + "#rejiuyuan1": "你们真是朕的得力干将。", + "#rejiuyuan2": "有爱卿在,朕无烦忧。", + "#re_sunquan:die": "锦绣江东,岂能失于我手……", + "#xiaoji_re_sunshangxiang1": "剑利弓急,你可打不过我的。", + "#xiaoji_re_sunshangxiang2": "我会的武器,可多着呢。", + "#rejieyin1": "得遇夫君,妾身福分。", + "#rejieyin2": "随夫嫁娶,宜室宜家。", + "#re_sunshangxiang:die": "就这样……结束了吗?", + "#reluoshen1": "屏翳收风,川后静波。", + "#reluoshen2": "冯夷鸣鼓,女娲清歌。", + "#reqingguo1": "肩若削成,腰如约素。", + "#reqingguo2": "延颈秀项,皓质呈露。", + "#re_zhenji:die": "出亦复何苦,入亦复何愁。", + "#guanxing_re_zhugeliang1": "天星之变,吾窥探一二。", + "#guanxing_re_zhugeliang2": "星途莫测,细细推敲。", + "#kongcheng1_re_zhugeliang1": null, + "#kongcheng1_re_zhugeliang2": null, + "#re_zhugeliang:die": "穷尽毕生,有憾无悔。", + "#new_reyaowu1": "有吾在此,解太师烦忧。", + "#new_reyaowu2": "这些杂兵,我有何惧!", + "#shizhan1": "看你能坚持几个回合!", + "#shizhan2": "兀那汉子,且报上名来!", + "#re_huaxiong:die": "我掉以轻心了……", + "#xinleiji1": "疾雷迅电,不可趋避!", + "#xinleiji2": "雷霆之诛,灭军毁城!", + "#xinguidao1": "汝之命运,吾来改之!", + "#xinguidao2": "鬼道运行,由我把控!", + "#xinhuangtian2_re_zhangjiao1": "天书庇佑,黄巾可兴!", + "#xinhuangtian2_re_zhangjiao2": "黄天法力,万军可灭!", + "#re_zhangjiao:die": "天书无效,人心难聚……", + "#reguhuo1": "这牌,猜对了吗?", + "#reguhuo2": "真真假假,虚实难测。", + "#xin_yuji:die": "符水失效,此病难医……", + "#rehuashen1": "容貌发肤,不过浮尘。", + "#rehuashen2": "皮囊万千,吾皆可化。", + "#rexinsheng1": "枯木发荣,朽木逢春。", + "#rexinsheng2": "风靡云涌,万丈光芒。", + "#re_zuoci:die": "红尘看破,驾鹤仙升……", + "#shensu1_ol_xiahouyuan1": "健步如飞,破敌不备!", + "#shensu1_ol_xiahouyuan2": "奔逸绝尘,不留踪影!", + "#shebian": null, + "#shebian1": "随机应变,临机设变!", + "#shebian2": "设变力战,虏敌千万!", + "#ol_xiahouyuan:die": "我的速度,还是不够……", + "#xinjushou1": "兵精粮足,守土一方。", + "#xinjushou2": "坚守此地,不退半步。", + "#xinjiewei1": "化守为攻,出奇制胜!", + "#xinjiewei2": "坚壁清野,以挫敌锐!", + "#caoren:die": "长江以南,再无王土矣……", + "#kuanggu_ol_weiyan1": "反骨狂傲,彰显本色!", + "#kuanggu_ol_weiyan2": "只有战场,能让我感到兴奋!", + "#reqimou1": "勇战不如奇谋。", + "#reqimou2": "为了胜利,可以出其不意!", + "#ol_weiyan:die": "这次失败,意料之中……", + "#tianxiang_ol_xiaoqiao1": "你岂会懂我的美丽?", + "#tianxiang_ol_xiaoqiao2": "碧玉闺秀,只可远观。", + "#rehongyan1": "红颜娇花好,折花门前盼。", + "#rehongyan2": "我的容貌,让你心动了吗?", + "#piaoling1": "清风拂枝,落花飘零。", + "#piaoling2": "花自飘零水自流。", + "#ol_xiaoqiao:die": "同心而离居,忧伤以终老……", + "#buqu1": "哼!这点小伤算什么。", + "#buqu2": "战如熊虎,不惜躯命!", + "#fenji1": "百战之身,奋勇趋前!", + "#fenji2": "两肋插刀,愿赴此躯!", + "#zhoutai:die": "敌众我寡,无力回天……", + "#rejianchu1": "你这身躯,怎么能快过我?", + "#rejianchu2": "这些怎么能挡住我的威力!", + "#ol_pangde:die": "水漫城池,不得不降……", + "#olduanliang1": "兵行无常,计行断粮。", + "#olduanliang2": "焚其粮营,断其粮道。", + "#oljiezi1": "剪径截辎,馈泽同袍。", + "#oljiezi2": "截敌粮草,以资袍泽。", + "#ol_xuhuang:die": "亚夫易老,李广难封……", + "#bazhen_ol_sp_zhugeliang1": "八阵连心,日月同辉。", + "#bazhen_ol_sp_zhugeliang2": "此阵变化,岂是汝等可解?", + "#rehuoji_ol_sp_zhugeliang1": "东风,让这火烧得再猛烈些吧!", + "#rehuoji_ol_sp_zhugeliang2": "赤壁借东风,燃火灭魏军。", + "#rekanpo_ol_sp_zhugeliang1": "还有什么是我看不破的?", + "#rekanpo_ol_sp_zhugeliang2": "此计奥妙,我已看破。", + "#cangzhuo1": "藏巧于拙,用晦而明。", + "#cangzhuo2": "寓清于浊,以屈为伸。", + "#ol_sp_zhugeliang:die": "星途半废,夙愿未完……", + "#olshuangxiong1": "吾执矛,君执槊,此天下可有挡我者?", + "#olshuangxiong2": "兄弟协力,定可于乱世纵横!", + "#ol_yanwen:die": "双雄皆陨,徒隆武圣之名……", + "#olluanji1": "我的箭支,准备颇多!", + "#olluanji2": "谁都挡不住,我的箭阵!", + "#olxueyi1": "高贵名门,族裔盛名。", + "#olxueyi2": "贵裔之脉,后起之秀!", + "#ol_yuanshao:die": "孟德此计,防不胜防……", + "#huoshou1_re_menghuo1": "啸据哀牢,闻祸而喜!", + "#huoshou1_re_menghuo2": "坐据三山,蛮霸四野!", + "#rezaiqi1": "挫而弥坚,战而弥勇!", + "#rezaiqi2": "蛮人骨硬,其势复来!", + "#re_menghuo:die": "勿再放我,但求速死!", + "#oljiuchi1": "好酒,痛快!", + "#oljiuchi2": "某,千杯不醉!", + "#roulin_ol_dongzhuo1": "醇酒美人,幸甚乐甚!", + "#roulin_ol_dongzhuo2": "这些美人,都可进贡。", + "#benghuai_ol_dongzhuo1": "何人伤我?", + "#benghuai_ol_dongzhuo2": "酒色伤身呐……", + "#olbaonue1": "天下群雄,唯我独尊!", + "#olbaonue2": "吾乃人屠,当以兵为贡。", + "#ol_dongzhuo:die": "地府……可有美人乎?", + "#yinghun_ol_sunjian1": "提刀奔走,灭敌不休。", + "#yinghun_ol_sunjian2": "贼寇草莽,我且出战。", + "#wulie1": "孙武之后,英烈勇战。", + "#wulie2": "兴义之中,忠烈之名。", + "#ol_sunjian:die": "袁术之辈,不可共谋!", + "#rexingshang1": "群燕辞归鹄南翔,念君客游思断肠。", + "#rexingshang2": "霜露纷兮文下,木叶落兮凄凄。", + "#refangzhu1": "国法不可废耳,汝先退去。", + "#refangzhu2": "将军征战辛苦,孤当赠以良宅。", + "#songwei2_re_caopi1": "藩屏大宗,御侮厌难!", + "#songwei2_re_caopi2": "朕,承符运,终受革命!", + "#re_caopi:die": "建平所言八十,谓昼夜也,吾其决矣……", + "#tiaoxin_ol_jiangwei1": "会闻用师,观衅而动。", + "#tiaoxin_ol_jiangwei2": "宜乘其衅会,以挑敌将。", + "#olzhiji1": "丞相遗志,不死不休!", + "#olzhiji2": "大业未成,矢志不渝!", + "#ol_jiangwei:die": "星散流离……", + "#beige_ol_caiwenji1": "箜篌鸣九霄,闻者心俱伤。", + "#beige_ol_caiwenji2": " 琴弹十八拍,听此双泪流。", + "#duanchang_ol_caiwenji1": "红颜留塞外,愁思欲断肠。", + "#duanchang_ol_caiwenji2": "莫吟苦辛曲,此生谁忍闻。", + "#ol_caiwenji:die": "飘飘外域里,何日能归乡?", + "#xiangle_ol_liushan1": "嘿嘿嘿,还是玩耍快乐。", + "#xiangle_ol_liushan2": "美好的日子,应该好好享受。", + "#olfangquan1": "蜀汉有相父在,我可安心。", + "#olfangquan2": "这些事情,你们安排就好。", + "#olruoyu1": "若愚故泰,巧骗众人。", + "#olruoyu2": "愚昧者,非真傻也。", + "#ol_liushan:die": "将军英勇,我……我投降……", + "#jiang_re_sunce1": "收合流散,东据吴会。", + "#jiang_re_sunce2": "策虽暗稚,窃有微志。", + "#olhunzi1": "江东新秀,由此崛起!", + "#olhunzi2": "看汝等大展英气!", + "#olzhiba1": "让将军在此恭候多时了。", + "#olzhiba2": "有诸位将军在,此战岂会不胜?", + "#re_sunce:die": "汝等,怎能受于吉蛊惑?", + "#reqiaoshui1": "慧心妙舌,难题可解。", + "#reqiaoshui2": "巧言善辩,应对自如。", + "#jyzongshi_re_jianyong1": "能断大事者,不拘小节。", + "#jyzongshi_re_jianyong2": "闲暇自得,威仪不肃。", + "#re_jianyong:die": "此景竟无言以对。", +}; diff --git a/character/sb.js b/character/sb.js deleted file mode 100644 index 629399ccc..000000000 --- a/character/sb.js +++ /dev/null @@ -1,9027 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - //strategy and battle, "sb" in short - name: "sb", - connect: true, - character: { - sb_gaoshun: ["male", "qun", 4, ["sbxianzhen", "sbjinjiu"]], - sb_xiahoudun: ["male", "wei", 4, ["sbganglie", "sbqingjian"]], - sb_xunyu: ["male", "wei", 3, ["sbquhu", "sbjieming"]], - sb_caopi: ["male", "wei", 3, ["sbxingshang", "sbfangzhu", "sbsongwei"], ["zhu"]], - sb_guanyu: ["male", "shu", 4, ["sbwusheng", "sbyijue"]], - sb_huangyueying: ["female", "shu", 3, ["sbjizhi", "sbqicai"]], - sb_sp_zhugeliang: ["male", "shu", 3, ["sbhuoji", "sbkanpo"]], - sb_zhanghe: ["male", "wei", 4, ["sbqiaobian"]], - sb_yujin: ["male", "wei", 4, ["sbxiayuan", "sbjieyue"]], - sb_huaxiong: ["male", "qun", "3/4/1", ["new_reyaowu", "sbyangwei"]], - liucheng: ["female", "qun", 3, ["splveying", "spyingwu"]], - sp_yangwan: ["female", "qun", 3, ["spmingxuan", "spxianchou"]], - sb_huangzhong: ["male", "shu", 4, ["sbliegong"]], - sb_lvmeng: ["male", "wu", 4, ["sbkeji", "sbdujiang"]], - sb_sunshangxiang: ["female", "shu", 4, ["sbjieyin", "sbliangzhu", "sbxiaoji"], ["border:wu"]], - sb_sunquan: ["male", "wu", 4, ["sbzhiheng", "sbtongye", "sbjiuyuan"], ["zhu"]], - sb_huanggai: ["male", "wu", 4, ["sbkurou", "sbzhaxiang"]], - sb_zhouyu: ["male", "wu", 3, ["sbyingzi", "sbfanjian"]], - sb_caoren: ["male", "wei", "4/4/1", ["sbjushou", "sbjiewei"]], - sb_xiahoushi: ["female", "shu", 3, ["sbqiaoshi", "sbyanyu"]], - sb_zhangjiao: ["male", "qun", 3, ["sbleiji", "sbguidao", "sbhuangtian"], ["zhu"]], - sb_caocao: ["male", "wei", 4, ["sbjianxiong", "sbqingzheng", "sbhujia"], ["zhu"]], - sb_zhenji: ["female", "wei", 3, ["sbluoshen", "qingguo"]], - sb_ganning: ["male", "wu", 4, ["sbqixi", "sbfenwei"]], - sb_machao: ["male", "shu", 4, ["mashu", "sbtieji"]], - sb_xuhuang: ["male", "wei", 4, ["sbduanliang", "sbshipo"]], - sb_zhangfei: ["male", "shu", 4, ["sbpaoxiao", "sbxieji"]], - sb_zhaoyun: ["male", "shu", 4, ["sblongdan", "sbjizhu"]], - sb_liubei: ["male", "shu", 4, ["sbrende", "sbzhangwu", "sbjijiang"], ["zhu"]], - sb_jiangwei: ["male", "shu", "4/4/1", ["sbtiaoxin", "sbzhiji"]], - sb_fazheng: ["male", "shu", 3, ["sbxuanhuo", "sbenyuan"]], - sb_chengong: ["male", "qun", 3, ["sbmingce", "sbzhichi"]], - sb_diaochan: ["female", "qun", 3, ["sblijian", "sbbiyue"]], - sb_yuanshao: ["male", "qun", 4, ["sbluanji", "sbxueyi"], ["zhu"]], - sb_pangtong: ["male", "shu", 3, ["sblianhuan", "sbniepan"]], - sb_sunce: ["male", "wu", 4, ["sbjiang", "sbhunzi", "sbzhiba"], ["zhu"]], - sb_daqiao: ["female", "wu", 3, ["sbguose", "sbliuli"]], - sb_liubiao: ["male", "qun", 3, ["sbzishou", "sbzongshi"]], - sb_zhurong: ["female", "shu", 4, ["sblieren", "sbjuxiang"]], - sb_menghuo: ["male", "shu", 4, ["sbhuoshou", "sbzaiqi"]], - sb_yl_luzhi: ["male", "qun", 3, ["nzry_mingren", "sbzhenliang"]], - sb_xiaoqiao: ["female", "wu", 3, ["sbtianxiang", "xinhongyan"]], - }, - characterSort: { - sb: { - sb_zhi: [ - "sb_sunquan", - "sb_zhouyu", - "sb_zhangjiao", - "sb_caocao", - "sb_zhenji", - "sb_liubei", - "sb_daqiao", - "sb_liubiao", - "sb_sp_zhugeliang", - "sb_xunyu", - ], - sb_shi: [ - "sb_xuhuang", - "sb_machao", - "sb_fazheng", - "sb_chengong", - "sb_diaochan", - "sb_pangtong", - "sb_zhanghe", - "sb_caopi", - "sb_ganning", - ], - sb_tong: [ - "liucheng", - "sp_yangwan", - "sb_xiahoushi", - "sb_zhangfei", - "sb_zhaoyun", - "sb_sunce", - "sb_zhurong", - "sb_xiaoqiao", - "sb_xiahoudun", - ], - sb_yu: [ - "sb_yujin", - "sb_lvmeng", - "sb_huangzhong", - "sb_huanggai", - "sb_zhouyu", - "sb_caoren", - "sb_yl_luzhi", - "sb_huangyueying", - ], - sb_neng: [ - "sb_huaxiong", - "sb_sunshangxiang", - "sb_jiangwei", - "sb_yuanshao", - "sb_menghuo", - "sb_guanyu", - "sb_gaoshun", - ], - // sb_waitforsort:[], - }, - }, - characterSubstitute: { - sb_sp_zhugeliang: [], - }, - skill: { - //高顺 - sbxianzhen: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target !== player; - }, - async content(event, trigger, player) { - const target = event.targets[0]; - player.addTempSkill("sbxianzhen_attack", "phaseUseAfter"); - player.markAuto("sbxianzhen_attack", target); - }, - ai: { - expose: 0.2, - order(item, player) { - return get.order({ name: "sha" }) + 1; - }, - result: { - target(player, target) { - if ( - !player.countCards("hs", (card) => { - return get.name(card) === "sha" && player.canUse(card, target, false); - }) - ) - return -0.1; - if (target.countCards("h") === 1 && player.canCompare(target)) return -2; - return -1.5; - }, - }, - }, - subSkill: { - attack: { - audio: "sbxianzhen", - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - if (event.card.name !== "sha") return false; - return ( - player.getStorage("sbxianzhen_attack").includes(event.target) && - event.target.isIn() && - player.canCompare(event.target) - ); - }, - charlotte: true, - onremove: true, - logTarget: "target", - check(event, player) { - return get.attitude(player, event.target) < 0; - }, - prompt(event, player) { - return `陷阵:是否与${get.translation(event.target)}拼点?`; - }, - prompt2(event, player) { - const target = event.target, - card = event.card; - return `若你赢,${get.translation( - card - )}无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;
    若其拼点牌为【杀】,则你获得之;
    若其拼点牌为其最后的手牌,则${get.translation( - card - )}对其造成伤害时,此伤害+1。`; - }, - group: "sbxianzhen_record", - async content(event, trigger, player) { - const target = trigger.target, - card = trigger.card; - const next = player.chooseToCompare(target); - let result = await next.forResult(); - if (result.bool) { - target.addTempSkill("qinggang2"); - target.storage.qinggang2.add(card); - if (trigger.addCount !== false) { - trigger.addCount = false; - const stat = player.getStat("card"); - if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; - } - game.log(card, "无视防具且不计入次数限制"); - if (!player.storage.sbxianzhen_damaged) { - player.storage.sbxianzhen_damaged = true; - player.when("phaseAfter").then(() => { - delete player.storage.sbxianzhen_damaged; - }); - await target.damage(); - await game.asyncDelayx(); - } - } - const toGain = []; - for (const lose_list of next.lose_list) { - let [comparer, cards] = lose_list; - if (!Array.isArray(cards)) cards = [cards]; - if (comparer === player) continue; - for (const card of cards) { - if ( - get.name(card, comparer) == "sha" && - get.position(card, true) == "d" - ) { - toGain.push(card); - } - } - } - if (toGain.length) await player.gain(toGain, "gain2"); - if (player.getStorage("sbxianzhen_recorded").includes(target)) { - const id = target.playerid; - const map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].extraDamage != "number") { - map[id].extraDamage = 0; - } - map[id].extraDamage++; - game.log(card, "对", target, "造成的伤害+1"); - } - }, - intro: { - content: "本阶段对$使用牌无距离限制,且使用杀指定其为目标后可以与其拼点", - }, - mod: { - targetInRange(card, player, target) { - if (player.getStorage("sbxianzhen_attack").includes(target)) return true; - }, - }, - }, - record: { - trigger: { - global: "loseAsyncEnd", - }, - charlotte: true, - silent: true, - filter(event, player) { - if (event.getParent(2).name !== "sbxianzhen_attack") return false; - return game.hasPlayer((current) => { - if (current.countCards("h")) return false; - const evt = event.getl(current); - return evt && evt.hs && evt.hs.length; - }); - }, - async content(event, trigger, player) { - const targets = []; - game.countPlayer((current) => { - if (current.countCards("h")) return false; - const evt = trigger.getl(current); - if (evt && evt.hs && evt.hs.length) targets.add(current); - }); - if (!player.storage.sbxianzhen_recorded) { - player.when("sbxianzhen_attackAfter").then(() => { - delete player.storage.sbxianzhen_recorded; - }); - } - player.markAuto("sbxianzhen_recorded", targets); - }, - }, - }, - }, - sbjinjiu: { - audio: 2, - inherit: "rejinjiu", - group: ["sbjinjiu_decrease", "sbjinjiu_compare"], - global: "sbjinjiu_global", - subSkill: { - decrease: { - audio: "sbjinjiu", - forced: true, - trigger: { player: "damageBegin4" }, - filter(event, player) { - return event.getParent(2).jiu; - }, - async content(event, trigger) { - trigger.num = 1; - }, - ai: { - filterDamage: true, - skillTagFilter(player, tag, arg) { - return arg && arg.jiu; - }, - }, - }, - global: { - mod: { - cardEnabled(card, player) { - if ( - card.name == "jiu" && - _status.currentPhase && - _status.currentPhase != player && - _status.currentPhase.hasSkill("sbjinjiu") - ) - return false; - }, - cardSavable(card, player) { - if ( - card.name == "jiu" && - _status.currentPhase && - _status.currentPhase != player && - _status.currentPhase.hasSkill("sbjinjiu") - ) - return false; - }, - }, - }, - compare: { - trigger: { - global: "compare", - }, - filter(event, player) { - const participant = [event.player]; - if (event.targets) participant.addArray(event.targets); - else participant.add(event.target); - if (!participant.includes(player)) return false; - if (event.player !== player && event.card1 && event.card1.name === "jiu") - return true; - if (event.target !== player && event.card2 && event.card2.name === "jiu") - return true; - return false; - }, - forced: true, - direct: true, - async content(event, trigger, player) { - for (const [role, ind] of [ - ["player", 1], - ["target", 2], - ]) { - const current = trigger[role], - card = trigger[`card${ind}`]; - if (current !== player && card && card.name === "jiu") { - await player.logSkill("sbjinjiu_compare", current); - game.log(current, "拼点牌点数视为", "#yA"); - trigger[`num${ind}`] = 1; - } - } - }, - }, - }, - }, - //夏侯惇 - sbganglie: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - if (!event.sbganglie_enabledTargets) return false; - return game.hasPlayer((current) => { - return lib.skill.sbganglie.filterTarget(null, player, current); - }); - }, - onChooseToUse(event) { - if (game.online || event.type !== "phase") return; - const player = event.player; - const chosen = player - .getAllHistory("useSkill", (evt) => evt.skill === "sbganglie") - .map((evt) => { - return evt.targets; - }) - .flat(); - const targets = player - .getAllHistory("damage", (evt) => evt.source && evt.source.isIn()) - .map((evt) => evt.source) - .unique(); - targets.removeArray(chosen); - event.set("sbganglie_enabledTargets", targets); - }, - filterTarget(card, player, target) { - return get.event("sbganglie_enabledTargets").includes(target); - }, - async content(event, trigger, player) { - event.targets[0].damage(2); - }, - ai: { - order: 6, - result: { - target: -2, - }, - }, - }, - sbqingjian: { - audio: 2, - trigger: { - global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - forced: true, - locked: false, - filter(event, player) { - if (player.getExpansions("sbqingjian").length >= Math.max(1, player.getHp() - 1)) - return false; - if (event.name !== "cardsDiscard") { - if (event.position !== ui.discardPile) return false; - if ( - !game.hasPlayer((current) => { - const evt = event.getl(current); - return evt.cards && evt.cards.length > 0; - }) - ) - return false; - } else { - const evt = event.getParent(); - if (evt.relatedEvent && evt.relatedEvent.name === "useCard") return false; - } - return true; - }, - group: "sbqingjian_give", - async content(event, trigger, player) { - let cards = trigger.cards.slice(); - const maxNum = Math.max(1, player.getHp() - 1); - const myLen = player.getExpansions("sbqingjian").length, - cardsLen = trigger.cards.length; - const overflow = myLen + cardsLen - maxNum; - if (overflow > 0) cards.randomRemove(overflow); - const next = player.addToExpansion(cards, "gain2"); - next.gaintag.add("sbqingjian"); - await next; - }, - marktext: "俭", - intro: { - content: "expansion", - markcount: "expansion", - }, - subSkill: { - give: { - audio: "sbqingjian", - trigger: { player: "phaseUseEnd" }, - filter(event, player) { - return player.getExpansions("sbqingjian").length > 0; - }, - forced: true, - locked: false, - async content(event, trigger, player) { - if (_status.connectMode) - game.broadcastAll(() => { - _status.noclearcountdown = true; - }); - const given_map = {}; - event.given_map = given_map; - const expansions = player.getExpansions("sbqingjian"); - let result; - while (true) { - if (expansions.length > 1) { - result = await player - .chooseCardButton("清俭:请选择要分配的牌", true, expansions, [ - 1, - expansions.length, - ]) - .set("ai", (button) => { - if (ui.selected.buttons.length) return 0; - return get.value(button.link, get.player()); - }) - .forResult(); - } else if (expansions.length === 1) - result = { bool: true, links: expansions.slice(0) }; - else return; - if (!result.bool) return; - const toGive = result.links; - result = await player - .chooseTarget( - `选择一名角色获得${get.translation(toGive)}`, - expansions.length === 1 - ) - .set("ai", (target) => { - const att = get.attitude(get.player(), target); - if (get.event("toEnemy")) return Math.max(0.01, 100 - att); - else if (att > 0) - return Math.max( - 0.1, - att / - Math.sqrt( - 1 + - target.countCards("h") + - (get.event().getParent().given_map[ - target.playerid - ] || 0) - ) - ); - else return Math.max(0.01, (100 + att) / 200); - }) - .set("toEnemy", get.value(toGive[0], player, "raw") < 0) - .forResult(); - if (result.bool) { - expansions.removeArray(toGive); - if (result.targets.length) { - const id = result.targets[0].playerid; - if (!given_map[id]) given_map[id] = []; - given_map[id].addArray(toGive); - } - if (!expansions.length) break; - } - } - if (_status.connectMode) - game.broadcastAll(() => { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - const gain_list = []; - for (const i in given_map) { - const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - gain_list.push([source, given_map[i]]); - game.log(source, "获得了", given_map[i]); - } - await game - .loseAsync({ - gain_list, - giver: player, - animate: "gain2", - }) - .setContent("gaincardMultiple"); - }, - }, - }, - }, - //荀彧 - sbquhu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter(event, player) { - return ( - game.countPlayer((current) => lib.skill.sbquhu.filterTarget(null, player, current)) > - 1 - ); - }, - filterTarget(card, player, target) { - return player != target && target.countCards("he") > 0; - }, - selectTarget: 2, - multitarget: true, - multiline: true, - async content(event, trigger, player) { - const targets = [player].addArray(event.targets); - targets.sortBySeat(); - const { result } = await player - .chooseCardOL(targets, "he", [1, Infinity], true, "驱虎:请将任意张牌扣置于武将牌上") - .set("ai", (card) => { - const player = get.event().getParent(2).player; - let value = 5; - if (get.player() == player) value -= 0.5; - return value - get.useful(card); - }); - const lose_list = []; - const map = new Map(); - let myCards; - let minLength = Infinity; - for (let i = 0; i < result.length; i++) { - const current = targets[i], - cards = result[i].cards; - if (current == player) myCards = cards; - else if (cards.length < minLength) minLength = cards.length; - lose_list.push([current, cards]); - map.set(current.playerid, cards); - } - await game - .loseAsync({ - lose_list, - log: true, - animate: "giveAuto", - gaintag: ["sbquhu"], - }) - .setContent(lib.skill.sbquhu.addToExpansionMultiple); - await game.asyncDelay(1.5); - const isMin = minLength > myCards.length; - const sortedList = lose_list - .filter((list) => list[0] != player) - .sort((a, b) => { - return ( - 1000 * (b[1].length - a[1].length) + - (get.distance(player, a[0], "absolute") - - get.distance(player, b[0], "absolute")) - ); - }); - const mostPlayer = sortedList[0][0], - secondPlayer = sortedList[1][0]; - await new Promise((resolve) => { - game.broadcastAll((lose_list) => { - lose_list.forEach((list) => - list[0].prompt(`${get.cnNumber(list[1].length)}张`, "wood") - ); - }, lose_list); - setTimeout(() => { - game.broadcastAll((lose_list) => { - lose_list.forEach((list) => list[0].unprompt()); - }, lose_list); - resolve(); - }, 2000 / (lib.config.speed == "vvfast" ? 3 : 1)); - }); - if (isMin) { - await mostPlayer.gain(myCards, "give", player); - await game.asyncDelay(); - const gain_list = lose_list.filter((list) => list[0] != player); - game.loseAsync({ - gain_list, - animate: "draw", - }).setContent("gaincardMultiple"); - } else { - mostPlayer.line(secondPlayer, "thunder"); - await secondPlayer.damage(mostPlayer); - await game.asyncDelay(); - await mostPlayer.gain(myCards, "give", player); - await game.asyncDelay(); - await game - .loseAsync({ - lose_list: sortedList, - }) - .setContent(() => { - for (var i = 0; i < event.lose_list.length; i++) { - var current = event.lose_list[i][0], - cards = event.lose_list[i][1]; - var next = current.lose(cards, ui.discardPile); - current.$throw(cards); - game.log(current, "将", cards, "置入了弃牌堆"); - next.set("relatedEvent", event.getParent()); - next.set("getlx", false); - } - }); - await game.asyncDelayx(); - } - }, - addToExpansionMultiple() { - "step 0"; - if (event.animate == "give") event.visible = true; - event.type = "addToExpansion"; - if (!event.gaintag) event.gaintag = []; - if (event.lose_list) { - var map = {}, - map2 = {}; - for (var list of event.lose_list) { - var player = list[0], - cards = list[1]; - var myId = player.playerid; - if (!map2[myId]) map2[myId] = []; - for (var i of cards) { - var owner = get.owner(i, "judge"); - if (owner && (owner != player || get.position(i) != "x")) { - var id = owner.playerid; - if (!map[id]) map[id] = [[], [], []]; - map[id][0].push(i); - map2[myId].push(i); - var position = get.position(i); - if (position == "h") map[id][1].push(i); - else map[id][2].push(i); - } else if (!event.updatePile && get.position(i) == "c") - event.updatePile = true; - } - } - event.losing_map = map; - event.gaining_map = map2; - for (var i in map) { - var owner = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - var next = owner - .lose(map[i][0], ui.special) - .set("forceDie", true) - .set("getlx", false); - next.set("relatedEvent", event.getParent()); - next.set("forceDie", true); - next.set("getlx", false); - if (event.visible == true) next.set("visible", true); - } - } else { - event.finish(); - } - "step 1"; - if (event.lose_list) { - var map = {}; - for (var list of event.lose_list) { - var player = list[0], - cards = list[1]; - for (var i = 0; i < cards.length; i++) { - if (cards[i].willBeDestroyed("expansion", player, event)) { - cards[i].selfDestroy(event); - cards.splice(i--, 1); - } else if (event.losing_map) { - for (var id in event.losing_map) { - if (event.losing_map[id][0].includes(cards[i])) { - var source = ( - _status.connectMode ? lib.playerOL : game.playerMap - )[id]; - var hs = source.getCards("hejsx"); - if (hs.includes(cards[i])) { - cards.splice(i--, 1); - } - } - } - } - } - } - } - if (cards.length == 0) { - event.finish(); - return; - } - "step 2"; - var loopedCount = 0, - mapLength = Object.keys(event.gaining_map).length; - for (var j in event.gaining_map) { - loopedCount++; - var map = {}; - var player = (_status.connectMode ? lib.playerOL : game.playerMap)[j], - cards = event.gaining_map[j]; - var hs = player.getCards("x"); - for (var i = 0; i < cards.length; i++) { - if (hs.includes(cards[i])) { - cards.splice(i--, 1); - } - } - for (var num = 0; num < cards.length; num++) { - if (_status.discarded) { - _status.discarded.remove(cards[num]); - } - for (var num2 = 0; num2 < cards[num].vanishtag.length; num2++) { - if (cards[num].vanishtag[num2][0] != "_") { - cards[num].vanishtag.splice(num2--, 1); - } - } - } - if (event.animate == "draw") { - player.$draw(cards.length); - if (event.log) - game.log(player, "将", get.cnNumber(cards.length), "张牌置于了武将牌上"); - game.pause(); - setTimeout( - (player, cards, resume) => { - player.$addToExpansion(cards, null, event.gaintag); - for (var i of event.gaintag) player.markSkill(i); - if (resume) game.resume(); - }, - get.delayx(500, 500), - player, - cards, - loopedCount === mapLength - ); - } else if (event.animate == "gain") { - player.$gain(cards, false); - game.pause(); - setTimeout( - (player, cards, resume) => { - player.$addToExpansion(cards, null, event.gaintag); - for (var i of event.gaintag) player.markSkill(i); - if (resume) game.resume(); - }, - get.delayx(700, 700), - player, - cards, - loopedCount === mapLength - ); - } else if (event.animate == "gain2" || event.animate == "draw2") { - var gain2t = 300; - if (player.$gain2(cards) && player == game.me) { - gain2t = 500; - } - game.pause(); - setTimeout( - (player, cards, resume) => { - player.$addToExpansion(cards, null, event.gaintag); - for (var i of event.gaintag) player.markSkill(i); - if (resume) game.resume(); - }, - get.delayx(gain2t, gain2t), - player, - cards, - loopedCount === mapLength - ); - } else if (event.animate == "give" || event.animate == "giveAuto") { - var evtmap = event.losing_map; - var entries = Object.entries(evtmap).map((entry) => [entry[0], entry[1][0]]); - var getOwner = (card) => { - var entry = entries.find((entry) => entry[1].includes(card)); - if (entry) - return (_status.connectMode ? lib.playerOL : game.playerMap)[entry[0]]; - return null; - }; - var gainmap = {}; - for (var cardx of cards) { - var owner = getOwner(cardx); - if (owner) { - var id = owner.playerid; - if (!gainmap[id]) gainmap[id] = []; - gainmap[id].push(cardx); - } - } - if (event.animate == "give") { - for (var i in gainmap) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - source.$give(evtmap[i][0], player, false); - if (event.log) game.log(player, "将", evtmap[i][0], "置于了武将牌上"); - } - } else { - for (var i in gainmap) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - if (evtmap[i][1].length) { - source.$giveAuto(evtmap[i][1], player, false); - if (event.log) - game.log( - player, - "将", - get.cnNumber(evtmap[i][1].length), - "张牌置于了武将牌上" - ); - } - if (evtmap[i][2].length) { - source.$give(evtmap[i][2], player, false); - if (event.log) game.log(player, "将", evtmap[i][2], "置于了武将牌上"); - } - } - } - game.pause(); - setTimeout( - (player, cards, resume) => { - player.$addToExpansion(cards, null, event.gaintag); - for (var i of event.gaintag) player.markSkill(i); - if (resume) game.resume(); - }, - get.delayx(500, 500), - player, - cards, - loopedCount === mapLength - ); - } else if (typeof event.animate == "function") { - var time = event.animate(event); - game.pause(); - setTimeout( - (player, cards, resume) => { - player.$addToExpansion(cards, null, event.gaintag); - for (var i of event.gaintag) player.markSkill(i); - if (resume) game.resume(); - }, - get.delayx(time, time), - player, - cards, - loopedCount === mapLength - ); - } else { - player.$addToExpansion(cards, null, event.gaintag); - for (var i of event.gaintag) player.markSkill(i); - event.finish(); - } - } - "step 3"; - game.delayx(); - if (event.updatePile) game.updateRoundNumber(); - }, - intro: { - markcount: "expansion", - mark(dialog, storage, player) { - const cards = player.getExpansions("sbquhu"); - if (player.isUnderControl(true)) dialog.addAuto(cards); - else return "共有" + get.cnNumber(cards.length) + "张牌"; - }, - }, - ai: { - order: 3.5, - result: { - target(player, target) { - let sgn = 1, - preAtt = 0; - if (ui.selected.targets.length) { - const selected = ui.selected.targets[0]; - preAtt = get.attitude(player, selected); - if (preAtt > 0) sgn = -1; - } - let eff = - 0.4 * - target.countCards("h", (card) => { - return 5 - get.useful(card); - }) - - 1; - if ( - (get.attitude(player, target) > 0 && sgn < 0) || - (get.attitude(player, target) < 0 && preAtt < 0) - ) - eff = -Math.abs(eff); - return eff; - }, - }, - }, - }, - sbjieming: { - audio: 2, - trigger: { - player: "damageEnd", - }, - direct: true, - async content(event, trigger, player) { - let num = Math.max(1, player.getDamagedHp()); - const { - result: { bool, targets }, - } = await player - .chooseTarget( - get.prompt("sbjieming"), - `令一名角色摸四张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于${get.cnNumber( - num - )}张,你失去1点体力。` - ) - .set("ai", (target) => { - if (get.event("nope")) return 0; - const player = get.player(), - att = get.attitude(player, target); - if (att > 2) { - const num = Math.sqrt( - Math.min( - 5, - Math.max( - 1, - target.countCards("he", (card) => get.value(card) < 5.5) - ) - ) - ); - return num * att; - } - return att / 3; - }) - .set( - "nope", - player.getHp() + - player.countCards("hs", (card) => player.canSaveCard(card, player)) <= - 1 && num > 2 - ); - if (!bool) return; - const target = targets[0]; - player.logSkill("sbjieming", target); - await target.draw(4); - num = Math.max(1, player.getDamagedHp()); - const { - result: { bool: bool2, cards }, - } = await target - .chooseToDiscard( - "节命:是否弃置任意张牌?", - `若你本次弃置的牌数不大于${get.cnNumber(num)}张,${get.translation( - player - )}失去1点体力。`, - [1, Infinity], - "he" - ) - .set("ai", (card) => { - if (get.event("nope")) return 0; - if (ui.selected.cards.length > get.event("num")) return 0; - return 6 - get.value(card); - }) - .set( - "nope", - get.attitude(target, player) * - get.effect(player, { name: "losehp" }, player, target) >= - 0 - ) - .set("num", num); - if (!bool2 || cards.length <= num) player.loseHp(); - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target(card, player, target, current) { - if (get.tag(card, "damage") && target.hp > 1) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - let max = 0; - const num = Math.max(1, player.getDamagedHp()); - if (num > 2) return [1, -2]; - const players = game.filterPlayer(); - for (const current of players) { - if (get.attitude(target, current) > 0) { - max = Math.max(current.countCards("he"), max); - } - } - return [1, Math.max(1, 1 + Math.min(2, max / 3))]; - } - if ( - (card.name == "tao" || card.name == "caoyao") && - target.hp > 1 && - target.countCards("h") <= target.hp - ) - return [0, 0]; - }, - }, - }, - }, - //曹丕 - sbxingshang: { - audio: 2, - trigger: { global: ["die", "damageEnd"] }, - filter(event, player) { - if (player.countMark("sbxingshang") >= get.info("sbxingshang").getLimit) return false; - return ( - event.name == "die" || !player.getHistory("custom", (evt) => evt.sbxingshang).length - ); - }, - forced: true, - locked: false, - async content(event, trigger, player) { - player.addMark( - "sbxingshang", - Math.min(2, get.info("sbxingshang").getLimit - player.countMark("sbxingshang")) - ); - if (trigger.name == "damage") player.getHistory("custom").push({ sbxingshang: true }); - }, - marktext: "颂", - intro: { - name: "颂", - content: "mark", - }, - ai: { threaten: 2.5 }, - getLimit: 9, - getNum(num) { - const list = [2, 2, 5, 5, 1, 2, 2, 3, 3, 2]; - if ( - typeof num != "number" || - !Array.from({ length: list.length }) - .map((_, i) => i + 1) - .includes(num) - ) - return 0; - return list[num - 1]; - }, - getEffect(player, num) { - if (!player || typeof num != "number") return 0; - switch (num) { - //行殇选项 - case 1: //-2,重置武将牌 - if ( - game.hasPlayer((target) => { - return get.attitude(player, target) > 0 && target.isTurnedOver(); - }) - ) - return 10; - return 0; - case 2: //-2,摸min(5,max(2,阵亡角色数))的牌 - return Math.min(5, Math.max(2, game.dead.length)); - case 3: //-5,加上限加血+复原装备栏 - if ( - !game.hasPlayer((target) => { - return get.attitude(player, target) > 0 && target.maxHp < 10; - }) - ) - return 0; - return ( - 5 + - (game.hasPlayer((target) => { - return get.attitude(player, target) > 0 && target.hasDisabledSlot(); - }) - ? 1 - : 0) - ); - case 4: //-5,劝封/化萍 - return 0; - //放逐选项 - case 5: //-1,封印基本牌外的手牌 - if ( - game.hasPlayer((target) => { - return get.attitude(player, target) < 0; - }) - ) - return 1; - return 0; - case 6: //-2,白板到结束 - if ( - game.hasPlayer((target) => { - if ( - target.hasSkill("sbfangzhu_ban") || - target.hasSkill("fengyin") || - target.hasSkill("baiban") - ) - return false; - return ( - get.attitude(player, target) < 0 && - ["name", "name1", "name2"].reduce((sum, name) => { - if ( - target[name] && - (name != "name1" || target.name != target.name1) - ) { - if (get.character(target[name])) - sum + get.rank(target[name], true); - } - return sum; - }, 0) > 5 - ); - }) - ) - return 6; - return 0; - case 7: //-2,强命到结束 - return 0; - case 8: //-3,翻面 - if ( - game.hasPlayer((target) => { - return get.attitude(player, target) < 0 && !target.isTurnedOver(); - }) - ) - return 8; - return 0; - case 9: //-3,封印装备牌外的手牌 - if ( - game.hasPlayer((target) => { - return get.attitude(player, target) < 0; - }) - ) - return 2.5; - return 0; - case 10: //-2,封印锦囊牌外的手牌 - if ( - game.hasPlayer((target) => { - return get.attitude(player, target) < 0; - }) - ) - return 1.5; - return 0; - default: //其他 - return 0; - } - }, - group: "sbxingshang_use", - subSkill: { - use: { - audio: "sbxingshang", - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer((target) => { - if (player.countMark("sbxingshang") > 1) return true; - return ( - player.countMark("sbxingshang") && - (target.isLinked() || target.isTurnedOver()) - ); - }); - }, - usable: 2, - chooseButton: { - dialog() { - var dialog = ui.create.dialog("行殇:请选择你要执行的一项", "hidden"); - dialog.add([ - [ - [1, "移去2个“颂”标记,复原一名角色的武将牌"], - [ - 2, - "移去2个“颂”标记,令一名角色摸" + - get.cnNumber(Math.min(5, Math.max(2, game.dead.length))) + - "张牌", - ], - [ - 3, - "移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏", - ], - [ - 4, - "移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去〖行殇〗〖放逐〗〖颂威〗", - ], - ], - "textbutton", - ]); - return dialog; - }, - filter(button, player) { - if ( - player.countMark("sbxingshang") < - get.info("sbxingshang").getNum(button.link) - ) - return false; - switch (button.link) { - case 1: - return game.hasPlayer( - (target) => target.isLinked() || target.isTurnedOver() - ); - case 2: - return true; - case 3: - return game.hasPlayer((target) => target.maxHp < 10); - case 4: - return game.dead.length; - } - }, - check(button) { - const player = get.event("player"), - info = get.info("sbxingshang"); - let list = Array.from({ length: 4 }).map((_, i) => i + 1); - list = list.filter( - (num) => player.countMark("sbxingshang") >= info.getNum(num) - ); - const num = list.sort( - (a, b) => info.getEffect(player, b) - info.getEffect(player, a) - )[0]; - return button.link == num ? 10 : 0; - }, - backup(links, player) { - return { - num: links[0], - audio: "sbxingshang", - filterCard: () => false, - selectCard: -1, - filterTarget(card, player, target) { - switch (lib.skill.sbxingshang_use_backup.num) { - case 1: - return (target) => target.isLinked() || target.isTurnedOver(); - case 2: - return true; - case 3: - return target.maxHp < 10; - case 4: - return target == player; - } - }, - selectTarget: () => (lib.skill.sbxingshang_use_backup.num == 4 ? -1 : 1), - async content(event, trigger, player) { - const target = event.targets[0]; - const num = lib.skill.sbxingshang_use_backup.num; - player.removeMark("sbxingshang", get.info("sbxingshang").getNum(num)); - switch (num) { - case 1: - if (target.isLinked()) target.link(false); - if (target.isTurnedOver()) target.turnOver(); - break; - case 2: - target.draw(Math.min(5, Math.max(2, game.dead.length))); - break; - case 3: - target.gainMaxHp(); - target.recover(); - let list = []; - for (let i = 1; i <= 5; i++) { - if (target.hasDisabledSlot(i)) list.push("equip" + i); - } - if (list.length) target.enableEquip(list.randomGet()); - break; - case 4: - let map = {}; - game.dead.forEach( - (target) => - (map[target.playerid] = get.translation(target)) - ); - const { - result: { control }, - } = await player - .chooseControl(Object.values(map)) - .set("ai", () => { - const getNum = (target) => { - let num = 0; - if (target.name && lib.character[target.name]) - num += get.rank(target.name, true); - if (target.name2 && lib.character[target.name2]) - num += get.rank(target.name2, true); - return num; - }; - let controls = _status.event.controls.slice(); - controls = controls.map((name) => [ - name, - game.dead.find( - (target) => - _status.event.map[target.playerid] == name - ), - ]); - controls.sort((a, b) => getNum(b[1]) - getNum(a[1])); - return controls[0][0]; - }) - .set("prompt", "获得一名已阵亡角色的所有技能") - .set("map", map); - if (control) { - const target2 = game.dead.find( - (targetx) => map[targetx.playerid] == control - ); - player.line(target2); - game.log(player, "选择了", target2); - const skills = target2.getStockSkills(true, true); - const skills2 = ["sbxingshang", "sbfangzhu", "sbsongwei"]; - player.changeSkills(skills, skills2); - } - } - }, - ai: { - result: { - target(player, target) { - switch (lib.skill.sbxingshang_use_backup.num) { - case 1: - let num = 0; - if ( - target.isLinked() && - !target.hasSkill("nzry_jieying") - ) - num += 0.5; - if (target.isTurnedOver()) num += 10; - return num; - case 2: - return get.effect( - target, - { name: "draw" }, - player, - player - ); - case 3: - return ( - Math.max( - 0, - get.recoverEffect(target, player, player) - ) + get.attitude(player, target) - ); - case 4: - return 1; - } - }, - }, - }, - }; - }, - prompt(links, player) { - const str = "###行殇###"; - switch (links[0]) { - case 1: - return str + "移去2个“颂”标记,复原一名角色的武将牌"; - case 2: - return ( - str + - "移去2个“颂”标记,令一名角色摸" + - get.cnNumber(Math.min(5, Math.max(2, game.dead.length))) + - "张牌" - ); - case 3: - return ( - str + - "移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏" - ); - case 4: - return ( - str + - "移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去武将牌上的所有技能" - ); - } - }, - }, - ai: { - order(_, player) { - const info = get.info("sbxingshang"); - const goon = - player.hasSkill("sbfangzhu") && - (player.getStat("skill").sbfangzhu || 0) < - (get.info("sbfangzhu").usable || Infinity); - let list = Array.from({ length: goon ? 10 : 4 }).map((_, i) => i + 1); - list = list.filter( - (num) => player.countMark("sbxingshang") >= info.getNum(num) - ); - list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a)); - return Array.from({ length: 4 }) - .map((_, i) => i + 1) - .includes(list[0]) && info.getEffect(player, list[0]) > 0 - ? 1 - : 0; - }, - result: { player: 1 }, - }, - }, - use_backup: {}, - }, - }, - sbfangzhu: { - audio: 2, - audioname: ["mb_caomao"], - enable: "phaseUse", - filter(event, player) { - return player.hasMark("sbxingshang"); - }, - usable: 1, - chooseButton: { - dialog() { - var dialog = ui.create.dialog("放逐:请选择你要执行的一项", "hidden"); - dialog.add([ - [ - [1, "移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束"], - [2, "移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束"], - [ - 3, - "移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束", - ], - [4, "移去3个“颂”标记,令一名其他角色将武将牌翻面"], - [5, "移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束"], - [6, "移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束"], - ], - "textbutton", - ]); - return dialog; - }, - filter(button, player) { - if (player.countMark("sbxingshang") < get.info("sbxingshang").getNum(button.link + 4)) - return false; - return game.hasPlayer((target) => { - if (target == player) return false; - const num = button.link, - storage = target.getStorage("sbfangzhu_ban"); - return !( - (num == 1 && storage.includes("basic")) || - (num == 5 && storage.includes("equip")) || - (num == 6 && storage.includes("trick")) - ); - }); - }, - check(button) { - const player = get.event("player"), - info = get.info("sbxingshang"); - let list = Array.from({ length: 6 }).map((_, i) => i + 1); - list = list.filter((num) => player.countMark("sbxingshang") >= info.getNum(num + 4)); - const num = - list.sort( - (a, b) => info.getEffect(player, b + 4) - info.getEffect(player, a + 4) - )[0] - 4; - return button.link == num ? 10 : 0; - }, - backup(links, player) { - return { - num: links[0], - audio: "sbfangzhu", - audioname: ["mb_caomao"], - filterCard: () => false, - selectCard: -1, - filterTarget(card, player, target) { - if (target == player) return false; - const num = lib.skill.sbfangzhu_backup.num, - storage = target.getStorage("sbfangzhu_ban"); - return !( - (num == 1 && storage.includes("basic")) || - (num == 5 && storage.includes("equip")) || - (num == 6 && storage.includes("trick")) - ); - }, - async content(event, trigger, player) { - const target = event.target; - const num = lib.skill.sbfangzhu_backup.num; - player.removeMark("sbxingshang", get.info("sbxingshang").getNum(num + 4)); - switch (num) { - case 1: - case 5: - case 6: - const type = ["basic", "equip", "trick"][[1, 5, 6].indexOf(num)]; - target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); - target.markAuto("sbfangzhu_ban", [type]); - break; - case 2: - target.addTempSkill("baiban", { player: "phaseEnd" }); - break; - case 3: - target.addTempSkill("sbfangzhu_kill", { player: "phaseEnd" }); - break; - case 4: - target.turnOver(); - break; - } - }, - ai: { - result: { - target(player, target) { - switch (lib.skill.sbfangzhu_backup.num) { - case 1: - return ( - -target.countCards( - "h", - (card) => get.type(card) != "basic" - ) - 1 - ); - case 2: - return -target - .getSkills(null, null, false) - .reduce((sum, skill) => { - return ( - sum + - Math.max( - get.skillRank(skill, "out"), - get.skillRank(skill, "in") - ) - ); - }, 0); - case 3: - return 0; - case 4: - if (get.attitude(player, target) > 0 && target.isTurnedOver()) - return 10 * target.countCards("hs") + 1; - if ( - get.attitude(player, target) < 0 && - !target.isTurnedOver() - ) - return -5 * target.countCards("hs") + 1; - return 0; - case 5: - return ( - -target.countCards( - "h", - (card) => get.type(card) != "equip" - ) - 3 - ); - case 6: - return ( - -target.countCards( - "h", - (card) => get.type2(card) != "trick" - ) - 2 - ); - } - }, - }, - }, - }; - }, - prompt(links, player) { - const str = "###放逐###"; - switch (links[0]) { - case 1: - return ( - str + - "移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束" - ); - case 2: - return ( - str + "移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束" - ); - case 3: - return ( - str + - "移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束" - ); - case 4: - return str + "移去3个“颂”标记,令一名其他角色将武将牌翻面"; - case 5: - return ( - str + - "移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束" - ); - case 6: - return ( - str + - "移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束" - ); - } - }, - }, - ai: { - order(_, player) { - const info = get.info("sbxingshang"); - const goon = - player.hasSkill("sbxingshang") && - (player.getStat("skill").sbxingshang_use || 0) < - (info.subSkill.use.usable || Infinity); - let list = Array.from({ length: goon ? 10 : 6 }).map((_, i) => i + (goon ? 1 : 5)); - list = list.filter((num) => player.countMark("sbxingshang") >= info.getNum(num)); - list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a)); - return Array.from({ length: 6 }) - .map((_, i) => i + 5) - .includes(list[0]) && info.getEffect(player, list[0]) > 0 - ? 1 - : 0; - }, - result: { player: 1 }, - combo: "sbxingshang", - }, - subSkill: { - backup: {}, - kill: { - charlotte: true, - mark: true, - marktext: "禁", - intro: { content: "不能响应其他角色使用的牌" }, - trigger: { global: "useCard1" }, - filter(event, player) { - return event.player != player; - }, - forced: true, - popup: false, - async content(event, trigger, player) { - trigger.directHit.add(player); - }, - }, - ban: { - charlotte: true, - onremove: true, - mark: true, - marktext: "禁", - intro: { - markcount: () => 0, - content(storage) { - if (storage.length > 1) return "不能使用手牌"; - return "于手牌中只能使用" + get.translation(storage[0]) + "牌"; - }, - }, - mod: { - cardEnabled(card, player) { - const storage = player.getStorage("sbfangzhu_ban"); - if (get.itemtype(card) == "card" && get.position(card) != "h") return; - if (storage.length > 1 || !storage.includes(get.type2(card))) return false; - }, - cardSavable(card, player) { - const storage = player.getStorage("sbfangzhu_ban"); - if (get.itemtype(card) == "card" && get.position(card) != "h") return; - if (storage.length > 1 || !storage.includes(get.type2(card))) return false; - }, - }, - }, - }, - }, - sbsongwei: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - if (player.countMark("sbxingshang") >= get.info("sbxingshang").getLimit) return false; - return game.hasPlayer((target) => target.group == "wei" && target != player); - }, - zhuSkill: true, - forced: true, - locked: false, - async content(event, trigger, player) { - player.addMark( - "sbxingshang", - Math.min( - get.info("sbxingshang").getLimit - player.countMark("sbxingshang"), - 2 * game.countPlayer((target) => target.group == "wei" && target != player) - ) - ); - }, - group: "sbsongwei_delete", - subSkill: { - delete: { - audio: "sbsongwei", - enable: "phaseUse", - filter(event, player) { - if (player.storage.sbsongwei_delete) return false; - return game.hasPlayer((target) => - lib.skill.sbsongwei.subSkill.delete.filterTarget(null, player, target) - ); - }, - filterTarget(card, player, target) { - return ( - target != player && - target.group == "wei" && - target.getStockSkills(false, true).length - ); - }, - skillAnimation: true, - animationColor: "thunder", - async content(event, trigger, player) { - player.storage.sbsongwei_delete = true; - player.awakenSkill("sbsongwei_delete"); - event.target.removeSkills(event.target.getStockSkills(false, true)); - }, - ai: { - order: 13, - result: { - target(player, target) { - return -target.getStockSkills(false, true).length; - }, - }, - }, - }, - }, - }, - //关羽 - //矢 - sbwusheng: { - audio: 3, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return game.hasPlayer((target) => target != player && !target.isZhu2()); - }, - direct: true, - content: function* (event, map) { - var player = map.player; - var result = yield player - .chooseTarget( - get.prompt("sbwusheng"), - "选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸" + - (get.mode() === "identity" ? "两" : "一") + - "张牌,对其使用三张【杀】后不能对其使用【杀】", - (card, player, target) => { - return target != player && !target.isZhu2(); - } - ) - .set("ai", (target) => { - var player = _status.event.player; - return get.effect(target, { name: "sha" }, player, player); - }); - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbwusheng", target); - if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.25); - player.addTempSkill("sbwusheng_effect", { player: "phaseUseAfter" }); - player.storage.sbwusheng_effect[target.playerid] = 0; - } - }, - group: "sbwusheng_wusheng", - subSkill: { - wusheng: { - audio: "sbwusheng", - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - return name == "sha" && player.countCards("hs"); - }, - filter: function (event, player) { - return ( - event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) || - lib.inpile_nature.some((nature) => - event.filterCard( - get.autoViewAs({ name: "sha", nature }, "unsure"), - player, - event - ) - ) - ); - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - if (event.filterCard({ name: "sha" }, player, event)) - list.push(["基本", "", "sha"]); - for (var j of lib.inpile_nature) { - if (event.filterCard({ name: "sha", nature: j }, player, event)) - list.push(["基本", "", "sha", j]); - } - var dialog = ui.create.dialog("武圣", [list, "vcard"], "hidden"); - dialog.direct = true; - return dialog; - }, - check: function (button) { - var player = _status.event.player; - var card = { name: button.link[2], nature: button.link[3] }; - if ( - _status.event.getParent().type == "phase" && - game.hasPlayer(function (current) { - return ( - player.canUse(card, current) && - get.effect(current, card, player, player) > 0 - ); - }) - ) { - switch (button.link[2]) { - case "sha": - if (button.link[3] == "fire") return 2.95; - else if (button.link[3] == "thunder" || button.link[3] == "ice") - return 2.92; - else return 2.9; - } - } - return 1 + Math.random(); - }, - backup: function (links, player) { - return { - audio: "sbwusheng", - filterCard: true, - check: function (card) { - return 6 - get.value(card); - }, - viewAs: { name: links[0][2], nature: links[0][3] }, - position: "hs", - popname: true, - }; - }, - prompt: function (links, player) { - return ( - "将一张手牌当作" + - get.translation(links[0][3] || "") + - "【" + - get.translation(links[0][2]) + - "】" + - (_status.event.name == "chooseToUse" ? "使用" : "打出") - ); - }, - }, - ai: { - respondSha: true, - fireAttack: true, - skillTagFilter: function (player, tag) { - if (!player.countCards("hs")) return false; - }, - order: function (item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - if ( - lib.inpile_nature.some( - (i) => player.getUseValue({ name: "sha", nature: i }) > 0 - ) - ) { - var temp = get.order({ name: "sha" }); - if (temp > max) max = temp; - } - if (max > 0) max += 0.3; - return max; - } - return 4; - }, - result: { player: 1 }, - }, - }, - effect: { - charlotte: true, - onremove: true, - init: function (player) { - if (!player.storage.sbwusheng_effect) player.storage.sbwusheng_effect = {}; - }, - mod: { - targetInRange: function (card, player, target) { - if ( - card.name == "sha" && - typeof player.storage.sbwusheng_effect[target.playerid] == "number" - ) - return true; - }, - cardUsableTarget: function (card, player, target) { - if ( - card.name !== "sha" || - typeof player.storage.sbwusheng_effect[target.playerid] !== "number" - ) - return; - return player.storage.sbwusheng_effect[target.playerid] < 3; - }, - playerEnabled: function (card, player, target) { - if ( - card.name != "sha" || - typeof player.storage.sbwusheng_effect[target.playerid] != "number" - ) - return; - if (player.storage.sbwusheng_effect[target.playerid] >= 3) return false; - }, - }, - audio: "sbwusheng", - trigger: { player: ["useCardToPlayered", "useCardAfter"] }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - if (event.name == "useCard") - return event.targets.some( - (target) => - typeof player.storage.sbwusheng_effect[target.playerid] == "number" - ); - return typeof player.storage.sbwusheng_effect[event.target.playerid] == "number"; - }, - direct: true, - content: function () { - if (trigger.name == "useCard") { - var targets = trigger.targets.filter( - (target) => - typeof player.storage.sbwusheng_effect[target.playerid] == "number" - ); - targets.forEach( - (target) => player.storage.sbwusheng_effect[target.playerid]++ - ); - } else { - player.logSkill("sbwusheng_effect", trigger.target); - player.draw(get.mode() === "identity" ? 2 : 1); - } - }, - }, - }, - ai: { threaten: 114514 }, - }, - sbyijue: { - audio: 2, - trigger: { global: "damageBegin4" }, - filter: function (event, player) { - if (!event.source || event.source != player || event.player == player) return false; - return ( - event.num >= event.player.hp && !player.getStorage("sbyijue").includes(event.player) - ); - }, - forced: true, - logTarget: "player", - content: function () { - trigger.cancel(); - player.addTempSkill("sbyijue_effect"); - player.markAuto("sbyijue", [trigger.player]); - player.markAuto("sbyijue_effect", [trigger.player]); - }, - ai: { - halfneg: true - }, - marktext: "绝", - intro: { content: "已放$一马" }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - audio: "sbyijue", - trigger: { player: "useCardToPlayer" }, - filter: function (event, player) { - return player.getStorage("sbyijue_effect").includes(event.target); - }, - forced: true, - logTarget: "target", - content: function () { - trigger.getParent().excluded.add(trigger.target); - }, - ai: { - effect: { - player: function (card, player, target) { - if (player.getStorage("sbyijue_effect").includes(target)) - return "zeroplayertarget"; - }, - }, - }, - marktext: "义", - intro: { content: "本回合放$一马" }, - }, - }, - }, - //黄月英 - sbqicai: { - mod: { - targetInRange: function (card, player, target) { - if (get.type2(card) == "trick") return true; - }, - }, - locked: false, - getLimit: 3, - audio: 2, - enable: "phaseUse", - onChooseToUse: function (event) { - if (!event.sbqicai && !game.online) { - const player = get.player(); - const cards = Array.from(ui.discardPile.childNodes).filter((card) => - lib.skill.sbqicai.filterCardx(card, player) - ); - event.set("sbqicai", cards); - } - }, - filter: function (event, player) { - return ( - player.countCards("h", (card) => lib.skill.sbqicai.filterCardx(card, player)) || - (event.sbqicai && event.sbqicai.length) - ); - }, - filterCardx: function (card, player) { - if (player.getStorage("sbqicai").includes(card.name)) return false; - return ( - get.type(card) == "equip" && - game.hasPlayer((target) => target != player && target.hasEmptySlot(get.subtype(card))) - ); - }, - usable: 1, - chooseButton: { - dialog: function (event, player) { - const list1 = player.getCards("h", (card) => - lib.skill.sbqicai.filterCardx(card, player) - ); - const list2 = event.sbqicai; - var dialog = ui.create.dialog( - '###奇才###
    请选择一张装备牌置入一名其他角色的装备区
    ' - ); - if (list1.length) { - dialog.add('
    手牌区
    '); - dialog.add(list1); - } - if (list2.length) { - dialog.add('
    弃牌堆
    '); - dialog.add(list2); - if (list1.length) dialog.classList.add("fullheight"); - } - return dialog; - }, - check: function (button) { - var player = _status.event.player; - var num = get.value(button.link); - if ( - !game.hasPlayer( - (target) => - target != player && - target.hasEmptySlot(get.subtype(button.link)) && - get.attitude(player, target) > 0 - ) - ) - num = 1 / (get.value(button.link) || 0.5); - if (get.owner(button.link)) return num; - return num * 5; - }, - backup: function (links, player) { - return { - audio: "sbqicai", - card: links[0], - filterCard: function (card, player) { - var cardx = lib.skill.sbqicai_backup.card; - if (get.owner(cardx)) return card == cardx; - return false; - }, - selectCard: -1, - filterTarget: function (card, player, target) { - return target != player && target.canEquip(lib.skill.sbqicai_backup.card); - }, - check: () => 1, - discard: false, - lose: false, - prepare: function (cards, player, targets) { - if (cards && cards.length) player.$give(cards, targets[0], false); - }, - content: function () { - if (!cards || !cards.length) { - cards = [lib.skill.sbqicai_backup.card]; - target.$gain2(cards); - game.delayx(); - } - if (get.mode() == "doudizhu") player.markAuto("sbqicai", [cards[0].name]); - target.equip(cards[0]); - player.addSkill("sbqicai_gain"); - lib.skill.sbqicai.updateCounter(player, target, 0); - }, - ai: { - result: { - target: function (player, target) { - var att = get.attitude(player, target); - if (att > 0) return 3; - if (att < 0) return -1; - return 0; - }, - }, - }, - }; - }, - prompt: function (links, player) { - return "请选择置入" + get.translation(links) + "的角色"; - }, - }, - updateCounter: function (player, target, num) { - const skill = `sbqicai_${player.playerid}`; - game.broadcastAll(lib.skill.sbqicai.initSkill, skill); - if (!target.hasSkill(skill)) target.addSkill(skill); - if (num == 0) target.clearMark(skill, false); - else if (num > 0) target.addMark(skill, num, false); - if (target.countMark(skill) >= lib.skill.sbqicai.getLimit) target.removeSkill(skill); - if (!_status.postReconnect.sbqicai) { - _status.postReconnect.sbqicai = [lib.skill.sbqicai.initSkill, []]; - } - _status.postReconnect.sbqicai[1].add(skill); - }, - initSkill: (skill) => { - if (!lib.skill[skill]) { - lib.skill[skill] = { - onremove: true, - mark: true, - marktext: "奇", - intro: { - markcount: function (storage) { - return (storage || 0).toString(); - }, - content: function (storage) { - return "已被掠夺" + get.cnNumber(storage || 0) + "张普通锦囊牌"; - }, - }, - }; - lib.translate[skill] = "奇才"; - lib.translate[skill + "_bg"] = "奇"; - } - }, - ai: { - order: 7, - result: { - player: function (player) { - if ( - !game.hasPlayer( - (target) => - target != player && - target.hasEmptySlot(2) && - get.attitude(player, target) != 0 - ) - ) - return 0; - return 1; - }, - }, - }, - marktext: "才", - intro: { content: "已使用$发动过此技能" }, - subSkill: { - gain: { - audio: "sbqicai", - trigger: { global: ["gainAfter", "loseAsyncAfter"] }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - if ( - !event.getg(current).length || - !current.hasSkill("sbqicai_" + player.playerid) - ) - return false; - if ( - current.countMark("sbqicai_" + player.playerid) >= - lib.skill.sbqicai.getLimit - ) - return false; - return event - .getg(current) - .some( - (card) => - get.type(card) == "trick" && - lib.filter.canBeGained(card, current, player) - ); - }); - }, - forced: true, - direct: true, - charlotte: true, - content: function () { - "step 0"; - if (!event.checkedTargets) event.checkedTargets = []; - var target = game.findPlayer(function (current) { - if ( - !trigger.getg(current).length || - !current.hasSkill("sbqicai_" + player.playerid) - ) - return false; - if (event.checkedTargets.includes(current)) return false; - if ( - current.countMark("sbqicai_" + player.playerid) >= - lib.skill.sbqicai.getLimit - ) - return false; - return trigger - .getg(current) - .some( - (card) => - get.type(card) == "trick" && - lib.filter.canBeGained(card, current, player) - ); - }); - if (!target) { - event.finish(); - return; - } - event.target = target; - player.logSkill("sbqicai_gain", target); - event.checkedTargets.add(target); - var cards = trigger - .getg(target) - .filter( - (card) => - get.type(card) == "trick" && - lib.filter.canBeGained(card, target, player) - ); - if ( - cards.length <= - lib.skill.sbqicai.getLimit - target.countMark("sbqicai_" + player.playerid) - ) - event._result = { bool: true, links: cards }; - else { - var num = - lib.skill.sbqicai.getLimit - - target.countMark("sbqicai_" + player.playerid); - target - .chooseButton( - [ - "奇才:将其中" + - get.cnNumber(num) + - "张牌交给" + - get.translation(player), - cards, - ], - num, - true - ) - .set("ai", function (button) { - return get.value(button.link) * get.sgn(_status.event.att); - }) - .set("att", get.attitude(target, player)); - } - "step 1"; - if (result.bool) { - game.delaye(0.5); - target.give(result.links, player); - lib.skill.sbqicai.updateCounter(player, target, result.links.length); - } - event.goto(0); - }, - }, - }, - }, - sbjizhi: { - audio: 2, - trigger: { player: "useCard" }, - filter: function (event, player) { - return get.type(event.card) == "trick"; - }, - forced: true, - content: function () { - player.draw().gaintag = ["sbjizhi"]; - player.addTempSkill("sbjizhi_mark"); - }, - subSkill: { - mark: { - charlotte: true, - onremove: function (player) { - player.removeGaintag("sbjizhi"); - }, - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("sbjizhi")) return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("sbjizhi")) return false; - }, - }, - }, - }, - }, - //诸葛亮 - sbhuoji: { - audio: 3, - dutySkill: true, - derivation: ["sbguanxing", "sbkongcheng"], - group: ["sbhuoji_fire", "sbhuoji_achieve", "sbhuoji_fail", "sbhuoji_mark"], - subSkill: { - fire: { - audio: "sbhuoji1.mp3", - enable: "phaseUse", - filterTarget: lib.filter.notMe, - prompt: "选择一名其他角色,对其与其势力相同的所有其他角色各造成1点火属性伤害", - usable: 1, - line: "fire", - content: function () { - "step 0"; - target.damage("fire"); - "step 1"; - var targets = game.filterPlayer((current) => { - if (current == player || current == target) return false; - return current.group == target.group; - }); - if (targets.length) { - game.delayx(); - player.line(targets, "fire"); - targets.forEach((i) => i.damage("fire")); - } - }, - ai: { - order: 7, - fireAttack: true, - result: { - target: function (player, target) { - var att = get.attitude(player, target); - return ( - get.sgn(att) * - game - .filterPlayer((current) => { - if (current == player) return false; - return current.group == target.group; - }) - .reduce( - (num, current) => - num + get.damageEffect(current, player, player, "fire"), - 0 - ) - ); - }, - }, - }, - }, - achieve: { - audio: "sbhuoji2.mp3", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return ( - player - .getAllHistory("sourceDamage", (evt) => evt.hasNature("fire")) - .reduce((num, evt) => num + evt.num, 0) >= - game.players.length + game.dead.length - ); - }, - forced: true, - locked: false, - skillAnimation: true, - animationColor: "fire", - async content(event, trigger, player) { - player.awakenSkill("sbhuoji"); - game.log(player, "成功完成使命"); - player.changeSkin("sbhuoji", "sb_zhugeliang"); - player.changeSkills(["sbguanxing", "sbkongcheng"], ["sbhuoji", "sbkanpo"]); - }, - }, - fail: { - audio: "sbhuoji3.mp3", - trigger: { player: "dying" }, - forced: true, - locked: false, - content: function () { - player.awakenSkill("sbhuoji"); - game.log(player, "使命失败"); - }, - }, - mark: { - charlotte: true, - trigger: { source: "damage" }, - filter: function (event, player) { - return event.hasNature("fire"); - }, - firstDo: true, - forced: true, - popup: false, - content: function () { - player.addTempSkill("sbhuoji_count", { - player: ["sbhuoji_achieveBegin", "sbhuoji_failBegin"], - }); - player.storage.sbhuoji_count = player - .getAllHistory("sourceDamage", (evt) => evt.hasNature("fire")) - .reduce((num, evt) => num + evt.num, 0); - player.markSkill("sbhuoji_count"); - }, - }, - count: { - charlotte: true, - intro: { content: "本局游戏已造成过#点火属性伤害" }, - }, - }, - }, - sbkanpo: { - init: function (player) { - if (!player.storage.sbkanpo) { - player.storage.sbkanpo = [ - get.mode() == "doudizhu" || (get.mode() == "versus" && _status.mode == "two") - ? 2 - : 4, - [], - [], - ]; - player.markSkill("sbkanpo"); - } - }, - audio: 2, - trigger: { global: "roundStart" }, - filter: function (event, player) { - var storage = player.storage.sbkanpo; - return storage[0] || storage[1].length; - }, - forced: true, - locked: false, - content: function* (event, map) { - var player = map.player, - storage = player.storage.sbkanpo; - var sum = storage[0]; - storage[1] = []; - player.markSkill("sbkanpo"); - if (!sum) return; - const list = get.inpileVCardList((info) => { - if (info[2] == "sha" && info[3]) return false; - return info[0] != "equip"; - }); - const func = () => { - const event = get.event(); - const controls = [ - (link) => { - const evt = get.event(); - if (evt.dialog && evt.dialog.buttons) { - for (let i = 0; i < evt.dialog.buttons.length; i++) { - const button = evt.dialog.buttons[i]; - button.classList.remove("selectable"); - button.classList.remove("selected"); - const counterNode = button.querySelector(".caption"); - if (counterNode) { - counterNode.childNodes[0].innerHTML = ``; - } - } - ui.selected.buttons.length = 0; - game.check(); - } - return; - }, - ]; - event.controls = [ui.create.control(controls.concat(["清除选择", "stayleft"]))]; - }; - if (event.isMine()) func(); - else if (event.isOnline()) event.player.send(func); - var result = yield player - .chooseButton( - ["看破:是否记录至多" + get.cnNumber(sum) + "个牌名?", [list, "vcard"]], - [1, sum], - false - ) - .set("ai", function (button) { - if (ui.selected.buttons.length >= Math.max(3, game.countPlayer() / 2)) return 0; - switch (button.link[2]) { - case "wuxie": - return 5 + Math.random(); - case "sha": - return 5 + Math.random(); - case "tao": - return 4 + Math.random(); - case "jiu": - return 3 + Math.random(); - case "lebu": - return 3 + Math.random(); - case "shan": - return 4.5 + Math.random(); - case "wuzhong": - return 4 + Math.random(); - case "shunshou": - return 2.7 + Math.random(); - case "nanman": - return 2 + Math.random(); - case "wanjian": - return 1.6 + Math.random(); - default: - return 1.5 + Math.random(); - } - }) - .set("filterButton", (button) => { - return !_status.event.names.includes(button.link[2]); - }) - .set("names", storage[2]) - .set("custom", { - add: { - confirm: function (bool) { - if (bool != true) return; - const event = get.event().parent; - if (event.controls) event.controls.forEach((i) => i.close()); - if (ui.confirm) ui.confirm.close(); - game.uncheck(); - }, - button: function () { - if (ui.selected.buttons.length) return; - const event = get.event(); - if (event.dialog && event.dialog.buttons) { - for (let i = 0; i < event.dialog.buttons.length; i++) { - const button = event.dialog.buttons[i]; - const counterNode = button.querySelector(".caption"); - if (counterNode) { - counterNode.childNodes[0].innerHTML = ``; - } - } - } - if (!ui.selected.buttons.length) { - const evt = event.parent; - if (evt.controls) evt.controls[0].classList.add("disabled"); - } - }, - }, - replace: { - button: function (button) { - const event = get.event(), - sum = event.sum; - if (!event.isMine()) return; - if (button.classList.contains("selectable") == false) return; - if (ui.selected.buttons.length >= sum) return false; - button.classList.add("selected"); - ui.selected.buttons.push(button); - let counterNode = button.querySelector(".caption"); - const count = ui.selected.buttons.filter((i) => i == button).length; - if (counterNode) { - counterNode = counterNode.childNodes[0]; - counterNode.innerHTML = `×${count}`; - } else { - counterNode = ui.create.caption( - `×${count}`, - button - ); - counterNode.style.right = "5px"; - counterNode.style.bottom = "2px"; - } - const evt = event.parent; - if (evt.controls) evt.controls[0].classList.remove("disabled"); - game.check(); - }, - }, - }) - .set("sum", sum); - if (result.bool) { - var names = result.links.map((link) => link[2]); - storage[0] -= names.length; - storage[1] = names; - storage[2] = names; - } else storage[2] = []; - player.markSkill("sbkanpo"); - }, - marktext: "破", - intro: { - markcount: function (storage) { - return storage[1].length; - }, - mark: function (dialog, content, player) { - const storage = player.getStorage("sbkanpo"); - const sum = storage[0]; - const names = storage[1]; - dialog.addText("剩余可记录" + sum + "次牌名"); - if (player.isUnderControl(true) && names.length) { - dialog.addText("当前记录牌名:"); - dialog.addSmall([names, "vcard"]); - } - }, - }, - group: "sbkanpo_kanpo", - subSkill: { - kanpo: { - audio: "sbkanpo", - trigger: { global: "useCard" }, - filter: function (event, player) { - return ( - event.player != player && player.storage.sbkanpo[1].includes(event.card.name) - ); - }, - prompt2: function (event, player) { - return ( - "移除" + - get.translation(event.card.name) + - "的记录,令" + - get.translation(event.card) + - "无效" - ); - }, - check: function (event, player) { - var effect = 0; - if (event.card.name == "wuxie" || event.card.name == "shan") { - if (get.attitude(player, event.player) < -1) effect = -1; - } else 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) { - if (event.card.name == "sha") { - 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) - ); - } else return true; - } - return false; - }, - logTarget: "player", - content: function () { - player.storage.sbkanpo[1].remove(trigger.card.name); - player.markSkill("sbkanpo"); - trigger.targets.length = 0; - trigger.all_excluded = true; - player.draw(); - }, - }, - }, - }, - sbguanxing: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - filter: function (event, player) { - var bool = player.hasCard((card) => card.hasGaintag("sbguanxing"), "s"); - if (event.name == "phaseZhunbei") { - return bool || 7 - lib.skill.sbguanxing.getNum * player.countMark("sbguanxingx") > 0; - } - return bool && player.hasSkill("sbguanxing_on"); - }, - forced: true, - locked: false, - content: function () { - "step 0"; - if (trigger.name == "phaseJieshu") { - event.goto(2); - return; - } - player.addMark("sbguanxingx", 1, false); - var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); - if (cards.length) player.loseToDiscardpile(cards); - var num = player.countMark("sbguanxingx") - 1; - event.num = Math.max(0, 7 - lib.skill.sbguanxing.getNum * num); - "step 1"; - if (num) { - var cards2 = get.cards(num); - player.$gain2(cards2, false); - game.log(player, "将", cards2, "置于了武将牌上"); - player.loseToSpecial(cards2, "sbguanxing").visible = true; - player.markSkill("sbguanxing"); - } - "step 2"; - var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); - if (cards.length) { - player - .chooseToMove() - .set("list", [["你的“星”", cards], ["牌堆顶"]]) - .set("prompt", "观星:点击将牌移动到牌堆顶") - .set("processAI", function (list) { - var cards = list[0][1].slice(), - player = _status.event.player; - var name = _status.event.getTrigger().name; - var target = name == "phaseZhunbei" ? player : player.getNext(); - var judges = target.getCards("j"); - var top = [], - att = get.sgn(get.attitude(player, target)); - if (judges.length && att != 0 && (target != player || !player.hasWuxie())) { - for (var i = 0; i < judges.length; i++) { - var judge = (card, num) => get.judge(card) * num; - cards.sort((a, b) => judge(b, att) - judge(a, att)); - if (judge(cards[0], att) < 0) break; - else top.unshift(cards.shift()); - } - } - return [cards, top]; - }) - .set("filterOk", function (moved) { - return moved[1].length; - }); - } else event._result = { bool: false }; - "step 3"; - if (result.bool) { - var cards = result.moved[1]; - player.loseToDiscardpile(cards, ui.cardPile, "insert").log = false; - game.log(player, "将", cards, "置于了牌堆顶"); - } else if (trigger.name == "phaseZhunbei") player.addTempSkill("sbguanxing_on"); - }, - getNum: 3, - group: "sbguanxing_unmark", - subSkill: { - on: { charlotte: true }, - unmark: { - trigger: { player: "loseAfter" }, - filter: function (event, player) { - if (!event.ss || !event.ss.length) return false; - return !player.countCards("s", (card) => card.hasGaintag("sbguanxing")); - }, - charlotte: true, - forced: true, - silent: true, - content: function () { - player.unmarkSkill("sbguanxing"); - }, - }, - }, - marktext: "星", - intro: { - mark: function (dialog, storage, player) { - var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); - if (!cards || !cards.length) return; - dialog.addAuto(cards); - }, - markcount: function (storage, player) { - return player.countCards("s", (card) => card.hasGaintag("sbguanxing")); - }, - onunmark: function (storage, player) { - var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); - if (cards.length) player.loseToDiscardpile(cards); - }, - }, - mod: { - aiOrder: function (player, card, num) { - var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); - if (get.itemtype(card) == "card" && card.hasGaintag("sbguanxing")) - return num + (cards.length > 1 ? 0.5 : -0.0001); - }, - }, - }, - sbkongcheng: { - audio: 2, - trigger: { player: ["damageBegin3", "damageBegin4"] }, - filter: function (event, player, name) { - if (!player.hasSkill("sbguanxing")) return false; - const num = player.countCards("s", (card) => card.hasGaintag("sbguanxing")); - if (name == "damageBegin3" && !num) return true; - if (name == "damageBegin4" && num) return true; - return false; - }, - forced: true, - content: function () { - "step 0"; - var num = player.countCards("s", (card) => card.hasGaintag("sbguanxing")); - if (!num && event.triggername == "damageBegin3") { - trigger.increase("num"); - } else if (num && event.triggername == "damageBegin4") { - player - .judge(function (result) { - if ( - get.number(result) <= - get.player().countCards("s", (card) => card.hasGaintag("sbguanxing")) - ) - return 2; - return -1; - }) - .set("judge2", (result) => result.bool) - .set("callback", function () { - if ( - event.judgeResult.number <= - player.countCards("s", (card) => card.hasGaintag("sbguanxing")) - ) { - event.getParent("sbkongcheng").getTrigger().decrease("num"); - } - }); - } - }, - ai: { - combo: "sbguanxing", - }, - }, - //卢植 - sbzhenliang: { - mark: true, - locked: false, - zhuanhuanji: true, - marktext: "☯", - intro: { - content: function (storage, player) { - if (storage) - return "你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。"; - return "出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。"; - }, - }, - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (player.storage.sbzhenliang) return false; - var storage = player.getExpansions("nzry_mingren"); - if (!storage.length) return false; - var color = get.color(storage[0]); - return game.hasPlayer(function (current) { - return ( - player.inRange(current) && - player.countCards("he", function (card) { - return get.color(card) == color; - }) >= Math.max(1, Math.abs(player.getHp() - current.getHp())) - ); - }); - }, - filterCard: function (card, player) { - return get.color(card) == get.color(player.getExpansions("nzry_mingren")[0]); - }, - selectCard: [1, Infinity], - complexSelect: true, - complexCard: true, - position: "he", - filterTarget: function (card, player, target) { - return ( - player.inRange(target) && - ui.selected.cards.length == Math.max(1, Math.abs(player.getHp() - target.getHp())) - ); - }, - check: function (card) { - return 6.5 - get.value(card); - }, - prompt: "弃置与攻击范围内的一名角色体力值之差(至少为1)张与“任”颜色相同的牌,对其造成1点伤害", - content: function () { - player.changeZhuanhuanji("sbzhenliang"); - target.damage("nocard"); - }, - ai: { - order: 5, - result: { - player: function (player, target) { - return get.damageEffect(target, player, player); - }, - }, - combo: "nzry_mingren", - }, - group: "sbzhenliang_draw", - subSkill: { - draw: { - trigger: { global: ["useCardAfter", "respondAfter"] }, - filter: function (event, player) { - if (_status.currentPhase == player || !player.storage.sbzhenliang) return false; - var card = player.getExpansions("nzry_mingren")[0]; - return card && get.type2(event.card) == get.type2(card); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("sbzhenliang"), "令一名角色摸两张牌") - .set("ai", function (target) { - if (target.hasSkillTag("nogain")) return 0.1; - var att = get.attitude(player, target); - return att * (Math.max(5 - target.countCards("h"), 2) + 3); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.changeZhuanhuanji("sbzhenliang"); - player.logSkill("sbzhenliang", target); - target.draw(2); - } - }, - }, - }, - }, - //小乔 - sbtianxiang: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return ( - player.countCards("he", (card) => lib.skill.sbtianxiang.filterCard(card, player)) && - game.hasPlayer((target) => lib.skill.sbtianxiang.filterTarget(null, player, target)) - ); - }, - filterCard: function (card, player) { - return get.color(card, player) == "red"; - }, - filterTarget: function (card, player, target) { - return ( - target != player && - !target.getSkills().some((skill) => skill.indexOf("sbtianxiang_") == 0) - ); - }, - discard: false, - lose: false, - delay: 0, - usable: 3, - prompt: "将一张红色牌交给一名角色并令其获得此花色的“天香”标记", - content: function () { - player.give(cards, target); - var suit = get.suit(cards[0], player); - target.addSkill("sbtianxiang_" + suit); - }, - ai: { - order: 5, - result: { target: -1 }, - }, - group: ["sbtianxiang_draw", "sbtianxiang_effect"], - subSkill: { - heart: { - charlotte: true, - mark: true, - marktext: "♥︎", - intro: { content: "伤害转移术" }, - }, - diamond: { - charlotte: true, - mark: true, - marktext: "♦︎", - intro: { content: "掳掠大法" }, - }, - draw: { - audio: "sbtianxiang", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return game.hasPlayer((target) => - target.getSkills().some((skill) => skill.indexOf("sbtianxiang_") == 0) - ); - }, - forced: true, - locked: false, - content: function () { - var num = 0; - game.countPlayer((target) => { - var skills = target - .getSkills() - .filter((skill) => skill.indexOf("sbtianxiang_") == 0); - target.removeSkill(skills); - num += skills.length; - }); - if (get.mode() != "identity") num += 2; - player.draw(num); - }, - }, - effect: { - trigger: { player: "damageBegin3" }, - filter: function (event, player) { - return game.hasPlayer((target) => - target.getSkills().some((skill) => skill.indexOf("sbtianxiang_") == 0) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("sbtianxiang"), - "移去一名角色的“天香”标记并执行相应效果", - function (card, player, target) { - return target - .getSkills() - .some((skill) => skill.indexOf("sbtianxiang_") == 0); - } - ) - .set("ai", (target) => { - var player = _status.event.player; - return ( - -get.attitude(player, target) * - target - .getSkills() - .filter((skill) => skill.indexOf("sbtianxiang_") == 0).length - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("sbtianxiang", target); - var skills = target - .getSkills() - .filter((skill) => skill.indexOf("sbtianxiang_") == 0); - target.removeSkill(skills); - if (skills.includes("sbtianxiang_heart")) { - target.damage(trigger.source ? trigger.source : "nosource"); - trigger.cancel(); - } - if (skills.includes("sbtianxiang_diamond")) { - var cards = target.getCards("he"); - if (!cards.length) event.finish(); - else if (cards.length <= 2) event._result = { bool: true, cards: cards }; - else - target.chooseCard( - "he", - 2, - "天香:交给" + get.translation(player) + "两张牌", - true - ); - } else event.finish(); - } else event.finish(); - "step 2"; - if (result.bool) player.gain(result.cards, target, "giveAuto"); - }, - }, - }, - }, - //张郃 - sbqiaobian: { - audio: 2, - trigger: { player: ["phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore"] }, - usable: 1, - direct: true, - content: function () { - "step 0"; - switch (trigger.name) { - case "phaseJudge": - player - .chooseTarget( - get.prompt("sbqiaobian"), - "失去1点体力并跳过判定阶段,将判定区里的牌移动给一名其他角色", - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player; - if ( - player.hp + - player.countCards("h", function (card) { - var mod2 = game.checkMod( - card, - player, - "unchanged", - "cardEnabled2", - player - ); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod( - card, - player, - player, - "unchanged", - "cardSavable", - player - ); - if (mod != "unchanged") return mod; - var savable = get.info(card).savable; - if (typeof savable == "function") - savable = savable(card, player, player); - return savable; - }) <= - 1 - ) - return 0; - var eff = 0; - for (var card of player.getCards("j")) { - var cardx; - if (card.viewAs) - cardx = get.autoViewAs({ name: card.viewAs }, [card]); - else cardx = card; - if (target.canAddJudge(cardx)) - eff += get.effect(target, cardx, player, player); - else eff -= get.attitude(player, target) / 114514; - } - return eff; - }) - .setHiddenSkill("sbqiaobian"); - break; - case "phaseDraw": - player - .chooseBool( - get.prompt("sbqiaobian"), - "跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力" - ) - .setHiddenSkill("sbqiaobian"); - break; - case "phaseUse": - var num = player.countCards("h") - 6; - if (num <= 0) - player - .chooseBool( - get.prompt("sbqiaobian"), - "跳过出牌阶段和弃牌阶段,然后移动场上的一张牌" - ) - .set("choice", player.canMoveCard(true)) - .setHiddenSkill("sbqiaobian"); - else - player - .chooseToDiscard( - get.prompt("sbqiaobian"), - num, - "弃置" + - get.cnNumber(num) + - "张手牌并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌" - ) - .set("ai", function (card) { - var player = _status.event.player; - if ( - !player.canMoveCard(true) || - player.countCards("hs", (card) => player.hasValueTarget(card)) >= - 9 - ) - return 0; - return 7 - get.value(card); - }) - .setHiddenSkill("sbqiaobian").logSkill = "sbqiaobian"; - break; - } - "step 1"; - if (result.bool) { - trigger.cancel(); - switch (trigger.name) { - case "phaseJudge": - var target = result.targets[0]; - player.logSkill("sbqiaobian", target); - player.loseHp(); - game.log(player, "跳过了判定阶段"); - for (var card of player.getCards("j")) { - if (target.canAddJudge(card)) { - player.$give(card, target, false); - if (card.viewAs) target.addJudge({ name: card.viewAs }, [card]); - else target.addJudge(card); - } else player.discard(card); - } - break; - case "phaseDraw": - player.logSkill("sbqiaobian"); - game.log(player, "跳过了摸牌阶段"); - player.addSkill("sbqiaobian_draw"); - break; - case "phaseUse": - if (!result.cards || !result.cards.length) - player.logSkill("sbqiaobian", target); - player.skip("phaseDiscard"); - game.log(player, "跳过了出牌阶段"); - game.log(player, "跳过了弃牌阶段"); - player.moveCard(); - break; - } - } else player.storage.counttrigger.sbqiaobian--; - }, - subSkill: { - draw: { - charlotte: true, - mark: true, - intro: { content: "准备阶段摸五张牌并回复1点体力" }, - audio: "sbqiaobian", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - content: function () { - player.removeSkill("sbqiaobian_draw"); - player.draw(5); - player.recover(); - }, - }, - }, - }, - //萌货 - sbhuoshou: { - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - filter: function (event, player) { - return true; - }, - forced: true, - onremove: true, - group: ["sbhuoshou_cancel", "sbhuoshou_source", "sbhuoshou_nanmaned"], - content: function () { - "step 0"; - var card = get.discardPile((card) => { - return card.name == "nanman"; - }); - if (card) { - player.gain(card, "gain2"); - } else { - game.log("但是弃牌堆里并没有", "#y南蛮入侵", "!"); - player.addMark("sbhuoshou", 1, false); - if (player.countMark("sbhuoshou") >= 5 && Math.random() < 0.25) - player.chat("我南蛮呢"); - } - }, - subSkill: { - cancel: { - audio: "sbhuoshou", - trigger: { target: "useCardToBefore" }, - forced: true, - priority: 15, - filter: function (event, player) { - return event.card.name == "nanman"; - }, - content: function () { - trigger.cancel(); - }, - }, - source: { - audio: "sbhuoshou", - trigger: { global: "useCardToPlayered" }, - forced: true, - filter: function (event, player) { - return ( - event.isFirstTarget && - event.card && - event.card.name == "nanman" && - event.player != player - ); - }, - content: function () { - trigger.getParent().customArgs.default.customSource = player; - }, - }, - nanmaned: { - trigger: { - player: "useCard1", - }, - filter: function (event, player) { - return event.card.name == "nanman"; - }, - forced: true, - popup: false, - charlotte: true, - content: function () { - "step 0"; - player.addTempSkill("sbhuoshou_ban", "phaseUseAfter"); - }, - }, - ban: { - charlotte: true, - intro: { - content: "此阶段不能再使用【南蛮入侵】", - }, - }, - }, - mod: { - cardEnabled: function (card, player) { - if (player.hasSkill("sbhuoshou_ban") && card.name == "nanman") return false; - }, - }, - ai: { - threaten: 1.9, - }, - }, - sbzaiqi: { - audio: 2, - trigger: { - player: "phaseDiscardEnd", - }, - chargeSkill: true, - filter: function (event, player) { - return player.hasMark("charge"); - }, - group: "sbzaiqi_backflow", - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("sbzaiqi"), - "选择任意名角色并消耗等量蓄力值,令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力", - [1, player.countMark("charge")] - ) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - return 3 - get.sgn(att) + Math.abs(att / 1000); - }); - "step 1"; - if (result.bool) { - var targets = result.targets; - targets.sortBySeat(); - event.targets = targets; - player.logSkill("sbzaiqi", targets); - player.removeMark("charge", targets.length); - } else event.finish(); - "step 2"; - var target = targets.shift(); - event.target = target; - if (!target.countCards("he")) event._result = { bool: false }; - else - target - .chooseToDiscard( - get.translation(player) + "对你发动了【再起】", - "是否弃置一张牌令其回复1点体力?或者点击“取消”,令该角色摸一张牌。", - "he" - ) - .set("ai", (card) => { - var eff = _status.event.eff, - att = _status.event.att; - if ((eff > 0 && att > 0) || (eff <= 0 && att < 0)) - return 5.5 - get.value(card); - return 0; - }) - .set("eff", get.recoverEffect(player, player, target)) - .set("att", get.attitude(target, player)); - "step 3"; - target.line(player); - if (result.bool) { - player.recover(); - } else { - player.draw(); - } - game.delayex(); - if (targets.length) event.goto(2); - }, - subSkill: { - backflow: { - audio: "sbzaiqi", - trigger: { - //player:'enterGame', - source: "damageSource", - //global:'phaseBefore', - }, - usable: 1, - filter: function (event, player) { - if (event.name == "damage") return true; - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - locked: false, - content: function () { - player.addMark("charge", trigger.name == "damage" ? 1 : 3); - }, - }, - }, - }, - //祝融 - sblieren: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return ( - event.targets.length == 1 && - event.card.name == "sha" && - player.canCompare(event.target, true) - ); - }, - check: function (event, player) { - return ( - get.attitude(player, event.target) <= 0 || - game.hasPlayer((current) => get.damageEffect(current, player, player) > 0) - ); - }, - shaRelated: true, - logTarget: "target", - content: function () { - "step 0"; - player.draw(); - "step 1"; - if (player.canCompare(trigger.target)) player.chooseToCompare(trigger.target); - else event.finish(); - "step 2"; - if (result.bool) { - player.addTempSkill("sblieren_damage"); - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.sblieren = [player, trigger.target]; - } - }, - subSkill: { - damage: { - audio: "sblieren", - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return ( - event.card.name == "sha" && - event.card.storage && - event.card.storage.sblieren && - event.card.storage.sblieren[0] == player && - game.hasPlayer((current) => { - return !event.card.storage.sblieren.includes(current); - }) - ); - }, - direct: true, - charlotte: true, - content: function () { - "step 0"; - var target = trigger.card.storage.sblieren[1]; - player - .chooseTarget( - "烈刃:是否对除" + - get.translation(target) + - "外的一名其他角色造成1点伤害?", - (card, player, target) => { - return target != _status.event.targeted && target != player; - } - ) - .set("targeted", target) - .set("ai", (targetx) => - get.damageEffect(targetx, _status.event.player, _status.event.player) - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sblieren_damage", target); - target.damage(); - } - }, - }, - }, - }, - sbjuxiang: { - audio: 2, - trigger: { - player: "phaseJieshuBegin", - }, - forced: true, - direct: true, - filter: function (event, player) { - return ( - !player.hasHistory("useCard", (evt) => evt.card.name == "nanman") && - (!_status.sbjuxiang_nanman || _status.sbjuxiang_nanman.length) - ); - }, - group: ["sbjuxiang_cancel", "sbjuxiang_gain"], - content: function () { - "step 0"; - if (!_status.sbjuxiang_nanman) { - _status.sbjuxiang_nanman = [ - { name: "nanman", number: 7, suit: "spade" }, - { name: "nanman", number: 7, suit: "club" }, - ]; - game.broadcastAll(function () { - if (!lib.inpile.includes("nanman")) lib.inpile.add("nanman"); - }); - } - player - .chooseTarget( - get.prompt("sbjuxiang"), - "将游戏外的随机一张【南蛮入侵】交给一名角色(剩余" + - get.cnNumber(_status.sbjuxiang_nanman.length) + - "张)" - ) - .set("ai", (target) => { - var player = _status.event.player; - return ( - Math.max(0, target.getUseValue({ name: "nanman" })) * - get.attitude(player, target) * - (target == player ? 0.5 : 1) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbjuxiang", target); - if (!_status.sbjuxiang_nanman.length) return; - var info = _status.sbjuxiang_nanman.randomRemove(); - var card = game.createCard2(info); - target.gain(card, "gain2").giver = player; - } - }, - ai: { - expose: 0.05, - effect: { - target: function (card) { - if (card.name == "nanman") return [0, 1]; - }, - }, - }, - subSkill: { - cancel: { - audio: "sbjuxiang", - trigger: { target: "useCardToBefore" }, - forced: true, - priority: 15, - filter: function (event, player) { - return event.card.name == "nanman"; - }, - content: function () { - trigger.cancel(); - }, - }, - gain: { - audio: "sbjuxiang", - trigger: { global: "useCardAfter" }, - forced: true, - filter: function (event, player) { - return ( - event.card.name == "nanman" && - event.player != player && - event.cards.filterInD().length - ); - }, - content: function () { - player.gain(trigger.cards.filterInD(), "gain2"); - }, - }, - }, - }, - //阿笨 - sbjiang: { - audio: 2, - trigger: { - player: "useCardToPlayered", - target: "useCardToTargeted", - }, - shaRelated: true, - filter: function (event, player) { - if ( - !( - event.card.name == "juedou" || - (event.card.name == "sha" && get.color(event.card) == "red") - ) - ) - return false; - return true; - }, - frequent: true, - onremove: true, - group: ["sbjiang_add", "sbjiang_qiben"], - content: function () { - player.draw(); - }, - ai: { - effect: { - target: function (card, player, target) { - if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; - }, - player: function (card, player, target) { - if (card.name == "sha" && get.color(card) == "red") return [1, 1]; - }, - }, - }, - subSkill: { - add: { - audio: "sbjiang", - trigger: { player: "useCard2" }, - direct: true, - filter: function (event, player) { - if (event.card.name != "juedou") return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(event.card, player, current) && - lib.filter.targetInRange(event.card, player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var prompt2 = - "为" + get.translation(trigger.card) + "额外指定一个目标,然后失去1点体力"; - player - .chooseTarget(get.prompt("sbjiang_add"), function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card, player, target); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var eff = get.effect(target, trigger.card, player, player); - if (player.hasZhuSkill("sbzhiba") && !player.hasMark("sbjiang")) - return eff; - if (eff + get.effect(player, { name: "losehp" }, player) / 8 > 0) - return eff; - return 0; - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("sbjiang_add", event.targets); - trigger.targets.addArray(event.targets); - player.loseHp(); - } - }, - }, - qiben: { - audio: "sbjiang", - enable: "phaseUse", - viewAs: { name: "juedou" }, - filterCard: true, - position: "h", - selectCard: -1, - prompt: function () { - var player = _status.event.player; - var limit = player.hasMark("sbjiang") - ? game.countPlayer((current) => { - return current.group == "wu" && current != player; - }) + 1 - : 1; - return "出牌阶段限" + get.cnNumber(limit) + "次。你可以将所有手牌当【决斗】使用"; - }, - filter: function (event, player) { - var limit = player.hasMark("sbjiang") - ? game.countPlayer((current) => { - return current.group == "wu" && current != player; - }) + 1 - : 1; - if ((player.getStat("skill").sbjiang_qiben || 0) >= limit) return false; - var hs = player.getCards("h"); - if (!hs.length) return false; - for (var i = 0; i < hs.length; i++) { - var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player); - if (mod2 === false) return false; - } - return event.filterCard(get.autoViewAs({ name: "juedou" }, hs)); - }, - ai: { - order: 0.001, - nokeep: true, - skillTagFilter: function (player, tag, arg) { - if (tag === "nokeep") { - if (arg && (!arg.card || get.name(arg.card) !== "tao")) return false; - let limit = player.hasMark("sbjiang") - ? game.countPlayer((current) => { - return current.group == "wu" && current != player; - }) + 1 - : 1; - return ( - player.isPhaseUsing() && - (player.getStat("skill").sbjiang_qiben || 0) < limit && - player.hasCard((card) => get.name(card) != "tao", "h") - ); - } - }, - }, - }, - }, - }, - sbhunzi: { - audio: 2, - trigger: { player: "dyingAfter" }, - juexingji: true, - forced: true, - skillAnimation: true, - animationColor: "wood", - derivation: ["sbyingzi", "gzyinghun"], - content: function () { - "step 0"; - player.awakenSkill("sbhunzi"); - player.loseMaxHp(); - "step 1"; - player.changeHujia(1, null, true); - "step 2"; - player.draw(3); - "step 3"; - player.addSkills(["sbyingzi", "gzyinghun"]); - }, - ai: { - threaten: function (player, target) { - if (target.hp == 1) return 2; - return 0.5; - }, - maixie: true, - effect: { - target: function (card, player, target) { - if (!target.hasFriend() || target.hp > 1) return; - if ( - get.tag(card, "damage") == 1 && - ((target.hasZhuSkill("sbzhiba") && - game.countPlayer( - (current) => current != target && current.group == "wu" - )) || - player.countCards("hs", (card) => player.canSaveCard(card, target)) + - target.countCards("hs", (card) => target.canSaveCard(card, target)) > - 0) && - !target.isTurnedOver() && - _status.currentPhase != target && - get.distance(_status.currentPhase, target, "absolute") <= 3 - ) - return [0.5, 1]; - }, - }, - }, - }, - sbzhiba: { - audio: 2, - trigger: { player: "dying" }, - filter: function (event, player) { - if (!player.hasZhuSkill("sbzhiba")) return false; - return player.hp <= 0; - }, - zhuSkill: true, - limited: true, - mark: true, - skillAnimation: true, - animationColor: "wood", - content: function () { - "step 0"; - player.awakenSkill("sbzhiba"); - event.targets = game - .filterPlayer((current) => { - return current.group == "wu" && current != player; - }) - .sortBySeat(_status.currentPhase); - var num = event.targets.length; - if (num > 0) player.recover(num); - player.addMark("sbjiang", 1, false); - player.addTempSkill("sbzhiba_draw"); - if (!event.targets.length) event.finish(); - "step 1"; - var target = targets.shift(); - target.damage("nosource"); - if (targets.length) event.redo(); - }, - subSkill: { - draw: { - trigger: { global: "dieAfter" }, - filter: function (event, player) { - return event.getParent(3).name == "sbzhiba"; - }, - forced: true, - charlotte: true, - content: function () { - player.draw(3); - }, - }, - }, - }, - //大乔 - sbguose: { - audio: 2, - enable: "phaseUse", - get usable() { - return get.mode() == "identity" ? 4 : 2; - }, - discard: false, - lose: false, - delay: false, - filter: function (event, player) { - return ( - player.hasCard((card) => get.suit(card) == "diamond", "hes") || - game.hasPlayer((current) => current.hasJudge("lebu")) - ); - }, - position: "hes", - filterCard: function (card, player) { - if (get.suit(card) != "diamond") return false; - var mod = game.checkMod( - ui.selected.cards[0], - player, - "unchanged", - "cardEnabled2", - player - ); - if (!mod) return false; - return true; - }, - selectCard: [0, 1], - filterTarget: function (card, player, target) { - if (!ui.selected.cards.length) { - if (target.hasJudge("lebu")) return true; - return false; - } - if (player == target) return false; - return player.canUse(get.autoViewAs({ name: "lebu" }, ui.selected.cards), target); - }, - complexSelect: true, - check: function (card) { - return 7 - get.value(card); - }, - content: function () { - "step 0"; - if (target.hasJudge("lebu")) { - target.discard(target.getJudge("lebu")); - } else { - player.useCard({ name: "lebu" }, target, cards).audio = false; - } - "step 1"; - player.draw(); - }, - ai: { - result: { - target: function (player, target) { - if (target.hasJudge("lebu")) - return -get.effect(target, { name: "lebu" }, player, target); - return get.effect(target, { name: "lebu" }, player, target); - }, - }, - order: 9, - }, - }, - sbliuli: { - audio: 2, - inherit: "liuli", - group: "sbliuli_heart", - subSkill: { - heart: { - trigger: { player: "logSkill" }, - filter: function (event, player) { - if (event.skill != "sbliuli") return false; - if (player.hasSkill("sbliuli_used")) return false; - var evt = event.log_event; - return player.hasHistory("lose", (evtx) => { - return evtx.getParent(2) == evt && get.suit(evtx.cards[0]) == "heart"; - }); - }, - direct: true, - content: function () { - "step 0"; - var sourcex = trigger.log_event.getTrigger().player; - player - .chooseTarget( - "流离:是否令一名不为" + - get.translation(sourcex) + - "的其他角色获得“流离”标记?", - (card, player, target) => { - return target != player && target != _status.event.sourcex; - } - ) - .set("ai", (target) => { - return get.attitude(_status.event.player, target); - }) - .set("sourcex", sourcex); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - game.countPlayer((i) => i.removeSkill("sbliuli_dangxian")); - target.addSkill("sbliuli_dangxian"); - player.addTempSkill("sbliuli_used"); - } - }, - }, - used: { charlotte: true }, - dangxian: { - trigger: { player: "phaseBegin" }, - forced: true, - charlotte: true, - mark: true, - marktext: "流", - intro: { content: "回合开始时,执行一个额外的出牌阶段" }, - content: function () { - var next = player.phaseUse(); - event.next.remove(next); - trigger.next.push(next); - player.removeSkill("sbliuli_dangxian"); - }, - }, - }, - }, - //刘表 - sbzishou: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - if (player == event.player) return false; - if (!event.player.countCards("he")) return false; - return ( - !event.player.hasAllHistory("sourceDamage", (evt) => { - return evt.player == player; - }) && - !event.player.hasAllHistory("damage", (evt) => { - return evt.source == player; - }) - ); - }, - forced: true, - logTarget: "player", - content: function () { - "step 0"; - trigger.player.chooseCard( - true, - get.translation(player) + "对你发动了【自守】", - "交给其一张牌", - "he" - ); - "step 1"; - if (result.bool) { - trigger.player.give(result.cards, player); - } - }, - ai: { - threaten: 3, - }, - }, - sbzongshi: { - audio: 2, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - if (!event.source || !event.source.isIn()) return false; - return !player.getStorage("sbzongshi").includes(event.source); - }, - forced: true, - onremove: true, - logTarget: "source", - content: function () { - trigger.source.chooseToDiscard(true, trigger.source.countCards("h")); - player.markAuto("sbzongshi", [trigger.source]); - }, - intro: { - content: "已扒过目标:$", - }, - ai: { - threaten: 0.5, - effect: { - target: function (card, player, target, current) { - if (player._sbzongshi_aiChecking) return; - if (!get.tag(card, "damage")) return; - var cards = player.getCards("h"); - if (!target.hasFriend()) return; - player._sbzongshi_aiChecking = true; - var value = cards.reduce((p, c) => { - return p + get.value(c); - }, 0); - delete player._sbzongshi_aiChecking; - if (cards.length > 5 || value > 5 * cards.length) - return [1, 0, 0, -cards.length / 2]; - return [1, 0, 0, -0.5]; - }, - }, - }, - }, - //貂蝉 - sblijian: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return ( - !player.getStat("skill").sblijian && - game.countPlayer((current) => { - return current != player; - }) > 1 - ); - }, - filterCard: true, - selectCard: [1, Infinity], - position: "he", - filterTarget: lib.filter.notMe, - selectTarget: function () { - return ui.selected.cards.length + 1; - }, - filterOk: function () { - return ui.selected.targets.length == ui.selected.cards.length + 1; - }, - check: function (card) { - let player = get.owner(card), - targets = lib.skill.sblijian.selectTargetAi(_status.event, player); - if (ui.selected.cards.length < targets - 1) { - if (player.hasSkill("sbbiyue")) return 4 * targets - get.value(card); - return 6 + targets - get.value(card); - } - return 0; - }, - selectTargetAi: (event, player) => { - let cache = _status.event.getTempCache("sblijian", "targets"); - if (Array.isArray(cache)) return cache.length; - let targets = [], - cards = [0], - sbbiyue = player.hasSkill("sbbiyue") - ? Math.max( - 0, - 3 - - game.countPlayer2((current) => { - return current.getHistory("damage").length > 0; - }) - ) - : 0, - alter = [null, 1, 1], - temp; - for (let i of game.players) { - if (player === i) continue; - let vplayer = ui.create.player(i); - temp = get.effect( - i, - new lib.element.VCard({ name: "juedou", isCard: true }), - vplayer, - i - ); - vplayer.remove(); - if (temp) { - let att = get.attitude(event.player, i); - if ((!att && sbbiyue) || att * temp > 0) targets.push([i, temp, att]); - else if (!alter[2]) continue; - else if (!att || (att > 0 && temp > -15 && i.hp > 2) || (att < 0 && temp < 15)) - alter = [i, temp, att]; - } - } - targets.sort((a, b) => { - if (Boolean(a[2]) !== Boolean(b[2])) return Math.abs(b[2]) - Math.abs(a[2]); - return Math.abs(b[1]) - Math.abs(a[1]); - }); - if (targets.length < 2 && alter[0]) targets.push(alter); - targets = targets.slice( - 0, - 1 + - player.countCards("he", (card) => { - if (lib.filter.cardDiscardable(card, player, "sblijian")) { - cards.push(get.value(card)); - return true; - } - return false; - }) - ); - cards.sort((a, b) => a - b); - for (let i = 0; i < targets.length; i++) { - if (Math.abs(targets[i][1]) < cards[i] / (1 + sbbiyue)) { - targets.splice(i, targets.length - i); - break; - } - } - if (targets.length < 2) { - event.putTempCache("sblijian", "targets", []); - return 0; - } - event.putTempCache("sblijian", "targets", targets); - return targets.length; - }, - multiline: true, - content: function () { - var targetx = targets.slice().sortBySeat(target)[1]; - var card = { name: "juedou", isCard: true }; - if (target.canUse(card, targetx)) target.useCard(card, targetx); - }, - ai: { - threaten: 3, - order: 7, - result: { - player: function (player, target) { - let targets = _status.event.getTempCache("sblijian", "targets"); - if (Array.isArray(targets)) - for (let arr of targets) { - if (target === arr[0] && !arr[2]) return 1; - } - return 0; - }, - target: function (player, target) { - let targets = _status.event.getTempCache("sblijian", "targets"); - if (Array.isArray(targets)) - for (let arr of targets) { - if (target === arr[0]) { - if (arr[1] * arr[2] < 0) return get.sgn(arr[2]); - return arr[1]; - } - } - return 0; - }, - }, - }, - }, - sbbiyue: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - content: function () { - player.draw( - Math.min( - 4, - game.countPlayer2((current) => { - return current.getHistory("damage").length > 0; - }) + 1 - ) - ); - }, - }, - //陈宫 - sbmingce: { - audio: 2, - enable: "phaseUse", - usable: 1, - position: "he", - filter: function (event, player) { - return player.countCards("he") > 0; - }, - filterCard: true, - check: function (card) { - return 8 - get.value(card); - }, - filterTarget: lib.filter.notMe, - selectTarget: 1, - discard: false, - lose: false, - delay: false, - onremove: true, - group: "sbmingce_hit", - content: function () { - "step 0"; - player.give(cards, target); - "step 1"; - var choices = ["选项二"]; - var choiceList = [ - "失去1点体力,令" + get.translation(player) + "摸两张牌并获得1枚“策”", - "摸一张牌", - ]; - if (target.hp > 0) choices.unshift("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - target - .chooseControl(choices) - .set("choiceList", choiceList) - .set("prompt", get.translation(player) + "对你发动了【明策】,请选择一项") - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - target.hp <= 0 || - (((target.hp + target.countCards("hs", "tao") > 2 && - get.attitude(target, player) > 0) || - get.effect(target, { name: "losehp" }, target, target) > 0) && - target.hp > 0) - ? 0 - : 1 - ); - "step 2"; - if (result.control == "选项一") { - target.loseHp(); - player.draw(2); - } else { - target.draw(); - event.finish(); - } - "step 3"; - player.addMark("sbmingce", 1); - }, - marktext: "笨", - intro: { - name: "策(明策)", - name2: "策", - content: "mark", - }, - ai: { - result: { - player: 0.5, - target: 1, - }, - order: 8.5, - expose: 0.2, - }, - subSkill: { - hit: { - audio: "sbmingce", - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return player.hasMark("sbmingce"); - }, - direct: true, - content: function () { - "step 0"; - var num = player.countMark("sbmingce"); - event.num = num; - player - .chooseTarget( - get.prompt("sbmingce"), - "移去所有“策”,对一名其他角色造成" + num + "点伤害", - lib.filter.notMe - ) - .set("ai", (target) => { - var player = _status.event.player; - var eff = get.damageEffect(target, player, player); - var num = player.countMark("sbmingce"); - if (target.hasSkillTag("filterDamage", null, { player: player })) num = 1; - return eff * num; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbmingce_hit", target); - player.removeMark("sbmingce", num); - target.damage(num); - } - }, - }, - }, - }, - sbzhichi: { - audio: 2, - trigger: { player: "damageEnd" }, - forced: true, - content: function () { - player.addTempSkill("sbzhichi_muteki"); - }, - subSkill: { - muteki: { - audio: "sbzhichi", - trigger: { player: "damageBegin4" }, - charlotte: true, - forced: true, - group: "sbzhichi_egg", - content: function () { - trigger.cancel(); - }, - mark: true, - intro: { content: "我无敌啦!" }, - ai: { - maixie: true, - maixie_hp: true, - nofire: true, - nothunder: true, - nodamage: true, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage")) return "zeroplayertarget"; - }, - }, - }, - }, - egg: { - trigger: { player: "die" }, - charlotte: true, - forced: true, - silent: true, - forceDie: true, - content: function () { - player.chat("你是真滴牛批"); - }, - }, - }, - }, - //袁绍 - sbluanji: { - audio: 2, - enable: "phaseUse", - trigger: { global: "respond" }, - viewAs: { name: "wanjian" }, - forced: true, - locked: false, - filter: function (event, player) { - if (event.name == "chooseToUse") - return player.countCards("hs") > 1 && !player.hasSkill("sbluanji_used"); - var evt = event.getParent(2); - return ( - evt.name == "wanjian" && - evt.getParent().player == player && - event.player != player && - player.getHistory("gain", function (evt) { - return evt.getParent(2).name == "sbluanji"; - }).length < 3 - ); - }, - filterCard: true, - selectCard: 2, - position: "hs", - prompt: "将两张手牌当【万箭齐发】使用", - check: function (card) { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return player.canUse("wanjian", current); - }); - var num = 0; - for (var i = 0; i < targets.length; i++) { - var eff = get.sgn(get.effect(targets[i], { name: "wanjian" }, player, player)); - if (targets[i].hp == 1) { - eff *= 1.5; - } - if (get.attitude(player, targets[i]) == 0 || targets[i].group == "qun") { - eff += 0.5; - } - num += eff; - } - if (!player.needsToDiscard(-1)) { - if (targets.length >= 7) { - if (num < 1) return 0; - } else if (targets.length >= 5) { - if (num < 0.5) return 0; - } - } - return 6 - get.value(card); - }, - content: function () { - player.draw(); - }, - precontent: function () { - player.addTempSkill("sbluanji_used", "phaseUseAfter"); - }, - ai: { - threaten: 1.6, - }, - subSkill: { used: { charlotte: true } }, - }, - sbxueyi: { - audio: 2, - trigger: { player: "useCardToTargeted" }, - filter: function (event, player) { - return ( - player.hasZhuSkill("sbxueyi") && event.target != player && event.target.group == "qun" - ); - }, - zhuSkill: true, - forced: true, - usable: 2, - logTarget: "target", - content: function () { - player.draw(); - }, - mod: { - maxHandcard: function (player, num) { - if (player.hasZhuSkill("sbxueyi")) { - return ( - num + - 2 * game.countPlayer((current) => player != current && current.group == "qun") - ); - } - }, - }, - ai: { - effect: { - player: function (card, player, target) { - if (player != target && target && target.group == "qun" && card.name != "tao") - return [1, 0.1]; - }, - }, - }, - }, - //庞统 - sblianhuan: { - audio: 2, - enable: "phaseUse", - filter: (event, player) => - player.hasCard( - (card) => lib.skill.sblianhuan.filterCard(card, player), - lib.skill.sblianhuan.position - ), - filterTarget: function (card, player, target) { - if (player.hasSkill("sblianhuan_blocker")) return false; - if (!ui.selected.cards.length) return false; - card = get.autoViewAs({ name: "tiesuo" }, [ui.selected.cards[0]]); - return player.canUse(card, target); - }, - filterCard: (card, player) => - get.suit(card) == "club" && - (!player.hasSkill("sblianhuan_blocker") || player.canRecast(card)), - selectCard: 1, - position: "hs", - derivation: "sblianhuan_lv2", - selectTarget: function () { - var card = get.card(), - player = get.player(); - if (player.hasSkill("sblianhuan_blocker")) return 0; - if (card == undefined) return; - var range = [0, 2]; - game.checkMod(card, player, range, "selectTarget", player); - return range; - }, - filterOk: function () { - var card = ui.selected.cards[0]; - if (!card) return false; - if (get.position(card) == "s" && !ui.selected.targets.length) return false; - return true; - }, - check: function (card) { - return 6 - get.value(card); - }, - prompt: function () { - var player = _status.event.player, - use = !player.hasSkill("sblianhuan_blocker"); - return "重铸一张♣手牌" + (use ? ";或将一张♣手牌当【铁索连环】使用" : ""); - }, - group: ["sblianhuan_use", "sblianhuan_add", "sblianhuan_discard2"], - multitarget: true, - multiline: true, - discard: false, - lose: false, - delay: false, - content: function () { - "step 0"; - if (targets.length) { - player.addTempSkill("sblianhuan_blocker", "phaseUseAfter"); - var card = get.autoViewAs({ name: "tiesuo" }, cards); - player.useCard(card, cards, targets); - } else { - player.loseToDiscardpile(cards); - player.draw(cards.length); - } - }, - subSkill: { - blocker: { charlotte: true }, - use: { - audio: "sblianhuan", - trigger: { player: "useCard" }, - filter: function (event, player) { - return event.card.name == "tiesuo" && !player.storage.sblianhuan; - }, - check: function (event, player) { - var eff = 0, - targets = event.targets.filter((i) => !i.isLinked()); - for (var target of targets) { - eff += get.attitude(player, target); - } - return eff < -1; - }, - prompt2: - "失去1点体力,然后当此牌指定第一个目标后,你随机弃置所有不处于连环状态的目标角色各一张手牌", - content: function () { - "step 0"; - player.loseHp(); - "step 1"; - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.sblianhuan = true; - trigger._sblianhuan = true; - player.addTempSkill("sblianhuan_discard", "phaseUseAfter"); - }, - }, - discard: { - trigger: { global: "useCardToPlayered" }, - forced: true, - locked: false, - popup: false, - charlotte: true, - filter: function (event, player) { - return event.isFirstTarget && event.card.storage && event.card.storage.sblianhuan; - }, - content: function () { - "step 0"; - event.targets = trigger.targets.filter((i) => !i.isLinked()); - if (!event.targets.length) event.finish(); - else player.logSkill("sblianhuan_discard", event.targets); - "step 1"; - var target = targets.shift(); - var cards = target.getCards("h", (card) => { - return lib.filter.cardDiscardable(card, player, "sblianhuan"); - }); - if (cards.length > 0) { - player.line(target); - target.discard(cards.randomGet()); - } - if (targets.length) event.redo(); - }, - }, - add: { - trigger: { player: "useCard2" }, - filter: function (event, player) { - return ( - event.card.name == "tiesuo" && - player.storage.sblianhuan && - game.hasPlayer((current) => { - return ( - !event.targets.includes(current) && player.canUse(event.card, current) - ); - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("sblianhuan_add"), - "为" + get.translation(trigger.card) + "额外指定任意个目标", - [1, Infinity], - function (card, player, target) { - return ( - !_status.event.sourcex.includes(target) && - player.canUse(_status.event.card, target) - ); - } - ) - .set("sourcex", trigger.targets) - .set("ai", function (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("sblianhuan_add", event.targets); - trigger.targets.addArray(event.targets); - }, - }, - discard2: { - trigger: { player: "useCardToPlayered" }, - forced: true, - locked: false, - popup: false, - filter: function (event, player) { - return ( - event.isFirstTarget && - event.card.name == "tiesuo" && - player.storage.sblianhuan && - !event.getParent()._sblianhuan - ); - }, - content: function () { - "step 0"; - event.targets = trigger.targets.filter((i) => !i.isLinked()); - if (!event.targets.length) event.finish(); - else player.logSkill("sblianhuan_discard2", event.targets); - "step 1"; - var target = targets.shift(); - var cards = target.getCards("h", (card) => { - return lib.filter.cardDiscardable(card, player, "sblianhuan"); - }); - if (cards.length > 0) { - player.line(target); - target.discard(cards.randomGet()); - } - if (targets.length) event.redo(); - }, - }, - }, - }, - sbniepan: { - audio: 2, - enable: "chooseToUse", - mark: true, - skillAnimation: true, - limited: true, - animationColor: "orange", - filter: function (event, player) { - return event.type == "dying" && player == event.dying; - }, - content: function () { - "step 0"; - player.awakenSkill("sbniepan"); - player.discard(player.getCards("hej")); - "step 1"; - player.draw(2); - "step 2"; - if (player.hp < 2) player.recover(2 - player.hp); - "step 3"; - player.turnOver(false); - "step 4"; - player.link(false); - "step 5"; - player.storage.sblianhuan = true; - game.log(player, "修改了", "#g【连环】"); - }, - ai: { - order: 1, - skillTagFilter: function (player, arg, target) { - if (player != target || player.storage.sbniepan) return false; - }, - save: true, - result: { - player: function (player) { - if (player.hp <= 0) return 10; - return 0; - }, - }, - threaten: function (player, target) { - if (!target.storage.sbniepan) return 0.6; - }, - }, - }, - //法正 - sbxuanhuo: { - audio: 2, - enable: "phaseUse", - usable: 1, - group: "sbxuanhuo_rob", - filterTarget: function (card, player, target) { - return !target.hasMark("sbxuanhuo_mark") && player != target; - }, - filterCard: true, - position: "he", - discard: false, - lose: false, - delay: false, - onremove: function (player) { - delete player.storage.sbxuanhuo; - player.unmarkSkill("sbxuanhuo"); - }, - check: function (card) { - return 6.5 - get.value(card); - }, - content: function () { - "step 0"; - player.give(cards, target); - if (player.storage.sbxuanhuo && player.storage.sbxuanhuo[target.playerid]) - delete player.storage.sbxuanhuo[target.playerid]; - "step 1"; - target.addMark("sbxuanhuo_mark"); - var history = target.getAllHistory("lose"); - if (history.length) { - history[history.length - 1].sbxuanhuo_mark = true; - } - }, - getNum: function (current, skill) { - var num = 0; - var history = current.getAllHistory("lose"); - if (history.length) { - for (var i = history.length - 1; i >= 0; i--) { - var evt = history[i]; - if (evt.sbxuanhuo_mark) break; - if (typeof skill == "string") { - if (evt.getParent(2).name == skill) num += evt.cards2.length; - } else { - var evtx = evt.getParent(), - player = skill; - if (evtx.name == "gain") { - var cards = evtx.cards; - if (evtx.player == player && cards.length > 0) num += cards.length; - } else if (evtx.name == "loseAsync") { - if (evtx.type != "gain" || evtx.giver) return false; - var cards = evtx.getl(current).cards2; - var cardsx = evtx.getg(player); - if (cardsx.length > 0) num += cardsx.length; - } - } - } - } - return num; - }, - ai: { - order: 9, - result: { - target: function (player, target) { - return -Math.sqrt(Math.max(target.hp, 1)); - }, - }, - }, - marktext: "惑", - intro: { - content: function (storage, player) { - if (!storage || get.is.empty(storage)) return "未得到过牌"; - var map = _status.connectMode ? lib.playerOL : game.playerMap; - var str = "已得到"; - for (var i in storage) { - str += get.translation(map[i]) + "的" + get.cnNumber(storage[i]) + "张牌、"; - } - return str.slice(0, -1); - }, - }, - subSkill: { - mark: { - marktext: "眩", - intro: { - name: "眩惑", - name2: "眩", - markcount: () => 0, - content: "已获得“眩”标记", - }, - }, - rob: { - audio: "sbxuanhuo", - trigger: { - global: ["gainAfter", "loseAsyncAfter"], - }, - forced: true, - locked: false, - direct: true, - filter: function (event, player) { - var evt = event.getParent("phaseDraw"); - if (evt && evt.name == "phaseDraw") return false; - return game.hasPlayer((current) => { - if (!event.getg(current).length || !current.hasMark("sbxuanhuo_mark")) - return false; - if (evt && evt.player == current) return false; - if (lib.skill.sbxuanhuo.getNum(current, "sbxuanhuo_rob") >= 5) return false; - return current.hasCard( - (card) => lib.filter.canBeGained(card, current, player), - "he" - ); - }); - }, - content: function () { - "step 0"; - var evt = trigger.getParent("phaseDraw"); - var targets = game.filterPlayer((current) => { - if (!trigger.getg(current).length || !current.hasMark("sbxuanhuo_mark")) - return false; - if (evt && evt.player == current) return false; - if (lib.skill.sbxuanhuo.getNum(current, "sbxuanhuo_rob") >= 5) return false; - return current.hasCard( - (card) => lib.filter.canBeGained(card, current, player), - "he" - ); - }); - event.targets = targets; - "step 1"; - var target = targets.shift(); - player.logSkill("sbxuanhuo", target); - var hs = target.getCards("h", (card) => - lib.filter.canBeGained(card, target, player) - ); - if (hs.length) { - player.gain(hs.randomGet(), target, "giveAuto"); - if (!player.storage.sbxuanhuo) player.storage.sbxuanhuo = {}; - player.storage.sbxuanhuo[target.playerid] = - lib.skill.sbxuanhuo.getNum(target, "sbxuanhuo_rob") + 1; - player.markSkill("sbxuanhuo"); - } - if (targets.length > 0) event.redo(); - }, - }, - }, - }, - sbenyuan: { - audio: 2, - forced: true, - direct: true, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return game.hasPlayer((current) => current.hasMark("sbxuanhuo_mark")); - }, - content: function () { - "step 0"; - var targets = game.filterPlayer((current) => current.hasMark("sbxuanhuo_mark")); - event.targets = targets; - "step 1"; - var target = targets.shift(); - event.target = target; - player.logSkill("sbenyuan", target); - target.removeMark("sbxuanhuo_mark", target.countMark("sbxuanhuo_mark")); - game.players.forEach((current) => { - var storage = current.storage.sbxuanhuo; - if (storage && storage[target.playerid]) delete storage[target.playerid]; - if (storage && get.is.empty(storage)) { - delete current.storage.sbxuanhuo; - current.unmarkSkill("sbxuanhuo"); - } - }); - var num = lib.skill.sbxuanhuo.getNum(target, player); - if (num >= 3) { - var cards = player.getCards("he"); - if (!cards.length) event._result = { bool: false }; - else if (cards.length <= 3) event._result = { bool: true, cards: cards }; - else - player.chooseCard( - "恩怨:交给" + get.translation(target) + "三张牌", - true, - 3, - "he" - ); - } else { - target.loseHp(); - player.recover(); - event.goto(3); - } - "step 2"; - if (result.bool) player.give(result.cards, target); - "step 3"; - if (targets.length) event.goto(1); - }, - ai: { - combo: "sbxuanhuo", - }, - }, - //姜维 - sbtiaoxin: { - audio: 2, - enable: "phaseUse", - usable: 1, - chargeSkill: true, - filter: function (event, player) { - return player.hasMark("charge"); - }, - filterTarget: lib.filter.notMe, - selectTarget: function () { - return [1, _status.event.player.countMark("charge")]; - }, - multiline: true, - group: "sbtiaoxin_backflow", - content: function () { - "step 0"; - 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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", player); - "step 1"; - if (!result.bool && target.countCards("he") > 0) { - target.chooseCard("he", "交给" + get.translation(player) + "一张牌", true); - } else event.finish(); - "step 2"; - if (result.bool) { - target.give(result.cards, player); - } - }, - contentAfter: function () { - player.removeMark("charge", targets.length); - }, - ai: { - threaten: 1.2, - order: 4, - expose: 0.2, - result: { - target: function (player, target) { - if (target.countGainableCards(player, "he") == 0) return 0; - return -1; - }, - player: function (player, target) { - if (!target.canUse("sha", player)) return 0; - if (target.countCards("h") == 0) return 0; - if (target.countCards("h") == 1) return -0.1; - if (player.hp <= 2) return -2; - if (player.countCards("h", "shan") == 0) return -1; - return -0.5; - }, - }, - }, - subSkill: { - backflow: { - audio: "sbtiaoxin", - trigger: { - player: ["loseAfter", "enterGame"], - global: ["loseAsyncAfter", "phaseBefore"], - }, - forced: true, - filter: function (event, player) { - if (player.countMark("charge") >= 4) return false; - if (event.name.indexOf("lose") == 0) { - if (event.type != "discard") return false; - var evt = event.getParent("phaseDiscard"); - return evt && evt.player == player && event.getl(player).cards2.length > 0; - } else { - return event.name != "phase" || game.phaseNumber == 0; - } - }, - content: function () { - var num = Math.min( - 4 - player.countMark("charge"), - trigger.name.indexOf("lose") == 0 ? trigger.getl(player).cards2.length : 4 - ); - if (num > 0) player.addMark("charge", num); - }, - }, - }, - }, - sbzhiji: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - juexingji: true, - forced: true, - skillAnimation: true, - animationColor: "fire", - filter: function (event, player) { - var len = 0; - player.getAllHistory("useSkill", (evt) => { - if (evt.skill != "sbtiaoxin") return false; - len += evt.targets.length; - }); - return len >= 4; - }, - content: function () { - "step 0"; - player.awakenSkill("sbzhiji"); - player.loseMaxHp(); - "step 1"; - player - .chooseTarget("志继:令至少一名角色获得“北伐”标记", true, [1, Infinity]) - .set("ai", (target) => -get.attitude(player, target)); - "step 2"; - if (result.bool) { - player.line(result.targets, "fire"); - result.targets.forEach((target) => { - target.addAdditionalSkill("sbzhiji_" + player.playerid, "sbzhiji_beifa"); - target.markAuto("sbzhiji_beifa", [player]); - }); - player.addTempSkill("sbzhiji_clear", { player: "phaseBegin" }); - if (!event.isMine() && !event.isOnline()) game.delayx(); - } - }, - subSkill: { - beifa: { - charlotte: true, - mark: true, - marktext: "伐", - intro: { - name: "北伐", - name2: "北伐", - content: "使用牌只能指定$和自己为目标", - }, - mod: { - playerEnabled: function (card, player, target) { - if (player != target && !player.getStorage("sbzhiji_beifa").includes(target)) - return false; - }, - }, - }, - clear: { - charlotte: true, - onremove: function (player) { - game.countPlayer(function (current) { - current.removeAdditionalSkill("sbzhiji_" + player.playerid); - }); - }, - }, - }, - ai: { - combo: "sbtiaoxin" - }, - }, - //刘备 - sbrende: { - audio: 3, - enable: ["chooseToUse", "chooseToRespond"], - maxNum: 8, - filter: function (event, player) { - if (event.type == "wuxie" || player.hasSkill("sbrende_used")) return false; - if (player.countMark("sbrende") < 2) return false; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - var card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(card, player, event)) return true; - } - } - } - return false; - }, - group: ["sbrende_give", "sbrende_gain"], - chooseButton: { - dialog: function (event, player) { - var dialog = ui.create.dialog("仁德"); - if (event.type == "phase") { - dialog._chosenOpt = []; - var table = document.createElement("div"); - table.classList.add("add-setting"); - table.style.margin = "0"; - table.style.width = "100%"; - table.style.position = "relative"; - var list = ["视为使用基本牌", "交给其他角色牌"]; - for (var i of list) { - var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); - td.innerHTML = "" + i + ""; - td.link = i; - if (i == list[0]) { - td.classList.add("bluebg"); - dialog._chosenOpt.add(td); - } - td.addEventListener( - lib.config.touchscreen ? "touchend" : "click", - function () { - if (_status.dragged) return; - if (_status.clicked) return; - if (_status.justdragged) return; - _status.tempNoButton = true; - _status.clicked = true; - setTimeout(function () { - _status.tempNoButton = false; - }, 500); - var link = this.link; - if (link == "交给其他角色牌") game.uncheck(); - var current = this.parentNode.querySelector(".bluebg"); - if (current) { - current.classList.remove("bluebg"); - dialog._chosenOpt.remove(current); - } - dialog._chosenOpt.add(this); - this.classList.add("bluebg"); - game.check(); - } - ); - table.appendChild(td); - dialog.buttons.add(td); - } - dialog.content.appendChild(table); - } - var cards = []; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - var card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) cards.push(["基本", "", name]); - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(card, player, event)) - cards.push(["基本", "", name, nature]); - } - } - } - dialog.add([cards, "vcard"]); - return dialog; - }, - check: function (button, player) { - if (typeof button.link == "string") return -1; - if (_status.event.getParent().type != "phase") return 1; - return _status.event.player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }, - select: function () { - var opts = _status.event.dialog._chosenOpt; - return opts && opts.length && opts[0].link == "交给其他角色牌" ? 0 : 1; - }, - backup: function (links, player) { - var isUse = links.length == 1; - var backup = get.copy(lib.skill["sbrende_" + (isUse ? "use" : "give")]); - if (isUse) backup.viewAs = { name: links[0][2], nature: links[0][3], isCard: true }; - return backup; - }, - prompt: function (links, player) { - var isUse = links.length == 1; - return isUse - ? "移去2枚“仁望”,视为使用或打出" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) - : "###仁德###出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为" + - lib.skill.sbrende.maxNum + - ")"; - }, - }, - hiddenCard: function (player, name) { - return ( - get.type(name) == "basic" && - player.countMark("sbrende") > 1 && - player.hasSkill("sbrende_used") - ); - }, - marktext: "仁", - intro: { - name: "仁望", - name2: "仁望", - content: "mark", - }, - ai: { - respondSha: true, - respondShan: true, - save: true, - skillTagFilter: function (player) { - return player.countMark("sbrende") > 1 && !player.hasSkill("sbrende_used"); - }, - order: function (item, player) { - if (_status.event.type == "phase" && lib.skill.sbzhangwu.ai.result.player(player) > 0) - return 9.1; - return 0.5; - }, - result: { - player: function (player) { - if (_status.event.dying) { - return get.attitude(player, _status.event.dying); - } - return _status.event.type == "phase" && player.countMark("sbrende") <= 2 ? 0 : 1; - }, - }, - }, - subSkill: { - backup: {}, - used: { charlotte: true }, - given: { onremove: true }, - use: { - audio: "sbrende", - filterCard: () => false, - selectCard: -1, - popname: true, - precontent: function () { - player.logSkill("sbrende_use"); - delete event.result.skill; - player.removeMark("sbrende", 2); - player.addTempSkill("sbrende_used"); - }, - }, - give: { - audio: "sbrende", - enable: "phaseUse", - filterCard: true, - selectCard: [1, Infinity], - position: "he", - discard: false, - lose: false, - delay: false, - filter: function (event, player) { - if (player.countMark("sbrende") < 2 || player.hasSkill("sbrende_used")) - return true; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - var card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) return false; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(card, player, event)) return false; - } - } - } - return true; - }, - filterTarget: function (card, player, target) { - if (player.getStorage("sbrende_given").includes(target)) return false; - return player != target; - }, - prompt: function (event) { - return ( - "出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为" + - lib.skill.sbrende.maxNum + - ")" - ); - }, - check: function (card) { - var player = get.owner(card); - if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; - if ( - ui.selected.cards.length + player.countMark("sbrende") > - lib.skill.sbrende.maxNum - ) - return 0; - if (!ui.selected.cards.length && card.name == "du") return 20; - if (ui.selected.cards.length >= Math.max(2, player.countCards("he") - player.hp)) - return 0; - if (player.countCards("he") <= 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("he") > player.hp) return 10 - get.value(card); - if (player.countCards("he") > 2) return 6 - get.value(card); - return -1; - } - return ( - 18 - - (ui.selected.cards.length + player.countMark("sbrende")) - - get.value(card) - ); - }, - content: function () { - player.addTempSkill("sbrende_given", "phaseUseAfter"); - player.markAuto("sbrende_given", [target]); - player.markAuto("sbrende_givenx", [target]); - player.give(cards, target); - var num = Math.min( - lib.skill.sbrende.maxNum - player.countMark("sbrende"), - cards.length - ); - if (num > 0) player.addMark("sbrende", num); - }, - ai: { - order: function (skill, player) { - return player.countMark("sbrende") < 2 ? 6.8 : 5.8; - }, - result: { - target: function (player, target) { - if ( - !player.hasFriend() && - player.hasSkill("sbzhangwu") && - ui.selected.cards.length && - get.value(ui.selected.cards[0]) > - (lib.skill.sbzhangwu.filterTarget(null, player, target) ? 3 : 5) - ) - return -0.1; - 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"); - return Math.max(1, 5 - nh); - }, - }, - threaten: 1.1, - }, - }, - gain: { - audio: "sbrende", - trigger: { player: "phaseUseBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - return player.countMark("sbrende") < lib.skill.sbrende.maxNum; - }, - content: function () { - var num = Math.min(lib.skill.sbrende.maxNum - player.countMark("sbrende"), 2); - if (num > 0) player.addMark("sbrende", num); - }, - }, - }, - }, - sbzhangwu: { - audio: 2, - enable: "phaseUse", - skillAnimation: "epic", - animationColor: "orange", - limited: true, - filter: function (event, player) { - if (game.roundNumber <= 1) return false; - if (!game.hasPlayer((current) => lib.skill.sbzhangwu.filterTarget(null, player, current))) - return false; - return true; - }, - filterTarget: function (card, player, target) { - if (target == player) return false; - return player.getStorage("sbrende_givenx").includes(target); - }, - selectTarget: [-1, -2], - multiline: true, - content: function () { - "step 0"; - player.awakenSkill("sbzhangwu"); - var num = Math.min(game.roundNumber - 1, 3); - var cards = target.getCards("he"), - count = cards.length; - if (count == 0) event.finish(); - else if (count <= num) event._result = { bool: true, cards: cards }; - else - target.chooseCard( - "章武:交给" + get.translation(player) + get.cnNumber(num) + "张牌", - true, - "he", - num - ); - "step 1"; - if (result.bool) { - target.give(result.cards, player); - } - }, - contentAfter: function () { - "step 0"; - player.recover(3); - "step 1"; - player.removeSkills("sbrende"); - game.delayx(); - }, - ai: { - order: 9, - combo: "sbrende", - result: { - player: function (player, target) { - var targets = game.filterPlayer((current) => - lib.skill.sbzhangwu.filterTarget(null, player, current) - ); - if (!targets.length) return 0; - var eff = 0; - for (var target of targets) { - eff += get.effect(target, { name: "shunshou_copy2" }, player, player); - } - eff += 15 - 5 * Math.max(0, 3 - player.getDamagedHp()); - return eff > 15 ? 1 : 0; - }, - }, - }, - }, - sbjijiang: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - zhuSkill: true, - unique: true, - popup: false, - filter: function (event, player) { - if (!player.hasZhuSkill("sbjijiang")) return false; - return game.hasPlayer((current) => { - if (current.group != "shu" || player == current || current.hp < player.hp) - return false; - return game.hasPlayer((currentx) => current.inRange(currentx)); - }); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("sbjijiang"), 2) - .set("filterTarget", (card, player, target) => { - if (!ui.selected.targets.length) - return target.group == "shu" && target.hp >= player.hp && target != player; - var current = ui.selected.targets[0]; - return current.inRange(target); - }) - .set("targetprompt", ["进行选择", "出杀对象"]) - .set("multitarget", true) - .set("ai", (target) => { - var player = _status.event.player; - if (ui.selected.targets.length) { - var current = ui.selected.targets[0]; - return get.effect( - target, - new lib.element.VCard({ name: "sha" }), - current, - player - ); - } - let curs = game.filterPlayer((current) => { - return ( - target !== current && - target.inRange(current) && - target.canUse({ name: "sha", isCard: true }, current, false) - ); - }); - if (!curs.length) { - let att = get.attitude(player, target); - if (att >= 0) return 0; - return -att * get.threaten(target, player); - } - return curs.reduce( - (max, i) => - Math.max( - max, - get.effect(i, new lib.element.VCard({ name: "sha" }), target, player) - ), - -1 - ); - }) - .forResult(); - }, - async content(event, trigger, player) { - let targets = event.targets; - player.logSkill("sbjijiang", targets, false); - player.line2(targets); - var choiceList = [ - "视为对" + get.translation(targets[1]) + "使用一张【杀】", - "你的下一个出牌阶段开始前,跳过此阶段", - ], - result; - if (!targets[0].canUse({ name: "sha", isCard: true }, targets[1], false)) - result = { index: 1 }; - else - result = await targets[0] - .chooseControl() - .set("choiceList", choiceList) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - get.effect(targets[1], { name: "sha" }, targets[0], targets[0]) > - get.effect(targets[0], { name: "lebu" }, targets[0], targets[0]) - ? 0 - : 1 - ) - .forResult(); - if (result.index == 0) { - targets[0].useCard({ name: "sha", isCard: true }, targets[1], false); - } else { - targets[0].addSkill("sbjijiang_skip"); - } - }, - subSkill: { - skip: { - trigger: { player: "phaseUseBefore" }, - charlotte: true, - forced: true, - content: function () { - trigger.cancel(); - player.removeSkill("sbjijiang_skip"); - }, - }, - }, - }, - //赵云 - sblongdan: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - chargeSkill: true, - filter: function (event, player) { - if (event.type == "wuxie" || !player.hasMark("charge")) return false; - var marked = player.hasSkill("sblongdan_mark", null, null, false); - for (var name of lib.inpile) { - if (!marked && name != "sha" && name != "shan") continue; - if (get.type(name) != "basic") continue; - if (player.hasCard(lib.skill.sblongdan.getFilter(name, player), "hs")) { - if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) - return true; - if (marked && name == "sha") { - for (var nature of lib.inpile_nature) { - if ( - event.filterCard( - get.autoViewAs({ name, nature }, "unsure"), - player, - event - ) - ) - return true; - } - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - var marked = player.hasSkill("sblongdan_mark", null, null, false); - for (var name of lib.inpile) { - if (!marked && name != "sha" && name != "shan") continue; - if (get.type(name) != "basic") continue; - if (player.hasCard(lib.skill.sblongdan.getFilter(name, player), "hs")) { - if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) - list.push(["基本", "", name]); - if (marked && name == "sha") { - for (var nature of lib.inpile_nature) { - if ( - event.filterCard( - get.autoViewAs({ name, nature }, "unsure"), - player, - event - ) - ) - list.push(["基本", "", name, nature]); - } - } - } - } - return ui.create.dialog("龙胆", [list, "vcard"], "hidden"); - }, - check: function (button) { - if (_status.event.getParent().type != "phase") return 1; - var player = _status.event.player, - card = { name: button.link[2], nature: button.link[3] }; - if ( - card.name == "jiu" && - Math.min(player.countMark("charge"), player.countCards("h", { type: "basic" })) < - 2 - ) - return 0; - return player.getUseValue(card, null, true); - }, - backup: function (links, player) { - return { - viewAs: { - name: links[0][2], - nature: links[0][3], - }, - filterCard: lib.skill.sblongdan.getFilter(links[0][2], player), - position: "he", - popname: true, - check: function (card) { - return 6 / Math.max(1, get.value(card)); - }, - precontent: function () { - player.removeMark("charge", 1); - player.addTempSkill("sblongdan_draw"); - }, - }; - }, - prompt: function (links, player) { - var marked = player.hasSkill("sblongdan_mark", null, null, false); - var card = { - name: links[0][2], - nature: links[0][3], - isCard: true, - }; - if (marked) return "将一张基本牌当做" + get.translation(card) + "使用"; - return ( - "将一张" + - (card.name == "sha" ? "闪" : "杀") + - "当做" + - get.translation(card) + - "使用" - ); - }, - }, - hiddenCard: function (player, name) { - if (get.type(name) != "basic" || !player.hasMark("charge")) return false; - var marked = player.hasSkill("sblongdan_mark", null, null, false); - if (!marked && name != "sha" && name != "shan") return false; - return player.hasCard(lib.skill.sblongdan.getFilter(name, player), "hs"); - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag) { - return lib.skill.sblongdan.hiddenCard(player, tag == "respondSha" ? "sha" : "shan"); - }, - order: 9, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - getFilter: function (name, player) { - if (!player.hasSkill("sblongdan_mark", null, null, false)) { - if (name == "sha") return { name: "shan" }; - if (name == "shan") return { name: "sha" }; - return () => false; - } - return { type: "basic" }; - }, - group: "sblongdan_charge", - onremove: function (player) { - player.removeSkill("sblongdan_mark"); - }, - subSkill: { - backup: { audio: "sblongdan" }, - mark: { charlotte: true }, - draw: { - charlotte: true, - trigger: { player: ["useCardAfter"] }, - forced: true, - popup: false, - filter: function (event, player) { - return event.skill == "sblongdan_backup"; - }, - content: function () { - player.draw(); - }, - }, - charge: { - audio: "sblongdan", - trigger: { - global: ["phaseBefore", "phaseEnd"], - player: "enterGame", - }, - forced: true, - filter: function (event, player, name) { - if (player.countMark("charge") > 2) return false; - return name != "phaseBefore" || game.phaseNumber == 0; - }, - content: function () { - player.addMark("charge", 1); - }, - }, - }, - }, - sbjizhu: { - audio: 3, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(lib.filter.notMe, get.prompt("sbjizhu"), "和一名其他角色进行“协力”") - .set("ai", function (target) { - return ( - get.threaten(target) * - Math.sqrt(1 + target.countCards("h")) * - (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbjizhu", target); - player.chooseCooperationFor(target, "sbjizhu").set("ai", function (button) { - var base = 0; - switch (button.link) { - case "cooperation_damage": - base = 0.1; - break; - case "cooperation_draw": - base = 0.6; - break; - case "cooperation_discard": - base = 0.1; - break; - case "cooperation_use": - base = 0.6; - break; - } - return base + Math.random(); - }); - player.addAdditionalSkill("cooperation", "sbjizhu_effect"); - } else event.finish(); - "step 2"; - game.delayx(); - }, - subSkill: { - effect: { - audio: "sbjizhu", - charlotte: true, - trigger: { global: "phaseJieshuBegin" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - return ( - player.checkCooperationStatus(event.player, "sbjizhu") && - player.hasSkill("sblongdan", null, null, false) - ); - }, - content: function () { - game.log(player, "和", trigger.player, "的协力成功"); - player.addTempSkill("sblongdan_mark", { player: "phaseJieshuBegin" }); - game.delayx(); - }, - }, - }, - derivation: "sblongdan_shabi", - ai: { - combo: "sblongdan", - }, - }, - //张飞 - sbpaoxiao: { - audio: 2, - mod: { - cardUsable: function (card) { - if (card.name == "sha") return Infinity; - }, - targetInRange: function (card, player, target) { - if (card.name == "sha" && player.getEquips(1).length > 0) return true; - }, - }, - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - if (event.card.name != "sha") return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - return player.hasHistory( - "useCard", - function (evtx) { - return ( - evtx != event && evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt - ); - }, - event - ); - }, - content: function () { - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.sbpaoxiao = true; - trigger.baseDamage++; - trigger.directHit.addArray(game.players); - player.addTempSkill("sbpaoxiao_effect", "phaseUseAfter"); - }, - subSkill: { - effect: { - charlotte: true, - trigger: { player: "useCardToPlayered" }, - forced: true, - popup: false, - filter: function (event, player) { - return event.card.storage && event.card.storage.sbpaoxiao && event.target.isIn(); - }, - content: function () { - trigger.target.addTempSkill("fengyin"); - }, - group: "sbpaoxiao_recoil", - }, - recoil: { - charlotte: true, - trigger: { source: "damageSource" }, - forced: true, - filter: function (event, player) { - return ( - event.card && - event.card.storage && - event.card.storage.sbpaoxiao && - event.player.isIn() - ); - }, - content: function () { - "step 0"; - player.loseHp(); - "step 1"; - var hs = player.getCards("h", function (card) { - return lib.filter.cardDiscardable(card, player, "sbpaoxiao_recoil"); - }); - if (hs.length > 0) player.discard(hs.randomGet()); - }, - }, - }, - }, - sbxieji: { - audio: 3, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(lib.filter.notMe, get.prompt("sbxieji"), "和一名其他角色进行“协力”") - .set("ai", function (target) { - return ( - get.threaten(target) * - Math.sqrt(1 + target.countCards("h")) * - (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbxieji", target); - //选择对方的协击条件 - player.chooseCooperationFor(target, "sbxieji").set("ai", function (button) { - var base = 0; - switch (button.link) { - case "cooperation_damage": - base = 0.8; - break; - case "cooperation_draw": - base = 0.1; - break; - case "cooperation_discard": - base = 0.1; - break; - case "cooperation_use": - base = 0.1; - break; - } - return base + Math.random(); - }); - //保证技能cooperation被移除之后 失去该技能 - player.addAdditionalSkill("cooperation", "sbxieji_effect"); - } else event.finish(); - "step 2"; - game.delayx(); - }, - subSkill: { - effect: { - audio: "sbxieji", - charlotte: true, - trigger: { global: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - //判断自己是否有目标为该角色 且已经完成的协力记录 - return player.checkCooperationStatus(event.player, "sbxieji"); - }, - content: function () { - "step 0"; - game.log(player, "和", trigger.player, "的协力成功"); - player - .chooseTarget( - "协击:请选择【杀】的目标", - "你和" + - get.translation(trigger.player) + - "协力成功,可以视为对至多三名其他角色使用一张【杀】,且此【杀】造成伤害时,你摸等同于伤害值的牌", - [1, 3], - true, - function (card, player, target) { - return player.canUse("sha", target, false); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "sha" }, player, player); - }); - "step 1"; - if (result.bool) { - player.addTempSkill("sbxieji_reward", "sbxieji_effectAfter"); - player.useCard( - { - name: "sha", - isCard: true, - storage: { sbxieji: true }, - }, - "sbxieji_effect", - result.targets - ); - } - }, - }, - reward: { - charlotte: true, - trigger: { source: "damageSource" }, - forced: true, - popup: false, - filter: function (event, player) { - return ( - event.card && - event.card.storage && - event.card.storage.sbxieji && - event.getParent().type == "card" - ); - }, - content: function () { - player.draw(trigger.num); - }, - }, - }, - }, - //徐晃 - sbduanliang: { - audio: 1, - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - player - .chooseToDuiben(target) - .set("title", "谋弈") - .set("namelist", ["固守城池", "突出重围", "围城断粮", "擂鼓进军"]) - .set("translationList", [ - `以防止${get.translation(player)}通过此技能对你使用【决斗】`, - `以防止${get.translation(player)}通过此技能对你使用【兵粮寸断】`, - `若成功,将牌堆顶的牌当做【兵粮寸断】对${get.translation(target)}使用`, - `若成功,视为对${get.translation(target)}使用【决斗】`, - ]) - .set("ai", (button) => { - var source = _status.event.getParent().player, - target = _status.event.getParent().target; - if ( - get.effect(target, { name: "juedou" }, source, source) >= 10 && - button.link[2] == "db_def2" && - Math.random() < 0.5 - ) - return 10; - return 1 + Math.random(); - }); - "step 1"; - if (result.bool) { - if (result.player == "db_def1") { - if (target.hasJudge("bingliang")) player.gainPlayerCard(target, "he", true); - else { - if (ui.cardPile.childNodes.length > 0) { - if ( - player.canUse( - get.autoViewAs({ name: "bingliang" }, [ui.cardPile.firstChild]), - target, - false - ) - ) { - player.useCard({ name: "bingliang" }, target, get.cards()); - } - } - } - } else { - var card = { name: "juedou", isCard: true }; - if (player.canUse(card, target)) player.useCard(card, target); - } - } - }, - ai: { - threaten: 1.2, - order: 5.5, - result: { - player: 1, - target: -1, - }, - }, - subSkill: { - true1: { audio: true }, - true2: { audio: true }, - false: { audio: true }, - }, - }, - sbshipo: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer((current) => { - return current.hp < player.hp || current.hasJudge("bingliang"); - }); - }, - content: function () { - "step 0"; - var list = []; - var choiceList = ["选择一名体力少于你的角色", "选择所有判定区有兵粮寸断的其他角色"]; - var bool = false, - bool2 = false; - game.filterPlayer((current) => { - if (current.hp < player.hp) bool = true; - if (current.hasJudge("bingliang")) bool2 = true; - }); - if (bool) list.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if (bool2) list.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - player - .chooseControl(list, "cancel2") - .set("prompt", get.prompt2("sbshipo")) - .set("choiceList", choiceList) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var eff = 0, - eff2 = 0; - if (!list.includes("选项一")) eff = Infinity; - if (!list.includes("选项二")) eff2 = Infinity; - game.countPlayer((current) => { - if (current.hp < player.hp) { - var effx = - get.attitude(player, current) / - Math.sqrt( - Math.max(0.1, 2 * current.hp + current.countCards("h")) - ); - if (effx < eff) eff = effx; - } - if (current.hasJudge("bingliang")) - eff2 += - get.attitude(player, current) / - Math.sqrt( - Math.max(0.1, 2 * current.hp + current.countCards("h")) - ); - }); - if (eff > 0 && eff2 > 0) return "cancel2"; - return eff < eff2 ? "选项一" : "选项二"; - })() - ); - "step 1"; - if (result.control == "cancel2") { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - event.finish(); - return; - } - if (result.control == "选项一") { - player - .chooseTarget( - "选择一名体力少于你的角色", - (card, player, target) => target.hp < player.hp, - true - ) - .set( - "ai", - (target) => - -get.attitude(player, target) / - Math.sqrt(Math.max(0.1, 2 * target.hp + target.countCards("h"))) - ); - } else { - event._result = { - bool: true, - targets: game.filterPlayer((current) => current.hasJudge("bingliang")), - }; - } - "step 2"; - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - if (result.bool) { - var targets = result.targets; - player.logSkill("sbshipo", targets); - event.targets = targets.sortBySeat(); - event.cards = []; - } else event.finish(); - "step 3"; - var target = event.targets.shift(); - event.target = target; - target - .chooseCard("交给" + get.translation(player) + "一张手牌,或受到1点伤害") - .set("ai", (card) => { - var player = _status.event.player, - source = _status.event.getParent().player; - if (get.damageEffect(player, source, player) > 0) return 0; - if (get.attitude(player, source) > 0) return 1; - if (get.tag(card, "recover") > 0) return 0; - return (player.hp < 2 ? 7 : 5.5) - get.value(card); - }); - "step 4"; - if (result.bool) { - event.cards.addArray(result.cards); - target.give(result.cards, player); - } else { - target.damage(); - } - "step 5"; - if (event.targets.length) event.goto(3); - else { - var cards = event.cards.filter( - (card) => get.owner(card) == player && get.position(card) == "h" - ); - if (!cards.length) event.finish(); - else event.cards = cards; - } - "step 6"; - player.chooseCardTarget({ - filterCard: function (card, player, target) { - return _status.event.getParent().cards.includes(card); - }, - filterTarget: lib.filter.notMe, - selectCard: [1, event.cards.length], - prompt: "是否将任意张得到的牌交给一名其他角色?", - ai1: function (card) { - var player = _status.event.player; - var val = player.getUseValue(card); - if (val > 0) return 2; - if (player.hp <= 2 && val == 0 && get.value(card) > 5) return 0; - return Math.random() > 0.5 ? 1 : 0; - }, - ai2: function (target) { - var player = _status.event.player, - cards = ui.selected.cards; - var val = 0; - for (var card of cards) { - val += target.getUseValue(card); - } - if (val > 0) return val * get.attitude(player, target) * 2; - return get.value(card, target) * get.attitude(player, target); - }, - }); - "step 7"; - if (result.bool) { - var cards = result.cards, - target = result.targets[0]; - player.give(cards, target); - } - }, - }, - //马超 - sbtieji: { - audio: 1, - trigger: { player: "useCardToPlayered" }, - logTarget: "target", - filter: function (event, player) { - return player != event.target && event.card.name == "sha" && event.target.isIn(); - }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - content: function () { - "step 0"; - var target = trigger.target; - event.target = target; - target.addTempSkill("fengyin"); - trigger.directHit.add(target); - player - .chooseToDuiben(target) - .set("title", "谋弈") - .set("namelist", ["出阵迎战", "拱卫中军", "直取敌营", "扰阵疲敌"]) - .set("translationList", [ - `以防止${get.translation(player)}摸2张牌`, - `以防止${get.translation(player)}获得你1张牌`, - `若成功,你获得${get.translation(target)}1张牌`, - `若成功,你摸2张牌`, - ]) - .set("ai", (button) => { - var source = get.event().getParent().player, - target = get.event().getParent().target; - if (!target.countCards("he") && button.link[2] == "db_def2") return 10; - if ( - !target.countCards("he") && - get.attitude(target, source) <= 0 && - button.link[2] == "db_atk1" - ) - return 10; - return 1 + Math.random(); - }); - "step 1"; - if (result.bool) { - if (result.player == "db_def1") player.gainPlayerCard(target, "he", true); - else player.draw(2); - } - }, - shaRelated: true, - ai: { - ignoreSkill: true, - skillTagFilter: function (player, tag, arg) { - if (tag == "directHit_ai") { - return get.attitude(player, arg.target) <= 0; - } - if (!arg || arg.isLink || !arg.card || arg.card.name != "sha") return false; - if (!arg.target || get.attitude(player, arg.target) >= 0) return false; - if ( - !arg.skill || - !lib.skill[arg.skill] || - lib.skill[arg.skill].charlotte || - get.is.locked(arg.skill) || - !arg.target.getSkills(true, false).includes(arg.skill) - ) - return false; - }, - directHit_ai: true, - }, - subSkill: { - true1: { audio: true }, - true2: { audio: true }, - false: { audio: true }, - }, - }, - //甘宁 - sbqixi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - event.list = lib.suit.slice(); - event.suits = []; - event.num = 0; - var cards = player.getCards("h"), - map = {}, - max = -Infinity; - for (var card of cards) { - var suit = get.suit(card, player); - if (!map[suit]) map[suit] = 0; - map[suit]++; - if (map[suit] > max) max = map[suit]; - } - for (var i in map) { - if (map[i] == max) event.suits.push(i); - } - "step 1"; - target - .chooseControl(event.list) - .set("prompt", "奇袭:猜测" + get.translation(player) + "手牌中最多的花色") - .set("ai", () => { - var player = _status.event.getParent().player, - controls = _status.event.controls; - if ( - player.countCards("h") <= 3 && - controls.includes("diamond") && - Math.random() < 0.3 - ) - return "diamond"; - return controls.randomGet(); - }); - "step 2"; - var control = result.control; - target.chat("我猜是" + get.translation(control) + "!"); - game.log(target, "猜测为", "#y" + control); - if (!event.isMine() && !event.isOnline()) game.delayx(); - "step 3"; - var control = result.control; - if (!event.suits.includes(control)) { - player.chat("猜错了!"); - game.log(target, "猜测", "#y错误"); - event.num++; - event.list.remove(control); - player.chooseBool("是否令其重新选择一个花色继续猜测?").set("ai", () => 1); - } else { - player.chat(event.num == 0 ? "这么准?" : "猜对了!"); - game.log(target, "猜测", "#g正确"); - player.showHandcards(); - event.goto(4); - } - "step 4"; - if (result.bool) { - event.goto(1); - } - "step 5"; - if (event.num > 0 && target.countDiscardableCards(player, "hej")) { - player.line(target); - player.discardPlayerCard(target, event.num, true, "hej"); - } - }, - ai: { - order: 10, - result: { - player: 1, - target: function (player, target) { - return ( - get.effect(target, { name: "guohe" }, player, target) * - (5 - get.attitude(player, target) / 2) - ); - }, - }, - }, - }, - sbfenwei: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("he") > 0; - }, - skillAnimation: true, - animationColor: "wood", - limited: true, - position: "he", - filterCard: true, - selectCard: [1, 3], - filterTarget: true, - selectTarget: function () { - return ui.selected.cards.length; - }, - delay: false, - discard: false, - lose: false, - complexSelect: true, - filterOk: function () { - return ui.selected.targets.length == ui.selected.cards.length; - }, - multitarget: true, - multiline: true, - check: function (card) { - return 7 - get.value(card); - }, - content: function () { - "step 0"; - player.awakenSkill("sbfenwei"); - for (var i = 0; i < cards.length; i++) { - targets[i].addToExpansion(cards[i], player, "give").gaintag.add("sbfenwei_effect"); - } - "step 1"; - player.addSkill("sbfenwei_effect"); - player.draw(cards.length); - }, - intro: { - content: "limited", - }, - ai: { - order: 6.9, - result: { - target: function (player, target) { - if ( - game.hasPlayer((current) => { - return ( - get.rawAttitude(player, current) > 0 && - current != player && - get.attitude(player, current) <= 0 - ); - }) && - game.countPlayer((current) => { - return get.attitude(player, current) > 0; - }) <= 2 - ) - return 0; - return 1; - }, - }, - }, - subSkill: { - effect: { - audio: "sbfenwei", - trigger: { - global: "useCardToTarget", - }, - charlotte: true, - forced: true, - filter: function (event, player) { - return ( - event.target.getExpansions("sbfenwei_effect").length > 0 && - get.type2(event.card) == "trick" - ); - }, - content: function () { - "step 0"; - var choiceList = [ - "令" + get.translation(trigger.target) + "获得其“威”", - "移去" + - get.translation(trigger.target) + - "的“威”,取消" + - get.translation(trigger.card) + - "对其的目标", - ]; - player - .chooseControl() - .set("choiceList", choiceList) - .set("prompt", "奋威:请选择一项") - .set("ai", () => { - var player = _status.event.player, - evt = _status.event.getTrigger(); - if (get.effect(evt.target, evt.card, evt.player, player) < -10) return 1; - return 0; - }); - "step 1"; - var cards = trigger.target.getExpansions("sbfenwei_effect"); - if (result.index == 0) { - trigger.target.gain(cards, "gain2", "fromStorage"); - } else { - trigger.target.loseToDiscardpile(cards); - trigger.targets.remove(trigger.target); - trigger.getParent().triggeredTargets2.remove(trigger.target); - trigger.untrigger(); - } - }, - marktext: "威", - intro: { - name: "威", - markcount: "expansion", - content: "expansion", - }, - }, - }, - }, - //甄宓 - sbluoshen: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("sbluoshen")).set("ai", (target) => { - var eff = 0; - var num = Math.ceil(game.countPlayer() / 2), - players = game - .filterPlayer((current) => current != player) - .sortBySeat(target) - .slice(0, num); - for (var targetx of players) { - eff += get.attitude(player, targetx) * Math.sqrt(targetx.countCards("h")); - } - return 1 - eff; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbluoshen", target); - player.addTempSkill("sbluoshen_add"); - event.targets = game - .filterPlayer((current) => current != player) - .sortBySeat(target) - .slice(0, Math.ceil(game.countPlayer() / 2)); - } else event.finish(); - "step 2"; - var target = event.targets.shift(); - event.target = target; - player.line(target); - if (!target.countCards("h")) event._result = { bool: false }; - else - target - .chooseCard("展示一张手牌", true) - .set("ai", (card) => { - var val = _status.event.goon ? 15 : 5; - if (get.color(card) == "black") return val - get.value(card); - return 7 - get.value(card); - }) - .set("goon", get.attitude(target, player) > 0); - "step 3"; - if (result.bool) { - var card = result.cards[0]; - target.showCards(card, get.translation(target) + "【洛神】展示"); - if (get.color(card) == "black") { - player.gain(card, target, "give", "bySelf").gaintag.add("sbluoshen"); - } else if (get.color(card) == "red") { - target.discard(card); - } - } - "step 4"; - if (targets.length) event.goto(2); - }, - subSkill: { - add: { - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("sbluoshen")) { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("sbluoshen")) { - return false; - } - }, - }, - onremove: function (player) { - player.removeGaintag("sbluoshen"); - }, - }, - }, - }, - //曹操 - sbjianxiong: { - audio: 2, - trigger: { player: "damageEnd" }, - group: "sbjianxiong_mark", - filter: function (event, player) { - return ( - (get.itemtype(event.cards) == "cards" && - event.cards.some((i) => get.position(i, true) == "o")) || - 1 - player.countMark("sbjianxiong") > 0 - ); - }, - prompt2: function (event, player) { - var gain = - get.itemtype(event.cards) == "cards" && - event.cards.some((i) => get.position(i, true) == "o"), - draw = 1 - player.countMark("sbjianxiong"); - var str = ""; - if (gain) str += "获得" + get.translation(event.cards); - if (gain && draw > 0) str += "并"; - if (draw > 0) str += "摸" + get.cnNumber(1 - player.countMark("sbjianxiong")) + "张牌"; - if (player.countMark("sbjianxiong")) str += ",然后可以弃1枚“治世”"; - return str; - }, - content: function () { - "step 0"; - if ( - get.itemtype(trigger.cards) == "cards" && - trigger.cards.some((i) => get.position(i, true) == "o") - ) { - player.gain(trigger.cards, "gain2"); - } - var num = player.countMark("sbjianxiong"); - if (1 - num > 0) { - player.draw(1 - num, "nodelay"); - } - if (!num) event.finish(); - "step 1"; - player.chooseBool("是否弃1枚“治世”?").set("ai", () => { - var player = _status.event.player, - current = _status.currentPhase; - if (get.distance(current, player, "absolute") > 3 && player.hp <= 2) return true; - return false; - }); - "step 2"; - if (result.bool) { - player.removeMark("sbjianxiong", 1); - } - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; - if (get.tag(card, "damage") && player != target) { - var cards = card.cards, - evt = _status.event; - if ( - evt.player == target && - card.name == "damage" && - evt.getParent().type == "card" - ) - cards = evt.getParent().cards.filterInD(); - if (target.hp <= 1) return; - if (get.itemtype(cards) != "cards") return; - for (var i of cards) { - if (get.name(i, target) == "tao") return [1, 5]; - } - if (get.value(cards, target) >= 7 + target.getDamagedHp()) return [1, 3]; - return [1, 0.55 + 0.05 * Math.max(0, 1 - target.countMark("sbjianxiong"))]; - } - }, - }, - }, - marktext: "治", - intro: { - name: "治世", - name2: "治世", - content: "mark", - }, - subSkill: { - mark: { - audio: "sbjianxiong", - trigger: { global: "phaseBefore", player: "enterGame" }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - var map = {}; - var list = []; - for (var i = 1; i <= 2; i++) { - var cn = get.cnNumber(i, true); - map[cn] = i; - list.push(cn); - } - event.map = map; - list.push("cancel2"); - player - .chooseControl(list, function () { - return get.cnNumber(2, true); - }) - .set("prompt", "奸雄:获得任意枚“治世”标记"); - "step 1"; - if (result.control != "cancel2") - player.addMark("sbjianxiong", event.map[result.control]); - }, - }, - }, - }, - sbqingzheng: { - audio: 2, - audioname: ["mb_caomao"], - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - direct: true, - content: function () { - "step 0"; - var num = 3 - player.countMark("sbjianxiong"); - var prompt = - "###" + get.prompt("sbqingzheng") + "###弃置" + get.cnNumber(num) + "种花色的所有牌"; - var next = player.chooseButton( - [prompt, [lib.suit.map((i) => ["", "", "lukai_" + i]), "vcard"]], - num - ); - next.set("filterButton", (button) => { - var player = _status.event.player; - var cards = player.getCards("h", { suit: button.link[2].slice(6) }); - return ( - cards.length > 0 && - cards.filter((card) => lib.filter.cardDiscardable(card, player, "sbqingzheng")) - .length == cards.length - ); - }); - next.set("ai", (button) => { - var player = _status.event.player; - return ( - player.countMark("sbjianxiong") * 15 - - player - .getCards("h", { suit: button.link[2].slice(6) }) - .map((i) => get.value(i)) - .reduce((p, c) => p + c, 0) - ); - }); - next.set("custom", { - replace: { - button: function (button) { - if (!_status.event.isMine()) return; - if (button.classList.contains("selectable") == false) return; - var cards = _status.event.player.getCards("h", { - suit: button.link[2].slice(6), - }); - if (cards.length) { - var chosen = - cards.filter((i) => ui.selected.cards.includes(i)).length == - cards.length; - if (chosen) { - ui.selected.cards.removeArray(cards); - cards.forEach((card) => { - card.classList.remove("selected"); - card.updateTransform(false); - }); - } else { - ui.selected.cards.addArray(cards); - cards.forEach((card) => { - card.classList.add("selected"); - card.updateTransform(true); - }); - } - } - if (button.classList.contains("selected")) { - ui.selected.buttons.remove(button); - button.classList.remove("selected"); - if (_status.multitarget || _status.event.complexSelect) { - game.uncheck(); - game.check(); - } - } else { - button.classList.add("selected"); - ui.selected.buttons.add(button); - } - var custom = _status.event.custom; - if (custom && custom.add && custom.add.button) { - custom.add.button(); - } - game.check(); - }, - }, - add: next.custom.add, - }); - "step 1"; - if (result.bool) { - var cards = result.cards; - if (!cards.length) { - var suits = result.links.map((i) => i[2].slice(6)); - cards = player.getCards("h", (card) => suits.includes(get.suit(card, player))); - } - event.cards = cards; - if (!cards.length) event.finish(); - else - player - .chooseTarget( - "清正:观看一名其他角色的手牌并弃置其中一种花色的所有牌", - (card, player, target) => { - return target != player && target.countCards("h"); - } - ) - .set("ai", (target) => { - var player = _status.event.player, - att = get.attitude(player, target); - if (att >= 0) return 0; - return 1 - att / 2 + Math.sqrt(target.countCards("h")); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("sbqingzheng", target); - player.discard(cards); - var list = []; - var dialog = ["清正:弃置" + get.translation(target) + "一种花色的所有牌"]; - for (var suit of lib.suit.concat("none")) { - if (target.countCards("h", { suit: suit })) { - dialog.push( - '
    ' + get.translation(suit + "2") + "牌
    " - ); - dialog.push(target.getCards("h", { suit: suit })); - list.push(suit); - } - } - if (list.length) { - player - .chooseControl(list) - .set("dialog", dialog) - .set("ai", () => { - return _status.event.control; - }) - .set( - "control", - (() => { - var getv = (cards) => - cards.map((i) => get.value(i)).reduce((p, c) => p + c, 0); - return list.sort((a, b) => { - return ( - getv(target.getCards("h", { suit: b })) - - getv(target.getCards("h", { suit: a })) - ); - })[0]; - })() - ); - } - } else event.finish(); - "step 3"; - var cards2 = target.getCards("h", { suit: result.control }); - event.cards2 = cards2; - target.discard(cards2, "notBySelf").set("discarder", player); - "step 4"; - if (event.cards2.length < cards.length) target.damage(); - "step 5"; - if (player.countMark("sbjianxiong") < 2 && player.hasSkill("sbjianxiong")) { - player - .chooseBool("是否获得1枚“治世”?") - .set("ai", () => (Math.random() < 0.5 ? 0 : 1)); - } else event.finish(); - "step 6"; - if (result.bool) { - player.addMark("sbjianxiong", 1); - } - }, - ai: { combo: "sbjianxiong" }, - }, - sbhujia: { - audio: 2, - trigger: { player: "damageBegin4" }, - zhuSkill: true, - direct: true, - filter: function (event, player) { - return ( - !player.hasSkill("sbhujia_used") && - game.hasPlayer((current) => { - return ( - current != player && - current.group == "wei" && - player.hasZhuSkill("sbhujia", current) - ); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("sbhujia"), - "将" + - get.translation(trigger.source) + - "即将对你造成的" + - trigger.num + - "点伤害转移给一名其他魏势力角色", - (card, player, target) => { - return ( - target != player && - target.group == "wei" && - player.hasZhuSkill("sbhujia", target) - ); - } - ) - .set("ai", (target) => { - var player = _status.event.player, - evt = _status.event.getTrigger(); - return ( - get.damageEffect(target, evt.source, player, evt.nature) - _status.event.eff - ); - }) - .set("eff", get.damageEffect(player, trigger.source, player, trigger.nature)); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbhujia", target); - player.addTempSkill("sbhujia_used", "roundStart"); - trigger.cancel(); - if (trigger.source) - target - .damage(trigger.source, trigger.nature, trigger.num) - .set("card", trigger.card) - .set("cards", trigger.cards); - else - target - .damage("nosource", trigger.nature, trigger.num) - .set("card", trigger.card) - .set("cards", trigger.cards); - } - }, - ai: { - maixie_defend: true, - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return; - if ( - get.tag(card, "damage") && - !target.hasSkill("sbhujia_used") && - game.hasPlayer((current) => { - return ( - current != target && - current.group == "wei" && - target.hasZhuSkill("sbhujia", current) - ); - }) - ) - return 0.8; - }, - }, - threaten: function (player, target) { - if (target.countCards("h") == 0) return 2; - }, - }, - subSkill: { - used: { charlotte: true }, - }, - }, - //张角 - sbleiji: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.countMark("sbguidao") >= 4; - }, - filterTarget: lib.filter.notMe, - content: function () { - player.removeMark("sbguidao", 4); - target.damage("thunder"); - }, - ai: { - combo: "sbguidao", - order: 9, - result: { - target: function (player, target) { - return get.damageEffect(target, player, target, "thunder"); - }, - }, - }, - }, - sbguidao: { - audio: 2, - trigger: { - global: ["phaseBefore", "damageEnd"], - player: "enterGame", - }, - forced: true, - locked: false, - group: "sbguidao_defend", - filter: function (event, player) { - if (player.countMark("sbguidao") >= 8) return false; - if (event.name == "damage") - return event.hasNature() && !player.hasSkill("sbguidao_forbid"); - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - var num = 2; - if (trigger.name != "damage") num += 2; - num = Math.min(8 - player.countMark("sbguidao"), num); - player.addMark("sbguidao", num); - }, - marktext: "兵", - intro: { - name: "道兵", - name2: "道兵", - content: "共有$枚“道兵”", - }, - subSkill: { - defend: { - audio: "sbguidao", - trigger: { player: "damageBegin4" }, - filter: function (event, player) { - return player.countMark("sbguidao") >= 2; - }, - prompt2: "弃2枚“道兵”,防止伤害", - check: function (event, player) { - return event.num >= 2 || player.hp <= event.num; - }, - content: function () { - trigger.cancel(); - player.removeMark("sbguidao", 2); - if (player != _status.currentPhase) { - player.addTempSkill("sbguidao_forbid", { player: "phaseBegin" }); - } - }, - }, - forbid: { charlotte: true }, - }, - }, - sbhuangtian: { - audio: 2, - trigger: { - player: "phaseBegin", - }, - forced: true, - zhuSkill: true, - group: "sbhuangtian_mark", - filter: function (event, player) { - if (player.phaseNumber > 1 || game.phaseNumber > 1) return false; - if (!player.hasZhuSkill("sbhuangtian")) return false; - return ( - !game.hasPlayer(function (current) { - return current.countCards("hej", "taipingyaoshu"); - }) && - !Array.from(ui.cardPile.childNodes) - .concat(Array.from(ui.discardPile.childNodes)) - .concat(Array.from(ui.ordering.childNodes)) - .map((i) => i.name) - .includes("taipingyaoshu") - ); - }, - content: function () { - "step 0"; - if (!lib.inpile.contains("taipingyaoshu")) { - lib.inpile.push("taipingyaoshu"); - } - event.card = game.createCard2("taipingyaoshu", "heart", 3); - "step 1"; - if (card) player.equip(card); - }, - subSkill: { - mark: { - audio: "sbhuangtiang", - trigger: { global: "damageSource" }, - forced: true, - zhuSkill: true, - filter: function (event, player) { - if ( - !player.hasZhuSkill("sbhuangtian") || - !player.hasSkill("sbguidao", null, false, false) - ) - return false; - if (!event.source || player == event.source || event.source.group != "qun") - return false; - if (player.hasSkill("sbguidao") && player.countMark("sbguidao") >= 8) - return false; - if (player.countMark("sbhuangtian_count") >= 4) return false; - return true; - }, - content: function () { - var num = Math.min(8 - player.countMark("sbhuangtian_count"), 2); - player.addMark("sbguidao", num); - player.addTempSkill("sbhuangtian_count", "roundStart"); - player.addMark("sbhuangtian_count", num, false); - }, - }, - count: { onremove: true }, - }, - }, - //夏侯氏 - sbqiaoshi: { - audio: 2, - trigger: { player: "damageEnd" }, - usable: 1, - direct: true, - filter: function (event, player) { - return event.source && event.source != player && event.source.isIn(); - }, - content: function () { - "step 0"; - trigger.source - .chooseBool( - "樵拾:是否令" + - get.translation(player) + - "回复" + - trigger.num + - "点体力,然后你摸两张牌?" - ) - .set("ai", () => { - return _status.event.bool; - }) - .set( - "bool", - get.recoverEffect(player, trigger.source, trigger.source) + - 2 * get.effect(trigger.source, { name: "draw" }, trigger.source) > - 5 - ); - "step 1"; - if (result.bool) { - player.logSkill("sbqiaoshi"); - trigger.source.line(player, "green"); - player.recover(trigger.num); - trigger.source.draw(2); - } else player.storage.counttrigger.sbqiaoshi--; - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (get.attitude(target, player) <= 0 || target == player) return; - if (target.storage.counttrigger && target.storage.counttrigger.sbqiaoshi) - return; - if (target.hp <= 1 && !player.canSave(target)) return; - return [0, 0.5, 0, 0.5]; - } - }, - }, - }, - }, - sbyanyu: { - enable: "phaseUse", - usable: 2, - filterCard: { name: "sha" }, - selectCard: 1, - group: "sbyanyu_draw", - check: () => 1, - content: function () { - player.draw(); - }, - subSkill: { - draw: { - trigger: { player: "phaseUseEnd" }, - filter: function (event, player) { - return player.getHistory("useSkill", (evt) => { - if (evt.skill != "sbyanyu") return false; - var evtx = evt.event.getParent("phaseUse"); - if (!evtx || evtx != _status.event.getParent("phaseUse")) return; - return true; - }).length; - }, - direct: true, - content: function () { - "step 0"; - event.num = - 3 * - player.getHistory("useSkill", (evt) => { - if (evt.skill != "sbyanyu") return false; - var evtx = evt.event.getParent("phaseUse"); - if (!evtx || evtx != _status.event.getParent("phaseUse")) return; - return true; - }).length; - player - .chooseTarget( - get.prompt("sbyanyu"), - "令一名其他角色摸" + get.cnNumber(event.num) + "张牌", - lib.filter.notMe - ) - .set("ai", (target) => { - var player = _status.event.player; - return get.effect(target, { name: "draw" }, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbyanyu_draw", target); - target.draw(num); - } - }, - }, - }, - ai: { - order: function (obj, player) { - if ( - game.hasPlayer( - (current) => current != player && get.attitude(player, current) > 0 - ) && - player.getHistory("useSkill", (evt) => { - if (evt.skill != "sbyanyu") return false; - var evtx = evt.event.getParent("phaseUse"); - if (!evtx || evtx != _status.event.getParent("phaseUse")) return; - return true; - }).length < 2 - ) - return 9; - return 2; - }, - result: { - player: 1, - }, - }, - }, - //曹仁 - sbjushou: { - audio: 3, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return !player.isTurnedOver(); - }, - filterCard: true, - selectCard: [1, 2], - check: function (card) { - if (ui.selected.cards.length + _status.event.player.hujia >= 5) return 0; - return 6.5 - get.value(card); - }, - position: "he", - group: ["sbjushou_damage", "sbjushou_draw"], - content: function () { - player.turnOver(); - player.changeHujia(cards.length, null, true); - }, - ai: { - order: 5, - result: { - player: 1, - }, - }, - subSkill: { - damage: { - audio: "sbjushou", - trigger: { - player: "damageEnd", - }, - filter: function (event, player) { - return player.isTurnedOver(); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseControl("翻面", "获得1点护甲", "cancel2") - .set("ai", () => { - if (_status.event.player.hujia >= 3) return 0; - return 1; - }) - .set("prompt", get.prompt("sbjushou")) - .set("prompt2", "选择一项"); - "step 1"; - if (result.control == "cancel2") { - event.finish(); - return; - } - player.logSkill("sbjushou"); - if (result.control == "翻面") { - player.turnOver(); - } else { - player.changeHujia(1, null, true); - } - }, - ai: { - effect: { - target: function (card, player, target) { - if (!target.isTurnedOver()) return; - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if ( - (card.name == "sha" && !player.hasSkill("jiu")) || - target.hasSkillTag("filterDamage", null, { - player: player, - card: card, - }) - ) - return "zerotarget"; - } - }, - }, - }, - }, - draw: { - audio: "sbjushou", - trigger: { player: "turnOverAfter" }, - forced: true, - locked: false, - filter: function (event, player) { - return !player.isTurnedOver() && player.hujia > 0; - }, - content: function () { - player.draw(player.hujia); - }, - }, - }, - }, - sbjiewei: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.hujia > 0; - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h"); - }, - content: function () { - player.changeHujia(-1); - player.gainPlayerCard(target, "visible", true, "h").set("ai", function (button) { - return get.value(button.link, _status.event.target); - }); - }, - ai: { - order: 8, - result: { - target: -1, - }, - }, - }, - //周瑜 - sbyingzi: { - audio: 2, - audioname: ["sb_sunce"], - trigger: { player: "phaseDrawBegin2" }, - forced: true, - getNum: function (player) { - return (player.countCards("h") >= 2) + (player.hp >= 2) + (player.countCards("e") >= 1); - }, - filter: function (event, player) { - return !event.numFixed && lib.skill.sbyingzi.getNum(player) > 0; - }, - content: function () { - var num = lib.skill.sbyingzi.getNum(player); - trigger.num += num; - player.addTempSkill("sbyingzi_limit"); - player.addMark("sbyingzi_limit", num, false); - }, - ai: { - threaten: 2, - }, - subSkill: { - limit: { - charlotte: true, - forced: true, - onremove: true, - marktext: "英", - intro: { - content: "本回合手牌上限+#", - }, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("sbyingzi_limit"); - }, - }, - }, - }, - }, - sbfanjian: { - audio: 2, - enable: "phaseUse", - usable: 5, - filter: function (event, player) { - return !player.hasSkill("sbfanjian_ban"); - }, - chooseButton: { - dialog: function () { - return ui.create.dialog("###反间###" + get.translation("sbfanjian_info")); - }, - chooseControl: function (event, player) { - var suits = lib.suit.slice(); - suits.push("cancel2"); - return suits; - }, - check: function (event, player) { - var suits = lib.suit.slice(); - suits = suits.filter( - (suit) => !player.getStorage("sbfanjian_guessed").includes(suit) - ); - return suits.randomGet(); - }, - backup: function (result, player) { - return { - audio: "sbfanjian", - filterCard: function (card, player) { - return !player - .getStorage("sbfanjian_guessed") - .includes(get.suit(card, player)); - }, - suit: result.control, - position: "h", - filterTarget: lib.filter.notMe, - check: function (card) { - return 6 - get.value(card); - }, - discard: false, - lose: false, - delay: false, - content: function () { - "step 0"; - var suit = get.suit(cards, player); - event.claimSuit = lib.skill.sbfanjian_backup.suit; - event.cardSuit = suit; - player.addTempSkill("sbfanjian_guessed"); - var claim = get.translation(event.claimSuit + "2"); - player.chat("我声明" + claim); - game.log(player, "声明了", "#y" + claim); - var choiceList = [ - "猜测此牌花色为" + claim, - "猜测此牌花色不为" + claim, - "不猜测,你翻面并令其〖反间〗失效", - ]; - target - .chooseControl() - .set("choiceList", choiceList) - .set( - "prompt", - get.translation(player) + - "对你发动了【反间】并选择了一张牌,请选择一项" - ) - .set("ai", () => { - var player = _status.event.player, - user = _status.event.getParent().player, - claim = _status.event.getParent().claimSuit, - suit = _status.event.getParent().cardSuit; - if (player.isTurnedOver()) return 2; - var lose = get.effect(player, { name: "losehp" }, user, player); - if ( - user.getStorage("sbfanjian_guessed").includes(claim) && - claim == suit - ) - return lose <= 0 ? 0 : 1; - if (get.attitude(player, user) > 0) return 0; - var list = [0, 1]; - if (player.hp <= 1 && player.getFriends().length > 0) list.push(2); - return list.randomGet(); - }); - "step 1"; - player.markAuto("sbfanjian_guessed", [event.cardSuit]); - if (result.index == 2) { - game.log(target, "选择", "#y不猜测"); - target.chat("不猜!"); - target.turnOver(); - } else { - var claim = get.translation(event.claimSuit + "2"); - target.chat("我猜花色" + (result.index == 1 ? "不" : "") + "为" + claim); - game.log( - target, - "猜测花色", - "#g" + (result.index == 1 ? "不" : "") + "为" + claim - ); - } - if (event.isMine() && !event.isOnline()) game.delayx(); - "step 2"; - target.gain(cards, player, "giveAuto", "bySelf"); - "step 3"; - if ( - (result.index == 0 && event.claimSuit != event.cardSuit) || - (result.index == 1 && event.claimSuit == event.cardSuit) - ) { - game.log(target, "猜测", "#y错误"); - target.loseHp(); - } else { - if (result.index != 2) game.log(target, "猜测", "#g正确"); - player.addTempSkill("sbfanjian_ban"); - } - }, - ai: { - result: { - target: function (player, target) { - if (!ui.selected.cards.length) return 0; - var val = get.value(ui.selected.cards, target); - if (val < 0) - return ( - val + get.effect(target, { name: "losehp" }, player, target) - ); - if (val > 5 || get.value(ui.selected.cards, player) > 5) - return target.isTurnedOver() ? 5 : 0; - if (target.isTurnedOver()) return 1; - return get.effect(target, { name: "losehp" }, player, target); - }, - }, - }, - }; - }, - prompt: function (result) { - return ( - "你选择了" + get.translation(result.control) + ",请选择一张手牌和【反间】的目标" - ); - }, - }, - subSkill: { - guessed: { onremove: true, charlotte: true }, - ban: { charlotte: true }, - backup: {}, - }, - ai: { - order: 4, - result: { player: 1 }, - }, - }, - //黄盖 - sbkurou: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - group: "sbkurou_gain", - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: get.prompt("sbkurou"), - prompt2: - "交给其他角色一张牌,若此牌为【桃】或【酒】,你失去2点体力,否则你失去1点体力", - filterCard: true, - position: "he", - filterTarget: lib.filter.notMe, - ai1: function (card) { - if ((player.hp <= 1 && !player.canSave(player)) || player.hujia >= 5) return 0; - if ( - get.value(card, player) > 6 && - !game.hasPlayer((current) => { - return ( - current != player && - get.attitude(current, player) > 0 && - !current.hasSkillTag("nogain") - ); - }) - ) - return 0; - if ( - player.hp >= 2 && - (card.name == "tao" || - (card.name == "jiu" && - player.countCards("hs", (cardx) => { - return cardx != card && get.tag(cardx, "save"); - }))) && - player.hujia <= 1 - ) - return 10; - if (player.hp <= 1 && !player.canSave(player)) return 0; - return 1 / Math.max(0.1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (ui.selected.cards.length) { - var val = get.value(ui.selected.cards[0]); - att *= val >= 0 ? 1 : -1; - } - if (target.hasSkillTag("nogain")) att /= 9; - return 15 + att; - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0], - card = result.cards[0]; - player.logSkill("sbkurou", target); - if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15); - player.give(card, target); - player.loseHp(["tao", "jiu"].includes(get.name(card, target)) ? 2 : 1); - } - }, - ai: { - nokeep: true, - skillTagFilter: function (player, tag, arg) { - if (tag === "nokeep") - return ( - (!arg || (arg.card && get.name(arg.card) === "tao")) && - player.hp <= 0 && - player.isPhaseUsing() - ); - }, - }, - subSkill: { - gain: { - audio: "sbkurou", - trigger: { player: "loseHpEnd" }, - forced: true, - locked: false, - filter: function (event, player) { - return player.isIn() && player.hujia < 5; - }, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - player.changeHujia(2, null, true); - "step 2"; - if (--event.count > 0) { - player.logSkill("sbkurou_gain"); - event.goto(1); - } - }, - ai: { - maihp: true, - effect: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, 1]; - return 1.2; - } - if (get.tag(card, "loseHp")) { - if (target.hp <= 1 || target.hujia >= 5) return; - return [1, 1]; - } - }, - }, - }, - }, - }, - sbzhaxiang: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - group: "sbzhaxiang_draw", - filter: function (event, player) { - return player.getHistory("useCard").length <= player.getDamagedHp(); - }, - content: function () { - trigger.directHit.addArray(game.filterPlayer()); - }, - ai: { - threaten: 1.5, - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return player.countUsed() < player.getDamagedHp(); - }, - }, - mod: { - targetInRange: function (card, player) { - if (player.countUsed() < player.getDamagedHp()) return true; - }, - cardUsable: function (card, player) { - if (player.countUsed() < player.getDamagedHp()) return Infinity; - }, - aiOrder: function (player, card, num) { - if (player.countUsed() >= player.getDamagedHp()) return; - var numx = get.info(card).usable; - if (typeof numx == "function") numx = num(card, player); - if (typeof numx == "number") return num + 10; - }, - }, - subSkill: { - draw: { - audio: "sbzhaxiang", - mod: { - aiOrder: function (player, card, num) { - if ( - num > 0 && - _status.event && - _status.event.type == "phase" && - get.tag(card, "recover") - ) - return num / 5; - }, - }, - trigger: { player: "phaseDrawBegin2" }, - forced: true, - filter: function (event, player) { - return !event.numFixed && player.getDamagedHp() > 0; - }, - content: function () { - trigger.num += player.getDamagedHp(); - }, - ai: { - effect: { - target: function (card, player, target) { - if ( - get.tag(card, "recover") && - target.hp > 0 && - target.needsToDiscard() < 1 - ) - return [0, 0]; - }, - }, - }, - }, - }, - }, - //孙权 - sbzhiheng: { - audio: 2, - audioname: ["shen_caopi"], - locked: false, - mod: { - aiOrder: function (player, card, num) { - if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip") - return num; - let eq = player.getEquip(get.subtype(card)); - if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp)) - return 0; - }, - }, - enable: "phaseUse", - usable: 1, - position: "he", - filterCard: lib.filter.cardDiscardable, - discard: false, - lose: false, - delay: false, - selectCard: [1, Infinity], - prompt: function (event) { - var count = _status.event.player.countMark("sbtongye"); - var str = - "出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你以此法弃置的牌包括你所有手牌,则你多摸" + - get.cnNumber(count + 1) + - "张牌"; - if (count > 0) str += ",并弃1枚“业”"; - str += "。"; - return str; - }, - check: function (card) { - var player = _status.event.player; - if ( - get.position(card) == "h" && - !player.countCards("h", "du") && - (player.hp > 2 || - !player.countCards("h", function (card) { - return get.value(card) >= 8; - })) - ) { - return 1; - } - return 6 - get.value(card); - }, - content: function () { - "step 0"; - player.discard(cards); - event.num = 1; - var hs = player.getCards("h"); - if (!hs.length) event.num = 0; - for (var i = 0; i < hs.length; i++) { - if (!cards.includes(hs[i])) { - event.num = 0; - break; - } - } - "step 1"; - var all = event.num; - player.draw((all ? 1 + player.countMark("sbtongye") : 0) + cards.length); - if (all) player.removeMark("sbtongye", 1); - }, - ai: { - order: function (item, player) { - if (player.hasCard((i) => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; - return 10; - }, - result: { - player: 1, - }, - nokeep: true, - skillTagFilter: function (player, tag, arg) { - if (tag === "nokeep") - return ( - (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && - player.isPhaseUsing() && - !player.getStat().skill.sbzhiheng && - player.hasCard((card) => get.name(card) !== "tao", "h") - ); - }, - threaten: 1.56, - }, - }, - sbtongye: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - onremove: true, - content: function () { - "step 0"; - player - .chooseControl("变化", "不变") - .set("prompt", "统业:猜测场上装备数是否于你下回合准备阶段前发生变化") - .set("ai", () => { - let player = _status.event.player; - if (game.countPlayer() > 3) return "变化"; - if ( - game.countPlayer(function (current) { - return current.hasCard({ type: "equip" }, "e"); - }) < game.countPlayer() - ) - return "变化"; - if ( - game.countPlayer() == 2 && - game.countPlayer(function (current) { - if (current != player) - return ( - current.countCards("e", { type: "equip" }) + - current.countDisabledSlot() - ); - }) >= 5 - ) - return "不变"; - if (Math.random() < 0.3) return "变化"; - return "不变"; - }); - "step 1"; - if (result.control == "变化") { - player.addSkill("sbtongye_change", 1); - player.chat("变!"); - } else { - player.addSkill("sbtongye_nochange", 1); - player.chat("不变!"); - } - var num = game - .filterPlayer() - .map((i) => i.countCards("e")) - .reduce((p, c) => p + c, 0); - player.removeMark("sbtongye_count", player.countMark("sbtongye_count"), false); - if (num > 0) player.addMark("sbtongye_count", num, false); - player.addSkill("sbtongye_settle"); - }, - marktext: "业", - intro: { - name: "统业", - name2: "业", - content: "mark", - }, - ai: { - combo: "sbzhiheng", - }, - subSkill: { - broadcast: { - trigger: { - global: [ - "loseAfter", - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - charlotte: true, - silent: true, - filter: function (event, player) { - var num = 0; - game.countPlayer(function (current) { - var evt = event.getl(current); - if (evt && evt.es) num += evt.es.length; - }); - if (event.name == "equip") num--; - return num != 0; - }, - content: function () { - if (player.hasSkill("sbtongye_change")) player.markSkill("sbtongye_change"); - if (player.hasSkill("sbtongye_nochange")) player.markSkill("sbtongye_nochange"); - }, - }, - settle: { - audio: "sbtongye", - init: function (player) { - player.addSkill("sbtongye_broadcast"); - }, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return player.hasSkill("sbtongye_change") || player.hasSkill("sbtongye_nochange"); - }, - content: function () { - var delta = - game - .filterPlayer() - .map((i) => i.countCards("e")) - .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count"); - if ( - (player.hasSkill("sbtongye_change") && delta != 0) || - (player.hasSkill("sbtongye_nochange") && delta == 0) - ) { - game.log(player, "猜测", "#g正确"); - if (player.countMark("sbtongye") < 2) player.addMark("sbtongye", 1); - } else { - game.log(player, "猜测", "#y错误"); - player.removeMark("sbtongye", 1); - } - player.removeSkill("sbtongye_change"); - player.removeSkill("sbtongye_nochange"); - player.removeSkill("sbtongye_settle"); - player.removeSkill("sbtongye_broadcast"); - }, - }, - change: { - charlotte: true, - mark: true, - marktext: "变", - intro: { - markcount: function (storage, player) { - return ( - game - .filterPlayer() - .map((i) => i.countCards("e")) - .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count") - ); - }, - mark: function (dialog, storage, player) { - dialog.addText(get.translation(player) + "猜测场上装备数发生变化"); - var delta = - game - .filterPlayer() - .map((i) => i.countCards("e")) - .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count"); - if (delta == 0) dialog.addText("(当前未发生变化)"); - else - dialog.addText( - "(当前已" + - (delta > 0 ? "增加" : "减少") + - get.cnNumber(Math.abs(delta)) + - "张装备牌)" - ); - }, - }, - }, - nochange: { - charlotte: true, - mark: true, - marktext: '', - intro: { - markcount: function (storage, player) { - return ( - game - .filterPlayer() - .map((i) => i.countCards("e")) - .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count") - ); - }, - mark: function (dialog, storage, player) { - dialog.addText(get.translation(player) + "猜测场上装备数不发生变化"); - var delta = - game - .filterPlayer() - .map((i) => i.countCards("e")) - .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count"); - if (delta == 0) dialog.addText("(当前未发生变化)"); - else - dialog.addText( - "(当前已" + - (delta > 0 ? "增加" : "减少") + - get.cnNumber(Math.abs(delta)) + - "张装备牌)" - ); - }, - }, - }, - }, - }, - sbjiuyuan: { - audio: 2, - trigger: { global: "useCard" }, - forced: true, - zhuSkill: true, - group: "sbjiuyuan_recover", - filter: function (event, player) { - return ( - event.card.name == "tao" && - player != event.player && - event.player.group == "wu" && - event.player.isIn() && - player.hasZhuSkill("sbjiuyuan", event.player) - ); - }, - content: function () { - player.draw(); - }, - subSkill: { - recover: { - audio: "sbjiuyuan", - trigger: { target: "taoBegin" }, - zhuSkill: true, - forced: true, - filter: function (event, player) { - if (event.player == player) return false; - if (!player.hasZhuSkill("sbjiuyuan", event.player)) return false; - if (event.player.group != "wu") return false; - return true; - }, - content: function () { - trigger.baseDamage++; - }, - }, - }, - }, - //孙尚香 - sbjieyin: { - trigger: { player: "phaseUseBegin" }, - forced: true, - locked: false, - dutySkill: true, - group: ["sbjieyin_init", "sbjieyin_fail"], - filter: function (event, player) { - return game.hasPlayer((current) => current.hasMark("sbjieyin_mark")); - }, - content: function () { - "step 0"; - var targets = game.filterPlayer((current) => current.hasMark("sbjieyin_mark")); - event.targets = targets; - "step 1"; - var target = targets.shift(); - event.target = target; - var str = target.hasSkill("sbjieyin_marked") ? "移去" : "移动或移去"; - var num = Math.min(2, Math.max(1, target.countCards("h"))); - target - .chooseCard( - "交给" + - get.translation(player) + - get.cnNumber(num) + - "张手牌,然后获得1点护甲;或令其" + - str + - "你的所有“助”标记", - num - ) - .set("ai", (card) => { - if (_status.event.goon) return 100 - get.value(card); - return 0; - }) - .set("goon", get.attitude(target, player) > 1); - "step 2"; - if (result.bool) { - target.give(result.cards, player); - target.changeHujia(1, null, true); - event.goto(4); - } else { - if ( - !game.hasPlayer((current) => current != player && current != target) || - target.hasSkill("sbjieyin_marked") - ) - event._result = { bool: false }; - else - player - .chooseTarget( - "结姻:是否移动" + get.translation(target) + "的“助”?", - (card, player, target) => { - return target != player && target != _status.event.getParent().target; - } - ) - .set("ai", (target) => get.attitude(_status.event.player, target) - 1); - target.addSkill("sbjieyin_marked"); - } - "step 3"; - if (result.bool) { - var targetx = result.targets[0]; - var num = target.countMark("sbjieyin_mark"); - target.removeSkill("sbjieyin_mark"); - targetx.addSkill("sbjieyin_mark"); - targetx.addMark("sbjieyin_mark", num, false); - player.line2([target, targetx], "green"); - game.log(player, "将", target, "的" + get.cnNumber(num) + "枚“助”移动至", targetx); - } else { - target.removeSkill("sbjieyin_mark"); - game.log(player, "移去了", target, "的" + get.cnNumber(num) + "枚“助”"); - game.createEvent("sbjieyin_fail").setContent(lib.skill.sbjieyin_fail.content).player = - player; - } - "step 4"; - if (targets.length) event.goto(1); - }, - subSkill: { - fail: { - audio: "sbjieyin", - trigger: { global: "dieAfter" }, - dutySkill: true, - forced: true, - locked: false, - direct: true, - filter: function (event, player) { - return event.player.hasMark("sbjieyin_mark"); - }, - content: function () { - player.logSkill("sbjieyin_fail"); - player.awakenSkill("sbjieyin"); - game.log(player, "使命失败"); - player.changeGroup("wu"); - player.recover(); - player.gain(player.getExpansions("sbliangzhu"), "gain2"); - player.loseMaxHp(); - }, - }, - mark: { - charlotte: true, - mark: true, - marktext: "助", - onremove: true, - intro: { - name: "结姻(助)", - name2: "助", - content: "mark", - }, - }, - marked: { charlotte: true }, - init: { - audio: "sbjieyin", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - direct: true, - dutySkill: true, - filter: function (event, player) { - return ( - game.hasPlayer((current) => current != player) && - (event.name != "phase" || game.phaseNumber == 0) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget("结姻:令一名其他角色获得1枚“助”", lib.filter.notMe, true) - .set("ai", (target) => get.attitude(_status.event.player, target)); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbjieyin_init", target); - target.addSkill("sbjieyin_mark"); - target.addMark("sbjieyin_mark", 1); - } - "step 2"; - game.delayx(); - }, - }, - }, - }, - sbliangzhu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.group == "shu" && - game.hasPlayer((current) => current != player && current.countCards("e")) - ); - }, - groupSkill: true, - filterTarget: function (card, player, target) { - return target.countCards("e") && target != player; - }, - content: function () { - "step 0"; - player.choosePlayerCard(target, "e", true); - "step 1"; - if (result.bool) { - player.addToExpansion(result.cards, target, "give").gaintag.add("sbliangzhu"); - } else event.finish(); - "step 2"; - for (var target of game.filterPlayer((current) => current.hasMark("sbjieyin_mark"))) { - target.chooseDrawRecover(2, true); - } - }, - marktext: "妆", - intro: { - name: "良助(妆)", - name2: "妆", - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { - order: 9, - result: { - player: function (player) { - var num = 0, - targets = game.filterPlayer((current) => current.hasMark("sbjieyin_mark")); - for (var current of targets) { - num += 2 * get.effect(current, { name: "draw" }, player, player); - } - if (num > 0) return 3; - return 1; - }, - target: -1, - }, - }, - }, - sbxiaoji: { - audio: 2, - audioname: ["sp_sunshangxiang", "re_sunshangxiang", "db_sunshangxiang"], - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - locked: false, - groupSkill: true, - filter: function (event, player) { - if (player.group != "wu") return false; - var evt = event.getl(player); - return evt && evt.player == player && evt.es && evt.es.length > 0; - }, - content: function () { - "step 0"; - event.count = trigger.getl(player).es.length; - "step 1"; - event.count--; - player.draw(2); - player - .chooseTarget("是否弃置场上的一张牌?", (card, player, target) => { - return target.countDiscardableCards(player, "ej"); - }) - .set("ai", (target) => { - var player = _status.event.player; - var att = get.attitude(player, target); - if ( - att > 0 && - (target.countCards("j") > 0 || - target.countCards("e", function (card) { - return get.value(card, target) < 0; - })) - ) - return 2; - if (att < 0 && target.countCards("e") > 0 && !target.hasSkillTag("noe")) - return -1; - return 0; - }); - "step 2"; - if (result.bool) { - player.discardPlayerCard(result.targets[0], "ej", true); - } - "step 3"; - if (event.count > 0) { - player.logSkill("sbxiaoji"); - event.goto(1); - } - }, - ai: { - noe: true, - reverseEquip: true, - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; - }, - }, - }, - }, - //吕蒙 - sbkeji: { - audio: 2, - enable: "phaseUse", - filterCard: true, - selectCard: function () { - var player = _status.event.player; - if (player.hasSkill("sbkeji_discard")) return [0, 0]; - if (player.hasSkill("sbkeji_losehp")) return [1, 1]; - return [0, 1]; - }, - locked: false, - usable: 2, - prompt: function (event) { - var player = _status.event.player, - str = "出牌阶段" + (player.storage.sbkeji ? "" : "各") + "限一次。你可以"; - var discard = player.hasSkill("sbkeji_discard"), - losehp = player.hasSkill("sbkeji_losehp"); - if (!discard) str += "弃置一张手牌并获得1点护甲"; - if (!losehp) str += (!discard ? ",或" : "") + "点击“确定”失去1点体力并获得2点护甲"; - return str; - }, - filter: function (event, player) { - return (player.getStat("skill").sbkeji || 0) < (player.storage.sbkeji ? 1 : 2); - }, - check: function (card) { - var player = _status.event.player; - if (_status.event.player.hp == 1 && player.canSave(player) && player.hujia <= 3) return 0; - return 6 - get.value(card); - }, - content: function () { - "step 0"; - if (cards.length) { - player.changeHujia(1, null, true); - player.addTempSkill("sbkeji_discard", "phaseUseAfter"); - event.finish(); - } else { - player.loseHp(); - } - "step 1"; - player.changeHujia(2, null, true); - player.addTempSkill("sbkeji_losehp", "phaseUseAfter"); - }, - mod: { - maxHandcard: function (player, num) { - return num + player.hujia; - }, - cardEnabled: function (card, player) { - if (player != _status.event.dying && card.name == "tao") return false; - }, - cardSavable: function (card, player) { - if (player != _status.event.dying && card.name == "tao") return false; - }, - }, - ai: { - order: 1, - result: { - player: function (player, target) { - if (player.hujia >= 5) return 0; - if ( - player.hp == 1 && - !player.canSave(player) && - !player.hasCard((card) => { - return ( - lib.filter.cardDiscardable(card, player, "sbkeji") && - get.value(card) < 6 - ); - }, "h") - ) { - return 0; - } - return 1; - }, - }, - }, - subSkill: { - discard: { charlotte: true }, - losehp: { charlotte: true }, - }, - }, - sbdujiang: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - derivation: "sbduojing", - juexingji: true, - forced: true, - skillAnimation: true, - animationColor: "wood", - filter: function (event, player) { - return player.hujia >= 3; - }, - content: function () { - player.awakenSkill("sbdujiang"); - player.addSkills("sbduojing"); - player.storage.sbkeji = true; - }, - }, - sbduojing: { - audio: 2, - trigger: { player: "useCardToPlayer" }, - filter: function (event, player) { - return player.hujia > 0 && event.card.name == "sha"; - }, - check: function (event, player) { - return ( - event.target.countGainableCards(player, "he") > 0 || - player.countCards("hs", { name: "sha" }) > 0 - ); - }, - logTarget: "target", - content: function () { - "step 0"; - player.changeHujia(-1); - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.sbduojing = true; - "step 1"; - var target = trigger.target; - if (target.countGainableCards(player, "he") > 0) - player.gainPlayerCard(target, "he", true); - player.addTempSkill("sbduojing_add", "phaseUseAfter"); - player.addMark("sbduojing_add", 1, false); - player.markSkill("sbduojing_add"); - }, - subSkill: { - add: { - charlotte: true, - marktext: "夺", - onremove: true, - intro: { - content: "本阶段使用杀次数上限+$", - }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("sbduojing_add"); - }, - }, - }, - }, - ai: { - unequip: true, - unequip_ai: true, - skillTagFilter: function (player, tag, arg) { - if (player.hujia <= 0) return; - if ( - tag == "unequip" && - (!arg || !arg.card || !arg.card.storage || !arg.card.storage.sbduojing) - ) - return false; - if (tag == "unequip_ai" && (!arg || arg.name != "sha")) return false; - }, - }, - }, - //于禁 - sbxiayuan: { - audio: 2, - trigger: { global: "damageEnd" }, - direct: true, - filter: function (event, player) { - return ( - event.hujia && - !event.player.hujia && - event.player.isIn() && - player.countCards("h") > 1 && - !player.hasSkill("sbxiayuan_round", null, false, false) - ); - }, - content: function () { - "step 0"; - player.addTempSkill("sbxiayuan_round", "roundStart"); - player - .chooseToDiscard( - 2, - "h", - get.prompt("sbxiayuan", trigger.player), - "弃置两张手牌,令其获得" + get.cnNumber(trigger.hujia) + "点护甲" - ) - .set("goon", get.attitude(player, trigger.player) > 0) - .set("ai", function (card) { - if (!_status.event.goon) return 0; - return 5 - get.value(card); - }).logSkill = ["sbxiayuan", trigger.player]; - "step 1"; - if (result.bool) { - var target = trigger.player; - target.changeHujia(trigger.hujia, null, true); - game.delayx(); - } else player.removeSkill("sbxiayuan_round"); - }, - subSkill: { round: { charlotte: true } }, - ai: { expose: 0.2 }, - }, - sbjieyue: { - audio: 4, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - lib.filter.notMe, - get.prompt("sbjieyue"), - "令一名其他角色获得1点护甲,然后该角色可以交给你一张牌。" - ) - .set("ai", function (target) { - return ( - get.attitude(_status.event.player, target) / - Math.sqrt(Math.min(1, target.hp + target.hujia)) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("sbjieyue", target); - target.changeHujia(1, null, true); - target - .chooseCard("he", "是否交给" + get.translation(player) + "一张牌?") - .set("ai", (card) => 0.1 - get.value(card)); - } else event.finish(); - "step 2"; - if (result.bool) { - target.give(result.cards, player); - } - }, - ai: { - threaten: 2.7, - expose: 0.2, - }, - }, - //华雄 - sbyangwei: { - audio: 3, - enable: "phaseUse", - filter: function (event, player) { - return !player.hasSkill("sbyangwei_counter", null, null, false); - }, - content: function () { - player.draw(2); - player.addTempSkill("sbyangwei_effect"); - player.addSkill("sbyangwei_counter"); - }, - ai: { - order: 9, - result: { player: 1 }, - }, - subSkill: { - effect: { - audio: "sbyangwei", - equipSkill: false, - inherit: "qinggang_skill", - charlotte: true, - nopop: true, - mod: { - targetInRange: function (card) { - if (card.name == "sha") return true; - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - mark: true, - marktext: "威", - intro: { content: "使用【杀】的次数上限+1且无距离限制且无视防具" }, - }, - counter: { - trigger: { player: "phaseJieshu" }, - silent: true, - popup: false, - forced: true, - charlotte: true, - onremove: true, - content: function () { - if (!player.storage.sbyangwei_counter) player.storage.sbyangwei_counter = true; - else player.removeSkill("sbyangwei_counter"); - }, - }, - }, - }, - //黄忠 - sbliegong: { - audio: 2, - mod: { - cardnature: function (card, player) { - if (player.hasEmptySlot(1) && get.name(card, player) == "sha") return false; - }, - }, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return ( - !event.getParent()._sbliegong_player && - event.targets.length == 1 && - event.card.name == "sha" && - player.getStorage("sbliegong").length > 0 - ); - }, - prompt2: function (event, player) { - var str = "", - storage = player.getStorage("sbliegong"); - if (storage.length > 1) { - str += "亮出牌堆顶的" + get.cnNumber(storage.length - 1) + "张牌并增加伤害;且"; - } - str += "令" + get.translation(event.target) + "不能使用花色为"; - for (var i = 0; i < storage.length; i++) { - str += get.translation(storage[i]); - } - str += "的牌响应" + get.translation(event.card); - return str; - }, - logTarget: "target", - locked: false, - check: function (event, player) { - var target = event.target; - if (get.attitude(player, target) > 0) return false; - if ( - target.hasSkillTag("filterDamage", null, { - player: player, - card: event.card, - }) - ) - return false; - var storage = player.getStorage("sbliegong"); - if (storage.length >= 4) return true; - if (storage.length < 3) return false; - if (target.hasShan()) return storage.includes("heart") && storage.includes("diamond"); - return true; - }, - content: function () { - var storage = player.getStorage("sbliegong").slice(0); - var num = storage.length - 1; - var evt = trigger.getParent(); - if (num > 0) { - if (typeof evt.baseDamage != "number") evt.baseDamage = 1; - var cards = get.cards(num); - player.showCards(cards.slice(0), get.translation(player) + "发动了【烈弓】"); - while (cards.length > 0) { - var card = cards.pop(); - if (storage.includes(get.suit(card, false))) evt.baseDamage++; - //ui.cardPile.insertBefore(card,ui.cardPile.firstChild); - } - //game.updateRoundNumber(); - } - evt._sbliegong_player = player; - player.addTempSkill("sbliegong_clear"); - var target = trigger.target; - target.addTempSkill("sbliegong_block"); - if (!target.storage.sbliegong_block) target.storage.sbliegong_block = []; - target.storage.sbliegong_block.push([evt.card, storage]); - lib.skill.sbliegong.updateBlocker(target); - }, - updateBlocker: function (player) { - var list = [], - storage = player.storage.sbliegong_block; - if (storage && storage.length) { - for (var i of storage) list.addArray(i[1]); - } - player.storage.sbliegong_blocker = list; - }, - ai: { - threaten: 3.5, - directHit_ai: true, - halfneg: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.card && arg.card.name == "sha") { - var storage = player.getStorage("sbliegong"); - if ( - storage.length < 3 || - !storage.includes("heart") || - !storage.includes("diamond") - ) - return false; - var target = arg.target; - if ( - target.hasSkill("bagua_skill") || - target.hasSkill("bazhen") || - target.hasSkill("rw_bagua_skill") - ) - return false; - return true; - } - return false; - }, - }, - intro: { - content: "已记录花色:$", - onunmark: true, - }, - group: "sbliegong_count", - subSkill: { - clear: { - trigger: { player: "useCardAfter" }, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player) { - return event._sbliegong_player == player; - }, - content: function () { - player.unmarkSkill("sbliegong"); - }, - }, - block: { - mod: { - cardEnabled: function (card, player) { - if (!player.storage.sbliegong_blocker) return; - var suit = get.suit(card); - if (suit == "none") return; - var evt = _status.event; - if (evt.name != "chooseToUse") evt = evt.getParent("chooseToUse"); - if (!evt || !evt.respondTo || evt.respondTo[1].name != "sha") return; - if (player.storage.sbliegong_blocker.includes(suit)) return false; - }, - }, - trigger: { - player: ["damageBefore", "damageCancelled", "damageZero"], - target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], - global: ["useCardEnd"], - }, - forced: true, - firstDo: true, - charlotte: true, - onremove: function (player) { - delete player.storage.sbliegong_block; - delete player.storage.sbliegong_blocker; - }, - filter: function (event, player) { - if (!event.card || !player.storage.sbliegong_block) return false; - for (var i of player.storage.sbliegong_block) { - if (i[0] == event.card) return true; - } - return false; - }, - content: function () { - var storage = player.storage.sbliegong_block; - for (var i = 0; i < storage.length; i++) { - if (storage[i][0] == trigger.card) { - storage.splice(i--, 1); - } - } - if (!storage.length) player.removeSkill("sbliegong_block"); - else lib.skill.sbliegong.updateBlocker(target); - }, - }, - count: { - trigger: { - player: "useCard", - target: "useCardToTargeted", - }, - forced: true, - filter: function (event, player, name) { - if (name != "useCard" && player == event.player) return false; - var suit = get.suit(event.card); - if (!lib.suit.includes(suit)) return false; - if (player.storage.sbliegong && player.storage.sbliegong.includes(suit)) - return false; - return true; - }, - content: function () { - player.markAuto("sbliegong", [get.suit(trigger.card)]); - }, - }, - }, - }, - //刘赪 - splveying: { - audio: 2, - trigger: { player: "useCardAfter" }, - forced: true, - filter: function (event, player) { - return event.card.name == "sha" && player.countMark("splveying") > 1; - }, - content: function () { - "step 0"; - player.removeMark("splveying", 2); - player.draw(); - "step 1"; - player.chooseUseTarget("guohe"); - }, - marktext: "椎", - intro: { - name: "椎(掠影/莺舞)", - name2: "椎", - content: "mark", - }, - group: "splveying_add", - subSkill: { - add: { - trigger: { player: "useCardToPlayered" }, - forced: true, - usable: 2, - filter: function (event, player) { - return event.card.name == "sha" && player.isPhaseUsing(); - }, - content: function () { - player.addMark("splveying", 1); - }, - }, - }, - }, - spyingwu: { - group: "spyingwu_add", - audio: 2, - trigger: { player: "useCardAfter" }, - forced: true, - locked: false, - filter: function (event, player) { - return ( - player.hasSkill("splveying", null, null, false) && - get.type(event.card) == "trick" && - !get.tag(event.card, "damage") && - player.countMark("splveying") > 1 - ); - }, - content: function () { - player.removeMark("splveying", 2); - player.draw(); - player.chooseUseTarget("sha", false); - }, - ai: { combo: "splveying" }, - subSkill: { - add: { - trigger: { player: "useCardToPlayered" }, - forced: true, - locked: false, - usable: 2, - filter: function (event, player) { - return ( - player.hasSkill("splveying") && - get.type(event.card) == "trick" && - !get.tag(event.card, "damage") && - player.isPhaseUsing() - ); - }, - content: function () { - player.addMark("splveying", 1); - }, - }, - }, - }, - //手杀杨婉 - spmingxuan: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - forced: true, - filter: function (event, player) { - var list = player.getStorage("spmingxuan"); - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return current != player && !list.includes(current); - }) - ); - }, - content: function () { - "step 0"; - var suits = [], - hs = player.getCards("h"); - for (var i of hs) suits.add(get.suit(i, player)); - var list = player.getStorage("spmingxuan"), - num = Math.min( - suits.length, - game.countPlayer(function (current) { - return current != player && !list.includes(current); - }) - ); - player - .chooseCard( - "h", - true, - [1, num], - "瞑昡:请选择至多" + get.cnNumber(num) + "张花色各不相同的手牌", - function (card, player) { - if (!ui.selected.cards.length) return true; - var suit = get.suit(card); - for (var i of ui.selected.cards) { - if (get.suit(i, player) == suit) return false; - } - return true; - } - ) - .set("complexCard", true) - .set("ai", (card) => 6 - get.value(card)); - "step 1"; - if (result.bool) { - var list = player.getStorage("spmingxuan"), - cards = result.cards.randomSort(); - var targets = game - .filterPlayer((current) => current != player && !list.includes(current)) - .randomGets(cards.length) - .sortBySeat(); - player.line(targets, "green"); - var map = []; - for (var i = 0; i < targets.length; i++) { - map.push([targets[i], cards[i]]); - } - game.loseAsync({ - gain_list: map, - player: player, - cards: cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - event.targets = targets; - event.num = 0; - } else event.finish(); - "step 2"; - game.delayx(); - "step 3"; - if (num < targets.length) { - var target = targets[num]; - event.num++; - if (target.isIn()) { - event.target = target; - 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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", player) - .set("addCount", false); - } else { - if (event.num < targets.length) event.redo(); - else event.finish(); - } - } - "step 4"; - if (result.bool) { - player.markAuto("spmingxuan", [target]); - if (event.num < targets.length) event.goto(3); - else event.finish(); - } else { - var he = target.getCards("he"); - if (he.length) { - if (he.length == 1) event._result = { bool: true, cards: he }; - else target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); - } else { - if (event.num < targets.length) event.goto(3); - else event.finish(); - } - } - "step 5"; - if (result.bool) { - target.give(result.cards, player); - player.draw(); - } - if (event.num < targets.length) event.goto(3); - }, - intro: { content: "已被$使用过杀" }, - }, - spxianchou: { - audio: 2, - trigger: { player: "damageEnd" }, - direct: true, - filter: function (event, player) { - return ( - event.source && - event.source.isIn() && - game.hasPlayer(function (current) { - return current != player && current != event.source; - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("spxianchou"), function (card, player, target) { - return target != player && target != _status.event.getTrigger().source; - }) - .set("ai", function (target) { - return ( - get.attitude(target, _status.event.player) * - Math.sqrt(target.countCards("he")) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("spxianchou", target); - player.line2([target, trigger.source]); - target - .chooseToDiscard( - "he", - "是否弃置一张牌,视为对" + - get.translation(trigger.source) + - "使用一张【杀】?" - ) - .set("ai", function (card) { - if (_status.event.goon) return 8 - get.value(card); - return 0; - }) - .set( - "goon", - (target.canUse("sha", trigger.source, false) - ? get.effect( - trigger.source, - { name: "sha", isCard: true }, - target, - target - ) - : 0) + - get.recoverEffect(player, target, target) > - 0 - ); - } else event.finish(); - "step 2"; - if (result.bool) { - if (target.canUse("sha", trigger.source, false)) - target.useCard({ name: "sha", isCard: true }, trigger.source, false); - else event.finish(); - } else event.finish(); - "step 3"; - if ( - target.hasHistory("sourceDamage", function (evt) { - var card = evt.card; - if (!card || card.name != "sha") return false; - var evtx = evt.getParent("useCard"); - return evtx.card == card && evtx.getParent() == event; - }) - ) { - target.draw(); - player.recover(); - } - }, - }, - }, - dynamicTranslate: { - sbkeji: function (player) { - return ( - "①出牌阶段" + - (player.storage.sbkeji ? "" : "各") + - "限一次。你可以选择一项:1.弃置一张手牌,然后获得1点护甲;2.失去1点体力,然后获得2点护甲。②你的手牌上限+X(X为你的护甲数)。③若你不为正在结算濒死流程的角色,你不能使用【桃】。" - ); - }, - sblongdan: function (player) { - if (player.hasSkill("sblongdan_mark", null, null, false)) - return "蓄力技(1/3)。①你可以消耗1点蓄力值,将一张基本牌当做任意基本牌使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。"; - return "蓄力技(1/3)。①你可以消耗1点蓄力值,将【杀】当做【闪】或将【闪】当做【杀】使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。"; - }, - sblianhuan: function (player) { - var str = - "①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。"; - if (!player.storage.sblianhuan) - str += - "③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。"; - else - str += - "③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。"; - return str; - }, - sbjiang: function (player) { - var str = - "①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限"; - if (player.countMark("sbjiang")) - str += "X次。你可以将所有手牌当【决斗】使用(X为场上其他吴势力角色数+1)。"; - else str += "一次。你可以将所有手牌当【决斗】使用。"; - return str; - }, - sbzhenliang: function (player) { - var storage = player.storage.sbzhenliang; - var str = "转换技。"; - if (!storage) str += ''; - str += - "阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。"; - if (!storage) str += ""; - if (storage) str += ''; - str += - "阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。"; - if (storage) str += ""; - return str; - }, - }, - translate: { - sb_zhanghe_prefix: "谋", - sb_yujin_prefix: "谋", - sb_huaxiong_prefix: "谋", - liucheng_prefix: "谋", - sp_yangwan_prefix: "谋", - sb_huangzhong_prefix: "谋", - sb_lvmeng_prefix: "谋", - sb_sunshangxiang_prefix: "谋", - sb_sunquan_prefix: "谋", - sb_huanggai_prefix: "谋", - sb_zhouyu_prefix: "谋", - sb_caoren_prefix: "谋", - sb_xiahoushi_prefix: "谋", - sb_zhangjiao_prefix: "谋", - sb_caocao_prefix: "谋", - sb_zhenji_prefix: "谋", - sb_ganning_prefix: "谋", - sb_machao_prefix: "谋", - sb_xuhuang_prefix: "谋", - sb_zhangfei_prefix: "谋", - sb_zhaoyun_prefix: "谋", - sb_liubei_prefix: "谋", - sb_jiangwei_prefix: "谋", - sb_fazheng_prefix: "谋", - sb_chengong_prefix: "谋", - sb_diaochan_prefix: "谋", - sb_yuanshao_prefix: "谋", - sb_pangtong_prefix: "谋", - sb_sunce_prefix: "谋", - sb_daqiao_prefix: "谋", - sb_liubiao_prefix: "谋", - sb_zhurong_prefix: "谋", - sb_menghuo_prefix: "谋", - sp_yangwan: "谋杨婉", - spmingxuan: "瞑昡", - spmingxuan_info: - "锁定技。出牌阶段开始时,你须选择至多X张花色各不相同的手牌(X为未选择过选项一的角色),将这些牌随机交给这些角色中的等量角色。然后这些角色依次选择一项:⒈对你使用一张【杀】。⒉交给你一张牌,然后你摸一张牌。", - spxianchou: "陷仇", - spxianchou_info: - "当你受到有来源的伤害后,你可选择一名不为伤害来源的其他角色。该角色可以弃置一张牌,然后视为对伤害来源使用一张【杀】(无距离限制)。若其因此【杀】造成了伤害,则其摸一张牌,你回复1点体力。", - liucheng: "谋刘赪", - splveying: "掠影", - splveying_info: - "锁定技。①每回合限两次,当你使用【杀】指定目标后,你获得一个“椎”。②当你使用的【杀】结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【过河拆桥】。", - spyingwu: "莺舞", - spyingwu_info: - "若你拥有〖掠影〗,则:①每回合限两次,当你使用非伤害类普通锦囊牌指定目标后,你获得一个“椎”。②当你使用的非伤害类普通锦囊牌结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【杀】。", - sb_huangzhong: "谋黄忠", - sbliegong: "烈弓", - sbliegong_info: - "①若你的装备区内没有武器牌,则你手牌区内所有【杀】的属性视为无属性。②当你使用牌时,或成为其他角色使用牌的目标后,你记录此牌的花色。③当你使用【杀】指定唯一目标后,若你〖烈弓②〗的记录不为空,则你可亮出牌堆顶的X张牌(X为你〖烈弓②〗记录过的花色数-1),令此【杀】的伤害值基数+Y(Y为亮出牌中被〖烈弓②〗记录过花色的牌的数量),且目标角色不能使用〖烈弓②〗记录过花色的牌响应此【杀】。此【杀】使用结算结束后,你清除〖烈弓②〗的记录。", - sb_huaxiong: "谋华雄", - sbyangwei: "扬威", - sbyangwei_info: - "出牌阶段,你可以摸两张牌,令此技能于你的下下个结束阶段前失效,且你获得如下效果直到回合结束:使用【杀】无距离限制,次数上限+1且无视防具。", - sb_yujin: "谋于禁", - sbxiayuan: "狭援", - sbxiayuan_info: - "每轮限一次。其他角色受到伤害后,若其因此伤害触发过护甲效果且其没有护甲,则你可弃置两张手牌,令其获得X点护甲(X为其因此伤害触发护甲效果而失去的护甲数量)。", - sbjieyue: "节钺", - sbjieyue_info: "结束阶段,你可以令一名其他角色获得1点护甲。然后其可以交给你一张牌。", - sb_lvmeng: "谋吕蒙", - sbkeji: "克己", - sbkeji_info: - "①出牌阶段各限一次。你可以选择一项:1.弃置一张手牌,然后获得1点护甲;2.失去1点体力,然后获得2点护甲。②你的手牌上限+X(X为你的护甲数)。③若你不为正在结算濒死流程的角色,你不能使用【桃】。", - sbdujiang: "渡江", - sbdujiang_info: - "觉醒技。准备阶段,若你的护甲数不少于3,你获得〖夺荆〗,修改〖克己①〗为“出牌阶段限一次”。", - sbduojing: "夺荆", - sbduojing_info: - "当你使用【杀】指定目标时,你可以失去1点护甲。然后令此【杀】无视防具,你获得目标角色一张牌,本回合使用【杀】的次数上限+1。", - sb_sunshangxiang: "谋孙尚香", - sbjieyin: "结姻", - sbjieyin_info: - "使命技。①游戏开始时,你令一名其他角色获得1枚“助”。②出牌阶段开始时,有“助”的角色选择一项:1.交给你X张手牌(X=min(2,其手牌数)且至少为1),然后获得1点护甲;2.令你将“助”移动给另一名其他角色,或移去其“助”(若其此前获得过“助”,则只能移去)。③失败:当一名角色死亡后,若其于死亡时有“助”,或当你因〖结姻②〗移去“助”后,你将势力改为吴,回复1点体力,获得所有“妆”并减1点体力上限。", - sbliangzhu: "良助", - sbliangzhu_info: - "蜀势力技。出牌阶段限一次,你可以将一名其他角色装备区里的一张牌置于武将牌上,称为“妆”,然后有“助”的角色须选择回复1点体力或摸两张牌。", - sbxiaoji: "枭姬", - sbxiaoji_info: "吴势力技。当你失去装备区里的一张牌后,你摸两张牌,然后可以弃置场上的一张牌。", - sb_sunquan: "谋孙权", - sbzhiheng: "制衡", - sbzhiheng_info: - "出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你以此法弃置的牌包括你所有手牌,则你多摸X张牌(X为你的“业”数+1),并弃1枚“业”。", - sbtongye: "统业", - sbtongye_info: - "锁定技。结束阶段,你猜测场上装备牌数与你下一个准备阶段的场上装备牌数是否相等,并获得以下效果:你下一个准备阶段,若你猜对且“业”数小于2,你获得1枚“业”;若你猜错,你弃1枚“业”。", - sbjiuyuan: "救援", - sbjiuyuan_info: - "主公技,锁定技。①其他吴势力角色使用【桃】时,你摸一张牌。②其他吴势力角色对你使用的【桃】的回复量+1。", - sb_huanggai: "谋黄盖", - sbkurou: "苦肉", - sbkurou_info: - "①出牌阶段开始时,你可以交给其他角色一张牌,若此牌于对方手牌区内为【桃】或【酒】,你失去2点体力,否则你失去1点体力。②当你失去1点体力后,你获得2点护甲。", - sbzhaxiang: "诈降", - sbzhaxiang_info: - "锁定技。①摸牌阶段,你多摸X张牌。②你每回合使用的前X张牌无距离与次数限制且不能被响应(X为你已损失的体力值)。", - sb_zhouyu: "谋周瑜", - sbyingzi: "英姿", - sbyingzi_info: - "锁定技。摸牌阶段,你多摸X张牌,且令你本回合手牌上限+X(X为以下条件中你满足的项数:手牌数不小于2、体力值不小于2、装备区里的牌数不小于1)。", - sbfanjian: "反间", - sbfanjian_info: - "出牌阶段,你可以声明一个花色并选择一张牌和一名其他角色(每种花色的牌每回合限一次)。其须选择一项:1.猜测此牌花色与你所声明花色是否相同;2.翻面。然后其正面向上获得此牌。若其选择猜测且猜测错误,其失去1点体力,否则其令你〖反间〗于本回合失效。", - sb_caoren: "谋曹仁", - sbjushou: "据守", - sbjushou_info: - "①出牌阶段限一次。若你的武将牌正面朝上,你可以弃置至多两张牌,然后你翻面并获得等量护甲。②当你受到伤害后,若你的武将牌背面朝上,你选择一项:1.翻面;2.获得1点护甲。③当你翻面后,若你的武将牌正面朝上,你摸X张牌(X为你的护甲数)。", - sbjiewei: "解围", - sbjiewei_info: - "出牌阶段限一次。你可以失去1点护甲并选择一名其他角色。你观看其手牌并获得其中一张。", - sb_xiahoushi: "谋夏侯氏", - sbqiaoshi: "樵拾", - sbqiaoshi_info: - "每回合限一次。当你受到其他角色造成的伤害后,其可以令你回复等同于此次伤害值的体力,然后其摸两张牌。", - sbyanyu: "燕语", - sbyanyu_info: - "①出牌阶段限两次。你可以弃置一张【杀】,然后摸一张牌。②出牌阶段结束时,你可以令一名其他角色摸3X张牌(X为你于此阶段发动〖燕语①〗的次数)。", - sb_zhangjiao: "谋张角", - sbleiji: "雷击", - sbleiji_info: "出牌阶段,你可以选择一名其他角色并弃4枚“道兵”,对其造成1点雷电伤害。", - sbguidao: "鬼道", - sbguidao_info: - "①游戏开始时/一名角色受到属性伤害后,你获得4/2枚“道兵”。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。③“道兵”上限为8。", - sbhuangtian: "黄天", - sbhuangtian_info: - "主公技,锁定技。①回合开始时,若本回合为你的第一个回合且游戏轮数为1,且游戏内没有【太平要术】,你装备【太平要术】。②其他群势力角色造成伤害后,若你拥有〖鬼道〗,你获得2枚“道兵”(每轮你至多以此法获得4枚“道兵”)。", - sb_caocao: "谋曹操", - sbjianxiong: "奸雄", - sbjianxiong_info: - "①游戏开始时,你可获得至多2枚“治世”标记。②当你受到伤害后,你可获得伤害牌,摸1-X张牌(X为“治世”数),然后你可弃1枚“治世”。", - sbqingzheng: "清正", - sbqingzheng_info: - "出牌阶段开始时,你可以弃置3-X种花色的所有手牌(X为“治世”数),并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。然后若X小于2且你拥有技能〖奸雄〗,你可以获得1枚“治世”。", - sbhujia: "护驾", - sbhujia_info: "主公技,每轮限一次。当你受到伤害时,你可以将此伤害转移给一名其他魏势力角色。", - sb_zhenji: "谋甄宓", - sbluoshen: "洛神", - sbluoshen_info: - "准备阶段,你可以选择一名角色。从其开始按逆时针方向的X名其他角色依次执行(X为角色数的一半,向上取整):展示一张手牌,若此牌为黑色,你获得之且此牌不计入本回合手牌上限;若此牌为红色,其弃置之。", - sb_ganning: "谋甘宁", - sbqixi: "奇袭", - sbqixi_info: - "出牌阶段限一次。若你有手牌,你可以令一名其他角色猜测你手牌中最多的花色。若其猜对,你展示所有手牌;若其猜错,你可令其从其未选择过的花色中再次猜测,重复此流程。然后你弃置其区域内的X张牌(X为其于本次〖奇袭〗中猜错的次数)。", - sbfenwei: "奋威", - sbfenwei_info: - "限定技。①出牌阶段,你可以将至多三张牌分别置于等量名角色的武将牌上,称为“威”,然后你摸等量牌。②当一名角色成为锦囊牌的目标时,若其有“威”,你须选择:1.令其获得其“威”;2.令其移去“威”,并取消此目标。", - sb_machao: "谋马超", - sbtieji: "铁骑", - sbtieji_info: - "当你使用【杀】指定其他角色为目标后,你可以令目标角色不能响应此【杀】,且其所有非锁定技失效直到回合结束。然后你与其进行谋弈。若你赢,且你选择的选项为:“直取敌营”,则你获得其一张牌;“扰阵疲敌”,你摸两张牌。", - sb_xuhuang: "谋徐晃", - sbduanliang: "断粮", - sbduanliang_info: - "出牌阶段限一次。你可以与一名其他角色进行谋弈。若你赢,且你选择的选项为:“围城断粮”,若其判定区没有【兵粮寸断】,你将牌堆顶牌当【兵粮寸断】对其使用,否则你获得其一张牌;“擂鼓进军”,你视为对其使用一张【决斗】。", - sbshipo: "势迫", - sbshipo_info: - "结束阶段,你可以令一名体力少于你的角色或所有判定区有【兵粮寸断】的其他角色选择一项:1.交给你一张手牌;2.受到1点伤害。所有目标角色选择完成后,你可以将任意张你以此法得到的牌交给一名其他角色。", - sb_zhangfei: "谋张飞", - sbpaoxiao: "咆哮", - sbpaoxiao_info: - "锁定技。①你使用【杀】无次数限制。②若你的装备区内有武器牌,则你使用【杀】无距离限制。③当你于出牌阶段内使用第二张及以后【杀】时,你获得如下效果:{此【杀】不可被响应且伤害值基数+1;此【杀】指定目标后,目标角色的非锁定技于本回合内失效;此【杀】造成伤害后,若目标角色存活,则你失去1点体力并随机弃置一张手牌。}", - sbxieji: "协击", - sbxieji_info: - "准备阶段开始时,你可以和一名其他角色进行协力。其的下个结束阶段开始时,若你与其协力成功,则你可以选择至多三名其他角色。你对这些角色视为使用一张【杀】,且当此【杀】因执行牌面效果造成伤害后,你摸X张牌(X为伤害值)。", - sb_zhaoyun: "谋赵云", - sblongdan: "龙胆", - sblongdan_info: - "蓄力技(1/3)。①你可以消耗1点蓄力值,将【杀】当做【闪】或将【闪】当做【杀】使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。", - sbjizhu: "积著", - sbjizhu_info: - "准备阶段开始时,你可以和一名其他角色进行协力。其的下个结束阶段开始时,若你与其协力成功,则你修改〖龙胆〗直到你的下个结束阶段开始。", - sblongdan_shabi: "龙胆", - sblongdan_shabi_info: - "蓄力技(1/3)。①你可以消耗1点蓄力值,将一张基本牌当做任意基本牌使用或打出,然后摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。", - sb_liubei: "谋刘备", - sbrende: "仁德", - sbrende_info: - "①出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为8)。②每回合限一次。你可以移去2枚“仁望”,视为使用或打出一张基本牌。③出牌阶段开始时,你获得2枚“仁望”。", - sbzhangwu: "章武", - sbzhangwu_info: - "限定技。出牌阶段,你可以令所有于本局游戏成为过〖仁德①〗目标的其他角色依次交给你X张牌,然后你回复3点体力并失去〖仁德〗(X为游戏轮数-1,且至多为3)。", - sbjijiang: "激将", - sbjijiang_info: - "主公技。出牌阶段结束时,你可以选择一名体力值不小于你的其他蜀势力角色A和一名在A攻击范围内的角色B。A选择一项:1.视为对B使用一张【杀】;2.下一个出牌阶段开始前,跳过此阶段。", - sb_jiangwei: "谋姜维", - sbtiaoxin: "挑衅", - sbtiaoxin_info: - "蓄力技(4/4)。①出牌阶段限一次。你可以选择至多X名角色(X为你的蓄力值),令这些角色选择一项:1.对你使用一张【杀】(无距离限制);2.交给你一张牌。然后你消耗等同于你选择的目标数的蓄力值。②当你于弃牌阶段弃置牌后,你获得等量蓄力值。", - sbzhiji: "志继", - sbzhiji_info: - "觉醒技。准备阶段,若你因〖挑衅①〗消耗过至少4点蓄力值,你减1点体力上限,令至少一名角色获得“北伐”标记并获得如下效果直到你的下回合开始:其使用牌只能指定你或其为目标。", - sb_fazheng: "谋法正", - sbxuanhuo: "眩惑", - sbxuanhuo_info: - "①出牌阶段限一次。你可以将一张牌交给一名没有“眩”标记的其他角色,然后令其获得“眩”标记。②当有“眩”的其他角色于摸牌阶段外得到牌后,若你以此法于其本次获得“眩”的期间内得到其的牌数小于5,你随机获得其一张手牌。", - sbenyuan: "恩怨", - sbenyuan_info: - "锁定技。准备阶段,若场上存在有“眩”的角色,你移去该角色的“眩”,且你于其本次获得“眩”的期间内得到其的牌数:不小于3,你交给其三张牌;小于3,其失去1点体力,你回复1点体力。", - sb_chengong: "谋陈宫", - sbmingce: "明策", - sbmingce_info: - "①出牌阶段限一次。你可以将一张牌交给一名其他角色,其选择一项:1.失去1点体力,令你摸两张牌并获得1枚“策”;2.摸一张牌。②出牌阶段开始时,你可以移去所有“策”并对一名其他角色造成等量伤害。", - sbzhichi: "智迟", - sbzhichi_info: "锁定技。当你受到伤害后,防止你本回合受到的伤害。", - sb_yuanshao: "谋袁绍", - sbluanji: "乱击", - sbluanji_info: - "①出牌阶段限一次。你可以将两张手牌当【万箭齐发】使用。②每回合限三次,当其他角色因响应你使用的【万箭齐发】而打出【闪】时,你摸一张牌。", - sbxueyi: "血裔", - sbxueyi_info: - "主公技,锁定技。①你的手牌上限+2X(X为场上其他群势力角色数)。②每回合限两次,当你使用牌指定其他群势力角色为目标后,你摸一张牌。", - sb_diaochan: "谋貂蝉", - sblijian: "离间", - sblijian_info: - "出牌阶段限一次。你可以选择至少两名其他角色并弃置X张牌(X为你选择的角色数-1)。然后每名你选择的角色依次视为对这些角色中与其逆时针座次最近的另一名角色使用一张【决斗】。", - sbbiyue: "闭月", - sbbiyue_info: - "锁定技。结束阶段,你摸Y张牌(Y为本回合包括已死亡角色在内受到过伤害的角色数+1且至多为4)。", - sb_pangtong: "谋庞统", - sblianhuan: "连环", - sblianhuan_info: - "①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。", - sblianhuan_lv2: "连环·改", - sblianhuan_lv2_info: - "①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。", - sbniepan: "涅槃", - sbniepan_info: - "限定技。当你处于濒死状态时,你可以弃置区域里的所有牌,摸两张牌,将体力回复至2点,复原武将牌,然后修改〖连环〗。", - sb_sunce: "谋孙策", - sbjiang: "激昂", - sbjiang_info: - "①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限一次。你可以将所有手牌当【决斗】使用。", - sbhunzi: "魂姿", - sbhunzi_info: - "觉醒技。当你脱离濒死状态后,你减1点体力上限,获得1点护甲,摸三张牌。然后你获得〖英姿〗和〖英魂〗。", - sbzhiba: "制霸", - sbzhiba_info: - "主公技,限定技。当你进入濒死状态时,你可以回复X-1点体力并修改〖激昂③〗为“出牌阶段限X次”(X为场上其他吴势力角色数+1)。然后其他吴势力角色依次受到1点无来源伤害,且当有角色因此死亡后,你摸三张牌。", - sb_daqiao: "谋大乔", - sbguose: "国色", - sbguose_info: - "出牌阶段限两次,你可以将一张♦牌当【乐不思蜀】使用或弃置场上一张【乐不思蜀】,然后你摸一张牌。", - sbguose_info_identity: - "出牌阶段限四次,你可以将一张♦牌当【乐不思蜀】使用或弃置场上一张【乐不思蜀】,然后你摸一张牌。", - sbliuli: "流离", - sbliuli_info: - "当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内的一名不为此【杀】使用者的角色,将此【杀】转移给该角色。若你以此法弃置了♥牌,则你可以令一名不为此【杀】使用者的其他角色获得“流离”标记,且移去场上所有其他的“流离”(每回合限一次)。有“流离”的角色回合开始时,其移去其“流离”并执行一个额外的出牌阶段。", - sb_liubiao: "谋刘表", - sbzishou: "自守", - sbzishou_info: - "锁定技。其他角色的结束阶段,若其与你于本局游戏内均未对对方造成过伤害,其须交给你一张牌。", - sbzongshi: "宗室", - sbzongshi_info: "锁定技。每名角色限一次。当你受到伤害后,你令伤害来源弃置所有手牌。", - sb_zhurong: "谋祝融", - sblieren: "烈刃", - sblieren_info: - "当你使用【杀】指定唯一目标后,你可以摸一张牌,然后与其拼点。若你赢,此【杀】结算结束后,你可以对另一名其他角色造成1点伤害。", - sbjuxiang: "巨象", - sbjuxiang_info: - "锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。③结束阶段,若你未于本回合使用过【南蛮入侵】,你可以将一张游戏外的随机【南蛮入侵】(共2张)交给一名角色。", - sb_menghuo: "谋孟获", - sbhuoshou: "祸首", - sbhuoshou_info: - "锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】指定第一个目标后,你代替其成为此牌的伤害来源。③出牌阶段开始时,你随机获得弃牌堆中的一张【南蛮入侵】。④出牌阶段,若你于此阶段使用过【南蛮入侵】,你不能使用【南蛮入侵】。", - sbzaiqi: "再起", - sbzaiqi_info: - "蓄力技(0/7)。①弃牌阶段结束时,你可以消耗任意点蓄力值并选择等量名角色,然后令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力。②每回合限一次。当你造成伤害后,你获得1点蓄力值。", - sb_zhanghe: "谋张郃", - sbqiaobian: "巧变", - sbqiaobian_info: - "每回合限一次。①你可以失去1点体力并跳过判定阶段,将判定区的所有牌移动给一名其他角色(无法置入其判定区的牌改为弃置之)。②你可以跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力。③你可以将手牌数弃置至六张(若手牌数少于六张则跳过之)并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌。", - sb_yl_luzhi: "谋卢植", - sb_yl_luzhi_prefix: "谋", - sbzhenliang: "贞良", - sbzhenliang_info: - "转换技。阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。", - sb_xiaoqiao: "谋小乔", - sb_xiaoqiao_prefix: "谋", - sbtianxiang: "天香", - sbtianxiang_info_identity: - "①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸等量的牌。", - sbtianxiang_info: - "①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸X张牌(X为移去的“天香”标记数+2)。", - sb_sp_zhugeliang: "谋诸葛亮", - sb_sp_zhugeliang_prefix: "谋", - sbhuoji: "火计", - sbhuoji_info: - "使命技。①使命:出牌阶段限一次。你可以对一名其他角色造成1点火焰伤害,然后你对所有与其势力相同的不为其的其他角色各造成1点火焰伤害。②成功:准备阶段,若你本局游戏已造成的火焰伤害不小于本局游戏总角色数,则你失去〖火计〗和〖看破〗,然后获得〖观星〗和〖空城〗。③失败:使命成功前进入濒死状态。", - sbkanpo: "看破", - sbkanpo_info: - "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录4个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", - sbkanpo_info_doudizhu: - "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录2个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", - sbkanpo_info_versus_two: - "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录2个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", - sbguanxing: "观星", - sbguanxing_info: - "①准备阶段,你将所有“星”置入弃牌堆,将牌堆顶的X张牌置于你的武将牌上,称为“星”(X为7-此前发动〖观星①〗次数的三倍,且X至少为0)。然后你可以将任意张“星”置于牌堆顶。②结束阶段,若你未于本回合的准备阶段将“星”置于过牌堆顶,你可以将任意张“星”置于牌堆顶。③你可以如手牌般使用或打出“星”。", - sbkongcheng: "空城", - sbkongcheng_info: - "锁定技。当你受到伤害时,若你拥有技能〖观星〗,且若你:有“星”,你判定,若结果点数不大于你的“星”数,此伤害-1;没有“星”,此伤害+1。", - sb_huangyueying: "谋黄月英", - sb_huangyueying_prefix: "谋", - sbqicai: "奇才", - sbqicai_backup: "奇才", - sbqicai_info: - "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏,然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", - sbqicai_info_doudizhu: - "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏(每种牌名的装备牌每局游戏限选择一次),然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", - sbjizhi: "集智", - sbjizhi_info: "锁定技,当你使用一张普通锦囊牌时,你摸一张牌,且此牌本回合不计入你的手牌上限。", - sb_guanyu: "谋关羽", - sb_guanyu_prefix: "谋", - sbwusheng: "武圣", - sbwusheng_wusheng_backup: "武圣", - sbwusheng_info: - "你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用三张【杀】后不能对其使用【杀】。", - sbwusheng_info_identity: - "你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸两张牌,对其使用三张【杀】后不能对其使用【杀】。", - sbyijue: "义绝", - sbyijue_info: - "锁定技,每名角色每局游戏限一次,一名其他角色受到你对其造成的大于等于其体力值的伤害时,你防止此伤害,且本回合你使用牌指定其为目标时,此牌对其无效。", - sb_caopi: "谋曹丕", - sb_caopi_prefix: "谋", - sbxingshang: "行殇", - sbxingshang_info: - "①当一名角色受到伤害后(每回合限一次)或死亡时,你获得2个“颂”标记(你至多拥有9个“颂”标记)。②出牌阶段限两次,你可以:1.移去2个“颂”标记,令一名角色复原武将牌;2.移去2个“颂”标记,令一名角色摸X张牌(X为场上阵亡角色数,且X至少为2,至多为5);3.移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限,回复1点体力,随机恢复一个已废除的装备栏;4.移去5个“颂”标记,获得一名阵亡角色武将牌上的所有技能,然后你失去〖行殇〗〖放逐〗〖颂威〗。", - sbfangzhu: "放逐", - sbfangzhu_info: - "出牌阶段限一次,你可以:1.移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束;2.移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束;3.移去2个“颂”标记,令一名其他角色不能响应除其以外的角色使用的牌直到其回合结束;4.移去3个“颂”标记,令一名其他角色将武将牌翻面;5.移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束;6.移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束。", - sbsongwei: "颂威", - sbsongwei_info: - "主公技。①出牌阶段开始时,你获得Y个“颂”标记(Y为场上其他魏势力角色数的两倍)。②每局游戏限一次,出牌阶段,你可以令一名其他魏势力角色失去所有武将牌的技能。", - sb_xunyu: "谋荀彧", - sb_xunyu_prefix: "谋", - sbquhu: "驱虎", - sbquhu_info: - "出牌阶段限一次。你可以选择两名有牌的其他角色,你与这些角色同时将任意张牌扣置于武将牌上。若你以此法扣置的牌唯一最少,则扣置牌最多的其他角色获得你扣置的牌,且这些角色获得各自扣置的牌;否则这两名角色中扣置牌较多的角色对较少的角色造成1点伤害,获得你扣置的牌,然后这些角色将各自扣置的牌置入弃牌堆(若这两名角色扣置的牌数相同,视为与你逆时针最近座次的角色扣置牌较多)。", - sbjieming: "节命", - sbjieming_info: - "当你受到伤害后,你可以令一名角色摸四张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于X,你失去1点体力(X为你已损失的体力值,至少为1)。", - sb_xiahoudun: "谋夏侯惇", - sb_xiahoudun_prefix: "谋", - sbganglie: "刚烈", - sbganglie_info: - "出牌阶段,你可以选择一名本局游戏对你造成过伤害且未以此法选择过的角色,你对其造成2点伤害。", - sbqingjian: "清俭", - sbqingjian_info: - "①当有一张牌不因使用而进入弃牌堆后,若你的“清俭”数小于X,你将此牌置于你的武将牌上,称为“清俭”(X为你的体力值-1,且至少为1)。②出牌阶段结束时,你将所有“清俭”分配给任意角色。", - sb_gaoshun: "谋高顺", - sb_gaoshun_prefix: "谋", - sbxianzhen: "陷阵", - sbxianzhen_info: - "出牌阶段限一次。你可以选择一名其他角色,你于本阶段获得如下效果:⒈你对其使用牌无距离限制;⒉当你使用【杀】指定其为目标后,你可以与其拼点:若你赢,此【杀】无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;若其拼点牌为【杀】,则你获得之;若其拼点牌为其最后的手牌,则此【杀】对其造成伤害时,此伤害+1。", - sbjinjiu: "禁酒", - sbjinjiu_info: - "锁定技。①你的【酒】均视为【杀】。②当你受到酒【杀】的伤害时,你令此伤害减至1。③其他角色不能于你的回合内使用【酒】。④当一名其他角色的拼点牌亮出后,若你为发起者或参与者且此牌为【酒】,则此牌的点数视为A。", - - sb_zhi: "谋攻篇·知", - sb_shi: "谋攻篇·识", - sb_tong: "谋攻篇·同", - sb_yu: "谋攻篇·虞", - sb_neng: "谋攻篇·能", - sb_waitforsort: "等待分包", - }, - }; -}); diff --git a/character/sb/card.js b/character/sb/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/sb/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/sb/character.js b/character/sb/character.js new file mode 100644 index 000000000..f8b46f27a --- /dev/null +++ b/character/sb/character.js @@ -0,0 +1,46 @@ +const characters = { + sb_gaoshun: ["male", "qun", 4, ["sbxianzhen", "sbjinjiu"]], + sb_xiahoudun: ["male", "wei", 4, ["sbganglie", "sbqingjian"]], + sb_xunyu: ["male", "wei", 3, ["sbquhu", "sbjieming"]], + sb_caopi: ["male", "wei", 3, ["sbxingshang", "sbfangzhu", "sbsongwei"], ["zhu"]], + sb_guanyu: ["male", "shu", 4, ["sbwusheng", "sbyijue"]], + sb_huangyueying: ["female", "shu", 3, ["sbjizhi", "sbqicai"]], + sb_sp_zhugeliang: ["male", "shu", 3, ["sbhuoji", "sbkanpo"]], + sb_zhanghe: ["male", "wei", 4, ["sbqiaobian"]], + sb_yujin: ["male", "wei", 4, ["sbxiayuan", "sbjieyue"]], + sb_huaxiong: ["male", "qun", "3/4/1", ["new_reyaowu", "sbyangwei"]], + liucheng: ["female", "qun", 3, ["splveying", "spyingwu"]], + sp_yangwan: ["female", "qun", 3, ["spmingxuan", "spxianchou"]], + sb_huangzhong: ["male", "shu", 4, ["sbliegong"]], + sb_lvmeng: ["male", "wu", 4, ["sbkeji", "sbdujiang"]], + sb_sunshangxiang: ["female", "shu", 4, ["sbjieyin", "sbliangzhu", "sbxiaoji"], ["border:wu"]], + sb_sunquan: ["male", "wu", 4, ["sbzhiheng", "sbtongye", "sbjiuyuan"], ["zhu"]], + sb_huanggai: ["male", "wu", 4, ["sbkurou", "sbzhaxiang"]], + sb_zhouyu: ["male", "wu", 3, ["sbyingzi", "sbfanjian"]], + sb_caoren: ["male", "wei", "4/4/1", ["sbjushou", "sbjiewei"]], + sb_xiahoushi: ["female", "shu", 3, ["sbqiaoshi", "sbyanyu"]], + sb_zhangjiao: ["male", "qun", 3, ["sbleiji", "sbguidao", "sbhuangtian"], ["zhu"]], + sb_caocao: ["male", "wei", 4, ["sbjianxiong", "sbqingzheng", "sbhujia"], ["zhu"]], + sb_zhenji: ["female", "wei", 3, ["sbluoshen", "qingguo"]], + sb_ganning: ["male", "wu", 4, ["sbqixi", "sbfenwei"]], + sb_machao: ["male", "shu", 4, ["mashu", "sbtieji"]], + sb_xuhuang: ["male", "wei", 4, ["sbduanliang", "sbshipo"]], + sb_zhangfei: ["male", "shu", 4, ["sbpaoxiao", "sbxieji"]], + sb_zhaoyun: ["male", "shu", 4, ["sblongdan", "sbjizhu"]], + sb_liubei: ["male", "shu", 4, ["sbrende", "sbzhangwu", "sbjijiang"], ["zhu"]], + sb_jiangwei: ["male", "shu", "4/4/1", ["sbtiaoxin", "sbzhiji"]], + sb_fazheng: ["male", "shu", 3, ["sbxuanhuo", "sbenyuan"]], + sb_chengong: ["male", "qun", 3, ["sbmingce", "sbzhichi"]], + sb_diaochan: ["female", "qun", 3, ["sblijian", "sbbiyue"]], + sb_yuanshao: ["male", "qun", 4, ["sbluanji", "sbxueyi"], ["zhu"]], + sb_pangtong: ["male", "shu", 3, ["sblianhuan", "sbniepan"]], + sb_sunce: ["male", "wu", 4, ["sbjiang", "sbhunzi", "sbzhiba"], ["zhu"]], + sb_daqiao: ["female", "wu", 3, ["sbguose", "sbliuli"]], + sb_liubiao: ["male", "qun", 3, ["sbzishou", "sbzongshi"]], + sb_zhurong: ["female", "shu", 4, ["sblieren", "sbjuxiang"]], + sb_menghuo: ["male", "shu", 4, ["sbhuoshou", "sbzaiqi"]], + sb_yl_luzhi: ["male", "qun", 3, ["nzry_mingren", "sbzhenliang"]], + sb_xiaoqiao: ["female", "wu", 3, ["sbtianxiang", "xinhongyan"]], +}; + +export default characters; diff --git a/character/sb/characterFilter.js b/character/sb/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/sb/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/sb/characterReplace.js b/character/sb/characterReplace.js new file mode 100644 index 000000000..2092d9297 --- /dev/null +++ b/character/sb/characterReplace.js @@ -0,0 +1,3 @@ +const characterReplaces = {}; + +export default characterReplaces; diff --git a/character/sb/dynamicTranslate.js b/character/sb/dynamicTranslate.js new file mode 100644 index 000000000..f9772861b --- /dev/null +++ b/character/sb/dynamicTranslate.js @@ -0,0 +1,35 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + sbkeji(player) { + return "①出牌阶段" + (player.storage.sbkeji ? "" : "各") + "限一次。你可以选择一项:1.弃置一张手牌,然后获得1点护甲;2.失去1点体力,然后获得2点护甲。②你的手牌上限+X(X为你的护甲数)。③若你不为正在结算濒死流程的角色,你不能使用【桃】。"; + }, + sblongdan(player) { + if (player.hasSkill("sblongdan_mark", null, null, false)) return "蓄力技(1/3)。①你可以消耗1点蓄力值,将一张基本牌当做任意基本牌使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。"; + return "蓄力技(1/3)。①你可以消耗1点蓄力值,将【杀】当做【闪】或将【闪】当做【杀】使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。"; + }, + sblianhuan(player) { + var str = "①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。"; + if (!player.storage.sblianhuan) str += "③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。"; + else str += "③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。"; + return str; + }, + sbjiang(player) { + var str = "①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限"; + if (player.countMark("sbjiang")) str += "X次。你可以将所有手牌当【决斗】使用(X为场上其他吴势力角色数+1)。"; + else str += "一次。你可以将所有手牌当【决斗】使用。"; + return str; + }, + sbzhenliang(player) { + var storage = player.storage.sbzhenliang; + var str = "转换技。"; + if (!storage) str += ''; + str += "阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。"; + if (!storage) str += ""; + if (storage) str += ''; + str += "阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。"; + if (storage) str += ""; + return str; + }, +}; +export default dynamicTranslates; diff --git a/character/sb/index.js b/character/sb/index.js new file mode 100644 index 000000000..fc8c58b7d --- /dev/null +++ b/character/sb/index.js @@ -0,0 +1,35 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "sb", + connect: true, + character: { ...characters }, + characterSort: { + sb: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + characterSubstitute: { + sb_sp_zhugeliang: [], + }, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/sb/intro.js b/character/sb/intro.js new file mode 100644 index 000000000..82d64b020 --- /dev/null +++ b/character/sb/intro.js @@ -0,0 +1,3 @@ +const characterIntro = {}; + +export default characterIntro; diff --git a/character/sb/pinyin.js b/character/sb/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/sb/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/sb/skill.js b/character/sb/skill.js new file mode 100644 index 000000000..508e60fa3 --- /dev/null +++ b/character/sb/skill.js @@ -0,0 +1,7303 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //高顺 + sbxianzhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target !== player; + }, + async content(event, trigger, player) { + const target = event.targets[0]; + player.addTempSkill("sbxianzhen_attack", "phaseUseAfter"); + player.markAuto("sbxianzhen_attack", target); + }, + ai: { + expose: 0.2, + order(item, player) { + return get.order({ name: "sha" }) + 1; + }, + result: { + target(player, target) { + if ( + !player.countCards("hs", card => { + return get.name(card) === "sha" && player.canUse(card, target, false); + }) + ) + return -0.1; + if (target.countCards("h") === 1 && player.canCompare(target)) return -2; + return -1.5; + }, + }, + }, + subSkill: { + attack: { + audio: "sbxianzhen", + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (event.card.name !== "sha") return false; + return player.getStorage("sbxianzhen_attack").includes(event.target) && event.target.isIn() && player.canCompare(event.target); + }, + charlotte: true, + onremove: true, + logTarget: "target", + check(event, player) { + return get.attitude(player, event.target) < 0; + }, + prompt(event, player) { + return `陷阵:是否与${get.translation(event.target)}拼点?`; + }, + prompt2(event, player) { + const target = event.target, + card = event.card; + return `若你赢,${get.translation(card)}无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;
    若其拼点牌为【杀】,则你获得之;
    若其拼点牌为其最后的手牌,则${get.translation(card)}对其造成伤害时,此伤害+1。`; + }, + group: "sbxianzhen_record", + async content(event, trigger, player) { + const target = trigger.target, + card = trigger.card; + const next = player.chooseToCompare(target); + let result = await next.forResult(); + if (result.bool) { + target.addTempSkill("qinggang2"); + target.storage.qinggang2.add(card); + if (trigger.addCount !== false) { + trigger.addCount = false; + const stat = player.getStat("card"); + if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; + } + game.log(card, "无视防具且不计入次数限制"); + if (!player.storage.sbxianzhen_damaged) { + player.storage.sbxianzhen_damaged = true; + player.when("phaseAfter").then(() => { + delete player.storage.sbxianzhen_damaged; + }); + await target.damage(); + await game.asyncDelayx(); + } + } + const toGain = []; + for (const lose_list of next.lose_list) { + let [comparer, cards] = lose_list; + if (!Array.isArray(cards)) cards = [cards]; + if (comparer === player) continue; + for (const card of cards) { + if (get.name(card, comparer) == "sha" && get.position(card, true) == "d") { + toGain.push(card); + } + } + } + if (toGain.length) await player.gain(toGain, "gain2"); + if (player.getStorage("sbxianzhen_recorded").includes(target)) { + const id = target.playerid; + const map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") { + map[id].extraDamage = 0; + } + map[id].extraDamage++; + game.log(card, "对", target, "造成的伤害+1"); + } + }, + intro: { + content: "本阶段对$使用牌无距离限制,且使用杀指定其为目标后可以与其拼点", + }, + mod: { + targetInRange(card, player, target) { + if (player.getStorage("sbxianzhen_attack").includes(target)) return true; + }, + }, + }, + record: { + trigger: { + global: "loseAsyncEnd", + }, + charlotte: true, + silent: true, + filter(event, player) { + if (event.getParent(2).name !== "sbxianzhen_attack") return false; + return game.hasPlayer(current => { + if (current.countCards("h")) return false; + const evt = event.getl(current); + return evt && evt.hs && evt.hs.length; + }); + }, + async content(event, trigger, player) { + const targets = []; + game.countPlayer(current => { + if (current.countCards("h")) return false; + const evt = trigger.getl(current); + if (evt && evt.hs && evt.hs.length) targets.add(current); + }); + if (!player.storage.sbxianzhen_recorded) { + player.when("sbxianzhen_attackAfter").then(() => { + delete player.storage.sbxianzhen_recorded; + }); + } + player.markAuto("sbxianzhen_recorded", targets); + }, + }, + }, + }, + sbjinjiu: { + audio: 2, + inherit: "rejinjiu", + group: ["sbjinjiu_decrease", "sbjinjiu_compare"], + global: "sbjinjiu_global", + subSkill: { + decrease: { + audio: "sbjinjiu", + forced: true, + trigger: { player: "damageBegin4" }, + filter(event, player) { + return event.getParent(2).jiu; + }, + async content(event, trigger) { + trigger.num = 1; + }, + ai: { + filterDamage: true, + skillTagFilter(player, tag, arg) { + return arg && arg.jiu; + }, + }, + }, + global: { + mod: { + cardEnabled(card, player) { + if (card.name == "jiu" && _status.currentPhase && _status.currentPhase != player && _status.currentPhase.hasSkill("sbjinjiu")) return false; + }, + cardSavable(card, player) { + if (card.name == "jiu" && _status.currentPhase && _status.currentPhase != player && _status.currentPhase.hasSkill("sbjinjiu")) return false; + }, + }, + }, + compare: { + trigger: { + global: "compare", + }, + filter(event, player) { + const participant = [event.player]; + if (event.targets) participant.addArray(event.targets); + else participant.add(event.target); + if (!participant.includes(player)) return false; + if (event.player !== player && event.card1 && event.card1.name === "jiu") return true; + if (event.target !== player && event.card2 && event.card2.name === "jiu") return true; + return false; + }, + forced: true, + direct: true, + async content(event, trigger, player) { + for (const [role, ind] of [ + ["player", 1], + ["target", 2], + ]) { + const current = trigger[role], + card = trigger[`card${ind}`]; + if (current !== player && card && card.name === "jiu") { + await player.logSkill("sbjinjiu_compare", current); + game.log(current, "拼点牌点数视为", "#yA"); + trigger[`num${ind}`] = 1; + } + } + }, + }, + }, + }, + //夏侯惇 + sbganglie: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + if (!event.sbganglie_enabledTargets) return false; + return game.hasPlayer(current => { + return lib.skill.sbganglie.filterTarget(null, player, current); + }); + }, + onChooseToUse(event) { + if (game.online || event.type !== "phase") return; + const player = event.player; + const chosen = player + .getAllHistory("useSkill", evt => evt.skill === "sbganglie") + .map(evt => { + return evt.targets; + }) + .flat(); + const targets = player + .getAllHistory("damage", evt => evt.source && evt.source.isIn()) + .map(evt => evt.source) + .unique(); + targets.removeArray(chosen); + event.set("sbganglie_enabledTargets", targets); + }, + filterTarget(card, player, target) { + return get.event("sbganglie_enabledTargets").includes(target); + }, + async content(event, trigger, player) { + event.targets[0].damage(2); + }, + ai: { + order: 6, + result: { + target: -2, + }, + }, + }, + sbqingjian: { + audio: 2, + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + forced: true, + locked: false, + filter(event, player) { + if (player.getExpansions("sbqingjian").length >= Math.max(1, player.getHp() - 1)) return false; + if (event.name !== "cardsDiscard") { + if (event.position !== ui.discardPile) return false; + if ( + !game.hasPlayer(current => { + const evt = event.getl(current); + return evt.cards && evt.cards.length > 0; + }) + ) + return false; + } else { + const evt = event.getParent(); + if (evt.relatedEvent && evt.relatedEvent.name === "useCard") return false; + } + return true; + }, + group: "sbqingjian_give", + async content(event, trigger, player) { + let cards = trigger.cards.slice(); + const maxNum = Math.max(1, player.getHp() - 1); + const myLen = player.getExpansions("sbqingjian").length, + cardsLen = trigger.cards.length; + const overflow = myLen + cardsLen - maxNum; + if (overflow > 0) cards.randomRemove(overflow); + const next = player.addToExpansion(cards, "gain2"); + next.gaintag.add("sbqingjian"); + await next; + }, + marktext: "俭", + intro: { + content: "expansion", + markcount: "expansion", + }, + subSkill: { + give: { + audio: "sbqingjian", + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + return player.getExpansions("sbqingjian").length > 0; + }, + forced: true, + locked: false, + async content(event, trigger, player) { + if (_status.connectMode) + game.broadcastAll(() => { + _status.noclearcountdown = true; + }); + const given_map = {}; + event.given_map = given_map; + const expansions = player.getExpansions("sbqingjian"); + let result; + while (true) { + if (expansions.length > 1) { + result = await player + .chooseCardButton("清俭:请选择要分配的牌", true, expansions, [1, expansions.length]) + .set("ai", button => { + if (ui.selected.buttons.length) return 0; + return get.value(button.link, get.player()); + }) + .forResult(); + } else if (expansions.length === 1) result = { bool: true, links: expansions.slice(0) }; + else return; + if (!result.bool) return; + const toGive = result.links; + result = await player + .chooseTarget(`选择一名角色获得${get.translation(toGive)}`, expansions.length === 1) + .set("ai", target => { + const att = get.attitude(get.player(), target); + if (get.event("toEnemy")) return Math.max(0.01, 100 - att); + else if (att > 0) return Math.max(0.1, att / Math.sqrt(1 + target.countCards("h") + (get.event().getParent().given_map[target.playerid] || 0))); + else return Math.max(0.01, (100 + att) / 200); + }) + .set("toEnemy", get.value(toGive[0], player, "raw") < 0) + .forResult(); + if (result.bool) { + expansions.removeArray(toGive); + if (result.targets.length) { + const id = result.targets[0].playerid; + if (!given_map[id]) given_map[id] = []; + given_map[id].addArray(toGive); + } + if (!expansions.length) break; + } + } + if (_status.connectMode) + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + const gain_list = []; + for (const i in given_map) { + const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + gain_list.push([source, given_map[i]]); + game.log(source, "获得了", given_map[i]); + } + await game + .loseAsync({ + gain_list, + giver: player, + animate: "gain2", + }) + .setContent("gaincardMultiple"); + }, + }, + }, + }, + //荀彧 + sbquhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.countPlayer(current => lib.skill.sbquhu.filterTarget(null, player, current)) > 1; + }, + filterTarget(card, player, target) { + return player != target && target.countCards("he") > 0; + }, + selectTarget: 2, + multitarget: true, + multiline: true, + async content(event, trigger, player) { + const targets = [player].addArray(event.targets); + targets.sortBySeat(); + const { result } = await player.chooseCardOL(targets, "he", [1, Infinity], true, "驱虎:请将任意张牌扣置于武将牌上").set("ai", card => { + const player = get.event().getParent(2).player; + let value = 5; + if (get.player() == player) value -= 0.5; + return value - get.useful(card); + }); + const lose_list = []; + const map = new Map(); + let myCards; + let minLength = Infinity; + for (let i = 0; i < result.length; i++) { + const current = targets[i], + cards = result[i].cards; + if (current == player) myCards = cards; + else if (cards.length < minLength) minLength = cards.length; + lose_list.push([current, cards]); + map.set(current.playerid, cards); + } + await game + .loseAsync({ + lose_list, + log: true, + animate: "giveAuto", + gaintag: ["sbquhu"], + }) + .setContent(lib.skill.sbquhu.addToExpansionMultiple); + await game.asyncDelay(1.5); + const isMin = minLength > myCards.length; + const sortedList = lose_list + .filter(list => list[0] != player) + .sort((a, b) => { + return 1000 * (b[1].length - a[1].length) + (get.distance(player, a[0], "absolute") - get.distance(player, b[0], "absolute")); + }); + const mostPlayer = sortedList[0][0], + secondPlayer = sortedList[1][0]; + await new Promise(resolve => { + game.broadcastAll(lose_list => { + lose_list.forEach(list => list[0].prompt(`${get.cnNumber(list[1].length)}张`, "wood")); + }, lose_list); + setTimeout( + () => { + game.broadcastAll(lose_list => { + lose_list.forEach(list => list[0].unprompt()); + }, lose_list); + resolve(); + }, + 2000 / (lib.config.speed == "vvfast" ? 3 : 1) + ); + }); + if (isMin) { + await mostPlayer.gain(myCards, "give", player); + await game.asyncDelay(); + const gain_list = lose_list.filter(list => list[0] != player); + game.loseAsync({ + gain_list, + animate: "draw", + }).setContent("gaincardMultiple"); + } else { + mostPlayer.line(secondPlayer, "thunder"); + await secondPlayer.damage(mostPlayer); + await game.asyncDelay(); + await mostPlayer.gain(myCards, "give", player); + await game.asyncDelay(); + await game + .loseAsync({ + lose_list: sortedList, + }) + .setContent(() => { + for (var i = 0; i < event.lose_list.length; i++) { + var current = event.lose_list[i][0], + cards = event.lose_list[i][1]; + var next = current.lose(cards, ui.discardPile); + current.$throw(cards); + game.log(current, "将", cards, "置入了弃牌堆"); + next.set("relatedEvent", event.getParent()); + next.set("getlx", false); + } + }); + await game.asyncDelayx(); + } + }, + addToExpansionMultiple() { + "step 0"; + if (event.animate == "give") event.visible = true; + event.type = "addToExpansion"; + if (!event.gaintag) event.gaintag = []; + if (event.lose_list) { + var map = {}, + map2 = {}; + for (var list of event.lose_list) { + var player = list[0], + cards = list[1]; + var myId = player.playerid; + if (!map2[myId]) map2[myId] = []; + for (var i of cards) { + var owner = get.owner(i, "judge"); + if (owner && (owner != player || get.position(i) != "x")) { + var id = owner.playerid; + if (!map[id]) map[id] = [[], [], []]; + map[id][0].push(i); + map2[myId].push(i); + var position = get.position(i); + if (position == "h") map[id][1].push(i); + else map[id][2].push(i); + } else if (!event.updatePile && get.position(i) == "c") event.updatePile = true; + } + } + event.losing_map = map; + event.gaining_map = map2; + for (var i in map) { + var owner = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + var next = owner.lose(map[i][0], ui.special).set("forceDie", true).set("getlx", false); + next.set("relatedEvent", event.getParent()); + next.set("forceDie", true); + next.set("getlx", false); + if (event.visible == true) next.set("visible", true); + } + } else { + event.finish(); + } + "step 1"; + if (event.lose_list) { + var map = {}; + for (var list of event.lose_list) { + var player = list[0], + cards = list[1]; + for (var i = 0; i < cards.length; i++) { + if (cards[i].willBeDestroyed("expansion", player, event)) { + cards[i].selfDestroy(event); + cards.splice(i--, 1); + } else if (event.losing_map) { + for (var id in event.losing_map) { + if (event.losing_map[id][0].includes(cards[i])) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[id]; + var hs = source.getCards("hejsx"); + if (hs.includes(cards[i])) { + cards.splice(i--, 1); + } + } + } + } + } + } + } + if (cards.length == 0) { + event.finish(); + return; + } + "step 2"; + var loopedCount = 0, + mapLength = Object.keys(event.gaining_map).length; + for (var j in event.gaining_map) { + loopedCount++; + var map = {}; + var player = (_status.connectMode ? lib.playerOL : game.playerMap)[j], + cards = event.gaining_map[j]; + var hs = player.getCards("x"); + for (var i = 0; i < cards.length; i++) { + if (hs.includes(cards[i])) { + cards.splice(i--, 1); + } + } + for (var num = 0; num < cards.length; num++) { + if (_status.discarded) { + _status.discarded.remove(cards[num]); + } + for (var num2 = 0; num2 < cards[num].vanishtag.length; num2++) { + if (cards[num].vanishtag[num2][0] != "_") { + cards[num].vanishtag.splice(num2--, 1); + } + } + } + if (event.animate == "draw") { + player.$draw(cards.length); + if (event.log) game.log(player, "将", get.cnNumber(cards.length), "张牌置于了武将牌上"); + game.pause(); + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(500, 500), + player, + cards, + loopedCount === mapLength + ); + } else if (event.animate == "gain") { + player.$gain(cards, false); + game.pause(); + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(700, 700), + player, + cards, + loopedCount === mapLength + ); + } else if (event.animate == "gain2" || event.animate == "draw2") { + var gain2t = 300; + if (player.$gain2(cards) && player == game.me) { + gain2t = 500; + } + game.pause(); + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(gain2t, gain2t), + player, + cards, + loopedCount === mapLength + ); + } else if (event.animate == "give" || event.animate == "giveAuto") { + var evtmap = event.losing_map; + var entries = Object.entries(evtmap).map(entry => [entry[0], entry[1][0]]); + var getOwner = card => { + var entry = entries.find(entry => entry[1].includes(card)); + if (entry) return (_status.connectMode ? lib.playerOL : game.playerMap)[entry[0]]; + return null; + }; + var gainmap = {}; + for (var cardx of cards) { + var owner = getOwner(cardx); + if (owner) { + var id = owner.playerid; + if (!gainmap[id]) gainmap[id] = []; + gainmap[id].push(cardx); + } + } + if (event.animate == "give") { + for (var i in gainmap) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + source.$give(evtmap[i][0], player, false); + if (event.log) game.log(player, "将", evtmap[i][0], "置于了武将牌上"); + } + } else { + for (var i in gainmap) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + if (evtmap[i][1].length) { + source.$giveAuto(evtmap[i][1], player, false); + if (event.log) game.log(player, "将", get.cnNumber(evtmap[i][1].length), "张牌置于了武将牌上"); + } + if (evtmap[i][2].length) { + source.$give(evtmap[i][2], player, false); + if (event.log) game.log(player, "将", evtmap[i][2], "置于了武将牌上"); + } + } + } + game.pause(); + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(500, 500), + player, + cards, + loopedCount === mapLength + ); + } else if (typeof event.animate == "function") { + var time = event.animate(event); + game.pause(); + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(time, time), + player, + cards, + loopedCount === mapLength + ); + } else { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + event.finish(); + } + } + "step 3"; + game.delayx(); + if (event.updatePile) game.updateRoundNumber(); + }, + intro: { + markcount: "expansion", + mark(dialog, storage, player) { + const cards = player.getExpansions("sbquhu"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + }, + ai: { + order: 3.5, + result: { + target(player, target) { + let sgn = 1, + preAtt = 0; + if (ui.selected.targets.length) { + const selected = ui.selected.targets[0]; + preAtt = get.attitude(player, selected); + if (preAtt > 0) sgn = -1; + } + let eff = + 0.4 * + target.countCards("h", card => { + return 5 - get.useful(card); + }) - + 1; + if ((get.attitude(player, target) > 0 && sgn < 0) || (get.attitude(player, target) < 0 && preAtt < 0)) eff = -Math.abs(eff); + return eff; + }, + }, + }, + }, + sbjieming: { + audio: 2, + trigger: { + player: "damageEnd", + }, + direct: true, + async content(event, trigger, player) { + let num = Math.max(1, player.getDamagedHp()); + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt("sbjieming"), `令一名角色摸四张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于${get.cnNumber(num)}张,你失去1点体力。`) + .set("ai", target => { + if (get.event("nope")) return 0; + const player = get.player(), + att = get.attitude(player, target); + if (att > 2) { + const num = Math.sqrt( + Math.min( + 5, + Math.max( + 1, + target.countCards("he", card => get.value(card) < 5.5) + ) + ) + ); + return num * att; + } + return att / 3; + }) + .set("nope", player.getHp() + player.countCards("hs", card => player.canSaveCard(card, player)) <= 1 && num > 2); + if (!bool) return; + const target = targets[0]; + player.logSkill("sbjieming", target); + await target.draw(4); + num = Math.max(1, player.getDamagedHp()); + const { + result: { bool: bool2, cards }, + } = await target + .chooseToDiscard("节命:是否弃置任意张牌?", `若你本次弃置的牌数不大于${get.cnNumber(num)}张,${get.translation(player)}失去1点体力。`, [1, Infinity], "he") + .set("ai", card => { + if (get.event("nope")) return 0; + if (ui.selected.cards.length > get.event("num")) return 0; + return 6 - get.value(card); + }) + .set("nope", get.attitude(target, player) * get.effect(player, { name: "losehp" }, player, target) >= 0) + .set("num", num); + if (!bool2 || cards.length <= num) player.loseHp(); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + let max = 0; + const num = Math.max(1, player.getDamagedHp()); + if (num > 2) return [1, -2]; + const players = game.filterPlayer(); + for (const current of players) { + if (get.attitude(target, current) > 0) { + max = Math.max(current.countCards("he"), max); + } + } + return [1, Math.max(1, 1 + Math.min(2, max / 3))]; + } + if ((card.name == "tao" || card.name == "caoyao") && target.hp > 1 && target.countCards("h") <= target.hp) return [0, 0]; + }, + }, + }, + }, + //曹丕 + sbxingshang: { + audio: 2, + trigger: { global: ["die", "damageEnd"] }, + filter(event, player) { + if (player.countMark("sbxingshang") >= get.info("sbxingshang").getLimit) return false; + return event.name == "die" || !player.getHistory("custom", evt => evt.sbxingshang).length; + }, + forced: true, + locked: false, + async content(event, trigger, player) { + player.addMark("sbxingshang", Math.min(2, get.info("sbxingshang").getLimit - player.countMark("sbxingshang"))); + if (trigger.name == "damage") player.getHistory("custom").push({ sbxingshang: true }); + }, + marktext: "颂", + intro: { + name: "颂", + content: "mark", + }, + ai: { threaten: 2.5 }, + getLimit: 9, + getNum(num) { + const list = [2, 2, 5, 5, 1, 2, 2, 3, 3, 2]; + if ( + typeof num != "number" || + !Array.from({ length: list.length }) + .map((_, i) => i + 1) + .includes(num) + ) + return 0; + return list[num - 1]; + }, + getEffect(player, num) { + if (!player || typeof num != "number") return 0; + switch (num) { + //行殇选项 + case 1: //-2,重置武将牌 + if ( + game.hasPlayer(target => { + return get.attitude(player, target) > 0 && target.isTurnedOver(); + }) + ) + return 10; + return 0; + case 2: //-2,摸min(5,max(2,阵亡角色数))的牌 + return Math.min(5, Math.max(2, game.dead.length)); + case 3: //-5,加上限加血+复原装备栏 + if ( + !game.hasPlayer(target => { + return get.attitude(player, target) > 0 && target.maxHp < 10; + }) + ) + return 0; + return ( + 5 + + (game.hasPlayer(target => { + return get.attitude(player, target) > 0 && target.hasDisabledSlot(); + }) + ? 1 + : 0) + ); + case 4: //-5,劝封/化萍 + return 0; + //放逐选项 + case 5: //-1,封印基本牌外的手牌 + if ( + game.hasPlayer(target => { + return get.attitude(player, target) < 0; + }) + ) + return 1; + return 0; + case 6: //-2,白板到结束 + if ( + game.hasPlayer(target => { + if (target.hasSkill("sbfangzhu_ban") || target.hasSkill("fengyin") || target.hasSkill("baiban")) return false; + return ( + get.attitude(player, target) < 0 && + ["name", "name1", "name2"].reduce((sum, name) => { + if (target[name] && (name != "name1" || target.name != target.name1)) { + if (get.character(target[name])) sum + get.rank(target[name], true); + } + return sum; + }, 0) > 5 + ); + }) + ) + return 6; + return 0; + case 7: //-2,强命到结束 + return 0; + case 8: //-3,翻面 + if ( + game.hasPlayer(target => { + return get.attitude(player, target) < 0 && !target.isTurnedOver(); + }) + ) + return 8; + return 0; + case 9: //-3,封印装备牌外的手牌 + if ( + game.hasPlayer(target => { + return get.attitude(player, target) < 0; + }) + ) + return 2.5; + return 0; + case 10: //-2,封印锦囊牌外的手牌 + if ( + game.hasPlayer(target => { + return get.attitude(player, target) < 0; + }) + ) + return 1.5; + return 0; + default: //其他 + return 0; + } + }, + group: "sbxingshang_use", + subSkill: { + use: { + audio: "sbxingshang", + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(target => { + if (player.countMark("sbxingshang") > 1) return true; + return player.countMark("sbxingshang") && (target.isLinked() || target.isTurnedOver()); + }); + }, + usable: 2, + chooseButton: { + dialog() { + var dialog = ui.create.dialog("行殇:请选择你要执行的一项", "hidden"); + dialog.add([ + [ + [1, "移去2个“颂”标记,复原一名角色的武将牌"], + [2, "移去2个“颂”标记,令一名角色摸" + get.cnNumber(Math.min(5, Math.max(2, game.dead.length))) + "张牌"], + [3, "移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏"], + [4, "移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去〖行殇〗〖放逐〗〖颂威〗"], + ], + "textbutton", + ]); + return dialog; + }, + filter(button, player) { + if (player.countMark("sbxingshang") < get.info("sbxingshang").getNum(button.link)) return false; + switch (button.link) { + case 1: + return game.hasPlayer(target => target.isLinked() || target.isTurnedOver()); + case 2: + return true; + case 3: + return game.hasPlayer(target => target.maxHp < 10); + case 4: + return game.dead.length; + } + }, + check(button) { + const player = get.event("player"), + info = get.info("sbxingshang"); + let list = Array.from({ length: 4 }).map((_, i) => i + 1); + list = list.filter(num => player.countMark("sbxingshang") >= info.getNum(num)); + const num = list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a))[0]; + return button.link == num ? 10 : 0; + }, + backup(links, player) { + return { + num: links[0], + audio: "sbxingshang", + filterCard: () => false, + selectCard: -1, + filterTarget(card, player, target) { + switch (lib.skill.sbxingshang_use_backup.num) { + case 1: + return target => target.isLinked() || target.isTurnedOver(); + case 2: + return true; + case 3: + return target.maxHp < 10; + case 4: + return target == player; + } + }, + selectTarget: () => (lib.skill.sbxingshang_use_backup.num == 4 ? -1 : 1), + async content(event, trigger, player) { + const target = event.targets[0]; + const num = lib.skill.sbxingshang_use_backup.num; + player.removeMark("sbxingshang", get.info("sbxingshang").getNum(num)); + switch (num) { + case 1: { + if (target.isLinked()) target.link(false); + if (target.isTurnedOver()) target.turnOver(); + break; + } + case 2: { + target.draw(Math.min(5, Math.max(2, game.dead.length))); + break; + } + case 3: { + target.gainMaxHp(); + target.recover(); + let list = []; + for (let i = 1; i <= 5; i++) { + if (target.hasDisabledSlot(i)) list.push("equip" + i); + } + if (list.length) target.enableEquip(list.randomGet()); + break; + } + case 4: { + let map = {}; + game.dead.forEach(target => (map[target.playerid] = get.translation(target))); + const { + result: { control }, + } = await player + .chooseControl(Object.values(map)) + .set("ai", () => { + const getNum = target => { + let num = 0; + if (target.name && lib.character[target.name]) num += get.rank(target.name, true); + if (target.name2 && lib.character[target.name2]) num += get.rank(target.name2, true); + return num; + }; + let controls = _status.event.controls.slice(); + controls = controls.map(name => [name, game.dead.find(target => _status.event.map[target.playerid] == name)]); + controls.sort((a, b) => getNum(b[1]) - getNum(a[1])); + return controls[0][0]; + }) + .set("prompt", "获得一名已阵亡角色的所有技能") + .set("map", map); + if (control) { + const target2 = game.dead.find(targetx => map[targetx.playerid] == control); + player.line(target2); + game.log(player, "选择了", target2); + const skills = target2.getStockSkills(true, true); + const skills2 = ["sbxingshang", "sbfangzhu", "sbsongwei"]; + player.changeSkills(skills, skills2); + } + } + } + }, + ai: { + result: { + target(player, target) { + switch (lib.skill.sbxingshang_use_backup.num) { + case 1: { + let num = 0; + if (target.isLinked() && !target.hasSkill("nzry_jieying")) num += 0.5; + if (target.isTurnedOver()) num += 10; + return num; + } + case 2: { + return get.effect(target, { name: "draw" }, player, player); + } + case 3: { + return Math.max(0, get.recoverEffect(target, player, player)) + get.attitude(player, target); + } + case 4: { + return 1; + } + } + }, + }, + }, + }; + }, + prompt(links, player) { + const str = "###行殇###"; + switch (links[0]) { + case 1: + return str + "移去2个“颂”标记,复原一名角色的武将牌"; + case 2: + return str + "移去2个“颂”标记,令一名角色摸" + get.cnNumber(Math.min(5, Math.max(2, game.dead.length))) + "张牌"; + case 3: + return str + "移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏"; + case 4: + return str + "移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去武将牌上的所有技能"; + } + }, + }, + ai: { + order(_, player) { + const info = get.info("sbxingshang"); + const goon = player.hasSkill("sbfangzhu") && (player.getStat("skill").sbfangzhu || 0) < (get.info("sbfangzhu").usable || Infinity); + let list = Array.from({ length: goon ? 10 : 4 }).map((_, i) => i + 1); + list = list.filter(num => player.countMark("sbxingshang") >= info.getNum(num)); + list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a)); + return Array.from({ length: 4 }) + .map((_, i) => i + 1) + .includes(list[0]) && info.getEffect(player, list[0]) > 0 + ? 1 + : 0; + }, + result: { player: 1 }, + }, + }, + use_backup: {}, + }, + }, + sbfangzhu: { + audio: 2, + audioname: ["mb_caomao"], + enable: "phaseUse", + filter(event, player) { + return player.hasMark("sbxingshang"); + }, + usable: 1, + chooseButton: { + dialog() { + var dialog = ui.create.dialog("放逐:请选择你要执行的一项", "hidden"); + dialog.add([ + [ + [1, "移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束"], + [2, "移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束"], + [3, "移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束"], + [4, "移去3个“颂”标记,令一名其他角色将武将牌翻面"], + [5, "移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束"], + [6, "移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束"], + ], + "textbutton", + ]); + return dialog; + }, + filter(button, player) { + if (player.countMark("sbxingshang") < get.info("sbxingshang").getNum(button.link + 4)) return false; + return game.hasPlayer(target => { + if (target == player) return false; + const num = button.link, + storage = target.getStorage("sbfangzhu_ban"); + return !((num == 1 && storage.includes("basic")) || (num == 5 && storage.includes("equip")) || (num == 6 && storage.includes("trick"))); + }); + }, + check(button) { + const player = get.event("player"), + info = get.info("sbxingshang"); + let list = Array.from({ length: 6 }).map((_, i) => i + 1); + list = list.filter(num => player.countMark("sbxingshang") >= info.getNum(num + 4)); + const num = list.sort((a, b) => info.getEffect(player, b + 4) - info.getEffect(player, a + 4))[0] - 4; + return button.link == num ? 10 : 0; + }, + backup(links, player) { + return { + num: links[0], + audio: "sbfangzhu", + audioname: ["mb_caomao"], + filterCard: () => false, + selectCard: -1, + filterTarget(card, player, target) { + if (target == player) return false; + const num = lib.skill.sbfangzhu_backup.num, + storage = target.getStorage("sbfangzhu_ban"); + return !((num == 1 && storage.includes("basic")) || (num == 5 && storage.includes("equip")) || (num == 6 && storage.includes("trick"))); + }, + async content(event, trigger, player) { + const target = event.target; + const num = lib.skill.sbfangzhu_backup.num; + player.removeMark("sbxingshang", get.info("sbxingshang").getNum(num + 4)); + switch (num) { + case 1: + case 5: + case 6: { + const type = ["basic", "equip", "trick"][[1, 5, 6].indexOf(num)]; + target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); + target.markAuto("sbfangzhu_ban", [type]); + break; + } + case 2: { + target.addTempSkill("baiban", { player: "phaseEnd" }); + break; + } + case 3: { + target.addTempSkill("sbfangzhu_kill", { player: "phaseEnd" }); + break; + } + case 4: { + target.turnOver(); + break; + } + } + }, + ai: { + result: { + target(player, target) { + switch (lib.skill.sbfangzhu_backup.num) { + case 1: + return -target.countCards("h", card => get.type(card) != "basic") - 1; + case 2: + return -target.getSkills(null, null, false).reduce((sum, skill) => { + return sum + Math.max(get.skillRank(skill, "out"), get.skillRank(skill, "in")); + }, 0); + case 3: + return 0; + case 4: + if (get.attitude(player, target) > 0 && target.isTurnedOver()) return 10 * target.countCards("hs") + 1; + if (get.attitude(player, target) < 0 && !target.isTurnedOver()) return -5 * target.countCards("hs") + 1; + return 0; + case 5: + return -target.countCards("h", card => get.type(card) != "equip") - 3; + case 6: + return -target.countCards("h", card => get.type2(card) != "trick") - 2; + } + }, + }, + }, + }; + }, + prompt(links, player) { + const str = "###放逐###"; + switch (links[0]) { + case 1: + return str + "移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束"; + case 2: + return str + "移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束"; + case 3: + return str + "移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束"; + case 4: + return str + "移去3个“颂”标记,令一名其他角色将武将牌翻面"; + case 5: + return str + "移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束"; + case 6: + return str + "移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束"; + } + }, + }, + ai: { + order(_, player) { + const info = get.info("sbxingshang"); + const goon = player.hasSkill("sbxingshang") && (player.getStat("skill").sbxingshang_use || 0) < (info.subSkill.use.usable || Infinity); + let list = Array.from({ length: goon ? 10 : 6 }).map((_, i) => i + (goon ? 1 : 5)); + list = list.filter(num => player.countMark("sbxingshang") >= info.getNum(num)); + list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a)); + return Array.from({ length: 6 }) + .map((_, i) => i + 5) + .includes(list[0]) && info.getEffect(player, list[0]) > 0 + ? 1 + : 0; + }, + result: { player: 1 }, + combo: "sbxingshang", + }, + subSkill: { + backup: {}, + kill: { + charlotte: true, + mark: true, + marktext: "禁", + intro: { content: "不能响应其他角色使用的牌" }, + trigger: { global: "useCard1" }, + filter(event, player) { + return event.player != player; + }, + forced: true, + popup: false, + async content(event, trigger, player) { + trigger.directHit.add(player); + }, + }, + ban: { + charlotte: true, + onremove: true, + mark: true, + marktext: "禁", + intro: { + markcount: () => 0, + content(storage) { + if (storage.length > 1) return "不能使用手牌"; + return "于手牌中只能使用" + get.translation(storage[0]) + "牌"; + }, + }, + mod: { + cardEnabled(card, player) { + const storage = player.getStorage("sbfangzhu_ban"); + if (get.itemtype(card) == "card" && get.position(card) != "h") return; + if (storage.length > 1 || !storage.includes(get.type2(card))) return false; + }, + cardSavable(card, player) { + const storage = player.getStorage("sbfangzhu_ban"); + if (get.itemtype(card) == "card" && get.position(card) != "h") return; + if (storage.length > 1 || !storage.includes(get.type2(card))) return false; + }, + }, + }, + }, + }, + sbsongwei: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + if (player.countMark("sbxingshang") >= get.info("sbxingshang").getLimit) return false; + return game.hasPlayer(target => target.group == "wei" && target != player); + }, + zhuSkill: true, + forced: true, + locked: false, + async content(event, trigger, player) { + player.addMark("sbxingshang", Math.min(get.info("sbxingshang").getLimit - player.countMark("sbxingshang"), 2 * game.countPlayer(target => target.group == "wei" && target != player))); + }, + group: "sbsongwei_delete", + subSkill: { + delete: { + audio: "sbsongwei", + enable: "phaseUse", + filter(event, player) { + if (player.storage.sbsongwei_delete) return false; + return game.hasPlayer(target => lib.skill.sbsongwei.subSkill.delete.filterTarget(null, player, target)); + }, + filterTarget(card, player, target) { + return target != player && target.group == "wei" && target.getStockSkills(false, true).length; + }, + skillAnimation: true, + animationColor: "thunder", + async content(event, trigger, player) { + player.storage.sbsongwei_delete = true; + player.awakenSkill("sbsongwei_delete"); + event.target.removeSkills(event.target.getStockSkills(false, true)); + }, + ai: { + order: 13, + result: { + target(player, target) { + return -target.getStockSkills(false, true).length; + }, + }, + }, + }, + }, + }, + //关羽 + //矢 + sbwusheng: { + audio: 3, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return game.hasPlayer(target => target != player && !target.isZhu2()); + }, + direct: true, + content: function* (event, map) { + var player = map.player; + var result = yield player + .chooseTarget(get.prompt("sbwusheng"), "选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸" + (get.mode() === "identity" ? "两" : "一") + "张牌,对其使用三张【杀】后不能对其使用【杀】", (card, player, target) => { + return target != player && !target.isZhu2(); + }) + .set("ai", target => { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbwusheng", target); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.25); + player.addTempSkill("sbwusheng_effect", { player: "phaseUseAfter" }); + player.storage.sbwusheng_effect[target.playerid] = 0; + } + }, + group: "sbwusheng_wusheng", + subSkill: { + wusheng: { + audio: "sbwusheng", + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + return name == "sha" && player.countCards("hs"); + }, + filter: function (event, player) { + return event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) || lib.inpile_nature.some(nature => event.filterCard(get.autoViewAs({ name: "sha", nature }, "unsure"), player, event)); + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + if (event.filterCard({ name: "sha" }, player, event)) list.push(["基本", "", "sha"]); + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: "sha", nature: j }, player, event)) list.push(["基本", "", "sha", j]); + } + var dialog = ui.create.dialog("武圣", [list, "vcard"], "hidden"); + dialog.direct = true; + return dialog; + }, + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + _status.event.getParent().type == "phase" && + game.hasPlayer(function (current) { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + switch (button.link[2]) { + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder" || button.link[3] == "ice") return 2.92; + else return 2.9; + } + } + return 1 + Math.random(); + }, + backup: function (links, player) { + return { + audio: "sbwusheng", + filterCard: true, + check: function (card) { + return 6 - get.value(card); + }, + viewAs: { name: links[0][2], nature: links[0][3] }, + position: "hs", + popname: true, + }; + }, + prompt: function (links, player) { + return "将一张手牌当作" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】" + (_status.event.name == "chooseToUse" ? "使用" : "打出"); + }, + }, + ai: { + respondSha: true, + fireAttack: true, + skillTagFilter: function (player, tag) { + if (!player.countCards("hs")) return false; + }, + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + if (lib.inpile_nature.some(i => player.getUseValue({ name: "sha", nature: i }) > 0)) { + var temp = get.order({ name: "sha" }); + if (temp > max) max = temp; + } + if (max > 0) max += 0.3; + return max; + } + return 4; + }, + result: { player: 1 }, + }, + }, + effect: { + charlotte: true, + onremove: true, + init: function (player) { + if (!player.storage.sbwusheng_effect) player.storage.sbwusheng_effect = {}; + }, + mod: { + targetInRange: function (card, player, target) { + if (card.name == "sha" && typeof player.storage.sbwusheng_effect[target.playerid] == "number") return true; + }, + cardUsableTarget: function (card, player, target) { + if (card.name !== "sha" || typeof player.storage.sbwusheng_effect[target.playerid] !== "number") return; + return player.storage.sbwusheng_effect[target.playerid] < 3; + }, + playerEnabled: function (card, player, target) { + if (card.name != "sha" || typeof player.storage.sbwusheng_effect[target.playerid] != "number") return; + if (player.storage.sbwusheng_effect[target.playerid] >= 3) return false; + }, + }, + audio: "sbwusheng", + trigger: { player: ["useCardToPlayered", "useCardAfter"] }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (event.name == "useCard") return event.targets.some(target => typeof player.storage.sbwusheng_effect[target.playerid] == "number"); + return typeof player.storage.sbwusheng_effect[event.target.playerid] == "number"; + }, + direct: true, + content: function () { + if (trigger.name == "useCard") { + var targets = trigger.targets.filter(target => typeof player.storage.sbwusheng_effect[target.playerid] == "number"); + targets.forEach(target => player.storage.sbwusheng_effect[target.playerid]++); + } else { + player.logSkill("sbwusheng_effect", trigger.target); + player.draw(get.mode() === "identity" ? 2 : 1); + } + }, + }, + }, + ai: { threaten: 114514 }, + }, + sbyijue: { + audio: 2, + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + if (!event.source || event.source != player || event.player == player) return false; + return event.num >= event.player.hp && !player.getStorage("sbyijue").includes(event.player); + }, + forced: true, + logTarget: "player", + content: function () { + trigger.cancel(); + player.addTempSkill("sbyijue_effect"); + player.markAuto("sbyijue", [trigger.player]); + player.markAuto("sbyijue_effect", [trigger.player]); + }, + ai: { + halfneg: true, + }, + marktext: "绝", + intro: { content: "已放$一马" }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + audio: "sbyijue", + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + return player.getStorage("sbyijue_effect").includes(event.target); + }, + forced: true, + logTarget: "target", + content: function () { + trigger.getParent().excluded.add(trigger.target); + }, + ai: { + effect: { + player: function (card, player, target) { + if (player.getStorage("sbyijue_effect").includes(target)) return "zeroplayertarget"; + }, + }, + }, + marktext: "义", + intro: { content: "本回合放$一马" }, + }, + }, + }, + //黄月英 + sbqicai: { + mod: { + targetInRange: function (card, player, target) { + if (get.type2(card) == "trick") return true; + }, + }, + locked: false, + getLimit: 3, + audio: 2, + enable: "phaseUse", + onChooseToUse: function (event) { + if (!event.sbqicai && !game.online) { + const player = get.player(); + const cards = Array.from(ui.discardPile.childNodes).filter(card => lib.skill.sbqicai.filterCardx(card, player)); + event.set("sbqicai", cards); + } + }, + filter: function (event, player) { + return player.countCards("h", card => lib.skill.sbqicai.filterCardx(card, player)) || (event.sbqicai && event.sbqicai.length); + }, + filterCardx: function (card, player) { + if (player.getStorage("sbqicai").includes(card.name)) return false; + return get.type(card) == "equip" && game.hasPlayer(target => target != player && target.hasEmptySlot(get.subtype(card))); + }, + usable: 1, + chooseButton: { + dialog: function (event, player) { + const list1 = player.getCards("h", card => lib.skill.sbqicai.filterCardx(card, player)); + const list2 = event.sbqicai; + var dialog = ui.create.dialog('###奇才###
    请选择一张装备牌置入一名其他角色的装备区
    '); + if (list1.length) { + dialog.add('
    手牌区
    '); + dialog.add(list1); + } + if (list2.length) { + dialog.add('
    弃牌堆
    '); + dialog.add(list2); + if (list1.length) dialog.classList.add("fullheight"); + } + return dialog; + }, + check: function (button) { + var player = _status.event.player; + var num = get.value(button.link); + if (!game.hasPlayer(target => target != player && target.hasEmptySlot(get.subtype(button.link)) && get.attitude(player, target) > 0)) num = 1 / (get.value(button.link) || 0.5); + if (get.owner(button.link)) return num; + return num * 5; + }, + backup: function (links, player) { + return { + audio: "sbqicai", + card: links[0], + filterCard: function (card, player) { + var cardx = lib.skill.sbqicai_backup.card; + if (get.owner(cardx)) return card == cardx; + return false; + }, + selectCard: -1, + filterTarget: function (card, player, target) { + return target != player && target.canEquip(lib.skill.sbqicai_backup.card); + }, + check: () => 1, + discard: false, + lose: false, + prepare: function (cards, player, targets) { + if (cards && cards.length) player.$give(cards, targets[0], false); + }, + content: function () { + if (!cards || !cards.length) { + cards = [lib.skill.sbqicai_backup.card]; + target.$gain2(cards); + game.delayx(); + } + if (get.mode() == "doudizhu") player.markAuto("sbqicai", [cards[0].name]); + target.equip(cards[0]); + player.addSkill("sbqicai_gain"); + lib.skill.sbqicai.updateCounter(player, target, 0); + }, + ai: { + result: { + target: function (player, target) { + var att = get.attitude(player, target); + if (att > 0) return 3; + if (att < 0) return -1; + return 0; + }, + }, + }, + }; + }, + prompt: function (links, player) { + return "请选择置入" + get.translation(links) + "的角色"; + }, + }, + updateCounter: function (player, target, num) { + const skill = `sbqicai_${player.playerid}`; + game.broadcastAll(lib.skill.sbqicai.initSkill, skill); + if (!target.hasSkill(skill)) target.addSkill(skill); + if (num == 0) target.clearMark(skill, false); + else if (num > 0) target.addMark(skill, num, false); + if (target.countMark(skill) >= lib.skill.sbqicai.getLimit) target.removeSkill(skill); + if (!_status.postReconnect.sbqicai) { + _status.postReconnect.sbqicai = [lib.skill.sbqicai.initSkill, []]; + } + _status.postReconnect.sbqicai[1].add(skill); + }, + initSkill: skill => { + if (!lib.skill[skill]) { + lib.skill[skill] = { + onremove: true, + mark: true, + marktext: "奇", + intro: { + markcount: function (storage) { + return (storage || 0).toString(); + }, + content: function (storage) { + return "已被掠夺" + get.cnNumber(storage || 0) + "张普通锦囊牌"; + }, + }, + }; + lib.translate[skill] = "奇才"; + lib.translate[skill + "_bg"] = "奇"; + } + }, + ai: { + order: 7, + result: { + player: function (player) { + if (!game.hasPlayer(target => target != player && target.hasEmptySlot(2) && get.attitude(player, target) != 0)) return 0; + return 1; + }, + }, + }, + marktext: "才", + intro: { content: "已使用$发动过此技能" }, + subSkill: { + gain: { + audio: "sbqicai", + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + if (!event.getg(current).length || !current.hasSkill("sbqicai_" + player.playerid)) return false; + if (current.countMark("sbqicai_" + player.playerid) >= lib.skill.sbqicai.getLimit) return false; + return event.getg(current).some(card => get.type(card) == "trick" && lib.filter.canBeGained(card, current, player)); + }); + }, + forced: true, + direct: true, + charlotte: true, + content: function () { + "step 0"; + if (!event.checkedTargets) event.checkedTargets = []; + var target = game.findPlayer(function (current) { + if (!trigger.getg(current).length || !current.hasSkill("sbqicai_" + player.playerid)) return false; + if (event.checkedTargets.includes(current)) return false; + if (current.countMark("sbqicai_" + player.playerid) >= lib.skill.sbqicai.getLimit) return false; + return trigger.getg(current).some(card => get.type(card) == "trick" && lib.filter.canBeGained(card, current, player)); + }); + if (!target) { + event.finish(); + return; + } + event.target = target; + player.logSkill("sbqicai_gain", target); + event.checkedTargets.add(target); + var cards = trigger.getg(target).filter(card => get.type(card) == "trick" && lib.filter.canBeGained(card, target, player)); + if (cards.length <= lib.skill.sbqicai.getLimit - target.countMark("sbqicai_" + player.playerid)) event._result = { bool: true, links: cards }; + else { + var num = lib.skill.sbqicai.getLimit - target.countMark("sbqicai_" + player.playerid); + target + .chooseButton(["奇才:将其中" + get.cnNumber(num) + "张牌交给" + get.translation(player), cards], num, true) + .set("ai", function (button) { + return get.value(button.link) * get.sgn(_status.event.att); + }) + .set("att", get.attitude(target, player)); + } + "step 1"; + if (result.bool) { + game.delaye(0.5); + target.give(result.links, player); + lib.skill.sbqicai.updateCounter(player, target, result.links.length); + } + event.goto(0); + }, + }, + }, + }, + sbjizhi: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return get.type(event.card) == "trick"; + }, + forced: true, + content: function () { + player.draw().gaintag = ["sbjizhi"]; + player.addTempSkill("sbjizhi_mark"); + }, + subSkill: { + mark: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("sbjizhi"); + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("sbjizhi")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("sbjizhi")) return false; + }, + }, + }, + }, + }, + //诸葛亮 + sbhuoji: { + audio: 3, + dutySkill: true, + derivation: ["sbguanxing", "sbkongcheng"], + group: ["sbhuoji_fire", "sbhuoji_achieve", "sbhuoji_fail", "sbhuoji_mark"], + subSkill: { + fire: { + audio: "sbhuoji1.mp3", + enable: "phaseUse", + filterTarget: lib.filter.notMe, + prompt: "选择一名其他角色,对其与其势力相同的所有其他角色各造成1点火属性伤害", + usable: 1, + line: "fire", + content: function () { + "step 0"; + target.damage("fire"); + "step 1"; + var targets = game.filterPlayer(current => { + if (current == player || current == target) return false; + return current.group == target.group; + }); + if (targets.length) { + game.delayx(); + player.line(targets, "fire"); + targets.forEach(i => i.damage("fire")); + } + }, + ai: { + order: 7, + fireAttack: true, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + return ( + get.sgn(att) * + game + .filterPlayer(current => { + if (current == player) return false; + return current.group == target.group; + }) + .reduce((num, current) => num + get.damageEffect(current, player, player, "fire"), 0) + ); + }, + }, + }, + }, + achieve: { + audio: "sbhuoji2.mp3", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getAllHistory("sourceDamage", evt => evt.hasNature("fire")).reduce((num, evt) => num + evt.num, 0) >= game.players.length + game.dead.length; + }, + forced: true, + locked: false, + skillAnimation: true, + animationColor: "fire", + async content(event, trigger, player) { + player.awakenSkill("sbhuoji"); + game.log(player, "成功完成使命"); + player.changeSkin("sbhuoji", "sb_zhugeliang"); + player.changeSkills(["sbguanxing", "sbkongcheng"], ["sbhuoji", "sbkanpo"]); + }, + }, + fail: { + audio: "sbhuoji3.mp3", + trigger: { player: "dying" }, + forced: true, + locked: false, + content: function () { + player.awakenSkill("sbhuoji"); + game.log(player, "使命失败"); + }, + }, + mark: { + charlotte: true, + trigger: { source: "damage" }, + filter: function (event, player) { + return event.hasNature("fire"); + }, + firstDo: true, + forced: true, + popup: false, + content: function () { + player.addTempSkill("sbhuoji_count", { + player: ["sbhuoji_achieveBegin", "sbhuoji_failBegin"], + }); + player.storage.sbhuoji_count = player.getAllHistory("sourceDamage", evt => evt.hasNature("fire")).reduce((num, evt) => num + evt.num, 0); + player.markSkill("sbhuoji_count"); + }, + }, + count: { + charlotte: true, + intro: { content: "本局游戏已造成过#点火属性伤害" }, + }, + }, + }, + sbkanpo: { + init: function (player) { + if (!player.storage.sbkanpo) { + player.storage.sbkanpo = [get.mode() == "doudizhu" || (get.mode() == "versus" && _status.mode == "two") ? 2 : 4, [], []]; + player.markSkill("sbkanpo"); + } + }, + audio: 2, + trigger: { global: "roundStart" }, + filter: function (event, player) { + var storage = player.storage.sbkanpo; + return storage[0] || storage[1].length; + }, + forced: true, + locked: false, + content: function* (event, map) { + var player = map.player, + storage = player.storage.sbkanpo; + var sum = storage[0]; + storage[1] = []; + player.markSkill("sbkanpo"); + if (!sum) return; + const list = get.inpileVCardList(info => { + if (info[2] == "sha" && info[3]) return false; + return info[0] != "equip"; + }); + const func = () => { + const event = get.event(); + const controls = [ + link => { + const evt = get.event(); + if (evt.dialog && evt.dialog.buttons) { + for (let i = 0; i < evt.dialog.buttons.length; i++) { + const button = evt.dialog.buttons[i]; + button.classList.remove("selectable"); + button.classList.remove("selected"); + const counterNode = button.querySelector(".caption"); + if (counterNode) { + counterNode.childNodes[0].innerHTML = ``; + } + } + ui.selected.buttons.length = 0; + game.check(); + } + return; + }, + ]; + event.controls = [ui.create.control(controls.concat(["清除选择", "stayleft"]))]; + }; + if (event.isMine()) func(); + else if (event.isOnline()) event.player.send(func); + var result = yield player + .chooseButton(["看破:是否记录至多" + get.cnNumber(sum) + "个牌名?", [list, "vcard"]], [1, sum], false) + .set("ai", function (button) { + if (ui.selected.buttons.length >= Math.max(3, game.countPlayer() / 2)) return 0; + switch (button.link[2]) { + case "wuxie": + return 5 + Math.random(); + case "sha": + return 5 + Math.random(); + case "tao": + return 4 + Math.random(); + case "jiu": + return 3 + Math.random(); + case "lebu": + return 3 + Math.random(); + case "shan": + return 4.5 + Math.random(); + case "wuzhong": + return 4 + Math.random(); + case "shunshou": + return 2.7 + Math.random(); + case "nanman": + return 2 + Math.random(); + case "wanjian": + return 1.6 + Math.random(); + default: + return 1.5 + Math.random(); + } + }) + .set("filterButton", button => { + return !_status.event.names.includes(button.link[2]); + }) + .set("names", storage[2]) + .set("custom", { + add: { + confirm: function (bool) { + if (bool != true) return; + const event = get.event().parent; + if (event.controls) event.controls.forEach(i => i.close()); + if (ui.confirm) ui.confirm.close(); + game.uncheck(); + }, + button: function () { + if (ui.selected.buttons.length) return; + const event = get.event(); + if (event.dialog && event.dialog.buttons) { + for (let i = 0; i < event.dialog.buttons.length; i++) { + const button = event.dialog.buttons[i]; + const counterNode = button.querySelector(".caption"); + if (counterNode) { + counterNode.childNodes[0].innerHTML = ``; + } + } + } + if (!ui.selected.buttons.length) { + const evt = event.parent; + if (evt.controls) evt.controls[0].classList.add("disabled"); + } + }, + }, + replace: { + button: function (button) { + const event = get.event(), + sum = event.sum; + if (!event.isMine()) return; + if (button.classList.contains("selectable") == false) return; + if (ui.selected.buttons.length >= sum) return false; + button.classList.add("selected"); + ui.selected.buttons.push(button); + let counterNode = button.querySelector(".caption"); + const count = ui.selected.buttons.filter(i => i == button).length; + if (counterNode) { + counterNode = counterNode.childNodes[0]; + counterNode.innerHTML = `×${count}`; + } else { + counterNode = ui.create.caption(`×${count}`, button); + counterNode.style.right = "5px"; + counterNode.style.bottom = "2px"; + } + const evt = event.parent; + if (evt.controls) evt.controls[0].classList.remove("disabled"); + game.check(); + }, + }, + }) + .set("sum", sum); + if (result.bool) { + var names = result.links.map(link => link[2]); + storage[0] -= names.length; + storage[1] = names; + storage[2] = names; + } else storage[2] = []; + player.markSkill("sbkanpo"); + }, + marktext: "破", + intro: { + markcount: function (storage) { + return storage[1].length; + }, + mark: function (dialog, content, player) { + const storage = player.getStorage("sbkanpo"); + const sum = storage[0]; + const names = storage[1]; + dialog.addText("剩余可记录" + sum + "次牌名"); + if (player.isUnderControl(true) && names.length) { + dialog.addText("当前记录牌名:"); + dialog.addSmall([names, "vcard"]); + } + }, + }, + group: "sbkanpo_kanpo", + subSkill: { + kanpo: { + audio: "sbkanpo", + trigger: { global: "useCard" }, + filter: function (event, player) { + return event.player != player && player.storage.sbkanpo[1].includes(event.card.name); + }, + prompt2: function (event, player) { + return "移除" + get.translation(event.card.name) + "的记录,令" + get.translation(event.card) + "无效"; + }, + check: function (event, player) { + var effect = 0; + if (event.card.name == "wuxie" || event.card.name == "shan") { + if (get.attitude(player, event.player) < -1) effect = -1; + } else 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) { + if (event.card.name == "sha") { + 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); + } else return true; + } + return false; + }, + logTarget: "player", + content: function () { + player.storage.sbkanpo[1].remove(trigger.card.name); + player.markSkill("sbkanpo"); + trigger.targets.length = 0; + trigger.all_excluded = true; + player.draw(); + }, + }, + }, + }, + sbguanxing: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + filter: function (event, player) { + var bool = player.hasCard(card => card.hasGaintag("sbguanxing"), "s"); + if (event.name == "phaseZhunbei") { + return bool || 7 - lib.skill.sbguanxing.getNum * player.countMark("sbguanxingx") > 0; + } + return bool && player.hasSkill("sbguanxing_on"); + }, + forced: true, + locked: false, + content: function () { + "step 0"; + if (trigger.name == "phaseJieshu") { + event.goto(2); + return; + } + player.addMark("sbguanxingx", 1, false); + var cards = player.getCards("s", card => card.hasGaintag("sbguanxing")); + if (cards.length) player.loseToDiscardpile(cards); + var num = player.countMark("sbguanxingx") - 1; + event.num = Math.max(0, 7 - lib.skill.sbguanxing.getNum * num); + "step 1"; + if (num) { + var cards2 = get.cards(num); + player.$gain2(cards2, false); + game.log(player, "将", cards2, "置于了武将牌上"); + player.loseToSpecial(cards2, "sbguanxing").visible = true; + player.markSkill("sbguanxing"); + } + "step 2"; + var cards = player.getCards("s", card => card.hasGaintag("sbguanxing")); + if (cards.length) { + player + .chooseToMove() + .set("list", [["你的“星”", cards], ["牌堆顶"]]) + .set("prompt", "观星:点击将牌移动到牌堆顶") + .set("processAI", function (list) { + var cards = list[0][1].slice(), + player = _status.event.player; + var name = _status.event.getTrigger().name; + var target = name == "phaseZhunbei" ? player : player.getNext(); + var judges = target.getCards("j"); + var top = [], + att = get.sgn(get.attitude(player, target)); + if (judges.length && att != 0 && (target != player || !player.hasWuxie())) { + for (var i = 0; i < judges.length; i++) { + var judge = (card, num) => get.judge(card) * num; + cards.sort((a, b) => judge(b, att) - judge(a, att)); + if (judge(cards[0], att) < 0) break; + else top.unshift(cards.shift()); + } + } + return [cards, top]; + }) + .set("filterOk", function (moved) { + return moved[1].length; + }); + } else event._result = { bool: false }; + "step 3"; + if (result.bool) { + var cards = result.moved[1]; + player.loseToDiscardpile(cards, ui.cardPile, "insert").log = false; + game.log(player, "将", cards, "置于了牌堆顶"); + } else if (trigger.name == "phaseZhunbei") player.addTempSkill("sbguanxing_on"); + }, + getNum: 3, + group: "sbguanxing_unmark", + subSkill: { + on: { charlotte: true }, + unmark: { + trigger: { player: "loseAfter" }, + filter: function (event, player) { + if (!event.ss || !event.ss.length) return false; + return !player.countCards("s", card => card.hasGaintag("sbguanxing")); + }, + charlotte: true, + forced: true, + silent: true, + content: function () { + player.unmarkSkill("sbguanxing"); + }, + }, + }, + marktext: "星", + intro: { + mark: function (dialog, storage, player) { + var cards = player.getCards("s", card => card.hasGaintag("sbguanxing")); + if (!cards || !cards.length) return; + dialog.addAuto(cards); + }, + markcount: function (storage, player) { + return player.countCards("s", card => card.hasGaintag("sbguanxing")); + }, + onunmark: function (storage, player) { + var cards = player.getCards("s", card => card.hasGaintag("sbguanxing")); + if (cards.length) player.loseToDiscardpile(cards); + }, + }, + mod: { + aiOrder: function (player, card, num) { + var cards = player.getCards("s", card => card.hasGaintag("sbguanxing")); + if (get.itemtype(card) == "card" && card.hasGaintag("sbguanxing")) return num + (cards.length > 1 ? 0.5 : -0.0001); + }, + }, + }, + sbkongcheng: { + audio: 2, + trigger: { player: ["damageBegin3", "damageBegin4"] }, + filter: function (event, player, name) { + if (!player.hasSkill("sbguanxing")) return false; + const num = player.countCards("s", card => card.hasGaintag("sbguanxing")); + if (name == "damageBegin3" && !num) return true; + if (name == "damageBegin4" && num) return true; + return false; + }, + forced: true, + content: function () { + "step 0"; + var num = player.countCards("s", card => card.hasGaintag("sbguanxing")); + if (!num && event.triggername == "damageBegin3") { + trigger.increase("num"); + } else if (num && event.triggername == "damageBegin4") { + player + .judge(function (result) { + if (get.number(result) <= get.player().countCards("s", card => card.hasGaintag("sbguanxing"))) return 2; + return -1; + }) + .set("judge2", result => result.bool) + .set("callback", function () { + if (event.judgeResult.number <= player.countCards("s", card => card.hasGaintag("sbguanxing"))) { + event.getParent("sbkongcheng").getTrigger().decrease("num"); + } + }); + } + }, + ai: { + combo: "sbguanxing", + }, + }, + //卢植 + sbzhenliang: { + mark: true, + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content: function (storage, player) { + if (storage) return "你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。"; + return "出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。"; + }, + }, + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (player.storage.sbzhenliang) return false; + var storage = player.getExpansions("nzry_mingren"); + if (!storage.length) return false; + var color = get.color(storage[0]); + return game.hasPlayer(function (current) { + return ( + player.inRange(current) && + player.countCards("he", function (card) { + return get.color(card) == color; + }) >= Math.max(1, Math.abs(player.getHp() - current.getHp())) + ); + }); + }, + filterCard: function (card, player) { + return get.color(card) == get.color(player.getExpansions("nzry_mingren")[0]); + }, + selectCard: [1, Infinity], + complexSelect: true, + complexCard: true, + position: "he", + filterTarget: function (card, player, target) { + return player.inRange(target) && ui.selected.cards.length == Math.max(1, Math.abs(player.getHp() - target.getHp())); + }, + check: function (card) { + return 6.5 - get.value(card); + }, + prompt: "弃置与攻击范围内的一名角色体力值之差(至少为1)张与“任”颜色相同的牌,对其造成1点伤害", + content: function () { + player.changeZhuanhuanji("sbzhenliang"); + target.damage("nocard"); + }, + ai: { + order: 5, + result: { + player: function (player, target) { + return get.damageEffect(target, player, player); + }, + }, + combo: "nzry_mingren", + }, + group: "sbzhenliang_draw", + subSkill: { + draw: { + trigger: { global: ["useCardAfter", "respondAfter"] }, + filter: function (event, player) { + if (_status.currentPhase == player || !player.storage.sbzhenliang) return false; + var card = player.getExpansions("nzry_mingren")[0]; + return card && get.type2(event.card) == get.type2(card); + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("sbzhenliang"), "令一名角色摸两张牌").set("ai", function (target) { + if (target.hasSkillTag("nogain")) return 0.1; + var att = get.attitude(player, target); + return att * (Math.max(5 - target.countCards("h"), 2) + 3); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.changeZhuanhuanji("sbzhenliang"); + player.logSkill("sbzhenliang", target); + target.draw(2); + } + }, + }, + }, + }, + //小乔 + sbtianxiang: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he", card => lib.skill.sbtianxiang.filterCard(card, player)) && game.hasPlayer(target => lib.skill.sbtianxiang.filterTarget(null, player, target)); + }, + filterCard: function (card, player) { + return get.color(card, player) == "red"; + }, + filterTarget: function (card, player, target) { + return target != player && !target.getSkills().some(skill => skill.indexOf("sbtianxiang_") == 0); + }, + discard: false, + lose: false, + delay: 0, + usable: 3, + prompt: "将一张红色牌交给一名角色并令其获得此花色的“天香”标记", + content: function () { + player.give(cards, target); + var suit = get.suit(cards[0], player); + target.addSkill("sbtianxiang_" + suit); + }, + ai: { + order: 5, + result: { target: -1 }, + }, + group: ["sbtianxiang_draw", "sbtianxiang_effect"], + subSkill: { + heart: { + charlotte: true, + mark: true, + marktext: "♥︎", + intro: { content: "伤害转移术" }, + }, + diamond: { + charlotte: true, + mark: true, + marktext: "♦︎", + intro: { content: "掳掠大法" }, + }, + draw: { + audio: "sbtianxiang", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(target => target.getSkills().some(skill => skill.indexOf("sbtianxiang_") == 0)); + }, + forced: true, + locked: false, + content: function () { + var num = 0; + game.countPlayer(target => { + var skills = target.getSkills().filter(skill => skill.indexOf("sbtianxiang_") == 0); + target.removeSkill(skills); + num += skills.length; + }); + if (get.mode() != "identity") num += 2; + player.draw(num); + }, + }, + effect: { + trigger: { player: "damageBegin3" }, + filter: function (event, player) { + return game.hasPlayer(target => target.getSkills().some(skill => skill.indexOf("sbtianxiang_") == 0)); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("sbtianxiang"), "移去一名角色的“天香”标记并执行相应效果", function (card, player, target) { + return target.getSkills().some(skill => skill.indexOf("sbtianxiang_") == 0); + }) + .set("ai", target => { + var player = _status.event.player; + return -get.attitude(player, target) * target.getSkills().filter(skill => skill.indexOf("sbtianxiang_") == 0).length; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("sbtianxiang", target); + var skills = target.getSkills().filter(skill => skill.indexOf("sbtianxiang_") == 0); + target.removeSkill(skills); + if (skills.includes("sbtianxiang_heart")) { + target.damage(trigger.source ? trigger.source : "nosource"); + trigger.cancel(); + } + if (skills.includes("sbtianxiang_diamond")) { + var cards = target.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length <= 2) event._result = { bool: true, cards: cards }; + else target.chooseCard("he", 2, "天香:交给" + get.translation(player) + "两张牌", true); + } else event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) player.gain(result.cards, target, "giveAuto"); + }, + }, + }, + }, + //张郃 + sbqiaobian: { + audio: 2, + trigger: { player: ["phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore"] }, + usable: 1, + direct: true, + content: function () { + "step 0"; + switch (trigger.name) { + case "phaseJudge": + player + .chooseTarget(get.prompt("sbqiaobian"), "失去1点体力并跳过判定阶段,将判定区里的牌移动给一名其他角色", lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + if ( + player.hp + + player.countCards("h", function (card) { + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, player, "unchanged", "cardSavable", player); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") savable = savable(card, player, player); + return savable; + }) <= + 1 + ) + return 0; + var eff = 0; + for (var card of player.getCards("j")) { + var cardx; + if (card.viewAs) cardx = get.autoViewAs({ name: card.viewAs }, [card]); + else cardx = card; + if (target.canAddJudge(cardx)) eff += get.effect(target, cardx, player, player); + else eff -= get.attitude(player, target) / 114514; + } + return eff; + }) + .setHiddenSkill("sbqiaobian"); + break; + case "phaseDraw": + player.chooseBool(get.prompt("sbqiaobian"), "跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力").setHiddenSkill("sbqiaobian"); + break; + case "phaseUse": + var num = player.countCards("h") - 6; + if (num <= 0) player.chooseBool(get.prompt("sbqiaobian"), "跳过出牌阶段和弃牌阶段,然后移动场上的一张牌").set("choice", player.canMoveCard(true)).setHiddenSkill("sbqiaobian"); + else + player + .chooseToDiscard(get.prompt("sbqiaobian"), num, "弃置" + get.cnNumber(num) + "张手牌并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌") + .set("ai", function (card) { + var player = _status.event.player; + if (!player.canMoveCard(true) || player.countCards("hs", card => player.hasValueTarget(card)) >= 9) return 0; + return 7 - get.value(card); + }) + .setHiddenSkill("sbqiaobian").logSkill = "sbqiaobian"; + break; + } + "step 1"; + if (result.bool) { + trigger.cancel(); + switch (trigger.name) { + case "phaseJudge": + var target = result.targets[0]; + player.logSkill("sbqiaobian", target); + player.loseHp(); + game.log(player, "跳过了判定阶段"); + for (var card of player.getCards("j")) { + if (target.canAddJudge(card)) { + player.$give(card, target, false); + if (card.viewAs) target.addJudge({ name: card.viewAs }, [card]); + else target.addJudge(card); + } else player.discard(card); + } + break; + case "phaseDraw": + player.logSkill("sbqiaobian"); + game.log(player, "跳过了摸牌阶段"); + player.addSkill("sbqiaobian_draw"); + break; + case "phaseUse": + if (!result.cards || !result.cards.length) player.logSkill("sbqiaobian", target); + player.skip("phaseDiscard"); + game.log(player, "跳过了出牌阶段"); + game.log(player, "跳过了弃牌阶段"); + player.moveCard(); + break; + } + } else player.storage.counttrigger.sbqiaobian--; + }, + subSkill: { + draw: { + charlotte: true, + mark: true, + intro: { content: "准备阶段摸五张牌并回复1点体力" }, + audio: "sbqiaobian", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + player.removeSkill("sbqiaobian_draw"); + player.draw(5); + player.recover(); + }, + }, + }, + }, + //萌货 + sbhuoshou: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + filter: function (event, player) { + return true; + }, + forced: true, + onremove: true, + group: ["sbhuoshou_cancel", "sbhuoshou_source", "sbhuoshou_nanmaned"], + content: function () { + "step 0"; + var card = get.discardPile(card => { + return card.name == "nanman"; + }); + if (card) { + player.gain(card, "gain2"); + } else { + game.log("但是弃牌堆里并没有", "#y南蛮入侵", "!"); + player.addMark("sbhuoshou", 1, false); + if (player.countMark("sbhuoshou") >= 5 && Math.random() < 0.25) player.chat("我南蛮呢"); + } + }, + subSkill: { + cancel: { + audio: "sbhuoshou", + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + filter: function (event, player) { + return event.card.name == "nanman"; + }, + content: function () { + trigger.cancel(); + }, + }, + source: { + audio: "sbhuoshou", + trigger: { global: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + return event.isFirstTarget && event.card && event.card.name == "nanman" && event.player != player; + }, + content: function () { + trigger.getParent().customArgs.default.customSource = player; + }, + }, + nanmaned: { + trigger: { + player: "useCard1", + }, + filter: function (event, player) { + return event.card.name == "nanman"; + }, + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; + player.addTempSkill("sbhuoshou_ban", "phaseUseAfter"); + }, + }, + ban: { + charlotte: true, + intro: { + content: "此阶段不能再使用【南蛮入侵】", + }, + }, + }, + mod: { + cardEnabled: function (card, player) { + if (player.hasSkill("sbhuoshou_ban") && card.name == "nanman") return false; + }, + }, + ai: { + threaten: 1.9, + }, + }, + sbzaiqi: { + audio: 2, + trigger: { + player: "phaseDiscardEnd", + }, + chargeSkill: true, + filter: function (event, player) { + return player.hasMark("charge"); + }, + group: "sbzaiqi_backflow", + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("sbzaiqi"), "选择任意名角色并消耗等量蓄力值,令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力", [1, player.countMark("charge")]).set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + return 3 - get.sgn(att) + Math.abs(att / 1000); + }); + "step 1"; + if (result.bool) { + var targets = result.targets; + targets.sortBySeat(); + event.targets = targets; + player.logSkill("sbzaiqi", targets); + player.removeMark("charge", targets.length); + } else event.finish(); + "step 2"; + var target = targets.shift(); + event.target = target; + if (!target.countCards("he")) event._result = { bool: false }; + else + target + .chooseToDiscard(get.translation(player) + "对你发动了【再起】", "是否弃置一张牌令其回复1点体力?或者点击“取消”,令该角色摸一张牌。", "he") + .set("ai", card => { + var eff = _status.event.eff, + att = _status.event.att; + if ((eff > 0 && att > 0) || (eff <= 0 && att < 0)) return 5.5 - get.value(card); + return 0; + }) + .set("eff", get.recoverEffect(player, player, target)) + .set("att", get.attitude(target, player)); + "step 3"; + target.line(player); + if (result.bool) { + player.recover(); + } else { + player.draw(); + } + game.delayex(); + if (targets.length) event.goto(2); + }, + subSkill: { + backflow: { + audio: "sbzaiqi", + trigger: { + //player:'enterGame', + source: "damageSource", + //global:'phaseBefore', + }, + usable: 1, + filter: function (event, player) { + if (event.name == "damage") return true; + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + locked: false, + content: function () { + player.addMark("charge", trigger.name == "damage" ? 1 : 3); + }, + }, + }, + }, + //祝融 + sblieren: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.targets.length == 1 && event.card.name == "sha" && player.canCompare(event.target, true); + }, + check: function (event, player) { + return get.attitude(player, event.target) <= 0 || game.hasPlayer(current => get.damageEffect(current, player, player) > 0); + }, + shaRelated: true, + logTarget: "target", + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (player.canCompare(trigger.target)) player.chooseToCompare(trigger.target); + else event.finish(); + "step 2"; + if (result.bool) { + player.addTempSkill("sblieren_damage"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sblieren = [player, trigger.target]; + } + }, + subSkill: { + damage: { + audio: "sblieren", + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.card.storage && + event.card.storage.sblieren && + event.card.storage.sblieren[0] == player && + game.hasPlayer(current => { + return !event.card.storage.sblieren.includes(current); + }) + ); + }, + direct: true, + charlotte: true, + content: function () { + "step 0"; + var target = trigger.card.storage.sblieren[1]; + player + .chooseTarget("烈刃:是否对除" + get.translation(target) + "外的一名其他角色造成1点伤害?", (card, player, target) => { + return target != _status.event.targeted && target != player; + }) + .set("targeted", target) + .set("ai", targetx => get.damageEffect(targetx, _status.event.player, _status.event.player)); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sblieren_damage", target); + target.damage(); + } + }, + }, + }, + }, + sbjuxiang: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + forced: true, + direct: true, + filter: function (event, player) { + return !player.hasHistory("useCard", evt => evt.card.name == "nanman") && (!_status.sbjuxiang_nanman || _status.sbjuxiang_nanman.length); + }, + group: ["sbjuxiang_cancel", "sbjuxiang_gain"], + content: function () { + "step 0"; + if (!_status.sbjuxiang_nanman) { + _status.sbjuxiang_nanman = [ + { name: "nanman", number: 7, suit: "spade" }, + { name: "nanman", number: 7, suit: "club" }, + ]; + game.broadcastAll(function () { + if (!lib.inpile.includes("nanman")) lib.inpile.add("nanman"); + }); + } + player.chooseTarget(get.prompt("sbjuxiang"), "将游戏外的随机一张【南蛮入侵】交给一名角色(剩余" + get.cnNumber(_status.sbjuxiang_nanman.length) + "张)").set("ai", target => { + var player = _status.event.player; + return Math.max(0, target.getUseValue({ name: "nanman" })) * get.attitude(player, target) * (target == player ? 0.5 : 1); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbjuxiang", target); + if (!_status.sbjuxiang_nanman.length) return; + var info = _status.sbjuxiang_nanman.randomRemove(); + var card = game.createCard2(info); + target.gain(card, "gain2").giver = player; + } + }, + ai: { + expose: 0.05, + effect: { + target: function (card) { + if (card.name == "nanman") return [0, 1]; + }, + }, + }, + subSkill: { + cancel: { + audio: "sbjuxiang", + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + filter: function (event, player) { + return event.card.name == "nanman"; + }, + content: function () { + trigger.cancel(); + }, + }, + gain: { + audio: "sbjuxiang", + trigger: { global: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return event.card.name == "nanman" && event.player != player && event.cards.filterInD().length; + }, + content: function () { + player.gain(trigger.cards.filterInD(), "gain2"); + }, + }, + }, + }, + //阿笨 + sbjiang: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + shaRelated: true, + filter: function (event, player) { + if (!(event.card.name == "juedou" || (event.card.name == "sha" && get.color(event.card) == "red"))) return false; + return true; + }, + frequent: true, + onremove: true, + group: ["sbjiang_add", "sbjiang_qiben"], + content: function () { + player.draw(); + }, + ai: { + effect: { + target: function (card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; + }, + player: function (card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 1]; + }, + }, + }, + subSkill: { + add: { + audio: "sbjiang", + trigger: { player: "useCard2" }, + direct: true, + filter: function (event, player) { + if (event.card.name != "juedou") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "额外指定一个目标,然后失去1点体力"; + player + .chooseTarget(get.prompt("sbjiang_add"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var eff = get.effect(target, trigger.card, player, player); + if (player.hasZhuSkill("sbzhiba") && !player.hasMark("sbjiang")) return eff; + if (eff + get.effect(player, { name: "losehp" }, player) / 8 > 0) return eff; + return 0; + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("sbjiang_add", event.targets); + trigger.targets.addArray(event.targets); + player.loseHp(); + } + }, + }, + qiben: { + audio: "sbjiang", + enable: "phaseUse", + viewAs: { name: "juedou" }, + filterCard: true, + position: "h", + selectCard: -1, + prompt: function () { + var player = _status.event.player; + var limit = player.hasMark("sbjiang") + ? game.countPlayer(current => { + return current.group == "wu" && current != player; + }) + 1 + : 1; + return "出牌阶段限" + get.cnNumber(limit) + "次。你可以将所有手牌当【决斗】使用"; + }, + filter: function (event, player) { + var limit = player.hasMark("sbjiang") + ? game.countPlayer(current => { + return current.group == "wu" && current != player; + }) + 1 + : 1; + if ((player.getStat("skill").sbjiang_qiben || 0) >= limit) return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i = 0; i < hs.length; i++) { + var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; + } + return event.filterCard(get.autoViewAs({ name: "juedou" }, hs)); + }, + ai: { + order: 0.001, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") { + if (arg && (!arg.card || get.name(arg.card) !== "tao")) return false; + let limit = player.hasMark("sbjiang") + ? game.countPlayer(current => { + return current.group == "wu" && current != player; + }) + 1 + : 1; + return player.isPhaseUsing() && (player.getStat("skill").sbjiang_qiben || 0) < limit && player.hasCard(card => get.name(card) != "tao", "h"); + } + }, + }, + }, + }, + }, + sbhunzi: { + audio: 2, + trigger: { player: "dyingAfter" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "wood", + derivation: ["sbyingzi", "gzyinghun"], + content: function () { + "step 0"; + player.awakenSkill("sbhunzi"); + player.loseMaxHp(); + "step 1"; + player.changeHujia(1, null, true); + "step 2"; + player.draw(3); + "step 3"; + player.addSkills(["sbyingzi", "gzyinghun"]); + }, + ai: { + threaten: function (player, target) { + if (target.hp == 1) return 2; + return 0.5; + }, + maixie: true, + effect: { + target: function (card, player, target) { + if (!target.hasFriend() || target.hp > 1) return; + if (get.tag(card, "damage") == 1 && ((target.hasZhuSkill("sbzhiba") && game.countPlayer(current => current != target && current.group == "wu")) || player.countCards("hs", card => player.canSaveCard(card, target)) + target.countCards("hs", card => target.canSaveCard(card, target)) > 0) && !target.isTurnedOver() && _status.currentPhase != target && get.distance(_status.currentPhase, target, "absolute") <= 3) return [0.5, 1]; + }, + }, + }, + }, + sbzhiba: { + audio: 2, + trigger: { player: "dying" }, + filter: function (event, player) { + if (!player.hasZhuSkill("sbzhiba")) return false; + return player.hp <= 0; + }, + zhuSkill: true, + limited: true, + mark: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player.awakenSkill("sbzhiba"); + event.targets = game + .filterPlayer(current => { + return current.group == "wu" && current != player; + }) + .sortBySeat(_status.currentPhase); + var num = event.targets.length; + if (num > 0) player.recover(num); + player.addMark("sbjiang", 1, false); + player.addTempSkill("sbzhiba_draw"); + if (!event.targets.length) event.finish(); + "step 1"; + var target = targets.shift(); + target.damage("nosource"); + if (targets.length) event.redo(); + }, + subSkill: { + draw: { + trigger: { global: "dieAfter" }, + filter: function (event, player) { + return event.getParent(3).name == "sbzhiba"; + }, + forced: true, + charlotte: true, + content: function () { + player.draw(3); + }, + }, + }, + }, + //大乔 + sbguose: { + audio: 2, + enable: "phaseUse", + get usable() { + return get.mode() == "identity" ? 4 : 2; + }, + discard: false, + lose: false, + delay: false, + filter: function (event, player) { + return player.hasCard(card => get.suit(card) == "diamond", "hes") || game.hasPlayer(current => current.hasJudge("lebu")); + }, + position: "hes", + filterCard: function (card, player) { + if (get.suit(card) != "diamond") return false; + var mod = game.checkMod(ui.selected.cards[0], player, "unchanged", "cardEnabled2", player); + if (!mod) return false; + return true; + }, + selectCard: [0, 1], + filterTarget: function (card, player, target) { + if (!ui.selected.cards.length) { + if (target.hasJudge("lebu")) return true; + return false; + } + if (player == target) return false; + return player.canUse(get.autoViewAs({ name: "lebu" }, ui.selected.cards), target); + }, + complexSelect: true, + check: function (card) { + return 7 - get.value(card); + }, + content: function () { + "step 0"; + if (target.hasJudge("lebu")) { + target.discard(target.getJudge("lebu")); + } else { + player.useCard({ name: "lebu" }, target, cards).audio = false; + } + "step 1"; + player.draw(); + }, + ai: { + result: { + target: function (player, target) { + if (target.hasJudge("lebu")) return -get.effect(target, { name: "lebu" }, player, target); + return get.effect(target, { name: "lebu" }, player, target); + }, + }, + order: 9, + }, + }, + sbliuli: { + audio: 2, + inherit: "liuli", + group: "sbliuli_heart", + subSkill: { + heart: { + trigger: { player: "logSkill" }, + filter: function (event, player) { + if (event.skill != "sbliuli") return false; + if (player.hasSkill("sbliuli_used")) return false; + var evt = event.log_event; + return player.hasHistory("lose", evtx => { + return evtx.getParent(2) == evt && get.suit(evtx.cards[0]) == "heart"; + }); + }, + direct: true, + content: function () { + "step 0"; + var sourcex = trigger.log_event.getTrigger().player; + player + .chooseTarget("流离:是否令一名不为" + get.translation(sourcex) + "的其他角色获得“流离”标记?", (card, player, target) => { + return target != player && target != _status.event.sourcex; + }) + .set("ai", target => { + return get.attitude(_status.event.player, target); + }) + .set("sourcex", sourcex); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.countPlayer(i => i.removeSkill("sbliuli_dangxian")); + target.addSkill("sbliuli_dangxian"); + player.addTempSkill("sbliuli_used"); + } + }, + }, + used: { charlotte: true }, + dangxian: { + trigger: { player: "phaseBegin" }, + forced: true, + charlotte: true, + mark: true, + marktext: "流", + intro: { content: "回合开始时,执行一个额外的出牌阶段" }, + content: function () { + var next = player.phaseUse(); + event.next.remove(next); + trigger.next.push(next); + player.removeSkill("sbliuli_dangxian"); + }, + }, + }, + }, + //刘表 + sbzishou: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + if (player == event.player) return false; + if (!event.player.countCards("he")) return false; + return ( + !event.player.hasAllHistory("sourceDamage", evt => { + return evt.player == player; + }) && + !event.player.hasAllHistory("damage", evt => { + return evt.source == player; + }) + ); + }, + forced: true, + logTarget: "player", + content: function () { + "step 0"; + trigger.player.chooseCard(true, get.translation(player) + "对你发动了【自守】", "交给其一张牌", "he"); + "step 1"; + if (result.bool) { + trigger.player.give(result.cards, player); + } + }, + ai: { + threaten: 3, + }, + }, + sbzongshi: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return !player.getStorage("sbzongshi").includes(event.source); + }, + forced: true, + onremove: true, + logTarget: "source", + content: function () { + trigger.source.chooseToDiscard(true, trigger.source.countCards("h")); + player.markAuto("sbzongshi", [trigger.source]); + }, + intro: { + content: "已扒过目标:$", + }, + ai: { + threaten: 0.5, + effect: { + target: function (card, player, target, current) { + if (player._sbzongshi_aiChecking) return; + if (!get.tag(card, "damage")) return; + var cards = player.getCards("h"); + if (!target.hasFriend()) return; + player._sbzongshi_aiChecking = true; + var value = cards.reduce((p, c) => { + return p + get.value(c); + }, 0); + delete player._sbzongshi_aiChecking; + if (cards.length > 5 || value > 5 * cards.length) return [1, 0, 0, -cards.length / 2]; + return [1, 0, 0, -0.5]; + }, + }, + }, + }, + //貂蝉 + sblijian: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + !player.getStat("skill").sblijian && + game.countPlayer(current => { + return current != player; + }) > 1 + ); + }, + filterCard: true, + selectCard: [1, Infinity], + position: "he", + filterTarget: lib.filter.notMe, + selectTarget: function () { + return ui.selected.cards.length + 1; + }, + filterOk: function () { + return ui.selected.targets.length == ui.selected.cards.length + 1; + }, + check: function (card) { + let player = get.owner(card), + targets = lib.skill.sblijian.selectTargetAi(_status.event, player); + if (ui.selected.cards.length < targets - 1) { + if (player.hasSkill("sbbiyue")) return 4 * targets - get.value(card); + return 6 + targets - get.value(card); + } + return 0; + }, + selectTargetAi: (event, player) => { + let cache = _status.event.getTempCache("sblijian", "targets"); + if (Array.isArray(cache)) return cache.length; + let targets = [], + cards = [0], + sbbiyue = player.hasSkill("sbbiyue") + ? Math.max( + 0, + 3 - + game.countPlayer2(current => { + return current.getHistory("damage").length > 0; + }) + ) + : 0, + alter = [null, 1, 1], + temp; + for (let i of game.players) { + if (player === i) continue; + let vplayer = ui.create.player(i); + temp = get.effect(i, new lib.element.VCard({ name: "juedou", isCard: true }), vplayer, i); + vplayer.remove(); + if (temp) { + let att = get.attitude(event.player, i); + if ((!att && sbbiyue) || att * temp > 0) targets.push([i, temp, att]); + else if (!alter[2]) continue; + else if (!att || (att > 0 && temp > -15 && i.hp > 2) || (att < 0 && temp < 15)) alter = [i, temp, att]; + } + } + targets.sort((a, b) => { + if (Boolean(a[2]) !== Boolean(b[2])) return Math.abs(b[2]) - Math.abs(a[2]); + return Math.abs(b[1]) - Math.abs(a[1]); + }); + if (targets.length < 2 && alter[0]) targets.push(alter); + targets = targets.slice( + 0, + 1 + + player.countCards("he", card => { + if (lib.filter.cardDiscardable(card, player, "sblijian")) { + cards.push(get.value(card)); + return true; + } + return false; + }) + ); + cards.sort((a, b) => a - b); + for (let i = 0; i < targets.length; i++) { + if (Math.abs(targets[i][1]) < cards[i] / (1 + sbbiyue)) { + targets.splice(i, targets.length - i); + break; + } + } + if (targets.length < 2) { + event.putTempCache("sblijian", "targets", []); + return 0; + } + event.putTempCache("sblijian", "targets", targets); + return targets.length; + }, + multiline: true, + content: function () { + var targetx = targets.slice().sortBySeat(target)[1]; + var card = { name: "juedou", isCard: true }; + if (target.canUse(card, targetx)) target.useCard(card, targetx); + }, + ai: { + threaten: 3, + order: 7, + result: { + player: function (player, target) { + let targets = _status.event.getTempCache("sblijian", "targets"); + if (Array.isArray(targets)) + for (let arr of targets) { + if (target === arr[0] && !arr[2]) return 1; + } + return 0; + }, + target: function (player, target) { + let targets = _status.event.getTempCache("sblijian", "targets"); + if (Array.isArray(targets)) + for (let arr of targets) { + if (target === arr[0]) { + if (arr[1] * arr[2] < 0) return get.sgn(arr[2]); + return arr[1]; + } + } + return 0; + }, + }, + }, + }, + sbbiyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content: function () { + player.draw( + Math.min( + 4, + game.countPlayer2(current => { + return current.getHistory("damage").length > 0; + }) + 1 + ) + ); + }, + }, + //陈宫 + sbmingce: { + audio: 2, + enable: "phaseUse", + usable: 1, + position: "he", + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterCard: true, + check: function (card) { + return 8 - get.value(card); + }, + filterTarget: lib.filter.notMe, + selectTarget: 1, + discard: false, + lose: false, + delay: false, + onremove: true, + group: "sbmingce_hit", + content: function () { + "step 0"; + player.give(cards, target); + "step 1"; + var choices = ["选项二"]; + var choiceList = ["失去1点体力,令" + get.translation(player) + "摸两张牌并获得1枚“策”", "摸一张牌"]; + if (target.hp > 0) choices.unshift("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + target + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", get.translation(player) + "对你发动了【明策】,请选择一项") + .set("ai", () => { + return _status.event.choice; + }) + .set("choice", target.hp <= 0 || (((target.hp + target.countCards("hs", "tao") > 2 && get.attitude(target, player) > 0) || get.effect(target, { name: "losehp" }, target, target) > 0) && target.hp > 0) ? 0 : 1); + "step 2"; + if (result.control == "选项一") { + target.loseHp(); + player.draw(2); + } else { + target.draw(); + event.finish(); + } + "step 3"; + player.addMark("sbmingce", 1); + }, + marktext: "笨", + intro: { + name: "策(明策)", + name2: "策", + content: "mark", + }, + ai: { + result: { + player: 0.5, + target: 1, + }, + order: 8.5, + expose: 0.2, + }, + subSkill: { + hit: { + audio: "sbmingce", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.hasMark("sbmingce"); + }, + direct: true, + content: function () { + "step 0"; + var num = player.countMark("sbmingce"); + event.num = num; + player.chooseTarget(get.prompt("sbmingce"), "移去所有“策”,对一名其他角色造成" + num + "点伤害", lib.filter.notMe).set("ai", target => { + var player = _status.event.player; + var eff = get.damageEffect(target, player, player); + var num = player.countMark("sbmingce"); + if (target.hasSkillTag("filterDamage", null, { player: player })) num = 1; + return eff * num; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbmingce_hit", target); + player.removeMark("sbmingce", num); + target.damage(num); + } + }, + }, + }, + }, + sbzhichi: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + content: function () { + player.addTempSkill("sbzhichi_muteki"); + }, + subSkill: { + muteki: { + audio: "sbzhichi", + trigger: { player: "damageBegin4" }, + charlotte: true, + forced: true, + group: "sbzhichi_egg", + content: function () { + trigger.cancel(); + }, + mark: true, + intro: { content: "我无敌啦!" }, + ai: { + maixie: true, + maixie_hp: true, + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) return "zeroplayertarget"; + }, + }, + }, + }, + egg: { + trigger: { player: "die" }, + charlotte: true, + forced: true, + silent: true, + forceDie: true, + content: function () { + player.chat("你是真滴牛批"); + }, + }, + }, + }, + //袁绍 + sbluanji: { + audio: 2, + enable: "phaseUse", + trigger: { global: "respond" }, + viewAs: { name: "wanjian" }, + forced: true, + locked: false, + filter: function (event, player) { + if (event.name == "chooseToUse") return player.countCards("hs") > 1 && !player.hasSkill("sbluanji_used"); + var evt = event.getParent(2); + return ( + evt.name == "wanjian" && + evt.getParent().player == player && + event.player != player && + player.getHistory("gain", function (evt) { + return evt.getParent(2).name == "sbluanji"; + }).length < 3 + ); + }, + filterCard: true, + selectCard: 2, + position: "hs", + prompt: "将两张手牌当【万箭齐发】使用", + check: function (card) { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return player.canUse("wanjian", current); + }); + var num = 0; + for (var i = 0; i < targets.length; i++) { + var eff = get.sgn(get.effect(targets[i], { name: "wanjian" }, player, player)); + if (targets[i].hp == 1) { + eff *= 1.5; + } + if (get.attitude(player, targets[i]) == 0 || targets[i].group == "qun") { + eff += 0.5; + } + num += eff; + } + if (!player.needsToDiscard(-1)) { + if (targets.length >= 7) { + if (num < 1) return 0; + } else if (targets.length >= 5) { + if (num < 0.5) return 0; + } + } + return 6 - get.value(card); + }, + content: function () { + player.draw(); + }, + precontent: function () { + player.addTempSkill("sbluanji_used", "phaseUseAfter"); + }, + ai: { + threaten: 1.6, + }, + subSkill: { used: { charlotte: true } }, + }, + sbxueyi: { + audio: 2, + trigger: { player: "useCardToTargeted" }, + filter: function (event, player) { + return player.hasZhuSkill("sbxueyi") && event.target != player && event.target.group == "qun"; + }, + zhuSkill: true, + forced: true, + usable: 2, + logTarget: "target", + content: function () { + player.draw(); + }, + mod: { + maxHandcard: function (player, num) { + if (player.hasZhuSkill("sbxueyi")) { + return num + 2 * game.countPlayer(current => player != current && current.group == "qun"); + } + }, + }, + ai: { + effect: { + player: function (card, player, target) { + if (player != target && target && target.group == "qun" && card.name != "tao") return [1, 0.1]; + }, + }, + }, + }, + //庞统 + sblianhuan: { + audio: 2, + enable: "phaseUse", + filter: (event, player) => player.hasCard(card => lib.skill.sblianhuan.filterCard(card, player), lib.skill.sblianhuan.position), + filterTarget: function (card, player, target) { + if (player.hasSkill("sblianhuan_blocker")) return false; + if (!ui.selected.cards.length) return false; + card = get.autoViewAs({ name: "tiesuo" }, [ui.selected.cards[0]]); + return player.canUse(card, target); + }, + filterCard: (card, player) => get.suit(card) == "club" && (!player.hasSkill("sblianhuan_blocker") || player.canRecast(card)), + selectCard: 1, + position: "hs", + derivation: "sblianhuan_lv2", + selectTarget: function () { + var card = get.card(), + player = get.player(); + if (player.hasSkill("sblianhuan_blocker")) return 0; + if (card == undefined) return; + var range = [0, 2]; + game.checkMod(card, player, range, "selectTarget", player); + return range; + }, + filterOk: function () { + var card = ui.selected.cards[0]; + if (!card) return false; + if (get.position(card) == "s" && !ui.selected.targets.length) return false; + return true; + }, + check: function (card) { + return 6 - get.value(card); + }, + prompt: function () { + var player = _status.event.player, + use = !player.hasSkill("sblianhuan_blocker"); + return "重铸一张♣手牌" + (use ? ";或将一张♣手牌当【铁索连环】使用" : ""); + }, + group: ["sblianhuan_use", "sblianhuan_add", "sblianhuan_discard2"], + multitarget: true, + multiline: true, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + if (targets.length) { + player.addTempSkill("sblianhuan_blocker", "phaseUseAfter"); + var card = get.autoViewAs({ name: "tiesuo" }, cards); + player.useCard(card, cards, targets); + } else { + player.loseToDiscardpile(cards); + player.draw(cards.length); + } + }, + subSkill: { + blocker: { charlotte: true }, + use: { + audio: "sblianhuan", + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card.name == "tiesuo" && !player.storage.sblianhuan; + }, + check: function (event, player) { + var eff = 0, + targets = event.targets.filter(i => !i.isLinked()); + for (var target of targets) { + eff += get.attitude(player, target); + } + return eff < -1; + }, + prompt2: "失去1点体力,然后当此牌指定第一个目标后,你随机弃置所有不处于连环状态的目标角色各一张手牌", + content: function () { + "step 0"; + player.loseHp(); + "step 1"; + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sblianhuan = true; + trigger._sblianhuan = true; + player.addTempSkill("sblianhuan_discard", "phaseUseAfter"); + }, + }, + discard: { + trigger: { global: "useCardToPlayered" }, + forced: true, + locked: false, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.isFirstTarget && event.card.storage && event.card.storage.sblianhuan; + }, + content: function () { + "step 0"; + event.targets = trigger.targets.filter(i => !i.isLinked()); + if (!event.targets.length) event.finish(); + else player.logSkill("sblianhuan_discard", event.targets); + "step 1"; + var target = targets.shift(); + var cards = target.getCards("h", card => { + return lib.filter.cardDiscardable(card, player, "sblianhuan"); + }); + if (cards.length > 0) { + player.line(target); + target.discard(cards.randomGet()); + } + if (targets.length) event.redo(); + }, + }, + add: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + return ( + event.card.name == "tiesuo" && + player.storage.sblianhuan && + game.hasPlayer(current => { + return !event.targets.includes(current) && player.canUse(event.card, current); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("sblianhuan_add"), "为" + get.translation(trigger.card) + "额外指定任意个目标", [1, Infinity], function (card, player, target) { + return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); + }) + .set("sourcex", trigger.targets) + .set("ai", function (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("sblianhuan_add", event.targets); + trigger.targets.addArray(event.targets); + }, + }, + discard2: { + trigger: { player: "useCardToPlayered" }, + forced: true, + locked: false, + popup: false, + filter: function (event, player) { + return event.isFirstTarget && event.card.name == "tiesuo" && player.storage.sblianhuan && !event.getParent()._sblianhuan; + }, + content: function () { + "step 0"; + event.targets = trigger.targets.filter(i => !i.isLinked()); + if (!event.targets.length) event.finish(); + else player.logSkill("sblianhuan_discard2", event.targets); + "step 1"; + var target = targets.shift(); + var cards = target.getCards("h", card => { + return lib.filter.cardDiscardable(card, player, "sblianhuan"); + }); + if (cards.length > 0) { + player.line(target); + target.discard(cards.randomGet()); + } + if (targets.length) event.redo(); + }, + }, + }, + }, + sbniepan: { + audio: 2, + enable: "chooseToUse", + mark: true, + skillAnimation: true, + limited: true, + animationColor: "orange", + filter: function (event, player) { + return event.type == "dying" && player == event.dying; + }, + content: function () { + "step 0"; + player.awakenSkill("sbniepan"); + player.discard(player.getCards("hej")); + "step 1"; + player.draw(2); + "step 2"; + if (player.hp < 2) player.recover(2 - player.hp); + "step 3"; + player.turnOver(false); + "step 4"; + player.link(false); + "step 5"; + player.storage.sblianhuan = true; + game.log(player, "修改了", "#g【连环】"); + }, + ai: { + order: 1, + skillTagFilter: function (player, arg, target) { + if (player != target || player.storage.sbniepan) return false; + }, + save: true, + result: { + player: function (player) { + if (player.hp <= 0) return 10; + return 0; + }, + }, + threaten: function (player, target) { + if (!target.storage.sbniepan) return 0.6; + }, + }, + }, + //法正 + sbxuanhuo: { + audio: 2, + enable: "phaseUse", + usable: 1, + group: "sbxuanhuo_rob", + filterTarget: function (card, player, target) { + return !target.hasMark("sbxuanhuo_mark") && player != target; + }, + filterCard: true, + position: "he", + discard: false, + lose: false, + delay: false, + onremove: function (player) { + delete player.storage.sbxuanhuo; + player.unmarkSkill("sbxuanhuo"); + }, + check: function (card) { + return 6.5 - get.value(card); + }, + content: function () { + "step 0"; + player.give(cards, target); + if (player.storage.sbxuanhuo && player.storage.sbxuanhuo[target.playerid]) delete player.storage.sbxuanhuo[target.playerid]; + "step 1"; + target.addMark("sbxuanhuo_mark"); + var history = target.getAllHistory("lose"); + if (history.length) { + history[history.length - 1].sbxuanhuo_mark = true; + } + }, + getNum: function (current, skill) { + var num = 0; + var history = current.getAllHistory("lose"); + if (history.length) { + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + if (evt.sbxuanhuo_mark) break; + if (typeof skill == "string") { + if (evt.getParent(2).name == skill) num += evt.cards2.length; + } else { + var evtx = evt.getParent(), + player = skill; + if (evtx.name == "gain") { + var cards = evtx.cards; + if (evtx.player == player && cards.length > 0) num += cards.length; + } else if (evtx.name == "loseAsync") { + if (evtx.type != "gain" || evtx.giver) return false; + var cards = evtx.getl(current).cards2; + var cardsx = evtx.getg(player); + if (cardsx.length > 0) num += cardsx.length; + } + } + } + } + return num; + }, + ai: { + order: 9, + result: { + target: function (player, target) { + return -Math.sqrt(Math.max(target.hp, 1)); + }, + }, + }, + marktext: "惑", + intro: { + content: function (storage, player) { + if (!storage || get.is.empty(storage)) return "未得到过牌"; + var map = _status.connectMode ? lib.playerOL : game.playerMap; + var str = "已得到"; + for (var i in storage) { + str += get.translation(map[i]) + "的" + get.cnNumber(storage[i]) + "张牌、"; + } + return str.slice(0, -1); + }, + }, + subSkill: { + mark: { + marktext: "眩", + intro: { + name: "眩惑", + name2: "眩", + markcount: () => 0, + content: "已获得“眩”标记", + }, + }, + rob: { + audio: "sbxuanhuo", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + forced: true, + locked: false, + direct: true, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.name == "phaseDraw") return false; + return game.hasPlayer(current => { + if (!event.getg(current).length || !current.hasMark("sbxuanhuo_mark")) return false; + if (evt && evt.player == current) return false; + if (lib.skill.sbxuanhuo.getNum(current, "sbxuanhuo_rob") >= 5) return false; + return current.hasCard(card => lib.filter.canBeGained(card, current, player), "he"); + }); + }, + content: function () { + "step 0"; + var evt = trigger.getParent("phaseDraw"); + var targets = game.filterPlayer(current => { + if (!trigger.getg(current).length || !current.hasMark("sbxuanhuo_mark")) return false; + if (evt && evt.player == current) return false; + if (lib.skill.sbxuanhuo.getNum(current, "sbxuanhuo_rob") >= 5) return false; + return current.hasCard(card => lib.filter.canBeGained(card, current, player), "he"); + }); + event.targets = targets; + "step 1"; + var target = targets.shift(); + player.logSkill("sbxuanhuo", target); + var hs = target.getCards("h", card => lib.filter.canBeGained(card, target, player)); + if (hs.length) { + player.gain(hs.randomGet(), target, "giveAuto"); + if (!player.storage.sbxuanhuo) player.storage.sbxuanhuo = {}; + player.storage.sbxuanhuo[target.playerid] = lib.skill.sbxuanhuo.getNum(target, "sbxuanhuo_rob") + 1; + player.markSkill("sbxuanhuo"); + } + if (targets.length > 0) event.redo(); + }, + }, + }, + }, + sbenyuan: { + audio: 2, + forced: true, + direct: true, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(current => current.hasMark("sbxuanhuo_mark")); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => current.hasMark("sbxuanhuo_mark")); + event.targets = targets; + "step 1"; + var target = targets.shift(); + event.target = target; + player.logSkill("sbenyuan", target); + target.removeMark("sbxuanhuo_mark", target.countMark("sbxuanhuo_mark")); + game.players.forEach(current => { + var storage = current.storage.sbxuanhuo; + if (storage && storage[target.playerid]) delete storage[target.playerid]; + if (storage && get.is.empty(storage)) { + delete current.storage.sbxuanhuo; + current.unmarkSkill("sbxuanhuo"); + } + }); + var num = lib.skill.sbxuanhuo.getNum(target, player); + if (num >= 3) { + var cards = player.getCards("he"); + if (!cards.length) event._result = { bool: false }; + else if (cards.length <= 3) event._result = { bool: true, cards: cards }; + else player.chooseCard("恩怨:交给" + get.translation(target) + "三张牌", true, 3, "he"); + } else { + target.loseHp(); + player.recover(); + event.goto(3); + } + "step 2"; + if (result.bool) player.give(result.cards, target); + "step 3"; + if (targets.length) event.goto(1); + }, + ai: { + combo: "sbxuanhuo", + }, + }, + //姜维 + sbtiaoxin: { + audio: 2, + enable: "phaseUse", + usable: 1, + chargeSkill: true, + filter: function (event, player) { + return player.hasMark("charge"); + }, + filterTarget: lib.filter.notMe, + selectTarget: function () { + return [1, _status.event.player.countMark("charge")]; + }, + multiline: true, + group: "sbtiaoxin_backflow", + content: function () { + "step 0"; + 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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player); + "step 1"; + if (!result.bool && target.countCards("he") > 0) { + target.chooseCard("he", "交给" + get.translation(player) + "一张牌", true); + } else event.finish(); + "step 2"; + if (result.bool) { + target.give(result.cards, player); + } + }, + contentAfter: function () { + player.removeMark("charge", targets.length); + }, + ai: { + threaten: 1.2, + order: 4, + expose: 0.2, + result: { + target: function (player, target) { + if (target.countGainableCards(player, "he") == 0) return 0; + return -1; + }, + player: function (player, target) { + if (!target.canUse("sha", player)) return 0; + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; + return -0.5; + }, + }, + }, + subSkill: { + backflow: { + audio: "sbtiaoxin", + trigger: { + player: ["loseAfter", "enterGame"], + global: ["loseAsyncAfter", "phaseBefore"], + }, + forced: true, + filter: function (event, player) { + if (player.countMark("charge") >= 4) return false; + if (event.name.indexOf("lose") == 0) { + if (event.type != "discard") return false; + var evt = event.getParent("phaseDiscard"); + return evt && evt.player == player && event.getl(player).cards2.length > 0; + } else { + return event.name != "phase" || game.phaseNumber == 0; + } + }, + content: function () { + var num = Math.min(4 - player.countMark("charge"), trigger.name.indexOf("lose") == 0 ? trigger.getl(player).cards2.length : 4); + if (num > 0) player.addMark("charge", num); + }, + }, + }, + }, + sbzhiji: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + var len = 0; + player.getAllHistory("useSkill", evt => { + if (evt.skill != "sbtiaoxin") return false; + len += evt.targets.length; + }); + return len >= 4; + }, + content: function () { + "step 0"; + player.awakenSkill("sbzhiji"); + player.loseMaxHp(); + "step 1"; + player.chooseTarget("志继:令至少一名角色获得“北伐”标记", true, [1, Infinity]).set("ai", target => -get.attitude(player, target)); + "step 2"; + if (result.bool) { + player.line(result.targets, "fire"); + result.targets.forEach(target => { + target.addAdditionalSkill("sbzhiji_" + player.playerid, "sbzhiji_beifa"); + target.markAuto("sbzhiji_beifa", [player]); + }); + player.addTempSkill("sbzhiji_clear", { player: "phaseBegin" }); + if (!event.isMine() && !event.isOnline()) game.delayx(); + } + }, + subSkill: { + beifa: { + charlotte: true, + mark: true, + marktext: "伐", + intro: { + name: "北伐", + name2: "北伐", + content: "使用牌只能指定$和自己为目标", + }, + mod: { + playerEnabled: function (card, player, target) { + if (player != target && !player.getStorage("sbzhiji_beifa").includes(target)) return false; + }, + }, + }, + clear: { + charlotte: true, + onremove: function (player) { + game.countPlayer(function (current) { + current.removeAdditionalSkill("sbzhiji_" + player.playerid); + }); + }, + }, + }, + ai: { + combo: "sbtiaoxin", + }, + }, + //刘备 + sbrende: { + audio: 3, + enable: ["chooseToUse", "chooseToRespond"], + maxNum: 8, + filter: function (event, player) { + if (event.type == "wuxie" || player.hasSkill("sbrende_used")) return false; + if (player.countMark("sbrende") < 2) return false; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; + } + } + } + return false; + }, + group: ["sbrende_give", "sbrende_gain"], + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("仁德"); + if (event.type == "phase") { + dialog._chosenOpt = []; + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + var list = ["视为使用基本牌", "交给其他角色牌"]; + for (var i of list) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.innerHTML = "" + i + ""; + td.link = i; + if (i == list[0]) { + td.classList.add("bluebg"); + dialog._chosenOpt.add(td); + } + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.clicked) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + _status.clicked = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + if (link == "交给其他角色牌") game.uncheck(); + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); + dialog._chosenOpt.remove(current); + } + dialog._chosenOpt.add(this); + this.classList.add("bluebg"); + game.check(); + }); + table.appendChild(td); + dialog.buttons.add(td); + } + dialog.content.appendChild(table); + } + var cards = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) cards.push(["基本", "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) cards.push(["基本", "", name, nature]); + } + } + } + dialog.add([cards, "vcard"]); + return dialog; + }, + check: function (button, player) { + if (typeof button.link == "string") return -1; + if (_status.event.getParent().type != "phase") return 1; + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }, + select: function () { + var opts = _status.event.dialog._chosenOpt; + return opts && opts.length && opts[0].link == "交给其他角色牌" ? 0 : 1; + }, + backup: function (links, player) { + var isUse = links.length == 1; + var backup = get.copy(lib.skill["sbrende_" + (isUse ? "use" : "give")]); + if (isUse) backup.viewAs = { name: links[0][2], nature: links[0][3], isCard: true }; + return backup; + }, + prompt: function (links, player) { + var isUse = links.length == 1; + return isUse ? "移去2枚“仁望”,视为使用或打出" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) : "###仁德###出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为" + lib.skill.sbrende.maxNum + ")"; + }, + }, + hiddenCard: function (player, name) { + return get.type(name) == "basic" && player.countMark("sbrende") > 1 && player.hasSkill("sbrende_used"); + }, + marktext: "仁", + intro: { + name: "仁望", + name2: "仁望", + content: "mark", + }, + ai: { + respondSha: true, + respondShan: true, + save: true, + skillTagFilter: function (player) { + return player.countMark("sbrende") > 1 && !player.hasSkill("sbrende_used"); + }, + order: function (item, player) { + if (_status.event.type == "phase" && lib.skill.sbzhangwu.ai.result.player(player) > 0) return 9.1; + return 0.5; + }, + result: { + player: function (player) { + if (_status.event.dying) { + return get.attitude(player, _status.event.dying); + } + return _status.event.type == "phase" && player.countMark("sbrende") <= 2 ? 0 : 1; + }, + }, + }, + subSkill: { + backup: {}, + used: { charlotte: true }, + given: { onremove: true }, + use: { + audio: "sbrende", + filterCard: () => false, + selectCard: -1, + popname: true, + precontent: function () { + player.logSkill("sbrende_use"); + delete event.result.skill; + player.removeMark("sbrende", 2); + player.addTempSkill("sbrende_used"); + }, + }, + give: { + audio: "sbrende", + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + position: "he", + discard: false, + lose: false, + delay: false, + filter: function (event, player) { + if (player.countMark("sbrende") < 2 || player.hasSkill("sbrende_used")) return true; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) return false; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return false; + } + } + } + return true; + }, + filterTarget: function (card, player, target) { + if (player.getStorage("sbrende_given").includes(target)) return false; + return player != target; + }, + prompt: function (event) { + return "出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为" + lib.skill.sbrende.maxNum + ")"; + }, + check: function (card) { + var player = get.owner(card); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + if (ui.selected.cards.length + player.countMark("sbrende") > lib.skill.sbrende.maxNum) return 0; + if (!ui.selected.cards.length && card.name == "du") return 20; + if (ui.selected.cards.length >= Math.max(2, player.countCards("he") - player.hp)) return 0; + if (player.countCards("he") <= 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("he") > player.hp) return 10 - get.value(card); + if (player.countCards("he") > 2) return 6 - get.value(card); + return -1; + } + return 18 - (ui.selected.cards.length + player.countMark("sbrende")) - get.value(card); + }, + content: function () { + player.addTempSkill("sbrende_given", "phaseUseAfter"); + player.markAuto("sbrende_given", [target]); + player.markAuto("sbrende_givenx", [target]); + player.give(cards, target); + var num = Math.min(lib.skill.sbrende.maxNum - player.countMark("sbrende"), cards.length); + if (num > 0) player.addMark("sbrende", num); + }, + ai: { + order: function (skill, player) { + return player.countMark("sbrende") < 2 ? 6.8 : 5.8; + }, + result: { + target: function (player, target) { + if (!player.hasFriend() && player.hasSkill("sbzhangwu") && ui.selected.cards.length && get.value(ui.selected.cards[0]) > (lib.skill.sbzhangwu.filterTarget(null, player, target) ? 3 : 5)) return -0.1; + 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"); + return Math.max(1, 5 - nh); + }, + }, + threaten: 1.1, + }, + }, + gain: { + audio: "sbrende", + trigger: { player: "phaseUseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.countMark("sbrende") < lib.skill.sbrende.maxNum; + }, + content: function () { + var num = Math.min(lib.skill.sbrende.maxNum - player.countMark("sbrende"), 2); + if (num > 0) player.addMark("sbrende", num); + }, + }, + }, + }, + sbzhangwu: { + audio: 2, + enable: "phaseUse", + skillAnimation: "epic", + animationColor: "orange", + limited: true, + filter: function (event, player) { + if (game.roundNumber <= 1) return false; + if (!game.hasPlayer(current => lib.skill.sbzhangwu.filterTarget(null, player, current))) return false; + return true; + }, + filterTarget: function (card, player, target) { + if (target == player) return false; + return player.getStorage("sbrende_givenx").includes(target); + }, + selectTarget: [-1, -2], + multiline: true, + content: function () { + "step 0"; + player.awakenSkill("sbzhangwu"); + var num = Math.min(game.roundNumber - 1, 3); + var cards = target.getCards("he"), + count = cards.length; + if (count == 0) event.finish(); + else if (count <= num) event._result = { bool: true, cards: cards }; + else target.chooseCard("章武:交给" + get.translation(player) + get.cnNumber(num) + "张牌", true, "he", num); + "step 1"; + if (result.bool) { + target.give(result.cards, player); + } + }, + contentAfter: function () { + "step 0"; + player.recover(3); + "step 1"; + player.removeSkills("sbrende"); + game.delayx(); + }, + ai: { + order: 9, + combo: "sbrende", + result: { + player: function (player, target) { + var targets = game.filterPlayer(current => lib.skill.sbzhangwu.filterTarget(null, player, current)); + if (!targets.length) return 0; + var eff = 0; + for (var target of targets) { + eff += get.effect(target, { name: "shunshou_copy2" }, player, player); + } + eff += 15 - 5 * Math.max(0, 3 - player.getDamagedHp()); + return eff > 15 ? 1 : 0; + }, + }, + }, + }, + sbjijiang: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + zhuSkill: true, + unique: true, + popup: false, + filter: function (event, player) { + if (!player.hasZhuSkill("sbjijiang")) return false; + return game.hasPlayer(current => { + if (current.group != "shu" || player == current || current.hp < player.hp) return false; + return game.hasPlayer(currentx => current.inRange(currentx)); + }); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("sbjijiang"), 2) + .set("filterTarget", (card, player, target) => { + if (!ui.selected.targets.length) return target.group == "shu" && target.hp >= player.hp && target != player; + var current = ui.selected.targets[0]; + return current.inRange(target); + }) + .set("targetprompt", ["进行选择", "出杀对象"]) + .set("multitarget", true) + .set("ai", target => { + var player = _status.event.player; + if (ui.selected.targets.length) { + var current = ui.selected.targets[0]; + return get.effect(target, new lib.element.VCard({ name: "sha" }), current, player); + } + let curs = game.filterPlayer(current => { + return target !== current && target.inRange(current) && target.canUse({ name: "sha", isCard: true }, current, false); + }); + if (!curs.length) { + let att = get.attitude(player, target); + if (att >= 0) return 0; + return -att * get.threaten(target, player); + } + return curs.reduce((max, i) => Math.max(max, get.effect(i, new lib.element.VCard({ name: "sha" }), target, player)), -1); + }) + .forResult(); + }, + async content(event, trigger, player) { + let targets = event.targets; + player.logSkill("sbjijiang", targets, false); + player.line2(targets); + var choiceList = ["视为对" + get.translation(targets[1]) + "使用一张【杀】", "你的下一个出牌阶段开始前,跳过此阶段"], + result; + if (!targets[0].canUse({ name: "sha", isCard: true }, targets[1], false)) result = { index: 1 }; + else + result = await targets[0] + .chooseControl() + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set("choice", get.effect(targets[1], { name: "sha" }, targets[0], targets[0]) > get.effect(targets[0], { name: "lebu" }, targets[0], targets[0]) ? 0 : 1) + .forResult(); + if (result.index == 0) { + targets[0].useCard({ name: "sha", isCard: true }, targets[1], false); + } else { + targets[0].addSkill("sbjijiang_skip"); + } + }, + subSkill: { + skip: { + trigger: { player: "phaseUseBefore" }, + charlotte: true, + forced: true, + content: function () { + trigger.cancel(); + player.removeSkill("sbjijiang_skip"); + }, + }, + }, + }, + //赵云 + sblongdan: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + chargeSkill: true, + filter: function (event, player) { + if (event.type == "wuxie" || !player.hasMark("charge")) return false; + var marked = player.hasSkill("sblongdan_mark", null, null, false); + for (var name of lib.inpile) { + if (!marked && name != "sha" && name != "shan") continue; + if (get.type(name) != "basic") continue; + if (player.hasCard(lib.skill.sblongdan.getFilter(name, player), "hs")) { + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) return true; + if (marked && name == "sha") { + for (var nature of lib.inpile_nature) { + if (event.filterCard(get.autoViewAs({ name, nature }, "unsure"), player, event)) return true; + } + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + var marked = player.hasSkill("sblongdan_mark", null, null, false); + for (var name of lib.inpile) { + if (!marked && name != "sha" && name != "shan") continue; + if (get.type(name) != "basic") continue; + if (player.hasCard(lib.skill.sblongdan.getFilter(name, player), "hs")) { + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) list.push(["基本", "", name]); + if (marked && name == "sha") { + for (var nature of lib.inpile_nature) { + if (event.filterCard(get.autoViewAs({ name, nature }, "unsure"), player, event)) list.push(["基本", "", name, nature]); + } + } + } + } + return ui.create.dialog("龙胆", [list, "vcard"], "hidden"); + }, + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player, + card = { name: button.link[2], nature: button.link[3] }; + if (card.name == "jiu" && Math.min(player.countMark("charge"), player.countCards("h", { type: "basic" })) < 2) return 0; + return player.getUseValue(card, null, true); + }, + backup: function (links, player) { + return { + viewAs: { + name: links[0][2], + nature: links[0][3], + }, + filterCard: lib.skill.sblongdan.getFilter(links[0][2], player), + position: "he", + popname: true, + check: function (card) { + return 6 / Math.max(1, get.value(card)); + }, + precontent: function () { + player.removeMark("charge", 1); + player.addTempSkill("sblongdan_draw"); + }, + }; + }, + prompt: function (links, player) { + var marked = player.hasSkill("sblongdan_mark", null, null, false); + var card = { + name: links[0][2], + nature: links[0][3], + isCard: true, + }; + if (marked) return "将一张基本牌当做" + get.translation(card) + "使用"; + return "将一张" + (card.name == "sha" ? "闪" : "杀") + "当做" + get.translation(card) + "使用"; + }, + }, + hiddenCard: function (player, name) { + if (get.type(name) != "basic" || !player.hasMark("charge")) return false; + var marked = player.hasSkill("sblongdan_mark", null, null, false); + if (!marked && name != "sha" && name != "shan") return false; + return player.hasCard(lib.skill.sblongdan.getFilter(name, player), "hs"); + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + return lib.skill.sblongdan.hiddenCard(player, tag == "respondSha" ? "sha" : "shan"); + }, + order: 9, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + getFilter: function (name, player) { + if (!player.hasSkill("sblongdan_mark", null, null, false)) { + if (name == "sha") return { name: "shan" }; + if (name == "shan") return { name: "sha" }; + return () => false; + } + return { type: "basic" }; + }, + group: "sblongdan_charge", + onremove: function (player) { + player.removeSkill("sblongdan_mark"); + }, + subSkill: { + backup: { audio: "sblongdan" }, + mark: { charlotte: true }, + draw: { + charlotte: true, + trigger: { player: ["useCardAfter"] }, + forced: true, + popup: false, + filter: function (event, player) { + return event.skill == "sblongdan_backup"; + }, + content: function () { + player.draw(); + }, + }, + charge: { + audio: "sblongdan", + trigger: { + global: ["phaseBefore", "phaseEnd"], + player: "enterGame", + }, + forced: true, + filter: function (event, player, name) { + if (player.countMark("charge") > 2) return false; + return name != "phaseBefore" || game.phaseNumber == 0; + }, + content: function () { + player.addMark("charge", 1); + }, + }, + }, + }, + sbjizhu: { + audio: 3, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(lib.filter.notMe, get.prompt("sbjizhu"), "和一名其他角色进行“协力”").set("ai", function (target) { + return get.threaten(target) * Math.sqrt(1 + target.countCards("h")) * (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbjizhu", target); + player.chooseCooperationFor(target, "sbjizhu").set("ai", function (button) { + var base = 0; + switch (button.link) { + case "cooperation_damage": + base = 0.1; + break; + case "cooperation_draw": + base = 0.6; + break; + case "cooperation_discard": + base = 0.1; + break; + case "cooperation_use": + base = 0.6; + break; + } + return base + Math.random(); + }); + player.addAdditionalSkill("cooperation", "sbjizhu_effect"); + } else event.finish(); + "step 2"; + game.delayx(); + }, + subSkill: { + effect: { + audio: "sbjizhu", + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return player.checkCooperationStatus(event.player, "sbjizhu") && player.hasSkill("sblongdan", null, null, false); + }, + content: function () { + game.log(player, "和", trigger.player, "的协力成功"); + player.addTempSkill("sblongdan_mark", { player: "phaseJieshuBegin" }); + game.delayx(); + }, + }, + }, + derivation: "sblongdan_shabi", + ai: { + combo: "sblongdan", + }, + }, + //张飞 + sbpaoxiao: { + audio: 2, + mod: { + cardUsable: function (card) { + if (card.name == "sha") return Infinity; + }, + targetInRange: function (card, player, target) { + if (card.name == "sha" && player.getEquips(1).length > 0) return true; + }, + }, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + return player.hasHistory( + "useCard", + function (evtx) { + return evtx != event && evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; + }, + event + ); + }, + content: function () { + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sbpaoxiao = true; + trigger.baseDamage++; + trigger.directHit.addArray(game.players); + player.addTempSkill("sbpaoxiao_effect", "phaseUseAfter"); + }, + subSkill: { + effect: { + charlotte: true, + trigger: { player: "useCardToPlayered" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.card.storage && event.card.storage.sbpaoxiao && event.target.isIn(); + }, + content: function () { + trigger.target.addTempSkill("fengyin"); + }, + group: "sbpaoxiao_recoil", + }, + recoil: { + charlotte: true, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.storage && event.card.storage.sbpaoxiao && event.player.isIn(); + }, + content: function () { + "step 0"; + player.loseHp(); + "step 1"; + var hs = player.getCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "sbpaoxiao_recoil"); + }); + if (hs.length > 0) player.discard(hs.randomGet()); + }, + }, + }, + }, + sbxieji: { + audio: 3, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(lib.filter.notMe, get.prompt("sbxieji"), "和一名其他角色进行“协力”").set("ai", function (target) { + return get.threaten(target) * Math.sqrt(1 + target.countCards("h")) * (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbxieji", target); + //选择对方的协击条件 + player.chooseCooperationFor(target, "sbxieji").set("ai", function (button) { + var base = 0; + switch (button.link) { + case "cooperation_damage": + base = 0.8; + break; + case "cooperation_draw": + base = 0.1; + break; + case "cooperation_discard": + base = 0.1; + break; + case "cooperation_use": + base = 0.1; + break; + } + return base + Math.random(); + }); + //保证技能cooperation被移除之后 失去该技能 + player.addAdditionalSkill("cooperation", "sbxieji_effect"); + } else event.finish(); + "step 2"; + game.delayx(); + }, + subSkill: { + effect: { + audio: "sbxieji", + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + //判断自己是否有目标为该角色 且已经完成的协力记录 + return player.checkCooperationStatus(event.player, "sbxieji"); + }, + content: function () { + "step 0"; + game.log(player, "和", trigger.player, "的协力成功"); + player + .chooseTarget("协击:请选择【杀】的目标", "你和" + get.translation(trigger.player) + "协力成功,可以视为对至多三名其他角色使用一张【杀】,且此【杀】造成伤害时,你摸等同于伤害值的牌", [1, 3], true, function (card, player, target) { + return player.canUse("sha", target, false); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); + "step 1"; + if (result.bool) { + player.addTempSkill("sbxieji_reward", "sbxieji_effectAfter"); + player.useCard( + { + name: "sha", + isCard: true, + storage: { sbxieji: true }, + }, + "sbxieji_effect", + result.targets + ); + } + }, + }, + reward: { + charlotte: true, + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.card && event.card.storage && event.card.storage.sbxieji && event.getParent().type == "card"; + }, + content: function () { + player.draw(trigger.num); + }, + }, + }, + }, + //徐晃 + sbduanliang: { + audio: 1, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + player + .chooseToDuiben(target) + .set("title", "谋弈") + .set("namelist", ["固守城池", "突出重围", "围城断粮", "擂鼓进军"]) + .set("translationList", [`以防止${get.translation(player)}通过此技能对你使用【决斗】`, `以防止${get.translation(player)}通过此技能对你使用【兵粮寸断】`, `若成功,将牌堆顶的牌当做【兵粮寸断】对${get.translation(target)}使用`, `若成功,视为对${get.translation(target)}使用【决斗】`]) + .set("ai", button => { + var source = _status.event.getParent().player, + target = _status.event.getParent().target; + if (get.effect(target, { name: "juedou" }, source, source) >= 10 && button.link[2] == "db_def2" && Math.random() < 0.5) return 10; + return 1 + Math.random(); + }); + "step 1"; + if (result.bool) { + if (result.player == "db_def1") { + if (target.hasJudge("bingliang")) player.gainPlayerCard(target, "he", true); + else { + if (ui.cardPile.childNodes.length > 0) { + if (player.canUse(get.autoViewAs({ name: "bingliang" }, [ui.cardPile.firstChild]), target, false)) { + player.useCard({ name: "bingliang" }, target, get.cards()); + } + } + } + } else { + var card = { name: "juedou", isCard: true }; + if (player.canUse(card, target)) player.useCard(card, target); + } + } + }, + ai: { + threaten: 1.2, + order: 5.5, + result: { + player: 1, + target: -1, + }, + }, + subSkill: { + true1: { audio: true }, + true2: { audio: true }, + false: { audio: true }, + }, + }, + sbshipo: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(current => { + return current.hp < player.hp || current.hasJudge("bingliang"); + }); + }, + content: function () { + "step 0"; + var list = []; + var choiceList = ["选择一名体力少于你的角色", "选择所有判定区有兵粮寸断的其他角色"]; + var bool = false, + bool2 = false; + game.filterPlayer(current => { + if (current.hp < player.hp) bool = true; + if (current.hasJudge("bingliang")) bool2 = true; + }); + if (bool) list.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (bool2) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + player + .chooseControl(list, "cancel2") + .set("prompt", get.prompt2("sbshipo")) + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var eff = 0, + eff2 = 0; + if (!list.includes("选项一")) eff = Infinity; + if (!list.includes("选项二")) eff2 = Infinity; + game.countPlayer(current => { + if (current.hp < player.hp) { + var effx = get.attitude(player, current) / Math.sqrt(Math.max(0.1, 2 * current.hp + current.countCards("h"))); + if (effx < eff) eff = effx; + } + if (current.hasJudge("bingliang")) eff2 += get.attitude(player, current) / Math.sqrt(Math.max(0.1, 2 * current.hp + current.countCards("h"))); + }); + if (eff > 0 && eff2 > 0) return "cancel2"; + return eff < eff2 ? "选项一" : "选项二"; + })() + ); + "step 1"; + if (result.control == "cancel2") { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + event.finish(); + return; + } + if (result.control == "选项一") { + player.chooseTarget("选择一名体力少于你的角色", (card, player, target) => target.hp < player.hp, true).set("ai", target => -get.attitude(player, target) / Math.sqrt(Math.max(0.1, 2 * target.hp + target.countCards("h")))); + } else { + event._result = { + bool: true, + targets: game.filterPlayer(current => current.hasJudge("bingliang")), + }; + } + "step 2"; + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + if (result.bool) { + var targets = result.targets; + player.logSkill("sbshipo", targets); + event.targets = targets.sortBySeat(); + event.cards = []; + } else event.finish(); + "step 3"; + var target = event.targets.shift(); + event.target = target; + target.chooseCard("交给" + get.translation(player) + "一张手牌,或受到1点伤害").set("ai", card => { + var player = _status.event.player, + source = _status.event.getParent().player; + if (get.damageEffect(player, source, player) > 0) return 0; + if (get.attitude(player, source) > 0) return 1; + if (get.tag(card, "recover") > 0) return 0; + return (player.hp < 2 ? 7 : 5.5) - get.value(card); + }); + "step 4"; + if (result.bool) { + event.cards.addArray(result.cards); + target.give(result.cards, player); + } else { + target.damage(); + } + "step 5"; + if (event.targets.length) event.goto(3); + else { + var cards = event.cards.filter(card => get.owner(card) == player && get.position(card) == "h"); + if (!cards.length) event.finish(); + else event.cards = cards; + } + "step 6"; + player.chooseCardTarget({ + filterCard: function (card, player, target) { + return _status.event.getParent().cards.includes(card); + }, + filterTarget: lib.filter.notMe, + selectCard: [1, event.cards.length], + prompt: "是否将任意张得到的牌交给一名其他角色?", + ai1: function (card) { + var player = _status.event.player; + var val = player.getUseValue(card); + if (val > 0) return 2; + if (player.hp <= 2 && val == 0 && get.value(card) > 5) return 0; + return Math.random() > 0.5 ? 1 : 0; + }, + ai2: function (target) { + var player = _status.event.player, + cards = ui.selected.cards; + var val = 0; + for (var card of cards) { + val += target.getUseValue(card); + } + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); + }, + }); + "step 7"; + if (result.bool) { + var cards = result.cards, + target = result.targets[0]; + player.give(cards, target); + } + }, + }, + //马超 + sbtieji: { + audio: 1, + trigger: { player: "useCardToPlayered" }, + logTarget: "target", + filter: function (event, player) { + return player != event.target && event.card.name == "sha" && event.target.isIn(); + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + target.addTempSkill("fengyin"); + trigger.directHit.add(target); + player + .chooseToDuiben(target) + .set("title", "谋弈") + .set("namelist", ["出阵迎战", "拱卫中军", "直取敌营", "扰阵疲敌"]) + .set("translationList", [`以防止${get.translation(player)}摸2张牌`, `以防止${get.translation(player)}获得你1张牌`, `若成功,你获得${get.translation(target)}1张牌`, `若成功,你摸2张牌`]) + .set("ai", button => { + var source = get.event().getParent().player, + target = get.event().getParent().target; + if (!target.countCards("he") && button.link[2] == "db_def2") return 10; + if (!target.countCards("he") && get.attitude(target, source) <= 0 && button.link[2] == "db_atk1") return 10; + return 1 + Math.random(); + }); + "step 1"; + if (result.bool) { + if (result.player == "db_def1") player.gainPlayerCard(target, "he", true); + else player.draw(2); + } + }, + shaRelated: true, + ai: { + ignoreSkill: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "directHit_ai") { + return get.attitude(player, arg.target) <= 0; + } + if (!arg || arg.isLink || !arg.card || arg.card.name != "sha") return false; + if (!arg.target || get.attitude(player, arg.target) >= 0) return false; + if (!arg.skill || !lib.skill[arg.skill] || lib.skill[arg.skill].charlotte || get.is.locked(arg.skill) || !arg.target.getSkills(true, false).includes(arg.skill)) return false; + }, + directHit_ai: true, + }, + subSkill: { + true1: { audio: true }, + true2: { audio: true }, + false: { audio: true }, + }, + }, + //甘宁 + sbqixi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + event.list = lib.suit.slice(); + event.suits = []; + event.num = 0; + var cards = player.getCards("h"), + map = {}, + max = -Infinity; + for (var card of cards) { + var suit = get.suit(card, player); + if (!map[suit]) map[suit] = 0; + map[suit]++; + if (map[suit] > max) max = map[suit]; + } + for (var i in map) { + if (map[i] == max) event.suits.push(i); + } + "step 1"; + target + .chooseControl(event.list) + .set("prompt", "奇袭:猜测" + get.translation(player) + "手牌中最多的花色") + .set("ai", () => { + var player = _status.event.getParent().player, + controls = _status.event.controls; + if (player.countCards("h") <= 3 && controls.includes("diamond") && Math.random() < 0.3) return "diamond"; + return controls.randomGet(); + }); + "step 2"; + var control = result.control; + target.chat("我猜是" + get.translation(control) + "!"); + game.log(target, "猜测为", "#y" + control); + if (!event.isMine() && !event.isOnline()) game.delayx(); + "step 3"; + var control = result.control; + if (!event.suits.includes(control)) { + player.chat("猜错了!"); + game.log(target, "猜测", "#y错误"); + event.num++; + event.list.remove(control); + player.chooseBool("是否令其重新选择一个花色继续猜测?").set("ai", () => 1); + } else { + player.chat(event.num == 0 ? "这么准?" : "猜对了!"); + game.log(target, "猜测", "#g正确"); + player.showHandcards(); + event.goto(4); + } + "step 4"; + if (result.bool) { + event.goto(1); + } + "step 5"; + if (event.num > 0 && target.countDiscardableCards(player, "hej")) { + player.line(target); + player.discardPlayerCard(target, event.num, true, "hej"); + } + }, + ai: { + order: 10, + result: { + player: 1, + target: function (player, target) { + return get.effect(target, { name: "guohe" }, player, target) * (5 - get.attitude(player, target) / 2); + }, + }, + }, + }, + sbfenwei: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") > 0; + }, + skillAnimation: true, + animationColor: "wood", + limited: true, + position: "he", + filterCard: true, + selectCard: [1, 3], + filterTarget: true, + selectTarget: function () { + return ui.selected.cards.length; + }, + delay: false, + discard: false, + lose: false, + complexSelect: true, + filterOk: function () { + return ui.selected.targets.length == ui.selected.cards.length; + }, + multitarget: true, + multiline: true, + check: function (card) { + return 7 - get.value(card); + }, + content: function () { + "step 0"; + player.awakenSkill("sbfenwei"); + for (var i = 0; i < cards.length; i++) { + targets[i].addToExpansion(cards[i], player, "give").gaintag.add("sbfenwei_effect"); + } + "step 1"; + player.addSkill("sbfenwei_effect"); + player.draw(cards.length); + }, + intro: { + content: "limited", + }, + ai: { + order: 6.9, + result: { + target: function (player, target) { + if ( + game.hasPlayer(current => { + return get.rawAttitude(player, current) > 0 && current != player && get.attitude(player, current) <= 0; + }) && + game.countPlayer(current => { + return get.attitude(player, current) > 0; + }) <= 2 + ) + return 0; + return 1; + }, + }, + }, + subSkill: { + effect: { + audio: "sbfenwei", + trigger: { + global: "useCardToTarget", + }, + charlotte: true, + forced: true, + filter: function (event, player) { + return event.target.getExpansions("sbfenwei_effect").length > 0 && get.type2(event.card) == "trick"; + }, + content: function () { + "step 0"; + var choiceList = ["令" + get.translation(trigger.target) + "获得其“威”", "移去" + get.translation(trigger.target) + "的“威”,取消" + get.translation(trigger.card) + "对其的目标"]; + player + .chooseControl() + .set("choiceList", choiceList) + .set("prompt", "奋威:请选择一项") + .set("ai", () => { + var player = _status.event.player, + evt = _status.event.getTrigger(); + if (get.effect(evt.target, evt.card, evt.player, player) < -10) return 1; + return 0; + }); + "step 1"; + var cards = trigger.target.getExpansions("sbfenwei_effect"); + if (result.index == 0) { + trigger.target.gain(cards, "gain2", "fromStorage"); + } else { + trigger.target.loseToDiscardpile(cards); + trigger.targets.remove(trigger.target); + trigger.getParent().triggeredTargets2.remove(trigger.target); + trigger.untrigger(); + } + }, + marktext: "威", + intro: { + name: "威", + markcount: "expansion", + content: "expansion", + }, + }, + }, + }, + //甄宓 + sbluoshen: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("sbluoshen")).set("ai", target => { + var eff = 0; + var num = Math.ceil(game.countPlayer() / 2), + players = game + .filterPlayer(current => current != player) + .sortBySeat(target) + .slice(0, num); + for (var targetx of players) { + eff += get.attitude(player, targetx) * Math.sqrt(targetx.countCards("h")); + } + return 1 - eff; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbluoshen", target); + player.addTempSkill("sbluoshen_add"); + event.targets = game + .filterPlayer(current => current != player) + .sortBySeat(target) + .slice(0, Math.ceil(game.countPlayer() / 2)); + } else event.finish(); + "step 2"; + var target = event.targets.shift(); + event.target = target; + player.line(target); + if (!target.countCards("h")) event._result = { bool: false }; + else + target + .chooseCard("展示一张手牌", true) + .set("ai", card => { + var val = _status.event.goon ? 15 : 5; + if (get.color(card) == "black") return val - get.value(card); + return 7 - get.value(card); + }) + .set("goon", get.attitude(target, player) > 0); + "step 3"; + if (result.bool) { + var card = result.cards[0]; + target.showCards(card, get.translation(target) + "【洛神】展示"); + if (get.color(card) == "black") { + player.gain(card, target, "give", "bySelf").gaintag.add("sbluoshen"); + } else if (get.color(card) == "red") { + target.discard(card); + } + } + "step 4"; + if (targets.length) event.goto(2); + }, + subSkill: { + add: { + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("sbluoshen")) { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("sbluoshen")) { + return false; + } + }, + }, + onremove: function (player) { + player.removeGaintag("sbluoshen"); + }, + }, + }, + }, + //曹操 + sbjianxiong: { + audio: 2, + trigger: { player: "damageEnd" }, + group: "sbjianxiong_mark", + filter: function (event, player) { + return (get.itemtype(event.cards) == "cards" && event.cards.some(i => get.position(i, true) == "o")) || 1 - player.countMark("sbjianxiong") > 0; + }, + prompt2: function (event, player) { + var gain = get.itemtype(event.cards) == "cards" && event.cards.some(i => get.position(i, true) == "o"), + draw = 1 - player.countMark("sbjianxiong"); + var str = ""; + if (gain) str += "获得" + get.translation(event.cards); + if (gain && draw > 0) str += "并"; + if (draw > 0) str += "摸" + get.cnNumber(1 - player.countMark("sbjianxiong")) + "张牌"; + if (player.countMark("sbjianxiong")) str += ",然后可以弃1枚“治世”"; + return str; + }, + content: function () { + "step 0"; + if (get.itemtype(trigger.cards) == "cards" && trigger.cards.some(i => get.position(i, true) == "o")) { + player.gain(trigger.cards, "gain2"); + } + var num = player.countMark("sbjianxiong"); + if (1 - num > 0) { + player.draw(1 - num, "nodelay"); + } + if (!num) event.finish(); + "step 1"; + player.chooseBool("是否弃1枚“治世”?").set("ai", () => { + var player = _status.event.player, + current = _status.currentPhase; + if (get.distance(current, player, "absolute") > 3 && player.hp <= 2) return true; + return false; + }); + "step 2"; + if (result.bool) { + player.removeMark("sbjianxiong", 1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target) { + var cards = card.cards, + evt = _status.event; + if (evt.player == target && card.name == "damage" && evt.getParent().type == "card") cards = evt.getParent().cards.filterInD(); + if (target.hp <= 1) return; + if (get.itemtype(cards) != "cards") return; + for (var i of cards) { + if (get.name(i, target) == "tao") return [1, 5]; + } + if (get.value(cards, target) >= 7 + target.getDamagedHp()) return [1, 3]; + return [1, 0.55 + 0.05 * Math.max(0, 1 - target.countMark("sbjianxiong"))]; + } + }, + }, + }, + marktext: "治", + intro: { + name: "治世", + name2: "治世", + content: "mark", + }, + subSkill: { + mark: { + audio: "sbjianxiong", + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + var map = {}; + var list = []; + for (var i = 1; i <= 2; i++) { + var cn = get.cnNumber(i, true); + map[cn] = i; + list.push(cn); + } + event.map = map; + list.push("cancel2"); + player + .chooseControl(list, function () { + return get.cnNumber(2, true); + }) + .set("prompt", "奸雄:获得任意枚“治世”标记"); + "step 1"; + if (result.control != "cancel2") player.addMark("sbjianxiong", event.map[result.control]); + }, + }, + }, + }, + sbqingzheng: { + audio: 2, + audioname: ["mb_caomao"], + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + direct: true, + content: function () { + "step 0"; + var num = 3 - player.countMark("sbjianxiong"); + var prompt = "###" + get.prompt("sbqingzheng") + "###弃置" + get.cnNumber(num) + "种花色的所有牌"; + var next = player.chooseButton([prompt, [lib.suit.map(i => ["", "", "lukai_" + i]), "vcard"]], num); + next.set("filterButton", button => { + var player = _status.event.player; + var cards = player.getCards("h", { suit: button.link[2].slice(6) }); + return cards.length > 0 && cards.filter(card => lib.filter.cardDiscardable(card, player, "sbqingzheng")).length == cards.length; + }); + next.set("ai", button => { + var player = _status.event.player; + return ( + player.countMark("sbjianxiong") * 15 - + player + .getCards("h", { suit: button.link[2].slice(6) }) + .map(i => get.value(i)) + .reduce((p, c) => p + c, 0) + ); + }); + next.set("custom", { + replace: { + button: function (button) { + if (!_status.event.isMine()) return; + if (button.classList.contains("selectable") == false) return; + var cards = _status.event.player.getCards("h", { + suit: button.link[2].slice(6), + }); + if (cards.length) { + var chosen = cards.filter(i => ui.selected.cards.includes(i)).length == cards.length; + if (chosen) { + ui.selected.cards.removeArray(cards); + cards.forEach(card => { + card.classList.remove("selected"); + card.updateTransform(false); + }); + } else { + ui.selected.cards.addArray(cards); + cards.forEach(card => { + card.classList.add("selected"); + card.updateTransform(true); + }); + } + } + if (button.classList.contains("selected")) { + ui.selected.buttons.remove(button); + button.classList.remove("selected"); + if (_status.multitarget || _status.event.complexSelect) { + game.uncheck(); + game.check(); + } + } else { + button.classList.add("selected"); + ui.selected.buttons.add(button); + } + var custom = _status.event.custom; + if (custom && custom.add && custom.add.button) { + custom.add.button(); + } + game.check(); + }, + }, + add: next.custom.add, + }); + "step 1"; + if (result.bool) { + var cards = result.cards; + if (!cards.length) { + var suits = result.links.map(i => i[2].slice(6)); + cards = player.getCards("h", card => suits.includes(get.suit(card, player))); + } + event.cards = cards; + if (!cards.length) event.finish(); + else + player + .chooseTarget("清正:观看一名其他角色的手牌并弃置其中一种花色的所有牌", (card, player, target) => { + return target != player && target.countCards("h"); + }) + .set("ai", target => { + var player = _status.event.player, + att = get.attitude(player, target); + if (att >= 0) return 0; + return 1 - att / 2 + Math.sqrt(target.countCards("h")); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("sbqingzheng", target); + player.discard(cards); + var list = []; + var dialog = ["清正:弃置" + get.translation(target) + "一种花色的所有牌"]; + for (var suit of lib.suit.concat("none")) { + if (target.countCards("h", { suit: suit })) { + dialog.push('
    ' + get.translation(suit + "2") + "牌
    "); + dialog.push(target.getCards("h", { suit: suit })); + list.push(suit); + } + } + if (list.length) { + player + .chooseControl(list) + .set("dialog", dialog) + .set("ai", () => { + return _status.event.control; + }) + .set( + "control", + (() => { + var getv = cards => cards.map(i => get.value(i)).reduce((p, c) => p + c, 0); + return list.sort((a, b) => { + return getv(target.getCards("h", { suit: b })) - getv(target.getCards("h", { suit: a })); + })[0]; + })() + ); + } + } else event.finish(); + "step 3"; + var cards2 = target.getCards("h", { suit: result.control }); + event.cards2 = cards2; + target.discard(cards2, "notBySelf").set("discarder", player); + "step 4"; + if (event.cards2.length < cards.length) target.damage(); + "step 5"; + if (player.countMark("sbjianxiong") < 2 && player.hasSkill("sbjianxiong")) { + player.chooseBool("是否获得1枚“治世”?").set("ai", () => (Math.random() < 0.5 ? 0 : 1)); + } else event.finish(); + "step 6"; + if (result.bool) { + player.addMark("sbjianxiong", 1); + } + }, + ai: { combo: "sbjianxiong" }, + }, + sbhujia: { + audio: 2, + trigger: { player: "damageBegin4" }, + zhuSkill: true, + direct: true, + filter: function (event, player) { + return ( + !player.hasSkill("sbhujia_used") && + game.hasPlayer(current => { + return current != player && current.group == "wei" && player.hasZhuSkill("sbhujia", current); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("sbhujia"), "将" + get.translation(trigger.source) + "即将对你造成的" + trigger.num + "点伤害转移给一名其他魏势力角色", (card, player, target) => { + return target != player && target.group == "wei" && player.hasZhuSkill("sbhujia", target); + }) + .set("ai", target => { + var player = _status.event.player, + evt = _status.event.getTrigger(); + return get.damageEffect(target, evt.source, player, evt.nature) - _status.event.eff; + }) + .set("eff", get.damageEffect(player, trigger.source, player, trigger.nature)); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbhujia", target); + player.addTempSkill("sbhujia_used", "roundStart"); + trigger.cancel(); + if (trigger.source) target.damage(trigger.source, trigger.nature, trigger.num).set("card", trigger.card).set("cards", trigger.cards); + else target.damage("nosource", trigger.nature, trigger.num).set("card", trigger.card).set("cards", trigger.cards); + } + }, + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if ( + get.tag(card, "damage") && + !target.hasSkill("sbhujia_used") && + game.hasPlayer(current => { + return current != target && current.group == "wei" && target.hasZhuSkill("sbhujia", current); + }) + ) + return 0.8; + }, + }, + threaten: function (player, target) { + if (target.countCards("h") == 0) return 2; + }, + }, + subSkill: { + used: { charlotte: true }, + }, + }, + //张角 + sbleiji: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countMark("sbguidao") >= 4; + }, + filterTarget: lib.filter.notMe, + content: function () { + player.removeMark("sbguidao", 4); + target.damage("thunder"); + }, + ai: { + combo: "sbguidao", + order: 9, + result: { + target: function (player, target) { + return get.damageEffect(target, player, target, "thunder"); + }, + }, + }, + }, + sbguidao: { + audio: 2, + trigger: { + global: ["phaseBefore", "damageEnd"], + player: "enterGame", + }, + forced: true, + locked: false, + group: "sbguidao_defend", + filter: function (event, player) { + if (player.countMark("sbguidao") >= 8) return false; + if (event.name == "damage") return event.hasNature() && !player.hasSkill("sbguidao_forbid"); + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + var num = 2; + if (trigger.name != "damage") num += 2; + num = Math.min(8 - player.countMark("sbguidao"), num); + player.addMark("sbguidao", num); + }, + marktext: "兵", + intro: { + name: "道兵", + name2: "道兵", + content: "共有$枚“道兵”", + }, + subSkill: { + defend: { + audio: "sbguidao", + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return player.countMark("sbguidao") >= 2; + }, + prompt2: "弃2枚“道兵”,防止伤害", + check: function (event, player) { + return event.num >= 2 || player.hp <= event.num; + }, + content: function () { + trigger.cancel(); + player.removeMark("sbguidao", 2); + if (player != _status.currentPhase) { + player.addTempSkill("sbguidao_forbid", { player: "phaseBegin" }); + } + }, + }, + forbid: { charlotte: true }, + }, + }, + sbhuangtian: { + audio: 2, + trigger: { + player: "phaseBegin", + }, + forced: true, + zhuSkill: true, + group: "sbhuangtian_mark", + filter: function (event, player) { + if (player.phaseNumber > 1 || game.phaseNumber > 1) return false; + if (!player.hasZhuSkill("sbhuangtian")) return false; + return ( + !game.hasPlayer(function (current) { + return current.countCards("hej", "taipingyaoshu"); + }) && + !Array.from(ui.cardPile.childNodes) + .concat(Array.from(ui.discardPile.childNodes)) + .concat(Array.from(ui.ordering.childNodes)) + .map(i => i.name) + .includes("taipingyaoshu") + ); + }, + content: function () { + "step 0"; + if (!lib.inpile.contains("taipingyaoshu")) { + lib.inpile.push("taipingyaoshu"); + } + event.card = game.createCard2("taipingyaoshu", "heart", 3); + "step 1"; + if (card) player.equip(card); + }, + subSkill: { + mark: { + audio: "sbhuangtiang", + trigger: { global: "damageSource" }, + forced: true, + zhuSkill: true, + filter: function (event, player) { + if (!player.hasZhuSkill("sbhuangtian") || !player.hasSkill("sbguidao", null, false, false)) return false; + if (!event.source || player == event.source || event.source.group != "qun") return false; + if (player.hasSkill("sbguidao") && player.countMark("sbguidao") >= 8) return false; + if (player.countMark("sbhuangtian_count") >= 4) return false; + return true; + }, + content: function () { + var num = Math.min(8 - player.countMark("sbhuangtian_count"), 2); + player.addMark("sbguidao", num); + player.addTempSkill("sbhuangtian_count", "roundStart"); + player.addMark("sbhuangtian_count", num, false); + }, + }, + count: { onremove: true }, + }, + }, + //夏侯氏 + sbqiaoshi: { + audio: 2, + trigger: { player: "damageEnd" }, + usable: 1, + direct: true, + filter: function (event, player) { + return event.source && event.source != player && event.source.isIn(); + }, + content: function () { + "step 0"; + trigger.source + .chooseBool("樵拾:是否令" + get.translation(player) + "回复" + trigger.num + "点体力,然后你摸两张牌?") + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.recoverEffect(player, trigger.source, trigger.source) + 2 * get.effect(trigger.source, { name: "draw" }, trigger.source) > 5); + "step 1"; + if (result.bool) { + player.logSkill("sbqiaoshi"); + trigger.source.line(player, "green"); + player.recover(trigger.num); + trigger.source.draw(2); + } else player.storage.counttrigger.sbqiaoshi--; + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (get.attitude(target, player) <= 0 || target == player) return; + if (target.storage.counttrigger && target.storage.counttrigger.sbqiaoshi) return; + if (target.hp <= 1 && !player.canSave(target)) return; + return [0, 0.5, 0, 0.5]; + } + }, + }, + }, + }, + sbyanyu: { + enable: "phaseUse", + usable: 2, + filterCard: { name: "sha" }, + selectCard: 1, + group: "sbyanyu_draw", + check: () => 1, + content: function () { + player.draw(); + }, + subSkill: { + draw: { + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return player.getHistory("useSkill", evt => { + if (evt.skill != "sbyanyu") return false; + var evtx = evt.event.getParent("phaseUse"); + if (!evtx || evtx != _status.event.getParent("phaseUse")) return; + return true; + }).length; + }, + direct: true, + content: function () { + "step 0"; + event.num = + 3 * + player.getHistory("useSkill", evt => { + if (evt.skill != "sbyanyu") return false; + var evtx = evt.event.getParent("phaseUse"); + if (!evtx || evtx != _status.event.getParent("phaseUse")) return; + return true; + }).length; + player.chooseTarget(get.prompt("sbyanyu"), "令一名其他角色摸" + get.cnNumber(event.num) + "张牌", lib.filter.notMe).set("ai", target => { + var player = _status.event.player; + return get.effect(target, { name: "draw" }, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbyanyu_draw", target); + target.draw(num); + } + }, + }, + }, + ai: { + order: function (obj, player) { + if ( + game.hasPlayer(current => current != player && get.attitude(player, current) > 0) && + player.getHistory("useSkill", evt => { + if (evt.skill != "sbyanyu") return false; + var evtx = evt.event.getParent("phaseUse"); + if (!evtx || evtx != _status.event.getParent("phaseUse")) return; + return true; + }).length < 2 + ) + return 9; + return 2; + }, + result: { + player: 1, + }, + }, + }, + //曹仁 + sbjushou: { + audio: 3, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.isTurnedOver(); + }, + filterCard: true, + selectCard: [1, 2], + check: function (card) { + if (ui.selected.cards.length + _status.event.player.hujia >= 5) return 0; + return 6.5 - get.value(card); + }, + position: "he", + group: ["sbjushou_damage", "sbjushou_draw"], + content: function () { + player.turnOver(); + player.changeHujia(cards.length, null, true); + }, + ai: { + order: 5, + result: { + player: 1, + }, + }, + subSkill: { + damage: { + audio: "sbjushou", + trigger: { + player: "damageEnd", + }, + filter: function (event, player) { + return player.isTurnedOver(); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("翻面", "获得1点护甲", "cancel2") + .set("ai", () => { + if (_status.event.player.hujia >= 3) return 0; + return 1; + }) + .set("prompt", get.prompt("sbjushou")) + .set("prompt2", "选择一项"); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + return; + } + player.logSkill("sbjushou"); + if (result.control == "翻面") { + player.turnOver(); + } else { + player.changeHujia(1, null, true); + } + }, + ai: { + effect: { + target: function (card, player, target) { + if (!target.isTurnedOver()) return; + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if ( + (card.name == "sha" && !player.hasSkill("jiu")) || + target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ) + return "zerotarget"; + } + }, + }, + }, + }, + draw: { + audio: "sbjushou", + trigger: { player: "turnOverAfter" }, + forced: true, + locked: false, + filter: function (event, player) { + return !player.isTurnedOver() && player.hujia > 0; + }, + content: function () { + player.draw(player.hujia); + }, + }, + }, + }, + sbjiewei: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hujia > 0; + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h"); + }, + content: function () { + player.changeHujia(-1); + player.gainPlayerCard(target, "visible", true, "h").set("ai", function (button) { + return get.value(button.link, _status.event.target); + }); + }, + ai: { + order: 8, + result: { + target: -1, + }, + }, + }, + //周瑜 + sbyingzi: { + audio: 2, + audioname: ["sb_sunce"], + trigger: { player: "phaseDrawBegin2" }, + forced: true, + getNum: function (player) { + return (player.countCards("h") >= 2) + (player.hp >= 2) + (player.countCards("e") >= 1); + }, + filter: function (event, player) { + return !event.numFixed && lib.skill.sbyingzi.getNum(player) > 0; + }, + content: function () { + var num = lib.skill.sbyingzi.getNum(player); + trigger.num += num; + player.addTempSkill("sbyingzi_limit"); + player.addMark("sbyingzi_limit", num, false); + }, + ai: { + threaten: 2, + }, + subSkill: { + limit: { + charlotte: true, + forced: true, + onremove: true, + marktext: "英", + intro: { + content: "本回合手牌上限+#", + }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("sbyingzi_limit"); + }, + }, + }, + }, + }, + sbfanjian: { + audio: 2, + enable: "phaseUse", + usable: 5, + filter: function (event, player) { + return !player.hasSkill("sbfanjian_ban"); + }, + chooseButton: { + dialog: function () { + return ui.create.dialog("###反间###" + get.translation("sbfanjian_info")); + }, + chooseControl: function (event, player) { + var suits = lib.suit.slice(); + suits.push("cancel2"); + return suits; + }, + check: function (event, player) { + var suits = lib.suit.slice(); + suits = suits.filter(suit => !player.getStorage("sbfanjian_guessed").includes(suit)); + return suits.randomGet(); + }, + backup: function (result, player) { + return { + audio: "sbfanjian", + filterCard: function (card, player) { + return !player.getStorage("sbfanjian_guessed").includes(get.suit(card, player)); + }, + suit: result.control, + position: "h", + filterTarget: lib.filter.notMe, + check: function (card) { + return 6 - get.value(card); + }, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + var suit = get.suit(cards, player); + event.claimSuit = lib.skill.sbfanjian_backup.suit; + event.cardSuit = suit; + player.addTempSkill("sbfanjian_guessed"); + var claim = get.translation(event.claimSuit + "2"); + player.chat("我声明" + claim); + game.log(player, "声明了", "#y" + claim); + var choiceList = ["猜测此牌花色为" + claim, "猜测此牌花色不为" + claim, "不猜测,你翻面并令其〖反间〗失效"]; + target + .chooseControl() + .set("choiceList", choiceList) + .set("prompt", get.translation(player) + "对你发动了【反间】并选择了一张牌,请选择一项") + .set("ai", () => { + var player = _status.event.player, + user = _status.event.getParent().player, + claim = _status.event.getParent().claimSuit, + suit = _status.event.getParent().cardSuit; + if (player.isTurnedOver()) return 2; + var lose = get.effect(player, { name: "losehp" }, user, player); + if (user.getStorage("sbfanjian_guessed").includes(claim) && claim == suit) return lose <= 0 ? 0 : 1; + if (get.attitude(player, user) > 0) return 0; + var list = [0, 1]; + if (player.hp <= 1 && player.getFriends().length > 0) list.push(2); + return list.randomGet(); + }); + "step 1"; + player.markAuto("sbfanjian_guessed", [event.cardSuit]); + if (result.index == 2) { + game.log(target, "选择", "#y不猜测"); + target.chat("不猜!"); + target.turnOver(); + } else { + var claim = get.translation(event.claimSuit + "2"); + target.chat("我猜花色" + (result.index == 1 ? "不" : "") + "为" + claim); + game.log(target, "猜测花色", "#g" + (result.index == 1 ? "不" : "") + "为" + claim); + } + if (event.isMine() && !event.isOnline()) game.delayx(); + "step 2"; + target.gain(cards, player, "giveAuto", "bySelf"); + "step 3"; + if ((result.index == 0 && event.claimSuit != event.cardSuit) || (result.index == 1 && event.claimSuit == event.cardSuit)) { + game.log(target, "猜测", "#y错误"); + target.loseHp(); + } else { + if (result.index != 2) game.log(target, "猜测", "#g正确"); + player.addTempSkill("sbfanjian_ban"); + } + }, + ai: { + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var val = get.value(ui.selected.cards, target); + if (val < 0) return val + get.effect(target, { name: "losehp" }, player, target); + if (val > 5 || get.value(ui.selected.cards, player) > 5) return target.isTurnedOver() ? 5 : 0; + if (target.isTurnedOver()) return 1; + return get.effect(target, { name: "losehp" }, player, target); + }, + }, + }, + }; + }, + prompt: function (result) { + return "你选择了" + get.translation(result.control) + ",请选择一张手牌和【反间】的目标"; + }, + }, + subSkill: { + guessed: { onremove: true, charlotte: true }, + ban: { charlotte: true }, + backup: {}, + }, + ai: { + order: 4, + result: { player: 1 }, + }, + }, + //黄盖 + sbkurou: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + group: "sbkurou_gain", + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt("sbkurou"), + prompt2: "交给其他角色一张牌,若此牌为【桃】或【酒】,你失去2点体力,否则你失去1点体力", + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + ai1: function (card) { + if ((player.hp <= 1 && !player.canSave(player)) || player.hujia >= 5) return 0; + if ( + get.value(card, player) > 6 && + !game.hasPlayer(current => { + return current != player && get.attitude(current, player) > 0 && !current.hasSkillTag("nogain"); + }) + ) + return 0; + if ( + player.hp >= 2 && + (card.name == "tao" || + (card.name == "jiu" && + player.countCards("hs", cardx => { + return cardx != card && get.tag(cardx, "save"); + }))) && + player.hujia <= 1 + ) + return 10; + if (player.hp <= 1 && !player.canSave(player)) return 0; + return 1 / Math.max(0.1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards.length) { + var val = get.value(ui.selected.cards[0]); + att *= val >= 0 ? 1 : -1; + } + if (target.hasSkillTag("nogain")) att /= 9; + return 15 + att; + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0], + card = result.cards[0]; + player.logSkill("sbkurou", target); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15); + player.give(card, target); + player.loseHp(["tao", "jiu"].includes(get.name(card, target)) ? 2 : 1); + } + }, + ai: { + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.hp <= 0 && player.isPhaseUsing(); + }, + }, + subSkill: { + gain: { + audio: "sbkurou", + trigger: { player: "loseHpEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.isIn() && player.hujia < 5; + }, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + player.changeHujia(2, null, true); + "step 2"; + if (--event.count > 0) { + player.logSkill("sbkurou_gain"); + event.goto(1); + } + }, + ai: { + maihp: true, + effect: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, 1]; + return 1.2; + } + if (get.tag(card, "loseHp")) { + if (target.hp <= 1 || target.hujia >= 5) return; + return [1, 1]; + } + }, + }, + }, + }, + }, + sbzhaxiang: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + group: "sbzhaxiang_draw", + filter: function (event, player) { + return player.getHistory("useCard").length <= player.getDamagedHp(); + }, + content: function () { + trigger.directHit.addArray(game.filterPlayer()); + }, + ai: { + threaten: 1.5, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return player.countUsed() < player.getDamagedHp(); + }, + }, + mod: { + targetInRange: function (card, player) { + if (player.countUsed() < player.getDamagedHp()) return true; + }, + cardUsable: function (card, player) { + if (player.countUsed() < player.getDamagedHp()) return Infinity; + }, + aiOrder: function (player, card, num) { + if (player.countUsed() >= player.getDamagedHp()) return; + var numx = get.info(card).usable; + if (typeof numx == "function") numx = num(card, player); + if (typeof numx == "number") return num + 10; + }, + }, + subSkill: { + draw: { + audio: "sbzhaxiang", + mod: { + aiOrder: function (player, card, num) { + if (num > 0 && _status.event && _status.event.type == "phase" && get.tag(card, "recover")) return num / 5; + }, + }, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + return !event.numFixed && player.getDamagedHp() > 0; + }, + content: function () { + trigger.num += player.getDamagedHp(); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "recover") && target.hp > 0 && target.needsToDiscard() < 1) return [0, 0]; + }, + }, + }, + }, + }, + }, + //孙权 + sbzhiheng: { + audio: 2, + audioname: ["shen_caopi"], + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip") return num; + let eq = player.getEquip(get.subtype(card)); + if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp)) return 0; + }, + }, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: lib.filter.cardDiscardable, + discard: false, + lose: false, + delay: false, + selectCard: [1, Infinity], + prompt: function (event) { + var count = _status.event.player.countMark("sbtongye"); + var str = "出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你以此法弃置的牌包括你所有手牌,则你多摸" + get.cnNumber(count + 1) + "张牌"; + if (count > 0) str += ",并弃1枚“业”"; + str += "。"; + return str; + }, + check: function (card) { + var player = _status.event.player; + if ( + get.position(card) == "h" && + !player.countCards("h", "du") && + (player.hp > 2 || + !player.countCards("h", function (card) { + return get.value(card) >= 8; + })) + ) { + return 1; + } + return 6 - get.value(card); + }, + content: function () { + "step 0"; + player.discard(cards); + event.num = 1; + var hs = player.getCards("h"); + if (!hs.length) event.num = 0; + for (var i = 0; i < hs.length; i++) { + if (!cards.includes(hs[i])) { + event.num = 0; + break; + } + } + "step 1"; + var all = event.num; + player.draw((all ? 1 + player.countMark("sbtongye") : 0) + cards.length); + if (all) player.removeMark("sbtongye", 1); + }, + ai: { + order: function (item, player) { + if (player.hasCard(i => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; + return 10; + }, + result: { + player: 1, + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") return (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && !player.getStat().skill.sbzhiheng && player.hasCard(card => get.name(card) !== "tao", "h"); + }, + threaten: 1.56, + }, + }, + sbtongye: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + onremove: true, + content: function () { + "step 0"; + player + .chooseControl("变化", "不变") + .set("prompt", "统业:猜测场上装备数是否于你下回合准备阶段前发生变化") + .set("ai", () => { + let player = _status.event.player; + if (game.countPlayer() > 3) return "变化"; + if ( + game.countPlayer(function (current) { + return current.hasCard({ type: "equip" }, "e"); + }) < game.countPlayer() + ) + return "变化"; + if ( + game.countPlayer() == 2 && + game.countPlayer(function (current) { + if (current != player) return current.countCards("e", { type: "equip" }) + current.countDisabledSlot(); + }) >= 5 + ) + return "不变"; + if (Math.random() < 0.3) return "变化"; + return "不变"; + }); + "step 1"; + if (result.control == "变化") { + player.addSkill("sbtongye_change", 1); + player.chat("变!"); + } else { + player.addSkill("sbtongye_nochange", 1); + player.chat("不变!"); + } + var num = game + .filterPlayer() + .map(i => i.countCards("e")) + .reduce((p, c) => p + c, 0); + player.removeMark("sbtongye_count", player.countMark("sbtongye_count"), false); + if (num > 0) player.addMark("sbtongye_count", num, false); + player.addSkill("sbtongye_settle"); + }, + marktext: "业", + intro: { + name: "统业", + name2: "业", + content: "mark", + }, + ai: { + combo: "sbzhiheng", + }, + subSkill: { + broadcast: { + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + charlotte: true, + silent: true, + filter: function (event, player) { + var num = 0; + game.countPlayer(function (current) { + var evt = event.getl(current); + if (evt && evt.es) num += evt.es.length; + }); + if (event.name == "equip") num--; + return num != 0; + }, + content: function () { + if (player.hasSkill("sbtongye_change")) player.markSkill("sbtongye_change"); + if (player.hasSkill("sbtongye_nochange")) player.markSkill("sbtongye_nochange"); + }, + }, + settle: { + audio: "sbtongye", + init: function (player) { + player.addSkill("sbtongye_broadcast"); + }, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return player.hasSkill("sbtongye_change") || player.hasSkill("sbtongye_nochange"); + }, + content: function () { + var delta = + game + .filterPlayer() + .map(i => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count"); + if ((player.hasSkill("sbtongye_change") && delta != 0) || (player.hasSkill("sbtongye_nochange") && delta == 0)) { + game.log(player, "猜测", "#g正确"); + if (player.countMark("sbtongye") < 2) player.addMark("sbtongye", 1); + } else { + game.log(player, "猜测", "#y错误"); + player.removeMark("sbtongye", 1); + } + player.removeSkill("sbtongye_change"); + player.removeSkill("sbtongye_nochange"); + player.removeSkill("sbtongye_settle"); + player.removeSkill("sbtongye_broadcast"); + }, + }, + change: { + charlotte: true, + mark: true, + marktext: "变", + intro: { + markcount: function (storage, player) { + return ( + game + .filterPlayer() + .map(i => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count") + ); + }, + mark: function (dialog, storage, player) { + dialog.addText(get.translation(player) + "猜测场上装备数发生变化"); + var delta = + game + .filterPlayer() + .map(i => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count"); + if (delta == 0) dialog.addText("(当前未发生变化)"); + else dialog.addText("(当前已" + (delta > 0 ? "增加" : "减少") + get.cnNumber(Math.abs(delta)) + "张装备牌)"); + }, + }, + }, + nochange: { + charlotte: true, + mark: true, + marktext: '', + intro: { + markcount: function (storage, player) { + return ( + game + .filterPlayer() + .map(i => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count") + ); + }, + mark: function (dialog, storage, player) { + dialog.addText(get.translation(player) + "猜测场上装备数不发生变化"); + var delta = + game + .filterPlayer() + .map(i => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count"); + if (delta == 0) dialog.addText("(当前未发生变化)"); + else dialog.addText("(当前已" + (delta > 0 ? "增加" : "减少") + get.cnNumber(Math.abs(delta)) + "张装备牌)"); + }, + }, + }, + }, + }, + sbjiuyuan: { + audio: 2, + trigger: { global: "useCard" }, + forced: true, + zhuSkill: true, + group: "sbjiuyuan_recover", + filter: function (event, player) { + return event.card.name == "tao" && player != event.player && event.player.group == "wu" && event.player.isIn() && player.hasZhuSkill("sbjiuyuan", event.player); + }, + content: function () { + player.draw(); + }, + subSkill: { + recover: { + audio: "sbjiuyuan", + trigger: { target: "taoBegin" }, + zhuSkill: true, + forced: true, + filter: function (event, player) { + if (event.player == player) return false; + if (!player.hasZhuSkill("sbjiuyuan", event.player)) return false; + if (event.player.group != "wu") return false; + return true; + }, + content: function () { + trigger.baseDamage++; + }, + }, + }, + }, + //孙尚香 + sbjieyin: { + trigger: { player: "phaseUseBegin" }, + forced: true, + locked: false, + dutySkill: true, + group: ["sbjieyin_init", "sbjieyin_fail"], + filter: function (event, player) { + return game.hasPlayer(current => current.hasMark("sbjieyin_mark")); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => current.hasMark("sbjieyin_mark")); + event.targets = targets; + "step 1"; + var target = targets.shift(); + event.target = target; + var str = target.hasSkill("sbjieyin_marked") ? "移去" : "移动或移去"; + var num = Math.min(2, Math.max(1, target.countCards("h"))); + target + .chooseCard("交给" + get.translation(player) + get.cnNumber(num) + "张手牌,然后获得1点护甲;或令其" + str + "你的所有“助”标记", num) + .set("ai", card => { + if (_status.event.goon) return 100 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) > 1); + "step 2"; + if (result.bool) { + target.give(result.cards, player); + target.changeHujia(1, null, true); + event.goto(4); + } else { + if (!game.hasPlayer(current => current != player && current != target) || target.hasSkill("sbjieyin_marked")) event._result = { bool: false }; + else + player + .chooseTarget("结姻:是否移动" + get.translation(target) + "的“助”?", (card, player, target) => { + return target != player && target != _status.event.getParent().target; + }) + .set("ai", target => get.attitude(_status.event.player, target) - 1); + target.addSkill("sbjieyin_marked"); + } + "step 3"; + if (result.bool) { + var targetx = result.targets[0]; + var num = target.countMark("sbjieyin_mark"); + target.removeSkill("sbjieyin_mark"); + targetx.addSkill("sbjieyin_mark"); + targetx.addMark("sbjieyin_mark", num, false); + player.line2([target, targetx], "green"); + game.log(player, "将", target, "的" + get.cnNumber(num) + "枚“助”移动至", targetx); + } else { + target.removeSkill("sbjieyin_mark"); + game.log(player, "移去了", target, "的" + get.cnNumber(num) + "枚“助”"); + game.createEvent("sbjieyin_fail").setContent(lib.skill.sbjieyin_fail.content).player = player; + } + "step 4"; + if (targets.length) event.goto(1); + }, + subSkill: { + fail: { + audio: "sbjieyin", + trigger: { global: "dieAfter" }, + dutySkill: true, + forced: true, + locked: false, + direct: true, + filter: function (event, player) { + return event.player.hasMark("sbjieyin_mark"); + }, + content: function () { + player.logSkill("sbjieyin_fail"); + player.awakenSkill("sbjieyin"); + game.log(player, "使命失败"); + player.changeGroup("wu"); + player.recover(); + player.gain(player.getExpansions("sbliangzhu"), "gain2"); + player.loseMaxHp(); + }, + }, + mark: { + charlotte: true, + mark: true, + marktext: "助", + onremove: true, + intro: { + name: "结姻(助)", + name2: "助", + content: "mark", + }, + }, + marked: { charlotte: true }, + init: { + audio: "sbjieyin", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + direct: true, + dutySkill: true, + filter: function (event, player) { + return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + player.chooseTarget("结姻:令一名其他角色获得1枚“助”", lib.filter.notMe, true).set("ai", target => get.attitude(_status.event.player, target)); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbjieyin_init", target); + target.addSkill("sbjieyin_mark"); + target.addMark("sbjieyin_mark", 1); + } + "step 2"; + game.delayx(); + }, + }, + }, + }, + sbliangzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.group == "shu" && game.hasPlayer(current => current != player && current.countCards("e")); + }, + groupSkill: true, + filterTarget: function (card, player, target) { + return target.countCards("e") && target != player; + }, + content: function () { + "step 0"; + player.choosePlayerCard(target, "e", true); + "step 1"; + if (result.bool) { + player.addToExpansion(result.cards, target, "give").gaintag.add("sbliangzhu"); + } else event.finish(); + "step 2"; + for (var target of game.filterPlayer(current => current.hasMark("sbjieyin_mark"))) { + target.chooseDrawRecover(2, true); + } + }, + marktext: "妆", + intro: { + name: "良助(妆)", + name2: "妆", + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { + order: 9, + result: { + player: function (player) { + var num = 0, + targets = game.filterPlayer(current => current.hasMark("sbjieyin_mark")); + for (var current of targets) { + num += 2 * get.effect(current, { name: "draw" }, player, player); + } + if (num > 0) return 3; + return 1; + }, + target: -1, + }, + }, + }, + sbxiaoji: { + audio: 2, + audioname: ["sp_sunshangxiang", "re_sunshangxiang", "db_sunshangxiang"], + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + locked: false, + groupSkill: true, + filter: function (event, player) { + if (player.group != "wu") return false; + var evt = event.getl(player); + return evt && evt.player == player && evt.es && evt.es.length > 0; + }, + content: function () { + "step 0"; + event.count = trigger.getl(player).es.length; + "step 1"; + event.count--; + player.draw(2); + player + .chooseTarget("是否弃置场上的一张牌?", (card, player, target) => { + return target.countDiscardableCards(player, "ej"); + }) + .set("ai", target => { + var player = _status.event.player; + var att = get.attitude(player, target); + if ( + att > 0 && + (target.countCards("j") > 0 || + target.countCards("e", function (card) { + return get.value(card, target) < 0; + })) + ) + return 2; + if (att < 0 && target.countCards("e") > 0 && !target.hasSkillTag("noe")) return -1; + return 0; + }); + "step 2"; + if (result.bool) { + player.discardPlayerCard(result.targets[0], "ej", true); + } + "step 3"; + if (event.count > 0) { + player.logSkill("sbxiaoji"); + event.goto(1); + } + }, + ai: { + noe: true, + reverseEquip: true, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, + }, + }, + //吕蒙 + sbkeji: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: function () { + var player = _status.event.player; + if (player.hasSkill("sbkeji_discard")) return [0, 0]; + if (player.hasSkill("sbkeji_losehp")) return [1, 1]; + return [0, 1]; + }, + locked: false, + usable: 2, + prompt: function (event) { + var player = _status.event.player, + str = "出牌阶段" + (player.storage.sbkeji ? "" : "各") + "限一次。你可以"; + var discard = player.hasSkill("sbkeji_discard"), + losehp = player.hasSkill("sbkeji_losehp"); + if (!discard) str += "弃置一张手牌并获得1点护甲"; + if (!losehp) str += (!discard ? ",或" : "") + "点击“确定”失去1点体力并获得2点护甲"; + return str; + }, + filter: function (event, player) { + return (player.getStat("skill").sbkeji || 0) < (player.storage.sbkeji ? 1 : 2); + }, + check: function (card) { + var player = _status.event.player; + if (_status.event.player.hp == 1 && player.canSave(player) && player.hujia <= 3) return 0; + return 6 - get.value(card); + }, + content: function () { + "step 0"; + if (cards.length) { + player.changeHujia(1, null, true); + player.addTempSkill("sbkeji_discard", "phaseUseAfter"); + event.finish(); + } else { + player.loseHp(); + } + "step 1"; + player.changeHujia(2, null, true); + player.addTempSkill("sbkeji_losehp", "phaseUseAfter"); + }, + mod: { + maxHandcard: function (player, num) { + return num + player.hujia; + }, + cardEnabled: function (card, player) { + if (player != _status.event.dying && card.name == "tao") return false; + }, + cardSavable: function (card, player) { + if (player != _status.event.dying && card.name == "tao") return false; + }, + }, + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.hujia >= 5) return 0; + if ( + player.hp == 1 && + !player.canSave(player) && + !player.hasCard(card => { + return lib.filter.cardDiscardable(card, player, "sbkeji") && get.value(card) < 6; + }, "h") + ) { + return 0; + } + return 1; + }, + }, + }, + subSkill: { + discard: { charlotte: true }, + losehp: { charlotte: true }, + }, + }, + sbdujiang: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + derivation: "sbduojing", + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return player.hujia >= 3; + }, + content: function () { + player.awakenSkill("sbdujiang"); + player.addSkills("sbduojing"); + player.storage.sbkeji = true; + }, + }, + sbduojing: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + return player.hujia > 0 && event.card.name == "sha"; + }, + check: function (event, player) { + return event.target.countGainableCards(player, "he") > 0 || player.countCards("hs", { name: "sha" }) > 0; + }, + logTarget: "target", + content: function () { + "step 0"; + player.changeHujia(-1); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sbduojing = true; + "step 1"; + var target = trigger.target; + if (target.countGainableCards(player, "he") > 0) player.gainPlayerCard(target, "he", true); + player.addTempSkill("sbduojing_add", "phaseUseAfter"); + player.addMark("sbduojing_add", 1, false); + player.markSkill("sbduojing_add"); + }, + subSkill: { + add: { + charlotte: true, + marktext: "夺", + onremove: true, + intro: { + content: "本阶段使用杀次数上限+$", + }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("sbduojing_add"); + }, + }, + }, + }, + ai: { + unequip: true, + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (player.hujia <= 0) return; + if (tag == "unequip" && (!arg || !arg.card || !arg.card.storage || !arg.card.storage.sbduojing)) return false; + if (tag == "unequip_ai" && (!arg || arg.name != "sha")) return false; + }, + }, + }, + //于禁 + sbxiayuan: { + audio: 2, + trigger: { global: "damageEnd" }, + direct: true, + filter: function (event, player) { + return event.hujia && !event.player.hujia && event.player.isIn() && player.countCards("h") > 1 && !player.hasSkill("sbxiayuan_round", null, false, false); + }, + content: function () { + "step 0"; + player.addTempSkill("sbxiayuan_round", "roundStart"); + player + .chooseToDiscard(2, "h", get.prompt("sbxiayuan", trigger.player), "弃置两张手牌,令其获得" + get.cnNumber(trigger.hujia) + "点护甲") + .set("goon", get.attitude(player, trigger.player) > 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 5 - get.value(card); + }).logSkill = ["sbxiayuan", trigger.player]; + "step 1"; + if (result.bool) { + var target = trigger.player; + target.changeHujia(trigger.hujia, null, true); + game.delayx(); + } else player.removeSkill("sbxiayuan_round"); + }, + subSkill: { round: { charlotte: true } }, + ai: { expose: 0.2 }, + }, + sbjieyue: { + audio: 4, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(lib.filter.notMe, get.prompt("sbjieyue"), "令一名其他角色获得1点护甲,然后该角色可以交给你一张牌。").set("ai", function (target) { + return get.attitude(_status.event.player, target) / Math.sqrt(Math.min(1, target.hp + target.hujia)); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("sbjieyue", target); + target.changeHujia(1, null, true); + target.chooseCard("he", "是否交给" + get.translation(player) + "一张牌?").set("ai", card => 0.1 - get.value(card)); + } else event.finish(); + "step 2"; + if (result.bool) { + target.give(result.cards, player); + } + }, + ai: { + threaten: 2.7, + expose: 0.2, + }, + }, + //华雄 + sbyangwei: { + audio: 3, + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("sbyangwei_counter", null, null, false); + }, + content: function () { + player.draw(2); + player.addTempSkill("sbyangwei_effect"); + player.addSkill("sbyangwei_counter"); + }, + ai: { + order: 9, + result: { player: 1 }, + }, + subSkill: { + effect: { + audio: "sbyangwei", + equipSkill: false, + inherit: "qinggang_skill", + charlotte: true, + nopop: true, + mod: { + targetInRange: function (card) { + if (card.name == "sha") return true; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + mark: true, + marktext: "威", + intro: { content: "使用【杀】的次数上限+1且无距离限制且无视防具" }, + }, + counter: { + trigger: { player: "phaseJieshu" }, + silent: true, + popup: false, + forced: true, + charlotte: true, + onremove: true, + content: function () { + if (!player.storage.sbyangwei_counter) player.storage.sbyangwei_counter = true; + else player.removeSkill("sbyangwei_counter"); + }, + }, + }, + }, + //黄忠 + sbliegong: { + audio: 2, + mod: { + cardnature: function (card, player) { + if (player.hasEmptySlot(1) && get.name(card, player) == "sha") return false; + }, + }, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return !event.getParent()._sbliegong_player && event.targets.length == 1 && event.card.name == "sha" && player.getStorage("sbliegong").length > 0; + }, + prompt2: function (event, player) { + var str = "", + storage = player.getStorage("sbliegong"); + if (storage.length > 1) { + str += "亮出牌堆顶的" + get.cnNumber(storage.length - 1) + "张牌并增加伤害;且"; + } + str += "令" + get.translation(event.target) + "不能使用花色为"; + for (var i = 0; i < storage.length; i++) { + str += get.translation(storage[i]); + } + str += "的牌响应" + get.translation(event.card); + return str; + }, + logTarget: "target", + locked: false, + check: function (event, player) { + var target = event.target; + if (get.attitude(player, target) > 0) return false; + if ( + target.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) + ) + return false; + var storage = player.getStorage("sbliegong"); + if (storage.length >= 4) return true; + if (storage.length < 3) return false; + if (target.hasShan()) return storage.includes("heart") && storage.includes("diamond"); + return true; + }, + content: function () { + var storage = player.getStorage("sbliegong").slice(0); + var num = storage.length - 1; + var evt = trigger.getParent(); + if (num > 0) { + if (typeof evt.baseDamage != "number") evt.baseDamage = 1; + var cards = get.cards(num); + player.showCards(cards.slice(0), get.translation(player) + "发动了【烈弓】"); + while (cards.length > 0) { + var card = cards.pop(); + if (storage.includes(get.suit(card, false))) evt.baseDamage++; + //ui.cardPile.insertBefore(card,ui.cardPile.firstChild); + } + //game.updateRoundNumber(); + } + evt._sbliegong_player = player; + player.addTempSkill("sbliegong_clear"); + var target = trigger.target; + target.addTempSkill("sbliegong_block"); + if (!target.storage.sbliegong_block) target.storage.sbliegong_block = []; + target.storage.sbliegong_block.push([evt.card, storage]); + lib.skill.sbliegong.updateBlocker(target); + }, + updateBlocker: function (player) { + var list = [], + storage = player.storage.sbliegong_block; + if (storage && storage.length) { + for (var i of storage) list.addArray(i[1]); + } + player.storage.sbliegong_blocker = list; + }, + ai: { + threaten: 3.5, + directHit_ai: true, + halfneg: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") { + var storage = player.getStorage("sbliegong"); + if (storage.length < 3 || !storage.includes("heart") || !storage.includes("diamond")) return false; + var target = arg.target; + if (target.hasSkill("bagua_skill") || target.hasSkill("bazhen") || target.hasSkill("rw_bagua_skill")) return false; + return true; + } + return false; + }, + }, + intro: { + content: "已记录花色:$", + onunmark: true, + }, + group: "sbliegong_count", + subSkill: { + clear: { + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return event._sbliegong_player == player; + }, + content: function () { + player.unmarkSkill("sbliegong"); + }, + }, + block: { + mod: { + cardEnabled: function (card, player) { + if (!player.storage.sbliegong_blocker) return; + var suit = get.suit(card); + if (suit == "none") return; + var evt = _status.event; + if (evt.name != "chooseToUse") evt = evt.getParent("chooseToUse"); + if (!evt || !evt.respondTo || evt.respondTo[1].name != "sha") return; + if (player.storage.sbliegong_blocker.includes(suit)) return false; + }, + }, + trigger: { + player: ["damageBefore", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], + global: ["useCardEnd"], + }, + forced: true, + firstDo: true, + charlotte: true, + onremove: function (player) { + delete player.storage.sbliegong_block; + delete player.storage.sbliegong_blocker; + }, + filter: function (event, player) { + if (!event.card || !player.storage.sbliegong_block) return false; + for (var i of player.storage.sbliegong_block) { + if (i[0] == event.card) return true; + } + return false; + }, + content: function () { + var storage = player.storage.sbliegong_block; + for (var i = 0; i < storage.length; i++) { + if (storage[i][0] == trigger.card) { + storage.splice(i--, 1); + } + } + if (!storage.length) player.removeSkill("sbliegong_block"); + else lib.skill.sbliegong.updateBlocker(target); + }, + }, + count: { + trigger: { + player: "useCard", + target: "useCardToTargeted", + }, + forced: true, + filter: function (event, player, name) { + if (name != "useCard" && player == event.player) return false; + var suit = get.suit(event.card); + if (!lib.suit.includes(suit)) return false; + if (player.storage.sbliegong && player.storage.sbliegong.includes(suit)) return false; + return true; + }, + content: function () { + player.markAuto("sbliegong", [get.suit(trigger.card)]); + }, + }, + }, + }, + //刘赪 + splveying: { + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countMark("splveying") > 1; + }, + content: function () { + "step 0"; + player.removeMark("splveying", 2); + player.draw(); + "step 1"; + player.chooseUseTarget("guohe"); + }, + marktext: "椎", + intro: { + name: "椎(掠影/莺舞)", + name2: "椎", + content: "mark", + }, + group: "splveying_add", + subSkill: { + add: { + trigger: { player: "useCardToPlayered" }, + forced: true, + usable: 2, + filter: function (event, player) { + return event.card.name == "sha" && player.isPhaseUsing(); + }, + content: function () { + player.addMark("splveying", 1); + }, + }, + }, + }, + spyingwu: { + group: "spyingwu_add", + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.hasSkill("splveying", null, null, false) && get.type(event.card) == "trick" && !get.tag(event.card, "damage") && player.countMark("splveying") > 1; + }, + content: function () { + player.removeMark("splveying", 2); + player.draw(); + player.chooseUseTarget("sha", false); + }, + ai: { combo: "splveying" }, + subSkill: { + add: { + trigger: { player: "useCardToPlayered" }, + forced: true, + locked: false, + usable: 2, + filter: function (event, player) { + return player.hasSkill("splveying") && get.type(event.card) == "trick" && !get.tag(event.card, "damage") && player.isPhaseUsing(); + }, + content: function () { + player.addMark("splveying", 1); + }, + }, + }, + }, + //手杀杨婉 + spmingxuan: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + filter: function (event, player) { + var list = player.getStorage("spmingxuan"); + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && !list.includes(current); + }) + ); + }, + content: function () { + "step 0"; + var suits = [], + hs = player.getCards("h"); + for (var i of hs) suits.add(get.suit(i, player)); + var list = player.getStorage("spmingxuan"), + num = Math.min( + suits.length, + game.countPlayer(function (current) { + return current != player && !list.includes(current); + }) + ); + player + .chooseCard("h", true, [1, num], "瞑昡:请选择至多" + get.cnNumber(num) + "张花色各不相同的手牌", function (card, player) { + if (!ui.selected.cards.length) return true; + var suit = get.suit(card); + for (var i of ui.selected.cards) { + if (get.suit(i, player) == suit) return false; + } + return true; + }) + .set("complexCard", true) + .set("ai", card => 6 - get.value(card)); + "step 1"; + if (result.bool) { + var list = player.getStorage("spmingxuan"), + cards = result.cards.randomSort(); + var targets = game + .filterPlayer(current => current != player && !list.includes(current)) + .randomGets(cards.length) + .sortBySeat(); + player.line(targets, "green"); + var map = []; + for (var i = 0; i < targets.length; i++) { + map.push([targets[i], cards[i]]); + } + game.loseAsync({ + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + event.targets = targets; + event.num = 0; + } else event.finish(); + "step 2"; + game.delayx(); + "step 3"; + if (num < targets.length) { + var target = targets[num]; + event.num++; + if (target.isIn()) { + event.target = target; + 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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player) + .set("addCount", false); + } else { + if (event.num < targets.length) event.redo(); + else event.finish(); + } + } + "step 4"; + if (result.bool) { + player.markAuto("spmingxuan", [target]); + if (event.num < targets.length) event.goto(3); + else event.finish(); + } else { + var he = target.getCards("he"); + if (he.length) { + if (he.length == 1) event._result = { bool: true, cards: he }; + else target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + } else { + if (event.num < targets.length) event.goto(3); + else event.finish(); + } + } + "step 5"; + if (result.bool) { + target.give(result.cards, player); + player.draw(); + } + if (event.num < targets.length) event.goto(3); + }, + intro: { content: "已被$使用过杀" }, + }, + spxianchou: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return ( + event.source && + event.source.isIn() && + game.hasPlayer(function (current) { + return current != player && current != event.source; + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("spxianchou"), function (card, player, target) { + return target != player && target != _status.event.getTrigger().source; + }) + .set("ai", function (target) { + return get.attitude(target, _status.event.player) * Math.sqrt(target.countCards("he")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("spxianchou", target); + player.line2([target, trigger.source]); + target + .chooseToDiscard("he", "是否弃置一张牌,视为对" + get.translation(trigger.source) + "使用一张【杀】?") + .set("ai", function (card) { + if (_status.event.goon) return 8 - get.value(card); + return 0; + }) + .set("goon", (target.canUse("sha", trigger.source, false) ? get.effect(trigger.source, { name: "sha", isCard: true }, target, target) : 0) + get.recoverEffect(player, target, target) > 0); + } else event.finish(); + "step 2"; + if (result.bool) { + if (target.canUse("sha", trigger.source, false)) target.useCard({ name: "sha", isCard: true }, trigger.source, false); + else event.finish(); + } else event.finish(); + "step 3"; + if ( + target.hasHistory("sourceDamage", function (evt) { + var card = evt.card; + if (!card || card.name != "sha") return false; + var evtx = evt.getParent("useCard"); + return evtx.card == card && evtx.getParent() == event; + }) + ) { + target.draw(); + player.recover(); + } + }, + }, +}; + +export default skills; diff --git a/character/sb/sort.js b/character/sb/sort.js new file mode 100644 index 000000000..54facd70b --- /dev/null +++ b/character/sb/sort.js @@ -0,0 +1,19 @@ +const characterSort = { + sb_zhi: ["sb_sunquan", "sb_zhouyu", "sb_zhangjiao", "sb_caocao", "sb_zhenji", "sb_liubei", "sb_daqiao", "sb_liubiao", "sb_sp_zhugeliang", "sb_xunyu"], + sb_shi: ["sb_xuhuang", "sb_machao", "sb_fazheng", "sb_chengong", "sb_diaochan", "sb_pangtong", "sb_zhanghe", "sb_caopi", "sb_ganning"], + sb_tong: ["liucheng", "sp_yangwan", "sb_xiahoushi", "sb_zhangfei", "sb_zhaoyun", "sb_sunce", "sb_zhurong", "sb_xiaoqiao", "sb_xiahoudun"], + sb_yu: ["sb_yujin", "sb_lvmeng", "sb_huangzhong", "sb_huanggai", "sb_zhouyu", "sb_caoren", "sb_yl_luzhi", "sb_huangyueying"], + sb_neng: ["sb_huaxiong", "sb_sunshangxiang", "sb_jiangwei", "sb_yuanshao", "sb_menghuo", "sb_guanyu", "sb_gaoshun"], + // sb_waitforsort:[], +}; + +const characterSortTranslate = { + sb_zhi: "谋攻篇·知", + sb_shi: "谋攻篇·识", + sb_tong: "谋攻篇·同", + sb_yu: "谋攻篇·虞", + sb_neng: "谋攻篇·能", + sb_waitforsort: "等待分包", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/sb/translate.js b/character/sb/translate.js new file mode 100644 index 000000000..5bcc097fe --- /dev/null +++ b/character/sb/translate.js @@ -0,0 +1,274 @@ +const translates = { + sb_zhanghe_prefix: "谋", + sb_yujin_prefix: "谋", + sb_huaxiong_prefix: "谋", + liucheng_prefix: "谋", + sp_yangwan_prefix: "谋", + sb_huangzhong_prefix: "谋", + sb_lvmeng_prefix: "谋", + sb_sunshangxiang_prefix: "谋", + sb_sunquan_prefix: "谋", + sb_huanggai_prefix: "谋", + sb_zhouyu_prefix: "谋", + sb_caoren_prefix: "谋", + sb_xiahoushi_prefix: "谋", + sb_zhangjiao_prefix: "谋", + sb_caocao_prefix: "谋", + sb_zhenji_prefix: "谋", + sb_ganning_prefix: "谋", + sb_machao_prefix: "谋", + sb_xuhuang_prefix: "谋", + sb_zhangfei_prefix: "谋", + sb_zhaoyun_prefix: "谋", + sb_liubei_prefix: "谋", + sb_jiangwei_prefix: "谋", + sb_fazheng_prefix: "谋", + sb_chengong_prefix: "谋", + sb_diaochan_prefix: "谋", + sb_yuanshao_prefix: "谋", + sb_pangtong_prefix: "谋", + sb_sunce_prefix: "谋", + sb_daqiao_prefix: "谋", + sb_liubiao_prefix: "谋", + sb_zhurong_prefix: "谋", + sb_menghuo_prefix: "谋", + sp_yangwan: "谋杨婉", + spmingxuan: "瞑昡", + spmingxuan_info: "锁定技。出牌阶段开始时,你须选择至多X张花色各不相同的手牌(X为未选择过选项一的角色),将这些牌随机交给这些角色中的等量角色。然后这些角色依次选择一项:⒈对你使用一张【杀】。⒉交给你一张牌,然后你摸一张牌。", + spxianchou: "陷仇", + spxianchou_info: "当你受到有来源的伤害后,你可选择一名不为伤害来源的其他角色。该角色可以弃置一张牌,然后视为对伤害来源使用一张【杀】(无距离限制)。若其因此【杀】造成了伤害,则其摸一张牌,你回复1点体力。", + liucheng: "谋刘赪", + splveying: "掠影", + splveying_info: "锁定技。①每回合限两次,当你使用【杀】指定目标后,你获得一个“椎”。②当你使用的【杀】结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【过河拆桥】。", + spyingwu: "莺舞", + spyingwu_info: "若你拥有〖掠影〗,则:①每回合限两次,当你使用非伤害类普通锦囊牌指定目标后,你获得一个“椎”。②当你使用的非伤害类普通锦囊牌结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【杀】。", + sb_huangzhong: "谋黄忠", + sbliegong: "烈弓", + sbliegong_info: "①若你的装备区内没有武器牌,则你手牌区内所有【杀】的属性视为无属性。②当你使用牌时,或成为其他角色使用牌的目标后,你记录此牌的花色。③当你使用【杀】指定唯一目标后,若你〖烈弓②〗的记录不为空,则你可亮出牌堆顶的X张牌(X为你〖烈弓②〗记录过的花色数-1),令此【杀】的伤害值基数+Y(Y为亮出牌中被〖烈弓②〗记录过花色的牌的数量),且目标角色不能使用〖烈弓②〗记录过花色的牌响应此【杀】。此【杀】使用结算结束后,你清除〖烈弓②〗的记录。", + sb_huaxiong: "谋华雄", + sbyangwei: "扬威", + sbyangwei_info: "出牌阶段,你可以摸两张牌,令此技能于你的下下个结束阶段前失效,且你获得如下效果直到回合结束:使用【杀】无距离限制,次数上限+1且无视防具。", + sb_yujin: "谋于禁", + sbxiayuan: "狭援", + sbxiayuan_info: "每轮限一次。其他角色受到伤害后,若其因此伤害触发过护甲效果且其没有护甲,则你可弃置两张手牌,令其获得X点护甲(X为其因此伤害触发护甲效果而失去的护甲数量)。", + sbjieyue: "节钺", + sbjieyue_info: "结束阶段,你可以令一名其他角色获得1点护甲。然后其可以交给你一张牌。", + sb_lvmeng: "谋吕蒙", + sbkeji: "克己", + sbkeji_info: "①出牌阶段各限一次。你可以选择一项:1.弃置一张手牌,然后获得1点护甲;2.失去1点体力,然后获得2点护甲。②你的手牌上限+X(X为你的护甲数)。③若你不为正在结算濒死流程的角色,你不能使用【桃】。", + sbdujiang: "渡江", + sbdujiang_info: "觉醒技。准备阶段,若你的护甲数不少于3,你获得〖夺荆〗,修改〖克己①〗为“出牌阶段限一次”。", + sbduojing: "夺荆", + sbduojing_info: "当你使用【杀】指定目标时,你可以失去1点护甲。然后令此【杀】无视防具,你获得目标角色一张牌,本回合使用【杀】的次数上限+1。", + sb_sunshangxiang: "谋孙尚香", + sbjieyin: "结姻", + sbjieyin_info: "使命技。①游戏开始时,你令一名其他角色获得1枚“助”。②出牌阶段开始时,有“助”的角色选择一项:1.交给你X张手牌(X=min(2,其手牌数)且至少为1),然后获得1点护甲;2.令你将“助”移动给另一名其他角色,或移去其“助”(若其此前获得过“助”,则只能移去)。③失败:当一名角色死亡后,若其于死亡时有“助”,或当你因〖结姻②〗移去“助”后,你将势力改为吴,回复1点体力,获得所有“妆”并减1点体力上限。", + sbliangzhu: "良助", + sbliangzhu_info: "蜀势力技。出牌阶段限一次,你可以将一名其他角色装备区里的一张牌置于武将牌上,称为“妆”,然后有“助”的角色须选择回复1点体力或摸两张牌。", + sbxiaoji: "枭姬", + sbxiaoji_info: "吴势力技。当你失去装备区里的一张牌后,你摸两张牌,然后可以弃置场上的一张牌。", + sb_sunquan: "谋孙权", + sbzhiheng: "制衡", + sbzhiheng_info: "出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你以此法弃置的牌包括你所有手牌,则你多摸X张牌(X为你的“业”数+1),并弃1枚“业”。", + sbtongye: "统业", + sbtongye_info: "锁定技。结束阶段,你猜测场上装备牌数与你下一个准备阶段的场上装备牌数是否相等,并获得以下效果:你下一个准备阶段,若你猜对且“业”数小于2,你获得1枚“业”;若你猜错,你弃1枚“业”。", + sbjiuyuan: "救援", + sbjiuyuan_info: "主公技,锁定技。①其他吴势力角色使用【桃】时,你摸一张牌。②其他吴势力角色对你使用的【桃】的回复量+1。", + sb_huanggai: "谋黄盖", + sbkurou: "苦肉", + sbkurou_info: "①出牌阶段开始时,你可以交给其他角色一张牌,若此牌于对方手牌区内为【桃】或【酒】,你失去2点体力,否则你失去1点体力。②当你失去1点体力后,你获得2点护甲。", + sbzhaxiang: "诈降", + sbzhaxiang_info: "锁定技。①摸牌阶段,你多摸X张牌。②你每回合使用的前X张牌无距离与次数限制且不能被响应(X为你已损失的体力值)。", + sb_zhouyu: "谋周瑜", + sbyingzi: "英姿", + sbyingzi_info: "锁定技。摸牌阶段,你多摸X张牌,且令你本回合手牌上限+X(X为以下条件中你满足的项数:手牌数不小于2、体力值不小于2、装备区里的牌数不小于1)。", + sbfanjian: "反间", + sbfanjian_info: "出牌阶段,你可以声明一个花色并选择一张牌和一名其他角色(每种花色的牌每回合限一次)。其须选择一项:1.猜测此牌花色与你所声明花色是否相同;2.翻面。然后其正面向上获得此牌。若其选择猜测且猜测错误,其失去1点体力,否则其令你〖反间〗于本回合失效。", + sb_caoren: "谋曹仁", + sbjushou: "据守", + sbjushou_info: "①出牌阶段限一次。若你的武将牌正面朝上,你可以弃置至多两张牌,然后你翻面并获得等量护甲。②当你受到伤害后,若你的武将牌背面朝上,你选择一项:1.翻面;2.获得1点护甲。③当你翻面后,若你的武将牌正面朝上,你摸X张牌(X为你的护甲数)。", + sbjiewei: "解围", + sbjiewei_info: "出牌阶段限一次。你可以失去1点护甲并选择一名其他角色。你观看其手牌并获得其中一张。", + sb_xiahoushi: "谋夏侯氏", + sbqiaoshi: "樵拾", + sbqiaoshi_info: "每回合限一次。当你受到其他角色造成的伤害后,其可以令你回复等同于此次伤害值的体力,然后其摸两张牌。", + sbyanyu: "燕语", + sbyanyu_info: "①出牌阶段限两次。你可以弃置一张【杀】,然后摸一张牌。②出牌阶段结束时,你可以令一名其他角色摸3X张牌(X为你于此阶段发动〖燕语①〗的次数)。", + sb_zhangjiao: "谋张角", + sbleiji: "雷击", + sbleiji_info: "出牌阶段,你可以选择一名其他角色并弃4枚“道兵”,对其造成1点雷电伤害。", + sbguidao: "鬼道", + sbguidao_info: "①游戏开始时/一名角色受到属性伤害后,你获得4/2枚“道兵”。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。③“道兵”上限为8。", + sbhuangtian: "黄天", + sbhuangtian_info: "主公技,锁定技。①回合开始时,若本回合为你的第一个回合且游戏轮数为1,且游戏内没有【太平要术】,你装备【太平要术】。②其他群势力角色造成伤害后,若你拥有〖鬼道〗,你获得2枚“道兵”(每轮你至多以此法获得4枚“道兵”)。", + sb_caocao: "谋曹操", + sbjianxiong: "奸雄", + sbjianxiong_info: "①游戏开始时,你可获得至多2枚“治世”标记。②当你受到伤害后,你可获得伤害牌,摸1-X张牌(X为“治世”数),然后你可弃1枚“治世”。", + sbqingzheng: "清正", + sbqingzheng_info: "出牌阶段开始时,你可以弃置3-X种花色的所有手牌(X为“治世”数),并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。然后若X小于2且你拥有技能〖奸雄〗,你可以获得1枚“治世”。", + sbhujia: "护驾", + sbhujia_info: "主公技,每轮限一次。当你受到伤害时,你可以将此伤害转移给一名其他魏势力角色。", + sb_zhenji: "谋甄宓", + sbluoshen: "洛神", + sbluoshen_info: "准备阶段,你可以选择一名角色。从其开始按逆时针方向的X名其他角色依次执行(X为角色数的一半,向上取整):展示一张手牌,若此牌为黑色,你获得之且此牌不计入本回合手牌上限;若此牌为红色,其弃置之。", + sb_ganning: "谋甘宁", + sbqixi: "奇袭", + sbqixi_info: "出牌阶段限一次。若你有手牌,你可以令一名其他角色猜测你手牌中最多的花色。若其猜对,你展示所有手牌;若其猜错,你可令其从其未选择过的花色中再次猜测,重复此流程。然后你弃置其区域内的X张牌(X为其于本次〖奇袭〗中猜错的次数)。", + sbfenwei: "奋威", + sbfenwei_info: "限定技。①出牌阶段,你可以将至多三张牌分别置于等量名角色的武将牌上,称为“威”,然后你摸等量牌。②当一名角色成为锦囊牌的目标时,若其有“威”,你须选择:1.令其获得其“威”;2.令其移去“威”,并取消此目标。", + sb_machao: "谋马超", + sbtieji: "铁骑", + sbtieji_info: "当你使用【杀】指定其他角色为目标后,你可以令目标角色不能响应此【杀】,且其所有非锁定技失效直到回合结束。然后你与其进行谋弈。若你赢,且你选择的选项为:“直取敌营”,则你获得其一张牌;“扰阵疲敌”,你摸两张牌。", + sb_xuhuang: "谋徐晃", + sbduanliang: "断粮", + sbduanliang_info: "出牌阶段限一次。你可以与一名其他角色进行谋弈。若你赢,且你选择的选项为:“围城断粮”,若其判定区没有【兵粮寸断】,你将牌堆顶牌当【兵粮寸断】对其使用,否则你获得其一张牌;“擂鼓进军”,你视为对其使用一张【决斗】。", + sbshipo: "势迫", + sbshipo_info: "结束阶段,你可以令一名体力少于你的角色或所有判定区有【兵粮寸断】的其他角色选择一项:1.交给你一张手牌;2.受到1点伤害。所有目标角色选择完成后,你可以将任意张你以此法得到的牌交给一名其他角色。", + sb_zhangfei: "谋张飞", + sbpaoxiao: "咆哮", + sbpaoxiao_info: "锁定技。①你使用【杀】无次数限制。②若你的装备区内有武器牌,则你使用【杀】无距离限制。③当你于出牌阶段内使用第二张及以后【杀】时,你获得如下效果:{此【杀】不可被响应且伤害值基数+1;此【杀】指定目标后,目标角色的非锁定技于本回合内失效;此【杀】造成伤害后,若目标角色存活,则你失去1点体力并随机弃置一张手牌。}", + sbxieji: "协击", + sbxieji_info: "准备阶段开始时,你可以和一名其他角色进行协力。其的下个结束阶段开始时,若你与其协力成功,则你可以选择至多三名其他角色。你对这些角色视为使用一张【杀】,且当此【杀】因执行牌面效果造成伤害后,你摸X张牌(X为伤害值)。", + sb_zhaoyun: "谋赵云", + sblongdan: "龙胆", + sblongdan_info: "蓄力技(1/3)。①你可以消耗1点蓄力值,将【杀】当做【闪】或将【闪】当做【杀】使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。", + sbjizhu: "积著", + sbjizhu_info: "准备阶段开始时,你可以和一名其他角色进行协力。其的下个结束阶段开始时,若你与其协力成功,则你修改〖龙胆〗直到你的下个结束阶段开始。", + sblongdan_shabi: "龙胆", + sblongdan_shabi_info: "蓄力技(1/3)。①你可以消耗1点蓄力值,将一张基本牌当做任意基本牌使用或打出,然后摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。", + sb_liubei: "谋刘备", + sbrende: "仁德", + sbrende_info: "①出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为8)。②每回合限一次。你可以移去2枚“仁望”,视为使用或打出一张基本牌。③出牌阶段开始时,你获得2枚“仁望”。", + sbzhangwu: "章武", + sbzhangwu_info: "限定技。出牌阶段,你可以令所有于本局游戏成为过〖仁德①〗目标的其他角色依次交给你X张牌,然后你回复3点体力并失去〖仁德〗(X为游戏轮数-1,且至多为3)。", + sbjijiang: "激将", + sbjijiang_info: "主公技。出牌阶段结束时,你可以选择一名体力值不小于你的其他蜀势力角色A和一名在A攻击范围内的角色B。A选择一项:1.视为对B使用一张【杀】;2.下一个出牌阶段开始前,跳过此阶段。", + sb_jiangwei: "谋姜维", + sbtiaoxin: "挑衅", + sbtiaoxin_info: "蓄力技(4/4)。①出牌阶段限一次。你可以选择至多X名角色(X为你的蓄力值),令这些角色选择一项:1.对你使用一张【杀】(无距离限制);2.交给你一张牌。然后你消耗等同于你选择的目标数的蓄力值。②当你于弃牌阶段弃置牌后,你获得等量蓄力值。", + sbzhiji: "志继", + sbzhiji_info: "觉醒技。准备阶段,若你因〖挑衅①〗消耗过至少4点蓄力值,你减1点体力上限,令至少一名角色获得“北伐”标记并获得如下效果直到你的下回合开始:其使用牌只能指定你或其为目标。", + sb_fazheng: "谋法正", + sbxuanhuo: "眩惑", + sbxuanhuo_info: "①出牌阶段限一次。你可以将一张牌交给一名没有“眩”标记的其他角色,然后令其获得“眩”标记。②当有“眩”的其他角色于摸牌阶段外得到牌后,若你以此法于其本次获得“眩”的期间内得到其的牌数小于5,你随机获得其一张手牌。", + sbenyuan: "恩怨", + sbenyuan_info: "锁定技。准备阶段,若场上存在有“眩”的角色,你移去该角色的“眩”,且你于其本次获得“眩”的期间内得到其的牌数:不小于3,你交给其三张牌;小于3,其失去1点体力,你回复1点体力。", + sb_chengong: "谋陈宫", + sbmingce: "明策", + sbmingce_info: "①出牌阶段限一次。你可以将一张牌交给一名其他角色,其选择一项:1.失去1点体力,令你摸两张牌并获得1枚“策”;2.摸一张牌。②出牌阶段开始时,你可以移去所有“策”并对一名其他角色造成等量伤害。", + sbzhichi: "智迟", + sbzhichi_info: "锁定技。当你受到伤害后,防止你本回合受到的伤害。", + sb_yuanshao: "谋袁绍", + sbluanji: "乱击", + sbluanji_info: "①出牌阶段限一次。你可以将两张手牌当【万箭齐发】使用。②每回合限三次,当其他角色因响应你使用的【万箭齐发】而打出【闪】时,你摸一张牌。", + sbxueyi: "血裔", + sbxueyi_info: "主公技,锁定技。①你的手牌上限+2X(X为场上其他群势力角色数)。②每回合限两次,当你使用牌指定其他群势力角色为目标后,你摸一张牌。", + sb_diaochan: "谋貂蝉", + sblijian: "离间", + sblijian_info: "出牌阶段限一次。你可以选择至少两名其他角色并弃置X张牌(X为你选择的角色数-1)。然后每名你选择的角色依次视为对这些角色中与其逆时针座次最近的另一名角色使用一张【决斗】。", + sbbiyue: "闭月", + sbbiyue_info: "锁定技。结束阶段,你摸Y张牌(Y为本回合包括已死亡角色在内受到过伤害的角色数+1且至多为4)。", + sb_pangtong: "谋庞统", + sblianhuan: "连环", + sblianhuan_info: "①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。", + sblianhuan_lv2: "连环·改", + sblianhuan_lv2_info: "①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。", + sbniepan: "涅槃", + sbniepan_info: "限定技。当你处于濒死状态时,你可以弃置区域里的所有牌,摸两张牌,将体力回复至2点,复原武将牌,然后修改〖连环〗。", + sb_sunce: "谋孙策", + sbjiang: "激昂", + sbjiang_info: "①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限一次。你可以将所有手牌当【决斗】使用。", + sbhunzi: "魂姿", + sbhunzi_info: "觉醒技。当你脱离濒死状态后,你减1点体力上限,获得1点护甲,摸三张牌。然后你获得〖英姿〗和〖英魂〗。", + sbzhiba: "制霸", + sbzhiba_info: "主公技,限定技。当你进入濒死状态时,你可以回复X-1点体力并修改〖激昂③〗为“出牌阶段限X次”(X为场上其他吴势力角色数+1)。然后其他吴势力角色依次受到1点无来源伤害,且当有角色因此死亡后,你摸三张牌。", + sb_daqiao: "谋大乔", + sbguose: "国色", + sbguose_info: "出牌阶段限两次,你可以将一张♦牌当【乐不思蜀】使用或弃置场上一张【乐不思蜀】,然后你摸一张牌。", + sbguose_info_identity: "出牌阶段限四次,你可以将一张♦牌当【乐不思蜀】使用或弃置场上一张【乐不思蜀】,然后你摸一张牌。", + sbliuli: "流离", + sbliuli_info: "当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内的一名不为此【杀】使用者的角色,将此【杀】转移给该角色。若你以此法弃置了♥牌,则你可以令一名不为此【杀】使用者的其他角色获得“流离”标记,且移去场上所有其他的“流离”(每回合限一次)。有“流离”的角色回合开始时,其移去其“流离”并执行一个额外的出牌阶段。", + sb_liubiao: "谋刘表", + sbzishou: "自守", + sbzishou_info: "锁定技。其他角色的结束阶段,若其与你于本局游戏内均未对对方造成过伤害,其须交给你一张牌。", + sbzongshi: "宗室", + sbzongshi_info: "锁定技。每名角色限一次。当你受到伤害后,你令伤害来源弃置所有手牌。", + sb_zhurong: "谋祝融", + sblieren: "烈刃", + sblieren_info: "当你使用【杀】指定唯一目标后,你可以摸一张牌,然后与其拼点。若你赢,此【杀】结算结束后,你可以对另一名其他角色造成1点伤害。", + sbjuxiang: "巨象", + sbjuxiang_info: "锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。③结束阶段,若你未于本回合使用过【南蛮入侵】,你可以将一张游戏外的随机【南蛮入侵】(共2张)交给一名角色。", + sb_menghuo: "谋孟获", + sbhuoshou: "祸首", + sbhuoshou_info: "锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】指定第一个目标后,你代替其成为此牌的伤害来源。③出牌阶段开始时,你随机获得弃牌堆中的一张【南蛮入侵】。④出牌阶段,若你于此阶段使用过【南蛮入侵】,你不能使用【南蛮入侵】。", + sbzaiqi: "再起", + sbzaiqi_info: "蓄力技(0/7)。①弃牌阶段结束时,你可以消耗任意点蓄力值并选择等量名角色,然后令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力。②每回合限一次。当你造成伤害后,你获得1点蓄力值。", + sb_zhanghe: "谋张郃", + sbqiaobian: "巧变", + sbqiaobian_info: "每回合限一次。①你可以失去1点体力并跳过判定阶段,将判定区的所有牌移动给一名其他角色(无法置入其判定区的牌改为弃置之)。②你可以跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力。③你可以将手牌数弃置至六张(若手牌数少于六张则跳过之)并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌。", + sb_yl_luzhi: "谋卢植", + sb_yl_luzhi_prefix: "谋", + sbzhenliang: "贞良", + sbzhenliang_info: "转换技。阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。", + sb_xiaoqiao: "谋小乔", + sb_xiaoqiao_prefix: "谋", + sbtianxiang: "天香", + sbtianxiang_info_identity: "①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸等量的牌。", + sbtianxiang_info: "①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸X张牌(X为移去的“天香”标记数+2)。", + sb_sp_zhugeliang: "谋诸葛亮", + sb_sp_zhugeliang_prefix: "谋", + sbhuoji: "火计", + sbhuoji_info: "使命技。①使命:出牌阶段限一次。你可以对一名其他角色造成1点火焰伤害,然后你对所有与其势力相同的不为其的其他角色各造成1点火焰伤害。②成功:准备阶段,若你本局游戏已造成的火焰伤害不小于本局游戏总角色数,则你失去〖火计〗和〖看破〗,然后获得〖观星〗和〖空城〗。③失败:使命成功前进入濒死状态。", + sbkanpo: "看破", + sbkanpo_info: "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录4个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", + sbkanpo_info_doudizhu: "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录2个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", + sbkanpo_info_versus_two: "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录2个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", + sbguanxing: "观星", + sbguanxing_info: "①准备阶段,你将所有“星”置入弃牌堆,将牌堆顶的X张牌置于你的武将牌上,称为“星”(X为7-此前发动〖观星①〗次数的三倍,且X至少为0)。然后你可以将任意张“星”置于牌堆顶。②结束阶段,若你未于本回合的准备阶段将“星”置于过牌堆顶,你可以将任意张“星”置于牌堆顶。③你可以如手牌般使用或打出“星”。", + sbkongcheng: "空城", + sbkongcheng_info: "锁定技。当你受到伤害时,若你拥有技能〖观星〗,且若你:有“星”,你判定,若结果点数不大于你的“星”数,此伤害-1;没有“星”,此伤害+1。", + sb_huangyueying: "谋黄月英", + sb_huangyueying_prefix: "谋", + sbqicai: "奇才", + sbqicai_backup: "奇才", + sbqicai_info: "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏,然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", + sbqicai_info_doudizhu: "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏(每种牌名的装备牌每局游戏限选择一次),然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", + sbjizhi: "集智", + sbjizhi_info: "锁定技,当你使用一张普通锦囊牌时,你摸一张牌,且此牌本回合不计入你的手牌上限。", + sb_guanyu: "谋关羽", + sb_guanyu_prefix: "谋", + sbwusheng: "武圣", + sbwusheng_wusheng_backup: "武圣", + sbwusheng_info: "你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用三张【杀】后不能对其使用【杀】。", + sbwusheng_info_identity: "你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸两张牌,对其使用三张【杀】后不能对其使用【杀】。", + sbyijue: "义绝", + sbyijue_info: "锁定技,每名角色每局游戏限一次,一名其他角色受到你对其造成的大于等于其体力值的伤害时,你防止此伤害,且本回合你使用牌指定其为目标时,此牌对其无效。", + sb_caopi: "谋曹丕", + sb_caopi_prefix: "谋", + sbxingshang: "行殇", + sbxingshang_info: "①当一名角色受到伤害后(每回合限一次)或死亡时,你获得2个“颂”标记(你至多拥有9个“颂”标记)。②出牌阶段限两次,你可以:1.移去2个“颂”标记,令一名角色复原武将牌;2.移去2个“颂”标记,令一名角色摸X张牌(X为场上阵亡角色数,且X至少为2,至多为5);3.移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限,回复1点体力,随机恢复一个已废除的装备栏;4.移去5个“颂”标记,获得一名阵亡角色武将牌上的所有技能,然后你失去〖行殇〗〖放逐〗〖颂威〗。", + sbfangzhu: "放逐", + sbfangzhu_info: "出牌阶段限一次,你可以:1.移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束;2.移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束;3.移去2个“颂”标记,令一名其他角色不能响应除其以外的角色使用的牌直到其回合结束;4.移去3个“颂”标记,令一名其他角色将武将牌翻面;5.移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束;6.移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束。", + sbsongwei: "颂威", + sbsongwei_info: "主公技。①出牌阶段开始时,你获得Y个“颂”标记(Y为场上其他魏势力角色数的两倍)。②每局游戏限一次,出牌阶段,你可以令一名其他魏势力角色失去所有武将牌的技能。", + sb_xunyu: "谋荀彧", + sb_xunyu_prefix: "谋", + sbquhu: "驱虎", + sbquhu_info: "出牌阶段限一次。你可以选择两名有牌的其他角色,你与这些角色同时将任意张牌扣置于武将牌上。若你以此法扣置的牌唯一最少,则扣置牌最多的其他角色获得你扣置的牌,且这些角色获得各自扣置的牌;否则这两名角色中扣置牌较多的角色对较少的角色造成1点伤害,获得你扣置的牌,然后这些角色将各自扣置的牌置入弃牌堆(若这两名角色扣置的牌数相同,视为与你逆时针最近座次的角色扣置牌较多)。", + sbjieming: "节命", + sbjieming_info: "当你受到伤害后,你可以令一名角色摸四张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于X,你失去1点体力(X为你已损失的体力值,至少为1)。", + sb_xiahoudun: "谋夏侯惇", + sb_xiahoudun_prefix: "谋", + sbganglie: "刚烈", + sbganglie_info: "出牌阶段,你可以选择一名本局游戏对你造成过伤害且未以此法选择过的角色,你对其造成2点伤害。", + sbqingjian: "清俭", + sbqingjian_info: "①当有一张牌不因使用而进入弃牌堆后,若你的“清俭”数小于X,你将此牌置于你的武将牌上,称为“清俭”(X为你的体力值-1,且至少为1)。②出牌阶段结束时,你将所有“清俭”分配给任意角色。", + sb_gaoshun: "谋高顺", + sb_gaoshun_prefix: "谋", + sbxianzhen: "陷阵", + sbxianzhen_info: "出牌阶段限一次。你可以选择一名其他角色,你于本阶段获得如下效果:⒈你对其使用牌无距离限制;⒉当你使用【杀】指定其为目标后,你可以与其拼点:若你赢,此【杀】无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;若其拼点牌为【杀】,则你获得之;若其拼点牌为其最后的手牌,则此【杀】对其造成伤害时,此伤害+1。", + sbjinjiu: "禁酒", + sbjinjiu_info: "锁定技。①你的【酒】均视为【杀】。②当你受到酒【杀】的伤害时,你令此伤害减至1。③其他角色不能于你的回合内使用【酒】。④当一名其他角色的拼点牌亮出后,若你为发起者或参与者且此牌为【酒】,则此牌的点数视为A。", +}; + +export default translates; diff --git a/character/sb/voices.js b/character/sb/voices.js new file mode 100644 index 000000000..9063022c8 --- /dev/null +++ b/character/sb/voices.js @@ -0,0 +1,232 @@ +export default { + "#sbxianzhen1": "陷阵营中,皆是以一敌百之士!", + "#sbxianzhen2": "军令既出,使命必完!", + "#sbjinjiu1": "军规严戒,不容稍纵形骸!", + "#sbjinjiu2": "黄汤乱军误事,不可不禁!", + "#sb_gaoshun:die": "宁为断头鬼,不当受降虏……", + "#sbganglie1": "一军之帅,岂惧暗箭之伤。", + "#sbganglie2": "宁陨沙场,不容折悔。", + "#sbqingjian1": "如今乱世,还是当以俭治军。", + "#sbqingjian2": "浮奢之举,非是正道。", + "#sb_xiahoudun:die": "急攻盲进,实是有愧丞相……", + "#sbquhu1": "驱他山之虎,抗近身之豺。", + "#sbquhu2": "引狼喰虎,待虎吞狼。", + "#sbjieming1": "守誓心之节,达百里之命。", + "#sbjieming2": "成佐王定策之功,守殉国忘身之节。", + "#sb_xunyu:die": "北风化王境,空萦荀令香……", + "#sbxingshang1": "纵是身死,仍要为我所用。", + "#sbxingshang2": "汝九泉之下,定会感朕之情。", + "#sbfangzhu1": "战败而降,辱我国威,岂能轻饶!", + "#sbfangzhu2": "此等过错,不杀已是承了朕恩。", + "#sbsongwei1": "江山锦绣,尽在朕手。", + "#sbsongwei2": "成功建业,扬我魏威。", + "#sb_caopi:die": "大魏如何踏破吴蜀,就全看叡儿了……", + "#sbwusheng1": "千军斩将而回,于某又有何难?", + "#sbwusheng2": "关某既出,敌将定皆披靡。", + "#sbwusheng3": "对敌岂遵一招一式!", + "#sbyijue1": "承君之恩,今日尽报。", + "#sbyijue2": "下次沙场相见,关某定不留情。", + "#sb_guanyu:die": "大哥,翼德,来生再于桃园,论豪情壮志……", + "#sbjizhi1": "依我此计,便可破之。", + "#sbjizhi2": "以此无用之物,换得锦囊妙计。", + "#sbqicai1": "解之有万法,吾独得千计。", + "#sbqicai2": "慧思万千,以成我之所想。", + "#sb_huangyueying:die": "何日北平中原,夫君再返隆中……", + "#sbhuoji1": "区区汉贼,怎挡天火之威?", + "#sbhuoji2": "就让此火,再兴炎汉国祚。", + "#sbhuoji3": "吾虽有功,然终逆天命啊。", + "#sbkanpo1": "知汝欲行此计,故已待之久矣。", + "#sbkanpo2": "静思敌谋,以出应对之策。", + "#sb_sp_zhugeliang:die": "纵具地利,不得天时亦难胜也……", + "#sbqiaobian1": "将计就计,变夺胜机。", + "#sbqiaobian2": "因势而变,则可引势而为", + "#sb_zhanghe:die": "未料竟中孔明之计……", + "#sbxiayuan1": "速置粮草,驰援天柱山。", + "#sbxiayuan2": "援军既至,定攻克此地!", + "#sbjieyue1": "尔等小儿,徒费兵力!", + "#sbjieyue2": "侧翼迎敌,拱卫中军!", + "#sbjieyue3": "调兵遣将,以御敌势!", + "#sbjieyue4": "雕虫小技,静待则已!", + "#sb_yujin:die": "禁……愧于丞相……", + "#new_reyaowu_sb_huaxiong1": "俞涉小儿,岂是我的对手!", + "#new_reyaowu_sb_huaxiong2": "上将潘凤?哼!还不是死在我刀下!", + "#sbyangwei1": "哈哈哈哈!现在谁不知我华雄?", + "#sbyangwei2": "定要关外诸侯,知我威名!", + "#sbyangwei3": null, + "#sb_huaxiong:die": "小小马弓手,竟然……啊……", + "#splveying1": "避实击虚,吾可不惮尔等蛮力!", + "#splveying2": "疾步如风,谁人可视吾影?", + "#spyingwu1": "莺舞曼妙,杀机亦藏其中!", + "#spyingwu2": "莺翼之羽,便是诛汝之锋!", + "#liucheng:die": "此番寻药未果,怎医叙儿之疾……", + "#spmingxuan1": "闻汝节行俱佳,今特设宴相请。", + "#spmingxuan2": "百闻不如一见,夫人果真非凡。", + "#spxianchou1": "夫君勿忘,杀妻害子之仇!", + "#spxianchou2": "吾母子之仇,便全靠夫君来报了!", + "#sp_yangwan:die": "引狗入寨,悔恨交加……", + "#sbliegong1": "矢贯坚石,劲冠三军!", + "#sbliegong2": "吾虽年迈,箭矢犹锋!", + "#sb_huangzhong:die": "弦断弓藏,将老孤亡…", + "#sbkeji1": "事事克己,步步虚心!", + "#sbkeji2": "勤学潜习,始觉自新!", + "#sbdujiang1": "大军渡江,昼夜驰上!", + "#sbdujiang2": "白衣摇橹,昼夜兼行!", + "#sb_lvmeng:die": "义封胆略过人,主公可任之……", + "#sbjieyin": null, + "#sbjieyin1": "君若不负吾心,妾自随君千里。", + "#sbjieyin2": "夫妻之情既断,何必再问归期!", + "#sbliangzhu1": "助君得胜战,跃马提缨枪!", + "#sbliangzhu2": "平贼成君业,何惜上沙场!", + "#sbxiaoji1": "吾之所通,何止十八般兵刃!", + "#sbxiaoji2": "既如此,就让尔等见识一番!", + "#sb_sunshangxiang:die": "此去一别,竟无再见之日……", + "#sbzhiheng1": "稳坐山河,但观世变。", + "#sbzhiheng2": "身处惊涛,尤可弄潮。", + "#sbtongye1": "上下一心,君臣同志。", + "#sbtongye2": "胸有天下者,必可得其国。", + "#sbjiuyuan1": "汝救护有功,吾必当厚赐。", + "#sbjiuyuan2": "诸位将军,快快拦住贼军!", + "#sb_sunquan:die": "风急举发,命不久矣……", + "#sbkurou1": "既不能破,不如依张子布之言,投降便罢!", + "#sbkurou2": "周瑜小儿!破曹不得,便欺吾三世老臣乎?", + "#sbzhaxiang1": "江东六郡之卒,怎敌丞相百万雄师!", + "#sbzhaxiang2": "闻丞相虚心纳士,盖愿率众归降!", + "#sb_huanggai:die": "哈哈哈哈,公瑾计成,老夫死也无憾了……", + "#sbyingzi1": "交之总角,付之九州!", + "#sbyingzi2": "定策分两治,纵马饮三江!", + "#sbfanjian1": "若不念汝三世之功,今日定斩不赦!", + "#sbfanjian2": "比之自内,不自失也!", + "#sb_zhouyu:die": "瑜虽不惧曹军,但惧白驹过隙……", + "#sbjushou1": "白马沉河共歃誓,怒涛没城亦不悔!", + "#sbjushou2": "汉水溢流断归路,守城之志穷且坚!", + "#sbjushou3": "山水速疾来去易,襄樊镇固永难开!", + "#sbjiewei1": "同袍之谊,断不可弃之!", + "#sbjiewei2": "贼虽势盛,若吾出马,亦可解之。", + "#sb_caoren:die": "吾身可殉,然襄樊之地万不可落于吴蜀之手……", + "#sbqiaoshi1": "拾樵城郭边,似有苔花开。", + "#sbqiaoshi2": "拾樵采薇,怡然自足。", + "#sbyanyu": null, + "#sbyanyu1": "燕语呢喃唤君归!", + "#sbyanyu2": "燕燕于飞,差池其羽。", + "#sb_xiahoushi:die": "玄鸟不曾归,君亦不再来……", + "#sbleiji1": "云涌风起,雷电聚集!", + "#sbleiji2": "乾坤无极,风雷受命!", + "#sbguidao1": "世间万法,殊途同归!", + "#sbguidao2": "从无邪恶之法,唯有作恶之人!", + "#sbhuangtian1": "汝等既顺黄天,当应天公之命!", + "#sbhuangtian2": "黄天佑我,道兵显威!", + "#sb_zhangjiao:die": "只叹未能覆汉,徒失天时。", + "#sbjianxiong1": "古今英雄盛世,尽赴沧海东流。", + "#sbjianxiong2": "骖六龙行御九州,行四海路下八邦!", + "#sbqingzheng1": "立威行严法,肃佞正国纲!", + "#sbqingzheng2": "悬杖分五色,治法扬清名。", + "#sbhujia1": "虎贲三千,堪当敌万余!", + "#sbhujia2": "壮士八百,足护卫吾身!", + "#sb_caocao:die": "狐死归首丘,故乡安可忘……", + "#sbluoshen1": "凌波荡兮微步,香罗袜兮生尘。", + "#sbluoshen2": "辛夷展兮修裙,紫藤舒兮绣裳。", + "#qingguo_sb_zhenji1": "商灵缤兮恭迎,伞盖纷兮若云。", + "#qingguo_sb_zhenji2": "晨张兮细帷,夕茸兮兰櫋。", + "#sb_zhenji:die": "秀目回兮难得,徒逍遥兮莫离……", + "#sbqixi1": "击敌不备,奇袭拔寨!", + "#sbqixi2": "轻羽透重铠,奇袭溃坚城!", + "#sbfenwei1": "舍身护主,扬吴将之风!", + "#sbfenwei2": "袭军挫阵,奋江东之威!", + "#sb_ganning:die": "蛮将休得猖狂!呃啊!", + "#mashu": null, + "#mashu1": null, + "#mashu2": null, + "#sbtieji1": "厉马秣兵,只待今日!", + "#sb_machao:die": "父兄妻儿具丧,吾有何面目活于世间……", + "#sbduanliang1": "常读兵法,终有良策也!", + "#sbshipo1": "已向尔等陈明利害,奉劝尔等早日归降!", + "#sbshipo2": "此时归降或可封赏,即至城破必斩无赦!", + "#sb_xuhuang:die": "为主效劳,何畏生死……", + "#sbpaoxiao1": "我乃燕人张飞,尔等休走!", + "#sbpaoxiao2": "战又不战,退又不退,却是何故!", + "#sbxieji1": "兄弟三人协力,破敌只在须臾!", + "#sbxieji2": "二哥,俺来助你!", + "#sbxieji3": "吴贼害我手足,此仇今日当报!", + "#sb_zhangfei:die": "不恤士卒,终为小人所害!", + "#sblongdan1": "长坂沥赤胆,佑主成忠名!", + "#sblongdan2": "龙驹染碧血,银枪照丹心!", + "#sbjizhu1": "义贯金石,忠以卫上!", + "#sbjizhu2": "遵奉法度,功效可书!", + "#sbjizhu3": "兴汉伟功,从今始成!", + "#sb_zhaoyun:die": "汉室未兴,功业未成……", + "#sbrende1": "仁德为政,自得民心!", + "#sbrende2": "此非吾心所愿,乃形势所迫耳!", + "#sbrende3": "民心所望,乃吾政所向!", + "#sbzhangwu1": "汉贼不两立,王业不偏安!", + "#sbzhangwu2": "众将皆言君恩,今当献身以报!", + "#sbjijiang1": "大汉将士,何人敢战?", + "#sbjijiang2": "匡扶汉室,岂能无诸将之助!", + "#sb_liubei:die": "汉室之兴,皆仰望丞相了……", + "#sbtiaoxin1": "汝等小儿,还不快跨马来战!", + "#sbtiaoxin2": "哼!既匹夫不战,不如归耕陇亩!", + "#sbzhiji1": "丞相之志,维岂敢忘之!", + "#sbzhiji2": "北定中原终有日!", + "#sb_jiangwei:die": "市井鱼龙易一统,护国麒麟难擎天……", + "#sbxuanhuo1": "虚名虽然无用,可沽万人之心。", + "#sbxuanhuo2": "效金台碣馆之事,布礼贤仁德之名。", + "#sbenyuan1": "恩如泰山,当还以东海。", + "#sbenyuan2": "汝既负我,哼哼,休怪军法无情!", + "#sb_fazheng:die": "蜀翼双折,吾主王业,就靠孔明了……", + "#sbmingce1": "分兵驻扎,可互为掎角之势。", + "#sbmingce2": "行吾此计,可使将军化险为夷。", + "#sbzhichi1": "将军勿急,我等可如此行事。", + "#sbzhichi2": "哎!怪我智迟,竟少算一步。", + "#sb_chengong:die": "何必多言!宫唯求一死……", + "#sblijian1": "太师若献妾于吕布,妾宁死不受此辱。", + "#sblijian2": "贱妾污浊之身,岂可复侍将军。", + "#sbbiyue1": "薄酒醉红颜,广袂羞掩面。", + "#sbbiyue2": "芳草更芊芊,荷池映玉颜。", + "#sb_diaochan:die": "终不负阿父之托……", + "#sbluanji1": "与我袁本初为敌,下场只有一个!", + "#sbluanji2": "弓弩手,乱箭齐下,射杀此贼!", + "#sbxueyi1": "四世三公之贵,岂是尔等寒门可及?", + "#sbxueyi2": "吾袁门名冠天下,何须奉天子为傀?", + "#sb_yuanshao:die": "我不可能输给曹阿瞒,不可能!", + "#sblianhuan1": "任凭潮涌,连环无惧!", + "#sblianhuan2": "并排横江,可利水战!", + "#sbniepan1": "凤雏涅槃,只为再生!", + "#sbniepan2": "烈火焚身,凤羽更丰!", + "#sb_pangtong:die": "落凤坡,果真为我葬身之地……", + "#sbjiang1": "义武奋扬,荡尽犯我之寇!", + "#sbjiang2": "锦绣江东,岂容小丑横行!", + "#sbhunzi1": "群雄逐鹿之时,正是吾等崭露头角之日!", + "#sbhunzi2": "胸中远志几时立,正逢建功立业时!", + "#sbzhiba1": "知君英豪,望来归效!", + "#sbzhiba2": "孰胜孰负,犹未可知!", + "#sb_sunce:die": "大志未展,权弟当继……", + "#sbguose1": "还望将军,稍等片刻。", + "#sbguose2": "将军,请留步。", + "#sbliuli1": "无论何时何地,我都在你身边。", + "#sbliuli2": "辗转流离,只为此刻与君相遇。", + "#sb_daqiao:die": "此心无可依,惟有泣别离……", + "#sbzishou1": "荆襄通连天下,我有何惧?", + "#sbzishou2": "据此人杰地灵之地,何必再行征战?", + "#sbzongshi1": "是时候讨伐悖逆之人了。", + "#sbzongshi2": "强汉之威,贼寇岂有不败之理?", + "#sb_liubiao:die": "我死之后,只望荆州仍然安定。", + "#sblieren1": "哼!可知本夫人厉害?", + "#sblieren2": "我的飞刀,谁敢小瞧?", + "#sbjuxiang1": "哼!何须我亲自出马!", + "#sbjuxiang2": "都给我留下吧!", + "#sb_zhurong:die": "大王……这诸葛亮果然厉害……", + "#sbhuoshou1": "我才是南中之主!", + "#sbhuoshou2": "整个南中都要听我的!", + "#sbzaiqi1": "且败且战,愈战愈勇!", + "#sbzaiqi2": "若有来日,必将汝等拿下!", + "#sb_menghuo:die": "吾等谨遵丞相教诲,永不复叛……", + "#nzry_mingren_1_sb_yl_luzhi1": "父不爱无益之子,君不蓄无用之臣!", + "#nzry_mingren_1_sb_yl_luzhi2": "老夫蒙国重恩,敢不捐躯以报!", + "#sbzhenliang1": "汉室艰祸繁兴,老夫岂忍宸极失御!", + "#sbzhenliang2": "犹思中兴之美,尚怀来苏之望!", + "#sb_yl_luzhi:die": "历数有尽,天命有归……", + "#sbtianxiang1": "凤眸流盼,美目含情。", + "#sbtianxiang2": "灿如春华,皎如秋月。", + "#xinhongyan_sb_xiaoqiao1": null, + "#xinhongyan_sb_xiaoqiao2": null, + "#sb_xiaoqiao:die": "朱颜易改,初心永在……", +}; diff --git a/character/shenhua.js b/character/shenhua.js deleted file mode 100755 index 887474fde..000000000 --- a/character/shenhua.js +++ /dev/null @@ -1,9558 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "shenhua", - connect: true, - characterSort: { - shenhua: { - shenhua_feng: [ - "sp_zhangjiao", - "re_yuji", - "old_zhoutai", - "old_caoren", - "re_xiahouyuan", - "xiaoqiao", - "re_huangzhong", - "re_weiyan", - ], - shenhua_huo: [ - "dianwei", - "xunyu", - "pangtong", - "sp_zhugeliang", - "taishici", - "yanwen", - "re_yuanshao", - "re_pangde", - ], - shenhua_lin: [ - "caopi", - "re_xuhuang", - "menghuo", - "zhurong", - "re_lusu", - "sunjian", - "dongzhuo", - "jiaxu", - ], - shenhua_shan: [ - "dengai", - "zhanghe", - "liushan", - "jiangwei", - "zhangzhang", - "sunce", - "caiwenji", - "zuoci", - ], - shenhua_yin: [ - "wangji", - "kuailiangkuaiyue", - "yanyan", - "wangping", - "sunliang", - "luji", - "xuyou", - "yl_luzhi", - ], - shenhua_lei: [ - "haozhao", - "guanqiujian", - "chendao", - "zhugezhan", - "lukang", - "zhoufei", - "zhangxiu", - "yl_yuanshu", - ], - }, - }, - character: { - re_huangzhong: ["male", "shu", 4, ["xinliegong"]], - old_zhoutai: ["male", "wu", 4, ["gzbuqu"]], - old_caoren: ["male", "wei", 4, ["jushou"]], - re_xuhuang: ["male", "wei", 4, ["duanliang", "jiezi"]], - re_pangde: ["male", "qun", 4, ["mashu", "jianchu"]], - re_xiahouyuan: ["male", "wei", 4, ["xinshensu"]], - re_weiyan: ["male", "shu", 4, ["xinkuanggu", "qimou"]], - xiaoqiao: ["female", "wu", 3, ["retianxiang", "hongyan"]], - sp_zhangjiao: ["male", "qun", 3, ["releiji", "guidao", "huangtian"], ["zhu"]], - re_yuji: ["male", "qun", 3, ["xinfu_guhuo"]], - // yuji:['male','qun',3,['guhuo']], - // xin_yuji:['male','qun',3,['guhuo']], - - sp_zhugeliang: ["male", "shu", 3, ["bazhen", "huoji", "kanpo"]], - pangtong: ["male", "shu", 3, ["lianhuan", "oldniepan"]], - xunyu: ["male", "wei", 3, ["quhu", "jieming"], ["clan:颍川荀氏"]], - dianwei: ["male", "wei", 4, ["qiangxix"]], - taishici: ["male", "wu", 4, ["tianyi"]], - yanwen: ["male", "qun", 4, ["shuangxiong"]], - re_yuanshao: ["male", "qun", 4, ["luanji", "xueyi"], ["zhu"]], - - menghuo: ["male", "shu", 4, ["huoshou", "zaiqixx"]], - zhurong: ["female", "shu", 4, ["juxiang", "lieren"]], - caopi: ["male", "wei", 3, ["xingshang", "fangzhu", "songwei"], ["zhu"]], - re_lusu: ["male", "wu", 3, ["haoshi", "dimeng"]], - sunjian: ["male", "wu", 4, ["gzyinghun"]], - dongzhuo: ["male", "qun", 8, ["jiuchi", "roulin", "benghuai", "baonue"], ["zhu"]], - jiaxu: ["male", "qun", 3, ["luanwu", "wansha", "weimu"]], - - jiangwei: ["male", "shu", 4, ["tiaoxin", "zhiji"]], - liushan: ["male", "shu", 3, ["xiangle", "fangquan", "ruoyu"], ["zhu"]], - zhanghe: ["male", "wei", 4, ["qiaobian"]], - dengai: ["male", "wei", 4, ["tuntian", "zaoxian"]], - sunce: ["male", "wu", 4, ["jiang", "hunzi", "zhiba"], ["zhu"]], - zhangzhang: ["male", "wu", 3, ["zhijian", "guzheng"]], - caiwenji: ["female", "qun", 3, ["beige", "duanchang"]], - zuoci: ["male", "qun", 3, ["huashen", "xinsheng"]], - - wangji: ["male", "wei", 3, ["qizhi", "jinqu"]], - yanyan: ["male", "shu", 4, ["nzry_juzhan"], []], - wangping: ["male", "shu", 4, ["nzry_feijun", "nzry_binglve"], []], - luji: ["male", "wu", 3, ["nzry_huaiju", "nzry_yili", "nzry_zhenglun"], []], - sunliang: ["male", "wu", 3, ["nzry_kuizhu", "nzry_zhizheng", "nzry_lijun"], ["zhu"]], - xuyou: ["male", "qun", 3, ["nzry_chenglve", "nzry_shicai", "nzry_cunmu"]], - yl_luzhi: ["male", "qun", 3, ["nzry_mingren", "nzry_zhenliang"], ["die_audio"]], - kuailiangkuaiyue: ["male", "wei", 3, ["nzry_jianxiang", "nzry_shenshi"], []], - - guanqiujian: ["male", "wei", 4, ["zhengrong", "hongju"]], - haozhao: ["male", "wei", 4, ["drlt_zhenggu"], []], - zhugezhan: ["male", "shu", 3, ["xinfu_zuilun", "xinfu_fuyin"], []], - lukang: ["male", "wu", 4, ["drlt_qianjie", "drlt_jueyan", "drlt_poshi"], []], - yl_yuanshu: ["male", "qun", 4, ["drlt_yongsi", "drlt_weidi"], ["zhu"]], - zhangxiu: ["male", "qun", 4, ["drlt_xiongluan", "drlt_congjian", "twjuxiang"], ["zhu"]], - chendao: ["male", "shu", 4, ["dcwanglie"], []], - zhoufei: ["female", "wu", 3, ["olliangyin", "olkongsheng"]], - }, - perfectPair: { - jiaxu: ["liqueguosi"], - re_yuanshao: ["yanwen", "tianfeng"], - menghuo: ["zhurong"], - sp_zhugeliang: ["pangtong", "huangyueying"], - sunce: ["zhouyu", "taishici", "daqiao"], - zuoci: ["yuji"], - xunyu: ["xunyou"], - lukang: ["luxun"], - yuanshu: ["jiling"], - zhangxiu: ["jiaxu"], - wangping: ["jiangfei"], - jiangwei: ["xiahouba"], - guanqiujian: ["wenqin"], - }, - characterFilter: { - zuoci(mode) { - return mode != "guozhan"; - }, - }, - characterIntro: { - huangzhong: - "字汉升,今河南南阳人。汉末三国时期蜀汉名将。本为刘表部下中郎将,后归刘备,并助刘备攻益州刘璋,在定军山一战中阵斩曹操部下名将夏侯渊。备称汉中王后改封后将军,赐关内侯。", - weiyan: "字文长,义阳人。三国时期蜀汉名将,诸葛亮死后,魏延因被陷害谋反而遭杨仪一党所杀。", - xiahouyuan: - "字妙才,沛国谯人。东汉末年曹操部下名将,夏侯惇之族弟,八虎骑之一。群雄征讨董卓时随曹操一同起兵,后征战四方,屡立功勋。在平定马超叛乱后负责西北防线的镇守。公元219年刘备攻打汉中,被刘备部将黄忠所杀。", - caoren: "字子孝,沛国谯人,曹操的从弟。三国时期曹魏名将,官至大司马。谥曰忠侯。", - xiaoqiao: - "庐江皖县人也。父桥国老德尊于时。小乔国色流离,资貌绝伦。建安三年,周瑜协策攻皖,拔之。娶小乔为妻。后人谓英雄美女,天作之合。", - zhoutai: - "字幼平,九江下蔡人,三国时期吴国武将。早年与蒋钦随孙策左右,立过数次战功。孙策讨伐六县山贼时,周泰胆气绝伦,保卫孙权,勇战退敌,身受十二处伤。有诗云:三番救主出重围,忠勇如公世所稀。遍体疮痍犹痛饮,血痕残酒满征衣。", - yuji: "自号太平道人,琅琊人,在吴郡、会稽一带为百姓治病,甚得人心。孙策怒之,以惑人心为由斩之,后策常受吉咒而亡。", - zhangjiao: - "乱世的开始,黄巾起义军首领,太平道创始人。张角早年信奉黄老学说,对在汉代十分流行的谶纬之学也深有研究,对民间医术 、巫术也很熟悉。", - dianwei: - "己吾城村人。东汉末年曹魏猛将。擅使大双戟,为人壮猛任侠,曾为乡人刘氏报仇,杀人出市,人莫敢近。相貌魁梧,膂力过人。建安二年(197),张绣背叛曹操,典韦为保护曹操而独挡叛军,击杀多人,但最终因寡不敌众而战死。", - xunyu: "荀彧,字文若,颍川颍阴(今河南许昌)人。东汉末年曹操帐下首席谋臣,杰出的战略家。自小被世人称作“王佐之才”。", - pangtong: - "庞统,字士元,襄阳(治今湖北襄阳)人。三国时刘备帐下谋士,官拜军师中郎将。才智与诸葛亮齐名,人称“凤雏”。在进围雒县时,统率众攻城,不幸被流矢击中去世,时年三十六岁。追赐统为关内侯,谥曰靖侯。庞统死后,葬于落凤庞统墓坡。", - sp_zhugeliang: - "字孔明,号卧龙居士,琅琊阳都人。刘备曾“三顾茅庐”得见卧龙。卧龙以一篇《隆中对》分析天下形势,提出先取荆州,再取益州成鼎足之势的说法。《三国演义》中的诸葛亮善用“火攻”,曾用火攻战术赢得多场战役,如“火烧赤壁”、“火烧博望坡”、“火烧藤甲兵”等。", - taishici: - "太史慈,字子义,东莱黄县(今山东龙口东黄城集)人。东汉末年武将,守言应诺,恪遵信义,始终如一,弭息诽论。官至建昌都尉。弓马熟练,箭法精良。原为刘繇部下,后被孙策收降,于赤壁之战前病逝,死时才四十一岁。", - pangde: "字令明,东汉末年雍州南安郡狟道县(今甘肃天水市武山县四门镇)人。曹操部下重要将领。官至立义将军,拜关门亭侯。谥曰壮侯。有一子庞会。", - yanwen: "东汉末年河北袁绍部下武将,素有威名。颜良与文丑一起作为袁绍军队的勇将而闻名。建安四年(199),袁绍以颜良、文丑为将,率精卒十万,准备攻许都;次年,兵进黎阳,遣颜良攻白马。终均亡于关羽刀下。", - yuanshao: - "字本初,汉族,汝南汝阳人,出身名门望族,自曾祖父起四代有五人位居三公,自己也居三公之上,其家族也因此有“四世三公”之称。曾于初平元年被推举为反董卓联合军的盟主,联军瓦解后,在汉末群雄割据的过程中,袁绍先占据冀州,又先后夺青、并二州,并于建安四年击败了割据幽州的军阀公孙瓒,势力达到顶点;但在建安五年的官渡之战中败于曹操。在平定冀州叛乱之后,于建安七年病死。", - xuhuang: - "字公明,河东杨人。三国时期曹魏名将,本为杨奉帐下骑都尉,杨奉被曹操击败后转投曹操,在曹操手下多立功勋,参与官渡、赤壁、关中征伐、汉中征伐等几次重大战役。", - caopi: "字子桓,三国时期著名的政治家、文学家,曹魏的开国皇帝,公元220-226年在位。沛国谯人,魏武帝曹操与武宣卞皇后的长子。去世后庙号高祖,谥为文皇帝,葬于首阳陵。", - sunjian: - "字文台,汉族,吴郡富春人。东汉末期地方军阀,著名将领。史书说他“容貌不凡,性阔达,好奇节”,是大军事家孙武的后裔。汉末群雄之一,三国中吴国的奠基人。孙权建国后,追谥孙坚为武烈皇帝。", - dongzhuo: - "字仲颖,陇西临洮人。东汉末年少帝、献帝时权臣,西凉军阀。官至太师、郿侯。其为人残忍嗜杀,倒行逆施,招致群雄联合讨伐,但联合军在董卓迁都长安不久后瓦解。后被其亲信吕布所杀。", - zhurong: - "据传为火神祝融氏后裔,南蛮王孟获之妻。武艺超群,善使飞刀,是《三国演义》中写到的唯一真正上过战场的女性。曾与孟获一起抵抗蜀军,在诸葛亮七擒七纵孟获之后,随孟获投降蜀汉。", - menghuo: - "中国三国时期南中少数族首领。系东汉末益州建宁郡( 今云南晋宁东 )大姓,身材肥硕。生卒年不详。官至御史中丞。曾被诸葛亮七擒七纵,传为佳话。", - jiaxu: "字文和,武威姑臧人。三国时期魏国著名谋士。曾先后担任三国军阀李傕、张绣、曹操的谋士。官至魏国太尉,谥曰肃侯。", - lusu: "字子敬,汉族,临淮东城人,中国东汉末年东吴的著名军事统帅。他曾为孙权提出鼎足江东的战略规划,因此得到孙权的赏识,于周瑜死后代替周瑜领兵,守陆口。曾单刀赴会关羽于荆州。", - zhanghe: - "字儁乂,河间鄚人。三国时期魏国名将。官渡之战时,本为袁绍部将的张郃投降了曹操,并在曹操帐下多立功勋,于曹魏建立后加封为征西车骑将军。诸葛亮六出祁山之间,张郃多次抵御蜀军的进攻,于公元231年在木门道被诸葛亮设伏射死。后谥曰壮侯。为曹魏“五子良将”之一。", - dengai: "字士载,义阳棘阳人。三国时期魏国杰出的军事家、将领。公元263年他与钟会分别率军攻打蜀汉,最后他率先进入成都,使得蜀汉灭亡。后因遭到钟会的污蔑和陷害,被司马昭猜忌而被收押,最后与其子邓忠一起被卫瓘派遣的武将田续所杀害。", - jiangwei: - "字伯约,天水冀人。三国时期蜀汉著名将领、军事统帅。原为曹魏天水郡的中郎将,后降蜀汉,官至凉州刺史、大将军。诸葛亮去世后继承诸葛亮的遗志,继续率领蜀汉军队北伐曹魏,与曹魏名将陈泰、郭淮、邓艾等多次交手。", - liushan: - "蜀汉后主,字公嗣。小名阿斗。刘备之子,母亲是昭烈皇后甘氏。三国时期蜀汉第二位皇帝,公元223-263年在位。公元263年蜀汉被曹魏所灭,刘禅投降曹魏,被封为安乐公。", - sunce: "字伯符,吴郡富春人。孙坚长子,孙权长兄。东汉末年割据江东一带的军阀,汉末群雄之一,三国时期吴国的奠基者。三国演义中绰号“小霸王”,统一江东。在一次狩猎中为刺客所伤,不久后身亡,年仅二十六岁。其弟孙权接掌孙策势力,并于称帝后,追谥孙策为长沙桓王。", - zhangzhang: - "张昭,字子布,彭城人,三国时期吴国重臣,善丹青。拜辅吴将军,班亚三司,改封娄侯。年八十一卒,谥曰文侯。张纮,字子纲,广陵人。东吴谋士,和张昭一起合称“二张”。孙策平定江东时亲自登门邀请,张纮遂出仕为官。张纮后来建议孙权迁都秣陵,孙权正在准备时张纮病逝,其年六十岁。孙权为之流涕。", - zuoci: "左慈,字元放,东汉末方士,汉族,庐江(今安徽庐江西南)人。在道教历史上,东汉时期的丹鼎派道术是从他一脉相传。", - caiwenji: - "名琰,原字昭姬,晋时避司马昭讳,改字文姬,东汉末年陈留圉(今河南开封杞县)人,东汉大文学家蔡邕的女儿,是中国历史上著名的才女和文学家,精于天文数理,既博学能文,又善诗赋,兼长辩才与音律。代表作有《胡笳十八拍》、《悲愤诗》等 。", - - yanyan: "严颜,东汉末年武将,初为刘璋部下,担任巴郡太守。建安十九年,刘备进攻江州,严颜战败被俘,张飞对严颜说:“大军至,何以不降而敢拒战?”,严颜回答说:“卿等无状,侵夺我州,我州但有断头将军,无降将军也!”,张飞生气,命左右将严颜牵去砍头,严颜表情不变地说:“砍头便砍头,何为怒邪!”张飞敬佩严颜的勇气,遂释放严颜并以严颜为宾客,之后的事迹不在正史中出现。", - wangping: - "王平,字子均,巴西宕渠(今四川省渠县东北)人,籍贯益州。三国时蜀汉后期大将。原属曹操,曹操与刘备争汉中,得以投降刘备。诸葛亮第一次北伐时与马谡一同守街亭,之后深受诸葛亮的器重,率领蜀汉的王牌军队无当飞军,多次随诸葛亮北伐。诸葛亮死后,拜前监军、镇北大将军,镇守汉中,曹爽率领十万大军攻汉中时,被王平所击退,累封安汉侯。延熙十一年,王平去世,其子王训继承了爵位。", - luji: "陆绩(公元188年-公元219年),字公纪,吴郡吴县(今苏州)人,汉末庐江太守陆康之子。陆绩成年后,博学多识,通晓天文、历算,星历算数无不涉览。孙权征其为奏曹掾,常以直道见惮。后出为郁林太守,加偏将军。在军中不废著作,曾作《浑天图》,注《易经》,撰写《太玄经注》。", - sunliang: - "孙亮(243-260年),字子明,吴郡富春(今浙江杭州富阳区)人。三国时期吴国的第二位皇帝,公元252-258年在位。吴大帝孙权第七子,母潘皇后。史称吴少帝、吴废帝、会稽王。建兴元年(252年),十岁登基为帝,太平二年(257年),十五岁亲政,但一年后(258年)就被权臣孙綝废为会稽王。永安三年(260年),孙亮再被贬为候官侯,在前往封地途中自杀(一说被毒杀),终年18岁。西晋太康年间,原先任职吴国的官员戴显将孙亮的遗骨葬在赖乡。", - xuyou: "许攸(?-204年),字子远,南阳(治今河南南阳)人。本为袁绍帐下谋士,官渡之战时其家人因犯法而被收捕,许攸因此背袁投曹,并为曹操设下偷袭袁绍军屯粮之所乌巢的计策,袁绍因此而大败于官渡。后许攸随曹操平定冀州,因自恃其功而屡屡口出狂言,终因触怒曹操而被杀。", - yl_luzhi: - "卢植(139年—192年),字子干。涿郡涿县(今河北涿州)人。东汉末年经学家、将领。卢植性格刚毅,师从太尉陈球、大儒马融等,为郑玄、管宁、华歆的同门师兄。曾先后担任九江、庐江太守,平定蛮族叛乱。后与马日磾、蔡邕等一起在东观校勘儒学经典书籍,并参与续写《汉记》。黄巾起义时为北中郎将,率军与张角交战,后被诬陷下狱,皇甫嵩平定黄巾后力救卢植,于是复任为尚书。后因上谏激怒董卓被免官,隐居在上谷军都山,被袁绍请为军师。初平三年(192年)去世。著有《尚书章句》、《三礼解诂》等,今皆失佚。唐代时配享孔子,北宋时被追封为良乡伯。白马将军公孙瓒以及后来的蜀汉昭烈帝刘备皆为卢植门下弟子。范阳卢氏后来也成为著名的家族。", - kuailiangkuaiyue: - "蒯良,字子柔,襄阳中庐人。归刘表。蒯良为刘表定下安抚荆楚的政治方向,佐其成业,被刘表誉为“雍季之论”。之后,蒯良就被刘表擢升为主簿(bù)。其后蒯良的生平,就不得而知了,《三国志》亦没有记载其卒年。与蒯越、以及同样活跃于襄阳的蒯祺(诸葛亮姐夫)或为同族兄弟。蒯越(?-214年),字异度,襄阳中庐(今湖北襄阳西南)人。东汉末期人物,演义中为蒯良之弟。原本是荆州牧刘表的部下,曾经在刘表初上任时帮助刘表铲除荆州一带的宗贼(以宗族、乡里关系组成的武装集团)。刘表病逝后与刘琮一同投降曹操,后来官至光禄勋。", - - guanqiujian: - "毌丘俭,字仲恭,河东闻喜(今山西闻喜县)人。三国时期曹魏后期的重要将领。继承父毌丘兴爵位高阳乡侯,任平原侯文学。魏明帝即位后,上疏劝魏明帝停止加建皇宫的工程,升为荆州刺史。景初二年(238年)从司马懿攻灭公孙渊;正始五年(244年)至正始六年(245年)两次率兵征讨高句丽,攻破丸都,几亡其国,刻石纪功而还;253年击退吴国诸葛恪的大举进犯,战功累累。司马师废帝,毌丘俭感昔日魏明帝之恩,为曹魏政权做拼死一搏,于正元二年(255年)发动兵变,即后人所谓“淮南三叛”(王淩、毌丘俭、诸葛诞)之一,惜准备不足,兵败身亡。", - haozhao: - "郝昭(生卒年不详),字伯道,太原人,中国东汉末年至曹魏初年著名将领。郝昭少年从军,屡立战功,逐渐晋升为杂号将军,后受曹真的推荐镇守陈仓(在小说三国演义中是司马懿推荐),防御蜀汉。太和二年(228年),诸葛亮率军北伐,为郝昭所阻,劝降不成,昼夜相攻二十余日后被迫退军。魏明帝因此封其为关内侯。不久因染疾而病死。", - zhugezhan: - "诸葛瞻,字思远,琅邪阳都(今山东沂南县)人。三国时期蜀汉大臣,蜀汉丞相诸葛亮之子。邓艾伐蜀时,他与长子诸葛尚及蜀将张遵、李球、黄崇等人防御绵竹(今四川德阳),因不听黄崇速占险要的建议而坐失良机,后来出城与邓艾决战,在交战时阵亡,绵竹也随后失守。", - zhoufei: - "周妃(210年?—?),一说本名周彻。周瑜独女,生母无载,疑为汉末美女小乔,因嫁孙登为太子妃,故称周妃。周瑜英年早逝,其遗孤都得到孙权厚遇,除却她本人在黄武四年(225年)嫁予太子外,兄长周循亦娶孙权长女孙鲁班为妻。", - lukang: "陆抗,字幼节,吴郡吴县(今江苏苏州)人。三国时期吴国名将,丞相陆逊次子。陆抗袭父爵为江陵侯,为建武校尉,领其父众五千人。后迁立节中郎将、镇军将军等。孙皓为帝,任镇军大将军、都督西陵、信陵、夷道、乐乡、公安诸军事,驻乐乡(今湖北江陵西南)。凤凰元年(272年),击退晋将羊祜进攻,并攻杀叛将西陵督步阐。后拜大司马、荆州牧,卒于官,终年49岁。与陆逊皆是吴国的中流砥柱,并称“逊抗 ”,被誉为吴国最后的名将。", - zhangxiu: - "张绣,武威祖厉(今甘肃靖远)人。骠骑将军张济的从子。东汉末年割据宛城的军阀,汉末群雄之一。初随张济征伐,张济死后与刘表联合。后降曹操,因曹操调戏其嫂而突袭曹操,复与刘表连和。官渡之战前夕,听从贾诩的建议再次投降曹操,参加官渡之战,官至破羌将军,封宣威侯。在北征乌桓(207年)途中去世(一说为曹丕逼死),谥定侯。", - chendao: - "陈到,字叔至,生卒年不详,豫州汝南(今河南驻马店平舆县)人。三国时期蜀汉将领,刘备帐下白毦兵统领,名位常亚于赵云,以忠勇著称。蜀汉建兴年间,任征西将军、永安都督,封亭侯。在任期间去世。", - }, - /** @type { importCharacterConfig['skill'] } */ - skill: { - //庞统写法修改 - lianhuan: { - audio: 2, - hiddenCard(player, name) { - return name == "tiesuo" && player.hasCard((card) => get.suit(card) == "club", "sh"); - }, - enable: "chooseToUse", - filter(event, player) { - if (!player.hasCard((card) => get.suit(card) == "club", "sh")) return false; - return ( - event.type == "phase" || - event.filterCard(get.autoViewAs({ name: "tiesuo" }, "unsure"), player, event) - ); - }, - position: "hs", - filterCard(card, player, event) { - if (!event) event = _status.event; - if (get.suit(card) != "club") return false; - if (event.type == "phase" && get.position(card) != "s" && player.canRecast(card)) { - return true; - } else { - if (game.checkMod(card, player, "unchanged", "cardEnabled2", player) === false) - return false; - const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); - return event._backup.filterCard(cardx, player, event); - } - }, - filterTarget(fuck, player, target) { - const card = ui.selected.cards[0], - event = _status.event, - backup = event._backup; - if (!card || game.checkMod(card, player, "unchanged", "cardEnabled2", player) === false) - return false; - const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); - return ( - backup.filterCard(cardx, player, event) && backup.filterTarget(cardx, player, target) - ); - }, - selectTarget() { - const card = ui.selected.cards[0], - event = _status.event, - player = event.player, - backup = event._backup; - let recast = false, - use = false; - const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); - if (event.type == "phase" && player.canRecast(card)) recast = true; - if (game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false) { - if (backup.filterCard(cardx, player, event)) use = true; - } - if (!use) return [0, 0]; - else { - const select = backup.selectTarget(cardx, player); - if (recast && select[0] > 0) select[0] = 0; - return select; - } - }, - filterOk() { - const card = ui.selected.cards[0], - event = _status.event, - player = event.player, - backup = event._backup; - const selected = ui.selected.targets.length; - let recast = false, - use = false; - const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); - if (event.type == "phase" && player.canRecast(card)) recast = true; - if (game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false) { - if (backup.filterCard(cardx, player, event)) use = true; - } - if (recast && selected == 0) { - return true; - } else if (use) { - const select = backup.selectTarget(cardx, player); - if (select[0] <= -1) return true; - return selected >= select[0] && selected <= select[1]; - } - }, - discard: false, - lose: false, - delay: false, - async precontent(event, trigger, player) { - var result = event.result; - if (result.targets.length > 0) - result.card = get.autoViewAs({ name: "tiesuo" }, result.cards); - }, - async content(event, trigger, player) { - player.recast(event.cards); - }, - }, - //新杀小加强 陈到 - dcwanglie: { - audio: "drlt_wanglie", - locked: false, - mod: { - targetInRange(card, player, target) { - if (player.hasSkill("dcwanglie_effect", null, null, false)) return true; - }, - }, - trigger: { - player: "useCard", - }, - filter(event, player) { - return ( - player.isPhaseUsing() && (event.card.name == "sha" || get.type(event.card) == "trick") - ); - }, - preHidden: true, - check(event, player) { - if (player.hasSkill("dcwanglie2", null, null, false)) return true; - if (["wuzhong", "kaihua", "dongzhuxianji"].includes(event.card.name)) return false; - player._wanglie_temp = true; - var eff = 0; - for (var i of event.targets) { - eff += get.effect(i, event.card, player, player); - } - delete player._wanglie_temp; - if (eff < 0) return true; - if ( - !player.countCards("h", function (card) { - return player.hasValueTarget(card, null, true); - }) - ) - return true; - if ( - get.tag(event.card, "damage") && - !player.needsToDiscard() && - !player.countCards("h", function (card) { - return get.tag(card, "damage") && player.hasValueTarget(card, null, true); - }) - ) - return true; - return false; - }, - prompt2(event) { - return ( - "令" + - get.translation(event.card) + - "不能被响应,然后本阶段你使用牌只能指定自己为目标" - ); - }, - group: "dcwanglie_startup", - async content(event, trigger, player) { - trigger.nowuxie = true; - trigger.directHit.addArray(game.players); - player.addTempSkill("dcwanglie2", "phaseUseAfter"); - }, - subSkill: { - startup: { - trigger: { player: "phaseUseBegin" }, - forced: true, - popup: false, - async content(event, trigger, player) { - player.addTempSkill("dcwanglie_effect", "phaseUseAfter"); - }, - }, - effect: { - forced: true, - charlotte: true, - firstDo: true, - popup: false, - trigger: { player: "useCard1" }, - filter(event, player) { - return event.targets.some((target) => target != player); - }, - async content(event, trigger, player) { - player.addMark("dcwanglie_effect", 1, false); - if (player.countMark("dcwanglie_effect") >= 2) - player.removeSkill("dcwanglie_effect"); - }, - onremove: true, - }, - }, - ai: { - //pretao:true, - directHit_ai: true, - skillTagFilter(player, tag, arg) { - //if(tag=='pretao') return true; - if (player._wanglie_temp) return false; - player._wanglie_temp = true; - var bool = (function () { - if (["wuzhong", "kaihua", "dongzhuxianji"].includes(arg.card.name)) return false; - if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false; - var cards = player.getCards("h", function (card) { - return ( - card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) - ); - }); - var sha = player.getCardUsable("sha"); - if (arg.card.name == "sha") sha--; - cards = cards.filter(function (card) { - if (card.name == "sha" && sha <= 0) return false; - return player.hasValueTarget(card, null, true); - }); - if (!cards.length) return true; - if (!get.tag(arg.card, "damage")) return false; - if ( - !player.needsToDiscard() && - !cards.filter(function (card) { - return get.tag(card, "damage"); - }).length - ) - return true; - return false; - })(); - delete player._wanglie_temp; - return bool; - }, - }, - }, - dcwanglie2: { - charlotte: true, - mod: { - playerEnabled(card, player, target) { - if (player != target) return false; - }, - }, - }, - //周妃 - olliangyin: { - audio: "liangyin", - trigger: { - global: ["loseAfter", "addToExpansionAfter", "cardsGotoSpecialAfter", "loseAsyncAfter"], - }, - filter(event, player, name) { - if (event.name == "lose" || event.name == "loseAsync") - return event.getlx !== false && event.toStorage == true; - if (event.name == "cardsGotoSpecial") return !event.notrigger; - return true; - }, - direct: true, - usable: 1, - async content(event, trigger, player) { - const { result: { bool, targets } } = await player - .chooseTarget( - get.prompt("olliangyin"), - "选择一名其他角色,你与其各摸一张牌", - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player, - num = player.getExpansions("olkongsheng").length - 1; - var att = get.attitude(player, target); - if (att <= 0) return 0; - if ( - target.countCards("h") == num && - target.isDamaged() && - get.recoverEffect(target, player, player) > 0 - ) - return 3 * att; - return att; - }); - if (bool) { - const target = targets[0]; - event.target = target; - player.logSkill("olliangyin", target); - await game.asyncDraw([player, target].sortBySeat()); - } - else return; - await game.asyncDelayx(); - let num = player.getExpansions("olkongsheng").length; - let check = player => { - if (!player.isIn() || player.isHealthy()) return false; - return player.countCards("h") == num; - }; - const { target } = event; - if (check(player) || check(target)) { - const choiceList = [ - "令自己回复1点体力", - "令" + get.translation(target) + "回复1点体力", - ]; - const choices = []; - if (check(player)) choices.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if (check(target)) choices.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - choices.push("cancel2"); - const { result : { control } } = await player - .chooseControl(choices) - .set("choiceList", choiceList) - .set("prompt", "良姻:是否令一名角色回复体力?") - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().target; - var list = _status.event.controls.slice(0), - eff1 = 0, - eff2 = 0; - if (list.includes("选项一")) eff1 = get.recoverEffect(player, player, player); - if (list.includes("选项二")) eff2 = get.recoverEffect(target, player, player); - if (eff1 > Math.max(0, eff2)) return "选项一"; - if (eff2 > 0) return "选项二"; - return "cancel2"; - }); - if (control == "选项一") await player.recover(); - else if (control == "选项二") await target.recover(); - } - }, - group: "olliangyin_gain", - subSkill: { - gain: { - audio: "liangyin", - trigger: { - global: [ - "loseAfter", - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - direct: true, - filter(event, player) { - return game.hasPlayer(function (current) { - var evt = event.getl(current); - return evt && (evt.xs.length > 0 || evt.ss.length > 0); - }); - }, - usable: 1, - async content(event, trigger, player) { - if ( - !player.countCards("he") || - !game.hasPlayer(current => current != player && - current.countCards("he") > 0) - ) return; - const { result: { bool, targets, cards } } = await player.chooseCardTarget({ - prompt: get.prompt("olliangyin"), - prompt2: "弃置一张牌,并令一名其他角色也弃置一张牌", - position: "he", - filterCard: lib.filter.cardDiscardable, - filterTarget(card, player, target) { - return target != player && target.countCards("he") > 0; - }, - ai1(card) { - let player = _status.event.player; - if (_status.event.me) { - if (get.position(card) === _status.event.me) - return 12 - player.hp - get.value(card); - return 0; - } - return 5 - get.value(card); - }, - ai2(target) { - let player = _status.event.player, - att = get.attitude(player, target); - if (att > 0 && (_status.event.me || target.isHealthy())) return -att; - if ( - att > 0 && - (target.countCards("he") > target.hp || - target.hasCard(function (card) { - return get.value(card, target) <= 0; - }, "e")) - ) - return att; - return -att; - }, - me: (() => { - if ( - player.isHealthy() || - get.recoverEffect(player, player, _status.event.player) <= 0 - ) - return false; - let ph = player.countCards("h"), - num = player.getExpansions("olkongsheng").length; - if (ph === num) { - if (player.hasSkillTag("noh")) return "h"; - return "e"; - } - if (ph - 1 === num) return "h"; - return false; - })(), - }); - if (bool) { - const target = targets[0]; - event.target = target; - player.logSkill("olliangyin_gain", target); - await player.discard(cards); - await target.chooseToDiscard("he", true); - } - else return; - await game.asyncDelayx(); - let num = player.getExpansions("olkongsheng").length; - let check = player => { - if (!player.isIn() || player.isHealthy()) return false; - return player.countCards("h") == num; - }; - const { target } = event; - if (check(player) || check(target)) { - const choiceList = [ - "令自己回复1点体力", - "令" + get.translation(target) + "回复1点体力", - ]; - const choices = []; - if (check(player)) choices.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if (check(target)) choices.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - choices.push("cancel2"); - const { result: { control } } = await player - .chooseControl(choices) - .set("choiceList", choiceList) - .set("prompt", "良姻:是否令一名角色回复体力?") - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().target; - var list = _status.event.controls.slice(0), - eff1 = 0, - eff2 = 0; - if (list.includes("选项一")) - eff1 = get.recoverEffect(player, player, player); - if (list.includes("选项二")) - eff2 = get.recoverEffect(target, player, player); - if (eff1 > Math.max(0, eff2)) return "选项一"; - if (eff2 > 0) return "选项二"; - return "cancel2"; - }); - if (control == "选项一") await player.recover(); - else if (control == "选项二") await target.recover(); - } - }, - }, - }, - }, - olkongsheng: { - audio: "kongsheng", - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter(event, player) { - return player.countCards("he") > 0; - }, - content() { - "step 0"; - player - .chooseCard( - "he", - [1, player.countCards("he")], - get.prompt("olkongsheng"), - "将任意张牌作为“箜”置于武将牌上" - ) - .set("ai", function (card) { - var player = _status.event.player, - num = player.getExpansions("olkongsheng") + ui.selected.cards.length; - if ( - ui.selected.cards.length > 0 && - game.hasPlayer(function (current) { - if ( - current.isHealthy() || - get.recoverEffect(current, player, player) <= 0 - ) - return false; - var num2 = - current.countCards("h", function (card) { - if (current != player) return true; - return !ui.selected.cards.includes(card); - }) + 1; - return num == num2; - }) - ) - return 0; - if (get.type(card, null, false) == "equip") { - for (var i of ui.selected.cards) { - if (get.type(i, null, false) == "equip") return 0; - } - return 5 - get.value(card); - } - if (!player.hasValueTarget(card)) return 1; - return 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("olkongsheng"); - player.addToExpansion(result.cards, player, "give").gaintag.add("olkongsheng"); - } - }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - group: "olkongsheng_kessoku", - subSkill: { - kessoku: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - locked: false, - filter(event, player) { - return ( - player.getExpansions("olkongsheng").filter(function (card) { - return get.type(card, false) != "equip"; - }).length > 0 - ); - }, - content() { - "step 0"; - var cards = player.getExpansions("olkongsheng").filter(function (card) { - return get.type(card, false) != "equip"; - }); - if (cards.length) player.gain(cards, "gain2"); - "step 1"; - var cards = player.getExpansions("olkongsheng"); - if (cards.length > 0) { - player - .chooseTarget(true, "令一名角色使用以下装备牌", get.translation(cards)) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "losehp" }, player, player); - }); - } else event.finish(); - "step 2"; - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - "step 3"; - var cards = player.getExpansions("olkongsheng").filter(function (i) { - return target.hasUseTarget(i); - }); - if (cards.length == 1) { - event._result = { bool: true, links: cards }; - } else if (cards.length) - target - .chooseButton(true, ["选择要使用的装备牌", cards]) - .set("ai", function (button) { - return get.order(button.link); - }); - else event.goto(5); - "step 4"; - if (result.bool) { - target.chooseUseTarget(result.links[0], true); - event.goto(3); - } - "step 5"; - target.loseHp(); - }, - }, - }, - }, - //新毌丘俭 - zhengrong: { - trigger: { player: "useCardToPlayered" }, - direct: true, - audio: "drlt_zhenrong", - filter(event, player) { - if (!event.isFirstTarget) return false; - if (!["basic", "trick"].includes(get.type(event.card))) return false; - if (get.tag(event.card, "damage")) - return game.hasPlayer(function (current) { - return ( - event.targets.includes(current) && - current.countCards("h") >= player.countCards("h") && - current.countCards("he") > 0 - ); - }); - return false; - }, - content() { - "step 0"; - player - .chooseTarget( - get.prompt("zhengrong"), - "将一名手牌数不小于你的目标角色的一张牌置于你的武将牌上,成为「荣」", - function (card, player, target) { - return ( - _status.event.targets.includes(target) && - target.countCards("h") >= player.countCards("h") && - target.countCards("he") > 0 - ); - } - ) - .set("ai", function (target) { - return (1 - get.attitude(_status.event.player, target)) / target.countCards("he"); - }) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = result.targets[0]; - player.logSkill("zhengrong", target); - player.choosePlayerCard(target, "he", true).ai = get.buttonValue; - } else event.finish(); - "step 2"; - if (result.bool) { - var card = result.links[0]; - player.addToExpansion(card, "give", "log", target).gaintag.add("zhengrong"); - } - }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - marktext: "荣", - intro: { - content: "expansion", - markcount: "expansion", - }, - }, - hongju: { - trigger: { player: "phaseZhunbeiBegin" }, - audio: "drlt_hongju", - forced: true, - unique: true, - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - derivation: "qingce", - filter(event, player) { - return player.getExpansions("zhengrong").length >= 3; - }, - content() { - "step 0"; - player.awakenSkill("hongju"); - var cards = player.getExpansions("zhengrong"); - if (!cards.length || !player.countCards("h")) { - event.goto(2); - return; - } - var next = player.chooseToMove("征荣:是否交换“荣”和手牌?"); - next.set("list", [ - [get.translation(player) + "(你)的“荣”", cards], - ["手牌区", player.getCards("h")], - ]); - next.set("filterMove", function (from, to) { - return typeof to != "number"; - }); - next.set("processAI", function (list) { - var player = _status.event.player, - cards = list[0][1].concat(list[1][1]).sort(function (a, b) { - return get.value(a) - get.value(b); - }), - cards2 = cards.splice(0, player.getExpansions("zhengrong").length); - return [cards2, cards]; - }); - "step 1"; - if (result.bool) { - var pushs = result.moved[0], - gains = result.moved[1]; - pushs.removeArray(player.getExpansions("zhengrong")); - gains.removeArray(player.getCards("h")); - if (!pushs.length || pushs.length != gains.length) return; - player.addToExpansion(pushs).gaintag.add("zhengrong"); - player.gain(gains, "gain2", "log"); - } - "step 2"; - player.addSkills("qingce"); - game.log(player, "获得了技能", "#g【清侧】"); - player.loseMaxHp(); - }, - ai: { - combo: "zhengrong" - }, - }, - qingce: { - enable: "phaseUse", - audio: "drlt_qingce", - filter(event, player) { - return player.getExpansions("zhengrong").length > 0 && player.countCards("h") > 0; - }, - chooseButton: { - dialog(event, player) { - return ui.create.dialog( - "请选择要获得的「荣」", - player.getExpansions("zhengrong"), - "hidden" - ); - }, - backup(links, player) { - return { - card: links[0], - filterCard: true, - position: "h", - filterTarget(card, player, target) { - return target.countDiscardableCards(player, "ej") > 0; - }, - delay: false, - audio: "drlt_qingce", - content: lib.skill.qingce.contentx, - ai: { - result: { - target(player, target) { - var att = get.attitude(player, target); - if ( - att > 0 && - (target.countCards("j") > 0 || - target.countCards("e", function (card) { - return get.value(card, target) < 0; - })) - ) - return 2; - if ( - att < 0 && - target.countCards("e") > 0 && - !target.hasSkillTag("noe") - ) - return -1; - return 0; - }, - }, - }, - }; - }, - prompt(links, player) { - return ( - "选择弃置一张手牌,获得" + - get.translation(links[0]) + - "并弃置一名角色装备区或判定区内的一张牌" - ); - }, - }, - contentx() { - "step 0"; - var card = lib.skill.qingce_backup.card; - player.gain(card, "gain2", "log"); - "step 1"; - if (target.countDiscardableCards(player, "ej") > 0) { - player.discardPlayerCard("ej", true, target); - } - }, - ai: { - combo: "zhengrong", - order: 8, - result: { - player(player) { - if ( - game.hasPlayer(function (current) { - var att = get.attitude(player, current); - if ( - (att > 0 && current.countCards("j") > 0) || - (att < 0 && current.countCards("e") > 0) - ) - return true; - return false; - }) - ) - return 1; - return 0; - }, - }, - }, - }, - //阴雷 - drlt_zhenrong: { - marktext: "荣", - intro: { - content: "expansion", - markcount: "expansion", - }, - audio: 2, - trigger: { - source: "damageSource", - }, - filter(event, player) { - return event.player != player && event.player.countCards("h") > player.countCards("h"); - }, - direct: true, - content() { - "step 0"; - player - .choosePlayerCard("hej", get.prompt("drlt_zhenrong"), trigger.player) - .set("ai", function (button) { - return -get.attitude(player, trigger.player) + 1; - }); - "step 1"; - if (result && result.links && result.links.length) { - player.line(player, trigger.player); - player.logSkill("drlt_zhenrong"); - player - .addToExpansion(result.links, trigger.player, "give", "log") - .gaintag.add("drlt_zhenrong"); - } - }, - }, - drlt_hongju: { - skillAnimation: true, - animationColor: "thunder", - audio: 2, - trigger: { - player: "phaseZhunbeiBegin", - }, - forced: true, - unique: true, - juexingji: true, - derivation: ["drlt_qingce"], - filter(event, player) { - return player.getExpansions("drlt_zhenrong").length >= 3 && game.dead.length > 0; - }, - content() { - "step 0"; - player.awakenSkill("drlt_hongju"); - var cards = player.getExpansions("drlt_zhenrong"); - if (!cards.length || !player.countCards("h")) { - event.goto(2); - return; - } - var next = player.chooseToMove("征荣:是否交换“荣”和手牌?"); - next.set("list", [ - [get.translation(player) + "(你)的“荣”", cards], - ["手牌区", player.getCards("h")], - ]); - next.set("filterMove", function (from, to) { - return typeof to != "number"; - }); - next.set("processAI", function (list) { - var player = _status.event.player, - cards = list[0][1].concat(list[1][1]).sort(function (a, b) { - return get.value(a) - get.value(b); - }), - cards2 = cards.splice(0, player.getExpansions("drlt_zhenrong").length); - return [cards2, cards]; - }); - "step 1"; - if (result.bool) { - var pushs = result.moved[0], - gains = result.moved[1]; - pushs.removeArray(player.getExpansions("drlt_zhenrong")); - gains.removeArray(player.getCards("h")); - if (!pushs.length || pushs.length != gains.length) return; - player.addToExpansion(pushs).gaintag.add("drlt_zhenrong"); - player.gain(gains, "gain2", "log"); - } - "step 2"; - player.addSkills("drlt_qingce"); - player.loseMaxHp(); - }, - ai: { - combo: "drlt_zhenrong" - }, - }, - drlt_qingce: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return player.getExpansions("drlt_zhenrong").length > 0; - }, - filterTarget(card, player, target) { - return target.countDiscardableCards(player, "ej") > 0; - }, - content() { - "step 0"; - player.chooseCardButton( - player.getExpansions("drlt_zhenrong"), - 1, - "请选择需要弃置的“荣”", - true - ).ai = function (button) { - return 6 - get.value(button.link); - }; - "step 1"; - if (result.bool) { - var cards = result.links; - player.loseToDiscardpile(cards); - player.discardPlayerCard(target, "ej", 1, true); - } - }, - ai: { - combo: "drlt_zhenrong", - order: 13, - result: { - target(player, target) { - if (get.attitude(player, target) > 0 && target.countCards("j") > 0) return 1; - return -1; - }, - }, - }, - }, - drlt_zhenggu: { - audio: 2, - trigger: { - player: "phaseJieshuBegin", - }, - direct: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("drlt_zhenggu"), function (card, player, target) { - //if(target.storage.drlt_zhenggu_mark&&target.storage.drlt_zhenggu_mark.includes(player)) return false; - return target != player; - }) - .set("ai", function (target) { - var player = _status.event.player; - //if(target.storage.drlt_zhenggu_mark&&target.storage.drlt_zhenggu_mark.includes(player)) return 0; - var num = Math.min(5, player.countCards("h")) - target.countCards("h"); - var att = get.attitude(player, target); - return num * att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("drlt_zhenggu", target); - player.addSkill("drlt_zhenggu2"); - target.addSkill("drlt_zhenggu_mark"); - target.storage.drlt_zhenggu_mark.push(player); - target.markSkill("drlt_zhenggu_mark"); - lib.skill.drlt_zhenggu.sync(player, target); - } - }, - sync(player, target) { - var num = player.countCards("h"); - var num2 = target.countCards("h"); - if (num < num2) { - target.chooseToDiscard(num2 - num, true, "h"); - } else target.drawTo(Math.min(5, num)); - }, - }, - drlt_zhenggu2: { - audio: "drlt_zhenggu", - trigger: { - global: "phaseEnd", - }, - forced: true, - charlotte: true, - logTarget: "player", - filter(event, player) { - return ( - event.player.storage.drlt_zhenggu_mark && - event.player.storage.drlt_zhenggu_mark.includes(player) - ); - }, - content() { - while (trigger.player.storage.drlt_zhenggu_mark.includes(player)) { - trigger.player.storage.drlt_zhenggu_mark.remove(player); - } - if (trigger.player.storage.drlt_zhenggu_mark.length == 0) - trigger.player.unmarkSkill("drlt_zhenggu_mark"); - lib.skill.drlt_zhenggu.sync(player, trigger.player); - }, - }, - drlt_zhenggu_mark: { - init(player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - marktext: "镇", - intro: { - name: "镇骨", - content: "已成为$〖镇骨〗的目标", - }, - }, - xinfu_zuilun: { - audio: 2, - trigger: { - player: "phaseJieshuBegin", - }, - check(event, player) { - var num = 0; - if ( - player.hasHistory("lose", function (evt) { - return evt.type == "discard"; - }) - ) - num++; - if (!player.isMinHandcard()) num++; - if (!player.getStat("damage")) num++; - if (num == 3) return player.hp >= 2; - return true; - }, - prompt(event, player) { - var num = 3; - if ( - player.hasHistory("lose", function (evt) { - return evt.type == "discard"; - }) - ) - num--; - if (!player.isMinHandcard()) num--; - if (!player.getStat("damage")) num--; - return get.prompt("xinfu_zuilun") + "(可获得" + get.cnNumber(num) + "张牌)"; - }, - content() { - "step 0"; - event.num = 0; - event.cards = get.cards(3); - game.cardsGotoOrdering(cards); - if ( - player.hasHistory("lose", function (evt) { - return evt.type == "discard"; - }) - ) - event.num++; - if (!player.isMinHandcard()) event.num++; - if (!player.getStat("damage")) event.num++; - "step 1"; - if (event.num == 0) { - player.gain(event.cards, "draw"); - event.finish(); - } else { - var prompt = "罪论:将" + get.cnNumber(num) + "张牌置于牌堆顶"; - if (num < 3) prompt += "并获得其余的牌"; - var next = player.chooseToMove(prompt, true); - if (num < 3) { - next.set("list", [["牌堆顶", cards], ["获得"]]); - next.set("filterMove", function (from, to, moved) { - if (to == 1 && moved[0].length <= _status.event.num) return false; - return true; - }); - next.set("filterOk", function (moved) { - return moved[0].length == _status.event.num; - }); - } else { - next.set("list", [["牌堆顶", cards]]); - } - next.set("num", num); - next.set("processAI", function (list) { - var check = function (card) { - var player = _status.event.player; - var next = player.next; - var att = get.attitude(player, next); - var judge = next.getCards("j")[tops.length]; - if (judge) { - return get.judge(judge)(card) * att; - } - return next.getUseValue(card) * att; - }; - var cards = list[0][1].slice(0), - tops = []; - while (tops.length < _status.event.num) { - list.sort(function (a, b) { - return check(b) - check(a); - }); - tops.push(cards.shift()); - } - return [tops, cards]; - }); - } - "step 2"; - if (result.bool) { - var list = result.moved[0]; - var num = list.length - 1; - for (var i = 0; i < list.length; i++) { - event.cards.remove(list[num - i]); - ui.cardPile.insertBefore(list[num - i], ui.cardPile.firstChild); - } - } - "step 3"; - game.updateRoundNumber(); - if (event.cards.length) { - player.gain(event.cards, "draw"); - event.finish(); - } else { - player.chooseTarget( - "请选择一名角色,与其一同失去1点体力", - true, - function (card, player, target) { - return target != player; - } - ).ai = function (target) { - return -get.attitude(_status.event.player, target); - }; - } - "step 4"; - player.line(result.targets[0], "fire"); - player.loseHp(); - result.targets[0].loseHp(); - }, - }, - xinfu_fuyin: { - trigger: { - target: "useCardToTargeted", - }, - forced: true, - audio: 2, - filter(event, player) { - if (event.player.countCards("h") < player.countCards("h")) return false; - if (event.card.name != "sha" && event.card.name != "juedou") return false; - return !game.hasPlayer2(function (current) { - return ( - current.getHistory("useCard", function (evt) { - return ( - evt != event.getParent() && - evt.card && - ["sha", "juedou"].includes(evt.card.name) && - evt.targets.includes(player) - ); - }).length > 0 - ); - }); - }, - content() { - trigger.getParent().excluded.add(player); - }, - ai: { - effect: { - target(card, player, target) { - let hs = player.getCards( - "h", - (i) => i !== card && (!card.cards || !card.cards.includes(i)) - ), - num = player.getCardUsable("sha"); - if ( - (card.name !== "sha" && card.name !== "juedou") || - hs.length < target.countCards("h") - ) - return 1; - if ( - game.hasPlayer2(function (current) { - return ( - current.getHistory("useCard", function (evt) { - return ( - evt.card && - ["sha", "juedou"].includes(evt.card.name) && - evt.targets.includes(player) - ); - }).length > 0 - ); - }) - ) - return 1; - if (card.name === "sha") num--; - hs = hs.filter((i) => { - if (!player.canUse(i, target)) return false; - if (i.name === "juedou") return true; - if (num && i.name === "sha") { - num--; - return true; - } - return false; - }); - if (!hs.length) return "zeroplayertarget"; - num = 1 - 2 / 3 / hs.length; - return [num, 0, num, 0]; - }, - }, - }, - }, - drlt_qianjie: { - group: ["drlt_qianjie_1", "drlt_qianjie_2", "drlt_qianjie_3"], - locked: true, - ai: { - effect: { - target(card) { - if (card.name == "tiesuo") return "zeroplayertarget"; - }, - }, - }, - subSkill: { - 1: { - audio: "drlt_qianjie", - trigger: { - player: "linkBegin", - }, - forced: true, - filter(event, player) { - return !player.isLinked(); - }, - content() { - trigger.cancel(); - }, - }, - 2: { - mod: { - targetEnabled(card, player, target) { - if (get.type(card) == "delay") return false; - }, - }, - }, - 3: { - ai: { noCompareTarget: true }, - }, - }, - }, - drlt_jueyan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter(event, player) { - return ( - player.hasEnabledSlot(1) || - player.hasEnabledSlot(2) || - player.hasEnabledSlot(5) || - player.hasEnabledSlot("horse") - ); - }, - content() { - "step 0"; - player.chooseToDisable(true).set("ai", function (event, player, list) { - if (list.includes("equip2")) return "equip2"; - if ( - list.includes("equip1") && - player.countCards("h", function (card) { - return get.name(card, player) == "sha" && player.hasUseTarget(card); - }) - - player.getCardUsable("sha") > - 1 - ) - return "equip1"; - if ( - list.includes("equip5") && - player.countCards("h", function (card) { - return get.type2(card, player) == "trick" && player.hasUseTarget(card); - }) > 1 - ) - return "equip5"; - }); - "step 1"; - switch (result.control) { - case "equip1": - player.addTempSkill("drlt_jueyan1"); - break; - case "equip2": - player.draw(3); - player.addTempSkill("drlt_jueyan3"); - break; - case "equip3_4": - player.addTempSkill("drlt_jueyan2"); - break; - case "equip5": - player.addTempSkills("rejizhi"); - break; - } - }, - ai: { - order: 13, - result: { - player(player) { - if (player.hasEnabledSlot("equip2")) return 1; - if ( - player.hasEnabledSlot("equip1") && - player.countCards("h", function (card) { - return get.name(card, player) == "sha" && player.hasValueTarget(card); - }) - - player.getCardUsable("sha") > - 1 - ) - return 1; - if ( - player.hasEnabledSlot("equip5") && - player.countCards("h", function (card) { - return get.type2(card, player) == "trick" && player.hasUseTarget(card); - }) > 1 - ) - return 1; - return -1; - }, - }, - }, - derivation: "rejizhi", - }, - drlt_jueyan1: { - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") return num + 3; - }, - }, - mark: true, - marktext: "决", - intro: { name: "决堰 - 武器", content: "本回合内可以多使用三张【杀】" }, - }, - drlt_jueyan2: { - mod: { - targetInRange(card, player, target, now) { - return true; - }, - }, - mark: true, - marktext: "决", - intro: { name: "决堰 - 坐骑", content: "本回合内使用牌没有距离限制" }, - }, - drlt_jueyan3: { - mod: { - maxHandcard(player, num) { - return num + 3; - }, - }, - mark: true, - marktext: "决", - intro: { name: "决堰 - 防具", content: "本回合内手牌上限+3" }, - }, - drlt_poshi: { - audio: 2, - skillAnimation: true, - animationColor: "wood", - trigger: { - player: "phaseZhunbeiBegin", - }, - forced: true, - unique: true, - juexingji: true, - derivation: ["drlt_huairou"], - filter(event, player) { - return !player.hasEnabledSlot() || player.hp == 1; - }, - content() { - "step 0"; - player.awakenSkill("drlt_poshi"); - player.loseMaxHp(); - "step 1"; - var num = player.maxHp - player.countCards("h"); - if (num > 0) player.draw(num); - player.changeSkills(["drlt_huairou"], ["drlt_jueyan"]); - }, - }, - drlt_huairou: { - audio: 2, - enable: "phaseUse", - position: "he", - filter: (event, player) => - player.hasCard( - (card) => lib.skill.drlt_huairou.filterCard(card, player), - lib.skill.drlt_huairou.position - ), - filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), - check(card) { - if (!_status.event.player.canEquip(card)) return 5; - return 3 - get.value(card); - }, - content() { - player.recast(cards); - }, - discard: false, - lose: false, - delay: false, - prompt: "将一张装备牌置入弃牌堆并摸一张牌", - ai: { - order: 10, - result: { - player: 1, - }, - }, - }, - drlt_yongsi: { - audio: 2, - group: ["drlt_yongsi_1", "drlt_yongsi_2"], - locked: true, - subSkill: { - 1: { - audio: "drlt_yongsi", - trigger: { - player: "phaseDrawBegin2", - }, - forced: true, - filter(event, player) { - return !event.numFixed; - }, - content() { - trigger.num = game.countGroup(); - }, - }, - 2: { - audio: "drlt_yongsi", - trigger: { - player: "phaseUseEnd", - }, - forced: true, - filter(event, player) { - var num = 0; - player.getHistory("sourceDamage", function (evt) { - if (evt.getParent("phaseUse") == event) num += evt.num; - }); - return !num || num > 1; - }, - content() { - var numx = 0; - player.getHistory("sourceDamage", function (evt) { - if (evt.getParent("phaseUse") == trigger) numx += evt.num; - }); - if (!numx) { - var num = player.hp - player.countCards("h"); - if (num > 0) player.draw(num); - } else { - player.addTempSkill("drlt_yongsi1", { player: "phaseDiscardAfter" }); - } - }, - }, - }, - }, - drlt_yongsi1: { - mod: { - maxHandcard(player, num) { - return num + player.maxHp - 2 * Math.max(0, player.hp); - }, - }, - }, - drlt_weidi: { - audio: 2, - forceaudio: true, - unique: true, - zhuSkill: true, - trigger: { - player: "phaseDiscardBegin", - }, - direct: true, - filter(event, player) { - if (!player.hasZhuSkill("drlt_weidi")) return false; - return ( - player.needsToDiscard() > 0 && - game.countPlayer(function (current) { - return current != player && current.group == "qun"; - }) > 0 - ); - }, - content() { - "step 0"; - var num = Math.min( - player.needsToDiscard(), - game.countPlayer(function (target) { - return target != player && target.group == "qun"; - }) - ); - if (num) { - player.chooseCardTarget({ - prompt: get.prompt("drlt_weidi"), - prompt2: - "你可以将" + - (num > 1 ? "至多" : "") + - get.cnNumber(num) + - "张手牌交给等量的其他群势力角色。先按顺序选中所有要给出的手牌,然后再按顺序选择等量的目标角色", - selectCard: [1, num], - selectTarget() { - return ui.selected.cards.length; - }, - filterTarget(card, player, target) { - return target != player && target.group == "qun"; - }, - complexSelect: true, - filterOk() { - return ui.selected.cards.length == ui.selected.targets.length; - }, - ai1(card) { - var player = _status.event.player; - var value = get.value(card, player, "raw"); - if ( - game.hasPlayer(function (target) { - return ( - target != player && - target.group == "qun" && - !ui.selected.targets.includes(target) && - get.sgn(value) == get.sgn(get.attitude(player, target)) - ); - }) - ) - return 1 / Math.max(1, get.useful(card)); - return -1; - }, - ai2(target) { - var player = _status.event.player; - var card = ui.selected.cards[ui.selected.targets.length]; - if (card && get.value(card, player, "raw") < 0) - return -get.attitude(player, target); - return get.attitude(player, target); - }, - }); - } else event.finish(); - "step 1"; - if (result.bool && result.cards.length > 0) { - var list = []; - for (var i = 0; i < result.targets.length; i++) { - var target = result.targets[i]; - var card = result.cards[i]; - list.push([target, card]); - } - player.logSkill("drlt_weidi", result.targets); - game.loseAsync({ - gain_list: list, - player: player, - cards: result.cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - } else event.finish(); - }, - }, - drlt_xiongluan: { - audio: 2, - unique: true, - enable: "phaseUse", - mark: true, - skillAnimation: true, - animationColor: "gray", - limited: true, - filter(event, player) { - return !player.isDisabledJudge() || player.hasEnabledSlot(); - }, - filterTarget(card, player, target) { - return target != player; - }, - content() { - player.awakenSkill("drlt_xiongluan"); - var disables = []; - for (var i = 1; i <= 5; i++) { - for (var j = 0; j < player.countEnabledSlot(i); j++) { - disables.push(i); - } - } - if (disables.length > 0) player.disableEquip(disables); - player.disableJudge(); - player.addTempSkill("drlt_xiongluan1"); - player.storage.drlt_xiongluan1 = target; - target.addSkill("drlt_xiongluan2"); - target.markSkillCharacter("drlt_xiongluan1", player, "雄乱", "无法使用或打出任何手牌"); - }, - ai: { - order: 13, - result: { - target: (player, target) => { - let hs = player.countCards("h", (card) => { - if ( - !get.tag(card, "damage") || - get.effect(target, card, player, player) <= 0 - ) - return 0; - if (get.name(card, player) === "sha") { - if (target.getEquip("bagua")) return 0.5; - if (target.getEquip("rewrite_bagua")) return 0.25; - } - return 1; - }), - ts = - target.hp + - target.hujia + - game.countPlayer((current) => { - if (get.attitude(current, target) > 0) - return current.countCards("hs") / 8; - return 0; - }); - if (hs >= ts) return -hs; - return 0; - }, - }, - }, - intro: { - content: "limited", - }, - }, - drlt_xiongluan1: { - onremove(player) { - player.storage.drlt_xiongluan1.removeSkill("drlt_xiongluan2"); - player.storage.drlt_xiongluan1.unmarkSkill("drlt_xiongluan1"); - delete player.storage.drlt_xiongluan1; - }, - mod: { - targetInRange(card, player, target) { - if (target.hasSkill("drlt_xiongluan2")) { - return true; - } - }, - cardUsableTarget(card, player, target) { - if (target.hasSkill("drlt_xiongluan2")) return true; - }, - }, - charlotte: true, - }, - drlt_xiongluan2: { - mod: { - cardEnabled2(card, player) { - if (get.position(card) == "h") return false; - }, - }, - ai: { - effect: { - target(card, player, target) { - if (get.tag(card, "damage")) return [0, -999999]; - }, - }, - }, - charlotte: true, - }, - drlt_congjian: { - audio: 2, - audioname2: { tongyuan: "ocongjian_tongyuan" }, - trigger: { - target: "useCardToTargeted", - }, - direct: true, - filter(event, player) { - return ( - get.type(event.card) == "trick" && - event.targets.length > 1 && - player.countCards("he") > 0 - ); - }, - content() { - "step 0"; - player.chooseCardTarget({ - filterCard: true, - selectCard: 1, - position: "he", - filterTarget(card, player, target) { - return player != target && _status.event.targets.includes(target); - }, - ai1(card) { - if (card.name == "du") return 20; - if (_status.event.player.storage.drlt_xiongluan && get.type(card) == "equip") - return 15; - return 6 - get.value(card); - }, - ai2(target) { - var att = get.attitude(_status.event.player, target); - if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { - if (target.hasSkillTag("nodu")) return 0.1; - return 1 - att; - } - return att - 3; - }, - prompt: get.prompt2("drlt_congjian"), - targets: trigger.targets, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("drlt_congjian", target); - player.give(result.cards, target, "give"); - var num = 1; - if (get.type(result.cards[0]) == "equip") num = 2; - player.draw(num); - } - }, - }, - drlt_wanglie: { - locked: false, - mod: { - targetInRange(card, player, target, now) { - if (game.online) { - if (!player.countUsed()) return true; - } else { - var evt = _status.event.getParent("phaseUse"); - if ( - evt && - evt.name == "phaseUse" && - player.getHistory("useCard", function (evt2) { - return evt2.getParent("phaseUse") == evt; - }).length == 0 - ) - return true; - } - }, - }, - audio: 2, - trigger: { - player: "useCard", - }, - filter(event, player) { - return ( - player.isPhaseUsing() && (event.card.name == "sha" || get.type(event.card) == "trick") - ); - }, - preHidden: true, - check(event, player) { - if (["wuzhong", "kaihua", "dongzhuxianji"].includes(event.card.name)) return false; - player._wanglie_temp = true; - var eff = 0; - for (var i of event.targets) { - eff += get.effect(i, event.card, player, player); - } - delete player._wanglie_temp; - if (eff < 0) return true; - if ( - !player.countCards("h", function (card) { - return player.hasValueTarget(card, null, true); - }) - ) - return true; - if ( - get.tag(event.card, "damage") && - !player.needsToDiscard() && - !player.countCards("h", function (card) { - return get.tag(card, "damage") && player.hasValueTarget(card, null, true); - }) - ) - return true; - return false; - }, - prompt2(event) { - return "令" + get.translation(event.card) + "不能被响应,然后本阶段不能再使用牌"; - }, - content() { - trigger.nowuxie = true; - trigger.directHit.addArray(game.players); - player.addTempSkill("drlt_wanglie2", "phaseUseAfter"); - }, - ai: { - pretao: true, - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if (tag == "pretao") return true; - if (player._wanglie_temp) return false; - player._wanglie_temp = true; - var bool = (function () { - if (["wuzhong", "kaihua", "dongzhuxianji"].includes(arg.card.name)) return false; - if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false; - var cards = player.getCards("h", function (card) { - return ( - card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) - ); - }); - var sha = player.getCardUsable("sha"); - if (arg.card.name == "sha") sha--; - cards = cards.filter(function (card) { - if (card.name == "sha" && sha <= 0) return false; - return player.hasValueTarget(card, null, true); - }); - if (!cards.length) return true; - if (!get.tag(arg.card, "damage")) return false; - if ( - !player.needsToDiscard() && - !cards.filter(function (card) { - return get.tag(card, "damage"); - }).length - ) - return true; - return false; - })(); - delete player._wanglie_temp; - return bool; - }, - }, - }, - drlt_wanglie2: { - mod: { - cardEnabled(card, player) { - return false; - }, - }, - }, - liangyin: { - audio: 2, - group: ["liangyin_1", "liangyin_2"], - subSkill: { - 1: { - trigger: { - global: [ - "loseAfter", - "addToExpansionAfter", - "cardsGotoSpecialAfter", - "loseAsyncAfter", - ], - }, - filter(event, player, name) { - if (event.name == "lose" || event.name == "loseAsync") - return event.getlx !== false && event.toStorage == true; - if (event.name == "cardsGotoSpecial") return !event.notrigger; - return true; - }, - direct: true, - content() { - "step 0"; - player.chooseTarget( - "是否发动【良姻】令手牌数大于你的一名角色摸一张牌?", - function (card, player, target) { - return ( - target != player && target.countCards("h") > player.countCards("h") - ); - } - ).ai = function (target) { - return get.attitude(player, target); - }; - "step 1"; - if (result.bool) { - player.logSkill("liangyin", result.targets); - result.targets[0].draw(); - } - }, - sub: true, - }, - 2: { - trigger: { - global: "gainAfter", - }, - filter(event, player) { - return ( - event.fromStorage == true || - game.hasPlayer2(function (current) { - var evt = event.getl(current); - return evt && evt.xs && evt.xs.length > 0; - }) - ); - }, - direct: true, - content() { - "step 0"; - player.chooseTarget( - "是否发动【良姻】令手牌数小于你的一名角色弃置一张牌?", - function (card, player, target) { - return ( - target != player && - target.countCards("h") < player.countCards("h") && - target.countCards("he") > 0 - ); - } - ).ai = function (target) { - return -get.attitude(player, target); - }; - "step 1"; - if (result.bool) { - player.logSkill("liangyin", result.targets); - result.targets[0].chooseToDiscard("he", 1, true); - } - }, - sub: true, - }, - }, - }, - kongsheng: { - audio: 2, - trigger: { - player: "phaseZhunbeiBegin", - }, - direct: true, - filter(event, player) { - return player.countCards("he") > 0; - }, - content() { - "step 0"; - player - .chooseCard(get.prompt("kongsheng"), "将任意张牌置于武将牌上", "he", [ - 1, - player.countCards("he"), - ]) - .set("ai", function (card) { - if (get.position(card) == "e") return 1 - get.value(card); - if (card.name == "shan" || card.name == "du" || !player.hasValueTarget(card)) - return 1; - return 4 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("kongsheng"); - player.addSkill("kongsheng2"); - player.addToExpansion(result.cards, "log", "give", player).gaintag.add("kongsheng2"); - } - }, - }, - kongsheng_ai: { ai: { reverseOrder: true } }, - kongsheng2: { - audio: "kongsheng", - marktext: "箜", - intro: { - content: "expansion", - markcount: "expansion", - }, - trigger: { - player: "phaseJieshuBegin", - }, - filter(event, player) { - return player.getExpansions("kongsheng2").length > 0; - }, - forced: true, - charlotte: true, - content() { - "step 0"; - player.addTempSkill("kongsheng_ai", "kongsheng2After"); - "step 1"; - var cards = player.getExpansions("kongsheng2").filter(function (i) { - return get.type(i, false) == "equip" && player.hasUseTarget(i); - }); - if (cards.length == 1) { - event._result = { bool: true, links: cards }; - } else if (cards.length) - player.chooseButton(true, ["选择要使用的装备牌", cards]).set("ai", function (button) { - return get.order(button.link); - }); - else event.goto(3); - "step 2"; - if (result.bool) { - player.chooseUseTarget(result.links[0], true); - event.goto(1); - } - "step 3"; - var cards = player.getExpansions("kongsheng2"); - if (cards.length) player.gain(cards, "gain2"); - }, - }, - nzry_juzhan: { - audio: "nzry_juzhan_1", - mark: true, - locked: false, - zhuanhuanji: true, - marktext: "☯", - intro: { - content(storage, player, skill) { - if (player.storage.nzry_juzhan == true) - return "当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌"; - return "当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌"; - }, - }, - group: ["nzry_juzhan_1", "nzry_juzhan_2"], - subSkill: { - 1: { - audio: 2, - trigger: { - target: "useCardToTargeted", - }, - prompt2: - "当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。", - filter(event, player) { - return event.card.name == "sha" && !player.storage.nzry_juzhan; - }, - logTarget: "player", - content() { - "step 0"; - game.asyncDraw([player, trigger.player]); - trigger.player.addTempSkill("nzry_juzhany"); - player.changeZhuanhuanji("nzry_juzhan"); - player.addTempSkill("nzry_juzhanx"); - "step 1"; - game.delayx(); - }, - }, - 2: { - audio: "nzry_juzhan_1", - trigger: { - player: "useCardToPlayered", - }, - prompt2: - "当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌", - filter(event, player) { - return ( - event.card.name == "sha" && - player.storage.nzry_juzhan == true && - event.target.countGainableCards(player, "he") > 0 - ); - }, - check(event, player) { - return ( - event.player.countCards("he") > 0 && - event.targets && - event.targets.length == 1 - ); - }, - logTarget: "target", - content() { - player.gainPlayerCard(trigger.targets[0], "he", true); - player.changeZhuanhuanji("nzry_juzhan"); - trigger.target.addTempSkill("nzry_juzhanx"); - player.addTempSkill("nzry_juzhany"); - }, - }, - }, - }, - nzry_juzhanx: { - mod: { - targetEnabled(card, player, target) { - if (player.hasSkill("nzry_juzhany")) return false; - }, - }, - }, - nzry_juzhany: {}, - nzry_feijun: { - init: (player) => { - if (!Array.isArray(player.storage.nzry_feijun)) player.storage.nzry_feijun = []; - }, - intro: { - content(storage) { - if (!storage || !storage.length) return "尚未发动"; - var str = get.translation(storage); - return "已对" + str + "发动过〖飞军〗"; - }, - }, - mark: true, - enable: "phaseUse", - usable: 1, - position: "he", - audio: 2, - filter(event, player) { - return ( - game.hasPlayer(function (current) { - return current.countCards("h") >= player.countCards("h"); - }) || - game.hasPlayer(function (current) { - return current.countCards("e") >= player.countCards("e"); - }) > 0 - ); - }, - filterCard: true, - check(card) { - return 5 - get.value(card); - }, - content() { - "step 0"; - var list = []; - if ( - game.hasPlayer(function (current) { - return current.countCards("h") > player.countCards("h"); - }) - ) - list.push("令一名手牌数大于你的角色交给你一张牌"); - if ( - game.hasPlayer(function (current) { - return current.countCards("e") > player.countCards("e"); - }) > 0 - ) - list.push("令一名装备区内牌数大于你的角色弃置一张装备牌"); - if (list.length == 0) event.finish(); - else if (list.length < 2) { - if ( - game.hasPlayer(function (current) { - return current.countCards("h") > player.countCards("h"); - }) - ) - event._result = { index: 0 }; - else event._result = { index: 1 }; - } else { - player - .chooseControl() - .set("ai", function () { - if ( - game.hasPlayer(function (current) { - return ( - current.countCards("h") > player.countCards("h") && - get.attitude(player, current) < 0 - ); - }) - ) - return 0; - return 1; - }) - .set("choiceList", list); - } - "step 1"; - event.index = result.index; - if (result.index == 0) { - player - .chooseTarget(function (card, player, target) { - return target != player && target.countCards("h") > player.countCards("h"); - }, "选择一名手牌数大于你的角色") - .set("ai", function (target) { - return -get.attitude(player, target); - }); - } else { - player.chooseTarget(function (card, player, target) { - return target.countCards("e") > player.countCards("e") && target != player; - }, "选择一名装备区里牌数大于你的角色").ai = function (target) { - return -get.attitude(player, target); - }; - } - "step 2"; - if (result.bool) { - event.target = result.targets[0]; - var list = player.getStorage("nzry_feijun"); - if (!list.includes(event.target)) { - event._nzry_binglve = true; - player.markAuto("nzry_feijun", [event.target]); - } - player.line(event.target, "green"); - if (event.index == 0) { - event.target - .chooseCard("he", true, "选择一张牌交给" + get.translation(player)) - .set("ai", function (card) { - return 6 - get.value(card); - }); - } else { - event.target.chooseToDiscard("he", true, { type: "equip" }, "请弃置一张装备牌"); - event.finish(); - } - } else { - event.finish(); - } - "step 3"; - if (result.bool) { - target.give(result.cards, player); - } - }, - ai: { - order: 11, - result: { - player(player) { - if ( - game.hasPlayer(function (current) { - return ( - (current.countCards("h") > player.countCards("h") || - current.countCards("e") > player.countCards("e")) && - get.attitude(player, current) < 0 && - player.getStorage("nzry_feijun").includes(current) - ); - }) || - game.hasPlayer(function (current) { - return ( - current.countCards("h") > player.countCards("h") && - get.attitude(player, current) < 0 - ); - }) || - (player.countCards("h") >= 2 && - game.hasPlayer(function (current) { - return ( - current.countCards("e") > player.countCards("e") && - get.attitude(player, current) < 0 - ); - })) - ) - return 1; - }, - }, - }, - }, - nzry_binglve: { - audio: 2, - trigger: { player: "nzry_feijunAfter" }, - forced: true, - filter(event, player) { - return event._nzry_binglve == true; - }, - content() { - player.draw(2); - }, - ai: { combo: "nzry_feijun" }, - }, - nzry_huaiju_ai: { - charlotte: true, - ai: { - filterDamage: true, - skillTagFilter(player, tag, arg) { - if (!player.hasMark("nzry_huaiju")) return false; - if ( - !game.hasPlayer(function (current) { - return current.hasSkill("tachibana_effect"); - }) - ) - return false; - if (arg && arg.player) { - if (arg.player.hasSkillTag("jueqing", false, player)) return false; - } - }, - }, - }, - nzry_huaiju: { - marktext: "橘", - intro: { - name: "怀橘", - name2: "橘", - content: "当前有#个“橘”", - }, - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content() { - player.addMark("nzry_huaiju", 3); - player.addSkill("nzry_huaiju_ai"); - }, - group: ["tachibana_effect"], - }, - //没错 这是个橘 - tachibana_effect: { - audio: "nzry_huaiju", - trigger: { - global: ["damageBegin4", "phaseDrawBegin2"], - }, - forced: true, - filter(event, player) { - return event.player.hasMark("nzry_huaiju") && (event.name == "damage" || !event.numFixed); - }, - content() { - player.line(trigger.player, "green"); - if (trigger.name == "damage") { - trigger.cancel(); - trigger.player.removeMark("nzry_huaiju", 1); - } else trigger.num++; - }, - }, - nzry_yili: { - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - direct: true, - content() { - "step 0"; - player.chooseTarget( - get.prompt("nzry_yili"), - "移去一个【橘】或失去1点体力,然后令一名其他角色获得一个【橘】", - function (card, player, target) { - return target != player; - } - ).ai = function (target) { - var player = _status.event.player; - if (player.storage.nzry_huaiju > 2 || player.hp > 2) - return get.attitude(player, target); - return -1; - }; - "step 1"; - if (result.bool) { - event.target = result.targets[0]; - if (player.hasMark("nzry_huaiju")) { - player - .chooseControl() - .set("choiceList", ["失去1点体力", "移去一个“橘”"]) - .set("ai", function () { - if (player.hp > 2) return 0; - return 1; - }); - } else event._result = { index: 0 }; - } else { - event.finish(); - } - "step 2"; - player.logSkill("nzry_yili", target); - if (result.index == 1) { - player.removeMark("nzry_huaiju", 1); - } else { - player.loseHp(); - } - target.addMark("nzry_huaiju", 1); - target.addSkill("nzry_huaiju_ai"); - }, - ai: { - combo: "nzry_huaiju", - }, - }, - nzry_zhenglun: { - audio: 2, - trigger: { - player: "phaseDrawBefore", - }, - filter(event, player) { - return !player.hasMark("nzry_huaiju"); - }, - check(event, player) { - return player.countCards("h") >= 2 || player.skipList.includes("phaseUse"); - }, - content() { - trigger.cancel(); - player.addMark("nzry_huaiju", 1); - }, - ai: { - combo: "nzry_huaiju", - }, - }, - nzry_kuizhu: { - audio: 2, - trigger: { - player: "phaseDiscardAfter", - }, - direct: true, - filter(event, player) { - var cards = []; - player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) - cards.addArray(evt.cards2); - }); - return cards.length > 0; - }, - content() { - "step 0"; - var cards = []; - player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) - cards.addArray(evt.cards2); - }); - event.num = cards.length; - event.str1 = "令至多" + event.num + "名角色摸一张牌"; - event.str2 = "对任意名体力值之和为" + event.num + "的角色造成1点伤害"; - player - .chooseControl("cancel2") - .set("ai", function () { - if ( - game.countPlayer(function (current) { - return get.attitude(player, current) < 0 && current.hp == event.num; - }) > 0 && - event.num <= 3 - ) - return 1; - return 0; - }) - .set("choiceList", [event.str1, event.str2]) - .set("prompt", "是否发动【溃诛】?"); - "step 1"; - if (result.control == "cancel2") event.finish(); - event.control = [event.str1, event.str2][result.index]; - "step 2"; - var str = "请选择〖溃诛〗的目标"; - if (event.bool == false) str = "
    所选目标体力之和不足" + event.num + ",请重选"; - if (event.control == event.str2) { - player - .chooseTarget(str, function (card, player, target) { - var targets = ui.selected.targets; - var num = 0; - for (var i = 0; i < targets.length; i++) { - num += targets[i].hp; - } - return num + target.hp <= _status.event.num; - }) - .set("ai", function (target) { - if (ui.selected.targets[0] != undefined) return -1; - return get.attitude(player, target) < 0; - }) - .set("promptbar", "none") - .set("num", event.num) - .set("selectTarget", function () { - var targets = ui.selected.targets; - var num = 0; - for (var i = 0; i < targets.length; i++) { - num += targets[i].hp; - } - if (num == _status.event.num) return ui.selected.targets.length; - return ui.selected.targets.length + 1; - }); - } else { - player.chooseTarget("请选择〖溃诛〗的目标", [1, event.num]).ai = function (target) { - return get.attitude(player, target); - }; - } - "step 3"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - if (event.control == event.str1) { - //player.line(targets); - player.logSkill("nzry_kuizhu", targets); - game.asyncDraw(targets); - } else { - var num = 0; - for (var i = 0; i < targets.length; i++) { - num += targets[i].hp; - } - if (num < event.num) { - event.bool = false; - event.goto(2); - } else { - //player.line(targets); - player.logSkill("nzry_kuizhu", targets); - for (var i = 0; i < targets.length; i++) { - targets[i].damage(); - } - //if(targets.length>=2) player.loseHp(); - } - } - } - }, - }, - rechezheng: { - audio: "nzry_zhizheng", - trigger: { source: "damageBegin2" }, - filter(event, player) { - return player.isPhaseUsing() && !player.inRangeOf(event.player); - }, - forced: true, - logTarget: "player", - content() { - trigger.cancel(); - }, - ai: { - effect: { - player(card, player, target) { - if (get.tag(card, "damage") && !player.inRangeOf(target)) return "zerotarget"; - }, - }, - }, - }, - nzry_zhizheng: { - audio: 2, - //mod:{ - // playerEnabled:function(card,player,target){ - // var info=get.info(card); - // if(target!=player&&(!info||!info.singleCard||!ui.selected.targets.length)&&player.isPhaseUsing()&&!target.inRange(player)) return false; - // }, - //}, - trigger: { - player: "phaseUseEnd", - }, - forced: true, - filter(event, player) { - return ( - player.getHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == event; - }).length < - game.countPlayer(function (current) { - return current != player && !current.inRange(player); - }) && - game.hasPlayer(function (target) { - return ( - target != player && - !target.inRange(player) && - target.countDiscardableCards(player, "he") - ); - }) - ); - }, - content() { - "step 0"; - player.chooseTarget( - "请选择〖掣政〗的目标", - "弃置一名攻击范围内不包含你的角色的一张牌", - true, - function (card, player, target) { - return ( - target != player && - !target.inRange(player) && - target.countDiscardableCards(player, "he") - ); - } - ).ai = function (target) { - return -get.attitude(player, target); - }; - "step 1"; - if (result.bool) { - player.line(result.targets); - player.discardPlayerCard(result.targets[0], "he", 1, true); - } - }, - group: "rechezheng", - }, - nzry_lijun: { - unique: true, - global: "nzry_lijun1", - audio: "nzry_lijun1", - zhuSkill: true, - }, - nzry_lijun2: { - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") return num + player.countMark("nzry_lijun2"); - }, - }, - onremove: true, - }, - nzry_lijun1: { - audio: 2, - //forceaudio:true, - trigger: { - player: "useCardAfter", - }, - filter(event, player) { - if (event.card.name != "sha" || player.group != "wu") return false; - if (player.hasSkill("nzry_lijun2")) return false; - if (!player.isPhaseUsing()) return false; - if ( - !game.hasPlayer(function (target) { - return player != target && target.hasZhuSkill("nzry_lijun", player); - }) - ) - return false; - for (var i = 0; i < event.cards.length; i++) { - if (get.position(event.cards[i], true) == "o") { - return true; - } - } - return false; - }, - direct: true, - content() { - "step 0"; - var list = game.filterPlayer(function (target) { - return player != target && target.hasZhuSkill("nzry_lijun", player); - }); - player.chooseTarget( - get.prompt("nzry_lijun"), - "将" + - get.translation(trigger.cards) + - "交给" + - get.translation(list) + - (list.length > 1 ? "中的一人" : ""), - function (card, player, target) { - return player != target && target.hasZhuSkill("nzry_lijun", player); - } - ).ai = function (target) { - return get.attitude(_status.event.player, target); - }; - "step 1"; - if (!result.bool) event.finish(); - else { - player.addTempSkill("nzry_lijun2", "phaseUseEnd"); - var zhu = result.targets[0]; - player.line(zhu, "green"); - zhu.logSkill("nzry_lijun"); - var list = []; - for (var i = 0; i < trigger.cards.length; i++) { - if (get.position(trigger.cards[i], true) == "o") { - list.push(trigger.cards[i]); - } - } - zhu.gain(list, "gain2").giver = player; - zhu.chooseBool() - .set("ai", function () { - if (get.attitude(zhu, player) > 0) return true; - return false; - }) - .set("prompt", "是否令" + get.translation(player) + "摸一张牌?"); - } - "step 2"; - if (result.bool) { - player.draw(); - player.addMark("nzry_lijun2", 1, false); - } - }, - }, - nzry_chenglve: { - mark: true, - locked: false, - zhuanhuanji: true, - marktext: "☯", - intro: { - content(storage, player, skill) { - var str = player.storage.nzry_chenglve - ? "出牌阶段限一次,你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制" - : "出牌阶段限一次,你可以摸一张牌,然后弃置两张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制"; - if (player.storage.nzry_chenglve1) { - str += "
  • 当前花色:"; - str += get.translation(player.storage.nzry_chenglve1); - } - return str; - }, - }, - enable: "phaseUse", - usable: 1, - audio: 2, - content() { - "step 0"; - if (player.storage.nzry_chenglve == true) { - player.draw(2); - player.chooseToDiscard("h", true); - } else { - player.draw(); - player.chooseToDiscard("h", 2, true); - } - player.changeZhuanhuanji("nzry_chenglve"); - "step 1"; - if (result.bool) { - player.storage.nzry_chenglve1 = []; - for (var i = 0; i < result.cards.length; i++) { - player.storage.nzry_chenglve1.add(get.suit(result.cards[i], player)); - } - player.markSkill("nzry_chenglve"); - player.addTempSkill("nzry_chenglve1"); - } - }, - ai: { - order: 2.7, - result: { - player(player) { - if (!player.storage.nzry_chenglve && player.countCards("h") < 3) return 0; - return 1; - }, - }, - }, - }, - nzry_chenglve1: { - mod: { - cardUsable(card, player) { - const suit = get.suit(card); - if (suit == "unsure" || player.getStorage("nzry_chenglve1").includes(suit)) - return Infinity; - }, - targetInRange(card, player) { - const suit = get.suit(card); - if (suit == "unsure" || player.getStorage("nzry_chenglve1").includes(suit)) - return true; - }, - }, - onremove: true, - }, - nzry_shicai: { - audio: "nzry_shicai_2", - trigger: { player: ["useCardAfter", "useCardToTargeted"] }, - prompt2(event, player) { - const cards = event.cards.filterInD("oe"); - return ( - "你可以将" + - get.translation(cards) + - (cards.length > 1 ? "以任意顺序" : "") + - "置于牌堆顶,然后摸一张牌" - ); - }, - filter(event, player) { - if (!event.cards.someInD()) return false; - let evt = event, - type = get.type2(evt.card, false); - if (event.name == "useCardToTargeted") { - if (type != "equip" || player != event.target) return false; - evt = evt.getParent(); - } else { - if (type == "equip") return false; - } - return !player.hasHistory( - "useCard", - (evtx) => { - return evtx != evt && get.type2(evtx.card, false) == type; - }, - evt - ); - }, - check(event, player) { - if (get.type(event.card) == "equip") { - if (get.subtype(event.card) == "equip6") return true; - if (get.equipResult(player, player, event.card.name) <= 0) return true; - var eff1 = player.getUseValue(event.card); - var subtype = get.subtype(event.card); - return ( - player.countCards("h", function (card) { - return get.subtype(card) == subtype && player.getUseValue(card) >= eff1; - }) > 0 - ); - } - return true; - }, - content() { - "step 0"; - var cards = trigger.cards.filterInD(); - if (cards.length == 1) { - event._result = { bool: true, moved: [cards] }; - } else { - var next = player.chooseToMove("恃才:将牌按顺序置于牌堆顶", true); - next.set("list", [["牌堆顶", cards]]); - next.set( - "reverse", - _status.currentPhase && _status.currentPhase.next - ? get.attitude(player, _status.currentPhase.next) > 0 - : false - ); - next.set("processAI", function (list) { - var cards = list[0][1].slice(0); - cards.sort(function (a, b) { - return (_status.event.reverse ? 1 : -1) * (get.value(b) - get.value(a)); - }); - return [cards]; - }); - } - "step 1"; - if (result.bool) { - var cards = result.moved[0]; - cards.reverse(); - game.cardsGotoPile(cards, "insert"); - game.log(player, "将", cards, "置于了牌堆顶"); - } - player.draw(); - }, - subSkill: { 2: { audio: 2 } }, - ai: { - reverseOrder: true, - skillTagFilter(player) { - if ( - player.getHistory("useCard", function (evt) { - return get.type(evt.card) == "equip"; - }).length > 0 - ) - return false; - }, - effect: { - target(card, player, target) { - if ( - player == target && - get.type(card) == "equip" && - !player.getHistory("useCard", function (evt) { - return get.type(evt.card) == "equip"; - }).length - ) - return [1, 3]; - }, - }, - }, - }, - nzry_cunmu: { - audio: 2, - audioname: ["ol_pengyang"], - trigger: { - player: "drawBegin", - }, - forced: true, - content() { - trigger.bottom = true; - }, - }, - nzry_mingren: { - audio: "nzry_mingren_1", - audioname: ["sb_yl_luzhi"], - marktext: "任", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: ["nzry_mingren_1", "nzry_mingren_2"], - subSkill: { - 1: { - audio: 2, - audioname: ["sb_yl_luzhi"], - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter(event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - !player.getExpansions("nzry_mingren").length - ); - }, - content() { - "step 0"; - player.draw(2); - "step 1"; - if (!player.countCards("h")) event.finish(); - else - player - .chooseCard("h", "将一张手牌置于武将牌上,称为“任”", true) - .set("ai", function (card) { - return 6 - get.value(card); - }); - "step 2"; - if (result.bool) { - player - .addToExpansion(result.cards[0], player, "give", "log") - .gaintag.add("nzry_mingren"); - } - }, - }, - 2: { - trigger: { - player: "phaseJieshuBegin", - }, - filter(event, player) { - return ( - player.countCards("h") > 0 && player.getExpansions("nzry_mingren").length > 0 - ); - }, - direct: true, - content() { - "step 0"; - player - .chooseCard( - "h", - get.prompt("nzry_mingren"), - "选择一张手牌替换“任”(" + - get.translation(player.getExpansions("nzry_mingren")[0]) + - ")" - ) - .set("ai", function (card) { - var player = _status.event.player; - var color = get.color(card); - if (color == get.color(player.getExpansions("nzry_mingren")[0])) - return false; - var num = 0; - var list = []; - player.countCards("h", function (cardx) { - if (cardx != card || get.color(cardx) != color) return false; - if (list.includes(cardx.name)) return false; - list.push(cardx.name); - switch (cardx.name) { - case "wuxie": - num += game.countPlayer() / 2.2; - break; - case "caochuan": - num += 1.1; - break; - case "shan": - num += 1; - break; - } - }); - return num * (30 - get.value(card)); - }); - "step 1"; - if (result.bool) { - player.logSkill("nzry_mingren"); - player - .addToExpansion(result.cards[0], "log", "give", player) - .gaintag.add("nzry_mingren"); - var card = player.getExpansions("nzry_mingren")[0]; - if (card) player.gain(card, "gain2"); - } - }, - }, - }, - }, - nzry_zhenliang: { - audio: "nzry_zhenliang_1", - mark: true, - locked: false, - zhuanhuanji: true, - marktext: "☯", - intro: { - content(storage, player, skill) { - if (player.storage.nzry_zhenliang == true) - return "当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。"; - return "出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。"; - }, - }, - group: ["nzry_zhenliang_1", "nzry_zhenliang_2"], - subSkill: { - 1: { - prompt: "弃置一张与“任”颜色相同的牌,并对攻击范围内的一名角色造成1点伤害。", - audio: 2, - enable: "phaseUse", - filter(event, player) { - if (player.storage.nzry_zhenliang) return false; - var storage = player.getExpansions("nzry_mingren"); - if (!storage.length) return false; - var color = get.color(storage[0]); - if ( - player.countCards("he", function (card) { - return get.color(card) == color; - }) == 0 - ) - return false; - return game.hasPlayer(function (current) { - return player.inRange(current); - }); - }, - position: "he", - filterCard(card, player) { - return get.color(card) == get.color(player.getExpansions("nzry_mingren")[0]); - }, - filterTarget(card, player, target) { - return player.inRange(target); - }, - check(card) { - return 6.5 - get.value(card); - }, - content() { - player.changeZhuanhuanji("nzry_zhenliang"); - target.damage("nocard"); - }, - ai: { - order: 5, - result: { - player(player, target) { - return get.damageEffect(target, player, player); - }, - }, - }, - }, - 2: { - trigger: { - player: ["useCardAfter", "respondAfter"], - }, - filter(event, player) { - if (_status.currentPhase == player || !player.storage.nzry_zhenliang) - return false; - var card = player.getExpansions("nzry_mingren")[0]; - return card && get.color(event.card) == get.color(card); - }, - direct: true, - content() { - "step 0"; - player.chooseTarget(get.prompt("nzry_zhenliang"), "令一名角色摸一张牌").ai = - function (target) { - if (target.hasSkillTag("nogain")) return 0.1; - var att = get.attitude(player, target); - return att * (Math.max(5 - target.countCards("h"), 2) + 3); - }; - "step 1"; - if (result.bool) { - player.changeZhuanhuanji("nzry_zhenliang"); - player.logSkill("nzry_zhenliang", result.targets); - result.targets[0].draw(); - } - }, - }, - }, - ai: { - combo: "nzry_mingren", - }, - }, - nzry_jianxiang: { - audio: 2, - trigger: { - target: "useCardToTargeted", - }, - filter(event, player) { - return event.player != player; - }, - direct: true, - content() { - "step 0"; - player.chooseTarget( - get.prompt("nzry_jianxiang"), - "令场上手牌数最少的一名角色摸一张牌", - function (card, player, target) { - return target.isMinHandcard(); - } - ).ai = function (target) { - return get.attitude(player, target); - }; - "step 1"; - if (result.bool) { - player.logSkill("nzry_jianxiang", result.targets); - result.targets[0].draw(); - } - }, - }, - nzry_shenshi: { - mark: true, - audio: "nzry_shenshi_1", - locked: false, - zhuanhuanji: true, - marktext: "☯", - intro: { - content(storage, player, skill) { - if (player.storage.nzry_shenshi == true) - return "其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张"; - return "出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张"; - }, - }, - group: ["nzry_shenshi_1", "nzry_shenshi_2"], - subSkill: { - 1: { - audio: 2, - prompt: "出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张", - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("he") > 0 && player.storage.nzry_shenshi != true; - }, - discard: false, - line: true, - lose: false, - delay: false, - position: "he", - filterCard: true, - filterTarget(card, player, target) { - return ( - target != player && - !game.hasPlayer(function (current) { - return ( - current != player && current.countCards("h") > target.countCards("h") - ); - }) - ); - }, - check(card) { - return 5 - get.value(card); - }, - content() { - "step 0"; - player.changeZhuanhuanji("nzry_shenshi"); - player.give(cards, target); - target.damage("nocard"); - "step 1"; - if (!target.isIn()) { - player - .chooseTarget( - "令一名角色将手牌摸至四张", - function (card, player, target) { - return target.countCards("h") < 4; - } - ) - .set("ai", function (target) { - return get.attitude(player, target); - }); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.line(result.targets); - result.targets[0].draw(4 - result.targets[0].countCards("h")); - } - }, - ai: { - order: 1, - result: { - target(player, target) { - return -1; - }, - }, - }, - }, - 2: { - audio: "nzry_shenshi_1", - trigger: { - player: "damageEnd", - }, - filter(event, player) { - return ( - player.countCards("he") > 0 && - event.source && - event.source != player && - player.storage.nzry_shenshi == true - ); - }, - check(event, player) { - return ( - event.source && - event.source.countCards("h") <= 2 && - player.countCards("h") < 4 - ); - }, - logTarget: "source", - prompt2: - "其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张", - content() { - "step 0"; - player.changeZhuanhuanji("nzry_shenshi"); - player.viewHandcards(trigger.source); - player - .chooseCard("he", true, "交给" + get.translation(trigger.source) + "一张牌") - .set("ai", function (card) { - return 5 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.give(result.cards, trigger.source); - trigger.source.storage.nzry_shenshi1 = result.cards[0]; - trigger.source.storage.nzry_shenshi2 = player; - trigger.source.addSkill("nzry_shenshi1"); - } - }, - }, - }, - }, - nzry_shenshi1: { - audio: 2, - trigger: { - global: "phaseJieshuBegin", - }, - forced: true, - popup: false, - charlotte: true, - filter(event, player) { - return ( - player.storage.nzry_shenshi1 != undefined && player.storage.nzry_shenshi2 != undefined - ); - }, - content() { - var pl = player.storage.nzry_shenshi2; - var card = player.storage.nzry_shenshi1; - if (player.getCards("he").includes(card) && 4 - pl.countCards("h") > 0) { - pl.draw(4 - pl.countCards("h")); - pl.logSkill("nzry_shenshi"); - } - player.removeSkill("nzry_shenshi1"); - delete player.storage.nzry_shenshi1; - delete player.storage.nzry_shenshi2; - }, - }, - xinjushou: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - content() { - "step 0"; - player.draw(4); - player.turnOver(); - "step 1"; - player - .chooseCard("h", true, "弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之") - .set("ai", function (card) { - if (get.type(card) == "equip") { - return 5 - get.value(card); - } - return -get.value(card); - }) - .set("filterCard", lib.filter.cardDiscardable); - "step 2"; - if (result.bool && result.cards.length) { - var card = result.cards[0]; - if (get.type(card) == "equip" && player.hasUseTarget(card)) { - player.chooseUseTarget(card, true, "nopopup"); - } else { - player.discard(card); - } - } - }, - ai: { - effect: { - target(card, player, target) { - if (card.name == "guiyoujie") return [0, 1]; - }, - }, - }, - }, - xinjiewei: { - audio: 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); - }, - threaten: 1.2, - group: "xinjiewei_move", - subSkill: { - move: { - trigger: { player: "turnOverEnd" }, - direct: true, - audio: "jiewei", - filter(event, player) { - return !player.isTurnedOver() && player.canMoveCard(); - }, - content() { - "step 0"; - player - .chooseToDiscard( - "he", - get.prompt("xinjiewei"), - "弃置一张牌并移动场上的一张牌", - lib.filter.cardDiscardable - ) - .set("ai", function (card) { - if (!_status.event.check) return 0; - return 7 - get.value(card); - }) - .set("check", player.canMoveCard(true)) - .set("logSkill", "xinjiewei"); - "step 1"; - if (result.bool) { - player.moveCard(true); - } else { - event.finish(); - } - }, - }, - }, - }, - jianchu: { - shaRelated: true, - audio: 2, - audioname: ["re_pangde"], - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - return event.card.name == "sha" && event.target.countDiscardableCards(player, "he") > 0; - }, - preHidden: true, - check(event, player) { - return get.attitude(player, event.target) <= 0; - }, - logTarget: "target", - content() { - "step 0"; - player - .discardPlayerCard(trigger.target, get.prompt("jianchu", trigger.target), true) - .set("ai", function (button) { - if (!_status.event.att) return 0; - if (get.position(button.link) == "e") { - if (get.subtype(button.link) == "equip2") return 2 * get.value(button.link); - return get.value(button.link); - } - return 1; - }) - .set("att", get.attitude(player, trigger.target) <= 0); - "step 1"; - if (result.bool && result.links && result.links.length) { - if ( - get.type( - result.links[0], - null, - result.links[0].original == "h" ? player : false - ) == "equip" - ) { - trigger.getParent().directHit.add(trigger.target); - } else if (trigger.cards) { - var list = []; - for (var i = 0; i < trigger.cards.length; i++) { - if (get.position(trigger.cards[i], true) == "o") list.push(trigger.cards[i]); - } - if (list.length) trigger.target.gain(list, "gain2", "log"); - } - } - }, - ai: { - unequip_ai: true, - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if (tag == "directHit_ai") - return ( - arg.card.name == "sha" && - arg.target.countCards("e", function (card) { - return get.value(card) > 1; - }) > 0 - ); - if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; - return false; - }, - }, - }, - redimeng: { - audio: "dimeng", - enable: "phaseUse", - usable: 1, - position: "he", - filterCard() { - if (ui.selected.targets.length == 2) return false; - return true; - }, - selectCard: [0, Infinity], - selectTarget: 2, - complexCard: true, - complexSelect: true, - filterTarget(card, player, target) { - if (player == target) return false; - if (ui.selected.targets.length == 0) return true; - return ( - Math.abs(ui.selected.targets[0].countCards("h") - target.countCards("h")) == - ui.selected.cards.length - ); - }, - multitarget: true, - multiline: true, - content() { - "step 0"; - var cards = targets[0].getCards("h").concat(targets[1].getCards("h")); - var dialog = ui.create.dialog("缔盟", true); - if ( - player.isUnderControl(true) || - targets[0].isUnderControl(true) || - targets[1].isUnderControl(true) - ) { - dialog.add(cards); - dialog.seeing = true; - } else { - dialog.add([cards, "blank"]); - } - _status.dieClose.push(dialog); - dialog.videoId = lib.status.videoId++; - game.addVideo("cardDialog", null, ["缔盟", get.cardsInfo(cards), dialog.videoId]); - game.broadcast( - function (cards, id, player, targets) { - var dialog = ui.create.dialog("缔盟", true); - if ( - player.isUnderControl(true) || - targets[0].isUnderControl(true) || - targets[1].isUnderControl(true) - ) { - dialog.add(cards); - dialog.seeing = true; - } else { - dialog.add([cards, "blank"]); - } - _status.dieClose.push(dialog); - dialog.videoId = id; - }, - cards, - dialog.videoId, - player, - targets - ); - - event.current = targets[0]; - event.dialog = dialog; - event.num1 = 0; - event.num2 = 0; - game.delay(); - "step 1"; - if (event.dialog.buttons.length > 1) { - var next = event.current.chooseButton(true, function (button) { - return get.value(button.link, _status.event.player); - }); - next.set("dialog", event.dialog.videoId); - next.set("closeDialog", false); - next.set("dialogdisplay", true); - } else { - event.directButton = event.dialog.buttons[0]; - } - "step 2"; - var dialog = event.dialog; - var card; - if (event.directButton) { - card = event.directButton.link; - } else { - card = result.links[0]; - } - for (var i = 0; i < dialog.buttons.length; i++) { - if (dialog.buttons[i].link == card) { - var button = dialog.buttons[i]; - if (dialog.seeing) { - button.querySelector(".info").innerHTML = get.translation(event.current.name); - if (!_status.connectMode) { - game.log(event.current, "选择了", button.link); - } - } - dialog.buttons.remove(button); - break; - } - } - if (card) { - event.current.gain(card); - if (dialog.seeing) { - event.current.$draw(card, "nobroadcast"); - } else { - event.current.$draw(1, "nobroadcast"); - } - game.broadcast( - function (card, id, target) { - var dialog = get.idDialog(id); - if (dialog && dialog.seeing) { - for (var i = 0; i < dialog.buttons.length; i++) { - if (dialog.buttons[i].link == card) { - dialog.buttons[i].querySelector(".info").innerHTML = - get.translation(target.name); - dialog.buttons.splice(i--, 1); - break; - } - } - target.$draw(card, "nobroadcast"); - } else { - target.$draw(1, "nobroadcast"); - } - }, - card, - dialog.videoId, - event.current - ); - } - game.delay(2); - if (event.current == targets[0]) { - event.num1++; - event.current = targets[1]; - } else { - event.num2++; - event.current = targets[0]; - } - if (dialog.buttons.length) { - event.goto(1); - } - "step 3"; - if (!_status.connectMode) { - game.log(targets[0], "获得了" + get.cnNumber(event.num1) + "张牌"); - game.log(targets[1], "获得了" + get.cnNumber(event.num2) + "张牌"); - } - var dialog = event.dialog; - dialog.close(); - _status.dieClose.remove(dialog); - game.broadcast(function (id) { - var dialog = get.idDialog(id); - if (dialog) { - dialog.close(); - _status.dieClose.remove(dialog); - } - }, dialog.videoId); - game.addVideo("cardDialog", null, dialog.videoId); - }, - targetprompt: ["先拿牌", "后拿牌"], - find(type) { - var list = game.filterPlayer(function (current) { - return current != player && get.attitude(player, current) > 3; - }); - var player = _status.event.player; - var num = player.countCards("he", function (card) { - return get.value(card) < 7; - }); - var count = null; - var from, nh; - if (list.length == 0) return null; - list.sort(function (a, b) { - return a.countCards("h") - b.countCards("h"); - }); - if (type == 1) return list[0]; - from = list[0]; - nh = from.countCards("h"); - - list = game.filterPlayer(function (current) { - return current != player && get.attitude(player, current) < 1; - }); - if (list.length == 0) return null; - list.sort(function (a, b) { - return b.countCards("h") - a.countCards("h"); - }); - for (var i = 0; i < list.length; i++) { - var nh2 = list[i].countCards("h"); - if (nh2 - nh <= num) { - count = nh2 - nh; - break; - } - } - if (count == null || count < 0) return null; - if (type == 3) return count; - return list[i]; - }, - check(card) { - var count = lib.skill.redimeng.find(3); - if (count == null) return -1; - if (ui.selected.cards.length < count) return 7 - get.value(card); - return -1; - }, - ai: { - order: 8, - threaten: 1.6, - expose: 0.5, - result: { - player(player, target) { - if (ui.selected.targets.length == 0) { - if (target == lib.skill.redimeng.find(1)) return 1; - return 0; - } else { - if (target == lib.skill.redimeng.find(2)) return 1; - return 0; - } - }, - }, - }, - }, - reluanji: { - audio: 2, - enable: "phaseUse", - viewAs: { name: "wanjian" }, - filterCard(card, player) { - if (!player.storage.reluanji) return true; - return !player.storage.reluanji.includes(get.suit(card)); - }, - position: "hs", - selectCard: 2, - check(card) { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return player.canUse("wanjian", current); - }); - var num = 0; - for (var i = 0; i < targets.length; i++) { - var eff = get.sgn(get.effect(targets[i], { name: "wanjian" }, player, player)); - if (targets[i].hp == 1) { - eff *= 1.5; - } - num += eff; - } - if (!player.needsToDiscard(-1)) { - if (targets.length >= 7) { - if (num < 2) return 0; - } else if (targets.length >= 5) { - if (num < 1.5) return 0; - } - } - return 6 - get.value(card); - }, - ai: { - basic: { - order: 8.9, - }, - }, - group: [ - "reluanji_count", - "reluanji_reset", - "reluanji_respond", - "reluanji_damage", - "reluanji_draw", - ], - subSkill: { - reset: { - trigger: { player: "phaseAfter" }, - silent: true, - content() { - delete player.storage.reluanji; - delete player.storage.reluanji2; - }, - }, - count: { - trigger: { player: "useCard" }, - silent: true, - filter(event) { - return event.skill == "reluanji"; - }, - content() { - player.storage.reluanji2 = trigger.card; - if (!player.storage.reluanji) { - player.storage.reluanji = []; - } - for (var i = 0; i < trigger.cards.length; i++) { - player.storage.reluanji.add(get.suit(trigger.cards[i])); - } - }, - }, - respond: { - trigger: { global: "respond" }, - silent: true, - filter(event) { - return event.getParent(2).skill == "reluanji"; - }, - content() { - trigger.player.draw(); - }, - }, - damage: { - trigger: { source: "damage" }, - forced: true, - silent: true, - popup: false, - filter(event, player) { - return player.storage.reluanji2 && event.card == player.storage.reluanji2; - }, - content() { - delete player.storage.reluanji2; - }, - }, - draw: { - trigger: { player: "useCardAfter" }, - forced: true, - silent: true, - popup: false, - filter(event, player) { - return player.storage.reluanji2 && event.card == player.storage.reluanji2; - }, - content() { - player.draw(trigger.targets.length); - delete player.storage.reluanji2; - }, - }, - }, - }, - qimou: { - unique: true, - limited: true, - audio: 2, - enable: "phaseUse", - filter(event, player) { - return !player.storage.qimou; - }, - init(player) { - player.storage.qimou = false; - }, - mark: true, - intro: { - content: "limited", - }, - skillAnimation: true, - animationColor: "orange", - content() { - "step 0"; - var shas = player.getCards("h", "sha"); - var num; - if (player.hp >= 4 && shas.length >= 3) { - num = 3; - } else if (player.hp >= 3 && shas.length >= 2) { - num = 2; - } else { - num = 1; - } - var map = {}; - var list = []; - for (var i = 1; i <= player.hp; i++) { - var cn = get.cnNumber(i, true); - map[cn] = i; - list.push(cn); - } - event.map = map; - player.awakenSkill("qimou"); - player.storage.qimou = true; - player - .chooseControl(list, function () { - return get.cnNumber(_status.event.goon, true); - }) - .set("prompt", "失去任意点体力") - .set("goon", num); - "step 1"; - var num = event.map[result.control] || 1; - player.storage.qimou2 = num; - player.loseHp(num); - player.addTempSkill("qimou2"); - }, - ai: { - order: 2, - result: { - player(player) { - if (player.hp == 1) return 0; - var shas = player.getCards("h", "sha"); - if (!shas.length) return 0; - var card = shas[0]; - if (!lib.filter.cardEnabled(card, player)) return 0; - if (lib.filter.cardUsable(card, player)) return 0; - var mindist; - if (player.hp >= 4 && shas.length >= 3) { - mindist = 4; - } else if (player.hp >= 3 && shas.length >= 2) { - mindist = 3; - } else { - mindist = 2; - } - if ( - game.hasPlayer(function (current) { - return ( - current.hp <= mindist - 1 && - get.distance(player, current, "attack") <= mindist && - player.canUse(card, current, false) && - get.effect(current, card, player, player) > 0 - ); - }) - ) { - return 1; - } - return 0; - }, - }, - }, - }, - qimou2: { - onremove: true, - mod: { - cardUsable(card, player, num) { - if (typeof player.storage.qimou2 == "number" && card.name == "sha") { - return num + player.storage.qimou2; - } - }, - globalFrom(from, to, distance) { - if (typeof from.storage.qimou2 == "number") { - return distance - from.storage.qimou2; - } - }, - }, - }, - xinkuanggu: { - audio: "kuanggu", - audioname: ["re_weiyan", "ol_weiyan"], - trigger: { source: "damageSource" }, - filter(event, player) { - return event.kuangguCheck && event.num > 0; - }, - direct: true, - preHidden: true, - content() { - "step 0"; - event.num = trigger.num; - "step 1"; - var choice; - if ( - player.isDamaged() && - get.recoverEffect(player) > 0 && - player.countCards("hs", function (card) { - return card.name == "sha" && player.hasValueTarget(card); - }) >= player.getCardUsable("sha") - ) { - choice = "recover_hp"; - } else { - choice = "draw_card"; - } - var next = player - .chooseDrawRecover("###" + get.prompt(event.name) + "###摸一张牌或回复1点体力") - .set("logSkill", event.name); - next.set("choice", choice); - next.set("ai", function () { - return _status.event.getParent().choice; - }); - next.setHiddenSkill("xinkuanggu"); - "step 2"; - if (result.control != "cancel2") { - event.num--; - if (event.num > 0 && player.hasSkill("xinkuanggu")) { - event.goto(1); - } - } - }, - group: "kuanggu_check", - }, - xinliegong: { - shaRelated: true, - mod: { - aiOrder(player, card, num) { - if (num > 0 && (card.name === "sha" || get.tag(card, "draw"))) return num + 6; - }, - targetInRange(card, player, target) { - if (card.name == "sha" && typeof get.number(card) == "number") { - if (get.distance(player, target) <= get.number(card)) return true; - } - }, - }, - audio: "liegong", - audioname: ["re_huangzhong", "ol_huangzhong"], - trigger: { player: "useCardToTargeted" }, - logTarget: "target", - locked: false, - check(event, player) { - return get.attitude(player, event.target) <= 0; - }, - filter(event, player) { - if (event.card.name != "sha") return false; - if (event.target.countCards("h") <= player.countCards("h")) return true; - if (event.target.hp >= player.hp) return true; - return false; - }, - content() { - if (trigger.target.countCards("h") <= player.countCards("h")) - trigger.getParent().directHit.push(trigger.target); - if (trigger.target.hp >= player.hp) { - var id = trigger.target.playerid; - var map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].extraDamage != "number") { - map[id].extraDamage = 0; - } - map[id].extraDamage++; - } - }, - ai: { - threaten: 0.5, - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if ( - get.attitude(player, arg.target) <= 0 && - arg.card.name == "sha" && - player.countCards("h", function (card) { - return ( - card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) - ); - }) >= arg.target.countCards("h") - ) - return true; - return false; - }, - }, - }, - tiaoxin: { - audio: 2, - audioname: ["sp_jiangwei", "xiahouba", "re_jiangwei", "gz_jiangwei", "ol_jiangwei"], - audioname2: { - dc_xiahouba: "tiaoxin_xiahouba", - }, - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return target != player && target.inRange(player) && target.countCards("he") > 0; - }, - content() { - "step 0"; - 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); - "step 1"; - if (result.bool == false && target.countCards("he") > 0) { - player.discardPlayerCard(target, "he", true); - } else { - event.finish(); - } - }, - ai: { - order: 4, - expose: 0.2, - result: { - target: -1, - player(player, target) { - if (target.countCards("h") == 0) return 0; - if (target.countCards("h") == 1) return -0.1; - if (player.hp <= 2) return -2; - if (player.countCards("h", "shan") == 0) return -1; - return -0.5; - }, - }, - threaten: 1.1, - }, - }, - tiaoxin_xiahouba: { audio: 2 }, - zhiji: { - skillAnimation: true, - animationColor: "fire", - audio: 2, - audioname: ["re_jiangwei"], - unique: true, - juexingji: true, - //priority:-10, - derivation: "reguanxing", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter(event, player) { - if (player.storage.zhiji) return false; - return player.countCards("h") == 0; - }, - content() { - "step 0"; - player.awakenSkill("zhiji"); - player.chooseDrawRecover(2, true); - "step 1"; - player.loseMaxHp(); - player.addSkills("reguanxing"); - }, - }, - xiangle: { - audio: 2, - audioname: ["re_liushan", "ol_liushan"], - trigger: { target: "useCardToTargeted" }, - forced: true, - preHidden: true, - filter(event, player) { - return event.card.name == "sha"; - }, - content() { - "step 0"; - var eff = get.effect(player, trigger.card, trigger.player, trigger.player); - trigger.player - .chooseToDiscard( - "享乐:弃置一张基本牌,否则杀对" + get.translation(player) + "无效", - function (card) { - return get.type(card) == "basic"; - } - ) - .set("ai", function (card) { - if (_status.event.eff > 0) { - return 10 - get.value(card); - } - return 0; - }) - .set("eff", eff); - "step 1"; - if (result.bool == false) { - trigger.getParent().excluded.add(player); - } - }, - ai: { - effect: { - target_use(card, player, target, current) { - if (card.name == "sha" && get.attitude(player, target) < 0) { - if (_status.event.name == "xiangle") return; - if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; - var bs = player.getCards("h", { type: "basic" }); - bs.remove(card); - if (card.cards) bs.removeArray(card.cards); - else bs.removeArray(ui.selected.cards); - if (!bs.length) return "zerotarget"; - if (player.hasSkill("jiu") || player.hasSkill("tianxianjiu")) return; - if (bs.length <= 2) { - for (var i = 0; i < bs.length; i++) { - if (get.value(bs[i]) < 7) { - return [1, 0, 1, -0.5]; - } - } - return [1, 0, 0.3, 0]; - } - return [1, 0, 1, -0.5]; - } - }, - }, - }, - }, - fangquan: { - audio: 2, - trigger: { player: "phaseUseBefore" }, - filter(event, player) { - return player.countCards("h") > 0 && !player.hasSkill("fangquan3"); - }, - direct: true, - preHidden: true, - content() { - "step 0"; - var fang = - player.countMark("fangquan2") == 0 && - player.hp >= 2 && - player.countCards("h") <= player.hp + 1; - player - .chooseBool(get.prompt2("fangquan")) - .set("ai", function () { - if (!_status.event.fang) return false; - return game.hasPlayer(function (target) { - if (target.hasJudge("lebu") || target == player) return false; - if (get.attitude(player, target) > 4) { - return ( - get.threaten(target) / - Math.sqrt(target.hp + 1) / - Math.sqrt(target.countCards("h") + 1) > - 0 - ); - } - return false; - }); - }) - .set("fang", fang) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - player.logSkill("fangquan"); - trigger.cancel(); - player.addTempSkill("fangquan2"); - player.addMark("fangquan2", 1, false); - //player.storage.fangquan=result.targets[0]; - } - }, - }, - fangquan2: { - trigger: { player: "phaseEnd" }, - forced: true, - popup: false, - audio: false, - //priority:-50, - onremove: true, - content() { - "step 0"; - event.count = player.countMark(event.name); - player.removeMark(event.name, event.count); - "step 1"; - event.count--; - player - .chooseToDiscard("是否弃置一张牌并令一名其他角色进行一个额外回合?") - .set("logSkill", player.name == "re_liushan" ? "refangquan" : "fangquan").ai = - function (card) { - return 20 - get.value(card); - }; - "step 2"; - if (result.bool) { - player.chooseTarget(true, "请选择进行额外回合的目标角色", lib.filter.notMe).ai = - function (target) { - if (target.hasJudge("lebu") || get.attitude(player, target) <= 0) return -1; - if (target.isTurnedOver()) return 0.18; - return ( - get.threaten(target) / - Math.sqrt(target.hp + 1) / - Math.sqrt(target.countCards("h") + 1) - ); - }; - } else event.finish(); - "step 3"; - var target = result.targets[0]; - player.line(target, "fire"); - target.markSkillCharacter("fangquan", player, "放权", "进行一个额外回合"); - target.insertPhase(); - target.addSkill("fangquan3"); - if (event.count > 0) event.goto(1); - }, - }, - fangquan3: { - trigger: { player: ["phaseAfter", "phaseCancelled"] }, - forced: true, - popup: false, - audio: false, - content() { - player.unmarkSkill("fangquan"); - player.removeSkill("fangquan3"); - }, - }, - ruoyu: { - skillAnimation: true, - animationColor: "fire", - audio: 2, - audioname: ["re_liushan"], - unique: true, - juexingji: true, - zhuSkill: true, - keepSkill: true, - derivation: "rejijiang", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter(event, player) { - return player.isMinHp(); - }, - content() { - "step 0"; - player.awakenSkill("ruoyu"); - player.gainMaxHp(); - player.recover(); - "step 1"; - player.addSkills("rejijiang"); - }, - }, - qiaobian: { - audio: 2, - trigger: { - player: ["phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore"], - }, - filter(event, player) { - return player.countCards("h") > 0; - }, - direct: true, - preHidden: true, - content() { - "step 0"; - var check, - str = "弃置一张手牌并跳过"; - str += ["判定", "摸牌", "出牌", "弃牌"][ - lib.skill.qiaobian.trigger.player.indexOf(event.triggername) - ]; - str += "阶段"; - if (trigger.name == "phaseDraw") str += ",然后可以获得至多两名角色各一张手牌"; - if (trigger.name == "phaseUse") str += ",然后可以移动场上的一张牌"; - switch (trigger.name) { - case "phaseJudge": - check = player.countCards("j"); - break; - case "phaseDraw": - var i, - num = 0, - num2 = 0, - players = game.filterPlayer(); - for (i = 0; i < players.length; i++) { - if (player != players[i] && players[i].countCards("h")) { - var att = get.attitude(player, players[i]); - if (att <= 0) { - num++; - } - if (att < 0) { - num2++; - } - } - } - check = num >= 2 && num2 > 0; - break; - case "phaseUse": - if (!player.canMoveCard(true)) { - check = false; - } else { - check = game.hasPlayer(function (current) { - return get.attitude(player, current) > 0 && current.countCards("j"); - }); - if (!check) { - if (player.countCards("h") > player.hp + 1) { - check = false; - } else if (player.countCards("h", { name: "wuzhong" })) { - check = false; - } else { - check = true; - } - } - } - break; - case "phaseDiscard": - check = player.needsToDiscard(); - break; - } - player - .chooseToDiscard(get.prompt("qiaobian"), str, lib.filter.cardDiscardable) - .set("ai", (card) => { - if (!_status.event.check) return -1; - return 7 - get.value(card); - }) - .set("check", check) - .set("logSkill", "qiaobian") - .setHiddenSkill("qiaobian"); - "step 1"; - if (result.bool) { - trigger.cancel(); - game.log( - player, - "跳过了", - "#y" + - ["判定", "摸牌", "出牌", "弃牌"][ - lib.skill.qiaobian.trigger.player.indexOf(event.triggername) - ] + - "阶段" - ); - if (trigger.name == "phaseUse") { - if (player.canMoveCard()) player.moveCard(); - event.finish(); - } else if (trigger.name == "phaseDraw") { - player - .chooseTarget( - [1, 2], - "获得至多两名角色各一张手牌", - function (card, player, target) { - return target != player && target.countCards("h"); - } - ) - .set("ai", function (target) { - return 1 - get.attitude(_status.event.player, target); - }); - } else event.finish(); - } else event.finish(); - "step 2"; - if (result.bool) { - result.targets.sortBySeat(); - player.line(result.targets, "green"); - event.targets = result.targets; - if (!event.targets.length) event.finish(); - } else event.finish(); - "step 3"; - player.gainMultiple(event.targets); - "step 4"; - game.delay(); - }, - ai: { threaten: 3 }, - }, - tuntian: { - audio: 2, - audioname: ["gz_dengai"], - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - frequent: true, - preHidden: true, - filter(event, player) { - if (player == _status.currentPhase) return false; - if (event.name == "gain" && event.player == player) return false; - var evt = event.getl(player); - return evt && evt.cards2 && evt.cards2.length > 0; - }, - content() { - "step 0"; - var next = player.judge(function (card) { - if (get.suit(card) == "heart") return -1; - return 1; - }); - next.judge2 = function (result) { - return result.bool; - }; - if (get.mode() != "guozhan") { - next.callback = lib.skill.tuntian.callback; - event.finish(); - } - "step 1"; - if (!result.bool || get.position(result.card) != "d") { - //game.cardsDiscard(card); - event.finish(); - return; - } - event.card = result.card; - player.chooseBool("是否将" + get.translation(event.card) + "作为“田”置于武将牌上?").ai = - function () { - return true; - }; - "step 2"; - if (!result.bool && !event.directbool) { - return; - } - player.addToExpansion(event.card, "gain2").gaintag.add("tuntian"); - }, - callback() { - if (!event.judgeResult.bool) { - event.finish(); - return; - } - player.addToExpansion(event.judgeResult.card, "gain2").gaintag.add("tuntian"); - }, - marktext: "田", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: "tuntian_dist", - locked: false, - subSkill: { - dist: { - locked: false, - mod: { - globalFrom(from, to, distance) { - var num = distance - from.getExpansions("tuntian").length; - if ( - _status.event.skill == "jixi_backup" || - _status.event.skill == "gzjixi_backup" - ) - num++; - return num; - }, - }, - }, - }, - ai: { - effect: { - target(card, player, target, current) { - if ( - typeof card === "object" && - get.name(card) === "sha" && - target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) - ) - return [0.6, 0.75]; - if (!target.hasFriend() && !player.hasUnknown()) return; - if (_status.currentPhase == target || get.type(card) === "delay") return; - if ( - card.name != "shuiyanqijunx" && - get.tag(card, "loseCard") && - target.countCards("he") - ) { - if (target.hasSkill("ziliang")) return 0.7; - return [0.5, Math.max(2, target.countCards("h"))]; - } - if (target.isUnderControl(true, player)) { - if ( - (get.tag(card, "respondSha") && target.countCards("h", "sha")) || - (get.tag(card, "respondShan") && target.countCards("h", "shan")) - ) { - if (target.hasSkill("ziliang")) return 0.7; - return [0.5, 1]; - } - } else if (get.tag(card, "respondSha") || get.tag(card, "respondShan")) { - if (get.attitude(player, target) > 0 && card.name == "juedou") return; - if (get.tag(card, "damage") && target.hasSkillTag("maixie")) return; - if (target.countCards("h") == 0) return 2; - if (target.hasSkill("ziliang")) return 0.7; - if (get.mode() == "guozhan") return 0.5; - return [ - 0.5, - Math.max( - target.countCards("h") / 4, - target.countCards("h", "sha") + target.countCards("h", "shan") - ), - ]; - } - }, - }, - threaten(player, target) { - if (target.countCards("h") == 0) return 2; - return 0.5; - }, - nodiscard: true, - nolose: true, - }, - }, - zaoxian: { - skillAnimation: true, - animationColor: "thunder", - audio: 2, - audioname: ["re_dengai"], - unique: true, - juexingji: true, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter(event, player) { - return player.getExpansions("tuntian").length >= 3; - }, - derivation: "jixi", - content() { - player.awakenSkill("zaoxian"); - player.loseMaxHp(); - player.addSkills("jixi"); - }, - ai: { - combo: "tuntian" - }, - }, - jixi: { - audio: 2, - audioname: ["re_dengai", "gz_dengai", "ol_dengai"], - enable: "phaseUse", - filter(event, player) { - return ( - player.getExpansions("tuntian").length > 0 && - event.filterCard({ name: "shunshou" }, player, event) - ); - }, - chooseButton: { - dialog(event, player) { - return ui.create.dialog("急袭", player.getExpansions("tuntian"), "hidden"); - }, - filter(button, player) { - var card = button.link; - if (!game.checkMod(card, player, "unchanged", "cardEnabled2", player)) return false; - var evt = _status.event.getParent(); - return evt.filterCard(get.autoViewAs({ name: "shunshou" }, [card]), player, evt); - }, - backup(links, player) { - var skill = _status.event.buttoned; - return { - audio: "jixi", - audioname: ["re_dengai", "gz_dengai", "ol_dengai"], - selectCard: -1, - position: "x", - filterCard: - skill == "jixi" - ? (card) => card == lib.skill.jixi_backup.card - : (card) => card == lib.skill.gzjixi_backup.card, - viewAs: { name: "shunshou" }, - card: links[0], - }; - }, - prompt(links, player) { - return "选择 顺手牵羊(" + get.translation(links[0]) + ")的目标"; - }, - }, - ai: { - order: 10, - result: { - player(player) { - return player.getExpansions("tuntian").length - 1; - }, - }, - combo: "tuntian", - }, - }, - jiang: { - shaRelated: true, - audio: 2, - preHidden: true, - audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], - mod: { - aiOrder(player, card, num) { - if (get.color(card) === "red" && get.name(card) === "sha") - return get.order({ name: "sha" }) + 0.15; - }, - }, - trigger: { - player: "useCardToPlayered", - target: "useCardToTargeted", - }, - filter(event, player) { - if ( - !( - event.card.name == "juedou" || - (event.card.name == "sha" && get.color(event.card) == "red") - ) - ) - return false; - return player == event.target || event.getParent().triggeredTargets3.length == 1; - }, - locked: false, - frequent: true, - content() { - player.draw(); - }, - ai: { - effect: { - target(card, player, target) { - if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; - }, - player(card, player, target) { - if (card.name == "sha" && get.color(card) == "red") return [1, 1]; - }, - }, - }, - }, - hunzi: { - //audioname:['re_sunben'], - skillAnimation: true, - animationColor: "wood", - audio: 2, - juexingji: true, - derivation: ["reyingzi", "gzyinghun"], - unique: true, - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - return player.hp <= 1 && !player.storage.hunzi; - }, - forced: true, - //priority:3, - content() { - player.awakenSkill(event.name); - player.loseMaxHp(); - player.addSkills(["reyingzi", "gzyinghun"]); - }, - ai: { - threaten(player, target) { - if (target.hp == 1) return 2; - return 0.5; - }, - maixie: true, - effect: { - target(card, player, target) { - if (!target.hasFriend()) return; - if ( - target.hp === 2 && - get.tag(card, "damage") == 1 && - !target.isTurnedOver() && - _status.currentPhase !== target && - get.distance(_status.currentPhase, target, "absolute") <= 3 - ) - return [0.5, 1]; - if ( - target.hp === 1 && - get.tag(card, "recover") && - !target.isTurnedOver() && - _status.currentPhase !== target && - get.distance(_status.currentPhase, target, "absolute") <= 3 - ) - return [1, -3]; - }, - }, - }, - }, - zhiba: { - unique: true, - global: "zhiba2", - audioname: ["re_sunben"], - audio: "zhiba2", - zhuSkill: true, - }, - zhiba2: { - audio: 2, - audioname: ["re_sunben"], - //forceaudio:true, - enable: "phaseUse", - prompt() { - var player = _status.event.player; - var list = game.filterPlayer(function (target) { - return target.hasZhuSkill("zhiba", player) && player.canCompare(target); - }); - var str = "和" + get.translation(list); - if (list.length > 1) str += "中的一人"; - str += "进行拼点。若你没赢,其可以获得两张拼点牌。"; - return str; - }, - filter(event, player) { - if (player.group != "wu" || player.countCards("h") == 0) return false; - return game.hasPlayer(function (target) { - return target.hasZhuSkill("zhiba", player) && player.canCompare(target); - }); - }, - filterTarget(card, player, target) { - return target.hasZhuSkill("zhiba", player) && player.canCompare(target); - }, - log: false, - prepare(cards, player, targets) { - targets[0].logSkill("zhiba"); - }, - usable: 1, - content() { - "step 0"; - if (target.storage.hunzi || target.storage.rehunzi) { - target - .chooseControl("拒绝", "不拒绝") - .set("prompt", "是否拒绝制霸拼点?") - .set("choice", get.attitude(target, player) <= 0); - } else { - event.forced = true; - } - "step 1"; - if (!event.forced && result.control == "拒绝") { - game.log(target, "拒绝了拼点"); - target.chat("拒绝"); - event.finish(); - return; - } - player - .chooseToCompare(target, function (card) { - if (card.name == "du") return 20; - var player = get.owner(card); - var target = _status.event.getParent().target; - if (player != target && get.attitude(player, target) > 0) { - return -get.number(card); - } - return get.number(card); - }) - .set("preserve", "lose"); - "step 2"; - if (result.bool == false) { - var list = []; - if (get.position(result.player) == "d") list.push(result.player); - if (get.position(result.target) == "d") list.push(result.target); - if (!list.length) event.finish(); - else { - event.list = list; - target.chooseBool("是否获得" + get.translation(list) + "?").ai = function () { - return get.value(list) > 0; - }; - } - } else event.finish(); - "step 3"; - if (result.bool) target.gain(event.list, "gain2"); - }, - ai: { - basic: { - order: 1, - }, - expose: 0.2, - result: { - target(player, target) { - if (player.countCards("h", "du") && get.attitude(player, target) < 0) return -1; - if (player.countCards("h") <= player.hp) return 0; - var maxnum = 0; - var cards2 = target.getCards("h"); - for (var i = 0; i < cards2.length; i++) { - if (get.number(cards2[i]) > maxnum) { - maxnum = get.number(cards2[i]); - } - } - if (maxnum > 10) maxnum = 10; - if (maxnum < 5 && cards2.length > 1) maxnum = 5; - var cards = player.getCards("h"); - for (var i = 0; i < cards.length; i++) { - if (get.number(cards[i]) < maxnum) return 1; - } - return 0; - }, - }, - }, - }, - zhijian: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return player.countCards("h", { type: "equip" }) > 0; - }, - filterCard(card) { - return get.type(card) == "equip"; - }, - check(card) { - var player = _status.currentPhase; - if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { - return 11 - get.equipValue(card); - } - return 6 - get.value(card); - }, - filterTarget(card, player, target) { - if (target.isMin()) return false; - return player != target && target.canEquip(card); - }, - async content(event, trigger, player) { - event.target.equip(event.cards[0]); - player.draw(); - }, - discard: false, - lose: false, - prepare(cards, player, targets) { - player.$give(cards, targets[0], false); - }, - ai: { - basic: { - order: 10, - }, - result: { - target(player, target) { - var card = ui.selected.cards[0]; - if (card) return get.effect(target, card, target, target); - return 0; - }, - }, - threaten: 1.3, - }, - }, - guzheng: { - audio: 2, - audioname: ["re_zhangzhang"], - trigger: { global: "phaseDiscardAfter" }, - filter(event, player) { - if (event.player != player && event.player.isIn()) { - return ( - event.player.getHistory("lose", function (evt) { - return ( - evt.type == "discard" && - evt.getParent("phaseDiscard") == event && - evt.hs.someInD("d") - ); - }).length > 0 - ); - } - return false; - }, - checkx(event, player, cards, cards2) { - if (cards.length > 2 || get.attitude(player, event.player) > 0) return true; - for (var i = 0; i < cards2.length; i++) { - if (get.value(cards2[i], event.player, "raw") < 0) return true; - } - return false; - }, - direct: true, - preHidden: true, - content() { - "step 0"; - var cards = [], - cards2 = []; - var target = trigger.player; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name == "cardsDiscard") { - if (evt.getParent("phaseDiscard") == trigger) { - var moves = evt.cards.filterInD("d"); - cards.addArray(moves); - cards2.removeArray(moves); - } - } - if (evt.name == "lose") { - if ( - evt.type != "discard" || - evt.position != ui.discardPile || - evt.getParent("phaseDiscard") != trigger - ) - return; - var moves = evt.cards.filterInD("d"); - cards.addArray(moves); - if (evt.player == target) cards2.addArray(moves); - else cards2.removeArray(moves); - } - }); - if (!cards2.length) event.finish(); - else if (cards.length == 1) { - event.card = cards[0]; - player - .chooseBool() - .set("createDialog", [ - get.prompt("guzheng", target), - '点击“确认”以令其收回此牌', - cards, - ]) - .set("choice", lib.skill.guzheng.checkx(trigger, player, cards, cards2)) - .set("ai", function () { - return _status.event.choice; - }) - .setHiddenSkill("guzheng"); - } else { - player - .chooseButton(2, [ - get.prompt("guzheng", target), - '被选择的牌将成为对方收回的牌', - cards, - [["获得剩余的牌", "放弃剩余的牌"], "tdnodes"], - ]) - .set("filterButton", function (button) { - var type = typeof button.link; - if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) - return false; - return type == "string" || _status.event.allowed.includes(button.link); - }) - .set("allowed", cards2) - .set("check", lib.skill.guzheng.checkx(trigger, player, cards, cards2)) - .set("ai", function (button) { - if (typeof button.link == "string") { - return button.link == "获得剩余的牌" ? 1 : 0; - } - if (_status.event.check) { - return 20 - get.value(button.link, _status.event.getTrigger().player); - } - return 0; - }) - .setHiddenSkill("guzheng"); - } - "step 1"; - if (result.bool) { - var target = trigger.player; - player.logSkill("guzheng", target); - if (!result.links || !result.links.length) { - target.gain(card, "gain2").giver = player; - } else { - if (typeof result.links[0] != "string") result.links.reverse(); - var card = result.links[1]; - target.gain(card, "gain2").giver = player; - if (result.links[0] != "获得剩余的牌") event.finish(); - } - } else event.finish(); - "step 2"; - //避免插入结算改变弃牌堆 重新判断一次 - var cards = []; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name == "cardsDiscard") { - if (evt.getParent("phaseDiscard") == trigger) { - var moves = evt.cards.filterInD("d"); - cards.addArray(moves); - } - } - if (evt.name == "lose") { - if ( - evt.type != "discard" || - evt.position != ui.discardPile || - evt.getParent("phaseDiscard") != trigger - ) - return; - var moves = evt.cards.filterInD("d"); - cards.addArray(moves); - } - }); - if (cards.length > 0) player.gain(cards, "gain2"); - }, - ai: { - threaten: 1.3, - expose: 0.2, - }, - }, - beige: { - audio: 2, - audioname: ["re_caiwenji", "ol_caiwenji"], - trigger: { global: "damageEnd" }, - filter(event, player) { - return ( - event.card && - event.card.name == "sha" && - event.source && - event.player.isIn() && - player.countCards("he") - ); - }, - direct: true, - checkx(event, player) { - var att1 = get.attitude(player, event.player); - var att2 = get.attitude(player, event.source); - return att1 > 0 && att2 <= 0; - }, - preHidden: true, - content() { - "step 0"; - var next = player.chooseToDiscard("he", get.prompt2("beige", trigger.player)); - var check = lib.skill.beige.checkx(trigger, player); - next.set("ai", function (card) { - if (_status.event.goon) return 8 - get.value(card); - return 0; - }); - next.set("logSkill", "beige"); - next.set("goon", check); - next.setHiddenSkill("beige"); - "step 1"; - if (result.bool) { - trigger.player.judge(); - } else { - event.finish(); - } - "step 2"; - switch (result.suit) { - case "heart": - trigger.player.recover(); - break; - case "diamond": - trigger.player.draw(2); - break; - case "club": - trigger.source.chooseToDiscard("he", 2, true); - break; - case "spade": - trigger.source.turnOver(); - break; - } - }, - ai: { - expose: 0.3, - }, - }, - duanchang: { - audio: 2, - audioname: ["re_caiwenji", "ol_caiwenji"], - forbid: ["boss"], - trigger: { player: "die" }, - forced: true, - forceDie: true, - skillAnimation: true, - animationColor: "gray", - filter(event) { - return event.source && event.source.isIn(); - }, - content() { - trigger.source.clearSkills(); - }, - logTarget: "source", - ai: { - maixie_defend: true, - threaten(player, target) { - if (target.hp == 1) return 0.2; - return 1.5; - }, - effect: { - target(card, player, target, current) { - if (!target.hasFriend()) return; - if (target.hp <= 1 && get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return 3; - return [1, 0, 0, -3 * get.threaten(player)]; - } - }, - }, - }, - }, - huashen: { - audio: "huashen2", - unique: true, - init(player) { - if (!player.storage.huashen) { - player.storage.huashen = { - owned: {}, - }; - } - player.when("dieBegin").then(() => { - const name = player.name ? player.name : player.name1; - if (name) { - const sex = get.character(name, 0); - const group = get.character(name, 1); - if (player.sex != sex) { - game.broadcastAll( - (player, sex) => { - player.sex = sex; - }, - player, - sex - ); - game.log(player, "将性别变为了", "#y" + get.translation(sex) + "性"); - } - if (player.group != group) player.changeGroup(group); - } - }); - }, - intro: { - content(storage, player) { - var str = ""; - var list = Object.keys(storage.owned); - if (list.length) { - str += get.translation(list[0]); - for (var i = 1; i < list.length; i++) { - str += "、" + get.translation(list[i]); - } - } - var skill = player.storage.huashen.current2; - if (skill) { - str += "

    当前技能:" + get.translation(skill); - } - return str; - }, - onunmark(storage, player) { - _status.characterlist.addArray(Object.keys(storage.owned)); - storage.owned = []; - }, - mark(dialog, content, player) { - var list = Object.keys(content.owned); - if (list.length) { - var skill = player.storage.huashen.current2; - var character = player.storage.huashen.current; - if (skill && character) { - dialog.addSmall([ - [character], - (item, type, position, noclick, node) => - lib.skill.rehuashen.$createButton( - item, - type, - position, - noclick, - node - ), - ]); - dialog.add( - '

    【' + - get.translation( - lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2) - ) + - "】
    " + - "
    " + - get.skillInfoTranslation(skill, player) + - "
    " - ); - } - if (player.isUnderControl(true)) { - dialog.addSmall([ - list, - (item, type, position, noclick, node) => - lib.skill.rehuashen.$createButton( - item, - type, - position, - noclick, - node - ), - ]); - } else { - dialog.addText("共有" + get.cnNumber(list.length) + "张“化身”"); - } - } else { - return "没有化身"; - } - }, - }, - addHuashen(player) { - if (!player.storage.huashen) return; - if (!_status.characterlist) { - lib.skill.pingjian.initList(); - } - _status.characterlist.randomSort(); - for (var i = 0; i < _status.characterlist.length; i++) { - let name = _status.characterlist[i]; - if ( - name.indexOf("zuoci") != -1 || - name.indexOf("key_") == 0 || - name.indexOf("sp_key_") == 0 || - lib.skill.rehuashen.banned.includes(name) || - player.storage.huashen.owned[name] - ) - continue; - let skills = lib.character[name][3].filter((skill) => { - const categories = get.skillCategoriesOf(skill); - return !categories.some((type) => lib.skill.rehuashen.bannedType.includes(type)); - }); - if (skills.length) { - player.storage.huashen.owned[name] = skills; - _status.characterlist.remove(name); - return name; - } - } - }, - addHuashens(player, num) { - var list = []; - for (var i = 0; i < num; i++) { - var name = lib.skill.huashen.addHuashen(player); - if (name) list.push(name); - } - if (list.length) { - player.syncStorage("huashen"); - player.markSkill("huashen"); - game.log(player, "获得了", get.cnNumber(list.length) + "张", "#g化身"); - lib.skill.rehuashen.drawCharacter(player, list); - } - }, - trigger: { - global: "phaseBefore", - player: ["enterGame", "phaseBegin", "phaseEnd"], - }, - filter(event, player, name) { - if (event.name != "phase") return true; - if (name == "phaseBefore") return game.phaseNumber == 0; - return !get.is.empty(player.storage.huashen.owned); - }, - direct: true, - content() { - "step 0"; - var name = event.triggername; - if (trigger.name != "phase" || (name == "phaseBefore" && game.phaseNumber == 0)) { - player.logSkill("huashen"); - lib.skill.huashen.addHuashens(player, 2); - event.logged = true; - } - var cards = []; - var skills = []; - for (var i in player.storage.huashen.owned) { - cards.push(i); - skills.addArray(player.storage.huashen.owned[i]); - } - var cond = event.triggername == "phaseBegin" ? "in" : "out"; - skills.randomSort(); - skills.sort(function (a, b) { - return get.skillRank(b, cond) - get.skillRank(a, cond); - }); - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - _status.imchoosing = false; - var skill = skills[0], - character; - for (var i in player.storage.huashen.owned) { - if (player.storage.huashen.owned[i].includes(skill)) { - character = i; - break; - } - } - event._result = { - bool: true, - skill: skill, - character: character, - }; - if (event.dialog) event.dialog.close(); - if (event.control) event.control.close(); - }; - var chooseButton = function (player, list, forced) { - var event = _status.event; - player = player || event.player; - if (!event._result) event._result = {}; - var prompt = forced ? "化身:选择获得一项技能" : get.prompt("huashen"); - var dialog = ui.create.dialog(prompt, [ - list, - (item, type, position, noclick, node) => - lib.skill.rehuashen.$createButton(item, type, position, noclick, node), - ]); - event.dialog = dialog; - event.forceMine = true; - event.button = null; - for (var i = 0; i < event.dialog.buttons.length; i++) { - event.dialog.buttons[i].classList.add("pointerdiv"); - event.dialog.buttons[i].classList.add("selectable"); - } - event.dialog.open(); - event.custom.replace.button = function (button) { - if (!event.dialog.contains(button.parentNode)) return; - if (event.control) event.control.style.opacity = 1; - if (button.classList.contains("selectedx")) { - event.button = null; - button.classList.remove("selectedx"); - if (event.control) { - event.control.replacex(["cancel2"]); - } - } else { - if (event.button) { - event.button.classList.remove("selectedx"); - } - button.classList.add("selectedx"); - event.button = button; - if (event.control && button.link) { - event.control.replacex(player.storage.huashen.owned[button.link]); - } - } - game.check(); - }; - event.custom.replace.window = function () { - if (event.button) { - event.button.classList.remove("selectedx"); - event.button = null; - } - event.control.replacex(["cancel2"]); - }; - - event.switchToAuto = function () { - var cards = []; - var skills = []; - for (var i in player.storage.huashen.owned) { - cards.push(i); - skills.addArray(player.storage.huashen.owned[i]); - } - var cond = event.triggername == "phaseBegin" ? "in" : "out"; - skills.randomSort(); - skills.sort(function (a, b) { - return get.skillRank(b, cond) - get.skillRank(a, cond); - }); - _status.imchoosing = false; - var skill = skills[0], - character; - for (var i in player.storage.huashen.owned) { - if (player.storage.huashen.owned[i].includes(skill)) { - character = i; - break; - } - } - event._result = { - bool: true, - skill: skill, - character: character, - }; - if (event.dialog) event.dialog.close(); - if (event.control) event.control.close(); - }; - var controls = []; - event.control = ui.create.control(); - event.control.replacex = function () { - var args = Array.from(arguments)[0]; - if (args.includes("cancel2") && forced) { - args.remove("cancel2"); - this.style.opacity = ""; - } - args.push(function (link) { - var result = event._result; - if (link == "cancel2") result.bool = false; - else { - if (!event.button) return; - result.bool = true; - result.skill = link; - result.character = event.button.link; - } - event.dialog.close(); - event.control.close(); - game.resume(); - _status.imchoosing = false; - }); - return this.replace.apply(this, args); - }; - if (!forced) { - controls.push("cancel2"); - event.control.style.opacity = 1; - } - event.control.replacex(controls); - game.pause(); - game.countChoose(); - }; - if (event.isMine()) { - chooseButton(player, cards, event.logged); - } else if (event.isOnline()) { - event.player.send(chooseButton, event.player, cards, event.logged); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 1"; - var map = event.result || result; - if (map.bool) { - if (!event.logged) player.logSkill("huashen"); - var skill = map.skill, - character = map.character; - if (character != player.storage.huashen.current) { - const old = player.storage.huashen.current; - player.storage.huashen.current = character; - player.markSkill("huashen"); - game.broadcastAll( - function (player, character, old) { - player.tempname.remove(old); - player.tempname.add(character); - player.sex = lib.character[character][0]; - //player.group=lib.character[character][1]; - //player.node.name.dataset.nature=get.groupnature(player.group); - var mark = player.marks.huashen; - if (mark) { - mark.style.transition = "all 0.3s"; - setTimeout(function () { - mark.style.transition = "all 0s"; - ui.refresh(mark); - mark.setBackground(character, "character"); - if (mark.firstChild) { - mark.firstChild.remove(); - } - setTimeout(function () { - mark.style.transition = ""; - mark.show(); - }, 50); - }, 200); - } - }, - player, - character, - old - ); - game.log( - player, - "将性别变为了", - "#y" + get.translation(lib.character[character][0]) + "性" - ); - player.changeGroup(lib.character[character][1]); - } - player.storage.huashen.current2 = skill; - if ( - !player.additionalSkills.huashen || - !player.additionalSkills.huashen.includes(skill) - ) { - player.addAdditionalSkills("huashen", skill); - player.flashAvatar("huashen", character); - player.syncStorage("huashen"); - player.updateMarks("huashen"); - // lib.skill.rehuashen.createAudio(character,skill,'zuoci'); - } - } - }, - }, - huashen2: { audio: 2 }, - xinsheng: { - audio: 2, - unique: true, - trigger: { player: "damageEnd" }, - frequent: true, - content() { - "step 0"; - event.num = trigger.num; - "step 1"; - lib.skill.huashen.addHuashens(player, 1); - "step 2"; - if ( - --event.num > 0 && - player.hasSkill(event.name) && - !get.is.blocked(event.name, player) - ) { - player.chooseBool(get.prompt2("xinsheng")).set("frequentSkill", event.name); - } else event.finish(); - "step 3"; - if (result.bool && player.hasSkill("xinsheng")) { - player.logSkill("xinsheng"); - event.goto(1); - } - }, - ai: { - combo: "huashen" - }, - }, - huoshou: { - audio: "huoshou1", - audioname: ["re_menghuo"], - locked: true, - group: ["huoshou1", "huoshou2"], - preHidden: ["huoshou1", "huoshou2"], - ai: { - effect: { - target(card, player, target) { - if (card.name == "nanman") return 0; - }, - }, - }, - }, - huoshou1: { - audio: 2, - audioname: ["re_menghuo"], - trigger: { target: "useCardToBefore" }, - forced: true, - priority: 15, - filter(event, player) { - return event.card.name == "nanman"; - }, - content() { - trigger.cancel(); - }, - }, - huoshou2: { - audio: "huoshou1", - audioname: ["re_menghuo"], - trigger: { global: "useCard" }, - forced: true, - filter(event, player) { - return event.card && event.card.name == "nanman" && event.player != player; - }, - content() { - trigger.customArgs.default.customSource = player; - }, - }, - zaiqixx: { - audio: "zaiqi", - inherit: "zaiqi", - }, - zaiqi: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter(event, player) { - return !event.numFixed && player.hp < player.maxHp; - }, - check(event, player) { - if (player.getDamagedHp() < 2) { - return false; - } else if (player.getDamagedHp() == 2) { - return player.countCards("h") >= 2; - } - return true; - }, - content() { - "step 0"; - trigger.changeToZero(); - event.cards = get.cards(player.getDamagedHp() + (event.name == "zaiqi" ? 0 : 1)); - game.cardsGotoOrdering(event.cards); - player.showCards(event.cards); - "step 1"; - var num = 0; - for (var i = 0; i < event.cards.length; i++) { - if (get.suit(event.cards[i]) == "heart") { - num++; - event.cards.splice(i--, 1); - } - } - if (num) { - player.recover(num); - } - "step 2"; - if (event.cards.length) { - player.gain(event.cards, "gain2"); - } - }, - ai: { - threaten(player, target) { - if (target.hp == 1) return 2; - if (target.hp == 2) return 1.5; - return 1; - }, - }, - }, - juxiang: { - //unique:true, - locked: true, - audio: "juxiang1", - audioname: ["re_zhurong", "ol_zhurong"], - group: ["juxiang1", "juxiang2"], - preHidden: ["juxiang1", "juxiang2"], - ai: { - effect: { - target(card) { - if (card.name == "nanman") return [0, 1]; - }, - }, - }, - }, - juxiang1: { - audio: 2, - audioname: ["re_zhurong", "ol_zhurong"], - trigger: { target: "useCardToBefore" }, - forced: true, - priority: 15, - filter(event, player) { - return event.card.name == "nanman"; - }, - content() { - trigger.cancel(); - }, - }, - juxiang2: { - audio: "juxiang1", - audioname: ["re_zhurong", "ol_zhurong"], - trigger: { global: "useCardAfter" }, - forced: true, - filter(event, player) { - return event.card.name == "nanman" && event.player != player && event.cards.someInD(); - }, - content() { - player.gain(trigger.cards.filterInD(), "gain2"); - }, - }, - lieren: { - shaRelated: true, - audio: 2, - audioname: ["boss_lvbu3", "ol_zhurong"], - trigger: { source: "damageSource" }, - filter(event, player) { - if (event._notrigger.includes(event.player)) return false; - return ( - event.card && - event.card.name == "sha" && - event.getParent().name == "sha" && - event.player.isIn() && - player.canCompare(event.player) - ); - }, - check(event, player) { - return get.attitude(player, event.player) < 0 && player.countCards("h") > 1; - }, - //priority:5, - content() { - "step 0"; - player.chooseToCompare(trigger.player); - "step 1"; - if (result.bool && trigger.player.countGainableCards(player, "he")) { - player.gainPlayerCard(trigger.player, true, "he"); - } - }, - }, - xingshang: { - audio: 2, - trigger: { global: "die" }, - preHidden: true, - filter(event) { - return event.player.countCards("he") > 0; - }, - content() { - "step 0"; - event.togain = trigger.player.getCards("he"); - player.gain(event.togain, trigger.player, "giveAuto", "bySelf"); - }, - }, - fangzhu: { - audio: 2, - trigger: { player: "damageEnd" }, - direct: true, - preHidden: true, - content() { - "step 0"; - var draw = player.getDamagedHp(); - player - .chooseTarget( - get.prompt("fangzhu"), - "令一名其他角色翻面" + (draw > 0 ? "并摸" + get.cnNumber(draw) + "张牌" : ""), - function (card, player, target) { - return player != target; - } - ) - .setHiddenSkill("fangzhu") - .set("ai", (target) => { - if (target.hasSkillTag("noturn")) return 0; - var player = _status.event.player; - var current = _status.currentPhase; - var dis = current ? get.distance(current, target, "absolute") : 1; - var draw = player.getDamagedHp(); - var att = get.attitude(player, target); - if (att == 0) - return target.hasJudge("lebu") - ? Math.random() / 3 - : Math.sqrt(get.threaten(target)) / 5 + Math.random() / 2; - if (att > 0) { - if (target.isTurnedOver()) return att + draw; - if (draw < 4) return -1; - if (current && target.getSeatNum() > current.getSeatNum()) - return att + draw / 3; - return ( - (10 * Math.sqrt(Math.max(0.01, get.threaten(target)))) / (3.5 - draw) + - dis / (2 * game.countPlayer()) - ); - } else { - if (target.isTurnedOver()) return att - draw; - if (draw >= 5) return -1; - if (current && target.getSeatNum() <= current.getSeatNum()) - return -att + draw / 3; - return ( - (4.25 - draw) * 10 * Math.sqrt(Math.max(0.01, get.threaten(target))) + - (2 * game.countPlayer()) / dis - ); - } - }); - "step 1"; - if (result.bool) { - player.logSkill("fangzhu", result.targets); - var draw = player.getDamagedHp(); - if (draw > 0) result.targets[0].draw(draw); - result.targets[0].turnOver(); - } - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target(card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (target.hp <= 1) return; - if (!target.hasFriend()) return; - var hastarget = false; - var turnfriend = false; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (get.attitude(target, players[i]) < 0 && !players[i].isTurnedOver()) { - hastarget = true; - } - if (get.attitude(target, players[i]) > 0 && players[i].isTurnedOver()) { - hastarget = true; - turnfriend = true; - } - } - if (get.attitude(player, target) > 0 && !hastarget) return; - if (turnfriend || target.hp == target.maxHp) return [0.5, 1]; - if (target.hp > 1) return [1, 0.5]; - } - }, - }, - }, - }, - songwei: { - unique: true, - group: "songwei2", - audioname: ["re_caopi"], - audio: "songwei2", - zhuSkill: true, - }, - songwei2: { - audio: 2, - audioname: ["re_caopi"], - forceaudio: true, - trigger: { global: "judgeEnd" }, - filter(event, player) { - if (event.player == player || event.player.group != "wei") return false; - if (event.result.color != "black") return false; - return player.hasZhuSkill("songwei", event.player); - }, - direct: true, - content() { - "step 0"; - trigger.player - .chooseBool("是否发动【颂威】,令" + get.translation(player) + "摸一张牌?") - .set("choice", get.attitude(trigger.player, player) > 0); - "step 1"; - if (result.bool) { - player.logSkill("songwei2"); - trigger.player.line(player, "green"); - player.draw(); - } - }, - }, - jiezi: { - trigger: { global: ["phaseDrawSkipped", "phaseDrawCancelled"] }, - audio: 2, - forced: true, - filter(event, player) { - return event.player != player; - }, - content() { - player.draw(); - }, - }, - gzduanliang: { - audio: "duanliang1", - audioname: ["re_xuhuang"], - group: ["duanliang1", "duanliang2"], - ai: { - threaten: 1.2, - }, - }, - duanliang: { - audio: "duanliang1", - audioname: ["re_xuhuang"], - group: ["duanliang1", "duanliang3"], - ai: { - threaten: 1.2, - }, - }, - duanliang1: { - audio: 2, - audioname: ["re_xuhuang"], - enable: "chooseToUse", - filterCard(card) { - if (get.type(card) != "basic" && get.type(card) != "equip") return false; - return get.color(card) == "black"; - }, - filter(event, player) { - return player.countCards("hes", { type: ["basic", "equip"], color: "black" }); - }, - position: "hes", - viewAs: { name: "bingliang" }, - prompt: "将一黑色的基本牌或装备牌当兵粮寸断使用", - check(card) { - return 6 - get.value(card); - }, - ai: { - order: 9, - }, - }, - duanliang2: { - mod: { - targetInRange(card, player, target) { - if (card.name == "bingliang") { - if (get.distance(player, target) <= 2) return true; - } - }, - }, - }, - duanliang3: { - mod: { - targetInRange(card, player, target) { - if (card.name == "bingliang") { - if (target.countCards("h") >= player.countCards("h")) return true; - } - }, - }, - }, - haoshi: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - filter(event, player) { - return !event.numFixed; - }, - preHidden: true, - check(event, player) { - return ( - player.countCards("h") + 2 + event.num <= 5 || - game.hasPlayer(function (target) { - return ( - player !== target && - !game.hasPlayer(function (current) { - return ( - current !== player && - current !== target && - current.countCards("h") < target.countCards("h") - ); - }) && - get.attitude(player, target) > 0 - ); - }) - ); - }, - content() { - trigger.num += 2; - player.addSkill("haoshi2"); - }, - ai: { - threaten: 2, - noh: true, - skillTagFilter(player, tag) { - if (tag == "noh") { - if (player.countCards("h") != 2) return false; - } - }, - }, - }, - haoshi2: { - trigger: { player: "phaseDrawEnd" }, - forced: true, - popup: false, - audio: false, - content() { - "step 0"; - player.removeSkill("haoshi2"); - if (player.countCards("h") <= 5) { - event.finish(); - return; - } - player.chooseCardTarget({ - selectCard: Math.floor(player.countCards("h") / 2), - filterTarget(card, player, target) { - return target.isMinHandcard(); - }, - prompt: "将一半的手牌交给场上手牌数最少的一名角色", - forced: true, - ai2(target) { - return get.attitude(_status.event.player, target); - }, - }); - "step 1"; - if (result.targets && result.targets[0]) { - player.give(result.cards, result.targets[0]); - } - }, - }, - dimeng: { - audio: 2, - enable: "phaseUse", - usable: 1, - position: "he", - filterCard() { - var targets = ui.selected.targets; - if (targets.length == 2) { - if ( - Math.abs(targets[0].countCards("h") - targets[1].countCards("h")) <= - ui.selected.cards.length - ) - return false; - } - return true; - }, - selectCard: [0, Infinity], - selectTarget: 2, - complexCard: true, - filterTarget(card, player, target) { - if (player == target) return false; - return true; - }, - filterOk() { - var targets = ui.selected.targets; - if (targets.length != 2) return false; - return ( - Math.abs(targets[0].countCards("h") - targets[1].countCards("h")) == - ui.selected.cards.length - ); - }, - multitarget: true, - multiline: true, - content() { - targets[0].swapHandcards(targets[1]); - }, - check(card) { - var list = [], - player = _status.event.player; - var num = player.countCards("he"); - var count; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != player && get.attitude(player, players[i]) > 3) - list.push(players[i]); - } - list.sort(function (a, b) { - return a.countCards("h") - b.countCards("h"); - }); - if (list.length == 0) return -1; - var from = list[0]; - list.length = 0; - - for (var i = 0; i < players.length; i++) { - if (players[i] != player && get.attitude(player, players[i]) < 1) - list.push(players[i]); - } - if (list.length == 0) return -1; - list.sort(function (a, b) { - return b.countCards("h") - a.countCards("h"); - }); - if (from.countCards("h") >= list[0].countCards("h")) return -1; - for (var i = 0; i < list.length && from.countCards("h") < list[i].countCards("h"); i++) { - if (list[i].countCards("h") - from.countCards("h") <= num) { - count = list[i].countCards("h") - from.countCards("h"); - break; - } - } - if (count < 2 && from.countCards("h") >= 2) return -1; - if (ui.selected.cards.length < count) return 11 - get.value(card); - return -1; - }, - ai: { - order: 6, - threaten: 3, - expose: 0.9, - result: { - target(player, target) { - var list = []; - var num = player.countCards("he"); - var players = game.filterPlayer(); - if (ui.selected.targets.length == 0) { - for (var i = 0; i < players.length; i++) { - if (players[i] != player && get.attitude(player, players[i]) > 3) - list.push(players[i]); - } - list.sort(function (a, b) { - return a.countCards("h") - b.countCards("h"); - }); - if (target == list[0]) return get.attitude(player, target); - return -get.attitude(player, target); - } else { - var from = ui.selected.targets[0]; - for (var i = 0; i < players.length; i++) { - if (players[i] != player && get.attitude(player, players[i]) < 1) - list.push(players[i]); - } - list.sort(function (a, b) { - return b.countCards("h") - a.countCards("h"); - }); - if (from.countCards("h") >= list[0].countCards("h")) - return -get.attitude(player, target); - for ( - var i = 0; - i < list.length && from.countCards("h") < list[i].countCards("h"); - i++ - ) { - if (list[i].countCards("h") - from.countCards("h") <= num) { - var count = list[i].countCards("h") - from.countCards("h"); - if (count < 2 && from.countCards("h") >= 2) - return -get.attitude(player, target); - if (target == list[i]) return get.attitude(player, target); - return -get.attitude(player, target); - } - } - } - }, - }, - }, - }, - yinghun: { - audio: 2, - audioname: ["re_sunjian", "sunce", "re_sunben", "re_sunce", "ol_sunjian"], - audioname2: { - re_sunyi: "gzyinghun_re_sunyi", - tw_ol_sunjian: "yinghun_ol_sunjian", - }, - mod: { - aiOrder(player, card, num) { - if ( - num > 0 && - _status.event && - _status.event.type == "phase" && - get.tag(card, "recover") - ) { - if (player.needsToDiscard()) return num / 3; - return 0; - } - }, - }, - locked: false, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - preHidden: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("yinghun"), function (card, player, target) { - return player != target; - }) - .set("ai", function (target) { - var player = _status.event.player; - if (player.getDamagedHp() == 1 && target.countCards("he") == 0) { - return 0; - } - if (get.attitude(_status.event.player, target) > 0) { - return 10 + get.attitude(_status.event.player, target); - } - if (player.getDamagedHp() == 1) { - return -1; - } - return 1; - }) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - event.num = player.getDamagedHp(); - player.logSkill(event.name, result.targets); - event.target = result.targets[0]; - if (event.num == 1) { - event.directcontrol = true; - } else { - var str1 = "摸" + get.cnNumber(event.num, true) + "弃一"; - var str2 = "摸一弃" + get.cnNumber(event.num, true); - player - .chooseControl(str1, str2, function (event, player) { - if (player.isHealthy()) return 1 - _status.event.choice; - return _status.event.choice; - }) - .set("choice", get.attitude(player, event.target) > 0 ? 0 : 1); - event.str = str1; - } - } else { - event.finish(); - } - "step 2"; - if (event.directcontrol || result.control == event.str) { - if (event.num > 0) event.target.draw(event.num); - event.target.chooseToDiscard(true, "he"); - } else { - event.target.draw(); - if (event.num > 0) event.target.chooseToDiscard(event.num, true, "he"); - } - }, - ai: { - effect: { - target(card, player, target) { - if ( - get.tag(card, "damage") && - get.itemtype(player) === "player" && - target.hp > - (player.hasSkillTag("damageBonus", true, { - target: target, - card: card, - }) - ? 2 - : 1) - ) - return [1, 1]; - }, - }, - threaten(player, target) { - return Math.max(0.5, target.getDamagedHp() / 2); - }, - maixie: true, - }, - }, - gzyinghun: { - audio: "yinghun", - audioname: ["re_sunjian", "sunce", "re_sunben", "re_sunce", "ol_sunjian", "sb_sunce"], - audioname2: { - re_sunyi: "gzyinghun_re_sunyi", - tw_ol_sunjian: "yinghun_ol_sunjian", - }, - mod: { - aiOrder(player, card, num) { - if ( - num > 0 && - _status.event && - _status.event.type == "phase" && - get.tag(card, "recover") - ) { - if (player.needsToDiscard()) return num / 3; - return 0; - } - }, - }, - locked: false, - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - return player.getDamagedHp() > 0; - }, - direct: true, - preHidden: true, - content() { - "step 0"; - player - .chooseTarget(get.prompt2("gzyinghun"), function (card, player, target) { - return player != target; - }) - .set("ai", function (target) { - var player = _status.event.player; - if (player.getDamagedHp() == 1 && target.countCards("he") == 0) { - return 0; - } - if (get.attitude(_status.event.player, target) > 0) { - return 10 + get.attitude(_status.event.player, target); - } - if (player.getDamagedHp() == 1) { - return -1; - } - return 1; - }) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - event.num = player.getDamagedHp(); - player.logSkill(event.name, result.targets); - event.target = result.targets[0]; - if (event.num == 1) { - event.directcontrol = true; - } else { - var str1 = "摸" + get.cnNumber(event.num, true) + "弃一"; - var str2 = "摸一弃" + get.cnNumber(event.num, true); - player - .chooseControl(str1, str2, function (event, player) { - return _status.event.choice; - }) - .set("choice", get.attitude(player, event.target) > 0 ? str1 : str2); - event.str = str1; - } - } else { - event.finish(); - } - "step 2"; - if (event.directcontrol || result.control == event.str) { - event.target.draw(event.num); - event.target.chooseToDiscard(true, "he"); - } else { - event.target.draw(); - event.target.chooseToDiscard(event.num, true, "he"); - } - }, - ai: { - effect: { - target(card, player, target) { - if ( - get.tag(card, "damage") && - get.itemtype(player) === "player" && - target.hp > - (player.hasSkillTag("damageBonus", true, { - target: target, - card: card, - }) - ? 2 - : 1) - ) - return [1, 1]; - }, - }, - threaten(player, target) { - return Math.max(0.5, target.getDamagedHp() / 2); - }, - maixie: true, - }, - }, - yinghun_ol_sunjian: { audio: 2 }, - jiuchi: { - audio: 2, - audioname: ["re_dongzhuo"], - enable: "chooseToUse", - filterCard(card) { - return get.suit(card) == "spade"; - }, - viewAs: { name: "jiu" }, - viewAsFilter(player) { - if (!player.countCards("hs", { suit: "spade" })) return false; - return true; - }, - prompt: "将一张黑桃手牌当酒使用", - check(card) { - if (_status.event.type == "dying") return 1 / Math.max(0.1, get.value(card)); - return 4 - get.value(card); - }, - ai: { - threaten: 1.5, - }, - }, - roulin: { - audio: 2, - audioname: ["re_dongzhuo", "ol_dongzhuo"], - trigger: { player: "useCardToPlayered", target: "useCardToTargeted" }, - forced: true, - filter(event, player) { - if (event.card.name != "sha") return false; - if (player == event.player) { - return event.target.hasSex("female"); - } - return event.player.hasSex("female"); - }, - check(event, player) { - return player == event.player; - }, - content() { - var id = (player == trigger.player ? trigger.target : player).playerid; - var map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].shanRequired == "number") { - map[id].shanRequired++; - } else { - map[id].shanRequired = 2; - } - }, - ai: { - halfneg: true, - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if (tag === "directHit_ai") return; - if ( - arg.card.name != "sha" || - !arg.target.hasSex("female") || - arg.target.countCards("h", "shan") > 1 - ) - return false; - }, - }, - }, - benghuai: { - audio: 2, - audioname: ["zhugedan", "re_dongzhuo", "ol_dongzhuo", "re_zhugedan"], - trigger: { player: "phaseJieshuBegin" }, - forced: true, - check() { - return false; - }, - filter(event, player) { - return ( - !player.isMinHp() && - !player.hasSkill("rejiuchi_air") && - !player.hasSkill("oljiuchi_air") - ); - }, - content() { - "step 0"; - player - .chooseControl("baonue_hp", "baonue_maxHp", function (event, player) { - if (player.hp == player.maxHp) return "baonue_hp"; - if (player.hp < player.maxHp - 1 || player.hp <= 2) return "baonue_maxHp"; - return "baonue_hp"; - }) - .set("prompt", "崩坏:失去1点体力或减1点体力上限"); - "step 1"; - if (result.control == "baonue_hp") { - player.loseHp(); - } else { - player.loseMaxHp(true); - } - }, - ai: { - threaten: 0.5, - neg: true, - }, - }, - baonue: { - unique: true, - group: "baonue2", - audioname: ["re_dongzhuo"], - audio: "baonue2", - zhuSkill: true, - }, - baonue2: { - audio: 2, - audioname: ["re_dongzhuo"], - //forceaudio:true, - trigger: { global: "damageSource" }, - filter(event, player) { - if (player == event.source || !event.source || event.source.group != "qun") return false; - return player.hasZhuSkill("baonue", event.source); - }, - direct: true, - content() { - "step 0"; - trigger.source - .chooseBool("是否对" + get.translation(player) + "发动【暴虐】?") - .set("choice", get.attitude(trigger.source, player) > 0); - "step 1"; - if (result.bool) { - player.logSkill("baonue"); - trigger.source.line(player, "green"); - trigger.source.judge(function (card) { - if (get.suit(card) == "spade") return 4; - return 0; - }).judge2 = function (result) { - return result.bool ? true : false; - }; - } else { - event.finish(); - } - "step 2"; - if (result.suit == "spade") { - player.recover(); - } - }, - }, - luanwu: { - audio: 2, - audioname: ["re_jiaxu"], - unique: true, - enable: "phaseUse", - limited: true, - skillAnimation: "epic", - animationColor: "thunder", - filterTarget(card, player, target) { - return target != player; - }, - selectTarget: -1, - multitarget: true, - multiline: true, - content() { - "step 0"; - player.awakenSkill("luanwu"); - event.current = player.next; - event.currented = []; - "step 1"; - event.currented.push(event.current); - event.current.addTempClass("target"); - event.current - .chooseToUse( - "乱武:使用一张杀或失去1点体力", - function (card) { - if (get.name(card) != "sha") return false; - return lib.filter.cardEnabled.apply(this, arguments); - }, - function (card, player, target) { - if (player == target) return false; - var dist = get.distance(player, target); - if (dist > 1) { - if ( - game.hasPlayer(function (current) { - return current != player && get.distance(player, current) < dist; - }) - ) { - return false; - } - } - return lib.filter.filterTarget.apply(this, arguments); - } - ) - .set("ai2", function () { - return get.effect_use.apply(this, arguments) + 0.01; - }) - .set("addCount", false); - "step 2"; - if (result.bool == false) event.current.loseHp(); - event.current = event.current.next; - if (event.current != player && !event.currented.includes(event.current)) { - game.delay(0.5); - event.goto(1); - } - }, - ai: { - order: 1, - result: { - player(player) { - if (lib.config.mode == "identity" && game.zhu.isZhu && player.identity == "fan") { - if (game.zhu.hp == 1 && game.zhu.countCards("h") <= 2) return 1; - } - var num = 0; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - var att = get.attitude(player, players[i]); - if (att > 0) att = 1; - if (att < 0) att = -1; - if (players[i] != player && players[i].hp <= 3) { - if (players[i].countCards("h") == 0) num += att / players[i].hp; - else if (players[i].countCards("h") == 1) num += att / 2 / players[i].hp; - else if (players[i].countCards("h") == 2) num += att / 4 / players[i].hp; - } - if (players[i].hp == 1) num += att * 1.5; - } - if (player.hp == 1) { - return -num; - } - if (player.hp == 2) { - return -game.players.length / 4 - num; - } - return -game.players.length / 3 - num; - }, - }, - }, - }, - wansha: { - locked: true, - audio: 2, - audioname: ["boss_lvbu3", "shen_simayi"], - global: "wansha2", - trigger: { global: "dying" }, - priority: 15, - forced: true, - preHidden: true, - filter(event, player, name) { - return _status.currentPhase == player && event.player != player; - }, - content() {}, - }, - wansha2: { - mod: { - cardSavable(card, player) { - if ( - card.name == "tao" && - _status.currentPhase && - _status.currentPhase.isIn() && - _status.currentPhase.hasSkill("wansha") && - _status.currentPhase != player - ) { - if (!player.isDying()) return false; - } - }, - cardEnabled(card, player) { - if ( - card.name == "tao" && - _status.currentPhase && - _status.currentPhase.isIn() && - _status.currentPhase.hasSkill("wansha") && - _status.currentPhase != player - ) { - if (!player.isDying()) return false; - } - }, - }, - }, - weimu: { - trigger: { global: "useCard1" }, - audio: 2, - forced: true, - firstDo: true, - filter(event, player, card) { - if (get.color(event.card) != "black") return false; - return ( - (event.card.name == "nanman" && player != event.player) || - (event.card.name == "wanjian" && player != event.player) || - (event.card.name == "taoyuan" && player.hp < player.maxHp) || - event.card.name == "wugu" - ); - }, - content() {}, - mod: { - targetEnabled(card) { - if ( - (get.type(card) == "trick" || get.type(card) == "delay") && - get.color(card) == "black" - ) - return false; - }, - }, - }, - huoji: { - audio: 2, - enable: "chooseToUse", - filterCard(card) { - return get.color(card) == "red"; - }, - viewAs: { name: "huogong" }, - viewAsFilter(player) { - if (!player.countCards("hs", { color: "red" })) return false; - }, - position: "hs", - prompt: "将一张红色牌当火攻使用", - check(card) { - var player = get.player(); - if (player.countCards("h") > player.hp) { - return 6 - get.value(card); - } - return 3 - get.value(card); - }, - ai: { - fireAttack: true, - }, - }, - bazhen: { - audio: 2, - audioname: ["re_sp_zhugeliang", "ol_sp_zhugeliang", "ol_pangtong"], - group: "bazhen_bagua", - locked: true, - }, - bazhen_bagua: { - audio: "bazhen", - audioname: ["re_sp_zhugeliang", "ol_sp_zhugeliang", "ol_pangtong"], - equipSkill: true, - noHidden: true, - inherit: "bagua_skill", - filter(event, player) { - if (!lib.skill.bagua_skill.filter(event, player)) return false; - if (!player.hasEmptySlot(2)) return false; - return true; - }, - ai: { - respondShan: true, - freeShan: true, - skillTagFilter(player, tag, arg) { - if (tag !== "respondShan" && tag !== "freeShan") return; - if (!player.hasEmptySlot(2) || player.hasSkillTag("unequip2")) return false; - if (!arg || !arg.player) return true; - if ( - arg.player.hasSkillTag("unequip", false, { - target: player, - }) - ) - return false; - return true; - }, - effect: { - target(card, player, target) { - if (player == target && get.subtype(card) == "equip2") { - if (get.equipValue(card) <= 7.5) return 0; - } - if (!target.hasEmptySlot(2)) return; - return lib.skill.bagua_skill.ai.effect.target.apply(this, arguments); - }, - }, - }, - }, - kanpo: { - mod: { - aiValue(player, card, num) { - if (get.name(card) != "wuxie" && get.color(card) != "black") return; - var cards = player.getCards("hs", function (card) { - return get.name(card) == "wuxie" || get.color(card) == "black"; - }); - cards.sort(function (a, b) { - return (get.name(b) == "wuxie" ? 1 : 2) - (get.name(a) == "wuxie" ? 1 : 2); - }); - var geti = function () { - if (cards.includes(card)) { - return cards.indexOf(card); - } - return cards.length; - }; - if (get.name(card) == "wuxie") - return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; - return Math.max(num, [6, 4, 3][Math.min(geti(), 2)]); - }, - aiUseful() { - return lib.skill.kanpo.mod.aiValue.apply(this, arguments); - }, - }, - locked: false, - audio: 2, - enable: "chooseToUse", - filterCard(card) { - return get.color(card) == "black"; - }, - viewAsFilter(player) { - return player.countCards("hs", { color: "black" }) > 0; - }, - viewAs: { name: "wuxie" }, - position: "hs", - prompt: "将一张黑色手牌当无懈可击使用", - check(card) { - var tri = _status.event.getTrigger(); - if (tri && tri.card && tri.card.name == "chiling") return -1; - return 8 - get.value(card); - }, - threaten: 1.2, - }, - niepan: { - audio: 2, - audioname: ["re_pangtong"], - unique: true, - enable: "chooseToUse", - mark: true, - limited: true, - skillAnimation: true, - animationColor: "fire", - init(player) { - player.storage.niepan = false; - }, - filter(event, player) { - if (player.storage.niepan) return false; - if (event.type == "dying") { - if (player != event.dying) return false; - return true; - } else if (event.parent.name == "phaseUse") { - return true; - } - return false; - }, - content() { - "step 0"; - player.awakenSkill("niepan"); - player.storage.niepan = true; - player.discard(player.getCards("hej")); - "step 1"; - player.link(false); - "step 2"; - player.turnOver(false); - "step 3"; - player.draw(3); - "step 4"; - if (player.hp < 3) { - player.recover(3 - player.hp); - } - }, - ai: { - order: 0.5, - skillTagFilter(player, tag, target) { - if (player != target || player.storage.niepan) return false; - }, - save: true, - result: { - player(player) { - if (player.hp <= 0) return 10; - if (player.hp <= 1 && player.countCards("he") <= 1) return 10; - return 0; - }, - }, - threaten(player, target) { - if (!target.storage.niepan) return 0.6; - }, - }, - intro: { - content: "limited", - }, - }, - oldniepan: { - audio: "niepan", - unique: true, - enable: "chooseToUse", - mark: true, - skillAnimation: true, - limited: true, - animationColor: "orange", - init(player) { - player.storage.oldniepan = false; - }, - filter(event, player) { - if (player.storage.oldniepan) return false; - if (event.type == "dying") { - if (player != event.dying) return false; - return true; - } - return false; - }, - content() { - "step 0"; - player.awakenSkill("oldniepan"); - player.storage.oldniepan = true; - player.discard(player.getCards("hej")); - "step 1"; - player.link(false); - "step 2"; - player.turnOver(false); - "step 3"; - player.draw(3); - "step 4"; - if (player.hp < 3) { - player.recover(3 - player.hp); - } - }, - ai: { - order: 1, - skillTagFilter(player, arg, target) { - if (player != target || player.storage.oldniepan) return false; - }, - save: true, - result: { - player(player) { - if (player.hp <= 0) return 10; - if (player.hp <= 2 && player.countCards("he") <= 1) return 10; - return 0; - }, - }, - threaten(player, target) { - if (!target.storage.oldniepan) return 0.6; - }, - }, - intro: { - content: "limited", - }, - }, - quhu: { - audio: 2, - audioname: ["re_xunyu", "ol_xunyu"], - enable: "phaseUse", - usable: 1, - filter(event, player) { - if (player.countCards("h") == 0) return false; - return game.hasPlayer(function (current) { - return current.hp > player.hp && player.canCompare(current); - }); - }, - filterTarget(card, player, target) { - return target.hp > player.hp && player.canCompare(target); - }, - content() { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - if ( - game.hasPlayer(function (player) { - return player != target && target.inRange(player); - }) - ) { - player - .chooseTarget(function (card, player, target) { - var source = _status.event.source; - return target != source && source.inRange(target); - }, true) - .set("ai", function (target) { - return get.damageEffect(target, _status.event.source, player); - }) - .set("source", target); - } else { - event.finish(); - } - } else { - player.damage(target); - event.finish(); - } - "step 2"; - if (result.bool && result.targets && result.targets.length) { - target.line(result.targets[0], "green"); - result.targets[0].damage(target); - } - }, - ai: { - order: 0.5, - result: { - target(player, target) { - var att = get.attitude(player, target); - var oc = target.countCards("h") == 1; - if (att > 0 && oc) return 0; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if ( - players[i] != target && - players[i] != player && - target.inRange(players[i]) - ) { - if (get.damageEffect(players[i], target, player) > 0) { - return att > 0 ? att / 2 : att - (oc ? 5 : 0); - } - } - } - return 0; - }, - player(player, target) { - if (target.hasSkillTag("jueqing", false, target)) return -10; - var mn = 1; - var hs = player.getCards("h"); - for (var i = 0; i < hs.length; i++) { - mn = Math.max(mn, get.number(hs[i])); - } - if (mn <= 11 && player.hp < 2) return -20; - var max = player.maxHp - hs.length; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (get.attitude(player, players[i]) > 2) { - max = Math.max( - Math.min(5, players[i].hp) - players[i].countCards("h"), - max - ); - } - } - switch (max) { - case 0: - return mn == 13 ? 0 : -20; - case 1: - return mn >= 12 ? 0 : -15; - case 2: - return 0; - case 3: - return 1; - default: - return max; - } - }, - }, - expose: 0.2, - }, - }, - jieming: { - audio: 2, - trigger: { player: "damageEnd" }, - direct: true, - content() { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - player - .chooseTarget(get.prompt2("jieming"), function (card, player, target) { - return true; //target.countCards('h') 2) { - return Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")); - } - return att / 3; - }); - "step 2"; - if (result.bool) { - player.logSkill("jieming", result.targets); - for (var i = 0; i < result.targets.length; i++) { - result.targets[i].drawTo(Math.min(5, result.targets[i].maxHp)); - } - if (event.count && player.hasSkill("jieming")) event.goto(1); - } - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target(card, player, target, current) { - if (get.tag(card, "damage") && target.hp > 1) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - var max = 0; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (get.attitude(target, players[i]) > 0) { - max = Math.max( - Math.min(5, players[i].hp) - players[i].countCards("h"), - max - ); - } - } - switch (max) { - case 0: - return 2; - case 1: - return 1.5; - case 2: - return [1, 2]; - default: - return [0, max]; - } - } - if ( - (card.name == "tao" || card.name == "caoyao") && - target.hp > 1 && - target.countCards("h") <= target.hp - ) - return [0, 0]; - }, - }, - }, - }, - qiangxix: { - inherit: "reqiangxi", - audioname: ["boss_lvbu3"], - audio: "qiangxi", - usable: 2, - filterTarget(card, player, target) { - if (player == target) return false; - if (target.hasSkill("reqiangxi_off")) return false; - return true; - }, - }, - qiangxi: { - audio: 2, - enable: "phaseUse", - usable: 1, - audioname: ["boss_lvbu3"], - filterCard(card) { - return get.subtype(card) == "equip1"; - }, - selectCard: [0, 1], - filterTarget(card, player, target) { - if (player == target) return false; - return player.inRange(target); - }, - content() { - "step 0"; - if (cards.length == 0) { - player.loseHp(); - } - "step 1"; - target.damage("nocard"); - }, - check(card) { - return 10 - get.value(card); - }, - position: "he", - ai: { - damage: true, - order: 8, - result: { - player(player, target) { - if (ui.selected.cards.length) return 0; - if (player.hp >= target.hp) return -0.9; - if (player.hp <= 2) return -10; - return -2; - }, - target(player, target) { - if (!ui.selected.cards.length) { - if (player.hp < 2) return 0; - if (player.hp == 2 && target.hp >= 2) return 0; - if (target.hp > player.hp) return 0; - } - return get.damageEffect(target, player); - }, - }, - threaten: 1.3, - }, - }, - xinqiangxi: { - audio: "qiangxi", - enable: "phaseUse", - filter(event, player) { - if (player.hasSkill("xinqiangxi2")) { - return !player.hasSkill("xinqiangxi3"); - } else if (player.hasSkill("xinqiangxi3")) { - return ( - !player.hasSkill("xinqiangxi2") && player.countCards("he", { type: "equip" }) > 0 - ); - } else { - return true; - } - }, - filterCard(card) { - var player = _status.event.player; - if (player.hasSkill("xinqiangxi2")) return false; - return get.type(card) == "equip"; - }, - selectCard() { - var player = _status.event.player; - if (player.hasSkill("xinqiangxi2")) return -1; - if (player.hasSkill("xinqiangxi3")) return [1, 1]; - return [0, 1]; - }, - filterTarget(card, player, target) { - if (player == target) return false; - return player.inRange(target); - }, - content() { - "step 0"; - if (cards.length == 0) { - player.loseHp(); - player.addTempSkill("xinqiangxi3"); - } else { - player.addTempSkill("xinqiangxi2"); - } - "step 1"; - target.damage("nocard"); - }, - check(card) { - return 10 - get.value(card); - }, - position: "he", - ai: { - order: 8.5, - result: { - target(player, target) { - if (!ui.selected.cards.length) { - if (player.hp < 2) return 0; - if (target.hp >= player.hp) return 0; - } - return get.damageEffect(target, player); - }, - }, - }, - threaten: 1.5, - }, - xinqiangxi2: {}, - xinqiangxi3: {}, - tianyi: { - audio: 2, - audioname: ["re_taishici"], - enable: "phaseUse", - usable: 1, - filterTarget(card, player, target) { - return player.canCompare(target); - }, - filter(event, player) { - return player.countCards("h") > 0; - }, - content() { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - player.addTempSkill("tianyi2"); - } else { - player.addTempSkill("tianyi3"); - } - }, - ai: { - order(name, player) { - var cards = player.getCards("h"); - if (player.countCards("h", "sha") == 0) { - return 1; - } - for (var i = 0; i < cards.length; i++) { - if ( - cards[i].name != "sha" && - get.number(cards[i]) > 11 && - get.value(cards[i]) < 7 - ) { - return 9; - } - } - return get.order({ name: "sha" }) - 1; - }, - result: { - player(player) { - if (player.countCards("h", "sha") > 0) return 0.6; - var num = player.countCards("h"); - if (num > player.hp) return 0; - if (num == 1) return -2; - if (num == 2) return -1; - return -0.7; - }, - target(player, target) { - var num = target.countCards("h"); - if (num == 1) return -1; - if (num == 2) return -0.7; - return -0.5; - }, - }, - threaten: 1.3, - }, - }, - tianyi2: { - mod: { - targetInRange(card, player, target, now) { - if (card.name == "sha") return true; - }, - selectTarget(card, player, range) { - if (card.name == "sha" && range[1] != -1) range[1]++; - }, - cardUsable(card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - charlotte: true, - }, - tianyi3: { - mod: { - cardEnabled(card) { - if (card.name == "sha") return false; - }, - }, - charlotte: true, - }, - shuangxiong: { - audio: 2, - audioname: ["re_yanwen"], - group: "shuangxiong1", - subSkill: { - re_yanwen1: { audio: true }, - re_yanwen2: { audio: true }, - }, - }, - shuangxiong1: { - audio: true, - trigger: { player: "phaseDrawBegin1" }, - check(event, player) { - if (player.countCards("h") > player.hp) return true; - if (player.countCards("h") > 3) return true; - return false; - }, - filter(event, player) { - return !event.numFixed; - }, - preHidden: true, - prompt2: () => "进行一次判定,本回合可以将一张与此牌颜色不同的手牌当作【决斗】使用", - content() { - player.judge().set("callback", lib.skill.shuangxiong1.callback); - trigger.changeToZero(); - }, - callback() { - player.gain(card, "gain2"); - player.addTempSkill("shuangxiong2"); - player.markAuto("shuangxiong2", [event.judgeResult.color]); - }, - }, - shuangxiong2: { - charlotte: true, - onremove: true, - audio: true, - audioname2: { - re_yanwen: "shuangxiong_re_yanwen2", - }, - enable: "chooseToUse", - viewAs: { name: "juedou" }, - position: "hs", - viewAsFilter(player) { - return player.hasCard((card) => lib.skill.shuangxiong2.filterCard(card, player), "hs"); - }, - filterCard(card, player) { - var color = get.color(card), - colors = player.getStorage("shuangxiong2"); - for (var i of colors) { - if (color != i) return true; - } - return false; - }, - prompt() { - var colors = _status.event.player.getStorage("shuangxiong2"); - var str = "将一张颜色"; - for (var i = 0; i < colors.length; i++) { - if (i > 0) str += "或"; - str += "不为"; - str += get.translation(colors[i]); - } - str += "的牌当做【决斗】使用"; - return str; - }, - check(card) { - var player = _status.event.player; - var raw = player.getUseValue(card, null, true); - var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card])); - return eff - raw; - }, - ai: { order: 7 }, - }, - luanji: { - audio: 2, - enable: "phaseUse", - position: "hs", - viewAs: { name: "wanjian" }, - filterCard(card, player) { - if (ui.selected.cards.length) { - return get.suit(card) == get.suit(ui.selected.cards[0]); - } - var cards = player.getCards("hs"); - for (var i = 0; i < cards.length; i++) { - if (card != cards[i]) { - if (get.suit(card) == get.suit(cards[i])) return true; - } - } - return false; - }, - selectCard: 2, - complexCard: true, - check(card) { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return player.canUse("wanjian", current); - }); - var num = 0; - for (var i = 0; i < targets.length; i++) { - var eff = get.sgn(get.effect(targets[i], { name: "wanjian" }, player, player)); - if (targets[i].hp == 1) { - eff *= 1.5; - } - num += eff; - } - if (!player.needsToDiscard(-1)) { - if (targets.length >= 7) { - if (num < 2) return 0; - } else if (targets.length >= 5) { - if (num < 1.5) return 0; - } - } - return 6 - get.value(card); - }, - ai: { - basic: { - order: 8.5, - }, - }, - }, - xueyi: { - trigger: { player: "phaseDiscardBefore" }, - audio: 2, - audioname: ["re_yuanshao"], - forced: true, - firstDo: true, - filter(event, player) { - return ( - player.hasZhuSkill("xueyi") && - game.hasPlayer(function (current) { - return current != player && current.group == "qun"; - }) && - player.countCards("h") > player.hp - ); - }, - content() {}, - mod: { - maxHandcard(player, num) { - if (player.hasZhuSkill("xueyi")) { - return ( - num + - game.countPlayer(function (current) { - if (player != current && current.group == "qun") return 2; - }) - ); - } - return num; - }, - }, - zhuSkill: true, - }, - mengjin: { - shaRelated: true, - audio: 2, - trigger: { player: "shaMiss" }, - //priority:-1, - filter(event) { - return event.target.countCards("he") > 0; - }, - check(event, player) { - return get.attitude(player, event.target) < 0; - }, - logTarget: "target", - content() { - player.discardPlayerCard("he", trigger.target, true); - }, - }, - jiewei: { - trigger: { player: "turnOverEnd" }, - //direct:true, - frequent: true, - audio: "xinjiewei", - content() { - "step 0"; - player.draw(); - player.chooseToUse(function (card) { - if (!lib.filter.cardEnabled(card, _status.event.player, _status.event)) { - return false; - } - var type = get.type(card, "trick"); - return type == "trick" || type == "equip"; - }, "是否使用一张锦囊牌或装备牌?"); - "step 1"; - if (result.bool) { - var type = get.type(result.card || result.cards[0]); - if ( - game.hasPlayer(function (current) { - if (type == "equip") { - return current.countCards("e"); - } else { - return current.countCards("j"); - } - }) - ) { - var next = player.chooseTarget( - "是否弃置场上的一张" + get.translation(type) + "牌?", - function (card, player, target) { - if (_status.event.type == "equip") { - return target.countCards("e") > 0; - } else { - return target.countCards("j") > 0; - } - } - ); - next.set("ai", function (target) { - if (type == "equip") { - return -get.attitude(player, target); - } else { - return get.attitude(player, target); - } - }); - next.set("type", type); - event.type = type; - } else { - event.finish(); - } - } else { - event.finish(); - } - "step 2"; - if (event.type && result.bool && result.targets && result.targets.length) { - player.line(result.targets, "green"); - if (event.type == "equip") { - player.discardPlayerCard(result.targets[0], "e", true); - } else { - player.discardPlayerCard(result.targets[0], "j", true); - } - } - }, - }, - releiji: { - audio: 2, - audioname: ["boss_qinglong"], - trigger: { player: ["useCard", "respond"] }, - filter(event, player) { - return event.card.name == "shan"; - }, - direct: true, - content() { - "step 0"; - player.chooseTarget(get.prompt2("releiji"), function (card, player, target) { - return target != player; - }).ai = function (target) { - if (target.hasSkill("hongyan")) return 0; - return get.damageEffect( - target, - _status.event.player, - _status.event.player, - "thunder" - ); - }; - "step 1"; - if (result.bool) { - player.logSkill("releiji", result.targets, "thunder"); - event.target = result.targets[0]; - event.target.judge(function (card) { - var suit = get.suit(card); - if (suit == "spade") return -4; - if (suit == "club") return -2; - return 0; - }).judge2 = function (result) { - return result.bool == false ? true : false; - }; - } else { - event.finish(); - } - "step 2"; - if (result.suit == "club") { - player.recover(); - event.target.damage("thunder"); - } else if (result.suit == "spade") { - event.target.damage(2, "thunder"); - } - }, - ai: { - useShan: true, - effect: { - target(card, player, target, current) { - if ( - get.tag(card, "respondShan") && - !player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: card, - }, - true - ) - ) { - let club = 0, - spade = 0; - if ( - game.hasPlayer(function (current) { - return ( - get.attitude(target, current) < 0 && - get.damageEffect(current, target, target, "thunder") > 0 - ); - }) - ) { - club = 2; - spade = 4; - } - if (!target.isHealthy()) club += 2; - if (!club && !spade) return 1; - if (card.name === "sha") { - if ( - !target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) - ) - return; - } else if (!target.mayHaveShan(player)) - return 1 - 0.1 * Math.min(5, target.countCards("hs")); - if (!target.hasSkillTag("rejudge")) return [1, (club + spade) / 4]; - let pos = player.hasSkillTag("viewHandcard", null, target, true) - ? "hes" - : "e", - better = club > spade ? "club" : "spade", - max = 0; - target.hasCard(function (cardx) { - if (get.suit(cardx) === better) { - max = 2; - return true; - } - if (spade && get.color(cardx) === "black") max = 1; - }, pos); - if (max === 2) return [1, Math.max(club, spade)]; - if (max === 1) return [1, Math.min(club, spade)]; - if (pos === "e") - return [ - 1, - Math.min( - (Math.max(1, target.countCards("hs")) * (club + spade)) / 4, - Math.max(club, spade) - ), - ]; - return [1, (club + spade) / 4]; - } - }, - }, - }, - }, - shensu: { - audio: "shensu1", - audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], - group: ["shensu1", "shensu2"], - preHidden: ["shensu1", "shensu2"], - }, - xinshensu: { - audio: "shensu1", - audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], - audioname2: { - dc_xiahouba: "shensu1_xiahouba", - }, - group: ["shensu1", "shensu2", "shensu4"], - }, - shensu1_xiahouba: { audio: 2 }, - shensu1: { - audio: 2, - audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], - audioname2: { - dc_xiahouba: "shensu1_xiahouba", - }, - trigger: { player: "phaseJudgeBefore" }, - direct: true, - content() { - "step 0"; - player - .chooseTarget( - get.prompt("shensu"), - "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", - function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - } - ) - .set("check", player.countCards("h") > 2) - .set("ai", function (target) { - if (!_status.event.check) return 0; - return get.effect(target, { name: "sha" }, _status.event.player); - }) - .setHiddenSkill("shensu1"); - "step 1"; - if (result.bool) { - player.logSkill("shensu1", result.targets); - player.useCard({ name: "sha", isCard: true }, result.targets[0], false); - trigger.cancel(); - player.skip("phaseDraw"); - } - }, - }, - shensu2: { - audio: "shensu1", - audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], - audioname2: { - dc_xiahouba: "shensu1_xiahouba", - }, - trigger: { player: "phaseUseBefore" }, - direct: true, - filter(event, player) { - return ( - player.countCards("he", function (card) { - if (_status.connectMode) return true; - return get.type(card) == "equip"; - }) > 0 - ); - }, - content() { - "step 0"; - player - .chooseCardTarget({ - prompt: get.prompt("shensu"), - prompt2: "弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", - filterCard(card, player) { - return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); - }, - position: "he", - filterTarget(card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - }, - ai1(card) { - if (_status.event.check) return 0; - return 6 - get.value(card); - }, - ai2(target) { - if (_status.event.check) return 0; - return get.effect(target, { name: "sha" }, _status.event.player); - }, - check: - player.countCards("hs", (i) => { - return player.hasValueTarget(i, null, true); - }) > - player.hp - 1, - }) - .setHiddenSkill("shensu2"); - "step 1"; - if (result.bool) { - player.logSkill("shensu2", result.targets); - player.discard(result.cards[0]); - player.useCard({ name: "sha", isCard: true }, result.targets[0], false); - trigger.cancel(); - } - }, - }, - shensu4: { - audio: "shensu1", - audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], - audioname2: { - dc_xiahouba: "shensu1_xiahouba", - }, - trigger: { player: "phaseDiscardBefore" }, - direct: true, - content() { - "step 0"; - var check = - player.needsToDiscard() || - player.isTurnedOver() || - (player.hasSkill("shebian") && player.canMoveCard(true, true)); - player - .chooseTarget( - get.prompt("shensu"), - "跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】", - function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - } - ) - .set("check", check) - .set("ai", function (target) { - if (!_status.event.check) return 0; - return get.effect( - target, - { name: "sha" }, - _status.event.player, - _status.event.player - ); - }); - "step 1"; - if (result.bool) { - player.logSkill("shensu4", result.targets); - player.turnOver(); - player.useCard({ name: "sha", isCard: true }, result.targets[0], false); - trigger.cancel(); - } - }, - }, - jushou: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - check(event, player) { - return event.player.hp + player.countCards("h") < 4; - }, - content() { - player.draw(3); - player.turnOver(); - }, - ai: { - effect: { - target(card, player, target) { - if (card.name == "guiyoujie") return [0, 1]; - }, - }, - }, - }, - moon_jushou: { - audio: "xinjushou", - trigger: { player: "phaseJieshuBegin" }, - check(event, player) { - return event.player.hp + player.countCards("h") < 4; - }, - content() { - player.draw(); - player.turnOver(); - }, - ai: { - effect: { - target(card, player, target) { - if (card.name == "guiyoujie") return [0, 1]; - }, - }, - }, - }, - liegong: { - shaRelated: true, - audio: 2, - audioname: ["re_huangzhong"], - trigger: { player: "useCardToPlayered" }, - check(event, player) { - return get.attitude(player, event.target) <= 0; - }, - logTarget: "target", - filter(event, player) { - if (event.card.name != "sha") return false; - var length = event.target.countCards("h"); - return length >= player.hp || length <= player.getAttackRange(); - }, - preHidden: true, - content() { - trigger.getParent().directHit.push(trigger.target); - }, - locked: false, - mod: { - attackRange(player, distance) { - if (get.zhu(player, "shouyue")) return distance + 1; - }, - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if (get.attitude(player, arg.target) > 0 || arg.card.name != "sha") return false; - var length = arg.target.countCards("h"); - return length >= player.hp || length <= player.getAttackRange(); - }, - }, - }, - kuanggu: { - audio: 2, - audioname: ["re_weiyan", "ol_weiyan"], - trigger: { source: "damageSource" }, - forced: true, - filter(event, player) { - return event.kuangguCheck && player.isDamaged(); - }, - content() { - player.recover(trigger.num); - }, - group: "kuanggu_check", - subSkill: { - check: { - charlotte: true, - trigger: { source: "damage" }, - filter(event, player) { - return get.distance(player, event.player) <= 1; - }, - firstDo: true, - silent: true, - content() { - trigger.kuangguCheck = true; - }, - }, - }, - }, - tianxiang: { - audio: 2, - audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"], - trigger: { player: "damageBegin3" }, - direct: true, - filter(event, player) { - return player.countCards("h", { suit: "heart" }) > 0 && event.num > 0; - }, - content() { - "step 0"; - player.chooseCardTarget({ - filterCard(card, player) { - return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); - }, - filterTarget(card, player, target) { - return player != target; - }, - ai1(card) { - return 10 - get.value(card); - }, - ai2(target) { - var att = get.attitude(_status.event.player, target); - var trigger = _status.event.getTrigger(); - var da = 0; - if (_status.event.player.hp == 1) { - da = 10; - } - if (trigger.num > 1) { - if (target.maxHp > 5 && target.hp > 1) return -att / 10 + da; - return -att + da; - } - var eff = get.damageEffect(target, trigger.source, target, trigger.nature); - if (att == 0) return 0.1 + da; - if (eff >= 0 && trigger.num == 1) { - return att + da; - } - if (target.hp == target.maxHp) return -att + da; - if (target.hp == 1) { - if (target.maxHp <= 4 && !target.hasSkillTag("maixie")) { - if (target.maxHp <= 3) { - return -att + da; - } - return -att / 2 + da; - } - return da; - } - if (target.hp == target.maxHp - 1) { - if (target.hp > 2 || target.hasSkillTag("maixie")) return att / 5 + da; - if (att > 0) return 0.02 + da; - return 0.05 + da; - } - return att / 2 + da; - }, - prompt: get.prompt2("tianxiang"), - }); - "step 1"; - if (result.bool) { - player.logSkill(event.name, result.targets); - trigger.player = result.targets[0]; - trigger.player.addSkill("tianxiang2"); - player.discard(result.cards[0]); - } - }, - ai: { - maixie_defend: true, - effect: { - target(card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return; - if (get.tag(card, "damage") && target.countCards("h") > 1) return 0.7; - }, - }, - threaten(player, target) { - if (target.countCards("h") == 0) return 2; - }, - }, - }, - tianxiang2: { - trigger: { player: ["damageAfter", "damageCancelled", "damageZero"] }, - forced: true, - popup: false, - audio: false, - vanish: true, - charlotte: true, - content() { - if (player.getDamagedHp()) player.draw(player.getDamagedHp()); - player.removeSkill("tianxiang2"); - player.popup("tianxiang"); - }, - }, - retianxiang: { - audio: "tianxiang", - audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"], - trigger: { player: "damageBegin4" }, - direct: true, - preHidden: true, - filter(event, player) { - return ( - player.countCards("h", function (card) { - return _status.connectMode || get.suit(card, player) == "heart"; - }) > 0 && event.num > 0 - ); - }, - content() { - "step 0"; - player - .chooseCardTarget({ - filterCard(card, player) { - return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); - }, - filterTarget(card, player, target) { - return player != target; - }, - ai1(card) { - return 10 - get.value(card); - }, - ai2(target) { - var att = get.attitude(_status.event.player, target); - var trigger = _status.event.getTrigger(); - var da = 0; - if (_status.event.player.hp == 1) { - da = 10; - } - var eff = get.damageEffect(target, trigger.source, target); - if (att == 0) return 0.1 + da; - if (eff >= 0 && att > 0) { - return att + da; - } - if (att > 0 && target.hp > 1) { - if (target.maxHp - target.hp >= 3) return att * 1.1 + da; - if (target.maxHp - target.hp >= 2) return att * 0.9 + da; - } - return -att + da; - }, - prompt: get.prompt("retianxiang"), - prompt2: lib.translate.retianxiang_info, - }) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - player.discard(result.cards); - var target = result.targets[0]; - player - .chooseControlList( - true, - function (event, player) { - var target = _status.event.target; - var att = get.attitude(player, target); - if (target.hasSkillTag("maihp")) att = -att; - if (att > 0) { - return 0; - } else { - return 1; - } - }, - [ - "令" + - get.translation(target) + - "受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)", - "令" + - get.translation(target) + - "失去1点体力,然后获得" + - get.translation(result.cards), - ] - ) - .set("target", target); - player.logSkill(event.name, target); - trigger.cancel(); - event.target = target; - event.card = result.cards[0]; - } else { - event.finish(); - } - "step 2"; - if (typeof result.index == "number") { - event.index = result.index; - if (result.index) { - event.related = event.target.loseHp(); - } else { - event.related = event.target.damage(trigger.source || "nosource", "nocard"); - } - } else event.finish(); - "step 3"; - //if(event.related.cancelled||target.isDead()) return; - if (event.index && card.isInPile()) target.gain(card, "gain2"); - else if (target.getDamagedHp()) target.draw(Math.min(5, target.getDamagedHp())); - }, - ai: { - maixie_defend: true, - effect: { - target(card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return; - if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; - }, - }, - }, - }, - retianxiang3: { - trigger: { player: "loseHpAfter" }, - forced: true, - popup: false, - filter(event) { - return event.type == "retianxiang"; - }, - vanish: true, - content() { - "step 0"; - player.gain(player.storage.retianxiang3, "gain2"); - "step 1"; - player.removeSkill("retianxiang3"); - }, - onremove(player) { - var card = player.storage.retianxiang3; - if (get.position(card) == "s") { - game.cardsDiscard(card); - } - delete player.storage.retianxiang3; - }, - }, - retianxiang2: { - trigger: { player: "damageAfter" }, - forced: true, - popup: false, - filter(event) { - return event.type == "retianxiang"; - }, - vanish: true, - content() { - if (player.isDamaged()) { - player.draw(player.getDamagedHp()); - } - player.removeSkill("retianxiang2"); - }, - }, - xintianxiang: { - audio: "tianxiang", - trigger: { player: "damageBefore" }, - direct: true, - filter(event, player) { - return ( - player.countCards("he", { suit: "heart" }) > 0 && - event.num > 0 && - !player.hasSkill("xintianxiang3") - ); - }, - content() { - "step 0"; - player.chooseCardTarget({ - filterCard(card, player) { - return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); - }, - filterTarget(card, player, target) { - return player != target; - }, - position: "he", - ai1(card) { - return 10 - get.value(card); - }, - ai2(target) { - var att = get.attitude(_status.event.player, target); - var trigger = _status.event.getTrigger(); - var da = 0; - if (_status.event.player.hp == 1) { - da = 10; - } - if (trigger.num > 1) { - if (target.maxHp > 5 && target.hp > 1) return -att / 10 + da; - return -att + da; - } - var eff = get.damageEffect(target, trigger.source, target, trigger.nature); - if (att == 0) return 0.1 + da; - if (eff >= 0 && trigger.num == 1) { - return att + da; - } - if (target.hp == target.maxHp) return -att + da; - if (target.hp == 1) { - if (target.maxHp <= 4 && !target.hasSkillTag("maixie")) { - if (target.maxHp <= 3) { - return -att + da; - } - return -att / 2 + da; - } - return da; - } - if (target.hp == target.maxHp - 1) { - if (target.hp > 2 || target.hasSkillTag("maixie")) return att / 5 + da; - if (att > 0) return 0.02 + da; - return 0.05 + da; - } - return att / 2 + da; - }, - prompt: get.prompt2("xintianxiang"), - }); - "step 1"; - if (result.bool) { - player.logSkill(event.name, result.targets); - trigger.player = result.targets[0]; - trigger.player.addSkill("xintianxiang2"); - trigger.player.storage.xintianxiang = player; - player.discard(result.cards[0]); - } else { - event.finish(); - } - }, - ai: { - maixie_defend: true, - effect: { - target(card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return; - if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; - }, - }, - }, - }, - xintianxiang2: { - trigger: { player: ["damageAfter", "damageCancelled", "damageZero"] }, - forced: true, - popup: false, - audio: false, - vanish: true, - content() { - "step 0"; - var source = player.storage.xintianxiang; - if (source.isDead()) { - event.finish(); - return; - } - var num = player.maxHp - player.hp || 0; - var str1 = "令" + get.translation(player) + "摸" + get.cnNumber(num) + "张牌"; - var str2 = - "令" + - get.translation(player) + - "防止造成和受到的所有伤害且天香失效直到你下一回合开始"; - var att = get.attitude(source, player); - var choice = "选项一"; - if (att < 0) { - if (num >= 2) { - choice = "选项二"; - } - } else if (att > 0) { - if (num < 2 && !player.hasSkillTag("maixie")) { - choice = "选项二"; - } - } - source - .chooseControl(function () { - return _status.event.choice; - }) - .set("choiceList", [str1, str2]) - .set("choice", choice); - "step 1"; - if (result.control == "选项一") { - if (player.isDamaged()) { - player.draw(player.maxHp - player.hp); - } - } else { - player.storage.xintianxiang.addSkill("xintianxiang3"); - player.storage.xintianxiang.storage.xintianxiang3 = player; - player.addSkill("xintianxiang4"); - } - player.removeSkill("xintianxiang2"); - delete player.storage.xintianxiang; - }, - }, - xintianxiang3: { - trigger: { player: ["phaseZhunbeiBegin", "dieBegin"] }, - silent: true, - content() { - if (player.storage.xintianxiang3) { - player.storage.xintianxiang3.removeSkill("xintianxiang4"); - delete player.storage.xintianxiang3; - } - player.removeSkill("xintianxiang3"); - }, - }, - xintianxiang4: { - trigger: { source: "damageBefore", player: "damageBefore" }, - forced: true, - mark: true, - intro: { - content: "防止造成和受到的一切伤害", - }, - priority: 15, - content() { - trigger.cancel(); - }, - ai: { - nofire: true, - nothunder: true, - nodamage: true, - notrick: true, - notricksource: true, - effect: { - target(card, player, target, current) { - if (get.tag(card, "damage")) { - return "zeroplayertarget"; - } - }, - player(card, player, target, current) { - if (get.tag(card, "damage")) { - return "zeroplayertarget"; - } - }, - }, - }, - }, - hongyan: { - mod: { - suit(card, suit) { - if (suit == "spade") return "heart"; - }, - }, - }, - xinhongyan: { - audio: 2, - audioname: ["sb_xiaoqiao"], - mod: { - suit(card, suit) { - if (suit == "spade") return "heart"; - }, - }, - trigger: { global: "judge" }, - direct: true, - filter(event, player) { - if (event.fixedResult && event.fixedResult.suit) return event.fixedResult.suit == "heart"; - return get.suit(event.player.judging[0], event.player) == "heart"; - }, - content() { - "step 0"; - var str = - "红颜:" + - get.translation(trigger.player) + - "的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - ",请将其改为一种花色"; - player - .chooseControl("spade", "heart", "diamond", "club") - .set("prompt", str) - .set("ai", function () { - var judging = _status.event.judging; - var trigger = _status.event.getTrigger(); - var res1 = trigger.judge(judging); - var list = lib.suit.slice(0); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0) return 0; - var getj = function (suit) { - return trigger.judge({ - name: get.name(judging), - nature: get.nature(judging), - suit: suit, - number: get.number(judging), - }); - }; - list.sort(function (a, b) { - return (getj(b) - getj(a)) * get.sgn(attitude); - }); - return list[0]; - }) - .set("judging", trigger.player.judging[0]); - "step 1"; - if (result.control != "cancel2") { - player.addExpose(0.25); - player.popup(result.control); - game.log(player, "将判定结果改为了", "#y" + get.translation(result.control + 2)); - if (!trigger.fixedResult) trigger.fixedResult = {}; - trigger.fixedResult.suit = result.control; - trigger.fixedResult.color = get.color({ suit: result.control }); - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 0.4, - }, - expose: 0.5, - }, - }, - gzbuqu: { - audio: 2, - trigger: { player: "changeHp" }, - filter(event, player) { - return player.hp <= 0 && event.num < 0; - }, - marktext: "创", - intro: { - markcount: "expansion", - content: "expansion", - }, - group: "gzbuqu_recover", - frequent: true, - ondisable: true, - onremove(player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) { - //delete player.nodying; - player.loseToDiscardpile(cards); - if (player.hp <= 0) player.dying({}); - } - }, - process(player) { - //delete player.nodying; - var nums = []; - var cards = player.getExpansions("gzbuqu"); - for (var i = 0; i < cards.length; i++) { - if (nums.includes(get.number(cards[i]))) { - return false; - } else { - nums.push(get.number(cards[i])); - } - } - return true; - //player.nodying=true; - }, - subSkill: { - recover: { - trigger: { player: "recoverAfter" }, - filter(event, player) { - return player.getExpansions("gzbuqu").length > 0 && event.num > 0; - }, - forced: true, - popup: false, - content() { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - var cards = player.getExpansions("gzbuqu"), - count = cards.length; - if (count > 0 && player.hp + count > 1) { - if (count == 1) event._result = { links: cards }; - else - player - .chooseCardButton("不屈:移去一张“创”", true, cards) - .set("ai", function (button) { - var buttons = get.selectableButtons(); - for (var i = 0; i < buttons.length; i++) { - if ( - buttons[i] != button && - get.number(buttons[i].link) == get.number(button.link) && - !ui.selected.buttons.includes(buttons[i]) - ) { - return 1; - } - } - return 0; - }); - } else event.finish(); - "step 2"; - var cards = result.links; - player.loseToDiscardpile(cards); - if (event.count) event.goto(1); - "step 3"; - if (lib.skill.gzbuqu.process(player)) { - if (player.isDying()) { - var evt = event, - histories = [evt]; - while (true) { - evt = event.getParent("dying"); - if (!evt || evt.name != "dying" || histories.includes(evt)) break; - histories.push(evt); - if (evt.player == player) evt.nodying = true; - } - } - } - }, - }, - }, - content() { - "step 0"; - var num = -trigger.num - Math.max(player.hp - trigger.num, 1) + 1; - player.addToExpansion(get.cards(num), "gain2").gaintag.add("gzbuqu"); - "step 1"; - player.showCards(get.translation(player) + "的不屈牌", player.getExpansions("gzbuqu")); - "step 2"; - if (lib.skill.gzbuqu.process(player)) { - var evt = trigger.getParent(); - if (evt.name == "damage" || evt.name == "loseHp") evt.nodying = true; - } - }, - ai: { - mingzhi: true, - }, - }, - buqu: { - audio: 2, - audioname: ["key_yuri"], - trigger: { player: "chooseToUseBefore" }, - forced: true, - preHidden: true, - filter(event, player) { - return ( - event.type == "dying" && - player.isDying() && - event.dying == player && - !event.getParent()._buqu - ); - }, - content() { - "step 0"; - trigger.getParent()._buqu = true; - var card = get.cards()[0]; - event.card = card; - player.addToExpansion(card, "gain2").gaintag.add("buqu"); - "step 1"; - var cards = player.getExpansions("buqu"), - num = get.number(card); - player.showCards(cards, "不屈"); - for (var i = 0; i < cards.length; i++) { - if (cards[i] != card && get.number(cards[i]) == num) { - player.loseToDiscardpile(card); - return; - } - } - trigger.cancel(); - trigger.result = { bool: true }; - if (player.hp <= 0) { - player.recover(1 - player.hp); - } - }, - mod: { - maxHandcardBase(player, num) { - if (get.mode() != "guozhan" && player.getExpansions("buqu").length) - return player.getExpansions("buqu").length; - }, - }, - ai: { - save: true, - mingzhi: true, - skillTagFilter(player, tag, target) { - if (player != target) return false; - }, - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - }, - fenji: { - audio: 2, - trigger: { - global: ["gainAfter", "loseAfter", "loseAsyncAfter"], - }, - direct: true, - filter(event, player) { - if (event.name == "lose") { - if (event.type != "discard" || !event.player.isIn()) return false; - if ((event.discarder || event.getParent(2).player) == event.player) return false; - if (!event.getl(event.player).hs.length) return false; - return true; - } else if (event.name == "gain") { - if (event.giver || event.getParent().name == "gift") return false; - var cards = event.getg(event.player); - if (!cards.length) return false; - return game.hasPlayer(function (current) { - if (current == event.player) return false; - var hs = event.getl(current).hs; - for (var i of hs) { - if (cards.includes(i)) return true; - } - return false; - }); - } else if (event.type == "gain") { - if (event.giver || !event.player || !event.player.isIn()) return false; - var hs = event.getl(event.player); - return game.hasPlayer(function (current) { - if (current == event.player) return false; - var cards = event.getg(current); - for (var i of cards) { - if (hs.includes(i)) return true; - } - }); - } else if (event.type == "discard") { - if (!event.discarder) return false; - return game.hasPlayer(function (current) { - return current != event.discarder && event.getl(current).hs.length > 0; - }); - } - return false; - }, - content() { - "step 0"; - var targets = []; - if (trigger.name == "gain") { - var cards = trigger.getg(trigger.player); - targets.addArray( - game.filterPlayer(function (current) { - if (current == trigger.player) return false; - var hs = trigger.getl(current).hs; - for (var i of hs) { - if (cards.includes(i)) return true; - } - return false; - }) - ); - } else if (trigger.name == "loseAsync" && trigger.type == "discard") { - targets.addArray( - game.filterPlayer(function (current) { - return current != trigger.discarder && trigger.getl(current).hs.length > 0; - }) - ); - } else targets.push(trigger.player); - event.targets = targets.sortBySeat(); - if (!event.targets.length) event.finish(); - "step 1"; - var target = targets.shift(); - event.target = target; - if (target.isIn()) - player - .chooseBool(get.prompt("fenji", target), "失去1点体力,令该角色摸两张牌") - .set("ai", function () { - var evt = _status.event.getParent(); - return get.attitude(evt.player, evt.target) > 4; - }); - else { - if (targets.length > 0) event.goto(1); - else event.finish(); - } - "step 2"; - if (result.bool) { - player.logSkill("fenji", target); - player.loseHp(); - } else { - if (targets.length > 0) event.goto(1); - else event.finish(); - } - "step 3"; - target.draw(2); - if (targets.length > 0) event.goto(1); - }, - }, - new_fenji: { - audio: "fenji", - trigger: { - global: "phaseJieshuBegin", - }, - filter(event, player) { - if (event.player.countCards("h") == 0 && event.player.isIn()) return true; - return false; - }, - preHidden: true, - check(event, player) { - return get.attitude(player, event.player) > 2; - }, - content() { - player.line(trigger.player, "green"); - trigger.player.draw(2); - player.loseHp(); - }, - }, - leiji: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - filter(event, player) { - return event.card.name == "shan"; - }, - direct: true, - preHidden: true, - content() { - "step 0"; - player.chooseTarget(get.prompt2("leiji")).setHiddenSkill(event.name).ai = function ( - target - ) { - if (target.hasSkill("hongyan")) return 0; - return get.damageEffect( - target, - _status.event.player, - _status.event.player, - "thunder" - ); - }; - "step 1"; - if (result.bool) { - player.logSkill("leiji", result.targets, "thunder"); - event.target = result.targets[0]; - event.target.judge(function (card) { - if (get.suit(card) == "spade") return -4; - return 0; - }).judge2 = function (result) { - return result.bool == false ? true : false; - }; - } else { - event.finish(); - } - "step 2"; - if (result.bool == false) { - event.target.damage(2, "thunder"); - } - }, - ai: { - mingzhi: false, - useShan: true, - effect: { - target(card, player, target, current) { - if ( - get.tag(card, "respondShan") && - !player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: card, - }, - true - ) && - game.hasPlayer(function (current) { - return ( - get.attitude(target, current) < 0 && - get.damageEffect(current, target, target, "thunder") > 0 - ); - }) - ) { - if (card.name === "sha") { - if ( - !target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) - ) - return; - } else if (!target.mayHaveShan(player)) - return 1 - 0.1 * Math.min(5, target.countCards("hs")); - if (!target.hasSkillTag("rejudge")) return [1, 1]; - let pos = player.hasSkillTag("viewHandcard", null, target, true) - ? "hes" - : "e"; - if ( - target.hasCard(function (cardx) { - return get.suit(cardx) === "spade"; - }, pos) - ) - return [1, 4]; - if (pos === "e") - return [1, Math.min(4, 1 + 0.75 * Math.max(1, target.countCards("hs")))]; - return [1, 1]; - } - }, - }, - }, - }, - guidao: { - audio: 2, - audioname: ["sp_zhangjiao"], - trigger: { global: "judge" }, - filter(event, player) { - return player.countCards("hes", { color: "black" }) > 0; - }, - direct: true, - content() { - "step 0"; - player - .chooseCard( - get.translation(trigger.player) + - "的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - "," + - get.prompt("guidao"), - "hes", - function (card) { - if (get.color(card) != "black") return false; - var player = _status.event.player; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - } - ) - .set("ai", function (card) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0; - if (attitude > 0) { - return result; - } else { - return -result; - } - }) - .set("judging", trigger.player.judging[0]); - "step 1"; - if (result.bool) { - player.respond(result.cards, "highlight", "guidao", "noOrdering"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.$gain2(trigger.player.judging[0]); - player.gain(trigger.player.judging[0]); - trigger.player.judging[0] = result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player, "的判定牌改为", result.cards[0]); - } - "step 3"; - game.delay(2); - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - // 蛊惑(guhuo)技能错误,请勿引用 - /* - guhuo:{ - enable:'phaseUse', - usable:1, - audio:2, - filter:function(event,player){ - return player.countCards('hs')>0 - }, - chooseButton:{ - dialog:function(){ - var list=['sha','tao','jiu','taoyuan','wugu','juedou','huogong','jiedao','tiesuo','guohe','shunshou','wuzhong','wanjian','nanman']; - for(var i=0;i=3&&player.hp>=3) return 0; - for(var i=0;i 1) str += "中的一人"; - return str; - }, - filter(event, player) { - if (player.group != "qun") return false; - if (player.countCards("h", "shan") + player.countCards("h", "shandian") == 0) return 0; - return game.hasPlayer(function (target) { - return ( - target != player && - target.hasZhuSkill("huangtian", player) && - !target.hasSkill("huangtian3") - ); - }); - }, - filterCard(card) { - return card.name == "shan" || card.name == "shandian"; - }, - log: false, - visible: true, - filterTarget(card, player, target) { - return ( - target != player && - target.hasZhuSkill("huangtian", player) && - !target.hasSkill("huangtian3") - ); - }, - //usable:1, - //forceaudio:true, - content() { - player.give(cards, target); - target.addTempSkill("huangtian3", "phaseUseEnd"); - }, - ai: { - expose: 0.3, - order: 10, - result: { - target: 5, - }, - }, - }, - huangtian3: {}, - xinfu_guhuo: { - audio: "guhuo_guess", - derivation: ["chanyuan"], - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard(player, name) { - return ( - lib.inpile.includes(name) && - player.countCards("hs") > 0 && - !player.hasSkill("guhuo_phase") - ); - }, - filter(event, player) { - if (player.hasSkill("guhuo_phase")) return false; - if (!player.countCards("hs")) 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; - if (i == "sha") { - for (var j of lib.inpile_nature) { - if ( - event.filterCard( - get.autoViewAs({ name: i, nature: j }, "unsure"), - player, - event - ) - ) - return true; - } - } - } - return false; - }, - chooseButton: { - dialog(event, player) { - var list = []; - for (var i of lib.inpile) { - if (event.type != "phase") - if (!event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) - continue; - var type = get.type(i); - if (type == "basic" || type == "trick") list.push([type, "", i]); - if (i == "sha") { - if (event.type != "phase") - if ( - !event.filterCard( - get.autoViewAs({ name: i, nature: j }, "unsure"), - player, - event - ) - ) - continue; - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } - } - return ui.create.dialog("蛊惑", [list, "vcard"]); - }, - filter(button, player) { - var evt = _status.event.getParent(); - return evt.filterCard({ name: button.link[2], nature: button.link[3] }, player, evt); - }, - check(button) { - var player = _status.event.player; - var enemyNum = game.countPlayer(function (current) { - return ( - current != player && - !current.hasSkill("chanyuan") && - (get.realAttitude || get.attitude)(current, player) < 0 - ); - }); - var card = { name: button.link[2], nature: button.link[3] }; - var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; - if (val <= 0) return 0; - if (enemyNum) { - if ( - !player.hasCard(function (cardx) { - if (card.name == cardx.name) { - if (card.name != "sha") return true; - return get.is.sameNature(card, cardx); - } - return false; - }, "hs") - ) { - if (get.value(card, player, "raw") < 6) - return Math.sqrt(val) * (0.25 + Math.random() / 1.5); - if (enemyNum <= 2) return Math.sqrt(val) / 1.5; - return 0; - } - return 3 * val; - } - return val; - }, - backup(links, player) { - return { - filterCard(card, player, target) { - var result = true; - var suit = card.suit, - number = card.number; - card.suit = "none"; - card.number = null; - var mod = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod != "unchanged") result = mod; - card.suit = suit; - card.number = number; - return result; - }, - selectCard: 1, - position: "hs", - ignoreMod: true, - aiUse: Math.random(), - viewAs: { - name: links[0][2], - nature: links[0][3], - suit: "none", - number: null, - }, - ai1(card) { - var player = _status.event.player; - var enemyNum = game.countPlayer(function (current) { - return ( - current != player && - !current.hasSkill("chanyuan") && - (get.realAttitude || get.attitude)(current, player) < 0 - ); - }); - var cardx = lib.skill.xinfu_guhuo_backup.viewAs; - if (enemyNum) { - if ( - card.name == cardx.name && - (card.name != "sha" || get.is.sameNature(card, cardx)) - ) - return 2 + Math.random() * 3; - else if (lib.skill.xinfu_guhuo_backup.aiUse < 0.5 && !player.isDying()) - return 0; - } - return 6 - get.value(card); - }, - precontent() { - player.logSkill("xinfu_guhuo"); - player.addTempSkill("guhuo_guess"); - var card = event.result.cards[0]; - event.result.card.suit = get.suit(card); - event.result.card.number = get.number(card); - }, - }; - }, - prompt(links, player) { - return ( - "将一张手牌当做" + - get.translation(links[0][2]) + - (_status.event.name == "chooseToRespond" ? "打出" : "使用") - ); - }, - }, - ai: { - save: true, - respondSha: true, - respondShan: true, - fireAttack: true, - skillTagFilter(player) { - if (!player.countCards("hs") || player.hasSkill("guhuo_phase")) return false; - }, - threaten: 1.2, - order: 8.1, - result: { player: 1 }, - }, - }, - guhuo_guess: { - audio: 2, - trigger: { - player: ["useCardBefore", "respondBefore"], - }, - forced: true, - silent: true, - popup: false, - firstDo: true, - charlotte: true, - filter(event, player) { - return ( - event.skill && - (event.skill.indexOf("guhuo_") == 0 || event.skill.indexOf("xinfu_guhuo_") == 0) - ); - }, - content() { - "step 0"; - player.addTempSkill("guhuo_phase"); - event.fake = false; - event.betrayer = null; - var card = trigger.cards[0]; - if ( - card.name != trigger.card.name || - (card.name == "sha" && !get.is.sameNature(trigger.card, card)) - ) - event.fake = true; - player.popup(trigger.card.name, "metal"); - player.lose(card, ui.ordering).relatedEvent = trigger; - // player.line(trigger.targets,trigger.card.nature); - trigger.throw = false; - trigger.skill = "xinfu_guhuo_backup"; - game.log( - player, - "声明", - trigger.targets && trigger.targets.length ? "对" : "", - trigger.targets || "", - trigger.name == "useCard" ? "使用" : "打出", - trigger.card - ); - event.prompt = - get.translation(player) + - "声明" + - (trigger.targets && trigger.targets.length - ? "对" + get.translation(trigger.targets) - : "") + - (trigger.name == "useCard" ? "使用" : "打出") + - (get.translation(trigger.card.nature) || "") + - get.translation(trigger.card.name) + - ",是否质疑?"; - event.targets = game - .filterPlayer(function (current) { - return current != player && !current.hasSkill("chanyuan"); - }) - .sortBySeat(_status.currentPhase); - - game.broadcastAll( - function (card, player) { - _status.guhuoNode = card.copy("thrown"); - if (lib.config.cardback_style != "default") { - _status.guhuoNode.style.transitionProperty = "none"; - ui.refresh(_status.guhuoNode); - _status.guhuoNode.classList.add("infohidden"); - ui.refresh(_status.guhuoNode); - _status.guhuoNode.style.transitionProperty = ""; - } else { - _status.guhuoNode.classList.add("infohidden"); - } - _status.guhuoNode.style.transform = - "perspective(600px) rotateY(180deg) translateX(0)"; - player.$throwordered2(_status.guhuoNode); - }, - trigger.cards[0], - player - ); - event.onEnd01 = function () { - _status.guhuoNode.removeEventListener("webkitTransitionEnd", _status.event.onEnd01); - setTimeout(function () { - _status.guhuoNode.style.transition = "all ease-in 0.3s"; - _status.guhuoNode.style.transform = "perspective(600px) rotateY(270deg)"; - var onEnd = function () { - _status.guhuoNode.classList.remove("infohidden"); - _status.guhuoNode.style.transition = "all 0s"; - ui.refresh(_status.guhuoNode); - _status.guhuoNode.style.transform = "perspective(600px) rotateY(-90deg)"; - ui.refresh(_status.guhuoNode); - _status.guhuoNode.style.transition = ""; - ui.refresh(_status.guhuoNode); - _status.guhuoNode.style.transform = ""; - _status.guhuoNode.removeEventListener("webkitTransitionEnd", onEnd); - }; - _status.guhuoNode.listenTransition(onEnd); - }, 300); - }; - if (!event.targets.length) event.goto(3); - "step 1"; - event.target = event.targets.shift(); - event.target - .chooseButton([event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true) - .set("ai", function (button) { - var player = _status.event.player; - var evt = _status.event.getParent("guhuo_guess"), - evtx = evt.getTrigger(); - if (!evt) return Math.random(); - var card = { name: evtx.card.name, nature: evtx.card.nature, isCard: true }; - var ally = button.link[2] == "reguhuo_ally"; - if (ally && (player.hp <= 1 || get.attitude(player, evt.player) >= 0)) return 1.1; - if (!ally && get.attitude(player, evt.player) < 0 && evtx.name == "useCard") { - var eff = 0; - var targetsx = evtx.targets || []; - for (var target of targetsx) { - var isMe = target == evt.player; - eff += get.effect(target, card, evt.player, player) / (isMe ? 1.5 : 1); - } - eff /= 1.5 * targetsx.length || 1; - if (eff > 0) return 0; - if (eff < -7) return Math.random() + Math.pow(-(eff + 7) / 8, 2); - return Math.pow( - (get.value(card, evt.player, "raw") - 4) / (eff == 0 ? 5 : 10), - 2 - ); - } - return Math.random(); - }); - "step 2"; - if (result.links[0][2] == "reguhuo_betray") { - target.addExpose(0.2); - game.log(target, "#y质疑"); - target.popup("质疑!", "fire"); - event.betrayer = target; - } else { - game.log(target, "#g不质疑"); - target.popup("不质疑", "wood"); - if (targets.length) event.goto(1); - } - "step 3"; - game.delayx(); - game.broadcastAll(function (onEnd) { - _status.event.onEnd01 = onEnd; - if (_status.guhuoNode) _status.guhuoNode.listenTransition(onEnd, 300); - }, event.onEnd01); - "step 4"; - game.delay(2); - "step 5"; - if (!event.betrayer) event.finish(); - "step 6"; - if (event.fake) { - event.betrayer.popup("质疑正确", "wood"); - game.log(player, "声明的", trigger.card, "作废了"); - trigger.cancel(); - trigger.getParent().goto(0); - trigger.line = false; - } else { - event.betrayer.popup("质疑错误", "fire"); - event.betrayer.addSkills("chanyuan"); - } - "step 7"; - game.delay(2); - "step 8"; - if (event.fake) game.broadcastAll(ui.clear); - }, - }, - chanyuan: { - init(player, skill) { - if (player.hp == 1) player.logSkill(skill); - player.addSkillBlocker(skill); - }, - onremove(player, skill) { - player.removeSkillBlocker(skill); - }, - skillBlocker(skill, player) { - return ( - skill != "chanyuan" && - skill != "rechanyuan" && - !lib.skill[skill].charlotte && - player.hp == 1 - ); - }, - mark: true, - intro: { - content(storage, player, skill) { - var str = - "
  • 锁定技。你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值为1时,你的其他技能失效。"; - var list = player.getSkills(null, false, false).filter(function (i) { - return lib.skill.rechanyuan.skillBlocker(i, player); - }); - if (list.length) str += "
  • 失效技能:" + get.translation(list); - return str; - }, - }, - audio: 2, - trigger: { player: "changeHp" }, - filter(event, player) { - return player.hp == 1; - }, - forced: true, - content() {}, - }, - guhuo_phase: {}, - }, - card: {}, - dynamicTranslate: { - nzry_juzhan(player) { - if (player.storage.nzry_juzhan == true) - return '转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。'; - return '转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。'; - }, - nzry_zhenliang(player) { - if (player.storage.nzry_zhenliang == true) - return '转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; - return '转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; - }, - nzry_chenglve(player) { - if (player.storage.nzry_chenglve == true) - return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; - return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; - }, - nzry_shenshi(player) { - if (player.storage.nzry_shenshi == true) - return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; - return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; - }, - }, - characterReplace: { - caoren: ["caoren", "old_caoren", "sb_caoren", "new_caoren", "star_caoren"], - sp_caoren: ["sp_caoren", "jsp_caoren"], - xiahouyuan: ["re_xiahouyuan", "ol_xiahouyuan", "xiahouyuan"], - huangzhong: ["re_huangzhong", "ol_huangzhong", "sb_huangzhong", "huangzhong", "jsrg_huangzhong"], - weiyan: ["re_weiyan", "ol_weiyan", "weiyan"], - zhoutai: ["zhoutai", "xin_zhoutai", "old_zhoutai"], - xiaoqiao: ["xiaoqiao", "ol_xiaoqiao", "re_xiaoqiao", "sb_xiaoqiao", "old_xiaoqiao"], - yuji: ["xin_yuji", "re_yuji", "yuji"], - zhangjiao: ["sp_zhangjiao", "re_zhangjiao", "sb_zhangjiao", "zhangjiao"], - dianwei: ["dianwei", "ol_dianwei", "re_dianwei"], - xunyu: ["xunyu", "ol_xunyu", "re_xunyu", "sb_xunyu"], - sp_zhugeliang: ["sp_zhugeliang", "ol_sp_zhugeliang", "re_sp_zhugeliang", "sb_sp_zhugeliang"], - pangtong: ["pangtong", "ol_pangtong", "re_pangtong", "sb_pangtong"], - re_jsp_pangtong: ["re_jsp_pangtong", "jsrg_pangtong", "sp_pangtong"], - taishici: ["taishici", "re_taishici", "ol_sb_taishici"], - re_yuanshao: [ - "re_yuanshao", - "ol_yuanshao", - "xin_yuanshao", - "ol_sb_yuanshao", - "star_yuanshao", - "sb_yuanshao", - ], - pangde: ["re_pangde", "ol_pangde", "pangde"], - yanwen: ["yanwen", "ol_yanwen", "re_yanwen"], - caopi: ["caopi", "re_caopi", "ps_caopi", "sb_caopi"], - xuhuang: ["re_xuhuang", "ol_xuhuang", "sb_xuhuang", "xuhuang"], - menghuo: ["menghuo", "re_menghuo", "sb_menghuo", "tw_menghuo"], - zhurong: ["zhurong", "ol_zhurong", "re_zhurong", "sb_zhurong"], - sunjian: ["sunjian", "ol_sunjian", "re_sunjian", "tw_ol_sunjian"], - jiaxu: ["jiaxu", "re_jiaxu", "ns_jiaxu", "ps_jiaxu"], - dongzhuo: [ - "dongzhuo", - "ol_dongzhuo", - "re_dongzhuo", - "star_dongzhuo", - "sp_dongzhuo", - "yj_dongzhuo", - ], - dengai: ["dengai", "ol_dengai", "re_dengai"], - sp_ol_zhanghe: ["sp_ol_zhanghe", "yj_zhanghe", "sp_zhanghe", "jsrg_zhanghe"], - jiangwei: [ - "jiangwei", - "ol_jiangwei", - "re_jiangwei", - "ol_sb_jiangwei", - "sb_jiangwei", - "jsrg_jiangwei", - ], - liushan: ["liushan", "ol_liushan", "re_liushan"], - sunce: ["sunce", "re_sunce", "re_sunben", "sb_sunce", "dc_sunce"], - zhangzhang: ["zhangzhang", "ol_zhangzhang", "re_zhangzhang"], - zuoci: ["zuoci", "re_zuoci"], - caiwenji: ["caiwenji", "ol_caiwenji", "re_caiwenji"], - xuyou: ["xuyou", "sp_xuyou", "jsrg_xuyou", "yj_xuyou", "junk_xuyou"], - guanqiujian: [ - "guanqiujian", - "re_guanqiujian", - "tw_guanqiujian", - "mb_sp_guanqiujian", - "old_guanqiujian", - ], - chendao: ["chendao", "ns_chendao", "old_chendao"], - zhugezhan: ["zhugezhan", "old_zhugezhan"], - ol_lusu: ["re_lusu", "ol_lusu", "dc_sb_lusu"], - zhanghe: ["zhanghe", "re_zhanghe", "sb_zhanghe"], - yl_luzhi: ["yl_luzhi", "sb_yl_luzhi", "tw_yl_luzhi"], - sunliang: ["sunliang", "xin_sunliang"], - }, - translate: { - re_yuanshao: "袁绍", - re_lusu: "鲁肃", - re_yuji: "于吉", - wangji: "王基", - kuailiangkuaiyue: "蒯良蒯越", - sunliang: "孙亮", - yl_luzhi: "卢植", - xuyou: "许攸", - luji: "陆绩", - wangping: "王平", - yanyan: "严颜", - - zhugezhan: "诸葛瞻", - lukang: "陆抗", - haozhao: "郝昭", - yl_yuanshu: "新杀袁术", - yl_yuanshu_prefix: "新杀", - zhangxiu: "张绣", - chendao: "陈到", - guanqiujian: "毌丘俭", - zhoufei: "周妃", - - nzry_jianxiang: "荐降", - nzry_jianxiang_info: "当你成为其他角色使用牌的目标时,你可令手牌数最少的一名角色摸一张牌。", - nzry_shenshi1: "审时", - nzry_shenshi: "审时", - nzry_shenshi_info: - "转换技,阴:出牌阶段限一次,你可以将一张牌交给一名除你外手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。", - nzry_mingren: "明任", - nzry_mingren_info: - "游戏开始时,你摸两张牌,然后将一张手牌置于你的武将牌上,称为“任”。结束阶段,你可以用一张手牌替换“任”。", - nzry_zhenliang: "贞良", - nzry_zhenliang_info: - "转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。", - nzry_chenglve1: "成略", - nzry_chenglve: "成略", - nzry_chenglve_info: - "转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。", - nzry_cunmu: "寸目", - nzry_cunmu_info: "锁定技,当你摸牌时,改为从牌堆底摸牌。", - nzry_kuizhu: "溃诛", - nzry_kuizhu_info: - "弃牌阶段结束后,你可以选择一项:①令至多X名角色各摸一张牌。②对任意名体力值之和为X的角色造成1点伤害。(X为你此阶段弃置的牌数)", - nzry_zhizheng: "掣政", - rechezheng: "掣政", - nzry_zhizheng_info: - "锁定技,你的出牌阶段内,当你对攻击范围内不包含你的其他角色造成伤害时,防止此伤害。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。", - nzry_lijun1: "立军", - nzry_lijun: "立军", - nzry_lijun_info: - "主公技,其他吴势力角色的出牌阶段限一次,其使用【杀】结算后,可以将此【杀】对应的实体牌交给你,然后你可以令其摸一张牌且本阶段内使用【杀】的次数上限+1。", - nzry_huaiju: "怀橘", - nzry_huaiju_info: - "锁定技,游戏开始时,你获得3个“橘”标记。(有“橘”的角色受到伤害时,防止此伤害,然后移去一个“橘”;有“橘”的角色摸牌阶段额外摸一张牌)", - tachibana_effect: "怀橘", - nzry_yili: "遗礼", - nzry_yili_info: - "出牌阶段开始时,你可以失去1点体力或移去一个“橘”,然后令一名其他角色获得一个“橘”。", - nzry_zhenglun: "整论", - nzry_zhenglun_info: "若你没有“橘”,你可以跳过摸牌阶段然后获得一个“橘”。", - nzry_feijun: "飞军", - nzry_feijun_info: - "出牌阶段限一次。你可以弃置一张牌,然后选择一项:⒈令一名手牌数大于你的角色交给你一张牌;⒉令一名装备区里牌数大于你的角色弃置一张装备牌。", - nzry_binglve: "兵略", - nzry_binglve_info: "锁定技,当你发动“飞军”时,若目标与你之前指定的目标均不相同,则你摸两张牌。", - nzry_juzhan1: "拒战", - nzry_juzhan: "拒战", - nzry_juzhan_info: - "转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。", - - liangyin: "良姻", - liangyin_info: - "当有牌移至游戏外时,你可以令手牌数大于你的一名角色摸一张牌;当有牌从游戏外加入任意角色的手牌时,你可以令手牌数小于你的一名角色弃置一张牌。", - kongsheng: "箜声", - kongsheng_info: - "准备阶段,你可以将任意张牌置于你的武将牌上;结束阶段,你使用武将牌上的装备牌,并获得武将牌上的其他牌。", - kongsheng2: "箜声", - kongsheng2_info: "", - xinfu_zuilun: "罪论", - xinfu_zuilun_info: - "结束阶段,你可以观看牌堆顶三张牌,你每满足以下一项便保留一张,然后以任意顺序放回其余的牌:1.你于此回合内造成过伤害;2.你于此回合内未弃置过牌;3.手牌数为全场最少。若均不满足,你与一名其他角色失去1点体力。", - xinfu_fuyin: "父荫", - xinfu_fuyin_info: - "锁定技,你每回合第一次成为【杀】或【决斗】的目标后,若你的手牌数小于等于该角色,此牌对你无效。", - drlt_wanglie: "往烈", - drlt_wanglie_info: - "①出牌阶段,你使用的第一张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能再使用牌。", - drlt_xiongluan: "雄乱", - drlt_xiongluan1: "雄乱", - drlt_xiongluan_info: - "限定技,出牌阶段,你可以废除你的判定区和装备区,然后指定一名其他角色。直到回合结束,你对其使用牌无距离和次数限制,其不能使用和打出手牌。", - drlt_congjian: "从谏", - drlt_congjian_info: - "当你成为锦囊牌的目标时,若此牌的目标数大于1,则你可以交给其中一名其他目标角色一张牌,然后摸一张牌,若你给出的是装备牌,改为摸两张牌。", - drlt_yongsi: "庸肆", - drlt_yongsi_info: - "锁定技,摸牌阶段,你改为摸X张牌(X为存活势力数);出牌阶段结束时,若你本回合:1.没有造成伤害,将手牌摸至当前体力值;2.造成的伤害超过1点,本回合手牌上限改为已损失体力值。", - drlt_weidi: "伪帝", - weidi_tag: "伪帝", - drlt_weidi_info: - "主公技,弃牌阶段开始时,若你的手牌数大于手牌上限,则你可以将至多X张手牌分别交给等量的其他群雄角色(X为你的手牌数与手牌上限之差)。", - drlt_qianjie: "谦节", - drlt_qianjie_info: - "锁定技,当你横置时,取消之。你不能成为延时类锦囊的目标。你不能成为其他角色拼点的目标。", - drlt_jueyan: "决堰", - drlt_jueyan_info: - "出牌阶段限一次,你可以废除一种装备栏,然后执行对应一项:武器栏,你本回合内使用【杀】的次数上限+3;防具栏,你摸三张牌,且本回合手牌上限+3;坐骑栏,你本回合内使用牌无距离限制;宝物栏,你获得〖集智〗直到回合结束。", - drlt_poshi: "破势", - drlt_poshi_info: - "觉醒技,准备阶段开始时,若你的装备栏均已被废除或体力值为1,则你减1点体力上限,将手牌摸至体力上限,失去〖决堰〗并获得〖怀柔〗。", - drlt_huairou: "怀柔", - drlt_huairou_info: "出牌阶段,你可以重铸装备牌。", - drlt_zhenggu: "镇骨", - drlt_zhenggu2: "镇骨", - drlt_zhenggu_info: - "结束阶段,你可以选择一名其他角色,你的回合结束后和该角色的下个回合结束时,其将手牌摸至或弃至X张。(X为你的手牌数且至多为5)", - drlt_zhenrong: "征荣", - drlt_zhenrong_info: - "当你对其他角色造成伤害后,若其手牌比你多,你可以将其一张牌置于你的武将牌上,称为“荣”。", - drlt_hongju: "鸿举", - drlt_hongju_info: - "觉醒技,准备阶段,若“荣”的数量大于或等于3且场上有角色死亡,则你可以用任意张手牌替换等量的“荣”,然后减1点体力上限并获得〖清侧〗。", - drlt_qingce: "清侧", - drlt_qingce_info: "出牌阶段,你可以移去一张“荣”,然后弃置一名角色装备区或判定区内的一张牌。", - - zhengrong: "征荣", - hongju: "鸿举", - qingce: "清侧", - qingce_backup: "清侧", - zhengrong_info: - "当你使用带有「伤害」标签的基本牌或锦囊牌指定目标后,你可以将一名手牌数不小于你的目标角色的一张牌置于你的武将牌上,称为「荣」。", - hongju_info: - "觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3,则你触发此技能。你可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。", - qingce_info: "出牌阶段,你可以获得一张「荣」并弃置一张手牌,然后弃置场上的一张牌。", - - jianchu: "鞬出", - jianchu_info: - "当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌为装备牌,此【杀】不可被【闪】响应,若不为装备牌,该角色获得此【杀】。", - redimeng: "缔盟", - redimeng_info: - "出牌阶段限一次,你可以弃置X张牌选择两名其他角色(X为这两名角色的手牌差),你混合他们的手牌,然后令其中一名角色获得其中的一张牌,并令另一名角色获得其中的一张牌,然后重复此流程,直到这些牌均被获得为止。", - reluanji: "乱击", - reluanji_info: - "你可以将两张与你本回合以此法转化的花色均不相同的手牌当【万箭齐发】使用,然后当一名角色因响应此牌而打出【闪】时,该角色摸一张牌。若你以此法使用的【万箭齐发】未造成伤害,则你可以在此牌结算完成后摸X张牌。(X为此牌的目标数)", - xintianxiang: "天香", - xintianxiang2: "天香", - xintianxiang3: "天香", - xintianxiang4: "天香", - xintianxiang_bg: "香", - xintianxiang_info: - "当你受到伤害时,你可以弃置一张♥牌,将此伤害转移给一名其他角色,然后你选择一项:令该角色摸X张牌(X为其已损失的体力值);或防止其造成与受到的所有伤害,且此技能失效直到你的下回合开始。", - xinshensu: "神速", - xinshensu_info: - "你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。", - yinghun: "英魂", - yinghun_info: - "准备阶段开始时,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。", - gzyinghun: "英魂", - gzyinghun_info: - "准备阶段开始时,若你已受伤,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。", - - tiaoxin: "挑衅", - zhiji: "志继", - zhiji_draw: "摸牌", - zhiji_recover: "回血", - xiangle: "享乐", - fangquan: "放权", - ruoyu: "若愚", - qiaobian: "巧变", - tuntian: "屯田", - tuntian_bg: "田", - zaoxian: "凿险", - jixi: "急袭", - jiang: "激昂", - hunzi: "魂姿", - zhiba: "制霸", - zhiba2: "制霸", - zhijian: "直谏", - guzheng: "固政", - beige: "悲歌", - duanchang: "断肠", - // fushen:'附身', - huashen: "化身", - xinsheng: "新生", - qimou: "奇谋", - xinqiangxi: "强袭", - xinjushou: "据守", - xinjiewei: "解围", - retianxiang: "天香", - retianxiang_info: - "当你受到伤害时,你可以弃置一张红桃手牌,防止此次伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。", - xinjiewei_info: - "你可以将装备区里的牌当【无懈可击】使用;当你的武将牌从背面翻至正面时,你可以弃置一张牌,然后移动场上的一张牌。", - xinjushou_info: - "结束阶段,你可以翻面并摸四张牌,然后弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之。", - jixi_info: "出牌阶段,你可以将任意一张“田”当作【顺手牵羊】使用。", - xinqiangxi_info: - "出牌阶段各限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张装备牌并对你攻击范围内的一名其他角色造成1点伤害。", - qimou_info: - "限定技,出牌阶段,你可以失去任意点体力,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。", - tiaoxin_info: - "出牌阶段限一次,你可以指定一名攻击范围内包含你的角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。", - zhiji_info: - "觉醒技,准备阶段,若你没有手牌,你须回复1点体力或摸两张牌,然后减1点体力上限,并获得技能〖观星〗。", - xiangle_info: - "锁定技,当其他角色使用【杀】指定你为目标时,其需弃置一张基本牌,否则此【杀】对你无效。", - fangquan_info: - "你可跳过你的出牌阶段,若如此做,回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。", - ruoyu_info: - "主公技,觉醒技,准备阶段,若你的体力是全场最少的(或之一),你须增加1点体力上限并回复1点体力,然后获得技能〖激将〗。", - qiaobian_info: - "你可以弃置一张手牌并跳过自己的一个阶段(准备阶段和结束阶段除外)。若你以此法跳过了摸牌阶段,则你可以获得至多两名其他角色的各一张手牌;若你以此法跳过了出牌阶段,则你可以移动场上的一张牌。", - tuntian_info: - "①当你于回合外失去牌后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。", - zaoxian_info: - "觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。", - jiang_info: - "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", - hunzi_info: "觉醒技,准备阶段,若你的体力值为1,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。", - zhiba_info: - "主公技,其他吴势力角色的出牌阶段限一次,其可与你进行一次拼点。若该角色没赢,你可以获得双方拼点的牌。若你已发动过〖魂姿〗,你可以拒绝此拼点。", - zhijian_info: - "出牌阶段,你可以将手牌中的一张装备牌置于一名其他角色装备区里(不得替换原装备),然后摸一张牌。", - guzheng_info: - "其他角色的弃牌阶段结束时,你可以令其获得本阶段内进入弃牌堆的牌中的一张,然后你获得其余的牌。", - beige_info: - "当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复1点体力;♦︎该角色摸两张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。", - duanchang_info: "锁定技,杀死你的角色失去当前的所有技能。", - // fushen_info:'回合开始前,你可以选择与任意一名角色交换控制权,该角色可选择在下一个回合开始前与你换回。', - huashen_info: - "①游戏开始时,你随机将武将牌堆中的两张牌扣置于武将牌上(均称为“化身牌”),选择并亮出一张“化身牌”并声明该武将牌上的一个技能,你拥有该技能且同时将性别和势力属性变成与该武将相同直到该化身被替换(你不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能)。②回合开始时或回合结束时,你重新可以选择一张“化身牌”并声明该武将牌上的一个技能。", - xinsheng_info: "当你受到1点伤害后,你可以获得一张“化身牌”。", - jiangwei: "姜维", - liushan: "刘禅", - zhanghe: "张郃", - dengai: "邓艾", - sunce: "孙策", - zhangzhang: "张昭张纮", - caiwenji: "蔡琰", - zuoci: "左慈", - - zhurong: "祝融", - menghuo: "孟获", - caopi: "曹丕", - re_xuhuang: "徐晃", - lusu: "旧鲁肃", - lusu_prefix: "旧", - sunjian: "孙坚", - dongzhuo: "董卓", - jiaxu: "贾诩", - huoshou: "祸首", - huoshou1: "祸首", - huoshou2: "祸首", - zaiqi: "再起", - zaiqixx: "再起", - juxiang: "巨象", - juxiang1: "巨象", - juxiang2: "巨象", - lieren: "烈刃", - xingshang: "行殇", - fangzhu: "放逐", - songwei: "颂威", - songwei2: "颂威", - duanliang: "断粮", - duanliang1: "断粮", - haoshi: "好施", - dimeng: "缔盟", - jiuchi: "酒池", - roulin: "肉林", - benghuai: "崩坏", - baonue: "暴虐", - baonue2: "暴虐", - baonue_hp: "体力", - baonue_maxHp: "体力上限", - luanwu: "乱武", - wansha: "完杀", - weimu: "帷幕", - jiezi: "截辎", - jiezi_info: "锁定技,其他角色跳过摸牌阶段后,你摸一张牌。", - huoshou_info: "锁定技,【南蛮入侵】对你无效;你视为所有【南蛮入侵】的伤害来源。", - zaiqi_info: - "摸牌阶段,若你已受伤,则你可以改为亮出牌堆顶的X张牌(X为你已损失的体力值),并回复X点体力(X为其中♥牌的数目)。然后你将这些♥牌置入弃牌堆,并获得其余的牌。", - zaiqixx_info: - "摸牌阶段,若你已受伤,则你可以改为亮出牌堆顶的X张牌(X为你已损失的体力值+1),并回复X点体力(X为其中♥牌的数目)。然后你将这些♥牌置入弃牌堆,并获得其余的牌。", - juxiang_info: - "锁定技。①【南蛮入侵】对你无效。②其他角色使用的【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。", - lieren_info: - "当你使用【杀】造成伤害后,可与受到该伤害的角色进行拼点;若你赢,你获得对方的一张牌。", - xingshang_info: "当有角色死亡后,你可以获得该角色的所有牌。", - fangzhu_info: - "当你受到伤害后,你可令一名其他角色摸X张牌(X为你已损失的体力值),然后该角色将武将牌翻面。", - songwei_info: "主公技,其他魏势力的角色的判定牌结果为黑色且生效后,其可以令你摸一张牌。", - duanliang_info: - "你可以将一张黑色基本牌或装备牌当做【兵粮寸断】使用;若一名角色的手牌数大于或等于你的手牌数,则你对其使用【兵粮寸断】没有距离限制。", - haoshi_info: - "摸牌阶段,你可以额外摸两张牌。若此时你的手牌数多于五张,你须将一半(向下取整)的手牌交给场上除你外手牌数最少的一名角色。", - dimeng_info: - "出牌阶段限一次,你可以选择其他两名角色,你弃置等同于这两名角色手牌数量之差的牌,然后交换他们的手牌。", - yinghun_old_info: - "准备阶段,若你已受伤,则你可以令一名其他角色执行下列两项中的一项: 1.摸X张牌,然后弃一张牌。 2.摸一张牌,然后弃X张牌。 (X为你已损失的体力值)", - jiuchi_info: "你可以将一张♠手牌当作【酒】使用。", - roulin_info: "锁定技。你对女性角色、女性角色对你使用【杀】时,都需连续使用两张【闪】才能抵消。", - benghuai_info: "锁定技。结束阶段,若你的体力不为全场最少,你失去1点体力或减1点体力上限。", - baonue_info: "主公技,其他群雄角色造成伤害后,可进行一次判定,若为♠,你回复1点体力。", - luanwu_info: - "限定技,出牌阶段,你可令除你外的所有角色依次对与其距离最近的另一名角色使用一张【杀】,否则失去1点体力。", - wansha_info: "锁定技,你的回合内,除你以外,不处于濒死状态的角色不能使用【桃】。", - weimu_info: "锁定技,你不能成为黑色锦囊牌的目标。", - - sp_zhugeliang: "卧龙", - pangtong: "庞统", - xunyu: "荀彧", - dianwei: "典韦", - taishici: "太史慈", - yanwen: "颜良文丑", - yuanshao: "旧袁绍", - yuanshao_prefix: "旧", - re_pangde: "庞德", - huoji: "火计", - bazhen: "八阵", - kanpo: "看破", - niepan: "涅槃", - oldniepan: "涅槃", - quhu: "驱虎", - jieming: "节命", - qiangxix: "强袭", - qiangxi: "强袭", - tianyi: "天义", - shuangxiong: "双雄", - shuangxiong1: "双雄", - shuangxiong2: "双雄", - luanji: "乱击", - xueyi: "血裔", - mengjin: "猛进", - huoji_info: "你可以将一张红色手牌当作【火攻】使用。", - bazhen_info: "锁定技,若你的防具栏内没有牌且没有被废除,则你视为装备着【八卦阵】。", - kanpo_info: "你可以将你的任意一张黑色手牌当做【无懈可击】使用。", - niepan_info: - "限定技,出牌阶段或当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。", - oldniepan_info: - "限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。", - quhu_info: - "出牌阶段限一次,你可以与一名体力值大于你的角色拼点,若你赢,则该角色对其攻击范围内另一名由你指定的角色造成1点伤害。若你没赢,该角色对你造成1点伤害。", - jieming_info: "当你受到1点伤害后,你可令一名角色将手牌摸至X张(X为其体力上限且至多为5)。", - qiangxi_info: - "出牌阶段限一次,你可以失去1点体力或弃置一张武器牌,然后对你攻击范围内的一名其他角色造成1点伤害。", - qiangxix_info: - "出牌阶段限两次,你可以失去1点体力或弃置一张武器牌,然后对一名本阶段内未成为过〖强袭〗的目标的其他角色造成1点伤害。", - tianyi_info: - "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你获得以下技能效果直到回合结束:你使用【杀】没有距离限制;可额外使用一张【杀】;使用【杀】时可额外指定一个目标。若你没赢,你不能使用【杀】直到回合结束。", - shuangxiong_info: - "摸牌阶段,你可以改为进行一次判定:你获得此判定牌,且你可以于此回合内将任意一张与此判定牌不同颜色的手牌当做【决斗】使用。", - luanji_info: "出牌阶段,你可以将任意两张相同花色的手牌当做【万箭齐发】使用。", - xueyi_info: "主公技,锁定技,场上每有一名其他群雄角色存活,你的手牌上限便+2。", - mengjin_info: "当你使用的【杀】被【闪】抵消时,你可以弃置目标角色的一张牌。", - - re_xiahouyuan: "夏侯渊", - re_huangzhong: "黄忠", - re_weiyan: "魏延", - - gz_xiahouyuan: "夏侯渊", - gz_huangzhong: "黄忠", - gz_weiyan: "魏延", - gz_xuhuang: "徐晃", - gz_pangde: "庞德", - gz_caoren: "曹仁", - gz_zhoutai: "周泰", - - old_zhoutai: "周泰", - old_caoren: "曹仁", - xuhuang: "旧徐晃", - xuhuang_prefix: "旧", - pangde: "旧庞德", - pangde_prefix: "旧", - xiahouyuan: "旧夏侯渊", - xiahouyuan_prefix: "旧", - huangzhong: "旧黄忠", - huangzhong_prefix: "旧", - sp_zhangjiao: "张角", - weiyan: "旧魏延", - weiyan_prefix: "旧", - xiaoqiao: "小乔", - zhangjiao: "旧张角", - zhangjiao_prefix: "旧", - //yuji:'于吉', - shensu: "神速", - shensu1: "神速", - shensu2: "神速", - shensu4: "神速", - jushou: "据守", - moon_jushou: "据守", - liegong: "烈弓", - kuanggu: "狂骨", - tianxiang: "天香", - hongyan: "红颜", - buqu: "不屈", - buqu_bg: "创", - leiji: "雷击", - guidao: "鬼道", - huangtian: "黄天", - huangtian2: "黄天", - guhuo: "蛊惑", - fenji: "奋激", - releiji: "雷击", - jiewei: "解围", - tiangong: "天公", - tiangong2: "天公", - xinliegong: "烈弓", - xinkuanggu: "狂骨", - gzbuqu: "不屈", - gzbuqu_info: - "①当你扣减1点体力时,若你的体力值小于1,你可以将牌堆顶的一张牌置于你的武将牌上,称为“创”。②当你回复1点体力时,你移去一张“创”。③若你有“创”且点数均不相同,则你不结算濒死流程。", - xinkuanggu_info: - "当你造成1点伤害后,若受伤角色受到此伤害时你与其的距离不大于1,则你可以回复1点体力或摸一张牌。", - xinliegong_info: - "①你使用【杀】可以选择你距离不大于此【杀】点数的角色为目标。②当你使用【杀】指定一个目标后,你可以根据下列条件执行相应的效果:1.其手牌数小于等于你的手牌数,此【杀】不可被响应,2.其体力值大于等于你的体力值,此【杀】伤害+1。", - jiewei_info: - "当你的武将牌翻面后,你可以摸一张牌。然后你可以使用一张锦囊牌或装备牌,并可以在此牌结算后弃置场上一张同类型的牌。", - releiji_info: - "当你使用或打出一张【闪】时,你可令一名其他角色进行一次判定:若结果为梅花,你回复1点体力,并对其造成1点雷电伤害;若结果为黑桃,你对其造成2点雷电伤害。", - tiangong_info: "锁定技,你防止即将受到的雷电伤害。每当你造成雷电伤害时,你摸一张牌。", - shensu_info: - "你可以跳过判定阶段和摸牌阶段,或跳过出牌阶段并弃置一张装备牌。若如此做,则你可以视为对任意一名角色使用一张无距离限制的【杀】。", - jushou_info: "结束阶段,你可以摸三张牌并翻面。", - moon_jushou_info: "结束阶段,你可以摸一张牌并翻面。", - liegong_info: - "当你使用【杀】时,若目标的手牌数大于等于你的体力值,或小于等于你的攻击范围,你可令此【杀】不能被响应。", - kuanggu_info: - "锁定技,当你造成伤害后,若受伤角色受到此伤害时你与其的距离不大于1,你回复X点体力(X为伤害值)。", - tianxiang_info: - "当你即将受到伤害时,你可以弃置一张♥手牌,将伤害转移给一名其他角色,然后该角色摸X张牌(X为其已损失的体力值)。", - hongyan_info: "锁定技,你区域内的黑桃牌和黑桃判定牌均视为红桃。", - buqu_info: - "锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。只要你的武将牌上有“创”,你的手牌上限便与“创”的数量相等。", - buqu_info_guozhan: - "锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。", - leiji_info: - "当你使用或打出一张【闪】时,你可令任意一名角色进行一次判定。若结果为黑桃,其受到2点雷电伤害。", - guidao_info: "一名角色的判定牌生效前,你可以打出一张黑色牌替换之。", - huangtian_info: "主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张【闪】或【闪电】。", - guhuo_info: - "每名角色的回合限一次,你可以扣置一张手牌当一张基本牌或普通锦囊牌使用或打出。其他角色依次选择是否质疑。一旦有其他角色质疑则翻开此牌:若为假则此牌作废,若为真,则质疑角色获得技能“缠怨”(锁定技,你不能质疑于吉,只要你的体力值为1,你失去你的武将技能)。", - fenji_info: - "当一名角色的手牌不因赠予或交给而被另一名角色得到后,或一名角色的手牌被另一名角色弃置后,你可以失去1点体力,令其摸两张牌。", - - new_fenji: "奋激", - new_fenji_info: "一名角色的结束阶段开始时,若其没有手牌,你可以令其摸两张牌,然后你失去1点体力。", - gzduanliang: "断粮", - gzduanliang_info: - "你可以将一张黑色基本牌或黑色装备牌当【兵粮寸断】使用;你可以对距离为2的角色使用【兵粮寸断】。", - xinfu_guhuo: "蛊惑", - xinfu_guhuo_info: - "每回合限一次。你可以扣置一张手牌当做一张基本牌或普通锦囊牌使用或打出,其他角色依次选择是否质疑。当有角色质疑时,你终止质疑流程并展示此牌:若为假,此牌作废;若为真,该角色获得〖缠怨〗。", - guhuo_guess: "蛊惑", - guhuo_guess_info: "", - chanyuan: "缠怨", - chanyuan_info: - "锁定技。你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值为1时,你的其他技能失效。", - guhuo_respond: "蛊惑", - guhuo_respond_info: "", - guhuo_wuxie: "蛊惑", - guhuo_wuxie_info: "", - guhuo_phase: "蛊惑", - guhuo_phase_info: "", - xinhongyan: "红颜", - xinhongyan_info: - "锁定技,你的♠牌和♠判定牌的花色视为♥。一名角色的判定结果生效前,若判定结果为♥,则你将其改为一种花色。", - olliangyin: "良姻", - olliangyin_info: - "当有牌发生移动后,若此移动事件是本回合内你拥有〖良姻〗期间的首个有牌移出游戏/移入游戏的事件,则你可以选择一名其他角色。你与其各摸一张牌/弃置一张牌,然后你可以选择你或其中的一名手牌数为X的角色,该角色回复1点体力(X为你的“箜”数)。", - olkongsheng: "箜声", - olkongsheng_info: - "①准备阶段开始时,你可以将任意张牌置于你的武将牌上,称为“箜”。②结束阶段开始时,若你有不为装备牌的“箜”,则你获得“箜”中的非装备牌,然后令一名角色依次使用“箜”中的装备牌并失去1点体力。", - dcwanglie: "往烈", - dcwanglie_info: - "①出牌阶段,你对其他角色使用的前两张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能使用牌指定其他角色为目标。", - nzry_shicai: "恃才", - nzry_shicai_info: - "当你使用非装备牌结算结束后,或成为自己使用装备牌的目标后,若此牌与你本回合使用的牌类型均不同,则你可以将此牌置于牌堆顶,然后摸一张牌。", - lianhuan: "连环", - lianhuan_info: "你可以将♣手牌当作【铁索连环】使用或重铸。", - - shenhua_feng: "神话再临·风", - shenhua_huo: "神话再临·火", - shenhua_lin: "神话再临·林", - shenhua_shan: "神话再临·山", - shenhua_yin: "神话再临·阴", - shenhua_lei: "神话再临·雷", - }, - }; -}); diff --git a/character/shenhua/card.js b/character/shenhua/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/shenhua/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/shenhua/character.js b/character/shenhua/character.js new file mode 100644 index 000000000..a64c4c62e --- /dev/null +++ b/character/shenhua/character.js @@ -0,0 +1,59 @@ +const characters = { + re_huangzhong: ["male", "shu", 4, ["xinliegong"]], + old_zhoutai: ["male", "wu", 4, ["gzbuqu"]], + old_caoren: ["male", "wei", 4, ["jushou"]], + re_xuhuang: ["male", "wei", 4, ["duanliang", "jiezi"]], + re_pangde: ["male", "qun", 4, ["mashu", "jianchu"]], + re_xiahouyuan: ["male", "wei", 4, ["xinshensu"]], + re_weiyan: ["male", "shu", 4, ["xinkuanggu", "qimou"]], + xiaoqiao: ["female", "wu", 3, ["retianxiang", "hongyan"]], + sp_zhangjiao: ["male", "qun", 3, ["releiji", "guidao", "huangtian"], ["zhu"]], + re_yuji: ["male", "qun", 3, ["xinfu_guhuo"]], + // yuji:['male','qun',3,['guhuo']], + // xin_yuji:['male','qun',3,['guhuo']], + + sp_zhugeliang: ["male", "shu", 3, ["bazhen", "huoji", "kanpo"]], + pangtong: ["male", "shu", 3, ["lianhuan", "oldniepan"]], + xunyu: ["male", "wei", 3, ["quhu", "jieming"], ["clan:颍川荀氏"]], + dianwei: ["male", "wei", 4, ["qiangxix"]], + taishici: ["male", "wu", 4, ["tianyi"]], + yanwen: ["male", "qun", 4, ["shuangxiong"]], + re_yuanshao: ["male", "qun", 4, ["luanji", "xueyi"], ["zhu"]], + + menghuo: ["male", "shu", 4, ["huoshou", "zaiqixx"]], + zhurong: ["female", "shu", 4, ["juxiang", "lieren"]], + caopi: ["male", "wei", 3, ["xingshang", "fangzhu", "songwei"], ["zhu"]], + re_lusu: ["male", "wu", 3, ["haoshi", "dimeng"]], + sunjian: ["male", "wu", 4, ["gzyinghun"]], + dongzhuo: ["male", "qun", 8, ["jiuchi", "roulin", "benghuai", "baonue"], ["zhu"]], + jiaxu: ["male", "qun", 3, ["luanwu", "wansha", "weimu"]], + + jiangwei: ["male", "shu", 4, ["tiaoxin", "zhiji"]], + liushan: ["male", "shu", 3, ["xiangle", "fangquan", "ruoyu"], ["zhu"]], + zhanghe: ["male", "wei", 4, ["qiaobian"]], + dengai: ["male", "wei", 4, ["tuntian", "zaoxian"]], + sunce: ["male", "wu", 4, ["jiang", "hunzi", "zhiba"], ["zhu"]], + zhangzhang: ["male", "wu", 3, ["zhijian", "guzheng"]], + caiwenji: ["female", "qun", 3, ["beige", "duanchang"]], + zuoci: ["male", "qun", 3, ["huashen", "xinsheng"]], + + wangji: ["male", "wei", 3, ["qizhi", "jinqu"]], + yanyan: ["male", "shu", 4, ["nzry_juzhan"], []], + wangping: ["male", "shu", 4, ["nzry_feijun", "nzry_binglve"], []], + luji: ["male", "wu", 3, ["nzry_huaiju", "nzry_yili", "nzry_zhenglun"], []], + sunliang: ["male", "wu", 3, ["nzry_kuizhu", "nzry_zhizheng", "nzry_lijun"], ["zhu"]], + xuyou: ["male", "qun", 3, ["nzry_chenglve", "nzry_shicai", "nzry_cunmu"]], + yl_luzhi: ["male", "qun", 3, ["nzry_mingren", "nzry_zhenliang"], ["die_audio"]], + kuailiangkuaiyue: ["male", "wei", 3, ["nzry_jianxiang", "nzry_shenshi"], []], + + guanqiujian: ["male", "wei", 4, ["zhengrong", "hongju"]], + haozhao: ["male", "wei", 4, ["drlt_zhenggu"], []], + zhugezhan: ["male", "shu", 3, ["xinfu_zuilun", "xinfu_fuyin"], []], + lukang: ["male", "wu", 4, ["drlt_qianjie", "drlt_jueyan", "drlt_poshi"], []], + yl_yuanshu: ["male", "qun", 4, ["drlt_yongsi", "drlt_weidi"], ["zhu"]], + zhangxiu: ["male", "qun", 4, ["drlt_xiongluan", "drlt_congjian", "twjuxiang"], ["zhu"]], + chendao: ["male", "shu", 4, ["dcwanglie"], []], + zhoufei: ["female", "wu", 3, ["olliangyin", "olkongsheng"]], +}; + +export default characters; diff --git a/character/shenhua/characterFilter.js b/character/shenhua/characterFilter.js new file mode 100644 index 000000000..555c3cb74 --- /dev/null +++ b/character/shenhua/characterFilter.js @@ -0,0 +1,7 @@ +const characterFilters = { + zuoci(mode) { + return mode != "guozhan"; + }, +}; + +export default characterFilters; diff --git a/character/shenhua/characterReplace.js b/character/shenhua/characterReplace.js new file mode 100644 index 000000000..742f008f9 --- /dev/null +++ b/character/shenhua/characterReplace.js @@ -0,0 +1,45 @@ +const characterReplaces = { + caoren: ["caoren", "old_caoren", "sb_caoren", "new_caoren", "star_caoren"], + sp_caoren: ["sp_caoren", "jsp_caoren"], + xiahouyuan: ["re_xiahouyuan", "ol_xiahouyuan", "xiahouyuan"], + huangzhong: ["re_huangzhong", "ol_huangzhong", "sb_huangzhong", "huangzhong", "jsrg_huangzhong"], + weiyan: ["re_weiyan", "ol_weiyan", "weiyan"], + zhoutai: ["zhoutai", "xin_zhoutai", "old_zhoutai"], + xiaoqiao: ["xiaoqiao", "ol_xiaoqiao", "re_xiaoqiao", "sb_xiaoqiao", "old_xiaoqiao"], + yuji: ["xin_yuji", "re_yuji", "yuji"], + zhangjiao: ["sp_zhangjiao", "re_zhangjiao", "sb_zhangjiao", "zhangjiao"], + dianwei: ["dianwei", "ol_dianwei", "re_dianwei"], + xunyu: ["xunyu", "ol_xunyu", "re_xunyu", "sb_xunyu"], + sp_zhugeliang: ["sp_zhugeliang", "ol_sp_zhugeliang", "re_sp_zhugeliang", "sb_sp_zhugeliang"], + pangtong: ["pangtong", "ol_pangtong", "re_pangtong", "sb_pangtong"], + re_jsp_pangtong: ["re_jsp_pangtong", "jsrg_pangtong", "sp_pangtong"], + taishici: ["taishici", "re_taishici", "ol_sb_taishici"], + re_yuanshao: ["re_yuanshao", "ol_yuanshao", "xin_yuanshao", "ol_sb_yuanshao", "star_yuanshao", "sb_yuanshao"], + pangde: ["re_pangde", "ol_pangde", "pangde"], + yanwen: ["yanwen", "ol_yanwen", "re_yanwen"], + caopi: ["caopi", "re_caopi", "ps_caopi", "sb_caopi"], + xuhuang: ["re_xuhuang", "ol_xuhuang", "sb_xuhuang", "xuhuang"], + menghuo: ["menghuo", "re_menghuo", "sb_menghuo", "tw_menghuo"], + zhurong: ["zhurong", "ol_zhurong", "re_zhurong", "sb_zhurong"], + sunjian: ["sunjian", "ol_sunjian", "re_sunjian", "tw_ol_sunjian"], + jiaxu: ["jiaxu", "re_jiaxu", "ns_jiaxu", "ps_jiaxu"], + dongzhuo: ["dongzhuo", "ol_dongzhuo", "re_dongzhuo", "star_dongzhuo", "sp_dongzhuo", "yj_dongzhuo"], + dengai: ["dengai", "ol_dengai", "re_dengai"], + sp_ol_zhanghe: ["sp_ol_zhanghe", "yj_zhanghe", "sp_zhanghe", "jsrg_zhanghe"], + jiangwei: ["jiangwei", "ol_jiangwei", "re_jiangwei", "ol_sb_jiangwei", "sb_jiangwei", "jsrg_jiangwei"], + liushan: ["liushan", "ol_liushan", "re_liushan"], + sunce: ["sunce", "re_sunce", "re_sunben", "sb_sunce", "dc_sunce"], + zhangzhang: ["zhangzhang", "ol_zhangzhang", "re_zhangzhang"], + zuoci: ["zuoci", "re_zuoci"], + caiwenji: ["caiwenji", "ol_caiwenji", "re_caiwenji"], + xuyou: ["xuyou", "sp_xuyou", "jsrg_xuyou", "yj_xuyou", "junk_xuyou"], + guanqiujian: ["guanqiujian", "re_guanqiujian", "tw_guanqiujian", "mb_sp_guanqiujian", "old_guanqiujian"], + chendao: ["chendao", "ns_chendao", "old_chendao"], + zhugezhan: ["zhugezhan", "old_zhugezhan"], + ol_lusu: ["re_lusu", "ol_lusu", "dc_sb_lusu"], + zhanghe: ["zhanghe", "re_zhanghe", "sb_zhanghe"], + yl_luzhi: ["yl_luzhi", "sb_yl_luzhi", "tw_yl_luzhi"], + sunliang: ["sunliang", "xin_sunliang"], +}; + +export default characterReplaces; diff --git a/character/shenhua/dynamicTranslate.js b/character/shenhua/dynamicTranslate.js new file mode 100644 index 000000000..67d5942a0 --- /dev/null +++ b/character/shenhua/dynamicTranslate.js @@ -0,0 +1,21 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + nzry_juzhan(player) { + if (player.storage.nzry_juzhan == true) return '转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。'; + return '转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。'; + }, + nzry_zhenliang(player) { + if (player.storage.nzry_zhenliang == true) return '转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; + return '转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; + }, + nzry_chenglve(player) { + if (player.storage.nzry_chenglve == true) return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; + return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; + }, + nzry_shenshi(player) { + if (player.storage.nzry_shenshi == true) return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; + return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; + }, +}; +export default dynamicTranslates; diff --git a/character/shenhua/index.js b/character/shenhua/index.js new file mode 100644 index 000000000..901eb1ce1 --- /dev/null +++ b/character/shenhua/index.js @@ -0,0 +1,34 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "shenhua", + connect: true, + character: { ...characters }, + characterSort: { + shenhua: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/shenhua/intro.js b/character/shenhua/intro.js new file mode 100644 index 000000000..0be2c09d4 --- /dev/null +++ b/character/shenhua/intro.js @@ -0,0 +1,52 @@ +const characterIntro = { + huangzhong: "字汉升,今河南南阳人。汉末三国时期蜀汉名将。本为刘表部下中郎将,后归刘备,并助刘备攻益州刘璋,在定军山一战中阵斩曹操部下名将夏侯渊。备称汉中王后改封后将军,赐关内侯。", + weiyan: "字文长,义阳人。三国时期蜀汉名将,诸葛亮死后,魏延因被陷害谋反而遭杨仪一党所杀。", + xiahouyuan: "字妙才,沛国谯人。东汉末年曹操部下名将,夏侯惇之族弟,八虎骑之一。群雄征讨董卓时随曹操一同起兵,后征战四方,屡立功勋。在平定马超叛乱后负责西北防线的镇守。公元219年刘备攻打汉中,被刘备部将黄忠所杀。", + caoren: "字子孝,沛国谯人,曹操的从弟。三国时期曹魏名将,官至大司马。谥曰忠侯。", + xiaoqiao: "庐江皖县人也。父桥国老德尊于时。小乔国色流离,资貌绝伦。建安三年,周瑜协策攻皖,拔之。娶小乔为妻。后人谓英雄美女,天作之合。", + zhoutai: "字幼平,九江下蔡人,三国时期吴国武将。早年与蒋钦随孙策左右,立过数次战功。孙策讨伐六县山贼时,周泰胆气绝伦,保卫孙权,勇战退敌,身受十二处伤。有诗云:三番救主出重围,忠勇如公世所稀。遍体疮痍犹痛饮,血痕残酒满征衣。", + yuji: "自号太平道人,琅琊人,在吴郡、会稽一带为百姓治病,甚得人心。孙策怒之,以惑人心为由斩之,后策常受吉咒而亡。", + zhangjiao: "乱世的开始,黄巾起义军首领,太平道创始人。张角早年信奉黄老学说,对在汉代十分流行的谶纬之学也深有研究,对民间医术 、巫术也很熟悉。", + dianwei: "己吾城村人。东汉末年曹魏猛将。擅使大双戟,为人壮猛任侠,曾为乡人刘氏报仇,杀人出市,人莫敢近。相貌魁梧,膂力过人。建安二年(197),张绣背叛曹操,典韦为保护曹操而独挡叛军,击杀多人,但最终因寡不敌众而战死。", + xunyu: "荀彧,字文若,颍川颍阴(今河南许昌)人。东汉末年曹操帐下首席谋臣,杰出的战略家。自小被世人称作“王佐之才”。", + pangtong: "庞统,字士元,襄阳(治今湖北襄阳)人。三国时刘备帐下谋士,官拜军师中郎将。才智与诸葛亮齐名,人称“凤雏”。在进围雒县时,统率众攻城,不幸被流矢击中去世,时年三十六岁。追赐统为关内侯,谥曰靖侯。庞统死后,葬于落凤庞统墓坡。", + sp_zhugeliang: "字孔明,号卧龙居士,琅琊阳都人。刘备曾“三顾茅庐”得见卧龙。卧龙以一篇《隆中对》分析天下形势,提出先取荆州,再取益州成鼎足之势的说法。《三国演义》中的诸葛亮善用“火攻”,曾用火攻战术赢得多场战役,如“火烧赤壁”、“火烧博望坡”、“火烧藤甲兵”等。", + taishici: "太史慈,字子义,东莱黄县(今山东龙口东黄城集)人。东汉末年武将,守言应诺,恪遵信义,始终如一,弭息诽论。官至建昌都尉。弓马熟练,箭法精良。原为刘繇部下,后被孙策收降,于赤壁之战前病逝,死时才四十一岁。", + pangde: "字令明,东汉末年雍州南安郡狟道县(今甘肃天水市武山县四门镇)人。曹操部下重要将领。官至立义将军,拜关门亭侯。谥曰壮侯。有一子庞会。", + yanwen: "东汉末年河北袁绍部下武将,素有威名。颜良与文丑一起作为袁绍军队的勇将而闻名。建安四年(199),袁绍以颜良、文丑为将,率精卒十万,准备攻许都;次年,兵进黎阳,遣颜良攻白马。终均亡于关羽刀下。", + yuanshao: "字本初,汉族,汝南汝阳人,出身名门望族,自曾祖父起四代有五人位居三公,自己也居三公之上,其家族也因此有“四世三公”之称。曾于初平元年被推举为反董卓联合军的盟主,联军瓦解后,在汉末群雄割据的过程中,袁绍先占据冀州,又先后夺青、并二州,并于建安四年击败了割据幽州的军阀公孙瓒,势力达到顶点;但在建安五年的官渡之战中败于曹操。在平定冀州叛乱之后,于建安七年病死。", + xuhuang: "字公明,河东杨人。三国时期曹魏名将,本为杨奉帐下骑都尉,杨奉被曹操击败后转投曹操,在曹操手下多立功勋,参与官渡、赤壁、关中征伐、汉中征伐等几次重大战役。", + caopi: "字子桓,三国时期著名的政治家、文学家,曹魏的开国皇帝,公元220-226年在位。沛国谯人,魏武帝曹操与武宣卞皇后的长子。去世后庙号高祖,谥为文皇帝,葬于首阳陵。", + sunjian: "字文台,汉族,吴郡富春人。东汉末期地方军阀,著名将领。史书说他“容貌不凡,性阔达,好奇节”,是大军事家孙武的后裔。汉末群雄之一,三国中吴国的奠基人。孙权建国后,追谥孙坚为武烈皇帝。", + dongzhuo: "字仲颖,陇西临洮人。东汉末年少帝、献帝时权臣,西凉军阀。官至太师、郿侯。其为人残忍嗜杀,倒行逆施,招致群雄联合讨伐,但联合军在董卓迁都长安不久后瓦解。后被其亲信吕布所杀。", + zhurong: "据传为火神祝融氏后裔,南蛮王孟获之妻。武艺超群,善使飞刀,是《三国演义》中写到的唯一真正上过战场的女性。曾与孟获一起抵抗蜀军,在诸葛亮七擒七纵孟获之后,随孟获投降蜀汉。", + menghuo: "中国三国时期南中少数族首领。系东汉末益州建宁郡( 今云南晋宁东 )大姓,身材肥硕。生卒年不详。官至御史中丞。曾被诸葛亮七擒七纵,传为佳话。", + jiaxu: "字文和,武威姑臧人。三国时期魏国著名谋士。曾先后担任三国军阀李傕、张绣、曹操的谋士。官至魏国太尉,谥曰肃侯。", + lusu: "字子敬,汉族,临淮东城人,中国东汉末年东吴的著名军事统帅。他曾为孙权提出鼎足江东的战略规划,因此得到孙权的赏识,于周瑜死后代替周瑜领兵,守陆口。曾单刀赴会关羽于荆州。", + zhanghe: "字儁乂,河间鄚人。三国时期魏国名将。官渡之战时,本为袁绍部将的张郃投降了曹操,并在曹操帐下多立功勋,于曹魏建立后加封为征西车骑将军。诸葛亮六出祁山之间,张郃多次抵御蜀军的进攻,于公元231年在木门道被诸葛亮设伏射死。后谥曰壮侯。为曹魏“五子良将”之一。", + dengai: "字士载,义阳棘阳人。三国时期魏国杰出的军事家、将领。公元263年他与钟会分别率军攻打蜀汉,最后他率先进入成都,使得蜀汉灭亡。后因遭到钟会的污蔑和陷害,被司马昭猜忌而被收押,最后与其子邓忠一起被卫瓘派遣的武将田续所杀害。", + jiangwei: "字伯约,天水冀人。三国时期蜀汉著名将领、军事统帅。原为曹魏天水郡的中郎将,后降蜀汉,官至凉州刺史、大将军。诸葛亮去世后继承诸葛亮的遗志,继续率领蜀汉军队北伐曹魏,与曹魏名将陈泰、郭淮、邓艾等多次交手。", + liushan: "蜀汉后主,字公嗣。小名阿斗。刘备之子,母亲是昭烈皇后甘氏。三国时期蜀汉第二位皇帝,公元223-263年在位。公元263年蜀汉被曹魏所灭,刘禅投降曹魏,被封为安乐公。", + sunce: "字伯符,吴郡富春人。孙坚长子,孙权长兄。东汉末年割据江东一带的军阀,汉末群雄之一,三国时期吴国的奠基者。三国演义中绰号“小霸王”,统一江东。在一次狩猎中为刺客所伤,不久后身亡,年仅二十六岁。其弟孙权接掌孙策势力,并于称帝后,追谥孙策为长沙桓王。", + zhangzhang: "张昭,字子布,彭城人,三国时期吴国重臣,善丹青。拜辅吴将军,班亚三司,改封娄侯。年八十一卒,谥曰文侯。张纮,字子纲,广陵人。东吴谋士,和张昭一起合称“二张”。孙策平定江东时亲自登门邀请,张纮遂出仕为官。张纮后来建议孙权迁都秣陵,孙权正在准备时张纮病逝,其年六十岁。孙权为之流涕。", + zuoci: "左慈,字元放,东汉末方士,汉族,庐江(今安徽庐江西南)人。在道教历史上,东汉时期的丹鼎派道术是从他一脉相传。", + caiwenji: "名琰,原字昭姬,晋时避司马昭讳,改字文姬,东汉末年陈留圉(今河南开封杞县)人,东汉大文学家蔡邕的女儿,是中国历史上著名的才女和文学家,精于天文数理,既博学能文,又善诗赋,兼长辩才与音律。代表作有《胡笳十八拍》、《悲愤诗》等 。", + + yanyan: "严颜,东汉末年武将,初为刘璋部下,担任巴郡太守。建安十九年,刘备进攻江州,严颜战败被俘,张飞对严颜说:“大军至,何以不降而敢拒战?”,严颜回答说:“卿等无状,侵夺我州,我州但有断头将军,无降将军也!”,张飞生气,命左右将严颜牵去砍头,严颜表情不变地说:“砍头便砍头,何为怒邪!”张飞敬佩严颜的勇气,遂释放严颜并以严颜为宾客,之后的事迹不在正史中出现。", + wangping: "王平,字子均,巴西宕渠(今四川省渠县东北)人,籍贯益州。三国时蜀汉后期大将。原属曹操,曹操与刘备争汉中,得以投降刘备。诸葛亮第一次北伐时与马谡一同守街亭,之后深受诸葛亮的器重,率领蜀汉的王牌军队无当飞军,多次随诸葛亮北伐。诸葛亮死后,拜前监军、镇北大将军,镇守汉中,曹爽率领十万大军攻汉中时,被王平所击退,累封安汉侯。延熙十一年,王平去世,其子王训继承了爵位。", + luji: "陆绩(公元188年-公元219年),字公纪,吴郡吴县(今苏州)人,汉末庐江太守陆康之子。陆绩成年后,博学多识,通晓天文、历算,星历算数无不涉览。孙权征其为奏曹掾,常以直道见惮。后出为郁林太守,加偏将军。在军中不废著作,曾作《浑天图》,注《易经》,撰写《太玄经注》。", + sunliang: "孙亮(243-260年),字子明,吴郡富春(今浙江杭州富阳区)人。三国时期吴国的第二位皇帝,公元252-258年在位。吴大帝孙权第七子,母潘皇后。史称吴少帝、吴废帝、会稽王。建兴元年(252年),十岁登基为帝,太平二年(257年),十五岁亲政,但一年后(258年)就被权臣孙綝废为会稽王。永安三年(260年),孙亮再被贬为候官侯,在前往封地途中自杀(一说被毒杀),终年18岁。西晋太康年间,原先任职吴国的官员戴显将孙亮的遗骨葬在赖乡。", + xuyou: "许攸(?-204年),字子远,南阳(治今河南南阳)人。本为袁绍帐下谋士,官渡之战时其家人因犯法而被收捕,许攸因此背袁投曹,并为曹操设下偷袭袁绍军屯粮之所乌巢的计策,袁绍因此而大败于官渡。后许攸随曹操平定冀州,因自恃其功而屡屡口出狂言,终因触怒曹操而被杀。", + yl_luzhi: "卢植(139年—192年),字子干。涿郡涿县(今河北涿州)人。东汉末年经学家、将领。卢植性格刚毅,师从太尉陈球、大儒马融等,为郑玄、管宁、华歆的同门师兄。曾先后担任九江、庐江太守,平定蛮族叛乱。后与马日磾、蔡邕等一起在东观校勘儒学经典书籍,并参与续写《汉记》。黄巾起义时为北中郎将,率军与张角交战,后被诬陷下狱,皇甫嵩平定黄巾后力救卢植,于是复任为尚书。后因上谏激怒董卓被免官,隐居在上谷军都山,被袁绍请为军师。初平三年(192年)去世。著有《尚书章句》、《三礼解诂》等,今皆失佚。唐代时配享孔子,北宋时被追封为良乡伯。白马将军公孙瓒以及后来的蜀汉昭烈帝刘备皆为卢植门下弟子。范阳卢氏后来也成为著名的家族。", + kuailiangkuaiyue: "蒯良,字子柔,襄阳中庐人。归刘表。蒯良为刘表定下安抚荆楚的政治方向,佐其成业,被刘表誉为“雍季之论”。之后,蒯良就被刘表擢升为主簿(bù)。其后蒯良的生平,就不得而知了,《三国志》亦没有记载其卒年。与蒯越、以及同样活跃于襄阳的蒯祺(诸葛亮姐夫)或为同族兄弟。蒯越(?-214年),字异度,襄阳中庐(今湖北襄阳西南)人。东汉末期人物,演义中为蒯良之弟。原本是荆州牧刘表的部下,曾经在刘表初上任时帮助刘表铲除荆州一带的宗贼(以宗族、乡里关系组成的武装集团)。刘表病逝后与刘琮一同投降曹操,后来官至光禄勋。", + + guanqiujian: "毌丘俭,字仲恭,河东闻喜(今山西闻喜县)人。三国时期曹魏后期的重要将领。继承父毌丘兴爵位高阳乡侯,任平原侯文学。魏明帝即位后,上疏劝魏明帝停止加建皇宫的工程,升为荆州刺史。景初二年(238年)从司马懿攻灭公孙渊;正始五年(244年)至正始六年(245年)两次率兵征讨高句丽,攻破丸都,几亡其国,刻石纪功而还;253年击退吴国诸葛恪的大举进犯,战功累累。司马师废帝,毌丘俭感昔日魏明帝之恩,为曹魏政权做拼死一搏,于正元二年(255年)发动兵变,即后人所谓“淮南三叛”(王淩、毌丘俭、诸葛诞)之一,惜准备不足,兵败身亡。", + haozhao: "郝昭(生卒年不详),字伯道,太原人,中国东汉末年至曹魏初年著名将领。郝昭少年从军,屡立战功,逐渐晋升为杂号将军,后受曹真的推荐镇守陈仓(在小说三国演义中是司马懿推荐),防御蜀汉。太和二年(228年),诸葛亮率军北伐,为郝昭所阻,劝降不成,昼夜相攻二十余日后被迫退军。魏明帝因此封其为关内侯。不久因染疾而病死。", + zhugezhan: "诸葛瞻,字思远,琅邪阳都(今山东沂南县)人。三国时期蜀汉大臣,蜀汉丞相诸葛亮之子。邓艾伐蜀时,他与长子诸葛尚及蜀将张遵、李球、黄崇等人防御绵竹(今四川德阳),因不听黄崇速占险要的建议而坐失良机,后来出城与邓艾决战,在交战时阵亡,绵竹也随后失守。", + zhoufei: "周妃(210年?—?),一说本名周彻。周瑜独女,生母无载,疑为汉末美女小乔,因嫁孙登为太子妃,故称周妃。周瑜英年早逝,其遗孤都得到孙权厚遇,除却她本人在黄武四年(225年)嫁予太子外,兄长周循亦娶孙权长女孙鲁班为妻。", + lukang: "陆抗,字幼节,吴郡吴县(今江苏苏州)人。三国时期吴国名将,丞相陆逊次子。陆抗袭父爵为江陵侯,为建武校尉,领其父众五千人。后迁立节中郎将、镇军将军等。孙皓为帝,任镇军大将军、都督西陵、信陵、夷道、乐乡、公安诸军事,驻乐乡(今湖北江陵西南)。凤凰元年(272年),击退晋将羊祜进攻,并攻杀叛将西陵督步阐。后拜大司马、荆州牧,卒于官,终年49岁。与陆逊皆是吴国的中流砥柱,并称“逊抗 ”,被誉为吴国最后的名将。", + zhangxiu: "张绣,武威祖厉(今甘肃靖远)人。骠骑将军张济的从子。东汉末年割据宛城的军阀,汉末群雄之一。初随张济征伐,张济死后与刘表联合。后降曹操,因曹操调戏其嫂而突袭曹操,复与刘表连和。官渡之战前夕,听从贾诩的建议再次投降曹操,参加官渡之战,官至破羌将军,封宣威侯。在北征乌桓(207年)途中去世(一说为曹丕逼死),谥定侯。", + chendao: "陈到,字叔至,生卒年不详,豫州汝南(今河南驻马店平舆县)人。三国时期蜀汉将领,刘备帐下白毦兵统领,名位常亚于赵云,以忠勇著称。蜀汉建兴年间,任征西将军、永安都督,封亭侯。在任期间去世。", +}; + +export default characterIntro; diff --git a/character/shenhua/perfectPairs.js b/character/shenhua/perfectPairs.js new file mode 100644 index 000000000..fbb91e808 --- /dev/null +++ b/character/shenhua/perfectPairs.js @@ -0,0 +1,15 @@ +export default { + jiaxu: ["liqueguosi"], + re_yuanshao: ["yanwen", "tianfeng"], + menghuo: ["zhurong"], + sp_zhugeliang: ["pangtong", "huangyueying"], + sunce: ["zhouyu", "taishici", "daqiao"], + zuoci: ["yuji"], + xunyu: ["xunyou"], + lukang: ["luxun"], + yuanshu: ["jiling"], + zhangxiu: ["jiaxu"], + wangping: ["jiangfei"], + jiangwei: ["xiahouba"], + guanqiujian: ["wenqin"], +}; diff --git a/character/shenhua/pinyin.js b/character/shenhua/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/shenhua/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/shenhua/skill.js b/character/shenhua/skill.js new file mode 100644 index 000000000..b0f259bf7 --- /dev/null +++ b/character/shenhua/skill.js @@ -0,0 +1,7958 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //庞统写法修改 + lianhuan: { + audio: 2, + hiddenCard(player, name) { + return name == "tiesuo" && player.hasCard(card => get.suit(card) == "club", "sh"); + }, + enable: "chooseToUse", + filter(event, player) { + if (!player.hasCard(card => get.suit(card) == "club", "sh")) return false; + return event.type == "phase" || event.filterCard(get.autoViewAs({ name: "tiesuo" }, "unsure"), player, event); + }, + position: "hs", + filterCard(card, player, event) { + if (!event) event = _status.event; + if (get.suit(card) != "club") return false; + if (event.type == "phase" && get.position(card) != "s" && player.canRecast(card)) { + return true; + } else { + if (game.checkMod(card, player, "unchanged", "cardEnabled2", player) === false) return false; + const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); + return event._backup.filterCard(cardx, player, event); + } + }, + filterTarget(fuck, player, target) { + const card = ui.selected.cards[0], + event = _status.event, + backup = event._backup; + if (!card || game.checkMod(card, player, "unchanged", "cardEnabled2", player) === false) return false; + const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); + return backup.filterCard(cardx, player, event) && backup.filterTarget(cardx, player, target); + }, + selectTarget() { + const card = ui.selected.cards[0], + event = _status.event, + player = event.player, + backup = event._backup; + let recast = false, + use = false; + const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); + if (event.type == "phase" && player.canRecast(card)) recast = true; + if (game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false) { + if (backup.filterCard(cardx, player, event)) use = true; + } + if (!use) return [0, 0]; + else { + const select = backup.selectTarget(cardx, player); + if (recast && select[0] > 0) select[0] = 0; + return select; + } + }, + filterOk() { + const card = ui.selected.cards[0], + event = _status.event, + player = event.player, + backup = event._backup; + const selected = ui.selected.targets.length; + let recast = false, + use = false; + const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); + if (event.type == "phase" && player.canRecast(card)) recast = true; + if (game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false) { + if (backup.filterCard(cardx, player, event)) use = true; + } + if (recast && selected == 0) { + return true; + } else if (use) { + const select = backup.selectTarget(cardx, player); + if (select[0] <= -1) return true; + return selected >= select[0] && selected <= select[1]; + } + }, + discard: false, + lose: false, + delay: false, + async precontent(event, trigger, player) { + var result = event.result; + if (result.targets.length > 0) result.card = get.autoViewAs({ name: "tiesuo" }, result.cards); + }, + async content(event, trigger, player) { + player.recast(event.cards); + }, + }, + //新杀小加强 陈到 + dcwanglie: { + audio: "drlt_wanglie", + locked: false, + mod: { + targetInRange(card, player, target) { + if (player.hasSkill("dcwanglie_effect", null, null, false)) return true; + }, + }, + trigger: { + player: "useCard", + }, + filter(event, player) { + return player.isPhaseUsing() && (event.card.name == "sha" || get.type(event.card) == "trick"); + }, + preHidden: true, + check(event, player) { + if (player.hasSkill("dcwanglie2", null, null, false)) return true; + if (["wuzhong", "kaihua", "dongzhuxianji"].includes(event.card.name)) return false; + player._wanglie_temp = true; + var eff = 0; + for (var i of event.targets) { + eff += get.effect(i, event.card, player, player); + } + delete player._wanglie_temp; + if (eff < 0) return true; + if ( + !player.countCards("h", function (card) { + return player.hasValueTarget(card, null, true); + }) + ) + return true; + if ( + get.tag(event.card, "damage") && + !player.needsToDiscard() && + !player.countCards("h", function (card) { + return get.tag(card, "damage") && player.hasValueTarget(card, null, true); + }) + ) + return true; + return false; + }, + prompt2(event) { + return "令" + get.translation(event.card) + "不能被响应,然后本阶段你使用牌只能指定自己为目标"; + }, + group: "dcwanglie_startup", + async content(event, trigger, player) { + trigger.nowuxie = true; + trigger.directHit.addArray(game.players); + player.addTempSkill("dcwanglie2", "phaseUseAfter"); + }, + subSkill: { + startup: { + trigger: { player: "phaseUseBegin" }, + forced: true, + popup: false, + async content(event, trigger, player) { + player.addTempSkill("dcwanglie_effect", "phaseUseAfter"); + }, + }, + effect: { + forced: true, + charlotte: true, + firstDo: true, + popup: false, + trigger: { player: "useCard1" }, + filter(event, player) { + return event.targets.some(target => target != player); + }, + async content(event, trigger, player) { + player.addMark("dcwanglie_effect", 1, false); + if (player.countMark("dcwanglie_effect") >= 2) player.removeSkill("dcwanglie_effect"); + }, + onremove: true, + }, + }, + ai: { + //pretao:true, + directHit_ai: true, + skillTagFilter(player, tag, arg) { + //if(tag=='pretao') return true; + if (player._wanglie_temp) return false; + player._wanglie_temp = true; + var bool = (function () { + if (["wuzhong", "kaihua", "dongzhuxianji"].includes(arg.card.name)) return false; + if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false; + var cards = player.getCards("h", function (card) { + return card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)); + }); + var sha = player.getCardUsable("sha"); + if (arg.card.name == "sha") sha--; + cards = cards.filter(function (card) { + if (card.name == "sha" && sha <= 0) return false; + return player.hasValueTarget(card, null, true); + }); + if (!cards.length) return true; + if (!get.tag(arg.card, "damage")) return false; + if ( + !player.needsToDiscard() && + !cards.filter(function (card) { + return get.tag(card, "damage"); + }).length + ) + return true; + return false; + })(); + delete player._wanglie_temp; + return bool; + }, + }, + }, + dcwanglie2: { + charlotte: true, + mod: { + playerEnabled(card, player, target) { + if (player != target) return false; + }, + }, + }, + //周妃 + olliangyin: { + audio: "liangyin", + trigger: { + global: ["loseAfter", "addToExpansionAfter", "cardsGotoSpecialAfter", "loseAsyncAfter"], + }, + filter(event, player, name) { + if (event.name == "lose" || event.name == "loseAsync") return event.getlx !== false && event.toStorage == true; + if (event.name == "cardsGotoSpecial") return !event.notrigger; + return true; + }, + direct: true, + usable: 1, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player.chooseTarget(get.prompt("olliangyin"), "选择一名其他角色,你与其各摸一张牌", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + num = player.getExpansions("olkongsheng").length - 1; + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (target.countCards("h") == num && target.isDamaged() && get.recoverEffect(target, player, player) > 0) return 3 * att; + return att; + }); + if (bool) { + const target = targets[0]; + event.target = target; + player.logSkill("olliangyin", target); + await game.asyncDraw([player, target].sortBySeat()); + } else return; + await game.asyncDelayx(); + let num = player.getExpansions("olkongsheng").length; + let check = player => { + if (!player.isIn() || player.isHealthy()) return false; + return player.countCards("h") == num; + }; + const { target } = event; + if (check(player) || check(target)) { + const choiceList = ["令自己回复1点体力", "令" + get.translation(target) + "回复1点体力"]; + const choices = []; + if (check(player)) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (check(target)) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + const { + result: { control }, + } = await player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "良姻:是否令一名角色回复体力?") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + var list = _status.event.controls.slice(0), + eff1 = 0, + eff2 = 0; + if (list.includes("选项一")) eff1 = get.recoverEffect(player, player, player); + if (list.includes("选项二")) eff2 = get.recoverEffect(target, player, player); + if (eff1 > Math.max(0, eff2)) return "选项一"; + if (eff2 > 0) return "选项二"; + return "cancel2"; + }); + if (control == "选项一") await player.recover(); + else if (control == "选项二") await target.recover(); + } + }, + group: "olliangyin_gain", + subSkill: { + gain: { + audio: "liangyin", + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter(event, player) { + return game.hasPlayer(function (current) { + var evt = event.getl(current); + return evt && (evt.xs.length > 0 || evt.ss.length > 0); + }); + }, + usable: 1, + async content(event, trigger, player) { + if (!player.countCards("he") || !game.hasPlayer(current => current != player && current.countCards("he") > 0)) return; + const { + result: { bool, targets, cards }, + } = await player.chooseCardTarget({ + prompt: get.prompt("olliangyin"), + prompt2: "弃置一张牌,并令一名其他角色也弃置一张牌", + position: "he", + filterCard: lib.filter.cardDiscardable, + filterTarget(card, player, target) { + return target != player && target.countCards("he") > 0; + }, + ai1(card) { + let player = _status.event.player; + if (_status.event.me) { + if (get.position(card) === _status.event.me) return 12 - player.hp - get.value(card); + return 0; + } + return 5 - get.value(card); + }, + ai2(target) { + let player = _status.event.player, + att = get.attitude(player, target); + if (att > 0 && (_status.event.me || target.isHealthy())) return -att; + if ( + att > 0 && + (target.countCards("he") > target.hp || + target.hasCard(function (card) { + return get.value(card, target) <= 0; + }, "e")) + ) + return att; + return -att; + }, + me: (() => { + if (player.isHealthy() || get.recoverEffect(player, player, _status.event.player) <= 0) return false; + let ph = player.countCards("h"), + num = player.getExpansions("olkongsheng").length; + if (ph === num) { + if (player.hasSkillTag("noh")) return "h"; + return "e"; + } + if (ph - 1 === num) return "h"; + return false; + })(), + }); + if (bool) { + const target = targets[0]; + event.target = target; + player.logSkill("olliangyin_gain", target); + await player.discard(cards); + await target.chooseToDiscard("he", true); + } else return; + await game.asyncDelayx(); + let num = player.getExpansions("olkongsheng").length; + let check = player => { + if (!player.isIn() || player.isHealthy()) return false; + return player.countCards("h") == num; + }; + const { target } = event; + if (check(player) || check(target)) { + const choiceList = ["令自己回复1点体力", "令" + get.translation(target) + "回复1点体力"]; + const choices = []; + if (check(player)) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (check(target)) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + const { + result: { control }, + } = await player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "良姻:是否令一名角色回复体力?") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + var list = _status.event.controls.slice(0), + eff1 = 0, + eff2 = 0; + if (list.includes("选项一")) eff1 = get.recoverEffect(player, player, player); + if (list.includes("选项二")) eff2 = get.recoverEffect(target, player, player); + if (eff1 > Math.max(0, eff2)) return "选项一"; + if (eff2 > 0) return "选项二"; + return "cancel2"; + }); + if (control == "选项一") await player.recover(); + else if (control == "选项二") await target.recover(); + } + }, + }, + }, + }, + olkongsheng: { + audio: "kongsheng", + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter(event, player) { + return player.countCards("he") > 0; + }, + content() { + "step 0"; + player.chooseCard("he", [1, player.countCards("he")], get.prompt("olkongsheng"), "将任意张牌作为“箜”置于武将牌上").set("ai", function (card) { + var player = _status.event.player, + num = player.getExpansions("olkongsheng") + ui.selected.cards.length; + if ( + ui.selected.cards.length > 0 && + game.hasPlayer(function (current) { + if (current.isHealthy() || get.recoverEffect(current, player, player) <= 0) return false; + var num2 = + current.countCards("h", function (card) { + if (current != player) return true; + return !ui.selected.cards.includes(card); + }) + 1; + return num == num2; + }) + ) + return 0; + if (get.type(card, null, false) == "equip") { + for (var i of ui.selected.cards) { + if (get.type(i, null, false) == "equip") return 0; + } + return 5 - get.value(card); + } + if (!player.hasValueTarget(card)) return 1; + return 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("olkongsheng"); + player.addToExpansion(result.cards, player, "give").gaintag.add("olkongsheng"); + } + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + group: "olkongsheng_kessoku", + subSkill: { + kessoku: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter(event, player) { + return ( + player.getExpansions("olkongsheng").filter(function (card) { + return get.type(card, false) != "equip"; + }).length > 0 + ); + }, + content() { + "step 0"; + var cards = player.getExpansions("olkongsheng").filter(function (card) { + return get.type(card, false) != "equip"; + }); + if (cards.length) player.gain(cards, "gain2"); + "step 1"; + var cards = player.getExpansions("olkongsheng"); + if (cards.length > 0) { + player.chooseTarget(true, "令一名角色使用以下装备牌", get.translation(cards)).set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "losehp" }, player, player); + }); + } else event.finish(); + "step 2"; + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + "step 3"; + var cards = player.getExpansions("olkongsheng").filter(function (i) { + return target.hasUseTarget(i); + }); + if (cards.length == 1) { + event._result = { bool: true, links: cards }; + } else if (cards.length) + target.chooseButton(true, ["选择要使用的装备牌", cards]).set("ai", function (button) { + return get.order(button.link); + }); + else event.goto(5); + "step 4"; + if (result.bool) { + target.chooseUseTarget(result.links[0], true); + event.goto(3); + } + "step 5"; + target.loseHp(); + }, + }, + }, + }, + //新毌丘俭 + zhengrong: { + trigger: { player: "useCardToPlayered" }, + direct: true, + audio: "drlt_zhenrong", + filter(event, player) { + if (!event.isFirstTarget) return false; + if (!["basic", "trick"].includes(get.type(event.card))) return false; + if (get.tag(event.card, "damage")) + return game.hasPlayer(function (current) { + return event.targets.includes(current) && current.countCards("h") >= player.countCards("h") && current.countCards("he") > 0; + }); + return false; + }, + content() { + "step 0"; + player + .chooseTarget(get.prompt("zhengrong"), "将一名手牌数不小于你的目标角色的一张牌置于你的武将牌上,成为「荣」", function (card, player, target) { + return _status.event.targets.includes(target) && target.countCards("h") >= player.countCards("h") && target.countCards("he") > 0; + }) + .set("ai", function (target) { + return (1 - get.attitude(_status.event.player, target)) / target.countCards("he"); + }) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = result.targets[0]; + player.logSkill("zhengrong", target); + player.choosePlayerCard(target, "he", true).ai = get.buttonValue; + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.links[0]; + player.addToExpansion(card, "give", "log", target).gaintag.add("zhengrong"); + } + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + marktext: "荣", + intro: { + content: "expansion", + markcount: "expansion", + }, + }, + hongju: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: "drlt_hongju", + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + derivation: "qingce", + filter(event, player) { + return player.getExpansions("zhengrong").length >= 3; + }, + content() { + "step 0"; + player.awakenSkill("hongju"); + var cards = player.getExpansions("zhengrong"); + if (!cards.length || !player.countCards("h")) { + event.goto(2); + return; + } + var next = player.chooseToMove("征荣:是否交换“荣”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的“荣”", cards], + ["手牌区", player.getCards("h")], + ]); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return get.value(a) - get.value(b); + }), + cards2 = cards.splice(0, player.getExpansions("zhengrong").length); + return [cards2, cards]; + }); + "step 1"; + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("zhengrong")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.addToExpansion(pushs).gaintag.add("zhengrong"); + player.gain(gains, "gain2", "log"); + } + "step 2"; + player.addSkills("qingce"); + game.log(player, "获得了技能", "#g【清侧】"); + player.loseMaxHp(); + }, + ai: { + combo: "zhengrong", + }, + }, + qingce: { + enable: "phaseUse", + audio: "drlt_qingce", + filter(event, player) { + return player.getExpansions("zhengrong").length > 0 && player.countCards("h") > 0; + }, + chooseButton: { + dialog(event, player) { + return ui.create.dialog("请选择要获得的「荣」", player.getExpansions("zhengrong"), "hidden"); + }, + backup(links, player) { + return { + card: links[0], + filterCard: true, + position: "h", + filterTarget(card, player, target) { + return target.countDiscardableCards(player, "ej") > 0; + }, + delay: false, + audio: "drlt_qingce", + content: lib.skill.qingce.contentx, + ai: { + result: { + target(player, target) { + var att = get.attitude(player, target); + if ( + att > 0 && + (target.countCards("j") > 0 || + target.countCards("e", function (card) { + return get.value(card, target) < 0; + })) + ) + return 2; + if (att < 0 && target.countCards("e") > 0 && !target.hasSkillTag("noe")) return -1; + return 0; + }, + }, + }, + }; + }, + prompt(links, player) { + return "选择弃置一张手牌,获得" + get.translation(links[0]) + "并弃置一名角色装备区或判定区内的一张牌"; + }, + }, + contentx() { + "step 0"; + var card = lib.skill.qingce_backup.card; + player.gain(card, "gain2", "log"); + "step 1"; + if (target.countDiscardableCards(player, "ej") > 0) { + player.discardPlayerCard("ej", true, target); + } + }, + ai: { + combo: "zhengrong", + order: 8, + result: { + player(player) { + if ( + game.hasPlayer(function (current) { + var att = get.attitude(player, current); + if ((att > 0 && current.countCards("j") > 0) || (att < 0 && current.countCards("e") > 0)) return true; + return false; + }) + ) + return 1; + return 0; + }, + }, + }, + }, + //阴雷 + drlt_zhenrong: { + marktext: "荣", + intro: { + content: "expansion", + markcount: "expansion", + }, + audio: 2, + trigger: { + source: "damageSource", + }, + filter(event, player) { + return event.player != player && event.player.countCards("h") > player.countCards("h"); + }, + direct: true, + content() { + "step 0"; + player.choosePlayerCard("hej", get.prompt("drlt_zhenrong"), trigger.player).set("ai", function (button) { + return -get.attitude(player, trigger.player) + 1; + }); + "step 1"; + if (result && result.links && result.links.length) { + player.line(player, trigger.player); + player.logSkill("drlt_zhenrong"); + player.addToExpansion(result.links, trigger.player, "give", "log").gaintag.add("drlt_zhenrong"); + } + }, + }, + drlt_hongju: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + }, + forced: true, + unique: true, + juexingji: true, + derivation: ["drlt_qingce"], + filter(event, player) { + return player.getExpansions("drlt_zhenrong").length >= 3 && game.dead.length > 0; + }, + content() { + "step 0"; + player.awakenSkill("drlt_hongju"); + var cards = player.getExpansions("drlt_zhenrong"); + if (!cards.length || !player.countCards("h")) { + event.goto(2); + return; + } + var next = player.chooseToMove("征荣:是否交换“荣”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的“荣”", cards], + ["手牌区", player.getCards("h")], + ]); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return get.value(a) - get.value(b); + }), + cards2 = cards.splice(0, player.getExpansions("drlt_zhenrong").length); + return [cards2, cards]; + }); + "step 1"; + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("drlt_zhenrong")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.addToExpansion(pushs).gaintag.add("drlt_zhenrong"); + player.gain(gains, "gain2", "log"); + } + "step 2"; + player.addSkills("drlt_qingce"); + player.loseMaxHp(); + }, + ai: { + combo: "drlt_zhenrong", + }, + }, + drlt_qingce: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.getExpansions("drlt_zhenrong").length > 0; + }, + filterTarget(card, player, target) { + return target.countDiscardableCards(player, "ej") > 0; + }, + content() { + "step 0"; + player.chooseCardButton(player.getExpansions("drlt_zhenrong"), 1, "请选择需要弃置的“荣”", true).ai = function (button) { + return 6 - get.value(button.link); + }; + "step 1"; + if (result.bool) { + var cards = result.links; + player.loseToDiscardpile(cards); + player.discardPlayerCard(target, "ej", 1, true); + } + }, + ai: { + combo: "drlt_zhenrong", + order: 13, + result: { + target(player, target) { + if (get.attitude(player, target) > 0 && target.countCards("j") > 0) return 1; + return -1; + }, + }, + }, + }, + drlt_zhenggu: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("drlt_zhenggu"), function (card, player, target) { + //if(target.storage.drlt_zhenggu_mark&&target.storage.drlt_zhenggu_mark.includes(player)) return false; + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + //if(target.storage.drlt_zhenggu_mark&&target.storage.drlt_zhenggu_mark.includes(player)) return 0; + var num = Math.min(5, player.countCards("h")) - target.countCards("h"); + var att = get.attitude(player, target); + return num * att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("drlt_zhenggu", target); + player.addSkill("drlt_zhenggu2"); + target.addSkill("drlt_zhenggu_mark"); + target.storage.drlt_zhenggu_mark.push(player); + target.markSkill("drlt_zhenggu_mark"); + lib.skill.drlt_zhenggu.sync(player, target); + } + }, + sync(player, target) { + var num = player.countCards("h"); + var num2 = target.countCards("h"); + if (num < num2) { + target.chooseToDiscard(num2 - num, true, "h"); + } else target.drawTo(Math.min(5, num)); + }, + }, + drlt_zhenggu2: { + audio: "drlt_zhenggu", + trigger: { + global: "phaseEnd", + }, + forced: true, + charlotte: true, + logTarget: "player", + filter(event, player) { + return event.player.storage.drlt_zhenggu_mark && event.player.storage.drlt_zhenggu_mark.includes(player); + }, + content() { + while (trigger.player.storage.drlt_zhenggu_mark.includes(player)) { + trigger.player.storage.drlt_zhenggu_mark.remove(player); + } + if (trigger.player.storage.drlt_zhenggu_mark.length == 0) trigger.player.unmarkSkill("drlt_zhenggu_mark"); + lib.skill.drlt_zhenggu.sync(player, trigger.player); + }, + }, + drlt_zhenggu_mark: { + init(player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + marktext: "镇", + intro: { + name: "镇骨", + content: "已成为$〖镇骨〗的目标", + }, + }, + xinfu_zuilun: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + check(event, player) { + var num = 0; + if ( + player.hasHistory("lose", function (evt) { + return evt.type == "discard"; + }) + ) + num++; + if (!player.isMinHandcard()) num++; + if (!player.getStat("damage")) num++; + if (num == 3) return player.hp >= 2; + return true; + }, + prompt(event, player) { + var num = 3; + if ( + player.hasHistory("lose", function (evt) { + return evt.type == "discard"; + }) + ) + num--; + if (!player.isMinHandcard()) num--; + if (!player.getStat("damage")) num--; + return get.prompt("xinfu_zuilun") + "(可获得" + get.cnNumber(num) + "张牌)"; + }, + content() { + "step 0"; + event.num = 0; + event.cards = get.cards(3); + game.cardsGotoOrdering(cards); + if ( + player.hasHistory("lose", function (evt) { + return evt.type == "discard"; + }) + ) + event.num++; + if (!player.isMinHandcard()) event.num++; + if (!player.getStat("damage")) event.num++; + "step 1"; + if (event.num == 0) { + player.gain(event.cards, "draw"); + event.finish(); + } else { + var prompt = "罪论:将" + get.cnNumber(num) + "张牌置于牌堆顶"; + if (num < 3) prompt += "并获得其余的牌"; + var next = player.chooseToMove(prompt, true); + if (num < 3) { + next.set("list", [["牌堆顶", cards], ["获得"]]); + next.set("filterMove", function (from, to, moved) { + if (to == 1 && moved[0].length <= _status.event.num) return false; + return true; + }); + next.set("filterOk", function (moved) { + return moved[0].length == _status.event.num; + }); + } else { + next.set("list", [["牌堆顶", cards]]); + } + next.set("num", num); + next.set("processAI", function (list) { + var check = function (card) { + var player = _status.event.player; + var next = player.next; + var att = get.attitude(player, next); + var judge = next.getCards("j")[tops.length]; + if (judge) { + return get.judge(judge)(card) * att; + } + return next.getUseValue(card) * att; + }; + var cards = list[0][1].slice(0), + tops = []; + while (tops.length < _status.event.num) { + list.sort(function (a, b) { + return check(b) - check(a); + }); + tops.push(cards.shift()); + } + return [tops, cards]; + }); + } + "step 2"; + if (result.bool) { + var list = result.moved[0]; + var num = list.length - 1; + for (var i = 0; i < list.length; i++) { + event.cards.remove(list[num - i]); + ui.cardPile.insertBefore(list[num - i], ui.cardPile.firstChild); + } + } + "step 3"; + game.updateRoundNumber(); + if (event.cards.length) { + player.gain(event.cards, "draw"); + event.finish(); + } else { + player.chooseTarget("请选择一名角色,与其一同失去1点体力", true, function (card, player, target) { + return target != player; + }).ai = function (target) { + return -get.attitude(_status.event.player, target); + }; + } + "step 4"; + player.line(result.targets[0], "fire"); + player.loseHp(); + result.targets[0].loseHp(); + }, + }, + xinfu_fuyin: { + trigger: { + target: "useCardToTargeted", + }, + forced: true, + audio: 2, + filter(event, player) { + if (event.player.countCards("h") < player.countCards("h")) return false; + if (event.card.name != "sha" && event.card.name != "juedou") return false; + return !game.hasPlayer2(function (current) { + return ( + current.getHistory("useCard", function (evt) { + return evt != event.getParent() && evt.card && ["sha", "juedou"].includes(evt.card.name) && evt.targets.includes(player); + }).length > 0 + ); + }); + }, + content() { + trigger.getParent().excluded.add(player); + }, + ai: { + effect: { + target(card, player, target) { + let hs = player.getCards("h", i => i !== card && (!card.cards || !card.cards.includes(i))), + num = player.getCardUsable("sha"); + if ((card.name !== "sha" && card.name !== "juedou") || hs.length < target.countCards("h")) return 1; + if ( + game.hasPlayer2(function (current) { + return ( + current.getHistory("useCard", function (evt) { + return evt.card && ["sha", "juedou"].includes(evt.card.name) && evt.targets.includes(player); + }).length > 0 + ); + }) + ) + return 1; + if (card.name === "sha") num--; + hs = hs.filter(i => { + if (!player.canUse(i, target)) return false; + if (i.name === "juedou") return true; + if (num && i.name === "sha") { + num--; + return true; + } + return false; + }); + if (!hs.length) return "zeroplayertarget"; + num = 1 - 2 / 3 / hs.length; + return [num, 0, num, 0]; + }, + }, + }, + }, + drlt_qianjie: { + group: ["drlt_qianjie_1", "drlt_qianjie_2", "drlt_qianjie_3"], + locked: true, + ai: { + effect: { + target(card) { + if (card.name == "tiesuo") return "zeroplayertarget"; + }, + }, + }, + subSkill: { + 1: { + audio: "drlt_qianjie", + trigger: { + player: "linkBegin", + }, + forced: true, + filter(event, player) { + return !player.isLinked(); + }, + content() { + trigger.cancel(); + }, + }, + 2: { + mod: { + targetEnabled(card, player, target) { + if (get.type(card) == "delay") return false; + }, + }, + }, + 3: { + ai: { noCompareTarget: true }, + }, + }, + }, + drlt_jueyan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.hasEnabledSlot(1) || player.hasEnabledSlot(2) || player.hasEnabledSlot(5) || player.hasEnabledSlot("horse"); + }, + content() { + "step 0"; + player.chooseToDisable(true).set("ai", function (event, player, list) { + if (list.includes("equip2")) return "equip2"; + if ( + list.includes("equip1") && + player.countCards("h", function (card) { + return get.name(card, player) == "sha" && player.hasUseTarget(card); + }) - + player.getCardUsable("sha") > + 1 + ) + return "equip1"; + if ( + list.includes("equip5") && + player.countCards("h", function (card) { + return get.type2(card, player) == "trick" && player.hasUseTarget(card); + }) > 1 + ) + return "equip5"; + }); + "step 1"; + switch (result.control) { + case "equip1": + player.addTempSkill("drlt_jueyan1"); + break; + case "equip2": + player.draw(3); + player.addTempSkill("drlt_jueyan3"); + break; + case "equip3_4": + player.addTempSkill("drlt_jueyan2"); + break; + case "equip5": + player.addTempSkills("rejizhi"); + break; + } + }, + ai: { + order: 13, + result: { + player(player) { + if (player.hasEnabledSlot("equip2")) return 1; + if ( + player.hasEnabledSlot("equip1") && + player.countCards("h", function (card) { + return get.name(card, player) == "sha" && player.hasValueTarget(card); + }) - + player.getCardUsable("sha") > + 1 + ) + return 1; + if ( + player.hasEnabledSlot("equip5") && + player.countCards("h", function (card) { + return get.type2(card, player) == "trick" && player.hasUseTarget(card); + }) > 1 + ) + return 1; + return -1; + }, + }, + }, + derivation: "rejizhi", + }, + drlt_jueyan1: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + 3; + }, + }, + mark: true, + marktext: "决", + intro: { name: "决堰 - 武器", content: "本回合内可以多使用三张【杀】" }, + }, + drlt_jueyan2: { + mod: { + targetInRange(card, player, target, now) { + return true; + }, + }, + mark: true, + marktext: "决", + intro: { name: "决堰 - 坐骑", content: "本回合内使用牌没有距离限制" }, + }, + drlt_jueyan3: { + mod: { + maxHandcard(player, num) { + return num + 3; + }, + }, + mark: true, + marktext: "决", + intro: { name: "决堰 - 防具", content: "本回合内手牌上限+3" }, + }, + drlt_poshi: { + audio: 2, + skillAnimation: true, + animationColor: "wood", + trigger: { + player: "phaseZhunbeiBegin", + }, + forced: true, + unique: true, + juexingji: true, + derivation: ["drlt_huairou"], + filter(event, player) { + return !player.hasEnabledSlot() || player.hp == 1; + }, + content() { + "step 0"; + player.awakenSkill("drlt_poshi"); + player.loseMaxHp(); + "step 1"; + var num = player.maxHp - player.countCards("h"); + if (num > 0) player.draw(num); + player.changeSkills(["drlt_huairou"], ["drlt_jueyan"]); + }, + }, + drlt_huairou: { + audio: 2, + enable: "phaseUse", + position: "he", + filter: (event, player) => player.hasCard(card => lib.skill.drlt_huairou.filterCard(card, player), lib.skill.drlt_huairou.position), + filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), + check(card) { + if (!_status.event.player.canEquip(card)) return 5; + return 3 - get.value(card); + }, + content() { + player.recast(cards); + }, + discard: false, + lose: false, + delay: false, + prompt: "将一张装备牌置入弃牌堆并摸一张牌", + ai: { + order: 10, + result: { + player: 1, + }, + }, + }, + drlt_yongsi: { + audio: 2, + group: ["drlt_yongsi_1", "drlt_yongsi_2"], + locked: true, + subSkill: { + 1: { + audio: "drlt_yongsi", + trigger: { + player: "phaseDrawBegin2", + }, + forced: true, + filter(event, player) { + return !event.numFixed; + }, + content() { + trigger.num = game.countGroup(); + }, + }, + 2: { + audio: "drlt_yongsi", + trigger: { + player: "phaseUseEnd", + }, + forced: true, + filter(event, player) { + var num = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.getParent("phaseUse") == event) num += evt.num; + }); + return !num || num > 1; + }, + content() { + var numx = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.getParent("phaseUse") == trigger) numx += evt.num; + }); + if (!numx) { + var num = player.hp - player.countCards("h"); + if (num > 0) player.draw(num); + } else { + player.addTempSkill("drlt_yongsi1", { player: "phaseDiscardAfter" }); + } + }, + }, + }, + }, + drlt_yongsi1: { + mod: { + maxHandcard(player, num) { + return num + player.maxHp - 2 * Math.max(0, player.hp); + }, + }, + }, + drlt_weidi: { + audio: 2, + forceaudio: true, + unique: true, + zhuSkill: true, + trigger: { + player: "phaseDiscardBegin", + }, + direct: true, + filter(event, player) { + if (!player.hasZhuSkill("drlt_weidi")) return false; + return ( + player.needsToDiscard() > 0 && + game.countPlayer(function (current) { + return current != player && current.group == "qun"; + }) > 0 + ); + }, + content() { + "step 0"; + var num = Math.min( + player.needsToDiscard(), + game.countPlayer(function (target) { + return target != player && target.group == "qun"; + }) + ); + if (num) { + player.chooseCardTarget({ + prompt: get.prompt("drlt_weidi"), + prompt2: "你可以将" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "张手牌交给等量的其他群势力角色。先按顺序选中所有要给出的手牌,然后再按顺序选择等量的目标角色", + selectCard: [1, num], + selectTarget() { + return ui.selected.cards.length; + }, + filterTarget(card, player, target) { + return target != player && target.group == "qun"; + }, + complexSelect: true, + filterOk() { + return ui.selected.cards.length == ui.selected.targets.length; + }, + ai1(card) { + var player = _status.event.player; + var value = get.value(card, player, "raw"); + if ( + game.hasPlayer(function (target) { + return target != player && target.group == "qun" && !ui.selected.targets.includes(target) && get.sgn(value) == get.sgn(get.attitude(player, target)); + }) + ) + return 1 / Math.max(1, get.useful(card)); + return -1; + }, + ai2(target) { + var player = _status.event.player; + var card = ui.selected.cards[ui.selected.targets.length]; + if (card && get.value(card, player, "raw") < 0) return -get.attitude(player, target); + return get.attitude(player, target); + }, + }); + } else event.finish(); + "step 1"; + if (result.bool && result.cards.length > 0) { + var list = []; + for (var i = 0; i < result.targets.length; i++) { + var target = result.targets[i]; + var card = result.cards[i]; + list.push([target, card]); + } + player.logSkill("drlt_weidi", result.targets); + game.loseAsync({ + gain_list: list, + player: player, + cards: result.cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + } else event.finish(); + }, + }, + drlt_xiongluan: { + audio: 2, + unique: true, + enable: "phaseUse", + mark: true, + skillAnimation: true, + animationColor: "gray", + limited: true, + filter(event, player) { + return !player.isDisabledJudge() || player.hasEnabledSlot(); + }, + filterTarget(card, player, target) { + return target != player; + }, + content() { + player.awakenSkill("drlt_xiongluan"); + var disables = []; + for (var i = 1; i <= 5; i++) { + for (var j = 0; j < player.countEnabledSlot(i); j++) { + disables.push(i); + } + } + if (disables.length > 0) player.disableEquip(disables); + player.disableJudge(); + player.addTempSkill("drlt_xiongluan1"); + player.storage.drlt_xiongluan1 = target; + target.addSkill("drlt_xiongluan2"); + target.markSkillCharacter("drlt_xiongluan1", player, "雄乱", "无法使用或打出任何手牌"); + }, + ai: { + order: 13, + result: { + target: (player, target) => { + let hs = player.countCards("h", card => { + if (!get.tag(card, "damage") || get.effect(target, card, player, player) <= 0) return 0; + if (get.name(card, player) === "sha") { + if (target.getEquip("bagua")) return 0.5; + if (target.getEquip("rewrite_bagua")) return 0.25; + } + return 1; + }), + ts = + target.hp + + target.hujia + + game.countPlayer(current => { + if (get.attitude(current, target) > 0) return current.countCards("hs") / 8; + return 0; + }); + if (hs >= ts) return -hs; + return 0; + }, + }, + }, + intro: { + content: "limited", + }, + }, + drlt_xiongluan1: { + onremove(player) { + player.storage.drlt_xiongluan1.removeSkill("drlt_xiongluan2"); + player.storage.drlt_xiongluan1.unmarkSkill("drlt_xiongluan1"); + delete player.storage.drlt_xiongluan1; + }, + mod: { + targetInRange(card, player, target) { + if (target.hasSkill("drlt_xiongluan2")) { + return true; + } + }, + cardUsableTarget(card, player, target) { + if (target.hasSkill("drlt_xiongluan2")) return true; + }, + }, + charlotte: true, + }, + drlt_xiongluan2: { + mod: { + cardEnabled2(card, player) { + if (get.position(card) == "h") return false; + }, + }, + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) return [0, -999999]; + }, + }, + }, + charlotte: true, + }, + drlt_congjian: { + audio: 2, + audioname2: { tongyuan: "ocongjian_tongyuan" }, + trigger: { + target: "useCardToTargeted", + }, + direct: true, + filter(event, player) { + return get.type(event.card) == "trick" && event.targets.length > 1 && player.countCards("he") > 0; + }, + content() { + "step 0"; + player.chooseCardTarget({ + filterCard: true, + selectCard: 1, + position: "he", + filterTarget(card, player, target) { + return player != target && _status.event.targets.includes(target); + }, + ai1(card) { + if (card.name == "du") return 20; + if (_status.event.player.storage.drlt_xiongluan && get.type(card) == "equip") return 15; + return 6 - get.value(card); + }, + ai2(target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0.1; + return 1 - att; + } + return att - 3; + }, + prompt: get.prompt2("drlt_congjian"), + targets: trigger.targets, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("drlt_congjian", target); + player.give(result.cards, target, "give"); + var num = 1; + if (get.type(result.cards[0]) == "equip") num = 2; + player.draw(num); + } + }, + }, + drlt_wanglie: { + locked: false, + mod: { + targetInRange(card, player, target, now) { + if (game.online) { + if (!player.countUsed()) return true; + } else { + var evt = _status.event.getParent("phaseUse"); + if ( + evt && + evt.name == "phaseUse" && + player.getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == evt; + }).length == 0 + ) + return true; + } + }, + }, + audio: 2, + trigger: { + player: "useCard", + }, + filter(event, player) { + return player.isPhaseUsing() && (event.card.name == "sha" || get.type(event.card) == "trick"); + }, + preHidden: true, + check(event, player) { + if (["wuzhong", "kaihua", "dongzhuxianji"].includes(event.card.name)) return false; + player._wanglie_temp = true; + var eff = 0; + for (var i of event.targets) { + eff += get.effect(i, event.card, player, player); + } + delete player._wanglie_temp; + if (eff < 0) return true; + if ( + !player.countCards("h", function (card) { + return player.hasValueTarget(card, null, true); + }) + ) + return true; + if ( + get.tag(event.card, "damage") && + !player.needsToDiscard() && + !player.countCards("h", function (card) { + return get.tag(card, "damage") && player.hasValueTarget(card, null, true); + }) + ) + return true; + return false; + }, + prompt2(event) { + return "令" + get.translation(event.card) + "不能被响应,然后本阶段不能再使用牌"; + }, + content() { + trigger.nowuxie = true; + trigger.directHit.addArray(game.players); + player.addTempSkill("drlt_wanglie2", "phaseUseAfter"); + }, + ai: { + pretao: true, + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (tag == "pretao") return true; + if (player._wanglie_temp) return false; + player._wanglie_temp = true; + var bool = (function () { + if (["wuzhong", "kaihua", "dongzhuxianji"].includes(arg.card.name)) return false; + if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false; + var cards = player.getCards("h", function (card) { + return card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)); + }); + var sha = player.getCardUsable("sha"); + if (arg.card.name == "sha") sha--; + cards = cards.filter(function (card) { + if (card.name == "sha" && sha <= 0) return false; + return player.hasValueTarget(card, null, true); + }); + if (!cards.length) return true; + if (!get.tag(arg.card, "damage")) return false; + if ( + !player.needsToDiscard() && + !cards.filter(function (card) { + return get.tag(card, "damage"); + }).length + ) + return true; + return false; + })(); + delete player._wanglie_temp; + return bool; + }, + }, + }, + drlt_wanglie2: { + mod: { + cardEnabled(card, player) { + return false; + }, + }, + }, + liangyin: { + audio: 2, + group: ["liangyin_1", "liangyin_2"], + subSkill: { + 1: { + trigger: { + global: ["loseAfter", "addToExpansionAfter", "cardsGotoSpecialAfter", "loseAsyncAfter"], + }, + filter(event, player, name) { + if (event.name == "lose" || event.name == "loseAsync") return event.getlx !== false && event.toStorage == true; + if (event.name == "cardsGotoSpecial") return !event.notrigger; + return true; + }, + direct: true, + content() { + "step 0"; + player.chooseTarget("是否发动【良姻】令手牌数大于你的一名角色摸一张牌?", function (card, player, target) { + return target != player && target.countCards("h") > player.countCards("h"); + }).ai = function (target) { + return get.attitude(player, target); + }; + "step 1"; + if (result.bool) { + player.logSkill("liangyin", result.targets); + result.targets[0].draw(); + } + }, + sub: true, + }, + 2: { + trigger: { + global: "gainAfter", + }, + filter(event, player) { + return ( + event.fromStorage == true || + game.hasPlayer2(function (current) { + var evt = event.getl(current); + return evt && evt.xs && evt.xs.length > 0; + }) + ); + }, + direct: true, + content() { + "step 0"; + player.chooseTarget("是否发动【良姻】令手牌数小于你的一名角色弃置一张牌?", function (card, player, target) { + return target != player && target.countCards("h") < player.countCards("h") && target.countCards("he") > 0; + }).ai = function (target) { + return -get.attitude(player, target); + }; + "step 1"; + if (result.bool) { + player.logSkill("liangyin", result.targets); + result.targets[0].chooseToDiscard("he", 1, true); + } + }, + sub: true, + }, + }, + }, + kongsheng: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + }, + direct: true, + filter(event, player) { + return player.countCards("he") > 0; + }, + content() { + "step 0"; + player.chooseCard(get.prompt("kongsheng"), "将任意张牌置于武将牌上", "he", [1, player.countCards("he")]).set("ai", function (card) { + if (get.position(card) == "e") return 1 - get.value(card); + if (card.name == "shan" || card.name == "du" || !player.hasValueTarget(card)) return 1; + return 4 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("kongsheng"); + player.addSkill("kongsheng2"); + player.addToExpansion(result.cards, "log", "give", player).gaintag.add("kongsheng2"); + } + }, + }, + kongsheng_ai: { ai: { reverseOrder: true } }, + kongsheng2: { + audio: "kongsheng", + marktext: "箜", + intro: { + content: "expansion", + markcount: "expansion", + }, + trigger: { + player: "phaseJieshuBegin", + }, + filter(event, player) { + return player.getExpansions("kongsheng2").length > 0; + }, + forced: true, + charlotte: true, + content() { + "step 0"; + player.addTempSkill("kongsheng_ai", "kongsheng2After"); + "step 1"; + var cards = player.getExpansions("kongsheng2").filter(function (i) { + return get.type(i, false) == "equip" && player.hasUseTarget(i); + }); + if (cards.length == 1) { + event._result = { bool: true, links: cards }; + } else if (cards.length) + player.chooseButton(true, ["选择要使用的装备牌", cards]).set("ai", function (button) { + return get.order(button.link); + }); + else event.goto(3); + "step 2"; + if (result.bool) { + player.chooseUseTarget(result.links[0], true); + event.goto(1); + } + "step 3"; + var cards = player.getExpansions("kongsheng2"); + if (cards.length) player.gain(cards, "gain2"); + }, + }, + nzry_juzhan: { + audio: "nzry_juzhan_1", + mark: true, + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content(storage, player, skill) { + if (player.storage.nzry_juzhan == true) return "当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌"; + return "当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌"; + }, + }, + group: ["nzry_juzhan_1", "nzry_juzhan_2"], + subSkill: { + 1: { + audio: 2, + trigger: { + target: "useCardToTargeted", + }, + prompt2: "当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。", + filter(event, player) { + return event.card.name == "sha" && !player.storage.nzry_juzhan; + }, + logTarget: "player", + content() { + "step 0"; + game.asyncDraw([player, trigger.player]); + trigger.player.addTempSkill("nzry_juzhany"); + player.changeZhuanhuanji("nzry_juzhan"); + player.addTempSkill("nzry_juzhanx"); + "step 1"; + game.delayx(); + }, + }, + 2: { + audio: "nzry_juzhan_1", + trigger: { + player: "useCardToPlayered", + }, + prompt2: "当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌", + filter(event, player) { + return event.card.name == "sha" && player.storage.nzry_juzhan == true && event.target.countGainableCards(player, "he") > 0; + }, + check(event, player) { + return event.player.countCards("he") > 0 && event.targets && event.targets.length == 1; + }, + logTarget: "target", + content() { + player.gainPlayerCard(trigger.targets[0], "he", true); + player.changeZhuanhuanji("nzry_juzhan"); + trigger.target.addTempSkill("nzry_juzhanx"); + player.addTempSkill("nzry_juzhany"); + }, + }, + }, + }, + nzry_juzhanx: { + mod: { + targetEnabled(card, player, target) { + if (player.hasSkill("nzry_juzhany")) return false; + }, + }, + }, + nzry_juzhany: {}, + nzry_feijun: { + init: player => { + if (!Array.isArray(player.storage.nzry_feijun)) player.storage.nzry_feijun = []; + }, + intro: { + content(storage) { + if (!storage || !storage.length) return "尚未发动"; + var str = get.translation(storage); + return "已对" + str + "发动过〖飞军〗"; + }, + }, + mark: true, + enable: "phaseUse", + usable: 1, + position: "he", + audio: 2, + filter(event, player) { + return ( + game.hasPlayer(function (current) { + return current.countCards("h") >= player.countCards("h"); + }) || + game.hasPlayer(function (current) { + return current.countCards("e") >= player.countCards("e"); + }) > 0 + ); + }, + filterCard: true, + check(card) { + return 5 - get.value(card); + }, + content() { + "step 0"; + var list = []; + if ( + game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h"); + }) + ) + list.push("令一名手牌数大于你的角色交给你一张牌"); + if ( + game.hasPlayer(function (current) { + return current.countCards("e") > player.countCards("e"); + }) > 0 + ) + list.push("令一名装备区内牌数大于你的角色弃置一张装备牌"); + if (list.length == 0) event.finish(); + else if (list.length < 2) { + if ( + game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h"); + }) + ) + event._result = { index: 0 }; + else event._result = { index: 1 }; + } else { + player + .chooseControl() + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h") && get.attitude(player, current) < 0; + }) + ) + return 0; + return 1; + }) + .set("choiceList", list); + } + "step 1"; + event.index = result.index; + if (result.index == 0) { + player + .chooseTarget(function (card, player, target) { + return target != player && target.countCards("h") > player.countCards("h"); + }, "选择一名手牌数大于你的角色") + .set("ai", function (target) { + return -get.attitude(player, target); + }); + } else { + player.chooseTarget(function (card, player, target) { + return target.countCards("e") > player.countCards("e") && target != player; + }, "选择一名装备区里牌数大于你的角色").ai = function (target) { + return -get.attitude(player, target); + }; + } + "step 2"; + if (result.bool) { + event.target = result.targets[0]; + var list = player.getStorage("nzry_feijun"); + if (!list.includes(event.target)) { + event._nzry_binglve = true; + player.markAuto("nzry_feijun", [event.target]); + } + player.line(event.target, "green"); + if (event.index == 0) { + event.target.chooseCard("he", true, "选择一张牌交给" + get.translation(player)).set("ai", function (card) { + return 6 - get.value(card); + }); + } else { + event.target.chooseToDiscard("he", true, { type: "equip" }, "请弃置一张装备牌"); + event.finish(); + } + } else { + event.finish(); + } + "step 3"; + if (result.bool) { + target.give(result.cards, player); + } + }, + ai: { + order: 11, + result: { + player(player) { + if ( + game.hasPlayer(function (current) { + return (current.countCards("h") > player.countCards("h") || current.countCards("e") > player.countCards("e")) && get.attitude(player, current) < 0 && player.getStorage("nzry_feijun").includes(current); + }) || + game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h") && get.attitude(player, current) < 0; + }) || + (player.countCards("h") >= 2 && + game.hasPlayer(function (current) { + return current.countCards("e") > player.countCards("e") && get.attitude(player, current) < 0; + })) + ) + return 1; + }, + }, + }, + }, + nzry_binglve: { + audio: 2, + trigger: { player: "nzry_feijunAfter" }, + forced: true, + filter(event, player) { + return event._nzry_binglve == true; + }, + content() { + player.draw(2); + }, + ai: { combo: "nzry_feijun" }, + }, + nzry_huaiju_ai: { + charlotte: true, + ai: { + filterDamage: true, + skillTagFilter(player, tag, arg) { + if (!player.hasMark("nzry_huaiju")) return false; + if ( + !game.hasPlayer(function (current) { + return current.hasSkill("tachibana_effect"); + }) + ) + return false; + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; + } + }, + }, + }, + nzry_huaiju: { + marktext: "橘", + intro: { + name: "怀橘", + name2: "橘", + content: "当前有#个“橘”", + }, + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + player.addMark("nzry_huaiju", 3); + player.addSkill("nzry_huaiju_ai"); + }, + group: ["tachibana_effect"], + }, + //没错 这是个橘 + tachibana_effect: { + audio: "nzry_huaiju", + trigger: { + global: ["damageBegin4", "phaseDrawBegin2"], + }, + forced: true, + filter(event, player) { + return event.player.hasMark("nzry_huaiju") && (event.name == "damage" || !event.numFixed); + }, + content() { + player.line(trigger.player, "green"); + if (trigger.name == "damage") { + trigger.cancel(); + trigger.player.removeMark("nzry_huaiju", 1); + } else trigger.num++; + }, + }, + nzry_yili: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + direct: true, + content() { + "step 0"; + player.chooseTarget(get.prompt("nzry_yili"), "移去一个【橘】或失去1点体力,然后令一名其他角色获得一个【橘】", function (card, player, target) { + return target != player; + }).ai = function (target) { + var player = _status.event.player; + if (player.storage.nzry_huaiju > 2 || player.hp > 2) return get.attitude(player, target); + return -1; + }; + "step 1"; + if (result.bool) { + event.target = result.targets[0]; + if (player.hasMark("nzry_huaiju")) { + player + .chooseControl() + .set("choiceList", ["失去1点体力", "移去一个“橘”"]) + .set("ai", function () { + if (player.hp > 2) return 0; + return 1; + }); + } else event._result = { index: 0 }; + } else { + event.finish(); + } + "step 2"; + player.logSkill("nzry_yili", target); + if (result.index == 1) { + player.removeMark("nzry_huaiju", 1); + } else { + player.loseHp(); + } + target.addMark("nzry_huaiju", 1); + target.addSkill("nzry_huaiju_ai"); + }, + ai: { + combo: "nzry_huaiju", + }, + }, + nzry_zhenglun: { + audio: 2, + trigger: { + player: "phaseDrawBefore", + }, + filter(event, player) { + return !player.hasMark("nzry_huaiju"); + }, + check(event, player) { + return player.countCards("h") >= 2 || player.skipList.includes("phaseUse"); + }, + content() { + trigger.cancel(); + player.addMark("nzry_huaiju", 1); + }, + ai: { + combo: "nzry_huaiju", + }, + }, + nzry_kuizhu: { + audio: 2, + trigger: { + player: "phaseDiscardAfter", + }, + direct: true, + filter(event, player) { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) cards.addArray(evt.cards2); + }); + return cards.length > 0; + }, + content() { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) cards.addArray(evt.cards2); + }); + event.num = cards.length; + event.str1 = "令至多" + event.num + "名角色摸一张牌"; + event.str2 = "对任意名体力值之和为" + event.num + "的角色造成1点伤害"; + player + .chooseControl("cancel2") + .set("ai", function () { + if ( + game.countPlayer(function (current) { + return get.attitude(player, current) < 0 && current.hp == event.num; + }) > 0 && + event.num <= 3 + ) + return 1; + return 0; + }) + .set("choiceList", [event.str1, event.str2]) + .set("prompt", "是否发动【溃诛】?"); + "step 1"; + if (result.control == "cancel2") event.finish(); + event.control = [event.str1, event.str2][result.index]; + "step 2"; + var str = "请选择〖溃诛〗的目标"; + if (event.bool == false) str = "
    所选目标体力之和不足" + event.num + ",请重选"; + if (event.control == event.str2) { + player + .chooseTarget(str, function (card, player, target) { + var targets = ui.selected.targets; + var num = 0; + for (var i = 0; i < targets.length; i++) { + num += targets[i].hp; + } + return num + target.hp <= _status.event.num; + }) + .set("ai", function (target) { + if (ui.selected.targets[0] != undefined) return -1; + return get.attitude(player, target) < 0; + }) + .set("promptbar", "none") + .set("num", event.num) + .set("selectTarget", function () { + var targets = ui.selected.targets; + var num = 0; + for (var i = 0; i < targets.length; i++) { + num += targets[i].hp; + } + if (num == _status.event.num) return ui.selected.targets.length; + return ui.selected.targets.length + 1; + }); + } else { + player.chooseTarget("请选择〖溃诛〗的目标", [1, event.num]).ai = function (target) { + return get.attitude(player, target); + }; + } + "step 3"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + if (event.control == event.str1) { + //player.line(targets); + player.logSkill("nzry_kuizhu", targets); + game.asyncDraw(targets); + } else { + var num = 0; + for (var i = 0; i < targets.length; i++) { + num += targets[i].hp; + } + if (num < event.num) { + event.bool = false; + event.goto(2); + } else { + //player.line(targets); + player.logSkill("nzry_kuizhu", targets); + for (var i = 0; i < targets.length; i++) { + targets[i].damage(); + } + //if(targets.length>=2) player.loseHp(); + } + } + } + }, + }, + rechezheng: { + audio: "nzry_zhizheng", + trigger: { source: "damageBegin2" }, + filter(event, player) { + return player.isPhaseUsing() && !player.inRangeOf(event.player); + }, + forced: true, + logTarget: "player", + content() { + trigger.cancel(); + }, + ai: { + effect: { + player(card, player, target) { + if (get.tag(card, "damage") && !player.inRangeOf(target)) return "zerotarget"; + }, + }, + }, + }, + nzry_zhizheng: { + audio: 2, + //mod:{ + // playerEnabled:function(card,player,target){ + // var info=get.info(card); + // if(target!=player&&(!info||!info.singleCard||!ui.selected.targets.length)&&player.isPhaseUsing()&&!target.inRange(player)) return false; + // }, + //}, + trigger: { + player: "phaseUseEnd", + }, + forced: true, + filter(event, player) { + return ( + player.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; + }).length < + game.countPlayer(function (current) { + return current != player && !current.inRange(player); + }) && + game.hasPlayer(function (target) { + return target != player && !target.inRange(player) && target.countDiscardableCards(player, "he"); + }) + ); + }, + content() { + "step 0"; + player.chooseTarget("请选择〖掣政〗的目标", "弃置一名攻击范围内不包含你的角色的一张牌", true, function (card, player, target) { + return target != player && !target.inRange(player) && target.countDiscardableCards(player, "he"); + }).ai = function (target) { + return -get.attitude(player, target); + }; + "step 1"; + if (result.bool) { + player.line(result.targets); + player.discardPlayerCard(result.targets[0], "he", 1, true); + } + }, + group: "rechezheng", + }, + nzry_lijun: { + unique: true, + global: "nzry_lijun1", + audio: "nzry_lijun1", + zhuSkill: true, + }, + nzry_lijun2: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("nzry_lijun2"); + }, + }, + onremove: true, + }, + nzry_lijun1: { + audio: 2, + //forceaudio:true, + trigger: { + player: "useCardAfter", + }, + filter(event, player) { + if (event.card.name != "sha" || player.group != "wu") return false; + if (player.hasSkill("nzry_lijun2")) return false; + if (!player.isPhaseUsing()) return false; + if ( + !game.hasPlayer(function (target) { + return player != target && target.hasZhuSkill("nzry_lijun", player); + }) + ) + return false; + for (var i = 0; i < event.cards.length; i++) { + if (get.position(event.cards[i], true) == "o") { + return true; + } + } + return false; + }, + direct: true, + content() { + "step 0"; + var list = game.filterPlayer(function (target) { + return player != target && target.hasZhuSkill("nzry_lijun", player); + }); + player.chooseTarget(get.prompt("nzry_lijun"), "将" + get.translation(trigger.cards) + "交给" + get.translation(list) + (list.length > 1 ? "中的一人" : ""), function (card, player, target) { + return player != target && target.hasZhuSkill("nzry_lijun", player); + }).ai = function (target) { + return get.attitude(_status.event.player, target); + }; + "step 1"; + if (!result.bool) event.finish(); + else { + player.addTempSkill("nzry_lijun2", "phaseUseEnd"); + var zhu = result.targets[0]; + player.line(zhu, "green"); + zhu.logSkill("nzry_lijun"); + var list = []; + for (var i = 0; i < trigger.cards.length; i++) { + if (get.position(trigger.cards[i], true) == "o") { + list.push(trigger.cards[i]); + } + } + zhu.gain(list, "gain2").giver = player; + zhu.chooseBool() + .set("ai", function () { + if (get.attitude(zhu, player) > 0) return true; + return false; + }) + .set("prompt", "是否令" + get.translation(player) + "摸一张牌?"); + } + "step 2"; + if (result.bool) { + player.draw(); + player.addMark("nzry_lijun2", 1, false); + } + }, + }, + nzry_chenglve: { + mark: true, + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content(storage, player, skill) { + var str = player.storage.nzry_chenglve ? "出牌阶段限一次,你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制" : "出牌阶段限一次,你可以摸一张牌,然后弃置两张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制"; + if (player.storage.nzry_chenglve1) { + str += "
  • 当前花色:"; + str += get.translation(player.storage.nzry_chenglve1); + } + return str; + }, + }, + enable: "phaseUse", + usable: 1, + audio: 2, + content() { + "step 0"; + if (player.storage.nzry_chenglve == true) { + player.draw(2); + player.chooseToDiscard("h", true); + } else { + player.draw(); + player.chooseToDiscard("h", 2, true); + } + player.changeZhuanhuanji("nzry_chenglve"); + "step 1"; + if (result.bool) { + player.storage.nzry_chenglve1 = []; + for (var i = 0; i < result.cards.length; i++) { + player.storage.nzry_chenglve1.add(get.suit(result.cards[i], player)); + } + player.markSkill("nzry_chenglve"); + player.addTempSkill("nzry_chenglve1"); + } + }, + ai: { + order: 2.7, + result: { + player(player) { + if (!player.storage.nzry_chenglve && player.countCards("h") < 3) return 0; + return 1; + }, + }, + }, + }, + nzry_chenglve1: { + mod: { + cardUsable(card, player) { + const suit = get.suit(card); + if (suit == "unsure" || player.getStorage("nzry_chenglve1").includes(suit)) return Infinity; + }, + targetInRange(card, player) { + const suit = get.suit(card); + if (suit == "unsure" || player.getStorage("nzry_chenglve1").includes(suit)) return true; + }, + }, + onremove: true, + }, + nzry_shicai: { + audio: "nzry_shicai_2", + trigger: { player: ["useCardAfter", "useCardToTargeted"] }, + prompt2(event, player) { + const cards = event.cards.filterInD("oe"); + return "你可以将" + get.translation(cards) + (cards.length > 1 ? "以任意顺序" : "") + "置于牌堆顶,然后摸一张牌"; + }, + filter(event, player) { + if (!event.cards.someInD()) return false; + let evt = event, + type = get.type2(evt.card, false); + if (event.name == "useCardToTargeted") { + if (type != "equip" || player != event.target) return false; + evt = evt.getParent(); + } else { + if (type == "equip") return false; + } + return !player.hasHistory( + "useCard", + evtx => { + return evtx != evt && get.type2(evtx.card, false) == type; + }, + evt + ); + }, + check(event, player) { + if (get.type(event.card) == "equip") { + if (get.subtype(event.card) == "equip6") return true; + if (get.equipResult(player, player, event.card.name) <= 0) return true; + var eff1 = player.getUseValue(event.card); + var subtype = get.subtype(event.card); + return ( + player.countCards("h", function (card) { + return get.subtype(card) == subtype && player.getUseValue(card) >= eff1; + }) > 0 + ); + } + return true; + }, + content() { + "step 0"; + var cards = trigger.cards.filterInD(); + if (cards.length == 1) { + event._result = { bool: true, moved: [cards] }; + } else { + var next = player.chooseToMove("恃才:将牌按顺序置于牌堆顶", true); + next.set("list", [["牌堆顶", cards]]); + next.set("reverse", _status.currentPhase && _status.currentPhase.next ? get.attitude(player, _status.currentPhase.next) > 0 : false); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0); + cards.sort(function (a, b) { + return (_status.event.reverse ? 1 : -1) * (get.value(b) - get.value(a)); + }); + return [cards]; + }); + } + "step 1"; + if (result.bool) { + var cards = result.moved[0]; + cards.reverse(); + game.cardsGotoPile(cards, "insert"); + game.log(player, "将", cards, "置于了牌堆顶"); + } + player.draw(); + }, + subSkill: { 2: { audio: 2 } }, + ai: { + reverseOrder: true, + skillTagFilter(player) { + if ( + player.getHistory("useCard", function (evt) { + return get.type(evt.card) == "equip"; + }).length > 0 + ) + return false; + }, + effect: { + target(card, player, target) { + if ( + player == target && + get.type(card) == "equip" && + !player.getHistory("useCard", function (evt) { + return get.type(evt.card) == "equip"; + }).length + ) + return [1, 3]; + }, + }, + }, + }, + nzry_cunmu: { + audio: 2, + audioname: ["ol_pengyang"], + trigger: { + player: "drawBegin", + }, + forced: true, + content() { + trigger.bottom = true; + }, + }, + nzry_mingren: { + audio: "nzry_mingren_1", + audioname: ["sb_yl_luzhi"], + marktext: "任", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: ["nzry_mingren_1", "nzry_mingren_2"], + subSkill: { + 1: { + audio: 2, + audioname: ["sb_yl_luzhi"], + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter(event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && !player.getExpansions("nzry_mingren").length; + }, + content() { + "step 0"; + player.draw(2); + "step 1"; + if (!player.countCards("h")) event.finish(); + else + player.chooseCard("h", "将一张手牌置于武将牌上,称为“任”", true).set("ai", function (card) { + return 6 - get.value(card); + }); + "step 2"; + if (result.bool) { + player.addToExpansion(result.cards[0], player, "give", "log").gaintag.add("nzry_mingren"); + } + }, + }, + 2: { + trigger: { + player: "phaseJieshuBegin", + }, + filter(event, player) { + return player.countCards("h") > 0 && player.getExpansions("nzry_mingren").length > 0; + }, + direct: true, + content() { + "step 0"; + player.chooseCard("h", get.prompt("nzry_mingren"), "选择一张手牌替换“任”(" + get.translation(player.getExpansions("nzry_mingren")[0]) + ")").set("ai", function (card) { + var player = _status.event.player; + var color = get.color(card); + if (color == get.color(player.getExpansions("nzry_mingren")[0])) return false; + var num = 0; + var list = []; + player.countCards("h", function (cardx) { + if (cardx != card || get.color(cardx) != color) return false; + if (list.includes(cardx.name)) return false; + list.push(cardx.name); + switch (cardx.name) { + case "wuxie": + num += game.countPlayer() / 2.2; + break; + case "caochuan": + num += 1.1; + break; + case "shan": + num += 1; + break; + } + }); + return num * (30 - get.value(card)); + }); + "step 1"; + if (result.bool) { + player.logSkill("nzry_mingren"); + player.addToExpansion(result.cards[0], "log", "give", player).gaintag.add("nzry_mingren"); + var card = player.getExpansions("nzry_mingren")[0]; + if (card) player.gain(card, "gain2"); + } + }, + }, + }, + }, + nzry_zhenliang: { + audio: "nzry_zhenliang_1", + mark: true, + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content(storage, player, skill) { + if (player.storage.nzry_zhenliang == true) return "当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。"; + return "出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。"; + }, + }, + group: ["nzry_zhenliang_1", "nzry_zhenliang_2"], + subSkill: { + 1: { + prompt: "弃置一张与“任”颜色相同的牌,并对攻击范围内的一名角色造成1点伤害。", + audio: 2, + enable: "phaseUse", + filter(event, player) { + if (player.storage.nzry_zhenliang) return false; + var storage = player.getExpansions("nzry_mingren"); + if (!storage.length) return false; + var color = get.color(storage[0]); + if ( + player.countCards("he", function (card) { + return get.color(card) == color; + }) == 0 + ) + return false; + return game.hasPlayer(function (current) { + return player.inRange(current); + }); + }, + position: "he", + filterCard(card, player) { + return get.color(card) == get.color(player.getExpansions("nzry_mingren")[0]); + }, + filterTarget(card, player, target) { + return player.inRange(target); + }, + check(card) { + return 6.5 - get.value(card); + }, + content() { + player.changeZhuanhuanji("nzry_zhenliang"); + target.damage("nocard"); + }, + ai: { + order: 5, + result: { + player(player, target) { + return get.damageEffect(target, player, player); + }, + }, + }, + }, + 2: { + trigger: { + player: ["useCardAfter", "respondAfter"], + }, + filter(event, player) { + if (_status.currentPhase == player || !player.storage.nzry_zhenliang) return false; + var card = player.getExpansions("nzry_mingren")[0]; + return card && get.color(event.card) == get.color(card); + }, + direct: true, + content() { + "step 0"; + player.chooseTarget(get.prompt("nzry_zhenliang"), "令一名角色摸一张牌").ai = function (target) { + if (target.hasSkillTag("nogain")) return 0.1; + var att = get.attitude(player, target); + return att * (Math.max(5 - target.countCards("h"), 2) + 3); + }; + "step 1"; + if (result.bool) { + player.changeZhuanhuanji("nzry_zhenliang"); + player.logSkill("nzry_zhenliang", result.targets); + result.targets[0].draw(); + } + }, + }, + }, + ai: { + combo: "nzry_mingren", + }, + }, + nzry_jianxiang: { + audio: 2, + trigger: { + target: "useCardToTargeted", + }, + filter(event, player) { + return event.player != player; + }, + direct: true, + content() { + "step 0"; + player.chooseTarget(get.prompt("nzry_jianxiang"), "令场上手牌数最少的一名角色摸一张牌", function (card, player, target) { + return target.isMinHandcard(); + }).ai = function (target) { + return get.attitude(player, target); + }; + "step 1"; + if (result.bool) { + player.logSkill("nzry_jianxiang", result.targets); + result.targets[0].draw(); + } + }, + }, + nzry_shenshi: { + mark: true, + audio: "nzry_shenshi_1", + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content(storage, player, skill) { + if (player.storage.nzry_shenshi == true) return "其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张"; + return "出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张"; + }, + }, + group: ["nzry_shenshi_1", "nzry_shenshi_2"], + subSkill: { + 1: { + audio: 2, + prompt: "出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("he") > 0 && player.storage.nzry_shenshi != true; + }, + discard: false, + line: true, + lose: false, + delay: false, + position: "he", + filterCard: true, + filterTarget(card, player, target) { + return ( + target != player && + !game.hasPlayer(function (current) { + return current != player && current.countCards("h") > target.countCards("h"); + }) + ); + }, + check(card) { + return 5 - get.value(card); + }, + content() { + "step 0"; + player.changeZhuanhuanji("nzry_shenshi"); + player.give(cards, target); + target.damage("nocard"); + "step 1"; + if (!target.isIn()) { + player + .chooseTarget("令一名角色将手牌摸至四张", function (card, player, target) { + return target.countCards("h") < 4; + }) + .set("ai", function (target) { + return get.attitude(player, target); + }); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.line(result.targets); + result.targets[0].draw(4 - result.targets[0].countCards("h")); + } + }, + ai: { + order: 1, + result: { + target(player, target) { + return -1; + }, + }, + }, + }, + 2: { + audio: "nzry_shenshi_1", + trigger: { + player: "damageEnd", + }, + filter(event, player) { + return player.countCards("he") > 0 && event.source && event.source != player && player.storage.nzry_shenshi == true; + }, + check(event, player) { + return event.source && event.source.countCards("h") <= 2 && player.countCards("h") < 4; + }, + logTarget: "source", + prompt2: "其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张", + content() { + "step 0"; + player.changeZhuanhuanji("nzry_shenshi"); + player.viewHandcards(trigger.source); + player.chooseCard("he", true, "交给" + get.translation(trigger.source) + "一张牌").set("ai", function (card) { + return 5 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.give(result.cards, trigger.source); + trigger.source.storage.nzry_shenshi1 = result.cards[0]; + trigger.source.storage.nzry_shenshi2 = player; + trigger.source.addSkill("nzry_shenshi1"); + } + }, + }, + }, + }, + nzry_shenshi1: { + audio: 2, + trigger: { + global: "phaseJieshuBegin", + }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + return player.storage.nzry_shenshi1 != undefined && player.storage.nzry_shenshi2 != undefined; + }, + content() { + var pl = player.storage.nzry_shenshi2; + var card = player.storage.nzry_shenshi1; + if (player.getCards("he").includes(card) && 4 - pl.countCards("h") > 0) { + pl.draw(4 - pl.countCards("h")); + pl.logSkill("nzry_shenshi"); + } + player.removeSkill("nzry_shenshi1"); + delete player.storage.nzry_shenshi1; + delete player.storage.nzry_shenshi2; + }, + }, + xinjushou: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + content() { + "step 0"; + player.draw(4); + player.turnOver(); + "step 1"; + player + .chooseCard("h", true, "弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之") + .set("ai", function (card) { + if (get.type(card) == "equip") { + return 5 - get.value(card); + } + return -get.value(card); + }) + .set("filterCard", lib.filter.cardDiscardable); + "step 2"; + if (result.bool && result.cards.length) { + var card = result.cards[0]; + if (get.type(card) == "equip" && player.hasUseTarget(card)) { + player.chooseUseTarget(card, true, "nopopup"); + } else { + player.discard(card); + } + } + }, + ai: { + effect: { + target(card, player, target) { + if (card.name == "guiyoujie") return [0, 1]; + }, + }, + }, + }, + xinjiewei: { + audio: 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); + }, + threaten: 1.2, + group: "xinjiewei_move", + subSkill: { + move: { + trigger: { player: "turnOverEnd" }, + direct: true, + audio: "jiewei", + filter(event, player) { + return !player.isTurnedOver() && player.canMoveCard(); + }, + content() { + "step 0"; + player + .chooseToDiscard("he", get.prompt("xinjiewei"), "弃置一张牌并移动场上的一张牌", lib.filter.cardDiscardable) + .set("ai", function (card) { + if (!_status.event.check) return 0; + return 7 - get.value(card); + }) + .set("check", player.canMoveCard(true)) + .set("logSkill", "xinjiewei"); + "step 1"; + if (result.bool) { + player.moveCard(true); + } else { + event.finish(); + } + }, + }, + }, + }, + jianchu: { + shaRelated: true, + audio: 2, + audioname: ["re_pangde"], + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return event.card.name == "sha" && event.target.countDiscardableCards(player, "he") > 0; + }, + preHidden: true, + check(event, player) { + return get.attitude(player, event.target) <= 0; + }, + logTarget: "target", + content() { + "step 0"; + player + .discardPlayerCard(trigger.target, get.prompt("jianchu", trigger.target), true) + .set("ai", function (button) { + if (!_status.event.att) return 0; + if (get.position(button.link) == "e") { + if (get.subtype(button.link) == "equip2") return 2 * get.value(button.link); + return get.value(button.link); + } + return 1; + }) + .set("att", get.attitude(player, trigger.target) <= 0); + "step 1"; + if (result.bool && result.links && result.links.length) { + if (get.type(result.links[0], null, result.links[0].original == "h" ? player : false) == "equip") { + trigger.getParent().directHit.add(trigger.target); + } else if (trigger.cards) { + var list = []; + for (var i = 0; i < trigger.cards.length; i++) { + if (get.position(trigger.cards[i], true) == "o") list.push(trigger.cards[i]); + } + if (list.length) trigger.target.gain(list, "gain2", "log"); + } + } + }, + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (tag == "directHit_ai") + return ( + arg.card.name == "sha" && + arg.target.countCards("e", function (card) { + return get.value(card) > 1; + }) > 0 + ); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; + return false; + }, + }, + }, + redimeng: { + audio: "dimeng", + enable: "phaseUse", + usable: 1, + position: "he", + filterCard() { + if (ui.selected.targets.length == 2) return false; + return true; + }, + selectCard: [0, Infinity], + selectTarget: 2, + complexCard: true, + complexSelect: true, + filterTarget(card, player, target) { + if (player == target) return false; + if (ui.selected.targets.length == 0) return true; + return Math.abs(ui.selected.targets[0].countCards("h") - target.countCards("h")) == ui.selected.cards.length; + }, + multitarget: true, + multiline: true, + content() { + "step 0"; + var cards = targets[0].getCards("h").concat(targets[1].getCards("h")); + var dialog = ui.create.dialog("缔盟", true); + if (player.isUnderControl(true) || targets[0].isUnderControl(true) || targets[1].isUnderControl(true)) { + dialog.add(cards); + dialog.seeing = true; + } else { + dialog.add([cards, "blank"]); + } + _status.dieClose.push(dialog); + dialog.videoId = lib.status.videoId++; + game.addVideo("cardDialog", null, ["缔盟", get.cardsInfo(cards), dialog.videoId]); + game.broadcast( + function (cards, id, player, targets) { + var dialog = ui.create.dialog("缔盟", true); + if (player.isUnderControl(true) || targets[0].isUnderControl(true) || targets[1].isUnderControl(true)) { + dialog.add(cards); + dialog.seeing = true; + } else { + dialog.add([cards, "blank"]); + } + _status.dieClose.push(dialog); + dialog.videoId = id; + }, + cards, + dialog.videoId, + player, + targets + ); + + event.current = targets[0]; + event.dialog = dialog; + event.num1 = 0; + event.num2 = 0; + game.delay(); + "step 1"; + if (event.dialog.buttons.length > 1) { + var next = event.current.chooseButton(true, function (button) { + return get.value(button.link, _status.event.player); + }); + next.set("dialog", event.dialog.videoId); + next.set("closeDialog", false); + next.set("dialogdisplay", true); + } else { + event.directButton = event.dialog.buttons[0]; + } + "step 2"; + var dialog = event.dialog; + var card; + if (event.directButton) { + card = event.directButton.link; + } else { + card = result.links[0]; + } + for (var i = 0; i < dialog.buttons.length; i++) { + if (dialog.buttons[i].link == card) { + var button = dialog.buttons[i]; + if (dialog.seeing) { + button.querySelector(".info").innerHTML = get.translation(event.current.name); + if (!_status.connectMode) { + game.log(event.current, "选择了", button.link); + } + } + dialog.buttons.remove(button); + break; + } + } + if (card) { + event.current.gain(card); + if (dialog.seeing) { + event.current.$draw(card, "nobroadcast"); + } else { + event.current.$draw(1, "nobroadcast"); + } + game.broadcast( + function (card, id, target) { + var dialog = get.idDialog(id); + if (dialog && dialog.seeing) { + for (var i = 0; i < dialog.buttons.length; i++) { + if (dialog.buttons[i].link == card) { + dialog.buttons[i].querySelector(".info").innerHTML = get.translation(target.name); + dialog.buttons.splice(i--, 1); + break; + } + } + target.$draw(card, "nobroadcast"); + } else { + target.$draw(1, "nobroadcast"); + } + }, + card, + dialog.videoId, + event.current + ); + } + game.delay(2); + if (event.current == targets[0]) { + event.num1++; + event.current = targets[1]; + } else { + event.num2++; + event.current = targets[0]; + } + if (dialog.buttons.length) { + event.goto(1); + } + "step 3"; + if (!_status.connectMode) { + game.log(targets[0], "获得了" + get.cnNumber(event.num1) + "张牌"); + game.log(targets[1], "获得了" + get.cnNumber(event.num2) + "张牌"); + } + var dialog = event.dialog; + dialog.close(); + _status.dieClose.remove(dialog); + game.broadcast(function (id) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + _status.dieClose.remove(dialog); + } + }, dialog.videoId); + game.addVideo("cardDialog", null, dialog.videoId); + }, + targetprompt: ["先拿牌", "后拿牌"], + find(type) { + var list = game.filterPlayer(function (current) { + return current != player && get.attitude(player, current) > 3; + }); + var player = _status.event.player; + var num = player.countCards("he", function (card) { + return get.value(card) < 7; + }); + var count = null; + var from, nh; + if (list.length == 0) return null; + list.sort(function (a, b) { + return a.countCards("h") - b.countCards("h"); + }); + if (type == 1) return list[0]; + from = list[0]; + nh = from.countCards("h"); + + list = game.filterPlayer(function (current) { + return current != player && get.attitude(player, current) < 1; + }); + if (list.length == 0) return null; + list.sort(function (a, b) { + return b.countCards("h") - a.countCards("h"); + }); + for (var i = 0; i < list.length; i++) { + var nh2 = list[i].countCards("h"); + if (nh2 - nh <= num) { + count = nh2 - nh; + break; + } + } + if (count == null || count < 0) return null; + if (type == 3) return count; + return list[i]; + }, + check(card) { + var count = lib.skill.redimeng.find(3); + if (count == null) return -1; + if (ui.selected.cards.length < count) return 7 - get.value(card); + return -1; + }, + ai: { + order: 8, + threaten: 1.6, + expose: 0.5, + result: { + player(player, target) { + if (ui.selected.targets.length == 0) { + if (target == lib.skill.redimeng.find(1)) return 1; + return 0; + } else { + if (target == lib.skill.redimeng.find(2)) return 1; + return 0; + } + }, + }, + }, + }, + reluanji: { + audio: 2, + enable: "phaseUse", + viewAs: { name: "wanjian" }, + filterCard(card, player) { + if (!player.storage.reluanji) return true; + return !player.storage.reluanji.includes(get.suit(card)); + }, + position: "hs", + selectCard: 2, + check(card) { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return player.canUse("wanjian", current); + }); + var num = 0; + for (var i = 0; i < targets.length; i++) { + var eff = get.sgn(get.effect(targets[i], { name: "wanjian" }, player, player)); + if (targets[i].hp == 1) { + eff *= 1.5; + } + num += eff; + } + if (!player.needsToDiscard(-1)) { + if (targets.length >= 7) { + if (num < 2) return 0; + } else if (targets.length >= 5) { + if (num < 1.5) return 0; + } + } + return 6 - get.value(card); + }, + ai: { + basic: { + order: 8.9, + }, + }, + group: ["reluanji_count", "reluanji_reset", "reluanji_respond", "reluanji_damage", "reluanji_draw"], + subSkill: { + reset: { + trigger: { player: "phaseAfter" }, + silent: true, + content() { + delete player.storage.reluanji; + delete player.storage.reluanji2; + }, + }, + count: { + trigger: { player: "useCard" }, + silent: true, + filter(event) { + return event.skill == "reluanji"; + }, + content() { + player.storage.reluanji2 = trigger.card; + if (!player.storage.reluanji) { + player.storage.reluanji = []; + } + for (var i = 0; i < trigger.cards.length; i++) { + player.storage.reluanji.add(get.suit(trigger.cards[i])); + } + }, + }, + respond: { + trigger: { global: "respond" }, + silent: true, + filter(event) { + return event.getParent(2).skill == "reluanji"; + }, + content() { + trigger.player.draw(); + }, + }, + damage: { + trigger: { source: "damage" }, + forced: true, + silent: true, + popup: false, + filter(event, player) { + return player.storage.reluanji2 && event.card == player.storage.reluanji2; + }, + content() { + delete player.storage.reluanji2; + }, + }, + draw: { + trigger: { player: "useCardAfter" }, + forced: true, + silent: true, + popup: false, + filter(event, player) { + return player.storage.reluanji2 && event.card == player.storage.reluanji2; + }, + content() { + player.draw(trigger.targets.length); + delete player.storage.reluanji2; + }, + }, + }, + }, + qimou: { + unique: true, + limited: true, + audio: 2, + enable: "phaseUse", + filter(event, player) { + return !player.storage.qimou; + }, + init(player) { + player.storage.qimou = false; + }, + mark: true, + intro: { + content: "limited", + }, + skillAnimation: true, + animationColor: "orange", + content() { + "step 0"; + var shas = player.getCards("h", "sha"); + var num; + if (player.hp >= 4 && shas.length >= 3) { + num = 3; + } else if (player.hp >= 3 && shas.length >= 2) { + num = 2; + } else { + num = 1; + } + var map = {}; + var list = []; + for (var i = 1; i <= player.hp; i++) { + var cn = get.cnNumber(i, true); + map[cn] = i; + list.push(cn); + } + event.map = map; + player.awakenSkill("qimou"); + player.storage.qimou = true; + player + .chooseControl(list, function () { + return get.cnNumber(_status.event.goon, true); + }) + .set("prompt", "失去任意点体力") + .set("goon", num); + "step 1"; + var num = event.map[result.control] || 1; + player.storage.qimou2 = num; + player.loseHp(num); + player.addTempSkill("qimou2"); + }, + ai: { + order: 2, + result: { + player(player) { + if (player.hp == 1) return 0; + var shas = player.getCards("h", "sha"); + if (!shas.length) return 0; + var card = shas[0]; + if (!lib.filter.cardEnabled(card, player)) return 0; + if (lib.filter.cardUsable(card, player)) return 0; + var mindist; + if (player.hp >= 4 && shas.length >= 3) { + mindist = 4; + } else if (player.hp >= 3 && shas.length >= 2) { + mindist = 3; + } else { + mindist = 2; + } + if ( + game.hasPlayer(function (current) { + return current.hp <= mindist - 1 && get.distance(player, current, "attack") <= mindist && player.canUse(card, current, false) && get.effect(current, card, player, player) > 0; + }) + ) { + return 1; + } + return 0; + }, + }, + }, + }, + qimou2: { + onremove: true, + mod: { + cardUsable(card, player, num) { + if (typeof player.storage.qimou2 == "number" && card.name == "sha") { + return num + player.storage.qimou2; + } + }, + globalFrom(from, to, distance) { + if (typeof from.storage.qimou2 == "number") { + return distance - from.storage.qimou2; + } + }, + }, + }, + xinkuanggu: { + audio: "kuanggu", + audioname: ["re_weiyan", "ol_weiyan"], + trigger: { source: "damageSource" }, + filter(event, player) { + return event.kuangguCheck && event.num > 0; + }, + direct: true, + preHidden: true, + content() { + "step 0"; + event.num = trigger.num; + "step 1"; + var choice; + if ( + player.isDamaged() && + get.recoverEffect(player) > 0 && + player.countCards("hs", function (card) { + return card.name == "sha" && player.hasValueTarget(card); + }) >= player.getCardUsable("sha") + ) { + choice = "recover_hp"; + } else { + choice = "draw_card"; + } + var next = player.chooseDrawRecover("###" + get.prompt(event.name) + "###摸一张牌或回复1点体力").set("logSkill", event.name); + next.set("choice", choice); + next.set("ai", function () { + return _status.event.getParent().choice; + }); + next.setHiddenSkill("xinkuanggu"); + "step 2"; + if (result.control != "cancel2") { + event.num--; + if (event.num > 0 && player.hasSkill("xinkuanggu")) { + event.goto(1); + } + } + }, + group: "kuanggu_check", + }, + xinliegong: { + shaRelated: true, + mod: { + aiOrder(player, card, num) { + if (num > 0 && (card.name === "sha" || get.tag(card, "draw"))) return num + 6; + }, + targetInRange(card, player, target) { + if (card.name == "sha" && typeof get.number(card) == "number") { + if (get.distance(player, target) <= get.number(card)) return true; + } + }, + }, + audio: "liegong", + audioname: ["re_huangzhong", "ol_huangzhong"], + trigger: { player: "useCardToTargeted" }, + logTarget: "target", + locked: false, + check(event, player) { + return get.attitude(player, event.target) <= 0; + }, + filter(event, player) { + if (event.card.name != "sha") return false; + if (event.target.countCards("h") <= player.countCards("h")) return true; + if (event.target.hp >= player.hp) return true; + return false; + }, + content() { + if (trigger.target.countCards("h") <= player.countCards("h")) trigger.getParent().directHit.push(trigger.target); + if (trigger.target.hp >= player.hp) { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") { + map[id].extraDamage = 0; + } + map[id].extraDamage++; + } + }, + ai: { + threaten: 0.5, + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if ( + get.attitude(player, arg.target) <= 0 && + arg.card.name == "sha" && + player.countCards("h", function (card) { + return card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)); + }) >= arg.target.countCards("h") + ) + return true; + return false; + }, + }, + }, + tiaoxin: { + audio: 2, + audioname: ["sp_jiangwei", "xiahouba", "re_jiangwei", "gz_jiangwei", "ol_jiangwei"], + audioname2: { + dc_xiahouba: "tiaoxin_xiahouba", + }, + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.inRange(player) && target.countCards("he") > 0; + }, + content() { + "step 0"; + 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); + "step 1"; + if (result.bool == false && target.countCards("he") > 0) { + player.discardPlayerCard(target, "he", true); + } else { + event.finish(); + } + }, + ai: { + order: 4, + expose: 0.2, + result: { + target: -1, + player(player, target) { + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; + return -0.5; + }, + }, + threaten: 1.1, + }, + }, + tiaoxin_xiahouba: { audio: 2 }, + zhiji: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + audioname: ["re_jiangwei"], + unique: true, + juexingji: true, + //priority:-10, + derivation: "reguanxing", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter(event, player) { + if (player.storage.zhiji) return false; + return player.countCards("h") == 0; + }, + content() { + "step 0"; + player.awakenSkill("zhiji"); + player.chooseDrawRecover(2, true); + "step 1"; + player.loseMaxHp(); + player.addSkills("reguanxing"); + }, + }, + xiangle: { + audio: 2, + audioname: ["re_liushan", "ol_liushan"], + trigger: { target: "useCardToTargeted" }, + forced: true, + preHidden: true, + filter(event, player) { + return event.card.name == "sha"; + }, + content() { + "step 0"; + var eff = get.effect(player, trigger.card, trigger.player, trigger.player); + trigger.player + .chooseToDiscard("享乐:弃置一张基本牌,否则杀对" + get.translation(player) + "无效", function (card) { + return get.type(card) == "basic"; + }) + .set("ai", function (card) { + if (_status.event.eff > 0) { + return 10 - get.value(card); + } + return 0; + }) + .set("eff", eff); + "step 1"; + if (result.bool == false) { + trigger.getParent().excluded.add(player); + } + }, + ai: { + effect: { + target_use(card, player, target, current) { + if (card.name == "sha" && get.attitude(player, target) < 0) { + if (_status.event.name == "xiangle") return; + if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; + var bs = player.getCards("h", { type: "basic" }); + bs.remove(card); + if (card.cards) bs.removeArray(card.cards); + else bs.removeArray(ui.selected.cards); + if (!bs.length) return "zerotarget"; + if (player.hasSkill("jiu") || player.hasSkill("tianxianjiu")) return; + if (bs.length <= 2) { + for (var i = 0; i < bs.length; i++) { + if (get.value(bs[i]) < 7) { + return [1, 0, 1, -0.5]; + } + } + return [1, 0, 0.3, 0]; + } + return [1, 0, 1, -0.5]; + } + }, + }, + }, + }, + fangquan: { + audio: 2, + trigger: { player: "phaseUseBefore" }, + filter(event, player) { + return player.countCards("h") > 0 && !player.hasSkill("fangquan3"); + }, + direct: true, + preHidden: true, + content() { + "step 0"; + var fang = player.countMark("fangquan2") == 0 && player.hp >= 2 && player.countCards("h") <= player.hp + 1; + player + .chooseBool(get.prompt2("fangquan")) + .set("ai", function () { + if (!_status.event.fang) return false; + return game.hasPlayer(function (target) { + if (target.hasJudge("lebu") || target == player) return false; + if (get.attitude(player, target) > 4) { + return get.threaten(target) / Math.sqrt(target.hp + 1) / Math.sqrt(target.countCards("h") + 1) > 0; + } + return false; + }); + }) + .set("fang", fang) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + player.logSkill("fangquan"); + trigger.cancel(); + player.addTempSkill("fangquan2"); + player.addMark("fangquan2", 1, false); + //player.storage.fangquan=result.targets[0]; + } + }, + }, + fangquan2: { + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + audio: false, + //priority:-50, + onremove: true, + content() { + "step 0"; + event.count = player.countMark(event.name); + player.removeMark(event.name, event.count); + "step 1"; + event.count--; + player.chooseToDiscard("是否弃置一张牌并令一名其他角色进行一个额外回合?").set("logSkill", player.name == "re_liushan" ? "refangquan" : "fangquan").ai = function (card) { + return 20 - get.value(card); + }; + "step 2"; + if (result.bool) { + player.chooseTarget(true, "请选择进行额外回合的目标角色", lib.filter.notMe).ai = function (target) { + if (target.hasJudge("lebu") || get.attitude(player, target) <= 0) return -1; + if (target.isTurnedOver()) return 0.18; + return get.threaten(target) / Math.sqrt(target.hp + 1) / Math.sqrt(target.countCards("h") + 1); + }; + } else event.finish(); + "step 3"; + var target = result.targets[0]; + player.line(target, "fire"); + target.markSkillCharacter("fangquan", player, "放权", "进行一个额外回合"); + target.insertPhase(); + target.addSkill("fangquan3"); + if (event.count > 0) event.goto(1); + }, + }, + fangquan3: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + audio: false, + content() { + player.unmarkSkill("fangquan"); + player.removeSkill("fangquan3"); + }, + }, + ruoyu: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + audioname: ["re_liushan"], + unique: true, + juexingji: true, + zhuSkill: true, + keepSkill: true, + derivation: "rejijiang", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter(event, player) { + return player.isMinHp(); + }, + content() { + "step 0"; + player.awakenSkill("ruoyu"); + player.gainMaxHp(); + player.recover(); + "step 1"; + player.addSkills("rejijiang"); + }, + }, + qiaobian: { + audio: 2, + trigger: { + player: ["phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore"], + }, + filter(event, player) { + return player.countCards("h") > 0; + }, + direct: true, + preHidden: true, + content() { + "step 0"; + var check, + str = "弃置一张手牌并跳过"; + str += ["判定", "摸牌", "出牌", "弃牌"][lib.skill.qiaobian.trigger.player.indexOf(event.triggername)]; + str += "阶段"; + if (trigger.name == "phaseDraw") str += ",然后可以获得至多两名角色各一张手牌"; + if (trigger.name == "phaseUse") str += ",然后可以移动场上的一张牌"; + switch (trigger.name) { + case "phaseJudge": + check = player.countCards("j"); + break; + case "phaseDraw": + var i, + num = 0, + num2 = 0, + players = game.filterPlayer(); + for (i = 0; i < players.length; i++) { + if (player != players[i] && players[i].countCards("h")) { + var att = get.attitude(player, players[i]); + if (att <= 0) { + num++; + } + if (att < 0) { + num2++; + } + } + } + check = num >= 2 && num2 > 0; + break; + case "phaseUse": + if (!player.canMoveCard(true)) { + check = false; + } else { + check = game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 && current.countCards("j"); + }); + if (!check) { + if (player.countCards("h") > player.hp + 1) { + check = false; + } else if (player.countCards("h", { name: "wuzhong" })) { + check = false; + } else { + check = true; + } + } + } + break; + case "phaseDiscard": + check = player.needsToDiscard(); + break; + } + player + .chooseToDiscard(get.prompt("qiaobian"), str, lib.filter.cardDiscardable) + .set("ai", card => { + if (!_status.event.check) return -1; + return 7 - get.value(card); + }) + .set("check", check) + .set("logSkill", "qiaobian") + .setHiddenSkill("qiaobian"); + "step 1"; + if (result.bool) { + trigger.cancel(); + game.log(player, "跳过了", "#y" + ["判定", "摸牌", "出牌", "弃牌"][lib.skill.qiaobian.trigger.player.indexOf(event.triggername)] + "阶段"); + if (trigger.name == "phaseUse") { + if (player.canMoveCard()) player.moveCard(); + event.finish(); + } else if (trigger.name == "phaseDraw") { + player + .chooseTarget([1, 2], "获得至多两名角色各一张手牌", function (card, player, target) { + return target != player && target.countCards("h"); + }) + .set("ai", function (target) { + return 1 - get.attitude(_status.event.player, target); + }); + } else event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) { + result.targets.sortBySeat(); + player.line(result.targets, "green"); + event.targets = result.targets; + if (!event.targets.length) event.finish(); + } else event.finish(); + "step 3"; + player.gainMultiple(event.targets); + "step 4"; + game.delay(); + }, + ai: { threaten: 3 }, + }, + tuntian: { + audio: 2, + audioname: ["gz_dengai"], + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + frequent: true, + preHidden: true, + filter(event, player) { + if (player == _status.currentPhase) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; + }, + content() { + "step 0"; + var next = player.judge(function (card) { + if (get.suit(card) == "heart") return -1; + return 1; + }); + next.judge2 = function (result) { + return result.bool; + }; + if (get.mode() != "guozhan") { + next.callback = lib.skill.tuntian.callback; + event.finish(); + } + "step 1"; + if (!result.bool || get.position(result.card) != "d") { + //game.cardsDiscard(card); + event.finish(); + return; + } + event.card = result.card; + player.chooseBool("是否将" + get.translation(event.card) + "作为“田”置于武将牌上?").ai = function () { + return true; + }; + "step 2"; + if (!result.bool && !event.directbool) { + return; + } + player.addToExpansion(event.card, "gain2").gaintag.add("tuntian"); + }, + callback() { + if (!event.judgeResult.bool) { + event.finish(); + return; + } + player.addToExpansion(event.judgeResult.card, "gain2").gaintag.add("tuntian"); + }, + marktext: "田", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "tuntian_dist", + locked: false, + subSkill: { + dist: { + locked: false, + mod: { + globalFrom(from, to, distance) { + var num = distance - from.getExpansions("tuntian").length; + if (_status.event.skill == "jixi_backup" || _status.event.skill == "gzjixi_backup") num++; + return num; + }, + }, + }, + }, + ai: { + effect: { + target(card, player, target, current) { + if ( + typeof card === "object" && + get.name(card) === "sha" && + target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return [0.6, 0.75]; + if (!target.hasFriend() && !player.hasUnknown()) return; + if (_status.currentPhase == target || get.type(card) === "delay") return; + if (card.name != "shuiyanqijunx" && get.tag(card, "loseCard") && target.countCards("he")) { + if (target.hasSkill("ziliang")) return 0.7; + return [0.5, Math.max(2, target.countCards("h"))]; + } + if (target.isUnderControl(true, player)) { + if ((get.tag(card, "respondSha") && target.countCards("h", "sha")) || (get.tag(card, "respondShan") && target.countCards("h", "shan"))) { + if (target.hasSkill("ziliang")) return 0.7; + return [0.5, 1]; + } + } else if (get.tag(card, "respondSha") || get.tag(card, "respondShan")) { + if (get.attitude(player, target) > 0 && card.name == "juedou") return; + if (get.tag(card, "damage") && target.hasSkillTag("maixie")) return; + if (target.countCards("h") == 0) return 2; + if (target.hasSkill("ziliang")) return 0.7; + if (get.mode() == "guozhan") return 0.5; + return [0.5, Math.max(target.countCards("h") / 4, target.countCards("h", "sha") + target.countCards("h", "shan"))]; + } + }, + }, + threaten(player, target) { + if (target.countCards("h") == 0) return 2; + return 0.5; + }, + nodiscard: true, + nolose: true, + }, + }, + zaoxian: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + audioname: ["re_dengai"], + unique: true, + juexingji: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter(event, player) { + return player.getExpansions("tuntian").length >= 3; + }, + derivation: "jixi", + content() { + player.awakenSkill("zaoxian"); + player.loseMaxHp(); + player.addSkills("jixi"); + }, + ai: { + combo: "tuntian", + }, + }, + jixi: { + audio: 2, + audioname: ["re_dengai", "gz_dengai", "ol_dengai"], + enable: "phaseUse", + filter(event, player) { + return player.getExpansions("tuntian").length > 0 && event.filterCard({ name: "shunshou" }, player, event); + }, + chooseButton: { + dialog(event, player) { + return ui.create.dialog("急袭", player.getExpansions("tuntian"), "hidden"); + }, + filter(button, player) { + var card = button.link; + if (!game.checkMod(card, player, "unchanged", "cardEnabled2", player)) return false; + var evt = _status.event.getParent(); + return evt.filterCard(get.autoViewAs({ name: "shunshou" }, [card]), player, evt); + }, + backup(links, player) { + var skill = _status.event.buttoned; + return { + audio: "jixi", + audioname: ["re_dengai", "gz_dengai", "ol_dengai"], + selectCard: -1, + position: "x", + filterCard: skill == "jixi" ? card => card == lib.skill.jixi_backup.card : card => card == lib.skill.gzjixi_backup.card, + viewAs: { name: "shunshou" }, + card: links[0], + }; + }, + prompt(links, player) { + return "选择 顺手牵羊(" + get.translation(links[0]) + ")的目标"; + }, + }, + ai: { + order: 10, + result: { + player(player) { + return player.getExpansions("tuntian").length - 1; + }, + }, + combo: "tuntian", + }, + }, + jiang: { + shaRelated: true, + audio: 2, + preHidden: true, + audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], + mod: { + aiOrder(player, card, num) { + if (get.color(card) === "red" && get.name(card) === "sha") return get.order({ name: "sha" }) + 0.15; + }, + }, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + filter(event, player) { + if (!(event.card.name == "juedou" || (event.card.name == "sha" && get.color(event.card) == "red"))) return false; + return player == event.target || event.getParent().triggeredTargets3.length == 1; + }, + locked: false, + frequent: true, + content() { + player.draw(); + }, + ai: { + effect: { + target(card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; + }, + player(card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 1]; + }, + }, + }, + }, + hunzi: { + //audioname:['re_sunben'], + skillAnimation: true, + animationColor: "wood", + audio: 2, + juexingji: true, + derivation: ["reyingzi", "gzyinghun"], + unique: true, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return player.hp <= 1 && !player.storage.hunzi; + }, + forced: true, + //priority:3, + content() { + player.awakenSkill(event.name); + player.loseMaxHp(); + player.addSkills(["reyingzi", "gzyinghun"]); + }, + ai: { + threaten(player, target) { + if (target.hp == 1) return 2; + return 0.5; + }, + maixie: true, + effect: { + target(card, player, target) { + if (!target.hasFriend()) return; + if (target.hp === 2 && get.tag(card, "damage") == 1 && !target.isTurnedOver() && _status.currentPhase !== target && get.distance(_status.currentPhase, target, "absolute") <= 3) return [0.5, 1]; + if (target.hp === 1 && get.tag(card, "recover") && !target.isTurnedOver() && _status.currentPhase !== target && get.distance(_status.currentPhase, target, "absolute") <= 3) return [1, -3]; + }, + }, + }, + }, + zhiba: { + unique: true, + global: "zhiba2", + audioname: ["re_sunben"], + audio: "zhiba2", + zhuSkill: true, + }, + zhiba2: { + audio: 2, + audioname: ["re_sunben"], + //forceaudio:true, + enable: "phaseUse", + prompt() { + var player = _status.event.player; + var list = game.filterPlayer(function (target) { + return target.hasZhuSkill("zhiba", player) && player.canCompare(target); + }); + var str = "和" + get.translation(list); + if (list.length > 1) str += "中的一人"; + str += "进行拼点。若你没赢,其可以获得两张拼点牌。"; + return str; + }, + filter(event, player) { + if (player.group != "wu" || player.countCards("h") == 0) return false; + return game.hasPlayer(function (target) { + return target.hasZhuSkill("zhiba", player) && player.canCompare(target); + }); + }, + filterTarget(card, player, target) { + return target.hasZhuSkill("zhiba", player) && player.canCompare(target); + }, + log: false, + prepare(cards, player, targets) { + targets[0].logSkill("zhiba"); + }, + usable: 1, + content() { + "step 0"; + if (target.storage.hunzi || target.storage.rehunzi) { + target + .chooseControl("拒绝", "不拒绝") + .set("prompt", "是否拒绝制霸拼点?") + .set("choice", get.attitude(target, player) <= 0); + } else { + event.forced = true; + } + "step 1"; + if (!event.forced && result.control == "拒绝") { + game.log(target, "拒绝了拼点"); + target.chat("拒绝"); + event.finish(); + return; + } + player + .chooseToCompare(target, function (card) { + if (card.name == "du") return 20; + var player = get.owner(card); + var target = _status.event.getParent().target; + if (player != target && get.attitude(player, target) > 0) { + return -get.number(card); + } + return get.number(card); + }) + .set("preserve", "lose"); + "step 2"; + if (result.bool == false) { + var list = []; + if (get.position(result.player) == "d") list.push(result.player); + if (get.position(result.target) == "d") list.push(result.target); + if (!list.length) event.finish(); + else { + event.list = list; + target.chooseBool("是否获得" + get.translation(list) + "?").ai = function () { + return get.value(list) > 0; + }; + } + } else event.finish(); + "step 3"; + if (result.bool) target.gain(event.list, "gain2"); + }, + ai: { + basic: { + order: 1, + }, + expose: 0.2, + result: { + target(player, target) { + if (player.countCards("h", "du") && get.attitude(player, target) < 0) return -1; + if (player.countCards("h") <= player.hp) return 0; + var maxnum = 0; + var cards2 = target.getCards("h"); + for (var i = 0; i < cards2.length; i++) { + if (get.number(cards2[i]) > maxnum) { + maxnum = get.number(cards2[i]); + } + } + if (maxnum > 10) maxnum = 10; + if (maxnum < 5 && cards2.length > 1) maxnum = 5; + var cards = player.getCards("h"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) < maxnum) return 1; + } + return 0; + }, + }, + }, + }, + zhijian: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countCards("h", { type: "equip" }) > 0; + }, + filterCard(card) { + return get.type(card) == "equip"; + }, + check(card) { + var player = _status.currentPhase; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); + } + return 6 - get.value(card); + }, + filterTarget(card, player, target) { + if (target.isMin()) return false; + return player != target && target.canEquip(card); + }, + async content(event, trigger, player) { + event.target.equip(event.cards[0]); + player.draw(); + }, + discard: false, + lose: false, + prepare(cards, player, targets) { + player.$give(cards, targets[0], false); + }, + ai: { + basic: { + order: 10, + }, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (card) return get.effect(target, card, target, target); + return 0; + }, + }, + threaten: 1.3, + }, + }, + guzheng: { + audio: 2, + audioname: ["re_zhangzhang"], + trigger: { global: "phaseDiscardAfter" }, + filter(event, player) { + if (event.player != player && event.player.isIn()) { + return ( + event.player.getHistory("lose", function (evt) { + return evt.type == "discard" && evt.getParent("phaseDiscard") == event && evt.hs.someInD("d"); + }).length > 0 + ); + } + return false; + }, + checkx(event, player, cards, cards2) { + if (cards.length > 2 || get.attitude(player, event.player) > 0) return true; + for (var i = 0; i < cards2.length; i++) { + if (get.value(cards2[i], event.player, "raw") < 0) return true; + } + return false; + }, + direct: true, + preHidden: true, + content() { + "step 0"; + var cards = [], + cards2 = []; + var target = trigger.player; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name == "cardsDiscard") { + if (evt.getParent("phaseDiscard") == trigger) { + var moves = evt.cards.filterInD("d"); + cards.addArray(moves); + cards2.removeArray(moves); + } + } + if (evt.name == "lose") { + if (evt.type != "discard" || evt.position != ui.discardPile || evt.getParent("phaseDiscard") != trigger) return; + var moves = evt.cards.filterInD("d"); + cards.addArray(moves); + if (evt.player == target) cards2.addArray(moves); + else cards2.removeArray(moves); + } + }); + if (!cards2.length) event.finish(); + else if (cards.length == 1) { + event.card = cards[0]; + player + .chooseBool() + .set("createDialog", [get.prompt("guzheng", target), '点击“确认”以令其收回此牌', cards]) + .set("choice", lib.skill.guzheng.checkx(trigger, player, cards, cards2)) + .set("ai", function () { + return _status.event.choice; + }) + .setHiddenSkill("guzheng"); + } else { + player + .chooseButton(2, [get.prompt("guzheng", target), '被选择的牌将成为对方收回的牌', cards, [["获得剩余的牌", "放弃剩余的牌"], "tdnodes"]]) + .set("filterButton", function (button) { + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) return false; + return type == "string" || _status.event.allowed.includes(button.link); + }) + .set("allowed", cards2) + .set("check", lib.skill.guzheng.checkx(trigger, player, cards, cards2)) + .set("ai", function (button) { + if (typeof button.link == "string") { + return button.link == "获得剩余的牌" ? 1 : 0; + } + if (_status.event.check) { + return 20 - get.value(button.link, _status.event.getTrigger().player); + } + return 0; + }) + .setHiddenSkill("guzheng"); + } + "step 1"; + if (result.bool) { + var target = trigger.player; + player.logSkill("guzheng", target); + if (!result.links || !result.links.length) { + target.gain(card, "gain2").giver = player; + } else { + if (typeof result.links[0] != "string") result.links.reverse(); + var card = result.links[1]; + target.gain(card, "gain2").giver = player; + if (result.links[0] != "获得剩余的牌") event.finish(); + } + } else event.finish(); + "step 2"; + //避免插入结算改变弃牌堆 重新判断一次 + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name == "cardsDiscard") { + if (evt.getParent("phaseDiscard") == trigger) { + var moves = evt.cards.filterInD("d"); + cards.addArray(moves); + } + } + if (evt.name == "lose") { + if (evt.type != "discard" || evt.position != ui.discardPile || evt.getParent("phaseDiscard") != trigger) return; + var moves = evt.cards.filterInD("d"); + cards.addArray(moves); + } + }); + if (cards.length > 0) player.gain(cards, "gain2"); + }, + ai: { + threaten: 1.3, + expose: 0.2, + }, + }, + beige: { + audio: 2, + audioname: ["re_caiwenji", "ol_caiwenji"], + trigger: { global: "damageEnd" }, + filter(event, player) { + return event.card && event.card.name == "sha" && event.source && event.player.isIn() && player.countCards("he"); + }, + direct: true, + checkx(event, player) { + var att1 = get.attitude(player, event.player); + var att2 = get.attitude(player, event.source); + return att1 > 0 && att2 <= 0; + }, + preHidden: true, + content() { + "step 0"; + var next = player.chooseToDiscard("he", get.prompt2("beige", trigger.player)); + var check = lib.skill.beige.checkx(trigger, player); + next.set("ai", function (card) { + if (_status.event.goon) return 8 - get.value(card); + return 0; + }); + next.set("logSkill", "beige"); + next.set("goon", check); + next.setHiddenSkill("beige"); + "step 1"; + if (result.bool) { + trigger.player.judge(); + } else { + event.finish(); + } + "step 2"; + switch (result.suit) { + case "heart": + trigger.player.recover(); + break; + case "diamond": + trigger.player.draw(2); + break; + case "club": + trigger.source.chooseToDiscard("he", 2, true); + break; + case "spade": + trigger.source.turnOver(); + break; + } + }, + ai: { + expose: 0.3, + }, + }, + duanchang: { + audio: 2, + audioname: ["re_caiwenji", "ol_caiwenji"], + forbid: ["boss"], + trigger: { player: "die" }, + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "gray", + filter(event) { + return event.source && event.source.isIn(); + }, + content() { + trigger.source.clearSkills(); + }, + logTarget: "source", + ai: { + maixie_defend: true, + threaten(player, target) { + if (target.hp == 1) return 0.2; + return 1.5; + }, + effect: { + target(card, player, target, current) { + if (!target.hasFriend()) return; + if (target.hp <= 1 && get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return 3; + return [1, 0, 0, -3 * get.threaten(player)]; + } + }, + }, + }, + }, + huashen: { + audio: "huashen2", + unique: true, + init(player) { + if (!player.storage.huashen) { + player.storage.huashen = { + owned: {}, + }; + } + player.when("dieBegin").then(() => { + const name = player.name ? player.name : player.name1; + if (name) { + const sex = get.character(name, 0); + const group = get.character(name, 1); + if (player.sex != sex) { + game.broadcastAll( + (player, sex) => { + player.sex = sex; + }, + player, + sex + ); + game.log(player, "将性别变为了", "#y" + get.translation(sex) + "性"); + } + if (player.group != group) player.changeGroup(group); + } + }); + }, + intro: { + content(storage, player) { + var str = ""; + var list = Object.keys(storage.owned); + if (list.length) { + str += get.translation(list[0]); + for (var i = 1; i < list.length; i++) { + str += "、" + get.translation(list[i]); + } + } + var skill = player.storage.huashen.current2; + if (skill) { + str += "

    当前技能:" + get.translation(skill); + } + return str; + }, + onunmark(storage, player) { + _status.characterlist.addArray(Object.keys(storage.owned)); + storage.owned = []; + }, + mark(dialog, content, player) { + var list = Object.keys(content.owned); + if (list.length) { + var skill = player.storage.huashen.current2; + var character = player.storage.huashen.current; + if (skill && character) { + dialog.addSmall([[character], (item, type, position, noclick, node) => lib.skill.rehuashen.$createButton(item, type, position, noclick, node)]); + dialog.add('

    【' + get.translation(lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2)) + "】
    " + "
    " + get.skillInfoTranslation(skill, player) + "
    "); + } + if (player.isUnderControl(true)) { + dialog.addSmall([list, (item, type, position, noclick, node) => lib.skill.rehuashen.$createButton(item, type, position, noclick, node)]); + } else { + dialog.addText("共有" + get.cnNumber(list.length) + "张“化身”"); + } + } else { + return "没有化身"; + } + }, + }, + addHuashen(player) { + if (!player.storage.huashen) return; + if (!_status.characterlist) { + lib.skill.pingjian.initList(); + } + _status.characterlist.randomSort(); + for (var i = 0; i < _status.characterlist.length; i++) { + let name = _status.characterlist[i]; + if (name.indexOf("zuoci") != -1 || name.indexOf("key_") == 0 || name.indexOf("sp_key_") == 0 || lib.skill.rehuashen.banned.includes(name) || player.storage.huashen.owned[name]) continue; + let skills = lib.character[name][3].filter(skill => { + const categories = get.skillCategoriesOf(skill); + return !categories.some(type => lib.skill.rehuashen.bannedType.includes(type)); + }); + if (skills.length) { + player.storage.huashen.owned[name] = skills; + _status.characterlist.remove(name); + return name; + } + } + }, + addHuashens(player, num) { + var list = []; + for (var i = 0; i < num; i++) { + var name = lib.skill.huashen.addHuashen(player); + if (name) list.push(name); + } + if (list.length) { + player.syncStorage("huashen"); + player.markSkill("huashen"); + game.log(player, "获得了", get.cnNumber(list.length) + "张", "#g化身"); + lib.skill.rehuashen.drawCharacter(player, list); + } + }, + trigger: { + global: "phaseBefore", + player: ["enterGame", "phaseBegin", "phaseEnd"], + }, + filter(event, player, name) { + if (event.name != "phase") return true; + if (name == "phaseBefore") return game.phaseNumber == 0; + return !get.is.empty(player.storage.huashen.owned); + }, + direct: true, + content() { + "step 0"; + var name = event.triggername; + if (trigger.name != "phase" || (name == "phaseBefore" && game.phaseNumber == 0)) { + player.logSkill("huashen"); + lib.skill.huashen.addHuashens(player, 2); + event.logged = true; + } + var cards = []; + var skills = []; + for (var i in player.storage.huashen.owned) { + cards.push(i); + skills.addArray(player.storage.huashen.owned[i]); + } + var cond = event.triggername == "phaseBegin" ? "in" : "out"; + skills.randomSort(); + skills.sort(function (a, b) { + return get.skillRank(b, cond) - get.skillRank(a, cond); + }); + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + _status.imchoosing = false; + var skill = skills[0], + character; + for (var i in player.storage.huashen.owned) { + if (player.storage.huashen.owned[i].includes(skill)) { + character = i; + break; + } + } + event._result = { + bool: true, + skill: skill, + character: character, + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + }; + var chooseButton = function (player, list, forced) { + var event = _status.event; + player = player || event.player; + if (!event._result) event._result = {}; + var prompt = forced ? "化身:选择获得一项技能" : get.prompt("huashen"); + var dialog = ui.create.dialog(prompt, [list, (item, type, position, noclick, node) => lib.skill.rehuashen.$createButton(item, type, position, noclick, node)]); + event.dialog = dialog; + event.forceMine = true; + event.button = null; + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("pointerdiv"); + event.dialog.buttons[i].classList.add("selectable"); + } + event.dialog.open(); + event.custom.replace.button = function (button) { + if (!event.dialog.contains(button.parentNode)) return; + if (event.control) event.control.style.opacity = 1; + if (button.classList.contains("selectedx")) { + event.button = null; + button.classList.remove("selectedx"); + if (event.control) { + event.control.replacex(["cancel2"]); + } + } else { + if (event.button) { + event.button.classList.remove("selectedx"); + } + button.classList.add("selectedx"); + event.button = button; + if (event.control && button.link) { + event.control.replacex(player.storage.huashen.owned[button.link]); + } + } + game.check(); + }; + event.custom.replace.window = function () { + if (event.button) { + event.button.classList.remove("selectedx"); + event.button = null; + } + event.control.replacex(["cancel2"]); + }; + + event.switchToAuto = function () { + var cards = []; + var skills = []; + for (var i in player.storage.huashen.owned) { + cards.push(i); + skills.addArray(player.storage.huashen.owned[i]); + } + var cond = event.triggername == "phaseBegin" ? "in" : "out"; + skills.randomSort(); + skills.sort(function (a, b) { + return get.skillRank(b, cond) - get.skillRank(a, cond); + }); + _status.imchoosing = false; + var skill = skills[0], + character; + for (var i in player.storage.huashen.owned) { + if (player.storage.huashen.owned[i].includes(skill)) { + character = i; + break; + } + } + event._result = { + bool: true, + skill: skill, + character: character, + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + }; + var controls = []; + event.control = ui.create.control(); + event.control.replacex = function () { + var args = Array.from(arguments)[0]; + if (args.includes("cancel2") && forced) { + args.remove("cancel2"); + this.style.opacity = ""; + } + args.push(function (link) { + var result = event._result; + if (link == "cancel2") result.bool = false; + else { + if (!event.button) return; + result.bool = true; + result.skill = link; + result.character = event.button.link; + } + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }); + return this.replace.apply(this, args); + }; + if (!forced) { + controls.push("cancel2"); + event.control.style.opacity = 1; + } + event.control.replacex(controls); + game.pause(); + game.countChoose(); + }; + if (event.isMine()) { + chooseButton(player, cards, event.logged); + } else if (event.isOnline()) { + event.player.send(chooseButton, event.player, cards, event.logged); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 1"; + var map = event.result || result; + if (map.bool) { + if (!event.logged) player.logSkill("huashen"); + var skill = map.skill, + character = map.character; + if (character != player.storage.huashen.current) { + const old = player.storage.huashen.current; + player.storage.huashen.current = character; + player.markSkill("huashen"); + game.broadcastAll( + function (player, character, old) { + player.tempname.remove(old); + player.tempname.add(character); + player.sex = lib.character[character][0]; + //player.group=lib.character[character][1]; + //player.node.name.dataset.nature=get.groupnature(player.group); + var mark = player.marks.huashen; + if (mark) { + mark.style.transition = "all 0.3s"; + setTimeout(function () { + mark.style.transition = "all 0s"; + ui.refresh(mark); + mark.setBackground(character, "character"); + if (mark.firstChild) { + mark.firstChild.remove(); + } + setTimeout(function () { + mark.style.transition = ""; + mark.show(); + }, 50); + }, 200); + } + }, + player, + character, + old + ); + game.log(player, "将性别变为了", "#y" + get.translation(lib.character[character][0]) + "性"); + player.changeGroup(lib.character[character][1]); + } + player.storage.huashen.current2 = skill; + if (!player.additionalSkills.huashen || !player.additionalSkills.huashen.includes(skill)) { + player.addAdditionalSkills("huashen", skill); + player.flashAvatar("huashen", character); + player.syncStorage("huashen"); + player.updateMarks("huashen"); + // lib.skill.rehuashen.createAudio(character,skill,'zuoci'); + } + } + }, + }, + huashen2: { audio: 2 }, + xinsheng: { + audio: 2, + unique: true, + trigger: { player: "damageEnd" }, + frequent: true, + content() { + "step 0"; + event.num = trigger.num; + "step 1"; + lib.skill.huashen.addHuashens(player, 1); + "step 2"; + if (--event.num > 0 && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { + player.chooseBool(get.prompt2("xinsheng")).set("frequentSkill", event.name); + } else event.finish(); + "step 3"; + if (result.bool && player.hasSkill("xinsheng")) { + player.logSkill("xinsheng"); + event.goto(1); + } + }, + ai: { + combo: "huashen", + }, + }, + huoshou: { + audio: "huoshou1", + audioname: ["re_menghuo"], + locked: true, + group: ["huoshou1", "huoshou2"], + preHidden: ["huoshou1", "huoshou2"], + ai: { + effect: { + target(card, player, target) { + if (card.name == "nanman") return 0; + }, + }, + }, + }, + huoshou1: { + audio: 2, + audioname: ["re_menghuo"], + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + filter(event, player) { + return event.card.name == "nanman"; + }, + content() { + trigger.cancel(); + }, + }, + huoshou2: { + audio: "huoshou1", + audioname: ["re_menghuo"], + trigger: { global: "useCard" }, + forced: true, + filter(event, player) { + return event.card && event.card.name == "nanman" && event.player != player; + }, + content() { + trigger.customArgs.default.customSource = player; + }, + }, + zaiqixx: { + audio: "zaiqi", + inherit: "zaiqi", + }, + zaiqi: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter(event, player) { + return !event.numFixed && player.hp < player.maxHp; + }, + check(event, player) { + if (player.getDamagedHp() < 2) { + return false; + } else if (player.getDamagedHp() == 2) { + return player.countCards("h") >= 2; + } + return true; + }, + content() { + "step 0"; + trigger.changeToZero(); + event.cards = get.cards(player.getDamagedHp() + (event.name == "zaiqi" ? 0 : 1)); + game.cardsGotoOrdering(event.cards); + player.showCards(event.cards); + "step 1"; + var num = 0; + for (var i = 0; i < event.cards.length; i++) { + if (get.suit(event.cards[i]) == "heart") { + num++; + event.cards.splice(i--, 1); + } + } + if (num) { + player.recover(num); + } + "step 2"; + if (event.cards.length) { + player.gain(event.cards, "gain2"); + } + }, + ai: { + threaten(player, target) { + if (target.hp == 1) return 2; + if (target.hp == 2) return 1.5; + return 1; + }, + }, + }, + juxiang: { + //unique:true, + locked: true, + audio: "juxiang1", + audioname: ["re_zhurong", "ol_zhurong"], + group: ["juxiang1", "juxiang2"], + preHidden: ["juxiang1", "juxiang2"], + ai: { + effect: { + target(card) { + if (card.name == "nanman") return [0, 1]; + }, + }, + }, + }, + juxiang1: { + audio: 2, + audioname: ["re_zhurong", "ol_zhurong"], + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + filter(event, player) { + return event.card.name == "nanman"; + }, + content() { + trigger.cancel(); + }, + }, + juxiang2: { + audio: "juxiang1", + audioname: ["re_zhurong", "ol_zhurong"], + trigger: { global: "useCardAfter" }, + forced: true, + filter(event, player) { + return event.card.name == "nanman" && event.player != player && event.cards.someInD(); + }, + content() { + player.gain(trigger.cards.filterInD(), "gain2"); + }, + }, + lieren: { + shaRelated: true, + audio: 2, + audioname: ["boss_lvbu3", "ol_zhurong"], + trigger: { source: "damageSource" }, + filter(event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.getParent().name == "sha" && event.player.isIn() && player.canCompare(event.player); + }, + check(event, player) { + return get.attitude(player, event.player) < 0 && player.countCards("h") > 1; + }, + //priority:5, + content() { + "step 0"; + player.chooseToCompare(trigger.player); + "step 1"; + if (result.bool && trigger.player.countGainableCards(player, "he")) { + player.gainPlayerCard(trigger.player, true, "he"); + } + }, + }, + xingshang: { + audio: 2, + trigger: { global: "die" }, + preHidden: true, + filter(event) { + return event.player.countCards("he") > 0; + }, + content() { + "step 0"; + event.togain = trigger.player.getCards("he"); + player.gain(event.togain, trigger.player, "giveAuto", "bySelf"); + }, + }, + fangzhu: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + preHidden: true, + content() { + "step 0"; + var draw = player.getDamagedHp(); + player + .chooseTarget(get.prompt("fangzhu"), "令一名其他角色翻面" + (draw > 0 ? "并摸" + get.cnNumber(draw) + "张牌" : ""), function (card, player, target) { + return player != target; + }) + .setHiddenSkill("fangzhu") + .set("ai", target => { + if (target.hasSkillTag("noturn")) return 0; + var player = _status.event.player; + var current = _status.currentPhase; + var dis = current ? get.distance(current, target, "absolute") : 1; + var draw = player.getDamagedHp(); + var att = get.attitude(player, target); + if (att == 0) return target.hasJudge("lebu") ? Math.random() / 3 : Math.sqrt(get.threaten(target)) / 5 + Math.random() / 2; + if (att > 0) { + if (target.isTurnedOver()) return att + draw; + if (draw < 4) return -1; + if (current && target.getSeatNum() > current.getSeatNum()) return att + draw / 3; + return (10 * Math.sqrt(Math.max(0.01, get.threaten(target)))) / (3.5 - draw) + dis / (2 * game.countPlayer()); + } else { + if (target.isTurnedOver()) return att - draw; + if (draw >= 5) return -1; + if (current && target.getSeatNum() <= current.getSeatNum()) return -att + draw / 3; + return (4.25 - draw) * 10 * Math.sqrt(Math.max(0.01, get.threaten(target))) + (2 * game.countPlayer()) / dis; + } + }); + "step 1"; + if (result.bool) { + player.logSkill("fangzhu", result.targets); + var draw = player.getDamagedHp(); + if (draw > 0) result.targets[0].draw(draw); + result.targets[0].turnOver(); + } + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target.hp <= 1) return; + if (!target.hasFriend()) return; + var hastarget = false; + var turnfriend = false; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) < 0 && !players[i].isTurnedOver()) { + hastarget = true; + } + if (get.attitude(target, players[i]) > 0 && players[i].isTurnedOver()) { + hastarget = true; + turnfriend = true; + } + } + if (get.attitude(player, target) > 0 && !hastarget) return; + if (turnfriend || target.hp == target.maxHp) return [0.5, 1]; + if (target.hp > 1) return [1, 0.5]; + } + }, + }, + }, + }, + songwei: { + unique: true, + group: "songwei2", + audioname: ["re_caopi"], + audio: "songwei2", + zhuSkill: true, + }, + songwei2: { + audio: 2, + audioname: ["re_caopi"], + forceaudio: true, + trigger: { global: "judgeEnd" }, + filter(event, player) { + if (event.player == player || event.player.group != "wei") return false; + if (event.result.color != "black") return false; + return player.hasZhuSkill("songwei", event.player); + }, + direct: true, + content() { + "step 0"; + trigger.player.chooseBool("是否发动【颂威】,令" + get.translation(player) + "摸一张牌?").set("choice", get.attitude(trigger.player, player) > 0); + "step 1"; + if (result.bool) { + player.logSkill("songwei2"); + trigger.player.line(player, "green"); + player.draw(); + } + }, + }, + jiezi: { + trigger: { global: ["phaseDrawSkipped", "phaseDrawCancelled"] }, + audio: 2, + forced: true, + filter(event, player) { + return event.player != player; + }, + content() { + player.draw(); + }, + }, + gzduanliang: { + audio: "duanliang1", + audioname: ["re_xuhuang"], + group: ["duanliang1", "duanliang2"], + ai: { + threaten: 1.2, + }, + }, + duanliang: { + audio: "duanliang1", + audioname: ["re_xuhuang"], + group: ["duanliang1", "duanliang3"], + ai: { + threaten: 1.2, + }, + }, + duanliang1: { + audio: 2, + audioname: ["re_xuhuang"], + enable: "chooseToUse", + filterCard(card) { + if (get.type(card) != "basic" && get.type(card) != "equip") return false; + return get.color(card) == "black"; + }, + filter(event, player) { + return player.countCards("hes", { type: ["basic", "equip"], color: "black" }); + }, + position: "hes", + viewAs: { name: "bingliang" }, + prompt: "将一黑色的基本牌或装备牌当兵粮寸断使用", + check(card) { + return 6 - get.value(card); + }, + ai: { + order: 9, + }, + }, + duanliang2: { + mod: { + targetInRange(card, player, target) { + if (card.name == "bingliang") { + if (get.distance(player, target) <= 2) return true; + } + }, + }, + }, + duanliang3: { + mod: { + targetInRange(card, player, target) { + if (card.name == "bingliang") { + if (target.countCards("h") >= player.countCards("h")) return true; + } + }, + }, + }, + haoshi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + filter(event, player) { + return !event.numFixed; + }, + preHidden: true, + check(event, player) { + return ( + player.countCards("h") + 2 + event.num <= 5 || + game.hasPlayer(function (target) { + return ( + player !== target && + !game.hasPlayer(function (current) { + return current !== player && current !== target && current.countCards("h") < target.countCards("h"); + }) && + get.attitude(player, target) > 0 + ); + }) + ); + }, + content() { + trigger.num += 2; + player.addSkill("haoshi2"); + }, + ai: { + threaten: 2, + noh: true, + skillTagFilter(player, tag) { + if (tag == "noh") { + if (player.countCards("h") != 2) return false; + } + }, + }, + }, + haoshi2: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + popup: false, + audio: false, + content() { + "step 0"; + player.removeSkill("haoshi2"); + if (player.countCards("h") <= 5) { + event.finish(); + return; + } + player.chooseCardTarget({ + selectCard: Math.floor(player.countCards("h") / 2), + filterTarget(card, player, target) { + return target.isMinHandcard(); + }, + prompt: "将一半的手牌交给场上手牌数最少的一名角色", + forced: true, + ai2(target) { + return get.attitude(_status.event.player, target); + }, + }); + "step 1"; + if (result.targets && result.targets[0]) { + player.give(result.cards, result.targets[0]); + } + }, + }, + dimeng: { + audio: 2, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard() { + var targets = ui.selected.targets; + if (targets.length == 2) { + if (Math.abs(targets[0].countCards("h") - targets[1].countCards("h")) <= ui.selected.cards.length) return false; + } + return true; + }, + selectCard: [0, Infinity], + selectTarget: 2, + complexCard: true, + filterTarget(card, player, target) { + if (player == target) return false; + return true; + }, + filterOk() { + var targets = ui.selected.targets; + if (targets.length != 2) return false; + return Math.abs(targets[0].countCards("h") - targets[1].countCards("h")) == ui.selected.cards.length; + }, + multitarget: true, + multiline: true, + content() { + targets[0].swapHandcards(targets[1]); + }, + check(card) { + var list = [], + player = _status.event.player; + var num = player.countCards("he"); + var count; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 3) list.push(players[i]); + } + list.sort(function (a, b) { + return a.countCards("h") - b.countCards("h"); + }); + if (list.length == 0) return -1; + var from = list[0]; + list.length = 0; + + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) < 1) list.push(players[i]); + } + if (list.length == 0) return -1; + list.sort(function (a, b) { + return b.countCards("h") - a.countCards("h"); + }); + if (from.countCards("h") >= list[0].countCards("h")) return -1; + for (var i = 0; i < list.length && from.countCards("h") < list[i].countCards("h"); i++) { + if (list[i].countCards("h") - from.countCards("h") <= num) { + count = list[i].countCards("h") - from.countCards("h"); + break; + } + } + if (count < 2 && from.countCards("h") >= 2) return -1; + if (ui.selected.cards.length < count) return 11 - get.value(card); + return -1; + }, + ai: { + order: 6, + threaten: 3, + expose: 0.9, + result: { + target(player, target) { + var list = []; + var num = player.countCards("he"); + var players = game.filterPlayer(); + if (ui.selected.targets.length == 0) { + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 3) list.push(players[i]); + } + list.sort(function (a, b) { + return a.countCards("h") - b.countCards("h"); + }); + if (target == list[0]) return get.attitude(player, target); + return -get.attitude(player, target); + } else { + var from = ui.selected.targets[0]; + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) < 1) list.push(players[i]); + } + list.sort(function (a, b) { + return b.countCards("h") - a.countCards("h"); + }); + if (from.countCards("h") >= list[0].countCards("h")) return -get.attitude(player, target); + for (var i = 0; i < list.length && from.countCards("h") < list[i].countCards("h"); i++) { + if (list[i].countCards("h") - from.countCards("h") <= num) { + var count = list[i].countCards("h") - from.countCards("h"); + if (count < 2 && from.countCards("h") >= 2) return -get.attitude(player, target); + if (target == list[i]) return get.attitude(player, target); + return -get.attitude(player, target); + } + } + } + }, + }, + }, + }, + yinghun: { + audio: 2, + audioname: ["re_sunjian", "sunce", "re_sunben", "re_sunce", "ol_sunjian"], + audioname2: { + re_sunyi: "gzyinghun_re_sunyi", + tw_ol_sunjian: "yinghun_ol_sunjian", + }, + mod: { + aiOrder(player, card, num) { + if (num > 0 && _status.event && _status.event.type == "phase" && get.tag(card, "recover")) { + if (player.needsToDiscard()) return num / 3; + return 0; + } + }, + }, + locked: false, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + preHidden: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("yinghun"), function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (player.getDamagedHp() == 1 && target.countCards("he") == 0) { + return 0; + } + if (get.attitude(_status.event.player, target) > 0) { + return 10 + get.attitude(_status.event.player, target); + } + if (player.getDamagedHp() == 1) { + return -1; + } + return 1; + }) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + event.num = player.getDamagedHp(); + player.logSkill(event.name, result.targets); + event.target = result.targets[0]; + if (event.num == 1) { + event.directcontrol = true; + } else { + var str1 = "摸" + get.cnNumber(event.num, true) + "弃一"; + var str2 = "摸一弃" + get.cnNumber(event.num, true); + player + .chooseControl(str1, str2, function (event, player) { + if (player.isHealthy()) return 1 - _status.event.choice; + return _status.event.choice; + }) + .set("choice", get.attitude(player, event.target) > 0 ? 0 : 1); + event.str = str1; + } + } else { + event.finish(); + } + "step 2"; + if (event.directcontrol || result.control == event.str) { + if (event.num > 0) event.target.draw(event.num); + event.target.chooseToDiscard(true, "he"); + } else { + event.target.draw(); + if (event.num > 0) event.target.chooseToDiscard(event.num, true, "he"); + } + }, + ai: { + effect: { + target(card, player, target) { + if ( + get.tag(card, "damage") && + get.itemtype(player) === "player" && + target.hp > + (player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ? 2 + : 1) + ) + return [1, 1]; + }, + }, + threaten(player, target) { + return Math.max(0.5, target.getDamagedHp() / 2); + }, + maixie: true, + }, + }, + gzyinghun: { + audio: "yinghun", + audioname: ["re_sunjian", "sunce", "re_sunben", "re_sunce", "ol_sunjian", "sb_sunce"], + audioname2: { + re_sunyi: "gzyinghun_re_sunyi", + tw_ol_sunjian: "yinghun_ol_sunjian", + }, + mod: { + aiOrder(player, card, num) { + if (num > 0 && _status.event && _status.event.type == "phase" && get.tag(card, "recover")) { + if (player.needsToDiscard()) return num / 3; + return 0; + } + }, + }, + locked: false, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return player.getDamagedHp() > 0; + }, + direct: true, + preHidden: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("gzyinghun"), function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (player.getDamagedHp() == 1 && target.countCards("he") == 0) { + return 0; + } + if (get.attitude(_status.event.player, target) > 0) { + return 10 + get.attitude(_status.event.player, target); + } + if (player.getDamagedHp() == 1) { + return -1; + } + return 1; + }) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + event.num = player.getDamagedHp(); + player.logSkill(event.name, result.targets); + event.target = result.targets[0]; + if (event.num == 1) { + event.directcontrol = true; + } else { + var str1 = "摸" + get.cnNumber(event.num, true) + "弃一"; + var str2 = "摸一弃" + get.cnNumber(event.num, true); + player + .chooseControl(str1, str2, function (event, player) { + return _status.event.choice; + }) + .set("choice", get.attitude(player, event.target) > 0 ? str1 : str2); + event.str = str1; + } + } else { + event.finish(); + } + "step 2"; + if (event.directcontrol || result.control == event.str) { + event.target.draw(event.num); + event.target.chooseToDiscard(true, "he"); + } else { + event.target.draw(); + event.target.chooseToDiscard(event.num, true, "he"); + } + }, + ai: { + effect: { + target(card, player, target) { + if ( + get.tag(card, "damage") && + get.itemtype(player) === "player" && + target.hp > + (player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ? 2 + : 1) + ) + return [1, 1]; + }, + }, + threaten(player, target) { + return Math.max(0.5, target.getDamagedHp() / 2); + }, + maixie: true, + }, + }, + yinghun_ol_sunjian: { audio: 2 }, + jiuchi: { + audio: 2, + audioname: ["re_dongzhuo"], + enable: "chooseToUse", + filterCard(card) { + return get.suit(card) == "spade"; + }, + viewAs: { name: "jiu" }, + viewAsFilter(player) { + if (!player.countCards("hs", { suit: "spade" })) return false; + return true; + }, + prompt: "将一张黑桃手牌当酒使用", + check(card) { + if (_status.event.type == "dying") return 1 / Math.max(0.1, get.value(card)); + return 4 - get.value(card); + }, + ai: { + threaten: 1.5, + }, + }, + roulin: { + audio: 2, + audioname: ["re_dongzhuo", "ol_dongzhuo"], + trigger: { player: "useCardToPlayered", target: "useCardToTargeted" }, + forced: true, + filter(event, player) { + if (event.card.name != "sha") return false; + if (player == event.player) { + return event.target.hasSex("female"); + } + return event.player.hasSex("female"); + }, + check(event, player) { + return player == event.player; + }, + content() { + var id = (player == trigger.player ? trigger.target : player).playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { + map[id].shanRequired++; + } else { + map[id].shanRequired = 2; + } + }, + ai: { + halfneg: true, + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (tag === "directHit_ai") return; + if (arg.card.name != "sha" || !arg.target.hasSex("female") || arg.target.countCards("h", "shan") > 1) return false; + }, + }, + }, + benghuai: { + audio: 2, + audioname: ["zhugedan", "re_dongzhuo", "ol_dongzhuo", "re_zhugedan"], + trigger: { player: "phaseJieshuBegin" }, + forced: true, + check() { + return false; + }, + filter(event, player) { + return !player.isMinHp() && !player.hasSkill("rejiuchi_air") && !player.hasSkill("oljiuchi_air"); + }, + content() { + "step 0"; + player + .chooseControl("baonue_hp", "baonue_maxHp", function (event, player) { + if (player.hp == player.maxHp) return "baonue_hp"; + if (player.hp < player.maxHp - 1 || player.hp <= 2) return "baonue_maxHp"; + return "baonue_hp"; + }) + .set("prompt", "崩坏:失去1点体力或减1点体力上限"); + "step 1"; + if (result.control == "baonue_hp") { + player.loseHp(); + } else { + player.loseMaxHp(true); + } + }, + ai: { + threaten: 0.5, + neg: true, + }, + }, + baonue: { + unique: true, + group: "baonue2", + audioname: ["re_dongzhuo"], + audio: "baonue2", + zhuSkill: true, + }, + baonue2: { + audio: 2, + audioname: ["re_dongzhuo"], + //forceaudio:true, + trigger: { global: "damageSource" }, + filter(event, player) { + if (player == event.source || !event.source || event.source.group != "qun") return false; + return player.hasZhuSkill("baonue", event.source); + }, + direct: true, + content() { + "step 0"; + trigger.source.chooseBool("是否对" + get.translation(player) + "发动【暴虐】?").set("choice", get.attitude(trigger.source, player) > 0); + "step 1"; + if (result.bool) { + player.logSkill("baonue"); + trigger.source.line(player, "green"); + trigger.source.judge(function (card) { + if (get.suit(card) == "spade") return 4; + return 0; + }).judge2 = function (result) { + return result.bool ? true : false; + }; + } else { + event.finish(); + } + "step 2"; + if (result.suit == "spade") { + player.recover(); + } + }, + }, + luanwu: { + audio: 2, + audioname: ["re_jiaxu"], + unique: true, + enable: "phaseUse", + limited: true, + skillAnimation: "epic", + animationColor: "thunder", + filterTarget(card, player, target) { + return target != player; + }, + selectTarget: -1, + multitarget: true, + multiline: true, + content() { + "step 0"; + player.awakenSkill("luanwu"); + event.current = player.next; + event.currented = []; + "step 1"; + event.currented.push(event.current); + event.current.addTempClass("target"); + event.current + .chooseToUse( + "乱武:使用一张杀或失去1点体力", + function (card) { + if (get.name(card) != "sha") return false; + return lib.filter.cardEnabled.apply(this, arguments); + }, + function (card, player, target) { + if (player == target) return false; + var dist = get.distance(player, target); + if (dist > 1) { + if ( + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) < dist; + }) + ) { + return false; + } + } + return lib.filter.filterTarget.apply(this, arguments); + } + ) + .set("ai2", function () { + return get.effect_use.apply(this, arguments) + 0.01; + }) + .set("addCount", false); + "step 2"; + if (result.bool == false) event.current.loseHp(); + event.current = event.current.next; + if (event.current != player && !event.currented.includes(event.current)) { + game.delay(0.5); + event.goto(1); + } + }, + ai: { + order: 1, + result: { + player(player) { + if (lib.config.mode == "identity" && game.zhu.isZhu && player.identity == "fan") { + if (game.zhu.hp == 1 && game.zhu.countCards("h") <= 2) return 1; + } + var num = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var att = get.attitude(player, players[i]); + if (att > 0) att = 1; + if (att < 0) att = -1; + if (players[i] != player && players[i].hp <= 3) { + if (players[i].countCards("h") == 0) num += att / players[i].hp; + else if (players[i].countCards("h") == 1) num += att / 2 / players[i].hp; + else if (players[i].countCards("h") == 2) num += att / 4 / players[i].hp; + } + if (players[i].hp == 1) num += att * 1.5; + } + if (player.hp == 1) { + return -num; + } + if (player.hp == 2) { + return -game.players.length / 4 - num; + } + return -game.players.length / 3 - num; + }, + }, + }, + }, + wansha: { + locked: true, + audio: 2, + audioname: ["boss_lvbu3", "shen_simayi"], + global: "wansha2", + trigger: { global: "dying" }, + priority: 15, + forced: true, + preHidden: true, + filter(event, player, name) { + return _status.currentPhase == player && event.player != player; + }, + content() {}, + }, + wansha2: { + mod: { + cardSavable(card, player) { + if (card.name == "tao" && _status.currentPhase && _status.currentPhase.isIn() && _status.currentPhase.hasSkill("wansha") && _status.currentPhase != player) { + if (!player.isDying()) return false; + } + }, + cardEnabled(card, player) { + if (card.name == "tao" && _status.currentPhase && _status.currentPhase.isIn() && _status.currentPhase.hasSkill("wansha") && _status.currentPhase != player) { + if (!player.isDying()) return false; + } + }, + }, + }, + weimu: { + trigger: { global: "useCard1" }, + audio: 2, + forced: true, + firstDo: true, + filter(event, player, card) { + if (get.color(event.card) != "black") return false; + return (event.card.name == "nanman" && player != event.player) || (event.card.name == "wanjian" && player != event.player) || (event.card.name == "taoyuan" && player.hp < player.maxHp) || event.card.name == "wugu"; + }, + content() {}, + mod: { + targetEnabled(card) { + if ((get.type(card) == "trick" || get.type(card) == "delay") && get.color(card) == "black") return false; + }, + }, + }, + huoji: { + audio: 2, + enable: "chooseToUse", + filterCard(card) { + return get.color(card) == "red"; + }, + viewAs: { name: "huogong" }, + viewAsFilter(player) { + if (!player.countCards("hs", { color: "red" })) return false; + }, + position: "hs", + prompt: "将一张红色牌当火攻使用", + check(card) { + var player = get.player(); + if (player.countCards("h") > player.hp) { + return 6 - get.value(card); + } + return 3 - get.value(card); + }, + ai: { + fireAttack: true, + }, + }, + bazhen: { + audio: 2, + audioname: ["re_sp_zhugeliang", "ol_sp_zhugeliang", "ol_pangtong"], + group: "bazhen_bagua", + locked: true, + }, + bazhen_bagua: { + audio: "bazhen", + audioname: ["re_sp_zhugeliang", "ol_sp_zhugeliang", "ol_pangtong"], + equipSkill: true, + noHidden: true, + inherit: "bagua_skill", + filter(event, player) { + if (!lib.skill.bagua_skill.filter(event, player)) return false; + if (!player.hasEmptySlot(2)) return false; + return true; + }, + ai: { + respondShan: true, + freeShan: true, + skillTagFilter(player, tag, arg) { + if (tag !== "respondShan" && tag !== "freeShan") return; + if (!player.hasEmptySlot(2) || player.hasSkillTag("unequip2")) return false; + if (!arg || !arg.player) return true; + if ( + arg.player.hasSkillTag("unequip", false, { + target: player, + }) + ) + return false; + return true; + }, + effect: { + target(card, player, target) { + if (player == target && get.subtype(card) == "equip2") { + if (get.equipValue(card) <= 7.5) return 0; + } + if (!target.hasEmptySlot(2)) return; + return lib.skill.bagua_skill.ai.effect.target.apply(this, arguments); + }, + }, + }, + }, + kanpo: { + mod: { + aiValue(player, card, num) { + if (get.name(card) != "wuxie" && get.color(card) != "black") return; + var cards = player.getCards("hs", function (card) { + return get.name(card) == "wuxie" || get.color(card) == "black"; + }); + cards.sort(function (a, b) { + return (get.name(b) == "wuxie" ? 1 : 2) - (get.name(a) == "wuxie" ? 1 : 2); + }); + var geti = function () { + if (cards.includes(card)) { + return cards.indexOf(card); + } + return cards.length; + }; + if (get.name(card) == "wuxie") return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6, 4, 3][Math.min(geti(), 2)]); + }, + aiUseful() { + return lib.skill.kanpo.mod.aiValue.apply(this, arguments); + }, + }, + locked: false, + audio: 2, + enable: "chooseToUse", + filterCard(card) { + return get.color(card) == "black"; + }, + viewAsFilter(player) { + return player.countCards("hs", { color: "black" }) > 0; + }, + viewAs: { name: "wuxie" }, + position: "hs", + prompt: "将一张黑色手牌当无懈可击使用", + check(card) { + var tri = _status.event.getTrigger(); + if (tri && tri.card && tri.card.name == "chiling") return -1; + return 8 - get.value(card); + }, + threaten: 1.2, + }, + niepan: { + audio: 2, + audioname: ["re_pangtong"], + unique: true, + enable: "chooseToUse", + mark: true, + limited: true, + skillAnimation: true, + animationColor: "fire", + init(player) { + player.storage.niepan = false; + }, + filter(event, player) { + if (player.storage.niepan) return false; + if (event.type == "dying") { + if (player != event.dying) return false; + return true; + } else if (event.parent.name == "phaseUse") { + return true; + } + return false; + }, + content() { + "step 0"; + player.awakenSkill("niepan"); + player.storage.niepan = true; + player.discard(player.getCards("hej")); + "step 1"; + player.link(false); + "step 2"; + player.turnOver(false); + "step 3"; + player.draw(3); + "step 4"; + if (player.hp < 3) { + player.recover(3 - player.hp); + } + }, + ai: { + order: 0.5, + skillTagFilter(player, tag, target) { + if (player != target || player.storage.niepan) return false; + }, + save: true, + result: { + player(player) { + if (player.hp <= 0) return 10; + if (player.hp <= 1 && player.countCards("he") <= 1) return 10; + return 0; + }, + }, + threaten(player, target) { + if (!target.storage.niepan) return 0.6; + }, + }, + intro: { + content: "limited", + }, + }, + oldniepan: { + audio: "niepan", + unique: true, + enable: "chooseToUse", + mark: true, + skillAnimation: true, + limited: true, + animationColor: "orange", + init(player) { + player.storage.oldniepan = false; + }, + filter(event, player) { + if (player.storage.oldniepan) return false; + if (event.type == "dying") { + if (player != event.dying) return false; + return true; + } + return false; + }, + content() { + "step 0"; + player.awakenSkill("oldniepan"); + player.storage.oldniepan = true; + player.discard(player.getCards("hej")); + "step 1"; + player.link(false); + "step 2"; + player.turnOver(false); + "step 3"; + player.draw(3); + "step 4"; + if (player.hp < 3) { + player.recover(3 - player.hp); + } + }, + ai: { + order: 1, + skillTagFilter(player, arg, target) { + if (player != target || player.storage.oldniepan) return false; + }, + save: true, + result: { + player(player) { + if (player.hp <= 0) return 10; + if (player.hp <= 2 && player.countCards("he") <= 1) return 10; + return 0; + }, + }, + threaten(player, target) { + if (!target.storage.oldniepan) return 0.6; + }, + }, + intro: { + content: "limited", + }, + }, + quhu: { + audio: 2, + audioname: ["re_xunyu", "ol_xunyu"], + enable: "phaseUse", + usable: 1, + filter(event, player) { + if (player.countCards("h") == 0) return false; + return game.hasPlayer(function (current) { + return current.hp > player.hp && player.canCompare(current); + }); + }, + filterTarget(card, player, target) { + return target.hp > player.hp && player.canCompare(target); + }, + content() { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + if ( + game.hasPlayer(function (player) { + return player != target && target.inRange(player); + }) + ) { + player + .chooseTarget(function (card, player, target) { + var source = _status.event.source; + return target != source && source.inRange(target); + }, true) + .set("ai", function (target) { + return get.damageEffect(target, _status.event.source, player); + }) + .set("source", target); + } else { + event.finish(); + } + } else { + player.damage(target); + event.finish(); + } + "step 2"; + if (result.bool && result.targets && result.targets.length) { + target.line(result.targets[0], "green"); + result.targets[0].damage(target); + } + }, + ai: { + order: 0.5, + result: { + target(player, target) { + var att = get.attitude(player, target); + var oc = target.countCards("h") == 1; + if (att > 0 && oc) return 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != target && players[i] != player && target.inRange(players[i])) { + if (get.damageEffect(players[i], target, player) > 0) { + return att > 0 ? att / 2 : att - (oc ? 5 : 0); + } + } + } + return 0; + }, + player(player, target) { + if (target.hasSkillTag("jueqing", false, target)) return -10; + var mn = 1; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + mn = Math.max(mn, get.number(hs[i])); + } + if (mn <= 11 && player.hp < 2) return -20; + var max = player.maxHp - hs.length; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 2) { + max = Math.max(Math.min(5, players[i].hp) - players[i].countCards("h"), max); + } + } + switch (max) { + case 0: + return mn == 13 ? 0 : -20; + case 1: + return mn >= 12 ? 0 : -15; + case 2: + return 0; + case 3: + return 1; + default: + return max; + } + }, + }, + expose: 0.2, + }, + }, + jieming: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + content() { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + player + .chooseTarget(get.prompt2("jieming"), function (card, player, target) { + return true; //target.countCards('h') 2) { + return Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")); + } + return att / 3; + }); + "step 2"; + if (result.bool) { + player.logSkill("jieming", result.targets); + for (var i = 0; i < result.targets.length; i++) { + result.targets[i].drawTo(Math.min(5, result.targets[i].maxHp)); + } + if (event.count && player.hasSkill("jieming")) event.goto(1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + var max = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) > 0) { + max = Math.max(Math.min(5, players[i].hp) - players[i].countCards("h"), max); + } + } + switch (max) { + case 0: + return 2; + case 1: + return 1.5; + case 2: + return [1, 2]; + default: + return [0, max]; + } + } + if ((card.name == "tao" || card.name == "caoyao") && target.hp > 1 && target.countCards("h") <= target.hp) return [0, 0]; + }, + }, + }, + }, + qiangxix: { + inherit: "reqiangxi", + audioname: ["boss_lvbu3"], + audio: "qiangxi", + usable: 2, + filterTarget(card, player, target) { + if (player == target) return false; + if (target.hasSkill("reqiangxi_off")) return false; + return true; + }, + }, + qiangxi: { + audio: 2, + enable: "phaseUse", + usable: 1, + audioname: ["boss_lvbu3"], + filterCard(card) { + return get.subtype(card) == "equip1"; + }, + selectCard: [0, 1], + filterTarget(card, player, target) { + if (player == target) return false; + return player.inRange(target); + }, + content() { + "step 0"; + if (cards.length == 0) { + player.loseHp(); + } + "step 1"; + target.damage("nocard"); + }, + check(card) { + return 10 - get.value(card); + }, + position: "he", + ai: { + damage: true, + order: 8, + result: { + player(player, target) { + if (ui.selected.cards.length) return 0; + if (player.hp >= target.hp) return -0.9; + if (player.hp <= 2) return -10; + return -2; + }, + target(player, target) { + if (!ui.selected.cards.length) { + if (player.hp < 2) return 0; + if (player.hp == 2 && target.hp >= 2) return 0; + if (target.hp > player.hp) return 0; + } + return get.damageEffect(target, player); + }, + }, + threaten: 1.3, + }, + }, + xinqiangxi: { + audio: "qiangxi", + enable: "phaseUse", + filter(event, player) { + if (player.hasSkill("xinqiangxi2")) { + return !player.hasSkill("xinqiangxi3"); + } else if (player.hasSkill("xinqiangxi3")) { + return !player.hasSkill("xinqiangxi2") && player.countCards("he", { type: "equip" }) > 0; + } else { + return true; + } + }, + filterCard(card) { + var player = _status.event.player; + if (player.hasSkill("xinqiangxi2")) return false; + return get.type(card) == "equip"; + }, + selectCard() { + var player = _status.event.player; + if (player.hasSkill("xinqiangxi2")) return -1; + if (player.hasSkill("xinqiangxi3")) return [1, 1]; + return [0, 1]; + }, + filterTarget(card, player, target) { + if (player == target) return false; + return player.inRange(target); + }, + content() { + "step 0"; + if (cards.length == 0) { + player.loseHp(); + player.addTempSkill("xinqiangxi3"); + } else { + player.addTempSkill("xinqiangxi2"); + } + "step 1"; + target.damage("nocard"); + }, + check(card) { + return 10 - get.value(card); + }, + position: "he", + ai: { + order: 8.5, + result: { + target(player, target) { + if (!ui.selected.cards.length) { + if (player.hp < 2) return 0; + if (target.hp >= player.hp) return 0; + } + return get.damageEffect(target, player); + }, + }, + }, + threaten: 1.5, + }, + xinqiangxi2: {}, + xinqiangxi3: {}, + tianyi: { + audio: 2, + audioname: ["re_taishici"], + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return player.canCompare(target); + }, + filter(event, player) { + return player.countCards("h") > 0; + }, + content() { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + player.addTempSkill("tianyi2"); + } else { + player.addTempSkill("tianyi3"); + } + }, + ai: { + order(name, player) { + var cards = player.getCards("h"); + if (player.countCards("h", "sha") == 0) { + return 1; + } + for (var i = 0; i < cards.length; i++) { + if (cards[i].name != "sha" && get.number(cards[i]) > 11 && get.value(cards[i]) < 7) { + return 9; + } + } + return get.order({ name: "sha" }) - 1; + }, + result: { + player(player) { + if (player.countCards("h", "sha") > 0) return 0.6; + var num = player.countCards("h"); + if (num > player.hp) return 0; + if (num == 1) return -2; + if (num == 2) return -1; + return -0.7; + }, + target(player, target) { + var num = target.countCards("h"); + if (num == 1) return -1; + if (num == 2) return -0.7; + return -0.5; + }, + }, + threaten: 1.3, + }, + }, + tianyi2: { + mod: { + targetInRange(card, player, target, now) { + if (card.name == "sha") return true; + }, + selectTarget(card, player, range) { + if (card.name == "sha" && range[1] != -1) range[1]++; + }, + cardUsable(card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + charlotte: true, + }, + tianyi3: { + mod: { + cardEnabled(card) { + if (card.name == "sha") return false; + }, + }, + charlotte: true, + }, + shuangxiong: { + audio: 2, + audioname: ["re_yanwen"], + group: "shuangxiong1", + subSkill: { + re_yanwen1: { audio: true }, + re_yanwen2: { audio: true }, + }, + }, + shuangxiong1: { + audio: true, + trigger: { player: "phaseDrawBegin1" }, + check(event, player) { + if (player.countCards("h") > player.hp) return true; + if (player.countCards("h") > 3) return true; + return false; + }, + filter(event, player) { + return !event.numFixed; + }, + preHidden: true, + prompt2: () => "进行一次判定,本回合可以将一张与此牌颜色不同的手牌当作【决斗】使用", + content() { + player.judge().set("callback", lib.skill.shuangxiong1.callback); + trigger.changeToZero(); + }, + callback() { + player.gain(card, "gain2"); + player.addTempSkill("shuangxiong2"); + player.markAuto("shuangxiong2", [event.judgeResult.color]); + }, + }, + shuangxiong2: { + charlotte: true, + onremove: true, + audio: true, + audioname2: { + re_yanwen: "shuangxiong_re_yanwen2", + }, + enable: "chooseToUse", + viewAs: { name: "juedou" }, + position: "hs", + viewAsFilter(player) { + return player.hasCard(card => lib.skill.shuangxiong2.filterCard(card, player), "hs"); + }, + filterCard(card, player) { + var color = get.color(card), + colors = player.getStorage("shuangxiong2"); + for (var i of colors) { + if (color != i) return true; + } + return false; + }, + prompt() { + var colors = _status.event.player.getStorage("shuangxiong2"); + var str = "将一张颜色"; + for (var i = 0; i < colors.length; i++) { + if (i > 0) str += "或"; + str += "不为"; + str += get.translation(colors[i]); + } + str += "的牌当做【决斗】使用"; + return str; + }, + check(card) { + var player = _status.event.player; + var raw = player.getUseValue(card, null, true); + var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card])); + return eff - raw; + }, + ai: { order: 7 }, + }, + luanji: { + audio: 2, + enable: "phaseUse", + position: "hs", + viewAs: { name: "wanjian" }, + filterCard(card, player) { + if (ui.selected.cards.length) { + return get.suit(card) == get.suit(ui.selected.cards[0]); + } + var cards = player.getCards("hs"); + for (var i = 0; i < cards.length; i++) { + if (card != cards[i]) { + if (get.suit(card) == get.suit(cards[i])) return true; + } + } + return false; + }, + selectCard: 2, + complexCard: true, + check(card) { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return player.canUse("wanjian", current); + }); + var num = 0; + for (var i = 0; i < targets.length; i++) { + var eff = get.sgn(get.effect(targets[i], { name: "wanjian" }, player, player)); + if (targets[i].hp == 1) { + eff *= 1.5; + } + num += eff; + } + if (!player.needsToDiscard(-1)) { + if (targets.length >= 7) { + if (num < 2) return 0; + } else if (targets.length >= 5) { + if (num < 1.5) return 0; + } + } + return 6 - get.value(card); + }, + ai: { + basic: { + order: 8.5, + }, + }, + }, + xueyi: { + trigger: { player: "phaseDiscardBefore" }, + audio: 2, + audioname: ["re_yuanshao"], + forced: true, + firstDo: true, + filter(event, player) { + return ( + player.hasZhuSkill("xueyi") && + game.hasPlayer(function (current) { + return current != player && current.group == "qun"; + }) && + player.countCards("h") > player.hp + ); + }, + content() {}, + mod: { + maxHandcard(player, num) { + if (player.hasZhuSkill("xueyi")) { + return ( + num + + game.countPlayer(function (current) { + if (player != current && current.group == "qun") return 2; + }) + ); + } + return num; + }, + }, + zhuSkill: true, + }, + mengjin: { + shaRelated: true, + audio: 2, + trigger: { player: "shaMiss" }, + //priority:-1, + filter(event) { + return event.target.countCards("he") > 0; + }, + check(event, player) { + return get.attitude(player, event.target) < 0; + }, + logTarget: "target", + content() { + player.discardPlayerCard("he", trigger.target, true); + }, + }, + jiewei: { + trigger: { player: "turnOverEnd" }, + //direct:true, + frequent: true, + audio: "xinjiewei", + content() { + "step 0"; + player.draw(); + player.chooseToUse(function (card) { + if (!lib.filter.cardEnabled(card, _status.event.player, _status.event)) { + return false; + } + var type = get.type(card, "trick"); + return type == "trick" || type == "equip"; + }, "是否使用一张锦囊牌或装备牌?"); + "step 1"; + if (result.bool) { + var type = get.type(result.card || result.cards[0]); + if ( + game.hasPlayer(function (current) { + if (type == "equip") { + return current.countCards("e"); + } else { + return current.countCards("j"); + } + }) + ) { + var next = player.chooseTarget("是否弃置场上的一张" + get.translation(type) + "牌?", function (card, player, target) { + if (_status.event.type == "equip") { + return target.countCards("e") > 0; + } else { + return target.countCards("j") > 0; + } + }); + next.set("ai", function (target) { + if (type == "equip") { + return -get.attitude(player, target); + } else { + return get.attitude(player, target); + } + }); + next.set("type", type); + event.type = type; + } else { + event.finish(); + } + } else { + event.finish(); + } + "step 2"; + if (event.type && result.bool && result.targets && result.targets.length) { + player.line(result.targets, "green"); + if (event.type == "equip") { + player.discardPlayerCard(result.targets[0], "e", true); + } else { + player.discardPlayerCard(result.targets[0], "j", true); + } + } + }, + }, + releiji: { + audio: 2, + audioname: ["boss_qinglong"], + trigger: { player: ["useCard", "respond"] }, + filter(event, player) { + return event.card.name == "shan"; + }, + direct: true, + content() { + "step 0"; + player.chooseTarget(get.prompt2("releiji"), function (card, player, target) { + return target != player; + }).ai = function (target) { + if (target.hasSkill("hongyan")) return 0; + return get.damageEffect(target, _status.event.player, _status.event.player, "thunder"); + }; + "step 1"; + if (result.bool) { + player.logSkill("releiji", result.targets, "thunder"); + event.target = result.targets[0]; + event.target.judge(function (card) { + var suit = get.suit(card); + if (suit == "spade") return -4; + if (suit == "club") return -2; + return 0; + }).judge2 = function (result) { + return result.bool == false ? true : false; + }; + } else { + event.finish(); + } + "step 2"; + if (result.suit == "club") { + player.recover(); + event.target.damage("thunder"); + } else if (result.suit == "spade") { + event.target.damage(2, "thunder"); + } + }, + ai: { + useShan: true, + effect: { + target(card, player, target, current) { + if ( + get.tag(card, "respondShan") && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) + ) { + let club = 0, + spade = 0; + if ( + game.hasPlayer(function (current) { + return get.attitude(target, current) < 0 && get.damageEffect(current, target, target, "thunder") > 0; + }) + ) { + club = 2; + spade = 4; + } + if (!target.isHealthy()) club += 2; + if (!club && !spade) return 1; + if (card.name === "sha") { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return; + } else if (!target.mayHaveShan(player)) return 1 - 0.1 * Math.min(5, target.countCards("hs")); + if (!target.hasSkillTag("rejudge")) return [1, (club + spade) / 4]; + let pos = player.hasSkillTag("viewHandcard", null, target, true) ? "hes" : "e", + better = club > spade ? "club" : "spade", + max = 0; + target.hasCard(function (cardx) { + if (get.suit(cardx) === better) { + max = 2; + return true; + } + if (spade && get.color(cardx) === "black") max = 1; + }, pos); + if (max === 2) return [1, Math.max(club, spade)]; + if (max === 1) return [1, Math.min(club, spade)]; + if (pos === "e") return [1, Math.min((Math.max(1, target.countCards("hs")) * (club + spade)) / 4, Math.max(club, spade))]; + return [1, (club + spade) / 4]; + } + }, + }, + }, + }, + shensu: { + audio: "shensu1", + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + group: ["shensu1", "shensu2"], + preHidden: ["shensu1", "shensu2"], + }, + xinshensu: { + audio: "shensu1", + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + audioname2: { + dc_xiahouba: "shensu1_xiahouba", + }, + group: ["shensu1", "shensu2", "shensu4"], + }, + shensu1_xiahouba: { audio: 2 }, + shensu1: { + audio: 2, + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + audioname2: { + dc_xiahouba: "shensu1_xiahouba", + }, + trigger: { player: "phaseJudgeBefore" }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt("shensu"), "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }) + .set("check", player.countCards("h") > 2) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }) + .setHiddenSkill("shensu1"); + "step 1"; + if (result.bool) { + player.logSkill("shensu1", result.targets); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); + trigger.cancel(); + player.skip("phaseDraw"); + } + }, + }, + shensu2: { + audio: "shensu1", + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + audioname2: { + dc_xiahouba: "shensu1_xiahouba", + }, + trigger: { player: "phaseUseBefore" }, + direct: true, + filter(event, player) { + return ( + player.countCards("he", function (card) { + if (_status.connectMode) return true; + return get.type(card) == "equip"; + }) > 0 + ); + }, + content() { + "step 0"; + player + .chooseCardTarget({ + prompt: get.prompt("shensu"), + prompt2: "弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", + filterCard(card, player) { + return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); + }, + position: "he", + filterTarget(card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }, + ai1(card) { + if (_status.event.check) return 0; + return 6 - get.value(card); + }, + ai2(target) { + if (_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }, + check: + player.countCards("hs", i => { + return player.hasValueTarget(i, null, true); + }) > + player.hp - 1, + }) + .setHiddenSkill("shensu2"); + "step 1"; + if (result.bool) { + player.logSkill("shensu2", result.targets); + player.discard(result.cards[0]); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); + trigger.cancel(); + } + }, + }, + shensu4: { + audio: "shensu1", + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + audioname2: { + dc_xiahouba: "shensu1_xiahouba", + }, + trigger: { player: "phaseDiscardBefore" }, + direct: true, + content() { + "step 0"; + var check = player.needsToDiscard() || player.isTurnedOver() || (player.hasSkill("shebian") && player.canMoveCard(true, true)); + player + .chooseTarget(get.prompt("shensu"), "跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】", function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player, _status.event.player); + }); + "step 1"; + if (result.bool) { + player.logSkill("shensu4", result.targets); + player.turnOver(); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); + trigger.cancel(); + } + }, + }, + jushou: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + check(event, player) { + return event.player.hp + player.countCards("h") < 4; + }, + content() { + player.draw(3); + player.turnOver(); + }, + ai: { + effect: { + target(card, player, target) { + if (card.name == "guiyoujie") return [0, 1]; + }, + }, + }, + }, + moon_jushou: { + audio: "xinjushou", + trigger: { player: "phaseJieshuBegin" }, + check(event, player) { + return event.player.hp + player.countCards("h") < 4; + }, + content() { + player.draw(); + player.turnOver(); + }, + ai: { + effect: { + target(card, player, target) { + if (card.name == "guiyoujie") return [0, 1]; + }, + }, + }, + }, + liegong: { + shaRelated: true, + audio: 2, + audioname: ["re_huangzhong"], + trigger: { player: "useCardToPlayered" }, + check(event, player) { + return get.attitude(player, event.target) <= 0; + }, + logTarget: "target", + filter(event, player) { + if (event.card.name != "sha") return false; + var length = event.target.countCards("h"); + return length >= player.hp || length <= player.getAttackRange(); + }, + preHidden: true, + content() { + trigger.getParent().directHit.push(trigger.target); + }, + locked: false, + mod: { + attackRange(player, distance) { + if (get.zhu(player, "shouyue")) return distance + 1; + }, + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (get.attitude(player, arg.target) > 0 || arg.card.name != "sha") return false; + var length = arg.target.countCards("h"); + return length >= player.hp || length <= player.getAttackRange(); + }, + }, + }, + kuanggu: { + audio: 2, + audioname: ["re_weiyan", "ol_weiyan"], + trigger: { source: "damageSource" }, + forced: true, + filter(event, player) { + return event.kuangguCheck && player.isDamaged(); + }, + content() { + player.recover(trigger.num); + }, + group: "kuanggu_check", + subSkill: { + check: { + charlotte: true, + trigger: { source: "damage" }, + filter(event, player) { + return get.distance(player, event.player) <= 1; + }, + firstDo: true, + silent: true, + content() { + trigger.kuangguCheck = true; + }, + }, + }, + }, + tianxiang: { + audio: 2, + audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"], + trigger: { player: "damageBegin3" }, + direct: true, + filter(event, player) { + return player.countCards("h", { suit: "heart" }) > 0 && event.num > 0; + }, + content() { + "step 0"; + player.chooseCardTarget({ + filterCard(card, player) { + return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); + }, + filterTarget(card, player, target) { + return player != target; + }, + ai1(card) { + return 10 - get.value(card); + }, + ai2(target) { + var att = get.attitude(_status.event.player, target); + var trigger = _status.event.getTrigger(); + var da = 0; + if (_status.event.player.hp == 1) { + da = 10; + } + if (trigger.num > 1) { + if (target.maxHp > 5 && target.hp > 1) return -att / 10 + da; + return -att + da; + } + var eff = get.damageEffect(target, trigger.source, target, trigger.nature); + if (att == 0) return 0.1 + da; + if (eff >= 0 && trigger.num == 1) { + return att + da; + } + if (target.hp == target.maxHp) return -att + da; + if (target.hp == 1) { + if (target.maxHp <= 4 && !target.hasSkillTag("maixie")) { + if (target.maxHp <= 3) { + return -att + da; + } + return -att / 2 + da; + } + return da; + } + if (target.hp == target.maxHp - 1) { + if (target.hp > 2 || target.hasSkillTag("maixie")) return att / 5 + da; + if (att > 0) return 0.02 + da; + return 0.05 + da; + } + return att / 2 + da; + }, + prompt: get.prompt2("tianxiang"), + }); + "step 1"; + if (result.bool) { + player.logSkill(event.name, result.targets); + trigger.player = result.targets[0]; + trigger.player.addSkill("tianxiang2"); + player.discard(result.cards[0]); + } + }, + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.tag(card, "damage") && target.countCards("h") > 1) return 0.7; + }, + }, + threaten(player, target) { + if (target.countCards("h") == 0) return 2; + }, + }, + }, + tianxiang2: { + trigger: { player: ["damageAfter", "damageCancelled", "damageZero"] }, + forced: true, + popup: false, + audio: false, + vanish: true, + charlotte: true, + content() { + if (player.getDamagedHp()) player.draw(player.getDamagedHp()); + player.removeSkill("tianxiang2"); + player.popup("tianxiang"); + }, + }, + retianxiang: { + audio: "tianxiang", + audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"], + trigger: { player: "damageBegin4" }, + direct: true, + preHidden: true, + filter(event, player) { + return ( + player.countCards("h", function (card) { + return _status.connectMode || get.suit(card, player) == "heart"; + }) > 0 && event.num > 0 + ); + }, + content() { + "step 0"; + player + .chooseCardTarget({ + filterCard(card, player) { + return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); + }, + filterTarget(card, player, target) { + return player != target; + }, + ai1(card) { + return 10 - get.value(card); + }, + ai2(target) { + var att = get.attitude(_status.event.player, target); + var trigger = _status.event.getTrigger(); + var da = 0; + if (_status.event.player.hp == 1) { + da = 10; + } + var eff = get.damageEffect(target, trigger.source, target); + if (att == 0) return 0.1 + da; + if (eff >= 0 && att > 0) { + return att + da; + } + if (att > 0 && target.hp > 1) { + if (target.maxHp - target.hp >= 3) return att * 1.1 + da; + if (target.maxHp - target.hp >= 2) return att * 0.9 + da; + } + return -att + da; + }, + prompt: get.prompt("retianxiang"), + prompt2: lib.translate.retianxiang_info, + }) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + player.discard(result.cards); + var target = result.targets[0]; + player + .chooseControlList( + true, + function (event, player) { + var target = _status.event.target; + var att = get.attitude(player, target); + if (target.hasSkillTag("maihp")) att = -att; + if (att > 0) { + return 0; + } else { + return 1; + } + }, + ["令" + get.translation(target) + "受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)", "令" + get.translation(target) + "失去1点体力,然后获得" + get.translation(result.cards)] + ) + .set("target", target); + player.logSkill(event.name, target); + trigger.cancel(); + event.target = target; + event.card = result.cards[0]; + } else { + event.finish(); + } + "step 2"; + if (typeof result.index == "number") { + event.index = result.index; + if (result.index) { + event.related = event.target.loseHp(); + } else { + event.related = event.target.damage(trigger.source || "nosource", "nocard"); + } + } else event.finish(); + "step 3"; + //if(event.related.cancelled||target.isDead()) return; + if (event.index && card.isInPile()) target.gain(card, "gain2"); + else if (target.getDamagedHp()) target.draw(Math.min(5, target.getDamagedHp())); + }, + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; + }, + }, + }, + }, + retianxiang3: { + trigger: { player: "loseHpAfter" }, + forced: true, + popup: false, + filter(event) { + return event.type == "retianxiang"; + }, + vanish: true, + content() { + "step 0"; + player.gain(player.storage.retianxiang3, "gain2"); + "step 1"; + player.removeSkill("retianxiang3"); + }, + onremove(player) { + var card = player.storage.retianxiang3; + if (get.position(card) == "s") { + game.cardsDiscard(card); + } + delete player.storage.retianxiang3; + }, + }, + retianxiang2: { + trigger: { player: "damageAfter" }, + forced: true, + popup: false, + filter(event) { + return event.type == "retianxiang"; + }, + vanish: true, + content() { + if (player.isDamaged()) { + player.draw(player.getDamagedHp()); + } + player.removeSkill("retianxiang2"); + }, + }, + xintianxiang: { + audio: "tianxiang", + trigger: { player: "damageBefore" }, + direct: true, + filter(event, player) { + return player.countCards("he", { suit: "heart" }) > 0 && event.num > 0 && !player.hasSkill("xintianxiang3"); + }, + content() { + "step 0"; + player.chooseCardTarget({ + filterCard(card, player) { + return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); + }, + filterTarget(card, player, target) { + return player != target; + }, + position: "he", + ai1(card) { + return 10 - get.value(card); + }, + ai2(target) { + var att = get.attitude(_status.event.player, target); + var trigger = _status.event.getTrigger(); + var da = 0; + if (_status.event.player.hp == 1) { + da = 10; + } + if (trigger.num > 1) { + if (target.maxHp > 5 && target.hp > 1) return -att / 10 + da; + return -att + da; + } + var eff = get.damageEffect(target, trigger.source, target, trigger.nature); + if (att == 0) return 0.1 + da; + if (eff >= 0 && trigger.num == 1) { + return att + da; + } + if (target.hp == target.maxHp) return -att + da; + if (target.hp == 1) { + if (target.maxHp <= 4 && !target.hasSkillTag("maixie")) { + if (target.maxHp <= 3) { + return -att + da; + } + return -att / 2 + da; + } + return da; + } + if (target.hp == target.maxHp - 1) { + if (target.hp > 2 || target.hasSkillTag("maixie")) return att / 5 + da; + if (att > 0) return 0.02 + da; + return 0.05 + da; + } + return att / 2 + da; + }, + prompt: get.prompt2("xintianxiang"), + }); + "step 1"; + if (result.bool) { + player.logSkill(event.name, result.targets); + trigger.player = result.targets[0]; + trigger.player.addSkill("xintianxiang2"); + trigger.player.storage.xintianxiang = player; + player.discard(result.cards[0]); + } else { + event.finish(); + } + }, + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; + }, + }, + }, + }, + xintianxiang2: { + trigger: { player: ["damageAfter", "damageCancelled", "damageZero"] }, + forced: true, + popup: false, + audio: false, + vanish: true, + content() { + "step 0"; + var source = player.storage.xintianxiang; + if (source.isDead()) { + event.finish(); + return; + } + var num = player.maxHp - player.hp || 0; + var str1 = "令" + get.translation(player) + "摸" + get.cnNumber(num) + "张牌"; + var str2 = "令" + get.translation(player) + "防止造成和受到的所有伤害且天香失效直到你下一回合开始"; + var att = get.attitude(source, player); + var choice = "选项一"; + if (att < 0) { + if (num >= 2) { + choice = "选项二"; + } + } else if (att > 0) { + if (num < 2 && !player.hasSkillTag("maixie")) { + choice = "选项二"; + } + } + source + .chooseControl(function () { + return _status.event.choice; + }) + .set("choiceList", [str1, str2]) + .set("choice", choice); + "step 1"; + if (result.control == "选项一") { + if (player.isDamaged()) { + player.draw(player.maxHp - player.hp); + } + } else { + player.storage.xintianxiang.addSkill("xintianxiang3"); + player.storage.xintianxiang.storage.xintianxiang3 = player; + player.addSkill("xintianxiang4"); + } + player.removeSkill("xintianxiang2"); + delete player.storage.xintianxiang; + }, + }, + xintianxiang3: { + trigger: { player: ["phaseZhunbeiBegin", "dieBegin"] }, + silent: true, + content() { + if (player.storage.xintianxiang3) { + player.storage.xintianxiang3.removeSkill("xintianxiang4"); + delete player.storage.xintianxiang3; + } + player.removeSkill("xintianxiang3"); + }, + }, + xintianxiang4: { + trigger: { source: "damageBefore", player: "damageBefore" }, + forced: true, + mark: true, + intro: { + content: "防止造成和受到的一切伤害", + }, + priority: 15, + content() { + trigger.cancel(); + }, + ai: { + nofire: true, + nothunder: true, + nodamage: true, + notrick: true, + notricksource: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage")) { + return "zeroplayertarget"; + } + }, + player(card, player, target, current) { + if (get.tag(card, "damage")) { + return "zeroplayertarget"; + } + }, + }, + }, + }, + hongyan: { + mod: { + suit(card, suit) { + if (suit == "spade") return "heart"; + }, + }, + }, + xinhongyan: { + audio: 2, + audioname: ["sb_xiaoqiao"], + mod: { + suit(card, suit) { + if (suit == "spade") return "heart"; + }, + }, + trigger: { global: "judge" }, + direct: true, + filter(event, player) { + if (event.fixedResult && event.fixedResult.suit) return event.fixedResult.suit == "heart"; + return get.suit(event.player.judging[0], event.player) == "heart"; + }, + content() { + "step 0"; + var str = "红颜:" + get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + ",请将其改为一种花色"; + player + .chooseControl("spade", "heart", "diamond", "club") + .set("prompt", str) + .set("ai", function () { + var judging = _status.event.judging; + var trigger = _status.event.getTrigger(); + var res1 = trigger.judge(judging); + var list = lib.suit.slice(0); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0) return 0; + var getj = function (suit) { + return trigger.judge({ + name: get.name(judging), + nature: get.nature(judging), + suit: suit, + number: get.number(judging), + }); + }; + list.sort(function (a, b) { + return (getj(b) - getj(a)) * get.sgn(attitude); + }); + return list[0]; + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.control != "cancel2") { + player.addExpose(0.25); + player.popup(result.control); + game.log(player, "将判定结果改为了", "#y" + get.translation(result.control + 2)); + if (!trigger.fixedResult) trigger.fixedResult = {}; + trigger.fixedResult.suit = result.control; + trigger.fixedResult.color = get.color({ suit: result.control }); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 0.4, + }, + expose: 0.5, + }, + }, + gzbuqu: { + audio: 2, + trigger: { player: "changeHp" }, + filter(event, player) { + return player.hp <= 0 && event.num < 0; + }, + marktext: "创", + intro: { + markcount: "expansion", + content: "expansion", + }, + group: "gzbuqu_recover", + frequent: true, + ondisable: true, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) { + //delete player.nodying; + player.loseToDiscardpile(cards); + if (player.hp <= 0) player.dying({}); + } + }, + process(player) { + //delete player.nodying; + var nums = []; + var cards = player.getExpansions("gzbuqu"); + for (var i = 0; i < cards.length; i++) { + if (nums.includes(get.number(cards[i]))) { + return false; + } else { + nums.push(get.number(cards[i])); + } + } + return true; + //player.nodying=true; + }, + subSkill: { + recover: { + trigger: { player: "recoverAfter" }, + filter(event, player) { + return player.getExpansions("gzbuqu").length > 0 && event.num > 0; + }, + forced: true, + popup: false, + content() { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + var cards = player.getExpansions("gzbuqu"), + count = cards.length; + if (count > 0 && player.hp + count > 1) { + if (count == 1) event._result = { links: cards }; + else + player.chooseCardButton("不屈:移去一张“创”", true, cards).set("ai", function (button) { + var buttons = get.selectableButtons(); + for (var i = 0; i < buttons.length; i++) { + if (buttons[i] != button && get.number(buttons[i].link) == get.number(button.link) && !ui.selected.buttons.includes(buttons[i])) { + return 1; + } + } + return 0; + }); + } else event.finish(); + "step 2"; + var cards = result.links; + player.loseToDiscardpile(cards); + if (event.count) event.goto(1); + "step 3"; + if (lib.skill.gzbuqu.process(player)) { + if (player.isDying()) { + var evt = event, + histories = [evt]; + while (true) { + evt = event.getParent("dying"); + if (!evt || evt.name != "dying" || histories.includes(evt)) break; + histories.push(evt); + if (evt.player == player) evt.nodying = true; + } + } + } + }, + }, + }, + content() { + "step 0"; + var num = -trigger.num - Math.max(player.hp - trigger.num, 1) + 1; + player.addToExpansion(get.cards(num), "gain2").gaintag.add("gzbuqu"); + "step 1"; + player.showCards(get.translation(player) + "的不屈牌", player.getExpansions("gzbuqu")); + "step 2"; + if (lib.skill.gzbuqu.process(player)) { + var evt = trigger.getParent(); + if (evt.name == "damage" || evt.name == "loseHp") evt.nodying = true; + } + }, + ai: { + mingzhi: true, + }, + }, + buqu: { + audio: 2, + audioname: ["key_yuri"], + trigger: { player: "chooseToUseBefore" }, + forced: true, + preHidden: true, + filter(event, player) { + return event.type == "dying" && player.isDying() && event.dying == player && !event.getParent()._buqu; + }, + content() { + "step 0"; + trigger.getParent()._buqu = true; + var card = get.cards()[0]; + event.card = card; + player.addToExpansion(card, "gain2").gaintag.add("buqu"); + "step 1"; + var cards = player.getExpansions("buqu"), + num = get.number(card); + player.showCards(cards, "不屈"); + for (var i = 0; i < cards.length; i++) { + if (cards[i] != card && get.number(cards[i]) == num) { + player.loseToDiscardpile(card); + return; + } + } + trigger.cancel(); + trigger.result = { bool: true }; + if (player.hp <= 0) { + player.recover(1 - player.hp); + } + }, + mod: { + maxHandcardBase(player, num) { + if (get.mode() != "guozhan" && player.getExpansions("buqu").length) return player.getExpansions("buqu").length; + }, + }, + ai: { + save: true, + mingzhi: true, + skillTagFilter(player, tag, target) { + if (player != target) return false; + }, + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + }, + fenji: { + audio: 2, + trigger: { + global: ["gainAfter", "loseAfter", "loseAsyncAfter"], + }, + direct: true, + filter(event, player) { + if (event.name == "lose") { + if (event.type != "discard" || !event.player.isIn()) return false; + if ((event.discarder || event.getParent(2).player) == event.player) return false; + if (!event.getl(event.player).hs.length) return false; + return true; + } else if (event.name == "gain") { + if (event.giver || event.getParent().name == "gift") return false; + var cards = event.getg(event.player); + if (!cards.length) return false; + return game.hasPlayer(function (current) { + if (current == event.player) return false; + var hs = event.getl(current).hs; + for (var i of hs) { + if (cards.includes(i)) return true; + } + return false; + }); + } else if (event.type == "gain") { + if (event.giver || !event.player || !event.player.isIn()) return false; + var hs = event.getl(event.player); + return game.hasPlayer(function (current) { + if (current == event.player) return false; + var cards = event.getg(current); + for (var i of cards) { + if (hs.includes(i)) return true; + } + }); + } else if (event.type == "discard") { + if (!event.discarder) return false; + return game.hasPlayer(function (current) { + return current != event.discarder && event.getl(current).hs.length > 0; + }); + } + return false; + }, + content() { + "step 0"; + var targets = []; + if (trigger.name == "gain") { + var cards = trigger.getg(trigger.player); + targets.addArray( + game.filterPlayer(function (current) { + if (current == trigger.player) return false; + var hs = trigger.getl(current).hs; + for (var i of hs) { + if (cards.includes(i)) return true; + } + return false; + }) + ); + } else if (trigger.name == "loseAsync" && trigger.type == "discard") { + targets.addArray( + game.filterPlayer(function (current) { + return current != trigger.discarder && trigger.getl(current).hs.length > 0; + }) + ); + } else targets.push(trigger.player); + event.targets = targets.sortBySeat(); + if (!event.targets.length) event.finish(); + "step 1"; + var target = targets.shift(); + event.target = target; + if (target.isIn()) + player.chooseBool(get.prompt("fenji", target), "失去1点体力,令该角色摸两张牌").set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target) > 4; + }); + else { + if (targets.length > 0) event.goto(1); + else event.finish(); + } + "step 2"; + if (result.bool) { + player.logSkill("fenji", target); + player.loseHp(); + } else { + if (targets.length > 0) event.goto(1); + else event.finish(); + } + "step 3"; + target.draw(2); + if (targets.length > 0) event.goto(1); + }, + }, + new_fenji: { + audio: "fenji", + trigger: { + global: "phaseJieshuBegin", + }, + filter(event, player) { + if (event.player.countCards("h") == 0 && event.player.isIn()) return true; + return false; + }, + preHidden: true, + check(event, player) { + return get.attitude(player, event.player) > 2; + }, + content() { + player.line(trigger.player, "green"); + trigger.player.draw(2); + player.loseHp(); + }, + }, + leiji: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + filter(event, player) { + return event.card.name == "shan"; + }, + direct: true, + preHidden: true, + content() { + "step 0"; + player.chooseTarget(get.prompt2("leiji")).setHiddenSkill(event.name).ai = function (target) { + if (target.hasSkill("hongyan")) return 0; + return get.damageEffect(target, _status.event.player, _status.event.player, "thunder"); + }; + "step 1"; + if (result.bool) { + player.logSkill("leiji", result.targets, "thunder"); + event.target = result.targets[0]; + event.target.judge(function (card) { + if (get.suit(card) == "spade") return -4; + return 0; + }).judge2 = function (result) { + return result.bool == false ? true : false; + }; + } else { + event.finish(); + } + "step 2"; + if (result.bool == false) { + event.target.damage(2, "thunder"); + } + }, + ai: { + mingzhi: false, + useShan: true, + effect: { + target(card, player, target, current) { + if ( + get.tag(card, "respondShan") && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) && + game.hasPlayer(function (current) { + return get.attitude(target, current) < 0 && get.damageEffect(current, target, target, "thunder") > 0; + }) + ) { + if (card.name === "sha") { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return; + } else if (!target.mayHaveShan(player)) return 1 - 0.1 * Math.min(5, target.countCards("hs")); + if (!target.hasSkillTag("rejudge")) return [1, 1]; + let pos = player.hasSkillTag("viewHandcard", null, target, true) ? "hes" : "e"; + if ( + target.hasCard(function (cardx) { + return get.suit(cardx) === "spade"; + }, pos) + ) + return [1, 4]; + if (pos === "e") return [1, Math.min(4, 1 + 0.75 * Math.max(1, target.countCards("hs")))]; + return [1, 1]; + } + }, + }, + }, + }, + guidao: { + audio: 2, + audioname: ["sp_zhangjiao"], + trigger: { global: "judge" }, + filter(event, player) { + return player.countCards("hes", { color: "black" }) > 0; + }, + direct: true, + content() { + "step 0"; + player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("guidao"), "hes", function (card) { + if (get.color(card) != "black") return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.bool) { + player.respond(result.cards, "highlight", "guidao", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.$gain2(trigger.player.judging[0]); + player.gain(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + } + "step 3"; + game.delay(2); + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + // 蛊惑(guhuo)技能错误,请勿引用 + /* + guhuo:{ + enable:'phaseUse', + usable:1, + audio:2, + filter:function(event,player){ + return player.countCards('hs')>0 + }, + chooseButton:{ + dialog:function(){ + var list=['sha','tao','jiu','taoyuan','wugu','juedou','huogong','jiedao','tiesuo','guohe','shunshou','wuzhong','wanjian','nanman']; + for(var i=0;i=3&&player.hp>=3) return 0; + for(var i=0;i 1) str += "中的一人"; + return str; + }, + filter(event, player) { + if (player.group != "qun") return false; + if (player.countCards("h", "shan") + player.countCards("h", "shandian") == 0) return 0; + return game.hasPlayer(function (target) { + return target != player && target.hasZhuSkill("huangtian", player) && !target.hasSkill("huangtian3"); + }); + }, + filterCard(card) { + return card.name == "shan" || card.name == "shandian"; + }, + log: false, + visible: true, + filterTarget(card, player, target) { + return target != player && target.hasZhuSkill("huangtian", player) && !target.hasSkill("huangtian3"); + }, + //usable:1, + //forceaudio:true, + content() { + player.give(cards, target); + target.addTempSkill("huangtian3", "phaseUseEnd"); + }, + ai: { + expose: 0.3, + order: 10, + result: { + target: 5, + }, + }, + }, + huangtian3: {}, + xinfu_guhuo: { + audio: "guhuo_guess", + derivation: ["chanyuan"], + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard(player, name) { + return lib.inpile.includes(name) && player.countCards("hs") > 0 && !player.hasSkill("guhuo_phase"); + }, + filter(event, player) { + if (player.hasSkill("guhuo_phase")) return false; + if (!player.countCards("hs")) 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; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard(get.autoViewAs({ name: i, nature: j }, "unsure"), player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog(event, player) { + var list = []; + for (var i of lib.inpile) { + if (event.type != "phase") if (!event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) continue; + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + if (event.type != "phase") if (!event.filterCard(get.autoViewAs({ name: i, nature: j }, "unsure"), player, event)) continue; + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } + } + return ui.create.dialog("蛊惑", [list, "vcard"]); + }, + filter(button, player) { + var evt = _status.event.getParent(); + return evt.filterCard({ name: button.link[2], nature: button.link[3] }, player, evt); + }, + check(button) { + var player = _status.event.player; + var enemyNum = game.countPlayer(function (current) { + return current != player && !current.hasSkill("chanyuan") && (get.realAttitude || get.attitude)(current, player) < 0; + }); + var card = { name: button.link[2], nature: button.link[3] }; + var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + if (val <= 0) return 0; + if (enemyNum) { + if ( + !player.hasCard(function (cardx) { + if (card.name == cardx.name) { + if (card.name != "sha") return true; + return get.is.sameNature(card, cardx); + } + return false; + }, "hs") + ) { + if (get.value(card, player, "raw") < 6) return Math.sqrt(val) * (0.25 + Math.random() / 1.5); + if (enemyNum <= 2) return Math.sqrt(val) / 1.5; + return 0; + } + return 3 * val; + } + return val; + }, + backup(links, player) { + return { + filterCard(card, player, target) { + var result = true; + var suit = card.suit, + number = card.number; + card.suit = "none"; + card.number = null; + var mod = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod != "unchanged") result = mod; + card.suit = suit; + card.number = number; + return result; + }, + selectCard: 1, + position: "hs", + ignoreMod: true, + aiUse: Math.random(), + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + }, + ai1(card) { + var player = _status.event.player; + var enemyNum = game.countPlayer(function (current) { + return current != player && !current.hasSkill("chanyuan") && (get.realAttitude || get.attitude)(current, player) < 0; + }); + var cardx = lib.skill.xinfu_guhuo_backup.viewAs; + if (enemyNum) { + if (card.name == cardx.name && (card.name != "sha" || get.is.sameNature(card, cardx))) return 2 + Math.random() * 3; + else if (lib.skill.xinfu_guhuo_backup.aiUse < 0.5 && !player.isDying()) return 0; + } + return 6 - get.value(card); + }, + precontent() { + player.logSkill("xinfu_guhuo"); + player.addTempSkill("guhuo_guess"); + var card = event.result.cards[0]; + event.result.card.suit = get.suit(card); + event.result.card.number = get.number(card); + }, + }; + }, + prompt(links, player) { + return "将一张手牌当做" + get.translation(links[0][2]) + (_status.event.name == "chooseToRespond" ? "打出" : "使用"); + }, + }, + ai: { + save: true, + respondSha: true, + respondShan: true, + fireAttack: true, + skillTagFilter(player) { + if (!player.countCards("hs") || player.hasSkill("guhuo_phase")) return false; + }, + threaten: 1.2, + order: 8.1, + result: { player: 1 }, + }, + }, + guhuo_guess: { + audio: 2, + trigger: { + player: ["useCardBefore", "respondBefore"], + }, + forced: true, + silent: true, + popup: false, + firstDo: true, + charlotte: true, + filter(event, player) { + return event.skill && (event.skill.indexOf("guhuo_") == 0 || event.skill.indexOf("xinfu_guhuo_") == 0); + }, + content() { + "step 0"; + player.addTempSkill("guhuo_phase"); + event.fake = false; + event.betrayer = null; + var card = trigger.cards[0]; + if (card.name != trigger.card.name || (card.name == "sha" && !get.is.sameNature(trigger.card, card))) event.fake = true; + player.popup(trigger.card.name, "metal"); + player.lose(card, ui.ordering).relatedEvent = trigger; + // player.line(trigger.targets,trigger.card.nature); + trigger.throw = false; + trigger.skill = "xinfu_guhuo_backup"; + game.log(player, "声明", trigger.targets && trigger.targets.length ? "对" : "", trigger.targets || "", trigger.name == "useCard" ? "使用" : "打出", trigger.card); + event.prompt = get.translation(player) + "声明" + (trigger.targets && trigger.targets.length ? "对" + get.translation(trigger.targets) : "") + (trigger.name == "useCard" ? "使用" : "打出") + (get.translation(trigger.card.nature) || "") + get.translation(trigger.card.name) + ",是否质疑?"; + event.targets = game + .filterPlayer(function (current) { + return current != player && !current.hasSkill("chanyuan"); + }) + .sortBySeat(_status.currentPhase); + + game.broadcastAll( + function (card, player) { + _status.guhuoNode = card.copy("thrown"); + if (lib.config.cardback_style != "default") { + _status.guhuoNode.style.transitionProperty = "none"; + ui.refresh(_status.guhuoNode); + _status.guhuoNode.classList.add("infohidden"); + ui.refresh(_status.guhuoNode); + _status.guhuoNode.style.transitionProperty = ""; + } else { + _status.guhuoNode.classList.add("infohidden"); + } + _status.guhuoNode.style.transform = "perspective(600px) rotateY(180deg) translateX(0)"; + player.$throwordered2(_status.guhuoNode); + }, + trigger.cards[0], + player + ); + event.onEnd01 = function () { + _status.guhuoNode.removeEventListener("webkitTransitionEnd", _status.event.onEnd01); + setTimeout(function () { + _status.guhuoNode.style.transition = "all ease-in 0.3s"; + _status.guhuoNode.style.transform = "perspective(600px) rotateY(270deg)"; + var onEnd = function () { + _status.guhuoNode.classList.remove("infohidden"); + _status.guhuoNode.style.transition = "all 0s"; + ui.refresh(_status.guhuoNode); + _status.guhuoNode.style.transform = "perspective(600px) rotateY(-90deg)"; + ui.refresh(_status.guhuoNode); + _status.guhuoNode.style.transition = ""; + ui.refresh(_status.guhuoNode); + _status.guhuoNode.style.transform = ""; + _status.guhuoNode.removeEventListener("webkitTransitionEnd", onEnd); + }; + _status.guhuoNode.listenTransition(onEnd); + }, 300); + }; + if (!event.targets.length) event.goto(3); + "step 1"; + event.target = event.targets.shift(); + event.target.chooseButton([event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true).set("ai", function (button) { + var player = _status.event.player; + var evt = _status.event.getParent("guhuo_guess"), + evtx = evt.getTrigger(); + if (!evt) return Math.random(); + var card = { name: evtx.card.name, nature: evtx.card.nature, isCard: true }; + var ally = button.link[2] == "reguhuo_ally"; + if (ally && (player.hp <= 1 || get.attitude(player, evt.player) >= 0)) return 1.1; + if (!ally && get.attitude(player, evt.player) < 0 && evtx.name == "useCard") { + var eff = 0; + var targetsx = evtx.targets || []; + for (var target of targetsx) { + var isMe = target == evt.player; + eff += get.effect(target, card, evt.player, player) / (isMe ? 1.5 : 1); + } + eff /= 1.5 * targetsx.length || 1; + if (eff > 0) return 0; + if (eff < -7) return Math.random() + Math.pow(-(eff + 7) / 8, 2); + return Math.pow((get.value(card, evt.player, "raw") - 4) / (eff == 0 ? 5 : 10), 2); + } + return Math.random(); + }); + "step 2"; + if (result.links[0][2] == "reguhuo_betray") { + target.addExpose(0.2); + game.log(target, "#y质疑"); + target.popup("质疑!", "fire"); + event.betrayer = target; + } else { + game.log(target, "#g不质疑"); + target.popup("不质疑", "wood"); + if (targets.length) event.goto(1); + } + "step 3"; + game.delayx(); + game.broadcastAll(function (onEnd) { + _status.event.onEnd01 = onEnd; + if (_status.guhuoNode) _status.guhuoNode.listenTransition(onEnd, 300); + }, event.onEnd01); + "step 4"; + game.delay(2); + "step 5"; + if (!event.betrayer) event.finish(); + "step 6"; + if (event.fake) { + event.betrayer.popup("质疑正确", "wood"); + game.log(player, "声明的", trigger.card, "作废了"); + trigger.cancel(); + trigger.getParent().goto(0); + trigger.line = false; + } else { + event.betrayer.popup("质疑错误", "fire"); + event.betrayer.addSkills("chanyuan"); + } + "step 7"; + game.delay(2); + "step 8"; + if (event.fake) game.broadcastAll(ui.clear); + }, + }, + chanyuan: { + init(player, skill) { + if (player.hp == 1) player.logSkill(skill); + player.addSkillBlocker(skill); + }, + onremove(player, skill) { + player.removeSkillBlocker(skill); + }, + skillBlocker(skill, player) { + return skill != "chanyuan" && skill != "rechanyuan" && !lib.skill[skill].charlotte && player.hp == 1; + }, + mark: true, + intro: { + content(storage, player, skill) { + var str = "
  • 锁定技。你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值为1时,你的其他技能失效。"; + var list = player.getSkills(null, false, false).filter(function (i) { + return lib.skill.rechanyuan.skillBlocker(i, player); + }); + if (list.length) str += "
  • 失效技能:" + get.translation(list); + return str; + }, + }, + audio: 2, + trigger: { player: "changeHp" }, + filter(event, player) { + return player.hp == 1; + }, + forced: true, + content() {}, + }, + guhuo_phase: {}, +}; + +export default skills; diff --git a/character/shenhua/sort.js b/character/shenhua/sort.js new file mode 100644 index 000000000..3b7bb2637 --- /dev/null +++ b/character/shenhua/sort.js @@ -0,0 +1,19 @@ +const characterSort = { + shenhua_feng: ["sp_zhangjiao", "re_yuji", "old_zhoutai", "old_caoren", "re_xiahouyuan", "xiaoqiao", "re_huangzhong", "re_weiyan"], + shenhua_huo: ["dianwei", "xunyu", "pangtong", "sp_zhugeliang", "taishici", "yanwen", "re_yuanshao", "re_pangde"], + shenhua_lin: ["caopi", "re_xuhuang", "menghuo", "zhurong", "re_lusu", "sunjian", "dongzhuo", "jiaxu"], + shenhua_shan: ["dengai", "zhanghe", "liushan", "jiangwei", "zhangzhang", "sunce", "caiwenji", "zuoci"], + shenhua_yin: ["wangji", "kuailiangkuaiyue", "yanyan", "wangping", "sunliang", "luji", "xuyou", "yl_luzhi"], + shenhua_lei: ["haozhao", "guanqiujian", "chendao", "zhugezhan", "lukang", "zhoufei", "zhangxiu", "yl_yuanshu"], +}; + +const characterSortTranslate = { + shenhua_feng: "神话再临·风", + shenhua_huo: "神话再临·火", + shenhua_lin: "神话再临·林", + shenhua_shan: "神话再临·山", + shenhua_yin: "神话再临·阴", + shenhua_lei: "神话再临·雷", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/shenhua/translate.js b/character/shenhua/translate.js new file mode 100644 index 000000000..4eed1fe27 --- /dev/null +++ b/character/shenhua/translate.js @@ -0,0 +1,392 @@ +const translates = { + re_yuanshao: "袁绍", + re_lusu: "鲁肃", + re_yuji: "于吉", + wangji: "王基", + kuailiangkuaiyue: "蒯良蒯越", + sunliang: "孙亮", + yl_luzhi: "卢植", + xuyou: "许攸", + luji: "陆绩", + wangping: "王平", + yanyan: "严颜", + + zhugezhan: "诸葛瞻", + lukang: "陆抗", + haozhao: "郝昭", + yl_yuanshu: "新杀袁术", + yl_yuanshu_prefix: "新杀", + zhangxiu: "张绣", + chendao: "陈到", + guanqiujian: "毌丘俭", + zhoufei: "周妃", + + nzry_jianxiang: "荐降", + nzry_jianxiang_info: "当你成为其他角色使用牌的目标时,你可令手牌数最少的一名角色摸一张牌。", + nzry_shenshi1: "审时", + nzry_shenshi: "审时", + nzry_shenshi_info: "转换技,阴:出牌阶段限一次,你可以将一张牌交给一名除你外手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。", + nzry_mingren: "明任", + nzry_mingren_info: "游戏开始时,你摸两张牌,然后将一张手牌置于你的武将牌上,称为“任”。结束阶段,你可以用一张手牌替换“任”。", + nzry_zhenliang: "贞良", + nzry_zhenliang_info: "转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。", + nzry_chenglve1: "成略", + nzry_chenglve: "成略", + nzry_chenglve_info: "转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。", + nzry_cunmu: "寸目", + nzry_cunmu_info: "锁定技,当你摸牌时,改为从牌堆底摸牌。", + nzry_kuizhu: "溃诛", + nzry_kuizhu_info: "弃牌阶段结束后,你可以选择一项:①令至多X名角色各摸一张牌。②对任意名体力值之和为X的角色造成1点伤害。(X为你此阶段弃置的牌数)", + nzry_zhizheng: "掣政", + rechezheng: "掣政", + nzry_zhizheng_info: "锁定技,你的出牌阶段内,当你对攻击范围内不包含你的其他角色造成伤害时,防止此伤害。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。", + nzry_lijun1: "立军", + nzry_lijun: "立军", + nzry_lijun_info: "主公技,其他吴势力角色的出牌阶段限一次,其使用【杀】结算后,可以将此【杀】对应的实体牌交给你,然后你可以令其摸一张牌且本阶段内使用【杀】的次数上限+1。", + nzry_huaiju: "怀橘", + nzry_huaiju_info: "锁定技,游戏开始时,你获得3个“橘”标记。(有“橘”的角色受到伤害时,防止此伤害,然后移去一个“橘”;有“橘”的角色摸牌阶段额外摸一张牌)", + tachibana_effect: "怀橘", + nzry_yili: "遗礼", + nzry_yili_info: "出牌阶段开始时,你可以失去1点体力或移去一个“橘”,然后令一名其他角色获得一个“橘”。", + nzry_zhenglun: "整论", + nzry_zhenglun_info: "若你没有“橘”,你可以跳过摸牌阶段然后获得一个“橘”。", + nzry_feijun: "飞军", + nzry_feijun_info: "出牌阶段限一次。你可以弃置一张牌,然后选择一项:⒈令一名手牌数大于你的角色交给你一张牌;⒉令一名装备区里牌数大于你的角色弃置一张装备牌。", + nzry_binglve: "兵略", + nzry_binglve_info: "锁定技,当你发动“飞军”时,若目标与你之前指定的目标均不相同,则你摸两张牌。", + nzry_juzhan1: "拒战", + nzry_juzhan: "拒战", + nzry_juzhan_info: "转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。", + + liangyin: "良姻", + liangyin_info: "当有牌移至游戏外时,你可以令手牌数大于你的一名角色摸一张牌;当有牌从游戏外加入任意角色的手牌时,你可以令手牌数小于你的一名角色弃置一张牌。", + kongsheng: "箜声", + kongsheng_info: "准备阶段,你可以将任意张牌置于你的武将牌上;结束阶段,你使用武将牌上的装备牌,并获得武将牌上的其他牌。", + kongsheng2: "箜声", + kongsheng2_info: "", + xinfu_zuilun: "罪论", + xinfu_zuilun_info: "结束阶段,你可以观看牌堆顶三张牌,你每满足以下一项便保留一张,然后以任意顺序放回其余的牌:1.你于此回合内造成过伤害;2.你于此回合内未弃置过牌;3.手牌数为全场最少。若均不满足,你与一名其他角色失去1点体力。", + xinfu_fuyin: "父荫", + xinfu_fuyin_info: "锁定技,你每回合第一次成为【杀】或【决斗】的目标后,若你的手牌数小于等于该角色,此牌对你无效。", + drlt_wanglie: "往烈", + drlt_wanglie_info: "①出牌阶段,你使用的第一张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能再使用牌。", + drlt_xiongluan: "雄乱", + drlt_xiongluan1: "雄乱", + drlt_xiongluan_info: "限定技,出牌阶段,你可以废除你的判定区和装备区,然后指定一名其他角色。直到回合结束,你对其使用牌无距离和次数限制,其不能使用和打出手牌。", + drlt_congjian: "从谏", + drlt_congjian_info: "当你成为锦囊牌的目标时,若此牌的目标数大于1,则你可以交给其中一名其他目标角色一张牌,然后摸一张牌,若你给出的是装备牌,改为摸两张牌。", + drlt_yongsi: "庸肆", + drlt_yongsi_info: "锁定技,摸牌阶段,你改为摸X张牌(X为存活势力数);出牌阶段结束时,若你本回合:1.没有造成伤害,将手牌摸至当前体力值;2.造成的伤害超过1点,本回合手牌上限改为已损失体力值。", + drlt_weidi: "伪帝", + weidi_tag: "伪帝", + drlt_weidi_info: "主公技,弃牌阶段开始时,若你的手牌数大于手牌上限,则你可以将至多X张手牌分别交给等量的其他群雄角色(X为你的手牌数与手牌上限之差)。", + drlt_qianjie: "谦节", + drlt_qianjie_info: "锁定技,当你横置时,取消之。你不能成为延时类锦囊的目标。你不能成为其他角色拼点的目标。", + drlt_jueyan: "决堰", + drlt_jueyan_info: "出牌阶段限一次,你可以废除一种装备栏,然后执行对应一项:武器栏,你本回合内使用【杀】的次数上限+3;防具栏,你摸三张牌,且本回合手牌上限+3;坐骑栏,你本回合内使用牌无距离限制;宝物栏,你获得〖集智〗直到回合结束。", + drlt_poshi: "破势", + drlt_poshi_info: "觉醒技,准备阶段开始时,若你的装备栏均已被废除或体力值为1,则你减1点体力上限,将手牌摸至体力上限,失去〖决堰〗并获得〖怀柔〗。", + drlt_huairou: "怀柔", + drlt_huairou_info: "出牌阶段,你可以重铸装备牌。", + drlt_zhenggu: "镇骨", + drlt_zhenggu2: "镇骨", + drlt_zhenggu_info: "结束阶段,你可以选择一名其他角色,你的回合结束后和该角色的下个回合结束时,其将手牌摸至或弃至X张。(X为你的手牌数且至多为5)", + drlt_zhenrong: "征荣", + drlt_zhenrong_info: "当你对其他角色造成伤害后,若其手牌比你多,你可以将其一张牌置于你的武将牌上,称为“荣”。", + drlt_hongju: "鸿举", + drlt_hongju_info: "觉醒技,准备阶段,若“荣”的数量大于或等于3且场上有角色死亡,则你可以用任意张手牌替换等量的“荣”,然后减1点体力上限并获得〖清侧〗。", + drlt_qingce: "清侧", + drlt_qingce_info: "出牌阶段,你可以移去一张“荣”,然后弃置一名角色装备区或判定区内的一张牌。", + + zhengrong: "征荣", + hongju: "鸿举", + qingce: "清侧", + qingce_backup: "清侧", + zhengrong_info: "当你使用带有「伤害」标签的基本牌或锦囊牌指定目标后,你可以将一名手牌数不小于你的目标角色的一张牌置于你的武将牌上,称为「荣」。", + hongju_info: "觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3,则你触发此技能。你可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。", + qingce_info: "出牌阶段,你可以获得一张「荣」并弃置一张手牌,然后弃置场上的一张牌。", + + jianchu: "鞬出", + jianchu_info: "当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌为装备牌,此【杀】不可被【闪】响应,若不为装备牌,该角色获得此【杀】。", + redimeng: "缔盟", + redimeng_info: "出牌阶段限一次,你可以弃置X张牌选择两名其他角色(X为这两名角色的手牌差),你混合他们的手牌,然后令其中一名角色获得其中的一张牌,并令另一名角色获得其中的一张牌,然后重复此流程,直到这些牌均被获得为止。", + reluanji: "乱击", + reluanji_info: "你可以将两张与你本回合以此法转化的花色均不相同的手牌当【万箭齐发】使用,然后当一名角色因响应此牌而打出【闪】时,该角色摸一张牌。若你以此法使用的【万箭齐发】未造成伤害,则你可以在此牌结算完成后摸X张牌。(X为此牌的目标数)", + xintianxiang: "天香", + xintianxiang2: "天香", + xintianxiang3: "天香", + xintianxiang4: "天香", + xintianxiang_bg: "香", + xintianxiang_info: "当你受到伤害时,你可以弃置一张♥牌,将此伤害转移给一名其他角色,然后你选择一项:令该角色摸X张牌(X为其已损失的体力值);或防止其造成与受到的所有伤害,且此技能失效直到你的下回合开始。", + xinshensu: "神速", + xinshensu_info: "你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。", + yinghun: "英魂", + yinghun_info: "准备阶段开始时,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。", + gzyinghun: "英魂", + gzyinghun_info: "准备阶段开始时,若你已受伤,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。", + + tiaoxin: "挑衅", + zhiji: "志继", + zhiji_draw: "摸牌", + zhiji_recover: "回血", + xiangle: "享乐", + fangquan: "放权", + ruoyu: "若愚", + qiaobian: "巧变", + tuntian: "屯田", + tuntian_bg: "田", + zaoxian: "凿险", + jixi: "急袭", + jiang: "激昂", + hunzi: "魂姿", + zhiba: "制霸", + zhiba2: "制霸", + zhijian: "直谏", + guzheng: "固政", + beige: "悲歌", + duanchang: "断肠", + // fushen:'附身', + huashen: "化身", + xinsheng: "新生", + qimou: "奇谋", + xinqiangxi: "强袭", + xinjushou: "据守", + xinjiewei: "解围", + retianxiang: "天香", + retianxiang_info: "当你受到伤害时,你可以弃置一张红桃手牌,防止此次伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。", + xinjiewei_info: "你可以将装备区里的牌当【无懈可击】使用;当你的武将牌从背面翻至正面时,你可以弃置一张牌,然后移动场上的一张牌。", + xinjushou_info: "结束阶段,你可以翻面并摸四张牌,然后弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之。", + jixi_info: "出牌阶段,你可以将任意一张“田”当作【顺手牵羊】使用。", + xinqiangxi_info: "出牌阶段各限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张装备牌并对你攻击范围内的一名其他角色造成1点伤害。", + qimou_info: "限定技,出牌阶段,你可以失去任意点体力,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。", + tiaoxin_info: "出牌阶段限一次,你可以指定一名攻击范围内包含你的角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。", + zhiji_info: "觉醒技,准备阶段,若你没有手牌,你须回复1点体力或摸两张牌,然后减1点体力上限,并获得技能〖观星〗。", + xiangle_info: "锁定技,当其他角色使用【杀】指定你为目标时,其需弃置一张基本牌,否则此【杀】对你无效。", + fangquan_info: "你可跳过你的出牌阶段,若如此做,回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。", + ruoyu_info: "主公技,觉醒技,准备阶段,若你的体力是全场最少的(或之一),你须增加1点体力上限并回复1点体力,然后获得技能〖激将〗。", + qiaobian_info: "你可以弃置一张手牌并跳过自己的一个阶段(准备阶段和结束阶段除外)。若你以此法跳过了摸牌阶段,则你可以获得至多两名其他角色的各一张手牌;若你以此法跳过了出牌阶段,则你可以移动场上的一张牌。", + tuntian_info: "①当你于回合外失去牌后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。", + zaoxian_info: "觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。", + jiang_info: "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", + hunzi_info: "觉醒技,准备阶段,若你的体力值为1,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。", + zhiba_info: "主公技,其他吴势力角色的出牌阶段限一次,其可与你进行一次拼点。若该角色没赢,你可以获得双方拼点的牌。若你已发动过〖魂姿〗,你可以拒绝此拼点。", + zhijian_info: "出牌阶段,你可以将手牌中的一张装备牌置于一名其他角色装备区里(不得替换原装备),然后摸一张牌。", + guzheng_info: "其他角色的弃牌阶段结束时,你可以令其获得本阶段内进入弃牌堆的牌中的一张,然后你获得其余的牌。", + beige_info: "当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复1点体力;♦︎该角色摸两张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。", + duanchang_info: "锁定技,杀死你的角色失去当前的所有技能。", + // fushen_info:'回合开始前,你可以选择与任意一名角色交换控制权,该角色可选择在下一个回合开始前与你换回。', + huashen_info: "①游戏开始时,你随机将武将牌堆中的两张牌扣置于武将牌上(均称为“化身牌”),选择并亮出一张“化身牌”并声明该武将牌上的一个技能,你拥有该技能且同时将性别和势力属性变成与该武将相同直到该化身被替换(你不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能)。②回合开始时或回合结束时,你重新可以选择一张“化身牌”并声明该武将牌上的一个技能。", + xinsheng_info: "当你受到1点伤害后,你可以获得一张“化身牌”。", + jiangwei: "姜维", + liushan: "刘禅", + zhanghe: "张郃", + dengai: "邓艾", + sunce: "孙策", + zhangzhang: "张昭张纮", + caiwenji: "蔡琰", + zuoci: "左慈", + + zhurong: "祝融", + menghuo: "孟获", + caopi: "曹丕", + re_xuhuang: "徐晃", + lusu: "旧鲁肃", + lusu_prefix: "旧", + sunjian: "孙坚", + dongzhuo: "董卓", + jiaxu: "贾诩", + huoshou: "祸首", + huoshou1: "祸首", + huoshou2: "祸首", + zaiqi: "再起", + zaiqixx: "再起", + juxiang: "巨象", + juxiang1: "巨象", + juxiang2: "巨象", + lieren: "烈刃", + xingshang: "行殇", + fangzhu: "放逐", + songwei: "颂威", + songwei2: "颂威", + duanliang: "断粮", + duanliang1: "断粮", + haoshi: "好施", + dimeng: "缔盟", + jiuchi: "酒池", + roulin: "肉林", + benghuai: "崩坏", + baonue: "暴虐", + baonue2: "暴虐", + baonue_hp: "体力", + baonue_maxHp: "体力上限", + luanwu: "乱武", + wansha: "完杀", + weimu: "帷幕", + jiezi: "截辎", + jiezi_info: "锁定技,其他角色跳过摸牌阶段后,你摸一张牌。", + huoshou_info: "锁定技,【南蛮入侵】对你无效;你视为所有【南蛮入侵】的伤害来源。", + zaiqi_info: "摸牌阶段,若你已受伤,则你可以改为亮出牌堆顶的X张牌(X为你已损失的体力值),并回复X点体力(X为其中♥牌的数目)。然后你将这些♥牌置入弃牌堆,并获得其余的牌。", + zaiqixx_info: "摸牌阶段,若你已受伤,则你可以改为亮出牌堆顶的X张牌(X为你已损失的体力值+1),并回复X点体力(X为其中♥牌的数目)。然后你将这些♥牌置入弃牌堆,并获得其余的牌。", + juxiang_info: "锁定技。①【南蛮入侵】对你无效。②其他角色使用的【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。", + lieren_info: "当你使用【杀】造成伤害后,可与受到该伤害的角色进行拼点;若你赢,你获得对方的一张牌。", + xingshang_info: "当有角色死亡后,你可以获得该角色的所有牌。", + fangzhu_info: "当你受到伤害后,你可令一名其他角色摸X张牌(X为你已损失的体力值),然后该角色将武将牌翻面。", + songwei_info: "主公技,其他魏势力的角色的判定牌结果为黑色且生效后,其可以令你摸一张牌。", + duanliang_info: "你可以将一张黑色基本牌或装备牌当做【兵粮寸断】使用;若一名角色的手牌数大于或等于你的手牌数,则你对其使用【兵粮寸断】没有距离限制。", + haoshi_info: "摸牌阶段,你可以额外摸两张牌。若此时你的手牌数多于五张,你须将一半(向下取整)的手牌交给场上除你外手牌数最少的一名角色。", + dimeng_info: "出牌阶段限一次,你可以选择其他两名角色,你弃置等同于这两名角色手牌数量之差的牌,然后交换他们的手牌。", + yinghun_old_info: "准备阶段,若你已受伤,则你可以令一名其他角色执行下列两项中的一项: 1.摸X张牌,然后弃一张牌。 2.摸一张牌,然后弃X张牌。 (X为你已损失的体力值)", + jiuchi_info: "你可以将一张♠手牌当作【酒】使用。", + roulin_info: "锁定技。你对女性角色、女性角色对你使用【杀】时,都需连续使用两张【闪】才能抵消。", + benghuai_info: "锁定技。结束阶段,若你的体力不为全场最少,你失去1点体力或减1点体力上限。", + baonue_info: "主公技,其他群雄角色造成伤害后,可进行一次判定,若为♠,你回复1点体力。", + luanwu_info: "限定技,出牌阶段,你可令除你外的所有角色依次对与其距离最近的另一名角色使用一张【杀】,否则失去1点体力。", + wansha_info: "锁定技,你的回合内,除你以外,不处于濒死状态的角色不能使用【桃】。", + weimu_info: "锁定技,你不能成为黑色锦囊牌的目标。", + + sp_zhugeliang: "卧龙", + pangtong: "庞统", + xunyu: "荀彧", + dianwei: "典韦", + taishici: "太史慈", + yanwen: "颜良文丑", + yuanshao: "旧袁绍", + yuanshao_prefix: "旧", + re_pangde: "庞德", + huoji: "火计", + bazhen: "八阵", + kanpo: "看破", + niepan: "涅槃", + oldniepan: "涅槃", + quhu: "驱虎", + jieming: "节命", + qiangxix: "强袭", + qiangxi: "强袭", + tianyi: "天义", + shuangxiong: "双雄", + shuangxiong1: "双雄", + shuangxiong2: "双雄", + luanji: "乱击", + xueyi: "血裔", + mengjin: "猛进", + huoji_info: "你可以将一张红色手牌当作【火攻】使用。", + bazhen_info: "锁定技,若你的防具栏内没有牌且没有被废除,则你视为装备着【八卦阵】。", + kanpo_info: "你可以将你的任意一张黑色手牌当做【无懈可击】使用。", + niepan_info: "限定技,出牌阶段或当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。", + oldniepan_info: "限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。", + quhu_info: "出牌阶段限一次,你可以与一名体力值大于你的角色拼点,若你赢,则该角色对其攻击范围内另一名由你指定的角色造成1点伤害。若你没赢,该角色对你造成1点伤害。", + jieming_info: "当你受到1点伤害后,你可令一名角色将手牌摸至X张(X为其体力上限且至多为5)。", + qiangxi_info: "出牌阶段限一次,你可以失去1点体力或弃置一张武器牌,然后对你攻击范围内的一名其他角色造成1点伤害。", + qiangxix_info: "出牌阶段限两次,你可以失去1点体力或弃置一张武器牌,然后对一名本阶段内未成为过〖强袭〗的目标的其他角色造成1点伤害。", + tianyi_info: "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你获得以下技能效果直到回合结束:你使用【杀】没有距离限制;可额外使用一张【杀】;使用【杀】时可额外指定一个目标。若你没赢,你不能使用【杀】直到回合结束。", + shuangxiong_info: "摸牌阶段,你可以改为进行一次判定:你获得此判定牌,且你可以于此回合内将任意一张与此判定牌不同颜色的手牌当做【决斗】使用。", + luanji_info: "出牌阶段,你可以将任意两张相同花色的手牌当做【万箭齐发】使用。", + xueyi_info: "主公技,锁定技,场上每有一名其他群雄角色存活,你的手牌上限便+2。", + mengjin_info: "当你使用的【杀】被【闪】抵消时,你可以弃置目标角色的一张牌。", + + re_xiahouyuan: "夏侯渊", + re_huangzhong: "黄忠", + re_weiyan: "魏延", + + gz_xiahouyuan: "夏侯渊", + gz_huangzhong: "黄忠", + gz_weiyan: "魏延", + gz_xuhuang: "徐晃", + gz_pangde: "庞德", + gz_caoren: "曹仁", + gz_zhoutai: "周泰", + + old_zhoutai: "周泰", + old_caoren: "曹仁", + xuhuang: "旧徐晃", + xuhuang_prefix: "旧", + pangde: "旧庞德", + pangde_prefix: "旧", + xiahouyuan: "旧夏侯渊", + xiahouyuan_prefix: "旧", + huangzhong: "旧黄忠", + huangzhong_prefix: "旧", + sp_zhangjiao: "张角", + weiyan: "旧魏延", + weiyan_prefix: "旧", + xiaoqiao: "小乔", + zhangjiao: "旧张角", + zhangjiao_prefix: "旧", + //yuji:'于吉', + shensu: "神速", + shensu1: "神速", + shensu2: "神速", + shensu4: "神速", + jushou: "据守", + moon_jushou: "据守", + liegong: "烈弓", + kuanggu: "狂骨", + tianxiang: "天香", + hongyan: "红颜", + buqu: "不屈", + buqu_bg: "创", + leiji: "雷击", + guidao: "鬼道", + huangtian: "黄天", + huangtian2: "黄天", + guhuo: "蛊惑", + fenji: "奋激", + releiji: "雷击", + jiewei: "解围", + tiangong: "天公", + tiangong2: "天公", + xinliegong: "烈弓", + xinkuanggu: "狂骨", + gzbuqu: "不屈", + gzbuqu_info: "①当你扣减1点体力时,若你的体力值小于1,你可以将牌堆顶的一张牌置于你的武将牌上,称为“创”。②当你回复1点体力时,你移去一张“创”。③若你有“创”且点数均不相同,则你不结算濒死流程。", + xinkuanggu_info: "当你造成1点伤害后,若受伤角色受到此伤害时你与其的距离不大于1,则你可以回复1点体力或摸一张牌。", + xinliegong_info: "①你使用【杀】可以选择你距离不大于此【杀】点数的角色为目标。②当你使用【杀】指定一个目标后,你可以根据下列条件执行相应的效果:1.其手牌数小于等于你的手牌数,此【杀】不可被响应,2.其体力值大于等于你的体力值,此【杀】伤害+1。", + jiewei_info: "当你的武将牌翻面后,你可以摸一张牌。然后你可以使用一张锦囊牌或装备牌,并可以在此牌结算后弃置场上一张同类型的牌。", + releiji_info: "当你使用或打出一张【闪】时,你可令一名其他角色进行一次判定:若结果为梅花,你回复1点体力,并对其造成1点雷电伤害;若结果为黑桃,你对其造成2点雷电伤害。", + tiangong_info: "锁定技,你防止即将受到的雷电伤害。每当你造成雷电伤害时,你摸一张牌。", + shensu_info: "你可以跳过判定阶段和摸牌阶段,或跳过出牌阶段并弃置一张装备牌。若如此做,则你可以视为对任意一名角色使用一张无距离限制的【杀】。", + jushou_info: "结束阶段,你可以摸三张牌并翻面。", + moon_jushou_info: "结束阶段,你可以摸一张牌并翻面。", + liegong_info: "当你使用【杀】时,若目标的手牌数大于等于你的体力值,或小于等于你的攻击范围,你可令此【杀】不能被响应。", + kuanggu_info: "锁定技,当你造成伤害后,若受伤角色受到此伤害时你与其的距离不大于1,你回复X点体力(X为伤害值)。", + tianxiang_info: "当你即将受到伤害时,你可以弃置一张♥手牌,将伤害转移给一名其他角色,然后该角色摸X张牌(X为其已损失的体力值)。", + hongyan_info: "锁定技,你区域内的黑桃牌和黑桃判定牌均视为红桃。", + buqu_info: "锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。只要你的武将牌上有“创”,你的手牌上限便与“创”的数量相等。", + buqu_info_guozhan: "锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。", + leiji_info: "当你使用或打出一张【闪】时,你可令任意一名角色进行一次判定。若结果为黑桃,其受到2点雷电伤害。", + guidao_info: "一名角色的判定牌生效前,你可以打出一张黑色牌替换之。", + huangtian_info: "主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张【闪】或【闪电】。", + guhuo_info: "每名角色的回合限一次,你可以扣置一张手牌当一张基本牌或普通锦囊牌使用或打出。其他角色依次选择是否质疑。一旦有其他角色质疑则翻开此牌:若为假则此牌作废,若为真,则质疑角色获得技能“缠怨”(锁定技,你不能质疑于吉,只要你的体力值为1,你失去你的武将技能)。", + fenji_info: "当一名角色的手牌不因赠予或交给而被另一名角色得到后,或一名角色的手牌被另一名角色弃置后,你可以失去1点体力,令其摸两张牌。", + + new_fenji: "奋激", + new_fenji_info: "一名角色的结束阶段开始时,若其没有手牌,你可以令其摸两张牌,然后你失去1点体力。", + gzduanliang: "断粮", + gzduanliang_info: "你可以将一张黑色基本牌或黑色装备牌当【兵粮寸断】使用;你可以对距离为2的角色使用【兵粮寸断】。", + xinfu_guhuo: "蛊惑", + xinfu_guhuo_info: "每回合限一次。你可以扣置一张手牌当做一张基本牌或普通锦囊牌使用或打出,其他角色依次选择是否质疑。当有角色质疑时,你终止质疑流程并展示此牌:若为假,此牌作废;若为真,该角色获得〖缠怨〗。", + guhuo_guess: "蛊惑", + guhuo_guess_info: "", + chanyuan: "缠怨", + chanyuan_info: "锁定技。你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值为1时,你的其他技能失效。", + guhuo_respond: "蛊惑", + guhuo_respond_info: "", + guhuo_wuxie: "蛊惑", + guhuo_wuxie_info: "", + guhuo_phase: "蛊惑", + guhuo_phase_info: "", + xinhongyan: "红颜", + xinhongyan_info: "锁定技,你的♠牌和♠判定牌的花色视为♥。一名角色的判定结果生效前,若判定结果为♥,则你将其改为一种花色。", + olliangyin: "良姻", + olliangyin_info: "当有牌发生移动后,若此移动事件是本回合内你拥有〖良姻〗期间的首个有牌移出游戏/移入游戏的事件,则你可以选择一名其他角色。你与其各摸一张牌/弃置一张牌,然后你可以选择你或其中的一名手牌数为X的角色,该角色回复1点体力(X为你的“箜”数)。", + olkongsheng: "箜声", + olkongsheng_info: "①准备阶段开始时,你可以将任意张牌置于你的武将牌上,称为“箜”。②结束阶段开始时,若你有不为装备牌的“箜”,则你获得“箜”中的非装备牌,然后令一名角色依次使用“箜”中的装备牌并失去1点体力。", + dcwanglie: "往烈", + dcwanglie_info: "①出牌阶段,你对其他角色使用的前两张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能使用牌指定其他角色为目标。", + nzry_shicai: "恃才", + nzry_shicai_info: "当你使用非装备牌结算结束后,或成为自己使用装备牌的目标后,若此牌与你本回合使用的牌类型均不同,则你可以将此牌置于牌堆顶,然后摸一张牌。", + lianhuan: "连环", + lianhuan_info: "你可以将♣手牌当作【铁索连环】使用或重铸。", +}; + +export default translates; diff --git a/character/shenhua/voices.js b/character/shenhua/voices.js new file mode 100644 index 000000000..f6cba5f81 --- /dev/null +++ b/character/shenhua/voices.js @@ -0,0 +1,245 @@ +export default { + "#liegong_re_huangzhong1": "弓不离手,自有转机。", + "#liegong_re_huangzhong2": "箭阵开道,所向无敌!", + "#re_huangzhong:die": "真哉,老将无用矣……", + "#gzbuqu1": "还不够!", + "#gzbuqu2": "我绝不会倒下!", + "#old_zhoutai:die": "敌众我寡,无力回天……", + "#jushou1": "我先休息一会!", + "#jushou2": "尽管来吧!", + "#old_caoren:die": "长江以南,再无王土矣……", + "#duanliang1_re_xuhuang1": "粮不三载,敌军已犯行军大忌。", + "#duanliang1_re_xuhuang2": "断敌粮秣,此战可胜。", + "#jiezi1": "因粮于敌,故军食可足也。", + "#jiezi2": "食敌一钟,当吾二十钟。", + "#re_xuhuang:die": "敌军防备周全,是吾轻敌……", + "#mashu": null, + "#mashu1": null, + "#mashu2": null, + "#jianchu_re_pangde1": "来呀,冲杀出去,杀他个片甲不留。", + "#jianchu_re_pangde2": "一人一骑,横扫千军!", + "#re_pangde:die": "我宁为国家鬼,不为贼将也!", + "#shensu1_re_xiahouyuan1": "吾等无需恋战。", + "#shensu1_re_xiahouyuan2": "吾自当以一当十,速战速决。", + "#re_xiahouyuan:die": "吾命休矣,遂成竖子之名。", + "#kuanggu_re_weiyan1": "哼!也不看看我是何人!", + "#kuanggu_re_weiyan2": "哈哈哈哈哈哈,赢你还不容易?", + "#qimou1": "成王败寇,怎可有勇无谋?", + "#qimou2": "且不要因为暂时的得失而胆怯。", + "#re_weiyan:die": "奸贼……害我……", + "#tianxiang1": "接着哦~", + "#tianxiang2": "替我挡着~", + "#hongyan": "(笑声)", + "#hongyan1": null, + "#hongyan2": null, + "#xiaoqiao:die": "公瑾…我先走一步……", + "#releiji1": "成为黄天之世的祭品吧!", + "#releiji2": "呼风唤雨,驱雷策电!", + "#guidao_sp_zhangjiao1": "道士所向,皆由我控。", + "#guidao_sp_zhangjiao2": "天意如此。", + "#huangtian21": "苍天已死,黄天当立!", + "#huangtian22": "黄天立,民心顺,天下平。", + "#sp_zhangjiao:die": "黄天既覆……苍生何存?", + "#guhuo_guess1": "道法玄机,变幻莫测。", + "#guhuo_guess2": "如真似幻,扑朔迷离。", + "#re_yuji:die": "幻化之物,终是算不得真呐。", + "#bazhen1": "你可识得此阵?", + "#bazhen2": "太极生两仪,两仪生四象,四象生八卦。", + "#huoji1": "此火可助我军大获全胜。", + "#huoji2": "燃烧吧!", + "#kanpo1": "雕虫小技。", + "#kanpo2": "你的计谋被识破了。", + "#sp_zhugeliang:die": "我的计谋竟被……", + "#lianhuan1": "伤一敌可连其百!", + "#lianhuan2": "通通连起来吧!", + "#niepan1": "凤雏岂能消亡?", + "#niepan2": "浴火重生!", + "#pangtong:die": "看来我命中注定将丧命于此……", + "#quhu1": "此乃驱虎吞狼之计。", + "#quhu2": "借你之手,与他一搏吧。", + "#jieming1": "秉忠贞之志,守谦退之节。", + "#jieming2": "我,永不背弃。", + "#xunyu:die": "主公要臣死,臣不得不死。", + "#qiangxi1": "吃我一戟!", + "#qiangxi2": "看我三步之内取你小命!", + "#dianwei:die": "主公,快走!", + "#tianyi1": "请助我一臂之力!", + "#tianyi2": "我当要替天行道!", + "#taishici:die": "大丈夫,当带三尺之剑,立不世之功!", + "#shuangxiong1": "吾乃河北上将颜良文丑是也!", + "#shuangxiong2": "快来与我等决一死战!", + "#yanwen:die": "这红脸长须大将是……", + "#luanji1": "弓箭手,准备放箭!", + "#luanji2": "全都去死吧!", + "#xueyi_re_yuanshao1": null, + "#xueyi_re_yuanshao2": null, + "#re_yuanshao:die": "老天不助我袁家啊!……", + "#huoshou11": "背黑锅我来,送死?你去!", + "#huoshou12": "通通算我的!", + "#zaiqi1": "起!", + "#zaiqi2": "丞相助我!", + "#menghuo:die": "七纵之恩……来世……再报了……", + "#juxiang11": "小小把戏~", + "#juxiang12": "大王,看我的。", + "#lieren1": "亮兵器吧。", + "#lieren2": "尝尝我飞刀的厉害!", + "#zhurong:die": "大王,我……先走一步了……", + "#xingshang1": "来,管杀还管埋!", + "#xingshang2": "我的是我的,你的还是我的。", + "#fangzhu1": "死罪可免,活罪难赦!", + "#fangzhu2": "给我翻过来!", + "#songwei21": "仙福永享,寿与天齐!", + "#songwei22": "千秋万载,一统江山!", + "#caopi:die": "子建,子建……", + "#haoshi1": "来来来,见面分一半。", + "#haoshi2": "拿去拿去,莫跟哥哥客气!", + "#dimeng1": "合纵连横,方能以弱胜强。", + "#dimeng2": "以和为贵,以和为贵。", + "#re_lusu:die": "一生为国,纵死无憾……", + "#yinghun1": "不诛此贼三族,则吾死不瞑目!", + "#yinghun2": "以吾魂魄,保佑吾儿之基业。", + "#sunjian:die": "有埋伏!呃……啊!!", + "#jiuchi1": "呃……再来……一壶……", + "#jiuchi2": "好酒!好酒!", + "#roulin1": "美人儿,来,香一个~~", + "#roulin2": "食色,性也~~", + "#benghuai1": "呃……", + "#benghuai2": "我是不是该减肥了?", + "#baonue21": "杀得好,大大有赏!", + "#baonue22": "哈哈哈哈哈哈~不愧是我的好部下!", + "#dongzhuo:die": "为何人人……皆与我为敌?", + "#luanwu1": "哭喊吧,哀求吧,挣扎吧,然后,死吧!", + "#luanwu2": "哼哼哼……坐山观虎斗!", + "#wansha1": "神仙难救,神仙难救啊。", + "#wansha2": "我要你三更死,谁敢留你到五更!", + "#weimu1": "此计伤不到我。", + "#weimu2": "你奈我何?", + "#jiaxu:die": "我的时辰也到了……", + "#tiaoxin1": "贼将早降,可免一死。", + "#tiaoxin2": "汝等小儿,可敢杀我?", + "#zhiji1": "先帝之志,丞相之托,不可忘也!", + "#zhiji2": "丞相厚恩,维万死不能相报。", + "#jiangwei:die": "我计不成,乃天命也……", + "#xiangle1": "打打杀杀,真没意思。", + "#xiangle2": "我爸爸是刘备!", + "#fangquan1": "唉,这可如何是好啊!", + "#fangquan2": "哎,你办事儿,我放心~", + "#ruoyu1": "不装疯卖傻,岂能安然无恙?", + "#ruoyu2": "世人皆错看我,唉!", + "#liushan:die": "别打脸,我投降还不行吗?", + "#qiaobian1": "兵无常势,水无常形。", + "#qiaobian2": "用兵之道,变化万千。", + "#zhanghe:die": "啊……膝盖……中箭了……", + "#tuntian1": "休养生息,备战待敌。", + "#tuntian2": "锄禾日当午,汗滴禾下土。", + "#zaoxian1": "屯田日久,当建奇功!", + "#zaoxian2": "开辟险路,奇袭敌军!", + "#dengai:die": "吾破蜀克敌,竟葬于奸贼之手!", + "#jiang1": "江东子弟,何惧于天下!", + "#jiang2": "吾乃江东小霸王孙伯符!", + "#hunzi1": "父亲在上,魂佑江东;公瑾在旁,智定天下!", + "#hunzi2": "愿承父志,与公瑾共谋天下!", + "#zhiba21": "是友是敌,一探便知。", + "#zhiba22": "我若怕你,非孙伯符也!", + "#sunce:die": "内事不决问张昭,外事不决问周瑜……", + "#zhijian1": "请恕老臣直言!", + "#zhijian2": "为臣者,当冒死以谏!", + "#guzheng1": "今当稳固内政,以御外患。", + "#guzheng2": "固国安邦,居当如是。", + "#zhangzhang:die": "竭力尽智,死而无憾。", + "#beige1": "悲歌可以当泣,远望可以当归。", + "#beige2": "制兹八拍兮拟排忧,何知曲成兮心转愁。", + "#duanchang1": "流落异乡愁断肠。", + "#duanchang2": "日东月西兮徒相望,不得相随兮空断肠。", + "#caiwenji:die": "人生几何时,怀忧终年岁。", + "#huashen21": "哼,肉眼凡胎,岂能窥视仙人变幻?", + "#huashen22": "万物苍生,幻化由心。", + "#xinsheng1": "幻幻无穷,生生不息。", + "#xinsheng2": "吐故纳新,师法天地。", + "#zuoci:die": "腾云跨风,飞升太虚……", + "#qizhi1": "声东击西,敌寇一网成擒。", + "#qizhi2": "吾意不在此地,已遣别部出发。", + "#jinqu1": "建上昶水城,以逼夏口!", + "#jinqu2": "通川聚粮,伐吴之业,当步步为营。", + "#wangji:die": "天下之势,必归大魏,可恨,未能得见呐!", + "#nzry_juzhan_11": "砍头便砍头,何为怒耶!", + "#nzry_juzhan_12": "我州但有断头将军,无降将军也!", + "#yanyan:die": "宁可断头死,安能屈膝降!", + "#nzry_feijun1": "山地崎岖,也挡不住飞军破势!", + "#nzry_feijun2": "无当飞军,伐叛乱,镇蛮夷!", + "#nzry_binglve1": "兵略者,明战胜攻取之数,形机之势,诈谲之变。", + "#nzry_binglve2": "奇略兵速,敌未能料之。", + "#wangping:die": "无当飞军,也有困于深林之时……", + "#nzry_huaiju1": "袖中怀绿桔,遗母报乳哺。", + "#nzry_huaiju2": "情深舐犊,怀擢藏橘。", + "#nzry_yili1": "遗失礼仪,则俱非议。", + "#nzry_yili2": "行遗礼之举,于不敬王者。", + "#nzry_zhenglun1": "整论四海未泰,修文德以平。", + "#nzry_zhenglun2": "今论者不务道德怀取之术,而惟尚武,窃所未安。", + "#luji:die": "恨不能见,车同轨,书同文……", + "#nzry_kuizhu1": "子通专恣,必谋而诛之!", + "#nzry_kuizhu2": "孙綝久专,不可久忍,必溃诛!", + "#nzry_zhizheng1": "风驰电掣,政权不怠!", + "#nzry_zhizheng2": "廉平掣政,实为艰事。", + "#nzry_lijun11": "立于朝堂,定于军心。", + "#nzry_lijun12": "君立于朝堂,军侧于四方!", + "#sunliang:die": "今日欲诛逆臣而不得,方知机事不密则害成…", + "#nzry_chenglve1": "成略在胸,良计速出。", + "#nzry_chenglve2": "吾有良略在怀,必为阿瞒所需。", + "#nzry_shicai_21": "吾才满腹,袁本初竟不从之。", + "#nzry_shicai_22": "阿瞒有我良计,取冀州便是易如反掌。", + "#nzry_cunmu1": "哼!目光所及,短寸之间。", + "#nzry_cunmu2": "狭目之见,只能窥底。", + "#xuyou:die": "阿瞒,没有我你得不到冀州啊!", + "#nzry_mingren_11": "吾之任,君之明举!", + "#nzry_mingren_12": "得义真所救,吾任之必尽瘁以报。", + "#nzry_zhenliang_11": "贞洁贤良,吾之本心。", + "#nzry_zhenliang_12": "风霜以别草木之性,危乱而见贞良之节。", + "#yl_luzhi:die": "泓泓眸子宿渊亭,不见蛾眉只见经。", + "#nzry_jianxiang1": "得遇曹公,吾之幸也。", + "#nzry_jianxiang2": "曹公得荆不喜,喜得吾二人足矣。", + "#nzry_shenshi_11": "深中足智,鉴时审情。", + "#nzry_shenshi_12": "数语之言,审时度势。", + "#kuailiangkuaiyue:die": "表不能善用,所憾也", + "#drlt_zhenrong1": "东征高句丽,保辽东安稳。", + "#drlt_zhenrong2": "跨海东征,家国俱荣。", + "#drlt_hongju1": "一举拿下,鸿途可得。", + "#drlt_hongju2": "鸿飞荣升,举重若轻。", + "#guanqiujian:die": "峥嵘一生,然被平民所击射!", + "#drlt_zhenggu1": "镇守城池,必以骨相拼!", + "#drlt_zhenggu2": "孔明计虽百算,却难敌吾镇骨千具!", + "#haozhao:die": "镇守陈仓,也有一失。", + "#xinfu_zuilun1": "吾有三罪,未能除黄皓、制伯约、守国土。", + "#xinfu_zuilun2": "唉,数罪当论,吾愧对先帝恩惠。", + "#xinfu_fuyin1": "得父荫庇,平步青云。", + "#xinfu_fuyin2": "吾自幼心怀父诫,方不愧父亲荫庇。", + "#zhugezhan:die": "临难而死义,无愧先父。", + "#drlt_qianjie": null, + "#drlt_qianjie1": "继父之节,谦逊恭毕。", + "#drlt_qianjie2": "谦谦清廉德,节节卓尔茂。", + "#drlt_jueyan1": "毁堰坝之计,实为阻晋粮道。", + "#drlt_jueyan2": "堰坝毁之,可令敌军自退。", + "#drlt_poshi1": "破晋军分进合击之势,牵晋军主力之实!", + "#drlt_poshi2": "破羊祜之策,势在必行!", + "#lukang:die": "哎,陛下不听,社稷恐有危难……", + "#drlt_yongsi1": "传国玉玺在手,朕语便是天言。", + "#drlt_yongsi2": "朕今日雄踞淮南,明日便可一匡天下。", + "#drlt_weidi1": "天下,即将尽归吾袁公路!", + "#drlt_weidi2": "传朕旨意,诸部遵旨即可。", + "#yl_yuanshu:die": "仲朝国祚,本应千秋万代,薪传不息……", + "#drlt_xiongluan1": "雄据宛城,虽乱世可安!", + "#drlt_xiongluan2": "北地枭雄,乱世不败!!", + "#drlt_congjian1": "听君荐言,取为王,保宗嗣!", + "#drlt_congjian2": "从谏良计,可得自保!", + "#twjuxiang1": null, + "#twjuxiang2": null, + "#zhangxiu:die": "若失文和……吾将何归……", + "#drlt_wanglie1": "猛将之烈,统帅之所往。", + "#drlt_wanglie2": "与子龙忠勇相往,猛烈相合。", + "#chendao:die": "我的白毦兵,再也不能为先帝出力了。", + "#liangyin1": "结得良姻,固吴基业。", + "#liangyin2": "君恩之命,妾身良姻之福。", + "#kongsheng1": "窈窕淑女,箜篌有知。", + "#kongsheng2": "箜篌声声,琴瑟和鸣。", + "#zhoufei:die": "夫君,妾身再也不能陪你看这江南翠绿了。", +}; diff --git a/character/shiji.js b/character/shiji.js deleted file mode 100644 index 88ed695d2..000000000 --- a/character/shiji.js +++ /dev/null @@ -1,8431 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "shiji", - connect: true, - characterSort: { - shiji: { - mobile_shijizhi: [ - "sp_wangcan", - "sp_chenzhen", - "sp_sunshao", - "sp_xunchen", - "luotong", - "sp_duyu", - "sp_bianfuren", - "feiyi", - ], - mobile_shijixin: [ - "wujing", - "sp_mifuren", - "sp_xinpi", - "wangling", - "wangfuzhaolei", - "zhouchu", - "sp_kongrong", - "sp_yanghu", - ], - mobile_shijiren: [ - "caizhenji", - "xiangchong", - "sp_huaxin", - "sp_xujing", - "zhangzhongjing", - "sp_zhangwen", - "liuzhang", - "qiaogong", - ], - mobile_shijiyong: [ - "db_wenyang", - "sp_chendong", - "yuanhuan", - "sp_zongyu", - "sp_wangshuang", - "sunyi", - "sp_gaolan", - "sp_huaman", - ], - mobile_shijiyan: [ - "sp_cuiyan", - "sp_zhangchangpu", - "sp_jiangwan", - "sp_jiangqing", - "sp_lvfan", - "sp_huangfusong", - "sp_zhujun", - "liuba", - ], - }, - }, - character: { - liuba: ["male", "shu", 3, ["duanbi", "tongduo"]], - sp_zhujun: ["male", "qun", 4, ["xinyangjie", "xinjuxiang", "houfeng"]], - sp_huangfusong: ["male", "qun", 4, ["spzhengjun", "spshiji", "sptaoluan"]], - sp_lvfan: ["male", "wu", 3, ["mbdiaodu", "mbdiancai", "spyanji"]], - sp_jiangqing: ["male", "wu", 4, ["spjianyi", "spshangyi"]], - sp_jiangwan: ["male", "shu", 3, ["spzhenting", "spjincui"]], - sp_zhangchangpu: ["female", "wei", 3, ["spdifei", "spyanjiao"]], - sp_cuiyan: ["male", "wei", 3, ["spyajun", "spzundi"]], - sp_huaman: ["female", "shu", 4, ["spxiangzhen", "spfangzong", "spxizhan"]], - sp_gaolan: ["male", "qun", 4, ["spjungong", "spdengli"]], - sunyi: ["male", "wu", 4, ["zaoli"]], - sp_wangshuang: ["male", "wei", 4, ["yiyong", "shanxie"]], - sp_zongyu: ["male", "shu", 3, ["zhibian", "yuyan"]], - yuanhuan: ["male", "wei", 3, ["qingjue", "fengjie"]], - sp_chendong: ["male", "wu", 4, ["spyilie", "spfenming"]], - db_wenyang: [ - "male", - "wei", - 4, - ["dbquedi", "dbzhuifeng", "dbchongjian", "dbchoujue"], - ["doublegroup:wei:wu"], - ], - sp_yanghu: ["male", "qun", 3, ["mingfa", "rongbei"]], - qiaogong: ["male", "wu", 3, ["yizhu", "luanchou"]], - liuzhang: ["male", "qun", 3, ["jutu", "yaohu", "rehuaibi"], ["zhu"]], - sp_zhangwen: ["male", "wu", 3, ["gebo", "spsongshu"]], - zhangzhongjing: ["male", "qun", 3, ["jishi", "xinliaoyi", "binglun"]], - sp_xujing: ["male", "shu", 3, ["boming", "ejian"]], - sp_huaxin: ["male", "wei", 3, ["yuanqing", "shuchen"]], - xiangchong: ["male", "shu", 4, ["guying", "muzhen"]], - caizhenji: ["female", "wei", 3, ["sheyi", "tianyin"]], - sp_kongrong: ["male", "qun", 3, ["xinlirang", "xinmingshi"]], - zhouchu: ["male", "wu", 4, ["xianghai", "rechuhai"]], - wangfuzhaolei: ["male", "shu", 4, ["xunyi"]], - wangling: ["male", "wei", 4, ["xingqi", "xinzifu", "mibei"], ["clan:太原王氏"]], - wujing: ["male", "wu", 4, ["heji", "liubing"]], - sp_mifuren: ["female", "shu", 3, ["xinguixiu", "qingyu"]], - sp_xinpi: ["male", "wei", 3, ["spyinju", "spchijie"]], - feiyi: ["male", "shu", 3, ["mjshengxi", "fyjianyu"]], - sp_bianfuren: ["female", "wei", 3, ["spwanwei", "spyuejian"]], - sp_duyu: ["male", "qun", 4, ["spwuku", "spsanchen"]], - luotong: ["male", "wu", 4, ["qinzheng"]], - sp_wangcan: ["male", "wei", 3, ["spqiai", "spshanxi"]], - sp_chenzhen: ["male", "shu", 3, ["shameng"]], - sp_sunshao: ["male", "wu", 3, ["mjdingyi", "mjzuici", "mjfubi"]], - sp_xunchen: ["male", "qun", 3, ["mjweipo", "mjchenshi", "mjmouzhi"], ["clan:颍川荀氏"]], - }, - skill: { - //刘巴 - duanbi: { - unique: true, - mark: true, - limited: true, - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - var num1 = 0, - num2 = 0; - var count = game.countPlayer(function (current) { - num1 += current.countCards("h"); - num2++; - return current != player; - }); - return count > 0 && num1 > num2 * 2; - }, - filterTarget: true, - selectTarget: -1, - multitarget: true, - multiline: true, - skillAnimation: true, - animationColor: "orange", - content: function () { - "step 0"; - player.awakenSkill("duanbi"); - event.num = 0; - event.cards = []; - event.targets.sortBySeat(); - event.targets.remove(player); - "step 1"; - var target = targets[num]; - var num = Math.min(3, Math.floor(target.countCards("h") / 2)); - if (num > 0) target.chooseToDiscard("h", true, num); - else event._result = { bool: false }; - "step 2"; - if (result.bool && Array.isArray(result.cards)) event.cards.addArray(result.cards); - event.num++; - if (event.num < targets.length) event.goto(1); - "step 3"; - event.cards = cards.filter(function (i) { - return get.position(i, true) == "d"; - }); - if (!event.cards.length) event.finish(); - else - player - .chooseTarget( - "是否令一名角色" + - (event.cards.length > 3 - ? "随机获得三" - : "获得" + get.cnNumber(event.cards.length)) + - "张被弃置的牌?" - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) att /= 10; - if (target.hasJudge("lebu")) att /= 4; - return att * Math.sqrt(Math.max(1, 5 - target.countCards("h"))); - }); - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - target.gain(cards.randomGets(3), "gain2"); - } - }, - ai: { - order: 10, - result: { - target: function (player, target) { - if (player == target) return 3; - return -Math.min(3, Math.floor(target.countCards("h") / 2)); - }, - }, - }, - }, - tongduo: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - direct: true, - usable: 1, - filter: function (event, player) { - return ( - player != event.player && - event.targets.length == 1 && - game.hasPlayer(function (current) { - return current.countCards("he") > 0; - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("tongduo"), - "令一名角色重铸一张牌", - function (card, player, target) { - return target.hasCard(lib.filter.cardRecastable, "he"); - } - ) - .set("ai", function (target) { - return ( - get.attitude(_status.event.player, target) * - Math.min(3, Math.floor(target.countCards("h", lib.filter.cardRecastable) / 2)) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("tongduo", target); - } else event.finish(); - "step 2"; - if (!target.hasCard(lib.filter.cardRecastable, "he")) event.finish(); - else target.chooseCard("he", true, "请重铸一张牌", lib.filter.cardRecastable); - "step 3"; - target.recast(result.cards); - }, - }, - //朱儁 - yangjie: { - audio: 2, - group: ["yangjie_add"], - enable: "phaseUse", - prompt: "摸一张牌并与一名其他角色进行拼点", - usable: 1, - filter: function (event, player) { - return !player.hasSkillTag("noCompareSource"); - }, - filterTarget: function (card, player, target) { - return ( - target != player && - target.countCards("h") > 0 && - !target.hasSkillTag("noCompareTarget") - ); - }, - content: function () { - "step 0"; - player.draw(); - "step 1"; - if (player.canCompare(target)) player.chooseToCompare(target).set("small", true); - else event.finish(); - "step 2"; - if (!result.bool) { - var cards = [result.player, result.target].filterInD("d"); - if ( - !cards.length || - !game.hasPlayer((current) => current != player && current != target) - ) - event.finish(); - else { - event.cards = cards; - player - .chooseTarget( - "请选择一名角色", - "令其获得" + - get.translation(cards) + - ",且视为对" + - get.translation(target) + - "使用一张火【杀】", - function (card, player, target) { - return target != player && target != _status.event.getParent().target; - } - ) - .set("ai", function (target) { - var player = _status.event.player, - cards = _status.event.getParent().cards, - target2 = _status.event.getParent().target; - var val = get.value(cards, target) * get.attitude(player, target); - if (val <= 0) return 0; - return val + - target.canUse( - { name: "sha", nature: "fire", isCard: true }, - target2, - false - ) - ? get.effect( - target2, - { name: "sha", nature: "fire", isCard: true }, - target, - player - ) - : 0; - }); - } - } else event.finish(); - "step 3"; - if (result.bool) { - var source = result.targets[0]; - event.source = source; - player.line(source); - source.gain(cards, "gain2"); - } else event.finish(); - "step 4"; - var card = { name: "sha", nature: "fire", isCard: true }; - if (target.isIn() && source.isIn() && source.canUse(card, target, false)) - source.useCard(card, target, false); - }, - subSkill: { - add: { - trigger: { player: "compare" }, - forced: true, - popup: false, - filter: function (event, player) { - return ( - event.getParent().name == "yangjie" && event.num1 > 1 && player.isDamaged() - ); - }, - content: function () { - var num = player.getDamagedHp(); - game.log(player, "的拼点牌点数-", num); - trigger.num1 = Math.max(1, trigger.num1 - num); - }, - }, - }, - ai: { - order: 3, - result: { target: -1.5 }, - }, - }, - zjjuxiang: { - audio: 2, - trigger: { global: "dyingAfter" }, - logTarget: "player", - limited: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return event.player != player && event.player.isIn(); - }, - check: function (event, player) { - return get.damageEffect(event.player, player, player) > 0; - }, - content: function () { - "step 0"; - player.awakenSkill("zjjuxiang"); - trigger.player.damage(); - "step 1"; - if (trigger.player.maxHp > 0) player.draw(trigger.player.maxHp); - }, - ai: { expose: 10 }, - }, - xinyangjie: { - audio: "yangjie", - enable: "phaseUse", - filter: function (event, player) { - return game.hasPlayer(function (target) { - return player.canCompare(target); - }); - }, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - usable: 1, - content: function () { - "step 0"; - player.chooseToCompare(target).set("small", true); - "step 1"; - if ( - !result.bool && - game.hasPlayer(function (current) { - return ( - current != player && - current != target && - current.canUse({ name: "sha", nature: "fire", isCard: true }, target, false) - ); - }) - ) { - player - .chooseTarget( - "佯解:是否选择另一名其他角色?", - "令其视为对" + get.translation(target) + "使用一张火【杀】", - function (card, player, target) { - return target != player && target != _status.event.getParent().target; - } - ) - .set("ai", function (target) { - var player = _status.event.player, - target2 = _status.event.getParent().target; - return get.effect( - target2, - { name: "sha", nature: "fire", isCard: true }, - target, - player - ); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var source = result.targets[0]; - player.line(source); - game.log(player, "选择了", source); - var card = { name: "sha", nature: "fire", isCard: true }; - if (target.isIn() && source.isIn() && source.canUse(card, target, false)) - source.useCard(card, target, false, "noai"); - } - }, - ai: { - order: 3, - result: { - target: function (player, target) { - var hs = player.getCards("h").sort(function (a, b) { - return a.number - b.number; - }); - var ts = target.getCards("h").sort(function (a, b) { - return a.number - b.number; - }); - if (!hs.length || !ts.length) return 0; - if (hs[0].number <= ts[0].number) return -3; - if (player.countCards("h") >= target.countCards("h")) return -10; - return -1; - }, - }, - }, - }, - xinjuxiang: { - audio: "zjjuxiang", - inherit: "zjjuxiang", - content: function () { - player.awakenSkill("xinjuxiang"); - trigger.player.damage(); - }, - }, - houfeng: { - audio: 3, - group: "houfeng_zhengsu", - subSkill: { - zhengsu: { - audio: "houfeng1", - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - if ( - !["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].some( - (i) => !event.player.hasSkill(i) - ) - ) - return false; - return player.inRange(event.player); - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - prompt2: () => lib.translate.houfeng_info, - round: 1, - logTarget: "player", - content: function () { - "step 0"; - player - .chooseButton( - [ - "选择" + get.translation(trigger.player) + "要进行的整肃类型", - [ - ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].filter( - (i) => !trigger.player.hasSkill(i) - ), - "vcard", - ], - ], - true - ) - .set("ai", () => Math.random()); - "step 1"; - if (result.bool) { - var name = result.links[0][2], - target = trigger.player; - target.addTempSkill("houfeng_share", { - player: ["phaseDiscardAfter", "phaseAfter"], - }); - target.markAuto("houfeng_share", [player]); - target.addTempSkill(name, { player: ["phaseDiscardAfter", "phaseAfter"] }); - target.popup(name, "thunder"); - game.delayx(); - } - }, - }, - share: { - charlotte: true, - onremove: true, - trigger: { player: "phaseDiscardEnd" }, - forced: true, - popup: false, - content: function () { - "step 0"; - if (!lib.skill.zhengsu.filter(trigger, player)) { - game.broadcastAll(function () { - if (lib.config.background_speak) game.playAudio("skill", "houfeng3"); - }); - player.popup("整肃失败", "fire"); - game.log(player, "整肃失败"); - event.finish(); - return; - } - game.broadcastAll(function () { - if (lib.config.background_speak) game.playAudio("skill", "houfeng2"); - }); - player.popup("整肃成功", "wood"); - game.log(player, "整肃成功"); - var list = player.getStorage("houfeng_share").filter((i) => i.isIn()); - list.unshift(player); - event.list = list; - var num1 = 0, - num2 = 0, - num3 = 0; - for (var target of list) { - num1 += 2 * get.effect(target, { name: "draw" }, player, player); - num2 += get.recoverEffect(target, player, player); - } - trigger.player - .chooseControl("摸两张牌", "回复体力", "cancel2") - .set("prompt", "整肃奖励:请选择" + get.translation(list) + "的整肃奖励") - .set("ai", function () { - return [ - "摸两张牌", - "回复体力", - "cancel2", - ][_status.event.goon.indexOf(Math.max.apply(Math, _status.event.goon))]; - }) - .set("goon", [num1, num2, num3]); - "step 1"; - if (result.control != "cancel2") { - if (result.control == "摸两张牌") game.asyncDraw(event.list, 2); - else { - for (var i of event.list) i.recover(); - } - } else event.finish(); - "step 2"; - game.delayx(); - }, - }, - }, - }, - houfeng1: { audio: true }, - //手杀皇甫嵩 - spzhengjun: { - audio: 3, - group: "spzhengjun_zhengsu", - subSkill: { - zhengsu: { - audio: "spzhengjun1", - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].some( - (i) => !player.hasSkill(i) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseButton([ - get.prompt("spzhengjun"), - [ - ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].filter( - (i) => !player.hasSkill(i) - ), - "vcard", - ], - ]) - .set("ai", () => Math.random()); - "step 1"; - if (result.bool) { - player.logSkill("spzhengjun_zhengsu", player); - var name = result.links[0][2]; - player.addTempSkill("spzhengjun_share", { - player: ["phaseDiscardAfter", "phaseAfter"], - }); - player.addTempSkill(name, { player: ["phaseDiscardAfter", "phaseAfter"] }); - player.popup(name, "thunder"); - game.delayx(); - } - }, - }, - share: { - charlotte: true, - trigger: { player: "phaseDiscardEnd" }, - forced: true, - popup: false, - content: function () { - "step 0"; - if (!lib.skill.zhengsu.filter(trigger, player)) { - game.broadcastAll(function () { - if (lib.config.background_speak) game.playAudio("skill", "spzhengjun3"); - }); - player.popup("整肃失败", "fire"); - game.log(player, "整肃失败"); - event.finish(); - return; - } - game.broadcastAll(function () { - if (lib.config.background_speak) game.playAudio("skill", "spzhengjun2"); - }); - player.popup("整肃成功", "wood"); - game.log(player, "整肃成功"); - player.chooseDrawRecover(2, "整肃奖励:摸两张牌或回复1点体力"); - "step 1"; - if (result.control == "cancel2") { - event.finish(); - return; - } - player - .chooseTarget( - "整军:是否令一名其他角色也回复1点体力或摸两张牌?", - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player; - return Math.max( - 2 * get.effect(target, { name: "draw" }, target, player), - get.recoverEffect(target, target, player) - ); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - var num1 = 2 * get.effect(target, { name: "draw" }, target, player); - var num2 = get.recoverEffect(target, target, player); - player.line(target); - if (target.isHealthy()) result.index = 0; - else - player - .chooseControl("摸牌", "回血") - .set( - "prompt", - "整肃奖励:令" + get.translation(target) + "摸两张牌或回复1点体力" - ) - .set("ai", function () { - return _status.event.goon ? 0 : 1; - }) - .set("goon", num1 >= num2); - } else event.finish(); - "step 3"; - if (result.index == 0) target.draw(2); - else target.recover(); - }, - }, - }, - }, - spzhengjun1: { audio: true }, - spshiji: { - audio: 2, - trigger: { source: "damageBegin2" }, - logTarget: "player", - filter: function (event, player) { - return ( - player != event.player && - event.hasNature("linked") && - event.player.countCards("h") > 0 && - !player.isMaxHandcard(true) - ); - }, - check: function (event, player) { - return get.attitude(player, event.player) <= 0; - }, - content: function () { - var target = trigger.player; - player.viewHandcards(target); - var hs = target.getCards("h", { color: "red" }); - if (hs.length) { - target.discard(hs); - player.draw(hs.length); - } - }, - }, - sptaoluan: { - audio: 2, - trigger: { global: "judgeFixing" }, - usable: 1, - filter: function (event, player) { - return event.result && event.result.suit == "spade"; - }, - check: function (event, player) { - return event.result.judge * get.attitude(player, event.player) <= 0; - }, - content: function () { - "step 0"; - var evt = trigger.getParent(); - if (evt.name == "phaseJudge") evt.excluded = true; - else { - evt.finish(); - evt._triggered = null; - if (evt.name.startsWith("pre_")) { - var evtx = evt.getParent(); - evtx.finish(); - evtx._triggered = null; - } - var nexts = trigger.next.slice(); - for (var next of nexts) { - if (next.name == "judgeCallback") trigger.next.remove(next); - } - var evts = game.getGlobalHistory("cardMove", function (evt) { - return evt.getParent(2) == trigger.getParent(); - }); - var cards = []; - for (var i = evts.length - 1; i >= 0; i--) { - var evt = evts[i]; - for (var card of evt.cards) { - if (get.position(card, true) == "o") cards.push(card); - } - } - trigger.orderingCards.addArray(cards); - } - var list = []; - if (get.position(trigger.result.card) == "d") list.push(0); - if ( - trigger.player.isIn() && - player.canUse({ name: "sha", nature: "fire", isCard: true }, trigger.player, false) - ) - list.push(1); - if (list.length == 2) - player - .chooseControl() - .set("choiceList", [ - "获得" + get.translation(trigger.result.card), - "视为对" + get.translation(trigger.player) + "使用一张火【杀】", - ]) - .set( - "choice", - get.effect(trigger.player, { name: "sha" }, player, player) > 0 ? 1 : 0 - ); - else if (list.length == 1) event._result = { index: list[0] }; - else event.finish(); - "step 1"; - if (result.index == 0) player.gain(trigger.result.card, "gain2"); - else player.useCard({ name: "sha", nature: "fire", isCard: true }, trigger.player, false); - }, - }, - //吕范 - spdiaodu: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("spdiaodu"), - "令一名角色摸一张牌,然后移动其装备区内的一张牌" - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att > 0) { - if ( - target.hasCard(function (card) { - if ( - get.value(card, target) <= 0 && - game.hasPlayer(function (current) { - return ( - current != target && - current.canEquip(card, false) && - get.effect(current, card, player, player) > 0 - ); - }) - ) - return true; - return false; - }, "e") - ) - return 2 * att; - if ( - !target.hasCard(function (card) { - return game.hasPlayer(function (current) { - return current != target && current.canEquip(card); - }); - }, "e") - ) - return 1; - } else if (att < 0) { - if ( - target.hasCard(function (card) { - if ( - get.value(card, target) >= 4.5 && - game.hasPlayer(function (current) { - return ( - current != target && - current.canEquip(card) && - get.effect(current, card, player, player) > 0 - ); - }) - ) - return true; - return false; - }, "e") - ) - return -att; - } - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("spdiaodu", target); - target.draw(); - } else event.finish(); - "step 2"; - var es = target.getCards("e", function (card) { - return game.hasPlayer(function (current) { - return current != target && current.canEquip(card); - }); - }); - if (es.length) { - if (es.length == 1) event._result = { bool: true, links: es }; - else - player - .chooseButton(["移动" + get.translation(target) + "的一张装备牌", es], true) - .set("ai", function (button) { - var player = _status.event.player, - target = _status.event.getParent().target, - card = button.link; - if ( - game.hasPlayer(function (current) { - return ( - current != target && - current.canEquip(card) && - get.effect(current, card, player, player) > 0 - ); - }) - ) - return -get.value(card, target) * get.attitude(player, target); - return 0; - }); - } else event.finish(); - "step 3"; - if (result.bool) { - event.card = result.links[0]; - player - .chooseTarget( - true, - "选择" + get.translation(event.card) + "的移动目标", - function (card, player, target) { - return target.canEquip(_status.event.card); - } - ) - .set("card", event.card) - .set("ai", function (target) { - var evt = _status.event; - return get.effect(target, evt.getParent().card, evt.player, evt.player); - }); - } else event.finish(); - "step 4"; - if (result.bool) { - var target2 = result.targets[0]; - target.line(target2); - target.$give(card, target2); - game.delay(0.5); - target2.equip(card); - } - }, - }, - spdiancai: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return ( - player != event.player && - player.hasHistory("lose", function (evt) { - return evt.hs && evt.hs.length > 0; - }) - ); - }, - content: function () { - "step 0"; - var num = 0; - player.getHistory("lose", function (evt) { - if (evt.hs) num += evt.hs.length; - }); - num = Math.min(num, game.countPlayer()); - player - .chooseTarget( - get.prompt("spdiancai"), - [1, num], - "令至多" + get.cnNumber(num) + "名角色各摸一张牌" - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(trigger.player); - player.logSkill("spdiancai", targets); - if (targets.length == 1) { - targets[0].draw(); - event.finish(); - } else game.asyncDraw(targets); - } else event.finish(); - "step 2"; - game.delayx(); - }, - }, - mbdiaodu: { - audio: "spdiaodu", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return game.hasPlayer(function (target) { - return target.countCards("e", function (card) { - return game.hasPlayer(function (current) { - return current != player && current != target && current.canEquip(card); - }); - }); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("mbdiaodu"), function (card, player, target) { - return target.countCards("e", function (card) { - return game.hasPlayer(function (current) { - return current != player && current != target && current.canEquip(card); - }); - }); - }) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att > 0) { - if ( - target.hasCard(function (card) { - if ( - get.value(card, target) <= 0 && - game.hasPlayer(function (current) { - return ( - current != player && - current != target && - current.canEquip(card, false) && - get.effect(current, card, player, player) > 0 - ); - }) - ) - return true; - return false; - }, "e") - ) - return 2 * att; - } else if (att < 0) { - if ( - target.hasCard(function (card) { - if ( - get.value(card, target) >= 4.5 && - game.hasPlayer(function (current) { - return ( - current != player && - current != target && - current.canEquip(card) && - get.effect(current, card, player, player) > 0 - ); - }) - ) - return true; - return false; - }, "e") - ) - return -att; - } - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("mbdiaodu", target); - } else event.finish(); - "step 2"; - var es = target.getCards("e", function (card) { - return game.hasPlayer(function (current) { - return current != target && current.canEquip(card); - }); - }); - if (es.length == 1) event._result = { bool: true, links: es }; - else - player - .chooseButton(["移动" + get.translation(target) + "的一张装备牌", es], true) - .set("ai", function (button) { - var player = _status.event.player, - target = _status.event.getParent().target, - card = button.link; - if ( - game.hasPlayer(function (current) { - return ( - current != player && - current != target && - current.canEquip(card) && - get.effect(current, card, player, player) > 0 - ); - }) - ) - return -get.value(card, target) * get.attitude(player, target); - return 0; - }); - "step 3"; - if (result.bool) { - event.card = result.links[0]; - player - .chooseTarget( - "请选择" + get.translation(event.card) + "的移动目标", - true, - function (card, player, target) { - return target != player && target.canEquip(_status.event.card); - } - ) - .set("card", event.card) - .set("ai", function (target) { - var evt = _status.event; - return get.effect(target, evt.getParent().card, evt.player, evt.player); - }); - } else event.finish(); - "step 4"; - if (result.bool) { - var target2 = result.targets[0]; - target.line(target2); - target.$give(card, target2); - game.delay(0.5); - target2.equip(card); - } else event.finish(); - "step 5"; - target.draw(); - }, - }, - mbdiancai: { - audio: "spdiancai", - trigger: { global: "phaseUseEnd" }, - filter: function (event, player) { - if (_status.currentPhase == player) return false; - var num = 0; - player.getHistory("lose", function (evt) { - if (evt.cards2 && evt.getParent("phaseUse") == event) num += evt.cards2.length; - }); - return num >= player.hp && player.countCards("h") < player.maxHp; - }, - frequent: true, - content: function () { - var num = player.maxHp - player.countCards("h"); - if (num > 0) player.draw(num); - }, - }, - spyanji: { - audio: 3, - group: "spyanji_zhengsu", - subSkill: { - zhengsu: { - audio: "spyanji", - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].some( - (i) => !player.hasSkill(i) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseButton([ - get.prompt("spyanji"), - [ - ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].filter( - (i) => !player.hasSkill(i) - ), - "vcard", - ], - ]) - .set("ai", () => Math.random()); - "step 1"; - if (result.bool) { - player.logSkill("spyanji_zhengsu", player); - var name = result.links[0][2]; - player.addTempSkill("spyanji_share", { - player: ["phaseDiscardAfter", "phaseAfter"], - }); - player.addTempSkill(name, { player: ["phaseDiscardAfter", "phaseAfter"] }); - player.popup(name, "thunder"); - game.delayx(); - } - }, - }, - share: { - charlotte: true, - trigger: { player: "phaseDiscardEnd" }, - forced: true, - popup: false, - content: function () { - if (!lib.skill.zhengsu.filter(trigger, player)) { - game.broadcastAll(function () { - if (lib.config.background_speak) game.playAudio("skill", "spyanji3"); - }); - player.popup("整肃失败", "fire"); - game.log(player, "整肃失败"); - event.finish(); - return; - } - game.broadcastAll(function () { - if (lib.config.background_speak) game.playAudio("skill", "spyanji2"); - }); - player.popup("整肃成功", "wood"); - game.log(player, "整肃成功"); - player.chooseDrawRecover(2, "整肃奖励:摸两张牌或回复1点体力"); - }, - }, - }, - }, - spyanji1: { audio: true }, - //蒋钦 - spjianyi: { - audio: 2, - trigger: { global: "phaseEnd" }, - forced: true, - filter: function (event, player) { - return ( - player != event.player && - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name != "lose" || evt.type != "discard") return false; - for (var i of evt.cards) { - if (get.subtype(i, false) == "equip2" && get.position(i, true) == "d") - return true; - } - return false; - }).length > 0 - ); - }, - content: function () { - "step 0"; - var cards = []; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name != "lose" || evt.type != "discard") return false; - for (var i of evt.cards) { - if (get.subtype(i, false) == "equip2" && get.position(i, true) == "d") - cards.push(i); - } - }); - player.chooseButton(["俭衣:获得一张防具牌", cards], true).set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - "step 1"; - if (result.bool) player.gain(result.links, "gain2"); - }, - }, - spshangyi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.countCards("he") > 0 && - game.hasPlayer((current) => lib.skill.spshangyi.filterTarget(null, player, current)) - ); - }, - filterCard: true, - position: "he", - check: function (card) { - return 6 - get.value(card); - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content: function () { - target.viewHandcards(player); - player.gainPlayerCard(target, "h", true, "visible"); - }, - ai: { - order: 6, - result: { - player: 0.5, - target: function (player, target) { - if (target.hasSkillTag("noh")) return 0; - return -1; - }, - }, - }, - }, - //蒋琬 - spzhenting: { - audio: 2, - trigger: { global: "useCardToTarget" }, - usable: 1, - filter: function (event, player) { - return ( - (event.card.name == "sha" || get.type(event.card, false) == "delay") && - event.player != player && - !event.targets.includes(player) && - player.inRange(event.target) - ); - }, - logTarget: "target", - check: function (event, player) { - var target = event.target, - source = event.player; - var eff1 = get.effect(target, event.card, source, player); - if (eff1 >= 0) return false; - var eff2 = get.effect(player, event.card, source, player); - if (eff2 >= 0) return true; - if (eff1) - if (event.card.name == "sha") { - if (player.hasShan()) return true; - if (eff1 > eff2) return false; - if (player.hp > 2) return true; - if (player.hp == 2) return eff2 > eff1 / 3; - return false; - } - if (event.card.name == "shandian" || event.card.name == "bingliang") return true; - if (event.card.name == "lebu") return !player.needsToDiscard() && target.needsToDiscard(); - return false; - }, - content: function () { - "step 0"; - var target = trigger.target, - evt = trigger.getParent(); - evt.triggeredTargets2.remove(target); - evt.targets.remove(target); - evt.triggeredTargets2.add(player); - evt.targets.add(player); - game.log(trigger.card, "的目标被改为了", player); - trigger.untrigger(); - "step 1"; - if (!trigger.player.countDiscardableCards(player, "h")) event._result = { index: 0 }; - else - player - .chooseControl() - .set("choiceList", [ - "摸一张牌", - "弃置" + get.translation(trigger.player) + "的一张手牌", - ]); - "step 2"; - if (result.index == 0) player.draw(); - else { - player.line(trigger.player, "fire"); - player.discardPlayerCard(trigger.player, true, "h"); - } - }, - ai: { - threaten: 1.4, - }, - }, - spjincui: { - audio: 2, - enable: "phaseUse", - usable: 1, - limited: true, - skillAnimation: true, - animationColor: "orange", - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - player.awakenSkill("spjincui"); - game.broadcastAll( - function (target1, target2) { - game.swapSeat(target1, target2); - }, - player, - target - ); - "step 1"; - if (player.hp > 0) player.loseHp(player.hp); - }, - ai: { - order: 5, - result: { - player: function (player, target) { - if (player.hasUnknown()) return 0; - if (!player.countCards("h", { name: ["tao", "jiu"] })) return 0; - var num = 0, - current = player.next; - while (true) { - num -= get.sgn(get.attitude(player, current)); - if (current == target) break; - current = current.next; - } - while (true) { - if (current == player) break; - num += get.sgn(get.attitude(player, current)) * 1.1; - current = current.next; - } - if (num < player.hp) return 0; - return num + 1 - player.hp; - }, - }, - }, - }, - //张昌蒲 - spdifei: { - audio: 2, - trigger: { player: "damageEnd" }, - forced: true, - usable: 1, - content: function () { - "step 0"; - var next = player.chooseToDiscard("h", "抵诽:弃置一张手牌或摸一张牌"); - if (trigger.card) { - var suit = get.suit(trigger.card, false); - if (lib.suit.includes(suit)) { - next.set("suit", suit); - next.set("prompt2", "然后若没有" + get.translation(suit) + "手牌则回复1点体力"); - next.set("ai", function (card) { - var player = _status.event.player, - suit = _status.event.suit; - if ( - player.hasCard(function (cardx) { - return cardx != card && get.suit(cardx) == suit; - }, "h") - ) - return 0; - if ( - get.name(card) != "tao" && - ((get.position(card) == "h" && get.suit(card) == suit) || player.hp == 1) - ) - return 8 - get.value(card); - return 5 - get.value(card); - }); - } else - next.set("ai", function (card) { - return -get.value(card); - }); - } - "step 1"; - if (!result.bool) player.draw(); - "step 2"; - player.showHandcards(); - if (trigger.card) { - var suit = get.suit(trigger.card, false); - if (!lib.suit.includes(suit) || !player.countCards("h", { suit: suit })) - player.recover(); - } - }, - }, - spyanjiao: { - audio: 2, - enable: "phaseUse", - usable: 1, - chooseButton: { - dialog: function () { - return ui.create.dialog("###严教###" + get.translation("spyanjiao_info")); - }, - chooseControl: function (event, player) { - var map = {}, - hs = player.getCards("h"); - for (var i of hs) map[get.suit(i, player)] = true; - var list = lib.suit.filter((i) => map[i]); - list.push("cancel2"); - return list; - }, - check: function (event, player) { - var map = {}, - hs = player.getCards("h"), - min = Infinity, - min_suit = null; - for (var i of hs) { - var suit = get.suit(i, player); - if (!map[suit]) map[suit] = 0; - map[suit] += get.value(i); - } - for (var i in map) { - if (map[i] < min) { - min = map[i]; - min_suit = i; - } - } - return min_suit; - }, - backup: function (result, player) { - return { - audio: "spyanjiao", - filterCard: { suit: result.control }, - selectCard: -1, - position: "h", - filterTarget: lib.filter.notMe, - discard: false, - lose: false, - delay: false, - content: function () { - player.addSkill("spyanjiao_draw"); - player.addMark("spyanjiao_draw", cards.length, false); - player.give(cards, target); - target.damage("nocard"); - }, - ai: { - result: { - target: function (player, target) { - if (!ui.selected.cards.length) return 0; - var val = get.value(ui.selected.cards, target); - if (val < 0) return val + get.damageEffect(target, player, target); - if (val > 5 || get.value(ui.selected.cards, player) > 5) return 0; - return get.damageEffect(target, player, target); - }, - }, - }, - }; - }, - prompt: () => "请选择【严教】的目标", - }, - subSkill: { - draw: { - onremove: true, - trigger: { player: "phaseBegin" }, - forced: true, - charlotte: true, - content: function () { - player.draw(player.countMark("spyanjiao_draw")); - player.removeSkill("spyanjiao_draw"); - }, - mark: true, - intro: { content: "下回合开始时摸#张牌" }, - }, - backup: { audio: "spyanjiao" }, - }, - ai: { - order: 1, - result: { player: 1 }, - }, - }, - //崔琰 - spyajun: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - var hs = player.getCards("h"); - return ( - hs.length > 0 && - !player.hasSkillTag("noCompareSource") && - player.hasHistory("gain", function (evt) { - for (var i of evt.cards) { - if (hs.includes(i)) return true; - } - return false; - }) && - game.hasPlayer(function (current) { - return current != player && player.canCompare(current); - }) - ); - }, - content: function () { - "step 0"; - var cards = [], - hs = player.getCards("h"); - player.getHistory("gain", function (evt) { - cards.addArray(evt.cards); - }); - cards = cards.filter(function (i) { - return hs.includes(i); - }); - player.chooseCardTarget({ - prompt: get.prompt("spyajun"), - prompt2: "操作提示:选择一张本回合新得到的牌作为拼点牌,然后选择一名拼点目标", - cards: cards, - filterCard: function (card) { - return _status.event.cards.includes(card); - }, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - ai1: function (card) { - return get.number(card) - get.value(card); - }, - ai2: function (target) { - return ( - -get.attitude(_status.event.player, target) * - Math.sqrt(5 - Math.min(4, target.countCards("h"))) * - (target.hasSkillTag("noh") ? 0.5 : 1) - ); - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("spyajun", target); - var next = player.chooseToCompare(target); - if (!next.fixedResult) next.fixedResult = {}; - next.fixedResult[player.playerid] = result.cards[0]; - } else event.finish(); - "step 2"; - if (result.bool) { - var cards = [result.player, result.target].filterInD("d"); - if (cards.length) { - player - .chooseButton(["是否将一张牌置于牌堆顶?", cards]) - .set("ai", function (button) { - if (get.color(button.link) == "black") return 1; - return 0; - }); - } else event.finish(); - } else { - player.addMark("spyajun_less", 1, false); - player.addTempSkill("spyajun_less"); - event.finish(); - } - "step 3"; - if (result.bool) { - var card = result.links[0]; - card.fix(); - ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - game.updateRoundNumber(); - game.log(player, "将", card, "置于牌堆顶"); - } - }, - group: "spyajun_draw", - subSkill: { - draw: { - audio: "spyajun", - trigger: { player: "phaseDrawBegin2" }, - forced: true, - locked: false, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.num++; - }, - }, - less: { - onremove: true, - charlotte: true, - intro: { content: "手牌上限-#" }, - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("spyajun_less"); - }, - }, - }, - }, - }, - spzundi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterCard: true, - filterTarget: true, - check: function (card) { - return 7 - get.value(card); - }, - content: function () { - "step 0"; - player.judge(); - "step 1"; - if (result.color == "black") target.draw(3); - else target.moveCard(); - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if (target.canMoveCard(true)) return 3; - return 1; - }, - }, - }, - }, - //花蔓 - spxiangzhen: { - trigger: { target: "useCardToBefore" }, - forced: true, - audio: 2, - filter: function (event, player) { - return event.card.name == "nanman"; - }, - content: function () { - trigger.cancel(); - }, - group: "spxiangzhen_draw", - subSkill: { - draw: { - audio: "spxiangzhen", - trigger: { global: "useCardAfter" }, - forced: true, - filter: function (event, player) { - return ( - event.card.name == "nanman" && - game.hasPlayer2(function (current) { - return current.hasHistory("damage", function (evt) { - return evt.card == event.card; - }); - }) - ); - }, - content: function () { - "step 0"; - if (player != trigger.player && trigger.player.isIn()) - game.asyncDraw([player, trigger.player].sortBySeat()); - else { - player.draw(); - event.finish(); - } - "step 1"; - game.delayx(); - }, - }, - }, - }, - spfangzong: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return ( - !player.hasSkill("spxizhan_spfangzong") && - player.countCards("h") < Math.min(8, game.countPlayer()) - ); - }, - content: function () { - player.drawTo(Math.min(8, game.countPlayer())); - }, - mod: { - playerEnabled: function (card, player, target) { - if ( - player == _status.currentPhase && - get.tag(card, "damage") > 0 && - !player.hasSkill("spxizhan_spfangzong") && - player.inRange(target) - ) - return false; - }, - targetEnabled: function (card, player, target) { - if ( - get.tag(card, "damage") > 0 && - !target.hasSkill("spxizhan_spfangzong") && - player.inRange(target) - ) - return false; - }, - }, - }, - spxizhan: { - audio: 4, - group: "spxizhan_effect", - locked: false, - subSkill: { - spfangzong: { charlotte: true }, - effect: { - trigger: { global: "phaseBegin" }, - filter: function (event, player) { - return player != event.player; - }, - forced: true, - logTarget: "player", - content: function () { - "step 0"; - player - .chooseToDiscard( - "he", - "嬉战:弃置一张牌或失去1点体力", - "根据弃置的牌对" + - get.translation(trigger.player) + - "视为使用如下牌:
    ♠,其使用【酒】;♥,你使用【无中生有】
    ♣,对其使用【铁索连环】;♦:对其使用火【杀】" - ) - .set("ai", function (card) { - var player = _status.event.player, - target = _status.event.getTrigger().player; - var suit = get.suit(card, player), - list; - switch (suit) { - case "spade": - list = [{ name: "jiu" }, target, target]; - break; - case "heart": - list = [{ name: "wuzhong" }, player, player]; - break; - case "club": - list = [{ name: "tiesuo" }, player, target]; - break; - case "diamond": - list = [{ name: "sha", nature: "fire" }, player, target]; - break; - } - list[0].isCard = true; - var eff = 0; - if (list[1].canUse(list[0], list[2], false)) - eff = get.effect(list[2], list[0], list[1], player); - if (eff >= 0 || suit == "club") eff = Math.max(eff, 5); - return eff * 1.5 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.addTempSkill("spxizhan_spfangzong"); - var target = trigger.player, - card = result.cards[0], - suit = get.suit(card, player); - if ( - !lib.suit.includes(suit) || - ((!target || !target.isIn()) && suit != "heart") - ) - return; - game.broadcastAll(function (suit) { - if (lib.config.background_speak) - game.playAudio("skill", "spxizhan" + (4 - lib.suit.indexOf(suit))); - }, suit); - switch (suit) { - case "spade": - target.chooseUseTarget("jiu", true); - break; - case "heart": - player.chooseUseTarget("wuzhong", true); - break; - case "club": - if (player.canUse("tiesuo", target)) - player.useCard( - { - name: "tiesuo", - isCard: true, - }, - target - ); - break; - case "diamond": - if ( - player.canUse( - { - name: "sha", - isCard: true, - nature: "fire", - }, - target, - false - ) - ) - player.useCard( - { - name: "sha", - isCard: true, - nature: "fire", - }, - target, - false - ); - break; - } - } else player.loseHp(); - }, - }, - }, - }, - //高览 - spjungong: { - enable: "phaseUse", - filter: function (event, player) { - var num = player.getStat("skill").spjungong || 0; - return ( - (num < player.hp || num <= player.countCards("he")) && - !player.hasSkill("spjungong_block") - ); - }, - filterTarget: function (card, player, target) { - return target != player && player.canUse("sha", target, false); - }, - filterCard: true, - position: "he", - selectCard: function () { - var player = _status.event.player, - num = (player.getStat("skill").spjungong || 0) + 1; - if (ui.selected.cards.length || num > player.hp) return num; - return [0, num]; - }, - check: function (card) { - return 6 - get.value(card); - }, - prompt: function () { - var player = _status.event.player, - num = get.cnNumber((player.getStat("skill").spjungong || 0) + 1); - return "弃置" + num + "张牌或失去" + num + "点体力,视为使用杀"; - }, - content: function () { - "step 0"; - if (!cards.length) player.loseHp(player.getStat("skill").spjungong || 1); - player.useCard({ name: "sha", isCard: true }, target, false); - "step 1"; - if ( - player.hasHistory("sourceDamage", function (evt) { - var card = evt.card; - if (!card || card.name != "sha") return false; - var evtx = evt.getParent("useCard"); - return evtx.card == card && evtx.getParent() == event; - }) - ) - player.addTempSkill("spjungong_block"); - }, - ai: { - order: function (item, player) { - return get.order({ name: "sha" }, player) + 1; - }, - result: { - target: function (player, target) { - if (!ui.selected.cards.length) return 0; - return get.effect(target, { name: "sha" }, player, target); - }, - }, - }, - subSkill: { block: { charlotte: true } }, - }, - spdengli: { - trigger: { - player: "useCardToPlayered", - target: "useCardToTargeted", - }, - frequent: true, - filter: function (event, player) { - return event.card.name == "sha" && event.player.hp == event.target.hp; - }, - content: function () { - player.draw(); - }, - ai: { - effect: { - player: function (card, player, target) { - var hp = player.hp, - evt = _status.event; - if ( - evt.name == "chooseToUse" && - evt.player == player && - evt.skill == "spjungong" && - !ui.selected.cards.length - ) - hp -= (player.getStat("skill").spjungong || 0) + 1; - if (card && card.name == "sha" && hp == target.hp) return [1, 0.3]; - }, - target: function (card, player, target) { - if (card && card.name == "sha" && player.hp == target.hp) return [1, 0.3]; - }, - }, - }, - }, - //孙翊 - zaoli: { - trigger: { player: "phaseBegin" }, - audio: 2, - forced: true, - filter: function (event, player) { - return player.countMark("zaoli") > 0; - }, - content: function () { - "step 0"; - event.num = player.storage.zaoli; - player.removeMark("zaoli", event.num); - if (player.countCards("he") > 0) { - player - .chooseToDiscard(true, "he", [1, Infinity], "躁厉:弃置至少一张牌") - .set("ai", function (card) { - if (card.hasGaintag("zaoli")) return 1; - return 5 - get.value(card); - }); - } - "step 1"; - if (result.bool) num += result.cards.length; - if (event.num > 2) player.loseHp(); - player.draw(num); - }, - mod: { - cardEnabled2: function (card, player) { - if ( - player == _status.currentPhase && - get.itemtype(card) == "card" && - card.hasGaintag("zaoli") - ) - return false; - }, - }, - group: ["zaoli_add", "zaoli_count"], - init: function (player) { - if (player == _status.currentPhase) { - var hs = player.getCards("h"); - player.getHistory("gain", function (evt) { - hs.removeArray(evt.cards); - }); - if (hs.length) player.addGaintag(hs, "zaoli"); - } - }, - onremove: function (player) { - player.removeGaintag("zaoli"); - delete player.storage.zaoli; - }, - intro: { content: "mark" }, - subSkill: { - add: { - audio: "zaoli", - trigger: { player: ["useCard", "respond"] }, - forced: true, - filter: function (event, player) { - return ( - player.countMark("zaoli") < 4 && - player.hasHistory("lose", function (evt) { - return evt.hs && evt.hs.length > 0 && evt.getParent() == event; - }) - ); - }, - content: function () { - player.addMark("zaoli", 1); - }, - }, - count: { - trigger: { global: "phaseBeginStart" }, - forced: true, - firstDo: true, - silent: true, - filter: function (event, player) { - if (player == event.player) return player.countCards("h") > 0; - return player.hasCard(function (card) { - return card.hasGaintag("zaoli"); - }, "h"); - }, - content: function () { - if (player == trigger.player) { - player.addGaintag(player.getCards("h"), "zaoli"); - } else player.removeGaintag("zaoli"); - }, - }, - }, - }, - //王双 - yiyong: { - audio: 2, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return ( - event.card && - event.card.name == "sha" && - event.source && - event.source.isIn() && - player != event.source && - event.cards.filterInD().length > 0 && - player.getEquips(1).length > 0 - ); - }, - check: function (event, player) { - var card = { - name: "sha", - cards: event.cards.filterInD(), - }, - target = event.source; - return ( - !player.canUse(card, target, false) || get.effect(target, card, player, player) > 0 - ); - }, - content: function () { - "step 0"; - event.cards = trigger.cards.filterInD(); - player.gain(event.cards, "gain2"); - "step 1"; - var target = trigger.source, - hs = player.getCards("h"); - if ( - target && - target.isIn() && - hs.length >= cards.length && - cards.filter(function (i) { - return hs.includes(i); - }).length == cards.length && - player.canUse({ name: "sha", cards: cards }, target, false) - ) { - var next = player.useCard({ name: "sha" }, cards, target, false); - if (!target.getEquips(1).length) next.baseDamage = 2; - } - }, - }, - shanxie: { - audio: 2, - enable: "phaseUse", - usable: 1, - //filterTarget:function(card,player,target){ - // return target!=player&&target.getEquip(1); - //}, - //selectTarget:[0,1], - content: function () { - var card = get.cardPile2(function (card) { - return get.subtype(card) == "equip1"; - }); - if (card) player.gain(card, "gain2"); - else { - var targets = game.filterPlayer(function (current) { - return current.getEquips(1).length > 0; - }); - if (targets.length) { - var target = targets.randomGet(); - player.gain(target.getEquips(1), target, "give", "bySelf"); - } - } - }, - content_old: function () { - "step 0"; - if (!target) { - var card = get.cardPile2(function (card) { - return get.subtype(card) == "equip1"; - }); - if (card) player.gain(card, "gain2"); - event.finish(); - } else { - var card = target.getEquip(1); - if (card) { - event.card = card; - player.gain(card, target, "give"); - } else event.finish(); - } - "step 1"; - if ( - player.getCards("h").includes(card) && - get.type(card, player) == "equip" && - player.hasUseTarget(card) - ) - player.chooseUseTarget(card, true, "nopopup"); - "step 2"; - var hs = target.getCards("h", function (card) { - return target.canUse(get.autoViewAs({ name: "sha" }, [card]), player, false); - }); - if (hs.length) { - if (hs.length == 1) event._result = { bool: true, cards: hs }; - else - target - .chooseCard( - "h", - true, - "将一张牌当做【杀】对" + get.translation(player) + "使用", - function (card) { - return _status.event.cards.includes(card); - } - ) - .set("cards", hs) - .set("ai", function (card) { - return get.effect( - _status.event.getParent().player, - get.autoViewAs({ name: "sha" }, [card]), - _status.event.player - ); - }); - } else event.finish(); - "step 3"; - if (result.bool) target.useCard({ name: "sha" }, result.cards, player, false); - }, - ai: { - order: 9, - result: { player: 1 }, - }, - group: ["shanxie_exclude", "shanxie_shan"], - subSkill: { - exclude: { - trigger: { global: "useCard" }, - forced: true, - locked: false, - filter: function (event, player) { - if (event.card.name != "shan" || event.getParent(2).player != player) - return false; - var num = get.number(event.card); - return !num || num <= player.getAttackRange() * 2; - }, - logTarget: "player", - content: function () { - trigger.all_excluded = true; - }, - sub: true, - }, - shan: { - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return event.target.isAlive() && event.card.name == "sha"; - }, - silent: true, - content: function () { - trigger.target.addTempSkill("shanxie_banned"); - trigger.target.storage.shanxie_banned = { - card: trigger.card, - num: player.getAttackRange() * 2, - }; - }, - sub: true, - }, - banned: { - init: function (player) { - player.storage.shanxie_banned = {}; - }, - onremove: function (player) { - delete player.storage.shanxie_banned; - }, - trigger: { global: "useCardEnd" }, - filter: function (event, player) { - return event.card == player.storage.shanxie_banned.card; - }, - silent: true, - content: function () { - player.removeSkill("shanxie_banned"); - }, - ai: { - effect: { - player: function (card, player, target) { - if (get.name(card) == "shan") { - let num = get.number(card); - if (!num || num <= player.storage.shanxie_banned.num) - return "zeroplayertarget"; - } - }, - }, - }, - }, - }, - }, - //吴景流兵 - liubing: { - trigger: { player: "useCard1" }, - forced: true, - filter: function (event, player) { - if (event.card.name != "sha" || !event.cards || !event.cards.length) return false; - var evt = event.getParent("phaseUse"); - return ( - evt && - evt.player == player && - player - .getHistory("useCard", function (evt2) { - return ( - evt2.card.name == "sha" && - evt2.cards && - evt2.cards.length && - evt2.getParent("phaseUse") == evt - ); - }) - .indexOf(event) == 0 - ); - }, - content: function () { - game.log(player, "将", trigger.card, "的花色改为", "#y♦"); - trigger.card.suit = "diamond"; - trigger.card.color = "red"; - }, - group: "liubing_gain", - subSkill: { - gain: { - trigger: { global: "useCardAfter" }, - forced: true, - audio: "liubing", - filter: function (event, player) { - return ( - event.player != player && - event.card.isCard && - event.card.name == "sha" && - get.color(event.card) == "black" && - event.cards.filterInD().length > 0 && - event.player.isPhaseUsing() && - !event.player.hasHistory("sourceDamage", function (evt) { - return evt.card == event.card; - }) - ); - }, - logTarget: "player", - content: function () { - player.gain(trigger.cards.filterInD(), "gain2"); - }, - }, - }, - }, - //新刘璋 - jutu: { - audio: "xiusheng", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return ( - player.storage.yaohu && - game.hasPlayer(function (current) { - return current.group == player.storage.yaohu; - }) - ); - }, - content: function () { - "step 0"; - var cards = player.getExpansions("jutu"); - if (cards.length > 0) { - player.gain(cards, "gain2"); - } - "step 1"; - event.num = game.countPlayer(function (current) { - return current.group == player.storage.yaohu; - }); - player.draw(event.num + 1); - if (!event.num) event.finish(); - "step 2"; - var he = player.getCards("he"); - if (!he.length) event.finish(); - else if (he.length < num) event._result = { bool: true, cards: he }; - else player.chooseCard("he", true, num, "选择" + get.cnNumber(num) + "张牌作为生"); - "step 3"; - if (result.bool) { - var cards = result.cards; - player.addToExpansion(player, "give", cards).gaintag.add("jutu"); - } - "step 4"; - game.delayx(); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { combo: "yaohu" }, - }, - yaohu: { - audio: "yinlang", - trigger: { player: "phaseBegin" }, - direct: true, - forced: true, - locked: false, - filter: function (event, player) { - return ( - !player.hasSkill("yaohu_round") && - game.hasPlayer(function (current) { - return current.group && current.group != "unknown"; - }) - ); - }, - content: function () { - "step 0"; - var list = []; - game.countPlayer(function (current) { - if (current.group && current.group != "unknown") list.add(current.group); - }); - list.sort(function (a, b) { - return lib.group.indexOf(a) - lib.group.indexOf(b); - }); - if (!player.hasSkill("yaohu")) list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", "邀虎:请选择一个势力") - .set("ai", function () { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var getn = function (group) { - return game.countPlayer(function (current) { - if (current.group != group) return false; - if (player == current) return 2; - if (get.attitude(current, player) > 0) return 1; - return 1.3; - }); - }; - list.sort(function (a, b) { - return getn(b) - getn(a); - }); - return list[0]; - })() - ); - "step 1"; - if (result.control != "cancel2") { - player.logSkill( - "yaohu", - game.filterPlayer(function (current) { - return current.group == result.control; - }) - ); - game.log(player, "选择了", "#y" + get.translation(result.control + 2)); - player.storage.yaohu = result.control; - player.markSkill("yaohu"); - } - }, - ai: { combo: "jutu" }, - intro: { content: "已选择了$势力" }, - group: "yaohu_gain", - subSkill: { - round: {}, - gain: { - audio: "yinlang", - trigger: { global: "phaseUseBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - return ( - event.player != player && - event.player.group == player.storage.yaohu && - event.player.isIn() && - player.getExpansions("jutu").length > 0 - ); - }, - logTarget: "player", - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - target - .chooseButton(["选择获得一张“生”", player.getExpansions("jutu")], true) - .set("ai", function (button) { - return get.value(button.link, player); - }); - "step 1"; - if (result.bool) { - target.gain(result.links, "give", player, "bySelf"); - } - "step 2"; - if ( - game.hasPlayer(function (current) { - return current != player && current != target; - }) - ) { - player - .chooseTarget( - true, - "选择" + get.translation(target) + "使用【杀】的目标", - function (card, player, target) { - return target != player && target != _status.event.source; - } - ) - .set("source", target) - .set("ai", function (target) { - var evt = _status.event; - return get.effect(target, { name: "sha" }, evt.source, evt.player); - }); - } else { - event._result = { bool: false }; - event.goto(4); - } - "step 3"; - var target2 = result.targets[0]; - player.line(target2, "green"); - target - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "对" + get.translation(target2) + "使用一张杀,否则交给其两张牌") - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", target2) - .set("addCount", false); - "step 4"; - if (!result.bool) { - var hs = target.getCards("he"); - if (!hs.length) event.finish(); - else if (hs.length <= 2) event._result = { bool: true, cards: hs }; - else - target.chooseCard( - 2, - true, - "交给" + get.translation(player) + "两张牌", - "he" - ); - } else event.finish(); - "step 5"; - if (result.bool) target.give(result.cards, player); - }, - }, - }, - }, - rehuaibi: { - audio: "huaibi", - zhuSkill: true, - mod: { - maxHandcard: function (player, num) { - if (player.storage.yaohu && player.hasZhuSkill("rehuaibi")) - return ( - num + - game.countPlayer(function (current) { - return current.group == player.storage.yaohu; - }) - ); - }, - }, - ai: { combo: "yaohu" }, - }, - //宗预 - zhibian: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer((current) => current != player && player.canCompare(current)); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("zhibian"), - "与一名其他角色进行拼点", - function (card, player, target) { - return target != player && player.canCompare(target); - } - ) - .set("ai", function (target) { - if (!_status.event.goon) return false; - var att = get.attitude(player, target); - if ( - att < 0 && - target.countCards("e", function (card) { - return ( - player.canEquip(card) && get.effect(player, card, target, player) > 0 - ); - }) - ) - return -att / Math.sqrt(target.countCards("h")); - if (!player.isDamaged()) return false; - if (att <= 0) return (1 - att) / Math.sqrt(target.countCards("h")); - return Math.sqrt((2 / att) * Math.sqrt(target.countCards("h"))); - }) - .set( - "goon", - (function () { - if ( - !player.hasCard(function (card) { - return card.number >= 14 - player.hp && get.value(card) <= 5; - }) - ) - return false; - return true; - })() - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("zhibian", target); - player.chooseToCompare(target); - } else event.finish(); - "step 2"; - if (result.bool) { - var list = [], - list2 = [ - "将" + get.translation(target) + "装备区/判定区中的一张牌移动到你的区域内", - "回复1点体力", - "背水!跳过摸牌阶段,并依次执行上述所有选项", - ]; - if ( - target.hasCard(function (card) { - return player.canEquip(card); - }, "e") || - target.hasCard(function (card) { - return player.canAddJudge(card); - }, "j") - ) { - list.push("选项一"); - } - if (player.isDamaged()) { - list.push("选项二"); - } - if (list.includes("选项一")) list.push("背水!"); - list.push("cancel2"); - player - .chooseControl(list) - .set("choiceList", list2) - .set("ai", function (target) { - if ( - player.isDamaged() && - (player.hp <= 2 || - !target.countCards("e", function (card) { - return ( - player.canEquip(card) && - get.value(card, target) >= 4 + player.getDamagedHp() - ); - })) - ) - return 1; - return 0; - }); - } else { - player.loseHp(); - event.finish(); - } - "step 3"; - if (result.control != "cancel2") { - event.control = result.control; - if (result.control == "选项一" || result.control == "背水!") { - player.choosePlayerCard(target, "ej", true).set("ai", get.buttonValue); - } else event.goto(5); - } else event.finish(); - "step 4"; - if (result.bool) { - var card = result.cards[0]; - target.$give(card, player, false); - game.delayx(); - if (get.position(card) == "e") player.equip(card); - else player.addJudge(card); - } - "step 5"; - if (event.control == "选项二" || event.control == "背水!") { - player.recover(); - } - if (event.control == "背水!") player.skip("phaseDraw"); - }, - }, - yuyan: { - audio: 2, - trigger: { target: "useCardToTarget" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - return ( - event.card.name == "sha" && - event.card.isCard && - typeof get.number(event.card) == "number" && - player.hp < event.player.hp - ); - }, - content: function () { - "step 0"; - var num = get.number(trigger.card); - if ( - num >= 13 || - !trigger.player.hasCard(function (card) { - if (_status.connectMode && get.position(card) == "h") return true; - return get.number(card) > num; - }, "he") - ) - event._result = { bool: false }; - else - trigger.player - .chooseCard( - "he", - function (card) { - return get.number(card) > _status.event.number; - }, - "交给" + - get.translation(player) + - "一张点数大于" + - get.cnNumber(num) + - "的牌,或令" + - get.translation(trigger.card) + - "对其无效" - ) - .set("number", num) - .set("", function (card) { - if (card.name == "shan" || card.name == "tao" || card.name == "jiu") - return false; - return 6 - get.value(card); - }); - "step 1"; - if (result.bool) { - trigger.player.give(result.cards, player); - } else { - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - trigger.untrigger(); - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if ( - card.name == "sha" && - player.hp > target.hp && - get.attitude(player, target) < 0 - ) { - var num = get.number(card); - if (typeof num != "number") return false; - var bs = player.getCards("h", function (cardx) { - return get.number(cardx) > num && !["", "", ""].includes(cardx.name); - }); - if (bs.length < 2) return 0; - if (player.hasSkill("jiu") || player.hasSkill("tianxianjiu")) return; - if (bs.length <= 2) { - for (var i = 0; i < bs.length; i++) { - if (get.value(bs[i]) < 6) { - return [1, 0, 1, -0.5]; - } - } - return 0; - } - return [1, 0, 1, -0.5]; - } - }, - }, - }, - }, - //袁涣 - qingjue: { - audio: 2, - trigger: { global: "useCardToPlayer" }, - logTarget: "player", - round: 1, - filter: function (event, player) { - return ( - event.player != player && - event.target != player && - event.player != event.target && - event.player.hp > event.target.hp && - event.targets.length == 1 && - event.player.countCards("h") > 0 && - !event.target.isDying() && - !event.player.hasSkillTag("noCompareTarget") && - !player.hasSkillTag("noCompareSource") - ); - }, - check: function (event, player) { - var target = event.target, - source = event.player; - var eff1 = get.effect(target, event.card, source, player); - if (eff1 >= 0) return false; - var eff2 = get.effect(player, event.card, source, player); - if (eff2 >= 0) return true; - if (eff2 > eff1 / 3) - return player.hasCard(function (card) { - return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; - }); - if (eff2 > eff1 / 2) - return player.hasCard(function (card) { - return card.number > 10 && get.value(card) <= 5; - }); - return player.hasCard(function (card) { - return card.number > 11 && get.value(card) <= 5; - }); - }, - content: function () { - "step 0"; - player.draw(); - "step 1"; - if (player.canCompare(trigger.player)) player.chooseToCompare(trigger.player); - else event.finish(); - "step 2"; - trigger.targets.remove(trigger.target); - trigger.getParent().triggeredTargets1.remove(trigger.target); - trigger.untrigger(); - if (!result.bool) trigger.targets.push(player); - }, - }, - fengjie: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return game.hasPlayer((current) => current != player); - }, - content: function () { - "step 0"; - player - .chooseTarget( - "请选择【奉节】的目标", - "选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸至四张)或弃置至与其体力值相等。", - lib.filter.notMe, - true - ) - .set("ai", function (target) { - return (target.hp - player.countCards("h")) / get.threaten(target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - game.log(player, "选择了", target); - player.storage.fengjie2 = target; - player.addTempSkill("fengjie2", { player: "phaseBegin" }); - game.delayx(); - } - }, - }, - fengjie2: { - audio: "fengjie", - trigger: { global: "phaseJieshuBegin" }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - if (!player.storage.fengjie2 || !player.storage.fengjie2.isIn()) return false; - var num1 = player.countCards("h"), - num2 = player.storage.fengjie2.hp; - return num1 != num2; - }, - logTarget: (event, player) => player.storage.fengjie2, - content: function () { - var num1 = player.countCards("h"), - num2 = player.storage.fengjie2.hp; - if (num1 > num2) player.chooseToDiscard("h", true, num1 - num2); - else player.drawTo(Math.min(num1 + 4, num2)); - }, - }, - //陈武董袭 - spyilie: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseControl("选项一", "选项二", "背水!", "cancel2") - .set("choiceList", [ - "本阶段内使用【杀】的次数上限+1", - "本回合内使用【杀】被【闪】抵消时摸一张牌", - "背水!失去1点体力并依次执行上述所有选项", - ]) - .set("ai", function () { - if ( - player.countCards("hs", function (card) { - return get.name(card) == "sha" && player.hasValueTarget(card); - }) > player.getCardUsable({ name: "sha" }) - ) - return 0; - return 1; - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("spyilie"); - game.log(player, "选择了", "#g【毅烈】", "的", "#y" + result.control); - if (result.index % 2 == 0) player.addTempSkill("spyilie_add", "phaseUseEnd"); - if (result.index > 0) player.addTempSkill("spyilie_miss"); - if (result.index == 2) player.loseHp(); - } - }, - subSkill: { - add: { - charlotte: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - }, - miss: { - charlotte: true, - audio: "spyilie", - trigger: { player: "shaMiss" }, - forced: true, - content: function () { - player.draw(); - }, - }, - }, - }, - spfenming: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: (event, player) => - game.hasPlayer((current) => lib.skill.spfenming.filterTarget(null, player, current)), - filterTarget: function (card, player, target) { - if (target.hp > player.hp) return false; - return ( - !target.isLinked() || - target.hasCard( - function (card) { - return lib.filter.canBeGained(card, player, target); - }, - target == player ? "e" : "he" - ) - ); - }, - content: function () { - if (!target.isLinked()) target.link(); - else player.gainPlayerCard(target, target == player ? "e" : "he", true); - }, - ai: { - order: 7, - result: { - player: function (player, target) { - if (!target.isLinked()) - return get.effect(target, { name: "tiesuo" }, player, player); - return get.effect(target, { name: "shunshou_copy2" }, player, player); - }, - }, - }, - }, - //周处 - rechuhai: { - audio: "chuhai", - dutySkill: true, - locked: false, - group: ["rechuhai_add", "rechuhai_achieve", "rechuhai_fail", "rechuhai_chuhai"], - derivation: "zhangming", - subSkill: { - chuhai: { - audio: ["chuhai", 2], - inherit: "chuhai", - prompt: "与一名其他角色进行拼点", - }, - add: { - trigger: { player: "compare" }, - forced: true, - popup: false, - filter: function (event, player) { - return ( - event.getParent().name == "rechuhai_chuhai" && - event.num1 < 13 && - player.countCards("e") < 4 - ); - }, - content: function () { - var num = 4 - player.countCards("e"); - game.log(player, "的拼点牌点数+", num); - trigger.num1 = Math.min(13, trigger.num1 + num); - }, - }, - achieve: { - audio: ["chuhai", 2], - trigger: { player: "equipAfter" }, - forced: true, - skillAnimation: true, - animationColor: "wood", - filter: function (event, player) { - return player.countCards("e") > 2; - }, - content: function () { - player.awakenSkill("rechuhai"); - game.log(player, "成功完成使命"); - if (player.isDamaged()) player.recover(player.maxHp - player.hp); - player.changeSkills(["zhangming"], ["xianghai"]); - }, - }, - fail: { - audio: "chuhai3", - trigger: { player: "chooseToCompareAfter" }, - forced: true, - filter: function (event, player) { - return ( - event.getParent().name == "rechuhai_chuhai" && - event.num1 < 7 && - !event.result.bool - ); - }, - content: function () { - player.awakenSkill("rechuhai"); - game.log(player, "使命失败"); - }, - }, - }, - }, - chuhai3: { audio: true }, - zhangming: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - return get.suit(event.card) == "club"; - }, - content: function () { - trigger.directHit.addArray( - game.filterPlayer(function (current) { - return current != player; - }) - ); - }, - group: "zhangming_damage", - subSkill: { - damage: { - audio: "zhangming", - trigger: { source: "damageEnd" }, - forced: true, - usable: 1, - filter: function (event, player) { - return player != event.player; - }, - logTarget: "player", - content: function () { - var list = [], - cards = [], - target = trigger.player, - hs = target.getCards("h"); - if (hs.length > 0) { - var card = hs.randomGet(); - list.push(get.type2(card, target)); - player.showCards( - card, - get.translation(player) + - "对" + - get.translation(target) + - "发动了【彰名】" - ); - } - target.discard(card); - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var type = get.type2(ui.cardPile.childNodes[i], false); - if (!list.includes(type)) { - list.push(type); - cards.push(ui.cardPile.childNodes[i]); - } - } - player.gain(cards, "gain2").gaintag.add("zhangming"); - player.addTempSkill("zhangming_keep"); - }, - }, - keep: { - charlotte: true, - onremove: function (player) { - player.removeGaintag("zhangming"); - }, - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("zhangming")) { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("zhangming")) { - return false; - } - }, - }, - }, - }, - }, - xianghai: { - audio: 2, - global: "xianghai_g", - mod: { - cardname: function (card) { - if (get.type(card, null, false) == "equip") return "jiu"; - }, - }, - ai: { - threaten: 2, - }, - }, - xianghai_g: { - mod: { - maxHandcard: function (player, num) { - return ( - num - - game.countPlayer(function (current) { - return current != player && current.hasSkill("xianghai"); - }) - ); - }, - }, - }, - chuhai: { - audio: 3, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer((target) => player.canCompare(target, true)); - }, - filterTarget: function (card, player, target) { - return player.canCompare(target, true); - }, - content: function () { - "step 0"; - player.draw(); - "step 1"; - if (player.canCompare(target)) player.chooseToCompare(target); - else event.finish(); - "step 2"; - if (result.bool) { - player.storage.chuhai2 = target; - player.addTempSkill("chuhai2", "phaseUseEnd"); - if (target.countCards("h") > 0) { - player.viewHandcards(target); - var types = [], - cards = [], - hs = target.getCards("h"); - for (var i of hs) { - types.add(get.type2(i, target)); - } - for (var i of types) { - var card = get.cardPile(function (card) { - return get.type2(card, false) == i; - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2", "log"); - } - } - }, - ai: { - order: 9, - result: { - target: function (player, target) { - if ( - player.countCards("hs", function (card) { - return ( - get.tag(card, "damage") > 0 && - player.canUse(card, target, null, true) && - get.effect(target, card, player, player) > 0 && - player.hasValueTarget(card, null, true) - ); - }) > 0 - ) - return -3; - return -1; - }, - }, - }, - }, - chuhai2: { - trigger: { source: "damageSource" }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - if (event.player != player.storage.chuhai2) return false; - for (var i = 1; i < 6; i++) { - if (player.hasEmptySlot(i)) return true; - } - return false; - }, - content: function () { - for (var i = 1; i < 7; i++) { - if (player.hasEmptySlot(i)) { - var sub = "equip" + i, - card = get.cardPile(function (card) { - return ( - get.subtype(card, false) == sub && - !get.cardtag(card, "gifts") && - player.canEquip(card) - ); - }); - if (card) { - player.$gain2(card); - game.delayx(); - player.equip(card); - break; - } - } - } - }, - }, - //文鸯 - dbquedi: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - direct: true, - usable: 1, - filter: function (event, player) { - return ( - (event.card.name == "sha" || event.card.name == "juedou") && - event.targets.length == 1 && - (event.target.countGainableCards(player, "h") > 0 || - player.hasCard(function (i) { - return ( - _status.connectMode || - (get.type(i, player) == "basic" && - lib.filter.cardDiscardable(i, player, "dbquedi")) - ); - }, "h")) - ); - }, - content: function () { - "step 0"; - var target = trigger.target; - event.target = target; - var list = []; - if (target.countGainableCards(player, "h") > 0) list.push("选项一"); - if ( - player.hasCard(function (i) { - return ( - get.type(i, player) == "basic" && - lib.filter.cardDiscardable(i, player, "dbquedi") - ); - }, "h") - ) - list.push("选项二"); - list.push("背水!"); - list.push("cancel2"); - player - .chooseControl(list) - .set("choiceList", [ - "获得" + get.translation(target) + "的一张手牌", - "弃置一张基本牌并令" + get.translation(trigger.card) + "伤害+1", - "背水!减1点体力上限并执行所有选项", - ]) - .set("prompt", get.prompt("dbquedi", target)) - .set("ai", function () { - var evt = _status.event.getTrigger(), - player = evt.player, - target = evt.target, - card = evt.card; - if (get.attitude(player, target) > 0) return "cancel2"; - var bool1 = target.countGainableCards(player, "h") > 0; - var bool2 = - player.hasCard(function (i) { - return ( - get.type(i, player) == "basic" && - lib.filter.cardDiscardable(i, player, "dbquedi") && - get.value(card, player) < 5 - ); - }, "h") && - !target.hasSkillTag("filterDamage", null, { - player: player, - card: card, - }); - if ( - bool1 && - bool2 && - (target.hp <= 2 || (player.isDamaged() && player.maxHp > 3)) - ) - return "背水!"; - if (bool1) return "选项一"; - if (bool2) return "选项二"; - return "cancel2"; - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("dbquedi", target); - event.control = result.control; - if (event.control == "背水!") player.loseMaxHp(); - } else { - player.storage.counttrigger.dbquedi--; - event.finish(); - } - "step 2"; - if ( - (event.control == "选项一" || event.control == "背水!") && - target.countGainableCards(player, "h") > 0 - ) - player.gainPlayerCard(target, true, "h"); - "step 3"; - if ( - (event.control == "选项二" || event.control == "背水!") && - player.hasCard(function (i) { - return ( - get.type(i, player) == "basic" && - lib.filter.cardDiscardable(i, player, "dbquedi") - ); - }, "h") - ) { - player.chooseToDiscard("h", "弃置一张基本牌", { type: "basic" }, true); - } else event.finish(); - "step 4"; - if (result.bool) trigger.getParent().baseDamage++; - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if ( - tag !== "directHit_ai" || - !arg || - !arg.card || - !arg.target || - (arg.card.name != "sha" && arg.card.name != "juedou") - ) - return false; - if ( - player.storage.counttrigger && - player.storage.counttrigger.dbquedi && - player.storage.counttrigger.dbquedi > 0 - ) - return false; - if ( - arg.target.countCards("h") == 1 && - (arg.card.name != "sha" || - !arg.target.hasSkillTag("freeShan", false, { - player: player, - card: arg.card, - }) || - player.hasSkillTag("unequip", false, { - name: arg.card ? arg.card.name : null, - target: arg.target, - card: arg.card, - }) || - player.hasSkillTag("unequip_ai", false, { - name: arg.card ? arg.card.name : null, - target: arg.target, - card: arg.card, - })) - ) - return true; - return false; - }, - }, - }, - dbzhuifeng: { - audio: 2, - groupSkill: true, - enable: "chooseToUse", - usable: 2, - viewAsFilter: function (player) { - return player.group == "wei" && player.hp > 0; - }, - viewAs: { name: "juedou", isCard: true }, - filterCard: () => false, - selectCard: -1, - log: false, - precontent: function () { - "step 0"; - player.logSkill("dbzhuifeng"); - player.loseHp(); - event.forceDie = true; - "step 1"; - //特殊处理 - if (player.isDead()) { - player.useResult(event.result, event.getParent()).forceDie = true; - } - }, - ai: { - order: function () { - return get.order({ name: "juedou" }) - 0.5; - }, - }, - group: "dbzhuifeng_self", - subSkill: { - self: { - trigger: { player: "damageBegin2" }, - forced: true, - filter: function (event, player) { - var evt = event.getParent(); - return evt.skill == "dbzhuifeng" && evt.player == player; - }, - content: function () { - trigger.cancel(); - player.getStat().skill.dbzhuifeng = 2; - }, - }, - }, - }, - dbchongjian: { - audio: 2, - groupSkill: true, - hiddenCard: function (player, name) { - if ( - player.group == "wu" && - (name == "sha" || name == "jiu") && - player.hasCard(function (card) { - return get.type(card) == "equip"; - }, "hes") - ) - return true; - return false; - }, - enable: "chooseToUse", - filter: function (event, player) { - return ( - player.group == "wu" && - player.hasCard(function (card) { - return get.type(card) == "equip"; - }, "hes") && - (event.filterCard({ name: "sha" }, player, event) || - event.filterCard({ name: "jiu" }, player, event)) - ); - }, - locked: false, - mod: { - targetInRange: function (card) { - if (card.storage && card.storage.dbchongjian) return true; - }, - }, - chooseButton: { - dialog: function () { - var list = []; - list.push(["基本", "", "sha"]); - for (var i of lib.inpile_nature) list.push(["基本", "", "sha", i]); - list.push(["基本", "", "jiu"]); - return ui.create.dialog("冲坚", [list, "vcard"]); - }, - filter: function (button, player) { - var evt = _status.event.getParent(); - return evt.filterCard( - { name: button.link[2], nature: button.link[3], isCard: true }, - player, - evt - ); - }, - check: function (button) { - if (_status.event.getParent().type != "phase") return 1; - var player = _status.event.player; - if ( - button.link[2] == "jiu" && - (player.hasCard(function (card) { - return get.name(card) == "sha"; - }, "hs") || - player.countCards("hes", function (card) { - if (get.type(card) != "equip") return false; - if (get.position(card) == "e") { - if (player.hasSkillTag("noe")) return 10 - get.value(card) > 0; - var sub = get.subtype(card); - if ( - player.hasCard(function (card) { - return ( - get.subtype(card) == sub && - player.canUse(card, player) && - get.effect(player, card, player, player) > 0 - ); - }, "hs") - ) - return 10 - get.value(card) > 0; - } - return 5 - get.value(card) > 0; - }) > 1) - ) - return player.getUseValue({ name: "jiu" }) * 4; - return player.getUseValue({ name: button.link[2], nature: button.link[3] }, false); - }, - backup: function (links, player) { - return { - audio: "dbchongjian", - viewAs: { - name: links[0][2], - nature: links[0][3], - //isCard:true, - storage: { dbchongjian: true }, - }, - filterCard: { type: "equip" }, - position: "hes", - popname: true, - precontent: function () { - player.addTempSkill("dbchongjian_effect"); - }, - check: function (card) { - var player = _status.event.player; - if (get.position(card) == "e") { - if (player.hasSkillTag("noe")) return 10 - get.value(card); - var sub = get.subtype(card); - if ( - player.hasCard(function (card) { - return ( - get.subtype(card) == sub && - player.canUse(card, player) && - get.effect(player, card, player, player) > 0 - ); - }, "hs") - ) - return 10 - get.value(card); - } - return 5 - get.value(card); - }, - }; - }, - prompt: function (links) { - return ( - "将一张装备牌当做" + - (links[0][3] ? get.translation(links[0][3]) : "") + - "【" + - get.translation(links[0][2]) + - "】使用" - ); - }, - }, - ai: { - unequip: true, - respondSha: true, - skillTagFilter: function (player, tag, arg) { - if (tag == "unequip") { - if ( - player.group != "wu" || - !arg || - !arg.card || - !arg.card.storage || - !arg.card.storage.dbchongjian - ) - return false; - return true; - } - return ( - player.group == "wu" && - arg == "use" && - player.hasCard(function (card) { - return get.type(card) == "equip"; - }, "hes") - ); - }, - order: function (item, player) { - if (_status.event.type != "phase") return 1; - var player = _status.event.player; - if ( - player.hasCard(function (card) { - if (get.value(card, player) < 0) return true; - var sub = get.subtype(card); - return ( - player.hasCard(function (card) { - return ( - get.subtype(card) == sub && - player.canUse(card, player) && - get.effect(player, card, player, player) > 0 - ); - }, "hs") > 0 - ); - }, "e") - ) - return 10; - if ( - player.countCards("hs", "sha") || - player.countCards("he", function (card) { - return get.type(card) == "equip" && get.value(card, player) < 5; - }) > 1 - ) - return get.order({ name: "jiu" }) - 0.1; - return get.order({ name: "sha" }) - 0.1; - }, - result: { player: 1 }, - }, - subSkill: { - effect: { - charlotte: true, - mod: { - targetInRange: function (card) { - if (card.storage && card.storage.dbchongjian) return true; - }, - }, - trigger: { source: "damageSource" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - return ( - event.parent.skill == "dbchongjian_backup" && - event.card.name == "sha" && - event.getParent().name == "sha" && - event.player.countGainableCards(player, "e") > 0 - ); - }, - content: function () { - player.gainPlayerCard(trigger.player, "e", true, trigger.num); - }, - }, - }, - }, - dbchoujue: { - audio: 2, - trigger: { source: "dieAfter" }, - forced: true, - content: function () { - player.gainMaxHp(); - player.draw(2); - player.addSkill("counttrigger"); - if (!player.storage.counttrigger) player.storage.counttrigger = {}; - if (!player.storage.counttrigger.dbquedi) player.storage.counttrigger.dbquedi = 0; - player.storage.counttrigger.dbquedi--; - }, - }, - //王淩 - xingqi: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - locked: false, - filter: function (event, player) { - return ( - get.type(event.card, false) != "delay" && - !player.getStorage("xingqi").includes(event.card.name) - ); - }, - content: function () { - player.markAuto("xingqi", [trigger.card.name]); - game.log(player, "获得了一个", "#g【备(" + get.translation(trigger.card.name) + ")】"); - }, - marktext: "备", - intro: { - content: "$", - onunmark: function (storage, player) { - delete player.storage.xingqi; - }, - }, - group: "xingqi_gain", - subSkill: { - gain: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.getStorage("xingqi").length > 0; - }, - content: function () { - "step 0"; - player.removeSkill("mibei_mark"); - player - .chooseButton([ - "星启:是否获得一张牌?", - [player.getStorage("xingqi"), "vcard"], - ]) - .set("ai", function (button) { - var card = { name: button.link[2] }, - player = _status.event.player; - if ( - !get.cardPile2(function (cardx) { - return cardx.name == card.name; - }) - ) - return 0; - return get.value(card, player) * player.getUseValue(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("xingqi"); - var name = result.links[0][2]; - game.log(player, "移去了一个", "#g【备(" + get.translation(name) + ")】"); - player.unmarkAuto("xingqi", [name]); - var card = get.cardPile2(function (card) { - return card.name == name; - }); - if (card) player.gain(card, "gain2"); - } - }, - }, - }, - }, - xinzifu: { - audio: "zifu", - trigger: { player: "phaseUseEnd" }, - forced: true, - filter: function (event, player) { - return ( - player.getStorage("xingqi").length > 0 && - !player.hasHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == event; - }) - ); - }, - content: function () { - game.log(player, "移去了所有", "#g【备】"); - player.unmarkSkill("xingqi"); - player.addTempSkill("xinzifu_limit"); - player.addMark("xinzifu_limit", 1, false); - }, - ai: { - neg: true, - combo: "xingqi", - }, - subSkill: { - limit: { - charlotte: true, - markimage: "image/card/handcard.png", - intro: { - content: function (storage, player) { - var num = -player.countMark("xinzifu_limit"); - return "手牌上限" + num; - }, - }, - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("xinzifu_limit"); - }, - }, - }, - }, - }, - mibei: { - audio: 2, - trigger: { player: "useCardAfter" }, - dutySkill: true, - forced: true, - locked: false, - direct: true, - filter: function (event, player) { - if (!player.storage.xingqi || !player.storage.xingqi.length) return false; - var map = { basic: 0, trick: 0, equip: 0 }; - for (var i of player.storage.xingqi) { - var type = get.type(i); - if (typeof map[type] == "number") map[type]++; - } - for (var i in map) { - if (map[i] < 2) return false; - } - return true; - }, - content: function () { - "step 0"; - player.logSkill("twmibei_achieve"); - game.log(player, "成功完成使命"); - player.awakenSkill("mibei"); - var list = ["basic", "equip", "trick"], - cards = []; - for (var i of list) { - var card = get.cardPile2(function (card) { - return get.type(card) == i; - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - "step 1"; - player.addSkills("xinmouli"); - }, - ai: { - combo: "xingqi" - }, - group: ["mibei_fail", "mibei_silent"], - derivation: "xinmouli", - subSkill: { - silent: { - charlotte: true, - trigger: { player: "phaseZhunbeiBegin" }, - silent: true, - lastDo: true, - filter: function (event, player) { - return !player.getStorage("xingqi").length; - }, - content: function () { - player.addTempSkill("mibei_mark"); - }, - }, - mark: { charlotte: true }, - fail: { - audio: "mibei2", - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return !player.getStorage("xingqi").length && player.hasSkill("mibei_mark"); - }, - forced: true, - content: function () { - game.log(player, "使命失败"); - player.awakenSkill("mibei"); - player.loseMaxHp(); - }, - }, - }, - }, - mibei1: { audio: true }, - mibei2: { audio: true }, - xinmouli: { - audio: "mouli", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.getStorage("xingqi").length > 0; - }, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - target - .chooseButton( - ["谋立:是否获得一张牌?", [player.getStorage("xingqi"), "vcard"]], - true - ) - .set("ai", function (button) { - var card = { name: button.link[2] }, - player = _status.event.player; - return get.value(card, player); - }); - "step 1"; - if (result.bool) { - var name = result.links[0][2]; - game.log(player, "移去了一个", "#g【备(" + get.translation(name) + ")】"); - player.unmarkAuto("xingqi", [name]); - var card = get.cardPile2(function (card) { - return card.name == name; - }); - if (card) target.gain(card, "gain2"); - } - }, - ai: { - combo: "xingqi", - order: 1, - result: { - target: function (player, target) { - if (target.hasSkillTag("nogain")) return 0; - return 1; - }, - }, - }, - }, - mouli: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterCard: true, - position: "h", - filterTarget: lib.filter.notMe, - discard: false, - lose: false, - delay: false, - check: function (card) { - return 8 - get.value(card); - }, - content: function () { - player.give(cards, target); - if (!target.storage.mouli2) target.storage.mouli2 = []; - if (!target.storage.mouli3) target.storage.mouli3 = []; - target.storage.mouli2.add(player); - target.storage.mouli3.push(player); - target.addSkill("mouli_effect"); - }, - ai: { - threaten: 1.2, - order: 4, - result: { - target: 1, - }, - }, - subSkill: { - effect: { - trigger: { player: "useCard" }, - forced: true, - charlotte: true, - filter: function (event, player) { - if (event.card.name != "sha" && event.card.name != "shan") return false; - for (var i of player.storage.mouli3) { - if (i.isIn()) return true; - } - return false; - }, - logTarget: function (event, player) { - return player.storage.mouli3; - }, - content: function () { - "step 0"; - game.delayx(); - player.storage.mouli3.sortBySeat(); - if (player.storage.mouli3.length == 1) { - player.storage.mouli3[0].draw(3); - player.storage.mouli3.length = 0; - event.finish(); - } else game.asyncDraw(player.storage.mouli3, 3); - "step 1"; - player.storage.mouli3.length = 0; - game.delayx(); - }, - group: ["mouli_sha", "mouli_shan", "mouli_clear"], - mark: true, - intro: { - content: "已因$获得“谋立”效果", - }, - }, - sha: { - enable: "chooseToUse", - viewAs: { name: "sha" }, - filterCard: { color: "black" }, - position: "he", - prompt: "将一张黑色牌当做杀使用", - check: function (card) { - return 6 - get.value(card); - }, - viewAsFilter: function (player) { - return player.countCards("he", { color: "black" }) > 0; - }, - ai: { - respondSha: true, - skillTagFilter: function (player) { - return player.countCards("he", { color: "black" }) > 0; - }, - }, - }, - shan: { - enable: "chooseToUse", - viewAs: { name: "shan" }, - filterCard: { color: "red" }, - position: "he", - prompt: "将一张红色牌当做闪使用", - check: function (card) { - return 7 - get.value(card); - }, - viewAsFilter: function (player) { - return player.countCards("he", { color: "red" }) > 0; - }, - ai: { - respondShan: true, - skillTagFilter: function (player) { - return player.countCards("he", { color: "red" }) > 0; - }, - }, - }, - clear: { - trigger: { global: ["phaseBegin", "dieAfter"] }, - forced: true, - silent: true, - popup: false, - lastDo: true, - forceDie: true, - filter: function (event, player) { - if (event.name == "die" && player == event.player) return true; - return player.storage.mouli2.includes(event.player); - }, - content: function () { - if (trigger.name == "die" && player == trigger.player) { - player.removeSkill("mouli_effect"); - delete player.storage.mouli2; - delete player.storage.mouli3; - return; - } - player.storage.mouli2.remove(trigger.player); - while (player.storage.mouli3.includes(trigger.player)) - player.storage.mouli3.remove(trigger.player); - if (!player.storage.mouli2.length) player.removeSkill("mouli_effect"); - }, - }, - }, - }, - zifu: { - audio: 2, - trigger: { global: "dieAfter" }, - forced: true, - filter: function (event, player) { - return event.player.storage.mouli2 && event.player.storage.mouli2.includes(player); - }, - content: function () { - player.loseMaxHp(2); - }, - ai: { - combo: "mouli", - neg: true, - }, - }, - //孔融 - xinlirang: { - audio: "splirang", - trigger: { global: "phaseDrawBegin2" }, - logTarget: "player", - filter: function (event, player) { - return !event.numFixed && event.player != player && player.countMark("xinlirang") == 0; - }, - prompt2: "获得一枚“谦”并令其多摸两张牌", - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - content: function () { - trigger.num += 2; - player.addMark("xinlirang", 1); - player.addTempSkill("xinlirang_gain"); - }, - marktext: "谦", - intro: { - name: "谦", - content: "mark", - }, - group: "xinlirang_skip", - subSkill: { - gain: { - audio: "splirang", - trigger: { global: "phaseDiscardEnd" }, - direct: true, - filter: function (event, player) { - return event.player.hasHistory("lose", function (evt) { - return ( - evt.type == "discard" && - evt.cards2.filterInD("d").length > 0 && - evt.getParent("phaseDiscard") == event - ); - }); - }, - content: function () { - "step 0"; - var cards = []; - trigger.player.getHistory("lose", function (evt) { - if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) - cards.addArray(evt.cards2.filterInD("d")); - }); - player.chooseButton(["礼让:是否获得其中至多两张牌?", cards], [1, 2]); - "step 1"; - if (result.bool) { - player.logSkill("xinlirang_gain", trigger.player); - player.gain(result.links, "gain2"); - } - }, - }, - skip: { - audio: "splirang", - trigger: { player: "phaseDrawBefore" }, - forced: true, - filter: function (event, player) { - return player.hasMark("xinlirang"); - }, - content: function () { - trigger.cancel(); - player.removeMark("xinlirang", player.countMark("xinlirang")); - }, - }, - }, - }, - xinmingshi: { - audio: "spmingshi", - trigger: { player: "damageEnd" }, - forced: true, - logTarget: "source", - filter: function (event, player) { - return ( - event.source && - event.source.isIn() && - player.hasMark("xinlirang") && - event.source.countCards("he") > 0 - ); - }, - content: function () { - "step 0"; - trigger.source - .chooseToDiscard("he", true) - .set("color", get.attitude(trigger.source, player) > 0 ? "red" : "black") - .set("ai", function (card) { - return (get.color(card) == _status.event.color ? 4 : 0) - get.value(card); - }); - "step 1"; - if (result.bool && result.cards && result.cards.length) { - var card = result.cards[0]; - if (get.color(card, trigger.source) == "red") player.recover(); - else if (get.position(card, true) == "d") player.gain(card, "gain2"); - } - }, - ai: { - combo: "xinlirang", - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage") && target.hasMark("xinlirang")) { - var cards = [card]; - if (card.cards && card.cards.length) cards.addArray(card.cards); - if (ui.selected.cards.length) cards.addArray(ui.selected.cards); - if ( - !player.countCards("he", function (card) { - return !cards.includes(card); - }) - ) - return; - if ( - !player.countCards("h", function (card) { - return ( - !cards.includes(card) && - get.color(card) == "black" && - get.value(card, player) < 6 - ); - }) - ) - return "zerotarget"; - return 0.5; - } - }, - }, - }, - }, - spmingshi: { - audio: 2, - trigger: { player: "damageEnd" }, - forced: true, - logTarget: "source", - filter: function (event, player) { - return event.source && player != event.source && event.source.countCards("he") > 0; - }, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - trigger.source.chooseToDiscard("he", true); - "step 2"; - if ( - event.count > 0 && - result.bool && - lib.skill.spmingshi.filter(trigger, player) && - player.hasSkill("spmingshi") - ) - event.goto(1); - }, - ai: { - threaten: 0.8, - maixie: true, - maixie_defend: true, - }, - }, - splirang: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - var hs = player.getCards("h"); - if (!hs.length) return false; - for (var i of hs) { - if (!lib.filter.cardDiscardable(i, player, "splirang")) return false; - } - return true; - }, - filterCard: true, - selectCard: -1, - content: function () { - "step 0"; - cards = cards.filterInD("d"); - if (!cards.length || player.hp < 1) event.goto(3); - else - player - .chooseButton( - ["将任意张牌交给一名其他角色", cards], - [1, Math.min(cards.length, player.hp)] - ) - .set("ai", function (button) { - return get.value(button.link); - }); - "step 1"; - if (result.bool) { - event.cards = result.links; - player - .chooseTarget( - true, - "令一名角色获得" + get.translation(event.cards), - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) att /= 10; - if (target.hasJudge("lebu")) att /= 5; - return att; - }); - } else event.goto(3); - "step 2"; - if (result.targets && result.targets.length) { - var target = result.targets[0]; - player.line(target, "green"); - target.gain(cards, "gain2"); - } - "step 3"; - player.draw(); - }, - ai: { - order: 0.1, - result: { - player: function (player) { - var hs = player.getCards("h"); - if ( - hs.length <= player.hp && - game.hasPlayer(function (current) { - return ( - current != player && - get.attitude(player, current) > 0 && - !current.hasJudge("lebu") && - !current.hasSkillTag("nogain") - ); - }) - ) - return 1; - if (get.value(hs, player) < 6) return 1; - return 0; - }, - }, - }, - }, - //糜夫人 - xinguixiu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return player.hp % 2 == 1 || player.isDamaged(); - }, - content: function () { - if (player.hp % 2 == 1) player.draw(); - else player.recover(); - }, - }, - qingyu: { - audio: 3, - dutySkill: true, - locked: false, - group: ["qingyu_achieve", "qingyu_fail", "qingyu_defend"], - subSkill: { - defend: { - audio: "qingyu1", - trigger: { player: "damageBegin2" }, - filter: function (event, player) { - return ( - player.countCards("he", function (card) { - return lib.filter.cardDiscardable(card, player, "qingyu_defend"); - }) > 1 - ); - }, - forced: true, - content: function () { - trigger.cancel(); - player.chooseToDiscard(2, "he", true); - }, - }, - achieve: { - audio: "qingyu3", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - skillAnimation: true, - animationColor: "fire", - filter: function (event, player) { - return player.isHealthy() && player.countCards("h") == 0; - }, - content: function () { - game.log(player, "成功完成使命"); - player.awakenSkill("qingyu"); - player.addSkills("xuancun"); - }, - }, - fail: { - audio: "qingyu2", - trigger: { player: "dying" }, - forced: true, - content: function () { - game.log(player, "使命失败"); - player.awakenSkill("qingyu"); - player.loseMaxHp(); - }, - }, - }, - derivation: "xuancun", - }, - qingyu1: { audio: true }, - qingyu2: { audio: true }, - qingyu3: { audio: true }, - xuancun: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - return player != event.player && player.countCards("h") < player.hp; - }, - logTarget: "player", - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - prompt2: function (event, player) { - return "令其摸" + get.cnNumber(Math.min(2, player.hp - player.countCards("h"))) + "张牌"; - }, - content: function () { - trigger.player.draw(Math.min(2, player.hp - player.countCards("h"))); - }, - }, - //羊祜 - mingfa: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return ( - player.storage.mingfa && - player.countCards("h") > 0 && - player.getCards("he").includes(player.storage.mingfa) && - !player.hasSkillTag("noCompareSource") && - game.hasPlayer(function (current) { - return current != player && player.canCompare(current); - }) - ); - }, - content: function () { - "step 0"; - event.card = player.storage.mingfa; - delete player.storage.mingfa; - player - .chooseTarget( - get.prompt("mingfa"), - "用" + get.translation(event.card) + "和一名其他角色拼点", - function (card, player, target) { - return player.canCompare(target); - } - ) - .set("ai", function (target) { - var player = _status.event.player, - card = _status.event.getParent().card; - if ( - card.number > 9 || - !target.countCards("h", function (cardx) { - return cardx.number >= card.number + 2; - }) - ) - return -get.attitude(player, target) / Math.sqrt(target.countCards("h")); - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("mingfa", target); - var next = player.chooseToCompare(target); - if (!next.fixedResult) next.fixedResult = {}; - next.fixedResult[player.playerid] = event.card; - } else { - player.removeGaintag("mingfa"); - event.finish(); - } - "step 2"; - if (result.bool) { - player.gainPlayerCard(target, true, "he"); - if (event.card.number == 1) event.finish(); - } else { - player.addTempSkill("mingfa_block"); - event.finish(); - } - "step 3"; - var card = get.cardPile2(function (card) { - return card.number == event.card.number - 1; - }); - if (card) player.gain(card, "gain2"); - }, - group: ["mingfa_choose", "mingfa_add", "mingfa_mark"], - subSkill: { - block: { - mod: { - playerEnabled: function (card, player, target) { - if (player != target) return false; - }, - }, - }, - choose: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player - .chooseCard("he", get.prompt("mingfa"), "选择展示自己的一张牌") - .set("ai", function (card) { - return ( - Math.min(13, get.number(card) + 2) / - Math.pow(Math.min(2, get.value(card)), 0.25) - ); - }); - "step 1"; - if (result.bool) { - var card = result.cards[0]; - player.logSkill("mingfa"); - player.removeGaintag("mingfa"); - player.addGaintag(card, "mingfa"); - player.storage.mingfa = card; - player.showCards(card, get.translation(player) + "发动了【明伐】"); - } - }, - }, - add: { - trigger: { player: "compare", target: "compare" }, - filter: function (event, player) { - if (event.player == player) return !event.iwhile; - return true; - }, - forced: true, - locked: false, - content: function () { - if (player == trigger.player) { - trigger.num1 += 2; - if (trigger.num1 > 13) trigger.num1 = 13; - } else { - trigger.num2 += 2; - if (trigger.num2 > 13) trigger.num2 = 13; - } - game.log(player, "的拼点牌点数+2"); - }, - }, - mark: { - trigger: { player: "gainEnd" }, - silent: true, - firstDo: true, - filter: function (event, player) { - return ( - player.storage.mingfa && - event.cards.includes(player.storage.mingfa) && - player.getCards("h").includes(player.storage.mingfa) - ); - }, - content: function () { - player.addGaintag(player.storage.mingfa, "mingfa"); - }, - }, - }, - }, - rongbei: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return game.hasPlayer((current) => lib.skill.rongbei.filterTarget(null, player, current)); - }, - filterTarget: function (card, player, target) { - for (var i = 1; i < 6; i++) { - if (target.hasEmptySlot(i)) return true; - } - return false; - }, - content: function () { - "step 0"; - event.num = 1; - player.awakenSkill("rongbei"); - "step 1"; - while (!target.hasEmptySlot(event.num)) { - event.num++; - if (event.num > 5) { - event.finish(); - return; - } - } - var card = get.cardPile2(function (card) { - return get.subtype(card) == "equip" + event.num && target.canUse(card, target); - }); - if (card) { - target.chooseUseTarget(card, true, "nopopup"); - } - event.num++; - if (event.num <= 5) event.redo(); - }, - ai: { - order: 5, - result: { - target: function (player, target) { - return ( - (target.hasSkillTag("noe") ? 2 : 1) * - (5 - target.countCards("e") - target.countDisabled()) - ); - }, - }, - }, - }, - //桥公 - yizhu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - locked: false, - content: function () { - "step 0"; - player.draw(2); - "step 1"; - var hs = player.getCards("he"); - if (!hs.length) event.finish(); - else if (hs.length <= 2) event._result = { bool: true, cards: hs }; - else player.chooseCard("he", true, 2, "选择两张牌洗入牌堆"); - "step 2"; - if (result.bool) { - player.$throw(result.cards.length, 1000); - player.lose(result.cards, ui.cardPile).insert_index = function () { - return ui.cardPile.childNodes[get.rand(0, game.players.length * 2 - 2)]; - }; - player.markAuto("yizhu", result.cards); - } else event.finish(); - "step 3"; - game.updateRoundNumber(); - game.delayx(); - }, - intro: { - mark: function (dialog, content, player) { - if (player == game.me || player.isUnderControl()) dialog.addAuto(content); - else { - var names = []; - for (var i of content) names.add(i.name); - return get.translation(names); - } - }, - }, - group: "yizhu_use", - subSkill: { - use: { - audio: "yizhu", - trigger: { global: "useCardToPlayer" }, - filter: function (event, player) { - return ( - player.storage.yizhu && - player.storage.yizhu.length && - event.player != player && - event.targets.length == 1 && - event.cards.filter(function (i) { - return player.storage.yizhu.includes(i); - }).length > 0 - ); - }, - logTarget: "player", - check: function (event, player) { - return get.effect(event.targets[0], event.card, event.player, player) < 0; - }, - prompt2: function (event, player) { - return "令" + get.translation(event.card) + "无效"; - }, - content: function () { - trigger.cancel(); - trigger.targets.length = 0; - trigger.getParent().triggeredTargets1.length = 0; - var list = trigger.cards.filter(function (i) { - return player.storage.yizhu.includes(i); - }); - player.unmarkAuto("yizhu", list); - game.delayx(); - }, - }, - }, - }, - luanchou: { - audio: 2, - enable: "phaseUse", - usable: 1, - selectTarget: 2, - filterTarget: true, - multitarget: true, - multiline: true, - content: function () { - game.countPlayer(function (current) { - var num = current.countMark("luanchou"); - if (num) current.removeMark("luanchou", num); - }); - targets.sortBySeat(); - for (var i of targets) i.addMark("luanchou", 1); - }, - global: ["gonghuan", "gonghuan_clear"], - derivation: "gonghuan", - marktext: "姻", - intro: { - name: "共患", - content: () => lib.translate.gonghuan_info, - onunmark: true, - }, - ai: { - order: 10, - expose: 0.2, - result: { - target: function (player, target) { - if (!ui.selected.targets.length) return -Math.pow(target.hp, 3); - if (target.hp >= ui.selected.targets[0].hp) return 0; - return Math.pow(ui.selected.targets[0].hp - target.hp, 3); - }, - }, - }, - }, - gonghuan: { - audio: 2, - forceaudio: true, - trigger: { global: "damageBegin4" }, - usable: 1, - forced: true, - logTarget: "player", - filter: function (event, player) { - return ( - event.player.hp < player.hp && - player.hasMark("luanchou") && - event.player.hasMark("luanchou") && - game.hasPlayer(function (current) { - return current.hasSkill("luanchou"); - }) - ); - }, - content: function () { - trigger._gonghuan_player = trigger.player; - trigger.player = player; - }, - ai: { - effect: { - target: function (card, player, target) { - if (_status.luanchou_judging) return; - if (get.tag(card, "damage") && target.hasMark("luanchou")) { - var other = game.findPlayer(function (current) { - return ( - current != target && - current.hasMark("luanchou") && - current.hp > target.hp && - (!current.storage.counttrigger || - !current.storage.counttrigger.gonghuan) - ); - }); - if (!other) return; - _status.luanchou_judging = true; - var eff = [ - 0, - 0, - 0, - get.damageEffect(other, player, player, get.nature(card)) / - get.attitude(player, player), - ]; - delete _status.luanchou_judging; - return eff; - } - }, - }, - }, - subSkill: { - clear: { - trigger: { player: "damageEnd" }, - forced: true, - popup: false, - filter: function (event, player) { - return event._gonghuan_player; - }, - content: function () { - player.removeMark("luanchou", player.countMark("luanchou")); - trigger._gonghuan_player.removeMark( - "luanchou", - trigger._gonghuan_player.countMark("luanchou") - ); - }, - }, - }, - }, - //刘璋 - xiusheng: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return ( - player.storage.yinlang && - game.hasPlayer(function (current) { - return current.group == player.storage.yinlang; - }) - ); - }, - content: function () { - "step 0"; - if (player.storage.xiusheng && player.storage.xiusheng.length > 0) - player.unmarkSkill("xiusheng"); - "step 1"; - event.num = game.countPlayer(function (current) { - return current.group == player.storage.yinlang; - }); - if (event.num > 0) player.draw(event.num); - else event.finish(); - "step 2"; - var he = player.getCards("he"); - if (!he.length) event.finish(); - else if (he.length < num) event._result = { bool: true, cards: he }; - else player.chooseCard("he", true, num, "选择" + get.cnNumber(num) + "张牌作为生"); - "step 3"; - if (result.bool) { - var cards = result.cards; - player.markAuto("xiusheng", cards); - game.log(player, "将", cards, "放在了武将牌上"); - player.lose(cards, ui.special, "toStorage"); - } - "step 4"; - game.delayx(); - }, - intro: { - content: "cards", - onunmark: "throw", - }, - ai: { combo: "yinlang" }, - }, - yinlang: { - audio: 2, - trigger: { player: "phaseBegin" }, - direct: true, - filter: function (event, player) { - return ( - !player.hasSkill("yinlang_round") && - game.hasPlayer(function (current) { - return current.group && current.group != "unknown"; - }) - ); - }, - content: function () { - "step 0"; - var list = []; - game.countPlayer(function (current) { - if (current.group && current.group != "unknown") list.add(current.group); - }); - list.sort(function (a, b) { - return lib.group.indexOf(a) - lib.group.indexOf(b); - }); - if (!player.hasSkill("yinlang")) list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", "引狼:请选择一个势力") - .set("ai", function () { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var getn = function (group) { - return game.countPlayer(function (current) { - if (current.group != group) return false; - if (get.attitude(current, player) > 0) return 1.5; - if (!current.inRange(player)) return 1; - return 0.6; - }); - }; - list.sort(function (a, b) { - return getn(b) - getn(a); - }); - return list[0]; - })() - ); - "step 1"; - if (result.control != "cancel2") { - player.logSkill( - "yinlang", - game.filterPlayer(function (current) { - return current.group == result.control; - }) - ); - game.log(player, "选择了", "#y" + get.translation(result.control + 2)); - player.storage.yinlang = result.control; - player.markSkill("yinlang"); - } - }, - ai: { combo: "xiusheng" }, - intro: { content: "已选择了$势力" }, - group: "yinlang_gain", - subSkill: { - round: {}, - gain: { - audio: "yinlang", - trigger: { global: "phaseUseBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - return ( - event.player.group == player.storage.yinlang && - event.player.isIn() && - player.getStorage("xiusheng").length > 0 - ); - }, - logTarget: "player", - content: function () { - "step 0"; - var str = get.translation(player); - event.target = trigger.player; - event.target - .chooseControl() - .set("choiceList", [ - "获得" + str + "的一张“生”,然后本阶段使用牌时只能指定其为目标", - "令" + str + "获得一张“生”", - ]) - .set("ai", function () { - var evt = _status.event.getParent(), - player = evt.target, - target = evt.player; - if (get.attitude(player, target) > 0) return 1; - if ( - !player.countCards("hs", function (card) { - return ( - player.hasValueTarget(card, null, true) && - (!player.canUse(card, target, null, true) || - get.effect(target, card, player, player) < 0) - ); - }) - ) - return 0; - return 1; - }); - "step 1"; - event.gainner = result.index == 0 ? target : player; - if (result.index == 0) event.block = true; - event.gainner.chooseButton(["选择获得一张“生”", player.storage.xiusheng], true); - "step 2"; - player.unmarkAuto("xiusheng", result.links); - event.gainner.gain(result.links, "gain2"); - if (event.block) { - target.markAuto("yinlang_block", [player]); - target.addTempSkill("yinlang_block", "phaseUseAfter"); - } - }, - }, - block: { - mod: { - playerEnabled: function (card, player, target) { - var info = get.info(card); - if (info && info.singleCard && ui.selected.cards.length) return; - if (!player.getStorage("yinlang_block").includes(target)) return false; - }, - }, - onremove: true, - }, - }, - }, - huaibi: { - audio: 2, - zhuSkill: true, - mod: { - maxHandcard: function (player, num) { - if (player.storage.yinlang && player.hasZhuSkill("huaibi")) - return ( - num + - game.countPlayer(function (current) { - return current.group == player.storage.yinlang; - }) - ); - }, - }, - ai: { combo: "yinlang" }, - }, - //张温 - gebo: { - audio: 2, - trigger: { global: "recoverAfter" }, - forced: true, - content: function () { - game.cardsGotoSpecial(get.cards(), "toRenku"); - }, - }, - spsongshu: { - audio: 2, - trigger: { global: "phaseDrawBegin1" }, - logTarget: "player", - filter: function (event, player) { - return ( - event.player.hp > player.hp && - player.hp > 0 && - !event.numFixed && - _status.renku.length > 0 - ); - }, - check: function (event, player) { - var num = Math.min(5, player.hp, _status.renku.length); - if (num <= event.num) return get.attitude(player, event.player) < 0; - return false; - }, - content: function () { - "step 0"; - trigger.changeToZero(); - var num = Math.min(5, player.hp, _status.renku.length); - trigger.player.chooseButton( - ["选择获得" + get.cnNumber(num) + "张牌", _status.renku], - true, - num - ); - "step 1"; - if (result.bool) { - var cards = result.links; - _status.renku.removeArray(cards); - game.updateRenku(); - trigger.player.gain(cards, "gain2", "fromRenku"); - trigger.player.addTempSkill("spsongshu_block"); - } - }, - init: function (player) { - player.storage.renku = true; - }, - subSkill: { - block: { - mod: { - playerEnabled: function (card, player, target) { - if (player != target) return false; - }, - }, - mark: true, - intro: { content: "不能对其他角色使用牌" }, - }, - }, - }, - //张机 - jishi: { - audio: 2, - trigger: { player: "useCardAfter" }, - forced: true, - filter: function (event, player) { - return ( - event.cards.filterInD().length > 0 && - !player.getHistory("sourceDamage", function (evt) { - return evt.card == event.card; - }).length - ); - }, - content: function () { - var cards = trigger.cards.filterInD(); - game.log(player, "将", cards, "置于了仁库"); - game.cardsGotoSpecial(cards, "toRenku"); - }, - init: function (player) { - player.storage.renku = true; - }, - group: "jishi_draw", - subSkill: { - draw: { - trigger: { - global: ["gainAfter", "cardsDiscardAfter"], - }, - forced: true, - filter: function (event, player) { - return event.fromRenku == true && !event.outRange; - }, - content: function () { - player.draw(); - }, - }, - }, - }, - xinliaoyi: { - audio: "liaoyi", - trigger: { global: "phaseBegin" }, - filter: function (event, player) { - if (player == event.player) return false; - if (_status.renku.length) return true; - return event.player.countCards("h") > event.player.hp; - }, - direct: true, - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - var num = Math.max(0, target.countCards("h") - target.hp); - var choiceList = [ - "令其从仁库中获得一张牌", - "令其将" + get.cnNumber(num) + "张手牌置入仁库", - ]; - var choices = []; - if (_status.renku.length) choices.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if (target.countCards("h") > target.hp) { - event.num = num; - choices.push("选项二"); - } else choiceList[1] = '' + choiceList[1] + ""; - if (!choices.length) event.finish(); - else - player - .chooseControl(choices, "cancel2") - .set("prompt", get.prompt("xinliaoyi", target)) - .set("choiceList", choiceList) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getTrigger().player; - var att = get.attitude(player, target); - if (att > 0) { - if (_status.renku.length > 0) return "选项一"; - return 0; - } - if (target.countCards("h") > target.hp) return "选项二"; - return "cancel2"; - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("xinliaoyi", target); - if (result.control == "选项一") { - target - .chooseButton(true, ["选择获得一张牌", _status.renku]) - .set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - event.goto(4); - } else { - var hs = target.getCards("h"); - if (hs.length <= num) event._result = { bool: true, cards: hs }; - else - target.chooseCard( - "h", - true, - "将" + get.cnNumber(num) + "张手牌置于仁库中", - num - ); - } - } else event.finish(); - "step 2"; - if (result.bool) { - target.$throw(result.cards, 1000); - game.log(target, "将", result.cards, "置入了仁库"); - target.lose(result.cards, ui.special, "toRenku"); - } else event.finish(); - "step 3"; - game.delayx(); - event.finish(); - "step 4"; - var cards = result.links; - _status.renku.removeArray(cards); - game.updateRenku(); - target.gain(cards, "gain2", "fromRenku"); - }, - init: function (player) { - player.storage.renku = true; - }, - ai: { threaten: 3.4 }, - }, - liaoyi: { - audio: 2, - trigger: { global: "phaseBegin" }, - filter: function (event, player) { - if (player == event.player) return false; - var num = event.player.hp - event.player.countCards("h"); - if (num < 0) return true; - return num > 0 && _status.renku.length >= Math.min(4, num); - }, - logTarget: "player", - prompt2: function (event, player) { - var target = event.player, - num = target.hp - target.countCards("h"); - if (num < 0) - return ( - "令" + - get.translation(target) + - "将" + - get.cnNumber(Math.min(4, -num)) + - "张牌置入仁库" - ); - return ( - "令" + - get.translation(target) + - "从仁库中获得" + - get.cnNumber(Math.min(4, num)) + - "张牌" - ); - }, - check: function (event, player) { - var target = event.player, - num = target.hp - target.countCards("h"), - att = get.attitude(player, target); - if (num < 0) { - if ( - target.countCards("e", function (card) { - return get.value(card, target) <= 0; - }) >= - -num / 2 - ) - return att > 0; - return att <= 0; - } - return att > 0; - }, - content: function () { - "step 0"; - var target = trigger.player, - num = target.hp - target.countCards("h"); - event.target = target; - if (num < 0) { - num = Math.min(4, -num); - target.chooseCard("he", true, "将" + get.cnNumber(num) + "张牌置于仁库中", num); - } else { - num = Math.min(4, num); - target - .chooseButton(["选择获得" + get.cnNumber(num) + "张牌", _status.renku], num, true) - .set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - event.goto(3); - } - "step 1"; - if (result.bool) { - target.$throw(result.cards, 1000); - game.log(target, "将", result.cards, "置入了仁库"); - target.lose(result.cards, ui.special, "toRenku"); - } else event.finish(); - "step 2"; - game.delayx(); - event.finish(); - "step 3"; - var cards = result.links; - _status.renku.removeArray(cards); - game.updateRenku(); - target.gain(cards, "gain2", "fromRenku"); - }, - }, - binglun: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return _status.renku.length > 0; - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog("病论", _status.renku); - }, - backup: function (links, player) { - var obj = lib.skill.binglun_backup; - obj.card = links[0]; - return obj; - }, - prompt: () => "请选择【病论】的目标", - }, - subSkill: { - backup: { - audio: "binglun", - filterCard: () => false, - selectCard: -1, - filterTarget: true, - delay: false, - content: function () { - "step 0"; - var card = lib.skill.binglun_backup.card; - game.log(card, "从仁库进入了弃牌堆"); - player.$throw(card, 1000); - game.delayx(); - game.cardsDiscard(card).fromRenku = true; - _status.renku.remove(card); - game.updateRenku(); - "step 1"; - target - .chooseControl() - .set("choiceList", ["摸一张牌", "于自己的下回合结束后回复1点体力"]) - .set("ai", function () { - if (_status.event.player.isHealthy()) return 0; - return 1; - }); - "step 2"; - if (result.index == 0) target.draw(); - else { - target.addSkill("binglun_recover"); - target.addMark("binglun_recover", 1, false); - } - }, - ai: { - result: { - target: function (player, target) { - if (target.isDamaged()) return 1.5; - return 1; - }, - }, - }, - }, - recover: { - trigger: { player: "phaseEnd" }, - forced: true, - popup: false, - onremove: true, - charlotte: true, - content: function () { - if (player.isDamaged()) { - player.logSkill("binglun_recover"); - player.recover(player.countMark("binglun_recover")); - } - player.removeSkill("binglun_recover"); - }, - intro: { - content: "下回合结束时回复#点体力", - }, - ai: { threaten: 1.7 }, - }, - }, - ai: { - order: 2, - result: { - player: 1, - }, - }, - }, - mjweipo: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return !current.hasSkill("mjweipo_effect"); - }); - }, - filterTarget: function (card, player, target) { - return !target.hasSkill("mjweipo_effect"); - }, - content: function () { - "step 0"; - var list = ["binglinchengxiax"]; - list.addArray(get.zhinangs()); - player - .chooseButton(["危迫:选择一个智囊", [list, "vcard"]], true) - .set("ai", function (button) { - return _status.event.getParent().target.getUseValue({ name: button.link[2] }); - }); - "step 1"; - if (result.bool) { - var name = result.links[0][2]; - game.log(player, "选择了", "#y" + get.translation(name)); - target.storage.mjweipo_effect = name; - target.storage.mjweipo_source = player; - target.addSkill("mjweipo_effect"); - game.delayx(); - } - }, - ai: { - order: 7.1, - result: { - target: function (player, target) { - if (target == player) return player.countCards("hs", "sha") > 0 ? 10 : 0.01; - return (target.countCards("hs", "sha") + 0.5) * Math.sqrt(Math.max(1, target.hp)); - }, - }, - }, - }, - mjweipo_effect: { - audio: "mjweipo", - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("h", "sha") > 0; - }, - prompt: function () { - return ( - "弃置一张【杀】并获得一张" + - get.translation(_status.event.player.storage.mjweipo_effect) - ); - }, - filterCard: { name: "sha" }, - check: function (card) { - return 6 - get.value(card); - }, - position: "h", - popname: true, - content: function () { - var name = player.storage.mjweipo_effect, - card = false; - if (name == "binglinchengxiax") { - if (!_status.binglinchengxiax) { - _status.binglinchengxiax = [ - ["spade", 7], - ["club", 7], - ["club", 13], - ]; - game.broadcastAll(function () { - lib.inpile.add("binglinchengxiax"); - }); - } - if (_status.binglinchengxiax.length) { - var info = _status.binglinchengxiax.randomRemove(); - card = game.createCard2("binglinchengxiax", info[0], info[1]); - } - } - if (!card) card = get.cardPile2(name); - if (card) player.gain(card, "gain2"); - player.removeSkill("mjweipo_effect"); - }, - ai: { - order: 7, - result: { player: 1 }, - }, - mark: true, - marktext: "迫", - intro: { content: "可弃置一张【杀】并获得【$】" }, - group: "mjweipo_remove", - }, - mjweipo_remove: { - trigger: { global: ["phaseBegin", "die"] }, - forced: true, - firstDo: true, - popup: false, - filter: function (event, player) { - return event.player == player.storage.mjweipo_source; - }, - content: function () { - player.removeSkill("mjweipo_effect"); - }, - }, - mjchenshi: { - audio: 2, - global: ["mjchenshi_player", "mjchenshi_target"], - ai: { combo: "mjweipo" }, - }, - mjchenshi_player: { - trigger: { player: "useCardToPlayered" }, - direct: true, - filter: function (event, player) { - if (!event.card || event.card.name != "binglinchengxiax" || !event.isFirstTarget) - return false; - return ( - player.countCards("he") > 0 && - game.hasPlayer(function (current) { - return current != player && current.hasSkill("mjchenshi"); - }) - ); - }, - content: function () { - "step 0"; - var list = game.filterPlayer(function (current) { - return current != player && current.hasSkill("mjchenshi"); - }); - player.chooseCardTarget({ - prompt: - "是否交给" + - get.translation(list) + - "一张牌,将牌堆顶三张牌中不为【杀】的牌置于弃牌堆?", - filterCard: true, - position: "he", - filterTarget: function (card, player, target) { - return _status.event.list.includes(target); - }, - list: list, - selectTarget: list.length > 1 ? 1 : -1, - goon: (function () { - for (var i of list) { - if (get.attitude(player, i) > 0) return 1; - return -1; - } - })(), - ai1: function (card) { - if (_status.event.goon > 0) return 7 - get.value(card); - return 0.01 - get.value(card); - }, - ai2: function (target) { - var card = ui.selected.cards[0]; - return get.value(card, target) * get.attitude(_status.event.player, target); - }, - }); - "step 1"; - if (result.bool && result.cards.length && result.targets.length) { - var target = result.targets[0]; - target.logSkill("mjchenshi"); - player.line(target, "green"); - player.give(result.cards, target); - trigger.getParent().mjchenshi_ai = true; - } else event.finish(); - "step 2"; - var cards = get.cards(3); - for (var i = cards.length - 1; i >= 0; i--) { - if (cards[i].name == "sha") { - cards[i].fix(); - ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); - cards.splice(i, 1); - } - } - if (cards.length) { - player.$throw(cards, 1000); - game.delayx(); - game.cardsDiscard(cards); - game.log(cards, "进入了弃牌堆"); - } - }, - }, - mjchenshi_target: { - trigger: { target: "useCardToTargeted" }, - direct: true, - filter: function (event, player) { - if (!event.card || event.card.name != "binglinchengxiax") return false; - return ( - player.countCards("he") > 0 && - game.hasPlayer(function (current) { - return current != player && current.hasSkill("mjchenshi"); - }) - ); - }, - content: function () { - "step 0"; - var list = game.filterPlayer(function (current) { - return current != player && current.hasSkill("mjchenshi"); - }); - player.chooseCardTarget({ - prompt: - "是否交给" + - get.translation(list) + - "一张牌,将牌堆顶三张牌中的【杀】置于弃牌堆?", - filterCard: true, - position: "he", - filterTarget: function (card, player, target) { - return _status.event.list.includes(target); - }, - list: list, - selectTarget: list.length > 1 ? 1 : -1, - goon: (function () { - if (trigger.getParent().chenshi_ai) return 1; - for (var i of list) { - if (get.attitude(player, i) > 0) return 1; - return -1; - } - })(), - ai1: function (card) { - if (_status.event.goon > 0) return 7 - get.value(card); - return 3 - get.value(card); - }, - ai2: function (target) { - var card = ui.selected.cards[0]; - return Math.max( - 0.1, - get.value(card, target) * get.attitude(_status.event.player, target) - ); - }, - }); - "step 1"; - if (result.bool && result.cards.length && result.targets.length) { - var target = result.targets[0]; - target.logSkill("mjchenshi"); - player.line(target, "green"); - player.give(result.cards, target); - } else event.finish(); - "step 2"; - var cards = get.cards(3); - for (var i = cards.length - 1; i >= 0; i--) { - if (cards[i].name != "sha") { - cards[i].fix(); - ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); - cards.splice(i, 1); - } - } - if (cards.length) { - player.$throw(cards, 1000); - game.delayx(); - game.cardsDiscard(cards); - game.log(cards, "进入了弃牌堆"); - } - }, - }, - mjmouzhi: { - audio: 2, - trigger: { player: "damageBegin2" }, - forced: true, - filter: function (event, player) { - if (!event.card || get.suit(event.card) == "none") return false; - var all = player.getAllHistory("damage"); - if (!all.length) return false; - return ( - all[all.length - 1].card && get.suit(all[all.length - 1].card) == get.suit(event.card) - ); - }, - content: function () { - trigger.cancel(); - }, - group: "mjmouzhi_mark", - intro: { content: "上次受到伤害的花色:$" }, - ai: { - effect: { - target: (card, player, target) => { - if (typeof card === "object" && get.tag(card, "damage")) { - let suit = get.suit(card); - if (suit === "none") return; - let all = target.getAllHistory("damage"); - if (!all.length || !all[all.length - 1].card) return; - if (get.suit(all[all.length - 1].card) === suit) return "zeroplayertarget"; - } - }, - }, - }, - subSkill: { - mark: { - trigger: { player: "damage" }, - silent: true, - firstDo: true, - content: function () { - if (!trigger.card || get.suit(trigger.card) == "none") - player.unmarkSkill("mjmouzhi"); - else { - player.markSkill("mjmouzhi"); - game.broadcastAll( - function (player, suit) { - if (player.marks.mjmouzhi) - player.marks.mjmouzhi.firstChild.innerHTML = - get.translation(suit); - player.storage.mjmouzhi = suit; - }, - player, - get.suit(trigger.card) - ); - } - }, - }, - }, - }, - mjshengxi: { - audio: "shengxi", - audioname: ["feiyi"], - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return ( - player.getHistory("useCard").length > 0 && - player.getHistory("sourceDamage").length == 0 - ); - }, - content: function () { - "step 0"; - var list = get.zhinangs(); - player - .chooseButton( - [ - "###" + get.prompt("mjshengxi") + "###获得一张智囊或摸一张牌", - [list, "vcard"], - [["摸一张牌", "取消"], "tdnodes"], - ], - true - ) - .set("ai", function (card) { - if (card.link[2]) { - if ( - !get.cardPile2(function (cardx) { - return cardx.name == card.link[2]; - }) - ) - return 0; - return ( - (Math.random() + 1.5) * - get.value({ name: card.link[2] }, _status.event.player) - ); - } - if (card.link == "摸一张牌") return 1; - return 0; - }); - "step 1"; - if (result.bool && result.links[0] != "取消") { - player.logSkill("mjshengxi"); - if (result.links[0] == "摸一张牌") player.draw(); - else { - var card = get.cardPile2(function (card) { - return card.name == result.links[0][2]; - }); - if (card) player.gain(card, "gain2"); - } - } - }, - group: "mjshengxi_zhunbei", - subfrequent: ["zhunbei"], - subSkill: { - zhunbei: { - audio: "shengxi", - audioname: ["feiyi"], - trigger: { player: "phaseZhunbeiBegin" }, - frequent: true, - prompt2: "从游戏外或牌堆中获得一张【调剂盐梅】", - content: function () { - if (!_status.tiaojiyanmei_suits || _status.tiaojiyanmei_suits.length > 0) { - if (!lib.inpile.includes("tiaojiyanmei")) lib.inpile.add("tiaojiyanmei"); - if (!_status.tiaojiyanmei_suits) - _status.tiaojiyanmei_suits = lib.suit.slice(0); - player.gain( - game.createCard2( - "tiaojiyanmei", - _status.tiaojiyanmei_suits.randomRemove(), - 6 - ), - "gain2" - ); - } else { - var card = get.cardPile2(function (card) { - return card.name == "tiaojiyanmei"; - }); - if (card) player.gain(card, "gain2"); - } - }, - }, - }, - }, - mjkuanji: { - audio: "fyjianyu", - usable: 1, - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - direct: true, - filter: function (event, player) { - if (event.type != "discard") return false; - var evt = event.getl(player); - return evt.cards2.filterInD("d").length > 0; - }, - content: function () { - "step 0"; - var cards = trigger.getl(player).cards2; - player - .chooseButton(["宽济:是否将一张牌交给一名其他角色?", cards.filterInD("d")]) - .set("ai", function (button) { - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0; - }) - ) - return Math.abs(get.value(button.link, "raw")) + 1; - return -get.value(button.link, "raw"); - }); - "step 1"; - if (result.bool) { - var card = result.links[0]; - event.card = card; - player - .chooseTarget( - "将" + get.translation(card) + "交给一名其他角色并摸一张牌", - lib.filter.notMe, - true - ) - .set("ai", function (target) { - var evt = _status.event.getParent(); - return ( - get.attitude(evt.player, target) * - get.value(evt.card, target) * - (target.hasSkillTag("nogain") ? 0.1 : 1) - ); - }); - } else { - player.storage.counttrigger.mjkuanji--; - event.finish(); - } - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("mjkuanji", target); - target.gain(card, "gain2"); - player.draw(); - } - }, - }, - mjdingyi: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - logTarget: function () { - return game.players; - }, - content: function () { - "step 0"; - var list = []; - for (var i = 0; i < 4; i++) list.push(lib.skill["mjdingyi_" + i].title); - player - .chooseControl() - .set("choiceList", list) - .set("prompt", "定仪:请选择一个全局效果") - .set("ai", function (target) { - var list1 = player.getEnemies().length; - var list2 = game.players.length - list1; - if (list2 - list1 > 1) return 0; - if (game.players.length < 6) return 2; - return 3; - }); - "step 1"; - if (typeof result.index == "number") { - var skill = "mjdingyi_" + result.index; - game.log(player, "选择了", "#g" + lib.skill[skill].title); - for (var i of game.players) i.addSkill(skill); - game.delayx(); - } - }, - subSkill: { - 0: { - title: "摸牌阶段的额定摸牌数+1", - charlotte: true, - mark: true, - marktext: "仪", - trigger: { player: "phaseDrawBegin" }, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.num += (player.storage.mjdingyi_plus || 0) + 1; - }, - intro: { - content: function (storage, player) { - return ( - "摸牌阶段的额定摸牌数+" + 1 * ((player.storage.mjdingyi_plus || 0) + 1) - ); - }, - }, - }, - 1: { - title: "手牌上限+2", - charlotte: true, - mark: true, - marktext: "仪", - mod: { - maxHandcard: function (player, num) { - return num + 2 * ((player.storage.mjdingyi_plus || 0) + 1); - }, - }, - intro: { - content: function (storage, player) { - return "手牌上限+" + 2 * ((player.storage.mjdingyi_plus || 0) + 1); - }, - }, - }, - 2: { - title: "攻击范围+1", - charlotte: true, - mark: true, - marktext: "仪", - mod: { - attackRange: function (player, num) { - return num + ((player.storage.mjdingyi_plus || 0) + 1); - }, - }, - intro: { - content: function (storage, player) { - return "攻击范围+" + ((player.storage.mjdingyi_plus || 0) + 1); - }, - }, - }, - 3: { - title: "脱离濒死状态后回复1点体力", - charlotte: true, - mark: true, - marktext: "仪", - trigger: { player: "dyingAfter" }, - forced: true, - filter: function (event, player) { - return player.isDamaged(); - }, - content: function () { - player.recover((player.storage.mjdingyi_plus || 0) + 1); - }, - intro: { - content: function (storage, player) { - return ( - "脱离濒死状态后回复" + - ((player.storage.mjdingyi_plus || 0) + 1) + - "点体力" - ); - }, - }, - }, - }, - }, - mjzuici: { - audio: "zuici", - trigger: { player: "damageEnd" }, - filter: function (event, player) { - if (!event.source || !event.source.isIn()) return false; - for (var i = 0; i < 4; i++) { - if (event.source.hasSkill("mjdingyi_" + i)) return true; - } - return false; - }, - logTarget: "source", - check: () => false, - content: function () { - "step 0"; - var target = trigger.source; - event.target = target; - for (var i = 0; i < 4; i++) { - if (target.hasSkill("mjdingyi_" + i)) target.removeSkill("mjdingyi_" + i); - } - "step 1"; - var list = get.zhinangs(); - if (list.length) { - player.chooseButton( - ["选择要令" + get.translation(target) + "获得的智囊", [list, "vcard"]], - true - ); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = get.cardPile2(function (card) { - return card.name == result.links[0][2]; - }); - if (card) target.gain(card, "gain2"); - } - }, - ai: { - combo: "mjdingyi", - }, - }, - mjfubi: { - audio: "fubi", - enable: "phaseUse", - filter: function (event, player) { - if (player.hasSkill("mjfubi_round")) return false; - return game.hasPlayer(function (current) { - for (var i = 0; i < 4; i++) { - if (current.hasSkill("mjdingyi_" + i)) return true; - } - }); - }, - filterCard: true, - selectCard: [0, 1], - filterTarget: function (card, player, target) { - if (ui.selected.cards.length) { - for (var i = 0; i < 4; i++) { - if (target.hasSkill("mjdingyi_" + i)) return true; - } - } - var num = 0; - for (var i = 0; i < 4; i++) { - if (target.hasSkill("mjdingyi_" + i)) return true; - } - return num > 1 && num < 4; - }, - check: () => false, - position: "he", - content: function () { - "step 0"; - player.addTempSkill("mjfubi_round", "roundStart"); - if (cards.length) { - player.addSkill("mjfubi_clear"); - player.markAuto("mjfubi_clear", [target]); - target.addMark("mjdingyi_plus", 1, false); - game.log(target, "的", "#g【定仪】", "效果增加一倍"); - event.finish(); - return; - } - var list = [], - nums = []; - for (var i = 0; i < 4; i++) { - if (!target.hasSkill("mjdingyi_" + i)) { - list.push(lib.skill["mjdingyi_" + i].title); - nums.push(i); - } - } - if (list.length) { - event.nums = nums; - player - .chooseControl() - .set("choiceList", list) - .set("prompt", "辅弼:请选择为" + get.translation(target) + "更换的〖定仪〗效果") - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().target; - if (get.attitude(player, target) > 0 && !target.hasSkill("mjdingyi_0")) - return 0; - return _status.event.getParent().nums.length - 1; - }); - } else event.finish(); - "step 1"; - for (var i = 0; i < 4; i++) { - if (target.hasSkill("mjdingyi_" + i)) target.removeSkill("mjdingyi_" + i); - } - target.addSkill("mjdingyi_" + event.nums[result.index]); - game.log( - target, - "的效果被改为", - "#g" + lib.skill["mjdingyi_" + event.nums[result.index]].title - ); - }, - ai: { - order: 10, - expose: 0, - result: { - target: function (player, target) { - if (target.hasSkill("mjdingyi_0")) return -1; - return 2; - }, - }, - combo: "mjdingyi", - }, - subSkill: { - round: {}, - clear: { - trigger: { player: ["phaseBegin", "dieBegin"] }, - forced: true, - popup: false, - charlotte: true, - content: function () { - while (player.storage.mjfubi_clear && player.storage.mjfubi_clear.length) { - var target = player.storage.mjfubi_clear.shift(); - if (target.hasMark("mjdingyi_plus")) - target.removeMark("mjdingyi_plus", 1, false); - } - delete player.storage.mjfubi_clear; - player.removeSkill("mjfubi_clear"); - }, - }, - }, - }, - boming: { - audio: 2, - enable: "phaseUse", - usable: 2, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - filterCard: true, - position: "he", - filterTarget: lib.filter.notMe, - discard: false, - lose: false, - delay: false, - content: function () { - player.give(cards, target); - }, - check: function (card) { - return 5 - get.value(card); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - if (!ui.selected.cards.length) return 0; - var card = ui.selected.cards[0]; - if (player.hasSkill("ejian") && !player.getStorage("ejian").includes(target)) { - var dam = get.damageEffect(target, player, target); - if (dam > 0) return dam; - var type = get.type(card, target), - ts = target.getCards("he", function (card) { - return get.type(card) == type; - }); - if (ts.length) { - var val = get.value(ts, target); - if (val > get.value(card)) return -Math.max(1, val); - return 0; - } - } - return get.value(card, target) / 1.5; - }, - }, - }, - group: "boming_draw", - subSkill: { - draw: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - return ( - player.getHistory("lose", function (evt) { - return evt.getParent(2).name == "boming"; - }).length > 1 - ); - }, - content: function () { - player.draw(); - }, - }, - }, - }, - ejian: { - audio: 2, - trigger: { global: "gainAfter" }, - forced: true, - filter: function (event, player) { - var evt = event.getParent(), - target = event.player; - if ( - evt.name != "boming" || - evt.player != player || - player.getStorage("ejian").includes(target) || - !target.isIn() - ) - return false; - var he = target.getCards("he"), - card = event.cards[0]; - if (!he.includes(card)) return false; - var type = get.type2(card); - for (var i of he) { - if (i != card && get.type2(i) == type) return true; - } - return false; - }, - logTarget: "player", - content: function () { - "step 0"; - event.cardType = get.type2(trigger.cards[0]); - event.target = trigger.player; - player.markAuto("ejian", [event.target]); - event.target - .chooseControl() - .set("choiceList", [ - "受到1点伤害", - "展示手牌并弃置所有" + get.translation(event.cardType) + "牌", - ]) - .set("ai", function (event, player) { - if (get.damageEffect(player, _status.event.getParent().player, player) >= 0) - return 0; - var type = _status.event.cardType, - cards = player.getCards("he", function (card) { - return get.type2(card) == type; - }); - if (cards.length == 1) return 1; - if (cards.length >= 2) { - for (var i = 0; i < cards.length; i++) { - if (get.tag(cards[i], "save")) return 0; - } - } - if (player.hp == 1) return 1; - for (var i = 0; i < cards.length; i++) { - if (get.value(cards[i]) >= 8) return 0; - } - if (cards.length > 2 && player.hp > 2) return 0; - if (cards.length > 3) return 0; - return 1; - }) - .set("cardType", event.cardType); - "step 1"; - if (result.index == 1) { - if (target.countCards("h") > 0) target.showHandcards(); - } else { - target.damage(); - event.finish(); - } - "step 2"; - target.discard( - target.getCards("he", function (card) { - return get.type2(card) == event.cardType; - }) - ); - }, - ai: { combo: "boming", halfneg: true }, - onremove: true, - intro: { content: "已对$发动过此技能" }, - }, - hxrenshi: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return ( - player.countCards("h") > 0 && - (!player.storage.hxrenshi2 || - game.hasPlayer(function (current) { - return !player.storage.hxrenshi2.includes(current); - })) - ); - }, - filterCard: true, - filterTarget: function (card, player, target) { - return !player.storage.hxrenshi2 || !player.storage.hxrenshi2.includes(target); - }, - position: "h", - discard: false, - lose: false, - delay: false, - check: function (cardx) { - var player = _status.event.player; - if ( - player.getStorage("debao").length == 1 && - (!game.hasPlayer(function (current) { - return ( - get.attitude(player, current) > 0 && - current.hp * 1.5 + current.countCards("h") < 4 - ); - }) || - game.hasPlayer(function (current) { - return ( - get.attitude(player, current) <= 0 && - current.hp * 1.5 + current.countCards("h") < 4 - ); - })) - ) - return 0; - return 5 - get.value(cardx); - }, - content: function () { - player.addTempSkill("hxrenshi2", "phaseUseEnd"); - player.markAuto("hxrenshi2", targets); - player.give(cards, target); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (ui.selected.cards.length) - return get.value(ui.selected.cards[0], target) + 0.1; - return 0; - }, - }, - }, - }, - hxrenshi2: { - onremove: true, - }, - debao: { - audio: 2, - trigger: { global: "gainAfter" }, - forced: true, - filter: function (event, player) { - if (player == event.player || player.getStorage("debao").length >= player.maxHp) - return false; - var evt = event.getl(player); - return evt && evt.cards2 && evt.cards2.length > 0; - }, - content: function () { - var cards = get.cards(); - player.markAuto("debao", cards); - player.$gain2(cards[0], false); - game.cardsGotoSpecial(cards); - game.log(player, "将", cards[0], "放在了武将牌上"); - game.delayx(); - }, - marktext: "仁", - intro: { content: "cards", onunmark: "throw" }, - group: "debao_gain", - subSkill: { - gain: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return player.getStorage("debao").length > 0; - }, - content: function () { - var cards = player.storage.debao; - player.gain(cards, "gain2", "fromStorage"); - cards.length = 0; - player.unmarkSkill("debao"); - }, - }, - }, - }, - buqi: { - audio: 2, - trigger: { global: "dying" }, - forced: true, - filter: function (event, player) { - return player.getStorage("debao").length > 1; - }, - logTarget: "player", - content: function () { - "step 0"; - var cards = player.getStorage("debao"); - if (cards.length == 2) event._result = { bool: true, links: cards.slice(0) }; - else player.chooseButton(["不弃:请选择移去两张“仁”", cards], 2, true); - "step 1"; - if (result.bool) { - var cards = result.links; - player.unmarkAuto("debao", cards); - player.$throw(cards, 1000); - game.log(player, "将", cards, "置入了弃牌堆"); - game.delayx(); - game.cardsDiscard(cards); - } else event.finish(); - "step 2"; - if (trigger.player.isIn() && trigger.player.isDamaged()) trigger.player.recover(); - }, - group: "buqi_die", - subSkill: { - die: { - trigger: { global: "dieAfter" }, - forced: true, - filter: function (event, player) { - return player.getStorage("debao").length > 0; - }, - content: function () { - player.unmarkSkill("debao"); - }, - }, - }, - ai: { - neg: true, - combo: "debao", - }, - }, - guying: { - audio: 2, - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - forced: true, - usable: 1, - filter: function (event, player) { - if (event.type != "discard") { - var evt = event.getParent(); - if (evt.name != "useCard" && evt.name != "respond") return false; - } - var target = _status.currentPhase, - evt = event.getl(player); - if ( - !evt.cards2 || - evt.cards2.length != 1 || - !target || - target == player || - !target.isIn() - ) - return false; - return get.position(evt.cards2[0]) == "d" || target.countCards("he") < 0; - }, - logTarget: function () { - return _status.currentPhase; - }, - content: function () { - "step 0"; - if (trigger.delay === false) game.delayx(); - event.target = _status.currentPhase; - event.card = trigger.getl(player).cards2[0]; - "step 1"; - player.addMark("guying", 1, false); - event.addIndex = 0; - var choiceList = [], - str = get.translation(player); - if (target.countCards("he") > 0) choiceList.push("随机交给" + str + "一张牌"); - else event.addIndex++; - if (get.position(card) == "d") - choiceList.push("令" + str + "收回" + get.translation(card)); - if (choiceList.length == 1) event._result = { index: 0 }; - target - .chooseControl() - .set("choiceList", choiceList) - .set("ai", function () { - var player = _status.event.player, - evt = _status.event.getParent(); - if (get.value(evt.card, evt.player) * get.attitude(player, evt.player) > 0) - return 0; - return Math.random() > get.value(evt.card, evt.player) / 6 ? 1 : 0; - //return 1; - }); - "step 2"; - if (result.index + event.addIndex == 0) { - target.give(target.getCards("he").randomGet(), player); - event.finish(); - } else player.gain(card, "gain2"); - "step 3"; - if ( - player.isIn() && - player.getCards("h").includes(card) && - get.type(card, player) == "equip" - ) - player.chooseUseTarget(card, true, "nopopup"); - }, - onremove: true, - intro: { content: "已发动过#次" }, - group: "guying_discard", - subSkill: { - discard: { - audio: "guying", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return player.countMark("guying") > 0; - }, - content: function () { - var num = player.countMark("guying"); - player.removeMark("guying", num, false); - player.chooseToDiscard("he", num, true); - }, - }, - }, - }, - muzhen: { - audio: 2, - enable: "phaseUse", - usable: 2, - filter: function (event, player) { - if ( - !player.hasSkill("muzhen1") && - player.countCards("e") > 0 && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }) - ) - return true; - if ( - !player.hasSkill("muzhen2") && - player.countCards("he") > 1 && - game.hasPlayer(function (current) { - return current != player && current.countCards("e") > 0; - }) - ) - return true; - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = [ - "将一张装备牌置于其他角色的装备区内并获得其一张手牌", - "将两张牌交给一名其他角色并获得其装备区内的一张牌", - ]; - var choiceList = ui.create.dialog("睦阵:请选择一项", "hidden"); - choiceList.add([ - list.map((item, i) => { - return [i, item]; - }), - "textbutton", - ]); - return choiceList; - }, - filter: function (button, player) { - if (button.link == 0) - return ( - !player.hasSkill("muzhen1") && - player.countCards("e") > 0 && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }) - ); - return ( - !player.hasSkill("muzhen2") && - player.countCards("he") > 1 && - game.hasPlayer(function (current) { - return current != player && current.countCards("e") > 0; - }) - ); - }, - backup: function (links) { - return { - audio: "muzhen", - filterTarget: [ - function (card, player, target) { - return ( - target.countCards("h") > 0 && target.canEquip(ui.selected.cards[0]) - ); - }, - function (card, player, target) { - return target.countCards("e") > 0; - }, - ][links[0]], - filterCard: [ - function (card, player) { - if (ui.selected.targets.length) - return ui.selected.targets[0].canEquip(card); - return game.hasPlayer(function (current) { - return current.countCards("h") > 0 && current.canEquip(card); - }); - }, - true, - ], - selectCard: 1 + links[0], - position: "eh"[links[0]], - discard: false, - lose: false, - delay: false, - content: function () { - "step 0"; - player.addTempSkill("muzhen" + cards.length, "phaseUseEnd"); - if (cards.length == 1) { - player.$giveAuto(cards[0], target); - game.delayx(); - target.equip(cards[0]); - } else { - player.give(cards, target); - } - player.gainPlayerCard(target, cards.length == 2 ? "e" : "h", true); - }, - }; - }, - prompt: function () { - return "请选择【睦阵】的牌和目标"; - }, - }, - }, - muzhen1: {}, - muzhen2: {}, - sheyi2: { charlotte: true }, - sheyi: { - audio: 2, - trigger: { global: "damageBegin4" }, - direct: true, - filter: function (event, player) { - return ( - !player.hasSkill("sheyi2") && - player != event.player && - event.player.hp < player.hp && - player.countCards("he") >= Math.max(1, player.hp) - ); - }, - content: function () { - "step 0"; - var num = Math.max(1, player.hp), - target = trigger.player; - player - .chooseCard( - "he", - get.prompt("sheyi", target), - "交给其至少" + - get.cnNumber(num) + - "张牌,防止即将受到的伤害(" + - trigger.num + - "点)", - [num, player.countCards("he")] - ) - .set( - "goon", - (function () { - if (get.attitude(player, target) < 0) return false; - if ( - trigger.num < target.hp && - get.damageEffect(target, trigger.source, player, trigger.nature) >= 0 - ) - return false; - if (trigger.num < 2 && target.hp > trigger.num) return 6 / Math.sqrt(num); - if (target == get.zhu(player)) return 9; - return 8 / Math.sqrt(num); - })() - ) - .set("ai", function (card) { - if (ui.selected.cards.length >= Math.max(1, _status.event.player.hp)) return 0; - if (typeof _status.event.goon == "number") - return _status.event.goon - get.value(card); - return 0; - }); - "step 1"; - if (result.bool) { - var target = trigger.player; - player.logSkill("sheyi", target); - player.addTempSkill("sheyi2", "roundStart"); - player.give(result.cards, target); - trigger.cancel(); - } - }, - }, - tianyin: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - var list = []; - player.getHistory("useCard", function (evt) { - list.add(get.type2(evt.card, false)); - }); - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - if (!list.includes(get.type2(ui.cardPile.childNodes[i], false))) return true; - } - return false; - }, - content: function () { - var list = [], - cards = []; - player.getHistory("useCard", function (evt) { - list.add(get.type2(evt.card, false)); - }); - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var type = get.type2(ui.cardPile.childNodes[i], false); - if (!list.includes(type)) { - list.push(type); - cards.push(ui.cardPile.childNodes[i]); - } - } - player.gain(cards, "gain2"); - }, - }, - //王甫赵累 - xunyi: { - audio: 2, - trigger: { - global: ["phaseBefore", "dieAfter"], - player: "enterGame", - }, - direct: true, - filter: function (event, player) { - if (event.name == "die") return event.player == player.storage.xunyi2; - return !player.storage.xunyi2 && (event.name != "phase" || game.phaseNumber == 0); - }, - content: function () { - "step 0"; - player.removeSkill("xunyi2"); - player.chooseTarget(lib.filter.notMe, get.prompt2("xunyi")).set("ai", function (target) { - var player = _status.event.player; - return Math.max( - 1 + get.attitude(player, target) * get.threaten(target), - Math.random() - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("xunyi", target); - player.storage.xunyi2 = target; - player.addSkill("xunyi2"); - } - }, - }, - xunyi2: { - audio: "xunyi", - trigger: { global: "damageSource" }, - forced: true, - charlotte: true, - filter: function (event, player) { - var list = [player, player.storage.xunyi2]; - return list.includes(event.source) && !list.includes(event.player); - }, - logTarget: function (event, player) { - return player.storage.xunyi2; - }, - content: function () { - (player == trigger.source ? player.storage.xunyi2 : player).draw(); - }, - group: "xunyi3", - mark: true, - intro: { content: "效果目标:$" }, - }, - xunyi3: { - audio: "xunyi", - trigger: { global: "damageEnd" }, - forced: true, - charlotte: true, - filter: function (event, player) { - var list = [player, player.storage.xunyi2]; - return ( - list.includes(event.player) && - !list.includes(event.source) && - (player == event.player ? player.storage.xunyi2 : player).countCards("he") > 0 - ); - }, - logTarget: function (event, player) { - return player.storage.xunyi2; - }, - content: function () { - (player == trigger.player ? player.storage.xunyi2 : player).chooseToDiscard("he", true); - }, - }, - //狗剩 - reduoji: { - audio: "duoji", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - filterCard: true, - position: "he", - filterTarget: lib.filter.notMe, - discard: false, - toStorage: true, - delay: false, - check: function (card) { - return 3 - get.value(card); - }, - content: function () { - "step 0"; - player.$give(cards[0], target, false); - target.markAuto("reduoji", cards); - game.log(player, "将", cards[0], "放在了", target, "的武将牌上"); - "step 1"; - game.delay(); - }, - group: ["reduoji_equip", "reduoji_gain"], - intro: { - content: "cards", - onunmark: "throw", - }, - ai: { - order: 1, - result: { target: -1 }, - }, - subSkill: { - equip: { - audio: "duoji", - trigger: { global: "equipAfter" }, - forced: true, - filter: function (event, player) { - if ( - player == event.player || - !event.player.getStorage("reduoji").length || - !event.player.getCards("e").includes(event.card) - ) - return false; - var evt = event.getParent(2); - return evt.name == "useCard" && evt.player == event.player; - }, - logTarget: "player", - content: function () { - "step 0"; - player.gain(trigger.card, trigger.player, "give", "bySelf"); - "step 1"; - var target = trigger.player, - storage = target.getStorage("reduoji"); - if (storage.length) { - var card = storage[0]; - target.$throw(card, 1000); - target.unmarkAuto("reduoji", [card]); - game.log(target, "移去了", card); - game.cardsDiscard(card); - target.draw(); - } - }, - }, - gain: { - audio: "duoji", - trigger: { global: "phaseEnd" }, - forced: true, - filter: function (event, player) { - return event.player.getStorage("reduoji").length > 0; - }, - logTarget: "player", - content: function () { - var target = trigger.player, - cards = target.storage.reduoji; - target.$give(cards, player); - player.gain(cards, "fromStorage"); - cards.length = 0; - target.unmarkSkill("reduoji"); - game.delay(); - }, - }, - }, - }, - //SP辛毗 - spyinju: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - 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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", player); - "step 1"; - if (!result.bool) target.addSkill("spyinju2"); - }, - ai: { - order: 1, - expose: 0.2, - result: { - target: -1.5, - player: function (player, target) { - if (!target.canUse("sha", player)) return 0; - if (target.countCards("h") == 0) return 0; - if (target.countCards("h") == 1) return -0.1; - if (player.countCards("h", "shan") == 0) return -1; - if (player.hp < 2) return -2; - return -0.5; - }, - }, - threaten: 1.1, - }, - }, - spyinju2: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - charlotte: true, - content: function () { - player.skip("phaseUse"); - player.skip("phaseDiscard"); - player.removeSkill("spyinju2"); - game.log(player, "跳过了出牌阶段"); - game.log(player, "跳过了弃牌阶段"); - }, - mark: true, - intro: { content: "衣襟被拽住了,下个准备阶段开始时跳过出牌阶段和弃牌阶段" }, - }, - spchijie: { - audio: 2, - trigger: { target: "useCardToTarget" }, - usable: 1, - filter: function (event, player) { - return event.player != player && event.targets.length == 1; - }, - check: function (event, player) { - return get.effect(player, event.card, event.player, player) < 0; - }, - content: function () { - "step 0"; - player.judge(function (card) { - if (get.number(card) > 6) return 2; - return 0; - }).judge2 = function (result) { - return result.bool ? true : false; - }; - "step 1"; - if (result.bool) { - trigger.targets.length = 0; - trigger.getParent().triggeredTargets2.length = 0; - trigger.cancel(); - } - }, - }, - //糜夫人 - spcunsi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return !player.isTurnedOver(); - }, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - player.turnOver(); - "step 1"; - var card = get.cardPile(function (card) { - return card.name == "sha"; - }); - if (card) target.gain(card, "gain2"); - "step 2"; - target.addSkill("spcunsi2"); - target.addMark("spcunsi2", 1, false); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - var card = { name: "sha", isCard: true }; - if ( - !target.hasSkillTag("nogain") && - game.hasPlayer(function (current) { - return ( - get.attitude(target, current) < 0 && - !current.hasShan() && - target.canUse(card, current) && - !current.hasSkillTag("filterDamage", null, { - player: target, - card: card, - jiu: true, - }) && - get.effect(current, card, target) > 0 - ); - }) - ) { - return 4; - } - return 0; - }, - }, - }, - }, - spcunsi2: { - charlotte: true, - trigger: { player: "useCard1" }, - firstDo: true, - forced: true, - popup: false, - onremove: true, - filter: function (event, player) { - return event.card.name == "sha"; - }, - content: function () { - trigger.baseDamage += player.countMark("spcunsi2"); - player.removeSkill("spcunsi2"); - }, - marktext: "嗣", - intro: { - content: "下一张【杀】的伤害+#", - }, - }, - spguixiu: { - trigger: { player: "damageEnd" }, - forced: true, - filter: function (event, player) { - if (typeof event.spguixiu == "boolean" && !event.spguixiu) return false; - return player.isTurnedOver(); - }, - content: function () { - player.turnOver(); - }, - group: ["spguixiu_draw", "spguixiu_count"], - subSkill: { - count: { - trigger: { player: "damageBegin2" }, - lastDo: true, - silent: true, - content: function () { - event.spguixiu = player.isTurnedOver(); - }, - }, - draw: { - trigger: { player: "turnOverAfter" }, - forced: true, - filter: function (event, player) { - return !player.isTurnedOver(); - }, - content: function () { - player.draw(); - }, - }, - }, - }, - //那个男人的舅舅 - heji: { - audio: 2, - trigger: { global: "useCardAfter" }, - direct: true, - locked: false, - filter: function (event, player) { - if (event.targets.length != 1 || event.targets[0] == player || event.targets[0].isDead()) - return false; - if ( - event.card.name != "juedou" && - (event.card.name != "sha" || get.color(event.card) != "red") - ) - return false; - if (_status.connectMode && player.countCards("h") > 0) return true; - return player.hasSha() || player.hasUsableCard("juedou"); - }, - content: function () { - player - .chooseToUse(function (card, player, event) { - var name = get.name(card); - if (name != "sha" && name != "juedou") return false; - return lib.filter.cardEnabled.apply(this, arguments); - }, "合击:是否对" + - get.translation(trigger.targets[0]) + - "使用一张【杀】或【决斗】?") - .set("logSkill", "heji") - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", trigger.targets[0]) - .set("addCount", false); - }, - group: "heji_gain", - subSkill: { - gain: { - trigger: { player: "useCard" }, - forced: true, - popup: false, - filter: function (event, player) { - return event.card.isCard && event.getParent(2).name == "heji"; - }, - content: function () { - var card = get.cardPile2(function (card) { - return get.color(card, false) == "red"; - }); - if (card) player.gain(card, "gain2"); - }, - }, - }, - mod: { - aiOrder: function (player, card, num) { - if (get.name(card, player) == "sha" && get.color(card, player) == "red") - return ( - num + - 0.6 * - (_status.event.name == "chooseToUse" && - player.hasHistory("useCard", function (evt) { - return evt.card.name == "sha" && evt.cards.length == 1; - }) - ? 1 - : -1) - ); - }, - }, - }, - //始计篇·智 - refubi: { - audio: "fubi", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - direct: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("refubi"), lib.filter.notMe).set("ai", function (target) { - return 1 + get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("refubi", target); - target.addMark("refubi", 1); - } - }, - intro: { - content: function (info, player) { - var str = "已获得“辅弼”标记"; - if (player.storage.refubi_effect0) { - str += ";本回合使用【杀】的次数上限+"; - str += player.storage.refubi_effect0; - } - if (player.storage.refubi_effect1) { - str += ";本回合的手牌上限+"; - str += player.storage.refubi_effect1 * 3; - } - return str; - }, - }, - marktext: "弼", - group: "refubi_buff", - subSkill: { - buff: { - trigger: { global: "phaseZhunbeiBegin" }, - direct: true, - filter: function (event, player) { - return event.player != player && event.player.hasMark("refubi"); - }, - content: function () { - "step 0"; - var str = get.translation(trigger.player); - player - .chooseControl("cancel2") - .set("choiceList", [ - "令" + str + "本回合使用【杀】的次数上限+1", - "令" + str + "本回合的手牌上限+3", - ]) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getTrigger().player; - if (get.attitude(player, target) <= 0) return "cancel2"; - if ( - !target.hasJudge("lebu") && - target.countCards("h", function (card) { - return ( - get.name(card, target) == "sha" && target.hasValueTarget(card) - ); - }) > target.getCardUsable("sha") - ) - return 0; - return 1; - }); - "step 1"; - if (result.control != "cancel2") { - var target = trigger.player; - player.logSkill("refubi", target); - var str = "refubi_effect" + result.index; - target.addTempSkill(str); - target.addMark(str, 1, false); - game.log( - target, - ["本回合使用【杀】的次数上限+1", "本回合的手牌上限+3"][result.index] - ); - } - }, - }, - effect0: { - onremove: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("refubi_effect0"); - }, - }, - }, - effect1: { - onremove: true, - mod: { - maxHandcard: function (player, num) { - return num + 3 * player.countMark("refubi_effect1"); - }, - }, - }, - }, - }, - rezuici: { - audio: "zuici", - enable: "chooseToUse", - filter: function (event, player) { - if (event.type == "phase" || (event.type == "dying" && player == event.dying)) - return player.isDamaged() && player.countCards("e") > 0; - return false; - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog( - "###罪辞###选择废除一个有牌的装备栏,然后回复2点体力,并可移动“辅弼”标记。" - ); - }, - chooseControl: function (event, player) { - var list = []; - for (var i = 1; i < 6; i++) { - if (player.getEquips(i).length > 0) list.push("equip" + i); - } - list.push("cancel2"); - return list; - }, - check: function (event, player) { - if (player.hp > 1 && player.getDamagedHp() < 2) return "cancel2"; - var cards = player.getCards("e").sort(function (a, b) { - return get.value(a) - get.value(b); - }); - var sub = get.subtype(cards[0], false); - if (player.hp < 1) return sub; - var val = get.value(cards[0]); - if (val < 0) return sub; - return val < 4 ? sub : "cancel2"; - }, - backup: function (result) { - var next = get.copy(lib.skill.rezuicix); - next.position = result.control; - return next; - }, - }, - ai: { - order: 2.7, - result: { - player: 1, - }, - save: true, - skillTagFilter: function (player, tag, arg) { - return player == arg; - }, - }, - }, - rezuicix: { - audio: "zuici", - content: function () { - "step 0"; - player.disableEquip(lib.skill.rezuici_backup.position); - player.recover(2); - "step 1"; - var b1 = false, - b2 = false; - for (var i of game.players) { - if (i.hasMark("refubi")) b1 = true; - else if (i != player) b2 = true; - if (b1 && b2) break; - } - if (b1 && b2) { - player - .chooseTarget("是否转移“辅弼”标记?", function (card, player, target) { - return target != player && !target.hasMark("refubi"); - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - return Math.min(att, att - _status.event.preatt); - }) - .set( - "preatt", - get.attitude( - player, - game.findPlayer(function (current) { - return current.hasMark("refubi"); - }) - ) - ); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "group"); - game.countPlayer(function (current) { - var num = current.countMark("refubi"); - if (num) current.removeMark("refubi", 1, false); - }); - target.addMark("refubi", 1); - } - }, - ai: { - result: { - player: 1, - }, - }, - }, - reshengxi: { - audio: "shengxi", - audioname: ["feiyi"], - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - preHidden: true, - filter: function (event, player) { - return !player.getHistory("sourceDamage").length; - }, - content: function () { - player.draw(2); - }, - }, - fyjianyu: { - initSkill: function (skill) { - if (!lib.skill[skill]) { - lib.skill[skill] = { - marktext: "喻", - intro: { - markcount: () => 1, - content: "指定另一名有“喻”的角色为目标时,其摸一张牌", - }, - }; - lib.translate[skill] = "谏喻"; - lib.translate[skill + "_bg"] = "喻"; - } - }, - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return ( - game.countPlayer(function (current) { - return !current.hasMark("fyjianyu_" + player.playerid); - }) > 1 - ); - }, - round: 1, - filterTarget: function (card, player, target) { - return !target.hasMark("fyjianyu_" + player.playerid); - }, - selectTarget: 2, - content: function () { - var skill = "fyjianyu_" + player.playerid; - game.broadcastAll(lib.skill.fyjianyu.initSkill, skill); - player.addTempSkill("fyjianyu_draw", { player: "phaseBegin" }); - target.addMark(skill, 1); - }, - ai: { - order: 0.1, - result: { - target: function (player, target) { - if (!ui.selected.targets.length) return target == player ? 1 : 0; - if (get.attitude(player, target) < 0) - return ( - -1.6 * - (1 + - target.countCards("h", function (card) { - return ( - target.hasValueTarget(card) && - get.effect(player, card, target, target) > 0 - ); - }) * - Math.sqrt(target.countCards("h"))) - ); - return ( - 0.3 * - (1 + - target.countCards("h", function (card) { - return ( - target.hasValueTarget(card) && - get.effect(player, card, target, target) > 0 - ); - }) * - Math.sqrt(target.countCards("h"))) - ); - }, - }, - }, - subSkill: { - draw: { - charlotte: true, - trigger: { global: "useCardToPlayer" }, - filter: function (event, player) { - return ( - event.player != event.target && - event.player.hasMark("fyjianyu_" + player.playerid) && - event.target.hasMark("fyjianyu_" + player.playerid) && - event.target.isIn() - ); - }, - forced: true, - logTarget: "target", - content: function () { - trigger.target.draw(); - }, - onremove: function (player) { - game.countPlayer(function (current) { - var num = current.countMark("fyjianyu_" + player.playerid); - if (num) current.removeMark("fyjianyu_" + player.playerid); - }); - }, - }, - }, - }, - spwanwei: { - audio: 2, - enable: "chooseToUse", - filter: function (event, player) { - if (player.hasSkill("spwanwei2") || player.hp < 1) return false; - if (event.type == "dying") return event.dying != player; - if (event.type != "phase") return false; - return game.hasPlayer(function (current) { - return current != player && current.isDamaged(); - }); - }, - filterTarget: function (card, player, target) { - if (_status.event.type == "dying") return target == _status.event.dying; - return player != target && target.isDamaged(); - }, - selectTarget: function () { - if (_status.event.type == "dying") return -1; - return 1; - }, - content: function () { - player.addTempSkill("spwanwei2", "roundStart"); - var num = player.hp; - target.recover(Math.max(num + 1, 1 - target.hp)); - player.loseHp(num); - }, - ai: { - save: true, - skillTagFilter: function (player, tag, target) { - return player != target; - }, - expose: 0.5, - order: 6, - result: { - target: function (player, target) { - if (_status.event.type != "dying") return 0; - if (get.attitude(player, target) < 4) return 0; - if (player.countCards("he") < 2 && target != get.zhu(player)) return 0; - return 1; - }, - }, - }, - }, - spwanwei2: {}, - spyuejian: { - mod: { - maxHandcardBase: function (player) { - return player.maxHp; - }, - }, - audio: 2, - enable: "chooseToUse", - filter: function (event, player) { - return event.type == "dying" && player == event.dying && player.countCards("he") > 1; - }, - selectCard: 2, - filterCard: true, - position: "he", - check: function (card) { - return 1 / Math.max(0.1, get.value(card)); - }, - content: function () { - player.recover(); - }, - ai: { - save: true, - skillTagFilter: function (player, tag, target) { - return player == target; - }, - order: 1.4, - result: { - player: 1, - }, - }, - }, - spwuku: { - audio: 2, - trigger: { global: "useCard" }, - forced: true, - preHidden: true, - filter: function (event, player) { - if (get.type(event.card) != "equip") return false; - var gz = get.mode() == "guozhan"; - if (gz && event.player.isFriendOf(player)) return false; - return player.countMark("spwuku") < (gz ? 2 : 3); - }, - content: function () { - player.addMark("spwuku", 1); - }, - marktext: "库", - intro: { - content: "mark", - }, - ai: { - combo: "spsanchen", - threaten: 3.6, - }, - }, - spsanchen: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return player.countMark("spwuku") > 2; - }, - content: function () { - player.awakenSkill("spsanchen"); - player.gainMaxHp(); - player.recover(); - player.addSkills("spmiewu"); - }, - ai: { - combo: "wuku", - }, - derivation: "spmiewu", - }, - spmiewu: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - filter: function (event, player) { - if ( - !player.countMark("spwuku") || - !player.countCards("hse") || - player.hasSkill("spmiewu2") - ) - return false; - for (var i of lib.inpile) { - var type = get.type2(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.type2(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"]); - }, - 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: true, - audio: "spmiewu", - popname: true, - check: function (card) { - return 8 - get.value(card); - }, - position: "hse", - viewAs: { name: links[0][2], nature: links[0][3] }, - precontent: function () { - player.addTempSkill("spmiewu2"); - player.removeMark("spwuku", 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.type2(name); - return ( - (type == "basic" || type == "trick") && - player.countMark("spwuku") > 0 && - player.countCards("she") > 0 && - !player.hasSkill("spmiewu2") - ); - }, - ai: { - combo: "spwuku", - fireAttack: true, - respondSha: true, - respondShan: true, - skillTagFilter: function (player) { - if ( - !player.countMark("spwuku") || - !player.countCards("hse") || - player.hasSkill("spmiewu2") - ) - return false; - }, - order: 1, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - }, - spmiewu2: { - trigger: { player: ["useCardAfter", "respondAfter"] }, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player) { - return event.skill == "spmiewu_backup"; - }, - content: function () { - player.draw(); - }, - }, - spmiewu_backup: { audio: "spmiewu" }, - qinzheng: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - forced: true, - filter: function (event, player) { - var num = player.getAllHistory("useCard").length + player.getAllHistory("respond").length; - return num % 3 == 0 || num % 5 == 0 || num % 8 == 0; - }, - content: function () { - var num = player.getAllHistory("useCard").length + player.getAllHistory("respond").length; - var cards = []; - if (num % 3 == 0) { - var card = get.cardPile2(function (card) { - return card.name == "sha" || card.name == "shan"; - }); - if (card) cards.push(card); - } - if (num % 5 == 0) { - var card = get.cardPile2(function (card) { - return ["tao", "jiu", "zong", "xionghuangjiu"].includes(card.name); - }); - if (card) cards.push(card); - } - if (num % 8 == 0) { - var card = get.cardPile2(function (card) { - return [ - "juedou", - "wuzhong", - "zengbin", - "sadouchengbing", - "dongzhuxianji", - "tongzhougongji", - ].includes(card.name); - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - }, - group: "qinzheng_count", - intro: { - content: function (num) { - var str = "
  • 总次数:"; - str += num; - str += "
  • 杀/闪:"; - str += num % 3; - str += "/3
  • 桃/酒:"; - str += num % 5; - str += "/5
  • 决斗/无中生有:"; - str += num % 8; - str += "/8"; - return str; - }, - }, - }, - qinzheng_count: { - trigger: { player: ["useCard1", "respond"] }, - silent: true, - firstDo: true, - noHidden: true, - content: function () { - player.storage.qinzheng = - player.getAllHistory("useCard").length + player.getAllHistory("respond").length; - player.markSkill("qinzheng"); - }, - }, - spqiai: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.countCards("he", function (card) { - return get.type(card) != "basic"; - }) > 0 - ); - }, - filterCard: function (card) { - return get.type(card) != "basic"; - }, - position: "he", - filterTarget: lib.filter.notMe, - delay: false, - discard: false, - lose: false, - check: function (card) { - var player = _status.event.player; - if (get.position(card) == "e" && card.name == "jinhe") return 10; - if (player.isHealthy()) return 7 - get.value(card); - return 9 - get.value(card); - }, - content: function () { - "step 0"; - player.give(cards, target, true); - "step 1"; - if (!target.isIn()) { - event.finish(); - return; - } - if (player.isHealthy()) event._result = { index: 1 }; - else { - var str = get.translation(player); - target - .chooseControl() - .set("choiceList", ["令" + str + "回复1点体力", "令" + str + "摸两张牌"]); - } - "step 2"; - if (result.index == 0) player.recover(); - else player.draw(2); - }, - ai: { - order: 8, - result: { - player: 1, - target: function (player, target) { - if (ui.selected.cards.length) { - var card = ui.selected.cards[0]; - var val = get.value(card, target); - if (val < 0) return -1; - if (target.hasSkillTag("nogain")) return 0; - var useval = target.getUseValue(card); - if (val < 1 || useval <= 0) return 0.1; - return Math.sqrt(useval); - } - return 0; - }, - }, - }, - }, - spshanxi: { - audio: 2, - init: function (player) { - game.addGlobalSkill("spshanxi_bj"); - }, - onremove: function (player) { - if (!game.hasPlayer((current) => current.hasSkill("spshanxi"), true)) - game.removeGlobalSkill("spshanxi_bj"); - }, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && !current.hasMark("spshanxi"); - }); - }, - content: function () { - "step 0"; - var eff = 0; - var target = game.findPlayer(function (current) { - return current != player && current.hasMark("spshanxi"); - }); - if (target) eff = -get.attitude(player, target) / Math.sqrt(Math.max(1, target.hp)); - player - .chooseTarget( - get.prompt("spshanxi"), - "令一名其他角色获得“檄”", - function (card, player, target) { - return target != player && !target.hasMark("spshanxi"); - } - ) - .set("ai", function (target) { - return ( - -get.attitude(_status.event.player, target) / - Math.sqrt(Math.max(1, target.hp)) - - _status.event.eff - ); - }) - .set("eff", eff); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("spshanxi", target); - game.countPlayer(function (current) { - if (current == target) current.addMark("spshanxi", 1); - else { - var num = current.countMark("spshanxi"); - if (num > 0) current.removeMark("spshanxi", num); - } - }); - } - }, - marktext: "檄", - intro: { - name2: "檄", - content: "已被设下索命檄文", - }, - group: "spshanxi_suoming", - ai: { threaten: 3.3 }, - }, - spshanxi_suoming: { - audio: "spshanxi", - trigger: { global: "recoverAfter" }, - forced: true, - filter: function (event, player) { - return event.player.hasMark("spshanxi") && event.player.hp > 0; - }, - logTarget: "player", - content: function () { - "step 0"; - if (trigger.player.countCards("he") < 2) event._result = { bool: false }; - else - trigger.player - .chooseCard("he", 2, "交给" + get.translation(player) + "两张牌,或失去1点体力") - .set("ai", function (card) { - return 9 - get.value(card); - }); - "step 1"; - if (!result.bool) trigger.player.loseHp(); - else trigger.player.give(result.cards, player); - }, - }, - spshanxi_bj: { - trigger: { player: "dieAfter" }, - filter: function (event, player) { - for (let i of game.players) { - if (i.hasSkill("spshanxi_suoming")) return false; - } - return true; - }, - silent: true, - forceDie: true, - charlotte: true, - content: function () { - game.removeGlobalSkill("spshanxi_bj"); - }, - ai: { - effect: { - target: function (card, player, target) { - let suoming = game.findPlayer((current) => current.hasSkill("spshanxi_suoming")); - if ( - suoming && - _status.event && - target === _status.event.dying && - target.hasMark("spshanxi") - ) { - if (target.countCards("he") < 2) return "zerotarget"; - return [1, get.attitude(target, suoming) > 0 ? 0 : -1.2]; - } - }, - }, - }, - }, - shameng: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - var hs = player.getCards("h"); - if (hs.length < 2) return false; - var red = 0, - black = 0; - for (var i of hs) { - if (get.color(i, player) == "red") red++; - else black++; - if (red > 1 || black > 1) return true; - } - return false; - }, - complexCard: true, - selectCard: 2, - filterCard: function (card, player) { - if (ui.selected.cards.length) - return get.color(card, player) == get.color(ui.selected.cards[0], player); - var color = get.color(card, player); - return ( - player.countCards("h", function (cardx) { - return cardx != card && color == get.color(cardx, player); - }) > 0 - ); - }, - filterTarget: lib.filter.notMe, - check: function (card) { - return 7 - get.value(card); - }, - position: "h", - content: function () { - target.draw(2); - player.draw(3); - }, - ai: { - order: 6, - result: { target: 2 }, - }, - }, - fubi: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - direct: true, - skillAnimation: true, - animationColor: "wood", - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("fubi"), lib.filter.notMe).set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("fubi", target); - target.addSkill("fubi2"); - target.storage.fubi2.push(player); - } - }, - }, - fubi2: { - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - mod: { - maxHandcard: function (player, num) { - var list = player.getStorage("fubi2"); - for (var i of list) { - if (i.isIn()) num += 3; - } - return num; - }, - }, - mark: true, - intro: { content: "若$存活,则手牌上限+3" }, - }, - zuici: { - trigger: { player: "dying" }, - direct: true, - filter: function (event, player) { - return player.countCards("e") > 0; - }, - content: function () { - "step 0"; - var list = []; - var cards = player.getCards("e"); - for (var i of cards) list.push(get.subtype(i)); - list.push("cancel2"); - player.chooseControl(list).set("prompt", get.prompt2("zuici")); - "step 1"; - if (result.control != "cancel2") { - player.disableEquip(result.control); - } else event.finish(); - "step 2"; - if (player.hp < 1) player.recover(1 - player.hp); - }, - }, - jianzhan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return lib.skill.jianzhan.filterTarget(null, player, current); - }); - }, - filterTarget: function (card, player, target) { - if (target == player) return false; - if (ui.selected.targets.length) { - var targetx = ui.selected.targets[0]; - return ( - targetx != target && - targetx.countCards("h") > target.countCards("h") && - targetx.inRange(target) - ); - } - var num = target.countCards("h"); - return game.hasPlayer(function (current) { - return ( - current != target && - current != player && - current.countCards("h") < num && - target.inRange(current) - ); - }); - }, - selectTarget: 2, - complexTarget: true, - targetprompt: ["出杀", "被出杀"], - multitarget: true, - content: function () { - "step 0"; - if (!targets[0].canUse("sha", targets[1])) event._result = { index: 1 }; - else - targets[0] - .chooseControl() - .set("choiceList", [ - "视为对" + get.translation(targets[1]) + "使用一张【杀】", - "令" + get.translation(player) + "摸一张牌", - ]) - .set("ai", function () { - var evt = _status.event.getParent(); - var eff = get.effect( - evt.targets[1], - { name: "sha", isCard: true }, - evt.targets[0], - evt.targets[0] - ); - if (eff > 0) return 0; - if (eff < 0 || get.attitude(evt.targets[0], evt.player) > 1) return 1; - return 0; - }); - "step 1"; - if (result.index == 0) - targets[0].useCard({ name: "sha", isCard: true }, targets[1], false); - else player.draw(); - }, - ai: { - result: { - target: function (player, target) { - if (ui.selected.targets.length) { - var from = ui.selected.targets[0]; - return get.effect(target, { name: "sha" }, from, target); - } - var effs = [0, 0]; - game.countPlayer(function (current) { - if (current != target && target.canUse("sha", current)) { - var eff = get.effect(current, { name: "sha" }, target, target); - if (eff > effs[0]) effs[0] = eff; - if (eff < effs[1]) effs[1] = eff; - } - }); - return effs[get.attitude(player, target) > 0 ? 0 : 1]; - }, - }, - order: 8.5, - expose: 0.2, - }, - }, - duoji: { - audio: 2, - enable: "phaseUse", - limited: true, - filter: function (event, player) { - return ( - player.countCards("h") > 1 && - game.hasPlayer(function (current) { - return current != player && current.countGainableCards(player, "e") > 0; - }) - ); - }, - filterCard: true, - selectCard: 2, - filterTarget: function (card, player, target) { - return target != player && target.countGainableCards(player, "e") > 0; - }, - check: function (card) { - return 8 - get.value(card); - }, - position: "h", - skillAnimation: true, - animationColor: "metal", - content: function () { - player.awakenSkill("duoji"); - var cards = target.getGainableCards(player, "e"); - player.gain(cards, target, "give", "bySelf"); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - var num = 0, - es = target.getCards("e"), - val = 0; - for (var i of es) { - num += get.value(i, target); - } - for (var i of ui.selected.cards) { - val += get.value(i, player); - } - if (Math.abs(num) > val) return -num; - return 0; - }, - }, - }, - }, - }, - characterIntro: { - yuanhuan: - "袁涣,字曜卿,陈郡扶乐(今河南省周口市太康县)人。东汉末年官员,出身陈郡袁氏,为东汉司徒袁滂之子。袁涣早年曾任郡功曹,后被公府征辟,相继被举为高第、秀才。汉末战乱时,袁涣流寓江淮一带,初为袁术所用,后投吕布。建安三年(198年),曹操率兵剿灭了吕布,袁涣又转投曹操,拜沛南部都尉,后又任谏议大夫、郎中令等职,在任上尽心尽责,以敢谏直言称名。袁涣恕思而后行,外表温柔而内心能断,处危难则勇气极大。汉末三国时期,唯有程昱、曹仁、袁涣三人被评价为勇冠贲育。", - qiaogong: - "桥公,亦作“乔公”,名字不详,是中国汉末三国时期的长者,江东二乔的父亲,三国时期庐江郡皖县(今安徽潜山)人,中国长篇古典名著《三国演义》中称之为“乔国老”。", - liuzhang: - "刘璋(生卒年不详),字季玉,江夏竟陵(今湖北省天门市)人。东汉末年宗室、军阀,益州牧刘焉幼子,在父亲刘焉死后继任益州牧。刘璋为人懦弱多疑。汉中张鲁骄纵,不听刘璋号令,于是刘璋杀张鲁母弟,双方成为仇敌,刘璋派庞羲攻击张鲁,战败。后益州内乱,平定后,又有曹操将前来袭击的消息。在内外交逼之下,刘璋听信手下张松、法正之言,迎接刘备入益州,想借刘备之力,抵抗曹操。不料此举乃引狼入室,刘备反手攻击刘璋,又有法正为内应,进至成都。成都吏民都想抵抗刘备,但刘璋为百姓计而开城出降,群下莫不流涕。刘备占据成都后,刘璋以振威将军的身份被迁往荆州居住,关羽失荆州后,刘璋归属东吴,被孙权任命为益州牧,不久后去世,卒年不详。", - zhangzhongjing: - "张仲景(约公元150~154年—约公元215~219年),名机,字仲景,南阳涅阳县(今河南省邓州市穰东镇张寨村)人。东汉末年著名医学家,被后人尊称为“医圣”。张仲景广泛收集医方,写出了传世巨著《伤寒杂病论》。它确立的“辨证论治”原则,是中医临床的基本原则,是中医的灵魂所在。在方剂学方面,《伤寒杂病论》也做出了巨大贡献,创造了很多剂型,记载了大量有效的方剂。其所确立的六经辨证的治疗原则,受到历代医学家的推崇。这是中国第一部从理论到实践、确立辨证论治法则的医学专著,是中国医学史上影响最大的著作之一,是后学者研习中医必备的经典著作,广泛受到医学生和临床大夫的重视。", - xiangchong: - "向宠(?~240年),左将军向朗之侄,蜀汉重要将领。具有谦和公允的性格品行,对军事通晓畅达,被汉昭烈帝刘备称赞。刘备时,历任牙门将(类似于主将帐下的偏将),诸葛亮北伐时,以向宠为中领军,封都亭侯。诸葛亮北行汉中前,特意在《出师表》中向刘禅推荐向宠。延熙三年(公元240年),南征汉嘉(今四川省雅安市)蛮夷时,遇害,尸体被其部下夺回,送回成都安葬。", - caizhenji: - "蔡贞姬,生卒年不详,汉末大儒蔡邕之女。其父蔡邕精于天文数理,妙解音律,是曹操的挚友和老师。生在书香门第的家庭的蔡贞姬,自小耳濡目染,精通书法与音律。后来,其父为避宦竖迫害,便随父亲来泰山依付羊衜一族,在羊衜的元配孔氏死后,便在父亲的做主下与之成亲。夫妻二人婚后生有两子一女:羊承、羊徽瑜、羊祜。在与羊衜成亲之前,羊衜和孔氏生有一子羊发。后来羊发、羊承同时生病,蔡贞姬知道不能两全,就专心照顾羊发,最后羊发痊愈,羊承病死。", - zhouchu: - "周处(236—297年),字子隐,吴郡阳羡(今江苏宜兴)人。西晋大臣、将领,东吴鄱阳太守周鲂之子。少时纵情肆欲,为祸乡里。后来改过自新,拜访名人陆机和陆云,浪子回头,发奋读书,留下“周处除三害”的传说,拜东观左丞,迁无难都督,功业胜过父亲。吴国灭亡后,出仕西晋,拜新平太守,转广汉太守,治境有方。入为散骑常侍,迁御史中丞,刚正不阿。得罪梁孝王司马肜。元康七年,出任建威将军,前往关中,讨伐氐羌齐万年叛乱,遇害于沙场。追赠平西将军,谥号为孝。", - wangfuzhaolei: - "王甫(?—222年),字国山,广汉郪(今四川三台县)人,三国时期蜀汉重臣。刘璋时,为益州书佐,之后归降刘备,先后担任绵竹令、荆州议曹从事,并在夷陵之战中阵亡。其子王祐,官至尚书右选郎。赵累,蜀汉大将关羽部下都督。后来吴将吕蒙袭取荆州,赵累被吴将潘璋等在临沮擒获。", - wangling: - "王淩(172年~251年6月15日),字彦云,太原郡祁县(今山西省祁县)人,三国时期曹魏将领,东汉司徒王允之侄。王淩出身太原王氏祁县房。举孝廉出身,授发干县令,迁中山太守。颇有政绩,迁司空(曹操)掾属。魏文帝曹丕即位,拜散骑常侍、兖州刺史。参加洞口之战,跟从张辽击败吴将吕范,加号建武将军,封宜城亭侯。太和二年(228年),王淩参与石亭之战,跟从曹休征伐东吴,力挽狂澜,历任扬豫二州刺史,治境有方。齐王曹芳继位,拜征东将军,联合孙礼击败吴将全琮,进封南乡侯,授车骑将军、仪同三司,正始九年(248年),代高柔为司空。嘉平元年(249年),代蒋济为太尉。嘉平三年(251年),不满太傅司马懿专擅朝政,联合兖州刺史令狐愚谋立楚王曹彪为帝,事泄自尽,时年八十岁,夷灭三族。", - wujing: "吴景,本吴郡吴县(今江苏苏州)人,后迁居吴郡钱塘(今浙江杭州),孙坚妻子吴夫人(武烈皇后)之弟,孙策和孙权的舅舅,东汉末年将领。吴景因追随孙坚征伐有功,被任命为骑都尉。袁术上表举荐吴景兼任丹杨太守,讨伐前任太守周昕,占据丹杨。后遭扬州刺史刘繇逼迫,再度依附袁术,袁术任用他为督军中郎将,与孙贲共同进击樊能等人。又在秣陵攻打笮融、薛礼。袁术与刘备争夺徐州时,任吴景为广陵太守。建安二年(197年),吴景放弃广陵东归孙策,孙策任他为丹杨太守。朝廷使者吴景为扬武将军,郡守之职照旧。建安八年(203年),吴景死于任上。", - feiyi: "费祎(?~253年2月),字文伟,江夏鄳县(今河南省罗山县)人,三国时期蜀汉名臣,与诸葛亮、蒋琬、董允并称为蜀汉四相。深得诸葛亮器重,屡次出使东吴,孙权、诸葛恪、羊茞等人以辞锋刁难,而费祎据理以答,辞义兼备,始终不为所屈。孙权非常惊异于他的才能,加以礼遇。北伐时为中护军,又转为司马。当时魏延与杨仪不和,经常争论,费祎常为二人谏喻,两相匡护,以尽其用。诸葛亮死后,初为后军师,再为尚书令,官至大将军,封成乡侯。费祎主政时,与姜维北伐的主张相左,执行休养生息的政策,为蜀汉的发展尽心竭力。费祎性格谦恭真诚,颇为廉洁,家无余财。后为魏降将郭循(一作郭脩)行刺身死。葬于今广元市昭化古城城西。", - luotong: - "骆统(193年-228年),字公绪。会稽郡乌伤县(今浙江义乌)人。东汉末年至三国时期吴国将领、学者,陈国相骆俊之子。骆统二十岁时已任乌程国相,任内有政绩,使得国中民户过万。又迁为功曹,行骑都尉。曾劝孙权尊贤纳士,省役息民。后出任为建忠中郎将。将军凌统逝世后,统领其部曲。因战功迁偏将军,封新阳亭侯,任濡须督。黄武七年(228年),骆统去世,年仅三十六岁。有集十卷,今已佚。", - }, - characterTitle: {}, - card: { - binglinchengxiax: { - enable: true, - type: "trick", - derivation: "sp_xunchen", - fullskin: true, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - if (!player.isIn() || !target.isIn()) { - event.finish(); - return; - } - event.showCards = get.cards(4); - game.cardsGotoOrdering(event.showCards); - player.showCards(event.showCards); - "step 1"; - if (player.isIn() && target.isIn() && event.showCards.length) { - for (var i of event.showCards) { - if (i.name == "sha" && player.canUse(i, target, false)) { - player.useCard(i, target, false); - event.showCards.remove(i); - event.redo(); - break; - } - } - } - "step 2"; - if (event.showCards.length) { - while (event.showCards.length) - ui.cardPile.insertBefore(event.showCards.pop().fix(), ui.cardPile.firstChild); - game.updateRoundNumber(); - } - }, - ai: { - basic: { - useful: 4, - value: 3, - }, - order: 4, - result: { - target: function (player, target, card, isLink) { - if (get.effect(target, { name: "sha" }, player, target) == 0) return 0; - return -2.5; - }, - }, - tag: { - respond: 1, - respondShan: 1, - damage: 1, - }, - }, - }, - tiaojiyanmei: { - enable: true, - type: "trick", - derivation: "feiyi", - fullskin: true, - filterTarget: function (card, player, target) { - var targets = []; - if (ui.selected.targets.length) targets.addArray(ui.selected.targets); - var evt = _status.event.getParent("useCard"); - if (evt && evt.card == card) targets.addArray(evt.targets); - if (targets.length) { - var hs = target.countCards("h"); - for (var i of targets) { - if (i.countCards("h") != hs) return true; - } - return false; - } - return true; - }, - recastable: true, - selectTarget: 2, - postAi: () => true, - contentBefore: function () { - if (!targets.length) return; - var map = {}; - event.getParent().customArgs.default.tiaojiyanmei_map = map; - var average = 0; - for (var target of targets) { - var hs = target.countCards("h"); - map[target.playerid] = hs; - average += hs; - } - map.average = average / targets.length; - }, - content: function () { - var map = event.tiaojiyanmei_map, - num1 = map.average, - num2 = map[target.playerid]; - if (typeof num2 != "number") num2 = target.countCards("h"); - if (num2 > num1) target.chooseToDiscard("he", true); - else if (num2 < num1) target.draw(); - }, - contentAfter: function () { - "step 0"; - if (!player.isIn() || targets.length < 2) { - event.finish(); - return; - } - var num = targets[0].countCards("h"); - for (var i = 1; i < targets.length; i++) { - if (targets[i].countCards("h") != num) { - event.finish(); - return; - } - } - var cards = []; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name == "lose" && evt.type == "discard" && evt.getParent(3).card == card) - cards.addArray(evt.cards); - }); - cards = cards.filterInD("d"); - if (cards.length) { - event.tiaojiyanmei_cards = cards; - player - .chooseTarget("是否令一名角色获得" + get.translation(cards) + "?") - .set("ai", function (target) { - var evt = _status.event.getParent(); - return ( - get.attitude(evt.player, target) * - get.value(evt.tiaojiyanmei_cards, target) * - (target.hasSkillTag("nogain") ? 0.1 : 1) - ); - }); - } else event.finish(); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "thunder"); - target.gain(event.tiaojiyanmei_cards, "gain2"); - } - }, - ai: { - order: 6.1, - basic: { - useful: 4, - value: 3, - }, - result: { - target: function (player, target, card, isLink) { - var targets = []; - if (ui.selected.targets.length) targets.addArray(ui.selected.targets); - var evt = _status.event.getParent("useCard"); - if (evt && evt.card == card) targets.addArray(evt.targets); - if ( - evt && - evt.card == card && - evt.customArgs && - evt.customArgs.tiaojiyanmei_map - ) { - var map = evt.customArgs.tiaojiyanmei_map, - num1 = map.average, - num2 = map[target.playerid]; - if (typeof num2 != "number") num2 = target.countCards("h"); - if (num2 > num1) { - if ( - target.countCards("e", function (card) { - return get.value(card) <= 0; - }) - ) - return 1; - return -1; - } - if (num2 < num1) return 1; - return 0; - } - var cards = [card]; - if (card.cards) cards.addArray(card.cards); - var fh = function (card) { - return !cards.includes(card); - }; - if (!targets.length) { - if (get.attitude(player, target) < 0) { - if ( - target.countCards("e", function (card) { - return get.value(card, target) <= 0; - }) - ) - return 1; - if ( - game.hasPlayer(function (current) { - return ( - current.countCards("h", fh) == target.countCards("h", fh) - 2 - ); - }) - ) - return -2; - if ( - game.hasPlayer(function (current) { - return current.countCards("h", fh) < target.countCards("h", fh); - }) - ) - return -1; - } - if ( - target.countCards("e", function (card) { - return get.value(card, target) <= 0; - }) && - game.hasPlayer(function (current) { - return current.countCards("h", fh) < target.countCards("h", fh); - }) - ) - return 1; - return 0; - } - var average = 0; - for (var i of targets) average += i.countCards("h", fh); - if (!targets.includes(target)) { - var th = target.countCards("h", fh); - average += th; - average /= targets.length + 1; - if (th == average) return 0; - if (th < average) return th == average - 1 ? 2 : 1; - if (th > average) { - if ( - target.countCards("e", function (card) { - return get.value(card) <= 0; - }) - ) - return 1; - return -0.5; - } - return 0; - } - average /= targets.length; - if (th < average) return 1; - if (th > average) { - if ( - target.countCards("e", function (card) { - return get.value(card) <= 0; - }) - ) - return 1; - return -1; - } - return 0; - }, - }, - }, - }, - }, - characterFilter: {}, - dynamicTranslate: {}, - perfectPair: { - wujing: ["sunce", "sunben", "wuguotai"], - }, - characterReplace: { - wangcan: ["wangcan", "sp_wangcan", "tw_wangcan"], - sunshao: ["sunshao", "sp_sunshao"], - xunchen: ["xunchen", "re_xunchen", "sp_xunchen", "tw_xunchen", "clan_xunchen"], - xinpi: ["xinpi", "sp_xinpi"], - duyu: ["duyu", "dc_duyu", "sp_duyu", "pk_sp_duyu"], - zhangwen: ["zhangwen", "sp_zhangwen"], - ol_bianfuren: ["ol_bianfuren", "sp_bianfuren", "tw_bianfuren"], - wangshuang: ["wangshuang", "sp_wangshuang"], - huaman: ["huaman", "sp_huaman"], - gaolan: ["gaolan", "dc_gaolan", "sp_gaolan"], - cuiyan: ["cuiyan", "sp_cuiyan"], - wujing: ["wujing", "tw_wujing"], - zhouchu: ["jin_zhouchu", "zhouchu", "tw_zhouchu"], - liuzhang: ["liuzhang", "tw_liuzhang"], - chenzhen: ["sp_chenzhen", "tw_chenzhen"], - feiyi: ["ol_feiyi", "feiyi", "tw_feiyi"], - wangling: ["dc_wangling", "wangling", "tw_wangling", "clan_wangling"], - qiaogong: ["qiaogong", "tw_qiaogong"], - sp_chendong: ["sp_chendong", "tw_chendong", "chendong"], - sp_jiangqing: ["sp_jiangqing", "tw_jiangqing", "jiangqing"], - kongrong: ["dc_kongrong", "sp_kongrong", "jsrg_kongrong", "kongrong"], - dc_mifuren: ["dc_mifuren", "sp_mifuren"], - }, - translate: { - liuba_prefix: "手杀", - sp_zhujun_prefix: "手杀", - sp_huangfusong_prefix: "手杀", - sp_zhangchangpu_prefix: "手杀", - sp_cuiyan_prefix: "手杀", - sp_huaman_prefix: "手杀", - sp_gaolan_prefix: "手杀", - sunyi_prefix: "手杀", - sp_wangshuang_prefix: "手杀", - sp_zongyu_prefix: "手杀", - db_wenyang_prefix: "手杀", - sp_yanghu_prefix: "手杀", - sp_zhangwen_prefix: "手杀", - sp_xujing_prefix: "手杀", - sp_huaxin_prefix: "手杀", - zhouchu_prefix: "手杀", - sp_mifuren_prefix: "手杀", - sp_xinpi_prefix: "手杀", - sp_bianfuren_prefix: "手杀", - sp_duyu_prefix: "手杀", - luotong_prefix: "手杀", - sp_wangcan_prefix: "手杀", - sp_sunshao_prefix: "手杀", - sp_xunchen_prefix: "手杀", - sp_kongrong_prefix: "手杀", - - sp_wangcan: "手杀王粲", - spqiai: "七哀", - spqiai_info: - "出牌阶段限一次,你可以将一张非基本牌交给一名其他角色。然后其选择一项:①你回复1点体力。②你摸两张牌。", - spshanxi: "善檄", - spshanxi_suoming: "善檄", - spshanxi_info: - "出牌阶段开始时,你可令一名其他角色获得“檄”标记并清除场上已有的其他“檄”标记(若有)。有“檄”标记的角色回复体力时,若其体力值大于0,则其需选择一项:①交给你两张牌。②失去1点体力。", - sp_chenzhen: "陈震", - shameng: "歃盟", - shameng_info: - "出牌阶段限一次,你可弃置两张颜色相同的手牌并选择一名其他角色。其摸两张牌,然后你摸三张牌。", - sp_sunshao: "手杀孙邵", - fubi: "辅弼", - fubi2: "辅弼", - fubi_info: "游戏开始时,你可选择一名其他角色。该角色的手牌上限于你死亡前+3。", - zuici: "罪辞", - zuici_info: "当你进入濒死状态时,你可废除你的一个不为空的装备栏,然后将体力值回复至1点。", - sp_xunchen: "手杀荀谌", - jianzhan: "谏战", - jianzhan_info: - "出牌阶段限一次,你可选择一名其他角色A和其攻击范围内的另一名手牌数小于其的角色B。A选择一项:①视为对B使用一张【杀】。②令你摸一张牌。", - duoji: "夺冀", - duoji_info: - "限定技,出牌阶段,你可弃置两张手牌并选择一名装备区有牌的其他角色。你获得其装备区里的所有牌。", - binglinchengxiax: "兵临城下", - binglinchengxiax_info: - "出牌阶段,对一名其他角色使用。你亮出牌堆顶的四张牌,依次对其使用其中所有的【杀】,然后将剩余的牌置于牌堆顶。", - mjweipo: "危迫", - mjweipo_effect: "危迫", - mjweipo_remove: "危迫", - mjweipo_info: - "出牌阶段限一次。你可以选择一个智囊或【兵临城下】,令一名没有〖危迫〗效果的角色获得如下一次性效果直到你下回合开始:其可于出牌阶段弃置一张【杀】,并获得一张你选择的牌。", - mjchenshi: "陈势", - mjchenshi_player: "陈势", - mjchenshi_target: "陈势", - mjchenshi_info: - "当有角色使用【兵临城下】指定第一个目标后,其可交给你一张牌,并将牌堆的顶三张牌中所有不为【杀】的牌置入弃牌堆;当有角色成为【兵临城下】的目标后,其可交给你一张牌,然后将牌堆顶三张牌中所有的【杀】置入弃牌堆。", - mjmouzhi: "谋识", - mjmouzhi_info: - "锁定技,当你受到伤害时,若伤害渠道对应的牌和你上次受到的伤害花色相同,则你防止此伤害。", - luotong: "手杀骆统", - qinzheng: "勤政", - qinzheng_info: - "锁定技,当你使用或打出牌时,若你本局游戏内使用或打出过的牌数和:为3的倍数,你从牌堆中获得一张【杀】或【闪】;为5的倍数,你从牌堆中获得一张【桃】或【酒】;为8的倍数,你从牌堆中获得一张【决斗】或【无中生有】(可获得对应的衍生替换牌)。", - sp_duyu: "手杀杜预", - spwuku: "武库", - spwuku_info: "锁定技,当有角色使用装备牌时,若你的“武库”数小于3,则你获得一个“武库”。", - spwuku_info_guozhan: - "锁定技,当有其他势力的角色使用装备牌时,若你的“武库”数小于2,则你获得一个“武库”。", - spsanchen: "三陈", - spsanchen_info: - "觉醒技,结束阶段,若你的“武库”数大于2,则你加1点体力上限并回复1点体力,然后获得〖灭吴〗。", - spmiewu: "灭吴", - spmiewu2: "灭吴", - spmiewu_backup: "灭吴", - spmiewu_info: - "每回合限一次。你可弃置一枚“武库”并将一张牌当做任意基本牌或锦囊牌使用,然后摸一张牌。", - sp_bianfuren: "手杀卞夫人", - spwanwei: "挽危", - spwanwei_info: - "每轮累计限一次。①出牌阶段,你可选择一名其他角色。②当有其他角色处于濒死状态时。你可令该角色回复X+1点体力(至少回复至1),然后你失去X点体力。(X为你的体力值)", - spyuejian: "约俭", - spyuejian_info: - "锁定技,你的手牌上限基数等于你的体力上限。当你处于濒死状态时,你可弃置两张牌,然后回复1点体力。", - feiyi: "手杀费祎", - feiyi_prefix: "手杀", - reshengxi: "生息", - reshengxi_info: "结束阶段,若你于本回合内未造成过伤害,则你可摸两张牌。", - fyjianyu: "谏喻", - fyjianyu_info: - "每轮限一次。出牌阶段,你可选择两名角色,令这些角色获得“喻”直到你的下回合开始。当一名有“喻”的角色A使用牌指定另一名有“喻”的角色B为目标时,你令B摸一张牌。", - mjshengxi: "生息", - mjshengxi_info: - "准备阶段,你可以获得一张【调剂盐梅】;结束阶段,若你本回合使用过牌且未造成伤害,则你可以获得一张智囊或摸一张牌。", - mjkuanji: "宽济", - mjkuanji_info: - "每回合限一次。当你因弃置而失去牌后,你可令一名其他角色获得其中的一张牌,然后你摸一张牌。", - tiaojiyanmei: "调剂盐梅", - tiaojiyanmei_info: - "出牌阶段,对两名手牌数不均相同的其他角色使用。若目标角色于此牌使用准备工作结束时的手牌数大于此时所有目标的平均手牌数,其弃置一张牌。若小于则其摸一张牌。此牌使用结束后,若所有目标角色的手牌数均相等,则你可令一名角色获得所有因执行此牌效果而弃置的牌。", - refubi: "辅弼", - refubi_info: - "游戏开始时,你可令一名其他角色获得“辅弼”标记。有“辅弼”标记的角色的准备阶段开始时,你可选择一项:①令其本回合使用【杀】的次数上限+1。②令其本回合的手牌上限+3。", - rezuici: "罪辞", - rezuici_backup: "罪辞", - rezuici_info: - "出牌阶段,或当你处于濒死状态时,你可以废除一个有牌的装备栏并回复2点体力,然后可以移动“辅弼”标记。", - mjdingyi: "定仪", - mjdingyi_info: - "游戏开始时,你选择一个效果(相同效果不可叠加)并令全场角色获得之:①摸牌阶段额定摸牌数+1。②手牌上限+2。③攻击范围+1。④脱离濒死状态时回复1点体力。", - mjzuici: "罪辞", - mjzuici_info: - "当你受到伤害后,你可令伤害来源失去〖定仪〗效果,然后令其从牌堆中获得一张由你选择的智囊。", - mjfubi: "辅弼", - mjfubi_info: - "每轮限一次。出牌阶段,你可选择一项:①更换一名角色的〖定仪〗效果。②弃置一张牌并令一名角色的〖定仪〗效果翻倍直到你的下回合开始。", - wujing: "吴景", - heji: "合击", - heji_info: - "当有角色使用的【决斗】或红色【杀】结算完成后,若此牌对应的目标数为1,则你可以对相同的目标使用一张【杀】或【决斗】(无距离和次数限制)。若你以此法使用的牌不为转化牌,则你从牌堆中随机获得一张红色牌。", - liubing: "流兵", - liubing_info: - "锁定技。①你于出牌阶段使用的第一张非虚拟【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。", - sp_mifuren: "手杀糜夫人", - spcunsi: "存嗣", - spcunsi2: "存嗣", - spcunsi_info: - "出牌阶段限一次,你可将武将牌翻至背面并选择一名其他角色。其从牌堆或弃牌堆中获得一张【杀】,且下一张杀的伤害值基数+1。", - spguixiu: "闺秀", - spguixiu_info: - "锁定技,当你受到伤害后,若你的武将牌背面朝上,则你将武将牌翻至正面。当你的武将牌从背面翻至正面时,你摸一张牌。", - qingyu: "清玉", - qingyu_info: - "使命技。①当你受到伤害时,你弃置两张牌,然后防止此伤害。②使命:准备阶段,若你的体力值等于体力上限且你没有手牌,则你获得〖悬存〗。③失败:当你进入濒死状态时,你减1点体力上限。", - xuancun: "悬存", - xuancun_info: - "其他角色的回合结束时,若你的手牌数小于体力值,则你可以令其摸X张牌(X为你的体力值与手牌数之差且至多为2)。", - xinlirang: "礼让", - xinlirang_info: - "①其他角色的摸牌阶段开始时,若你没有“谦”标记,则你可以获得一枚“谦”标记。若如此做,其额定摸牌数+2,且本回合的弃牌阶段开始时,你可以获得其弃置的至多两张牌。②摸牌阶段开始时,若你有“谦”标记,则你跳过此摸牌阶段并移除“谦”标记。", - xinmingshi: "名仕", - xinmingshi_info: - "锁定技,当你受到伤害后,若你有“谦”标记,则伤害来源弃置一张牌。若此牌为:黑色:你获得之。红色,你回复1点体力。", - sp_xinpi: "手杀辛毗", - spyinju: "引裾", - spyinju2: "引裾", - spyinju_info: - "出牌阶段限一次,你可令一名其他角色选择一项:①对你使用一张【杀】(无距离限制)。②其下个回合的准备阶段开始时,跳过出牌阶段和弃牌阶段。", - spchijie: "持节", - spchijie_info: - "每回合限一次。当你成为其他角色使用牌的唯一目标时,你可判定。若结果大于6,则你取消此牌的所有目标。", - reduoji: "夺冀", - reduoji_info: - "出牌阶段限一次,你可将一张牌置于其他角色的武将牌上,称为“冀”。当有装备牌因使用而进入一名角色的装备区后,若该角色有“冀”且其为使用者,则你获得此装备牌,其移去一个“冀”并摸一张牌。一名其他角色的回合结束后,若其有“冀”,则你获得其的所有“冀”。", - wangling: "手杀王淩", - wangling_prefix: "手杀", - mouli: "谋立", - mouli_info: - "出牌阶段限一次,你可以将一张手牌交给一名其他角色,其获得如下效果直到你的下回合开始:其可以将黑色牌当做【杀】,红色牌当做【闪】使用。其第一次触发“使用【杀】/【闪】结算完成后”的时机时,你摸三张牌。", - zifu: "自缚", - zifu_info: "锁定技,当有角色死亡时,若其因你获得的“谋立”效果未过期,则你减2点体力上限。", - xingqi: "星启", - xingqi_info: - "①当你使用牌时,若此牌不为延时锦囊牌且你没有同名的“备”,则你获得一枚与此牌名称相同的“备”。②结束阶段,你可移去一枚“备”,然后从牌堆中获得一张与此“备”名称相同的牌。", - xinzifu: "自缚", - xinzifu_info: - "锁定技。出牌阶段结束时,若你本阶段内未使用牌,则你移去所有“备”且本回合的手牌上限-1。", - mibei: "秘备", - mibei_info: - "使命技。①使命:当你使用的牌结算完成后,若你的“备”中包含的基本牌,锦囊牌,装备牌数量均大于1,则你从牌堆中获得这三种类型的牌各一张并获得技能“谋立”。②失败:结束阶段开始时,若你没有“备”,且你于本回合的准备阶段开始时也没有“备”,则你减1点体力上限。", - xinmouli: "谋立", - xinmouli_info: - "出牌阶段限一次,你可以指定一名其他角色。其移去你的一个“备”,然后从牌堆中获得一张与此“备”名称相同的牌。", - wangfuzhaolei: "王甫赵累", - xunyi: "殉义", - xunyi2: "殉义", - xunyi3: "殉义", - xunyi_info: - "游戏开始时,或当上一个拥有“殉义”效果的角色死亡后,你可以选择一名角色获得如下效果:当其/你对二者之外的角色造成伤害后,你/其摸一张牌;当其/你受到二者之外的角色造成的伤害后,你/其弃置一张牌。", - zhouchu: "手杀周处", - xianghai: "乡害", - xianghai_info: "锁定技,其他角色的手牌上限-1。你手牌区的装备牌均视为【酒】。", - chuhai: "除害", - chuhai_info: - "出牌阶段限一次,你可以摸一张牌,然后和一名其他角色拼点。若你赢,则你观看其手牌,并从牌堆/弃牌堆中获得其手牌中包含的类型的牌各一张,且当你于此阶段内对其造成伤害后,你将牌堆/弃牌堆中的一张装备牌置于你的一个空置装备栏内。", - rechuhai: "除害", - rechuhai_info: - "使命技。①出牌阶段限一次,你可以摸一张牌,然后和一名其他角色拼点。若你赢,则你观看其手牌,并从牌堆/弃牌堆中获得其手牌中包含的类型的牌各一张,且当你于此阶段内对其造成伤害后,你将牌堆/弃牌堆中的一张装备牌置于你的一个空置装备栏内。②当你因发动〖除害①〗而展示拼点牌时,你令此牌的点数+X(X=(4-你装备区的牌数))。③使命:当有装备牌进入你的装备区后,若你的装备区内有至少三张牌,则你将体力值回复至上限,失去〖乡害〗并获得〖彰名〗。④失败:当你因发动〖除害①〗发起的拼点没赢时,若你的最终点数不大于6,则你触发使命失败分支。", - zhangming: "彰名", - zhangming_info: - "锁定技。①你使用的♣牌不能被其他角色响应。②每回合限一次,当你对其他角色造成伤害后,你随机弃置其一张手牌,然后你从牌堆或弃牌堆中获得与其展示牌类型不同类型的牌各一张(若其没有手牌,则你改为从牌堆或弃牌堆中获得所有类型牌各一张),且以此法得到的牌不计入本回合的手牌上限。", - sp_kongrong: "手杀孔融", - spmingshi: "名士", - spmingshi_info: "锁定技,当你受到1点伤害后,伤害来源弃置一张牌。", - splirang: "礼让", - splirang_info: - "出牌阶段限一次,你可以弃置所有手牌,然后将其中的至多X张牌交给一名其他角色(X为你的体力值),之后摸一张牌。", - caizhenji: "蔡贞姬", - sheyi: "舍裔", - sheyi_info: - "每轮限一次。当有体力值小于你的其他角色受到伤害时,你可以交给其至少X张牌并防止此伤害(X为你的体力值)。", - tianyin: "天音", - tianyin_info: "锁定技,结束阶段开始时,你从牌堆中获得每种本回合未使用过的类型的牌各一张。", - xiangchong: "向宠", - guying: "固营", - guying_info: - "锁定技。每回合限一次,当你于回合外因使用/打出/弃置而失去牌后,若牌数为1,则你获得一枚“固”并令当前回合角色选择一项:①随机交给你一张牌。②令你获得本次失去的牌,若为装备牌,则你使用之。准备阶段开始时,你移去所有“固”并弃置等量的牌。", - muzhen: "睦阵", - muzhen_backup: "睦阵", - muzhen_info: - "出牌阶段各限一次。①你可以将两张牌交给一名装备区内有牌的其他角色,然后获得其装备区内的一张牌。②你可以将装备区内的一张牌置于其他角色的装备区内,然后获得其一张手牌。", - sp_huaxin: "手杀华歆", - hxrenshi: "仁仕", - hxrenshi_info: "出牌阶段每名角色限一次。你可以将一张手牌交给一名其他角色。", - debao: "德保", - debao_info: - "锁定技,当其他角色获得你的牌后,若你的“仁”数小于你的体力上限,则你将牌堆顶的一张牌置于你的武将牌上,称为“仁”。准备阶段,你获得所有“仁”。", - buqi: "不弃", - buqi_info: - "锁定技,当有角色进入濒死状态时,若你的“仁”数大于1,则你移去两张“仁”并令其回复1点体力。一名角色死亡后,你将所有“仁”置入弃牌堆。", - yuanqing: "渊清", - yuanqing_info: - "锁定技,出牌阶段结束时,你随机将弃牌堆中你本阶段使用过的牌类型的各一张牌置于仁库中。", - shuchen: "疏陈", - shuchen_info: - "锁定技,当有角色进入濒死状态时,若仁库中的牌数大于三,则你获得仁库中的所有牌,然后其回复1点体力。", - sp_xujing: "手杀许靖", - boming: "博名", - boming_info: - "出牌阶段限两次,你可以将一张牌交给一名其他角色。结束阶段,若你本回合以此法失去了两张以上的牌,则你摸一张牌。", - ejian: "恶荐", - ejian_info: - "锁定技,每名角色限一次。当有其他角色因〖博名〗而得到了你的牌后,若其拥有与此牌类型相同的其他牌,则你令其选择一项:①受到1点伤害。②展示所有手牌,并弃置所有与此牌类别相同的牌。", - zhangzhongjing: "张机", - jishi: "济世", - jishi_info: - "锁定技。①当你使用的牌结算完成后,若你未因此牌造成过伤害,则你将此牌对应的所有实体牌置于仁库中。②当有牌不因溢出而离开仁库时,你摸一张牌。", - liaoyi: "疗疫", - liaoyi_info: - "其他角色的回合开始时,若其:①手牌数小于体力值且仁库内牌数大于等于X,则你可令其从仁库中获得X张牌;②手牌数大于体力值,则你可以令其将X张牌置于仁库中(X为其手牌数与体力值之差且至多为4)。", - xinliaoyi: "疗疫", - xinliaoyi_info: - "其他角色的回合开始时,你可选择一项:①令其从仁库中获得一张牌。②若其手牌数大于体力值,则令其将X张手牌置入仁库(X为其手牌数与体力值之差)。", - binglun: "病论", - binglun_info: - "出牌阶段限一次,你可以将仁库中的一张牌置于弃牌堆并选择一名角色。该角色选择一项:①摸一张牌。②于其下回合结束时回复1点体力。", - sp_zhangwen: "手杀张温", - gebo: "戈帛", - gebo_info: "锁定技,当有角色回复体力后,你将牌堆顶的一张牌置入仁库。", - spsongshu: "颂蜀", - spsongshu_info: - "其他角色的摸牌阶段开始时,若其体力值大于你且仁库内有牌,则你可以令其放弃摸牌。其改为获得X张仁(X为你的体力值且至多为5),且本回合内不能使用牌指定其他角色为目标。", - liuzhang: "刘璋", - xiusheng: "休生", - xiusheng_info: - "锁定技。准备阶段,你将所有“生”置入弃牌堆,然后摸X张牌,并将等量的牌置于武将牌上,称为“生”(X为你因〖引狼〗而选择的势力的存活角色数)。", - yinlang: "引狼", - yinlang_info: - "①每轮限一次。回合开始时,你选择场上的一个势力。②一名角色的出牌阶段开始时,若其势力与你选择的势力相同,则其选择一项:1.获得你的一张“生”,然后其本回合使用牌时不能指定你以外的角色为目标。2.你获得一张“生”。", - huaibi: "怀璧", - huaibi_info: "主公技,锁定技。你的手牌上限+X(X为你因〖引狼〗而选择的势力的存活角色数)。", - jutu: "据土", - jutu_info: - "锁定技,准备阶段,你获得所有你武将牌上的“生”,然后摸X+1张牌,然后将X张牌置于你的武将牌上,称为“生”(X为你因〖邀虎〗选择势力的角色数量)。", - yaohu: "邀虎", - yaohu_info: - "每轮限一次,你的回合开始时,你须选择场上一个势力。该势力其他角色的出牌阶段开始时,其获得你的一张“生”,然后其须选择一项:①对你指定的另一名的其他角色使用一张【杀】(无距离和次数限制);②交给你两张牌。", - rehuaibi: "怀璧", - rehuaibi_info: "主公技,锁定技,你的手牌上限+X(X为你因〖邀虎〗选择势力的角色数量)。", - qiaogong: "桥公", - yizhu: "遗珠", - yizhu_info: - "①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中(X为角色数,选择牌的牌名对其他角色可见)。②其他角色使用“遗珠”牌指定唯一目标时,你可以取消此目标,然后你清除对应的“遗珠”标记。", - luanchou: "鸾俦", - luanchou_info: - "出牌阶段限一次,你可令两名角色获得“姻”标记并清除原有标记。拥有“姻”标记的角色视为拥有技能〖共患〗。", - gonghuan: "共患", - gonghuan_info: - "锁定技。每回合限一次,一名其他角色受到伤害时,若其拥有“姻”标记且其体力值小于你,则你将伤害转移给自己。此伤害结算结束后,你与其移去“姻”标记。", - sp_yanghu: "手杀羊祜", - mingfa: "明伐", - mingfa_info: - "①结束阶段,你可展示一张牌并记录为“明伐”。②出牌阶段开始时,若“明伐”牌在你的手牌区或装备区,则你可以使用“明伐”牌与一名其他角色拼点。若你赢:你获得对方一张牌并从牌堆中获得一张点数等于“明伐”牌牌面点数-1的牌。若你没赢:你本回合不能使用牌指定其他角色为目标。③你的拼点牌亮出后,你令此牌的点数+2。", - rongbei: "戎备", - rongbei_info: - "限定技。出牌阶段,你可选择一名有空装备栏的角色。系统为该角色的每个空装备栏选择一张装备牌,然后该角色使用之。", - db_wenyang: "手杀文鸯", - dbquedi: "却敌", - dbquedi_info: - "每回合限一次。当你使用【杀】或【决斗】指定唯一目标后,你可选择:①获得目标角色的一张手牌。②弃置一张基本牌,并令此牌的伤害值基数+1。③背水:减1点体力上限,然后依次执行上述所有选项。", - dbzhuifeng: "椎锋", - dbzhuifeng_info: - "魏势力技。每回合限两次,你可以失去1点体力并视为使用一张【决斗】(你死亡后仍然结算)。当你因此【决斗】而受到伤害时,你防止此伤害并令此技能失效直到出牌阶段结束。", - dbchongjian: "冲坚", - dbchongjian_backup: "冲坚", - dbchongjian_info: - "吴势力技。你可以将一张装备牌当做一种【杀】(无距离限制且无视防具)或【酒】使用。当你以此法使用【杀】造成伤害后,你获得目标角色装备区内的X张牌(X为伤害值)。", - dbchoujue: "仇决", - dbchoujue_info: - "锁定技。当你杀死其他角色后,你加1点体力上限并摸两张牌,然后本回合发动【却敌】的次数上限+1。", - sp_chendong: "手杀陈武董袭", - sp_chendong_prefix: "手杀", - spyilie: "毅烈", - spyilie_info: - "出牌阶段开始时,你可选择:①本阶段内使用【杀】的次数上限+1。②本回合内使用【杀】被【闪】抵消时,摸一张牌。③背水:失去1点体力,然后依次执行上述所有选项。", - spfenming: "奋命", - spfenming_info: - "出牌阶段限一次,你可以选择一名体力值不大于你的角色。若其:未横置,其横置;已横置,你获得其一张牌。", - yuanhuan: "袁涣", - qingjue: "请决", - qingjue_info: - "每轮限一次。当有其他角色A使用牌指定另一名体力值小于A且不处于濒死状态的其他角色B为目标时,你可以摸一张牌,然后与A拼点。若你赢,你取消此目标。若你没赢,你将此牌的目标改为自己。", - fengjie: "奉节", - fengjie2: "奉节", - fengjie_info: - "锁定技,准备阶段开始时,你选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸四张)或弃置至与其体力值相等。", - sp_zongyu: "手杀宗预", - zhibian: "直辩", - zhibian_info: - "准备阶段,你可以和一名其他角色拼点。若你赢,你可选择:①将其装备区/判定区内的一张牌移动到你的对应区域。②回复1点体力。③背水:跳过下个摸牌阶段,然后依次执行上述所有选项;若你没赢,你失去1点体力。", - yuyan: "御严", - yuyan_info: - "锁定技。当你成为非转换的【杀】的目标时,若使用者的体力值大于你且此【杀】有点数,则你令使用者选择一项:①交给你一张点数大于此【杀】的牌。②取消此目标。", - sp_wangshuang: "手杀王双", - yiyong: "异勇", - yiyong_info: - "当你受到其他角色造成的渠道为【杀】的伤害后,若你的装备区内有武器牌,则你可以获得此【杀】对应的所有实体牌,然后将这些牌当做【杀】对伤害来源使用(无距离限制)。若其装备区内没有武器牌,则此伤害+1。", - shanxie: "擅械", - shanxie_info: - "①出牌阶段限一次,你可从牌堆中获得一张武器牌。若牌堆中没有武器牌,则你改为随机获得一名角色装备区内的一张武器牌。②当其他角色使用【闪】响应你使用的【杀】时,若此【闪】没有点数或点数不大于你攻击范围的二倍,则你令此【闪】无效。", - shanxie_info_old: - "①出牌阶段限一次,你可选择一项:⒈从牌堆中获得一张武器牌。⒉获得一名其他角色装备区内的一张武器牌并使用,然后其将一张手牌当做【杀】对你使用。②当其他角色使用【闪】响应你使用的【杀】时,若此【闪】没有点数或点数不大于你攻击范围的二倍,则你令此【闪】无效。", - sunyi: "手杀孙翊", - zaoli: "躁厉", - zaoli_info: - "锁定技。①你不能于回合内使用或打出你手牌中不为本回合得到的牌。②当你使用或打出手牌时,你获得一个“厉”(至多4个)。③回合开始时,若你有“厉”,则你移去所有“厉”并弃置任意张牌,然后摸X+Y张牌。若X大于2,你失去1点体力(X为你移去的标记数,Y为你弃置的牌数)。", - sp_gaolan: "手杀高览", - spjungong: "峻攻", - spjungong_info: - "出牌阶段,你可失去X+1点体力或弃置X+1张牌,视为对一名其他角色使用【杀】(不计入次数和距离限制,X为你本回合内发动过〖峻攻〗的次数)。若你因此【杀】造成了伤害,则你令此技能失效直到回合结束。", - spdengli: "等力", - spdengli_info: - "当你使用【杀】指定目标后,或成为【杀】的目标后,若使用者和目标的体力值相等,则你摸一张牌。", - sp_huaman: "手杀花鬘", - spxiangzhen: "象阵", - spxiangzhen_info: - "锁定技。①【南蛮入侵】对你无效。②当有角色使用的【南蛮入侵】结算结束后,若有角色因此牌受到过伤害,则你和使用者各摸一张牌。", - spfangzong: "芳踪", - spfangzong_info: - "锁定技。①你不能于回合内使用具有伤害标签的牌指定攻击范围内的角色为目标。②攻击范围内包含你的角色不能使用具有伤害标签的牌指定你为目标。③结束阶段,你将手牌摸至X张(X为场上存活人数且至多为8)。", - spxizhan: "嬉战", - spxizhan_info: - "其他角色的回合开始时,你须选择一项:①失去1点体力。②弃置一张牌并令〖芳踪〗于本回合失效,然后若此牌的花色为:♠,其视为使用一张【酒】;♥,你视为使用一张【无中生有】;♣,你视为对其使用【铁索连环】;♦:你视为对其使用火【杀】(无距离限制)。", - sp_cuiyan: "手杀崔琰", - spyajun: "雅俊", - spyajun_info: - "①摸牌阶段,你令额定摸牌数+1。②出牌阶段开始时,你可以用一张本回合得到的牌与其他角色拼点。若你赢,则你可将其中一张拼点牌置于牌堆顶。若你没赢,你本回合的手牌上限-1。", - spzundi: "尊嫡", - spzundi_info: - "出牌阶段限一次,你可以弃置一张手牌并选择一名角色,然后你进行判定。若结果为:黑色,其摸三张牌;红色,其可以移动场上的一张牌。", - sp_zhangchangpu: "手杀张昌蒲", - spdifei: "抵诽", - spdifei_info: - "锁定技。每回合限一次,当你受到伤害后,你摸一张牌或弃置一张手牌,然后展示所有手牌。若此伤害的渠道为没有花色的牌或你的手牌中没有与此牌花色相同的牌,则你回复1点体力。", - spyanjiao: "严教", - spyanjiao_info: - "出牌阶段限一次。你可以将手牌中一种花色的所有牌交给一名其他角色,对其造成1点伤害。然后你于自己的下回合开始时摸等量的牌。", - sp_jiangwan: "蒋琬", - spzhenting: "镇庭", - spzhenting_info: - "每回合限一次。当你攻击范围内的角色成为【杀】或延时锦囊的目标时,若你不是此牌的使用者且不是此牌的目标,则你可以将此目标改为自己。然后你选择一项:①弃置使用者的一张手牌。②摸一张牌。", - spjincui: "尽瘁", - spjincui_info: - "限定技。出牌阶段,你可以和一名其他角色交换位置,然后失去X点体力(X为你的体力值)。", - sp_jiangqing: "蒋钦", - spjianyi: "俭衣", - spjianyi_info: - "锁定技。其他角色的回合结束时,若弃牌堆中有于本回合内因弃置而进入弃牌堆的防具牌,则你获得其中一张。", - spshangyi: "尚义", - spshangyi_info: - "出牌阶段限一次。你可以弃置一张牌并选择一名其他角色。其观看你的手牌,然后你观看其手牌并获得其中的一张。", - sp_lvfan: "手杀吕范", - sp_lvfan_prefix: "手杀", - spdiaodu: "调度", - spdiaodu_info: "准备阶段,你可令一名角色摸一张牌,然后移动其装备区内的一张牌。", - spdiancai: "典财", - spdiancai_info: - "其他角色的结束阶段开始时,你可以令至多X名角色各摸一张牌(X为你本回合失去的手牌数)。", - mbdiaodu: "调度", - mbdiaodu_info: "准备阶段,你可以移动一名角色装备区内的一张牌(不能移动给自己),然后其摸一张牌。", - mbdiancai: "典财", - mbdiancai_info: - "其他角色的出牌阶段阶段结束后,若你本阶段失去的牌数不小于你的体力值,则你可将手牌数补至体力上限。", - spyanji: "严纪", - spyanji_info: "出牌阶段开始时,你可以进行“整肃”。", - sp_huangfusong: "手杀皇甫嵩", - spzhengjun: "整军", - spzhengjun_info: - "①出牌阶段开始时,你可进行“整肃”。②当你因整肃而摸牌或回复体力后,你可令一名其他角色摸两张牌或回复1点体力。", - spshiji: "势击", - spshiji_info: - "当你对其他角色造成属性伤害时,若你的手牌数不为全场唯一最多,则你可以观看其手牌。你令其弃置其中的所有红色牌,然后摸等量的牌。", - sptaoluan: "讨乱", - sptaoluan_info: - "每回合限一次。一名角色的判定结果确定时,若结果的花色为♠,则你可以终止导致此判定发生的上级事件。然后选择一项:①获得判定牌对应的实体牌。②视为对判定角色使用一张火【杀】(无距离和次数限制)。", - sp_zhujun: "手杀朱儁", - yangjie: "佯解", - yangjie_info: - "出牌阶段限一次,你可以摸一张牌并和一名其他角色A拼点。当你以此法展示你的拼点牌时,你令此牌点数-X(X为你已损失的体力值)。若你没赢,则你可以令另一名其他角色B获得两张拼点牌,然后其视为对A使用一张火【杀】。", - zjjuxiang: "拒降", - zjjuxiang_info: - "限定技。一名其他角色脱离濒死状态时,你可以对其造成1点伤害,然后摸X张牌(X为其体力上限且至多为5)。", - xinyangjie: "佯解", - xinyangjie_info: - "出牌阶段限一次,你可以与一名其他角色A拼点。若你没赢,则你可以令另一名其他角色B视为对A使用一张火【杀】。", - xinjuxiang: "拒降", - xinjuxiang_info: "限定技,一名其他角色脱离濒死状态时,你可以对其造成1点伤害。", - houfeng: "厚俸", - houfeng_info: - "每轮限一次。一名其他角色的出牌阶段开始时,若其在你的攻击范围内,则你可以令其进行“整肃”。然后当其于本回合内因整肃而摸牌或回复体力后,你获得相同的整肃奖励。", - liuba: "手杀刘巴", - duanbi: "锻币", - duanbi_info: - "限定技。出牌阶段,若场上所有角色的手牌数之和大于角色数之和的二倍,则你可以令所有其他角色各弃置X张手牌(X为该角色手牌数的一半且向下取整且至多为3)。然后你可选择一名角色,令其随机获得三张以此法被弃置的牌。", - tongduo: "统度", - tongduo_info: "每回合限一次。当你成为其他角色使用牌的唯一目标后,你可令一名角色重铸一张牌。", - - mobile_shijiren: "始计篇·仁", - mobile_shijizhi: "始计篇·智", - mobile_shijixin: "始计篇·信", - mobile_shijiyong: "始计篇·勇", - mobile_shijiyan: "始计篇·严", - }, - }; -}); diff --git a/character/shiji/card.js b/character/shiji/card.js new file mode 100644 index 000000000..780dc8a30 --- /dev/null +++ b/character/shiji/card.js @@ -0,0 +1,231 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + binglinchengxiax: { + enable: true, + type: "trick", + derivation: "sp_xunchen", + fullskin: true, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + if (!player.isIn() || !target.isIn()) { + event.finish(); + return; + } + event.showCards = get.cards(4); + game.cardsGotoOrdering(event.showCards); + player.showCards(event.showCards); + "step 1"; + if (player.isIn() && target.isIn() && event.showCards.length) { + for (var i of event.showCards) { + if (i.name == "sha" && player.canUse(i, target, false)) { + player.useCard(i, target, false); + event.showCards.remove(i); + event.redo(); + break; + } + } + } + "step 2"; + if (event.showCards.length) { + while (event.showCards.length) ui.cardPile.insertBefore(event.showCards.pop().fix(), ui.cardPile.firstChild); + game.updateRoundNumber(); + } + }, + ai: { + basic: { + useful: 4, + value: 3, + }, + order: 4, + result: { + target: function (player, target, card, isLink) { + if (get.effect(target, { name: "sha" }, player, target) == 0) return 0; + return -2.5; + }, + }, + tag: { + respond: 1, + respondShan: 1, + damage: 1, + }, + }, + }, + tiaojiyanmei: { + enable: true, + type: "trick", + derivation: "feiyi", + fullskin: true, + filterTarget: function (card, player, target) { + var targets = []; + if (ui.selected.targets.length) targets.addArray(ui.selected.targets); + var evt = _status.event.getParent("useCard"); + if (evt && evt.card == card) targets.addArray(evt.targets); + if (targets.length) { + var hs = target.countCards("h"); + for (var i of targets) { + if (i.countCards("h") != hs) return true; + } + return false; + } + return true; + }, + recastable: true, + selectTarget: 2, + postAi: () => true, + contentBefore: function () { + if (!targets.length) return; + var map = {}; + event.getParent().customArgs.default.tiaojiyanmei_map = map; + var average = 0; + for (var target of targets) { + var hs = target.countCards("h"); + map[target.playerid] = hs; + average += hs; + } + map.average = average / targets.length; + }, + content: function () { + var map = event.tiaojiyanmei_map, + num1 = map.average, + num2 = map[target.playerid]; + if (typeof num2 != "number") num2 = target.countCards("h"); + if (num2 > num1) target.chooseToDiscard("he", true); + else if (num2 < num1) target.draw(); + }, + contentAfter: function () { + "step 0"; + if (!player.isIn() || targets.length < 2) { + event.finish(); + return; + } + var num = targets[0].countCards("h"); + for (var i = 1; i < targets.length; i++) { + if (targets[i].countCards("h") != num) { + event.finish(); + return; + } + } + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name == "lose" && evt.type == "discard" && evt.getParent(3).card == card) cards.addArray(evt.cards); + }); + cards = cards.filterInD("d"); + if (cards.length) { + event.tiaojiyanmei_cards = cards; + player.chooseTarget("是否令一名角色获得" + get.translation(cards) + "?").set("ai", function (target) { + var evt = _status.event.getParent(); + return get.attitude(evt.player, target) * get.value(evt.tiaojiyanmei_cards, target) * (target.hasSkillTag("nogain") ? 0.1 : 1); + }); + } else event.finish(); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); + target.gain(event.tiaojiyanmei_cards, "gain2"); + } + }, + ai: { + order: 6.1, + basic: { + useful: 4, + value: 3, + }, + result: { + target: function (player, target, card, isLink) { + var targets = []; + if (ui.selected.targets.length) targets.addArray(ui.selected.targets); + var evt = _status.event.getParent("useCard"); + if (evt && evt.card == card) targets.addArray(evt.targets); + if (evt && evt.card == card && evt.customArgs && evt.customArgs.tiaojiyanmei_map) { + var map = evt.customArgs.tiaojiyanmei_map, + num1 = map.average, + num2 = map[target.playerid]; + if (typeof num2 != "number") num2 = target.countCards("h"); + if (num2 > num1) { + if ( + target.countCards("e", function (card) { + return get.value(card) <= 0; + }) + ) + return 1; + return -1; + } + if (num2 < num1) return 1; + return 0; + } + var cards = [card]; + if (card.cards) cards.addArray(card.cards); + var fh = function (card) { + return !cards.includes(card); + }; + if (!targets.length) { + if (get.attitude(player, target) < 0) { + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) + ) + return 1; + if ( + game.hasPlayer(function (current) { + return current.countCards("h", fh) == target.countCards("h", fh) - 2; + }) + ) + return -2; + if ( + game.hasPlayer(function (current) { + return current.countCards("h", fh) < target.countCards("h", fh); + }) + ) + return -1; + } + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) && + game.hasPlayer(function (current) { + return current.countCards("h", fh) < target.countCards("h", fh); + }) + ) + return 1; + return 0; + } + var average = 0; + for (var i of targets) average += i.countCards("h", fh); + if (!targets.includes(target)) { + var th = target.countCards("h", fh); + average += th; + average /= targets.length + 1; + if (th == average) return 0; + if (th < average) return th == average - 1 ? 2 : 1; + if (th > average) { + if ( + target.countCards("e", function (card) { + return get.value(card) <= 0; + }) + ) + return 1; + return -0.5; + } + return 0; + } + average /= targets.length; + if (th < average) return 1; + if (th > average) { + if ( + target.countCards("e", function (card) { + return get.value(card) <= 0; + }) + ) + return 1; + return -1; + } + return 0; + }, + }, + }, + }, +}; +export default cards; diff --git a/character/shiji/character.js b/character/shiji/character.js new file mode 100644 index 000000000..f164abf0e --- /dev/null +++ b/character/shiji/character.js @@ -0,0 +1,44 @@ +const characters = { + liuba: ["male", "shu", 3, ["duanbi", "tongduo"]], + sp_zhujun: ["male", "qun", 4, ["xinyangjie", "xinjuxiang", "houfeng"]], + sp_huangfusong: ["male", "qun", 4, ["spzhengjun", "spshiji", "sptaoluan"]], + sp_lvfan: ["male", "wu", 3, ["mbdiaodu", "mbdiancai", "spyanji"]], + sp_jiangqing: ["male", "wu", 4, ["spjianyi", "spshangyi"]], + sp_jiangwan: ["male", "shu", 3, ["spzhenting", "spjincui"]], + sp_zhangchangpu: ["female", "wei", 3, ["spdifei", "spyanjiao"]], + sp_cuiyan: ["male", "wei", 3, ["spyajun", "spzundi"]], + sp_huaman: ["female", "shu", 4, ["spxiangzhen", "spfangzong", "spxizhan"]], + sp_gaolan: ["male", "qun", 4, ["spjungong", "spdengli"]], + sunyi: ["male", "wu", 4, ["zaoli"]], + sp_wangshuang: ["male", "wei", 4, ["yiyong", "shanxie"]], + sp_zongyu: ["male", "shu", 3, ["zhibian", "yuyan"]], + yuanhuan: ["male", "wei", 3, ["qingjue", "fengjie"]], + sp_chendong: ["male", "wu", 4, ["spyilie", "spfenming"]], + db_wenyang: ["male", "wei", 4, ["dbquedi", "dbzhuifeng", "dbchongjian", "dbchoujue"], ["doublegroup:wei:wu"]], + sp_yanghu: ["male", "qun", 3, ["mingfa", "rongbei"]], + qiaogong: ["male", "wu", 3, ["yizhu", "luanchou"]], + liuzhang: ["male", "qun", 3, ["jutu", "yaohu", "rehuaibi"], ["zhu"]], + sp_zhangwen: ["male", "wu", 3, ["gebo", "spsongshu"]], + zhangzhongjing: ["male", "qun", 3, ["jishi", "xinliaoyi", "binglun"]], + sp_xujing: ["male", "shu", 3, ["boming", "ejian"]], + sp_huaxin: ["male", "wei", 3, ["yuanqing", "shuchen"]], + xiangchong: ["male", "shu", 4, ["guying", "muzhen"]], + caizhenji: ["female", "wei", 3, ["sheyi", "tianyin"]], + sp_kongrong: ["male", "qun", 3, ["xinlirang", "xinmingshi"]], + zhouchu: ["male", "wu", 4, ["xianghai", "rechuhai"]], + wangfuzhaolei: ["male", "shu", 4, ["xunyi"]], + wangling: ["male", "wei", 4, ["xingqi", "xinzifu", "mibei"], ["clan:太原王氏"]], + wujing: ["male", "wu", 4, ["heji", "liubing"]], + sp_mifuren: ["female", "shu", 3, ["xinguixiu", "qingyu"]], + sp_xinpi: ["male", "wei", 3, ["spyinju", "spchijie"]], + feiyi: ["male", "shu", 3, ["mjshengxi", "fyjianyu"]], + sp_bianfuren: ["female", "wei", 3, ["spwanwei", "spyuejian"]], + sp_duyu: ["male", "qun", 4, ["spwuku", "spsanchen"]], + luotong: ["male", "wu", 4, ["qinzheng"]], + sp_wangcan: ["male", "wei", 3, ["spqiai", "spshanxi"]], + sp_chenzhen: ["male", "shu", 3, ["shameng"]], + sp_sunshao: ["male", "wu", 3, ["mjdingyi", "mjzuici", "mjfubi"]], + sp_xunchen: ["male", "qun", 3, ["mjweipo", "mjchenshi", "mjmouzhi"], ["clan:颍川荀氏"]], +}; + +export default characters; diff --git a/character/shiji/characterFilter.js b/character/shiji/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/shiji/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/shiji/characterReplace.js b/character/shiji/characterReplace.js new file mode 100644 index 000000000..c41102fa3 --- /dev/null +++ b/character/shiji/characterReplace.js @@ -0,0 +1,26 @@ +const characterReplaces = { + wangcan: ["wangcan", "sp_wangcan", "tw_wangcan"], + sunshao: ["sunshao", "sp_sunshao"], + xunchen: ["xunchen", "re_xunchen", "sp_xunchen", "tw_xunchen", "clan_xunchen"], + xinpi: ["xinpi", "sp_xinpi"], + duyu: ["duyu", "dc_duyu", "sp_duyu", "pk_sp_duyu"], + zhangwen: ["zhangwen", "sp_zhangwen"], + ol_bianfuren: ["ol_bianfuren", "sp_bianfuren", "tw_bianfuren"], + wangshuang: ["wangshuang", "sp_wangshuang"], + huaman: ["huaman", "sp_huaman"], + gaolan: ["gaolan", "dc_gaolan", "sp_gaolan"], + cuiyan: ["cuiyan", "sp_cuiyan"], + wujing: ["wujing", "tw_wujing"], + zhouchu: ["jin_zhouchu", "zhouchu", "tw_zhouchu"], + liuzhang: ["liuzhang", "tw_liuzhang"], + chenzhen: ["sp_chenzhen", "tw_chenzhen"], + feiyi: ["ol_feiyi", "feiyi", "tw_feiyi"], + wangling: ["dc_wangling", "wangling", "tw_wangling", "clan_wangling"], + qiaogong: ["qiaogong", "tw_qiaogong"], + sp_chendong: ["sp_chendong", "tw_chendong", "chendong"], + sp_jiangqing: ["sp_jiangqing", "tw_jiangqing", "jiangqing"], + kongrong: ["dc_kongrong", "sp_kongrong", "jsrg_kongrong", "kongrong"], + dc_mifuren: ["dc_mifuren", "sp_mifuren"], +}; + +export default characterReplaces; diff --git a/character/shiji/dynamicTranslate.js b/character/shiji/dynamicTranslate.js new file mode 100644 index 000000000..cdee02b0a --- /dev/null +++ b/character/shiji/dynamicTranslate.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = {}; +export default dynamicTranslates; diff --git a/character/shiji/index.js b/character/shiji/index.js new file mode 100644 index 000000000..1f5a04b5e --- /dev/null +++ b/character/shiji/index.js @@ -0,0 +1,34 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "shiji", + connect: true, + character: { ...characters }, + characterSort: { + shiji: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/shiji/intro.js b/character/shiji/intro.js new file mode 100644 index 000000000..af722f929 --- /dev/null +++ b/character/shiji/intro.js @@ -0,0 +1,16 @@ +const characterIntro = { + yuanhuan: "袁涣,字曜卿,陈郡扶乐(今河南省周口市太康县)人。东汉末年官员,出身陈郡袁氏,为东汉司徒袁滂之子。袁涣早年曾任郡功曹,后被公府征辟,相继被举为高第、秀才。汉末战乱时,袁涣流寓江淮一带,初为袁术所用,后投吕布。建安三年(198年),曹操率兵剿灭了吕布,袁涣又转投曹操,拜沛南部都尉,后又任谏议大夫、郎中令等职,在任上尽心尽责,以敢谏直言称名。袁涣恕思而后行,外表温柔而内心能断,处危难则勇气极大。汉末三国时期,唯有程昱、曹仁、袁涣三人被评价为勇冠贲育。", + qiaogong: "桥公,亦作“乔公”,名字不详,是中国汉末三国时期的长者,江东二乔的父亲,三国时期庐江郡皖县(今安徽潜山)人,中国长篇古典名著《三国演义》中称之为“乔国老”。", + liuzhang: "刘璋(生卒年不详),字季玉,江夏竟陵(今湖北省天门市)人。东汉末年宗室、军阀,益州牧刘焉幼子,在父亲刘焉死后继任益州牧。刘璋为人懦弱多疑。汉中张鲁骄纵,不听刘璋号令,于是刘璋杀张鲁母弟,双方成为仇敌,刘璋派庞羲攻击张鲁,战败。后益州内乱,平定后,又有曹操将前来袭击的消息。在内外交逼之下,刘璋听信手下张松、法正之言,迎接刘备入益州,想借刘备之力,抵抗曹操。不料此举乃引狼入室,刘备反手攻击刘璋,又有法正为内应,进至成都。成都吏民都想抵抗刘备,但刘璋为百姓计而开城出降,群下莫不流涕。刘备占据成都后,刘璋以振威将军的身份被迁往荆州居住,关羽失荆州后,刘璋归属东吴,被孙权任命为益州牧,不久后去世,卒年不详。", + zhangzhongjing: "张仲景(约公元150~154年—约公元215~219年),名机,字仲景,南阳涅阳县(今河南省邓州市穰东镇张寨村)人。东汉末年著名医学家,被后人尊称为“医圣”。张仲景广泛收集医方,写出了传世巨著《伤寒杂病论》。它确立的“辨证论治”原则,是中医临床的基本原则,是中医的灵魂所在。在方剂学方面,《伤寒杂病论》也做出了巨大贡献,创造了很多剂型,记载了大量有效的方剂。其所确立的六经辨证的治疗原则,受到历代医学家的推崇。这是中国第一部从理论到实践、确立辨证论治法则的医学专著,是中国医学史上影响最大的著作之一,是后学者研习中医必备的经典著作,广泛受到医学生和临床大夫的重视。", + xiangchong: "向宠(?~240年),左将军向朗之侄,蜀汉重要将领。具有谦和公允的性格品行,对军事通晓畅达,被汉昭烈帝刘备称赞。刘备时,历任牙门将(类似于主将帐下的偏将),诸葛亮北伐时,以向宠为中领军,封都亭侯。诸葛亮北行汉中前,特意在《出师表》中向刘禅推荐向宠。延熙三年(公元240年),南征汉嘉(今四川省雅安市)蛮夷时,遇害,尸体被其部下夺回,送回成都安葬。", + caizhenji: "蔡贞姬,生卒年不详,汉末大儒蔡邕之女。其父蔡邕精于天文数理,妙解音律,是曹操的挚友和老师。生在书香门第的家庭的蔡贞姬,自小耳濡目染,精通书法与音律。后来,其父为避宦竖迫害,便随父亲来泰山依付羊衜一族,在羊衜的元配孔氏死后,便在父亲的做主下与之成亲。夫妻二人婚后生有两子一女:羊承、羊徽瑜、羊祜。在与羊衜成亲之前,羊衜和孔氏生有一子羊发。后来羊发、羊承同时生病,蔡贞姬知道不能两全,就专心照顾羊发,最后羊发痊愈,羊承病死。", + zhouchu: "周处(236—297年),字子隐,吴郡阳羡(今江苏宜兴)人。西晋大臣、将领,东吴鄱阳太守周鲂之子。少时纵情肆欲,为祸乡里。后来改过自新,拜访名人陆机和陆云,浪子回头,发奋读书,留下“周处除三害”的传说,拜东观左丞,迁无难都督,功业胜过父亲。吴国灭亡后,出仕西晋,拜新平太守,转广汉太守,治境有方。入为散骑常侍,迁御史中丞,刚正不阿。得罪梁孝王司马肜。元康七年,出任建威将军,前往关中,讨伐氐羌齐万年叛乱,遇害于沙场。追赠平西将军,谥号为孝。", + wangfuzhaolei: "王甫(?—222年),字国山,广汉郪(今四川三台县)人,三国时期蜀汉重臣。刘璋时,为益州书佐,之后归降刘备,先后担任绵竹令、荆州议曹从事,并在夷陵之战中阵亡。其子王祐,官至尚书右选郎。赵累,蜀汉大将关羽部下都督。后来吴将吕蒙袭取荆州,赵累被吴将潘璋等在临沮擒获。", + wangling: "王淩(172年~251年6月15日),字彦云,太原郡祁县(今山西省祁县)人,三国时期曹魏将领,东汉司徒王允之侄。王淩出身太原王氏祁县房。举孝廉出身,授发干县令,迁中山太守。颇有政绩,迁司空(曹操)掾属。魏文帝曹丕即位,拜散骑常侍、兖州刺史。参加洞口之战,跟从张辽击败吴将吕范,加号建武将军,封宜城亭侯。太和二年(228年),王淩参与石亭之战,跟从曹休征伐东吴,力挽狂澜,历任扬豫二州刺史,治境有方。齐王曹芳继位,拜征东将军,联合孙礼击败吴将全琮,进封南乡侯,授车骑将军、仪同三司,正始九年(248年),代高柔为司空。嘉平元年(249年),代蒋济为太尉。嘉平三年(251年),不满太傅司马懿专擅朝政,联合兖州刺史令狐愚谋立楚王曹彪为帝,事泄自尽,时年八十岁,夷灭三族。", + wujing: "吴景,本吴郡吴县(今江苏苏州)人,后迁居吴郡钱塘(今浙江杭州),孙坚妻子吴夫人(武烈皇后)之弟,孙策和孙权的舅舅,东汉末年将领。吴景因追随孙坚征伐有功,被任命为骑都尉。袁术上表举荐吴景兼任丹杨太守,讨伐前任太守周昕,占据丹杨。后遭扬州刺史刘繇逼迫,再度依附袁术,袁术任用他为督军中郎将,与孙贲共同进击樊能等人。又在秣陵攻打笮融、薛礼。袁术与刘备争夺徐州时,任吴景为广陵太守。建安二年(197年),吴景放弃广陵东归孙策,孙策任他为丹杨太守。朝廷使者吴景为扬武将军,郡守之职照旧。建安八年(203年),吴景死于任上。", + feiyi: "费祎(?~253年2月),字文伟,江夏鄳县(今河南省罗山县)人,三国时期蜀汉名臣,与诸葛亮、蒋琬、董允并称为蜀汉四相。深得诸葛亮器重,屡次出使东吴,孙权、诸葛恪、羊茞等人以辞锋刁难,而费祎据理以答,辞义兼备,始终不为所屈。孙权非常惊异于他的才能,加以礼遇。北伐时为中护军,又转为司马。当时魏延与杨仪不和,经常争论,费祎常为二人谏喻,两相匡护,以尽其用。诸葛亮死后,初为后军师,再为尚书令,官至大将军,封成乡侯。费祎主政时,与姜维北伐的主张相左,执行休养生息的政策,为蜀汉的发展尽心竭力。费祎性格谦恭真诚,颇为廉洁,家无余财。后为魏降将郭循(一作郭脩)行刺身死。葬于今广元市昭化古城城西。", + luotong: "骆统(193年-228年),字公绪。会稽郡乌伤县(今浙江义乌)人。东汉末年至三国时期吴国将领、学者,陈国相骆俊之子。骆统二十岁时已任乌程国相,任内有政绩,使得国中民户过万。又迁为功曹,行骑都尉。曾劝孙权尊贤纳士,省役息民。后出任为建忠中郎将。将军凌统逝世后,统领其部曲。因战功迁偏将军,封新阳亭侯,任濡须督。黄武七年(228年),骆统去世,年仅三十六岁。有集十卷,今已佚。", +}; + +export default characterIntro; diff --git a/character/shiji/perfectPairs.js b/character/shiji/perfectPairs.js new file mode 100644 index 000000000..8a65f7ec0 --- /dev/null +++ b/character/shiji/perfectPairs.js @@ -0,0 +1,3 @@ +export default { + wujing: ["sunce", "sunben", "wuguotai"], +}; diff --git a/character/shiji/pinyin.js b/character/shiji/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/shiji/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/shiji/skill.js b/character/shiji/skill.js new file mode 100644 index 000000000..504ff522e --- /dev/null +++ b/character/shiji/skill.js @@ -0,0 +1,6742 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //刘巴 + duanbi: { + unique: true, + mark: true, + limited: true, + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + var num1 = 0, + num2 = 0; + var count = game.countPlayer(function (current) { + num1 += current.countCards("h"); + num2++; + return current != player; + }); + return count > 0 && num1 > num2 * 2; + }, + filterTarget: true, + selectTarget: -1, + multitarget: true, + multiline: true, + skillAnimation: true, + animationColor: "orange", + content: function () { + "step 0"; + player.awakenSkill("duanbi"); + event.num = 0; + event.cards = []; + event.targets.sortBySeat(); + event.targets.remove(player); + "step 1"; + var target = targets[num]; + var num = Math.min(3, Math.floor(target.countCards("h") / 2)); + if (num > 0) target.chooseToDiscard("h", true, num); + else event._result = { bool: false }; + "step 2"; + if (result.bool && Array.isArray(result.cards)) event.cards.addArray(result.cards); + event.num++; + if (event.num < targets.length) event.goto(1); + "step 3"; + event.cards = cards.filter(function (i) { + return get.position(i, true) == "d"; + }); + if (!event.cards.length) event.finish(); + else + player.chooseTarget("是否令一名角色" + (event.cards.length > 3 ? "随机获得三" : "获得" + get.cnNumber(event.cards.length)) + "张被弃置的牌?").set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 4; + return att * Math.sqrt(Math.max(1, 5 - target.countCards("h"))); + }); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + target.gain(cards.randomGets(3), "gain2"); + } + }, + ai: { + order: 10, + result: { + target: function (player, target) { + if (player == target) return 3; + return -Math.min(3, Math.floor(target.countCards("h") / 2)); + }, + }, + }, + }, + tongduo: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + direct: true, + usable: 1, + filter: function (event, player) { + return ( + player != event.player && + event.targets.length == 1 && + game.hasPlayer(function (current) { + return current.countCards("he") > 0; + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("tongduo"), "令一名角色重铸一张牌", function (card, player, target) { + return target.hasCard(lib.filter.cardRecastable, "he"); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) * Math.min(3, Math.floor(target.countCards("h", lib.filter.cardRecastable) / 2)); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("tongduo", target); + } else event.finish(); + "step 2"; + if (!target.hasCard(lib.filter.cardRecastable, "he")) event.finish(); + else target.chooseCard("he", true, "请重铸一张牌", lib.filter.cardRecastable); + "step 3"; + target.recast(result.cards); + }, + }, + //朱儁 + yangjie: { + audio: 2, + group: ["yangjie_add"], + enable: "phaseUse", + prompt: "摸一张牌并与一名其他角色进行拼点", + usable: 1, + filter: function (event, player) { + return !player.hasSkillTag("noCompareSource"); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0 && !target.hasSkillTag("noCompareTarget"); + }, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (player.canCompare(target)) player.chooseToCompare(target).set("small", true); + else event.finish(); + "step 2"; + if (!result.bool) { + var cards = [result.player, result.target].filterInD("d"); + if (!cards.length || !game.hasPlayer(current => current != player && current != target)) event.finish(); + else { + event.cards = cards; + player + .chooseTarget("请选择一名角色", "令其获得" + get.translation(cards) + ",且视为对" + get.translation(target) + "使用一张火【杀】", function (card, player, target) { + return target != player && target != _status.event.getParent().target; + }) + .set("ai", function (target) { + var player = _status.event.player, + cards = _status.event.getParent().cards, + target2 = _status.event.getParent().target; + var val = get.value(cards, target) * get.attitude(player, target); + if (val <= 0) return 0; + return val + target.canUse({ name: "sha", nature: "fire", isCard: true }, target2, false) ? get.effect(target2, { name: "sha", nature: "fire", isCard: true }, target, player) : 0; + }); + } + } else event.finish(); + "step 3"; + if (result.bool) { + var source = result.targets[0]; + event.source = source; + player.line(source); + source.gain(cards, "gain2"); + } else event.finish(); + "step 4"; + var card = { name: "sha", nature: "fire", isCard: true }; + if (target.isIn() && source.isIn() && source.canUse(card, target, false)) source.useCard(card, target, false); + }, + subSkill: { + add: { + trigger: { player: "compare" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.getParent().name == "yangjie" && event.num1 > 1 && player.isDamaged(); + }, + content: function () { + var num = player.getDamagedHp(); + game.log(player, "的拼点牌点数-", num); + trigger.num1 = Math.max(1, trigger.num1 - num); + }, + }, + }, + ai: { + order: 3, + result: { target: -1.5 }, + }, + }, + zjjuxiang: { + audio: 2, + trigger: { global: "dyingAfter" }, + logTarget: "player", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return event.player != player && event.player.isIn(); + }, + check: function (event, player) { + return get.damageEffect(event.player, player, player) > 0; + }, + content: function () { + "step 0"; + player.awakenSkill("zjjuxiang"); + trigger.player.damage(); + "step 1"; + if (trigger.player.maxHp > 0) player.draw(trigger.player.maxHp); + }, + ai: { expose: 10 }, + }, + xinyangjie: { + audio: "yangjie", + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer(function (target) { + return player.canCompare(target); + }); + }, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + usable: 1, + content: function () { + "step 0"; + player.chooseToCompare(target).set("small", true); + "step 1"; + if ( + !result.bool && + game.hasPlayer(function (current) { + return current != player && current != target && current.canUse({ name: "sha", nature: "fire", isCard: true }, target, false); + }) + ) { + player + .chooseTarget("佯解:是否选择另一名其他角色?", "令其视为对" + get.translation(target) + "使用一张火【杀】", function (card, player, target) { + return target != player && target != _status.event.getParent().target; + }) + .set("ai", function (target) { + var player = _status.event.player, + target2 = _status.event.getParent().target; + return get.effect(target2, { name: "sha", nature: "fire", isCard: true }, target, player); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var source = result.targets[0]; + player.line(source); + game.log(player, "选择了", source); + var card = { name: "sha", nature: "fire", isCard: true }; + if (target.isIn() && source.isIn() && source.canUse(card, target, false)) source.useCard(card, target, false, "noai"); + } + }, + ai: { + order: 3, + result: { + target: function (player, target) { + var hs = player.getCards("h").sort(function (a, b) { + return a.number - b.number; + }); + var ts = target.getCards("h").sort(function (a, b) { + return a.number - b.number; + }); + if (!hs.length || !ts.length) return 0; + if (hs[0].number <= ts[0].number) return -3; + if (player.countCards("h") >= target.countCards("h")) return -10; + return -1; + }, + }, + }, + }, + xinjuxiang: { + audio: "zjjuxiang", + inherit: "zjjuxiang", + content: function () { + player.awakenSkill("xinjuxiang"); + trigger.player.damage(); + }, + }, + houfeng: { + audio: 3, + group: "houfeng_zhengsu", + subSkill: { + zhengsu: { + audio: "houfeng1", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + if (!["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].some(i => !event.player.hasSkill(i))) return false; + return player.inRange(event.player); + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + prompt2: () => lib.translate.houfeng_info, + round: 1, + logTarget: "player", + content: function () { + "step 0"; + player.chooseButton(["选择" + get.translation(trigger.player) + "要进行的整肃类型", [["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].filter(i => !trigger.player.hasSkill(i)), "vcard"]], true).set("ai", () => Math.random()); + "step 1"; + if (result.bool) { + var name = result.links[0][2], + target = trigger.player; + target.addTempSkill("houfeng_share", { + player: ["phaseDiscardAfter", "phaseAfter"], + }); + target.markAuto("houfeng_share", [player]); + target.addTempSkill(name, { player: ["phaseDiscardAfter", "phaseAfter"] }); + target.popup(name, "thunder"); + game.delayx(); + } + }, + }, + share: { + charlotte: true, + onremove: true, + trigger: { player: "phaseDiscardEnd" }, + forced: true, + popup: false, + content: function () { + "step 0"; + if (!lib.skill.zhengsu.filter(trigger, player)) { + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "houfeng3"); + }); + player.popup("整肃失败", "fire"); + game.log(player, "整肃失败"); + event.finish(); + return; + } + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "houfeng2"); + }); + player.popup("整肃成功", "wood"); + game.log(player, "整肃成功"); + var list = player.getStorage("houfeng_share").filter(i => i.isIn()); + list.unshift(player); + event.list = list; + var num1 = 0, + num2 = 0, + num3 = 0; + for (var target of list) { + num1 += 2 * get.effect(target, { name: "draw" }, player, player); + num2 += get.recoverEffect(target, player, player); + } + trigger.player + .chooseControl("摸两张牌", "回复体力", "cancel2") + .set("prompt", "整肃奖励:请选择" + get.translation(list) + "的整肃奖励") + .set("ai", function () { + return ["摸两张牌", "回复体力", "cancel2"][_status.event.goon.indexOf(Math.max.apply(Math, _status.event.goon))]; + }) + .set("goon", [num1, num2, num3]); + "step 1"; + if (result.control != "cancel2") { + if (result.control == "摸两张牌") game.asyncDraw(event.list, 2); + else { + for (var i of event.list) i.recover(); + } + } else event.finish(); + "step 2"; + game.delayx(); + }, + }, + }, + }, + houfeng1: { audio: true }, + //手杀皇甫嵩 + spzhengjun: { + audio: 3, + group: "spzhengjun_zhengsu", + subSkill: { + zhengsu: { + audio: "spzhengjun1", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].some(i => !player.hasSkill(i)); + }, + direct: true, + content: function () { + "step 0"; + player.chooseButton([get.prompt("spzhengjun"), [["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].filter(i => !player.hasSkill(i)), "vcard"]]).set("ai", () => Math.random()); + "step 1"; + if (result.bool) { + player.logSkill("spzhengjun_zhengsu", player); + var name = result.links[0][2]; + player.addTempSkill("spzhengjun_share", { + player: ["phaseDiscardAfter", "phaseAfter"], + }); + player.addTempSkill(name, { player: ["phaseDiscardAfter", "phaseAfter"] }); + player.popup(name, "thunder"); + game.delayx(); + } + }, + }, + share: { + charlotte: true, + trigger: { player: "phaseDiscardEnd" }, + forced: true, + popup: false, + content: function () { + "step 0"; + if (!lib.skill.zhengsu.filter(trigger, player)) { + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spzhengjun3"); + }); + player.popup("整肃失败", "fire"); + game.log(player, "整肃失败"); + event.finish(); + return; + } + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spzhengjun2"); + }); + player.popup("整肃成功", "wood"); + game.log(player, "整肃成功"); + player.chooseDrawRecover(2, "整肃奖励:摸两张牌或回复1点体力"); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + return; + } + player.chooseTarget("整军:是否令一名其他角色也回复1点体力或摸两张牌?", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + return Math.max(2 * get.effect(target, { name: "draw" }, target, player), get.recoverEffect(target, target, player)); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var num1 = 2 * get.effect(target, { name: "draw" }, target, player); + var num2 = get.recoverEffect(target, target, player); + player.line(target); + if (target.isHealthy()) result.index = 0; + else + player + .chooseControl("摸牌", "回血") + .set("prompt", "整肃奖励:令" + get.translation(target) + "摸两张牌或回复1点体力") + .set("ai", function () { + return _status.event.goon ? 0 : 1; + }) + .set("goon", num1 >= num2); + } else event.finish(); + "step 3"; + if (result.index == 0) target.draw(2); + else target.recover(); + }, + }, + }, + }, + spzhengjun1: { audio: true }, + spshiji: { + audio: 2, + trigger: { source: "damageBegin2" }, + logTarget: "player", + filter: function (event, player) { + return player != event.player && event.hasNature("linked") && event.player.countCards("h") > 0 && !player.isMaxHandcard(true); + }, + check: function (event, player) { + return get.attitude(player, event.player) <= 0; + }, + content: function () { + var target = trigger.player; + player.viewHandcards(target); + var hs = target.getCards("h", { color: "red" }); + if (hs.length) { + target.discard(hs); + player.draw(hs.length); + } + }, + }, + sptaoluan: { + audio: 2, + trigger: { global: "judgeFixing" }, + usable: 1, + filter: function (event, player) { + return event.result && event.result.suit == "spade"; + }, + check: function (event, player) { + return event.result.judge * get.attitude(player, event.player) <= 0; + }, + content: function () { + "step 0"; + var evt = trigger.getParent(); + if (evt.name == "phaseJudge") evt.excluded = true; + else { + evt.finish(); + evt._triggered = null; + if (evt.name.startsWith("pre_")) { + var evtx = evt.getParent(); + evtx.finish(); + evtx._triggered = null; + } + var nexts = trigger.next.slice(); + for (var next of nexts) { + if (next.name == "judgeCallback") trigger.next.remove(next); + } + var evts = game.getGlobalHistory("cardMove", function (evt) { + return evt.getParent(2) == trigger.getParent(); + }); + var cards = []; + for (var i = evts.length - 1; i >= 0; i--) { + var evt = evts[i]; + for (var card of evt.cards) { + if (get.position(card, true) == "o") cards.push(card); + } + } + trigger.orderingCards.addArray(cards); + } + var list = []; + if (get.position(trigger.result.card) == "d") list.push(0); + if (trigger.player.isIn() && player.canUse({ name: "sha", nature: "fire", isCard: true }, trigger.player, false)) list.push(1); + if (list.length == 2) + player + .chooseControl() + .set("choiceList", ["获得" + get.translation(trigger.result.card), "视为对" + get.translation(trigger.player) + "使用一张火【杀】"]) + .set("choice", get.effect(trigger.player, { name: "sha" }, player, player) > 0 ? 1 : 0); + else if (list.length == 1) event._result = { index: list[0] }; + else event.finish(); + "step 1"; + if (result.index == 0) player.gain(trigger.result.card, "gain2"); + else player.useCard({ name: "sha", nature: "fire", isCard: true }, trigger.player, false); + }, + }, + //吕范 + spdiaodu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("spdiaodu"), "令一名角色摸一张牌,然后移动其装备区内的一张牌").set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att > 0) { + if ( + target.hasCard(function (card) { + if ( + get.value(card, target) <= 0 && + game.hasPlayer(function (current) { + return current != target && current.canEquip(card, false) && get.effect(current, card, player, player) > 0; + }) + ) + return true; + return false; + }, "e") + ) + return 2 * att; + if ( + !target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }); + }, "e") + ) + return 1; + } else if (att < 0) { + if ( + target.hasCard(function (card) { + if ( + get.value(card, target) >= 4.5 && + game.hasPlayer(function (current) { + return current != target && current.canEquip(card) && get.effect(current, card, player, player) > 0; + }) + ) + return true; + return false; + }, "e") + ) + return -att; + } + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("spdiaodu", target); + target.draw(); + } else event.finish(); + "step 2"; + var es = target.getCards("e", function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }); + }); + if (es.length) { + if (es.length == 1) event._result = { bool: true, links: es }; + else + player.chooseButton(["移动" + get.translation(target) + "的一张装备牌", es], true).set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target, + card = button.link; + if ( + game.hasPlayer(function (current) { + return current != target && current.canEquip(card) && get.effect(current, card, player, player) > 0; + }) + ) + return -get.value(card, target) * get.attitude(player, target); + return 0; + }); + } else event.finish(); + "step 3"; + if (result.bool) { + event.card = result.links[0]; + player + .chooseTarget(true, "选择" + get.translation(event.card) + "的移动目标", function (card, player, target) { + return target.canEquip(_status.event.card); + }) + .set("card", event.card) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, evt.getParent().card, evt.player, evt.player); + }); + } else event.finish(); + "step 4"; + if (result.bool) { + var target2 = result.targets[0]; + target.line(target2); + target.$give(card, target2); + game.delay(0.5); + target2.equip(card); + } + }, + }, + spdiancai: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + player.hasHistory("lose", function (evt) { + return evt.hs && evt.hs.length > 0; + }) + ); + }, + content: function () { + "step 0"; + var num = 0; + player.getHistory("lose", function (evt) { + if (evt.hs) num += evt.hs.length; + }); + num = Math.min(num, game.countPlayer()); + player.chooseTarget(get.prompt("spdiancai"), [1, num], "令至多" + get.cnNumber(num) + "名角色各摸一张牌").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(trigger.player); + player.logSkill("spdiancai", targets); + if (targets.length == 1) { + targets[0].draw(); + event.finish(); + } else game.asyncDraw(targets); + } else event.finish(); + "step 2"; + game.delayx(); + }, + }, + mbdiaodu: { + audio: "spdiaodu", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return target.countCards("e", function (card) { + return game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card); + }); + }); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("mbdiaodu"), function (card, player, target) { + return target.countCards("e", function (card) { + return game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card); + }); + }); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att > 0) { + if ( + target.hasCard(function (card) { + if ( + get.value(card, target) <= 0 && + game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card, false) && get.effect(current, card, player, player) > 0; + }) + ) + return true; + return false; + }, "e") + ) + return 2 * att; + } else if (att < 0) { + if ( + target.hasCard(function (card) { + if ( + get.value(card, target) >= 4.5 && + game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card) && get.effect(current, card, player, player) > 0; + }) + ) + return true; + return false; + }, "e") + ) + return -att; + } + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("mbdiaodu", target); + } else event.finish(); + "step 2"; + var es = target.getCards("e", function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }); + }); + if (es.length == 1) event._result = { bool: true, links: es }; + else + player.chooseButton(["移动" + get.translation(target) + "的一张装备牌", es], true).set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target, + card = button.link; + if ( + game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card) && get.effect(current, card, player, player) > 0; + }) + ) + return -get.value(card, target) * get.attitude(player, target); + return 0; + }); + "step 3"; + if (result.bool) { + event.card = result.links[0]; + player + .chooseTarget("请选择" + get.translation(event.card) + "的移动目标", true, function (card, player, target) { + return target != player && target.canEquip(_status.event.card); + }) + .set("card", event.card) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, evt.getParent().card, evt.player, evt.player); + }); + } else event.finish(); + "step 4"; + if (result.bool) { + var target2 = result.targets[0]; + target.line(target2); + target.$give(card, target2); + game.delay(0.5); + target2.equip(card); + } else event.finish(); + "step 5"; + target.draw(); + }, + }, + mbdiancai: { + audio: "spdiancai", + trigger: { global: "phaseUseEnd" }, + filter: function (event, player) { + if (_status.currentPhase == player) return false; + var num = 0; + player.getHistory("lose", function (evt) { + if (evt.cards2 && evt.getParent("phaseUse") == event) num += evt.cards2.length; + }); + return num >= player.hp && player.countCards("h") < player.maxHp; + }, + frequent: true, + content: function () { + var num = player.maxHp - player.countCards("h"); + if (num > 0) player.draw(num); + }, + }, + spyanji: { + audio: 3, + group: "spyanji_zhengsu", + subSkill: { + zhengsu: { + audio: "spyanji", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].some(i => !player.hasSkill(i)); + }, + direct: true, + content: function () { + "step 0"; + player.chooseButton([get.prompt("spyanji"), [["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].filter(i => !player.hasSkill(i)), "vcard"]]).set("ai", () => Math.random()); + "step 1"; + if (result.bool) { + player.logSkill("spyanji_zhengsu", player); + var name = result.links[0][2]; + player.addTempSkill("spyanji_share", { + player: ["phaseDiscardAfter", "phaseAfter"], + }); + player.addTempSkill(name, { player: ["phaseDiscardAfter", "phaseAfter"] }); + player.popup(name, "thunder"); + game.delayx(); + } + }, + }, + share: { + charlotte: true, + trigger: { player: "phaseDiscardEnd" }, + forced: true, + popup: false, + content: function () { + if (!lib.skill.zhengsu.filter(trigger, player)) { + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spyanji3"); + }); + player.popup("整肃失败", "fire"); + game.log(player, "整肃失败"); + event.finish(); + return; + } + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spyanji2"); + }); + player.popup("整肃成功", "wood"); + game.log(player, "整肃成功"); + player.chooseDrawRecover(2, "整肃奖励:摸两张牌或回复1点体力"); + }, + }, + }, + }, + spyanji1: { audio: true }, + //蒋钦 + spjianyi: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return ( + player != event.player && + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" || evt.type != "discard") return false; + for (var i of evt.cards) { + if (get.subtype(i, false) == "equip2" && get.position(i, true) == "d") return true; + } + return false; + }).length > 0 + ); + }, + content: function () { + "step 0"; + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" || evt.type != "discard") return false; + for (var i of evt.cards) { + if (get.subtype(i, false) == "equip2" && get.position(i, true) == "d") cards.push(i); + } + }); + player.chooseButton(["俭衣:获得一张防具牌", cards], true).set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + "step 1"; + if (result.bool) player.gain(result.links, "gain2"); + }, + }, + spshangyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0 && game.hasPlayer(current => lib.skill.spshangyi.filterTarget(null, player, current)); + }, + filterCard: true, + position: "he", + check: function (card) { + return 6 - get.value(card); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + target.viewHandcards(player); + player.gainPlayerCard(target, "h", true, "visible"); + }, + ai: { + order: 6, + result: { + player: 0.5, + target: function (player, target) { + if (target.hasSkillTag("noh")) return 0; + return -1; + }, + }, + }, + }, + //蒋琬 + spzhenting: { + audio: 2, + trigger: { global: "useCardToTarget" }, + usable: 1, + filter: function (event, player) { + return (event.card.name == "sha" || get.type(event.card, false) == "delay") && event.player != player && !event.targets.includes(player) && player.inRange(event.target); + }, + logTarget: "target", + check: function (event, player) { + var target = event.target, + source = event.player; + var eff1 = get.effect(target, event.card, source, player); + if (eff1 >= 0) return false; + var eff2 = get.effect(player, event.card, source, player); + if (eff2 >= 0) return true; + if (eff1) + if (event.card.name == "sha") { + if (player.hasShan()) return true; + if (eff1 > eff2) return false; + if (player.hp > 2) return true; + if (player.hp == 2) return eff2 > eff1 / 3; + return false; + } + if (event.card.name == "shandian" || event.card.name == "bingliang") return true; + if (event.card.name == "lebu") return !player.needsToDiscard() && target.needsToDiscard(); + return false; + }, + content: function () { + "step 0"; + var target = trigger.target, + evt = trigger.getParent(); + evt.triggeredTargets2.remove(target); + evt.targets.remove(target); + evt.triggeredTargets2.add(player); + evt.targets.add(player); + game.log(trigger.card, "的目标被改为了", player); + trigger.untrigger(); + "step 1"; + if (!trigger.player.countDiscardableCards(player, "h")) event._result = { index: 0 }; + else player.chooseControl().set("choiceList", ["摸一张牌", "弃置" + get.translation(trigger.player) + "的一张手牌"]); + "step 2"; + if (result.index == 0) player.draw(); + else { + player.line(trigger.player, "fire"); + player.discardPlayerCard(trigger.player, true, "h"); + } + }, + ai: { + threaten: 1.4, + }, + }, + spjincui: { + audio: 2, + enable: "phaseUse", + usable: 1, + limited: true, + skillAnimation: true, + animationColor: "orange", + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + player.awakenSkill("spjincui"); + game.broadcastAll( + function (target1, target2) { + game.swapSeat(target1, target2); + }, + player, + target + ); + "step 1"; + if (player.hp > 0) player.loseHp(player.hp); + }, + ai: { + order: 5, + result: { + player: function (player, target) { + if (player.hasUnknown()) return 0; + if (!player.countCards("h", { name: ["tao", "jiu"] })) return 0; + var num = 0, + current = player.next; + while (true) { + num -= get.sgn(get.attitude(player, current)); + if (current == target) break; + current = current.next; + } + while (true) { + if (current == player) break; + num += get.sgn(get.attitude(player, current)) * 1.1; + current = current.next; + } + if (num < player.hp) return 0; + return num + 1 - player.hp; + }, + }, + }, + }, + //张昌蒲 + spdifei: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + usable: 1, + content: function () { + "step 0"; + var next = player.chooseToDiscard("h", "抵诽:弃置一张手牌或摸一张牌"); + if (trigger.card) { + var suit = get.suit(trigger.card, false); + if (lib.suit.includes(suit)) { + next.set("suit", suit); + next.set("prompt2", "然后若没有" + get.translation(suit) + "手牌则回复1点体力"); + next.set("ai", function (card) { + var player = _status.event.player, + suit = _status.event.suit; + if ( + player.hasCard(function (cardx) { + return cardx != card && get.suit(cardx) == suit; + }, "h") + ) + return 0; + if (get.name(card) != "tao" && ((get.position(card) == "h" && get.suit(card) == suit) || player.hp == 1)) return 8 - get.value(card); + return 5 - get.value(card); + }); + } else + next.set("ai", function (card) { + return -get.value(card); + }); + } + "step 1"; + if (!result.bool) player.draw(); + "step 2"; + player.showHandcards(); + if (trigger.card) { + var suit = get.suit(trigger.card, false); + if (!lib.suit.includes(suit) || !player.countCards("h", { suit: suit })) player.recover(); + } + }, + }, + spyanjiao: { + audio: 2, + enable: "phaseUse", + usable: 1, + chooseButton: { + dialog: function () { + return ui.create.dialog("###严教###" + get.translation("spyanjiao_info")); + }, + chooseControl: function (event, player) { + var map = {}, + hs = player.getCards("h"); + for (var i of hs) map[get.suit(i, player)] = true; + var list = lib.suit.filter(i => map[i]); + list.push("cancel2"); + return list; + }, + check: function (event, player) { + var map = {}, + hs = player.getCards("h"), + min = Infinity, + min_suit = null; + for (var i of hs) { + var suit = get.suit(i, player); + if (!map[suit]) map[suit] = 0; + map[suit] += get.value(i); + } + for (var i in map) { + if (map[i] < min) { + min = map[i]; + min_suit = i; + } + } + return min_suit; + }, + backup: function (result, player) { + return { + audio: "spyanjiao", + filterCard: { suit: result.control }, + selectCard: -1, + position: "h", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + content: function () { + player.addSkill("spyanjiao_draw"); + player.addMark("spyanjiao_draw", cards.length, false); + player.give(cards, target); + target.damage("nocard"); + }, + ai: { + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var val = get.value(ui.selected.cards, target); + if (val < 0) return val + get.damageEffect(target, player, target); + if (val > 5 || get.value(ui.selected.cards, player) > 5) return 0; + return get.damageEffect(target, player, target); + }, + }, + }, + }; + }, + prompt: () => "请选择【严教】的目标", + }, + subSkill: { + draw: { + onremove: true, + trigger: { player: "phaseBegin" }, + forced: true, + charlotte: true, + content: function () { + player.draw(player.countMark("spyanjiao_draw")); + player.removeSkill("spyanjiao_draw"); + }, + mark: true, + intro: { content: "下回合开始时摸#张牌" }, + }, + backup: { audio: "spyanjiao" }, + }, + ai: { + order: 1, + result: { player: 1 }, + }, + }, + //崔琰 + spyajun: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + var hs = player.getCards("h"); + return ( + hs.length > 0 && + !player.hasSkillTag("noCompareSource") && + player.hasHistory("gain", function (evt) { + for (var i of evt.cards) { + if (hs.includes(i)) return true; + } + return false; + }) && + game.hasPlayer(function (current) { + return current != player && player.canCompare(current); + }) + ); + }, + content: function () { + "step 0"; + var cards = [], + hs = player.getCards("h"); + player.getHistory("gain", function (evt) { + cards.addArray(evt.cards); + }); + cards = cards.filter(function (i) { + return hs.includes(i); + }); + player.chooseCardTarget({ + prompt: get.prompt("spyajun"), + prompt2: "操作提示:选择一张本回合新得到的牌作为拼点牌,然后选择一名拼点目标", + cards: cards, + filterCard: function (card) { + return _status.event.cards.includes(card); + }, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + ai1: function (card) { + return get.number(card) - get.value(card); + }, + ai2: function (target) { + return -get.attitude(_status.event.player, target) * Math.sqrt(5 - Math.min(4, target.countCards("h"))) * (target.hasSkillTag("noh") ? 0.5 : 1); + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("spyajun", target); + var next = player.chooseToCompare(target); + if (!next.fixedResult) next.fixedResult = {}; + next.fixedResult[player.playerid] = result.cards[0]; + } else event.finish(); + "step 2"; + if (result.bool) { + var cards = [result.player, result.target].filterInD("d"); + if (cards.length) { + player.chooseButton(["是否将一张牌置于牌堆顶?", cards]).set("ai", function (button) { + if (get.color(button.link) == "black") return 1; + return 0; + }); + } else event.finish(); + } else { + player.addMark("spyajun_less", 1, false); + player.addTempSkill("spyajun_less"); + event.finish(); + } + "step 3"; + if (result.bool) { + var card = result.links[0]; + card.fix(); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + game.updateRoundNumber(); + game.log(player, "将", card, "置于牌堆顶"); + } + }, + group: "spyajun_draw", + subSkill: { + draw: { + audio: "spyajun", + trigger: { player: "phaseDrawBegin2" }, + forced: true, + locked: false, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num++; + }, + }, + less: { + onremove: true, + charlotte: true, + intro: { content: "手牌上限-#" }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("spyajun_less"); + }, + }, + }, + }, + }, + spzundi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + filterTarget: true, + check: function (card) { + return 7 - get.value(card); + }, + content: function () { + "step 0"; + player.judge(); + "step 1"; + if (result.color == "black") target.draw(3); + else target.moveCard(); + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if (target.canMoveCard(true)) return 3; + return 1; + }, + }, + }, + }, + //花蔓 + spxiangzhen: { + trigger: { target: "useCardToBefore" }, + forced: true, + audio: 2, + filter: function (event, player) { + return event.card.name == "nanman"; + }, + content: function () { + trigger.cancel(); + }, + group: "spxiangzhen_draw", + subSkill: { + draw: { + audio: "spxiangzhen", + trigger: { global: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "nanman" && + game.hasPlayer2(function (current) { + return current.hasHistory("damage", function (evt) { + return evt.card == event.card; + }); + }) + ); + }, + content: function () { + "step 0"; + if (player != trigger.player && trigger.player.isIn()) game.asyncDraw([player, trigger.player].sortBySeat()); + else { + player.draw(); + event.finish(); + } + "step 1"; + game.delayx(); + }, + }, + }, + }, + spfangzong: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return !player.hasSkill("spxizhan_spfangzong") && player.countCards("h") < Math.min(8, game.countPlayer()); + }, + content: function () { + player.drawTo(Math.min(8, game.countPlayer())); + }, + mod: { + playerEnabled: function (card, player, target) { + if (player == _status.currentPhase && get.tag(card, "damage") > 0 && !player.hasSkill("spxizhan_spfangzong") && player.inRange(target)) return false; + }, + targetEnabled: function (card, player, target) { + if (get.tag(card, "damage") > 0 && !target.hasSkill("spxizhan_spfangzong") && player.inRange(target)) return false; + }, + }, + }, + spxizhan: { + audio: 4, + group: "spxizhan_effect", + locked: false, + subSkill: { + spfangzong: { charlotte: true }, + effect: { + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + return player != event.player; + }, + forced: true, + logTarget: "player", + content: function () { + "step 0"; + player.chooseToDiscard("he", "嬉战:弃置一张牌或失去1点体力", "根据弃置的牌对" + get.translation(trigger.player) + "视为使用如下牌:
    ♠,其使用【酒】;♥,你使用【无中生有】
    ♣,对其使用【铁索连环】;♦:对其使用火【杀】").set("ai", function (card) { + var player = _status.event.player, + target = _status.event.getTrigger().player; + var suit = get.suit(card, player), + list; + switch (suit) { + case "spade": + list = [{ name: "jiu" }, target, target]; + break; + case "heart": + list = [{ name: "wuzhong" }, player, player]; + break; + case "club": + list = [{ name: "tiesuo" }, player, target]; + break; + case "diamond": + list = [{ name: "sha", nature: "fire" }, player, target]; + break; + } + list[0].isCard = true; + var eff = 0; + if (list[1].canUse(list[0], list[2], false)) eff = get.effect(list[2], list[0], list[1], player); + if (eff >= 0 || suit == "club") eff = Math.max(eff, 5); + return eff * 1.5 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.addTempSkill("spxizhan_spfangzong"); + var target = trigger.player, + card = result.cards[0], + suit = get.suit(card, player); + if (!lib.suit.includes(suit) || ((!target || !target.isIn()) && suit != "heart")) return; + game.broadcastAll(function (suit) { + if (lib.config.background_speak) game.playAudio("skill", "spxizhan" + (4 - lib.suit.indexOf(suit))); + }, suit); + switch (suit) { + case "spade": + target.chooseUseTarget("jiu", true); + break; + case "heart": + player.chooseUseTarget("wuzhong", true); + break; + case "club": + if (player.canUse("tiesuo", target)) + player.useCard( + { + name: "tiesuo", + isCard: true, + }, + target + ); + break; + case "diamond": + if ( + player.canUse( + { + name: "sha", + isCard: true, + nature: "fire", + }, + target, + false + ) + ) + player.useCard( + { + name: "sha", + isCard: true, + nature: "fire", + }, + target, + false + ); + break; + } + } else player.loseHp(); + }, + }, + }, + }, + //高览 + spjungong: { + enable: "phaseUse", + filter: function (event, player) { + var num = player.getStat("skill").spjungong || 0; + return (num < player.hp || num <= player.countCards("he")) && !player.hasSkill("spjungong_block"); + }, + filterTarget: function (card, player, target) { + return target != player && player.canUse("sha", target, false); + }, + filterCard: true, + position: "he", + selectCard: function () { + var player = _status.event.player, + num = (player.getStat("skill").spjungong || 0) + 1; + if (ui.selected.cards.length || num > player.hp) return num; + return [0, num]; + }, + check: function (card) { + return 6 - get.value(card); + }, + prompt: function () { + var player = _status.event.player, + num = get.cnNumber((player.getStat("skill").spjungong || 0) + 1); + return "弃置" + num + "张牌或失去" + num + "点体力,视为使用杀"; + }, + content: function () { + "step 0"; + if (!cards.length) player.loseHp(player.getStat("skill").spjungong || 1); + player.useCard({ name: "sha", isCard: true }, target, false); + "step 1"; + if ( + player.hasHistory("sourceDamage", function (evt) { + var card = evt.card; + if (!card || card.name != "sha") return false; + var evtx = evt.getParent("useCard"); + return evtx.card == card && evtx.getParent() == event; + }) + ) + player.addTempSkill("spjungong_block"); + }, + ai: { + order: function (item, player) { + return get.order({ name: "sha" }, player) + 1; + }, + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + return get.effect(target, { name: "sha" }, player, target); + }, + }, + }, + subSkill: { block: { charlotte: true } }, + }, + spdengli: { + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + frequent: true, + filter: function (event, player) { + return event.card.name == "sha" && event.player.hp == event.target.hp; + }, + content: function () { + player.draw(); + }, + ai: { + effect: { + player: function (card, player, target) { + var hp = player.hp, + evt = _status.event; + if (evt.name == "chooseToUse" && evt.player == player && evt.skill == "spjungong" && !ui.selected.cards.length) hp -= (player.getStat("skill").spjungong || 0) + 1; + if (card && card.name == "sha" && hp == target.hp) return [1, 0.3]; + }, + target: function (card, player, target) { + if (card && card.name == "sha" && player.hp == target.hp) return [1, 0.3]; + }, + }, + }, + }, + //孙翊 + zaoli: { + trigger: { player: "phaseBegin" }, + audio: 2, + forced: true, + filter: function (event, player) { + return player.countMark("zaoli") > 0; + }, + content: function () { + "step 0"; + event.num = player.storage.zaoli; + player.removeMark("zaoli", event.num); + if (player.countCards("he") > 0) { + player.chooseToDiscard(true, "he", [1, Infinity], "躁厉:弃置至少一张牌").set("ai", function (card) { + if (card.hasGaintag("zaoli")) return 1; + return 5 - get.value(card); + }); + } + "step 1"; + if (result.bool) num += result.cards.length; + if (event.num > 2) player.loseHp(); + player.draw(num); + }, + mod: { + cardEnabled2: function (card, player) { + if (player == _status.currentPhase && get.itemtype(card) == "card" && card.hasGaintag("zaoli")) return false; + }, + }, + group: ["zaoli_add", "zaoli_count"], + init: function (player) { + if (player == _status.currentPhase) { + var hs = player.getCards("h"); + player.getHistory("gain", function (evt) { + hs.removeArray(evt.cards); + }); + if (hs.length) player.addGaintag(hs, "zaoli"); + } + }, + onremove: function (player) { + player.removeGaintag("zaoli"); + delete player.storage.zaoli; + }, + intro: { content: "mark" }, + subSkill: { + add: { + audio: "zaoli", + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + return ( + player.countMark("zaoli") < 4 && + player.hasHistory("lose", function (evt) { + return evt.hs && evt.hs.length > 0 && evt.getParent() == event; + }) + ); + }, + content: function () { + player.addMark("zaoli", 1); + }, + }, + count: { + trigger: { global: "phaseBeginStart" }, + forced: true, + firstDo: true, + silent: true, + filter: function (event, player) { + if (player == event.player) return player.countCards("h") > 0; + return player.hasCard(function (card) { + return card.hasGaintag("zaoli"); + }, "h"); + }, + content: function () { + if (player == trigger.player) { + player.addGaintag(player.getCards("h"), "zaoli"); + } else player.removeGaintag("zaoli"); + }, + }, + }, + }, + //王双 + yiyong: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.source && event.source.isIn() && player != event.source && event.cards.filterInD().length > 0 && player.getEquips(1).length > 0; + }, + check: function (event, player) { + var card = { + name: "sha", + cards: event.cards.filterInD(), + }, + target = event.source; + return !player.canUse(card, target, false) || get.effect(target, card, player, player) > 0; + }, + content: function () { + "step 0"; + event.cards = trigger.cards.filterInD(); + player.gain(event.cards, "gain2"); + "step 1"; + var target = trigger.source, + hs = player.getCards("h"); + if ( + target && + target.isIn() && + hs.length >= cards.length && + cards.filter(function (i) { + return hs.includes(i); + }).length == cards.length && + player.canUse({ name: "sha", cards: cards }, target, false) + ) { + var next = player.useCard({ name: "sha" }, cards, target, false); + if (!target.getEquips(1).length) next.baseDamage = 2; + } + }, + }, + shanxie: { + audio: 2, + enable: "phaseUse", + usable: 1, + //filterTarget:function(card,player,target){ + // return target!=player&&target.getEquip(1); + //}, + //selectTarget:[0,1], + content: function () { + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip1"; + }); + if (card) player.gain(card, "gain2"); + else { + var targets = game.filterPlayer(function (current) { + return current.getEquips(1).length > 0; + }); + if (targets.length) { + var target = targets.randomGet(); + player.gain(target.getEquips(1), target, "give", "bySelf"); + } + } + }, + content_old: function () { + "step 0"; + if (!target) { + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip1"; + }); + if (card) player.gain(card, "gain2"); + event.finish(); + } else { + var card = target.getEquip(1); + if (card) { + event.card = card; + player.gain(card, target, "give"); + } else event.finish(); + } + "step 1"; + if (player.getCards("h").includes(card) && get.type(card, player) == "equip" && player.hasUseTarget(card)) player.chooseUseTarget(card, true, "nopopup"); + "step 2"; + var hs = target.getCards("h", function (card) { + return target.canUse(get.autoViewAs({ name: "sha" }, [card]), player, false); + }); + if (hs.length) { + if (hs.length == 1) event._result = { bool: true, cards: hs }; + else + target + .chooseCard("h", true, "将一张牌当做【杀】对" + get.translation(player) + "使用", function (card) { + return _status.event.cards.includes(card); + }) + .set("cards", hs) + .set("ai", function (card) { + return get.effect(_status.event.getParent().player, get.autoViewAs({ name: "sha" }, [card]), _status.event.player); + }); + } else event.finish(); + "step 3"; + if (result.bool) target.useCard({ name: "sha" }, result.cards, player, false); + }, + ai: { + order: 9, + result: { player: 1 }, + }, + group: ["shanxie_exclude", "shanxie_shan"], + subSkill: { + exclude: { + trigger: { global: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + if (event.card.name != "shan" || event.getParent(2).player != player) return false; + var num = get.number(event.card); + return !num || num <= player.getAttackRange() * 2; + }, + logTarget: "player", + content: function () { + trigger.all_excluded = true; + }, + sub: true, + }, + shan: { + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.target.isAlive() && event.card.name == "sha"; + }, + silent: true, + content: function () { + trigger.target.addTempSkill("shanxie_banned"); + trigger.target.storage.shanxie_banned = { + card: trigger.card, + num: player.getAttackRange() * 2, + }; + }, + sub: true, + }, + banned: { + init: function (player) { + player.storage.shanxie_banned = {}; + }, + onremove: function (player) { + delete player.storage.shanxie_banned; + }, + trigger: { global: "useCardEnd" }, + filter: function (event, player) { + return event.card == player.storage.shanxie_banned.card; + }, + silent: true, + content: function () { + player.removeSkill("shanxie_banned"); + }, + ai: { + effect: { + player: function (card, player, target) { + if (get.name(card) == "shan") { + let num = get.number(card); + if (!num || num <= player.storage.shanxie_banned.num) return "zeroplayertarget"; + } + }, + }, + }, + }, + }, + }, + //吴景流兵 + liubing: { + trigger: { player: "useCard1" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha" || !event.cards || !event.cards.length) return false; + var evt = event.getParent("phaseUse"); + return ( + evt && + evt.player == player && + player + .getHistory("useCard", function (evt2) { + return evt2.card.name == "sha" && evt2.cards && evt2.cards.length && evt2.getParent("phaseUse") == evt; + }) + .indexOf(event) == 0 + ); + }, + content: function () { + game.log(player, "将", trigger.card, "的花色改为", "#y♦"); + trigger.card.suit = "diamond"; + trigger.card.color = "red"; + }, + group: "liubing_gain", + subSkill: { + gain: { + trigger: { global: "useCardAfter" }, + forced: true, + audio: "liubing", + filter: function (event, player) { + return ( + event.player != player && + event.card.isCard && + event.card.name == "sha" && + get.color(event.card) == "black" && + event.cards.filterInD().length > 0 && + event.player.isPhaseUsing() && + !event.player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) + ); + }, + logTarget: "player", + content: function () { + player.gain(trigger.cards.filterInD(), "gain2"); + }, + }, + }, + }, + //新刘璋 + jutu: { + audio: "xiusheng", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return ( + player.storage.yaohu && + game.hasPlayer(function (current) { + return current.group == player.storage.yaohu; + }) + ); + }, + content: function () { + "step 0"; + var cards = player.getExpansions("jutu"); + if (cards.length > 0) { + player.gain(cards, "gain2"); + } + "step 1"; + event.num = game.countPlayer(function (current) { + return current.group == player.storage.yaohu; + }); + player.draw(event.num + 1); + if (!event.num) event.finish(); + "step 2"; + var he = player.getCards("he"); + if (!he.length) event.finish(); + else if (he.length < num) event._result = { bool: true, cards: he }; + else player.chooseCard("he", true, num, "选择" + get.cnNumber(num) + "张牌作为生"); + "step 3"; + if (result.bool) { + var cards = result.cards; + player.addToExpansion(player, "give", cards).gaintag.add("jutu"); + } + "step 4"; + game.delayx(); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { combo: "yaohu" }, + }, + yaohu: { + audio: "yinlang", + trigger: { player: "phaseBegin" }, + direct: true, + forced: true, + locked: false, + filter: function (event, player) { + return ( + !player.hasSkill("yaohu_round") && + game.hasPlayer(function (current) { + return current.group && current.group != "unknown"; + }) + ); + }, + content: function () { + "step 0"; + var list = []; + game.countPlayer(function (current) { + if (current.group && current.group != "unknown") list.add(current.group); + }); + list.sort(function (a, b) { + return lib.group.indexOf(a) - lib.group.indexOf(b); + }); + if (!player.hasSkill("yaohu")) list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "邀虎:请选择一个势力") + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var getn = function (group) { + return game.countPlayer(function (current) { + if (current.group != group) return false; + if (player == current) return 2; + if (get.attitude(current, player) > 0) return 1; + return 1.3; + }); + }; + list.sort(function (a, b) { + return getn(b) - getn(a); + }); + return list[0]; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill( + "yaohu", + game.filterPlayer(function (current) { + return current.group == result.control; + }) + ); + game.log(player, "选择了", "#y" + get.translation(result.control + 2)); + player.storage.yaohu = result.control; + player.markSkill("yaohu"); + } + }, + ai: { combo: "jutu" }, + intro: { content: "已选择了$势力" }, + group: "yaohu_gain", + subSkill: { + round: {}, + gain: { + audio: "yinlang", + trigger: { global: "phaseUseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.player != player && event.player.group == player.storage.yaohu && event.player.isIn() && player.getExpansions("jutu").length > 0; + }, + logTarget: "player", + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + target.chooseButton(["选择获得一张“生”", player.getExpansions("jutu")], true).set("ai", function (button) { + return get.value(button.link, player); + }); + "step 1"; + if (result.bool) { + target.gain(result.links, "give", player, "bySelf"); + } + "step 2"; + if ( + game.hasPlayer(function (current) { + return current != player && current != target; + }) + ) { + player + .chooseTarget(true, "选择" + get.translation(target) + "使用【杀】的目标", function (card, player, target) { + return target != player && target != _status.event.source; + }) + .set("source", target) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.source, evt.player); + }); + } else { + event._result = { bool: false }; + event.goto(4); + } + "step 3"; + var target2 = result.targets[0]; + player.line(target2, "green"); + target + .chooseToUse( + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + "对" + get.translation(target2) + "使用一张杀,否则交给其两张牌" + ) + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", target2) + .set("addCount", false); + "step 4"; + if (!result.bool) { + var hs = target.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else target.chooseCard(2, true, "交给" + get.translation(player) + "两张牌", "he"); + } else event.finish(); + "step 5"; + if (result.bool) target.give(result.cards, player); + }, + }, + }, + }, + rehuaibi: { + audio: "huaibi", + zhuSkill: true, + mod: { + maxHandcard: function (player, num) { + if (player.storage.yaohu && player.hasZhuSkill("rehuaibi")) + return ( + num + + game.countPlayer(function (current) { + return current.group == player.storage.yaohu; + }) + ); + }, + }, + ai: { combo: "yaohu" }, + }, + //宗预 + zhibian: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(current => current != player && player.canCompare(current)); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("zhibian"), "与一名其他角色进行拼点", function (card, player, target) { + return target != player && player.canCompare(target); + }) + .set("ai", function (target) { + if (!_status.event.goon) return false; + var att = get.attitude(player, target); + if ( + att < 0 && + target.countCards("e", function (card) { + return player.canEquip(card) && get.effect(player, card, target, player) > 0; + }) + ) + return -att / Math.sqrt(target.countCards("h")); + if (!player.isDamaged()) return false; + if (att <= 0) return (1 - att) / Math.sqrt(target.countCards("h")); + return Math.sqrt((2 / att) * Math.sqrt(target.countCards("h"))); + }) + .set( + "goon", + (function () { + if ( + !player.hasCard(function (card) { + return card.number >= 14 - player.hp && get.value(card) <= 5; + }) + ) + return false; + return true; + })() + ); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("zhibian", target); + player.chooseToCompare(target); + } else event.finish(); + "step 2"; + if (result.bool) { + var list = [], + list2 = ["将" + get.translation(target) + "装备区/判定区中的一张牌移动到你的区域内", "回复1点体力", "背水!跳过摸牌阶段,并依次执行上述所有选项"]; + if ( + target.hasCard(function (card) { + return player.canEquip(card); + }, "e") || + target.hasCard(function (card) { + return player.canAddJudge(card); + }, "j") + ) { + list.push("选项一"); + } + if (player.isDamaged()) { + list.push("选项二"); + } + if (list.includes("选项一")) list.push("背水!"); + list.push("cancel2"); + player + .chooseControl(list) + .set("choiceList", list2) + .set("ai", function (target) { + if ( + player.isDamaged() && + (player.hp <= 2 || + !target.countCards("e", function (card) { + return player.canEquip(card) && get.value(card, target) >= 4 + player.getDamagedHp(); + })) + ) + return 1; + return 0; + }); + } else { + player.loseHp(); + event.finish(); + } + "step 3"; + if (result.control != "cancel2") { + event.control = result.control; + if (result.control == "选项一" || result.control == "背水!") { + player.choosePlayerCard(target, "ej", true).set("ai", get.buttonValue); + } else event.goto(5); + } else event.finish(); + "step 4"; + if (result.bool) { + var card = result.cards[0]; + target.$give(card, player, false); + game.delayx(); + if (get.position(card) == "e") player.equip(card); + else player.addJudge(card); + } + "step 5"; + if (event.control == "选项二" || event.control == "背水!") { + player.recover(); + } + if (event.control == "背水!") player.skip("phaseDraw"); + }, + }, + yuyan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return event.card.name == "sha" && event.card.isCard && typeof get.number(event.card) == "number" && player.hp < event.player.hp; + }, + content: function () { + "step 0"; + var num = get.number(trigger.card); + if ( + num >= 13 || + !trigger.player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.number(card) > num; + }, "he") + ) + event._result = { bool: false }; + else + trigger.player + .chooseCard( + "he", + function (card) { + return get.number(card) > _status.event.number; + }, + "交给" + get.translation(player) + "一张点数大于" + get.cnNumber(num) + "的牌,或令" + get.translation(trigger.card) + "对其无效" + ) + .set("number", num) + .set("", function (card) { + if (card.name == "shan" || card.name == "tao" || card.name == "jiu") return false; + return 6 - get.value(card); + }); + "step 1"; + if (result.bool) { + trigger.player.give(result.cards, player); + } else { + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + trigger.untrigger(); + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && player.hp > target.hp && get.attitude(player, target) < 0) { + var num = get.number(card); + if (typeof num != "number") return false; + var bs = player.getCards("h", function (cardx) { + return get.number(cardx) > num && !["", "", ""].includes(cardx.name); + }); + if (bs.length < 2) return 0; + if (player.hasSkill("jiu") || player.hasSkill("tianxianjiu")) return; + if (bs.length <= 2) { + for (var i = 0; i < bs.length; i++) { + if (get.value(bs[i]) < 6) { + return [1, 0, 1, -0.5]; + } + } + return 0; + } + return [1, 0, 1, -0.5]; + } + }, + }, + }, + }, + //袁涣 + qingjue: { + audio: 2, + trigger: { global: "useCardToPlayer" }, + logTarget: "player", + round: 1, + filter: function (event, player) { + return event.player != player && event.target != player && event.player != event.target && event.player.hp > event.target.hp && event.targets.length == 1 && event.player.countCards("h") > 0 && !event.target.isDying() && !event.player.hasSkillTag("noCompareTarget") && !player.hasSkillTag("noCompareSource"); + }, + check: function (event, player) { + var target = event.target, + source = event.player; + var eff1 = get.effect(target, event.card, source, player); + if (eff1 >= 0) return false; + var eff2 = get.effect(player, event.card, source, player); + if (eff2 >= 0) return true; + if (eff2 > eff1 / 3) + return player.hasCard(function (card) { + return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; + }); + if (eff2 > eff1 / 2) + return player.hasCard(function (card) { + return card.number > 10 && get.value(card) <= 5; + }); + return player.hasCard(function (card) { + return card.number > 11 && get.value(card) <= 5; + }); + }, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (player.canCompare(trigger.player)) player.chooseToCompare(trigger.player); + else event.finish(); + "step 2"; + trigger.targets.remove(trigger.target); + trigger.getParent().triggeredTargets1.remove(trigger.target); + trigger.untrigger(); + if (!result.bool) trigger.targets.push(player); + }, + }, + fengjie: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return game.hasPlayer(current => current != player); + }, + content: function () { + "step 0"; + player.chooseTarget("请选择【奉节】的目标", "选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸至四张)或弃置至与其体力值相等。", lib.filter.notMe, true).set("ai", function (target) { + return (target.hp - player.countCards("h")) / get.threaten(target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.log(player, "选择了", target); + player.storage.fengjie2 = target; + player.addTempSkill("fengjie2", { player: "phaseBegin" }); + game.delayx(); + } + }, + }, + fengjie2: { + audio: "fengjie", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + if (!player.storage.fengjie2 || !player.storage.fengjie2.isIn()) return false; + var num1 = player.countCards("h"), + num2 = player.storage.fengjie2.hp; + return num1 != num2; + }, + logTarget: (event, player) => player.storage.fengjie2, + content: function () { + var num1 = player.countCards("h"), + num2 = player.storage.fengjie2.hp; + if (num1 > num2) player.chooseToDiscard("h", true, num1 - num2); + else player.drawTo(Math.min(num1 + 4, num2)); + }, + }, + //陈武董袭 + spyilie: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("选项一", "选项二", "背水!", "cancel2") + .set("choiceList", ["本阶段内使用【杀】的次数上限+1", "本回合内使用【杀】被【闪】抵消时摸一张牌", "背水!失去1点体力并依次执行上述所有选项"]) + .set("ai", function () { + if ( + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card); + }) > player.getCardUsable({ name: "sha" }) + ) + return 0; + return 1; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("spyilie"); + game.log(player, "选择了", "#g【毅烈】", "的", "#y" + result.control); + if (result.index % 2 == 0) player.addTempSkill("spyilie_add", "phaseUseEnd"); + if (result.index > 0) player.addTempSkill("spyilie_miss"); + if (result.index == 2) player.loseHp(); + } + }, + subSkill: { + add: { + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + miss: { + charlotte: true, + audio: "spyilie", + trigger: { player: "shaMiss" }, + forced: true, + content: function () { + player.draw(); + }, + }, + }, + }, + spfenming: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: (event, player) => game.hasPlayer(current => lib.skill.spfenming.filterTarget(null, player, current)), + filterTarget: function (card, player, target) { + if (target.hp > player.hp) return false; + return ( + !target.isLinked() || + target.hasCard( + function (card) { + return lib.filter.canBeGained(card, player, target); + }, + target == player ? "e" : "he" + ) + ); + }, + content: function () { + if (!target.isLinked()) target.link(); + else player.gainPlayerCard(target, target == player ? "e" : "he", true); + }, + ai: { + order: 7, + result: { + player: function (player, target) { + if (!target.isLinked()) return get.effect(target, { name: "tiesuo" }, player, player); + return get.effect(target, { name: "shunshou_copy2" }, player, player); + }, + }, + }, + }, + //周处 + rechuhai: { + audio: "chuhai", + dutySkill: true, + locked: false, + group: ["rechuhai_add", "rechuhai_achieve", "rechuhai_fail", "rechuhai_chuhai"], + derivation: "zhangming", + subSkill: { + chuhai: { + audio: ["chuhai", 2], + inherit: "chuhai", + prompt: "与一名其他角色进行拼点", + }, + add: { + trigger: { player: "compare" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.getParent().name == "rechuhai_chuhai" && event.num1 < 13 && player.countCards("e") < 4; + }, + content: function () { + var num = 4 - player.countCards("e"); + game.log(player, "的拼点牌点数+", num); + trigger.num1 = Math.min(13, trigger.num1 + num); + }, + }, + achieve: { + audio: ["chuhai", 2], + trigger: { player: "equipAfter" }, + forced: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return player.countCards("e") > 2; + }, + content: function () { + player.awakenSkill("rechuhai"); + game.log(player, "成功完成使命"); + if (player.isDamaged()) player.recover(player.maxHp - player.hp); + player.changeSkills(["zhangming"], ["xianghai"]); + }, + }, + fail: { + audio: "chuhai3", + trigger: { player: "chooseToCompareAfter" }, + forced: true, + filter: function (event, player) { + return event.getParent().name == "rechuhai_chuhai" && event.num1 < 7 && !event.result.bool; + }, + content: function () { + player.awakenSkill("rechuhai"); + game.log(player, "使命失败"); + }, + }, + }, + }, + chuhai3: { audio: true }, + zhangming: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return get.suit(event.card) == "club"; + }, + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player; + }) + ); + }, + group: "zhangming_damage", + subSkill: { + damage: { + audio: "zhangming", + trigger: { source: "damageEnd" }, + forced: true, + usable: 1, + filter: function (event, player) { + return player != event.player; + }, + logTarget: "player", + content: function () { + var list = [], + cards = [], + target = trigger.player, + hs = target.getCards("h"); + if (hs.length > 0) { + var card = hs.randomGet(); + list.push(get.type2(card, target)); + player.showCards(card, get.translation(player) + "对" + get.translation(target) + "发动了【彰名】"); + } + target.discard(card); + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var type = get.type2(ui.cardPile.childNodes[i], false); + if (!list.includes(type)) { + list.push(type); + cards.push(ui.cardPile.childNodes[i]); + } + } + player.gain(cards, "gain2").gaintag.add("zhangming"); + player.addTempSkill("zhangming_keep"); + }, + }, + keep: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("zhangming"); + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("zhangming")) { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("zhangming")) { + return false; + } + }, + }, + }, + }, + }, + xianghai: { + audio: 2, + global: "xianghai_g", + mod: { + cardname: function (card) { + if (get.type(card, null, false) == "equip") return "jiu"; + }, + }, + ai: { + threaten: 2, + }, + }, + xianghai_g: { + mod: { + maxHandcard: function (player, num) { + return ( + num - + game.countPlayer(function (current) { + return current != player && current.hasSkill("xianghai"); + }) + ); + }, + }, + }, + chuhai: { + audio: 3, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(target => player.canCompare(target, true)); + }, + filterTarget: function (card, player, target) { + return player.canCompare(target, true); + }, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (player.canCompare(target)) player.chooseToCompare(target); + else event.finish(); + "step 2"; + if (result.bool) { + player.storage.chuhai2 = target; + player.addTempSkill("chuhai2", "phaseUseEnd"); + if (target.countCards("h") > 0) { + player.viewHandcards(target); + var types = [], + cards = [], + hs = target.getCards("h"); + for (var i of hs) { + types.add(get.type2(i, target)); + } + for (var i of types) { + var card = get.cardPile(function (card) { + return get.type2(card, false) == i; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2", "log"); + } + } + }, + ai: { + order: 9, + result: { + target: function (player, target) { + if ( + player.countCards("hs", function (card) { + return get.tag(card, "damage") > 0 && player.canUse(card, target, null, true) && get.effect(target, card, player, player) > 0 && player.hasValueTarget(card, null, true); + }) > 0 + ) + return -3; + return -1; + }, + }, + }, + }, + chuhai2: { + trigger: { source: "damageSource" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + if (event.player != player.storage.chuhai2) return false; + for (var i = 1; i < 6; i++) { + if (player.hasEmptySlot(i)) return true; + } + return false; + }, + content: function () { + for (var i = 1; i < 7; i++) { + if (player.hasEmptySlot(i)) { + var sub = "equip" + i, + card = get.cardPile(function (card) { + return get.subtype(card, false) == sub && !get.cardtag(card, "gifts") && player.canEquip(card); + }); + if (card) { + player.$gain2(card); + game.delayx(); + player.equip(card); + break; + } + } + } + }, + }, + //文鸯 + dbquedi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + usable: 1, + filter: function (event, player) { + return ( + (event.card.name == "sha" || event.card.name == "juedou") && + event.targets.length == 1 && + (event.target.countGainableCards(player, "h") > 0 || + player.hasCard(function (i) { + return _status.connectMode || (get.type(i, player) == "basic" && lib.filter.cardDiscardable(i, player, "dbquedi")); + }, "h")) + ); + }, + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + var list = []; + if (target.countGainableCards(player, "h") > 0) list.push("选项一"); + if ( + player.hasCard(function (i) { + return get.type(i, player) == "basic" && lib.filter.cardDiscardable(i, player, "dbquedi"); + }, "h") + ) + list.push("选项二"); + list.push("背水!"); + list.push("cancel2"); + player + .chooseControl(list) + .set("choiceList", ["获得" + get.translation(target) + "的一张手牌", "弃置一张基本牌并令" + get.translation(trigger.card) + "伤害+1", "背水!减1点体力上限并执行所有选项"]) + .set("prompt", get.prompt("dbquedi", target)) + .set("ai", function () { + var evt = _status.event.getTrigger(), + player = evt.player, + target = evt.target, + card = evt.card; + if (get.attitude(player, target) > 0) return "cancel2"; + var bool1 = target.countGainableCards(player, "h") > 0; + var bool2 = + player.hasCard(function (i) { + return get.type(i, player) == "basic" && lib.filter.cardDiscardable(i, player, "dbquedi") && get.value(card, player) < 5; + }, "h") && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }); + if (bool1 && bool2 && (target.hp <= 2 || (player.isDamaged() && player.maxHp > 3))) return "背水!"; + if (bool1) return "选项一"; + if (bool2) return "选项二"; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("dbquedi", target); + event.control = result.control; + if (event.control == "背水!") player.loseMaxHp(); + } else { + player.storage.counttrigger.dbquedi--; + event.finish(); + } + "step 2"; + if ((event.control == "选项一" || event.control == "背水!") && target.countGainableCards(player, "h") > 0) player.gainPlayerCard(target, true, "h"); + "step 3"; + if ( + (event.control == "选项二" || event.control == "背水!") && + player.hasCard(function (i) { + return get.type(i, player) == "basic" && lib.filter.cardDiscardable(i, player, "dbquedi"); + }, "h") + ) { + player.chooseToDiscard("h", "弃置一张基本牌", { type: "basic" }, true); + } else event.finish(); + "step 4"; + if (result.bool) trigger.getParent().baseDamage++; + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag !== "directHit_ai" || !arg || !arg.card || !arg.target || (arg.card.name != "sha" && arg.card.name != "juedou")) return false; + if (player.storage.counttrigger && player.storage.counttrigger.dbquedi && player.storage.counttrigger.dbquedi > 0) return false; + if ( + arg.target.countCards("h") == 1 && + (arg.card.name != "sha" || + !arg.target.hasSkillTag("freeShan", false, { + player: player, + card: arg.card, + }) || + player.hasSkillTag("unequip", false, { + name: arg.card ? arg.card.name : null, + target: arg.target, + card: arg.card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: arg.card ? arg.card.name : null, + target: arg.target, + card: arg.card, + })) + ) + return true; + return false; + }, + }, + }, + dbzhuifeng: { + audio: 2, + groupSkill: true, + enable: "chooseToUse", + usable: 2, + viewAsFilter: function (player) { + return player.group == "wei" && player.hp > 0; + }, + viewAs: { name: "juedou", isCard: true }, + filterCard: () => false, + selectCard: -1, + log: false, + precontent: function () { + "step 0"; + player.logSkill("dbzhuifeng"); + player.loseHp(); + event.forceDie = true; + "step 1"; + //特殊处理 + if (player.isDead()) { + player.useResult(event.result, event.getParent()).forceDie = true; + } + }, + ai: { + order: function () { + return get.order({ name: "juedou" }) - 0.5; + }, + }, + group: "dbzhuifeng_self", + subSkill: { + self: { + trigger: { player: "damageBegin2" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent(); + return evt.skill == "dbzhuifeng" && evt.player == player; + }, + content: function () { + trigger.cancel(); + player.getStat().skill.dbzhuifeng = 2; + }, + }, + }, + }, + dbchongjian: { + audio: 2, + groupSkill: true, + hiddenCard: function (player, name) { + if ( + player.group == "wu" && + (name == "sha" || name == "jiu") && + player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "hes") + ) + return true; + return false; + }, + enable: "chooseToUse", + filter: function (event, player) { + return ( + player.group == "wu" && + player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "hes") && + (event.filterCard({ name: "sha" }, player, event) || event.filterCard({ name: "jiu" }, player, event)) + ); + }, + locked: false, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dbchongjian) return true; + }, + }, + chooseButton: { + dialog: function () { + var list = []; + list.push(["基本", "", "sha"]); + for (var i of lib.inpile_nature) list.push(["基本", "", "sha", i]); + list.push(["基本", "", "jiu"]); + return ui.create.dialog("冲坚", [list, "vcard"]); + }, + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard({ name: button.link[2], nature: button.link[3], isCard: true }, player, evt); + }, + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; + if ( + button.link[2] == "jiu" && + (player.hasCard(function (card) { + return get.name(card) == "sha"; + }, "hs") || + player.countCards("hes", function (card) { + if (get.type(card) != "equip") return false; + if (get.position(card) == "e") { + if (player.hasSkillTag("noe")) return 10 - get.value(card) > 0; + var sub = get.subtype(card); + if ( + player.hasCard(function (card) { + return get.subtype(card) == sub && player.canUse(card, player) && get.effect(player, card, player, player) > 0; + }, "hs") + ) + return 10 - get.value(card) > 0; + } + return 5 - get.value(card) > 0; + }) > 1) + ) + return player.getUseValue({ name: "jiu" }) * 4; + return player.getUseValue({ name: button.link[2], nature: button.link[3] }, false); + }, + backup: function (links, player) { + return { + audio: "dbchongjian", + viewAs: { + name: links[0][2], + nature: links[0][3], + //isCard:true, + storage: { dbchongjian: true }, + }, + filterCard: { type: "equip" }, + position: "hes", + popname: true, + precontent: function () { + player.addTempSkill("dbchongjian_effect"); + }, + check: function (card) { + var player = _status.event.player; + if (get.position(card) == "e") { + if (player.hasSkillTag("noe")) return 10 - get.value(card); + var sub = get.subtype(card); + if ( + player.hasCard(function (card) { + return get.subtype(card) == sub && player.canUse(card, player) && get.effect(player, card, player, player) > 0; + }, "hs") + ) + return 10 - get.value(card); + } + return 5 - get.value(card); + }, + }; + }, + prompt: function (links) { + return "将一张装备牌当做" + (links[0][3] ? get.translation(links[0][3]) : "") + "【" + get.translation(links[0][2]) + "】使用"; + }, + }, + ai: { + unequip: true, + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "unequip") { + if (player.group != "wu" || !arg || !arg.card || !arg.card.storage || !arg.card.storage.dbchongjian) return false; + return true; + } + return ( + player.group == "wu" && + arg == "use" && + player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "hes") + ); + }, + order: function (item, player) { + if (_status.event.type != "phase") return 1; + var player = _status.event.player; + if ( + player.hasCard(function (card) { + if (get.value(card, player) < 0) return true; + var sub = get.subtype(card); + return ( + player.hasCard(function (card) { + return get.subtype(card) == sub && player.canUse(card, player) && get.effect(player, card, player, player) > 0; + }, "hs") > 0 + ); + }, "e") + ) + return 10; + if ( + player.countCards("hs", "sha") || + player.countCards("he", function (card) { + return get.type(card) == "equip" && get.value(card, player) < 5; + }) > 1 + ) + return get.order({ name: "jiu" }) - 0.1; + return get.order({ name: "sha" }) - 0.1; + }, + result: { player: 1 }, + }, + subSkill: { + effect: { + charlotte: true, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dbchongjian) return true; + }, + }, + trigger: { source: "damageSource" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return event.parent.skill == "dbchongjian_backup" && event.card.name == "sha" && event.getParent().name == "sha" && event.player.countGainableCards(player, "e") > 0; + }, + content: function () { + player.gainPlayerCard(trigger.player, "e", true, trigger.num); + }, + }, + }, + }, + dbchoujue: { + audio: 2, + trigger: { source: "dieAfter" }, + forced: true, + content: function () { + player.gainMaxHp(); + player.draw(2); + player.addSkill("counttrigger"); + if (!player.storage.counttrigger) player.storage.counttrigger = {}; + if (!player.storage.counttrigger.dbquedi) player.storage.counttrigger.dbquedi = 0; + player.storage.counttrigger.dbquedi--; + }, + }, + //王淩 + xingqi: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + return get.type(event.card, false) != "delay" && !player.getStorage("xingqi").includes(event.card.name); + }, + content: function () { + player.markAuto("xingqi", [trigger.card.name]); + game.log(player, "获得了一个", "#g【备(" + get.translation(trigger.card.name) + ")】"); + }, + marktext: "备", + intro: { + content: "$", + onunmark: function (storage, player) { + delete player.storage.xingqi; + }, + }, + group: "xingqi_gain", + subSkill: { + gain: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.getStorage("xingqi").length > 0; + }, + content: function () { + "step 0"; + player.removeSkill("mibei_mark"); + player.chooseButton(["星启:是否获得一张牌?", [player.getStorage("xingqi"), "vcard"]]).set("ai", function (button) { + var card = { name: button.link[2] }, + player = _status.event.player; + if ( + !get.cardPile2(function (cardx) { + return cardx.name == card.name; + }) + ) + return 0; + return get.value(card, player) * player.getUseValue(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("xingqi"); + var name = result.links[0][2]; + game.log(player, "移去了一个", "#g【备(" + get.translation(name) + ")】"); + player.unmarkAuto("xingqi", [name]); + var card = get.cardPile2(function (card) { + return card.name == name; + }); + if (card) player.gain(card, "gain2"); + } + }, + }, + }, + }, + xinzifu: { + audio: "zifu", + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + return ( + player.getStorage("xingqi").length > 0 && + !player.hasHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; + }) + ); + }, + content: function () { + game.log(player, "移去了所有", "#g【备】"); + player.unmarkSkill("xingqi"); + player.addTempSkill("xinzifu_limit"); + player.addMark("xinzifu_limit", 1, false); + }, + ai: { + neg: true, + combo: "xingqi", + }, + subSkill: { + limit: { + charlotte: true, + markimage: "image/card/handcard.png", + intro: { + content: function (storage, player) { + var num = -player.countMark("xinzifu_limit"); + return "手牌上限" + num; + }, + }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("xinzifu_limit"); + }, + }, + }, + }, + }, + mibei: { + audio: 2, + trigger: { player: "useCardAfter" }, + dutySkill: true, + forced: true, + locked: false, + direct: true, + filter: function (event, player) { + if (!player.storage.xingqi || !player.storage.xingqi.length) return false; + var map = { basic: 0, trick: 0, equip: 0 }; + for (var i of player.storage.xingqi) { + var type = get.type(i); + if (typeof map[type] == "number") map[type]++; + } + for (var i in map) { + if (map[i] < 2) return false; + } + return true; + }, + content: function () { + "step 0"; + player.logSkill("twmibei_achieve"); + game.log(player, "成功完成使命"); + player.awakenSkill("mibei"); + var list = ["basic", "equip", "trick"], + cards = []; + for (var i of list) { + var card = get.cardPile2(function (card) { + return get.type(card) == i; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + "step 1"; + player.addSkills("xinmouli"); + }, + ai: { + combo: "xingqi", + }, + group: ["mibei_fail", "mibei_silent"], + derivation: "xinmouli", + subSkill: { + silent: { + charlotte: true, + trigger: { player: "phaseZhunbeiBegin" }, + silent: true, + lastDo: true, + filter: function (event, player) { + return !player.getStorage("xingqi").length; + }, + content: function () { + player.addTempSkill("mibei_mark"); + }, + }, + mark: { charlotte: true }, + fail: { + audio: "mibei2", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return !player.getStorage("xingqi").length && player.hasSkill("mibei_mark"); + }, + forced: true, + content: function () { + game.log(player, "使命失败"); + player.awakenSkill("mibei"); + player.loseMaxHp(); + }, + }, + }, + }, + mibei1: { audio: true }, + mibei2: { audio: true }, + xinmouli: { + audio: "mouli", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.getStorage("xingqi").length > 0; + }, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + target.chooseButton(["谋立:是否获得一张牌?", [player.getStorage("xingqi"), "vcard"]], true).set("ai", function (button) { + var card = { name: button.link[2] }, + player = _status.event.player; + return get.value(card, player); + }); + "step 1"; + if (result.bool) { + var name = result.links[0][2]; + game.log(player, "移去了一个", "#g【备(" + get.translation(name) + ")】"); + player.unmarkAuto("xingqi", [name]); + var card = get.cardPile2(function (card) { + return card.name == name; + }); + if (card) target.gain(card, "gain2"); + } + }, + ai: { + combo: "xingqi", + order: 1, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + return 1; + }, + }, + }, + }, + mouli: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + position: "h", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + check: function (card) { + return 8 - get.value(card); + }, + content: function () { + player.give(cards, target); + if (!target.storage.mouli2) target.storage.mouli2 = []; + if (!target.storage.mouli3) target.storage.mouli3 = []; + target.storage.mouli2.add(player); + target.storage.mouli3.push(player); + target.addSkill("mouli_effect"); + }, + ai: { + threaten: 1.2, + order: 4, + result: { + target: 1, + }, + }, + subSkill: { + effect: { + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if (event.card.name != "sha" && event.card.name != "shan") return false; + for (var i of player.storage.mouli3) { + if (i.isIn()) return true; + } + return false; + }, + logTarget: function (event, player) { + return player.storage.mouli3; + }, + content: function () { + "step 0"; + game.delayx(); + player.storage.mouli3.sortBySeat(); + if (player.storage.mouli3.length == 1) { + player.storage.mouli3[0].draw(3); + player.storage.mouli3.length = 0; + event.finish(); + } else game.asyncDraw(player.storage.mouli3, 3); + "step 1"; + player.storage.mouli3.length = 0; + game.delayx(); + }, + group: ["mouli_sha", "mouli_shan", "mouli_clear"], + mark: true, + intro: { + content: "已因$获得“谋立”效果", + }, + }, + sha: { + enable: "chooseToUse", + viewAs: { name: "sha" }, + filterCard: { color: "black" }, + position: "he", + prompt: "将一张黑色牌当做杀使用", + check: function (card) { + return 6 - get.value(card); + }, + viewAsFilter: function (player) { + return player.countCards("he", { color: "black" }) > 0; + }, + ai: { + respondSha: true, + skillTagFilter: function (player) { + return player.countCards("he", { color: "black" }) > 0; + }, + }, + }, + shan: { + enable: "chooseToUse", + viewAs: { name: "shan" }, + filterCard: { color: "red" }, + position: "he", + prompt: "将一张红色牌当做闪使用", + check: function (card) { + return 7 - get.value(card); + }, + viewAsFilter: function (player) { + return player.countCards("he", { color: "red" }) > 0; + }, + ai: { + respondShan: true, + skillTagFilter: function (player) { + return player.countCards("he", { color: "red" }) > 0; + }, + }, + }, + clear: { + trigger: { global: ["phaseBegin", "dieAfter"] }, + forced: true, + silent: true, + popup: false, + lastDo: true, + forceDie: true, + filter: function (event, player) { + if (event.name == "die" && player == event.player) return true; + return player.storage.mouli2.includes(event.player); + }, + content: function () { + if (trigger.name == "die" && player == trigger.player) { + player.removeSkill("mouli_effect"); + delete player.storage.mouli2; + delete player.storage.mouli3; + return; + } + player.storage.mouli2.remove(trigger.player); + while (player.storage.mouli3.includes(trigger.player)) player.storage.mouli3.remove(trigger.player); + if (!player.storage.mouli2.length) player.removeSkill("mouli_effect"); + }, + }, + }, + }, + zifu: { + audio: 2, + trigger: { global: "dieAfter" }, + forced: true, + filter: function (event, player) { + return event.player.storage.mouli2 && event.player.storage.mouli2.includes(player); + }, + content: function () { + player.loseMaxHp(2); + }, + ai: { + combo: "mouli", + neg: true, + }, + }, + //孔融 + xinlirang: { + audio: "splirang", + trigger: { global: "phaseDrawBegin2" }, + logTarget: "player", + filter: function (event, player) { + return !event.numFixed && event.player != player && player.countMark("xinlirang") == 0; + }, + prompt2: "获得一枚“谦”并令其多摸两张牌", + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + content: function () { + trigger.num += 2; + player.addMark("xinlirang", 1); + player.addTempSkill("xinlirang_gain"); + }, + marktext: "谦", + intro: { + name: "谦", + content: "mark", + }, + group: "xinlirang_skip", + subSkill: { + gain: { + audio: "splirang", + trigger: { global: "phaseDiscardEnd" }, + direct: true, + filter: function (event, player) { + return event.player.hasHistory("lose", function (evt) { + return evt.type == "discard" && evt.cards2.filterInD("d").length > 0 && evt.getParent("phaseDiscard") == event; + }); + }, + content: function () { + "step 0"; + var cards = []; + trigger.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) cards.addArray(evt.cards2.filterInD("d")); + }); + player.chooseButton(["礼让:是否获得其中至多两张牌?", cards], [1, 2]); + "step 1"; + if (result.bool) { + player.logSkill("xinlirang_gain", trigger.player); + player.gain(result.links, "gain2"); + } + }, + }, + skip: { + audio: "splirang", + trigger: { player: "phaseDrawBefore" }, + forced: true, + filter: function (event, player) { + return player.hasMark("xinlirang"); + }, + content: function () { + trigger.cancel(); + player.removeMark("xinlirang", player.countMark("xinlirang")); + }, + }, + }, + }, + xinmingshi: { + audio: "spmingshi", + trigger: { player: "damageEnd" }, + forced: true, + logTarget: "source", + filter: function (event, player) { + return event.source && event.source.isIn() && player.hasMark("xinlirang") && event.source.countCards("he") > 0; + }, + content: function () { + "step 0"; + trigger.source + .chooseToDiscard("he", true) + .set("color", get.attitude(trigger.source, player) > 0 ? "red" : "black") + .set("ai", function (card) { + return (get.color(card) == _status.event.color ? 4 : 0) - get.value(card); + }); + "step 1"; + if (result.bool && result.cards && result.cards.length) { + var card = result.cards[0]; + if (get.color(card, trigger.source) == "red") player.recover(); + else if (get.position(card, true) == "d") player.gain(card, "gain2"); + } + }, + ai: { + combo: "xinlirang", + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage") && target.hasMark("xinlirang")) { + var cards = [card]; + if (card.cards && card.cards.length) cards.addArray(card.cards); + if (ui.selected.cards.length) cards.addArray(ui.selected.cards); + if ( + !player.countCards("he", function (card) { + return !cards.includes(card); + }) + ) + return; + if ( + !player.countCards("h", function (card) { + return !cards.includes(card) && get.color(card) == "black" && get.value(card, player) < 6; + }) + ) + return "zerotarget"; + return 0.5; + } + }, + }, + }, + }, + spmingshi: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + logTarget: "source", + filter: function (event, player) { + return event.source && player != event.source && event.source.countCards("he") > 0; + }, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + trigger.source.chooseToDiscard("he", true); + "step 2"; + if (event.count > 0 && result.bool && lib.skill.spmingshi.filter(trigger, player) && player.hasSkill("spmingshi")) event.goto(1); + }, + ai: { + threaten: 0.8, + maixie: true, + maixie_defend: true, + }, + }, + splirang: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of hs) { + if (!lib.filter.cardDiscardable(i, player, "splirang")) return false; + } + return true; + }, + filterCard: true, + selectCard: -1, + content: function () { + "step 0"; + cards = cards.filterInD("d"); + if (!cards.length || player.hp < 1) event.goto(3); + else + player.chooseButton(["将任意张牌交给一名其他角色", cards], [1, Math.min(cards.length, player.hp)]).set("ai", function (button) { + return get.value(button.link); + }); + "step 1"; + if (result.bool) { + event.cards = result.links; + player.chooseTarget(true, "令一名角色获得" + get.translation(event.cards), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 5; + return att; + }); + } else event.goto(3); + "step 2"; + if (result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(cards, "gain2"); + } + "step 3"; + player.draw(); + }, + ai: { + order: 0.1, + result: { + player: function (player) { + var hs = player.getCards("h"); + if ( + hs.length <= player.hp && + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0 && !current.hasJudge("lebu") && !current.hasSkillTag("nogain"); + }) + ) + return 1; + if (get.value(hs, player) < 6) return 1; + return 0; + }, + }, + }, + }, + //糜夫人 + xinguixiu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.hp % 2 == 1 || player.isDamaged(); + }, + content: function () { + if (player.hp % 2 == 1) player.draw(); + else player.recover(); + }, + }, + qingyu: { + audio: 3, + dutySkill: true, + locked: false, + group: ["qingyu_achieve", "qingyu_fail", "qingyu_defend"], + subSkill: { + defend: { + audio: "qingyu1", + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "qingyu_defend"); + }) > 1 + ); + }, + forced: true, + content: function () { + trigger.cancel(); + player.chooseToDiscard(2, "he", true); + }, + }, + achieve: { + audio: "qingyu3", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + return player.isHealthy() && player.countCards("h") == 0; + }, + content: function () { + game.log(player, "成功完成使命"); + player.awakenSkill("qingyu"); + player.addSkills("xuancun"); + }, + }, + fail: { + audio: "qingyu2", + trigger: { player: "dying" }, + forced: true, + content: function () { + game.log(player, "使命失败"); + player.awakenSkill("qingyu"); + player.loseMaxHp(); + }, + }, + }, + derivation: "xuancun", + }, + qingyu1: { audio: true }, + qingyu2: { audio: true }, + qingyu3: { audio: true }, + xuancun: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + return player != event.player && player.countCards("h") < player.hp; + }, + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + prompt2: function (event, player) { + return "令其摸" + get.cnNumber(Math.min(2, player.hp - player.countCards("h"))) + "张牌"; + }, + content: function () { + trigger.player.draw(Math.min(2, player.hp - player.countCards("h"))); + }, + }, + //羊祜 + mingfa: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.storage.mingfa && + player.countCards("h") > 0 && + player.getCards("he").includes(player.storage.mingfa) && + !player.hasSkillTag("noCompareSource") && + game.hasPlayer(function (current) { + return current != player && player.canCompare(current); + }) + ); + }, + content: function () { + "step 0"; + event.card = player.storage.mingfa; + delete player.storage.mingfa; + player + .chooseTarget(get.prompt("mingfa"), "用" + get.translation(event.card) + "和一名其他角色拼点", function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + var player = _status.event.player, + card = _status.event.getParent().card; + if ( + card.number > 9 || + !target.countCards("h", function (cardx) { + return cardx.number >= card.number + 2; + }) + ) + return -get.attitude(player, target) / Math.sqrt(target.countCards("h")); + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("mingfa", target); + var next = player.chooseToCompare(target); + if (!next.fixedResult) next.fixedResult = {}; + next.fixedResult[player.playerid] = event.card; + } else { + player.removeGaintag("mingfa"); + event.finish(); + } + "step 2"; + if (result.bool) { + player.gainPlayerCard(target, true, "he"); + if (event.card.number == 1) event.finish(); + } else { + player.addTempSkill("mingfa_block"); + event.finish(); + } + "step 3"; + var card = get.cardPile2(function (card) { + return card.number == event.card.number - 1; + }); + if (card) player.gain(card, "gain2"); + }, + group: ["mingfa_choose", "mingfa_add", "mingfa_mark"], + subSkill: { + block: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; + }, + }, + }, + choose: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player.chooseCard("he", get.prompt("mingfa"), "选择展示自己的一张牌").set("ai", function (card) { + return Math.min(13, get.number(card) + 2) / Math.pow(Math.min(2, get.value(card)), 0.25); + }); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + player.logSkill("mingfa"); + player.removeGaintag("mingfa"); + player.addGaintag(card, "mingfa"); + player.storage.mingfa = card; + player.showCards(card, get.translation(player) + "发动了【明伐】"); + } + }, + }, + add: { + trigger: { player: "compare", target: "compare" }, + filter: function (event, player) { + if (event.player == player) return !event.iwhile; + return true; + }, + forced: true, + locked: false, + content: function () { + if (player == trigger.player) { + trigger.num1 += 2; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += 2; + if (trigger.num2 > 13) trigger.num2 = 13; + } + game.log(player, "的拼点牌点数+2"); + }, + }, + mark: { + trigger: { player: "gainEnd" }, + silent: true, + firstDo: true, + filter: function (event, player) { + return player.storage.mingfa && event.cards.includes(player.storage.mingfa) && player.getCards("h").includes(player.storage.mingfa); + }, + content: function () { + player.addGaintag(player.storage.mingfa, "mingfa"); + }, + }, + }, + }, + rongbei: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return game.hasPlayer(current => lib.skill.rongbei.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + for (var i = 1; i < 6; i++) { + if (target.hasEmptySlot(i)) return true; + } + return false; + }, + content: function () { + "step 0"; + event.num = 1; + player.awakenSkill("rongbei"); + "step 1"; + while (!target.hasEmptySlot(event.num)) { + event.num++; + if (event.num > 5) { + event.finish(); + return; + } + } + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip" + event.num && target.canUse(card, target); + }); + if (card) { + target.chooseUseTarget(card, true, "nopopup"); + } + event.num++; + if (event.num <= 5) event.redo(); + }, + ai: { + order: 5, + result: { + target: function (player, target) { + return (target.hasSkillTag("noe") ? 2 : 1) * (5 - target.countCards("e") - target.countDisabled()); + }, + }, + }, + }, + //桥公 + yizhu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + content: function () { + "step 0"; + player.draw(2); + "step 1"; + var hs = player.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, 2, "选择两张牌洗入牌堆"); + "step 2"; + if (result.bool) { + player.$throw(result.cards.length, 1000); + player.lose(result.cards, ui.cardPile).insert_index = function () { + return ui.cardPile.childNodes[get.rand(0, game.players.length * 2 - 2)]; + }; + player.markAuto("yizhu", result.cards); + } else event.finish(); + "step 3"; + game.updateRoundNumber(); + game.delayx(); + }, + intro: { + mark: function (dialog, content, player) { + if (player == game.me || player.isUnderControl()) dialog.addAuto(content); + else { + var names = []; + for (var i of content) names.add(i.name); + return get.translation(names); + } + }, + }, + group: "yizhu_use", + subSkill: { + use: { + audio: "yizhu", + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + return ( + player.storage.yizhu && + player.storage.yizhu.length && + event.player != player && + event.targets.length == 1 && + event.cards.filter(function (i) { + return player.storage.yizhu.includes(i); + }).length > 0 + ); + }, + logTarget: "player", + check: function (event, player) { + return get.effect(event.targets[0], event.card, event.player, player) < 0; + }, + prompt2: function (event, player) { + return "令" + get.translation(event.card) + "无效"; + }, + content: function () { + trigger.cancel(); + trigger.targets.length = 0; + trigger.getParent().triggeredTargets1.length = 0; + var list = trigger.cards.filter(function (i) { + return player.storage.yizhu.includes(i); + }); + player.unmarkAuto("yizhu", list); + game.delayx(); + }, + }, + }, + }, + luanchou: { + audio: 2, + enable: "phaseUse", + usable: 1, + selectTarget: 2, + filterTarget: true, + multitarget: true, + multiline: true, + content: function () { + game.countPlayer(function (current) { + var num = current.countMark("luanchou"); + if (num) current.removeMark("luanchou", num); + }); + targets.sortBySeat(); + for (var i of targets) i.addMark("luanchou", 1); + }, + global: ["gonghuan", "gonghuan_clear"], + derivation: "gonghuan", + marktext: "姻", + intro: { + name: "共患", + content: () => lib.translate.gonghuan_info, + onunmark: true, + }, + ai: { + order: 10, + expose: 0.2, + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return -Math.pow(target.hp, 3); + if (target.hp >= ui.selected.targets[0].hp) return 0; + return Math.pow(ui.selected.targets[0].hp - target.hp, 3); + }, + }, + }, + }, + gonghuan: { + audio: 2, + forceaudio: true, + trigger: { global: "damageBegin4" }, + usable: 1, + forced: true, + logTarget: "player", + filter: function (event, player) { + return ( + event.player.hp < player.hp && + player.hasMark("luanchou") && + event.player.hasMark("luanchou") && + game.hasPlayer(function (current) { + return current.hasSkill("luanchou"); + }) + ); + }, + content: function () { + trigger._gonghuan_player = trigger.player; + trigger.player = player; + }, + ai: { + effect: { + target: function (card, player, target) { + if (_status.luanchou_judging) return; + if (get.tag(card, "damage") && target.hasMark("luanchou")) { + var other = game.findPlayer(function (current) { + return current != target && current.hasMark("luanchou") && current.hp > target.hp && (!current.storage.counttrigger || !current.storage.counttrigger.gonghuan); + }); + if (!other) return; + _status.luanchou_judging = true; + var eff = [0, 0, 0, get.damageEffect(other, player, player, get.nature(card)) / get.attitude(player, player)]; + delete _status.luanchou_judging; + return eff; + } + }, + }, + }, + subSkill: { + clear: { + trigger: { player: "damageEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + return event._gonghuan_player; + }, + content: function () { + player.removeMark("luanchou", player.countMark("luanchou")); + trigger._gonghuan_player.removeMark("luanchou", trigger._gonghuan_player.countMark("luanchou")); + }, + }, + }, + }, + //刘璋 + xiusheng: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return ( + player.storage.yinlang && + game.hasPlayer(function (current) { + return current.group == player.storage.yinlang; + }) + ); + }, + content: function () { + "step 0"; + if (player.storage.xiusheng && player.storage.xiusheng.length > 0) player.unmarkSkill("xiusheng"); + "step 1"; + event.num = game.countPlayer(function (current) { + return current.group == player.storage.yinlang; + }); + if (event.num > 0) player.draw(event.num); + else event.finish(); + "step 2"; + var he = player.getCards("he"); + if (!he.length) event.finish(); + else if (he.length < num) event._result = { bool: true, cards: he }; + else player.chooseCard("he", true, num, "选择" + get.cnNumber(num) + "张牌作为生"); + "step 3"; + if (result.bool) { + var cards = result.cards; + player.markAuto("xiusheng", cards); + game.log(player, "将", cards, "放在了武将牌上"); + player.lose(cards, ui.special, "toStorage"); + } + "step 4"; + game.delayx(); + }, + intro: { + content: "cards", + onunmark: "throw", + }, + ai: { combo: "yinlang" }, + }, + yinlang: { + audio: 2, + trigger: { player: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return ( + !player.hasSkill("yinlang_round") && + game.hasPlayer(function (current) { + return current.group && current.group != "unknown"; + }) + ); + }, + content: function () { + "step 0"; + var list = []; + game.countPlayer(function (current) { + if (current.group && current.group != "unknown") list.add(current.group); + }); + list.sort(function (a, b) { + return lib.group.indexOf(a) - lib.group.indexOf(b); + }); + if (!player.hasSkill("yinlang")) list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "引狼:请选择一个势力") + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var getn = function (group) { + return game.countPlayer(function (current) { + if (current.group != group) return false; + if (get.attitude(current, player) > 0) return 1.5; + if (!current.inRange(player)) return 1; + return 0.6; + }); + }; + list.sort(function (a, b) { + return getn(b) - getn(a); + }); + return list[0]; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill( + "yinlang", + game.filterPlayer(function (current) { + return current.group == result.control; + }) + ); + game.log(player, "选择了", "#y" + get.translation(result.control + 2)); + player.storage.yinlang = result.control; + player.markSkill("yinlang"); + } + }, + ai: { combo: "xiusheng" }, + intro: { content: "已选择了$势力" }, + group: "yinlang_gain", + subSkill: { + round: {}, + gain: { + audio: "yinlang", + trigger: { global: "phaseUseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.player.group == player.storage.yinlang && event.player.isIn() && player.getStorage("xiusheng").length > 0; + }, + logTarget: "player", + content: function () { + "step 0"; + var str = get.translation(player); + event.target = trigger.player; + event.target + .chooseControl() + .set("choiceList", ["获得" + str + "的一张“生”,然后本阶段使用牌时只能指定其为目标", "令" + str + "获得一张“生”"]) + .set("ai", function () { + var evt = _status.event.getParent(), + player = evt.target, + target = evt.player; + if (get.attitude(player, target) > 0) return 1; + if ( + !player.countCards("hs", function (card) { + return player.hasValueTarget(card, null, true) && (!player.canUse(card, target, null, true) || get.effect(target, card, player, player) < 0); + }) + ) + return 0; + return 1; + }); + "step 1"; + event.gainner = result.index == 0 ? target : player; + if (result.index == 0) event.block = true; + event.gainner.chooseButton(["选择获得一张“生”", player.storage.xiusheng], true); + "step 2"; + player.unmarkAuto("xiusheng", result.links); + event.gainner.gain(result.links, "gain2"); + if (event.block) { + target.markAuto("yinlang_block", [player]); + target.addTempSkill("yinlang_block", "phaseUseAfter"); + } + }, + }, + block: { + mod: { + playerEnabled: function (card, player, target) { + var info = get.info(card); + if (info && info.singleCard && ui.selected.cards.length) return; + if (!player.getStorage("yinlang_block").includes(target)) return false; + }, + }, + onremove: true, + }, + }, + }, + huaibi: { + audio: 2, + zhuSkill: true, + mod: { + maxHandcard: function (player, num) { + if (player.storage.yinlang && player.hasZhuSkill("huaibi")) + return ( + num + + game.countPlayer(function (current) { + return current.group == player.storage.yinlang; + }) + ); + }, + }, + ai: { combo: "yinlang" }, + }, + //张温 + gebo: { + audio: 2, + trigger: { global: "recoverAfter" }, + forced: true, + content: function () { + game.cardsGotoSpecial(get.cards(), "toRenku"); + }, + }, + spsongshu: { + audio: 2, + trigger: { global: "phaseDrawBegin1" }, + logTarget: "player", + filter: function (event, player) { + return event.player.hp > player.hp && player.hp > 0 && !event.numFixed && _status.renku.length > 0; + }, + check: function (event, player) { + var num = Math.min(5, player.hp, _status.renku.length); + if (num <= event.num) return get.attitude(player, event.player) < 0; + return false; + }, + content: function () { + "step 0"; + trigger.changeToZero(); + var num = Math.min(5, player.hp, _status.renku.length); + trigger.player.chooseButton(["选择获得" + get.cnNumber(num) + "张牌", _status.renku], true, num); + "step 1"; + if (result.bool) { + var cards = result.links; + _status.renku.removeArray(cards); + game.updateRenku(); + trigger.player.gain(cards, "gain2", "fromRenku"); + trigger.player.addTempSkill("spsongshu_block"); + } + }, + init: function (player) { + player.storage.renku = true; + }, + subSkill: { + block: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; + }, + }, + mark: true, + intro: { content: "不能对其他角色使用牌" }, + }, + }, + }, + //张机 + jishi: { + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return ( + event.cards.filterInD().length > 0 && + !player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length + ); + }, + content: function () { + var cards = trigger.cards.filterInD(); + game.log(player, "将", cards, "置于了仁库"); + game.cardsGotoSpecial(cards, "toRenku"); + }, + init: function (player) { + player.storage.renku = true; + }, + group: "jishi_draw", + subSkill: { + draw: { + trigger: { + global: ["gainAfter", "cardsDiscardAfter"], + }, + forced: true, + filter: function (event, player) { + return event.fromRenku == true && !event.outRange; + }, + content: function () { + player.draw(); + }, + }, + }, + }, + xinliaoyi: { + audio: "liaoyi", + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + if (player == event.player) return false; + if (_status.renku.length) return true; + return event.player.countCards("h") > event.player.hp; + }, + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var num = Math.max(0, target.countCards("h") - target.hp); + var choiceList = ["令其从仁库中获得一张牌", "令其将" + get.cnNumber(num) + "张手牌置入仁库"]; + var choices = []; + if (_status.renku.length) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (target.countCards("h") > target.hp) { + event.num = num; + choices.push("选项二"); + } else choiceList[1] = '' + choiceList[1] + ""; + if (!choices.length) event.finish(); + else + player + .chooseControl(choices, "cancel2") + .set("prompt", get.prompt("xinliaoyi", target)) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + var att = get.attitude(player, target); + if (att > 0) { + if (_status.renku.length > 0) return "选项一"; + return 0; + } + if (target.countCards("h") > target.hp) return "选项二"; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("xinliaoyi", target); + if (result.control == "选项一") { + target.chooseButton(true, ["选择获得一张牌", _status.renku]).set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + event.goto(4); + } else { + var hs = target.getCards("h"); + if (hs.length <= num) event._result = { bool: true, cards: hs }; + else target.chooseCard("h", true, "将" + get.cnNumber(num) + "张手牌置于仁库中", num); + } + } else event.finish(); + "step 2"; + if (result.bool) { + target.$throw(result.cards, 1000); + game.log(target, "将", result.cards, "置入了仁库"); + target.lose(result.cards, ui.special, "toRenku"); + } else event.finish(); + "step 3"; + game.delayx(); + event.finish(); + "step 4"; + var cards = result.links; + _status.renku.removeArray(cards); + game.updateRenku(); + target.gain(cards, "gain2", "fromRenku"); + }, + init: function (player) { + player.storage.renku = true; + }, + ai: { threaten: 3.4 }, + }, + liaoyi: { + audio: 2, + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + if (player == event.player) return false; + var num = event.player.hp - event.player.countCards("h"); + if (num < 0) return true; + return num > 0 && _status.renku.length >= Math.min(4, num); + }, + logTarget: "player", + prompt2: function (event, player) { + var target = event.player, + num = target.hp - target.countCards("h"); + if (num < 0) return "令" + get.translation(target) + "将" + get.cnNumber(Math.min(4, -num)) + "张牌置入仁库"; + return "令" + get.translation(target) + "从仁库中获得" + get.cnNumber(Math.min(4, num)) + "张牌"; + }, + check: function (event, player) { + var target = event.player, + num = target.hp - target.countCards("h"), + att = get.attitude(player, target); + if (num < 0) { + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) >= + -num / 2 + ) + return att > 0; + return att <= 0; + } + return att > 0; + }, + content: function () { + "step 0"; + var target = trigger.player, + num = target.hp - target.countCards("h"); + event.target = target; + if (num < 0) { + num = Math.min(4, -num); + target.chooseCard("he", true, "将" + get.cnNumber(num) + "张牌置于仁库中", num); + } else { + num = Math.min(4, num); + target.chooseButton(["选择获得" + get.cnNumber(num) + "张牌", _status.renku], num, true).set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + event.goto(3); + } + "step 1"; + if (result.bool) { + target.$throw(result.cards, 1000); + game.log(target, "将", result.cards, "置入了仁库"); + target.lose(result.cards, ui.special, "toRenku"); + } else event.finish(); + "step 2"; + game.delayx(); + event.finish(); + "step 3"; + var cards = result.links; + _status.renku.removeArray(cards); + game.updateRenku(); + target.gain(cards, "gain2", "fromRenku"); + }, + }, + binglun: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return _status.renku.length > 0; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("病论", _status.renku); + }, + backup: function (links, player) { + var obj = lib.skill.binglun_backup; + obj.card = links[0]; + return obj; + }, + prompt: () => "请选择【病论】的目标", + }, + subSkill: { + backup: { + audio: "binglun", + filterCard: () => false, + selectCard: -1, + filterTarget: true, + delay: false, + content: function () { + "step 0"; + var card = lib.skill.binglun_backup.card; + game.log(card, "从仁库进入了弃牌堆"); + player.$throw(card, 1000); + game.delayx(); + game.cardsDiscard(card).fromRenku = true; + _status.renku.remove(card); + game.updateRenku(); + "step 1"; + target + .chooseControl() + .set("choiceList", ["摸一张牌", "于自己的下回合结束后回复1点体力"]) + .set("ai", function () { + if (_status.event.player.isHealthy()) return 0; + return 1; + }); + "step 2"; + if (result.index == 0) target.draw(); + else { + target.addSkill("binglun_recover"); + target.addMark("binglun_recover", 1, false); + } + }, + ai: { + result: { + target: function (player, target) { + if (target.isDamaged()) return 1.5; + return 1; + }, + }, + }, + }, + recover: { + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + onremove: true, + charlotte: true, + content: function () { + if (player.isDamaged()) { + player.logSkill("binglun_recover"); + player.recover(player.countMark("binglun_recover")); + } + player.removeSkill("binglun_recover"); + }, + intro: { + content: "下回合结束时回复#点体力", + }, + ai: { threaten: 1.7 }, + }, + }, + ai: { + order: 2, + result: { + player: 1, + }, + }, + }, + mjweipo: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return !current.hasSkill("mjweipo_effect"); + }); + }, + filterTarget: function (card, player, target) { + return !target.hasSkill("mjweipo_effect"); + }, + content: function () { + "step 0"; + var list = ["binglinchengxiax"]; + list.addArray(get.zhinangs()); + player.chooseButton(["危迫:选择一个智囊", [list, "vcard"]], true).set("ai", function (button) { + return _status.event.getParent().target.getUseValue({ name: button.link[2] }); + }); + "step 1"; + if (result.bool) { + var name = result.links[0][2]; + game.log(player, "选择了", "#y" + get.translation(name)); + target.storage.mjweipo_effect = name; + target.storage.mjweipo_source = player; + target.addSkill("mjweipo_effect"); + game.delayx(); + } + }, + ai: { + order: 7.1, + result: { + target: function (player, target) { + if (target == player) return player.countCards("hs", "sha") > 0 ? 10 : 0.01; + return (target.countCards("hs", "sha") + 0.5) * Math.sqrt(Math.max(1, target.hp)); + }, + }, + }, + }, + mjweipo_effect: { + audio: "mjweipo", + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h", "sha") > 0; + }, + prompt: function () { + return "弃置一张【杀】并获得一张" + get.translation(_status.event.player.storage.mjweipo_effect); + }, + filterCard: { name: "sha" }, + check: function (card) { + return 6 - get.value(card); + }, + position: "h", + popname: true, + content: function () { + var name = player.storage.mjweipo_effect, + card = false; + if (name == "binglinchengxiax") { + if (!_status.binglinchengxiax) { + _status.binglinchengxiax = [ + ["spade", 7], + ["club", 7], + ["club", 13], + ]; + game.broadcastAll(function () { + lib.inpile.add("binglinchengxiax"); + }); + } + if (_status.binglinchengxiax.length) { + var info = _status.binglinchengxiax.randomRemove(); + card = game.createCard2("binglinchengxiax", info[0], info[1]); + } + } + if (!card) card = get.cardPile2(name); + if (card) player.gain(card, "gain2"); + player.removeSkill("mjweipo_effect"); + }, + ai: { + order: 7, + result: { player: 1 }, + }, + mark: true, + marktext: "迫", + intro: { content: "可弃置一张【杀】并获得【$】" }, + group: "mjweipo_remove", + }, + mjweipo_remove: { + trigger: { global: ["phaseBegin", "die"] }, + forced: true, + firstDo: true, + popup: false, + filter: function (event, player) { + return event.player == player.storage.mjweipo_source; + }, + content: function () { + player.removeSkill("mjweipo_effect"); + }, + }, + mjchenshi: { + audio: 2, + global: ["mjchenshi_player", "mjchenshi_target"], + ai: { combo: "mjweipo" }, + }, + mjchenshi_player: { + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + if (!event.card || event.card.name != "binglinchengxiax" || !event.isFirstTarget) return false; + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.hasSkill("mjchenshi"); + }) + ); + }, + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current != player && current.hasSkill("mjchenshi"); + }); + player.chooseCardTarget({ + prompt: "是否交给" + get.translation(list) + "一张牌,将牌堆顶三张牌中不为【杀】的牌置于弃牌堆?", + filterCard: true, + position: "he", + filterTarget: function (card, player, target) { + return _status.event.list.includes(target); + }, + list: list, + selectTarget: list.length > 1 ? 1 : -1, + goon: (function () { + for (var i of list) { + if (get.attitude(player, i) > 0) return 1; + return -1; + } + })(), + ai1: function (card) { + if (_status.event.goon > 0) return 7 - get.value(card); + return 0.01 - get.value(card); + }, + ai2: function (target) { + var card = ui.selected.cards[0]; + return get.value(card, target) * get.attitude(_status.event.player, target); + }, + }); + "step 1"; + if (result.bool && result.cards.length && result.targets.length) { + var target = result.targets[0]; + target.logSkill("mjchenshi"); + player.line(target, "green"); + player.give(result.cards, target); + trigger.getParent().mjchenshi_ai = true; + } else event.finish(); + "step 2"; + var cards = get.cards(3); + for (var i = cards.length - 1; i >= 0; i--) { + if (cards[i].name == "sha") { + cards[i].fix(); + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); + cards.splice(i, 1); + } + } + if (cards.length) { + player.$throw(cards, 1000); + game.delayx(); + game.cardsDiscard(cards); + game.log(cards, "进入了弃牌堆"); + } + }, + }, + mjchenshi_target: { + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + if (!event.card || event.card.name != "binglinchengxiax") return false; + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.hasSkill("mjchenshi"); + }) + ); + }, + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current != player && current.hasSkill("mjchenshi"); + }); + player.chooseCardTarget({ + prompt: "是否交给" + get.translation(list) + "一张牌,将牌堆顶三张牌中的【杀】置于弃牌堆?", + filterCard: true, + position: "he", + filterTarget: function (card, player, target) { + return _status.event.list.includes(target); + }, + list: list, + selectTarget: list.length > 1 ? 1 : -1, + goon: (function () { + if (trigger.getParent().chenshi_ai) return 1; + for (var i of list) { + if (get.attitude(player, i) > 0) return 1; + return -1; + } + })(), + ai1: function (card) { + if (_status.event.goon > 0) return 7 - get.value(card); + return 3 - get.value(card); + }, + ai2: function (target) { + var card = ui.selected.cards[0]; + return Math.max(0.1, get.value(card, target) * get.attitude(_status.event.player, target)); + }, + }); + "step 1"; + if (result.bool && result.cards.length && result.targets.length) { + var target = result.targets[0]; + target.logSkill("mjchenshi"); + player.line(target, "green"); + player.give(result.cards, target); + } else event.finish(); + "step 2"; + var cards = get.cards(3); + for (var i = cards.length - 1; i >= 0; i--) { + if (cards[i].name != "sha") { + cards[i].fix(); + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); + cards.splice(i, 1); + } + } + if (cards.length) { + player.$throw(cards, 1000); + game.delayx(); + game.cardsDiscard(cards); + game.log(cards, "进入了弃牌堆"); + } + }, + }, + mjmouzhi: { + audio: 2, + trigger: { player: "damageBegin2" }, + forced: true, + filter: function (event, player) { + if (!event.card || get.suit(event.card) == "none") return false; + var all = player.getAllHistory("damage"); + if (!all.length) return false; + return all[all.length - 1].card && get.suit(all[all.length - 1].card) == get.suit(event.card); + }, + content: function () { + trigger.cancel(); + }, + group: "mjmouzhi_mark", + intro: { content: "上次受到伤害的花色:$" }, + ai: { + effect: { + target: (card, player, target) => { + if (typeof card === "object" && get.tag(card, "damage")) { + let suit = get.suit(card); + if (suit === "none") return; + let all = target.getAllHistory("damage"); + if (!all.length || !all[all.length - 1].card) return; + if (get.suit(all[all.length - 1].card) === suit) return "zeroplayertarget"; + } + }, + }, + }, + subSkill: { + mark: { + trigger: { player: "damage" }, + silent: true, + firstDo: true, + content: function () { + if (!trigger.card || get.suit(trigger.card) == "none") player.unmarkSkill("mjmouzhi"); + else { + player.markSkill("mjmouzhi"); + game.broadcastAll( + function (player, suit) { + if (player.marks.mjmouzhi) player.marks.mjmouzhi.firstChild.innerHTML = get.translation(suit); + player.storage.mjmouzhi = suit; + }, + player, + get.suit(trigger.card) + ); + } + }, + }, + }, + }, + mjshengxi: { + audio: "shengxi", + audioname: ["feiyi"], + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.getHistory("useCard").length > 0 && player.getHistory("sourceDamage").length == 0; + }, + content: function () { + "step 0"; + var list = get.zhinangs(); + player.chooseButton(["###" + get.prompt("mjshengxi") + "###获得一张智囊或摸一张牌", [list, "vcard"], [["摸一张牌", "取消"], "tdnodes"]], true).set("ai", function (card) { + if (card.link[2]) { + if ( + !get.cardPile2(function (cardx) { + return cardx.name == card.link[2]; + }) + ) + return 0; + return (Math.random() + 1.5) * get.value({ name: card.link[2] }, _status.event.player); + } + if (card.link == "摸一张牌") return 1; + return 0; + }); + "step 1"; + if (result.bool && result.links[0] != "取消") { + player.logSkill("mjshengxi"); + if (result.links[0] == "摸一张牌") player.draw(); + else { + var card = get.cardPile2(function (card) { + return card.name == result.links[0][2]; + }); + if (card) player.gain(card, "gain2"); + } + } + }, + group: "mjshengxi_zhunbei", + subfrequent: ["zhunbei"], + subSkill: { + zhunbei: { + audio: "shengxi", + audioname: ["feiyi"], + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + prompt2: "从游戏外或牌堆中获得一张【调剂盐梅】", + content: function () { + if (!_status.tiaojiyanmei_suits || _status.tiaojiyanmei_suits.length > 0) { + if (!lib.inpile.includes("tiaojiyanmei")) lib.inpile.add("tiaojiyanmei"); + if (!_status.tiaojiyanmei_suits) _status.tiaojiyanmei_suits = lib.suit.slice(0); + player.gain(game.createCard2("tiaojiyanmei", _status.tiaojiyanmei_suits.randomRemove(), 6), "gain2"); + } else { + var card = get.cardPile2(function (card) { + return card.name == "tiaojiyanmei"; + }); + if (card) player.gain(card, "gain2"); + } + }, + }, + }, + }, + mjkuanji: { + audio: "fyjianyu", + usable: 1, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + direct: true, + filter: function (event, player) { + if (event.type != "discard") return false; + var evt = event.getl(player); + return evt.cards2.filterInD("d").length > 0; + }, + content: function () { + "step 0"; + var cards = trigger.getl(player).cards2; + player.chooseButton(["宽济:是否将一张牌交给一名其他角色?", cards.filterInD("d")]).set("ai", function (button) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) + return Math.abs(get.value(button.link, "raw")) + 1; + return -get.value(button.link, "raw"); + }); + "step 1"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + player.chooseTarget("将" + get.translation(card) + "交给一名其他角色并摸一张牌", lib.filter.notMe, true).set("ai", function (target) { + var evt = _status.event.getParent(); + return get.attitude(evt.player, target) * get.value(evt.card, target) * (target.hasSkillTag("nogain") ? 0.1 : 1); + }); + } else { + player.storage.counttrigger.mjkuanji--; + event.finish(); + } + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mjkuanji", target); + target.gain(card, "gain2"); + player.draw(); + } + }, + }, + mjdingyi: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + logTarget: function () { + return game.players; + }, + content: function () { + "step 0"; + var list = []; + for (var i = 0; i < 4; i++) list.push(lib.skill["mjdingyi_" + i].title); + player + .chooseControl() + .set("choiceList", list) + .set("prompt", "定仪:请选择一个全局效果") + .set("ai", function (target) { + var list1 = player.getEnemies().length; + var list2 = game.players.length - list1; + if (list2 - list1 > 1) return 0; + if (game.players.length < 6) return 2; + return 3; + }); + "step 1"; + if (typeof result.index == "number") { + var skill = "mjdingyi_" + result.index; + game.log(player, "选择了", "#g" + lib.skill[skill].title); + for (var i of game.players) i.addSkill(skill); + game.delayx(); + } + }, + subSkill: { + 0: { + title: "摸牌阶段的额定摸牌数+1", + charlotte: true, + mark: true, + marktext: "仪", + trigger: { player: "phaseDrawBegin" }, + forced: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num += (player.storage.mjdingyi_plus || 0) + 1; + }, + intro: { + content: function (storage, player) { + return "摸牌阶段的额定摸牌数+" + 1 * ((player.storage.mjdingyi_plus || 0) + 1); + }, + }, + }, + 1: { + title: "手牌上限+2", + charlotte: true, + mark: true, + marktext: "仪", + mod: { + maxHandcard: function (player, num) { + return num + 2 * ((player.storage.mjdingyi_plus || 0) + 1); + }, + }, + intro: { + content: function (storage, player) { + return "手牌上限+" + 2 * ((player.storage.mjdingyi_plus || 0) + 1); + }, + }, + }, + 2: { + title: "攻击范围+1", + charlotte: true, + mark: true, + marktext: "仪", + mod: { + attackRange: function (player, num) { + return num + ((player.storage.mjdingyi_plus || 0) + 1); + }, + }, + intro: { + content: function (storage, player) { + return "攻击范围+" + ((player.storage.mjdingyi_plus || 0) + 1); + }, + }, + }, + 3: { + title: "脱离濒死状态后回复1点体力", + charlotte: true, + mark: true, + marktext: "仪", + trigger: { player: "dyingAfter" }, + forced: true, + filter: function (event, player) { + return player.isDamaged(); + }, + content: function () { + player.recover((player.storage.mjdingyi_plus || 0) + 1); + }, + intro: { + content: function (storage, player) { + return "脱离濒死状态后回复" + ((player.storage.mjdingyi_plus || 0) + 1) + "点体力"; + }, + }, + }, + }, + }, + mjzuici: { + audio: "zuici", + trigger: { player: "damageEnd" }, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + for (var i = 0; i < 4; i++) { + if (event.source.hasSkill("mjdingyi_" + i)) return true; + } + return false; + }, + logTarget: "source", + check: () => false, + content: function () { + "step 0"; + var target = trigger.source; + event.target = target; + for (var i = 0; i < 4; i++) { + if (target.hasSkill("mjdingyi_" + i)) target.removeSkill("mjdingyi_" + i); + } + "step 1"; + var list = get.zhinangs(); + if (list.length) { + player.chooseButton(["选择要令" + get.translation(target) + "获得的智囊", [list, "vcard"]], true); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = get.cardPile2(function (card) { + return card.name == result.links[0][2]; + }); + if (card) target.gain(card, "gain2"); + } + }, + ai: { + combo: "mjdingyi", + }, + }, + mjfubi: { + audio: "fubi", + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("mjfubi_round")) return false; + return game.hasPlayer(function (current) { + for (var i = 0; i < 4; i++) { + if (current.hasSkill("mjdingyi_" + i)) return true; + } + }); + }, + filterCard: true, + selectCard: [0, 1], + filterTarget: function (card, player, target) { + if (ui.selected.cards.length) { + for (var i = 0; i < 4; i++) { + if (target.hasSkill("mjdingyi_" + i)) return true; + } + } + var num = 0; + for (var i = 0; i < 4; i++) { + if (target.hasSkill("mjdingyi_" + i)) return true; + } + return num > 1 && num < 4; + }, + check: () => false, + position: "he", + content: function () { + "step 0"; + player.addTempSkill("mjfubi_round", "roundStart"); + if (cards.length) { + player.addSkill("mjfubi_clear"); + player.markAuto("mjfubi_clear", [target]); + target.addMark("mjdingyi_plus", 1, false); + game.log(target, "的", "#g【定仪】", "效果增加一倍"); + event.finish(); + return; + } + var list = [], + nums = []; + for (var i = 0; i < 4; i++) { + if (!target.hasSkill("mjdingyi_" + i)) { + list.push(lib.skill["mjdingyi_" + i].title); + nums.push(i); + } + } + if (list.length) { + event.nums = nums; + player + .chooseControl() + .set("choiceList", list) + .set("prompt", "辅弼:请选择为" + get.translation(target) + "更换的〖定仪〗效果") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + if (get.attitude(player, target) > 0 && !target.hasSkill("mjdingyi_0")) return 0; + return _status.event.getParent().nums.length - 1; + }); + } else event.finish(); + "step 1"; + for (var i = 0; i < 4; i++) { + if (target.hasSkill("mjdingyi_" + i)) target.removeSkill("mjdingyi_" + i); + } + target.addSkill("mjdingyi_" + event.nums[result.index]); + game.log(target, "的效果被改为", "#g" + lib.skill["mjdingyi_" + event.nums[result.index]].title); + }, + ai: { + order: 10, + expose: 0, + result: { + target: function (player, target) { + if (target.hasSkill("mjdingyi_0")) return -1; + return 2; + }, + }, + combo: "mjdingyi", + }, + subSkill: { + round: {}, + clear: { + trigger: { player: ["phaseBegin", "dieBegin"] }, + forced: true, + popup: false, + charlotte: true, + content: function () { + while (player.storage.mjfubi_clear && player.storage.mjfubi_clear.length) { + var target = player.storage.mjfubi_clear.shift(); + if (target.hasMark("mjdingyi_plus")) target.removeMark("mjdingyi_plus", 1, false); + } + delete player.storage.mjfubi_clear; + player.removeSkill("mjfubi_clear"); + }, + }, + }, + }, + boming: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + content: function () { + player.give(cards, target); + }, + check: function (card) { + return 5 - get.value(card); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var card = ui.selected.cards[0]; + if (player.hasSkill("ejian") && !player.getStorage("ejian").includes(target)) { + var dam = get.damageEffect(target, player, target); + if (dam > 0) return dam; + var type = get.type(card, target), + ts = target.getCards("he", function (card) { + return get.type(card) == type; + }); + if (ts.length) { + var val = get.value(ts, target); + if (val > get.value(card)) return -Math.max(1, val); + return 0; + } + } + return get.value(card, target) / 1.5; + }, + }, + }, + group: "boming_draw", + subSkill: { + draw: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + player.getHistory("lose", function (evt) { + return evt.getParent(2).name == "boming"; + }).length > 1 + ); + }, + content: function () { + player.draw(); + }, + }, + }, + }, + ejian: { + audio: 2, + trigger: { global: "gainAfter" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent(), + target = event.player; + if (evt.name != "boming" || evt.player != player || player.getStorage("ejian").includes(target) || !target.isIn()) return false; + var he = target.getCards("he"), + card = event.cards[0]; + if (!he.includes(card)) return false; + var type = get.type2(card); + for (var i of he) { + if (i != card && get.type2(i) == type) return true; + } + return false; + }, + logTarget: "player", + content: function () { + "step 0"; + event.cardType = get.type2(trigger.cards[0]); + event.target = trigger.player; + player.markAuto("ejian", [event.target]); + event.target + .chooseControl() + .set("choiceList", ["受到1点伤害", "展示手牌并弃置所有" + get.translation(event.cardType) + "牌"]) + .set("ai", function (event, player) { + if (get.damageEffect(player, _status.event.getParent().player, player) >= 0) return 0; + var type = _status.event.cardType, + cards = player.getCards("he", function (card) { + return get.type2(card) == type; + }); + if (cards.length == 1) return 1; + if (cards.length >= 2) { + for (var i = 0; i < cards.length; i++) { + if (get.tag(cards[i], "save")) return 0; + } + } + if (player.hp == 1) return 1; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i]) >= 8) return 0; + } + if (cards.length > 2 && player.hp > 2) return 0; + if (cards.length > 3) return 0; + return 1; + }) + .set("cardType", event.cardType); + "step 1"; + if (result.index == 1) { + if (target.countCards("h") > 0) target.showHandcards(); + } else { + target.damage(); + event.finish(); + } + "step 2"; + target.discard( + target.getCards("he", function (card) { + return get.type2(card) == event.cardType; + }) + ); + }, + ai: { combo: "boming", halfneg: true }, + onremove: true, + intro: { content: "已对$发动过此技能" }, + }, + hxrenshi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + (!player.storage.hxrenshi2 || + game.hasPlayer(function (current) { + return !player.storage.hxrenshi2.includes(current); + })) + ); + }, + filterCard: true, + filterTarget: function (card, player, target) { + return !player.storage.hxrenshi2 || !player.storage.hxrenshi2.includes(target); + }, + position: "h", + discard: false, + lose: false, + delay: false, + check: function (cardx) { + var player = _status.event.player; + if ( + player.getStorage("debao").length == 1 && + (!game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 && current.hp * 1.5 + current.countCards("h") < 4; + }) || + game.hasPlayer(function (current) { + return get.attitude(player, current) <= 0 && current.hp * 1.5 + current.countCards("h") < 4; + })) + ) + return 0; + return 5 - get.value(cardx); + }, + content: function () { + player.addTempSkill("hxrenshi2", "phaseUseEnd"); + player.markAuto("hxrenshi2", targets); + player.give(cards, target); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (ui.selected.cards.length) return get.value(ui.selected.cards[0], target) + 0.1; + return 0; + }, + }, + }, + }, + hxrenshi2: { + onremove: true, + }, + debao: { + audio: 2, + trigger: { global: "gainAfter" }, + forced: true, + filter: function (event, player) { + if (player == event.player || player.getStorage("debao").length >= player.maxHp) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; + }, + content: function () { + var cards = get.cards(); + player.markAuto("debao", cards); + player.$gain2(cards[0], false); + game.cardsGotoSpecial(cards); + game.log(player, "将", cards[0], "放在了武将牌上"); + game.delayx(); + }, + marktext: "仁", + intro: { content: "cards", onunmark: "throw" }, + group: "debao_gain", + subSkill: { + gain: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.getStorage("debao").length > 0; + }, + content: function () { + var cards = player.storage.debao; + player.gain(cards, "gain2", "fromStorage"); + cards.length = 0; + player.unmarkSkill("debao"); + }, + }, + }, + }, + buqi: { + audio: 2, + trigger: { global: "dying" }, + forced: true, + filter: function (event, player) { + return player.getStorage("debao").length > 1; + }, + logTarget: "player", + content: function () { + "step 0"; + var cards = player.getStorage("debao"); + if (cards.length == 2) event._result = { bool: true, links: cards.slice(0) }; + else player.chooseButton(["不弃:请选择移去两张“仁”", cards], 2, true); + "step 1"; + if (result.bool) { + var cards = result.links; + player.unmarkAuto("debao", cards); + player.$throw(cards, 1000); + game.log(player, "将", cards, "置入了弃牌堆"); + game.delayx(); + game.cardsDiscard(cards); + } else event.finish(); + "step 2"; + if (trigger.player.isIn() && trigger.player.isDamaged()) trigger.player.recover(); + }, + group: "buqi_die", + subSkill: { + die: { + trigger: { global: "dieAfter" }, + forced: true, + filter: function (event, player) { + return player.getStorage("debao").length > 0; + }, + content: function () { + player.unmarkSkill("debao"); + }, + }, + }, + ai: { + neg: true, + combo: "debao", + }, + }, + guying: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + forced: true, + usable: 1, + filter: function (event, player) { + if (event.type != "discard") { + var evt = event.getParent(); + if (evt.name != "useCard" && evt.name != "respond") return false; + } + var target = _status.currentPhase, + evt = event.getl(player); + if (!evt.cards2 || evt.cards2.length != 1 || !target || target == player || !target.isIn()) return false; + return get.position(evt.cards2[0]) == "d" || target.countCards("he") < 0; + }, + logTarget: function () { + return _status.currentPhase; + }, + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + event.target = _status.currentPhase; + event.card = trigger.getl(player).cards2[0]; + "step 1"; + player.addMark("guying", 1, false); + event.addIndex = 0; + var choiceList = [], + str = get.translation(player); + if (target.countCards("he") > 0) choiceList.push("随机交给" + str + "一张牌"); + else event.addIndex++; + if (get.position(card) == "d") choiceList.push("令" + str + "收回" + get.translation(card)); + if (choiceList.length == 1) event._result = { index: 0 }; + target + .chooseControl() + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + evt = _status.event.getParent(); + if (get.value(evt.card, evt.player) * get.attitude(player, evt.player) > 0) return 0; + return Math.random() > get.value(evt.card, evt.player) / 6 ? 1 : 0; + //return 1; + }); + "step 2"; + if (result.index + event.addIndex == 0) { + target.give(target.getCards("he").randomGet(), player); + event.finish(); + } else player.gain(card, "gain2"); + "step 3"; + if (player.isIn() && player.getCards("h").includes(card) && get.type(card, player) == "equip") player.chooseUseTarget(card, true, "nopopup"); + }, + onremove: true, + intro: { content: "已发动过#次" }, + group: "guying_discard", + subSkill: { + discard: { + audio: "guying", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("guying") > 0; + }, + content: function () { + var num = player.countMark("guying"); + player.removeMark("guying", num, false); + player.chooseToDiscard("he", num, true); + }, + }, + }, + }, + muzhen: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + if ( + !player.hasSkill("muzhen1") && + player.countCards("e") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ) + return true; + if ( + !player.hasSkill("muzhen2") && + player.countCards("he") > 1 && + game.hasPlayer(function (current) { + return current != player && current.countCards("e") > 0; + }) + ) + return true; + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = ["将一张装备牌置于其他角色的装备区内并获得其一张手牌", "将两张牌交给一名其他角色并获得其装备区内的一张牌"]; + var choiceList = ui.create.dialog("睦阵:请选择一项", "hidden"); + choiceList.add([ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ]); + return choiceList; + }, + filter: function (button, player) { + if (button.link == 0) + return ( + !player.hasSkill("muzhen1") && + player.countCards("e") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); + return ( + !player.hasSkill("muzhen2") && + player.countCards("he") > 1 && + game.hasPlayer(function (current) { + return current != player && current.countCards("e") > 0; + }) + ); + }, + backup: function (links) { + return { + audio: "muzhen", + filterTarget: [ + function (card, player, target) { + return target.countCards("h") > 0 && target.canEquip(ui.selected.cards[0]); + }, + function (card, player, target) { + return target.countCards("e") > 0; + }, + ][links[0]], + filterCard: [ + function (card, player) { + if (ui.selected.targets.length) return ui.selected.targets[0].canEquip(card); + return game.hasPlayer(function (current) { + return current.countCards("h") > 0 && current.canEquip(card); + }); + }, + true, + ], + selectCard: 1 + links[0], + position: "eh"[links[0]], + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.addTempSkill("muzhen" + cards.length, "phaseUseEnd"); + if (cards.length == 1) { + player.$giveAuto(cards[0], target); + game.delayx(); + target.equip(cards[0]); + } else { + player.give(cards, target); + } + player.gainPlayerCard(target, cards.length == 2 ? "e" : "h", true); + }, + }; + }, + prompt: function () { + return "请选择【睦阵】的牌和目标"; + }, + }, + }, + muzhen1: {}, + muzhen2: {}, + sheyi2: { charlotte: true }, + sheyi: { + audio: 2, + trigger: { global: "damageBegin4" }, + direct: true, + filter: function (event, player) { + return !player.hasSkill("sheyi2") && player != event.player && event.player.hp < player.hp && player.countCards("he") >= Math.max(1, player.hp); + }, + content: function () { + "step 0"; + var num = Math.max(1, player.hp), + target = trigger.player; + player + .chooseCard("he", get.prompt("sheyi", target), "交给其至少" + get.cnNumber(num) + "张牌,防止即将受到的伤害(" + trigger.num + "点)", [num, player.countCards("he")]) + .set( + "goon", + (function () { + if (get.attitude(player, target) < 0) return false; + if (trigger.num < target.hp && get.damageEffect(target, trigger.source, player, trigger.nature) >= 0) return false; + if (trigger.num < 2 && target.hp > trigger.num) return 6 / Math.sqrt(num); + if (target == get.zhu(player)) return 9; + return 8 / Math.sqrt(num); + })() + ) + .set("ai", function (card) { + if (ui.selected.cards.length >= Math.max(1, _status.event.player.hp)) return 0; + if (typeof _status.event.goon == "number") return _status.event.goon - get.value(card); + return 0; + }); + "step 1"; + if (result.bool) { + var target = trigger.player; + player.logSkill("sheyi", target); + player.addTempSkill("sheyi2", "roundStart"); + player.give(result.cards, target); + trigger.cancel(); + } + }, + }, + tianyin: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + var list = []; + player.getHistory("useCard", function (evt) { + list.add(get.type2(evt.card, false)); + }); + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + if (!list.includes(get.type2(ui.cardPile.childNodes[i], false))) return true; + } + return false; + }, + content: function () { + var list = [], + cards = []; + player.getHistory("useCard", function (evt) { + list.add(get.type2(evt.card, false)); + }); + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var type = get.type2(ui.cardPile.childNodes[i], false); + if (!list.includes(type)) { + list.push(type); + cards.push(ui.cardPile.childNodes[i]); + } + } + player.gain(cards, "gain2"); + }, + }, + //王甫赵累 + xunyi: { + audio: 2, + trigger: { + global: ["phaseBefore", "dieAfter"], + player: "enterGame", + }, + direct: true, + filter: function (event, player) { + if (event.name == "die") return event.player == player.storage.xunyi2; + return !player.storage.xunyi2 && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + player.removeSkill("xunyi2"); + player.chooseTarget(lib.filter.notMe, get.prompt2("xunyi")).set("ai", function (target) { + var player = _status.event.player; + return Math.max(1 + get.attitude(player, target) * get.threaten(target), Math.random()); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xunyi", target); + player.storage.xunyi2 = target; + player.addSkill("xunyi2"); + } + }, + }, + xunyi2: { + audio: "xunyi", + trigger: { global: "damageSource" }, + forced: true, + charlotte: true, + filter: function (event, player) { + var list = [player, player.storage.xunyi2]; + return list.includes(event.source) && !list.includes(event.player); + }, + logTarget: function (event, player) { + return player.storage.xunyi2; + }, + content: function () { + (player == trigger.source ? player.storage.xunyi2 : player).draw(); + }, + group: "xunyi3", + mark: true, + intro: { content: "效果目标:$" }, + }, + xunyi3: { + audio: "xunyi", + trigger: { global: "damageEnd" }, + forced: true, + charlotte: true, + filter: function (event, player) { + var list = [player, player.storage.xunyi2]; + return list.includes(event.player) && !list.includes(event.source) && (player == event.player ? player.storage.xunyi2 : player).countCards("he") > 0; + }, + logTarget: function (event, player) { + return player.storage.xunyi2; + }, + content: function () { + (player == trigger.player ? player.storage.xunyi2 : player).chooseToDiscard("he", true); + }, + }, + //狗剩 + reduoji: { + audio: "duoji", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + discard: false, + toStorage: true, + delay: false, + check: function (card) { + return 3 - get.value(card); + }, + content: function () { + "step 0"; + player.$give(cards[0], target, false); + target.markAuto("reduoji", cards); + game.log(player, "将", cards[0], "放在了", target, "的武将牌上"); + "step 1"; + game.delay(); + }, + group: ["reduoji_equip", "reduoji_gain"], + intro: { + content: "cards", + onunmark: "throw", + }, + ai: { + order: 1, + result: { target: -1 }, + }, + subSkill: { + equip: { + audio: "duoji", + trigger: { global: "equipAfter" }, + forced: true, + filter: function (event, player) { + if (player == event.player || !event.player.getStorage("reduoji").length || !event.player.getCards("e").includes(event.card)) return false; + var evt = event.getParent(2); + return evt.name == "useCard" && evt.player == event.player; + }, + logTarget: "player", + content: function () { + "step 0"; + player.gain(trigger.card, trigger.player, "give", "bySelf"); + "step 1"; + var target = trigger.player, + storage = target.getStorage("reduoji"); + if (storage.length) { + var card = storage[0]; + target.$throw(card, 1000); + target.unmarkAuto("reduoji", [card]); + game.log(target, "移去了", card); + game.cardsDiscard(card); + target.draw(); + } + }, + }, + gain: { + audio: "duoji", + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return event.player.getStorage("reduoji").length > 0; + }, + logTarget: "player", + content: function () { + var target = trigger.player, + cards = target.storage.reduoji; + target.$give(cards, player); + player.gain(cards, "fromStorage"); + cards.length = 0; + target.unmarkSkill("reduoji"); + game.delay(); + }, + }, + }, + }, + //SP辛毗 + spyinju: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + 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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player); + "step 1"; + if (!result.bool) target.addSkill("spyinju2"); + }, + ai: { + order: 1, + expose: 0.2, + result: { + target: -1.5, + player: function (player, target) { + if (!target.canUse("sha", player)) return 0; + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.countCards("h", "shan") == 0) return -1; + if (player.hp < 2) return -2; + return -0.5; + }, + }, + threaten: 1.1, + }, + }, + spyinju2: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + charlotte: true, + content: function () { + player.skip("phaseUse"); + player.skip("phaseDiscard"); + player.removeSkill("spyinju2"); + game.log(player, "跳过了出牌阶段"); + game.log(player, "跳过了弃牌阶段"); + }, + mark: true, + intro: { content: "衣襟被拽住了,下个准备阶段开始时跳过出牌阶段和弃牌阶段" }, + }, + spchijie: { + audio: 2, + trigger: { target: "useCardToTarget" }, + usable: 1, + filter: function (event, player) { + return event.player != player && event.targets.length == 1; + }, + check: function (event, player) { + return get.effect(player, event.card, event.player, player) < 0; + }, + content: function () { + "step 0"; + player.judge(function (card) { + if (get.number(card) > 6) return 2; + return 0; + }).judge2 = function (result) { + return result.bool ? true : false; + }; + "step 1"; + if (result.bool) { + trigger.targets.length = 0; + trigger.getParent().triggeredTargets2.length = 0; + trigger.cancel(); + } + }, + }, + //糜夫人 + spcunsi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.isTurnedOver(); + }, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + player.turnOver(); + "step 1"; + var card = get.cardPile(function (card) { + return card.name == "sha"; + }); + if (card) target.gain(card, "gain2"); + "step 2"; + target.addSkill("spcunsi2"); + target.addMark("spcunsi2", 1, false); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + var card = { name: "sha", isCard: true }; + if ( + !target.hasSkillTag("nogain") && + game.hasPlayer(function (current) { + return ( + get.attitude(target, current) < 0 && + !current.hasShan() && + target.canUse(card, current) && + !current.hasSkillTag("filterDamage", null, { + player: target, + card: card, + jiu: true, + }) && + get.effect(current, card, target) > 0 + ); + }) + ) { + return 4; + } + return 0; + }, + }, + }, + }, + spcunsi2: { + charlotte: true, + trigger: { player: "useCard1" }, + firstDo: true, + forced: true, + popup: false, + onremove: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + trigger.baseDamage += player.countMark("spcunsi2"); + player.removeSkill("spcunsi2"); + }, + marktext: "嗣", + intro: { + content: "下一张【杀】的伤害+#", + }, + }, + spguixiu: { + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + if (typeof event.spguixiu == "boolean" && !event.spguixiu) return false; + return player.isTurnedOver(); + }, + content: function () { + player.turnOver(); + }, + group: ["spguixiu_draw", "spguixiu_count"], + subSkill: { + count: { + trigger: { player: "damageBegin2" }, + lastDo: true, + silent: true, + content: function () { + event.spguixiu = player.isTurnedOver(); + }, + }, + draw: { + trigger: { player: "turnOverAfter" }, + forced: true, + filter: function (event, player) { + return !player.isTurnedOver(); + }, + content: function () { + player.draw(); + }, + }, + }, + }, + //那个男人的舅舅 + heji: { + audio: 2, + trigger: { global: "useCardAfter" }, + direct: true, + locked: false, + filter: function (event, player) { + if (event.targets.length != 1 || event.targets[0] == player || event.targets[0].isDead()) return false; + if (event.card.name != "juedou" && (event.card.name != "sha" || get.color(event.card) != "red")) return false; + if (_status.connectMode && player.countCards("h") > 0) return true; + return player.hasSha() || player.hasUsableCard("juedou"); + }, + content: function () { + player + .chooseToUse( + function (card, player, event) { + var name = get.name(card); + if (name != "sha" && name != "juedou") return false; + return lib.filter.cardEnabled.apply(this, arguments); + }, + "合击:是否对" + get.translation(trigger.targets[0]) + "使用一张【杀】或【决斗】?" + ) + .set("logSkill", "heji") + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", trigger.targets[0]) + .set("addCount", false); + }, + group: "heji_gain", + subSkill: { + gain: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.card.isCard && event.getParent(2).name == "heji"; + }, + content: function () { + var card = get.cardPile2(function (card) { + return get.color(card, false) == "red"; + }); + if (card) player.gain(card, "gain2"); + }, + }, + }, + mod: { + aiOrder: function (player, card, num) { + if (get.name(card, player) == "sha" && get.color(card, player) == "red") + return ( + num + + 0.6 * + (_status.event.name == "chooseToUse" && + player.hasHistory("useCard", function (evt) { + return evt.card.name == "sha" && evt.cards.length == 1; + }) + ? 1 + : -1) + ); + }, + }, + }, + //始计篇·智 + refubi: { + audio: "fubi", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + direct: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("refubi"), lib.filter.notMe).set("ai", function (target) { + return 1 + get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("refubi", target); + target.addMark("refubi", 1); + } + }, + intro: { + content: function (info, player) { + var str = "已获得“辅弼”标记"; + if (player.storage.refubi_effect0) { + str += ";本回合使用【杀】的次数上限+"; + str += player.storage.refubi_effect0; + } + if (player.storage.refubi_effect1) { + str += ";本回合的手牌上限+"; + str += player.storage.refubi_effect1 * 3; + } + return str; + }, + }, + marktext: "弼", + group: "refubi_buff", + subSkill: { + buff: { + trigger: { global: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return event.player != player && event.player.hasMark("refubi"); + }, + content: function () { + "step 0"; + var str = get.translation(trigger.player); + player + .chooseControl("cancel2") + .set("choiceList", ["令" + str + "本回合使用【杀】的次数上限+1", "令" + str + "本回合的手牌上限+3"]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + if (get.attitude(player, target) <= 0) return "cancel2"; + if ( + !target.hasJudge("lebu") && + target.countCards("h", function (card) { + return get.name(card, target) == "sha" && target.hasValueTarget(card); + }) > target.getCardUsable("sha") + ) + return 0; + return 1; + }); + "step 1"; + if (result.control != "cancel2") { + var target = trigger.player; + player.logSkill("refubi", target); + var str = "refubi_effect" + result.index; + target.addTempSkill(str); + target.addMark(str, 1, false); + game.log(target, ["本回合使用【杀】的次数上限+1", "本回合的手牌上限+3"][result.index]); + } + }, + }, + effect0: { + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("refubi_effect0"); + }, + }, + }, + effect1: { + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + 3 * player.countMark("refubi_effect1"); + }, + }, + }, + }, + }, + rezuici: { + audio: "zuici", + enable: "chooseToUse", + filter: function (event, player) { + if (event.type == "phase" || (event.type == "dying" && player == event.dying)) return player.isDamaged() && player.countCards("e") > 0; + return false; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("###罪辞###选择废除一个有牌的装备栏,然后回复2点体力,并可移动“辅弼”标记。"); + }, + chooseControl: function (event, player) { + var list = []; + for (var i = 1; i < 6; i++) { + if (player.getEquips(i).length > 0) list.push("equip" + i); + } + list.push("cancel2"); + return list; + }, + check: function (event, player) { + if (player.hp > 1 && player.getDamagedHp() < 2) return "cancel2"; + var cards = player.getCards("e").sort(function (a, b) { + return get.value(a) - get.value(b); + }); + var sub = get.subtype(cards[0], false); + if (player.hp < 1) return sub; + var val = get.value(cards[0]); + if (val < 0) return sub; + return val < 4 ? sub : "cancel2"; + }, + backup: function (result) { + var next = get.copy(lib.skill.rezuicix); + next.position = result.control; + return next; + }, + }, + ai: { + order: 2.7, + result: { + player: 1, + }, + save: true, + skillTagFilter: function (player, tag, arg) { + return player == arg; + }, + }, + }, + rezuicix: { + audio: "zuici", + content: function () { + "step 0"; + player.disableEquip(lib.skill.rezuici_backup.position); + player.recover(2); + "step 1"; + var b1 = false, + b2 = false; + for (var i of game.players) { + if (i.hasMark("refubi")) b1 = true; + else if (i != player) b2 = true; + if (b1 && b2) break; + } + if (b1 && b2) { + player + .chooseTarget("是否转移“辅弼”标记?", function (card, player, target) { + return target != player && !target.hasMark("refubi"); + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + return Math.min(att, att - _status.event.preatt); + }) + .set( + "preatt", + get.attitude( + player, + game.findPlayer(function (current) { + return current.hasMark("refubi"); + }) + ) + ); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "group"); + game.countPlayer(function (current) { + var num = current.countMark("refubi"); + if (num) current.removeMark("refubi", 1, false); + }); + target.addMark("refubi", 1); + } + }, + ai: { + result: { + player: 1, + }, + }, + }, + reshengxi: { + audio: "shengxi", + audioname: ["feiyi"], + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + preHidden: true, + filter: function (event, player) { + return !player.getHistory("sourceDamage").length; + }, + content: function () { + player.draw(2); + }, + }, + fyjianyu: { + initSkill: function (skill) { + if (!lib.skill[skill]) { + lib.skill[skill] = { + marktext: "喻", + intro: { + markcount: () => 1, + content: "指定另一名有“喻”的角色为目标时,其摸一张牌", + }, + }; + lib.translate[skill] = "谏喻"; + lib.translate[skill + "_bg"] = "喻"; + } + }, + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + game.countPlayer(function (current) { + return !current.hasMark("fyjianyu_" + player.playerid); + }) > 1 + ); + }, + round: 1, + filterTarget: function (card, player, target) { + return !target.hasMark("fyjianyu_" + player.playerid); + }, + selectTarget: 2, + content: function () { + var skill = "fyjianyu_" + player.playerid; + game.broadcastAll(lib.skill.fyjianyu.initSkill, skill); + player.addTempSkill("fyjianyu_draw", { player: "phaseBegin" }); + target.addMark(skill, 1); + }, + ai: { + order: 0.1, + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return target == player ? 1 : 0; + if (get.attitude(player, target) < 0) + return ( + -1.6 * + (1 + + target.countCards("h", function (card) { + return target.hasValueTarget(card) && get.effect(player, card, target, target) > 0; + }) * + Math.sqrt(target.countCards("h"))) + ); + return ( + 0.3 * + (1 + + target.countCards("h", function (card) { + return target.hasValueTarget(card) && get.effect(player, card, target, target) > 0; + }) * + Math.sqrt(target.countCards("h"))) + ); + }, + }, + }, + subSkill: { + draw: { + charlotte: true, + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + return event.player != event.target && event.player.hasMark("fyjianyu_" + player.playerid) && event.target.hasMark("fyjianyu_" + player.playerid) && event.target.isIn(); + }, + forced: true, + logTarget: "target", + content: function () { + trigger.target.draw(); + }, + onremove: function (player) { + game.countPlayer(function (current) { + var num = current.countMark("fyjianyu_" + player.playerid); + if (num) current.removeMark("fyjianyu_" + player.playerid); + }); + }, + }, + }, + }, + spwanwei: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + if (player.hasSkill("spwanwei2") || player.hp < 1) return false; + if (event.type == "dying") return event.dying != player; + if (event.type != "phase") return false; + return game.hasPlayer(function (current) { + return current != player && current.isDamaged(); + }); + }, + filterTarget: function (card, player, target) { + if (_status.event.type == "dying") return target == _status.event.dying; + return player != target && target.isDamaged(); + }, + selectTarget: function () { + if (_status.event.type == "dying") return -1; + return 1; + }, + content: function () { + player.addTempSkill("spwanwei2", "roundStart"); + var num = player.hp; + target.recover(Math.max(num + 1, 1 - target.hp)); + player.loseHp(num); + }, + ai: { + save: true, + skillTagFilter: function (player, tag, target) { + return player != target; + }, + expose: 0.5, + order: 6, + result: { + target: function (player, target) { + if (_status.event.type != "dying") return 0; + if (get.attitude(player, target) < 4) return 0; + if (player.countCards("he") < 2 && target != get.zhu(player)) return 0; + return 1; + }, + }, + }, + }, + spwanwei2: {}, + spyuejian: { + mod: { + maxHandcardBase: function (player) { + return player.maxHp; + }, + }, + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + return event.type == "dying" && player == event.dying && player.countCards("he") > 1; + }, + selectCard: 2, + filterCard: true, + position: "he", + check: function (card) { + return 1 / Math.max(0.1, get.value(card)); + }, + content: function () { + player.recover(); + }, + ai: { + save: true, + skillTagFilter: function (player, tag, target) { + return player == target; + }, + order: 1.4, + result: { + player: 1, + }, + }, + }, + spwuku: { + audio: 2, + trigger: { global: "useCard" }, + forced: true, + preHidden: true, + filter: function (event, player) { + if (get.type(event.card) != "equip") return false; + var gz = get.mode() == "guozhan"; + if (gz && event.player.isFriendOf(player)) return false; + return player.countMark("spwuku") < (gz ? 2 : 3); + }, + content: function () { + player.addMark("spwuku", 1); + }, + marktext: "库", + intro: { + content: "mark", + }, + ai: { + combo: "spsanchen", + threaten: 3.6, + }, + }, + spsanchen: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.countMark("spwuku") > 2; + }, + content: function () { + player.awakenSkill("spsanchen"); + player.gainMaxHp(); + player.recover(); + player.addSkills("spmiewu"); + }, + ai: { + combo: "wuku", + }, + derivation: "spmiewu", + }, + spmiewu: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + if (!player.countMark("spwuku") || !player.countCards("hse") || player.hasSkill("spmiewu2")) return false; + for (var i of lib.inpile) { + var type = get.type2(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.type2(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"]); + }, + 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: true, + audio: "spmiewu", + popname: true, + check: function (card) { + return 8 - get.value(card); + }, + position: "hse", + viewAs: { name: links[0][2], nature: links[0][3] }, + precontent: function () { + player.addTempSkill("spmiewu2"); + player.removeMark("spwuku", 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.type2(name); + return (type == "basic" || type == "trick") && player.countMark("spwuku") > 0 && player.countCards("she") > 0 && !player.hasSkill("spmiewu2"); + }, + ai: { + combo: "spwuku", + fireAttack: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + if (!player.countMark("spwuku") || !player.countCards("hse") || player.hasSkill("spmiewu2")) return false; + }, + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + }, + spmiewu2: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return event.skill == "spmiewu_backup"; + }, + content: function () { + player.draw(); + }, + }, + spmiewu_backup: { audio: "spmiewu" }, + qinzheng: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + var num = player.getAllHistory("useCard").length + player.getAllHistory("respond").length; + return num % 3 == 0 || num % 5 == 0 || num % 8 == 0; + }, + content: function () { + var num = player.getAllHistory("useCard").length + player.getAllHistory("respond").length; + var cards = []; + if (num % 3 == 0) { + var card = get.cardPile2(function (card) { + return card.name == "sha" || card.name == "shan"; + }); + if (card) cards.push(card); + } + if (num % 5 == 0) { + var card = get.cardPile2(function (card) { + return ["tao", "jiu", "zong", "xionghuangjiu"].includes(card.name); + }); + if (card) cards.push(card); + } + if (num % 8 == 0) { + var card = get.cardPile2(function (card) { + return ["juedou", "wuzhong", "zengbin", "sadouchengbing", "dongzhuxianji", "tongzhougongji"].includes(card.name); + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + }, + group: "qinzheng_count", + intro: { + content: function (num) { + var str = "
  • 总次数:"; + str += num; + str += "
  • 杀/闪:"; + str += num % 3; + str += "/3
  • 桃/酒:"; + str += num % 5; + str += "/5
  • 决斗/无中生有:"; + str += num % 8; + str += "/8"; + return str; + }, + }, + }, + qinzheng_count: { + trigger: { player: ["useCard1", "respond"] }, + silent: true, + firstDo: true, + noHidden: true, + content: function () { + player.storage.qinzheng = player.getAllHistory("useCard").length + player.getAllHistory("respond").length; + player.markSkill("qinzheng"); + }, + }, + spqiai: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + return get.type(card) != "basic"; + }) > 0 + ); + }, + filterCard: function (card) { + return get.type(card) != "basic"; + }, + position: "he", + filterTarget: lib.filter.notMe, + delay: false, + discard: false, + lose: false, + check: function (card) { + var player = _status.event.player; + if (get.position(card) == "e" && card.name == "jinhe") return 10; + if (player.isHealthy()) return 7 - get.value(card); + return 9 - get.value(card); + }, + content: function () { + "step 0"; + player.give(cards, target, true); + "step 1"; + if (!target.isIn()) { + event.finish(); + return; + } + if (player.isHealthy()) event._result = { index: 1 }; + else { + var str = get.translation(player); + target.chooseControl().set("choiceList", ["令" + str + "回复1点体力", "令" + str + "摸两张牌"]); + } + "step 2"; + if (result.index == 0) player.recover(); + else player.draw(2); + }, + ai: { + order: 8, + result: { + player: 1, + target: function (player, target) { + if (ui.selected.cards.length) { + var card = ui.selected.cards[0]; + var val = get.value(card, target); + if (val < 0) return -1; + if (target.hasSkillTag("nogain")) return 0; + var useval = target.getUseValue(card); + if (val < 1 || useval <= 0) return 0.1; + return Math.sqrt(useval); + } + return 0; + }, + }, + }, + }, + spshanxi: { + audio: 2, + init: function (player) { + game.addGlobalSkill("spshanxi_bj"); + }, + onremove: function (player) { + if (!game.hasPlayer(current => current.hasSkill("spshanxi"), true)) game.removeGlobalSkill("spshanxi_bj"); + }, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && !current.hasMark("spshanxi"); + }); + }, + content: function () { + "step 0"; + var eff = 0; + var target = game.findPlayer(function (current) { + return current != player && current.hasMark("spshanxi"); + }); + if (target) eff = -get.attitude(player, target) / Math.sqrt(Math.max(1, target.hp)); + player + .chooseTarget(get.prompt("spshanxi"), "令一名其他角色获得“檄”", function (card, player, target) { + return target != player && !target.hasMark("spshanxi"); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) / Math.sqrt(Math.max(1, target.hp)) - _status.event.eff; + }) + .set("eff", eff); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("spshanxi", target); + game.countPlayer(function (current) { + if (current == target) current.addMark("spshanxi", 1); + else { + var num = current.countMark("spshanxi"); + if (num > 0) current.removeMark("spshanxi", num); + } + }); + } + }, + marktext: "檄", + intro: { + name2: "檄", + content: "已被设下索命檄文", + }, + group: "spshanxi_suoming", + ai: { threaten: 3.3 }, + }, + spshanxi_suoming: { + audio: "spshanxi", + trigger: { global: "recoverAfter" }, + forced: true, + filter: function (event, player) { + return event.player.hasMark("spshanxi") && event.player.hp > 0; + }, + logTarget: "player", + content: function () { + "step 0"; + if (trigger.player.countCards("he") < 2) event._result = { bool: false }; + else + trigger.player.chooseCard("he", 2, "交给" + get.translation(player) + "两张牌,或失去1点体力").set("ai", function (card) { + return 9 - get.value(card); + }); + "step 1"; + if (!result.bool) trigger.player.loseHp(); + else trigger.player.give(result.cards, player); + }, + }, + spshanxi_bj: { + trigger: { player: "dieAfter" }, + filter: function (event, player) { + for (let i of game.players) { + if (i.hasSkill("spshanxi_suoming")) return false; + } + return true; + }, + silent: true, + forceDie: true, + charlotte: true, + content: function () { + game.removeGlobalSkill("spshanxi_bj"); + }, + ai: { + effect: { + target: function (card, player, target) { + let suoming = game.findPlayer(current => current.hasSkill("spshanxi_suoming")); + if (suoming && _status.event && target === _status.event.dying && target.hasMark("spshanxi")) { + if (target.countCards("he") < 2) return "zerotarget"; + return [1, get.attitude(target, suoming) > 0 ? 0 : -1.2]; + } + }, + }, + }, + }, + shameng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var hs = player.getCards("h"); + if (hs.length < 2) return false; + var red = 0, + black = 0; + for (var i of hs) { + if (get.color(i, player) == "red") red++; + else black++; + if (red > 1 || black > 1) return true; + } + return false; + }, + complexCard: true, + selectCard: 2, + filterCard: function (card, player) { + if (ui.selected.cards.length) return get.color(card, player) == get.color(ui.selected.cards[0], player); + var color = get.color(card, player); + return ( + player.countCards("h", function (cardx) { + return cardx != card && color == get.color(cardx, player); + }) > 0 + ); + }, + filterTarget: lib.filter.notMe, + check: function (card) { + return 7 - get.value(card); + }, + position: "h", + content: function () { + target.draw(2); + player.draw(3); + }, + ai: { + order: 6, + result: { target: 2 }, + }, + }, + fubi: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + direct: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("fubi"), lib.filter.notMe).set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("fubi", target); + target.addSkill("fubi2"); + target.storage.fubi2.push(player); + } + }, + }, + fubi2: { + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + mod: { + maxHandcard: function (player, num) { + var list = player.getStorage("fubi2"); + for (var i of list) { + if (i.isIn()) num += 3; + } + return num; + }, + }, + mark: true, + intro: { content: "若$存活,则手牌上限+3" }, + }, + zuici: { + trigger: { player: "dying" }, + direct: true, + filter: function (event, player) { + return player.countCards("e") > 0; + }, + content: function () { + "step 0"; + var list = []; + var cards = player.getCards("e"); + for (var i of cards) list.push(get.subtype(i)); + list.push("cancel2"); + player.chooseControl(list).set("prompt", get.prompt2("zuici")); + "step 1"; + if (result.control != "cancel2") { + player.disableEquip(result.control); + } else event.finish(); + "step 2"; + if (player.hp < 1) player.recover(1 - player.hp); + }, + }, + jianzhan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return lib.skill.jianzhan.filterTarget(null, player, current); + }); + }, + filterTarget: function (card, player, target) { + if (target == player) return false; + if (ui.selected.targets.length) { + var targetx = ui.selected.targets[0]; + return targetx != target && targetx.countCards("h") > target.countCards("h") && targetx.inRange(target); + } + var num = target.countCards("h"); + return game.hasPlayer(function (current) { + return current != target && current != player && current.countCards("h") < num && target.inRange(current); + }); + }, + selectTarget: 2, + complexTarget: true, + targetprompt: ["出杀", "被出杀"], + multitarget: true, + content: function () { + "step 0"; + if (!targets[0].canUse("sha", targets[1])) event._result = { index: 1 }; + else + targets[0] + .chooseControl() + .set("choiceList", ["视为对" + get.translation(targets[1]) + "使用一张【杀】", "令" + get.translation(player) + "摸一张牌"]) + .set("ai", function () { + var evt = _status.event.getParent(); + var eff = get.effect(evt.targets[1], { name: "sha", isCard: true }, evt.targets[0], evt.targets[0]); + if (eff > 0) return 0; + if (eff < 0 || get.attitude(evt.targets[0], evt.player) > 1) return 1; + return 0; + }); + "step 1"; + if (result.index == 0) targets[0].useCard({ name: "sha", isCard: true }, targets[1], false); + else player.draw(); + }, + ai: { + result: { + target: function (player, target) { + if (ui.selected.targets.length) { + var from = ui.selected.targets[0]; + return get.effect(target, { name: "sha" }, from, target); + } + var effs = [0, 0]; + game.countPlayer(function (current) { + if (current != target && target.canUse("sha", current)) { + var eff = get.effect(current, { name: "sha" }, target, target); + if (eff > effs[0]) effs[0] = eff; + if (eff < effs[1]) effs[1] = eff; + } + }); + return effs[get.attitude(player, target) > 0 ? 0 : 1]; + }, + }, + order: 8.5, + expose: 0.2, + }, + }, + duoji: { + audio: 2, + enable: "phaseUse", + limited: true, + filter: function (event, player) { + return ( + player.countCards("h") > 1 && + game.hasPlayer(function (current) { + return current != player && current.countGainableCards(player, "e") > 0; + }) + ); + }, + filterCard: true, + selectCard: 2, + filterTarget: function (card, player, target) { + return target != player && target.countGainableCards(player, "e") > 0; + }, + check: function (card) { + return 8 - get.value(card); + }, + position: "h", + skillAnimation: true, + animationColor: "metal", + content: function () { + player.awakenSkill("duoji"); + var cards = target.getGainableCards(player, "e"); + player.gain(cards, target, "give", "bySelf"); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + var num = 0, + es = target.getCards("e"), + val = 0; + for (var i of es) { + num += get.value(i, target); + } + for (var i of ui.selected.cards) { + val += get.value(i, player); + } + if (Math.abs(num) > val) return -num; + return 0; + }, + }, + }, + }, +}; + +export default skills; diff --git a/character/shiji/sort.js b/character/shiji/sort.js new file mode 100644 index 000000000..ca6733d00 --- /dev/null +++ b/character/shiji/sort.js @@ -0,0 +1,17 @@ +const characterSort = { + mobile_shijizhi: ["sp_wangcan", "sp_chenzhen", "sp_sunshao", "sp_xunchen", "luotong", "sp_duyu", "sp_bianfuren", "feiyi"], + mobile_shijixin: ["wujing", "sp_mifuren", "sp_xinpi", "wangling", "wangfuzhaolei", "zhouchu", "sp_kongrong", "sp_yanghu"], + mobile_shijiren: ["caizhenji", "xiangchong", "sp_huaxin", "sp_xujing", "zhangzhongjing", "sp_zhangwen", "liuzhang", "qiaogong"], + mobile_shijiyong: ["db_wenyang", "sp_chendong", "yuanhuan", "sp_zongyu", "sp_wangshuang", "sunyi", "sp_gaolan", "sp_huaman"], + mobile_shijiyan: ["sp_cuiyan", "sp_zhangchangpu", "sp_jiangwan", "sp_jiangqing", "sp_lvfan", "sp_huangfusong", "sp_zhujun", "liuba"], +}; + +const characterSortTranslate = { + mobile_shijiren: "始计篇·仁", + mobile_shijizhi: "始计篇·智", + mobile_shijixin: "始计篇·信", + mobile_shijiyong: "始计篇·勇", + mobile_shijiyan: "始计篇·严", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/shiji/translate.js b/character/shiji/translate.js new file mode 100644 index 000000000..ae6c651d6 --- /dev/null +++ b/character/shiji/translate.js @@ -0,0 +1,332 @@ +const translates = { + liuba_prefix: "手杀", + sp_zhujun_prefix: "手杀", + sp_huangfusong_prefix: "手杀", + sp_zhangchangpu_prefix: "手杀", + sp_cuiyan_prefix: "手杀", + sp_huaman_prefix: "手杀", + sp_gaolan_prefix: "手杀", + sunyi_prefix: "手杀", + sp_wangshuang_prefix: "手杀", + sp_zongyu_prefix: "手杀", + db_wenyang_prefix: "手杀", + sp_yanghu_prefix: "手杀", + sp_zhangwen_prefix: "手杀", + sp_xujing_prefix: "手杀", + sp_huaxin_prefix: "手杀", + zhouchu_prefix: "手杀", + sp_mifuren_prefix: "手杀", + sp_xinpi_prefix: "手杀", + sp_bianfuren_prefix: "手杀", + sp_duyu_prefix: "手杀", + luotong_prefix: "手杀", + sp_wangcan_prefix: "手杀", + sp_sunshao_prefix: "手杀", + sp_xunchen_prefix: "手杀", + sp_kongrong_prefix: "手杀", + + sp_wangcan: "手杀王粲", + spqiai: "七哀", + spqiai_info: "出牌阶段限一次,你可以将一张非基本牌交给一名其他角色。然后其选择一项:①你回复1点体力。②你摸两张牌。", + spshanxi: "善檄", + spshanxi_suoming: "善檄", + spshanxi_info: "出牌阶段开始时,你可令一名其他角色获得“檄”标记并清除场上已有的其他“檄”标记(若有)。有“檄”标记的角色回复体力时,若其体力值大于0,则其需选择一项:①交给你两张牌。②失去1点体力。", + sp_chenzhen: "陈震", + shameng: "歃盟", + shameng_info: "出牌阶段限一次,你可弃置两张颜色相同的手牌并选择一名其他角色。其摸两张牌,然后你摸三张牌。", + sp_sunshao: "手杀孙邵", + fubi: "辅弼", + fubi2: "辅弼", + fubi_info: "游戏开始时,你可选择一名其他角色。该角色的手牌上限于你死亡前+3。", + zuici: "罪辞", + zuici_info: "当你进入濒死状态时,你可废除你的一个不为空的装备栏,然后将体力值回复至1点。", + sp_xunchen: "手杀荀谌", + jianzhan: "谏战", + jianzhan_info: "出牌阶段限一次,你可选择一名其他角色A和其攻击范围内的另一名手牌数小于其的角色B。A选择一项:①视为对B使用一张【杀】。②令你摸一张牌。", + duoji: "夺冀", + duoji_info: "限定技,出牌阶段,你可弃置两张手牌并选择一名装备区有牌的其他角色。你获得其装备区里的所有牌。", + binglinchengxiax: "兵临城下", + binglinchengxiax_info: "出牌阶段,对一名其他角色使用。你亮出牌堆顶的四张牌,依次对其使用其中所有的【杀】,然后将剩余的牌置于牌堆顶。", + mjweipo: "危迫", + mjweipo_effect: "危迫", + mjweipo_remove: "危迫", + mjweipo_info: "出牌阶段限一次。你可以选择一个智囊或【兵临城下】,令一名没有〖危迫〗效果的角色获得如下一次性效果直到你下回合开始:其可于出牌阶段弃置一张【杀】,并获得一张你选择的牌。", + mjchenshi: "陈势", + mjchenshi_player: "陈势", + mjchenshi_target: "陈势", + mjchenshi_info: "当有角色使用【兵临城下】指定第一个目标后,其可交给你一张牌,并将牌堆的顶三张牌中所有不为【杀】的牌置入弃牌堆;当有角色成为【兵临城下】的目标后,其可交给你一张牌,然后将牌堆顶三张牌中所有的【杀】置入弃牌堆。", + mjmouzhi: "谋识", + mjmouzhi_info: "锁定技,当你受到伤害时,若伤害渠道对应的牌和你上次受到的伤害花色相同,则你防止此伤害。", + luotong: "手杀骆统", + qinzheng: "勤政", + qinzheng_info: "锁定技,当你使用或打出牌时,若你本局游戏内使用或打出过的牌数和:为3的倍数,你从牌堆中获得一张【杀】或【闪】;为5的倍数,你从牌堆中获得一张【桃】或【酒】;为8的倍数,你从牌堆中获得一张【决斗】或【无中生有】(可获得对应的衍生替换牌)。", + sp_duyu: "手杀杜预", + spwuku: "武库", + spwuku_info: "锁定技,当有角色使用装备牌时,若你的“武库”数小于3,则你获得一个“武库”。", + spwuku_info_guozhan: "锁定技,当有其他势力的角色使用装备牌时,若你的“武库”数小于2,则你获得一个“武库”。", + spsanchen: "三陈", + spsanchen_info: "觉醒技,结束阶段,若你的“武库”数大于2,则你加1点体力上限并回复1点体力,然后获得〖灭吴〗。", + spmiewu: "灭吴", + spmiewu2: "灭吴", + spmiewu_backup: "灭吴", + spmiewu_info: "每回合限一次。你可弃置一枚“武库”并将一张牌当做任意基本牌或锦囊牌使用,然后摸一张牌。", + sp_bianfuren: "手杀卞夫人", + spwanwei: "挽危", + spwanwei_info: "每轮累计限一次。①出牌阶段,你可选择一名其他角色。②当有其他角色处于濒死状态时。你可令该角色回复X+1点体力(至少回复至1),然后你失去X点体力。(X为你的体力值)", + spyuejian: "约俭", + spyuejian_info: "锁定技,你的手牌上限基数等于你的体力上限。当你处于濒死状态时,你可弃置两张牌,然后回复1点体力。", + feiyi: "手杀费祎", + feiyi_prefix: "手杀", + reshengxi: "生息", + reshengxi_info: "结束阶段,若你于本回合内未造成过伤害,则你可摸两张牌。", + fyjianyu: "谏喻", + fyjianyu_info: "每轮限一次。出牌阶段,你可选择两名角色,令这些角色获得“喻”直到你的下回合开始。当一名有“喻”的角色A使用牌指定另一名有“喻”的角色B为目标时,你令B摸一张牌。", + mjshengxi: "生息", + mjshengxi_info: "准备阶段,你可以获得一张【调剂盐梅】;结束阶段,若你本回合使用过牌且未造成伤害,则你可以获得一张智囊或摸一张牌。", + mjkuanji: "宽济", + mjkuanji_info: "每回合限一次。当你因弃置而失去牌后,你可令一名其他角色获得其中的一张牌,然后你摸一张牌。", + tiaojiyanmei: "调剂盐梅", + tiaojiyanmei_info: "出牌阶段,对两名手牌数不均相同的其他角色使用。若目标角色于此牌使用准备工作结束时的手牌数大于此时所有目标的平均手牌数,其弃置一张牌。若小于则其摸一张牌。此牌使用结束后,若所有目标角色的手牌数均相等,则你可令一名角色获得所有因执行此牌效果而弃置的牌。", + refubi: "辅弼", + refubi_info: "游戏开始时,你可令一名其他角色获得“辅弼”标记。有“辅弼”标记的角色的准备阶段开始时,你可选择一项:①令其本回合使用【杀】的次数上限+1。②令其本回合的手牌上限+3。", + rezuici: "罪辞", + rezuici_backup: "罪辞", + rezuici_info: "出牌阶段,或当你处于濒死状态时,你可以废除一个有牌的装备栏并回复2点体力,然后可以移动“辅弼”标记。", + mjdingyi: "定仪", + mjdingyi_info: "游戏开始时,你选择一个效果(相同效果不可叠加)并令全场角色获得之:①摸牌阶段额定摸牌数+1。②手牌上限+2。③攻击范围+1。④脱离濒死状态时回复1点体力。", + mjzuici: "罪辞", + mjzuici_info: "当你受到伤害后,你可令伤害来源失去〖定仪〗效果,然后令其从牌堆中获得一张由你选择的智囊。", + mjfubi: "辅弼", + mjfubi_info: "每轮限一次。出牌阶段,你可选择一项:①更换一名角色的〖定仪〗效果。②弃置一张牌并令一名角色的〖定仪〗效果翻倍直到你的下回合开始。", + wujing: "吴景", + heji: "合击", + heji_info: "当有角色使用的【决斗】或红色【杀】结算完成后,若此牌对应的目标数为1,则你可以对相同的目标使用一张【杀】或【决斗】(无距离和次数限制)。若你以此法使用的牌不为转化牌,则你从牌堆中随机获得一张红色牌。", + liubing: "流兵", + liubing_info: "锁定技。①你于出牌阶段使用的第一张非虚拟【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。", + sp_mifuren: "手杀糜夫人", + spcunsi: "存嗣", + spcunsi2: "存嗣", + spcunsi_info: "出牌阶段限一次,你可将武将牌翻至背面并选择一名其他角色。其从牌堆或弃牌堆中获得一张【杀】,且下一张杀的伤害值基数+1。", + spguixiu: "闺秀", + spguixiu_info: "锁定技,当你受到伤害后,若你的武将牌背面朝上,则你将武将牌翻至正面。当你的武将牌从背面翻至正面时,你摸一张牌。", + qingyu: "清玉", + qingyu_info: "使命技。①当你受到伤害时,你弃置两张牌,然后防止此伤害。②使命:准备阶段,若你的体力值等于体力上限且你没有手牌,则你获得〖悬存〗。③失败:当你进入濒死状态时,你减1点体力上限。", + xuancun: "悬存", + xuancun_info: "其他角色的回合结束时,若你的手牌数小于体力值,则你可以令其摸X张牌(X为你的体力值与手牌数之差且至多为2)。", + xinlirang: "礼让", + xinlirang_info: "①其他角色的摸牌阶段开始时,若你没有“谦”标记,则你可以获得一枚“谦”标记。若如此做,其额定摸牌数+2,且本回合的弃牌阶段开始时,你可以获得其弃置的至多两张牌。②摸牌阶段开始时,若你有“谦”标记,则你跳过此摸牌阶段并移除“谦”标记。", + xinmingshi: "名仕", + xinmingshi_info: "锁定技,当你受到伤害后,若你有“谦”标记,则伤害来源弃置一张牌。若此牌为:黑色:你获得之。红色,你回复1点体力。", + sp_xinpi: "手杀辛毗", + spyinju: "引裾", + spyinju2: "引裾", + spyinju_info: "出牌阶段限一次,你可令一名其他角色选择一项:①对你使用一张【杀】(无距离限制)。②其下个回合的准备阶段开始时,跳过出牌阶段和弃牌阶段。", + spchijie: "持节", + spchijie_info: "每回合限一次。当你成为其他角色使用牌的唯一目标时,你可判定。若结果大于6,则你取消此牌的所有目标。", + reduoji: "夺冀", + reduoji_info: "出牌阶段限一次,你可将一张牌置于其他角色的武将牌上,称为“冀”。当有装备牌因使用而进入一名角色的装备区后,若该角色有“冀”且其为使用者,则你获得此装备牌,其移去一个“冀”并摸一张牌。一名其他角色的回合结束后,若其有“冀”,则你获得其的所有“冀”。", + wangling: "手杀王淩", + wangling_prefix: "手杀", + mouli: "谋立", + mouli_info: "出牌阶段限一次,你可以将一张手牌交给一名其他角色,其获得如下效果直到你的下回合开始:其可以将黑色牌当做【杀】,红色牌当做【闪】使用。其第一次触发“使用【杀】/【闪】结算完成后”的时机时,你摸三张牌。", + zifu: "自缚", + zifu_info: "锁定技,当有角色死亡时,若其因你获得的“谋立”效果未过期,则你减2点体力上限。", + xingqi: "星启", + xingqi_info: "①当你使用牌时,若此牌不为延时锦囊牌且你没有同名的“备”,则你获得一枚与此牌名称相同的“备”。②结束阶段,你可移去一枚“备”,然后从牌堆中获得一张与此“备”名称相同的牌。", + xinzifu: "自缚", + xinzifu_info: "锁定技。出牌阶段结束时,若你本阶段内未使用牌,则你移去所有“备”且本回合的手牌上限-1。", + mibei: "秘备", + mibei_info: "使命技。①使命:当你使用的牌结算完成后,若你的“备”中包含的基本牌,锦囊牌,装备牌数量均大于1,则你从牌堆中获得这三种类型的牌各一张并获得技能“谋立”。②失败:结束阶段开始时,若你没有“备”,且你于本回合的准备阶段开始时也没有“备”,则你减1点体力上限。", + xinmouli: "谋立", + xinmouli_info: "出牌阶段限一次,你可以指定一名其他角色。其移去你的一个“备”,然后从牌堆中获得一张与此“备”名称相同的牌。", + wangfuzhaolei: "王甫赵累", + xunyi: "殉义", + xunyi2: "殉义", + xunyi3: "殉义", + xunyi_info: "游戏开始时,或当上一个拥有“殉义”效果的角色死亡后,你可以选择一名角色获得如下效果:当其/你对二者之外的角色造成伤害后,你/其摸一张牌;当其/你受到二者之外的角色造成的伤害后,你/其弃置一张牌。", + zhouchu: "手杀周处", + xianghai: "乡害", + xianghai_info: "锁定技,其他角色的手牌上限-1。你手牌区的装备牌均视为【酒】。", + chuhai: "除害", + chuhai_info: "出牌阶段限一次,你可以摸一张牌,然后和一名其他角色拼点。若你赢,则你观看其手牌,并从牌堆/弃牌堆中获得其手牌中包含的类型的牌各一张,且当你于此阶段内对其造成伤害后,你将牌堆/弃牌堆中的一张装备牌置于你的一个空置装备栏内。", + rechuhai: "除害", + rechuhai_info: "使命技。①出牌阶段限一次,你可以摸一张牌,然后和一名其他角色拼点。若你赢,则你观看其手牌,并从牌堆/弃牌堆中获得其手牌中包含的类型的牌各一张,且当你于此阶段内对其造成伤害后,你将牌堆/弃牌堆中的一张装备牌置于你的一个空置装备栏内。②当你因发动〖除害①〗而展示拼点牌时,你令此牌的点数+X(X=(4-你装备区的牌数))。③使命:当有装备牌进入你的装备区后,若你的装备区内有至少三张牌,则你将体力值回复至上限,失去〖乡害〗并获得〖彰名〗。④失败:当你因发动〖除害①〗发起的拼点没赢时,若你的最终点数不大于6,则你触发使命失败分支。", + zhangming: "彰名", + zhangming_info: "锁定技。①你使用的♣牌不能被其他角色响应。②每回合限一次,当你对其他角色造成伤害后,你随机弃置其一张手牌,然后你从牌堆或弃牌堆中获得与其展示牌类型不同类型的牌各一张(若其没有手牌,则你改为从牌堆或弃牌堆中获得所有类型牌各一张),且以此法得到的牌不计入本回合的手牌上限。", + sp_kongrong: "手杀孔融", + spmingshi: "名士", + spmingshi_info: "锁定技,当你受到1点伤害后,伤害来源弃置一张牌。", + splirang: "礼让", + splirang_info: "出牌阶段限一次,你可以弃置所有手牌,然后将其中的至多X张牌交给一名其他角色(X为你的体力值),之后摸一张牌。", + caizhenji: "蔡贞姬", + sheyi: "舍裔", + sheyi_info: "每轮限一次。当有体力值小于你的其他角色受到伤害时,你可以交给其至少X张牌并防止此伤害(X为你的体力值)。", + tianyin: "天音", + tianyin_info: "锁定技,结束阶段开始时,你从牌堆中获得每种本回合未使用过的类型的牌各一张。", + xiangchong: "向宠", + guying: "固营", + guying_info: "锁定技。每回合限一次,当你于回合外因使用/打出/弃置而失去牌后,若牌数为1,则你获得一枚“固”并令当前回合角色选择一项:①随机交给你一张牌。②令你获得本次失去的牌,若为装备牌,则你使用之。准备阶段开始时,你移去所有“固”并弃置等量的牌。", + muzhen: "睦阵", + muzhen_backup: "睦阵", + muzhen_info: "出牌阶段各限一次。①你可以将两张牌交给一名装备区内有牌的其他角色,然后获得其装备区内的一张牌。②你可以将装备区内的一张牌置于其他角色的装备区内,然后获得其一张手牌。", + sp_huaxin: "手杀华歆", + hxrenshi: "仁仕", + hxrenshi_info: "出牌阶段每名角色限一次。你可以将一张手牌交给一名其他角色。", + debao: "德保", + debao_info: "锁定技,当其他角色获得你的牌后,若你的“仁”数小于你的体力上限,则你将牌堆顶的一张牌置于你的武将牌上,称为“仁”。准备阶段,你获得所有“仁”。", + buqi: "不弃", + buqi_info: "锁定技,当有角色进入濒死状态时,若你的“仁”数大于1,则你移去两张“仁”并令其回复1点体力。一名角色死亡后,你将所有“仁”置入弃牌堆。", + yuanqing: "渊清", + yuanqing_info: "锁定技,出牌阶段结束时,你随机将弃牌堆中你本阶段使用过的牌类型的各一张牌置于仁库中。", + shuchen: "疏陈", + shuchen_info: "锁定技,当有角色进入濒死状态时,若仁库中的牌数大于三,则你获得仁库中的所有牌,然后其回复1点体力。", + sp_xujing: "手杀许靖", + boming: "博名", + boming_info: "出牌阶段限两次,你可以将一张牌交给一名其他角色。结束阶段,若你本回合以此法失去了两张以上的牌,则你摸一张牌。", + ejian: "恶荐", + ejian_info: "锁定技,每名角色限一次。当有其他角色因〖博名〗而得到了你的牌后,若其拥有与此牌类型相同的其他牌,则你令其选择一项:①受到1点伤害。②展示所有手牌,并弃置所有与此牌类别相同的牌。", + zhangzhongjing: "张机", + jishi: "济世", + jishi_info: "锁定技。①当你使用的牌结算完成后,若你未因此牌造成过伤害,则你将此牌对应的所有实体牌置于仁库中。②当有牌不因溢出而离开仁库时,你摸一张牌。", + liaoyi: "疗疫", + liaoyi_info: "其他角色的回合开始时,若其:①手牌数小于体力值且仁库内牌数大于等于X,则你可令其从仁库中获得X张牌;②手牌数大于体力值,则你可以令其将X张牌置于仁库中(X为其手牌数与体力值之差且至多为4)。", + xinliaoyi: "疗疫", + xinliaoyi_info: "其他角色的回合开始时,你可选择一项:①令其从仁库中获得一张牌。②若其手牌数大于体力值,则令其将X张手牌置入仁库(X为其手牌数与体力值之差)。", + binglun: "病论", + binglun_info: "出牌阶段限一次,你可以将仁库中的一张牌置于弃牌堆并选择一名角色。该角色选择一项:①摸一张牌。②于其下回合结束时回复1点体力。", + sp_zhangwen: "手杀张温", + gebo: "戈帛", + gebo_info: "锁定技,当有角色回复体力后,你将牌堆顶的一张牌置入仁库。", + spsongshu: "颂蜀", + spsongshu_info: "其他角色的摸牌阶段开始时,若其体力值大于你且仁库内有牌,则你可以令其放弃摸牌。其改为获得X张仁(X为你的体力值且至多为5),且本回合内不能使用牌指定其他角色为目标。", + liuzhang: "刘璋", + xiusheng: "休生", + xiusheng_info: "锁定技。准备阶段,你将所有“生”置入弃牌堆,然后摸X张牌,并将等量的牌置于武将牌上,称为“生”(X为你因〖引狼〗而选择的势力的存活角色数)。", + yinlang: "引狼", + yinlang_info: "①每轮限一次。回合开始时,你选择场上的一个势力。②一名角色的出牌阶段开始时,若其势力与你选择的势力相同,则其选择一项:1.获得你的一张“生”,然后其本回合使用牌时不能指定你以外的角色为目标。2.你获得一张“生”。", + huaibi: "怀璧", + huaibi_info: "主公技,锁定技。你的手牌上限+X(X为你因〖引狼〗而选择的势力的存活角色数)。", + jutu: "据土", + jutu_info: "锁定技,准备阶段,你获得所有你武将牌上的“生”,然后摸X+1张牌,然后将X张牌置于你的武将牌上,称为“生”(X为你因〖邀虎〗选择势力的角色数量)。", + yaohu: "邀虎", + yaohu_info: "每轮限一次,你的回合开始时,你须选择场上一个势力。该势力其他角色的出牌阶段开始时,其获得你的一张“生”,然后其须选择一项:①对你指定的另一名的其他角色使用一张【杀】(无距离和次数限制);②交给你两张牌。", + rehuaibi: "怀璧", + rehuaibi_info: "主公技,锁定技,你的手牌上限+X(X为你因〖邀虎〗选择势力的角色数量)。", + qiaogong: "桥公", + yizhu: "遗珠", + yizhu_info: "①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中(X为角色数,选择牌的牌名对其他角色可见)。②其他角色使用“遗珠”牌指定唯一目标时,你可以取消此目标,然后你清除对应的“遗珠”标记。", + luanchou: "鸾俦", + luanchou_info: "出牌阶段限一次,你可令两名角色获得“姻”标记并清除原有标记。拥有“姻”标记的角色视为拥有技能〖共患〗。", + gonghuan: "共患", + gonghuan_info: "锁定技。每回合限一次,一名其他角色受到伤害时,若其拥有“姻”标记且其体力值小于你,则你将伤害转移给自己。此伤害结算结束后,你与其移去“姻”标记。", + sp_yanghu: "手杀羊祜", + mingfa: "明伐", + mingfa_info: "①结束阶段,你可展示一张牌并记录为“明伐”。②出牌阶段开始时,若“明伐”牌在你的手牌区或装备区,则你可以使用“明伐”牌与一名其他角色拼点。若你赢:你获得对方一张牌并从牌堆中获得一张点数等于“明伐”牌牌面点数-1的牌。若你没赢:你本回合不能使用牌指定其他角色为目标。③你的拼点牌亮出后,你令此牌的点数+2。", + rongbei: "戎备", + rongbei_info: "限定技。出牌阶段,你可选择一名有空装备栏的角色。系统为该角色的每个空装备栏选择一张装备牌,然后该角色使用之。", + db_wenyang: "手杀文鸯", + dbquedi: "却敌", + dbquedi_info: "每回合限一次。当你使用【杀】或【决斗】指定唯一目标后,你可选择:①获得目标角色的一张手牌。②弃置一张基本牌,并令此牌的伤害值基数+1。③背水:减1点体力上限,然后依次执行上述所有选项。", + dbzhuifeng: "椎锋", + dbzhuifeng_info: "魏势力技。每回合限两次,你可以失去1点体力并视为使用一张【决斗】(你死亡后仍然结算)。当你因此【决斗】而受到伤害时,你防止此伤害并令此技能失效直到出牌阶段结束。", + dbchongjian: "冲坚", + dbchongjian_backup: "冲坚", + dbchongjian_info: "吴势力技。你可以将一张装备牌当做一种【杀】(无距离限制且无视防具)或【酒】使用。当你以此法使用【杀】造成伤害后,你获得目标角色装备区内的X张牌(X为伤害值)。", + dbchoujue: "仇决", + dbchoujue_info: "锁定技。当你杀死其他角色后,你加1点体力上限并摸两张牌,然后本回合发动【却敌】的次数上限+1。", + sp_chendong: "手杀陈武董袭", + sp_chendong_prefix: "手杀", + spyilie: "毅烈", + spyilie_info: "出牌阶段开始时,你可选择:①本阶段内使用【杀】的次数上限+1。②本回合内使用【杀】被【闪】抵消时,摸一张牌。③背水:失去1点体力,然后依次执行上述所有选项。", + spfenming: "奋命", + spfenming_info: "出牌阶段限一次,你可以选择一名体力值不大于你的角色。若其:未横置,其横置;已横置,你获得其一张牌。", + yuanhuan: "袁涣", + qingjue: "请决", + qingjue_info: "每轮限一次。当有其他角色A使用牌指定另一名体力值小于A且不处于濒死状态的其他角色B为目标时,你可以摸一张牌,然后与A拼点。若你赢,你取消此目标。若你没赢,你将此牌的目标改为自己。", + fengjie: "奉节", + fengjie2: "奉节", + fengjie_info: "锁定技,准备阶段开始时,你选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸四张)或弃置至与其体力值相等。", + sp_zongyu: "手杀宗预", + zhibian: "直辩", + zhibian_info: "准备阶段,你可以和一名其他角色拼点。若你赢,你可选择:①将其装备区/判定区内的一张牌移动到你的对应区域。②回复1点体力。③背水:跳过下个摸牌阶段,然后依次执行上述所有选项;若你没赢,你失去1点体力。", + yuyan: "御严", + yuyan_info: "锁定技。当你成为非转换的【杀】的目标时,若使用者的体力值大于你且此【杀】有点数,则你令使用者选择一项:①交给你一张点数大于此【杀】的牌。②取消此目标。", + sp_wangshuang: "手杀王双", + yiyong: "异勇", + yiyong_info: "当你受到其他角色造成的渠道为【杀】的伤害后,若你的装备区内有武器牌,则你可以获得此【杀】对应的所有实体牌,然后将这些牌当做【杀】对伤害来源使用(无距离限制)。若其装备区内没有武器牌,则此伤害+1。", + shanxie: "擅械", + shanxie_info: "①出牌阶段限一次,你可从牌堆中获得一张武器牌。若牌堆中没有武器牌,则你改为随机获得一名角色装备区内的一张武器牌。②当其他角色使用【闪】响应你使用的【杀】时,若此【闪】没有点数或点数不大于你攻击范围的二倍,则你令此【闪】无效。", + shanxie_info_old: "①出牌阶段限一次,你可选择一项:⒈从牌堆中获得一张武器牌。⒉获得一名其他角色装备区内的一张武器牌并使用,然后其将一张手牌当做【杀】对你使用。②当其他角色使用【闪】响应你使用的【杀】时,若此【闪】没有点数或点数不大于你攻击范围的二倍,则你令此【闪】无效。", + sunyi: "手杀孙翊", + zaoli: "躁厉", + zaoli_info: "锁定技。①你不能于回合内使用或打出你手牌中不为本回合得到的牌。②当你使用或打出手牌时,你获得一个“厉”(至多4个)。③回合开始时,若你有“厉”,则你移去所有“厉”并弃置任意张牌,然后摸X+Y张牌。若X大于2,你失去1点体力(X为你移去的标记数,Y为你弃置的牌数)。", + sp_gaolan: "手杀高览", + spjungong: "峻攻", + spjungong_info: "出牌阶段,你可失去X+1点体力或弃置X+1张牌,视为对一名其他角色使用【杀】(不计入次数和距离限制,X为你本回合内发动过〖峻攻〗的次数)。若你因此【杀】造成了伤害,则你令此技能失效直到回合结束。", + spdengli: "等力", + spdengli_info: "当你使用【杀】指定目标后,或成为【杀】的目标后,若使用者和目标的体力值相等,则你摸一张牌。", + sp_huaman: "手杀花鬘", + spxiangzhen: "象阵", + spxiangzhen_info: "锁定技。①【南蛮入侵】对你无效。②当有角色使用的【南蛮入侵】结算结束后,若有角色因此牌受到过伤害,则你和使用者各摸一张牌。", + spfangzong: "芳踪", + spfangzong_info: "锁定技。①你不能于回合内使用具有伤害标签的牌指定攻击范围内的角色为目标。②攻击范围内包含你的角色不能使用具有伤害标签的牌指定你为目标。③结束阶段,你将手牌摸至X张(X为场上存活人数且至多为8)。", + spxizhan: "嬉战", + spxizhan_info: "其他角色的回合开始时,你须选择一项:①失去1点体力。②弃置一张牌并令〖芳踪〗于本回合失效,然后若此牌的花色为:♠,其视为使用一张【酒】;♥,你视为使用一张【无中生有】;♣,你视为对其使用【铁索连环】;♦:你视为对其使用火【杀】(无距离限制)。", + sp_cuiyan: "手杀崔琰", + spyajun: "雅俊", + spyajun_info: "①摸牌阶段,你令额定摸牌数+1。②出牌阶段开始时,你可以用一张本回合得到的牌与其他角色拼点。若你赢,则你可将其中一张拼点牌置于牌堆顶。若你没赢,你本回合的手牌上限-1。", + spzundi: "尊嫡", + spzundi_info: "出牌阶段限一次,你可以弃置一张手牌并选择一名角色,然后你进行判定。若结果为:黑色,其摸三张牌;红色,其可以移动场上的一张牌。", + sp_zhangchangpu: "手杀张昌蒲", + spdifei: "抵诽", + spdifei_info: "锁定技。每回合限一次,当你受到伤害后,你摸一张牌或弃置一张手牌,然后展示所有手牌。若此伤害的渠道为没有花色的牌或你的手牌中没有与此牌花色相同的牌,则你回复1点体力。", + spyanjiao: "严教", + spyanjiao_info: "出牌阶段限一次。你可以将手牌中一种花色的所有牌交给一名其他角色,对其造成1点伤害。然后你于自己的下回合开始时摸等量的牌。", + sp_jiangwan: "蒋琬", + spzhenting: "镇庭", + spzhenting_info: "每回合限一次。当你攻击范围内的角色成为【杀】或延时锦囊的目标时,若你不是此牌的使用者且不是此牌的目标,则你可以将此目标改为自己。然后你选择一项:①弃置使用者的一张手牌。②摸一张牌。", + spjincui: "尽瘁", + spjincui_info: "限定技。出牌阶段,你可以和一名其他角色交换位置,然后失去X点体力(X为你的体力值)。", + sp_jiangqing: "蒋钦", + spjianyi: "俭衣", + spjianyi_info: "锁定技。其他角色的回合结束时,若弃牌堆中有于本回合内因弃置而进入弃牌堆的防具牌,则你获得其中一张。", + spshangyi: "尚义", + spshangyi_info: "出牌阶段限一次。你可以弃置一张牌并选择一名其他角色。其观看你的手牌,然后你观看其手牌并获得其中的一张。", + sp_lvfan: "手杀吕范", + sp_lvfan_prefix: "手杀", + spdiaodu: "调度", + spdiaodu_info: "准备阶段,你可令一名角色摸一张牌,然后移动其装备区内的一张牌。", + spdiancai: "典财", + spdiancai_info: "其他角色的结束阶段开始时,你可以令至多X名角色各摸一张牌(X为你本回合失去的手牌数)。", + mbdiaodu: "调度", + mbdiaodu_info: "准备阶段,你可以移动一名角色装备区内的一张牌(不能移动给自己),然后其摸一张牌。", + mbdiancai: "典财", + mbdiancai_info: "其他角色的出牌阶段阶段结束后,若你本阶段失去的牌数不小于你的体力值,则你可将手牌数补至体力上限。", + spyanji: "严纪", + spyanji_info: "出牌阶段开始时,你可以进行“整肃”。", + sp_huangfusong: "手杀皇甫嵩", + spzhengjun: "整军", + spzhengjun_info: "①出牌阶段开始时,你可进行“整肃”。②当你因整肃而摸牌或回复体力后,你可令一名其他角色摸两张牌或回复1点体力。", + spshiji: "势击", + spshiji_info: "当你对其他角色造成属性伤害时,若你的手牌数不为全场唯一最多,则你可以观看其手牌。你令其弃置其中的所有红色牌,然后摸等量的牌。", + sptaoluan: "讨乱", + sptaoluan_info: "每回合限一次。一名角色的判定结果确定时,若结果的花色为♠,则你可以终止导致此判定发生的上级事件。然后选择一项:①获得判定牌对应的实体牌。②视为对判定角色使用一张火【杀】(无距离和次数限制)。", + sp_zhujun: "手杀朱儁", + yangjie: "佯解", + yangjie_info: "出牌阶段限一次,你可以摸一张牌并和一名其他角色A拼点。当你以此法展示你的拼点牌时,你令此牌点数-X(X为你已损失的体力值)。若你没赢,则你可以令另一名其他角色B获得两张拼点牌,然后其视为对A使用一张火【杀】。", + zjjuxiang: "拒降", + zjjuxiang_info: "限定技。一名其他角色脱离濒死状态时,你可以对其造成1点伤害,然后摸X张牌(X为其体力上限且至多为5)。", + xinyangjie: "佯解", + xinyangjie_info: "出牌阶段限一次,你可以与一名其他角色A拼点。若你没赢,则你可以令另一名其他角色B视为对A使用一张火【杀】。", + xinjuxiang: "拒降", + xinjuxiang_info: "限定技,一名其他角色脱离濒死状态时,你可以对其造成1点伤害。", + houfeng: "厚俸", + houfeng_info: "每轮限一次。一名其他角色的出牌阶段开始时,若其在你的攻击范围内,则你可以令其进行“整肃”。然后当其于本回合内因整肃而摸牌或回复体力后,你获得相同的整肃奖励。", + liuba: "手杀刘巴", + duanbi: "锻币", + duanbi_info: "限定技。出牌阶段,若场上所有角色的手牌数之和大于角色数之和的二倍,则你可以令所有其他角色各弃置X张手牌(X为该角色手牌数的一半且向下取整且至多为3)。然后你可选择一名角色,令其随机获得三张以此法被弃置的牌。", + tongduo: "统度", + tongduo_info: "每回合限一次。当你成为其他角色使用牌的唯一目标后,你可令一名角色重铸一张牌。", +}; + +export default translates; diff --git a/character/shiji/voices.js b/character/shiji/voices.js new file mode 100644 index 000000000..96b81f284 --- /dev/null +++ b/character/shiji/voices.js @@ -0,0 +1,229 @@ +export default { + "#duanbi1": "收缴故币,以旧铸新,使民有余财。", + "#duanbi2": "今,若能统一蜀地币制,则利在千秋。", + "#tongduo1": "辎重调拨,乃国之要务,岂可儿戏!", + "#tongduo2": "府库充盈,民有余财,主公师出有名矣。", + "#liuba:die": "孔明,大汉的重担,就全系于你一人之身了……", + "#yangjie1": "全军彻围,待其出城迎敌,再攻敌自散矣!", + "#yangjie2": "佯解敌围,而后城外击之,此为易破之道!", + "#zjjuxiang1": "今非秦项之际,如若受之,徒增逆意!", + "#zjjuxiang2": "兵有形同而势异者,此次乞降断不可受!", + "#houfeng1": "交汝统领,勿负我望!", + "#houfeng2": "有功自当行赏,来人呈上!", + "#houfeng3": "叉出去!罚其二十军杖!", + "#sp_zhujun:die": "郭汜小竖!气煞我也!嗯……", + "#spzhengjun1": "众将平日随心,战则务尽死力!", + "#spzhengjun2": "汝等不怀余力,皆有平贼之功!", + "#spzhengjun3": "仁恕之道,终非治军良策!", + "#spshiji1": "乱民桀逆,非威不服!", + "#spshiji2": "欲定黄巾,必赖兵革之利!", + "#sptaoluan1": "敌军依草结营,正犯兵家大忌!", + "#sptaoluan2": "兵法所云火攻之计,正合此时之势!", + "#sp_huangfusong:die": "力有所能,臣必为也……", + "#spdiaodu1": "三军器用,攻守之具,皆有法也!", + "#spdiaodu2": "士各执其器,乃陷坚陈,败强敌!", + "#spdiancai1": "资财当为公,不可为私也!", + "#spdiancai2": "财用于公则政明,而后民附也!", + "#spyanji1": "范既典主财计,必律己以率之!", + "#spyanji2": "有财贵于善用,须置军资以崇国防!", + "#spyanji3": "公帑私用?待吾查清定要严惩!", + "#sp_lvfan:die": "此病来势汹汹,恕臣无力侍奉……", + "#spjianyi1": "今虽富贵,亦不可浪费。", + "#spjianyi2": "缩衣克俭,才是兴家之道。", + "#spshangyi1": "国士,当以义为先!", + "#spshangyi2": "豪侠尚义,何拘俗礼!", + "#sp_jiangqing:die": "奋敌护主,成吾忠名……", + "#spzhenting1": "今政事在我,更要持重慎行!", + "#spzhenting2": "国可因外敌而亡,不可因内政而损!", + "#spjincui1": "伐魏虽俯仰惟艰,臣甘愿效死于前!", + "#spjincui2": "臣敢竭股肱之力,誓死为陛下前驱!", + "#sp_jiangwan:die": "臣即将一死,辅国之事文伟可继……", + "#spdifei1": "称病不见,待其自露马脚。", + "#spdifei2": "孙氏之诽,伤不到我分毫。", + "#spyanjiao1": "此篇未记,会儿便不可嬉戏。", + "#spyanjiao2": "母亲虽严,却皆为汝好。", + "#sp_zhangchangpu:die": "钟氏门楣,待我儿光耀……", + "#spyajun1": "君子如珩,缨绂有容!", + "#spyajun2": "仁声未闻,岂可先计后兵!", + "#spzundi1": "盖闻春秋之义,立子自当立长。", + "#spzundi2": "五官将才德兼备,是以宜承正统。", + "#sp_cuiyan:die": "生当如君子,死当追竹德……", + "#spxiangzhen1": "象兵便可退敌,何劳本姑娘亲往?", + "#spxiangzhen2": "哼!象阵所至,尽皆纷乱之师。", + "#spfangzong1": "一战结缘难再许,痛为大义斩此情!", + "#spfangzong2": "将军处处留情,小女芳心暗许。", + "#spxizhan1": "战场纵非玩乐之所,尔等又能奈我何?", + "#spxizhan2": "本姑娘只是戏耍一番,尔等怎下如此重手!", + "#spxizhan3": "哎呀~母亲放心,鬘儿不会捣乱的。", + "#spxizhan4": "嘻嘻,这样才好玩嘛。", + "#sp_huaman:die": "战事已定,吾愿终亦得偿……", + "#spjungong": null, + "#spjungong1": "曹军营守,不能野战,此乃攻敌之机!", + "#spjungong2": "若此营攻之不下,览何颜面见袁公!", + "#spdengli": null, + "#spdengli1": "纵尔勇冠天下,吾亦不退半分!", + "#spdengli2": "虚名何足夸口,败吾休得再提!", + "#sp_gaolan:die": "满腹忠肝,难抵一句谮言……唉!", + "#zaoli1": "喜怒不形于色,诈伪要明之徒。", + "#zaoli2": "摇舌鼓唇,竖子是之也!", + "#sunyi:die": "叛我贼子,虽死亦不饶之……", + "#yiyong1": "这么着急回营?哼!那我就送你一程!", + "#yiyong2": "你的兵器,本大爷还给你!哈哈哈哈!", + "#shanxie1": "快快取我兵器,与我上阵杀敌!", + "#shanxie2": "哈哈!还是自己的兵器用着趁手!", + "#sp_wangshuang:die": "啊?速回主营!啊!", + "#zhibian1": "两国各增守将,皆事势宜然,何足相问。", + "#zhibian2": "固边大计,乃立国之本,岂有不设之理。", + "#yuyan1": "正直敢言,不惧圣怒。", + "#yuyan2": "威武不能屈,方为大丈夫。", + "#sp_zongyu:die": "此次出使,终不负陛下期望。", + "#qingjue1": "兵者,凶器也,宜不得已而用之。", + "#qingjue2": "民安土重迁,易以顺行,难以逆动。", + "#fengjie1": "见贤思齐,内自省也。", + "#fengjie2": "立本于道,置身于正。", + "#yuanhuan:die": "乱世之中,有礼无用啊……", + "#spyilie1": "哈哈哈哈!来吧!", + "#spyilie2": "哼!都来受死!", + "#spfenming1": "合肥一役,吾等必拼死效力!", + "#spfenming2": "主公勿忧,待吾等上前一战!", + "#sp_chendong:die": "陛下速退!", + "#dbquedi1": "力摧敌阵,如视天光破云!", + "#dbquedi2": "让尔等有命追,无命回!", + "#dbzhuifeng1": "率军冲锋,不惧刀枪所阻!", + "#dbzhuifeng2": "登锋履刃,何妨马革裹尸!", + "#dbchongjian1": "尔等良将,于我不堪一击!", + "#dbchongjian2": "此等残兵,破之何其易也!", + "#dbchoujue1": "血海深仇,便在今日来报!", + "#dbchoujue2": "取汝之头,以祭先父!", + "#db_wenyang:die": "半生功业,而见疑于一家之言,岂能无怨!", + "#mingfa1": "明日即为交兵之时,望尔等早做准备。", + "#mingfa2": "吾行明伐之策,不为掩袭之计。", + "#rongbei1": "我军虽以德感民,亦不可废弛武备。", + "#rongbei2": "缮甲训卒,广为戎备,不失伐吴之机。", + "#sp_yanghu:die": "此生所憾,唯未克东吴也……", + "#yizhu1": "老夫有二女,视之如明珠。", + "#yizhu2": "将军若得遇小女,万望护送而归。", + "#luanchou1": "愿汝永结鸾俦,以期共盟鸳蝶。", + "#luanchou2": "夫妻相濡以沫,方可百年偕老。", + "#qiaogong:die": "为父所念,为汝二人啊……", + "#xiusheng1": "百姓安乐足矣,穷兵黩武实不可取啊。", + "#xiusheng2": "内乱初定,更应休养生息。", + "#yinlang1": "益州疲敝,还望贤兄相助。", + "#yinlang2": "内讨米贼,外拒强曹,璋无宗兄万万不可啊。", + "#huaibi1": "哎!匹夫无罪,怀璧其罪啊。", + "#huaibi2": "粮草尽皆在此,宗兄可自取之。", + "#liuzhang:die": "引狼入室,噬脐莫及啊!", + "#gebo1": "握手言和,永罢刀兵。", + "#gebo2": "重归于好,摒弃前仇。", + "#spsongshu1": "称美蜀政,祛其疑贰之心。", + "#spsongshu2": "蜀地君明民乐,实乃太平之治。", + "#sp_zhangwen:die": "自招罪谴,诚可悲疚……", + "#jishi1": "勤求古训,常怀济人之志。", + "#jishi2": "博采众方,不随趋势之徒。", + "#liaoyi1": "麻黄之汤,或可疗伤寒之疫。", + "#liaoyi2": "望闻问切,因病施治。", + "#binglun1": "受病有深浅,使药有重轻。", + "#binglun2": "三分需外治,七分靠内养。", + "#zhangzhongjing:die": "得人不传,恐成坠绪……", + "#boming1": "先载附从,吾后行即可。", + "#boming2": "诸位速速上船,靖随后便至。", + "#ejian1": "为政者当沙汰秽浊,显拔幽滞,以顺民心。", + "#ejian2": "此所谓寡助之至,天下叛之矣。", + "#sp_xujing:die": "吾……必秉德无怠,以称帝心……", + "#yuanqing1": "怀瑾瑜,握兰桂,而心若芷萱。", + "#yuanqing2": "嘉言懿行,如渊之清,如玉之洁。", + "#shuchen1": "陛下应先留心于治道,以征伐为后事也。", + "#shuchen2": "陛下若修文德,察民疾苦,则天下幸甚。", + "#sp_huaxin:die": "为虑国计,身损可矣……", + "#guying1": "我军之营,犹如磐石之固!", + "#guying2": "深壁固垒,敌军莫敢来侵!", + "#muzhen1": "行阵和睦,方可优劣得所。", + "#muzhen2": "识时达务,才可上和下睦。", + "#xiangchong:die": "蛮夷怀异,战乱难平……", + "#sheyi1": "二子不可兼顾,妾身唯保其一。", + "#sheyi2": "吾子虽弃亦可,前遗万勿有失。", + "#tianyin1": "抚琴体清心远,方成自然之趣。", + "#tianyin2": "心怀雅正,天音自得。", + "#caizhenji:die": "世誉吾为贤妻,吾愧终不为良母……", + "#splirang": null, + "#splirang1": "人之所至,礼之所及。", + "#splirang2": "施之以礼,还之以德。", + "#spmingshi1": "纵有强权在侧,亦不可失吾风骨。", + "#spmingshi2": "黜邪崇正,何惧之有?", + "#sp_kongrong:die": "不遵朝仪?诬害之词也!", + "#xianghai1": "快快闪开,伤到你们可就不好了,哈哈哈!", + "#xianghai2": "你自己撞上来的,这可怪不得小爷我!", + "#chuhai1": "有我在此,安敢为害?!", + "#chuhai2": "小小孽畜,还不伏诛?!", + "#chuhai3": "此番不成,明日再战!", + "#zhouchu:die": "改励自砥,誓除三害……", + "#xunyi1": "古有死恩之士,今有殉义之人!", + "#xunyi2": "舍身殉义,为君效死!", + "#wangfuzhaolei:die": "誓死……追随将军左右!", + "#xingqi1": "司马氏虽权尊势重,吾等徐图亦无不可!", + "#xingqi2": "先谋后事者昌,先事后谋者亡!", + "#zifu1": "有心无力,请罪愿降。", + "#zifu2": "舆榇自缚,只求太傅开恩!", + "#mibei1": "密为之备,不可有失。", + "#mibei2": "事以密成,语以泄败!", + "#wangling:die": "一生尽忠事魏,不料今日晚节尽毁啊!", + "#heji1": "你我合势而击之,区区贼寇岂会费力?", + "#heji2": "伯符!今日之战,务必全力攻之!", + "#liubing": null, + "#liubing1": "尔等流寇,亦可展吾军之勇。", + "#liubing2": "流寇不堪大用,勤加操练可为精兵。", + "#wujing:die": "贼寇未除,奈何吾身先丧……", + "#xinguixiu1": "身陷绝境,亦须秉端庄之姿。", + "#xinguixiu2": "纵吾身罹乱,焉能隳节败名。", + "#qingyu1": "冰清玉粹,岂可有污!", + "#qingyu2": "朱沉玉没,桂殒兰凋。", + "#qingyu3": "大家之韵,不可失之。", + "#sp_mifuren:die": "妾命数已至,惟愿阿斗顺利归蜀……", + "#spyinju1": "伐吴者,兴师劳民,徒而无功,万望陛下三思!", + "#spyinju2": "今当屯田罢兵,徐图吴蜀,安能急躁冒进乎?", + "#spchijie1": "节度在此,诸将莫要轻进。", + "#spchijie2": "吾奉天子明诏,整肃六军。", + "#sp_xinpi:die": "生而立于朝堂,亡而留名青史,我,已无憾矣。", + "#shengxi_feiyi1": "利治小之宜,秉居静之理。", + "#shengxi_feiyi2": "外却骆谷之师,内保宁缉之实。", + "#fyjianyu1": "功以才成,业由才广,弃才不用,非长计也。", + "#fyjianyu2": "舍此不任而防后患,是备风波而废舟楫也。", + "#feiyi:die": "臣请告陛下,宦权日盛,必乱社稷也。", + "#spwanwei1": "梁、沛之间,无子廉焉有今日?", + "#spwanwei2": "汝兄弟皆为手足,何必苦苦相逼?", + "#spyuejian1": "吾母仪天下,于节俭处当率先垂范。", + "#spyuejian2": "取上为贪,取下为伪,妾则取其中者。", + "#sp_bianfuren:die": "夫君,妾身终于要随您而去了。", + "#spwuku1": "损益万枢,竭世运机。", + "#spwuku2": "胸藏万卷,充盈如库。", + "#spsanchen1": "贼计已穷,陈兵吴地,可一鼓而下也。", + "#spsanchen2": "伐吴此举,十有九利,惟陛下察之。", + "#sp_duyu:die": "洛水圆石,遂道向南,吾将以俭自完耳……", + "#qinzheng1": "夫国之有民,犹水之有舟,停则以安,扰则以危。", + "#qinzheng2": "治疾及其未笃,除患贵其莫深。", + "#luotong:die": "臣统之大愿,足以死而不朽矣。", + "#spqiai1": "恨我无时谋,譬诸具官臣。", + "#spqiai2": "鞠躬中坚内,微画无所陈。", + "#spshanxi1": "连舫逾万艘,带甲千万人。", + "#spshanxi2": "率彼东南路,将定一举勋。", + "#sp_wangcan:die": "虽无铅刀用,庶几奋薄身。", + "#shameng1": "歃血盟誓,以告神明。", + "#shameng2": "戮力一心,同讨魏贼。", + "#sp_chenzhen:die": "震不负丞相所托……", + "#mjdingyi1": "经国序民,还需制礼定仪。", + "#mjdingyi2": "无礼而治世,欲使国泰,安可得哉?", + "#zuici": null, + "#zuici1": "既为朝堂宁定,吾请辞便是。", + "#zuici2": "国事为先,何惧清名有损!", + "#fubi": null, + "#fubi1": "辅君弼主,士之所志也。", + "#fubi2": "献策思计,佐定江山。", + "#sp_sunshao:die": "江东将相各有所能,奈何心向不一……", + "#mjweipo1": "想必……将军心中已有所计较。", + "#mjweipo2": "谌言尽于此,采纳与否还凭将军。", + "#mjchenshi1": "将军已为此二者所围,形势实不容乐观。", + "#mjchenshi2": "此二人若合力攻之,则将军危矣。", + "#mjmouzhi1": "潜谋于无形,胜于不争不费。", + "#mjmouzhi2": "欲思其成,必虑其败也。", + "#sp_xunchen:die": "袁公不济,吾自当以死继之……", +}; diff --git a/character/sp.js b/character/sp.js deleted file mode 100755 index f8eb3a18f..000000000 --- a/character/sp.js +++ /dev/null @@ -1,30196 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "sp", - connect: true, - characterSort: { - sp: { - sp_tianji: ["sunhao", "liuxie", "caoang", "hetaihou", "sunluyu", "ol_wangrong", "zuofen", "ol_bianfuren", "qinghegongzhu", "tengfanglan", "ruiji", "caoxiancaohua", "caoyu"], - sp_sibi: ["ol_lukai", "yangxiu", "guotu", "chenlin", "chengyu", "shixie", "fuwan", "wangyun", "zhugejin", "simalang", "maliang", "buzhi", "dongyun", "kanze", "sunqian", "xizhicai", "sunshao", "duxi", "jianggan", "ol_dengzhi", "ol_yangyi", "ol_dongzhao", "ol_chendeng", "jin_yanghu", "wangyan", "xiahouxuan", "quhuang", "zhanghua", "wangguan", "sunhong", "caoxi", "tianchou"], - sp_tianzhu: ["liyi", "zhangyan", "niujin", "hejin", "hansui", "wutugu", "yanbaihu", "shamoke", "zhugedan", "huangzu", "gaogan", "tadun", "fanjiangzhangda", "ahuinan", "dongtuna", "ol_wenqin"], - sp_nvshi: ["ol_dingshangwan", "lingju", "guanyinping", "zhangxingcai", "mayunlu", "dongbai", "zhaoxiang", "ol_zhangchangpu", "daxiaoqiao", "jin_guohuai", "ol_hujinding"], - sp_shaowei: ["simahui", "zhangbao", "zhanglu", "zhugeguo", "xujing", "zhangling", "huangchengyan", "zhangzhi", "lushi"], - sp_huben: ["duanjiong", "ol_mengda", "caohong", "xiahouba", "zhugeke", "zumao", "wenpin", "litong", "mazhong", "heqi", "quyi", "luzhi", "yuejin", "dingfeng", "wuyan", "ol_zhuling", "tianyu", "huojun", "zhaoyǎn", "dengzhong", "ol_furong", "macheng", "ol_zhangyì", "ol_zhujun", "maxiumatie", "luoxian", "ol_huban", "haopu", "ol_qianzhao"], - sp_liesi: ["lvboshe", "mizhu", "weizi", "ol_liuba", "zhangshiping"], - sp_default: ["sp_diaochan", "sp_zhaoyun", "sp_sunshangxiang", "sp_caoren", "sp_jiangwei", "sp_machao", "sp_caiwenji", "jsp_guanyu", "jsp_huangyueying", "sp_pangde", "sp_jiaxu", "yuanshu", "sp_zhangliao", "sp_ol_zhanghe", "sp_menghuo", "sp_sunce"], - sp_qifu: ["ol_feiyi", "caoying", "panshu", "caochun", "yuantanyuanshang", "caoshuang", "wolongfengchu", "guansuo", "baosanniang", "fengfangnv", "jin_zhouchu"], - sp_wanglang: ["ol_wanglang", "ol_puyuan", "ol_zhouqun"], - sp_zhongdan: ["cuiyan", "huangfusong"], - sp_guozhan2: ["sp_dongzhuo", "liqueguosi", "zhangren"], - sp_others: ["hanba", "caiyang"], - sp_waitforsort: ["ol_luyusheng", "ol_pengyang", "ol_tw_zhangji", "ol_liwan", "ol_liuyan", "liupan", "ol_liupi"], - }, - }, - characterFilter: { - tianyu: function (mode) { - return mode != "chess" && mode != "tafang" && mode != "stone"; - }, - ol_dongzhao: function (mode) { - return mode == "identity" && ["normal", "zhong"].includes(_status.mode); - }, - ol_mengda(mode) { - return mode !== "guozhan"; - }, - }, - character: { - sp_sunce: ["male", "qun", 4, ["olliantao"]], - ol_liupi: ["male", "qun", 4, ["olyicheng"]], - ol_lukai: ["male", "wu", 3, ["olxuanzhu", "oljiane"]], - liupan: ["male", "qun", 4, ["olpijing"]], - guotu: ["male", "qun", 3, ["olqushi", "olweijie"]], - ol_hujinding: ["female", "shu", 3, ["olqingyuan", "olchongshen"]], - tianchou: ["male", "qun", 4, ["olshandao"]], - liyi: ["male", "wu", 4, ["olchanshuang", "olzhanjin"]], - caoyu: ["male", "wei", 3, ["olgongjie", "olxiangxv", "olxiangzuo"]], - ol_liwan: ["female", "wei", 3, ["ollianju", "olsilv"]], - ol_dingshangwan: ["female", "wei", 3, ["olfudao", "olfengyan"]], - zhangyan: ["male", "qun", 4, ["olsuji", "ollangdao"]], - ol_tw_zhangji: ["male", "wei", 3, ["skill_zhangji_A", "skill_zhangji_B"], ["unseen"]], - ol_feiyi: ["male", "shu", 3, ["yanru", "hezhong"]], - lvboshe: ["male", "qun", 4, ["olfushi", "oldongdao"]], - ol_luyusheng: ["female", "wu", 3, ["olcangxin", "olrunwei"]], - caoxi: ["male", "wei", 3, ["olgangshu", "oljianxuan"]], - ol_pengyang: ["male", "shu", 3, ["olxiaofan", "oltuishi", "nzry_cunmu"]], - ol_qianzhao: ["male", "wei", 4, ["olweifu", "olkuansai"]], - niujin: ["male", "wei", 4, ["olcuorui", "liewei"]], - hejin: ["male", "qun", 4, ["mouzhu", "olyanhuo"]], - hansui: ["male", "qun", 4, ["olniluan", "olxiaoxi"]], - duanjiong: ["male", "qun", 4, ["olsaogu"]], - ol_zhouqun: ["male", "shu", 4, ["oltianhou", "olchenshuo"]], - ol_wenqin: ["male", "wei", 4, ["olguangao", "olhuiqi"]], - haopu: ["male", "shu", 4, ["olzhenying"]], - ol_mengda: ["male", "shu", 4, ["olgoude"]], - ol_wanglang: ["male", "wei", 3, ["gushe", "oljici"]], - ol_liuyan: ["male", "qun", "4/6", ["olpianan", "olyinji", "olkuisi"]], - lushi: ["female", "qun", 3, ["olzhuyan", "releijie"]], - zhangshiping: ["male", "shu", 3, ["olhongji", "olxinggu"]], - sunhong: ["male", "wu", 3, ["olxianbi", "olzenrun"]], - luoxian: ["male", "shu", 4, ["oldaili"]], - ol_huban: ["male", "wei", 4, ["olhuiyun"]], - wangguan: ["male", "wei", 3, ["olmiuyan", "olshilu"]], - ol_zhangyì: ["male", "shu", 4, ["oldianjun", "olkangrui"]], - ol_zhujun: ["male", "qun", 4, ["olcuipo"]], - maxiumatie: ["male", "qun", 4, ["mashu", "rekenshang"]], - dongtuna: ["male", "qun", 4, ["oljianman"]], - zhanghua: ["male", "jin", 3, ["olbihun", "oljianhe", "olchuanwu"]], - quhuang: ["male", "wu", 3, ["olqiejian", "olnishou"]], - macheng: ["male", "shu", 4, ["mashu", "olchenglie"]], - zhangzhi: ["male", "qun", 3, ["olbixin", "olximo"]], - ol_liuba: ["male", "shu", 3, ["oltongduo", "olzhubi"]], - ol_furong: ["male", "shu", 4, ["olxiaosi"]], - ahuinan: ["male", "qun", 4, ["jueman"]], - jin_guohuai: ["female", "jin", 3, ["zhefu", "yidu"]], - xiahouxuan: ["male", "wei", 3, ["olhuanfu", "olqingyi", "olzeyue"]], - dengzhong: ["male", "wei", 4, ["dzkanpo", "dzgengzhan"]], - wangyan: ["male", "jin", 3, ["yangkuang", "cihuang", "sanku"]], - huojun: ["male", "shu", 4, ["qiongshou", "fenrui"]], - caoxiancaohua: ["female", "qun", 3, ["huamu", "qianmeng", "liangyuan", "jisi"]], - jin_zhouchu: ["male", "jin", 4, ["shanduan", "yilie"]], - zhaoyǎn: ["male", "wei", 4, ["tongxie"]], - ol_puyuan: ["male", "shu", 4, ["olshengong", "olqisi"]], - ruiji: ["female", "wu", 3, ["qiaoli", "qingliang"]], - weizi: ["male", "qun", 3, ["yuanzi", "liejie"]], - tengfanglan: ["female", "wu", 3, ["luochong", "aichen"]], - sp_menghuo: ["male", "qun", 4, ["spmanwang"]], - jin_yanghu: ["male", "jin", 4, ["huaiyuan", "chongxin", "dezhang"]], - qinghegongzhu: ["female", "wei", 3, ["zengou", "qhzhangji"]], - fanjiangzhangda: ["male", "wu", 4, ["yuanchou", "juesheng"]], - tianyu: ["male", "wei", 4, ["saodi", "zhuitao"]], - ol_chendeng: ["male", "qun", 4, ["olfengji"]], - ol_zhuling: ["male", "wei", 4, ["jixian"]], - wuyan: ["male", "wu", 4, ["lanjiang"]], - sp_ol_zhanghe: ["male", "qun", 4, ["spolzhouxuan"]], - ol_dongzhao: ["male", "wei", 3, ["olxianlve", "olzaowang"]], - fengfangnv: ["female", "qun", 3, ["zhuangshu", "chuiti"]], - ol_yangyi: ["male", "shu", 3, ["oljuanxia", "oldingcuo"]], - zuofen: ["female", "jin", 3, ["zhaosong", "lisi"]], - ol_wangrong: ["female", "qun", 3, ["olfengzi", "oljizhan", "olfusong"]], - ol_dengzhi: ["male", "shu", 3, ["olxiuhao", "olsujian"]], - ol_bianfuren: ["female", "wei", 3, ["fuwei", "yuejian"]], - duxi: ["male", "wei", 3, ["quxi", "bixiong"]], - gaogan: ["male", "qun", 4, ["juguan"]], - huangchengyan: ["male", "qun", 3, ["guanxu", "yashi"]], - huangzu: ["male", "qun", 4, ["wangong"]], - panshu: ["female", "wu", 3, ["weiyi", "jinzhi"]], - wolongfengchu: ["male", "shu", 4, ["youlong", "luanfeng"]], - sp_zhangliao: ["male", "qun", 4, ["mubing", "ziqu", "diaoling"]], - caoshuang: ["male", "wei", 4, ["retuogu", "shanzhuan"]], - ol_zhangchangpu: ["female", "wei", 3, ["yanjiao", "olxingshen"]], - zhangling: ["male", "qun", 3, ["zlhuji", "zlshoufu"]], - caiyang: ["male", "qun", 1, ["yinka", "zhuixi"], ["forbidai", "unseen"]], - sunshao: ["male", "wu", 3, ["bizheng", "yidian"]], - - huangfusong: ["male", "qun", 4, ["fenyue"]], - yuantanyuanshang: ["male", "qun", 4, ["neifa"]], - xujing: ["male", "shu", 3, ["yuxu", "xjshijian"]], - - jianggan: ["male", "wei", 3, ["weicheng", "daoshu"]], - - caoying: ["female", "wei", 4, ["xinfu_lingren", "fujian"], []], - simahui: ["male", "qun", 3, ["jianjie", "xinfu_chenghao", "xinfu_yinshi"], []], - baosanniang: ["female", "shu", 4, ["olwuniang", "olxushen"], []], - - yangxiu: ["male", "wei", 3, ["jilei", "danlao"]], - chenlin: ["male", "wei", 3, ["bifa", "songci"]], - caohong: ["male", "wei", 4, ["yuanhu"]], - xiahouba: ["male", "shu", 4, ["baobian"]], - yuanshu: ["male", "qun", 4, ["yongsi", "weidi"]], - sp_diaochan: ["female", "qun", 3, ["lihun", "rebiyue"]], - sp_zhaoyun: ["male", "qun", 3, ["ollongdan", "chongzhen"]], - liuxie: ["male", "qun", 3, ["tianming", "mizhao", "twzhuiting"], ["zhu"]], - zhugejin: ["male", "wu", 3, ["olhuanshi", "olhongyuan", "olmingzhe"]], - zhugeke: ["male", "wu", 3, ["aocai", "duwu"]], - guanyinping: ["female", "shu", 3, ["huxiao", "xueji", "wuji"]], - simalang: ["male", "wei", 3, ["junbing", "quji"]], - zhangxingcai: ["female", "shu", 3, ["shenxian", "qiangwu"]], - fuwan: ["male", "qun", 4, ["dcmoukui"]], - sp_sunshangxiang: ["female", "shu", 3, ["liangzhu", "fanxiang"]], - caoang: ["male", "wei", 4, ["kaikang"]], - sp_caoren: ["male", "wei", 4, ["weikui", "lizhan"]], - zhangbao: ["male", "qun", 3, ["rezhoufu", "reyingbing"]], - maliang: ["male", "shu", 3, ["zishu", "yingyuan"]], - zhugedan: ["male", "wei", 4, ["gongao", "juyi"]], - sp_jiangwei: ["male", "wei", 4, ["kunfen", "fengliang"]], - sp_machao: ["male", "qun", 4, ["olzhuiji", "ol_shichou"]], - sunhao: ["male", "wu", 5, ["recanshi", "rechouhai", "guiming"], ["zhu"]], - shixie: ["male", "qun", 3, ["olbiluan", "relixia"]], - mayunlu: ["female", "shu", 4, ["fengpo", "mashu"]], - zhanglu: ["male", "qun", 3, ["yishe", "bushi", "midao", "twshijun"], ["zhu"]], - wutugu: ["male", "qun", 15, ["ranshang", "hanyong"]], - sp_caiwenji: ["female", "wei", 3, ["chenqing", "mozhi"]], - zhugeguo: ["female", "shu", 3, ["qirang", "yuhua"]], - - lingju: ["female", "qun", 3, ["jieyuan", "fenxin"]], - - cuiyan: ["male", "wei", 3, ["yawang", "xunzhi"]], - jsp_guanyu: ["male", "wei", 4, ["new_rewusheng", "danji"]], - jsp_huangyueying: ["female", "qun", 3, ["jiqiao", "linglong"]], - sunluyu: ["female", "wu", 3, ["new_meibu", "new_mumu"]], - hanba: ["female", "qun", 4, ["fentian", "zhiri"]], - zumao: ["male", "wu", 4, ["yinbing", "juedi"]], - wenpin: ["male", "wei", 4, ["zhenwei"]], - daxiaoqiao: ["female", "wu", 3, ["new_xingwu", "new_luoyan"]], - - guansuo: ["male", "shu", 4, ["zhengnan", "xiefang"]], - tadun: ["male", "qun", 4, ["reluanzhan"]], - yanbaihu: ["male", "qun", 4, ["zhidao", "jili"]], - chengyu: ["male", "wei", 3, ["shefu", "benyu"]], - - sp_pangde: ["male", "wei", 4, ["mashu", "juesi"]], - sp_jiaxu: ["male", "wei", 3, ["zhenlue", "jianshu", "yongdi"]], - - litong: ["male", "wei", 4, ["tuifeng"]], - mizhu: ["male", "shu", 3, ["ziyuan", "jugu"]], - buzhi: ["male", "wu", 3, ["hongde", "dingpan"]], - - caochun: ["male", "wei", 4, ["xinshanjia"]], - - dongbai: ["female", "qun", 3, ["lianzhu", "xiehui"]], - - zhaoxiang: ["female", "shu", 4, ["fanghun", "fuhan"]], - mazhong: ["male", "shu", 4, ["fuman"]], - dongyun: ["male", "shu", 3, ["bingzheng", "sheyan"]], - kanze: ["male", "wu", 3, ["xiashu", "kuanshi"]], - heqi: ["male", "wu", 4, ["olqizhou", "olshanxi"]], - - yuejin: ["male", "wei", 4, ["xiaoguo"]], - sp_dongzhuo: ["male", "qun", 5, ["hengzheng"]], - hetaihou: ["female", "qun", 3, ["zhendu", "qiluan"]], - dingfeng: ["male", "wu", 4, ["reduanbing", "refenxun"]], - shamoke: ["male", "shu", 4, ["gzjili"]], - - zhangren: ["male", "qun", 4, ["chuanxin", "zfengshi"]], - - wangyun: ["male", "qun", 4, ["xinlianji", "xinmoucheng"], ["clan:太原王氏"]], - sunqian: ["male", "shu", 3, ["qianya", "shuimeng"]], - xizhicai: ["male", "wei", 3, ["tiandu", "xianfu", "chouce"]], - quyi: ["male", "qun", 4, ["fuqi", "jiaozi"]], - - luzhi: ["male", "wei", 3, ["qingzhong", "weijing"]], - }, - characterIntro: { - liupan: "刘磐(生卒年不详),山阳高平人,荆州牧刘表从子。与南阳人黄忠共守长沙攸县。为人骁勇,数次为寇于艾、西安诸县。江东孙策于是分海昏、建昌为左右六县,以东莱太史慈为建昌都尉,治海昏,并督诸将共拒刘磐。于是刘磐绝迹不复为寇。", - guotu: "郭图(?-205年),字公则,颍川(治今河南省禹州市)人。东汉末年袁绍帐下谋士。韩馥统冀州时,郭图与荀谌等人奉袁绍之命,说服韩馥让位。袁绍统一河北后,郭图与审配等人力劝袁绍统率大军攻打曹操。袁绍死后,袁尚继位。郭图与辛评为袁谭效力,挑唆袁谭攻击袁尚。建安十年(205年),郭图和袁谭一同被曹操所杀。", - tianchou: "田畴(169年或170年-214年或216年),字子泰,东汉右北平郡无终人,东汉末年隐士。田畴好文习武。汉初平年间,其受刘虞派遣去长安,呈送指控公孙赞奏章,献帝大悦,封为骑都尉,田畴不受。携诏返回时,刘虞已被公孙所杀,田畴到刘墓祭拜,被公孙所提,不久释放。田畴回故乡后率家族及随从数百人隐居徐无山,致力农桑,数年间增至5000家。制定法条,兴建学校,一时民风良好,乌桓、鲜卑纷纷与其结交。汉建安二十年(207年),曹操北征乌桓,田畴请为向导。上徐无山、出卢龙、过平冈、登白狼堆、至柳城,曹军大胜,封田畴为亭侯,坚辞不受。曹念田功,四次封赏,终不受,乃拜为议郎。建安二十一年(216年),田畴去世。", - liyi: "李异(生卒年不详),三国时期东吴将领。建安末,与谢旌率水陆三千,击破刘备军将领詹晏、陈凤。刘备领兵攻孙权时,李异与陆逊等人屯巫、秭归,为蜀将所破。黄武元年(222年),陆逊破刘备于猇亭,李异追踪蜀军,屯驻南山。清代学者赵一清认为此李异与刘璋部将李异为同一人。", - caoyu: "曹宇(?-278年),字彭祖,沛国谯县(今安徽亳州)人。三国时期魏国宗室,魏武帝曹操与环夫人之子,邓哀王曹冲同母兄弟。太和六年,封为燕王。魏明帝病危,欲以大将军辅政,不果。其子常道乡公曹奂,是魏国末代皇帝,史称魏元帝。晋朝建立后,降封燕公。咸宁四年(278年),曹宇去世。", - zhangyan: "张燕,本姓褚,生卒年不详,常山真定(今河北正定南)人,东汉末年黑山军首领。张燕剽捍,敏捷过人,军中称为“飞燕”。官渡之战时投降曹操,被任命为平北将军,封安国亭侯。死后其子张方袭爵。", - lushi: "卢氏,五斗米教主张衡妻,张鲁母,擅长驻颜之术,常年令自己保持少女的容颜。常拜访刘焉,与其交好。", - lvboshe: "吕伯奢,东汉成皋(今河南荥阳)人,曹操父亲曹嵩的故友。曹操与陈宫在逃离董卓避祸,返回乡里的途中借宿于吕伯奢家,未伤其人,有贼八人欲捉曹操,曹操杀之,明罗贯中在历史小说《三国演义》中将这段历史进行了丑化加工,也成为小说中曹操名言“宁教我负天下人,休教天下人负我”的出处。", - caoxi: "曹羲(?-249年),字昭叔。曹真之子,曹爽之弟。为人有学识,明律法。司马懿曾组织朝议改革九品中正制废除九品而留中正,曹羲认为此举并无区别,最终都是决定于人的人治。曹爽掌权后,受封中领军,掌握禁兵,封安乡侯。曹爽及诸兄弟轻视司马懿,恣意妄为,经常外出狩猎,曹羲屡次劝谏,不被采纳。249年,司马懿发动高平陵政变,被夷三族。", - duanjiong: "段颎(?-179年),字纪明,武威姑臧(今甘肃省武威市)人。东汉名将,西域都护段会宗从曾孙,与皇甫规(字威明)、张奂(字然明)并称“凉州三明”。段颎少时学习骑射,有文武智略,最初被举为孝廉,为宪陵园丞、阳陵令,有治理之才。汉桓帝时入军旅,先破鲜卑,后讨平东郭窦、公孙举起事,以功封列侯。延熹二年(159年)起戍边征战十余年,百战羌人,至永康元年(167年)平定西羌,建宁二年(169年)平定东羌,前后斩东西羌六万余级。累功封新丰县侯。建宁三年(170年),段颎被征入朝,历任侍中、执金吾、河南尹、司隶校尉等职,他党附宦官、捕杀太学生,因而得保富贵,两度出任太尉。光和二年(179年),权宦王甫罪行被揭发,段颎受牵连下狱,其后在狱中饮鸩而死。", - haopu: "郝普,字子太,义阳(治所在今湖北枣阳东南)人。刘备入川后,郝普为零陵太守。建安二十年(215年),吴将吕蒙进攻荆州三郡,唯有郝普坚守待援。但援兵久久不至,其挚友邓玄之又被吕蒙所骗,郝普也因此上当,投降吴国。湘水划界后,郝普回归刘备。建安二十四年(219年),吕蒙再次袭击荆州,击败关羽,郝普再次投降,最终归顺吴国并官至廷尉。郝普与隐蕃亲善,隐蕃蓄谋叛变事情败露,他受到牵连,因此自杀。在刘备集团的5个荆州郡守中,郝普是唯一一个抵抗过东吴的荆州郡守。", - ol_zhanghe: "字儁乂,河间鄚人。三国时期魏国名将。官渡之战时,本为袁绍部将的张郃投降了曹操,并在曹操帐下多立功勋,于曹魏建立后加封为征西车骑将军。诸葛亮六出祁山之间,张郃多次抵御蜀军的进攻,于公元231年在木门道被诸葛亮设伏射死。后谥曰壮侯。为曹魏“五子良将”之一。", - zhangshiping: "张世平是东汉末期的中山商人,曾与苏双同路,资助刘备组织武装、建立政权。于《三国演义》第一回出场,刘关张桃园三结义时资助刘备良马五十匹,金银五百两,镔铁一千斤。刘备所使用的“双股剑”、关羽所使用的“青龙偃月刀(又名‘冷艳锯’)”、张飞所使用的“丈八点钢矛(又名‘丈八蛇矛’)”皆由这一千斤上好镔铁打造而成。", - luoxian: "罗宪(218年—270年),字令则,荆州襄阳(今湖北襄阳)人。西晋开国将领,巴东太守(郡府在永安白帝城)。于蜀汉灭亡后降魏,成功抵御孙吴的入侵,守住入魏国的要冲永安。后仕晋官至冠军将军、假节,封西鄂县侯。泰始六年(270年)去世,谥烈侯。", - sunhong: "孙弘(?—252年),三国时期吴国大臣,扬州会稽(今浙江省绍兴市)人。官至吴国中书令、少傅。鲁王孙霸与太子孙和各植党羽,孙弘即依附孙霸。孙权病笃,而太子年少,于是以孙弘领少傅。孙权临终,召他与诸葛恪、孙峻等嘱以后事,孙弘与诸葛恪同为顾命大臣。孙权死后,孙弘因素来与诸葛恪不和,怕为所治,故而隐瞒了孙权的死讯,欲矫诏除掉诸葛恪,被孙峻告发。后诸葛恪请孙弘议事,于座中将其诛杀。", - wangguan: "《三国演义》中虚构人物,历史上不曾记载。在114回出场,曾为邓艾手下参谋,献反间计与邓艾,被姜维识破,兵败自投江而死。", - maxiumatie: "马休(?-212年),马铁(?-212年)。两人均为扶风茂陵(今陕西兴平)人,马腾之子,马超之弟。马腾遭韩遂进攻,乃携马休、马铁等入京受职。马休被封为奉车都尉,马铁被封为骑都尉。后在邺城居住。因兄马超反,两人被曹操夷灭。", - dongtuna: "董荼那,小说《三国演义》及其衍生作品中的角色,南蛮王孟获属下大将,第二洞元帅;与阿会喃等人一起担任孟获的援军出征,但是被俘虏,又被诸葛亮释放,再次出战时,被唾骂不知羞耻,面红耳赤的退军。后同阿会喃共同绑架孟获献于蜀军,却被诸葛亮在其二人与孟获的重要性间权衡后出卖了他们,放走了孟获,使其为孟获所杀。", - zhanghua: "张华(232年-300年),字茂先。范阳郡方城县(今河北固安)人。西晋时期政治家、文学家、藏书家,西汉留侯张良的十六世孙。张华出身范阳张氏,自少贫苦,因才学过人而受同乡名臣卢钦、刘放、阮籍等人的赞赏。在曹魏时,他历任太常博士、河南尹丞、佐著作郎、中书郎等职。西晋建立后,拜黄门侍郎,封关内侯,逐渐受到晋武帝的重用。后拜中书令,加散骑常侍,与大将杜预坚决支持武帝伐吴,于战时任度支尚书。吴国灭亡后,以功进封广武县侯。其后遭到排挤,出镇幽州,政绩卓然。之后返朝任太常,终武帝之世未得参与政事。晋惠帝继位后,累官至司空,封壮武郡公,被皇后贾南风委以朝政。张华尽忠辅佐,使天下仍然保持相对安宁。永康元年(300年),♯♯司马伦发动政变,张华惨遭杀害,年六十九。太安二年(303年),获得♯♯,追复官爵。张华工于诗赋,词藻华丽,又雅爱书籍,精于目录学,编纂有中国第一部博物学著作《博物志》;还曾与荀勖等人依照刘向《别录》整理典籍。《宣和书谱》载有其草书《得书帖》及行书《闻时帖》。《隋书·经籍志》有《张华集》十卷,今已佚。明人张溥辑有《张茂先集》。", - quhuang: "屈晃(?—251),祖籍汝南(今河南省汝南县),汉末避乱南下,三国吴时居章安(今属椒江区)。初为郡吏,在职清廉,颇有政声。赤乌初年,擢为尚书仆射。", - macheng: "马承,蜀汉骠骑将军马超之子。仕蜀汉,马超死后继承其斄乡侯爵位。", - zhangzhi: "张芝(?—192年),字伯英,敦煌郡渊泉县(今甘肃省瓜州县)人。东汉书法家、“草书之祖”,大司农张奂的儿子。出身名门,拒绝朝廷征召,潜心研习书法。擅长草书中的章草,将古代当时字字区别、笔画分离的草法,改为上下牵连富于变化的新写法,富有独创性,在当时影响很大。李志敏评价:“张芝创造了草书问世以来的第一座高峰,精熟神妙,兼善章今”。 没有真迹传世,仅存《八月帖》等刻帖。汉献帝初平三年,去世于家中,著有《笔心论》,与钟繇、王羲之和王献之并称“书中四贤”。", - ahuinan: "阿会喃,小说《三国演义》及其衍生作品中的角色,南蛮王孟获属下大将,第三洞元帅;与董荼那等人一起担任孟获的援军出征,但是被俘虏,又被诸葛亮释放,再次出战时,被唾骂不知羞耻,面红耳赤的退军。后同董荼那共同绑架孟获献于蜀军,却被诸葛亮在其二人与孟获的重要性间权衡后出卖了他们,放走了孟获,使其为孟获所杀。", - xiahouxuan: "夏侯玄(209年~254年),字泰初(《三国志》等作太初),沛国谯县(今安徽省亳州市)人。三国时期曹魏大臣、思想家、文学家,征南大将军夏侯尚之子,大将军曹爽的表弟。夏侯玄少年有名望,仪表出众,时人称为“朗朗如日月之入怀”。魏文帝黄初六年(225年),袭封昌陵乡侯。魏明帝时,历任散骑黄门侍郎、羽林监。少帝曹芳继位后,拜散骑常侍、中护军,保卫皇宫。后任征西将军,任内与曹爽策划骆谷之役,大失人心。高平陵政变后,被夺去兵权,改任大鸿胪、太常卿。嘉平六年(254年),中书令李丰与外戚张缉密谋杀死大将军司马师,改以夏侯玄执政。事泄被杀,夷灭三族,夏侯玄死时年仅四十六岁。著有文集三卷,如今已佚。政治上,提出了“审官择人”、“除重官”、“改服制”等制度,被太傅司马懿评价“皆大善”。博学多识,才华出众,精通玄学,成为“四聪”之一,与何晏等人开创了魏晋玄学的先河,是早期的玄学领袖人物。", - dengzhong: "邓忠(不详-264年),三国时期曹魏名将邓艾之子。景元五年(264年),钟会谋反事败,士兵哗变,钟会被杀,邓艾部将想追还邓艾父子,但卫瓘却派田续追邓艾,于绵竹西相遇,将邓艾和邓忠等人杀死。直至泰始九年(273年)才恢复名节。", - wangyan: "王衍(256年~311年),字夷甫,琅邪郡临沂县(今山东省临沂市)人。西晋末年重臣,玄学清谈领袖,曹魏幽州刺史王雄之孙、平北将军王乂之子、司徒王戎堂弟。王衍出身琅琊王氏。外表清明俊秀,风姿安详文雅,笃好老庄学说,颇有时名。步入仕途后,历任黄门侍郎、中领军、尚书令、尚书仆射等职。光熙元年(307年),升任司空。次年,又任司徒。王衍位高权重,却不思为国,为保全自己,还让弟弟王澄、族弟王敦分任荆州、青州刺史,遭时人鄙夷。王弥进攻洛阳时,王衍率军抵抗。其后转任太尉兼尚书令,又兼领太傅军司。永嘉五年(311年),东海王司马越去世,王衍奉其灵柩返回东海,途中为羯人石勒所俘获。王衍在与石勒交谈时,仍推脱责任,并劝其称帝,石勒大怒,将其与西晋旧臣一同活埋,时年五十六岁。王衍工书法,尤擅行书,《宣和书谱》有其作品《尊夫人帖》。", - caoxiancaohua: "请分别查看「曹宪」和「曹华」的武将介绍。", - zhaoyǎn: "赵俨(171~245年),字伯然,颍川阳翟(今河南禹州市)。东汉末年颍川“四大名士”之一,三国时期魏国名臣。熟读经史,精明强干。建安二年,投靠大将军曹操之后,起家朗陵县令,历任司空府掾、司空主薄、都督护军、扶风太守等职。魏文帝曹丕继位后,历任魏国侍中、驸马都尉、河东太守、典农中郎将、度支尚书,封宜土亭侯。魏明帝曹睿时期,历任大司农、骠骑将军、大司空等职。正始六年,去世,时年七十五,谥号为穆。", - ruiji: "芮姬,芮玄之女,太子孙登妃,黄武五年卒。", - weizi: "卫兹(?-190年),字子许,(《三国演义》中其名为卫弘,当为误记),陈留襄邑(今河南睢县)人。曾举孝廉,先后被车骑将军何苗、司徒杨赐等召辟。中平六年(189年)十二月,曹操在陈留己吾募兵,而卫兹以家财资助曹操,使曹操顺利募得五千士兵。此后,卫兹与曹操共同讨伐董卓。初平元年(190年),卫兹在跟随曹操讨伐董卓途中,于荥阳汴水遭遇董卓军徐荣,力战终日,失利身亡。", - tengfanglan: "滕芳兰,生卒年不详,北海剧县(今山东省寿光市)人,太常滕胤的族女,滕牧的女儿,吴末帝孙皓的皇后。永安元年(258年),孙皓为乌程侯时被聘为妃。元兴元年(264年),孙皓登基后被立为皇后。孙吴灭亡后,随孙皓迁居洛阳。", - qinghegongzhu: "清河长公主,沛国谯县人,曹操长女(按其与曹操长子曹昂同出于刘夫人,而刘夫人又早死,故其年龄应长于曹丕等其他曹操诸子女,又按长公主亦有年最长之意,故应为曹操之长女)。母刘夫人,得到曹操喜爱。清河公主后来下嫁夏侯楙。曹操初欲嫁丁仪,曹丕劝其嫁与夏侯楙。后与小叔子设计欲谋害丈夫,未果。", - fanjiangzhangda: "范强,在明朝小说《三国演义》里叫做范疆。二人均为张飞手下部将。蜀汉章武元年,刘备伐吴,张飞率军从阆中前往江州,出发前,范强和张达杀死张飞,带着张飞的首级投奔了东吴。", - tianyu: "田豫(171年~252年),字国让,渔阳雍奴(今天津市武清区)人。三国时期曹魏将领。初从刘备,因母亲年老回乡,后跟随公孙瓒,公孙瓒败亡,劝说鲜于辅加入曹操。曹操攻略河北时,田豫正式得到曹操任用,历任颖阴、郎陵令、弋阳太守等。后来田豫常年镇守曹魏北疆,从征代郡乌桓、斩骨进、破轲比能,多有功勋;也曾参与对孙吴的作战,在成山斩杀周贺,于新城击败孙权。官至太中大夫,封长乐亭侯。有一子田彭祖。", - wuyan: "吴国及西晋初年将领。初任通江县吏,后得到大司马陆抗的提拔重用,逐渐升至建平太守。", - fengfangnv: "冯方之女,司隶人,袁术妻妾。在史书中被记载为天姿国色的美人。钱大昭在《三国志辨疑》中认为冯方当为冯芳误字,冯方女实为是西园八校尉之一的冯芳的女儿。然而,在曹丕《典论》、《九州春秋》等书籍都有提及她,皆作冯方女字样,并无一书写作冯芳女或是明提是冯芳之女。最关键的一点是,冯芳是荆州西陵县人,她女儿不可能是司隶籍,冯芳也没担任过任何与司隶有关的官职。同时期名字为“○女”的并不少见,如施绩女儿施淑女,曹植女儿曹行女,夏侯令女等。", - zuofen: "左芬(约253年-300年4月23日),出土墓志作左棻,字兰芝,齐国临淄(今山东临淄)人,西晋诗人。少好学,善属文。为晋武帝贵人。今存诗、赋、颂、赞、诔等20余篇,大都为应诏而作,《离思赋》最著名。原有集,已失传。", - duxi: "杜袭(生卒年不详),字子绪,颍川郡定陵县(今河南省襄城县)人。三国时期魏国重臣,东汉末年颍川“四大名士”之一,济阴太守杜根的孙子。建安初年,投奔司空曹操,历任西鄂县令、议郎、丞相军咨祭酒、魏王侍中、丞相长史、驸马都尉。魏文帝时期,出任督军粮御史、尚书,累封武平亭侯。魏明帝时期,担任大将军曹真和司马懿的军师,抵御蜀国进攻,拜太中大夫,受封平阳乡侯。卒于任上,获赠少府,谥号为定。", - gaogan: "高干(?~206年),字元才,陈留郡圉县(今河南杞县圉镇)人。东汉末年并州割据将领,蜀郡太守高躬之子、大将军袁绍外甥。出身陈留高氏,才志弘邈,文武秀出。早年联合荀谌游说韩馥让出冀州牧。袁绍平定河北后,以为并州牧。官渡之战时,在西线配合作战。因曹操早有准备,没有实质进展。袁绍死后,袁谭、袁尚与曹操大战于黎阳郡时,联合郭援攻打平阳郡,为马腾为首关中将领所败,郭援为庞德所斩。袁尚败走中山郡后,出降于曹操,仍为并州刺史。建安十年,兴兵反曹,固守壶关,成功抵挡乐进进攻。得知曹操亲征后,留下别将守城,亲往匈奴呼厨泉求救,没有成功。引兵攻略河东郡,屡为钟繇、张既所败。建安十一年,投奔荆州刘表。途经上洛时,为上洛都尉捕斩之。", - huangchengyan: "黄承彦,生卒年不详,汉末三国时期沔阳名士,诸葛亮岳父,黄月英之父。南郡大士蔡讽的女婿,与襄阳名士上层社会圈子:庞统(凤雏)、庞德公、司马徽、徐庶等人交好。《襄阳记》:黄承彦者,高爽开列,为沔阳名士,谓诸葛孔明曰:“闻君择妇,身有丑女,黄头黑色,而才堪配。”孔明许,即载送之。时人以为笑乐,乡里为之谚曰:“莫作孔明择妇,正得阿承丑女。”", - panshu: "潘淑(?-252年),会稽句章(今浙江省宁波市)人,是吴大帝孙权的皇后,吴少帝孙亮的母亲。和孙权是中国历代帝后中年龄差距较大的一对。潘淑少时与姐姐俱没入织室,容媚有宠,拜为夫人,生有一子孙亮。赤乌十三年(250年),孙权立孙亮为皇太子,翌年(251年)立潘淑为皇后。神凤元年(252年)暴崩,合葬蒋陵。世称潘淑为江东绝色,有神女之称。", - zongyu: "宗预(?-264年),字德艳 ,荆州南阳郡安众县(今河南省南阳市)人。三国时期蜀汉官员、将领。曾随张飞入蜀助平益州,又受辟为丞相诸葛亮手下主簿,升任参军、右中郎将。诸葛亮逝世后,宗预受命出使孙吴,得到孙权的赞赏。迁后将军,出督永安,又升任征西大将军,并受封关内侯。公元258年(景耀元年),因病回成都,受任镇军大将军。蜀汉灭亡后,宗预随后主刘禅徙往洛阳,在中途病逝。宗预为人坦率耿直,多次出使孙吴并深得孙权的敬重,为吴、汉两国同盟的巩固作出了一定的贡献。", - mengda: "孟达(?-228),字子度,本字子敬,因刘备的叔父名叫刘子敬,为避讳而改字。扶风郡郿人,三国时期人物。本为刘璋属下,后降刘备。关羽围樊城、襄阳时因不发兵救关羽而触怒刘备,于是投奔曹魏。此后,劝降刘封,未果。在魏官至散骑常侍、建武将军,封平阳亭侯。此后又欲反曹魏而归蜀汉,事败而死。", - wolongfengchu: "沙比武将,懒得复制粘贴,自己去看「诸葛亮」和「庞统」的介绍吧。", - caoshuang: "曹爽(?-249年2月9日),字昭伯,沛国谯县(今安徽亳州市)人。三国时期魏国权臣,大司马曹真长子。曹爽体态肥胖,凭借宗室身份,出入宫廷,交好太子曹叡。魏明帝即位,起家员外散骑侍郎,累迁城门校尉、散骑常侍,转武卫将军。太和五年(231年),袭封邵陵侯。景初三年(239年),魏明帝曹叡病危,拜大将军、假黄钺,与司马懿并为托孤大臣。少帝曹芳即位,加侍中,改封武安侯。势倾四海,声震天下。任用私人,专权乱政,侵吞公产。伐蜀失败,虚耗国力。起居逾制,软禁郭太后。正始十年,太傅司马懿发动高平陵政变,掌握魏国大权。曹爽失去大将军职务,以谋反之罪处死,夷灭三族。", - zhangling: "张道陵(34年2月22日—156年),字辅汉,原名陵,道教正一道实际创立者,汉朝东汉时期丰邑(今江苏徐州丰县)人。太上老君降临蜀地,“授以三天正法,命为天师”,张道陵整合当时的:黄老派、方仙道、文始派等先秦修道团体,创立道教称正一盟威之道。后世尊称为“老祖天师”、“正一真人”、“三天扶教大法师”、高明上帝、张天师。著作《老子想尔注》,弟子有3000多人,设立24治,奠基天师道。张道陵、葛玄、许逊、萨守坚合称四大天师。张道陵创建道教的背景:当时在巴蜀一带,原有巴人信奉原始巫教,大规模的淫祀而害民。而这些祀奉鬼妖(学名为:妖邪)的法教巫师聚众敛财,无恶不作。张天师携王长、赵升二位弟子和黄帝九鼎丹经,来到北邙山修行,平定了那些祸害百姓的巫妖之教。川渝一带流传的张天师以太上老君剑印符箓大破鬼兵的故事就是以此为原型的。", - caiyang: "蔡阳(?-201年),又作蔡扬,东汉丞相曹操部下武将,汝南太守。于建安六年(201)奉曹操之命攻击与刘备联合的汝南贼龚都等人,兵败被刘备所杀。明代小说《三国演义》改编为“云长擂鼓斩蔡阳”。", - pujing: "湖北省当阳境内有一座山,名叫玉泉山。东汉建安末年,山上住着一个老和尚,法名普净,普净原来是沂水关镇国寺方丈,后因云游天下,来到此处,风这地方山明水秀,就于山中结草为庵,每天坐禅参道,身边只有一个小和尚,外出化一些斋饭,供养师父。在《三国演义》中,当关羽通过汜水关时,正是由于普净提醒,关羽才揭穿了卞喜的阴谋,并杀死了卞喜。关羽死后,其怨魂亦在普净的指点下醒悟,放下了心中的仇恨,专心致力于造福一方百姓。", - huban: "为《三国演义》所杜撰的人物,正史无记载,荥阳太守王植麾下从事、桓帝时议郎胡华之子。关羽过五关斩六将时其中一关就是王植所镇守,胡班奉命放火夜袭关公,因敬服公之气概,并得其父托公所带家书,班看毕,叹曰:“险些误杀忠良!”故将之放走。胡班到荆州来投降关公,公念其旧日相救之情,甚爱之;令随费诗入川,见汉中王受爵。费诗辞别关公,带了胡班,自回蜀中去了。", - chunyuqiong: "淳于琼(?-200年),字仲简,颍川(治今河南禹州)人。东汉时期官吏,于汉灵帝中平五年(188)被任命为西园八校尉之一的右校尉,与蹇硕、袁绍、鲍鸿、曹操、赵融、冯芳、夏牟同列。为袁绍大将,与张郃、高览等人齐名。在官渡之战时镇守乌巢,遭到曹操的偷袭而惨败,自己也被曹操处斩。", - lvkuanglvxiang: "吕旷(生卒年不详),与吕翔同是袁绍属下,袁绍去世后,为袁尚守东平,后来投降曹操,并被封为列侯。在《三国演义》中,在曹操准备往南准备攻击前,两人跟著大将曹仁和将军李典准备要攻击刘备。但吕旷被赵云刺下马身亡,而吕翔也死于张飞矛下,可以算是出师未捷身先死", - caobuxing: "曹不兴,亦名弗兴,三国时著名画家。孙吴吴兴(今浙江湖州)人,生卒年不详。他在黄武年间(222—229年)享有很大的声誉。被称为“佛画之祖”。与东晋顾恺之、南朝宋陆探微、南朝梁张僧繇并称“六朝四大家”。又与赵达的算术、严武的弈棋、皇象的草书等号称“吴中八绝”。曹不兴善画龙、虎、马及人物,有“落墨为蝇”等传奇故事,其佛画成就对后世影响很大,相传其所画龙头令谢赫叹服不已。画迹今已不存,据《贞观公私画史》载,作品有《青溪龙》、《赤盘龙》、《南海监牧进十种马图》、《夷事夷兽样》、《桃源图》等,惜早已散佚。但之后的著名画家卫协直接师承其法。", - gaolan: "高览,生卒年不详,一名高奂,本属袁绍部将,后官渡之战淳于琼被曹操击破,与张郃一同投降曹操,被封为偏将军,东莱侯。《三国演义》里,曾与许褚、徐晃大战不分胜负。201年刘备败走荆州时,高览奉命追杀,三合斩刘辟,而后被冲阵而来的赵云刺死。", - xunchen: "荀谌,字友若,荀彧之兄(一说荀彧之弟),荀绲之子,颍川人。曾任军阀袁绍的幕僚。帮助袁绍游说韩馥,夺取了冀州。", - sunshao: "孙邵(163年-225年),字长绪,青州北海国人(今山东潍坊市昌乐县西)。原为北海相孔融的功曹,被孔融称赞为可任朝廷要职的人才,后随刘繇到达江东,继而辅佐孙权。孙权称吴王后,孙邵成为吴国首任丞相,数年后病逝。由于孙邵和当时吴国史官的关系并不是很好,因此在史书中并没有详细的记载。", - yuantanyuanshang: "袁谭、袁尚分别是袁绍的长子和第三子。袁绍坐拥青州、冀州、幽州、并州,本是北方最强诸侯,却于官渡大败,惭恨而终。虽然袁绍生前偏爱小儿子袁尚,却并未在继承人上有明确表态,这也导致本应以嫡长子身份继承的袁谭因郭图、审配伪立遗令未能如愿。曹操击败袁绍后,进而渡过黄河追击袁家残余势力,袁谭告急,但袁尚仅给他少量兵力。曹操得郭嘉之计退兵坐观其变,恰使两人此前的种种矛盾彻底爆发,袁谭不敌便引狼入室,派辛毗作为使者向曹操求援,让袁尚不得不北逃投奔乌桓。但袁谭也在之后背叛曹操兵败被杀。没多久,乌桓也被平定,袁熙、袁尚二人投奔公孙康后被斩首送还曹操。", - xujing: "许靖(?—222年),字文休。汝南郡平舆县(今河南省平舆县)人。汉末至三国蜀汉时期重臣、名士、评论家。许靖因与从弟许邵俱以品评人物而闻名于世。后被刘翊推举为孝廉,任尚书郎。曾先后投奔孔伷、陈祎、许贡、王朗等人,于孙策攻王朗前与家属俱避难交州,受到交趾太守士燮礼待。其后受益州牧刘璋邀请,相继为巴郡、广汉、蜀郡太守。于刘备包围成都时欲越墙叛逃,为刘璋所获。刘备定蜀后欲将其弃用,在法正的建议下方以其为左将军长史。建安二十三年(218年),刘备称汉中王,任命许靖为汉中王傅。章武元年(221年),刘备称帝,任命许靖为司徒,位列三公。章武二年(222年),去世。有文集二卷。", - hejin: "何进(?~189年),字遂高,南阳郡宛县(今河南南阳市宛城区)人。东汉时期外戚大臣,灵思皇后之兄。初以妹妹有宠,拜为郎中,出任虎贲中郎将、颍川太守,迁侍中、将作大匠、河南尹。黄巾起义时,拜为大将军,总镇京师,发现并镇压马元义的密谋,封为慎侯。为张大威望,在京师讲武结营,置西园八校尉。汉灵帝驾崩后,粉碎了中常侍蹇硕拥立皇子刘协的图谋,听从袁绍之言,博征智谋之士,内借元舅之资,外据辅政之权,独揽朝中大权。中平六年(189),不纳陈琳和曹操劝谏,阴结军阀董卓,联合袁绍谋诛宦竖。事情败露后,为中常侍张让等人损害,其后代是魏晋高门士族南阳何氏。", - hansui: "韩遂(?-215年),字文约。凉州金城郡人。东汉末年军阀、将领,汉末群雄之一。原名韩约,后改名遂。韩遂最初闻名于西州,被羌胡叛军劫持并推举为首领,以诛宦官为名举兵造反,聚众十万,先后败皇甫嵩、张温、董卓、孙坚等名将,使得天下骚动。后受朝廷招安,拥兵割据一方长达三十余年。韩遂曾与马腾结为异姓兄弟,后二人关系破裂。袁绍、曹操相争之际,马腾、韩遂被钟繇说服,依附于曹操。马腾入京后,留其子马超统领部队。马超推举韩遂为都督起兵反叛曹操,为曹操所败,韩遂逃奔凉州,后又为夏侯渊所败,病死(一说被杀),享年七十余岁。", - niujin: "牛金(生卒年不详),初为曹仁部曲将,周瑜军数万人来攻,前锋数千人始至,曹仁登城望,乃募得三百人,遣牛金迎战。但对方兵力较多,牛金遂被围困。曹仁亲自杀入阵中救出牛金。司马懿使牛金轻骑饵诱蜀军,刚交战诸葛亮就退兵,追至祁山。蜀将马岱入寇,司马懿遣将军牛金击退,斩千余级。公孙渊反,司马懿帅牛金、胡遵等步骑四万发自洛阳,后平定辽东。牛金官至后将军。", - jianggan: "蒋干,字子翼,汉末三国时期的人物,九江(治今安徽寿县)人。历史上的蒋干是当时的名士、辩论家。而罗贯中在历史小说《三国演义》中则将蒋干刻画成了被周瑜所愚弄的小丑形象。", - - caoying: "曹婴是在电影《三国志之见龙卸甲》中登场的虚拟人物,由李美琪饰演。曹婴是曹操的孙女,弓马娴熟,文武双全,深得曹操的用兵之道及心术。于凤鸣山一战中担任魏军大都督阻止诸葛亮北伐并因罗平安的告密而全歼关兴、张苞、赵云率领的蜀军部队。", - simahui: "司马徽(约145—208年),字德操,颍川阳翟(今河南禹州)人。东汉末年名士,精通道学、奇门、兵法、经学。有“水镜先生”之称。 司马徽为人清雅,学识广博,有知人之明,并向刘备推荐了诸葛亮、庞统等人,受到世人的敬重。", - baosanniang: "鲍三娘是中国民间传说中的人物,事迹多见于《花关索传》。相传她是鲍家庄鲍员外的小女儿。后来与关索成亲,关羽自传授其武艺,因此也造就了鲍三娘的文武双全。荆州失守之后鲍三娘就跟随关索一同投奔蜀汉,并随诸葛亮征讨南蛮。平定了南蛮之后,夫妻二人就此一直替诸葛亮镇守着南中,他们也的确留下了许多脍炙人口的行侠仗义故事,在民间广为流传。", - - pangdegong: '庞德公,字尚长,荆州襄阳人,东汉末年名士、隐士。 庞德公与当时徐庶、司马徽、诸葛亮、庞统等人交往密切。庞德公曾称诸葛亮为"卧龙",庞统为"凤雏",司马徽为"水镜",被誉为知人。对诸葛亮、庞统等人早年影响较大,并得到诸葛亮的敬重。庞德公最后隐居于鹿门山,采药而终。', - zhaotongzhaoguang: "赵统,赵云长子,生卒年不详。常山真定(今为河北正定)人,陈寿在正史《三国志》中记载赵云去世后,赵统袭爵永昌亭侯,官至蜀汉虎贲中郎督,加行领军。赵广(?—263年),三国时期蜀汉牙门将,赵云的次子,赵统之弟。随姜维前往沓中,官拜牙门将。曹魏司马氏派五路大军伐蜀时,随大将军姜维与魏兵战于疆川口,姜维败绩还守剑阁,赵广于沓中战死。", - majun: "马钧,字德衡,扶风(今陕西扶风)人,生活在汉朝末期,是中国古代科技史上最负盛名的机械发明家之一。马钧年幼时家境贫寒,自己又有口吃的毛病,所以不擅言谈却精于巧思,后来在魏国担任给事中的官职。马钧最突出的表现有还原指南车;改进当时操作笨重的织绫机;发明一种由低处向高地引水的龙骨水车;制作出一种轮转式发石机,能连续发射石块,远至数百步;把木制原动轮装于木偶下面,叫做“水转百戏”。此后,马钧还改制了诸葛连弩,对科学发展和技术进步做出了贡献。", - simazhao: "司马昭(211年—265年9月6日),字子上(小说《三国演义》为子尚),河内温县(今属河南)人。三国时期曹魏权臣,西晋王朝的奠基人之一。为晋宣帝司马懿与宣穆皇后张春华次子、晋景帝司马师之弟、晋武帝司马炎之父。 司马昭早年随父抗击蜀汉,多有战功。累官洛阳典农中郎将,封新城乡侯。正元二年(255年),继兄司马师为大将军,专揽国政。甘露五年(260年),魏帝曹髦被弑杀,司马昭立曹奂为帝。景元四年(263年),分兵遣钟会、邓艾、诸葛绪三路灭亡蜀汉,受封晋公。次年,进爵晋王。 咸熙二年(265年),司马昭病逝,年五十四,葬于崇阳陵。数月后,其子司马炎代魏称帝,建立晋朝,追尊司马昭为文帝,庙号太祖。", - wangyuanji: "王元姬(217年—268年4月20日),东海郯县(今山东郯城西北)人。三国时期曹魏经学家王朗之孙女、王肃之女,晋文帝司马昭妻子,晋武帝司马炎与齐王司马攸的生母。 王元姬幼时便通《诗经》、《论语》,嫁司马昭后竭尽妇道、谦虚谨慎。其人颇有远见,曾预言钟会谋反之事。泰始元年(265年),司马炎建立西晋,尊王元姬为皇太后,宫号曰崇化宫。王元姬身处太后之位,提倡节俭,身体力行,作为众妃子的表率。在其治理之下,后宫井井有条,众人和睦相处。 泰始四年(268年),王元姬崩逝,终年五十二岁。谥号文明皇后,与司马昭合葬于崇阳陵。", - - liuye: "刘晔(?-234年),字子扬,淮南成德人,是光武帝刘秀之子阜陵王刘延的后代,三国时期魏国著名的战略家。刘晔年少知名,人称有佐世之才,是曹操手下举足轻重的谋士,他屡献妙计,对天下形势的发展往往一语中的。刘晔历仕数朝,是曹魏的三朝元老。", - luzhi: "鲁芝(190年—273年),字世英。扶风郡郿县(今陕西眉县)人。魏晋时期名臣。官至光禄大夫,位特进,封阴平侯。泰始九年(273年)卒,时年八十四。谥号“贞”。", - xizhicai: "戏志才(生卒年不详),或志才为字,名不详(一说名忠),东汉颍川郡(今河南禹州)人。经张邈推荐,成为曹操手下谋士。为人多谋略,曹操十分器重,不幸早卒。三国演义中并无此人,三国志中只有寥寥数语。由荀彧推荐给曹操,被称为有“负俗之讥”。死后,荀彧又举荐了郭嘉。
    陈寿《三国志》记载:太祖与荀彧书曰:自志才亡后,莫可与计事者。汝、颍固多奇士,谁可以继之?彧荐嘉。", - sunqian: "孙乾(?—约215年),字公祐。北海郡(治今山东昌乐西)人。东汉末年刘备的幕僚。最初被大儒郑玄推荐于州里。刘备领徐州,以孙乾为从事。自徐州跟随刘备,多次作为刘备的使臣。刘备定益州后,拜孙乾为秉忠将军,其待遇仅次于麋竺,与简雍相同。不久后便病逝。", - miheng: "祢衡(173年-198年),字正平,平原郡(今山东德州临邑德平镇)人。个性恃才傲物.和孔融交好。孔融著有《荐祢衡表》,向曹操推荐祢衡,但是祢衡称病不肯去,曹操封他为鼓手,想要羞辱祢衡,却反而被祢衡裸身击鼓而羞辱。后来祢衡骂曹操,曹操就把他遣送给刘表,祢衡对刘表也很轻慢,刘表又把他送去给江夏太守黄祖,最后因为和黄祖言语冲突而被杀,时年二十六岁。黄祖对杀害祢衡一事感到十分后悔,便将其加以厚葬。", - quyi: "麴义(又作曲义、鞠义),生卒年不详,是东汉末年军阀袁绍部下的将领,能征善战,屡建战功,早年在凉州,精通羌人战法,率领着袁绍的精锐部队。后来由于自恃功高而骄纵不轨,被袁绍所杀。", - taoqian: "陶谦(132年-194年),字恭祖。丹阳郡(治今安徽宣城)人。汉末群雄之一。陶谦最初为诸生,在州郡任职,被举茂才,历任舒、卢二县令、幽州刺史、议郎,性格刚直,有大志。后随左车骑将军皇甫嵩对抗北宫伯玉,任扬武校尉,之后又随张温征韩遂、边章。中平五年(188年),徐州黄巾起,陶谦被朝廷任为徐州刺史,击破徐州黄巾,并推行屯田,恢复生产。尔后听从王朗、赵昱建议遣使进京朝贡,获拜安东将军、徐州牧,封溧阳侯。晚年因战事上为曹操大败,徐州大半几乎遭兵祸所害,以致过度忧劳而逝,终年六十三岁。", - wangyun: "王允(137~192年),字子师,太原郡祁县(今山西祁县)人。东汉末年时期大臣。出身太原王氏,世代官宦。举孝廉出身,司徒高第征为侍御史。出任豫州刺史,勤政爱民。斗争中常侍张让失败后,去官隐居。中平六年,大将军何进掌权之后,辟为从事中郎,迁河南尹。董卓拥立汉献帝即位后,代替杨彪,拜太仆、尚书令、司徒,密谋刺死董卓,联合吕布共同执政,日益骄傲自满。初平三年(192年),董卓余党李傕、郭汜、樊稠等攻破长安。王允兵败处死,时年五十六岁。", - bianfuren: "武宣皇后卞氏(159年12月30日-230年7月9日),琅邪开阳(今山东临沂)人,魏武帝曹操的正妻(继室),魏文帝曹丕、任城威王曹彰、陈思王曹植、萧怀王曹熊的母亲。原本是倡家,即汉代专门从事音乐歌舞的乐人家庭,后来与曹操成婚,建安初年,原配丁夫人被废,卞夫人成为曹操的正妻。曹丕继位后尊其为皇太后,曹叡继位后尊其为太皇太后。卞后在太和四年去世,与魏武帝曹操合葬高陵。", - shamoke: "沙摩柯(?-222年),东汉末三国时期五溪蛮首领。汉章武元年(221年)初,为报关羽被东吴杀害之仇,刘备亲自领兵攻孙权,以金锦爵赏诱沙摩柯助战。章武二年(222年),吴大都督陆逊以火攻破刘备,率诸军齐击,汉军四十多个营寨被攻破,沙摩柯在大乱中匹马奔逃,被乱军杀死。", - lvfan: "吕范(?-228年),字子衡。汝南郡细阳县(今安徽太和)人。汉末至三国时期吴国重臣。吕范年轻为汝南县吏,后避难寿春,结识孙策。此后随孙策、孙权征伐四方,对稳固孙氏在江东的统治做出了杰出的贡献,孙权将其比之于东汉开国元勋吴汉。吴国建立后,吕范累官至前将军、假节、扬州牧,封南昌侯。黄武七年(228年),吕范被拜为大司马,未得授官,便已病逝。孙权悲痛不已,遣使赠其大司马印绶。孙权还都建业后,以太牢礼祭祀吕范。", - liqueguosi: "请分别查看「李傕」和「郭汜」的武将介绍。", - maojie: "毛玠(?—216年),字孝先,陈留平丘(今河南封丘)人。东汉末年大臣。年少时为县吏,以清廉公正著称。因战乱而打算到荆州避乱,但中途知道刘表政令不严明,因而改往鲁阳。后来投靠曹操,提出“奉天子以令不臣,脩耕植,畜军资”的战略规划,得到曹操的欣赏。
    毛玠与崔琰主持选举,所举用的都是清廉正直之士。而毛玠为人廉洁,激起天下廉洁之风,一改朝中奢华风气。曹操大为赞赏,曹丕也亲自去拜访他。
    曹操获封魏公后,毛玠改任尚书仆射,再典选举。又密谏曹操应该立嫡长子曹丕为魏国太子。崔琰被杀后,毛玠十分不快。后来有人诬告毛玠,曹操大怒,将毛玠收于狱中。及后在桓阶、和洽营救下,只被免职,不久逝世于家中。曹操在他死后赐他棺材和钱帛。", - - huangfusong: "字义真。安定郡朝那县(今宁夏彭阳)人。于黄巾起义时,以中郎将身份讨伐黄巾,用火攻大破张梁、张宝。后接替董卓进攻张梁,连胜七阵。掘张角墓,拜左车骑将军、冀州牧,因拒绝贿赂宦官而被免职。 董卓死,王允命其与吕布等共至郿坞抄籍董卓家产、人口,皇甫嵩将坞中所藏良家子女,尽行释放。", - zangba: "其父臧戒,有二子臧艾与臧舜。年少时曾召集数人将获罪的父亲救出,此后四处流亡。后来成为陶谦麾下的骑都尉,负责募兵抵抗黄巾军。与孙观、尹礼等人拥兵驻屯于开阳,自成一股独立势力,后跟随吕布。吕布战败后,投降了曹操。后与袁绍、孙权等的战役里战功赫赫,官至镇东将军。", - zhangren: "刘璋的属下,以忠勇著称。刘备入蜀时,张任曾劝刘璋提防刘备,但刘璋没有听从。魏延舞剑想趁机除掉刘璋时,张任出面对舞,解救刘璋。后在刘备进攻时于落凤坡射死了庞统。", - jiling: "东汉末年袁术帐下将领,勇猛非常,曾奉命率军攻打小沛的刘备,在吕布辕门射戟的调停下撤兵。", - zoushi: "军阀张济之妻,张绣之婶。张绣降曹后,邹氏遂被曹操霸占。贾诩献计趁机诛杀曹操,险些得手。曹操在损失爱将典韦、侄子曹安民和长子曹昂后方才逃出生天。", - ganfuren: "刘备起兵后,于沛城娶甘氏为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。", - jiangfei: "请分别查看「蒋琬」和「费袆」的武将介绍。", - mifuren: "刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。", - chendong: "陈武,东吴将领,孙策攻打刘繇,陈武前来相助,孙策非常喜爱陈武,拜为校尉,使作先锋。陈武以十数骑兵力杀敌五十余人。后于赤壁等战役屡立功勋。董袭献上严虎的人头来降孙策。赤壁之战,董袭受周瑜命,分兵去汉阳,合肥会战时接应太史慈,逍遥津支援孙权。濡须口之战时,董袭在船上督战,船覆董袭坚守殉职。", - jiangqing: "擅长弓术。与周泰原为活跃于长江一带的江贼,孙策脱离袁术下江东自立门户时,和周泰一起率众投靠。 孙策攻刘繇,并引出城中麾下的陈横、薛礼、张英三名将领,陈横后被蒋钦一箭射杀,后与韩当等将乘舟过江,乱箭射杀敌军。曾在赤壁之战与周泰,还有擅使长枪的韩当率领水军在三江口踏江破敌。", - kongrong: "字文举,鲁国人,东汉文学家,“建安七子”之首。献帝即位后任北军中侯、虎贲中郎将、北海相,时称孔北海后因触怒曹操,为曹操所杀。能诗善文。", - mateng: "字寿成,扶风茂陵人,东汉末年征西将军,割据西凉一带的军阀,伏波将军马援的后代,官至卫尉,封爵槐里乡侯。因其子马超谋反,而被杀,夷灭三族。", - tianfeng: "字元皓。东汉末年大军阀袁绍部下重要谋士。为人刚直不阿,曾多次向袁绍进言而不被采纳。后因谏阻袁绍征伐曹操而被袁绍下令监禁,并于官渡之战后,被袁绍杀害。", - caochun: "字子和,沛国谯(今安徽亳州)人。东汉末年曹操麾下将领,曹仁之弟。曹纯是曹操部下精锐部队“虎豹骑”的统领者之一,因在平定北方的战役中颇有功绩,被加封为高陵亭侯。死后谥曰威侯。曹纯擅战,甚得人心,为人重纲纪,不失理智,好学问,敬爱学士,闻名天下。", - hanba: "中国古代神话传说中引起旱灾的怪物。《诗·大雅·云汉》:“旱魃为虐,如惔如焚。”", - cuiyan: "字季珪,清河东武城(今河北省清河县)人。东汉末年名士,司空崔林的从兄,曹操帐下谋士。崔琰相貌俊美,很有威望,曹操对他也很敬畏。建安二十一年(216年),崔琰在给杨训的书信中写道“时乎时乎,会当有变时”,曹操认为此句有不逊之意,因而将崔琰下狱,不久崔琰即被曹操赐死。", - lifeng: "南阳(治今河南南阳)人,三国时期蜀汉大臣李严之子。230年,李严迁为骠骑将军,率军前往汉中,诸葛亮上表推举李丰为江州都督督军,以代替李严管理后方事务。李严去世后,李丰在蜀汉官至朱提太守。", - sunru: "孙茹,孙坚之妹,其名载于《江浙通志》中。儿子徐琨亦为孙吴早期名将,当初母子二人随军跟从孙策渡长江时,因为暂时没足够的船,孙策感到苦恼打算暂时驻军江边。孙茹夫人献计以芦苇为筏,孙策大喜。吴军遂以神不知鬼不觉的速度过长江击破刘繇部将张英,立下平江东第一功。", - lingcao: "东汉末年将领,吴郡余杭(今浙江余杭)人,凌统之父。早年跟随孙策转战江东。孙权统军后,凌操随其征伐黄祖,被甘宁射杀。《吴书》载:甘宁以善射,将兵在后,射杀校尉凌操", - zhugeguo: "诸葛果,为《历代神仙通鉴》中诸葛亮女儿的名字,《历代神仙通鉴》记录从上古到明代的神仙历史,因此诸葛果不见于任何史书。成都西南有朝真观,即乘烟观。相传,诸葛果在这里修行后成仙升天。", - zhuling: "朱灵(生卒年不详),字文博,冀州清河国人,三国时期曹魏名将。官至后将军,封为高唐侯,谥号威侯。初为袁绍部将,后归顺曹操,随曹操征伐四方,屡建战功。", - re_yuanshu: "字公路,汝南汝阳人,袁绍之弟。初为虎贲中郎将。董卓进京后以袁术为后将军,袁术因畏祸而出奔南阳。初平元年与袁绍、曹操等同时起兵,共讨董卓。后与袁绍对立,被袁绍、曹操击败,率馀众奔九江,割据扬州。建安二年称帝,建号仲氏。", - fuwan: "伏完(?-209),琅邪东武(今属山东)人,东汉末大臣,汉献帝伏皇后之父。历官辅国将军、中散大夫、屯骑校尉。", - liuxie: "字伯和,又字合。汉族,祖籍沛县,生于洛阳。汉灵帝第三子,被董卓迎立为帝。董卓被王允和吕布诛杀后,董卓部将李傕等攻入长安,再次挟持了他,后来逃出长安。公元196年,曹操控制了刘协,并迁都许昌,“挟天子以令诸侯”。公元220年,曹操病死,刘协被曹丕控制,随后被迫禅让于曹丕。", - yuanshu: "字公路,汝南汝阳人,袁绍之弟。初为虎贲中郎将。董卓进京后以袁术为后将军,袁术因畏祸而出奔南阳。初平元年与袁绍、曹操等同时起兵,共讨董卓。后与袁绍对立,被袁绍、曹操击败,率馀众奔九江,割据扬州。建安二年称帝,建号仲氏。", - gongsunzan: "字伯珪,汉族,号“白马义从”。辽西令支人。东汉末年献帝年间占据幽州一带的军阀,汉末群雄之一。出身贵族,因母地位卑贱,只当了郡中小吏。他貌美,声音洪亮,机智善辩。后随卢植于缑氏山中读书,粗通经传。", - caohong: "字子廉,沛国谯(今安徽亳县)人,曹操从弟,曾献马并救护曹操。后多随军征伐,平兖州、征刘表、讨祝臂。曹丕即位时封曹洪为骠骑将军。曹叡即位,拜曹洪为后将军,更封乐城侯,后复拜为骠骑将军。曹洪逝世,追谥曰恭侯。", - guanyinping: "河东解县(今山西运城)人,美髯公关羽之女。因在关羽的四个子女中排行第三,故又被称作“关三小姐”、“关氏三姐”或“关羽三小姐”。传说她是赵云的弟子、并随同诸葛亮平定南蛮。", - xiahouba: "夏侯渊次子。本为曹魏武将,后因司马懿诛曹爽一族,夏侯霸身为曹氏宗室而心怀不安,遂投降蜀汉。后随蜀将姜维北伐,官至车骑将军。", - daxiaoqiao: "大乔,庐江皖县人,为乔公长女,孙策之妻,容貌国色流离。小乔为大乔之妹,周瑜之妻,资貌绝伦。两人合称“二乔”。", - yuejin: "字文谦,魏“五子良将”之一。容貌短小,以胆烈跟从曹操,南征北讨,战功无数。从击袁绍于官渡,奋勇力战,斩袁绍部将淳于琼。又从击袁绍子谭、尚于黎阳,斩其大将严敬。从平荆州,留屯襄阳,进击关羽、苏非等人,击退其众,南郡诸郡的山谷蛮夷都前往乐进处投降。后来从曹操征孙权,假进节。曹操回师后,留乐进与张辽、李典屯于合肥。又以乐进数有军功,迁右将军。建安二十三年逝世,谥曰威侯。", - caoang: "字子修,曹操的长子,由于性情谦和且聪慧所以深得曹操喜爱。曹操征讨张绣时,羞辱张绣之婶邹氏,被张绣突然袭击。曹昂为保护曹操撤退,与典韦一起战死在宛城。", - zhugejin: "字子瑜,吴国大臣,诸葛亮之兄,诸葛恪之父。经鲁肃推荐,为东吴效力。胸怀宽广,温厚诚信,得到孙权的深深信赖,努力缓和蜀汉与东吴的关系。建安二十五年(220年)吕蒙病逝,诸葛瑾代吕蒙领南郡太守,驻守公安。孙权称帝后,诸葛瑾官至大将军,领豫州牧。", - zhangxingcai: "蜀名将张飞与夏侯氏所生之女,刘禅的妻子,史上称为“敬哀皇后”。", - zumao: "字大荣,吴郡富春人,使用双刀。孙坚在汜水关被华雄击败,祖茂为保护主公而主动提出与孙坚交换头盔,孙坚因此得脱。祖茂将孙坚的赤帻挂在柱子上,准备以此引诱华雄,趁机偷袭,却反被华雄所杀。", - dingfeng: "吴国将领。年少时以骁勇为小将,经常奋勇杀敌,屡立功勋,此后又于东兴之战中“雪中奋短兵”,大破侵犯东吴的魏军。吴景帝孙休在位时,丁奉设计除掉了东吴的权臣孙綝,被拜为大将军,后为右大司马、左军师。", - panfeng: "冀州牧韩馥部下的上将。当十八路诸侯讨伐董卓之时,他奉韩馥之命前往汜水关前挑战董卓部下大将华雄,不敌被斩。", - maliang: "字季常,因眉毛中有白毛,人称白眉马良,马谡的兄长。马良在兄弟五人中名声最佳,因此有“马氏五常,白眉最良”的说法。", - zhugedan: "字公休,曹魏后期的重要将领,诸葛亮的族弟。曾与司马师一同平定毌丘俭、文钦的叛乱。之后因与被诛的夏侯玄、邓飏交厚,且见到王淩、毌丘俭等人的覆灭而心不自安,于甘露二年起兵,并得到东吴的支援,但于次年被镇压,被大将军司马胡奋所斩。", - hetaihou: "大将军何进的妹妹,汉灵帝刘宏第二任皇后,汉少帝刘辩的生母。何氏出身于屠户家庭,后选入掖庭,得到汉灵帝临幸,生下皇子刘辩,并受封贵人。光和三年(180年),立为皇后。中平六年(189年),汉灵帝去世,刘辩继位,尊何氏为皇太后。董卓进京,废黜刘辩,不久毒杀刘辩及何氏。", - sunluyu: "又名小虎,孙权与步练师之女。吴后期,孙鲁班诬陷孙鲁育参与谋反,于是孙峻杀害了孙鲁育。", - wenpin: "本为刘表大将,刘表死后,跟随刘琮投降曹操。后曹操令其镇守江夏,多次阻止了关羽和孙权的进攻,为曹操倚为屏障的大将之一。", - zhanglu: "汉宁太守,继父祖之后传播五斗米教。刘璋杀张鲁之母,二人因此结仇,多次交战。刘备攻益州时,刘璋向张鲁求援。张鲁派马超前往,但马超投降刘备。张鲁后见曹操自封魏王,想要自立为汉宁王,为谋士阎圃劝免。后曹操讨汉中,张鲁败,众人劝其烧粮仓,张鲁认为这是国家之物,未听从,为曹操所称赞。后投降曹操,任镇南将军。", - mayunlu: "马腾之女,马超之妹,赵云之妻。父亲令其自幼习武,枪术非凡,寻常男子也是难以匹敌。", - tadun: "东汉末年辽西乌桓(亦称乌丸)的首领,乌桓大人丘力居的从子,总摄三王部。曾出兵协助袁绍,击破公孙瓒。此后受袁绍假传朝廷诏命,与三王难楼、苏仆延、乌延等人同受单于称号及印绶。后难楼、苏仆延率其部众奉立楼班为单于,蹋顿于是退位为王。袁绍死后,收到被曹操击败的袁尚的求助,纠集逃亡至乌桓的幽州、冀州官吏百姓,企图夺回河北。东汉建安十二年,曹操亲征乌桓。八月,乌桓、袁氏部队于柳城白狼山为曹军所败,蹋顿在此战中被曹操的先锋张辽所斩杀。 ", - yanbaihu: "吴郡乌程县人,原名“严虎”,别号“白虎”,东汉末年盘据吴郡一带山贼出身的地方豪帅。献帝初拥兵万人自固。孙策受袁术使渡江,攻破白虎等。白虎奔余杭,投靠许昭。建安二年,再度被孙策击败,至此不知亡佚何处。", - simalang: "字伯达,“司马八达”之一。曹操任司空后,司马朗被辟为司空属官,又历任成皋令、堂阳长、元城令、丞相主簿、兖州刺史等职,所在皆有政绩,深受百姓爱戴。后司马朗与夏侯惇、臧霸等征讨吴国,到达居巢。军队中流行瘟疫,司马朗亲自去视察,派送医药,因此染病去世。", - wangji: "字伯舆,东莱曲城人。三国时期魏国将领。王基文武兼备,才高于世,德溥于时,深得司马懿、司马师、司马昭的器重,尤其在南征毋丘俭,文钦之乱,东征诸葛诞之叛大规模军事活动中,王基与司马师、司马昭结下了深厚的军友情谊。魏景元二年王基去世,追赠司空,谥号为景侯。", - buzhi: "吴重臣,最初避难江东,于孙权统事后,被召为主记。后游历吴地,又任海盐县长,还任东曹掾,出领鄱阳太守。建安十五年,转交州刺史、立武中郎将,率军接管往交州,追拜使持节、征南中郎将。次年,以平定交州功,加平戎将军,封广信侯。后迁右将军、左护军,改封临湘侯。孙权称帝后,拜骠骑将军,领冀州牧,后因冀州分与蜀汉而解牧职。又都督西陵。赤乌九年,代陆逊为丞相。", - litong: "字文达,小字万亿。江夏平春(今河南信阳)人,汝南太守。早年以游侠闻名于江汝,在率众补充曹操兵源有功拜为阳安都尉,其间不因私而忘公,不因其妻子的求请而过问执法者。后来在曹操讨伐马超时出阵挑战,死于马超枪下。", - mizhu: "原为徐州富商,后被徐州牧陶谦辟为别驾从事。陶谦病死后,奉其遗命迎接刘备。与其弟麋芳拒绝曹操的任命而跟随刘备,在刘备最潦倒之时给予刘备很大的帮助,使他重新振作。214年(建安十九年),刘备入主益州后,拜麋竺为安汉将军,地位在诸葛亮之上,为刘备手下众臣之最。吕蒙袭取荆州,麋芳举城投降,导致关羽兵败身亡,麋竺面缚请罪,刘备劝慰麋竺,对他待遇如初。", - dongbai: "东汉末年县君,陇西临洮(今甘肃省岷县)人,董卓之孙女。董卓当权时,遍封其宗族,其中孙女董白尚未及笄,被封为渭阳君。", - zhaoxiang: "赵云与马云騄之女,赵统赵广之妹,关平之妻。", - heqi: "早年在平定山越的战争中立有大功,又讨平叛乱无数,身经百战,所向披靡,深受孙权器重。后来在与魏国的多次边境争斗中也屡立战功,官至后将军,并领徐州牧。", - dongyun: "大汉重臣,掌军中郎将董和之子。东汉末年,其父董和事刘璋为益州太守,刘备立太子时,允被选为洗马,后为黄门侍郎,延熙六年(公元243年)加辅国将军,延熙七年(公元244年)以侍中守尚书令,任大将军费祎的副手。", - mazhong: "本名狐笃,字德信,巴西阆中人,初次出场时随丞相诸葛亮南征孟获,诸葛亮遣马忠与赵云两路夹攻,大败蛮将阿会喃。孟获派弟孟优赴汉军处假投降,欲内应外合,诸葛亮将计就计,埋伏擒获孟获和诸洞酋长,马忠亦于此战立下战功。后诸葛亮北伐时亦数次出阵,立下汗马功劳。", - kanze: "孙权谋士,在孙权广纳贤才之时与严畯等来到江东,甚为孙权礼遇。第一个识破周瑜打黄盖是苦肉计,后欣然向曹操献诈降书,被曹操识破后面不改色,哈哈大笑,一番妙言让曹操相信了诈降书,是苦肉计中的关键人物。后劝孙权不要设局请关羽。在刘备御驾亲征东吴时,向孙权举荐陆逊为都督,间接上挽救了东吴的命运。", - lingju: "相传为吕布与貂蝉的女儿,被汉献帝掳走并训练为死士,被秘密送入宫中接近曹操,成为其“忘年红颜知己”。外表是柔弱的女子,实际上身怀致命的杀人绝技,等待时机给予曹操致命一击。", - yangxiu: "字德祖,今陕西华阴人,是东汉末年的文学家。杨修学问渊博,极聪慧,任丞相府主簿。史载,“是时,军国多事,修总知外内,事皆称意”。", - chenlin: "陈琳(?-217年),字孔璋,广陵射阳(今江苏宝应)人。东汉末年著名文学家,“建安七子”之一。", - zhugeke: "字元逊,琅邪阳都(今山东沂南)人。三国时期吴臣,蜀丞相诸葛亮之侄,吴大将军诸葛瑾长子,从小就以神童著称,深受孙权赏识。", - zhangbao: "东汉末年黄巾起义的首领之一,张角之弟,张梁之兄。中平元年(184)随兄张角起义,号称“地公将军”。", - chengyu: "字仲德,本名程立,因梦中於泰山捧日,更名程昱。荀彧投曹操时向其举荐程昱。他参与了攻打吕布、袁绍、刘备、孙权的大部份战事,一直出谋献策,表现出众。", - sunhao: "孙权之孙,孙和之子,东吴的末代君主。在位初期虽施行过明政,但不久即沉溺酒色,专于杀戮,变得昏庸暴虐,嗜用挖眼、剥皮等酷刑。280年,吴国被西晋所灭,孙皓投降西晋,被封为归命侯。", - wutugu: "南蛮乌戈国主,身长丈二(约合现在2.77米),不食五谷,以生蛇恶兽为饭。身有鳞甲,刀箭不能侵。兀突骨乘骑巨象,头戴日月狼须帽,身披金珠缨络,两肋下露出生鳞甲,眼目中微有光芒。", - shixie: "割据交州(今越南)一带的军阀,年少时师事刘陶,经逐渐升迁任交趾太守。后被朝廷加职绥南中郎将,迁安远将军,封龙度亭侯。在步骘接管交州时积极配合,归附孙权,被孙权加为左将军;此后又因诱降益州豪族雍闿而迁任卫将军,进封龙编侯。任交趾太守四十年。", - guansuo: "关羽的三子。自荆州失陷后,逃难在鲍家庄养病,伤势痊愈之后入蜀,逢丞相诸葛亮南征,拜之为前部先锋,一同南征。", - wanglang: "字景兴,汉末三国经学家,曹魏初期重臣。曾任会稽太守举兵抵抗孙策,后为曹操所征,被拜为谏议大夫等职。曹丕建立魏国后任命为司空。小说《三国演义》中他在阵前与诸葛亮饶舌比拼,最终被诸葛亮言词所驳倒,一时气愤坠马身亡。", - zhangliang: "东汉末年黄巾起义首领之一,张角的三弟。中平元年(184)随兄起义,号称“人公将军”。遭到朝廷所派左中郎将皇甫嵩进攻时,他率军在广宗(今河北威县)进行反击。后因警戒疏忽,遭到汉军夜袭,兵败身亡。", - }, - characterTitle: {}, - perfectPair: { - yuejin: ["re_lidian"], - zhugejin: ["zhugeke", "sunquan"], - guanyinping: ["guanyu"], - zhangxingcai: ["liushan"], - fuwan: ["fuhuanghou"], - sunshangxiang: ["liubei"], - caoang: ["caocao"], - zhangbao: ["zhangliang", "zhangjiao"], - zhangliang: ["zhangjiao"], - maliang: ["masu"], - lingcao: ["lingtong"], - lingju: ["diaochan", "lvbu"], - jiangqing: ["zhoutai"], - dingfeng: ["xusheng", "zhugeke"], - caohong: ["caoren"], - daxiaoqiao: ["zhouyu", "sunce"], - cuiyan: ["caocao"], - guansuo: ["guanyu"], - mateng: ["machao", "madai", "mayunlu"], - chengpu: ["zhouyu"], - hanba: ["swd_muyun"], - dongbai: ["dongzhuo"], - cuimao: ["caopi"], - simazhao: ["wangyuanji"], - }, - card: { - //蒲元衍生 - sanlve: { - derivation: "ol_puyuan", - cardcolor: "spade", - type: "equip", - subtype: "equip5", - ai: { - basic: { - equipValue: 5, - }, - }, - skills: ["sanlve_skill"], - fullskin: true, - }, - zhaogujing: { - derivation: "ol_puyuan", - cardcolor: "diamond", - type: "equip", - subtype: "equip5", - ai: { - basic: { - equipValue: 6.5, - }, - }, - skills: ["zhaogujing_skill"], - fullskin: true, - }, - shufazijinguan: { - derivation: "ol_puyuan", - cardcolor: "diamond", - type: "equip", - subtype: "equip5", - modeimage: "boss", - ai: { - basic: { - equipValue: 8, - }, - }, - skills: ["shufazijinguan_skill"], - fullskin: true, - }, - xuwangzhimian: { - derivation: "ol_puyuan", - cardcolor: "club", - type: "equip", - fullskin: true, - subtype: "equip5", - modeimage: "boss", - skills: ["xuwangzhimian"], - ai: { - equipValue: 7, - }, - }, - hongmianbaihuapao: { - derivation: "ol_puyuan", - cardcolor: "club", - type: "equip", - subtype: "equip2", - modeimage: "boss", - ai: { - basic: { - equipValue: 4, - }, - }, - skills: ["hongmianbaihuapao_skill"], - fullskin: true, - }, - guofengyupao: { - derivation: "ol_puyuan", - cardcolor: "spade", - type: "equip", - fullskin: true, - modeimage: "boss", - subtype: "equip2", - skills: ["guofengyupao"], - ai: { - equipValue: 7, - }, - }, - qimenbagua: { - derivation: "ol_puyuan", - cardcolor: "spade", - type: "equip", - fullskin: true, - modeimage: "boss", - subtype: "equip2", - skills: ["qimenbagua"], - ai: { - equipValue: 7.5, - }, - }, - linglongshimandai: { - derivation: "ol_puyuan", - cardcolor: "spade", - type: "equip", - subtype: "equip2", - modeimage: "boss", - ai: { - basic: { - equipValue: 5, - }, - }, - skills: ["linglongshimandai_skill"], - fullskin: true, - }, - chixueqingfeng: { - derivation: "ol_puyuan", - cardcolor: "spade", - type: "equip", - fullskin: true, - modeimage: "boss", - subtype: "equip1", - distance: { attackFrom: -1 }, - skills: ["chixueqingfeng"], - ai: { - equipValue: 6.7, - }, - }, - guilongzhanyuedao: { - derivation: "ol_puyuan", - cardcolor: "spade", - type: "equip", - fullskin: true, - modeimage: "boss", - subtype: "equip1", - distance: { attackFrom: -2 }, - skills: ["guilongzhanyuedao"], - nomod: true, - nopower: true, - unique: true, - ai: { - equipValue: 4, - }, - }, - wushuangfangtianji: { - derivation: "ol_puyuan", - cardcolor: "diamond", - type: "equip", - modeimage: "boss", - subtype: "equip1", - distance: { - attackFrom: -3, - }, - ai: { - basic: { - equipValue: 3, - }, - }, - skills: ["wushuangfangtianji_skill"], - fullskin: true, - }, - bintieshuangji: { - derivation: "ol_puyuan", - cardcolor: "diamond", - type: "equip", - subtype: "equip1", - distance: { - attackFrom: -2, - }, - ai: { - basic: { - equipValue: 4.5, - }, - }, - skills: ["bintieshuangji_skill"], - fullskin: true, - }, - //王允 - wy_meirenji: { - fullskin: true, - vanish: true, - derivation: "wangyun", - type: "trick", - enable: true, - filterTarget: function (card, player, target) { - return target.countCards("h") && target != player && target.hasSex("male"); - }, - content: function () { - "step 0"; - event.list = game - .filterPlayer(function (current) { - return current != player && current != target && current.hasSex("female"); - }) - .sortBySeat(); - "step 1"; - if (target.countCards("h") && event.list.length) { - event.current = event.list.shift(); - event.current.gainPlayerCard(target, true, "h"); - target.line2([event.current, player]); - } else { - event.goto(4); - } - "step 2"; - event.current.chooseCard("h", true, "将一张手牌交给" + get.translation(player)); - "step 3"; - if (result.bool) { - event.current.give(result.cards, player); - } - event.goto(1); - "step 4"; - var n1 = target.countCards("h"); - var n2 = player.countCards("h"); - if (n1 > n2) { - target.damage(player); - player.line(target); - } else if (n1 < n2) { - player.damage(target); - target.line(player); - } - }, - ai: { - order: 6, - result: { - target: function (player, target) { - var num = game.countPlayer(function (current) { - return current != player && current != target && current.hasSex("female"); - }); - var nh = target.countCards("h"); - num = Math.min(num, nh); - var nh1 = nh - num; - var nh2 = player.countCards("h") - 1 + num; - if (nh1 == nh2 && num == 0) return 0; - if (nh2 <= nh1) return -3; - if (player.hp == 1 || num == 1) return 0; - return -1; - }, - }, - }, - }, - wy_xiaolicangdao: { - fullskin: true, - vanish: true, - derivation: "wangyun", - type: "trick", - enable: true, - filterTarget: function (card, player, target) { - return target != player; - }, - content: function () { - "step 0"; - var num = Math.min(5, target.maxHp - target.hp); - if (num) target.draw(num); - "step 1"; - target.damage(); - }, - ai: { - order: 6, - tag: { - damage: 1, - }, - result: { - target: function (player, target) { - var num = Math.min(5, target.maxHp - target.hp); - if (target.hp == 1) { - if (num >= 3) return 0; - if (!target.hasSkillTag("maixie_hp")) { - return -3; - } - return -1; - } - if (num == 2) return 0; - return -2 + num + (Math.pow(target.hp, 0.2) - 1); - }, - }, - }, - }, - zhuangshu_basic: { - fullskin: true, - vanish: true, - derivation: "fengfangnv", - cardcolor: "spade", - type: "equip", - subtype: "equip5", - skills: ["zhuangshu_basic"], - forceDie: true, - onLose: function () { - if ((!event.getParent(2) || event.getParent(2).name != "swapEquip") && (event.getParent().type != "equip" || event.getParent().swapEquip)) { - card.fix(); - card.remove(); - card.destroyed = true; - game.log(card, "被销毁了"); - } - }, - equipDelay: false, - loseDelay: false, - ai: { - equipValue: 5, - basic: { - equipValue: 5, - }, - }, - }, - zhuangshu_trick: { - fullskin: true, - vanish: true, - derivation: "fengfangnv", - cardcolor: "club", - type: "equip", - subtype: "equip5", - forceDie: true, - skills: ["zhuangshu_trick"], - onLose: function () { - if ((!event.getParent(2) || event.getParent(2).name != "swapEquip") && (event.getParent().type != "equip" || event.getParent().swapEquip)) { - card.fix(); - card.remove(); - card.destroyed = true; - game.log(card, "被销毁了"); - } - }, - equipDelay: false, - loseDelay: false, - }, - zhuangshu_equip: { - fullskin: true, - vanish: true, - derivation: "fengfangnv", - cardcolor: "heart", - type: "equip", - subtype: "equip5", - skills: ["zhuangshu_equip"], - forceDie: true, - inherit: "zhuangshu_basic", - onLose: function () { - if ((!event.getParent(2) || event.getParent(2).name != "swapEquip") && (event.getParent().type != "equip" || event.getParent().swapEquip)) { - card.fix(); - card.remove(); - card.destroyed = true; - game.log(card, "被销毁了"); - } - }, - equipDelay: false, - loseDelay: false, - }, - }, - skill: { - //SP孙策 - olliantao: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return game.hasPlayer(target => target != player); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("olliantao"), lib.filter.notMe) - .set("ai", target => { - const player = get.event("player"), - att = get.attitude(player, target); - const colors = Object.keys(lib.color).filter(i => i != "none"); - if ( - !colors.some(color => - player.hasCard(card => { - const juedou = get.autoViewAs({ name: "juedou" }, [card]); - return player.canUse(juedou, target, false); - }, "h") - ) - ) - return 20 + (3 - get.sgn(att)) + Math.random(); - const effs = colors.reduce((list, color) => { - const cards = player.getCards("h", card => { - const juedou = get.autoViewAs({ name: "juedou" }, [card]); - return player.canUse(juedou, target, false); - }); - if (cards.length) { - list.push( - cards.reduce((sum, card) => { - const juedou = get.autoViewAs({ name: "juedou" }, [card]); - return sum + get.effect(target, juedou, player, player); - }, 0) - ); - } - return list; - }, []); - return Math[att > 0 ? "max" : "min"].apply(Math, effs); - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - const colors = Object.keys(lib.color).filter(i => i != "none"); - if (colors.length && player.countCards("h")) { - const result = await target - .chooseControl(colors) - .set("prompt", "连讨:请选择一个颜色") - .set("ai", () => { - const player = get.event("player"), - source = get.event().getParent().player; - let controls = get.event("controls").slice(); - if (controls.length == 1) return controls[0]; - const getSum = function (color, player, source) { - return source - .getCards("h", card => { - if (get.color(card) != color) return false; - const juedou = get.autoViewAs({ name: "juedou" }, [card]); - return source.canUse(juedou, player, false); - }) - .reduce((num, card) => { - const juedou = get.autoViewAs({ name: "juedou" }, [card]); - return num + get.effect(player, juedou, source, player); - }, 0); - }; - return controls.sort((a, b) => getSum(b, player, source) - getSum(a, player, source))[0]; - }) - .set("prompt2", get.translation(player) + "将对你依次使用由其手牌中所有此颜色的牌转化的【决斗】") - .forResult(); - const color = result.control; - game.broadcastAll( - (color, target) => { - lib.skill.olliantao_backup.filterCardx = [color, target]; - lib.skill.olliantao_backup.filterCard = function (card, player) { - const list = lib.skill.olliantao_backup.filterCardx; - if (get.color(card) != list[0]) return false; - const juedou = get.autoViewAs({ name: "juedou" }, [card]); - return player.canUse(juedou, list[1], false); - }; - }, - color, - target - ); - while ( - target.isIn() && - player.hasCard(card => lib.skill.olliantao_backup.filterCard(card, player)) && - !game.getGlobalHistory("everything", evt => { - return evt.name == "dying" && [player, target].includes(evt.player) && evt.getParent("olliantao") == event; - }).length - ) { - await player - .chooseToUse() - .set("forced", true) - .set("openskilldialog", "连讨:将一张" + get.translation(color) + "手牌当作【决斗】对" + get.translation(target) + "使用") - .set("norestore", true) - .set("_backupevent", "olliantao_backup") - .set("custom", { - add: {}, - replace: { window: function () {} }, - }) - .backup("olliantao_backup") - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", target) - .set("addCount", false); - } - } - const num = player - .getHistory("sourceDamage", evt => { - return evt.getParent(4) == event; - }) - .reduce((sum, evt) => sum + evt.num, 0); - if (num) await player.draw(num); - if ( - !game.hasPlayer2(current => { - return current.getHistory("damage", evt => { - return evt.getParent(4) == event; - }).length; - }) - ) { - await player.draw(3); - player.addTempSkill("olliantao_buff"); - player.addMark("olliantao_buff", 3, false); - } - }, - subSkill: { - backup: { - viewAs: { name: "juedou" }, - position: "h", - check: () => 1 + Math.random(), - precontent() { - delete event.result.skill; - }, - }, - buff: { - charlotte: true, - onremove: true, - mod: { - maxHandcard(player, num) { - return num + player.countMark("olliantao_buff"); - }, - cardEnabled(card) { - if (card.name == "sha") return false; - }, - }, - intro: { content: "手牌上限+#,不能使用【杀】" }, - }, - }, - }, - //刘辟 - olyicheng: { - audio: 2, - enable: "phaseUse", - usable: 1, - async content(event, trigger, player) { - let num = player.maxHp, cards = get.cards(num, true); - await player.showCards(cards, get.translation(player) + "发动了【易城】"); - if (player.countCards("h")) { - const sum = cards.reduce((num, card) => num + get.number(card), 0); - const { - result: { bool, moved }, - } = await player - .chooseToMove("易城:请选择你要交换的牌") - .set("list", [ - [ - "牌堆顶", - cards, - list => { - const sum2 = list.reduce((num, card) => num + get.number(card, false), 0); - return "牌堆顶(现" + sum2 + { 0: "=", "-1": "<", 1: ">" }[get.sgn(sum2 - sum).toString()] + "原" + sum + ")"; - }, - ], - ["手牌", player.getCards("h")], - ]) - .set("filterOk", moved => moved[1].some(i => !get.owner(i))) - .set("processAI", list => { - const player = get.event("player"), - limit = Math.min(get.event("num"), player.countCards("h")); - let cards = list[0][1].slice(), - hs = player.getCards("h"); - if (cards.reduce((num, card) => num + get.value(card), 0) > player.getCards("h").reduce((num, card) => num + get.value(card), 0)) { - cards.sort((a, b) => get.number(a) - get.number(b)); - hs.sort((a, b) => get.number(b) - get.number(a)); - let cards2 = cards.slice(0, limit), - hs2 = hs.slice(0, limit); - if (hs2.reduce((num, card) => num + get.number(card), 0) > cards2.reduce((num, card) => num + get.number(card), 0)) { - cards.removeArray(cards2); - hs.removeArray(hs2); - return [cards.concat(hs2), hs.concat(cards2)]; - } - return [cards, hs]; - } else { - cards.sort((a, b) => get.value(b) - get.value(a)); - hs.sort((a, b) => get.value(a) - get.value(b)); - let cards2 = cards.slice(0, limit), - hs2 = hs.slice(0, limit), - list = [cards, hs]; - for (let i = 0; i < limit; i++) { - if (get.value(cards2[i]) > get.value(hs2[i])) { - const change = [cards2[i], hs2[i]]; - cards[i] = change[1]; - hs[i] = change[0]; - } else break; - } - return list; - } - }) - .set("num", num); - if (bool) { - const puts = player.getCards("h", i => moved[0].includes(i)); - const gains = cards.filter(i => moved[1].includes(i)); - if (puts.length && gains.length) { - player.$throw(puts, 1000); - await player.lose(puts, ui.special); - await player.gain(gains, "gain2"); - cards = moved[0].slice(); - if (cards.length) { - await game.cardsGotoOrdering(cards); - for (let i = cards.length - 1; i--; i >= 0) { - ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); - } - game.log(cards, "被放回了牌堆顶"); - game.updateRoundNumber(); - } - await player.showCards(cards, get.translation(player) + "【易城】第一次交换后"); - if (cards.reduce((num, card) => num + get.number(card), 0) > sum && player.countCards("h")) { - const { - result: { bool }, - } = await player.chooseBool("易城:是否使用全部手牌交换" + get.translation(cards) + "?").set( - "choice", - (() => { - return cards.reduce((num, card) => num + get.value(card), 0) > player.getCards("h").reduce((num, card) => num + get.value(card), 0); - })() - ); - if (bool) { - const hs = player.getCards("h"); - player.$throw(hs, 1000); - await player.lose(hs, ui.special); - await player.gain(cards, "gain2"); - cards = hs.slice(); - if (cards.length) { - await game.cardsGotoOrdering(cards); - for (let i = cards.length - 1; i--; i >= 0) { - ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); - } - game.log(cards, "被放回了牌堆顶"); - game.updateRoundNumber(); - } - await player.showCards(cards, get.translation(player) + "【易城】第二次交换后"); - } - } - } - } - } - }, - ai: { - order: 9, - result: { player: 1 }, - }, - }, - //陆凯 - olxuanzhu: { - mark: true, - marktext: "☯", - zhuanhuanji: true, - audio: 2, - enable: "chooseToUse", - filter(event, player) { - if (!player.countCards("he") || event.type == "wuxie") return false; - return get - .inpileVCardList(info => { - const name = info[2], - type = get.type(name), - infox = get.info({ name: name }); - if (type != "basic" && type != "trick") return false; - if (type == "trick" && (!infox || !infox.filterTarget)) return false; - return (type != "basic") == (player.storage.olxuanzhu || false); - }) - .some(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); - }, - usable: 1, - chooseButton: { - dialog(event, player) { - const list = get - .inpileVCardList(info => { - const name = info[2], - type = get.type(name), - infox = get.info({ name: name }); - if (type != "basic" && type != "trick") return false; - if (type == "trick" && (!infox || !infox.filterTarget)) return false; - return (type != "basic") == (player.storage.olxuanzhu || false); - }) - .filter(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); - return ui.create.dialog("玄注", [list, "vcard"]); - }, - check(button) { - if (get.event().getParent().type != "phase") return 1; - return get.event("player").getUseValue({ name: button.link[2], nature: button.link[3] }); - }, - backup(links, player) { - let next = { - audio: "olxuanzhu", - filterCard: true, - popname: true, - check(card) { - return 1 / (get.value(card) || 0.5); - }, - position: "he", - ignoreMod: true, - precontent() { - const cards = event.result.cards.slice(); - player.addToExpansion(cards, player, "give").gaintag.add("olxuanzhu"); - const viewAs = { - name: event.result.card.name, - nature: event.result.card.nature, - }; - event.result.card = viewAs; - event.result.cards = []; - player - .when("useCardAfter") - .filter(evt => evt.skill == "olxuanzhu_backup") - .then(() => { - const card = cards[0]; - if (get.type(card) != "equip") player.chooseToDiscard("he", true); - else { - const cardx = player.getExpansions("olxuanzhu"); - if (cardx.length) { - player.loseToDiscardpile(cardx); - player.draw(cardx.length); - } - } - }) - .vars({ cards: cards }); - }, - onuse(result, player) { - player.changeZhuanhuanji("olxuanzhu"); - }, - }; - const viewAs = { - name: links[0][2], - nature: links[0][3], - suit: "none", - number: null, - isCard: true, - }; - next.viewAs = viewAs; - if (get.info("xunshi").isXunshi(viewAs)) { - next.filterTarget = function (card, player, target) { - const info = get.info(card); - if (info.changeTarget) { - let targets = [target]; - info.changeTarget(player, targets); - if (targets.length > 1) return false; - } - return lib.filter.filterTarget(card, player, target); - }; - next.selectTarget = 1; - } - return next; - }, - prompt(links, player) { - const viewAs = { - name: links[0][2], - nature: links[0][3], - suit: "none", - number: null, - isCard: true, - }; - const str = "将一张牌称为“玄”置于武将牌上,然后视为使用" + (get.translation(links[0][3]) || "") + "【" + get.translation(links[0][2]) + "】"; - return str + (get.info("xunshi").isXunshi(viewAs) ? "(仅能指定一个目标)" : ""); - }, - }, - hiddenCard(player, name) { - if (!lib.inpile.includes(name) || player.getStat("skill").olxuanzhu || !player.countCards("he")) return false; - return get - .inpileVCardList(info => { - const name = info[2], - type = get.type(name), - infox = get.info({ name: name }); - if (type != "basic" && type != "trick") return false; - if (type == "trick" && (!infox || !infox.filterTarget)) return false; - return (type != "basic") == (player.storage.olxuanzhu || false); - }) - .map(card => card[2]) - .includes(name); - }, - ai: { - order(item, player) { - if (player && get.event().type == "phase") { - let list = get - .inpileVCardList(info => { - const name = info[2], - type = get.type(name), - infox = get.info({ name: name }); - if (type != "basic" && type != "trick") return false; - if (type == "trick" && (!infox || !infox.filterTarget)) return false; - return (type != "basic") == (player.storage.olxuanzhu || false); - }) - .map(card => { - return { name: card[2], nature: card[3] }; - }) - .filter(card => player.getUseValue(card, true, true) > 0); - if (!list.length) return 0; - list.sort((a, b) => { - const getNum = function (card) { - if (get.info("xunshi").isXunshi(card)) - return get.effect( - game - .filterPlayer(target => { - return player.canUse(card, target, true, true); - }) - .sort((a, b) => get.effect(b, card, player, player) - get.effect(a, card, player, player))[0], - card, - player, - player - ); - return player.getUseValue(card, true, true); - }; - return (getNum(b) || 0) - (getNum(a) || 0); - }); - return get.order(list[0], player) * 0.99; - } - return 0.001; - }, - respondSha: true, - respondShan: true, - skillTagFilter(player, tag, arg) { - if (arg == "respond") return false; - const name = tag == "respondSha" ? "sha" : "shan"; - return get.info("olxuanzhu").hiddenCard(player, name); - }, - result: { player: 1 }, - }, - intro: { - markcount: "expansion", - mark(dialog, storage, player) { - const cards = player.getExpansions("olxuanzhu"); - if (cards.length) dialog.addSmall(player.getExpansions("olxuanzhu")); - dialog.addText( - (() => { - if (storage) return "每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。"; - return "每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用任意基本牌。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。"; - })(storage) - ); - }, - }, - onremove(player, skill) { - const cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - subSkill: { backup: {} }, - }, - oljiane: { - audio: 2, - trigger: { player: ["shaDamage", "useCardToEnd"] }, - filter(event, player, name) { - if (event.type != "card" || !event.target || !event.target.isIn() || event.target == player) return false; - if (name == "shaDamage") return true; - return event.card.name != "sha" && !event.getParent()._neutralized; - }, - logTarget: "target", - forced: true, - async content(event, trigger, player) { - trigger.target.addTempSkill("oljiane_neutralized"); - }, - group: "oljiane_neutralize", - global: "oljiane_ai", - subSkill: { - neutralize: { - audio: "oljiane", - trigger: { - target: "shaMiss", - global: "eventNeutralized", - }, - filter(event, player, name) { - if (event.type != "card") return false; - return name == "shaMiss" || event._neutralize_event.player == player; - }, - forced: true, - async content(event, trigger, player) { - player.addTempSkill("oljiane_nouse"); - }, - }, - ai: { - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if (!arg || !arg.target || !arg.target.hasSkill("oljiane_neutralized")) return false; - }, - }, - }, - neutralized: { - charlotte: true, - mark: true, - marktext: "牌", - intro: { content: "本回合无法抵消牌" }, - trigger: { global: "useCard" }, - forced: true, - popup: false, - async content(event, trigger, player) { - const id = player.playerid; - const map = trigger.customArgs; - if (!map[id]) map[id] = {}; - map[id].directHit2 = true; - }, - mod: { - wuxieJudgeEnabled: () => false, - wuxieEnabled: () => false, - }, - }, - nouse: { - charlotte: true, - mark: true, - marktext: '', - intro: { content: "本回合无法成为牌的目标" }, - mod: { targetEnabled: () => false }, - }, - }, - }, - //刘磐 - olpijing: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - return (event.card.name == "sha" || get.type(event.card) == "trick") && event.targets.length == 1; - }, - usable: 1, - direct: true, - locked: false, - async content(event, trigger, player) { - const num = Math.max(1, player.getDamagedHp()); - const { - result: { bool, targets }, - } = await player - .chooseTarget(get.prompt("olpijing"), [1, num], (card, player, target) => { - const trigger = get.event().getTrigger(); - if (trigger.targets.includes(target)) return true; - return target != player && lib.filter.targetEnabled2(trigger.card, player, target) && lib.filter.targetInRange(trigger.card, player, target); - }) - .set("ai", target => { - const player = get.event("player"), - trigger = get.event().getTrigger(); - return (trigger.targets.includes(target) ? -1 : 1) * get.effect(target, trigger.card, player, player) * (target.getStorage("olpijing_effect").includes(player) ? 2 : 1) + get.effect(target, { name: "shunshou_copy2" }, player, player); - }) - .set("prompt2", "令至多" + get.cnNumber(num) + "名角色成为或取消成为" + get.translation(trigger.card) + "的目标并随机交给你一张牌"); - if (bool) { - player.logSkill("olpijing", targets); - for (const i of targets) { - trigger.targets[trigger.targets.includes(i) ? "add" : "remove"](i); - } - for (const target of targets) { - target.addSkill("olpijing_effect"); - target.markAuto("olpijing_effect", [player]); - const cards = target.getGainableCards(player, "he"); - if (cards.length) { - await target.give(cards.randomGets(1), player); - } - } - } else player.storage.counttrigger.olpijing--; - }, - mod: { - aiOrder(player, card, num) { - if (!(card.name == "sha" || get.type(card) == "trick")) return; - const info = get.info(card); - if ( - info && - !info.notarget && - (info.toself || info.singleCard || !info.selectTarget || info.selectTarget == 1) && - game.countPlayer(target => { - if (get.effect(target, card, player, player) <= 0) return false; - return lib.filter.targetEnabled2(card, player, target) && lib.filter.targetInRange(card, player, target); - }) > 1 - ) - return num + 0.01; - }, - }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - intro: { - content: "使用的下一张基本牌或普通锦囊牌指定唯一目标时,可指定$为额外目标或摸一张牌", - }, - trigger: { player: "useCardToPlayer" }, - filter(event, player) { - return (get.type(event.card) == "basic" || get.type(event.card) == "trick") && event.targets.length == 1; - }, - forced: true, - popup: false, - async content(event, trigger, player) { - const storage = player.getStorage("olpijing_effect"); - player.removeSkill("olpijing_effect"); - const { - result: { bool, targets }, - } = await player - .chooseTarget("披荆:请选择此牌的额外目标", [1, storage.length], (card, player, target) => { - const trigger = get.event().getTrigger(); - return !trigger.targets.includes(target) && get.event("storage").includes(target) && lib.filter.targetEnabled2(trigger.card, player, target) && lib.filter.targetInRange(trigger.card, player, target); - }) - .set("prompt2", "不选择的角色视为你选择摸牌项") - .set("ai", target => { - const player = get.event("player"), - trigger = get.event().getTrigger(); - return get.effect(target, trigger.card, player, player) - get.effect(player, { name: "draw" }, player, player); - }) - .set("storage", storage); - if (bool) { - player.line(targets); - trigger.targets.addArray(targets); - if (storage.length - targets.length > 0) { - player.draw(storage.length - targets.length); - } - } else player.draw(storage.length); - }, - }, - }, - }, - //郭图 - olqushi: { - audio: 2, - enable: "phaseUse", - usable: 1, - delay: false, - async content(event, trigger, player) { - await player.draw(); - if (player.countCards("h") && game.hasPlayer(target => target != player)) { - const { - result: { bool, targets, cards }, - } = await player.chooseCardTarget({ - forced: true, - prompt: "将一张手牌作为“趋”扣置于其他角色的武将牌上", - filterTarget: lib.filter.notMe, - filterCard: true, - position: "h", - ai1(card) { - if (get.type(card, false) == "equip") return 1 - get.value(card); - return 7 - get.value(card); - }, - ai2(target) { - const att = get.sgn(get.sgn(get.attitude(get.event("player"), target)) + 0.5); - return (target.countCards("h") + 1) * att; - }, - }); - if (bool) { - const target = targets[0]; - target.addSkill("olqushi_effect"); - target.markAuto("olqushi_effect", [player]); - game.log(player, "将一张牌扣置于", target, "的武将牌上"); - target.addToExpansion(cards, player, "giveAuto").gaintag.add("olqushi_effect"); - } - } - }, - ai: { - order: 1, - result: { player: 1 }, - }, - subSkill: { - effect: { - charlotte: true, - onremove(player, skill) { - delete player.storage[skill]; - const cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - marktext: "趋", - intro: { - content: "expansion", - markcount: "expansion", - mark(dialog, storage, player) { - return "共扣置" + get.cnNumber(player.getExpansions("olqushi_effect").length) + "张“趋”"; - }, - }, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - popup: false, - async content(event, trigger, player) { - const cards = player.getExpansions("olqushi_effect"); - if (cards.length) { - await player.loseToDiscardpile(cards); - const targets = player - .getStorage("olqushi_effect") - .filter(i => { - return i.isIn(); - }) - .sortBySeat(); - const num = Math.min( - player - .getHistory("useCard", evt => { - return evt.targets && evt.targets.length; - }) - .reduce((sum, evt) => { - return sum + evt.targets.length; - }, 0), - 5 - ); - if ( - targets.length && - player.getHistory("useCard", evt => { - return cards.some(card => get.type2(card) == get.type2(evt.card)); - }).length && - num - ) { - for (const target of targets) await target.draw(num); - } - } - player.removeSkill("olqushi_effect"); - }, - }, - }, - }, - olweijie: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - filter(event, player) { - if ( - !game.hasPlayer(target => { - return get.distance(player, target) == 1 && target.countCards("h"); - }) || - _status.currentPhase === player || - event.olweijie - ) - return false; - return get - .inpileVCardList(info => { - const name = info[2]; - return get.type(name) == "basic"; - }) - .some(card => event.filterCard({ name: card[2], nature: card[3], isCard: true }, player, event)); - }, - chooseButton: { - dialog(event, player) { - const list = get - .inpileVCardList(info => { - const name = info[2]; - return get.type(name) == "basic"; - }) - .filter(card => event.filterCard({ name: card[2], nature: card[3], isCard: true }, player, event)); - return ui.create.dialog("诿解", [list, "vcard"]); - }, - filter(button, player) { - return get.event().getParent().filterCard({ name: button.link[2], nature: button.link[3], isCard: true }, player, _status.event.getParent()); - }, - check(button) { - if (get.event().getParent().type != "phase") return 1; - return get.event("player").getUseValue({ name: button.link[2], nature: button.link[3], isCard: true }); - }, - backup(links, player) { - return { - viewAs: { - name: links[0][2], - nature: links[0][3], - isCard: true, - }, - filterCard: () => false, - selectCard: -1, - *precontent(event, map) { - delete event.result.skill; - const player = map.player; - let stop = false; - const result = yield player - .chooseTarget("请选择一名距离为1的角色", "弃置其一张手牌,若此牌牌名为【" + get.translation(event.result.card.name) + "】,则视为你使用/打出之", (card, player, target) => { - return get.distance(player, target) == 1 && target.countCards("h"); - }) - .set("ai", target => 1 - get.sgn(get.attitude(get.event("player"), target))); - if (result.bool) { - const target = result.targets[0]; - player.logSkill("olweijie", target); - player.tempBanSkill("olweijie", null, false); - const result2 = yield player - .discardPlayerCard(target, "h", true) - .set("prompt2", "若弃置的牌名为【" + get.translation(event.result.card.name) + "】,则视为你使用/打出之") - .set("ai", button => { - if (button.link.isKnownBy(get.event("player")) && button.link.name == get.event("namex")) return 114514; - return 1 + Math.random(); - }) - .set("namex", event.result.card.name); - if (result2.bool) { - const card = result2.cards[0]; - if (get.name(card, target) == event.result.card.name) { - player.popup("洗具"); - stop = true; - } else player.popup("杯具"); - } - } - if (!stop) { - const evt = event.getParent(); - evt.set("olweijie", true); - evt.goto(0); - delete evt.openskilldialog; - return; - } - }, - }; - }, - prompt(links, player) { - const nature = get.translation(links[0][3]) || ""; - const name = "【" + get.translation(links[0][2]) + "】"; - return "弃置距离为1的一名角色的一张手牌,若此牌牌名为" + name + ",则你视为使用" + nature + name; - }, - }, - ai: { - order: 10, - respondSha: true, - respondShan: true, - skillTagFilter(player, tag) { - const name = tag == "respondSha" ? "sha" : "shan"; - return lib.skill.olweijie.hiddenCard(player, name); - }, - result: { - player(player) { - if (_status.event.dying && get.attitude(player, _status.event.dying) <= 0) return 0; - return game.hasPlayer(target => { - if (get.attitude(player, target) > 0) return false; - return get.distance(player, target) == 1 && target.countCards("h"); - }) - ? 1 - : 0; - }, - }, - }, - hiddenCard(player, name) { - if (!lib.inpile.includes(name) || _status.currentPhase === player || player.isTempBanned("olweijie")) return false; - return ( - get.type(name) == "basic" && - game.hasPlayer(target => { - return get.distance(player, target) == 1 && target.countCards("h"); - }) - ); - }, - }, - //胡金定 - olqingyuan: { - audio: 2, - trigger: { - global: ["phaseBefore", "gainAfter", "loseAsyncAfter"], - player: ["enterGame", "damageEnd"], - }, - filter(event, player) { - const storage = player.getStorage("olqingyuan"); - if (event.name == "gain" || event.name == "loseAsync") { - if (player.hasSkill("olqingyuan_used")) return false; - return storage.some(target => event.getg(target).length) && storage.some(target => target.hasCard(card => lib.filter.canBeGained(card, target, player), "h")); - } - if (!game.hasPlayer(target => !storage.includes(target) && target != player)) return false; - if (event.name == "damage" && player.getAllHistory("damage").indexOf(event) != 0) return false; - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - async content(event, trigger, player) { - if (trigger.name == "gain" || trigger.name == "loseAsync") { - const target = player - .getStorage("olqingyuan") - .filter(target => target.hasCard(card => lib.filter.canBeGained(card, target, player), "h")) - .randomGet(); - player.line(target); - player.addTempSkill("olqingyuan_used"); - player.gain( - target - .getCards("h", card => { - return lib.filter.canBeGained(card, target, player); - }) - .randomGet(), - target, - "giveAuto" - ); - } else { - const filterTarget = (card, player, target) => { - return target != player && !player.getStorage("olqingyuan").includes(target); - }, - targetsx = game.filterPlayer(current => filterTarget(null, player, current)); - let result; - if (targetsx.length == 1) result = { bool: true, targets: targetsx }; - else - result = await player - .chooseTarget(filterTarget, true) - .set("prompt2", "每回合限一次,当你以此法选择的角色获得牌后,你随机获得其中一名角色的一张手牌") - .set("prompt", "请选择【轻缘】的目标") - .set("ai", target => { - const player = get.event("player"); - return get.effect(target, new lib.element.VCard({ name: "shunshou_copy2" }), player, player); - }) - .forResult(); - if (result.bool) { - const target = result.targets[0]; - player.line(target); - game.log(player, "选择了", target); - player.markAuto("olqingyuan", [target]); - } - } - }, - subSkill: { used: { charlotte: true } }, - intro: { content: "已选择$为目标" }, - ai: { - expose: 0.3, - }, - }, - olchongshen: { - audio: 2, - locked: false, - enable: "chooseToUse", - filterCard(card) { - return get.itemtype(card) == "card" && card.hasGaintag("olchongshen") && get.color(card) == "red"; - }, - position: "h", - viewAs: { name: "shan" }, - viewAsFilter(player) { - if (!player.countCards("h", card => card.hasGaintag("olchongshen") && get.color(card) == "red")) return false; - }, - prompt: "将本轮得到的红色牌当作【闪】使用", - check(card) { - return 7 - get.value(card); - }, - ai: { - order: 2, - respondShan: true, - skillTagFilter(player, tag, arg) { - if (arg == "respond" || !player.countCards("h", card => _status.connectMode || (card.hasGaintag("olchongshen") && get.color(card) == "red"))) return false; - }, - effect: { - target(card, player, target, current) { - if (get.tag(card, "respondShan") && current < 0) return 0.6; - }, - }, - }, - group: "olchongshen_mark", - mod: { - aiValue(player, card, num) { - if (get.name(card) != "shan" && get.itemtype(card) == "card" && (!card.hasGaintag("olchongshen") || get.color(card) != "red")) return; - let cards = player.getCards("hs", card => get.name(card) == "shan" || card.hasGaintag("olchongshen")); - cards.sort((a, b) => (get.name(b) == "shan" ? 1 : 2) - (get.name(a) == "shan" ? 1 : 2)); - const geti = () => { - if (cards.includes(card)) return cards.indexOf(card); - return cards.length; - }; - if (get.name(card) == "shan") return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; - return Math.max(num, [6.5, 4, 3][Math.min(geti(), 2)]); - }, - aiUseful() { - return lib.skill.olchongshen.mod.aiValue.apply(this, arguments); - }, - // ignoredHandcard(card,player){ - // if(card.hasGaintag('olchongshen')) return true; - // }, - // cardDiscardable(card,player,name){ - // if(name=='phaseDiscard'&&card.hasGaintag('olchongshen')) return false; - // }, - }, - init(player) { - if (game.phaseNumber > 0) { - const hs = player.getCards("h"), - history = player.getAllHistory(); - let cards = []; - for (let i = history.length - 1; i >= 0; i--) { - for (const evt of history[i].gain) { - cards.addArray(evt.cards); - } - if (history[i].isRound) break; - } - cards = cards.filter(i => hs.includes(i)); - if (cards.length) player.addGaintag(cards, "olchongshen"); - } - }, - onremove(player) { - player.removeGaintag("olchongshen"); - }, - subSkill: { - mark: { - charlotte: true, - trigger: { player: "gainBegin", global: "roundStart" }, - filter(event, player) { - return event.name == "gain" || game.roundNumber > 1; - }, - forced: true, - popup: false, - content() { - if (trigger.name == "gain") trigger.gaintag.add("olchongshen"); - else player.removeGaintag("olchongshen"); - }, - }, - }, - }, - //田畴 - olshandao: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer(target => lib.skill.olshandao.filterTarget(null, player, target)); - }, - filterTarget(card, player, target) { - return target.countCards("he"); - }, - usable: 1, - selectTarget: [1, Infinity], - multitarget: true, - multiline: true, - async content(event, trigger, player) { - const wugu = new lib.element.VCard({ name: "wugu" }); - const wanjian = new lib.element.VCard({ name: "wanjian" }); - const targets = game.filterPlayer(target => { - if (target == player) return false; - return !event.targets.includes(target) && player.canUse(wanjian, target, false); - }), - targetx = event.targets.sortBySeat(); - let dialog = ["将这些角色的各一张牌置于牌堆顶,然后视为对这些角色使用【五谷丰登】"]; - for (const target of targetx) { - const name = target == player ? "你" : get.translation(target); - if (target.countCards("h")) { - dialog.add('
    ' + name + "的手牌区
    "); - if (player.hasSkillTag("viewHandcard", null, target, true) || player == target) dialog.push(target.getCards("h")); - else dialog.push([target.getCards("h"), "blank"]); - } - if (target.countCards("e")) dialog.addArray(['
    ' + name + "的装备区
    ", target.getCards("e")]); - } - const { - result: { bool, links }, - } = await player - .chooseButton(dialog, event.targets.length, true) - .set("filterButton", button => { - return !ui.selected.buttons.some(but => get.owner(but.link) == get.owner(button.link)); - }) - .set("ai", button => 1 / (get.value(button.link, get.owner(button.link)) || 0.5)); - if (bool) { - const cards = links.sort((a, b) => targetx.indexOf(get.owner(a)) - targetx.indexOf(get.owner(b))); - for (const card of cards) { - const target = get.owner(card); - target.$throw(1, 1000); - await target.lose([card], ui.cardPile, "insert"); - } - const targety = targetx.filter(target => player.canUse(wugu, target, false)); - if (targety.length) await player.useCard(wugu, targety, false); - if (targets.length) await player.useCard(wanjian, targets, false); - } - }, - ai: { - order: 9, - result: { target: 1 }, - }, - }, - //李异 - olchanshuang: { - audio: 2, - enable: "phaseUse", - filterTarget: lib.filter.notMe, - usable: 1, - content: function* (event, map) { - const player = map.player, - target = event.target; - const choiceList = ["重铸一张牌", "使用一张【杀】", "弃置两张牌"], - list = ["重铸", "出杀", "弃牌", "无法选择"]; - let result = []; - for (let current of [player, target]) { - let list1 = list.slice(), - choiceList1 = choiceList.slice(); - list1 = list1.filter(control => { - if (control == "无法选择") return false; - if (control == "重铸") return current.countCards("he", card => current.canRecast(card)); - if (control == "出杀") return current.countCards("he", card => card.name == "sha" && current.hasUseTarget(card)); - if (control == "弃牌") return current.countCards("he", card => lib.filter.cardDiscardable(card, current)) > 1; - }); - choiceList1 = choiceList.filter(control => { - if (choiceList.indexOf(control) == 0) return current.countCards("he", card => current.canRecast(card)); - if (choiceList.indexOf(control) == 1) return current.countCards("he", card => card.name == "sha" && current.hasUseTarget(card)); - if (choiceList.indexOf(control) == 2) return current.countCards("he", card => lib.filter.cardDiscardable(card, current)) > 1; - }); - if (list1.length) { - if (list1.length == 1) result.push(list.indexOf(list1[0])); - else { - let result1 = yield current - .chooseControl(list1) - .set("ai", () => { - const current = _status.event.player; - const controls = _status.event.controls.slice(); - if (controls.includes("出杀") && current.countCards("hs", card => card.name == "sha" && current.hasValueTarget(card))) return "出杀"; - if (controls.includes("重铸")) return "重铸"; - return "弃牌"; - }) - .set("choiceList", choiceList1); - if (result1.control) result.push(list.indexOf(result1.control)); - } - } else result.push(3); - } - player.popup(list[result[0]]); - target.popup(list[result[1]]); - for (let current of [player, target]) { - switch (list[result[current == player ? 0 : 1]]) { - case "重铸": { - let result2 = yield current.chooseCard("he", "请重铸一张牌", (card, player) => player.canRecast(card), true); - if (result2.bool) current.recast(result2.cards); - break; - } - case "出杀": { - current.chooseToUse({ - prompt: "请使用一张【杀】", - filterCard: function (card, player) { - if (card.name != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, - forced: true, - ai1: function (card) { - return _status.event.player.getUseValue(card); - }, - }); - break; - } - case "弃牌": { - current.chooseToDiscard("he", 2, true); - break; - } - } - } - }, - ai: { - order: function (item, player) { - return get.order({ name: "sha" }, player) - 0.1; - }, - result: { - target: function (player, target) { - const att = get.attitude(player, target); - if ( - target.countCards("hs", card => { - return ( - card.name == "sha" && - game.hasPlayer(current => { - return target.canUse(card, current) && get.effect(current, card, target, target) > 0 && get.effect(current, card, target, player) > 0; - }) - ); - }) - ) - return 3; - if (att > 0) return 2; - if (!target.countCards("h")) return get.sgn(att) + (att == 0 ? 1 : 0); - return 0; - }, - }, - }, - group: "olchanshuang_end", - subSkill: { - end: { - audio: "olchanshuang", - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return ( - player.getHistory("lose", evt => { - if (evt.type == "discard") { - var evtx = evt.getl(player); - return evtx && evtx.cards2.length == 2; - } - return evt.getParent(2).name == "recast"; - }).length || player.getHistory("useCard", evt => evt.card.name == "sha").length - ); - }, - forced: true, - locked: false, - content: function* (event, map) { - let num = 0, - player = map.player; - if (player.getHistory("lose", evt => evt.getParent(2).name == "recast").length) num++; - if (player.getHistory("useCard", evt => evt.card.name == "sha").length) num++; - if ( - player.getHistory("lose", evt => { - if (evt.type == "discard") { - var evtx = evt.getl(player); - return evtx && evtx.cards2.length == 2; - } - }).length - ) - num++; - if (num && player.countCards("he", card => player.canRecast(card))) { - let result = yield player.chooseCard("he", "请重铸一张牌", (card, player) => player.canRecast(card), true); - if (result.bool) yield player.recast(result.cards); - } - if (num > 1 && player.countCards("he", card => card.name == "sha" && player.hasUseTarget(card))) { - yield player.chooseToUse({ - prompt: "请使用一张【杀】", - filterCard: function (card, player) { - if (card.name != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, - forced: true, - ai1: function (card) { - return _status.event.player.getUseValue(card); - }, - }); - } - if (num > 2 && player.countCards("he", card => lib.filter.cardDiscardable(card, player))) yield player.chooseToDiscard("he", 2, true); - }, - }, - }, - }, - olzhanjin: { - audio: 2, - locked: true, - group: "olzhanjin_guanshi", - subSkill: { - guanshi: { - audio: "olzhanjin", - nobracket: true, - equipSkill: true, - trigger: { player: ["shaMiss", "eventNeutralized"] }, - filter: function (event, player) { - if (!player.hasEmptySlot(1) || !lib.card.guanshi || player.hasSkillTag("unequip_equip1")) return false; - if (event.type != "card" || event.card.name != "sha" || !event.target.isIn()) return false; - return player.countCards("he") >= 2; - }, - direct: true, - locked: false, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt("olzhanjin_guanshi"), "弃置两张牌,令" + get.translation(trigger.card) + "强制命中", 2, "he") - .set("ai", function (card) { - var evt = _status.event.getTrigger(); - if (get.attitude(evt.player, evt.target) < 0) { - if (player.needsToDiscard()) return 15 - get.value(card); - if (evt.baseDamage + evt.extraDamage >= Math.min(2, evt.target.hp)) return 8 - get.value(card); - return 5 - get.value(card); - } - return -1; - }) - .set("complexCard", true).logSkill = "olzhanjin_guanshi"; - "step 1"; - if (result.bool) { - if (event.triggername == "shaMiss") { - trigger.untrigger(); - trigger.trigger("shaHit"); - trigger._result.bool = false; - trigger._result.result = null; - } else trigger.unneutralize(); - } - }, - mod: { - attackRange: function (player, num) { - if (lib.card.guanshi && player.hasEmptySlot(1)) return num - lib.card.guanshi.distance.attackFrom; - }, - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (player._olzhanjin_guanshi_temp || !player.hasEmptySlot(1) || !lib.card.guanshi || player.hasSkillTag("unequip_equip1")) return; - player._olzhanjin_guanshi_temp = true; - var bool = - get.attitude(player, arg.target) < 0 && - arg.card && - arg.card.name == "sha" && - player.countCards("he", card => { - return card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) && get.value(card) < 5; - }) > 1; - delete player._olzhanjin_guanshi_temp; - return bool; - }, - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("unequip_equip1")) return; - if (player == target && get.subtype(card) == "equip1") { - if (get.equipValue(card) <= get.equipValue({ name: "guanshi" })) return 0; - } - }, - }, - }, - }, - }, - }, - //曹宇 - olgongjie: { - audio: 2, - trigger: { global: "phaseBegin" }, - filter(event, player) { - if (!player.countCards("he")) return false; - return !game.hasPlayer(current => { - var history = current.actionHistory; - for (var num = history.length - 1; num >= 0; num--) { - if (history[num].isRound) break; - if (history[num].isSkipped) continue; - return true; - } - return false; - }); - }, - direct: true, - async content(event, trigger, player) { - var num = player.countCards("he"), - draws = []; - var { - result: { bool, targets }, - } = await player.chooseTarget(get.prompt2("olgongjie"), [1, num], lib.filter.notMe).set("ai", target => get.attitude(_status.event.player, target)); - if (!bool) return; - targets = targets.sortBySeat(); - player.logSkill("olgongjie", targets); - for (var target of targets) { - var { - result: { bool, cards }, - } = await target.gainPlayerCard(player, true, "he"); - if (bool) draws.add(get.suit(cards[0], player)); - } - player.draw(draws.length); - }, - }, - olxiangxv: { - audio: 2, - trigger: { - player: "loseAfter", - global: ["gainAfter", "equipAfter", "addJudgeAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter(event, player) { - if (!_status.currentPhase || !_status.currentPhase.isIn()) return false; - if (!player.isMinHandcard()) return false; - var evt = event.getl(player); - if (evt && evt.player == player && evt.hs && evt.hs.length > 0) return true; - if (event.getg) - return game.hasPlayer(current => { - var cards = event.getg(current); - if (!cards.length) return false; - return current.countCards("h") >= player.countCards("h") && current.countCards("h") - cards.length < player.countCards("h"); - }); - return false; - }, - check(event, player) { - var target = _status.currentPhase; - var cards = target.getCards("h"); - if (target.isPhaseUsing()) { - var cardx = cards.filter(card => get.name(card) == "sha"); - cardx.sort((a, b) => target.getUseValue(b) - target.getUseValue(a)); - cardx = cardx.slice(Math.min(cardx.length, target.getCardUsable("sha")), cardx.length); - cards.removeArray(cardx); - } - return cards.length - player.countCards("h") > 0; - }, - usable: 1, - logTarget: () => _status.currentPhase, - async content(event, trigger, player) { - player - .when({ global: "phaseEnd" }) - .then(() => { - if (target && target.isIn()) { - var num = target.countCards("h") - player.countCards("h"); - if (num) { - if (num > 0) { - if (player.countCards("h") < 5) player.draw(Math.min(5 - player.countCards("h"), num)); - event.finish(); - } else player.chooseToDiscard(-num, "h", true); - } else event.finish(); - } else event.finish(); - }) - .then(() => { - if (result.bool && result.cards.length > 1) { - if (player.isDamaged()) player.recover(); - } - }) - .vars({ target: _status.currentPhase }); - }, - }, - olxiangzuo: { - audio: 2, - trigger: { player: "dying" }, - filter(event, player) { - return player.countCards("he") && game.hasPlayer(target => target != player); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseCardTarget({ - prompt: get.prompt2("olxiangzuo"), - filterCard: true, - selectCard: [1, Infinity], - filterTarget: lib.filter.notMe, - complexCard: true, - complexTarget: true, - complexSelect: true, - ai1(card) { - const player = get.event("player"); - if (!ui.selected.targets.length) return 0; - const target = ui.selected.targets[0]; - if ( - player.hasAllHistory("useSkill", evt => { - return evt.skill == "olgongjie" && (evt.targets || [evt.target]).includes(target); - }) && - player.hasAllHistory("useSkill", evt => { - return evt.skill == "olxiangxv" && (evt.targets || [evt.target]).includes(target); - }) - ) { - if (get.attitude(player, target) > 0) return 1; - if (player.canSaveCard(card, player)) return 0; - if (ui.selected.cards.length + player.hp >= player.maxHp) return 0; - return 20 - get.value(card); - } - if (get.attitude(player, target) > 0 && !player.countCards("he", cardx => player.canSaveCard(cardx, player))) return 1; - return 0; - }, - ai2(target) { - const player = get.event("player"); - const goon = - player.hasAllHistory("useSkill", evt => { - return evt.skill == "olgongjie" && (evt.targets || [evt.target]).includes(target); - }) && - player.hasAllHistory("useSkill", evt => { - return evt.skill == "olxiangxv" && (evt.targets || [evt.target]).includes(target); - }), - att = get.attitude(player, target); - if (goon) return 5 * att; - if (player.countCards("he", cardx => player.canSaveCard(cardx, player)) > 0) return att; - return 0; - }, - }) - .forResult(); - }, - limited: true, - skillAnimation: true, - animationColor: "water", - async content(event, trigger, player) { - const target = event.targets[0], - cards = event.cards; - player.awakenSkill("olxiangzuo"); - await player.give(cards, target); - if ( - player.hasAllHistory("useSkill", evt => { - return evt.skill == "olgongjie" && evt.targets.includes(target); - }) && - player.hasAllHistory("useSkill", evt => { - return evt.skill == "olxiangxv" && evt.targets.includes(target); - }) - ) - await player.recover(cards.length); - }, - }, - //OL飞扬 - olfeiyang: { - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return ( - player.countCards("he", card => { - if (_status.connectMode && get.position(card) == "h") return true; - return lib.filter.cardDiscardable(card, player); - }) >= 3 && player.countCards("j") - ); - }, - direct: true, - //limited:true, - //skillAnimation:true, - //animationColor:'orange', - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt2("olfeiyang"), "he", 3) - .set("ai", function (card) { - var player = _status.event.player; - if ( - player.hasCard(function (card) { - return ( - get.effect( - player, - { - name: card.viewAs || card.name, - cards: [card], - }, - player, - player - ) < 0 - ); - }, "j") - ) - return 6 - get.value(card); - return 0; - }) - .set("logSkill", "olfeiyang"); - "step 1"; - if (result.bool) { - //player.awakenSkill('olfeiyang'); - player.discardPlayerCard(player, "j", true); - } - }, - }, - //李婉 - ollianju: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - var history = player.getHistory("useCard"); - if (!history.length) return false; - var evt = history[history.length - 1]; - return evt.cards && evt.cards.filterInD("d").length; - }, - direct: true, - content: function () { - "step 0"; - var history = player.getHistory("useCard"); - var evt = history[history.length - 1]; - event.evt = evt; - player - .chooseTarget(get.prompt("ollianju"), "令一名角色获得" + get.translation(evt.cards.filterInD("d")) + "并记录" + get.translation(evt.card.name), lib.filter.notMe) - .set("ai", target => { - var player = _status.event.player, - att = get.attitude(player, target); - var cards = _status.event.cards; - if (cards.filter(card => get.name(card, false) == "du").length >= Math.ceil(cards.length / 2)) att *= -1; - if (target.skipList.includes("phaseUse") || target.hasJudge("lebu")) return att / 20; - return att; - }) - .set("cards", evt.cards.filterInD("d")); - "step 1"; - if (result.bool) { - var evt = event.evt; - var target = result.targets[0]; - player.logSkill("oliandui", target); - target.gain(evt.cards.filterInD("d"), "gain2"); - player.addSkill("ollianju_effect"); - player.storage.ollianju = evt.card.name; - player.markSkill("ollianju"); - if (!player.storage.ollianju_effect[target.playerid]) player.storage.ollianju_effect[target.playerid] = []; - player.storage.ollianju_effect[target.playerid].add(evt.card.name); - } - }, - onunmark: true, - intro: { - content: function (storage, player) { - var str = "当前最后一次记录牌名:" + get.translation(storage); - if (player.storage.ollianju_effect) { - for (var i in player.storage.ollianju_effect) { - var target = game.findPlayer(target => target.playerid == i); - if (!i) continue; - str += "
    "; - str += get.translation(target) + "的下个结束阶段,其可令你获得其本回合使用的最后一张牌对应的所有位于弃牌堆的实体牌"; - str += ",然后若此牌名为" + get.translation(player.storage.ollianju_effect[i]) + ",则你失去1点体力,否则你可以视为使用" + get.translation(player.storage.ollianju_effect[i]); - } - } - return str; - }, - }, - subSkill: { - effect: { - init: function (player) { - if (!player.storage.ollianju_effect) player.storage.ollianju_effect = {}; - }, - charlotte: true, - trigger: { global: ["phaseJieshuBegin", "die"] }, - filter: function (event, player) { - return player.storage.ollianju_effect[event.player.playerid]; - }, - direct: true, - content: function () { - "step 0"; - if (trigger.name == "phaseJieshu") event.list = player.storage.ollianju_effect[trigger.player.playerid]; - delete player.storage.ollianju_effect[trigger.player.playerid]; - var history = trigger.player.getHistory("useCard"); - var evt = history[history.length - 1]; - event.evt = evt; - if (trigger.name == "die" || !history.length || !evt.cards || !evt.cards.filterInD("d").length) event.finish(); - "step 1"; - var evt = event.evt; - trigger.player.chooseBool(get.prompt("ollianju", player), "令" + get.translation(player) + "获得" + get.translation(evt.cards.filterInD("d")) + (event.list.includes(evt.card.name) ? ",然后" + get.translation(player) + "失去1点体力" : "")).set("choice", get.attitude(trigger.player, player) > 0 && (!event.list.includes(evt.card.name) || player.getHp() > 1)); - "step 2"; - if (result.bool) { - var evt = event.evt, - cards = evt.cards.filterInD("d"); - trigger.player.line(player); - player.gain(cards, "gain2"); - if (event.list.includes(evt.card.name)) player.loseHp(); - else { - var card = { - name: evt.card.name, - isCard: true, - }; - if (player.hasUseTarget(card)) player.chooseUseTarget(card, false); - } - } - }, - }, - }, - }, - olsilv: { - audio: 2, - trigger: { - player: ["loseAfter", "gainAfter"], - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter: function (event, player) { - var name = player.storage.ollianju; - if (!name) return false; - if (event.getg) return event.getg(player).some(card => card.name == name) && !player.hasSkill("olsilv_gain"); - return event.getl(player).cards2.some(card => card.name == name) && !player.hasSkill("olsilv_lose"); - }, - forced: true, - content: function () { - "step 0"; - player.addTempSkill("olsilv_" + (trigger.getg ? "gain" : "lose")); - if (!trigger.visible) { - var cards, - name = player.storage.ollianju; - if (trigger.getg) cards = trigger.getg(player).filter(card => card.name == name); - else cards = trigger.getl(player).cards2.filter(card => card.name == name); - if (cards.length) player.showCards(cards, get.translation(player) + "发动了【思闾】"); - } - "step 1"; - player.draw(); - }, - ai: { combo: "ollianju" }, - subSkill: { - gain: { charlotte: true }, - lose: { charlotte: true }, - }, - }, - //丁尚涴 - olfudao: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - locked: false, - content: function () { - "step 0"; - player.draw(3); - "step 1"; - var num = player.countCards("h"); - if (num > 0) { - player.chooseCardTarget({ - prompt: "抚悼:将至多三张手张牌交给一名其他角色", - selectCard: [1, 3], - filterCard: true, - filterTarget: lib.filter.notMe, - position: "h", - ai1: function (card) { - if (card.name == "du") return 10; - else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; - var player = _status.event.player; - if ( - ui.selected.cards.length > 4 || - !game.hasPlayer(function (current) { - return get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); - }) - ) - return 0; - return 1 / Math.max(0.1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (ui.selected.cards[0].name == "du") return -att; - if (target.hasSkillTag("nogain")) att /= 6; - return att; - }, - }); - } else event.goto(3); - "step 2"; - if (result.bool) { - player.give(result.cards, result.targets[0]); - } - "step 3"; - var num = player.countCards("h"); - if (num > 0) player.chooseToDiscard("h", [1, num], "抚悼:弃置任意张手牌,然后记录手牌数"); - "step 4"; - player.storage.olfudao = player.countCards("h"); - player.markSkill("olfudao"); - }, - intro: { - content: "一名角色的回合结束时,若其手牌数等于#,你可以与其各摸一张牌。", - }, - group: "olfudao_qiaoshi", - subSkill: { - qiaoshi: { - audio: "olfudao", - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - if (typeof player.storage.olfudao != "number") return false; - return event.player.countCards("h") == player.storage.olfudao && event.player.isIn(); - }, - check: function (event, player) { - return get.attitude(player, event.player) >= 0; - }, - logTarget: "player", - prompt2: function (event, player) { - return "与" + get.translation(event.player) + "各摸一张牌"; - }, - content: function () { - game.asyncDraw([trigger.player, player]); - }, - }, - }, - }, - olfengyan: { - audio: 2, - trigger: { player: ["damageEnd", "useCard", "respond"] }, - filter: function (event, player) { - if (event.name == "damage") return event.source && event.source.isIn() && event.source != player; - return Array.isArray(event.respondTo) && event.respondTo[0] != player; - }, - logTarget: function (event, player) { - if (event.name == "damage") return event.source; - return event.respondTo[0]; - }, - forced: true, - content: function () { - "step 0"; - var target = lib.skill.olfengyan.logTarget(trigger, player); - var str = get.translation(target); - event.target = target; - player - .chooseControl() - .set("choiceList", ["摸一张牌,然后交给" + str + "一张牌", "令" + str + "摸一张牌,然后" + str + "弃置两张牌"]) - .set("ai", () => (_status.event.att > 0 ? 0 : 1)) - .set("att", get.attitude(player, target)); - "step 1"; - if (result.index == 0) { - player.draw(); - player.chooseToGive(target, "he", true); - } else { - target.draw(); - target.chooseToDiscard(2, "he", true); - } - }, - }, - //张燕 - olsuji: { - audio: 2, - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - if (!event.player.isDamaged()) return false; - return ( - (_status.connectMode && player.countCards("hes")) || - (!_status.connectMode && - player.hasCard(card => { - return get.color(card) == "black"; - }, "hes")) - ); - }, - direct: true, - content: [ - (event, map) => { - var player = map.player, - trigger = map.trigger; - var next = player.chooseToUse(); - next.set("openskilldialog", `###${get.prompt("olsuji")}###将一张黑色牌当【杀】使用${player == trigger.player ? "" : `。若${get.translation(trigger.player)}受到了此【杀】的伤害,你获得其一张牌。`}`); - next.set("norestore", true); - next.set("_backupevent", "olsuji_backup"); - next.set("addCount", false); - next.set("logSkill", "olsuji"); - next.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - next.backup("olsuji_backup"); - }, - (event, map) => { - if (map.result.bool) { - var player = map.player, - trigger = map.trigger; - if ( - trigger.player.isIn() && - trigger.player.hasHistory("damage", evt => { - return evt.card && evt.card.storage && evt.card.storage.olsuji; - }) && - trigger.player.countGainableCards(player, "he") - ) - player.gainPlayerCard(trigger.player, "he", true); - } - }, - ], - subSkill: { - backup: { - filterCard: function (card) { - return get.itemtype(card) == "card" && get.color(card) == "black"; - }, - viewAs: { - name: "sha", - storage: { olsuji: true }, - }, - selectCard: 1, - position: "hes", - ai1: function (card) { - return 5 - get.value(card); - }, - precontent: function () { - delete event.result.skill; - }, - }, - }, - }, - ollangdao: { - audio: 2, - trigger: { player: "useCardToPlayer" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - return event.isFirstTarget && event.targets.length == 1 && player.getStorage("ollangdao").length < 3; - }, - logTarget: "target", - onremove: true, - check: function (event, player) { - if (get.attitude(player, event.target) > 0) { - if ( - player.getStorage("ollangdao").includes(1) && - game.hasPlayer(current => { - return player.canUse(event.card, current) && get.effect(current, event.card, player, player) > 0; - }) - ) - return event.getRand() < 0.5; - return false; - } - return event.target.getHp() <= 2 || player.getDamagedHp() > 1 || !player.hasCard({ color: "black" }, "hes"); - }, - content: function* (event, map) { - var player = map.player, - trigger = map.trigger, - result = map.result; - var target = trigger.target; - var send = function (card, list) { - var next = game.createEvent("ollangdao_choose", false); - next.setContent(lib.skill.ollangdao.contentx); - next.set("card", card); - next.set("list", list); - game.resume(); - }; - var sendback = function (result, player) { - if (!result) result = {}; - if (typeof result.index !== "number" || result.index < 0) { - result.index = [0, 1, 2].find(i => !event.player.getStorage("ollangdao").includes(i)); - } - results.push([player, result]); - }; - var ai_targets = []; - var results = []; - var players = [player, target]; - var withme = false, - withol = false, - withai = false; - for (var i = 0; i < players.length; i++) { - if (_status.connectMode) players[i].showTimer(); - var card = trigger.card, - list = player.getStorage("ollangdao"); - if (players[i].isOnline()) { - withol = true; - players[i].send(send, card, list); - players[i].wait(sendback); - } else if (players[i] == game.me) { - withme = true; - var next = game.createEvent("ollangdao_choose", false); - next.setContent(lib.skill.ollangdao.contentx); - next.set("card", card); - next.set("list", list); - if (_status.connectMode) game.me.wait(sendback); - } else { - ai_targets.push(players[i]); - } - } - if (ai_targets.length) { - for (var i = 0; i < ai_targets.length; i++) { - if (players.includes(ai_targets[i])) { - var target = ai_targets[i]; - var list = [0, 1, 2].removeArray(player.getStorage("ollangdao")); - var index = list[0]; - if (get.attitude(target, player) < 0) { - if ( - !game.hasPlayer(current => { - return !trigger.targets.includes(current) && player.canUse(trigger.card, current) && get.effect(current, trigger.card, player, target) < 0; - }) - ) - list.removeArray([0, 2]); - if (player.getStorage("ollangdao").includes(2)) list.remove(0); - } else { - if ( - !game.hasPlayer(current => { - return !trigger.targets.includes(current) && player.canUse(trigger.card, current) && get.effect(current, trigger.card, player, target) > 0; - }) - ) - list.remove(1); - if (!list.includes(1)) list.remove(0); - } - if (list.length) index = list.randomGet(); - sendback({ index: index }, target); - ai_targets.splice(i--, 1); - } - } - if (ai_targets.length) { - ai_targets.randomSort(); - setTimeout(function () { - event.interval = setInterval( - function () { - var target = ai_targets.shift(); - var list = [0, 1, 2].removeArray(player.getStorage("ollangdao")); - var index = list[0]; - if (get.attitude(target, player) < 0) { - if ( - !game.hasPlayer(current => { - return !trigger.targets.includes(current) && player.canUse(trigger.card, current) && get.effect(current, trigger.card, player, target) < 0; - }) - ) - list.removeArray([0, 2]); - if (player.getStorage("ollangdao").includes(2)) list.remove(0); - } else { - if ( - !game.hasPlayer(current => { - return !trigger.targets.includes(current) && player.canUse(trigger.card, current) && get.effect(current, trigger.card, player, target) > 0; - }) - ) - list.remove(1); - if (!list.includes(1)) list.remove(0); - } - if (list.length) index = list.randomGet(); - sendback({ index: index }, target); - if (!ai_targets.length) { - clearInterval(event.interval); - if (withai) game.resume(); - } - }, - _status.connectMode ? 750 : 75 - ); - }, 500); - } - } - if (withme) { - result = yield next; - if (_status.connectMode) { - game.me.unwait(result, game.me); - } else { - if (!result) result = {}; - if (typeof result.index !== "number" || result.index < 0) { - result.index = [0, 1, 2].find(i => !event.player.getStorage("ollangdao").includes(i)); - } - results.push([player, result]); - } - } - if (withol && !event.resultOL) { - game.pause(); - yield null; - } - if (ai_targets.length > 0) { - withai = true; - game.pause(); - yield null; - } - if (_status.connectMode) { - for (var i of [player, target]) i.hideTimer(); - } - var chosenCount = [0, 0, 0]; - results.sort((a, b) => lib.sort.seat(a[0], b[0])); - player - .when("useCardAfter") - .assign({ - card: trigger.card, - }) - .then(() => { - var card = get.info(event.name).card; - var dieEvts = game.getGlobalHistory("everything", evt => evt.name == "die"); - if ( - trigger.card == card && - !game.hasPlayer2(current => { - for (var evt of dieEvts) { - if (evt.player != current) continue; - var evtx = evt.getParent(2); - if (evtx.name != "damage") continue; - if (evtx.card && evtx.card == card) return true; - } - return false; - }, true) - ) { - var toRemove = card.storage.ollangdao_remove; - var list = [0, 1, 2].filter(i => (toRemove >> i) & 1); - if (!list.length) return; - player.markAuto("ollangdao", list); - game.log( - player, - "移去了", - "#g【狼蹈】", - "的", - "#y选项" + - list - .map(i => { - return get.cnNumber(i + 1, true); - }) - .join("、") - ); - } - }); - if (!trigger.card.storage) trigger.card.storage = {}; - if (!trigger.card.storage.ollangdao_remove) trigger.card.storage.ollangdao_remove = 0; - var config = [ - ["伤害+1", "fire"], - ["目标+1", "wood"], - ["不能响应", "water"], - ]; - for (var res of results) { - var target = res[0], - result = res[1]; - if (!target || !result) continue; - var ind = result.index; - var conf = config[ind]; - trigger.card.storage.ollangdao_remove |= 1 << ind; - target.popup(conf[0], conf[1]); - game.log(target, "选择令", trigger.card, `#g${conf[0]}`); - chosenCount[ind]++; - } - game.delay(); - var extraBaseDamage = chosenCount[0], - extraTargetNum = chosenCount[1], - directHit = chosenCount[2]; - trigger.getParent().baseDamage += extraBaseDamage; - if (directHit) trigger.directHit.addArray(game.players); - if (extraTargetNum <= 0) { - event.finish(); - return; - } - result = yield player - .chooseTarget(`狼蹈:为${get.translation(trigger.card)}额外指定至多${get.cnNumber(extraTargetNum)}个目标`, (card, player, target) => { - return !_status.event.targets.includes(target) && player.canUse(_status.event.card, target); - }) - .set("targets", trigger.targets) - .set("ai", target => { - var player = _status.event.player; - return get.effect(target, _status.event.card, player, player); - }) - .set("card", trigger.card); - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayex(); - var targets = result.targets; - player.line(targets); - trigger.targets.addArray(targets); - game.log(targets, "也成为了", trigger.card, "的目标"); - } - }, - contentx: function () { - "step 0"; - var name = get.translation(card); - var choices = [], - choiceList = [`令${name}伤害基数+1`, `令${name}可以多选择一个目标`, `令${name}不可被响应`]; - [0, 1, 2].forEach((item, index) => { - if (event.list.includes(item)) { - choiceList[index] = `${choiceList[index]}`; - } else choices.push(`选项${get.cnNumber(index + 1, true)}`); - }); - game.me - .chooseControl(choices) - .set("prompt", "狼蹈:请选择一项") - .set("choiceList", choiceList) - .set("ai", () => { - return _status.event.controls.randomGet(); - }); - "step 1"; - event.result = { index: ["选项一", "选项二", "选项三"].indexOf(result.control) }; - }, - intro: { - content: (storage, player) => `已移除选项${storage.map(i => get.cnNumber(i + 1, true)).join("、")}`, - }, - }, - //张既 - skill_zhangji_A: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - if (player.countMark("skill_zhangji_A_count") >= player.hp) return false; - return event.target != player && event.target.countCards("h") && player.isPhaseUsing(); - }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - logTarget: "target", - content: function () { - "step 0"; - player.addTempSkill("skill_zhangji_A_count", "phaseUseAfter"); - player.addMark("skill_zhangji_A_count", 1, false); - player.viewHandcards(trigger.target); - var list = [], - choiceList = ["弃置" + get.translation(trigger.target) + "的一张牌,然后若弃置的牌的是能造成火焰伤害的牌,你摸一张牌", "重铸" + get.translation(trigger.target) + "手牌中的所有【杀】和【决斗】", "你与" + get.translation(trigger.target) + "互相对对方造成1点伤害"]; - list.push("选项一"); - if (trigger.target.countCards("h", { name: ["sha", "juedou"] })) list.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - if (!trigger.target.countCards("h", { name: "shan" })) list.push("选项三"); - else choiceList[2] = '' + choiceList[2] + ""; - player - .chooseControl(list) - .set("prompt", get.prompt("tspowei", target)) - .set("choiceList", choiceList) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.target; - if (list.includes("选项三") && player.hp + player.countCards("hs", { name: "tao" }) > 2) return "选项三"; - if (list.includes("选项二") && target.countCards("h", { name: ["sha", "juedou"] }) > 1) return "选项二"; - return "选项一"; - }) - .set("target", trigger.target); - "step 1"; - game.log(player, "选择了", "#y" + result.control); - switch (result.control) { - case "选项一": - player.discardPlayerCard("he", trigger.target, "visible", true); - break; - case "选项二": - var cards = trigger.target.getCards("h", { name: ["sha", "juedou"] }).filter(card => trigger.target.canRecast(card)); - trigger.target.recast(cards); - event.finish(); - break; - case "选项三": - trigger.target.damage(player); - player.damage(trigger.target); - event.finish(); - break; - } - "step 2"; - if (result.bool && get.tag(result.cards[0], "fireDamage")) player.draw(); - }, - subSkill: { - count: { - charlotte: true, - onremove: true, - }, - }, - }, - skill_zhangji_B: { - getNum: function (name) { - var num = 0; - if (name == "litong") num = 1; - else - switch (game.getRarity(name)) { - case "junk": - num = 1; - break; - case "rare": - num = 2; - break; - case "epic": - num = 3; - break; - case "legend": - num = 4; - break; - } - return num; - }, - getCharacter: function (list) { - var listx = [], - num = 0; - for (var name of list) { - var numx = lib.skill.skill_zhangji_B.getNum(name); - if (numx > num) { - num = numx; - listx = [name]; - } else if (numx == num) listx.push(name); - } - return listx; - }, - group: "skill_zhangji_B_jieming", - audio: 2, - trigger: { player: "dying" }, - skillAnimation: true, - animationColor: "water", - direct: true, - content: function () { - "step 0"; - if (!_status.characterlist) lib.skill.pingjian.initList(); - player.chooseTarget(get.prompt("skill_zhangji_B"), "令一名其他角色选择是否更换武将牌", lib.filter.notMe).set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - var num = lib.skill.skill_zhangji_B.getNum(target.name); - if (target.name2 != undefined) num = Math.min(num, lib.skill.skill_zhangji_B.getNum(target.name2)); - return att * (4 - num); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("skill_zhangji_B", target); - var list = []; - for (var i = 0; i < _status.characterlist.length; i++) { - if (lib.character[_status.characterlist[i]][1] == "wei") list.push(_status.characterlist[i]); - } - list = list.randomGets(5); - var bolDialog = ["请选择替换的武将", [list, "character"]]; - target.chooseButton(bolDialog).set("ai", function (button) { - var target = _status.event.player; - var num = lib.skill.skill_zhangji_B.getNum(target.name); - if (target.name2 != undefined) num = Math.min(num, lib.skill.skill_zhangji_B.getNum(target.name2)); - return lib.skill.skill_zhangji_B.getNum(button.link) - num; - }); - } else event.finish(); - "step 2"; - if (result.bool) { - event.character = result.links[0]; - if (target.name2 != undefined) - target - .chooseControl(target.name1, target.name2) - .set("prompt", "请选择要更换的武将牌") - .set("ai", function () { - return lib.skill.skill_zhangji_B.getNum(target.name) < lib.skill.skill_zhangji_B.getNum(target.name2) ? target.name : target.name2; - }); - else result.control = target.name1; - } else { - target.chat("拒绝"); - game.log("但", target, "拒绝更换其武将牌"); - event.finish(); - } - "step 3"; - target.reinitCharacter(result.control, event.character); - target.update(); - }, - subSkill: { - jieming: { - audio: "skill_zhangji_B", - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("h") < current.maxHp; - }); - }, - direct: true, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - player - .chooseTarget(get.prompt("skill_zhangji_B"), "令一名手牌数小于其体力上限的角色摸三张牌,然后其将手牌数调整至其体力上限值", function (card, player, target) { - return target.countCards("h") < target.maxHp; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.hasSkillTag("nogain")) att /= 6; - if (att > 2) return Math.min(5, target.maxHp) - target.countCards("h"); - return att / 3; - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("skill_zhangji_B_jieming", target); - target.draw(3); - } else event.finish(); - "step 3"; - if (target.countCards("h") > target.maxHp) target.chooseToDiscard("h", target.countCards("h") - target.maxHp, true); - if ( - event.count > 0 && - game.hasPlayer(function (current) { - return current.countCards("h") < current.maxHp; - }) && - player.hasSkill("skill_zhangji_B") - ) - event.goto(1); - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage") && target.hp > 1) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - var max = 0; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (get.attitude(target, players[i]) > 0) { - max = Math.max(Math.min(5, players[i].hp) - players[i].countCards("h"), max); - } - } - switch (max) { - case 0: - return 2; - case 1: - return 1.5; - case 2: - return [1, 2]; - default: - return [0, max]; - } - } - if ((card.name == "tao" || card.name == "caoyao") && target.hp > 1 && target.countCards("h") <= target.hp) return [0, 0]; - }, - }, - }, - }, - }, - }, - //费祎 - yanru: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (!player.countCards("h")) return false; - var num = player.countCards("h") % 2; - return !player.hasSkill("yanru_" + num); - }, - filterCard: function (card, player) { - if (player.countCards("h") && player.countCards("h") % 2 == 0) return lib.filter.cardDiscardable(card, player); - return false; - }, - selectCard: function () { - var player = _status.event.player; - if (player.countCards("h") && player.countCards("h") % 2 == 0) return [player.countCards("h") / 2, Infinity]; - return -1; - }, - prompt: function () { - var player = _status.event.player; - return [(player.countCards("h") ? "弃置至少一半的手牌,然后" : "") + "摸三张牌", "摸三张牌,然后弃置至少一半的手牌"][player.countCards("h") % 2]; - }, - check: function (card) { - var player = _status.event.player; - if (player.hasSkill("hezhong") && !(player.hasSkill("hezhong_0") && player.hasSkill("hezhong_1"))) { - if (player.countCards("h") - ui.selected.cards.length > 2) return 1 / (get.value(card) || 0.5); - return 0; - } - if (ui.selected.cards.length < player.countCards("h") / 2) return 5 - get.value(card); - return 0; - }, - complexCard: true, - discard: false, - lose: false, - delay: 0, - content: function () { - "step 0"; - var bool = player.countCards("h") % 2; - if (cards) player.discard(cards); - player.addTempSkill("yanru_" + bool, "phaseUseAfter"); - player.draw(3); - if (!bool) event.finish(); - "step 1"; - player.chooseToDiscard("h", "宴如:弃置至少一半手牌", [Math.floor(player.countCards("h") / 2), Infinity], true).set("ai", card => { - var player = _status.event.player; - if (player.hasSkill("hezhong") && !(player.hasSkill("hezhong_0") && player.hasSkill("hezhong_1")) && player.countCards("h") - ui.selected.cards.length > 2) return 1 / (get.value(card) || 0.5); - if (!player.hasSkill("hezhong") && ui.selected.cards.length < Math.floor(player.countCards("h") / 2)) return 1 / (get.value(card) || 0.5); - return 0; - }); - }, - subSkill: { - 0: { charlotte: true }, - 1: { charlotte: true }, - }, - ai: { - order: 3, - result: { player: 1 }, - }, - }, - hezhong: { - audio: 2, - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter: function (event, player) { - if (player.countCards("h") != 1 || typeof get.number(player.getCards("h")[0], player) != "number") return false; - if (player.hasSkill("hezhong_0") && player.hasSkill("hezhong_1")) return false; - let gain = 0, - lose = 0; - if (event.getg) gain = event.getg(player).length; - if (event.getl) lose = event.getl(player).hs.length; - return gain != lose; - }, - prompt2: function (event, player) { - var str = "展示最后一张手牌并摸一张牌"; - if (!player.hasSkill("hezhong_0") || !player.hasSkill("hezhong_0")) { - str += ",然后令本回合使用点数"; - if (!player.hasSkill("hezhong_0")) str += "大于"; - if (!player.hasSkill("hezhong_0") && !player.hasSkill("hezhong_0")) str += "或"; - if (!player.hasSkill("hezhong_1")) str += "小于"; - str += get.number(player.getCards("h")[0], player); - str += "的普通锦囊牌额外结算一次"; - } - return str; - }, - frequent: true, - content: function () { - "step 0"; - player.showHandcards(get.translation(player) + "发动了【技能】"); - event.num = get.number(player.getCards("h")[0], player); - "step 1"; - player.draw(); - "step 2"; - if (player.hasSkill("hezhong_0")) event._result = { index: 1 }; - else if (player.hasSkill("hezhong_1")) event._result = { index: 0 }; - else { - player - .chooseControl() - .set("choiceList", ["本回合使用点数大于" + num + "的普通锦囊牌额外结算一次", "本回合使用点数小于" + num + "的普通锦囊牌额外结算一次"]) - .set("ai", () => { - var player = _status.event.player; - var num = _status.event.player; - if ( - player.getCards("h").reduce(function (num, card) { - return num + (get.number(card, player) || 0); - }, 0) > - num * 2 - ) - return 0; - return 1; - }) - .set("num", num); - } - "step 3"; - var skill = "hezhong_" + result.index; - player.addTempSkill(skill); - player.markAuto(skill, [num]); - }, - subSkill: { - 0: { - charlotte: true, - onremove: true, - marktext: ">", - intro: { - markcount: list => { - var list2 = [1, 11, 12, 13]; - return list.reduce((str, num) => { - if (list2.includes(num)) return str + ["A", "J", "Q", "K"][list2.indexOf(num)]; - return str + parseFloat(num); - }, ""); - }, - content: "使用的下一张点数大于$的普通锦囊牌额外结算一次", - }, - audio: "hezhong", - trigger: { player: "useCard" }, - filter: function (event, player) { - if (get.type(event.card) != "trick") return false; - if (!event.targets.length) return false; - var num = get.number(event.card, player); - return typeof num == "number" && player.getStorage("hezhong_0").some(numx => num > numx); - }, - forced: true, - usable: 1, - content: function () { - player.unmarkSkill("hezhong_0"); - trigger.effectCount++; - game.log(trigger.card, "额外结算一次"); - }, - ai: { - effect: { - player: function (card, player, target) { - if (card.name == "tiesuo" && (!player.storage.counttrigger || !player.storage.counttrigger.hezhong_0)) return "zerotarget"; - }, - }, - }, - }, - 1: { - charlotte: true, - onremove: true, - marktext: "<", - intro: { - markcount: list => { - var list2 = [1, 11, 12, 13]; - return list.reduce((str, num) => { - if (list2.includes(num)) return str + ["A", "J", "Q", "K"][list2.indexOf(num)]; - return str + parseFloat(num); - }, ""); - }, - content: "使用的下一张点数小于$的普通锦囊牌额外结算一次", - }, - audio: "hezhong", - trigger: { player: "useCard" }, - filter: function (event, player) { - if (get.type(event.card) != "trick") return false; - if (!event.targets.length) return false; - var num = get.number(event.card, player); - return typeof num == "number" && player.getStorage("hezhong_1").some(numx => num < numx); - }, - forced: true, - usable: 1, - content: function () { - player.unmarkSkill("hezhong_1"); - trigger.effectCount++; - game.log(trigger.card, "额外结算一次"); - }, - ai: { - effect: { - player: function (card, player, target) { - if (card.name == "tiesuo" && (!player.storage.counttrigger || !player.storage.counttrigger.hezhong_1)) return "zerotarget"; - }, - }, - }, - }, - }, - }, - //吕伯奢 - olfushi: { - audio: 2, - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return event.player.isIn() && event.card.name == "sha" && event.cards && event.cards.filterInD().length && get.distance(player, event.player) <= 1; - }, - forced: true, - locked: false, - logTarget: "player", - content: function () { - player.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("olfushi"); - }, - marktext: "豕", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: "olfushi_wusheng", - subSkill: { - wusheng: { - enable: "chooseToUse", - filter: function (event, player) { - return player.getExpansions("olfushi").length && event.filterCard({ name: "sha", isCard: true }, player, event); - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog('###缚豕###
    将任意“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并执行等量项
    ', player.getExpansions("olfushi"), [["额外目标", "伤害-1", "伤害+1"], "tdnodes"], "hidden"); - }, - filter: function (button) { - const cards = ui.selected.buttons.filter(button => typeof button.link == "object"); - if (cards.length >= 3 && typeof button.link == "string") return false; - return true; - }, - select: [2, Infinity], - filterOk: () => { - if (!ui.selected.buttons.length) return false; - const controls = ui.selected.buttons.filter(button => typeof button.link == "string"); - const cards = ui.selected.buttons.filter(button => typeof button.link == "object"); - if (cards.length >= 3) { - const dialog = get.event().dialog; - if (dialog && dialog.buttons) { - dialog.buttons.forEach(button => { - if (typeof button.link != "string") return; - button.classList.remove("selectable"); - button.classList.remove("selected"); - ui.selected.buttons.remove(button); - }); - } - return true; - } - return cards.length == controls.length; - }, - check: function (button) { - const player = get.player(); - const card = new lib.element.VCard({ name: "sha", isCard: true }); - const targets = game.filterPlayer(target => { - return player.canUse(card, target); - }); - const num0 = targets.filter(target => get.effect(target, card, player, player) > 0).length; - if (num0 <= 0) return 0; - const num1 = Math.max(0, num0 - 1); - const num2 = targets.length - num1; - const num3 = player.getExpansions("olfushi").length; - let list; - if ((num1 > 0 && num2 > 0) || (num1 == 0 && num2 == 0)) { - switch (num3) { - case 1: - list = [["额外目标", "伤害+1"].randomGet()]; - break; - case 2: - list = [["额外目标", "伤害+1"].randomGet(), "伤害-1"]; - break; - default: - list = ["额外目标", "伤害-1", "伤害+1"]; - break; - } - } else if (num2 == 0) { - switch (num3) { - case 1: - list = ["伤害+1"]; - break; - case 2: - list = ["额外目标", "伤害+1"]; - break; - default: - list = ["额外目标", "伤害-1", "伤害+1"]; - break; - } - } else if (num1 == 0) { - switch (num3) { - case 1: - list = ["伤害+1"]; - break; - default: - list = ["伤害-1", "伤害+1"]; - break; - } - } - if (typeof button.link == "string") { - if (list.includes(button.link)) return 114514; - return -1; - } else { - const cards = ui.selected.buttons.filter(button => typeof button.link == "object"); - if ((list.length == 3 && (player.getHp() <= 2 || cards.length < num3 - 1)) || cards.length < list.length) return 1 / (get.value(button.link) || 0.5); - return -1; - } - }, - backup: function (links, player) { - var cards = links.filter(button => typeof button == "object"); - var controls = links.filter(button => typeof button == "string"); - if (!controls.length) controls = ["额外目标", "伤害-1", "伤害+1"]; - return { - audio: "olfushi", - selectCard: -1, - position: "x", - cards: cards, - controls: controls, - filterCard: function (card) { - return lib.skill.olfushi_wusheng_backup.cards.includes(card); - }, - viewAs: { - name: "sha", - isCard: true, - }, - precontent: function () { - var cards = lib.skill.olfushi_wusheng_backup.cards.slice(); - var controls = lib.skill.olfushi_wusheng_backup.controls.slice(); - player.logSkill("olfushi"); - delete event.result.skill; - event.result.card = new lib.element.VCard(lib.skill.olfushi_wusheng_backup.viewAs); - event.result.cards = []; - player.loseToDiscardpile(cards); - player.draw(cards.length); - event.result.card.storage.olfushi_buff = controls; - player.addTempSkill("olfushi_buff"); - }, - }; - }, - prompt: function (links, player) { - let controls = links.filter(button => typeof button == "string"); - if (!controls.length) controls = ["额外目标", "伤害-1", "伤害+1"]; - return `请选择【杀】的目标(${controls.join("、")})`; - }, - }, - ai: { - order: function (item, player) { - return get.order({ name: "sha" }) + 0.1; - }, - result: { player: 1 }, - respondSha: true, - skillTagFilter: function (player, tag, arg) { - if (arg == "respond") return false; - if (!player.getExpansions("olfushi").length) return false; - }, - }, - }, - buff: { - charlotte: true, - trigger: { player: ["useCard2", "useCardToPlayered"] }, - filter: function (event, player, name) { - if (!event.card.storage || !event.card.storage.olfushi_buff) return false; - if (name == "useCard2") return true; - return event.getParent().triggeredTargets3.length == event.targets.length && event.card.storage.olfushi_buff.length > 1 && event.card.storage.olfushi_buff.includes("伤害-1") && !event.targets.some(target => !event.targets.includes(target.getPrevious()) && !event.targets.includes(target.getNext())); - }, - forced: true, - popup: false, - content: function () { - "step 0"; - if (event.triggername == "useCardToPlayered") { - if (trigger.getParent().addCount !== false) { - trigger.getParent().addCount = false; - if (player.stat[player.stat.length - 1].card.sha > 0) { - player.stat[player.stat.length - 1].card.sha--; - } - } - game.log(trigger.card, "不计入次数"); - event.finish(); - return; - } - var list = trigger.card.storage.olfushi_buff; - event.list = list; - var canBeAddedTargets = game.filterPlayer(target => { - return !trigger.targets.includes(target) && player.canUse(trigger.card, target); - }); - if (!list.includes("额外目标") || !canBeAddedTargets.length) event._result = { bool: false }; - else if (canBeAddedTargets.length == 1) event._result = { bool: true, targets: canBeAddedTargets }; - else - player - .chooseTarget( - "请选择" + get.translation(trigger.card) + "的额外目标", - function (card, player, target) { - var trigger = _status.event.getTrigger(); - return !trigger.targets.includes(target) && player.canUse(trigger.card, target); - }, - true - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.line(targets); - trigger.targets.addArray(targets); - game.log(targets, "成为了", trigger.card, "的额外目标"); - } - "step 2"; - if (!event.list.includes("伤害-1")) event._result = { bool: false }; - else if (trigger.targets.length == 1) event._result = { bool: true, targets: trigger.targets.slice() }; - else - player - .chooseTarget( - "请选择" + get.translation(trigger.card) + "伤害-1的目标", - function (card, player, target) { - var trigger = _status.event.getTrigger(); - return trigger.targets.includes(target); - }, - true - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.attitude(player, target); - }); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - game.log(trigger.card, "对", target, "的伤害-1"); - player.addTempSkill("olfushi_buff2"); - player.initStorage("olfushi_buff2", []); - player.getStorage("olfushi_buff2").push([target, trigger.card]); - } - "step 4"; - if (!event.list.includes("伤害+1")) event.finish(); - else if (trigger.targets.length == 1) event._result = { bool: true, targets: trigger.targets.slice() }; - else - player - .chooseTarget( - "请选择" + get.translation(trigger.card) + "伤害+1的目标", - function (card, player, target) { - var trigger = _status.event.getTrigger(); - return trigger.targets.includes(target); - }, - true - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 5"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - game.log(trigger.card, "对", target, "的伤害+1"); - player.addTempSkill("olfushi_buff3"); - player.initStorage("olfushi_buff3", []); - player.getStorage("olfushi_buff3").push([target, trigger.card]); - } - }, - }, - buff2: { - charlotte: true, - onremove: true, - trigger: { source: "damageBegin2" }, - filter: function (event, player) { - return event.card && player.getStorage("olfushi_buff2").some(info => info[0] == event.player && info[1] == event.card); - }, - forced: true, - popup: false, - content: function () { - trigger.num--; - }, - ai: { - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return; - if (!card || !player.getStorage("olfushi_buff2").includes(card)) return; - var num = get.tag(card, "damage"); - if (num) { - if (num > 1) return 0.5; - return 0; - } - }, - }, - }, - }, - buff3: { - charlotte: true, - onremove: true, - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - return event.card && player.getStorage("olfushi_buff3").some(info => info[0] == event.player && info[1] == event.card); - }, - forced: true, - popup: false, - content: function () { - trigger.num++; - }, - }, - wusheng_backup: {}, - }, - }, - oldongdao: { - mode: ["doudizhu"], - zhuanhuanji: true, - mark: true, - marktext: "☯", - intro: { - content: function (storage) { - if (storage) return "农民的回合结束时,其可以进行一个额外回合"; - return "农民的回合结束时,你可以令地主进行一个额外回合"; - }, - }, - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - return event.player.identity == "fan"; - }, - direct: true, - content: function () { - "step 0"; - var target = player.storage.oldongdao ? trigger.player : game.zhu; - event.target = target; - var target2 = player.storage.oldongdao ? trigger.player : player; - event.target2 = target2; - target2.chooseBool(get.prompt("oldongdao"), "令" + get.translation(target) + "进行一个额外回合").set("ai", () => { - var event = _status.event.getParent(); - return get.attitude(event.target2, event.target) > 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("oldongdao"); - event.target2.line(target); - player.changeZhuanhuanji("oldongdao"); - target.insertPhase(); - } - }, - }, - //OL陆郁生 - olcangxin: { - audio: 2, - trigger: { player: "damageBegin4" }, - filter(event, player) { - return ( - game - .getGlobalHistory( - "everything", - evt => { - return evt.name == "damage" && evt.player == player; - }, - event - ) - .indexOf(event) == 0 - ); - }, - checkx: function (event, player) { - var target = event.source; - return get.damageEffect(player, target, target) <= 0; - }, - forced: true, - content: function () { - "step 0"; - var cards = get.bottomCards(3, true); - player - .chooseButton(["###藏心:请选择要弃置的牌###若以此法弃置了红桃牌,则减少弃置红桃牌数的伤害", cards], [1, cards.length], true) - .set("ai", function (button) { - if (!_status.event.bool && get.suit(button.link, false) == "heart") return 0; - if (get.suit(button.link, false) != "heart") return 1; - const num = get.event().getTrigger().num; - if (num > ui.selected.buttons.filter(but => get.suit(but.link, false) == "heart").length) return 1; - return 0; - }) - .set("bool", lib.skill.olcangxin.checkx(trigger, player)); - "step 1"; - if (result.bool) { - player.$throw(result.links, 1000); - game.cardsDiscard(result.links); - const num = result.links.filter(card => get.suit(card, false) == "heart").length; - if (num) trigger.num -= Math.min(trigger.num, num); - } else event.finish(); - "step 2"; - game.delayx(); - }, - group: "olcangxin_yingzi", - subSkill: { - yingzi: { - audio: "olcangxin", - trigger: { player: "phaseDrawBegin" }, - forced: true, - content: function () { - var cards = get.bottomCards(3, true); - player.showCards(cards, get.translation(player) + "发动了【藏心】"); - var num = cards.filter(card => get.suit(card, false) == "heart").length; - if (num) player.draw(num); - }, - }, - }, - }, - olrunwei: { - audio: 2, - trigger: { global: "phaseDiscardBegin" }, - filter: function (event, player) { - if (event.player == player) return false; - return event.player.isDamaged(); - }, - direct: true, - content: function () { - "step 0"; - var str = get.translation(trigger.player); - player - .chooseControl("弃牌,+1", "摸牌,-1", "cancel2") - .set("choiceList", ["令" + str + "弃置一张牌,且其本回合手牌上限+1", "令" + str + "摸一张牌,且其本回合手牌上限-1"]) - .set("ai", function () { - var player = _status.event.player; - var trigger = _status.event.getTrigger(); - var target = trigger.player; - var num1 = target.countCards("h"), - num2 = target.getHandcardLimit(); - switch (get.sgn(get.attitude(player, target))) { - case 0: - return 2; - case 1: - if (num1 - 1 >= num2) return 0; - if (num1 + 1 <= num2) return 1; - return 2; - case -1: - if (num1 - 2 <= num2) return 0; - if (num1 + 3 >= num2) return 1; - return 2; - } - }) - .set("prompt", get.prompt("olrunwei", trigger.player)); - "step 1"; - if (result.index != 2) { - player.logSkill("olrunwei", trigger.player); - if (result.index == 0) { - trigger.player.chooseToDiscard("he", true).set("ai", card => { - if (get.position(card) == "e") return -get.value(card); - return 1 / (get.value(card) || 0.5); - }); - trigger.player.addTempSkill("olrunwei_+"); - trigger.player.addMark("olrunwei_+", 1, false); - } - if (result.index == 1) { - trigger.player.draw(); - trigger.player.addTempSkill("olrunwei_-"); - trigger.player.addMark("olrunwei_-", 1, false); - } - } - }, - subSkill: { - "+": { - charlotte: true, - onremove: true, - marktext: "+", - intro: { content: "手牌上限+#" }, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("olrunwei_+"); - }, - }, - }, - "-": { - charlotte: true, - onremove: true, - marktext: "-", - intro: { content: "手牌上限-#" }, - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("olrunwei_-"); - }, - }, - }, - }, - }, - //曹羲 - olgangshu: { - audio: 2, - trigger: { - player: "useCardAfter", - }, - filter: function (event, player) { - return get.type2(event.card, false) != "basic"; - }, - getInfo: player => { - if (!player.storage.olgangshu_buff) player.storage.olgangshu_buff = [0, 0, 0]; - return player.storage.olgangshu_buff; - }, - direct: true, - group: "olgangshu_reset", - content: function () { - "step 0"; - var info = lib.skill.olgangshu.getInfo(player); - player - .chooseControl("攻击范围(" + info[0] + ")", "摸牌数(" + info[1] + ")", "使用杀的上限(" + info[2] + ")", "cancel2") - .set("prompt", get.prompt("olgangshu")) - .set("prompt2", '
    令以下一个数值+1(每项至多+5):
    1.攻击范围;
    2.下个摸牌阶段的摸牌数;
    3.使用【杀】的次数上限。
    ') - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var info = lib.skill.olgangshu.getInfo(player); - if (info[1] == 0) return 1; - if ( - info[2] < 5 && - player.hasCard(card => { - return get.name(card) == "sha" && player.hasValueTarget(card); - }, "hs") && - !player.getCardUsable("sha") - ) - return 2; - if ( - info[0] < 5 && - !game.hasPlayer(current => { - return player.inRange(current) && get.effect(current, { name: "sha" }, player, player) > 0; - }) - ) - return 0; - var rand = Math.random(); - var list = [0, 1, 2].filter(i => info[i] < 5); - if (!list.length) return "cancel2"; - if (rand < 0.2 && list.includes(0)) return 0; - if (rand < 0.7 && list.includes(1)) return 1; - if (rand < 1.0 && list.includes(2)) return 2; - return list.randomGet(); - })() - ); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("olgangshu"); - player.addSkill("olgangshu_buff"); - var info = lib.skill.olgangshu.getInfo(player); - info[result.index] = Math.min(5, info[result.index] + 1); - game.log(player, "的", result.control.slice(0, result.control.indexOf("(")), "#y+1"); - player.markSkill("olgangshu_buff"); - } - }, - ai: { - threaten: 3, - }, - subSkill: { - buff: { - trigger: { player: "phaseDrawBegin2" }, - charlotte: true, - onremove: true, - forced: true, - filter: function (event, player) { - var info = lib.skill.olgangshu.getInfo(player); - if (!info[1]) return false; - return !event.numFixed; - }, - content: function () { - var info = lib.skill.olgangshu.getInfo(player); - trigger.num += info[1]; - info[1] = 0; - player.markSkill("olgangshu_buff"); - }, - mod: { - attackRange: function (player, range) { - var info = lib.skill.olgangshu.getInfo(player); - if (info) return range + info[0]; - }, - cardUsable: function (card, player, num) { - if (card.name != "sha") return; - var info = lib.skill.olgangshu.getInfo(player); - if (info) return num + info[2]; - }, - }, - mark: true, - intro: { - markcount: function (storage, player) { - var info = lib.skill.olgangshu.getInfo(player); - var str = ""; - info.forEach(num => (str += parseFloat(num))); - return str; - }, - content: function (storage, player) { - var info = lib.skill.olgangshu.getInfo(player); - var str = ""; - if (info[0] > 0) str += "
  • 攻击范围+" + info[0]; - if (info[1] > 0) str += "
  • 下个摸牌阶段摸牌数+" + info[1]; - if (info[2] > 0) str += "
  • 使用【杀】的次数上限+" + info[2]; - return str; - }, - }, - }, - reset: { - audio: "olgangshu", - trigger: { - global: ["shaMiss", "eventNeutralized"], - }, - filter: function (event, player) { - if (event.type != "card") return false; - var responder; - if (event.name == "sha") { - responder = event.target; - } else { - responder = event._neutralize_event.player; - } - return player == responder; - }, - forced: true, - locked: false, - content: function () { - player.removeSkill("olgangshu_buff"); - game.log(player, "重置了", "#g【刚述】", "的数值"); - }, - }, - }, - }, - oljianxuan: { - audio: 2, - trigger: { - player: "damageEnd", - }, - direct: true, - content: function () { - "step 0"; - var info = lib.skill.olgangshu.getInfo(player); - var list = []; - list.add(player.getAttackRange()); - list.add(2 + info[1]); - list.add(player.getCardUsable("sha", true)); - list.sort(); - var str = list.join("、").replace(/(.*)、/, "$1或"); - event.list = list; - player - .chooseTarget(get.prompt("oljianxuan"), "令一名角色摸一张牌,然后若其手牌数为" + str + ",其重复此流程") - .set("ai", target => { - var list = _status.event.list; - var player = _status.event.player; - var att = get.attitude(player, target); - if (att <= 0) return 0; - var num = target.countCards("h") + 1; - var value = 1; - while (true) { - if (list.includes(num)) { - value++; - num++; - } else break; - } - return value + att / 10; - }) - .set("list", list); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("oljianxuan", target); - if (player != target) player.addExpose(0.15); - } else event.finish(); - "step 2"; - target.draw(); - "step 3"; - if (event.list.includes(target.countCards("h"))) event.goto(2); - }, - ai: { - combo: "olgangshu", - maixie: true, - }, - }, - //OL彭羕 - olxiaofan: { - audio: 2, - enable: "chooseToUse", - hiddenCard: function (player, name) { - if (name != "wuxie" && lib.inpile.includes(name)) return true; - }, - getNum: player => player.getHistory("useCard").reduce((list, evt) => list.add(get.type2(evt.card)), []).length, - filter: function (event, player) { - if (event.responded || event.type == "wuxie" || event.olxiaofan) return false; - for (var i of lib.inpile) { - if (i != "wuxie" && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) return true; - } - return false; - }, - delay: false, - content: function () { - "step 0"; - var evt = event.getParent(2); - evt.set("olxiaofan", true); - var cards = get.bottomCards(lib.skill.olxiaofan.getNum(player) + 1, true); - var aozhan = player.hasSkill("aozhan"); - player - .chooseButton(["嚣翻:选择要使用的牌", cards]) - .set("filterButton", function (button) { - return _status.event.cards.includes(button.link); - }) - .set( - "cards", - cards.filter(function (card) { - 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) { - if (get.type(button.link) == "equip") return 0; - var evt = _status.event.getParent(3), - player = _status.event.player; - if (evt.type == "phase" && !player.hasValueTarget(button.link, null, true)) return 0; - 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 card = result.links[0]; - var name = card.name, - aozhan = player.hasSkill("aozhan") && name == "tao"; - if (aozhan) { - name = evt.filterCard( - { - name: "sha", - isCard: true, - cards: [card], - }, - evt.player, - evt - ) - ? "sha" - : "shan"; - } - game.broadcastAll( - function (result, name) { - lib.skill.olxiaofan_backup.viewAs = { - name: name, - cards: [result], - isCard: true, - }; - }, - card, - name - ); - evt.set("_backupevent", "olxiaofan_backup"); - evt.set("openskilldialog", "请选择" + get.translation(card) + "的目标"); - evt.backup("olxiaofan_backup"); - } - evt.goto(0); - }, - ai: { - effect: { - target: function (card, player, target, effect) { - if (get.tag(card, "respondShan")) return 0.7; - if (get.tag(card, "respondSha")) return 0.7; - }, - }, - order: 12, - respondShan: true, - respondSha: true, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - }, - olxiaofan_backup: { - sourceSkill: "olxiaofan", - precontent: function () { - delete event.result.skill; - var name = event.result.card.name, - cards = event.result.card.cards.slice(0); - event.result.cards = cards; - var rcard = cards[0], - card; - if (rcard.name == name) card = get.autoViewAs(rcard); - else card = get.autoViewAs({ name, isCard: true }); - event.result.card = card; - var id = get.id(); - player - .when("chooseToUseAfter") - .filter(evt => evt == event.getParent()) - .then(() => { - var num = lib.skill.olxiaofan.getNum(player), - pos = "jeh".slice(0, num); - if (num > 0 && player.countCards(pos) > 0) { - event.maxNum = Math.min(3, num); - event.num = 0; - } else event.finish(); - }) - .then(() => { - var pos = "jeh"[event.num], - hs = player.countCards(pos); - if (hs > 0) player.chooseToDiscard(hs, pos, true); - event.num++; - if (event.num < event.maxNum) event.redo(); - }) - .translation("嚣翻"); - }, - filterCard: function () { - return false; - }, - selectCard: -1, - }, - oltuishi: { - audio: 2, - mod: { - wuxieJudgeEnabled: () => false, - wuxieEnabled: () => false, - cardEnabled: card => { - if (card.name == "wuxie") return false; - }, - targetInRange: card => { - if (card.storage && card.storage.oltuishi) return true; - }, - aiValue: (player, card, val) => { - if (card.name == "wuxie") return 0; - var num = get.number(card); - if ([1, 11, 12, 13].includes(num)) return val * 1.1; - }, - aiUseful: (player, card, val) => { - if (card.name == "wuxie") return 0; - var num = get.number(card); - if ([1, 11, 12, 13].includes(num)) return val * 1.1; - }, - aiOrder: (player, card, order) => { - if (get.name(card) == "sha" && player.hasSkill("oltuishi_unlimit")) order += 9; - var num = get.number(card); - if ([1, 11, 12, 13].includes(num)) order += 3; - return order; - }, - }, - trigger: { player: ["useCard", "useCardAfter"] }, - filter: function (event, player, name) { - if (name == "useCardAfter") { - if (player.isTempBanned("olxiaofan")) return false; - return ( - player - .getHistory("useCard", evt => { - return ( - !player.getHistory("sourceDamage", evt2 => { - return evt2.card && evt2.card == evt.card; - }).length && get.tag(evt.card, "damage") - ); - }) - .indexOf(event) >= 2 - ); - } - return [1, 11, 12, 13].includes(get.number(event.card)); - }, - forced: true, - content: function () { - "step 0"; - if (event.triggername == "useCardAfter") { - player.tempBanSkill("olxiaofan"); - event.finish(); - return; - } - trigger.targets.length = 0; - trigger.all_excluded = true; - game.log(trigger.card, "被无效了"); - "step 1"; - player.draw(); - player.addSkill("oltuishi_unlimit"); - }, - subSkill: { - unlimit: { - charlotte: true, - mod: { - cardUsableTarget: (card, player, target) => { - if (target.countCards("h") < player.countCards("h")) return true; - }, - targetInRange: (card, player, target) => { - if (target.countCards("h") < player.countCards("h")) return true; - }, - }, - trigger: { player: "useCard1" }, - filter: function (event, player) { - if (!event.targets || !event.targets.length) return false; - let num = 0; - if (event.cards && event.cards.length) { - const history = player.getHistory("lose", evt => { - if (evt.getParent() != event) return false; - return event.cards.some(card => evt.hs.includes(card)); - }); - if (history.length) num += event.cards.filter(card => history[0].hs.includes(card)).length; - } - return event.targets.some(target => player.countCards("h") + num > target.countCards("h") + (target == player ? num : 0)); - }, - forced: true, - popup: false, - silent: true, - firstDo: true, - content: function () { - player.removeSkill("oltuishi_unlimit"); - var card = trigger.card; - if (!card.storage) card.storage = {}; - card.storage.oltuishi = true; - if (trigger.addCount !== false) { - trigger.addCount = false; - player.getStat("card")[card.name]--; - } - }, - mark: true, - intro: { content: "对手牌数小于你的角色使用的下一张牌无距离次数限制" }, - }, - }, - }, - //OL牵招 - olweifu: { - audio: 2, - enable: "phaseUse", - filterCard: lib.filter.cardDiscardable, - position: "he", - filter: function (event, player) { - return player.hasCard(card => lib.filter.cardDiscardable(card, player), "he"); - }, - check: function (card) { - var player = _status.event.player; - return (5 - get.value(card)) / Math.pow(Math.max(0.1, player.getUseValue(card)), 0.33); - }, - content: function () { - "step 0"; - player - .judge(card => { - var evt = _status.event.getParent(); - var cardx = evt.cards[0]; - if (get.type2(card) == get.type2(cardx)) return 0.5; - return 0.1; - }) - .set("callback", function () { - var card = event.judgeResult.card; - player.addTempSkill("olweifu_clear"); - player.addTempSkill("olweifu_add"); - if (!get.is.object(player.storage.olweifu_add)) player.storage.olweifu_add = {}; - var type = get.type2(card, player); - if (typeof player.storage.olweifu_add[type] != "number") player.storage.olweifu_add[type] = 0; - player.storage.olweifu_add[type]++; - player.markSkill("olweifu_add"); - if (type == get.type2(event.getParent(2).cards[0], player)) player.draw(); - }) - .set("judge2", result => result.bool); - }, - ai: { - order: 7, - result: { - player: function (player) { - return player.hasCard(card => { - var type = get.type2(card); - if (type == "equip") return false; - return ( - player.hasUseTarget(card) && - player.getUseValue(card) > 5 && - game.countPlayer(current => { - return lib.filter.targetEnabled2(card, player, current) && get.effect(current, card, player, player) > 0; - }) + - 1 > - (get.is.object(player.storage.olweifu_add) ? player.storage.olweifu_add[type] || 0 : 0) - ); - }, "hs") - ? 1 - : 0; - }, - }, - }, - subSkill: { - clear: { - trigger: { player: "useCard1" }, - filter: function (event, player) { - var type = get.type2(event.card); - if (get.is.object(player.storage.olweifu_add) && typeof player.storage.olweifu_add[type] == "number") return true; - return false; - }, - silent: true, - firstDo: true, - charlotte: true, - content: function () { - var type = get.type2(trigger.card); - var num = player.storage.olweifu_add[type]; - delete player.storage.olweifu_add[type]; - if (get.is.empty(player.storage.olweifu_add)) { - delete player.storage.olweifu_add; - player.unmarkSkill("olweifu_add"); - } - trigger._olweifu_clear = num; - }, - }, - add: { - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (!event._olweifu_clear) return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(current => { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); - }) - ) - return true; - } - return false; - }, - onremove: true, - charlotte: true, - direct: true, - content: function () { - "step 0"; - var num = trigger._olweifu_clear; - player - .chooseTarget(get.prompt("olweifu"), "为" + get.translation(trigger.card) + "额外指定" + get.cnNumber(num) + "个目标。", [1, num], (card, player, target) => { - return !_status.event.sourcex.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); - }) - .set("sourcex", trigger.targets) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, _status.event.card, player, player); - }) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - var targets = result.targets; - player.logSkill("olweifu_add", targets); - trigger.targets.addArray(targets); - game.log(targets, "也成为了", trigger.card, "的目标"); - if (!event.isMine() && !event.isOnline()) game.delayex(); - } - }, - intro: { - markcount: () => 0, - content: (storage, player) => { - if (!get.is.object(storage)) return; - var str = "使用下一张以下类型的牌无距离限制,且可以额外指定对应数量个目标:"; - for (var type in storage) { - str += "
  • " + get.translation(type) + "牌:+" + storage[type]; - } - return str; - }, - }, - mod: { - targetInRange: (card, player) => { - var type = get.type2(card); - if (get.is.object(player.storage.olweifu_add) && typeof player.storage.olweifu_add[type] == "number") return true; - }, - }, - }, - }, - }, - olkuansai: { - audio: 2, - trigger: { - global: "useCardToPlayered", - }, - filter: function (event, player) { - return event.isFirstTarget && event.targets.length >= player.getHp(); - }, - direct: true, - usable: 1, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("olkuansai"), "令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。", (card, player, target) => { - return _status.event.targets.includes(target); - }) - .set("targets", trigger.targets) - .set("ai", target => { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att > 0) return 1; - return (1 - att) / Math.sqrt(1 + target.countCards("he")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("olkuansai", target); - var position = "e"; - if (player != target) position += "h"; - var forced = player.isHealthy(); - var str = "请交给其一张牌" + (forced ? "" : "或点击“取消”令其回复1点体力") + "。"; - if (!target.countCards(position)) event._result = { bool: false }; - else - target - .chooseCard(get.translation(player) + "对你发动了【款塞】", str, position, forced) - .set("ai", card => { - if (_status.event.recover) return 0; - var target = _status.event.player, - player = _status.event.getParent().player; - if (get.attitude(target, player) > 0) { - return get.value(card, target) - get.value(card, player); - } - if (get.tag(card, "recover")) return -1; - return 6.5 - get.value(card); - }) - .set( - "recover", - (function () { - if (forced) return false; - var recoverEff = get.recoverEffect(player, target, target); - var att = get.attitude(target, player); - if (att < 0) { - if (recoverEff >= 0) return true; - if ( - target.hasCard(card => { - return (get.value(card) < 6.5 && !get.tag(card, "recover")) || get.value(card) <= 0.05; - }, position) - ) - return false; - } else { - if (recoverEff > 0) return true; - if ( - target.hasCard(card => { - return get.value(card, target) < get.value(card, player); - }, position) - ) - return false; - } - return true; - })() - ); - } else { - player.storage.counttrigger.olkuansai--; - event.finish(); - } - "step 2"; - if (result.bool) { - target.give(result.cards, player); - } else player.recover(target); - }, - }, - //牛金 - olcuorui: { - audio: "cuorui", - trigger: { - global: "phaseBefore", - player: "enterGame", - target: "useCardToTargeted", - }, - filter: function (event, player) { - if (event.name == "useCardToTargeted") return get.type(event.card) == "delay" && !player.hasSkill("olcuorui_skip"); - return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") < Math.min(8, game.countPlayer()); - }, - forced: true, - content: function () { - if (trigger.name == "useCardToTargeted") { - player.skip("phaseJudge"); - player.addTempSkill("olcuorui_skip", { player: "phaseJudgeSkipped" }); - } else player.drawTo(Math.min(8, game.countPlayer())); - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.type(card) == "delay") return "zerotarget"; - }, - }, - }, - subSkill: { - skip: { - mark: true, - intro: { content: "跳过下个的判定阶段" }, - }, - }, - }, - //何进 - olmouzhu: { - audio: "mouzhu", - inherit: "mouzhu", - content: function () { - "step 0"; - target.chooseCard("h", "交给" + get.translation(player) + "一张手牌", true); - "step 1"; - if (result.bool) target.give(result.cards, player); - "step 2"; - if (player.countCards("h") <= target.countCards("h")) { - event.finish(); - return; - } - var list = []; - if (target.hasUseTarget({ name: "sha" })) list.push("sha"); - if (target.hasUseTarget({ name: "sha" })) list.push("juedou"); - if (!list.length) event.finish(); - else if (list.length == 1) event._result = { control: list[0] }; - else - target - .chooseControl(list) - .set("prompt", "谋诛:视为使用一张【杀】或【决斗】") - .set("ai", function () { - var player = _status.event.player; - return player.getUseValue({ name: "sha" }) > player.getUseValue({ name: "juedou" }) ? "sha" : "juedou"; - }); - "step 3"; - if (result.control) target.chooseUseTarget({ name: result.control }, true); - }, - ai: { - order: 7, - result: { - target: function (player, target) { - if ( - get.attitude(target, player) > 0 && - game.hasPlayer(function (current) { - if (current == target) return false; - for (var card of [{ name: "sha" }, { name: "juedou" }]) { - if (target.canUse(card, current) && get.effect(current, card, target, player) > 0 && get.effect(current, card, target, target) > 0) return true; - } - return false; - }) && - target.countCards("h") < player.countCards("h") + 2 - ) - return 3; - if (!target.hasValueTarget({ name: "sha" }) && !target.hasValueTarget({ name: "juedou" })) return -2; - if (target.countCards("h") + 1 > player.countCards("h")) return -2; - var canSave = function (player, target) { - return target.hp + player.countCards("hs", card => player.canSaveCard(card, target)) > 1 + ((get.mode() == "identity" && target.identity == "zhu") || (get.mode() == "guozhan" && get.is.jun(target))); - }; - if (target.hasValueTarget({ name: "sha" })) { - var aimx = game - .filterPlayer(current => { - return target.canUse({ name: "sha" }, current) && get.effect(current, { name: "sha" }, target, target) > 0; - }) - .sort((a, b) => get.effect(b, { name: "sha" }, target, target) - get.effect(a, { name: "sha" }, target, target))[0]; - if (aimx && get.effect(aimx, { name: "sha" }, target, player) < 0 && get.effect(aimx, { name: "sha" }, target, aimx) < 0 && !canSave(player, aimx)) return 0; - } - if (target.hasValueTarget({ name: "juedou" })) { - var aimy = game - .filterPlayer(current => { - return target.canUse({ name: "juedou" }, current) && get.effect(current, { name: "juedou" }, target, target) > 0; - }) - .sort((a, b) => get.effect(b, { name: "juedou" }, target, target) - get.effect(a, { name: "juedou" }, target, target))[0]; - if (aimy && get.effect(aimy, { name: "juedou" }, target, player) < 0 && get.effect(aimy, { name: "sha" }, target, aimy) < 0 && !canSave(player, aimy)) return 0; - } - return -1; - }, - }, - }, - }, - olyanhuo: { - audio: "yanhuo", - trigger: { player: "die" }, - forceDie: true, - filter: function (event, player) { - if (!event.source || !event.source.isIn() || !event.source.countCards("he")) return false; - return player.countCards("he") > 0; - }, - check: function (event, player) { - return get.effect(event.source, { name: "guohe_copy2" }, player, player) > 0; - }, - logTarget: "source", - skillAnimation: true, - animationColor: "thunder", - content: function () { - player.discardPlayerCard(trigger.source, "he", [1, player.countCards("he")], true).set("forceDie", true); - }, - }, - //韩遂 - olniluan: { - audio: "niluan", - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return ( - event.player.getHp() > player.getHp() && - event.player.getHistory("useCard", function (card) { - return card.card.name == "sha"; - }).length && - player.countCards("hes", card => get.color(card, player) == "black" && player.canUse(get.autoViewAs({ name: "sha" }, [card]), event.player, false)) - ); - }, - direct: true, - content: function () { - var next = player.chooseToUse(); - next.set("openskilldialog", "逆乱:是否将一张黑色牌当作【杀】对" + get.translation(trigger.player) + "使用?"); - next.set("norestore", true); - next.set("_backupevent", "niluanx"); - next.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - next.backup("niluanx"); - next.set("targetRequired", true); - next.set("complexSelect", true); - next.set("filterTarget", function (card, player, target) { - if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this, arguments); - }); - next.set("sourcex", trigger.player); - next.set("addCount", false); - next.logSkill = "olniluan"; - }, - }, - olxiaoxi: { - audio: "xiaoxi", - audioname: ["machao", "hansui", "pangde"], - trigger: { global: "roundStart" }, - filter: function (event, player) { - return player.hasUseTarget({ name: "sha" }, false); - }, - direct: true, - content: function () { - player.chooseUseTarget({ name: "sha" }, get.prompt("olxiaoxi"), "视为使用一张无距离限制的【杀】", false, "nodistance").logSkill = "olxiaoxi"; - }, - }, - //段颎 - olsaogu: { - audio: 2, - zhuanhuanji: true, - mark: true, - marktext: "☯", - intro: { - content: function (storage) { - if (storage) return "转换技。①出牌阶段,你可以摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色摸一张牌。"; - return "转换技。①出牌阶段,你可以弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】。②结束阶段,你可以弃置一张牌,令一名其他角色弃置两张牌,然后其使用弃置的【杀】。"; - }, - }, - onChooseToUse: function (event) { - if (!game.online && !event.olsaogu) { - var list = [], - player = event.player; - var evtx = event.getParent("phaseUse"); - player.getHistory("lose", evt => { - if (evt.type == "discard" && evt.getParent("phaseUse") == evtx) list.addArray(evt.cards2); - }); - event.set("olsaogu", list); - } - }, - enable: "phaseUse", - filter: function (event, player) { - var storage = player.storage.olsaogu; - if (storage) return true; - return ( - player.getDiscardableCards(player, "he").filter(card => { - if (event.olsaogu && event.olsaogu.some(cardx => get.suit(cardx, false) == get.suit(card, player))) return false; - return true; - }).length > 1 - ); - }, - filterCard: function (card, player) { - if (player.storage.olsaogu) return false; - if (_status.event.olsaogu && _status.event.olsaogu.some(cardx => get.suit(cardx, false) == get.suit(card, player))) return false; - return true; - }, - selectCard: function () { - var player = _status.event.player; - return player.storage.olsaogu ? -1 : 2; - }, - position: "he", - check: function (card) { - var player = _status.event.player; - if (card.name == "sha") return player.hasValueTarget(card) ? 10 : 0.001; - return 6 - get.value(card); - }, - prompt: function () { - var player = _status.event.player; - var storage = player.storage.olsaogu; - if (storage) return "摸一张牌"; - var list = _status.event.olsaogu, - str = ""; - if (list && list.length) { - var text = "", - suits = list - .reduce(function (list, card) { - return list.add(get.suit(card, false)), list; - }, []) - .sort((a, b) => lib.suit.indexOf(b) - lib.suit.indexOf(a)); - for (var i = 0; i < suits.length; i++) text += get.translation(suits[i]); - str += "(不能弃置" + text + "花色的牌)"; - } - return "弃置两张牌" + str + ",然后使用其中的【杀】"; - }, - content: function () { - player.changeZhuanhuanji("olsaogu"); - if (!cards.length) player.draw(); - else { - var cardx = cards.filter(card => card.name == "sha"); - if (cardx.length) { - var next = game.createEvent("olsaogu_chooseToUseSha"); - next.player = player; - next.cards = cardx; - next.setContent(lib.skill.olsaogu.chooseToUseSha); - } - } - }, - ai: { - order: function (item, player) { - return get.order({ name: "sha" }, player) - 0.2; - }, - result: { - player: function (player) { - var storage = player.storage.olsaogu; - if (storage) return 1; - if ( - player.getDiscardableCards(player, "he").filter(card => { - if (card.name != "sha") return false; - if (_status.event.olsaogu && _status.event.olsaogu.some(cardx => get.suit(cardx, false) == get.suit(card, player))) return false; - return true; - }).length - ) - return 1; - return 0; - }, - }, - }, - group: "olsaogu_effect", - subSkill: { - effect: { - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - if (_status.connectMode) return player.countCards("he"); - return player.countDiscardableCards(player, "he"); - }, - direct: true, - content: function () { - "step 0"; - var list = []; - player.getHistory("lose", evt => { - if (evt.type == "discard" && evt.getParent("phaseJieshu").name == "phaseJieshu") list.addArray(evt.cards2); - }); - event.list = list; - var str, - storage = player.storage.olsaogu; - if (storage) str = "弃置一张牌,令一名其他角色摸一张牌。"; - else { - str = "弃置一张牌,令一名其他角色弃置两张牌(不能包含你本阶段弃置过的花色),然后其使用弃置的【杀】。"; - if (list.length) { - var text = "", - suits = list - .reduce(function (list, card) { - return list.add(get.suit(card, false)), list; - }, []) - .sort((a, b) => lib.suit.indexOf(b) - lib.suit.indexOf(a)); - for (var i = 0; i < suits.length; i++) text += get.translation(suits[i]); - str += "
    本阶段已弃置过" + text + "花色的牌。"; - } - } - player - .chooseCardTarget({ - prompt: get.prompt("olsaogu"), - prompt2: str, - filterTarget: function (card, player, target) { - return player != target && target.countCards("he") > 1; - }, - filterCard: lib.filter.cardDiscardable, - position: "he", - complexCard: true, - complexSelect: true, - ai1: function (card) { - var player = _status.event.player; - if (!player.storage.olsaogu && _status.event.list.some(cardx => get.suit(cardx, false) == get.suit(card, player))) return 7 - get.value(card); - return 5 - get.value(card); - }, - ai2: function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (player.storage.olsaogu) return att; - var list = _status.event.list.slice(); - if (ui.selected.cards.length) list.addArray(ui.selected.cards); - var cards = target.getCards("he", card => { - if (card.name != "sha" || list.some(cardx => get.suit(cardx, false) == get.suit(card, target))) return false; - return ( - lib.filter.cardDiscardable(card, target) && - game.hasPlayer(function (current) { - if (!current.canUse(card, target, false)) return false; - return get.effect(current, card, target, target) > 0 && get.effect(current, card, target, player) > 0; - }) - ); - }); - if (cards.length && att > 0) - return ( - Math.sqrt(Math.min(2, cards.length)) * - cards.reduce(function (num, card) { - var players = game.filterPlayer(current => target.canUse(card, current, false)); - players.sort((a, b) => get.effect(b, card, target, target) * get.effect(b, card, target, player) - get.effect(a, card, target, target) * get.effect(a, card, target, player)); - return (num = get.effect(players[0], card, target, target) * get.effect(players[0], card, target, player)); - }, 0) - ); - return ( - get.effect(target, { name: "guohe_copy2" }, player, player) * - Math.sqrt( - Math.min( - 2, - target.getDiscardableCards(player, "he").filter(card => { - return !list.some(cardx => get.suit(cardx, false) == get.suit(card, target)); - }).length - ) - ) - ); - }, - }) - .set("list", list); - "step 1"; - if (result.bool) { - var cards = result.cards, - target = result.targets[0]; - player.logSkill("olsaogu", target); - player.discard(cards); - if (player.storage.olsaogu) { - target.draw(); - event.finish(); - } else { - event.target = target; - var list = result.cards.slice(); - player.getHistory("lose", evt => { - if (evt.type == "discard" && evt.getParent("phaseJieshu").name == "phaseJieshu") list.addArray(evt.cards2); - }); - var cards = target.getCards("he", card => { - return lib.filter.cardDiscardable(card, target) && !list.some(cardx => get.suit(cardx, false) == get.suit(card, target)); - }); - if (cards.length) { - var text = "", - suits = list - .reduce(function (list, card) { - return list.add(get.suit(card, false)), list; - }, []) - .sort((a, b) => lib.suit.indexOf(b) - lib.suit.indexOf(a)); - for (var i = 0; i < suits.length; i++) text += get.translation(suits[i]); - target - .chooseToDiscard( - "he", - "扫谷:弃置两张牌(不能弃置" + text + "花色的牌),然后使用其中的【杀】", - function (card, player) { - var list = _status.event.list; - return !list.some(cardx => get.suit(cardx, false) == get.suit(card, player)); - }, - Math.min(cards.length, 2), - true - ) - .set("ai", function (card) { - var player = _status.event.player; - if (card.name == "sha" && player.hasValueTarget(card)) return 10; - return -get.value(card); - }) - .set("list", list); - } else event.finish(); - } - } else event.finish(); - "step 2"; - if (result.bool) { - var cards = result.cards.filter(card => card.name == "sha"); - if (cards.length) { - var next = game.createEvent("olsaogu_chooseToUseSha"); - next.player = target; - next.cards = cards; - next.setContent(lib.skill.olsaogu.chooseToUseSha); - } - } - }, - }, - }, - chooseToUseSha: function () { - "step 0"; - event.cards2 = cards.filter(i => get.position(i, true) == "d" && player.hasUseTarget(i)); - if (!event.cards2.length) event.finish(); - "step 1"; - if (event.cards2.length == 1) event._result = { bool: true, links: event.cards2 }; - else - player - .chooseButton(["扫谷:请使用其中的【杀】", event.cards2], true) - .set("filterButton", button => { - return _status.event.player.hasUseTarget(button.link, false); - }) - .set("ai", button => { - return _status.event.player.getUseValue(button.link); - }); - "step 2"; - if (result.bool) { - var card = result.links[0]; - event.cards2.remove(card); - player.$gain2(card, false); - game.delayx(); - player.chooseUseTarget(true, card, false); - } else event.finish(); - "step 3"; - if (event.cards2.length) event.goto(1); - }, - }, - //OL周群 - oltianhou: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - content: function () { - "step 0"; - var card = get.cards()[0]; - event.card = card; - game.cardsGotoOrdering(card); - "step 1"; - if (player.countCards("he") > 0) { - player - .chooseCard("he", "天候:是否用一张牌交换牌堆顶的" + get.translation(card) + "?") - .set("promptx", [[card]]) - .set("card", card) - .set("ai", cardx => { - let card = _status.event.card, - val = get.value(card, player) - get.value(cardx, player); - if (val < 0) return -val; - let suit = get.suit(card); - if (suit === "heart") - return ( - val + - game.countPlayer(current => { - if (player !== current && !game.hasPlayer(tar => tar.hp - current.hp > 1)) return get.sgn(get.attitude(player, current)); - return 0; - }) - ); - if (suit == "club") - return ( - val + - game.countPlayer(current => { - if (player !== current && (current.hp < 2 || !game.hasPlayer(tar => current.hp - tar.hp > 1))) return get.sgn(get.attitude(player, current)); - return 0; - }) - ); - return val + 0.1; - }); - } else { - event._result = { bool: false }; - } - "step 2"; - if (result.bool) { - player.lose(result.cards, ui.cardPile, "insert"); - player.gain(event.card, "draw"); - } else { - ui.cardPile.insertBefore(event.card, ui.cardPile.firstChild); - } - "step 3"; - var card = get.cards()[0]; - ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - player.showCards(card, get.translation(player) + "发动了【天候】"); - var suit = get.suit(card, false), - skill = "oltianhou_" + suit; - if (!lib.skill.oltianhou.derivation.includes(skill)) event.finish(); - else { - event.weather_skill = skill; - player.chooseTarget(true, "令一名角色获得技能【" + get.translation(skill) + "】", get.translation(skill + "_info")).set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - } - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.addAdditionalSkill("oltianhou_" + player.playerid, event.weather_skill); - player.addTempSkill("oltianhou_expire", { player: "phaseZhunbeiBegin" }); - game.log(target, "获得了天气技能", "#g【" + get.translation(event.weather_skill) + "】"); - game.broadcastAll(function (bg) { - _status.tempBackground = bg; - game.updateBackground(); - }, event.weather_skill + "_bg"); - game.addVideo("skill", player, ["oltianhou", [true, event.weather_skill + "_bg"]]); - } - }, - video: function (player, info) { - if (info[0]) { - _status.tempBackground = info[1]; - } else { - delete _status.tempBackground; - } - game.updateBackground(); - }, - derivation: ["oltianhou_spade", "oltianhou_heart", "oltianhou_club", "oltianhou_diamond"], - subSkill: { - expire: { - charlotte: true, - onremove: function (player) { - var key = "oltianhou_" + player.playerid, - players = game.players.concat(game.dead); - for (var current of players) { - current.removeAdditionalSkill(key); - } - game.removeGlobalSkill("oltianhou_" + player.playerid + "_ai"); - game.broadcastAll(function () { - delete _status.tempBackground; - game.updateBackground(); - }); - game.addVideo("skill", player, ["oltianhou", [false]]); - }, - }, - spade: { - audio: true, - mark: true, - marktext: "雨", - intro: { - content: "锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。", - }, - trigger: { global: "damageEnd" }, - forced: true, - filter: function (event) { - return event.hasNature("thunder") && lib.skill.oltianhou_spade.logTarget(event).length > 0; - }, - logTarget: function (event) { - var list = []; - if (!event.player.isIn()) return []; - if (event.player.getNext().isIn()) list.push(event.player.getNext()); - if (event.player.getPrevious().isIn()) list.push(event.player.getPrevious()); - return list.sortBySeat(_status.currentPhase); - }, - content: function () { - var targets = lib.skill.oltianhou_spade.logTarget(trigger); - for (var i of targets) i.loseHp(); - game.delayex(); - }, - group: "oltianhou_miehuo", - global: "oltianhou_spade_ai", - }, - spade_ai: { - ai: { - effect: { - player: function (card, player, target, current) { - if (((typeof card == "object" && game.hasNature(card, "fire")) || get.tag(card, "fireDamage")) && !player.hasSkill("oltianhou_spade")) return "zeroplayertarget"; - if ((typeof card == "object" && game.hasNature(card, "thunder")) || get.tag(card, "thunderDamage")) { - var list = lib.skill.oltianhou_spade.logTarget({ player: target }); - var eff = list.reduce(function (eff, current) { - eff += get.effect(current, { name: "losehp" }, player, player) / get.attitude(player, player); - }, 0); - return [1, eff]; - } - }, - }, - }, - }, - miehuo: { - audio: "oltianhou_spade", - trigger: { global: "damageBegin2" }, - forced: true, - logTarget: "source", - filter: function (event, player) { - return event.hasNature("fire") && event.source && event.source.isIn() && event.source != player; - }, - content: function () { - trigger.cancel(); - }, - }, - heart: { - audio: true, - mark: true, - marktext: "暑", - intro: { - content: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。", - }, - trigger: { global: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return player != event.player && event.player.isIn() && event.player.isMaxHp(); - }, - logTarget: "player", - content: function () { - trigger.player.loseHp(); - }, - global: "oltianhou_heart_ai", - }, - heart_ai: { - mod: { - aiOrder: function (player, card, num) { - if ( - num > 0 && - _status.event && - _status.event.type == "phase" && - !player.hasSkill("oltianhou_heart") && - get.tag(card, "recover") && - !player.isMaxHp() && - player.needsToDiscard() <= 1 && - !game.hasPlayer(function (current) { - return current.hp - player.hp > 1; - }) && - get.effect(player, { name: "losehp" }, player, player) < 0 - ) - return 0; - }, - }, - }, - club: { - audio: true, - mark: true, - marktext: "霜", - intro: { - content: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。", - }, - trigger: { global: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return player != event.player && event.player.isIn() && event.player.isMinHp(); - }, - logTarget: "player", - content: function () { - trigger.player.loseHp(); - }, - global: "oltianhou_club_ai", - }, - club_ai: { - ai: { - nokeep: true, - skillTagFilter: function (player, tag, arg) { - return _status.event && _status.event.type == "phase" && (!arg || (arg.card && get.name(arg.card) === "tao")) && !player.hasSkill("oltianhou_club") && player.isMinHp() && get.effect(player, { name: "losehp" }, player, player) < 0; - }, - }, - }, - diamond: { - audio: true, - mark: true, - marktext: "雾", - intro: { - content: "锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。", - }, - trigger: { global: "useCardToPlayer" }, - forced: true, - filter: function (event, player) { - if (event.card.name != "sha" || event.player == player || event.targets.length != 1 || !event.player.isIn()) return false; - return event.target != event.player.getNext() && event.target != event.player.getPrevious(); - }, - logTarget: "player", - content: function () { - "step 0"; - var num = get.number(trigger.card); - event.num = num; - trigger.player - .judge(card => { - var num = get.number(card), - num2 = _status.event.getParent("oltianhou_diamond").num; - return num > num2 ? -4 : 4; - }) - .set("judge2", result => { - if (result.bool == false) return true; - return false; - }); - "step 1"; - if (!result.bool) { - trigger.getParent().all_excluded = true; - trigger.untrigger(); - } - }, - global: "oltianhou_diamond_ai", - }, - diamond_ai: { - ai: { - effect: { - player: function (card, player, target) { - if (get.name(card) == "sha" && !player.hasSkill("oltianhou_diamond") && target != player.getNext() && target != player.getPrevious()) { - let num = get.number(card), - max = _status.aiyh_MAXNUM || 13; - return [num / max, 0, num / max, 0]; - } - }, - }, - }, - }, - }, - }, - olchenshuo: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - hasSame: function (info, card) { - if (info.type == get.type2(card, false)) return true; - if (info.suit != "none" && info.suit == get.suit(card, false)) return true; - if (typeof info.number == "number" && info.number > 0 && info.number == get.number(card, false)) return true; - return info.length == get.cardNameLength(card); - }, - content: function () { - "step 0"; - player.chooseCard("h", get.prompt("olchenshuo"), "展示一张手牌,然后展示并获得牌堆顶的牌").set("ai", function (card) { - if (get.type(card) == "basic") return 1 + Math.random(); - return Math.random(); - }); - "step 1"; - if (result.bool) { - player.logSkill("olchenshuo"); - player.showCards(result.cards, get.translation(player) + "发动了【谶说】"); - var card = result.cards[0]; - event.cardInfo = { - type: get.type2(card, player), - suit: get.suit(card, player), - number: get.number(card, player), - length: get.cardNameLength(card), - }; - event.cards = []; - event.forceDie = true; - event.includeOut = true; - } else event.finish(); - "step 2"; - var judgestr = get.translation(player) + "展示的第" + get.cnNumber(cards.length + 1, true) + "张【谶说】牌"; - event.videoId = lib.status.videoId++; - var card = get.cards()[0]; - event.card = card; - cards.add(card); - game.cardsGotoOrdering(card); - game.addVideo("judge1", player, [get.cardInfo(card), judgestr, event.videoId]); - game.broadcastAll( - function (player, card, str, id, cardid) { - var event; - if (game.online) { - event = {}; - } else { - event = _status.event; - } - if (game.chess) { - event.node = card.copy("thrown", "center", ui.arena).addTempClass("start"); - } else { - event.node = player.$throwordered(card.copy(), true); - } - if (lib.cardOL) lib.cardOL[cardid] = event.node; - event.node.cardid = cardid; - event.node.classList.add("thrownhighlight"); - ui.arena.classList.add("thrownhighlight"); - event.dialog = ui.create.dialog(str); - event.dialog.classList.add("center"); - event.dialog.videoId = id; - }, - player, - card, - judgestr, - event.videoId, - get.id() - ); - game.log(player, "展示了牌堆顶的", card); - game.delay(2); - "step 3"; - game.broadcastAll(function (id) { - var dialog = get.idDialog(id); - if (dialog) { - dialog.close(); - } - ui.arena.classList.remove("thrownhighlight"); - }, event.videoId); - game.addVideo("judge2", null, event.videoId); - if (cards.length < 3 && player.isIn() && lib.skill.olchenshuo.hasSame(event.cardInfo, card)) event.goto(2); - else { - game.broadcastAll(function () { - ui.clear(); - }); - player.gain(cards, "gain2"); - } - }, - }, - //OL文钦 - olguangao: { - audio: 2, - trigger: { - global: "useCard2", - }, - filter: function (event, player) { - var card = event.card; - if (card.name != "sha") return false; - if (event.player == player) { - return game.hasPlayer(current => { - return current.isIn() && !event.targets.includes(current) && player.canUse(card, current); - }); - } - return event.player.isIn() && !event.targets.includes(player) && event.player.canUse(card, player); - }, - direct: true, - content: function () { - "step 0"; - if (trigger.player == player) { - player - .chooseTarget(get.prompt("olguangao"), "为" + get.translation(trigger.card) + "额外指定一个目标。然后若你手牌数为偶数,你摸一张牌并令此牌对任意目标无效。", (card, player, target) => { - return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); - }) - .set("sourcex", trigger.targets) - .set("ai", function (target) { - var player = _status.event.player; - if (player.countCards("h") % 2 == 0) return true; - var eff = get.effect(target, _status.event.card, player, player); - if ( - player.hasSkill("olxieju") && - player.isPhaseUsing() && - !player.getStat().skill.olxieju && - get.attitude(player, target) > 0 && - !game.hasGlobalHistory("useCard", evt => { - return evt.targets && evt.targets.includes(target); - }) - ) - return 6 + eff; - return eff; - }) - .set("card", trigger.card); - } else { - trigger.player - .chooseBool("是否发动" + get.translation(player) + "的【犷骜】?", "令其成为" + get.translation(trigger.card) + "的额外目标。然后若其手牌数为偶数,其摸一张牌并令此牌对任意目标无效。") - .set("ai", () => { - return _status.event.bool; - }) - .set( - "bool", - (function () { - var att = get.attitude(trigger.player, player); - if (player.countCards("h") % 2 == 0) { - if (att > 0) return true; - return false; - } - if (get.effect(player, trigger.card, trigger.player, trigger.player) > 0) return true; - return false; - })() - ); - } - "step 1"; - if (result.bool) { - var target = result.targets && result.targets[0]; - if (!target) { - target = player; - trigger.player.logSkill("olguangao", player); - } else { - player.logSkill("olguangao", target); - } - trigger.targets.add(target); - game.delayex(); - } else event.finish(); - "step 2"; - if (player.countCards("h") % 2 == 0) { - player.draw(); - player - .chooseTarget("犷骜:令此杀对其任意个目标无效", [1, Infinity], (card, player, target) => { - return _status.event.targetsx.includes(target); - }) - .set("ai", target => { - return 1 - get.effect(target, _status.event.getTrigger().card, _status.event.player, _status.event.player); - }) - .set("targetsx", trigger.targets); - } else event.finish(); - "step 3"; - if (result.bool) { - player.line(result.targets); - trigger.excluded.addArray(result.targets); - } - }, - }, - olhuiqi: { - audio: 2, - trigger: { - global: "phaseEnd", - }, - juexingji: true, - forced: true, - skillAnimation: true, - animationColor: "thunder", - derivation: "olxieju", - filter: function (event, player) { - var targets = []; - game.getGlobalHistory("useCard", evt => { - if (evt.targets && evt.targets.length) { - targets.addArray(evt.targets); - } - }); - return targets.length == 3 && targets.includes(player); - }, - content: function () { - "step 0"; - player.awakenSkill("olhuiqi"); - player.addSkills("olxieju"); - player.insertPhase(); - }, - }, - olxieju: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return event.olxieju && event.olxieju.length; - }, - onChooseToUse: function (event) { - if (!event.olxieju && !game.online) { - var targets = []; - game.getGlobalHistory("useCard", evt => { - if (evt.targets && evt.targets.length) { - targets.addArray(evt.targets); - } - }); - event.set("olxieju", targets); - } - }, - filterTarget: function (card, player, target) { - var event = _status.event; - if (event.olxieju.includes(target)) return true; - return false; - }, - selectTarget: [1, Infinity], - content: function () { - var card = { - name: "sha", - isCard: true, - }; - if (target.hasUseTarget(card, true)) { - target.chooseUseTarget(card, true, false); - } - }, - ai: { - order: 1, - result: { - target: function (player, target) { - var val = target.getUseValue({ name: "sha" }, true); - return Math.sign(val); - }, - }, - }, - }, - //郝普 - olzhenying: { - audio: 2, - enable: "phaseUse", - usable: 2, - filter: function (event, player) { - return game.hasPlayer(current => { - return lib.skill.olzhenying.filterTarget(null, player, current); - }); - }, - filterTarget: function (card, player, target) { - return player != target && target.countCards("h") <= player.countCards("h"); - }, - content: function () { - "step 0"; - var send = function () { - var next = game.createEvent("olzhenying_adjust", false); - next.setContent(lib.skill.olzhenying.contentx); - game.resume(); - }; - var sendback = function (result, player) { - if (!result && typeof result !== "number") { - result = player.getCards("h"); - if (!result.length) result = 0; - } - event.results.push([player, result]); - }; - event.ai_targets = []; - event.results = []; - var players = [player, target]; - for (var i = 0; i < players.length; i++) { - if (_status.connectMode) players[i].showTimer(); - if (players[i].isOnline()) { - event.withol = true; - players[i].send(send); - players[i].wait(sendback); - } else if (players[i] == game.me) { - event.withme = true; - var next = game.createEvent("olzhenying_adjust", false); - next.setContent(lib.skill.olzhenying.contentx); - if (_status.connectMode) game.me.wait(sendback); - } else { - event.ai_targets.push(players[i]); - } - } - if (event.ai_targets.length) { - for (var i = 0; i < event.ai_targets.length; i++) { - if (players.includes(event.ai_targets[i])) { - var target = event.ai_targets[i]; - var cards = target.getCards("h"); - cards = cards.sort((a, b) => { - return get.value(b) - get.value(a); - }); - var beginInd = 1; - var endInd = 2; - var eff = get.effect(player, { name: "juedou" }, target, target), - eff2 = get.effect(target, { name: "juedou" }, player, target); - var att = get.attitude(player, target); - if (att > 0 || eff2 > 0) { - if (cards.length <= 2) { - cards = 2 - cards.length; - } else { - beginInd = 2; - endInd = 2; - } - } else { - if (get.value(cards, target) <= 5 && !target.isZhu) { - if (eff > 0 && Math.random() < 0.65) { - beginInd = 0; - endInd = 1; - } - } - } - if (typeof cards != "number") { - cards = cards.slice([beginInd, endInd].randomGet(), cards.length); - } - sendback(cards, target); - event.ai_targets.splice(i--, 1); - } - } - if (event.ai_targets.length) { - event.ai_targets.randomSort(); - setTimeout(function () { - event.interval = setInterval( - function () { - var target = event.ai_targets.shift(); - var cards = target.getCards("h"); - cards = cards.sort((a, b) => { - return get.value(b) - get.value(a); - }); - var beginInd = 1; - var endInd = 2; - var eff = get.effect(player, { name: "juedou" }, target, target), - eff2 = get.effect(target, { name: "juedou" }, player, target); - var att = get.attitude(player, target); - if (att > 0 || eff2 > 0) { - if (cards.length <= 2) { - cards = 2 - cards.length; - } else { - beginInd = 2; - endInd = 2; - } - } else { - if (get.value(cards, target) <= 5 && !target.isZhu) { - if (eff > 0 && Math.random() < 0.65) { - beginInd = 0; - endInd = 1; - } - } - } - if (typeof cards != "number") { - cards = cards.slice([beginInd, endInd].randomGet(), cards.length); - } - sendback(cards, target); - if (!event.ai_targets.length) { - clearInterval(event.interval); - if (event.withai) game.resume(); - } - }, - _status.connectMode ? 750 : 75 - ); - }, 500); - } - } - "step 1"; - if (event.withme) { - if (_status.connectMode) game.me.unwait(result, game.me); - else { - if (!result && typeof result !== "number") { - result = game.me.getCards("h"); - if (!result.length) result = 0; - } - event.results.push([game.me, result]); - } - } - "step 2"; - if (event.withol && !event.resultOL) { - game.pause(); - } - "step 3"; - if (event.ai_targets.length > 0) { - event.withai = true; - game.pause(); - } - "step 4"; - if (_status.connectMode) { - for (var i of [player, target]) i.hideTimer(); - } - var lose_list = []; - var draw_list = []; - event.results.sort((a, b) => lib.sort.seat(a[0], b[0])); - for (var res of event.results) { - var target = res[0], - cardsx = res[1]; - if (!target || !cardsx) continue; - if (typeof cardsx === "number") draw_list.push([target, cardsx]); - else if (cardsx.length) lose_list.push([target, cardsx]); - } - if (lose_list.length) { - game.loseAsync({ - lose_list: lose_list, - }).setContent("discardMultiple"); - } - if (draw_list.length) { - for (var list of draw_list) { - var target = list[0], - num = list[1]; - target.draw(num, "nodelay"); - } - } - "step 5"; - game.delay(); - var num1 = player.countCards("h"), - num2 = target.countCards("h"); - if (num1 == num2) { - event.finish(); - return; - } - var players = [player, target]; - if (num2 < num1) players.reverse(); - var card = { - name: "juedou", - isCard: true, - }; - if (players[0].canUse(card, players[1])) players[0].useCard(card, players[1]); - }, - contentx: function () { - "step 0"; - var player = game.me; - event.player = player; - var num = player.countCards("h"); - if (num >= 2) { - var cards = player.getCards("h", card => { - return lib.filter.cardDiscardable(card, player, "olzhenying"); - }); - if (cards.length < num - 2) event._result = { cards: cards }; - else - player.chooseCard("镇荧:请将手牌弃置至至多两张", [num - 2, num], true, (card, player, target) => { - return lib.filter.cardDiscardable(card, player, "olzhenying"); - }); - event.goto(2); - } else { - var choices = ["零", "一", "二"]; - player - .chooseControl(choices) - .set("prompt", "镇荧:请选择要将手牌调整至的张数") - .set("ai", () => { - return [0, 1, 2].randomGet(); - }); - } - "step 1"; - var num = result.index; - var len = player.countCards("h"); - if (len > num) { - var cards = player.getCards("h", card => { - return lib.filter.cardDiscardable(card, player, "olzhenying"); - }); - if (num == 0 || cards.length < len - num) { - event._result = { cards: cards }; - } else - player.chooseCard("镇荧:请将手牌弃置至" + get.cnNumber(num) + "张", len - num, true, (card, player, target) => { - return lib.filter.cardDiscardable(card, player, "olzhenying"); - }); - } else event._result = { cards: num - len }; - "step 2"; - if (result && result.cards) { - var cards = result.cards; - } - event.result = cards; - }, - ai: { - order: function (item, player) { - if ( - game.hasPlayer(current => { - return current.countCards("h") < player.countCards("h"); - }) - ) - return 3; - return 7; - }, - result: { - player: function (player, target) { - var delt = 2 - player.countCards("h"); - return Math.sqrt(Math.abs(delt)) * Math.sign(delt) + 0.1; - }, - target: function (player, target) { - if (get.attitude(player, target) > 0 && target.countCards("h") + player.countCards("h") <= 3) return 1; - return get.sgn(get.effect(target, { name: "juedou" }, player, target)) * 1.2; - }, - }, - }, - }, - //OL孟达 - olgoude: { - audio: 2, - trigger: { - global: "phaseEnd", - }, - filter: function (event, player) { - var list = []; - game.countPlayer(current => { - if (current.group != player.group) return false; - var listx = lib.skill.olgoude.getActed(current); - list.addArray(listx); - }); - return list.length && list.length < 4; - }, - getActed: function (target) { - var list = []; - if ( - target.hasHistory("gain", evt => { - return evt.getParent().name == "draw" && evt.cards.length == 1; - }) - ) { - list.push(1); - } - if ( - game.hasPlayer2(current => { - return current.hasHistory("lose", evt => { - if (evt.type != "discard") return false; - if ((evt.discarder || evt.getParent(2).player) != target) return false; - var evtx = evt.getl(current); - if (!evtx || evtx.hs.length != 1) return false; - return true; - }); - }) - ) { - list.push(2); - } - if ( - target.hasHistory("useCard", evt => { - if (evt.card.name == "sha" && evt.cards && !evt.cards.length) return true; - return false; - }) - ) { - list.push(3); - } - if ( - target.hasHistory("custom", evt => { - return evt.name == "changeGroup"; - }) - ) { - list.push(4); - } - return list; - }, - direct: true, - content: function () { - "step 0"; - var list = [1, 2, 3, 4]; - game.countPlayer(current => { - if (current.group != player.group) return false; - var listx = lib.skill.olgoude.getActed(current); - list.removeArray(listx); - }); - var list2 = list.slice(); - var nochai = false, - nosha = false; - if ( - !game.hasPlayer(current => { - return current.countDiscardableCards(player, "h"); - }) - ) { - nochai = true; - list2.remove(2); - } - if ( - !game.hasPlayer(current => { - return player.canUse({ name: "sha", isCard: true }, current, true, false); - }) - ) { - nosha = true; - list2.remove(3); - } - var choices = list2.map(i => { - return "选项" + get.cnNumber(i, true); - }); - var choiceList = ["摸一张牌", "弃置一名角色的一张手牌", "视为使用一张【杀】", "将势力改为任意一个势力"].map((text, ind) => { - var hint = ""; - if (list2.includes(ind + 1)) { - return text; - } else if (!list.includes(ind + 1)) { - hint += "已被执行过且"; - } - if (ind == 1 && nochai && !list2.includes(ind + 1)) hint += "无有手牌角色且"; - if (ind == 2 && nosha && !list2.includes(ind + 1)) hint += "无可选目标且"; - hint = hint.slice(0, -1); - return '' + text + "(" + hint + ")"; - }); - choices.push("cancel2"); - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - player - .chooseControl(choices) - .set("choiceList", choiceList) - .set("prompt", get.prompt("olgoude")) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var fn = function (control) { - switch (control) { - case "选项一": - return player.getUseValue({ name: "draw" }); - case "选项二": - return Math.max.apply( - Math, - game.filterPlayer().map(current => { - if (current.hasSkillTag("noh")) return -1; - return -1.5 * get.attitude(player, current) - Math.max(0, current.countCards("h") - 2) / 3; - }) - ); - case "选项三": - return player.getUseValue({ name: "sha" }); - case "选项四": - var myPopulation = - game.countPlayer(current => { - return current.group == player.group; - }) - 1; - var value = Math.max.apply( - Math, - lib.group.map(group => { - return ( - game.countPlayer(current => { - return current.group == group && current != player; - }) - myPopulation - ); - }) - ); - return 10 * value + 0.1 * (Math.random() - 0.5); - case "cancel2": - return 0; - } - }; - var choicesx = choices.map(choice => { - return [choice, fn(choice)]; - }); - choicesx = choicesx.sort((a, b) => { - return b[1] - a[1]; - }); - var choice = choicesx[0]; - if (choice[1] < 0) return "cancel2"; - return choice[0]; - })() - ); - "step 1"; - if (result.control == "cancel2") { - event.finish(); - return; - } - var contents = { - 选项一: function () { - player.logSkill("olgoude"); - player.draw(); - }, - 选项二: function () { - "step 0"; - player - .chooseTarget("苟得:弃置一名角色的一张手牌", true, (card, player, target) => { - return target.countDiscardableCards(player, "h"); - }) - .set("ai", target => { - if (target.hasSkillTag("noh")) return 0; - return -get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - player.logSkill("olgoude", target); - player.discardPlayerCard(target, true, "h"); - } - }, - 选项三: function () { - player.chooseUseTarget("sha", true, false).set("logSkill", "olgoude").set("prompt", "苟得:选择【杀】的目标"); - }, - 选项四: function () { - "step 0"; - var list = lib.group.slice(); - var maxGroup = list.slice().sort((a, b) => { - return ( - game.countPlayer(current => { - return current.group == b && current != player; - }) - - game.countPlayer(current => { - return current.group == a && current != player; - }) - ); - })[0]; - player - .chooseControl(list) - .set("prompt", "苟得:请选择要变更为的势力") - .set("ai", () => { - return _status.event.choice; - }) - .set("choice", maxGroup); - "step 1"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - var group = result.control; - player.logSkill("olgoude"); - player.changeGroup(group); - player.popup(group + "2", get.groupnature(group, "raw")); - }, - }; - var next = game.createEvent("olgoude_" + result.control); - next.player = player; - next.setContent(contents[result.control]); - }, - ai: { - threaten: 3, - effect: { - player_use: function (card, player, target) { - if ( - typeof card == "object" && - card.cards && - card.cards.some(card => { - return get.position(card) == "h"; - }) && - !get.tag(card, "draw") && - !get.tag(card, "gain") && - !get.tag(card, "discard") && - player == _status.currentPhase && - player.needsToDiscard() == 1 && - game.countPlayer(current => { - return current.group == player.group && current != player; - }) <= 1 && - lib.group.some(group => { - return ( - game.countPlayer(current => { - return current.group == group && current != player; - }) > 2 - ); - }) - ) - return "zeroplayertarget"; - }, - }, - }, - }, - //OL新改王朗 - oljici: { - audio: "jici", - trigger: { - player: "compare", - target: "compare", - }, - filter: function (event, player) { - if (event.player == player) { - if (event.iwhile) return false; - return event.num1 <= player.countMark("gushe"); - } - return event.num2 <= player.countMark("gushe"); - }, - content: function () { - var num = player.countMark("gushe"); - if (player == trigger.player) { - trigger.num1 += num; - if (trigger.num1 > 13) trigger.num1 = 13; - } else { - trigger.num2 += num; - if (trigger.num2 > 13) trigger.num2 = 13; - } - game.log(player, "的拼点牌点数+" + num); - var stat = player.getStat().skill; - delete stat.gushe; - }, - ai: { - combo: "gushe", - }, - }, - //OL刘老板 - olpianan: { - audio: 2, - trigger: { - player: ["enterGame", "phaseDiscardEnd"], - global: "phaseBefore", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - var hs = player.getCards("h", card => { - return get.name(card) != "shan" && lib.filter.cardDiscardable(card, player, "olpianan"); - }); - if (hs.length) player.discard(hs); - "step 1"; - var num = player.hp - player.countCards("h"); - if (num > 0) { - var cards = []; - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var card = ui.cardPile.childNodes[i]; - if (card.name == "shan") { - cards.add(card); - num--; - } - if (num == 0) break; - } - if (num > 0) { - for (var i = 0; i < ui.discardPile.childNodes.length; i++) { - var card = ui.discardPile.childNodes[i]; - if (card.name == "shan") { - cards.add(card); - num--; - } - if (num == 0) break; - } - } - if (cards.length) player.gain(cards, "gain2"); - } - }, - mod: { - aiValue: function (player, card, num) { - if (card.name != "shan") return; - if (player == _status.currentPhase) return 0; - }, - aiUseful: function () { - return lib.skill.olpianan.mod.aiValue.apply(this, arguments); - }, - }, - }, - olyinji: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return !player.isMaxHp(true); - }, - content: function () { - "step 0"; - player - .chooseControl("体力", "体力上限") - .set("prompt", "殷积:回复1点体力或加1点体力上限") - .set("ai", () => { - var player = _status.event.player; - if (!player.isDamaged() || (player.hp > 3 && player.getDamagedHp() == 1) || player.maxHp < 3) return 1; - return 0; - }); - "step 1"; - player[result.index == 0 ? "recover" : "gainMaxHp"](); - }, - }, - olkuisi: { - audio: 2, - trigger: { player: "phaseDrawBefore" }, - forced: true, - content: function () { - "step 0"; - trigger.cancel(); - var cards = game.cardsGotoOrdering(get.cards(4)).cards; - event.cards = cards.slice(); - "step 1"; - player - .chooseButton(["窥伺:是否使用其中的一张牌?", cards]) - .set("filterButton", button => { - return _status.event.player.hasUseTarget(button.link); - }) - .set("ai", button => { - var player = _status.event.player, - card = button.link, - cards = _status.event.getParent().cards; - var val = player.getUseValue(card) + 0.01; - if ((val > 0 && cards.length > 1) || (val > 4 && cards.length == 1 && (player.maxHp > 3 || player.isDamaged()))) return get.order(card) + val / 5; - return 0; - }); - "step 2"; - if (result.bool) { - var card = result.links[0]; - event.cards.remove(card); - player.$gain2(card, false); - game.delayx(); - player.chooseUseTarget(true, card, false); - } else event.goto(4); - "step 3"; - if (cards.some(i => get.position(i, true) == "o" && player.hasUseTarget(i))) event.goto(1); - "step 4"; - if (cards.length != 1 && cards.length != 2) { - player.loseMaxHp(); - } - }, - }, - //卢氏 - olzhuyan: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - init: function (player) { - player.addSkill("olzhuyan_record"); - }, - onremove: ["olzhuyan_true", "olzhuyan_false"], - direct: true, - filter: function (event, player) { - for (var bool of [true, false]) { - var targeted = player.getStorage("olzhuyan_" + bool); - if ( - game.hasPlayer(current => { - return !targeted.includes(current) && lib.skill.olzhuyan.getNum(current, bool); - }) - ) - return true; - } - return false; - }, - getNum: function (player, status) { - if (!_status.olzhuyan || !_status.olzhuyan[player.playerid]) return 0; - var num = _status.olzhuyan[player.playerid][status ? 1 : 0]; - if (status) { - num -= player.countCards("h"); - if (num + player.countCards("h") > 5) num = 5 - player.countCards("h"); - } else { - num -= player.hp; - if (num + player.hp < 1) num = 1 - player.hp; - } - return num; - }, - content: function () { - "step 0"; - var map = {}; - for (var bool of [true, false]) { - var targeted = player.getStorage("olzhuyan_" + bool); - game.countPlayer(current => { - if (targeted.includes(current)) return false; - if (!map[current.playerid]) map[current.playerid] = []; - map[current.playerid][bool ? 1 : 0] = lib.skill.olzhuyan.getNum(current, bool); - }); - } - event.map = map; - player - .chooseTarget(get.prompt("olzhuyan"), "令一名角色将{体力值/手牌数}调整至与其上个准备阶段相同(“--”表示已对其发动过该分支)", (card, player, target) => { - var list = _status.event.map[target.playerid]; - return list && (list[0] || list[1]); - }) - .set("map", map) - .set("targetprompt", target => { - var list = _status.event.map[target.playerid]; - var str = ""; - for (var i = 0; i < 2; i++) { - if (list[i] === undefined) str += "--"; - else { - str += (list[i] > 0 ? "+" : "") + list[i]; - } - str += "/"; - } - return str.slice(0, -1); - }) - .set("ai", target => { - var list = _status.event.map[target.playerid]; - var att = get.attitude(_status.event.player, target); - var v1 = list[0], - v2 = get.sgn(list[1]) * Math.sqrt(Math.abs(list[1])); - return Math[att > 0 ? "max" : "min"](v1, v2) * att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("olzhuyan", target); - event.target = target; - var list = event.map[target.playerid]; - var choices = ["体力值", "手牌数"]; - if (list[0] && list[1]) { - player - .chooseControl(choices) - .set("choiceList", ["令" + get.translation(target) + (list[0] > 0 ? "回复" : "失去") + Math.abs(list[0]) + "点体力" + (list[0] < 0 ? "(至多失去至1)" : ""), "令" + get.translation(target) + (list[1] > 0 ? "摸" : "弃置") + get.cnNumber(Math.abs(list[1])) + "张" + (list[1] > 0 ? "" : "手") + "牌" + (list[1] > 0 ? "(至多摸至5)" : "")]) - .set("prompt", "驻颜:请选择一项") - .set("ai", () => _status.event.choice) - .set( - "choice", - (function () { - var v1 = list[0], - v2 = get.sgn(list[1]) * Math.sqrt(Math.abs(list[1])); - if (get.attitude(player, target) > 0) { - return v1 > v2 ? 0 : 1; - } - return v1 > v2 ? 1 : 0; - })() - ); - } else { - event._result = { index: list[0] ? 0 : 1 }; - } - } else event.finish(); - "step 2"; - var ind = result.index; - player.markAuto("olzhuyan_" + Boolean(ind), [target]); - var num = event.map[target.playerid][ind]; - if (ind == 0) { - if (num > 0) { - target.recover(num); - } else { - num = Math.min(target.hp - 1, -num); - target.loseHp(num); - } - } else { - if (num > 0) { - num = Math.min(5 - target.countCards("h"), num); - if (num > 0) target.draw(num); - } else { - num = -num; - target.chooseToDiscard(num, true).set("prompt", "驻颜:请弃置" + get.cnNumber(Math.abs(num)) + "张手牌"); - } - } - }, - subSkill: { - record: { - trigger: { - global: ["phaseJieshuAfter", "phaseBefore", "enterGame"], - }, - lastDo: true, - charlotte: true, - forced: true, - popup: false, - forceDie: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - if (!_status.olzhuyan) _status.olzhuyan = {}; - if (event.triggername == "phaseBefore") { - game.countPlayer(current => { - _status.olzhuyan[current.playerid] = [current.hp, current.countCards("h")]; - }); - } else { - _status.olzhuyan[trigger.player.playerid] = [trigger.player.hp, trigger.player.countCards("h")]; - } - }, - }, - }, - }, - olleijie: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("olleijie"), "令一名角色判定。若结果为♠2~9,其受到2点雷电伤害,否则其摸两张牌。") - .set("ai", target => { - var player = _status.event.player, - sgn = _status.event.sgn; - if (sgn > 0) { - return get.damageEffect(target, target, player, "thunder"); - } else if (sgn == 0) { - return get.attitude(player, target); - } - return 0; - }) - .set( - "sgn", - (function () { - var sgn = 0; - game.countPlayer(current => { - if (!current.hasSkillTag("rejudge")) return; - sgn = get.sgnAttitude(player, current); - }); - return sgn; - })() - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("olleijie", target); - target - .judge(card => { - var number = get.number(card); - if (get.suit(card) == "spade" && number >= 2 && number <= 9) return -4; - return 2; - }) - .set("judge2", result => { - return result.bool === false ? true : false; - }); - } else event.finish(); - "step 2"; - if (result.bool) { - target.draw(2); - } else { - target.damage(2, "thunder"); - } - }, - }, - releijie: { - audio: "olleijie", - enable: "phaseUse", - filterTarget: true, - usable: 1, - async content(event, trigger, player) { - const target = event.target, - result = await target - .judge(card => { - var number = get.number(card); - if (get.suit(card) == "spade" && number >= 2 && number <= 9) return -4; - return 2; - }) - .set("judge2", result => { - return result.bool === false ? true : false; - }) - .forResult(); - if (result.bool) await target.draw(2); - else { - const card = new lib.element.VCard({ name: "sha", nature: "thunder" }); - if (player.canUse(card, target, false)) { - for (let i = 1; i <= 2; i++) { - await player.useCard(card, target, false); - } - } - } - }, - ai: { - order: 1, - result: { - target(player, target) { - let sgn = 0, - eff = 0, - num = get.attitude(player, target); - const card = new lib.element.VCard({ name: "sha", nature: "thunder" }); - game.countPlayer(current => { - if (!current.hasSkillTag("rejudge")) return; - sgn = get.sgnAttitude(player, current); - }); - if (sgn > 0 && player.canUse(card, target, false)) { - eff += get.effect(target, card, player, player) * 2; - return eff * get.sgn(num); - } else if (sgn == 0) return num * get.sgn(num); - return 0; - }, - }, - }, - }, - //张世平 - olhongji: { - audio: 2, - trigger: { global: "phaseZhunbeiBegin" }, - filter: function (event, player) { - if (event.player.isMinHandcard() && !player.hasSkill("olhongji_min")) return true; - if (event.player.isMaxHandcard() && !player.hasSkill("olhongji_max")) return true; - return false; - }, - direct: true, - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - var bool1 = target.isMinHandcard() && !player.hasSkill("olhongji_min"), - str1 = "其手牌数为全场最少。你可以令其于本回合摸牌阶段结束后执行一个额外的摸牌阶段,然后本轮你不能再发动该分支。"; - var bool2 = target.isMaxHandcard() && !player.hasSkill("olhongji_max"), - str2 = "其手牌数为全场最多。你可以令其于本回合出牌阶段结束后执行一个额外的出牌阶段,然后本轮你不能再发动该分支。"; - if (bool1 && !bool2) { - event.branch = 0; - player - .chooseBool(get.prompt("olhongji", target), str1) - .set("ai", () => { - return _status.event.bool; - }) - .set("bool", get.attitude(player, trigger.player) > 1); - } else if (!bool1 && bool2) { - event.branch = 1; - player - .chooseBool(get.prompt("olhongji", target), str2) - .set("ai", () => { - return _status.event.bool; - }) - .set("bool", get.attitude(player, trigger.player) > 1); - } else if (bool1 && bool2) { - player - .chooseControl("摸牌阶段", "出牌阶段", "cancel2") - .set("prompt", get.prompt("olhongji", target)) - .set("choiceList", [str1.slice(13), str2.slice(13)]) - .set("ai", () => _status.event.bool) - .set("bool", () => (get.attitude(player, trigger.player) > 1 ? [0, 1].randomGet() : "cancel2")); - } - "step 1"; - var choice = -1; - if ((event.branch == 0 && result.bool) || result.control == "摸牌阶段") choice = 0; - if ((event.branch == 1 && result.bool) || result.control == "出牌阶段") choice = 1; - if (choice == 0) { - player.logSkill("olhongji", target); - player.addTempSkill("olhongji_min", "roundStart"); - target.addTempSkill("olhongji_draw"); - } else if (choice == 1) { - player.logSkill("olhongji", target); - player.addTempSkill("olhongji_max", "roundStart"); - target.addTempSkill("olhongji_use"); - } - }, - ai: { expose: 0.25 }, - subSkill: { - min: { charlotte: true }, - max: { charlotte: true }, - draw: { - trigger: { player: "phaseDrawAfter" }, - charlotte: true, - forced: true, - popup: false, - content: function () { - var next = trigger.player.phaseDraw(); - event.next.remove(next); - trigger.getParent("phase").next.push(next); - player.removeSkill("olhongji_draw"); - }, - }, - use: { - trigger: { player: "phaseUseAfter" }, - charlotte: true, - forced: true, - popup: false, - content: function () { - var next = trigger.player.phaseUse(); - event.next.remove(next); - trigger.getParent("phase").next.push(next); - player.removeSkill("olhongji_use"); - }, - }, - }, - }, - olxinggu: { - audio: 2, - trigger: { global: "phaseBefore", player: "enterGame" }, - forced: true, - locked: false, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: "olxinggu_trade", - content: function () { - "step 0"; - var cards = []; - for (var i = 0; i < 3; i++) { - var card = get.cardPile2(function (card) { - if (cards.includes(card)) return false; - var type = get.subtype(card); - return type == "equip3" || type == "equip4" || type == "equip6"; - }); - if (card) cards.add(card); - else break; - } - if (cards.length) player.addToExpansion(cards, "draw").gaintag.add("olxinggu"); - }, - marktext: "贾", - intro: { - markcount: "expansion", - mark: function (dialog, content, player) { - var content = player.getExpansions("olxinggu"); - if (content && content.length) { - if (player == game.me || player.isUnderControl()) { - dialog.addAuto(content); - } else { - return "剩余" + get.cnNumber(content.length) + "匹马"; - } - } - }, - }, - subSkill: { - trade: { - audio: "olxinggu", - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.getExpansions("olxinggu").length; - }, - direct: true, - content: function () { - "step 0"; - var cards = player.getExpansions("olxinggu"); - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - player - .chooseButton([get.prompt("olxinggu"), cards]) - .set("ai", button => { - if (_status.event.toChoose == button.link) return 1; - return 0; - }) - .set( - "toChoose", - !event.aiCancel && - cards.find(card => { - return game.hasPlayer(current => { - if (!lib.skill.zhijian.filterTarget(card, player, current)) return false; - return get.effect(current, card, player, player) > 0; - }); - }) - ); - "step 1"; - if (result.bool) { - var card = result.links[0]; - event.card = card; - player - .chooseTarget("将" + get.translation(card) + "置入一名其他角色的装备区", lib.skill.zhijian.filterTarget) - .set("ai", target => { - var player = _status.event.player; - return get.effect(target, _status.event.card, player, player); - }) - .set("card", card); - } else { - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - event.finish(); - } - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - player.logSkill("olxinggu", target); - player.$give(card, target, false); - } else { - if (!event.isMine() && !event.isOnline()) event.aiCancel = true; - event.goto(0); - } - "step 3"; - target.equip(card); - "step 4"; - var card = get.cardPile2(cardx => { - return get.suit(cardx) == "diamond"; - }); - if (card) player.gain(card, "gain2"); - else { - game.log("但是牌堆中并没有♦牌了!"); - player.chat("做了个亏本买卖…"); - } - }, - }, - }, - }, - //孙弘 - olxianbi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return !player.getStorage("olzenrun").includes(target) && target.countCards("e") != player.countCards("h"); - }, - content: function () { - "step 0"; - var del = target.countCards("e") - player.countCards("h"); - if (del == 0) event.finish(); - else if (del > 0) { - player.draw(Math.min(5, del)); - } else { - player.chooseToDiscard("险诐:弃置" + get.cnNumber(-del) + "张手牌", -del, "h", true); - player.addTempSkill("olxianbi_gain"); - } - }, - ai: { - order: 5, - result: { - player: function (player, target) { - return player.countCards("h", card => { - return get.value(card) > 6; - }) >= target.countCards("e") - ? 0 - : 1; - }, - }, - }, - subSkill: { - gain: { - trigger: { - player: "loseAfter", - }, - filter: function (event, player) { - return event.getParent(3).name == "olxianbi"; - }, - forced: true, - charlotte: true, - popup: false, - content: function () { - var cards = [], - cards2 = trigger.cards; - for (var cardx of cards2) { - var type = get.type2(cardx, player); - var card = get.discardPile(function (card) { - return get.type(card, false) == type && !cards2.includes(card) && !cards.includes(card); - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - }, - }, - }, - }, - olzenrun: { - audio: 2, - trigger: { player: "drawBefore" }, - filter: function (event, player) { - return ( - !player.hasSkill("olzenrun_used") && - game.hasPlayer(current => { - return ( - !player.getStorage("olzenrun").includes(current) && - current != player && - current.hasCard(function (card) { - return lib.filter.canBeGained(card, player, current); - }, "he") - ); - }) - ); - }, - direct: true, - check: function (event, player) { - return true; - }, - content: function () { - "step 0"; - var num = trigger.num; - player - .chooseTarget(get.prompt("olzenrun"), "改为获得一名其他角色" + get.cnNumber(num) + "张牌", (card, player, target) => { - return ( - !player.getStorage("olzenrun").includes(target) && - target != player && - target.hasCard(function (card) { - return lib.filter.canBeGained(card, player, target); - }, "he") - ); - }) - .set("ai", target => { - return get.attitude(_status.event.player, target) / 5 + Math.random() + 2.5; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("olzenrun", target); - player.addTempSkill("olzenrun_used", ["phaseZhunbeiAfter", "phaseJudgeAfter", "phaseDrawAfter", "phaseUseAfter", "phaseDiscardAfter", "phaseJieshuAfter"]); - trigger.cancel(); - player.gainPlayerCard(target, trigger.num, "he", true); - } - "step 2"; - if (result.bool) { - var cards = result.cards; - var num = cards.length; - event.num = num; - target - .chooseControl() - .set("choiceList", ["摸" + get.cnNumber(num) + "张牌", "令其不能再对你发动〖险诐〗和〖谮润〗"]) - .set("prompt", get.translation(player) + "对你发动了【谮润】,请选择一项") - .set("ai", () => { - if (_status.event.bool) return 0; - return 1; - }) - .set("bool", get.attitude(target, player) > 0 || (num == 1 && Math.random() < 0.5) || num >= 2); - } else event.finish(); - "step 3"; - game.log(target, "选择了", "#y" + result.control); - if (result.index == 0) { - target.draw(num); - } else { - player.markAuto("olzenrun", [target]); - } - }, - subSkill: { - used: { - charlotte: true, - }, - }, - }, - //罗宪 - oldaili: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - return ( - player.countCards("h", card => { - return card.hasGaintag("oldaili_tag"); - }) % - 2 == - 0 - ); - }, - group: "oldaili_record", - locked: false, - check: function (event, player) { - if (get.distance(event.player, player, "absolute") == 1 && !player.isTurnedOver()) return false; - return true; - }, - content: function () { - player.turnOver(); - player.draw(3, "visible").gaintag = ["oldaili_tag"]; - }, - mod: { - aiValue: function (player, card, num) { - if (num < 0 || get.itemtype(card) != "card" || !card.hasGaintag("oldaili_tag")) return; - if (get.distance(_status.currentPhase, player, "absolute") == 1 && !player.isTurnedOver()) return; - let dai = player.countCards("h", card => { - return card.hasGaintag("oldaili_tag"); - }); - if (ui.selected.cards && ui.selected.cards.length) - dai += ui.selected.cards.filter(card => { - return card.hasGaintag("oldaili_tag"); - }).length; - if (dai % 2) return Math.sqrt(num); - return num + 6; - }, - aiUseful: function () { - return lib.skill.oldaili.mod.aiValue.apply(this, arguments); - }, - }, - mark: true, - marktext: "砺", - intro: { - markcount: function (storage, player) { - return player.countCards("h", card => card.hasGaintag("oldaili_tag")); - }, - mark: function (dialog, content, player) { - var cards = player.getCards("h", card => card.hasGaintag("oldaili_tag")); - if (cards.length) { - dialog.addAuto(cards); - } else return "无展示牌"; - }, - }, - subSkill: { - record: { - trigger: { global: "showCardsEnd" }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - filter: function (event, player) { - return event.cards.some(i => get.owner(i) == player); - }, - content: function () { - game.broadcastAll( - function (cards) { - cards.forEach(card => card.addGaintag("oldaili_tag")); - }, - trigger.cards.filter(i => get.owner(i) == player) - ); - player.markSkill("oldaili"); - }, - }, - }, - }, - //胡班 - olhuiyun: { - audio: 2, - enable: "phaseUse", - viewAs: { - name: "huogong", - storage: { olhuiyun: true }, - }, - filterCard: true, - position: "hes", - onuse: function (links, player) { - player.addTempSkill("olhuiyun_after"); - player.addTempSkill("olhuiyun_record"); - }, - ai: { - effect: { - player: function (card, player, target) { - if (get.attitude(player, target) > 0 && card && card.name == "huogong" && card.storage && card.storage.olhuiyun && !player.hasSkill("olhuiyun_3")) return [0, 0.5, 0, 0.5]; - }, - }, - }, - subSkill: { - after: { - audio: "olhuiyun", - trigger: { global: "useCardAfter" }, - charlotte: true, - forced: true, - direct: true, - filter: function (event, player) { - return event.card.name == "huogong" && event.card.storage && event.card.storage.olhuiyun && event.targets.some(i => i.isIn()); - }, - content: function () { - "step 0"; - var choices = []; - var choiceList = ["使用展示牌,然后重铸所有手牌", "使用一张手牌,然后重铸展示牌", "摸一张牌"]; - for (var i = 1; i <= 3; i++) { - if (!player.hasSkill("olhuiyun_" + i)) choices.push("选项" + get.cnNumber(i, true)); - else choiceList[i - 1] = '' + choiceList[i - 1] + ""; - } - if (!choices.length) event.finish(); - else { - player.logSkill("olhuiyun_after"); - player - .chooseControl(choices) - .set("choiceList", choiceList) - .set("prompt", "晖云:选择一项,令" + get.translation(trigger.targets) + "可以选择执行") - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - if (choices.length == 1) return choices[0]; - var choicesx = choices.slice(); - if (get.attitude(player, trigger.targets[0]) > 0 && choices.includes("选项三")) return "选项三"; - choicesx.remove("选项三"); - return choicesx.randomGet(); - })() - ); - } - "step 1"; - if (result.control != "cancel2") { - var index = ["选项一", "选项二", "选项三"].indexOf(result.control) + 1; - event.index = index; - game.log(player, "选择了", "#y" + result.control); - player.addTempSkill("olhuiyun_" + index, "roundStart"); - event.targets = trigger.targets.slice(0); - } else event.finish(); - "step 2"; - var target = targets.shift(); - event.target = target; - if (target.isIn()) { - var cards = target.getCards("h", card => card.hasGaintag("olhuiyun_tag")); - if (event.index == 3) { - target.chooseBool("是否摸一张牌?").set("ai", () => true); - event.goto(5); - } else if (event.index == 1 && cards.length) { - target.chooseToUse({ - filterCard: function (card) { - if (get.itemtype(card) != "card" || !card.hasGaintag("olhuiyun_tag")) return false; - return lib.filter.filterCard.apply(this, arguments); - }, - prompt: "是否使用一张展示牌,然后重铸所有手牌?", - }); - } else if (event.index == 2) { - target.chooseToUse({ - filterCard: function (card) { - if (get.itemtype(card) != "card" || (get.position(card) != "h" && get.position(card) != "s")) return false; - return lib.filter.filterCard.apply(this, arguments); - }, - prompt: "是否使用一张手牌,然后重铸展示牌?", - }); - event.goto(4); - } else event.goto(6); - } else event.goto(6); - "step 3"; - if (result.bool) { - var hs = target.getCards("h", lib.filter.cardRecastable); - if (hs.length) { - target.recast(hs); - } - } - event.goto(6); - "step 4"; - if (result.bool) { - var hs = target.getCards("h", card => { - if (!card.hasGaintag("olhuiyun_tag")) return false; - return target.canRecast(card); - }); - if (hs.length) { - target.recast(hs); - } - } - event.goto(6); - "step 5"; - if (result.bool) { - target.draw(); - } - "step 6"; - if (targets.length) event.goto(2); - }, - }, - record: { - trigger: { global: "showCardsEnd" }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - filter: function (event, player) { - if (event.getParent().name != "huogong") return false; - var card = event.getParent(2).card; - if (card && card.storage && card.storage.olhuiyun) return true; - return false; - }, - content: function () { - game.broadcastAll(function (cards) { - cards.forEach(card => card.addGaintag("olhuiyun_tag")); - }, trigger.cards); - }, - }, - 1: { charlotte: true }, - 2: { charlotte: true }, - 3: { charlotte: true }, - }, - }, - //王瓘 - olmiuyan: { - audio: 2, - enable: "chooseToUse", - viewAsFilter: function (player) { - return !player.hasSkill("olmiuyan_blocker") && player.hasCard(card => get.color(card) == "black", "hes"); - }, - viewAs: { name: "huogong" }, - filterCard: { color: "black" }, - position: "hes", - check: function (card) { - var player = _status.event.player, - suits = lib.suit.slice(0); - if ( - player.countCards("h") > 4 && - player.hasCard(function (card) { - suits.remove(get.suit(card)); - return suits.length == 0; - }, "h") - ) - return 8 - get.value(card); - return 4 - get.value(card); - }, - promptfunc: function () { - if (_status.event.player.storage.olmiuyan) return "转换技。你可以将一张黑色牌当做【火攻】使用。若此牌未造成伤害,则你令此技能失效直到本轮结束。"; - return "转换技。你可以将一张黑色牌当做【火攻】使用。若此牌造成了伤害,则你获得此阶段内所有被展示过的牌。"; - }, - precontent: function () { - player.changeZhuanhuanji("olmiuyan"); - var card = event.result.card; - if (!card.storage) card.storage = {}; - if (player.storage.olmiuyan) { - card.storage.olmiuyan_gain = true; - player.addTempSkill("olmiuyan_gain"); - } else { - card.storage.olmiuyan_remove = true; - player.addTempSkill("olmiuyan_remove"); - } - }, - init: function (player) { - player.addSkill("olmiuyan_counter"); - }, - onremove: function (player) { - player.removeSkill("olmiuyan_counter"); - }, - zhuanhuanji: true, - mark: true, - marktext: "☯", - ai: { - order: function (item, player) { - if (player.storage.olmiuyan) return 1; - return 8; - }, - }, - intro: { - content: function (storage) { - if (storage) return "转换技。你可以将一张黑色牌当做【火攻】使用。然后若此牌未造成伤害,则你令此技能失效直到本轮结束。"; - return "转换技。你可以将一张黑色牌当做【火攻】使用。然后若此牌造成了伤害,则你获得此阶段内所有被展示过的牌。"; - }, - }, - subSkill: { - counter: { - trigger: { - global: ["showCardsEnd", "phaseZhunbeiBefore", "phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore", "phaseJieshuBefore"], - }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - filter: function (event, player) { - if (event.name == "showCards") return get.itemtype(event.cards) == "cards"; - return true; - }, - content: function () { - if (trigger.name == "showCards") { - game.broadcastAll(function (cards) { - cards.forEach(card => card.addGaintag("olmiuyan_tag")); - }, trigger.cards); - } else game.players.forEach(current => current.removeGaintag("olmiuyan_tag")); - }, - }, - gain: { - trigger: { player: "useCardAfter" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return ( - event.card.storage && - event.card.storage.olmiuyan_gain && - player.hasHistory("sourceDamage", function (evt) { - return evt.card == event.card; - }) && - game.hasPlayer(function (current) { - return current != player && current.hasCard(card => card.hasGaintag("olmiuyan_tag")); - }) - ); - }, - logTarget: function (event, player) { - return game.filterPlayer(function (current) { - return current != player && current.hasCard(card => card.hasGaintag("olmiuyan_tag")); - }); - }, - content: function () { - var cards = [], - players = game.filterPlayer(current => current != player).sortBySeat(); - players.forEach(current => { - var cardsx = current.getCards("h", function (card) { - return card.hasGaintag("olmiuyan_tag"); - }); - if (cardsx.length) cards.addArray(cardsx); - }); - player.gain(cards, "give"); - }, - }, - remove: { - trigger: { player: "useCardAfter" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return ( - event.card.storage && - event.card.storage.olmiuyan_remove && - !player.hasHistory("sourceDamage", function (evt) { - return evt.card == event.card; - }) - ); - }, - content: function () { - player.addTempSkill("olmiuyan_blocker", "roundStart"); - game.log(player, "的", "#g【谬焰】", "失效了"); - }, - }, - blocker: { charlotte: true }, - }, - }, - olshilu: { - audio: 2, - trigger: { player: "damageEnd" }, - forced: true, - filter: function (event, player) { - return player.hp > 0; - }, - content: function () { - "step 0"; - player.draw(Math.min(5, player.hp)); - "step 1"; - var targets = game.filterPlayer(current => current != player && current.countCards("h") > 0 && player.inRange(current)); - if (targets.length > 0) { - if (targets.length == 1) event._result = { bool: true, targets: targets }; - else - player - .chooseTarget(true, "请选择一名攻击范围内的角色", "然后你选择该角色的一张手牌,令此牌视为【杀】", function (card, player, target) { - return target != player && target.countCards("h") > 0 && player.inRange(target); - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - player.choosePlayerCard(target, true, "h"); - } - "step 3"; - if (result.bool) { - target.addSkill("olshilu_viewas"); - target.showCards(result.cards); - target.addGaintag(result.cards, "olshilu"); - } - }, - ai: { - maixie: true, - }, - subSkill: { - viewas: { - mod: { - cardname: function (card) { - if (get.itemtype(card) == "card" && card.hasGaintag("olshilu")) return "sha"; - }, - }, - charlotte: true, - }, - }, - }, - //张翼 - oldianjun: { - audio: 2, - trigger: { player: "phaseEnd" }, - forced: true, - content: function () { - "step 0"; - player.damage("nosource"); - "step 1"; - trigger.phaseList.splice(trigger.num, 0, "phaseUse|oldianjun"); - }, - }, - olkangrui: { - audio: 2, - init: () => { - game.addGlobalSkill("olkangrui_ai"); - }, - onremove: () => { - if (!game.hasPlayer(i => i.hasSkill("olkangrui"), true)) game.removeGlobalSkill("olkangrui_ai"); - }, - trigger: { global: "damageEnd" }, - filter: function (event, player) { - return event.player == _status.currentPhase && event.player.getHistory("damage").indexOf(event) == 0; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseControl("cancel2") - .set("choiceList", ["令" + get.translation(trigger.player) + "回复1点体力,且造成伤害时本回合手牌上限为0", "令" + get.translation(trigger.player) + "于本回合下次造成的伤害+1,且造成伤害时本回合手牌上限为0"]) - .set("prompt", get.prompt("olkangrui", trigger.player)) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - if (get.attitude(player, trigger.player) <= 0) return "cancel2"; - if (!trigger.player.isDamaged()) return "选项二"; - var list = []; - if (trigger.player.hp + trigger.player.countCards("hs", "tao") <= 2) list.push("选项一"); - if ( - trigger.player.hasCard(card => { - if (!get.tag(card, "damage")) return false; - if ( - game.hasPlayer(current => { - return ( - get.effect(current, card, trigger.player, player) > 0 && - trigger.player.canUse(card, current) && - !current.hasSkillTag("filterDamage", null, { - player: trigger.player, - card: card, - }) - ); - }, "hs") - ) { - return true; - } - }) - ) - list.push("选项二"); - if (list.length) return list.randomGet(); - return "选项一"; - })() - ); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("olkangrui", trigger.player); - player.draw(); - if (result.index == 0) { - trigger.player.recover(); - trigger.player.addTempSkill("olkangrui_nil"); - } else { - trigger.player.addTempSkill("olkangrui_add"); - trigger.player.addMark("olkangrui_add", 1, false); - } - } - }, - ai: { - expose: 0.2, - threaten: 1.5, - }, - subSkill: { - add: { - trigger: { source: "damageBegin1" }, - charlotte: true, - forced: true, - onremove: ["olkangrui_add", "olkangrui_nil"], - filter: function (event, player) { - return player.hasMark("olkangrui_add"); - }, - content: function () { - trigger.num += player.countMark("olkangrui_add"); - player.removeMark("olkangrui_add", player.countMark("olkangrui_add"), false); - player.storage.olkangrui_nil = true; - game.log(player, "本回合手牌上限基数为", "#g0"); - }, - mod: { - maxHandcardBase: function (player, num) { - if (player.storage.olkangrui_nil) return 0; - }, - }, - }, - nil: { - trigger: { source: "damageBegin1" }, - charlotte: true, - forced: true, - onremove: true, - filter: function (event, player) { - return !player.storage.olkangrui_nil; - }, - content: function () { - player.storage.olkangrui_nil = true; - game.log(player, "本回合手牌上限基数为", "#g0"); - }, - mod: { - maxHandcardBase: function (player, num) { - if (player.storage.olkangrui_nil) return 0; - }, - }, - }, - ai: { - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer(i => i.hasSkill("olkangrui"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("olkangrui_ai"); - }, - ai: { - effect: { - target: function (card, player, target) { - if (target != player || !get.tag(card, "damage")) return; - var list = game.filterPlayer(current => current.hasSkill("olkangrui") && get.attitude(current, player) > 0); - var history = player.getHistory("damage"); - if (!list.length || history.length != 0) return; - return [1, 2]; - }, - }, - }, - }, - }, - }, - //朱儁 - olcuipo: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - return get.cardNameLength(event.card) == player.getHistory("useCard").indexOf(event) + 1; - }, - content: function () { - var card = trigger.card; - if (card.name == "sha" || (get.type(card) == "trick" && get.tag(card, "damage") > 0)) trigger.baseDamage++; - else player.draw(); - }, - /* - trigger:{source:'damageBegin1'}, - forced:true, - filter:function(event,player){ - var card=event.card; - if(player!=_status.currentPhase||!card||event.getParent().type!='card') return false; - return get.cardNameLength(card)==player.getHistory('useCard').indexOf(event.getParent(2))+1; - }, - content:function(){ - trigger.num++; - },*/ - mod: { - aiOrder: function (player, card, num) { - if (typeof card == "object" && get.cardNameLength(card) == player.getHistory("useCard").length + 1) return num + 10; - }, - }, - }, - //马休马铁 - rekenshang: { - audio: "olkenshang", - enable: "chooseToUse", - filterCard: true, - selectCard: [2, Infinity], - viewAsFilter: function (player) { - return player.countCards("hes") > 1; - }, - check: function (card) { - var player = _status.event.player; - if ( - game.countPlayer(function (current) { - return current != player && player.canUse("sha", current) && get.effect(current, { name: "sha" }, player, player) > 0; - }) <= ui.selected.cards.length - ) - return 0; - if (_status.event.player.countCards("hes") >= 3) return 8 - ui.selected.cards.length - get.value(card); - return 6 - ui.selected.cards.length - get.value(card); - }, - position: "hes", - viewAs: { - name: "sha", - storage: { olkenshang: true }, - }, - onuse: function (links, player) { - player.addTempSkill("rekenshang_effect"); - }, - ai: { - order: function (item, player) { - if (player.countCards("hes") >= 3) return 6; - return 4; - }, - result: { - target: function (player, target, card, isLink) { - let eff = -1.5, - odds = 1.35, - num = 1; - if (isLink) { - let cache = _status.event.getTempCache("sha_result", "eff"); - if (typeof cache !== "object" || cache.card !== get.translation(card)) return eff; - if (cache.odds < 1.35 && cache.bool) return 1.35 * cache.eff; - return cache.odds * cache.eff; - } - if ( - player.hasSkill("jiu") || - player.hasSkillTag("damageBonus", true, { - target: target, - card: card, - }) - ) { - if ( - target.hasSkillTag("filterDamage", null, { - player: player, - card: card, - jiu: true, - }) - ) - eff = -0.5; - else { - num = 2; - if (get.attitude(player, target) > 0) eff = -7; - else eff = -4; - } - } - if ( - !player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: card, - }, - true - ) - ) - odds -= - 0.7 * - target.mayHaveShan( - player, - "use", - target.getCards("h", i => { - return i.hasGaintag("sha_notshan"); - }), - "odds" - ); - _status.event.putTempCache("sha_result", "eff", { - bool: target.hp > num && get.attitude(player, target) > 0, - card: get.translation(card), - eff: eff, - odds: odds, - }); - return odds * eff; - }, - }, - respondSha: true, - skillTagFilter: player => player.countCards("hes") > 1, - }, - subSkill: { - effect: { - audio: "olkenshang", - trigger: { player: "useCard2" }, - charlotte: true, - group: "rekenshang_after", - direct: true, - filter: function (event, player) { - return ( - event.card.storage && - event.card.storage.olkenshang && - game.countPlayer(function (current) { - return current != player && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); - }) >= event.cards.length - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(trigger.cards.length, "是否更改" + get.translation(trigger.card) + "的目标?", "选择" + get.cnNumber(trigger.cards.length) + "名角色作为" + get.translation(trigger.card) + "的目标,覆盖原先存在的目标", function (card, player, target) { - var evt = _status.event.getTrigger(); - return target != player && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); - }) - .set("ai", function (target) { - var evt = _status.event.getTrigger(); - return get.effect(target, evt.card, evt.player, evt.player); - }); - "step 1"; - if (result.bool) { - if (player != event.player && !player.isOnline()) game.delayx(); - } else event.finish(); - "step 2"; - var targets = result.targets; - player.logSkill("rekenshang_effect", targets); - trigger.targets.length = 0; - trigger.targets.addArray(targets); - game.log(targets, "成为了", trigger.card, "的新目标"); - }, - }, - after: { - audio: "olkenshang", - trigger: { player: "useCardAfter" }, - forced: true, - charlotte: true, - filter: function (event, player) { - if (event.card.name != "sha" || !event.card.storage || !event.card.storage.olkenshang) return false; - var num = 0; - game.countPlayer2(current => { - current.getHistory("damage", evt => { - if (evt.card == event.card) num += evt.num; - }); - }); - return num < event.cards.length; - }, - content: function () { - player.draw(); - }, - }, - }, - }, - olkenshang: { - audio: 2, - enable: "phaseUse", - filterCard: true, - selectCard: [1, Infinity], - check: function (card) { - return 5.5 - get.value(card); - }, - position: "hes", - viewAs: { - name: "sha", - storage: { olkenshang: true }, - }, - onuse: function (links, player) { - player.addTempSkill("olkenshang_effect"); - }, - ai: { - order: 1, - threaten: 1.1, - effect: { - player_use: function (card, player, target) { - if (_status._olkenshang_aiChecking || ui.selected.targets.length) return; - if (typeof card != "object" || !card.storage || !card.storage.olkenshang) return false; - _status._olkenshang_aiChecking = true; - var eff = 0; - var targets = game.filterPlayer(current => current != player && player.canUse(card, current, false) && !player.inRange(current)); - for (var target of targets) { - eff += get.effect(target, card, player, player); - } - delete _status._olkenshang_aiChecking; - if (eff > 0) return [0, eff / Math.max(0.01, get.attitude(player, player))]; - }, - }, - }, - subSkill: { - effect: { - audio: "olkenshang", - trigger: { player: "useCard2" }, - charlotte: true, - logTarget: function (event, player) { - return game.filterPlayer(current => current != player && player.canUse(event.card, current, false) && !player.inRange(current)); - }, - prompt2: "将此牌目标改为攻击范围外的所有其他角色", - group: "olkenshang_after", - check: function (event, player) { - var eff1 = 0, - eff2 = 0; - for (var target of event.targets) { - eff1 += get.effect(target, event.card, event.player, player); - } - var targets = game.filterPlayer(current => current != player && player.canUse(event.card, current, false) && !player.inRange(current)); - for (var target of targets) { - eff2 += get.effect(target, event.card, event.player, player); - } - return eff2 > eff1; - }, - filter: function (event, player) { - return event.card.name == "sha" && event.card.storage && event.card.storage.olkenshang && event.targets.length && game.filterPlayer(current => current != player && player.canUse(event.card, current, false) && !player.inRange(current)).length; - }, - content: function () { - "step 0"; - trigger.targets.removeArray(trigger.targets); - var targets = game.filterPlayer(current => current != player && player.canUse(trigger.card, current, false) && !player.inRange(current)); - if (targets.length) trigger.targets.addArray(targets); - }, - }, - after: { - audio: "olkenshang", - trigger: { player: "useCardAfter" }, - forced: true, - charlotte: true, - filter: function (event, player) { - if (event.card.name != "sha" || !event.card.storage || !event.card.storage.olkenshang) return false; - var num = 0; - game.countPlayer2(current => { - current.getHistory("damage", evt => { - if (evt.card == event.card) num += evt.num; - }); - }); - return num > 0; - }, - content: function () { - "step 0"; - var num = 0, - len = trigger.cards.length; - game.countPlayer2(current => { - current.getHistory("damage", evt => { - if (evt.card == trigger.card) num += evt.num; - }); - }); - if (len > num) { - player.draw(num); - event.finish(); - } else { - var skills = player.getSkills(null, false, false).filter(skill => { - var info = get.info(skill); - if (!info || info.charlotte || get.skillInfoTranslation(skill, player).length == 0) return false; - return true; - }); - if (skills.length == 1) event._result = { control: skills[0] }; - else - player - .chooseControl(skills) - .set( - "choiceList", - skills.map(i => { - return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; - }) - ) - .set("displayIndex", false) - .set("prompt", "垦伤:选择失去一个技能") - .set("ai", () => { - var choices = _status.event.controls.slice(); - var negs = choices.filter(i => { - var info = get.info(i); - if (!info || !info.ai) return false; - return info.ai.neg || info.ai.halfneg; - }); - if (negs.length) return negs.randomGet(); - if (choices.includes("mashu")) return "mashu"; - return choices.randomGet(); - }); - } - "step 1"; - player.removeSkills(result.control); - }, - }, - }, - }, - //董荼那 - oljianman: { - audio: 2, - trigger: { global: "phaseEnd" }, - forced: true, - direct: true, - filter: function (event, player) { - var history = game.getGlobalHistory("useCard", evt => { - return get.type(evt.card) == "basic"; - }); - if (history.length < 2) return false; - var users = history.slice(0, 2).map(i => i.player); - var list = users.filter(user => user == player); - if (list.length == 1) { - var target = users.filter(user => user != player)[0]; - return target && target.isIn() && target.countDiscardableCards(player, "he"); - } - if (list.length == 2) { - return history.slice(0, 2).some(evt => { - var card = evt.card; - return player.hasUseTarget({ - name: card.name, - nature: card.nature, - isCard: true, - }); - }); - } - return false; - }, - content: function () { - "step 0"; - var history = game.getGlobalHistory("useCard", evt => { - return get.type(evt.card) == "basic"; - }); - var list = history - .slice(0, 2) - .map(i => i.player) - .filter(user => user == player); - if (list.length == 1) { - var users = history.slice(0, 2).map(i => i.player); - var target = users.filter(user => user != player)[0]; - player.logSkill("oljianman", target); - player.discardPlayerCard(target, "he", true); - event.finish(); - } else if (list.length == 2) { - var evts = history.slice(0, 2); - var vcard = []; - for (var evt of evts) { - var card = evt.card; - if (vcard.length && vcard[0][2] == card.name && vcard[0][3] == card.nature) continue; - if (player.hasUseTarget({ name: card.name, nature: card.nature, isCard: true })) { - vcard.push(["基本", "", card.name, card.nature]); - } - } - if (vcard.length == 1) event._result = { bool: true, links: [vcard[0]] }; - else { - player.chooseButton(["鹣蛮:视为使用其中一张牌", [vcard, "vcard"]]).set("ai", function (button) { - return _status.event.player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }); - } - } else event.finish(); - "step 1"; - if (result.bool) { - var card = { name: result.links[0][2], nature: result.links[0][3], isCard: true }; - player - .chooseUseTarget(card, true) - .set("logSkill", "oljianman") - .set("prompt", "鹣蛮:选择" + get.translation(card) + "的目标"); - } - }, - }, - //张华 - olbihun: { - audio: 2, - trigger: { player: "useCardToPlayer" }, - forced: true, - filter: function (event, player) { - return event.isFirstTarget && player.countCards("h") > player.getHandcardLimit() && event.targets.some(target => target != player); - }, - //group:'olbihun_give', - content: function () { - if (trigger.targets.length == 1) { - var cards = trigger.cards.filterInD(); - if (cards.length) { - game.delayx(); - trigger.targets[0].gain(cards, "gain2"); - } - } - var targets = trigger.targets.filter(target => target != player); - trigger.targets.removeArray(targets); - trigger.getParent().triggeredTargets1.removeArray(targets); - }, - ai: { - threaten: 0.8, - halfneg: true, - effect: { - player: function (card, player, target) { - if ((!card.isCard || !card.cards) && get.itemtype(card) != "card") return; - let cs = 0; - if ( - target && - player != target && - player.countCards("h", i => { - if (card === i || (card.cards && card.cards.includes(i))) { - cs++; - return false; - } - return true; - }) > player.getHandcardLimit() - ) { - let targets = [], - evt = _status.event.getParent("useCard"); - targets.addArray(ui.selected.targets); - if (evt && evt.card == card) targets.addArray(evt.targets); - if (targets.length) { - if (targets.length > 1 || !targets.includes(target)) return "zeroplayertarget"; - return; - } - let info = get.info(card); - if (!info || info.notarget || !info.filterTarget) return; - let range, - select = get.copy(info.selectTarget), - filter; - if (select === undefined) range = [1, 1]; - else if (typeof select === "number") range = [select, select]; - else if (get.itemtype(select) === "select") range = select; - else if (typeof select === "function") range = select(card, player); - if (info.singleCard) range = [1, 1]; - game.checkMod(card, player, range, "selectTarget", player); - if (range[1] < -1) range = [1, 1]; - else if (range[0] < 0) { - if (info.filterTarget === true) filter = game.players.length; - else - filter = game.countPlayer(current => { - return info.filterTarget(card, player, current); - }); - range = [filter, filter]; - } - if (range && range[0] > 1 && range[1] > 1) return "zeroplayertarget"; - return [0, 0, 0, 1]; - } - }, - }, - }, - /*subSkill:{ - give:{ - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event._olbihun&&event._olbihun.isIn()&&event.cards.filterInD().length; - }, - forced:true, - popup:false, - content:function(){ - trigger._olbihun.gain(trigger.cards.filterInD(),'gain2'); - } - } - }*/ - }, - olchuanwu: { - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - forced: true, - filter: function (event, player) { - return player.getAttackRange() > 0; - }, - content: function () { - var skills = game.filterSkills(player.getStockSkills(true, true), player); - var num = Math.min(player.getAttackRange(), skills.length); - skills = skills.slice(0, num); - player.disableSkill("olchuanwu", skills); - player.addTempSkill("olchuanwu_restore"); - var str = ""; - for (var i of skills) { - str += "【" + get.translation(i) + "】、"; - player.popup(i); - } - str = str.slice(0, -1); - game.log(player, "的技能", "#g" + str, "失效了"); - player.draw(num); - }, - subSkill: { - restore: { - charlotte: true, - forced: true, - popup: false, - onremove: function (player) { - player.enableSkill("olchuanwu"); - game.log(player, "恢复了技能"); - }, - }, - }, - }, - oljianhe: { - audio: 2, - enable: "phaseUse", - filterTarget: function (card, player, target) { - return !player.getStorage("oljianhe_chosen").includes(target); - }, - filterCard: function (card, player) { - if (ui.selected.cards.length) { - var cardx = ui.selected.cards[0]; - if (get.type(cardx) == "equip") return get.type(card) == "equip"; - return get.name(card) == get.name(cardx); - } - var cards = player.getCards("he"); - for (var cardx of cards) { - if (card != cardx) { - if (get.type(cardx) == "equip" && get.type(card) == "equip") return true; - if (get.name(card) == get.name(cardx)) return true; - } - } - return false; - }, - selectCard: [2, Infinity], - position: "he", - complexCard: true, - discard: false, - visible: true, - prepare: "throw", - loseTo: "discardPile", - delay: 0.5, - check: function (card) { - if (get.type(card) == "equip") return 15 - get.value(card); - return 7 - get.value(card); - }, - content: function () { - "step 0"; - player.draw(cards.length); - player.addTempSkill("oljianhe_chosen", "phaseUseAfter"); - player.markAuto("oljianhe_chosen", [target]); - "step 1"; - var type = get.type2(cards[0]); - target - .chooseCard(get.translation(player) + "对你发动了【剑合】", "请重铸" + get.cnNumber(cards.length) + "张" + get.translation(type) + "牌,或点“取消”受到1点雷电伤害", cards.length, "he", (card, player) => { - return get.type2(card) == _status.event.type && player.canRecast(card); - }) - .set("ai", card => { - if (_status.event.goon) return (get.type(card) == "equip" ? 15 : 7) - get.value(card); - return 0; - }) - .set("type", type) - .set("goon", get.damageEffect(target, player, target, "thunder") < 0); - "step 2"; - if (result.bool) { - target.recast(result.cards); - } else { - target.damage(player, "thunder"); - } - "step 3"; - game.delayx(); - }, - ai: { - order: function (item, player) { - if (player.hasSkill("olbihun") && player.countCards("h") > player.getHandcardLimit()) return 11; - return 4; - }, - threaten: 2.4, - expose: 0.1, - result: { - target: function (player, target) { - var cards = ui.selected.cards, - type = get.type2(cards[0]); - if ( - target.countCards("he", card => { - return get.type(card) == type && get.value(card) <= 5; - }) >= cards.length - ) - return 1; - return -1; - }, - }, - }, - subSkill: { - chosen: { - charlotte: true, - onremove: true, - intro: { content: "本阶段已对$发动过技能" }, - }, - }, - }, - //屈晃 - olqiejian: { - audio: 2, - trigger: { - global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(current => { - if (current.countCards("h")) return false; - var evt = event.getl(current); - return evt && evt.hs && evt.hs.length && !player.getStorage("olqiejian_ban").includes(current); - }); - }, - content: function () { - "step 0"; - event.targets = game - .filterPlayer(current => { - if (current.countCards("h")) return false; - var evt = trigger.getl(current); - return evt && evt.hs && evt.hs.length && !player.getStorage("olqiejian_ban").includes(current); - }) - .sortBySeat(_status.currentPhase); - "step 1"; - var target = targets.shift(); - event.target = target; - if (target.isIn()) { - player - .chooseBool(get.prompt2("olqiejian", target)) - .set("ai", () => { - return _status.event.bool; - }) - .set( - "bool", - get.attitude(player, target) > 0 || - target.hasCard(card => { - return get.value(card, target) * get.sgnAttitude(player, target) < -6; - }, "ej") - ); - } else event.goto(5); - "step 2"; - if (result.bool) { - player.logSkill("olqiejian", target); - player.draw("nodelay"); - target.draw(); - } else event.goto(5); - "step 3"; - player - .chooseTarget("切谏:选择一名角色", "弃置你或其场上的一张牌;或点击“取消”令你于本轮不能再对其发动此技能", (card, player, target) => { - return (target == player || target == _status.event.getParent().target) && target.countDiscardableCards(player, "ej") > 0; - }) - .set("ai", target => { - var sign = get.sgnAttitude(_status.event.player, target); - return ( - 6 - - target - .getCards("ej") - .map(i => { - var val = 0; - if (get.position(i) == "e") val = get.value(i, target); - else { - val = get.effect( - player, - { - name: i.viewAs || i.name, - cards: [i], - }, - target, - target - ); - } - return sign * val; - }) - .sort((a, b) => a - b)[0] - ); - }); - "step 4"; - if (result.bool) { - var targetx = result.targets[0]; - player.discardPlayerCard(targetx, "ej", true); - } else { - player.addTempSkill("olqiejian_ban", "roundStart"); - player.markAuto("olqiejian_ban", [target]); - } - "step 5"; - if (targets.length) event.goto(1); - }, - subSkill: { - ban: { - onremove: true, - charlotte: true, - intro: { - content: "本轮不能再对$发动〖切谏〗", - }, - }, - }, - }, - olnishou: { - audio: 2, - trigger: { - player: "loseAfter", - global: ["loseAsyncAfter", "equipAfter"], - }, - forced: true, - filter: function (event, player) { - var phaseName; - for (var name of lib.phaseName) { - var evt = event.getParent(name); - if (!evt || evt.name != name) continue; - phaseName = name; - } - var cards = event.getd(player, "es"); - return ( - cards.length && - (cards.some(card => { - if (get.position(card, true) != "d") return false; - return player.hasUseTarget(get.autoViewAs({ name: "shandian" }, [card])); - }) || - (phaseName && !player.hasSkill("olnishou_swap"))) - ); - }, - direct: true, - content: function () { - "step 0"; - var cards = trigger.getd(player, "es"); - var choices = []; - var choiceList = ["将" + (cards.length ? get.translation(cards[0]) : "这些牌中第一张能当【闪电】对你使用的牌") + "当【闪电】使用", "本阶段结束时,你与一名手牌数最少的角色交换手牌"]; - cards = cards.filter(card => { - if (get.position(card, true) != "d") return false; - return player.hasUseTarget(get.autoViewAs({ name: "shandian" }, [card])); - }); - event.cards = cards; - var phaseName; - for (var name of lib.phaseName) { - var evt = trigger.getParent(name); - if (!evt || evt.name != name) continue; - phaseName = name; - } - if (cards.length) choices.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if (phaseName && !player.hasSkill("olnishou_swap")) choices.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - event.phaseName = phaseName; - if (!choices.length) event.finish(); - else - player - .chooseControl(choices) - .set("choiceList", choiceList) - .set("prompt", "泥首:选择一项") - .set("ai", () => 0); - "step 1"; - player.logSkill("olnishou"); - game.log(player, "选择了", "#y" + result.control); - if (result.control == "选项一") { - var card = cards[0]; - player.chooseUseTarget({ name: "shandian" }, [card], true); - } else { - var name = event.phaseName; - player.storage.olnishou_swap = name; - player.addTempSkill("olnishou_swap", name + "After"); - } - }, - ai: { - halfneg: true - }, - subSkill: { - swap: { - audio: "olnishou", - charlotte: true, - forced: true, - direct: true, - onremove: true, - trigger: { - global: ["phaseZhunbeiEnd", "phaseJudgeEnd", "phaseDrawEnd", "phaseUseEnd", "phaseDiscardEnd", "phaseJieshuEnd"], - }, - content: function () { - "step 0"; - if (trigger.name != player.storage.olnishou_swap || !event.player.isIn()) { - player.removeSkill("olnishou_swap"); - event.finish(); - return; - } - player.chooseTarget("泥首:与一名手牌数最少的角色交换手牌", true, (card, player, target) => { - return target.isMinHandcard(); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("olnishou_swap", target); - if (target != player) { - player.swapHandcards(target); - } - } - "step 2"; - player.removeSkill("olnishou_swap"); - }, - }, - }, - }, - //马承 - olchenglie: { - audio: 2, - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - return game.hasPlayer(function (current) { - return !event.targets.includes(current) && player.canUse(event.card, current); - }); - }, - direct: true, - shaRelated: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("olchenglie"), "为" + get.translation(trigger.card) + "多指定至多两个目标,并发动后续效果", [1, 2], (card, player, target) => { - var evt = _status.event.getTrigger(); - return !evt.targets.includes(target) && player.canUse(evt.card, target); - }) - .set("ai", function (target) { - var player = _status.event.player, - evt = _status.event.getTrigger(); - return get.effect(target, evt.card, player, player); - }); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else event.finish(); - "step 2"; - player.logSkill("olchenglie", targets); - trigger.targets.addArray(targets); - var targets = trigger.targets; - event.targets = targets; - event.given = []; - var cards = get.cards(targets.length); - event.cards = cards.slice(); - player.showCards(event.cards, get.translation(player) + "发动了【骋烈】"); - while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); - "step 3"; - game.updateRoundNumber(); - var hs = player.getCards("h"); - var next = player.chooseToMove("骋烈:是否交换一张牌?"); - next.set("list", [ - ["〖骋烈〗展示", event.cards, "olchenglie"], - ["你的手牌", hs], - ]); - next.set("filterMove", function (from, to, moved) { - if (typeof to == "number") return false; - var player = _status.event.player; - var hs = player.getCards("h"); - var changed = hs.filter(function (card) { - return !moved[1].includes(card); - }); - var changed2 = moved[1].filter(function (card) { - return !hs.includes(card); - }); - if (changed.length < 1) return true; - var pos1 = moved[0].includes(from.link) ? 0 : 1, - pos2 = moved[0].includes(to.link) ? 0 : 1; - if (pos1 == pos2) return true; - if (pos1 == 0) { - if (changed.includes(from.link)) return true; - return changed2.includes(to.link); - } - if (changed2.includes(from.link)) return true; - return changed.includes(to.link); - }); - next.set("processAI", function (list) { - var cards1 = list[0][1].slice(), - cards2 = list[1][1].slice(); - var card1 = cards1.sort((a, b) => get.value(b) - get.value(a))[0]; - var card2 = cards2.sort((a, b) => get.value(a) - get.value(b))[0]; - if (card1 && card2 && get.value(card1) > get.value(card2)) { - cards1.remove(card1); - cards2.remove(card2); - cards1.push(card2); - cards2.push(card1); - } - return [cards1, cards2]; - }); - "step 4"; - var moved = result.moved; - var hs = player.getCards("h"), - ts = event.cards; - var card1, card2; - for (var i of moved[0]) { - if (!ts.includes(i)) card1 = i; - } - for (var i of moved[1]) { - if (!hs.includes(i)) card2 = i; - } - if (card1 && card2) { - player.$throw(1, 1000); - event.cards.forEach((i, ind, arr) => { - if (i == card2) arr[ind] = card1; - }); - player - .lose(card1, ui.cardPile) - .set("insert_index", event => event.cardx) - .set("cardx", card2); - player.gain(card2, "draw"); - game.log(player, "交换了一张牌"); - } - "step 5"; - game.cardsGotoOrdering(event.cards); - "step 6"; - if (event.cards.length == 1) event._result = { bool: true, links: event.cards }; - else player.chooseButton(["骋烈:将这些牌置于目标角色的武将牌上", event.cards], true); - game.updateRoundNumber(); - "step 7"; - if (result.bool) { - var card = result.links[0]; - event.card = card; - player - .chooseTarget("将" + get.translation(card) + "置于一名目标角色的武将牌上", true, (card, player, target) => { - return _status.event.getTrigger().targets.includes(target) && !_status.event.getParent().given.includes(target); - }) - .set("ai", target => { - var color = _status.event.color, - player = _status.event.player; - var evt = _status.event.getTrigger(); - if (color == "red") { - var eff = get.effect(target, evt.card, player, target), - att = get.attitude(player, target); - if (eff >= 0 && att < 0) return -1; - if (eff < 0 && att < 0 && target.hasCard(card => ["shan", "caochuan"].includes(get.name(card)), "hs")) return 10; - } - return 1; - }) - .set("color", get.color(card)); - } else event.finish(); - "step 8"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - event.given.push(target); - target.addToExpansion(card).gaintag.add("olchenglie"); - player.addTempSkill("olchenglie_effect", "phaseUseAfter"); - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.olchenglie = player; - target.storage.olchenglie_viewer = player; - event.cards.remove(card); - var cardx = player == game.me || player.isUnderControl() ? card : 1; - player.$give(cardx, target, false); - } else event.finish(); - "step 9"; - if (event.cards.length) event.goto(6); - else if (!event.isMine() && !event.isOnline()) game.delayx(); - }, - marktext: "骋", - intro: { - markcount: "expansion", - mark: function (dialog, content, player) { - var content = player.getExpansions("olchenglie"); - if (content && content.length) { - if (game.me == player.storage.olchenglie_viewer) { - dialog.addAuto(content); - } else { - return "有" + get.cnNumber(content.length) + "张扣置的“骋烈”牌"; - } - } - }, - content: function (content, player) { - var content = player.getExpansions("olchenglie"); - if (content && content.length) { - if (game.me == player.storage.olchenglie_viewer) { - return get.translation(content); - } - return "有" + get.cnNumber(content.length) + "张扣置的“骋烈”牌"; - } - }, - }, - subSkill: { - effect: { - trigger: { global: "useCardAfter" }, - forced: true, - charlotte: true, - forceDie: true, - popup: false, - filter: function (event, player) { - return event.card.storage && event.card.storage.olchenglie; - }, - content: function () { - "step 0"; - var targets = game - .filterPlayer(current => { - var cards = current.getExpansions("olchenglie"); - return cards.some(i => get.color(i, false) == "red"); - }) - .sortBySeat(); - event.targets = targets; - var togive = trigger.card.storage.olchenglie; - event.togive = togive; - if (!targets.length || !togive.isIn()) event.goto(3); - "step 1"; - var target = event.targets.shift(); - event.target = target; - player.line(target); - if ( - target.hasHistory("useCard", evt => { - return evt.respondTo && evt.respondTo[1] == trigger.card; - }) - ) { - if (target.countCards("he")) target.chooseCard("骋烈:交给" + get.translation(event.togive) + "一张牌", true, "he"); - } else { - target.recover(); - } - "step 2"; - if (result.bool) { - target.give(result.cards, event.togive); - } - if (targets.length) event.goto(1); - "step 3"; - game.filterPlayer(current => { - var cards = current.getExpansions("olchenglie"); - return cards.length; - }).forEach(i => { - i.loseToDiscardpile(i.getExpansions("olchenglie")); - delete i.storage.olchenglie_viewer; - }); - }, - }, - }, - }, - //新贺齐 - olqizhou: { - audio: "qizhou", - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter", "phaseBefore"], - }, - forced: true, - onremove: true, - filter: function (event, player) { - if (event.name != "phase" && (event.name != "equip" || event.player != player)) { - var evt = event.getl(player); - if (!evt || !evt.es || !evt.es.length) return false; - } - var num = player.countMark("olqizhou"); - return lib.skill.olqizhou.getSuitNum(player) != num; - }, - content: function () { - lib.skill.olqizhou.applyChange(player); - }, - getSuitNum: function (player) { - var suits = [], - es = player.getCards("e"); - for (var i of es) suits.add(get.suit(i, player)); - return Math.min(4, suits.length); - }, - applyChange: function (player) { - player.removeAdditionalSkill("olqizhou"); - var num = lib.skill.olqizhou.getSuitNum(player); - player.storage.olqizhou = num; - if (num > 0) player.addAdditionalSkill("olqizhou", lib.skill.olqizhou.derivation.slice(0, num)); - }, - derivation: ["reduanbing", "reyingzi", "fenwei", "lanjiang"], - }, - olshanxi: { - audio: "shanxi", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("e") < 5 && game.hasPlayer(current => lib.skill.olshanxi.filterTarget(null, player, current)); - }, - filterTarget: function (card, player, target) { - return target != player && player.countCards("h") + target.countCards("h") > 0 && !player.inRangeOf(target); - }, - content: function () { - "step 0"; - var cards1 = player.getCards("h"), - cards2 = target.getCards("h"); - var num = 5 - player.countCards("e"); - var dialog = ["闪袭:选择展示至多" + get.cnNumber(num) + "张牌"]; - if (cards1.length > 0) { - dialog.push('
    你的手牌
    '); - dialog.push(cards1); - } - if (cards2.length > 0) { - dialog.push('
    ' + get.translation(target) + "的手牌
    "); - if (player.hasSkillTag("viewHandcard", null, target, true)) dialog.push(cards2); - else dialog.push([cards2.randomSort(), "blank"]); - } - player.chooseButton(dialog, [1, num], true).set("ai", function (button) { - var player = _status.event.player, - target = _status.event.getParent().target; - var card = button.link, - cards = ui.selected.buttons.map(button => button.link); - var hs = player.getCards("h"), - discard = false; - for (var i of cards) { - if (hs.includes(i)) { - discard = true; - break; - } - } - if (hs.includes(card)) { - if (discard || get.name(card) != "shan") return 0; - if (target.hasCard(card => get.value(card, target) > 5, "e")) return 2; - return 0; - } - if ( - discard && - !target.hasCard(function (cardx) { - return cardx != card && !cards.includes(cardx) && get.value(cardx, target) > 0; - }, "he") - ) - return 0; - return 1 + Math.random(); - }); - "step 1"; - if (result.bool) { - event.cards = result.links; - var list1 = [], - list2 = []; - var hs = player.getCards("h"); - for (var card of result.links) { - if (hs.includes(card)) { - list1.push(card); - } else { - list2.push(card); - } - } - event.list1 = list1; - event.list2 = list2; - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (player, target, list1, list2, id) { - var dialog = ui.create.dialog(player + "对" + target + "发动了【闪袭】"); - dialog.videoId = id; - if (list1.length > 0) { - dialog.add('
    ' + player + "展示的牌
    "); - dialog.add(list1); - } - if (list2.length > 0) { - dialog.add('
    ' + target + "被展示的牌
    "); - dialog.add(list2); - } - }, - get.translation(player), - get.translation(target), - list1, - list2, - event.videoId - ); - game.delay(4); - } else event.finish(); - "step 2"; - game.broadcastAll("closeDialog", event.videoId); - var list1 = event.list1.filter(card => get.name(card, player) == "shan"); - var list2 = event.list2.filter(card => get.name(card, target) == "shan"); - if (list1.length && list2.length) { - game.loseAsync({ - lose_list: [ - [player, list1], - [target, list2], - ], - discarder: player, - }).setContent("discardMultiple"); - } else if (list2.length) { - target.discard(list2); - } else if (list1.length) player.discard(list1); - else event.finish(); - "step 3"; - if ( - target.hasCard(function (card) { - return !cards.includes(card) && lib.filter.canBeGained(card, player, target); - }, "he") - ) - player - .gainPlayerCard(target, true, "he") - .set("filterButton", function (button) { - return !_status.event.cards.includes(button.link); - }) - .set("cards", cards); - }, - ai: { - order: 14, - result: { - target: function (player, target) { - return -target.countCards("h"); - }, - }, - }, - }, - //刘巴 - oltongduo: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("oltongduo"), function (card, player, target) { - return target != player && target.countCards("h") > 0; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 0) return Math.sqrt(att) / 10; - return 5 - att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("oltongduo", target); - target.chooseCard("h", true, "统度:将一张手牌交给" + get.translation(player) + ",然后其于此阶段结束时将此牌置于牌堆顶"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.addTempSkill("oltongduo_put"); - event.target.give(result.cards, player, true).gaintag.add("oltongduo"); - } - }, - subSkill: { - put: { - trigger: { player: "phaseUseEnd" }, - charlotte: true, - forced: true, - filter: function (event, player) { - return player.hasCard(card => card.hasGaintag("oltongduo"), "h"); - }, - content: function () { - var cards = player.getCards("h", card => card.hasGaintag("oltongduo")); - player.lose(cards, ui.cardPile, "insert"); - game.log(player, "将", get.cnNumber(cards.length) + "张牌", "置于牌堆顶"); - game.broadcastAll(function (player) { - var cardx = ui.create.card(); - cardx.classList.add("infohidden"); - cardx.classList.add("infoflip"); - player.$throw(cardx, 1000, "nobroadcast"); - }, player); - }, - onremove: function (player) { - player.removeGaintag("oltongduo"); - }, - }, - }, - }, - olzhubi: { - audio: 2, - enable: "phaseUse", - group: "olzhubi_replace", - filter: function (event, player) { - return (player.getStat("skill").olzhubi || 0) < player.maxHp; - }, - filterTarget: function (card, player, target) { - return target.countCards("he") > 0; - }, - content: function () { - "step 0"; - target.chooseCard("he", true, "铸币:请重铸一张牌", lib.filter.cardRecastable); - "step 1"; - if (result.bool) { - target.recast(result.cards, null, player => (player.draw().set("log", false).gaintag = ["olzhubi_tag"])); - } - }, - ai: { - order: 6, - result: { - target: function (player, target) { - if (target.hasCard(card => card.hasGaintag("olzhubi_tag"), "h")) return 0.5; - return 1; - }, - }, - }, - subSkill: { - replace: { - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return event.player.hasCard(card => card.hasGaintag("olzhubi_tag"), "h"); - }, - forced: true, - locked: false, - logTarget: "player", - content: function () { - "step 0"; - var cards = get.bottomCards(5); - event.cards2 = cards; - game.cardsGotoOrdering(cards); - var player = trigger.player; - var next = player.chooseToMove("铸币:用任意“币”交换牌堆底等量张牌"); - var hs = player.getCards("h", card => card.hasGaintag("olzhubi_tag")); - next.set("filterMove", function (from, to) { - return typeof to != "number"; - }); - next.set("list", [ - ["牌堆底", cards], - ["你的手牌", hs, "olzhubi_tag"], - ]); - next.set("processAI", function (list) { - var all = list[0][1].concat(list[1][1]), - cards = all.slice(0); - var num = _status.event.num; - cards.sort(function (a, b) { - return get.value(b) - get.value(a); - }); - return [cards.slice(num), cards.slice(0, num)]; - }); - next.set("num", hs.length); - "step 1"; - if (result.bool) { - event.forceDie = true; - var cards = result.moved[0]; - event.cards = cards; - var player = trigger.player; - var hs = player.getCards("h"); - var lose = [], - gain = event.cards2; - for (var i of cards) { - if (hs.includes(i)) lose.push(i); - else gain.remove(i); - } - if (lose.length) player.lose(lose, ui.cardPile); - if (gain.length) player.gain(gain, "draw"); - } else event.finish(); - "step 2"; - for (var i of cards) { - if (!"hejsdx".includes(get.position(i, true))) { - i.fix(); - ui.cardPile.appendChild(i); - } - } - game.updateRoundNumber(); - }, - }, - }, - }, - //傅肜 - olxiaosi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.countCards("h") > 0 && player != target; - }, - filterCard: function (card, player, target) { - return get.type(card) == "basic"; - }, - check: function (card) { - var player = _status.event.player; - if (player.hasValueTarget(card)) return 10 - get.value(card); - return 0.1; - }, - content: function () { - "step 0"; - if ( - target.countCards("h", card => { - return get.type(card) == "basic" && lib.filter.cardDiscardable(card, target, "olxiaosi"); - }) == 0 - ) - event.draw = true; - else { - target.chooseToDiscard("h", true, "效死:弃置一张基本牌", { type: "basic" }); - } - "step 1"; - var cards2 = cards.slice(0); - if (result.bool) { - cards2 = cards2.addArray(result.cards); - } - event.cards2 = cards2; - "step 2"; - var cardsx = event.cards2.filter(i => get.position(i, true) == "d" && player.hasUseTarget(i, false)); - if (!cardsx.length) event.goto(5); - else - player - .chooseButton(["效死:是否使用其中的一张牌?", cardsx]) - .set("filterButton", button => { - return _status.event.player.hasUseTarget(button.link, false); - }) - .set("ai", button => { - if (button.link.name == "jiu") return 10; - return _status.event.player.getUseValue(button.link); - }); - "step 3"; - if (result.bool) { - var card = result.links[0]; - event.cards2.remove(card); - player.$gain2(card, false); - game.delayx(); - player.chooseUseTarget(true, card, false, "nodistance"); - } else event.goto(5); - "step 4"; - if (event.cards2.filter(i => get.position(i, true) == "d" && player.hasUseTarget(i, false)).length) event.goto(2); - "step 5"; - if (event.draw) player.draw(); - }, - ai: { - order: 4.5, - result: { - player: 1, - target: -1, - }, - }, - }, - //阿会喃 - jueman: { - audio: 2, - trigger: { global: "phaseEnd" }, - forced: true, - direct: true, - filter: function (event, player) { - var history = game.getGlobalHistory("useCard", evt => { - return get.type(evt.card) == "basic"; - }); - if (history.length < 2) return false; - var users = history.slice(0, 2).map(i => i.player); - var list = users.filter(user => user == player); - if (list.length == 1) return true; - if (list.length == 0) { - var evtx = history[2]; - if (evtx) { - var name = evtx.card.name, - nature = evtx.card.nature; - if (evtx && player.hasUseTarget({ name: name, nature: nature, isCard: true })) return true; - } - } - return false; - }, - content: function () { - "step 0"; - var history = game.getGlobalHistory("useCard", evt => { - return get.type(evt.card) == "basic"; - }); - var list = history - .slice(0, 2) - .map(i => i.player) - .filter(user => user == player); - if (list.length == 1) { - player.logSkill("jueman"); - player.draw(); - } else if (list.length == 0) { - var evtx = history[2], - name = evtx.card.name, - nature = evtx.card.nature; - player.chooseUseTarget({ name: name, nature: nature, isCard: true }, true).set("logSkill", "jueman"); - } - }, - }, - //张芝 - olbixin: { - audio: 2, - trigger: { - global: ["phaseZhunbeiBegin", "phaseJieshuBegin"], - }, - direct: true, - onremove: ["olbixin", "olbixin_basic", "olbixin_trick", "olbixin_equip"], - group: "olbixin_full", - map: { 基本: "basic", 锦囊: "trick", 装备: "equip" }, - filter: function (event, player) { - var count = player.countMark("olbixin"); - if (count > 0 && event.player != player) return false; - if (count > 1 && event.name == "phaseZhunbei") return false; - if (count > 2) return false; - var num = count >= 3 ? 3 : 1; - var types = ["basic", "trick", "equip"].filter(type => { - return player.countMark("olbixin_" + type) < num; - }); - if (!types.length) return false; - return lib.skill.olbixin.getList(player).length > 0; - }, - getList: function (player, event) { - var natures = lib.inpile_nature.slice(0), - used = []; - var history = player.actionHistory; - for (var i = history.length - 1; i >= 0; i--) { - var info = history[i]; - for (var evt of info.useCard) { - var name = evt.card.name; - if (get.type(name) != "basic") continue; - if (name == "sha") { - if (evt.card.nature) natures.remove(evt.card.nature); - else used.push(name); - } else used.push(name); - } - if (info.isRound) break; - } - var vcards = []; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - if (!event) { - if (name == "sha") { - if (!used.includes("sha") && player.hasUseTarget({ name: "sha" })) vcards.push(["基本", "", "sha"]); - for (var nature of natures) { - if (player.hasUseTarget({ name: "sha", nature: nature })) vcards.push(["基本", "", "sha", nature]); - } - } else if (!used.includes(name) && player.hasUseTarget({ name: name })) vcards.push(["基本", "", name]); - } else { - if (name == "sha") { - if (!used.includes("sha") && event.filterCard({ name: "sha" }, player, event)) vcards.push(["基本", "", "sha"]); - for (var nature of natures) { - if (event.filterCard({ name: "sha", nature: nature }, player, event)) vcards.push(["基本", "", "sha", nature]); - } - } else if (!used.includes(name) && event.filterCard({ name: name }, player, event)) vcards.push(["基本", "", name]); - } - } - return vcards; - }, - content: function () { - "step 0"; - var types = ["basic", "trick", "equip"]; - var list = lib.skill.olbixin.getList(player); - if (list.length) { - var dialog = ["###" + get.prompt("olbixin") + '###
    摸' + get.cnNumber(player.countMark("olbixin") >= 3 ? 1 : 3) + "张牌,然后将所有指定类型的手牌当一张基本牌使用
    "]; - dialog.push([types.map(i => get.translation(i)), "tdnodes"]); - dialog.push([list, "vcard"]); - player - .chooseButton(dialog, 2) - .set("filterButton", button => { - var player = _status.event.player, - count = player.countMark("olbixin"), - num = count >= 3 ? 3 : 1; - var type = typeof button.link; - if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) return false; - if (type == "string" && player.countMark("olbixin_" + lib.skill.olbixin.map[button.link]) >= num) return false; - if (type != "string" && !player.hasUseTarget({ name: button.link[2], nature: button.link[3] })) return false; - return true; - }) - .set("ai", button => { - var list = _status.event.list; - var type = typeof button.link; - if (type == "string") return (1.2 - list.indexOf(lib.skill.olbixin.map[button.link])) * 10; - return _status.event.player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }) - .set( - "list", - types - .map(i => [ - i, - player - .getCards("h", { type: i }) - .map(i => get.value(i)) - .reduce((p, c) => p + c, 0), - ]) - .sort((a, b) => a[1] - b[1]) - .map(i => i[0]) - ); - } else event.finish(); - "step 1"; - if (result.bool) { - if (typeof result.links[0] != "string") result.links.reverse(); - var type = result.links[0], - name = result.links[1][2], - nature = result.links[1][3]; - player.logSkill("olbixin"); - game.log(player, "声明了", type + "牌"); - type = lib.skill.olbixin.map[type]; - event.type = type; - event.card = { name: name, nature: nature }; - player.addMark("olbixin_" + type, 1, false); - player.draw(player.countMark("olbixin") >= 3 ? 1 : 3); - game.delayx(); - } else event.finish(); - "step 2"; - if (player.hasCard(card => get.type2(card) == event.type, "h")) { - var cards = player.getCards("h", card => get.type2(card) == event.type); - var cardx = get.autoViewAs(card, cards); - if (player.hasUseTarget(cardx, true, false)) { - player.chooseUseTarget(cardx, cards, true, false).set("prompt", "选择" + get.translation(cardx) + "(" + get.translation(cards) + ")的目标"); - } - } - }, - subSkill: { - full: { - enable: "chooseToUse", - filter: function (event, player) { - if (event.olbixin) return false; - var count = player.countMark("olbixin"); - if (count <= 2) return false; - var num = count >= 3 ? 3 : 1; - var types = ["basic", "trick", "equip"].filter(type => { - return player.countMark("olbixin_" + type) < num; - }); - if (!types.length) return false; - return lib.skill.olbixin.getList(player, event).length > 0; - }, - prompt: "你可以声明一种牌的类型(每种类型限三次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸一张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。", - chooseButton: { - dialog: function (event, player) { - var list = lib.skill.olbixin.getList(player, event); - var types = ["basic", "trick", "equip"]; - return ui.create.dialog('###笔心###
    摸一张牌,然后将所有指定类型的手牌当一张基本牌使用
    ', [types.map(i => get.translation(i)), "tdnodes"], [list, "vcard"]); - }, - filter: function (button, player) { - var player = _status.event.player, - count = player.countMark("olbixin"), - num = count >= 3 ? 3 : 1; - var type = typeof button.link; - if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) return false; - if (type == "string" && player.countMark("olbixin_" + lib.skill.olbixin.map[button.link]) >= num) return false; - if (type != "string" && !_status.event.getParent().filterCard({ name: button.link[2], nature: button.link[3] }, player, _status.event.getParent())) return false; - return true; - }, - select: 2, - check: function (button) { - var types = ["basic", "trick", "equip"]; - var type = typeof button.link; - var player = _status.event.player; - var list = types - .map(i => [ - i, - player - .getCards("h", { type: i }) - .map(i => get.value(i)) - .reduce((p, c) => p + c, 0), - ]) - .sort((a, b) => a[1] - b[1]) - .map(i => i[0]); - if (type == "string") return (1.2 - list.indexOf(button.link) + Math.sqrt(3 - player.countMark("olbixin_" + lib.skill.olbixin.map[button.link]))) * 10; - if (_status.event.getParent().type != "phase") return 1; - return player.getUseValue({ name: button.link[2], nature: button.link[3] }); - }, - backup: function (links, player) { - if (typeof links[0] != "string") links.reverse(); - return { - popname: true, - position: "h", - filterCard: () => false, - selectCard: -1, - type: lib.skill.olbixin.map[links[0]], - viewAs: { name: links[1][2], nature: links[1][3] }, - precontent: function () { - "step 0"; - player.logSkill("olbixin"); - var type = lib.skill.olbixin_full_backup.type; - game.log(player, "声明了", type, "牌"); - delete event.result.skill; - player.addMark("olbixin_" + type, 1, false); - player.draw(player.countMark("olbixin") >= 3 ? 1 : 3); - "step 1"; - var cards = player.getCards("h", card => get.type2(card) == lib.skill.olbixin_full_backup.type); - var cardsx = cards.filter(i => game.checkMod(i, player, "unchanged", "cardEnabled2", player) !== false); - if (cardsx.length && cardsx.length == cards.length) { - event.result.cards = cards; - game.delayx(); - } else { - event.cancel(); - // event.getParent().set('olbixin',true); - event.getParent().goto(0); - delete event.getParent().openskilldialog; - } - }, - }; - }, - prompt: function (links, player) { - return "摸一张牌,然后将所有" + get.translation(links[0]) + "牌当做" + (get.translation(links[1][3]) || "") + get.translation(links[1][2]) + "使用"; - }, - }, - hiddenCard: function (player, name) { - var count = player.countMark("olbixin"); - if (!lib.inpile.includes(name) || get.type(name) != "basic" || count < 3) return false; - var types = ["basic", "trick", "equip"].filter(type => { - return player.countMark("olbixin_" + type) < 3; - }); - return types.length; - }, - ai: { - fireAttack: true, - respondSha: true, - respondShan: true, - skillTagFilter: function (player) { - var count = player.countMark("olbixin"); - if (count < 3) return; - var types = ["basic", "trick", "equip"].filter(type => { - return player.countMark("olbixin_" + type) < 3; - }); - if (types.length) return true; - }, - order: 1, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - }, - full_backup: {}, - }, - }, - olximo: { - audio: 3, - trigger: { player: "logSkill" }, - derivation: "olfeibai", - filter: function (event, player) { - return event.skill == "olbixin" && player.countMark("olbixin") < 3; - }, - forced: true, - content: function () { - player.addMark("olbixin", 1, false); - game.log(player, "删除了", "#g【笔心】", "描述的前五个字符"); - if (player.countMark("olbixin") == 3) { - game.log(player, "交换了", "#g【笔心】", "方括号中的两个数字"); - //player.removeSkill('olximo'); - //game.log(player,'失去了技能','#g【洗墨】'); - player.changeSkills(["olfeibai"], ["olximo"]); - } - }, - ai: { - combo: "olbixin", - }, - }, - olfeibai: { - audio: 2, - trigger: { - source: "damageBegin1", - player: "recoverBegin", - }, - filter: function (event, player) { - var storage = player.storage.olfeibai; - var evt = event.getParent(), - card = event.card; - if (evt.player != player || !card) return false; - if (storage && event.name == "recover") { - return get.color(card) != "red"; - } - if (!storage && event.name == "damage") { - return get.color(card) != "black"; - } - return false; - }, - content: function () { - player.changeZhuanhuanji("olfeibai"); - trigger.num++; - }, - zhuanhuanji: true, - forced: true, - mark: true, - marktext: "☯", - intro: { - content: function (storage, player) { - if (storage) return "转换技。当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。"; - return "转换技。当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1。"; - }, - }, - }, - //新诸葛瑾 - olhuanshi: { - audio: "huanshi", - trigger: { global: "judge" }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - logTarget: "player", - prompt2: function (event, player) { - var str = get.translation(event.player) + "的" + event.judgestr + "判定为" + get.translation(event.player.judging[0]) + "。你可以令其观看你的牌,其选择一张牌进行改判。"; - if (!player.hasSkill("olhuanshi_mark", null, null, false)) str += "然后你可以重铸任意张牌。"; - return str; - }, - check: function (event, player) { - if (get.attitude(player, event.player) <= 0) return false; - var cards = player.getCards("he"); - var judge = event.judge(event.player.judging[0]); - for (var i = 0; i < cards.length; i++) { - var judge2 = event.judge(cards[i]); - if (judge2 > judge) return true; - if (_status.currentPhase != player && judge2 == judge && get.color(cards[i]) == "red" && get.useful(cards[i]) < 5) return true; - } - return false; - }, - content: function () { - "step 0"; - var target = trigger.player; - var judge = trigger.judge(target.judging[0]); - var attitude = get.attitude(target, player); - target - .choosePlayerCard("请选择代替判定的牌", "he", "visible", true, player) - .set("ai", function (button) { - var card = button.link; - var judge = _status.event.judge; - var attitude = _status.event.attitude; - var result = trigger.judge(card) - judge; - var player = _status.event.player; - if (result > 0) { - return 20 + result; - } - if (result == 0) { - if (_status.currentPhase == player) return 0; - if (attitude >= 0) { - return get.color(card) == "red" ? 7 : 0 - get.value(card); - } else { - return get.color(card) == "black" ? 10 : 0 + get.value(card); - } - } - if (attitude >= 0) { - return get.color(card) == "red" ? 0 : -10 + result; - } else { - return get.color(card) == "black" ? 0 : -10 + result; - } - }) - .set("filterButton", function (button) { - var player = _status.event.target; - var card = button.link; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - }) - .set("judge", judge) - .set("attitude", attitude); - "step 1"; - if (result.bool) { - event.card = result.links[0]; - player.respond(event.card, "highlight", "noOrdering").nopopup = true; - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = event.card; - trigger.orderingCards.add(event.card); - game.log(trigger.player, "的判定牌改为", event.card); - game.delay(2); - } - if (!player.countCards("h") || player.hasSkill("olhuanshi_mark", null, null, false)) event.finish(); - "step 3"; - player.chooseCard("是否重铸任意张手牌?", "操作提示:选择要重铸的牌并点击“确定”", [1, player.countCards("h")], lib.filter.cardRecastable).set("ai", function (card) { - var player = _status.event.player, - cards = ui.selected.cards; - if (!player.hasSkill("olmingzhe")) return 5 - get.value(card); - for (var i of cards) { - if (get.color(i, player) == "red") return 5 - get.value(card); - } - return 7.5 - get.value(card); - }); - "step 4"; - if (result.bool) { - player.addTempSkill("olhuanshi_mark"); - player.recast(result.cards); - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - subSkill: { mark: { charlotte: true } }, - }, - olhongyuan: { - audio: "hongyuan", - trigger: { player: "gainAfter", global: "loseAsyncAfter" }, - filter(event, player) { - if (!player.countCards("he") || player.hasSkill("olhongyuan_blocker", null, null, false)) return false; - return event.getg(player).length >= 2; - }, - async content(event, trigger, player) { - player.addTempSkill("olhongyuan_blocker", ["phaseZhunbeiBefore", "phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore", "phaseJieshuBefore", "phaseBefore"]); - let selectedTargets = []; - while ( - selectedTargets.length < 2 && - player.countCards("he") && - game.hasPlayer(target => { - return target != player && !selectedTargets.includes(target); - }) - ) { - const { - result: { bool, targets, cards }, - } = await player - .chooseCardTarget({ - prompt: "弘援:将一张牌交给一名其他角色", - filterCard: true, - position: "he", - filterTarget(card, player, target) { - return target != player && !get.event("selectedTargets").includes(target); - }, - complexCard: true, - complexTarget: true, - complexSelect: true, - ai1(card) { - const player = get.event("player"); - if ( - !game.hasPlayer(current => { - if (get.event("selectedTargets").includes(current)) return false; - return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); - }) - ) - return -get.value(card); - return 4 + (player.hasSkill("olmingzhe") && get.color(card) == "red" ? 2 : 0) - Math.max(player.getUseValue(card), get.value(card, player)); - }, - ai2(target) { - const player = _status.event.player, - att = get.attitude(player, target); - if (!ui.selected.cards.length) return att; - const card = ui.selected.cards[0], - val = get.value(card, target); - if (val < 0) return -att * Math.sqrt(-val); - return att * Math.sqrt(val + 2); - }, - }) - .set("selectedTargets", selectedTargets); - if (bool) { - const target = targets[0]; - selectedTargets.push(target); - player.line(target); - await player.give(cards, target); - } else break; - } - }, - ai: { threaten: 0.8 }, - subSkill: { blocker: { charlotte: true } }, - }, - olmingzhe: { - audio: "mingzhe", - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - forced: true, - filter: function (event, player) { - if (player.isPhaseUsing()) return false; - var evt = event.getl(player); - for (var i of evt.cards2) { - if (get.color(i, player) == "red") return true; - } - return false; - }, - content: function () { - if (!trigger.visible) { - var cards = trigger.getl(player).hs.filter(function (i) { - return get.color(i, player) == "red"; - }); - if (cards.length > 0) player.showCards(cards, get.translation(player) + "发动了【明哲】"); - } - player.draw(); - }, - }, - //吕范 - xindiaodu: { - audio: "diaodu", - group: "xindiaodu_use", - frequent: true, - preHidden: true, - isFriendOf: function (player, target) { - if (get.mode() == "guozhan") return player.isFriendOf(target); - return player.group == target.group; - }, - subSkill: { - temp: { charlotte: true }, - use: { - trigger: { - global: "useCard", - }, - filter: function (event, player) { - return get.type(event.card) == "equip" && event.player.isIn() && lib.skill.xindiaodu.isFriendOf(player, event.player) && (player == event.player || player.hasSkill("xindiaodu")) && !event.player.hasSkill("xindiaodu_temp"); - }, - direct: true, - content: function () { - "step 0"; - var next = trigger.player.chooseBool("是否发动【调度】摸一张牌?"); - if (player.hasSkill("xindiaodu")) next.set("frequentSkill", "xindiaodu"); - if (player == trigger.player) next.setHiddenSkill("xindiaodu"); - "step 1"; - if (result.bool) { - player.logSkill("xindiaodu", trigger.player); - trigger.player.draw("nodelay"); - trigger.player.addTempSkill("xindiaodu_temp"); - } - }, - }, - }, - trigger: { - player: "phaseUseBegin", - }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return lib.skill.xindiaodu.isFriendOf(current, player) && current.countGainableCards(player, "e") > 0; - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("xindiaodu"), function (card, player, current) { - return lib.skill.xindiaodu.isFriendOf(current, player) && current.countGainableCards(player, "e") > 0; - }) - .setHiddenSkill(event.name).ai = function (target) { - var num = 1; - if (target.hasSkill("gzxiaoji")) num += 2.5; - if (target.isDamaged() && target.getEquip("baiyin")) num += 2.5; - if (target.hasSkill("xuanlve")) num += 2; - return num; - }; - "step 1"; - if (result.bool) { - event.target1 = result.targets[0]; - player.logSkill("xindiaodu", event.target1); - player.line(event.target1, "xindiaodu"); - player.gainPlayerCard(event.target1, "e", true); - } else event.finish(); - "step 2"; - if (result.bool && player.getCards("h").includes(result.cards[0])) { - event.card = result.cards[0]; - player - .chooseTarget("是否将" + get.translation(event.card) + "交给一名其他角色?", function (card, player, current) { - return current != player && current != _status.event.target1 && lib.skill.xindiaodu.isFriendOf(current, player); - }) - .set("target1", event.target1); - } else event.finish(); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - player.give(card, target); - } - }, - }, - //夏侯玄 - olhuanfu: { - audio: 2, - trigger: { - player: "useCardToPlayered", - target: "useCardToTargeted", - }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - if (player == event.player && !event.isFirstTarget) return false; - if (event.olhuanfu_map && event.olhuanfu_map[player.playerid]) return false; - return player.maxHp > 0 && player.countCards("he") > 0; - }, - shaRelated: true, - direct: true, - content: function () { - "step 0"; - player - .chooseToDiscard("he", [1, player.maxHp], get.prompt("olhuanfu"), "通过弃牌,预测" + (player == trigger.player ? "你" : get.translation(trigger.player)) + "使用的" + get.translation(trigger.card) + "能造成多少伤害。如果弃置的牌数等于总伤害,则你摸两倍的牌。") - .set( - "predict", - (function () { - var target = trigger.target; - if (player == target) { - if (trigger.targets.length > 1 || player.hasShan() || get.effect(player, trigger.card, trigger.player, player) == 0) return 0; - } else { - var target = trigger.target; - if ( - trigger.targets.length > 1 || - target.mayHaveShan( - player, - "use", - target.getCards("h", i => { - return i.hasGaintag("sha_notshan"); - }) - ) - ) - return 0; - } - var num = trigger.getParent().baseDamage; - var map = trigger.getParent().customArgs, - id = target.playerid; - if (map[id]) { - if (typeof map[id].baseDamage == "number") num = map[id].baseDamage; - if (typeof map[id].extraDamage == "number") num += map[id].extraDamage; - } - if ( - target.hasSkillTag("filterDamage", null, { - player: trigger.player, - card: trigger.card, - }) - ) - num = 1; - return num; - })() - ) - .set("ai", function (card) { - var num = _status.event.predict, - player = _status.event.player; - if (ui.selected.cards.length >= num) return 0; - if ( - player.countCards("he", function (card) { - return get.value(card) < 6 + num; - }) < num - ) - return 0; - return 6 + num - get.value(card); - }).logSkill = "olhuanfu"; - "step 1"; - if (result.bool) { - player.addTempSkill("olhuanfu_lottery"); - var evt = trigger.getParent(); - if (!evt.olhuanfu_map) evt.olhuanfu_map = {}; - evt.olhuanfu_map[player.playerid] = result.cards.length; - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (card.name == "sha" && target.hp > 0 && current < 0 && target.countCards("he") > 0) return 0.7; - }, - }, - }, - subSkill: { - lottery: { - trigger: { global: "useCardAfter" }, - forced: true, - charlotte: true, - filter: function (event, player) { - var map = event.olhuanfu_map; - if (!map || !map[player.playerid]) return false; - var num = 0; - event.player.getHistory("sourceDamage", function (evt) { - if (evt.card == event.card && evt.getParent().type == "card") num += evt.num; - }); - return num == map[player.playerid]; - }, - content: function () { - player.draw(2 * trigger.olhuanfu_map[player.playerid]); - }, - }, - }, - }, - olqingyi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "olqingyi"); - }, "he") && game.hasPlayer(current => lib.skill.olqingyi.filterTarget(null, player, current)) - ); - }, - selectTarget: [1, 2], - filterTarget: function (card, player, target) { - return target != player && target.countCards("he") > 0; - }, - multitarget: true, - multiline: true, - content: function () { - "step 0"; - var list = [player]; - list.addArray(targets); - list.sortBySeat(); - event.list = list; - for (var target of event.list) { - if ( - !target.hasCard(function (card) { - return lib.filter.cardDiscardable(card, target, "olqingyi"); - }, "he") - ) { - event.finish(); - break; - } - } - "step 1"; - player - .chooseCardOL(event.list, "he", true, "清议:选择弃置一张牌", function (card, player) { - return lib.filter.cardDiscardable(card, player, "olqingyi"); - }) - .set("ai", get.unuseful); - "step 2"; - var lose_list = [], - cards = []; - for (var i = 0; i < result.length; i++) { - var current = event.list[i], - card = result[i].cards[0]; - lose_list.push([current, result[i].cards]); - cards.push(card); - } - var type = get.type2(cards[0]); - for (var i = 1; i < cards.length; i++) { - if (get.type2(cards[i]) != type) event.finish(); - } - game.loseAsync({ - lose_list: lose_list, - }).setContent("discardMultiple"); - "step 3"; - event.goto(1); - for (var target of event.list) { - if ( - !target.hasCard(function (card) { - return lib.filter.cardDiscardable(card, target, "olqingyi"); - }, "he") - ) { - event.finish(); - break; - } - } - }, - ai: { - threaten: 1.2, - order: 9.1, - result: { - player: function (player) { - let min = 24; - player.countCards("he", function (card) { - min = Math.min(min, get.value(card)); - }); - if (ui.selected.targets.length == 1) return 1 - min / 6; - return 0.75 - min / 48; - }, - target: function (player, target) { - if ( - target.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "olqingyi"); - }, "he") - ) - return -1; - return 0; - }, - }, - }, - group: "olqingyi_gain", - subSkill: { - gain: { - audio: "olqingyi", - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - var history = player.getHistory("useSkill", evt => evt.skill == "olqingyi"); - if (!history.length) return false; - var color = false; - for (var evt of history) { - var list = [player]; - list.addArray(evt.targets); - for (var target of list) { - target.getHistory("lose", function (evtx) { - if (color === true || evtx.getParent(2).name != "olqingyi") return false; - for (var card of evtx.cards) { - if (color === true || get.position(card, true) != "d") continue; - var color2 = get.color(card, false); - if (!color) color = color2; - else if (color != color2) color = true; - } - }); - if (color === true) return true; - } - } - return false; - }, - content: function () { - "step 0"; - var history = player.getHistory("useSkill", evt => evt.skill == "olqingyi"), - cards = []; - for (var evt of history) { - var list = [player]; - list.addArray(evt.targets); - for (var target of list) { - target.getHistory("lose", function (evtx) { - if (evtx.getParent(2).name != "olqingyi") return false; - for (var card of evtx.cards) { - if (get.position(card, true) == "d") cards.add(card); - } - }); - } - } - player - .chooseButton(["清议:选择获得两张异色牌", cards], 2) - .set("filterButton", function (button) { - if (!ui.selected.buttons.length) return true; - return get.color(button.link, false) != get.color(ui.selected.buttons[0].link, false); - }) - .set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - "step 1"; - if (result.bool) { - player.logSkill("olqingyi_gain"); - player.gain(result.links, "gain2"); - } - }, - }, - }, - }, - olzeyue: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - limited: true, - skillAnimation: true, - animationColor: "water", - direct: true, - filter: function (event, player) { - var sources = [], - history = player.actionHistory; - for (var i = history.length - 1; i >= 0; i--) { - if (i < history.length - 1 && history[i].isMe) break; - for (var evt of history[i].damage) { - if (evt.source && evt.source != player && evt.source.isIn()) sources.add(evt.source); - } - } - for (var source of sources) { - var skills = source.getStockSkills("一!", "五!"); - for (var skill of skills) { - var info = get.info(skill); - if (info && !info.charlotte && !get.is.locked(skill, source) && source.hasSkill(skill, null, null, false)) return true; - } - } - return false; - }, - content: function () { - "step 0"; - var sources = [], - history = player.actionHistory; - for (var i = history.length - 1; i >= 0; i--) { - if (i < history.length - 1 && history[i].isMe) break; - for (var evt of history[i].damage) { - if (evt.source && evt.source != player && evt.source.isIn()) sources.add(evt.source); - } - } - sources = sources.filter(function (source) { - var skills = source.getStockSkills("一!", "五!"); - for (var skill of skills) { - var info = get.info(skill); - if (info && !info.charlotte && !get.is.locked(skill, source) && source.hasSkill(skill, null, null, false)) return true; - } - return false; - }); - player - .chooseTarget(get.prompt("olzeyue"), "令一名可选角色的一个非锁定技失效", function (card, player, target) { - return _status.event.sources.includes(target); - }) - .set("sources", sources) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att >= 0) return 0; - return get.threaten(target, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("olzeyue", target); - player.awakenSkill("olzeyue"); - event.target = target; - var skills = target.getStockSkills("一!", "五!"); - skills = skills.filter(function (skill) { - var info = get.info(skill); - if (info && !info.charlotte && !get.is.locked(skill, target) && target.hasSkill(skill, null, null, false)) return true; - }); - if (skills.length == 1) event._result = { control: skills[0] }; - else player.chooseControl(skills).set("prompt", "令" + get.translation(target) + "的一个技能失效"); - } else event.finish(); - "step 2"; - var skill = result.control; - target.disableSkill("olzeyue_" + player.playerid, skill); - target.storage["olzeyue_" + player.playerid] = true; - player.addSkill("olzeyue_round"); - player.markAuto("olzeyue_round", [target]); - if (!player.storage.olzeyue_map) player.storage.olzeyue_map = {}; - player.storage.olzeyue_map[target.playerid] = 0; - game.log(target, "的技能", "#g【" + get.translation(skill) + "】", "被失效了"); - }, - ai: { threaten: 3 }, - subSkill: { - round: { - trigger: { global: "roundStart" }, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player) { - var storage = player.getStorage("olzeyue_round"); - for (var source of storage) { - if (source.isIn() && source.canUse("sha", player, false)) return true; - } - return false; - }, - content: function () { - "step 0"; - event.targets = player.storage.olzeyue_round.slice(0).sortBySeat(); - event.target = event.targets.shift(); - event.forceDie = true; - "step 1"; - var map = player.storage.olzeyue_map; - if (target.storage["olzeyue_" + player.playerid]) map[target.playerid]++; - event.num = map[target.playerid] - 1; - if (event.num <= 0) event.finish(); - "step 2"; - event.num--; - target.useCard(player, { name: "sha", isCard: true }, false, "olzeyue_round"); - "step 3"; - var key = "olzeyue_" + player.playerid; - if ( - target.storage[key] && - player.hasHistory("damage", function (evt) { - return evt.card.name == "sha" && evt.getParent().type == "card" && evt.getParent(3) == event; - }) - ) { - for (var skill in target.disabledSkills) { - if (target.disabledSkills[skill].includes(key)) game.log(target, "恢复了技能", "#g【" + get.translation(skill) + "】"); - } - delete target.storage[key]; - target.enableSkill(key); - } - if (event.num > 0 && player.isIn() && target.isIn() && target.canUse("sha", player, false)) { - event.goto(2); - } else if (event.targets.length > 0) { - event.target = event.targets.shift(); - event.goto(1); - } - }, - }, - }, - }, - //邓忠 - dzkanpo: { - audio: 2, - trigger: { source: "damageSource" }, - filter: function (event, player) { - return event.getParent().type == "card" && event.card && event.card.name == "sha" && event.player.countCards("he") > 0; - }, - logTarget: "player", - content: function () { - var suit = get.suit(trigger.card); - var next = player.gainPlayerCard(trigger.player, "h", "visible"); - next.set("suit", suit); - next.set("filterButton", function (button) { - var evt = _status.event; - return get.suit(button.link, evt.target) == evt.suit; - }); - }, - group: "dzkanpo_sha", - subSkill: { - sha: { - enable: "chooseToUse", - usable: 1, - viewAs: { name: "sha" }, - viewAsFilter: function (player) { - return player.countCards("hs") > 0; - }, - filterCard: true, - position: "hs", - prompt: "将一张手牌当做【杀】使用", - check: function (card) { - return 6 - get.value(card); - }, - ai: { - respondSha: true, - skillTagFilter: function (player) { - if (player.getStat("skill").dzkanpo_sha) return false; - if (!player.countCards("hs")) return false; - }, - }, - }, - }, - }, - dzgengzhan: { - audio: 2, - trigger: { - global: ["loseAfter", "loseAsyncAfter"], - }, - usable: 1, - filter: function (event, player) { - if (event.type != "discard" || event.getlx === false || player == _status.currentPhase || !event.isPhaseUsing()) return false; - for (var card of event.cards) { - if (get.position(card, true) == "d" && get.name(card, event.hs && event.hs.includes(card) ? event.player : false) == "sha") return true; - } - }, - direct: true, - content: function () { - "step 0"; - var cards = trigger.cards.filter(function (card) { - return get.position(card, true) == "d" && get.name(card, trigger.hs && trigger.hs.includes(card) ? trigger.player : false) == "sha"; - }); - player.chooseButton(["是否发动【更战】获得一张杀?", cards]).set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - "step 1"; - if (result.bool) { - player.logSkill("dzgengzhan"); - player.gain(result.links, "gain2"); - } else player.storage.counttrigger.dzgengzhan--; - }, - group: "dzgengzhan_add", - subSkill: { - add: { - audio: "dzgengzhan", - trigger: { global: "phaseJieshuBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - return ( - player != event.player && - !event.player.hasHistory("useCard", function (evt) { - return evt.card.name == "sha"; - }) - ); - }, - logTarget: "player", - content: function () { - player.addTempSkill("dzgengzhan_effect", { player: "phaseUseAfter" }); - player.addMark("dzgengzhan_effect", 1, false); - game.delayx(); - }, - }, - effect: { - onremove: true, - charlotte: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("dzgengzhan_effect"); - }, - }, - intro: { content: "使用杀的次数上限+#" }, - }, - }, - }, - //王衍 - yangkuang: { - audio: 2, - trigger: { player: "recoverEnd" }, - filter: function (event, player) { - return player.isHealthy(); - }, - logTarget: function (event, player) { - return _status.currentPhase || player; - }, - check: function (event, player) { - var target = _status.currentPhase || player; - if (get.attitude(player, target) > 0) return true; - if (player.countCards("h") > target.countCards("h")) return true; - if (!target.getCardUsable("sha")) return true; - return false; - }, - content: function () { - "step 0"; - player.chooseUseTarget("jiu", true); - "step 1"; - var target = _status.currentPhase; - if (target) target.draw("nodelay"); - player.draw(); - }, - }, - cihuang: { - audio: 2, - trigger: { - global: ["eventNeutralized", "shaMiss"], - }, - direct: true, - filter: function (event, player) { - if (event.player != _status.currentPhase || !event.targets || event.targets.length != 1 || event.type != "card" || !player.countCards("he")) return false; - return lib.skill.cihuang.getList(player, event.player, true); - }, - getList: function (player, target, bool) { - var natures = lib.inpile_nature.slice(0); - var tricks = []; - for (var name of lib.inpile) { - var info = lib.card[name]; - if (!info || info.type != "trick" || info.notarget || (info.selectTarget && info.selectTarget != 1 && (info.selectTarget != -1 || !info.toself))) continue; - tricks.push(name); - } - var history = player.actionHistory; - for (var i = history.length - 1; i >= 0; i--) { - var info = history[i]; - for (var evt of info.useCard) { - var name = evt.card.name; - if (name == "sha") { - if (evt.card.nature) natures.remove(evt.card.nature); - } else tricks.remove(name); - } - if (info.isRound) break; - } - var vcards = []; - for (var i of natures) { - if ( - player.canUse( - { - name: "sha", - nature: i, - isCard: true, - }, - target - ) - ) { - if (bool) return true; - else vcards.push(["基本", "", "sha", i]); - } - } - for (var i of tricks) { - if ( - player.canUse( - { - name: i, - isCard: true, - }, - target - ) - ) { - if (bool) return true; - else vcards.push(["锦囊", "", i]); - } - } - if (bool) return false; - return vcards; - }, - content: function () { - "step 0"; - var target = trigger.player; - var list = lib.skill.cihuang.getList(player, target); - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - player.chooseButton([get.prompt("cihuang", target), '
    将一张牌当以下的一张牌对' + get.translation(target) + "使用
    ", [list, "vcard"]]).set("ai", function (button) { - var card = { - name: button.link[2], - nature: button.link[3], - storage: { cihuang: true }, - }, - player = _status.event.player, - target = _status.event.getTrigger().player; - return get.effect(target, card, player, player); - }); - "step 1"; - if (result.bool) { - var card = { - name: result.links[0][2], - nature: result.links[0][3], - storage: { cihuang: true }, - }; - event.card = card; - player - .chooseCard("hes", "雌黄:将一张牌当" + get.translation(card) + "对" + get.translation(trigger.player) + "使用", function (card, player) { - return player.canUse(get.autoViewAs(_status.event.getParent().card, [card]), _status.event.target, false); - }) - .set("target", trigger.player) - .set("ai", function (card) { - if (get.effect(_status.event.target, get.autoViewAs(_status.event.getParent().card, [card]), player) <= 0) return false; - return 6 - get.value(card); - }); - } else event._result = { bool: false }; - "step 2"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - if (result.bool) { - player.useCard(get.autoViewAs(event.card, result.cards), result.cards, false, trigger.player, "cihuang").oncard = function (card, player) { - _status.event.directHit.addArray(game.filterPlayer()); - }; - } - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return arg && arg.card && arg.card.storage && arg.card.storage.cihuang; - }, - }, - }, - sanku: { - audio: 2, - trigger: { player: "dying" }, - forced: true, - group: "sanku_nogain", - content: function () { - "step 0"; - player.loseMaxHp(); - "step 1"; - var num = player.maxHp - player.hp; - if (num > 0) player.recover(num); - }, - ai: { halfneg: true }, - subSkill: { - nogain: { - audio: "sanku", - trigger: { player: "gainMaxHpBegin" }, - forced: true, - content: function () { - trigger.cancel(); - }, - }, - }, - }, - //霍峻 - qiongshou: { - audio: 2, - trigger: { - player: "enterGame", - global: "phaseBefore", - }, - forced: true, - filter: function (event, player) { - if (event.name == "phase" && game.phaseNumber != 0) return false; - return player.hasEnabledSlot(); - }, - content: function () { - var list = []; - for (var i = 1; i < 6; i++) { - for (var j = 0; j < player.countEnabledSlot(i); j++) { - list.push(i); - } - } - player.disableEquip(list); - player.draw(4); - }, - mod: { - maxHandcard: function (player, num) { - return num + 4; - }, - }, - ai: { - halfneg: true, - combo: "fenrui", - threaten: 3.2, - }, - }, - fenrui: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - onremove: true, - filter: function (event, player) { - var es = player.countCards("e"); - return ( - (player.hasDisabledSlot() && player.countCards("he") > 0) || - (!player.storage.fenrui && - game.hasPlayer(function (current) { - return current != player && current.countCards("e") < es; - })) - ); - }, - content: function () { - "step 0"; - if (player.hasDisabledSlot() && player.countCards("he") > 0) { - var str = "弃置一张牌,恢复一个装备栏并使用一张对应装备牌"; - player.chooseToDiscard("he", get.prompt("fenrui"), str).set("ai", function (card) { - return 7 - get.value(card); - }).logSkill = "fenrui"; - } else event.goto(3); - "step 1"; - if (result.bool) { - player.chooseToEnable().set("ai", function () { - var player = _status.event.player; - var list = [2, 5, 1, 3, 4]; - for (var i of list) { - if (player.hasDisabledSlot(i)) return "equip" + i; - } - }); - } else { - var es = player.countCards("e"); - if ( - player.storage.fenrui || - !game.hasPlayer(function (current) { - return current != player && current.countCards("e") < es; - }) - ) - event.finish(); - else event.goto(3); - } - "step 2"; - var func = function (card) { - return get.subtype(card, false) == result.control && player.canUse(card, player) && !get.cardtag(card, "gifts"); - }; - var card = get.discardPile(func) || get.cardPile2(func); - if (card) { - player.chooseUseTarget(card, true, "nopopup"); - } - if (player.storage.fenrui) event.finish(); - "step 3"; - var es = player.countCards("e"); - if ( - es > 0 && - game.hasPlayer(function (current) { - return current != player && current.countCards("e") < es; - }) - ) { - player - .chooseTarget("是否对一名装备数小于你的角色造成伤害?", "你可以选择一名装备区内牌数小于你的角色,并对其造成X点伤害(X为你与其装备区牌数之差),但此效果每局游戏内仅限一次。", function (card, player, target) { - return player != target && player.countCards("e") > target.countCards("e"); - }) - .set("ai", function (target) { - var player = _status.event.player; - var num = player.countCards("e") - target.countCards("e"); - if (get.attitude(player, target) >= 0) return 0; - if (num >= Math.min(2, player.hp, target.hp)) return get.damageEffect(target, player, player); - return 0; - }); - } else event.finish(); - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("fenrui_animate", target); - player.storage.fenrui = true; - player.unmarkSkill("fenrui"); - game.delayx(); - target.damage(player.countCards("e") - target.countCards("e")); - } - }, - group: "fenrui_animate", - mark: true, - intro: { content: "王炸尚未使用" }, - subSkill: { - animate: { - skillAnimation: true, - animationColor: "fire", - }, - }, - }, - //曹宪曹华 - huamu: { - audio: 6, - trigger: { player: "useCardAfter" }, - locked: false, - filter: function (event, player) { - var color = get.color(event.card); - if (color == "none") return false; - if ( - !player.hasHistory("lose", function (evt) { - return evt.hs.length > 0 && evt.getParent() == event; - }) || - !event.cards.filterInD("oe").length - ) - return false; - var history = game.getGlobalHistory("useCard"); - var index = history.indexOf(event); - if (index < 1) return false; - var evt = history[index - 1], - color2 = get.color(evt.card); - return color != color2 && color2 != "none"; - }, - prompt2: event => "将" + get.translation(event.cards.filterInD("oe")) + "置于武将牌上", - check: function (event, player) { - if ( - !game.hasPlayer(function (current) { - return current.hasSkill("qianmeng", null, null, false) && get.attitude(player, current) > 0; - }) - ) - return false; - var cards = event.cards.filterInD("e"); - if (!cards.length) return true; - var card = cards[0]; - if (get.owner(card) == player) { - if (get.value(card, player) <= 0) return true; - var subtype = get.subtype(card); - if ( - player.hasCard("hs", function (card) { - return get.subtype(card) == subtype && player.canUse(card, player) && get.effect(player, card, player, player) > 0; - }) - ) - return true; - } - return false; - }, - content: function () { - var cards = trigger.cards.filterInD("oe"); - player.addToExpansion(cards, "gain2").gaintag.add("huamu"); - }, - ai: { - reverseOrder: true, - combo: "qianmeng", - }, - mod: { - aiOrder: function (player, card, num) { - if (typeof card == "object") { - var history = game.getGlobalHistory("useCard"); - if (!history.length) return; - var evt = history[history.length - 1]; - if (evt && evt.card && get.color(evt.card) != "none" && get.color(card) != "none" && get.color(evt.card) != get.color(card)) { - return num + 4; - } - } - }, - }, - marktext: "木", - intro: { - name: "灵杉&玉树", - markcount: function (storage, player) { - var red = [], - black = []; - var cards = player.getExpansions("huamu"); - for (var i of cards) { - var color = get.color(i, false); - (color == "red" ? red : black).push(i); - } - return "" + black.length + "/" + red.length; - }, - content: "expansion", - mark: function (dialog, storage, player) { - var red = [], - black = []; - var cards = player.getExpansions("huamu"); - for (var i of cards) { - var color = get.color(i, false); - (color == "red" ? red : black).push(i); - } - if (black.length) { - dialog.addText("灵杉"); - dialog.addSmall(black); - } - if (red.length) { - dialog.addText("玉树"); - dialog.addSmall(red); - } - }, - }, - }, - qianmeng: { - audio: 2, - trigger: { - global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter: function (event, player) { - if (event.name == "addToExpansion") { - if (event.gaintag.includes("huamu")) { - var cards = event.player.getExpansions("huamu"), - red = cards.filter(function (i) { - return get.color(i, false) == "red"; - }); - if (cards.length == red.length || red.length == 0 || cards.length == red.length * 2) return true; - } - } - if (event.name == "lose" && event.getlx !== false) { - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("huamu")) { - var cards = event.player.getExpansions("huamu"), - red = cards.filter(function (i) { - return get.color(i, false) == "red"; - }); - return cards.length == red.length || red.length == 0 || cards.length == red.length / 2; - } - } - return false; - } - return ( - game.getGlobalHistory("cardMove", function (evt) { - if (evt.name != "lose" || event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("huamu")) { - var cards = evt.player.getExpansions("huamu"), - red = cards.filter(function (i) { - return get.color(i, false) == "red"; - }); - return cards.length == red.length || red.length == 0 || cards.length == red.length / 2; - } - } - return false; - }).length > 0 - ); - }, - forced: true, - content: function () { - player.draw(); - }, - ai: { combo: "huamu" }, - }, - liangyuan: { - enable: "chooseToUse", - hiddenCard: function (player, name) { - if (name == "tao") { - return ( - !player.hasSkill("liangyuan_tao", null, null, false) && - game.hasPlayer(function (current) { - var storage = current.getExpansions("huamu"); - return ( - storage.length > 0 && - storage.filter(function (i) { - return get.color(i, false) == "red"; - }).length > 0 - ); - }) - ); - } else if (name == "jiu") { - return ( - !player.hasSkill("liangyuan_jiu", null, null, false) && - game.hasPlayer(function (current) { - var storage = current.getExpansions("huamu"); - return ( - storage.length > 0 && - storage.filter(function (i) { - return get.color(i, false) == "black"; - }).length > 0 - ); - }) - ); - } - return false; - }, - filter: function (event, player) { - if (event.type == "wuxie") return false; - if ( - !player.hasSkill("liangyuan_tao", null, null, false) && - event.filterCard(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && - game.hasPlayer(function (current) { - var storage = current.getExpansions("huamu"); - return ( - storage.length > 0 && - storage.filter(function (i) { - return get.color(i, false) == "red"; - }).length > 0 - ); - }) - ) - return true; - if ( - !player.hasSkill("liangyuan_jiu", null, null, false) && - event.filterCard(get.autoViewAs({ name: "jiu" }, "unsure"), player, event) && - game.hasPlayer(function (current) { - var storage = current.getExpansions("huamu"); - return ( - storage.length > 0 && - storage.filter(function (i) { - return get.color(i, false) == "black"; - }).length > 0 - ); - }) - ) - return true; - return false; - }, - chooseButton: { - dialog: function () { - return ui.create.dialog("良缘", [["tao", "jiu"], "vcard"], "hidden"); - }, - filter: function (button, player) { - var evt = _status.event.getParent(); - var name = button.link[2], - color = name == "tao" ? "red" : "black"; - if (player.hasSkill("liangyuan_" + name, null, null, false)) return false; - var cards = []; - game.countPlayer(function (current) { - cards.addArray( - current.getExpansions("huamu").filter(function (i) { - return get.color(i, false) == color; - }) - ); - }); - if (!cards.length) return false; - var card = get.autoViewAs({ name: name }, cards); - return evt.filterCard(card, player, evt); - }, - check: function (button) { - if (_status.event.getParent().type != "phase") return 1; - var player = _status.event.player; - var name = button.link[2], - color = name == "tao" ? "red" : "black"; - var cards = []; - game.countPlayer(function (current) { - cards.addArray( - current.getExpansions("huamu").filter(function (i) { - return get.color(i, false) == color; - }) - ); - }); - var card = get.autoViewAs({ name: name }, cards); - return player.getUseValue(card, null, true); - }, - backup: function (links, player) { - var name = links[0][2], - color = name == "tao" ? "red" : "black"; - var cards = []; - game.countPlayer(function (current) { - cards.addArray( - current.getExpansions("huamu").filter(function (i) { - return get.color(i, false) == color; - }) - ); - }); - if (!cards.length) return false; - var card = get.autoViewAs({ name: name }, cards); - return { - viewAs: card, - color: color, - selectCard: -1, - filterCard: () => false, - precontent: function () { - player.addTempSkill("liangyuan_" + event.result.card.name, "roundStart"); - player.logSkill("liangyuan"); - var list = [], - color = lib.skill.liangyuan_backup.color; - var cards = []; - game.countPlayer(function (current) { - var cardsx = current.getExpansions("huamu").filter(function (i) { - return get.color(i, false) == color; - }); - if (cardsx.length) { - cards.addArray(cardsx); - list.push([current, cardsx]); - current.$throw(cardsx); - game.log(current, "将", cardsx, "化作“" + (color == "black" ? "灵杉" : "玉树") + "”良缘"); - } - }); - event.result.cards = cards; - delete event.result.skill; - event.result._apply_args = { throw: false }; - game.loseAsync({ - lose_list: list, - }).setContent("chooseToCompareLose"); - }, - }; - }, - prompt: function (links, player) { - var name = links[0][2], - color = name == "tao" ? "玉树" : "灵杉"; - return "将场上所有的“" + color + "”当做【" + get.translation(name) + "】使用"; - }, - }, - subSkill: { - tao: { charlotte: true }, - jiu: { charlotte: true }, - }, - ai: { - order: function (item, player) { - if (!player) player = _status.event.player; - return ( - get.order({ - name: lib.skill.liangyuan.hiddenCard(player, "jiu") ? "jiu" : "tao", - }) + 4 - ); - }, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - combo: "huamu", - threaten: 3, - }, - }, - jisi: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - limited: true, - skillAnimation: true, - animationColor: "metal", - filter: function (event, player) { - var skills = player.getStockSkills("一!", "五!").filter(function (skill) { - if (skill == "jisi") return false; - var info = get.info(skill); - return info && !info.charlotte; - }); - var history = player.getAllHistory("useSkill"); - for (var i of history) { - if (skills.includes(i.sourceSkill) || skills.includes(i.skill)) return true; - } - return false; - }, - content: function () { - "step 0"; - var skills2 = []; - var skills = player.getStockSkills("只!", "因!").filter(function (skill) { - if (skill == "jisi") return false; - var info = get.info(skill); - return info && !info.charlotte; - }); - var history = player.getAllHistory("useSkill"); - for (var i of history) { - if (skills.includes(i.sourceSkill)) skills2.add(i.sourceSkill); - if (skills.includes(i.skill)) skills2.add(i.skill); - if (skills.length == skills2.length) break; - } - event.skills2 = skills2; - var str = "令一名其他角色获得"; - for (var i = 0; i < skills2.length; i++) { - str += "〖" + get.translation(skills2[i]) + "〗"; - if (i != skills2.length - 1) str += ";"; - } - if (skills2.length > 1) str += "中的一个技能"; - str += "然后你"; - if (player.countCards("h") > 0) str += "弃置所有手牌,并"; - str += "视为对其使用一张【杀】"; - player - .chooseTarget(get.prompt("jisi"), str, lib.filter.notMe) - .set("ai", function (target) { - if (!_status.event.goon) return false; - var att = get.attitude(player, target); - if (att < 4) return false; - var eff = get.effect(target, { name: "sha", isCard: true }, player, player); - if (eff >= 0) return att + eff; - if (target.hp <= 2) return false; - return att / Math.max(1, -eff); - }) - .set( - "goon", - (function () { - if (player.hasUnknown() || player.identity == "nei") return false; - var hs = player.getCards("h"); - if (!hs.length || get.value(hs, player) <= 9 - player.hp) return true; - return false; - })() - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("jisi", target); - player.awakenSkill("jisi"); - var list = event.skills2; - if (list.length == 0) event._result = { control: list[0] }; - player - .chooseControl(list) - .set("prompt", "令" + get.translation(target) + "获得一个技能") - .set("ai", () => _status.event.choice) - .set("choice", list.includes("qianmeng") ? "qianmeng" : list.randomGet()); - } else event.finish(); - "step 2"; - target.addSkills(result.control); - "step 3"; - var num = player.countCards("h"); - if (num > 0) player.chooseToDiscard("h", num, true); - "step 4"; - if (player.canUse("sha", target, false)) - player.useCard( - false, - target, - { - name: "sha", - isCard: true, - }, - "noai" - ); - }, - }, - //周处 - shanduan: { - audio: 2, - init: function (player, name) { - player.storage[name] = [1, 2, 3, 4]; - }, - trigger: { player: "damageEnd" }, - filter: (event, player) => player != _status.currentPhase, - forced: true, - locked: false, - content: function () { - if (!player.storage.shanduan) player.storage.shanduan = [1, 2, 3, 4]; - var list = player.storage.shanduan; - for (var i = 0; i < list.length; i++) { - var num = list[i], - add = true; - for (var j = 0; j < list.length; j++) { - if (list[j] < num) { - add = false; - break; - } - } - if (add) { - list[i]++; - break; - } - } - game.delayx(); - }, - group: ["shanduan_draw", "shanduan_use", "shanduan_discard"], - ai: { - notemp: true, - threaten: 3.6, - }, - subSkill: { - draw: { - audio: "shanduan", - trigger: { player: "phaseDrawBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - var list = event.getParent()._shanduan; - return !list || list.length > 0; - }, - content: function () { - "step 0"; - var list = trigger.getParent()._shanduan; - if (!list) { - trigger.getParent()._shanduan = (player.storage.shanduan || [1, 2, 3, 4]).slice(0); - player.storage.shanduan = [1, 2, 3, 4]; - } - "step 1"; - var list = trigger.getParent()._shanduan; - if (list.length == 1) event._result = { index: 0 }; - else - player - .chooseControl(list) - .set("prompt", "善断:为摸牌阶段的摸牌数分配一个数值") - .set("choice", list.indexOf(Math.max.apply(Math, list))) - .set("ai", () => _status.event.choice); - "step 2"; - var list = trigger.getParent()._shanduan; - var num = list[result.index]; - trigger.num = num; - list.remove(num); - game.log(player, "给", "#g摸牌阶段的摸牌数", "分配的数值是", "#y" + num); - }, - }, - use: { - audio: "shanduan", - trigger: { player: "phaseUseBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - var list = event.getParent()._shanduan; - return !list || list.length > 0; - }, - content: function () { - "step 0"; - var list = trigger.getParent()._shanduan; - if (!list) { - trigger.getParent()._shanduan = (player.storage.shanduan || [1, 2, 3, 4]).slice(0); - player.storage.shanduan = [1, 2, 3, 4]; - } - "step 1"; - var list = trigger.getParent()._shanduan; - if (list.length == 1) event._result = { index: 0 }; - else - player - .chooseControl(list) - .set("prompt", "善断:为攻击范围基数分配一个数值") - .set("list", list) - .set("ai", function () { - var player = _status.event.player, - list = _status.event.list, - card = { name: "sha" }; - if (player.hasSha() && player.hasValueTarget(card, false, true) && !player.hasValueTarget(card, null, true)) { - var range = 1; - var equips = player.getCards("e"); - for (var i = 0; i < equips.length; i++) { - var info = get.info(equips[i], false).distance; - if (!info) continue; - if (info.attackFrom) { - range -= info.attackFrom; - } - } - var listx = list.slice(0).sort(); - for (var i of listx) { - if (i <= range) continue; - if ( - game.hasPlayer(function (current) { - var distance = get.distance(player, current, "attack"); - if (distance > 1 && distance <= i - range) return true; - return false; - }) - ) - return list.indexOf(i); - } - } - return list.indexOf(Math.min.apply(Math, list)); - }); - "step 2"; - var list = trigger.getParent()._shanduan; - var num = list[result.index]; - if (!player.storage.shanduan_effect) player.storage.shanduan_effect = {}; - player.storage.shanduan_effect.range = num; - player.addTempSkill("shanduan_effect"); - list.remove(num); - game.log(player, "给", "#g攻击范围的基数", "分配的数值是", "#y" + num); - if (list.length == 0) event.finish(); - else if (list.length == 1) event._result = { index: 0 }; - else - player - .chooseControl(list) - .set("prompt", "为使用【杀】的次数上限分配一个数值") - .set("list", list) - .set("ai", function () { - var player = _status.event.player, - list = _status.event.list; - var sha = player.countCards("hs", function (card) { - return get.name(card) == "sha" && player.hasValueTarget(card, null, true); - }); - var max = player.getCardUsable("sha"); - if (sha <= max) { - var listx = list.slice(0).sort(); - for (var i of listx) { - if (max + i >= sha) return list.indexOf(i); - } - return list.indexOf(Math.max.apply(Math, list)); - } - return list.indexOf(Math.min.apply(Math, list)); - }); - "step 3"; - var list = trigger.getParent()._shanduan; - var num = list[result.index]; - if (!player.storage.shanduan_effect) player.storage.shanduan_effect = {}; - player.storage.shanduan_effect.sha = num; - game.log(player, "给", "#g使用【杀】的次数上限", "分配的数值是", "#y" + num); - list.remove(num); - }, - }, - discard: { - audio: "shanduan", - trigger: { player: "phaseDiscardBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - var list = event.getParent()._shanduan; - return !list || list.length > 0; - }, - content: function () { - "step 0"; - var list = trigger.getParent()._shanduan; - if (!list) { - trigger.getParent()._shanduan = (player.storage.shanduan || [1, 2, 3, 4]).slice(0); - player.storage.shanduan = [1, 2, 3, 4]; - } - "step 1"; - var list = trigger.getParent()._shanduan; - if (list.length == 1) event._result = { index: 0 }; - else - player - .chooseControl(list) - .set("prompt", "善断:为手牌上限基数分配一个数值") - .set("choice", list.indexOf(Math.max.apply(Math, list))) - .set("ai", () => _status.event.choice); - "step 2"; - var list = trigger.getParent()._shanduan; - var num = list[result.index]; - if (!player.storage.shanduan_effect) player.storage.shanduan_effect = {}; - player.storage.shanduan_effect.limit = num; - player.addTempSkill("shanduan_effect"); - list.remove(num); - game.log(player, "给", "#g手牌上限的基数", "分配的数值是", "#y" + num); - }, - }, - effect: { - charlotte: true, - onremove: true, - mod: { - attackRangeBase: function (player) { - var map = player.storage.shanduan_effect; - if (typeof map.range != "number") return; - var range = 1; - var equips = player.getCards("e", function (card) { - return !ui.selected.cards || !ui.selected.cards.includes(card); - }); - for (var i = 0; i < equips.length; i++) { - var info = get.info(equips[i], false).distance; - if (!info) continue; - if (info.attackFrom) { - range -= info.attackFrom; - } - } - return Math.max(range, map.range); - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") { - var map = player.storage.shanduan_effect; - if (typeof map.sha != "number") return; - return num - 1 + map.sha; - } - }, - maxHandcardBase: function (player, num) { - var map = player.storage.shanduan_effect; - if (typeof map.limit != "number") return; - return map.limit; - }, - }, - }, - }, - }, - yilie: { - audio: 2, - enable: "chooseToUse", - hiddenCard: function (player, name) { - if (get.type(name) == "basic" && lib.inpile.includes(name) && !player.getStorage("yilie_count").includes(name)) { - var hs = player.getCards("hs"); - if (hs.length < 2) return false; - var bool = false, - map = {}; - for (var card of hs) { - var color = get.color(card); - if (!map[color]) map[color] = true; - else { - bool = true; - break; - } - } - return bool; - } - }, - filter: function (event, player) { - if (event.type == "wuxie") return false; - var list = player.getStorage("yilie_count"); - var hs = player.getCards("hs"); - if (hs.length < 2) return false; - var bool = false, - map = {}; - for (var card of hs) { - var color = get.color(card); - if (!map[color]) map[color] = true; - else { - bool = true; - break; - } - } - if (!bool) return false; - for (var name of lib.inpile) { - if (get.type(name) != "basic" || list.includes(name)) continue; - var card = { name }; - if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) return true; - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - var storage = player.getStorage("yilie_count"); - for (var i of lib.inpile) { - if (get.type(i) != "basic" || storage.includes(i)) continue; - var card = { name: i }; - if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) list.push(["基本", "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) { - card.nature = j; - if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) list.push(["基本", "", i, j]); - } - } - } - return ui.create.dialog("义烈", [list, "vcard"], "hidden"); - }, - check: function (button) { - var player = _status.event.player; - var evt = _status.event.getParent(); - var name = button.link[2], - card = { name: name, nature: button.link[3] }; - if (name == "shan") return 2; - if (evt.type == "dying") { - if (get.attitude(player, evt.dying) < 2) return 0; - if (name == "jiu") return 2.1; - return 1.9; - } - if (evt.type == "phase") { - if (button.link[2] == "jiu") { - if (player.getUseValue({ name: "jiu" }) <= 0) return 0; - var cards = player.getCards("hs", cardx => get.value(cardx) < 8); - cards.sort((a, b) => get.value(a) - get.value(b)); - if (cards.some(cardx => get.name(cardx) == "sha" && !cards.slice(0, 2).includes(cardx))) return player.getUseValue({ name: "jiu" }); - return 0; - } - return player.getUseValue(card) / 4; - } - return 1; - }, - backup: function (links, player) { - return { - audio: "yilie", - selectCard: 2, - filterCard: function (card, player) { - var color = get.color(card); - if (ui.selected.cards.length) return color == get.color(ui.selected.cards[0]); - return player.hasCard(function (cardx) { - return card != cardx && get.color(cardx) == color; - }, "hs"); - }, - position: "hs", - complexCard: true, - check: card => 8 - get.value(card), - popname: true, - viewAs: { - name: links[0][2], - nature: links[0][3], - }, - precontent: function () { - var name = event.result.card.name; - player.addTempSkill("yilie_count", "roundStart"); - player.markAuto("yilie_count", [name]); - }, - }; - }, - prompt: function (links, player) { - var name = links[0][2]; - var nature = links[0][3]; - return "将两张颜色相同的手牌当做" + (get.translation(nature) || "") + get.translation(name) + "使用"; - }, - }, - ai: { - order: function (item, player) { - if (player && _status.event.type == "phase") { - var add = false, - max = 0; - var names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("yilie_count").includes(name)); - if (names.includes("sha")) add = true; - names = names.map(namex => { - return { name: namex }; - }); - if (add) lib.inpile_nature.forEach(nature => names.push({ name: "sha", nature: nature })); - names.forEach(card => { - if (player.getUseValue(card) > 0) { - var temp = get.order(card); - if (card.name == "jiu") { - var cards = player.getCards("hs", cardx => get.value(cardx) < 8); - cards.sort((a, b) => get.value(a) - get.value(b)); - if (!cards.some(cardx => get.name(cardx) == "sha" && !cards.slice(0, 2).includes(cardx))) temp = 0; - } - if (temp > max) max = temp; - } - }); - if (max > 0) max -= 0.001; - return max; - } - return 0.5; - }, - respondShan: true, - respondSha: true, - fireAttack: true, - skillTagFilter: function (player, tag, arg) { - if (arg == "respond") return false; - var hs = player.getCards("hs"); - if (hs.length < 2) return false; - var bool = false, - map = {}; - for (var card of hs) { - var color = get.color(card); - if (!map[color]) map[color] = true; - else { - bool = true; - break; - } - } - if (!bool) return false; - var storage = player.storage.yilie_count; - var name; - switch (tag) { - case "respondShan": - name = "shan"; - break; - default: - name = "sha"; - break; - } - if (storage && storage.includes(name)) return false; - }, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - count: { charlotte: true, onremove: true }, - backup: { audio: "yilie" }, - }, - }, - //赵俨 - tongxie: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt("tongxie"), "选择至多两名其他角色作为“同协角色”", lib.filter.notMe, [0, 2]).set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var targets = result.targets; - targets.add(player); - player.logSkill("tongxie", targets); - player.addTempSkill("tongxie_effect", { player: "phaseBegin" }); - player.markAuto("tongxie_effect", targets); - var min = player.countCards("h"), - min_player = player; - for (var i of targets) { - if (i == player) continue; - var num = i.countCards("h"); - if (num < min) { - min = num; - min_player = i; - } else if (num == min) min_player = false; - } - if (min_player) min_player.draw(); - else game.delayx(); - } - }, - subSkill: { - effect: { - audio: "tongxie", - charlotte: true, - trigger: { global: "useCardAfter" }, - onremove: true, - forced: true, - popup: false, - filter: function (event, player) { - if (event.card.name != "sha" || event.targets.length != 1 || !event.targets[0].isIn()) return false; - if (event.getParent(2).name == "tongxie_effect") return false; - var list = player.getStorage("tongxie_effect"), - target = event.targets[0]; - if (!list.includes(event.player)) return false; - for (var i of list) { - if (i == event.player || !i.isIn()) continue; - if (!i.canUse("sha", target, false)) continue; - if (_status.connectMode && i.countCards("hs") > 0) return true; - if (i.hasSha()) return true; - } - return false; - }, - content: function () { - "step 0"; - event.targets = player - .getStorage("tongxie_effect") - .filter(function (i) { - return i !== trigger.player; - }) - .sortBySeat(); - event.target = trigger.targets[0]; - "step 1"; - var current = targets.shift(); - if (current.isIn() && target.isIn() && current.canUse("sha", target, false) && (_status.connectMode || current.hasSha())) { - current - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "同协:是否对" + get.translation(target) + "使用一张杀?") - .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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", target) - .set("logSkill", "tongxie_effect") - .set("addCount", false); - if (targets.length > 0) event.redo(); - } - }, - group: ["tongxie_damage", "tongxie_count"], - }, - damage: { - audio: "tongxie", - charlotte: true, - trigger: { global: "damageBegin4" }, - filter: function (event, player) { - var list = player.getStorage("tongxie_effect"); - if (!list.includes(event.player)) return false; - for (var i of list) { - if (i != event.player && i.isIn() && !i.hasSkill("tongxie_count2", null, null, false)) return true; - } - return false; - }, - forced: true, - popup: false, - content: function () { - "step 0"; - event.targets = player - .getStorage("tongxie_effect") - .filter(function (i) { - return i != trigger.player && i.isIn() && !i.hasSkill("tongxie_count2", null, null, false); - }) - .sortBySeat(); - event.num = 0; - "step 1"; - var target = targets[num]; - event.num++; - event.target = target; - target.chooseBool("同协:是否为" + get.translation(trigger.player) + "阻挡伤害?", "失去1点体力,防止" + get.translation(trigger.player) + "即将受到的" + get.cnNumber(trigger.num) + "点伤害").set("ai", function () { - var player = _status.event.player, - target = _status.event.getTrigger().player; - var trigger = _status.event.getTrigger(); - var eff1 = get.damageEffect(target, trigger.source, player, trigger.nature); - if (trigger.num > 1) eff1 = Math.min(-1, eff1) * trigger.num; - var eff2 = get.effect(player, { name: "losehp" }, player, player); - return eff2 > eff1; - }); - "step 2"; - if (result.bool) { - target.logSkill("tongxie_damage", trigger.player); - trigger.cancel(); - target.loseHp(); - } else if (num < targets.length) event.goto(1); - }, - }, - count: { - trigger: { global: "loseHpEnd" }, - charlotte: true, - forced: true, - firstDo: true, - popup: false, - silent: true, - filter: function (event, player) { - return player.getStorage("tongxie_effect").includes(event.player); - }, - content: function () { - trigger.player.addTempSkill("tongxie_count2"); - }, - }, - count2: { charlotte: true }, - }, - }, - //群马超 - olzhuiji: { - mod: { - globalFrom: function (from, to) { - if (from.hp >= to.hp) return -Infinity; - }, - }, - trigger: { player: "useCardToPlayered" }, - shaRelated: true, - filter: function (event, player) { - return event.card.name == "sha" && event.target.countCards("he") > 0 && get.distance(player, event.target) == 1; - }, - forced: true, - logTarget: "target", - content: function () { - "step 0"; - var target = trigger.target; - event.target = target; - if (target.countCards("e") == 0) event._result = { index: 0 }; - else - target - .chooseControl() - .set("choiceList", ["弃置一张牌", "重铸装备区的所有牌"]) - .set("ai", function (card) { - var min = Infinity, - equ = 0, - es = player.getCards("e"), - hs = player.getCards("he"); - for (var i of hs) { - var val = get.value(i); - min = Math.min(min, val); - if (es.includes(i)) equ += val; - } - equ /= es.length; - if (min < equ - 1) return 0; - return 1; - }); - "step 1"; - if (result.index == 0) { - target.chooseToDiscard("he", true); - } else { - target.recast(target.getCards("e", lib.filter.cardRecastable)); - } - }, - }, - //蒲元 - olshengong: { - audio: 2, - enable: "phaseUse", - usable: 3, - filter: function (event, player) { - var list = ["equip1", "equip2", "others"]; - for (var i = 0; i < list.length; i++) { - if (player.hasSkill("olshengong_" + list[i], null, null, false)) list.splice(i--, 1); - } - if (!list.length) return false; - return player.hasCard(function (card) { - var type = get.type(card); - if (type != "equip") return false; - var subtype = get.subtype(card); - if (subtype != "equip1" && subtype != "equip2") subtype = "others"; - return list.includes(subtype); - }, "eh"); - }, - filterCard: function (card, player) { - var type = get.type(card); - if (type != "equip") return false; - var subtype = get.subtype(card); - if (subtype != "equip1" && subtype != "equip2") subtype = "others"; - return !player.hasSkill("olshengong_" + subtype, null, null, false); - }, - position: "he", - check: function (card) { - var val = 7.52 - get.value(card); - if (val <= 0) return 0; - var player = _status.event.player; - if (player.getStorage("olshengong_destroy").includes(card)) val += 2; - return val; - }, - content: function () { - "step 0"; - var subtype = get.subtype(cards[0]); - if (subtype != "equip1" && subtype != "equip2") subtype = "others"; - player.addTempSkill("olshengong_" + subtype, "phaseUseAfter"); - var send = function () { - game.me.chooseControl("助力锻造!", "妨碍锻造!", "什么都不做"); - game.resume(); - }; - var sendback = function (result, player) { - if (result) { - var index = result.index; - game.log(player, "选择了", ["#b助力锻造", "#g妨碍锻造", "#b什么都不做"][index]); - if (index > 1) return; - var card = get.cards()[0]; - if (!card) return; - game.log(player, "展示了", card); - event.cardsx.push(card); - event.cards2[index].push(card); - game.broadcastAll( - function (id, card, name, index) { - var dialog = get.idDialog(id); - if (!dialog) return; - var button = ui.create.button(card, "card", dialog.buttonss[index]); - button.querySelector(".info").innerHTML = name + "|" + get.strNumber(card.number); - }, - event.videoId, - card, - (function (target) { - if (target._tempTranslate) return target._tempTranslate; - var name = target.name; - if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; - return get.translation(name); - })(player), - index - ); - } - }; - event.players = game.filterPlayer(); - event.cardsx = []; - event.cards2 = [[], []]; - event.videoId = lib.status.videoId++; - event.ai_targets = []; - game.broadcastAll( - function (name, id) { - var dialog = ui.create.dialog(name + "发起了“锻造”", "hidden", "forcebutton"); - dialog.videoId = id; - dialog.classList.add("scroll1"); - dialog.classList.add("scroll2"); - dialog.classList.add("fullwidth"); - dialog.classList.add("fullheight"); - ui.arena.classList.add("choose-to-move"); - dialog.buttonss = []; - - var list = ["协力锻造的玩家", "妨碍锻造的玩家"]; - for (var i = 0; i < list.length; i++) { - dialog.add('
    ' + list[i] + "
    "); - var buttons = ui.create.div(".buttons", dialog.content); - dialog.buttonss.push(buttons); - buttons.classList.add("popup"); - buttons.classList.add("guanxing"); - } - dialog.open(); - }, - get.translation(player), - event.videoId - ); - for (var i = 0; i < event.players.length; i++) { - if (event.players[i] == player) { - sendback({ index: 0 }, player); - } else if (event.players[i].isOnline()) { - event.withol = true; - event.players[i].send(send); - event.players[i].wait(sendback); - } else if (event.players[i] == game.me) { - event.withme = true; - game.me.chooseControl("助力锻造!", "妨碍锻造!", "什么都不做"); - if (_status.connectMode) game.me.wait(sendback); - } else { - event.ai_targets.push(event.players[i]); - if (_status.connectMode) event.players[i].showTimer(); - } - } - if (event.ai_targets.length) { - event.ai_targets.randomSort(); - setTimeout(function () { - event.interval = setInterval(function () { - var target = event.ai_targets.shift(); - var att = get.attitude(target, player); - var num = 2; - if (att > 0) num = 0; - else if (att < 0) num = 1; - sendback({ index: num }, target); - if (_status.connectMode) target.hideTimer(); - if (!event.ai_targets.length) { - clearInterval(event.interval); - if (event.withai) game.resume(); - } - }, 750); - }, 500); - } - "step 1"; - if (event.withme) { - if (_status.connectMode) game.me.unwait(result); - else { - var index = result.index; - game.log(game.me, "选择了", ["#b助力锻造", "#g妨碍锻造", "#b什么都不做"][index]); - if (index > 1) return; - var card = get.cards()[0]; - if (!card) return; - game.log(game.me, "展示了", card); - event.cardsx.push(card); - event.cards2[index].push(card); - game.broadcastAll( - function (id, card, name, index) { - var dialog = get.idDialog(id); - if (!dialog) return; - var button = ui.create.button(card, "card", dialog.buttonss[index]); - button.querySelector(".info").innerHTML = name + "|" + get.strNumber(card.number); - }, - event.videoId, - card, - (function (target) { - if (target._tempTranslate) return target._tempTranslate; - var name = target.name; - if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; - return get.translation(name); - })(game.me), - index - ); - } - } - "step 2"; - if (event.withol && !event.resultOL) { - game.pause(); - } - "step 3"; - if (event.ai_targets.length > 0) { - event.withai = true; - game.pause(); - } - "step 4"; - game.broadcastAll(function () { - setTimeout(function () { - ui.arena.classList.remove("choose-to-move"); - }, 500); - }); - game.delay(2); - var num1 = 0, - num2 = 0; - for (var i of event.cards2[0]) num1 += get.number(i, false); - for (var i of event.cards2[1]) num2 += get.number(i, false); - var result = 2; - if (num1 < num2) result = 0; - else if (num2 > 0) result = 1; - event.duanzao_result = result; - game.broadcastAll( - function (id, result) { - var dialog = get.idDialog(id); - if (dialog) dialog.content.firstChild.innerHTML = ["锻造失败…", "锻造成功", "完美锻造!"][result]; - }, - event.videoId, - result - ); - "step 5"; - game.cardsGotoOrdering(event.cardsx); - game.broadcastAll("closeDialog", event.videoId); - "step 6"; - var subtype = get.subtype(cards[0]); - if (subtype != "equip1" && subtype != "equip2") subtype = "others"; - var card_map = { - equip1: [ - ["diamond", 13, "bintieshuangji"], - ["diamond", 1, "wuxinghelingshan"], - ["spade", 13, "wutiesuolian"], - ["diamond", 12, "wushuangfangtianji"], - ["spade", 6, "chixueqingfeng"], - ["spade", 5, "guilongzhanyuedao"], - ], - equip2: [ - ["club", 1, "huxinjing"], - ["club", 2, "heiguangkai"], - ["spade", 2, "linglongshimandai"], - ["club", 1, "hongmianbaihuapao"], - ["spade", 2, "qimenbagua"], - ["spade", 9, "guofengyupao"], - ], - others: [ - ["diamond", 1, "zhaogujing"], - ["spade", 5, "sanlve"], - ["club", 12, "tianjitu"], - ["spade", 2, "taigongyinfu"], - ["diamond", 1, "shufazijinguan"], - ["club", 4, "xuwangzhimian"], - ], - }; - if (!_status.olshengong_map) _status.olshengong_map = {}; - if (!_status.olshengong_maken) _status.olshengong_maken = {}; - var list = card_map[subtype]; - for (var i = 0; i < list.length; i++) { - var name = list[i][2]; - if (!lib.card[name] || _status.olshengong_map[name]) { - list.splice(i--, 1); - } - } - if (!list.length) event.finish(); - else - player.chooseButton(["请选择一种装备牌", [list.randomGets(event.duanzao_result + 1), "vcard"]], true).set("ai", function (button) { - return get.value({ name: button.link[2] }, player, "raw"); - }); - "step 7"; - var name = result.links[0][2]; - var card; - if (_status.olshengong_maken[name]) card = _status.olshengong_maken[name]; - else { - card = game.createCard2(name, result.links[0][0], result.links[0][1]); - _status.olshengong_maken[name] = card; - } - event.card = card; - player.addSkill("olshengong_destroy"); - player.markAuto("olshengong_destroy", [card]); - if ( - !game.hasPlayer(function (current) { - return current.canEquip(card); - }) - ) { - event.finish(); - return; - } - player - .chooseTarget(true, "将" + get.translation(card) + "置于一名角色的装备区内", function (card, player, target) { - return target.canEquip(_status.event.card, true); - }) - .set("card", card) - .set("ai", function (target) { - var card = _status.event.getParent().card, - player = _status.event.player; - return get.effect(target, card, player, player); - }); - "step 8"; - if (result.bool) { - _status.olshengong_map[card.name] = true; - var target = result.targets[0]; - player.line(target, "green"); - target.$gain2(card); - game.delayx(); - target.equip(card); - } - }, - ai: { - order: 10, - result: { player: 1 }, - }, - subSkill: { - equip1: { charlotte: true }, - equip2: { charlotte: true }, - others: { charlotte: true }, - destroy: { - trigger: { global: ["loseEnd", "cardsDiscardEnd"] }, - forced: true, - charlotte: true, - popup: false, - onremove: true, - filter: function (event, player) { - if (event.name == "lose" && event.position != ui.discardPile) return false; - var storage = player.storage.olshengong_destroy; - if (!storage) return false; - for (var i of event.cards) { - if (storage.includes(i)) return true; - } - return false; - }, - content: function () { - var cards = []; - var storage = player.storage.olshengong_destroy; - for (var i of trigger.cards) { - if (storage.includes(i)) { - delete _status.olshengong_map[i.name]; - storage.remove(i); - cards.push(i); - } - } - game.cardsGotoSpecial(cards); - game.log(cards, "被移出了游戏"); - player.addTempSkill("olshengong_draw"); - player.addMark("olshengong_draw", cards.length, false); - if (!storage.length) player.removeSkill("olshengong_destroy"); - }, - }, - draw: { - audio: "olshengong", - trigger: { global: "phaseJieshuBegin" }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - return player.countMark("olshengong_draw") > 0; - }, - content: function () { - player.draw(player.countMark("olshengong_draw")); - }, - }, - }, - }, - olqisi: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - filter: function (event, player) { - return !event.numFixed && event.num > 0; - }, - check: function (event, player) { - if (player.hasEmptySlot(2) || player.hasEmptySlot(5) || player.hasEmptySlot(1)) return true; - return false; - }, - prompt2: "摸牌阶段开始时,你可以少摸一张牌并声明一种装备牌的副类别,然后从牌堆或弃牌堆中获得一张该副类别的牌。", - content: function () { - "step 0"; - player - .chooseControl("equip1", "equip2", "equip6", "equip5") - .set("prompt", "选择获得一种副类别的装备牌") - .set("ai", function (card) { - if (player.hasEmptySlot(2)) return "equip2"; - if (player.hasEmptySlot(5)) return "equip5"; - if (player.hasEmptySlot(1)) return "equip1"; - return "equip6"; - }); - "step 1"; - var card = get.cardPile(function (card) { - var type = get.subtype(card); - if (result.control == "equip6") return type == "equip3" || type == "equip4"; - return type == result.control; - }); - if (card) { - trigger.num--; - player.gain(card, "gain2"); - } - }, - group: "olqisi_init", - subSkill: { - init: { - audio: "olqisi", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - var i = 0; - var list = []; - while (i++ < 2) { - var card = get.cardPile(function (card) { - if (get.type(card) != "equip") return false; - return list.length == 0 || get.subtype(card) != get.subtype(list[0]); - }); - if (card) list.push(card); - } - if (!list.length) { - event.finish(); - return; - } - event.list = list; - player.gain(event.list, "gain2"); - "step 1"; - game.delay(1); - var card = event.list.shift(); - if (player.getCards("h").includes(card)) { - player.$give(card, player, false); - player.equip(card); - } - if (event.list.length) event.redo(); - }, - }, - }, - }, - //蒲元衍生 - zhaogujing_skill: { - equipSkill: true, - trigger: { player: "phaseUseEnd" }, - direct: true, - filter: function (event, player) { - return player.hasCard(function (card) { - if (_status.connectMode) return true; - var type = get.type(card, player); - return type == "basic" || type == "trick"; - }, "h"); - }, - content: function () { - "step 0"; - player - .chooseCard("h", get.prompt("zhaogujing_skill"), "展示并视为使用一张基本牌或普通锦囊牌", function (card, player) { - var type = get.type(card, player); - return type == "basic" || type == "trick"; - }) - .set("ai", function (card) { - var player = _status.event.player, - name = get.name(card, player); - if (name == "jiu") return 0; - return player.getUseValue({ - name: name, - nature: get.nature(card, player), - isCard: true, - }); - }); - "step 1"; - if (result.bool) { - player.logSkill("zhaogujing_skill"); - player.showCards(result.cards, get.translation(player) + "发动了【照骨镜】"); - var card = { - name: get.name(result.cards[0], player), - nature: get.nature(result.cards[0], player), - isCard: true, - }; - player.chooseUseTarget(card, true, false); - } - }, - }, - sanlve_skill: { - equipSkill: true, - mod: { - maxHandcard: function (player, num) { - return num + 1; - }, - attackRange: function (player, num) { - return num + 1; - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - }, - xuwangzhimian: { - equipSkill: true, - trigger: { player: "phaseDrawBegin2" }, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.num += 2; - }, - mod: { - maxHandcard: function (player, num) { - return num - 1; - }, - }, - }, - shufazijinguan_skill: { - equipSkill: true, - trigger: { - player: "phaseZhunbeiBegin", - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("shufazijinguan"), "对一名其他角色造成1点伤害", function (card, player, target) { - return player != target; - }) - .set("ai", function (target) { - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - player.logSkill("shufazijinguan_skill", result.targets[0]); - result.targets[0].damage(); - } - }, - }, - qimenbagua: { - equipSkill: true, - trigger: { target: "useCardToBefore" }, - forced: true, - filter: function (event, player) { - if (event.card.name != "sha") return false; - if (player.hasSkillTag("unequip2")) return false; - if ( - event.player.hasSkillTag("unequip", false, { - name: event.card ? event.card.name : null, - target: player, - card: event.card, - }) - ) - return false; - return true; - }, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target) { - if (card.name != "sha") return; - if ( - target.hasSkillTag("unequip2") || - player.hasSkillTag("unequip", false, { - name: card ? card.name : null, - target: player, - card: card, - }) || - player.hasSkillTag("unequip_ai", false, { - name: card ? card.name : null, - target: player, - card: card, - }) - ) - return; - return "zerotarget"; - }, - }, - }, - }, - guofengyupao: { - equipSkill: true, - mod: { - targetEnabled: function (card, player, target) { - if (player == target || get.type(card) != "trick") return; - if (target.hasSkillTag("unequip2")) return; - if ( - player.hasSkillTag("unequip", false, { - name: card ? card.name : null, - target: player, - card: card, - }) - ) - return; - return false; - }, - }, - }, - hongmianbaihuapao_skill: { - equipSkill: true, - trigger: { - player: "damageBegin4", - }, - filter: function (event, player) { - if (!event.hasNature("linked")) return false; - if (player.hasSkillTag("unequip2")) return false; - if ( - event.source && - event.source.hasSkillTag("unequip", false, { - name: event.card ? event.card.name : null, - target: player, - card: event.card, - }) - ) - return false; - return true; - }, - forced: true, - content: function () { - trigger.cancel(); - }, - ai: { - nofire: true, - nothunder: true, - effect: { - target: function (card, player, target, current) { - if (!get.tag(card, "natureDamage")) return; - if ( - !target.hasSkillTag("unequip2") && - !player.hasSkillTag("unequip", false, { - name: card ? card.name : null, - target: player, - card: card, - }) && - !player.hasSkillTag("unequip_ai", false, { - name: card ? card.name : null, - target: player, - card: card, - }) - ) - return "zerotarget"; - }, - }, - }, - }, - linglongshimandai_skill: { - equipSkill: true, - trigger: { - target: "useCardToTargeted", - }, - filter: function (event, player) { - if ((event.targets && event.targets.length > 1) || event.player == player) return false; - if (player.hasSkillTag("unequip2")) return false; - var evt = event.getParent(); - if ( - evt.player && - evt.player.hasSkillTag("unequip", false, { - name: evt.card ? evt.card.name : null, - target: player, - card: evt.card, - }) - ) - return false; - return true; - }, - audio: true, - check: function (event, player) { - return get.effect(player, event.card, event.player, player) <= 0; - }, - prompt2: event => "进行一次判定。若结果为♥,则" + get.translation(event.card) + "对你无效", - content: function () { - "step 0"; - player.judge("linglongshimandai", function (card) { - return get.suit(card) == "heart" ? 1.5 : -0.5; - }).judge2 = function (result) { - return result.bool ? true : false; - }; - "step 1"; - if (result.judge > 0) { - trigger.getParent().excluded.add(player); - } - }, - ai: { - effect: { - target: function (card, player, target, effect) { - if ( - effect > 0 || - player.hasSkillTag("unequip", false, { - name: card ? card.name : null, - target: player, - card: card, - }) || - player.hasSkillTag("unequip_ai", false, { - name: card ? card.name : null, - target: player, - card: card, - }) - ) - return; - return 0.75; - }, - }, - }, - }, - bintieshuangji_skill: { - trigger: { player: "shaMiss" }, - filter: function (event, player) { - return player.hp > 0; - }, - prompt2: function (event, player) { - var prompt = "失去1点体力,然后"; - var cards = event.cards.filterInD(); - if (cards.length) prompt += "获得" + get.translation(cards) + "、"; - prompt += "摸一张牌、本回合使用【杀】的次数上限+1"; - return prompt; - }, - check: function (event, player) { - if (get.effect(player, { name: "losehp" }, player, player) > 0) return true; - return player.hp > event.target.hp && event.cards.filterInD().length > 0; - }, - content: function () { - "step 0"; - player.loseHp(); - "step 1"; - var cards = trigger.cards.filterInD(); - if (cards.length) player.gain(cards, "gain2"); - player.draw(); - "step 2"; - player.addTempSkill("bintieshuangji_skill_effect"); - player.addMark("bintieshuangji_skill_effect", 1, false); - }, - subSkill: { - effect: { - charlotte: true, - intro: { content: "使用【杀】的次数上限+#" }, - onremove: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("bintieshuangji_skill_effect"); - }, - }, - }, - }, - }, - chixueqingfeng: { - equipSkill: true, - trigger: { player: "useCardToPlayered" }, - filter: function (event) { - return event.card.name == "sha"; - }, - logTarget: "target", - forced: true, - content: function () { - var target = trigger.target; - target.addTempSkill("chixueqingfeng2"); - target.markAuto("chixueqingfeng2", [trigger.card]); - }, - ai: { - unequip_ai: true, - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.card && arg.card.name == "sha") return true; - return false; - }, - }, - }, - chixueqingfeng2: { - equipSkill: true, - trigger: { global: "useCardAfter" }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - onremove: true, - filter: function (event, player) { - return player.storage.chixueqingfeng2 && player.storage.chixueqingfeng2.includes(event.card); - }, - content: function () { - player.storage.chixueqingfeng2.remove(trigger.card); - if (!player.storage.chixueqingfeng2.length) player.removeSkill("chixueqingfeng2"); - }, - mark: true, - marktext: "※", - intro: { - content: "防具技能无效,且不能使用或打出手牌", - }, - mod: { - cardEnabled2: function (card) { - if (get.position(card) == "h") return false; - }, - }, - ai: { - unequip2: true, - }, - }, - guilongzhanyuedao: { - equipSkill: true, - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - return event.card && event.card.name == "sha" && get.color(event.card) == "red"; - }, - content: function () { - trigger.directHit.addArray(game.players); - }, - ai: { - unequip_ai: true, - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.card && arg.card.name == "sha" && get.color(arg.card) == "red") return true; - return false; - }, - }, - }, - wushuangfangtianji_skill: { - equipSkill: true, - trigger: { - source: "damageSource", - }, - filter: function (event, player) { - return event.card && event.card.name == "sha" && event.getParent().type == "card"; - }, - direct: true, - content: function () { - "step 0"; - var target = trigger.player; - var choices = ["摸一张牌"]; - if ( - target.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, target); - }, "he") - ) - choices.push("弃置" + get.translation(target) + "的一张牌"); - player - .chooseControl("cancel2") - .set("choiceList", choices) - .set("prompt", get.prompt("wushuangfangtianji_skill")) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getTrigger().player; - if ( - target.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, target); - }, "he") && - get.effect(target, { name: "guohe_copy2" }, player, player) > get.effect(player, { name: "draw" }, player, player) - ) - return 1; - return 0; - }); - "step 1"; - if (result.control == "cancel2") return; - if (result.index == 0) { - player.logSkill("wushuangfangtianji_skill"); - player.draw(); - } else { - var target = trigger.player; - player.logSkill("wushuangfangtianji_skill", target); - player.discardPlayerCard(target, "he", true); - } - }, - }, - //芮姬 - qiaoli: { - onChooseToUse: function (event) { - if (event.type == "phase" && !game.online && !(event.qiaoli_equip1 && event.qiaoli_noequip1)) { - var player = event.player; - var evt = event.getParent("phaseUse"); - if ( - player.getHistory("useCard", function (evtx) { - return evtx.getParent("phaseUse") == evt && evtx.skill == "qiaoli" && get.subtype(evtx.cards[0]) == "equip1"; - }).length - ) - event.set("qiaoli_equip1", true); - if ( - player.getHistory("useCard", function (evtx) { - return evtx.getParent("phaseUse") == evt && evtx.skill == "qiaoli" && get.subtype(evtx.cards[0]) != "equip1"; - }).length - ) - event.set("qiaoli_noequip1", true); - } - }, - audio: 2, - enable: "phaseUse", - viewAs: { - name: "juedou", - qiaoli: true, - }, - filterCard: function (card, player) { - if (get.type(card) != "equip") return false; - var event = _status.event; - if (get.subtype(card) == "equip1" && event.qiaoli_equip1) return false; - if (get.subtype(card) != "equip1" && event.qiaoli_noequip1) return false; - return true; - }, - viewAsFilter: function (player) { - return ( - player.isPhaseUsing() && - player.hasCard(function (card) { - return lib.skill.qiaoli.filterCard(card, player); - }, "hes") - ); - }, - check: function (card) { - if (get.position(card) == "e") return 7.5 - get.value(card); - return 12 - _status.event.player.getUseValue(card); - }, - position: "hes", - precontent: function () { - player.addTempSkill("qiaoli_norespond"); - player.addTempSkill("qiaoli_effect"); - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return arg && arg.card && arg.card.name == "juedou" && _status.event.skill == "qiaoli"; - }, - }, - subSkill: { - norespond: { - charlotte: true, - trigger: { player: "useCard1" }, - filter: function (event, player) { - return event.card.qiaoli && get.subtype(event.cards[0]) != "equip1"; - }, - forced: true, - popup: false, - content: function () { - player.addTempSkill("qiaoli_gain"); - trigger.directHit.addArray(game.players); - game.log(trigger.card, "不可被响应"); - }, - }, - effect: { - charlotte: true, - trigger: { source: "damageSource" }, - filter: function (event, player) { - return event.card && event.cards && event.card.qiaoli && get.subtype(event.cards[0]) == "equip1"; - }, - forced: true, - popup: false, - content: function () { - "step 0"; - var card = trigger.cards[0]; - var num = 1; - var info = get.info(card, false); - if (info && info.distance && typeof info.distance.attackFrom == "number") num -= info.distance.attackFrom; - player.draw(num); - "step 1"; - var cards = result; - if (get.itemtype(cards) != "cards") { - event.finish(5); - return; - } - var hs = player.getCards("h"); - cards = cards.filter(function (card) { - return hs.includes(card); - }); - if (!cards.length) { - event.finish(5); - return; - } - event.cards = cards; - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - "step 2"; - player.chooseCardTarget({ - filterCard: function (card) { - return _status.event.cards.includes(card) && !card.hasGaintag("qiaoli_given"); - }, - cards: cards, - filterTarget: lib.filter.notMe, - selectCard: [1, cards.length], - prompt: "是否将获得的牌分配给其他角色?", - ai1: function (card) { - return -1; - }, - ai2: function (target) { - return -1; - }, - }); - "step 3"; - if (result.bool) { - var res = result.cards, - target = result.targets[0].playerid; - player.addGaintag(res, "qiaoli_given"); - cards.removeArray(res); - if (!event.given_map[target]) event.given_map[target] = []; - event.given_map[target].addArray(res); - if (cards.length) event.goto(2); - } - "step 4"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - }); - game.stopCountChoose(); - } - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - source.gain(event.given_map[i], player, "giveAuto"); - } - event.next.sort(function (a, b) { - return lib.sort.seat(a.player, b.player); - }); - }, - }, - gain: { - charlotte: true, - audio: "qiaoli", - trigger: { player: "phaseJieshuBegin" }, - forced: true, - content: function () { - var card = get.cardPile2(function (card) { - return get.type(card) == "equip"; - }); - if (card) player.gain(card, "gain2"); - }, - }, - }, - }, - qingliang: { - audio: 2, - trigger: { target: "useCardToTarget" }, - filter: function (event, player) { - if (event.targets.length != 1) return false; - var bool1 = event.card.name == "sha"; - var bool2 = get.type2(event.card) == "trick" && get.tag(event.card, "damage"); - if (!bool1 && !bool2) return false; - return player != event.player && player.countCards("h") > 0; - }, - usable: 1, - logTarget: "player", - check: function (event, player) { - if (get.attitude(player, event.player) > 0 || event.player.hasSkillTag("nogain")) return true; - var eff = get.effect(player, event.card, event.player, player); - if (eff >= 0) return false; - var suits = [], - banned = [], - hs = player.getCards("h"); - for (var i of hs) { - var suit = get.suit(i, player); - suits.add(suit); - if (!lib.filter.cardDiscardable(i, player, "qingliang")) banned.add(suit); - } - suits.removeArray(banned); - for (var i of suits) { - var cards = player.getCards("h", function (card) { - return get.suit(card, player) == i; - }); - if (-eff / 2 - get.value(cards, player) > 0) return true; - } - return false; - }, - content: function () { - "step 0"; - player.showHandcards(get.translation(player) + "发动了【清靓】"); - "step 1"; - var suits = [], - banned = [], - hs = player.getCards("h"); - for (var i of hs) { - var suit = get.suit(i, player); - suits.add(suit); - if (!lib.filter.cardDiscardable(i, player, "qingliang")) banned.add(suit); - } - if (suits.length > banned.length) { - player - .chooseControl() - .set("choiceList", ["和" + get.translation(trigger.player) + "各摸一张牌", "弃置一种花色的所有手牌,令" + get.translation(trigger.card) + "对自己无效"]) - .set("ai", function () { - var player = _status.event.player, - event = _status.event.getTrigger(); - if (get.attitude(player, event.player) > 0 || event.player.hasSkillTag("nogain")) return 0; - return 1; - }); - event.suits = suits; - suits.removeArray(banned); - suits.sort(); - } else { - event._result = { index: 0 }; - } - "step 2"; - if (result.index == 0) { - var list = [player, trigger.player].sortBySeat(); - list[0].draw("nodelay"); - list[1].draw(); - event.finish(); - } else { - if (event.suits.length == 1) event._result = { control: event.suits[0] }; - else - player - .chooseControl(event.suits) - .set("prompt", "选择弃置一种花色的所有牌") - .set("ai", function () { - var player = _status.event.player, - list = _status.event.controls.slice(0); - var gett = function (suit) { - var cards = player.getCards("h", function (card) { - return get.suit(card, player) == suit; - }); - return get.value(cards); - }; - return list.sort(function (b, a) { - return gett(b) - gett(a); - })[0]; - }); - } - "step 3"; - var cards = player.getCards("h", function (card) { - return get.suit(card) == result.control; - }); - if (cards.length) player.discard(cards); - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - trigger.untrigger(); - }, - }, - //卫兹 - yuanzi: { - audio: 2, - trigger: { global: "phaseZhunbeiBegin" }, - logTarget: "player", - filter: function (event, player) { - return player != event.player && event.player.isIn() && player.countCards("h") > 0 && !player.hasSkill("yuanzi_round", null, null, false); - }, - check: function (event, player) { - if (event.player.hasJudge("lebu") || get.attitude(player, event.player) < 2) return false; - return game.hasPlayer(function (current) { - return current !== player && current !== event.player && event.player.inRange(current) && get.attitude(event.player, current) < 0; - }); - }, - content: function () { - var cards = player.getCards("h"); - player.give(cards, trigger.player); - player.addTempSkill("yuanzi_effect"); - player.addTempSkill("yuanzi_round", "roundStart"); - }, - subSkill: { - effect: { - charlotte: true, - audio: "yuanzi", - trigger: { global: "damageSource" }, - forced: true, - filter: function (event, player) { - var source = event.source; - return source && source == _status.currentPhase && player.countCards("h") <= source.countCards("h"); - }, - content: function () { - player.draw(2); - }, - }, - round: { charlotte: true }, - }, - }, - liejie: { - audio: 2, - trigger: { player: "damageEnd" }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - var source = trigger.source; - var prompt2 = "弃置至多三张牌并摸等量的牌"; - if (source) prompt2 += ",若弃置的牌中有红色牌,则弃置" + get.translation(source) + "至多等量的牌"; - var next = player.chooseToDiscard("he", [1, 3], get.prompt("liejie"), prompt2); - next.set("ai", function (card) { - return 6 - get.value(card); - }); - if (source) next.logSkill = ["liejie", source]; - else next.logSkill = "liejie"; - "step 1"; - if (result.bool) { - var cards = result.cards; - player.draw(cards.length); - if (trigger.source) { - var num = cards.filter(function (i) { - return get.color(i, player) == "red"; - }).length; - if (num > 0) player.discardPlayerCard(trigger.source, "he", [1, num]).set("forceAuto", true); - } - } - }, - }, - //滕芳兰 - luochong: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "damageEnd"] }, - direct: true, - filter: function (event, player) { - if (event.name == "damage") { - var history = player.getHistory("damage"); - if (history.indexOf(event) != 0) return false; - } - var storage1 = player.storage.luochong_round, - storage2 = player.getStorage("luochong"); - if (!storage1) storage1 = [[], []]; - for (var i = 0; i < 4; i++) { - if ( - !storage1[0].includes(i) && - !storage2.includes(i) && - game.hasPlayer(function (current) { - return !storage1[1].includes(current) && lib.skill.luochong.filterx[i](current); - }) - ) - return true; - } - return false; - }, - filterx: [target => target.isDamaged(), () => true, target => target.countCards("he") > 0, () => true], - onremove: true, - content: function () { - "step 0"; - var list = []; - var choiceList = ["令一名角色回复1点体力。", "令一名角色失去1点体力。", "令一名角色弃置两张牌。", "令一名角色摸两张牌。"]; - var storage1 = player.storage.luochong_round, - storage2 = player.getStorage("luochong"); - if (!storage1) storage1 = [[], []]; - for (var i = 0; i < 4; i++) { - if (storage2.includes(i)) { - choiceList[i] = '' + choiceList[i] + ""; - } else if ( - storage1[0].includes(i) || - !game.hasPlayer(function (current) { - return !storage1[1].includes(current) && lib.skill.luochong.filterx[i](current); - }) - ) { - choiceList[i] = '' + choiceList[i] + ""; - } else list.push("选项" + get.cnNumber(i + 1, true)); - } - list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", get.prompt("luochong")) - .set("choiceList", choiceList) - .set("ai", function () { - var player = _status.event.player; - var list = _status.event.controls.slice(0); - var listx = (player.storage.luochong_round || [[], []])[1]; - var gett = function (choice) { - if (choice == "cancel2") return 0.1; - var max = 0, - func = { - 选项一: function (current) { - if (current.isDamaged()) max = Math.max(max, get.recoverEffect(current, player, player)); - }, - 选项二: function (target) { - max = Math.max(max, get.effect(target, { name: "losehp" }, player, player)); - }, - 选项三: function (target) { - var num = target.countDiscardableCards(player, "he"); - if (num > 0) max = Math.max(max, Math.sqrt(Math.min(2, num)) * get.effect(target, { name: "guohe_copy2" }, player, player)); - }, - 选项四: function (target) { - max = Math.max(max, 2 * get.effect(target, { name: "draw" }, player, player)); - }, - }[choice]; - game.countPlayer(function (current) { - if (!listx.includes(current)) func(current); - }); - return max; - }; - return list.sort(function (a, b) { - return gett(b) - gett(a); - })[0]; - }); - "step 1"; - if (result.control != "cancel2") { - var index = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); - event.index = index; - var listx = (player.storage.luochong_round || [[], []])[1]; - var list = [ - [ - "选择一名角色,令其回复1点体力", - function (target) { - var player = _status.event.player; - return get.recoverEffect(target, player, player); - }, - ], - [ - "选择一名角色,令其失去1点体力", - function (target) { - return get.effect(target, { name: "losehp" }, player, player); - }, - ], - [ - "选择一名角色,令其弃置两张牌", - function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy2" }, player, player) * Math.sqrt(Math.min(2, target.countCards("he"))); - }, - ], - [ - "选择一名角色,令其摸两张牌", - function (target) { - var player = _status.event.player; - return 2 * get.effect(target, { name: "draw" }, player, player); - }, - ], - ][index]; - var targets = game.filterPlayer(function (current) { - return !listx.includes(current) && lib.skill.luochong.filterx[event.index](current); - }); - var next = player.chooseTarget(list[0], true, function (card, player, target) { - return _status.event.targets.includes(target); - }); - next.set("targets", targets); - next.set("ai", list[1]); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("luochong", target); - if (player != target) player.addExpose(0.2); - player.addTempSkill("luochong_round", "roundStart"); - if (!player.storage.luochong_round) player.storage.luochong_round = [[], []]; - player.storage.luochong_round[0].push(event.index); - player.storage.luochong_round[1].push(target); - switch (event.index) { - case 0: - target.recover(); - break; - case 1: - target.loseHp(); - break; - case 2: - target.chooseToDiscard(true, "he", 2); - break; - case 3: - target.draw(2); - break; - } - } - }, - subSkill: { - round: { - charlotte: true, - onremove: true, - }, - }, - }, - aichen: { - audio: 2, - trigger: { player: "dying" }, - forced: true, - filter: function (event, player) { - return player.hasSkill("luochong", null, null, false) && player.getStorage("luochong").length < 3; - }, - content: function () { - "step 0"; - //var num=1-player.hp; - //if(num>0) player.recover(num); - var list = []; - var choiceList = ["令一名角色回复1点体力。", "令一名角色失去1点体力。", "令一名角色弃置两张牌。", "令一名角色摸两张牌。"]; - var storage2 = player.getStorage("luochong"); - for (var i = 0; i < 4; i++) { - if (storage2.includes(i)) { - choiceList[i] = '' + choiceList[i] + ""; - } else list.push("选项" + get.cnNumber(i + 1, true)); - } - player - .chooseControl(list) - .set("prompt", "哀尘:选择移去一个〖落宠〗的选项") - .set("choiceList", choiceList) - .set("ai", function () { - var controls = _status.event.controls.slice(0); - var list = ["选项三", "选项四", "选项二", "选项一"]; - for (var i of list) { - if (controls.includes(i)) return i; - } - return 0; - }); - "step 1"; - var index = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); - player.markAuto("luochong", [index]); - game.log(player, "移去了", "#g【落宠】", "的", "#y" + ["令一名角色回复1点体力", "令一名角色失去1点体力", "令一名角色弃置两张牌", "令一名角色摸两张牌"][index], "的选项"); - }, - ai: { - combo: "luochong", - neg: true, - }, - }, - //SP孟获 - spmanwang: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("he") > 0; - }, - filterCard: true, - position: "he", - selectCard: [1, Infinity], - check: function (card) { - var player = _status.event.player; - var max = Math.min(player.isDamaged() ? 3 : 2, 4 - player.countMark("spmanwang")); - if (!max && !player.hasSkill("sppanqin")) return 0; - if (max == 0 && ui.selected.length > 0) return 0; - return 7 - ui.selected.cards.length - get.value(card); - }, - content: function () { - var num = Math.min(cards.length, 4 - player.countMark("spmanwang")); - if (num >= 1) player.addSkills("sppanqin"); - if (num >= 2) player.draw(); - if (num >= 3) player.recover(); - if (num >= 4) { - player.draw(2); - player.removeSkills("sppanqin"); - } - }, - intro: { content: "已经移去过#个选项" }, - ai: { - order: 2, - result: { - player: function (player, target) { - if (player.getUseValue({ name: "nanman" }) <= 0) return 0; - if (player.getStat("skill").spmanwang && player.hasSkill("sppanqin")) return 0; - return 1; - }, - }, - }, - derivation: "sppanqin", - }, - sppanqin: { - audio: 2, - trigger: { player: ["phaseUseEnd", "phaseDiscardEnd"] }, - filter: function (event, player) { - var cards = [], - bool = true; - player.getHistory("lose", function (evt) { - if (!bool || evt.type != "discard" || evt.getParent(event.name) != event) return false; - for (var i of evt.cards2) { - if (get.position(i, true) == "d") { - cards.add(i); - if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) bool = false; - } - } - }); - if (!bool || !cards.length) return false; - return player.hasUseTarget(get.autoViewAs({ name: "nanman" }, cards)); - }, - prompt2: function (event, player) { - var cards = []; - player.getHistory("lose", function (evt) { - if (evt.type != "discard" || evt.getParent(event.name) != event) return false; - for (var i of evt.cards2) { - if (get.position(i, true) == "d") { - cards.add(i); - } - } - }); - return "将" + get.translation(cards) + "(共计" + get.cnNumber(cards.length) + "张牌)当做【南蛮入侵】使用"; - }, - check: function (event, player) { - var cards = [], - bool = true; - player.getHistory("lose", function (evt) { - if (!bool || evt.type != "discard" || evt.getParent(event.name) != event) return false; - for (var i of evt.cards2) { - if (get.position(i, true) == "d") { - cards.add(i); - if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) bool = false; - } - } - }); - if (!bool || !cards.length) return false; - return player.hasValueTarget(get.autoViewAs({ name: "nanman" }, cards)); - }, - content: function () { - "step 0"; - var cards = []; - player.getHistory("lose", function (evt) { - if (evt.type != "discard" || evt.getParent(trigger.name) != trigger) return false; - for (var i of evt.cards2) { - if (get.position(i, true) == "d") { - cards.add(i); - } - } - }); - player.chooseUseTarget(true, { name: "nanman" }, cards); - player.addTempSkill("sppanqin_eff"); - }, - subSkill: { - eff: { - trigger: { player: "useCard" }, - charlotte: true, - forced: true, - popup: false, - filter: function (event, player) { - return event.card.name == "nanman" && event.getParent(2).name == "sppanqin" && player.countMark("spmanwang") < 4 && player.hasSkill("spmanwang", null, null, false) && event.cards.length <= event.targets.length; - }, - content: function () { - player.addMark("spmanwang", 1, false); - switch (player.countMark("spmanwang")) { - case 1: - player.draw(2); - player.removeSkills("sppanqin"); - break; - case 2: - player.recover(); - break; - case 3: - player.draw(); - break; - case 4: - player.addSkills("sppanqin"); - break; - } - }, - }, - }, - }, - //清河公主 - zengou: { - audio: 2, - trigger: { global: "useCard" }, - filter: function (event, player) { - return ( - event.card.name == "shan" && - player.inRange(event.player) && - (player.hp > 0 || - player.hasCard(function (card) { - return get.type(card) != "basic" && lib.filter.cardDiscardable(card, player, "zengou"); - }, "eh")) - ); - }, - logTarget: "player", - check: function (event, player) { - if (get.attitude(player, event.player) >= 0) return false; - if (get.damageEffect(event.player, event.getParent(3).player, player, get.nature(event.card)) <= 0) return false; - if ( - player.hasCard(function (card) { - return get.type(card) != "basic" && get.value(card) < 7 && lib.filter.cardDiscardable(card, player, "zengou"); - }, "eh") - ) - return true; - return player.hp > Math.max(1, event.player.hp); - }, - content: function () { - "step 0"; - trigger.all_excluded = true; - var str = "弃置一张非基本牌"; - if (player.hp > 0) str += ",或点「取消」失去1点体力"; - var next = player - .chooseToDiscard( - str, - function (card) { - return get.type(card) != "basic"; - }, - "he" - ) - .set("ai", function (card) { - return 7 - get.value(card); - }); - if (player.hp <= 0) next.set("forced", true); - "step 1"; - if (!result.bool) player.loseHp(); - "step 2"; - var cards = trigger.cards.filterInD(); - if (cards.length) player.gain(cards, "gain2"); - }, - }, - qhzhangji: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - if (!event.player.isIn()) return false; - if (player.getHistory("sourceDamage").length > 0) return true; - if (player.getHistory("damage").length > 0) return event.player.countCards("he") > 0; - return false; - }, - content: function () { - "step 0"; - event.target = trigger.player; - if (player.getHistory("sourceDamage").length) - player - .chooseBool(get.prompt("qhzhangji", event.target), "令" + get.translation(event.target) + "摸两张牌") - .set("choice", get.attitude(player, event.target) > 0) - .set("ai", () => _status.event.choice); - else event.goto(2); - "step 1"; - if (result.bool) { - player.logSkill("qhzhangji", target); - event.logged = true; - target.draw(2); - } - "step 2"; - if (target.isIn() && target.countCards("he") > 0 && player.getHistory("damage").length > 0) - player - .chooseBool(get.prompt("qhzhangji", event.target), "令" + get.translation(event.target) + "弃置两张牌") - .set("choice", get.attitude(player, event.target) < 0) - .set("ai", () => _status.event.choice); - else event.finish(); - "step 3"; - if (result.bool) { - if (!event.logged) player.logSkill("qhzhangji", target); - target.chooseToDiscard("he", true, 2); - } - }, - }, - //十周年夏侯霸 - rebaobian: { - audio: 2, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - for (var i of lib.skill.rebaobian.derivation) { - if (!player.hasSkill(i, null, null, false)) return true; - } - return false; - }, - forced: true, - content: function () { - for (var i of lib.skill.rebaobian.derivation) { - if (!player.hasSkill(i, null, null, false)) { - player.addSkills(i); - break; - } - } - }, - ai: { - maixie: true, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage") && !target.hasSkill("oltiaoxin", null, null, false)) { - if (!target.hasFriend()) return; - if (target.hp >= 4) return [0, 1]; - } - }, - }, - }, - derivation: ["tiaoxin", "new_repaoxiao", "xinshensu"], - }, - //范强张达 - yuanchou: { - audio: 2, - trigger: { - player: "useCardToPlayered", - target: "useCardToTargeted", - }, - filter: function (event) { - return event.card.name == "sha" && get.color(event.card) == "black"; - }, - forced: true, - logTarget: "target", - content: function () { - trigger.target.addTempSkill("qinggang2"); - trigger.target.storage.qinggang2.add(trigger.card); - }, - ai: { - unequip_ai: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.name == "sha" && get.color(arg.card) == "black") return true; - return false; - }, - }, - global: "yuanchou_ai", - subSkill: { - ai: { - unequip_ai: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.name == "sha" && get.color(arg.card) == "black" && arg.target && arg.target.hasSkill("yuanchou")) return true; - return false; - }, - }, - }, - }, - juesheng: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "orange", - viewAs: { name: "juedou", isCard: true }, - filterCard: () => false, - selectCard: -1, - precontent: function () { - player.awakenSkill("juesheng"); - player.addTempSkill("juesheng_counter"); - }, - ai: { - result: { - player: function (player, target) { - return target.getAllHistory("useCard", evt => evt.card.name == "sha").length * lib.card.juedou.ai.result.player.apply(this, arguments); - }, - target: function (player, target) { - var num = target.getAllHistory("useCard", evt => evt.card.name == "sha").length; - if (num < target.hp) return 0; - return num * lib.card.juedou.ai.result.target; - }, - }, - }, - subSkill: { - counter: { - trigger: { global: "damageBegin1" }, - forced: true, - charlotte: true, - filter: function (event, player) { - var evt = event.getParent(); - return evt.skill == "juesheng" && evt.player == player; - }, - content: function () { - var target = trigger.getParent().target; - trigger.num = Math.max(1, target.getAllHistory("useCard", evt => evt.card.name == "sha").length); - target.addTempSkills("juesheng", { player: "phaseAfter" }); - }, - }, - }, - }, - //田之间 - saodi: { - audio: 2, - trigger: { - player: "useCardToPlayer", - }, - direct: true, - filter: function (event, player) { - if (event.targets.length != 1 || event.target == player || event.target.hasSkill("nodis")) return false; - if (event.card.name != "sha" && get.type(event.card) != "trick") return false; - var target = event.target; - var left = [], - right = [], - left2 = player, - right2 = player; - while (left2 != target && right2 != target) { - left2 = left2.getPrevious(); - right2 = right2.getNext(); - if (left2 != target) left.push(left2); - if (right2 != target) right.push(right2); - } - if (target == left2) { - for (var i of left) { - if (lib.filter.targetEnabled2(event.card, player, i)) return true; - } - } - if (target == right2) { - for (var i of right) { - if (lib.filter.targetEnabled2(event.card, player, i)) return true; - } - } - return false; - }, - aiJudge: function (card, player, target, bool) { - var left = [], - right = [], - left2 = player, - right2 = player, - left3 = false, - right3 = false; - var eff_left = 0, - eff_right = 0; - while (left2 != target && right2 != target) { - left2 = left2.getPrevious(); - right2 = right2.getNext(); - if (left2 != target) left.push(left2); - if (right2 != target) right.push(right2); - } - if (target == left2) { - for (var i of left) { - if (lib.filter.targetEnabled2(card, player, i)) { - left3 = true; - eff_left += get.effect(i, card, player, player); - } - } - } - if (target == right2) { - for (var i of right) { - if (lib.filter.targetEnabled2(card, player, i)) { - right3 = true; - eff_right += get.effect(i, card, player, player); - } - } - } - if (left3 && right3) { - if (!bool) return Math.max(eff_left, eff_right); - if (eff_left > Math.max(0, eff_right)) return "↖顺时针"; - if (eff_right > Math.max(0, eff_left)) return "逆时针↗"; - return "cancel2"; - } else if (left3) { - if (bool) return eff_left > 0 ? "↖顺时针" : "cancel2"; - return eff_left; - } else if (right3) { - if (bool) return eff_right > 0 ? "逆时针↗" : "cancel2"; - return eff_right; - } else return bool ? "cancel2" : 0; - }, - content: function () { - "step 0"; - var choices = []; - var target = trigger.target; - var left = [], - right = [], - left2 = player, - right2 = player; - while (left2 != target && right2 != target) { - left2 = left2.getPrevious(); - right2 = right2.getNext(); - if (left2 != target) left.push(left2); - if (right2 != target) right.push(right2); - } - if (target == left2) { - for (var i of left) { - if (lib.filter.targetEnabled2(trigger.card, player, i)) { - choices.push("↖顺时针"); - break; - } - } - } - if (target == right2) { - for (var i of right) { - if (lib.filter.targetEnabled2(trigger.card, player, i)) { - choices.push("逆时针↗"); - break; - } - } - } - choices.push("cancel2"); - player - .chooseControl(choices) - .set("prompt", get.prompt("saodi")) - .set("prompt2", "令自己和" + get.translation(trigger.target) + "某个方向之间的所有角色均成为" + get.translation(trigger.card) + "的目标") - .set("choices", choices) - .set("ai", function () { - var evt = _status.event.getTrigger(); - return lib.skill.saodi.aiJudge(evt.card, evt.player, evt.target, true); - }); - "step 1"; - if (result.control != "cancel2") { - var targets = []; - if (result.control == "↖顺时针") { - var current = player.getPrevious(); - while (current != trigger.target) { - if (lib.filter.targetEnabled2(trigger.card, player, current)) targets.push(current); - current = current.getPrevious(); - } - } else { - var current = player.getNext(); - while (current != trigger.target) { - if (lib.filter.targetEnabled2(trigger.card, player, current)) targets.push(current); - current = current.getNext(); - } - } - event.targets = targets; - if (!event.isMine() && !event.isOnline()) game.delayx(); - } else event.finish(); - "step 2"; - player.logSkill("saodi", targets); - trigger.targets.addArray(targets); - }, - ai: { - effect: { - player_use: function (card, player, target) { - if (!target || player._saodi_judging || ui.selected.targets.length || player == target || target.hasSkill("nodis")) return; - if (typeof card != "object" || (card.name != "sha" && get.type(card) != "trick")) return false; - player._saodi_judging = true; - var effect = lib.skill.saodi.aiJudge(card, player, target); - delete player._saodi_judging; - if (effect > 0) return [1, effect / Math.max(0.01, get.attitude(player, player))]; - }, - }, - }, - }, - zhuitao: { - audio: 2, - direct: true, - locked: false, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - var storage = player.getStorage("zhuitao"); - return game.hasPlayer(function (current) { - return current != player && !storage.includes(current); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("zhuitao"), "令自己至一名其他角色的距离-1", function (card, player, target) { - return target != player && !player.getStorage("zhuitao").includes(target); - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att < 0 && get.distance(player, target) == 2) return 100; - return get.distance(player, target) * (1 - get.sgn(att) / 3); - }); - "step 1"; - if (result.bool) { - player.logSkill("zhuitao", result.targets[0]); - player.markAuto("zhuitao", result.targets); - game.delayx(); - } - }, - intro: { - content: "至$的距离-1", - onunmark: true, - }, - onremove: true, - mod: { - globalFrom: function (player, target, distance) { - if (player.getStorage("zhuitao").includes(target)) return distance - 1; - }, - }, - group: "zhuitao_remove", - subSkill: { - remove: { - audio: "zhuitao", - trigger: { - source: "damageSource", - }, - forced: true, - filter: function (event, player) { - return player.getStorage("zhuitao").includes(event.player); - }, - logTarget: "player", - content: function () { - player.unmarkAuto("zhuitao", [trigger.player]); - }, - }, - }, - }, - //生鱼片 - olfengji: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - forced: true, - locked: false, - filter: function (event, player) { - return !player.numFixed; - }, - content: function () { - "step 0"; - player - .chooseTarget("丰积:请选择增加摸牌的目标", "令自己本回合的额定摸牌数-1,且目标下回合的额定摸牌数+2。或者点击「取消」,令自己的额定摸牌数+1", lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player; - if (target.hasJudge("lebu") || target.hasJudge("bingliang")) return 0; - var att = get.attitude(player, target), - dist = get.distance(player, target, "absolute"); - if (_status.event.goon) { - return att / dist; - } - if ( - game.countPlayer(function (current) { - return current != player && current != target && get.attitude(player, current) < 0 && get.distance(player, current, "absolute") < dist; - }) >= target.hp - ) - return 0; - return att / dist; - }) - .set("goon", player.skipList.includes("lebu")); - "step 1"; - if (!player.storage.olfengji_draw) player.storage.olfengji_draw = 0; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "thunder"); - player.storage.olfengji_draw--; - if (!target.storage.olfengji_draw) target.storage.olfengji_draw = 0; - target.storage.olfengji_draw += 2; - target.addTempSkill("olfengji_draw", { player: "phaseAfter" }); - target.markSkill("olfengji_draw"); - } else { - player.storage.olfengji_draw++; - } - player.addTempSkill("olfengji_draw"); - player.markSkill("olfengji_draw"); - "step 2"; - player.chooseTarget("丰积:请选择增加使用杀次数的目标", "令自己本回合使用杀的次数上限-1,且目标下回合使用杀的次数上限+2。或者点击「取消」,令自己使用杀的次数上限+1", lib.filter.notMe).set("ai", function (target) { - var player = _status.event.player; - if (target.countMark("olfengji_draw") > 0 && target.getCardUsable("sha") < 2) return get.attitude(player, target); - return 0; - }); - "step 3"; - if (!player.storage.olfengji_sha) player.storage.olfengji_sha = 0; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - player.storage.olfengji_sha--; - if (!target.storage.olfengji_sha) target.storage.olfengji_sha = 0; - target.storage.olfengji_sha += 2; - target.addTempSkill("olfengji_sha", { player: "phaseAfter" }); - target.markSkill("olfengji_sha"); - } else { - player.storage.olfengji_sha++; - } - player.addTempSkill("olfengji_sha"); - player.markSkill("olfengji_sha"); - }, - subSkill: { - sha: { - charlotte: true, - onremove: true, - intro: { - content: function (storage) { - return "使用【杀】的次数上限" + (storage >= 0 ? "+" : "") + storage; - }, - }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.storage.olfengji_sha; - }, - }, - }, - draw: { - charlotte: true, - onremove: true, - intro: { - content: function (storage) { - return "额定摸牌数" + (storage >= 0 ? "+" : "") + storage; - }, - }, - trigger: { player: "phaseDrawBegin2" }, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.num += player.storage.olfengji_draw; - }, - }, - }, - }, - //朱灵 - jixian: { - audio: 2, - trigger: { player: "phaseDrawAfter" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && lib.skill.jixian.getNum(player, current) > 0 && player.canUse("sha", current, false); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("jixian"), "视为对一名满足条件的角色使用一张【杀】", function (card, player, target) { - return target != player && lib.skill.jixian.getNum(player, target) > 0 && player.canUse("sha", target, false); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "sha" }, player, player) * Math.sqrt(lib.skill.jixian.getNum(player, target)); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("jixian", target); - var num = lib.skill.jixian.getNum(player, target); - player.useCard({ name: "sha", isCard: true }, target, false); - if (num > 0) player.draw(num); - } else event.finish(); - "step 2"; - if ( - !player.hasHistory("sourceDamage", function (evt) { - var card = evt.card; - if (!card || card.name != "sha") return false; - var evtx = evt.getParent("useCard"); - return evtx.card == card && evtx.getParent() == event; - }) - ) - player.loseHp(); - }, - getNum: function (player, target) { - var num = 0; - if (target.isHealthy()) num++; - if (target.getEquips(2).length) num++; - var countSkill = function (player) { - return player.getSkills(null, false, false).filter(function (skill) { - var info = get.info(skill); - if (!info || info.charlotte) return false; - if (info.zhuSkill) return player.hasZhuSkill(skill); - return true; - }).length; - }; - if (countSkill(player) < countSkill(target)) num++; - return num; - }, - }, - //吾彦 - lanjiang: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - audioname: ["heqi"], - content: function () { - "step 0"; - var ph = player.countCards("h"); - var targets = game.filterPlayer(current => current == player || current.countCards("h") >= ph).sortBySeat(); - player.line(targets, "green"); - event.targets = targets; - event.num = 0; - "step 1"; - var target = targets[num]; - event.num++; - if (target.isIn()) { - event.target = target; - target.chooseBool("是否令" + (player == target ? "自己" : get.translation(player)) + "摸一张牌?").set("ai", () => get.attitude(_status.event.player, _status.event.getParent().player) > 0); - } else { - event.goto(event.num < targets.length ? 1 : 3); - } - "step 2"; - if (result.bool) { - target.line(player); - if (player !== target && (get.mode() !== "identity" || target.identity !== "nei")) target.addExpose(0.15); - player.draw(); - } - if (num < targets.length) event.goto(1); - "step 3"; - player - .chooseTarget("是否对一名手牌数等于自己的目标角色造成1点伤害?", function (card, player, target) { - return _status.event.getParent().targets.includes(target) && target.countCards("h") == player.countCards("h"); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15); - target.damage(); - } else event.finish(); - "step 5"; - var ph = player.countCards("h"); - if (ph > 0 && targets.some(target => target.isIn() && target.countCards("h") < ph)) { - player - .chooseTarget("请选择一名手牌数小于自己的目标角色,令其摸一张牌", function (card, player, target) { - return _status.event.getParent().targets.includes(target) && target.countCards("h") < player.countCards("h"); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.attitude(player, target); - }); - } - "step 6"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - if (player !== target && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.1); - target.draw(); - } - }, - }, - //新SP张郃 - spolzhouxuan: { - audio: 2, - trigger: { player: "phaseDiscardBegin" }, - filter: function (event, player) { - return player.countCards("h") > 0 && player.getExpansions("spolzhouxuan").length < 5; - }, - direct: true, - content: function () { - "step 0"; - player.chooseCard("h", get.prompt("spolzhouxuan"), [1, 5 - player.getExpansions("spolzhouxuan").length], "将至多" + get.cnNumber(5 - player.getExpansions("spolzhouxuan").length) + "张手牌置于武将牌上").set("ai", function (card) { - if (ui.selected.cards.length >= player.needsToDiscard()) return 6 - get.value(card); - return 100 - get.useful(card); - }); - "step 1"; - if (result.bool) { - var cards = result.cards; - player.logSkill("spolzhouxuan"); - player.addToExpansion(cards, player, "give").gaintag.add("spolzhouxuan"); - } - }, - marktext: "旋", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: ["spolzhouxuan_use", "spolzhouxuan_discard"], - subSkill: { - use: { - audio: "spolzhouxuan", - trigger: { player: "useCard" }, - filter: function (event, player) { - return player.getExpansions("spolzhouxuan").length > 0; - }, - forced: true, - locked: false, - content: function () { - "step 0"; - player.loseToDiscardpile(player.getExpansions("spolzhouxuan").randomGet()); - "step 1"; - var num = 1; - if (!player.isMaxHandcard(true)) num += player.getExpansions("spolzhouxuan").length; - player.draw(num); - }, - }, - discard: { - audio: "spolzhouxuan", - trigger: { player: "phaseUseEnd" }, - filter: function (event, player) { - return player.getExpansions("spolzhouxuan").length > 0; - }, - forced: true, - locked: false, - content: function () { - player.loseToDiscardpile(player.getExpansions("spolzhouxuan")); - }, - }, - }, - }, - //董昭 - olxianlve: { - audio: 2, - mode: ["identity"], - trigger: { - global: "phaseZhunbeiBegin", - }, - direct: true, - filter: function (event, player) { - return event.player == game.zhu && event.player.isZhu; - }, - content: function () { - "step 0"; - var list = lib.inpile - .filter(function (i) { - return get.type2(i) == "trick"; - }) - .map(function (i) { - return ["锦囊", "", i]; - }); - if (!list.length) event.finish(); - else - player.chooseButton([get.prompt("olxianlve"), [list, "vcard"]]).set("ai", function (button) { - switch (button.link[2]) { - case "wuxie": - return 0.6 + Math.random(); - case "wuzhong": - case "dongzhuxianji": - return 0.5 + Math.random(); - case "guohe": - case "zhujinqiyuan": - return 0.4 + Math.random(); - default: - return Math.random(); - } - }); - "step 1"; - if (result.bool) { - var name = result.links[0][2]; - player.logSkill("olxianlve"); - player.storage.olxianlve = name; - player.markSkill("olxianlve"); - } - }, - intro: { - content: function (name, player) { - return "已声明" + (player.isUnderControl(true) ? "【" + get.translation(name) + "】" : "一个牌名"); - }, - }, - group: ["olxianlve_use", "olxianlve_count"], - subSkill: { - count: { - trigger: { global: "useCard1" }, - silent: true, - forced: true, - popup: false, - firstDo: true, - filter: function (event, player) { - return event.player != player && event.card.name == player.storage.olxianlve; - }, - content: function () { - if (!trigger.olxianlve_map) trigger.olxianlve_map = {}; - trigger.olxianlve_map[player.playerid] = true; - }, - }, - use: { - audio: "olxianlve", - trigger: { global: "useCardAfter" }, - forced: true, - locked: false, - usable: 1, - filter: function (event, player) { - return event.player != player && event.olxianlve_map && event.olxianlve_map[player.playerid] && event.card.name == player.storage.olxianlve; - }, - content: function () { - "step 0"; - player.draw(2); - "step 1"; - var cards = result; - if (get.itemtype(cards) != "cards") { - event.goto(5); - return; - } - var hs = player.getCards("h"); - cards = cards.filter(function (card) { - return hs.includes(card); - }); - if (!cards.length) { - event.goto(5); - return; - } - event.cards = cards; - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - event.ai_list = []; - "step 2"; - player.chooseCardTarget({ - filterCard: function (card) { - return _status.event.cards.includes(card) && !card.hasGaintag("olxianlve"); - }, - cards: cards, - filterTarget: lib.filter.notMe, - selectCard: [1, cards.length], - prompt: "是否将得到的牌分配给其他角色?", - ai1: function (card) { - if (!ui.selected.cards.length) return 1; - return 0; - }, - ai2: function (target) { - var player = _status.event.player, - card = ui.selected.cards[0]; - var val = target.getUseValue(card); - if (target.isPhaseUsing() && get.type2(card) == "trick") val *= 3; - if (val > 0) return val * get.attitude(player, target) * 2; - return get.value(card, target) * get.attitude(player, target); - }, - }); - "step 3"; - if (result.bool) { - var res = result.cards, - target = result.targets[0].playerid; - player.addGaintag(res, "olxianlve"); - cards.removeArray(res); - if (!event.given_map[target]) event.given_map[target] = []; - event.given_map[target].addArray(res); - if (result.targets[0].isPhaseUsing() && get.type2(res[0]) == "trick") event.ai_list.push(res[0].name); - if (cards.length) event.goto(2); - } - "step 4"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - var map = [], - cards = []; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - map.push([source, event.given_map[i]]); - cards.addArray(event.given_map[i]); - } - if (map.length) - game.loseAsync({ - gain_list: map, - player: player, - cards: cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - "step 5"; - var list = lib.inpile - .filter(function (i) { - return get.type2(i) == "trick"; - }) - .map(function (i) { - return ["锦囊", "", i]; - }); - if (!list.length) event.finish(); - else - player - .chooseButton([get.prompt("olxianlve"), [list, "vcard"]]) - .set("list", event.ai_list) - .set("ai", function (button) { - if (_status.event.list.includes(button.link[2])) return 2 + Math.random(); - switch (button.link[2]) { - case "wuxie": - return 0.6 + Math.random(); - case "wuzhong": - case "dongzhuxianji": - return 0.5 + Math.random(); - case "guohe": - case "zhujinqiyuan": - return 0.4 + Math.random(); - default: - return Math.random(); - } - }); - "step 6"; - if (result.bool) { - var name = result.links[0][2]; - player.storage.olxianlve = name; - player.markSkill("olxianlve"); - } - }, - }, - }, - }, - olzaowang: { - mode: ["identity"], - available: function (mode) { - if (mode == "identity" && _status.mode == "purple") return false; - }, - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "water", - filterTarget: true, - content: function () { - player.awakenSkill("olzaowang"); - target.gainMaxHp(); - target.recover(); - target.draw(3); - target.addSkills("olzaowang2"); - }, - ai: { - order: 2, - result: { - target: function (player, target) { - if (player.hasUnknown(2)) return 0; - if (target.identity == "zhong") return 20; - if (target.identity == "zhu") return 10; - if (target.identity == "nei") return 5; - if (!target.hasFriend()) return 5; - return 0; - }, - }, - }, - }, - olzaowang2: { - charlotte: true, - trigger: { global: "dieBegin" }, - forced: true, - filter: function (event, player) { - return event.player.identity == "zhu" && (player.identity == "zhong" || player.identity == "mingzhong"); - }, - logTarget: "player", - skillAnimation: true, - animationColor: "orange", - content: function () { - game.broadcastAll( - function (player, target) { - target.identity = player.identity; - if (player.identity == "mingzhong") game.zhong = target; - delete target.isZhu; - player.identity = "zhu"; - game.zhu = player; - player.showIdentity(); - target.showIdentity(); - }, - player, - trigger.player - ); - event.trigger("zhuUpdate"); - }, - mark: true, - marktext: "王", - intro: { content: "造了个王" }, - group: "olzaowang2_kill", - subSkill: { - kill: { - trigger: { player: "die" }, - forced: true, - forceDie: true, - skillAnimation: true, - animationColor: "wood", - filter: function (event, player) { - return player.identity == "fan" && event.source && (event.source.identity == "zhu" || event.source.identity == "zhong" || event.source.identity == "mingzhong"); - }, - content: function () { - game.over(game.me.identity == "zhu" || game.me.identity == "zhong" || game.me.identity == "mingzhong"); - }, - }, - }, - }, - //冯方女 - zhuangshu: { - audio: 2, - trigger: { global: "phaseBegin" }, - direct: true, - filter: function (event, player) { - return event.player.isIn() && event.player.hasEmptySlot(5) && player.hasCard(lib.skill.zhuangshu.filterCard, "he"); - }, - filterCard: function (card) { - if (_status.connectMode) return true; - var type = get.type2(card); - return type == "basic" || type == "trick" || type == "equip"; - }, - content: function () { - "step 0"; - player - .chooseToDiscard("he", get.prompt("zhuangshu", trigger.player), "弃置一张牌,并根据此牌的类型,按如下关系将一张宝物牌置入该角色的装备区:{<基本牌,【琼梳】>,<锦囊牌,【犀梳】>,<装备牌,【金梳】>}。", function (card) { - var type = get.type2(card); - return type == "basic" || type == "trick" || type == "equip"; - }) - .set("ai", function (card) { - var player = _status.event.player; - if (get.attitude(player, _status.event.getTrigger().player) < 4) return 0; - var name = "zhuangshu_" + get.type2(card, player); - if ( - game.hasPlayer(function (current) { - return current.getEquip(name) && get.attitude(player, current) > 0; - }) - ) - return 0; - return 7 - get.value(card); - }).logSkill = ["zhuangshu", trigger.player]; - "step 1"; - if (result.bool) { - var name = "zhuangshu_" + get.type2(result.cards[0], result.cards[0].original == "h" ? player : false); - if (lib.card[name] && trigger.player.isIn && trigger.player.hasEmptySlot(5)) { - var target = game.findPlayer(function (current) { - var equip = current.getEquip(name); - return equip && equip.name == name; - }); - if (target) { - var card = target.getEquip(name); - target.$give(card, trigger.player, false); - } else { - var card = game.createCard(name, lib.card[name].cardcolor, 12); - trigger.player.$gain2(card, false); - } - game.delayx(); - trigger.player.equip(card); - } - } - }, - group: "zhuangshu_gameStart", - subSkill: { - gameStart: { - trigger: { global: "phaseBefore" }, - direct: true, - filter: function (event, player) { - return game.phaseNumber == 0; - }, - content: function () { - "step 0"; - player.chooseButton([get.prompt("zhuangshu"), [["zhuangshu_basic", "zhuangshu_trick", "zhuangshu_equip"], "vcard"]]).set("filterButton", function (button) { - return !game.hasPlayer(function (current) { - return current.getEquip(button.link[2]); - }); - }); - "step 1"; - if (result.bool) { - player.logSkill("zhuangshu"); - var name = result.links[0][2], - card = game.createCard(name, lib.card[name].cardcolor, 12); - player.$gain2(card, false); - game.delayx(); - player.equip(card); - } - }, - }, - }, - }, - chuiti: { - audio: 2, - usable: 1, - trigger: { - global: ["loseAfter", "loseAsyncAfter"], - }, - direct: true, - filter: function (event, player) { - if (event.type != "discard" || event.getlx === false) return false; - return game.hasPlayer(function (current) { - if (player != current) { - var cards = current.getEquips(5); - if (!cards.some(card => card.name.indexOf("zhuangshu_") == 0)) return false; - } - var evt = event.getl(current); - if (!evt || !evt.cards2) return false; - for (var i of evt.cards2) { - if (get.position(i, true) == "d" && player.hasUseTarget(i)) return true; - } - return false; - }); - }, - content: function () { - "step 0"; - var cards = []; - game.countPlayer(function (current) { - if (player != current) { - var cards2 = current.getEquips(5); - if (!cards2.some(card => card.name.indexOf("zhuangshu_") == 0)) return false; - } - var evt = trigger.getl(current); - for (var i of evt.cards2) { - if (get.position(i, true) == "d" && player.hasUseTarget(i)) cards.push(i); - } - return false; - }); - player.chooseButton(["垂涕:是否使用其中的一张牌?", cards]).set("ai", function (button) { - return _status.event.player.getUseValue(button.link); - }); - "step 1"; - if (result.bool) { - player.$gain2(result.links[0], false); - game.delayx(); - player.chooseUseTarget(true, result.links[0], false).logSkill = "chuiti"; - } else player.storage.counttrigger.chuiti--; - }, - }, - zhuangshu_basic: { - equipSkill: true, - trigger: { player: "damageBegin2" }, - direct: true, - filter: function (event, player) { - var equip = player.getEquip("zhuangshu_basic"); - return ( - event.num <= - player.countCards("he", function (card) { - return card != equip; - }) - ); - }, - content: function () { - "step 0"; - player - .chooseToDiscard("he", trigger.num, get.prompt("zhuangshu_basic"), "弃置" + get.cnNumber(trigger.num) + "张牌并防止伤害", function (card, player) { - return card != player.getEquip("zhuangshu_basic"); - }) - .set("ai", function (card) { - var player = _status.event.player; - return 4 + player.getUseValue(card) - get.value(card, player); - }); - "step 1"; - if (result.bool) trigger.cancel(); - }, - /*usable:1, - trigger:{player:'useCard2'}, - direct:true, - filter:function(event,player){ - if(event.targets.length!=1) return false; - if(event.card.name!='sha'&&get.type(event.card)!='trick') return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - var target=event.targets[0],hp=target.hp,hs=target.countCards('h'),card=event.card; - return game.hasPlayer(function(current){ - return current!=target&¤t!=player&&(current.hp==hp||current.countCards('h')==hs)&&lib.filter.targetEnabled2(card,player,current); - }); - } - return false; - }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zhuangshu_basic'),'为'+get.translation(trigger.card)+'增加一个满足条件的额外目标',function(card,player,current){ - var card=_status.event.getTrigger().card,target=_status.event.target,hp=target.hp,hs=target.countCards('h'); - return current!=target&¤t!=player&&(current.hp==hp||current.countCards('h')==hs)&&lib.filter.targetEnabled2(card,player,current); - }).set('target',trigger.targets[0]).set('ai',function(target){ - var card=_status.event.getTrigger().card,player=_status.event.player; - return get.effect(target,card,player,player); - }); - 'step 1' - if(result.bool){ - if(player!=event.player&&!player.isOnline()) game.delayx(); - } - else{ - player.storage.counttrigger.zhuangshu_basic--; - event.finish(); - } - 'step 2' - var targets=result.targets; - player.logSkill('zhuangshu_basic',targets); - trigger.targets.addArray(targets); - trigger.directHit.addArray(targets); - },*/ - }, - zhuangshu_trick: { - trigger: { player: ["phaseJudgeBefore"] }, - equipSkill: true, - direct: true, - content: function () { - "step 0"; - player - .chooseControl("判定阶段", "弃牌阶段", "cancel2") - .set("prompt", get.prompt("zhuangshu_trick")) - .set("prompt2", "跳过本回合的判定阶段或弃牌阶段") - .set("ai", function () { - var player = _status.event.player; - if ( - player.hasCard(function (card) { - return ( - get.effect( - player, - { - name: card.viewAs || card.name, - cards: [card], - }, - player, - player - ) < 0 - ); - }, "j") - ) - return "判定阶段"; - return "弃牌阶段"; - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("zhuangshu_trick"); - if (result.control == "判定阶段") { - trigger.cancel(); - game.log(player, "跳过了", "#y判定阶段"); - } else { - player.skip("phaseDiscard"); - game.log(player, "跳过了", "#g弃牌阶段"); - } - } - }, - }, - zhuangshu_equip: { - trigger: { player: "phaseUseEnd" }, - forced: true, - equipSkill: true, - filter: function (event, player) { - return player.countCards("h") < Math.min(5, player.getHandcardLimit()); - }, - content: function () { - player.drawTo(Math.min(5, player.getHandcardLimit())); - }, - }, - //杨仪 - oljuanxia: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("oljuanxia"), lib.filter.notMe).set("ai", function (target) { - var player = _status.event.player, - list = []; - for (var name of lib.inpile) { - var info = lib.card[name]; - if (!info || info.type != "trick" || info.notarget || (info.selectTarget && info.selectTarget != 1)) continue; - if (!player.canUse(name, target, false)) continue; - var eff = get.effect(target, { name: name }, player, player); - if (eff > 0) list.push(eff); - } - list.sort().reverse(); - if (!list.length) return 0; - return list[0] + (list[1] || 0) + (list[2] || 0); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("oljuanxia", target); - } else event.finish(); - "step 2"; - var list = []; - for (var name of lib.inpile) { - var info = lib.card[name]; - if (!info || info.type != "trick" || info.notarget || (info.selectTarget && info.selectTarget != 1)) continue; - list.push(name); - } - if (!list.length) event.finish(); - else { - event.list = list; - event.count = 0; - } - "step 3"; - var list = event.list.filter(function (name) { - return player.canUse(name, target, false); - }); - if (list.length) { - var next = player.chooseButton(["视为对" + get.translation(target) + "使用一张牌", [list, "vcard"]]).set("ai", function (button) { - var evt = _status.event.getParent(); - return get.effect(evt.target, { name: button.link[2] }, evt.player, evt.player); - }); - if (event.count == 0) next.set("forced", true); - } else { - event.stopped = true; - event.goto(5); - } - "step 4"; - if (result.bool) { - event.count++; - var name = result.links[0][2]; - event.list.remove(name); - player.useCard({ name: name, isCard: true }, target, false); - } else event.stopped = true; - "step 5"; - if (target.isIn() && event.count > 0) { - if (event.count < 3 && !event.stopped && event.list.length > 0) event.goto(3); - else { - target.addTempSkill("oljuanxia_counter", { player: "phaseAfter" }); - if (!target.storage.oljuanxia_counter) target.storage.oljuanxia_counter = {}; - if (!target.storage.oljuanxia_counter[player.playerid]) target.storage.oljuanxia_counter[player.playerid] = 0; - target.storage.oljuanxia_counter[player.playerid] += event.count; - } - } - }, - subSkill: { - counter: { - trigger: { player: "phaseEnd" }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - var map1 = _status.connectMode ? lib.playerOL : game.playerMap, - map2 = player.storage.oljuanxia_counter; - if (!map2) return false; - for (var i in map2) { - if (map1[i] && map1[i].isIn() && player.canUse("sha", map1[i], false)) return true; - } - return false; - }, - logTarget: function (event, player) { - var list = []; - var map1 = _status.connectMode ? lib.playerOL : game.playerMap, - map2 = player.storage.oljuanxia_counter; - if (!map2) return false; - for (var i in map2) { - if (map1[i] && map1[i].isIn()) list.push(map1[i]); - } - return list; - }, - content: function () { - "step 0"; - var list = []; - var map1 = _status.connectMode ? lib.playerOL : game.playerMap, - map2 = player.storage.oljuanxia_counter; - if (!map2) return false; - for (var i in map2) { - if (map1[i] && map1[i].isIn()) list.push(map1[i]); - } - list.sortBySeat(); - event.num = 0; - event.targets = list; - "step 1"; - var target = targets[num]; - event.target = target; - if (target.isIn() && player.canUse("sha", target, false)) - player - .chooseBool("狷狭:是否视为对" + get.translation(target) + "依次使用" + get.cnNumber(player.storage.oljuanxia_counter[target.playerid]) + "张【杀】?") - .set("goon", get.effect(target, { name: "sha" }, player, player) > 0) - .set("ai", () => _status.event.goon); - "step 2"; - event.num++; - if (result.bool) event.count = player.storage.oljuanxia_counter[target.playerid]; - else if (event.num < targets.length) event.goto(1); - else event.finish(); - "step 3"; - event.count--; - if (target.isIn() && player.canUse("sha", target, false)) player.useCard({ name: "sha", isCard: true }, target, false); - if (event.count > 0) event.redo(); - else if (event.num < targets.length) event.goto(1); - }, - }, - }, - }, - oldingcuo: { - trigger: { - player: "damageEnd", - source: "damageSource", - }, - usable: 1, - content: function () { - "step 0"; - player.draw(2); - "step 1"; - if (Array.isArray(result) && result.length > 1) { - var color = get.color(result[0], player); - for (var i = 1; i < result.length; i++) { - if (get.color(result[i], player) != color) { - if (player.countCards("h")) player.chooseToDiscard("h", true); - break; - } - } - } - }, - }, - //左棻 - zhaosong: { - trigger: { global: "phaseDrawAfter" }, - logTarget: "player", - filter: function (event, player) { - if (player == event.player || !event.player.countCards("h")) return false; - var types = ["basic", "trick", "equip"]; - for (var i of types) { - if (event.player.hasMark("zhaosong_" + i)) return false; - } - return true; - }, - prompt2: "令其交给你一张手牌,并根据类型获得对应的标记", - check: function (event, player) { - return get.attitude(_status.event.player, event.player) > 0; - }, - content: function () { - "step 0"; - event.target = trigger.player; - event.target.chooseCard("h", true, get.translation(player) + "发动了【诏颂】;请交给其一张手牌"); - "step 1"; - if (result.bool) { - var card = result.cards[0]; - target.give(card, player, "give"); - var type = get.type2(card, target); - if (lib.skill["zhaosong_" + type]) { - target.addSkill("zhaosong_" + type); - target.addMark("zhaosong_" + type); - } - } - }, - subSkill: { - basic: { - marktext: "颂", - intro: { - name: "诏颂(颂)", - name2: "颂", - content: "当你使用【杀】选择唯一目标时,你可移去“颂”,并为此【杀】增加至多两个目标。", - }, - trigger: { player: "useCard2" }, - direct: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - return ( - player.hasMark("zhaosong_basic") && - event.card.name == "sha" && - event.targets.length == 1 && - game.hasPlayer(function (current) { - return current != player && current != event.targets[0] && lib.filter.targetEnabled2(event.card, player, current); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget([1, 2], "是否弃置“颂”标记?", "为" + get.translation(trigger.card) + "增加至多两个目标", function (card, player, target) { - var evt = _status.event.getTrigger(); - return target != player && target != evt.targets[0] && lib.filter.targetEnabled2(evt.card, player, target); - }) - .set("ai", function (target) { - var evt = _status.event.getTrigger(); - return get.effect(target, evt.card, evt.player, evt.player); - }); - "step 1"; - if (result.bool) { - if (player != event.player && !player.isOnline()) game.delayx(); - //player.addTempSkill('zhaosong_shaloss'); - } else event.finish(); - "step 2"; - var targets = result.targets; - player.logSkill("zhaosong_basic", targets); - player.removeMark("zhaosong_basic", 1); - player.removeSkill("zhaosong_basic"); - trigger.targets.addArray(targets); - trigger.zhaosong_basic = true; - }, - } /* - shaloss:{ - trigger:{player:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - if(!event.zhaosong_basic) return false; - var num=0; - player.getHistory('sourceDamage',function(evt){ - if(evt.card==event.card) num+=evt.num; - }); - return num<2; - }, - content:function(){ - player.loseHp(); - }, - },*/, - trick: { - marktext: "诔", - intro: { - name: "诏颂(诔)", - name2: "诔", - content: "当你进入濒死状态时,你可移去“诔”,然后将体力回复至1点并摸一张牌。", - }, - trigger: { player: "dying" }, - prompt: "是否弃置“诔”标记?", - prompt2: "回复体力至1点并摸一张牌。", - charlotte: true, - onremove: true, - filter: function (event, player) { - return player.hasMark("zhaosong_trick") && player.hp < 1; - }, - check: function (event, player) { - if ( - player.maxHp < 2 || - player.countCards("h", function (card) { - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, event.player, "unchanged", "cardSavable", player); - if (mod != "unchanged") return mod; - var savable = get.info(card).savable; - if (typeof savable == "function") savable = savable(card, player, event.player); - return savable; - }) >= - 1 + event.num - event.player.hp - ) - return false; - return true; - }, - content: function () { - player.removeMark("zhaosong_trick", 1); - player.removeSkill("zhaosong_trick"); - //player.loseMaxHp(); - if (player.hp < 1) player.recover(1 - player.hp); - player.draw(); - }, - }, - equip: { - marktext: "赋", - intro: { - name: "诏颂(赋)", - name2: "赋", - content: "出牌阶段开始时,你可移去“赋”并弃置一名角色区域内的至多两张牌。", - }, - trigger: { player: "phaseUseBegin" }, - direct: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - return ( - player.hasMark("zhaosong_equip") && - game.hasPlayer(function (current) { - return current.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, current); - }, "hej"); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget("是否弃置“赋”标记?", "弃置一名角色区域内的至多两张牌", function (card, player, current) { - return current.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, current); - }, "hej"); - }) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target) > 0 ? 2 : 1; - return get.effect(target, { name: "guohe_copy" }, player, player) * att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("zhaosong_equip", target); - player.removeMark("zhaosong_equip", 1); - player.removeSkill("zhaosong_equip"); - player.discardPlayerCard(target, true, "hej", [1, 2]); - } - }, - }, - }, - }, - lisi: { - audio: 2, - trigger: { player: "useCardAfter" }, - direct: true, - filter: function (event, player) { - if (player == _status.currentPhase || !event.cards.filterInD().length) return false; - var hs = player.countCards("h"); - return game.hasPlayer(function (current) { - return current != player && current.countCards("h") <= hs; - }); - }, - content: function () { - "step 0"; - player.chooseTarget(get.prompt("lisi"), "将" + get.translation(trigger.cards.filterInD()) + "交给一名手牌数不大于你的其他角色", function (card, player, target) { - return target != player && target.countCards("h") <= player.countCards("h"); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("lisi", target); - target.gain(trigger.cards.filterInD(), "gain2"); - } - }, - }, - //王荣 - olfengzi: { - audio: 2, - trigger: { player: "useCard" }, - direct: true, - usable: 1, - filter: function (event, player) { - if (event.olfengzi_buff || !event.targets.length || !player.isPhaseUsing() || player.hasSkill("olfengzi_buff")) return false; - var type = get.type(event.card, false); - if (type != "basic" && type != "trick") return false; - return player.hasCard(function (i) { - if (_status.connectMode) return true; - return get.type2(i, player) == type; - }, "h"); - }, - content: function () { - "step 0"; - if (player != game.me && !player.isUnderControl() && !player.isOnline()) game.delayx(); - var type = get.type(trigger.card, false); - player - .chooseToDiscard("h", get.prompt("olfengzi"), "弃置一张" + get.translation(type) + "牌,令" + get.translation(trigger.card) + "结算两次", function (card, player) { - return get.type2(card, player) == _status.event.type; - }) - .set("type", type) - .set("ai", function (card) { - var player = _status.event.player; - var trigger = _status.event.getTrigger(); - if (trigger.card.name == "tiesuo") return 0; - var num = 0; - for (var i of trigger.targets) num += get.effect(i, trigger.card, player, player); - if (num <= 0) return 0; - return 7 - get.value(card); - }).logSkill = "olfengzi"; - "step 1"; - if (result.bool) { - trigger.effectCount++; - } else player.storage.counttrigger.olfengzi--; - }, - /*subSkill:{ - buff:{ - trigger:{global:'useCardToTargeted'}, - forced:true, - charlotte:true, - popup:false, - lastDo:true, - filter:function(event,player){ - return (event.parent.olfengzi_buff==player&&event.targets.length==event.parent.triggeredTargets4.length); - }, - content:function(){ - trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); - trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); - }, - onremove:function(player){ - delete player.storage.counttrigger.olfengji; - }, - }, - },*/ - }, - oljizhan: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - "step 0"; - trigger.changeToZero(); - var card = get.cards()[0]; - game.cardsGotoOrdering(card); - event.cards = [card]; - event.num = get.number(card, false); - player.showCards(card, get.translation(player) + "发动了【吉占】"); - "step 1"; - var str = get.strNumber(num); - player - .chooseControl("大于" + str, "小于" + str, "cancel2") - .set("prompt", "吉占:猜测下一张牌的点数") - .set("choice", num < 7 ? 0 : 1) - .set("ai", () => _status.event.choice); - "step 2"; - var card = get.cards()[0]; - game.cardsGotoOrdering(card); - event.cards.push(card); - var num = get.number(card, false); - if ((num > event.num && result.index == 0) || (num < event.num && result.index == 1)) { - event.num = num; - event.goto(1); - } - player.showCards(card); - "step 3"; - player.gain(cards, "gain2"); - }, - }, - olfusong: { - audio: 2, - forceDie: true, - trigger: { player: "die" }, - skillAnimation: true, - animationColor: "gray", - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.maxHp > player.maxHp; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("olfusong"), "令一名体力上限大于你的其他角色获得〖丰姿〗或〖吉占〗", function (card, player, target) { - return target.maxHp > player.maxHp; - }) - .set("forceDie", true) - .set("ai", target => get.attitude(_status.event.player, target)); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("olfusong", target); - target - .chooseControl("olfengzi", "oljizhan") - .set("prompt", "令" + get.translation(target) + "获得其中一个技能") - .set("ai", () => (Math.random() > 0.5 ? 0 : 1)); - } else event.finish(); - "step 2"; - target.addSkills(result.control); - }, - }, - //邓芝 - olxiuhao: { - audio: 2, - trigger: { global: "damageBegin4" }, - usable: 1, - filter: function (event, player) { - return event.source && event.source.isIn() && [event.source, event.player].includes(player) && event.source != event.player; - }, - logTarget: function (event, player) { - return player == event.player ? event.source : event.player; - }, - check: function (event, player) { - _status.olxiuhao_judging = true; - var bool = false; - if (get.attitude(player, event.player) > 0) bool = true; - else if (2 * get.effect(event.source, { name: "draw" }, player, _status.event.player) + event.num * get.damageEffect(player, event.source, _status.event.player, event.nature) > 0) bool = true; - else if (event.source.hasSkillTag("nogain")) bool = true; - delete _status.olxiuhao_judging; - return bool; - }, - content: function () { - trigger.cancel(); - trigger.source.draw(2); - }, - ai: { - effect: { - target: function (card, player, target) { - if (!_status.olxiuhao_judging && get.tag(card, "damage") && get.attitude(target, player) > 0 && player != target && (!target.storage.counttrigger || !target.storage.counttrigger.olxiuhao)) return [0, 0.5, 0, 0.5]; - }, - player: function (card, player, target) { - if (!_status.olxiuhao_judging && get.tag(card, "damage") && get.attitude(player, target) > 0 && player != target && (!player.storage.counttrigger || !player.storage.counttrigger.olxiuhao)) return [0, 0.5, 0, 0.5]; - }, - }, - }, - }, - olsujian: { - trigger: { player: "phaseDiscardBefore" }, - forced: true, - content: function () { - trigger.setContent(lib.skill.olsujian.phaseDiscard); - }, - phaseDiscard: function () { - "step 0"; - game.log(player, "进入了弃牌阶段"); - game.broadcastAll(function (player) { - if (lib.config.show_phase_prompt) { - player.popup("弃牌阶段", null, false); - } - }, player); - event.trigger("phaseDiscard"); - "step 1"; - var cards = lib.skill.olsujian.update(player); - if (!cards.length) event.finish(); - else { - event.cards = cards; - var str = get.translation(cards); - player - .chooseControl() - .set("choiceList", ["将" + str + "分配给任意名其他角色", "弃置" + str + "并弃置一名其他角色至多等量的牌"]) - .set("ai", function () { - var cards = _status.event.getParent().cards, - player = _status.event.player; - if ( - !game.hasPlayer(function (current) { - return player !== current && get.attitude(player, current) > 0; - }) - ) - return 1; - if ( - game.hasPlayer(function (current) { - var att = get.attitude(player, current); - return ( - att && - current.countDiscardableCards(player, "he", function (i) { - if (att > 0) return get.value(i, current) < 0; - return get.value(i, current) >= 4; - }) >= cards.length && - get.effect(current, { name: "guohe_copy2" }, player, player) > 0 - ); - }) - ) - return 1; - return 0; - }); - } - "step 2"; - if (result.index == 1) { - cards = event.cards.filter(function (i) { - return lib.filter.cardDiscardable(i, player, "olsujian"); - }); - if (cards.length) { - event.num = cards.length; - player.discard(cards); - event.cards = cards; - } else event.finish(); - } else event.goto(5); - "step 3"; - if ( - game.hasPlayer(function (current) { - return current != player && current.countDiscardableCards(player, "he") > 0; - }) - ) { - player - .chooseTarget(true, "弃置一名其他角色的至多" + get.cnNumber(num) + "张牌", function (card, player, current) { - return current != player && current.countDiscardableCards(player, "he") > 0; - }) - .set("ai", function (current) { - var att = get.attitude(player, current); - if ( - current.countDiscardableCards(player, "he", function (i) { - if (att > 0) return get.value(i, current) >= 4; - return get.value(i, current) <= 0; - }) >= num - ) - return 4 * get.effect(current, { name: "guohe_copy2" }, player, player); - return get.effect(current, { name: "guohe_copy2" }, player, player); - }); - } else event.finish(); - "step 4"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - player.discardPlayerCard(target, true, [1, num]); - } - event.finish(); - "step 5"; - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - "step 6"; - player.chooseCardTarget({ - filterCard: function (card) { - return card.hasGaintag("olsujian"); - }, - filterTarget: lib.filter.notMe, - selectCard: [1, cards.length], - forced: true, - prompt: "请选择要分配的卡牌和目标", - ai1: function (card) { - if (!ui.selected.cards.length) return 1; - return 0; - }, - ai2: function (target) { - var player = _status.event.player, - card = ui.selected.cards[0]; - var val = target.getUseValue(card); - if (val > 0) return val * get.attitude(player, target) * 2; - return get.value(card, target) * get.attitude(player, target); - }, - }); - "step 7"; - if (result.bool) { - var res = result.cards, - target = result.targets[0].playerid; - player.removeGaintag("olsujian", res); - player.addGaintag(res, "olsujian_given"); - cards.removeArray(res); - if (!event.given_map[target]) event.given_map[target] = []; - event.given_map[target].addArray(res); - if (cards.length) event.goto(6); - } else event.finish(); - "step 8"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - var map = [], - cards = []; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - map.push([source, event.given_map[i]]); - cards.addArray(event.given_map[i]); - } - if (map.length) - game.loseAsync({ - gain_list: map, - player: player, - cards: cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - "step 9"; - event.cards = []; - }, - update: function (player) { - player.removeGaintag("olsujian"); - var hs = player.getCards("h"); - player.getHistory("gain", function (evt) { - hs.removeArray(evt.cards); - }); - if (hs.length) player.addGaintag(hs, "olsujian"); - return hs; - }, - group: "olsujian_sync", - subSkill: { - sync: { - trigger: { player: ["phaseBeginStart", "gainBegin"] }, - forced: true, - popup: false, - firstDo: true, - filter: function (event, player) { - if (event.name == "gain") return player == _status.currentPhase && event.getParent("olsujian").player != player; - return true; - }, - content: function () { - lib.skill.olsujian.update(player); - }, - }, - }, - }, - //卞夫人 - fuwei: { - audio: "wanwei", - trigger: { - player: "loseAfter", - global: "gainAfter", - }, - filter: function (event, player) { - var evt = event; - if (event.name == "lose") { - if (event.type != "discard") return false; - evt = event.getParent(); - } - if (evt[event.name == "gain" ? "bySelf" : "notBySelf"] != true) return false; - var evtx = event.getl(player); - return evtx && evtx.cards2 && evtx.cards2.length > 0; - }, - prompt2: function (event, player) { - var evt = event.getl(player), - origins = evt.cards2.map(function (i) { - return get.name(i, evt.hs.includes(i) ? player : false); - }); - return "从牌堆中获得" + get.translation(origins) + ";若没有则改为摸一张牌"; - }, - usable: 1, - content: function () { - var num = 0, - cards = [], - evt = trigger.getl(player), - origins = evt.cards2.map(function (i) { - return get.name(i, evt.hs.includes(i) ? player : false); - }); - for (var i of origins) { - var card = get.cardPile2(function (card) { - return card.name == i && !cards.includes(card); - }); - if (card) cards.push(card); - else num++; - } - if (cards.length) player.gain(cards, "gain2"); - if (num) player.draw(num); - }, - }, - yuejian: { - audio: 2, - usable: 2, - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return player != event.player && event.targets && event.targets.includes(player) && player.countCards("h") > 0; - }, - prompt2: function (event, player) { - var suit = get.suit(event.card), - hs = player.getCards("h"), - cards = event.cards.filterInD(); - if (!lib.suit.includes(suit) || !cards.length) { - return "展示所有手牌,然后无事发生"; - } - for (var i of hs) { - if (get.suit(i) == suit) { - return "展示所有手牌,然后无事发生"; - } - } - return '展示所有手牌,然后获得' + get.translation(cards) + ""; - }, - check: function (event, player) { - var suit = get.suit(event.card), - hs = player.getCards("h"), - cards = event.cards.filterInD(); - if (!lib.suit.includes(suit) || !cards.length) { - return false; - } - for (var i of hs) { - if (get.suit(i) == suit) { - return false; - } - } - return true; - }, - content: function () { - "step 0"; - player.showHandcards(get.translation(player) + "发动了【约俭】"); - var suit = get.suit(trigger.card), - hs = player.getCards("h"); - if (!lib.suit.includes(suit)) { - event.finish(); - return; - } - for (var i of hs) { - if (get.suit(i) == suit) { - event.finish(); - return; - } - } - "step 1"; - var cards = trigger.cards.filterInD(); - if (cards.length) player.gain(cards, "gain2"); - }, - }, - //杜袭 - quxi: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - direct: true, - limited: true, - skillAnimation: true, - animationColor: "water", - filter: function (event, player) { - if (player.isTurnedOver()) return false; - var list = game.filterPlayer(target => target != player && !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose")); - if (list.length < 2) return false; - var nf = list[0].countCards("h"); - for (var i = 1; i < list.length; i++) { - if (list[i].countCards("h") != nf) return true; - } - return false; - }, - content: function () { - "step 0"; - player - .chooseTarget(2, get.prompt("quxi"), "选择两名手牌数不同的其他角色。你将翻至背面,令这两名角色中手牌数较少的角色获得另一名角色的一张牌并获得一枚“丰”,另一名角色获得一枚“歉”。", function (card, player, target) { - if (player == target || target.hasMark("quxi_gain") || target.hasMark("quxi_lose")) return false; - if (!ui.selected.targets.length) return true; - return target.countCards("h") != ui.selected.targets[0].countCards("h"); - }) - .set("complexTarget", true) - .set("ai", function (target) { - if (!ui.selected.targets.length) { - var player = _status.event.player, - hs = target.countCards("h"); - if ( - game.hasPlayer(function (current) { - return current != player && current != target && current.countCards("h") > hs && !current.hasMark("quxi_gain") && !current.hasMark("quxi_lose"); - }) - ) - return get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); - return 0; - } - if (target.countCards("h") > ui.selected.targets[0].countCards("h")) return -get.attitude(_status.event.player, target); - return 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("quxi", result.targets); - player.awakenSkill("quxi"); - player.skip("phaseDiscard"); - if (result.targets[0].countCards("h") > result.targets[1].countCards("h")) result.targets.reverse(); - event.gainner = result.targets[0]; - event.giver = result.targets[1]; - player.turnOver(); - } else event.finish(); - "step 2"; - event.gainner.gainPlayerCard(event.giver, true, "he"); - "step 3"; - player.addSkill("quxi_effect"); - event.gainner.addMark("quxi_gain", 1); - event.giver.addMark("quxi_lose", 1); - }, - subSkill: { - effect: { - global: "quxi_gainlose", - trigger: { global: ["roundStart", "die"] }, - charlotte: true, - direct: true, - filter: function (event, player) { - if (event.name == "die") return event.player.countMark("quxi_gain") > 0 || event.player.countMark("quxi_lose") > 0; - return game.hasPlayer(function (target) { - return target != player && (target.countMark("quxi_gain") > 0 || target.countMark("quxi_lose") > 0); - }); - }, - content: function () { - "step 0"; - if (trigger.name == "die") { - var gain = trigger.player.countMark("quxi_gain"), - lose = trigger.player.countMark("quxi_lose"); - player - .chooseTarget("是否令一名角色获得" + get.translation(trigger.player) + "的“" + (gain && lose ? "丰”和“歉" : gain ? "丰" : "歉") + "”标记?", function (card, player, target) { - return !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose"); - }) - .set("goon", gain - lose) - .set("ai", function (target) { - var evt = _status.event; - return evt.goon * get.attitude(evt.player, target); - }); - } else event.goto(2); - "step 1"; - if (result.bool) { - var targets = result.targets; - if (targets.length < 2) targets.unshift(trigger.player); - player.logSkill("quxi_effect", targets, false); - player.line2(targets); - var gain = targets[0].countMark("quxi_gain"), - lose = targets[0].countMark("quxi_lose"); - if (gain) { - targets[0].removeMark("quxi_gain", gain); - targets[1].addMark("quxi_gain", gain); - } - if (lose) { - targets[0].removeMark("quxi_lose", lose); - targets[1].addMark("quxi_lose", lose); - } - game.delayx(); - event.finish(); - } - "step 2"; - if ( - game.hasPlayer(function (target) { - return target.countMark("quxi_gain") > 0; - }) - ) - player - .chooseTarget(2, "是否转移“丰”标记?", function (card, player, target) { - if (ui.selected.targets.length) return !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose"); - return target.countMark("quxi_gain") > 0; - }) - .set("complexTarget", true) - .set("complexSelect", true) - .set("targetprompt", ["移走标记", "获得标记"]) - .set("ai", function (target) { - var player = _status.event.player; - if (!ui.selected.targets.length) { - return -get.attitude(player, target); - } - return get.attitude(player, target); - }); - else event.goto(4); - "step 3"; - if (result.bool) { - var targets = result.targets; - player.logSkill("quxi_effect", targets, false); - player.line2(targets); - var gain = targets[0].countMark("quxi_gain"); - if (gain) { - targets[0].removeMark("quxi_gain", gain); - targets[1].addMark("quxi_gain", gain); - } - game.delayx(); - } - "step 4"; - if ( - game.hasPlayer(function (target) { - return target.countMark("quxi_lose") > 0; - }) - ) - player - .chooseTarget(2, "是否转移“歉”标记?", function (card, player, target) { - if (ui.selected.targets.length) return !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose"); - return target.countMark("quxi_lose") > 0; - }) - .set("complexTarget", true) - .set("complexSelect", true) - .set("targetprompt", ["移走标记", "获得标记"]) - .set("ai", function (target) { - var player = _status.event.player; - if (!ui.selected.targets.length) { - return get.attitude(player, target); - } - return -get.attitude(player, target); - }); - else event.finish(); - "step 5"; - if (result.bool) { - var targets = result.targets; - player.logSkill("quxi_effect", targets, false); - player.line2(targets); - var gain = targets[0].countMark("quxi_lose"); - if (gain) { - targets[0].removeMark("quxi_lose", gain); - targets[1].addMark("quxi_lose", gain); - } - game.delayx(); - } - }, - }, - gainlose: { - trigger: { player: "phaseDrawBegin" }, - forced: true, - filter: function (event, player) { - if (event.numFixed) return false; - return player.countMark("quxi_gain") - player.countMark("quxi_lose") != 0; - }, - content: function () { - trigger.num += player.countMark("quxi_gain") - player.countMark("quxi_lose"); - }, - }, - gain: { - marktext: "丰", - intro: { - name: "驱徙(丰)", - name2: "丰", - content: "mark", - }, - }, - lose: { - marktext: "歉", - intro: { - name: "驱徙(歉)", - name2: "歉", - content: "mark", - }, - }, - }, - }, - bixiong: { - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - forced: true, - filter: function (event, player) { - if (event.type != "discard" || event.getlx === false || event.getParent("phaseDiscard").player != player) return false; - var evt = event.getl(player); - return evt && evt.hs && evt.hs.length > 0; - }, - content: function () { - var cards = [], - hs = trigger.getl(player).hs; - for (var i of hs) cards.add(get.suit(i, player)); - player.addTempSkill("bixiong2", { player: "phaseBegin" }); - player.markAuto("bixiong2", cards); - }, - }, - bixiong2: { - onremove: true, - mod: { - targetEnabled: function (card, player, target) { - if (player !== target && target.getStorage("bixiong2").includes(get.suit(card))) return false; - }, - }, - intro: { content: "不能成为其他角色$牌的目标" }, - }, - //高干 - juguan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - event.filterCard( - { - name: "sha", - }, - player, - event - ) || - event.filterCard( - { - name: "juedou", - }, - player, - event - ) - ); - }, - chooseButton: { - dialog: function () { - return ui.create.dialog("拒关", [["sha", "juedou"], "vcard"]); - }, - filter: function (button, player) { - var evt = _status.event.getParent(); - return evt.filterCard( - { - name: button.link[2], - }, - player, - evt - ); - }, - check: function (button) { - return ( - _status.event.player.getUseValue({ - name: button.link[2], - }) * (button.link[2] == "juedou" ? 3 : 1) - ); - }, - backup: function (links) { - return { - audio: "juguan", - viewAs: { name: links[0][2] }, - filterCard: true, - check: function (card) { - return 6 - get.value(card); - }, - position: "hs", - onuse: function (result, player) { - player.addTempSkill("juguan_effect"); - }, - }; - }, - prompt: function (links) { - return "将一张手牌当做" + get.translation(links[0][2]) + "使用"; - }, - }, - ai: { - order: function (item, player) { - return Math.max(get.order({ name: "sha" }), get.order({ name: "juedou" })) + 0.2; - }, - result: { player: 1 }, - }, - subSkill: { - effect: { - trigger: { global: "damage" }, - forced: true, - charlotte: true, - firstDo: true, - silent: true, - popup: false, - filter: function (event, player) { - var evt = event.getParent("useCard"); - return event.card && evt && event.card == evt.card && evt.skill == "juguan_backup" && evt.player == player; - }, - content: function () { - player.addSkill("juguan_draw"); - player.markAuto("juguan_draw", [trigger.player]); - }, - }, - draw: { - audio: "juguan", - trigger: { player: "phaseDrawBegin" }, - forced: true, - charlotte: true, - onremove: true, - content: function () { - player.removeSkill("juguan_draw"); - if (!trigger.numFixed) trigger.num += 2; - }, - group: "juguan_clear", - intro: { - content: "若没有受到$的伤害,则下个摸牌阶段多摸两张牌", - }, - }, - clear: { - trigger: { player: "damage" }, - forced: true, - charlotte: true, - firstDo: true, - silent: true, - popup: false, - filter: function (event, player) { - return player.storage.juguan_draw && player.storage.juguan_draw.includes(event.source); - }, - content: function () { - player.unmarkAuto("juguan_draw", [trigger.source]); - if (!player.storage.juguan_draw || !player.storage.juguan_draw.length) player.removeSkill("juguan_draw"); - }, - }, - }, - }, - //OL鲍三娘 - olwuniang: { - audio: "xinfu_wuniang", - trigger: { player: "useCardAfter" }, - usable: 1, - filter: function (event, player) { - return event.card.name == "sha" && event.targets.length == 1 && event.targets[0].isIn(); - }, - logTarget: "targets", - content: function () { - "step 0"; - var target = trigger.targets[0]; - 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); - "step 1"; - player.addTempSkill("olwuniang2"); - player.addMark("olwuniang2", 1, false); - player.draw(); - }, - }, - olwuniang2: { - onremove: true, - charlotte: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("olwuniang2"); - }, - }, - }, - olxushen: { - derivation: "olzhennan", - audio: "xinfu_xushen", - trigger: { player: "dying" }, - limited: true, - skillAnimation: true, - animationColor: "fire", - filter: function (event, player) { - return player.hp < 1; - }, - content: function () { - "step 0"; - player.awakenSkill("olxushen"); - player.addSkills("olzhennan"); - player.recover(1 - player.hp); - "step 1"; - if ( - !player.isDying() && - !game.hasPlayer(function (current) { - return current.name1 == "guansuo" || current.name2 == "guansuo"; - }) - ) { - player - .chooseTarget(function (card, player, current) { - return current != player && current.hasSex("male"); - }, "许身:是否令一名其他男性角色选择是否将其武将牌替换为“关索”?") - .set("ai", function (target) { - return get.attitude(_status.event.player, target) - 4; - }); - } else event.finish(); - "step 2"; - if (!result.bool) { - event.finish(); - return; - } - var target = result.targets[0]; - event.target = target; - player.line(target, "fire"); - target.chooseBool("许身:是否将自己的一张武将牌替换为“关索”?"); - "step 3"; - if (result.bool) { - if (target.name2 != undefined) { - target.chooseControl(target.name1, target.name2).set("prompt", "请选择要更换的武将牌"); - } else event._result = { control: target.name1 }; - } else event.finish(); - "step 4"; - target.reinitCharacter(result.control, "guansuo"); - }, - }, - olzhennan: { - audio: "xinfu_zhennan", - enable: "phaseUse", - usable: 1, - viewAs: { name: "nanman" }, - filterCard: true, - selectCard: function () { - if (ui.selected.targets.length) return [ui.selected.targets.length, Math.min(ui.selected.targets.length + 1, game.players.length - 1)]; - return [1, Infinity]; - }, - check: function (card) { - var player = _status.event.player; - if ( - game.countPlayer(function (current) { - return current != player && player.canUse("nanman", current) && get.effect(current, { name: "nanman" }, player, player) > 0; - }) <= ui.selected.cards.length - ) - return 0; - return 6 - get.value(card); - }, - selectTarget: function () { - return ui.selected.cards.length; - }, - ai: { - order: 2, - }, - group: "olzhennan2", - }, - olzhennan2: { - trigger: { target: "useCardToBefore" }, - forced: true, - locked: false, - audio: "olzhennan", - filter: function (event, player) { - return event.card.name == "nanman"; - }, - content: function () { - trigger.cancel(); - }, - }, - //黄承彦 - guanxu: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(current => lib.skill.guanxu.filterTarget(null, player, current)); - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - var cards = get.cards(5); - for (var i = cards.length - 1; i >= 0; i--) { - ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); - } - game.updateRoundNumber(); - var hs = target.getCards("h"); - var dialog = ["观虚:选择要操作的牌", '
    ' + get.translation(target) + "的手牌
    ", hs, '
    牌堆顶
    ', cards]; - player - .chooseButton(dialog, 2) - .set("filterButton", function (button) { - if (ui.selected.buttons.length) return get.position(button.link) != get.position(ui.selected.buttons[0].link); - return true; - }) - .set("cards1", hs) - .set("cards2", cards) - .set("ai", function (button) { - var card = button.link, - cards1 = _status.event.cards1.slice(0); - var cards2 = _status.event.cards2.slice(0), - target = _status.event.getParent().target; - if (!ui.selected.buttons.length) { - if (!cards1.includes(card)) return 0; - cards1.remove(card); - var suits = cards2.map(function (i) { - return get.suit(i, target); - }); - for (var i of lib.suit) { - var num = cards1.filter(function (c) { - return get.suit(c, target) == i; - }).length; - if (num > 2 || (num > 1 && suits.includes(i))) return 20 + get.value(card); - } - return get.value(card); - } - cards1.remove(ui.selected.buttons[0].link); - cards1.push(card); - for (var i of lib.suit) { - if ( - cards1.filter(function (c) { - return get.suit(c, target) == i; - }).length > 2 - ) - return 20 - get.value(card); - return get.value(ui.selected.buttons[0].link) - get.value(card); - } - }); - "step 1"; - if (result.bool) { - var cards = result.links; - if (get.position(cards[0]) != "h") cards.reverse(); - var next = target.lose(cards[0], ui.cardPile); - next.insert_index_card = cards[1]; - next.insert_index = function (event) { - return event.insert_index_card; - }; - target.gain(cards[1], "draw"); - } else event.finish(); - "step 2"; - game.updateRoundNumber(); - var suits = [], - map = {}, - hs = target.getCards("h"); - if (hs.length) { - for (var i of hs) { - if (!lib.filter.canBeDiscarded(i, player, target, "guanxu")) continue; - var suit = get.suit(i, target); - if (!map[suit]) map[suit] = 1; - else map[suit]++; - if (map[suit] > 2) suits.add(suit); - } - var next = player.discardPlayerCard(target, 3, "visible", "h"); - next.set("suits", suits); - next.set("filterButton", function (button) { - var suit = get.suit(button.link); - if (!ui.selected.buttons.length) return _status.event.suits.includes(suit); - return suit == get.suit(ui.selected.buttons[0].link); - }); - if (suits.length) next.set("forced", true); - } - }, - ai: { - order: 9, - result: { - target: function (player, target) { - if (target.countCards("h") > 3) return -5; - if (target.countCards("h") == 3) return -3; - return -0.5; - }, - }, - }, - }, - yashi: { - trigger: { player: "damageEnd" }, - direct: true, - filter: function (event, player) { - if (event.source && event.source.isIn()) return true; - return game.hasPlayer(current => lib.skill.guanxu.filterTarget(null, player, current)); - }, - content: function () { - "step 0"; - event.addIndex = 0; - var choiceList = []; - if (trigger.source && trigger.source.isIn()) { - choiceList.push("令" + get.translation(trigger.source) + "的所有非锁定技失效"); - } else event.addIndex++; - if (game.hasPlayer(current => lib.skill.guanxu.filterTarget(null, player, current))) choiceList.push("发动一次〖观虚〗"); - player - .chooseControl("cancel2") - .set("prompt", get.prompt("yashi")) - .set("choiceList", choiceList) - .set("ai", function () { - var player = _status.event.player, - source = _status.event.getTrigger().source, - index = _status.event.getParent().addIndex; - if ( - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 3 && get.attitude(player, current) < 0; - }) - ) - return 1 - index; - if (source && source.isIn() && get.attitude(player, source) < 0 && !source.hasSkill("fengyin")) return 0; - if ( - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0 && get.attitude(player, current) < 0; - }) - ) - return 1 - index; - return "cancel2"; - }); - "step 1"; - if (result.control != "cancel2") { - if (result.index + event.addIndex == 0) { - var target = trigger.source; - player.logSkill("yashi", target); - //target.removeSkill('fengyin'); - target.addTempSkill("fengyin", { player: "phaseBegin" }); - event.finish(); - } else - player.chooseTarget(true, "请选择〖观虚〗的目标", lib.skill.guanxu.filterTarget).set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, "guanxu", player, player); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("yashi", target); - var next = game.createEvent("yashi_guanxu"); - next.player = player; - next.target = target; - next.setContent(lib.skill.guanxu.content); - } - }, - }, - //黄祖 - wangong: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - return get.type(event.card, false) == "basic"; - }, - content: function () { - player.addSkill("wangong2"); - }, - }, - wangong2: { - trigger: { player: "useCard1" }, - forced: true, - popup: false, - firstDo: true, - charlotte: true, - content: function () { - player.removeSkill("wangong2"); - if (trigger.card.name == "sha") trigger.baseDamage++; - }, - mod: { - cardUsable: function (card) { - if (card.name == "sha") return Infinity; - }, - targetInRange: function (card) { - if (card.name == "sha") return true; - }, - }, - mark: true, - intro: { - content: "使用【杀】无距离和次数限制且伤害+1", - }, - }, - //潘淑 - weiyi: { - trigger: { global: "damageEnd" }, - filter: function (event, player) { - if (player.getStorage("weiyi").includes(event.player) || !event.player.isIn()) return false; - return event.player.hp >= player.hp || event.player.isDamaged(); - }, - direct: true, - content: function () { - "step 0"; - var list = []; - if (trigger.player.hp >= player.hp) list.push("失去体力"); - if (trigger.player.hp <= player.hp && trigger.player.isDamaged()) list.push("回复体力"); - list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", get.prompt2("weiyi", trigger.player)) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getTrigger().player; - var att = get.attitude(player, target), - eff = get.recoverEffect(target, player, player); - if (target.hp <= player.hp && target.isDamaged() && att > 2 && eff > 0) { - if (player == target) { - var storage = player.getStorage("weiyi"); - if ( - player.hp >= 2 && - game.hasPlayer(function (current) { - return current.hp == player.hp + 1 && !storage.includes(current) && get.attitude(player, current) < 0; - }) - ) - return "cancel2"; - } - return "回复体力"; - } - if (target.hp >= player.hp && att < -2 && eff < 0) return "失去体力"; - return "cancel2"; - }); - "step 1"; - if (result.control != "cancel2") { - var target = trigger.player; - player.logSkill("weiyi", target); - player.markAuto("weiyi", [target]); - target[result.control == "失去体力" ? "loseHp" : "recover"](); - } - }, - onremove: true, - intro: { - content: "已令$对汝威服", - }, - }, - jinzhi: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - if (get.type(name) == "basic" && lib.inpile.includes(name) && player.countMark("jinzhi2") < player.countCards("he")) return true; - }, - filter: function (event, player) { - if (event.responded || event.jinzhi || player.countMark("jinzhi2") >= player.countCards("he")) return false; - for (var i of lib.inpile) { - if (get.type(i) == "basic" && event.filterCard({ name: i, isCard: true }, player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i of lib.inpile) { - if (get.type(i) == "basic" && event.filterCard({ name: i, isCard: true }, player, event)) { - list.push(["基本", "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } - } - } - return ui.create.dialog("锦织", [list, "vcard"], "hidden"); - }, - check: function (button) { - if (button.link[2] == "shan") return 3; - var player = _status.event.player; - if (button.link[2] == "jiu") { - if (player.getUseValue({ name: "jiu" }) <= 0) return 0; - if (player.countCards("h", "sha")) return player.getUseValue({ name: "jiu" }); - } - return player.getUseValue({ name: button.link[2], nature: button.link[3] }) / 4; - }, - backup: function (links, player) { - return { - selectCard: player.countMark("jinzhi2") + 1, - filterCard: function (card, player) { - if (ui.selected.cards.length) { - if (get.color(card) != get.color(ui.selected.cards[0])) return false; - } - return lib.filter.cardDiscardable.apply(this, arguments); - }, - complexCard: true, - viewAs: { - name: links[0][2], - nature: links[0][3], - suit: "none", - number: null, - isCard: true, - }, - position: "he", - ignoreMod: true, - check: function (card) { - var player = _status.event.player, - color = get.color(card, player); - if (player.countCards("he", { color: color }) <= player.countMark("jinzhi2") || (ui.selected.cards.length && get.color(ui.selected.cards[0], player) != color)) return -1; - if ( - lib.skill.jinzhi_backup.viewAs.name == "jiu" && - !player.countCards("h", function (cardx) { - return card != cardx && !ui.selected.cards.includes(cardx) && get.name(cardx, player) == "sha"; - }) - ) - return 0; - return Math.min(0.01, 6 - get.value(card)); - }, - precontent: function () { - player.logSkill("jinzhi"); - player.addTempSkill("jinzhi2", "roundStart"); - player.addMark("jinzhi2", 1, false); - var cards = event.result.cards; - player.discard(cards); - player.draw(); - event.result.card = { - name: event.result.card.name, - nature: event.result.card.nature, - isCard: true, - }; - event.result.cards = []; - delete event.result.skill; - if (cards.length > 1) { - var color = get.color(cards[0], player); - for (var i = 1; i < cards.length; i++) { - if (get.color(cards[i], player) != color) { - var evt = event.getParent(); - evt.set("jinzhi", true); - evt.goto(0); - return; - } - } - } - }, - }; - }, - prompt: function (links, player) { - var name = links[0][2]; - var nature = links[0][3]; - return "弃置" + get.cnNumber(player.countMark("jinzhi2") + 1) + "张颜色相同的牌并摸一张牌,然后视为使用" + (get.translation(nature) || "") + get.translation(name); - }, - }, - ai: { - order: function (item, player) { - if (_status.event.type == "phase" && !player.countMark("jinzhi2") && player.getUseValue({ name: "jiu" }, null, true) > 0 && player.countCards("h", "sha")) return get.order({ name: "jiu" }) + 1; - return 1; - }, - respondShan: true, - respondSha: true, - skillTagFilter: function (player) { - if (player.countMark("jinzhi2") >= player.countCards("he")) return false; - }, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - }, - jinzhi2: { - onremove: true, - intro: { - content: "本轮已发动过#次", - }, - }, - //宗预 - zyqiao: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - logTarget: "player", - usable: 2, - preHidden: true, - filter: function (event, player) { - var source = event.player; - if (source == player) return false; - if (get.mode() == "guozhan" && source.isFriendOf(player)) return false; - return source.countDiscardableCards(player, "he") > 0; - }, - check: function (event, player) { - var target = event.player; - if (get.attitude(player, target) >= 0) return false; - if ( - !player.countCards("he", function (card) { - return lib.filter.cardDiscardable(card, player, "zyqiao"); - }) - ) - return true; - if (player.countCards("he", card => get.value(card, player) < 5)) return true; - if (target.countCards("he", card => get.value(card, target) > 6) && player.countCards("he", card => get.value(card, player) < 7)) return true; - return false; - }, - content: function () { - "step 0"; - player.discardPlayerCard(trigger.player, true, "he"); - "step 1"; - if ( - player.countCards("he", function (card) { - return lib.filter.cardDiscardable(card, player, "zyqiao"); - }) - ) - player.chooseToDiscard("he", true); - }, - }, - chengshang: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - if (!lib.suit.includes(get.suit(event.card, false)) || typeof get.number(event.card) != "number") return false; - if ( - player.getHistory("sourceDamage", function (evt) { - return evt.card == event.card; - }).length - ) - return false; - var phsu = event.getParent("phaseUse"); - if (!phsu || phsu.player != player) return false; - if ( - player.getHistory("gain", function (evt) { - return evt.getParent().name == "chengshang"; - }).length - ) - return false; - for (var i of event.targets) { - if (i != player && (get.mode() != "guozhan" || i.isEnemyOf(player))) return true; - } - return false; - }, - preHidden: true, - content: function () { - var suit = get.suit(trigger.card); - var number = get.number(trigger.card); - var cards = []; - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var card = ui.cardPile.childNodes[i]; - if (card.suit == suit && card.number == number) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - }, - }, - //新丁奉 - reduanbing: { - audio: 2, - audioname: ["heqi"], - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - return game.hasPlayer(function (current) { - return !event.targets.includes(current) && get.distance(player, current) <= 1 && player.canUse(event.card, current); - }); - }, - direct: true, - preHidden: ["reduanbing_sha"], - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("reduanbing"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { - return !_status.event.sourcex.includes(target) && get.distance(player, target) <= 1 && player.canUse(_status.event.card, target); - }) - .set("sourcex", trigger.targets) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, _status.event.card, player, player); - }) - .set("card", trigger.card) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - player.logSkill("reduanbing", event.target); - trigger.targets.push(event.target); - }, - ai: { - effect: { - player: function (card, player, target, current, isLink) { - if (!isLink && card.name == "sha") { - if (player._reduanbingtmp) return; - player._reduanbingtmp = true; - if (get.effect(target, card, player, player) <= 0) { - delete player._reduanbingtmp; - return; - } - if ( - game.hasPlayer(function (current) { - return current != target && get.distance(player, current) <= 1 && player.canUse(card, current) && get.effect(current, card, player, player) > 0; - }) - ) { - delete player._reduanbingtmp; - return [1, 1]; - } - delete player._reduanbingtmp; - } - }, - }, - }, - group: "reduanbing_sha", - subSkill: { - sha: { - audio: "duanbing", - audioname: ["heqi"], - trigger: { player: "useCardToPlayered" }, - forced: true, - filter: function (event, player) { - return event.card.name == "sha" && !event.getParent().directHit.includes(event.target) && get.distance(player, event.target) <= 1; - }, - logTarget: "target", - content: function () { - var id = trigger.target.playerid; - var map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].shanRequired == "number") { - map[id].shanRequired++; - } else { - map[id].shanRequired = 2; - } - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (arg.card.name != "sha" || arg.target.countCards("h", "shan") > 1 || get.distance(player, arg.target) > 1) return false; - }, - }, - }, - }, - }, - refenxun: { - audio: "fenxun", - enable: "phaseUse", - usable: 1, - position: "he", - filterTarget: function (card, player, target) { - return target != player; - }, - content: function () { - player.markAuto("refenxun2", targets); - player.addTempSkill("refenxun2"); - }, - ai: { - order: 6.5, - result: { - player: function (player, target) { - if (get.distance(player, target) <= 1) return 0; - var hs = player.getCards("h", "shunshou"); - if (hs.length && player.canUse(hs[0], target, false)) { - return 1; - } - var geteff = function (current) { - return player.canUse("sha", current, false, true) && get.effect(current, { name: "sha" }, player, player) > 0; - }; - if (player.hasSha() && geteff(target)) { - var num = game.countPlayer(function (current) { - return current != player && get.distance(player, current) <= 1 && geteff(current); - }); - if (num == 0) { - if ( - game.hasPlayer(function (current) { - return player.canUse("sha", current) && geteff(current) && current != target; - }) - ) { - return 1; - } - } else if (num == 1) { - return 1; - } - } - return 0; - }, - }, - }, - }, - refenxun2: { - audio: "fenxun", - trigger: { - player: "phaseJieshuBegin", - }, - forced: true, - charlotte: true, - filter: function (event, player) { - return ( - player.getHistory("sourceDamage", function (evt) { - return player.storage.refenxun2.includes(evt.player); - }).length == 0 && - player.countCards("he", function (card) { - return lib.filter.cardDiscardable(card, player, "refenxun2"); - }) > 0 - ); - }, - content: function () { - player.chooseToDiscard("he", true); - }, - onremove: true, - intro: { - content: "到$的距离视为1", - }, - mod: { - globalFrom: function (from, to) { - if (from.storage.refenxun2.includes(to)) { - return -Infinity; - } - }, - }, - }, - //蔡阳新技能 - zhuixi: { - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - }, - //新塌顿 - reluanzhan: { - audio: "luanzhan", - trigger: { - player: "damageEnd", - source: "damageSource", - }, - forced: true, - locked: false, - content: function () { - player.addMark("reluanzhan", 1, false); - }, - intro: { content: "mark" }, - ai: { notemp: true }, - group: ["reluanzhan_add", "reluanzhan_remove"], - }, - reluanzhan_add: { - trigger: { player: "useCard2" }, - direct: true, - filter: function (event, player) { - if ((event.card.name != "sha" && (get.color(event.card) != "black" || get.type(event.card) != "trick")) || !player.countMark("reluanzhan")) return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var num = player.countMark("reluanzhan"); - var prompt2 = "为" + get.translation(trigger.card) + "增加至多" + get.cnNumber(num) + "个目标"; - player - .chooseTarget( - get.prompt("reluanzhan"), - function (card, player, target) { - if (_status.event.targets.includes(target)) return false; - var player = _status.event.player; - return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); - }, - [1, num] - ) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("reluanzhan", event.targets); - trigger.targets.addArray(event.targets); - } - }, - }, - reluanzhan_remove: { - audio: "luanzhan", - trigger: { player: "useCardToPlayered" }, - forced: true, - locked: false, - filter: function (event, player) { - if (!event.isFirstTarget || (event.card.name != "sha" && (get.color(event.card) != "black" || get.type(event.card) != "trick")) || !player.countMark("reluanzhan")) return false; - var info = get.info(event.card); - if (info.allowMultiple == false || info.multitarget) return false; - return event.targets.length < player.countMark("reluanzhan"); - }, - content: function () { - player.removeMark("reluanzhan", Math.ceil(player.countMark("reluanzhan") / 2)); - }, - }, - //卧龙凤雏双头祈福 - youlong: { - enable: "chooseToUse", - audio: 2, - audioname: ["key_sakuya"], - zhuanhuanji: true, - marktext: "☯", - mark: true, - intro: { - content: function (storage, player) { - return storage ? "每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。" : "每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌。"; - }, - }, - init: function (player) { - player.storage.youlong = false; - if (!player.storage.youlong2) player.storage.youlong2 = []; - }, - hiddenCard: function (player, name) { - if (player.storage.youlong2.includes(name) || !player.hasEnabledSlot()) return false; - if (player.hasSkill("youlong_" + (player.storage.youlong || false))) return false; - var type = get.type(name); - if (player.storage.youlong) return type == "basic"; - return type == "trick"; - }, - filter: function (event, player) { - if (player.storage.youlong2.includes(name) || !player.hasEnabledSlot()) return false; - if (player.hasSkill("youlong_" + (player.storage.youlong || false))) return false; - var type = player.storage.youlong ? "basic" : "trick"; - for (var name of lib.inpile) { - if (player.storage.youlong2.includes(name)) continue; - if (get.type(name) != type) continue; - if (event.filterCard({ name: name, isCard: true }, player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var dialog = ui.create.dialog("游龙", "hidden"); - const equips = []; - for (let i = 1; i < 6; i++) { - if (!player.hasEnabledSlot(i)) continue; - equips.push([i, get.translation("equip" + i)]); - } - if (equips.length > 0) dialog.add([equips, "tdnodes"]); - var type = player.storage.youlong ? "basic" : "trick"; - var list = []; - for (var name of lib.inpile) { - if (player.storage.youlong2.includes(name)) continue; - if (get.type(name) != type) continue; - if (event.filterCard({ name: name, isCard: true }, player, event)) { - list.push([type, "", name]); - if (name == "sha") { - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } - } - } - dialog.add([list, "vcard"]); - return dialog; - }, - filter: function (button) { - if (ui.selected.buttons.length && typeof button.link == typeof ui.selected.buttons[0].link) return false; - return true; - }, - select: 2, - check: function (button) { - var player = _status.event.player; - if (typeof button.link == "number") { - var card = player.getEquip(button.link); - if (card) { - var val = get.value(card); - if (val > 0) return 0; - return 5 - val; - } - switch (button.link) { - case 3: - return 4.5; - case 4: - return 4.4; - case 5: - return 4.3; - case 2: - return (3 - player.hp) * 1.5; - case 1: { - if ( - game.hasPlayer(function (current) { - return (get.realAttitude || get.attitude)(player, current) < 0 && get.distance(player, current) > 1; - }) - ) - return 0; - return 3.2; - } - } - } - var name = button.link[2]; - var evt = _status.event.getParent(); - if (evt.type == "phase") { - var card = { name: name, nature: button.link[3], isCard: true }; - if (name == "shan") return 2; - if (evt.type == "dying") { - if (get.attitude(player, evt.dying) < 2) return false; - if (name == "jiu") return 2.1; - return 1.9; - } - return player.getUseValue(card); - } - return 1; - }, - backup: function (links, player) { - if (typeof links[1] == "number") links.reverse(); - var equip = links[0]; - var name = links[1][2]; - var nature = links[1][3]; - return { - filterCard: function () { - return false; - }, - selectCard: -1, - equip: equip, - viewAs: { - name: name, - nature: nature, - isCard: true, - }, - popname: true, - precontent: function () { - player.logSkill("youlong"); - player.disableEquip(lib.skill.youlong_backup.equip); - delete event.result.skill; - player.addTempSkill("youlong_" + (player.storage.youlong || false), "roundStart"); - player.changeZhuanhuanji("youlong"); - player.storage.youlong2.add(event.result.card.name); - }, - }; - }, - prompt: function (links, player) { - if (typeof links[1] == "number") links.reverse(); - var equip = "equip" + links[0]; - var name = links[1][2]; - var nature = links[1][3]; - return "废除自己的" + get.translation(equip) + "栏,视为使用" + (get.translation(nature) || "") + get.translation(name); - }, - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - if (arg == "respond") return false; - if (!player.storage.youlong || player.hasSkill("youlong_true")) return false; - var name = tag == "respondSha" ? "sha" : "shan"; - return !player.storage.youlong2.includes(name); - }, - order: function (item, player) { - if (player && _status.event.type == "phase") { - var max = 0, - add = false; - var type = player.storage.youlong ? "basic" : "trick"; - var list = lib.inpile.filter(name => get.type(name) == type && !player.storage.youlong2.includes(name)); - if (list.includes("sha")) add = true; - list = list.map(namex => { - return { name: namex, isCard: true }; - }); - if (add) lib.inpile_nature.forEach(naturex => list.push({ name: "sha", nature: naturex, isCard: true })); - for (var card of list) { - if (player.getUseValue(card) > 0) { - var temp = get.order(card); - if (temp > max) max = temp; - } - } - if (max > 0) max += 0.3; - return max; - } - return 1; - }, - result: { player: 1 }, - }, - }, - youlong_true: { charlotte: true }, - youlong_false: { charlotte: true }, - luanfeng: { - audio: 2, - audioname: ["key_sakuya"], - trigger: { global: "dying" }, - filter: function (event, player) { - return event.player.maxHp >= player.maxHp && event.player.hp < 1; - }, - limited: true, - skillAnimation: true, - animationColor: "soil", - logTarget: "player", - check: function (event, player) { - if (get.attitude(player, event.player) < 4) return false; - if ( - player.countCards("h", function (card) { - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, event.player, "unchanged", "cardSavable", player); - if (mod != "unchanged") return mod; - var savable = get.info(card).savable; - if (typeof savable == "function") savable = savable(card, player, event.player); - return savable; - }) >= - 1 - event.player.hp - ) - return false; - if (event.player == player || event.player == get.zhu(player)) return true; - return !player.hasUnknown(); - }, - content: function () { - "step 0"; - player.awakenSkill("luanfeng"); - trigger.player.recover(3 - trigger.player.hp); - "step 1"; - var list = [], - target = trigger.player; - for (var i = 1; i < 6; i++) { - for (var j = 0; j < target.countDisabledSlot(i); j++) { - list.push(i); - } - } - if (list.length > 0) target.enableEquip(list); - if (list.length < 6) target.drawTo(6 - list.length); - if (target.storage.kotarou_rewrite) target.storage.kotarou_rewrite = []; - if (player == target) player.storage.youlong2 = []; - }, - }, - //曹爽,韩遂,何进 - xiaoxi: { - audio: 2, - audioname: ["machao", "hansui", "pangde"], - trigger: { - player: "enterGame", - global: "phaseBefore", - }, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - direct: true, - content: function () { - player.chooseUseTarget("sha", get.prompt("xiaoxi"), "视为使用一张【杀】").logSkill = "xiaoxi"; - }, - }, - spmouzhu: { - enable: "phaseUse", - audio: "mouzhu", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(current => lib.skill.spmouzhu.filterTarget(null, player, current)); - }, - filterTarget: function (card, player, target) { - if (!target.countCards("h")) return false; - return player != target && (target.hp == player.hp || get.distance(player, target) == 1); - }, - selectTarget: [1, Infinity], - content: function () { - "step 0"; - target.chooseCard("h", "交给" + get.translation(player) + "一张牌", true); - "step 1"; - if (result.bool) target.give(result.cards, player); - "step 2"; - if (player.countCards("h") <= target.countCards("h")) { - event.finish(); - return; - } - var list = []; - if (target.canUse("sha", player, false)) list.push("sha"); - if (target.canUse("juedou", player, false)) list.push("juedou"); - if (!list.length) event.finish(); - else if (list.length == 1) event._result = { control: list[0] }; - else - target.chooseControl(list).set("prompt", "对" + get.translation(player) + "使用一张【杀】或【决斗】。").ai = function () { - return get.effect(player, { name: "sha" }, target, target) >= get.effect(player, { name: "juedou" }, target, target) ? "sha" : "juedou"; - }; - "step 3"; - target.useCard({ name: result.control, isCard: true }, player, "noai"); - }, - ai: { - order: 7, - result: { - target: -1.2, - player: function (player, target) { - if (ui.selected.targets.length) return 0; - if (target.countCards("h") - player.countCards("h") > 1) return 1; - if (get.damageEffect(target, player, player, player) > 0) return 1; - if (player.hp > 3 || (player.countCards("h", "sha") && player.countCards("h", "shan"))) return 0; - if (player.hp > 2) return -1.1; - return -2; - }, - }, - }, - }, - spyanhuo: { - audio: "yanhuo", - trigger: { player: "die" }, - forceDie: true, - skillAnimation: true, - animationColor: "soil", - content: function () { - player.line(game.players, "green"); - game.addGlobalSkill("spyanhuo_damage"); - if (!_status.yanhuo) _status.yanhuo = 0; - _status.yanhuo++; - }, - subSkill: { - damage: { - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - return event.card.name == "sha"; - }, - content: function () { - trigger.baseDamage += _status.yanhuo || 0; - }, - }, - }, - }, - spniluan: { - enable: "phaseUse", - audio: "niluan", - viewAs: { name: "sha" }, - check: function (card) { - return 5.1 - get.value(card); - }, - filterCard: { color: "black" }, - position: "hes", - viewAsFilter: function (player) { - return player.countCards("hes", lib.skill.spniluan.filterCard) > 0; - }, - group: "spniluan_clear", - }, - spniluan_clear: { - trigger: { player: "useCardAfter" }, - forced: true, - silent: true, - charlotte: true, - filter: function (event, player) { - return ( - event.skill == "spniluan" && - event.addCount !== false && - player.getHistory("sourceDamage", function (card) { - return card.card == event.card; - }).length == 0 - ); - }, - content: function () { - trigger.addCount = false; - if (player.stat[player.stat.length - 1].card.sha > 0) { - player.stat[player.stat.length - 1].card.sha--; - } - }, - }, - spweiwu: { - audio: 2, - locked: false, - enable: "phaseUse", - usable: 1, - viewAs: { - name: "shunshou", - storage: { spweiwu: true }, - }, - filterCard: { color: "red" }, - position: "hes", - check: function (card) { - return 7 - get.value(card); - }, - mod: { - targetInRange: function (card) { - if (card.storage && card.storage.spweiwu) return true; - }, - }, - }, - tuogu: { - audio: 2, - trigger: { global: "die" }, - filter: function (event, player) { - return ( - event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { - var info = get.info(skill); - return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; - }).length > 0 - ); - }, - logTarget: "player", - skillAnimation: true, - limited: true, - animationColor: "thunder", - content: function () { - "step 0"; - player.awakenSkill("tuogu"); - var list = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { - var info = get.info(skill); - return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; - }); - if (list.length == 1) event._result = { control: list[0] }; - else - trigger.player - .chooseControl(list) - .set("prompt", "选择令" + get.translation(player) + "获得一个技能") - .set("forceDie", true) - .set("ai", function () { - return list.randomGet(); - }); - "step 1"; - player.addSkills(result.control); - game.broadcastAll(function (skill) { - var list = [skill]; - game.expandSkills(list); - for (var i of list) { - var info = lib.skill[i]; - if (!info) continue; - if (!info.audioname2) info.audioname2 = {}; - info.audioname2.caoshuang = "tuogu"; - } - }, result.control); - }, - }, - retuogu: { - audio: "tuogu", - trigger: { global: "die" }, - filter: function (event, player) { - return ( - event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { - var info = get.info(skill); - return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; - }).length > 0 - ); - }, - logTarget: "player", - check: function (event, player) { - var list = event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { - var info = get.info(skill); - return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; - }); - var negSkill = list.some(function (skill) { - return get.skillRank(skill, "inout") <= 0; - }); - var att = get.sgnAttitude(event.player, player); - if (!player.storage.retuogu) { - if (negSkill && att < 0) return false; - return true; - } - list.sort(function (a, b) { - return att * (get.skillRank(b, "inout") - get.skillRank(a, "inout")); - })[0]; - return get.skillRank(list[0], "inout") >= get.skillRank(player.storage.retuogu, "inout"); - }, - content: function () { - "step 0"; - var list = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { - var info = get.info(skill); - return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; - }); - if (list.length == 1) event._result = { control: list[0] }; - else - trigger.player - .chooseControl(list) - .set("prompt", "选择令" + get.translation(player) + "获得一个技能") - .set("forceDie", true) - .set("ai", function () { - var att = get.sgnAttitude(_status.event.getTrigger().player, player); - if (att == 0) return list.randomGet(); - var listx = list - .map(function (skill) { - return [skill, get.skillRank(skill, "inout")]; - }) - .sort(function (a, b) { - return att * (b[1] - a[1]); - }) - .slice(0, 2); - var listx2 = [0]; - if (Math.abs(listx[0][1] - listx[1][1]) <= 0.5 && Math.sign(listx[0][1]) == Math.sign(listx[1][1])) listx2.push(1); - return listx[listx2.randomGet()][0]; - }); - "step 1"; - if (player.storage.retuogu) player.removeSkill(player.storage.retuogu); - player.storage.retuogu = result.control; - player.markSkill("retuogu"); - player.addSkills(result.control); - game.broadcastAll(function (skill) { - var list = [skill]; - game.expandSkills(list); - for (var i of list) { - var info = lib.skill[i]; - if (!info) continue; - if (!info.audioname2) info.audioname2 = {}; - info.audioname2.caoshuang = "tuogu"; - } - }, result.control); - }, - mark: true, - intro: { content: "当前托孤技能:$" }, - }, - shanzhuan: { - trigger: { source: "damageSource" }, - audio: 2, - direct: true, - filter: function (event, player) { - return player != event.player && !event.player.isDisabledJudge() && event.player.countCards("he") && !event.player.countCards("j", card => get.type(card.viewAs || card.name) == "delay"); - }, - content: function () { - "step 0"; - player.choosePlayerCard(trigger.player, "he", get.prompt("shanzhuan", trigger.player)).set("ai", function (card) { - if (get.attitude(_status.event.player, _status.event.target) >= 0) return 0; - return get.buttonValue(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("shanzhuan", trigger.player); - var card = result.cards[0]; - trigger.player.$throw(card); - game.delayx(); - if (get.type(card, false) == "delay") trigger.player.addJudge(card); - else trigger.player.addJudge({ name: get.color(card, false) == "red" ? "lebu" : "bingliang" }, result.cards); - } - }, - group: "shanzhuan_draw", - subfrequent: ["draw"], - subSkill: { - draw: { - audio: "shanzhuan", - trigger: { player: "phaseEnd" }, - frequent: true, - prompt: "是否发动【擅专】摸一张牌?", - filter: function (event, player) { - return !player.getHistory("sourceDamage").length; - }, - content: function () { - player.draw(); - }, - }, - }, - }, - olxingshen: { - trigger: { player: "damageEnd" }, - frequent: true, - audio: "xingshen", - content: function () { - "step 0"; - var next = player.draw(); - if (get.isLuckyStar(player) || Math.random() < 0.5) next.num = 2; - var num = player.countMark("olxingshen"); - if (num < 6) player.addMark("olxingshen", Math.min(6 - num, player.getDamagedHp()), false); - }, - intro: { - content: "下一次发动〖严教〗时多展示X张牌", - }, - }, - //张道陵 - zlhuji: { - mod: { - globalFrom: function (player, target, distance) { - return distance - 1; - }, - }, - trigger: { player: "damageEnd" }, - forced: true, - filter: function (event, player) { - return player != _status.currentPhase; - }, - content: function () { - "step 0"; - var func = function (result) { - if (get.color(result) == "red") return 1; - return 0; - }; - if (get.itemtype(trigger.source) != "player" || !player.canUse("sha", trigger.source, false)) - func = function (result) { - return 0; - }; - else if (get.effect(trigger.source, { name: "sha" }, player, player) < 0) - func = function (result) { - if (get.color(result) == "red") return -1; - return 0; - }; - player.judge(func).judge2 = function (result) { - return result.color == "red" ? true : false; - }; - "step 1"; - if (result.color == "red" && get.itemtype(trigger.source) == "player" && player.canUse("sha", trigger.source, false)) { - player.useCard({ name: "sha", isCard: true }, trigger.source, false, "noai"); - } - }, - }, - zlshoufu: { - enable: "phaseUse", - usable: 1, - delay: false, - content: function () { - "step 0"; - player.draw(); - "step 1"; - var filterTarget = function (card, player, target) { - return target != player && !target.hasSkill("zlshoufu2"); - }; - if ( - !player.countCards("h") || - !game.hasPlayer(function (current) { - return filterTarget(null, player, current); - }) - ) - event.finish(); - else - player.chooseCardTarget({ - forced: true, - prompt: "将一张手牌作为“箓”置于其他角色的武将牌上", - filterTarget: filterTarget, - filterCard: true, - position: "h", - ai1: function (card) { - if (get.type(card, false) == "equip") return 1 - get.value(card); - return 7 - get.value(card); - }, - ai2: function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att > 0) return -att; - return -att / get.distance(player, target, "absolute"); - }, - }); - "step 2"; - var target = result.targets[0]; - var cards = result.cards; - target.addToExpansion(cards, player, "give").gaintag.add("zlshoufu2"); - player.line(target, "green"); - if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.12); - target.addSkill("zlshoufu2"); - "step 3"; - game.delayx(); - }, - ai: { - notemp: true, - order: 1, - result: { - player: function (player) { - if ( - game.hasPlayer(function (target) { - return target != player && !target.hasSkill("zlshoufu2") && get.attitude(player, target) < 0; - }) || - !game.hasPlayer(function (target) { - return target != player && !target.hasSkill("zlshoufu2") && get.attitude(player, target) > 0; - }) - ) - return 1; - return 0; - }, - }, - }, - }, - zlshoufu2: { - marktext: "箓", - intro: { - content: "expansion", - markcount: "expansion", - }, - charlotte: true, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - mod: { - cardEnabled: function (card, player) { - if ( - player.getExpansions("zlshoufu2").filter(function (magic) { - return get.type2(magic) == get.type2(card); - }).length - ) - return false; - }, - cardRespondable: function (card, player) { - if ( - player.getExpansions("zlshoufu2").filter(function (magic) { - return get.type2(magic) == get.type2(card); - }).length - ) - return false; - }, - cardSavable: function (card, player) { - if ( - player.getExpansions("zlshoufu2").filter(function (magic) { - return get.type2(magic) == get.type2(card); - }).length - ) - return false; - }, - }, - trigger: { - player: ["damageEnd", "loseAfter"], - global: "loseAsyncAfter", - }, - forced: true, - filter: function (event, player) { - var storage = player.getExpansions("zlshoufu2"); - if (!storage.length) return false; - if (event.name == "damage") return true; - if (event.type != "discard" || event.getlx === false || event.getParent("phaseDiscard").player != player) return false; - var num = 0, - evt = event.getl(player); - if (!evt || !evt.cards2) return false; - for (var i of evt.cards2) { - if ( - storage.filter(function (magic) { - return get.type2(magic) == get.type2(i, event.hs.includes(i) ? player : false); - }).length - ) - num++; - } - return num > 1; - }, - content: function () { - player.removeSkill("zlshoufu2"); - }, - }, - //蔡阳 - yinka: { - trigger: { player: ["drawBegin", "judgeBegin"] }, - direct: true, - filter: function () { - return ui.cardPile.childNodes.length > 0; - }, - content: function () { - "step 0"; - player.chooseButton(["印卡:请选择要置于牌堆" + (trigger.bottom ? "底" : "顶") + "的牌(先选择的在上)", Array.from(ui.cardPile.childNodes)], [1, trigger.num || 1]); - "step 1"; - if (result.bool) { - while (result.links.length) { - if (trigger.bottom) { - var card = result.links.shift(); - ui.cardPile.removeChild(card); - ui.cardPile.appendChild(card); - } else { - var card = result.links.pop(); - ui.cardPile.removeChild(card); - ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - } - } - } - }, - ai: { isLuckyStar: true }, - }, - //新王允 - xinlianji: { - enable: "phaseUse", - audio: "wylianji", - usable: 1, - check: function (card) { - return 5 - get.value(card); - }, - filterTarget: function (card, player, target) { - if (ui.selected.targets.length) return true; - return target != player; - }, - filterCard: true, - selectTarget: 2, - multitarget: true, - targetprompt: ["打人", "被打"], - content: function () { - "step 0"; - //player.addMark('xinlianji',1,false); - var card = get.cardPile2(function (card) { - return get.subtype(card) == "equip1" && targets[0].hasUseTarget(card); - }); - if (card) { - if (card.name == "qinggang" && !lib.inpile.includes("qibaodao")) { - card.remove(); - card = game.createCard("qibaodao", card.suit, card.number); - } - targets[0].chooseUseTarget(card, true, "nopopup", "nothrow"); - } else { - player.chat("没有装备牌了吗"); - game.log("但是牌堆里已经没有装备牌了!"); - } - "step 1"; - game.updateRoundNumber(); - targets[0] - .chooseToUse("对" + get.translation(targets[1]) + "使用一张杀,或将装备区里的武器牌交给一名其他角色", { name: "sha" }) - .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", targets[1]) - .set("addCount", false); - "step 2"; - var cards = targets[0].getEquips(1); - if (!result.bool && cards.length) { - event.cards = cards; - player.chooseTarget(true, "将" + get.translation(cards) + "交给一名其他角色").set("ai", function (target) { - var card = _status.event.getParent().cards; - return (target.hasSkillTag("nogain") ? 0 : get.attitude(_status.event.player, target)) * Math.max(0.1, target.getUseValue(cards[0])); - }); - } else event.finish(); - "step 3"; - result.targets[0].gain(cards, result.targets[0], "give").giver = player; - }, - ai: { - order: 4, - result: { - target: function (player, target) { - if (ui.selected.targets.length) { - var pretarget = ui.selected.targets[0]; - if (pretarget.hasSha() && pretarget.canUse({ name: "sha" }, target)) return get.effect(target, { name: "sha" }, pretarget, target); - return Math.random(); - } - if (!target.getEquip(1)) { - if ( - game.hasPlayer(function (current) { - return current != target && !current.hasSkillTag("nogain") && get.attitude(current, target) > 0; - }) - ) - return 3; - return -3; - } - if ( - !game.hasPlayer(function (current) { - return current != target && !current.hasSkillTag("nogain") && get.attitude(current, target) > 0; - }) - ) - return -6; - return 4 - get.value(target.getEquip(1)); - }, - }, - }, - }, - xinmoucheng: { - trigger: { player: "phaseZhunbeiBegin" }, - audio: "moucheng", - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "gray", - derivation: "xinjingong", - unique: true, - filter: function (event, player) { - return game.hasPlayer2(function (current) { - return ( - current.getAllHistory("sourceDamage", function (evt) { - if (!evt.card || evt.card.name != "sha" || evt.getParent().type != "card") return false; - var evt2 = evt.getParent(4); - return evt2 && evt2.name == "xinlianji" && evt2.player == player; - }).length > 0 - ); - }); - }, - content: function () { - player.awakenSkill("xinmoucheng"); - player.changeSkills(["xinjingong"], ["xinlianji"]); - }, - ai: { - combo: "xinlianji" - }, - }, - xinjingong: { - audio: "jingong", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - event.xinjingong_list && - player.countCards("hes", function (card) { - return card.name == "sha" || get.type(card) == "equip"; - }) - ); - }, - onChooseToUse: function (event) { - if (!game.online) { - var evt = event.getParent(); - if (evt.name != "phaseUse") return; - if (!evt.xinjingong_list) { - var list = get.inpile("trick").randomGets(2); - if (Math.random() < 0.5) { - list.push("wy_meirenji"); - } else { - list.push("wy_xiaolicangdao"); - } - evt.xinjingong_list = list; - } - if (!event.xinjingong_list) event.set("xinjingong_list", evt.xinjingong_list); - } - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i of event.xinjingong_list) list.push(["锦囊", "", i]); - return ui.create.dialog("矜功", [list, "vcard"]); - }, - filter: function (button, player) { - return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent()); - }, - check: function (button) { - return _status.event.player.getUseValue({ name: button.link[2] }); - }, - backup: function (links, player) { - return { - audio: "jingong", - popname: true, - position: "hes", - viewAs: { name: links[0][2] }, - check: function (card) { - return 6 - get.value(card); - }, - filterCard: function (card) { - return card.name == "sha" || get.type(card) == "equip"; - }, - }; - }, - prompt: function (links, player) { - return "将一张【杀】或装备牌当做" + get.translation(links[0][2]) + "使用"; - }, - }, - ai: { - order: 2, - result: { - player: 1, - }, - }, - }, - //孙邵 - bizheng: { - trigger: { player: "phaseDrawEnd" }, - direct: true, - audio: 2, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("bizheng"), lib.filter.notMe).set("ai", function (target) { - var player = _status.event.player; - if (player.countCards("h") > player.maxHp) return 0; - var att = get.attitude(player, target); - if (att <= 0 || target.hasSkillTag("nogain")) return 0; - if (target.maxHp - target.countCards("h") >= 2) return att; - return att / 2; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("bizheng", target); - target.draw(2); - } else event.finish(); - "step 2"; - if (player.countCards("h") > player.maxHp) player.chooseToDiscard(2, "he", true); - "step 3"; - if (target.countCards("h") > target.maxHp) target.chooseToDiscard(2, "he", true); - }, - ai: { - expose: 0.25, - }, - }, - yidian: { - trigger: { player: "useCard2" }, - filter: function (event, player) { - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - for (var i = 0; i < ui.discardPile.childElementCount; i++) { - if (ui.discardPile.childNodes[i].name == event.card.name) return false; - } - if ( - game.hasPlayer(function (current) { - return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current); - }) - ) { - return true; - } - } - return false; - }, - direct: true, - content: function () { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - player - .chooseTarget(get.prompt("yidian"), function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card, player, target); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("yidian", event.targets); - trigger.targets.addArray(event.targets); - } - }, - ai: { - expose: 0.25, - }, - }, - //二袁 - neifa: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - content: function () { - "step 0"; - _status.noclearcountdown = true; - if ( - game.hasPlayer(function (current) { - return current.countGainableCards(player, "ej") > 0; - }) - ) { - player - .chooseControl("cancel2") - .set("choiceList", ["摸两张牌,然后弃置一张牌", "获得场上的一张牌,然后弃置一张牌"]) - .set("prompt", get.prompt("neifa")) - .set("ai", function () { - if ( - game.hasPlayer(function (current) { - var att = get.attitude(player, current); - if (att == 0) return false; - if (att < 0) - return ( - current.countCards("e", function (card) { - return get.value(card, current) > 5; - }) > 0 - ); - return ( - current.countCards("ej", function (card) { - return get.position(card) == "j" || get.value(card, current) <= 0; - }) > 0 - ); - }) - ) - return 1; - return 0; - }); - } else { - player.chooseControl("ok", "cancel2").set("prompt", get.prompt2("neifa")); - } - "step 1"; - if (result.control == "cancel2") { - delete _status.noclearcountdown; - if (!_status.noclearcountdown) { - game.stopCountChoose(); - } - event.finish(); - return; - } else if (result.index == 1) { - player - .chooseTarget("请选择一名角色,获得其装备区或判定区内的一张牌", true, function (card, player, target) { - return target.countGainableCards(player, "ej") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if ( - att > 0 && - target.countCards("ej", function (card) { - return get.position(card) == "j" || get.value(card, target) <= 0; - }) - ) - return 2 * att; - else if ( - att < 0 && - target.countCards("e", function (card) { - return get.value(card, target) > 5; - }) - ) - return -att; - return -1; - }); - } else { - delete _status.noclearcountdown; - if (!_status.noclearcountdown) { - game.stopCountChoose(); - } - player.logSkill("neifa"); - player.draw(2); - event.goto(3); - } - "step 2"; - delete _status.noclearcountdown; - if (!_status.noclearcountdown) { - game.stopCountChoose(); - } - if (result.bool) { - var target = result.targets[0]; - player.logSkill("neifa", target); - player.gainPlayerCard(target, "ej", true); - } - "step 3"; - player.chooseToDiscard(true, "he").set("ai", function (cardx) { - var player = _status.event.player; - var num = 0; - var hs = player.getCards("h"); - var muniu = player.getEquip("muniu"); - var subs = []; - if (muniu && muniu.cards) hs = hs.concat(muniu.cards); - if (get.type(cardx) == "basic") { - var shas = hs.filter(function (card) { - return card != cardx && get.name(card, player) == "sha" && player.hasValueTarget(card); - }); - var numx = player.countCards("h", function (card) { - return get.type(card, player) != "basic"; - }); - num += Math.min(numx, Math.max(0, shas.length - player.getCardUsable("sha"))) * 0.7; - num += - Math.min( - player.getCardUsable("sha") + numx, - shas.filter(function (card) { - return ( - game.countPlayer(function (current) { - return player.canUse(card, current) && get.effect(current, card, player, player) > 0; - }) > 1 - ); - }).length - ) * 1.1; - var taos = Math.min( - player.maxHp - player.hp, - hs.filter(function (card) { - return cardx != card && get.name(card, player) == "tao"; - }).length - ); - num += taos * player.getDamagedHp() * 1.2; - } else { - var numx = Math.sqrt( - Math.min( - 5, - player.countCards("h", function (card) { - return get.type(card, player) == "basic"; - }) - ) - ); - if (numx) - num += - (numx * - Math.min( - 2, - hs.filter(function (card) { - if (card == cardx || get.type(card) != "equip" || !player.hasUseTarget(card)) return false; - subs.add(get.subtype(card)); - return true; - }).length - ) * - (2.5 + player.countCards("e"))) / - 2.5; - num += - hs.filter(function (card) { - return card != cardx && get.type2(card) == "trick" && player.hasValueTarget(card); - }).length * 0.65; - } - if (get.position(cardx) == "e" && cardx.name != "muniu" && subs.includes(get.subtype(card))) num += 3; - return num * 1.5 - get.value(cardx); - }); - "step 4"; - if (result.bool && result.cards && result.cards.length) { - var name = get.type(result.cards[0]) == "basic" ? "neifa_basic" : "neifa_nobasic"; - player.addTempSkill(name); - var num = Math.min( - 5, - player.countCards("h", function (cardx) { - return (name == "neifa_basic") != (get.type(cardx, player) == "basic"); - }) - ); - if (num > 0) player.addMark(name, num, false); - else player.storage[name] = 0; - } - }, - ai: { - threaten: 3, - }, - }, - neifa_basic: { - mark: true, - marktext: "伐", - onremove: true, - intro: { - name: "内伐 - 基本牌", - content: "本回合内不能使用锦囊牌和装备牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。", - }, - mod: { - cardEnabled: function (card, player) { - if (["trick", "equip"].includes(get.type(card, "trick"))) return false; - }, - cardSavable: function (card, player) { - if (["trick", "equip"].includes(get.type(card, "trick"))) return false; - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") { - return num + player.countMark("neifa_basic"); - } - }, - }, - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - return game.hasPlayer(function (current) { - return !event.targets.includes(current) && player.canUse(event.card, current); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("neifa"), "为" + get.translation(trigger.card) + "额外指定一个目标", function (card, player, target) { - return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); - }) - .set("sourcex", trigger.targets) - .set("ai", function (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("neifa", event.targets); - trigger.targets.addArray(event.targets); - }, - }, - neifa_nobasic: { - trigger: { player: "useCard2" }, - direct: true, - mark: true, - marktext: "伐", - onremove: true, - mod: { - cardEnabled: function (card, player) { - if (get.type(card) == "basic") return false; - }, - cardSavable: function (card, player) { - if (get.type(card) == "basic") return false; - }, - }, - intro: { - name: "内伐 - 非基本牌", - content: "本回合内不能使用基本牌,使用普通锦囊牌选择目标时可以增加或减少一个目标,且本回合的出牌阶段内前两次使用装备牌时摸#张牌。", - }, - filter: function (event, player) { - if (get.type(event.card) != "trick") return false; - if (event.targets && event.targets.length > 0) return true; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; - player - .chooseTarget(get.prompt("neifa"), function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return true; - return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1); - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("neifa", event.targets); - if (trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); - else trigger.targets.addArray(event.targets); - } - }, - group: "neifa_use", - ai: { - reverseOrder: true, - skillTagFilter: function (player) { - if (player.storage.counttrigger && player.storage.counttrigger.neifa_use >= 2) return false; - }, - effect: { - target: function (card, player, target) { - if ((!player.storage.counttrigger || !player.storage.counttrigger.neifa_use || player.storage.counttrigger.neifa_use < 2) && player == target && get.type(card) == "equip") return [1, 3]; - }, - }, - }, - }, - neifa_use: { - audio: "neifa", - usable: 2, - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - return get.type(event.card) == "equip" && player.countMark("neifa_nobasic") > 0; - }, - content: function () { - player.draw(player.countMark("neifa_nobasic")); - }, - }, - //许靖 - yuxu: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - return true; - }, - direct: true, - content: function () { - "step 0"; - var draw = !player.hasMark("yuxu_used"); - if (draw) player.chooseBool(get.prompt2("yuxu")).set("ai", () => 1); - else event.goto(2); - "step 1"; - if (result.bool) { - player.logSkill("yuxu"); - player.draw(); - player.addMark("yuxu_used", 1, false); - player.addTempSkill("yuxu_used", "phaseUseAfter"); - } - event.finish(); - "step 2"; - player.logSkill("yuxu"); - player.removeMark("yuxu_used", player.countMark("yuxu_used"), false); - player.chooseToDiscard("he", true); - }, - subSkill: { - used: { - charlotte: true, - onremove: true, - }, - }, - }, - xjshijian: { - audio: 2, - trigger: { global: "useCardAfter" }, - direct: true, - filter: function (event, player) { - if (event.player == player) return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != event.player) return false; - return ( - event.player - .getHistory("useCard", function (evtt) { - return evtt.getParent("phaseUse") == evt; - }) - .indexOf(event) == 1 && player.countCards("he") > 0 - ); - }, - content: function () { - "step 0"; - var next = player.chooseToDiscard("he", get.prompt("xjshijian", trigger.player), "弃置一张牌并令其获得技能〖誉虚〗至回合结束"); - next.set("logSkill", ["xjshijian", trigger.player]); - next.set("check", get.attitude(player, trigger.player) > 0 && trigger.player.countCards("h") > 2); - next.ai = function (card) { - if (_status.event.check) return 5 - get.value(card); - return -1; - }; - "step 1"; - if (result.bool) trigger.player.addTempSkills("yuxu"); - }, - ai: { - expose: 0.25, - }, - }, - //新1v1 - yanhuo: { - audio: 2, - trigger: { player: "die" }, - forceDie: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - direct: true, - skillAnimation: true, - animationColor: "thunder", - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("yanhuo"), function (card, player, target) { - return target != player && target.countDiscardableCards(player, "he") > 0; - }) - .set("forceDie", true).ai = function (target) { - return -target.countCards("he") * get.attitude(player, target); - }; - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("yanhuo", target); - event.count = player.countCards("he"); - } else event.finish(); - "step 2"; - if (target.countDiscardableCards(player, "he")) { - player.line(target); - player.discardPlayerCard(target, "he", true).set("forceDie", true); - event.count--; - if (event.count) event.redo(); - } - }, - }, - mouzhu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - target.chooseCard("h", "交给" + get.translation(player) + "一张手牌", true); - "step 1"; - if (result.bool) target.give(result.cards, player); - "step 2"; - if (player.countCards("h") <= target.countCards("h")) { - event.finish(); - return; - } - var list = []; - if (target.canUse("sha", player, false)) list.push("sha"); - if (target.canUse("juedou", player, false)) list.push("juedou"); - if (!list.length) event.finish(); - else if (list.length == 1) event._result = { control: list[0] }; - else - target.chooseControl(list).set("prompt", "对" + get.translation(player) + "使用一张【杀】或【决斗】。").ai = function () { - return get.effect(player, { name: "sha" }, target, target) >= get.effect(player, { name: "juedou" }, target, target) ? "sha" : "juedou"; - }; - "step 3"; - target.useCard({ name: result.control, isCard: true }, player, "noai"); - }, - ai: { - order: 7, - result: { - target: -1.2, - player: function (player, target) { - if (target.countCards("h") - player.countCards("h") > 1) return 1; - if (get.damageEffect(target, player, player, player) > 0) return 1; - if (player.hp > 3 || (player.countCards("h", "sha") && player.countCards("h", "shan"))) return 0; - if (player.hp > 2) return -1.1; - return -2; - }, - }, - }, - }, - niluan: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return ( - event.player != player && - (event.player.hp > player.hp || - event.player.getHistory("useCard", function (card) { - return card.card.name == "sha"; - }).length > 0) - ); - }, - direct: true, - content: function () { - var next = player.chooseToUse(); - next.logSkill = "niluan"; - next.set("openskilldialog", get.prompt2("niluan")); - next.set("norestore", true); - next.set("_backupevent", "niluanx"); - next.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - next.backup("niluanx"); - }, - }, - niluanx: { - viewAs: { name: "sha" }, - filterCard: { color: "black" }, - position: "hes", - selectCard: 1, - check: function (card) { - return 5 - get.value(card); - }, - }, - cuorui: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return player.maxHp > 0 && !get.is.single() && (event.name != "phase" || game.phaseNumber == 0); - }, - content: function () { - player.draw(Math.min(5, player.maxHp), false); - }, - group: "cuorui_nojudge", - subSkill: { - nojudge: { - trigger: { - player: "phaseJudgeBefore", - }, - forced: true, - audio: "cuorui", - filter: function (event, player) { - return !player.storage.cuorui && (get.is.single() || player.countCards("j")); - }, - content: function () { - player.storage.cuorui = true; - trigger.cancel(); - game.log(player, "跳过了", "#g判定阶段"); - }, - }, - }, - }, - liewei: { - audio: 2, - trigger: { source: "dieAfter" }, - frequent: true, - content: function () { - player.draw(3); - }, - }, - //蒋干 - weicheng: { - audio: 2, - trigger: { - global: "gainAfter", - player: "loseAsyncAfter", - }, - //forced:true, - frequent: true, - filter: function (event, player) { - if (player.getHp() <= player.countCards("h")) return false; - if (event.name == "loseAsync") { - if (event.type != "gain") return false; - var cards = event.getl(player).hs; - return game.hasPlayer(function (current) { - if (current == player) return false; - var cardsx = event.getg(current); - for (var i of cardsx) { - if (cards.includes(i)) return true; - } - return false; - }); - } - if (event.player == player) return false; - var evt = event.getl(player); - return evt && evt.hs && evt.hs.length > 0; - }, - preHidden: true, - content: function () { - player.draw(); - }, - }, - daoshu: { - audio: 2, - enable: "phaseUse", - filterTarget: function (c, p, t) { - return t != p && t.countGainableCards(p, "h") > 0; - }, - filter: function (e, p) { - return !p.hasSkill("daoshu_used"); - }, - content: function () { - "step 0"; - player.chooseControl(lib.suit).set("prompt", "请选择一个花色").ai = function () { - return lib.suit.randomGet(); - }; - "step 1"; - event.suit = result.control; - player.popup(event.suit + 2); - game.log(player, "选择了", event.suit + 2); - player.gainPlayerCard(target, true, "h", "visibleMove"); - "step 2"; - if (result.bool) { - var suit2 = get.suit(result.cards[0]); - if (suit2 == event.suit) { - target.damage(); - event.finish(); - } else { - player.addTempSkill("daoshu_used", "phaseUseEnd"); - if ( - player.countCards("h", function (card) { - return get.suit(card) != suit2; - }) == 0 - ) { - player.showHandcards(); - event.finish(); - } else - player - .chooseCard( - "h", - true, - function (card) { - return get.suit(card) != _status.event.suit2; - }, - "交给" + get.translation(target) + "一张不为" + get.translation(suit2) + "花色的牌" - ) - .set("suit2", suit2); - } - } else event.finish(); - "step 3"; - player.give(result.cards, target, true); - }, - ai: { - order: 1, - result: { - target: -1, - }, - }, - subSkill: { - used: { sub: true }, - }, - }, - //统率三军诸葛瑾和文聘 - zhenwei_three: { - global: "zhenwei_three_others", - subSkill: { - others: { - mod: { - globalTo: function (from, to, distance) { - if ( - from.side != to.side && - game.hasPlayer(function (current) { - return current != to && current.side == to.side && current.hasSkill("zhenwei_three"); - }) - ) - return distance + 1; - }, - }, - sub: true, - }, - }, - }, - huanshi_three: { - audio: "huanshi", - trigger: { - global: "judge", - }, - filter: function (event, player) { - return player.countCards("hes") > 0 && player.side == event.player.side; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("huanshi_three"), "hes", function (card) { - var player = _status.event.player; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - }) - .set("ai", function (card) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0; - if (attitude > 0) { - return result - get.value(card) / 2; - } else { - return -result - get.value(card) / 2; - } - }) - .set("judging", trigger.player.judging[0]); - "step 1"; - if (result.bool) { - player.respond(result.cards, "highlight", "huanshi_three", "noOrdering"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player, "的判定牌改为", result.cards[0]); - game.delay(2); - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - //变权移植 - wanwei: { - trigger: { target: ["rewriteGainResult", "rewriteDiscardResult"] }, - direct: true, - preHidden: true, - filter: function (event, player) { - return event.player != player; - }, - audio: 2, - content: function () { - "step 0"; - var prompt = "即将失去" + get.translation(trigger.result.cards) + ",是否发动【挽危】?"; - var next = player.choosePlayerCard(player, prompt, trigger.position); - next.set("ai", function (button) { - return 20 - get.value(button.link); - }); - next.filterButton = trigger.filterButton; - next.selectButton = trigger.result.cards.length; - next.setHiddenSkill("wanwei"); - "step 1"; - if (result.bool) { - player.logSkill("wanwei"); - trigger.result.cards = result.links.slice(0); - trigger.result.links = result.links.slice(0); - trigger.cards = result.links.slice(0); - trigger.untrigger(); - } - }, - }, - gzjili: { - mod: { - aiOrder: function (player, card, num) { - if (player.isPhaseUsing() && get.subtype(card) == "equip1" && !get.cardtag(card, "gifts")) { - var range0 = player.getAttackRange(); - var range = 0; - var info = get.info(card); - if (info && info.distance && info.distance.attackFrom) { - range -= info.distance.attackFrom; - } - if (player.getEquip(1)) { - var num = 0; - var info = get.info(player.getEquip(1)); - if (info && info.distance && info.distance.attackFrom) { - num -= info.distance.attackFrom; - } - range0 -= num; - } - range0 += range; - if ( - range0 == player.getHistory("useCard").length + player.getHistory("respond").length + 2 && - player.countCards("h", function (cardx) { - return get.subtype(cardx) != "equip1" && player.getUseValue(cardx) > 0; - }) - ) - return num + 10; - } - }, - }, - trigger: { player: ["useCard", "respond"] }, - frequent: true, - locked: false, - preHidden: true, - filter: function (event, player) { - return player.getHistory("useCard").length + player.getHistory("respond").length == player.getAttackRange(); - }, - audio: 2, - content: function () { - player.draw(player.getHistory("useCard").length + player.getHistory("respond").length); - }, - ai: { - threaten: 1.8, - effect: { - target: function (card, player, target, current) { - let used = target.getHistory("useCard").length + target.getHistory("respond").length; - if (get.subtype(card) == "equip1" && !get.cardtag(card, "gifts")) { - if (player != target || !player.isPhaseUsing()) return; - let range0 = player.getAttackRange(); - let range = 0; - let info = get.info(card); - if (info && info.distance && info.distance.attackFrom) { - range -= info.distance.attackFrom; - } - if (player.getEquip(1)) { - let num = 0; - let info = get.info(player.getEquip(1)); - if (info && info.distance && info.distance.attackFrom) { - num -= info.distance.attackFrom; - } - range0 -= num; - } - range0 += range; - let delta = range0 - used; - if (delta < 0) return; - let num = player.countCards("h", function (card) { - return (get.cardtag(card, "gifts") || get.subtype(card) != "equip1") && player.getUseValue(card) > 0; - }); - if (delta == 2 && num > 0) return [1, 3]; - if (num >= delta) return "zeroplayertarget"; - } else if (get.tag(card, "respondShan") > 0) { - if (current < 0 && used == target.getAttackRange() - 1) { - if (card.name === "sha") { - if ( - !target.mayHaveShan( - player, - "use", - target.getCards("h", i => { - return i.hasGaintag("sha_notshan"); - }) - ) - ) - return; - } else if (!target.mayHaveShan(player)) return 0.9; - return [1, (used + 1) / 2]; - } - } else if (get.tag(card, "respondSha") > 0) { - if (current < 0 && used == target.getAttackRange() - 1 && target.mayHaveSha(player)) return [1, (used + 1) / 2]; - } - }, - }, - }, - }, - //新服曹笨 - xinshanjia: { - group: ["xinshanjia_count"], - locked: false, - mod: { - aiValue: function (player, card, num) { - if ((player.storage.xinshanjia || 0) < 3 && get.type(card) == "equip" && !get.cardtag(card, "gifts")) { - return num / player.hp; - } - }, - }, - audio: "shanjia", - trigger: { - player: "phaseUseBegin", - }, - intro: { - content: "本局游戏内已失去过#张装备牌", - }, - frequent: true, - sync: function (player) { - var history = player.actionHistory; - var num = 0; - for (var i = 0; i < history.length; i++) { - for (var j = 0; j < history[i].lose.length; j++) { - if (history[i].lose[j].parent.name == "useCard") continue; - num += history[i].lose[j].cards2.filter(function (card) { - return get.type(card, false) == "equip"; - }).length; - } - } - player.storage.xinshanjia = num; - if (num > 0) player.markSkill("xinshanjia"); - }, - content: function () { - "step 0"; - player.draw(3); - "step 1"; - lib.skill.xinshanjia.sync(player); - var num = 3 - player.storage.xinshanjia; - if (num > 0) { - player.chooseToDiscard("he", true, num).ai = get.disvalue; - } - "step 2"; - var bool1 = true, - bool2 = true; - if (result.cards) { - var cards = result.cards; - for (var i = 0; i < result.cards.length; i++) { - var type = get.type(result.cards[i], "trick", result.cards[i].original == "h" ? player : false); - if (type == "basic") bool1 = false; - if (type == "trick") bool2 = false; - } - } - if (bool1) player.addTempSkill("xinshanjia_sha", "phaseUseAfter"); - if (bool2) player.addTempSkill("xinshanjia_nodis", "phaseUseAfter"); - if (bool1 && bool2) { - player.chooseUseTarget({ name: "sha" }, "是否视为使用一张【杀】?", false); - } - }, - ai: { - threaten: 3, - noe: true, - reverseOrder: true, - skillTagFilter: function (player) { - if (player.storage.xinshanjia > 2) return false; - }, - effect: { - target: function (card, player, target) { - if (player.storage.xinshanjia < 3 && get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; - }, - }, - }, - subSkill: { - count: { - forced: true, - silent: true, - popup: false, - trigger: { - player: "loseEnd", - }, - filter: function (event, player) { - return event.cards2 && event.cards2.length > 0; - }, - content: function () { - lib.skill.xinshanjia.sync(player); - }, - }, - sha: { - mark: true, - charlotte: true, - intro: { content: "使用【杀】的次数上限+1" }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - }, - nodis: { - mark: true, - charlotte: true, - intro: { content: "使用牌无距离限制" }, - mod: { - targetInRange: () => true, - }, - }, - }, - }, - //OL马超 - ol_shichou: { - audio: 2, - trigger: { player: "useCard2" }, - filter: function (event, player) { - return event.card && event.card.name == "sha"; - }, - direct: true, - content: function () { - "step 0"; - var num = player.getDamagedHp() + 1; - player - .chooseTarget("是否发动【誓仇】?", "为" + get.translation(trigger.card) + "添加至多" + get.cnNumber(num) + "个目标", [1, num], function (card, player, target) { - var evt = _status.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", function (target) { - return get.effect(target, _status.event.getTrigger().card, _status.event.player); - }); - "step 1"; - if (result.bool && result.targets && result.targets.length) { - var targets = result.targets; - player.logSkill("ol_shichou", targets); - player.line(targets, trigger.card.nature); - trigger.targets.addArray(targets); - } - }, - }, - dc_olshichou: { - audio: "ol_shichou", - trigger: { player: "useCard2" }, - filter: function (event, player) { - return ( - event.card && - event.card.name == "sha" && - player.isDamaged() && - game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.filterTarget(event.card, player, current); - }) - ); - }, - direct: true, - content: function () { - "step 0"; - var num = Math.min( - player.getDamagedHp(), - game.countPlayer(function (current) { - return !trigger.targets.includes(current) && lib.filter.filterTarget(trigger.card, player, current); - }) - ); - player.chooseTarget("是否发动【誓仇】,令至多" + get.cnNumber(num) + "名其他角色也成为此【杀】的目标?", [1, num], function (card, player, target) { - var evt = _status.event.getTrigger(); - return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); - }).ai = function (target) { - return get.effect(target, { name: "sha" }, _status.event.player); - }; - "step 1"; - if (result.bool && result.targets && result.targets.length) { - var targets = result.targets; - player.logSkill("dc_olshichou", targets); - player.line(targets, trigger.card.nature); - trigger.targets.addArray(targets); - trigger.ol_shichou = true; - player.addTempSkill("ol_shichou2"); - } - }, - }, - ol_shichou2: { - charlotte: true, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return ( - event.ol_shichou && - !player.getHistory("sourceDamage", function (evt) { - return evt.card == event.card; - }).length && - event.cards.filterInD().length > 0 - ); - }, - forced: true, - popup: false, - content: function () { - player.gain(trigger.cards.filterInD(), "gain2"); - }, - }, - //新大小乔 - new_xingwu: { - audio: "xingwu", - trigger: { - player: "phaseDiscardBegin", - }, - direct: true, - intro: { - content: "expansion", - markcount: "expansion", - onunmark: function (storage, player) { - player.removeAdditionalSkill("new_luoyan"); - }, - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player - .chooseCard("he", get.prompt("new_xingwu"), "将一张牌置于武将牌上作为“舞”") - .set("ai", function (card) { - if (_status.event.goon) return 20 - get.value(card); - return 7 - get.value(card); - }) - .set("goon", player.needsToDiscard() || player.getExpansions("new_xingwu").length > 1); - "step 1"; - if (result.bool) { - player.logSkill("new_xingwu"); - var cards = result.cards; - player.addToExpansion(cards, player, "give").gaintag.add("new_xingwu"); - if (player.hasSkill("new_luoyan")) player.addAdditionalSkill("new_luoyan", ["oltianxiang", "liuli"]); - } else event.finish(); - "step 2"; - game.delayx(); - var choices = []; - event.addIndex = 0; - if (player.getExpansions("new_xingwu").length > 2) { - choices.push("将三张“星舞”牌置入弃牌堆"); - } else event.addIndex++; - if ( - player.countCards("h", function (card) { - return lib.filter.cardDiscardable(card, player, "new_xingwu"); - }) > 1 - ) - choices.push("弃置两张手牌并将武将牌翻面"); - if (choices.length) { - player - .chooseControl("cancel2") - .set("prompt", "星舞:是否发射核弹?") - .set("choiceList", choices) - .set("ai", function () { - var player = _status.event.player; - if (player.getExpansions("new_xingwu").length > 2) return 0; - if (player.isTurnedOver() || player.identity == "fan" || player.getEnemies().length == 1) return 0; - return "cancel2"; - }); - } else event.finish(); - "step 3"; - if (result.control != "cancel2") { - var num = result.index + event.addIndex; - if (num == 1) { - event.goto(5); - return; - } - if (player.getExpansions("new_xingwu").length > 3) player.chooseButton(["请选择要移去的“星舞”牌", player.getExpansions("new_xingwu")], 3, true); - else - event._result = { - bool: true, - links: player.getExpansions("new_xingwu").slice(0), - }; - } else event.finish(); - "step 4"; - if (result.bool && result.links && result.links.length == 3) { - var cards = result.links; - player.loseToDiscardpile(cards); - event.goto(6); - } else event.finish(); - "step 5"; - player.chooseToDiscard(true, "h", 2); - player.turnOver(); - "step 6"; - player.chooseTarget("请选择【星舞】的目标", "弃置其装备区内的所有牌。然后对其造成2点伤害(目标为女性角色则改为1点)", true, lib.filter.notMe).set("ai", function (target) { - return ( - -get.attitude(_status.event.player, target) * - Math.sqrt( - 4 + - target.countCards("e", function (card) { - return get.value(card, target) > 0; - }) - ) * - (target.hasSex("female") ? 1 : 2) - ); - }); - "step 7"; - if (result.bool && result.targets && result.targets.length) { - var target = result.targets[0]; - player.line(target, "green"); - var num = target.countCards("e"); - if (num) player.discardPlayerCard(target, "e", num, true); - target.damage(target.hasSex("female") ? 1 : 2); - } - }, - ai: { - threaten: 1.5, - }, - }, - new_luoyan: { - init: function (player) { - if (player.getExpansions("new_xingwu").length) player.addAdditionalSkill("new_luoyan", ["oltianxiang", "liuli"]); - }, - onremove: function (player) { - player.removeAdditionalSkill("new_luoyan"); - }, - derivation: ["oltianxiang", "liuli"], - locked: true, - ai: { - combo: "new_xingwu", - }, - }, - //新孙鲁育 - new_meibu: { - audio: "meibu", - trigger: { - global: "phaseUseBegin", - }, - filter: function (event, player) { - return event.player != player && event.player.isIn() && player.countCards("he") > 0 && event.player.inRange(player); - }, - direct: true, - derivation: ["new_zhixi"], - checkx: function (event, player) { - if (get.attitude(player, event.player) >= 0) return false; - var e2 = player.getEquip(2); - if (e2) { - if (e2.name == "tengjia" || e2.name == "rewrite_tengjia") return true; - if (e2.name == "bagua" || e2.name == "rewrite_bagua") return true; - } - return event.player.countCards("h") > event.player.hp; - }, - content: function () { - "step 0"; - var check = lib.skill.new_meibu.checkx(trigger, player); - player - .chooseToDiscard(get.prompt2("new_meibu", trigger.player), "he") - .set("ai", function (card) { - if (_status.event.check) return 6 - get.value(card); - return 0; - }) - .set("check", check) - .set("logSkill", ["new_meibu", trigger.player]); - "step 1"; - if (result.bool) { - var target = trigger.player; - var card = result.cards[0]; - player.line(target, "green"); - target.addTempSkills("new_zhixi", "phaseUseAfter"); - if (card.name != "sha" && get.type(card) != "trick" && get.color(card) != "black") { - target.addTempSkill("new_meibu_range", "phaseUseAfter"); - target.markAuto("new_meibu_range", player); - } - target.markSkillCharacter("new_meibu", player, "魅步", "锁定技,出牌阶段,你至多可使用X张牌,你使用了锦囊牌后不能再使用牌(X为你的体力值)。"); - } - }, - ai: { - expose: 0.2, - }, - subSkill: { - range: { - onremove: true, - charlotte: true, - mod: { - globalFrom: function (from, to, num) { - if (from.getStorage("new_meibu_range").includes(to)) { - return -Infinity; - } - }, - }, - sub: true, - }, - }, - }, - new_mumu: { - audio: "mumu", - trigger: { - player: "phaseUseBegin", - }, - filter: function (event, player) { - return game.hasPlayer(current => { - if (current == player) return current.getEquips(2).length > 0; - return current.countCards("e") > 0; - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("new_mumu"), "弃置一名其他角色装备区内的一张牌,或者获得一名角色装备区内的防具牌", function (card, player, target) { - if (target == player) return target.getEquips(2).length > 0; - return target.countCards("e") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (target.getEquip(2) && player.hasEmptySlot(2)) { - return -2 * att; - } - return -att; - }); - "step 1"; - if (result.bool && result.targets && result.targets.length) { - event.target = result.targets[0]; - player.logSkill("new_mumu", event.target); - player.line(event.target, "green"); - var e = event.target.getEquips(2); - event.e = e; - if (target == player) event.choice = "获得一张防具牌"; - else if (e.length > 0) { - player.chooseControl("弃置一张装备牌", "获得一张防具牌").set("ai", function () { - if (_status.event.player.getEquips(2).length > 0) { - return "弃置一张装备牌"; - } - return "获得一张防具牌"; - }); - } else { - event.choice = "弃置一张装备牌"; - } - } else event.finish(); - "step 2"; - var choice = event.choice || result.control; - if (choice == "弃置一张装备牌") { - player.discardPlayerCard(event.target, "e", true); - } else { - if (event.e) { - player.gain(event.e, event.target, "give", "bySelf"); - player.addTempSkill("new_mumu2"); - } - } - }, - }, - new_zhixi: { - mod: { - cardEnabled: function (card, player) { - if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; - }, - cardUsable: function (card, player) { - if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; - }, - cardRespondable: function (card, player) { - if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; - }, - cardSavable: function (card, player) { - if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; - }, - }, - trigger: { - player: "useCard1", - }, - forced: true, - popup: false, - firstDo: true, - init: function (player, skill) { - player.storage[skill] = 0; - var evt = _status.event.getParent("phaseUse"); - if (evt && evt.player == player) { - player.getHistory("useCard", function (evtx) { - if (evtx.getParent("phaseUse") == evt) { - player.storage[skill]++; - if (get.type2(evtx.card) == "trick") player.storage.new_zhixi2 = true; - } - }); - } - }, - onremove: function (player) { - player.unmarkSkill("new_meibu"); - delete player.storage.new_zhixi; - delete player.storage.new_zhixi2; - }, - content: function () { - player.addMark("new_zhixi", 1, false); - if (get.type2(trigger.card) == "trick") player.storage.new_zhixi2 = true; - }, - ai: { - presha: true, - pretao: true, - neg: true, - nokeep: true - }, - }, - new_mumu2: { - charlotte: true, - mod: { - cardEnabled: function (card) { - if (card.name == "sha") return false; - }, - }, - }, - qingzhong: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - check: function (event, player) { - if ( - game.hasPlayer(function (current) { - return current != player && current.isMinHandcard() && get.attitude(player, current) > 0; - }) - ) { - return true; - } - if (player.countCards("h") <= 2) return true; - // if(player.countCards('h')<=3&&!player.countCards('h','shan')) return true; - //if(player.countCards('h',{type:'basic'})<=1) return true; - return false; - }, - content: function () { - player.draw(2); - player.addTempSkill("qingzhong_give"); - }, - subSkill: { - give: { - audio: "qingzhong", - trigger: { player: "phaseUseEnd" }, - filter: function (event, player) { - return !player.isMinHandcard(true); - }, - forced: true, - content: function () { - "step 0"; - var list = game.filterPlayer(function (current) { - return current.isMinHandcard(); - }); - if (list.length == 1) { - if (list[0] != player) { - player.line(list[0], "green"); - player.swapHandcards(list[0]); - } - event.finish(); - } else { - player - .chooseTarget(true, "清忠:选择一名手牌最少的角色与其交换手牌", function (card, player, target) { - return target.isMinHandcard(); - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - } - "step 1"; - if (result.bool) { - var target = result.targets[0]; - if (target != player) { - player.line(target, "green"); - player.swapHandcards(target); - } - } - }, - }, - }, - }, - weijing: { - audio: 2, - enable: "chooseToUse", - filter: function (event, player) { - if (event.type == "wuxie" || player.hasSkill("weijing_used")) return false; - for (var name of ["sha", "shan"]) { - if (event.filterCard({ name: name, isCard: true }, player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var vcards = []; - for (var name of ["sha", "shan"]) { - var card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); - } - var dialog = ui.create.dialog("卫境", [vcards, "vcard"], "hidden"); - dialog.direct = true; - return dialog; - }, - backup: function (links, player) { - return { - filterCard: () => false, - selectCard: -1, - viewAs: { - name: links[0][2], - isCard: true, - }, - popname: true, - precontent: function () { - player.logSkill("weijing"); - player.addTempSkill("weijing_used", "roundStart"); - }, - }; - }, - prompt: function (links, player) { - return "卫境:视为使用一张【" + get.translation(links[0][2]) + "】"; - }, - }, - ai: { - order: function (item, player) { - var player = _status.event.player; - var event = _status.event; - if (event.filterCard({ name: "sha" }, player, event)) { - if ( - !player.hasShan() && - !game.hasPlayer(function (current) { - return player.canUse("sha", current) && current.hp == 1 && get.effect(current, { name: "sha" }, player, player) > 0; - }) - ) { - return 0; - } - return 2.95; - } else { - var player = _status.event.player; - if (player.hasSkill("qingzhong_give")) return 2.95; - return 3.15; - } - }, - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - if (player.hasSkill("weijing_used")) return false; - if (arg != "use") return false; - }, - result: { - player: 1, - }, - }, - subSkill: { - used: { - mark: true, - intro: { - content: "本轮已发动", - }, - }, - }, - }, - zishu: { - audio: 2, - locked: true, - subSkill: { - discard: { - trigger: { global: "phaseEnd" }, - audio: "zishu", - forced: true, - filter: function (event, player) { - if (_status.currentPhase != player) { - var he = player.getCards("h"); - var bool = false; - player.getHistory("gain", function (evt) { - if (!bool && evt && evt.cards) { - for (var i = 0; i < evt.cards.length; i++) { - if (he.includes(evt.cards[i])) bool = true; - break; - } - } - }); - return bool; - } - return false; - }, - content: function () { - var he = player.getCards("h"); - var list = []; - player.getHistory("gain", function (evt) { - if (evt && evt.cards) { - for (var i = 0; i < evt.cards.length; i++) { - if (he.includes(evt.cards[i])) list.add(evt.cards[i]); - } - } - }); - player.$throw(list, 1000); - player.lose(list, ui.discardPile, "visible"); - game.log(player, "将", list, "置入弃牌堆"); - }, - }, - mark: { - trigger: { - player: "gainBegin", - global: "phaseBeginStart", - }, - silent: true, - filter: function (event, player) { - return event.name != "gain" || player != _status.currentPhase; - }, - content: function () { - if (trigger.name == "gain") trigger.gaintag.add("zishu"); - else player.removeGaintag("zishu"); - }, - }, - draw: { - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - audio: "zishu", - forced: true, - filter: function (event, player) { - if (_status.currentPhase != player || event.getg(player).length == 0) return false; - return event.getParent(2).name != "zishu_draw"; - }, - content: function () { - player.draw("nodelay"); - }, - }, - }, - ai: { - threaten: 1.2, - nogain: 1, - skillTagFilter: function (player) { - return player != _status.currentPhase; - }, - }, - group: ["zishu_draw", "zishu_discard", "zishu_mark"], - }, - xinyingyuan: { - audio: "yingyuan", - trigger: { player: "useCardAfter" }, - direct: true, - filter: function (event, player) { - if (_status.currentPhase != player) return false; - var type = get.type(event.card, "trick"); - return ( - player.getHistory("custom", function (evt) { - return evt.xinyingyuan_name == type; - }).length == 0 - ); - }, - content: function () { - "step 0"; - event.type = get.type(trigger.card, "trick"); - player - .chooseTarget(get.prompt("xinyingyuan"), "令一名其他角色从牌堆中获得一张" + get.translation(event.type) + "牌", function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att < 3) return 0; - if (target.hasJudge("lebu")) att /= 2; - if (target.hasSkillTag("nogain")) att /= 10; - return att / (1 + get.distance(player, target, "absolute")); - }); - "step 1"; - if (result.bool) { - player.logSkill("xinyingyuan", result.targets[0]); - var card = get.cardPile2(function (cardx) { - return get.type(cardx, "trick") == event.type; - }); - if (card) result.targets[0].gain(card, "log", "gain2"); - player.getHistory("custom").push({ xinyingyuan_name: event.type }); - } - }, - }, - yingyuan: { - audio: 2, - trigger: { player: "useCardAfter" }, - direct: true, - filter: function (event, player) { - if (_status.currentPhase != player) return false; - if ( - player.getHistory("custom", function (evt) { - return evt.yingyuan_name == event.card.name; - }).length > 0 - ) - return false; - return event.cards.filterInD().length > 0; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("yingyuan"), "将" + get.translation(trigger.cards) + "交给一名其他角色", function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - if (target.hasJudge("lebu")) return 0; - let att = get.attitude(_status.event.player, target), - name = _status.event.cards[0].name; - if (att < 3) return 0; - if (target.hasSkillTag("nogain")) att /= 10; - if (name === "sha" && target.hasSha()) att /= 5; - if (name === "wuxie" && target.needsToDiscard(_status.event.cards)) att /= 5; - return att / (1 + get.distance(player, target, "absolute")); - }) - .set("cards", trigger.cards); - "step 1"; - if (result.bool) { - player.logSkill("yingyuan", result.targets[0]); - result.targets[0].gain(trigger.cards.filterInD(), "gain2"); - player.getHistory("custom").push({ yingyuan_name: trigger.card.name }); - } - }, - }, - shuimeng: { - audio: 2, - trigger: { player: "phaseUseAfter" }, - direct: true, - filter: function (event, player) { - return player.countCards("h"); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("shuimeng"), function (card, player, target) { - return player.canCompare(target); - }) - .set("ai", function (target) { - if (!_status.event.goon) return 0; - return -get.attitude(_status.event.player, target); - }) - .set( - "goon", - player.needsToDiscard() || - player.hasCard(function (card) { - var val = get.value(card); - if (val < 0) return true; - if (val <= 5) { - return card.number >= 11; - } - if (val <= 6) { - return card.number >= 12; - } - return false; - }) - ); - "step 1"; - if (result.bool) { - player.logSkill("shuimeng", result.targets); - event.target = result.targets[0]; - player.chooseToCompare(event.target); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.chooseUseTarget({ name: "wuzhong", isCard: true }, true); - } else { - event.target.useCard({ name: "guohe", isCard: true }, player); - } - }, - }, - qianya: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - direct: true, - filter: function (event, player) { - return get.type(event.card, "trick") == "trick" && player.countCards("h"); - }, - content: function () { - "step 0"; - var nh = player.countCards("h"); - player.chooseCardTarget({ - filterCard: true, - filterTarget: function (card, player, target) { - return target != player; - }, - selectCard: [1, nh], - ai1: function (card) { - var player = _status.event.player; - var cardname = _status.event.cardname; - if (_status.event.du) return -get.value(card, player, "raw"); - else if (_status.event.shuimeng) { - if (cardname == "wuzhong") { - if ( - player.needsToDiscard(2, (i, player) => { - return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); - }) - ) - return 10 - get.value(card, player, "raw"); - } else if (cardname == "guohe") { - if ( - player.needsToDiscard(-1, (i, player) => { - return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); - }) - ) - return 10 - get.value(card, player, "raw"); - } - return 0; - } else if (cardname == "lebu") { - if ( - player.needsToDiscard(1, (i, player) => { - return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); - }) - ) { - return 8 - get.value(card, player, "raw"); - } else { - if (!ui.selected.cards.length) { - return 6 - get.value(card, player, "raw"); - } - return 0; - } - } else if (cardname == "shunshou") { - if (_status.event.nh <= 2) return get.value(card, player, "raw"); - } else if (cardname == "huogong") { - if (player.hp == 1) return get.value(card, player, "raw"); - } - if (ui.selected.cards.length) return 0; - return 7 - get.value(card, player, "raw"); - }, - ai2: function (target) { - var att = get.attitude(_status.event.player, target); - var nh2 = target.countCards("h"); - var num = Math.sqrt(1 + nh2); - var cardname = _status.event.cardname; - if (_status.event.du) return 0.5 - att; - else if (_status.event.shuimeng) { - return att / num; - } else if (cardname == "lebu") { - return att / num; - } else if (cardname == "shunshou") { - if (_status.event.nh <= 2) return att / num; - } else if (cardname == "huogong") { - if (_status.event.player.hp == 1) return att / num; - } - if (_status.event.nh > nh2 + 1) { - return att / num; - } - return 0; - }, - du: player.hasCard(function (card) { - return get.value(card, player, "raw") < 0; - }), - shuimeng: trigger.getParent(2).name == "shuimeng", - nh: nh, - cardname: trigger.card.name, - prompt: get.prompt2("qianya"), - }); - "step 1"; - if (result.bool) { - player.logSkill("qianya", result.targets); - player.give(result.cards, result.targets[0]); - } - }, - }, - xianfu: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); - }, - audio: 6, - content: function () { - "step 0"; - player - .chooseTarget("请选择【先辅】的目标", lib.translate.xianfu_info, true, function (card, player, target) { - return target != player && (!player.storage.xianfu2 || !player.storage.xianfu2.includes(target)); - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 0) return att + 1; - if (att == 0) return Math.random(); - return att; - }).animate = false; - "step 1"; - if (result.bool) { - var target = result.targets[0]; - if (!player.storage.xianfu2) player.storage.xianfu2 = []; - player.storage.xianfu2.push(target); - player.addSkill("xianfu2"); - } - }, - }, - xianfu_mark: { - marktext: "辅", - intro: { - name: "先辅", - content: "当你受到伤害后,$受到等量的伤害,当你回复体力后,$回复等量的体力", - }, - }, - xianfu2: { - audio: "xianfu", - charlotte: true, - trigger: { global: ["damageEnd", "recoverEnd"] }, - forced: true, - filter: function (event, player) { - if (event.player.isDead() || !player.storage.xianfu2 || !player.storage.xianfu2.includes(event.player) || event.num <= 0) return false; - if (event.name == "damage") return true; - return player.isDamaged(); - }, - logTarget: "player", - content: function () { - "step 0"; - var target = trigger.player; - if (!target.storage.xianfu_mark) target.storage.xianfu_mark = []; - target.storage.xianfu_mark.add(player); - target.storage.xianfu_mark.sortBySeat(); - target.markSkill("xianfu_mark"); - game.delayx(); - "step 1"; - player[trigger.name](trigger.num, "nosource"); - }, - onremove: function (player) { - if (!player.storage.xianfu2) return; - game.countPlayer(function (current) { - if (player.storage.xianfu2.includes(current) && current.storage.xianfu_mark) { - current.storage.xianfu_mark.remove(player); - if (!current.storage.xianfu_mark.length) current.unmarkSkill("xianfu_mark"); - else current.markSkill("xianfu_mark"); - } - }); - delete player.storage.xianfu2; - }, - group: "xianfu3", - }, - xianfu3: { - trigger: { global: "dieBegin" }, - silent: true, - filter: function (event, player) { - return event.player == player || (player.storage.xianfu2 && player.storage.xianfu2.includes(player)); - }, - content: function () { - if (player == trigger.player) lib.skill.xianfu2.onremove(player); - else player.storage.xianfu2.remove(event.player); - }, - }, - chouce: { - trigger: { player: "damageEnd" }, - content: function () { - "step 0"; - event.num = trigger.num; - "step 1"; - player.judge(); - "step 2"; - event.color = result.color; - if (event.color == "black") { - if ( - game.hasPlayer(function (current) { - return current.countDiscardableCards(player, "hej") > 0; - }) - ) - player - .chooseTarget( - "弃置一名角色区域内的一张牌", - function (card, player, target) { - return target.countDiscardableCards(player, "hej"); - }, - true - ) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att < 0) { - att = -Math.sqrt(-att); - } else { - att = Math.sqrt(att); - } - return att * lib.card.guohe.ai.result.target(player, target); - }); - else event.finish(); - } else { - var next = player.chooseTarget("令一名角色摸一张牌"); - if (player.storage.xianfu2 && player.storage.xianfu2.length) { - next.set("prompt2", "(若目标为" + get.translation(player.storage.xianfu2) + "则改为摸两张牌)"); - } - next.set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); - if (target.hasSkillTag("nogain")) att /= 10; - if (player.storage.xianfu2 && player.storage.xianfu2.includes(target)) return att * 2; - return att; - }); - } - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - if (event.color == "black") { - player.discardPlayerCard(target, "hej", true); - } else { - if (player.storage.xianfu2 && player.storage.xianfu2.includes(target)) { - if (!target.storage.xianfu_mark) target.storage.xianfu_mark = []; - target.storage.xianfu_mark.add(player); - target.storage.xianfu_mark.sortBySeat(); - target.markSkill("xianfu_mark"); - target.draw(2); - } else { - target.draw(); - } - } - } - "step 4"; - if (--event.num > 0 && player.hasSkill("chouce")) { - player.chooseBool(get.prompt2("chouce")); - } else { - event.finish(); - } - "step 5"; - if (result.bool) { - player.logSkill("chouce"); - event.goto(1); - } - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - if (target.hp >= 4) return [1, get.tag(card, "damage") * 1.5]; - if (target.hp == 3) return [1, get.tag(card, "damage") * 1]; - if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; - } - }, - }, - }, - }, - fuqi: { - audio: 2, - forced: true, - trigger: { - player: "useCard", - }, - filter: function (event, player) { - return ( - event.card && - (get.type(event.card) == "trick" || (get.type(event.card) == "basic" && !["shan", "tao", "jiu", "du"].includes(event.card.name))) && - game.hasPlayer(function (current) { - return current != player && get.distance(current, player) <= 1; - }) - ); - }, - content: function () { - trigger.directHit.addArray( - game.filterPlayer(function (current) { - return current != player && get.distance(current, player) <= 1; - }) - ); - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return get.distance(arg.target, player) <= 1; - }, - }, - }, - wylianji: { - enable: "phaseUse", - audio: 2, - usable: 1, - filter: function (event, player) { - return player.hasCard(lib.skill.wylianji.filterCard); - }, - check: function (card) { - if (card.name == "sha") return 1; - else { - if (get.tag(card, "damage")) { - if (get.tag(card, "multineg")) return 5; - return 2; - } - } - return 0; - }, - filterCard: function (card) { - return get.name(card) == "sha" || (get.type(card, "trick") == "trick" && get.color(card) == "black" && !get.info(card).multitarget && get.info(card).enable); - }, - filterTarget: function (card, player, target) { - return ( - target != player && - !target.isMin() && - (player.canUse(card, target, false) || - game.hasPlayer(function (current) { - return current != player && target.canUse(card, current); - })) - ); - }, - discard: false, - lose: true, - delay: false, - content: function () { - "step 0"; - player.showCards(get.translation(player) + "对" + get.translation(target) + "发动了【连计】", cards); - "step 1"; - var equip1 = get.cardPile2(function (card) { - return get.subtype(card) == "equip1"; - }); - if (!equip1) { - player.popup("杯具"); - game.log("牌堆中无装备"); - event.finish(); - return; - } - if (equip1.name == "qinggang" && !lib.inpile.includes("qibaodao")) { - equip1.remove(); - equip1 = game.createCard2("qibaodao", equip1.suit, equip1.number); - } - target.$draw(equip1); - target.chooseUseTarget(true, equip1, "nothrow", "nopopup"); - game.delay(); - "step 2"; - game.updateRoundNumber(); - var card = cards[0]; - var bool1 = game.hasPlayer(function (current) { - return current != player && target.canUse(card, current); - }); - var bool2 = player.canUse(card, target, false); - if (bool1 && bool2) { - target - .chooseControl(function () { - return 0; - }) - .set("choiceList", ["对除" + get.translation(player) + "以外的角色使用" + get.translation(cards) + ",并将装备区里的武器牌交给该牌的一个目标角色", "视为" + get.translation(player) + "对你使用" + get.translation(cards) + ",并将装备区内的武器牌交给" + get.translation(player)]); - } else if (bool1) { - event.directindex = 0; - } else if (bool2) { - event.directindex = 1; - } else { - event.finish(); - } - "step 3"; - var card = cards[0]; - if (result && typeof event.directindex != "number") { - event.directindex = result.index; - } - if (event.directindex == 1) { - event.insert(lib.skill.wylianji.content_use, { - player: player, - target: target, - card: card, - }); - } else { - event.insert(lib.skill.wylianji.content_give, { - player: target, - card: card, - targets: game.filterPlayer(function (current) { - return current != player; - }), - }); - } - }, - content_use: function () { - "step 0"; - player.useCard(card, target); - "step 1"; - if (!get.owner(card)) { - target.gain(card, "gain2"); - } - "step 2"; - var equip1 = target.getEquips(1); - if (equip1.length) { - game.delay(); - target.give(equip1, player); - target.line(player); - } - }, - content_give: function () { - "step 0"; - var select = get.select(get.info(card).selectTarget); - if (select[1] == -1) { - for (var i = 0; i < targets.length; i++) { - if (!player.canUse(card, targets[i])) { - targets.splice(i--, 1); - } - } - if (targets.length) { - player.useCard(card, targets); - } - event.list = targets.slice(0); - event.goto(2); - } else { - player - .chooseTarget(select, "选择" + get.translation(card) + "的目标", true, function (cardx, player, target) { - var card = _status.event.card; - return _status.event.targets.includes(target) && player.canUse(card, target); - }) - .set("ai", function (target) { - var card = _status.event.card; - var player = _status.event.player; - return get.effect(target, card, player, player); - }) - .set("targets", targets) - .set("card", card); - } - "step 1"; - if (result.bool) { - player.useCard(card, result.targets); - event.list = result.targets.slice(0); - } - "step 2"; - var equip1 = player.getEquips(1); - if (equip1.length) { - for (var i = 0; i < event.list.length; i++) { - if (event.list[i].isDead()) event.list.splice(i--, 1); - } - if (event.list.length > 1) { - player - .chooseTarget(true, "将" + get.translation(equip1) + "交给一名角色", function (card, player, target) { - return _status.event.list.includes(target); - }) - .set("ai", function (target) { - return get.attitude(player, target); - }) - .set("list", _status.event.list); - event.equip1 = equip1; - } else { - if (event.list.length == 1) { - player.give(equip1, event.list[0]); - player.line(event.list); - } - event.finish(); - } - } else { - event.finish(); - } - "step 3"; - if (result.bool && result.targets.length && event.equip1) { - player.give(event.equip1, result.targets[0]); - player.line(result.targets); - } - }, - ai: { - order: 7, - result: { - target: function (player, target) { - if (ui.selected.cards.length) { - var card = ui.selected.cards[0]; - var bool = card.name != "sha"; - if ( - game.hasPlayer(function (current) { - return target.canUse(card, current, bool) && get.effect(current, card, target, player) > 0; - }) - ) { - var num = 1; - if (target.getEquip(1)) { - num = 0.6; - } - if (target.hasSkillTag("noe")) 2 * num; - return num; - } - } - return 0; - }, - }, - }, - }, - moucheng: { - audio: 2, - derivation: ["jingong", "wy_meirenji", "wy_xiaolicangdao"], - trigger: { global: "damageEnd" }, - forced: true, - popup: false, - filter: function (event, player) { - return event.source != player && event.getParent(2).name == "useCard" && event.getParent(3).name == "wylianjiInserted"; - }, - init: function (player) { - player.storage.moucheng = 0; - }, - intro: { - content: "已造成#点伤害", - }, - unique: true, - juexingji: true, - content: function () { - player.storage.moucheng += trigger.num; - if (player.hasSkill("moucheng")) { - player.markSkill("moucheng"); - player.syncStorage("moucheng"); - } - if (player.storage.moucheng >= 3) { - event.trigger("mouchengAwaken"); - } - }, - group: "moucheng_awaken", - subSkill: { - awaken: { - trigger: { player: "mouchengAwaken" }, - forced: true, - skillAnimation: true, - animationColor: "gray", - content: function () { - player.awakenSkill("moucheng"); - game.log(player, "失去了技能", "#g【连计】"); - player.changeSkills(["jingong"], ["wylianji"]); - }, - }, - }, - ai: { - combo: "wylianji", - }, - }, - jingong: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - event.xinjingong_list && - player.countCards("hes", function (card) { - return card.name == "sha" || get.type(card) == "equip"; - }) - ); - }, - onChooseToUse: function (event) { - if (!game.online) { - var evt = event.getParent(); - if (evt.name != "phaseUse") return; - if (!evt.xinjingong_list) { - var list = get.inpile("trick").randomGets(2); - if (Math.random() < 0.5) { - list.push("wy_meirenji"); - } else { - list.push("wy_xiaolicangdao"); - } - evt.xinjingong_list = list; - } - if (!event.xinjingong_list) event.set("xinjingong_list", evt.xinjingong_list); - } - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i of event.xinjingong_list) list.push(["锦囊", "", i]); - return ui.create.dialog("矜功", [list, "vcard"]); - }, - filter: function (button, player) { - return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent()); - }, - check: function (button) { - return _status.event.player.getUseValue({ name: button.link[2] }); - }, - backup: function (links, player) { - return { - audio: "jingong", - popname: true, - position: "hes", - viewAs: { name: links[0][2] }, - check: function (card) { - return 6 - get.value(card); - }, - filterCard: function (card) { - return card.name == "sha" || get.type(card) == "equip"; - }, - precontent: function () { - player.addTempSkill("jingong2"); - }, - }; - }, - prompt: function (links, player) { - return "将一张【杀】或装备牌当做" + get.translation(links[0][2]) + "使用"; - }, - }, - ai: { - order: 2, - result: { - player: function (player) { - if ((player.hp <= 2 || player.needsToDiscard()) && !player.getStat("damage")) return 0; - return 1; - }, - }, - }, - }, - jingong2: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return !player.getStat("damage"); - }, - content: function () { - player.loseHp(); - }, - }, - jingong3: { charlotte: true }, - weikui: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h"); - }, - content: function () { - "step 0"; - player.loseHp(); - "step 1"; - if (target.countCards("h", "shan")) { - player.viewHandcards(target); - if (player.canUse({ name: "sha", isCard: true }, target, false)) player.useCard({ name: "sha", isCard: true }, target, false); - player.storage.weikui2 = target; - player.addTempSkill("weikui2"); - } else { - player.discardPlayerCard(target, "visible", true, "h").set("ai", function (button) { - return get.value(button.link, _status.event.target); - }); - } - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if (player.hp <= 2) return 0; - if (player.hp == 3) return target.hp <= 2 ? -1 : 0; - return -1; - }, - }, - }, - }, - weikui2: { - onremove: true, - mod: { - globalFrom: function (from, to) { - if (to == from.storage.weikui2) return -Infinity; - }, - }, - mark: "character", - intro: { - content: "与$的距离视为1直到回合结束", - }, - }, - lizhan: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - for (var i = 0; i < game.players.length; i++) { - if (game.players[i].isDamaged()) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("lizhan"), "令任意名已受伤的角色各摸一张牌", [1, Infinity], function (card, player, target) { - return target.isDamaged(); - }) - .set("ai", function (target) { - return get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - player.logSkill("lizhan", result.targets); - game.asyncDraw(result.targets); - } - }, - ai: { - expose: 0.3, - threaten: 1.3, - }, - }, - xinfenyue: { - enable: "phaseUse", - audio: "fenyue", - filter: function (event, player) { - var num = game.players.length - player.getFriends(true).length; - if ((player.getStat().skill.xinfenyue || 0) >= num) return false; - return player.countCards("h") > 0; - }, - filterTarget: function (event, player, target) { - return player.canCompare(target); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (!result.bool) event.finish(); - event.num = result.num1; - "step 2"; - if (num <= 5 && target.countGainableCards(player, "he") > 0) player.gainPlayerCard(target, "he", true); - "step 3"; - if (num <= 9) { - var card = get.cardPile2(function (x) { - return x.name == "sha"; - }); - if (card) player.gain(card, "gain2"); - } - "step 4"; - if (num <= 13) { - var card = { name: "sha", nature: "thunder" }; - if (player.canUse(card, target, false)) player.useCard(card, target, false); - } - }, - ai: { - order: 4, - result: { - target: function (player, target) { - var sort = function (a, b) { - return b.number - a.number; - }; - var ps = player.getCards("h").sort(sort); - var ts = target.getCards("h").sort(sort); - if (ps[0].number > ts[0].number) { - var effect = get.effect(target, { name: "sha", nature: "thunder" }, player, player); - if (ps[0].number < 6 && target.countCards("he") > 1) effect -= 2; - if (ps[0].number < 10) effect -= 1; - return effect; - } - return ps.length >= ts.length ? -0.5 : 0; - }, - }, - }, - }, - fenyue: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (!player.countCards("h")) return false; - var num; - if (get.mode() == "identity") { - num = game.countPlayer(function (current) { - return current.identity == "zhong" || current.identity == "mingzhong"; - }); - } else { - num = 1; - } - if (player.getStat().skill.fenyue >= num) return false; - return true; - }, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - ai: { - order: 2.8, - result: { - target: function (player, target) { - if ( - get.attitude(player, target) < 0 && - player.hasCard(function (card) { - return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; - }) - ) { - return get.effect(target, { name: "sha" }, player, target); - } else { - return 0; - } - }, - }, - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - player - .chooseControl(function () { - return 1; - }) - .set("choiceList", ["令" + get.translation(target) + "不能使用或打出手牌直到回合结束", "视为对" + get.translation(target) + "使用一张杀(不计入次数限制)"]); - } else { - var evt = _status.event.getParent("phaseUse"); - if (evt && evt.name == "phaseUse") { - evt.skipped = true; - } - event.finish(); - } - "step 2"; - if (result.control == "选项一") { - target.addTempSkill("fenyue2"); - } else { - player.useCard({ name: "sha", isCard: true }, target, false); - } - }, - }, - fenyue2: { - mark: true, - mod: { - cardEnabled2: function (card) { - if (get.position(card) == "h") return false; - }, - }, - intro: { - content: "不能使用或打出手牌", - }, - }, - - zfengshi: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return event.card.name == "sha" && event.target.countCards("e"); - }, - logTarget: "target", - check: function (event, player) { - if (event.target.hasSkillTag("noe")) return false; - return get.attitude(player, event.target) < 0; - }, - content: function () { - trigger.target.chooseToDiscard("e", true); - }, - }, - chuanxin: { - audio: 2, - trigger: { source: "damageBegin2" }, - preHidden: true, - filter: function (event, player) { - if (_status.currentPhase != player) return false; - if (!_status.event.getParent("phaseUse")) return false; - if (event.card && (event.card.name == "sha" || event.card.name == "juedou") && event.getParent().name == event.card.name) { - if (get.mode() == "guozhan") { - return (event.player.identity != "qun" || player.identity == "ye") && !event.player.isUnseen() && event.player.hasViceCharacter(); - } else { - var info = lib.character[event.player.name]; - if (!info) return false; - var skills = event.player.getSkills(); - for (var i = 0; i < info[3].length; i++) { - if (lib.skill[info[3][i]].fixed) continue; - if (skills.includes(info[3][i])) return true; - } - } - } - return false; - }, - logTarget: "player", - check: function (event, player) { - if (get.mode() == "guozhan") { - if (!event.player.isUnseen(1) && get.guozhanRank(event.player.name2, event.player) < 4) return false; - } - if (event.player.hasSkill("subplayer")) return false; - if (get.attitude(player, event.player) < 0) { - if (event.player.hp == 1 && event.player.countCards("e") < 2 && event.player.name2 != "gz_pangtong") return false; - return true; - } - return false; - }, - content: function () { - "step 0"; - trigger.cancel(); - if (trigger.player.countCards("e")) { - trigger.player - .chooseControl(function (event, player) { - if (get.mode() == "guozhan" && get.guozhanRank(player.name2, player) < 4) return 1; - if (player.hp == 1) return 1; - if (player.hp == 2 && player.countCards("e") >= 2) return 1; - return 0; - }) - .set("choiceList", ["弃置装备区内的所有牌并失去1点体力", get.mode() == "guozhan" ? "移除副将牌" : "随机移除武将牌上的一个技能"]); - } else { - event._result = { index: 1 }; - } - "step 1"; - if (result.index == 1) { - if (get.mode() != "guozhan") { - var info = lib.character[trigger.player.name]; - var skills = trigger.player.getSkills(); - var list = []; - for (var i = 0; i < info[3].length; i++) { - if (lib.skill[info[3][i]].fixed) continue; - if (skills.includes(info[3][i])) { - list.push(info[3][i]); - } - } - if (list.length) { - var skill = list.randomGet(); - trigger.player.removeSkills(skill); - } - } else { - trigger.player.removeCharacter(1); - } - } else { - trigger.player.discard(trigger.player.getCards("e")); - trigger.player.loseHp(); - } - }, - }, - hengjiang: { - audio: 2, - trigger: { player: "damageEnd" }, - preHidden: true, - check: function (event, player) { - return get.attitude(player, _status.currentPhase) < 0 || !_status.currentPhase.needsToDiscard(2); - }, - filter: function (event) { - return _status.currentPhase && _status.currentPhase.isIn() && event.num > 0; - }, - logTarget: function () { - return _status.currentPhase; - }, - content: function () { - var source = _status.currentPhase; - if (source.hasSkill("hengjiang2")) { - source.storage.hengjiang2 += trigger.num; - source.storage.hengjiang3.add(player); - source.updateMarks(); - } else { - source.storage.hengjiang3 = [player]; - source.storage.hengjiang2 = trigger.num; - source.addTempSkill("hengjiang2"); - } - }, - ai: { - maixie_defend: true, - }, - }, - hengjiang2: { - mark: true, - charlotte: true, - intro: { - content: "手牌上限-#", - }, - mod: { - maxHandcard: function (player, num) { - return num - player.storage.hengjiang2; - }, - }, - onremove: function (player) { - delete player.storage.hengjiang2; - delete player.storage.hengjiang3; - }, - trigger: { player: "phaseDiscardEnd" }, - filter: function (event, player) { - if (event.cards && event.cards.length) return false; - var players = player.storage.hengjiang3; - for (var i = 0; i < players.length; i++) { - if (players[i].isIn()) return true; - } - return false; - }, - forced: true, - popup: false, - content: function () { - var players = player.storage.hengjiang3; - for (var i = 0; i < players.length; i++) { - if (players[i].isIn()) { - players[i].logSkill("hengjiang"); - players[i].line(player, "green"); - } - } - game.asyncDraw(player.storage.hengjiang3); - }, - }, - rehengjiang: { - audio: "hengjiang", - trigger: { player: "damageEnd" }, - check: function (event, player) { - return get.attitude(player, _status.currentPhase) < 0 || !_status.currentPhase.needsToDiscard(2); - }, - filter: function (event) { - return _status.currentPhase && _status.currentPhase.isIn() && event.num > 0; - }, - logTarget: function () { - return _status.currentPhase; - }, - preHidden: true, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - var source = _status.currentPhase; - source.addTempSkill("rehengjiang2"); - source.addMark("rehengjiang2", 1, false); - player.addTempSkill("rehengjiang3"); - "step 2"; - if (event.count && player.hasSkill("rehengjiang")) { - player.chooseBool(get.prompt2("rehengjiang", _status.currentPhase)).set("ai", function () { - return lib.skill.rehengjiang.check(_status.event.getTrigger(), _status.event.player); - }); - } else event.finish(); - "step 3"; - if (result.bool) { - player.logSkill("rehengjiang", _status.currentPhase); - event.goto(1); - } - }, - ai: { - maixie_defend: true, - notemp: true, - }, - }, - rehengjiang2: { - mark: true, - charlotte: true, - onremove: true, - intro: { - content: "手牌上限-#", - }, - mod: { - maxHandcard: function (player, num) { - return num - player.storage.rehengjiang2; - }, - }, - }, - rehengjiang3: { - audio: "hengjiang", - trigger: { global: "phaseEnd" }, - forced: true, - charlotte: true, - filterx: function (event, player) { - if (!event.player.countMark("rehengjiang2")) return false; - if ( - event.player.hasHistory("lose", function (evt) { - return evt.type == "discard" && evt.cards2.length > 0 && evt.getParent("phaseDiscard").player == event.player; - }) - ) - return false; - return true; - }, - logTarget: "player", - content: function () { - if (lib.skill.rehengjiang3.filterx(trigger, player)) { - var num = player.getHistory("useSkill", function (evt) { - return evt.skill == "rehengjiang" && evt.targets.includes(trigger.player); - }).length; - if (num > 0) player.draw(num); - } else player.draw(); - }, - }, - shuangren: { - trigger: { player: "phaseUseBegin" }, - direct: true, - preHidden: true, - filter: function (event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return current != player && player.canCompare(current); - }) - ); - }, - content: function () { - "step 0"; - var goon; - if (player.needsToDiscard() > 1) { - goon = player.hasCard(function (card) { - return card.number > 10 && get.value(card) <= 5; - }); - } else { - goon = player.hasCard(function (card) { - return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; - }); - } - player - .chooseTarget(get.prompt2("shuangren"), function (card, player, target) { - return player.canCompare(target); - }) - .set("ai", function (target) { - var player = _status.event.player; - if (_status.event.goon && get.attitude(player, target) < 0) { - return get.effect(target, { name: "sha" }, player, player); - } - return 0; - }) - .set("goon", goon) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("shuangren", target); - player.chooseToCompare(target); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - var target = event.target; - if ( - game.hasPlayer(function (current) { - if (target == current) return false; - if (!player.canUse("sha", current, false)) return false; - return target.isFriendOf(current); - }) - ) { - var str = "对一名与" + get.translation(target) + "势力相同的"; - player - .chooseTarget(str + "角色使用一张杀", true, function (card, player, target) { - if (!player.canUse("sha", target, false)) return false; - if (get.mode() == "guozhan") { - return target.isFriendOf(_status.event.identity); - } - return true; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "sha" }, player, player); - }) - .set("identity", target); - } else { - player.useCard({ name: "sha", isCard: true }, target, false); - event.finish(); - } - } else { - player.addTempSkill("zishou2"); - event.finish(); - } - "step 3"; - if (result.bool && result.targets && result.targets.length) { - player.useCard({ name: "sha", isCard: true }, result.targets[0], false); - } - }, - }, - kuanshi: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("kuanshi")).set("ai", function (target) { - if (get.attitude(_status.event.player, target) > 0) { - return 1 / Math.sqrt(target.hp + 1); - } - return 0; - }).animate = false; - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("kuanshi"); - target.storage.kuanshi2 = player; - target.addSkill("kuanshi2"); - } - }, - }, - kuanshi2: { - /*mark:'character', - intro:{ - content:'下一次受到超过1点的伤害时,防止此伤害,然后$跳过下个回合的摸牌阶段' - },*/ - trigger: { player: "damageBegin4" }, - forced: true, - filter: function (event, player) { - return event.num > 1; - }, - //priority:-11, - content: function () { - trigger.cancel(); - player.storage.kuanshi2.skip("phaseDraw"); - player.removeSkill("kuanshi2"); - }, - group: "kuanshi2_remove", - onremove: true, - subSkill: { - remove: { - trigger: { global: ["phaseZhunbeiBegin", "dieAfter"] }, - forced: true, - popup: false, - filter: function (event, player) { - return event.player == player.storage.kuanshi2; - }, - content: function () { - player.removeSkill("kuanshi2"); - }, - }, - }, - }, - xiashu: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - var maxval = 0; - var hs = player.getCards("h"); - for (var i = 0; i < hs.length; i++) { - maxval = Math.max(maxval, get.value(hs[i])); - } - player - .chooseTarget(get.prompt2("xiashu"), lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player; - var maxval = _status.event.maxval; - var dh = target.countCards("h") - player.countCards("h"); - var att = get.attitude(player, target); - if (target.hasSkill("qingjian")) return false; - if (dh <= 0) return 0; - if (att > 0) return 0.1; - if (maxval >= 8) return 0; - if (att == 0) return 0.2; - if (dh >= 3) return dh; - if (dh == 2) { - if (maxval <= 7) return dh; - } - if (maxval <= 6) return dh; - return 0; - }) - .set("maxval", maxval); - "step 1"; - if (result.bool) { - player.logSkill("xiashu", result.targets); - event.target = result.targets[0]; - var hs = player.getCards("h"); - player.give(hs, event.target); - } else { - event.finish(); - } - "step 2"; - var hs = event.target.getCards("h"); - if (!hs.length) { - event.finish(); - return; - } - hs.sort(function (a, b) { - return get.value(b, player, "raw") - get.value(a, player, "raw"); - }); - event.target - .chooseCard([1, hs.length], "展示至少一张手牌", true) - .set("ai", function (card) { - var rand = _status.event.rand; - var list = _status.event.list; - if (_status.event.att) { - if (ui.selected.cards.length >= Math.ceil(list.length / 2)) return 0; - var value = get.value(card); - if (_status.event.getParent().player.isHealthy()) { - value += (get.tag(card, "damage") ? 1.5 : 0) + (get.tag(card, "draw") ? 2 : 0); - } - return value; - } - if (ui.selected.cards.length >= Math.floor(list.length / 2)) return 0; - return list.indexOf(card) % 2 == rand ? 1 : 0; - }) - .set("rand", Math.random() < 0.6 ? 1 : 0) - .set("list", hs) - .set("att", get.attitude(event.target, player) > 0); - "step 3"; - event.target.showCards(result.cards); - event.cards1 = result.cards; - event.cards2 = event.target.getCards("h", function (card) { - return !event.cards1.includes(card); - }); - "step 4"; - var choice; - var num1 = event.cards1.length; - var num2 = event.cards2.length; - if (get.attitude(event.target, player) > 0 && num1 >= num2) { - choice = 0; - } else if (num1 == num2) { - choice = Math.random() < 0.45 ? 0 : 1; - } else if (num1 > num2) { - if (num1 - num2 == 1) { - choice = Math.random() < 0.6 ? 0 : 1; - } else { - choice = 0; - } - } else { - if (num2 - num1 == 1) { - choice = Math.random() < 0.6 ? 1 : 0; - } else { - choice = 1; - } - } - player - .chooseControl(function (event, player) { - return _status.event.choice; - }) - .set("choiceList", ["获得" + get.translation(event.target) + "展示的牌", "获得" + get.translation(event.target) + "未展示的牌"]) - .set("choice", choice); - "step 5"; - if (result.index == 0) { - player.gain(event.cards1, target, "give", "bySelf"); - } else { - player.gain(event.cards2, target, "giveAuto", "bySelf"); - } - }, - ai: { - expose: 0.1, - }, - }, - sheyan: { - audio: 2, - trigger: { target: "useCardToTarget" }, - filter: function (event, player) { - if (!event.targets || !event.targets.includes(player)) return false; - var info = get.info(event.card); - if (info.type != "trick") return false; - if (info.multitarget) return false; - if (event.targets.length > 1) return true; - return game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, event.player, current); - }); - }, - direct: true, - content: function () { - "step 0"; - var bool1 = trigger.targets.length > 1; - var bool2 = game.hasPlayer(function (current) { - return !trigger.targets.includes(current) && lib.filter.targetEnabled2(trigger.card, trigger.player, current); - }); - if (bool1 && bool2) { - player - .chooseControlList(get.prompt("sheyan"), ["为" + get.translation(trigger.card) + "增加一个目标", "为" + get.translation(trigger.card) + "减少一个目标"], function (event, player) { - if (_status.event.add) return 0; - return 1; - }) - .set("add", get.effect(player, trigger.card, trigger.player, player) >= 0); - } else if (bool2) { - event.type = "add"; - event.goto(2); - event.unchosen = true; - } else { - event.type = "remove"; - event.goto(2); - event.unchosen = true; - } - "step 1"; - if (result.control == "cancel2") { - event.finish(); - } else if (result.index == 1) { - event.type = "remove"; - } else { - event.type = "add"; - } - "step 2"; - if (event.type == "add") { - player - .chooseTarget(event.unchosen ? get.prompt("sheyan") : null, "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { - var trigger = _status.event.getTrigger(); - return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, trigger.player, target); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - return get.effect(target, trigger.card, trigger.player, _status.event.player); - }); - } else { - player - .chooseTarget(event.unchosen ? get.prompt("sheyan") : null, "为" + get.translation(trigger.card) + "减少一个目标", function (card, player, target) { - return _status.event.targets.includes(target); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - return -get.effect(target, trigger.card, trigger.player, _status.event.player); - }) - .set("targets", trigger.targets); - } - "step 3"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 4"; - player.logSkill("sheyan", event.target); - if (event.type == "add") { - trigger.targets.push(event.target); - } else { - trigger.getParent().excluded.add(event.target); - } - }, - ai: { - expose: 0.2, - }, - }, - bingzheng: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("bingzheng"), function (card, player, target) { - return target.countCards("h") != target.hp; - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - var nh = target.countCards("h"); - if (att > 0) { - if (nh == target.hp - 1) { - if (player == target) return att + 1; - return att + 2; - } - if (player == target && player.needsToDiscard()) return att / 3; - return att; - } else { - if (nh == target.hp + 1) return -att; - if (nh == 0) return 0; - return -att / 2; - } - }); - "step 1"; - if (result.bool) { - player.logSkill("bingzheng", result.targets); - event.target = result.targets[0]; - if (event.target.countCards("h")) { - player - .chooseControl(function (event, player) { - var target = event.target; - if (get.attitude(player, target) < 0) return 1; - return 0; - }) - .set("choiceList", ["令" + get.translation(event.target) + "摸一张牌", "令" + get.translation(event.target) + "弃置一张手牌"]); - } else { - event.directfalse = true; - } - } else { - event.finish(); - } - "step 2"; - if (event.directfalse || result.index == 0) { - event.target.draw(); - } else { - event.target.chooseToDiscard("h", true); - } - "step 3"; - if (event.target.countCards("h") == event.target.hp) { - player.draw(); - if (event.target == player) { - event.finish(); - return; - } - var next = player.chooseCard("是否交给" + get.translation(event.target) + "一张牌?", "he"); - next.set("ai", function (card) { - if (get.position(card) != "h") return 0; - if (_status.event.shan && card.name == "shan") { - return 11; - } - if (_status.event.goon) { - return 10 - get.value(card); - } - return -get.value(card, _status.event.player, "raw"); - }); - if (get.attitude(player, event.target) > 1 && player.countCards("h", "shan") > 1 && player.countCards("h") > event.target.countCards("h")) { - next.set("shan", true); - } - if (get.attitude(player, event.target) > 0 && player.needsToDiscard()) { - next.set("goon", true); - } - } else { - event.finish(); - } - "step 4"; - if (result.bool) { - player.give(result.cards, target); - } - }, - ai: { - expose: 0.2, - threaten: 1.4, - }, - }, - fuman: { - audio: 2, - enable: "phaseUse", - filterTarget: function (card, player, target) { - if (target == player) return false; - var stat = player.getStat("skill").fuman_targets; - return !stat || !stat.includes(target); - }, - filter: function (event, player) { - return player.countCards("h") > 0 && game.hasPlayer(current => lib.skill.fuman.filterTarget(null, player, current)); - }, - discard: false, - lose: false, - delay: false, - filterCard: true, - content: function () { - player.give(cards, target).gaintag.add("fuman"); - target.addSkill("fuman2"); - player.addSkill("fuman_draw"); - var stat = player.getStat("skill"); - if (!stat.fuman_targets) stat.fuman_targets = []; - stat.fuman_targets.push(target); - }, - check: function (card) { - return 6 - get.value(card); - }, - ai: { - order: 2, - result: { - target: function (player, target) { - if (!target.hasSha()) return 1.2; - return 1; - }, - }, - }, - subSkill: { - draw: { - trigger: { global: "useCardAfter" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return event.player.hasHistory("lose", function (evt) { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("fuman")) return true; - } - return false; - }); - }, - logTarget: "player", - content: function () { - player.draw( - trigger.player.hasHistory("sourceDamage", function (evt) { - return evt.card == trigger.card; - }) - ? 2 - : 1 - ); - }, - }, - }, - }, - fuman2: { - mod: { - aiOrder: function (player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("fuman")) return num + 1; - }, - cardname: function (card, player) { - if (get.itemtype(card) == "card" && card.hasGaintag("fuman")) return "sha"; - }, - }, - }, - qizhou: { - trigger: { player: ["phaseBefore", "equipEnd", "loseEnd"] }, - forced: true, - popup: false, - derivation: ["mashu", "reyingzi", "reduanbing", "fenwei"], - filter: function (event, player) { - if (player.equiping) return false; - var suits = []; - var es = player.getCards("e"); - for (var i = 0; i < es.length; i++) { - suits.add(get.suit(es[i])); - } - if (player.additionalSkills.qizhou) { - return player.additionalSkills.qizhou.length != suits.length; - } else { - return suits.length > 0; - } - }, - content: function () { - var suits = []; - var es = player.getCards("e"); - for (var i = 0; i < es.length; i++) { - suits.add(get.suit(es[i])); - } - player.removeAdditionalSkill("qizhou"); - switch (suits.length) { - case 1: - player.addAdditionalSkill("qizhou", ["mashu"]); - break; - case 2: - player.addAdditionalSkill("qizhou", ["mashu", "reyingzi"]); - break; - case 3: - player.addAdditionalSkill("qizhou", ["mashu", "reyingzi", "reduanbing"]); - break; - case 4: - player.addAdditionalSkill("qizhou", ["mashu", "reyingzi", "reduanbing", "fenwei"]); - break; - } - }, - ai: { - threaten: 1.2, - }, - }, - shanxi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: { color: "red", type: "basic" }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("he") && player.inRange(target); - }, - check: function (card) { - return 6 - get.value(card); - }, - content: function () { - "step 0"; - player.discardPlayerCard(target, true); - "step 1"; - if (result.bool) { - if (get.name(result.cards[0], result.cards[0].original == "h" ? player : false) == "shan") { - player.viewHandcards(target); - } else { - target.viewHandcards(player); - } - } - }, - ai: { - order: 8, - result: { - target: -1, - }, - }, - }, - fenxun: { - enable: "phaseUse", - usable: 1, - position: "he", - filterTarget: function (card, player, target) { - return target != player; - }, - content: function () { - player.markAuto("fenxun2", [target]); - player.addTempSkill("fenxun2"); - }, - check: function (card) { - if (card.name == "sha" && _status.event.player.countCards("h", "sha") <= 1) return 0; - return 6 - get.value(card); - }, - filterCard: true, - ai: { - order: 4, - result: { - player: function (player, target) { - if (get.distance(player, target) <= 1) return 0; - var hs = player.getCards("h", "shunshou"); - if (hs.length && player.canUse(hs[0], target, false)) { - return 1; - } - var geteff = function (current) { - return player.canUse("sha", current, false, true) && get.effect(current, { name: "sha" }, player, player) > 0; - }; - if (player.hasSha() && geteff(target)) { - var num = game.countPlayer(function (current) { - return current != player && get.distance(player, current) <= 1 && geteff(current); - }); - if (num == 0) { - if ( - game.hasPlayer(function (current) { - return player.canUse("sha", current) && geteff(current) && current != target; - }) - ) { - return 1; - } - } else if (num == 1) { - return 1; - } - } - return 0; - }, - }, - }, - }, - fenxun2: { - mark: "character", - onremove: true, - intro: { - content: "到$的距离视为1", - }, - mod: { - globalFrom: function (from, to) { - if (from.getStorage("fenxun2").includes(to)) { - return -Infinity; - } - }, - }, - }, - duanbing: { - audio: 2, - audioname: ["heqi"], - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - return game.hasPlayer(function (current) { - return !event.targets.includes(current) && get.distance(player, current) <= 1 && player.canUse(event.card, current); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("duanbing"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { - return !_status.event.sourcex.includes(target) && get.distance(player, target) <= 1 && player.canUse(_status.event.card, target); - }) - .set("sourcex", trigger.targets) - .set("ai", function (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.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - player.logSkill("duanbing", event.target); - trigger.targets.push(event.target); - }, - ai: { - effect: { - player: function (card, player, target, current, isLink) { - if (!isLink && card.name == "sha") { - if (player._duanbingtmp) return; - player._duanbingtmp = true; - if (get.effect(target, card, player, player) <= 0) { - delete player._duanbingtmp; - return; - } - if ( - game.hasPlayer(function (current) { - return current != target && get.distance(player, current) <= 1 && player.canUse(card, current) && get.effect(current, card, player, player) > 0; - }) - ) { - delete player._duanbingtmp; - return [1, 1]; - } - delete player._duanbingtmp; - } - }, - }, - }, - }, - fuhan: { - audio: 2, - trigger: { player: "phaseBegin" }, - unique: true, - limited: true, - skillAnimation: true, - animationColor: "orange", - forceunique: true, - filter: function (event, player) { - return player.storage.fanghun2 > 0; - }, - prompt: function (event, player) { - var num = Math.max(2, player.storage.fanghun2 || 0); - num = Math.min(num, 8); - return get.prompt("fuhan") + "(体力上限:" + num + ")"; - }, - check: function (event, player) { - var num = Math.max(2, player.storage.fanghun2 || 0); - if (num == 1) return false; - if (player.hp <= 1) return true; - if (num == 2) return false; - if (num == 3) return player.hp < 3 && player.isMinHp(); - return true; - }, - content: function () { - "step 0"; - if (player.storage.fanghun) player.draw(player.storage.fanghun); - player.removeMark("fanghun", player.storage.fanghun); - event.num = Math.max(2, player.storage.fanghun2 || 0); - var list; - if (_status.characterlist) { - list = []; - for (var i = 0; i < _status.characterlist.length; i++) { - var name = _status.characterlist[i]; - if (lib.character[name][1] == "shu") list.push(name); - } - } else if (_status.connectMode) { - list = get.charactersOL(function (i) { - return lib.character[i][1] != "shu"; - }); - } else { - list = get.gainableCharacters(function (info) { - return info[1] == "shu"; - }); - } - var players = game.players.concat(game.dead); - for (var i = 0; i < players.length; i++) { - list.remove(players[i].name); - list.remove(players[i].name1); - list.remove(players[i].name2); - } - list.remove("zhaoyun"); - list.remove("re_zhaoyun"); - list.remove("ol_zhaoyun"); - // var dialog=ui.create.dialog(); - // dialog.add([list.randomGets(5),'character']); - player - .chooseButton(true) - .set("ai", function (button) { - return get.rank(button.link, true) - lib.character[button.link][2]; - }) - .set("createDialog", ["将武将牌替换为一名角色", [list.randomGets(5), "character"]]); - player.awakenSkill("fuhan"); - "step 1"; - event.num = Math.min(event.num, 8); - player.reinitCharacter("zhaoxiang", result.links[0]); - "step 2"; - var num = event.num - player.maxHp; - if (num > 0) player.gainMaxHp(num); - else player.loseMaxHp(-num); - player.recover(); - }, - ai: { - combo: "fanghun", - }, - }, - refuhan: { - audio: "fuhan", - trigger: { player: "phaseZhunbeiBegin" }, - unique: true, - limited: true, - skillAnimation: true, - animationColor: "orange", - forceunique: true, - filter: function (event, player) { - return player.countMark("fanghun") > 0; - }, - content: function () { - "step 0"; - if (player.storage.fanghun) player.draw(player.storage.fanghun); - player.removeMark("fanghun", player.storage.fanghun); - player.awakenSkill("refuhan"); - "step 1"; - var list; - if (_status.characterlist) { - list = []; - for (var i = 0; i < _status.characterlist.length; i++) { - var name = _status.characterlist[i]; - if (lib.character[name][1] == "shu") list.push(name); - } - } else if (_status.connectMode) { - list = get.charactersOL(function (i) { - return lib.character[i][1] != "shu"; - }); - } else { - list = get.gainableCharacters(function (info) { - return info[1] == "shu"; - }); - } - var players = game.players.concat(game.dead); - for (var i = 0; i < players.length; i++) { - list.remove(players[i].name); - list.remove(players[i].name1); - list.remove(players[i].name2); - } - list.remove("zhaoyun"); - list.remove("re_zhaoyun"); - list.remove("ol_zhaoyun"); - list = list.randomGets(Math.max(4, game.countPlayer())); - var skills = []; - for (var i of list) { - skills.addArray( - (lib.character[i][3] || []).filter(function (skill) { - var info = get.info(skill); - return info && !info.zhuSkill && !info.limited && !info.juexingji && !info.hiddenSkill && !info.charlotte && !info.dutySkill; - }) - ); - } - if (!list.length || !skills.length) { - event.finish(); - return; - } - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - _status.imchoosing = false; - event._result = { - bool: true, - skills: skills.randomGets(2), - }; - if (event.dialog) event.dialog.close(); - if (event.control) event.control.close(); - }; - var chooseButton = function (list, skills) { - var event = _status.event; - if (!event._result) event._result = {}; - event._result.skills = []; - var rSkill = event._result.skills; - var dialog = ui.create.dialog("请选择获得至多两个技能", [list, "character"], "hidden"); - event.dialog = dialog; - var table = document.createElement("div"); - table.classList.add("add-setting"); - table.style.margin = "0"; - table.style.width = "100%"; - table.style.position = "relative"; - for (var i = 0; i < skills.length; i++) { - var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); - td.link = skills[i]; - table.appendChild(td); - td.innerHTML = "" + get.translation(skills[i]) + ""; - td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { - if (_status.dragged) return; - if (_status.justdragged) return; - _status.tempNoButton = true; - setTimeout(function () { - _status.tempNoButton = false; - }, 500); - var link = this.link; - if (!this.classList.contains("bluebg")) { - if (rSkill.length >= 2) return; - rSkill.add(link); - this.classList.add("bluebg"); - } else { - this.classList.remove("bluebg"); - rSkill.remove(link); - } - }); - } - dialog.content.appendChild(table); - dialog.add("  "); - dialog.open(); - - event.switchToAuto = function () { - event.dialog.close(); - event.control.close(); - game.resume(); - _status.imchoosing = false; - }; - event.control = ui.create.control("ok", function (link) { - event.dialog.close(); - event.control.close(); - game.resume(); - _status.imchoosing = false; - }); - for (var i = 0; i < event.dialog.buttons.length; i++) { - event.dialog.buttons[i].classList.add("selectable"); - } - game.pause(); - game.countChoose(); - }; - if (event.isMine()) { - chooseButton(list, skills); - } else if (event.isOnline()) { - event.player.send(chooseButton, list, skills); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 2"; - var map = event.result || result; - if (map && map.skills && map.skills.length) { - player.addSkills(map.skills); - } - game.broadcastAll(function (list) { - game.expandSkills(list); - for (var i of list) { - var info = lib.skill[i]; - if (!info) continue; - if (!info.audioname2) info.audioname2 = {}; - info.audioname2.zhaoxiang = "fuhan"; - } - }, map.skills); - "step 3"; - if (player.isMinHp()) player.recover(); - }, - ai: { - combo: "refanghun" - }, - }, - refanghun: { - mod: { - aiValue: function (player, card, num) { - if (card.name != "sha" && card.name != "shan") return; - var geti = function () { - var cards = player.getCards("hs", function (card) { - return card.name == "sha" || card.name == "shan"; - }); - if (cards.includes(card)) { - return cards.indexOf(card); - } - return cards.length; - }; - return Math.max(num, [7, 5, 5, 3][Math.min(geti(), 3)]); - }, - }, - locked: false, - audio: "fanghun", - inherit: "fanghun", - trigger: { - player: "useCard", - target: "useCardToTargeted", - }, - }, - fanghun: { - hiddenCard: function (player, name) { - if (!player.storage.fanghun || player.storage.fanghun <= 0) return false; - if (name == "tao") return player.countCards("hs", "jiu") > 0; - if (name == "jiu") return player.countCards("hs", "tao") > 0; - return false; - }, - audio: 2, - marktext: "影", - intro: { - content: "mark", - name: "梅影", - }, - trigger: { - source: "damageSource", - player: "damageEnd", - }, - forced: true, - locked: false, - filter: function (event) { - return event.card && event.card.name == "sha"; - }, - content: function () { - player.addMark("fanghun", trigger.num || 1); - player.addMark("fanghun2", trigger.num || 1, false); - }, - group: ["fanghun_sha", "fanghun_draw"], - subSkill: { - draw: { - trigger: { player: ["useCardAfter", "respondAfter"] }, - forced: true, - popup: false, - filter: function (event) { - return event.skill == "fanghun_sha" || event.skill == "fanghun_shan"; - }, - content: function () { - player.draw(); - }, - }, - sha: { - audio: "fanghun", - inherit: "ollongdan", - enable: ["chooseToUse", "chooseToRespond"], - prompt: "弃置一枚【梅影】标记,将杀当做闪,或将闪当做杀,或将桃当做酒,或将酒当做桃使用或打出", - filter: function (event, player) { - return player.hasMark("fanghun") && get.info("ollongdan").filter(event, player); - }, - onrespond: function () { - return this.onuse.apply(this, arguments); - }, - onuse: function (result, player) { - player.removeMark("fanghun", 1); - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag) { - if (!player.hasMark("fanghun")) return false; - return get.info("ollongdan").ai.skillTagFilter(player, tag); - }, - order: function (item, player) { - if (!player || !player.storage) { - player = _status.event.player; - if (!player || !player.storage) return 0; - if ( - Object.keys(player.storage).some(i => { - return typeof i == "string" && i.indexOf("fuhan") != -1; - }) - ) - return 4; - return 1; - } - const awakened = Object.keys(player.storage).some(i => typeof i == "string" && i.indexOf("fuhan") != -1); - if (_status.event.type == "phase") { - var max = 0; - var list = ["sha", "tao", "jiu"]; - var map = { sha: "shan", tao: "jiu", jiu: "tao" }; - for (var i = 0; i < list.length; i++) { - var name = list[i]; - if (player.countCards("hs", map[name]) > (name == "jiu" ? 1 : 0) && player.getUseValue({ name: name }) > 0) { - var temp = get.order({ name: name }); - if (temp > max) max = temp; - } - } - if (max > 0) max += awakened ? 0.3 : -0.3; - return max; - } - return awakened ? 4 : 1; - }, - }, - }, - }, - }, - yjixi: { - derivation: "rewangzun", - audio: "weidi", - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - if (player.phaseNumber < 3) return false; - var num = 0; - for (var i = player.actionHistory.length - 1; i >= 0; i--) { - if (!player.actionHistory[i].isMe) continue; - if (_status.globalHistory[i].changeHp.some(evt => evt.player == player && evt.getParent().name == "loseHp")) return false; - else { - num++; - if (num >= 3) break; - } - } - return true; - }, - skillAnimation: true, - animationColor: "gray", - unique: true, - juexingji: true, - content: function () { - "step 0"; - player.awakenSkill("yjixi"); - player.gainMaxHp(); - player.recover(); - "step 1"; - var str = "摸两张牌"; - var mode = get.mode(); - var choice = "选项一"; - if (mode == "identity" || (mode == "versus" && _status.mode == "four")) { - var list = []; - var zhu = get.zhu(player); - if (zhu && zhu != player && zhu.skills) { - for (var i = 0; i < zhu.skills.length; i++) { - if (lib.skill[zhu.skills[i]] && lib.skill[zhu.skills[i]].zhuSkill) { - list.push(zhu.skills[i]); - } - } - } - if (list.length) { - str += "并获得技能" + get.translation(list); - event.list = list; - choice = "选项二"; - } - } - player - .chooseControl(function (event, player) { - return _status.event.choice; - }) - .set("choiceList", ["获得技能〖妄尊〗", str]) - .set("choice", choice); - "step 2"; - if (result.control == "选项一") { - player.addSkills("rewangzun"); - } else { - player.draw(2); - if (event.list) { - player.addSkills(event.list); - game.broadcastAll(function (list) { - game.expandSkills(list); - for (var i of list) { - var info = lib.skill[i]; - if (!info) continue; - if (!info.audioname2) info.audioname2 = {}; - info.audioname2.old_yuanshu = "weidi"; - } - }, event.list); - } - } - }, - }, - xinyongsi: { - audio: "yongsi", - group: ["xinyongsi1", "xinyongsi2"], - locked: true, - }, - xinyongsi1: { - audio: "yongsi1", - trigger: { player: "phaseDrawBegin1" }, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - player.draw(game.countGroup()); - trigger.changeToZero(); - }, - }, - xinyongsi2: { - audio: "yongsi2", - trigger: { player: "phaseDiscardBegin" }, - forced: true, - check: function () { - return false; - }, - content: function () { - "step 0"; - player.chooseToDiscard("he", "庸肆").set("prompt2", "弃置一张牌,或取消并失去1点体力").ai = function (card) { - return 8 - get.value(card); - }; - "step 1"; - if (!result.bool) player.loseHp(); - }, - }, - lianzhu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: true, - position: "he", - filterTarget: function (card, player, target) { - return target != player; - }, - check: function (card) { - var num = get.value(card); - if (get.color(card) == "black") { - if (num >= 6) return 0; - return 20 - num; - } else { - if (_status.event.player.needsToDiscard()) return 7 - num; - } - return 0; - }, - discard: false, - lose: false, - delay: false, - content: function () { - "step 0"; - player.give(cards, target); - if (get.color(cards[0]) == "black") { - target - .chooseToDiscard(2, "he", "弃置两张牌,或令" + get.translation(player) + "摸两张牌") - .set("ai", function (card) { - if (_status.event.goon) return 7 - get.value(card); - return 0; - }) - .set("goon", get.attitude(target, player) < 0); - } else { - event.finish(); - } - "step 1"; - if (!result.bool) { - player.draw(2); - } - }, - ai: { - order: 8, - expose: 0.2, - result: { - target: function (player, target) { - if (ui.selected.cards.length && get.color(ui.selected.cards[0]) == "red") { - if (target.countCards("h") < player.countCards("h")) return 1; - return 0.5; - } - return -1; - }, - }, - }, - }, - xiehui: { - mod: { - ignoredHandcard: function (card, player) { - if (get.color(card) == "black") { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && get.color(card) == "black") return false; - }, - }, - trigger: { - global: "gainAfter", - player: "loseAsyncAfter", - }, - forced: true, - popup: false, - filter: function (event, player) { - if (event.name == "loseAsync") { - if (event.type != "gain") return false; - return game.hasPlayer(function (current) { - if (current == player) return false; - var hs = current.getCards("h"), - cards = event.getl(player).cards2; - var cardsx = event.getg(current); - for (var i of cardsx) { - if (hs.includes(i) && cards.includes(i) && get.color(i, player) == "black") return true; - } - return false; - }); - } - if (event.player != player) { - var hs = event.player.getCards("h"); - var evt = event.getl(player); - return ( - evt && - evt.cards2 && - evt.cards2.filter(function (card) { - return hs.includes(card) && get.color(card, player) == "black"; - }).length > 0 - ); - } - return false; - }, - content: function () { - var cards = trigger.getl(player).cards2; - game.countPlayer(function (current) { - if (current == player) return; - var hs = current.getCards("h"), - cardsx = trigger.getg(current).filter(function (card) { - return hs.includes(card) && cards.includes(card) && get.color(card, player) == "black"; - }); - if (cardsx.length > 0) { - current.addSkill("xiehui2"); - current.addGaintag(cards, "xiehui"); - } - }); - }, - }, - xiehui2: { - mark: true, - intro: { - content: "不能使用、打出或弃置得到的黑色牌", - }, - mod: { - cardDiscardable: function (card, player) { - if (card.hasGaintag("xiehui")) return false; - }, - cardEnabled2: function (card, player) { - if (get.itemtype(card) == "card" && card.hasGaintag("xiehui")) return false; - }, - }, - trigger: { player: "changeHp" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event) { - return event.num < 0; - }, - content: function () { - player.removeSkill("xiehui2"); - }, - onremove: function (player) { - player.removeGaintag("xiehui"); - }, - }, - shanjia: { - sync: function (player) { - if (game.online) return; - var history = player.actionHistory; - var num = 0; - for (var i = 0; i < history.length; i++) { - for (var j = 0; j < history[i].useCard.length; j++) { - if (get.type(history[i].useCard[j].card) == "equip") num++; - } - } - player.storage.shanjia = num; - if (num > 0) player.markSkill("shanjia"); - }, - audio: 2, - intro: { - content: function (storage) { - if (storage == 0) return "未使用过装备牌"; - return "已使用过" + storage + "张装备牌"; - }, - }, - group: "shanjia2", - trigger: { player: "phaseUseBegin" }, - frequent: true, - filter: function (event, player) { - lib.skill.shanjia.sync(player); - return player.storage.shanjia > 0; - }, - content: function () { - "step 0"; - lib.skill.shanjia.sync(player); - player.draw(Math.min(7, player.storage.shanjia)); - "step 1"; - player.chooseToDiscard("he", Math.min(7, player.storage.shanjia), true); - "step 2"; - var useCard = false; - if (result.bool && result.cards) { - for (var i = 0; i < result.cards.length; i++) { - if (result.cards[i].original == "e") { - useCard = true; - break; - } - } - } - if (useCard) { - player.chooseUseTarget({ name: "sha" }, false, "是否视为使用一张【杀】?", "nodistance"); - } - }, - ai: { - threaten: function (player, target) { - if (typeof target.storage.shanjia == "number") { - return Math.min(2, Math.sqrt(1 + target.storage.shanjia)); - } - }, - }, - }, - shanjia2: { - trigger: { player: "useCard" }, - silent: true, - filter: function (event, player) { - return get.type(event.card) == "equip"; - }, - content: function () { - lib.skill.shanjia.sync(player); - }, - }, - zhanyi: { - enable: "phaseUse", - usable: 1, - audio: 2, - filterCard: true, - position: "he", - check: function (card) { - var player = _status.event.player; - if (player.hp < 3) return 0; - var type = get.type(card, "trick"); - if (type == "trick") { - return 6 - get.value(card); - } else if (type == "equip") { - if ( - player.hasSha() && - game.hasPlayer(function (current) { - return player.canUse("sha", current) && get.attitude(player, current) < 0 && get.effect(current, { name: "sha" }, player, player) > 0; - }) - ) { - return 6 - get.value(card); - } - } - return 0; - }, - content: function () { - player.loseHp(); - switch (get.type(cards[0], "trick")) { - case "basic": - player.addTempSkill("zhanyi_basic"); - break; - case "equip": - player.addTempSkill("zhanyi_equip"); - break; - case "trick": - player.addTempSkill("zhanyi_trick"); - player.draw(2); - break; - } - }, - ai: { - order: 9.1, - result: { - player: 1, - }, - }, - }, - zhanyi_basic: { - group: ["zhanyi_basic_sha", "zhanyi_basic_jiu", "zhanyi_basic_tao"], - }, - zhanyi_basic_tao: { - enable: "chooseToUse", - filterCard: { type: "basic" }, - viewAs: { name: "tao" }, - viewAsFilter: function (player) { - if (!player.countCards("h", { type: "basic" })) return false; - }, - prompt: "将一张基本牌当桃使用", - check: function (card) { - return 8 - get.value(card); - }, - ai: { - skillTagFilter: function (player) { - if (!player.countCards("h", { type: "basic" })) return false; - }, - save: true, - }, - }, - zhanyi_basic_sha: { - enable: "chooseToUse", - filterCard: { type: "basic" }, - viewAs: { name: "sha" }, - viewAsFilter: function (player) { - if (!player.countCards("h", { type: "basic" })) return false; - }, - prompt: "将一张基本牌当杀使用", - check: function (card) { - return 4 - get.value(card); - }, - ai: { - skillTagFilter: function (player) { - if (!player.countCards("h", { type: "basic" })) return false; - }, - respondSha: true, - }, - }, - zhanyi_basic_jiu: { - enable: "chooseToUse", - filterCard: { type: "basic" }, - viewAs: { name: "jiu" }, - viewAsFilter: function (player) { - if (!player.countCards("h", { type: "basic" })) return false; - }, - prompt: "将一张基本牌当酒使用", - check: function (card) { - if (_status.event.type == "dying") return 1; - return 4 - get.value(card); - }, - ai: { - skillTagFilter: function (player) { - return player.countCards("h", { type: "basic" }) > 0 && player.hp <= 0; - }, - save: true, - }, - }, - zhanyi_equip: { - trigger: { player: "shaBegin" }, - forced: true, - filter: function (event, player) { - return event.target.countCards("he") > 0; - }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - content: function () { - trigger.target.chooseToDiscard("he", true, 2); - }, - }, - zhanyi_trick: { - mod: { - targetInRange: function () { - return true; - }, - }, - }, - dingpan: { - enable: "phaseUse", - filter: function (event, player) { - var num; - var mode = get.mode(); - if (mode == "identity" || mode == "doudizhu") { - if (mode == "identity" && _status.mode == "purple") num = player.getEnemies().length; - else num = get.population("fan"); - } else if (mode == "versus") { - if (!_status.mode || _status.mode != "two") num = player.getEnemies().length; - else { - var target = game.findPlayer(x => { - var num = x.getFriends().length; - return !game.hasPlayer(y => { - return x != y && y.getFriends().length > num; - }); - }); - num = target ? target.getFriends(true).length : 1; - } - } else { - num = 1; - } - if ((player.getStat().skill.dingpan || 0) >= num) return false; - return true; - }, - filterTarget: function (card, player, target) { - return target.countCards("e") > 0; - }, - content: function () { - "step 0"; - target.draw(); - "step 1"; - var goon = get.damageEffect(target, player, target) >= 0; - if (!goon && target.hp >= 4 && get.attitude(player, target) < 0) { - var es = target.getCards("e"); - for (var i = 0; i < es.length; i++) { - if (get.equipValue(es[i], target) >= 8) { - goon = true; - break; - } - } - } - target - .chooseControl(function () { - if (_status.event.goon) return "选项二"; - return "选项一"; - }) - .set("goon", goon) - .set("prompt", "定叛") - .set("choiceList", ["令" + get.translation(player) + "弃置你装备区里的一张牌", "获得你装备区内的所有牌并受到1点伤害"]); - "step 2"; - if (result.control == "选项一") { - player.discardPlayerCard(target, true, "e"); - event.finish(); - } else { - target.gain(target.getCards("e"), "gain2"); - } - "step 3"; - game.delay(0.5); - target.damage(); - }, - ai: { - order: 7, - result: { - target: function (player, target) { - if (get.damageEffect(target, player, target) >= 0) return 2; - var att = get.attitude(player, target); - if (att == 0) return 0; - var es = target.getCards("e"); - if (att > 0 && (target.countCards("h") > 2 || target.needsToDiscard(1))) return 0; - if (es.length == 1 && att > 0) return 0; - for (var i = 0; i < es.length; i++) { - var val = get.equipValue(es[i], target); - if (val <= 4) { - if (att > 0) { - return 1; - } - } else if (val >= 7) { - if (att < 0) { - return -1; - } - } - } - return 0; - }, - }, - }, - }, - hongde: { - audio: 2, - trigger: { - player: ["loseAfter", "gainAfter"], - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - direct: true, - filter: function (event, player) { - var num = event.getl(player).cards2.length; - if (event.getg) num = Math.max(num, event.getg(player).length); - return num > 1; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("hongde"), "令一名其他角色摸一张牌", function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - return get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - player.logSkill("hongde", result.targets); - result.targets[0].draw(); - } - }, - }, - ziyuan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: function (card) { - 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; - }, - complexCard: true, - selectCard: function () { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - if (num == 13) return ui.selected.cards.length; - return ui.selected.cards.length + 2; - }, - discard: false, - lose: false, - delay: false, - filterTarget: function (card, player, target) { - return player != target; - }, - 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 9 - 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 (cards[i].number + cards[j].number == 13) { - if (cards[i] == card || cards[j] == card) return 8.5 - get.value(card); - } - } - } - } - return 0; - }, - content: function () { - player.give(cards, target, "give"); - target.recover(); - }, - ai: { - order: function (skill, player) { - if ( - game.hasPlayer(function (current) { - return current.hp < current.maxHp && current != player && get.recoverEffect(current, player, player) > 0; - }) - ) { - return 10; - } - return 1; - }, - result: { - player: function (player, target) { - if (get.attitude(player, target) < 0) return -1; - var eff = get.recoverEffect(target, player, player); - if (eff < 0) return 0; - if (eff > 0) { - if (target.hp == 1) return 3; - return 2; - } - if (player.needsToDiscard()) return 1; - return 0; - }, - }, - threaten: 1.3, - }, - }, - jugu: { - audio: 2, - mod: { - maxHandcard: function (player, num) { - return num + player.maxHp; - }, - }, - trigger: { global: "phaseBefore", player: "enterGame" }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - player.draw(player.maxHp); - }, - }, - tuifeng: { - audio: 2, - trigger: { player: "damageEnd" }, - direct: true, - notemp: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player.chooseCard(get.prompt2("tuifeng"), "he", [1, trigger.num]).set("ai", function (card) { - if (card.name == "du") return 20; - return 7 - get.useful(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("tuifeng"); - player.addToExpansion(result.cards, player, "give").gaintag.add("tuifeng"); - } - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - marktext: "锋", - intro: { - content: "expansion", - markcount: "expansion", - }, - group: "tuifeng2", - ai: { - threaten: 0.8, - maixie: true, - maixie_hp: true, - }, - }, - tuifeng2: { - audio: "tuifeng", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return player.getExpansions("tuifeng").length > 0; - }, - content: function () { - var cards = player.getExpansions("tuifeng"); - player.draw(2 * cards.length); - player.addTempSkill("tuifeng3"); - player.addMark("tuifeng3", cards.length, false); - player.loseToDiscardpile(cards); - }, - }, - tuifeng3: { - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("tuifeng3"); - }, - }, - onremove: true, - charlotte: true, - }, - weidi: { - init(player) { - const list = []; - const zhu = get.zhu(player); - if (zhu && zhu != player && zhu.skills) { - for (var i = 0; i < zhu.skills.length; i++) { - if (lib.skill[zhu.skills[i]] && lib.skill[zhu.skills[i]].zhuSkill) { - list.push(zhu.skills[i]); - } - } - } - player.addAdditionalSkill("weidi", list); - game.broadcastAll(function (list) { - game.expandSkills(list); - for (var i of list) { - var info = lib.skill[i]; - if (!info) continue; - if (!info.audioname2) info.audioname2 = {}; - info.audioname2.yuanshu = "weidi"; - } - }, list); - }, - trigger: { global: ["gameStart", "changeSkillsAfter"] }, - forced: true, - audio: 2, - filter: function (event, player) { - const mode = get.mode(); - if (mode != "identity" && (mode != "versus" || _status.mode != "four")) return false; - const zhu = get.zhu(player); - if (!zhu || zhu == player) return false; - if (event.name == "gameStart") return true; - return ( - event.player == zhu && - (event.addSkill.some(skill => { - return lib.skill[skill] && lib.skill[skill].zhuSkill; - }) || - event.addSkill.some(skill => { - return lib.skill[skill] && lib.skill[skill].zhuSkill; - })) - ); - }, - async content(event, trigger, player) { - lib.skill.weidi.init(player); - }, - }, - zhenlue: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - filter: function (event) { - return get.type(event.card) == "trick"; - }, - content: function () { - trigger.nowuxie = true; - }, - mod: { - targetEnabled: function (card, player, target) { - if (get.type(card) == "delay") { - return false; - } - }, - }, - }, - jianshu: { - audio: 2, - unique: true, - limited: true, - enable: "phaseUse", - animationColor: "thunder", - skillAnimation: "epic", - filter: function (event, player) { - return !player.storage.jianshu && player.countCards("h", { color: "black" }) > 0; - }, - init: function (player) { - player.storage.jianshu = false; - }, - 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: { color: "black" }, - mark: 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, - multitarget: true, - content: function () { - "step 0"; - player.awakenSkill("jianshu"); - player.storage.jianshu = true; - player.give(cards, targets[0], "give"); - "step 1"; - targets[0].chooseToCompare(targets[1]); - "step 2"; - if (result.bool) { - targets[0].chooseToDiscard("he", 2, true); - targets[1].loseHp(); - } else if (result.tie) { - targets[0].loseHp(); - targets[1].loseHp(); - } else { - targets[1].chooseToDiscard("he", 2, true); - targets[0].loseHp(); - } - }, - intro: { - content: "limited", - }, - ai: { - expose: 0.4, - order: 4, - result: { - target: function (player, target) { - if (player.hasUnknown()) return 0; - if (ui.selected.targets.length) return -1; - return -0.5; - }, - }, - }, - }, - yongdi: { - audio: 2, - audioname: ["xinping"], - unique: true, - limited: true, - trigger: { player: "phaseZhunbeiBegin" }, - animationColor: "thunder", - skillAnimation: "legend", - mark: true, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("yongdi"), function (card, player, target) { - return (target.hasSex("male") || target.name == "key_yuri") && target != player; - }) - .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" || _status.mode == "guandu"))) { - 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) { - var target = result.targets[0]; - player.logSkill("yongdi", target); - player.awakenSkill("yongdi"); - target.gainMaxHp(); - target.recover(); - var skills = target.getStockSkills(true, true).filter(skill => { - if (target.hasSkill(skill)) return false; - var info = get.info(skill); - return info && info.zhuSkill; - }); - if (skills.length) { - target.addSkills(skills); - } - } - }, - ai: { expose: 0.2 }, - }, - regushe: { - audio: "gushe", - enable: "phaseUse", - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - selectTarget: [1, 3], - filter: function (event, player) { - return player.countMark("regushe") + player.countMark("regushe2") < 7 && player.countCards("h") > 0; - }, - multitarget: true, - multiline: true, - content: function () { - player.addTempSkill("regushe2"); - player.chooseToCompare(targets).callback = lib.skill.regushe.callback; - }, - intro: { - name: "饶舌", - content: "mark", - }, - callback: function () { - "step 0"; - if (event.num1 <= event.num2) { - target.chat(lib.skill.gushe.chat[player.countMark("regushe")]); - game.delay(); - player.addMark("regushe", 1); - if (player.countMark("regushe") >= 7) { - player.die(); - } - } else player.addMark("regushe2", 1, false); - "step 1"; - if (event.num1 <= event.num2) { - player.chooseToDiscard("he", "弃置一张牌,或摸一张牌").set("ai", function () { - return -1; - }); - } else event.goto(3); - "step 2"; - if (!result.bool) { - player.draw(); - } - "step 3"; - if (event.num1 >= event.num2) { - target - .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(player) + "摸一张牌") - .set("ai", function (card) { - if (_status.event.goon) return 6 - get.value(card); - return 0; - }) - .set("goon", get.attitude(target, player) < 0); - } else event.finish(); - "step 4"; - if (!result.bool) player.draw(); - }, - ai: { - order: 7, - result: { - target: function (player, target) { - var num = ui.selected.targets.length + 1; - if (num + player.countMark("regushe") <= 6) return -1; - var hs = player.getCards("h"); - for (var i = 0; i < hs.length; i++) { - if (get.value(hs[i]) <= 6) { - switch (hs[i].number) { - case 13: - return -1; - case 12: - if (player.countMark("regushe") + num <= 8) return -1; - break; - case 11: - if (player.countMark("regushe") + num <= 7) return -1; - break; - default: - if (hs[i].number > 5 && player.countMark("regushe") + num <= 6) return -1; - } - } - } - return 0; - }, - }, - }, - marktext: "饶", - }, - regushe2: { - charlotte: true, - onremove: true, - }, - rejici: { - audio: "jici", - trigger: { - player: "compare", - target: "compare", - }, - forced: true, - filter: function (event, player) { - // if(player!=event.target&&event.iwhile) return false; - return (player == event.player ? event.num1 : event.num2) <= player.countMark("regushe"); - }, - content: function () { - if (player == trigger.target || !trigger.iwhile) { - trigger[player == trigger.player ? "num1" : "num2"] += player.countMark("regushe"); - game.log(player, "的拼点牌点数+" + player.countMark("regushe")); - } - game.delayx(); - // var cards=[trigger.card1]; - // if(trigger.cardlist) cards.addArray(trigger.cardlist); - // else cards.push(trigger.card2); - // cards.sort(function(a,b){ - // return get.number(b)-get.number(a); - // }); - // var num=get.number(cards[0]); - // for(var i=1;i trigger.num2) cards.push(trigger.card1); - if (trigger.num1 < trigger.num2) cards.push(trigger.card2); - cards = cards.filterInD(); - if (cards.length) player.gain(cards, "gain2"); - }, - group: "rejici2", - ai: { - combo: "regushe", - }, - }, - rejici2: { - audio: "jici", - trigger: { player: "die" }, - forced: true, - forceDie: true, - skillAnimation: true, - animationColor: "water", - filter: function (event, player) { - return event.source && event.source.isIn(); - }, - logTarget: "source", - content: function () { - var num = 7 - player.countMark("regushe"); - if (num > 0) trigger.source.chooseToDiscard(num, true, "he"); - trigger.source.loseHp(); - }, - }, - gushe: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - selectTarget: [1, 3], - filter: function (event, player) { - return player.countCards("h") > 0; - }, - multitarget: true, - multiline: true, - content: function () { - player.chooseToCompare(targets).callback = lib.skill.gushe.callback; - }, - intro: { - name: "饶舌", - content: "mark", - }, - chat: ["粗鄙之语", "天地不容", "谄谀之臣", "皓首匹夫,苍髯老贼", "二臣贼子", "断脊之犬", "我从未见过有如此厚颜无耻之人!"], - callback: function () { - "step 0"; - if (event.num1 <= event.num2) { - target.chat(lib.skill.gushe.chat[player.countMark("gushe")]); - game.delay(); - player.addMark("gushe", 1); - if (player.countMark("gushe") >= 7) { - player.die(); - } - } - "step 1"; - if (event.num1 <= event.num2) { - player.chooseToDiscard("he", "弃置一张牌,或摸一张牌").set("ai", function () { - return -1; - }); - } else event.goto(3); - "step 2"; - if (!result.bool) { - player.draw(); - } - "step 3"; - if (event.num1 >= event.num2) { - target - .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(player) + "摸一张牌") - .set("ai", function (card) { - if (_status.event.goon) return 6 - get.value(card); - return 0; - }) - .set("goon", get.attitude(target, player) < 0); - } else event.finish(); - "step 4"; - if (!result.bool) player.draw(); - }, - ai: { - order: 7, - result: { - target: function (player, target) { - var num = ui.selected.targets.length + 1; - if (num > 3) num = 3; - var hs = player.getCards("h"); - for (var i = 0; i < hs.length; i++) { - if (get.value(hs[i]) <= 6) { - switch (hs[i].number) { - case 13: - return -1; - case 12: - if (player.countMark("gushe") + num <= 8) return -1; - break; - case 11: - if (player.countMark("gushe") + num <= 7) return -1; - break; - default: - if (hs[i].number > 5 && player.countMark("gushe") + num <= 6) return -1; - } - } - } - return 0; - }, - }, - }, - }, - jici: { - audio: 2, - trigger: { player: "compare" }, - filter: function (event, player) { - return event.getParent().name == "gushe" && !event.iwhile && event.num1 <= player.countMark("gushe"); - }, - content: function () { - if (trigger.num1 < player.countMark("gushe")) { - trigger.num1 += player.countMark("gushe"); - } else { - player.getStat().skill.gushe--; - } - }, - ai: { - combo: "gushe", - }, - }, - juesi: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("h", "sha") > 0; - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("he") > 0 && player.inRange(target); - }, - filterCard: { name: "sha" }, - content: function () { - "step 0"; - target.chooseToDiscard("he", true); - "step 1"; - if (target.hp >= player.hp && result.bool && result.cards[0].name != "sha") { - player.useCard({ name: "juedou", isCard: true }, target); - } - }, - ai: { - order: 2, - result: { - target: function (player, target) { - if (get.effect(target, { name: "juedou" }, player, player) <= 0) { - return 0; - } - if (target.hp < player.hp) { - if (player.countCards("h") > player.hp) return -0.1; - return 0; - } - var hs1 = target.getCards("h", "sha"); - var hs2 = player.getCards("h", "sha"); - if (hs1.length > hs2.length) { - return 0; - } - var hsx = target.getCards("h"); - if (hsx.length > 2 && hs2.length <= 1 && hsx[0].number < 6) { - return 0; - } - if (hsx.length > 3 && hs2.length <= 1) { - return 0; - } - if (hs1.length > hs2.length - 1 && hs1.length > 0 && (hs2.length <= 1 || hs1[0].number > hs2[0].number)) { - return 0; - } - return -1; - }, - }, - }, - }, - shefu: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - audio: 2, - init: function (player) { - if (!player.storage.shefu) player.storage.shefu = []; - if (!player.storage.shefu2) player.storage.shefu2 = []; - }, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - content: "cards", - onunmark: function (storage, player) { - player.storage.shefu = []; - player.storage.shefu2 = []; - }, - mark: function (dialog, content, player) { - if (content && content.length) { - dialog.addAuto(content); - if (player.isUnderControl(true)) { - var str = ""; - for (var i = 0; i < player.storage.shefu2.length; i++) { - str += get.translation(player.storage.shefu2[i]); - if (i < player.storage.shefu2.length - 1) { - str += "、"; - } - } - dialog.add('
    ' + str + "
    "); - } - } - }, - }, - content: function () { - "step 0"; - var list1 = [], - list2 = [], - list3 = []; - for (var i = 0; i < lib.inpile.length; i++) { - var type = get.type(lib.inpile[i]); - if (type == "basic") { - list1.push(["基本", "", lib.inpile[i]]); - } else if (type == "trick") { - list2.push(["锦囊", "", lib.inpile[i]]); - } else if (type == "delay") { - list3.push(["锦囊", "", lib.inpile[i]]); - } - } - player - .chooseButton([get.prompt("shefu"), [list1.concat(list2).concat(list3), "vcard"]]) - .set("filterButton", function (button) { - var player = _status.event.player; - if (player.storage.shefu2 && player.storage.shefu2.includes(button.link[2])) return false; - return true; - }) - .set("ai", function (button) { - var rand = _status.event.rand; - switch (button.link[2]) { - case "sha": - return 5 + rand[1]; - case "tao": - return 4 + rand[2]; - case "lebu": - return 3 + rand[3]; - case "shan": - return 4.5 + rand[4]; - case "wuzhong": - return 4 + rand[5]; - case "shunshou": - return 3 + rand[6]; - case "nanman": - return 2 + rand[7]; - case "wanjian": - return 2 + rand[8]; - default: - return rand[0]; - } - }) - .set("rand", [Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random()]); - "step 1"; - if (result.bool) { - event.cardname = result.links[0][2]; - player.logSkill("shefu"); - player.chooseCard("he", "选择一张牌作为“伏兵”", true); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - var card = result.cards[0]; - event.card = card; - player.addToExpansion(card, player, "give").gaintag.add("shefu"); - } - "step 3"; - if (player.getExpansions("shefu").includes(event.card)) { - player.storage.shefu.push(card); - player.storage.shefu2.push(event.cardname); - if (player.isOnline2()) { - player.send(function (storage) { - game.me.storage.shefu2 = storage; - }, player.storage.shefu2); - } - player.syncStorage("shefu"); - player.markSkill("shefu"); - } - }, - group: ["shefu2"], - }, - shefu2: { - trigger: { global: ["useCard"] }, - //priority:15, - audio: "shefu", - filter: function (event, player) { - if (_status.currentPhase == player || event.player == player) return false; - return ( - player.storage.shefu2 && - player.storage.shefu2.includes(event.card.name) && - event.player.getHistory("lose", function (evt) { - return evt.getParent() == event && evt.hs && evt.hs.length == event.cards.length; - }).length - ); - }, - direct: true, - content: function () { - "step 0"; - var effect = 0; - if (trigger.card.name == "wuxie" || trigger.card.name == "shan") { - if (get.attitude(player, trigger.player) < -1) { - effect = -1; - } - } else if (trigger.targets && trigger.targets.length) { - for (var i = 0; i < trigger.targets.length; i++) { - effect += get.effect(trigger.targets[i], trigger.card, trigger.player, player); - } - } - var str = "设伏:是否令" + get.translation(trigger.player); - if (trigger.targets && trigger.targets.length) { - str += "对" + get.translation(trigger.targets); - } - str += "使用的" + get.translation(trigger.card) + "失效?"; - var next = player.chooseBool(str, function () { - var player = _status.event.player; - var trigger = _status.event.getTrigger(); - if (_status.event.effect < 0) { - if (trigger.card.name == "sha") { - var target = trigger.targets[0]; - if (target == player) { - return !player.countCards("h", "shan"); - } else { - return target.hp == 1 || (target.countCards("h") <= 2 && target.hp <= 2); - } - } else { - return true; - } - } - return false; - }); - next.set("effect", effect); - "step 1"; - if (result.bool) { - player.logSkill("shefu", trigger.player); - var index = player.storage.shefu2.indexOf(trigger.card.name); - if (index != -1) { - var card = player.storage.shefu[index]; - player.loseToDiscardpile(card); - player.storage.shefu.splice(index, 1); - player.storage.shefu2.splice(index, 1); - if (player.storage.shefu.length == 0) { - player.unmarkSkill("shefu"); - } else { - player.syncStorage("shefu"); - player.markSkill("shefu"); - if (player.isOnline2()) { - player.send(function (storage) { - game.me.storage.shefu2 = storage; - }, player.storage.shefu2); - } - } - } - trigger.targets.length = 0; - trigger.all_excluded = true; - if (trigger.player == _status.currentPhase) trigger.player.addTempSkill("baiban"); - } - }, - ai: { - threaten: 1.8, - expose: 0.3, - }, - }, - benyu: { - audio: 2, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - if (!event.source) return false; - var nh1 = player.countCards("h"); - var nh2 = event.source.countCards("h"); - var eh = player.countCards("e"); - if (nh1 + eh > nh2 && event.source.isIn()) return true; - if (nh1 < Math.min(5, nh2)) return true; - }, - direct: true, - content: function () { - "step 0"; - var num1 = player.countCards("h"); - var num2 = trigger.source.countCards("h"); - var eh = player.countCards("he", function (card) { - return lib.filter.cardDiscardable(card, player, "benyu"); - }); - var bool1 = false, - bool2 = false; - if (num1 < Math.min(num2, 5)) bool1 = true; - if (eh > num2 && trigger.source.isIn()) bool2 = true; - if (bool1 && bool2) { - event.chosen = true; - player - .chooseControl("cancel2") - .set("prompt", get.prompt("benyu", trigger.source)) - .set("choiceList", ["将手牌摸至" + get.cnNumber(Math.min(num2, 5)) + "张", "弃置至少" + get.cnNumber(num2 + 1) + "张牌并对其造成1点伤害"]); - } else if (bool2) event.goto(3); - "step 1"; - if (event.chosen) { - if (result.control == "cancel2") event.finish(); - else if (result.index == 1) event.goto(3); - else event._result = { bool: true }; - } else player.chooseBool(get.prompt("benyu", trigger.source), "将手牌摸至" + get.cnNumber(Math.min(trigger.source.countCards("h"), 5)) + "张"); - "step 2"; - if (result.bool) { - player.logSkill("benyu", trigger.source); - player.drawTo(Math.min(trigger.source.countCards("h"), 5)); - } - event.finish(); - "step 3"; - var num = trigger.source.countCards("h") + 1; - var args = [[num, player.countCards("he")], "he"]; - if (event.chosen) { - player.logSkill("benyu", trigger.source); - args.push(true); - } else { - args.push(get.prompt("benyu", trigger.source)); - args.push("弃置" + get.cnNumber(num) + "张牌并对其造成1点伤害"); - } - var next = player.chooseToDiscard.apply(player, args); - if (!event.chosen) next.logSkill = ["benyu", trigger.source]; - next.set("ai", function (card) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - if (ui.selected.cards.length >= _status.event.num) { - return -1; - } - if (get.damageEffect(trigger.source, player, player) > 0 && (get.value(card, player) < 0 || _status.event.num <= 2)) { - return 8 - get.value(card); - } - return -1; - }); - next.set("num", num); - "step 4"; - if (result.bool) trigger.source.damage(); - }, - }, - jili: { - audio: 2, - trigger: { - global: "useCardToTarget", - }, - forced: true, - check: function (event, player) { - return get.effect(player, event.card, event.player, player) > 0; - }, - filter: function (event, player) { - if (get.color(event.card) != "red") return false; - if (!event.targets) return false; - if (event.player == player) return false; - if (event.targets.includes(player)) return false; - if (get.info(event.card).multitarget) return false; - var type = get.type(event.card); - if (type != "basic" && type != "trick") return false; - if (lib.filter.targetEnabled2(event.card, event.player, player)) { - for (var i = 0; i < event.targets.length; i++) { - if (get.distance(event.targets[i], player) <= 1) return true; - } - } - return false; - }, - autodelay: true, - content: function () { - trigger.getParent().targets.add(player); - trigger.player.line(player, "green"); - }, - }, - zhidao: { - audio: 2, - mod: { - aiOrder: function (player, card, num) { - if (num > 0 && !player.hasSkill("zhidao2") && !get.tag(card, "damage") && (!lib.filter.targetEnabled(card, player, player) || get.effect(player, card, player) <= 0)) return num + 10; - }, - }, - trigger: { source: "damageSource" }, - filter: function (event, player) { - if (event._notrigger.includes(event.player)) return false; - return _status.currentPhase == player && event.player.isIn() && event.player.countCards("hej") > 0 && event.player != player && !player.hasSkill("zhidao2"); - }, - forced: true, - content: function () { - var num = 0; - if (trigger.player.countCards("h")) num++; - if (trigger.player.countCards("e")) num++; - if (trigger.player.countCards("j")) num++; - if (num) { - player.gainPlayerCard(trigger.player, num, "hej", true).set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if (get.position(button.link) == get.position(ui.selected.buttons[i].link)) return false; - } - return true; - }); - } - player.addTempSkill("zhidao2"); - }, - }, - zhidao2: { - mod: { - playerEnabled: function (card, player, target) { - if (player != target) return false; - }, - }, - }, - luanzhan: { - mod: { - selectTarget: function (card, player, range) { - if (!player.storage.luanzhan) return; - if (range[1] == -1) return; - if (card.name == "sha") range[1] += player.storage.luanzhan; - if (get.color(card) == "black" && get.type(card) == "trick") { - var info = get.info(card); - if (info.multitarget) return false; - range[1] += player.storage.luanzhan; - } - }, - }, - trigger: { source: "damageSource" }, - audio: 2, - forced: true, - mark: true, - intro: { - content: function (storage) { - return "可以额外指定" + storage + "个目标"; - }, - }, - init: function (player) { - player.storage.luanzhan = 0; - }, - init2: function (player) { - player.markSkill("luanzhan"); - }, - content: function () { - if (typeof player.storage.luanzhan == "number") { - player.storage.luanzhan += trigger.num; - } else { - player.storage.luanzhan = trigger.num; - } - if (player.hasSkill("luanzhan")) { - player.markSkill("luanzhan"); - } - }, - group: "luanzhan_cancel", - subSkill: { - cancel: { - audio: "luanzhan", - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - if (!player.storage.luanzhan) return false; - var check = false; - var card = event.card; - if (card.name == "sha") { - check = true; - } else if (get.color(card) == "black" && get.type(card) == "trick") { - var info = get.info(card); - if (!info.multitarget) { - check = true; - if (info.selectTarget == -1) { - check = false; - } else if (Array.isArray(info.selectTarget) && info.selectTarget[1] == -1) { - check = false; - } - } - } - if (check && event.targets && event.targets.length < player.storage.luanzhan) { - return true; - } - return false; - }, - content: function () { - player.storage.luanzhan = 0; - player.markSkill("luanzhan"); - }, - }, - }, - }, - xinzhengnan: { - audio: "zhengnan", - trigger: { global: "dying" }, - frequent: true, - filter: function (event, player) { - return !player.storage.xinzhengnan || !player.storage.xinzhengnan.includes(event.player); - }, - content: function () { - "step 0"; - if (!player.storage.xinzhengnan) player.storage.xinzhengnan = []; - player.storage.xinzhengnan.add(trigger.player); - player.storage.xinzhengnan.sortBySeat(); - player.markSkill("xinzhengnan"); - player.recover(); - var list = []; - if (!player.hasSkill("new_rewusheng")) { - list.push("new_rewusheng"); - } - if (!player.hasSkill("xindangxian")) { - list.push("xindangxian"); - } - if (!player.hasSkill("rezhiman")) { - list.push("rezhiman"); - } - if (list.length) { - player.draw(); - event.list = list; - } else { - player.draw(3); - event.finish(); - } - "step 1"; - if (event.list.length == 1) event._result = { control: event.list[0] }; - else - player - .chooseControl(event.list) - .set("prompt", "征南:选择获得下列技能中的一个") - .set("ai", function () { - if (event.list.includes("xindangxian")) return "xindangxian"; - return 0; - }); - "step 2"; - if (result.control == "xindangxian") player.storage.xinfuli = true; - player.addSkills(result.control); - }, - ai: { threaten: 2.5 }, - intro: { - content: "已因$发动过技能", - }, - derivation: ["new_rewusheng", "xindangxian", "rezhiman"], - }, - zhengnan: { - derivation: ["new_rewusheng", "dangxian", "rezhiman"], - audio: 2, - trigger: { global: "dieAfter" }, - frequent: true, - content: function () { - "step 0"; - player.draw(3); - "step 1"; - var list = lib.skill.zhengnan.derivation.filter(skill => !player.hasSkill(skill)); - if (list.length == 1) event._result = { control: list[0] }; - else if (list.length > 0) { - player - .chooseControl(list) - .set("prompt", "选择获得一项技能") - .set("ai", function () { - if (_status.event.controls.includes("dangxian")) return "dangxian"; - return _status.event.controls[0]; - }); - } else event.finish(); - "step 2"; - if (result.control) { - player.addSkills(result.control); - } - }, - ai: { threaten: 2 }, - }, - xiefang: { - mod: { - globalFrom: function (from, to, distance) { - return ( - distance - - game.countPlayer(function (current) { - return current.hasSex("female"); - }) - ); - }, - }, - }, - qizhi: { - audio: 2, - trigger: { - player: "useCardToPlayered", - }, - direct: true, - filter: function (event, player) { - if (!event.targets) return false; - if (!event.isFirstTarget) return false; - if (_status.currentPhase != player) return false; - var type = get.type(event.card, "trick"); - if (type != "basic" && type != "trick") return false; - if (event.noai) return false; - return game.hasPlayer(function (target) { - return !event.targets.includes(target) && target.countCards("he") > 0; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("qizhi"), "弃置一名角色的一张牌,然后其摸一张牌", function (card, player, target) { - return !_status.event.targets.includes(target) && target.countCards("he") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - if (target == player) return 2; - if (get.attitude(player, target) <= 0) { - return 1; - } - return 0.5; - }) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - player.getHistory("custom").push({ qizhi: true }); - player.logSkill("qizhi", result.targets); - player.discardPlayerCard(result.targets[0], true, "he"); - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - event.target.draw(); - }, - }, - jinqu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - check: function (event, player) { - return ( - player.getHistory("custom", function (evt) { - return evt.qizhi == true; - }).length >= player.countCards("h") - ); - }, - prompt: function (event, player) { - var num = player.getHistory("custom", function (evt) { - return evt.qizhi == true; - }).length; - return "进趋:是否摸两张牌并将手牌弃置至" + get.cnNumber(num) + "张?"; - }, - content: function () { - "step 0"; - player.draw(2); - "step 1"; - var dh = - player.countCards("h") - - player.getHistory("custom", function (evt) { - return evt.qizhi == true; - }).length; - if (dh > 0) { - player.chooseToDiscard(dh, true); - } - }, - ai: { combo: "qizhi" }, - }, - jiaozi: { - audio: 2, - trigger: { player: "damageBegin3", source: "damageBegin1" }, - forced: true, - filter: function (event, player) { - return player.isMaxHandcard(true); - }, - content: function () { - trigger.num++; - }, - ai: { presha: true }, - }, - jiqiao: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("he", { type: "equip" }) > 0; - }, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt2("jiqiao"), [1, player.countCards("he", { type: "equip" })], "he", function (card) { - return get.type(card) == "equip"; - }) - .set("ai", function (card) { - if (card.name == "bagua") return 10; - return 7 - get.value(card); - }).logSkill = "jiqiao"; - "step 1"; - if (result.bool) { - event.cards = get.cards(2 * result.cards.length); - player.showCards(event.cards); - } else { - event.finish(); - } - "step 2"; - var gained = []; - var tothrow = []; - for (var i = 0; i < event.cards.length; i++) { - if (get.type(event.cards[i]) != "equip") { - gained.push(event.cards[i]); - } else { - tothrow.push(event.cards[i]); - } - } - player.gain(gained, "gain2"); - game.cardsDiscard(tothrow); - }, - ai: { - threaten: 1.5, - }, - }, - linglong: { - audio: 2, - group: "linglong_bagua", - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha" && player.hasEmptySlot(1)) return num + 1; - }, - maxHandcard: function (player, num) { - if (!player.hasEmptySlot(3) || !player.hasEmptySlot(4)) return; - return num + 1; - }, - targetInRange: function (card, player, target, now) { - if (!player.hasEmptySlot(5)) return; - var type = get.type(card); - if (type == "trick" || type == "delay") return true; - }, - canBeDiscarded: function (card, source, player) { - if (!player.hasEmptySlot(5)) return; - if (get.position(card) == "e" && get.subtypes(card).some(slot => slot == "equip2" || slot == "equip5")) return false; - }, - /*cardDiscardable:function (card,player){ - if(player.getEquip(5)) return; - if(get.position(card)=='e') return false; - },*/ - }, - }, - linglong_bagua: { - audio: "linglong", - audioname2: { re_jsp_huangyueying: "relinglong" }, - inherit: "bagua_skill", - filter: function (event, player) { - if (!lib.skill.bagua_skill.filter(event, player)) return false; - if (!player.hasEmptySlot(2)) return false; - return true; - }, - ai: { - respondShan: true, - freeShan: true, - skillTagFilter(player, tag, arg) { - if (tag !== "respondShan" && tag !== "freeShan") return; - if (!player.hasEmptySlot(2) || player.hasSkillTag("unequip2")) return false; - if (!arg || !arg.player) return true; - if ( - arg.player.hasSkillTag("unequip", false, { - target: player, - }) - ) - return false; - return true; - }, - effect: { - target: function (card, player, target) { - if (player == target && get.subtype(card) == "equip2") { - if (get.equipValue(card) <= 7.5) return 0; - } - if (target.getEquip(2)) return; - return lib.skill.bagua_skill.ai.effect.target.apply(this, arguments); - }, - }, - }, - }, - zhenwei: { - audio: 2, - audioname: ["re_wenpin"], - trigger: { - global: "useCardToTarget", - }, - direct: true, - filter: function (event, player) { - if (player == event.target || player == event.player) return false; - if (!player.countCards("he")) return false; - if (event.targets.length > 1) return false; - if (!event.target) return false; - if (event.target.hp >= player.hp) return false; - - var card = event.card; - if (card.name == "sha") return true; - if (get.color(card) == "black" && get.type(card, "trick") == "trick") return true; - return false; - }, - content: function () { - "step 0"; - var save = false; - if (get.attitude(player, trigger.target) > 2) { - if (trigger.card.name == "sha") { - if (player.countCards("h", "shan") || player.getEquip(2) || trigger.target.hp == 1 || player.hp > trigger.target.hp + 1) { - if (!trigger.target.countCards("h", "shan") || trigger.target.countCards("h") < player.countCards("h")) { - save = true; - } - } - } else if (trigger.card.name == "juedou" && trigger.target.hp == 1) { - save = true; - } else if (trigger.card.name == "shunshou" && get.attitude(player, trigger.player) < 0 && get.attitude(trigger.player, trigger.target) < 0) { - save = true; - } - } - var next = player.chooseToDiscard("he", get.prompt(event.name, trigger.target), "弃置一张牌,将" + get.translation(trigger.card) + "转移给自己,或令此牌对其无效"); - next.logSkill = [event.name, trigger.target]; - next.set("ai", function (card) { - if (_status.event.aisave) { - return 7 - get.value(card); - } - return 0; - }); - next.set("aisave", save); - "step 1"; - if (result.bool) { - player - .chooseControl("转移", "失效", function () { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - if (trigger.card.name == "sha") { - if (player.countCards("h", "shan")) return "转移"; - } else if (trigger.card.name == "juedou") { - if (player.countCards("h", "sha")) return "转移"; - } - return "失效"; - }) - .set("prompt", "将" + get.translation(trigger.card) + "转移给你,或令其失效"); - } else { - event.finish(); - } - "step 2"; - if (result.control == "转移") { - player.draw(); - trigger.getParent().targets.remove(trigger.target); - trigger.getParent().triggeredTargets2.remove(trigger.target); - trigger.getParent().targets.push(player); - trigger.untrigger(); - trigger.player.line(player); - game.delayx(); - } else { - var cards = trigger.cards.filterInD(); - if (cards.length > 0) { - trigger.player.addSkill("zhenwei2"); - trigger.player.addToExpansion(cards, "gain2").gaintag.add("zhenwei2"); - } - trigger.targets.length = 0; - trigger.getParent().triggeredTargets2.length = 0; - } - }, - ai: { - threaten: 1.1, - }, - }, - zhenwei2: { - audio: false, - intro: { - content: "expansion", - markcount: "expansion", - }, - trigger: { global: "phaseEnd" }, - forced: true, - charlotte: true, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - content: function () { - "step 0"; - var cards = player.getExpansions("zhenwei2"); - if (cards.length) player.gain(cards, "gain2"); - "step 1"; - player.removeSkill("zhenwei2"); - }, - }, - xunzhi: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - locked: false, - init: function (player) { - player.storage.xunzhi = 0; - }, - filter: function (event, player) { - var previous = player.getPrevious(); - var next = player.getNext(); - if (previous && next) { - return player.hp != previous.hp && player.hp != next.hp; - } - return false; - }, - check: function (event, player) { - return player.hp >= 3 && player.countCards("h") > player.hp + 1 + player.storage.xunzhi; - }, - content: function () { - player.loseHp(); - player.storage.xunzhi += 2; - }, - mark: true, - intro: { - content: function (storage, player) { - return "手牌上限+" + player.storage.xunzhi; - }, - }, - mod: { - maxHandcard: function (player, num) { - if (typeof player.storage.xunzhi == "number") { - return num + player.storage.xunzhi; - } - }, - }, - }, - yawang: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - check: function (event, player) { - var num = game.countPlayer(function (target) { - return target.hp == player.hp; - }); - if (!player.hasSkill("xunzhi2")) { - var nh = player.countCards("h"); - if (nh > 5) return false; - if (num == 3 && nh > 3) return false; - } - return num >= 3; - }, - content: function () { - trigger.changeToZero(); - var num = game.countPlayer(function (target) { - return target.hp == player.hp; - }); - if (num) { - player.draw(num); - } - player.storage.yawang = num; - player.addTempSkill("yawang2"); - }, - ai: { - halfneg: true - }, - }, - yawang2: { - mod: { - cardEnabled: function (card, player) { - if (_status.currentPhase != player) return; - if (player.countUsed() >= player.storage.yawang) return false; - }, - cardSavable: function (card, player) { - if (_status.currentPhase != player) return; - if (player.countUsed() >= player.storage.yawang) return false; - }, - }, - }, - luoyan_tianxiang: { - inherit: "tianxiang", - filter: function (event, player) { - if (!player.storage.xingwu || !player.storage.xingwu.length) return false; - if (player.hasSkill("tianxiang")) return false; - return lib.skill.tianxiang.filter(event, player); - }, - }, - luoyan_liuli: { - inherit: "liuli", - filter: function (event, player) { - if (!player.storage.xingwu || !player.storage.xingwu.length) return false; - if (player.hasSkill("liuli")) return false; - return lib.skill.liuli.filter(event, player); - }, - }, - luoyan: { - group: ["luoyan_tianxiang", "luoyan_liuli"], - ai: { - combo: "xingwu", - }, - }, - xingwu: { - audio: 2, - group: ["xingwu_color", "xingwu_color2"], - subSkill: { - color: { - trigger: { player: "phaseZhunbeiBegin" }, - silent: true, - content: function () { - player.storage.xingwu_color = ["black", "red"]; - }, - }, - color2: { - trigger: { player: "useCard" }, - silent: true, - filter: function (event, player) { - return Array.isArray(player.storage.xingwu_color) && _status.currentPhase == player; - }, - content: function () { - player.storage.xingwu_color.remove(get.color(trigger.card)); - }, - }, - }, - trigger: { player: "phaseDiscardBegin" }, - direct: true, - filter: function (event, player) { - if (!player.storage.xingwu_color) return false; - var length = player.storage.xingwu_color.length; - if (length == 0) return false; - var hs = player.getCards("h"); - if (hs.length == 0) return false; - if (length == 2) return true; - var color = player.storage.xingwu_color[0]; - for (var i = 0; i < hs.length; i++) { - if (get.color(hs[i]) == color) return true; - } - return false; - }, - intro: { - content: "cards", - }, - init: function (player) { - player.storage.xingwu = []; - }, - content: function () { - "step 0"; - player - .chooseCard(get.prompt("xingwu"), function (card) { - return _status.event.player.storage.xingwu_color.includes(get.color(card)); - }) - .set("ai", function (card) { - var player = _status.event.player; - if (player.storage.xingwu.length == 2) { - if ( - !game.hasPlayer(function (current) { - return current != player && current.hasSex("male") && get.damageEffect(current, player, player) > 0 && get.attitude(player, current) < 0; - }) - ) - return 0; - } - return 7 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("xingwu"); - if (player.storage.xingwu.length < 2) { - player.$give(result.cards, player); - } - player.lose(result.cards, ui.special); - player.storage.xingwu = player.storage.xingwu.concat(result.cards); - player.markSkill("xingwu"); - player.syncStorage("xingwu"); - } else { - event.finish(); - } - "step 2"; - if (player.storage.xingwu.length == 3) { - player.$throw(player.storage.xingwu); - while (player.storage.xingwu.length) { - player.storage.xingwu.shift().discard(); - } - player.unmarkSkill("xingwu"); - player - .chooseTarget(function (card, player, target) { - return target != player && target.hasSex("male"); - }, "对一名男性角色造成2点伤害并弃置其装备区内的牌") - .set("ai", function (target) { - var player = _status.event.player; - if (get.attitude(player, target) > 0) return -1; - return get.damageEffect(target, player, player) + target.countCards("e") / 2; - }); - } else { - event.finish(); - } - "step 3"; - if (result.bool) { - var target = result.targets[0]; - target.damage(2); - event.target = target; - player.line(target, "green"); - } else { - event.finish(); - } - "step 4"; - if (event.target && event.target.isIn()) { - var es = event.target.getCards("e"); - if (es.length) { - event.target.discard(es); - } - } - }, - ai: { - threaten: 1.5, - }, - }, - yinbing: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - audio: 2, - preHidden: true, - filter: function (event, player) { - return player.countCards("he", { type: "basic" }) < player.countCards("he"); - }, - marktext: "兵", - content: function () { - "step 0"; - player - .chooseCard([1, player.countCards("he") - player.countCards("he", { type: "basic" })], "he", get.prompt("yinbing"), function (card) { - return get.type(card) != "basic"; - }) - .set("ai", function (card) { - return 6 - get.value(card); - }) - .setHiddenSkill("yinbing"); - "step 1"; - if (result.bool) { - player.logSkill("yinbing"); - player.addToExpansion(result.cards, player, "give").gaintag.add("yinbing"); - } - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (card.name == "sha" || card.name == "juedou") { - if (current < 0) return 1.2; - } - }, - }, - threaten: function (player, target) { - if (target.getExpansions("yinbing").length) return 2; - return 1; - }, - combo: "juedi", - }, - subSkill: { - discard: { - trigger: { player: "damageEnd" }, - forced: true, - filter: function (event, player) { - return event.card && player.getExpansions("yinbing").length > 0 && (event.card.name == "sha" || event.card.name == "juedou"); - }, - content: function () { - "step 0"; - player.chooseCardButton("移去一张引兵牌", true, player.getExpansions("yinbing")); - "step 1"; - if (result.bool) player.loseToDiscardpile(result.links); - }, - }, - }, - group: "yinbing_discard", - }, - juedi: { - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return player.getExpansions("yinbing").length > 0; - }, - forced: true, - audio: 2, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("juedi"), true, function (card, player, target) { - return player.hp >= target.hp; - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att < 2) return att - 10; - var num = att / 10; - if (target == player) { - num += player.maxHp - player.countCards("h") + 0.5; - } else { - num += _status.event.n2 * 2; - if (target.isDamaged()) { - if (target.hp == 1) { - num += 3; - } else if (target.hp == 2) { - num += 2; - } else { - num += 0.5; - } - } - } - if (target.hasJudge("lebu")) { - num /= 2; - } - return num; - }) - .set("n2", player.getExpansions("yinbing").length); - "step 1"; - if (result.bool) { - player.line(result.targets[0], "green"); - var cards = player.getExpansions("yinbing"); - if (result.targets[0] == player) { - player.loseToDiscardpile(cards); - var num = player.maxHp - player.countCards("h"); - if (num > 0) player.draw(num); - } else { - var target = result.targets[0]; - target.recover(); - player.give(cards, target, "give"); - target.draw(cards.length); - } - } - }, - ai: { - combo: "yinbing", - }, - }, - meibu: { - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - return event.player != player && get.distance(event.player, player, "attack") > 1; - }, - logTarget: "player", - check: function (event, player) { - if (get.attitude(player, event.player) >= 0) return false; - var e2 = player.getEquip(2); - if (e2) { - if (e2.name == "tengjia" || e2.name == "rewrite_tengjia") return true; - if (e2.name == "bagua" || e2.name == "rewrite_bagua") return true; - } - return player.countCards("h", "shan") > 0; - }, - content: function () { - var target = trigger.player; - target.addTempSkill("meibu_viewas"); - target.addTempSkill("meibu_range"); - target.storage.meibu = player; - target.markSkillCharacter("meibu", player, "魅步", "锦囊牌均视为杀且" + get.translation(player) + "视为在攻击范围内"); - }, - ai: { - expose: 0.2, - }, - subSkill: { - range: { - mod: { - targetInRange: function (card, player, target) { - if (card.name == "sha" && target == player.storage.meibu) { - return true; - } - }, - }, - onremove: function (player) { - game.broadcast(function (player) { - if (player.marks.meibu) { - player.marks.meibu.delete(); - delete player.marks.meibu; - } - }, player); - if (player.marks.meibu) { - player.marks.meibu.delete(); - delete player.marks.meibu; - game.addVideo("unmark", player, "meibu"); - } - }, - trigger: { player: "useCard" }, - forced: true, - popup: false, - filter: function (event, player) { - return event.skill == "meibu_viewas"; - }, - content: function () { - player.removeSkill("meibu_viewas"); - game.broadcastAll(function (player) { - if (player.marks.meibu && player.marks.meibu.info) { - player.marks.meibu.info.content = player.marks.meibu.info.content.slice(8); - } - }, player); - }, - }, - viewas: { - mod: { - cardEnabled: function (card, player) { - if (card.name != "sha" && get.type(card, "trick") == "trick") return false; - }, - cardUsable: function (card, player) { - if (card.name != "sha" && get.type(card, "trick") == "trick") return false; - }, - cardRespondable: function (card, player) { - if (card.name != "sha" && get.type(card, "trick") == "trick") return false; - }, - cardSavable: function (card, player) { - if (card.name != "sha" && get.type(card, "trick") == "trick") return false; - }, - }, - enable: ["chooseToUse", "chooseToRespond"], - filterCard: function (card) { - return get.type(card, "trick") == "trick"; - }, - viewAs: { name: "sha" }, - check: function () { - return 1; - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "respondSha") && current < 0) return 0.8; - }, - }, - respondSha: true, - order: 4, - useful: -1, - value: -1, - }, - }, - }, - }, - mumu: { - enable: "phaseUse", - usable: 1, - filterCard: function (card, player, target) { - return card.name == "sha" || (get.type(card, "trick") == "trick" && get.color(card) == "black"); - }, - check: function (card) { - return 7 - get.value(card); - }, - filterTarget: function (card, player, target) { - if (target == player) return false; - return target.getEquips(1).length > 0 || target.getEquips(2).length > 0; - }, - content: function () { - "step 0"; - var e1 = target.getEquips(1); - var e2 = target.getEquips(2); - event.e1 = e1; - event.e2 = e2; - if (e1.length && e2.length) { - player.chooseControl("武器牌", "防具牌").set("ai", function () { - if (_status.event.player.getEquip(2)) { - return "武器牌"; - } - return "防具牌"; - }); - } else if (e1.length) { - event.choice = "武器牌"; - } else { - event.choice = "防具牌"; - } - "step 1"; - var choice = event.choice || result.control; - if (choice == "武器牌") { - if (event.e1) { - target.discard(event.e1); - } - player.draw(); - } else { - if (event.e2) { - player.equip(event.e2); - target.$give(event.e2, player); - } - } - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if (target.getEquip(2) && !player.getEquip(2)) { - return -2; - } - return -1; - }, - }, - }, - }, - fentian: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - if (player.countCards("h") >= player.hp) return false; - return game.hasPlayer(function (current) { - return player != current && player.inRange(current) && current.countCards("he"); - }); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - content: function () { - "step 0"; - player - .chooseTarget("焚天:选择一名攻击范围内的角色,将其一张牌置于你的武将牌上", true, function (card, player, target) { - return player != target && player.inRange(target) && target.countCards("he") > 0; - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - player.logSkill("fentian", result.targets); - event.target = result.targets[0]; - player.choosePlayerCard(result.targets[0], "he", true); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.addToExpansion(result.links, target, "give").gaintag.add("fentian"); - } - }, - mod: { - attackRange: function (from, distance) { - return distance + from.getExpansions("fentian").length; - }, - }, - }, - zhiri: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - unique: true, - juexingji: true, - audio: 2, - skillAnimation: true, - animationColor: "fire", - derivation: "xintan", - filter: function (event, player) { - return player.getExpansions("fentian").length >= 3; - }, - content: function () { - player.awakenSkill("zhiri"); - player.loseMaxHp(); - player.storage.zhiri = true; - }, - ai: { - combo: "fentian", - }, - }, - xintan: { - enable: "phaseUse", - usable: 1, - audio: 2, - unique: true, - filter: function (event, player) { - return player.getExpansions("fentian").length >= 2; - }, - filterTarget: true, - prompt: "移去两张“焚”并令一名角色失去1点体力", - content: function () { - "step 0"; - player.chooseCardButton(2, "移去两张“焚”并令" + get.translation(target) + "失去1点体力", player.getExpansions("fentian"), true); - "step 1"; - if (result.bool) { - player.loseToDiscardpile(result.links); - target.loseHp(); - } - }, - ai: { - order: 8, - result: { - target: -1, - }, - combo: "fentian", - }, - }, - danji: { - skillAnimation: true, - animationColor: "water", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - unique: true, - juexingji: true, - derivation: ["mashu", "nuzhan"], - filter: function (event, player) { - var zhu = get.zhu(player); - if (zhu && zhu.isZhu) { - var name = zhu.name; - while (name.indexOf("_") != -1) { - name = name.slice(name.indexOf("_") + 1); - } - if (name.indexOf("liubei") == 0) return false; - } - return !player.storage.danji && player.countCards("h") > player.hp; - }, - content: function () { - player.awakenSkill("danji"); - player.loseMaxHp(); - player.addSkills(["mashu", "nuzhan"]); - }, - ai: { - maixie: true, - skillTagFilter: (player, tag, arg) => { - if (tag === "maixie") { - if (player.hp < 2 || player.storage.danji || player.hasSkill("nuzhan") || player.countCards("h") !== player.hp) return false; - let zhu = get.zhu(player); - if (zhu && zhu.isZhu) { - let name = zhu.name; - while (name.indexOf("_") !== -1) { - name = name.slice(name.indexOf("_") + 1); - } - if (name.indexOf("liubei") == 0) return false; - } - return true; - } - }, - effect: { - target: (card, player, target) => { - let hs = target.countCards("h"); - if (target.hp < 3 || target.storage.danji || target.hasSkill("nuzhan") || hs > target.hp + 1) return; - let zhu = get.zhu(target); - if (zhu && zhu.isZhu) { - let name = zhu.name; - while (name.indexOf("_") !== -1) { - name = name.slice(name.indexOf("_") + 1); - } - if (name.indexOf("liubei") == 0) return; - } - if (get.tag(card, "draw")) return 1.6; - if (get.tag(card, "lose") || get.tag(card, "discard")) return [1, -0.8]; - if (hs === target.hp && get.tag(card, "damage")) return [1, target.hp / 3]; - if (hs > target.hp && target.hp > 3 && (card.name === "shan" || card.name === "wuxie")) return "zeroplayertarget"; - }, - }, - }, - }, - nuzhan: { - audio: 2, - popup: false, - silent: true, - firstDo: true, - trigger: { player: "useCard1" }, - filter: function (event, player) { - return event.card && event.card.name == "sha" && event.addCount !== false && event.cards && event.cards.length == 1 && get.type(event.cards[0], "trick") == "trick"; - }, - forced: true, - content: function () { - trigger.addCount = false; - if (player.stat[player.stat.length - 1].card.sha > 0) { - player.stat[player.stat.length - 1].card.sha--; - } - }, - group: "nuzhan2", - }, - nuzhan2: { - audio: "nuzhan", - trigger: { player: "useCard1" }, - forced: true, - popup: false, - silent: true, - firstDo: true, - filter: function (event, player) { - return event.card && event.card.name == "sha" && event.cards && event.cards.length == 1 && get.type(event.cards[0]) == "equip"; - }, - content: function () { - trigger.baseDamage++; - }, - }, - jieyuan: { - group: ["jieyuan_more", "jieyuan_less"], - subSkill: { - more: { - audio: true, - trigger: { source: "damageBegin1" }, - direct: true, - filter: function (event, player) { - if ( - !player.countCards(player.hasSkill("fenxin_nei") ? "he" : "h", function (card) { - if (player.hasSkill("fenxin_nei") || (_status.connectMode && get.position(card) == "h")) return true; - return get.color(card) == "black"; - }) - ) - return false; - return (event.player.hp >= player.hp || player.hasSkill("fenxin_fan")) && player != event.player; - }, - content: function () { - "step 0"; - var goon = get.attitude(player, trigger.player) < 0; - var next = player.chooseToDiscard(get.prompt("jieyuan", trigger.player), player.hasSkill("fenxin_nei") ? "he" : "h"); - if (!player.hasSkill("fenxin_nei")) { - next.set("filterCard", function (card) { - return get.color(card) == "black"; - }); - next.set("prompt2", "弃置一张黑色手牌令伤害+1"); - } else { - next.set("prompt2", "弃置一张手牌令伤害+1"); - } - next.set("ai", function (card) { - if (_status.event.goon) { - return 8 - get.value(card); - } - return 0; - }); - next.set("goon", goon); - next.logSkill = ["jieyuan_more", trigger.player]; - "step 1"; - if (result.bool) { - trigger.num++; - } - }, - }, - less: { - audio: true, - trigger: { player: "damageBegin2" }, - filter: function (event, player) { - if ( - !player.countCards(player.hasSkill("fenxin_nei") ? "he" : "h", function (card) { - if (player.hasSkill("fenxin_nei") || (_status.connectMode && get.position(card) == "h")) return true; - return get.color(card) == "red"; - }) - ) - return false; - return event.source && (event.source.hp >= player.hp || player.hasSkill("fenxin_zhong")) && player != event.source; - }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseToDiscard(get.prompt("jieyuan"), player.hasSkill("fenxin_nei") ? "he" : "h"); - if (!player.hasSkill("fenxin_nei")) { - next.set("filterCard", function (card) { - return get.color(card) == "red"; - }); - next.set("prompt2", "弃置一张红色手牌令伤害-1"); - } else { - next.set("prompt2", "弃置一张手牌令伤害-1"); - } - next.set("ai", function (card) { - var player = _status.event.player; - if (player.hp == 1 || _status.event.getTrigger().num > 1) { - return 9 - get.value(card); - } - if (player.hp == 2) { - return 8 - get.value(card); - } - return 7 - get.value(card); - }); - next.logSkill = "jieyuan_less"; - "step 1"; - if (result.bool) { - trigger.num--; - } - }, - }, - }, - ai: { - expose: 0.2, - threaten: 1.5, - }, - }, - fenxin: { - mode: ["identity", "versus"], - available: function (mode) { - if (mode == "identity" && _status.mode == "purple") return false; - if (mode == "versus" && _status.mode != "two") return false; - }, - trigger: { global: ["dieAfter", "damageEnd"] }, - filter: function (event, player) { - var list = ["fan", "zhong", "nei"]; - if (get.mode() == "identity") return event.name == "die" && list.includes(event.player.identity) && !player.hasSkill("fenxin_" + event.player.identity); - return event.name == "damage" && event.player != player && list.some(identity => !player.hasSkill("fenxin_" + identity)) && event.player.getHistory("damage").indexOf(event) == 0; - }, - forced: true, - logTarget: "player", - content: function () { - "step 0"; - if (get.mode() == "identity") { - event._result = { - bool: true, - links: ["fenxin_" + trigger.player.identity], - }; - } else { - player - .chooseButton( - [ - "焚心:请选择〖竭缘〗的升级方式", - [ - [ - ["fenxin_fan", "发动〖竭缘〗增加伤害无体力值限制"], - ["fenxin_zhong", "发动〖竭缘〗减少伤害无体力值限制"], - ["fenxin_nei", "将〖竭缘〗中的黑色手牌和红色手牌改为一张牌"], - ].filter(list => !player.hasSkill(list[0])), - "textbutton", - ], - ], - true - ) - .set("ai", function (button) { - return ["fenxin_fan", "fenxin_zhong", "fenxin_nei"].indexOf(button.link) + 1; - }); - } - "step 1"; - if (result.bool) { - var identity = result.links[0]; - player.addSkill(identity); - player.markSkill("fenxin"); - } - }, - intro: { - mark: function (dialog, content, player) { - if (player.hasSkill("fenxin_zhong")) { - dialog.addText("你发动“竭缘”减少伤害无体力值限制"); - } - if (player.hasSkill("fenxin_fan")) { - dialog.addText("你发动“竭缘”增加伤害无体力值限制"); - } - if (player.hasSkill("fenxin_nei")) { - dialog.addText("将“竭缘”中的黑色手牌和红色手牌改为一张牌"); - } - }, - }, - subSkill: { - fan: { charlotte: true }, - zhong: { charlotte: true }, - nei: { charlotte: true }, - }, - ai: { combo: "jieyuan" }, - }, - xisheng: { - enable: "chooseToUse", - usable: 1, - viewAs: { name: "tao" }, - viewAsFilter: function (player) { - return player != _status.currentPhase && player.countCards("hes") > 1; - }, - selectCard: 2, - filterCard: true, - position: "hes", - }, - shulv: { - inherit: "zhiheng", - prompt: "弃置一张牌并摸一张牌", - selectCard: 1, - filter: function (event, player) { - return player.countCards("hs") > player.hp; - }, - }, - xiandeng: { - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - targetInRange: function (card, player) { - if (card.name == "sha" && player.countUsed("sha", true) == 0) return true; - }, - }, - }, - qingyi: { - audio: 2, - trigger: { player: "phaseJudgeBefore" }, - direct: true, - content: function () { - "step 0"; - var check = player.countCards("h") > 2; - player - .chooseTarget(get.prompt("qingyi"), "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target, false); - }) - .set("check", check) - .set("ai", function (target) { - if (!_status.event.check) return 0; - return get.effect(target, { name: "sha" }, _status.event.player); - }); - "step 1"; - if (result.bool) { - player.logSkill("qingyi", result.targets); - player.useCard({ name: "sha", isCard: true }, result.targets[0], false); - trigger.cancel(); - player.skip("phaseDraw"); - } - }, - }, - qingyi1: { - audio: true, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player.addSkill("qingyi3"); - var check = player.countCards("h") > 2; - player.chooseTarget(get.prompt2("qingyi"), function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target); - }).ai = function (target) { - if (!check) return 0; - return get.effect(target, { name: "sha" }, _status.event.player); - }; - "step 1"; - if (result.bool) { - player.logSkill("qingyi1", result.targets); - player.useCard({ name: "sha", isCard: true }, result.targets[0], false); - player.skip("phaseJudge"); - player.skip("phaseDraw"); - } - player.removeSkill("qingyi3"); - }, - }, - qingyi2: { - audio: true, - trigger: { player: "phaseUseBefore" }, - direct: true, - filter: function (event, player) { - return player.countCards("he", { type: "equip" }) > 0; - }, - content: function () { - "step 0"; - player.addSkill("qingyi3"); - var check = player.countCards("h") <= player.hp; - player.chooseCardTarget({ - prompt: get.prompt2("qingyi"), - filterCard: function (card, player) { - return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); - }, - position: "he", - filterTarget: function (card, player, target) { - if (player == target) return false; - return player.canUse({ name: "sha" }, target); - }, - ai1: function (card) { - if (!_status.event.check) return 0; - return 6 - get.value(card); - }, - ai2: function (target) { - if (!_status.event.check) return 0; - return get.effect(target, { name: "sha" }, _status.event.player); - }, - check: check, - }); - "step 1"; - if (result.bool) { - player.logSkill("qingyi2", result.targets); - player.discard(result.cards[0]); - player.useCard({ name: "sha", isCard: true }, result.targets[0]); - trigger.cancel(); - } - player.removeSkill("qingyi3"); - }, - }, - qingyi3: { - mod: { - targetInRange: function (card, player, target, now) { - return true; - }, - }, - }, - qirang: { - audio: 2, - trigger: { player: "equipEnd" }, - frequent: true, - content: function () { - var card = get.cardPile(function (card) { - return get.type(card, "trick") == "trick"; - }); - if (card) { - var next = player.gain(card, "gain2"); - if (get.type(card) == "trick") next.gaintag.add("qirang"); - else { - player.addMark("qirang_mark", 1, false); - player.addTempSkill("qirang_mark", { player: "phaseBegin" }); - } - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; - }, - }, - threaten: 1.3, - }, - group: "qirang_use", - subSkill: { - mark: { - charlotte: true, - onremove: function (player) { - var evt = _status.event; - if (evt.name != "phase") evt = evt.getParent("phase"); - if (evt && evt.player == player) { - if (!evt.qirang_num) evt.qirang_num = 0; - evt.qirang_num += player.storage.qirang_mark; - } - delete player.storage.qirang_mark; - }, - intro: { - content: "下回合发动〖羽化〗时卜算量+#", - }, - }, - use: { - audio: "qirang", - trigger: { player: "useCard2" }, - direct: true, - filter: function (event, player) { - if (get.type(event.card) != "trick") return false; - if (!event.targets || event.targets.length != 1) return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if ( - !player.hasHistory("lose", function (evt) { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("qirang")) return true; - } - return false; - }) - ) - return false; - if (!info.multitarget) { - if ( - game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - player - .chooseTarget(get.prompt("qirang"), function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1); - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("qirang_use", event.targets); - trigger.targets.addArray(event.targets); - } - }, - }, - }, - }, - yuhua: { - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - forced: true, - audio: 2, - content: function () { - "step 0"; - var num = 1, - evt = trigger.getParent(); - if (evt.qirang_num) num += evt.qirang_num; - var cards = get.cards(Math.min(5, 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 target = _status.event.getTrigger().name == "phaseZhunbei" ? player : player.next; - var att = get.sgn(get.attitude(player, target)); - var top = []; - var judges = target.getCards("j"); - var stopped = false; - if (player != target || !target.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)) * att; - }); - if (judge(cards[0]) * att < 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)) * att; - }); - while (cards.length) { - if (get.value(cards[0], player) <= 5 == att > 0) 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]); - } - if (event.triggername == "phaseZhunbeiBegin" && top.length == 0) { - player.addTempSkill("reguanxing_on"); - } - player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); - game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); - game.updateRoundNumber(); - game.delayx(); - }, - mod: { - ignoredHandcard: function (card, player) { - if (get.type(card) != "basic") { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && get.type(card) != "basic") return false; - }, - }, - }, - chenqing: { - audio: 2, - trigger: { global: "dying" }, - //priority:6, - filter: function (event, player) { - return event.player.hp <= 0 && !player.hasSkill("chenqing2"); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("chenqing"), function (card, player, target) { - return target != player && target != _status.event.getTrigger().player; - }) - .set("ai", function (target) { - var player = _status.event.player; - var trigger = _status.event.getTrigger(); - if (get.attitude(player, trigger.player) > 0) { - var att1 = get.attitude(target, player); - var att2 = get.attitude(target, trigger.player); - var att3 = get.attitude(player, target); - if (att3 < 0) return 0; - return att1 / 2 + att2 + att3; - } else { - return 0; - // return get.attitude(player,target); - } - }); - "step 1"; - if (result.bool) { - player.addTempSkill("chenqing2", "roundStart"); - event.target = result.targets[0]; - event.target.draw(4); - player.logSkill("chenqing", event.target); - } else { - event.finish(); - } - "step 2"; - var target = event.target; - var tosave = trigger.player; - var att = get.attitude(target, tosave); - var hastao = target.countCards("h", "tao"); - target - .chooseToDiscard(4, true, "he") - .set("ai", function (card) { - var hastao = _status.event.hastao; - var att = _status.event.att; - if (!hastao && att > 0) { - var suit = get.suit(card); - for (var i = 0; i < ui.selected.cards.length; i++) { - if (get.suit(ui.selected.cards[i]) == suit) { - return -4 - get.value(card); - } - } - } - if (att < 0 && ui.selected.cards.length == 3) { - var suit = get.suit(card); - for (var i = 0; i < ui.selected.cards.length; i++) { - if (get.suit(ui.selected.cards[i]) == suit) { - return -get.value(card); - } - } - return -10 - get.value(card); - } - return -get.value(card); - }) - .set("hastao", hastao) - .set("att", att); - "step 3"; - if (result.cards && result.cards.length == 4) { - var suits = []; - for (var i = 0; i < result.cards.length; i++) { - suits.add(get.suit(result.cards[i])); - } - if (suits.length == 4 && game.checkMod({ name: "tao", isCard: true }, player, trigger.player, "unchanged", "cardSavable", player)) { - event.target.useCard({ name: "tao", isCard: true }, trigger.player); - } - } - }, - ai: { - expose: 0.2, - threaten: 1.5, - }, - }, - mozhi: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return ( - player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing() && ["basic", "trick"].includes(get.type(evt.card)); - }).length > 0 && player.countCards("hs") > 0 - ); - }, - content: function () { - "step 0"; - event.count = 2; - event.history = player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing() && ["basic", "trick"].includes(get.type(evt.card)); - }); - "step 1"; - event._result = {}; - if (event.count && event.history.length && player.countCards("hs")) { - event.count--; - var card = event.history.shift().card; - card = { name: card.name, nature: card.nature }; - if (player.hasUseTarget(card, true, true)) { - if ( - game.hasPlayer(function (current) { - return player.canUse(card, current); - }) - ) { - lib.skill.mozhix.viewAs = card; - var next = player.chooseToUse(); - if (next.isOnline()) { - player.send(function (card) { - lib.skill.mozhix.viewAs = card; - }, card); - } - next.logSkill = "mozhi"; - next.set("openskilldialog", "默识:将一张手牌当" + get.translation(card) + "使用"); - next.set("norestore", true); - next.set("_backupevent", "mozhix"); - next.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - next.backup("mozhix"); - } - } - } - "step 2"; - if (result && result.bool) event.goto(1); - }, - }, - mozhix: { - filterCard: function (card) { - return get.itemtype(card) == "card"; - }, - selectCard: 1, - position: "hs", - popname: true, - }, - chenqing2: { charlotte: true }, - ranshang: { - audio: 2, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return event.hasNature("fire"); - }, - forced: true, - check: function () { - return false; - }, - content: function () { - player.addMark("ranshang", trigger.num); - }, - intro: { - name2: "燃", - content: "mark", - }, - ai: { - neg: true, - effect: { - target: function (card, player, target, current) { - if (card.name == "sha") { - if (game.hasNature(card, "fire") || player.hasSkill("zhuque_skill")) return 2; - } - if (get.tag(card, "fireDamage") && current < 0) return 2; - }, - }, - }, - group: "ranshang2", - }, - ranshang2: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return player.countMark("ranshang") > 0; - }, - content: function () { - player.loseHp(player.countMark("ranshang")); - if (player.countMark("ranshang") > 2) { - player.loseMaxHp(2); - player.draw(2); - } - }, - }, - hanyong: { - trigger: { player: "useCard" }, - filter: function (event, player) { - return event.card && (event.card.name == "nanman" || event.card.name == "wanjian" || (event.card.name == "sha" && !game.hasNature(event.card) && get.suit(event.card) == "spade")) && player.isDamaged(); - }, - content: function () { - trigger.baseDamage++; - if (game.roundNumber <= player.hp) player.addMark("ranshang", 1); - }, - }, - hanyong3: { - audio: false, - trigger: { source: "damageBegin1" }, - forced: true, - onremove: true, - filter: function (event, player) { - return event.card == player.storage.hanyong3; - }, - content: function () { - trigger.num++; - }, - }, - yishe: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return !player.getExpansions("yishe").length; - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - content: function () { - "step 0"; - player.draw(2); - "step 1"; - var cards = player.getCards("he"); - if (!cards.length) event.finish(); - else if (cards.length <= 2) event._result = { bool: true, cards: cards }; - else player.chooseCard(2, "he", true, "选择两张牌作为“米”"); - "step 2"; - if (result.bool) player.addToExpansion(result.cards, player, "give").gaintag.add("yishe"); - }, - group: "yishe_recover", - ai: { combo: "bushi" }, - subSkill: { - recover: { - audio: "yishe", - trigger: { - player: ["loseAfter"], - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter: function (event, player) { - if (player.isHealthy()) return false; - var evt = event.getl(player); - if (!evt || !evt.xs || !evt.xs.length || player.getExpansions("yishe").length > 0) return false; - if (event.name == "lose") { - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("yishe")) return true; - } - return false; - } - return player.hasHistory("lose", function (evt) { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("yishe")) return true; - } - return false; - }); - }, - forced: true, - content: function () { - player.recover(); - }, - }, - }, - }, - bushi: { - audio: 2, - trigger: { player: "damageEnd", source: "damageEnd" }, - filter: function (event, player) { - if (event._notrigger.includes(event.player)) return false; - return event.player.isIn() && player.getExpansions("yishe").length > 0; - }, - direct: true, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - trigger.player.chooseCardButton("选择获得一张“米”", player.getExpansions("yishe")); - "step 2"; - if (result.bool) { - event.count--; - player.logSkill("bushi", trigger.player); - trigger.player.gain(result.links[0], "give", player, "bySelf"); - } else event.finish(); - "step 3"; - if (event.count > 0 && player.getExpansions("yishe").length && player.hasSkill("bushi")) { - event.goto(1); - } - }, - ai: { combo: "yishe" }, - }, - midao: { - audio: 2, - trigger: { global: "judge" }, - direct: true, - filter: function (event, player) { - return player.getExpansions("yishe").length && event.player.isIn(); - }, - content: function () { - "step 0"; - var list = player.getExpansions("yishe"); - player - .chooseButton([get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("midao"), list, "hidden"], function (button) { - var card = button.link; - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - return result * attitude; - }) - .set("judging", trigger.player.judging[0]) - .set("filterButton", function (button) { - var player = _status.event.player; - var card = button.link; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - }); - "step 1"; - if (result.bool) { - event.forceDie = true; - player.respond(result.links, "midao", "highlight", "noOrdering"); - result.cards = result.links; - var card = result.cards[0]; - event.card = card; - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player, "的判定牌改为", card); - game.delay(2); - } - }, - ai: { - combo: "yishe", - rejudge: true, - tag: { - rejudge: 0.6, - }, - }, - }, - fengpo: { - shaRelated: true, - audio: 2, - trigger: { - player: "useCardToPlayered", - }, - filter: function (event, player) { - if (event.targets.length != 1 || !["sha", "juedou"].includes(event.card.name)) return false; - var evtx = event.getParent(); - return !player.hasHistory( - "useCard", - function (evt) { - return evt != evtx && evt.card.name == event.card.name; - }, - evtx - ); - }, - direct: true, - content: function () { - "step 0"; - var str1 = get.translation(trigger.card), - str2 = get.translation(trigger.target); - player - .chooseControl("摸X加1伤", "摸1加X伤", "cancel2") - .set("prompt", get.prompt("fengpo", trigger.target)) - .set("prompt2", "你可以选择一项:1.摸X张牌,令" + str1 + "的伤害+1;2.摸一张牌,令" + str1 + "的伤害+X(X为" + str2 + "的♦牌的数量)。"); - "step 1"; - if (result.control && result.control != "cancel2") { - player.logSkill("fengpo", trigger.target); - var nd = trigger.target.countCards("he", { suit: "diamond" }); - var draw = 1, - damage = 1; - if (result.control == "摸X加1伤") draw = nd; - else damage = nd; - player.draw(draw); - var trigger2 = trigger.getParent(); - if (typeof trigger2.baseDamage != "number") { - trigger2.baseDamage = 1; - } - trigger2.baseDamage += damage; - } - }, - }, - fengpo2: { - trigger: { source: "damageBegin1" }, - filter: function (event) { - return event.card && (event.card.name == "sha" || event.card.name == "juedou") && event.notLink(); - }, - forced: true, - audio: false, - content: function () { - if (typeof player.storage.fengpo == "number") { - trigger.num += player.storage.fengpo; - } - }, - }, - fengpo3: { charlotte: true }, - //士燮 - biluan: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - check: function (event, player) { - if (player.countCards("h") > player.hp) return true; - if (player.hasJudge("lebu")) return true; - var ng = []; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i].group != "unknown") { - ng.add(players[i].group); - } - } - ng = ng.length; - if (ng < 2) return false; - var nai = 0; - for (var i = 0; i < players.length; i++) { - if (players[i] != player) { - var dist = get.distance(players[i], player, "attack"); - if (dist <= 1 && dist + ng > 1) { - nai++; - } - } - } - return nai >= 2; - }, - filter: function (event, player) { - return ( - !event.numFixed && - game.hasPlayer(function (current) { - return current != player && get.distance(current, player) <= 1; - }) - ); - }, - content: function () { - if (!player.hasSkill("rebiluan2")) player.addSkill("rebiluan2"); - var ng = []; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i].group != "unknown") { - ng.add(players[i].group); - } - } - player.$damagepop(ng.length, "unknownx"); - player.storage.rebiluan2 += ng.length; - player.markSkill("rebiluan2"); - game.addVideo("storage", player, ["biluan", player.storage.rebiluan2]); - trigger.changeToZero(); - }, - }, - lixia: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return event.player.isIn() && event.player != player && get.distance(event.player, player, "attack") > 1; - }, - forced: true, - content: function () { - "step 0"; - player - .chooseTarget( - function (card, player, target) { - return target == player || target == _status.event.source; - }, - true, - "礼下:选择一个目标摸一张牌" - ) - .set("ai", function (target) { - if (get.attitude(player, trigger.player) > 2) return 114514 - target.countCards(); - return player == target ? 1 : 0; - }) - .set("source", trigger.player); - "step 1"; - if (result.targets.length) { - result.targets[0].draw(); - player.line(result.targets[0], "green"); - } - if (!player.hasSkill("rebiluan2")) player.addSkill("rebiluan2"); - player.storage.rebiluan2--; - player.markSkill("rebiluan2"); - game.addVideo("storage", player, ["biluan", player.storage.rebiluan2]); - }, - }, - olbiluan: { - audio: "biluan", - trigger: { player: "phaseJieshuBegin" }, - checkx: function (player) { - var ng = Math.min(4, game.countPlayer()); - var nai = 0; - for (var i = 0; i < game.players.length; i++) { - if (game.players[i] != player) { - var dist = get.distance(game.players[i], player, "attack"); - if (dist <= 1 && dist + ng > 1) nai++; - } - } - return nai >= 2; - }, - filter: function (event, player) { - return ( - player.countCards("he") && - game.hasPlayer(function (current) { - return current != player && get.distance(current, player) <= 1; - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseToDiscard("he", get.prompt2("olbiluan")) - .set("logSkill", "olbiluan") - .set("ai", function (card) { - if (_status.event.check) return 6 - get.value(card); - return 0; - }) - .set("check", lib.skill.olbiluan.checkx(player)); - "step 1"; - if (result.bool) { - player.addSkill("rebiluan2"); - var num = game.countGroup(); - player.$damagepop(num, "unknownx"); - player.storage.rebiluan2 += num; - player.markSkill("rebiluan2"); - game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan2]); - } - }, - }, - ollixia: { - audio: "lixia", - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return event.player.isIn() && event.player != player && get.distance(event.player, player, "attack") > 1; - }, - forced: true, - content: function () { - "step 0"; - player - .chooseTarget( - function (card, player, target) { - return target == player || target == _status.event.source; - }, - true, - "礼下:请选择一个目标令其摸牌并减少你与其他角色的距离" - ) - .set("ai", function (target) { - return player == target ? 1 : 0; - }) - .set("source", trigger.player); - "step 1"; - if (result.targets.length) { - var num = result.targets[0] == player ? 1 : 2; - result.targets[0].draw(num); - player.line(result.targets[0], "green"); - } - if (!player.hasSkill("rebiluan2")) player.addSkill("rebiluan2"); - player.storage.rebiluan2--; - player.markSkill("rebiluan2"); - game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan]); - }, - }, - rebiluan2: { - mark: true, - charlotte: true, - intro: { - content: function (storage) { - if (storage > 0) { - return "其他角色计算与你的距离时+" + storage; - } else if (storage < 0) { - return "其他角色计算与你的距离时" + storage; - } else { - return "无距离变化"; - } - }, - }, - init: function (player) { - if (typeof player.storage.rebiluan2 != "number") player.storage.rebiluan2 = 0; - }, - mod: { - globalTo: function (from, to, distance) { - if (typeof to.storage.rebiluan2 == "number") { - return distance + to.storage.rebiluan2; - } - }, - }, - }, - rebiluan: { - audio: "biluan", - trigger: { player: "phaseJieshuBegin" }, - checkx: function (player) { - var ng = Math.min(4, game.countPlayer()); - var nai = 0; - for (var i = 0; i < game.players.length; i++) { - if (game.players[i] != player) { - var dist = get.distance(game.players[i], player, "attack"); - if (dist <= 1 && dist + ng > 1) { - nai++; - } - } - } - return nai >= 2; - }, - filter: function (event, player) { - return ( - player.countCards("he") && - game.hasPlayer(function (current) { - return current != player && get.distance(current, player) <= 1; - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseToDiscard("he", get.prompt2("rebiluan")) - .set("logSkill", "rebiluan") - .set("check", lib.skill.rebiluan.checkx(player)) - .set("ai", function (card) { - if (_status.event.check) return 6 - get.value(card); - return 0; - }); - "step 1"; - if (result.bool) { - player.addSkill("rebiluan2"); - var ng = Math.min(4, game.countPlayer()); - player.$damagepop(ng, "unknownx"); - player.storage.rebiluan2 += ng; - player.markSkill("rebiluan2"); - game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan2]); - } - }, - }, - relixia: { - audio: "lixia", - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return event.player.isIn() && event.player != player && !player.inRangeOf(event.player); - }, - forced: true, - content: function () { - "step 0"; - if (trigger.player.isDead()) { - event._result = { bool: true, links: [0] }; - return; - } - var list = ["令自己摸一张牌", "令XXX摸两张牌", "令XXX回复1点体力"]; - var card = get.translation(trigger.player); - var next = player.chooseButton( - [ - "【礼下】:请选择一至两项", - [ - list.map((item, index) => { - return [index, item.replace(/XXX/g, card)]; - }), - "textbutton", - ], - ], - true, - [1, 2] - ); - next.set("dialog", event.videoId); - next.set("filterButton", function (button) { - if (button.link == 2) { - return _status.event.bool1; - } - return true; - }); - next.set("bool1", trigger.player.isDamaged()); - next.set("ai", function (button) { - var player = _status.event.player; - var event = _status.event.getTrigger(); - if (button.link && get.attitude(player, event.player) <= 0) return 0; - return button.link * Math.random(); - }); - "step 1"; - var map = [ - function (trigger, player, event) { - player.draw(); - }, - function (trigger, player, event) { - if (!result.links.includes(2)) player.line(trigger.player); - trigger.player.draw(2); - }, - function (trigger, player, event) { - player.line(trigger.player); - trigger.player.recover(); - }, - ]; - result.links.sort(); - for (var i = 0; i < result.links.length; i++) { - game.log(player, "选择了", "#g【礼下】", "的", "#y选项" + get.cnNumber(result.links[i] + 1, true)); - map[result.links[i]](trigger, player, event); - } - player.addSkill("rebiluan2"); - player.storage.rebiluan2 -= result.links.length; - player.markSkill("rebiluan2"); - game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan2]); - }, - }, - guiming: { - unique: true, - zhuSkill: true, - locked: true, - ai: { - combo: "recanshi", - }, - }, - canshi: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - check: function (event, player) { - var num = game.countPlayer(function (current) { - if (player.hasZhuSkill("guiming") && current.group == "wu") return true; - return current.isDamaged(); - }); - return num > 3; - }, - prompt: function (event, player) { - var num = game.countPlayer(function (current) { - if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; - return current.isDamaged(); - }); - return "残蚀:是否改为摸" + get.cnNumber(num) + "张牌?"; - }, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.changeToZero(); - var num = game.countPlayer(function (current) { - if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; - return current.isDamaged(); - }); - if (num > 0) { - player.draw(num); - } - player.addTempSkill("canshi2"); - }, - }, - canshi2: { - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - if (player.countCards("he") == 0) return false; - var type = get.type(event.card, "trick"); - return type == "basic" || type == "trick"; - }, - autodelay: true, - content: function () { - player.chooseToDiscard(true, "he"); - }, - }, - chouhai: { - audio: 2, - trigger: { player: "damageBegin3" }, - forced: true, - check: function () { - return false; - }, - filter: function (event, player) { - return player.countCards("h") == 0; - }, - content: function () { - trigger.num++; - }, - ai: { - neg: true, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage") && target.countCards("h") == 0) return [1, -2]; - }, - }, - }, - }, - recanshi: { - audio: "canshi", - trigger: { player: "phaseDrawBegin2" }, - check: function (event, player) { - if ( - player.skipList.includes("phaseUse") || - !player.countCards("h", function (card) { - return get.type(card, "trick") == "trick" && player.hasUseTarget(card); - }) - ) - return true; - var num = game.countPlayer(function (current) { - if (player.hasZhuSkill("guiming") && current.group == "wu") return true; - return current.isDamaged(); - }); - return num > 1; - }, - prompt: function (event, player) { - var num = game.countPlayer(function (current) { - if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; - return current.isDamaged(); - }); - return "残蚀:是否多摸" + get.cnNumber(num) + "张牌?"; - }, - filter: function (event, player) { - return ( - !event.numFixed && - game.hasPlayer(function (current) { - if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; - return current.isDamaged(); - }) - ); - }, - content: function () { - var num = game.countPlayer(function (current) { - if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; - return current.isDamaged(); - }); - if (num > 0) { - trigger.num += num; - } - player.addTempSkill("recanshi2"); - }, - }, - recanshi2: { - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - if (player.countCards("he") == 0) return false; - if (event.card.name == "sha") return true; - return get.type(event.card) == "trick"; - }, - autodelay: true, - content: function () { - player.chooseToDiscard(true, "he"); - }, - }, - rechouhai: { - audio: "chouhai", - trigger: { player: "damageBegin3" }, - forced: true, - check: function () { - return false; - }, - filter: function (event, player) { - return event.card && event.card.name == "sha" && player.countCards("h") == 0; - }, - content: function () { - trigger.num++; - }, - ai: { - neg: true, - effect: { - target: function (card, player, target, current) { - if (card.name == "sha" && target.countCards("h") == 0) return [1, -2]; - }, - }, - }, - }, - kunfen: { - audio: 2, - audioname: ["ol_sb_jiangwei"], - trigger: { player: "phaseJieshuBegin" }, - locked: function (skill, player) { - if (!player || !player.storage.kunfen) return true; - return false; - }, - direct: true, - content: function () { - "step 0"; - if (player.storage.kunfen || (get.mode() == "guozhan" && player.hiddenSkills.includes("kunfen"))) { - if (!player.storage.kunfen) event.skillHidden = true; - player.chooseBool(get.prompt("kunfen"), "失去1点体力,然后摸两张牌").set("ai", function () { - var player = _status.event.player; - if (player.hp > 3) return true; - if (player.hp == 3 && player.countCards("h") < 3) return true; - if (player.hp == 2 && player.countCards("h") == 0) return true; - return false; - }); - } else event._result = { bool: true }; - "step 1"; - if (result.bool) { - player.logSkill("kunfen"); - player.loseHp(); - } else event.finish(); - "step 2"; - player.draw(2); - }, - ai: { threaten: 1.5 }, - }, - fengliang: { - skillAnimation: true, - animationColor: "thunder", - unique: true, - juexingji: true, - audio: 2, - derivation: "oltiaoxin", - trigger: { player: "dying" }, - //priority:10, - forced: true, - filter: function (event, player) { - return !player.storage.kunfen; - }, - content: function () { - "step 0"; - player.awakenSkill("fengliang"); - player.loseMaxHp(); - "step 1"; - if (player.hp < 2) { - player.recover(2 - player.hp); - } - "step 2"; - player.storage.kunfen = true; - player.addSkills("oltiaoxin"); - }, - }, - zhuiji: { - mod: { - globalFrom: function (from, to) { - if (from.hp >= to.hp) return -Infinity; - }, - }, - }, - oldcihuai: { - audio: "cihuai", - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - check: function (event, player) { - return !player.countCards("h", "sha"); - }, - content: function () { - player.showHandcards(); - if (!player.countCards("h", "sha")) player.addTempSkill("oldcihuai2"); - }, - }, - oldcihuai2: { - group: "oldcihuai3", - prompt: "视为使用一张杀", - enable: "chooseToUse", - viewAs: { name: "sha", isCard: true }, - filterCard: function () { - return false; - }, - selectCard: -1, - ai: { - presha: true, - respondSha: true, - }, - }, - oldcihuai3: { - trigger: { - player: ["loseAfter"], - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter", "die"], - }, - silent: true, - firstDo: true, - filter: function (event, player) { - if (event.name == "die") return true; - var evt = event.getl(player); - return evt && evt.hs && evt.hs.length > 0; - }, - content: function () { - player.removeSkill("oldcihuai2"); - }, - }, - cihuai: { - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("h", "sha") == 0; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("cihuai"), function (card, player, target) { - return player.canUse({ name: "sha", isCard: true }, target); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "sha", isCard: true }, player, player); - }); - "step 1"; - if (result.bool) { - player.logSkill("cihuai"); - player.showHandcards(); - player.useCard({ name: "sha", isCard: true }, result.targets); - } - }, - ai: { - expose: 0.2, - }, - }, - jilei: { - trigger: { player: "damageEnd" }, - audio: 2, - direct: true, - filter: function (event) { - return event.source && event.source.isIn(); - }, - content: function () { - "step 0"; - player - .chooseControl("basic", "trick", "equip", "cancel2", function () { - var source = _status.event.source; - if (get.attitude(_status.event.player, source) > 0) return "cancel2"; - var list = ["basic", "trick", "equip"].filter(function (name) { - return !source.storage.jilei2 || !source.storage.jilei2.includes(name); - }); - if (!list.length) return "cancel2"; - if ( - list.includes("trick") && - source.countCards("h", function (card) { - return get.type(card, source) == "trick" && source.hasValueTarget(card); - }) > 1 - ) - return "trick"; - return list[0]; - }) - .set("prompt", get.prompt2("jilei", trigger.source)) - .set("source", trigger.source); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("jilei", trigger.source); - player.popup(get.translation(result.control) + "牌"); - trigger.source.addTempSkill("jilei2", { player: "phaseBegin" }); - trigger.source.storage.jilei2.add(result.control); - trigger.source.updateMarks("jilei2"); - } - }, - ai: { - maixie_defend: true, - threaten: 0.7, - }, - }, - jilei2: { - unique: true, - charlotte: true, - intro: { - content: function (storage) { - return "不能使用、打出或弃置" + get.translation(storage) + "牌"; - }, - }, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - mark: true, - onremove: true, - mod: { - cardDiscardable: function (card, player) { - if (player.storage.jilei2.includes(get.type(card, "trick"))) return false; - }, - cardEnabled: function (card, player) { - if (player.storage.jilei2.includes(get.type(card, "trick"))) { - var hs = player.getCards("h"), - cards = [card]; - if (Array.isArray(card.cards)) cards.addArray(card.cards); - for (var i of cards) { - if (hs.includes(i)) return false; - } - } - }, - cardRespondable: function (card, player) { - if (player.storage.jilei2.includes(get.type(card, "trick"))) { - var hs = player.getCards("h"), - cards = [card]; - if (Array.isArray(card.cards)) cards.addArray(card.cards); - for (var i of cards) { - if (hs.includes(i)) return false; - } - } - }, - cardSavable: function (card, player) { - if (player.storage.jilei2.includes(get.type(card, "trick"))) { - var hs = player.getCards("h"), - cards = [card]; - if (Array.isArray(card.cards)) cards.addArray(card.cards); - for (var i of cards) { - if (hs.includes(i)) return false; - } - } - }, - }, - }, - danlao: { - audio: 2, - filter: function (event, player) { - return (event.card.name == "sha" || get.type(event.card) == "trick") && event.targets && event.targets.length > 1; - }, - check: function (event, player) { - return event.getParent().excluded.includes(player) || get.tag(event.card, "multineg") || get.effect(player, event.card, event.player, player) <= 0; - }, - trigger: { target: "useCardToTargeted" }, - content: function () { - trigger.getParent().excluded.add(player); - player.draw(); - }, - ai: { - effect: { - target: function (card) { - if (get.type(card) != "trick") return; - if (card.name == "tiesuo") return [0, 0]; - if (card.name == "yihuajiemu") return [0, 1]; - if (get.tag(card, "multineg")) return [0, 2]; - }, - }, - }, - }, - taichen: { - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.canUse("sha", target); - }, - content: function () { - "step 0"; - player.loseHp(); - "step 1"; - player.useCard({ name: "sha", isCard: true }, target, false); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (player.hp > 2 && player.hp > target.hp && target.countCards("he") < 4) { - return get.effect(target, { name: "sha" }, player, target); - } - return 0; - }, - }, - }, - }, - naman: { - audio: 2, - trigger: { global: "respondAfter" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - if (event.player == player) return false; - if (event.cards) { - for (var i = 0; i < event.cards.length; i++) { - if (get.position(event.cards[i], true) == "o") return true; - } - } - return false; - }, - frequent: true, - content: function () { - var cards = trigger.cards.slice(0); - for (var i = 0; i < cards.length; i++) { - if (get.position(cards[i], true) != "o") { - cards.splice(i--, 1); - } - } - game.delay(0.5); - player.gain(cards, "gain2"); - }, - }, - xiemu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h", "sha") > 0; - }, - filterCard: { name: "sha" }, - check: function (card) { - return 6 - get.value(card); - }, - content: function () { - "step 0"; - var list = lib.group.filter(function (group) { - return ( - ["wei", "shu", "wu", "qun"].includes(group) || - game.hasPlayer(function (current) { - return current.group == group; - }) - ); - }); - if (player.storage.xiemu2) list.removeArray(player.storage.xiemu2); - var list2 = list.slice(0); - list2.sort(function (a, b) { - return lib.skill.xiemu.count(b) - lib.skill.xiemu.count(a); - }); - player - .chooseControl(list) - .set("prompt", "请选择一个势力") - .set("ai", function () { - return _status.event.group; - }) - .set("group", list2[0]); - "step 1"; - player.popup(result.control + 2, get.groupnature(result.control)); - game.log(player, "选择了", "#g" + get.translation(result.control + 2)); - player.addTempSkill("xiemu2", { player: "phaseBegin" }); - player.storage.xiemu2.add(result.control); - player.updateMarks("xiemu2"); - }, - ai: { - order: 1, - result: { player: 1 }, - }, - count: function (group) { - var player = _status.event.player; - return game.countPlayer(function (current) { - return current != player && current.group == group && get.attitude(current, player) < 0; - }); - }, - }, - xiemu2: { - onremove: true, - mark: true, - forced: true, - audio: "xiemu", - intro: { - content: function (storage) { - return "已指定" + get.translation(storage) + "势力"; - }, - }, - trigger: { - target: "useCardToTargeted", - }, - init: function (player) { - if (!player.storage.xiemu2) player.storage.xiemu2 = []; - }, - filter: function (event, player) { - if (!player.storage.xiemu2) return false; - if (get.color(event.card) != "black") return false; - if (!event.player) return false; - if (event.player == player || !player.storage.xiemu2.includes(event.player.group)) return false; - return true; - }, - content: function () { - player.draw(2); - }, - }, - oldxiemu: { - audio: "xiemu", - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - if (get.color(event.card) != "black") return false; - if (!event.player) return false; - if (event.player == player) return false; - if (get.mode() != "guozhan") return false; - return player.countCards("h", "sha") > 0; - }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseToDiscard("协穆:是否弃置一张杀并摸两张牌?", { name: "sha" }); - next.set("ai", function (card) { - return 9 - get.value(card); - }); - next.logSkill = "xiemu"; - "step 1"; - if (result.bool) { - player.draw(2); - } - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.color(card) == "black" && target.countCards("h") > 0) { - return [1, 0.5]; - } - }, - }, - }, - }, - spmengjin: { - trigger: { player: "shaBegin" }, - filter: function (event, player) { - return event.target.countCards("he") > 0; - }, - direct: true, - content: function () { - "step 0"; - var att = get.attitude(player, trigger.target); - player.choosePlayerCard(get.prompt("spmengjin", trigger.target), "he", trigger.target).ai = function (button) { - var val = get.buttonValue(button); - if (att > 0) return -val; - return val; - }; - "step 1"; - if (result.bool) { - trigger.target.discard(result.links); - player.logSkill("spmengjin", trigger.target); - trigger.target.addTempSkill("mengjin2", "shaAfter"); - } - }, - ai: { - expose: 0.2, - }, - }, - fenxun_old: { - audio: 2, - trigger: { player: "shaBefore" }, - direct: true, - filter: function (event, player) { - return event.targets.length == 1; - }, - position: "he", - content: function () { - "step 0"; - player.chooseCardTarget({ - filterCard: lib.filter.cardDiscardable, - filterTarget: function (card, player, target) { - var trigger = _status.event.getTrigger(); - return lib.filter.targetEnabled(trigger.card, player, target) && target != trigger.targets[0]; - }, - ai1: function (card) { - return 6 - get.value(card); - }, - ai2: function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }, - prompt: get.prompt2("fenxun"), - }); - "step 1"; - if (result.bool) { - player.discard(result.cards); - trigger.targets.push(result.targets[0]); - player.logSkill("fenxun", result.targets); - } - }, - }, - rezhoufu: { - audio: "zhoufu", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - filterCard: true, - filterTarget: function (card, player, target) { - return target != player && !target.getExpansions("rezhoufu2").length; - }, - check: function (card) { - return 6 - get.value(card); - }, - position: "he", - discard: false, - lose: false, - delay: false, - content: function () { - if (!target.storage.rezhoufu2_markcount) target.storage.rezhoufu2_markcount = 0; - target.addToExpansion(cards, player, "give").gaintag.add("rezhoufu2"); - target.addSkill("rezhoufu_judge"); - }, - ai: { - order: 1, - result: { - target: -1, - }, - }, - group: ["rezhoufu_losehp"], - subSkill: { - judge: { - audio: "zhoufu", - trigger: { player: "judgeBefore" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return !event.directresult && player.getExpansions("rezhoufu2").length; - }, - content: function () { - var cards = [player.getExpansions("rezhoufu2")[0]]; - trigger.directresult = cards[0]; - }, - }, - losehp: { - audio: "zhoufu", - trigger: { global: "phaseEnd" }, - forced: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.hasHistory("lose", function (evt) { - if (!evt || !evt.xs || !evt.xs.length) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("rezhoufu2")) return true; - } - return false; - }); - }); - }, - logTarget: function (current) { - return game - .filterPlayer(function (current) { - return current.hasHistory("lose", function (evt) { - if (!evt || !evt.xs || !evt.xs.length) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("rezhoufu2")) return true; - } - return false; - }); - }) - .sortBySeat(); - }, - content: function () { - var targets = game - .filterPlayer(function (current) { - return current.hasHistory("lose", function (evt) { - if (!evt || !evt.xs || !evt.xs.length) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("rezhoufu2")) return true; - } - return false; - }); - }) - .sortBySeat(); - while (targets.length) { - targets.shift().loseHp(); - } - }, - }, - }, - }, - rezhoufu2: { - intro: { - content: "expansion", - }, - }, - rezhoufu3: {}, - reyingbing: { - audio: "yingbin", - trigger: { global: "useCard" }, - forced: true, - filter: function (event, player) { - var cards = event.player.getExpansions("rezhoufu2"); - return cards.length && get.color(cards[0]) == get.color(event.card); - }, - logTarget: "player", - content: function () { - "step 0"; - player.draw(); - "step 1"; - trigger.player.storage.rezhoufu2_markcount++; - if (trigger.player.storage.rezhoufu2_markcount >= 2) { - delete trigger.player.storage.rezhoufu2_markcount; - var cards = trigger.player.getExpansions("rezhoufu2"); - player.gain(cards, trigger.player, "give", "bySelf"); - } else trigger.player.markSkill("rezhoufu2"); - }, - ai: { - combo: "rezhoufu", - }, - }, - zhoufu: { - audio: 2, - }, - yingbin: { - audio: 2, - }, - kuiwei: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - check: function (event, player) { - if (player.isTurnedOver()) return true; - var num = game.countPlayer(function (current) { - return current.getEquip(1); - }); - return num > 1; - }, - content: function () { - "step 0"; - player.turnOver(); - "step 1"; - var num = game.countPlayer(function (current) { - return current.getEquips(1).length; - }); - player.draw(2 + num); - player.addSkill("kuiwei2"); - }, - ai: { - effect: { - target: function (card) { - if (card.name == "guiyoujie") return [0, 2]; - }, - }, - }, - }, - kuiwei2: { - trigger: { player: "phaseDrawBegin" }, - forced: true, - audio: false, - content: function () { - var num = game.countPlayer(function (current) { - return current.getEquips(1).length; - }); - if (num >= player.countCards("he")) { - player.discard(player.getCards("he")); - } else if (num) { - player.chooseToDiscard("he", num, true); - } - player.removeSkill("kuiwei2"); - }, - }, - yanzheng: { - enable: "chooseToUse", - audio: 2, - filter: function (event, player) { - return player.hp < player.countCards("h") && player.countCards("e") > 0; - }, - viewAsFilter: function (player) { - return player.hp < player.countCards("h") && player.countCards("e") > 0; - }, - filterCard: true, - position: "e", - viewAs: { name: "wuxie" }, - prompt: "将一张装备区内的牌当无懈可击使用", - check: function (card) { - return 8 - get.equipValue(card); - }, - threaten: 1.2, - }, - tongji: { - global: "tongji_disable", - audio: 2, - trigger: { global: "useCard1" }, - forced: true, - filter: function (event, player) { - return event.targets.includes(player) && player != event.player && event.card.name == "sha" && player.hp < player.countCards("h"); - }, - content: function () {}, - unique: true, - gainable: true, - subSkill: { - disable: { - mod: { - targetEnabled: function (card, player, target) { - if (card.name == "sha") { - if (player.hasSkill("tongji")) return; - if (target.hasSkill("tongji")) return; - if ( - game.hasPlayer(function (current) { - return current.hasSkill("tongji") && current.hp < current.countCards("h") && player.inRange(current); - }) - ) { - return false; - } - } - }, - }, - }, - }, - }, - wangzun: { - audio: 2, - trigger: { global: "phaseZhunbeiBegin" }, - check: function (event, player) { - var att = get.attitude(player, event.player); - return !game.hasPlayer(function (current) { - return get.attitude(player, current) < att; - }); - }, - filter: function (event, player) { - return event.player != player && !player.storage.wangzun; - }, - logTarget: "player", - content: function () { - player.draw(); - player.markSkill("wangzun"); - player.storage.wangzun = trigger.player; - trigger.player.addTempSkill("wangzun3"); - }, - ai: { - expose: 0.2, - }, - intro: { - content: "player", - }, - group: "wangzun2", - }, - wangzun2: { - trigger: { player: "phaseZhunbeiBegin" }, - silent: true, - content: function () { - player.unmarkSkill("wangzun"); - player.storage.wangzun = null; - }, - }, - wangzun3: { - mod: { - maxHandcard: function (player, num) { - return num - 1; - }, - }, - }, - kaikang: { - audio: 2, - trigger: { global: "useCardToTargeted" }, - filter: function (event, player) { - return event.card.name == "sha" && get.distance(player, event.target) <= 1 && event.target.isIn(); - }, - check: function (event, player) { - return get.attitude(player, event.target) >= 0; - }, - logTarget: "target", - content: function () { - "step 0"; - player.draw(); - if (trigger.target != player) { - player.chooseCard(true, "he", "交给" + get.translation(trigger.target) + "一张牌").set("ai", function (card) { - if (get.position(card) == "e") return -1; - if (card.name == "shan") return 1; - if (get.type(card) == "equip") return 0.5; - return 0; - }); - } else { - event.finish(); - } - "step 1"; - player.give(result.cards, trigger.target, "give"); - game.delay(); - event.card = result.cards[0]; - "step 2"; - if (trigger.target.getCards("h").includes(card) && get.type(card) == "equip") { - trigger.target.chooseUseTarget(card); - } - }, - ai: { - threaten: 1.1, - }, - }, - liangzhu: { - audio: 2, - trigger: { global: "recoverAfter" }, - direct: true, - filter: function (event, player) { - return event.player.isPhaseUsing(); - }, - content: function () { - "step 0"; - if (player == trigger.player) { - player - .chooseControl("摸一张", "摸两张", "cancel2", function () { - return "摸两张"; - }) - .set("prompt", get.prompt2("liangzhu")); - event.single = true; - } else { - player - .chooseTarget(get.prompt2("liangzhu"), function (card, player, target) { - return target == _status.event.player || target == _status.event.target; - }) - .set("target", trigger.player) - .set("ai", function (target) { - var player = _status.event.player; - if (player == target) return 1; - return get.attitude(player, target) - 1.5; - }); - } - "step 1"; - if (event.single) { - if (result.control != "cancel2") { - player.logSkill("liangzhu", player); - if (result.control == "摸一张") { - player.draw(); - } else { - player.draw(2); - if (!player.storage.liangzhu) player.storage.liangzhu = []; - player.storage.liangzhu.add(player); - } - } - } else if (result.bool) { - var target = result.targets[0]; - player.logSkill("liangzhu", target); - if (target == player) { - target.draw(); - } else { - target.draw(2); - if (target.storage.liangzhu) { - target.storage.liangzhu.add(player); - } else { - target.storage.liangzhu = [player]; - } - } - } - }, - ai: { - expose: 0.1, - }, - }, - fanxiang: { - skillAnimation: true, - animationColor: "fire", - audio: 2, - unique: true, - juexingji: true, - forceunique: true, - derivation: "xiaoji", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - if (player.storage.fanxiang) return false; - return game.hasPlayer(function (current) { - return current.storage.liangzhu && current.storage.liangzhu.includes(player) && current.isDamaged(); - }); - }, - forced: true, - content: function () { - player.awakenSkill("fanxiang"); - player.gainMaxHp(); - player.recover(); - player.changeSkills(["xiaoji"], ["liangzhu"]); - }, - ai: { - combo: "liangzhu", - }, - }, - mingshi: { - audio: 2, - trigger: { player: "damageBegin3" }, - direct: true, - filter: function (event, player) { - return event.source && event.source.hp > player.hp; - }, - content: function () { - "step 0"; - var next = player.chooseToDiscard(get.prompt2("mingshi"), { color: "black" }); - next.set("ai", function (card) { - return 9 - get.value(card); - }); - next.set("logSkill", "mingshi"); - "step 1"; - if (result.bool) { - trigger.num--; - } - }, - ai: { - threaten: 0.8, - }, - }, - lirang: { - audio: 2, - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - if (!game.hasPlayer(current => current != player)) return false; - if (event.type != "discard" || event.getlx === false) return false; - var evt = event.getl(player); - if (!evt || !evt.cards2) return false; - for (var i = 0; i < evt.cards2.length; i++) { - if (get.position(evt.cards2[i]) == "d") { - return true; - } - } - return false; - }, - direct: true, - preHidden: true, - content: function () { - "step 0"; - if (trigger.delay == false) game.delay(); - event.cards = []; - var cards2 = trigger.getl(player).cards2; - for (var i = 0; i < cards2.length; i++) { - if (get.position(cards2[i], true) == "d") { - event.cards.push(cards2[i]); - } - } - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - "step 1"; - var goon = false; - for (var i = 0; i < event.cards.length; i++) { - if (event.cards[i].name == "du") { - goon = true; - break; - } - } - if (!goon) { - goon = game.hasPlayer(function (current) { - return player != current && get.attitude(player, current) > 1; - }); - } - player - .chooseButton(["礼让:是否分配本次弃置的牌?", event.cards], [1, event.cards.length]) - .set("ai", function (button) { - if (_status.event.goon && ui.selected.buttons.length == 0) return 1 + Math.abs(get.value(button.link)); - return 0; - }) - .set("goon", goon) - .setHiddenSkill("lirang"); - "step 2"; - if (result.bool) { - event.cards.removeArray(result.links); - event.togive = result.links.slice(0); - player - .chooseTarget("选择一名其他角色获得" + get.translation(result.links), true, lib.filter.notMe) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (_status.event.enemy) { - return -att; - } else if (att > 0) { - return att / (1 + target.countCards("h")); - } else { - return att / 100; - } - }) - .set("enemy", get.value(event.togive[0], player, "raw") < 0); - } else event.goto(4); - "step 3"; - if (result.targets.length) { - var id = result.targets[0].playerid, - map = event.given_map; - if (!map[id]) map[id] = []; - map[id].addArray(event.togive); - } - if (cards.length > 0) event.goto(1); - "step 4"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - var list = [], - targets = []; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - list.push([source, event.given_map[i]]); - targets.push(source); - } - if (targets.length) { - player.logSkill("lirang", targets); - game.loseAsync({ - gain_list: list, - giver: player, - animate: "gain2", - }).setContent("gaincardMultiple"); - } - }, - ai: { - expose: 0.1, - effect: { - target: function (card, player, target, current) { - if (target.hasFriend() && get.tag(card, "discard")) { - if (current < 0) return 0; - return [1, 1]; - } - }, - }, - }, - }, - moukui: { - audio: 2, - audioname: ["sp_mushun"], - trigger: { player: "useCardToPlayered" }, - direct: true, - filter: function (event, player) { - return event.card.name == "sha"; - }, - content: function () { - "step 0"; - var controls = ["draw_card"]; - if (trigger.target.countCards("he")) { - controls.push("discard_card"); - } - controls.push("cancel"); - player - .chooseControl(controls) - .set("ai", function () { - var trigger = _status.event.getTrigger(); - if (trigger.target.countCards("he") && get.attitude(_status.event.player, trigger.target) < 0) { - return "discard_card"; - } else { - return "draw_card"; - } - }) - .set("prompt", get.prompt2("moukui")); - "step 1"; - if (result.control == "draw_card") { - player.draw(); - player.logSkill("moukui"); - } else if (result.control == "discard_card" && trigger.target.countCards("he")) { - player.discardPlayerCard(trigger.target, "he", true).logSkill = ["moukui", trigger.target]; - } else event.finish(); - "step 2"; - player.addTempSkill("moukui2", "shaEnd"); - }, - ai: { - expose: 0.1, - }, - }, - moukui2: { - audio: false, - trigger: { player: "shaMiss" }, - forced: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - trigger.target.discardPlayerCard(player, true); - }, - }, - shenxian: { - audio: 2, - trigger: { global: ["loseAfter", "loseAsyncAfter"] }, - filter: function (event, player) { - if (event.type != "discard" || _status.currentPhase == player || event.getlx === false) return false; - if (event.name == "lose" && event.player == player) return false; - if (player.hasSkill("shenxian2")) return false; - var cards = event.cards.slice(0); - var evt = event.getl(player); - if (evt && evt.cards) cards.removeArray(evt.cards); - for (var i = 0; i < cards.length; i++) { - if (get.type(cards[i], null, event.hs && event.hs.includes(cards[i]) ? event.player : false) == "basic" && cards[i].original != "j") { - return true; - } - } - return false; - }, - frequent: true, - content: function () { - "step 0"; - if (trigger.delay == false) game.delay(); - "step 1"; - player.draw(); - if (event.name == "shenxian") player.addTempSkill("shenxian2"); - }, - ai: { - threaten: 1.5, - }, - }, - shenxian2: { charlotte: true }, - qiangwu: { - audio: 2, - enable: "phaseUse", - usable: 1, - content: function () { - "step 0"; - player.judge(); - "step 1"; - player.storage.qiangwu = result.number; - player.addTempSkill("qiangwu3", "phaseUseEnd"); - }, - ai: { - result: { - player: 1, - }, - order: 11, - }, - }, - qiangwu3: { - mod: { - targetInRange: function (card, player) { - if (card.name == "sha") { - const num = get.number(card); - if (num == "unsure" || num < player.storage.qiangwu) return true; - } - }, - cardUsable: function (card, player) { - if (card.name == "sha") { - const num = get.number(card); - if (num == "unsure" || num > player.storage.qiangwu) return true; - } - }, - }, - trigger: { player: "useCard1" }, - filter: function (event, player) { - if (_status.currentPhase == player && event.card.name == "sha" && get.number(event.card) > player.storage.qiangwu && event.addCount !== false) return true; - return false; - }, - forced: true, - popup: false, - firstDo: true, - content: function () { - trigger.addCount = false; - if (player.stat[player.stat.length - 1].card.sha > 0) { - player.stat[player.stat.length - 1].card.sha--; - } - }, - }, - zhendu: { - audio: 2, - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - return /*(get.mode()!='guozhan'||event.player!=player)&&*/ event.player.isIn() && player.countCards("h") > 0 && event.player.hasUseTarget({ name: "jiu" }, null, true); - }, - direct: true, - preHidden: true, - content: function () { - "step 0"; - var nono = Math.abs(get.attitude(player, trigger.player)) < 3; - if (player == trigger.player || get.damageEffect(trigger.player, player, player) <= 0 || !trigger.player.hasUseTarget({ name: "jiu" }, null, true)) { - nono = true; - } else if (trigger.player.hp > 2) { - nono = true; - } else if (trigger.player.hp > 1 && player.countCards("h") < 3 && trigger.player.canUse("sha", player) && !player.countCards("h", "shan") && trigger.player.countCards("h") >= 3) { - nono = true; - } - var next = player.chooseToDiscard(get.prompt2("zhendu", trigger.player)); - next.set("ai", function (card) { - if (_status.event.nono) return -1; - return 7 - get.useful(card); - }); - next.set("logSkill", ["zhendu", trigger.player]); - next.set("nono", nono); - next.setHiddenSkill("zhendu"); - "step 1"; - if (result.bool) { - trigger.player.chooseUseTarget({ name: "jiu" }, true, "noTargetDelay", "nodelayx"); - } else { - event.finish(); - } - "step 2"; - if (result.bool && trigger.player != player) trigger.player.damage(); - }, - ai: { - threaten: 2, - expose: 0.3, - }, - }, - qiluan: { - audio: "qiluan2", - preHidden: true, - trigger: { global: "phaseEnd" }, - frequent: true, - filter: function (event, player) { - return game.hasPlayer2(function (current) { - return current.getStat("kill") > 0; - }); - }, - prompt: function (event, player) { - var num = game.countPlayer2(function (current) { - return (current.getStat("kill") || 0) * (current == player ? 3 : 1); - }); - return get.prompt("qiluan") + "(可摸" + get.cnNumber(num) + "张牌)"; - }, - content: function () { - //if(get.mode()=='guozhan'){ - // player.draw(3); - //} - //else{ - player.draw( - game.countPlayer2(function (current) { - return (current.getStat("kill") || 0) * (current == player ? 3 : 1); - }) - ); - //} - }, - subSkill: { - draw: { - trigger: { global: "dieAfter" }, - frequent: true, - filter: function (event, player) { - return /*get.mode()!='guozhan'&&*/ player != event.source; - }, - content: function () { - player.draw(); - }, - }, - }, - }, - qiluan2: { - audio: 2, - }, - zniaoxiang: { - shaRelated: true, - audio: 2, - trigger: { player: "useCardToPlayered" }, - forced: true, - filter: function (event, player) { - return event.card.name == "sha" && !event.getParent().directHit.includes(event.target); - }, - //priority:-1, - logTarget: "target", - content: function () { - var id = trigger.target.playerid; - var map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].shanRequired == "number") { - map[id].shanRequired++; - } else { - map[id].shanRequired = 2; - } - }, - }, - shangyi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player != target && target.countCards("h"); - }, - content: function () { - "step 0"; - player.chooseCardButton(target, target.getCards("h")).set("filterButton", function (button) { - return get.color(button.link) == "black"; - }); - "step 1"; - if (result.bool) { - target.discard(result.links[0]); - } - }, - ai: { - order: 11, - result: { - target: function (player, target) { - return -target.countCards("h"); - }, - }, - threaten: 1.1, - }, - }, - shengxi: { - trigger: { player: "phaseDiscardBegin" }, - frequent: true, - filter: function (event, player) { - return !player.getStat("damage"); - }, - content: function () { - player.draw(2); - }, - audio: 2, - audioname: ["liushan"], - }, - shoucheng: { - init(player) { - game.addGlobalSkill("shoucheng_draw", player); - }, - trigger: { - global: ["equipAfter", "addJudgeAfter", "loseAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - audio: 2, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - if (current == _status.currentPhase) return false; - var evt = event.getl(current); - return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; - }); - }, - content: function () { - "step 0"; - event.list = game - .filterPlayer(function (current) { - if (current == _status.currentPhase) return false; - var evt = trigger.getl(current); - return evt && evt.hs && evt.hs.length; - }) - .sortBySeat(_status.currentPhase); - "step 1"; - var target = event.list.shift(); - event.target = target; - if (target.isIn() && target.countCards("h") == 0) { - player.chooseBool(get.prompt2("shoucheng", target)).set("ai", function () { - return get.attitude(_status.event.player, _status.event.getParent().target) > 0; - }); - } else event.goto(3); - "step 2"; - if (result.bool) { - player.logSkill(event.name, target); - if (player !== target && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.15); - target.draw(); - } - "step 3"; - if (event.list.length) event.goto(1); - }, - ai: { - threaten: 1.3, - }, - subSkill: { - draw: { - trigger: { player: "dieAfter" }, - filter(event, player) { - return !game.hasPlayer(current => { - return current.hasSkill("shoucheng"); - }, true); - }, - content() { - game.removeGlobalSkill("shoucheng_draw"); - }, - ai: { - noh: true, - skillTagFilter(player, tag, arg) { - if (player === _status.currentPhase || player.countCards("h") !== 1) return false; - return game.hasPlayer(current => { - return current.hasSkill("shoucheng") && player.isFriendOf(current); - }); - }, - }, - }, - }, - }, - hengzheng: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - preHidden: true, - filter: function (event, player) { - return !event.numFixed && (player.hp == 1 || player.countCards("h") == 0); - }, - check: function (event, player) { - var num = game.countPlayer(function (current) { - if (current.countCards("he") && current != player && get.attitude(player, current) <= 0) { - return true; - } - if (current.countCards("j") && current != player && get.attitude(player, current) > 0) { - return true; - } - }); - return num >= 2; - }, - content: function () { - "step 0"; - var targets = game.filterPlayer(); - targets.remove(player); - targets.sort(lib.sort.seat); - event.targets = targets; - event.num = 0; - trigger.changeToZero(); - player.line(targets, "green"); - "step 1"; - if (num < event.targets.length) { - if (event.targets[num].countCards("hej")) { - player.gainPlayerCard(event.targets[num], "hej", true); - } - event.num++; - event.redo(); - } - }, - ai: { - noh: true, - skillTagFilter: function (player, tag) { - if (tag == "noh") { - if (player.countCards("h") != 1) return false; - } - }, - threaten: function (player, target) { - if (target.hp == 1) return 2.5; - return 1; - }, - }, - }, - yongjue: { - audio: 2, - trigger: { global: "useCardAfter" }, - usable: 1, - filter: function (event, player) { - if (event.card.name != "sha") return false; - if (event.player == player) return false; - if (event.targets.includes(player)) return false; - if (event.cards) { - for (var i = 0; i < event.cards.length; i++) { - if (get.position(event.cards[i], true) == "o") return true; - } - } - return false; - }, - frequent: true, - content: function () { - var cards = trigger.cards.slice(0); - for (var i = 0; i < cards.length; i++) { - if (get.position(cards[i], true) != "o") { - cards.splice(i--, 1); - } - } - player.gain(cards, "gain2"); - }, - }, - guixiu: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - frequent: true, - filter: function (event, player) { - return event.card.name == "sha" && player.countCards("h") < player.hp; - }, - content: function () { - player.draw(); - }, - }, - cunsi: { - skillAnimation: true, - animationColor: "orange", - audio: 2, - unique: true, - enable: "phaseUse", - mark: true, - limited: true, - derivation: "yongjue", - filter: function (event, player) { - return !player.storage.cunsi && player.countCards("h") && !player.isTurnedOver(); - }, - init: function (player) { - player.storage.cunsi = false; - }, - filterTarget: function (card, player, target) { - return player != target && target.hasSex("male"); - }, - content: function () { - "step 0"; - player.awakenSkill("cunsi"); - var cards = player.getCards("h"); - player.give(cards, target); - "step 1"; - target.addSkills("yongjue"); - "step 2"; - target.markSkillCharacter("yongjue", player, "存嗣", '
    【勇决】
    每当其他角色于回合内使用一张杀,若目标不是你,你可以获得之,每回合限一次
    '); - player.turnOver(); - }, - intro: { - content: "limited", - }, - ai: { - order: 4, - result: { - target: function (player, target) { - if (target.isMin()) return 0; - if (player.hp > 1) { - if (game.phaseNumber < game.players.length) return 0; - if (target.hp == 1 && target.maxHp > 2) return 0; - if (get.attitude(player, target) < 5) return 0; - } - if (get.attitude(player, target) < 5) return 0; - if (target.hp == 1 && target.maxHp > 2) return 0.2; - if (target == game.me) return 1.2; - return 1; - }, - }, - expose: 0.5, - threaten: 1.5, - }, - }, - fenming: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - check: function (event, player) { - var num = game.countPlayer(function (current) { - if (current.isLinked() && current.countCards("he")) { - return get.effect(current, { name: "guohe_copy2" }, player, player); - } - }); - return num < 0; - }, - filter: function (event, player) { - return player.isLinked(); - }, - preHidden: true, - prompt: "是否发动【奋命】?", - logTarget: function (event, player) { - return game.filterPlayer(function (current) { - if (current.isLinked() && current.countCards("he")) { - return true; - } - }); - }, - content: function () { - "step 0"; - event.targets = game.filterPlayer(function (current) { - if (current.isLinked() && current.countCards("he")) { - return true; - } - }); - event.num = 0; - event.targets.sort(lib.sort.seat); - "step 1"; - if (event.num < event.targets.length) { - var target = event.targets[event.num]; - if (player == target) { - player.chooseToDiscard(true, "he"); - } else { - player.discardPlayerCard(true, "he", target); - } - event.num++; - event.redo(); - } - }, - }, - duanxie: { - enable: "phaseUse", - usable: 1, - audio: 2, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && !current.isLinked(); - }); - }, - filterTarget: function (card, player, target) { - return player != target && !target.isLinked(); - }, - selectTarget: function () { - return [1, Math.max(1, _status.event.player.getDamagedHp())]; - }, - content: function () { - if (!target.isLinked()) target.link(); - }, - contentAfter: function () { - if (!player.isLinked()) player.link(); - }, - ai: { - result: { - target: -1, - player: function (player) { - return player.isLinked() ? 0 : -0.8; - }, - }, - order: 2, - expose: 0.3, - effect: { - target: function (card) { - if (card.name == "tiesuo") { - return 0.5; - } - }, - }, - }, - }, - xiaoguo: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return event.player.isIn() && event.player != player && player.countCards("h"); - }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseToDiscard(get.prompt("xiaoguo", trigger.player)); - next.set("ai", function (card) { - return _status.event.eff - get.useful(card); - }); - next.set("logSkill", ["xiaoguo", trigger.player]); - next.set( - "eff", - (function () { - if (trigger.player.hasSkillTag("noe")) return get.attitude(_status.event.player, trigger.player); - return get.damageEffect(trigger.player, player, _status.event.player); - })() - ); - "step 1"; - if (result.bool) { - if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15); - trigger.player - .chooseToDiscard("he", "弃置一张装备牌并令" + get.translation(player) + "摸一张牌,或受到1点伤害", { type: "equip" }) - .set("ai", function (card) { - if (_status.event.damage > 0) return 0; - if (_status.event.noe) return 12 - get.value(card); - return 2 * _status.event.damage - get.value(card); - }) - .set("damage", get.damageEffect(trigger.player, player, trigger.player)) - .set("noe", trigger.player.hasSkillTag("noe")); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.draw(); - } else { - trigger.player.damage(); - } - }, - }, - suishi: { - audio: 2, - trigger: { global: "dying" }, - forced: true, - popup: false, - //priority:12, - check: function () { - return false; - }, - filter: function (event, player) { - return event.player != player && event.parent.name == "damage" && event.parent.source && event.parent.source != event.player; - }, - content: function () { - "step 0"; - var str; - if (trigger.parent.source == player) { - str = "随势:是否摸一张牌?"; - } else { - str = "随势:是否令" + get.translation(player) + "摸一张牌?"; - } - trigger.parent.source - .chooseBool(str) - .set("ai", function () { - return get.attitude(_status.event.player, _status.event.target) > 0; - }) - .set("target", player); - "step 1"; - if (result.bool) { - player.logSkill("suishi"); - trigger.parent.source.line(player, "green"); - player.draw(); - } - }, - ai: { - halfneg: true - }, - group: "suishi2", - }, - suishi2: { - trigger: { global: "dieAfter" }, - forced: true, - popup: false, - check: function () { - return false; - }, - filter: function (event, player) { - return event.player != player && event.source && event.source != player && event.source != event.player; - }, - content: function () { - "step 0"; - var str; - if (trigger.source == player) { - str = "随势:是否失去1点体力?"; - } else { - str = "随势:是否令" + get.translation(player) + "失去1点体力?"; - } - trigger.source - .chooseBool(str) - .set("ai", function () { - return get.attitude(_status.event.player, _status.event.target) < 0; - }) - .set("target", player); - "step 1"; - if (result.bool) { - player.logSkill("suishi"); - trigger.source.line(player, "green"); - player.loseHp(); - } - }, - }, - sijian: { - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - direct: true, - audio: 2, - preHidden: true, - filter: function (event, player) { - if (player.countCards("h")) return false; - if (event.name == "gain" && event.player == player) return false; - var evt = event.getl(player); - return evt && evt.hs && evt.hs.length > 0; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("sijian"), "弃置一名其他角色的一张牌", function (card, player, target) { - return player != target && target.countCards("he") > 0; - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - player.logSkill("sijian", result.targets); - event.target = result.targets[0]; - player.discardPlayerCard(event.target, true); - } else { - event.finish(); - } - }, - ai: { - expose: 0.2, - }, - }, - quji: { - audio: 2, - enable: "phaseUse", - usable: 1, - position: "he", - filterCard: true, - selectCard: function () { - var player = _status.event.player; - return player.getDamagedHp(); - }, - filterTarget: function (card, player, target) { - return target.hp < target.maxHp; - }, - filter: function (event, player) { - return player.hp < player.maxHp; - }, - selectTarget: function () { - return [1, ui.selected.cards.length]; - }, - complexSelect: true, - check: function (card) { - if (get.color(card) == "black") return -1; - return 9 - get.value(card); - }, - content: function () { - "step 0"; - target.recover(); - "step 1"; - if (target == targets[targets.length - 1]) { - for (var i = 0; i < cards.length; i++) { - if (get.color(cards[i], player) == "black") { - player.loseHp(); - break; - } - } - } - }, - ai: { - result: { - target: 1, - }, - order: 6, - }, - }, - junbing: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return event.player.countCards("h") <= 1 && (player == event.player || player.hasSkill("junbing")); - }, - direct: true, - checkx: function (target, player) { - if (target) { - var num = target.countCards("h"); - var att = get.attitude(player, target); - if (num == 0) return true; - if (num == 1) return att > -1; - if (num == 2) return att > 0; - return att > 1; - } - return false; - }, - content: function () { - "step 0"; - event.target = player; - event.player = trigger.player; - var prompt; - if (player == event.player) prompt = "是否发动【郡兵】摸一张牌?"; - else prompt = "###是否对" + get.translation(event.target) + "发动【郡兵】?###" + (event.player == event.target ? "摸一张牌" : "摸一张牌,将所有手牌交给该角色,然后该角色交给你等量的手牌"); - event.player.chooseBool(prompt).set("choice", lib.skill.junbing.checkx(event.target, event.player)); - "step 1"; - if (!result.bool) { - event.finish(); - return; - } - target.logSkill("junbing", player); - if (player == target) event.finish(); - player.draw(); - "step 2"; - var cards = player.getCards("h"); - player.give(cards, target); - event.num = cards.length; - "step 3"; - var he = target.getCards("he"); - if (!he.length) event.finish(); - else if (he.length <= num) event._result = { cards: he }; - else target.chooseCard("选择还给" + get.translation(player) + "的牌", true, event.num, "he"); - "step 4"; - target.give(result.cards, player); - }, - }, - xiongyi: { - skillAnimation: true, - animationColor: "gray", - unique: true, - enable: "phaseUse", - audio: 2, - limited: true, - filterTarget: function (card, player, target) { - if (get.mode() == "guozhan") { - if (player == target) return true; - if (player.identity == "unknown") { - if (!player.wontYe("qun")) return false; - return target.identity == "qun"; - } - return target.isFriendOf(player); - } else { - return true; - } - }, - multitarget: true, - multiline: true, - selectTarget: function () { - if (get.mode() == "guozhan") return -1; - return [1, Infinity]; - }, - content: function () { - "step 0"; - player.awakenSkill("xiongyi"); - game.asyncDraw(targets, 3); - "step 1"; - if (player.isDamaged()) { - if (get.mode() == "guozhan") { - if (player.isMinor(true)) { - player.recover(); - } - } else if (player.isMinHp()) { - player.recover(); - } - } - }, - ai: { - order: 1, - result: { - target: function (player) { - var num = player.countCards("h"); - if (player.hp == 1) return 1; - if (player.hp == 2 && num <= 2) return 1; - if (player.hp == 3 && num <= 1) return 1; - if (game.phaseNumber < game.players.length * 2) return 0; - if (player.hasUnknown()) return 0; - return 1; - }, - }, - }, - }, - gzshushen: { - audio: "shushen", - trigger: { player: "recoverAfter" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return player != current && player.sameIdentityAs(current); - }); - }, - content: function () { - "step 0"; - event.num = trigger.num || 1; - "step 1"; - player - .chooseTarget(get.prompt2("gzshushen"), function (card, player, target) { - return target != player && player.sameIdentityAs(target); - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 2"; - if (result.bool) { - player.logSkill("gzshushen", result.targets); - result.targets[0].draw(); - if (event.num > 1) { - event.num--; - event.goto(1); - } - } - }, - ai: { - threaten: 0.8, - expose: 0.1, - }, - }, - shushen: { - audio: 2, - trigger: { player: "recoverAfter" }, - direct: true, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - player - .chooseTarget(get.prompt("shushen"), "令一名其他角色选择摸两张牌或回复1点体力", function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 2"; - if (result.bool) { - event.count--; - player.logSkill("shushen", result.targets); - result.targets[0].chooseDrawRecover(2, true); - if (event.count) event.goto(1); - } - }, - ai: { - threaten: 0.8, - expose: 0.1, - }, - }, - shenzhi: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - check: function (event, player) { - if (player.hp > 2) return false; - var cards = player.getCards("h"); - if (cards.length < player.hp) return false; - if (cards.length > 3) return false; - for (var i = 0; i < cards.length; i++) { - if (get.value(cards[i]) > 7 || get.tag(cards[i], "recover") >= 1) return false; - } - return true; - }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - preHidden: true, - content: function () { - "step 0"; - var cards = player.getCards("h"); - event.bool = cards.length >= player.hp; - player.discard(cards); - "step 1"; - if (event.bool) { - player.recover(); - } - }, - }, - wuji: { - skillAnimation: true, - animationColor: "orange", - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - unique: true, - juexingji: true, - filter: function (event, player) { - return player.getStat("damage") >= 3 && !player.storage.wuji; - }, - content: function () { - "step 0"; - player.removeSkills("huxiao"); - player.gainMaxHp(); - "step 1"; - player.recover(); - player.awakenSkill("wuji"); - player.storage.wuji = true; - - var card = get.cardPile("qinglong", "field"); - if (card) { - player.gain(card, "gain2", "log"); - } - }, - }, - xueji_old: { - audio: "xueji", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.hp < player.maxHp && player.countCards("he", { color: "red" }) > 0; - }, - filterTarget: function (card, player, target) { - return player != target && get.distance(player, target, "attack") <= 1; - }, - selectTarget: function () { - return [1, _status.event.player.maxHp - _status.event.player.hp]; - }, - position: "he", - filterCard: function (card) { - return get.color(card) == "red"; - }, - check: function (card) { - return 8 - get.useful(card); - }, - content: function () { - "step 0"; - target.damage(); - "step 1"; - target.draw(); - }, - ai: { - order: 7, - result: { - target: function (player, target) { - return get.damageEffect(target, player); - }, - }, - threaten: function (player, target) { - if (target.hp == 1) return 2; - if (target.hp == 2) return 1.5; - return 0.5; - }, - maixie: true, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (target.hp == target.maxHp && target.hasFriend()) return [0, 1]; - } - if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; - }, - }, - }, - }, - //FW关银屏 - oldhuxiao: { - shaRelated: true, - audio: "huxiao", - trigger: { player: "shaMiss" }, - forced: true, - content: function () { - if (player.stat[player.stat.length - 1].card.sha > 0) { - player.stat[player.stat.length - 1].card.sha--; - } - }, - }, - oldwuji: { - unique: true, - audio: "wuji", - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.getStat("damage") >= 3 && !player.storage.oldwuji; - }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "orange", - content: function () { - "step 0"; - player.removeSkills("oldhuxiao"); - player.gainMaxHp(); - "step 1"; - player.recover(); - player.awakenSkill("oldwuji"); - }, - }, - xueji: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("he", { color: "red" }) > 0; - }, - filterTarget: true, - selectTarget: function () { - var player = _status.event.player; - return [1, Math.max(1, player.getDamagedHp())]; - }, - position: "he", - filterCard: { color: "red" }, - check: function (card) { - return 8 - get.value(card); - }, - multitarget: true, - multiline: true, - line: "fire", - content: function () { - "step 0"; - event.delay = false; - for (var i = 0; i < targets.length; i++) { - if (!targets[i].isLinked()) { - targets[i].link(true); - event.delay = true; - } - } - "step 1"; - if (event.delay) { - game.delay(); - } - "step 2"; - targets[0].damage("fire", "nocard"); - }, - ai: { - damage: true, - fireAttack: true, - threaten: 1.5, - order: 7, - result: { - target: function (player, target) { - var eff = get.damageEffect(target, player, target, "fire"); - if (target.isLinked()) { - return eff / 10; - } else { - return eff; - } - }, - }, - }, - }, - huxiao: { - trigger: { source: "damageSource" }, - forced: true, - filter: function (event, player) { - if (event._notrigger.includes(event.player) || !event.player.isIn()) return false; - return event.hasNature("fire"); - }, - logTarget: "player", - content: function () { - if (!player.storage.huxiao3) { - player.storage.huxiao3 = []; - } - player.storage.huxiao3.add(trigger.player); - trigger.player.draw(); - player.addTempSkill("huxiao3"); - }, - }, - huxiao3: { - onremove: true, - mark: true, - intro: { - content: "players", - }, - mod: { - cardUsableTarget: function (card, player, target) { - if (player.storage.huxiao3 && player.storage.huxiao3.includes(target)) return true; - }, - }, - }, - aocai: { - audio: 2, - audioname: ["gz_zhugeke"], - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - if (player != _status.currentPhase && get.type(name) == "basic" && lib.inpile.includes(name)) return true; - }, - filter: function (event, player) { - if (event.responded || player == _status.currentPhase || event.aocai) return false; - for (var i of lib.inpile) { - if (get.type(i) == "basic" && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) return true; - } - return false; - }, - delay: false, - content: function () { - "step 0"; - var evt = event.getParent(2); - evt.set("aocai", true); - var cards = get.cards(get.mode() != "guozhan" && player.countCards("h") == 0 ? 4 : 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 (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 card = result.links[0]; - var name = card.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.aocai_backup.viewAs = { - name: name, - cards: [result], - isCard: true, - }; - }, - card, - name - ); - evt.set("_backupevent", "aocai_backup"); - evt.set("openskilldialog", "请选择" + get.translation(card) + "的目标"); - evt.backup("aocai_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 (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; - }, - }, - }, - }, - aocai_backup: { - sourceSkill: "aocai", - precontent: function () { - delete event.result.skill; - var name = event.result.card.name, - cards = event.result.card.cards.slice(0); - event.result.cards = cards; - var rcard = cards[0], - card; - if (rcard.name == name) card = get.autoViewAs(rcard); - else card = get.autoViewAs({ name, isCard: true }); - event.result.card = card; - }, - filterCard: function () { - return false; - }, - selectCard: -1, - }, - hongyuan: { - trigger: { player: "phaseDrawBegin2" }, - direct: true, - audio: 2, - filter: function (event, player) { - return !event.numFixed && event.num > 0; - }, - content: function () { - "step 0"; - var check; - if (player.countCards("h") == 0) { - check = false; - } else { - check = - game.countPlayer(function (current) { - return player != current && get.attitude(player, current) > 1; - }) >= 2; - } - if (get.is.versus()) { - event.versus = true; - player.chooseBool(get.prompt2("hongyuan")).ai = function () { - return ( - game.countPlayer(function (current) { - return player.side == current.side; - }) > 2 - ); - }; - } else { - player - .chooseTarget( - get.prompt2("hongyuan"), - [1, 2], - function (card, player, target) { - return player != target; - }, - function (target) { - if (!_status.event.check) return 0; - return get.attitude(_status.event.player, target); - } - ) - .set("check", check); - } - "step 1"; - if (result.bool) { - var targets; - if (event.versus) { - targets = game.filterPlayer(function (current) { - return current != player && current.side == player.side; - }); - } else { - targets = result.targets; - } - player.logSkill("hongyuan", targets); - game.asyncDraw(targets); - trigger.num--; - } - }, - }, - huanshi: { - audio: 2, - trigger: { global: "judge" }, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - logTarget: "player", - check: function (event, player) { - if (get.attitude(player, event.player) <= 0) return false; - var cards = player.getCards("he"); - var judge = event.judge(event.player.judging[0]); - for (var i = 0; i < cards.length; i++) { - var judge2 = event.judge(cards[i]); - if (judge2 > judge) return true; - if (_status.currentPhase != player && judge2 == judge && get.color(cards[i]) == "red" && get.useful(cards[i]) < 5) return true; - } - return false; - }, - content: function () { - "step 0"; - var target = trigger.player; - var judge = trigger.judge(target.judging[0]); - var attitude = get.attitude(target, player); - target - .choosePlayerCard("请选择代替判定的牌", "he", "visible", true, player) - .set("ai", function (button) { - var card = button.link; - var judge = _status.event.judge; - var attitude = _status.event.attitude; - var result = trigger.judge(card) - judge; - var player = _status.event.player; - if (result > 0) { - return 20 + result; - } - if (result == 0) { - if (_status.currentPhase == player) return 0; - if (attitude >= 0) { - return get.color(card) == "red" ? 7 : 0 - get.value(card); - } else { - return get.color(card) == "black" ? 10 : 0 + get.value(card); - } - } - if (attitude >= 0) { - return get.color(card) == "red" ? 0 : -10 + result; - } else { - return get.color(card) == "black" ? 0 : -10 + result; - } - }) - .set("filterButton", function (button) { - var player = _status.event.target; - var card = button.link; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - }) - .set("judge", judge) - .set("attitude", attitude); - "step 1"; - if (result.bool) { - event.card = result.links[0]; - player.respond(event.card, "highlight", "noOrdering").nopopup = true; - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = event.card; - trigger.orderingCards.add(event.card); - game.log(trigger.player, "的判定牌改为", event.card); - game.delay(2); - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - mingzhe: { - audio: 2, - trigger: { - player: ["useCard", "respond", "loseAfter"], - global: "loseAsyncAfter", - }, - frequent: true, - filter: function (event, player) { - if (player == _status.currentPhase) return false; - if (event.name.indexOf("lose") != 0) return get.color(event.card) == "red"; - if (event.type != "discard") return false; - var evt = event.getl(player); - if (evt && evt.cards2) { - for (var i = 0; i < evt.cards2.length; i++) { - if (get.color(evt.cards2[i], player) == "red") return true; - } - } - return false; - }, - content: function () { - "step 0"; - event.count = 1; - if (trigger.name.indexOf("lose") == 0) { - event.count = 0; - var evt = trigger.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (get.color(evt.cards2[i], player) == "red") event.count++; - } - } - "step 1"; - player.draw(); - event.count--; - "step 2"; - if (event.count && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { - player.chooseBool(get.prompt2("mingzhe")).set("frequentSkill", event.name); - } else event.finish(); - "step 3"; - if (result.bool) { - player.logSkill("mingzhe"); - event.goto(1); - } - }, - ai: { - threaten: 0.7, - }, - }, - - duwu: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return ( - player.hasSkill("duwu2") == false && - game.hasPlayer(function (current) { - return current.hp > 0 && current.hp <= player.countCards("he") && player.inRange(current); - }) - ); - }, - 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.hp > 0 && player.inRange(target) && ui.selected.cards.length == target.hp; - }, - check: function (card) { - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return current != player && current.hp > 0 && player.inRange(current) && ui.selected.cards.length == current.hp && 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 () { - player.addTempSkill("duwu3"); - target.damage("nocard"); - }, - ai: { - damage: true, - order: 2, - result: { - target: function (player, target) { - return get.damageEffect(target, player); - }, - }, - threaten: 1.5, - expose: 0.3, - }, - }, - duwu2: { charlotte: true }, - duwu3: { - trigger: { global: "dyingAfter" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return event.player.isIn() && event.reason && event.reason.getParent().name == "duwu"; - }, - content: function () { - player.loseHp(); - player.addTempSkill("duwu2"); - }, - }, - yicong: { - trigger: { - player: ["changeHp"], - }, - audio: 2, - audioname: ["re_gongsunzan"], - forced: true, - filter: function (event, player) { - return get.sgn(player.hp - 2.5) != get.sgn(player.hp - 2.5 - event.num); - }, - content: function () {}, - mod: { - globalFrom: function (from, to, current) { - if (from.hp > 2) return current - 1; - }, - globalTo: function (from, to, current) { - if (to.hp <= 2) return current + 1; - }, - }, - ai: { - threaten: 0.8, - }, - }, - yongsi: { - audio: 2, - group: ["yongsi1", "yongsi2"], - locked: true, - ai: { - threaten: 3.2, - }, - }, - yongsi1: { - audio: true, - trigger: { player: "phaseDrawBegin2" }, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.num += game.countGroup(); - }, - }, - yongsi2: { - audio: true, - trigger: { player: "phaseDiscardBegin" }, - forced: true, - content: function () { - player.chooseToDiscard(game.countGroup(), "he", true); - }, - }, - bifa: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - audio: 2, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - filterCard: true, - filterTarget: function (card, player, target) { - return player != target && !target.getExpansions("bifa2").length; - }, - ai1: function (card) { - return 7 - get.value(card); - }, - ai2: function (target) { - var num = target.hasSkillTag("maixie") ? 2 : 0; - return -get.attitude(_status.event.player, target) - num; - }, - prompt: get.prompt2("bifa"), - }); - "step 1"; - if (result.bool) { - event.forceDie = true; - var target = result.targets[0]; - event.target = target; - player.logSkill("bifa", result.targets[0]); - event.card = result.cards[0]; - target.storage.bifa2 = [result.cards[0], player]; - if (!_status.connectMode && player.isUnderControl(true)) player.$giveAuto(result.cards[0], target, false); - else player.$give(1, target, false); - target.addToExpansion(result.cards[0]).gaintag.add("bifa2"); - } else event.finish(); - "step 2"; - if (target.getExpansions("bifa2").includes(card)) { - target.addSkill("bifa2"); - } else delete target.storage.bifa2; - }, - ai: { - threaten: 1.7, - expose: 0.3, - }, - }, - bifa2: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - charlotte: true, - audio: false, - filter: function (event, player) { - return player.storage.bifa2 && player.getExpansions("bifa2").includes(player.storage.bifa2[0]); - }, - content: function () { - "step 0"; - if (player.storage.bifa2[1].isIn() && player.countCards("h")) { - player - .chooseCard(get.translation(player.storage.bifa2[1]) + "的笔伐牌为:", function (card) { - return get.type(card, "trick") == _status.event.type; - }) - .set("ai", function (card) { - return 8 - get.value(card); - }) - .set("type", get.type(player.storage.bifa2[0], "trick")) - .set("promptx", [[player.storage.bifa2[0]], "请交给其一张与此牌类别相同的手牌,否则失去1点体力"]); - } else { - event.directfalse = true; - } - "step 1"; - if (result.bool && !event.directfalse) { - player.give(result.cards, player.storage.bifa2[1]); - player.gain(player.storage.bifa2[0], "draw"); - } else { - player.loseHp(); - } - "step 2"; - player.removeSkill("bifa2"); - }, - marktext: "檄", - intro: { - markcount: () => 1, - name: "笔伐", - content: "已成为〖笔伐〗的目标", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - delete player.storage[skill]; - }, - }, - songci: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (!player.storage.songci) return true; - return game.hasPlayer(function (current) { - return !player.storage.songci.includes(current); - }); - }, - init: function (player) { - if (!player.storage.songci) player.storage.songci = []; - }, - filterTarget: function (card, player, target) { - return !player.storage.songci || !player.storage.songci.includes(target); - }, - content: function () { - if (target.countCards("h") > target.hp) { - target.chooseToDiscard(2, "he", true); - } else { - target.draw(2); - } - if (!player.storage.songci) player.storage.songci = []; - player.storage.songci.push(target); - player.storage.songci.sortBySeat(); - player.markSkill("songci"); - }, - intro: { - content: "已对$发动过〖颂词〗", - }, - ai: { - order: 7, - threaten: 1.6, - expose: 0.2, - result: { - target: function (player, target) { - if (target.countCards("h") <= target.hp) { - return 1; - } else if (target.countCards("h") > target.hp) { - return -1; - } - }, - }, - }, - group: "songci_draw", - }, - songci_draw: { - audio: "songci", - trigger: { player: "phaseDiscardEnd" }, - forced: true, - filter: function (event, player) { - if (!player.storage.songci) return false; - return !game.hasPlayer(function (current) { - return !player.storage.songci.includes(current); - }); - }, - content: function () { - player.draw(); - }, - }, - baobian: { - audio: 2, - trigger: { player: ["phaseBefore", "changeHp"] }, - forced: true, - popup: false, - init: function (player) { - if (game.online) return; - player.removeAdditionalSkill("baobian"); - var list = []; - if (player.hp <= 3) { - //if(trigger.num!=undefined&&trigger.num<0&&player.hp-trigger.num>1) player.logSkill('baobian'); - list.push("oltiaoxin"); - } - if (player.hp <= 2) { - list.push("olpaoxiao"); - } - if (player.hp <= 1) { - list.push("xinshensu"); - } - if (list.length) { - player.addAdditionalSkill("baobian", list); - } - }, - derivation: ["oltiaoxin", "olpaoxiao", "xinshensu"], - content: function () { - player.removeAdditionalSkill("baobian"); - var list = []; - if (player.hp <= 3) { - if (trigger.num != undefined && trigger.num < 0 && player.hp - trigger.num > 1) player.logSkill("baobian"); - list.push("oltiaoxin"); - } - if (player.hp <= 2) { - list.push("olpaoxiao"); - } - if (player.hp <= 1) { - list.push("xinshensu"); - } - if (list.length) { - player.addAdditionalSkill("baobian", list); - } - }, - ai: { - maixie: true, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (!target.hasFriend()) return; - if (target.hp >= 4) return [0, 1]; - } - if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; - }, - }, - }, - }, - chongzhen: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - filter: function (event, player) { - if (event.card.name != "sha" && event.card.name != "shan") return false; - if (!event.skill || event.skill.indexOf("fanghun") + event.skill.indexOf("longdan") == -2) return false; - var target = lib.skill.chongzhen.logTarget(event, player); - return target && target.countGainableCards(player, "h") > 0; - }, - logTarget: function (event, player) { - if (event.name == "respond") return event.source; - if (event.card.name == "sha") return event.targets[0]; - return event.respondTo[0]; - }, - prompt2: function (event, player) { - var target = lib.skill.chongzhen.logTarget(event, player); - return "获得" + get.translation(target) + "的一张手牌"; - }, - content: function () { - var target = lib.skill.chongzhen.logTarget(trigger, player); - player.gainPlayerCard(target, "h", true); - }, - ai: { - combo: "ollongdan", - mingzhi: false, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "respondShan") || get.tag(card, "respondSha")) { - if (get.attitude(target, player) <= 0) { - if (current > 0) return; - if (target.countCards("h") == 0) return 1.6; - if (target.countCards("h") == 1) return 1.2; - if (target.countCards("h") == 2) return [0.8, 0.2, 0, -0.2]; - return [0.4, 0.7, 0, -0.7]; - } - } - }, - }, - }, - }, - lihun: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player != target && target.hasSex("male"); - }, - filterCard: true, - position: "he", - content: function () { - player.gainPlayerCard(target, true, "h", target.countCards("h")); - player.turnOver(); - player.addSkill("lihun2"); - player.storage.lihun = target; - }, - check: function (card) { - return 8 - get.value(card); - }, - ai: { - order: 10, - result: { - player: function (player) { - if (player.classList.contains("turnedover")) return 10; - return 0; - }, - target: function (player, target) { - if (target.countCards("h") > target.hp) return target.hp - target.countCards("h"); - return 0; - }, - }, - threaten: 1.5, - effect: { - target: function (card) { - if (card.name == "guiyoujie") return [0, 2]; - }, - }, - }, - }, - lihun2: { - trigger: { player: "phaseUseEnd" }, - forced: true, - popup: false, - audio: false, - content: function () { - "step 0"; - var cards = player.getCards("he"); - player.removeSkill("lihun2"); - if (player.storage.lihun.classList.contains("dead") || player.storage.lihun.hp <= 0 || cards.length == 0) { - event.finish(); - } else { - if (cards.length < player.storage.lihun.hp) event._result = { bool: true, cards: cards }; - else player.chooseCard("he", true, player.storage.lihun.hp, "离魂:选择要交给" + get.translation(player.storage.lihun) + "的牌"); - } - "step 1"; - player.give(result.cards, player.storage.lihun); - }, - }, - yuanhu: { - audio: 3, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("he", { type: "equip" }) > 0; - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - filterCard: function (card) { - return get.type(card) == "equip"; - }, - position: "he", - filterTarget: function (card, player, target) { - return target.canEquip(card); - }, - ai1: function (card) { - return 6 - get.value(card); - }, - ai2: function (target) { - return get.attitude(_status.event.player, target) - 3; - }, - prompt: get.prompt2("yuanhu"), - }); - "step 1"; - if (result.bool) { - player.logSkill("yuanhu", result.targets); - var thisTarget = result.targets[0]; - var thisCard = result.cards[0]; - thisTarget.equip(thisCard); - event.target = thisTarget; - if (thisTarget != player) { - player.$give(thisCard, thisTarget, false); - } - switch (get.subtype(thisCard)) { - case "equip1": { - if ( - !game.hasPlayer(function (current) { - return get.distance(thisTarget, current) <= 1; - }) - ) { - event.finish(); - return; - } - game.delay(); - player - .chooseTarget(true, function (card, player, target) { - return get.distance(_status.event.thisTarget, target) <= 1 && target.countCards("hej"); - }) - .set("ai", function (target) { - var attitude = get.attitude(_status.event.player, target); - if (attitude > 0 && target.countCards("j")) { - return attitude * 1.5; - } - return -attitude; - }) - .set("thisTarget", thisTarget); - return; - } - case "equip2": { - thisTarget.draw(); - event.finish(); - return; - } - case "equip5": { - event.finish(); - return; - } - default: { - thisTarget.recover(); - event.finish(); - return; - } - } - } else { - event.finish(); - } - "step 2"; - if (result.targets.length) { - player.discardPlayerCard(true, result.targets[0], "hej"); - } - }, - }, - tianming: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - check: function (event, player) { - var cards = player.getCards("h"); - if (cards.length <= 2) { - for (var i = 0; i < cards.length; i++) { - if (cards[i].name == "shan" || cards[i].name == "tao") return false; - } - } - return true; - }, - filter: function (event, player) { - return event.card.name == "sha"; - }, - content: function () { - "step 0"; - player.chooseToDiscard(2, true, "he"); - player.draw(2); - var players = game.filterPlayer(); - players.sort(function (a, b) { - return b.hp - a.hp; - }); - if (players[0].hp > players[1].hp && players[0] != player) { - players[0].chooseBool(get.prompt2("tianming")); - event.player = players[0]; - } else { - event.finish(); - } - "step 1"; - if (result.bool) { - player.chooseToDiscard(2, true, "he"); - player.draw(2); - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (card.name == "sha") return [1, 0.5]; - }, - }, - }, - }, - mizhao: { - enable: "phaseUse", - usable: 1, - audio: 2, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterCard: true, - selectCard: -1, - filterTarget: function (card, player, target) { - return player != target; - }, - discard: false, - lose: false, - delay: false, - ai: { - order: 1, - result: { - player: 0, - target: function (player, target) { - if (target.hasSkillTag("nogain")) return 0; - if (player.countCards("h") > 1) { - return 1; - } - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i].countCards("h") && players[i] != target && players[i] != player && get.attitude(player, players[i]) < 0) { - break; - } - } - if (i == players.length) { - return 1; - } - return -2 / (target.countCards("h") + 1); - }, - }, - }, - content: function () { - "step 0"; - event.target1 = targets[0]; - player.give(cards, targets[0], "giveAuto"); - "step 1"; - if (!targets[0].countCards("h")) { - event.finish(); - return; - } - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != event.target1 && players[i] != player && event.target1.canCompare(players[i])) { - break; - } - } - if (i == players.length) { - event.finish(); - } - "step 2"; - player - .chooseTarget(true, "选择拼点目标", function (card, player, target) { - return _status.event.target1.canCompare(target) && target != player; - }) - .set("ai", function (target) { - var player = _status.event.player; - var eff = get.effect(target, { name: "sha" }, _status.event.target1, player); - var att = get.attitude(player, target); - if (att > 0) { - return eff - 10; - } - return eff; - }) - .set("target1", event.target1) - .set("forceDie", true); - "step 3"; - if (result.targets.length) { - event.target2 = result.targets[0]; - event.target1.line(event.target2); - event.target1.chooseToCompare(event.target2); - } else { - event.finish(); - } - "step 4"; - if (!result.tie) { - if (result.bool) { - if (event.target1.canUse({ name: "sha", isCard: true }, event.target2, false)) event.target1.useCard({ name: "sha", isCard: true }, event.target2); - } else if (event.target2.canUse({ name: "sha", isCard: true }, event.target1, false)) { - event.target2.useCard({ name: "sha", isCard: true }, event.target1); - } - } - }, - }, - gongao: { - audio: 2, - trigger: { global: "dieAfter" }, - forced: true, - content: function () { - player.gainMaxHp(); - player.recover(); - }, - ai: { - threaten: 1.5, - }, - }, - juyi: { - skillAnimation: true, - animationColor: "thunder", - audio: 2, - derivation: ["benghuai", "weizhong"], - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return player.maxHp > game.countPlayer() && !player.storage.juyi; - }, - forced: true, - unique: true, - juexingji: true, - content: function () { - player.awakenSkill("juyi"); - player.draw(player.maxHp); - player.addSkills(["benghuai", "weizhong"]); - }, - }, - weizhong: { - audio: 2, - trigger: { player: ["gainMaxHpEnd", "loseMaxHpEnd"] }, - forced: true, - content: function () { - player.draw(player.isMinHandcard() ? 2 : 1); - }, - }, - kuangfu: { - trigger: { source: "damageSource" }, - audio: 2, - filter: function (event) { - if (event._notrigger.includes(event.player)) return false; - return event.card && event.card.name == "sha" && event.player.countCards("e"); - }, - logTarget: "player", - preHidden: true, - check: function (event, player) { - return get.attitude(player, event.player) <= 0; - }, - content: function () { - "step 0"; - var neg = get.attitude(player, trigger.player) <= 0; - player - .choosePlayerCard("e", trigger.player) - .set("ai", function (button) { - if (_status.event.neg) { - return get.buttonValue(button); - } - return 0; - }) - .set("neg", neg); - "step 1"; - if (result.bool) { - event.card = result.links[0]; - if (player.canEquip(event.card)) { - player.chooseBool("是否将" + get.translation(event.card) + "置入自己的装备区?").ai = function () { - return true; - }; - } else event._result = { bool: false }; - } else event.finish(); - "step 2"; - if (result.bool) { - trigger.player.$give(event.card, player, false); - player.equip(event.card); - } else trigger.player.discard(event.card); - }, - }, - xinfu_lingren: { - audio: 2, - trigger: { - player: "useCardToPlayered", - }, - filter: function (event, player) { - if (event.getParent().triggeredTargets3.length > 1) return false; - if (!["basic", "trick"].includes(get.type(event.card))) return false; - if (get.tag(event.card, "damage")) return true; - return false; - }, - usable: 1, - direct: true, - derivation: ["lingren_jianxiong", "lingren_xingshang"], - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("xinfu_lingren"), "选择一名目标角色并猜测其手牌构成", function (card, player, target) { - return _status.event.targets.includes(target); - }) - .set("ai", function (target) { - return 2 - get.attitude(_status.event.player, target); - }) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - player.logSkill("xinfu_lingren", result.targets); - var target = result.targets[0]; - event.target = target; - event.choice = { - basic: false, - trick: false, - equip: false, - }; - player.chooseButton(["凌人:猜测其有哪些类别的手牌", [["basic", "trick", "equip"], "vcard"]], [0, 3], true).set("ai", function (button) { - switch (button.link[2]) { - case "basic": - var rand = 0.95; - if (!target.countCards("h", { type: ["basic"] })) rand = 0.05; - if (!target.countCards("h")) rand = 0; - return Math.random() < rand ? true : false; - case "trick": - var rand = 0.9; - if (!target.countCards("h", { type: ["trick", "delay"] })) rand = 0.1; - if (!target.countCards("h")) rand = 0; - return Math.random() < rand ? true : false; - case "equip": - var rand = 0.75; - if (!target.countCards("h", { type: ["equip"] })) rand = 0.25; - if (!target.countCards("h")) rand = 0; - return Math.random() < rand ? true : false; - } - }); - } else { - player.storage.counttrigger.xinfu_lingren--; - event.finish(); - } - "step 2"; - if (result.bool) { - var choices = result.links.map(i => i[2]); - if (!event.isMine() && !event.isOnline()) game.delayx(); - var list = []; - event.num = 0; - ["basic", "trick", "equip"].forEach(type => { - if (choices.includes(type) == target.hasCard({ type: type }, "h")) event.num++; - }); - } - "step 3"; - player.popup("猜对" + get.cnNumber(event.num) + "项"); - game.log(player, "猜对了" + get.cnNumber(event.num) + "项"); - if (event.num > 0) { - target.addTempSkill("lingren_adddamage"); - target.storage.lingren = { - card: trigger.card, - //player:event.targett, - }; - } - if (event.num > 1) player.draw(2); - if (event.num > 2) { - player.addTempSkills(["lingren_jianxiong", "lingren_xingshang"], { - player: "phaseBegin", - }); - } - }, - ai: { - threaten: 2.4, - }, - }, - lingren_adddamage: { - onremove: function (player) { - delete player.storage.lingren; - }, - trigger: { - player: "damageBegin3", - }, - filter: function (event, player) { - var info = player.storage.lingren; - return event.card && event.card == info.card; - }, - silent: true, - popup: false, - forced: true, - charlotte: true, - content: function () { - trigger.num++; - }, - }, - lingren_jianxiong: { - audio: 1, - trigger: { - player: "damageEnd", - }, - content: function () { - "step 0"; - if (get.itemtype(trigger.cards) == "cards" && get.position(trigger.cards[0], true) == "o") { - player.gain(trigger.cards, "gain2"); - } - player.draw("nodelay"); - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; - if (get.tag(card, "damage") && player != target) return [1, 0.6]; - }, - }, - }, - }, - lingren_xingshang: { - audio: 1, - inherit: "rexingshang", - }, - xinfu_fujian: { - audio: 2, - trigger: { - player: "phaseJieshuBegin", - }, - filter: function (event, player) { - return !game.hasPlayer(function (current) { - return current.countCards("h") == 0; - }); - }, - forced: true, - content: function () { - event.num = 0; - var list = game.filterPlayer(function (target) { - if (target.isMinHandcard()) event.num = target.countCards("h"); - return player != target; - }); - if (event.num < 1) { - event.finish(); - } else { - var target = list.randomGet(); - var cards = target.getCards("h").randomGets(event.num); - player.line(target); - var content = [get.translation(target) + "的部分手牌", cards]; - game.log(player, "观看了", target, "的部分手牌"); - player.chooseControl("ok").set("dialog", content); - } - }, - }, - fujian: { - audio: "xinfu_fujian", - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - filter(event, player) { - return game.hasPlayer(target => target != player && target.countCards("h") && !target.isMaxHandcard()); - }, - forced: true, - async content(event, trigger, player) { - const target = game - .filterPlayer(target => { - return target != player && target.countCards("h") && !target.isMaxHandcard(); - }) - .randomGet(); - player.line(target); - game.log(player, "观看了", target, "的手牌"); - player.viewHandcards(target); - }, - }, - xinfu_xionghuo: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.countMark("xinfu_xionghuo") > 0; - }, - filterTarget: function (card, player, target) { - return player != target && !target.hasMark("xinfu_xionghuo"); - }, - content: function () { - player.removeMark("xinfu_xionghuo", 1); - target.addMark("xinfu_xionghuo", 1); - }, - ai: { - order: 11, - result: { - target: function (player, target) { - if ( - (player.countMark("xinfu_xionghuo") >= 2 || - !game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) < 0 && current.hasMark("xinfu_xionghuo"); - })) && - player.countCards("h", function (card) { - return ( - get.tag(card, "damage") && - player.canUse(card, target, null, true) && - player.getUseValue(card) > 0 && - get.effect_use(target, card, player) > 0 && - target.hasSkillTag("filterDamage", null, { - player: player, - card: card, - }) - ); - }) - ) - return 3 / Math.max(1, target.hp); - if ( - (!player.hasUnknown() && - game.countPlayer(function (current) { - return get.attitude(player, current) < 0; - }) <= 1) || - player.countMark("xinfu_xionghuo") >= 2 - ) { - return -1; - } - return 0; - }, - }, - effect: { - player: function (card, player, target) { - if ( - player != target && - get.tag(card, "damage") && - target && - target.hasMark("xinfu_xionghuo") && - !target.hasSkillTag("filterDamage", null, { - player: player, - card: card, - }) - ) - return [1, 0, 1, -2]; - }, - }, - threaten: 1.6, - }, - marktext: "戾", - intro: { - name: "暴戾", - content: "mark", - }, - group: ["xinfu_xionghuo_init", "xinfu_xionghuo_damage", "xinfu_xionghuo_effect"], - subSkill: { - init: { - audio: "xinfu_xionghuo", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter: function (event, player) { - if (player.countMark("xinfu_xionghuo") >= 3) return false; - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - locked: false, - content: function () { - player.addMark("xinfu_xionghuo", 3 - player.countMark("xinfu_xionghuo")); - }, - }, - damage: { - audio: "xinfu_xionghuo", - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - return event.player.countMark("xinfu_xionghuo") > 0 && event.player != player; - }, - forced: true, - locked: false, - logTarget: "player", - content: function () { - trigger.num++; - }, - }, - effect: { - audio: "xinfu_xionghuo", - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - return event.player.countMark("xinfu_xionghuo") > 0 && event.player != player; - }, - line: false, - forced: true, - locked: false, - logTarget: "player", - content: function () { - "step 0"; - trigger.player.removeMark("xinfu_xionghuo", trigger.player.countMark("xinfu_xionghuo")); - "step 1"; - var num = get.rand(0, 2); - switch (num) { - case 0: { - player.line(trigger.player, "fire"); - trigger.player.damage("fire"); - trigger.player.addTempSkill("xinfu_xionghuo_disable"); - trigger.player.markAuto("xinfu_xionghuo_disable", [player]); - break; - } - case 1: { - player.line(trigger.player, "water"); - trigger.player.loseHp(); - trigger.player.addMark("xinfu_xionghuo_low", 1, false); - trigger.player.addTempSkill("xinfu_xionghuo_low"); - break; - } - case 2: { - player.line(trigger.player, "green"); - /* - var card1=trigger.player.getCards('h').randomGet(); - var card2=trigger.player.getCards('e').randomGet(); - var list=[]; - if(card1) list.push(card1); - if(card2) list.push(card2); - if(list.length) player.gain(list,trigger.player,'giveAuto','bySelf'); - */ - const cards = trigger.player.getGainableCards(player, "he"); - if (cards.length) player.gain(cards.randomGets(2), trigger.player, "giveAuto", "bySelf"); - break; - } - } - "step 2"; - game.delay(); - }, - }, - disable: { - mod: { - playerEnabled: function (card, player, target) { - if (card.name == "sha" && player.getStorage("xinfu_xionghuo_disable").includes(target)) return false; - }, - }, - charlotte: true, - onremove: true, - mark: true, - marktext: "禁", - intro: { content: "不能对$使用【杀】" }, - }, - low: { - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("xinfu_xionghuo_low"); - }, - }, - charlotte: true, - onremove: true, - mark: true, - marktext: "减", - intro: { content: "手牌上限-#" }, - }, - }, - }, - xinfu_shajue: { - audio: 2, - trigger: { global: "dying" }, - filter: function (event, player) { - if (event.player == player) return false; - const bool1 = !player.hasSkill("xinfu_xionghuo") || player.countMark("xinfu_xionghuo") < 3; - const bool2 = event.player.hp < 0 && get.itemtype(event.parent.cards) == "cards" && event.parent.cards.some(card => get.position(card, true) == "o"); - return bool1 || bool2; - }, - forced: true, - content: function () { - if (!player.hasSkill("xinfu_xionghuo") || player.countMark("xinfu_xionghuo") < 3) player.addMark("xinfu_xionghuo", 1); - if (trigger.player.hp < 0 && get.itemtype(trigger.parent.cards) == "cards" && trigger.parent.cards.some(card => get.position(card, true) == "o")) { - player.gain( - trigger.parent.cards.filter(card => get.position(card, true) == "o"), - "gain2" - ); - } - }, - }, - xinfu_jianjie: { audio: 3 }, - jianjie: { - group: ["jianjie_use", "jianjie_die"], - derivation: ["jianjie_huoji", "jianjie_lianhuan", "jianjie_yeyan"], - audio: "xinfu_jianjie", - trigger: { - player: "phaseZhunbeiBegin", - }, - forced: true, - locked: false, - filter: function (event, player) { - return player.phaseNumber <= 1 && game.hasPlayer(current => current != player); - }, - content: function () { - "step 0"; - player.chooseTarget("荐杰:选择一名其他角色获得“龙印”", lib.filter.notMe, true).set("ai", target => { - return get.attitude(get.player(), target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - lib.skill.jianjie.addMark("huoji", player, target); - event.target = target; - game.delayx(); - } else event.finish(); - "step 2"; - if ( - game.hasPlayer(current => { - return current != player && current != target; - }) - ) { - player - .chooseTarget( - "荐杰:选择一名其他角色获得“凤印”", - function (card, player, target) { - return target != player && target != _status.event.getParent().target; - }, - true - ) - .set("ai", target => { - return get.attitude(get.player(), target); - }); - } else event.finish(); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "thunder"); - lib.skill.jianjie.addMark("lianhuan", player, target); - game.delayx(); - } - }, - ai: { - threaten: 3, - }, - hasMark: (mark, player, target) => { - if (!target) return player.getStorage("jianjie_" + mark).length > 0; - return target.getStorage("jianjie_" + mark).includes(player); - }, - addMark: (mark, player, target) => { - mark = "jianjie_" + mark; - target.addAdditionalSkill(`${mark}_${player.playerid}`, mark); - target.markAuto(mark, [player]); - game.log(player, "令", target, "获得了", `#g“${mark == "jianjie_huoji" ? "龙印" : "凤印"}”`); - }, - removeMark: (mark, player, target, log) => { - if (lib.skill.jianjie.hasMark(mark, player, target, log)) { - mark = "jianjie_" + mark; - target.removeAdditionalSkill(`${mark}_${player.playerid}`); - target.unmarkAuto(mark, [player]); - if (log) game.log(target, "移去了", player, "给予的", `#g“${mark == "jianjie_huoji" ? "龙印" : "凤印"}”`); - else game.log(player, "移去了", target, "的", `#g“${mark == "jianjie_huoji" ? "龙印" : "凤印"}”`); - } - }, - subSkill: { - use: { - audio: "xinfu_jianjie", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - if (player.phaseNumber <= 1) return false; - const skill = lib.skill.jianjie; - return game.hasPlayer(function (current) { - return skill.hasMark("huoji", player, current) || skill.hasMark("lianhuan", player, current); - }); - }, - filterTarget: function (card, player, target) { - if (ui.selected.targets.length == 0) { - const skill = lib.skill.jianjie; - return skill.hasMark("huoji", player, target) || skill.hasMark("lianhuan", player, target); - } - return true; - }, - selectTarget: 2, - complexSelect: true, - complexTarget: true, - multitarget: true, - prompt: "移动场上的“龙印”或“凤印”", - targetprompt: ["失去印", "获得印"], - content: function () { - "step 0"; - var skill = lib.skill.jianjie; - var bool1 = skill.hasMark("huoji", player, targets[0]), - bool2 = skill.hasMark("lianhuan", player, targets[0]); - if (bool1 && bool2) { - player.chooseControl("龙印", "凤印").set("prompt", "选择要移动的“印”"); - } else { - event._result = { control: bool1 ? "龙印" : "凤印" }; - } - "step 1"; - var skill = lib.skill.jianjie, - mark = result.control == "龙印" ? "huoji" : "lianhuan"; - skill.removeMark(mark, player, targets[0]); - skill.addMark(mark, player, targets[1]); - game.delayx(); - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if (ui.selected.targets.length == 0) { - return get.attitude(player, target) < 0 ? -999 : -3; - } else { - return target.countCards("h") + 1; - } - }, - }, - expose: 0.4, - }, - }, - die: { - audio: "xinfu_jianjie", - trigger: { global: "die" }, - filter: function (event, player) { - const skill = lib.skill.jianjie; - return skill.hasMark("huoji", player, event.player) || skill.hasMark("lianhuan", player, event.player); - }, - forced: true, - logTarget: "player", - content: function () { - "step 0"; - if (lib.skill.jianjie.hasMark("huoji", player, trigger.player)) { - player.chooseTarget("荐杰:选择一名角色获得“龙印”", true).set("ai", target => { - return get.attitude(get.player(), target); - }); - } else event.goto(2); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "fire"); - lib.skill.jianjie.addMark("huoji", player, target); - event.target = target; - game.delayx(); - } else event.finish(); - "step 2"; - if (lib.skill.jianjie.hasMark("lianhuan", player, trigger.player)) { - player.chooseTarget("荐杰:选择一名角色获得“凤印”", true).set("ai", target => { - return get.attitude(get.player(), target); - }); - } else event.finish(); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "thunder"); - lib.skill.jianjie.addMark("lianhuan", player, target); - game.delayx(); - } - }, - }, - huoji: { - marktext: "龙", - intro: { - name: "龙印", - content: "
  • 出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。
  • 若你同时拥有“凤印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", - }, - inherit: "rehuoji", - usable: 3, - charlotte: true, - viewAsFilter: function (player) { - const storage = player.getStorage("jianjie_huoji"); - if ( - !storage.some(source => { - return source.isIn() && source.hasSkill("jianjie"); - }) - ) - return false; - return player.hasCard(card => get.color(card) == "red", "she"); - }, - group: ["jianjie_yeyan", "jianjie_huoji_effect"], - }, - huoji_effect: { - trigger: { player: "huogongBegin" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return event.skill == "jianjie_huoji"; - }, - content: function () { - trigger.setContent(lib.skill.olhuoji.huogongContent); - }, - }, - lianhuan: { - marktext: "凤", - intro: { - name: "凤印", - content: "
  • 出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。
  • 若你同时拥有“龙印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", - }, - charlotte: true, - usable: 3, - filter: function (event, player) { - const storage = player.getStorage("jianjie_lianhuan"); - if ( - !storage.some(source => { - return source.isIn() && source.hasSkill("jianjie"); - }) - ) - return false; - if (!player.hasCard(card => get.suit(card) == "club", "she")) return false; - return event.type == "phase" || event.filterCard({ name: "tiesuo" }, player, event); - }, - inherit: "ollianhuan", - group: ["jianjie_yeyan", "jianjie_lianhuan_effect"], - }, - lianhuan_effect: { - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (event.skill != "jianjie_lianhuan") return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(current => { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); - }) - ) - return true; - } - return false; - }, - charlotte: true, - forced: true, - popup: false, - content: function () { - "step 0"; - player - .chooseTarget("是否为" + get.translation(trigger.card) + "额外指定一个目标?", (card, player, target) => { - return !_status.event.sourcex.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); - }) - .set("sourcex", trigger.targets) - .set("ai", function (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.delayex(); - } else event.finish(); - "step 2"; - if (result.bool) { - var targets = result.targets; - player.line(targets, "thunder"); - trigger.targets.addArray(targets); - game.log(targets, "也成为了", trigger.card, "的目标"); - } - }, - }, - yeyan: { - inherit: "yeyan", - filter: function (event, player) { - const huoji = player.getStorage("jianjie_huoji"), - lianhuan = player.getStorage("jianjie_lianhuan"); - return ( - huoji.length > 0 && - lianhuan.some(source => { - return huoji.includes(source) && source.isIn() && source.hasSkill("jianjie"); - }) - ); - }, - contentBefore: function () { - player.awakenSkill("jianjie_yeyan"); - var skill = lib.skill.jianjie; - var huoji = player.getStorage("jianjie_huoji").slice(0), - lianhuan = player.getStorage("jianjie_lianhuan").slice(0); - huoji.forEach(source => { - skill.removeMark("huoji", source, player, true); - }); - lianhuan.forEach(source => { - skill.removeMark("lianhuan", source, player, true); - }); - }, - }, - }, - }, - xinfu_yinshi: { - audio: 2, - trigger: { player: "damageBegin4" }, - forced: true, - filter: function (event, player) { - const skill = lib.skill.jianjie; - if (skill.hasMark("huoji", player) || skill.hasMark("lianhuan", player)) return false; - if (!player.hasEmptySlot(2)) return false; - if (event.hasNature()) return true; - return get.type(event.card, "trick") == "trick"; - }, - content: function () { - trigger.cancel(); - }, - ai: { - notrick: true, - nofire: true, - nothunder: true, - effect: { - target: function (card, player, target, current) { - const skill = lib.skill.jianjie; - if (skill.hasMark("huoji", target) || skill.hasMark("lianhuan", target)) return false; - if (player == target && get.subtype(card) == "equip2") { - if (get.equipValue(card) <= 8) return 0; - } - if (!target.hasEmptySlot(2)) return; - if (get.tag(card, "natureDamage")) return "zerotarget"; - if (get.type(card) == "trick" && get.tag(card, "damage")) { - return "zeroplayertarget"; - } - }, - }, - }, - }, - xinfu_chenghao: { - audio: 2, - trigger: { - global: "damageEnd", - }, - filter: function (event, player) { - return event.lianhuanable == true && event.player.isIn(); - }, - frequent: true, - content: function () { - "step 0"; - event.cards = game.cardsGotoOrdering( - get.cards( - game.countPlayer(function (current) { - return current.isLinked(); - }) + 1 - ) - ).cards; - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - "step 1"; - if (event.cards.length > 1) { - player.chooseCardButton("称好:请选择要分配的牌", true, event.cards, [1, event.cards.length]).set("ai", function (button) { - if (ui.selected.buttons.length == 0) return 1; - return 0; - }); - } else if (event.cards.length == 1) { - event._result = { links: event.cards.slice(0), bool: true }; - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - event.cards.removeArray(result.links); - event.togive = result.links.slice(0); - player - .chooseTarget("选择一名角色获得" + get.translation(result.links), true) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (_status.event.enemy) { - return -att; - } else if (att > 0) { - return att / (1 + target.countCards("h")); - } else { - return att / 100; - } - }) - .set("enemy", get.value(event.togive[0], player, "raw") < 0); - } - "step 3"; - if (result.targets.length) { - var id = result.targets[0].playerid, - map = event.given_map; - if (!map[id]) map[id] = []; - map[id].addArray(event.togive); - } - if (cards.length > 0) event.goto(1); - "step 4"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - var list = []; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - list.push([source, event.given_map[i]]); - } - game.loseAsync({ - gain_list: list, - giver: player, - animate: "draw", - }).setContent("gaincardMultiple"); - }, - }, - xinfu_wuniang: { - trigger: { - player: ["useCard", "respond"], - }, - audio: 2, - direct: true, - filter: function (event, player) { - return event.card.name == "sha"; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("xinfu_wuniang"), "获得一名其他角色的一张牌,然后其和场上所有的“关索”摸一张牌。", function (card, player, target) { - if (player == target) return false; - return target.countGainableCards(player, "he") > 0; - }) - .set("ai", function (target) { - return 10 - get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("xinfu_wuniang", target); - player.line(target, "fire"); - event.draws = game.filterPlayer(function (current) { - if (current == target) return true; - return current.name == "guansuo" || current.name2 == "guansuo"; - }); - player.gainPlayerCard(target, "he", true); - } else event.finish(); - "step 2"; - game.asyncDraw(event.draws, 1); - game.delay(); - }, - }, - xinfu_xushen: { - derivation: ["xinfu_zhennan"], - audio: 2, - subSkill: { - count: { - trigger: { - player: "recoverBegin", - }, - forced: true, - silent: true, - popup: false, - filter: function (event, player) { - if (!event.card || event.card.name != "tao") return false; - if (!event.source || !event.source.hasSex("male")) return false; - if (!player.isDying()) return false; - if ( - game.hasPlayer(function (current) { - return current.name == "guansuo" || current.name2 == "guansuo"; - }) - ) - return false; - return true; - }, - content: function () { - trigger.xinfu_xushen = true; - }, - sub: true, - }, - }, - group: ["xinfu_xushen_count"], - trigger: { - player: "recoverAfter", - }, - limited: true, - init: function (player) { - player.storage.xinfu_xushen = false; - }, - filter: function (event, player) { - if (player.storage.xinfu_xushen) return false; - if (player.isDying()) return false; - return event.xinfu_xushen == true; - }, - direct: true, - skillAnimation: true, - animationColor: "fire", - content: function () { - "step 0"; - trigger.source.chooseBool("【许身】:是否将自己的一张武将牌替换为“关索”?").set("ai", function () { - return false; - }); - "step 1"; - if (result.bool) { - player.awakenSkill("xinfu_xushen"); - player.logSkill("xinfu_xushen", trigger.source); - if (trigger.source.name2 != undefined) { - trigger.source.chooseControl(trigger.source.name1, trigger.source.name2).set("prompt", "请选择要更换的武将牌"); - } else event._result = { control: trigger.source.name1 }; - } else event.finish(); - "step 2"; - trigger.source.reinitCharacter(result.control, "guansuo"); - player.recover(); - player.addSkills("xinfu_zhennan"); - }, - mark: true, - intro: { - content: "limited", - }, - }, - xinfu_falu: { - subSkill: { - spade: { - marktext: "♠︎️", - intro: { - name: "紫薇", - content: "mark", - }, - }, - heart: { - marktext: "♥︎️", - intro: { - name: "玉清", - content: "mark", - }, - }, - club: { - marktext: "♣︎️", - intro: { - name: "后土", - content: "mark", - }, - }, - diamond: { - marktext: "♦︎", - intro: { - name: "勾陈", - content: "mark", - }, - }, - }, - forced: true, - audio: 2, - trigger: { - player: ["loseAfter", "enterGame"], - global: ["loseAsyncAfter", "phaseBefore"], - }, - filter: function (event, player) { - if (event.name.indexOf("lose") != 0) return event.name != "phase" || game.phaseNumber == 0; - if (event.type != "discard" || event.getlx === false) return false; - var evt = event.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (!player.hasMark("xinfu_falu_" + get.suit(evt.cards2[i]))) return true; - } - return false; - }, - content: function () { - if (trigger.name.indexOf("lose") !== 0) { - for (var i = 0; i < lib.suit.length; i++) { - if (!player.hasMark("xinfu_falu_" + lib.suit[i])) player.addMark("xinfu_falu_" + lib.suit[i]); - } - return; - } - var evt = trigger.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - var suit = get.suit(evt.cards2[i]); - if (!player.hasMark("xinfu_falu_" + suit)) player.addMark("xinfu_falu_" + suit); - } - }, - ai: { - threaten: 1.4, - combo: "xinfu_zhenyi", - }, - }, - xinfu_dianhua: { - trigger: { - player: ["phaseZhunbeiBegin", "phaseJieshuBegin"], - }, - frequent: true, - audio: 2, - filter: function (event, player) { - for (var i = 0; i < lib.suit.length; i++) { - if (player.hasMark("xinfu_falu_" + lib.suit[i])) return true; - } - return false; - }, - content: function () { - "step 0"; - var num = 0; - for (var i = 0; i < lib.suit.length; i++) { - if (player.hasMark("xinfu_falu_" + lib.suit[i])) num++; - } - 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 target = _status.event.getTrigger().name == "phaseZhunbei" ? player : player.next; - var att = get.sgn(get.attitude(player, target)); - var top = []; - var judges = target.getCards("j"); - var stopped = false; - if (player != target || !target.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)) * att; - }); - if (judge(cards[0]) * att < 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)) * att; - }); - while (cards.length) { - if (get.value(cards[0], player) <= 5 == att > 0) 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: { - combo: "xinfu_falu", - threaten: 2.2, - }, - }, - xinfu_zhenyi: { - group: ["zhenyi_spade", "zhenyi_club", "zhenyi_heart"], - trigger: { - player: "damageEnd", - }, - audio: 2, - filter: function (event, player) { - //if(!event.hasNature()) return false; - return player.hasMark("xinfu_falu_diamond"); - }, - prompt2: "弃置「勾陈♦」标记,从牌堆中获得每种类型的牌各一张。", - content: function () { - "step 0"; - player.removeMark("xinfu_falu_diamond"); - event.num = 0; - event.togain = []; - "step 1"; - var card = get.cardPile(function (card) { - for (var i = 0; i < event.togain.length; i++) { - if (get.type(card, "trick") == get.type(event.togain[i], "trick")) return false; - } - return true; - }); - if (card) { - event.togain.push(card); - event.num++; - if (event.num < 3) event.redo(); - } - "step 2"; - if (event.togain.length) { - player.gain(event.togain, "gain2"); - } - }, - ai: { - combo: "xinfu_falu", - }, - }, - zhenyi_spade: { - trigger: { - global: "judge", - }, - direct: true, - filter: function (event, player) { - return player.hasMark("xinfu_falu_spade"); - }, - content: function () { - "step 0"; - var str = get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + ",是否发动【真仪】,弃置「紫薇♠」标记并修改判定结果?"; - player - .chooseControl("spade", "heart", "diamond", "club", "cancel2") - .set("prompt", str) - .set("ai", function () { - //return '取消'; - var judging = _status.event.judging; - var trigger = _status.event.getTrigger(); - var res1 = trigger.judge(judging); - var list = lib.suit.slice(0); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0) return 0; - var getj = function (suit) { - return trigger.judge({ - name: get.name(judging), - nature: get.nature(judging), - suit: suit, - number: 5, - }); - }; - list.sort(function (a, b) { - return (getj(b) - getj(a)) * get.sgn(attitude); - }); - if ((getj(list[0]) - res1) * attitude > 0) return list[0]; - return "cancel2"; - }) - .set("judging", trigger.player.judging[0]); - "step 1"; - if (result.control != "cancel2") { - player.addExpose(0.25); - player.removeMark("xinfu_falu_spade"); - player.logSkill("xinfu_zhenyi", trigger.player); - //player.line(trigger.player); - player.popup(result.control); - game.log(player, "将判定结果改为了", "#y" + get.translation(result.control + 2) + 5); - trigger.fixedResult = { - suit: result.control, - color: get.color({ suit: result.control }), - number: 5, - }; - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - expose: 0.5, - }, - }, - zhenyi_club: { - audio: "xinfu_zhenyi", - enable: "chooseToUse", - viewAsFilter: function (player) { - if (player == _status.currentPhase) return false; - return player.hasMark("xinfu_falu_club") && player.countCards("hs") > 0; - }, - filterCard: true, - position: "hs", - viewAs: { - name: "tao", - }, - prompt: "弃置「后土♣」标记,将一张手牌当桃使用", - check: function (card) { - return 15 - get.value(card); - }, - precontent: function () { - player.removeMark("xinfu_falu_club"); - }, - }, - zhenyi_heart: { - trigger: { - source: "damageBegin1", - }, - audio: "xinfu_zhenyi", - filter: function (event, player) { - return player.hasMark("xinfu_falu_heart"); - }, - check: function (event, player) { - if (get.attitude(player, event.player) >= 0) return false; - if ( - event.player.hasSkillTag("filterDamage", null, { - player: player, - card: event.card, - }) - ) - return false; - return true; - //return player.hasMark('xinfu_falu_spade')||get.color(ui.cardPile.firstChild)=='black'; - }, - prompt2: function (event) { - return "弃置「玉清♥」标记,令对" + get.translation(event.player) + "即将造成的伤害+1。"; - }, - logTarget: "player", - content: function () { - player.removeMark("xinfu_falu_heart"); - trigger.num++; - }, - }, - xinfu_zhennan: { - audio: 2, - trigger: { - target: "useCardToTargeted", - }, - filter: function (event, player) { - return event.card.name == "nanman"; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("xinfu_zhennan"), "对一名其他角色造成1-3点随机伤害", function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool && result.targets && result.targets.length) { - game.delay(); - player.logSkill("xinfu_zhennan", result.targets); - var num = [1, 2, 3, 1, 1, 2].randomGet(); - if (get.isLuckyStar(player)) num = 3; - //player.line(result.targets[0],'fire'); - result.targets[0].damage(num); - } - }, - ai: { - expose: 0.25, - }, - }, - }, - dynamicTranslate: { - shanduan: function (player) { - if (player.storage.shanduan) return "锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[" + get.translation(player.storage.shanduan) + "]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。"; - return "锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[1,2,3,4]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。"; - }, - kunfen: function (player) { - if (player.storage.kunfen) return "结束阶段开始时,你可以失去1点体力,然后摸两张牌。"; - return "锁定技,结束阶段开始时,你失去1点体力,然后摸两张牌。"; - }, - jieyuan: function (player) { - var str = "当你对一名其他角色造成伤害时,"; - if (!player.hasSkill("fenxin_fan")) str += "若其体力值大于或等于你的体力值,"; - str += "你可弃置一张"; - if (!player.hasSkill("fenxin_nei")) str += "黑色手"; - str += "牌,令此伤害+1;当你受到一名其他角色造成的伤害时,"; - if (!player.hasSkill("fenxin_zhong")) str += "若其体力值大于或等于你的体力值,"; - str += "你可弃置一张"; - if (!player.hasSkill("fenxin_nei")) str += "红色手"; - str += "牌,令此伤害-1。"; - return str; - }, - youlong: function (player) { - if (player.storage.youlong) return '转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。'; - return '转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。'; - }, - luochong: function (player) { - var storage = player.getStorage("luochong"); - var str = "准备阶段开始时/当你于一回合首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):"; - var choiceList = ["⒈令一名角色回复1点体力。", "⒉令一名角色失去1点体力。", "⒊令一名角色弃置两张牌。", "⒋令一名角色摸两张牌。"]; - for (var i = 0; i < 4; i++) { - if (storage.includes(i)) { - choiceList[i] = '' + choiceList[i] + ""; - } - str += choiceList[i]; - } - return str; - }, - spmanwang: function (player) { - var num = 4 - player.countMark("spmanwang"); - var str = "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前等量项:"; - var list = ["⒈获得〖叛侵〗。", "⒉摸一张牌。", "⒊回复1点体力。", "⒋摸两张牌并失去〖叛侵〗。"]; - for (var i = 0; i < 4; i++) { - if (i == num) { - str += ''; - } - str += list[i]; - } - if (num < 4) str += ""; - return str; - }, - olbixin: function (player) { - var count = player.countMark("olbixin"); - if (count < 3) return lib.translate.olbixin_info.slice(count * 5); - return "你可以声明一种牌的类型(每种类型限[3]次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸[1]张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。"; - }, - olfeibai: function (player) { - if (player.storage.olfeibai) return '转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。'; - return '转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。'; - }, - olmiuyan: function (player) { - if (player.storage.olmiuyan) return '转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。'; - return '转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。'; - }, - olsaogu: function (player) { - if (player.storage.olsaogu) return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。'; - return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。'; - }, - oldongdao: function (player) { - if (player.storage.oldongdao) return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。'; - return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。'; - }, - ollangdao: function (player) { - var str = "当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:"; - var list = ["1.令此【杀】伤害基数+1;", "2.令你可以为此【杀】多选择一个目标;", "3.令此【杀】不可被响应。"]; - var storage = player.getStorage("ollangdao"); - list.forEach((item, index) => { - if (storage.includes(index)) { - str += `${item}`; - } else str += item; - }); - str += "然后若没有角色因此【杀】死亡,你移除本次被选择的项。"; - return str; - }, - olxuanzhu(player) { - if (player.storage.olxuanzhu) return '转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; - return '转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; - }, - }, - characterReplace: { - guanyinping: ["guanyinping", "old_guanyinping"], - shixie: ["shixie", "dc_shixie", "old_shixie"], - caoshuang: ["caoshuang", "dc_caoshuang", "ns_caoshuang"], - caoang: ["caoang", "yj_caoang", "tw_caoang"], - caohong: ["caohong", "tw_re_caohong", "tw_caohong", "yj_caohong"], - xiahouba: ["xiahouba", "dc_xiahouba", "tw_xiahouba"], - maliang: ["maliang", "re_maliang", "tw_maliang", "ol_maliang", "old_maliang"], - dingfeng: ["dingfeng", "tw_dingfeng", "old_dingfeng"], - zumao: ["zumao", "tw_zumao"], - tw_beimihu: ["beimihu", "tw_beimihu"], - panfeng: ["panfeng", "re_panfeng", "std_panfeng"], - sunluyu: ["sunluyu", "re_sunluyu", "mb_sunluyu"], - jin_simazhao: ["jin_simazhao", "simazhao", "sp_simazhao"], - jin_wangyuanji: ["jin_wangyuanji", "wangyuanji", "sp_wangyuanji"], - wangyun: ["clan_wangyun", "wangyun", "dc_wangyun", "re_wangyun", "jsrg_wangyun", "old_wangyun", "pe_wangyun"], - zhangliang: ["xin_zhangliang", "re_zhangliang", "zhangliang"], - lingju: ["lingju", "old_lingju"], - guansuo: ["guansuo", "dc_guansuo"], - zhangxingcai: ["zhangxingcai", "old_zhangxingcai"], - lisu: ["ol_lisu", "lisu"], - fuwan: ["fuwan", "tw_fuwan", "sp_fuwan"], - huaxin: ["ol_huaxin", "huaxin", "sp_huaxin"], - xujing: ["xujing", "dc_xujing", "sp_xujing", "tw_xujing"], - zhaoxiang: ["zhaoxiang", "dc_zhaoxiang", "tw_zhaoxiang"], - dengzhi: ["ol_dengzhi", "re_dengzhi", "dengzhi", "tw_dengzhi"], - wangrong: ["ol_wangrong", "wangrong"], - zongyu: ["zongyu", "sp_zongyu", "tw_zongyu"], - ol_dongzhao: ["ol_dongzhao", "dc_dongzhao", "tw_dongzhao"], - mayunlu: ["mayunlu", "tw_mayunlu"], - zhuling: ["ol_zhuling", "dc_zhuling", "zhuling"], - zangba: ["zangba", "tw_zangba"], - zhangbao: ["zhangbao", "re_zhangbao"], - jianggan: ["jianggan", "sp_jianggan"], - dc_jiben: ["dc_jiben", "sp_jiben"], - yangyi: ["ol_yangyi", "yangyi", "tw_yangyi"], - tianyu: ["tianyu", "tw_tianyu"], - huangchengyan: ["huangchengyan", "dc_huangchengyan"], - puyuan: ["ol_puyuan", "puyuan"], - huangzu: ["huangzu", "dc_huangzu"], - huojun: ["huojun", "dc_huojun", "xin_huojun", "tw_huojun"], - zhaoyǎn: ["zhaoyǎn", "dc_zhaoyǎn"], - furong: ["ol_furong", "furong", "tw_furong"], - daxiaoqiao: ["daxiaoqiao", "dc_daxiaoqiao", "tw_daxiaoqiao"], - zhugeguo: ["zhugeguo", "tw_zhugeguo"], - wanglang: ["ol_wanglang", "wanglang", "old_wanglang"], - tengfanglan: ["tengfanglan", "dc_tengfanglan"], - zhangyì: ["ol_zhangyì", "zhangyì"], - yuantanyuanshang: ["yuantanyuanshang", "yuantanyuanxiyuanshang"], - ruiji: ["ruiji", "dc_ruiji"], - jsp_huangyueying: ["jsp_huangyueying", "re_jsp_huangyueying"], - ganfuren: ["ganfuren", "dc_ganfuren", "jsp_ganfuren"], - zhouqun: ["ol_zhouqun", "zhouqun"], - qianzhao: ["ol_qianzhao", "qianzhao"], - ol_pengyang: ["ol_pengyang", "sp_pengyang"], - ol_luyusheng: ["ol_luyusheng", "luyusheng"], - fanjiangzhangda: ["fanjiangzhangda", "jsrg_fanjiangzhangda"], - simalang: ["re_simalang", "simalang"], - zhugedan: ["re_zhugedan", "zhugedan"], - zhangren: ["jsrg_zhangren", "zhangren"], - wenqin: ["ol_wenqin", "pe_wenqin"], - lukai: ["ol_lukai", "lukai"], - liupi: ["ol_liupi", "liupi"], - }, - translate: { - xinfu_lingren: "凌人", - xinfu_lingren_info: "每回合限一次。当你使用带有「伤害」标签的基本牌或普通锦囊牌指定目标后,你可以猜测其中的一个目标的手牌中是否有基本牌,锦囊牌或装备牌。若你猜中的项目数:≥1,此牌对该角色的伤害+1;≥2,你摸两张牌;≥3,你获得技能〖奸雄〗和〖行殇〗直到你的下回合开始。", - lingren_adddamage: "凌人", - lingren_adddamage_info: "", - lingren_jianxiong: "奸雄", - lingren_jianxiong_info: "当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。", - lingren_xingshang: "行殇", - lingren_xingshang_info: "当有角色死亡后,你可以选择一项:1.回复1点体力。2.获得该角色的所有牌。", - xinfu_fujian: "伏间", - xinfu_fujian_info: "锁定技,结束阶段,你观看一名随机的其他角色的随机X张手牌。(X为场上手牌最少的角色的手牌数)", - fujian: "伏间", - fujian_info: "锁定技,准备阶段和结束阶段,你随机观看一名手牌数不为全场最多的其他角色的手牌。", - xinfu_xionghuo: "凶镬", - xinfu_xionghuo_info: "游戏开始时,你获得3个“暴戾”标记(标记上限为3)。出牌阶段,你可以交给一名其他角色一个“暴戾”标记。当你对有“暴戾”标记的其他角色造成伤害时,此伤害+1。有“暴戾”标记的其他角色的出牌阶段开始时,其移去所有“暴戾”标记并随机执行一项:1.受到1点火焰伤害且本回合不能对你使用【杀】;2.失去1点体力且本回合手牌上限-1;3.你随机获得其两张牌。", - xinfu_shajue: "杀绝", - xinfu_shajue_info: "锁定技,其他角色进入濒死状态时,你获得一个“暴戾”标记。然后若其体力值小于0,你获得使其进入濒死状态的牌。", - xinfu_jianjie: "荐杰", - jianjie: "荐杰", - jianjie_info: "①你的第一个准备阶段开始时,你令一名其他角色获得“龙印”,然后令另一名其他角色获得“凤印”。②出牌阶段限一次。若当前回合不是你的第一个回合,则你可以移动场上的“龙印”或“凤印”。③拥有“龙印”或“凤印”的其他角色死亡时,你转移该角色的“龙印”和“凤印”。④拥有“龙印”/“凤印”的角色视为拥有〖火计〗/〖连环〗,且同时拥有这两种标记的角色视为拥有〖业炎〗。", - jianjie_huoji: "火计", - jianjie_huoji_effect: "火计", - jianjie_huoji_info: "出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。", - jianjie_lianhuan: "连环", - jianjie_lianhuan_effect: "连环", - jianjie_lianhuan_info: "出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。", - jianjie_yeyan: "业炎", - jianjie_yeyan_info: "限定技。出牌阶段,你可以移去你所有的“龙印”和“凤印”,对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。", - xinfu_yinshi: "隐士", - xinfu_yinshi_info: "锁定技,若你没有“龙印”和“凤印”且防具栏为空,则当你受到属性伤害或锦囊牌造成的伤害时,防止此伤害。", - xinfu_chenghao: "称好", - xinfu_chenghao_info: "当一名角色受到属性伤害后,若其存活且其武将牌横置且是伤害传导的起点,则你可以观看牌堆顶的X张牌并分配给任意角色。(X为横置的角色数量且包含该角色)", - jianjie_faq: "关于龙凤印", - jianjie_faq_info: "龙印效果:视为拥有〖火计〗。凤印效果:视为拥有〖连环〗。(均一回合限使用三次) 龙凤印齐全:视为拥有〖业炎〗,〖业炎〗发动后移除龙凤印。", - xinfu_wuniang: "武娘", - xinfu_wuniang_info: "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌。若如此做,该角色和场上所有的“关索”各摸一张牌。", - xinfu_xushen: "许身", - xinfu_xushen_info: "限定技,当一名男性角色使用【桃】令你脱离濒死状态时,若场上没有“关索”,则其可以将自己的一张武将牌变更为“关索”。然后你回复1点体力,并获得技能〖镇南〗。", - xinfu_zhennan: "镇南", - xinfu_zhennan_info: "当你成为【南蛮入侵】的目标时,你可以对一名其他角色造成1-3点随机伤害。", - xinfu_falu: "法箓", - xinfu_falu_info: "锁定技,游戏开始时,你获得「紫薇」「后土」「玉清」「勾陈」标记各一个。当你的牌因弃置而进入弃牌堆后,根据这些牌的花色,你获得对应的标记:黑桃,你获得1枚「紫薇」;梅花,你获得1枚「后土」;红桃,你获得1枚「玉清」;方块,你获得1枚「勾陈」。(每种标记限拥有1个)", - xinfu_dianhua: "点化", - xinfu_dianhua_info: "准备阶段或结束阶段,你可以观看牌堆顶的X张牌(X为你的「紫薇」「后土」「玉清」「勾陈」标记数的总和)。若如此做,你将这些牌以任意顺序放回牌堆顶或牌堆底。", - xinfu_zhenyi: "真仪", - xinfu_zhenyi_info: "你可以在以下时机弃置相应的标记来发动以下效果:一名角色的判定牌生效前,你可以弃置一枚「紫薇」,然后将判定结果改为任意花色且点数为5;你的回合外,你可以弃置一枚「后土」,然后将你的一张手牌当【桃】使用;当你造成伤害时,你可以弃置一枚「玉清」,然后令此伤害+1;当你受到伤害后,你可以弃置一张「勾陈」,然后你从牌堆中随机获得三种类型的牌各一张。", - zhenyi_spade: "真仪", - zhenyi_spade_info: "", - zhenyi_club: "真仪", - zhenyi_club_info: "", - zhenyi_heart: "真仪", - zhenyi_heart_info: "", - zhangren: "张任", - zoushi: "邹氏", - zangba: "臧霸", - gz_jiling: "纪灵", - gz_sp_dongzhuo: "董卓", - gz_zhangjiao: "张角", - litong: "李通", - mizhu: "糜竺", - buzhi: "步骘", - chenlin: "陈琳", - yuanshu: "SP袁术", - yuanshu_prefix: "SP", - gongsunzan: "公孙瓒", - sp_diaochan: "SP貂蝉", - sp_diaochan_prefix: "SP", - yangxiu: "杨修", - sp_zhaoyun: "SP赵云", - sp_zhaoyun_prefix: "SP", - caohong: "曹洪", - liuxie: "刘协", - xiahouba: "夏侯霸", - zhugejin: "诸葛瑾", - zhugeke: "诸葛恪", - guanyinping: "关银屏", - sunhao: "孙皓", - chengyu: "程昱", - simalang: "司马朗", - gz_tianfeng: "田丰", - sp_jiaxu: "SP贾诩", - sp_jiaxu_prefix: "SP", - maliang: "马良", - sp_caoren: "SP曹仁", - sp_caoren_prefix: "SP", - yuejin: "乐进", - mifuren: "糜夫人", - sp_dongzhuo: "SP董卓", - sp_dongzhuo_prefix: "SP", - gz_jiangfei: "蒋琬费祎", - gz_jiangqing: "蒋钦", - hetaihou: "何太后", - dingfeng: "丁奉", - zhangxingcai: "张星彩", - caoang: "曹昂", - gz_kongrong: "孔融", - fuwan: "伏完", - sp_pangde: "SP庞德", - sp_pangde_prefix: "SP", - sp_sunshangxiang: "SP孙尚香", - sp_sunshangxiang_prefix: "SP", - zhugedan: "诸葛诞", - sp_machao: "SP马超", - sp_machao_prefix: "SP", - sp_jiangwei: "SP姜维", - sp_jiangwei_prefix: "SP", - zhangbao: "张宝", - yangxiou: "杨修", - shixie: "士燮", - mayunlu: "马云騄", - zhanglu: "张鲁", - wutugu: "兀突骨", - gz_mateng: "马腾", - sp_caiwenji: "SP蔡琰", - sp_caiwenji_prefix: "SP", - zhugeguo: "诸葛果", - lingcao: "凌操", - lingju: "灵雎", - lifeng: "李丰", - jsp_guanyu: "SP关羽", - jsp_guanyu_prefix: "SP", - zhuling: "朱灵", - sunluyu: "OL孙鲁育", - sunluyu_prefix: "OL", - hanba: "旱魃", - gz_panfeng: "潘凤", - zumao: "祖茂", - daxiaoqiao: "大乔小乔", - cuiyan: "崔琰", - wenpin: "文聘", - jsp_huangyueying: "SP黄月英", - jsp_huangyueying_prefix: "SP", - guansuo: "关索", - tadun: "蹋顿", - yanbaihu: "严虎", - wanglang: "王朗", - caochun: "曹纯", - dongbai: "OL董白", - dongbai_prefix: "OL", - zhaoxiang: "赵襄", - heqi: "贺齐", - kanze: "OL阚泽", - kanze_prefix: "OL", - dongyun: "董允", - mazhong: "马忠", - huangfusong: "皇甫嵩", - wangyun: "王允", - sunqian: "孙乾", - xizhicai: "戏志才", - beimihu: "卑弥呼", - luzhi: "鲁芝", - bianfuren: "卞夫人", - ol_bianfuren: "卞夫人", - shamoke: "沙摩柯", - - caoying: "曹婴", - simahui: "司马徽", - baosanniang: "鲍三娘", - majun: "马钧", - simazhao: "司马昭", - wangyuanji: "王元姬", - - jianggan: "蒋干", - hejin: "何进", - hansui: "韩遂", - niujin: "牛金", - xujing: "OL许靖", - xujing_prefix: "OL", - yuantanyuanshang: "袁谭袁尚", - - xinfenyue: "奋钺", - xinfenyue_info: "出牌阶段限X次(X为与你不同阵营的存活角色数),你可以与一名其他角色拼点,若你赢,根据你拼点牌的点数依次执行以下效果:不大于5,你获得其一张牌;不大于9,你获得牌堆里的一张【杀】; 不大于K,视为你对其使用一张雷【杀】。", - neifa: "内伐", - neifa_info: "出牌阶段开始时,你可以摸两张牌或获得场上的一张牌,然后弃置一张牌。若弃置的牌是基本牌,本回合你不能使用锦囊和装备牌,且【杀】的使用次数+X且目标+1;若弃置的不是基本牌,本回合你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标,前两次使用装备牌时摸X张牌(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5)。", - neifa_use: "内伐", - yuxu: "誉虚", - yuxu_info: "当你于出牌阶段内使用的牌结算结束后,若你此前于此阶段发动过〖誉虚〗的次数为:偶数,你可以摸一张牌;奇数,你弃置一张牌。", - yuxu2: "誉虚(弃牌)", - xjshijian: "实荐", - xjshijian_info: "一名其他角色于其回合内使用的第二张牌结算完成后,你可弃置一张牌并令其获得技能〖誉虚〗直到回合结束。", - mouzhu: "谋诛", - mouzhu_info: "出牌阶段限一次,你可以令一名有手牌的其他角色交给你一张手牌。然后若你的手牌数大于其,其选择视为对你使用一张【杀】或【决斗】。", - yanhuo: "延祸", - yanhuo_info: "当你死亡时,你可以依次弃置一名其他角色的X张牌。(X为你的牌数)", - niluan: "逆乱", - niluan_info: "其他角色的结束阶段开始时,若其本回合内使用过【杀】或其体力值大于你,则你可以将一张黑色牌当做【杀】使用。", - cuorui: "挫锐", - cuorui_info: "锁定技,游戏开始时,你摸X张牌(X为你的体力上限)。锁定技,限定技,判定阶段开始前,若你的判定区有牌,你跳过此阶段。", - cuorui_info_single: "锁定技,你的起始手牌数改为X+2(X为你剩余的备选武将数)。你跳过登场后的第一个判定阶段。", - liewei: "裂围", - liewei_info: "当你杀死一名角色后,你可以摸三张牌。", - - weicheng: "伪诚", - weicheng_info: "当牌从你的手牌区移动至其他角色的手牌区后,若你的手牌数小于体力值,你可以摸一张牌。", - daoshu: "盗书", - daoshu_info: "出牌阶段限一次。你可以选择一个花色并获得一名其他角色的一张手牌。若此牌花色与你选择的相同,则你对其造成1点伤害且你〖盗书〗于此阶段内可使用的次数上限+1。否则你须交给其一张与此牌花色不同的手牌(没有则展示手牌)。", - - xinshanjia: "缮甲", - xinshanjia_info: "出牌阶段开始时,你可以摸三张牌,然后弃置3-X张牌(X为你本局游戏内不因使用而失去过的装备牌的数目且至多为3)。若你没有以此法弃置:基本牌,此阶段你使用【杀】的次数上限+1;锦囊牌,此阶段你使用牌无距离限制;基本牌或锦囊牌,你可以视为使用一张【杀】。", - new_meibu: "魅步", - new_meibu_info: "其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得技能〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。", - new_mumu: "穆穆", - new_mumu_info: "出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌;2.获得一名角色装备区里的一张防具牌,若如此做,你本回合不能使用【杀】。", - new_zhixi: "止息", - new_zhixi_info: "锁定技。出牌阶段内,若你使用过锦囊牌或使用过的牌数不小于X,则你不能使用牌(X为你的体力值)。", - new_mumu2: "穆穆", - new_mumu2_info: "锁定技,你不能使用【杀】。", - new_xingwu: "星舞", - new_xingwu_info: "弃牌阶段开始时,你可以将一张牌置于武将牌上,称为“舞”。然后你可以选择一项:①将三张“舞”置入弃牌堆;②弃置两张手牌并将武将牌翻面。若如此做,你选择一名角色,该角色弃置其装备区的所有牌并受到2点伤害(若为女性,则改为1点)。", - new_luoyan: "落雁", - new_luoyan_info: "锁定技。若你的武将牌上有“舞”,则你视为拥有技能〖天香〗和〖流离〗。", - new_luoyan_tianxiang: "天香", - new_luoyan_tianxiang_info: "", - new_luoyan_liuli: "流离", - new_luoyan_liuli_info: "", - ol_shichou: "誓仇", - ol_shichou_info: "当你使用【杀】时,你可以令至多X+1名角色也成为此【杀】的目标(X为你已损失的体力值)。", - dc_olshichou: "誓仇", - dc_olshichou_info: "当你使用【杀】时,你可以令至多X名角色也成为此【杀】的目标。此牌结算结束后,若你未因【杀】造成过伤害,则你获得此【杀】(X为你已损失的体力值)。", - zhenwei_three: "镇卫", - zhenwei_three_info: "锁定技,敌方角色至己方其他角色的距离+1。", - huanshi_three: "缓释", - huanshi_three_info: "一名友方角色的判定牌生效前,你可打出一张牌代替之。", - - yizan: "翊赞", - yizan_info: "你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", - yizan0: "翊赞", - yizan0_info: "你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", - yizan1: "翊赞", - yizan1_info: "你可以将两张牌(其中至少一张是基本牌)当【闪】打出。", - yizan2: "翊赞", - yizan2_info: "你可以将一张基本牌当任意基本牌牌使用。", - yizan3: "翊赞", - yizan3_info: "你可以将一张基本牌当【闪】打出。", - yizan5: "翊赞", - yizan5_info: "你可以将两张牌(其中至少一张是基本牌)当【杀】打出。", - yizan6: "翊赞", - yizan6_info: "你可以将一张基本牌当【杀】打出。", - longyuan: "龙渊", - longyuan_info: "觉醒技 当你使用或打出基本牌时,若你已经已累计发动过3次〖翊赞〗,你将〖翊赞〗改为“你可以将一张基本牌当任意基本牌牌使用或打出”。", - wuniang: "武娘", - wuniang_info: "你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后该角色摸一张牌;若“关索”在场,你可令“关索”也摸一张牌。", - zhennan: "镇南", - zhennan_info: "当你成为【南蛮入侵】的目标时,你可令一名其他角色随机受到1至3点伤害。", - xushen: "许身", - xushen_info: "当其他男性角色令你脱离濒死状态时,若“关索”不在场,其可以选择是否用“关索”替换其武将牌,然后你回复1点体力并获得技能〖镇南〗。", - - wanwei: "挽危", - wanwei_info: "当你因被其他角色获得或弃置而失去牌时,你可以改为自己选择失去的牌。", - gzjili: "蒺藜", - gzjili_info: "当你于一回合内使用或打出第X张牌时,你可以摸X张牌(X为你的攻击范围)。", - - qingzhong: "清忠", - qingzhong_info: "出牌阶段开始时,你可以摸两张牌,若如此做,此阶段结束时,你与手牌数最少的角色交换手牌。", - weijing: "卫境", - weijing_info: "每轮限一次,当你需要使用【杀】或【闪】时,你可以视为使用一张【杀】或【闪】。", - zishu: "自书", - zishu_info: "锁定技。①其他角色的回合结束时,你将手牌区里所有你于此回合得到过的牌置入弃牌堆。②当你于回合内不因〖自书②〗而得到牌后,你摸一张牌。", - yingyuan: "应援", - yingyuan_info: "当你于回合内使用的牌结算完成后,你可以将其交给一名其他角色(相同牌名的牌每回合限一次)。", - xinyingyuan: "应援", - xinyingyuan_info: "当你于回合内使用一张牌后,你可以令一名其他角色从牌堆获得一张与该牌类型相同的牌(每种类型的牌每回合限一次)。", - qianya: "谦雅", - qianya_info: "当你成为锦囊牌的目标后,你可以将任意张手牌交给一名其他角色。", - shuimeng: "说盟", - shuimeng_info: "出牌阶段结束时,你可以与一名角色拼点,若你赢,视为你使用【无中生有】;若你没赢,视为其对你使用【过河拆桥】。", - xianfu: "先辅", - xianfu2: "先辅", - xianfu2_bg: "辅", - xianfu_info: "锁定技,游戏开始时,你选择一名其他角色,当其受到伤害后,你受到等量的伤害,当其回复体力后,你回复等量的体力。", - chouce: "筹策", - chouce_info: "当你受到1点伤害后,你可以判定,若结果为:黑色,你弃置一名角色区域里的一张牌;红色,你选择一名角色,其摸一张牌,若其是〖先辅〗选择的角色,改为其摸两张牌。", - fuqi: "伏骑", - fuqi_info: "锁定技,当你使用牌时,你令所有与你距离为1的其他角色不能使用或打出牌响应此牌。", - jiaozi: "骄恣", - jiaozi_info: "锁定技,若你的手牌数为全场唯一最多,则当你造成或受到伤害时,此伤害+1。", - wy_meirenji: "美人计", - wy_meirenji_info: "出牌阶段,对一名有手牌的其他男性角色使用。每名女性角色各获得其一张手牌并将一张手牌交给你,然后比较你与其的手牌数,手牌少的角色对手牌多的角色造成1点伤害。", - wy_xiaolicangdao: "笑里藏刀", - wy_xiaolicangdao_info: "出牌阶段,对一名其他角色使用。该角色摸X张牌(X为其已损失的体力值且至多为5),然后你对其造成1点伤害。", - weikui: "伪溃", - weikui2: "伪溃", - weikui_info: "出牌阶段限一次,你可以失去1点体力并选择一名有手牌的其他角色,你观看其手牌:若其手牌中有【闪】,则视为你对其使用【杀】,且本回合你计算与其的距离视为1;若其手牌中没有【闪】,你弃置其中一张牌。", - lizhan: "励战", - lizhan_info: "结束阶段,你可以令任意名已受伤的角色摸一张牌。", - wylianji: "连计", - wylianji_info: "出牌阶段限一次,你可以展示一张【杀】或黑色锦囊牌,并令一名其他角色将牌堆中的随机一张武器牌置入装备区(可替换原装备)。然后该角色选择一项:1.对除你以外的角色使用该牌,并将装备区里的武器牌交给该牌的一个目标角色;2.令你对其使用此牌,然后获得此牌,并将装备区内的武器牌交给你。", - // from here - moucheng: "谋逞", - moucheng_info: "觉醒技,当其他角色使用因〖连计〗交给其的牌累计造成伤害达到3点后,你失去技能〖连计〗,然后获得技能〖矜功〗。", - jingong: "矜功", - jingong2: "矜功", - jingong_backup: "矜功", - jingong_info: "出牌阶段限一次,你可以将一张装备牌或【杀】当做一张随机锦囊牌使用(三选一,其中一张为【美人计】或【笑里藏刀】),然后本回合的结束阶段,若你于本回合内未造成过伤害,你失去1点体力。", - fenyue: "奋钺", - fenyue2: "奋钺", - fenyue2_bg: "钺", - fenyue_info: "出牌阶段限X次,你可以与一名角色拼点,若你赢,你选择一项:1.令其不能使用或打出手牌直到回合结束;2.视为对其使用一张【杀】(不计入次数)。若你没赢,你结束出牌阶段。(X为存活的忠臣数)", - - zfengshi: "锋矢", - zfengshi_info: "当你使用【杀】指定目标后,你可以令目标弃置装备区内的一张牌。", - chuanxin: "穿心", - chuanxin_info: "当你于出牌阶段内使用【杀】或【决斗】对目标角色造成伤害时,你可以防止此伤害。若如此做,该角色选择一项:1.弃置装备区里的所有牌,若如此做,其失去1点体力;2.随机移除主武将牌上的一个技能。", - chuanxin_info_guozhan: "当你于出牌阶段内使用【杀】或【决斗】对目标角色造成伤害时,若其与你势力不同且有副将,你可以防止此伤害。若如此做,该角色选择一项:1.弃置装备区里的所有牌,若如此做,其失去1点体力;2.移除副将。", - hengjiang: "横江", - hengjiang2: "横江", - hengjiang_info: "当你受到1点伤害后,你可以令当前回合角色本回合的手牌上限-1。然后若其弃牌阶段内没有弃牌,则你摸一张牌。", - rehengjiang: "横江", - rehengjiang2: "横江", - rehengjiang3: "横江", - rehengjiang_info: "当你受到1点伤害后,你可以令当前回合角色本回合的手牌上限-1。然后若其弃牌阶段内有/没有弃牌,则你摸一/X张牌(X为你本回合内对其发动过〖横江〗的次数)。", - shuangren: "双刃", - shuangren_info: "出牌阶段开始时,你可以与一名角色拼点。若你赢,你视为对其或与其势力相同的另一名角色使用一张【杀】(不计入出牌阶段的次数限制);若你没赢,你本回合内不能对其他角色使用牌。", - xiashu: "下书", - xiashu_info: "出牌阶段开始时,你可以将所有手牌交给一名其他角色,然后该角色亮出任意数量的手牌(至少一张)。你选择一项:1.获得其亮出的手牌;2.获得其未亮出的手牌。", - kuanshi: "宽释", - kuanshi2: "宽释", - kuanshi_info: "结束阶段,你可以选择一名角色。直到你的下回合开始,该角色第一次受到大于1的伤害时,防止此伤害,然后你跳过下个回合的摸牌阶段。", - bingzheng: "秉正", - bingzheng_info: "出牌阶段结束时,你可以令手牌数不等于体力值的一名角色弃置一张手牌或摸一张牌。然后若其手牌数等于体力值,你摸一张牌,且可以交给该角色一张牌。", - sheyan: "舍宴", - sheyan_info: "当你成为普通锦囊牌的目标时(【借刀杀人】等带有指向目标的锦囊除外),你可以为此牌增加一个目标或令其对其中一个目标无效。(有效目标数至少为一)", - fuman: "抚蛮", - fuman2: "抚蛮", - fuman_info: "出牌阶段每名角色限一次,你可以将一张手牌交给一名其他角色并标记为“抚蛮”且“抚蛮”牌的牌名视为【杀】。然后当一名角色使用“抚蛮”牌结算结束后,你摸一张牌。若此牌造成过伤害,则改为摸两张牌。", - qizhou: "绮胄", - qizhou_info: "锁定技,你根据装备区里牌的花色数获得以下技能:1种或以上:〖马术〗;2种或以上:〖英姿〗;3种或以上:〖短兵〗;4种:〖奋威〗。", - shanxi: "闪袭", - shanxi_info: "出牌阶段限一次,你可以弃置一张红色基本牌,然后弃置攻击范围内的一名其他角色的一张牌。若弃置的牌是【闪】,你观看其手牌,若弃置的不是【闪】,其观看你的手牌。", - duanbing: "短兵", - duanbing_info: "当你使用【杀】选择目标后,你可以令一名距离为1的其他角色也成为此牌的目标。", - fanghun: "芳魂", - fanghun_info: "当你使用【杀】造成伤害或受到【杀】的伤害后,你获得X个“梅影”标记(X为伤害点数);你可以移去1个“梅影”标记来发动〖龙胆〗并摸一张牌。", - refanghun: "芳魂", - refanghun_info: "当你使用【杀】或成为【杀】的目标后,你获得1个“梅影”标记;你可以移去1个“梅影”标记来发动〖龙胆〗并摸一张牌。", - fanghun_sha: "龙胆", - fuhan: "扶汉", - fuhan_info: "限定技,回合开始时,你可以移去所有“梅影”标记并摸等量的牌,随机观看五名未登场的蜀势力角色,将武将牌替换为其中一名角色,并将体力上限数调整为本局游戏中移去“梅影”标记的数量(至少为2,至多为8),然后回复1点体力。", - refuhan: "扶汉", - refuhan_info: '限定技,回合开始时,你可以移去所有"梅影"标记并摸等量的牌,然后从X张蜀势力武将牌中选择并获得至多两个技能(限定技、觉醒技、隐匿技、使命技、主公技除外)。若此时你是体力值最低的角色,你回复1点体力(X为场上角色数,且X∈[4,+∞))。', - yjixi: "觊玺", - yjixi_info: "觉醒技,结束阶段,若你已连续三个自己回合未失去过体力,则你增加1点体力上限并回复1点体力,然后选择一项:获得技能〖妄尊〗;摸两张牌并获得当前主公的主公技。", - xinyongsi: "庸肆", - xinyongsi1: "庸肆", - xinyongsi2: "庸肆", - xinyongsi_info: "锁定技,摸牌阶段,你令额定摸牌数改为X(X为势力数);弃牌阶段开始时,你选择一项:1.弃置一张牌;2.失去1点体力。", - xiehui: "黠慧", - xiehui2: "黠慧", - xiehui_info: "锁定技,你的黑色牌不计入手牌上限;其他角色获得你的黑色牌时,其不能使用、打出、弃置这些牌直到其体力值扣减为止。", - lianzhu: "连诛", - lianzhu_info: "出牌阶段限一次,你可以展示并交给一名其他角色一张牌,若此牌为黑色,其选择一项:1.你摸两张牌;2.弃置两张牌。", - shanjia: "缮甲", - shanjia_info: "出牌阶段开始时,你可以摸X张牌,然后弃置等量的牌。若你以此法弃置了装备区内的牌,则你可以视为使用一张【杀】。(X为你于本局游戏内使用过的装备牌数且最大为7)", - tuifeng: "推锋", - tuifeng2: "推锋", - tuifeng_info: "1.当你受到伤害后,你可以将至多X张牌置于武将牌上(X为伤害值),称为“锋”。2.准备阶段开始时,若你的武将牌上有“锋”,你移去所有“锋”,摸2X张牌,然后你于此回合的出牌阶段内使用【杀】的次数上限+X。(X为你此次移去的“锋”数)", - ziyuan: "资援", - ziyuan_info: "出牌阶段限一次,你可以将任意张点数之和为13的手牌交给一名其他角色,然后该角色回复1点体力。", - jugu: "巨贾", - jugu_info: "锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。", - hongde: "弘德", - hongde_info: "当你一次获得或失去至少两张牌后,你可以令一名其他角色摸一张牌。", - dingpan: "定叛", - dingpan_info_identity: "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的反贼数)", - dingpan_info_doudizhu: "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的农民数)", - dingpan_info_versus_two: "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的最大阵营角色数)", - dingpan_info_versus: "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的敌方角色数)", - dingpan_info: "出牌阶段限一次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。", - weidi: "伪帝", - weidi_info: "锁定技,你视为拥有当前主公的主公技。", - juesi: "决死", - juesi_info: "出牌阶段,你可以弃置一张【杀】并选择攻击范围内的一名有牌的其他角色,该角色弃置一张牌,然后若弃置的牌不是【杀】且你的体力值不大于该角色,你视为对其使用【决斗】。", - zhenlue: "缜略", - zhenlue_info: "锁定技,你使用的普通锦囊牌不能被【无懈可击】响应;你不能成为延时锦囊牌的目标。", - jianshu: "间书", - jianshu_info: "限定技,出牌阶段,你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,然后令这两名角色拼点。赢的角色弃置两张牌,没赢的角色失去1点体力。", - yongdi: "拥嫡", - yongdi_info: "限定技,准备阶段开始时,你可令一名其他男性角色增加1点体力上限并回复1点体力,然后若该角色的武将牌上有主公技且其不为主公,其获得此主公技。", - regushe: "鼓舌", - regushe_info: "出牌阶段,若X小于7,则你可以用一张手牌与至多三名角色同时拼点,然后依次结算拼点结果,没赢的角色选择一项:1.弃置一张牌;2.令你摸一张牌。若你没赢,你获得一个“饶舌”标记。当你获得第7个“饶舌”标记时,你死亡。(X为你的“饶舌”标记数与本回合因“鼓舌”拼点而胜利的次数之和)", - rejici: "激词", - rejici2: "激词", - rejici_info: "锁定技。①当你的拼点牌亮出后,若此牌的点数不大于X,则你令此牌点数+X,并获得此次拼点中点数最大的拼点牌。②当你死亡时,你令杀死你的角色弃置7-X张牌并失去1点体力(X为你的“饶舌”标记数)。", - gushe: "鼓舌", - gushe_bg: "舌", - gushe_info: "出牌阶段限一次,你可以用一张手牌与至多三名角色同时拼点,然后依次结算拼点结果,没赢的角色选择一项:1.弃置一张牌;2.令你摸一张牌。若你没赢,你获得一个“饶舌”标记。当你获得第7个“饶舌”标记时,你死亡。", - jici: "激词", - jici_info: "当你因发动〖鼓舌〗而扣置的拼点牌亮出后,若点数小于X,你可令点数+X;若点数等于X,你可令你本回合发动〖鼓舌〗的次数上限+1。(X为你“饶舌”标记的数量)", - shefu: "设伏", - shefu2: "设伏", - shefu_bg: "伏", - shefu_info: "结束阶段开始时,你可以将一张牌移出游戏,称为「伏兵」。并为「伏兵」记录一个基本牌或锦囊牌的名称(须与其他「伏兵」记录的名称均不同)。你的回合外,当有其他角色使用与你记录的「伏兵」牌名相同的手牌时,你可以取消此牌的所有目标,然后移去该「伏兵」。若此时处于使用者的回合内,则你令使用者当前的所有非Charlotte技失效直至回合结束。", - benyu: "贲育", - benyu2: "贲育", - benyu_info: "当你受到伤害后,你可选择:①将手牌摸至与伤害来源手牌数相同(至多摸至5张);②弃置大于伤害来源手牌数的牌,然后对其造成1点伤害。", - zhidao: "雉盗", - zhidao_info: "锁定技,当你于你的回合内第一次对区域里有牌的其他角色造成伤害后,你获得其手牌、装备区和判定区里的各一张牌,然后直到回合结束,其他角色不能被选择为你使用牌的目标。", - jili: "寄篱", - jili_info: "锁定技,当一名其他角色成为红色基本牌或红色普通锦囊牌的目标时,若其与你的距离为1且你既不是此牌的使用者也不是目标,你也成为此牌的目标。", - luanzhan: "乱战", - luanzhan_info: "你使用【杀】或黑色普通锦囊牌可以额外选择X名角色为目标;当你使用【杀】或黑色普通锦囊牌指定目标后,若此牌的目标角色数小于X,则X减至0。(X为你于本局游戏内造成过伤害的次数)", - zhengnan: "征南", - zhengnan_info: "其他角色死亡后,你可以摸三张牌并获得下列技能中的任意一个:〖武圣〗、〖当先〗和〖制蛮〗。", - xinzhengnan: "征南", - xinzhengnan_info: "当一名角色进入濒死状态时,若你未因其发动过〖征南〗,则你回复1点体力并摸一张牌并获得下列技能中的任意一个:〖武圣〗、〖当先〗和〖制蛮〗(若技能全部拥有则改为摸三张牌。你以此法获得的〖当先〗结算时视为已发动过〖伏枥〗)。", - xiefang: "撷芳", - xiefang_info: "锁定技,你计算与其他角色的距离时-X。(X为女性角色数)", - qizhi: "奇制", - qizhi_info: "当你于回合内使用基本牌或锦囊牌指定目标后,你可以弃置不是此牌目标的一名角色的一张牌。若如此做,其摸一张牌。", - jinqu: "进趋", - jinqu_info: "结束阶段开始时,你可以摸两张牌,若如此做,你将手牌弃置至X张。(X为你于此回合发动过〖奇制〗的次数)", - jiqiao: "机巧", - jiqiao_info: "出牌阶段开始时,你可以弃置任意张装备牌,然后亮出牌堆顶两倍数量的牌并获得其中的非装备牌。", - linglong: "玲珑", - linglong_info: "锁定技,若你的装备区没有武器牌,则你使用【杀】的次数上限+1;若你的装备区没有防具牌,视为你装备着【八卦阵】;若你的装备区没有坐骑牌,你的手牌上限+1;若你的装备区没有宝物牌,则你视为拥有技能〖奇才〗。", - zhenwei: "镇卫", - zhenwei2: "镇卫", - zhenwei_info: "当一名其他角色成为【杀】或黑色锦囊牌的目标时(使用者不是你),若该角色的体力值小于你且此牌的目标角色数为1,你可以弃置一张牌。若如此做,你选择一项:1、摸一张牌,然后将此【杀】或黑色锦囊牌转移给你;2、令此【杀】或黑色锦囊牌无效,然后将此【杀】或黑色锦囊牌置于使用者的武将牌旁,若如此做,当前回合结束后,使用者获得使用者武将牌旁的这些牌。", - xingwu: "星舞", - xingwu_info: "弃牌阶段开始时,你可以将一张与你本回合使用的牌颜色均不同的手牌置于武将牌上:若你有至少三张“星舞”牌,你移去“星舞”牌并选择一名男性角色,该角色受到2点伤害并弃置其装备区的所有牌。", - luoyan: "落雁", - luoyan_info: "锁定技。若你的武将牌上有“星舞牌”,你拥有“天香”和“流离”。", - yinbing: "引兵", - yinbing_info: "结束阶段开始时,你可以将至少一张非基本牌置于武将牌上。每当你受到【杀】或【决斗】的伤害后,你移去一张「引兵」牌。", - juedi: "绝地", - juedi_info: "锁定技,准备阶段,若你的武将牌上有「引兵」牌,你选择一项:1.移去「引兵」牌,将手牌补至体力上限数;2.将「引兵」牌交给一名体力值不大于你的其他角色,其回复1点体力并摸等量的牌。", - kuangfu: "狂斧", - kuangfu_info: "当你使用【杀】造成伤害后,你可以选择一项:弃置其装备区内的一张牌,或将其装备区内的一张牌移动到你的装备区内。", - xintan: "心惔", - xintan_info: "出牌阶段限一次,你可以移去两张「焚」并选择一名角色,该角色失去1点体力。", - fentian: "焚天", - fentian_info: "锁定技,结束阶段开始时,若你的手牌数少于体力值,你须选择一名攻击范围内的角色,将其一张牌置于你的武将牌上,称为「焚」。锁定技,你的攻击范围+X(X为「焚」的数量)。", - zhiri: "炙日", - zhiri_info: "觉醒技,准备阶段开始时,若你的「焚」的数量不小于3,你减1点体力上限,然后获得技能〖心惔〗。", - meibu: "魅步", - meibu_info: "其他角色的出牌阶段开始时,若你不在其攻击范围内,你可以令该角色的锦囊牌均视为【杀】,直到该角色以此法使用了一张【杀】或回合结束。若如此做,则直到回合结束,视为你在其攻击范围内。", - mumu: "穆穆", - mumu_info: "出牌阶段限一次,你可以弃置一张【杀】或黑色锦囊牌,然后选择一项:弃置场上的一张武器牌,然后摸一张牌;或将场上的一张防具牌移动到你的装备区里(可替换原防具)。", - zhanyi: "战意", - zhanyi_basic_sha: "战杀", - zhanyi_basic_jiu: "战酒", - zhanyi_basic_tao: "战桃", - zhanyi_info: "出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作【杀】、【酒】或【桃】使用;锦囊牌,摸两张牌且你使用的牌无距离限制;装备牌,你使用【杀】指定目标角色后,其弃置两张牌。", - nuzhan: "怒斩", - nuzhan2: "怒斩", - nuzhan_info: "锁定技,你使用的由一张锦囊牌转化的【杀】不计入出牌阶段的次数限制;锁定技,你使用的由一张装备牌转化的【杀】的伤害值基数+1。", - danji: "单骑", - danji_info: "觉醒技,准备阶段开始时,若你的手牌数大于你的体力值且本局游戏的主公不为刘备,你减1点体力上限,然后获得〖马术〗和〖怒斩〗。", - jieyuan: "竭缘", - jieyuan_more: "竭缘", - jieyuan_less: "竭缘", - jieyuan_info: "当你对一名其他角色造成伤害时,若其体力值大于或等于你的体力值,你可弃置一张黑色手牌,令此伤害+1;当你受到一名其他角色造成的伤害时,若其体力值大于或等于你的体力值,你可弃置一张红色手牌,令此伤害-1。", - fenxin: "焚心", - fenxin_info: "锁定技,一名其他角色死亡后,若其身份为:忠臣,你本局内发动〖竭缘〗减少伤害时无视体力值限制;反贼,你本局内发动〖竭缘〗增加伤害时无视体力值限制;内奸,你本局内选择发动〖竭缘〗的牌时无颜色和区域限制。", - fenxin_info_versus: "锁定技,一名其他角色首次受到伤害后,你选择本局游戏未选择过的一项:1.发动〖竭缘〗减少伤害时无视体力值限制;2.发动〖竭缘〗增加伤害时无视体力值限制;3.发动〖竭缘〗选择的牌时无颜色和区域限制。", - qingyi: "轻逸", - qingyi1: "轻逸", - qingyi2: "轻逸", - qingyi_info: "你可以跳过判定阶段和摸牌阶段。若如此做,视为对一名角色使用了一张无距离限制的【杀】。", - xiandeng: "先登", - xiandeng_info: "锁定技,出牌阶段,你使用的第一张【杀】不计入次数且无距离限制。", - shulv: "熟虑", - shulv_info: "出牌阶段限一次,若你的手牌数大于体力值,则你可以弃置一张牌并摸一张牌。", - xisheng: "牺牲", - xisheng_info: "每名其他角色的回合限一次,你可以将两张牌当做【桃】使用。", - yuhua: "羽化", - yuhua_info: "锁定技。①你的非基本牌不计入手牌上限。②准备阶段和结束阶段开始时,你卜算1。", - qirang: "祈禳", - qirang_info: "当有装备牌进入你的装备区时,你可获得牌堆中的一张锦囊牌。若此牌为:普通锦囊牌,则当你使用此“祈禳”牌选择唯一目标后,可为此牌增加一个目标;延时锦囊牌,则你下回合发动〖羽化〗时的卜算量+1(至多为5)。", - biluan: "避乱", - biluan_info: "摸牌阶段开始时,若有与你距离不大于1的其他角色,你可以放弃摸牌。若如此做,本局内其他角色计算与你的距离时+X。(X为势力数)", - lixia: "礼下", - lixia_info: "锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你摸一张牌或令其摸一张牌。本局内其他角色计算与你的距离时-1。", - olbiluan: "避乱", - olbiluan_info: "结束阶段开始时,若有与你距离不大于1的其他角色,你可以弃置一张牌。若如此做,本局内其他角色计算与你的距离时+X。(X为场上的势力数)", - relixia: "礼下", - relixia_info: "锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你选择一至两项:1.摸一张牌;2.其摸两张牌;3.其回复1点体力。本局内其他角色计算与你的距离时-X(X为你选择的选项数)。", - rebiluan: "避乱", - rebiluan2: "避乱", - rebiluan_info: "结束阶段开始时,若有与你距离不大于1的其他角色,你可以弃置一张牌。若如此做,本局内其他角色计算与你的距离时+X。(X为场上角色数且至多为4)", - ollixia: "礼下", - ollixia_info: "锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你摸一张牌或令其摸两张牌。本局内其他角色计算与你的距离时-1。", - yishe: "义舍", - yishe_bg: "米", - yishe_info: "结束阶段开始时,若你的武将牌上没有「米」,则你可以摸两张牌。若如此做,你将两张牌置于武将牌上,称为「米」;当有「米」移至其他区域后,若你的武将牌上没有「米」,则你回复1点体力。", - bushi: "布施", - midao: "米道", - bushi_info: "当你受到1点伤害后,或其他角色受到你造成的1点伤害后,受到伤害的角色可以获得你的一张「米」。", - midao_info: "一名角色的判定牌生效前,你可以打出一张「米」代替之。", - fengpo: "凤魄", - fengpo_info: "每种牌名各限一次。当你每回合使用的第一张【杀】或【决斗】指定目标后,若目标角色数为1,你可以选择一项:1.摸X张牌,令此牌的伤害值基数+1;2.摸一张牌,令此牌的伤害值基数+X(X为其♦牌的数量)。", - chenqing: "陈情", - chenqing_info: "每轮限一次,当一名角色处于濒死状态时,你可以令另一名其他角色摸四张牌,然后其弃置四张牌。若其以此法弃置的四张牌花色各不相同,则视为该角色对濒死的角色使用一张【桃】。", - mozhi: "默识", - mozhi_info: "结束阶段,你可以将一张手牌当做你本回合出牌阶段内使用的第一张基本或普通锦囊牌使用。然后你可以将一张手牌当做你本回合出牌阶段内使用的第二张基本或普通锦囊牌使用(以此法使用的牌须满足使用的限制)。", - ranshang: "燃殇", - ranshang2: "燃殇", - ranshang_info: "锁定技,当你受到1点火焰伤害后,你获得1枚“燃”标记;结束阶段开始时,你失去X点体力。若X大于2,则你减2点体力上限并摸两张牌。(X为“燃”标记的数量)", - hanyong: "悍勇", - hanyong_info: "当你使用【南蛮入侵】或【万箭齐发】或黑桃普通【杀】时,若你已受伤,则你可以令此牌的伤害值基数+1。然后若你的体力值不小于游戏轮数,则你获得一枚“燃”标记。", - - yicong: "义从", - yongsi: "庸肆", - yongsi1: "庸肆", - yongsi2: "庸肆", - bifa: "笔伐", - bifa2: "笔伐", - songci: "颂词", - songci_draw: "颂词", - baobian: "豹变", - lihun: "离魂", - chongzhen: "冲阵", - yuanhu: "援护", - tianming: "天命", - mizhao: "密诏", - duwu: "黩武", - duwu3: "黩武", - mingzhe: "明哲", - huanshi: "缓释", - hongyuan: "弘援", - aocai: "傲才", - aocai2: "傲才", - aocai2_backup: "傲才", - aocai3: "傲才", - huxiao: "虎啸", - huxiao3: "虎啸", - xueji: "雪恨", - wuji: "武继", - shushen: "淑慎", - shenzhi: "神智", - xiongyi: "雄异", - junbing: "郡兵", - junbing2: "郡兵", - quji: "去疾", - sijian: "死谏", - suishi: "随势", - suishi2: "随势", - xiaoguo: "骁果", - duanxie: "断绁", - fenming: "奋命", - guixiu: "闺秀", - cunsi: "存嗣", - yongjue: "勇决", - hengzheng: "横征", - shengxi: "生息", - shoucheng: "守成", - shangyi: "尚义", - zniaoxiang: "鸟翔", - zhendu: "鸩毒", - qiluan: "戚乱", - qiluan2: "戚乱", - qiluan3: "戚乱", - shenxian: "甚贤", - oldshenxian: "甚贤", - qiangwu: "枪舞", - moukui: "谋溃", - moukui2: "谋溃", - lirang: "礼让", - mingshi: "名士", - liangzhu: "良助", - kaikang: "慷忾", - wangzun: "妄尊", - tongji: "同疾", - kuiwei: "溃围", - kuiwei2: "溃围", - yanzheng: "严整", - zhoufu: "咒缚", - zhoufu2: "咒缚", - zhoufu3: "咒缚", - yingbin: "影兵", - reyingbing: "影兵", - rezhoufu: "咒缚", - rezhoufu2: "咒缚", - fenxun: "奋迅", - fenxun2: "奋迅", - spmengjin: "猛进", - xiemu: "协穆", - xiemu2: "协穆", - oldxiemu: "协穆", - naman: "纳蛮", - taichen: "抬榇", - jilei: "鸡肋", - jilei2: "鸡肋", - jilei2_bg: "肋", - yawang: "雅望", - xunzhi: "殉志", - fanxiang: "返乡", - fanxiang_info: "觉醒技,准备阶段开始时,若场上有已受伤且你发动过〖良助〗的选项二的角色,则你加1点体力上限并回复1点体力,失去技能〖良助〗并获得技能〖枭姬〗。", - xunzhi_info: "准备阶段开始时,若你的上家和下家与你的体力值均不相等,你可以失去1点体力。若如此做,你本局内手牌上限+2。", - yawang_info: "锁定技,摸牌阶段开始时,你改为摸X张牌,然后你于本回合的出牌阶段内至多使用X张牌(X为与你体力值相等的角色数)。", - jilei_info: "当你受到有来源的伤害后,你可以声明一种牌的类别。若如此做,你令伤害来源不能使用、打出或弃置此类别的手牌直到其下个回合开始。", - danlao: "啖酪", - danlao_info: "当你成为【杀】或普通锦囊牌的目标后,若此牌的目标数大于1,则你可以摸一张牌,令此牌对你无效。", - gongao: "功獒", - zhuiji: "追击", - chouhai: "仇海", - chouhai_info: "锁定技,当你受到伤害时,若你没有手牌,此伤害+1。", - rechouhai: "仇海", - rechouhai_info: "锁定技,当你受到渠道为【杀】的伤害时,若你没有手牌,此伤害+1。", - guiming: "归命", - guiming_info: "主公技,锁定技,你将残蚀描述中的“已受伤角色”改为“已受伤角色或其他吴势力角色”。", - canshi: "残蚀", - canshi2: "残蚀", - canshi_info: "摸牌阶段开始时,你可以改为摸X张牌(X为已受伤的角色数),若如此做,当你于此回合内使用基本牌或锦囊牌时,你弃置一张牌。", - recanshi: "残蚀", - recanshi2: "残蚀", - recanshi_info: "摸牌阶段开始时,你可以多摸X张牌(X为已受伤的角色数),若如此做,当你于此回合内使用【杀】或普通锦囊牌时,你弃置一张牌。", - zhuiji_info: "锁定技,你与体力值不大于你的角色的距离视为1。", - kunfen: "困奋", - kunfen_info: "锁定技,结束阶段开始时,你失去1点体力,然后摸两张牌。", - fengliang: "逢亮", - fengliang_info: "觉醒技,当你进入濒死状态时,你减1点体力上限,将体力值回复至2点,获得技能〖挑衅〗并将〖困奋〗改为非锁定技。", - oldcihuai: "刺槐", - oldcihuai2: "刺槐", - oldcihuai_info: "出牌阶段开始时,你可以展示手牌。若其中没有【杀】,则当你于此阶段内手牌数变化之前/有角色死亡之前需要使用【杀】时,你可以使用无对应实体牌的【杀】。", - cihuai: "刺槐", - cihuai_info: "出牌阶段开始时,若你的手牌中没有【杀】,则你可以展示你的手牌,视为对一名角色使用一张【杀】。", - gongao_info: "锁定技,当一名角色死亡后,你增加1点体力上限,回复1点体力。", - juyi: "举义", - juyi_info: "觉醒技,准备阶段开始时,若你的体力上限大于存活角色数,你摸等同于体力上限张数的牌,然后获得技能〖崩坏〗和〖威重〗。", - weizhong: "威重", - weizhong_info: "锁定技,当你的体力上限增加或减少时,你摸一张牌。若你的手牌数为全场最少,则你改为摸两张牌。", - taichen_info: "出牌阶段限一次,你可以失去1点体力,视为对一名角色使用一张【杀】。(不计入出牌阶段的使用次数限制)", - naman_info: "当其他角色打出的【杀】结算结束后,你可以获得此牌对应的所有实体牌。", - xiemu_info: "出牌阶段限一次,你可以弃置一张【杀】并选择一个势力。若如此做,直到你的下回合开始时,当你成为该势力的其他角色使用的黑色牌的目标后,你摸两张牌。", - oldxiemu_info: "当你成为其他角色使用的黑色牌的目标后,你可以弃置一张【杀】,然后摸两张牌。", - spmengjin_info: "当你使用【杀】指定目标后,你可以弃置目标角色的一张牌。", - fenxun_info: "出牌阶段限一次,你可以弃置一张牌并选择一名其他角色,你于本回合内至其的距离视为1。", - rezhoufu_info: "①出牌阶段限一次。你可以用一张牌对一名其他角色施“咒”,且当其判定时,将“咒”作为判定牌。②一名角色的回合结束时,你令本回合移除过“咒”的角色各失去1点体力。", - reyingbing_info: '锁定技,有“咒”的角色使用与“咒”颜色相同的牌时,你摸一张牌;若这是你第二次因该“咒”摸牌,则你获得该"咒"。', - yingbin_info: "锁定技,有“咒”的角色使用与“咒”花色相同的牌时,你摸一张牌;当你因同一名角色的同一张“咒”的效果摸第二张牌时,移去该“咒”。", - zhoufu_info: "出牌阶段限一次,你可以将一张手牌置于一名没有“咒”的其他角色的武将牌旁,称为“咒”。当有“咒”的角色判定时,其改为将“咒”作为判定牌;一名角色的回合结束时,若有角色于此回合因判定而移除过“咒”,则你令这些角色各失去1点体力。", - yanzheng_info: "若你的手牌数大于你的体力值,则你可以将你装备区内的牌当做【无懈可击】使用。", - kuiwei_info: "结束阶段开始时,你可以摸2+X张牌并翻面。你的下个摸牌阶段开始时,你弃置X张牌(X为当前时机场上所有角色装备区内武器牌数之和)。", - tongji_info: "锁定技。若你的手牌数大于你的体力值,则攻击范围包含你的其他角色使用【杀】时不能指定你以外的角色为目标。", - wangzun_info: "其他角色的准备阶段开始时,你可以摸一张牌。若如此做,该角色此回合的手牌上限-1。然后你不能再发动〖妄尊〗直到回合开始。", - kaikang_info: "当一名角色成为【杀】的目标后,若你至该角色的距离为1,你可以摸一张牌。若如此做,你交给其一张牌并展示之。若为装备牌,该角色可以使用此牌。", - liangzhu_info: "当一名角色于其出牌阶段内回复体力时,你可以选择一项:1、摸一张牌;2、令该角色摸两张牌。", - mingshi_info: "当你受到伤害时,若伤害来源的体力值大于你,你可以弃置一张黑色手牌,令伤害值-1。", - lirang_info: "当你的牌因弃置而置入弃牌堆后,你可以将其中的任意张牌交给其他角色。", - moukui_info: "当你使用【杀】指定目标后,你可以选择一项:摸一张牌,或弃置其一张牌。若如此做,当此【杀】被【闪】抵消时,目标角色弃置你的一张牌。", - qiangwu_info: "出牌阶段,你可以进行判定。若如此做,直到回合结束,你使用点数小于判定结果的【杀】时不受距离限制,且你使用点数大于判定结果的【杀】时无使用次数限制。", - shenxian_info: "每名角色的回合限一次,你的回合外,当有其他角色因弃置而失去基本牌时,你可以摸一张牌。", - oldshenxian_info: "你的回合外,每当有其他角色因弃置而失去基本牌时,你可以摸一张牌。", - qiluan_info: "一名角色的回合结束时,你可以摸3X+Y张牌。(X为你本回合内杀死过的角色数,Y为本回合内其他角色杀死过的角色数)", - //qiluan_info_guozhan:'一名角色的回合结束时,若你于回合内杀死过角色,则你可以摸三张牌。', - zhendu_info: "一名角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若该角色不是你,你对其造成1点伤害。", - //zhendu_info_guozhan:'其他角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若如此做,你对其造成1点伤害。', - shangyi_info: "出牌阶段限一次,你可以观看一名其他角色的手牌,然后弃置其中的一张黑色牌。", - zniaoxiang_info: "锁定技,当你使用【杀】指定目标后,你令目标角色响应此【杀】所需要使用的【闪】的数目+1。", - shoucheng_info: "当一名角色于其回合外失去手牌时,若其没有手牌,则你可令该角色摸一张牌。", - shengxi_info: "弃牌阶段开始时,若你本回合内未造成过伤害,则你可以摸两张牌。", - hengzheng_info: "摸牌阶段开始时,若你的体力值为1或你没有手牌,则你可以放弃摸牌,改为获得每名其他角色区域内的一张牌。", - cunsi_info: "限定技,出牌阶段,你可以将所有手牌交给一名男性角色。该角色获得技能〖勇决〗,然后你将武将牌翻面。", - yongjue_info: "每回合限一次。当其他角色于回合内使用的【杀】结算完成后,若你不是此【杀】的目标角色,则你可以获得之。", - guixiu_info: "当你成为【杀】的目标后,若你的手牌数小于体力值,则你可以摸一张牌。", - fenming_info: "结束阶段开始时,若你处于横置状态,你可以弃置所有处于横置状态的角色的各一张牌。", - duanxie_info: "出牌阶段限一次,你可以令至多X名其他角色横置(X为你已损失的体力值且至少为1),然后你横置。", - xiaoguo_info: "其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。", - sijian_info: "当你失去最后的手牌时,你可以弃置一名其他角色的一张牌。", - suishi_info: "当其他角色进入濒死状态时,伤害来源可以令你摸一张牌;当其他角色死亡时,伤害来源可以令你失去1点体力。", - quji_info: "出牌阶段限一次,你可以弃置X张牌(X为你已损失的体力值),然后令至多X名已受伤的角色各回复1点体力。若你以此法弃置的牌中有黑色牌,你失去1点体力。", - junbing_info: "一名角色的结束阶段开始时,若其手牌数不大于1,该角色可以摸一张牌。若如此做,该角色将所有手牌交给你,然后你交给其等量的牌。", - xiongyi_info: "限定技,出牌阶段,你可以选择任意名角色,这些角色各摸三张牌。然后若你的体力值最小,你回复1点体力。", - xiongyi_info_guozhan: "限定技,出牌阶段,你可以令与你势力相同的所有角色各摸三张牌,然后若你的势力是角色最少的势力(或之一),则你回复1点体力。", - shenzhi_info: "准备阶段开始时,你可以弃置所有手牌。若你以此法弃置的牌数不小于X,你回复1点体力(X为你的体力值)。", - shushen_info: "当你回复1点体力时,你可以令一名其他角色选择回复1点体力或摸两张牌。", - wuji_info: "觉醒技,结束阶段开始时,若你于此回合内造成过3点或更多伤害,你加1点体力上限并回复1点体力,失去〖虎啸〗,然后从场上、牌堆或弃牌堆中获得【青龙偃月刀】。", - xueji_info: "出牌阶段限一次,你可以弃置一张红色牌,然后选择至多X名角色,横置这些角色并对其中一名角色造成1点火焰伤害。(X为你已损失的体力值且至少为1)", - huxiao_info: "锁定技,当你造成火焰伤害后,你令受伤角色摸一张牌,然后你于此回合内对其使用牌没有次数限制。", - aocai_info: "当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌(若你没有手牌则改为四张)。若你观看的牌中有此牌,你可以使用打出之。", - aocai_info_guozhan: "当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌。若你观看的牌中有此牌,你可以使用打出之。", - hongyuan_info: "摸牌阶段,你可以少摸一张牌并指定至多两名其他角色。若如此做,这些角色各摸一张牌。", - hongyuan_info_combat: "摸牌阶段,你可以少摸一张牌。若如此做,其他友方角色各摸一张牌。", - huanshi_info: "一名角色的判定牌生效前,你可令其观看你的手牌。若如此做,该角色选择你的一张牌,你打出此牌代替之。", - mingzhe_info: "当你于回合外使用或打出红色牌,或因弃置失去一张红色牌后,你可以摸一张牌。", - duwu_info: "出牌阶段,你可以弃置X张牌对你攻击范围内的一名其他角色造成1点伤害(X为该角色的体力值)。若该角色因此法进入濒死状态且存活,则你于濒死状态结算后失去1点体力,且本回合不能再发动〖黩武〗。", - tianming_info: "当你成为【杀】的目标时,你可以弃置两张牌(不足则全弃,无牌则不弃),然后摸两张牌;若此时全场体力值最多的角色仅有一名且不是你,该角色也可以如此做。", - mizhao_info: "出牌阶段限一次,你可以将所有手牌交给一名其他角色。若如此做,你令该角色与你指定的另一名有手牌的角色拼点,视为拼点赢的角色对没赢的角色使用一张【杀】。", - yuanhu_info: "结束阶段开始时,你可以将一张装备牌置于一名角色的装备区里,然后根据此装备牌的类型执行以下对应效果。武器牌:弃置该角色距离1以内的一名角色区域中的一张牌;防具牌:该角色摸一张牌;坐骑牌:该角色回复1点体力。", - lihun_info: "出牌阶段限一次,你可以弃置一张牌并选择一名其他男性角色。若如此做,你将武将牌翻面并获得其所有手牌。出牌阶段结束时,你交给其X张牌。(X为该角色的体力值)", - chongzhen_info: "当你因发动〖龙胆〗而使用或打出【杀】或【闪】时,你可以获得对方的一张手牌。", - bifa_info: "结束阶段开始时,你可以将一张手牌移出游戏并指定一名其他角色。该角色的准备阶段开始时,其观看你移出游戏的牌并选择一项:交给你一张与此牌类型相同的手牌并获得此牌;或将此牌置入弃牌堆,然后失去1点体力。", - songci_info: "①出牌阶段,你可以选择一名未以此法选择过的角色。若其手牌数:大于其体力值,其弃置两张牌;不大于其体力值,其摸两张牌。②弃牌阶段结束时,若你已对场上所有存活角色发动过〖颂词①〗,则你摸一张牌。", - yongsi_info: "锁定技。①摸牌阶段,你多摸X张牌。②弃牌阶段开始时,你弃置X张牌。(X为场上势力数)", - yicong_info: "锁定技,当你的体力值大于2时,你计算与其他角色的距离时-1;当你的体力值不大于2时,其他角色计算与你的距离时+1。", - baobian_info: "锁定技,若你的体力值为3或更少,你视为拥有技能〖挑衅〗;若你的体力值为2或更少;你视为拥有技能〖咆哮〗;若你的体力值为1,你视为拥有技能〖神速〗。", - rebaobian: "豹变", - rebaobian_info: "锁定技。当你受到伤害后,你获得以下技能中第一个未拥有的技能:〖挑衅〗/〖咆哮〗/〖神速〗。", - bingzhao: "秉诏", - bingzhao_info: "主公技,游戏开始时,你选择一个其他势力。当你对该势力的角色发动〖骨疽〗时,其可令你额外摸一张牌。", - sunshao: "孙邵", - bizheng: "弼政", - bizheng_info: "摸牌阶段结束时,你可以令一名其他角色摸两张牌。然后,若你的手牌数大于体力上限,你弃置两张牌。若其的手牌数大于体力上限,其弃置两张牌。", - yidian: "佚典", - yidian_info: "当你使用牌选择目标时,若弃牌堆中没有与此牌名称相同的牌,则你可以为此牌增加一个目标(无距离限制)。", - xinlianji: "连计", - xinlianji_info: "出牌阶段限一次,你可以弃置一张手牌,令一名角色使用牌堆中的一张随机武器牌。然后其选择一项:对你指定的一名角色使用一张【杀】,或令你将其装备区里的武器牌交给任意角色。", - xinmoucheng: "谋逞", - xinmoucheng_info: "觉醒技,准备阶段,若有角色因你发动〖连计〗使用【杀】而造成过伤害,则你失去〖连计〗并获得〖矜功〗。", - xinjingong: "矜功", - xinjingong_backup: "矜功", - xinjingong_info: "出牌阶段限一次,你可以将一张【杀】或装备牌当做三张随机锦囊牌中的一张使用。", - caiyang: "蔡阳", - yinka: "印卡", - zhangling: "张陵", - zlhuji: "虎骑", - zlhuji_info: "锁定技,你与其他角色的距离-1,当你于回合外受到伤害后,你可进行判定,若结果为红色,视为你对伤害来源使用一张【杀】(无距离限制)。", - zlshoufu: "授符", - zlshoufu2: "授符", - zlshoufu_info: "出牌阶段限一次,你可摸一张牌,然后将一张手牌置于一名没有【箓】的角色的武将牌上,称为【箓】;其不能使用和打出与【箓】同类型的牌。该角色受到伤害后,或于弃牌阶段弃置至少两张与【箓】同类型的牌后,将【箓】置入弃牌堆。", - ol_zhangchangpu: "OL张昌蒲", - ol_zhangchangpu_prefix: "OL", - olxingshen: "省身", - olxingshen_info: "当你受到伤害后,你可以随机摸至多两张牌。若如此做,你获得X个“省”,且下一次发动〖严教〗展示牌时移去所有“省”并多展示等量的牌。(X为你已损失的体力值,且你至多拥有6个“省”)", - caoshuang: "曹爽", - tuogu: "托孤", - tuogu_info: "限定技,一名角色死亡时,你可以令其选择其武将牌上的一个技能(主公技,限定技,觉醒技,隐匿技、使命技等特殊技能除外),然后你获得其选择的技能。", - retuogu: "托孤", - retuogu_info: "一名角色死亡时,你可以令其选择其武将牌上的一个技能(主公技,限定技,觉醒技,隐匿技、使命技等特殊技能除外),然后你获得其选择的技能并失去上次因〖托孤〗获得的技能。", - shanzhuan: "擅专", - shanzhuan_info: "①当你对其他角色造成伤害后,若其判定区没有延时类锦囊牌,则你可以将其的一张牌置于其的判定区。若此牌不为延时锦囊牌且此牌为:红色,此牌视为【乐不思蜀】;黑色,此牌视为【兵粮寸断】。②回合结束时,若你本回合内未造成伤害,你可摸一张牌。", - spniluan: "逆乱", - spniluan_info: "出牌阶段,你可以将一张黑色牌当做【杀】使用。此【杀】使用结算完成后,若你未因此【杀】造成过伤害,则你令此【杀】不计入使用次数。", - spweiwu: "违忤", - spweiwu_info: "出牌阶段限一次,你可以将一张红色牌当无距离限制的【顺手牵羊】使用。", - spmouzhu: "谋诛", - spmouzhu_backup: "谋诛", - spmouzhu_info: "出牌阶段限一次,你可以选择任意名“距离为1”或“体力值等于你”的其他角色,这些角色依次进行以下结算:交给你一张手牌,然后若其手牌数小于你,则其视为对你使用一张【杀】或【决斗】。", - spyanhuo: "延祸", - spyanhuo_info: "当你死亡时,你可增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。", - xiaoxi: "骁袭", - xiaoxi_info: "当你登场时,你可以视为使用一张【杀】。", - quyi: "麴义", - wolongfengchu: "卧龙凤雏", - youlong: "游龙", - youlong_info: "转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。", - luanfeng: "鸾凤", - //luanfeng_info_fullinfo:'限定技,一名角色进入濒死状态时,若其体力上限不小于你,你可令其回复至3点体力,恢复其被废除的装备栏,令其手牌补至6-X张(X为以此法恢复的装备栏数量),重置其因“改写”使用过的牌名。若该角色是你,重置你因“游龙”使用过的牌名。', - luanfeng_info: "限定技,一名角色进入濒死状态时,若其体力上限不小于你,你可令其回复至3点体力,恢复其被废除的装备栏,令其手牌补至6-X张(X为以此法恢复的装备栏数量)。若该角色是你,重置你因“游龙”使用过的牌名。", - reluanzhan: "乱战", - reluanzhan_add: "乱战", - reluanzhan_remove: "乱战", - reluanzhan_info: "当你受到或造成伤害后,你获得一个“乱”。当你使用【杀】或黑色普通锦囊牌选择目标后,你可为此牌增加至多X个目标。当你使用这些牌指定第一个目标后,若此牌目标数小于X,则你移去X/2(向上取整)个“乱”。(X为“乱”数)", - zhuixi: "追摄", - zhuixi_info: "锁定技,你使用【杀】的次数上限+1。", - reduanbing: "短兵", - reduanbing_info: "你使用【杀】选择目标后,可以为此【杀】增加一名距离为1的额外目标。你对距离为1的角色使用的【杀】需两张【闪】才能抵消。", - refenxun: "奋迅", - refenxun2: "奋迅", - refenxun_info: "出牌阶段限一次,你可以选择一名其他角色,然后本回合你计算与其的距离视为1;结束阶段开始时,若你未对其造成过伤害,你弃一张牌。", - zongyu: "宗预", - zyqiao: "气傲", - zyqiao_info: "每回合限两次。当你成为其他角色使用牌的目标后,你可以弃置其一张牌,然后你弃置一张牌。", - zyqiao_info_guozhan: "每回合限两次。当你成为其他势力的角色使用牌的目标后,你可以弃置其一张牌,然后你弃置一张牌。", - chengshang: "承赏", - chengshang_info: "当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗得到过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。", - chengshang_info_guozhan: "当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗得到过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。", - panshu: "OL潘淑", - panshu_prefix: "OL", - weiyi: "威仪", - weiyi_info: "每名角色限一次。当有角色受到伤害后,你可选择:①若其体力值不小于你,则其失去1点体力。②若其体力值不大于你且其已受伤,则其回复1点体力。", - jinzhi: "锦织", - jinzhi2: "锦织", - jinzhi_info: "当你需要使用或打出一张基本牌时,你可弃置X+1张颜色相同的牌并摸一张牌,然后视为你使用或打出了此牌。(X为你于本轮内发动此技能的次数)", - yanxiao_card: "言笑", - yanxiao_global: "言笑", - yanxiao_card_info: "判定阶段开始时,你获得判定区内的所有牌。", - gz_huangzu: "黄祖", - huangzu: "OL黄祖", - huangzu_prefix: "OL", - wangong: "挽弓", - wangong2: "挽弓", - wangong_info: "锁定技,当你使用基本牌时,你获得如下效果:当你使用下一张牌时,若此牌为【杀】,则此牌无次数和距离限制且伤害+1。", - huangchengyan: "OL黄承彦", - huangchengyan_prefix: "OL", - guanxu: "观虚", - guanxu_info: "出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可将其中一张手牌与牌堆顶五张牌中的一张交换。若如此做,你弃置其手牌中三张花色相同的牌。", - yashi: "雅士", - yashi_info: "当你受到一次伤害后,你可选择一项:1. 令伤害来源的非锁定技无效直到其下个回合开始;2. 对一名其他角色发动〖观虚〗。", - olwuniang: "武娘", - olwuniang_info: "每回合限一次,当你于回合内使用的【杀】结算完成后,若此【杀】对应的目标数为1,则你可以令目标角色选择是否对你使用使用【杀】。你于其选择结算完成后摸一张牌,且本回合内使用【杀】的次数上限+1。", - olxushen: "许身", - olxushen_info: "限定技,当你进入濒死状态时,你可将体力回复至1点并获得技能〖镇南〗。然后若场上没有存活的“关索”,则你可以令一名其他男性角色选择是否将一张武将牌替换为“关索”。", - olzhennan: "镇南", - olzhennan2: "镇南", - olzhennan_info: "【南蛮入侵】对你无效。出牌阶段限一次,你可以将任意张手牌当做【南蛮入侵】对等量的角色使用。", - gaogan: "高干", - juguan: "拒关", - juguan_backup: "拒关", - juguan_info: "出牌阶段限一次,你可将一张手牌当【杀】或【决斗】使用。若受到此牌伤害的角色未在你的下回合开始前对你造成过伤害,你的下个摸牌阶段摸牌数+2。", - duxi: "杜袭", - quxi: "驱徙", - quxi_info: "限定技。出牌阶段结束时,你可跳过下个弃牌阶段并选择两名手牌数不同的其他角色。你将武将牌翻至背面,令这两名角色中手牌数较少的角色获得另一名角色的一张牌并获得一枚“丰”,另一名角色获得一枚“歉”。拥有“丰”/“歉”的角色的摸牌阶段额定摸牌数+1/-1。拥有“丰”/“歉”的角色死亡时,或一轮游戏开始时,你可转移“丰”/“歉”。", - bixiong: "避凶", - bixiong2: "避凶", - bixiong_info: "锁定技,当你于弃牌阶段弃置手牌后,其他角色不能使用与这些牌花色相同的牌指定你为目标直到你的下回合开始。", - fuwei: "扶危", - fuwei_info: "每回合限一次。当你的牌被其他角色弃置或获得后,你可从牌堆中获得一张与此牌名称相同的牌(若没有则改为摸一张牌)。", - yuejian: "约俭", - yuejian_info: "每回合限两次。当其他角色对你使用的牌A结算结束后,你可展示所有手牌。若牌A有花色且你的手牌中没有同花色的牌,则你获得牌A对应的所有实体牌。", - ol_dengzhi: "OL邓芝", - ol_dengzhi_prefix: "OL", - olxiuhao: "修好", - olxiuhao_info: "每回合限一次。当你受到其他角色造成的伤害时,或其他角色受到你造成的伤害时,你可防止此伤害,然后令伤害来源摸两张牌。", - olsujian: "素俭", - olsujian_given: "已分配", - olsujian_info: "锁定技。弃牌阶段开始前,你将此阶段的规则改为:{你选择一项:①将所有不为本回合得到的手牌分配给其他角色。②弃置这些手牌,然后弃置一名其他角色等量的牌}。", - ol_wangrong: "OL王荣", - ol_wangrong_prefix: "OL", - olfengzi: "丰姿", - olfengzi_info: "出牌阶段限一次。当你使用有目标的基本牌或普通锦囊牌时,你可弃置一张与此牌类型相同的牌,然后令此牌结算两次。", - oljizhan: "吉占", - oljizhan_info: "摸牌阶段开始时,你可以放弃摸牌。你亮出牌堆顶的一张牌,并猜测牌堆顶的下一张牌点数大于或小于此牌。若你猜对,你可继续重复此流程。然后你获得以此法展示的所有牌。", - olfusong: "赋颂", - olfusong_info: "当你死亡时,你可以选择一名体力上限大于你的其他角色。其选择获得〖吉占〗或〖丰姿〗。", - zuofen: "左棻", - zhaosong: "诏颂", - zhaosong_info: "一名其他角色的摸牌阶段结束时,若其没有因〖诏颂〗而获得的标记,则你可令其正面向上交给你一张手牌。根据此牌的类型,该角色获得对应的标记和效果:
    锦囊牌:“诔”标记。当拥有者进入濒死状态时,其可弃置所有“诔”,将体力回复至1点并摸一张牌。
    装备牌:“赋”标记。拥有者的出牌阶段开始时,其可弃置所有“赋”,弃置一名角色区域内的至多两张牌。
    基本牌:“颂”标记。当使用者使用仅指定一个目标的【杀】时,其可弃置“颂”,为此【杀】增加至多两个目标。", - lisi: "离思", - lisi_info: "当你于回合外使用的牌结算结束后,你可将其交给一名手牌数不大于你的其他角色。", - ol_yangyi: "杨仪", - oljuanxia: "狷狭", - oljuanxia_info: "结束阶段,你可以选择一名其他角色。你依次视为对其使用至多三种单目标普通锦囊牌。然后其下回合结束时,可视为对你使用等量的【杀】。", - oldingcuo: "定措", - oldingcuo_info: "每回合限一次。当你受到或造成伤害后,你可摸两张牌。若这两张牌颜色不同,则你弃置一张手牌。", - fengfangnv: "OL冯妤", - fengfangnv_prefix: "OL", - zhuangshu: "妆梳", - zhuangshu_info: "①游戏开始时,你可将{【琼梳】,【犀梳】,【金梳】}中的一张牌置于装备区。②一名角色的回合开始时,若其宝物区为空,则你可以弃置一张牌,并根据此牌的类型,按如下关系将一张宝物牌置入该角色的装备区:{<基本牌,【琼梳】>,<锦囊牌,【犀梳】>,<装备牌,【金梳】>}。", - chuiti: "垂涕", - chuiti_info: "每回合限一次。当你或拥有〖妆梳〗牌角色的牌因弃置而进入弃牌堆后,你可使用其中的一张牌。", - zhuangshu_basic: "琼梳", - zhuangshu_basic_bg: "琼", - zhuangshu_basic_info: "当你受到伤害时,你可以弃置X张牌并防止此伤害(X为伤害值)。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。", - zhuangshu_trick: "犀梳", - zhuangshu_trick_bg: "犀", - zhuangshu_trick_info: "判定阶段开始前,你可选择:①跳过此阶段。②跳过本回合的弃牌阶段。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。", - zhuangshu_equip: "金梳", - zhuangshu_equip_bg: "金", - zhuangshu_equip_info: "锁定技。出牌阶段结束时,你将手牌摸至手牌上限(至多摸五张)。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。", - ol_dongzhao: "OL董昭", - ol_dongzhao_prefix: "OL", - olxianlve: "先略", - olxianlve_info: "①主公的回合开始时,你可声明并记录一个锦囊牌的名称并移除先前的记录。②每回合限一次,其他角色使用〖先略〗记录过的锦囊牌后,你可摸两张牌并可以分配给任意其他角色,然后你可声明并记录一个锦囊牌的名称并移除先前的记录。", - olzaowang: "造王", - olzaowang2: "造王", - olzaowang_info: "限定技。出牌阶段,你可以令一名角色加1点体力上限,回复1点体力并摸三张牌,且获得如下效果:主公死亡时,若其身份为忠臣,则其和主公交换身份牌;其死亡时,若其身份为反贼且伤害来源的身份为主公或忠臣,则以主忠胜利结束本局游戏。", - sp_ol_zhanghe: "SP张郃", - sp_ol_zhanghe_prefix: "SP", - spolzhouxuan: "周旋", - spolzhouxuan_info: "①弃牌阶段开始时,你可将任意张置于武将牌上,称为“旋”(你至多拥有五张“旋”)。②当你使用牌时,你随机将一张“旋”置入弃牌堆,然后摸一张牌(若你的手牌数不为全场唯一最多则额外摸X张牌,X为“旋”数)。③出牌阶段结束时,你将所有“旋”置入弃牌堆。", - wuyan: "吾彦", - lanjiang: "澜疆", - lanjiang_info: "结束阶段,你可以选择所有手牌数不小于你的角色。这些角色依次选择是否令你摸一张牌。然后你可以对其中一名手牌数等于你的角色造成1点伤害,随后令其中一名手牌数小于你的角色摸一张牌。", - ol_zhuling: "OL朱灵", - ol_zhuling_prefix: "OL", - jixian: "急陷", - jixian_info: "摸牌阶段结束时,你可以选择一名满足以下至少一项条件的角色:⒈装备区内有防具牌;⒉拥有的普通技能数大于你;⒊体力值等于体力上限。你视为对其使用一张【杀】,然后摸X张牌(X为其于此【杀】结算前满足的条件数);若此【杀】未造成伤害,则你失去1点体力。", - ol_chendeng: "OL陈登", - ol_chendeng_prefix: "OL", - olfengji: "丰积", - olfengji_info: "摸牌阶段开始时,你选择:⒈本回合摸牌阶段的额定摸牌数-1,且令一名其他角色下回合摸牌阶段的额定摸牌数+2;⒉本回合摸牌阶段的额定摸牌数+1。然后你选择:⒈本回合使用【杀】的次数上限-1,且令一名其他角色下回合使用【杀】的次数上限+2;⒉本回合使用【杀】的次数上限+1。", - tianyu: "田豫", - saodi: "扫狄", - saodi_info: "当你使用【杀】或普通锦囊牌指定唯一其他角色为目标时,你可从逆时针方向和顺时针方向中选择一个你与其之间角色最少的方向。你令该方向下你与其之间的所有能成为此牌额外目标的角色均成为此牌的目标。", - zhuitao: "追讨", - zhuitao_info: "①准备阶段,你可选择一名未被〖追讨〗记录过的其他角色。②你至所有〖追讨〗记录过的角色的距离-1。③当你对一名被〖追讨〗记录过的角色造成伤害时,你从〖追讨〗记录里移除该角色。", - fanjiangzhangda_ab: "范疆张达", - fanjiangzhangda: "范强张达", - yuanchou: "怨仇", - yuanchou_info: "锁定技。当你使用黑色【杀】指定目标角色后或成为黑色【杀】的目标角色后,你令目标角色的防具技能无效直到此【杀】被抵消或造成伤害。", - juesheng: "决生", - juesheng_info: "限定技。出牌阶段,你可视为使用一张【决斗】。当你因此【决斗】造成伤害时,你将伤害值改为X(X为目标角色本局游戏内使用过【杀】的数量且至少为1)且令目标角色获得此技能直到其下回合结束。", - qinghegongzhu: "清河公主", - zengou: "谮构", - zengou_info: "当有角色使用【闪】时,若其在你的攻击范围内,则你可以弃置一张非基本牌或失去1点体力,然后取消此【闪】的目标并获得其对应的实体牌。", - qhzhangji: "长姬", - qhzhangji_info: "一名角色的回合结束时,若你本回合内:造成过伤害,则你可以令其摸两张牌;受到过伤害,则你可以令其弃置两张牌。", - sp_menghuo: "SP孟获", - sp_menghuo_prefix: "SP", - spmanwang: "蛮王", - spmanwang_info: "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前等量项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。", - sppanqin: "叛侵", - sppanqin_info: "出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项。", - tengfanglan: "OL滕芳兰", - tengfanglan_prefix: "OL", - luochong: "落宠", - luochong_info: "准备阶段开始时/当你于一回合内首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):⒈令一名角色回复1点体力。⒉令一名角色失去1点体力。⒊令一名角色弃置两张牌。⒋令一名角色摸两张牌。", - aichen: "哀尘", - aichen_info: "锁定技。当你进入濒死状态时,若〖落宠〗中的剩余选项数大于1,则你选择移去〖落宠〗中的一个选项。", - weizi: "卫兹", - yuanzi: "援资", - yuanzi_info: "每轮限一次。其他角色的准备阶段开始时,你可将所有手牌交给该角色。若如此做,当该角色于本回合内造成伤害后,若其手牌数不小于你,则你摸两张牌。", - liejie: "烈节", - liejie_info: "当你受到伤害后,你可以弃置至多三张牌,摸等量的牌,然后可弃置伤害来源的至多X张牌(X为你以此法弃置的红色牌的数量)。", - ruiji: "OL芮姬", - ruiji_prefix: "OL", - qiaoli: "巧力", - qiaoli_info: "出牌阶段各限一次,你可以将一张武器牌/非武器装备牌当作【决斗】使用。若此【决斗】对应的实体牌为武器牌,当你以此【决斗】对目标角色造成伤害后,你摸X张牌(X为此牌的攻击范围),且可以将其中任意张牌分配给其他角色;若此【决斗】对应的实体牌不为武器牌,此牌不可被响应,且你于结束阶段从牌堆中获得一张装备牌。", - qiaoli_given: "已分配", - qingliang: "清靓", - qingliang_info: "每回合限一次,当你成为其他角色使用【杀】或伤害类锦囊牌的唯一目标时,你可展示所有手牌,然后选择一项:⒈你与其各摸一张牌,⒉取消此目标,然后弃置你手牌中一种花色的所有牌。", - chixueqingfeng: "赤血青锋", - chixueqingfeng2: "赤血青锋", - chixueqingfeng_info: "锁定技,当你使用【杀】指定目标后,你令目标角色不能使用或打出手牌且防具技能无效直到此【杀】结算结束。", - wushuangfangtianji: "无双方天戟", - wushuangfangtianji_skill: "无双方天戟", - wushuangfangtianji_info: "当你因执行【杀】的效果而造成伤害后,你可选择一项:⒈摸一张牌;⒉弃置目标角色的一张牌。", - guilongzhanyuedao: "鬼龙斩月刀", - guilongzhanyuedao_info: "锁定技,你使用的红色【杀】不可被响应。", - bintieshuangji: "镔铁双戟", - bintieshuangji_skill: "镔铁双戟", - bintieshuangji_info: "当你使用的【杀】被抵消后,你可失去1点体力。获得此【杀】对应的所有实体牌,摸一张牌,且本回合使用【杀】的次数上限+1。", - linglongshimandai: "玲珑狮蛮带", - linglongshimandai_info: "当你成为其他角色使用的牌的唯一目标后,你可以进行判定。若判定结果为♥,则此牌对你无效。", - linglongshimandai_skill: "玲珑狮蛮带", - hongmianbaihuapao_skill: "红棉百花袍", - hongmianbaihuapao: "红棉百花袍", - hongmianbaihuapao_info: "锁定技,当你受到属性伤害时,防止此伤害。", - qimenbagua: "奇门八卦", - qimenbagua_info: "锁定技,【杀】对你无效。", - guofengyupao: "国风玉袍", - guofengyupao_info: "锁定技,你不是其他角色使用普通锦囊牌的合法目标。", - shufazijinguan: "束发紫金冠", - shufazijinguan_skill: "束发紫金冠", - shufazijinguan_info: "准备阶段,你可以对一名其他角色造成1点伤害。", - sanlve: "三略", - sanlve_skill: "三略", - sanlve_info: "锁定技。你的攻击范围+1。你的手牌上限+1。你使用【杀】的次数上限+1。", - zhaogujing: "照骨镜", - zhaogujing_skill: "照骨镜", - zhaogujing_info: "出牌阶段结束时,你可展示手牌中的一张基本牌或普通锦囊牌,然后你视为使用一张牌名和属性与此牌相同的牌。", - xuwangzhimian: "虚妄之冕", - xuwangzhimian_info: "锁定技,摸牌阶段,你令额定摸牌数+2;你的手牌上限-1。", - ol_puyuan: "OL蒲元", - ol_puyuan_prefix: "OL", - olshengong: "神工", - olshengong_info: "出牌阶段每项限一次。你可以弃置一张武器牌/防具牌/其他装备牌,并发起一次“锻造”。然后你从锻造结果中选择一张牌,置于一名角色的装备区内(可替换原装备)。当有因你发动〖神工〗而加入游戏的牌进入弃牌堆后,你将此牌移出游戏,然后你于当前回合结束后摸一张牌。", - olqisi: "奇思", - olqisi_info: "①游戏开始时,你获得两张副类别不同的牌,并将这些牌置入你的装备区。②摸牌阶段开始时,你可以少摸一张牌并声明一种装备牌的副类别,然后从牌堆或弃牌堆中获得一张该副类别的牌。", - olzhuiji: "追击", - olzhuiji_info: "锁定技。①你至体力值不大于你的角色的距离为1。②当你使用【杀】指定距离为1的角色为目标后,你令其选择一项:⒈弃置一张牌。⒉重铸装备区内的所有牌。", - zhaoyǎn: "OL赵俨", - zhaoyǎn_prefix: "OL", - tongxie: "同协", - tongxie_info: "出牌阶段开始时,你可以选择包括你在内的至多三名角色(你与这些角色均称为“同协角色”)。这些角色中手牌数唯一最少的角色摸一张牌,且你获得如下效果直到你下回合开始:①当有“同协角色”对唯一目标角色使用的【杀】结算结束后,其他“同协角色”可以依次对目标角色使用一张【杀】(无距离和次数限制,且不能再触发此效果)。②当有“同协角色”受到伤害时,其他“同协角色”(本回合内失去过体力的角色除外)可以防止此伤害,失去1点体力。", - jin_zhouchu: "周处", - shanduan: "善断", - shanduan_info: "锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[1,2,3,4]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。", - yilie: "义烈", - yilie_info: "每轮每种牌名限一次。你可以将两张颜色相同的手牌当做任意一种基本牌使用。", - caoxiancaohua: "曹宪曹华", - huamu: "化木", - huamu_info: "当你使用手牌后,若此牌和本回合内上一张被使用的牌颜色不同,则你可以将此牌对应的所有{位于处理区或装备区}的实体牌置于你的武将牌上。这些牌中的黑色牌称为“灵杉”,红色牌称为“玉树”。", - qianmeng: "前盟", - qianmeng_info: "锁定技。当有牌移动事件结算结束后,若有角色的“灵杉”和“玉树”数量发生了变化,且二者数量相等或有一项为0,则你摸一张牌。", - liangyuan: "良缘", - liangyuan_info: "每轮每项各限一次。你可以将场上所有的“灵杉”/“玉树”置于处理区,然后将这些牌当做【酒】/【桃】使用。", - jisi: "羁肆", - jisi_info: "限定技。准备阶段,你可以令一名其他角色获得你武将牌上的一个已发动过的其他技能。然后你弃置所有手牌,并视为对其使用一张【杀】(无距离关系的限制)。", - huojun: "OL霍峻", - huojun_prefix: "OL", - qiongshou: "穷守", - qiongshou_info: "锁定技。①游戏开始时,你废除所有装备栏并摸四张牌。②你的手牌上限+4。", - fenrui: "奋锐", - fenrui_info: "结束阶段,你可以弃置一张牌并恢复一个装备栏。系统检索一张对应的装备牌,你使用之。然后你可以选择一名装备区内牌数小于你的其他角色,对其造成X点伤害(X为你与其装备区内的牌数之差,且每局限一次)。", - wangyan: "王衍", - yangkuang: "阳狂", - yangkuang_info: "当你回复体力后,若你的体力值等于体力上限,则你可以视为使用一张【酒】,然后当前回合角色摸一张牌,你摸一张牌。", - cihuang: "雌黄", - cihuang_info: "当有牌被抵消后,若此牌的目标数为1且此牌的使用者A为当前回合角色,则你可以将一张牌当做一张你本轮内未使用过的属性【杀】或单目标锦囊牌对A使用(不可被响应)。", - sanku: "三窟", - sanku_info: "锁定技。①当你进入濒死状态时,你减1点体力上限,然后将体力回复至体力上限。②当你加体力上限前,取消之。", - dengzhong: "邓忠", - dzkanpo: "勘破", - dzkanpo_info: "①当你因执行【杀】的效果而造成伤害后,你可以观看目标角色的手牌,然后获得其中一张与此【杀】花色相同的牌。②每回合限一次,你可以将一张手牌当做【杀】使用。", - dzgengzhan: "更战", - dzgengzhan_info: "①其他角色的出牌阶段限一次,当有【杀】因弃置而进入弃牌堆后,你可以获得这些【杀】。②其他角色的结束阶段,若其本回合内未使用过【杀】,则你下个出牌阶段使用【杀】的次数上限+1。", - xiahouxuan: "夏侯玄", - olhuanfu: "宦浮", - olhuanfu_info: "当你使用【杀】指定第一个目标后,或成为【杀】的目标后,你可以弃置X张牌(X∈[1, 你的体力上限])。此【杀】结算结束后,若此【杀】累计因执行效果而造成的伤害值等于X,则你摸2X张牌。", - olqingyi: "清议", - olqingyi_info: "①出牌阶段限一次,你可以选择至多两名有牌的其他角色。你和这些角色同时弃置一张牌,然后若这些牌类型均相同,则你重复此流程。②结束阶段开始时,若你本回合内发动〖清议①〗弃置的牌包含两种颜色,则你获得每种颜色的牌各一张。", - olzeyue: "迮阅", - olzeyue_info: "限定技。准备阶段,你可以选择一名于你的上个回合结束后对你造成过伤害的角色A及其武将牌上的一个非锁定技B,令A的B失效。然后每轮游戏开始时,A依次视为对你使用X张【杀】(X为B失效状态下经过的完整轮数)。当你因这些【杀】受到伤害后,你令A恢复技能B。", - xindiaodu: "调度", - xindiaodu_info: "①每回合限一次,与你势力相同的角色使用装备牌时,其可以摸一张牌。②出牌阶段开始时,你可以获得与你势力相同的一名角色装备区内的一张牌,然后你可以将此牌交给另一名与你势力相同的其他角色。", - olhuanshi: "缓释", - olhuanshi_info: "一名角色的判定牌生效前,你可以令其观看你的手牌并选择你的一张牌,你打出此牌代替判定牌。然后你可以重铸任意张牌(每回合限重铸一次)。", - olhongyuan: "弘援", - olhongyuan_info: "每阶段限一次。当你一次性获得至少两张牌以后,你可以将至多两张牌交给等量名角色。", - olmingzhe: "明哲", - olmingzhe_info: "锁定技。当你于出牌阶段外失去红色牌后,你展示这些牌中所有背面朝上移动的牌(没有则不展示),然后摸一张牌。", - ahuinan: "阿会喃", - jueman: "蟨蛮", - jueman_info: "锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均不为你,你视为使用本回合被使用的第三张基本牌;有且仅有其中之一为你,你摸一张牌。", - ol_liuba: "OL刘巴", - ol_liuba_prefix: "OL", - oltongduo: "统度", - oltongduo_info: "准备阶段,你可以令一名角色交给你一张手牌,然后出牌阶段结束时,你将此牌置于牌堆顶。", - olzhubi: "铸币", - olzhubi_tag: "币", - olzhubi_info: "①出牌阶段限X次(X为你的体力上限)。你可以令一名角色重铸一张牌,以此法获得的牌称为“币”。②一名角色的结束阶段,若其有“币”,其观看牌堆底的五张牌,然后可以用任意“币”交换其中等量张牌。", - ol_furong: "傅肜", - olxiaosi: "效死", - olxiaosi_info: "出牌阶段限一次。你可以选择一名有手牌的其他角色并弃置一张基本牌。若其有可被弃置的基本牌,其弃置一张基本牌。然后你可以以任意顺序使用你与其以此法弃置的牌(无距离和次数限制)。最后若其未以此法弃置牌,你摸一张牌。", - zhangzhi: "张芝", - olbixin: "笔心", - olbixin_info: "一名角色的准备阶段或结束阶段,你可以声明一种牌的类型(每种类型限[1]次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸[3]张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。", - olximo: "洗墨", - olximo_info: "锁定技。当你发动〖笔心〗后,你移除其描述的前五个字符。若你已发动三次〖笔心〗,交换中括号中的两个数字,失去〖洗墨〗并获得〖飞白〗。", - olfeibai: "飞白", - olfeibai_info: "转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。", - olqizhou: "绮冑", - olqizhou_info: "锁定技。每个回合开始前,或当你装备区内的牌发生变化后,你失去所有因此技能获得过的额外技能,然后根据你装备区内的花色数获得对应的技能。至少一种:〖短兵〗、至少两种:〖英姿〗、至少三种:〖奋威〗、至少四种:〖澜江〗。", - olshanxi: "闪袭", - olshanxi_info: "出牌阶段限一次。你可以选择一名攻击范围内不包含你的其他角色,展示你与其的至多X张手牌(X为你的空装备栏数)。若这些牌中有【闪】,则你弃置这些【闪】,然后获得对方的一张未展示的牌。", - macheng: "马承", - olchenglie: "骋烈", - olchenglie_info: "当你使用【杀】选择目标后,你可以令至多两名角色也成为此牌目标,并亮出牌堆顶的等同于目标数张牌,然后你可以将一张手牌与其中一张牌交换,将这些牌扣置于每名目标角色武将牌上,称为“骋烈”牌。此牌结算结束后:1.若有红色“骋烈”牌的角色:响应过此【杀】,其交给你一张牌;未响应此【杀】,其回复1点体力;2.有“骋烈”牌的角色将其“骋烈”牌置入弃牌堆。", - quhuang: "屈晃", - olqiejian: "切谏", - olqiejian_info: "当一名角色失去最后的手牌后,你可以摸一张牌,然后令其摸一张牌,你选择一项:1.弃置你或其场上的一张牌;2.你于本轮不能再对其发动此技能。", - olnishou: "泥首", - olnishou_info: "锁定技。当你装备区里的牌进入弃牌堆后,你选择一项:1.将这些牌中第一张能当【闪电】对你使用的牌当【闪电】使用;2.本阶段结束时,你与一名手牌数最少的角色交换手牌。", - zhanghua: "张华", - olbihun: "弼昏", - olbihun_info: "锁定技。当你使用牌指定其他角色为目标时,若你的手牌数大于手牌上限且若此牌的目标数:大于1,取消此目标;为1,其获得此牌。", - olchuanwu: "穿屋", - olchuanwu_info: "锁定技。当你造成或受到伤害后,你令武将牌上的前X个未失效的技能失效直到回合结束。然后你摸等同于你此次失效的技能数张牌(X为你的攻击范围)。", - oljianhe: "剑合", - oljianhe_info: "出牌阶段每名角色限一次。你可以重铸至少两张同名牌或至少两张装备牌,然后令一名角色选择一项:1.重铸等量张与你以此法重铸的牌类型相同的牌;2.受到你造成的1点雷电伤害。", - dongtuna: "董荼那", - oljianman: "鹣蛮", - oljianman_info: "锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均为你,你视为使用其中的一张牌;有且仅有其中之一为你,你弃置另一名使用者一张牌。", - maxiumatie: "马休马铁", - olkenshang: "垦伤", - olkenshang_info: "你可以将任意张牌当【杀】使用,然后你可以将此牌目标改为所有你攻击范围外的角色。此牌结算结束后,若此牌对应的实体牌数大于X,你摸X张牌(X为此牌造成过的伤害值),否则你失去一个技能。", - rekenshang: "垦伤", - rekenshang_info: "你可以将至少两张牌当【杀】使用,然后你可以将此牌目标改为等量名角色。此牌结算结束后,若此牌对应的实体牌数大于此牌造成过的伤害值,你摸一张牌。", - ol_zhujun: "OL朱儁", - ol_zhujun_prefix: "OL", - olcuipo: "摧破", - olcuipo_info: "锁定技。当你使用牌时,若此牌是你本回合使用的第X张牌(X为此牌牌名的字数),则:{若此牌为【杀】或伤害类锦囊牌,则此牌的伤害值基数+1,否则你摸一张牌}。", - ol_zhangyì: "OL张翼", - ol_zhangyì_prefix: "OL", - oldianjun: "殿军", - oldianjun_info: "锁定技。回合结束时,你受到1点无来源伤害,然后执行一个额外的出牌阶段。", - olkangrui: "亢锐", - olkangrui_info: "当一名角色于其回合内首次受到伤害后,你可以摸一张牌并选择一项:1.令其回复1点体力;2.令其于本回合下次造成的伤害+1。然后当其于本回合造成伤害时,其本回合手牌上限基数为0。", - wangguan: "王瓘", - olmiuyan: "谬焰", - olmiuyan_tag: "invisible", - olmiuyan_info: "转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的手牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。", - olshilu: "失路", - olshilu_info: "锁定技。当你受到伤害后,你摸X张牌(X为你的体力值且至多为5)。然后你展示攻击范围内一名角色的一张手牌,令此牌的牌名视为【杀】。", - ol_huban: "OL胡班", - ol_huban_prefix: "OL", - olhuiyun: "晖云", - olhuiyun_tag: "invisible", - olhuiyun_info: "每轮每项各限一次。你可以将一张牌当【火攻】使用。此牌结算结束后,你选择一项,令目标角色选择是否执行:1.使用展示的牌,然后重铸所有手牌;2.使用一张手牌,然后重铸展示牌;3.摸一张牌。", - sunhong: "孙弘", - olxianbi: "险诐", - olxianbi_info: "出牌阶段限一次。你可以选择一名角色,然后将手牌摸至或弃置至等同于其装备区里的牌数(至多摸五张),且当你因此弃置一张牌后,你随机获得弃牌堆中的另一张类型相同的牌。", - olzenrun: "谮润", - olzenrun_info: "每阶段限一次。当你摸牌时,你可以改为获得一名其他角色等量的牌,然后其选择一项:1.摸等量的牌;2.令你本局游戏不能再对其发动〖险诐〗和〖谮润〗。", - luoxian: "罗宪", - oldaili: "带砺", - oldaili_tag: "带砺", - oldaili_info: "一名角色的回合结束时,若你被展示过的手牌数为偶数,则你可以翻面,摸三张牌并展示之。", - zhangshiping: "张世平", - olhongji: "鸿济", - olhongji_info: "每轮每项各限一次。一名角色的准备阶段,若其手牌数最少/最多,你可以令其于本回合第一个摸牌阶段/出牌阶段后执行一个额外的摸牌阶段/出牌阶段(若其条件同时满足则只能选择一项)。", - olxinggu: "行贾", - olxinggu_info: "①游戏开始时,你将牌堆中的三张坐骑牌扣置于武将牌上。②结束阶段,你可以将一张〖行贾①〗牌置于一名其他角色的装备区,然后你从牌堆获得一张♦牌。", - lushi: "卢氏", - olzhuyan: "驻颜", - olzhuyan_info: "每名角色每项各限一次。结束阶段,你可以令一名角色将以下一项调整至与其上一个结束阶段结束后相同:1.体力值;2.手牌数(体力值至多失去至1,手牌数至多摸至5;若其未执行过准备阶段则改为游戏开始时)。", - olleijie: "雷劫", - olleijie_info: "准备阶段,你可以令一名角色判定,若结果为♠2~9,其受到2点雷电伤害,否则其摸两张牌。", - releijie: "雷劫", - releijie_info: "出牌阶段限一次,你可以令一名角色判定,若结果为黑桃2~9,则你视为依次对其使用两张雷【杀】,否则其摸两张牌。", - ol_liuyan: "OL刘焉", - ol_liuyan_prefix: "OL", - olpianan: "偏安", - olpianan_info: "锁定技。游戏开始或弃牌阶段结束时,你弃置所有不为【闪】的手牌(没有则不弃)。若你的手牌数小于体力值,你获得牌堆或弃牌堆中的前X张【闪】(X为你的体力值与手牌数的差)。", - olyinji: "殷积", - olyinji_info: "锁定技。结束阶段,若你的体力值不为唯一最大,你选择回复1点体力或加1点体力上限。", - olkuisi: "窥伺", - olkuisi_info: "锁定技。摸牌阶段开始时,你跳过此阶段,然后观看牌堆顶的四张牌并可以使用其中任意张。若你以此法使用的牌数不为2或3,你减1点体力上限。", - ol_wanglang: "OL王朗", - ol_wanglang_prefix: "OL", - oljici: "激词", - oljici_info: "当你的拼点牌亮出后,若点数不大于X,你可令点数+X并令〖鼓舌〗视为未发动过(X为你的“饶舌”标记数)。", - ol_mengda: "OL孟达", - ol_mengda_prefix: "OL", - olgoude: "苟得", - olgoude_info: "一名角色的回合结束时,若有与你势力相同的角色执行过以下项,则你可以执行这些角色未执行过的一项:1.摸一张牌;2.弃置一名角色的一张手牌;3.使用一张无对应实体牌的【杀】;4.变更势力。", - haopu: "郝普", - olzhenying: "镇荧", - olzhenying_info: "出牌阶段限两次。你可以选择一名手牌数不大于你的其他角色,你与其同时将手牌摸或弃置至至多两张。然后你与其中手牌数较少的角色视为对另一名角色使用一张【决斗】。", - ol_wenqin: "文钦", - olguangao: "犷骜", - olguangao_info: "当你/其他角色使用【杀】时,你/该角色可以额外指定一个目标/你为目标(有距离限制)。然后若你的手牌数为偶数,你摸一张牌并令此牌对任意目标无效(可不选)。", - olhuiqi: "彗企", - olhuiqi_info: "觉醒技。一名角色回合结束后,若你与其他两名角色于此回合成为过牌的目标,你获得〖偕举〗并获得一个额外的回合。", - olxieju: "偕举", - olxieju_info: "出牌阶段限一次。你可以令任意名本回合成为过牌的目标的角色依次视为使用一张【杀】。", - ol_zhouqun: "周群", - oltianhou: "天候", - oltianhou_info: "锁定技。准备阶段,你观看牌堆顶的一张牌,且可以用你的一张牌交换此牌。然后你亮出牌堆顶的牌,令一名角色根据此牌的花色获得对应的技能直到你下个准备阶段开始:♠〖骤雨〗;♥〖烈暑〗;♣〖严霜〗;♦〖凝雾〗。", - olchenshuo: "谶说", - olchenshuo_info: "结束阶段,你可以展示一张手牌,然后亮出牌堆顶的一张牌。若这两张牌类型/花色/点数/牌名字数中任一项相同且已展示的牌数小于3,则你重复此流程,然后获得所有所有展示牌。", - oltianhou_spade: "骤雨", - oltianhou_spade_miehuo: "骤雨", - oltianhou_spade_info: "锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。", - oltianhou_heart: "烈暑", - oltianhou_heart_info: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。", - oltianhou_club: "严霜", - oltianhou_club_info: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。", - oltianhou_diamond: "凝雾", - oltianhou_diamond_info: "锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。", - duanjiong: "段颎", - olsaogu: "扫谷", - olsaogu_info: "转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。", - olcuorui: "挫锐", - olcuorui_info: "锁定技。①游戏开始时,你将手牌摸至场上存活人数张(至多摸至8张)。②当你成为延时锦囊牌的目标后,你跳过下个判定阶段。", - olmouzhu: "谋诛", - olmouzhu_info: "出牌阶段限一次,你可以令一名有手牌的其他角色交给你一张手牌。然后若其手牌数小于你,其视为使用一张【杀】或【决斗】。", - olyanhuo: "延祸", - olyanhuo_info: "当你死亡时,你可以弃置杀死你的角色至多X张牌(X为你的牌数)。", - olniluan: "逆乱", - olniluan_info: "体力值大于你的其他角色的结束阶段,若其本回合内使用过【杀】,则你可以将一张黑色牌当作【杀】对其使用(无距离限制)。", - olxiaoxi: "骁袭", - olxiaoxi_info: "一轮游戏开始时,你可以视为使用一张无距离限制的【杀】。", - ol_qianzhao: "牵招", - olweifu: "威抚", - olweifu_info: "出牌阶段,你可以弃置一张牌并判定。你本回合下次使用与结果类型相同的牌无距离限制,且可以额外指定一个目标。若你弃置的牌与判定牌类型相同,你摸一张牌。", - olkuansai: "款塞", - olkuansai_info: "每回合限一次,当一张牌指定第一个目标后,若目标数不小于你的体力值,你可以令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。", - ol_luyusheng: "OL陆郁生", - ol_luyusheng_prefix: "OL", - olcangxin: "藏心", - olcangxin_info: "锁定技。①当你每回合第一次受到伤害时,你观看牌堆底的三张牌并弃置其中任意张牌,然后此伤害-X。②摸牌阶段开始时,你展示牌堆底的三张牌,然后摸X张牌(X为其中红桃牌的数量)。", - olrunwei: "润微", - olrunwei_info: "其他角色的弃牌阶段开始时,若其已受伤,则你可以选择一项:①令其弃置一张牌,其本回合手牌上限+1;②令其摸一张牌,其本回合手牌上限-1。", - caoxi: "曹羲", - olgangshu: "刚述", - olgangshu_info: "①当你使用非基本牌结算结束后,你可以令以下一项数值+1(每项至多加至5):1.攻击范围;2.受〖刚述〗影响的下个摸牌阶段摸牌数;3.使用【杀】的次数上限。②当有牌被你抵消后,重置你〖刚述①〗增加的所有数值。", - oljianxuan: "谏旋", - oljianxuan_info: "当你受到伤害后,你可以令一名角色摸一张牌,然后若其手牌数等于你〖刚述①〗中的任意一项对应的数值,其重复此流程。", - ol_pengyang: "彭羕", - olxiaofan: "嚣翻", - olxiaofan_info: "当你需要使用不为【无懈可击】的牌时,你可以观看牌堆底的X+1张牌并使用其中的一张。此牌结算结束时,你依次弃置以下前X个区域中的所有牌:⒈判定区、⒉装备区、⒊手牌区(X为本回合你使用过的牌中包含的类型数)。", - oltuishi: "侻失", - oltuishi_info: "锁定技。①你不能使用【无懈可击】。②当你使用点数为字母的牌时,你令此牌无效并摸一张牌,且你对手牌数小于你的角色使用的下一张牌无距离和次数限制。③当你使用伤害类卡牌结算完毕后,若此牌为你本回合使用的第三张或以上未造成伤害的卡牌,则你令〖器翻〗于本回合失效。", - ol_tw_zhangji: "张既", - skill_zhangji_A: "技能", - skill_zhangji_A_info: "出牌阶段限X次(X为你的体力值),当你使用牌指定一名其他角色为目标后,你可以观看其手牌,然后你选择一项:
    1.弃置其一张牌,然后若弃置的牌是能造成火焰伤害的牌,你摸一张牌。
    2.重铸其手牌中的所有【杀】和【决斗】。
    3.若其没有【闪】,你与其互相对对方造成1点伤害。", - skill_zhangji_B: "技能", - skill_zhangji_B_info: "当你受到1点伤害后,你可令一名手牌数小于体力上限的角色摸三张牌,然后其将手牌数弃置至其体力上限数;当你进入濒死状态时,你可令一名其他角色观看五张魏势力武将牌,其可以选择其中一张代替自己的武将牌(体力和体力上限不变)。", - ol_feiyi: "费祎", - yanru: "宴如", - yanru_info: "出牌阶段各限一次,若你的手牌数为:①奇数,你可以摸三张牌,然后弃置至少一半手牌(向下取整);②偶数,你可以弃置至少一半手牌,然后摸三张牌。", - hezhong: "和衷", - hezhong_info: "每回合每项限一次,当你的手牌数变为1后,你可以展示唯一手牌并摸一张牌,然后你选择一项:①本回合使用的下一张点数大于此牌的点数的普通锦囊牌额外结算一次;②本回合使用的下一张点数小于此牌的点数的普通锦囊牌额外结算一次。", - lvboshe: "吕伯奢", - olfushi: "缚豕", - olfushi_info: "①一名角色使用【杀】结算结束后,若你至其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时,你可以将任意张“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并选择X项(X为你以此法重铸的牌数且至多为3):1.你为此【杀】额外指定一个目标;2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-1;3.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后,若此牌被选择的效果选项相邻且此牌的目标角色座位连续,则此【杀】不计入次数限制。", - oldongdao: "东道", - oldongdao_info: "农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。", - zhangyan: "张燕", - olsuji: "肃疾", - olsuji_info: "一名角色的出牌阶段开始时,若其已受伤,你可以将一张黑色牌当【杀】使用。若其受到此【杀】的伤害,你获得其一张牌。", - ollangdao: "狼蹈", - ollangdao_info: "当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:1.令此【杀】伤害基数+1;2.令你可以为此【杀】多选择一个目标;3.令此【杀】不可被响应。然后若没有角色因此【杀】死亡,你移除本次被选择的项。", - ol_dingshangwan: "OL丁尚涴", - ol_dingshangwan_prefix: "OL", - olfudao: "抚悼", - olfudao_info: "①游戏开始时,你摸三张牌,然后可以将至多三张手牌交给一名其他角色,然后可以弃置任意张手牌,最后记录你的手牌数。②一名角色的回合结束时,若其手牌数和你发动〖抚悼①〗记录的数值相同,则你可以与其各摸一张牌。", - olfengyan: "讽言", - olfengyan_info: "锁定技。当你受到其他角色造成的伤害后或响应其他角色使用的牌时,你选择一项:①摸一张牌,然后交给其一张牌。②令其摸一张牌,然后其弃置两张牌。", - ol_liwan: "OL李婉", - ol_liwan_prefix: "OL", - ollianju: "联句", - ollianju_info: "结束阶段,你可以令一名其他角色获得你本回合使用的最后一张牌A对应的所有位于弃牌堆的实体牌并记录A的牌名,然后其下个结束阶段可以令你获得其本回合使用的最后一张牌B对应的所有位于弃牌堆的实体牌,然后若A与B的牌名相同,则你失去1点体力;若A与B的牌名不同,则你可以视为使用A。", - olsilv: "思闾", - olsilv_info: "锁定技,每回合每项限一次,当你获得或失去你发动〖联句〗记录的最后一次牌名的同名牌后,你展示这些牌,然后摸一张牌。", - xueji_old: "血祭", - xueji_old_info: "出牌阶段限一次,你可以弃置一张红色牌并对攻击范围内的至多X名角色各造成1点伤害(X为你已损失的体力值),然后这些角色各摸一张牌。", - oldhuxiao: "虎啸", - oldhuxiao_info: "锁定技,当你使用的【杀】被【闪】抵消后,你令此【杀】不计入使用次数。", - oldwuji: "武继", - oldwuji_info: "觉醒技,结束阶段,若你本回合造成了3点或更多伤害,你加1点体力上限并回复1点体力,并失去技能〖虎啸〗。", - olfeiyang: "飞扬", - //olfeiyang_info:'限定技。准备阶段,你可以弃置两张牌,然后弃置判定区的一张牌。', - olfeiyang_info: "准备阶段,你可以弃置三张牌,然后弃置判定区的一张牌。", - caoyu: "曹宇", - olgongjie: "恭节", - olgongjie_info: "每轮的首个回合开始时,你可以令任意名角色获得你的一张牌,然后你摸X张牌(X为你本次失去的花色数)。", - olxiangxv: "相胥", - olxiangxv_info: "当你的手牌数变为全场最少时,你可以获得以下效果:本回合结束时,将手牌数调整至与当前回合角色手牌数相同(至多摸至五张),然后若你以此法弃置了至少两张手牌,则你回复1点体力。", - olxiangzuo: "襄胙", - olxiangzuo_info: "限定技,当你进入濒死状态时,你可以交给一名其他角色任意张牌,然后若你已对其发动过〖恭节〗和〖相胥〗,你回复等量的体力。", - liyi: "李异", - olchanshuang: "缠双", - olchanshuang_info: "①出牌阶段限一次,你可以选择一名其他角色。你与其依次选择〖缠双③〗的一项,然后你与其依次执行各自选择的项。②结束阶段,若X大于0,你执行〖缠双③〗的前X项(X为你本回合以任意形式执行过的〖缠双③〗的选项数)。③选项:1.重铸一张牌;2.使用一张【杀】;3.弃置两张牌。", - olzhanjin: "蘸金", - olzhanjin_info: "锁定技,若你有空置的武器栏,则你视为装备【贯石斧】。", - tianchou: "田畴", - olshandao: "善刀", - olshandao_info: "出牌阶段限一次,你可以选择任意名角色,你选择这些角色的各一张牌,依次将这些牌放置到牌堆顶,然后你视为对这些角色使用【五谷丰登】,然后你视为对这些角色外的所有其他角色使用【万箭齐发】。", - ol_hujinding: "胡金定", - olqingyuan: "轻缘", - olqingyuan_info: "锁定技。①游戏开始时,或当你于本局游戏首次受到伤害后,你选择一名未以此法选择过的其他角色。②每回合限一次,你发动〖轻缘①〗选择过的角色得到牌后,你随机获得其中一名角色的随机一张手牌。", - olchongshen: "重身", - olchongshen_info: "你可以将本轮得到的红色手牌当作【闪】使用。", - guotu: "郭图", - olqushi: "趋势", - olqushi_info: "出牌阶段限一次,你可以摸一张牌,然后将一张手牌扣置于一名其他角色的武将牌上,称为“趋”。目标角色于其结束阶段移去武将牌上的所有“趋”,若其于本回合使用过与“趋”相同类别的牌,则你摸X张牌(X为其本回合使用牌指定过的目标数之和且至多为5)。", - olweijie: "诿解", - olweijie_info: "回合外每名角色的回合限一次,当你需要使用或打出一张基本牌时,你可以弃置距离为1的一名角色的一张手牌,若此牌牌名与你需要使用或打出的牌的牌名相同,则视为你使用或打出之。", - liupan: "刘磐", - olpijing: "披荆", - olpijing_info: "每回合限一次,当你使用【杀】或普通锦囊牌指定唯一目标后,你可以令至多X名其他角色成为或取消成为此牌的额外目标并依次随机交给你一张牌(X为你已损失的体力值且X至少为1)。这些角色下次使用基本牌或普通锦囊牌指定唯一目标时,其可令你成为此牌的额外目标或摸一张牌。", - ol_lukai: "OL陆凯", - ol_lukai_prefix: "OL", - olxuanzhu: "玄注", - olxuanzhu_info: "转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。", - oljiane: "謇谔", - oljiane_info: "锁定技。①当你对其他角色使用的牌生效后,其本回合无法抵消牌。②当你抵消牌后,你本回合无法成为牌的目标。", - ol_liupi: "刘辟", - olyicheng: "易城", - olyicheng_info: "出牌阶段限一次,你可以展示牌堆顶的X张牌(X为你的体力上限),然后你可以以任意手牌交换其中等量张牌,若这些牌的点数和因此增加,则你可以选择用所有手牌再次交换这些牌。", - sp_sunce: "SP孙策", - sp_sunce_prefix: "SP", - olliantao: "连讨", - olliantao_info: "出牌阶段开始时,你可以令一名其他角色选择一个颜色,然后你依次将此颜色的所有手牌当作【决斗】对其使用直到有一方进入濒死状态,然后你摸X张牌(X为你本次以此法造成的伤害数)。若没有角色因本次技能结算受到伤害,你摸三张牌,本回合手牌上限+3且本回合你不能使用【杀】。", - - sp_tianji: "天极·皇室宗亲", - sp_sibi: "四弼·辅国文曲", - sp_tianzhu: "天柱·势冠一方", - sp_nvshi: "女史·留史巾帼", - sp_shaowei: "少微·能人异士", - sp_huben: "虎贲·勇冠三军", - sp_liesi: "列肆·豪商巨贾", - sp_default: "天同·同名异势", - sp_qifu: "灯愿·祈福武将", - sp_wanglang: "OL·限定专属", - sp_zhongdan: "忠胆英杰", - sp_guozhan: "国战", - sp_guozhan2: "国战移植", - sp_others: "其他", - sp_waitforsort: "等待分包", - }, - }; -}); diff --git a/character/sp/card.js b/character/sp/card.js new file mode 100644 index 000000000..369ab5bda --- /dev/null +++ b/character/sp/card.js @@ -0,0 +1,338 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + //蒲元衍生 + sanlve: { + derivation: "ol_puyuan", + cardcolor: "spade", + type: "equip", + subtype: "equip5", + ai: { + basic: { + equipValue: 5, + }, + }, + skills: ["sanlve_skill"], + fullskin: true, + }, + zhaogujing: { + derivation: "ol_puyuan", + cardcolor: "diamond", + type: "equip", + subtype: "equip5", + ai: { + basic: { + equipValue: 6.5, + }, + }, + skills: ["zhaogujing_skill"], + fullskin: true, + }, + shufazijinguan: { + derivation: "ol_puyuan", + cardcolor: "diamond", + type: "equip", + subtype: "equip5", + modeimage: "boss", + ai: { + basic: { + equipValue: 8, + }, + }, + skills: ["shufazijinguan_skill"], + fullskin: true, + }, + xuwangzhimian: { + derivation: "ol_puyuan", + cardcolor: "club", + type: "equip", + fullskin: true, + subtype: "equip5", + modeimage: "boss", + skills: ["xuwangzhimian"], + ai: { + equipValue: 7, + }, + }, + hongmianbaihuapao: { + derivation: "ol_puyuan", + cardcolor: "club", + type: "equip", + subtype: "equip2", + modeimage: "boss", + ai: { + basic: { + equipValue: 4, + }, + }, + skills: ["hongmianbaihuapao_skill"], + fullskin: true, + }, + guofengyupao: { + derivation: "ol_puyuan", + cardcolor: "spade", + type: "equip", + fullskin: true, + modeimage: "boss", + subtype: "equip2", + skills: ["guofengyupao"], + ai: { + equipValue: 7, + }, + }, + qimenbagua: { + derivation: "ol_puyuan", + cardcolor: "spade", + type: "equip", + fullskin: true, + modeimage: "boss", + subtype: "equip2", + skills: ["qimenbagua"], + ai: { + equipValue: 7.5, + }, + }, + linglongshimandai: { + derivation: "ol_puyuan", + cardcolor: "spade", + type: "equip", + subtype: "equip2", + modeimage: "boss", + ai: { + basic: { + equipValue: 5, + }, + }, + skills: ["linglongshimandai_skill"], + fullskin: true, + }, + chixueqingfeng: { + derivation: "ol_puyuan", + cardcolor: "spade", + type: "equip", + fullskin: true, + modeimage: "boss", + subtype: "equip1", + distance: { attackFrom: -1 }, + skills: ["chixueqingfeng"], + ai: { + equipValue: 6.7, + }, + }, + guilongzhanyuedao: { + derivation: "ol_puyuan", + cardcolor: "spade", + type: "equip", + fullskin: true, + modeimage: "boss", + subtype: "equip1", + distance: { attackFrom: -2 }, + skills: ["guilongzhanyuedao"], + nomod: true, + nopower: true, + unique: true, + ai: { + equipValue: 4, + }, + }, + wushuangfangtianji: { + derivation: "ol_puyuan", + cardcolor: "diamond", + type: "equip", + modeimage: "boss", + subtype: "equip1", + distance: { + attackFrom: -3, + }, + ai: { + basic: { + equipValue: 3, + }, + }, + skills: ["wushuangfangtianji_skill"], + fullskin: true, + }, + bintieshuangji: { + derivation: "ol_puyuan", + cardcolor: "diamond", + type: "equip", + subtype: "equip1", + distance: { + attackFrom: -2, + }, + ai: { + basic: { + equipValue: 4.5, + }, + }, + skills: ["bintieshuangji_skill"], + fullskin: true, + }, + //王允 + wy_meirenji: { + fullskin: true, + vanish: true, + derivation: "wangyun", + type: "trick", + enable: true, + filterTarget: function (card, player, target) { + return target.countCards("h") && target != player && target.hasSex("male"); + }, + content: function () { + "step 0"; + event.list = game + .filterPlayer(function (current) { + return current != player && current != target && current.hasSex("female"); + }) + .sortBySeat(); + "step 1"; + if (target.countCards("h") && event.list.length) { + event.current = event.list.shift(); + event.current.gainPlayerCard(target, true, "h"); + target.line2([event.current, player]); + } else { + event.goto(4); + } + "step 2"; + event.current.chooseCard("h", true, "将一张手牌交给" + get.translation(player)); + "step 3"; + if (result.bool) { + event.current.give(result.cards, player); + } + event.goto(1); + "step 4"; + var n1 = target.countCards("h"); + var n2 = player.countCards("h"); + if (n1 > n2) { + target.damage(player); + player.line(target); + } else if (n1 < n2) { + player.damage(target); + target.line(player); + } + }, + ai: { + order: 6, + result: { + target: function (player, target) { + var num = game.countPlayer(function (current) { + return current != player && current != target && current.hasSex("female"); + }); + var nh = target.countCards("h"); + num = Math.min(num, nh); + var nh1 = nh - num; + var nh2 = player.countCards("h") - 1 + num; + if (nh1 == nh2 && num == 0) return 0; + if (nh2 <= nh1) return -3; + if (player.hp == 1 || num == 1) return 0; + return -1; + }, + }, + }, + }, + wy_xiaolicangdao: { + fullskin: true, + vanish: true, + derivation: "wangyun", + type: "trick", + enable: true, + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { + "step 0"; + var num = Math.min(5, target.maxHp - target.hp); + if (num) target.draw(num); + "step 1"; + target.damage(); + }, + ai: { + order: 6, + tag: { + damage: 1, + }, + result: { + target: function (player, target) { + var num = Math.min(5, target.maxHp - target.hp); + if (target.hp == 1) { + if (num >= 3) return 0; + if (!target.hasSkillTag("maixie_hp")) { + return -3; + } + return -1; + } + if (num == 2) return 0; + return -2 + num + (Math.pow(target.hp, 0.2) - 1); + }, + }, + }, + }, + zhuangshu_basic: { + fullskin: true, + vanish: true, + derivation: "fengfangnv", + cardcolor: "spade", + type: "equip", + subtype: "equip5", + skills: ["zhuangshu_basic"], + forceDie: true, + onLose: function () { + if ((!event.getParent(2) || event.getParent(2).name != "swapEquip") && (event.getParent().type != "equip" || event.getParent().swapEquip)) { + card.fix(); + card.remove(); + card.destroyed = true; + game.log(card, "被销毁了"); + } + }, + equipDelay: false, + loseDelay: false, + ai: { + equipValue: 5, + basic: { + equipValue: 5, + }, + }, + }, + zhuangshu_trick: { + fullskin: true, + vanish: true, + derivation: "fengfangnv", + cardcolor: "club", + type: "equip", + subtype: "equip5", + forceDie: true, + skills: ["zhuangshu_trick"], + onLose: function () { + if ((!event.getParent(2) || event.getParent(2).name != "swapEquip") && (event.getParent().type != "equip" || event.getParent().swapEquip)) { + card.fix(); + card.remove(); + card.destroyed = true; + game.log(card, "被销毁了"); + } + }, + equipDelay: false, + loseDelay: false, + }, + zhuangshu_equip: { + fullskin: true, + vanish: true, + derivation: "fengfangnv", + cardcolor: "heart", + type: "equip", + subtype: "equip5", + skills: ["zhuangshu_equip"], + forceDie: true, + inherit: "zhuangshu_basic", + onLose: function () { + if ((!event.getParent(2) || event.getParent(2).name != "swapEquip") && (event.getParent().type != "equip" || event.getParent().swapEquip)) { + card.fix(); + card.remove(); + card.destroyed = true; + game.log(card, "被销毁了"); + } + }, + equipDelay: false, + loseDelay: false, + }, +}; +export default cards; diff --git a/character/sp/character.js b/character/sp/character.js new file mode 100644 index 000000000..ca04ccc55 --- /dev/null +++ b/character/sp/character.js @@ -0,0 +1,178 @@ +const characters = { + sp_sunce: ["male", "qun", 4, ["olliantao"]], + ol_liupi: ["male", "qun", 4, ["olyicheng"]], + ol_lukai: ["male", "wu", 3, ["olxuanzhu", "oljiane"]], + liupan: ["male", "qun", 4, ["olpijing"]], + guotu: ["male", "qun", 3, ["olqushi", "olweijie"]], + ol_hujinding: ["female", "shu", 3, ["olqingyuan", "olchongshen"]], + tianchou: ["male", "qun", 4, ["olshandao"]], + liyi: ["male", "wu", 4, ["olchanshuang", "olzhanjin"]], + caoyu: ["male", "wei", 3, ["olgongjie", "olxiangxv", "olxiangzuo"]], + ol_liwan: ["female", "wei", 3, ["ollianju", "olsilv"]], + ol_dingshangwan: ["female", "wei", 3, ["olfudao", "olfengyan"]], + zhangyan: ["male", "qun", 4, ["olsuji", "ollangdao"]], + ol_tw_zhangji: ["male", "wei", 3, ["skill_zhangji_A", "skill_zhangji_B"], ["unseen"]], + ol_feiyi: ["male", "shu", 3, ["yanru", "hezhong"]], + lvboshe: ["male", "qun", 4, ["olfushi", "oldongdao"]], + ol_luyusheng: ["female", "wu", 3, ["olcangxin", "olrunwei"]], + caoxi: ["male", "wei", 3, ["olgangshu", "oljianxuan"]], + ol_pengyang: ["male", "shu", 3, ["olxiaofan", "oltuishi", "nzry_cunmu"]], + ol_qianzhao: ["male", "wei", 4, ["olweifu", "olkuansai"]], + niujin: ["male", "wei", 4, ["olcuorui", "liewei"]], + hejin: ["male", "qun", 4, ["mouzhu", "olyanhuo"]], + hansui: ["male", "qun", 4, ["olniluan", "olxiaoxi"]], + duanjiong: ["male", "qun", 4, ["olsaogu"]], + ol_zhouqun: ["male", "shu", 4, ["oltianhou", "olchenshuo"]], + ol_wenqin: ["male", "wei", 4, ["olguangao", "olhuiqi"]], + haopu: ["male", "shu", 4, ["olzhenying"]], + ol_mengda: ["male", "shu", 4, ["olgoude"]], + ol_wanglang: ["male", "wei", 3, ["gushe", "oljici"]], + ol_liuyan: ["male", "qun", "4/6", ["olpianan", "olyinji", "olkuisi"]], + lushi: ["female", "qun", 3, ["olzhuyan", "releijie"]], + zhangshiping: ["male", "shu", 3, ["olhongji", "olxinggu"]], + sunhong: ["male", "wu", 3, ["olxianbi", "olzenrun"]], + luoxian: ["male", "shu", 4, ["oldaili"]], + ol_huban: ["male", "wei", 4, ["olhuiyun"]], + wangguan: ["male", "wei", 3, ["olmiuyan", "olshilu"]], + ol_zhangyì: ["male", "shu", 4, ["oldianjun", "olkangrui"]], + ol_zhujun: ["male", "qun", 4, ["olcuipo"]], + maxiumatie: ["male", "qun", 4, ["mashu", "rekenshang"]], + dongtuna: ["male", "qun", 4, ["oljianman"]], + zhanghua: ["male", "jin", 3, ["olbihun", "oljianhe", "olchuanwu"]], + quhuang: ["male", "wu", 3, ["olqiejian", "olnishou"]], + macheng: ["male", "shu", 4, ["mashu", "olchenglie"]], + zhangzhi: ["male", "qun", 3, ["olbixin", "olximo"]], + ol_liuba: ["male", "shu", 3, ["oltongduo", "olzhubi"]], + ol_furong: ["male", "shu", 4, ["olxiaosi"]], + ahuinan: ["male", "qun", 4, ["jueman"]], + jin_guohuai: ["female", "jin", 3, ["zhefu", "yidu"]], + xiahouxuan: ["male", "wei", 3, ["olhuanfu", "olqingyi", "olzeyue"]], + dengzhong: ["male", "wei", 4, ["dzkanpo", "dzgengzhan"]], + wangyan: ["male", "jin", 3, ["yangkuang", "cihuang", "sanku"]], + huojun: ["male", "shu", 4, ["qiongshou", "fenrui"]], + caoxiancaohua: ["female", "qun", 3, ["huamu", "qianmeng", "liangyuan", "jisi"]], + jin_zhouchu: ["male", "jin", 4, ["shanduan", "yilie"]], + zhaoyǎn: ["male", "wei", 4, ["tongxie"]], + ol_puyuan: ["male", "shu", 4, ["olshengong", "olqisi"]], + ruiji: ["female", "wu", 3, ["qiaoli", "qingliang"]], + weizi: ["male", "qun", 3, ["yuanzi", "liejie"]], + tengfanglan: ["female", "wu", 3, ["luochong", "aichen"]], + sp_menghuo: ["male", "qun", 4, ["spmanwang"]], + jin_yanghu: ["male", "jin", 4, ["huaiyuan", "chongxin", "dezhang"]], + qinghegongzhu: ["female", "wei", 3, ["zengou", "qhzhangji"]], + fanjiangzhangda: ["male", "wu", 4, ["yuanchou", "juesheng"]], + tianyu: ["male", "wei", 4, ["saodi", "zhuitao"]], + ol_chendeng: ["male", "qun", 4, ["olfengji"]], + ol_zhuling: ["male", "wei", 4, ["jixian"]], + wuyan: ["male", "wu", 4, ["lanjiang"]], + sp_ol_zhanghe: ["male", "qun", 4, ["spolzhouxuan"]], + ol_dongzhao: ["male", "wei", 3, ["olxianlve", "olzaowang"]], + fengfangnv: ["female", "qun", 3, ["zhuangshu", "chuiti"]], + ol_yangyi: ["male", "shu", 3, ["oljuanxia", "oldingcuo"]], + zuofen: ["female", "jin", 3, ["zhaosong", "lisi"]], + ol_wangrong: ["female", "qun", 3, ["olfengzi", "oljizhan", "olfusong"]], + ol_dengzhi: ["male", "shu", 3, ["olxiuhao", "olsujian"]], + ol_bianfuren: ["female", "wei", 3, ["fuwei", "yuejian"]], + duxi: ["male", "wei", 3, ["quxi", "bixiong"]], + gaogan: ["male", "qun", 4, ["juguan"]], + huangchengyan: ["male", "qun", 3, ["guanxu", "yashi"]], + huangzu: ["male", "qun", 4, ["wangong"]], + panshu: ["female", "wu", 3, ["weiyi", "jinzhi"]], + wolongfengchu: ["male", "shu", 4, ["youlong", "luanfeng"]], + sp_zhangliao: ["male", "qun", 4, ["mubing", "ziqu", "diaoling"]], + caoshuang: ["male", "wei", 4, ["retuogu", "shanzhuan"]], + ol_zhangchangpu: ["female", "wei", 3, ["yanjiao", "olxingshen"]], + zhangling: ["male", "qun", 3, ["zlhuji", "zlshoufu"]], + caiyang: ["male", "qun", 1, ["yinka", "zhuixi"], ["forbidai", "unseen"]], + sunshao: ["male", "wu", 3, ["bizheng", "yidian"]], + + huangfusong: ["male", "qun", 4, ["fenyue"]], + yuantanyuanshang: ["male", "qun", 4, ["neifa"]], + xujing: ["male", "shu", 3, ["yuxu", "xjshijian"]], + + jianggan: ["male", "wei", 3, ["weicheng", "daoshu"]], + + caoying: ["female", "wei", 4, ["xinfu_lingren", "fujian"], []], + simahui: ["male", "qun", 3, ["jianjie", "xinfu_chenghao", "xinfu_yinshi"], []], + baosanniang: ["female", "shu", 4, ["olwuniang", "olxushen"], []], + + yangxiu: ["male", "wei", 3, ["jilei", "danlao"]], + chenlin: ["male", "wei", 3, ["bifa", "songci"]], + caohong: ["male", "wei", 4, ["yuanhu"]], + xiahouba: ["male", "shu", 4, ["baobian"]], + yuanshu: ["male", "qun", 4, ["yongsi", "weidi"]], + sp_diaochan: ["female", "qun", 3, ["lihun", "rebiyue"]], + sp_zhaoyun: ["male", "qun", 3, ["ollongdan", "chongzhen"]], + liuxie: ["male", "qun", 3, ["tianming", "mizhao", "twzhuiting"], ["zhu"]], + zhugejin: ["male", "wu", 3, ["olhuanshi", "olhongyuan", "olmingzhe"]], + zhugeke: ["male", "wu", 3, ["aocai", "duwu"]], + guanyinping: ["female", "shu", 3, ["huxiao", "xueji", "wuji"]], + simalang: ["male", "wei", 3, ["junbing", "quji"]], + zhangxingcai: ["female", "shu", 3, ["shenxian", "qiangwu"]], + fuwan: ["male", "qun", 4, ["dcmoukui"]], + sp_sunshangxiang: ["female", "shu", 3, ["liangzhu", "fanxiang"]], + caoang: ["male", "wei", 4, ["kaikang"]], + sp_caoren: ["male", "wei", 4, ["weikui", "lizhan"]], + zhangbao: ["male", "qun", 3, ["rezhoufu", "reyingbing"]], + maliang: ["male", "shu", 3, ["zishu", "yingyuan"]], + zhugedan: ["male", "wei", 4, ["gongao", "juyi"]], + sp_jiangwei: ["male", "wei", 4, ["kunfen", "fengliang"]], + sp_machao: ["male", "qun", 4, ["olzhuiji", "ol_shichou"]], + sunhao: ["male", "wu", 5, ["recanshi", "rechouhai", "guiming"], ["zhu"]], + shixie: ["male", "qun", 3, ["olbiluan", "relixia"]], + mayunlu: ["female", "shu", 4, ["fengpo", "mashu"]], + zhanglu: ["male", "qun", 3, ["yishe", "bushi", "midao", "twshijun"], ["zhu"]], + wutugu: ["male", "qun", 15, ["ranshang", "hanyong"]], + sp_caiwenji: ["female", "wei", 3, ["chenqing", "mozhi"]], + zhugeguo: ["female", "shu", 3, ["qirang", "yuhua"]], + + lingju: ["female", "qun", 3, ["jieyuan", "fenxin"]], + + cuiyan: ["male", "wei", 3, ["yawang", "xunzhi"]], + jsp_guanyu: ["male", "wei", 4, ["new_rewusheng", "danji"]], + jsp_huangyueying: ["female", "qun", 3, ["jiqiao", "linglong"]], + sunluyu: ["female", "wu", 3, ["new_meibu", "new_mumu"]], + hanba: ["female", "qun", 4, ["fentian", "zhiri"]], + zumao: ["male", "wu", 4, ["yinbing", "juedi"]], + wenpin: ["male", "wei", 4, ["zhenwei"]], + daxiaoqiao: ["female", "wu", 3, ["new_xingwu", "new_luoyan"]], + + guansuo: ["male", "shu", 4, ["zhengnan", "xiefang"]], + tadun: ["male", "qun", 4, ["reluanzhan"]], + yanbaihu: ["male", "qun", 4, ["zhidao", "jili"]], + chengyu: ["male", "wei", 3, ["shefu", "benyu"]], + + sp_pangde: ["male", "wei", 4, ["mashu", "juesi"]], + sp_jiaxu: ["male", "wei", 3, ["zhenlue", "jianshu", "yongdi"]], + + litong: ["male", "wei", 4, ["tuifeng"]], + mizhu: ["male", "shu", 3, ["ziyuan", "jugu"]], + buzhi: ["male", "wu", 3, ["hongde", "dingpan"]], + + caochun: ["male", "wei", 4, ["xinshanjia"]], + + dongbai: ["female", "qun", 3, ["lianzhu", "xiehui"]], + + zhaoxiang: ["female", "shu", 4, ["fanghun", "fuhan"]], + mazhong: ["male", "shu", 4, ["fuman"]], + dongyun: ["male", "shu", 3, ["bingzheng", "sheyan"]], + kanze: ["male", "wu", 3, ["xiashu", "kuanshi"]], + heqi: ["male", "wu", 4, ["olqizhou", "olshanxi"]], + + yuejin: ["male", "wei", 4, ["xiaoguo"]], + sp_dongzhuo: ["male", "qun", 5, ["hengzheng"]], + hetaihou: ["female", "qun", 3, ["zhendu", "qiluan"]], + dingfeng: ["male", "wu", 4, ["reduanbing", "refenxun"]], + shamoke: ["male", "shu", 4, ["gzjili"]], + + zhangren: ["male", "qun", 4, ["chuanxin", "zfengshi"]], + + wangyun: ["male", "qun", 4, ["xinlianji", "xinmoucheng"], ["clan:太原王氏"]], + sunqian: ["male", "shu", 3, ["qianya", "shuimeng"]], + xizhicai: ["male", "wei", 3, ["tiandu", "xianfu", "chouce"]], + quyi: ["male", "qun", 4, ["fuqi", "jiaozi"]], + + luzhi: ["male", "wei", 3, ["qingzhong", "weijing"]], +}; + +export default characters; diff --git a/character/sp/characterFilter.js b/character/sp/characterFilter.js new file mode 100644 index 000000000..828a7ec91 --- /dev/null +++ b/character/sp/characterFilter.js @@ -0,0 +1,15 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const characterFilters = { + tianyu(mode) { + return mode != "chess" && mode != "tafang" && mode != "stone"; + }, + ol_dongzhao(mode) { + return mode == "identity" && ["normal", "zhong"].includes(_status.mode); + }, + ol_mengda(mode) { + return mode !== "guozhan"; + }, +}; + +export default characterFilters; diff --git a/character/sp/characterReplace.js b/character/sp/characterReplace.js new file mode 100644 index 000000000..650f87546 --- /dev/null +++ b/character/sp/characterReplace.js @@ -0,0 +1,66 @@ +const characterReplaces = { + guanyinping: ["guanyinping", "old_guanyinping"], + shixie: ["shixie", "dc_shixie", "old_shixie"], + caoshuang: ["caoshuang", "dc_caoshuang", "ns_caoshuang"], + caoang: ["caoang", "yj_caoang", "tw_caoang"], + caohong: ["caohong", "tw_re_caohong", "tw_caohong", "yj_caohong"], + xiahouba: ["xiahouba", "dc_xiahouba", "tw_xiahouba"], + maliang: ["maliang", "re_maliang", "tw_maliang", "ol_maliang", "old_maliang"], + dingfeng: ["dingfeng", "tw_dingfeng", "old_dingfeng"], + zumao: ["zumao", "tw_zumao"], + tw_beimihu: ["beimihu", "tw_beimihu"], + panfeng: ["panfeng", "re_panfeng", "std_panfeng"], + sunluyu: ["sunluyu", "re_sunluyu", "mb_sunluyu"], + jin_simazhao: ["jin_simazhao", "simazhao", "sp_simazhao"], + jin_wangyuanji: ["jin_wangyuanji", "wangyuanji", "sp_wangyuanji"], + wangyun: ["clan_wangyun", "wangyun", "dc_wangyun", "re_wangyun", "jsrg_wangyun", "old_wangyun", "pe_wangyun"], + zhangliang: ["xin_zhangliang", "re_zhangliang", "zhangliang"], + lingju: ["lingju", "old_lingju"], + guansuo: ["guansuo", "dc_guansuo"], + zhangxingcai: ["zhangxingcai", "old_zhangxingcai"], + lisu: ["ol_lisu", "lisu"], + fuwan: ["fuwan", "tw_fuwan", "sp_fuwan"], + huaxin: ["ol_huaxin", "huaxin", "sp_huaxin"], + xujing: ["xujing", "dc_xujing", "sp_xujing", "tw_xujing"], + zhaoxiang: ["zhaoxiang", "dc_zhaoxiang", "tw_zhaoxiang"], + dengzhi: ["ol_dengzhi", "re_dengzhi", "dengzhi", "tw_dengzhi"], + wangrong: ["ol_wangrong", "wangrong"], + zongyu: ["zongyu", "sp_zongyu", "tw_zongyu"], + ol_dongzhao: ["ol_dongzhao", "dc_dongzhao", "tw_dongzhao"], + mayunlu: ["mayunlu", "tw_mayunlu"], + zhuling: ["ol_zhuling", "dc_zhuling", "zhuling"], + zangba: ["zangba", "tw_zangba"], + zhangbao: ["zhangbao", "re_zhangbao"], + jianggan: ["jianggan", "sp_jianggan"], + dc_jiben: ["dc_jiben", "sp_jiben"], + yangyi: ["ol_yangyi", "yangyi", "tw_yangyi"], + tianyu: ["tianyu", "tw_tianyu"], + huangchengyan: ["huangchengyan", "dc_huangchengyan"], + puyuan: ["ol_puyuan", "puyuan"], + huangzu: ["huangzu", "dc_huangzu"], + huojun: ["huojun", "dc_huojun", "xin_huojun", "tw_huojun"], + zhaoyǎn: ["zhaoyǎn", "dc_zhaoyǎn"], + furong: ["ol_furong", "furong", "tw_furong"], + daxiaoqiao: ["daxiaoqiao", "dc_daxiaoqiao", "tw_daxiaoqiao"], + zhugeguo: ["zhugeguo", "tw_zhugeguo"], + wanglang: ["ol_wanglang", "wanglang", "old_wanglang"], + tengfanglan: ["tengfanglan", "dc_tengfanglan"], + zhangyì: ["ol_zhangyì", "zhangyì"], + yuantanyuanshang: ["yuantanyuanshang", "yuantanyuanxiyuanshang"], + ruiji: ["ruiji", "dc_ruiji"], + jsp_huangyueying: ["jsp_huangyueying", "re_jsp_huangyueying"], + ganfuren: ["ganfuren", "dc_ganfuren", "jsp_ganfuren"], + zhouqun: ["ol_zhouqun", "zhouqun"], + qianzhao: ["ol_qianzhao", "qianzhao"], + ol_pengyang: ["ol_pengyang", "sp_pengyang"], + ol_luyusheng: ["ol_luyusheng", "luyusheng"], + fanjiangzhangda: ["fanjiangzhangda", "jsrg_fanjiangzhangda"], + simalang: ["re_simalang", "simalang"], + zhugedan: ["re_zhugedan", "zhugedan"], + zhangren: ["jsrg_zhangren", "zhangren"], + wenqin: ["ol_wenqin", "pe_wenqin"], + lukai: ["ol_lukai", "lukai"], + liupi: ["ol_liupi", "liupi"], +}; + +export default characterReplaces; diff --git a/character/sp/dynamicTranslate.js b/character/sp/dynamicTranslate.js new file mode 100644 index 000000000..4b0d4db01 --- /dev/null +++ b/character/sp/dynamicTranslate.js @@ -0,0 +1,91 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + shanduan(player) { + if (player.storage.shanduan) return "锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[" + get.translation(player.storage.shanduan) + "]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。"; + return "锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[1,2,3,4]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。"; + }, + kunfen(player) { + if (player.storage.kunfen) return "结束阶段开始时,你可以失去1点体力,然后摸两张牌。"; + return "锁定技,结束阶段开始时,你失去1点体力,然后摸两张牌。"; + }, + jieyuan(player) { + var str = "当你对一名其他角色造成伤害时,"; + if (!player.hasSkill("fenxin_fan")) str += "若其体力值大于或等于你的体力值,"; + str += "你可弃置一张"; + if (!player.hasSkill("fenxin_nei")) str += "黑色手"; + str += "牌,令此伤害+1;当你受到一名其他角色造成的伤害时,"; + if (!player.hasSkill("fenxin_zhong")) str += "若其体力值大于或等于你的体力值,"; + str += "你可弃置一张"; + if (!player.hasSkill("fenxin_nei")) str += "红色手"; + str += "牌,令此伤害-1。"; + return str; + }, + youlong(player) { + if (player.storage.youlong) return '转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。'; + return '转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。'; + }, + luochong(player) { + var storage = player.getStorage("luochong"); + var str = "准备阶段开始时/当你于一回合首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):"; + var choiceList = ["⒈令一名角色回复1点体力。", "⒉令一名角色失去1点体力。", "⒊令一名角色弃置两张牌。", "⒋令一名角色摸两张牌。"]; + for (var i = 0; i < 4; i++) { + if (storage.includes(i)) { + choiceList[i] = '' + choiceList[i] + ""; + } + str += choiceList[i]; + } + return str; + }, + spmanwang(player) { + var num = 4 - player.countMark("spmanwang"); + var str = "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前等量项:"; + var list = ["⒈获得〖叛侵〗。", "⒉摸一张牌。", "⒊回复1点体力。", "⒋摸两张牌并失去〖叛侵〗。"]; + for (var i = 0; i < 4; i++) { + if (i == num) { + str += ''; + } + str += list[i]; + } + if (num < 4) str += ""; + return str; + }, + olbixin(player) { + var count = player.countMark("olbixin"); + if (count < 3) return lib.translate.olbixin_info.slice(count * 5); + return "你可以声明一种牌的类型(每种类型限[3]次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸[1]张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。"; + }, + olfeibai(player) { + if (player.storage.olfeibai) return '转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。'; + return '转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。'; + }, + olmiuyan(player) { + if (player.storage.olmiuyan) return '转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。'; + return '转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。'; + }, + olsaogu(player) { + if (player.storage.olsaogu) return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。'; + return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。'; + }, + oldongdao(player) { + if (player.storage.oldongdao) return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。'; + return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。'; + }, + ollangdao(player) { + var str = "当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:"; + var list = ["1.令此【杀】伤害基数+1;", "2.令你可以为此【杀】多选择一个目标;", "3.令此【杀】不可被响应。"]; + var storage = player.getStorage("ollangdao"); + list.forEach((item, index) => { + if (storage.includes(index)) { + str += `${item}`; + } else str += item; + }); + str += "然后若没有角色因此【杀】死亡,你移除本次被选择的项。"; + return str; + }, + olxuanzhu(player) { + if (player.storage.olxuanzhu) return '转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; + return '转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; + }, +}; +export default dynamicTranslates; diff --git a/character/sp/index.js b/character/sp/index.js new file mode 100644 index 000000000..5f1e699e1 --- /dev/null +++ b/character/sp/index.js @@ -0,0 +1,34 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "sp", + connect: true, + character: { ...characters }, + characterSort: { + sp: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/sp/intro.js b/character/sp/intro.js new file mode 100644 index 000000000..3ce4474b5 --- /dev/null +++ b/character/sp/intro.js @@ -0,0 +1,159 @@ +const characterIntro = { + liupan: "刘磐(生卒年不详),山阳高平人,荆州牧刘表从子。与南阳人黄忠共守长沙攸县。为人骁勇,数次为寇于艾、西安诸县。江东孙策于是分海昏、建昌为左右六县,以东莱太史慈为建昌都尉,治海昏,并督诸将共拒刘磐。于是刘磐绝迹不复为寇。", + guotu: "郭图(?-205年),字公则,颍川(治今河南省禹州市)人。东汉末年袁绍帐下谋士。韩馥统冀州时,郭图与荀谌等人奉袁绍之命,说服韩馥让位。袁绍统一河北后,郭图与审配等人力劝袁绍统率大军攻打曹操。袁绍死后,袁尚继位。郭图与辛评为袁谭效力,挑唆袁谭攻击袁尚。建安十年(205年),郭图和袁谭一同被曹操所杀。", + tianchou: "田畴(169年或170年-214年或216年),字子泰,东汉右北平郡无终人,东汉末年隐士。田畴好文习武。汉初平年间,其受刘虞派遣去长安,呈送指控公孙赞奏章,献帝大悦,封为骑都尉,田畴不受。携诏返回时,刘虞已被公孙所杀,田畴到刘墓祭拜,被公孙所提,不久释放。田畴回故乡后率家族及随从数百人隐居徐无山,致力农桑,数年间增至5000家。制定法条,兴建学校,一时民风良好,乌桓、鲜卑纷纷与其结交。汉建安二十年(207年),曹操北征乌桓,田畴请为向导。上徐无山、出卢龙、过平冈、登白狼堆、至柳城,曹军大胜,封田畴为亭侯,坚辞不受。曹念田功,四次封赏,终不受,乃拜为议郎。建安二十一年(216年),田畴去世。", + liyi: "李异(生卒年不详),三国时期东吴将领。建安末,与谢旌率水陆三千,击破刘备军将领詹晏、陈凤。刘备领兵攻孙权时,李异与陆逊等人屯巫、秭归,为蜀将所破。黄武元年(222年),陆逊破刘备于猇亭,李异追踪蜀军,屯驻南山。清代学者赵一清认为此李异与刘璋部将李异为同一人。", + caoyu: "曹宇(?-278年),字彭祖,沛国谯县(今安徽亳州)人。三国时期魏国宗室,魏武帝曹操与环夫人之子,邓哀王曹冲同母兄弟。太和六年,封为燕王。魏明帝病危,欲以大将军辅政,不果。其子常道乡公曹奂,是魏国末代皇帝,史称魏元帝。晋朝建立后,降封燕公。咸宁四年(278年),曹宇去世。", + zhangyan: "张燕,本姓褚,生卒年不详,常山真定(今河北正定南)人,东汉末年黑山军首领。张燕剽捍,敏捷过人,军中称为“飞燕”。官渡之战时投降曹操,被任命为平北将军,封安国亭侯。死后其子张方袭爵。", + lushi: "卢氏,五斗米教主张衡妻,张鲁母,擅长驻颜之术,常年令自己保持少女的容颜。常拜访刘焉,与其交好。", + lvboshe: "吕伯奢,东汉成皋(今河南荥阳)人,曹操父亲曹嵩的故友。曹操与陈宫在逃离董卓避祸,返回乡里的途中借宿于吕伯奢家,未伤其人,有贼八人欲捉曹操,曹操杀之,明罗贯中在历史小说《三国演义》中将这段历史进行了丑化加工,也成为小说中曹操名言“宁教我负天下人,休教天下人负我”的出处。", + caoxi: "曹羲(?-249年),字昭叔。曹真之子,曹爽之弟。为人有学识,明律法。司马懿曾组织朝议改革九品中正制废除九品而留中正,曹羲认为此举并无区别,最终都是决定于人的人治。曹爽掌权后,受封中领军,掌握禁兵,封安乡侯。曹爽及诸兄弟轻视司马懿,恣意妄为,经常外出狩猎,曹羲屡次劝谏,不被采纳。249年,司马懿发动高平陵政变,被夷三族。", + duanjiong: "段颎(?-179年),字纪明,武威姑臧(今甘肃省武威市)人。东汉名将,西域都护段会宗从曾孙,与皇甫规(字威明)、张奂(字然明)并称“凉州三明”。段颎少时学习骑射,有文武智略,最初被举为孝廉,为宪陵园丞、阳陵令,有治理之才。汉桓帝时入军旅,先破鲜卑,后讨平东郭窦、公孙举起事,以功封列侯。延熹二年(159年)起戍边征战十余年,百战羌人,至永康元年(167年)平定西羌,建宁二年(169年)平定东羌,前后斩东西羌六万余级。累功封新丰县侯。建宁三年(170年),段颎被征入朝,历任侍中、执金吾、河南尹、司隶校尉等职,他党附宦官、捕杀太学生,因而得保富贵,两度出任太尉。光和二年(179年),权宦王甫罪行被揭发,段颎受牵连下狱,其后在狱中饮鸩而死。", + haopu: "郝普,字子太,义阳(治所在今湖北枣阳东南)人。刘备入川后,郝普为零陵太守。建安二十年(215年),吴将吕蒙进攻荆州三郡,唯有郝普坚守待援。但援兵久久不至,其挚友邓玄之又被吕蒙所骗,郝普也因此上当,投降吴国。湘水划界后,郝普回归刘备。建安二十四年(219年),吕蒙再次袭击荆州,击败关羽,郝普再次投降,最终归顺吴国并官至廷尉。郝普与隐蕃亲善,隐蕃蓄谋叛变事情败露,他受到牵连,因此自杀。在刘备集团的5个荆州郡守中,郝普是唯一一个抵抗过东吴的荆州郡守。", + ol_zhanghe: "字儁乂,河间鄚人。三国时期魏国名将。官渡之战时,本为袁绍部将的张郃投降了曹操,并在曹操帐下多立功勋,于曹魏建立后加封为征西车骑将军。诸葛亮六出祁山之间,张郃多次抵御蜀军的进攻,于公元231年在木门道被诸葛亮设伏射死。后谥曰壮侯。为曹魏“五子良将”之一。", + zhangshiping: "张世平是东汉末期的中山商人,曾与苏双同路,资助刘备组织武装、建立政权。于《三国演义》第一回出场,刘关张桃园三结义时资助刘备良马五十匹,金银五百两,镔铁一千斤。刘备所使用的“双股剑”、关羽所使用的“青龙偃月刀(又名‘冷艳锯’)”、张飞所使用的“丈八点钢矛(又名‘丈八蛇矛’)”皆由这一千斤上好镔铁打造而成。", + luoxian: "罗宪(218年—270年),字令则,荆州襄阳(今湖北襄阳)人。西晋开国将领,巴东太守(郡府在永安白帝城)。于蜀汉灭亡后降魏,成功抵御孙吴的入侵,守住入魏国的要冲永安。后仕晋官至冠军将军、假节,封西鄂县侯。泰始六年(270年)去世,谥烈侯。", + sunhong: "孙弘(?—252年),三国时期吴国大臣,扬州会稽(今浙江省绍兴市)人。官至吴国中书令、少傅。鲁王孙霸与太子孙和各植党羽,孙弘即依附孙霸。孙权病笃,而太子年少,于是以孙弘领少傅。孙权临终,召他与诸葛恪、孙峻等嘱以后事,孙弘与诸葛恪同为顾命大臣。孙权死后,孙弘因素来与诸葛恪不和,怕为所治,故而隐瞒了孙权的死讯,欲矫诏除掉诸葛恪,被孙峻告发。后诸葛恪请孙弘议事,于座中将其诛杀。", + wangguan: "《三国演义》中虚构人物,历史上不曾记载。在114回出场,曾为邓艾手下参谋,献反间计与邓艾,被姜维识破,兵败自投江而死。", + maxiumatie: "马休(?-212年),马铁(?-212年)。两人均为扶风茂陵(今陕西兴平)人,马腾之子,马超之弟。马腾遭韩遂进攻,乃携马休、马铁等入京受职。马休被封为奉车都尉,马铁被封为骑都尉。后在邺城居住。因兄马超反,两人被曹操夷灭。", + dongtuna: "董荼那,小说《三国演义》及其衍生作品中的角色,南蛮王孟获属下大将,第二洞元帅;与阿会喃等人一起担任孟获的援军出征,但是被俘虏,又被诸葛亮释放,再次出战时,被唾骂不知羞耻,面红耳赤的退军。后同阿会喃共同绑架孟获献于蜀军,却被诸葛亮在其二人与孟获的重要性间权衡后出卖了他们,放走了孟获,使其为孟获所杀。", + zhanghua: "张华(232年-300年),字茂先。范阳郡方城县(今河北固安)人。西晋时期政治家、文学家、藏书家,西汉留侯张良的十六世孙。张华出身范阳张氏,自少贫苦,因才学过人而受同乡名臣卢钦、刘放、阮籍等人的赞赏。在曹魏时,他历任太常博士、河南尹丞、佐著作郎、中书郎等职。西晋建立后,拜黄门侍郎,封关内侯,逐渐受到晋武帝的重用。后拜中书令,加散骑常侍,与大将杜预坚决支持武帝伐吴,于战时任度支尚书。吴国灭亡后,以功进封广武县侯。其后遭到排挤,出镇幽州,政绩卓然。之后返朝任太常,终武帝之世未得参与政事。晋惠帝继位后,累官至司空,封壮武郡公,被皇后贾南风委以朝政。张华尽忠辅佐,使天下仍然保持相对安宁。永康元年(300年),♯♯司马伦发动政变,张华惨遭杀害,年六十九。太安二年(303年),获得♯♯,追复官爵。张华工于诗赋,词藻华丽,又雅爱书籍,精于目录学,编纂有中国第一部博物学著作《博物志》;还曾与荀勖等人依照刘向《别录》整理典籍。《宣和书谱》载有其草书《得书帖》及行书《闻时帖》。《隋书·经籍志》有《张华集》十卷,今已佚。明人张溥辑有《张茂先集》。", + quhuang: "屈晃(?—251),祖籍汝南(今河南省汝南县),汉末避乱南下,三国吴时居章安(今属椒江区)。初为郡吏,在职清廉,颇有政声。赤乌初年,擢为尚书仆射。", + macheng: "马承,蜀汉骠骑将军马超之子。仕蜀汉,马超死后继承其斄乡侯爵位。", + zhangzhi: "张芝(?—192年),字伯英,敦煌郡渊泉县(今甘肃省瓜州县)人。东汉书法家、“草书之祖”,大司农张奂的儿子。出身名门,拒绝朝廷征召,潜心研习书法。擅长草书中的章草,将古代当时字字区别、笔画分离的草法,改为上下牵连富于变化的新写法,富有独创性,在当时影响很大。李志敏评价:“张芝创造了草书问世以来的第一座高峰,精熟神妙,兼善章今”。 没有真迹传世,仅存《八月帖》等刻帖。汉献帝初平三年,去世于家中,著有《笔心论》,与钟繇、王羲之和王献之并称“书中四贤”。", + ahuinan: "阿会喃,小说《三国演义》及其衍生作品中的角色,南蛮王孟获属下大将,第三洞元帅;与董荼那等人一起担任孟获的援军出征,但是被俘虏,又被诸葛亮释放,再次出战时,被唾骂不知羞耻,面红耳赤的退军。后同董荼那共同绑架孟获献于蜀军,却被诸葛亮在其二人与孟获的重要性间权衡后出卖了他们,放走了孟获,使其为孟获所杀。", + xiahouxuan: "夏侯玄(209年~254年),字泰初(《三国志》等作太初),沛国谯县(今安徽省亳州市)人。三国时期曹魏大臣、思想家、文学家,征南大将军夏侯尚之子,大将军曹爽的表弟。夏侯玄少年有名望,仪表出众,时人称为“朗朗如日月之入怀”。魏文帝黄初六年(225年),袭封昌陵乡侯。魏明帝时,历任散骑黄门侍郎、羽林监。少帝曹芳继位后,拜散骑常侍、中护军,保卫皇宫。后任征西将军,任内与曹爽策划骆谷之役,大失人心。高平陵政变后,被夺去兵权,改任大鸿胪、太常卿。嘉平六年(254年),中书令李丰与外戚张缉密谋杀死大将军司马师,改以夏侯玄执政。事泄被杀,夷灭三族,夏侯玄死时年仅四十六岁。著有文集三卷,如今已佚。政治上,提出了“审官择人”、“除重官”、“改服制”等制度,被太傅司马懿评价“皆大善”。博学多识,才华出众,精通玄学,成为“四聪”之一,与何晏等人开创了魏晋玄学的先河,是早期的玄学领袖人物。", + dengzhong: "邓忠(不详-264年),三国时期曹魏名将邓艾之子。景元五年(264年),钟会谋反事败,士兵哗变,钟会被杀,邓艾部将想追还邓艾父子,但卫瓘却派田续追邓艾,于绵竹西相遇,将邓艾和邓忠等人杀死。直至泰始九年(273年)才恢复名节。", + wangyan: "王衍(256年~311年),字夷甫,琅邪郡临沂县(今山东省临沂市)人。西晋末年重臣,玄学清谈领袖,曹魏幽州刺史王雄之孙、平北将军王乂之子、司徒王戎堂弟。王衍出身琅琊王氏。外表清明俊秀,风姿安详文雅,笃好老庄学说,颇有时名。步入仕途后,历任黄门侍郎、中领军、尚书令、尚书仆射等职。光熙元年(307年),升任司空。次年,又任司徒。王衍位高权重,却不思为国,为保全自己,还让弟弟王澄、族弟王敦分任荆州、青州刺史,遭时人鄙夷。王弥进攻洛阳时,王衍率军抵抗。其后转任太尉兼尚书令,又兼领太傅军司。永嘉五年(311年),东海王司马越去世,王衍奉其灵柩返回东海,途中为羯人石勒所俘获。王衍在与石勒交谈时,仍推脱责任,并劝其称帝,石勒大怒,将其与西晋旧臣一同活埋,时年五十六岁。王衍工书法,尤擅行书,《宣和书谱》有其作品《尊夫人帖》。", + caoxiancaohua: "请分别查看「曹宪」和「曹华」的武将介绍。", + zhaoyǎn: "赵俨(171~245年),字伯然,颍川阳翟(今河南禹州市)。东汉末年颍川“四大名士”之一,三国时期魏国名臣。熟读经史,精明强干。建安二年,投靠大将军曹操之后,起家朗陵县令,历任司空府掾、司空主薄、都督护军、扶风太守等职。魏文帝曹丕继位后,历任魏国侍中、驸马都尉、河东太守、典农中郎将、度支尚书,封宜土亭侯。魏明帝曹睿时期,历任大司农、骠骑将军、大司空等职。正始六年,去世,时年七十五,谥号为穆。", + ruiji: "芮姬,芮玄之女,太子孙登妃,黄武五年卒。", + weizi: "卫兹(?-190年),字子许,(《三国演义》中其名为卫弘,当为误记),陈留襄邑(今河南睢县)人。曾举孝廉,先后被车骑将军何苗、司徒杨赐等召辟。中平六年(189年)十二月,曹操在陈留己吾募兵,而卫兹以家财资助曹操,使曹操顺利募得五千士兵。此后,卫兹与曹操共同讨伐董卓。初平元年(190年),卫兹在跟随曹操讨伐董卓途中,于荥阳汴水遭遇董卓军徐荣,力战终日,失利身亡。", + tengfanglan: "滕芳兰,生卒年不详,北海剧县(今山东省寿光市)人,太常滕胤的族女,滕牧的女儿,吴末帝孙皓的皇后。永安元年(258年),孙皓为乌程侯时被聘为妃。元兴元年(264年),孙皓登基后被立为皇后。孙吴灭亡后,随孙皓迁居洛阳。", + qinghegongzhu: "清河长公主,沛国谯县人,曹操长女(按其与曹操长子曹昂同出于刘夫人,而刘夫人又早死,故其年龄应长于曹丕等其他曹操诸子女,又按长公主亦有年最长之意,故应为曹操之长女)。母刘夫人,得到曹操喜爱。清河公主后来下嫁夏侯楙。曹操初欲嫁丁仪,曹丕劝其嫁与夏侯楙。后与小叔子设计欲谋害丈夫,未果。", + fanjiangzhangda: "范强,在明朝小说《三国演义》里叫做范疆。二人均为张飞手下部将。蜀汉章武元年,刘备伐吴,张飞率军从阆中前往江州,出发前,范强和张达杀死张飞,带着张飞的首级投奔了东吴。", + tianyu: "田豫(171年~252年),字国让,渔阳雍奴(今天津市武清区)人。三国时期曹魏将领。初从刘备,因母亲年老回乡,后跟随公孙瓒,公孙瓒败亡,劝说鲜于辅加入曹操。曹操攻略河北时,田豫正式得到曹操任用,历任颖阴、郎陵令、弋阳太守等。后来田豫常年镇守曹魏北疆,从征代郡乌桓、斩骨进、破轲比能,多有功勋;也曾参与对孙吴的作战,在成山斩杀周贺,于新城击败孙权。官至太中大夫,封长乐亭侯。有一子田彭祖。", + wuyan: "吴国及西晋初年将领。初任通江县吏,后得到大司马陆抗的提拔重用,逐渐升至建平太守。", + fengfangnv: "冯方之女,司隶人,袁术妻妾。在史书中被记载为天姿国色的美人。钱大昭在《三国志辨疑》中认为冯方当为冯芳误字,冯方女实为是西园八校尉之一的冯芳的女儿。然而,在曹丕《典论》、《九州春秋》等书籍都有提及她,皆作冯方女字样,并无一书写作冯芳女或是明提是冯芳之女。最关键的一点是,冯芳是荆州西陵县人,她女儿不可能是司隶籍,冯芳也没担任过任何与司隶有关的官职。同时期名字为“○女”的并不少见,如施绩女儿施淑女,曹植女儿曹行女,夏侯令女等。", + zuofen: "左芬(约253年-300年4月23日),出土墓志作左棻,字兰芝,齐国临淄(今山东临淄)人,西晋诗人。少好学,善属文。为晋武帝贵人。今存诗、赋、颂、赞、诔等20余篇,大都为应诏而作,《离思赋》最著名。原有集,已失传。", + duxi: "杜袭(生卒年不详),字子绪,颍川郡定陵县(今河南省襄城县)人。三国时期魏国重臣,东汉末年颍川“四大名士”之一,济阴太守杜根的孙子。建安初年,投奔司空曹操,历任西鄂县令、议郎、丞相军咨祭酒、魏王侍中、丞相长史、驸马都尉。魏文帝时期,出任督军粮御史、尚书,累封武平亭侯。魏明帝时期,担任大将军曹真和司马懿的军师,抵御蜀国进攻,拜太中大夫,受封平阳乡侯。卒于任上,获赠少府,谥号为定。", + gaogan: "高干(?~206年),字元才,陈留郡圉县(今河南杞县圉镇)人。东汉末年并州割据将领,蜀郡太守高躬之子、大将军袁绍外甥。出身陈留高氏,才志弘邈,文武秀出。早年联合荀谌游说韩馥让出冀州牧。袁绍平定河北后,以为并州牧。官渡之战时,在西线配合作战。因曹操早有准备,没有实质进展。袁绍死后,袁谭、袁尚与曹操大战于黎阳郡时,联合郭援攻打平阳郡,为马腾为首关中将领所败,郭援为庞德所斩。袁尚败走中山郡后,出降于曹操,仍为并州刺史。建安十年,兴兵反曹,固守壶关,成功抵挡乐进进攻。得知曹操亲征后,留下别将守城,亲往匈奴呼厨泉求救,没有成功。引兵攻略河东郡,屡为钟繇、张既所败。建安十一年,投奔荆州刘表。途经上洛时,为上洛都尉捕斩之。", + huangchengyan: "黄承彦,生卒年不详,汉末三国时期沔阳名士,诸葛亮岳父,黄月英之父。南郡大士蔡讽的女婿,与襄阳名士上层社会圈子:庞统(凤雏)、庞德公、司马徽、徐庶等人交好。《襄阳记》:黄承彦者,高爽开列,为沔阳名士,谓诸葛孔明曰:“闻君择妇,身有丑女,黄头黑色,而才堪配。”孔明许,即载送之。时人以为笑乐,乡里为之谚曰:“莫作孔明择妇,正得阿承丑女。”", + panshu: "潘淑(?-252年),会稽句章(今浙江省宁波市)人,是吴大帝孙权的皇后,吴少帝孙亮的母亲。和孙权是中国历代帝后中年龄差距较大的一对。潘淑少时与姐姐俱没入织室,容媚有宠,拜为夫人,生有一子孙亮。赤乌十三年(250年),孙权立孙亮为皇太子,翌年(251年)立潘淑为皇后。神凤元年(252年)暴崩,合葬蒋陵。世称潘淑为江东绝色,有神女之称。", + zongyu: "宗预(?-264年),字德艳 ,荆州南阳郡安众县(今河南省南阳市)人。三国时期蜀汉官员、将领。曾随张飞入蜀助平益州,又受辟为丞相诸葛亮手下主簿,升任参军、右中郎将。诸葛亮逝世后,宗预受命出使孙吴,得到孙权的赞赏。迁后将军,出督永安,又升任征西大将军,并受封关内侯。公元258年(景耀元年),因病回成都,受任镇军大将军。蜀汉灭亡后,宗预随后主刘禅徙往洛阳,在中途病逝。宗预为人坦率耿直,多次出使孙吴并深得孙权的敬重,为吴、汉两国同盟的巩固作出了一定的贡献。", + mengda: "孟达(?-228),字子度,本字子敬,因刘备的叔父名叫刘子敬,为避讳而改字。扶风郡郿人,三国时期人物。本为刘璋属下,后降刘备。关羽围樊城、襄阳时因不发兵救关羽而触怒刘备,于是投奔曹魏。此后,劝降刘封,未果。在魏官至散骑常侍、建武将军,封平阳亭侯。此后又欲反曹魏而归蜀汉,事败而死。", + wolongfengchu: "沙比武将,懒得复制粘贴,自己去看「诸葛亮」和「庞统」的介绍吧。", + caoshuang: "曹爽(?-249年2月9日),字昭伯,沛国谯县(今安徽亳州市)人。三国时期魏国权臣,大司马曹真长子。曹爽体态肥胖,凭借宗室身份,出入宫廷,交好太子曹叡。魏明帝即位,起家员外散骑侍郎,累迁城门校尉、散骑常侍,转武卫将军。太和五年(231年),袭封邵陵侯。景初三年(239年),魏明帝曹叡病危,拜大将军、假黄钺,与司马懿并为托孤大臣。少帝曹芳即位,加侍中,改封武安侯。势倾四海,声震天下。任用私人,专权乱政,侵吞公产。伐蜀失败,虚耗国力。起居逾制,软禁郭太后。正始十年,太傅司马懿发动高平陵政变,掌握魏国大权。曹爽失去大将军职务,以谋反之罪处死,夷灭三族。", + zhangling: "张道陵(34年2月22日—156年),字辅汉,原名陵,道教正一道实际创立者,汉朝东汉时期丰邑(今江苏徐州丰县)人。太上老君降临蜀地,“授以三天正法,命为天师”,张道陵整合当时的:黄老派、方仙道、文始派等先秦修道团体,创立道教称正一盟威之道。后世尊称为“老祖天师”、“正一真人”、“三天扶教大法师”、高明上帝、张天师。著作《老子想尔注》,弟子有3000多人,设立24治,奠基天师道。张道陵、葛玄、许逊、萨守坚合称四大天师。张道陵创建道教的背景:当时在巴蜀一带,原有巴人信奉原始巫教,大规模的淫祀而害民。而这些祀奉鬼妖(学名为:妖邪)的法教巫师聚众敛财,无恶不作。张天师携王长、赵升二位弟子和黄帝九鼎丹经,来到北邙山修行,平定了那些祸害百姓的巫妖之教。川渝一带流传的张天师以太上老君剑印符箓大破鬼兵的故事就是以此为原型的。", + caiyang: "蔡阳(?-201年),又作蔡扬,东汉丞相曹操部下武将,汝南太守。于建安六年(201)奉曹操之命攻击与刘备联合的汝南贼龚都等人,兵败被刘备所杀。明代小说《三国演义》改编为“云长擂鼓斩蔡阳”。", + pujing: "湖北省当阳境内有一座山,名叫玉泉山。东汉建安末年,山上住着一个老和尚,法名普净,普净原来是沂水关镇国寺方丈,后因云游天下,来到此处,风这地方山明水秀,就于山中结草为庵,每天坐禅参道,身边只有一个小和尚,外出化一些斋饭,供养师父。在《三国演义》中,当关羽通过汜水关时,正是由于普净提醒,关羽才揭穿了卞喜的阴谋,并杀死了卞喜。关羽死后,其怨魂亦在普净的指点下醒悟,放下了心中的仇恨,专心致力于造福一方百姓。", + huban: "为《三国演义》所杜撰的人物,正史无记载,荥阳太守王植麾下从事、桓帝时议郎胡华之子。关羽过五关斩六将时其中一关就是王植所镇守,胡班奉命放火夜袭关公,因敬服公之气概,并得其父托公所带家书,班看毕,叹曰:“险些误杀忠良!”故将之放走。胡班到荆州来投降关公,公念其旧日相救之情,甚爱之;令随费诗入川,见汉中王受爵。费诗辞别关公,带了胡班,自回蜀中去了。", + chunyuqiong: "淳于琼(?-200年),字仲简,颍川(治今河南禹州)人。东汉时期官吏,于汉灵帝中平五年(188)被任命为西园八校尉之一的右校尉,与蹇硕、袁绍、鲍鸿、曹操、赵融、冯芳、夏牟同列。为袁绍大将,与张郃、高览等人齐名。在官渡之战时镇守乌巢,遭到曹操的偷袭而惨败,自己也被曹操处斩。", + lvkuanglvxiang: "吕旷(生卒年不详),与吕翔同是袁绍属下,袁绍去世后,为袁尚守东平,后来投降曹操,并被封为列侯。在《三国演义》中,在曹操准备往南准备攻击前,两人跟著大将曹仁和将军李典准备要攻击刘备。但吕旷被赵云刺下马身亡,而吕翔也死于张飞矛下,可以算是出师未捷身先死", + caobuxing: "曹不兴,亦名弗兴,三国时著名画家。孙吴吴兴(今浙江湖州)人,生卒年不详。他在黄武年间(222—229年)享有很大的声誉。被称为“佛画之祖”。与东晋顾恺之、南朝宋陆探微、南朝梁张僧繇并称“六朝四大家”。又与赵达的算术、严武的弈棋、皇象的草书等号称“吴中八绝”。曹不兴善画龙、虎、马及人物,有“落墨为蝇”等传奇故事,其佛画成就对后世影响很大,相传其所画龙头令谢赫叹服不已。画迹今已不存,据《贞观公私画史》载,作品有《青溪龙》、《赤盘龙》、《南海监牧进十种马图》、《夷事夷兽样》、《桃源图》等,惜早已散佚。但之后的著名画家卫协直接师承其法。", + gaolan: "高览,生卒年不详,一名高奂,本属袁绍部将,后官渡之战淳于琼被曹操击破,与张郃一同投降曹操,被封为偏将军,东莱侯。《三国演义》里,曾与许褚、徐晃大战不分胜负。201年刘备败走荆州时,高览奉命追杀,三合斩刘辟,而后被冲阵而来的赵云刺死。", + xunchen: "荀谌,字友若,荀彧之兄(一说荀彧之弟),荀绲之子,颍川人。曾任军阀袁绍的幕僚。帮助袁绍游说韩馥,夺取了冀州。", + sunshao: "孙邵(163年-225年),字长绪,青州北海国人(今山东潍坊市昌乐县西)。原为北海相孔融的功曹,被孔融称赞为可任朝廷要职的人才,后随刘繇到达江东,继而辅佐孙权。孙权称吴王后,孙邵成为吴国首任丞相,数年后病逝。由于孙邵和当时吴国史官的关系并不是很好,因此在史书中并没有详细的记载。", + yuantanyuanshang: "袁谭、袁尚分别是袁绍的长子和第三子。袁绍坐拥青州、冀州、幽州、并州,本是北方最强诸侯,却于官渡大败,惭恨而终。虽然袁绍生前偏爱小儿子袁尚,却并未在继承人上有明确表态,这也导致本应以嫡长子身份继承的袁谭因郭图、审配伪立遗令未能如愿。曹操击败袁绍后,进而渡过黄河追击袁家残余势力,袁谭告急,但袁尚仅给他少量兵力。曹操得郭嘉之计退兵坐观其变,恰使两人此前的种种矛盾彻底爆发,袁谭不敌便引狼入室,派辛毗作为使者向曹操求援,让袁尚不得不北逃投奔乌桓。但袁谭也在之后背叛曹操兵败被杀。没多久,乌桓也被平定,袁熙、袁尚二人投奔公孙康后被斩首送还曹操。", + xujing: "许靖(?—222年),字文休。汝南郡平舆县(今河南省平舆县)人。汉末至三国蜀汉时期重臣、名士、评论家。许靖因与从弟许邵俱以品评人物而闻名于世。后被刘翊推举为孝廉,任尚书郎。曾先后投奔孔伷、陈祎、许贡、王朗等人,于孙策攻王朗前与家属俱避难交州,受到交趾太守士燮礼待。其后受益州牧刘璋邀请,相继为巴郡、广汉、蜀郡太守。于刘备包围成都时欲越墙叛逃,为刘璋所获。刘备定蜀后欲将其弃用,在法正的建议下方以其为左将军长史。建安二十三年(218年),刘备称汉中王,任命许靖为汉中王傅。章武元年(221年),刘备称帝,任命许靖为司徒,位列三公。章武二年(222年),去世。有文集二卷。", + hejin: "何进(?~189年),字遂高,南阳郡宛县(今河南南阳市宛城区)人。东汉时期外戚大臣,灵思皇后之兄。初以妹妹有宠,拜为郎中,出任虎贲中郎将、颍川太守,迁侍中、将作大匠、河南尹。黄巾起义时,拜为大将军,总镇京师,发现并镇压马元义的密谋,封为慎侯。为张大威望,在京师讲武结营,置西园八校尉。汉灵帝驾崩后,粉碎了中常侍蹇硕拥立皇子刘协的图谋,听从袁绍之言,博征智谋之士,内借元舅之资,外据辅政之权,独揽朝中大权。中平六年(189),不纳陈琳和曹操劝谏,阴结军阀董卓,联合袁绍谋诛宦竖。事情败露后,为中常侍张让等人损害,其后代是魏晋高门士族南阳何氏。", + hansui: "韩遂(?-215年),字文约。凉州金城郡人。东汉末年军阀、将领,汉末群雄之一。原名韩约,后改名遂。韩遂最初闻名于西州,被羌胡叛军劫持并推举为首领,以诛宦官为名举兵造反,聚众十万,先后败皇甫嵩、张温、董卓、孙坚等名将,使得天下骚动。后受朝廷招安,拥兵割据一方长达三十余年。韩遂曾与马腾结为异姓兄弟,后二人关系破裂。袁绍、曹操相争之际,马腾、韩遂被钟繇说服,依附于曹操。马腾入京后,留其子马超统领部队。马超推举韩遂为都督起兵反叛曹操,为曹操所败,韩遂逃奔凉州,后又为夏侯渊所败,病死(一说被杀),享年七十余岁。", + niujin: "牛金(生卒年不详),初为曹仁部曲将,周瑜军数万人来攻,前锋数千人始至,曹仁登城望,乃募得三百人,遣牛金迎战。但对方兵力较多,牛金遂被围困。曹仁亲自杀入阵中救出牛金。司马懿使牛金轻骑饵诱蜀军,刚交战诸葛亮就退兵,追至祁山。蜀将马岱入寇,司马懿遣将军牛金击退,斩千余级。公孙渊反,司马懿帅牛金、胡遵等步骑四万发自洛阳,后平定辽东。牛金官至后将军。", + jianggan: "蒋干,字子翼,汉末三国时期的人物,九江(治今安徽寿县)人。历史上的蒋干是当时的名士、辩论家。而罗贯中在历史小说《三国演义》中则将蒋干刻画成了被周瑜所愚弄的小丑形象。", + + caoying: "曹婴是在电影《三国志之见龙卸甲》中登场的虚拟人物,由李美琪饰演。曹婴是曹操的孙女,弓马娴熟,文武双全,深得曹操的用兵之道及心术。于凤鸣山一战中担任魏军大都督阻止诸葛亮北伐并因罗平安的告密而全歼关兴、张苞、赵云率领的蜀军部队。", + simahui: "司马徽(约145—208年),字德操,颍川阳翟(今河南禹州)人。东汉末年名士,精通道学、奇门、兵法、经学。有“水镜先生”之称。 司马徽为人清雅,学识广博,有知人之明,并向刘备推荐了诸葛亮、庞统等人,受到世人的敬重。", + baosanniang: "鲍三娘是中国民间传说中的人物,事迹多见于《花关索传》。相传她是鲍家庄鲍员外的小女儿。后来与关索成亲,关羽自传授其武艺,因此也造就了鲍三娘的文武双全。荆州失守之后鲍三娘就跟随关索一同投奔蜀汉,并随诸葛亮征讨南蛮。平定了南蛮之后,夫妻二人就此一直替诸葛亮镇守着南中,他们也的确留下了许多脍炙人口的行侠仗义故事,在民间广为流传。", + + pangdegong: '庞德公,字尚长,荆州襄阳人,东汉末年名士、隐士。 庞德公与当时徐庶、司马徽、诸葛亮、庞统等人交往密切。庞德公曾称诸葛亮为"卧龙",庞统为"凤雏",司马徽为"水镜",被誉为知人。对诸葛亮、庞统等人早年影响较大,并得到诸葛亮的敬重。庞德公最后隐居于鹿门山,采药而终。', + zhaotongzhaoguang: "赵统,赵云长子,生卒年不详。常山真定(今为河北正定)人,陈寿在正史《三国志》中记载赵云去世后,赵统袭爵永昌亭侯,官至蜀汉虎贲中郎督,加行领军。赵广(?—263年),三国时期蜀汉牙门将,赵云的次子,赵统之弟。随姜维前往沓中,官拜牙门将。曹魏司马氏派五路大军伐蜀时,随大将军姜维与魏兵战于疆川口,姜维败绩还守剑阁,赵广于沓中战死。", + majun: "马钧,字德衡,扶风(今陕西扶风)人,生活在汉朝末期,是中国古代科技史上最负盛名的机械发明家之一。马钧年幼时家境贫寒,自己又有口吃的毛病,所以不擅言谈却精于巧思,后来在魏国担任给事中的官职。马钧最突出的表现有还原指南车;改进当时操作笨重的织绫机;发明一种由低处向高地引水的龙骨水车;制作出一种轮转式发石机,能连续发射石块,远至数百步;把木制原动轮装于木偶下面,叫做“水转百戏”。此后,马钧还改制了诸葛连弩,对科学发展和技术进步做出了贡献。", + simazhao: "司马昭(211年—265年9月6日),字子上(小说《三国演义》为子尚),河内温县(今属河南)人。三国时期曹魏权臣,西晋王朝的奠基人之一。为晋宣帝司马懿与宣穆皇后张春华次子、晋景帝司马师之弟、晋武帝司马炎之父。 司马昭早年随父抗击蜀汉,多有战功。累官洛阳典农中郎将,封新城乡侯。正元二年(255年),继兄司马师为大将军,专揽国政。甘露五年(260年),魏帝曹髦被弑杀,司马昭立曹奂为帝。景元四年(263年),分兵遣钟会、邓艾、诸葛绪三路灭亡蜀汉,受封晋公。次年,进爵晋王。 咸熙二年(265年),司马昭病逝,年五十四,葬于崇阳陵。数月后,其子司马炎代魏称帝,建立晋朝,追尊司马昭为文帝,庙号太祖。", + wangyuanji: "王元姬(217年—268年4月20日),东海郯县(今山东郯城西北)人。三国时期曹魏经学家王朗之孙女、王肃之女,晋文帝司马昭妻子,晋武帝司马炎与齐王司马攸的生母。 王元姬幼时便通《诗经》、《论语》,嫁司马昭后竭尽妇道、谦虚谨慎。其人颇有远见,曾预言钟会谋反之事。泰始元年(265年),司马炎建立西晋,尊王元姬为皇太后,宫号曰崇化宫。王元姬身处太后之位,提倡节俭,身体力行,作为众妃子的表率。在其治理之下,后宫井井有条,众人和睦相处。 泰始四年(268年),王元姬崩逝,终年五十二岁。谥号文明皇后,与司马昭合葬于崇阳陵。", + + liuye: "刘晔(?-234年),字子扬,淮南成德人,是光武帝刘秀之子阜陵王刘延的后代,三国时期魏国著名的战略家。刘晔年少知名,人称有佐世之才,是曹操手下举足轻重的谋士,他屡献妙计,对天下形势的发展往往一语中的。刘晔历仕数朝,是曹魏的三朝元老。", + luzhi: "鲁芝(190年—273年),字世英。扶风郡郿县(今陕西眉县)人。魏晋时期名臣。官至光禄大夫,位特进,封阴平侯。泰始九年(273年)卒,时年八十四。谥号“贞”。", + xizhicai: "戏志才(生卒年不详),或志才为字,名不详(一说名忠),东汉颍川郡(今河南禹州)人。经张邈推荐,成为曹操手下谋士。为人多谋略,曹操十分器重,不幸早卒。三国演义中并无此人,三国志中只有寥寥数语。由荀彧推荐给曹操,被称为有“负俗之讥”。死后,荀彧又举荐了郭嘉。
    陈寿《三国志》记载:太祖与荀彧书曰:自志才亡后,莫可与计事者。汝、颍固多奇士,谁可以继之?彧荐嘉。", + sunqian: "孙乾(?—约215年),字公祐。北海郡(治今山东昌乐西)人。东汉末年刘备的幕僚。最初被大儒郑玄推荐于州里。刘备领徐州,以孙乾为从事。自徐州跟随刘备,多次作为刘备的使臣。刘备定益州后,拜孙乾为秉忠将军,其待遇仅次于麋竺,与简雍相同。不久后便病逝。", + miheng: "祢衡(173年-198年),字正平,平原郡(今山东德州临邑德平镇)人。个性恃才傲物.和孔融交好。孔融著有《荐祢衡表》,向曹操推荐祢衡,但是祢衡称病不肯去,曹操封他为鼓手,想要羞辱祢衡,却反而被祢衡裸身击鼓而羞辱。后来祢衡骂曹操,曹操就把他遣送给刘表,祢衡对刘表也很轻慢,刘表又把他送去给江夏太守黄祖,最后因为和黄祖言语冲突而被杀,时年二十六岁。黄祖对杀害祢衡一事感到十分后悔,便将其加以厚葬。", + quyi: "麴义(又作曲义、鞠义),生卒年不详,是东汉末年军阀袁绍部下的将领,能征善战,屡建战功,早年在凉州,精通羌人战法,率领着袁绍的精锐部队。后来由于自恃功高而骄纵不轨,被袁绍所杀。", + taoqian: "陶谦(132年-194年),字恭祖。丹阳郡(治今安徽宣城)人。汉末群雄之一。陶谦最初为诸生,在州郡任职,被举茂才,历任舒、卢二县令、幽州刺史、议郎,性格刚直,有大志。后随左车骑将军皇甫嵩对抗北宫伯玉,任扬武校尉,之后又随张温征韩遂、边章。中平五年(188年),徐州黄巾起,陶谦被朝廷任为徐州刺史,击破徐州黄巾,并推行屯田,恢复生产。尔后听从王朗、赵昱建议遣使进京朝贡,获拜安东将军、徐州牧,封溧阳侯。晚年因战事上为曹操大败,徐州大半几乎遭兵祸所害,以致过度忧劳而逝,终年六十三岁。", + wangyun: "王允(137~192年),字子师,太原郡祁县(今山西祁县)人。东汉末年时期大臣。出身太原王氏,世代官宦。举孝廉出身,司徒高第征为侍御史。出任豫州刺史,勤政爱民。斗争中常侍张让失败后,去官隐居。中平六年,大将军何进掌权之后,辟为从事中郎,迁河南尹。董卓拥立汉献帝即位后,代替杨彪,拜太仆、尚书令、司徒,密谋刺死董卓,联合吕布共同执政,日益骄傲自满。初平三年(192年),董卓余党李傕、郭汜、樊稠等攻破长安。王允兵败处死,时年五十六岁。", + bianfuren: "武宣皇后卞氏(159年12月30日-230年7月9日),琅邪开阳(今山东临沂)人,魏武帝曹操的正妻(继室),魏文帝曹丕、任城威王曹彰、陈思王曹植、萧怀王曹熊的母亲。原本是倡家,即汉代专门从事音乐歌舞的乐人家庭,后来与曹操成婚,建安初年,原配丁夫人被废,卞夫人成为曹操的正妻。曹丕继位后尊其为皇太后,曹叡继位后尊其为太皇太后。卞后在太和四年去世,与魏武帝曹操合葬高陵。", + shamoke: "沙摩柯(?-222年),东汉末三国时期五溪蛮首领。汉章武元年(221年)初,为报关羽被东吴杀害之仇,刘备亲自领兵攻孙权,以金锦爵赏诱沙摩柯助战。章武二年(222年),吴大都督陆逊以火攻破刘备,率诸军齐击,汉军四十多个营寨被攻破,沙摩柯在大乱中匹马奔逃,被乱军杀死。", + lvfan: "吕范(?-228年),字子衡。汝南郡细阳县(今安徽太和)人。汉末至三国时期吴国重臣。吕范年轻为汝南县吏,后避难寿春,结识孙策。此后随孙策、孙权征伐四方,对稳固孙氏在江东的统治做出了杰出的贡献,孙权将其比之于东汉开国元勋吴汉。吴国建立后,吕范累官至前将军、假节、扬州牧,封南昌侯。黄武七年(228年),吕范被拜为大司马,未得授官,便已病逝。孙权悲痛不已,遣使赠其大司马印绶。孙权还都建业后,以太牢礼祭祀吕范。", + liqueguosi: "请分别查看「李傕」和「郭汜」的武将介绍。", + maojie: "毛玠(?—216年),字孝先,陈留平丘(今河南封丘)人。东汉末年大臣。年少时为县吏,以清廉公正著称。因战乱而打算到荆州避乱,但中途知道刘表政令不严明,因而改往鲁阳。后来投靠曹操,提出“奉天子以令不臣,脩耕植,畜军资”的战略规划,得到曹操的欣赏。
    毛玠与崔琰主持选举,所举用的都是清廉正直之士。而毛玠为人廉洁,激起天下廉洁之风,一改朝中奢华风气。曹操大为赞赏,曹丕也亲自去拜访他。
    曹操获封魏公后,毛玠改任尚书仆射,再典选举。又密谏曹操应该立嫡长子曹丕为魏国太子。崔琰被杀后,毛玠十分不快。后来有人诬告毛玠,曹操大怒,将毛玠收于狱中。及后在桓阶、和洽营救下,只被免职,不久逝世于家中。曹操在他死后赐他棺材和钱帛。", + + huangfusong: "字义真。安定郡朝那县(今宁夏彭阳)人。于黄巾起义时,以中郎将身份讨伐黄巾,用火攻大破张梁、张宝。后接替董卓进攻张梁,连胜七阵。掘张角墓,拜左车骑将军、冀州牧,因拒绝贿赂宦官而被免职。 董卓死,王允命其与吕布等共至郿坞抄籍董卓家产、人口,皇甫嵩将坞中所藏良家子女,尽行释放。", + zangba: "其父臧戒,有二子臧艾与臧舜。年少时曾召集数人将获罪的父亲救出,此后四处流亡。后来成为陶谦麾下的骑都尉,负责募兵抵抗黄巾军。与孙观、尹礼等人拥兵驻屯于开阳,自成一股独立势力,后跟随吕布。吕布战败后,投降了曹操。后与袁绍、孙权等的战役里战功赫赫,官至镇东将军。", + zhangren: "刘璋的属下,以忠勇著称。刘备入蜀时,张任曾劝刘璋提防刘备,但刘璋没有听从。魏延舞剑想趁机除掉刘璋时,张任出面对舞,解救刘璋。后在刘备进攻时于落凤坡射死了庞统。", + jiling: "东汉末年袁术帐下将领,勇猛非常,曾奉命率军攻打小沛的刘备,在吕布辕门射戟的调停下撤兵。", + zoushi: "军阀张济之妻,张绣之婶。张绣降曹后,邹氏遂被曹操霸占。贾诩献计趁机诛杀曹操,险些得手。曹操在损失爱将典韦、侄子曹安民和长子曹昂后方才逃出生天。", + ganfuren: "刘备起兵后,于沛城娶甘氏为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。", + jiangfei: "请分别查看「蒋琬」和「费袆」的武将介绍。", + mifuren: "刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。", + chendong: "陈武,东吴将领,孙策攻打刘繇,陈武前来相助,孙策非常喜爱陈武,拜为校尉,使作先锋。陈武以十数骑兵力杀敌五十余人。后于赤壁等战役屡立功勋。董袭献上严虎的人头来降孙策。赤壁之战,董袭受周瑜命,分兵去汉阳,合肥会战时接应太史慈,逍遥津支援孙权。濡须口之战时,董袭在船上督战,船覆董袭坚守殉职。", + jiangqing: "擅长弓术。与周泰原为活跃于长江一带的江贼,孙策脱离袁术下江东自立门户时,和周泰一起率众投靠。 孙策攻刘繇,并引出城中麾下的陈横、薛礼、张英三名将领,陈横后被蒋钦一箭射杀,后与韩当等将乘舟过江,乱箭射杀敌军。曾在赤壁之战与周泰,还有擅使长枪的韩当率领水军在三江口踏江破敌。", + kongrong: "字文举,鲁国人,东汉文学家,“建安七子”之首。献帝即位后任北军中侯、虎贲中郎将、北海相,时称孔北海后因触怒曹操,为曹操所杀。能诗善文。", + mateng: "字寿成,扶风茂陵人,东汉末年征西将军,割据西凉一带的军阀,伏波将军马援的后代,官至卫尉,封爵槐里乡侯。因其子马超谋反,而被杀,夷灭三族。", + tianfeng: "字元皓。东汉末年大军阀袁绍部下重要谋士。为人刚直不阿,曾多次向袁绍进言而不被采纳。后因谏阻袁绍征伐曹操而被袁绍下令监禁,并于官渡之战后,被袁绍杀害。", + caochun: "字子和,沛国谯(今安徽亳州)人。东汉末年曹操麾下将领,曹仁之弟。曹纯是曹操部下精锐部队“虎豹骑”的统领者之一,因在平定北方的战役中颇有功绩,被加封为高陵亭侯。死后谥曰威侯。曹纯擅战,甚得人心,为人重纲纪,不失理智,好学问,敬爱学士,闻名天下。", + hanba: "中国古代神话传说中引起旱灾的怪物。《诗·大雅·云汉》:“旱魃为虐,如惔如焚。”", + cuiyan: "字季珪,清河东武城(今河北省清河县)人。东汉末年名士,司空崔林的从兄,曹操帐下谋士。崔琰相貌俊美,很有威望,曹操对他也很敬畏。建安二十一年(216年),崔琰在给杨训的书信中写道“时乎时乎,会当有变时”,曹操认为此句有不逊之意,因而将崔琰下狱,不久崔琰即被曹操赐死。", + lifeng: "南阳(治今河南南阳)人,三国时期蜀汉大臣李严之子。230年,李严迁为骠骑将军,率军前往汉中,诸葛亮上表推举李丰为江州都督督军,以代替李严管理后方事务。李严去世后,李丰在蜀汉官至朱提太守。", + sunru: "孙茹,孙坚之妹,其名载于《江浙通志》中。儿子徐琨亦为孙吴早期名将,当初母子二人随军跟从孙策渡长江时,因为暂时没足够的船,孙策感到苦恼打算暂时驻军江边。孙茹夫人献计以芦苇为筏,孙策大喜。吴军遂以神不知鬼不觉的速度过长江击破刘繇部将张英,立下平江东第一功。", + lingcao: "东汉末年将领,吴郡余杭(今浙江余杭)人,凌统之父。早年跟随孙策转战江东。孙权统军后,凌操随其征伐黄祖,被甘宁射杀。《吴书》载:甘宁以善射,将兵在后,射杀校尉凌操", + zhugeguo: "诸葛果,为《历代神仙通鉴》中诸葛亮女儿的名字,《历代神仙通鉴》记录从上古到明代的神仙历史,因此诸葛果不见于任何史书。成都西南有朝真观,即乘烟观。相传,诸葛果在这里修行后成仙升天。", + zhuling: "朱灵(生卒年不详),字文博,冀州清河国人,三国时期曹魏名将。官至后将军,封为高唐侯,谥号威侯。初为袁绍部将,后归顺曹操,随曹操征伐四方,屡建战功。", + re_yuanshu: "字公路,汝南汝阳人,袁绍之弟。初为虎贲中郎将。董卓进京后以袁术为后将军,袁术因畏祸而出奔南阳。初平元年与袁绍、曹操等同时起兵,共讨董卓。后与袁绍对立,被袁绍、曹操击败,率馀众奔九江,割据扬州。建安二年称帝,建号仲氏。", + fuwan: "伏完(?-209),琅邪东武(今属山东)人,东汉末大臣,汉献帝伏皇后之父。历官辅国将军、中散大夫、屯骑校尉。", + liuxie: "字伯和,又字合。汉族,祖籍沛县,生于洛阳。汉灵帝第三子,被董卓迎立为帝。董卓被王允和吕布诛杀后,董卓部将李傕等攻入长安,再次挟持了他,后来逃出长安。公元196年,曹操控制了刘协,并迁都许昌,“挟天子以令诸侯”。公元220年,曹操病死,刘协被曹丕控制,随后被迫禅让于曹丕。", + yuanshu: "字公路,汝南汝阳人,袁绍之弟。初为虎贲中郎将。董卓进京后以袁术为后将军,袁术因畏祸而出奔南阳。初平元年与袁绍、曹操等同时起兵,共讨董卓。后与袁绍对立,被袁绍、曹操击败,率馀众奔九江,割据扬州。建安二年称帝,建号仲氏。", + gongsunzan: "字伯珪,汉族,号“白马义从”。辽西令支人。东汉末年献帝年间占据幽州一带的军阀,汉末群雄之一。出身贵族,因母地位卑贱,只当了郡中小吏。他貌美,声音洪亮,机智善辩。后随卢植于缑氏山中读书,粗通经传。", + caohong: "字子廉,沛国谯(今安徽亳县)人,曹操从弟,曾献马并救护曹操。后多随军征伐,平兖州、征刘表、讨祝臂。曹丕即位时封曹洪为骠骑将军。曹叡即位,拜曹洪为后将军,更封乐城侯,后复拜为骠骑将军。曹洪逝世,追谥曰恭侯。", + guanyinping: "河东解县(今山西运城)人,美髯公关羽之女。因在关羽的四个子女中排行第三,故又被称作“关三小姐”、“关氏三姐”或“关羽三小姐”。传说她是赵云的弟子、并随同诸葛亮平定南蛮。", + xiahouba: "夏侯渊次子。本为曹魏武将,后因司马懿诛曹爽一族,夏侯霸身为曹氏宗室而心怀不安,遂投降蜀汉。后随蜀将姜维北伐,官至车骑将军。", + daxiaoqiao: "大乔,庐江皖县人,为乔公长女,孙策之妻,容貌国色流离。小乔为大乔之妹,周瑜之妻,资貌绝伦。两人合称“二乔”。", + yuejin: "字文谦,魏“五子良将”之一。容貌短小,以胆烈跟从曹操,南征北讨,战功无数。从击袁绍于官渡,奋勇力战,斩袁绍部将淳于琼。又从击袁绍子谭、尚于黎阳,斩其大将严敬。从平荆州,留屯襄阳,进击关羽、苏非等人,击退其众,南郡诸郡的山谷蛮夷都前往乐进处投降。后来从曹操征孙权,假进节。曹操回师后,留乐进与张辽、李典屯于合肥。又以乐进数有军功,迁右将军。建安二十三年逝世,谥曰威侯。", + caoang: "字子修,曹操的长子,由于性情谦和且聪慧所以深得曹操喜爱。曹操征讨张绣时,羞辱张绣之婶邹氏,被张绣突然袭击。曹昂为保护曹操撤退,与典韦一起战死在宛城。", + zhugejin: "字子瑜,吴国大臣,诸葛亮之兄,诸葛恪之父。经鲁肃推荐,为东吴效力。胸怀宽广,温厚诚信,得到孙权的深深信赖,努力缓和蜀汉与东吴的关系。建安二十五年(220年)吕蒙病逝,诸葛瑾代吕蒙领南郡太守,驻守公安。孙权称帝后,诸葛瑾官至大将军,领豫州牧。", + zhangxingcai: "蜀名将张飞与夏侯氏所生之女,刘禅的妻子,史上称为“敬哀皇后”。", + zumao: "字大荣,吴郡富春人,使用双刀。孙坚在汜水关被华雄击败,祖茂为保护主公而主动提出与孙坚交换头盔,孙坚因此得脱。祖茂将孙坚的赤帻挂在柱子上,准备以此引诱华雄,趁机偷袭,却反被华雄所杀。", + dingfeng: "吴国将领。年少时以骁勇为小将,经常奋勇杀敌,屡立功勋,此后又于东兴之战中“雪中奋短兵”,大破侵犯东吴的魏军。吴景帝孙休在位时,丁奉设计除掉了东吴的权臣孙綝,被拜为大将军,后为右大司马、左军师。", + panfeng: "冀州牧韩馥部下的上将。当十八路诸侯讨伐董卓之时,他奉韩馥之命前往汜水关前挑战董卓部下大将华雄,不敌被斩。", + maliang: "字季常,因眉毛中有白毛,人称白眉马良,马谡的兄长。马良在兄弟五人中名声最佳,因此有“马氏五常,白眉最良”的说法。", + zhugedan: "字公休,曹魏后期的重要将领,诸葛亮的族弟。曾与司马师一同平定毌丘俭、文钦的叛乱。之后因与被诛的夏侯玄、邓飏交厚,且见到王淩、毌丘俭等人的覆灭而心不自安,于甘露二年起兵,并得到东吴的支援,但于次年被镇压,被大将军司马胡奋所斩。", + hetaihou: "大将军何进的妹妹,汉灵帝刘宏第二任皇后,汉少帝刘辩的生母。何氏出身于屠户家庭,后选入掖庭,得到汉灵帝临幸,生下皇子刘辩,并受封贵人。光和三年(180年),立为皇后。中平六年(189年),汉灵帝去世,刘辩继位,尊何氏为皇太后。董卓进京,废黜刘辩,不久毒杀刘辩及何氏。", + sunluyu: "又名小虎,孙权与步练师之女。吴后期,孙鲁班诬陷孙鲁育参与谋反,于是孙峻杀害了孙鲁育。", + wenpin: "本为刘表大将,刘表死后,跟随刘琮投降曹操。后曹操令其镇守江夏,多次阻止了关羽和孙权的进攻,为曹操倚为屏障的大将之一。", + zhanglu: "汉宁太守,继父祖之后传播五斗米教。刘璋杀张鲁之母,二人因此结仇,多次交战。刘备攻益州时,刘璋向张鲁求援。张鲁派马超前往,但马超投降刘备。张鲁后见曹操自封魏王,想要自立为汉宁王,为谋士阎圃劝免。后曹操讨汉中,张鲁败,众人劝其烧粮仓,张鲁认为这是国家之物,未听从,为曹操所称赞。后投降曹操,任镇南将军。", + mayunlu: "马腾之女,马超之妹,赵云之妻。父亲令其自幼习武,枪术非凡,寻常男子也是难以匹敌。", + tadun: "东汉末年辽西乌桓(亦称乌丸)的首领,乌桓大人丘力居的从子,总摄三王部。曾出兵协助袁绍,击破公孙瓒。此后受袁绍假传朝廷诏命,与三王难楼、苏仆延、乌延等人同受单于称号及印绶。后难楼、苏仆延率其部众奉立楼班为单于,蹋顿于是退位为王。袁绍死后,收到被曹操击败的袁尚的求助,纠集逃亡至乌桓的幽州、冀州官吏百姓,企图夺回河北。东汉建安十二年,曹操亲征乌桓。八月,乌桓、袁氏部队于柳城白狼山为曹军所败,蹋顿在此战中被曹操的先锋张辽所斩杀。 ", + yanbaihu: "吴郡乌程县人,原名“严虎”,别号“白虎”,东汉末年盘据吴郡一带山贼出身的地方豪帅。献帝初拥兵万人自固。孙策受袁术使渡江,攻破白虎等。白虎奔余杭,投靠许昭。建安二年,再度被孙策击败,至此不知亡佚何处。", + simalang: "字伯达,“司马八达”之一。曹操任司空后,司马朗被辟为司空属官,又历任成皋令、堂阳长、元城令、丞相主簿、兖州刺史等职,所在皆有政绩,深受百姓爱戴。后司马朗与夏侯惇、臧霸等征讨吴国,到达居巢。军队中流行瘟疫,司马朗亲自去视察,派送医药,因此染病去世。", + wangji: "字伯舆,东莱曲城人。三国时期魏国将领。王基文武兼备,才高于世,德溥于时,深得司马懿、司马师、司马昭的器重,尤其在南征毋丘俭,文钦之乱,东征诸葛诞之叛大规模军事活动中,王基与司马师、司马昭结下了深厚的军友情谊。魏景元二年王基去世,追赠司空,谥号为景侯。", + buzhi: "吴重臣,最初避难江东,于孙权统事后,被召为主记。后游历吴地,又任海盐县长,还任东曹掾,出领鄱阳太守。建安十五年,转交州刺史、立武中郎将,率军接管往交州,追拜使持节、征南中郎将。次年,以平定交州功,加平戎将军,封广信侯。后迁右将军、左护军,改封临湘侯。孙权称帝后,拜骠骑将军,领冀州牧,后因冀州分与蜀汉而解牧职。又都督西陵。赤乌九年,代陆逊为丞相。", + litong: "字文达,小字万亿。江夏平春(今河南信阳)人,汝南太守。早年以游侠闻名于江汝,在率众补充曹操兵源有功拜为阳安都尉,其间不因私而忘公,不因其妻子的求请而过问执法者。后来在曹操讨伐马超时出阵挑战,死于马超枪下。", + mizhu: "原为徐州富商,后被徐州牧陶谦辟为别驾从事。陶谦病死后,奉其遗命迎接刘备。与其弟麋芳拒绝曹操的任命而跟随刘备,在刘备最潦倒之时给予刘备很大的帮助,使他重新振作。214年(建安十九年),刘备入主益州后,拜麋竺为安汉将军,地位在诸葛亮之上,为刘备手下众臣之最。吕蒙袭取荆州,麋芳举城投降,导致关羽兵败身亡,麋竺面缚请罪,刘备劝慰麋竺,对他待遇如初。", + dongbai: "东汉末年县君,陇西临洮(今甘肃省岷县)人,董卓之孙女。董卓当权时,遍封其宗族,其中孙女董白尚未及笄,被封为渭阳君。", + zhaoxiang: "赵云与马云騄之女,赵统赵广之妹,关平之妻。", + heqi: "早年在平定山越的战争中立有大功,又讨平叛乱无数,身经百战,所向披靡,深受孙权器重。后来在与魏国的多次边境争斗中也屡立战功,官至后将军,并领徐州牧。", + dongyun: "大汉重臣,掌军中郎将董和之子。东汉末年,其父董和事刘璋为益州太守,刘备立太子时,允被选为洗马,后为黄门侍郎,延熙六年(公元243年)加辅国将军,延熙七年(公元244年)以侍中守尚书令,任大将军费祎的副手。", + mazhong: "本名狐笃,字德信,巴西阆中人,初次出场时随丞相诸葛亮南征孟获,诸葛亮遣马忠与赵云两路夹攻,大败蛮将阿会喃。孟获派弟孟优赴汉军处假投降,欲内应外合,诸葛亮将计就计,埋伏擒获孟获和诸洞酋长,马忠亦于此战立下战功。后诸葛亮北伐时亦数次出阵,立下汗马功劳。", + kanze: "孙权谋士,在孙权广纳贤才之时与严畯等来到江东,甚为孙权礼遇。第一个识破周瑜打黄盖是苦肉计,后欣然向曹操献诈降书,被曹操识破后面不改色,哈哈大笑,一番妙言让曹操相信了诈降书,是苦肉计中的关键人物。后劝孙权不要设局请关羽。在刘备御驾亲征东吴时,向孙权举荐陆逊为都督,间接上挽救了东吴的命运。", + lingju: "相传为吕布与貂蝉的女儿,被汉献帝掳走并训练为死士,被秘密送入宫中接近曹操,成为其“忘年红颜知己”。外表是柔弱的女子,实际上身怀致命的杀人绝技,等待时机给予曹操致命一击。", + yangxiu: "字德祖,今陕西华阴人,是东汉末年的文学家。杨修学问渊博,极聪慧,任丞相府主簿。史载,“是时,军国多事,修总知外内,事皆称意”。", + chenlin: "陈琳(?-217年),字孔璋,广陵射阳(今江苏宝应)人。东汉末年著名文学家,“建安七子”之一。", + zhugeke: "字元逊,琅邪阳都(今山东沂南)人。三国时期吴臣,蜀丞相诸葛亮之侄,吴大将军诸葛瑾长子,从小就以神童著称,深受孙权赏识。", + zhangbao: "东汉末年黄巾起义的首领之一,张角之弟,张梁之兄。中平元年(184)随兄张角起义,号称“地公将军”。", + chengyu: "字仲德,本名程立,因梦中於泰山捧日,更名程昱。荀彧投曹操时向其举荐程昱。他参与了攻打吕布、袁绍、刘备、孙权的大部份战事,一直出谋献策,表现出众。", + sunhao: "孙权之孙,孙和之子,东吴的末代君主。在位初期虽施行过明政,但不久即沉溺酒色,专于杀戮,变得昏庸暴虐,嗜用挖眼、剥皮等酷刑。280年,吴国被西晋所灭,孙皓投降西晋,被封为归命侯。", + wutugu: "南蛮乌戈国主,身长丈二(约合现在2.77米),不食五谷,以生蛇恶兽为饭。身有鳞甲,刀箭不能侵。兀突骨乘骑巨象,头戴日月狼须帽,身披金珠缨络,两肋下露出生鳞甲,眼目中微有光芒。", + shixie: "割据交州(今越南)一带的军阀,年少时师事刘陶,经逐渐升迁任交趾太守。后被朝廷加职绥南中郎将,迁安远将军,封龙度亭侯。在步骘接管交州时积极配合,归附孙权,被孙权加为左将军;此后又因诱降益州豪族雍闿而迁任卫将军,进封龙编侯。任交趾太守四十年。", + guansuo: "关羽的三子。自荆州失陷后,逃难在鲍家庄养病,伤势痊愈之后入蜀,逢丞相诸葛亮南征,拜之为前部先锋,一同南征。", + wanglang: "字景兴,汉末三国经学家,曹魏初期重臣。曾任会稽太守举兵抵抗孙策,后为曹操所征,被拜为谏议大夫等职。曹丕建立魏国后任命为司空。小说《三国演义》中他在阵前与诸葛亮饶舌比拼,最终被诸葛亮言词所驳倒,一时气愤坠马身亡。", + zhangliang: "东汉末年黄巾起义首领之一,张角的三弟。中平元年(184)随兄起义,号称“人公将军”。遭到朝廷所派左中郎将皇甫嵩进攻时,他率军在广宗(今河北威县)进行反击。后因警戒疏忽,遭到汉军夜袭,兵败身亡。", +}; + +export default characterIntro; diff --git a/character/sp/perfectPairs.js b/character/sp/perfectPairs.js new file mode 100644 index 000000000..5f9b48bb3 --- /dev/null +++ b/character/sp/perfectPairs.js @@ -0,0 +1,26 @@ +export default { + yuejin: ["re_lidian"], + zhugejin: ["zhugeke", "sunquan"], + guanyinping: ["guanyu"], + zhangxingcai: ["liushan"], + fuwan: ["fuhuanghou"], + sunshangxiang: ["liubei"], + caoang: ["caocao"], + zhangbao: ["zhangliang", "zhangjiao"], + zhangliang: ["zhangjiao"], + maliang: ["masu"], + lingcao: ["lingtong"], + lingju: ["diaochan", "lvbu"], + jiangqing: ["zhoutai"], + dingfeng: ["xusheng", "zhugeke"], + caohong: ["caoren"], + daxiaoqiao: ["zhouyu", "sunce"], + cuiyan: ["caocao"], + guansuo: ["guanyu"], + mateng: ["machao", "madai", "mayunlu"], + chengpu: ["zhouyu"], + hanba: ["swd_muyun"], + dongbai: ["dongzhuo"], + cuimao: ["caopi"], + simazhao: ["wangyuanji"], +}; diff --git a/character/sp/pinyin.js b/character/sp/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/sp/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/sp/skill.js b/character/sp/skill.js new file mode 100644 index 000000000..195071e2b --- /dev/null +++ b/character/sp/skill.js @@ -0,0 +1,28069 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //SP孙策 + olliantao: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(target => target != player); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("olliantao"), lib.filter.notMe) + .set("ai", target => { + const player = get.event("player"), + att = get.attitude(player, target); + const colors = Object.keys(lib.color).filter(i => i != "none"); + if ( + !colors.some(color => + player.hasCard(card => { + const juedou = get.autoViewAs({ name: "juedou" }, [card]); + return player.canUse(juedou, target, false); + }, "h") + ) + ) + return 20 + (3 - get.sgn(att)) + Math.random(); + const effs = colors.reduce((list, color) => { + const cards = player.getCards("h", card => { + const juedou = get.autoViewAs({ name: "juedou" }, [card]); + return player.canUse(juedou, target, false); + }); + if (cards.length) { + list.push( + cards.reduce((sum, card) => { + const juedou = get.autoViewAs({ name: "juedou" }, [card]); + return sum + get.effect(target, juedou, player, player); + }, 0) + ); + } + return list; + }, []); + return Math[att > 0 ? "max" : "min"].apply(Math, effs); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + const colors = Object.keys(lib.color).filter(i => i != "none"); + if (colors.length && player.countCards("h")) { + const result = await target + .chooseControl(colors) + .set("prompt", "连讨:请选择一个颜色") + .set("ai", () => { + const player = get.event("player"), + source = get.event().getParent().player; + let controls = get.event("controls").slice(); + if (controls.length == 1) return controls[0]; + const getSum = function (color, player, source) { + return source + .getCards("h", card => { + if (get.color(card) != color) return false; + const juedou = get.autoViewAs({ name: "juedou" }, [card]); + return source.canUse(juedou, player, false); + }) + .reduce((num, card) => { + const juedou = get.autoViewAs({ name: "juedou" }, [card]); + return num + get.effect(player, juedou, source, player); + }, 0); + }; + return controls.sort((a, b) => getSum(b, player, source) - getSum(a, player, source))[0]; + }) + .set("prompt2", get.translation(player) + "将对你依次使用由其手牌中所有此颜色的牌转化的【决斗】") + .forResult(); + const color = result.control; + game.broadcastAll( + (color, target) => { + lib.skill.olliantao_backup.filterCardx = [color, target]; + lib.skill.olliantao_backup.filterCard = function (card, player) { + const list = lib.skill.olliantao_backup.filterCardx; + if (get.color(card) != list[0]) return false; + const juedou = get.autoViewAs({ name: "juedou" }, [card]); + return player.canUse(juedou, list[1], false); + }; + }, + color, + target + ); + while ( + target.isIn() && + player.hasCard(card => lib.skill.olliantao_backup.filterCard(card, player)) && + !game.getGlobalHistory("everything", evt => { + return evt.name == "dying" && [player, target].includes(evt.player) && evt.getParent("olliantao") == event; + }).length + ) { + await player + .chooseToUse() + .set("forced", true) + .set("openskilldialog", "连讨:将一张" + get.translation(color) + "手牌当作【决斗】对" + get.translation(target) + "使用") + .set("norestore", true) + .set("_backupevent", "olliantao_backup") + .set("custom", { + add: {}, + replace: { window: function () {} }, + }) + .backup("olliantao_backup") + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", target) + .set("addCount", false); + } + } + const num = player + .getHistory("sourceDamage", evt => { + return evt.getParent(4) == event; + }) + .reduce((sum, evt) => sum + evt.num, 0); + if (num) await player.draw(num); + if ( + !game.hasPlayer2(current => { + return current.getHistory("damage", evt => { + return evt.getParent(4) == event; + }).length; + }) + ) { + await player.draw(3); + player.addTempSkill("olliantao_buff"); + player.addMark("olliantao_buff", 3, false); + } + }, + subSkill: { + backup: { + viewAs: { name: "juedou" }, + position: "h", + check: () => 1 + Math.random(), + precontent() { + delete event.result.skill; + }, + }, + buff: { + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("olliantao_buff"); + }, + cardEnabled(card) { + if (card.name == "sha") return false; + }, + }, + intro: { content: "手牌上限+#,不能使用【杀】" }, + }, + }, + }, + //刘辟 + olyicheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + async content(event, trigger, player) { + let num = player.maxHp, + cards = get.cards(num, true); + await player.showCards(cards, get.translation(player) + "发动了【易城】"); + if (player.countCards("h")) { + const sum = cards.reduce((num, card) => num + get.number(card), 0); + const { + result: { bool, moved }, + } = await player + .chooseToMove("易城:请选择你要交换的牌") + .set("list", [ + [ + "牌堆顶", + cards, + list => { + const sum2 = list.reduce((num, card) => num + get.number(card, false), 0); + return "牌堆顶(现" + sum2 + { 0: "=", "-1": "<", 1: ">" }[get.sgn(sum2 - sum).toString()] + "原" + sum + ")"; + }, + ], + ["手牌", player.getCards("h")], + ]) + .set("filterOk", moved => moved[1].some(i => !get.owner(i))) + .set("processAI", list => { + const player = get.event("player"), + limit = Math.min(get.event("num"), player.countCards("h")); + let cards = list[0][1].slice(), + hs = player.getCards("h"); + if (cards.reduce((num, card) => num + get.value(card), 0) > player.getCards("h").reduce((num, card) => num + get.value(card), 0)) { + cards.sort((a, b) => get.number(a) - get.number(b)); + hs.sort((a, b) => get.number(b) - get.number(a)); + let cards2 = cards.slice(0, limit), + hs2 = hs.slice(0, limit); + if (hs2.reduce((num, card) => num + get.number(card), 0) > cards2.reduce((num, card) => num + get.number(card), 0)) { + cards.removeArray(cards2); + hs.removeArray(hs2); + return [cards.concat(hs2), hs.concat(cards2)]; + } + return [cards, hs]; + } else { + cards.sort((a, b) => get.value(b) - get.value(a)); + hs.sort((a, b) => get.value(a) - get.value(b)); + let cards2 = cards.slice(0, limit), + hs2 = hs.slice(0, limit), + list = [cards, hs]; + for (let i = 0; i < limit; i++) { + if (get.value(cards2[i]) > get.value(hs2[i])) { + const change = [cards2[i], hs2[i]]; + cards[i] = change[1]; + hs[i] = change[0]; + } else break; + } + return list; + } + }) + .set("num", num); + if (bool) { + const puts = player.getCards("h", i => moved[0].includes(i)); + const gains = cards.filter(i => moved[1].includes(i)); + if (puts.length && gains.length) { + player.$throw(puts, 1000); + await player.lose(puts, ui.special); + await player.gain(gains, "gain2"); + cards = moved[0].slice(); + if (cards.length) { + await game.cardsGotoOrdering(cards); + for (let i = cards.length - 1; i--; i >= 0) { + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); + } + game.log(cards, "被放回了牌堆顶"); + game.updateRoundNumber(); + } + await player.showCards(cards, get.translation(player) + "【易城】第一次交换后"); + if (cards.reduce((num, card) => num + get.number(card), 0) > sum && player.countCards("h")) { + const { + result: { bool }, + } = await player.chooseBool("易城:是否使用全部手牌交换" + get.translation(cards) + "?").set( + "choice", + (() => { + return cards.reduce((num, card) => num + get.value(card), 0) > player.getCards("h").reduce((num, card) => num + get.value(card), 0); + })() + ); + if (bool) { + const hs = player.getCards("h"); + player.$throw(hs, 1000); + await player.lose(hs, ui.special); + await player.gain(cards, "gain2"); + cards = hs.slice(); + if (cards.length) { + await game.cardsGotoOrdering(cards); + for (let i = cards.length - 1; i--; i >= 0) { + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); + } + game.log(cards, "被放回了牌堆顶"); + game.updateRoundNumber(); + } + await player.showCards(cards, get.translation(player) + "【易城】第二次交换后"); + } + } + } + } + } + }, + ai: { + order: 9, + result: { player: 1 }, + }, + }, + //陆凯 + olxuanzhu: { + mark: true, + marktext: "☯", + zhuanhuanji: true, + audio: 2, + enable: "chooseToUse", + filter(event, player) { + if (!player.countCards("he") || event.type == "wuxie") return false; + return get + .inpileVCardList(info => { + const name = info[2], + type = get.type(name), + infox = get.info({ name: name }); + if (type != "basic" && type != "trick") return false; + if (type == "trick" && (!infox || !infox.filterTarget)) return false; + return (type != "basic") == (player.storage.olxuanzhu || false); + }) + .some(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); + }, + usable: 1, + chooseButton: { + dialog(event, player) { + const list = get + .inpileVCardList(info => { + const name = info[2], + type = get.type(name), + infox = get.info({ name: name }); + if (type != "basic" && type != "trick") return false; + if (type == "trick" && (!infox || !infox.filterTarget)) return false; + return (type != "basic") == (player.storage.olxuanzhu || false); + }) + .filter(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); + return ui.create.dialog("玄注", [list, "vcard"]); + }, + check(button) { + if (get.event().getParent().type != "phase") return 1; + return get.event("player").getUseValue({ name: button.link[2], nature: button.link[3] }); + }, + backup(links, player) { + let next = { + audio: "olxuanzhu", + filterCard: true, + popname: true, + check(card) { + return 1 / (get.value(card) || 0.5); + }, + position: "he", + ignoreMod: true, + precontent() { + const cards = event.result.cards.slice(); + player.addToExpansion(cards, player, "give").gaintag.add("olxuanzhu"); + const viewAs = { + name: event.result.card.name, + nature: event.result.card.nature, + }; + event.result.card = viewAs; + event.result.cards = []; + player + .when("useCardAfter") + .filter(evt => evt.skill == "olxuanzhu_backup") + .then(() => { + const card = cards[0]; + if (get.type(card) != "equip") player.chooseToDiscard("he", true); + else { + const cardx = player.getExpansions("olxuanzhu"); + if (cardx.length) { + player.loseToDiscardpile(cardx); + player.draw(cardx.length); + } + } + }) + .vars({ cards: cards }); + }, + onuse(result, player) { + player.changeZhuanhuanji("olxuanzhu"); + }, + }; + const viewAs = { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, + }; + next.viewAs = viewAs; + if (get.info("xunshi").isXunshi(viewAs)) { + next.filterTarget = function (card, player, target) { + const info = get.info(card); + if (info.changeTarget) { + let targets = [target]; + info.changeTarget(player, targets); + if (targets.length > 1) return false; + } + return lib.filter.filterTarget(card, player, target); + }; + next.selectTarget = 1; + } + return next; + }, + prompt(links, player) { + const viewAs = { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, + }; + const str = "将一张牌称为“玄”置于武将牌上,然后视为使用" + (get.translation(links[0][3]) || "") + "【" + get.translation(links[0][2]) + "】"; + return str + (get.info("xunshi").isXunshi(viewAs) ? "(仅能指定一个目标)" : ""); + }, + }, + hiddenCard(player, name) { + if (!lib.inpile.includes(name) || player.getStat("skill").olxuanzhu || !player.countCards("he")) return false; + return get + .inpileVCardList(info => { + const name = info[2], + type = get.type(name), + infox = get.info({ name: name }); + if (type != "basic" && type != "trick") return false; + if (type == "trick" && (!infox || !infox.filterTarget)) return false; + return (type != "basic") == (player.storage.olxuanzhu || false); + }) + .map(card => card[2]) + .includes(name); + }, + ai: { + order(item, player) { + if (player && get.event().type == "phase") { + let list = get + .inpileVCardList(info => { + const name = info[2], + type = get.type(name), + infox = get.info({ name: name }); + if (type != "basic" && type != "trick") return false; + if (type == "trick" && (!infox || !infox.filterTarget)) return false; + return (type != "basic") == (player.storage.olxuanzhu || false); + }) + .map(card => { + return { name: card[2], nature: card[3] }; + }) + .filter(card => player.getUseValue(card, true, true) > 0); + if (!list.length) return 0; + list.sort((a, b) => { + const getNum = function (card) { + if (get.info("xunshi").isXunshi(card)) + return get.effect( + game + .filterPlayer(target => { + return player.canUse(card, target, true, true); + }) + .sort((a, b) => get.effect(b, card, player, player) - get.effect(a, card, player, player))[0], + card, + player, + player + ); + return player.getUseValue(card, true, true); + }; + return (getNum(b) || 0) - (getNum(a) || 0); + }); + return get.order(list[0], player) * 0.99; + } + return 0.001; + }, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond") return false; + const name = tag == "respondSha" ? "sha" : "shan"; + return get.info("olxuanzhu").hiddenCard(player, name); + }, + result: { player: 1 }, + }, + intro: { + markcount: "expansion", + mark(dialog, storage, player) { + const cards = player.getExpansions("olxuanzhu"); + if (cards.length) dialog.addSmall(player.getExpansions("olxuanzhu")); + dialog.addText( + (() => { + if (storage) return "每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。"; + return "每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用任意基本牌。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。"; + })(storage) + ); + }, + }, + onremove(player, skill) { + const cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + subSkill: { backup: {} }, + }, + oljiane: { + audio: 2, + trigger: { player: ["shaDamage", "useCardToEnd"] }, + filter(event, player, name) { + if (event.type != "card" || !event.target || !event.target.isIn() || event.target == player) return false; + if (name == "shaDamage") return true; + return event.card.name != "sha" && !event.getParent()._neutralized; + }, + logTarget: "target", + forced: true, + async content(event, trigger, player) { + trigger.target.addTempSkill("oljiane_neutralized"); + }, + group: "oljiane_neutralize", + global: "oljiane_ai", + subSkill: { + neutralize: { + audio: "oljiane", + trigger: { + target: "shaMiss", + global: "eventNeutralized", + }, + filter(event, player, name) { + if (event.type != "card") return false; + return name == "shaMiss" || event._neutralize_event.player == player; + }, + forced: true, + async content(event, trigger, player) { + player.addTempSkill("oljiane_nouse"); + }, + }, + ai: { + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (!arg || !arg.target || !arg.target.hasSkill("oljiane_neutralized")) return false; + }, + }, + }, + neutralized: { + charlotte: true, + mark: true, + marktext: "牌", + intro: { content: "本回合无法抵消牌" }, + trigger: { global: "useCard" }, + forced: true, + popup: false, + async content(event, trigger, player) { + const id = player.playerid; + const map = trigger.customArgs; + if (!map[id]) map[id] = {}; + map[id].directHit2 = true; + }, + mod: { + wuxieJudgeEnabled: () => false, + wuxieEnabled: () => false, + }, + }, + nouse: { + charlotte: true, + mark: true, + marktext: '', + intro: { content: "本回合无法成为牌的目标" }, + mod: { targetEnabled: () => false }, + }, + }, + }, + //刘磐 + olpijing: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return (event.card.name == "sha" || get.type(event.card) == "trick") && event.targets.length == 1; + }, + usable: 1, + direct: true, + locked: false, + async content(event, trigger, player) { + const num = Math.max(1, player.getDamagedHp()); + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt("olpijing"), [1, num], (card, player, target) => { + const trigger = get.event().getTrigger(); + if (trigger.targets.includes(target)) return true; + return target != player && lib.filter.targetEnabled2(trigger.card, player, target) && lib.filter.targetInRange(trigger.card, player, target); + }) + .set("ai", target => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + return (trigger.targets.includes(target) ? -1 : 1) * get.effect(target, trigger.card, player, player) * (target.getStorage("olpijing_effect").includes(player) ? 2 : 1) + get.effect(target, { name: "shunshou_copy2" }, player, player); + }) + .set("prompt2", "令至多" + get.cnNumber(num) + "名角色成为或取消成为" + get.translation(trigger.card) + "的目标并随机交给你一张牌"); + if (bool) { + player.logSkill("olpijing", targets); + for (const i of targets) { + trigger.targets[trigger.targets.includes(i) ? "add" : "remove"](i); + } + for (const target of targets) { + target.addSkill("olpijing_effect"); + target.markAuto("olpijing_effect", [player]); + const cards = target.getGainableCards(player, "he"); + if (cards.length) { + await target.give(cards.randomGets(1), player); + } + } + } else player.storage.counttrigger.olpijing--; + }, + mod: { + aiOrder(player, card, num) { + if (!(card.name == "sha" || get.type(card) == "trick")) return; + const info = get.info(card); + if ( + info && + !info.notarget && + (info.toself || info.singleCard || !info.selectTarget || info.selectTarget == 1) && + game.countPlayer(target => { + if (get.effect(target, card, player, player) <= 0) return false; + return lib.filter.targetEnabled2(card, player, target) && lib.filter.targetInRange(card, player, target); + }) > 1 + ) + return num + 0.01; + }, + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + intro: { + content: "使用的下一张基本牌或普通锦囊牌指定唯一目标时,可指定$为额外目标或摸一张牌", + }, + trigger: { player: "useCardToPlayer" }, + filter(event, player) { + return (get.type(event.card) == "basic" || get.type(event.card) == "trick") && event.targets.length == 1; + }, + forced: true, + popup: false, + async content(event, trigger, player) { + const storage = player.getStorage("olpijing_effect"); + player.removeSkill("olpijing_effect"); + const { + result: { bool, targets }, + } = await player + .chooseTarget("披荆:请选择此牌的额外目标", [1, storage.length], (card, player, target) => { + const trigger = get.event().getTrigger(); + return !trigger.targets.includes(target) && get.event("storage").includes(target) && lib.filter.targetEnabled2(trigger.card, player, target) && lib.filter.targetInRange(trigger.card, player, target); + }) + .set("prompt2", "不选择的角色视为你选择摸牌项") + .set("ai", target => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + return get.effect(target, trigger.card, player, player) - get.effect(player, { name: "draw" }, player, player); + }) + .set("storage", storage); + if (bool) { + player.line(targets); + trigger.targets.addArray(targets); + if (storage.length - targets.length > 0) { + player.draw(storage.length - targets.length); + } + } else player.draw(storage.length); + }, + }, + }, + }, + //郭图 + olqushi: { + audio: 2, + enable: "phaseUse", + usable: 1, + delay: false, + async content(event, trigger, player) { + await player.draw(); + if (player.countCards("h") && game.hasPlayer(target => target != player)) { + const { + result: { bool, targets, cards }, + } = await player.chooseCardTarget({ + forced: true, + prompt: "将一张手牌作为“趋”扣置于其他角色的武将牌上", + filterTarget: lib.filter.notMe, + filterCard: true, + position: "h", + ai1(card) { + if (get.type(card, false) == "equip") return 1 - get.value(card); + return 7 - get.value(card); + }, + ai2(target) { + const att = get.sgn(get.sgn(get.attitude(get.event("player"), target)) + 0.5); + return (target.countCards("h") + 1) * att; + }, + }); + if (bool) { + const target = targets[0]; + target.addSkill("olqushi_effect"); + target.markAuto("olqushi_effect", [player]); + game.log(player, "将一张牌扣置于", target, "的武将牌上"); + target.addToExpansion(cards, player, "giveAuto").gaintag.add("olqushi_effect"); + } + } + }, + ai: { + order: 1, + result: { player: 1 }, + }, + subSkill: { + effect: { + charlotte: true, + onremove(player, skill) { + delete player.storage[skill]; + const cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + marktext: "趋", + intro: { + content: "expansion", + markcount: "expansion", + mark(dialog, storage, player) { + return "共扣置" + get.cnNumber(player.getExpansions("olqushi_effect").length) + "张“趋”"; + }, + }, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + popup: false, + async content(event, trigger, player) { + const cards = player.getExpansions("olqushi_effect"); + if (cards.length) { + await player.loseToDiscardpile(cards); + const targets = player + .getStorage("olqushi_effect") + .filter(i => { + return i.isIn(); + }) + .sortBySeat(); + const num = Math.min( + player + .getHistory("useCard", evt => { + return evt.targets && evt.targets.length; + }) + .reduce((sum, evt) => { + return sum + evt.targets.length; + }, 0), + 5 + ); + if ( + targets.length && + player.getHistory("useCard", evt => { + return cards.some(card => get.type2(card) == get.type2(evt.card)); + }).length && + num + ) { + for (const target of targets) await target.draw(num); + } + } + player.removeSkill("olqushi_effect"); + }, + }, + }, + }, + olweijie: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter(event, player) { + if ( + !game.hasPlayer(target => { + return get.distance(player, target) == 1 && target.countCards("h"); + }) || + _status.currentPhase === player || + event.olweijie + ) + return false; + return get + .inpileVCardList(info => { + const name = info[2]; + return get.type(name) == "basic"; + }) + .some(card => event.filterCard({ name: card[2], nature: card[3], isCard: true }, player, event)); + }, + chooseButton: { + dialog(event, player) { + const list = get + .inpileVCardList(info => { + const name = info[2]; + return get.type(name) == "basic"; + }) + .filter(card => event.filterCard({ name: card[2], nature: card[3], isCard: true }, player, event)); + return ui.create.dialog("诿解", [list, "vcard"]); + }, + filter(button, player) { + return get.event().getParent().filterCard({ name: button.link[2], nature: button.link[3], isCard: true }, player, _status.event.getParent()); + }, + check(button) { + if (get.event().getParent().type != "phase") return 1; + return get.event("player").getUseValue({ name: button.link[2], nature: button.link[3], isCard: true }); + }, + backup(links, player) { + return { + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + filterCard: () => false, + selectCard: -1, + *precontent(event, map) { + delete event.result.skill; + const player = map.player; + let stop = false; + const result = yield player + .chooseTarget("请选择一名距离为1的角色", "弃置其一张手牌,若此牌牌名为【" + get.translation(event.result.card.name) + "】,则视为你使用/打出之", (card, player, target) => { + return get.distance(player, target) == 1 && target.countCards("h"); + }) + .set("ai", target => 1 - get.sgn(get.attitude(get.event("player"), target))); + if (result.bool) { + const target = result.targets[0]; + player.logSkill("olweijie", target); + player.tempBanSkill("olweijie", null, false); + const result2 = yield player + .discardPlayerCard(target, "h", true) + .set("prompt2", "若弃置的牌名为【" + get.translation(event.result.card.name) + "】,则视为你使用/打出之") + .set("ai", button => { + if (button.link.isKnownBy(get.event("player")) && button.link.name == get.event("namex")) return 114514; + return 1 + Math.random(); + }) + .set("namex", event.result.card.name); + if (result2.bool) { + const card = result2.cards[0]; + if (get.name(card, target) == event.result.card.name) { + player.popup("洗具"); + stop = true; + } else player.popup("杯具"); + } + } + if (!stop) { + const evt = event.getParent(); + evt.set("olweijie", true); + evt.goto(0); + delete evt.openskilldialog; + return; + } + }, + }; + }, + prompt(links, player) { + const nature = get.translation(links[0][3]) || ""; + const name = "【" + get.translation(links[0][2]) + "】"; + return "弃置距离为1的一名角色的一张手牌,若此牌牌名为" + name + ",则你视为使用" + nature + name; + }, + }, + ai: { + order: 10, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + const name = tag == "respondSha" ? "sha" : "shan"; + return lib.skill.olweijie.hiddenCard(player, name); + }, + result: { + player(player) { + if (_status.event.dying && get.attitude(player, _status.event.dying) <= 0) return 0; + return game.hasPlayer(target => { + if (get.attitude(player, target) > 0) return false; + return get.distance(player, target) == 1 && target.countCards("h"); + }) + ? 1 + : 0; + }, + }, + }, + hiddenCard(player, name) { + if (!lib.inpile.includes(name) || _status.currentPhase === player || player.isTempBanned("olweijie")) return false; + return ( + get.type(name) == "basic" && + game.hasPlayer(target => { + return get.distance(player, target) == 1 && target.countCards("h"); + }) + ); + }, + }, + //胡金定 + olqingyuan: { + audio: 2, + trigger: { + global: ["phaseBefore", "gainAfter", "loseAsyncAfter"], + player: ["enterGame", "damageEnd"], + }, + filter(event, player) { + const storage = player.getStorage("olqingyuan"); + if (event.name == "gain" || event.name == "loseAsync") { + if (player.hasSkill("olqingyuan_used")) return false; + return storage.some(target => event.getg(target).length) && storage.some(target => target.hasCard(card => lib.filter.canBeGained(card, target, player), "h")); + } + if (!game.hasPlayer(target => !storage.includes(target) && target != player)) return false; + if (event.name == "damage" && player.getAllHistory("damage").indexOf(event) != 0) return false; + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + async content(event, trigger, player) { + if (trigger.name == "gain" || trigger.name == "loseAsync") { + const target = player + .getStorage("olqingyuan") + .filter(target => target.hasCard(card => lib.filter.canBeGained(card, target, player), "h")) + .randomGet(); + player.line(target); + player.addTempSkill("olqingyuan_used"); + player.gain( + target + .getCards("h", card => { + return lib.filter.canBeGained(card, target, player); + }) + .randomGet(), + target, + "giveAuto" + ); + } else { + const filterTarget = (card, player, target) => { + return target != player && !player.getStorage("olqingyuan").includes(target); + }, + targetsx = game.filterPlayer(current => filterTarget(null, player, current)); + let result; + if (targetsx.length == 1) result = { bool: true, targets: targetsx }; + else + result = await player + .chooseTarget(filterTarget, true) + .set("prompt2", "每回合限一次,当你以此法选择的角色获得牌后,你随机获得其中一名角色的一张手牌") + .set("prompt", "请选择【轻缘】的目标") + .set("ai", target => { + const player = get.event("player"); + return get.effect(target, new lib.element.VCard({ name: "shunshou_copy2" }), player, player); + }) + .forResult(); + if (result.bool) { + const target = result.targets[0]; + player.line(target); + game.log(player, "选择了", target); + player.markAuto("olqingyuan", [target]); + } + } + }, + subSkill: { used: { charlotte: true } }, + intro: { content: "已选择$为目标" }, + ai: { + expose: 0.3, + }, + }, + olchongshen: { + audio: 2, + locked: false, + enable: "chooseToUse", + filterCard(card) { + return get.itemtype(card) == "card" && card.hasGaintag("olchongshen") && get.color(card) == "red"; + }, + position: "h", + viewAs: { name: "shan" }, + viewAsFilter(player) { + if (!player.countCards("h", card => card.hasGaintag("olchongshen") && get.color(card) == "red")) return false; + }, + prompt: "将本轮得到的红色牌当作【闪】使用", + check(card) { + return 7 - get.value(card); + }, + ai: { + order: 2, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond" || !player.countCards("h", card => _status.connectMode || (card.hasGaintag("olchongshen") && get.color(card) == "red"))) return false; + }, + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.6; + }, + }, + }, + group: "olchongshen_mark", + mod: { + aiValue(player, card, num) { + if (get.name(card) != "shan" && get.itemtype(card) == "card" && (!card.hasGaintag("olchongshen") || get.color(card) != "red")) return; + let cards = player.getCards("hs", card => get.name(card) == "shan" || card.hasGaintag("olchongshen")); + cards.sort((a, b) => (get.name(b) == "shan" ? 1 : 2) - (get.name(a) == "shan" ? 1 : 2)); + const geti = () => { + if (cards.includes(card)) return cards.indexOf(card); + return cards.length; + }; + if (get.name(card) == "shan") return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6.5, 4, 3][Math.min(geti(), 2)]); + }, + aiUseful() { + return lib.skill.olchongshen.mod.aiValue.apply(this, arguments); + }, + // ignoredHandcard(card,player){ + // if(card.hasGaintag('olchongshen')) return true; + // }, + // cardDiscardable(card,player,name){ + // if(name=='phaseDiscard'&&card.hasGaintag('olchongshen')) return false; + // }, + }, + init(player) { + if (game.phaseNumber > 0) { + const hs = player.getCards("h"), + history = player.getAllHistory(); + let cards = []; + for (let i = history.length - 1; i >= 0; i--) { + for (const evt of history[i].gain) { + cards.addArray(evt.cards); + } + if (history[i].isRound) break; + } + cards = cards.filter(i => hs.includes(i)); + if (cards.length) player.addGaintag(cards, "olchongshen"); + } + }, + onremove(player) { + player.removeGaintag("olchongshen"); + }, + subSkill: { + mark: { + charlotte: true, + trigger: { player: "gainBegin", global: "roundStart" }, + filter(event, player) { + return event.name == "gain" || game.roundNumber > 1; + }, + forced: true, + popup: false, + content() { + if (trigger.name == "gain") trigger.gaintag.add("olchongshen"); + else player.removeGaintag("olchongshen"); + }, + }, + }, + }, + //田畴 + olshandao: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(target => lib.skill.olshandao.filterTarget(null, player, target)); + }, + filterTarget(card, player, target) { + return target.countCards("he"); + }, + usable: 1, + selectTarget: [1, Infinity], + multitarget: true, + multiline: true, + async content(event, trigger, player) { + const wugu = new lib.element.VCard({ name: "wugu" }); + const wanjian = new lib.element.VCard({ name: "wanjian" }); + const targets = game.filterPlayer(target => { + if (target == player) return false; + return !event.targets.includes(target) && player.canUse(wanjian, target, false); + }), + targetx = event.targets.sortBySeat(); + let dialog = ["将这些角色的各一张牌置于牌堆顶,然后视为对这些角色使用【五谷丰登】"]; + for (const target of targetx) { + const name = target == player ? "你" : get.translation(target); + if (target.countCards("h")) { + dialog.add('
    ' + name + "的手牌区
    "); + if (player.hasSkillTag("viewHandcard", null, target, true) || player == target) dialog.push(target.getCards("h")); + else dialog.push([target.getCards("h"), "blank"]); + } + if (target.countCards("e")) dialog.addArray(['
    ' + name + "的装备区
    ", target.getCards("e")]); + } + const { + result: { bool, links }, + } = await player + .chooseButton(dialog, event.targets.length, true) + .set("filterButton", button => { + return !ui.selected.buttons.some(but => get.owner(but.link) == get.owner(button.link)); + }) + .set("ai", button => 1 / (get.value(button.link, get.owner(button.link)) || 0.5)); + if (bool) { + const cards = links.sort((a, b) => targetx.indexOf(get.owner(a)) - targetx.indexOf(get.owner(b))); + for (const card of cards) { + const target = get.owner(card); + target.$throw(1, 1000); + await target.lose([card], ui.cardPile, "insert"); + } + const targety = targetx.filter(target => player.canUse(wugu, target, false)); + if (targety.length) await player.useCard(wugu, targety, false); + if (targets.length) await player.useCard(wanjian, targets, false); + } + }, + ai: { + order: 9, + result: { target: 1 }, + }, + }, + //李异 + olchanshuang: { + audio: 2, + enable: "phaseUse", + filterTarget: lib.filter.notMe, + usable: 1, + content: function* (event, map) { + const player = map.player, + target = event.target; + const choiceList = ["重铸一张牌", "使用一张【杀】", "弃置两张牌"], + list = ["重铸", "出杀", "弃牌", "无法选择"]; + let result = []; + for (let current of [player, target]) { + let list1 = list.slice(), + choiceList1 = choiceList.slice(); + list1 = list1.filter(control => { + if (control == "无法选择") return false; + if (control == "重铸") return current.countCards("he", card => current.canRecast(card)); + if (control == "出杀") return current.countCards("he", card => card.name == "sha" && current.hasUseTarget(card)); + if (control == "弃牌") return current.countCards("he", card => lib.filter.cardDiscardable(card, current)) > 1; + }); + choiceList1 = choiceList.filter(control => { + if (choiceList.indexOf(control) == 0) return current.countCards("he", card => current.canRecast(card)); + if (choiceList.indexOf(control) == 1) return current.countCards("he", card => card.name == "sha" && current.hasUseTarget(card)); + if (choiceList.indexOf(control) == 2) return current.countCards("he", card => lib.filter.cardDiscardable(card, current)) > 1; + }); + if (list1.length) { + if (list1.length == 1) result.push(list.indexOf(list1[0])); + else { + let result1 = yield current + .chooseControl(list1) + .set("ai", () => { + const current = _status.event.player; + const controls = _status.event.controls.slice(); + if (controls.includes("出杀") && current.countCards("hs", card => card.name == "sha" && current.hasValueTarget(card))) return "出杀"; + if (controls.includes("重铸")) return "重铸"; + return "弃牌"; + }) + .set("choiceList", choiceList1); + if (result1.control) result.push(list.indexOf(result1.control)); + } + } else result.push(3); + } + player.popup(list[result[0]]); + target.popup(list[result[1]]); + for (let current of [player, target]) { + switch (list[result[current == player ? 0 : 1]]) { + case "重铸": { + let result2 = yield current.chooseCard("he", "请重铸一张牌", (card, player) => player.canRecast(card), true); + if (result2.bool) current.recast(result2.cards); + break; + } + case "出杀": { + current.chooseToUse({ + prompt: "请使用一张【杀】", + filterCard: function (card, player) { + if (card.name != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + forced: true, + ai1: function (card) { + return _status.event.player.getUseValue(card); + }, + }); + break; + } + case "弃牌": { + current.chooseToDiscard("he", 2, true); + break; + } + } + } + }, + ai: { + order: function (item, player) { + return get.order({ name: "sha" }, player) - 0.1; + }, + result: { + target: function (player, target) { + const att = get.attitude(player, target); + if ( + target.countCards("hs", card => { + return ( + card.name == "sha" && + game.hasPlayer(current => { + return target.canUse(card, current) && get.effect(current, card, target, target) > 0 && get.effect(current, card, target, player) > 0; + }) + ); + }) + ) + return 3; + if (att > 0) return 2; + if (!target.countCards("h")) return get.sgn(att) + (att == 0 ? 1 : 0); + return 0; + }, + }, + }, + group: "olchanshuang_end", + subSkill: { + end: { + audio: "olchanshuang", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + player.getHistory("lose", evt => { + if (evt.type == "discard") { + var evtx = evt.getl(player); + return evtx && evtx.cards2.length == 2; + } + return evt.getParent(2).name == "recast"; + }).length || player.getHistory("useCard", evt => evt.card.name == "sha").length + ); + }, + forced: true, + locked: false, + content: function* (event, map) { + let num = 0, + player = map.player; + if (player.getHistory("lose", evt => evt.getParent(2).name == "recast").length) num++; + if (player.getHistory("useCard", evt => evt.card.name == "sha").length) num++; + if ( + player.getHistory("lose", evt => { + if (evt.type == "discard") { + var evtx = evt.getl(player); + return evtx && evtx.cards2.length == 2; + } + }).length + ) + num++; + if (num && player.countCards("he", card => player.canRecast(card))) { + let result = yield player.chooseCard("he", "请重铸一张牌", (card, player) => player.canRecast(card), true); + if (result.bool) yield player.recast(result.cards); + } + if (num > 1 && player.countCards("he", card => card.name == "sha" && player.hasUseTarget(card))) { + yield player.chooseToUse({ + prompt: "请使用一张【杀】", + filterCard: function (card, player) { + if (card.name != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + forced: true, + ai1: function (card) { + return _status.event.player.getUseValue(card); + }, + }); + } + if (num > 2 && player.countCards("he", card => lib.filter.cardDiscardable(card, player))) yield player.chooseToDiscard("he", 2, true); + }, + }, + }, + }, + olzhanjin: { + audio: 2, + locked: true, + group: "olzhanjin_guanshi", + subSkill: { + guanshi: { + audio: "olzhanjin", + nobracket: true, + equipSkill: true, + trigger: { player: ["shaMiss", "eventNeutralized"] }, + filter: function (event, player) { + if (!player.hasEmptySlot(1) || !lib.card.guanshi || player.hasSkillTag("unequip_equip1")) return false; + if (event.type != "card" || event.card.name != "sha" || !event.target.isIn()) return false; + return player.countCards("he") >= 2; + }, + direct: true, + locked: false, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt("olzhanjin_guanshi"), "弃置两张牌,令" + get.translation(trigger.card) + "强制命中", 2, "he") + .set("ai", function (card) { + var evt = _status.event.getTrigger(); + if (get.attitude(evt.player, evt.target) < 0) { + if (player.needsToDiscard()) return 15 - get.value(card); + if (evt.baseDamage + evt.extraDamage >= Math.min(2, evt.target.hp)) return 8 - get.value(card); + return 5 - get.value(card); + } + return -1; + }) + .set("complexCard", true).logSkill = "olzhanjin_guanshi"; + "step 1"; + if (result.bool) { + if (event.triggername == "shaMiss") { + trigger.untrigger(); + trigger.trigger("shaHit"); + trigger._result.bool = false; + trigger._result.result = null; + } else trigger.unneutralize(); + } + }, + mod: { + attackRange: function (player, num) { + if (lib.card.guanshi && player.hasEmptySlot(1)) return num - lib.card.guanshi.distance.attackFrom; + }, + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (player._olzhanjin_guanshi_temp || !player.hasEmptySlot(1) || !lib.card.guanshi || player.hasSkillTag("unequip_equip1")) return; + player._olzhanjin_guanshi_temp = true; + var bool = + get.attitude(player, arg.target) < 0 && + arg.card && + arg.card.name == "sha" && + player.countCards("he", card => { + return card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) && get.value(card) < 5; + }) > 1; + delete player._olzhanjin_guanshi_temp; + return bool; + }, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("unequip_equip1")) return; + if (player == target && get.subtype(card) == "equip1") { + if (get.equipValue(card) <= get.equipValue({ name: "guanshi" })) return 0; + } + }, + }, + }, + }, + }, + }, + //曹宇 + olgongjie: { + audio: 2, + trigger: { global: "phaseBegin" }, + filter(event, player) { + if (!player.countCards("he")) return false; + return !game.hasPlayer(current => { + var history = current.actionHistory; + for (var num = history.length - 1; num >= 0; num--) { + if (history[num].isRound) break; + if (history[num].isSkipped) continue; + return true; + } + return false; + }); + }, + direct: true, + async content(event, trigger, player) { + var num = player.countCards("he"), + draws = []; + var { + result: { bool, targets }, + } = await player.chooseTarget(get.prompt2("olgongjie"), [1, num], lib.filter.notMe).set("ai", target => get.attitude(_status.event.player, target)); + if (!bool) return; + targets = targets.sortBySeat(); + player.logSkill("olgongjie", targets); + for (var target of targets) { + var { + result: { bool, cards }, + } = await target.gainPlayerCard(player, true, "he"); + if (bool) draws.add(get.suit(cards[0], player)); + } + player.draw(draws.length); + }, + }, + olxiangxv: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["gainAfter", "equipAfter", "addJudgeAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + if (!_status.currentPhase || !_status.currentPhase.isIn()) return false; + if (!player.isMinHandcard()) return false; + var evt = event.getl(player); + if (evt && evt.player == player && evt.hs && evt.hs.length > 0) return true; + if (event.getg) + return game.hasPlayer(current => { + var cards = event.getg(current); + if (!cards.length) return false; + return current.countCards("h") >= player.countCards("h") && current.countCards("h") - cards.length < player.countCards("h"); + }); + return false; + }, + check(event, player) { + var target = _status.currentPhase; + var cards = target.getCards("h"); + if (target.isPhaseUsing()) { + var cardx = cards.filter(card => get.name(card) == "sha"); + cardx.sort((a, b) => target.getUseValue(b) - target.getUseValue(a)); + cardx = cardx.slice(Math.min(cardx.length, target.getCardUsable("sha")), cardx.length); + cards.removeArray(cardx); + } + return cards.length - player.countCards("h") > 0; + }, + usable: 1, + logTarget: () => _status.currentPhase, + async content(event, trigger, player) { + player + .when({ global: "phaseEnd" }) + .then(() => { + if (target && target.isIn()) { + var num = target.countCards("h") - player.countCards("h"); + if (num) { + if (num > 0) { + if (player.countCards("h") < 5) player.draw(Math.min(5 - player.countCards("h"), num)); + event.finish(); + } else player.chooseToDiscard(-num, "h", true); + } else event.finish(); + } else event.finish(); + }) + .then(() => { + if (result.bool && result.cards.length > 1) { + if (player.isDamaged()) player.recover(); + } + }) + .vars({ target: _status.currentPhase }); + }, + }, + olxiangzuo: { + audio: 2, + trigger: { player: "dying" }, + filter(event, player) { + return player.countCards("he") && game.hasPlayer(target => target != player); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + prompt: get.prompt2("olxiangzuo"), + filterCard: true, + selectCard: [1, Infinity], + filterTarget: lib.filter.notMe, + complexCard: true, + complexTarget: true, + complexSelect: true, + ai1(card) { + const player = get.event("player"); + if (!ui.selected.targets.length) return 0; + const target = ui.selected.targets[0]; + if ( + player.hasAllHistory("useSkill", evt => { + return evt.skill == "olgongjie" && (evt.targets || [evt.target]).includes(target); + }) && + player.hasAllHistory("useSkill", evt => { + return evt.skill == "olxiangxv" && (evt.targets || [evt.target]).includes(target); + }) + ) { + if (get.attitude(player, target) > 0) return 1; + if (player.canSaveCard(card, player)) return 0; + if (ui.selected.cards.length + player.hp >= player.maxHp) return 0; + return 20 - get.value(card); + } + if (get.attitude(player, target) > 0 && !player.countCards("he", cardx => player.canSaveCard(cardx, player))) return 1; + return 0; + }, + ai2(target) { + const player = get.event("player"); + const goon = + player.hasAllHistory("useSkill", evt => { + return evt.skill == "olgongjie" && (evt.targets || [evt.target]).includes(target); + }) && + player.hasAllHistory("useSkill", evt => { + return evt.skill == "olxiangxv" && (evt.targets || [evt.target]).includes(target); + }), + att = get.attitude(player, target); + if (goon) return 5 * att; + if (player.countCards("he", cardx => player.canSaveCard(cardx, player)) > 0) return att; + return 0; + }, + }) + .forResult(); + }, + limited: true, + skillAnimation: true, + animationColor: "water", + async content(event, trigger, player) { + const target = event.targets[0], + cards = event.cards; + player.awakenSkill("olxiangzuo"); + await player.give(cards, target); + if ( + player.hasAllHistory("useSkill", evt => { + return evt.skill == "olgongjie" && evt.targets.includes(target); + }) && + player.hasAllHistory("useSkill", evt => { + return evt.skill == "olxiangxv" && evt.targets.includes(target); + }) + ) + await player.recover(cards.length); + }, + }, + //OL飞扬 + olfeiyang: { + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return ( + player.countCards("he", card => { + if (_status.connectMode && get.position(card) == "h") return true; + return lib.filter.cardDiscardable(card, player); + }) >= 3 && player.countCards("j") + ); + }, + direct: true, + //limited:true, + //skillAnimation:true, + //animationColor:'orange', + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("olfeiyang"), "he", 3) + .set("ai", function (card) { + var player = _status.event.player; + if ( + player.hasCard(function (card) { + return ( + get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) < 0 + ); + }, "j") + ) + return 6 - get.value(card); + return 0; + }) + .set("logSkill", "olfeiyang"); + "step 1"; + if (result.bool) { + //player.awakenSkill('olfeiyang'); + player.discardPlayerCard(player, "j", true); + } + }, + }, + //李婉 + ollianju: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + var history = player.getHistory("useCard"); + if (!history.length) return false; + var evt = history[history.length - 1]; + return evt.cards && evt.cards.filterInD("d").length; + }, + direct: true, + content: function () { + "step 0"; + var history = player.getHistory("useCard"); + var evt = history[history.length - 1]; + event.evt = evt; + player + .chooseTarget(get.prompt("ollianju"), "令一名角色获得" + get.translation(evt.cards.filterInD("d")) + "并记录" + get.translation(evt.card.name), lib.filter.notMe) + .set("ai", target => { + var player = _status.event.player, + att = get.attitude(player, target); + var cards = _status.event.cards; + if (cards.filter(card => get.name(card, false) == "du").length >= Math.ceil(cards.length / 2)) att *= -1; + if (target.skipList.includes("phaseUse") || target.hasJudge("lebu")) return att / 20; + return att; + }) + .set("cards", evt.cards.filterInD("d")); + "step 1"; + if (result.bool) { + var evt = event.evt; + var target = result.targets[0]; + player.logSkill("oliandui", target); + target.gain(evt.cards.filterInD("d"), "gain2"); + player.addSkill("ollianju_effect"); + player.storage.ollianju = evt.card.name; + player.markSkill("ollianju"); + if (!player.storage.ollianju_effect[target.playerid]) player.storage.ollianju_effect[target.playerid] = []; + player.storage.ollianju_effect[target.playerid].add(evt.card.name); + } + }, + onunmark: true, + intro: { + content: function (storage, player) { + var str = "当前最后一次记录牌名:" + get.translation(storage); + if (player.storage.ollianju_effect) { + for (var i in player.storage.ollianju_effect) { + var target = game.findPlayer(target => target.playerid == i); + if (!i) continue; + str += "
    "; + str += get.translation(target) + "的下个结束阶段,其可令你获得其本回合使用的最后一张牌对应的所有位于弃牌堆的实体牌"; + str += ",然后若此牌名为" + get.translation(player.storage.ollianju_effect[i]) + ",则你失去1点体力,否则你可以视为使用" + get.translation(player.storage.ollianju_effect[i]); + } + } + return str; + }, + }, + subSkill: { + effect: { + init: function (player) { + if (!player.storage.ollianju_effect) player.storage.ollianju_effect = {}; + }, + charlotte: true, + trigger: { global: ["phaseJieshuBegin", "die"] }, + filter: function (event, player) { + return player.storage.ollianju_effect[event.player.playerid]; + }, + direct: true, + content: function () { + "step 0"; + if (trigger.name == "phaseJieshu") event.list = player.storage.ollianju_effect[trigger.player.playerid]; + delete player.storage.ollianju_effect[trigger.player.playerid]; + var history = trigger.player.getHistory("useCard"); + var evt = history[history.length - 1]; + event.evt = evt; + if (trigger.name == "die" || !history.length || !evt.cards || !evt.cards.filterInD("d").length) event.finish(); + "step 1"; + var evt = event.evt; + trigger.player.chooseBool(get.prompt("ollianju", player), "令" + get.translation(player) + "获得" + get.translation(evt.cards.filterInD("d")) + (event.list.includes(evt.card.name) ? ",然后" + get.translation(player) + "失去1点体力" : "")).set("choice", get.attitude(trigger.player, player) > 0 && (!event.list.includes(evt.card.name) || player.getHp() > 1)); + "step 2"; + if (result.bool) { + var evt = event.evt, + cards = evt.cards.filterInD("d"); + trigger.player.line(player); + player.gain(cards, "gain2"); + if (event.list.includes(evt.card.name)) player.loseHp(); + else { + var card = { + name: evt.card.name, + isCard: true, + }; + if (player.hasUseTarget(card)) player.chooseUseTarget(card, false); + } + } + }, + }, + }, + }, + olsilv: { + audio: 2, + trigger: { + player: ["loseAfter", "gainAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + var name = player.storage.ollianju; + if (!name) return false; + if (event.getg) return event.getg(player).some(card => card.name == name) && !player.hasSkill("olsilv_gain"); + return event.getl(player).cards2.some(card => card.name == name) && !player.hasSkill("olsilv_lose"); + }, + forced: true, + content: function () { + "step 0"; + player.addTempSkill("olsilv_" + (trigger.getg ? "gain" : "lose")); + if (!trigger.visible) { + var cards, + name = player.storage.ollianju; + if (trigger.getg) cards = trigger.getg(player).filter(card => card.name == name); + else cards = trigger.getl(player).cards2.filter(card => card.name == name); + if (cards.length) player.showCards(cards, get.translation(player) + "发动了【思闾】"); + } + "step 1"; + player.draw(); + }, + ai: { combo: "ollianju" }, + subSkill: { + gain: { charlotte: true }, + lose: { charlotte: true }, + }, + }, + //丁尚涴 + olfudao: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + locked: false, + content: function () { + "step 0"; + player.draw(3); + "step 1"; + var num = player.countCards("h"); + if (num > 0) { + player.chooseCardTarget({ + prompt: "抚悼:将至多三张手张牌交给一名其他角色", + selectCard: [1, 3], + filterCard: true, + filterTarget: lib.filter.notMe, + position: "h", + ai1: function (card) { + if (card.name == "du") return 10; + else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + var player = _status.event.player; + if ( + ui.selected.cards.length > 4 || + !game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); + }) + ) + return 0; + return 1 / Math.max(0.1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -att; + if (target.hasSkillTag("nogain")) att /= 6; + return att; + }, + }); + } else event.goto(3); + "step 2"; + if (result.bool) { + player.give(result.cards, result.targets[0]); + } + "step 3"; + var num = player.countCards("h"); + if (num > 0) player.chooseToDiscard("h", [1, num], "抚悼:弃置任意张手牌,然后记录手牌数"); + "step 4"; + player.storage.olfudao = player.countCards("h"); + player.markSkill("olfudao"); + }, + intro: { + content: "一名角色的回合结束时,若其手牌数等于#,你可以与其各摸一张牌。", + }, + group: "olfudao_qiaoshi", + subSkill: { + qiaoshi: { + audio: "olfudao", + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + if (typeof player.storage.olfudao != "number") return false; + return event.player.countCards("h") == player.storage.olfudao && event.player.isIn(); + }, + check: function (event, player) { + return get.attitude(player, event.player) >= 0; + }, + logTarget: "player", + prompt2: function (event, player) { + return "与" + get.translation(event.player) + "各摸一张牌"; + }, + content: function () { + game.asyncDraw([trigger.player, player]); + }, + }, + }, + }, + olfengyan: { + audio: 2, + trigger: { player: ["damageEnd", "useCard", "respond"] }, + filter: function (event, player) { + if (event.name == "damage") return event.source && event.source.isIn() && event.source != player; + return Array.isArray(event.respondTo) && event.respondTo[0] != player; + }, + logTarget: function (event, player) { + if (event.name == "damage") return event.source; + return event.respondTo[0]; + }, + forced: true, + content: function () { + "step 0"; + var target = lib.skill.olfengyan.logTarget(trigger, player); + var str = get.translation(target); + event.target = target; + player + .chooseControl() + .set("choiceList", ["摸一张牌,然后交给" + str + "一张牌", "令" + str + "摸一张牌,然后" + str + "弃置两张牌"]) + .set("ai", () => (_status.event.att > 0 ? 0 : 1)) + .set("att", get.attitude(player, target)); + "step 1"; + if (result.index == 0) { + player.draw(); + player.chooseToGive(target, "he", true); + } else { + target.draw(); + target.chooseToDiscard(2, "he", true); + } + }, + }, + //张燕 + olsuji: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + if (!event.player.isDamaged()) return false; + return ( + (_status.connectMode && player.countCards("hes")) || + (!_status.connectMode && + player.hasCard(card => { + return get.color(card) == "black"; + }, "hes")) + ); + }, + direct: true, + content: [ + (event, map) => { + var player = map.player, + trigger = map.trigger; + var next = player.chooseToUse(); + next.set("openskilldialog", `###${get.prompt("olsuji")}###将一张黑色牌当【杀】使用${player == trigger.player ? "" : `。若${get.translation(trigger.player)}受到了此【杀】的伤害,你获得其一张牌。`}`); + next.set("norestore", true); + next.set("_backupevent", "olsuji_backup"); + next.set("addCount", false); + next.set("logSkill", "olsuji"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("olsuji_backup"); + }, + (event, map) => { + if (map.result.bool) { + var player = map.player, + trigger = map.trigger; + if ( + trigger.player.isIn() && + trigger.player.hasHistory("damage", evt => { + return evt.card && evt.card.storage && evt.card.storage.olsuji; + }) && + trigger.player.countGainableCards(player, "he") + ) + player.gainPlayerCard(trigger.player, "he", true); + } + }, + ], + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card" && get.color(card) == "black"; + }, + viewAs: { + name: "sha", + storage: { olsuji: true }, + }, + selectCard: 1, + position: "hes", + ai1: function (card) { + return 5 - get.value(card); + }, + precontent: function () { + delete event.result.skill; + }, + }, + }, + }, + ollangdao: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return event.isFirstTarget && event.targets.length == 1 && player.getStorage("ollangdao").length < 3; + }, + logTarget: "target", + onremove: true, + check: function (event, player) { + if (get.attitude(player, event.target) > 0) { + if ( + player.getStorage("ollangdao").includes(1) && + game.hasPlayer(current => { + return player.canUse(event.card, current) && get.effect(current, event.card, player, player) > 0; + }) + ) + return event.getRand() < 0.5; + return false; + } + return event.target.getHp() <= 2 || player.getDamagedHp() > 1 || !player.hasCard({ color: "black" }, "hes"); + }, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger, + result = map.result; + var target = trigger.target; + var send = function (card, list) { + var next = game.createEvent("ollangdao_choose", false); + next.setContent(lib.skill.ollangdao.contentx); + next.set("card", card); + next.set("list", list); + game.resume(); + }; + var sendback = function (result, player) { + if (!result) result = {}; + if (typeof result.index !== "number" || result.index < 0) { + result.index = [0, 1, 2].find(i => !event.player.getStorage("ollangdao").includes(i)); + } + results.push([player, result]); + }; + var ai_targets = []; + var results = []; + var players = [player, target]; + var withme = false, + withol = false, + withai = false; + for (var i = 0; i < players.length; i++) { + if (_status.connectMode) players[i].showTimer(); + var card = trigger.card, + list = player.getStorage("ollangdao"); + if (players[i].isOnline()) { + withol = true; + players[i].send(send, card, list); + players[i].wait(sendback); + } else if (players[i] == game.me) { + withme = true; + var next = game.createEvent("ollangdao_choose", false); + next.setContent(lib.skill.ollangdao.contentx); + next.set("card", card); + next.set("list", list); + if (_status.connectMode) game.me.wait(sendback); + } else { + ai_targets.push(players[i]); + } + } + if (ai_targets.length) { + for (var i = 0; i < ai_targets.length; i++) { + if (players.includes(ai_targets[i])) { + var target = ai_targets[i]; + var list = [0, 1, 2].removeArray(player.getStorage("ollangdao")); + var index = list[0]; + if (get.attitude(target, player) < 0) { + if ( + !game.hasPlayer(current => { + return !trigger.targets.includes(current) && player.canUse(trigger.card, current) && get.effect(current, trigger.card, player, target) < 0; + }) + ) + list.removeArray([0, 2]); + if (player.getStorage("ollangdao").includes(2)) list.remove(0); + } else { + if ( + !game.hasPlayer(current => { + return !trigger.targets.includes(current) && player.canUse(trigger.card, current) && get.effect(current, trigger.card, player, target) > 0; + }) + ) + list.remove(1); + if (!list.includes(1)) list.remove(0); + } + if (list.length) index = list.randomGet(); + sendback({ index: index }, target); + ai_targets.splice(i--, 1); + } + } + if (ai_targets.length) { + ai_targets.randomSort(); + setTimeout(function () { + event.interval = setInterval( + function () { + var target = ai_targets.shift(); + var list = [0, 1, 2].removeArray(player.getStorage("ollangdao")); + var index = list[0]; + if (get.attitude(target, player) < 0) { + if ( + !game.hasPlayer(current => { + return !trigger.targets.includes(current) && player.canUse(trigger.card, current) && get.effect(current, trigger.card, player, target) < 0; + }) + ) + list.removeArray([0, 2]); + if (player.getStorage("ollangdao").includes(2)) list.remove(0); + } else { + if ( + !game.hasPlayer(current => { + return !trigger.targets.includes(current) && player.canUse(trigger.card, current) && get.effect(current, trigger.card, player, target) > 0; + }) + ) + list.remove(1); + if (!list.includes(1)) list.remove(0); + } + if (list.length) index = list.randomGet(); + sendback({ index: index }, target); + if (!ai_targets.length) { + clearInterval(event.interval); + if (withai) game.resume(); + } + }, + _status.connectMode ? 750 : 75 + ); + }, 500); + } + } + if (withme) { + result = yield next; + if (_status.connectMode) { + game.me.unwait(result, game.me); + } else { + if (!result) result = {}; + if (typeof result.index !== "number" || result.index < 0) { + result.index = [0, 1, 2].find(i => !event.player.getStorage("ollangdao").includes(i)); + } + results.push([player, result]); + } + } + if (withol && !event.resultOL) { + game.pause(); + yield null; + } + if (ai_targets.length > 0) { + withai = true; + game.pause(); + yield null; + } + if (_status.connectMode) { + for (var i of [player, target]) i.hideTimer(); + } + var chosenCount = [0, 0, 0]; + results.sort((a, b) => lib.sort.seat(a[0], b[0])); + player + .when("useCardAfter") + .assign({ + card: trigger.card, + }) + .then(() => { + var card = get.info(event.name).card; + var dieEvts = game.getGlobalHistory("everything", evt => evt.name == "die"); + if ( + trigger.card == card && + !game.hasPlayer2(current => { + for (var evt of dieEvts) { + if (evt.player != current) continue; + var evtx = evt.getParent(2); + if (evtx.name != "damage") continue; + if (evtx.card && evtx.card == card) return true; + } + return false; + }, true) + ) { + var toRemove = card.storage.ollangdao_remove; + var list = [0, 1, 2].filter(i => (toRemove >> i) & 1); + if (!list.length) return; + player.markAuto("ollangdao", list); + game.log( + player, + "移去了", + "#g【狼蹈】", + "的", + "#y选项" + + list + .map(i => { + return get.cnNumber(i + 1, true); + }) + .join("、") + ); + } + }); + if (!trigger.card.storage) trigger.card.storage = {}; + if (!trigger.card.storage.ollangdao_remove) trigger.card.storage.ollangdao_remove = 0; + var config = [ + ["伤害+1", "fire"], + ["目标+1", "wood"], + ["不能响应", "water"], + ]; + for (var res of results) { + var target = res[0], + result = res[1]; + if (!target || !result) continue; + var ind = result.index; + var conf = config[ind]; + trigger.card.storage.ollangdao_remove |= 1 << ind; + target.popup(conf[0], conf[1]); + game.log(target, "选择令", trigger.card, `#g${conf[0]}`); + chosenCount[ind]++; + } + game.delay(); + var extraBaseDamage = chosenCount[0], + extraTargetNum = chosenCount[1], + directHit = chosenCount[2]; + trigger.getParent().baseDamage += extraBaseDamage; + if (directHit) trigger.directHit.addArray(game.players); + if (extraTargetNum <= 0) { + event.finish(); + return; + } + result = yield player + .chooseTarget(`狼蹈:为${get.translation(trigger.card)}额外指定至多${get.cnNumber(extraTargetNum)}个目标`, (card, player, target) => { + return !_status.event.targets.includes(target) && player.canUse(_status.event.card, target); + }) + .set("targets", trigger.targets) + .set("ai", target => { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayex(); + var targets = result.targets; + player.line(targets); + trigger.targets.addArray(targets); + game.log(targets, "也成为了", trigger.card, "的目标"); + } + }, + contentx: function () { + "step 0"; + var name = get.translation(card); + var choices = [], + choiceList = [`令${name}伤害基数+1`, `令${name}可以多选择一个目标`, `令${name}不可被响应`]; + [0, 1, 2].forEach((item, index) => { + if (event.list.includes(item)) { + choiceList[index] = `${choiceList[index]}`; + } else choices.push(`选项${get.cnNumber(index + 1, true)}`); + }); + game.me + .chooseControl(choices) + .set("prompt", "狼蹈:请选择一项") + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.controls.randomGet(); + }); + "step 1"; + event.result = { index: ["选项一", "选项二", "选项三"].indexOf(result.control) }; + }, + intro: { + content: (storage, player) => `已移除选项${storage.map(i => get.cnNumber(i + 1, true)).join("、")}`, + }, + }, + //张既 + skill_zhangji_A: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (player.countMark("skill_zhangji_A_count") >= player.hp) return false; + return event.target != player && event.target.countCards("h") && player.isPhaseUsing(); + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + logTarget: "target", + content: function () { + "step 0"; + player.addTempSkill("skill_zhangji_A_count", "phaseUseAfter"); + player.addMark("skill_zhangji_A_count", 1, false); + player.viewHandcards(trigger.target); + var list = [], + choiceList = ["弃置" + get.translation(trigger.target) + "的一张牌,然后若弃置的牌的是能造成火焰伤害的牌,你摸一张牌", "重铸" + get.translation(trigger.target) + "手牌中的所有【杀】和【决斗】", "你与" + get.translation(trigger.target) + "互相对对方造成1点伤害"]; + list.push("选项一"); + if (trigger.target.countCards("h", { name: ["sha", "juedou"] })) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (!trigger.target.countCards("h", { name: "shan" })) list.push("选项三"); + else choiceList[2] = '' + choiceList[2] + ""; + player + .chooseControl(list) + .set("prompt", get.prompt("tspowei", target)) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.target; + if (list.includes("选项三") && player.hp + player.countCards("hs", { name: "tao" }) > 2) return "选项三"; + if (list.includes("选项二") && target.countCards("h", { name: ["sha", "juedou"] }) > 1) return "选项二"; + return "选项一"; + }) + .set("target", trigger.target); + "step 1"; + game.log(player, "选择了", "#y" + result.control); + switch (result.control) { + case "选项一": + player.discardPlayerCard("he", trigger.target, "visible", true); + break; + case "选项二": + var cards = trigger.target.getCards("h", { name: ["sha", "juedou"] }).filter(card => trigger.target.canRecast(card)); + trigger.target.recast(cards); + event.finish(); + break; + case "选项三": + trigger.target.damage(player); + player.damage(trigger.target); + event.finish(); + break; + } + "step 2"; + if (result.bool && get.tag(result.cards[0], "fireDamage")) player.draw(); + }, + subSkill: { + count: { + charlotte: true, + onremove: true, + }, + }, + }, + skill_zhangji_B: { + getNum: function (name) { + var num = 0; + if (name == "litong") num = 1; + else + switch (game.getRarity(name)) { + case "junk": + num = 1; + break; + case "rare": + num = 2; + break; + case "epic": + num = 3; + break; + case "legend": + num = 4; + break; + } + return num; + }, + getCharacter: function (list) { + var listx = [], + num = 0; + for (var name of list) { + var numx = lib.skill.skill_zhangji_B.getNum(name); + if (numx > num) { + num = numx; + listx = [name]; + } else if (numx == num) listx.push(name); + } + return listx; + }, + group: "skill_zhangji_B_jieming", + audio: 2, + trigger: { player: "dying" }, + skillAnimation: true, + animationColor: "water", + direct: true, + content: function () { + "step 0"; + if (!_status.characterlist) lib.skill.pingjian.initList(); + player.chooseTarget(get.prompt("skill_zhangji_B"), "令一名其他角色选择是否更换武将牌", lib.filter.notMe).set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var num = lib.skill.skill_zhangji_B.getNum(target.name); + if (target.name2 != undefined) num = Math.min(num, lib.skill.skill_zhangji_B.getNum(target.name2)); + return att * (4 - num); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("skill_zhangji_B", target); + var list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + if (lib.character[_status.characterlist[i]][1] == "wei") list.push(_status.characterlist[i]); + } + list = list.randomGets(5); + var bolDialog = ["请选择替换的武将", [list, "character"]]; + target.chooseButton(bolDialog).set("ai", function (button) { + var target = _status.event.player; + var num = lib.skill.skill_zhangji_B.getNum(target.name); + if (target.name2 != undefined) num = Math.min(num, lib.skill.skill_zhangji_B.getNum(target.name2)); + return lib.skill.skill_zhangji_B.getNum(button.link) - num; + }); + } else event.finish(); + "step 2"; + if (result.bool) { + event.character = result.links[0]; + if (target.name2 != undefined) + target + .chooseControl(target.name1, target.name2) + .set("prompt", "请选择要更换的武将牌") + .set("ai", function () { + return lib.skill.skill_zhangji_B.getNum(target.name) < lib.skill.skill_zhangji_B.getNum(target.name2) ? target.name : target.name2; + }); + else result.control = target.name1; + } else { + target.chat("拒绝"); + game.log("但", target, "拒绝更换其武将牌"); + event.finish(); + } + "step 3"; + target.reinitCharacter(result.control, event.character); + target.update(); + }, + subSkill: { + jieming: { + audio: "skill_zhangji_B", + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h") < current.maxHp; + }); + }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + player + .chooseTarget(get.prompt("skill_zhangji_B"), "令一名手牌数小于其体力上限的角色摸三张牌,然后其将手牌数调整至其体力上限值", function (card, player, target) { + return target.countCards("h") < target.maxHp; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 6; + if (att > 2) return Math.min(5, target.maxHp) - target.countCards("h"); + return att / 3; + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("skill_zhangji_B_jieming", target); + target.draw(3); + } else event.finish(); + "step 3"; + if (target.countCards("h") > target.maxHp) target.chooseToDiscard("h", target.countCards("h") - target.maxHp, true); + if ( + event.count > 0 && + game.hasPlayer(function (current) { + return current.countCards("h") < current.maxHp; + }) && + player.hasSkill("skill_zhangji_B") + ) + event.goto(1); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + var max = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) > 0) { + max = Math.max(Math.min(5, players[i].hp) - players[i].countCards("h"), max); + } + } + switch (max) { + case 0: + return 2; + case 1: + return 1.5; + case 2: + return [1, 2]; + default: + return [0, max]; + } + } + if ((card.name == "tao" || card.name == "caoyao") && target.hp > 1 && target.countCards("h") <= target.hp) return [0, 0]; + }, + }, + }, + }, + }, + }, + //费祎 + yanru: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.countCards("h")) return false; + var num = player.countCards("h") % 2; + return !player.hasSkill("yanru_" + num); + }, + filterCard: function (card, player) { + if (player.countCards("h") && player.countCards("h") % 2 == 0) return lib.filter.cardDiscardable(card, player); + return false; + }, + selectCard: function () { + var player = _status.event.player; + if (player.countCards("h") && player.countCards("h") % 2 == 0) return [player.countCards("h") / 2, Infinity]; + return -1; + }, + prompt: function () { + var player = _status.event.player; + return [(player.countCards("h") ? "弃置至少一半的手牌,然后" : "") + "摸三张牌", "摸三张牌,然后弃置至少一半的手牌"][player.countCards("h") % 2]; + }, + check: function (card) { + var player = _status.event.player; + if (player.hasSkill("hezhong") && !(player.hasSkill("hezhong_0") && player.hasSkill("hezhong_1"))) { + if (player.countCards("h") - ui.selected.cards.length > 2) return 1 / (get.value(card) || 0.5); + return 0; + } + if (ui.selected.cards.length < player.countCards("h") / 2) return 5 - get.value(card); + return 0; + }, + complexCard: true, + discard: false, + lose: false, + delay: 0, + content: function () { + "step 0"; + var bool = player.countCards("h") % 2; + if (cards) player.discard(cards); + player.addTempSkill("yanru_" + bool, "phaseUseAfter"); + player.draw(3); + if (!bool) event.finish(); + "step 1"; + player.chooseToDiscard("h", "宴如:弃置至少一半手牌", [Math.floor(player.countCards("h") / 2), Infinity], true).set("ai", card => { + var player = _status.event.player; + if (player.hasSkill("hezhong") && !(player.hasSkill("hezhong_0") && player.hasSkill("hezhong_1")) && player.countCards("h") - ui.selected.cards.length > 2) return 1 / (get.value(card) || 0.5); + if (!player.hasSkill("hezhong") && ui.selected.cards.length < Math.floor(player.countCards("h") / 2)) return 1 / (get.value(card) || 0.5); + return 0; + }); + }, + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, + }, + ai: { + order: 3, + result: { player: 1 }, + }, + }, + hezhong: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + if (player.countCards("h") != 1 || typeof get.number(player.getCards("h")[0], player) != "number") return false; + if (player.hasSkill("hezhong_0") && player.hasSkill("hezhong_1")) return false; + let gain = 0, + lose = 0; + if (event.getg) gain = event.getg(player).length; + if (event.getl) lose = event.getl(player).hs.length; + return gain != lose; + }, + prompt2: function (event, player) { + var str = "展示最后一张手牌并摸一张牌"; + if (!player.hasSkill("hezhong_0") || !player.hasSkill("hezhong_0")) { + str += ",然后令本回合使用点数"; + if (!player.hasSkill("hezhong_0")) str += "大于"; + if (!player.hasSkill("hezhong_0") && !player.hasSkill("hezhong_0")) str += "或"; + if (!player.hasSkill("hezhong_1")) str += "小于"; + str += get.number(player.getCards("h")[0], player); + str += "的普通锦囊牌额外结算一次"; + } + return str; + }, + frequent: true, + content: function () { + "step 0"; + player.showHandcards(get.translation(player) + "发动了【技能】"); + event.num = get.number(player.getCards("h")[0], player); + "step 1"; + player.draw(); + "step 2"; + if (player.hasSkill("hezhong_0")) event._result = { index: 1 }; + else if (player.hasSkill("hezhong_1")) event._result = { index: 0 }; + else { + player + .chooseControl() + .set("choiceList", ["本回合使用点数大于" + num + "的普通锦囊牌额外结算一次", "本回合使用点数小于" + num + "的普通锦囊牌额外结算一次"]) + .set("ai", () => { + var player = _status.event.player; + var num = _status.event.player; + if ( + player.getCards("h").reduce(function (num, card) { + return num + (get.number(card, player) || 0); + }, 0) > + num * 2 + ) + return 0; + return 1; + }) + .set("num", num); + } + "step 3"; + var skill = "hezhong_" + result.index; + player.addTempSkill(skill); + player.markAuto(skill, [num]); + }, + subSkill: { + 0: { + charlotte: true, + onremove: true, + marktext: ">", + intro: { + markcount: list => { + var list2 = [1, 11, 12, 13]; + return list.reduce((str, num) => { + if (list2.includes(num)) return str + ["A", "J", "Q", "K"][list2.indexOf(num)]; + return str + parseFloat(num); + }, ""); + }, + content: "使用的下一张点数大于$的普通锦囊牌额外结算一次", + }, + audio: "hezhong", + trigger: { player: "useCard" }, + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + if (!event.targets.length) return false; + var num = get.number(event.card, player); + return typeof num == "number" && player.getStorage("hezhong_0").some(numx => num > numx); + }, + forced: true, + usable: 1, + content: function () { + player.unmarkSkill("hezhong_0"); + trigger.effectCount++; + game.log(trigger.card, "额外结算一次"); + }, + ai: { + effect: { + player: function (card, player, target) { + if (card.name == "tiesuo" && (!player.storage.counttrigger || !player.storage.counttrigger.hezhong_0)) return "zerotarget"; + }, + }, + }, + }, + 1: { + charlotte: true, + onremove: true, + marktext: "<", + intro: { + markcount: list => { + var list2 = [1, 11, 12, 13]; + return list.reduce((str, num) => { + if (list2.includes(num)) return str + ["A", "J", "Q", "K"][list2.indexOf(num)]; + return str + parseFloat(num); + }, ""); + }, + content: "使用的下一张点数小于$的普通锦囊牌额外结算一次", + }, + audio: "hezhong", + trigger: { player: "useCard" }, + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + if (!event.targets.length) return false; + var num = get.number(event.card, player); + return typeof num == "number" && player.getStorage("hezhong_1").some(numx => num < numx); + }, + forced: true, + usable: 1, + content: function () { + player.unmarkSkill("hezhong_1"); + trigger.effectCount++; + game.log(trigger.card, "额外结算一次"); + }, + ai: { + effect: { + player: function (card, player, target) { + if (card.name == "tiesuo" && (!player.storage.counttrigger || !player.storage.counttrigger.hezhong_1)) return "zerotarget"; + }, + }, + }, + }, + }, + }, + //吕伯奢 + olfushi: { + audio: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return event.player.isIn() && event.card.name == "sha" && event.cards && event.cards.filterInD().length && get.distance(player, event.player) <= 1; + }, + forced: true, + locked: false, + logTarget: "player", + content: function () { + player.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("olfushi"); + }, + marktext: "豕", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "olfushi_wusheng", + subSkill: { + wusheng: { + enable: "chooseToUse", + filter: function (event, player) { + return player.getExpansions("olfushi").length && event.filterCard({ name: "sha", isCard: true }, player, event); + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog('###缚豕###
    将任意“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并执行等量项
    ', player.getExpansions("olfushi"), [["额外目标", "伤害-1", "伤害+1"], "tdnodes"], "hidden"); + }, + filter: function (button) { + const cards = ui.selected.buttons.filter(button => typeof button.link == "object"); + if (cards.length >= 3 && typeof button.link == "string") return false; + return true; + }, + select: [2, Infinity], + filterOk: () => { + if (!ui.selected.buttons.length) return false; + const controls = ui.selected.buttons.filter(button => typeof button.link == "string"); + const cards = ui.selected.buttons.filter(button => typeof button.link == "object"); + if (cards.length >= 3) { + const dialog = get.event().dialog; + if (dialog && dialog.buttons) { + dialog.buttons.forEach(button => { + if (typeof button.link != "string") return; + button.classList.remove("selectable"); + button.classList.remove("selected"); + ui.selected.buttons.remove(button); + }); + } + return true; + } + return cards.length == controls.length; + }, + check: function (button) { + const player = get.player(); + const card = new lib.element.VCard({ name: "sha", isCard: true }); + const targets = game.filterPlayer(target => { + return player.canUse(card, target); + }); + const num0 = targets.filter(target => get.effect(target, card, player, player) > 0).length; + if (num0 <= 0) return 0; + const num1 = Math.max(0, num0 - 1); + const num2 = targets.length - num1; + const num3 = player.getExpansions("olfushi").length; + let list; + if ((num1 > 0 && num2 > 0) || (num1 == 0 && num2 == 0)) { + switch (num3) { + case 1: + list = [["额外目标", "伤害+1"].randomGet()]; + break; + case 2: + list = [["额外目标", "伤害+1"].randomGet(), "伤害-1"]; + break; + default: + list = ["额外目标", "伤害-1", "伤害+1"]; + break; + } + } else if (num2 == 0) { + switch (num3) { + case 1: + list = ["伤害+1"]; + break; + case 2: + list = ["额外目标", "伤害+1"]; + break; + default: + list = ["额外目标", "伤害-1", "伤害+1"]; + break; + } + } else if (num1 == 0) { + switch (num3) { + case 1: + list = ["伤害+1"]; + break; + default: + list = ["伤害-1", "伤害+1"]; + break; + } + } + if (typeof button.link == "string") { + if (list.includes(button.link)) return 114514; + return -1; + } else { + const cards = ui.selected.buttons.filter(button => typeof button.link == "object"); + if ((list.length == 3 && (player.getHp() <= 2 || cards.length < num3 - 1)) || cards.length < list.length) return 1 / (get.value(button.link) || 0.5); + return -1; + } + }, + backup: function (links, player) { + var cards = links.filter(button => typeof button == "object"); + var controls = links.filter(button => typeof button == "string"); + if (!controls.length) controls = ["额外目标", "伤害-1", "伤害+1"]; + return { + audio: "olfushi", + selectCard: -1, + position: "x", + cards: cards, + controls: controls, + filterCard: function (card) { + return lib.skill.olfushi_wusheng_backup.cards.includes(card); + }, + viewAs: { + name: "sha", + isCard: true, + }, + precontent: function () { + var cards = lib.skill.olfushi_wusheng_backup.cards.slice(); + var controls = lib.skill.olfushi_wusheng_backup.controls.slice(); + player.logSkill("olfushi"); + delete event.result.skill; + event.result.card = new lib.element.VCard(lib.skill.olfushi_wusheng_backup.viewAs); + event.result.cards = []; + player.loseToDiscardpile(cards); + player.draw(cards.length); + event.result.card.storage.olfushi_buff = controls; + player.addTempSkill("olfushi_buff"); + }, + }; + }, + prompt: function (links, player) { + let controls = links.filter(button => typeof button == "string"); + if (!controls.length) controls = ["额外目标", "伤害-1", "伤害+1"]; + return `请选择【杀】的目标(${controls.join("、")})`; + }, + }, + ai: { + order: function (item, player) { + return get.order({ name: "sha" }) + 0.1; + }, + result: { player: 1 }, + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + if (!player.getExpansions("olfushi").length) return false; + }, + }, + }, + buff: { + charlotte: true, + trigger: { player: ["useCard2", "useCardToPlayered"] }, + filter: function (event, player, name) { + if (!event.card.storage || !event.card.storage.olfushi_buff) return false; + if (name == "useCard2") return true; + return event.getParent().triggeredTargets3.length == event.targets.length && event.card.storage.olfushi_buff.length > 1 && event.card.storage.olfushi_buff.includes("伤害-1") && !event.targets.some(target => !event.targets.includes(target.getPrevious()) && !event.targets.includes(target.getNext())); + }, + forced: true, + popup: false, + content: function () { + "step 0"; + if (event.triggername == "useCardToPlayered") { + if (trigger.getParent().addCount !== false) { + trigger.getParent().addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + } + game.log(trigger.card, "不计入次数"); + event.finish(); + return; + } + var list = trigger.card.storage.olfushi_buff; + event.list = list; + var canBeAddedTargets = game.filterPlayer(target => { + return !trigger.targets.includes(target) && player.canUse(trigger.card, target); + }); + if (!list.includes("额外目标") || !canBeAddedTargets.length) event._result = { bool: false }; + else if (canBeAddedTargets.length == 1) event._result = { bool: true, targets: canBeAddedTargets }; + else + player + .chooseTarget( + "请选择" + get.translation(trigger.card) + "的额外目标", + function (card, player, target) { + var trigger = _status.event.getTrigger(); + return !trigger.targets.includes(target) && player.canUse(trigger.card, target); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets); + trigger.targets.addArray(targets); + game.log(targets, "成为了", trigger.card, "的额外目标"); + } + "step 2"; + if (!event.list.includes("伤害-1")) event._result = { bool: false }; + else if (trigger.targets.length == 1) event._result = { bool: true, targets: trigger.targets.slice() }; + else + player + .chooseTarget( + "请选择" + get.translation(trigger.card) + "伤害-1的目标", + function (card, player, target) { + var trigger = _status.event.getTrigger(); + return trigger.targets.includes(target); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target); + }); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + game.log(trigger.card, "对", target, "的伤害-1"); + player.addTempSkill("olfushi_buff2"); + player.initStorage("olfushi_buff2", []); + player.getStorage("olfushi_buff2").push([target, trigger.card]); + } + "step 4"; + if (!event.list.includes("伤害+1")) event.finish(); + else if (trigger.targets.length == 1) event._result = { bool: true, targets: trigger.targets.slice() }; + else + player + .chooseTarget( + "请选择" + get.translation(trigger.card) + "伤害+1的目标", + function (card, player, target) { + var trigger = _status.event.getTrigger(); + return trigger.targets.includes(target); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 5"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + game.log(trigger.card, "对", target, "的伤害+1"); + player.addTempSkill("olfushi_buff3"); + player.initStorage("olfushi_buff3", []); + player.getStorage("olfushi_buff3").push([target, trigger.card]); + } + }, + }, + buff2: { + charlotte: true, + onremove: true, + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return event.card && player.getStorage("olfushi_buff2").some(info => info[0] == event.player && info[1] == event.card); + }, + forced: true, + popup: false, + content: function () { + trigger.num--; + }, + ai: { + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (!card || !player.getStorage("olfushi_buff2").includes(card)) return; + var num = get.tag(card, "damage"); + if (num) { + if (num > 1) return 0.5; + return 0; + } + }, + }, + }, + }, + buff3: { + charlotte: true, + onremove: true, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return event.card && player.getStorage("olfushi_buff3").some(info => info[0] == event.player && info[1] == event.card); + }, + forced: true, + popup: false, + content: function () { + trigger.num++; + }, + }, + wusheng_backup: {}, + }, + }, + oldongdao: { + mode: ["doudizhu"], + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage) { + if (storage) return "农民的回合结束时,其可以进行一个额外回合"; + return "农民的回合结束时,你可以令地主进行一个额外回合"; + }, + }, + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + return event.player.identity == "fan"; + }, + direct: true, + content: function () { + "step 0"; + var target = player.storage.oldongdao ? trigger.player : game.zhu; + event.target = target; + var target2 = player.storage.oldongdao ? trigger.player : player; + event.target2 = target2; + target2.chooseBool(get.prompt("oldongdao"), "令" + get.translation(target) + "进行一个额外回合").set("ai", () => { + var event = _status.event.getParent(); + return get.attitude(event.target2, event.target) > 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("oldongdao"); + event.target2.line(target); + player.changeZhuanhuanji("oldongdao"); + target.insertPhase(); + } + }, + }, + //OL陆郁生 + olcangxin: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter(event, player) { + return ( + game + .getGlobalHistory( + "everything", + evt => { + return evt.name == "damage" && evt.player == player; + }, + event + ) + .indexOf(event) == 0 + ); + }, + checkx: function (event, player) { + var target = event.source; + return get.damageEffect(player, target, target) <= 0; + }, + forced: true, + content: function () { + "step 0"; + var cards = get.bottomCards(3, true); + player + .chooseButton(["###藏心:请选择要弃置的牌###若以此法弃置了红桃牌,则减少弃置红桃牌数的伤害", cards], [1, cards.length], true) + .set("ai", function (button) { + if (!_status.event.bool && get.suit(button.link, false) == "heart") return 0; + if (get.suit(button.link, false) != "heart") return 1; + const num = get.event().getTrigger().num; + if (num > ui.selected.buttons.filter(but => get.suit(but.link, false) == "heart").length) return 1; + return 0; + }) + .set("bool", lib.skill.olcangxin.checkx(trigger, player)); + "step 1"; + if (result.bool) { + player.$throw(result.links, 1000); + game.cardsDiscard(result.links); + const num = result.links.filter(card => get.suit(card, false) == "heart").length; + if (num) trigger.num -= Math.min(trigger.num, num); + } else event.finish(); + "step 2"; + game.delayx(); + }, + group: "olcangxin_yingzi", + subSkill: { + yingzi: { + audio: "olcangxin", + trigger: { player: "phaseDrawBegin" }, + forced: true, + content: function () { + var cards = get.bottomCards(3, true); + player.showCards(cards, get.translation(player) + "发动了【藏心】"); + var num = cards.filter(card => get.suit(card, false) == "heart").length; + if (num) player.draw(num); + }, + }, + }, + }, + olrunwei: { + audio: 2, + trigger: { global: "phaseDiscardBegin" }, + filter: function (event, player) { + if (event.player == player) return false; + return event.player.isDamaged(); + }, + direct: true, + content: function () { + "step 0"; + var str = get.translation(trigger.player); + player + .chooseControl("弃牌,+1", "摸牌,-1", "cancel2") + .set("choiceList", ["令" + str + "弃置一张牌,且其本回合手牌上限+1", "令" + str + "摸一张牌,且其本回合手牌上限-1"]) + .set("ai", function () { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + var target = trigger.player; + var num1 = target.countCards("h"), + num2 = target.getHandcardLimit(); + switch (get.sgn(get.attitude(player, target))) { + case 0: + return 2; + case 1: + if (num1 - 1 >= num2) return 0; + if (num1 + 1 <= num2) return 1; + return 2; + case -1: + if (num1 - 2 <= num2) return 0; + if (num1 + 3 >= num2) return 1; + return 2; + } + }) + .set("prompt", get.prompt("olrunwei", trigger.player)); + "step 1"; + if (result.index != 2) { + player.logSkill("olrunwei", trigger.player); + if (result.index == 0) { + trigger.player.chooseToDiscard("he", true).set("ai", card => { + if (get.position(card) == "e") return -get.value(card); + return 1 / (get.value(card) || 0.5); + }); + trigger.player.addTempSkill("olrunwei_+"); + trigger.player.addMark("olrunwei_+", 1, false); + } + if (result.index == 1) { + trigger.player.draw(); + trigger.player.addTempSkill("olrunwei_-"); + trigger.player.addMark("olrunwei_-", 1, false); + } + } + }, + subSkill: { + "+": { + charlotte: true, + onremove: true, + marktext: "+", + intro: { content: "手牌上限+#" }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("olrunwei_+"); + }, + }, + }, + "-": { + charlotte: true, + onremove: true, + marktext: "-", + intro: { content: "手牌上限-#" }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("olrunwei_-"); + }, + }, + }, + }, + }, + //曹羲 + olgangshu: { + audio: 2, + trigger: { + player: "useCardAfter", + }, + filter: function (event, player) { + return get.type2(event.card, false) != "basic"; + }, + getInfo: player => { + if (!player.storage.olgangshu_buff) player.storage.olgangshu_buff = [0, 0, 0]; + return player.storage.olgangshu_buff; + }, + direct: true, + group: "olgangshu_reset", + content: function () { + "step 0"; + var info = lib.skill.olgangshu.getInfo(player); + player + .chooseControl("攻击范围(" + info[0] + ")", "摸牌数(" + info[1] + ")", "使用杀的上限(" + info[2] + ")", "cancel2") + .set("prompt", get.prompt("olgangshu")) + .set("prompt2", '
    令以下一个数值+1(每项至多+5):
    1.攻击范围;
    2.下个摸牌阶段的摸牌数;
    3.使用【杀】的次数上限。
    ') + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var info = lib.skill.olgangshu.getInfo(player); + if (info[1] == 0) return 1; + if ( + info[2] < 5 && + player.hasCard(card => { + return get.name(card) == "sha" && player.hasValueTarget(card); + }, "hs") && + !player.getCardUsable("sha") + ) + return 2; + if ( + info[0] < 5 && + !game.hasPlayer(current => { + return player.inRange(current) && get.effect(current, { name: "sha" }, player, player) > 0; + }) + ) + return 0; + var rand = Math.random(); + var list = [0, 1, 2].filter(i => info[i] < 5); + if (!list.length) return "cancel2"; + if (rand < 0.2 && list.includes(0)) return 0; + if (rand < 0.7 && list.includes(1)) return 1; + if (rand < 1.0 && list.includes(2)) return 2; + return list.randomGet(); + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("olgangshu"); + player.addSkill("olgangshu_buff"); + var info = lib.skill.olgangshu.getInfo(player); + info[result.index] = Math.min(5, info[result.index] + 1); + game.log(player, "的", result.control.slice(0, result.control.indexOf("(")), "#y+1"); + player.markSkill("olgangshu_buff"); + } + }, + ai: { + threaten: 3, + }, + subSkill: { + buff: { + trigger: { player: "phaseDrawBegin2" }, + charlotte: true, + onremove: true, + forced: true, + filter: function (event, player) { + var info = lib.skill.olgangshu.getInfo(player); + if (!info[1]) return false; + return !event.numFixed; + }, + content: function () { + var info = lib.skill.olgangshu.getInfo(player); + trigger.num += info[1]; + info[1] = 0; + player.markSkill("olgangshu_buff"); + }, + mod: { + attackRange: function (player, range) { + var info = lib.skill.olgangshu.getInfo(player); + if (info) return range + info[0]; + }, + cardUsable: function (card, player, num) { + if (card.name != "sha") return; + var info = lib.skill.olgangshu.getInfo(player); + if (info) return num + info[2]; + }, + }, + mark: true, + intro: { + markcount: function (storage, player) { + var info = lib.skill.olgangshu.getInfo(player); + var str = ""; + info.forEach(num => (str += parseFloat(num))); + return str; + }, + content: function (storage, player) { + var info = lib.skill.olgangshu.getInfo(player); + var str = ""; + if (info[0] > 0) str += "
  • 攻击范围+" + info[0]; + if (info[1] > 0) str += "
  • 下个摸牌阶段摸牌数+" + info[1]; + if (info[2] > 0) str += "
  • 使用【杀】的次数上限+" + info[2]; + return str; + }, + }, + }, + reset: { + audio: "olgangshu", + trigger: { + global: ["shaMiss", "eventNeutralized"], + }, + filter: function (event, player) { + if (event.type != "card") return false; + var responder; + if (event.name == "sha") { + responder = event.target; + } else { + responder = event._neutralize_event.player; + } + return player == responder; + }, + forced: true, + locked: false, + content: function () { + player.removeSkill("olgangshu_buff"); + game.log(player, "重置了", "#g【刚述】", "的数值"); + }, + }, + }, + }, + oljianxuan: { + audio: 2, + trigger: { + player: "damageEnd", + }, + direct: true, + content: function () { + "step 0"; + var info = lib.skill.olgangshu.getInfo(player); + var list = []; + list.add(player.getAttackRange()); + list.add(2 + info[1]); + list.add(player.getCardUsable("sha", true)); + list.sort(); + var str = list.join("、").replace(/(.*)、/, "$1或"); + event.list = list; + player + .chooseTarget(get.prompt("oljianxuan"), "令一名角色摸一张牌,然后若其手牌数为" + str + ",其重复此流程") + .set("ai", target => { + var list = _status.event.list; + var player = _status.event.player; + var att = get.attitude(player, target); + if (att <= 0) return 0; + var num = target.countCards("h") + 1; + var value = 1; + while (true) { + if (list.includes(num)) { + value++; + num++; + } else break; + } + return value + att / 10; + }) + .set("list", list); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oljianxuan", target); + if (player != target) player.addExpose(0.15); + } else event.finish(); + "step 2"; + target.draw(); + "step 3"; + if (event.list.includes(target.countCards("h"))) event.goto(2); + }, + ai: { + combo: "olgangshu", + maixie: true, + }, + }, + //OL彭羕 + olxiaofan: { + audio: 2, + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (name != "wuxie" && lib.inpile.includes(name)) return true; + }, + getNum: player => player.getHistory("useCard").reduce((list, evt) => list.add(get.type2(evt.card)), []).length, + filter: function (event, player) { + if (event.responded || event.type == "wuxie" || event.olxiaofan) return false; + for (var i of lib.inpile) { + if (i != "wuxie" && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) return true; + } + return false; + }, + delay: false, + content: function () { + "step 0"; + var evt = event.getParent(2); + evt.set("olxiaofan", true); + var cards = get.bottomCards(lib.skill.olxiaofan.getNum(player) + 1, true); + var aozhan = player.hasSkill("aozhan"); + player + .chooseButton(["嚣翻:选择要使用的牌", cards]) + .set("filterButton", function (button) { + return _status.event.cards.includes(button.link); + }) + .set( + "cards", + cards.filter(function (card) { + 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) { + if (get.type(button.link) == "equip") return 0; + var evt = _status.event.getParent(3), + player = _status.event.player; + if (evt.type == "phase" && !player.hasValueTarget(button.link, null, true)) return 0; + 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 card = result.links[0]; + var name = card.name, + aozhan = player.hasSkill("aozhan") && name == "tao"; + if (aozhan) { + name = evt.filterCard( + { + name: "sha", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) + ? "sha" + : "shan"; + } + game.broadcastAll( + function (result, name) { + lib.skill.olxiaofan_backup.viewAs = { + name: name, + cards: [result], + isCard: true, + }; + }, + card, + name + ); + evt.set("_backupevent", "olxiaofan_backup"); + evt.set("openskilldialog", "请选择" + get.translation(card) + "的目标"); + evt.backup("olxiaofan_backup"); + } + evt.goto(0); + }, + ai: { + effect: { + target: function (card, player, target, effect) { + if (get.tag(card, "respondShan")) return 0.7; + if (get.tag(card, "respondSha")) return 0.7; + }, + }, + order: 12, + respondShan: true, + respondSha: true, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + }, + olxiaofan_backup: { + sourceSkill: "olxiaofan", + precontent: function () { + delete event.result.skill; + var name = event.result.card.name, + cards = event.result.card.cards.slice(0); + event.result.cards = cards; + var rcard = cards[0], + card; + if (rcard.name == name) card = get.autoViewAs(rcard); + else card = get.autoViewAs({ name, isCard: true }); + event.result.card = card; + var id = get.id(); + player + .when("chooseToUseAfter") + .filter(evt => evt == event.getParent()) + .then(() => { + var num = lib.skill.olxiaofan.getNum(player), + pos = "jeh".slice(0, num); + if (num > 0 && player.countCards(pos) > 0) { + event.maxNum = Math.min(3, num); + event.num = 0; + } else event.finish(); + }) + .then(() => { + var pos = "jeh"[event.num], + hs = player.countCards(pos); + if (hs > 0) player.chooseToDiscard(hs, pos, true); + event.num++; + if (event.num < event.maxNum) event.redo(); + }) + .translation("嚣翻"); + }, + filterCard: function () { + return false; + }, + selectCard: -1, + }, + oltuishi: { + audio: 2, + mod: { + wuxieJudgeEnabled: () => false, + wuxieEnabled: () => false, + cardEnabled: card => { + if (card.name == "wuxie") return false; + }, + targetInRange: card => { + if (card.storage && card.storage.oltuishi) return true; + }, + aiValue: (player, card, val) => { + if (card.name == "wuxie") return 0; + var num = get.number(card); + if ([1, 11, 12, 13].includes(num)) return val * 1.1; + }, + aiUseful: (player, card, val) => { + if (card.name == "wuxie") return 0; + var num = get.number(card); + if ([1, 11, 12, 13].includes(num)) return val * 1.1; + }, + aiOrder: (player, card, order) => { + if (get.name(card) == "sha" && player.hasSkill("oltuishi_unlimit")) order += 9; + var num = get.number(card); + if ([1, 11, 12, 13].includes(num)) order += 3; + return order; + }, + }, + trigger: { player: ["useCard", "useCardAfter"] }, + filter: function (event, player, name) { + if (name == "useCardAfter") { + if (player.isTempBanned("olxiaofan")) return false; + return ( + player + .getHistory("useCard", evt => { + return ( + !player.getHistory("sourceDamage", evt2 => { + return evt2.card && evt2.card == evt.card; + }).length && get.tag(evt.card, "damage") + ); + }) + .indexOf(event) >= 2 + ); + } + return [1, 11, 12, 13].includes(get.number(event.card)); + }, + forced: true, + content: function () { + "step 0"; + if (event.triggername == "useCardAfter") { + player.tempBanSkill("olxiaofan"); + event.finish(); + return; + } + trigger.targets.length = 0; + trigger.all_excluded = true; + game.log(trigger.card, "被无效了"); + "step 1"; + player.draw(); + player.addSkill("oltuishi_unlimit"); + }, + subSkill: { + unlimit: { + charlotte: true, + mod: { + cardUsableTarget: (card, player, target) => { + if (target.countCards("h") < player.countCards("h")) return true; + }, + targetInRange: (card, player, target) => { + if (target.countCards("h") < player.countCards("h")) return true; + }, + }, + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (!event.targets || !event.targets.length) return false; + let num = 0; + if (event.cards && event.cards.length) { + const history = player.getHistory("lose", evt => { + if (evt.getParent() != event) return false; + return event.cards.some(card => evt.hs.includes(card)); + }); + if (history.length) num += event.cards.filter(card => history[0].hs.includes(card)).length; + } + return event.targets.some(target => player.countCards("h") + num > target.countCards("h") + (target == player ? num : 0)); + }, + forced: true, + popup: false, + silent: true, + firstDo: true, + content: function () { + player.removeSkill("oltuishi_unlimit"); + var card = trigger.card; + if (!card.storage) card.storage = {}; + card.storage.oltuishi = true; + if (trigger.addCount !== false) { + trigger.addCount = false; + player.getStat("card")[card.name]--; + } + }, + mark: true, + intro: { content: "对手牌数小于你的角色使用的下一张牌无距离次数限制" }, + }, + }, + }, + //OL牵招 + olweifu: { + audio: 2, + enable: "phaseUse", + filterCard: lib.filter.cardDiscardable, + position: "he", + filter: function (event, player) { + return player.hasCard(card => lib.filter.cardDiscardable(card, player), "he"); + }, + check: function (card) { + var player = _status.event.player; + return (5 - get.value(card)) / Math.pow(Math.max(0.1, player.getUseValue(card)), 0.33); + }, + content: function () { + "step 0"; + player + .judge(card => { + var evt = _status.event.getParent(); + var cardx = evt.cards[0]; + if (get.type2(card) == get.type2(cardx)) return 0.5; + return 0.1; + }) + .set("callback", function () { + var card = event.judgeResult.card; + player.addTempSkill("olweifu_clear"); + player.addTempSkill("olweifu_add"); + if (!get.is.object(player.storage.olweifu_add)) player.storage.olweifu_add = {}; + var type = get.type2(card, player); + if (typeof player.storage.olweifu_add[type] != "number") player.storage.olweifu_add[type] = 0; + player.storage.olweifu_add[type]++; + player.markSkill("olweifu_add"); + if (type == get.type2(event.getParent(2).cards[0], player)) player.draw(); + }) + .set("judge2", result => result.bool); + }, + ai: { + order: 7, + result: { + player: function (player) { + return player.hasCard(card => { + var type = get.type2(card); + if (type == "equip") return false; + return ( + player.hasUseTarget(card) && + player.getUseValue(card) > 5 && + game.countPlayer(current => { + return lib.filter.targetEnabled2(card, player, current) && get.effect(current, card, player, player) > 0; + }) + + 1 > + (get.is.object(player.storage.olweifu_add) ? player.storage.olweifu_add[type] || 0 : 0) + ); + }, "hs") + ? 1 + : 0; + }, + }, + }, + subSkill: { + clear: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + var type = get.type2(event.card); + if (get.is.object(player.storage.olweifu_add) && typeof player.storage.olweifu_add[type] == "number") return true; + return false; + }, + silent: true, + firstDo: true, + charlotte: true, + content: function () { + var type = get.type2(trigger.card); + var num = player.storage.olweifu_add[type]; + delete player.storage.olweifu_add[type]; + if (get.is.empty(player.storage.olweifu_add)) { + delete player.storage.olweifu_add; + player.unmarkSkill("olweifu_add"); + } + trigger._olweifu_clear = num; + }, + }, + add: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (!event._olweifu_clear) return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(current => { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); + }) + ) + return true; + } + return false; + }, + onremove: true, + charlotte: true, + direct: true, + content: function () { + "step 0"; + var num = trigger._olweifu_clear; + player + .chooseTarget(get.prompt("olweifu"), "为" + get.translation(trigger.card) + "额外指定" + get.cnNumber(num) + "个目标。", [1, num], (card, player, target) => { + return !_status.event.sourcex.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + var targets = result.targets; + player.logSkill("olweifu_add", targets); + trigger.targets.addArray(targets); + game.log(targets, "也成为了", trigger.card, "的目标"); + if (!event.isMine() && !event.isOnline()) game.delayex(); + } + }, + intro: { + markcount: () => 0, + content: (storage, player) => { + if (!get.is.object(storage)) return; + var str = "使用下一张以下类型的牌无距离限制,且可以额外指定对应数量个目标:"; + for (var type in storage) { + str += "
  • " + get.translation(type) + "牌:+" + storage[type]; + } + return str; + }, + }, + mod: { + targetInRange: (card, player) => { + var type = get.type2(card); + if (get.is.object(player.storage.olweifu_add) && typeof player.storage.olweifu_add[type] == "number") return true; + }, + }, + }, + }, + }, + olkuansai: { + audio: 2, + trigger: { + global: "useCardToPlayered", + }, + filter: function (event, player) { + return event.isFirstTarget && event.targets.length >= player.getHp(); + }, + direct: true, + usable: 1, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("olkuansai"), "令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。", (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set("targets", trigger.targets) + .set("ai", target => { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0) return 1; + return (1 - att) / Math.sqrt(1 + target.countCards("he")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olkuansai", target); + var position = "e"; + if (player != target) position += "h"; + var forced = player.isHealthy(); + var str = "请交给其一张牌" + (forced ? "" : "或点击“取消”令其回复1点体力") + "。"; + if (!target.countCards(position)) event._result = { bool: false }; + else + target + .chooseCard(get.translation(player) + "对你发动了【款塞】", str, position, forced) + .set("ai", card => { + if (_status.event.recover) return 0; + var target = _status.event.player, + player = _status.event.getParent().player; + if (get.attitude(target, player) > 0) { + return get.value(card, target) - get.value(card, player); + } + if (get.tag(card, "recover")) return -1; + return 6.5 - get.value(card); + }) + .set( + "recover", + (function () { + if (forced) return false; + var recoverEff = get.recoverEffect(player, target, target); + var att = get.attitude(target, player); + if (att < 0) { + if (recoverEff >= 0) return true; + if ( + target.hasCard(card => { + return (get.value(card) < 6.5 && !get.tag(card, "recover")) || get.value(card) <= 0.05; + }, position) + ) + return false; + } else { + if (recoverEff > 0) return true; + if ( + target.hasCard(card => { + return get.value(card, target) < get.value(card, player); + }, position) + ) + return false; + } + return true; + })() + ); + } else { + player.storage.counttrigger.olkuansai--; + event.finish(); + } + "step 2"; + if (result.bool) { + target.give(result.cards, player); + } else player.recover(target); + }, + }, + //牛金 + olcuorui: { + audio: "cuorui", + trigger: { + global: "phaseBefore", + player: "enterGame", + target: "useCardToTargeted", + }, + filter: function (event, player) { + if (event.name == "useCardToTargeted") return get.type(event.card) == "delay" && !player.hasSkill("olcuorui_skip"); + return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") < Math.min(8, game.countPlayer()); + }, + forced: true, + content: function () { + if (trigger.name == "useCardToTargeted") { + player.skip("phaseJudge"); + player.addTempSkill("olcuorui_skip", { player: "phaseJudgeSkipped" }); + } else player.drawTo(Math.min(8, game.countPlayer())); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.type(card) == "delay") return "zerotarget"; + }, + }, + }, + subSkill: { + skip: { + mark: true, + intro: { content: "跳过下个的判定阶段" }, + }, + }, + }, + //何进 + olmouzhu: { + audio: "mouzhu", + inherit: "mouzhu", + content: function () { + "step 0"; + target.chooseCard("h", "交给" + get.translation(player) + "一张手牌", true); + "step 1"; + if (result.bool) target.give(result.cards, player); + "step 2"; + if (player.countCards("h") <= target.countCards("h")) { + event.finish(); + return; + } + var list = []; + if (target.hasUseTarget({ name: "sha" })) list.push("sha"); + if (target.hasUseTarget({ name: "sha" })) list.push("juedou"); + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { control: list[0] }; + else + target + .chooseControl(list) + .set("prompt", "谋诛:视为使用一张【杀】或【决斗】") + .set("ai", function () { + var player = _status.event.player; + return player.getUseValue({ name: "sha" }) > player.getUseValue({ name: "juedou" }) ? "sha" : "juedou"; + }); + "step 3"; + if (result.control) target.chooseUseTarget({ name: result.control }, true); + }, + ai: { + order: 7, + result: { + target: function (player, target) { + if ( + get.attitude(target, player) > 0 && + game.hasPlayer(function (current) { + if (current == target) return false; + for (var card of [{ name: "sha" }, { name: "juedou" }]) { + if (target.canUse(card, current) && get.effect(current, card, target, player) > 0 && get.effect(current, card, target, target) > 0) return true; + } + return false; + }) && + target.countCards("h") < player.countCards("h") + 2 + ) + return 3; + if (!target.hasValueTarget({ name: "sha" }) && !target.hasValueTarget({ name: "juedou" })) return -2; + if (target.countCards("h") + 1 > player.countCards("h")) return -2; + var canSave = function (player, target) { + return target.hp + player.countCards("hs", card => player.canSaveCard(card, target)) > 1 + ((get.mode() == "identity" && target.identity == "zhu") || (get.mode() == "guozhan" && get.is.jun(target))); + }; + if (target.hasValueTarget({ name: "sha" })) { + var aimx = game + .filterPlayer(current => { + return target.canUse({ name: "sha" }, current) && get.effect(current, { name: "sha" }, target, target) > 0; + }) + .sort((a, b) => get.effect(b, { name: "sha" }, target, target) - get.effect(a, { name: "sha" }, target, target))[0]; + if (aimx && get.effect(aimx, { name: "sha" }, target, player) < 0 && get.effect(aimx, { name: "sha" }, target, aimx) < 0 && !canSave(player, aimx)) return 0; + } + if (target.hasValueTarget({ name: "juedou" })) { + var aimy = game + .filterPlayer(current => { + return target.canUse({ name: "juedou" }, current) && get.effect(current, { name: "juedou" }, target, target) > 0; + }) + .sort((a, b) => get.effect(b, { name: "juedou" }, target, target) - get.effect(a, { name: "juedou" }, target, target))[0]; + if (aimy && get.effect(aimy, { name: "juedou" }, target, player) < 0 && get.effect(aimy, { name: "sha" }, target, aimy) < 0 && !canSave(player, aimy)) return 0; + } + return -1; + }, + }, + }, + }, + olyanhuo: { + audio: "yanhuo", + trigger: { player: "die" }, + forceDie: true, + filter: function (event, player) { + if (!event.source || !event.source.isIn() || !event.source.countCards("he")) return false; + return player.countCards("he") > 0; + }, + check: function (event, player) { + return get.effect(event.source, { name: "guohe_copy2" }, player, player) > 0; + }, + logTarget: "source", + skillAnimation: true, + animationColor: "thunder", + content: function () { + player.discardPlayerCard(trigger.source, "he", [1, player.countCards("he")], true).set("forceDie", true); + }, + }, + //韩遂 + olniluan: { + audio: "niluan", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + event.player.getHp() > player.getHp() && + event.player.getHistory("useCard", function (card) { + return card.card.name == "sha"; + }).length && + player.countCards("hes", card => get.color(card, player) == "black" && player.canUse(get.autoViewAs({ name: "sha" }, [card]), event.player, false)) + ); + }, + direct: true, + content: function () { + var next = player.chooseToUse(); + next.set("openskilldialog", "逆乱:是否将一张黑色牌当作【杀】对" + get.translation(trigger.player) + "使用?"); + next.set("norestore", true); + next.set("_backupevent", "niluanx"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("niluanx"); + next.set("targetRequired", true); + next.set("complexSelect", true); + next.set("filterTarget", function (card, player, target) { + if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false; + return lib.filter.targetEnabled.apply(this, arguments); + }); + next.set("sourcex", trigger.player); + next.set("addCount", false); + next.logSkill = "olniluan"; + }, + }, + olxiaoxi: { + audio: "xiaoxi", + audioname: ["machao", "hansui", "pangde"], + trigger: { global: "roundStart" }, + filter: function (event, player) { + return player.hasUseTarget({ name: "sha" }, false); + }, + direct: true, + content: function () { + player.chooseUseTarget({ name: "sha" }, get.prompt("olxiaoxi"), "视为使用一张无距离限制的【杀】", false, "nodistance").logSkill = "olxiaoxi"; + }, + }, + //段颎 + olsaogu: { + audio: 2, + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage) { + if (storage) return "转换技。①出牌阶段,你可以摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色摸一张牌。"; + return "转换技。①出牌阶段,你可以弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】。②结束阶段,你可以弃置一张牌,令一名其他角色弃置两张牌,然后其使用弃置的【杀】。"; + }, + }, + onChooseToUse: function (event) { + if (!game.online && !event.olsaogu) { + var list = [], + player = event.player; + var evtx = event.getParent("phaseUse"); + player.getHistory("lose", evt => { + if (evt.type == "discard" && evt.getParent("phaseUse") == evtx) list.addArray(evt.cards2); + }); + event.set("olsaogu", list); + } + }, + enable: "phaseUse", + filter: function (event, player) { + var storage = player.storage.olsaogu; + if (storage) return true; + return ( + player.getDiscardableCards(player, "he").filter(card => { + if (event.olsaogu && event.olsaogu.some(cardx => get.suit(cardx, false) == get.suit(card, player))) return false; + return true; + }).length > 1 + ); + }, + filterCard: function (card, player) { + if (player.storage.olsaogu) return false; + if (_status.event.olsaogu && _status.event.olsaogu.some(cardx => get.suit(cardx, false) == get.suit(card, player))) return false; + return true; + }, + selectCard: function () { + var player = _status.event.player; + return player.storage.olsaogu ? -1 : 2; + }, + position: "he", + check: function (card) { + var player = _status.event.player; + if (card.name == "sha") return player.hasValueTarget(card) ? 10 : 0.001; + return 6 - get.value(card); + }, + prompt: function () { + var player = _status.event.player; + var storage = player.storage.olsaogu; + if (storage) return "摸一张牌"; + var list = _status.event.olsaogu, + str = ""; + if (list && list.length) { + var text = "", + suits = list + .reduce(function (list, card) { + return list.add(get.suit(card, false)), list; + }, []) + .sort((a, b) => lib.suit.indexOf(b) - lib.suit.indexOf(a)); + for (var i = 0; i < suits.length; i++) text += get.translation(suits[i]); + str += "(不能弃置" + text + "花色的牌)"; + } + return "弃置两张牌" + str + ",然后使用其中的【杀】"; + }, + content: function () { + player.changeZhuanhuanji("olsaogu"); + if (!cards.length) player.draw(); + else { + var cardx = cards.filter(card => card.name == "sha"); + if (cardx.length) { + var next = game.createEvent("olsaogu_chooseToUseSha"); + next.player = player; + next.cards = cardx; + next.setContent(lib.skill.olsaogu.chooseToUseSha); + } + } + }, + ai: { + order: function (item, player) { + return get.order({ name: "sha" }, player) - 0.2; + }, + result: { + player: function (player) { + var storage = player.storage.olsaogu; + if (storage) return 1; + if ( + player.getDiscardableCards(player, "he").filter(card => { + if (card.name != "sha") return false; + if (_status.event.olsaogu && _status.event.olsaogu.some(cardx => get.suit(cardx, false) == get.suit(card, player))) return false; + return true; + }).length + ) + return 1; + return 0; + }, + }, + }, + group: "olsaogu_effect", + subSkill: { + effect: { + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + if (_status.connectMode) return player.countCards("he"); + return player.countDiscardableCards(player, "he"); + }, + direct: true, + content: function () { + "step 0"; + var list = []; + player.getHistory("lose", evt => { + if (evt.type == "discard" && evt.getParent("phaseJieshu").name == "phaseJieshu") list.addArray(evt.cards2); + }); + event.list = list; + var str, + storage = player.storage.olsaogu; + if (storage) str = "弃置一张牌,令一名其他角色摸一张牌。"; + else { + str = "弃置一张牌,令一名其他角色弃置两张牌(不能包含你本阶段弃置过的花色),然后其使用弃置的【杀】。"; + if (list.length) { + var text = "", + suits = list + .reduce(function (list, card) { + return list.add(get.suit(card, false)), list; + }, []) + .sort((a, b) => lib.suit.indexOf(b) - lib.suit.indexOf(a)); + for (var i = 0; i < suits.length; i++) text += get.translation(suits[i]); + str += "
    本阶段已弃置过" + text + "花色的牌。"; + } + } + player + .chooseCardTarget({ + prompt: get.prompt("olsaogu"), + prompt2: str, + filterTarget: function (card, player, target) { + return player != target && target.countCards("he") > 1; + }, + filterCard: lib.filter.cardDiscardable, + position: "he", + complexCard: true, + complexSelect: true, + ai1: function (card) { + var player = _status.event.player; + if (!player.storage.olsaogu && _status.event.list.some(cardx => get.suit(cardx, false) == get.suit(card, player))) return 7 - get.value(card); + return 5 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (player.storage.olsaogu) return att; + var list = _status.event.list.slice(); + if (ui.selected.cards.length) list.addArray(ui.selected.cards); + var cards = target.getCards("he", card => { + if (card.name != "sha" || list.some(cardx => get.suit(cardx, false) == get.suit(card, target))) return false; + return ( + lib.filter.cardDiscardable(card, target) && + game.hasPlayer(function (current) { + if (!current.canUse(card, target, false)) return false; + return get.effect(current, card, target, target) > 0 && get.effect(current, card, target, player) > 0; + }) + ); + }); + if (cards.length && att > 0) + return ( + Math.sqrt(Math.min(2, cards.length)) * + cards.reduce(function (num, card) { + var players = game.filterPlayer(current => target.canUse(card, current, false)); + players.sort((a, b) => get.effect(b, card, target, target) * get.effect(b, card, target, player) - get.effect(a, card, target, target) * get.effect(a, card, target, player)); + return (num = get.effect(players[0], card, target, target) * get.effect(players[0], card, target, player)); + }, 0) + ); + return ( + get.effect(target, { name: "guohe_copy2" }, player, player) * + Math.sqrt( + Math.min( + 2, + target.getDiscardableCards(player, "he").filter(card => { + return !list.some(cardx => get.suit(cardx, false) == get.suit(card, target)); + }).length + ) + ) + ); + }, + }) + .set("list", list); + "step 1"; + if (result.bool) { + var cards = result.cards, + target = result.targets[0]; + player.logSkill("olsaogu", target); + player.discard(cards); + if (player.storage.olsaogu) { + target.draw(); + event.finish(); + } else { + event.target = target; + var list = result.cards.slice(); + player.getHistory("lose", evt => { + if (evt.type == "discard" && evt.getParent("phaseJieshu").name == "phaseJieshu") list.addArray(evt.cards2); + }); + var cards = target.getCards("he", card => { + return lib.filter.cardDiscardable(card, target) && !list.some(cardx => get.suit(cardx, false) == get.suit(card, target)); + }); + if (cards.length) { + var text = "", + suits = list + .reduce(function (list, card) { + return list.add(get.suit(card, false)), list; + }, []) + .sort((a, b) => lib.suit.indexOf(b) - lib.suit.indexOf(a)); + for (var i = 0; i < suits.length; i++) text += get.translation(suits[i]); + target + .chooseToDiscard( + "he", + "扫谷:弃置两张牌(不能弃置" + text + "花色的牌),然后使用其中的【杀】", + function (card, player) { + var list = _status.event.list; + return !list.some(cardx => get.suit(cardx, false) == get.suit(card, player)); + }, + Math.min(cards.length, 2), + true + ) + .set("ai", function (card) { + var player = _status.event.player; + if (card.name == "sha" && player.hasValueTarget(card)) return 10; + return -get.value(card); + }) + .set("list", list); + } else event.finish(); + } + } else event.finish(); + "step 2"; + if (result.bool) { + var cards = result.cards.filter(card => card.name == "sha"); + if (cards.length) { + var next = game.createEvent("olsaogu_chooseToUseSha"); + next.player = target; + next.cards = cards; + next.setContent(lib.skill.olsaogu.chooseToUseSha); + } + } + }, + }, + }, + chooseToUseSha: function () { + "step 0"; + event.cards2 = cards.filter(i => get.position(i, true) == "d" && player.hasUseTarget(i)); + if (!event.cards2.length) event.finish(); + "step 1"; + if (event.cards2.length == 1) event._result = { bool: true, links: event.cards2 }; + else + player + .chooseButton(["扫谷:请使用其中的【杀】", event.cards2], true) + .set("filterButton", button => { + return _status.event.player.hasUseTarget(button.link, false); + }) + .set("ai", button => { + return _status.event.player.getUseValue(button.link); + }); + "step 2"; + if (result.bool) { + var card = result.links[0]; + event.cards2.remove(card); + player.$gain2(card, false); + game.delayx(); + player.chooseUseTarget(true, card, false); + } else event.finish(); + "step 3"; + if (event.cards2.length) event.goto(1); + }, + }, + //OL周群 + oltianhou: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + "step 0"; + var card = get.cards()[0]; + event.card = card; + game.cardsGotoOrdering(card); + "step 1"; + if (player.countCards("he") > 0) { + player + .chooseCard("he", "天候:是否用一张牌交换牌堆顶的" + get.translation(card) + "?") + .set("promptx", [[card]]) + .set("card", card) + .set("ai", cardx => { + let card = _status.event.card, + val = get.value(card, player) - get.value(cardx, player); + if (val < 0) return -val; + let suit = get.suit(card); + if (suit === "heart") + return ( + val + + game.countPlayer(current => { + if (player !== current && !game.hasPlayer(tar => tar.hp - current.hp > 1)) return get.sgn(get.attitude(player, current)); + return 0; + }) + ); + if (suit == "club") + return ( + val + + game.countPlayer(current => { + if (player !== current && (current.hp < 2 || !game.hasPlayer(tar => current.hp - tar.hp > 1))) return get.sgn(get.attitude(player, current)); + return 0; + }) + ); + return val + 0.1; + }); + } else { + event._result = { bool: false }; + } + "step 2"; + if (result.bool) { + player.lose(result.cards, ui.cardPile, "insert"); + player.gain(event.card, "draw"); + } else { + ui.cardPile.insertBefore(event.card, ui.cardPile.firstChild); + } + "step 3"; + var card = get.cards()[0]; + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + player.showCards(card, get.translation(player) + "发动了【天候】"); + var suit = get.suit(card, false), + skill = "oltianhou_" + suit; + if (!lib.skill.oltianhou.derivation.includes(skill)) event.finish(); + else { + event.weather_skill = skill; + player.chooseTarget(true, "令一名角色获得技能【" + get.translation(skill) + "】", get.translation(skill + "_info")).set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + } + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.addAdditionalSkill("oltianhou_" + player.playerid, event.weather_skill); + player.addTempSkill("oltianhou_expire", { player: "phaseZhunbeiBegin" }); + game.log(target, "获得了天气技能", "#g【" + get.translation(event.weather_skill) + "】"); + game.broadcastAll(function (bg) { + _status.tempBackground = bg; + game.updateBackground(); + }, event.weather_skill + "_bg"); + game.addVideo("skill", player, ["oltianhou", [true, event.weather_skill + "_bg"]]); + } + }, + video: function (player, info) { + if (info[0]) { + _status.tempBackground = info[1]; + } else { + delete _status.tempBackground; + } + game.updateBackground(); + }, + derivation: ["oltianhou_spade", "oltianhou_heart", "oltianhou_club", "oltianhou_diamond"], + subSkill: { + expire: { + charlotte: true, + onremove: function (player) { + var key = "oltianhou_" + player.playerid, + players = game.players.concat(game.dead); + for (var current of players) { + current.removeAdditionalSkill(key); + } + game.removeGlobalSkill("oltianhou_" + player.playerid + "_ai"); + game.broadcastAll(function () { + delete _status.tempBackground; + game.updateBackground(); + }); + game.addVideo("skill", player, ["oltianhou", [false]]); + }, + }, + spade: { + audio: true, + mark: true, + marktext: "雨", + intro: { + content: "锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。", + }, + trigger: { global: "damageEnd" }, + forced: true, + filter: function (event) { + return event.hasNature("thunder") && lib.skill.oltianhou_spade.logTarget(event).length > 0; + }, + logTarget: function (event) { + var list = []; + if (!event.player.isIn()) return []; + if (event.player.getNext().isIn()) list.push(event.player.getNext()); + if (event.player.getPrevious().isIn()) list.push(event.player.getPrevious()); + return list.sortBySeat(_status.currentPhase); + }, + content: function () { + var targets = lib.skill.oltianhou_spade.logTarget(trigger); + for (var i of targets) i.loseHp(); + game.delayex(); + }, + group: "oltianhou_miehuo", + global: "oltianhou_spade_ai", + }, + spade_ai: { + ai: { + effect: { + player: function (card, player, target, current) { + if (((typeof card == "object" && game.hasNature(card, "fire")) || get.tag(card, "fireDamage")) && !player.hasSkill("oltianhou_spade")) return "zeroplayertarget"; + if ((typeof card == "object" && game.hasNature(card, "thunder")) || get.tag(card, "thunderDamage")) { + var list = lib.skill.oltianhou_spade.logTarget({ player: target }); + var eff = list.reduce(function (eff, current) { + eff += get.effect(current, { name: "losehp" }, player, player) / get.attitude(player, player); + }, 0); + return [1, eff]; + } + }, + }, + }, + }, + miehuo: { + audio: "oltianhou_spade", + trigger: { global: "damageBegin2" }, + forced: true, + logTarget: "source", + filter: function (event, player) { + return event.hasNature("fire") && event.source && event.source.isIn() && event.source != player; + }, + content: function () { + trigger.cancel(); + }, + }, + heart: { + audio: true, + mark: true, + marktext: "暑", + intro: { + content: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。", + }, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player != event.player && event.player.isIn() && event.player.isMaxHp(); + }, + logTarget: "player", + content: function () { + trigger.player.loseHp(); + }, + global: "oltianhou_heart_ai", + }, + heart_ai: { + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + _status.event && + _status.event.type == "phase" && + !player.hasSkill("oltianhou_heart") && + get.tag(card, "recover") && + !player.isMaxHp() && + player.needsToDiscard() <= 1 && + !game.hasPlayer(function (current) { + return current.hp - player.hp > 1; + }) && + get.effect(player, { name: "losehp" }, player, player) < 0 + ) + return 0; + }, + }, + }, + club: { + audio: true, + mark: true, + marktext: "霜", + intro: { + content: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。", + }, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player != event.player && event.player.isIn() && event.player.isMinHp(); + }, + logTarget: "player", + content: function () { + trigger.player.loseHp(); + }, + global: "oltianhou_club_ai", + }, + club_ai: { + ai: { + nokeep: true, + skillTagFilter: function (player, tag, arg) { + return _status.event && _status.event.type == "phase" && (!arg || (arg.card && get.name(arg.card) === "tao")) && !player.hasSkill("oltianhou_club") && player.isMinHp() && get.effect(player, { name: "losehp" }, player, player) < 0; + }, + }, + }, + diamond: { + audio: true, + mark: true, + marktext: "雾", + intro: { + content: "锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。", + }, + trigger: { global: "useCardToPlayer" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha" || event.player == player || event.targets.length != 1 || !event.player.isIn()) return false; + return event.target != event.player.getNext() && event.target != event.player.getPrevious(); + }, + logTarget: "player", + content: function () { + "step 0"; + var num = get.number(trigger.card); + event.num = num; + trigger.player + .judge(card => { + var num = get.number(card), + num2 = _status.event.getParent("oltianhou_diamond").num; + return num > num2 ? -4 : 4; + }) + .set("judge2", result => { + if (result.bool == false) return true; + return false; + }); + "step 1"; + if (!result.bool) { + trigger.getParent().all_excluded = true; + trigger.untrigger(); + } + }, + global: "oltianhou_diamond_ai", + }, + diamond_ai: { + ai: { + effect: { + player: function (card, player, target) { + if (get.name(card) == "sha" && !player.hasSkill("oltianhou_diamond") && target != player.getNext() && target != player.getPrevious()) { + let num = get.number(card), + max = _status.aiyh_MAXNUM || 13; + return [num / max, 0, num / max, 0]; + } + }, + }, + }, + }, + }, + }, + olchenshuo: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + hasSame: function (info, card) { + if (info.type == get.type2(card, false)) return true; + if (info.suit != "none" && info.suit == get.suit(card, false)) return true; + if (typeof info.number == "number" && info.number > 0 && info.number == get.number(card, false)) return true; + return info.length == get.cardNameLength(card); + }, + content: function () { + "step 0"; + player.chooseCard("h", get.prompt("olchenshuo"), "展示一张手牌,然后展示并获得牌堆顶的牌").set("ai", function (card) { + if (get.type(card) == "basic") return 1 + Math.random(); + return Math.random(); + }); + "step 1"; + if (result.bool) { + player.logSkill("olchenshuo"); + player.showCards(result.cards, get.translation(player) + "发动了【谶说】"); + var card = result.cards[0]; + event.cardInfo = { + type: get.type2(card, player), + suit: get.suit(card, player), + number: get.number(card, player), + length: get.cardNameLength(card), + }; + event.cards = []; + event.forceDie = true; + event.includeOut = true; + } else event.finish(); + "step 2"; + var judgestr = get.translation(player) + "展示的第" + get.cnNumber(cards.length + 1, true) + "张【谶说】牌"; + event.videoId = lib.status.videoId++; + var card = get.cards()[0]; + event.card = card; + cards.add(card); + game.cardsGotoOrdering(card); + game.addVideo("judge1", player, [get.cardInfo(card), judgestr, event.videoId]); + game.broadcastAll( + function (player, card, str, id, cardid) { + var event; + if (game.online) { + event = {}; + } else { + event = _status.event; + } + if (game.chess) { + event.node = card.copy("thrown", "center", ui.arena).addTempClass("start"); + } else { + event.node = player.$throwordered(card.copy(), true); + } + if (lib.cardOL) lib.cardOL[cardid] = event.node; + event.node.cardid = cardid; + event.node.classList.add("thrownhighlight"); + ui.arena.classList.add("thrownhighlight"); + event.dialog = ui.create.dialog(str); + event.dialog.classList.add("center"); + event.dialog.videoId = id; + }, + player, + card, + judgestr, + event.videoId, + get.id() + ); + game.log(player, "展示了牌堆顶的", card); + game.delay(2); + "step 3"; + game.broadcastAll(function (id) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + ui.arena.classList.remove("thrownhighlight"); + }, event.videoId); + game.addVideo("judge2", null, event.videoId); + if (cards.length < 3 && player.isIn() && lib.skill.olchenshuo.hasSame(event.cardInfo, card)) event.goto(2); + else { + game.broadcastAll(function () { + ui.clear(); + }); + player.gain(cards, "gain2"); + } + }, + }, + //OL文钦 + olguangao: { + audio: 2, + trigger: { + global: "useCard2", + }, + filter: function (event, player) { + var card = event.card; + if (card.name != "sha") return false; + if (event.player == player) { + return game.hasPlayer(current => { + return current.isIn() && !event.targets.includes(current) && player.canUse(card, current); + }); + } + return event.player.isIn() && !event.targets.includes(player) && event.player.canUse(card, player); + }, + direct: true, + content: function () { + "step 0"; + if (trigger.player == player) { + player + .chooseTarget(get.prompt("olguangao"), "为" + get.translation(trigger.card) + "额外指定一个目标。然后若你手牌数为偶数,你摸一张牌并令此牌对任意目标无效。", (card, player, target) => { + return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); + }) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + if (player.countCards("h") % 2 == 0) return true; + var eff = get.effect(target, _status.event.card, player, player); + if ( + player.hasSkill("olxieju") && + player.isPhaseUsing() && + !player.getStat().skill.olxieju && + get.attitude(player, target) > 0 && + !game.hasGlobalHistory("useCard", evt => { + return evt.targets && evt.targets.includes(target); + }) + ) + return 6 + eff; + return eff; + }) + .set("card", trigger.card); + } else { + trigger.player + .chooseBool("是否发动" + get.translation(player) + "的【犷骜】?", "令其成为" + get.translation(trigger.card) + "的额外目标。然后若其手牌数为偶数,其摸一张牌并令此牌对任意目标无效。") + .set("ai", () => { + return _status.event.bool; + }) + .set( + "bool", + (function () { + var att = get.attitude(trigger.player, player); + if (player.countCards("h") % 2 == 0) { + if (att > 0) return true; + return false; + } + if (get.effect(player, trigger.card, trigger.player, trigger.player) > 0) return true; + return false; + })() + ); + } + "step 1"; + if (result.bool) { + var target = result.targets && result.targets[0]; + if (!target) { + target = player; + trigger.player.logSkill("olguangao", player); + } else { + player.logSkill("olguangao", target); + } + trigger.targets.add(target); + game.delayex(); + } else event.finish(); + "step 2"; + if (player.countCards("h") % 2 == 0) { + player.draw(); + player + .chooseTarget("犷骜:令此杀对其任意个目标无效", [1, Infinity], (card, player, target) => { + return _status.event.targetsx.includes(target); + }) + .set("ai", target => { + return 1 - get.effect(target, _status.event.getTrigger().card, _status.event.player, _status.event.player); + }) + .set("targetsx", trigger.targets); + } else event.finish(); + "step 3"; + if (result.bool) { + player.line(result.targets); + trigger.excluded.addArray(result.targets); + } + }, + }, + olhuiqi: { + audio: 2, + trigger: { + global: "phaseEnd", + }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "thunder", + derivation: "olxieju", + filter: function (event, player) { + var targets = []; + game.getGlobalHistory("useCard", evt => { + if (evt.targets && evt.targets.length) { + targets.addArray(evt.targets); + } + }); + return targets.length == 3 && targets.includes(player); + }, + content: function () { + "step 0"; + player.awakenSkill("olhuiqi"); + player.addSkills("olxieju"); + player.insertPhase(); + }, + }, + olxieju: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return event.olxieju && event.olxieju.length; + }, + onChooseToUse: function (event) { + if (!event.olxieju && !game.online) { + var targets = []; + game.getGlobalHistory("useCard", evt => { + if (evt.targets && evt.targets.length) { + targets.addArray(evt.targets); + } + }); + event.set("olxieju", targets); + } + }, + filterTarget: function (card, player, target) { + var event = _status.event; + if (event.olxieju.includes(target)) return true; + return false; + }, + selectTarget: [1, Infinity], + content: function () { + var card = { + name: "sha", + isCard: true, + }; + if (target.hasUseTarget(card, true)) { + target.chooseUseTarget(card, true, false); + } + }, + ai: { + order: 1, + result: { + target: function (player, target) { + var val = target.getUseValue({ name: "sha" }, true); + return Math.sign(val); + }, + }, + }, + }, + //郝普 + olzhenying: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return game.hasPlayer(current => { + return lib.skill.olzhenying.filterTarget(null, player, current); + }); + }, + filterTarget: function (card, player, target) { + return player != target && target.countCards("h") <= player.countCards("h"); + }, + content: function () { + "step 0"; + var send = function () { + var next = game.createEvent("olzhenying_adjust", false); + next.setContent(lib.skill.olzhenying.contentx); + game.resume(); + }; + var sendback = function (result, player) { + if (!result && typeof result !== "number") { + result = player.getCards("h"); + if (!result.length) result = 0; + } + event.results.push([player, result]); + }; + event.ai_targets = []; + event.results = []; + var players = [player, target]; + for (var i = 0; i < players.length; i++) { + if (_status.connectMode) players[i].showTimer(); + if (players[i].isOnline()) { + event.withol = true; + players[i].send(send); + players[i].wait(sendback); + } else if (players[i] == game.me) { + event.withme = true; + var next = game.createEvent("olzhenying_adjust", false); + next.setContent(lib.skill.olzhenying.contentx); + if (_status.connectMode) game.me.wait(sendback); + } else { + event.ai_targets.push(players[i]); + } + } + if (event.ai_targets.length) { + for (var i = 0; i < event.ai_targets.length; i++) { + if (players.includes(event.ai_targets[i])) { + var target = event.ai_targets[i]; + var cards = target.getCards("h"); + cards = cards.sort((a, b) => { + return get.value(b) - get.value(a); + }); + var beginInd = 1; + var endInd = 2; + var eff = get.effect(player, { name: "juedou" }, target, target), + eff2 = get.effect(target, { name: "juedou" }, player, target); + var att = get.attitude(player, target); + if (att > 0 || eff2 > 0) { + if (cards.length <= 2) { + cards = 2 - cards.length; + } else { + beginInd = 2; + endInd = 2; + } + } else { + if (get.value(cards, target) <= 5 && !target.isZhu) { + if (eff > 0 && Math.random() < 0.65) { + beginInd = 0; + endInd = 1; + } + } + } + if (typeof cards != "number") { + cards = cards.slice([beginInd, endInd].randomGet(), cards.length); + } + sendback(cards, target); + event.ai_targets.splice(i--, 1); + } + } + if (event.ai_targets.length) { + event.ai_targets.randomSort(); + setTimeout(function () { + event.interval = setInterval( + function () { + var target = event.ai_targets.shift(); + var cards = target.getCards("h"); + cards = cards.sort((a, b) => { + return get.value(b) - get.value(a); + }); + var beginInd = 1; + var endInd = 2; + var eff = get.effect(player, { name: "juedou" }, target, target), + eff2 = get.effect(target, { name: "juedou" }, player, target); + var att = get.attitude(player, target); + if (att > 0 || eff2 > 0) { + if (cards.length <= 2) { + cards = 2 - cards.length; + } else { + beginInd = 2; + endInd = 2; + } + } else { + if (get.value(cards, target) <= 5 && !target.isZhu) { + if (eff > 0 && Math.random() < 0.65) { + beginInd = 0; + endInd = 1; + } + } + } + if (typeof cards != "number") { + cards = cards.slice([beginInd, endInd].randomGet(), cards.length); + } + sendback(cards, target); + if (!event.ai_targets.length) { + clearInterval(event.interval); + if (event.withai) game.resume(); + } + }, + _status.connectMode ? 750 : 75 + ); + }, 500); + } + } + "step 1"; + if (event.withme) { + if (_status.connectMode) game.me.unwait(result, game.me); + else { + if (!result && typeof result !== "number") { + result = game.me.getCards("h"); + if (!result.length) result = 0; + } + event.results.push([game.me, result]); + } + } + "step 2"; + if (event.withol && !event.resultOL) { + game.pause(); + } + "step 3"; + if (event.ai_targets.length > 0) { + event.withai = true; + game.pause(); + } + "step 4"; + if (_status.connectMode) { + for (var i of [player, target]) i.hideTimer(); + } + var lose_list = []; + var draw_list = []; + event.results.sort((a, b) => lib.sort.seat(a[0], b[0])); + for (var res of event.results) { + var target = res[0], + cardsx = res[1]; + if (!target || !cardsx) continue; + if (typeof cardsx === "number") draw_list.push([target, cardsx]); + else if (cardsx.length) lose_list.push([target, cardsx]); + } + if (lose_list.length) { + game.loseAsync({ + lose_list: lose_list, + }).setContent("discardMultiple"); + } + if (draw_list.length) { + for (var list of draw_list) { + var target = list[0], + num = list[1]; + target.draw(num, "nodelay"); + } + } + "step 5"; + game.delay(); + var num1 = player.countCards("h"), + num2 = target.countCards("h"); + if (num1 == num2) { + event.finish(); + return; + } + var players = [player, target]; + if (num2 < num1) players.reverse(); + var card = { + name: "juedou", + isCard: true, + }; + if (players[0].canUse(card, players[1])) players[0].useCard(card, players[1]); + }, + contentx: function () { + "step 0"; + var player = game.me; + event.player = player; + var num = player.countCards("h"); + if (num >= 2) { + var cards = player.getCards("h", card => { + return lib.filter.cardDiscardable(card, player, "olzhenying"); + }); + if (cards.length < num - 2) event._result = { cards: cards }; + else + player.chooseCard("镇荧:请将手牌弃置至至多两张", [num - 2, num], true, (card, player, target) => { + return lib.filter.cardDiscardable(card, player, "olzhenying"); + }); + event.goto(2); + } else { + var choices = ["零", "一", "二"]; + player + .chooseControl(choices) + .set("prompt", "镇荧:请选择要将手牌调整至的张数") + .set("ai", () => { + return [0, 1, 2].randomGet(); + }); + } + "step 1"; + var num = result.index; + var len = player.countCards("h"); + if (len > num) { + var cards = player.getCards("h", card => { + return lib.filter.cardDiscardable(card, player, "olzhenying"); + }); + if (num == 0 || cards.length < len - num) { + event._result = { cards: cards }; + } else + player.chooseCard("镇荧:请将手牌弃置至" + get.cnNumber(num) + "张", len - num, true, (card, player, target) => { + return lib.filter.cardDiscardable(card, player, "olzhenying"); + }); + } else event._result = { cards: num - len }; + "step 2"; + if (result && result.cards) { + var cards = result.cards; + } + event.result = cards; + }, + ai: { + order: function (item, player) { + if ( + game.hasPlayer(current => { + return current.countCards("h") < player.countCards("h"); + }) + ) + return 3; + return 7; + }, + result: { + player: function (player, target) { + var delt = 2 - player.countCards("h"); + return Math.sqrt(Math.abs(delt)) * Math.sign(delt) + 0.1; + }, + target: function (player, target) { + if (get.attitude(player, target) > 0 && target.countCards("h") + player.countCards("h") <= 3) return 1; + return get.sgn(get.effect(target, { name: "juedou" }, player, target)) * 1.2; + }, + }, + }, + }, + //OL孟达 + olgoude: { + audio: 2, + trigger: { + global: "phaseEnd", + }, + filter: function (event, player) { + var list = []; + game.countPlayer(current => { + if (current.group != player.group) return false; + var listx = lib.skill.olgoude.getActed(current); + list.addArray(listx); + }); + return list.length && list.length < 4; + }, + getActed: function (target) { + var list = []; + if ( + target.hasHistory("gain", evt => { + return evt.getParent().name == "draw" && evt.cards.length == 1; + }) + ) { + list.push(1); + } + if ( + game.hasPlayer2(current => { + return current.hasHistory("lose", evt => { + if (evt.type != "discard") return false; + if ((evt.discarder || evt.getParent(2).player) != target) return false; + var evtx = evt.getl(current); + if (!evtx || evtx.hs.length != 1) return false; + return true; + }); + }) + ) { + list.push(2); + } + if ( + target.hasHistory("useCard", evt => { + if (evt.card.name == "sha" && evt.cards && !evt.cards.length) return true; + return false; + }) + ) { + list.push(3); + } + if ( + target.hasHistory("custom", evt => { + return evt.name == "changeGroup"; + }) + ) { + list.push(4); + } + return list; + }, + direct: true, + content: function () { + "step 0"; + var list = [1, 2, 3, 4]; + game.countPlayer(current => { + if (current.group != player.group) return false; + var listx = lib.skill.olgoude.getActed(current); + list.removeArray(listx); + }); + var list2 = list.slice(); + var nochai = false, + nosha = false; + if ( + !game.hasPlayer(current => { + return current.countDiscardableCards(player, "h"); + }) + ) { + nochai = true; + list2.remove(2); + } + if ( + !game.hasPlayer(current => { + return player.canUse({ name: "sha", isCard: true }, current, true, false); + }) + ) { + nosha = true; + list2.remove(3); + } + var choices = list2.map(i => { + return "选项" + get.cnNumber(i, true); + }); + var choiceList = ["摸一张牌", "弃置一名角色的一张手牌", "视为使用一张【杀】", "将势力改为任意一个势力"].map((text, ind) => { + var hint = ""; + if (list2.includes(ind + 1)) { + return text; + } else if (!list.includes(ind + 1)) { + hint += "已被执行过且"; + } + if (ind == 1 && nochai && !list2.includes(ind + 1)) hint += "无有手牌角色且"; + if (ind == 2 && nosha && !list2.includes(ind + 1)) hint += "无可选目标且"; + hint = hint.slice(0, -1); + return '' + text + "(" + hint + ")"; + }); + choices.push("cancel2"); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", get.prompt("olgoude")) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var fn = function (control) { + switch (control) { + case "选项一": + return player.getUseValue({ name: "draw" }); + case "选项二": + return Math.max.apply( + Math, + game.filterPlayer().map(current => { + if (current.hasSkillTag("noh")) return -1; + return -1.5 * get.attitude(player, current) - Math.max(0, current.countCards("h") - 2) / 3; + }) + ); + case "选项三": + return player.getUseValue({ name: "sha" }); + case "选项四": + var myPopulation = + game.countPlayer(current => { + return current.group == player.group; + }) - 1; + var value = Math.max.apply( + Math, + lib.group.map(group => { + return ( + game.countPlayer(current => { + return current.group == group && current != player; + }) - myPopulation + ); + }) + ); + return 10 * value + 0.1 * (Math.random() - 0.5); + case "cancel2": + return 0; + } + }; + var choicesx = choices.map(choice => { + return [choice, fn(choice)]; + }); + choicesx = choicesx.sort((a, b) => { + return b[1] - a[1]; + }); + var choice = choicesx[0]; + if (choice[1] < 0) return "cancel2"; + return choice[0]; + })() + ); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + return; + } + var contents = { + 选项一: function () { + player.logSkill("olgoude"); + player.draw(); + }, + 选项二: function () { + "step 0"; + player + .chooseTarget("苟得:弃置一名角色的一张手牌", true, (card, player, target) => { + return target.countDiscardableCards(player, "h"); + }) + .set("ai", target => { + if (target.hasSkillTag("noh")) return 0; + return -get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + player.logSkill("olgoude", target); + player.discardPlayerCard(target, true, "h"); + } + }, + 选项三: function () { + player.chooseUseTarget("sha", true, false).set("logSkill", "olgoude").set("prompt", "苟得:选择【杀】的目标"); + }, + 选项四: function () { + "step 0"; + var list = lib.group.slice(); + var maxGroup = list.slice().sort((a, b) => { + return ( + game.countPlayer(current => { + return current.group == b && current != player; + }) - + game.countPlayer(current => { + return current.group == a && current != player; + }) + ); + })[0]; + player + .chooseControl(list) + .set("prompt", "苟得:请选择要变更为的势力") + .set("ai", () => { + return _status.event.choice; + }) + .set("choice", maxGroup); + "step 1"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var group = result.control; + player.logSkill("olgoude"); + player.changeGroup(group); + player.popup(group + "2", get.groupnature(group, "raw")); + }, + }; + var next = game.createEvent("olgoude_" + result.control); + next.player = player; + next.setContent(contents[result.control]); + }, + ai: { + threaten: 3, + effect: { + player_use: function (card, player, target) { + if ( + typeof card == "object" && + card.cards && + card.cards.some(card => { + return get.position(card) == "h"; + }) && + !get.tag(card, "draw") && + !get.tag(card, "gain") && + !get.tag(card, "discard") && + player == _status.currentPhase && + player.needsToDiscard() == 1 && + game.countPlayer(current => { + return current.group == player.group && current != player; + }) <= 1 && + lib.group.some(group => { + return ( + game.countPlayer(current => { + return current.group == group && current != player; + }) > 2 + ); + }) + ) + return "zeroplayertarget"; + }, + }, + }, + }, + //OL新改王朗 + oljici: { + audio: "jici", + trigger: { + player: "compare", + target: "compare", + }, + filter: function (event, player) { + if (event.player == player) { + if (event.iwhile) return false; + return event.num1 <= player.countMark("gushe"); + } + return event.num2 <= player.countMark("gushe"); + }, + content: function () { + var num = player.countMark("gushe"); + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += num; + if (trigger.num2 > 13) trigger.num2 = 13; + } + game.log(player, "的拼点牌点数+" + num); + var stat = player.getStat().skill; + delete stat.gushe; + }, + ai: { + combo: "gushe", + }, + }, + //OL刘老板 + olpianan: { + audio: 2, + trigger: { + player: ["enterGame", "phaseDiscardEnd"], + global: "phaseBefore", + }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + var hs = player.getCards("h", card => { + return get.name(card) != "shan" && lib.filter.cardDiscardable(card, player, "olpianan"); + }); + if (hs.length) player.discard(hs); + "step 1"; + var num = player.hp - player.countCards("h"); + if (num > 0) { + var cards = []; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (card.name == "shan") { + cards.add(card); + num--; + } + if (num == 0) break; + } + if (num > 0) { + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var card = ui.discardPile.childNodes[i]; + if (card.name == "shan") { + cards.add(card); + num--; + } + if (num == 0) break; + } + } + if (cards.length) player.gain(cards, "gain2"); + } + }, + mod: { + aiValue: function (player, card, num) { + if (card.name != "shan") return; + if (player == _status.currentPhase) return 0; + }, + aiUseful: function () { + return lib.skill.olpianan.mod.aiValue.apply(this, arguments); + }, + }, + }, + olyinji: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return !player.isMaxHp(true); + }, + content: function () { + "step 0"; + player + .chooseControl("体力", "体力上限") + .set("prompt", "殷积:回复1点体力或加1点体力上限") + .set("ai", () => { + var player = _status.event.player; + if (!player.isDamaged() || (player.hp > 3 && player.getDamagedHp() == 1) || player.maxHp < 3) return 1; + return 0; + }); + "step 1"; + player[result.index == 0 ? "recover" : "gainMaxHp"](); + }, + }, + olkuisi: { + audio: 2, + trigger: { player: "phaseDrawBefore" }, + forced: true, + content: function () { + "step 0"; + trigger.cancel(); + var cards = game.cardsGotoOrdering(get.cards(4)).cards; + event.cards = cards.slice(); + "step 1"; + player + .chooseButton(["窥伺:是否使用其中的一张牌?", cards]) + .set("filterButton", button => { + return _status.event.player.hasUseTarget(button.link); + }) + .set("ai", button => { + var player = _status.event.player, + card = button.link, + cards = _status.event.getParent().cards; + var val = player.getUseValue(card) + 0.01; + if ((val > 0 && cards.length > 1) || (val > 4 && cards.length == 1 && (player.maxHp > 3 || player.isDamaged()))) return get.order(card) + val / 5; + return 0; + }); + "step 2"; + if (result.bool) { + var card = result.links[0]; + event.cards.remove(card); + player.$gain2(card, false); + game.delayx(); + player.chooseUseTarget(true, card, false); + } else event.goto(4); + "step 3"; + if (cards.some(i => get.position(i, true) == "o" && player.hasUseTarget(i))) event.goto(1); + "step 4"; + if (cards.length != 1 && cards.length != 2) { + player.loseMaxHp(); + } + }, + }, + //卢氏 + olzhuyan: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + init: function (player) { + player.addSkill("olzhuyan_record"); + }, + onremove: ["olzhuyan_true", "olzhuyan_false"], + direct: true, + filter: function (event, player) { + for (var bool of [true, false]) { + var targeted = player.getStorage("olzhuyan_" + bool); + if ( + game.hasPlayer(current => { + return !targeted.includes(current) && lib.skill.olzhuyan.getNum(current, bool); + }) + ) + return true; + } + return false; + }, + getNum: function (player, status) { + if (!_status.olzhuyan || !_status.olzhuyan[player.playerid]) return 0; + var num = _status.olzhuyan[player.playerid][status ? 1 : 0]; + if (status) { + num -= player.countCards("h"); + if (num + player.countCards("h") > 5) num = 5 - player.countCards("h"); + } else { + num -= player.hp; + if (num + player.hp < 1) num = 1 - player.hp; + } + return num; + }, + content: function () { + "step 0"; + var map = {}; + for (var bool of [true, false]) { + var targeted = player.getStorage("olzhuyan_" + bool); + game.countPlayer(current => { + if (targeted.includes(current)) return false; + if (!map[current.playerid]) map[current.playerid] = []; + map[current.playerid][bool ? 1 : 0] = lib.skill.olzhuyan.getNum(current, bool); + }); + } + event.map = map; + player + .chooseTarget(get.prompt("olzhuyan"), "令一名角色将{体力值/手牌数}调整至与其上个准备阶段相同(“--”表示已对其发动过该分支)", (card, player, target) => { + var list = _status.event.map[target.playerid]; + return list && (list[0] || list[1]); + }) + .set("map", map) + .set("targetprompt", target => { + var list = _status.event.map[target.playerid]; + var str = ""; + for (var i = 0; i < 2; i++) { + if (list[i] === undefined) str += "--"; + else { + str += (list[i] > 0 ? "+" : "") + list[i]; + } + str += "/"; + } + return str.slice(0, -1); + }) + .set("ai", target => { + var list = _status.event.map[target.playerid]; + var att = get.attitude(_status.event.player, target); + var v1 = list[0], + v2 = get.sgn(list[1]) * Math.sqrt(Math.abs(list[1])); + return Math[att > 0 ? "max" : "min"](v1, v2) * att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olzhuyan", target); + event.target = target; + var list = event.map[target.playerid]; + var choices = ["体力值", "手牌数"]; + if (list[0] && list[1]) { + player + .chooseControl(choices) + .set("choiceList", ["令" + get.translation(target) + (list[0] > 0 ? "回复" : "失去") + Math.abs(list[0]) + "点体力" + (list[0] < 0 ? "(至多失去至1)" : ""), "令" + get.translation(target) + (list[1] > 0 ? "摸" : "弃置") + get.cnNumber(Math.abs(list[1])) + "张" + (list[1] > 0 ? "" : "手") + "牌" + (list[1] > 0 ? "(至多摸至5)" : "")]) + .set("prompt", "驻颜:请选择一项") + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var v1 = list[0], + v2 = get.sgn(list[1]) * Math.sqrt(Math.abs(list[1])); + if (get.attitude(player, target) > 0) { + return v1 > v2 ? 0 : 1; + } + return v1 > v2 ? 1 : 0; + })() + ); + } else { + event._result = { index: list[0] ? 0 : 1 }; + } + } else event.finish(); + "step 2"; + var ind = result.index; + player.markAuto("olzhuyan_" + Boolean(ind), [target]); + var num = event.map[target.playerid][ind]; + if (ind == 0) { + if (num > 0) { + target.recover(num); + } else { + num = Math.min(target.hp - 1, -num); + target.loseHp(num); + } + } else { + if (num > 0) { + num = Math.min(5 - target.countCards("h"), num); + if (num > 0) target.draw(num); + } else { + num = -num; + target.chooseToDiscard(num, true).set("prompt", "驻颜:请弃置" + get.cnNumber(Math.abs(num)) + "张手牌"); + } + } + }, + subSkill: { + record: { + trigger: { + global: ["phaseJieshuAfter", "phaseBefore", "enterGame"], + }, + lastDo: true, + charlotte: true, + forced: true, + popup: false, + forceDie: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + if (!_status.olzhuyan) _status.olzhuyan = {}; + if (event.triggername == "phaseBefore") { + game.countPlayer(current => { + _status.olzhuyan[current.playerid] = [current.hp, current.countCards("h")]; + }); + } else { + _status.olzhuyan[trigger.player.playerid] = [trigger.player.hp, trigger.player.countCards("h")]; + } + }, + }, + }, + }, + olleijie: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("olleijie"), "令一名角色判定。若结果为♠2~9,其受到2点雷电伤害,否则其摸两张牌。") + .set("ai", target => { + var player = _status.event.player, + sgn = _status.event.sgn; + if (sgn > 0) { + return get.damageEffect(target, target, player, "thunder"); + } else if (sgn == 0) { + return get.attitude(player, target); + } + return 0; + }) + .set( + "sgn", + (function () { + var sgn = 0; + game.countPlayer(current => { + if (!current.hasSkillTag("rejudge")) return; + sgn = get.sgnAttitude(player, current); + }); + return sgn; + })() + ); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olleijie", target); + target + .judge(card => { + var number = get.number(card); + if (get.suit(card) == "spade" && number >= 2 && number <= 9) return -4; + return 2; + }) + .set("judge2", result => { + return result.bool === false ? true : false; + }); + } else event.finish(); + "step 2"; + if (result.bool) { + target.draw(2); + } else { + target.damage(2, "thunder"); + } + }, + }, + releijie: { + audio: "olleijie", + enable: "phaseUse", + filterTarget: true, + usable: 1, + async content(event, trigger, player) { + const target = event.target, + result = await target + .judge(card => { + var number = get.number(card); + if (get.suit(card) == "spade" && number >= 2 && number <= 9) return -4; + return 2; + }) + .set("judge2", result => { + return result.bool === false ? true : false; + }) + .forResult(); + if (result.bool) await target.draw(2); + else { + const card = new lib.element.VCard({ name: "sha", nature: "thunder" }); + if (player.canUse(card, target, false)) { + for (let i = 1; i <= 2; i++) { + await player.useCard(card, target, false); + } + } + } + }, + ai: { + order: 1, + result: { + target(player, target) { + let sgn = 0, + eff = 0, + num = get.attitude(player, target); + const card = new lib.element.VCard({ name: "sha", nature: "thunder" }); + game.countPlayer(current => { + if (!current.hasSkillTag("rejudge")) return; + sgn = get.sgnAttitude(player, current); + }); + if (sgn > 0 && player.canUse(card, target, false)) { + eff += get.effect(target, card, player, player) * 2; + return eff * get.sgn(num); + } else if (sgn == 0) return num * get.sgn(num); + return 0; + }, + }, + }, + }, + //张世平 + olhongji: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (event.player.isMinHandcard() && !player.hasSkill("olhongji_min")) return true; + if (event.player.isMaxHandcard() && !player.hasSkill("olhongji_max")) return true; + return false; + }, + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var bool1 = target.isMinHandcard() && !player.hasSkill("olhongji_min"), + str1 = "其手牌数为全场最少。你可以令其于本回合摸牌阶段结束后执行一个额外的摸牌阶段,然后本轮你不能再发动该分支。"; + var bool2 = target.isMaxHandcard() && !player.hasSkill("olhongji_max"), + str2 = "其手牌数为全场最多。你可以令其于本回合出牌阶段结束后执行一个额外的出牌阶段,然后本轮你不能再发动该分支。"; + if (bool1 && !bool2) { + event.branch = 0; + player + .chooseBool(get.prompt("olhongji", target), str1) + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.attitude(player, trigger.player) > 1); + } else if (!bool1 && bool2) { + event.branch = 1; + player + .chooseBool(get.prompt("olhongji", target), str2) + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.attitude(player, trigger.player) > 1); + } else if (bool1 && bool2) { + player + .chooseControl("摸牌阶段", "出牌阶段", "cancel2") + .set("prompt", get.prompt("olhongji", target)) + .set("choiceList", [str1.slice(13), str2.slice(13)]) + .set("ai", () => _status.event.bool) + .set("bool", () => (get.attitude(player, trigger.player) > 1 ? [0, 1].randomGet() : "cancel2")); + } + "step 1"; + var choice = -1; + if ((event.branch == 0 && result.bool) || result.control == "摸牌阶段") choice = 0; + if ((event.branch == 1 && result.bool) || result.control == "出牌阶段") choice = 1; + if (choice == 0) { + player.logSkill("olhongji", target); + player.addTempSkill("olhongji_min", "roundStart"); + target.addTempSkill("olhongji_draw"); + } else if (choice == 1) { + player.logSkill("olhongji", target); + player.addTempSkill("olhongji_max", "roundStart"); + target.addTempSkill("olhongji_use"); + } + }, + ai: { expose: 0.25 }, + subSkill: { + min: { charlotte: true }, + max: { charlotte: true }, + draw: { + trigger: { player: "phaseDrawAfter" }, + charlotte: true, + forced: true, + popup: false, + content: function () { + var next = trigger.player.phaseDraw(); + event.next.remove(next); + trigger.getParent("phase").next.push(next); + player.removeSkill("olhongji_draw"); + }, + }, + use: { + trigger: { player: "phaseUseAfter" }, + charlotte: true, + forced: true, + popup: false, + content: function () { + var next = trigger.player.phaseUse(); + event.next.remove(next); + trigger.getParent("phase").next.push(next); + player.removeSkill("olhongji_use"); + }, + }, + }, + }, + olxinggu: { + audio: 2, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "olxinggu_trade", + content: function () { + "step 0"; + var cards = []; + for (var i = 0; i < 3; i++) { + var card = get.cardPile2(function (card) { + if (cards.includes(card)) return false; + var type = get.subtype(card); + return type == "equip3" || type == "equip4" || type == "equip6"; + }); + if (card) cards.add(card); + else break; + } + if (cards.length) player.addToExpansion(cards, "draw").gaintag.add("olxinggu"); + }, + marktext: "贾", + intro: { + markcount: "expansion", + mark: function (dialog, content, player) { + var content = player.getExpansions("olxinggu"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { + dialog.addAuto(content); + } else { + return "剩余" + get.cnNumber(content.length) + "匹马"; + } + } + }, + }, + subSkill: { + trade: { + audio: "olxinggu", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getExpansions("olxinggu").length; + }, + direct: true, + content: function () { + "step 0"; + var cards = player.getExpansions("olxinggu"); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + player + .chooseButton([get.prompt("olxinggu"), cards]) + .set("ai", button => { + if (_status.event.toChoose == button.link) return 1; + return 0; + }) + .set( + "toChoose", + !event.aiCancel && + cards.find(card => { + return game.hasPlayer(current => { + if (!lib.skill.zhijian.filterTarget(card, player, current)) return false; + return get.effect(current, card, player, player) > 0; + }); + }) + ); + "step 1"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget("将" + get.translation(card) + "置入一名其他角色的装备区", lib.skill.zhijian.filterTarget) + .set("ai", target => { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", card); + } else { + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + event.finish(); + } + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + player.logSkill("olxinggu", target); + player.$give(card, target, false); + } else { + if (!event.isMine() && !event.isOnline()) event.aiCancel = true; + event.goto(0); + } + "step 3"; + target.equip(card); + "step 4"; + var card = get.cardPile2(cardx => { + return get.suit(cardx) == "diamond"; + }); + if (card) player.gain(card, "gain2"); + else { + game.log("但是牌堆中并没有♦牌了!"); + player.chat("做了个亏本买卖…"); + } + }, + }, + }, + }, + //孙弘 + olxianbi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return !player.getStorage("olzenrun").includes(target) && target.countCards("e") != player.countCards("h"); + }, + content: function () { + "step 0"; + var del = target.countCards("e") - player.countCards("h"); + if (del == 0) event.finish(); + else if (del > 0) { + player.draw(Math.min(5, del)); + } else { + player.chooseToDiscard("险诐:弃置" + get.cnNumber(-del) + "张手牌", -del, "h", true); + player.addTempSkill("olxianbi_gain"); + } + }, + ai: { + order: 5, + result: { + player: function (player, target) { + return player.countCards("h", card => { + return get.value(card) > 6; + }) >= target.countCards("e") + ? 0 + : 1; + }, + }, + }, + subSkill: { + gain: { + trigger: { + player: "loseAfter", + }, + filter: function (event, player) { + return event.getParent(3).name == "olxianbi"; + }, + forced: true, + charlotte: true, + popup: false, + content: function () { + var cards = [], + cards2 = trigger.cards; + for (var cardx of cards2) { + var type = get.type2(cardx, player); + var card = get.discardPile(function (card) { + return get.type(card, false) == type && !cards2.includes(card) && !cards.includes(card); + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + }, + }, + }, + }, + olzenrun: { + audio: 2, + trigger: { player: "drawBefore" }, + filter: function (event, player) { + return ( + !player.hasSkill("olzenrun_used") && + game.hasPlayer(current => { + return ( + !player.getStorage("olzenrun").includes(current) && + current != player && + current.hasCard(function (card) { + return lib.filter.canBeGained(card, player, current); + }, "he") + ); + }) + ); + }, + direct: true, + check: function (event, player) { + return true; + }, + content: function () { + "step 0"; + var num = trigger.num; + player + .chooseTarget(get.prompt("olzenrun"), "改为获得一名其他角色" + get.cnNumber(num) + "张牌", (card, player, target) => { + return ( + !player.getStorage("olzenrun").includes(target) && + target != player && + target.hasCard(function (card) { + return lib.filter.canBeGained(card, player, target); + }, "he") + ); + }) + .set("ai", target => { + return get.attitude(_status.event.player, target) / 5 + Math.random() + 2.5; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olzenrun", target); + player.addTempSkill("olzenrun_used", ["phaseZhunbeiAfter", "phaseJudgeAfter", "phaseDrawAfter", "phaseUseAfter", "phaseDiscardAfter", "phaseJieshuAfter"]); + trigger.cancel(); + player.gainPlayerCard(target, trigger.num, "he", true); + } + "step 2"; + if (result.bool) { + var cards = result.cards; + var num = cards.length; + event.num = num; + target + .chooseControl() + .set("choiceList", ["摸" + get.cnNumber(num) + "张牌", "令其不能再对你发动〖险诐〗和〖谮润〗"]) + .set("prompt", get.translation(player) + "对你发动了【谮润】,请选择一项") + .set("ai", () => { + if (_status.event.bool) return 0; + return 1; + }) + .set("bool", get.attitude(target, player) > 0 || (num == 1 && Math.random() < 0.5) || num >= 2); + } else event.finish(); + "step 3"; + game.log(target, "选择了", "#y" + result.control); + if (result.index == 0) { + target.draw(num); + } else { + player.markAuto("olzenrun", [target]); + } + }, + subSkill: { + used: { + charlotte: true, + }, + }, + }, + //罗宪 + oldaili: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + return ( + player.countCards("h", card => { + return card.hasGaintag("oldaili_tag"); + }) % + 2 == + 0 + ); + }, + group: "oldaili_record", + locked: false, + check: function (event, player) { + if (get.distance(event.player, player, "absolute") == 1 && !player.isTurnedOver()) return false; + return true; + }, + content: function () { + player.turnOver(); + player.draw(3, "visible").gaintag = ["oldaili_tag"]; + }, + mod: { + aiValue: function (player, card, num) { + if (num < 0 || get.itemtype(card) != "card" || !card.hasGaintag("oldaili_tag")) return; + if (get.distance(_status.currentPhase, player, "absolute") == 1 && !player.isTurnedOver()) return; + let dai = player.countCards("h", card => { + return card.hasGaintag("oldaili_tag"); + }); + if (ui.selected.cards && ui.selected.cards.length) + dai += ui.selected.cards.filter(card => { + return card.hasGaintag("oldaili_tag"); + }).length; + if (dai % 2) return Math.sqrt(num); + return num + 6; + }, + aiUseful: function () { + return lib.skill.oldaili.mod.aiValue.apply(this, arguments); + }, + }, + mark: true, + marktext: "砺", + intro: { + markcount: function (storage, player) { + return player.countCards("h", card => card.hasGaintag("oldaili_tag")); + }, + mark: function (dialog, content, player) { + var cards = player.getCards("h", card => card.hasGaintag("oldaili_tag")); + if (cards.length) { + dialog.addAuto(cards); + } else return "无展示牌"; + }, + }, + subSkill: { + record: { + trigger: { global: "showCardsEnd" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return event.cards.some(i => get.owner(i) == player); + }, + content: function () { + game.broadcastAll( + function (cards) { + cards.forEach(card => card.addGaintag("oldaili_tag")); + }, + trigger.cards.filter(i => get.owner(i) == player) + ); + player.markSkill("oldaili"); + }, + }, + }, + }, + //胡班 + olhuiyun: { + audio: 2, + enable: "phaseUse", + viewAs: { + name: "huogong", + storage: { olhuiyun: true }, + }, + filterCard: true, + position: "hes", + onuse: function (links, player) { + player.addTempSkill("olhuiyun_after"); + player.addTempSkill("olhuiyun_record"); + }, + ai: { + effect: { + player: function (card, player, target) { + if (get.attitude(player, target) > 0 && card && card.name == "huogong" && card.storage && card.storage.olhuiyun && !player.hasSkill("olhuiyun_3")) return [0, 0.5, 0, 0.5]; + }, + }, + }, + subSkill: { + after: { + audio: "olhuiyun", + trigger: { global: "useCardAfter" }, + charlotte: true, + forced: true, + direct: true, + filter: function (event, player) { + return event.card.name == "huogong" && event.card.storage && event.card.storage.olhuiyun && event.targets.some(i => i.isIn()); + }, + content: function () { + "step 0"; + var choices = []; + var choiceList = ["使用展示牌,然后重铸所有手牌", "使用一张手牌,然后重铸展示牌", "摸一张牌"]; + for (var i = 1; i <= 3; i++) { + if (!player.hasSkill("olhuiyun_" + i)) choices.push("选项" + get.cnNumber(i, true)); + else choiceList[i - 1] = '' + choiceList[i - 1] + ""; + } + if (!choices.length) event.finish(); + else { + player.logSkill("olhuiyun_after"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "晖云:选择一项,令" + get.translation(trigger.targets) + "可以选择执行") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (choices.length == 1) return choices[0]; + var choicesx = choices.slice(); + if (get.attitude(player, trigger.targets[0]) > 0 && choices.includes("选项三")) return "选项三"; + choicesx.remove("选项三"); + return choicesx.randomGet(); + })() + ); + } + "step 1"; + if (result.control != "cancel2") { + var index = ["选项一", "选项二", "选项三"].indexOf(result.control) + 1; + event.index = index; + game.log(player, "选择了", "#y" + result.control); + player.addTempSkill("olhuiyun_" + index, "roundStart"); + event.targets = trigger.targets.slice(0); + } else event.finish(); + "step 2"; + var target = targets.shift(); + event.target = target; + if (target.isIn()) { + var cards = target.getCards("h", card => card.hasGaintag("olhuiyun_tag")); + if (event.index == 3) { + target.chooseBool("是否摸一张牌?").set("ai", () => true); + event.goto(5); + } else if (event.index == 1 && cards.length) { + target.chooseToUse({ + filterCard: function (card) { + if (get.itemtype(card) != "card" || !card.hasGaintag("olhuiyun_tag")) return false; + return lib.filter.filterCard.apply(this, arguments); + }, + prompt: "是否使用一张展示牌,然后重铸所有手牌?", + }); + } else if (event.index == 2) { + target.chooseToUse({ + filterCard: function (card) { + if (get.itemtype(card) != "card" || (get.position(card) != "h" && get.position(card) != "s")) return false; + return lib.filter.filterCard.apply(this, arguments); + }, + prompt: "是否使用一张手牌,然后重铸展示牌?", + }); + event.goto(4); + } else event.goto(6); + } else event.goto(6); + "step 3"; + if (result.bool) { + var hs = target.getCards("h", lib.filter.cardRecastable); + if (hs.length) { + target.recast(hs); + } + } + event.goto(6); + "step 4"; + if (result.bool) { + var hs = target.getCards("h", card => { + if (!card.hasGaintag("olhuiyun_tag")) return false; + return target.canRecast(card); + }); + if (hs.length) { + target.recast(hs); + } + } + event.goto(6); + "step 5"; + if (result.bool) { + target.draw(); + } + "step 6"; + if (targets.length) event.goto(2); + }, + }, + record: { + trigger: { global: "showCardsEnd" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (event.getParent().name != "huogong") return false; + var card = event.getParent(2).card; + if (card && card.storage && card.storage.olhuiyun) return true; + return false; + }, + content: function () { + game.broadcastAll(function (cards) { + cards.forEach(card => card.addGaintag("olhuiyun_tag")); + }, trigger.cards); + }, + }, + 1: { charlotte: true }, + 2: { charlotte: true }, + 3: { charlotte: true }, + }, + }, + //王瓘 + olmiuyan: { + audio: 2, + enable: "chooseToUse", + viewAsFilter: function (player) { + return !player.hasSkill("olmiuyan_blocker") && player.hasCard(card => get.color(card) == "black", "hes"); + }, + viewAs: { name: "huogong" }, + filterCard: { color: "black" }, + position: "hes", + check: function (card) { + var player = _status.event.player, + suits = lib.suit.slice(0); + if ( + player.countCards("h") > 4 && + player.hasCard(function (card) { + suits.remove(get.suit(card)); + return suits.length == 0; + }, "h") + ) + return 8 - get.value(card); + return 4 - get.value(card); + }, + promptfunc: function () { + if (_status.event.player.storage.olmiuyan) return "转换技。你可以将一张黑色牌当做【火攻】使用。若此牌未造成伤害,则你令此技能失效直到本轮结束。"; + return "转换技。你可以将一张黑色牌当做【火攻】使用。若此牌造成了伤害,则你获得此阶段内所有被展示过的牌。"; + }, + precontent: function () { + player.changeZhuanhuanji("olmiuyan"); + var card = event.result.card; + if (!card.storage) card.storage = {}; + if (player.storage.olmiuyan) { + card.storage.olmiuyan_gain = true; + player.addTempSkill("olmiuyan_gain"); + } else { + card.storage.olmiuyan_remove = true; + player.addTempSkill("olmiuyan_remove"); + } + }, + init: function (player) { + player.addSkill("olmiuyan_counter"); + }, + onremove: function (player) { + player.removeSkill("olmiuyan_counter"); + }, + zhuanhuanji: true, + mark: true, + marktext: "☯", + ai: { + order: function (item, player) { + if (player.storage.olmiuyan) return 1; + return 8; + }, + }, + intro: { + content: function (storage) { + if (storage) return "转换技。你可以将一张黑色牌当做【火攻】使用。然后若此牌未造成伤害,则你令此技能失效直到本轮结束。"; + return "转换技。你可以将一张黑色牌当做【火攻】使用。然后若此牌造成了伤害,则你获得此阶段内所有被展示过的牌。"; + }, + }, + subSkill: { + counter: { + trigger: { + global: ["showCardsEnd", "phaseZhunbeiBefore", "phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore", "phaseJieshuBefore"], + }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (event.name == "showCards") return get.itemtype(event.cards) == "cards"; + return true; + }, + content: function () { + if (trigger.name == "showCards") { + game.broadcastAll(function (cards) { + cards.forEach(card => card.addGaintag("olmiuyan_tag")); + }, trigger.cards); + } else game.players.forEach(current => current.removeGaintag("olmiuyan_tag")); + }, + }, + gain: { + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.olmiuyan_gain && + player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) && + game.hasPlayer(function (current) { + return current != player && current.hasCard(card => card.hasGaintag("olmiuyan_tag")); + }) + ); + }, + logTarget: function (event, player) { + return game.filterPlayer(function (current) { + return current != player && current.hasCard(card => card.hasGaintag("olmiuyan_tag")); + }); + }, + content: function () { + var cards = [], + players = game.filterPlayer(current => current != player).sortBySeat(); + players.forEach(current => { + var cardsx = current.getCards("h", function (card) { + return card.hasGaintag("olmiuyan_tag"); + }); + if (cardsx.length) cards.addArray(cardsx); + }); + player.gain(cards, "give"); + }, + }, + remove: { + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.olmiuyan_remove && + !player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) + ); + }, + content: function () { + player.addTempSkill("olmiuyan_blocker", "roundStart"); + game.log(player, "的", "#g【谬焰】", "失效了"); + }, + }, + blocker: { charlotte: true }, + }, + }, + olshilu: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return player.hp > 0; + }, + content: function () { + "step 0"; + player.draw(Math.min(5, player.hp)); + "step 1"; + var targets = game.filterPlayer(current => current != player && current.countCards("h") > 0 && player.inRange(current)); + if (targets.length > 0) { + if (targets.length == 1) event._result = { bool: true, targets: targets }; + else + player + .chooseTarget(true, "请选择一名攻击范围内的角色", "然后你选择该角色的一张手牌,令此牌视为【杀】", function (card, player, target) { + return target != player && target.countCards("h") > 0 && player.inRange(target); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + player.choosePlayerCard(target, true, "h"); + } + "step 3"; + if (result.bool) { + target.addSkill("olshilu_viewas"); + target.showCards(result.cards); + target.addGaintag(result.cards, "olshilu"); + } + }, + ai: { + maixie: true, + }, + subSkill: { + viewas: { + mod: { + cardname: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("olshilu")) return "sha"; + }, + }, + charlotte: true, + }, + }, + }, + //张翼 + oldianjun: { + audio: 2, + trigger: { player: "phaseEnd" }, + forced: true, + content: function () { + "step 0"; + player.damage("nosource"); + "step 1"; + trigger.phaseList.splice(trigger.num, 0, "phaseUse|oldianjun"); + }, + }, + olkangrui: { + audio: 2, + init: () => { + game.addGlobalSkill("olkangrui_ai"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("olkangrui"), true)) game.removeGlobalSkill("olkangrui_ai"); + }, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return event.player == _status.currentPhase && event.player.getHistory("damage").indexOf(event) == 0; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("cancel2") + .set("choiceList", ["令" + get.translation(trigger.player) + "回复1点体力,且造成伤害时本回合手牌上限为0", "令" + get.translation(trigger.player) + "于本回合下次造成的伤害+1,且造成伤害时本回合手牌上限为0"]) + .set("prompt", get.prompt("olkangrui", trigger.player)) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (get.attitude(player, trigger.player) <= 0) return "cancel2"; + if (!trigger.player.isDamaged()) return "选项二"; + var list = []; + if (trigger.player.hp + trigger.player.countCards("hs", "tao") <= 2) list.push("选项一"); + if ( + trigger.player.hasCard(card => { + if (!get.tag(card, "damage")) return false; + if ( + game.hasPlayer(current => { + return ( + get.effect(current, card, trigger.player, player) > 0 && + trigger.player.canUse(card, current) && + !current.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: card, + }) + ); + }, "hs") + ) { + return true; + } + }) + ) + list.push("选项二"); + if (list.length) return list.randomGet(); + return "选项一"; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("olkangrui", trigger.player); + player.draw(); + if (result.index == 0) { + trigger.player.recover(); + trigger.player.addTempSkill("olkangrui_nil"); + } else { + trigger.player.addTempSkill("olkangrui_add"); + trigger.player.addMark("olkangrui_add", 1, false); + } + } + }, + ai: { + expose: 0.2, + threaten: 1.5, + }, + subSkill: { + add: { + trigger: { source: "damageBegin1" }, + charlotte: true, + forced: true, + onremove: ["olkangrui_add", "olkangrui_nil"], + filter: function (event, player) { + return player.hasMark("olkangrui_add"); + }, + content: function () { + trigger.num += player.countMark("olkangrui_add"); + player.removeMark("olkangrui_add", player.countMark("olkangrui_add"), false); + player.storage.olkangrui_nil = true; + game.log(player, "本回合手牌上限基数为", "#g0"); + }, + mod: { + maxHandcardBase: function (player, num) { + if (player.storage.olkangrui_nil) return 0; + }, + }, + }, + nil: { + trigger: { source: "damageBegin1" }, + charlotte: true, + forced: true, + onremove: true, + filter: function (event, player) { + return !player.storage.olkangrui_nil; + }, + content: function () { + player.storage.olkangrui_nil = true; + game.log(player, "本回合手牌上限基数为", "#g0"); + }, + mod: { + maxHandcardBase: function (player, num) { + if (player.storage.olkangrui_nil) return 0; + }, + }, + }, + ai: { + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("olkangrui"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("olkangrui_ai"); + }, + ai: { + effect: { + target: function (card, player, target) { + if (target != player || !get.tag(card, "damage")) return; + var list = game.filterPlayer(current => current.hasSkill("olkangrui") && get.attitude(current, player) > 0); + var history = player.getHistory("damage"); + if (!list.length || history.length != 0) return; + return [1, 2]; + }, + }, + }, + }, + }, + }, + //朱儁 + olcuipo: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return get.cardNameLength(event.card) == player.getHistory("useCard").indexOf(event) + 1; + }, + content: function () { + var card = trigger.card; + if (card.name == "sha" || (get.type(card) == "trick" && get.tag(card, "damage") > 0)) trigger.baseDamage++; + else player.draw(); + }, + /* + trigger:{source:'damageBegin1'}, + forced:true, + filter:function(event,player){ + var card=event.card; + if(player!=_status.currentPhase||!card||event.getParent().type!='card') return false; + return get.cardNameLength(card)==player.getHistory('useCard').indexOf(event.getParent(2))+1; + }, + content:function(){ + trigger.num++; + },*/ + mod: { + aiOrder: function (player, card, num) { + if (typeof card == "object" && get.cardNameLength(card) == player.getHistory("useCard").length + 1) return num + 10; + }, + }, + }, + //马休马铁 + rekenshang: { + audio: "olkenshang", + enable: "chooseToUse", + filterCard: true, + selectCard: [2, Infinity], + viewAsFilter: function (player) { + return player.countCards("hes") > 1; + }, + check: function (card) { + var player = _status.event.player; + if ( + game.countPlayer(function (current) { + return current != player && player.canUse("sha", current) && get.effect(current, { name: "sha" }, player, player) > 0; + }) <= ui.selected.cards.length + ) + return 0; + if (_status.event.player.countCards("hes") >= 3) return 8 - ui.selected.cards.length - get.value(card); + return 6 - ui.selected.cards.length - get.value(card); + }, + position: "hes", + viewAs: { + name: "sha", + storage: { olkenshang: true }, + }, + onuse: function (links, player) { + player.addTempSkill("rekenshang_effect"); + }, + ai: { + order: function (item, player) { + if (player.countCards("hes") >= 3) return 6; + return 4; + }, + result: { + target: function (player, target, card, isLink) { + let eff = -1.5, + odds = 1.35, + num = 1; + if (isLink) { + let cache = _status.event.getTempCache("sha_result", "eff"); + if (typeof cache !== "object" || cache.card !== get.translation(card)) return eff; + if (cache.odds < 1.35 && cache.bool) return 1.35 * cache.eff; + return cache.odds * cache.eff; + } + if ( + player.hasSkill("jiu") || + player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ) { + if ( + target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + jiu: true, + }) + ) + eff = -0.5; + else { + num = 2; + if (get.attitude(player, target) > 0) eff = -7; + else eff = -4; + } + } + if ( + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) + ) + odds -= + 0.7 * + target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }), + "odds" + ); + _status.event.putTempCache("sha_result", "eff", { + bool: target.hp > num && get.attitude(player, target) > 0, + card: get.translation(card), + eff: eff, + odds: odds, + }); + return odds * eff; + }, + }, + respondSha: true, + skillTagFilter: player => player.countCards("hes") > 1, + }, + subSkill: { + effect: { + audio: "olkenshang", + trigger: { player: "useCard2" }, + charlotte: true, + group: "rekenshang_after", + direct: true, + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.olkenshang && + game.countPlayer(function (current) { + return current != player && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); + }) >= event.cards.length + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(trigger.cards.length, "是否更改" + get.translation(trigger.card) + "的目标?", "选择" + get.cnNumber(trigger.cards.length) + "名角色作为" + get.translation(trigger.card) + "的目标,覆盖原先存在的目标", function (card, player, target) { + var evt = _status.event.getTrigger(); + return target != player && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); + }) + .set("ai", function (target) { + var evt = _status.event.getTrigger(); + return get.effect(target, evt.card, evt.player, evt.player); + }); + "step 1"; + if (result.bool) { + if (player != event.player && !player.isOnline()) game.delayx(); + } else event.finish(); + "step 2"; + var targets = result.targets; + player.logSkill("rekenshang_effect", targets); + trigger.targets.length = 0; + trigger.targets.addArray(targets); + game.log(targets, "成为了", trigger.card, "的新目标"); + }, + }, + after: { + audio: "olkenshang", + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if (event.card.name != "sha" || !event.card.storage || !event.card.storage.olkenshang) return false; + var num = 0; + game.countPlayer2(current => { + current.getHistory("damage", evt => { + if (evt.card == event.card) num += evt.num; + }); + }); + return num < event.cards.length; + }, + content: function () { + player.draw(); + }, + }, + }, + }, + olkenshang: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + check: function (card) { + return 5.5 - get.value(card); + }, + position: "hes", + viewAs: { + name: "sha", + storage: { olkenshang: true }, + }, + onuse: function (links, player) { + player.addTempSkill("olkenshang_effect"); + }, + ai: { + order: 1, + threaten: 1.1, + effect: { + player_use: function (card, player, target) { + if (_status._olkenshang_aiChecking || ui.selected.targets.length) return; + if (typeof card != "object" || !card.storage || !card.storage.olkenshang) return false; + _status._olkenshang_aiChecking = true; + var eff = 0; + var targets = game.filterPlayer(current => current != player && player.canUse(card, current, false) && !player.inRange(current)); + for (var target of targets) { + eff += get.effect(target, card, player, player); + } + delete _status._olkenshang_aiChecking; + if (eff > 0) return [0, eff / Math.max(0.01, get.attitude(player, player))]; + }, + }, + }, + subSkill: { + effect: { + audio: "olkenshang", + trigger: { player: "useCard2" }, + charlotte: true, + logTarget: function (event, player) { + return game.filterPlayer(current => current != player && player.canUse(event.card, current, false) && !player.inRange(current)); + }, + prompt2: "将此牌目标改为攻击范围外的所有其他角色", + group: "olkenshang_after", + check: function (event, player) { + var eff1 = 0, + eff2 = 0; + for (var target of event.targets) { + eff1 += get.effect(target, event.card, event.player, player); + } + var targets = game.filterPlayer(current => current != player && player.canUse(event.card, current, false) && !player.inRange(current)); + for (var target of targets) { + eff2 += get.effect(target, event.card, event.player, player); + } + return eff2 > eff1; + }, + filter: function (event, player) { + return event.card.name == "sha" && event.card.storage && event.card.storage.olkenshang && event.targets.length && game.filterPlayer(current => current != player && player.canUse(event.card, current, false) && !player.inRange(current)).length; + }, + content: function () { + "step 0"; + trigger.targets.removeArray(trigger.targets); + var targets = game.filterPlayer(current => current != player && player.canUse(trigger.card, current, false) && !player.inRange(current)); + if (targets.length) trigger.targets.addArray(targets); + }, + }, + after: { + audio: "olkenshang", + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if (event.card.name != "sha" || !event.card.storage || !event.card.storage.olkenshang) return false; + var num = 0; + game.countPlayer2(current => { + current.getHistory("damage", evt => { + if (evt.card == event.card) num += evt.num; + }); + }); + return num > 0; + }, + content: function () { + "step 0"; + var num = 0, + len = trigger.cards.length; + game.countPlayer2(current => { + current.getHistory("damage", evt => { + if (evt.card == trigger.card) num += evt.num; + }); + }); + if (len > num) { + player.draw(num); + event.finish(); + } else { + var skills = player.getSkills(null, false, false).filter(skill => { + var info = get.info(skill); + if (!info || info.charlotte || get.skillInfoTranslation(skill, player).length == 0) return false; + return true; + }); + if (skills.length == 1) event._result = { control: skills[0] }; + else + player + .chooseControl(skills) + .set( + "choiceList", + skills.map(i => { + return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; + }) + ) + .set("displayIndex", false) + .set("prompt", "垦伤:选择失去一个技能") + .set("ai", () => { + var choices = _status.event.controls.slice(); + var negs = choices.filter(i => { + var info = get.info(i); + if (!info || !info.ai) return false; + return info.ai.neg || info.ai.halfneg; + }); + if (negs.length) return negs.randomGet(); + if (choices.includes("mashu")) return "mashu"; + return choices.randomGet(); + }); + } + "step 1"; + player.removeSkills(result.control); + }, + }, + }, + }, + //董荼那 + oljianman: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + direct: true, + filter: function (event, player) { + var history = game.getGlobalHistory("useCard", evt => { + return get.type(evt.card) == "basic"; + }); + if (history.length < 2) return false; + var users = history.slice(0, 2).map(i => i.player); + var list = users.filter(user => user == player); + if (list.length == 1) { + var target = users.filter(user => user != player)[0]; + return target && target.isIn() && target.countDiscardableCards(player, "he"); + } + if (list.length == 2) { + return history.slice(0, 2).some(evt => { + var card = evt.card; + return player.hasUseTarget({ + name: card.name, + nature: card.nature, + isCard: true, + }); + }); + } + return false; + }, + content: function () { + "step 0"; + var history = game.getGlobalHistory("useCard", evt => { + return get.type(evt.card) == "basic"; + }); + var list = history + .slice(0, 2) + .map(i => i.player) + .filter(user => user == player); + if (list.length == 1) { + var users = history.slice(0, 2).map(i => i.player); + var target = users.filter(user => user != player)[0]; + player.logSkill("oljianman", target); + player.discardPlayerCard(target, "he", true); + event.finish(); + } else if (list.length == 2) { + var evts = history.slice(0, 2); + var vcard = []; + for (var evt of evts) { + var card = evt.card; + if (vcard.length && vcard[0][2] == card.name && vcard[0][3] == card.nature) continue; + if (player.hasUseTarget({ name: card.name, nature: card.nature, isCard: true })) { + vcard.push(["基本", "", card.name, card.nature]); + } + } + if (vcard.length == 1) event._result = { bool: true, links: [vcard[0]] }; + else { + player.chooseButton(["鹣蛮:视为使用其中一张牌", [vcard, "vcard"]]).set("ai", function (button) { + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }); + } + } else event.finish(); + "step 1"; + if (result.bool) { + var card = { name: result.links[0][2], nature: result.links[0][3], isCard: true }; + player + .chooseUseTarget(card, true) + .set("logSkill", "oljianman") + .set("prompt", "鹣蛮:选择" + get.translation(card) + "的目标"); + } + }, + }, + //张华 + olbihun: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + forced: true, + filter: function (event, player) { + return event.isFirstTarget && player.countCards("h") > player.getHandcardLimit() && event.targets.some(target => target != player); + }, + //group:'olbihun_give', + content: function () { + if (trigger.targets.length == 1) { + var cards = trigger.cards.filterInD(); + if (cards.length) { + game.delayx(); + trigger.targets[0].gain(cards, "gain2"); + } + } + var targets = trigger.targets.filter(target => target != player); + trigger.targets.removeArray(targets); + trigger.getParent().triggeredTargets1.removeArray(targets); + }, + ai: { + threaten: 0.8, + halfneg: true, + effect: { + player: function (card, player, target) { + if ((!card.isCard || !card.cards) && get.itemtype(card) != "card") return; + let cs = 0; + if ( + target && + player != target && + player.countCards("h", i => { + if (card === i || (card.cards && card.cards.includes(i))) { + cs++; + return false; + } + return true; + }) > player.getHandcardLimit() + ) { + let targets = [], + evt = _status.event.getParent("useCard"); + targets.addArray(ui.selected.targets); + if (evt && evt.card == card) targets.addArray(evt.targets); + if (targets.length) { + if (targets.length > 1 || !targets.includes(target)) return "zeroplayertarget"; + return; + } + let info = get.info(card); + if (!info || info.notarget || !info.filterTarget) return; + let range, + select = get.copy(info.selectTarget), + filter; + if (select === undefined) range = [1, 1]; + else if (typeof select === "number") range = [select, select]; + else if (get.itemtype(select) === "select") range = select; + else if (typeof select === "function") range = select(card, player); + if (info.singleCard) range = [1, 1]; + game.checkMod(card, player, range, "selectTarget", player); + if (range[1] < -1) range = [1, 1]; + else if (range[0] < 0) { + if (info.filterTarget === true) filter = game.players.length; + else + filter = game.countPlayer(current => { + return info.filterTarget(card, player, current); + }); + range = [filter, filter]; + } + if (range && range[0] > 1 && range[1] > 1) return "zeroplayertarget"; + return [0, 0, 0, 1]; + } + }, + }, + }, + /*subSkill:{ + give:{ + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + return event._olbihun&&event._olbihun.isIn()&&event.cards.filterInD().length; + }, + forced:true, + popup:false, + content:function(){ + trigger._olbihun.gain(trigger.cards.filterInD(),'gain2'); + } + } + }*/ + }, + olchuanwu: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + forced: true, + filter: function (event, player) { + return player.getAttackRange() > 0; + }, + content: function () { + var skills = game.filterSkills(player.getStockSkills(true, true), player); + var num = Math.min(player.getAttackRange(), skills.length); + skills = skills.slice(0, num); + player.disableSkill("olchuanwu", skills); + player.addTempSkill("olchuanwu_restore"); + var str = ""; + for (var i of skills) { + str += "【" + get.translation(i) + "】、"; + player.popup(i); + } + str = str.slice(0, -1); + game.log(player, "的技能", "#g" + str, "失效了"); + player.draw(num); + }, + subSkill: { + restore: { + charlotte: true, + forced: true, + popup: false, + onremove: function (player) { + player.enableSkill("olchuanwu"); + game.log(player, "恢复了技能"); + }, + }, + }, + }, + oljianhe: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + return !player.getStorage("oljianhe_chosen").includes(target); + }, + filterCard: function (card, player) { + if (ui.selected.cards.length) { + var cardx = ui.selected.cards[0]; + if (get.type(cardx) == "equip") return get.type(card) == "equip"; + return get.name(card) == get.name(cardx); + } + var cards = player.getCards("he"); + for (var cardx of cards) { + if (card != cardx) { + if (get.type(cardx) == "equip" && get.type(card) == "equip") return true; + if (get.name(card) == get.name(cardx)) return true; + } + } + return false; + }, + selectCard: [2, Infinity], + position: "he", + complexCard: true, + discard: false, + visible: true, + prepare: "throw", + loseTo: "discardPile", + delay: 0.5, + check: function (card) { + if (get.type(card) == "equip") return 15 - get.value(card); + return 7 - get.value(card); + }, + content: function () { + "step 0"; + player.draw(cards.length); + player.addTempSkill("oljianhe_chosen", "phaseUseAfter"); + player.markAuto("oljianhe_chosen", [target]); + "step 1"; + var type = get.type2(cards[0]); + target + .chooseCard(get.translation(player) + "对你发动了【剑合】", "请重铸" + get.cnNumber(cards.length) + "张" + get.translation(type) + "牌,或点“取消”受到1点雷电伤害", cards.length, "he", (card, player) => { + return get.type2(card) == _status.event.type && player.canRecast(card); + }) + .set("ai", card => { + if (_status.event.goon) return (get.type(card) == "equip" ? 15 : 7) - get.value(card); + return 0; + }) + .set("type", type) + .set("goon", get.damageEffect(target, player, target, "thunder") < 0); + "step 2"; + if (result.bool) { + target.recast(result.cards); + } else { + target.damage(player, "thunder"); + } + "step 3"; + game.delayx(); + }, + ai: { + order: function (item, player) { + if (player.hasSkill("olbihun") && player.countCards("h") > player.getHandcardLimit()) return 11; + return 4; + }, + threaten: 2.4, + expose: 0.1, + result: { + target: function (player, target) { + var cards = ui.selected.cards, + type = get.type2(cards[0]); + if ( + target.countCards("he", card => { + return get.type(card) == type && get.value(card) <= 5; + }) >= cards.length + ) + return 1; + return -1; + }, + }, + }, + subSkill: { + chosen: { + charlotte: true, + onremove: true, + intro: { content: "本阶段已对$发动过技能" }, + }, + }, + }, + //屈晃 + olqiejian: { + audio: 2, + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(current => { + if (current.countCards("h")) return false; + var evt = event.getl(current); + return evt && evt.hs && evt.hs.length && !player.getStorage("olqiejian_ban").includes(current); + }); + }, + content: function () { + "step 0"; + event.targets = game + .filterPlayer(current => { + if (current.countCards("h")) return false; + var evt = trigger.getl(current); + return evt && evt.hs && evt.hs.length && !player.getStorage("olqiejian_ban").includes(current); + }) + .sortBySeat(_status.currentPhase); + "step 1"; + var target = targets.shift(); + event.target = target; + if (target.isIn()) { + player + .chooseBool(get.prompt2("olqiejian", target)) + .set("ai", () => { + return _status.event.bool; + }) + .set( + "bool", + get.attitude(player, target) > 0 || + target.hasCard(card => { + return get.value(card, target) * get.sgnAttitude(player, target) < -6; + }, "ej") + ); + } else event.goto(5); + "step 2"; + if (result.bool) { + player.logSkill("olqiejian", target); + player.draw("nodelay"); + target.draw(); + } else event.goto(5); + "step 3"; + player + .chooseTarget("切谏:选择一名角色", "弃置你或其场上的一张牌;或点击“取消”令你于本轮不能再对其发动此技能", (card, player, target) => { + return (target == player || target == _status.event.getParent().target) && target.countDiscardableCards(player, "ej") > 0; + }) + .set("ai", target => { + var sign = get.sgnAttitude(_status.event.player, target); + return ( + 6 - + target + .getCards("ej") + .map(i => { + var val = 0; + if (get.position(i) == "e") val = get.value(i, target); + else { + val = get.effect( + player, + { + name: i.viewAs || i.name, + cards: [i], + }, + target, + target + ); + } + return sign * val; + }) + .sort((a, b) => a - b)[0] + ); + }); + "step 4"; + if (result.bool) { + var targetx = result.targets[0]; + player.discardPlayerCard(targetx, "ej", true); + } else { + player.addTempSkill("olqiejian_ban", "roundStart"); + player.markAuto("olqiejian_ban", [target]); + } + "step 5"; + if (targets.length) event.goto(1); + }, + subSkill: { + ban: { + onremove: true, + charlotte: true, + intro: { + content: "本轮不能再对$发动〖切谏〗", + }, + }, + }, + }, + olnishou: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["loseAsyncAfter", "equipAfter"], + }, + forced: true, + filter: function (event, player) { + var phaseName; + for (var name of lib.phaseName) { + var evt = event.getParent(name); + if (!evt || evt.name != name) continue; + phaseName = name; + } + var cards = event.getd(player, "es"); + return ( + cards.length && + (cards.some(card => { + if (get.position(card, true) != "d") return false; + return player.hasUseTarget(get.autoViewAs({ name: "shandian" }, [card])); + }) || + (phaseName && !player.hasSkill("olnishou_swap"))) + ); + }, + direct: true, + content: function () { + "step 0"; + var cards = trigger.getd(player, "es"); + var choices = []; + var choiceList = ["将" + (cards.length ? get.translation(cards[0]) : "这些牌中第一张能当【闪电】对你使用的牌") + "当【闪电】使用", "本阶段结束时,你与一名手牌数最少的角色交换手牌"]; + cards = cards.filter(card => { + if (get.position(card, true) != "d") return false; + return player.hasUseTarget(get.autoViewAs({ name: "shandian" }, [card])); + }); + event.cards = cards; + var phaseName; + for (var name of lib.phaseName) { + var evt = trigger.getParent(name); + if (!evt || evt.name != name) continue; + phaseName = name; + } + if (cards.length) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (phaseName && !player.hasSkill("olnishou_swap")) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + event.phaseName = phaseName; + if (!choices.length) event.finish(); + else + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "泥首:选择一项") + .set("ai", () => 0); + "step 1"; + player.logSkill("olnishou"); + game.log(player, "选择了", "#y" + result.control); + if (result.control == "选项一") { + var card = cards[0]; + player.chooseUseTarget({ name: "shandian" }, [card], true); + } else { + var name = event.phaseName; + player.storage.olnishou_swap = name; + player.addTempSkill("olnishou_swap", name + "After"); + } + }, + ai: { + halfneg: true, + }, + subSkill: { + swap: { + audio: "olnishou", + charlotte: true, + forced: true, + direct: true, + onremove: true, + trigger: { + global: ["phaseZhunbeiEnd", "phaseJudgeEnd", "phaseDrawEnd", "phaseUseEnd", "phaseDiscardEnd", "phaseJieshuEnd"], + }, + content: function () { + "step 0"; + if (trigger.name != player.storage.olnishou_swap || !event.player.isIn()) { + player.removeSkill("olnishou_swap"); + event.finish(); + return; + } + player.chooseTarget("泥首:与一名手牌数最少的角色交换手牌", true, (card, player, target) => { + return target.isMinHandcard(); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olnishou_swap", target); + if (target != player) { + player.swapHandcards(target); + } + } + "step 2"; + player.removeSkill("olnishou_swap"); + }, + }, + }, + }, + //马承 + olchenglie: { + audio: 2, + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); + }); + }, + direct: true, + shaRelated: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("olchenglie"), "为" + get.translation(trigger.card) + "多指定至多两个目标,并发动后续效果", [1, 2], (card, player, target) => { + var evt = _status.event.getTrigger(); + return !evt.targets.includes(target) && player.canUse(evt.card, target); + }) + .set("ai", function (target) { + var player = _status.event.player, + evt = _status.event.getTrigger(); + return get.effect(target, evt.card, player, player); + }); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else event.finish(); + "step 2"; + player.logSkill("olchenglie", targets); + trigger.targets.addArray(targets); + var targets = trigger.targets; + event.targets = targets; + event.given = []; + var cards = get.cards(targets.length); + event.cards = cards.slice(); + player.showCards(event.cards, get.translation(player) + "发动了【骋烈】"); + while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); + "step 3"; + game.updateRoundNumber(); + var hs = player.getCards("h"); + var next = player.chooseToMove("骋烈:是否交换一张牌?"); + next.set("list", [ + ["〖骋烈〗展示", event.cards, "olchenglie"], + ["你的手牌", hs], + ]); + next.set("filterMove", function (from, to, moved) { + if (typeof to == "number") return false; + var player = _status.event.player; + var hs = player.getCards("h"); + var changed = hs.filter(function (card) { + return !moved[1].includes(card); + }); + var changed2 = moved[1].filter(function (card) { + return !hs.includes(card); + }); + if (changed.length < 1) return true; + var pos1 = moved[0].includes(from.link) ? 0 : 1, + pos2 = moved[0].includes(to.link) ? 0 : 1; + if (pos1 == pos2) return true; + if (pos1 == 0) { + if (changed.includes(from.link)) return true; + return changed2.includes(to.link); + } + if (changed2.includes(from.link)) return true; + return changed.includes(to.link); + }); + next.set("processAI", function (list) { + var cards1 = list[0][1].slice(), + cards2 = list[1][1].slice(); + var card1 = cards1.sort((a, b) => get.value(b) - get.value(a))[0]; + var card2 = cards2.sort((a, b) => get.value(a) - get.value(b))[0]; + if (card1 && card2 && get.value(card1) > get.value(card2)) { + cards1.remove(card1); + cards2.remove(card2); + cards1.push(card2); + cards2.push(card1); + } + return [cards1, cards2]; + }); + "step 4"; + var moved = result.moved; + var hs = player.getCards("h"), + ts = event.cards; + var card1, card2; + for (var i of moved[0]) { + if (!ts.includes(i)) card1 = i; + } + for (var i of moved[1]) { + if (!hs.includes(i)) card2 = i; + } + if (card1 && card2) { + player.$throw(1, 1000); + event.cards.forEach((i, ind, arr) => { + if (i == card2) arr[ind] = card1; + }); + player + .lose(card1, ui.cardPile) + .set("insert_index", event => event.cardx) + .set("cardx", card2); + player.gain(card2, "draw"); + game.log(player, "交换了一张牌"); + } + "step 5"; + game.cardsGotoOrdering(event.cards); + "step 6"; + if (event.cards.length == 1) event._result = { bool: true, links: event.cards }; + else player.chooseButton(["骋烈:将这些牌置于目标角色的武将牌上", event.cards], true); + game.updateRoundNumber(); + "step 7"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget("将" + get.translation(card) + "置于一名目标角色的武将牌上", true, (card, player, target) => { + return _status.event.getTrigger().targets.includes(target) && !_status.event.getParent().given.includes(target); + }) + .set("ai", target => { + var color = _status.event.color, + player = _status.event.player; + var evt = _status.event.getTrigger(); + if (color == "red") { + var eff = get.effect(target, evt.card, player, target), + att = get.attitude(player, target); + if (eff >= 0 && att < 0) return -1; + if (eff < 0 && att < 0 && target.hasCard(card => ["shan", "caochuan"].includes(get.name(card)), "hs")) return 10; + } + return 1; + }) + .set("color", get.color(card)); + } else event.finish(); + "step 8"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + event.given.push(target); + target.addToExpansion(card).gaintag.add("olchenglie"); + player.addTempSkill("olchenglie_effect", "phaseUseAfter"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.olchenglie = player; + target.storage.olchenglie_viewer = player; + event.cards.remove(card); + var cardx = player == game.me || player.isUnderControl() ? card : 1; + player.$give(cardx, target, false); + } else event.finish(); + "step 9"; + if (event.cards.length) event.goto(6); + else if (!event.isMine() && !event.isOnline()) game.delayx(); + }, + marktext: "骋", + intro: { + markcount: "expansion", + mark: function (dialog, content, player) { + var content = player.getExpansions("olchenglie"); + if (content && content.length) { + if (game.me == player.storage.olchenglie_viewer) { + dialog.addAuto(content); + } else { + return "有" + get.cnNumber(content.length) + "张扣置的“骋烈”牌"; + } + } + }, + content: function (content, player) { + var content = player.getExpansions("olchenglie"); + if (content && content.length) { + if (game.me == player.storage.olchenglie_viewer) { + return get.translation(content); + } + return "有" + get.cnNumber(content.length) + "张扣置的“骋烈”牌"; + } + }, + }, + subSkill: { + effect: { + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + forceDie: true, + popup: false, + filter: function (event, player) { + return event.card.storage && event.card.storage.olchenglie; + }, + content: function () { + "step 0"; + var targets = game + .filterPlayer(current => { + var cards = current.getExpansions("olchenglie"); + return cards.some(i => get.color(i, false) == "red"); + }) + .sortBySeat(); + event.targets = targets; + var togive = trigger.card.storage.olchenglie; + event.togive = togive; + if (!targets.length || !togive.isIn()) event.goto(3); + "step 1"; + var target = event.targets.shift(); + event.target = target; + player.line(target); + if ( + target.hasHistory("useCard", evt => { + return evt.respondTo && evt.respondTo[1] == trigger.card; + }) + ) { + if (target.countCards("he")) target.chooseCard("骋烈:交给" + get.translation(event.togive) + "一张牌", true, "he"); + } else { + target.recover(); + } + "step 2"; + if (result.bool) { + target.give(result.cards, event.togive); + } + if (targets.length) event.goto(1); + "step 3"; + game.filterPlayer(current => { + var cards = current.getExpansions("olchenglie"); + return cards.length; + }).forEach(i => { + i.loseToDiscardpile(i.getExpansions("olchenglie")); + delete i.storage.olchenglie_viewer; + }); + }, + }, + }, + }, + //新贺齐 + olqizhou: { + audio: "qizhou", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter", "phaseBefore"], + }, + forced: true, + onremove: true, + filter: function (event, player) { + if (event.name != "phase" && (event.name != "equip" || event.player != player)) { + var evt = event.getl(player); + if (!evt || !evt.es || !evt.es.length) return false; + } + var num = player.countMark("olqizhou"); + return lib.skill.olqizhou.getSuitNum(player) != num; + }, + content: function () { + lib.skill.olqizhou.applyChange(player); + }, + getSuitNum: function (player) { + var suits = [], + es = player.getCards("e"); + for (var i of es) suits.add(get.suit(i, player)); + return Math.min(4, suits.length); + }, + applyChange: function (player) { + player.removeAdditionalSkill("olqizhou"); + var num = lib.skill.olqizhou.getSuitNum(player); + player.storage.olqizhou = num; + if (num > 0) player.addAdditionalSkill("olqizhou", lib.skill.olqizhou.derivation.slice(0, num)); + }, + derivation: ["reduanbing", "reyingzi", "fenwei", "lanjiang"], + }, + olshanxi: { + audio: "shanxi", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("e") < 5 && game.hasPlayer(current => lib.skill.olshanxi.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return target != player && player.countCards("h") + target.countCards("h") > 0 && !player.inRangeOf(target); + }, + content: function () { + "step 0"; + var cards1 = player.getCards("h"), + cards2 = target.getCards("h"); + var num = 5 - player.countCards("e"); + var dialog = ["闪袭:选择展示至多" + get.cnNumber(num) + "张牌"]; + if (cards1.length > 0) { + dialog.push('
    你的手牌
    '); + dialog.push(cards1); + } + if (cards2.length > 0) { + dialog.push('
    ' + get.translation(target) + "的手牌
    "); + if (player.hasSkillTag("viewHandcard", null, target, true)) dialog.push(cards2); + else dialog.push([cards2.randomSort(), "blank"]); + } + player.chooseButton(dialog, [1, num], true).set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target; + var card = button.link, + cards = ui.selected.buttons.map(button => button.link); + var hs = player.getCards("h"), + discard = false; + for (var i of cards) { + if (hs.includes(i)) { + discard = true; + break; + } + } + if (hs.includes(card)) { + if (discard || get.name(card) != "shan") return 0; + if (target.hasCard(card => get.value(card, target) > 5, "e")) return 2; + return 0; + } + if ( + discard && + !target.hasCard(function (cardx) { + return cardx != card && !cards.includes(cardx) && get.value(cardx, target) > 0; + }, "he") + ) + return 0; + return 1 + Math.random(); + }); + "step 1"; + if (result.bool) { + event.cards = result.links; + var list1 = [], + list2 = []; + var hs = player.getCards("h"); + for (var card of result.links) { + if (hs.includes(card)) { + list1.push(card); + } else { + list2.push(card); + } + } + event.list1 = list1; + event.list2 = list2; + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, target, list1, list2, id) { + var dialog = ui.create.dialog(player + "对" + target + "发动了【闪袭】"); + dialog.videoId = id; + if (list1.length > 0) { + dialog.add('
    ' + player + "展示的牌
    "); + dialog.add(list1); + } + if (list2.length > 0) { + dialog.add('
    ' + target + "被展示的牌
    "); + dialog.add(list2); + } + }, + get.translation(player), + get.translation(target), + list1, + list2, + event.videoId + ); + game.delay(4); + } else event.finish(); + "step 2"; + game.broadcastAll("closeDialog", event.videoId); + var list1 = event.list1.filter(card => get.name(card, player) == "shan"); + var list2 = event.list2.filter(card => get.name(card, target) == "shan"); + if (list1.length && list2.length) { + game.loseAsync({ + lose_list: [ + [player, list1], + [target, list2], + ], + discarder: player, + }).setContent("discardMultiple"); + } else if (list2.length) { + target.discard(list2); + } else if (list1.length) player.discard(list1); + else event.finish(); + "step 3"; + if ( + target.hasCard(function (card) { + return !cards.includes(card) && lib.filter.canBeGained(card, player, target); + }, "he") + ) + player + .gainPlayerCard(target, true, "he") + .set("filterButton", function (button) { + return !_status.event.cards.includes(button.link); + }) + .set("cards", cards); + }, + ai: { + order: 14, + result: { + target: function (player, target) { + return -target.countCards("h"); + }, + }, + }, + }, + //刘巴 + oltongduo: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("oltongduo"), function (card, player, target) { + return target != player && target.countCards("h") > 0; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return Math.sqrt(att) / 10; + return 5 - att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oltongduo", target); + target.chooseCard("h", true, "统度:将一张手牌交给" + get.translation(player) + ",然后其于此阶段结束时将此牌置于牌堆顶"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.addTempSkill("oltongduo_put"); + event.target.give(result.cards, player, true).gaintag.add("oltongduo"); + } + }, + subSkill: { + put: { + trigger: { player: "phaseUseEnd" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player.hasCard(card => card.hasGaintag("oltongduo"), "h"); + }, + content: function () { + var cards = player.getCards("h", card => card.hasGaintag("oltongduo")); + player.lose(cards, ui.cardPile, "insert"); + game.log(player, "将", get.cnNumber(cards.length) + "张牌", "置于牌堆顶"); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, player); + }, + onremove: function (player) { + player.removeGaintag("oltongduo"); + }, + }, + }, + }, + olzhubi: { + audio: 2, + enable: "phaseUse", + group: "olzhubi_replace", + filter: function (event, player) { + return (player.getStat("skill").olzhubi || 0) < player.maxHp; + }, + filterTarget: function (card, player, target) { + return target.countCards("he") > 0; + }, + content: function () { + "step 0"; + target.chooseCard("he", true, "铸币:请重铸一张牌", lib.filter.cardRecastable); + "step 1"; + if (result.bool) { + target.recast(result.cards, null, player => (player.draw().set("log", false).gaintag = ["olzhubi_tag"])); + } + }, + ai: { + order: 6, + result: { + target: function (player, target) { + if (target.hasCard(card => card.hasGaintag("olzhubi_tag"), "h")) return 0.5; + return 1; + }, + }, + }, + subSkill: { + replace: { + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player.hasCard(card => card.hasGaintag("olzhubi_tag"), "h"); + }, + forced: true, + locked: false, + logTarget: "player", + content: function () { + "step 0"; + var cards = get.bottomCards(5); + event.cards2 = cards; + game.cardsGotoOrdering(cards); + var player = trigger.player; + var next = player.chooseToMove("铸币:用任意“币”交换牌堆底等量张牌"); + var hs = player.getCards("h", card => card.hasGaintag("olzhubi_tag")); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + next.set("list", [ + ["牌堆底", cards], + ["你的手牌", hs, "olzhubi_tag"], + ]); + next.set("processAI", function (list) { + var all = list[0][1].concat(list[1][1]), + cards = all.slice(0); + var num = _status.event.num; + cards.sort(function (a, b) { + return get.value(b) - get.value(a); + }); + return [cards.slice(num), cards.slice(0, num)]; + }); + next.set("num", hs.length); + "step 1"; + if (result.bool) { + event.forceDie = true; + var cards = result.moved[0]; + event.cards = cards; + var player = trigger.player; + var hs = player.getCards("h"); + var lose = [], + gain = event.cards2; + for (var i of cards) { + if (hs.includes(i)) lose.push(i); + else gain.remove(i); + } + if (lose.length) player.lose(lose, ui.cardPile); + if (gain.length) player.gain(gain, "draw"); + } else event.finish(); + "step 2"; + for (var i of cards) { + if (!"hejsdx".includes(get.position(i, true))) { + i.fix(); + ui.cardPile.appendChild(i); + } + } + game.updateRoundNumber(); + }, + }, + }, + }, + //傅肜 + olxiaosi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("h") > 0 && player != target; + }, + filterCard: function (card, player, target) { + return get.type(card) == "basic"; + }, + check: function (card) { + var player = _status.event.player; + if (player.hasValueTarget(card)) return 10 - get.value(card); + return 0.1; + }, + content: function () { + "step 0"; + if ( + target.countCards("h", card => { + return get.type(card) == "basic" && lib.filter.cardDiscardable(card, target, "olxiaosi"); + }) == 0 + ) + event.draw = true; + else { + target.chooseToDiscard("h", true, "效死:弃置一张基本牌", { type: "basic" }); + } + "step 1"; + var cards2 = cards.slice(0); + if (result.bool) { + cards2 = cards2.addArray(result.cards); + } + event.cards2 = cards2; + "step 2"; + var cardsx = event.cards2.filter(i => get.position(i, true) == "d" && player.hasUseTarget(i, false)); + if (!cardsx.length) event.goto(5); + else + player + .chooseButton(["效死:是否使用其中的一张牌?", cardsx]) + .set("filterButton", button => { + return _status.event.player.hasUseTarget(button.link, false); + }) + .set("ai", button => { + if (button.link.name == "jiu") return 10; + return _status.event.player.getUseValue(button.link); + }); + "step 3"; + if (result.bool) { + var card = result.links[0]; + event.cards2.remove(card); + player.$gain2(card, false); + game.delayx(); + player.chooseUseTarget(true, card, false, "nodistance"); + } else event.goto(5); + "step 4"; + if (event.cards2.filter(i => get.position(i, true) == "d" && player.hasUseTarget(i, false)).length) event.goto(2); + "step 5"; + if (event.draw) player.draw(); + }, + ai: { + order: 4.5, + result: { + player: 1, + target: -1, + }, + }, + }, + //阿会喃 + jueman: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + direct: true, + filter: function (event, player) { + var history = game.getGlobalHistory("useCard", evt => { + return get.type(evt.card) == "basic"; + }); + if (history.length < 2) return false; + var users = history.slice(0, 2).map(i => i.player); + var list = users.filter(user => user == player); + if (list.length == 1) return true; + if (list.length == 0) { + var evtx = history[2]; + if (evtx) { + var name = evtx.card.name, + nature = evtx.card.nature; + if (evtx && player.hasUseTarget({ name: name, nature: nature, isCard: true })) return true; + } + } + return false; + }, + content: function () { + "step 0"; + var history = game.getGlobalHistory("useCard", evt => { + return get.type(evt.card) == "basic"; + }); + var list = history + .slice(0, 2) + .map(i => i.player) + .filter(user => user == player); + if (list.length == 1) { + player.logSkill("jueman"); + player.draw(); + } else if (list.length == 0) { + var evtx = history[2], + name = evtx.card.name, + nature = evtx.card.nature; + player.chooseUseTarget({ name: name, nature: nature, isCard: true }, true).set("logSkill", "jueman"); + } + }, + }, + //张芝 + olbixin: { + audio: 2, + trigger: { + global: ["phaseZhunbeiBegin", "phaseJieshuBegin"], + }, + direct: true, + onremove: ["olbixin", "olbixin_basic", "olbixin_trick", "olbixin_equip"], + group: "olbixin_full", + map: { 基本: "basic", 锦囊: "trick", 装备: "equip" }, + filter: function (event, player) { + var count = player.countMark("olbixin"); + if (count > 0 && event.player != player) return false; + if (count > 1 && event.name == "phaseZhunbei") return false; + if (count > 2) return false; + var num = count >= 3 ? 3 : 1; + var types = ["basic", "trick", "equip"].filter(type => { + return player.countMark("olbixin_" + type) < num; + }); + if (!types.length) return false; + return lib.skill.olbixin.getList(player).length > 0; + }, + getList: function (player, event) { + var natures = lib.inpile_nature.slice(0), + used = []; + var history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + var info = history[i]; + for (var evt of info.useCard) { + var name = evt.card.name; + if (get.type(name) != "basic") continue; + if (name == "sha") { + if (evt.card.nature) natures.remove(evt.card.nature); + else used.push(name); + } else used.push(name); + } + if (info.isRound) break; + } + var vcards = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (!event) { + if (name == "sha") { + if (!used.includes("sha") && player.hasUseTarget({ name: "sha" })) vcards.push(["基本", "", "sha"]); + for (var nature of natures) { + if (player.hasUseTarget({ name: "sha", nature: nature })) vcards.push(["基本", "", "sha", nature]); + } + } else if (!used.includes(name) && player.hasUseTarget({ name: name })) vcards.push(["基本", "", name]); + } else { + if (name == "sha") { + if (!used.includes("sha") && event.filterCard({ name: "sha" }, player, event)) vcards.push(["基本", "", "sha"]); + for (var nature of natures) { + if (event.filterCard({ name: "sha", nature: nature }, player, event)) vcards.push(["基本", "", "sha", nature]); + } + } else if (!used.includes(name) && event.filterCard({ name: name }, player, event)) vcards.push(["基本", "", name]); + } + } + return vcards; + }, + content: function () { + "step 0"; + var types = ["basic", "trick", "equip"]; + var list = lib.skill.olbixin.getList(player); + if (list.length) { + var dialog = ["###" + get.prompt("olbixin") + '###
    摸' + get.cnNumber(player.countMark("olbixin") >= 3 ? 1 : 3) + "张牌,然后将所有指定类型的手牌当一张基本牌使用
    "]; + dialog.push([types.map(i => get.translation(i)), "tdnodes"]); + dialog.push([list, "vcard"]); + player + .chooseButton(dialog, 2) + .set("filterButton", button => { + var player = _status.event.player, + count = player.countMark("olbixin"), + num = count >= 3 ? 3 : 1; + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) return false; + if (type == "string" && player.countMark("olbixin_" + lib.skill.olbixin.map[button.link]) >= num) return false; + if (type != "string" && !player.hasUseTarget({ name: button.link[2], nature: button.link[3] })) return false; + return true; + }) + .set("ai", button => { + var list = _status.event.list; + var type = typeof button.link; + if (type == "string") return (1.2 - list.indexOf(lib.skill.olbixin.map[button.link])) * 10; + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }) + .set( + "list", + types + .map(i => [ + i, + player + .getCards("h", { type: i }) + .map(i => get.value(i)) + .reduce((p, c) => p + c, 0), + ]) + .sort((a, b) => a[1] - b[1]) + .map(i => i[0]) + ); + } else event.finish(); + "step 1"; + if (result.bool) { + if (typeof result.links[0] != "string") result.links.reverse(); + var type = result.links[0], + name = result.links[1][2], + nature = result.links[1][3]; + player.logSkill("olbixin"); + game.log(player, "声明了", type + "牌"); + type = lib.skill.olbixin.map[type]; + event.type = type; + event.card = { name: name, nature: nature }; + player.addMark("olbixin_" + type, 1, false); + player.draw(player.countMark("olbixin") >= 3 ? 1 : 3); + game.delayx(); + } else event.finish(); + "step 2"; + if (player.hasCard(card => get.type2(card) == event.type, "h")) { + var cards = player.getCards("h", card => get.type2(card) == event.type); + var cardx = get.autoViewAs(card, cards); + if (player.hasUseTarget(cardx, true, false)) { + player.chooseUseTarget(cardx, cards, true, false).set("prompt", "选择" + get.translation(cardx) + "(" + get.translation(cards) + ")的目标"); + } + } + }, + subSkill: { + full: { + enable: "chooseToUse", + filter: function (event, player) { + if (event.olbixin) return false; + var count = player.countMark("olbixin"); + if (count <= 2) return false; + var num = count >= 3 ? 3 : 1; + var types = ["basic", "trick", "equip"].filter(type => { + return player.countMark("olbixin_" + type) < num; + }); + if (!types.length) return false; + return lib.skill.olbixin.getList(player, event).length > 0; + }, + prompt: "你可以声明一种牌的类型(每种类型限三次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸一张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。", + chooseButton: { + dialog: function (event, player) { + var list = lib.skill.olbixin.getList(player, event); + var types = ["basic", "trick", "equip"]; + return ui.create.dialog('###笔心###
    摸一张牌,然后将所有指定类型的手牌当一张基本牌使用
    ', [types.map(i => get.translation(i)), "tdnodes"], [list, "vcard"]); + }, + filter: function (button, player) { + var player = _status.event.player, + count = player.countMark("olbixin"), + num = count >= 3 ? 3 : 1; + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) return false; + if (type == "string" && player.countMark("olbixin_" + lib.skill.olbixin.map[button.link]) >= num) return false; + if (type != "string" && !_status.event.getParent().filterCard({ name: button.link[2], nature: button.link[3] }, player, _status.event.getParent())) return false; + return true; + }, + select: 2, + check: function (button) { + var types = ["basic", "trick", "equip"]; + var type = typeof button.link; + var player = _status.event.player; + var list = types + .map(i => [ + i, + player + .getCards("h", { type: i }) + .map(i => get.value(i)) + .reduce((p, c) => p + c, 0), + ]) + .sort((a, b) => a[1] - b[1]) + .map(i => i[0]); + if (type == "string") return (1.2 - list.indexOf(button.link) + Math.sqrt(3 - player.countMark("olbixin_" + lib.skill.olbixin.map[button.link]))) * 10; + if (_status.event.getParent().type != "phase") return 1; + return player.getUseValue({ name: button.link[2], nature: button.link[3] }); + }, + backup: function (links, player) { + if (typeof links[0] != "string") links.reverse(); + return { + popname: true, + position: "h", + filterCard: () => false, + selectCard: -1, + type: lib.skill.olbixin.map[links[0]], + viewAs: { name: links[1][2], nature: links[1][3] }, + precontent: function () { + "step 0"; + player.logSkill("olbixin"); + var type = lib.skill.olbixin_full_backup.type; + game.log(player, "声明了", type, "牌"); + delete event.result.skill; + player.addMark("olbixin_" + type, 1, false); + player.draw(player.countMark("olbixin") >= 3 ? 1 : 3); + "step 1"; + var cards = player.getCards("h", card => get.type2(card) == lib.skill.olbixin_full_backup.type); + var cardsx = cards.filter(i => game.checkMod(i, player, "unchanged", "cardEnabled2", player) !== false); + if (cardsx.length && cardsx.length == cards.length) { + event.result.cards = cards; + game.delayx(); + } else { + event.cancel(); + // event.getParent().set('olbixin',true); + event.getParent().goto(0); + delete event.getParent().openskilldialog; + } + }, + }; + }, + prompt: function (links, player) { + return "摸一张牌,然后将所有" + get.translation(links[0]) + "牌当做" + (get.translation(links[1][3]) || "") + get.translation(links[1][2]) + "使用"; + }, + }, + hiddenCard: function (player, name) { + var count = player.countMark("olbixin"); + if (!lib.inpile.includes(name) || get.type(name) != "basic" || count < 3) return false; + var types = ["basic", "trick", "equip"].filter(type => { + return player.countMark("olbixin_" + type) < 3; + }); + return types.length; + }, + ai: { + fireAttack: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + var count = player.countMark("olbixin"); + if (count < 3) return; + var types = ["basic", "trick", "equip"].filter(type => { + return player.countMark("olbixin_" + type) < 3; + }); + if (types.length) return true; + }, + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + }, + full_backup: {}, + }, + }, + olximo: { + audio: 3, + trigger: { player: "logSkill" }, + derivation: "olfeibai", + filter: function (event, player) { + return event.skill == "olbixin" && player.countMark("olbixin") < 3; + }, + forced: true, + content: function () { + player.addMark("olbixin", 1, false); + game.log(player, "删除了", "#g【笔心】", "描述的前五个字符"); + if (player.countMark("olbixin") == 3) { + game.log(player, "交换了", "#g【笔心】", "方括号中的两个数字"); + //player.removeSkill('olximo'); + //game.log(player,'失去了技能','#g【洗墨】'); + player.changeSkills(["olfeibai"], ["olximo"]); + } + }, + ai: { + combo: "olbixin", + }, + }, + olfeibai: { + audio: 2, + trigger: { + source: "damageBegin1", + player: "recoverBegin", + }, + filter: function (event, player) { + var storage = player.storage.olfeibai; + var evt = event.getParent(), + card = event.card; + if (evt.player != player || !card) return false; + if (storage && event.name == "recover") { + return get.color(card) != "red"; + } + if (!storage && event.name == "damage") { + return get.color(card) != "black"; + } + return false; + }, + content: function () { + player.changeZhuanhuanji("olfeibai"); + trigger.num++; + }, + zhuanhuanji: true, + forced: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + if (storage) return "转换技。当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。"; + return "转换技。当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1。"; + }, + }, + }, + //新诸葛瑾 + olhuanshi: { + audio: "huanshi", + trigger: { global: "judge" }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + logTarget: "player", + prompt2: function (event, player) { + var str = get.translation(event.player) + "的" + event.judgestr + "判定为" + get.translation(event.player.judging[0]) + "。你可以令其观看你的牌,其选择一张牌进行改判。"; + if (!player.hasSkill("olhuanshi_mark", null, null, false)) str += "然后你可以重铸任意张牌。"; + return str; + }, + check: function (event, player) { + if (get.attitude(player, event.player) <= 0) return false; + var cards = player.getCards("he"); + var judge = event.judge(event.player.judging[0]); + for (var i = 0; i < cards.length; i++) { + var judge2 = event.judge(cards[i]); + if (judge2 > judge) return true; + if (_status.currentPhase != player && judge2 == judge && get.color(cards[i]) == "red" && get.useful(cards[i]) < 5) return true; + } + return false; + }, + content: function () { + "step 0"; + var target = trigger.player; + var judge = trigger.judge(target.judging[0]); + var attitude = get.attitude(target, player); + target + .choosePlayerCard("请选择代替判定的牌", "he", "visible", true, player) + .set("ai", function (button) { + var card = button.link; + var judge = _status.event.judge; + var attitude = _status.event.attitude; + var result = trigger.judge(card) - judge; + var player = _status.event.player; + if (result > 0) { + return 20 + result; + } + if (result == 0) { + if (_status.currentPhase == player) return 0; + if (attitude >= 0) { + return get.color(card) == "red" ? 7 : 0 - get.value(card); + } else { + return get.color(card) == "black" ? 10 : 0 + get.value(card); + } + } + if (attitude >= 0) { + return get.color(card) == "red" ? 0 : -10 + result; + } else { + return get.color(card) == "black" ? 0 : -10 + result; + } + }) + .set("filterButton", function (button) { + var player = _status.event.target; + var card = button.link; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("judge", judge) + .set("attitude", attitude); + "step 1"; + if (result.bool) { + event.card = result.links[0]; + player.respond(event.card, "highlight", "noOrdering").nopopup = true; + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = event.card; + trigger.orderingCards.add(event.card); + game.log(trigger.player, "的判定牌改为", event.card); + game.delay(2); + } + if (!player.countCards("h") || player.hasSkill("olhuanshi_mark", null, null, false)) event.finish(); + "step 3"; + player.chooseCard("是否重铸任意张手牌?", "操作提示:选择要重铸的牌并点击“确定”", [1, player.countCards("h")], lib.filter.cardRecastable).set("ai", function (card) { + var player = _status.event.player, + cards = ui.selected.cards; + if (!player.hasSkill("olmingzhe")) return 5 - get.value(card); + for (var i of cards) { + if (get.color(i, player) == "red") return 5 - get.value(card); + } + return 7.5 - get.value(card); + }); + "step 4"; + if (result.bool) { + player.addTempSkill("olhuanshi_mark"); + player.recast(result.cards); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + subSkill: { mark: { charlotte: true } }, + }, + olhongyuan: { + audio: "hongyuan", + trigger: { player: "gainAfter", global: "loseAsyncAfter" }, + filter(event, player) { + if (!player.countCards("he") || player.hasSkill("olhongyuan_blocker", null, null, false)) return false; + return event.getg(player).length >= 2; + }, + async content(event, trigger, player) { + player.addTempSkill("olhongyuan_blocker", ["phaseZhunbeiBefore", "phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore", "phaseJieshuBefore", "phaseBefore"]); + let selectedTargets = []; + while ( + selectedTargets.length < 2 && + player.countCards("he") && + game.hasPlayer(target => { + return target != player && !selectedTargets.includes(target); + }) + ) { + const { + result: { bool, targets, cards }, + } = await player + .chooseCardTarget({ + prompt: "弘援:将一张牌交给一名其他角色", + filterCard: true, + position: "he", + filterTarget(card, player, target) { + return target != player && !get.event("selectedTargets").includes(target); + }, + complexCard: true, + complexTarget: true, + complexSelect: true, + ai1(card) { + const player = get.event("player"); + if ( + !game.hasPlayer(current => { + if (get.event("selectedTargets").includes(current)) return false; + return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); + }) + ) + return -get.value(card); + return 4 + (player.hasSkill("olmingzhe") && get.color(card) == "red" ? 2 : 0) - Math.max(player.getUseValue(card), get.value(card, player)); + }, + ai2(target) { + const player = _status.event.player, + att = get.attitude(player, target); + if (!ui.selected.cards.length) return att; + const card = ui.selected.cards[0], + val = get.value(card, target); + if (val < 0) return -att * Math.sqrt(-val); + return att * Math.sqrt(val + 2); + }, + }) + .set("selectedTargets", selectedTargets); + if (bool) { + const target = targets[0]; + selectedTargets.push(target); + player.line(target); + await player.give(cards, target); + } else break; + } + }, + ai: { threaten: 0.8 }, + subSkill: { blocker: { charlotte: true } }, + }, + olmingzhe: { + audio: "mingzhe", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + if (player.isPhaseUsing()) return false; + var evt = event.getl(player); + for (var i of evt.cards2) { + if (get.color(i, player) == "red") return true; + } + return false; + }, + content: function () { + if (!trigger.visible) { + var cards = trigger.getl(player).hs.filter(function (i) { + return get.color(i, player) == "red"; + }); + if (cards.length > 0) player.showCards(cards, get.translation(player) + "发动了【明哲】"); + } + player.draw(); + }, + }, + //吕范 + xindiaodu: { + audio: "diaodu", + group: "xindiaodu_use", + frequent: true, + preHidden: true, + isFriendOf: function (player, target) { + if (get.mode() == "guozhan") return player.isFriendOf(target); + return player.group == target.group; + }, + subSkill: { + temp: { charlotte: true }, + use: { + trigger: { + global: "useCard", + }, + filter: function (event, player) { + return get.type(event.card) == "equip" && event.player.isIn() && lib.skill.xindiaodu.isFriendOf(player, event.player) && (player == event.player || player.hasSkill("xindiaodu")) && !event.player.hasSkill("xindiaodu_temp"); + }, + direct: true, + content: function () { + "step 0"; + var next = trigger.player.chooseBool("是否发动【调度】摸一张牌?"); + if (player.hasSkill("xindiaodu")) next.set("frequentSkill", "xindiaodu"); + if (player == trigger.player) next.setHiddenSkill("xindiaodu"); + "step 1"; + if (result.bool) { + player.logSkill("xindiaodu", trigger.player); + trigger.player.draw("nodelay"); + trigger.player.addTempSkill("xindiaodu_temp"); + } + }, + }, + }, + trigger: { + player: "phaseUseBegin", + }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return lib.skill.xindiaodu.isFriendOf(current, player) && current.countGainableCards(player, "e") > 0; + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xindiaodu"), function (card, player, current) { + return lib.skill.xindiaodu.isFriendOf(current, player) && current.countGainableCards(player, "e") > 0; + }) + .setHiddenSkill(event.name).ai = function (target) { + var num = 1; + if (target.hasSkill("gzxiaoji")) num += 2.5; + if (target.isDamaged() && target.getEquip("baiyin")) num += 2.5; + if (target.hasSkill("xuanlve")) num += 2; + return num; + }; + "step 1"; + if (result.bool) { + event.target1 = result.targets[0]; + player.logSkill("xindiaodu", event.target1); + player.line(event.target1, "xindiaodu"); + player.gainPlayerCard(event.target1, "e", true); + } else event.finish(); + "step 2"; + if (result.bool && player.getCards("h").includes(result.cards[0])) { + event.card = result.cards[0]; + player + .chooseTarget("是否将" + get.translation(event.card) + "交给一名其他角色?", function (card, player, current) { + return current != player && current != _status.event.target1 && lib.skill.xindiaodu.isFriendOf(current, player); + }) + .set("target1", event.target1); + } else event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.give(card, target); + } + }, + }, + //夏侯玄 + olhuanfu: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (player == event.player && !event.isFirstTarget) return false; + if (event.olhuanfu_map && event.olhuanfu_map[player.playerid]) return false; + return player.maxHp > 0 && player.countCards("he") > 0; + }, + shaRelated: true, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard("he", [1, player.maxHp], get.prompt("olhuanfu"), "通过弃牌,预测" + (player == trigger.player ? "你" : get.translation(trigger.player)) + "使用的" + get.translation(trigger.card) + "能造成多少伤害。如果弃置的牌数等于总伤害,则你摸两倍的牌。") + .set( + "predict", + (function () { + var target = trigger.target; + if (player == target) { + if (trigger.targets.length > 1 || player.hasShan() || get.effect(player, trigger.card, trigger.player, player) == 0) return 0; + } else { + var target = trigger.target; + if ( + trigger.targets.length > 1 || + target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return 0; + } + var num = trigger.getParent().baseDamage; + var map = trigger.getParent().customArgs, + id = target.playerid; + if (map[id]) { + if (typeof map[id].baseDamage == "number") num = map[id].baseDamage; + if (typeof map[id].extraDamage == "number") num += map[id].extraDamage; + } + if ( + target.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: trigger.card, + }) + ) + num = 1; + return num; + })() + ) + .set("ai", function (card) { + var num = _status.event.predict, + player = _status.event.player; + if (ui.selected.cards.length >= num) return 0; + if ( + player.countCards("he", function (card) { + return get.value(card) < 6 + num; + }) < num + ) + return 0; + return 6 + num - get.value(card); + }).logSkill = "olhuanfu"; + "step 1"; + if (result.bool) { + player.addTempSkill("olhuanfu_lottery"); + var evt = trigger.getParent(); + if (!evt.olhuanfu_map) evt.olhuanfu_map = {}; + evt.olhuanfu_map[player.playerid] = result.cards.length; + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && target.hp > 0 && current < 0 && target.countCards("he") > 0) return 0.7; + }, + }, + }, + subSkill: { + lottery: { + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + var map = event.olhuanfu_map; + if (!map || !map[player.playerid]) return false; + var num = 0; + event.player.getHistory("sourceDamage", function (evt) { + if (evt.card == event.card && evt.getParent().type == "card") num += evt.num; + }); + return num == map[player.playerid]; + }, + content: function () { + player.draw(2 * trigger.olhuanfu_map[player.playerid]); + }, + }, + }, + }, + olqingyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "olqingyi"); + }, "he") && game.hasPlayer(current => lib.skill.olqingyi.filterTarget(null, player, current)) + ); + }, + selectTarget: [1, 2], + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; + }, + multitarget: true, + multiline: true, + content: function () { + "step 0"; + var list = [player]; + list.addArray(targets); + list.sortBySeat(); + event.list = list; + for (var target of event.list) { + if ( + !target.hasCard(function (card) { + return lib.filter.cardDiscardable(card, target, "olqingyi"); + }, "he") + ) { + event.finish(); + break; + } + } + "step 1"; + player + .chooseCardOL(event.list, "he", true, "清议:选择弃置一张牌", function (card, player) { + return lib.filter.cardDiscardable(card, player, "olqingyi"); + }) + .set("ai", get.unuseful); + "step 2"; + var lose_list = [], + cards = []; + for (var i = 0; i < result.length; i++) { + var current = event.list[i], + card = result[i].cards[0]; + lose_list.push([current, result[i].cards]); + cards.push(card); + } + var type = get.type2(cards[0]); + for (var i = 1; i < cards.length; i++) { + if (get.type2(cards[i]) != type) event.finish(); + } + game.loseAsync({ + lose_list: lose_list, + }).setContent("discardMultiple"); + "step 3"; + event.goto(1); + for (var target of event.list) { + if ( + !target.hasCard(function (card) { + return lib.filter.cardDiscardable(card, target, "olqingyi"); + }, "he") + ) { + event.finish(); + break; + } + } + }, + ai: { + threaten: 1.2, + order: 9.1, + result: { + player: function (player) { + let min = 24; + player.countCards("he", function (card) { + min = Math.min(min, get.value(card)); + }); + if (ui.selected.targets.length == 1) return 1 - min / 6; + return 0.75 - min / 48; + }, + target: function (player, target) { + if ( + target.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "olqingyi"); + }, "he") + ) + return -1; + return 0; + }, + }, + }, + group: "olqingyi_gain", + subSkill: { + gain: { + audio: "olqingyi", + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + var history = player.getHistory("useSkill", evt => evt.skill == "olqingyi"); + if (!history.length) return false; + var color = false; + for (var evt of history) { + var list = [player]; + list.addArray(evt.targets); + for (var target of list) { + target.getHistory("lose", function (evtx) { + if (color === true || evtx.getParent(2).name != "olqingyi") return false; + for (var card of evtx.cards) { + if (color === true || get.position(card, true) != "d") continue; + var color2 = get.color(card, false); + if (!color) color = color2; + else if (color != color2) color = true; + } + }); + if (color === true) return true; + } + } + return false; + }, + content: function () { + "step 0"; + var history = player.getHistory("useSkill", evt => evt.skill == "olqingyi"), + cards = []; + for (var evt of history) { + var list = [player]; + list.addArray(evt.targets); + for (var target of list) { + target.getHistory("lose", function (evtx) { + if (evtx.getParent(2).name != "olqingyi") return false; + for (var card of evtx.cards) { + if (get.position(card, true) == "d") cards.add(card); + } + }); + } + } + player + .chooseButton(["清议:选择获得两张异色牌", cards], 2) + .set("filterButton", function (button) { + if (!ui.selected.buttons.length) return true; + return get.color(button.link, false) != get.color(ui.selected.buttons[0].link, false); + }) + .set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + "step 1"; + if (result.bool) { + player.logSkill("olqingyi_gain"); + player.gain(result.links, "gain2"); + } + }, + }, + }, + }, + olzeyue: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + limited: true, + skillAnimation: true, + animationColor: "water", + direct: true, + filter: function (event, player) { + var sources = [], + history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + if (i < history.length - 1 && history[i].isMe) break; + for (var evt of history[i].damage) { + if (evt.source && evt.source != player && evt.source.isIn()) sources.add(evt.source); + } + } + for (var source of sources) { + var skills = source.getStockSkills("一!", "五!"); + for (var skill of skills) { + var info = get.info(skill); + if (info && !info.charlotte && !get.is.locked(skill, source) && source.hasSkill(skill, null, null, false)) return true; + } + } + return false; + }, + content: function () { + "step 0"; + var sources = [], + history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + if (i < history.length - 1 && history[i].isMe) break; + for (var evt of history[i].damage) { + if (evt.source && evt.source != player && evt.source.isIn()) sources.add(evt.source); + } + } + sources = sources.filter(function (source) { + var skills = source.getStockSkills("一!", "五!"); + for (var skill of skills) { + var info = get.info(skill); + if (info && !info.charlotte && !get.is.locked(skill, source) && source.hasSkill(skill, null, null, false)) return true; + } + return false; + }); + player + .chooseTarget(get.prompt("olzeyue"), "令一名可选角色的一个非锁定技失效", function (card, player, target) { + return _status.event.sources.includes(target); + }) + .set("sources", sources) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att >= 0) return 0; + return get.threaten(target, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olzeyue", target); + player.awakenSkill("olzeyue"); + event.target = target; + var skills = target.getStockSkills("一!", "五!"); + skills = skills.filter(function (skill) { + var info = get.info(skill); + if (info && !info.charlotte && !get.is.locked(skill, target) && target.hasSkill(skill, null, null, false)) return true; + }); + if (skills.length == 1) event._result = { control: skills[0] }; + else player.chooseControl(skills).set("prompt", "令" + get.translation(target) + "的一个技能失效"); + } else event.finish(); + "step 2"; + var skill = result.control; + target.disableSkill("olzeyue_" + player.playerid, skill); + target.storage["olzeyue_" + player.playerid] = true; + player.addSkill("olzeyue_round"); + player.markAuto("olzeyue_round", [target]); + if (!player.storage.olzeyue_map) player.storage.olzeyue_map = {}; + player.storage.olzeyue_map[target.playerid] = 0; + game.log(target, "的技能", "#g【" + get.translation(skill) + "】", "被失效了"); + }, + ai: { threaten: 3 }, + subSkill: { + round: { + trigger: { global: "roundStart" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + var storage = player.getStorage("olzeyue_round"); + for (var source of storage) { + if (source.isIn() && source.canUse("sha", player, false)) return true; + } + return false; + }, + content: function () { + "step 0"; + event.targets = player.storage.olzeyue_round.slice(0).sortBySeat(); + event.target = event.targets.shift(); + event.forceDie = true; + "step 1"; + var map = player.storage.olzeyue_map; + if (target.storage["olzeyue_" + player.playerid]) map[target.playerid]++; + event.num = map[target.playerid] - 1; + if (event.num <= 0) event.finish(); + "step 2"; + event.num--; + target.useCard(player, { name: "sha", isCard: true }, false, "olzeyue_round"); + "step 3"; + var key = "olzeyue_" + player.playerid; + if ( + target.storage[key] && + player.hasHistory("damage", function (evt) { + return evt.card.name == "sha" && evt.getParent().type == "card" && evt.getParent(3) == event; + }) + ) { + for (var skill in target.disabledSkills) { + if (target.disabledSkills[skill].includes(key)) game.log(target, "恢复了技能", "#g【" + get.translation(skill) + "】"); + } + delete target.storage[key]; + target.enableSkill(key); + } + if (event.num > 0 && player.isIn() && target.isIn() && target.canUse("sha", player, false)) { + event.goto(2); + } else if (event.targets.length > 0) { + event.target = event.targets.shift(); + event.goto(1); + } + }, + }, + }, + }, + //邓忠 + dzkanpo: { + audio: 2, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return event.getParent().type == "card" && event.card && event.card.name == "sha" && event.player.countCards("he") > 0; + }, + logTarget: "player", + content: function () { + var suit = get.suit(trigger.card); + var next = player.gainPlayerCard(trigger.player, "h", "visible"); + next.set("suit", suit); + next.set("filterButton", function (button) { + var evt = _status.event; + return get.suit(button.link, evt.target) == evt.suit; + }); + }, + group: "dzkanpo_sha", + subSkill: { + sha: { + enable: "chooseToUse", + usable: 1, + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + return player.countCards("hs") > 0; + }, + filterCard: true, + position: "hs", + prompt: "将一张手牌当做【杀】使用", + check: function (card) { + return 6 - get.value(card); + }, + ai: { + respondSha: true, + skillTagFilter: function (player) { + if (player.getStat("skill").dzkanpo_sha) return false; + if (!player.countCards("hs")) return false; + }, + }, + }, + }, + }, + dzgengzhan: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], + }, + usable: 1, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false || player == _status.currentPhase || !event.isPhaseUsing()) return false; + for (var card of event.cards) { + if (get.position(card, true) == "d" && get.name(card, event.hs && event.hs.includes(card) ? event.player : false) == "sha") return true; + } + }, + direct: true, + content: function () { + "step 0"; + var cards = trigger.cards.filter(function (card) { + return get.position(card, true) == "d" && get.name(card, trigger.hs && trigger.hs.includes(card) ? trigger.player : false) == "sha"; + }); + player.chooseButton(["是否发动【更战】获得一张杀?", cards]).set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + "step 1"; + if (result.bool) { + player.logSkill("dzgengzhan"); + player.gain(result.links, "gain2"); + } else player.storage.counttrigger.dzgengzhan--; + }, + group: "dzgengzhan_add", + subSkill: { + add: { + audio: "dzgengzhan", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + player != event.player && + !event.player.hasHistory("useCard", function (evt) { + return evt.card.name == "sha"; + }) + ); + }, + logTarget: "player", + content: function () { + player.addTempSkill("dzgengzhan_effect", { player: "phaseUseAfter" }); + player.addMark("dzgengzhan_effect", 1, false); + game.delayx(); + }, + }, + effect: { + onremove: true, + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("dzgengzhan_effect"); + }, + }, + intro: { content: "使用杀的次数上限+#" }, + }, + }, + }, + //王衍 + yangkuang: { + audio: 2, + trigger: { player: "recoverEnd" }, + filter: function (event, player) { + return player.isHealthy(); + }, + logTarget: function (event, player) { + return _status.currentPhase || player; + }, + check: function (event, player) { + var target = _status.currentPhase || player; + if (get.attitude(player, target) > 0) return true; + if (player.countCards("h") > target.countCards("h")) return true; + if (!target.getCardUsable("sha")) return true; + return false; + }, + content: function () { + "step 0"; + player.chooseUseTarget("jiu", true); + "step 1"; + var target = _status.currentPhase; + if (target) target.draw("nodelay"); + player.draw(); + }, + }, + cihuang: { + audio: 2, + trigger: { + global: ["eventNeutralized", "shaMiss"], + }, + direct: true, + filter: function (event, player) { + if (event.player != _status.currentPhase || !event.targets || event.targets.length != 1 || event.type != "card" || !player.countCards("he")) return false; + return lib.skill.cihuang.getList(player, event.player, true); + }, + getList: function (player, target, bool) { + var natures = lib.inpile_nature.slice(0); + var tricks = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if (!info || info.type != "trick" || info.notarget || (info.selectTarget && info.selectTarget != 1 && (info.selectTarget != -1 || !info.toself))) continue; + tricks.push(name); + } + var history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + var info = history[i]; + for (var evt of info.useCard) { + var name = evt.card.name; + if (name == "sha") { + if (evt.card.nature) natures.remove(evt.card.nature); + } else tricks.remove(name); + } + if (info.isRound) break; + } + var vcards = []; + for (var i of natures) { + if ( + player.canUse( + { + name: "sha", + nature: i, + isCard: true, + }, + target + ) + ) { + if (bool) return true; + else vcards.push(["基本", "", "sha", i]); + } + } + for (var i of tricks) { + if ( + player.canUse( + { + name: i, + isCard: true, + }, + target + ) + ) { + if (bool) return true; + else vcards.push(["锦囊", "", i]); + } + } + if (bool) return false; + return vcards; + }, + content: function () { + "step 0"; + var target = trigger.player; + var list = lib.skill.cihuang.getList(player, target); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + player.chooseButton([get.prompt("cihuang", target), '
    将一张牌当以下的一张牌对' + get.translation(target) + "使用
    ", [list, "vcard"]]).set("ai", function (button) { + var card = { + name: button.link[2], + nature: button.link[3], + storage: { cihuang: true }, + }, + player = _status.event.player, + target = _status.event.getTrigger().player; + return get.effect(target, card, player, player); + }); + "step 1"; + if (result.bool) { + var card = { + name: result.links[0][2], + nature: result.links[0][3], + storage: { cihuang: true }, + }; + event.card = card; + player + .chooseCard("hes", "雌黄:将一张牌当" + get.translation(card) + "对" + get.translation(trigger.player) + "使用", function (card, player) { + return player.canUse(get.autoViewAs(_status.event.getParent().card, [card]), _status.event.target, false); + }) + .set("target", trigger.player) + .set("ai", function (card) { + if (get.effect(_status.event.target, get.autoViewAs(_status.event.getParent().card, [card]), player) <= 0) return false; + return 6 - get.value(card); + }); + } else event._result = { bool: false }; + "step 2"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (result.bool) { + player.useCard(get.autoViewAs(event.card, result.cards), result.cards, false, trigger.player, "cihuang").oncard = function (card, player) { + _status.event.directHit.addArray(game.filterPlayer()); + }; + } + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg && arg.card && arg.card.storage && arg.card.storage.cihuang; + }, + }, + }, + sanku: { + audio: 2, + trigger: { player: "dying" }, + forced: true, + group: "sanku_nogain", + content: function () { + "step 0"; + player.loseMaxHp(); + "step 1"; + var num = player.maxHp - player.hp; + if (num > 0) player.recover(num); + }, + ai: { halfneg: true }, + subSkill: { + nogain: { + audio: "sanku", + trigger: { player: "gainMaxHpBegin" }, + forced: true, + content: function () { + trigger.cancel(); + }, + }, + }, + }, + //霍峻 + qiongshou: { + audio: 2, + trigger: { + player: "enterGame", + global: "phaseBefore", + }, + forced: true, + filter: function (event, player) { + if (event.name == "phase" && game.phaseNumber != 0) return false; + return player.hasEnabledSlot(); + }, + content: function () { + var list = []; + for (var i = 1; i < 6; i++) { + for (var j = 0; j < player.countEnabledSlot(i); j++) { + list.push(i); + } + } + player.disableEquip(list); + player.draw(4); + }, + mod: { + maxHandcard: function (player, num) { + return num + 4; + }, + }, + ai: { + halfneg: true, + combo: "fenrui", + threaten: 3.2, + }, + }, + fenrui: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + onremove: true, + filter: function (event, player) { + var es = player.countCards("e"); + return ( + (player.hasDisabledSlot() && player.countCards("he") > 0) || + (!player.storage.fenrui && + game.hasPlayer(function (current) { + return current != player && current.countCards("e") < es; + })) + ); + }, + content: function () { + "step 0"; + if (player.hasDisabledSlot() && player.countCards("he") > 0) { + var str = "弃置一张牌,恢复一个装备栏并使用一张对应装备牌"; + player.chooseToDiscard("he", get.prompt("fenrui"), str).set("ai", function (card) { + return 7 - get.value(card); + }).logSkill = "fenrui"; + } else event.goto(3); + "step 1"; + if (result.bool) { + player.chooseToEnable().set("ai", function () { + var player = _status.event.player; + var list = [2, 5, 1, 3, 4]; + for (var i of list) { + if (player.hasDisabledSlot(i)) return "equip" + i; + } + }); + } else { + var es = player.countCards("e"); + if ( + player.storage.fenrui || + !game.hasPlayer(function (current) { + return current != player && current.countCards("e") < es; + }) + ) + event.finish(); + else event.goto(3); + } + "step 2"; + var func = function (card) { + return get.subtype(card, false) == result.control && player.canUse(card, player) && !get.cardtag(card, "gifts"); + }; + var card = get.discardPile(func) || get.cardPile2(func); + if (card) { + player.chooseUseTarget(card, true, "nopopup"); + } + if (player.storage.fenrui) event.finish(); + "step 3"; + var es = player.countCards("e"); + if ( + es > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("e") < es; + }) + ) { + player + .chooseTarget("是否对一名装备数小于你的角色造成伤害?", "你可以选择一名装备区内牌数小于你的角色,并对其造成X点伤害(X为你与其装备区牌数之差),但此效果每局游戏内仅限一次。", function (card, player, target) { + return player != target && player.countCards("e") > target.countCards("e"); + }) + .set("ai", function (target) { + var player = _status.event.player; + var num = player.countCards("e") - target.countCards("e"); + if (get.attitude(player, target) >= 0) return 0; + if (num >= Math.min(2, player.hp, target.hp)) return get.damageEffect(target, player, player); + return 0; + }); + } else event.finish(); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("fenrui_animate", target); + player.storage.fenrui = true; + player.unmarkSkill("fenrui"); + game.delayx(); + target.damage(player.countCards("e") - target.countCards("e")); + } + }, + group: "fenrui_animate", + mark: true, + intro: { content: "王炸尚未使用" }, + subSkill: { + animate: { + skillAnimation: true, + animationColor: "fire", + }, + }, + }, + //曹宪曹华 + huamu: { + audio: 6, + trigger: { player: "useCardAfter" }, + locked: false, + filter: function (event, player) { + var color = get.color(event.card); + if (color == "none") return false; + if ( + !player.hasHistory("lose", function (evt) { + return evt.hs.length > 0 && evt.getParent() == event; + }) || + !event.cards.filterInD("oe").length + ) + return false; + var history = game.getGlobalHistory("useCard"); + var index = history.indexOf(event); + if (index < 1) return false; + var evt = history[index - 1], + color2 = get.color(evt.card); + return color != color2 && color2 != "none"; + }, + prompt2: event => "将" + get.translation(event.cards.filterInD("oe")) + "置于武将牌上", + check: function (event, player) { + if ( + !game.hasPlayer(function (current) { + return current.hasSkill("qianmeng", null, null, false) && get.attitude(player, current) > 0; + }) + ) + return false; + var cards = event.cards.filterInD("e"); + if (!cards.length) return true; + var card = cards[0]; + if (get.owner(card) == player) { + if (get.value(card, player) <= 0) return true; + var subtype = get.subtype(card); + if ( + player.hasCard("hs", function (card) { + return get.subtype(card) == subtype && player.canUse(card, player) && get.effect(player, card, player, player) > 0; + }) + ) + return true; + } + return false; + }, + content: function () { + var cards = trigger.cards.filterInD("oe"); + player.addToExpansion(cards, "gain2").gaintag.add("huamu"); + }, + ai: { + reverseOrder: true, + combo: "qianmeng", + }, + mod: { + aiOrder: function (player, card, num) { + if (typeof card == "object") { + var history = game.getGlobalHistory("useCard"); + if (!history.length) return; + var evt = history[history.length - 1]; + if (evt && evt.card && get.color(evt.card) != "none" && get.color(card) != "none" && get.color(evt.card) != get.color(card)) { + return num + 4; + } + } + }, + }, + marktext: "木", + intro: { + name: "灵杉&玉树", + markcount: function (storage, player) { + var red = [], + black = []; + var cards = player.getExpansions("huamu"); + for (var i of cards) { + var color = get.color(i, false); + (color == "red" ? red : black).push(i); + } + return "" + black.length + "/" + red.length; + }, + content: "expansion", + mark: function (dialog, storage, player) { + var red = [], + black = []; + var cards = player.getExpansions("huamu"); + for (var i of cards) { + var color = get.color(i, false); + (color == "red" ? red : black).push(i); + } + if (black.length) { + dialog.addText("灵杉"); + dialog.addSmall(black); + } + if (red.length) { + dialog.addText("玉树"); + dialog.addSmall(red); + } + }, + }, + }, + qianmeng: { + audio: 2, + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + if (event.name == "addToExpansion") { + if (event.gaintag.includes("huamu")) { + var cards = event.player.getExpansions("huamu"), + red = cards.filter(function (i) { + return get.color(i, false) == "red"; + }); + if (cards.length == red.length || red.length == 0 || cards.length == red.length * 2) return true; + } + } + if (event.name == "lose" && event.getlx !== false) { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("huamu")) { + var cards = event.player.getExpansions("huamu"), + red = cards.filter(function (i) { + return get.color(i, false) == "red"; + }); + return cards.length == red.length || red.length == 0 || cards.length == red.length / 2; + } + } + return false; + } + return ( + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" || event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("huamu")) { + var cards = evt.player.getExpansions("huamu"), + red = cards.filter(function (i) { + return get.color(i, false) == "red"; + }); + return cards.length == red.length || red.length == 0 || cards.length == red.length / 2; + } + } + return false; + }).length > 0 + ); + }, + forced: true, + content: function () { + player.draw(); + }, + ai: { combo: "huamu" }, + }, + liangyuan: { + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (name == "tao") { + return ( + !player.hasSkill("liangyuan_tao", null, null, false) && + game.hasPlayer(function (current) { + var storage = current.getExpansions("huamu"); + return ( + storage.length > 0 && + storage.filter(function (i) { + return get.color(i, false) == "red"; + }).length > 0 + ); + }) + ); + } else if (name == "jiu") { + return ( + !player.hasSkill("liangyuan_jiu", null, null, false) && + game.hasPlayer(function (current) { + var storage = current.getExpansions("huamu"); + return ( + storage.length > 0 && + storage.filter(function (i) { + return get.color(i, false) == "black"; + }).length > 0 + ); + }) + ); + } + return false; + }, + filter: function (event, player) { + if (event.type == "wuxie") return false; + if ( + !player.hasSkill("liangyuan_tao", null, null, false) && + event.filterCard(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && + game.hasPlayer(function (current) { + var storage = current.getExpansions("huamu"); + return ( + storage.length > 0 && + storage.filter(function (i) { + return get.color(i, false) == "red"; + }).length > 0 + ); + }) + ) + return true; + if ( + !player.hasSkill("liangyuan_jiu", null, null, false) && + event.filterCard(get.autoViewAs({ name: "jiu" }, "unsure"), player, event) && + game.hasPlayer(function (current) { + var storage = current.getExpansions("huamu"); + return ( + storage.length > 0 && + storage.filter(function (i) { + return get.color(i, false) == "black"; + }).length > 0 + ); + }) + ) + return true; + return false; + }, + chooseButton: { + dialog: function () { + return ui.create.dialog("良缘", [["tao", "jiu"], "vcard"], "hidden"); + }, + filter: function (button, player) { + var evt = _status.event.getParent(); + var name = button.link[2], + color = name == "tao" ? "red" : "black"; + if (player.hasSkill("liangyuan_" + name, null, null, false)) return false; + var cards = []; + game.countPlayer(function (current) { + cards.addArray( + current.getExpansions("huamu").filter(function (i) { + return get.color(i, false) == color; + }) + ); + }); + if (!cards.length) return false; + var card = get.autoViewAs({ name: name }, cards); + return evt.filterCard(card, player, evt); + }, + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; + var name = button.link[2], + color = name == "tao" ? "red" : "black"; + var cards = []; + game.countPlayer(function (current) { + cards.addArray( + current.getExpansions("huamu").filter(function (i) { + return get.color(i, false) == color; + }) + ); + }); + var card = get.autoViewAs({ name: name }, cards); + return player.getUseValue(card, null, true); + }, + backup: function (links, player) { + var name = links[0][2], + color = name == "tao" ? "red" : "black"; + var cards = []; + game.countPlayer(function (current) { + cards.addArray( + current.getExpansions("huamu").filter(function (i) { + return get.color(i, false) == color; + }) + ); + }); + if (!cards.length) return false; + var card = get.autoViewAs({ name: name }, cards); + return { + viewAs: card, + color: color, + selectCard: -1, + filterCard: () => false, + precontent: function () { + player.addTempSkill("liangyuan_" + event.result.card.name, "roundStart"); + player.logSkill("liangyuan"); + var list = [], + color = lib.skill.liangyuan_backup.color; + var cards = []; + game.countPlayer(function (current) { + var cardsx = current.getExpansions("huamu").filter(function (i) { + return get.color(i, false) == color; + }); + if (cardsx.length) { + cards.addArray(cardsx); + list.push([current, cardsx]); + current.$throw(cardsx); + game.log(current, "将", cardsx, "化作“" + (color == "black" ? "灵杉" : "玉树") + "”良缘"); + } + }); + event.result.cards = cards; + delete event.result.skill; + event.result._apply_args = { throw: false }; + game.loseAsync({ + lose_list: list, + }).setContent("chooseToCompareLose"); + }, + }; + }, + prompt: function (links, player) { + var name = links[0][2], + color = name == "tao" ? "玉树" : "灵杉"; + return "将场上所有的“" + color + "”当做【" + get.translation(name) + "】使用"; + }, + }, + subSkill: { + tao: { charlotte: true }, + jiu: { charlotte: true }, + }, + ai: { + order: function (item, player) { + if (!player) player = _status.event.player; + return ( + get.order({ + name: lib.skill.liangyuan.hiddenCard(player, "jiu") ? "jiu" : "tao", + }) + 4 + ); + }, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + combo: "huamu", + threaten: 3, + }, + }, + jisi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "metal", + filter: function (event, player) { + var skills = player.getStockSkills("一!", "五!").filter(function (skill) { + if (skill == "jisi") return false; + var info = get.info(skill); + return info && !info.charlotte; + }); + var history = player.getAllHistory("useSkill"); + for (var i of history) { + if (skills.includes(i.sourceSkill) || skills.includes(i.skill)) return true; + } + return false; + }, + content: function () { + "step 0"; + var skills2 = []; + var skills = player.getStockSkills("只!", "因!").filter(function (skill) { + if (skill == "jisi") return false; + var info = get.info(skill); + return info && !info.charlotte; + }); + var history = player.getAllHistory("useSkill"); + for (var i of history) { + if (skills.includes(i.sourceSkill)) skills2.add(i.sourceSkill); + if (skills.includes(i.skill)) skills2.add(i.skill); + if (skills.length == skills2.length) break; + } + event.skills2 = skills2; + var str = "令一名其他角色获得"; + for (var i = 0; i < skills2.length; i++) { + str += "〖" + get.translation(skills2[i]) + "〗"; + if (i != skills2.length - 1) str += ";"; + } + if (skills2.length > 1) str += "中的一个技能"; + str += "然后你"; + if (player.countCards("h") > 0) str += "弃置所有手牌,并"; + str += "视为对其使用一张【杀】"; + player + .chooseTarget(get.prompt("jisi"), str, lib.filter.notMe) + .set("ai", function (target) { + if (!_status.event.goon) return false; + var att = get.attitude(player, target); + if (att < 4) return false; + var eff = get.effect(target, { name: "sha", isCard: true }, player, player); + if (eff >= 0) return att + eff; + if (target.hp <= 2) return false; + return att / Math.max(1, -eff); + }) + .set( + "goon", + (function () { + if (player.hasUnknown() || player.identity == "nei") return false; + var hs = player.getCards("h"); + if (!hs.length || get.value(hs, player) <= 9 - player.hp) return true; + return false; + })() + ); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jisi", target); + player.awakenSkill("jisi"); + var list = event.skills2; + if (list.length == 0) event._result = { control: list[0] }; + player + .chooseControl(list) + .set("prompt", "令" + get.translation(target) + "获得一个技能") + .set("ai", () => _status.event.choice) + .set("choice", list.includes("qianmeng") ? "qianmeng" : list.randomGet()); + } else event.finish(); + "step 2"; + target.addSkills(result.control); + "step 3"; + var num = player.countCards("h"); + if (num > 0) player.chooseToDiscard("h", num, true); + "step 4"; + if (player.canUse("sha", target, false)) + player.useCard( + false, + target, + { + name: "sha", + isCard: true, + }, + "noai" + ); + }, + }, + //周处 + shanduan: { + audio: 2, + init: function (player, name) { + player.storage[name] = [1, 2, 3, 4]; + }, + trigger: { player: "damageEnd" }, + filter: (event, player) => player != _status.currentPhase, + forced: true, + locked: false, + content: function () { + if (!player.storage.shanduan) player.storage.shanduan = [1, 2, 3, 4]; + var list = player.storage.shanduan; + for (var i = 0; i < list.length; i++) { + var num = list[i], + add = true; + for (var j = 0; j < list.length; j++) { + if (list[j] < num) { + add = false; + break; + } + } + if (add) { + list[i]++; + break; + } + } + game.delayx(); + }, + group: ["shanduan_draw", "shanduan_use", "shanduan_discard"], + ai: { + notemp: true, + threaten: 3.6, + }, + subSkill: { + draw: { + audio: "shanduan", + trigger: { player: "phaseDrawBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + var list = event.getParent()._shanduan; + return !list || list.length > 0; + }, + content: function () { + "step 0"; + var list = trigger.getParent()._shanduan; + if (!list) { + trigger.getParent()._shanduan = (player.storage.shanduan || [1, 2, 3, 4]).slice(0); + player.storage.shanduan = [1, 2, 3, 4]; + } + "step 1"; + var list = trigger.getParent()._shanduan; + if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl(list) + .set("prompt", "善断:为摸牌阶段的摸牌数分配一个数值") + .set("choice", list.indexOf(Math.max.apply(Math, list))) + .set("ai", () => _status.event.choice); + "step 2"; + var list = trigger.getParent()._shanduan; + var num = list[result.index]; + trigger.num = num; + list.remove(num); + game.log(player, "给", "#g摸牌阶段的摸牌数", "分配的数值是", "#y" + num); + }, + }, + use: { + audio: "shanduan", + trigger: { player: "phaseUseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + var list = event.getParent()._shanduan; + return !list || list.length > 0; + }, + content: function () { + "step 0"; + var list = trigger.getParent()._shanduan; + if (!list) { + trigger.getParent()._shanduan = (player.storage.shanduan || [1, 2, 3, 4]).slice(0); + player.storage.shanduan = [1, 2, 3, 4]; + } + "step 1"; + var list = trigger.getParent()._shanduan; + if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl(list) + .set("prompt", "善断:为攻击范围基数分配一个数值") + .set("list", list) + .set("ai", function () { + var player = _status.event.player, + list = _status.event.list, + card = { name: "sha" }; + if (player.hasSha() && player.hasValueTarget(card, false, true) && !player.hasValueTarget(card, null, true)) { + var range = 1; + var equips = player.getCards("e"); + for (var i = 0; i < equips.length; i++) { + var info = get.info(equips[i], false).distance; + if (!info) continue; + if (info.attackFrom) { + range -= info.attackFrom; + } + } + var listx = list.slice(0).sort(); + for (var i of listx) { + if (i <= range) continue; + if ( + game.hasPlayer(function (current) { + var distance = get.distance(player, current, "attack"); + if (distance > 1 && distance <= i - range) return true; + return false; + }) + ) + return list.indexOf(i); + } + } + return list.indexOf(Math.min.apply(Math, list)); + }); + "step 2"; + var list = trigger.getParent()._shanduan; + var num = list[result.index]; + if (!player.storage.shanduan_effect) player.storage.shanduan_effect = {}; + player.storage.shanduan_effect.range = num; + player.addTempSkill("shanduan_effect"); + list.remove(num); + game.log(player, "给", "#g攻击范围的基数", "分配的数值是", "#y" + num); + if (list.length == 0) event.finish(); + else if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl(list) + .set("prompt", "为使用【杀】的次数上限分配一个数值") + .set("list", list) + .set("ai", function () { + var player = _status.event.player, + list = _status.event.list; + var sha = player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card, null, true); + }); + var max = player.getCardUsable("sha"); + if (sha <= max) { + var listx = list.slice(0).sort(); + for (var i of listx) { + if (max + i >= sha) return list.indexOf(i); + } + return list.indexOf(Math.max.apply(Math, list)); + } + return list.indexOf(Math.min.apply(Math, list)); + }); + "step 3"; + var list = trigger.getParent()._shanduan; + var num = list[result.index]; + if (!player.storage.shanduan_effect) player.storage.shanduan_effect = {}; + player.storage.shanduan_effect.sha = num; + game.log(player, "给", "#g使用【杀】的次数上限", "分配的数值是", "#y" + num); + list.remove(num); + }, + }, + discard: { + audio: "shanduan", + trigger: { player: "phaseDiscardBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + var list = event.getParent()._shanduan; + return !list || list.length > 0; + }, + content: function () { + "step 0"; + var list = trigger.getParent()._shanduan; + if (!list) { + trigger.getParent()._shanduan = (player.storage.shanduan || [1, 2, 3, 4]).slice(0); + player.storage.shanduan = [1, 2, 3, 4]; + } + "step 1"; + var list = trigger.getParent()._shanduan; + if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl(list) + .set("prompt", "善断:为手牌上限基数分配一个数值") + .set("choice", list.indexOf(Math.max.apply(Math, list))) + .set("ai", () => _status.event.choice); + "step 2"; + var list = trigger.getParent()._shanduan; + var num = list[result.index]; + if (!player.storage.shanduan_effect) player.storage.shanduan_effect = {}; + player.storage.shanduan_effect.limit = num; + player.addTempSkill("shanduan_effect"); + list.remove(num); + game.log(player, "给", "#g手牌上限的基数", "分配的数值是", "#y" + num); + }, + }, + effect: { + charlotte: true, + onremove: true, + mod: { + attackRangeBase: function (player) { + var map = player.storage.shanduan_effect; + if (typeof map.range != "number") return; + var range = 1; + var equips = player.getCards("e", function (card) { + return !ui.selected.cards || !ui.selected.cards.includes(card); + }); + for (var i = 0; i < equips.length; i++) { + var info = get.info(equips[i], false).distance; + if (!info) continue; + if (info.attackFrom) { + range -= info.attackFrom; + } + } + return Math.max(range, map.range); + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") { + var map = player.storage.shanduan_effect; + if (typeof map.sha != "number") return; + return num - 1 + map.sha; + } + }, + maxHandcardBase: function (player, num) { + var map = player.storage.shanduan_effect; + if (typeof map.limit != "number") return; + return map.limit; + }, + }, + }, + }, + }, + yilie: { + audio: 2, + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (get.type(name) == "basic" && lib.inpile.includes(name) && !player.getStorage("yilie_count").includes(name)) { + var hs = player.getCards("hs"); + if (hs.length < 2) return false; + var bool = false, + map = {}; + for (var card of hs) { + var color = get.color(card); + if (!map[color]) map[color] = true; + else { + bool = true; + break; + } + } + return bool; + } + }, + filter: function (event, player) { + if (event.type == "wuxie") return false; + var list = player.getStorage("yilie_count"); + var hs = player.getCards("hs"); + if (hs.length < 2) return false; + var bool = false, + map = {}; + for (var card of hs) { + var color = get.color(card); + if (!map[color]) map[color] = true; + else { + bool = true; + break; + } + } + if (!bool) return false; + for (var name of lib.inpile) { + if (get.type(name) != "basic" || list.includes(name)) continue; + var card = { name }; + if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + var storage = player.getStorage("yilie_count"); + for (var i of lib.inpile) { + if (get.type(i) != "basic" || storage.includes(i)) continue; + var card = { name: i }; + if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) list.push(["基本", "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) list.push(["基本", "", i, j]); + } + } + } + return ui.create.dialog("义烈", [list, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player; + var evt = _status.event.getParent(); + var name = button.link[2], + card = { name: name, nature: button.link[3] }; + if (name == "shan") return 2; + if (evt.type == "dying") { + if (get.attitude(player, evt.dying) < 2) return 0; + if (name == "jiu") return 2.1; + return 1.9; + } + if (evt.type == "phase") { + if (button.link[2] == "jiu") { + if (player.getUseValue({ name: "jiu" }) <= 0) return 0; + var cards = player.getCards("hs", cardx => get.value(cardx) < 8); + cards.sort((a, b) => get.value(a) - get.value(b)); + if (cards.some(cardx => get.name(cardx) == "sha" && !cards.slice(0, 2).includes(cardx))) return player.getUseValue({ name: "jiu" }); + return 0; + } + return player.getUseValue(card) / 4; + } + return 1; + }, + backup: function (links, player) { + return { + audio: "yilie", + selectCard: 2, + filterCard: function (card, player) { + var color = get.color(card); + if (ui.selected.cards.length) return color == get.color(ui.selected.cards[0]); + return player.hasCard(function (cardx) { + return card != cardx && get.color(cardx) == color; + }, "hs"); + }, + position: "hs", + complexCard: true, + check: card => 8 - get.value(card), + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + }, + precontent: function () { + var name = event.result.card.name; + player.addTempSkill("yilie_count", "roundStart"); + player.markAuto("yilie_count", [name]); + }, + }; + }, + prompt: function (links, player) { + var name = links[0][2]; + var nature = links[0][3]; + return "将两张颜色相同的手牌当做" + (get.translation(nature) || "") + get.translation(name) + "使用"; + }, + }, + ai: { + order: function (item, player) { + if (player && _status.event.type == "phase") { + var add = false, + max = 0; + var names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("yilie_count").includes(name)); + if (names.includes("sha")) add = true; + names = names.map(namex => { + return { name: namex }; + }); + if (add) lib.inpile_nature.forEach(nature => names.push({ name: "sha", nature: nature })); + names.forEach(card => { + if (player.getUseValue(card) > 0) { + var temp = get.order(card); + if (card.name == "jiu") { + var cards = player.getCards("hs", cardx => get.value(cardx) < 8); + cards.sort((a, b) => get.value(a) - get.value(b)); + if (!cards.some(cardx => get.name(cardx) == "sha" && !cards.slice(0, 2).includes(cardx))) temp = 0; + } + if (temp > max) max = temp; + } + }); + if (max > 0) max -= 0.001; + return max; + } + return 0.5; + }, + respondShan: true, + respondSha: true, + fireAttack: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + var hs = player.getCards("hs"); + if (hs.length < 2) return false; + var bool = false, + map = {}; + for (var card of hs) { + var color = get.color(card); + if (!map[color]) map[color] = true; + else { + bool = true; + break; + } + } + if (!bool) return false; + var storage = player.storage.yilie_count; + var name; + switch (tag) { + case "respondShan": + name = "shan"; + break; + default: + name = "sha"; + break; + } + if (storage && storage.includes(name)) return false; + }, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { + count: { charlotte: true, onremove: true }, + backup: { audio: "yilie" }, + }, + }, + //赵俨 + tongxie: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("tongxie"), "选择至多两名其他角色作为“同协角色”", lib.filter.notMe, [0, 2]).set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var targets = result.targets; + targets.add(player); + player.logSkill("tongxie", targets); + player.addTempSkill("tongxie_effect", { player: "phaseBegin" }); + player.markAuto("tongxie_effect", targets); + var min = player.countCards("h"), + min_player = player; + for (var i of targets) { + if (i == player) continue; + var num = i.countCards("h"); + if (num < min) { + min = num; + min_player = i; + } else if (num == min) min_player = false; + } + if (min_player) min_player.draw(); + else game.delayx(); + } + }, + subSkill: { + effect: { + audio: "tongxie", + charlotte: true, + trigger: { global: "useCardAfter" }, + onremove: true, + forced: true, + popup: false, + filter: function (event, player) { + if (event.card.name != "sha" || event.targets.length != 1 || !event.targets[0].isIn()) return false; + if (event.getParent(2).name == "tongxie_effect") return false; + var list = player.getStorage("tongxie_effect"), + target = event.targets[0]; + if (!list.includes(event.player)) return false; + for (var i of list) { + if (i == event.player || !i.isIn()) continue; + if (!i.canUse("sha", target, false)) continue; + if (_status.connectMode && i.countCards("hs") > 0) return true; + if (i.hasSha()) return true; + } + return false; + }, + content: function () { + "step 0"; + event.targets = player + .getStorage("tongxie_effect") + .filter(function (i) { + return i !== trigger.player; + }) + .sortBySeat(); + event.target = trigger.targets[0]; + "step 1"; + var current = targets.shift(); + if (current.isIn() && target.isIn() && current.canUse("sha", target, false) && (_status.connectMode || current.hasSha())) { + current + .chooseToUse( + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + "同协:是否对" + get.translation(target) + "使用一张杀?" + ) + .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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", target) + .set("logSkill", "tongxie_effect") + .set("addCount", false); + if (targets.length > 0) event.redo(); + } + }, + group: ["tongxie_damage", "tongxie_count"], + }, + damage: { + audio: "tongxie", + charlotte: true, + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + var list = player.getStorage("tongxie_effect"); + if (!list.includes(event.player)) return false; + for (var i of list) { + if (i != event.player && i.isIn() && !i.hasSkill("tongxie_count2", null, null, false)) return true; + } + return false; + }, + forced: true, + popup: false, + content: function () { + "step 0"; + event.targets = player + .getStorage("tongxie_effect") + .filter(function (i) { + return i != trigger.player && i.isIn() && !i.hasSkill("tongxie_count2", null, null, false); + }) + .sortBySeat(); + event.num = 0; + "step 1"; + var target = targets[num]; + event.num++; + event.target = target; + target.chooseBool("同协:是否为" + get.translation(trigger.player) + "阻挡伤害?", "失去1点体力,防止" + get.translation(trigger.player) + "即将受到的" + get.cnNumber(trigger.num) + "点伤害").set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + var trigger = _status.event.getTrigger(); + var eff1 = get.damageEffect(target, trigger.source, player, trigger.nature); + if (trigger.num > 1) eff1 = Math.min(-1, eff1) * trigger.num; + var eff2 = get.effect(player, { name: "losehp" }, player, player); + return eff2 > eff1; + }); + "step 2"; + if (result.bool) { + target.logSkill("tongxie_damage", trigger.player); + trigger.cancel(); + target.loseHp(); + } else if (num < targets.length) event.goto(1); + }, + }, + count: { + trigger: { global: "loseHpEnd" }, + charlotte: true, + forced: true, + firstDo: true, + popup: false, + silent: true, + filter: function (event, player) { + return player.getStorage("tongxie_effect").includes(event.player); + }, + content: function () { + trigger.player.addTempSkill("tongxie_count2"); + }, + }, + count2: { charlotte: true }, + }, + }, + //群马超 + olzhuiji: { + mod: { + globalFrom: function (from, to) { + if (from.hp >= to.hp) return -Infinity; + }, + }, + trigger: { player: "useCardToPlayered" }, + shaRelated: true, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countCards("he") > 0 && get.distance(player, event.target) == 1; + }, + forced: true, + logTarget: "target", + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + if (target.countCards("e") == 0) event._result = { index: 0 }; + else + target + .chooseControl() + .set("choiceList", ["弃置一张牌", "重铸装备区的所有牌"]) + .set("ai", function (card) { + var min = Infinity, + equ = 0, + es = player.getCards("e"), + hs = player.getCards("he"); + for (var i of hs) { + var val = get.value(i); + min = Math.min(min, val); + if (es.includes(i)) equ += val; + } + equ /= es.length; + if (min < equ - 1) return 0; + return 1; + }); + "step 1"; + if (result.index == 0) { + target.chooseToDiscard("he", true); + } else { + target.recast(target.getCards("e", lib.filter.cardRecastable)); + } + }, + }, + //蒲元 + olshengong: { + audio: 2, + enable: "phaseUse", + usable: 3, + filter: function (event, player) { + var list = ["equip1", "equip2", "others"]; + for (var i = 0; i < list.length; i++) { + if (player.hasSkill("olshengong_" + list[i], null, null, false)) list.splice(i--, 1); + } + if (!list.length) return false; + return player.hasCard(function (card) { + var type = get.type(card); + if (type != "equip") return false; + var subtype = get.subtype(card); + if (subtype != "equip1" && subtype != "equip2") subtype = "others"; + return list.includes(subtype); + }, "eh"); + }, + filterCard: function (card, player) { + var type = get.type(card); + if (type != "equip") return false; + var subtype = get.subtype(card); + if (subtype != "equip1" && subtype != "equip2") subtype = "others"; + return !player.hasSkill("olshengong_" + subtype, null, null, false); + }, + position: "he", + check: function (card) { + var val = 7.52 - get.value(card); + if (val <= 0) return 0; + var player = _status.event.player; + if (player.getStorage("olshengong_destroy").includes(card)) val += 2; + return val; + }, + content: function () { + "step 0"; + var subtype = get.subtype(cards[0]); + if (subtype != "equip1" && subtype != "equip2") subtype = "others"; + player.addTempSkill("olshengong_" + subtype, "phaseUseAfter"); + var send = function () { + game.me.chooseControl("助力锻造!", "妨碍锻造!", "什么都不做"); + game.resume(); + }; + var sendback = function (result, player) { + if (result) { + var index = result.index; + game.log(player, "选择了", ["#b助力锻造", "#g妨碍锻造", "#b什么都不做"][index]); + if (index > 1) return; + var card = get.cards()[0]; + if (!card) return; + game.log(player, "展示了", card); + event.cardsx.push(card); + event.cards2[index].push(card); + game.broadcastAll( + function (id, card, name, index) { + var dialog = get.idDialog(id); + if (!dialog) return; + var button = ui.create.button(card, "card", dialog.buttonss[index]); + button.querySelector(".info").innerHTML = name + "|" + get.strNumber(card.number); + }, + event.videoId, + card, + (function (target) { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + })(player), + index + ); + } + }; + event.players = game.filterPlayer(); + event.cardsx = []; + event.cards2 = [[], []]; + event.videoId = lib.status.videoId++; + event.ai_targets = []; + game.broadcastAll( + function (name, id) { + var dialog = ui.create.dialog(name + "发起了“锻造”", "hidden", "forcebutton"); + dialog.videoId = id; + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + ui.arena.classList.add("choose-to-move"); + dialog.buttonss = []; + + var list = ["协力锻造的玩家", "妨碍锻造的玩家"]; + for (var i = 0; i < list.length; i++) { + dialog.add('
    ' + list[i] + "
    "); + var buttons = ui.create.div(".buttons", dialog.content); + dialog.buttonss.push(buttons); + buttons.classList.add("popup"); + buttons.classList.add("guanxing"); + } + dialog.open(); + }, + get.translation(player), + event.videoId + ); + for (var i = 0; i < event.players.length; i++) { + if (event.players[i] == player) { + sendback({ index: 0 }, player); + } else if (event.players[i].isOnline()) { + event.withol = true; + event.players[i].send(send); + event.players[i].wait(sendback); + } else if (event.players[i] == game.me) { + event.withme = true; + game.me.chooseControl("助力锻造!", "妨碍锻造!", "什么都不做"); + if (_status.connectMode) game.me.wait(sendback); + } else { + event.ai_targets.push(event.players[i]); + if (_status.connectMode) event.players[i].showTimer(); + } + } + if (event.ai_targets.length) { + event.ai_targets.randomSort(); + setTimeout(function () { + event.interval = setInterval(function () { + var target = event.ai_targets.shift(); + var att = get.attitude(target, player); + var num = 2; + if (att > 0) num = 0; + else if (att < 0) num = 1; + sendback({ index: num }, target); + if (_status.connectMode) target.hideTimer(); + if (!event.ai_targets.length) { + clearInterval(event.interval); + if (event.withai) game.resume(); + } + }, 750); + }, 500); + } + "step 1"; + if (event.withme) { + if (_status.connectMode) game.me.unwait(result); + else { + var index = result.index; + game.log(game.me, "选择了", ["#b助力锻造", "#g妨碍锻造", "#b什么都不做"][index]); + if (index > 1) return; + var card = get.cards()[0]; + if (!card) return; + game.log(game.me, "展示了", card); + event.cardsx.push(card); + event.cards2[index].push(card); + game.broadcastAll( + function (id, card, name, index) { + var dialog = get.idDialog(id); + if (!dialog) return; + var button = ui.create.button(card, "card", dialog.buttonss[index]); + button.querySelector(".info").innerHTML = name + "|" + get.strNumber(card.number); + }, + event.videoId, + card, + (function (target) { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + })(game.me), + index + ); + } + } + "step 2"; + if (event.withol && !event.resultOL) { + game.pause(); + } + "step 3"; + if (event.ai_targets.length > 0) { + event.withai = true; + game.pause(); + } + "step 4"; + game.broadcastAll(function () { + setTimeout(function () { + ui.arena.classList.remove("choose-to-move"); + }, 500); + }); + game.delay(2); + var num1 = 0, + num2 = 0; + for (var i of event.cards2[0]) num1 += get.number(i, false); + for (var i of event.cards2[1]) num2 += get.number(i, false); + var result = 2; + if (num1 < num2) result = 0; + else if (num2 > 0) result = 1; + event.duanzao_result = result; + game.broadcastAll( + function (id, result) { + var dialog = get.idDialog(id); + if (dialog) dialog.content.firstChild.innerHTML = ["锻造失败…", "锻造成功", "完美锻造!"][result]; + }, + event.videoId, + result + ); + "step 5"; + game.cardsGotoOrdering(event.cardsx); + game.broadcastAll("closeDialog", event.videoId); + "step 6"; + var subtype = get.subtype(cards[0]); + if (subtype != "equip1" && subtype != "equip2") subtype = "others"; + var card_map = { + equip1: [ + ["diamond", 13, "bintieshuangji"], + ["diamond", 1, "wuxinghelingshan"], + ["spade", 13, "wutiesuolian"], + ["diamond", 12, "wushuangfangtianji"], + ["spade", 6, "chixueqingfeng"], + ["spade", 5, "guilongzhanyuedao"], + ], + equip2: [ + ["club", 1, "huxinjing"], + ["club", 2, "heiguangkai"], + ["spade", 2, "linglongshimandai"], + ["club", 1, "hongmianbaihuapao"], + ["spade", 2, "qimenbagua"], + ["spade", 9, "guofengyupao"], + ], + others: [ + ["diamond", 1, "zhaogujing"], + ["spade", 5, "sanlve"], + ["club", 12, "tianjitu"], + ["spade", 2, "taigongyinfu"], + ["diamond", 1, "shufazijinguan"], + ["club", 4, "xuwangzhimian"], + ], + }; + if (!_status.olshengong_map) _status.olshengong_map = {}; + if (!_status.olshengong_maken) _status.olshengong_maken = {}; + var list = card_map[subtype]; + for (var i = 0; i < list.length; i++) { + var name = list[i][2]; + if (!lib.card[name] || _status.olshengong_map[name]) { + list.splice(i--, 1); + } + } + if (!list.length) event.finish(); + else + player.chooseButton(["请选择一种装备牌", [list.randomGets(event.duanzao_result + 1), "vcard"]], true).set("ai", function (button) { + return get.value({ name: button.link[2] }, player, "raw"); + }); + "step 7"; + var name = result.links[0][2]; + var card; + if (_status.olshengong_maken[name]) card = _status.olshengong_maken[name]; + else { + card = game.createCard2(name, result.links[0][0], result.links[0][1]); + _status.olshengong_maken[name] = card; + } + event.card = card; + player.addSkill("olshengong_destroy"); + player.markAuto("olshengong_destroy", [card]); + if ( + !game.hasPlayer(function (current) { + return current.canEquip(card); + }) + ) { + event.finish(); + return; + } + player + .chooseTarget(true, "将" + get.translation(card) + "置于一名角色的装备区内", function (card, player, target) { + return target.canEquip(_status.event.card, true); + }) + .set("card", card) + .set("ai", function (target) { + var card = _status.event.getParent().card, + player = _status.event.player; + return get.effect(target, card, player, player); + }); + "step 8"; + if (result.bool) { + _status.olshengong_map[card.name] = true; + var target = result.targets[0]; + player.line(target, "green"); + target.$gain2(card); + game.delayx(); + target.equip(card); + } + }, + ai: { + order: 10, + result: { player: 1 }, + }, + subSkill: { + equip1: { charlotte: true }, + equip2: { charlotte: true }, + others: { charlotte: true }, + destroy: { + trigger: { global: ["loseEnd", "cardsDiscardEnd"] }, + forced: true, + charlotte: true, + popup: false, + onremove: true, + filter: function (event, player) { + if (event.name == "lose" && event.position != ui.discardPile) return false; + var storage = player.storage.olshengong_destroy; + if (!storage) return false; + for (var i of event.cards) { + if (storage.includes(i)) return true; + } + return false; + }, + content: function () { + var cards = []; + var storage = player.storage.olshengong_destroy; + for (var i of trigger.cards) { + if (storage.includes(i)) { + delete _status.olshengong_map[i.name]; + storage.remove(i); + cards.push(i); + } + } + game.cardsGotoSpecial(cards); + game.log(cards, "被移出了游戏"); + player.addTempSkill("olshengong_draw"); + player.addMark("olshengong_draw", cards.length, false); + if (!storage.length) player.removeSkill("olshengong_destroy"); + }, + }, + draw: { + audio: "olshengong", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return player.countMark("olshengong_draw") > 0; + }, + content: function () { + player.draw(player.countMark("olshengong_draw")); + }, + }, + }, + }, + olqisi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { + return !event.numFixed && event.num > 0; + }, + check: function (event, player) { + if (player.hasEmptySlot(2) || player.hasEmptySlot(5) || player.hasEmptySlot(1)) return true; + return false; + }, + prompt2: "摸牌阶段开始时,你可以少摸一张牌并声明一种装备牌的副类别,然后从牌堆或弃牌堆中获得一张该副类别的牌。", + content: function () { + "step 0"; + player + .chooseControl("equip1", "equip2", "equip6", "equip5") + .set("prompt", "选择获得一种副类别的装备牌") + .set("ai", function (card) { + if (player.hasEmptySlot(2)) return "equip2"; + if (player.hasEmptySlot(5)) return "equip5"; + if (player.hasEmptySlot(1)) return "equip1"; + return "equip6"; + }); + "step 1"; + var card = get.cardPile(function (card) { + var type = get.subtype(card); + if (result.control == "equip6") return type == "equip3" || type == "equip4"; + return type == result.control; + }); + if (card) { + trigger.num--; + player.gain(card, "gain2"); + } + }, + group: "olqisi_init", + subSkill: { + init: { + audio: "olqisi", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + var i = 0; + var list = []; + while (i++ < 2) { + var card = get.cardPile(function (card) { + if (get.type(card) != "equip") return false; + return list.length == 0 || get.subtype(card) != get.subtype(list[0]); + }); + if (card) list.push(card); + } + if (!list.length) { + event.finish(); + return; + } + event.list = list; + player.gain(event.list, "gain2"); + "step 1"; + game.delay(1); + var card = event.list.shift(); + if (player.getCards("h").includes(card)) { + player.$give(card, player, false); + player.equip(card); + } + if (event.list.length) event.redo(); + }, + }, + }, + }, + //蒲元衍生 + zhaogujing_skill: { + equipSkill: true, + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: function (event, player) { + return player.hasCard(function (card) { + if (_status.connectMode) return true; + var type = get.type(card, player); + return type == "basic" || type == "trick"; + }, "h"); + }, + content: function () { + "step 0"; + player + .chooseCard("h", get.prompt("zhaogujing_skill"), "展示并视为使用一张基本牌或普通锦囊牌", function (card, player) { + var type = get.type(card, player); + return type == "basic" || type == "trick"; + }) + .set("ai", function (card) { + var player = _status.event.player, + name = get.name(card, player); + if (name == "jiu") return 0; + return player.getUseValue({ + name: name, + nature: get.nature(card, player), + isCard: true, + }); + }); + "step 1"; + if (result.bool) { + player.logSkill("zhaogujing_skill"); + player.showCards(result.cards, get.translation(player) + "发动了【照骨镜】"); + var card = { + name: get.name(result.cards[0], player), + nature: get.nature(result.cards[0], player), + isCard: true, + }; + player.chooseUseTarget(card, true, false); + } + }, + }, + sanlve_skill: { + equipSkill: true, + mod: { + maxHandcard: function (player, num) { + return num + 1; + }, + attackRange: function (player, num) { + return num + 1; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + xuwangzhimian: { + equipSkill: true, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num += 2; + }, + mod: { + maxHandcard: function (player, num) { + return num - 1; + }, + }, + }, + shufazijinguan_skill: { + equipSkill: true, + trigger: { + player: "phaseZhunbeiBegin", + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("shufazijinguan"), "对一名其他角色造成1点伤害", function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + player.logSkill("shufazijinguan_skill", result.targets[0]); + result.targets[0].damage(); + } + }, + }, + qimenbagua: { + equipSkill: true, + trigger: { target: "useCardToBefore" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (player.hasSkillTag("unequip2")) return false; + if ( + event.player.hasSkillTag("unequip", false, { + name: event.card ? event.card.name : null, + target: player, + card: event.card, + }) + ) + return false; + return true; + }, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target) { + if (card.name != "sha") return; + if ( + target.hasSkillTag("unequip2") || + player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return; + return "zerotarget"; + }, + }, + }, + }, + guofengyupao: { + equipSkill: true, + mod: { + targetEnabled: function (card, player, target) { + if (player == target || get.type(card) != "trick") return; + if (target.hasSkillTag("unequip2")) return; + if ( + player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return; + return false; + }, + }, + }, + hongmianbaihuapao_skill: { + equipSkill: true, + trigger: { + player: "damageBegin4", + }, + filter: function (event, player) { + if (!event.hasNature("linked")) return false; + if (player.hasSkillTag("unequip2")) return false; + if ( + event.source && + event.source.hasSkillTag("unequip", false, { + name: event.card ? event.card.name : null, + target: player, + card: event.card, + }) + ) + return false; + return true; + }, + forced: true, + content: function () { + trigger.cancel(); + }, + ai: { + nofire: true, + nothunder: true, + effect: { + target: function (card, player, target, current) { + if (!get.tag(card, "natureDamage")) return; + if ( + !target.hasSkillTag("unequip2") && + !player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) && + !player.hasSkillTag("unequip_ai", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return "zerotarget"; + }, + }, + }, + }, + linglongshimandai_skill: { + equipSkill: true, + trigger: { + target: "useCardToTargeted", + }, + filter: function (event, player) { + if ((event.targets && event.targets.length > 1) || event.player == player) return false; + if (player.hasSkillTag("unequip2")) return false; + var evt = event.getParent(); + if ( + evt.player && + evt.player.hasSkillTag("unequip", false, { + name: evt.card ? evt.card.name : null, + target: player, + card: evt.card, + }) + ) + return false; + return true; + }, + audio: true, + check: function (event, player) { + return get.effect(player, event.card, event.player, player) <= 0; + }, + prompt2: event => "进行一次判定。若结果为♥,则" + get.translation(event.card) + "对你无效", + content: function () { + "step 0"; + player.judge("linglongshimandai", function (card) { + return get.suit(card) == "heart" ? 1.5 : -0.5; + }).judge2 = function (result) { + return result.bool ? true : false; + }; + "step 1"; + if (result.judge > 0) { + trigger.getParent().excluded.add(player); + } + }, + ai: { + effect: { + target: function (card, player, target, effect) { + if ( + effect > 0 || + player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return; + return 0.75; + }, + }, + }, + }, + bintieshuangji_skill: { + trigger: { player: "shaMiss" }, + filter: function (event, player) { + return player.hp > 0; + }, + prompt2: function (event, player) { + var prompt = "失去1点体力,然后"; + var cards = event.cards.filterInD(); + if (cards.length) prompt += "获得" + get.translation(cards) + "、"; + prompt += "摸一张牌、本回合使用【杀】的次数上限+1"; + return prompt; + }, + check: function (event, player) { + if (get.effect(player, { name: "losehp" }, player, player) > 0) return true; + return player.hp > event.target.hp && event.cards.filterInD().length > 0; + }, + content: function () { + "step 0"; + player.loseHp(); + "step 1"; + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); + player.draw(); + "step 2"; + player.addTempSkill("bintieshuangji_skill_effect"); + player.addMark("bintieshuangji_skill_effect", 1, false); + }, + subSkill: { + effect: { + charlotte: true, + intro: { content: "使用【杀】的次数上限+#" }, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("bintieshuangji_skill_effect"); + }, + }, + }, + }, + }, + chixueqingfeng: { + equipSkill: true, + trigger: { player: "useCardToPlayered" }, + filter: function (event) { + return event.card.name == "sha"; + }, + logTarget: "target", + forced: true, + content: function () { + var target = trigger.target; + target.addTempSkill("chixueqingfeng2"); + target.markAuto("chixueqingfeng2", [trigger.card]); + }, + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") return true; + return false; + }, + }, + }, + chixueqingfeng2: { + equipSkill: true, + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + onremove: true, + filter: function (event, player) { + return player.storage.chixueqingfeng2 && player.storage.chixueqingfeng2.includes(event.card); + }, + content: function () { + player.storage.chixueqingfeng2.remove(trigger.card); + if (!player.storage.chixueqingfeng2.length) player.removeSkill("chixueqingfeng2"); + }, + mark: true, + marktext: "※", + intro: { + content: "防具技能无效,且不能使用或打出手牌", + }, + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; + }, + }, + ai: { + unequip2: true, + }, + }, + guilongzhanyuedao: { + equipSkill: true, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && get.color(event.card) == "red"; + }, + content: function () { + trigger.directHit.addArray(game.players); + }, + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha" && get.color(arg.card) == "red") return true; + return false; + }, + }, + }, + wushuangfangtianji_skill: { + equipSkill: true, + trigger: { + source: "damageSource", + }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.getParent().type == "card"; + }, + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + var choices = ["摸一张牌"]; + if ( + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ) + choices.push("弃置" + get.translation(target) + "的一张牌"); + player + .chooseControl("cancel2") + .set("choiceList", choices) + .set("prompt", get.prompt("wushuangfangtianji_skill")) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + if ( + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") && + get.effect(target, { name: "guohe_copy2" }, player, player) > get.effect(player, { name: "draw" }, player, player) + ) + return 1; + return 0; + }); + "step 1"; + if (result.control == "cancel2") return; + if (result.index == 0) { + player.logSkill("wushuangfangtianji_skill"); + player.draw(); + } else { + var target = trigger.player; + player.logSkill("wushuangfangtianji_skill", target); + player.discardPlayerCard(target, "he", true); + } + }, + }, + //芮姬 + qiaoli: { + onChooseToUse: function (event) { + if (event.type == "phase" && !game.online && !(event.qiaoli_equip1 && event.qiaoli_noequip1)) { + var player = event.player; + var evt = event.getParent("phaseUse"); + if ( + player.getHistory("useCard", function (evtx) { + return evtx.getParent("phaseUse") == evt && evtx.skill == "qiaoli" && get.subtype(evtx.cards[0]) == "equip1"; + }).length + ) + event.set("qiaoli_equip1", true); + if ( + player.getHistory("useCard", function (evtx) { + return evtx.getParent("phaseUse") == evt && evtx.skill == "qiaoli" && get.subtype(evtx.cards[0]) != "equip1"; + }).length + ) + event.set("qiaoli_noequip1", true); + } + }, + audio: 2, + enable: "phaseUse", + viewAs: { + name: "juedou", + qiaoli: true, + }, + filterCard: function (card, player) { + if (get.type(card) != "equip") return false; + var event = _status.event; + if (get.subtype(card) == "equip1" && event.qiaoli_equip1) return false; + if (get.subtype(card) != "equip1" && event.qiaoli_noequip1) return false; + return true; + }, + viewAsFilter: function (player) { + return ( + player.isPhaseUsing() && + player.hasCard(function (card) { + return lib.skill.qiaoli.filterCard(card, player); + }, "hes") + ); + }, + check: function (card) { + if (get.position(card) == "e") return 7.5 - get.value(card); + return 12 - _status.event.player.getUseValue(card); + }, + position: "hes", + precontent: function () { + player.addTempSkill("qiaoli_norespond"); + player.addTempSkill("qiaoli_effect"); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg && arg.card && arg.card.name == "juedou" && _status.event.skill == "qiaoli"; + }, + }, + subSkill: { + norespond: { + charlotte: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return event.card.qiaoli && get.subtype(event.cards[0]) != "equip1"; + }, + forced: true, + popup: false, + content: function () { + player.addTempSkill("qiaoli_gain"); + trigger.directHit.addArray(game.players); + game.log(trigger.card, "不可被响应"); + }, + }, + effect: { + charlotte: true, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return event.card && event.cards && event.card.qiaoli && get.subtype(event.cards[0]) == "equip1"; + }, + forced: true, + popup: false, + content: function () { + "step 0"; + var card = trigger.cards[0]; + var num = 1; + var info = get.info(card, false); + if (info && info.distance && typeof info.distance.attackFrom == "number") num -= info.distance.attackFrom; + player.draw(num); + "step 1"; + var cards = result; + if (get.itemtype(cards) != "cards") { + event.finish(5); + return; + } + var hs = player.getCards("h"); + cards = cards.filter(function (card) { + return hs.includes(card); + }); + if (!cards.length) { + event.finish(5); + return; + } + event.cards = cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + "step 2"; + player.chooseCardTarget({ + filterCard: function (card) { + return _status.event.cards.includes(card) && !card.hasGaintag("qiaoli_given"); + }, + cards: cards, + filterTarget: lib.filter.notMe, + selectCard: [1, cards.length], + prompt: "是否将获得的牌分配给其他角色?", + ai1: function (card) { + return -1; + }, + ai2: function (target) { + return -1; + }, + }); + "step 3"; + if (result.bool) { + var res = result.cards, + target = result.targets[0].playerid; + player.addGaintag(res, "qiaoli_given"); + cards.removeArray(res); + if (!event.given_map[target]) event.given_map[target] = []; + event.given_map[target].addArray(res); + if (cards.length) event.goto(2); + } + "step 4"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + }); + game.stopCountChoose(); + } + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + source.gain(event.given_map[i], player, "giveAuto"); + } + event.next.sort(function (a, b) { + return lib.sort.seat(a.player, b.player); + }); + }, + }, + gain: { + charlotte: true, + audio: "qiaoli", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content: function () { + var card = get.cardPile2(function (card) { + return get.type(card) == "equip"; + }); + if (card) player.gain(card, "gain2"); + }, + }, + }, + }, + qingliang: { + audio: 2, + trigger: { target: "useCardToTarget" }, + filter: function (event, player) { + if (event.targets.length != 1) return false; + var bool1 = event.card.name == "sha"; + var bool2 = get.type2(event.card) == "trick" && get.tag(event.card, "damage"); + if (!bool1 && !bool2) return false; + return player != event.player && player.countCards("h") > 0; + }, + usable: 1, + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) > 0 || event.player.hasSkillTag("nogain")) return true; + var eff = get.effect(player, event.card, event.player, player); + if (eff >= 0) return false; + var suits = [], + banned = [], + hs = player.getCards("h"); + for (var i of hs) { + var suit = get.suit(i, player); + suits.add(suit); + if (!lib.filter.cardDiscardable(i, player, "qingliang")) banned.add(suit); + } + suits.removeArray(banned); + for (var i of suits) { + var cards = player.getCards("h", function (card) { + return get.suit(card, player) == i; + }); + if (-eff / 2 - get.value(cards, player) > 0) return true; + } + return false; + }, + content: function () { + "step 0"; + player.showHandcards(get.translation(player) + "发动了【清靓】"); + "step 1"; + var suits = [], + banned = [], + hs = player.getCards("h"); + for (var i of hs) { + var suit = get.suit(i, player); + suits.add(suit); + if (!lib.filter.cardDiscardable(i, player, "qingliang")) banned.add(suit); + } + if (suits.length > banned.length) { + player + .chooseControl() + .set("choiceList", ["和" + get.translation(trigger.player) + "各摸一张牌", "弃置一种花色的所有手牌,令" + get.translation(trigger.card) + "对自己无效"]) + .set("ai", function () { + var player = _status.event.player, + event = _status.event.getTrigger(); + if (get.attitude(player, event.player) > 0 || event.player.hasSkillTag("nogain")) return 0; + return 1; + }); + event.suits = suits; + suits.removeArray(banned); + suits.sort(); + } else { + event._result = { index: 0 }; + } + "step 2"; + if (result.index == 0) { + var list = [player, trigger.player].sortBySeat(); + list[0].draw("nodelay"); + list[1].draw(); + event.finish(); + } else { + if (event.suits.length == 1) event._result = { control: event.suits[0] }; + else + player + .chooseControl(event.suits) + .set("prompt", "选择弃置一种花色的所有牌") + .set("ai", function () { + var player = _status.event.player, + list = _status.event.controls.slice(0); + var gett = function (suit) { + var cards = player.getCards("h", function (card) { + return get.suit(card, player) == suit; + }); + return get.value(cards); + }; + return list.sort(function (b, a) { + return gett(b) - gett(a); + })[0]; + }); + } + "step 3"; + var cards = player.getCards("h", function (card) { + return get.suit(card) == result.control; + }); + if (cards.length) player.discard(cards); + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + trigger.untrigger(); + }, + }, + //卫兹 + yuanzi: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + logTarget: "player", + filter: function (event, player) { + return player != event.player && event.player.isIn() && player.countCards("h") > 0 && !player.hasSkill("yuanzi_round", null, null, false); + }, + check: function (event, player) { + if (event.player.hasJudge("lebu") || get.attitude(player, event.player) < 2) return false; + return game.hasPlayer(function (current) { + return current !== player && current !== event.player && event.player.inRange(current) && get.attitude(event.player, current) < 0; + }); + }, + content: function () { + var cards = player.getCards("h"); + player.give(cards, trigger.player); + player.addTempSkill("yuanzi_effect"); + player.addTempSkill("yuanzi_round", "roundStart"); + }, + subSkill: { + effect: { + charlotte: true, + audio: "yuanzi", + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + var source = event.source; + return source && source == _status.currentPhase && player.countCards("h") <= source.countCards("h"); + }, + content: function () { + player.draw(2); + }, + }, + round: { charlotte: true }, + }, + }, + liejie: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + var source = trigger.source; + var prompt2 = "弃置至多三张牌并摸等量的牌"; + if (source) prompt2 += ",若弃置的牌中有红色牌,则弃置" + get.translation(source) + "至多等量的牌"; + var next = player.chooseToDiscard("he", [1, 3], get.prompt("liejie"), prompt2); + next.set("ai", function (card) { + return 6 - get.value(card); + }); + if (source) next.logSkill = ["liejie", source]; + else next.logSkill = "liejie"; + "step 1"; + if (result.bool) { + var cards = result.cards; + player.draw(cards.length); + if (trigger.source) { + var num = cards.filter(function (i) { + return get.color(i, player) == "red"; + }).length; + if (num > 0) player.discardPlayerCard(trigger.source, "he", [1, num]).set("forceAuto", true); + } + } + }, + }, + //滕芳兰 + luochong: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "damageEnd"] }, + direct: true, + filter: function (event, player) { + if (event.name == "damage") { + var history = player.getHistory("damage"); + if (history.indexOf(event) != 0) return false; + } + var storage1 = player.storage.luochong_round, + storage2 = player.getStorage("luochong"); + if (!storage1) storage1 = [[], []]; + for (var i = 0; i < 4; i++) { + if ( + !storage1[0].includes(i) && + !storage2.includes(i) && + game.hasPlayer(function (current) { + return !storage1[1].includes(current) && lib.skill.luochong.filterx[i](current); + }) + ) + return true; + } + return false; + }, + filterx: [target => target.isDamaged(), () => true, target => target.countCards("he") > 0, () => true], + onremove: true, + content: function () { + "step 0"; + var list = []; + var choiceList = ["令一名角色回复1点体力。", "令一名角色失去1点体力。", "令一名角色弃置两张牌。", "令一名角色摸两张牌。"]; + var storage1 = player.storage.luochong_round, + storage2 = player.getStorage("luochong"); + if (!storage1) storage1 = [[], []]; + for (var i = 0; i < 4; i++) { + if (storage2.includes(i)) { + choiceList[i] = '' + choiceList[i] + ""; + } else if ( + storage1[0].includes(i) || + !game.hasPlayer(function (current) { + return !storage1[1].includes(current) && lib.skill.luochong.filterx[i](current); + }) + ) { + choiceList[i] = '' + choiceList[i] + ""; + } else list.push("选项" + get.cnNumber(i + 1, true)); + } + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("luochong")) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player; + var list = _status.event.controls.slice(0); + var listx = (player.storage.luochong_round || [[], []])[1]; + var gett = function (choice) { + if (choice == "cancel2") return 0.1; + var max = 0, + func = { + 选项一: function (current) { + if (current.isDamaged()) max = Math.max(max, get.recoverEffect(current, player, player)); + }, + 选项二: function (target) { + max = Math.max(max, get.effect(target, { name: "losehp" }, player, player)); + }, + 选项三: function (target) { + var num = target.countDiscardableCards(player, "he"); + if (num > 0) max = Math.max(max, Math.sqrt(Math.min(2, num)) * get.effect(target, { name: "guohe_copy2" }, player, player)); + }, + 选项四: function (target) { + max = Math.max(max, 2 * get.effect(target, { name: "draw" }, player, player)); + }, + }[choice]; + game.countPlayer(function (current) { + if (!listx.includes(current)) func(current); + }); + return max; + }; + return list.sort(function (a, b) { + return gett(b) - gett(a); + })[0]; + }); + "step 1"; + if (result.control != "cancel2") { + var index = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); + event.index = index; + var listx = (player.storage.luochong_round || [[], []])[1]; + var list = [ + [ + "选择一名角色,令其回复1点体力", + function (target) { + var player = _status.event.player; + return get.recoverEffect(target, player, player); + }, + ], + [ + "选择一名角色,令其失去1点体力", + function (target) { + return get.effect(target, { name: "losehp" }, player, player); + }, + ], + [ + "选择一名角色,令其弃置两张牌", + function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player) * Math.sqrt(Math.min(2, target.countCards("he"))); + }, + ], + [ + "选择一名角色,令其摸两张牌", + function (target) { + var player = _status.event.player; + return 2 * get.effect(target, { name: "draw" }, player, player); + }, + ], + ][index]; + var targets = game.filterPlayer(function (current) { + return !listx.includes(current) && lib.skill.luochong.filterx[event.index](current); + }); + var next = player.chooseTarget(list[0], true, function (card, player, target) { + return _status.event.targets.includes(target); + }); + next.set("targets", targets); + next.set("ai", list[1]); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("luochong", target); + if (player != target) player.addExpose(0.2); + player.addTempSkill("luochong_round", "roundStart"); + if (!player.storage.luochong_round) player.storage.luochong_round = [[], []]; + player.storage.luochong_round[0].push(event.index); + player.storage.luochong_round[1].push(target); + switch (event.index) { + case 0: + target.recover(); + break; + case 1: + target.loseHp(); + break; + case 2: + target.chooseToDiscard(true, "he", 2); + break; + case 3: + target.draw(2); + break; + } + } + }, + subSkill: { + round: { + charlotte: true, + onremove: true, + }, + }, + }, + aichen: { + audio: 2, + trigger: { player: "dying" }, + forced: true, + filter: function (event, player) { + return player.hasSkill("luochong", null, null, false) && player.getStorage("luochong").length < 3; + }, + content: function () { + "step 0"; + //var num=1-player.hp; + //if(num>0) player.recover(num); + var list = []; + var choiceList = ["令一名角色回复1点体力。", "令一名角色失去1点体力。", "令一名角色弃置两张牌。", "令一名角色摸两张牌。"]; + var storage2 = player.getStorage("luochong"); + for (var i = 0; i < 4; i++) { + if (storage2.includes(i)) { + choiceList[i] = '' + choiceList[i] + ""; + } else list.push("选项" + get.cnNumber(i + 1, true)); + } + player + .chooseControl(list) + .set("prompt", "哀尘:选择移去一个〖落宠〗的选项") + .set("choiceList", choiceList) + .set("ai", function () { + var controls = _status.event.controls.slice(0); + var list = ["选项三", "选项四", "选项二", "选项一"]; + for (var i of list) { + if (controls.includes(i)) return i; + } + return 0; + }); + "step 1"; + var index = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); + player.markAuto("luochong", [index]); + game.log(player, "移去了", "#g【落宠】", "的", "#y" + ["令一名角色回复1点体力", "令一名角色失去1点体力", "令一名角色弃置两张牌", "令一名角色摸两张牌"][index], "的选项"); + }, + ai: { + combo: "luochong", + neg: true, + }, + }, + //SP孟获 + spmanwang: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterCard: true, + position: "he", + selectCard: [1, Infinity], + check: function (card) { + var player = _status.event.player; + var max = Math.min(player.isDamaged() ? 3 : 2, 4 - player.countMark("spmanwang")); + if (!max && !player.hasSkill("sppanqin")) return 0; + if (max == 0 && ui.selected.length > 0) return 0; + return 7 - ui.selected.cards.length - get.value(card); + }, + content: function () { + var num = Math.min(cards.length, 4 - player.countMark("spmanwang")); + if (num >= 1) player.addSkills("sppanqin"); + if (num >= 2) player.draw(); + if (num >= 3) player.recover(); + if (num >= 4) { + player.draw(2); + player.removeSkills("sppanqin"); + } + }, + intro: { content: "已经移去过#个选项" }, + ai: { + order: 2, + result: { + player: function (player, target) { + if (player.getUseValue({ name: "nanman" }) <= 0) return 0; + if (player.getStat("skill").spmanwang && player.hasSkill("sppanqin")) return 0; + return 1; + }, + }, + }, + derivation: "sppanqin", + }, + sppanqin: { + audio: 2, + trigger: { player: ["phaseUseEnd", "phaseDiscardEnd"] }, + filter: function (event, player) { + var cards = [], + bool = true; + player.getHistory("lose", function (evt) { + if (!bool || evt.type != "discard" || evt.getParent(event.name) != event) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { + cards.add(i); + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) bool = false; + } + } + }); + if (!bool || !cards.length) return false; + return player.hasUseTarget(get.autoViewAs({ name: "nanman" }, cards)); + }, + prompt2: function (event, player) { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent(event.name) != event) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { + cards.add(i); + } + } + }); + return "将" + get.translation(cards) + "(共计" + get.cnNumber(cards.length) + "张牌)当做【南蛮入侵】使用"; + }, + check: function (event, player) { + var cards = [], + bool = true; + player.getHistory("lose", function (evt) { + if (!bool || evt.type != "discard" || evt.getParent(event.name) != event) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { + cards.add(i); + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) bool = false; + } + } + }); + if (!bool || !cards.length) return false; + return player.hasValueTarget(get.autoViewAs({ name: "nanman" }, cards)); + }, + content: function () { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent(trigger.name) != trigger) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { + cards.add(i); + } + } + }); + player.chooseUseTarget(true, { name: "nanman" }, cards); + player.addTempSkill("sppanqin_eff"); + }, + subSkill: { + eff: { + trigger: { player: "useCard" }, + charlotte: true, + forced: true, + popup: false, + filter: function (event, player) { + return event.card.name == "nanman" && event.getParent(2).name == "sppanqin" && player.countMark("spmanwang") < 4 && player.hasSkill("spmanwang", null, null, false) && event.cards.length <= event.targets.length; + }, + content: function () { + player.addMark("spmanwang", 1, false); + switch (player.countMark("spmanwang")) { + case 1: + player.draw(2); + player.removeSkills("sppanqin"); + break; + case 2: + player.recover(); + break; + case 3: + player.draw(); + break; + case 4: + player.addSkills("sppanqin"); + break; + } + }, + }, + }, + }, + //清河公主 + zengou: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + return ( + event.card.name == "shan" && + player.inRange(event.player) && + (player.hp > 0 || + player.hasCard(function (card) { + return get.type(card) != "basic" && lib.filter.cardDiscardable(card, player, "zengou"); + }, "eh")) + ); + }, + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if (get.damageEffect(event.player, event.getParent(3).player, player, get.nature(event.card)) <= 0) return false; + if ( + player.hasCard(function (card) { + return get.type(card) != "basic" && get.value(card) < 7 && lib.filter.cardDiscardable(card, player, "zengou"); + }, "eh") + ) + return true; + return player.hp > Math.max(1, event.player.hp); + }, + content: function () { + "step 0"; + trigger.all_excluded = true; + var str = "弃置一张非基本牌"; + if (player.hp > 0) str += ",或点「取消」失去1点体力"; + var next = player + .chooseToDiscard( + str, + function (card) { + return get.type(card) != "basic"; + }, + "he" + ) + .set("ai", function (card) { + return 7 - get.value(card); + }); + if (player.hp <= 0) next.set("forced", true); + "step 1"; + if (!result.bool) player.loseHp(); + "step 2"; + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); + }, + }, + qhzhangji: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + if (!event.player.isIn()) return false; + if (player.getHistory("sourceDamage").length > 0) return true; + if (player.getHistory("damage").length > 0) return event.player.countCards("he") > 0; + return false; + }, + content: function () { + "step 0"; + event.target = trigger.player; + if (player.getHistory("sourceDamage").length) + player + .chooseBool(get.prompt("qhzhangji", event.target), "令" + get.translation(event.target) + "摸两张牌") + .set("choice", get.attitude(player, event.target) > 0) + .set("ai", () => _status.event.choice); + else event.goto(2); + "step 1"; + if (result.bool) { + player.logSkill("qhzhangji", target); + event.logged = true; + target.draw(2); + } + "step 2"; + if (target.isIn() && target.countCards("he") > 0 && player.getHistory("damage").length > 0) + player + .chooseBool(get.prompt("qhzhangji", event.target), "令" + get.translation(event.target) + "弃置两张牌") + .set("choice", get.attitude(player, event.target) < 0) + .set("ai", () => _status.event.choice); + else event.finish(); + "step 3"; + if (result.bool) { + if (!event.logged) player.logSkill("qhzhangji", target); + target.chooseToDiscard("he", true, 2); + } + }, + }, + //十周年夏侯霸 + rebaobian: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + for (var i of lib.skill.rebaobian.derivation) { + if (!player.hasSkill(i, null, null, false)) return true; + } + return false; + }, + forced: true, + content: function () { + for (var i of lib.skill.rebaobian.derivation) { + if (!player.hasSkill(i, null, null, false)) { + player.addSkills(i); + break; + } + } + }, + ai: { + maixie: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage") && !target.hasSkill("oltiaoxin", null, null, false)) { + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0, 1]; + } + }, + }, + }, + derivation: ["tiaoxin", "new_repaoxiao", "xinshensu"], + }, + //范强张达 + yuanchou: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + filter: function (event) { + return event.card.name == "sha" && get.color(event.card) == "black"; + }, + forced: true, + logTarget: "target", + content: function () { + trigger.target.addTempSkill("qinggang2"); + trigger.target.storage.qinggang2.add(trigger.card); + }, + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.name == "sha" && get.color(arg.card) == "black") return true; + return false; + }, + }, + global: "yuanchou_ai", + subSkill: { + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.name == "sha" && get.color(arg.card) == "black" && arg.target && arg.target.hasSkill("yuanchou")) return true; + return false; + }, + }, + }, + }, + juesheng: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + viewAs: { name: "juedou", isCard: true }, + filterCard: () => false, + selectCard: -1, + precontent: function () { + player.awakenSkill("juesheng"); + player.addTempSkill("juesheng_counter"); + }, + ai: { + result: { + player: function (player, target) { + return target.getAllHistory("useCard", evt => evt.card.name == "sha").length * lib.card.juedou.ai.result.player.apply(this, arguments); + }, + target: function (player, target) { + var num = target.getAllHistory("useCard", evt => evt.card.name == "sha").length; + if (num < target.hp) return 0; + return num * lib.card.juedou.ai.result.target; + }, + }, + }, + subSkill: { + counter: { + trigger: { global: "damageBegin1" }, + forced: true, + charlotte: true, + filter: function (event, player) { + var evt = event.getParent(); + return evt.skill == "juesheng" && evt.player == player; + }, + content: function () { + var target = trigger.getParent().target; + trigger.num = Math.max(1, target.getAllHistory("useCard", evt => evt.card.name == "sha").length); + target.addTempSkills("juesheng", { player: "phaseAfter" }); + }, + }, + }, + }, + //田之间 + saodi: { + audio: 2, + trigger: { + player: "useCardToPlayer", + }, + direct: true, + filter: function (event, player) { + if (event.targets.length != 1 || event.target == player || event.target.hasSkill("nodis")) return false; + if (event.card.name != "sha" && get.type(event.card) != "trick") return false; + var target = event.target; + var left = [], + right = [], + left2 = player, + right2 = player; + while (left2 != target && right2 != target) { + left2 = left2.getPrevious(); + right2 = right2.getNext(); + if (left2 != target) left.push(left2); + if (right2 != target) right.push(right2); + } + if (target == left2) { + for (var i of left) { + if (lib.filter.targetEnabled2(event.card, player, i)) return true; + } + } + if (target == right2) { + for (var i of right) { + if (lib.filter.targetEnabled2(event.card, player, i)) return true; + } + } + return false; + }, + aiJudge: function (card, player, target, bool) { + var left = [], + right = [], + left2 = player, + right2 = player, + left3 = false, + right3 = false; + var eff_left = 0, + eff_right = 0; + while (left2 != target && right2 != target) { + left2 = left2.getPrevious(); + right2 = right2.getNext(); + if (left2 != target) left.push(left2); + if (right2 != target) right.push(right2); + } + if (target == left2) { + for (var i of left) { + if (lib.filter.targetEnabled2(card, player, i)) { + left3 = true; + eff_left += get.effect(i, card, player, player); + } + } + } + if (target == right2) { + for (var i of right) { + if (lib.filter.targetEnabled2(card, player, i)) { + right3 = true; + eff_right += get.effect(i, card, player, player); + } + } + } + if (left3 && right3) { + if (!bool) return Math.max(eff_left, eff_right); + if (eff_left > Math.max(0, eff_right)) return "↖顺时针"; + if (eff_right > Math.max(0, eff_left)) return "逆时针↗"; + return "cancel2"; + } else if (left3) { + if (bool) return eff_left > 0 ? "↖顺时针" : "cancel2"; + return eff_left; + } else if (right3) { + if (bool) return eff_right > 0 ? "逆时针↗" : "cancel2"; + return eff_right; + } else return bool ? "cancel2" : 0; + }, + content: function () { + "step 0"; + var choices = []; + var target = trigger.target; + var left = [], + right = [], + left2 = player, + right2 = player; + while (left2 != target && right2 != target) { + left2 = left2.getPrevious(); + right2 = right2.getNext(); + if (left2 != target) left.push(left2); + if (right2 != target) right.push(right2); + } + if (target == left2) { + for (var i of left) { + if (lib.filter.targetEnabled2(trigger.card, player, i)) { + choices.push("↖顺时针"); + break; + } + } + } + if (target == right2) { + for (var i of right) { + if (lib.filter.targetEnabled2(trigger.card, player, i)) { + choices.push("逆时针↗"); + break; + } + } + } + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", get.prompt("saodi")) + .set("prompt2", "令自己和" + get.translation(trigger.target) + "某个方向之间的所有角色均成为" + get.translation(trigger.card) + "的目标") + .set("choices", choices) + .set("ai", function () { + var evt = _status.event.getTrigger(); + return lib.skill.saodi.aiJudge(evt.card, evt.player, evt.target, true); + }); + "step 1"; + if (result.control != "cancel2") { + var targets = []; + if (result.control == "↖顺时针") { + var current = player.getPrevious(); + while (current != trigger.target) { + if (lib.filter.targetEnabled2(trigger.card, player, current)) targets.push(current); + current = current.getPrevious(); + } + } else { + var current = player.getNext(); + while (current != trigger.target) { + if (lib.filter.targetEnabled2(trigger.card, player, current)) targets.push(current); + current = current.getNext(); + } + } + event.targets = targets; + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + "step 2"; + player.logSkill("saodi", targets); + trigger.targets.addArray(targets); + }, + ai: { + effect: { + player_use: function (card, player, target) { + if (!target || player._saodi_judging || ui.selected.targets.length || player == target || target.hasSkill("nodis")) return; + if (typeof card != "object" || (card.name != "sha" && get.type(card) != "trick")) return false; + player._saodi_judging = true; + var effect = lib.skill.saodi.aiJudge(card, player, target); + delete player._saodi_judging; + if (effect > 0) return [1, effect / Math.max(0.01, get.attitude(player, player))]; + }, + }, + }, + }, + zhuitao: { + audio: 2, + direct: true, + locked: false, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + var storage = player.getStorage("zhuitao"); + return game.hasPlayer(function (current) { + return current != player && !storage.includes(current); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("zhuitao"), "令自己至一名其他角色的距离-1", function (card, player, target) { + return target != player && !player.getStorage("zhuitao").includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att < 0 && get.distance(player, target) == 2) return 100; + return get.distance(player, target) * (1 - get.sgn(att) / 3); + }); + "step 1"; + if (result.bool) { + player.logSkill("zhuitao", result.targets[0]); + player.markAuto("zhuitao", result.targets); + game.delayx(); + } + }, + intro: { + content: "至$的距离-1", + onunmark: true, + }, + onremove: true, + mod: { + globalFrom: function (player, target, distance) { + if (player.getStorage("zhuitao").includes(target)) return distance - 1; + }, + }, + group: "zhuitao_remove", + subSkill: { + remove: { + audio: "zhuitao", + trigger: { + source: "damageSource", + }, + forced: true, + filter: function (event, player) { + return player.getStorage("zhuitao").includes(event.player); + }, + logTarget: "player", + content: function () { + player.unmarkAuto("zhuitao", [trigger.player]); + }, + }, + }, + }, + //生鱼片 + olfengji: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + locked: false, + filter: function (event, player) { + return !player.numFixed; + }, + content: function () { + "step 0"; + player + .chooseTarget("丰积:请选择增加摸牌的目标", "令自己本回合的额定摸牌数-1,且目标下回合的额定摸牌数+2。或者点击「取消」,令自己的额定摸牌数+1", lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + if (target.hasJudge("lebu") || target.hasJudge("bingliang")) return 0; + var att = get.attitude(player, target), + dist = get.distance(player, target, "absolute"); + if (_status.event.goon) { + return att / dist; + } + if ( + game.countPlayer(function (current) { + return current != player && current != target && get.attitude(player, current) < 0 && get.distance(player, current, "absolute") < dist; + }) >= target.hp + ) + return 0; + return att / dist; + }) + .set("goon", player.skipList.includes("lebu")); + "step 1"; + if (!player.storage.olfengji_draw) player.storage.olfengji_draw = 0; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); + player.storage.olfengji_draw--; + if (!target.storage.olfengji_draw) target.storage.olfengji_draw = 0; + target.storage.olfengji_draw += 2; + target.addTempSkill("olfengji_draw", { player: "phaseAfter" }); + target.markSkill("olfengji_draw"); + } else { + player.storage.olfengji_draw++; + } + player.addTempSkill("olfengji_draw"); + player.markSkill("olfengji_draw"); + "step 2"; + player.chooseTarget("丰积:请选择增加使用杀次数的目标", "令自己本回合使用杀的次数上限-1,且目标下回合使用杀的次数上限+2。或者点击「取消」,令自己使用杀的次数上限+1", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + if (target.countMark("olfengji_draw") > 0 && target.getCardUsable("sha") < 2) return get.attitude(player, target); + return 0; + }); + "step 3"; + if (!player.storage.olfengji_sha) player.storage.olfengji_sha = 0; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.storage.olfengji_sha--; + if (!target.storage.olfengji_sha) target.storage.olfengji_sha = 0; + target.storage.olfengji_sha += 2; + target.addTempSkill("olfengji_sha", { player: "phaseAfter" }); + target.markSkill("olfengji_sha"); + } else { + player.storage.olfengji_sha++; + } + player.addTempSkill("olfengji_sha"); + player.markSkill("olfengji_sha"); + }, + subSkill: { + sha: { + charlotte: true, + onremove: true, + intro: { + content: function (storage) { + return "使用【杀】的次数上限" + (storage >= 0 ? "+" : "") + storage; + }, + }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.storage.olfengji_sha; + }, + }, + }, + draw: { + charlotte: true, + onremove: true, + intro: { + content: function (storage) { + return "额定摸牌数" + (storage >= 0 ? "+" : "") + storage; + }, + }, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num += player.storage.olfengji_draw; + }, + }, + }, + }, + //朱灵 + jixian: { + audio: 2, + trigger: { player: "phaseDrawAfter" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && lib.skill.jixian.getNum(player, current) > 0 && player.canUse("sha", current, false); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("jixian"), "视为对一名满足条件的角色使用一张【杀】", function (card, player, target) { + return target != player && lib.skill.jixian.getNum(player, target) > 0 && player.canUse("sha", target, false); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player) * Math.sqrt(lib.skill.jixian.getNum(player, target)); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jixian", target); + var num = lib.skill.jixian.getNum(player, target); + player.useCard({ name: "sha", isCard: true }, target, false); + if (num > 0) player.draw(num); + } else event.finish(); + "step 2"; + if ( + !player.hasHistory("sourceDamage", function (evt) { + var card = evt.card; + if (!card || card.name != "sha") return false; + var evtx = evt.getParent("useCard"); + return evtx.card == card && evtx.getParent() == event; + }) + ) + player.loseHp(); + }, + getNum: function (player, target) { + var num = 0; + if (target.isHealthy()) num++; + if (target.getEquips(2).length) num++; + var countSkill = function (player) { + return player.getSkills(null, false, false).filter(function (skill) { + var info = get.info(skill); + if (!info || info.charlotte) return false; + if (info.zhuSkill) return player.hasZhuSkill(skill); + return true; + }).length; + }; + if (countSkill(player) < countSkill(target)) num++; + return num; + }, + }, + //吾彦 + lanjiang: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + audioname: ["heqi"], + content: function () { + "step 0"; + var ph = player.countCards("h"); + var targets = game.filterPlayer(current => current == player || current.countCards("h") >= ph).sortBySeat(); + player.line(targets, "green"); + event.targets = targets; + event.num = 0; + "step 1"; + var target = targets[num]; + event.num++; + if (target.isIn()) { + event.target = target; + target.chooseBool("是否令" + (player == target ? "自己" : get.translation(player)) + "摸一张牌?").set("ai", () => get.attitude(_status.event.player, _status.event.getParent().player) > 0); + } else { + event.goto(event.num < targets.length ? 1 : 3); + } + "step 2"; + if (result.bool) { + target.line(player); + if (player !== target && (get.mode() !== "identity" || target.identity !== "nei")) target.addExpose(0.15); + player.draw(); + } + if (num < targets.length) event.goto(1); + "step 3"; + player + .chooseTarget("是否对一名手牌数等于自己的目标角色造成1点伤害?", function (card, player, target) { + return _status.event.getParent().targets.includes(target) && target.countCards("h") == player.countCards("h"); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15); + target.damage(); + } else event.finish(); + "step 5"; + var ph = player.countCards("h"); + if (ph > 0 && targets.some(target => target.isIn() && target.countCards("h") < ph)) { + player + .chooseTarget("请选择一名手牌数小于自己的目标角色,令其摸一张牌", function (card, player, target) { + return _status.event.getParent().targets.includes(target) && target.countCards("h") < player.countCards("h"); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target); + }); + } + "step 6"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + if (player !== target && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.1); + target.draw(); + } + }, + }, + //新SP张郃 + spolzhouxuan: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0 && player.getExpansions("spolzhouxuan").length < 5; + }, + direct: true, + content: function () { + "step 0"; + player.chooseCard("h", get.prompt("spolzhouxuan"), [1, 5 - player.getExpansions("spolzhouxuan").length], "将至多" + get.cnNumber(5 - player.getExpansions("spolzhouxuan").length) + "张手牌置于武将牌上").set("ai", function (card) { + if (ui.selected.cards.length >= player.needsToDiscard()) return 6 - get.value(card); + return 100 - get.useful(card); + }); + "step 1"; + if (result.bool) { + var cards = result.cards; + player.logSkill("spolzhouxuan"); + player.addToExpansion(cards, player, "give").gaintag.add("spolzhouxuan"); + } + }, + marktext: "旋", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: ["spolzhouxuan_use", "spolzhouxuan_discard"], + subSkill: { + use: { + audio: "spolzhouxuan", + trigger: { player: "useCard" }, + filter: function (event, player) { + return player.getExpansions("spolzhouxuan").length > 0; + }, + forced: true, + locked: false, + content: function () { + "step 0"; + player.loseToDiscardpile(player.getExpansions("spolzhouxuan").randomGet()); + "step 1"; + var num = 1; + if (!player.isMaxHandcard(true)) num += player.getExpansions("spolzhouxuan").length; + player.draw(num); + }, + }, + discard: { + audio: "spolzhouxuan", + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return player.getExpansions("spolzhouxuan").length > 0; + }, + forced: true, + locked: false, + content: function () { + player.loseToDiscardpile(player.getExpansions("spolzhouxuan")); + }, + }, + }, + }, + //董昭 + olxianlve: { + audio: 2, + mode: ["identity"], + trigger: { + global: "phaseZhunbeiBegin", + }, + direct: true, + filter: function (event, player) { + return event.player == game.zhu && event.player.isZhu; + }, + content: function () { + "step 0"; + var list = lib.inpile + .filter(function (i) { + return get.type2(i) == "trick"; + }) + .map(function (i) { + return ["锦囊", "", i]; + }); + if (!list.length) event.finish(); + else + player.chooseButton([get.prompt("olxianlve"), [list, "vcard"]]).set("ai", function (button) { + switch (button.link[2]) { + case "wuxie": + return 0.6 + Math.random(); + case "wuzhong": + case "dongzhuxianji": + return 0.5 + Math.random(); + case "guohe": + case "zhujinqiyuan": + return 0.4 + Math.random(); + default: + return Math.random(); + } + }); + "step 1"; + if (result.bool) { + var name = result.links[0][2]; + player.logSkill("olxianlve"); + player.storage.olxianlve = name; + player.markSkill("olxianlve"); + } + }, + intro: { + content: function (name, player) { + return "已声明" + (player.isUnderControl(true) ? "【" + get.translation(name) + "】" : "一个牌名"); + }, + }, + group: ["olxianlve_use", "olxianlve_count"], + subSkill: { + count: { + trigger: { global: "useCard1" }, + silent: true, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return event.player != player && event.card.name == player.storage.olxianlve; + }, + content: function () { + if (!trigger.olxianlve_map) trigger.olxianlve_map = {}; + trigger.olxianlve_map[player.playerid] = true; + }, + }, + use: { + audio: "olxianlve", + trigger: { global: "useCardAfter" }, + forced: true, + locked: false, + usable: 1, + filter: function (event, player) { + return event.player != player && event.olxianlve_map && event.olxianlve_map[player.playerid] && event.card.name == player.storage.olxianlve; + }, + content: function () { + "step 0"; + player.draw(2); + "step 1"; + var cards = result; + if (get.itemtype(cards) != "cards") { + event.goto(5); + return; + } + var hs = player.getCards("h"); + cards = cards.filter(function (card) { + return hs.includes(card); + }); + if (!cards.length) { + event.goto(5); + return; + } + event.cards = cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + event.ai_list = []; + "step 2"; + player.chooseCardTarget({ + filterCard: function (card) { + return _status.event.cards.includes(card) && !card.hasGaintag("olxianlve"); + }, + cards: cards, + filterTarget: lib.filter.notMe, + selectCard: [1, cards.length], + prompt: "是否将得到的牌分配给其他角色?", + ai1: function (card) { + if (!ui.selected.cards.length) return 1; + return 0; + }, + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + var val = target.getUseValue(card); + if (target.isPhaseUsing() && get.type2(card) == "trick") val *= 3; + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); + }, + }); + "step 3"; + if (result.bool) { + var res = result.cards, + target = result.targets[0].playerid; + player.addGaintag(res, "olxianlve"); + cards.removeArray(res); + if (!event.given_map[target]) event.given_map[target] = []; + event.given_map[target].addArray(res); + if (result.targets[0].isPhaseUsing() && get.type2(res[0]) == "trick") event.ai_list.push(res[0].name); + if (cards.length) event.goto(2); + } + "step 4"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var map = [], + cards = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + map.push([source, event.given_map[i]]); + cards.addArray(event.given_map[i]); + } + if (map.length) + game.loseAsync({ + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + "step 5"; + var list = lib.inpile + .filter(function (i) { + return get.type2(i) == "trick"; + }) + .map(function (i) { + return ["锦囊", "", i]; + }); + if (!list.length) event.finish(); + else + player + .chooseButton([get.prompt("olxianlve"), [list, "vcard"]]) + .set("list", event.ai_list) + .set("ai", function (button) { + if (_status.event.list.includes(button.link[2])) return 2 + Math.random(); + switch (button.link[2]) { + case "wuxie": + return 0.6 + Math.random(); + case "wuzhong": + case "dongzhuxianji": + return 0.5 + Math.random(); + case "guohe": + case "zhujinqiyuan": + return 0.4 + Math.random(); + default: + return Math.random(); + } + }); + "step 6"; + if (result.bool) { + var name = result.links[0][2]; + player.storage.olxianlve = name; + player.markSkill("olxianlve"); + } + }, + }, + }, + }, + olzaowang: { + mode: ["identity"], + available: function (mode) { + if (mode == "identity" && _status.mode == "purple") return false; + }, + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "water", + filterTarget: true, + content: function () { + player.awakenSkill("olzaowang"); + target.gainMaxHp(); + target.recover(); + target.draw(3); + target.addSkills("olzaowang2"); + }, + ai: { + order: 2, + result: { + target: function (player, target) { + if (player.hasUnknown(2)) return 0; + if (target.identity == "zhong") return 20; + if (target.identity == "zhu") return 10; + if (target.identity == "nei") return 5; + if (!target.hasFriend()) return 5; + return 0; + }, + }, + }, + }, + olzaowang2: { + charlotte: true, + trigger: { global: "dieBegin" }, + forced: true, + filter: function (event, player) { + return event.player.identity == "zhu" && (player.identity == "zhong" || player.identity == "mingzhong"); + }, + logTarget: "player", + skillAnimation: true, + animationColor: "orange", + content: function () { + game.broadcastAll( + function (player, target) { + target.identity = player.identity; + if (player.identity == "mingzhong") game.zhong = target; + delete target.isZhu; + player.identity = "zhu"; + game.zhu = player; + player.showIdentity(); + target.showIdentity(); + }, + player, + trigger.player + ); + event.trigger("zhuUpdate"); + }, + mark: true, + marktext: "王", + intro: { content: "造了个王" }, + group: "olzaowang2_kill", + subSkill: { + kill: { + trigger: { player: "die" }, + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return player.identity == "fan" && event.source && (event.source.identity == "zhu" || event.source.identity == "zhong" || event.source.identity == "mingzhong"); + }, + content: function () { + game.over(game.me.identity == "zhu" || game.me.identity == "zhong" || game.me.identity == "mingzhong"); + }, + }, + }, + }, + //冯方女 + zhuangshu: { + audio: 2, + trigger: { global: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return event.player.isIn() && event.player.hasEmptySlot(5) && player.hasCard(lib.skill.zhuangshu.filterCard, "he"); + }, + filterCard: function (card) { + if (_status.connectMode) return true; + var type = get.type2(card); + return type == "basic" || type == "trick" || type == "equip"; + }, + content: function () { + "step 0"; + player + .chooseToDiscard("he", get.prompt("zhuangshu", trigger.player), "弃置一张牌,并根据此牌的类型,按如下关系将一张宝物牌置入该角色的装备区:{<基本牌,【琼梳】>,<锦囊牌,【犀梳】>,<装备牌,【金梳】>}。", function (card) { + var type = get.type2(card); + return type == "basic" || type == "trick" || type == "equip"; + }) + .set("ai", function (card) { + var player = _status.event.player; + if (get.attitude(player, _status.event.getTrigger().player) < 4) return 0; + var name = "zhuangshu_" + get.type2(card, player); + if ( + game.hasPlayer(function (current) { + return current.getEquip(name) && get.attitude(player, current) > 0; + }) + ) + return 0; + return 7 - get.value(card); + }).logSkill = ["zhuangshu", trigger.player]; + "step 1"; + if (result.bool) { + var name = "zhuangshu_" + get.type2(result.cards[0], result.cards[0].original == "h" ? player : false); + if (lib.card[name] && trigger.player.isIn && trigger.player.hasEmptySlot(5)) { + var target = game.findPlayer(function (current) { + var equip = current.getEquip(name); + return equip && equip.name == name; + }); + if (target) { + var card = target.getEquip(name); + target.$give(card, trigger.player, false); + } else { + var card = game.createCard(name, lib.card[name].cardcolor, 12); + trigger.player.$gain2(card, false); + } + game.delayx(); + trigger.player.equip(card); + } + } + }, + group: "zhuangshu_gameStart", + subSkill: { + gameStart: { + trigger: { global: "phaseBefore" }, + direct: true, + filter: function (event, player) { + return game.phaseNumber == 0; + }, + content: function () { + "step 0"; + player.chooseButton([get.prompt("zhuangshu"), [["zhuangshu_basic", "zhuangshu_trick", "zhuangshu_equip"], "vcard"]]).set("filterButton", function (button) { + return !game.hasPlayer(function (current) { + return current.getEquip(button.link[2]); + }); + }); + "step 1"; + if (result.bool) { + player.logSkill("zhuangshu"); + var name = result.links[0][2], + card = game.createCard(name, lib.card[name].cardcolor, 12); + player.$gain2(card, false); + game.delayx(); + player.equip(card); + } + }, + }, + }, + }, + chuiti: { + audio: 2, + usable: 1, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], + }, + direct: true, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false) return false; + return game.hasPlayer(function (current) { + if (player != current) { + var cards = current.getEquips(5); + if (!cards.some(card => card.name.indexOf("zhuangshu_") == 0)) return false; + } + var evt = event.getl(current); + if (!evt || !evt.cards2) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d" && player.hasUseTarget(i)) return true; + } + return false; + }); + }, + content: function () { + "step 0"; + var cards = []; + game.countPlayer(function (current) { + if (player != current) { + var cards2 = current.getEquips(5); + if (!cards2.some(card => card.name.indexOf("zhuangshu_") == 0)) return false; + } + var evt = trigger.getl(current); + for (var i of evt.cards2) { + if (get.position(i, true) == "d" && player.hasUseTarget(i)) cards.push(i); + } + return false; + }); + player.chooseButton(["垂涕:是否使用其中的一张牌?", cards]).set("ai", function (button) { + return _status.event.player.getUseValue(button.link); + }); + "step 1"; + if (result.bool) { + player.$gain2(result.links[0], false); + game.delayx(); + player.chooseUseTarget(true, result.links[0], false).logSkill = "chuiti"; + } else player.storage.counttrigger.chuiti--; + }, + }, + zhuangshu_basic: { + equipSkill: true, + trigger: { player: "damageBegin2" }, + direct: true, + filter: function (event, player) { + var equip = player.getEquip("zhuangshu_basic"); + return ( + event.num <= + player.countCards("he", function (card) { + return card != equip; + }) + ); + }, + content: function () { + "step 0"; + player + .chooseToDiscard("he", trigger.num, get.prompt("zhuangshu_basic"), "弃置" + get.cnNumber(trigger.num) + "张牌并防止伤害", function (card, player) { + return card != player.getEquip("zhuangshu_basic"); + }) + .set("ai", function (card) { + var player = _status.event.player; + return 4 + player.getUseValue(card) - get.value(card, player); + }); + "step 1"; + if (result.bool) trigger.cancel(); + }, + /*usable:1, + trigger:{player:'useCard2'}, + direct:true, + filter:function(event,player){ + if(event.targets.length!=1) return false; + if(event.card.name!='sha'&&get.type(event.card)!='trick') return false; + var info=get.info(event.card); + if(info.allowMultiple==false) return false; + if(event.targets&&!info.multitarget){ + var target=event.targets[0],hp=target.hp,hs=target.countCards('h'),card=event.card; + return game.hasPlayer(function(current){ + return current!=target&¤t!=player&&(current.hp==hp||current.countCards('h')==hs)&&lib.filter.targetEnabled2(card,player,current); + }); + } + return false; + }, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('zhuangshu_basic'),'为'+get.translation(trigger.card)+'增加一个满足条件的额外目标',function(card,player,current){ + var card=_status.event.getTrigger().card,target=_status.event.target,hp=target.hp,hs=target.countCards('h'); + return current!=target&¤t!=player&&(current.hp==hp||current.countCards('h')==hs)&&lib.filter.targetEnabled2(card,player,current); + }).set('target',trigger.targets[0]).set('ai',function(target){ + var card=_status.event.getTrigger().card,player=_status.event.player; + return get.effect(target,card,player,player); + }); + 'step 1' + if(result.bool){ + if(player!=event.player&&!player.isOnline()) game.delayx(); + } + else{ + player.storage.counttrigger.zhuangshu_basic--; + event.finish(); + } + 'step 2' + var targets=result.targets; + player.logSkill('zhuangshu_basic',targets); + trigger.targets.addArray(targets); + trigger.directHit.addArray(targets); + },*/ + }, + zhuangshu_trick: { + trigger: { player: ["phaseJudgeBefore"] }, + equipSkill: true, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("判定阶段", "弃牌阶段", "cancel2") + .set("prompt", get.prompt("zhuangshu_trick")) + .set("prompt2", "跳过本回合的判定阶段或弃牌阶段") + .set("ai", function () { + var player = _status.event.player; + if ( + player.hasCard(function (card) { + return ( + get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) < 0 + ); + }, "j") + ) + return "判定阶段"; + return "弃牌阶段"; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("zhuangshu_trick"); + if (result.control == "判定阶段") { + trigger.cancel(); + game.log(player, "跳过了", "#y判定阶段"); + } else { + player.skip("phaseDiscard"); + game.log(player, "跳过了", "#g弃牌阶段"); + } + } + }, + }, + zhuangshu_equip: { + trigger: { player: "phaseUseEnd" }, + forced: true, + equipSkill: true, + filter: function (event, player) { + return player.countCards("h") < Math.min(5, player.getHandcardLimit()); + }, + content: function () { + player.drawTo(Math.min(5, player.getHandcardLimit())); + }, + }, + //杨仪 + oljuanxia: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("oljuanxia"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + list = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if (!info || info.type != "trick" || info.notarget || (info.selectTarget && info.selectTarget != 1)) continue; + if (!player.canUse(name, target, false)) continue; + var eff = get.effect(target, { name: name }, player, player); + if (eff > 0) list.push(eff); + } + list.sort().reverse(); + if (!list.length) return 0; + return list[0] + (list[1] || 0) + (list[2] || 0); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oljuanxia", target); + } else event.finish(); + "step 2"; + var list = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if (!info || info.type != "trick" || info.notarget || (info.selectTarget && info.selectTarget != 1)) continue; + list.push(name); + } + if (!list.length) event.finish(); + else { + event.list = list; + event.count = 0; + } + "step 3"; + var list = event.list.filter(function (name) { + return player.canUse(name, target, false); + }); + if (list.length) { + var next = player.chooseButton(["视为对" + get.translation(target) + "使用一张牌", [list, "vcard"]]).set("ai", function (button) { + var evt = _status.event.getParent(); + return get.effect(evt.target, { name: button.link[2] }, evt.player, evt.player); + }); + if (event.count == 0) next.set("forced", true); + } else { + event.stopped = true; + event.goto(5); + } + "step 4"; + if (result.bool) { + event.count++; + var name = result.links[0][2]; + event.list.remove(name); + player.useCard({ name: name, isCard: true }, target, false); + } else event.stopped = true; + "step 5"; + if (target.isIn() && event.count > 0) { + if (event.count < 3 && !event.stopped && event.list.length > 0) event.goto(3); + else { + target.addTempSkill("oljuanxia_counter", { player: "phaseAfter" }); + if (!target.storage.oljuanxia_counter) target.storage.oljuanxia_counter = {}; + if (!target.storage.oljuanxia_counter[player.playerid]) target.storage.oljuanxia_counter[player.playerid] = 0; + target.storage.oljuanxia_counter[player.playerid] += event.count; + } + } + }, + subSkill: { + counter: { + trigger: { player: "phaseEnd" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + var map1 = _status.connectMode ? lib.playerOL : game.playerMap, + map2 = player.storage.oljuanxia_counter; + if (!map2) return false; + for (var i in map2) { + if (map1[i] && map1[i].isIn() && player.canUse("sha", map1[i], false)) return true; + } + return false; + }, + logTarget: function (event, player) { + var list = []; + var map1 = _status.connectMode ? lib.playerOL : game.playerMap, + map2 = player.storage.oljuanxia_counter; + if (!map2) return false; + for (var i in map2) { + if (map1[i] && map1[i].isIn()) list.push(map1[i]); + } + return list; + }, + content: function () { + "step 0"; + var list = []; + var map1 = _status.connectMode ? lib.playerOL : game.playerMap, + map2 = player.storage.oljuanxia_counter; + if (!map2) return false; + for (var i in map2) { + if (map1[i] && map1[i].isIn()) list.push(map1[i]); + } + list.sortBySeat(); + event.num = 0; + event.targets = list; + "step 1"; + var target = targets[num]; + event.target = target; + if (target.isIn() && player.canUse("sha", target, false)) + player + .chooseBool("狷狭:是否视为对" + get.translation(target) + "依次使用" + get.cnNumber(player.storage.oljuanxia_counter[target.playerid]) + "张【杀】?") + .set("goon", get.effect(target, { name: "sha" }, player, player) > 0) + .set("ai", () => _status.event.goon); + "step 2"; + event.num++; + if (result.bool) event.count = player.storage.oljuanxia_counter[target.playerid]; + else if (event.num < targets.length) event.goto(1); + else event.finish(); + "step 3"; + event.count--; + if (target.isIn() && player.canUse("sha", target, false)) player.useCard({ name: "sha", isCard: true }, target, false); + if (event.count > 0) event.redo(); + else if (event.num < targets.length) event.goto(1); + }, + }, + }, + }, + oldingcuo: { + trigger: { + player: "damageEnd", + source: "damageSource", + }, + usable: 1, + content: function () { + "step 0"; + player.draw(2); + "step 1"; + if (Array.isArray(result) && result.length > 1) { + var color = get.color(result[0], player); + for (var i = 1; i < result.length; i++) { + if (get.color(result[i], player) != color) { + if (player.countCards("h")) player.chooseToDiscard("h", true); + break; + } + } + } + }, + }, + //左棻 + zhaosong: { + trigger: { global: "phaseDrawAfter" }, + logTarget: "player", + filter: function (event, player) { + if (player == event.player || !event.player.countCards("h")) return false; + var types = ["basic", "trick", "equip"]; + for (var i of types) { + if (event.player.hasMark("zhaosong_" + i)) return false; + } + return true; + }, + prompt2: "令其交给你一张手牌,并根据类型获得对应的标记", + check: function (event, player) { + return get.attitude(_status.event.player, event.player) > 0; + }, + content: function () { + "step 0"; + event.target = trigger.player; + event.target.chooseCard("h", true, get.translation(player) + "发动了【诏颂】;请交给其一张手牌"); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + target.give(card, player, "give"); + var type = get.type2(card, target); + if (lib.skill["zhaosong_" + type]) { + target.addSkill("zhaosong_" + type); + target.addMark("zhaosong_" + type); + } + } + }, + subSkill: { + basic: { + marktext: "颂", + intro: { + name: "诏颂(颂)", + name2: "颂", + content: "当你使用【杀】选择唯一目标时,你可移去“颂”,并为此【杀】增加至多两个目标。", + }, + trigger: { player: "useCard2" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return ( + player.hasMark("zhaosong_basic") && + event.card.name == "sha" && + event.targets.length == 1 && + game.hasPlayer(function (current) { + return current != player && current != event.targets[0] && lib.filter.targetEnabled2(event.card, player, current); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget([1, 2], "是否弃置“颂”标记?", "为" + get.translation(trigger.card) + "增加至多两个目标", function (card, player, target) { + var evt = _status.event.getTrigger(); + return target != player && target != evt.targets[0] && lib.filter.targetEnabled2(evt.card, player, target); + }) + .set("ai", function (target) { + var evt = _status.event.getTrigger(); + return get.effect(target, evt.card, evt.player, evt.player); + }); + "step 1"; + if (result.bool) { + if (player != event.player && !player.isOnline()) game.delayx(); + //player.addTempSkill('zhaosong_shaloss'); + } else event.finish(); + "step 2"; + var targets = result.targets; + player.logSkill("zhaosong_basic", targets); + player.removeMark("zhaosong_basic", 1); + player.removeSkill("zhaosong_basic"); + trigger.targets.addArray(targets); + trigger.zhaosong_basic = true; + }, + } /* + shaloss:{ + trigger:{player:'useCardAfter'}, + forced:true, + charlotte:true, + filter:function(event,player){ + if(!event.zhaosong_basic) return false; + var num=0; + player.getHistory('sourceDamage',function(evt){ + if(evt.card==event.card) num+=evt.num; + }); + return num<2; + }, + content:function(){ + player.loseHp(); + }, + },*/, + trick: { + marktext: "诔", + intro: { + name: "诏颂(诔)", + name2: "诔", + content: "当你进入濒死状态时,你可移去“诔”,然后将体力回复至1点并摸一张牌。", + }, + trigger: { player: "dying" }, + prompt: "是否弃置“诔”标记?", + prompt2: "回复体力至1点并摸一张牌。", + charlotte: true, + onremove: true, + filter: function (event, player) { + return player.hasMark("zhaosong_trick") && player.hp < 1; + }, + check: function (event, player) { + if ( + player.maxHp < 2 || + player.countCards("h", function (card) { + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, event.player, "unchanged", "cardSavable", player); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") savable = savable(card, player, event.player); + return savable; + }) >= + 1 + event.num - event.player.hp + ) + return false; + return true; + }, + content: function () { + player.removeMark("zhaosong_trick", 1); + player.removeSkill("zhaosong_trick"); + //player.loseMaxHp(); + if (player.hp < 1) player.recover(1 - player.hp); + player.draw(); + }, + }, + equip: { + marktext: "赋", + intro: { + name: "诏颂(赋)", + name2: "赋", + content: "出牌阶段开始时,你可移去“赋”并弃置一名角色区域内的至多两张牌。", + }, + trigger: { player: "phaseUseBegin" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return ( + player.hasMark("zhaosong_equip") && + game.hasPlayer(function (current) { + return current.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, current); + }, "hej"); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget("是否弃置“赋”标记?", "弃置一名角色区域内的至多两张牌", function (card, player, current) { + return current.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, current); + }, "hej"); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target) > 0 ? 2 : 1; + return get.effect(target, { name: "guohe_copy" }, player, player) * att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("zhaosong_equip", target); + player.removeMark("zhaosong_equip", 1); + player.removeSkill("zhaosong_equip"); + player.discardPlayerCard(target, true, "hej", [1, 2]); + } + }, + }, + }, + }, + lisi: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (player == _status.currentPhase || !event.cards.filterInD().length) return false; + var hs = player.countCards("h"); + return game.hasPlayer(function (current) { + return current != player && current.countCards("h") <= hs; + }); + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("lisi"), "将" + get.translation(trigger.cards.filterInD()) + "交给一名手牌数不大于你的其他角色", function (card, player, target) { + return target != player && target.countCards("h") <= player.countCards("h"); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("lisi", target); + target.gain(trigger.cards.filterInD(), "gain2"); + } + }, + }, + //王荣 + olfengzi: { + audio: 2, + trigger: { player: "useCard" }, + direct: true, + usable: 1, + filter: function (event, player) { + if (event.olfengzi_buff || !event.targets.length || !player.isPhaseUsing() || player.hasSkill("olfengzi_buff")) return false; + var type = get.type(event.card, false); + if (type != "basic" && type != "trick") return false; + return player.hasCard(function (i) { + if (_status.connectMode) return true; + return get.type2(i, player) == type; + }, "h"); + }, + content: function () { + "step 0"; + if (player != game.me && !player.isUnderControl() && !player.isOnline()) game.delayx(); + var type = get.type(trigger.card, false); + player + .chooseToDiscard("h", get.prompt("olfengzi"), "弃置一张" + get.translation(type) + "牌,令" + get.translation(trigger.card) + "结算两次", function (card, player) { + return get.type2(card, player) == _status.event.type; + }) + .set("type", type) + .set("ai", function (card) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + if (trigger.card.name == "tiesuo") return 0; + var num = 0; + for (var i of trigger.targets) num += get.effect(i, trigger.card, player, player); + if (num <= 0) return 0; + return 7 - get.value(card); + }).logSkill = "olfengzi"; + "step 1"; + if (result.bool) { + trigger.effectCount++; + } else player.storage.counttrigger.olfengzi--; + }, + /*subSkill:{ + buff:{ + trigger:{global:'useCardToTargeted'}, + forced:true, + charlotte:true, + popup:false, + lastDo:true, + filter:function(event,player){ + return (event.parent.olfengzi_buff==player&&event.targets.length==event.parent.triggeredTargets4.length); + }, + content:function(){ + trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); + trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); + }, + onremove:function(player){ + delete player.storage.counttrigger.olfengji; + }, + }, + },*/ + }, + oljizhan: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + "step 0"; + trigger.changeToZero(); + var card = get.cards()[0]; + game.cardsGotoOrdering(card); + event.cards = [card]; + event.num = get.number(card, false); + player.showCards(card, get.translation(player) + "发动了【吉占】"); + "step 1"; + var str = get.strNumber(num); + player + .chooseControl("大于" + str, "小于" + str, "cancel2") + .set("prompt", "吉占:猜测下一张牌的点数") + .set("choice", num < 7 ? 0 : 1) + .set("ai", () => _status.event.choice); + "step 2"; + var card = get.cards()[0]; + game.cardsGotoOrdering(card); + event.cards.push(card); + var num = get.number(card, false); + if ((num > event.num && result.index == 0) || (num < event.num && result.index == 1)) { + event.num = num; + event.goto(1); + } + player.showCards(card); + "step 3"; + player.gain(cards, "gain2"); + }, + }, + olfusong: { + audio: 2, + forceDie: true, + trigger: { player: "die" }, + skillAnimation: true, + animationColor: "gray", + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.maxHp > player.maxHp; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("olfusong"), "令一名体力上限大于你的其他角色获得〖丰姿〗或〖吉占〗", function (card, player, target) { + return target.maxHp > player.maxHp; + }) + .set("forceDie", true) + .set("ai", target => get.attitude(_status.event.player, target)); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olfusong", target); + target + .chooseControl("olfengzi", "oljizhan") + .set("prompt", "令" + get.translation(target) + "获得其中一个技能") + .set("ai", () => (Math.random() > 0.5 ? 0 : 1)); + } else event.finish(); + "step 2"; + target.addSkills(result.control); + }, + }, + //邓芝 + olxiuhao: { + audio: 2, + trigger: { global: "damageBegin4" }, + usable: 1, + filter: function (event, player) { + return event.source && event.source.isIn() && [event.source, event.player].includes(player) && event.source != event.player; + }, + logTarget: function (event, player) { + return player == event.player ? event.source : event.player; + }, + check: function (event, player) { + _status.olxiuhao_judging = true; + var bool = false; + if (get.attitude(player, event.player) > 0) bool = true; + else if (2 * get.effect(event.source, { name: "draw" }, player, _status.event.player) + event.num * get.damageEffect(player, event.source, _status.event.player, event.nature) > 0) bool = true; + else if (event.source.hasSkillTag("nogain")) bool = true; + delete _status.olxiuhao_judging; + return bool; + }, + content: function () { + trigger.cancel(); + trigger.source.draw(2); + }, + ai: { + effect: { + target: function (card, player, target) { + if (!_status.olxiuhao_judging && get.tag(card, "damage") && get.attitude(target, player) > 0 && player != target && (!target.storage.counttrigger || !target.storage.counttrigger.olxiuhao)) return [0, 0.5, 0, 0.5]; + }, + player: function (card, player, target) { + if (!_status.olxiuhao_judging && get.tag(card, "damage") && get.attitude(player, target) > 0 && player != target && (!player.storage.counttrigger || !player.storage.counttrigger.olxiuhao)) return [0, 0.5, 0, 0.5]; + }, + }, + }, + }, + olsujian: { + trigger: { player: "phaseDiscardBefore" }, + forced: true, + content: function () { + trigger.setContent(lib.skill.olsujian.phaseDiscard); + }, + phaseDiscard: function () { + "step 0"; + game.log(player, "进入了弃牌阶段"); + game.broadcastAll(function (player) { + if (lib.config.show_phase_prompt) { + player.popup("弃牌阶段", null, false); + } + }, player); + event.trigger("phaseDiscard"); + "step 1"; + var cards = lib.skill.olsujian.update(player); + if (!cards.length) event.finish(); + else { + event.cards = cards; + var str = get.translation(cards); + player + .chooseControl() + .set("choiceList", ["将" + str + "分配给任意名其他角色", "弃置" + str + "并弃置一名其他角色至多等量的牌"]) + .set("ai", function () { + var cards = _status.event.getParent().cards, + player = _status.event.player; + if ( + !game.hasPlayer(function (current) { + return player !== current && get.attitude(player, current) > 0; + }) + ) + return 1; + if ( + game.hasPlayer(function (current) { + var att = get.attitude(player, current); + return ( + att && + current.countDiscardableCards(player, "he", function (i) { + if (att > 0) return get.value(i, current) < 0; + return get.value(i, current) >= 4; + }) >= cards.length && + get.effect(current, { name: "guohe_copy2" }, player, player) > 0 + ); + }) + ) + return 1; + return 0; + }); + } + "step 2"; + if (result.index == 1) { + cards = event.cards.filter(function (i) { + return lib.filter.cardDiscardable(i, player, "olsujian"); + }); + if (cards.length) { + event.num = cards.length; + player.discard(cards); + event.cards = cards; + } else event.finish(); + } else event.goto(5); + "step 3"; + if ( + game.hasPlayer(function (current) { + return current != player && current.countDiscardableCards(player, "he") > 0; + }) + ) { + player + .chooseTarget(true, "弃置一名其他角色的至多" + get.cnNumber(num) + "张牌", function (card, player, current) { + return current != player && current.countDiscardableCards(player, "he") > 0; + }) + .set("ai", function (current) { + var att = get.attitude(player, current); + if ( + current.countDiscardableCards(player, "he", function (i) { + if (att > 0) return get.value(i, current) >= 4; + return get.value(i, current) <= 0; + }) >= num + ) + return 4 * get.effect(current, { name: "guohe_copy2" }, player, player); + return get.effect(current, { name: "guohe_copy2" }, player, player); + }); + } else event.finish(); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, true, [1, num]); + } + event.finish(); + "step 5"; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + "step 6"; + player.chooseCardTarget({ + filterCard: function (card) { + return card.hasGaintag("olsujian"); + }, + filterTarget: lib.filter.notMe, + selectCard: [1, cards.length], + forced: true, + prompt: "请选择要分配的卡牌和目标", + ai1: function (card) { + if (!ui.selected.cards.length) return 1; + return 0; + }, + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + var val = target.getUseValue(card); + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); + }, + }); + "step 7"; + if (result.bool) { + var res = result.cards, + target = result.targets[0].playerid; + player.removeGaintag("olsujian", res); + player.addGaintag(res, "olsujian_given"); + cards.removeArray(res); + if (!event.given_map[target]) event.given_map[target] = []; + event.given_map[target].addArray(res); + if (cards.length) event.goto(6); + } else event.finish(); + "step 8"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var map = [], + cards = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + map.push([source, event.given_map[i]]); + cards.addArray(event.given_map[i]); + } + if (map.length) + game.loseAsync({ + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + "step 9"; + event.cards = []; + }, + update: function (player) { + player.removeGaintag("olsujian"); + var hs = player.getCards("h"); + player.getHistory("gain", function (evt) { + hs.removeArray(evt.cards); + }); + if (hs.length) player.addGaintag(hs, "olsujian"); + return hs; + }, + group: "olsujian_sync", + subSkill: { + sync: { + trigger: { player: ["phaseBeginStart", "gainBegin"] }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (event.name == "gain") return player == _status.currentPhase && event.getParent("olsujian").player != player; + return true; + }, + content: function () { + lib.skill.olsujian.update(player); + }, + }, + }, + }, + //卞夫人 + fuwei: { + audio: "wanwei", + trigger: { + player: "loseAfter", + global: "gainAfter", + }, + filter: function (event, player) { + var evt = event; + if (event.name == "lose") { + if (event.type != "discard") return false; + evt = event.getParent(); + } + if (evt[event.name == "gain" ? "bySelf" : "notBySelf"] != true) return false; + var evtx = event.getl(player); + return evtx && evtx.cards2 && evtx.cards2.length > 0; + }, + prompt2: function (event, player) { + var evt = event.getl(player), + origins = evt.cards2.map(function (i) { + return get.name(i, evt.hs.includes(i) ? player : false); + }); + return "从牌堆中获得" + get.translation(origins) + ";若没有则改为摸一张牌"; + }, + usable: 1, + content: function () { + var num = 0, + cards = [], + evt = trigger.getl(player), + origins = evt.cards2.map(function (i) { + return get.name(i, evt.hs.includes(i) ? player : false); + }); + for (var i of origins) { + var card = get.cardPile2(function (card) { + return card.name == i && !cards.includes(card); + }); + if (card) cards.push(card); + else num++; + } + if (cards.length) player.gain(cards, "gain2"); + if (num) player.draw(num); + }, + }, + yuejian: { + audio: 2, + usable: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return player != event.player && event.targets && event.targets.includes(player) && player.countCards("h") > 0; + }, + prompt2: function (event, player) { + var suit = get.suit(event.card), + hs = player.getCards("h"), + cards = event.cards.filterInD(); + if (!lib.suit.includes(suit) || !cards.length) { + return "展示所有手牌,然后无事发生"; + } + for (var i of hs) { + if (get.suit(i) == suit) { + return "展示所有手牌,然后无事发生"; + } + } + return '展示所有手牌,然后获得' + get.translation(cards) + ""; + }, + check: function (event, player) { + var suit = get.suit(event.card), + hs = player.getCards("h"), + cards = event.cards.filterInD(); + if (!lib.suit.includes(suit) || !cards.length) { + return false; + } + for (var i of hs) { + if (get.suit(i) == suit) { + return false; + } + } + return true; + }, + content: function () { + "step 0"; + player.showHandcards(get.translation(player) + "发动了【约俭】"); + var suit = get.suit(trigger.card), + hs = player.getCards("h"); + if (!lib.suit.includes(suit)) { + event.finish(); + return; + } + for (var i of hs) { + if (get.suit(i) == suit) { + event.finish(); + return; + } + } + "step 1"; + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); + }, + }, + //杜袭 + quxi: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "water", + filter: function (event, player) { + if (player.isTurnedOver()) return false; + var list = game.filterPlayer(target => target != player && !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose")); + if (list.length < 2) return false; + var nf = list[0].countCards("h"); + for (var i = 1; i < list.length; i++) { + if (list[i].countCards("h") != nf) return true; + } + return false; + }, + content: function () { + "step 0"; + player + .chooseTarget(2, get.prompt("quxi"), "选择两名手牌数不同的其他角色。你将翻至背面,令这两名角色中手牌数较少的角色获得另一名角色的一张牌并获得一枚“丰”,另一名角色获得一枚“歉”。", function (card, player, target) { + if (player == target || target.hasMark("quxi_gain") || target.hasMark("quxi_lose")) return false; + if (!ui.selected.targets.length) return true; + return target.countCards("h") != ui.selected.targets[0].countCards("h"); + }) + .set("complexTarget", true) + .set("ai", function (target) { + if (!ui.selected.targets.length) { + var player = _status.event.player, + hs = target.countCards("h"); + if ( + game.hasPlayer(function (current) { + return current != player && current != target && current.countCards("h") > hs && !current.hasMark("quxi_gain") && !current.hasMark("quxi_lose"); + }) + ) + return get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + return 0; + } + if (target.countCards("h") > ui.selected.targets[0].countCards("h")) return -get.attitude(_status.event.player, target); + return 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("quxi", result.targets); + player.awakenSkill("quxi"); + player.skip("phaseDiscard"); + if (result.targets[0].countCards("h") > result.targets[1].countCards("h")) result.targets.reverse(); + event.gainner = result.targets[0]; + event.giver = result.targets[1]; + player.turnOver(); + } else event.finish(); + "step 2"; + event.gainner.gainPlayerCard(event.giver, true, "he"); + "step 3"; + player.addSkill("quxi_effect"); + event.gainner.addMark("quxi_gain", 1); + event.giver.addMark("quxi_lose", 1); + }, + subSkill: { + effect: { + global: "quxi_gainlose", + trigger: { global: ["roundStart", "die"] }, + charlotte: true, + direct: true, + filter: function (event, player) { + if (event.name == "die") return event.player.countMark("quxi_gain") > 0 || event.player.countMark("quxi_lose") > 0; + return game.hasPlayer(function (target) { + return target != player && (target.countMark("quxi_gain") > 0 || target.countMark("quxi_lose") > 0); + }); + }, + content: function () { + "step 0"; + if (trigger.name == "die") { + var gain = trigger.player.countMark("quxi_gain"), + lose = trigger.player.countMark("quxi_lose"); + player + .chooseTarget("是否令一名角色获得" + get.translation(trigger.player) + "的“" + (gain && lose ? "丰”和“歉" : gain ? "丰" : "歉") + "”标记?", function (card, player, target) { + return !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose"); + }) + .set("goon", gain - lose) + .set("ai", function (target) { + var evt = _status.event; + return evt.goon * get.attitude(evt.player, target); + }); + } else event.goto(2); + "step 1"; + if (result.bool) { + var targets = result.targets; + if (targets.length < 2) targets.unshift(trigger.player); + player.logSkill("quxi_effect", targets, false); + player.line2(targets); + var gain = targets[0].countMark("quxi_gain"), + lose = targets[0].countMark("quxi_lose"); + if (gain) { + targets[0].removeMark("quxi_gain", gain); + targets[1].addMark("quxi_gain", gain); + } + if (lose) { + targets[0].removeMark("quxi_lose", lose); + targets[1].addMark("quxi_lose", lose); + } + game.delayx(); + event.finish(); + } + "step 2"; + if ( + game.hasPlayer(function (target) { + return target.countMark("quxi_gain") > 0; + }) + ) + player + .chooseTarget(2, "是否转移“丰”标记?", function (card, player, target) { + if (ui.selected.targets.length) return !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose"); + return target.countMark("quxi_gain") > 0; + }) + .set("complexTarget", true) + .set("complexSelect", true) + .set("targetprompt", ["移走标记", "获得标记"]) + .set("ai", function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) { + return -get.attitude(player, target); + } + return get.attitude(player, target); + }); + else event.goto(4); + "step 3"; + if (result.bool) { + var targets = result.targets; + player.logSkill("quxi_effect", targets, false); + player.line2(targets); + var gain = targets[0].countMark("quxi_gain"); + if (gain) { + targets[0].removeMark("quxi_gain", gain); + targets[1].addMark("quxi_gain", gain); + } + game.delayx(); + } + "step 4"; + if ( + game.hasPlayer(function (target) { + return target.countMark("quxi_lose") > 0; + }) + ) + player + .chooseTarget(2, "是否转移“歉”标记?", function (card, player, target) { + if (ui.selected.targets.length) return !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose"); + return target.countMark("quxi_lose") > 0; + }) + .set("complexTarget", true) + .set("complexSelect", true) + .set("targetprompt", ["移走标记", "获得标记"]) + .set("ai", function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) { + return get.attitude(player, target); + } + return -get.attitude(player, target); + }); + else event.finish(); + "step 5"; + if (result.bool) { + var targets = result.targets; + player.logSkill("quxi_effect", targets, false); + player.line2(targets); + var gain = targets[0].countMark("quxi_lose"); + if (gain) { + targets[0].removeMark("quxi_lose", gain); + targets[1].addMark("quxi_lose", gain); + } + game.delayx(); + } + }, + }, + gainlose: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + filter: function (event, player) { + if (event.numFixed) return false; + return player.countMark("quxi_gain") - player.countMark("quxi_lose") != 0; + }, + content: function () { + trigger.num += player.countMark("quxi_gain") - player.countMark("quxi_lose"); + }, + }, + gain: { + marktext: "丰", + intro: { + name: "驱徙(丰)", + name2: "丰", + content: "mark", + }, + }, + lose: { + marktext: "歉", + intro: { + name: "驱徙(歉)", + name2: "歉", + content: "mark", + }, + }, + }, + }, + bixiong: { + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + forced: true, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false || event.getParent("phaseDiscard").player != player) return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; + }, + content: function () { + var cards = [], + hs = trigger.getl(player).hs; + for (var i of hs) cards.add(get.suit(i, player)); + player.addTempSkill("bixiong2", { player: "phaseBegin" }); + player.markAuto("bixiong2", cards); + }, + }, + bixiong2: { + onremove: true, + mod: { + targetEnabled: function (card, player, target) { + if (player !== target && target.getStorage("bixiong2").includes(get.suit(card))) return false; + }, + }, + intro: { content: "不能成为其他角色$牌的目标" }, + }, + //高干 + juguan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + event.filterCard( + { + name: "sha", + }, + player, + event + ) || + event.filterCard( + { + name: "juedou", + }, + player, + event + ) + ); + }, + chooseButton: { + dialog: function () { + return ui.create.dialog("拒关", [["sha", "juedou"], "vcard"]); + }, + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard( + { + name: button.link[2], + }, + player, + evt + ); + }, + check: function (button) { + return ( + _status.event.player.getUseValue({ + name: button.link[2], + }) * (button.link[2] == "juedou" ? 3 : 1) + ); + }, + backup: function (links) { + return { + audio: "juguan", + viewAs: { name: links[0][2] }, + filterCard: true, + check: function (card) { + return 6 - get.value(card); + }, + position: "hs", + onuse: function (result, player) { + player.addTempSkill("juguan_effect"); + }, + }; + }, + prompt: function (links) { + return "将一张手牌当做" + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: function (item, player) { + return Math.max(get.order({ name: "sha" }), get.order({ name: "juedou" })) + 0.2; + }, + result: { player: 1 }, + }, + subSkill: { + effect: { + trigger: { global: "damage" }, + forced: true, + charlotte: true, + firstDo: true, + silent: true, + popup: false, + filter: function (event, player) { + var evt = event.getParent("useCard"); + return event.card && evt && event.card == evt.card && evt.skill == "juguan_backup" && evt.player == player; + }, + content: function () { + player.addSkill("juguan_draw"); + player.markAuto("juguan_draw", [trigger.player]); + }, + }, + draw: { + audio: "juguan", + trigger: { player: "phaseDrawBegin" }, + forced: true, + charlotte: true, + onremove: true, + content: function () { + player.removeSkill("juguan_draw"); + if (!trigger.numFixed) trigger.num += 2; + }, + group: "juguan_clear", + intro: { + content: "若没有受到$的伤害,则下个摸牌阶段多摸两张牌", + }, + }, + clear: { + trigger: { player: "damage" }, + forced: true, + charlotte: true, + firstDo: true, + silent: true, + popup: false, + filter: function (event, player) { + return player.storage.juguan_draw && player.storage.juguan_draw.includes(event.source); + }, + content: function () { + player.unmarkAuto("juguan_draw", [trigger.source]); + if (!player.storage.juguan_draw || !player.storage.juguan_draw.length) player.removeSkill("juguan_draw"); + }, + }, + }, + }, + //OL鲍三娘 + olwuniang: { + audio: "xinfu_wuniang", + trigger: { player: "useCardAfter" }, + usable: 1, + filter: function (event, player) { + return event.card.name == "sha" && event.targets.length == 1 && event.targets[0].isIn(); + }, + logTarget: "targets", + content: function () { + "step 0"; + var target = trigger.targets[0]; + 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); + "step 1"; + player.addTempSkill("olwuniang2"); + player.addMark("olwuniang2", 1, false); + player.draw(); + }, + }, + olwuniang2: { + onremove: true, + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("olwuniang2"); + }, + }, + }, + olxushen: { + derivation: "olzhennan", + audio: "xinfu_xushen", + trigger: { player: "dying" }, + limited: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + return player.hp < 1; + }, + content: function () { + "step 0"; + player.awakenSkill("olxushen"); + player.addSkills("olzhennan"); + player.recover(1 - player.hp); + "step 1"; + if ( + !player.isDying() && + !game.hasPlayer(function (current) { + return current.name1 == "guansuo" || current.name2 == "guansuo"; + }) + ) { + player + .chooseTarget(function (card, player, current) { + return current != player && current.hasSex("male"); + }, "许身:是否令一名其他男性角色选择是否将其武将牌替换为“关索”?") + .set("ai", function (target) { + return get.attitude(_status.event.player, target) - 4; + }); + } else event.finish(); + "step 2"; + if (!result.bool) { + event.finish(); + return; + } + var target = result.targets[0]; + event.target = target; + player.line(target, "fire"); + target.chooseBool("许身:是否将自己的一张武将牌替换为“关索”?"); + "step 3"; + if (result.bool) { + if (target.name2 != undefined) { + target.chooseControl(target.name1, target.name2).set("prompt", "请选择要更换的武将牌"); + } else event._result = { control: target.name1 }; + } else event.finish(); + "step 4"; + target.reinitCharacter(result.control, "guansuo"); + }, + }, + olzhennan: { + audio: "xinfu_zhennan", + enable: "phaseUse", + usable: 1, + viewAs: { name: "nanman" }, + filterCard: true, + selectCard: function () { + if (ui.selected.targets.length) return [ui.selected.targets.length, Math.min(ui.selected.targets.length + 1, game.players.length - 1)]; + return [1, Infinity]; + }, + check: function (card) { + var player = _status.event.player; + if ( + game.countPlayer(function (current) { + return current != player && player.canUse("nanman", current) && get.effect(current, { name: "nanman" }, player, player) > 0; + }) <= ui.selected.cards.length + ) + return 0; + return 6 - get.value(card); + }, + selectTarget: function () { + return ui.selected.cards.length; + }, + ai: { + order: 2, + }, + group: "olzhennan2", + }, + olzhennan2: { + trigger: { target: "useCardToBefore" }, + forced: true, + locked: false, + audio: "olzhennan", + filter: function (event, player) { + return event.card.name == "nanman"; + }, + content: function () { + trigger.cancel(); + }, + }, + //黄承彦 + guanxu: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => lib.skill.guanxu.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + var cards = get.cards(5); + for (var i = cards.length - 1; i >= 0; i--) { + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); + } + game.updateRoundNumber(); + var hs = target.getCards("h"); + var dialog = ["观虚:选择要操作的牌", '
    ' + get.translation(target) + "的手牌
    ", hs, '
    牌堆顶
    ', cards]; + player + .chooseButton(dialog, 2) + .set("filterButton", function (button) { + if (ui.selected.buttons.length) return get.position(button.link) != get.position(ui.selected.buttons[0].link); + return true; + }) + .set("cards1", hs) + .set("cards2", cards) + .set("ai", function (button) { + var card = button.link, + cards1 = _status.event.cards1.slice(0); + var cards2 = _status.event.cards2.slice(0), + target = _status.event.getParent().target; + if (!ui.selected.buttons.length) { + if (!cards1.includes(card)) return 0; + cards1.remove(card); + var suits = cards2.map(function (i) { + return get.suit(i, target); + }); + for (var i of lib.suit) { + var num = cards1.filter(function (c) { + return get.suit(c, target) == i; + }).length; + if (num > 2 || (num > 1 && suits.includes(i))) return 20 + get.value(card); + } + return get.value(card); + } + cards1.remove(ui.selected.buttons[0].link); + cards1.push(card); + for (var i of lib.suit) { + if ( + cards1.filter(function (c) { + return get.suit(c, target) == i; + }).length > 2 + ) + return 20 - get.value(card); + return get.value(ui.selected.buttons[0].link) - get.value(card); + } + }); + "step 1"; + if (result.bool) { + var cards = result.links; + if (get.position(cards[0]) != "h") cards.reverse(); + var next = target.lose(cards[0], ui.cardPile); + next.insert_index_card = cards[1]; + next.insert_index = function (event) { + return event.insert_index_card; + }; + target.gain(cards[1], "draw"); + } else event.finish(); + "step 2"; + game.updateRoundNumber(); + var suits = [], + map = {}, + hs = target.getCards("h"); + if (hs.length) { + for (var i of hs) { + if (!lib.filter.canBeDiscarded(i, player, target, "guanxu")) continue; + var suit = get.suit(i, target); + if (!map[suit]) map[suit] = 1; + else map[suit]++; + if (map[suit] > 2) suits.add(suit); + } + var next = player.discardPlayerCard(target, 3, "visible", "h"); + next.set("suits", suits); + next.set("filterButton", function (button) { + var suit = get.suit(button.link); + if (!ui.selected.buttons.length) return _status.event.suits.includes(suit); + return suit == get.suit(ui.selected.buttons[0].link); + }); + if (suits.length) next.set("forced", true); + } + }, + ai: { + order: 9, + result: { + target: function (player, target) { + if (target.countCards("h") > 3) return -5; + if (target.countCards("h") == 3) return -3; + return -0.5; + }, + }, + }, + }, + yashi: { + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + if (event.source && event.source.isIn()) return true; + return game.hasPlayer(current => lib.skill.guanxu.filterTarget(null, player, current)); + }, + content: function () { + "step 0"; + event.addIndex = 0; + var choiceList = []; + if (trigger.source && trigger.source.isIn()) { + choiceList.push("令" + get.translation(trigger.source) + "的所有非锁定技失效"); + } else event.addIndex++; + if (game.hasPlayer(current => lib.skill.guanxu.filterTarget(null, player, current))) choiceList.push("发动一次〖观虚〗"); + player + .chooseControl("cancel2") + .set("prompt", get.prompt("yashi")) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + source = _status.event.getTrigger().source, + index = _status.event.getParent().addIndex; + if ( + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 3 && get.attitude(player, current) < 0; + }) + ) + return 1 - index; + if (source && source.isIn() && get.attitude(player, source) < 0 && !source.hasSkill("fengyin")) return 0; + if ( + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0 && get.attitude(player, current) < 0; + }) + ) + return 1 - index; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + if (result.index + event.addIndex == 0) { + var target = trigger.source; + player.logSkill("yashi", target); + //target.removeSkill('fengyin'); + target.addTempSkill("fengyin", { player: "phaseBegin" }); + event.finish(); + } else + player.chooseTarget(true, "请选择〖观虚〗的目标", lib.skill.guanxu.filterTarget).set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, "guanxu", player, player); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("yashi", target); + var next = game.createEvent("yashi_guanxu"); + next.player = player; + next.target = target; + next.setContent(lib.skill.guanxu.content); + } + }, + }, + //黄祖 + wangong: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return get.type(event.card, false) == "basic"; + }, + content: function () { + player.addSkill("wangong2"); + }, + }, + wangong2: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + charlotte: true, + content: function () { + player.removeSkill("wangong2"); + if (trigger.card.name == "sha") trigger.baseDamage++; + }, + mod: { + cardUsable: function (card) { + if (card.name == "sha") return Infinity; + }, + targetInRange: function (card) { + if (card.name == "sha") return true; + }, + }, + mark: true, + intro: { + content: "使用【杀】无距离和次数限制且伤害+1", + }, + }, + //潘淑 + weiyi: { + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (player.getStorage("weiyi").includes(event.player) || !event.player.isIn()) return false; + return event.player.hp >= player.hp || event.player.isDamaged(); + }, + direct: true, + content: function () { + "step 0"; + var list = []; + if (trigger.player.hp >= player.hp) list.push("失去体力"); + if (trigger.player.hp <= player.hp && trigger.player.isDamaged()) list.push("回复体力"); + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt2("weiyi", trigger.player)) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + var att = get.attitude(player, target), + eff = get.recoverEffect(target, player, player); + if (target.hp <= player.hp && target.isDamaged() && att > 2 && eff > 0) { + if (player == target) { + var storage = player.getStorage("weiyi"); + if ( + player.hp >= 2 && + game.hasPlayer(function (current) { + return current.hp == player.hp + 1 && !storage.includes(current) && get.attitude(player, current) < 0; + }) + ) + return "cancel2"; + } + return "回复体力"; + } + if (target.hp >= player.hp && att < -2 && eff < 0) return "失去体力"; + return "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + var target = trigger.player; + player.logSkill("weiyi", target); + player.markAuto("weiyi", [target]); + target[result.control == "失去体力" ? "loseHp" : "recover"](); + } + }, + onremove: true, + intro: { + content: "已令$对汝威服", + }, + }, + jinzhi: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if (get.type(name) == "basic" && lib.inpile.includes(name) && player.countMark("jinzhi2") < player.countCards("he")) return true; + }, + filter: function (event, player) { + if (event.responded || event.jinzhi || player.countMark("jinzhi2") >= player.countCards("he")) return false; + for (var i of lib.inpile) { + if (get.type(i) == "basic" && event.filterCard({ name: i, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of lib.inpile) { + if (get.type(i) == "basic" && event.filterCard({ name: i, isCard: true }, player, event)) { + list.push(["基本", "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } + } + } + return ui.create.dialog("锦织", [list, "vcard"], "hidden"); + }, + check: function (button) { + if (button.link[2] == "shan") return 3; + var player = _status.event.player; + if (button.link[2] == "jiu") { + if (player.getUseValue({ name: "jiu" }) <= 0) return 0; + if (player.countCards("h", "sha")) return player.getUseValue({ name: "jiu" }); + } + return player.getUseValue({ name: button.link[2], nature: button.link[3] }) / 4; + }, + backup: function (links, player) { + return { + selectCard: player.countMark("jinzhi2") + 1, + filterCard: function (card, player) { + if (ui.selected.cards.length) { + if (get.color(card) != get.color(ui.selected.cards[0])) return false; + } + return lib.filter.cardDiscardable.apply(this, arguments); + }, + complexCard: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, + }, + position: "he", + ignoreMod: true, + check: function (card) { + var player = _status.event.player, + color = get.color(card, player); + if (player.countCards("he", { color: color }) <= player.countMark("jinzhi2") || (ui.selected.cards.length && get.color(ui.selected.cards[0], player) != color)) return -1; + if ( + lib.skill.jinzhi_backup.viewAs.name == "jiu" && + !player.countCards("h", function (cardx) { + return card != cardx && !ui.selected.cards.includes(cardx) && get.name(cardx, player) == "sha"; + }) + ) + return 0; + return Math.min(0.01, 6 - get.value(card)); + }, + precontent: function () { + player.logSkill("jinzhi"); + player.addTempSkill("jinzhi2", "roundStart"); + player.addMark("jinzhi2", 1, false); + var cards = event.result.cards; + player.discard(cards); + player.draw(); + event.result.card = { + name: event.result.card.name, + nature: event.result.card.nature, + isCard: true, + }; + event.result.cards = []; + delete event.result.skill; + if (cards.length > 1) { + var color = get.color(cards[0], player); + for (var i = 1; i < cards.length; i++) { + if (get.color(cards[i], player) != color) { + var evt = event.getParent(); + evt.set("jinzhi", true); + evt.goto(0); + return; + } + } + } + }, + }; + }, + prompt: function (links, player) { + var name = links[0][2]; + var nature = links[0][3]; + return "弃置" + get.cnNumber(player.countMark("jinzhi2") + 1) + "张颜色相同的牌并摸一张牌,然后视为使用" + (get.translation(nature) || "") + get.translation(name); + }, + }, + ai: { + order: function (item, player) { + if (_status.event.type == "phase" && !player.countMark("jinzhi2") && player.getUseValue({ name: "jiu" }, null, true) > 0 && player.countCards("h", "sha")) return get.order({ name: "jiu" }) + 1; + return 1; + }, + respondShan: true, + respondSha: true, + skillTagFilter: function (player) { + if (player.countMark("jinzhi2") >= player.countCards("he")) return false; + }, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + }, + jinzhi2: { + onremove: true, + intro: { + content: "本轮已发动过#次", + }, + }, + //宗预 + zyqiao: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + logTarget: "player", + usable: 2, + preHidden: true, + filter: function (event, player) { + var source = event.player; + if (source == player) return false; + if (get.mode() == "guozhan" && source.isFriendOf(player)) return false; + return source.countDiscardableCards(player, "he") > 0; + }, + check: function (event, player) { + var target = event.player; + if (get.attitude(player, target) >= 0) return false; + if ( + !player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "zyqiao"); + }) + ) + return true; + if (player.countCards("he", card => get.value(card, player) < 5)) return true; + if (target.countCards("he", card => get.value(card, target) > 6) && player.countCards("he", card => get.value(card, player) < 7)) return true; + return false; + }, + content: function () { + "step 0"; + player.discardPlayerCard(trigger.player, true, "he"); + "step 1"; + if ( + player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "zyqiao"); + }) + ) + player.chooseToDiscard("he", true); + }, + }, + chengshang: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + if (!lib.suit.includes(get.suit(event.card, false)) || typeof get.number(event.card) != "number") return false; + if ( + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length + ) + return false; + var phsu = event.getParent("phaseUse"); + if (!phsu || phsu.player != player) return false; + if ( + player.getHistory("gain", function (evt) { + return evt.getParent().name == "chengshang"; + }).length + ) + return false; + for (var i of event.targets) { + if (i != player && (get.mode() != "guozhan" || i.isEnemyOf(player))) return true; + } + return false; + }, + preHidden: true, + content: function () { + var suit = get.suit(trigger.card); + var number = get.number(trigger.card); + var cards = []; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (card.suit == suit && card.number == number) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + }, + }, + //新丁奉 + reduanbing: { + audio: 2, + audioname: ["heqi"], + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && get.distance(player, current) <= 1 && player.canUse(event.card, current); + }); + }, + direct: true, + preHidden: ["reduanbing_sha"], + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("reduanbing"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { + return !_status.event.sourcex.includes(target) && get.distance(player, target) <= 1 && player.canUse(_status.event.card, target); + }) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + player.logSkill("reduanbing", event.target); + trigger.targets.push(event.target); + }, + ai: { + effect: { + player: function (card, player, target, current, isLink) { + if (!isLink && card.name == "sha") { + if (player._reduanbingtmp) return; + player._reduanbingtmp = true; + if (get.effect(target, card, player, player) <= 0) { + delete player._reduanbingtmp; + return; + } + if ( + game.hasPlayer(function (current) { + return current != target && get.distance(player, current) <= 1 && player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + delete player._reduanbingtmp; + return [1, 1]; + } + delete player._reduanbingtmp; + } + }, + }, + }, + group: "reduanbing_sha", + subSkill: { + sha: { + audio: "duanbing", + audioname: ["heqi"], + trigger: { player: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && !event.getParent().directHit.includes(event.target) && get.distance(player, event.target) <= 1; + }, + logTarget: "target", + content: function () { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { + map[id].shanRequired++; + } else { + map[id].shanRequired = 2; + } + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg.card.name != "sha" || arg.target.countCards("h", "shan") > 1 || get.distance(player, arg.target) > 1) return false; + }, + }, + }, + }, + }, + refenxun: { + audio: "fenxun", + enable: "phaseUse", + usable: 1, + position: "he", + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { + player.markAuto("refenxun2", targets); + player.addTempSkill("refenxun2"); + }, + ai: { + order: 6.5, + result: { + player: function (player, target) { + if (get.distance(player, target) <= 1) return 0; + var hs = player.getCards("h", "shunshou"); + if (hs.length && player.canUse(hs[0], target, false)) { + return 1; + } + var geteff = function (current) { + return player.canUse("sha", current, false, true) && get.effect(current, { name: "sha" }, player, player) > 0; + }; + if (player.hasSha() && geteff(target)) { + var num = game.countPlayer(function (current) { + return current != player && get.distance(player, current) <= 1 && geteff(current); + }); + if (num == 0) { + if ( + game.hasPlayer(function (current) { + return player.canUse("sha", current) && geteff(current) && current != target; + }) + ) { + return 1; + } + } else if (num == 1) { + return 1; + } + } + return 0; + }, + }, + }, + }, + refenxun2: { + audio: "fenxun", + trigger: { + player: "phaseJieshuBegin", + }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + player.getHistory("sourceDamage", function (evt) { + return player.storage.refenxun2.includes(evt.player); + }).length == 0 && + player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "refenxun2"); + }) > 0 + ); + }, + content: function () { + player.chooseToDiscard("he", true); + }, + onremove: true, + intro: { + content: "到$的距离视为1", + }, + mod: { + globalFrom: function (from, to) { + if (from.storage.refenxun2.includes(to)) { + return -Infinity; + } + }, + }, + }, + //蔡阳新技能 + zhuixi: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + //新塌顿 + reluanzhan: { + audio: "luanzhan", + trigger: { + player: "damageEnd", + source: "damageSource", + }, + forced: true, + locked: false, + content: function () { + player.addMark("reluanzhan", 1, false); + }, + intro: { content: "mark" }, + ai: { notemp: true }, + group: ["reluanzhan_add", "reluanzhan_remove"], + }, + reluanzhan_add: { + trigger: { player: "useCard2" }, + direct: true, + filter: function (event, player) { + if ((event.card.name != "sha" && (get.color(event.card) != "black" || get.type(event.card) != "trick")) || !player.countMark("reluanzhan")) return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var num = player.countMark("reluanzhan"); + var prompt2 = "为" + get.translation(trigger.card) + "增加至多" + get.cnNumber(num) + "个目标"; + player + .chooseTarget( + get.prompt("reluanzhan"), + function (card, player, target) { + if (_status.event.targets.includes(target)) return false; + var player = _status.event.player; + return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); + }, + [1, num] + ) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("reluanzhan", event.targets); + trigger.targets.addArray(event.targets); + } + }, + }, + reluanzhan_remove: { + audio: "luanzhan", + trigger: { player: "useCardToPlayered" }, + forced: true, + locked: false, + filter: function (event, player) { + if (!event.isFirstTarget || (event.card.name != "sha" && (get.color(event.card) != "black" || get.type(event.card) != "trick")) || !player.countMark("reluanzhan")) return false; + var info = get.info(event.card); + if (info.allowMultiple == false || info.multitarget) return false; + return event.targets.length < player.countMark("reluanzhan"); + }, + content: function () { + player.removeMark("reluanzhan", Math.ceil(player.countMark("reluanzhan") / 2)); + }, + }, + //卧龙凤雏双头祈福 + youlong: { + enable: "chooseToUse", + audio: 2, + audioname: ["key_sakuya"], + zhuanhuanji: true, + marktext: "☯", + mark: true, + intro: { + content: function (storage, player) { + return storage ? "每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。" : "每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌。"; + }, + }, + init: function (player) { + player.storage.youlong = false; + if (!player.storage.youlong2) player.storage.youlong2 = []; + }, + hiddenCard: function (player, name) { + if (player.storage.youlong2.includes(name) || !player.hasEnabledSlot()) return false; + if (player.hasSkill("youlong_" + (player.storage.youlong || false))) return false; + var type = get.type(name); + if (player.storage.youlong) return type == "basic"; + return type == "trick"; + }, + filter: function (event, player) { + if (player.storage.youlong2.includes(name) || !player.hasEnabledSlot()) return false; + if (player.hasSkill("youlong_" + (player.storage.youlong || false))) return false; + var type = player.storage.youlong ? "basic" : "trick"; + for (var name of lib.inpile) { + if (player.storage.youlong2.includes(name)) continue; + if (get.type(name) != type) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("游龙", "hidden"); + const equips = []; + for (let i = 1; i < 6; i++) { + if (!player.hasEnabledSlot(i)) continue; + equips.push([i, get.translation("equip" + i)]); + } + if (equips.length > 0) dialog.add([equips, "tdnodes"]); + var type = player.storage.youlong ? "basic" : "trick"; + var list = []; + for (var name of lib.inpile) { + if (player.storage.youlong2.includes(name)) continue; + if (get.type(name) != type) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) { + list.push([type, "", name]); + if (name == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } + } + } + dialog.add([list, "vcard"]); + return dialog; + }, + filter: function (button) { + if (ui.selected.buttons.length && typeof button.link == typeof ui.selected.buttons[0].link) return false; + return true; + }, + select: 2, + check: function (button) { + var player = _status.event.player; + if (typeof button.link == "number") { + var card = player.getEquip(button.link); + if (card) { + var val = get.value(card); + if (val > 0) return 0; + return 5 - val; + } + switch (button.link) { + case 3: + return 4.5; + case 4: + return 4.4; + case 5: + return 4.3; + case 2: + return (3 - player.hp) * 1.5; + case 1: { + if ( + game.hasPlayer(function (current) { + return (get.realAttitude || get.attitude)(player, current) < 0 && get.distance(player, current) > 1; + }) + ) + return 0; + return 3.2; + } + } + } + var name = button.link[2]; + var evt = _status.event.getParent(); + if (evt.type == "phase") { + var card = { name: name, nature: button.link[3], isCard: true }; + if (name == "shan") return 2; + if (evt.type == "dying") { + if (get.attitude(player, evt.dying) < 2) return false; + if (name == "jiu") return 2.1; + return 1.9; + } + return player.getUseValue(card); + } + return 1; + }, + backup: function (links, player) { + if (typeof links[1] == "number") links.reverse(); + var equip = links[0]; + var name = links[1][2]; + var nature = links[1][3]; + return { + filterCard: function () { + return false; + }, + selectCard: -1, + equip: equip, + viewAs: { + name: name, + nature: nature, + isCard: true, + }, + popname: true, + precontent: function () { + player.logSkill("youlong"); + player.disableEquip(lib.skill.youlong_backup.equip); + delete event.result.skill; + player.addTempSkill("youlong_" + (player.storage.youlong || false), "roundStart"); + player.changeZhuanhuanji("youlong"); + player.storage.youlong2.add(event.result.card.name); + }, + }; + }, + prompt: function (links, player) { + if (typeof links[1] == "number") links.reverse(); + var equip = "equip" + links[0]; + var name = links[1][2]; + var nature = links[1][3]; + return "废除自己的" + get.translation(equip) + "栏,视为使用" + (get.translation(nature) || "") + get.translation(name); + }, + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + if (!player.storage.youlong || player.hasSkill("youlong_true")) return false; + var name = tag == "respondSha" ? "sha" : "shan"; + return !player.storage.youlong2.includes(name); + }, + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0, + add = false; + var type = player.storage.youlong ? "basic" : "trick"; + var list = lib.inpile.filter(name => get.type(name) == type && !player.storage.youlong2.includes(name)); + if (list.includes("sha")) add = true; + list = list.map(namex => { + return { name: namex, isCard: true }; + }); + if (add) lib.inpile_nature.forEach(naturex => list.push({ name: "sha", nature: naturex, isCard: true })); + for (var card of list) { + if (player.getUseValue(card) > 0) { + var temp = get.order(card); + if (temp > max) max = temp; + } + } + if (max > 0) max += 0.3; + return max; + } + return 1; + }, + result: { player: 1 }, + }, + }, + youlong_true: { charlotte: true }, + youlong_false: { charlotte: true }, + luanfeng: { + audio: 2, + audioname: ["key_sakuya"], + trigger: { global: "dying" }, + filter: function (event, player) { + return event.player.maxHp >= player.maxHp && event.player.hp < 1; + }, + limited: true, + skillAnimation: true, + animationColor: "soil", + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) < 4) return false; + if ( + player.countCards("h", function (card) { + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, event.player, "unchanged", "cardSavable", player); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") savable = savable(card, player, event.player); + return savable; + }) >= + 1 - event.player.hp + ) + return false; + if (event.player == player || event.player == get.zhu(player)) return true; + return !player.hasUnknown(); + }, + content: function () { + "step 0"; + player.awakenSkill("luanfeng"); + trigger.player.recover(3 - trigger.player.hp); + "step 1"; + var list = [], + target = trigger.player; + for (var i = 1; i < 6; i++) { + for (var j = 0; j < target.countDisabledSlot(i); j++) { + list.push(i); + } + } + if (list.length > 0) target.enableEquip(list); + if (list.length < 6) target.drawTo(6 - list.length); + if (target.storage.kotarou_rewrite) target.storage.kotarou_rewrite = []; + if (player == target) player.storage.youlong2 = []; + }, + }, + //曹爽,韩遂,何进 + xiaoxi: { + audio: 2, + audioname: ["machao", "hansui", "pangde"], + trigger: { + player: "enterGame", + global: "phaseBefore", + }, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + direct: true, + content: function () { + player.chooseUseTarget("sha", get.prompt("xiaoxi"), "视为使用一张【杀】").logSkill = "xiaoxi"; + }, + }, + spmouzhu: { + enable: "phaseUse", + audio: "mouzhu", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => lib.skill.spmouzhu.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + if (!target.countCards("h")) return false; + return player != target && (target.hp == player.hp || get.distance(player, target) == 1); + }, + selectTarget: [1, Infinity], + content: function () { + "step 0"; + target.chooseCard("h", "交给" + get.translation(player) + "一张牌", true); + "step 1"; + if (result.bool) target.give(result.cards, player); + "step 2"; + if (player.countCards("h") <= target.countCards("h")) { + event.finish(); + return; + } + var list = []; + if (target.canUse("sha", player, false)) list.push("sha"); + if (target.canUse("juedou", player, false)) list.push("juedou"); + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { control: list[0] }; + else + target.chooseControl(list).set("prompt", "对" + get.translation(player) + "使用一张【杀】或【决斗】。").ai = function () { + return get.effect(player, { name: "sha" }, target, target) >= get.effect(player, { name: "juedou" }, target, target) ? "sha" : "juedou"; + }; + "step 3"; + target.useCard({ name: result.control, isCard: true }, player, "noai"); + }, + ai: { + order: 7, + result: { + target: -1.2, + player: function (player, target) { + if (ui.selected.targets.length) return 0; + if (target.countCards("h") - player.countCards("h") > 1) return 1; + if (get.damageEffect(target, player, player, player) > 0) return 1; + if (player.hp > 3 || (player.countCards("h", "sha") && player.countCards("h", "shan"))) return 0; + if (player.hp > 2) return -1.1; + return -2; + }, + }, + }, + }, + spyanhuo: { + audio: "yanhuo", + trigger: { player: "die" }, + forceDie: true, + skillAnimation: true, + animationColor: "soil", + content: function () { + player.line(game.players, "green"); + game.addGlobalSkill("spyanhuo_damage"); + if (!_status.yanhuo) _status.yanhuo = 0; + _status.yanhuo++; + }, + subSkill: { + damage: { + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + trigger.baseDamage += _status.yanhuo || 0; + }, + }, + }, + }, + spniluan: { + enable: "phaseUse", + audio: "niluan", + viewAs: { name: "sha" }, + check: function (card) { + return 5.1 - get.value(card); + }, + filterCard: { color: "black" }, + position: "hes", + viewAsFilter: function (player) { + return player.countCards("hes", lib.skill.spniluan.filterCard) > 0; + }, + group: "spniluan_clear", + }, + spniluan_clear: { + trigger: { player: "useCardAfter" }, + forced: true, + silent: true, + charlotte: true, + filter: function (event, player) { + return ( + event.skill == "spniluan" && + event.addCount !== false && + player.getHistory("sourceDamage", function (card) { + return card.card == event.card; + }).length == 0 + ); + }, + content: function () { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + }, + }, + spweiwu: { + audio: 2, + locked: false, + enable: "phaseUse", + usable: 1, + viewAs: { + name: "shunshou", + storage: { spweiwu: true }, + }, + filterCard: { color: "red" }, + position: "hes", + check: function (card) { + return 7 - get.value(card); + }, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.spweiwu) return true; + }, + }, + }, + tuogu: { + audio: 2, + trigger: { global: "die" }, + filter: function (event, player) { + return ( + event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; + }).length > 0 + ); + }, + logTarget: "player", + skillAnimation: true, + limited: true, + animationColor: "thunder", + content: function () { + "step 0"; + player.awakenSkill("tuogu"); + var list = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; + }); + if (list.length == 1) event._result = { control: list[0] }; + else + trigger.player + .chooseControl(list) + .set("prompt", "选择令" + get.translation(player) + "获得一个技能") + .set("forceDie", true) + .set("ai", function () { + return list.randomGet(); + }); + "step 1"; + player.addSkills(result.control); + game.broadcastAll(function (skill) { + var list = [skill]; + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.caoshuang = "tuogu"; + } + }, result.control); + }, + }, + retuogu: { + audio: "tuogu", + trigger: { global: "die" }, + filter: function (event, player) { + return ( + event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; + }).length > 0 + ); + }, + logTarget: "player", + check: function (event, player) { + var list = event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; + }); + var negSkill = list.some(function (skill) { + return get.skillRank(skill, "inout") <= 0; + }); + var att = get.sgnAttitude(event.player, player); + if (!player.storage.retuogu) { + if (negSkill && att < 0) return false; + return true; + } + list.sort(function (a, b) { + return att * (get.skillRank(b, "inout") - get.skillRank(a, "inout")); + })[0]; + return get.skillRank(list[0], "inout") >= get.skillRank(player.storage.retuogu, "inout"); + }, + content: function () { + "step 0"; + var list = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.juexingji && !info.hiddenSkill && !info.zhuSkill && !info.charlotte && !info.limited && !info.dutySkill; + }); + if (list.length == 1) event._result = { control: list[0] }; + else + trigger.player + .chooseControl(list) + .set("prompt", "选择令" + get.translation(player) + "获得一个技能") + .set("forceDie", true) + .set("ai", function () { + var att = get.sgnAttitude(_status.event.getTrigger().player, player); + if (att == 0) return list.randomGet(); + var listx = list + .map(function (skill) { + return [skill, get.skillRank(skill, "inout")]; + }) + .sort(function (a, b) { + return att * (b[1] - a[1]); + }) + .slice(0, 2); + var listx2 = [0]; + if (Math.abs(listx[0][1] - listx[1][1]) <= 0.5 && Math.sign(listx[0][1]) == Math.sign(listx[1][1])) listx2.push(1); + return listx[listx2.randomGet()][0]; + }); + "step 1"; + if (player.storage.retuogu) player.removeSkill(player.storage.retuogu); + player.storage.retuogu = result.control; + player.markSkill("retuogu"); + player.addSkills(result.control); + game.broadcastAll(function (skill) { + var list = [skill]; + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.caoshuang = "tuogu"; + } + }, result.control); + }, + mark: true, + intro: { content: "当前托孤技能:$" }, + }, + shanzhuan: { + trigger: { source: "damageSource" }, + audio: 2, + direct: true, + filter: function (event, player) { + return player != event.player && !event.player.isDisabledJudge() && event.player.countCards("he") && !event.player.countCards("j", card => get.type(card.viewAs || card.name) == "delay"); + }, + content: function () { + "step 0"; + player.choosePlayerCard(trigger.player, "he", get.prompt("shanzhuan", trigger.player)).set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.target) >= 0) return 0; + return get.buttonValue(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("shanzhuan", trigger.player); + var card = result.cards[0]; + trigger.player.$throw(card); + game.delayx(); + if (get.type(card, false) == "delay") trigger.player.addJudge(card); + else trigger.player.addJudge({ name: get.color(card, false) == "red" ? "lebu" : "bingliang" }, result.cards); + } + }, + group: "shanzhuan_draw", + subfrequent: ["draw"], + subSkill: { + draw: { + audio: "shanzhuan", + trigger: { player: "phaseEnd" }, + frequent: true, + prompt: "是否发动【擅专】摸一张牌?", + filter: function (event, player) { + return !player.getHistory("sourceDamage").length; + }, + content: function () { + player.draw(); + }, + }, + }, + }, + olxingshen: { + trigger: { player: "damageEnd" }, + frequent: true, + audio: "xingshen", + content: function () { + "step 0"; + var next = player.draw(); + if (get.isLuckyStar(player) || Math.random() < 0.5) next.num = 2; + var num = player.countMark("olxingshen"); + if (num < 6) player.addMark("olxingshen", Math.min(6 - num, player.getDamagedHp()), false); + }, + intro: { + content: "下一次发动〖严教〗时多展示X张牌", + }, + }, + //张道陵 + zlhuji: { + mod: { + globalFrom: function (player, target, distance) { + return distance - 1; + }, + }, + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return player != _status.currentPhase; + }, + content: function () { + "step 0"; + var func = function (result) { + if (get.color(result) == "red") return 1; + return 0; + }; + if (get.itemtype(trigger.source) != "player" || !player.canUse("sha", trigger.source, false)) + func = function (result) { + return 0; + }; + else if (get.effect(trigger.source, { name: "sha" }, player, player) < 0) + func = function (result) { + if (get.color(result) == "red") return -1; + return 0; + }; + player.judge(func).judge2 = function (result) { + return result.color == "red" ? true : false; + }; + "step 1"; + if (result.color == "red" && get.itemtype(trigger.source) == "player" && player.canUse("sha", trigger.source, false)) { + player.useCard({ name: "sha", isCard: true }, trigger.source, false, "noai"); + } + }, + }, + zlshoufu: { + enable: "phaseUse", + usable: 1, + delay: false, + content: function () { + "step 0"; + player.draw(); + "step 1"; + var filterTarget = function (card, player, target) { + return target != player && !target.hasSkill("zlshoufu2"); + }; + if ( + !player.countCards("h") || + !game.hasPlayer(function (current) { + return filterTarget(null, player, current); + }) + ) + event.finish(); + else + player.chooseCardTarget({ + forced: true, + prompt: "将一张手牌作为“箓”置于其他角色的武将牌上", + filterTarget: filterTarget, + filterCard: true, + position: "h", + ai1: function (card) { + if (get.type(card, false) == "equip") return 1 - get.value(card); + return 7 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0) return -att; + return -att / get.distance(player, target, "absolute"); + }, + }); + "step 2"; + var target = result.targets[0]; + var cards = result.cards; + target.addToExpansion(cards, player, "give").gaintag.add("zlshoufu2"); + player.line(target, "green"); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.12); + target.addSkill("zlshoufu2"); + "step 3"; + game.delayx(); + }, + ai: { + notemp: true, + order: 1, + result: { + player: function (player) { + if ( + game.hasPlayer(function (target) { + return target != player && !target.hasSkill("zlshoufu2") && get.attitude(player, target) < 0; + }) || + !game.hasPlayer(function (target) { + return target != player && !target.hasSkill("zlshoufu2") && get.attitude(player, target) > 0; + }) + ) + return 1; + return 0; + }, + }, + }, + }, + zlshoufu2: { + marktext: "箓", + intro: { + content: "expansion", + markcount: "expansion", + }, + charlotte: true, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + mod: { + cardEnabled: function (card, player) { + if ( + player.getExpansions("zlshoufu2").filter(function (magic) { + return get.type2(magic) == get.type2(card); + }).length + ) + return false; + }, + cardRespondable: function (card, player) { + if ( + player.getExpansions("zlshoufu2").filter(function (magic) { + return get.type2(magic) == get.type2(card); + }).length + ) + return false; + }, + cardSavable: function (card, player) { + if ( + player.getExpansions("zlshoufu2").filter(function (magic) { + return get.type2(magic) == get.type2(card); + }).length + ) + return false; + }, + }, + trigger: { + player: ["damageEnd", "loseAfter"], + global: "loseAsyncAfter", + }, + forced: true, + filter: function (event, player) { + var storage = player.getExpansions("zlshoufu2"); + if (!storage.length) return false; + if (event.name == "damage") return true; + if (event.type != "discard" || event.getlx === false || event.getParent("phaseDiscard").player != player) return false; + var num = 0, + evt = event.getl(player); + if (!evt || !evt.cards2) return false; + for (var i of evt.cards2) { + if ( + storage.filter(function (magic) { + return get.type2(magic) == get.type2(i, event.hs.includes(i) ? player : false); + }).length + ) + num++; + } + return num > 1; + }, + content: function () { + player.removeSkill("zlshoufu2"); + }, + }, + //蔡阳 + yinka: { + trigger: { player: ["drawBegin", "judgeBegin"] }, + direct: true, + filter: function () { + return ui.cardPile.childNodes.length > 0; + }, + content: function () { + "step 0"; + player.chooseButton(["印卡:请选择要置于牌堆" + (trigger.bottom ? "底" : "顶") + "的牌(先选择的在上)", Array.from(ui.cardPile.childNodes)], [1, trigger.num || 1]); + "step 1"; + if (result.bool) { + while (result.links.length) { + if (trigger.bottom) { + var card = result.links.shift(); + ui.cardPile.removeChild(card); + ui.cardPile.appendChild(card); + } else { + var card = result.links.pop(); + ui.cardPile.removeChild(card); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + } + } + } + }, + ai: { isLuckyStar: true }, + }, + //新王允 + xinlianji: { + enable: "phaseUse", + audio: "wylianji", + usable: 1, + check: function (card) { + return 5 - get.value(card); + }, + filterTarget: function (card, player, target) { + if (ui.selected.targets.length) return true; + return target != player; + }, + filterCard: true, + selectTarget: 2, + multitarget: true, + targetprompt: ["打人", "被打"], + content: function () { + "step 0"; + //player.addMark('xinlianji',1,false); + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip1" && targets[0].hasUseTarget(card); + }); + if (card) { + if (card.name == "qinggang" && !lib.inpile.includes("qibaodao")) { + card.remove(); + card = game.createCard("qibaodao", card.suit, card.number); + } + targets[0].chooseUseTarget(card, true, "nopopup", "nothrow"); + } else { + player.chat("没有装备牌了吗"); + game.log("但是牌堆里已经没有装备牌了!"); + } + "step 1"; + game.updateRoundNumber(); + targets[0] + .chooseToUse("对" + get.translation(targets[1]) + "使用一张杀,或将装备区里的武器牌交给一名其他角色", { name: "sha" }) + .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", targets[1]) + .set("addCount", false); + "step 2"; + var cards = targets[0].getEquips(1); + if (!result.bool && cards.length) { + event.cards = cards; + player.chooseTarget(true, "将" + get.translation(cards) + "交给一名其他角色").set("ai", function (target) { + var card = _status.event.getParent().cards; + return (target.hasSkillTag("nogain") ? 0 : get.attitude(_status.event.player, target)) * Math.max(0.1, target.getUseValue(cards[0])); + }); + } else event.finish(); + "step 3"; + result.targets[0].gain(cards, result.targets[0], "give").giver = player; + }, + ai: { + order: 4, + result: { + target: function (player, target) { + if (ui.selected.targets.length) { + var pretarget = ui.selected.targets[0]; + if (pretarget.hasSha() && pretarget.canUse({ name: "sha" }, target)) return get.effect(target, { name: "sha" }, pretarget, target); + return Math.random(); + } + if (!target.getEquip(1)) { + if ( + game.hasPlayer(function (current) { + return current != target && !current.hasSkillTag("nogain") && get.attitude(current, target) > 0; + }) + ) + return 3; + return -3; + } + if ( + !game.hasPlayer(function (current) { + return current != target && !current.hasSkillTag("nogain") && get.attitude(current, target) > 0; + }) + ) + return -6; + return 4 - get.value(target.getEquip(1)); + }, + }, + }, + }, + xinmoucheng: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: "moucheng", + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + derivation: "xinjingong", + unique: true, + filter: function (event, player) { + return game.hasPlayer2(function (current) { + return ( + current.getAllHistory("sourceDamage", function (evt) { + if (!evt.card || evt.card.name != "sha" || evt.getParent().type != "card") return false; + var evt2 = evt.getParent(4); + return evt2 && evt2.name == "xinlianji" && evt2.player == player; + }).length > 0 + ); + }); + }, + content: function () { + player.awakenSkill("xinmoucheng"); + player.changeSkills(["xinjingong"], ["xinlianji"]); + }, + ai: { + combo: "xinlianji", + }, + }, + xinjingong: { + audio: "jingong", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + event.xinjingong_list && + player.countCards("hes", function (card) { + return card.name == "sha" || get.type(card) == "equip"; + }) + ); + }, + onChooseToUse: function (event) { + if (!game.online) { + var evt = event.getParent(); + if (evt.name != "phaseUse") return; + if (!evt.xinjingong_list) { + var list = get.inpile("trick").randomGets(2); + if (Math.random() < 0.5) { + list.push("wy_meirenji"); + } else { + list.push("wy_xiaolicangdao"); + } + evt.xinjingong_list = list; + } + if (!event.xinjingong_list) event.set("xinjingong_list", evt.xinjingong_list); + } + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of event.xinjingong_list) list.push(["锦囊", "", i]); + return ui.create.dialog("矜功", [list, "vcard"]); + }, + filter: function (button, player) { + return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent()); + }, + check: function (button) { + return _status.event.player.getUseValue({ name: button.link[2] }); + }, + backup: function (links, player) { + return { + audio: "jingong", + popname: true, + position: "hes", + viewAs: { name: links[0][2] }, + check: function (card) { + return 6 - get.value(card); + }, + filterCard: function (card) { + return card.name == "sha" || get.type(card) == "equip"; + }, + }; + }, + prompt: function (links, player) { + return "将一张【杀】或装备牌当做" + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 2, + result: { + player: 1, + }, + }, + }, + //孙邵 + bizheng: { + trigger: { player: "phaseDrawEnd" }, + direct: true, + audio: 2, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("bizheng"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + if (player.countCards("h") > player.maxHp) return 0; + var att = get.attitude(player, target); + if (att <= 0 || target.hasSkillTag("nogain")) return 0; + if (target.maxHp - target.countCards("h") >= 2) return att; + return att / 2; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("bizheng", target); + target.draw(2); + } else event.finish(); + "step 2"; + if (player.countCards("h") > player.maxHp) player.chooseToDiscard(2, "he", true); + "step 3"; + if (target.countCards("h") > target.maxHp) target.chooseToDiscard(2, "he", true); + }, + ai: { + expose: 0.25, + }, + }, + yidian: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + for (var i = 0; i < ui.discardPile.childElementCount; i++) { + if (ui.discardPile.childNodes[i].name == event.card.name) return false; + } + if ( + game.hasPlayer(function (current) { + return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current); + }) + ) { + return true; + } + } + return false; + }, + direct: true, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("yidian"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("yidian", event.targets); + trigger.targets.addArray(event.targets); + } + }, + ai: { + expose: 0.25, + }, + }, + //二袁 + neifa: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + _status.noclearcountdown = true; + if ( + game.hasPlayer(function (current) { + return current.countGainableCards(player, "ej") > 0; + }) + ) { + player + .chooseControl("cancel2") + .set("choiceList", ["摸两张牌,然后弃置一张牌", "获得场上的一张牌,然后弃置一张牌"]) + .set("prompt", get.prompt("neifa")) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + var att = get.attitude(player, current); + if (att == 0) return false; + if (att < 0) + return ( + current.countCards("e", function (card) { + return get.value(card, current) > 5; + }) > 0 + ); + return ( + current.countCards("ej", function (card) { + return get.position(card) == "j" || get.value(card, current) <= 0; + }) > 0 + ); + }) + ) + return 1; + return 0; + }); + } else { + player.chooseControl("ok", "cancel2").set("prompt", get.prompt2("neifa")); + } + "step 1"; + if (result.control == "cancel2") { + delete _status.noclearcountdown; + if (!_status.noclearcountdown) { + game.stopCountChoose(); + } + event.finish(); + return; + } else if (result.index == 1) { + player + .chooseTarget("请选择一名角色,获得其装备区或判定区内的一张牌", true, function (card, player, target) { + return target.countGainableCards(player, "ej") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if ( + att > 0 && + target.countCards("ej", function (card) { + return get.position(card) == "j" || get.value(card, target) <= 0; + }) + ) + return 2 * att; + else if ( + att < 0 && + target.countCards("e", function (card) { + return get.value(card, target) > 5; + }) + ) + return -att; + return -1; + }); + } else { + delete _status.noclearcountdown; + if (!_status.noclearcountdown) { + game.stopCountChoose(); + } + player.logSkill("neifa"); + player.draw(2); + event.goto(3); + } + "step 2"; + delete _status.noclearcountdown; + if (!_status.noclearcountdown) { + game.stopCountChoose(); + } + if (result.bool) { + var target = result.targets[0]; + player.logSkill("neifa", target); + player.gainPlayerCard(target, "ej", true); + } + "step 3"; + player.chooseToDiscard(true, "he").set("ai", function (cardx) { + var player = _status.event.player; + var num = 0; + var hs = player.getCards("h"); + var muniu = player.getEquip("muniu"); + var subs = []; + if (muniu && muniu.cards) hs = hs.concat(muniu.cards); + if (get.type(cardx) == "basic") { + var shas = hs.filter(function (card) { + return card != cardx && get.name(card, player) == "sha" && player.hasValueTarget(card); + }); + var numx = player.countCards("h", function (card) { + return get.type(card, player) != "basic"; + }); + num += Math.min(numx, Math.max(0, shas.length - player.getCardUsable("sha"))) * 0.7; + num += + Math.min( + player.getCardUsable("sha") + numx, + shas.filter(function (card) { + return ( + game.countPlayer(function (current) { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) > 1 + ); + }).length + ) * 1.1; + var taos = Math.min( + player.maxHp - player.hp, + hs.filter(function (card) { + return cardx != card && get.name(card, player) == "tao"; + }).length + ); + num += taos * player.getDamagedHp() * 1.2; + } else { + var numx = Math.sqrt( + Math.min( + 5, + player.countCards("h", function (card) { + return get.type(card, player) == "basic"; + }) + ) + ); + if (numx) + num += + (numx * + Math.min( + 2, + hs.filter(function (card) { + if (card == cardx || get.type(card) != "equip" || !player.hasUseTarget(card)) return false; + subs.add(get.subtype(card)); + return true; + }).length + ) * + (2.5 + player.countCards("e"))) / + 2.5; + num += + hs.filter(function (card) { + return card != cardx && get.type2(card) == "trick" && player.hasValueTarget(card); + }).length * 0.65; + } + if (get.position(cardx) == "e" && cardx.name != "muniu" && subs.includes(get.subtype(card))) num += 3; + return num * 1.5 - get.value(cardx); + }); + "step 4"; + if (result.bool && result.cards && result.cards.length) { + var name = get.type(result.cards[0]) == "basic" ? "neifa_basic" : "neifa_nobasic"; + player.addTempSkill(name); + var num = Math.min( + 5, + player.countCards("h", function (cardx) { + return (name == "neifa_basic") != (get.type(cardx, player) == "basic"); + }) + ); + if (num > 0) player.addMark(name, num, false); + else player.storage[name] = 0; + } + }, + ai: { + threaten: 3, + }, + }, + neifa_basic: { + mark: true, + marktext: "伐", + onremove: true, + intro: { + name: "内伐 - 基本牌", + content: "本回合内不能使用锦囊牌和装备牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。", + }, + mod: { + cardEnabled: function (card, player) { + if (["trick", "equip"].includes(get.type(card, "trick"))) return false; + }, + cardSavable: function (card, player) { + if (["trick", "equip"].includes(get.type(card, "trick"))) return false; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") { + return num + player.countMark("neifa_basic"); + } + }, + }, + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("neifa"), "为" + get.translation(trigger.card) + "额外指定一个目标", function (card, player, target) { + return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); + }) + .set("sourcex", trigger.targets) + .set("ai", function (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("neifa", event.targets); + trigger.targets.addArray(event.targets); + }, + }, + neifa_nobasic: { + trigger: { player: "useCard2" }, + direct: true, + mark: true, + marktext: "伐", + onremove: true, + mod: { + cardEnabled: function (card, player) { + if (get.type(card) == "basic") return false; + }, + cardSavable: function (card, player) { + if (get.type(card) == "basic") return false; + }, + }, + intro: { + name: "内伐 - 非基本牌", + content: "本回合内不能使用基本牌,使用普通锦囊牌选择目标时可以增加或减少一个目标,且本回合的出牌阶段内前两次使用装备牌时摸#张牌。", + }, + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + if (event.targets && event.targets.length > 0) return true; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; + player + .chooseTarget(get.prompt("neifa"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return true; + return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("neifa", event.targets); + if (trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); + else trigger.targets.addArray(event.targets); + } + }, + group: "neifa_use", + ai: { + reverseOrder: true, + skillTagFilter: function (player) { + if (player.storage.counttrigger && player.storage.counttrigger.neifa_use >= 2) return false; + }, + effect: { + target: function (card, player, target) { + if ((!player.storage.counttrigger || !player.storage.counttrigger.neifa_use || player.storage.counttrigger.neifa_use < 2) && player == target && get.type(card) == "equip") return [1, 3]; + }, + }, + }, + }, + neifa_use: { + audio: "neifa", + usable: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return get.type(event.card) == "equip" && player.countMark("neifa_nobasic") > 0; + }, + content: function () { + player.draw(player.countMark("neifa_nobasic")); + }, + }, + //许靖 + yuxu: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + return true; + }, + direct: true, + content: function () { + "step 0"; + var draw = !player.hasMark("yuxu_used"); + if (draw) player.chooseBool(get.prompt2("yuxu")).set("ai", () => 1); + else event.goto(2); + "step 1"; + if (result.bool) { + player.logSkill("yuxu"); + player.draw(); + player.addMark("yuxu_used", 1, false); + player.addTempSkill("yuxu_used", "phaseUseAfter"); + } + event.finish(); + "step 2"; + player.logSkill("yuxu"); + player.removeMark("yuxu_used", player.countMark("yuxu_used"), false); + player.chooseToDiscard("he", true); + }, + subSkill: { + used: { + charlotte: true, + onremove: true, + }, + }, + }, + xjshijian: { + audio: 2, + trigger: { global: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (event.player == player) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + event.player + .getHistory("useCard", function (evtt) { + return evtt.getParent("phaseUse") == evt; + }) + .indexOf(event) == 1 && player.countCards("he") > 0 + ); + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard("he", get.prompt("xjshijian", trigger.player), "弃置一张牌并令其获得技能〖誉虚〗至回合结束"); + next.set("logSkill", ["xjshijian", trigger.player]); + next.set("check", get.attitude(player, trigger.player) > 0 && trigger.player.countCards("h") > 2); + next.ai = function (card) { + if (_status.event.check) return 5 - get.value(card); + return -1; + }; + "step 1"; + if (result.bool) trigger.player.addTempSkills("yuxu"); + }, + ai: { + expose: 0.25, + }, + }, + //新1v1 + yanhuo: { + audio: 2, + trigger: { player: "die" }, + forceDie: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + direct: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yanhuo"), function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }) + .set("forceDie", true).ai = function (target) { + return -target.countCards("he") * get.attitude(player, target); + }; + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("yanhuo", target); + event.count = player.countCards("he"); + } else event.finish(); + "step 2"; + if (target.countDiscardableCards(player, "he")) { + player.line(target); + player.discardPlayerCard(target, "he", true).set("forceDie", true); + event.count--; + if (event.count) event.redo(); + } + }, + }, + mouzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + target.chooseCard("h", "交给" + get.translation(player) + "一张手牌", true); + "step 1"; + if (result.bool) target.give(result.cards, player); + "step 2"; + if (player.countCards("h") <= target.countCards("h")) { + event.finish(); + return; + } + var list = []; + if (target.canUse("sha", player, false)) list.push("sha"); + if (target.canUse("juedou", player, false)) list.push("juedou"); + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { control: list[0] }; + else + target.chooseControl(list).set("prompt", "对" + get.translation(player) + "使用一张【杀】或【决斗】。").ai = function () { + return get.effect(player, { name: "sha" }, target, target) >= get.effect(player, { name: "juedou" }, target, target) ? "sha" : "juedou"; + }; + "step 3"; + target.useCard({ name: result.control, isCard: true }, player, "noai"); + }, + ai: { + order: 7, + result: { + target: -1.2, + player: function (player, target) { + if (target.countCards("h") - player.countCards("h") > 1) return 1; + if (get.damageEffect(target, player, player, player) > 0) return 1; + if (player.hp > 3 || (player.countCards("h", "sha") && player.countCards("h", "shan"))) return 0; + if (player.hp > 2) return -1.1; + return -2; + }, + }, + }, + }, + niluan: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + event.player != player && + (event.player.hp > player.hp || + event.player.getHistory("useCard", function (card) { + return card.card.name == "sha"; + }).length > 0) + ); + }, + direct: true, + content: function () { + var next = player.chooseToUse(); + next.logSkill = "niluan"; + next.set("openskilldialog", get.prompt2("niluan")); + next.set("norestore", true); + next.set("_backupevent", "niluanx"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("niluanx"); + }, + }, + niluanx: { + viewAs: { name: "sha" }, + filterCard: { color: "black" }, + position: "hes", + selectCard: 1, + check: function (card) { + return 5 - get.value(card); + }, + }, + cuorui: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return player.maxHp > 0 && !get.is.single() && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + player.draw(Math.min(5, player.maxHp), false); + }, + group: "cuorui_nojudge", + subSkill: { + nojudge: { + trigger: { + player: "phaseJudgeBefore", + }, + forced: true, + audio: "cuorui", + filter: function (event, player) { + return !player.storage.cuorui && (get.is.single() || player.countCards("j")); + }, + content: function () { + player.storage.cuorui = true; + trigger.cancel(); + game.log(player, "跳过了", "#g判定阶段"); + }, + }, + }, + }, + liewei: { + audio: 2, + trigger: { source: "dieAfter" }, + frequent: true, + content: function () { + player.draw(3); + }, + }, + //蒋干 + weicheng: { + audio: 2, + trigger: { + global: "gainAfter", + player: "loseAsyncAfter", + }, + //forced:true, + frequent: true, + filter: function (event, player) { + if (player.getHp() <= player.countCards("h")) return false; + if (event.name == "loseAsync") { + if (event.type != "gain") return false; + var cards = event.getl(player).hs; + return game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if (cards.includes(i)) return true; + } + return false; + }); + } + if (event.player == player) return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; + }, + preHidden: true, + content: function () { + player.draw(); + }, + }, + daoshu: { + audio: 2, + enable: "phaseUse", + filterTarget: function (c, p, t) { + return t != p && t.countGainableCards(p, "h") > 0; + }, + filter: function (e, p) { + return !p.hasSkill("daoshu_used"); + }, + content: function () { + "step 0"; + player.chooseControl(lib.suit).set("prompt", "请选择一个花色").ai = function () { + return lib.suit.randomGet(); + }; + "step 1"; + event.suit = result.control; + player.popup(event.suit + 2); + game.log(player, "选择了", event.suit + 2); + player.gainPlayerCard(target, true, "h", "visibleMove"); + "step 2"; + if (result.bool) { + var suit2 = get.suit(result.cards[0]); + if (suit2 == event.suit) { + target.damage(); + event.finish(); + } else { + player.addTempSkill("daoshu_used", "phaseUseEnd"); + if ( + player.countCards("h", function (card) { + return get.suit(card) != suit2; + }) == 0 + ) { + player.showHandcards(); + event.finish(); + } else + player + .chooseCard( + "h", + true, + function (card) { + return get.suit(card) != _status.event.suit2; + }, + "交给" + get.translation(target) + "一张不为" + get.translation(suit2) + "花色的牌" + ) + .set("suit2", suit2); + } + } else event.finish(); + "step 3"; + player.give(result.cards, target, true); + }, + ai: { + order: 1, + result: { + target: -1, + }, + }, + subSkill: { + used: { sub: true }, + }, + }, + //统率三军诸葛瑾和文聘 + zhenwei_three: { + global: "zhenwei_three_others", + subSkill: { + others: { + mod: { + globalTo: function (from, to, distance) { + if ( + from.side != to.side && + game.hasPlayer(function (current) { + return current != to && current.side == to.side && current.hasSkill("zhenwei_three"); + }) + ) + return distance + 1; + }, + }, + sub: true, + }, + }, + }, + huanshi_three: { + audio: "huanshi", + trigger: { + global: "judge", + }, + filter: function (event, player) { + return player.countCards("hes") > 0 && player.side == event.player.side; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("huanshi_three"), "hes", function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result - get.value(card) / 2; + } else { + return -result - get.value(card) / 2; + } + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.bool) { + player.respond(result.cards, "highlight", "huanshi_three", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + game.delay(2); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + //变权移植 + wanwei: { + trigger: { target: ["rewriteGainResult", "rewriteDiscardResult"] }, + direct: true, + preHidden: true, + filter: function (event, player) { + return event.player != player; + }, + audio: 2, + content: function () { + "step 0"; + var prompt = "即将失去" + get.translation(trigger.result.cards) + ",是否发动【挽危】?"; + var next = player.choosePlayerCard(player, prompt, trigger.position); + next.set("ai", function (button) { + return 20 - get.value(button.link); + }); + next.filterButton = trigger.filterButton; + next.selectButton = trigger.result.cards.length; + next.setHiddenSkill("wanwei"); + "step 1"; + if (result.bool) { + player.logSkill("wanwei"); + trigger.result.cards = result.links.slice(0); + trigger.result.links = result.links.slice(0); + trigger.cards = result.links.slice(0); + trigger.untrigger(); + } + }, + }, + gzjili: { + mod: { + aiOrder: function (player, card, num) { + if (player.isPhaseUsing() && get.subtype(card) == "equip1" && !get.cardtag(card, "gifts")) { + var range0 = player.getAttackRange(); + var range = 0; + var info = get.info(card); + if (info && info.distance && info.distance.attackFrom) { + range -= info.distance.attackFrom; + } + if (player.getEquip(1)) { + var num = 0; + var info = get.info(player.getEquip(1)); + if (info && info.distance && info.distance.attackFrom) { + num -= info.distance.attackFrom; + } + range0 -= num; + } + range0 += range; + if ( + range0 == player.getHistory("useCard").length + player.getHistory("respond").length + 2 && + player.countCards("h", function (cardx) { + return get.subtype(cardx) != "equip1" && player.getUseValue(cardx) > 0; + }) + ) + return num + 10; + } + }, + }, + trigger: { player: ["useCard", "respond"] }, + frequent: true, + locked: false, + preHidden: true, + filter: function (event, player) { + return player.getHistory("useCard").length + player.getHistory("respond").length == player.getAttackRange(); + }, + audio: 2, + content: function () { + player.draw(player.getHistory("useCard").length + player.getHistory("respond").length); + }, + ai: { + threaten: 1.8, + effect: { + target: function (card, player, target, current) { + let used = target.getHistory("useCard").length + target.getHistory("respond").length; + if (get.subtype(card) == "equip1" && !get.cardtag(card, "gifts")) { + if (player != target || !player.isPhaseUsing()) return; + let range0 = player.getAttackRange(); + let range = 0; + let info = get.info(card); + if (info && info.distance && info.distance.attackFrom) { + range -= info.distance.attackFrom; + } + if (player.getEquip(1)) { + let num = 0; + let info = get.info(player.getEquip(1)); + if (info && info.distance && info.distance.attackFrom) { + num -= info.distance.attackFrom; + } + range0 -= num; + } + range0 += range; + let delta = range0 - used; + if (delta < 0) return; + let num = player.countCards("h", function (card) { + return (get.cardtag(card, "gifts") || get.subtype(card) != "equip1") && player.getUseValue(card) > 0; + }); + if (delta == 2 && num > 0) return [1, 3]; + if (num >= delta) return "zeroplayertarget"; + } else if (get.tag(card, "respondShan") > 0) { + if (current < 0 && used == target.getAttackRange() - 1) { + if (card.name === "sha") { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return; + } else if (!target.mayHaveShan(player)) return 0.9; + return [1, (used + 1) / 2]; + } + } else if (get.tag(card, "respondSha") > 0) { + if (current < 0 && used == target.getAttackRange() - 1 && target.mayHaveSha(player)) return [1, (used + 1) / 2]; + } + }, + }, + }, + }, + //新服曹笨 + xinshanjia: { + group: ["xinshanjia_count"], + locked: false, + mod: { + aiValue: function (player, card, num) { + if ((player.storage.xinshanjia || 0) < 3 && get.type(card) == "equip" && !get.cardtag(card, "gifts")) { + return num / player.hp; + } + }, + }, + audio: "shanjia", + trigger: { + player: "phaseUseBegin", + }, + intro: { + content: "本局游戏内已失去过#张装备牌", + }, + frequent: true, + sync: function (player) { + var history = player.actionHistory; + var num = 0; + for (var i = 0; i < history.length; i++) { + for (var j = 0; j < history[i].lose.length; j++) { + if (history[i].lose[j].parent.name == "useCard") continue; + num += history[i].lose[j].cards2.filter(function (card) { + return get.type(card, false) == "equip"; + }).length; + } + } + player.storage.xinshanjia = num; + if (num > 0) player.markSkill("xinshanjia"); + }, + content: function () { + "step 0"; + player.draw(3); + "step 1"; + lib.skill.xinshanjia.sync(player); + var num = 3 - player.storage.xinshanjia; + if (num > 0) { + player.chooseToDiscard("he", true, num).ai = get.disvalue; + } + "step 2"; + var bool1 = true, + bool2 = true; + if (result.cards) { + var cards = result.cards; + for (var i = 0; i < result.cards.length; i++) { + var type = get.type(result.cards[i], "trick", result.cards[i].original == "h" ? player : false); + if (type == "basic") bool1 = false; + if (type == "trick") bool2 = false; + } + } + if (bool1) player.addTempSkill("xinshanjia_sha", "phaseUseAfter"); + if (bool2) player.addTempSkill("xinshanjia_nodis", "phaseUseAfter"); + if (bool1 && bool2) { + player.chooseUseTarget({ name: "sha" }, "是否视为使用一张【杀】?", false); + } + }, + ai: { + threaten: 3, + noe: true, + reverseOrder: true, + skillTagFilter: function (player) { + if (player.storage.xinshanjia > 2) return false; + }, + effect: { + target: function (card, player, target) { + if (player.storage.xinshanjia < 3 && get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, + }, + subSkill: { + count: { + forced: true, + silent: true, + popup: false, + trigger: { + player: "loseEnd", + }, + filter: function (event, player) { + return event.cards2 && event.cards2.length > 0; + }, + content: function () { + lib.skill.xinshanjia.sync(player); + }, + }, + sha: { + mark: true, + charlotte: true, + intro: { content: "使用【杀】的次数上限+1" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + nodis: { + mark: true, + charlotte: true, + intro: { content: "使用牌无距离限制" }, + mod: { + targetInRange: () => true, + }, + }, + }, + }, + //OL马超 + ol_shichou: { + audio: 2, + trigger: { player: "useCard2" }, + filter: function (event, player) { + return event.card && event.card.name == "sha"; + }, + direct: true, + content: function () { + "step 0"; + var num = player.getDamagedHp() + 1; + player + .chooseTarget("是否发动【誓仇】?", "为" + get.translation(trigger.card) + "添加至多" + get.cnNumber(num) + "个目标", [1, num], function (card, player, target) { + var evt = _status.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", function (target) { + return get.effect(target, _status.event.getTrigger().card, _status.event.player); + }); + "step 1"; + if (result.bool && result.targets && result.targets.length) { + var targets = result.targets; + player.logSkill("ol_shichou", targets); + player.line(targets, trigger.card.nature); + trigger.targets.addArray(targets); + } + }, + }, + dc_olshichou: { + audio: "ol_shichou", + trigger: { player: "useCard2" }, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + player.isDamaged() && + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.filterTarget(event.card, player, current); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + var num = Math.min( + player.getDamagedHp(), + game.countPlayer(function (current) { + return !trigger.targets.includes(current) && lib.filter.filterTarget(trigger.card, player, current); + }) + ); + player.chooseTarget("是否发动【誓仇】,令至多" + get.cnNumber(num) + "名其他角色也成为此【杀】的目标?", [1, num], function (card, player, target) { + var evt = _status.event.getTrigger(); + return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); + }).ai = function (target) { + return get.effect(target, { name: "sha" }, _status.event.player); + }; + "step 1"; + if (result.bool && result.targets && result.targets.length) { + var targets = result.targets; + player.logSkill("dc_olshichou", targets); + player.line(targets, trigger.card.nature); + trigger.targets.addArray(targets); + trigger.ol_shichou = true; + player.addTempSkill("ol_shichou2"); + } + }, + }, + ol_shichou2: { + charlotte: true, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + event.ol_shichou && + !player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length && + event.cards.filterInD().length > 0 + ); + }, + forced: true, + popup: false, + content: function () { + player.gain(trigger.cards.filterInD(), "gain2"); + }, + }, + //新大小乔 + new_xingwu: { + audio: "xingwu", + trigger: { + player: "phaseDiscardBegin", + }, + direct: true, + intro: { + content: "expansion", + markcount: "expansion", + onunmark: function (storage, player) { + player.removeAdditionalSkill("new_luoyan"); + }, + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt("new_xingwu"), "将一张牌置于武将牌上作为“舞”") + .set("ai", function (card) { + if (_status.event.goon) return 20 - get.value(card); + return 7 - get.value(card); + }) + .set("goon", player.needsToDiscard() || player.getExpansions("new_xingwu").length > 1); + "step 1"; + if (result.bool) { + player.logSkill("new_xingwu"); + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("new_xingwu"); + if (player.hasSkill("new_luoyan")) player.addAdditionalSkill("new_luoyan", ["oltianxiang", "liuli"]); + } else event.finish(); + "step 2"; + game.delayx(); + var choices = []; + event.addIndex = 0; + if (player.getExpansions("new_xingwu").length > 2) { + choices.push("将三张“星舞”牌置入弃牌堆"); + } else event.addIndex++; + if ( + player.countCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "new_xingwu"); + }) > 1 + ) + choices.push("弃置两张手牌并将武将牌翻面"); + if (choices.length) { + player + .chooseControl("cancel2") + .set("prompt", "星舞:是否发射核弹?") + .set("choiceList", choices) + .set("ai", function () { + var player = _status.event.player; + if (player.getExpansions("new_xingwu").length > 2) return 0; + if (player.isTurnedOver() || player.identity == "fan" || player.getEnemies().length == 1) return 0; + return "cancel2"; + }); + } else event.finish(); + "step 3"; + if (result.control != "cancel2") { + var num = result.index + event.addIndex; + if (num == 1) { + event.goto(5); + return; + } + if (player.getExpansions("new_xingwu").length > 3) player.chooseButton(["请选择要移去的“星舞”牌", player.getExpansions("new_xingwu")], 3, true); + else + event._result = { + bool: true, + links: player.getExpansions("new_xingwu").slice(0), + }; + } else event.finish(); + "step 4"; + if (result.bool && result.links && result.links.length == 3) { + var cards = result.links; + player.loseToDiscardpile(cards); + event.goto(6); + } else event.finish(); + "step 5"; + player.chooseToDiscard(true, "h", 2); + player.turnOver(); + "step 6"; + player.chooseTarget("请选择【星舞】的目标", "弃置其装备区内的所有牌。然后对其造成2点伤害(目标为女性角色则改为1点)", true, lib.filter.notMe).set("ai", function (target) { + return ( + -get.attitude(_status.event.player, target) * + Math.sqrt( + 4 + + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) + ) * + (target.hasSex("female") ? 1 : 2) + ); + }); + "step 7"; + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + var num = target.countCards("e"); + if (num) player.discardPlayerCard(target, "e", num, true); + target.damage(target.hasSex("female") ? 1 : 2); + } + }, + ai: { + threaten: 1.5, + }, + }, + new_luoyan: { + init: function (player) { + if (player.getExpansions("new_xingwu").length) player.addAdditionalSkill("new_luoyan", ["oltianxiang", "liuli"]); + }, + onremove: function (player) { + player.removeAdditionalSkill("new_luoyan"); + }, + derivation: ["oltianxiang", "liuli"], + locked: true, + ai: { + combo: "new_xingwu", + }, + }, + //新孙鲁育 + new_meibu: { + audio: "meibu", + trigger: { + global: "phaseUseBegin", + }, + filter: function (event, player) { + return event.player != player && event.player.isIn() && player.countCards("he") > 0 && event.player.inRange(player); + }, + direct: true, + derivation: ["new_zhixi"], + checkx: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + var e2 = player.getEquip(2); + if (e2) { + if (e2.name == "tengjia" || e2.name == "rewrite_tengjia") return true; + if (e2.name == "bagua" || e2.name == "rewrite_bagua") return true; + } + return event.player.countCards("h") > event.player.hp; + }, + content: function () { + "step 0"; + var check = lib.skill.new_meibu.checkx(trigger, player); + player + .chooseToDiscard(get.prompt2("new_meibu", trigger.player), "he") + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }) + .set("check", check) + .set("logSkill", ["new_meibu", trigger.player]); + "step 1"; + if (result.bool) { + var target = trigger.player; + var card = result.cards[0]; + player.line(target, "green"); + target.addTempSkills("new_zhixi", "phaseUseAfter"); + if (card.name != "sha" && get.type(card) != "trick" && get.color(card) != "black") { + target.addTempSkill("new_meibu_range", "phaseUseAfter"); + target.markAuto("new_meibu_range", player); + } + target.markSkillCharacter("new_meibu", player, "魅步", "锁定技,出牌阶段,你至多可使用X张牌,你使用了锦囊牌后不能再使用牌(X为你的体力值)。"); + } + }, + ai: { + expose: 0.2, + }, + subSkill: { + range: { + onremove: true, + charlotte: true, + mod: { + globalFrom: function (from, to, num) { + if (from.getStorage("new_meibu_range").includes(to)) { + return -Infinity; + } + }, + }, + sub: true, + }, + }, + }, + new_mumu: { + audio: "mumu", + trigger: { + player: "phaseUseBegin", + }, + filter: function (event, player) { + return game.hasPlayer(current => { + if (current == player) return current.getEquips(2).length > 0; + return current.countCards("e") > 0; + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("new_mumu"), "弃置一名其他角色装备区内的一张牌,或者获得一名角色装备区内的防具牌", function (card, player, target) { + if (target == player) return target.getEquips(2).length > 0; + return target.countCards("e") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (target.getEquip(2) && player.hasEmptySlot(2)) { + return -2 * att; + } + return -att; + }); + "step 1"; + if (result.bool && result.targets && result.targets.length) { + event.target = result.targets[0]; + player.logSkill("new_mumu", event.target); + player.line(event.target, "green"); + var e = event.target.getEquips(2); + event.e = e; + if (target == player) event.choice = "获得一张防具牌"; + else if (e.length > 0) { + player.chooseControl("弃置一张装备牌", "获得一张防具牌").set("ai", function () { + if (_status.event.player.getEquips(2).length > 0) { + return "弃置一张装备牌"; + } + return "获得一张防具牌"; + }); + } else { + event.choice = "弃置一张装备牌"; + } + } else event.finish(); + "step 2"; + var choice = event.choice || result.control; + if (choice == "弃置一张装备牌") { + player.discardPlayerCard(event.target, "e", true); + } else { + if (event.e) { + player.gain(event.e, event.target, "give", "bySelf"); + player.addTempSkill("new_mumu2"); + } + } + }, + }, + new_zhixi: { + mod: { + cardEnabled: function (card, player) { + if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; + }, + cardUsable: function (card, player) { + if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; + }, + cardRespondable: function (card, player) { + if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; + }, + cardSavable: function (card, player) { + if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) return false; + }, + }, + trigger: { + player: "useCard1", + }, + forced: true, + popup: false, + firstDo: true, + init: function (player, skill) { + player.storage[skill] = 0; + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.player == player) { + player.getHistory("useCard", function (evtx) { + if (evtx.getParent("phaseUse") == evt) { + player.storage[skill]++; + if (get.type2(evtx.card) == "trick") player.storage.new_zhixi2 = true; + } + }); + } + }, + onremove: function (player) { + player.unmarkSkill("new_meibu"); + delete player.storage.new_zhixi; + delete player.storage.new_zhixi2; + }, + content: function () { + player.addMark("new_zhixi", 1, false); + if (get.type2(trigger.card) == "trick") player.storage.new_zhixi2 = true; + }, + ai: { + presha: true, + pretao: true, + neg: true, + nokeep: true, + }, + }, + new_mumu2: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + }, + qingzhong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + check: function (event, player) { + if ( + game.hasPlayer(function (current) { + return current != player && current.isMinHandcard() && get.attitude(player, current) > 0; + }) + ) { + return true; + } + if (player.countCards("h") <= 2) return true; + // if(player.countCards('h')<=3&&!player.countCards('h','shan')) return true; + //if(player.countCards('h',{type:'basic'})<=1) return true; + return false; + }, + content: function () { + player.draw(2); + player.addTempSkill("qingzhong_give"); + }, + subSkill: { + give: { + audio: "qingzhong", + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return !player.isMinHandcard(true); + }, + forced: true, + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current.isMinHandcard(); + }); + if (list.length == 1) { + if (list[0] != player) { + player.line(list[0], "green"); + player.swapHandcards(list[0]); + } + event.finish(); + } else { + player + .chooseTarget(true, "清忠:选择一名手牌最少的角色与其交换手牌", function (card, player, target) { + return target.isMinHandcard(); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + if (target != player) { + player.line(target, "green"); + player.swapHandcards(target); + } + } + }, + }, + }, + }, + weijing: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + if (event.type == "wuxie" || player.hasSkill("weijing_used")) return false; + for (var name of ["sha", "shan"]) { + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var vcards = []; + for (var name of ["sha", "shan"]) { + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); + } + var dialog = ui.create.dialog("卫境", [vcards, "vcard"], "hidden"); + dialog.direct = true; + return dialog; + }, + backup: function (links, player) { + return { + filterCard: () => false, + selectCard: -1, + viewAs: { + name: links[0][2], + isCard: true, + }, + popname: true, + precontent: function () { + player.logSkill("weijing"); + player.addTempSkill("weijing_used", "roundStart"); + }, + }; + }, + prompt: function (links, player) { + return "卫境:视为使用一张【" + get.translation(links[0][2]) + "】"; + }, + }, + ai: { + order: function (item, player) { + var player = _status.event.player; + var event = _status.event; + if (event.filterCard({ name: "sha" }, player, event)) { + if ( + !player.hasShan() && + !game.hasPlayer(function (current) { + return player.canUse("sha", current) && current.hp == 1 && get.effect(current, { name: "sha" }, player, player) > 0; + }) + ) { + return 0; + } + return 2.95; + } else { + var player = _status.event.player; + if (player.hasSkill("qingzhong_give")) return 2.95; + return 3.15; + } + }, + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (player.hasSkill("weijing_used")) return false; + if (arg != "use") return false; + }, + result: { + player: 1, + }, + }, + subSkill: { + used: { + mark: true, + intro: { + content: "本轮已发动", + }, + }, + }, + }, + zishu: { + audio: 2, + locked: true, + subSkill: { + discard: { + trigger: { global: "phaseEnd" }, + audio: "zishu", + forced: true, + filter: function (event, player) { + if (_status.currentPhase != player) { + var he = player.getCards("h"); + var bool = false; + player.getHistory("gain", function (evt) { + if (!bool && evt && evt.cards) { + for (var i = 0; i < evt.cards.length; i++) { + if (he.includes(evt.cards[i])) bool = true; + break; + } + } + }); + return bool; + } + return false; + }, + content: function () { + var he = player.getCards("h"); + var list = []; + player.getHistory("gain", function (evt) { + if (evt && evt.cards) { + for (var i = 0; i < evt.cards.length; i++) { + if (he.includes(evt.cards[i])) list.add(evt.cards[i]); + } + } + }); + player.$throw(list, 1000); + player.lose(list, ui.discardPile, "visible"); + game.log(player, "将", list, "置入弃牌堆"); + }, + }, + mark: { + trigger: { + player: "gainBegin", + global: "phaseBeginStart", + }, + silent: true, + filter: function (event, player) { + return event.name != "gain" || player != _status.currentPhase; + }, + content: function () { + if (trigger.name == "gain") trigger.gaintag.add("zishu"); + else player.removeGaintag("zishu"); + }, + }, + draw: { + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + audio: "zishu", + forced: true, + filter: function (event, player) { + if (_status.currentPhase != player || event.getg(player).length == 0) return false; + return event.getParent(2).name != "zishu_draw"; + }, + content: function () { + player.draw("nodelay"); + }, + }, + }, + ai: { + threaten: 1.2, + nogain: 1, + skillTagFilter: function (player) { + return player != _status.currentPhase; + }, + }, + group: ["zishu_draw", "zishu_discard", "zishu_mark"], + }, + xinyingyuan: { + audio: "yingyuan", + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + var type = get.type(event.card, "trick"); + return ( + player.getHistory("custom", function (evt) { + return evt.xinyingyuan_name == type; + }).length == 0 + ); + }, + content: function () { + "step 0"; + event.type = get.type(trigger.card, "trick"); + player + .chooseTarget(get.prompt("xinyingyuan"), "令一名其他角色从牌堆中获得一张" + get.translation(event.type) + "牌", function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att < 3) return 0; + if (target.hasJudge("lebu")) att /= 2; + if (target.hasSkillTag("nogain")) att /= 10; + return att / (1 + get.distance(player, target, "absolute")); + }); + "step 1"; + if (result.bool) { + player.logSkill("xinyingyuan", result.targets[0]); + var card = get.cardPile2(function (cardx) { + return get.type(cardx, "trick") == event.type; + }); + if (card) result.targets[0].gain(card, "log", "gain2"); + player.getHistory("custom").push({ xinyingyuan_name: event.type }); + } + }, + }, + yingyuan: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + if ( + player.getHistory("custom", function (evt) { + return evt.yingyuan_name == event.card.name; + }).length > 0 + ) + return false; + return event.cards.filterInD().length > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("yingyuan"), "将" + get.translation(trigger.cards) + "交给一名其他角色", function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + if (target.hasJudge("lebu")) return 0; + let att = get.attitude(_status.event.player, target), + name = _status.event.cards[0].name; + if (att < 3) return 0; + if (target.hasSkillTag("nogain")) att /= 10; + if (name === "sha" && target.hasSha()) att /= 5; + if (name === "wuxie" && target.needsToDiscard(_status.event.cards)) att /= 5; + return att / (1 + get.distance(player, target, "absolute")); + }) + .set("cards", trigger.cards); + "step 1"; + if (result.bool) { + player.logSkill("yingyuan", result.targets[0]); + result.targets[0].gain(trigger.cards.filterInD(), "gain2"); + player.getHistory("custom").push({ yingyuan_name: trigger.card.name }); + } + }, + }, + shuimeng: { + audio: 2, + trigger: { player: "phaseUseAfter" }, + direct: true, + filter: function (event, player) { + return player.countCards("h"); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("shuimeng"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + return -get.attitude(_status.event.player, target); + }) + .set( + "goon", + player.needsToDiscard() || + player.hasCard(function (card) { + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return card.number >= 11; + } + if (val <= 6) { + return card.number >= 12; + } + return false; + }) + ); + "step 1"; + if (result.bool) { + player.logSkill("shuimeng", result.targets); + event.target = result.targets[0]; + player.chooseToCompare(event.target); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.chooseUseTarget({ name: "wuzhong", isCard: true }, true); + } else { + event.target.useCard({ name: "guohe", isCard: true }, player); + } + }, + }, + qianya: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + return get.type(event.card, "trick") == "trick" && player.countCards("h"); + }, + content: function () { + "step 0"; + var nh = player.countCards("h"); + player.chooseCardTarget({ + filterCard: true, + filterTarget: function (card, player, target) { + return target != player; + }, + selectCard: [1, nh], + ai1: function (card) { + var player = _status.event.player; + var cardname = _status.event.cardname; + if (_status.event.du) return -get.value(card, player, "raw"); + else if (_status.event.shuimeng) { + if (cardname == "wuzhong") { + if ( + player.needsToDiscard(2, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) + return 10 - get.value(card, player, "raw"); + } else if (cardname == "guohe") { + if ( + player.needsToDiscard(-1, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) + return 10 - get.value(card, player, "raw"); + } + return 0; + } else if (cardname == "lebu") { + if ( + player.needsToDiscard(1, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) { + return 8 - get.value(card, player, "raw"); + } else { + if (!ui.selected.cards.length) { + return 6 - get.value(card, player, "raw"); + } + return 0; + } + } else if (cardname == "shunshou") { + if (_status.event.nh <= 2) return get.value(card, player, "raw"); + } else if (cardname == "huogong") { + if (player.hp == 1) return get.value(card, player, "raw"); + } + if (ui.selected.cards.length) return 0; + return 7 - get.value(card, player, "raw"); + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + var nh2 = target.countCards("h"); + var num = Math.sqrt(1 + nh2); + var cardname = _status.event.cardname; + if (_status.event.du) return 0.5 - att; + else if (_status.event.shuimeng) { + return att / num; + } else if (cardname == "lebu") { + return att / num; + } else if (cardname == "shunshou") { + if (_status.event.nh <= 2) return att / num; + } else if (cardname == "huogong") { + if (_status.event.player.hp == 1) return att / num; + } + if (_status.event.nh > nh2 + 1) { + return att / num; + } + return 0; + }, + du: player.hasCard(function (card) { + return get.value(card, player, "raw") < 0; + }), + shuimeng: trigger.getParent(2).name == "shuimeng", + nh: nh, + cardname: trigger.card.name, + prompt: get.prompt2("qianya"), + }); + "step 1"; + if (result.bool) { + player.logSkill("qianya", result.targets); + player.give(result.cards, result.targets[0]); + } + }, + }, + xianfu: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); + }, + audio: 6, + content: function () { + "step 0"; + player + .chooseTarget("请选择【先辅】的目标", lib.translate.xianfu_info, true, function (card, player, target) { + return target != player && (!player.storage.xianfu2 || !player.storage.xianfu2.includes(target)); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return att + 1; + if (att == 0) return Math.random(); + return att; + }).animate = false; + "step 1"; + if (result.bool) { + var target = result.targets[0]; + if (!player.storage.xianfu2) player.storage.xianfu2 = []; + player.storage.xianfu2.push(target); + player.addSkill("xianfu2"); + } + }, + }, + xianfu_mark: { + marktext: "辅", + intro: { + name: "先辅", + content: "当你受到伤害后,$受到等量的伤害,当你回复体力后,$回复等量的体力", + }, + }, + xianfu2: { + audio: "xianfu", + charlotte: true, + trigger: { global: ["damageEnd", "recoverEnd"] }, + forced: true, + filter: function (event, player) { + if (event.player.isDead() || !player.storage.xianfu2 || !player.storage.xianfu2.includes(event.player) || event.num <= 0) return false; + if (event.name == "damage") return true; + return player.isDamaged(); + }, + logTarget: "player", + content: function () { + "step 0"; + var target = trigger.player; + if (!target.storage.xianfu_mark) target.storage.xianfu_mark = []; + target.storage.xianfu_mark.add(player); + target.storage.xianfu_mark.sortBySeat(); + target.markSkill("xianfu_mark"); + game.delayx(); + "step 1"; + player[trigger.name](trigger.num, "nosource"); + }, + onremove: function (player) { + if (!player.storage.xianfu2) return; + game.countPlayer(function (current) { + if (player.storage.xianfu2.includes(current) && current.storage.xianfu_mark) { + current.storage.xianfu_mark.remove(player); + if (!current.storage.xianfu_mark.length) current.unmarkSkill("xianfu_mark"); + else current.markSkill("xianfu_mark"); + } + }); + delete player.storage.xianfu2; + }, + group: "xianfu3", + }, + xianfu3: { + trigger: { global: "dieBegin" }, + silent: true, + filter: function (event, player) { + return event.player == player || (player.storage.xianfu2 && player.storage.xianfu2.includes(player)); + }, + content: function () { + if (player == trigger.player) lib.skill.xianfu2.onremove(player); + else player.storage.xianfu2.remove(event.player); + }, + }, + chouce: { + trigger: { player: "damageEnd" }, + content: function () { + "step 0"; + event.num = trigger.num; + "step 1"; + player.judge(); + "step 2"; + event.color = result.color; + if (event.color == "black") { + if ( + game.hasPlayer(function (current) { + return current.countDiscardableCards(player, "hej") > 0; + }) + ) + player + .chooseTarget( + "弃置一名角色区域内的一张牌", + function (card, player, target) { + return target.countDiscardableCards(player, "hej"); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att < 0) { + att = -Math.sqrt(-att); + } else { + att = Math.sqrt(att); + } + return att * lib.card.guohe.ai.result.target(player, target); + }); + else event.finish(); + } else { + var next = player.chooseTarget("令一名角色摸一张牌"); + if (player.storage.xianfu2 && player.storage.xianfu2.length) { + next.set("prompt2", "(若目标为" + get.translation(player.storage.xianfu2) + "则改为摸两张牌)"); + } + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + if (player.storage.xianfu2 && player.storage.xianfu2.includes(target)) return att * 2; + return att; + }); + } + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + if (event.color == "black") { + player.discardPlayerCard(target, "hej", true); + } else { + if (player.storage.xianfu2 && player.storage.xianfu2.includes(target)) { + if (!target.storage.xianfu_mark) target.storage.xianfu_mark = []; + target.storage.xianfu_mark.add(player); + target.storage.xianfu_mark.sortBySeat(); + target.markSkill("xianfu_mark"); + target.draw(2); + } else { + target.draw(); + } + } + } + "step 4"; + if (--event.num > 0 && player.hasSkill("chouce")) { + player.chooseBool(get.prompt2("chouce")); + } else { + event.finish(); + } + "step 5"; + if (result.bool) { + player.logSkill("chouce"); + event.goto(1); + } + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [1, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [1, get.tag(card, "damage") * 1]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; + } + }, + }, + }, + }, + fuqi: { + audio: 2, + forced: true, + trigger: { + player: "useCard", + }, + filter: function (event, player) { + return ( + event.card && + (get.type(event.card) == "trick" || (get.type(event.card) == "basic" && !["shan", "tao", "jiu", "du"].includes(event.card.name))) && + game.hasPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); + }, + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return get.distance(arg.target, player) <= 1; + }, + }, + }, + wylianji: { + enable: "phaseUse", + audio: 2, + usable: 1, + filter: function (event, player) { + return player.hasCard(lib.skill.wylianji.filterCard); + }, + check: function (card) { + if (card.name == "sha") return 1; + else { + if (get.tag(card, "damage")) { + if (get.tag(card, "multineg")) return 5; + return 2; + } + } + return 0; + }, + filterCard: function (card) { + return get.name(card) == "sha" || (get.type(card, "trick") == "trick" && get.color(card) == "black" && !get.info(card).multitarget && get.info(card).enable); + }, + filterTarget: function (card, player, target) { + return ( + target != player && + !target.isMin() && + (player.canUse(card, target, false) || + game.hasPlayer(function (current) { + return current != player && target.canUse(card, current); + })) + ); + }, + discard: false, + lose: true, + delay: false, + content: function () { + "step 0"; + player.showCards(get.translation(player) + "对" + get.translation(target) + "发动了【连计】", cards); + "step 1"; + var equip1 = get.cardPile2(function (card) { + return get.subtype(card) == "equip1"; + }); + if (!equip1) { + player.popup("杯具"); + game.log("牌堆中无装备"); + event.finish(); + return; + } + if (equip1.name == "qinggang" && !lib.inpile.includes("qibaodao")) { + equip1.remove(); + equip1 = game.createCard2("qibaodao", equip1.suit, equip1.number); + } + target.$draw(equip1); + target.chooseUseTarget(true, equip1, "nothrow", "nopopup"); + game.delay(); + "step 2"; + game.updateRoundNumber(); + var card = cards[0]; + var bool1 = game.hasPlayer(function (current) { + return current != player && target.canUse(card, current); + }); + var bool2 = player.canUse(card, target, false); + if (bool1 && bool2) { + target + .chooseControl(function () { + return 0; + }) + .set("choiceList", ["对除" + get.translation(player) + "以外的角色使用" + get.translation(cards) + ",并将装备区里的武器牌交给该牌的一个目标角色", "视为" + get.translation(player) + "对你使用" + get.translation(cards) + ",并将装备区内的武器牌交给" + get.translation(player)]); + } else if (bool1) { + event.directindex = 0; + } else if (bool2) { + event.directindex = 1; + } else { + event.finish(); + } + "step 3"; + var card = cards[0]; + if (result && typeof event.directindex != "number") { + event.directindex = result.index; + } + if (event.directindex == 1) { + event.insert(lib.skill.wylianji.content_use, { + player: player, + target: target, + card: card, + }); + } else { + event.insert(lib.skill.wylianji.content_give, { + player: target, + card: card, + targets: game.filterPlayer(function (current) { + return current != player; + }), + }); + } + }, + content_use: function () { + "step 0"; + player.useCard(card, target); + "step 1"; + if (!get.owner(card)) { + target.gain(card, "gain2"); + } + "step 2"; + var equip1 = target.getEquips(1); + if (equip1.length) { + game.delay(); + target.give(equip1, player); + target.line(player); + } + }, + content_give: function () { + "step 0"; + var select = get.select(get.info(card).selectTarget); + if (select[1] == -1) { + for (var i = 0; i < targets.length; i++) { + if (!player.canUse(card, targets[i])) { + targets.splice(i--, 1); + } + } + if (targets.length) { + player.useCard(card, targets); + } + event.list = targets.slice(0); + event.goto(2); + } else { + player + .chooseTarget(select, "选择" + get.translation(card) + "的目标", true, function (cardx, player, target) { + var card = _status.event.card; + return _status.event.targets.includes(target) && player.canUse(card, target); + }) + .set("ai", function (target) { + var card = _status.event.card; + var player = _status.event.player; + return get.effect(target, card, player, player); + }) + .set("targets", targets) + .set("card", card); + } + "step 1"; + if (result.bool) { + player.useCard(card, result.targets); + event.list = result.targets.slice(0); + } + "step 2"; + var equip1 = player.getEquips(1); + if (equip1.length) { + for (var i = 0; i < event.list.length; i++) { + if (event.list[i].isDead()) event.list.splice(i--, 1); + } + if (event.list.length > 1) { + player + .chooseTarget(true, "将" + get.translation(equip1) + "交给一名角色", function (card, player, target) { + return _status.event.list.includes(target); + }) + .set("ai", function (target) { + return get.attitude(player, target); + }) + .set("list", _status.event.list); + event.equip1 = equip1; + } else { + if (event.list.length == 1) { + player.give(equip1, event.list[0]); + player.line(event.list); + } + event.finish(); + } + } else { + event.finish(); + } + "step 3"; + if (result.bool && result.targets.length && event.equip1) { + player.give(event.equip1, result.targets[0]); + player.line(result.targets); + } + }, + ai: { + order: 7, + result: { + target: function (player, target) { + if (ui.selected.cards.length) { + var card = ui.selected.cards[0]; + var bool = card.name != "sha"; + if ( + game.hasPlayer(function (current) { + return target.canUse(card, current, bool) && get.effect(current, card, target, player) > 0; + }) + ) { + var num = 1; + if (target.getEquip(1)) { + num = 0.6; + } + if (target.hasSkillTag("noe")) 2 * num; + return num; + } + } + return 0; + }, + }, + }, + }, + moucheng: { + audio: 2, + derivation: ["jingong", "wy_meirenji", "wy_xiaolicangdao"], + trigger: { global: "damageEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.source != player && event.getParent(2).name == "useCard" && event.getParent(3).name == "wylianjiInserted"; + }, + init: function (player) { + player.storage.moucheng = 0; + }, + intro: { + content: "已造成#点伤害", + }, + unique: true, + juexingji: true, + content: function () { + player.storage.moucheng += trigger.num; + if (player.hasSkill("moucheng")) { + player.markSkill("moucheng"); + player.syncStorage("moucheng"); + } + if (player.storage.moucheng >= 3) { + event.trigger("mouchengAwaken"); + } + }, + group: "moucheng_awaken", + subSkill: { + awaken: { + trigger: { player: "mouchengAwaken" }, + forced: true, + skillAnimation: true, + animationColor: "gray", + content: function () { + player.awakenSkill("moucheng"); + game.log(player, "失去了技能", "#g【连计】"); + player.changeSkills(["jingong"], ["wylianji"]); + }, + }, + }, + ai: { + combo: "wylianji", + }, + }, + jingong: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + event.xinjingong_list && + player.countCards("hes", function (card) { + return card.name == "sha" || get.type(card) == "equip"; + }) + ); + }, + onChooseToUse: function (event) { + if (!game.online) { + var evt = event.getParent(); + if (evt.name != "phaseUse") return; + if (!evt.xinjingong_list) { + var list = get.inpile("trick").randomGets(2); + if (Math.random() < 0.5) { + list.push("wy_meirenji"); + } else { + list.push("wy_xiaolicangdao"); + } + evt.xinjingong_list = list; + } + if (!event.xinjingong_list) event.set("xinjingong_list", evt.xinjingong_list); + } + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of event.xinjingong_list) list.push(["锦囊", "", i]); + return ui.create.dialog("矜功", [list, "vcard"]); + }, + filter: function (button, player) { + return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent()); + }, + check: function (button) { + return _status.event.player.getUseValue({ name: button.link[2] }); + }, + backup: function (links, player) { + return { + audio: "jingong", + popname: true, + position: "hes", + viewAs: { name: links[0][2] }, + check: function (card) { + return 6 - get.value(card); + }, + filterCard: function (card) { + return card.name == "sha" || get.type(card) == "equip"; + }, + precontent: function () { + player.addTempSkill("jingong2"); + }, + }; + }, + prompt: function (links, player) { + return "将一张【杀】或装备牌当做" + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 2, + result: { + player: function (player) { + if ((player.hp <= 2 || player.needsToDiscard()) && !player.getStat("damage")) return 0; + return 1; + }, + }, + }, + }, + jingong2: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return !player.getStat("damage"); + }, + content: function () { + player.loseHp(); + }, + }, + jingong3: { charlotte: true }, + weikui: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h"); + }, + content: function () { + "step 0"; + player.loseHp(); + "step 1"; + if (target.countCards("h", "shan")) { + player.viewHandcards(target); + if (player.canUse({ name: "sha", isCard: true }, target, false)) player.useCard({ name: "sha", isCard: true }, target, false); + player.storage.weikui2 = target; + player.addTempSkill("weikui2"); + } else { + player.discardPlayerCard(target, "visible", true, "h").set("ai", function (button) { + return get.value(button.link, _status.event.target); + }); + } + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if (player.hp <= 2) return 0; + if (player.hp == 3) return target.hp <= 2 ? -1 : 0; + return -1; + }, + }, + }, + }, + weikui2: { + onremove: true, + mod: { + globalFrom: function (from, to) { + if (to == from.storage.weikui2) return -Infinity; + }, + }, + mark: "character", + intro: { + content: "与$的距离视为1直到回合结束", + }, + }, + lizhan: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + for (var i = 0; i < game.players.length; i++) { + if (game.players[i].isDamaged()) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("lizhan"), "令任意名已受伤的角色各摸一张牌", [1, Infinity], function (card, player, target) { + return target.isDamaged(); + }) + .set("ai", function (target) { + return get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + player.logSkill("lizhan", result.targets); + game.asyncDraw(result.targets); + } + }, + ai: { + expose: 0.3, + threaten: 1.3, + }, + }, + xinfenyue: { + enable: "phaseUse", + audio: "fenyue", + filter: function (event, player) { + var num = game.players.length - player.getFriends(true).length; + if ((player.getStat().skill.xinfenyue || 0) >= num) return false; + return player.countCards("h") > 0; + }, + filterTarget: function (event, player, target) { + return player.canCompare(target); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (!result.bool) event.finish(); + event.num = result.num1; + "step 2"; + if (num <= 5 && target.countGainableCards(player, "he") > 0) player.gainPlayerCard(target, "he", true); + "step 3"; + if (num <= 9) { + var card = get.cardPile2(function (x) { + return x.name == "sha"; + }); + if (card) player.gain(card, "gain2"); + } + "step 4"; + if (num <= 13) { + var card = { name: "sha", nature: "thunder" }; + if (player.canUse(card, target, false)) player.useCard(card, target, false); + } + }, + ai: { + order: 4, + result: { + target: function (player, target) { + var sort = function (a, b) { + return b.number - a.number; + }; + var ps = player.getCards("h").sort(sort); + var ts = target.getCards("h").sort(sort); + if (ps[0].number > ts[0].number) { + var effect = get.effect(target, { name: "sha", nature: "thunder" }, player, player); + if (ps[0].number < 6 && target.countCards("he") > 1) effect -= 2; + if (ps[0].number < 10) effect -= 1; + return effect; + } + return ps.length >= ts.length ? -0.5 : 0; + }, + }, + }, + }, + fenyue: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.countCards("h")) return false; + var num; + if (get.mode() == "identity") { + num = game.countPlayer(function (current) { + return current.identity == "zhong" || current.identity == "mingzhong"; + }); + } else { + num = 1; + } + if (player.getStat().skill.fenyue >= num) return false; + return true; + }, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + ai: { + order: 2.8, + result: { + target: function (player, target) { + if ( + get.attitude(player, target) < 0 && + player.hasCard(function (card) { + return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; + }) + ) { + return get.effect(target, { name: "sha" }, player, target); + } else { + return 0; + } + }, + }, + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + player + .chooseControl(function () { + return 1; + }) + .set("choiceList", ["令" + get.translation(target) + "不能使用或打出手牌直到回合结束", "视为对" + get.translation(target) + "使用一张杀(不计入次数限制)"]); + } else { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; + } + event.finish(); + } + "step 2"; + if (result.control == "选项一") { + target.addTempSkill("fenyue2"); + } else { + player.useCard({ name: "sha", isCard: true }, target, false); + } + }, + }, + fenyue2: { + mark: true, + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; + }, + }, + intro: { + content: "不能使用或打出手牌", + }, + }, + + zfengshi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countCards("e"); + }, + logTarget: "target", + check: function (event, player) { + if (event.target.hasSkillTag("noe")) return false; + return get.attitude(player, event.target) < 0; + }, + content: function () { + trigger.target.chooseToDiscard("e", true); + }, + }, + chuanxin: { + audio: 2, + trigger: { source: "damageBegin2" }, + preHidden: true, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + if (!_status.event.getParent("phaseUse")) return false; + if (event.card && (event.card.name == "sha" || event.card.name == "juedou") && event.getParent().name == event.card.name) { + if (get.mode() == "guozhan") { + return (event.player.identity != "qun" || player.identity == "ye") && !event.player.isUnseen() && event.player.hasViceCharacter(); + } else { + var info = lib.character[event.player.name]; + if (!info) return false; + var skills = event.player.getSkills(); + for (var i = 0; i < info[3].length; i++) { + if (lib.skill[info[3][i]].fixed) continue; + if (skills.includes(info[3][i])) return true; + } + } + } + return false; + }, + logTarget: "player", + check: function (event, player) { + if (get.mode() == "guozhan") { + if (!event.player.isUnseen(1) && get.guozhanRank(event.player.name2, event.player) < 4) return false; + } + if (event.player.hasSkill("subplayer")) return false; + if (get.attitude(player, event.player) < 0) { + if (event.player.hp == 1 && event.player.countCards("e") < 2 && event.player.name2 != "gz_pangtong") return false; + return true; + } + return false; + }, + content: function () { + "step 0"; + trigger.cancel(); + if (trigger.player.countCards("e")) { + trigger.player + .chooseControl(function (event, player) { + if (get.mode() == "guozhan" && get.guozhanRank(player.name2, player) < 4) return 1; + if (player.hp == 1) return 1; + if (player.hp == 2 && player.countCards("e") >= 2) return 1; + return 0; + }) + .set("choiceList", ["弃置装备区内的所有牌并失去1点体力", get.mode() == "guozhan" ? "移除副将牌" : "随机移除武将牌上的一个技能"]); + } else { + event._result = { index: 1 }; + } + "step 1"; + if (result.index == 1) { + if (get.mode() != "guozhan") { + var info = lib.character[trigger.player.name]; + var skills = trigger.player.getSkills(); + var list = []; + for (var i = 0; i < info[3].length; i++) { + if (lib.skill[info[3][i]].fixed) continue; + if (skills.includes(info[3][i])) { + list.push(info[3][i]); + } + } + if (list.length) { + var skill = list.randomGet(); + trigger.player.removeSkills(skill); + } + } else { + trigger.player.removeCharacter(1); + } + } else { + trigger.player.discard(trigger.player.getCards("e")); + trigger.player.loseHp(); + } + }, + }, + hengjiang: { + audio: 2, + trigger: { player: "damageEnd" }, + preHidden: true, + check: function (event, player) { + return get.attitude(player, _status.currentPhase) < 0 || !_status.currentPhase.needsToDiscard(2); + }, + filter: function (event) { + return _status.currentPhase && _status.currentPhase.isIn() && event.num > 0; + }, + logTarget: function () { + return _status.currentPhase; + }, + content: function () { + var source = _status.currentPhase; + if (source.hasSkill("hengjiang2")) { + source.storage.hengjiang2 += trigger.num; + source.storage.hengjiang3.add(player); + source.updateMarks(); + } else { + source.storage.hengjiang3 = [player]; + source.storage.hengjiang2 = trigger.num; + source.addTempSkill("hengjiang2"); + } + }, + ai: { + maixie_defend: true, + }, + }, + hengjiang2: { + mark: true, + charlotte: true, + intro: { + content: "手牌上限-#", + }, + mod: { + maxHandcard: function (player, num) { + return num - player.storage.hengjiang2; + }, + }, + onremove: function (player) { + delete player.storage.hengjiang2; + delete player.storage.hengjiang3; + }, + trigger: { player: "phaseDiscardEnd" }, + filter: function (event, player) { + if (event.cards && event.cards.length) return false; + var players = player.storage.hengjiang3; + for (var i = 0; i < players.length; i++) { + if (players[i].isIn()) return true; + } + return false; + }, + forced: true, + popup: false, + content: function () { + var players = player.storage.hengjiang3; + for (var i = 0; i < players.length; i++) { + if (players[i].isIn()) { + players[i].logSkill("hengjiang"); + players[i].line(player, "green"); + } + } + game.asyncDraw(player.storage.hengjiang3); + }, + }, + rehengjiang: { + audio: "hengjiang", + trigger: { player: "damageEnd" }, + check: function (event, player) { + return get.attitude(player, _status.currentPhase) < 0 || !_status.currentPhase.needsToDiscard(2); + }, + filter: function (event) { + return _status.currentPhase && _status.currentPhase.isIn() && event.num > 0; + }, + logTarget: function () { + return _status.currentPhase; + }, + preHidden: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + var source = _status.currentPhase; + source.addTempSkill("rehengjiang2"); + source.addMark("rehengjiang2", 1, false); + player.addTempSkill("rehengjiang3"); + "step 2"; + if (event.count && player.hasSkill("rehengjiang")) { + player.chooseBool(get.prompt2("rehengjiang", _status.currentPhase)).set("ai", function () { + return lib.skill.rehengjiang.check(_status.event.getTrigger(), _status.event.player); + }); + } else event.finish(); + "step 3"; + if (result.bool) { + player.logSkill("rehengjiang", _status.currentPhase); + event.goto(1); + } + }, + ai: { + maixie_defend: true, + notemp: true, + }, + }, + rehengjiang2: { + mark: true, + charlotte: true, + onremove: true, + intro: { + content: "手牌上限-#", + }, + mod: { + maxHandcard: function (player, num) { + return num - player.storage.rehengjiang2; + }, + }, + }, + rehengjiang3: { + audio: "hengjiang", + trigger: { global: "phaseEnd" }, + forced: true, + charlotte: true, + filterx: function (event, player) { + if (!event.player.countMark("rehengjiang2")) return false; + if ( + event.player.hasHistory("lose", function (evt) { + return evt.type == "discard" && evt.cards2.length > 0 && evt.getParent("phaseDiscard").player == event.player; + }) + ) + return false; + return true; + }, + logTarget: "player", + content: function () { + if (lib.skill.rehengjiang3.filterx(trigger, player)) { + var num = player.getHistory("useSkill", function (evt) { + return evt.skill == "rehengjiang" && evt.targets.includes(trigger.player); + }).length; + if (num > 0) player.draw(num); + } else player.draw(); + }, + }, + shuangren: { + trigger: { player: "phaseUseBegin" }, + direct: true, + preHidden: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && player.canCompare(current); + }) + ); + }, + content: function () { + "step 0"; + var goon; + if (player.needsToDiscard() > 1) { + goon = player.hasCard(function (card) { + return card.number > 10 && get.value(card) <= 5; + }); + } else { + goon = player.hasCard(function (card) { + return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; + }); + } + player + .chooseTarget(get.prompt2("shuangren"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + if (_status.event.goon && get.attitude(player, target) < 0) { + return get.effect(target, { name: "sha" }, player, player); + } + return 0; + }) + .set("goon", goon) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("shuangren", target); + player.chooseToCompare(target); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + var target = event.target; + if ( + game.hasPlayer(function (current) { + if (target == current) return false; + if (!player.canUse("sha", current, false)) return false; + return target.isFriendOf(current); + }) + ) { + var str = "对一名与" + get.translation(target) + "势力相同的"; + player + .chooseTarget(str + "角色使用一张杀", true, function (card, player, target) { + if (!player.canUse("sha", target, false)) return false; + if (get.mode() == "guozhan") { + return target.isFriendOf(_status.event.identity); + } + return true; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }) + .set("identity", target); + } else { + player.useCard({ name: "sha", isCard: true }, target, false); + event.finish(); + } + } else { + player.addTempSkill("zishou2"); + event.finish(); + } + "step 3"; + if (result.bool && result.targets && result.targets.length) { + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); + } + }, + }, + kuanshi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("kuanshi")).set("ai", function (target) { + if (get.attitude(_status.event.player, target) > 0) { + return 1 / Math.sqrt(target.hp + 1); + } + return 0; + }).animate = false; + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("kuanshi"); + target.storage.kuanshi2 = player; + target.addSkill("kuanshi2"); + } + }, + }, + kuanshi2: { + /*mark:'character', + intro:{ + content:'下一次受到超过1点的伤害时,防止此伤害,然后$跳过下个回合的摸牌阶段' + },*/ + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return event.num > 1; + }, + //priority:-11, + content: function () { + trigger.cancel(); + player.storage.kuanshi2.skip("phaseDraw"); + player.removeSkill("kuanshi2"); + }, + group: "kuanshi2_remove", + onremove: true, + subSkill: { + remove: { + trigger: { global: ["phaseZhunbeiBegin", "dieAfter"] }, + forced: true, + popup: false, + filter: function (event, player) { + return event.player == player.storage.kuanshi2; + }, + content: function () { + player.removeSkill("kuanshi2"); + }, + }, + }, + }, + xiashu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + var maxval = 0; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + maxval = Math.max(maxval, get.value(hs[i])); + } + player + .chooseTarget(get.prompt2("xiashu"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + var maxval = _status.event.maxval; + var dh = target.countCards("h") - player.countCards("h"); + var att = get.attitude(player, target); + if (target.hasSkill("qingjian")) return false; + if (dh <= 0) return 0; + if (att > 0) return 0.1; + if (maxval >= 8) return 0; + if (att == 0) return 0.2; + if (dh >= 3) return dh; + if (dh == 2) { + if (maxval <= 7) return dh; + } + if (maxval <= 6) return dh; + return 0; + }) + .set("maxval", maxval); + "step 1"; + if (result.bool) { + player.logSkill("xiashu", result.targets); + event.target = result.targets[0]; + var hs = player.getCards("h"); + player.give(hs, event.target); + } else { + event.finish(); + } + "step 2"; + var hs = event.target.getCards("h"); + if (!hs.length) { + event.finish(); + return; + } + hs.sort(function (a, b) { + return get.value(b, player, "raw") - get.value(a, player, "raw"); + }); + event.target + .chooseCard([1, hs.length], "展示至少一张手牌", true) + .set("ai", function (card) { + var rand = _status.event.rand; + var list = _status.event.list; + if (_status.event.att) { + if (ui.selected.cards.length >= Math.ceil(list.length / 2)) return 0; + var value = get.value(card); + if (_status.event.getParent().player.isHealthy()) { + value += (get.tag(card, "damage") ? 1.5 : 0) + (get.tag(card, "draw") ? 2 : 0); + } + return value; + } + if (ui.selected.cards.length >= Math.floor(list.length / 2)) return 0; + return list.indexOf(card) % 2 == rand ? 1 : 0; + }) + .set("rand", Math.random() < 0.6 ? 1 : 0) + .set("list", hs) + .set("att", get.attitude(event.target, player) > 0); + "step 3"; + event.target.showCards(result.cards); + event.cards1 = result.cards; + event.cards2 = event.target.getCards("h", function (card) { + return !event.cards1.includes(card); + }); + "step 4"; + var choice; + var num1 = event.cards1.length; + var num2 = event.cards2.length; + if (get.attitude(event.target, player) > 0 && num1 >= num2) { + choice = 0; + } else if (num1 == num2) { + choice = Math.random() < 0.45 ? 0 : 1; + } else if (num1 > num2) { + if (num1 - num2 == 1) { + choice = Math.random() < 0.6 ? 0 : 1; + } else { + choice = 0; + } + } else { + if (num2 - num1 == 1) { + choice = Math.random() < 0.6 ? 1 : 0; + } else { + choice = 1; + } + } + player + .chooseControl(function (event, player) { + return _status.event.choice; + }) + .set("choiceList", ["获得" + get.translation(event.target) + "展示的牌", "获得" + get.translation(event.target) + "未展示的牌"]) + .set("choice", choice); + "step 5"; + if (result.index == 0) { + player.gain(event.cards1, target, "give", "bySelf"); + } else { + player.gain(event.cards2, target, "giveAuto", "bySelf"); + } + }, + ai: { + expose: 0.1, + }, + }, + sheyan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + filter: function (event, player) { + if (!event.targets || !event.targets.includes(player)) return false; + var info = get.info(event.card); + if (info.type != "trick") return false; + if (info.multitarget) return false; + if (event.targets.length > 1) return true; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, event.player, current); + }); + }, + direct: true, + content: function () { + "step 0"; + var bool1 = trigger.targets.length > 1; + var bool2 = game.hasPlayer(function (current) { + return !trigger.targets.includes(current) && lib.filter.targetEnabled2(trigger.card, trigger.player, current); + }); + if (bool1 && bool2) { + player + .chooseControlList(get.prompt("sheyan"), ["为" + get.translation(trigger.card) + "增加一个目标", "为" + get.translation(trigger.card) + "减少一个目标"], function (event, player) { + if (_status.event.add) return 0; + return 1; + }) + .set("add", get.effect(player, trigger.card, trigger.player, player) >= 0); + } else if (bool2) { + event.type = "add"; + event.goto(2); + event.unchosen = true; + } else { + event.type = "remove"; + event.goto(2); + event.unchosen = true; + } + "step 1"; + if (result.control == "cancel2") { + event.finish(); + } else if (result.index == 1) { + event.type = "remove"; + } else { + event.type = "add"; + } + "step 2"; + if (event.type == "add") { + player + .chooseTarget(event.unchosen ? get.prompt("sheyan") : null, "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { + var trigger = _status.event.getTrigger(); + return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, trigger.player, target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, trigger.player, _status.event.player); + }); + } else { + player + .chooseTarget(event.unchosen ? get.prompt("sheyan") : null, "为" + get.translation(trigger.card) + "减少一个目标", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + return -get.effect(target, trigger.card, trigger.player, _status.event.player); + }) + .set("targets", trigger.targets); + } + "step 3"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 4"; + player.logSkill("sheyan", event.target); + if (event.type == "add") { + trigger.targets.push(event.target); + } else { + trigger.getParent().excluded.add(event.target); + } + }, + ai: { + expose: 0.2, + }, + }, + bingzheng: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("bingzheng"), function (card, player, target) { + return target.countCards("h") != target.hp; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var nh = target.countCards("h"); + if (att > 0) { + if (nh == target.hp - 1) { + if (player == target) return att + 1; + return att + 2; + } + if (player == target && player.needsToDiscard()) return att / 3; + return att; + } else { + if (nh == target.hp + 1) return -att; + if (nh == 0) return 0; + return -att / 2; + } + }); + "step 1"; + if (result.bool) { + player.logSkill("bingzheng", result.targets); + event.target = result.targets[0]; + if (event.target.countCards("h")) { + player + .chooseControl(function (event, player) { + var target = event.target; + if (get.attitude(player, target) < 0) return 1; + return 0; + }) + .set("choiceList", ["令" + get.translation(event.target) + "摸一张牌", "令" + get.translation(event.target) + "弃置一张手牌"]); + } else { + event.directfalse = true; + } + } else { + event.finish(); + } + "step 2"; + if (event.directfalse || result.index == 0) { + event.target.draw(); + } else { + event.target.chooseToDiscard("h", true); + } + "step 3"; + if (event.target.countCards("h") == event.target.hp) { + player.draw(); + if (event.target == player) { + event.finish(); + return; + } + var next = player.chooseCard("是否交给" + get.translation(event.target) + "一张牌?", "he"); + next.set("ai", function (card) { + if (get.position(card) != "h") return 0; + if (_status.event.shan && card.name == "shan") { + return 11; + } + if (_status.event.goon) { + return 10 - get.value(card); + } + return -get.value(card, _status.event.player, "raw"); + }); + if (get.attitude(player, event.target) > 1 && player.countCards("h", "shan") > 1 && player.countCards("h") > event.target.countCards("h")) { + next.set("shan", true); + } + if (get.attitude(player, event.target) > 0 && player.needsToDiscard()) { + next.set("goon", true); + } + } else { + event.finish(); + } + "step 4"; + if (result.bool) { + player.give(result.cards, target); + } + }, + ai: { + expose: 0.2, + threaten: 1.4, + }, + }, + fuman: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + if (target == player) return false; + var stat = player.getStat("skill").fuman_targets; + return !stat || !stat.includes(target); + }, + filter: function (event, player) { + return player.countCards("h") > 0 && game.hasPlayer(current => lib.skill.fuman.filterTarget(null, player, current)); + }, + discard: false, + lose: false, + delay: false, + filterCard: true, + content: function () { + player.give(cards, target).gaintag.add("fuman"); + target.addSkill("fuman2"); + player.addSkill("fuman_draw"); + var stat = player.getStat("skill"); + if (!stat.fuman_targets) stat.fuman_targets = []; + stat.fuman_targets.push(target); + }, + check: function (card) { + return 6 - get.value(card); + }, + ai: { + order: 2, + result: { + target: function (player, target) { + if (!target.hasSha()) return 1.2; + return 1; + }, + }, + }, + subSkill: { + draw: { + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("fuman")) return true; + } + return false; + }); + }, + logTarget: "player", + content: function () { + player.draw( + trigger.player.hasHistory("sourceDamage", function (evt) { + return evt.card == trigger.card; + }) + ? 2 + : 1 + ); + }, + }, + }, + }, + fuman2: { + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("fuman")) return num + 1; + }, + cardname: function (card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("fuman")) return "sha"; + }, + }, + }, + qizhou: { + trigger: { player: ["phaseBefore", "equipEnd", "loseEnd"] }, + forced: true, + popup: false, + derivation: ["mashu", "reyingzi", "reduanbing", "fenwei"], + filter: function (event, player) { + if (player.equiping) return false; + var suits = []; + var es = player.getCards("e"); + for (var i = 0; i < es.length; i++) { + suits.add(get.suit(es[i])); + } + if (player.additionalSkills.qizhou) { + return player.additionalSkills.qizhou.length != suits.length; + } else { + return suits.length > 0; + } + }, + content: function () { + var suits = []; + var es = player.getCards("e"); + for (var i = 0; i < es.length; i++) { + suits.add(get.suit(es[i])); + } + player.removeAdditionalSkill("qizhou"); + switch (suits.length) { + case 1: + player.addAdditionalSkill("qizhou", ["mashu"]); + break; + case 2: + player.addAdditionalSkill("qizhou", ["mashu", "reyingzi"]); + break; + case 3: + player.addAdditionalSkill("qizhou", ["mashu", "reyingzi", "reduanbing"]); + break; + case 4: + player.addAdditionalSkill("qizhou", ["mashu", "reyingzi", "reduanbing", "fenwei"]); + break; + } + }, + ai: { + threaten: 1.2, + }, + }, + shanxi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: { color: "red", type: "basic" }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") && player.inRange(target); + }, + check: function (card) { + return 6 - get.value(card); + }, + content: function () { + "step 0"; + player.discardPlayerCard(target, true); + "step 1"; + if (result.bool) { + if (get.name(result.cards[0], result.cards[0].original == "h" ? player : false) == "shan") { + player.viewHandcards(target); + } else { + target.viewHandcards(player); + } + } + }, + ai: { + order: 8, + result: { + target: -1, + }, + }, + }, + fenxun: { + enable: "phaseUse", + usable: 1, + position: "he", + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { + player.markAuto("fenxun2", [target]); + player.addTempSkill("fenxun2"); + }, + check: function (card) { + if (card.name == "sha" && _status.event.player.countCards("h", "sha") <= 1) return 0; + return 6 - get.value(card); + }, + filterCard: true, + ai: { + order: 4, + result: { + player: function (player, target) { + if (get.distance(player, target) <= 1) return 0; + var hs = player.getCards("h", "shunshou"); + if (hs.length && player.canUse(hs[0], target, false)) { + return 1; + } + var geteff = function (current) { + return player.canUse("sha", current, false, true) && get.effect(current, { name: "sha" }, player, player) > 0; + }; + if (player.hasSha() && geteff(target)) { + var num = game.countPlayer(function (current) { + return current != player && get.distance(player, current) <= 1 && geteff(current); + }); + if (num == 0) { + if ( + game.hasPlayer(function (current) { + return player.canUse("sha", current) && geteff(current) && current != target; + }) + ) { + return 1; + } + } else if (num == 1) { + return 1; + } + } + return 0; + }, + }, + }, + }, + fenxun2: { + mark: "character", + onremove: true, + intro: { + content: "到$的距离视为1", + }, + mod: { + globalFrom: function (from, to) { + if (from.getStorage("fenxun2").includes(to)) { + return -Infinity; + } + }, + }, + }, + duanbing: { + audio: 2, + audioname: ["heqi"], + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && get.distance(player, current) <= 1 && player.canUse(event.card, current); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("duanbing"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { + return !_status.event.sourcex.includes(target) && get.distance(player, target) <= 1 && player.canUse(_status.event.card, target); + }) + .set("sourcex", trigger.targets) + .set("ai", function (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.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + player.logSkill("duanbing", event.target); + trigger.targets.push(event.target); + }, + ai: { + effect: { + player: function (card, player, target, current, isLink) { + if (!isLink && card.name == "sha") { + if (player._duanbingtmp) return; + player._duanbingtmp = true; + if (get.effect(target, card, player, player) <= 0) { + delete player._duanbingtmp; + return; + } + if ( + game.hasPlayer(function (current) { + return current != target && get.distance(player, current) <= 1 && player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + delete player._duanbingtmp; + return [1, 1]; + } + delete player._duanbingtmp; + } + }, + }, + }, + }, + fuhan: { + audio: 2, + trigger: { player: "phaseBegin" }, + unique: true, + limited: true, + skillAnimation: true, + animationColor: "orange", + forceunique: true, + filter: function (event, player) { + return player.storage.fanghun2 > 0; + }, + prompt: function (event, player) { + var num = Math.max(2, player.storage.fanghun2 || 0); + num = Math.min(num, 8); + return get.prompt("fuhan") + "(体力上限:" + num + ")"; + }, + check: function (event, player) { + var num = Math.max(2, player.storage.fanghun2 || 0); + if (num == 1) return false; + if (player.hp <= 1) return true; + if (num == 2) return false; + if (num == 3) return player.hp < 3 && player.isMinHp(); + return true; + }, + content: function () { + "step 0"; + if (player.storage.fanghun) player.draw(player.storage.fanghun); + player.removeMark("fanghun", player.storage.fanghun); + event.num = Math.max(2, player.storage.fanghun2 || 0); + var list; + if (_status.characterlist) { + list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + if (lib.character[name][1] == "shu") list.push(name); + } + } else if (_status.connectMode) { + list = get.charactersOL(function (i) { + return lib.character[i][1] != "shu"; + }); + } else { + list = get.gainableCharacters(function (info) { + return info[1] == "shu"; + }); + } + var players = game.players.concat(game.dead); + for (var i = 0; i < players.length; i++) { + list.remove(players[i].name); + list.remove(players[i].name1); + list.remove(players[i].name2); + } + list.remove("zhaoyun"); + list.remove("re_zhaoyun"); + list.remove("ol_zhaoyun"); + // var dialog=ui.create.dialog(); + // dialog.add([list.randomGets(5),'character']); + player + .chooseButton(true) + .set("ai", function (button) { + return get.rank(button.link, true) - lib.character[button.link][2]; + }) + .set("createDialog", ["将武将牌替换为一名角色", [list.randomGets(5), "character"]]); + player.awakenSkill("fuhan"); + "step 1"; + event.num = Math.min(event.num, 8); + player.reinitCharacter("zhaoxiang", result.links[0]); + "step 2"; + var num = event.num - player.maxHp; + if (num > 0) player.gainMaxHp(num); + else player.loseMaxHp(-num); + player.recover(); + }, + ai: { + combo: "fanghun", + }, + }, + refuhan: { + audio: "fuhan", + trigger: { player: "phaseZhunbeiBegin" }, + unique: true, + limited: true, + skillAnimation: true, + animationColor: "orange", + forceunique: true, + filter: function (event, player) { + return player.countMark("fanghun") > 0; + }, + content: function () { + "step 0"; + if (player.storage.fanghun) player.draw(player.storage.fanghun); + player.removeMark("fanghun", player.storage.fanghun); + player.awakenSkill("refuhan"); + "step 1"; + var list; + if (_status.characterlist) { + list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + if (lib.character[name][1] == "shu") list.push(name); + } + } else if (_status.connectMode) { + list = get.charactersOL(function (i) { + return lib.character[i][1] != "shu"; + }); + } else { + list = get.gainableCharacters(function (info) { + return info[1] == "shu"; + }); + } + var players = game.players.concat(game.dead); + for (var i = 0; i < players.length; i++) { + list.remove(players[i].name); + list.remove(players[i].name1); + list.remove(players[i].name2); + } + list.remove("zhaoyun"); + list.remove("re_zhaoyun"); + list.remove("ol_zhaoyun"); + list = list.randomGets(Math.max(4, game.countPlayer())); + var skills = []; + for (var i of list) { + skills.addArray( + (lib.character[i][3] || []).filter(function (skill) { + var info = get.info(skill); + return info && !info.zhuSkill && !info.limited && !info.juexingji && !info.hiddenSkill && !info.charlotte && !info.dutySkill; + }) + ); + } + if (!list.length || !skills.length) { + event.finish(); + return; + } + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + _status.imchoosing = false; + event._result = { + bool: true, + skills: skills.randomGets(2), + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + }; + var chooseButton = function (list, skills) { + var event = _status.event; + if (!event._result) event._result = {}; + event._result.skills = []; + var rSkill = event._result.skills; + var dialog = ui.create.dialog("请选择获得至多两个技能", [list, "character"], "hidden"); + event.dialog = dialog; + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + for (var i = 0; i < skills.length; i++) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.link = skills[i]; + table.appendChild(td); + td.innerHTML = "" + get.translation(skills[i]) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + if (!this.classList.contains("bluebg")) { + if (rSkill.length >= 2) return; + rSkill.add(link); + this.classList.add("bluebg"); + } else { + this.classList.remove("bluebg"); + rSkill.remove(link); + } + }); + } + dialog.content.appendChild(table); + dialog.add("  "); + dialog.open(); + + event.switchToAuto = function () { + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }; + event.control = ui.create.control("ok", function (link) { + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }); + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("selectable"); + } + game.pause(); + game.countChoose(); + }; + if (event.isMine()) { + chooseButton(list, skills); + } else if (event.isOnline()) { + event.player.send(chooseButton, list, skills); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 2"; + var map = event.result || result; + if (map && map.skills && map.skills.length) { + player.addSkills(map.skills); + } + game.broadcastAll(function (list) { + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.zhaoxiang = "fuhan"; + } + }, map.skills); + "step 3"; + if (player.isMinHp()) player.recover(); + }, + ai: { + combo: "refanghun", + }, + }, + refanghun: { + mod: { + aiValue: function (player, card, num) { + if (card.name != "sha" && card.name != "shan") return; + var geti = function () { + var cards = player.getCards("hs", function (card) { + return card.name == "sha" || card.name == "shan"; + }); + if (cards.includes(card)) { + return cards.indexOf(card); + } + return cards.length; + }; + return Math.max(num, [7, 5, 5, 3][Math.min(geti(), 3)]); + }, + }, + locked: false, + audio: "fanghun", + inherit: "fanghun", + trigger: { + player: "useCard", + target: "useCardToTargeted", + }, + }, + fanghun: { + hiddenCard: function (player, name) { + if (!player.storage.fanghun || player.storage.fanghun <= 0) return false; + if (name == "tao") return player.countCards("hs", "jiu") > 0; + if (name == "jiu") return player.countCards("hs", "tao") > 0; + return false; + }, + audio: 2, + marktext: "影", + intro: { + content: "mark", + name: "梅影", + }, + trigger: { + source: "damageSource", + player: "damageEnd", + }, + forced: true, + locked: false, + filter: function (event) { + return event.card && event.card.name == "sha"; + }, + content: function () { + player.addMark("fanghun", trigger.num || 1); + player.addMark("fanghun2", trigger.num || 1, false); + }, + group: ["fanghun_sha", "fanghun_draw"], + subSkill: { + draw: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + filter: function (event) { + return event.skill == "fanghun_sha" || event.skill == "fanghun_shan"; + }, + content: function () { + player.draw(); + }, + }, + sha: { + audio: "fanghun", + inherit: "ollongdan", + enable: ["chooseToUse", "chooseToRespond"], + prompt: "弃置一枚【梅影】标记,将杀当做闪,或将闪当做杀,或将桃当做酒,或将酒当做桃使用或打出", + filter: function (event, player) { + return player.hasMark("fanghun") && get.info("ollongdan").filter(event, player); + }, + onrespond: function () { + return this.onuse.apply(this, arguments); + }, + onuse: function (result, player) { + player.removeMark("fanghun", 1); + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + if (!player.hasMark("fanghun")) return false; + return get.info("ollongdan").ai.skillTagFilter(player, tag); + }, + order: function (item, player) { + if (!player || !player.storage) { + player = _status.event.player; + if (!player || !player.storage) return 0; + if ( + Object.keys(player.storage).some(i => { + return typeof i == "string" && i.indexOf("fuhan") != -1; + }) + ) + return 4; + return 1; + } + const awakened = Object.keys(player.storage).some(i => typeof i == "string" && i.indexOf("fuhan") != -1); + if (_status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao", "jiu"]; + var map = { sha: "shan", tao: "jiu", jiu: "tao" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if (player.countCards("hs", map[name]) > (name == "jiu" ? 1 : 0) && player.getUseValue({ name: name }) > 0) { + var temp = get.order({ name: name }); + if (temp > max) max = temp; + } + } + if (max > 0) max += awakened ? 0.3 : -0.3; + return max; + } + return awakened ? 4 : 1; + }, + }, + }, + }, + }, + yjixi: { + derivation: "rewangzun", + audio: "weidi", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + if (player.phaseNumber < 3) return false; + var num = 0; + for (var i = player.actionHistory.length - 1; i >= 0; i--) { + if (!player.actionHistory[i].isMe) continue; + if (_status.globalHistory[i].changeHp.some(evt => evt.player == player && evt.getParent().name == "loseHp")) return false; + else { + num++; + if (num >= 3) break; + } + } + return true; + }, + skillAnimation: true, + animationColor: "gray", + unique: true, + juexingji: true, + content: function () { + "step 0"; + player.awakenSkill("yjixi"); + player.gainMaxHp(); + player.recover(); + "step 1"; + var str = "摸两张牌"; + var mode = get.mode(); + var choice = "选项一"; + if (mode == "identity" || (mode == "versus" && _status.mode == "four")) { + var list = []; + var zhu = get.zhu(player); + if (zhu && zhu != player && zhu.skills) { + for (var i = 0; i < zhu.skills.length; i++) { + if (lib.skill[zhu.skills[i]] && lib.skill[zhu.skills[i]].zhuSkill) { + list.push(zhu.skills[i]); + } + } + } + if (list.length) { + str += "并获得技能" + get.translation(list); + event.list = list; + choice = "选项二"; + } + } + player + .chooseControl(function (event, player) { + return _status.event.choice; + }) + .set("choiceList", ["获得技能〖妄尊〗", str]) + .set("choice", choice); + "step 2"; + if (result.control == "选项一") { + player.addSkills("rewangzun"); + } else { + player.draw(2); + if (event.list) { + player.addSkills(event.list); + game.broadcastAll(function (list) { + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.old_yuanshu = "weidi"; + } + }, event.list); + } + } + }, + }, + xinyongsi: { + audio: "yongsi", + group: ["xinyongsi1", "xinyongsi2"], + locked: true, + }, + xinyongsi1: { + audio: "yongsi1", + trigger: { player: "phaseDrawBegin1" }, + forced: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + player.draw(game.countGroup()); + trigger.changeToZero(); + }, + }, + xinyongsi2: { + audio: "yongsi2", + trigger: { player: "phaseDiscardBegin" }, + forced: true, + check: function () { + return false; + }, + content: function () { + "step 0"; + player.chooseToDiscard("he", "庸肆").set("prompt2", "弃置一张牌,或取消并失去1点体力").ai = function (card) { + return 8 - get.value(card); + }; + "step 1"; + if (!result.bool) player.loseHp(); + }, + }, + lianzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + filterTarget: function (card, player, target) { + return target != player; + }, + check: function (card) { + var num = get.value(card); + if (get.color(card) == "black") { + if (num >= 6) return 0; + return 20 - num; + } else { + if (_status.event.player.needsToDiscard()) return 7 - num; + } + return 0; + }, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.give(cards, target); + if (get.color(cards[0]) == "black") { + target + .chooseToDiscard(2, "he", "弃置两张牌,或令" + get.translation(player) + "摸两张牌") + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) < 0); + } else { + event.finish(); + } + "step 1"; + if (!result.bool) { + player.draw(2); + } + }, + ai: { + order: 8, + expose: 0.2, + result: { + target: function (player, target) { + if (ui.selected.cards.length && get.color(ui.selected.cards[0]) == "red") { + if (target.countCards("h") < player.countCards("h")) return 1; + return 0.5; + } + return -1; + }, + }, + }, + }, + xiehui: { + mod: { + ignoredHandcard: function (card, player) { + if (get.color(card) == "black") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.color(card) == "black") return false; + }, + }, + trigger: { + global: "gainAfter", + player: "loseAsyncAfter", + }, + forced: true, + popup: false, + filter: function (event, player) { + if (event.name == "loseAsync") { + if (event.type != "gain") return false; + return game.hasPlayer(function (current) { + if (current == player) return false; + var hs = current.getCards("h"), + cards = event.getl(player).cards2; + var cardsx = event.getg(current); + for (var i of cardsx) { + if (hs.includes(i) && cards.includes(i) && get.color(i, player) == "black") return true; + } + return false; + }); + } + if (event.player != player) { + var hs = event.player.getCards("h"); + var evt = event.getl(player); + return ( + evt && + evt.cards2 && + evt.cards2.filter(function (card) { + return hs.includes(card) && get.color(card, player) == "black"; + }).length > 0 + ); + } + return false; + }, + content: function () { + var cards = trigger.getl(player).cards2; + game.countPlayer(function (current) { + if (current == player) return; + var hs = current.getCards("h"), + cardsx = trigger.getg(current).filter(function (card) { + return hs.includes(card) && cards.includes(card) && get.color(card, player) == "black"; + }); + if (cardsx.length > 0) { + current.addSkill("xiehui2"); + current.addGaintag(cards, "xiehui"); + } + }); + }, + }, + xiehui2: { + mark: true, + intro: { + content: "不能使用、打出或弃置得到的黑色牌", + }, + mod: { + cardDiscardable: function (card, player) { + if (card.hasGaintag("xiehui")) return false; + }, + cardEnabled2: function (card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("xiehui")) return false; + }, + }, + trigger: { player: "changeHp" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event) { + return event.num < 0; + }, + content: function () { + player.removeSkill("xiehui2"); + }, + onremove: function (player) { + player.removeGaintag("xiehui"); + }, + }, + shanjia: { + sync: function (player) { + if (game.online) return; + var history = player.actionHistory; + var num = 0; + for (var i = 0; i < history.length; i++) { + for (var j = 0; j < history[i].useCard.length; j++) { + if (get.type(history[i].useCard[j].card) == "equip") num++; + } + } + player.storage.shanjia = num; + if (num > 0) player.markSkill("shanjia"); + }, + audio: 2, + intro: { + content: function (storage) { + if (storage == 0) return "未使用过装备牌"; + return "已使用过" + storage + "张装备牌"; + }, + }, + group: "shanjia2", + trigger: { player: "phaseUseBegin" }, + frequent: true, + filter: function (event, player) { + lib.skill.shanjia.sync(player); + return player.storage.shanjia > 0; + }, + content: function () { + "step 0"; + lib.skill.shanjia.sync(player); + player.draw(Math.min(7, player.storage.shanjia)); + "step 1"; + player.chooseToDiscard("he", Math.min(7, player.storage.shanjia), true); + "step 2"; + var useCard = false; + if (result.bool && result.cards) { + for (var i = 0; i < result.cards.length; i++) { + if (result.cards[i].original == "e") { + useCard = true; + break; + } + } + } + if (useCard) { + player.chooseUseTarget({ name: "sha" }, false, "是否视为使用一张【杀】?", "nodistance"); + } + }, + ai: { + threaten: function (player, target) { + if (typeof target.storage.shanjia == "number") { + return Math.min(2, Math.sqrt(1 + target.storage.shanjia)); + } + }, + }, + }, + shanjia2: { + trigger: { player: "useCard" }, + silent: true, + filter: function (event, player) { + return get.type(event.card) == "equip"; + }, + content: function () { + lib.skill.shanjia.sync(player); + }, + }, + zhanyi: { + enable: "phaseUse", + usable: 1, + audio: 2, + filterCard: true, + position: "he", + check: function (card) { + var player = _status.event.player; + if (player.hp < 3) return 0; + var type = get.type(card, "trick"); + if (type == "trick") { + return 6 - get.value(card); + } else if (type == "equip") { + if ( + player.hasSha() && + game.hasPlayer(function (current) { + return player.canUse("sha", current) && get.attitude(player, current) < 0 && get.effect(current, { name: "sha" }, player, player) > 0; + }) + ) { + return 6 - get.value(card); + } + } + return 0; + }, + content: function () { + player.loseHp(); + switch (get.type(cards[0], "trick")) { + case "basic": + player.addTempSkill("zhanyi_basic"); + break; + case "equip": + player.addTempSkill("zhanyi_equip"); + break; + case "trick": + player.addTempSkill("zhanyi_trick"); + player.draw(2); + break; + } + }, + ai: { + order: 9.1, + result: { + player: 1, + }, + }, + }, + zhanyi_basic: { + group: ["zhanyi_basic_sha", "zhanyi_basic_jiu", "zhanyi_basic_tao"], + }, + zhanyi_basic_tao: { + enable: "chooseToUse", + filterCard: { type: "basic" }, + viewAs: { name: "tao" }, + viewAsFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; + }, + prompt: "将一张基本牌当桃使用", + check: function (card) { + return 8 - get.value(card); + }, + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; + }, + save: true, + }, + }, + zhanyi_basic_sha: { + enable: "chooseToUse", + filterCard: { type: "basic" }, + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; + }, + prompt: "将一张基本牌当杀使用", + check: function (card) { + return 4 - get.value(card); + }, + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; + }, + respondSha: true, + }, + }, + zhanyi_basic_jiu: { + enable: "chooseToUse", + filterCard: { type: "basic" }, + viewAs: { name: "jiu" }, + viewAsFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; + }, + prompt: "将一张基本牌当酒使用", + check: function (card) { + if (_status.event.type == "dying") return 1; + return 4 - get.value(card); + }, + ai: { + skillTagFilter: function (player) { + return player.countCards("h", { type: "basic" }) > 0 && player.hp <= 0; + }, + save: true, + }, + }, + zhanyi_equip: { + trigger: { player: "shaBegin" }, + forced: true, + filter: function (event, player) { + return event.target.countCards("he") > 0; + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + content: function () { + trigger.target.chooseToDiscard("he", true, 2); + }, + }, + zhanyi_trick: { + mod: { + targetInRange: function () { + return true; + }, + }, + }, + dingpan: { + enable: "phaseUse", + filter: function (event, player) { + var num; + var mode = get.mode(); + if (mode == "identity" || mode == "doudizhu") { + if (mode == "identity" && _status.mode == "purple") num = player.getEnemies().length; + else num = get.population("fan"); + } else if (mode == "versus") { + if (!_status.mode || _status.mode != "two") num = player.getEnemies().length; + else { + var target = game.findPlayer(x => { + var num = x.getFriends().length; + return !game.hasPlayer(y => { + return x != y && y.getFriends().length > num; + }); + }); + num = target ? target.getFriends(true).length : 1; + } + } else { + num = 1; + } + if ((player.getStat().skill.dingpan || 0) >= num) return false; + return true; + }, + filterTarget: function (card, player, target) { + return target.countCards("e") > 0; + }, + content: function () { + "step 0"; + target.draw(); + "step 1"; + var goon = get.damageEffect(target, player, target) >= 0; + if (!goon && target.hp >= 4 && get.attitude(player, target) < 0) { + var es = target.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (get.equipValue(es[i], target) >= 8) { + goon = true; + break; + } + } + } + target + .chooseControl(function () { + if (_status.event.goon) return "选项二"; + return "选项一"; + }) + .set("goon", goon) + .set("prompt", "定叛") + .set("choiceList", ["令" + get.translation(player) + "弃置你装备区里的一张牌", "获得你装备区内的所有牌并受到1点伤害"]); + "step 2"; + if (result.control == "选项一") { + player.discardPlayerCard(target, true, "e"); + event.finish(); + } else { + target.gain(target.getCards("e"), "gain2"); + } + "step 3"; + game.delay(0.5); + target.damage(); + }, + ai: { + order: 7, + result: { + target: function (player, target) { + if (get.damageEffect(target, player, target) >= 0) return 2; + var att = get.attitude(player, target); + if (att == 0) return 0; + var es = target.getCards("e"); + if (att > 0 && (target.countCards("h") > 2 || target.needsToDiscard(1))) return 0; + if (es.length == 1 && att > 0) return 0; + for (var i = 0; i < es.length; i++) { + var val = get.equipValue(es[i], target); + if (val <= 4) { + if (att > 0) { + return 1; + } + } else if (val >= 7) { + if (att < 0) { + return -1; + } + } + } + return 0; + }, + }, + }, + }, + hongde: { + audio: 2, + trigger: { + player: ["loseAfter", "gainAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + var num = event.getl(player).cards2.length; + if (event.getg) num = Math.max(num, event.getg(player).length); + return num > 1; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("hongde"), "令一名其他角色摸一张牌", function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + return get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + player.logSkill("hongde", result.targets); + result.targets[0].draw(); + } + }, + }, + ziyuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: function (card) { + 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; + }, + complexCard: true, + selectCard: function () { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); + } + if (num == 13) return ui.selected.cards.length; + return ui.selected.cards.length + 2; + }, + discard: false, + lose: false, + delay: false, + filterTarget: function (card, player, target) { + return player != target; + }, + 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 9 - 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 (cards[i].number + cards[j].number == 13) { + if (cards[i] == card || cards[j] == card) return 8.5 - get.value(card); + } + } + } + } + return 0; + }, + content: function () { + player.give(cards, target, "give"); + target.recover(); + }, + ai: { + order: function (skill, player) { + if ( + game.hasPlayer(function (current) { + return current.hp < current.maxHp && current != player && get.recoverEffect(current, player, player) > 0; + }) + ) { + return 10; + } + return 1; + }, + result: { + player: function (player, target) { + if (get.attitude(player, target) < 0) return -1; + var eff = get.recoverEffect(target, player, player); + if (eff < 0) return 0; + if (eff > 0) { + if (target.hp == 1) return 3; + return 2; + } + if (player.needsToDiscard()) return 1; + return 0; + }, + }, + threaten: 1.3, + }, + }, + jugu: { + audio: 2, + mod: { + maxHandcard: function (player, num) { + return num + player.maxHp; + }, + }, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + player.draw(player.maxHp); + }, + }, + tuifeng: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + notemp: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player.chooseCard(get.prompt2("tuifeng"), "he", [1, trigger.num]).set("ai", function (card) { + if (card.name == "du") return 20; + return 7 - get.useful(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("tuifeng"); + player.addToExpansion(result.cards, player, "give").gaintag.add("tuifeng"); + } + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + marktext: "锋", + intro: { + content: "expansion", + markcount: "expansion", + }, + group: "tuifeng2", + ai: { + threaten: 0.8, + maixie: true, + maixie_hp: true, + }, + }, + tuifeng2: { + audio: "tuifeng", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.getExpansions("tuifeng").length > 0; + }, + content: function () { + var cards = player.getExpansions("tuifeng"); + player.draw(2 * cards.length); + player.addTempSkill("tuifeng3"); + player.addMark("tuifeng3", cards.length, false); + player.loseToDiscardpile(cards); + }, + }, + tuifeng3: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("tuifeng3"); + }, + }, + onremove: true, + charlotte: true, + }, + weidi: { + init(player) { + const list = []; + const zhu = get.zhu(player); + if (zhu && zhu != player && zhu.skills) { + for (var i = 0; i < zhu.skills.length; i++) { + if (lib.skill[zhu.skills[i]] && lib.skill[zhu.skills[i]].zhuSkill) { + list.push(zhu.skills[i]); + } + } + } + player.addAdditionalSkill("weidi", list); + game.broadcastAll(function (list) { + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.yuanshu = "weidi"; + } + }, list); + }, + trigger: { global: ["gameStart", "changeSkillsAfter"] }, + forced: true, + audio: 2, + filter: function (event, player) { + const mode = get.mode(); + if (mode != "identity" && (mode != "versus" || _status.mode != "four")) return false; + const zhu = get.zhu(player); + if (!zhu || zhu == player) return false; + if (event.name == "gameStart") return true; + return ( + event.player == zhu && + (event.addSkill.some(skill => { + return lib.skill[skill] && lib.skill[skill].zhuSkill; + }) || + event.addSkill.some(skill => { + return lib.skill[skill] && lib.skill[skill].zhuSkill; + })) + ); + }, + async content(event, trigger, player) { + lib.skill.weidi.init(player); + }, + }, + zhenlue: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event) { + return get.type(event.card) == "trick"; + }, + content: function () { + trigger.nowuxie = true; + }, + mod: { + targetEnabled: function (card, player, target) { + if (get.type(card) == "delay") { + return false; + } + }, + }, + }, + jianshu: { + audio: 2, + unique: true, + limited: true, + enable: "phaseUse", + animationColor: "thunder", + skillAnimation: "epic", + filter: function (event, player) { + return !player.storage.jianshu && player.countCards("h", { color: "black" }) > 0; + }, + init: function (player) { + player.storage.jianshu = false; + }, + 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: { color: "black" }, + mark: 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, + multitarget: true, + content: function () { + "step 0"; + player.awakenSkill("jianshu"); + player.storage.jianshu = true; + player.give(cards, targets[0], "give"); + "step 1"; + targets[0].chooseToCompare(targets[1]); + "step 2"; + if (result.bool) { + targets[0].chooseToDiscard("he", 2, true); + targets[1].loseHp(); + } else if (result.tie) { + targets[0].loseHp(); + targets[1].loseHp(); + } else { + targets[1].chooseToDiscard("he", 2, true); + targets[0].loseHp(); + } + }, + intro: { + content: "limited", + }, + ai: { + expose: 0.4, + order: 4, + result: { + target: function (player, target) { + if (player.hasUnknown()) return 0; + if (ui.selected.targets.length) return -1; + return -0.5; + }, + }, + }, + }, + yongdi: { + audio: 2, + audioname: ["xinping"], + unique: true, + limited: true, + trigger: { player: "phaseZhunbeiBegin" }, + animationColor: "thunder", + skillAnimation: "legend", + mark: true, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yongdi"), function (card, player, target) { + return (target.hasSex("male") || target.name == "key_yuri") && target != player; + }) + .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" || _status.mode == "guandu"))) { + 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) { + var target = result.targets[0]; + player.logSkill("yongdi", target); + player.awakenSkill("yongdi"); + target.gainMaxHp(); + target.recover(); + var skills = target.getStockSkills(true, true).filter(skill => { + if (target.hasSkill(skill)) return false; + var info = get.info(skill); + return info && info.zhuSkill; + }); + if (skills.length) { + target.addSkills(skills); + } + } + }, + ai: { expose: 0.2 }, + }, + regushe: { + audio: "gushe", + enable: "phaseUse", + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + selectTarget: [1, 3], + filter: function (event, player) { + return player.countMark("regushe") + player.countMark("regushe2") < 7 && player.countCards("h") > 0; + }, + multitarget: true, + multiline: true, + content: function () { + player.addTempSkill("regushe2"); + player.chooseToCompare(targets).callback = lib.skill.regushe.callback; + }, + intro: { + name: "饶舌", + content: "mark", + }, + callback: function () { + "step 0"; + if (event.num1 <= event.num2) { + target.chat(lib.skill.gushe.chat[player.countMark("regushe")]); + game.delay(); + player.addMark("regushe", 1); + if (player.countMark("regushe") >= 7) { + player.die(); + } + } else player.addMark("regushe2", 1, false); + "step 1"; + if (event.num1 <= event.num2) { + player.chooseToDiscard("he", "弃置一张牌,或摸一张牌").set("ai", function () { + return -1; + }); + } else event.goto(3); + "step 2"; + if (!result.bool) { + player.draw(); + } + "step 3"; + if (event.num1 >= event.num2) { + target + .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(player) + "摸一张牌") + .set("ai", function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) < 0); + } else event.finish(); + "step 4"; + if (!result.bool) player.draw(); + }, + ai: { + order: 7, + result: { + target: function (player, target) { + var num = ui.selected.targets.length + 1; + if (num + player.countMark("regushe") <= 6) return -1; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + if (get.value(hs[i]) <= 6) { + switch (hs[i].number) { + case 13: + return -1; + case 12: + if (player.countMark("regushe") + num <= 8) return -1; + break; + case 11: + if (player.countMark("regushe") + num <= 7) return -1; + break; + default: + if (hs[i].number > 5 && player.countMark("regushe") + num <= 6) return -1; + } + } + } + return 0; + }, + }, + }, + marktext: "饶", + }, + regushe2: { + charlotte: true, + onremove: true, + }, + rejici: { + audio: "jici", + trigger: { + player: "compare", + target: "compare", + }, + forced: true, + filter: function (event, player) { + // if(player!=event.target&&event.iwhile) return false; + return (player == event.player ? event.num1 : event.num2) <= player.countMark("regushe"); + }, + content: function () { + if (player == trigger.target || !trigger.iwhile) { + trigger[player == trigger.player ? "num1" : "num2"] += player.countMark("regushe"); + game.log(player, "的拼点牌点数+" + player.countMark("regushe")); + } + game.delayx(); + // var cards=[trigger.card1]; + // if(trigger.cardlist) cards.addArray(trigger.cardlist); + // else cards.push(trigger.card2); + // cards.sort(function(a,b){ + // return get.number(b)-get.number(a); + // }); + // var num=get.number(cards[0]); + // for(var i=1;i trigger.num2) cards.push(trigger.card1); + if (trigger.num1 < trigger.num2) cards.push(trigger.card2); + cards = cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); + }, + group: "rejici2", + ai: { + combo: "regushe", + }, + }, + rejici2: { + audio: "jici", + trigger: { player: "die" }, + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "water", + filter: function (event, player) { + return event.source && event.source.isIn(); + }, + logTarget: "source", + content: function () { + var num = 7 - player.countMark("regushe"); + if (num > 0) trigger.source.chooseToDiscard(num, true, "he"); + trigger.source.loseHp(); + }, + }, + gushe: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + selectTarget: [1, 3], + filter: function (event, player) { + return player.countCards("h") > 0; + }, + multitarget: true, + multiline: true, + content: function () { + player.chooseToCompare(targets).callback = lib.skill.gushe.callback; + }, + intro: { + name: "饶舌", + content: "mark", + }, + chat: ["粗鄙之语", "天地不容", "谄谀之臣", "皓首匹夫,苍髯老贼", "二臣贼子", "断脊之犬", "我从未见过有如此厚颜无耻之人!"], + callback: function () { + "step 0"; + if (event.num1 <= event.num2) { + target.chat(lib.skill.gushe.chat[player.countMark("gushe")]); + game.delay(); + player.addMark("gushe", 1); + if (player.countMark("gushe") >= 7) { + player.die(); + } + } + "step 1"; + if (event.num1 <= event.num2) { + player.chooseToDiscard("he", "弃置一张牌,或摸一张牌").set("ai", function () { + return -1; + }); + } else event.goto(3); + "step 2"; + if (!result.bool) { + player.draw(); + } + "step 3"; + if (event.num1 >= event.num2) { + target + .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(player) + "摸一张牌") + .set("ai", function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) < 0); + } else event.finish(); + "step 4"; + if (!result.bool) player.draw(); + }, + ai: { + order: 7, + result: { + target: function (player, target) { + var num = ui.selected.targets.length + 1; + if (num > 3) num = 3; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + if (get.value(hs[i]) <= 6) { + switch (hs[i].number) { + case 13: + return -1; + case 12: + if (player.countMark("gushe") + num <= 8) return -1; + break; + case 11: + if (player.countMark("gushe") + num <= 7) return -1; + break; + default: + if (hs[i].number > 5 && player.countMark("gushe") + num <= 6) return -1; + } + } + } + return 0; + }, + }, + }, + }, + jici: { + audio: 2, + trigger: { player: "compare" }, + filter: function (event, player) { + return event.getParent().name == "gushe" && !event.iwhile && event.num1 <= player.countMark("gushe"); + }, + content: function () { + if (trigger.num1 < player.countMark("gushe")) { + trigger.num1 += player.countMark("gushe"); + } else { + player.getStat().skill.gushe--; + } + }, + ai: { + combo: "gushe", + }, + }, + juesi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h", "sha") > 0; + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0 && player.inRange(target); + }, + filterCard: { name: "sha" }, + content: function () { + "step 0"; + target.chooseToDiscard("he", true); + "step 1"; + if (target.hp >= player.hp && result.bool && result.cards[0].name != "sha") { + player.useCard({ name: "juedou", isCard: true }, target); + } + }, + ai: { + order: 2, + result: { + target: function (player, target) { + if (get.effect(target, { name: "juedou" }, player, player) <= 0) { + return 0; + } + if (target.hp < player.hp) { + if (player.countCards("h") > player.hp) return -0.1; + return 0; + } + var hs1 = target.getCards("h", "sha"); + var hs2 = player.getCards("h", "sha"); + if (hs1.length > hs2.length) { + return 0; + } + var hsx = target.getCards("h"); + if (hsx.length > 2 && hs2.length <= 1 && hsx[0].number < 6) { + return 0; + } + if (hsx.length > 3 && hs2.length <= 1) { + return 0; + } + if (hs1.length > hs2.length - 1 && hs1.length > 0 && (hs2.length <= 1 || hs1[0].number > hs2[0].number)) { + return 0; + } + return -1; + }, + }, + }, + }, + shefu: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + init: function (player) { + if (!player.storage.shefu) player.storage.shefu = []; + if (!player.storage.shefu2) player.storage.shefu2 = []; + }, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "cards", + onunmark: function (storage, player) { + player.storage.shefu = []; + player.storage.shefu2 = []; + }, + mark: function (dialog, content, player) { + if (content && content.length) { + dialog.addAuto(content); + if (player.isUnderControl(true)) { + var str = ""; + for (var i = 0; i < player.storage.shefu2.length; i++) { + str += get.translation(player.storage.shefu2[i]); + if (i < player.storage.shefu2.length - 1) { + str += "、"; + } + } + dialog.add('
    ' + str + "
    "); + } + } + }, + }, + content: function () { + "step 0"; + var list1 = [], + list2 = [], + list3 = []; + for (var i = 0; i < lib.inpile.length; i++) { + var type = get.type(lib.inpile[i]); + if (type == "basic") { + list1.push(["基本", "", lib.inpile[i]]); + } else if (type == "trick") { + list2.push(["锦囊", "", lib.inpile[i]]); + } else if (type == "delay") { + list3.push(["锦囊", "", lib.inpile[i]]); + } + } + player + .chooseButton([get.prompt("shefu"), [list1.concat(list2).concat(list3), "vcard"]]) + .set("filterButton", function (button) { + var player = _status.event.player; + if (player.storage.shefu2 && player.storage.shefu2.includes(button.link[2])) return false; + return true; + }) + .set("ai", function (button) { + var rand = _status.event.rand; + switch (button.link[2]) { + case "sha": + return 5 + rand[1]; + case "tao": + return 4 + rand[2]; + case "lebu": + return 3 + rand[3]; + case "shan": + return 4.5 + rand[4]; + case "wuzhong": + return 4 + rand[5]; + case "shunshou": + return 3 + rand[6]; + case "nanman": + return 2 + rand[7]; + case "wanjian": + return 2 + rand[8]; + default: + return rand[0]; + } + }) + .set("rand", [Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random()]); + "step 1"; + if (result.bool) { + event.cardname = result.links[0][2]; + player.logSkill("shefu"); + player.chooseCard("he", "选择一张牌作为“伏兵”", true); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + player.addToExpansion(card, player, "give").gaintag.add("shefu"); + } + "step 3"; + if (player.getExpansions("shefu").includes(event.card)) { + player.storage.shefu.push(card); + player.storage.shefu2.push(event.cardname); + if (player.isOnline2()) { + player.send(function (storage) { + game.me.storage.shefu2 = storage; + }, player.storage.shefu2); + } + player.syncStorage("shefu"); + player.markSkill("shefu"); + } + }, + group: ["shefu2"], + }, + shefu2: { + trigger: { global: ["useCard"] }, + //priority:15, + audio: "shefu", + filter: function (event, player) { + if (_status.currentPhase == player || event.player == player) return false; + return ( + player.storage.shefu2 && + player.storage.shefu2.includes(event.card.name) && + event.player.getHistory("lose", function (evt) { + return evt.getParent() == event && evt.hs && evt.hs.length == event.cards.length; + }).length + ); + }, + direct: true, + content: function () { + "step 0"; + var effect = 0; + if (trigger.card.name == "wuxie" || trigger.card.name == "shan") { + if (get.attitude(player, trigger.player) < -1) { + effect = -1; + } + } else if (trigger.targets && trigger.targets.length) { + for (var i = 0; i < trigger.targets.length; i++) { + effect += get.effect(trigger.targets[i], trigger.card, trigger.player, player); + } + } + var str = "设伏:是否令" + get.translation(trigger.player); + if (trigger.targets && trigger.targets.length) { + str += "对" + get.translation(trigger.targets); + } + str += "使用的" + get.translation(trigger.card) + "失效?"; + var next = player.chooseBool(str, function () { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + if (_status.event.effect < 0) { + if (trigger.card.name == "sha") { + var target = trigger.targets[0]; + if (target == player) { + return !player.countCards("h", "shan"); + } else { + return target.hp == 1 || (target.countCards("h") <= 2 && target.hp <= 2); + } + } else { + return true; + } + } + return false; + }); + next.set("effect", effect); + "step 1"; + if (result.bool) { + player.logSkill("shefu", trigger.player); + var index = player.storage.shefu2.indexOf(trigger.card.name); + if (index != -1) { + var card = player.storage.shefu[index]; + player.loseToDiscardpile(card); + player.storage.shefu.splice(index, 1); + player.storage.shefu2.splice(index, 1); + if (player.storage.shefu.length == 0) { + player.unmarkSkill("shefu"); + } else { + player.syncStorage("shefu"); + player.markSkill("shefu"); + if (player.isOnline2()) { + player.send(function (storage) { + game.me.storage.shefu2 = storage; + }, player.storage.shefu2); + } + } + } + trigger.targets.length = 0; + trigger.all_excluded = true; + if (trigger.player == _status.currentPhase) trigger.player.addTempSkill("baiban"); + } + }, + ai: { + threaten: 1.8, + expose: 0.3, + }, + }, + benyu: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + if (!event.source) return false; + var nh1 = player.countCards("h"); + var nh2 = event.source.countCards("h"); + var eh = player.countCards("e"); + if (nh1 + eh > nh2 && event.source.isIn()) return true; + if (nh1 < Math.min(5, nh2)) return true; + }, + direct: true, + content: function () { + "step 0"; + var num1 = player.countCards("h"); + var num2 = trigger.source.countCards("h"); + var eh = player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "benyu"); + }); + var bool1 = false, + bool2 = false; + if (num1 < Math.min(num2, 5)) bool1 = true; + if (eh > num2 && trigger.source.isIn()) bool2 = true; + if (bool1 && bool2) { + event.chosen = true; + player + .chooseControl("cancel2") + .set("prompt", get.prompt("benyu", trigger.source)) + .set("choiceList", ["将手牌摸至" + get.cnNumber(Math.min(num2, 5)) + "张", "弃置至少" + get.cnNumber(num2 + 1) + "张牌并对其造成1点伤害"]); + } else if (bool2) event.goto(3); + "step 1"; + if (event.chosen) { + if (result.control == "cancel2") event.finish(); + else if (result.index == 1) event.goto(3); + else event._result = { bool: true }; + } else player.chooseBool(get.prompt("benyu", trigger.source), "将手牌摸至" + get.cnNumber(Math.min(trigger.source.countCards("h"), 5)) + "张"); + "step 2"; + if (result.bool) { + player.logSkill("benyu", trigger.source); + player.drawTo(Math.min(trigger.source.countCards("h"), 5)); + } + event.finish(); + "step 3"; + var num = trigger.source.countCards("h") + 1; + var args = [[num, player.countCards("he")], "he"]; + if (event.chosen) { + player.logSkill("benyu", trigger.source); + args.push(true); + } else { + args.push(get.prompt("benyu", trigger.source)); + args.push("弃置" + get.cnNumber(num) + "张牌并对其造成1点伤害"); + } + var next = player.chooseToDiscard.apply(player, args); + if (!event.chosen) next.logSkill = ["benyu", trigger.source]; + next.set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + if (ui.selected.cards.length >= _status.event.num) { + return -1; + } + if (get.damageEffect(trigger.source, player, player) > 0 && (get.value(card, player) < 0 || _status.event.num <= 2)) { + return 8 - get.value(card); + } + return -1; + }); + next.set("num", num); + "step 4"; + if (result.bool) trigger.source.damage(); + }, + }, + jili: { + audio: 2, + trigger: { + global: "useCardToTarget", + }, + forced: true, + check: function (event, player) { + return get.effect(player, event.card, event.player, player) > 0; + }, + filter: function (event, player) { + if (get.color(event.card) != "red") return false; + if (!event.targets) return false; + if (event.player == player) return false; + if (event.targets.includes(player)) return false; + if (get.info(event.card).multitarget) return false; + var type = get.type(event.card); + if (type != "basic" && type != "trick") return false; + if (lib.filter.targetEnabled2(event.card, event.player, player)) { + for (var i = 0; i < event.targets.length; i++) { + if (get.distance(event.targets[i], player) <= 1) return true; + } + } + return false; + }, + autodelay: true, + content: function () { + trigger.getParent().targets.add(player); + trigger.player.line(player, "green"); + }, + }, + zhidao: { + audio: 2, + mod: { + aiOrder: function (player, card, num) { + if (num > 0 && !player.hasSkill("zhidao2") && !get.tag(card, "damage") && (!lib.filter.targetEnabled(card, player, player) || get.effect(player, card, player) <= 0)) return num + 10; + }, + }, + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return _status.currentPhase == player && event.player.isIn() && event.player.countCards("hej") > 0 && event.player != player && !player.hasSkill("zhidao2"); + }, + forced: true, + content: function () { + var num = 0; + if (trigger.player.countCards("h")) num++; + if (trigger.player.countCards("e")) num++; + if (trigger.player.countCards("j")) num++; + if (num) { + player.gainPlayerCard(trigger.player, num, "hej", true).set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.position(button.link) == get.position(ui.selected.buttons[i].link)) return false; + } + return true; + }); + } + player.addTempSkill("zhidao2"); + }, + }, + zhidao2: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; + }, + }, + }, + luanzhan: { + mod: { + selectTarget: function (card, player, range) { + if (!player.storage.luanzhan) return; + if (range[1] == -1) return; + if (card.name == "sha") range[1] += player.storage.luanzhan; + if (get.color(card) == "black" && get.type(card) == "trick") { + var info = get.info(card); + if (info.multitarget) return false; + range[1] += player.storage.luanzhan; + } + }, + }, + trigger: { source: "damageSource" }, + audio: 2, + forced: true, + mark: true, + intro: { + content: function (storage) { + return "可以额外指定" + storage + "个目标"; + }, + }, + init: function (player) { + player.storage.luanzhan = 0; + }, + init2: function (player) { + player.markSkill("luanzhan"); + }, + content: function () { + if (typeof player.storage.luanzhan == "number") { + player.storage.luanzhan += trigger.num; + } else { + player.storage.luanzhan = trigger.num; + } + if (player.hasSkill("luanzhan")) { + player.markSkill("luanzhan"); + } + }, + group: "luanzhan_cancel", + subSkill: { + cancel: { + audio: "luanzhan", + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (!player.storage.luanzhan) return false; + var check = false; + var card = event.card; + if (card.name == "sha") { + check = true; + } else if (get.color(card) == "black" && get.type(card) == "trick") { + var info = get.info(card); + if (!info.multitarget) { + check = true; + if (info.selectTarget == -1) { + check = false; + } else if (Array.isArray(info.selectTarget) && info.selectTarget[1] == -1) { + check = false; + } + } + } + if (check && event.targets && event.targets.length < player.storage.luanzhan) { + return true; + } + return false; + }, + content: function () { + player.storage.luanzhan = 0; + player.markSkill("luanzhan"); + }, + }, + }, + }, + xinzhengnan: { + audio: "zhengnan", + trigger: { global: "dying" }, + frequent: true, + filter: function (event, player) { + return !player.storage.xinzhengnan || !player.storage.xinzhengnan.includes(event.player); + }, + content: function () { + "step 0"; + if (!player.storage.xinzhengnan) player.storage.xinzhengnan = []; + player.storage.xinzhengnan.add(trigger.player); + player.storage.xinzhengnan.sortBySeat(); + player.markSkill("xinzhengnan"); + player.recover(); + var list = []; + if (!player.hasSkill("new_rewusheng")) { + list.push("new_rewusheng"); + } + if (!player.hasSkill("xindangxian")) { + list.push("xindangxian"); + } + if (!player.hasSkill("rezhiman")) { + list.push("rezhiman"); + } + if (list.length) { + player.draw(); + event.list = list; + } else { + player.draw(3); + event.finish(); + } + "step 1"; + if (event.list.length == 1) event._result = { control: event.list[0] }; + else + player + .chooseControl(event.list) + .set("prompt", "征南:选择获得下列技能中的一个") + .set("ai", function () { + if (event.list.includes("xindangxian")) return "xindangxian"; + return 0; + }); + "step 2"; + if (result.control == "xindangxian") player.storage.xinfuli = true; + player.addSkills(result.control); + }, + ai: { threaten: 2.5 }, + intro: { + content: "已因$发动过技能", + }, + derivation: ["new_rewusheng", "xindangxian", "rezhiman"], + }, + zhengnan: { + derivation: ["new_rewusheng", "dangxian", "rezhiman"], + audio: 2, + trigger: { global: "dieAfter" }, + frequent: true, + content: function () { + "step 0"; + player.draw(3); + "step 1"; + var list = lib.skill.zhengnan.derivation.filter(skill => !player.hasSkill(skill)); + if (list.length == 1) event._result = { control: list[0] }; + else if (list.length > 0) { + player + .chooseControl(list) + .set("prompt", "选择获得一项技能") + .set("ai", function () { + if (_status.event.controls.includes("dangxian")) return "dangxian"; + return _status.event.controls[0]; + }); + } else event.finish(); + "step 2"; + if (result.control) { + player.addSkills(result.control); + } + }, + ai: { threaten: 2 }, + }, + xiefang: { + mod: { + globalFrom: function (from, to, distance) { + return ( + distance - + game.countPlayer(function (current) { + return current.hasSex("female"); + }) + ); + }, + }, + }, + qizhi: { + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + direct: true, + filter: function (event, player) { + if (!event.targets) return false; + if (!event.isFirstTarget) return false; + if (_status.currentPhase != player) return false; + var type = get.type(event.card, "trick"); + if (type != "basic" && type != "trick") return false; + if (event.noai) return false; + return game.hasPlayer(function (target) { + return !event.targets.includes(target) && target.countCards("he") > 0; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("qizhi"), "弃置一名角色的一张牌,然后其摸一张牌", function (card, player, target) { + return !_status.event.targets.includes(target) && target.countCards("he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (target == player) return 2; + if (get.attitude(player, target) <= 0) { + return 1; + } + return 0.5; + }) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + player.getHistory("custom").push({ qizhi: true }); + player.logSkill("qizhi", result.targets); + player.discardPlayerCard(result.targets[0], true, "he"); + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + event.target.draw(); + }, + }, + jinqu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + check: function (event, player) { + return ( + player.getHistory("custom", function (evt) { + return evt.qizhi == true; + }).length >= player.countCards("h") + ); + }, + prompt: function (event, player) { + var num = player.getHistory("custom", function (evt) { + return evt.qizhi == true; + }).length; + return "进趋:是否摸两张牌并将手牌弃置至" + get.cnNumber(num) + "张?"; + }, + content: function () { + "step 0"; + player.draw(2); + "step 1"; + var dh = + player.countCards("h") - + player.getHistory("custom", function (evt) { + return evt.qizhi == true; + }).length; + if (dh > 0) { + player.chooseToDiscard(dh, true); + } + }, + ai: { combo: "qizhi" }, + }, + jiaozi: { + audio: 2, + trigger: { player: "damageBegin3", source: "damageBegin1" }, + forced: true, + filter: function (event, player) { + return player.isMaxHandcard(true); + }, + content: function () { + trigger.num++; + }, + ai: { presha: true }, + }, + jiqiao: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("jiqiao"), [1, player.countCards("he", { type: "equip" })], "he", function (card) { + return get.type(card) == "equip"; + }) + .set("ai", function (card) { + if (card.name == "bagua") return 10; + return 7 - get.value(card); + }).logSkill = "jiqiao"; + "step 1"; + if (result.bool) { + event.cards = get.cards(2 * result.cards.length); + player.showCards(event.cards); + } else { + event.finish(); + } + "step 2"; + var gained = []; + var tothrow = []; + for (var i = 0; i < event.cards.length; i++) { + if (get.type(event.cards[i]) != "equip") { + gained.push(event.cards[i]); + } else { + tothrow.push(event.cards[i]); + } + } + player.gain(gained, "gain2"); + game.cardsDiscard(tothrow); + }, + ai: { + threaten: 1.5, + }, + }, + linglong: { + audio: 2, + group: "linglong_bagua", + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha" && player.hasEmptySlot(1)) return num + 1; + }, + maxHandcard: function (player, num) { + if (!player.hasEmptySlot(3) || !player.hasEmptySlot(4)) return; + return num + 1; + }, + targetInRange: function (card, player, target, now) { + if (!player.hasEmptySlot(5)) return; + var type = get.type(card); + if (type == "trick" || type == "delay") return true; + }, + canBeDiscarded: function (card, source, player) { + if (!player.hasEmptySlot(5)) return; + if (get.position(card) == "e" && get.subtypes(card).some(slot => slot == "equip2" || slot == "equip5")) return false; + }, + /*cardDiscardable:function (card,player){ + if(player.getEquip(5)) return; + if(get.position(card)=='e') return false; + },*/ + }, + }, + linglong_bagua: { + audio: "linglong", + audioname2: { re_jsp_huangyueying: "relinglong" }, + inherit: "bagua_skill", + filter: function (event, player) { + if (!lib.skill.bagua_skill.filter(event, player)) return false; + if (!player.hasEmptySlot(2)) return false; + return true; + }, + ai: { + respondShan: true, + freeShan: true, + skillTagFilter(player, tag, arg) { + if (tag !== "respondShan" && tag !== "freeShan") return; + if (!player.hasEmptySlot(2) || player.hasSkillTag("unequip2")) return false; + if (!arg || !arg.player) return true; + if ( + arg.player.hasSkillTag("unequip", false, { + target: player, + }) + ) + return false; + return true; + }, + effect: { + target: function (card, player, target) { + if (player == target && get.subtype(card) == "equip2") { + if (get.equipValue(card) <= 7.5) return 0; + } + if (target.getEquip(2)) return; + return lib.skill.bagua_skill.ai.effect.target.apply(this, arguments); + }, + }, + }, + }, + zhenwei: { + audio: 2, + audioname: ["re_wenpin"], + trigger: { + global: "useCardToTarget", + }, + direct: true, + filter: function (event, player) { + if (player == event.target || player == event.player) return false; + if (!player.countCards("he")) return false; + if (event.targets.length > 1) return false; + if (!event.target) return false; + if (event.target.hp >= player.hp) return false; + + var card = event.card; + if (card.name == "sha") return true; + if (get.color(card) == "black" && get.type(card, "trick") == "trick") return true; + return false; + }, + content: function () { + "step 0"; + var save = false; + if (get.attitude(player, trigger.target) > 2) { + if (trigger.card.name == "sha") { + if (player.countCards("h", "shan") || player.getEquip(2) || trigger.target.hp == 1 || player.hp > trigger.target.hp + 1) { + if (!trigger.target.countCards("h", "shan") || trigger.target.countCards("h") < player.countCards("h")) { + save = true; + } + } + } else if (trigger.card.name == "juedou" && trigger.target.hp == 1) { + save = true; + } else if (trigger.card.name == "shunshou" && get.attitude(player, trigger.player) < 0 && get.attitude(trigger.player, trigger.target) < 0) { + save = true; + } + } + var next = player.chooseToDiscard("he", get.prompt(event.name, trigger.target), "弃置一张牌,将" + get.translation(trigger.card) + "转移给自己,或令此牌对其无效"); + next.logSkill = [event.name, trigger.target]; + next.set("ai", function (card) { + if (_status.event.aisave) { + return 7 - get.value(card); + } + return 0; + }); + next.set("aisave", save); + "step 1"; + if (result.bool) { + player + .chooseControl("转移", "失效", function () { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + if (trigger.card.name == "sha") { + if (player.countCards("h", "shan")) return "转移"; + } else if (trigger.card.name == "juedou") { + if (player.countCards("h", "sha")) return "转移"; + } + return "失效"; + }) + .set("prompt", "将" + get.translation(trigger.card) + "转移给你,或令其失效"); + } else { + event.finish(); + } + "step 2"; + if (result.control == "转移") { + player.draw(); + trigger.getParent().targets.remove(trigger.target); + trigger.getParent().triggeredTargets2.remove(trigger.target); + trigger.getParent().targets.push(player); + trigger.untrigger(); + trigger.player.line(player); + game.delayx(); + } else { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) { + trigger.player.addSkill("zhenwei2"); + trigger.player.addToExpansion(cards, "gain2").gaintag.add("zhenwei2"); + } + trigger.targets.length = 0; + trigger.getParent().triggeredTargets2.length = 0; + } + }, + ai: { + threaten: 1.1, + }, + }, + zhenwei2: { + audio: false, + intro: { + content: "expansion", + markcount: "expansion", + }, + trigger: { global: "phaseEnd" }, + forced: true, + charlotte: true, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + content: function () { + "step 0"; + var cards = player.getExpansions("zhenwei2"); + if (cards.length) player.gain(cards, "gain2"); + "step 1"; + player.removeSkill("zhenwei2"); + }, + }, + xunzhi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + locked: false, + init: function (player) { + player.storage.xunzhi = 0; + }, + filter: function (event, player) { + var previous = player.getPrevious(); + var next = player.getNext(); + if (previous && next) { + return player.hp != previous.hp && player.hp != next.hp; + } + return false; + }, + check: function (event, player) { + return player.hp >= 3 && player.countCards("h") > player.hp + 1 + player.storage.xunzhi; + }, + content: function () { + player.loseHp(); + player.storage.xunzhi += 2; + }, + mark: true, + intro: { + content: function (storage, player) { + return "手牌上限+" + player.storage.xunzhi; + }, + }, + mod: { + maxHandcard: function (player, num) { + if (typeof player.storage.xunzhi == "number") { + return num + player.storage.xunzhi; + } + }, + }, + }, + yawang: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + forced: true, + filter: function (event, player) { + return !event.numFixed; + }, + check: function (event, player) { + var num = game.countPlayer(function (target) { + return target.hp == player.hp; + }); + if (!player.hasSkill("xunzhi2")) { + var nh = player.countCards("h"); + if (nh > 5) return false; + if (num == 3 && nh > 3) return false; + } + return num >= 3; + }, + content: function () { + trigger.changeToZero(); + var num = game.countPlayer(function (target) { + return target.hp == player.hp; + }); + if (num) { + player.draw(num); + } + player.storage.yawang = num; + player.addTempSkill("yawang2"); + }, + ai: { + halfneg: true, + }, + }, + yawang2: { + mod: { + cardEnabled: function (card, player) { + if (_status.currentPhase != player) return; + if (player.countUsed() >= player.storage.yawang) return false; + }, + cardSavable: function (card, player) { + if (_status.currentPhase != player) return; + if (player.countUsed() >= player.storage.yawang) return false; + }, + }, + }, + luoyan_tianxiang: { + inherit: "tianxiang", + filter: function (event, player) { + if (!player.storage.xingwu || !player.storage.xingwu.length) return false; + if (player.hasSkill("tianxiang")) return false; + return lib.skill.tianxiang.filter(event, player); + }, + }, + luoyan_liuli: { + inherit: "liuli", + filter: function (event, player) { + if (!player.storage.xingwu || !player.storage.xingwu.length) return false; + if (player.hasSkill("liuli")) return false; + return lib.skill.liuli.filter(event, player); + }, + }, + luoyan: { + group: ["luoyan_tianxiang", "luoyan_liuli"], + ai: { + combo: "xingwu", + }, + }, + xingwu: { + audio: 2, + group: ["xingwu_color", "xingwu_color2"], + subSkill: { + color: { + trigger: { player: "phaseZhunbeiBegin" }, + silent: true, + content: function () { + player.storage.xingwu_color = ["black", "red"]; + }, + }, + color2: { + trigger: { player: "useCard" }, + silent: true, + filter: function (event, player) { + return Array.isArray(player.storage.xingwu_color) && _status.currentPhase == player; + }, + content: function () { + player.storage.xingwu_color.remove(get.color(trigger.card)); + }, + }, + }, + trigger: { player: "phaseDiscardBegin" }, + direct: true, + filter: function (event, player) { + if (!player.storage.xingwu_color) return false; + var length = player.storage.xingwu_color.length; + if (length == 0) return false; + var hs = player.getCards("h"); + if (hs.length == 0) return false; + if (length == 2) return true; + var color = player.storage.xingwu_color[0]; + for (var i = 0; i < hs.length; i++) { + if (get.color(hs[i]) == color) return true; + } + return false; + }, + intro: { + content: "cards", + }, + init: function (player) { + player.storage.xingwu = []; + }, + content: function () { + "step 0"; + player + .chooseCard(get.prompt("xingwu"), function (card) { + return _status.event.player.storage.xingwu_color.includes(get.color(card)); + }) + .set("ai", function (card) { + var player = _status.event.player; + if (player.storage.xingwu.length == 2) { + if ( + !game.hasPlayer(function (current) { + return current != player && current.hasSex("male") && get.damageEffect(current, player, player) > 0 && get.attitude(player, current) < 0; + }) + ) + return 0; + } + return 7 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("xingwu"); + if (player.storage.xingwu.length < 2) { + player.$give(result.cards, player); + } + player.lose(result.cards, ui.special); + player.storage.xingwu = player.storage.xingwu.concat(result.cards); + player.markSkill("xingwu"); + player.syncStorage("xingwu"); + } else { + event.finish(); + } + "step 2"; + if (player.storage.xingwu.length == 3) { + player.$throw(player.storage.xingwu); + while (player.storage.xingwu.length) { + player.storage.xingwu.shift().discard(); + } + player.unmarkSkill("xingwu"); + player + .chooseTarget(function (card, player, target) { + return target != player && target.hasSex("male"); + }, "对一名男性角色造成2点伤害并弃置其装备区内的牌") + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) return -1; + return get.damageEffect(target, player, player) + target.countCards("e") / 2; + }); + } else { + event.finish(); + } + "step 3"; + if (result.bool) { + var target = result.targets[0]; + target.damage(2); + event.target = target; + player.line(target, "green"); + } else { + event.finish(); + } + "step 4"; + if (event.target && event.target.isIn()) { + var es = event.target.getCards("e"); + if (es.length) { + event.target.discard(es); + } + } + }, + ai: { + threaten: 1.5, + }, + }, + yinbing: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + preHidden: true, + filter: function (event, player) { + return player.countCards("he", { type: "basic" }) < player.countCards("he"); + }, + marktext: "兵", + content: function () { + "step 0"; + player + .chooseCard([1, player.countCards("he") - player.countCards("he", { type: "basic" })], "he", get.prompt("yinbing"), function (card) { + return get.type(card) != "basic"; + }) + .set("ai", function (card) { + return 6 - get.value(card); + }) + .setHiddenSkill("yinbing"); + "step 1"; + if (result.bool) { + player.logSkill("yinbing"); + player.addToExpansion(result.cards, player, "give").gaintag.add("yinbing"); + } + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" || card.name == "juedou") { + if (current < 0) return 1.2; + } + }, + }, + threaten: function (player, target) { + if (target.getExpansions("yinbing").length) return 2; + return 1; + }, + combo: "juedi", + }, + subSkill: { + discard: { + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return event.card && player.getExpansions("yinbing").length > 0 && (event.card.name == "sha" || event.card.name == "juedou"); + }, + content: function () { + "step 0"; + player.chooseCardButton("移去一张引兵牌", true, player.getExpansions("yinbing")); + "step 1"; + if (result.bool) player.loseToDiscardpile(result.links); + }, + }, + }, + group: "yinbing_discard", + }, + juedi: { + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getExpansions("yinbing").length > 0; + }, + forced: true, + audio: 2, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("juedi"), true, function (card, player, target) { + return player.hp >= target.hp; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att < 2) return att - 10; + var num = att / 10; + if (target == player) { + num += player.maxHp - player.countCards("h") + 0.5; + } else { + num += _status.event.n2 * 2; + if (target.isDamaged()) { + if (target.hp == 1) { + num += 3; + } else if (target.hp == 2) { + num += 2; + } else { + num += 0.5; + } + } + } + if (target.hasJudge("lebu")) { + num /= 2; + } + return num; + }) + .set("n2", player.getExpansions("yinbing").length); + "step 1"; + if (result.bool) { + player.line(result.targets[0], "green"); + var cards = player.getExpansions("yinbing"); + if (result.targets[0] == player) { + player.loseToDiscardpile(cards); + var num = player.maxHp - player.countCards("h"); + if (num > 0) player.draw(num); + } else { + var target = result.targets[0]; + target.recover(); + player.give(cards, target, "give"); + target.draw(cards.length); + } + } + }, + ai: { + combo: "yinbing", + }, + }, + meibu: { + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player != player && get.distance(event.player, player, "attack") > 1; + }, + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + var e2 = player.getEquip(2); + if (e2) { + if (e2.name == "tengjia" || e2.name == "rewrite_tengjia") return true; + if (e2.name == "bagua" || e2.name == "rewrite_bagua") return true; + } + return player.countCards("h", "shan") > 0; + }, + content: function () { + var target = trigger.player; + target.addTempSkill("meibu_viewas"); + target.addTempSkill("meibu_range"); + target.storage.meibu = player; + target.markSkillCharacter("meibu", player, "魅步", "锦囊牌均视为杀且" + get.translation(player) + "视为在攻击范围内"); + }, + ai: { + expose: 0.2, + }, + subSkill: { + range: { + mod: { + targetInRange: function (card, player, target) { + if (card.name == "sha" && target == player.storage.meibu) { + return true; + } + }, + }, + onremove: function (player) { + game.broadcast(function (player) { + if (player.marks.meibu) { + player.marks.meibu.delete(); + delete player.marks.meibu; + } + }, player); + if (player.marks.meibu) { + player.marks.meibu.delete(); + delete player.marks.meibu; + game.addVideo("unmark", player, "meibu"); + } + }, + trigger: { player: "useCard" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.skill == "meibu_viewas"; + }, + content: function () { + player.removeSkill("meibu_viewas"); + game.broadcastAll(function (player) { + if (player.marks.meibu && player.marks.meibu.info) { + player.marks.meibu.info.content = player.marks.meibu.info.content.slice(8); + } + }, player); + }, + }, + viewas: { + mod: { + cardEnabled: function (card, player) { + if (card.name != "sha" && get.type(card, "trick") == "trick") return false; + }, + cardUsable: function (card, player) { + if (card.name != "sha" && get.type(card, "trick") == "trick") return false; + }, + cardRespondable: function (card, player) { + if (card.name != "sha" && get.type(card, "trick") == "trick") return false; + }, + cardSavable: function (card, player) { + if (card.name != "sha" && get.type(card, "trick") == "trick") return false; + }, + }, + enable: ["chooseToUse", "chooseToRespond"], + filterCard: function (card) { + return get.type(card, "trick") == "trick"; + }, + viewAs: { name: "sha" }, + check: function () { + return 1; + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondSha") && current < 0) return 0.8; + }, + }, + respondSha: true, + order: 4, + useful: -1, + value: -1, + }, + }, + }, + }, + mumu: { + enable: "phaseUse", + usable: 1, + filterCard: function (card, player, target) { + return card.name == "sha" || (get.type(card, "trick") == "trick" && get.color(card) == "black"); + }, + check: function (card) { + return 7 - get.value(card); + }, + filterTarget: function (card, player, target) { + if (target == player) return false; + return target.getEquips(1).length > 0 || target.getEquips(2).length > 0; + }, + content: function () { + "step 0"; + var e1 = target.getEquips(1); + var e2 = target.getEquips(2); + event.e1 = e1; + event.e2 = e2; + if (e1.length && e2.length) { + player.chooseControl("武器牌", "防具牌").set("ai", function () { + if (_status.event.player.getEquip(2)) { + return "武器牌"; + } + return "防具牌"; + }); + } else if (e1.length) { + event.choice = "武器牌"; + } else { + event.choice = "防具牌"; + } + "step 1"; + var choice = event.choice || result.control; + if (choice == "武器牌") { + if (event.e1) { + target.discard(event.e1); + } + player.draw(); + } else { + if (event.e2) { + player.equip(event.e2); + target.$give(event.e2, player); + } + } + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if (target.getEquip(2) && !player.getEquip(2)) { + return -2; + } + return -1; + }, + }, + }, + }, + fentian: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + if (player.countCards("h") >= player.hp) return false; + return game.hasPlayer(function (current) { + return player != current && player.inRange(current) && current.countCards("he"); + }); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + content: function () { + "step 0"; + player + .chooseTarget("焚天:选择一名攻击范围内的角色,将其一张牌置于你的武将牌上", true, function (card, player, target) { + return player != target && player.inRange(target) && target.countCards("he") > 0; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + player.logSkill("fentian", result.targets); + event.target = result.targets[0]; + player.choosePlayerCard(result.targets[0], "he", true); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.addToExpansion(result.links, target, "give").gaintag.add("fentian"); + } + }, + mod: { + attackRange: function (from, distance) { + return distance + from.getExpansions("fentian").length; + }, + }, + }, + zhiri: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + audio: 2, + skillAnimation: true, + animationColor: "fire", + derivation: "xintan", + filter: function (event, player) { + return player.getExpansions("fentian").length >= 3; + }, + content: function () { + player.awakenSkill("zhiri"); + player.loseMaxHp(); + player.storage.zhiri = true; + }, + ai: { + combo: "fentian", + }, + }, + xintan: { + enable: "phaseUse", + usable: 1, + audio: 2, + unique: true, + filter: function (event, player) { + return player.getExpansions("fentian").length >= 2; + }, + filterTarget: true, + prompt: "移去两张“焚”并令一名角色失去1点体力", + content: function () { + "step 0"; + player.chooseCardButton(2, "移去两张“焚”并令" + get.translation(target) + "失去1点体力", player.getExpansions("fentian"), true); + "step 1"; + if (result.bool) { + player.loseToDiscardpile(result.links); + target.loseHp(); + } + }, + ai: { + order: 8, + result: { + target: -1, + }, + combo: "fentian", + }, + }, + danji: { + skillAnimation: true, + animationColor: "water", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + derivation: ["mashu", "nuzhan"], + filter: function (event, player) { + var zhu = get.zhu(player); + if (zhu && zhu.isZhu) { + var name = zhu.name; + while (name.indexOf("_") != -1) { + name = name.slice(name.indexOf("_") + 1); + } + if (name.indexOf("liubei") == 0) return false; + } + return !player.storage.danji && player.countCards("h") > player.hp; + }, + content: function () { + player.awakenSkill("danji"); + player.loseMaxHp(); + player.addSkills(["mashu", "nuzhan"]); + }, + ai: { + maixie: true, + skillTagFilter: (player, tag, arg) => { + if (tag === "maixie") { + if (player.hp < 2 || player.storage.danji || player.hasSkill("nuzhan") || player.countCards("h") !== player.hp) return false; + let zhu = get.zhu(player); + if (zhu && zhu.isZhu) { + let name = zhu.name; + while (name.indexOf("_") !== -1) { + name = name.slice(name.indexOf("_") + 1); + } + if (name.indexOf("liubei") == 0) return false; + } + return true; + } + }, + effect: { + target: (card, player, target) => { + let hs = target.countCards("h"); + if (target.hp < 3 || target.storage.danji || target.hasSkill("nuzhan") || hs > target.hp + 1) return; + let zhu = get.zhu(target); + if (zhu && zhu.isZhu) { + let name = zhu.name; + while (name.indexOf("_") !== -1) { + name = name.slice(name.indexOf("_") + 1); + } + if (name.indexOf("liubei") == 0) return; + } + if (get.tag(card, "draw")) return 1.6; + if (get.tag(card, "lose") || get.tag(card, "discard")) return [1, -0.8]; + if (hs === target.hp && get.tag(card, "damage")) return [1, target.hp / 3]; + if (hs > target.hp && target.hp > 3 && (card.name === "shan" || card.name === "wuxie")) return "zeroplayertarget"; + }, + }, + }, + }, + nuzhan: { + audio: 2, + popup: false, + silent: true, + firstDo: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.addCount !== false && event.cards && event.cards.length == 1 && get.type(event.cards[0], "trick") == "trick"; + }, + forced: true, + content: function () { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + }, + group: "nuzhan2", + }, + nuzhan2: { + audio: "nuzhan", + trigger: { player: "useCard1" }, + forced: true, + popup: false, + silent: true, + firstDo: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.cards && event.cards.length == 1 && get.type(event.cards[0]) == "equip"; + }, + content: function () { + trigger.baseDamage++; + }, + }, + jieyuan: { + group: ["jieyuan_more", "jieyuan_less"], + subSkill: { + more: { + audio: true, + trigger: { source: "damageBegin1" }, + direct: true, + filter: function (event, player) { + if ( + !player.countCards(player.hasSkill("fenxin_nei") ? "he" : "h", function (card) { + if (player.hasSkill("fenxin_nei") || (_status.connectMode && get.position(card) == "h")) return true; + return get.color(card) == "black"; + }) + ) + return false; + return (event.player.hp >= player.hp || player.hasSkill("fenxin_fan")) && player != event.player; + }, + content: function () { + "step 0"; + var goon = get.attitude(player, trigger.player) < 0; + var next = player.chooseToDiscard(get.prompt("jieyuan", trigger.player), player.hasSkill("fenxin_nei") ? "he" : "h"); + if (!player.hasSkill("fenxin_nei")) { + next.set("filterCard", function (card) { + return get.color(card) == "black"; + }); + next.set("prompt2", "弃置一张黑色手牌令伤害+1"); + } else { + next.set("prompt2", "弃置一张手牌令伤害+1"); + } + next.set("ai", function (card) { + if (_status.event.goon) { + return 8 - get.value(card); + } + return 0; + }); + next.set("goon", goon); + next.logSkill = ["jieyuan_more", trigger.player]; + "step 1"; + if (result.bool) { + trigger.num++; + } + }, + }, + less: { + audio: true, + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + if ( + !player.countCards(player.hasSkill("fenxin_nei") ? "he" : "h", function (card) { + if (player.hasSkill("fenxin_nei") || (_status.connectMode && get.position(card) == "h")) return true; + return get.color(card) == "red"; + }) + ) + return false; + return event.source && (event.source.hp >= player.hp || player.hasSkill("fenxin_zhong")) && player != event.source; + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt("jieyuan"), player.hasSkill("fenxin_nei") ? "he" : "h"); + if (!player.hasSkill("fenxin_nei")) { + next.set("filterCard", function (card) { + return get.color(card) == "red"; + }); + next.set("prompt2", "弃置一张红色手牌令伤害-1"); + } else { + next.set("prompt2", "弃置一张手牌令伤害-1"); + } + next.set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1 || _status.event.getTrigger().num > 1) { + return 9 - get.value(card); + } + if (player.hp == 2) { + return 8 - get.value(card); + } + return 7 - get.value(card); + }); + next.logSkill = "jieyuan_less"; + "step 1"; + if (result.bool) { + trigger.num--; + } + }, + }, + }, + ai: { + expose: 0.2, + threaten: 1.5, + }, + }, + fenxin: { + mode: ["identity", "versus"], + available: function (mode) { + if (mode == "identity" && _status.mode == "purple") return false; + if (mode == "versus" && _status.mode != "two") return false; + }, + trigger: { global: ["dieAfter", "damageEnd"] }, + filter: function (event, player) { + var list = ["fan", "zhong", "nei"]; + if (get.mode() == "identity") return event.name == "die" && list.includes(event.player.identity) && !player.hasSkill("fenxin_" + event.player.identity); + return event.name == "damage" && event.player != player && list.some(identity => !player.hasSkill("fenxin_" + identity)) && event.player.getHistory("damage").indexOf(event) == 0; + }, + forced: true, + logTarget: "player", + content: function () { + "step 0"; + if (get.mode() == "identity") { + event._result = { + bool: true, + links: ["fenxin_" + trigger.player.identity], + }; + } else { + player + .chooseButton( + [ + "焚心:请选择〖竭缘〗的升级方式", + [ + [ + ["fenxin_fan", "发动〖竭缘〗增加伤害无体力值限制"], + ["fenxin_zhong", "发动〖竭缘〗减少伤害无体力值限制"], + ["fenxin_nei", "将〖竭缘〗中的黑色手牌和红色手牌改为一张牌"], + ].filter(list => !player.hasSkill(list[0])), + "textbutton", + ], + ], + true + ) + .set("ai", function (button) { + return ["fenxin_fan", "fenxin_zhong", "fenxin_nei"].indexOf(button.link) + 1; + }); + } + "step 1"; + if (result.bool) { + var identity = result.links[0]; + player.addSkill(identity); + player.markSkill("fenxin"); + } + }, + intro: { + mark: function (dialog, content, player) { + if (player.hasSkill("fenxin_zhong")) { + dialog.addText("你发动“竭缘”减少伤害无体力值限制"); + } + if (player.hasSkill("fenxin_fan")) { + dialog.addText("你发动“竭缘”增加伤害无体力值限制"); + } + if (player.hasSkill("fenxin_nei")) { + dialog.addText("将“竭缘”中的黑色手牌和红色手牌改为一张牌"); + } + }, + }, + subSkill: { + fan: { charlotte: true }, + zhong: { charlotte: true }, + nei: { charlotte: true }, + }, + ai: { combo: "jieyuan" }, + }, + xisheng: { + enable: "chooseToUse", + usable: 1, + viewAs: { name: "tao" }, + viewAsFilter: function (player) { + return player != _status.currentPhase && player.countCards("hes") > 1; + }, + selectCard: 2, + filterCard: true, + position: "hes", + }, + shulv: { + inherit: "zhiheng", + prompt: "弃置一张牌并摸一张牌", + selectCard: 1, + filter: function (event, player) { + return player.countCards("hs") > player.hp; + }, + }, + xiandeng: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + targetInRange: function (card, player) { + if (card.name == "sha" && player.countUsed("sha", true) == 0) return true; + }, + }, + }, + qingyi: { + audio: 2, + trigger: { player: "phaseJudgeBefore" }, + direct: true, + content: function () { + "step 0"; + var check = player.countCards("h") > 2; + player + .chooseTarget(get.prompt("qingyi"), "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }); + "step 1"; + if (result.bool) { + player.logSkill("qingyi", result.targets); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); + trigger.cancel(); + player.skip("phaseDraw"); + } + }, + }, + qingyi1: { + audio: true, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.addSkill("qingyi3"); + var check = player.countCards("h") > 2; + player.chooseTarget(get.prompt2("qingyi"), function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target); + }).ai = function (target) { + if (!check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }; + "step 1"; + if (result.bool) { + player.logSkill("qingyi1", result.targets); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); + player.skip("phaseJudge"); + player.skip("phaseDraw"); + } + player.removeSkill("qingyi3"); + }, + }, + qingyi2: { + audio: true, + trigger: { player: "phaseUseBefore" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + content: function () { + "step 0"; + player.addSkill("qingyi3"); + var check = player.countCards("h") <= player.hp; + player.chooseCardTarget({ + prompt: get.prompt2("qingyi"), + filterCard: function (card, player) { + return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); + }, + position: "he", + filterTarget: function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target); + }, + ai1: function (card) { + if (!_status.event.check) return 0; + return 6 - get.value(card); + }, + ai2: function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }, + check: check, + }); + "step 1"; + if (result.bool) { + player.logSkill("qingyi2", result.targets); + player.discard(result.cards[0]); + player.useCard({ name: "sha", isCard: true }, result.targets[0]); + trigger.cancel(); + } + player.removeSkill("qingyi3"); + }, + }, + qingyi3: { + mod: { + targetInRange: function (card, player, target, now) { + return true; + }, + }, + }, + qirang: { + audio: 2, + trigger: { player: "equipEnd" }, + frequent: true, + content: function () { + var card = get.cardPile(function (card) { + return get.type(card, "trick") == "trick"; + }); + if (card) { + var next = player.gain(card, "gain2"); + if (get.type(card) == "trick") next.gaintag.add("qirang"); + else { + player.addMark("qirang_mark", 1, false); + player.addTempSkill("qirang_mark", { player: "phaseBegin" }); + } + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, + threaten: 1.3, + }, + group: "qirang_use", + subSkill: { + mark: { + charlotte: true, + onremove: function (player) { + var evt = _status.event; + if (evt.name != "phase") evt = evt.getParent("phase"); + if (evt && evt.player == player) { + if (!evt.qirang_num) evt.qirang_num = 0; + evt.qirang_num += player.storage.qirang_mark; + } + delete player.storage.qirang_mark; + }, + intro: { + content: "下回合发动〖羽化〗时卜算量+#", + }, + }, + use: { + audio: "qirang", + trigger: { player: "useCard2" }, + direct: true, + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + if (!event.targets || event.targets.length != 1) return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if ( + !player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("qirang")) return true; + } + return false; + }) + ) + return false; + if (!info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("qirang"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("qirang_use", event.targets); + trigger.targets.addArray(event.targets); + } + }, + }, + }, + }, + yuhua: { + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + audio: 2, + content: function () { + "step 0"; + var num = 1, + evt = trigger.getParent(); + if (evt.qirang_num) num += evt.qirang_num; + var cards = get.cards(Math.min(5, 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 target = _status.event.getTrigger().name == "phaseZhunbei" ? player : player.next; + var att = get.sgn(get.attitude(player, target)); + var top = []; + var judges = target.getCards("j"); + var stopped = false; + if (player != target || !target.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)) * att; + }); + if (judge(cards[0]) * att < 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)) * att; + }); + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) 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]); + } + if (event.triggername == "phaseZhunbeiBegin" && top.length == 0) { + player.addTempSkill("reguanxing_on"); + } + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); + game.updateRoundNumber(); + game.delayx(); + }, + mod: { + ignoredHandcard: function (card, player) { + if (get.type(card) != "basic") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.type(card) != "basic") return false; + }, + }, + }, + chenqing: { + audio: 2, + trigger: { global: "dying" }, + //priority:6, + filter: function (event, player) { + return event.player.hp <= 0 && !player.hasSkill("chenqing2"); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("chenqing"), function (card, player, target) { + return target != player && target != _status.event.getTrigger().player; + }) + .set("ai", function (target) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + if (get.attitude(player, trigger.player) > 0) { + var att1 = get.attitude(target, player); + var att2 = get.attitude(target, trigger.player); + var att3 = get.attitude(player, target); + if (att3 < 0) return 0; + return att1 / 2 + att2 + att3; + } else { + return 0; + // return get.attitude(player,target); + } + }); + "step 1"; + if (result.bool) { + player.addTempSkill("chenqing2", "roundStart"); + event.target = result.targets[0]; + event.target.draw(4); + player.logSkill("chenqing", event.target); + } else { + event.finish(); + } + "step 2"; + var target = event.target; + var tosave = trigger.player; + var att = get.attitude(target, tosave); + var hastao = target.countCards("h", "tao"); + target + .chooseToDiscard(4, true, "he") + .set("ai", function (card) { + var hastao = _status.event.hastao; + var att = _status.event.att; + if (!hastao && att > 0) { + var suit = get.suit(card); + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.suit(ui.selected.cards[i]) == suit) { + return -4 - get.value(card); + } + } + } + if (att < 0 && ui.selected.cards.length == 3) { + var suit = get.suit(card); + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.suit(ui.selected.cards[i]) == suit) { + return -get.value(card); + } + } + return -10 - get.value(card); + } + return -get.value(card); + }) + .set("hastao", hastao) + .set("att", att); + "step 3"; + if (result.cards && result.cards.length == 4) { + var suits = []; + for (var i = 0; i < result.cards.length; i++) { + suits.add(get.suit(result.cards[i])); + } + if (suits.length == 4 && game.checkMod({ name: "tao", isCard: true }, player, trigger.player, "unchanged", "cardSavable", player)) { + event.target.useCard({ name: "tao", isCard: true }, trigger.player); + } + } + }, + ai: { + expose: 0.2, + threaten: 1.5, + }, + }, + mozhi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.getHistory("useCard", function (evt) { + return evt.isPhaseUsing() && ["basic", "trick"].includes(get.type(evt.card)); + }).length > 0 && player.countCards("hs") > 0 + ); + }, + content: function () { + "step 0"; + event.count = 2; + event.history = player.getHistory("useCard", function (evt) { + return evt.isPhaseUsing() && ["basic", "trick"].includes(get.type(evt.card)); + }); + "step 1"; + event._result = {}; + if (event.count && event.history.length && player.countCards("hs")) { + event.count--; + var card = event.history.shift().card; + card = { name: card.name, nature: card.nature }; + if (player.hasUseTarget(card, true, true)) { + if ( + game.hasPlayer(function (current) { + return player.canUse(card, current); + }) + ) { + lib.skill.mozhix.viewAs = card; + var next = player.chooseToUse(); + if (next.isOnline()) { + player.send(function (card) { + lib.skill.mozhix.viewAs = card; + }, card); + } + next.logSkill = "mozhi"; + next.set("openskilldialog", "默识:将一张手牌当" + get.translation(card) + "使用"); + next.set("norestore", true); + next.set("_backupevent", "mozhix"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("mozhix"); + } + } + } + "step 2"; + if (result && result.bool) event.goto(1); + }, + }, + mozhix: { + filterCard: function (card) { + return get.itemtype(card) == "card"; + }, + selectCard: 1, + position: "hs", + popname: true, + }, + chenqing2: { charlotte: true }, + ranshang: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.hasNature("fire"); + }, + forced: true, + check: function () { + return false; + }, + content: function () { + player.addMark("ranshang", trigger.num); + }, + intro: { + name2: "燃", + content: "mark", + }, + ai: { + neg: true, + effect: { + target: function (card, player, target, current) { + if (card.name == "sha") { + if (game.hasNature(card, "fire") || player.hasSkill("zhuque_skill")) return 2; + } + if (get.tag(card, "fireDamage") && current < 0) return 2; + }, + }, + }, + group: "ranshang2", + }, + ranshang2: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("ranshang") > 0; + }, + content: function () { + player.loseHp(player.countMark("ranshang")); + if (player.countMark("ranshang") > 2) { + player.loseMaxHp(2); + player.draw(2); + } + }, + }, + hanyong: { + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card && (event.card.name == "nanman" || event.card.name == "wanjian" || (event.card.name == "sha" && !game.hasNature(event.card) && get.suit(event.card) == "spade")) && player.isDamaged(); + }, + content: function () { + trigger.baseDamage++; + if (game.roundNumber <= player.hp) player.addMark("ranshang", 1); + }, + }, + hanyong3: { + audio: false, + trigger: { source: "damageBegin1" }, + forced: true, + onremove: true, + filter: function (event, player) { + return event.card == player.storage.hanyong3; + }, + content: function () { + trigger.num++; + }, + }, + yishe: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return !player.getExpansions("yishe").length; + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + content: function () { + "step 0"; + player.draw(2); + "step 1"; + var cards = player.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length <= 2) event._result = { bool: true, cards: cards }; + else player.chooseCard(2, "he", true, "选择两张牌作为“米”"); + "step 2"; + if (result.bool) player.addToExpansion(result.cards, player, "give").gaintag.add("yishe"); + }, + group: "yishe_recover", + ai: { combo: "bushi" }, + subSkill: { + recover: { + audio: "yishe", + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + if (player.isHealthy()) return false; + var evt = event.getl(player); + if (!evt || !evt.xs || !evt.xs.length || player.getExpansions("yishe").length > 0) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("yishe")) return true; + } + return false; + } + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("yishe")) return true; + } + return false; + }); + }, + forced: true, + content: function () { + player.recover(); + }, + }, + }, + }, + bushi: { + audio: 2, + trigger: { player: "damageEnd", source: "damageEnd" }, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.player.isIn() && player.getExpansions("yishe").length > 0; + }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + trigger.player.chooseCardButton("选择获得一张“米”", player.getExpansions("yishe")); + "step 2"; + if (result.bool) { + event.count--; + player.logSkill("bushi", trigger.player); + trigger.player.gain(result.links[0], "give", player, "bySelf"); + } else event.finish(); + "step 3"; + if (event.count > 0 && player.getExpansions("yishe").length && player.hasSkill("bushi")) { + event.goto(1); + } + }, + ai: { combo: "yishe" }, + }, + midao: { + audio: 2, + trigger: { global: "judge" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("yishe").length && event.player.isIn(); + }, + content: function () { + "step 0"; + var list = player.getExpansions("yishe"); + player + .chooseButton([get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("midao"), list, "hidden"], function (button) { + var card = button.link; + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + return result * attitude; + }) + .set("judging", trigger.player.judging[0]) + .set("filterButton", function (button) { + var player = _status.event.player; + var card = button.link; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }); + "step 1"; + if (result.bool) { + event.forceDie = true; + player.respond(result.links, "midao", "highlight", "noOrdering"); + result.cards = result.links; + var card = result.cards[0]; + event.card = card; + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", card); + game.delay(2); + } + }, + ai: { + combo: "yishe", + rejudge: true, + tag: { + rejudge: 0.6, + }, + }, + }, + fengpo: { + shaRelated: true, + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + filter: function (event, player) { + if (event.targets.length != 1 || !["sha", "juedou"].includes(event.card.name)) return false; + var evtx = event.getParent(); + return !player.hasHistory( + "useCard", + function (evt) { + return evt != evtx && evt.card.name == event.card.name; + }, + evtx + ); + }, + direct: true, + content: function () { + "step 0"; + var str1 = get.translation(trigger.card), + str2 = get.translation(trigger.target); + player + .chooseControl("摸X加1伤", "摸1加X伤", "cancel2") + .set("prompt", get.prompt("fengpo", trigger.target)) + .set("prompt2", "你可以选择一项:1.摸X张牌,令" + str1 + "的伤害+1;2.摸一张牌,令" + str1 + "的伤害+X(X为" + str2 + "的♦牌的数量)。"); + "step 1"; + if (result.control && result.control != "cancel2") { + player.logSkill("fengpo", trigger.target); + var nd = trigger.target.countCards("he", { suit: "diamond" }); + var draw = 1, + damage = 1; + if (result.control == "摸X加1伤") draw = nd; + else damage = nd; + player.draw(draw); + var trigger2 = trigger.getParent(); + if (typeof trigger2.baseDamage != "number") { + trigger2.baseDamage = 1; + } + trigger2.baseDamage += damage; + } + }, + }, + fengpo2: { + trigger: { source: "damageBegin1" }, + filter: function (event) { + return event.card && (event.card.name == "sha" || event.card.name == "juedou") && event.notLink(); + }, + forced: true, + audio: false, + content: function () { + if (typeof player.storage.fengpo == "number") { + trigger.num += player.storage.fengpo; + } + }, + }, + fengpo3: { charlotte: true }, + //士燮 + biluan: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + check: function (event, player) { + if (player.countCards("h") > player.hp) return true; + if (player.hasJudge("lebu")) return true; + var ng = []; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].group != "unknown") { + ng.add(players[i].group); + } + } + ng = ng.length; + if (ng < 2) return false; + var nai = 0; + for (var i = 0; i < players.length; i++) { + if (players[i] != player) { + var dist = get.distance(players[i], player, "attack"); + if (dist <= 1 && dist + ng > 1) { + nai++; + } + } + } + return nai >= 2; + }, + filter: function (event, player) { + return ( + !event.numFixed && + game.hasPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); + }, + content: function () { + if (!player.hasSkill("rebiluan2")) player.addSkill("rebiluan2"); + var ng = []; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].group != "unknown") { + ng.add(players[i].group); + } + } + player.$damagepop(ng.length, "unknownx"); + player.storage.rebiluan2 += ng.length; + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["biluan", player.storage.rebiluan2]); + trigger.changeToZero(); + }, + }, + lixia: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player.isIn() && event.player != player && get.distance(event.player, player, "attack") > 1; + }, + forced: true, + content: function () { + "step 0"; + player + .chooseTarget( + function (card, player, target) { + return target == player || target == _status.event.source; + }, + true, + "礼下:选择一个目标摸一张牌" + ) + .set("ai", function (target) { + if (get.attitude(player, trigger.player) > 2) return 114514 - target.countCards(); + return player == target ? 1 : 0; + }) + .set("source", trigger.player); + "step 1"; + if (result.targets.length) { + result.targets[0].draw(); + player.line(result.targets[0], "green"); + } + if (!player.hasSkill("rebiluan2")) player.addSkill("rebiluan2"); + player.storage.rebiluan2--; + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["biluan", player.storage.rebiluan2]); + }, + }, + olbiluan: { + audio: "biluan", + trigger: { player: "phaseJieshuBegin" }, + checkx: function (player) { + var ng = Math.min(4, game.countPlayer()); + var nai = 0; + for (var i = 0; i < game.players.length; i++) { + if (game.players[i] != player) { + var dist = get.distance(game.players[i], player, "attack"); + if (dist <= 1 && dist + ng > 1) nai++; + } + } + return nai >= 2; + }, + filter: function (event, player) { + return ( + player.countCards("he") && + game.hasPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard("he", get.prompt2("olbiluan")) + .set("logSkill", "olbiluan") + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }) + .set("check", lib.skill.olbiluan.checkx(player)); + "step 1"; + if (result.bool) { + player.addSkill("rebiluan2"); + var num = game.countGroup(); + player.$damagepop(num, "unknownx"); + player.storage.rebiluan2 += num; + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan2]); + } + }, + }, + ollixia: { + audio: "lixia", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player.isIn() && event.player != player && get.distance(event.player, player, "attack") > 1; + }, + forced: true, + content: function () { + "step 0"; + player + .chooseTarget( + function (card, player, target) { + return target == player || target == _status.event.source; + }, + true, + "礼下:请选择一个目标令其摸牌并减少你与其他角色的距离" + ) + .set("ai", function (target) { + return player == target ? 1 : 0; + }) + .set("source", trigger.player); + "step 1"; + if (result.targets.length) { + var num = result.targets[0] == player ? 1 : 2; + result.targets[0].draw(num); + player.line(result.targets[0], "green"); + } + if (!player.hasSkill("rebiluan2")) player.addSkill("rebiluan2"); + player.storage.rebiluan2--; + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan]); + }, + }, + rebiluan2: { + mark: true, + charlotte: true, + intro: { + content: function (storage) { + if (storage > 0) { + return "其他角色计算与你的距离时+" + storage; + } else if (storage < 0) { + return "其他角色计算与你的距离时" + storage; + } else { + return "无距离变化"; + } + }, + }, + init: function (player) { + if (typeof player.storage.rebiluan2 != "number") player.storage.rebiluan2 = 0; + }, + mod: { + globalTo: function (from, to, distance) { + if (typeof to.storage.rebiluan2 == "number") { + return distance + to.storage.rebiluan2; + } + }, + }, + }, + rebiluan: { + audio: "biluan", + trigger: { player: "phaseJieshuBegin" }, + checkx: function (player) { + var ng = Math.min(4, game.countPlayer()); + var nai = 0; + for (var i = 0; i < game.players.length; i++) { + if (game.players[i] != player) { + var dist = get.distance(game.players[i], player, "attack"); + if (dist <= 1 && dist + ng > 1) { + nai++; + } + } + } + return nai >= 2; + }, + filter: function (event, player) { + return ( + player.countCards("he") && + game.hasPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard("he", get.prompt2("rebiluan")) + .set("logSkill", "rebiluan") + .set("check", lib.skill.rebiluan.checkx(player)) + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }); + "step 1"; + if (result.bool) { + player.addSkill("rebiluan2"); + var ng = Math.min(4, game.countPlayer()); + player.$damagepop(ng, "unknownx"); + player.storage.rebiluan2 += ng; + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan2]); + } + }, + }, + relixia: { + audio: "lixia", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player.isIn() && event.player != player && !player.inRangeOf(event.player); + }, + forced: true, + content: function () { + "step 0"; + if (trigger.player.isDead()) { + event._result = { bool: true, links: [0] }; + return; + } + var list = ["令自己摸一张牌", "令XXX摸两张牌", "令XXX回复1点体力"]; + var card = get.translation(trigger.player); + var next = player.chooseButton( + [ + "【礼下】:请选择一至两项", + [ + list.map((item, index) => { + return [index, item.replace(/XXX/g, card)]; + }), + "textbutton", + ], + ], + true, + [1, 2] + ); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + if (button.link == 2) { + return _status.event.bool1; + } + return true; + }); + next.set("bool1", trigger.player.isDamaged()); + next.set("ai", function (button) { + var player = _status.event.player; + var event = _status.event.getTrigger(); + if (button.link && get.attitude(player, event.player) <= 0) return 0; + return button.link * Math.random(); + }); + "step 1"; + var map = [ + function (trigger, player, event) { + player.draw(); + }, + function (trigger, player, event) { + if (!result.links.includes(2)) player.line(trigger.player); + trigger.player.draw(2); + }, + function (trigger, player, event) { + player.line(trigger.player); + trigger.player.recover(); + }, + ]; + result.links.sort(); + for (var i = 0; i < result.links.length; i++) { + game.log(player, "选择了", "#g【礼下】", "的", "#y选项" + get.cnNumber(result.links[i] + 1, true)); + map[result.links[i]](trigger, player, event); + } + player.addSkill("rebiluan2"); + player.storage.rebiluan2 -= result.links.length; + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan2]); + }, + }, + guiming: { + unique: true, + zhuSkill: true, + locked: true, + ai: { + combo: "recanshi", + }, + }, + canshi: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + check: function (event, player) { + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu") return true; + return current.isDamaged(); + }); + return num > 3; + }, + prompt: function (event, player) { + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; + return current.isDamaged(); + }); + return "残蚀:是否改为摸" + get.cnNumber(num) + "张牌?"; + }, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.changeToZero(); + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; + return current.isDamaged(); + }); + if (num > 0) { + player.draw(num); + } + player.addTempSkill("canshi2"); + }, + }, + canshi2: { + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (player.countCards("he") == 0) return false; + var type = get.type(event.card, "trick"); + return type == "basic" || type == "trick"; + }, + autodelay: true, + content: function () { + player.chooseToDiscard(true, "he"); + }, + }, + chouhai: { + audio: 2, + trigger: { player: "damageBegin3" }, + forced: true, + check: function () { + return false; + }, + filter: function (event, player) { + return player.countCards("h") == 0; + }, + content: function () { + trigger.num++; + }, + ai: { + neg: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && target.countCards("h") == 0) return [1, -2]; + }, + }, + }, + }, + recanshi: { + audio: "canshi", + trigger: { player: "phaseDrawBegin2" }, + check: function (event, player) { + if ( + player.skipList.includes("phaseUse") || + !player.countCards("h", function (card) { + return get.type(card, "trick") == "trick" && player.hasUseTarget(card); + }) + ) + return true; + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu") return true; + return current.isDamaged(); + }); + return num > 1; + }, + prompt: function (event, player) { + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; + return current.isDamaged(); + }); + return "残蚀:是否多摸" + get.cnNumber(num) + "张牌?"; + }, + filter: function (event, player) { + return ( + !event.numFixed && + game.hasPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; + return current.isDamaged(); + }) + ); + }, + content: function () { + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) return true; + return current.isDamaged(); + }); + if (num > 0) { + trigger.num += num; + } + player.addTempSkill("recanshi2"); + }, + }, + recanshi2: { + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (player.countCards("he") == 0) return false; + if (event.card.name == "sha") return true; + return get.type(event.card) == "trick"; + }, + autodelay: true, + content: function () { + player.chooseToDiscard(true, "he"); + }, + }, + rechouhai: { + audio: "chouhai", + trigger: { player: "damageBegin3" }, + forced: true, + check: function () { + return false; + }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && player.countCards("h") == 0; + }, + content: function () { + trigger.num++; + }, + ai: { + neg: true, + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && target.countCards("h") == 0) return [1, -2]; + }, + }, + }, + }, + kunfen: { + audio: 2, + audioname: ["ol_sb_jiangwei"], + trigger: { player: "phaseJieshuBegin" }, + locked: function (skill, player) { + if (!player || !player.storage.kunfen) return true; + return false; + }, + direct: true, + content: function () { + "step 0"; + if (player.storage.kunfen || (get.mode() == "guozhan" && player.hiddenSkills.includes("kunfen"))) { + if (!player.storage.kunfen) event.skillHidden = true; + player.chooseBool(get.prompt("kunfen"), "失去1点体力,然后摸两张牌").set("ai", function () { + var player = _status.event.player; + if (player.hp > 3) return true; + if (player.hp == 3 && player.countCards("h") < 3) return true; + if (player.hp == 2 && player.countCards("h") == 0) return true; + return false; + }); + } else event._result = { bool: true }; + "step 1"; + if (result.bool) { + player.logSkill("kunfen"); + player.loseHp(); + } else event.finish(); + "step 2"; + player.draw(2); + }, + ai: { threaten: 1.5 }, + }, + fengliang: { + skillAnimation: true, + animationColor: "thunder", + unique: true, + juexingji: true, + audio: 2, + derivation: "oltiaoxin", + trigger: { player: "dying" }, + //priority:10, + forced: true, + filter: function (event, player) { + return !player.storage.kunfen; + }, + content: function () { + "step 0"; + player.awakenSkill("fengliang"); + player.loseMaxHp(); + "step 1"; + if (player.hp < 2) { + player.recover(2 - player.hp); + } + "step 2"; + player.storage.kunfen = true; + player.addSkills("oltiaoxin"); + }, + }, + zhuiji: { + mod: { + globalFrom: function (from, to) { + if (from.hp >= to.hp) return -Infinity; + }, + }, + }, + oldcihuai: { + audio: "cihuai", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + check: function (event, player) { + return !player.countCards("h", "sha"); + }, + content: function () { + player.showHandcards(); + if (!player.countCards("h", "sha")) player.addTempSkill("oldcihuai2"); + }, + }, + oldcihuai2: { + group: "oldcihuai3", + prompt: "视为使用一张杀", + enable: "chooseToUse", + viewAs: { name: "sha", isCard: true }, + filterCard: function () { + return false; + }, + selectCard: -1, + ai: { + presha: true, + respondSha: true, + }, + }, + oldcihuai3: { + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter", "die"], + }, + silent: true, + firstDo: true, + filter: function (event, player) { + if (event.name == "die") return true; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; + }, + content: function () { + player.removeSkill("oldcihuai2"); + }, + }, + cihuai: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h", "sha") == 0; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("cihuai"), function (card, player, target) { + return player.canUse({ name: "sha", isCard: true }, target); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha", isCard: true }, player, player); + }); + "step 1"; + if (result.bool) { + player.logSkill("cihuai"); + player.showHandcards(); + player.useCard({ name: "sha", isCard: true }, result.targets); + } + }, + ai: { + expose: 0.2, + }, + }, + jilei: { + trigger: { player: "damageEnd" }, + audio: 2, + direct: true, + filter: function (event) { + return event.source && event.source.isIn(); + }, + content: function () { + "step 0"; + player + .chooseControl("basic", "trick", "equip", "cancel2", function () { + var source = _status.event.source; + if (get.attitude(_status.event.player, source) > 0) return "cancel2"; + var list = ["basic", "trick", "equip"].filter(function (name) { + return !source.storage.jilei2 || !source.storage.jilei2.includes(name); + }); + if (!list.length) return "cancel2"; + if ( + list.includes("trick") && + source.countCards("h", function (card) { + return get.type(card, source) == "trick" && source.hasValueTarget(card); + }) > 1 + ) + return "trick"; + return list[0]; + }) + .set("prompt", get.prompt2("jilei", trigger.source)) + .set("source", trigger.source); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("jilei", trigger.source); + player.popup(get.translation(result.control) + "牌"); + trigger.source.addTempSkill("jilei2", { player: "phaseBegin" }); + trigger.source.storage.jilei2.add(result.control); + trigger.source.updateMarks("jilei2"); + } + }, + ai: { + maixie_defend: true, + threaten: 0.7, + }, + }, + jilei2: { + unique: true, + charlotte: true, + intro: { + content: function (storage) { + return "不能使用、打出或弃置" + get.translation(storage) + "牌"; + }, + }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + mark: true, + onremove: true, + mod: { + cardDiscardable: function (card, player) { + if (player.storage.jilei2.includes(get.type(card, "trick"))) return false; + }, + cardEnabled: function (card, player) { + if (player.storage.jilei2.includes(get.type(card, "trick"))) { + var hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (var i of cards) { + if (hs.includes(i)) return false; + } + } + }, + cardRespondable: function (card, player) { + if (player.storage.jilei2.includes(get.type(card, "trick"))) { + var hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (var i of cards) { + if (hs.includes(i)) return false; + } + } + }, + cardSavable: function (card, player) { + if (player.storage.jilei2.includes(get.type(card, "trick"))) { + var hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (var i of cards) { + if (hs.includes(i)) return false; + } + } + }, + }, + }, + danlao: { + audio: 2, + filter: function (event, player) { + return (event.card.name == "sha" || get.type(event.card) == "trick") && event.targets && event.targets.length > 1; + }, + check: function (event, player) { + return event.getParent().excluded.includes(player) || get.tag(event.card, "multineg") || get.effect(player, event.card, event.player, player) <= 0; + }, + trigger: { target: "useCardToTargeted" }, + content: function () { + trigger.getParent().excluded.add(player); + player.draw(); + }, + ai: { + effect: { + target: function (card) { + if (get.type(card) != "trick") return; + if (card.name == "tiesuo") return [0, 0]; + if (card.name == "yihuajiemu") return [0, 1]; + if (get.tag(card, "multineg")) return [0, 2]; + }, + }, + }, + }, + taichen: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canUse("sha", target); + }, + content: function () { + "step 0"; + player.loseHp(); + "step 1"; + player.useCard({ name: "sha", isCard: true }, target, false); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (player.hp > 2 && player.hp > target.hp && target.countCards("he") < 4) { + return get.effect(target, { name: "sha" }, player, target); + } + return 0; + }, + }, + }, + }, + naman: { + audio: 2, + trigger: { global: "respondAfter" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (event.player == player) return false; + if (event.cards) { + for (var i = 0; i < event.cards.length; i++) { + if (get.position(event.cards[i], true) == "o") return true; + } + } + return false; + }, + frequent: true, + content: function () { + var cards = trigger.cards.slice(0); + for (var i = 0; i < cards.length; i++) { + if (get.position(cards[i], true) != "o") { + cards.splice(i--, 1); + } + } + game.delay(0.5); + player.gain(cards, "gain2"); + }, + }, + xiemu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", "sha") > 0; + }, + filterCard: { name: "sha" }, + check: function (card) { + return 6 - get.value(card); + }, + content: function () { + "step 0"; + var list = lib.group.filter(function (group) { + return ( + ["wei", "shu", "wu", "qun"].includes(group) || + game.hasPlayer(function (current) { + return current.group == group; + }) + ); + }); + if (player.storage.xiemu2) list.removeArray(player.storage.xiemu2); + var list2 = list.slice(0); + list2.sort(function (a, b) { + return lib.skill.xiemu.count(b) - lib.skill.xiemu.count(a); + }); + player + .chooseControl(list) + .set("prompt", "请选择一个势力") + .set("ai", function () { + return _status.event.group; + }) + .set("group", list2[0]); + "step 1"; + player.popup(result.control + 2, get.groupnature(result.control)); + game.log(player, "选择了", "#g" + get.translation(result.control + 2)); + player.addTempSkill("xiemu2", { player: "phaseBegin" }); + player.storage.xiemu2.add(result.control); + player.updateMarks("xiemu2"); + }, + ai: { + order: 1, + result: { player: 1 }, + }, + count: function (group) { + var player = _status.event.player; + return game.countPlayer(function (current) { + return current != player && current.group == group && get.attitude(current, player) < 0; + }); + }, + }, + xiemu2: { + onremove: true, + mark: true, + forced: true, + audio: "xiemu", + intro: { + content: function (storage) { + return "已指定" + get.translation(storage) + "势力"; + }, + }, + trigger: { + target: "useCardToTargeted", + }, + init: function (player) { + if (!player.storage.xiemu2) player.storage.xiemu2 = []; + }, + filter: function (event, player) { + if (!player.storage.xiemu2) return false; + if (get.color(event.card) != "black") return false; + if (!event.player) return false; + if (event.player == player || !player.storage.xiemu2.includes(event.player.group)) return false; + return true; + }, + content: function () { + player.draw(2); + }, + }, + oldxiemu: { + audio: "xiemu", + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + if (get.color(event.card) != "black") return false; + if (!event.player) return false; + if (event.player == player) return false; + if (get.mode() != "guozhan") return false; + return player.countCards("h", "sha") > 0; + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard("协穆:是否弃置一张杀并摸两张牌?", { name: "sha" }); + next.set("ai", function (card) { + return 9 - get.value(card); + }); + next.logSkill = "xiemu"; + "step 1"; + if (result.bool) { + player.draw(2); + } + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.color(card) == "black" && target.countCards("h") > 0) { + return [1, 0.5]; + } + }, + }, + }, + }, + spmengjin: { + trigger: { player: "shaBegin" }, + filter: function (event, player) { + return event.target.countCards("he") > 0; + }, + direct: true, + content: function () { + "step 0"; + var att = get.attitude(player, trigger.target); + player.choosePlayerCard(get.prompt("spmengjin", trigger.target), "he", trigger.target).ai = function (button) { + var val = get.buttonValue(button); + if (att > 0) return -val; + return val; + }; + "step 1"; + if (result.bool) { + trigger.target.discard(result.links); + player.logSkill("spmengjin", trigger.target); + trigger.target.addTempSkill("mengjin2", "shaAfter"); + } + }, + ai: { + expose: 0.2, + }, + }, + fenxun_old: { + audio: 2, + trigger: { player: "shaBefore" }, + direct: true, + filter: function (event, player) { + return event.targets.length == 1; + }, + position: "he", + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: lib.filter.cardDiscardable, + filterTarget: function (card, player, target) { + var trigger = _status.event.getTrigger(); + return lib.filter.targetEnabled(trigger.card, player, target) && target != trigger.targets[0]; + }, + ai1: function (card) { + return 6 - get.value(card); + }, + ai2: function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }, + prompt: get.prompt2("fenxun"), + }); + "step 1"; + if (result.bool) { + player.discard(result.cards); + trigger.targets.push(result.targets[0]); + player.logSkill("fenxun", result.targets); + } + }, + }, + rezhoufu: { + audio: "zhoufu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterCard: true, + filterTarget: function (card, player, target) { + return target != player && !target.getExpansions("rezhoufu2").length; + }, + check: function (card) { + return 6 - get.value(card); + }, + position: "he", + discard: false, + lose: false, + delay: false, + content: function () { + if (!target.storage.rezhoufu2_markcount) target.storage.rezhoufu2_markcount = 0; + target.addToExpansion(cards, player, "give").gaintag.add("rezhoufu2"); + target.addSkill("rezhoufu_judge"); + }, + ai: { + order: 1, + result: { + target: -1, + }, + }, + group: ["rezhoufu_losehp"], + subSkill: { + judge: { + audio: "zhoufu", + trigger: { player: "judgeBefore" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !event.directresult && player.getExpansions("rezhoufu2").length; + }, + content: function () { + var cards = [player.getExpansions("rezhoufu2")[0]]; + trigger.directresult = cards[0]; + }, + }, + losehp: { + audio: "zhoufu", + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.hasHistory("lose", function (evt) { + if (!evt || !evt.xs || !evt.xs.length) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("rezhoufu2")) return true; + } + return false; + }); + }); + }, + logTarget: function (current) { + return game + .filterPlayer(function (current) { + return current.hasHistory("lose", function (evt) { + if (!evt || !evt.xs || !evt.xs.length) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("rezhoufu2")) return true; + } + return false; + }); + }) + .sortBySeat(); + }, + content: function () { + var targets = game + .filterPlayer(function (current) { + return current.hasHistory("lose", function (evt) { + if (!evt || !evt.xs || !evt.xs.length) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("rezhoufu2")) return true; + } + return false; + }); + }) + .sortBySeat(); + while (targets.length) { + targets.shift().loseHp(); + } + }, + }, + }, + }, + rezhoufu2: { + intro: { + content: "expansion", + }, + }, + rezhoufu3: {}, + reyingbing: { + audio: "yingbin", + trigger: { global: "useCard" }, + forced: true, + filter: function (event, player) { + var cards = event.player.getExpansions("rezhoufu2"); + return cards.length && get.color(cards[0]) == get.color(event.card); + }, + logTarget: "player", + content: function () { + "step 0"; + player.draw(); + "step 1"; + trigger.player.storage.rezhoufu2_markcount++; + if (trigger.player.storage.rezhoufu2_markcount >= 2) { + delete trigger.player.storage.rezhoufu2_markcount; + var cards = trigger.player.getExpansions("rezhoufu2"); + player.gain(cards, trigger.player, "give", "bySelf"); + } else trigger.player.markSkill("rezhoufu2"); + }, + ai: { + combo: "rezhoufu", + }, + }, + zhoufu: { + audio: 2, + }, + yingbin: { + audio: 2, + }, + kuiwei: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + check: function (event, player) { + if (player.isTurnedOver()) return true; + var num = game.countPlayer(function (current) { + return current.getEquip(1); + }); + return num > 1; + }, + content: function () { + "step 0"; + player.turnOver(); + "step 1"; + var num = game.countPlayer(function (current) { + return current.getEquips(1).length; + }); + player.draw(2 + num); + player.addSkill("kuiwei2"); + }, + ai: { + effect: { + target: function (card) { + if (card.name == "guiyoujie") return [0, 2]; + }, + }, + }, + }, + kuiwei2: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + audio: false, + content: function () { + var num = game.countPlayer(function (current) { + return current.getEquips(1).length; + }); + if (num >= player.countCards("he")) { + player.discard(player.getCards("he")); + } else if (num) { + player.chooseToDiscard("he", num, true); + } + player.removeSkill("kuiwei2"); + }, + }, + yanzheng: { + enable: "chooseToUse", + audio: 2, + filter: function (event, player) { + return player.hp < player.countCards("h") && player.countCards("e") > 0; + }, + viewAsFilter: function (player) { + return player.hp < player.countCards("h") && player.countCards("e") > 0; + }, + filterCard: true, + position: "e", + viewAs: { name: "wuxie" }, + prompt: "将一张装备区内的牌当无懈可击使用", + check: function (card) { + return 8 - get.equipValue(card); + }, + threaten: 1.2, + }, + tongji: { + global: "tongji_disable", + audio: 2, + trigger: { global: "useCard1" }, + forced: true, + filter: function (event, player) { + return event.targets.includes(player) && player != event.player && event.card.name == "sha" && player.hp < player.countCards("h"); + }, + content: function () {}, + unique: true, + gainable: true, + subSkill: { + disable: { + mod: { + targetEnabled: function (card, player, target) { + if (card.name == "sha") { + if (player.hasSkill("tongji")) return; + if (target.hasSkill("tongji")) return; + if ( + game.hasPlayer(function (current) { + return current.hasSkill("tongji") && current.hp < current.countCards("h") && player.inRange(current); + }) + ) { + return false; + } + } + }, + }, + }, + }, + }, + wangzun: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + check: function (event, player) { + var att = get.attitude(player, event.player); + return !game.hasPlayer(function (current) { + return get.attitude(player, current) < att; + }); + }, + filter: function (event, player) { + return event.player != player && !player.storage.wangzun; + }, + logTarget: "player", + content: function () { + player.draw(); + player.markSkill("wangzun"); + player.storage.wangzun = trigger.player; + trigger.player.addTempSkill("wangzun3"); + }, + ai: { + expose: 0.2, + }, + intro: { + content: "player", + }, + group: "wangzun2", + }, + wangzun2: { + trigger: { player: "phaseZhunbeiBegin" }, + silent: true, + content: function () { + player.unmarkSkill("wangzun"); + player.storage.wangzun = null; + }, + }, + wangzun3: { + mod: { + maxHandcard: function (player, num) { + return num - 1; + }, + }, + }, + kaikang: { + audio: 2, + trigger: { global: "useCardToTargeted" }, + filter: function (event, player) { + return event.card.name == "sha" && get.distance(player, event.target) <= 1 && event.target.isIn(); + }, + check: function (event, player) { + return get.attitude(player, event.target) >= 0; + }, + logTarget: "target", + content: function () { + "step 0"; + player.draw(); + if (trigger.target != player) { + player.chooseCard(true, "he", "交给" + get.translation(trigger.target) + "一张牌").set("ai", function (card) { + if (get.position(card) == "e") return -1; + if (card.name == "shan") return 1; + if (get.type(card) == "equip") return 0.5; + return 0; + }); + } else { + event.finish(); + } + "step 1"; + player.give(result.cards, trigger.target, "give"); + game.delay(); + event.card = result.cards[0]; + "step 2"; + if (trigger.target.getCards("h").includes(card) && get.type(card) == "equip") { + trigger.target.chooseUseTarget(card); + } + }, + ai: { + threaten: 1.1, + }, + }, + liangzhu: { + audio: 2, + trigger: { global: "recoverAfter" }, + direct: true, + filter: function (event, player) { + return event.player.isPhaseUsing(); + }, + content: function () { + "step 0"; + if (player == trigger.player) { + player + .chooseControl("摸一张", "摸两张", "cancel2", function () { + return "摸两张"; + }) + .set("prompt", get.prompt2("liangzhu")); + event.single = true; + } else { + player + .chooseTarget(get.prompt2("liangzhu"), function (card, player, target) { + return target == _status.event.player || target == _status.event.target; + }) + .set("target", trigger.player) + .set("ai", function (target) { + var player = _status.event.player; + if (player == target) return 1; + return get.attitude(player, target) - 1.5; + }); + } + "step 1"; + if (event.single) { + if (result.control != "cancel2") { + player.logSkill("liangzhu", player); + if (result.control == "摸一张") { + player.draw(); + } else { + player.draw(2); + if (!player.storage.liangzhu) player.storage.liangzhu = []; + player.storage.liangzhu.add(player); + } + } + } else if (result.bool) { + var target = result.targets[0]; + player.logSkill("liangzhu", target); + if (target == player) { + target.draw(); + } else { + target.draw(2); + if (target.storage.liangzhu) { + target.storage.liangzhu.add(player); + } else { + target.storage.liangzhu = [player]; + } + } + } + }, + ai: { + expose: 0.1, + }, + }, + fanxiang: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + unique: true, + juexingji: true, + forceunique: true, + derivation: "xiaoji", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (player.storage.fanxiang) return false; + return game.hasPlayer(function (current) { + return current.storage.liangzhu && current.storage.liangzhu.includes(player) && current.isDamaged(); + }); + }, + forced: true, + content: function () { + player.awakenSkill("fanxiang"); + player.gainMaxHp(); + player.recover(); + player.changeSkills(["xiaoji"], ["liangzhu"]); + }, + ai: { + combo: "liangzhu", + }, + }, + mingshi: { + audio: 2, + trigger: { player: "damageBegin3" }, + direct: true, + filter: function (event, player) { + return event.source && event.source.hp > player.hp; + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt2("mingshi"), { color: "black" }); + next.set("ai", function (card) { + return 9 - get.value(card); + }); + next.set("logSkill", "mingshi"); + "step 1"; + if (result.bool) { + trigger.num--; + } + }, + ai: { + threaten: 0.8, + }, + }, + lirang: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + if (!game.hasPlayer(current => current != player)) return false; + if (event.type != "discard" || event.getlx === false) return false; + var evt = event.getl(player); + if (!evt || !evt.cards2) return false; + for (var i = 0; i < evt.cards2.length; i++) { + if (get.position(evt.cards2[i]) == "d") { + return true; + } + } + return false; + }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + if (trigger.delay == false) game.delay(); + event.cards = []; + var cards2 = trigger.getl(player).cards2; + for (var i = 0; i < cards2.length; i++) { + if (get.position(cards2[i], true) == "d") { + event.cards.push(cards2[i]); + } + } + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + "step 1"; + var goon = false; + for (var i = 0; i < event.cards.length; i++) { + if (event.cards[i].name == "du") { + goon = true; + break; + } + } + if (!goon) { + goon = game.hasPlayer(function (current) { + return player != current && get.attitude(player, current) > 1; + }); + } + player + .chooseButton(["礼让:是否分配本次弃置的牌?", event.cards], [1, event.cards.length]) + .set("ai", function (button) { + if (_status.event.goon && ui.selected.buttons.length == 0) return 1 + Math.abs(get.value(button.link)); + return 0; + }) + .set("goon", goon) + .setHiddenSkill("lirang"); + "step 2"; + if (result.bool) { + event.cards.removeArray(result.links); + event.togive = result.links.slice(0); + player + .chooseTarget("选择一名其他角色获得" + get.translation(result.links), true, lib.filter.notMe) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + } else event.goto(4); + "step 3"; + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; + map[id].addArray(event.togive); + } + if (cards.length > 0) event.goto(1); + "step 4"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var list = [], + targets = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + list.push([source, event.given_map[i]]); + targets.push(source); + } + if (targets.length) { + player.logSkill("lirang", targets); + game.loseAsync({ + gain_list: list, + giver: player, + animate: "gain2", + }).setContent("gaincardMultiple"); + } + }, + ai: { + expose: 0.1, + effect: { + target: function (card, player, target, current) { + if (target.hasFriend() && get.tag(card, "discard")) { + if (current < 0) return 0; + return [1, 1]; + } + }, + }, + }, + }, + moukui: { + audio: 2, + audioname: ["sp_mushun"], + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + var controls = ["draw_card"]; + if (trigger.target.countCards("he")) { + controls.push("discard_card"); + } + controls.push("cancel"); + player + .chooseControl(controls) + .set("ai", function () { + var trigger = _status.event.getTrigger(); + if (trigger.target.countCards("he") && get.attitude(_status.event.player, trigger.target) < 0) { + return "discard_card"; + } else { + return "draw_card"; + } + }) + .set("prompt", get.prompt2("moukui")); + "step 1"; + if (result.control == "draw_card") { + player.draw(); + player.logSkill("moukui"); + } else if (result.control == "discard_card" && trigger.target.countCards("he")) { + player.discardPlayerCard(trigger.target, "he", true).logSkill = ["moukui", trigger.target]; + } else event.finish(); + "step 2"; + player.addTempSkill("moukui2", "shaEnd"); + }, + ai: { + expose: 0.1, + }, + }, + moukui2: { + audio: false, + trigger: { player: "shaMiss" }, + forced: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + trigger.target.discardPlayerCard(player, true); + }, + }, + shenxian: { + audio: 2, + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + if (event.type != "discard" || _status.currentPhase == player || event.getlx === false) return false; + if (event.name == "lose" && event.player == player) return false; + if (player.hasSkill("shenxian2")) return false; + var cards = event.cards.slice(0); + var evt = event.getl(player); + if (evt && evt.cards) cards.removeArray(evt.cards); + for (var i = 0; i < cards.length; i++) { + if (get.type(cards[i], null, event.hs && event.hs.includes(cards[i]) ? event.player : false) == "basic" && cards[i].original != "j") { + return true; + } + } + return false; + }, + frequent: true, + content: function () { + "step 0"; + if (trigger.delay == false) game.delay(); + "step 1"; + player.draw(); + if (event.name == "shenxian") player.addTempSkill("shenxian2"); + }, + ai: { + threaten: 1.5, + }, + }, + shenxian2: { charlotte: true }, + qiangwu: { + audio: 2, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + player.judge(); + "step 1"; + player.storage.qiangwu = result.number; + player.addTempSkill("qiangwu3", "phaseUseEnd"); + }, + ai: { + result: { + player: 1, + }, + order: 11, + }, + }, + qiangwu3: { + mod: { + targetInRange: function (card, player) { + if (card.name == "sha") { + const num = get.number(card); + if (num == "unsure" || num < player.storage.qiangwu) return true; + } + }, + cardUsable: function (card, player) { + if (card.name == "sha") { + const num = get.number(card); + if (num == "unsure" || num > player.storage.qiangwu) return true; + } + }, + }, + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (_status.currentPhase == player && event.card.name == "sha" && get.number(event.card) > player.storage.qiangwu && event.addCount !== false) return true; + return false; + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + }, + }, + zhendu: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return /*(get.mode()!='guozhan'||event.player!=player)&&*/ event.player.isIn() && player.countCards("h") > 0 && event.player.hasUseTarget({ name: "jiu" }, null, true); + }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + var nono = Math.abs(get.attitude(player, trigger.player)) < 3; + if (player == trigger.player || get.damageEffect(trigger.player, player, player) <= 0 || !trigger.player.hasUseTarget({ name: "jiu" }, null, true)) { + nono = true; + } else if (trigger.player.hp > 2) { + nono = true; + } else if (trigger.player.hp > 1 && player.countCards("h") < 3 && trigger.player.canUse("sha", player) && !player.countCards("h", "shan") && trigger.player.countCards("h") >= 3) { + nono = true; + } + var next = player.chooseToDiscard(get.prompt2("zhendu", trigger.player)); + next.set("ai", function (card) { + if (_status.event.nono) return -1; + return 7 - get.useful(card); + }); + next.set("logSkill", ["zhendu", trigger.player]); + next.set("nono", nono); + next.setHiddenSkill("zhendu"); + "step 1"; + if (result.bool) { + trigger.player.chooseUseTarget({ name: "jiu" }, true, "noTargetDelay", "nodelayx"); + } else { + event.finish(); + } + "step 2"; + if (result.bool && trigger.player != player) trigger.player.damage(); + }, + ai: { + threaten: 2, + expose: 0.3, + }, + }, + qiluan: { + audio: "qiluan2", + preHidden: true, + trigger: { global: "phaseEnd" }, + frequent: true, + filter: function (event, player) { + return game.hasPlayer2(function (current) { + return current.getStat("kill") > 0; + }); + }, + prompt: function (event, player) { + var num = game.countPlayer2(function (current) { + return (current.getStat("kill") || 0) * (current == player ? 3 : 1); + }); + return get.prompt("qiluan") + "(可摸" + get.cnNumber(num) + "张牌)"; + }, + content: function () { + //if(get.mode()=='guozhan'){ + // player.draw(3); + //} + //else{ + player.draw( + game.countPlayer2(function (current) { + return (current.getStat("kill") || 0) * (current == player ? 3 : 1); + }) + ); + //} + }, + subSkill: { + draw: { + trigger: { global: "dieAfter" }, + frequent: true, + filter: function (event, player) { + return /*get.mode()!='guozhan'&&*/ player != event.source; + }, + content: function () { + player.draw(); + }, + }, + }, + }, + qiluan2: { + audio: 2, + }, + zniaoxiang: { + shaRelated: true, + audio: 2, + trigger: { player: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && !event.getParent().directHit.includes(event.target); + }, + //priority:-1, + logTarget: "target", + content: function () { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { + map[id].shanRequired++; + } else { + map[id].shanRequired = 2; + } + }, + }, + shangyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("h"); + }, + content: function () { + "step 0"; + player.chooseCardButton(target, target.getCards("h")).set("filterButton", function (button) { + return get.color(button.link) == "black"; + }); + "step 1"; + if (result.bool) { + target.discard(result.links[0]); + } + }, + ai: { + order: 11, + result: { + target: function (player, target) { + return -target.countCards("h"); + }, + }, + threaten: 1.1, + }, + }, + shengxi: { + trigger: { player: "phaseDiscardBegin" }, + frequent: true, + filter: function (event, player) { + return !player.getStat("damage"); + }, + content: function () { + player.draw(2); + }, + audio: 2, + audioname: ["liushan"], + }, + shoucheng: { + init(player) { + game.addGlobalSkill("shoucheng_draw", player); + }, + trigger: { + global: ["equipAfter", "addJudgeAfter", "loseAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + audio: 2, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + if (current == _status.currentPhase) return false; + var evt = event.getl(current); + return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; + }); + }, + content: function () { + "step 0"; + event.list = game + .filterPlayer(function (current) { + if (current == _status.currentPhase) return false; + var evt = trigger.getl(current); + return evt && evt.hs && evt.hs.length; + }) + .sortBySeat(_status.currentPhase); + "step 1"; + var target = event.list.shift(); + event.target = target; + if (target.isIn() && target.countCards("h") == 0) { + player.chooseBool(get.prompt2("shoucheng", target)).set("ai", function () { + return get.attitude(_status.event.player, _status.event.getParent().target) > 0; + }); + } else event.goto(3); + "step 2"; + if (result.bool) { + player.logSkill(event.name, target); + if (player !== target && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.15); + target.draw(); + } + "step 3"; + if (event.list.length) event.goto(1); + }, + ai: { + threaten: 1.3, + }, + subSkill: { + draw: { + trigger: { player: "dieAfter" }, + filter(event, player) { + return !game.hasPlayer(current => { + return current.hasSkill("shoucheng"); + }, true); + }, + content() { + game.removeGlobalSkill("shoucheng_draw"); + }, + ai: { + noh: true, + skillTagFilter(player, tag, arg) { + if (player === _status.currentPhase || player.countCards("h") !== 1) return false; + return game.hasPlayer(current => { + return current.hasSkill("shoucheng") && player.isFriendOf(current); + }); + }, + }, + }, + }, + }, + hengzheng: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + preHidden: true, + filter: function (event, player) { + return !event.numFixed && (player.hp == 1 || player.countCards("h") == 0); + }, + check: function (event, player) { + var num = game.countPlayer(function (current) { + if (current.countCards("he") && current != player && get.attitude(player, current) <= 0) { + return true; + } + if (current.countCards("j") && current != player && get.attitude(player, current) > 0) { + return true; + } + }); + return num >= 2; + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(); + targets.remove(player); + targets.sort(lib.sort.seat); + event.targets = targets; + event.num = 0; + trigger.changeToZero(); + player.line(targets, "green"); + "step 1"; + if (num < event.targets.length) { + if (event.targets[num].countCards("hej")) { + player.gainPlayerCard(event.targets[num], "hej", true); + } + event.num++; + event.redo(); + } + }, + ai: { + noh: true, + skillTagFilter: function (player, tag) { + if (tag == "noh") { + if (player.countCards("h") != 1) return false; + } + }, + threaten: function (player, target) { + if (target.hp == 1) return 2.5; + return 1; + }, + }, + }, + yongjue: { + audio: 2, + trigger: { global: "useCardAfter" }, + usable: 1, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (event.player == player) return false; + if (event.targets.includes(player)) return false; + if (event.cards) { + for (var i = 0; i < event.cards.length; i++) { + if (get.position(event.cards[i], true) == "o") return true; + } + } + return false; + }, + frequent: true, + content: function () { + var cards = trigger.cards.slice(0); + for (var i = 0; i < cards.length; i++) { + if (get.position(cards[i], true) != "o") { + cards.splice(i--, 1); + } + } + player.gain(cards, "gain2"); + }, + }, + guixiu: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + frequent: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countCards("h") < player.hp; + }, + content: function () { + player.draw(); + }, + }, + cunsi: { + skillAnimation: true, + animationColor: "orange", + audio: 2, + unique: true, + enable: "phaseUse", + mark: true, + limited: true, + derivation: "yongjue", + filter: function (event, player) { + return !player.storage.cunsi && player.countCards("h") && !player.isTurnedOver(); + }, + init: function (player) { + player.storage.cunsi = false; + }, + filterTarget: function (card, player, target) { + return player != target && target.hasSex("male"); + }, + content: function () { + "step 0"; + player.awakenSkill("cunsi"); + var cards = player.getCards("h"); + player.give(cards, target); + "step 1"; + target.addSkills("yongjue"); + "step 2"; + target.markSkillCharacter("yongjue", player, "存嗣", '
    【勇决】
    每当其他角色于回合内使用一张杀,若目标不是你,你可以获得之,每回合限一次
    '); + player.turnOver(); + }, + intro: { + content: "limited", + }, + ai: { + order: 4, + result: { + target: function (player, target) { + if (target.isMin()) return 0; + if (player.hp > 1) { + if (game.phaseNumber < game.players.length) return 0; + if (target.hp == 1 && target.maxHp > 2) return 0; + if (get.attitude(player, target) < 5) return 0; + } + if (get.attitude(player, target) < 5) return 0; + if (target.hp == 1 && target.maxHp > 2) return 0.2; + if (target == game.me) return 1.2; + return 1; + }, + }, + expose: 0.5, + threaten: 1.5, + }, + }, + fenming: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + check: function (event, player) { + var num = game.countPlayer(function (current) { + if (current.isLinked() && current.countCards("he")) { + return get.effect(current, { name: "guohe_copy2" }, player, player); + } + }); + return num < 0; + }, + filter: function (event, player) { + return player.isLinked(); + }, + preHidden: true, + prompt: "是否发动【奋命】?", + logTarget: function (event, player) { + return game.filterPlayer(function (current) { + if (current.isLinked() && current.countCards("he")) { + return true; + } + }); + }, + content: function () { + "step 0"; + event.targets = game.filterPlayer(function (current) { + if (current.isLinked() && current.countCards("he")) { + return true; + } + }); + event.num = 0; + event.targets.sort(lib.sort.seat); + "step 1"; + if (event.num < event.targets.length) { + var target = event.targets[event.num]; + if (player == target) { + player.chooseToDiscard(true, "he"); + } else { + player.discardPlayerCard(true, "he", target); + } + event.num++; + event.redo(); + } + }, + }, + duanxie: { + enable: "phaseUse", + usable: 1, + audio: 2, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && !current.isLinked(); + }); + }, + filterTarget: function (card, player, target) { + return player != target && !target.isLinked(); + }, + selectTarget: function () { + return [1, Math.max(1, _status.event.player.getDamagedHp())]; + }, + content: function () { + if (!target.isLinked()) target.link(); + }, + contentAfter: function () { + if (!player.isLinked()) player.link(); + }, + ai: { + result: { + target: -1, + player: function (player) { + return player.isLinked() ? 0 : -0.8; + }, + }, + order: 2, + expose: 0.3, + effect: { + target: function (card) { + if (card.name == "tiesuo") { + return 0.5; + } + }, + }, + }, + }, + xiaoguo: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player.isIn() && event.player != player && player.countCards("h"); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt("xiaoguo", trigger.player)); + next.set("ai", function (card) { + return _status.event.eff - get.useful(card); + }); + next.set("logSkill", ["xiaoguo", trigger.player]); + next.set( + "eff", + (function () { + if (trigger.player.hasSkillTag("noe")) return get.attitude(_status.event.player, trigger.player); + return get.damageEffect(trigger.player, player, _status.event.player); + })() + ); + "step 1"; + if (result.bool) { + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15); + trigger.player + .chooseToDiscard("he", "弃置一张装备牌并令" + get.translation(player) + "摸一张牌,或受到1点伤害", { type: "equip" }) + .set("ai", function (card) { + if (_status.event.damage > 0) return 0; + if (_status.event.noe) return 12 - get.value(card); + return 2 * _status.event.damage - get.value(card); + }) + .set("damage", get.damageEffect(trigger.player, player, trigger.player)) + .set("noe", trigger.player.hasSkillTag("noe")); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.draw(); + } else { + trigger.player.damage(); + } + }, + }, + suishi: { + audio: 2, + trigger: { global: "dying" }, + forced: true, + popup: false, + //priority:12, + check: function () { + return false; + }, + filter: function (event, player) { + return event.player != player && event.parent.name == "damage" && event.parent.source && event.parent.source != event.player; + }, + content: function () { + "step 0"; + var str; + if (trigger.parent.source == player) { + str = "随势:是否摸一张牌?"; + } else { + str = "随势:是否令" + get.translation(player) + "摸一张牌?"; + } + trigger.parent.source + .chooseBool(str) + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.target) > 0; + }) + .set("target", player); + "step 1"; + if (result.bool) { + player.logSkill("suishi"); + trigger.parent.source.line(player, "green"); + player.draw(); + } + }, + ai: { + halfneg: true, + }, + group: "suishi2", + }, + suishi2: { + trigger: { global: "dieAfter" }, + forced: true, + popup: false, + check: function () { + return false; + }, + filter: function (event, player) { + return event.player != player && event.source && event.source != player && event.source != event.player; + }, + content: function () { + "step 0"; + var str; + if (trigger.source == player) { + str = "随势:是否失去1点体力?"; + } else { + str = "随势:是否令" + get.translation(player) + "失去1点体力?"; + } + trigger.source + .chooseBool(str) + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.target) < 0; + }) + .set("target", player); + "step 1"; + if (result.bool) { + player.logSkill("suishi"); + trigger.source.line(player, "green"); + player.loseHp(); + } + }, + }, + sijian: { + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + audio: 2, + preHidden: true, + filter: function (event, player) { + if (player.countCards("h")) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("sijian"), "弃置一名其他角色的一张牌", function (card, player, target) { + return player != target && target.countCards("he") > 0; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + player.logSkill("sijian", result.targets); + event.target = result.targets[0]; + player.discardPlayerCard(event.target, true); + } else { + event.finish(); + } + }, + ai: { + expose: 0.2, + }, + }, + quji: { + audio: 2, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + selectCard: function () { + var player = _status.event.player; + return player.getDamagedHp(); + }, + filterTarget: function (card, player, target) { + return target.hp < target.maxHp; + }, + filter: function (event, player) { + return player.hp < player.maxHp; + }, + selectTarget: function () { + return [1, ui.selected.cards.length]; + }, + complexSelect: true, + check: function (card) { + if (get.color(card) == "black") return -1; + return 9 - get.value(card); + }, + content: function () { + "step 0"; + target.recover(); + "step 1"; + if (target == targets[targets.length - 1]) { + for (var i = 0; i < cards.length; i++) { + if (get.color(cards[i], player) == "black") { + player.loseHp(); + break; + } + } + } + }, + ai: { + result: { + target: 1, + }, + order: 6, + }, + }, + junbing: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player.countCards("h") <= 1 && (player == event.player || player.hasSkill("junbing")); + }, + direct: true, + checkx: function (target, player) { + if (target) { + var num = target.countCards("h"); + var att = get.attitude(player, target); + if (num == 0) return true; + if (num == 1) return att > -1; + if (num == 2) return att > 0; + return att > 1; + } + return false; + }, + content: function () { + "step 0"; + event.target = player; + event.player = trigger.player; + var prompt; + if (player == event.player) prompt = "是否发动【郡兵】摸一张牌?"; + else prompt = "###是否对" + get.translation(event.target) + "发动【郡兵】?###" + (event.player == event.target ? "摸一张牌" : "摸一张牌,将所有手牌交给该角色,然后该角色交给你等量的手牌"); + event.player.chooseBool(prompt).set("choice", lib.skill.junbing.checkx(event.target, event.player)); + "step 1"; + if (!result.bool) { + event.finish(); + return; + } + target.logSkill("junbing", player); + if (player == target) event.finish(); + player.draw(); + "step 2"; + var cards = player.getCards("h"); + player.give(cards, target); + event.num = cards.length; + "step 3"; + var he = target.getCards("he"); + if (!he.length) event.finish(); + else if (he.length <= num) event._result = { cards: he }; + else target.chooseCard("选择还给" + get.translation(player) + "的牌", true, event.num, "he"); + "step 4"; + target.give(result.cards, player); + }, + }, + xiongyi: { + skillAnimation: true, + animationColor: "gray", + unique: true, + enable: "phaseUse", + audio: 2, + limited: true, + filterTarget: function (card, player, target) { + if (get.mode() == "guozhan") { + if (player == target) return true; + if (player.identity == "unknown") { + if (!player.wontYe("qun")) return false; + return target.identity == "qun"; + } + return target.isFriendOf(player); + } else { + return true; + } + }, + multitarget: true, + multiline: true, + selectTarget: function () { + if (get.mode() == "guozhan") return -1; + return [1, Infinity]; + }, + content: function () { + "step 0"; + player.awakenSkill("xiongyi"); + game.asyncDraw(targets, 3); + "step 1"; + if (player.isDamaged()) { + if (get.mode() == "guozhan") { + if (player.isMinor(true)) { + player.recover(); + } + } else if (player.isMinHp()) { + player.recover(); + } + } + }, + ai: { + order: 1, + result: { + target: function (player) { + var num = player.countCards("h"); + if (player.hp == 1) return 1; + if (player.hp == 2 && num <= 2) return 1; + if (player.hp == 3 && num <= 1) return 1; + if (game.phaseNumber < game.players.length * 2) return 0; + if (player.hasUnknown()) return 0; + return 1; + }, + }, + }, + }, + gzshushen: { + audio: "shushen", + trigger: { player: "recoverAfter" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return player != current && player.sameIdentityAs(current); + }); + }, + content: function () { + "step 0"; + event.num = trigger.num || 1; + "step 1"; + player + .chooseTarget(get.prompt2("gzshushen"), function (card, player, target) { + return target != player && player.sameIdentityAs(target); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 2"; + if (result.bool) { + player.logSkill("gzshushen", result.targets); + result.targets[0].draw(); + if (event.num > 1) { + event.num--; + event.goto(1); + } + } + }, + ai: { + threaten: 0.8, + expose: 0.1, + }, + }, + shushen: { + audio: 2, + trigger: { player: "recoverAfter" }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + player + .chooseTarget(get.prompt("shushen"), "令一名其他角色选择摸两张牌或回复1点体力", function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 2"; + if (result.bool) { + event.count--; + player.logSkill("shushen", result.targets); + result.targets[0].chooseDrawRecover(2, true); + if (event.count) event.goto(1); + } + }, + ai: { + threaten: 0.8, + expose: 0.1, + }, + }, + shenzhi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + check: function (event, player) { + if (player.hp > 2) return false; + var cards = player.getCards("h"); + if (cards.length < player.hp) return false; + if (cards.length > 3) return false; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i]) > 7 || get.tag(cards[i], "recover") >= 1) return false; + } + return true; + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + preHidden: true, + content: function () { + "step 0"; + var cards = player.getCards("h"); + event.bool = cards.length >= player.hp; + player.discard(cards); + "step 1"; + if (event.bool) { + player.recover(); + } + }, + }, + wuji: { + skillAnimation: true, + animationColor: "orange", + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + unique: true, + juexingji: true, + filter: function (event, player) { + return player.getStat("damage") >= 3 && !player.storage.wuji; + }, + content: function () { + "step 0"; + player.removeSkills("huxiao"); + player.gainMaxHp(); + "step 1"; + player.recover(); + player.awakenSkill("wuji"); + player.storage.wuji = true; + + var card = get.cardPile("qinglong", "field"); + if (card) { + player.gain(card, "gain2", "log"); + } + }, + }, + xueji_old: { + audio: "xueji", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hp < player.maxHp && player.countCards("he", { color: "red" }) > 0; + }, + filterTarget: function (card, player, target) { + return player != target && get.distance(player, target, "attack") <= 1; + }, + selectTarget: function () { + return [1, _status.event.player.maxHp - _status.event.player.hp]; + }, + position: "he", + filterCard: function (card) { + return get.color(card) == "red"; + }, + check: function (card) { + return 8 - get.useful(card); + }, + content: function () { + "step 0"; + target.damage(); + "step 1"; + target.draw(); + }, + ai: { + order: 7, + result: { + target: function (player, target) { + return get.damageEffect(target, player); + }, + }, + threaten: function (player, target) { + if (target.hp == 1) return 2; + if (target.hp == 2) return 1.5; + return 0.5; + }, + maixie: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (target.hp == target.maxHp && target.hasFriend()) return [0, 1]; + } + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, + }, + }, + }, + //FW关银屏 + oldhuxiao: { + shaRelated: true, + audio: "huxiao", + trigger: { player: "shaMiss" }, + forced: true, + content: function () { + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + }, + }, + oldwuji: { + unique: true, + audio: "wuji", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getStat("damage") >= 3 && !player.storage.oldwuji; + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "orange", + content: function () { + "step 0"; + player.removeSkills("oldhuxiao"); + player.gainMaxHp(); + "step 1"; + player.recover(); + player.awakenSkill("oldwuji"); + }, + }, + xueji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he", { color: "red" }) > 0; + }, + filterTarget: true, + selectTarget: function () { + var player = _status.event.player; + return [1, Math.max(1, player.getDamagedHp())]; + }, + position: "he", + filterCard: { color: "red" }, + check: function (card) { + return 8 - get.value(card); + }, + multitarget: true, + multiline: true, + line: "fire", + content: function () { + "step 0"; + event.delay = false; + for (var i = 0; i < targets.length; i++) { + if (!targets[i].isLinked()) { + targets[i].link(true); + event.delay = true; + } + } + "step 1"; + if (event.delay) { + game.delay(); + } + "step 2"; + targets[0].damage("fire", "nocard"); + }, + ai: { + damage: true, + fireAttack: true, + threaten: 1.5, + order: 7, + result: { + target: function (player, target) { + var eff = get.damageEffect(target, player, target, "fire"); + if (target.isLinked()) { + return eff / 10; + } else { + return eff; + } + }, + }, + }, + }, + huxiao: { + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player) || !event.player.isIn()) return false; + return event.hasNature("fire"); + }, + logTarget: "player", + content: function () { + if (!player.storage.huxiao3) { + player.storage.huxiao3 = []; + } + player.storage.huxiao3.add(trigger.player); + trigger.player.draw(); + player.addTempSkill("huxiao3"); + }, + }, + huxiao3: { + onremove: true, + mark: true, + intro: { + content: "players", + }, + mod: { + cardUsableTarget: function (card, player, target) { + if (player.storage.huxiao3 && player.storage.huxiao3.includes(target)) return true; + }, + }, + }, + aocai: { + audio: 2, + audioname: ["gz_zhugeke"], + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if (player != _status.currentPhase && get.type(name) == "basic" && lib.inpile.includes(name)) return true; + }, + filter: function (event, player) { + if (event.responded || player == _status.currentPhase || event.aocai) return false; + for (var i of lib.inpile) { + if (get.type(i) == "basic" && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) return true; + } + return false; + }, + delay: false, + content: function () { + "step 0"; + var evt = event.getParent(2); + evt.set("aocai", true); + var cards = get.cards(get.mode() != "guozhan" && player.countCards("h") == 0 ? 4 : 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 (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 card = result.links[0]; + var name = card.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.aocai_backup.viewAs = { + name: name, + cards: [result], + isCard: true, + }; + }, + card, + name + ); + evt.set("_backupevent", "aocai_backup"); + evt.set("openskilldialog", "请选择" + get.translation(card) + "的目标"); + evt.backup("aocai_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 (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; + }, + }, + }, + }, + aocai_backup: { + sourceSkill: "aocai", + precontent: function () { + delete event.result.skill; + var name = event.result.card.name, + cards = event.result.card.cards.slice(0); + event.result.cards = cards; + var rcard = cards[0], + card; + if (rcard.name == name) card = get.autoViewAs(rcard); + else card = get.autoViewAs({ name, isCard: true }); + event.result.card = card; + }, + filterCard: function () { + return false; + }, + selectCard: -1, + }, + hongyuan: { + trigger: { player: "phaseDrawBegin2" }, + direct: true, + audio: 2, + filter: function (event, player) { + return !event.numFixed && event.num > 0; + }, + content: function () { + "step 0"; + var check; + if (player.countCards("h") == 0) { + check = false; + } else { + check = + game.countPlayer(function (current) { + return player != current && get.attitude(player, current) > 1; + }) >= 2; + } + if (get.is.versus()) { + event.versus = true; + player.chooseBool(get.prompt2("hongyuan")).ai = function () { + return ( + game.countPlayer(function (current) { + return player.side == current.side; + }) > 2 + ); + }; + } else { + player + .chooseTarget( + get.prompt2("hongyuan"), + [1, 2], + function (card, player, target) { + return player != target; + }, + function (target) { + if (!_status.event.check) return 0; + return get.attitude(_status.event.player, target); + } + ) + .set("check", check); + } + "step 1"; + if (result.bool) { + var targets; + if (event.versus) { + targets = game.filterPlayer(function (current) { + return current != player && current.side == player.side; + }); + } else { + targets = result.targets; + } + player.logSkill("hongyuan", targets); + game.asyncDraw(targets); + trigger.num--; + } + }, + }, + huanshi: { + audio: 2, + trigger: { global: "judge" }, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) <= 0) return false; + var cards = player.getCards("he"); + var judge = event.judge(event.player.judging[0]); + for (var i = 0; i < cards.length; i++) { + var judge2 = event.judge(cards[i]); + if (judge2 > judge) return true; + if (_status.currentPhase != player && judge2 == judge && get.color(cards[i]) == "red" && get.useful(cards[i]) < 5) return true; + } + return false; + }, + content: function () { + "step 0"; + var target = trigger.player; + var judge = trigger.judge(target.judging[0]); + var attitude = get.attitude(target, player); + target + .choosePlayerCard("请选择代替判定的牌", "he", "visible", true, player) + .set("ai", function (button) { + var card = button.link; + var judge = _status.event.judge; + var attitude = _status.event.attitude; + var result = trigger.judge(card) - judge; + var player = _status.event.player; + if (result > 0) { + return 20 + result; + } + if (result == 0) { + if (_status.currentPhase == player) return 0; + if (attitude >= 0) { + return get.color(card) == "red" ? 7 : 0 - get.value(card); + } else { + return get.color(card) == "black" ? 10 : 0 + get.value(card); + } + } + if (attitude >= 0) { + return get.color(card) == "red" ? 0 : -10 + result; + } else { + return get.color(card) == "black" ? 0 : -10 + result; + } + }) + .set("filterButton", function (button) { + var player = _status.event.target; + var card = button.link; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("judge", judge) + .set("attitude", attitude); + "step 1"; + if (result.bool) { + event.card = result.links[0]; + player.respond(event.card, "highlight", "noOrdering").nopopup = true; + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = event.card; + trigger.orderingCards.add(event.card); + game.log(trigger.player, "的判定牌改为", event.card); + game.delay(2); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + mingzhe: { + audio: 2, + trigger: { + player: ["useCard", "respond", "loseAfter"], + global: "loseAsyncAfter", + }, + frequent: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (event.name.indexOf("lose") != 0) return get.color(event.card) == "red"; + if (event.type != "discard") return false; + var evt = event.getl(player); + if (evt && evt.cards2) { + for (var i = 0; i < evt.cards2.length; i++) { + if (get.color(evt.cards2[i], player) == "red") return true; + } + } + return false; + }, + content: function () { + "step 0"; + event.count = 1; + if (trigger.name.indexOf("lose") == 0) { + event.count = 0; + var evt = trigger.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (get.color(evt.cards2[i], player) == "red") event.count++; + } + } + "step 1"; + player.draw(); + event.count--; + "step 2"; + if (event.count && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { + player.chooseBool(get.prompt2("mingzhe")).set("frequentSkill", event.name); + } else event.finish(); + "step 3"; + if (result.bool) { + player.logSkill("mingzhe"); + event.goto(1); + } + }, + ai: { + threaten: 0.7, + }, + }, + + duwu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.hasSkill("duwu2") == false && + game.hasPlayer(function (current) { + return current.hp > 0 && current.hp <= player.countCards("he") && player.inRange(current); + }) + ); + }, + 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.hp > 0 && player.inRange(target) && ui.selected.cards.length == target.hp; + }, + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current != player && current.hp > 0 && player.inRange(current) && ui.selected.cards.length == current.hp && 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 () { + player.addTempSkill("duwu3"); + target.damage("nocard"); + }, + ai: { + damage: true, + order: 2, + result: { + target: function (player, target) { + return get.damageEffect(target, player); + }, + }, + threaten: 1.5, + expose: 0.3, + }, + }, + duwu2: { charlotte: true }, + duwu3: { + trigger: { global: "dyingAfter" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.player.isIn() && event.reason && event.reason.getParent().name == "duwu"; + }, + content: function () { + player.loseHp(); + player.addTempSkill("duwu2"); + }, + }, + yicong: { + trigger: { + player: ["changeHp"], + }, + audio: 2, + audioname: ["re_gongsunzan"], + forced: true, + filter: function (event, player) { + return get.sgn(player.hp - 2.5) != get.sgn(player.hp - 2.5 - event.num); + }, + content: function () {}, + mod: { + globalFrom: function (from, to, current) { + if (from.hp > 2) return current - 1; + }, + globalTo: function (from, to, current) { + if (to.hp <= 2) return current + 1; + }, + }, + ai: { + threaten: 0.8, + }, + }, + yongsi: { + audio: 2, + group: ["yongsi1", "yongsi2"], + locked: true, + ai: { + threaten: 3.2, + }, + }, + yongsi1: { + audio: true, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num += game.countGroup(); + }, + }, + yongsi2: { + audio: true, + trigger: { player: "phaseDiscardBegin" }, + forced: true, + content: function () { + player.chooseToDiscard(game.countGroup(), "he", true); + }, + }, + bifa: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: true, + filterTarget: function (card, player, target) { + return player != target && !target.getExpansions("bifa2").length; + }, + ai1: function (card) { + return 7 - get.value(card); + }, + ai2: function (target) { + var num = target.hasSkillTag("maixie") ? 2 : 0; + return -get.attitude(_status.event.player, target) - num; + }, + prompt: get.prompt2("bifa"), + }); + "step 1"; + if (result.bool) { + event.forceDie = true; + var target = result.targets[0]; + event.target = target; + player.logSkill("bifa", result.targets[0]); + event.card = result.cards[0]; + target.storage.bifa2 = [result.cards[0], player]; + if (!_status.connectMode && player.isUnderControl(true)) player.$giveAuto(result.cards[0], target, false); + else player.$give(1, target, false); + target.addToExpansion(result.cards[0]).gaintag.add("bifa2"); + } else event.finish(); + "step 2"; + if (target.getExpansions("bifa2").includes(card)) { + target.addSkill("bifa2"); + } else delete target.storage.bifa2; + }, + ai: { + threaten: 1.7, + expose: 0.3, + }, + }, + bifa2: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + charlotte: true, + audio: false, + filter: function (event, player) { + return player.storage.bifa2 && player.getExpansions("bifa2").includes(player.storage.bifa2[0]); + }, + content: function () { + "step 0"; + if (player.storage.bifa2[1].isIn() && player.countCards("h")) { + player + .chooseCard(get.translation(player.storage.bifa2[1]) + "的笔伐牌为:", function (card) { + return get.type(card, "trick") == _status.event.type; + }) + .set("ai", function (card) { + return 8 - get.value(card); + }) + .set("type", get.type(player.storage.bifa2[0], "trick")) + .set("promptx", [[player.storage.bifa2[0]], "请交给其一张与此牌类别相同的手牌,否则失去1点体力"]); + } else { + event.directfalse = true; + } + "step 1"; + if (result.bool && !event.directfalse) { + player.give(result.cards, player.storage.bifa2[1]); + player.gain(player.storage.bifa2[0], "draw"); + } else { + player.loseHp(); + } + "step 2"; + player.removeSkill("bifa2"); + }, + marktext: "檄", + intro: { + markcount: () => 1, + name: "笔伐", + content: "已成为〖笔伐〗的目标", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + delete player.storage[skill]; + }, + }, + songci: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.storage.songci) return true; + return game.hasPlayer(function (current) { + return !player.storage.songci.includes(current); + }); + }, + init: function (player) { + if (!player.storage.songci) player.storage.songci = []; + }, + filterTarget: function (card, player, target) { + return !player.storage.songci || !player.storage.songci.includes(target); + }, + content: function () { + if (target.countCards("h") > target.hp) { + target.chooseToDiscard(2, "he", true); + } else { + target.draw(2); + } + if (!player.storage.songci) player.storage.songci = []; + player.storage.songci.push(target); + player.storage.songci.sortBySeat(); + player.markSkill("songci"); + }, + intro: { + content: "已对$发动过〖颂词〗", + }, + ai: { + order: 7, + threaten: 1.6, + expose: 0.2, + result: { + target: function (player, target) { + if (target.countCards("h") <= target.hp) { + return 1; + } else if (target.countCards("h") > target.hp) { + return -1; + } + }, + }, + }, + group: "songci_draw", + }, + songci_draw: { + audio: "songci", + trigger: { player: "phaseDiscardEnd" }, + forced: true, + filter: function (event, player) { + if (!player.storage.songci) return false; + return !game.hasPlayer(function (current) { + return !player.storage.songci.includes(current); + }); + }, + content: function () { + player.draw(); + }, + }, + baobian: { + audio: 2, + trigger: { player: ["phaseBefore", "changeHp"] }, + forced: true, + popup: false, + init: function (player) { + if (game.online) return; + player.removeAdditionalSkill("baobian"); + var list = []; + if (player.hp <= 3) { + //if(trigger.num!=undefined&&trigger.num<0&&player.hp-trigger.num>1) player.logSkill('baobian'); + list.push("oltiaoxin"); + } + if (player.hp <= 2) { + list.push("olpaoxiao"); + } + if (player.hp <= 1) { + list.push("xinshensu"); + } + if (list.length) { + player.addAdditionalSkill("baobian", list); + } + }, + derivation: ["oltiaoxin", "olpaoxiao", "xinshensu"], + content: function () { + player.removeAdditionalSkill("baobian"); + var list = []; + if (player.hp <= 3) { + if (trigger.num != undefined && trigger.num < 0 && player.hp - trigger.num > 1) player.logSkill("baobian"); + list.push("oltiaoxin"); + } + if (player.hp <= 2) { + list.push("olpaoxiao"); + } + if (player.hp <= 1) { + list.push("xinshensu"); + } + if (list.length) { + player.addAdditionalSkill("baobian", list); + } + }, + ai: { + maixie: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0, 1]; + } + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, + }, + }, + }, + chongzhen: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + if (event.card.name != "sha" && event.card.name != "shan") return false; + if (!event.skill || event.skill.indexOf("fanghun") + event.skill.indexOf("longdan") == -2) return false; + var target = lib.skill.chongzhen.logTarget(event, player); + return target && target.countGainableCards(player, "h") > 0; + }, + logTarget: function (event, player) { + if (event.name == "respond") return event.source; + if (event.card.name == "sha") return event.targets[0]; + return event.respondTo[0]; + }, + prompt2: function (event, player) { + var target = lib.skill.chongzhen.logTarget(event, player); + return "获得" + get.translation(target) + "的一张手牌"; + }, + content: function () { + var target = lib.skill.chongzhen.logTarget(trigger, player); + player.gainPlayerCard(target, "h", true); + }, + ai: { + combo: "ollongdan", + mingzhi: false, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") || get.tag(card, "respondSha")) { + if (get.attitude(target, player) <= 0) { + if (current > 0) return; + if (target.countCards("h") == 0) return 1.6; + if (target.countCards("h") == 1) return 1.2; + if (target.countCards("h") == 2) return [0.8, 0.2, 0, -0.2]; + return [0.4, 0.7, 0, -0.7]; + } + } + }, + }, + }, + }, + lihun: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.hasSex("male"); + }, + filterCard: true, + position: "he", + content: function () { + player.gainPlayerCard(target, true, "h", target.countCards("h")); + player.turnOver(); + player.addSkill("lihun2"); + player.storage.lihun = target; + }, + check: function (card) { + return 8 - get.value(card); + }, + ai: { + order: 10, + result: { + player: function (player) { + if (player.classList.contains("turnedover")) return 10; + return 0; + }, + target: function (player, target) { + if (target.countCards("h") > target.hp) return target.hp - target.countCards("h"); + return 0; + }, + }, + threaten: 1.5, + effect: { + target: function (card) { + if (card.name == "guiyoujie") return [0, 2]; + }, + }, + }, + }, + lihun2: { + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + audio: false, + content: function () { + "step 0"; + var cards = player.getCards("he"); + player.removeSkill("lihun2"); + if (player.storage.lihun.classList.contains("dead") || player.storage.lihun.hp <= 0 || cards.length == 0) { + event.finish(); + } else { + if (cards.length < player.storage.lihun.hp) event._result = { bool: true, cards: cards }; + else player.chooseCard("he", true, player.storage.lihun.hp, "离魂:选择要交给" + get.translation(player.storage.lihun) + "的牌"); + } + "step 1"; + player.give(result.cards, player.storage.lihun); + }, + }, + yuanhu: { + audio: 3, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: function (card) { + return get.type(card) == "equip"; + }, + position: "he", + filterTarget: function (card, player, target) { + return target.canEquip(card); + }, + ai1: function (card) { + return 6 - get.value(card); + }, + ai2: function (target) { + return get.attitude(_status.event.player, target) - 3; + }, + prompt: get.prompt2("yuanhu"), + }); + "step 1"; + if (result.bool) { + player.logSkill("yuanhu", result.targets); + var thisTarget = result.targets[0]; + var thisCard = result.cards[0]; + thisTarget.equip(thisCard); + event.target = thisTarget; + if (thisTarget != player) { + player.$give(thisCard, thisTarget, false); + } + switch (get.subtype(thisCard)) { + case "equip1": { + if ( + !game.hasPlayer(function (current) { + return get.distance(thisTarget, current) <= 1; + }) + ) { + event.finish(); + return; + } + game.delay(); + player + .chooseTarget(true, function (card, player, target) { + return get.distance(_status.event.thisTarget, target) <= 1 && target.countCards("hej"); + }) + .set("ai", function (target) { + var attitude = get.attitude(_status.event.player, target); + if (attitude > 0 && target.countCards("j")) { + return attitude * 1.5; + } + return -attitude; + }) + .set("thisTarget", thisTarget); + return; + } + case "equip2": { + thisTarget.draw(); + event.finish(); + return; + } + case "equip5": { + event.finish(); + return; + } + default: { + thisTarget.recover(); + event.finish(); + return; + } + } + } else { + event.finish(); + } + "step 2"; + if (result.targets.length) { + player.discardPlayerCard(true, result.targets[0], "hej"); + } + }, + }, + tianming: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + check: function (event, player) { + var cards = player.getCards("h"); + if (cards.length <= 2) { + for (var i = 0; i < cards.length; i++) { + if (cards[i].name == "shan" || cards[i].name == "tao") return false; + } + } + return true; + }, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + player.chooseToDiscard(2, true, "he"); + player.draw(2); + var players = game.filterPlayer(); + players.sort(function (a, b) { + return b.hp - a.hp; + }); + if (players[0].hp > players[1].hp && players[0] != player) { + players[0].chooseBool(get.prompt2("tianming")); + event.player = players[0]; + } else { + event.finish(); + } + "step 1"; + if (result.bool) { + player.chooseToDiscard(2, true, "he"); + player.draw(2); + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha") return [1, 0.5]; + }, + }, + }, + }, + mizhao: { + enable: "phaseUse", + usable: 1, + audio: 2, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + selectCard: -1, + filterTarget: function (card, player, target) { + return player != target; + }, + discard: false, + lose: false, + delay: false, + ai: { + order: 1, + result: { + player: 0, + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (player.countCards("h") > 1) { + return 1; + } + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].countCards("h") && players[i] != target && players[i] != player && get.attitude(player, players[i]) < 0) { + break; + } + } + if (i == players.length) { + return 1; + } + return -2 / (target.countCards("h") + 1); + }, + }, + }, + content: function () { + "step 0"; + event.target1 = targets[0]; + player.give(cards, targets[0], "giveAuto"); + "step 1"; + if (!targets[0].countCards("h")) { + event.finish(); + return; + } + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != event.target1 && players[i] != player && event.target1.canCompare(players[i])) { + break; + } + } + if (i == players.length) { + event.finish(); + } + "step 2"; + player + .chooseTarget(true, "选择拼点目标", function (card, player, target) { + return _status.event.target1.canCompare(target) && target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + var eff = get.effect(target, { name: "sha" }, _status.event.target1, player); + var att = get.attitude(player, target); + if (att > 0) { + return eff - 10; + } + return eff; + }) + .set("target1", event.target1) + .set("forceDie", true); + "step 3"; + if (result.targets.length) { + event.target2 = result.targets[0]; + event.target1.line(event.target2); + event.target1.chooseToCompare(event.target2); + } else { + event.finish(); + } + "step 4"; + if (!result.tie) { + if (result.bool) { + if (event.target1.canUse({ name: "sha", isCard: true }, event.target2, false)) event.target1.useCard({ name: "sha", isCard: true }, event.target2); + } else if (event.target2.canUse({ name: "sha", isCard: true }, event.target1, false)) { + event.target2.useCard({ name: "sha", isCard: true }, event.target1); + } + } + }, + }, + gongao: { + audio: 2, + trigger: { global: "dieAfter" }, + forced: true, + content: function () { + player.gainMaxHp(); + player.recover(); + }, + ai: { + threaten: 1.5, + }, + }, + juyi: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + derivation: ["benghuai", "weizhong"], + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.maxHp > game.countPlayer() && !player.storage.juyi; + }, + forced: true, + unique: true, + juexingji: true, + content: function () { + player.awakenSkill("juyi"); + player.draw(player.maxHp); + player.addSkills(["benghuai", "weizhong"]); + }, + }, + weizhong: { + audio: 2, + trigger: { player: ["gainMaxHpEnd", "loseMaxHpEnd"] }, + forced: true, + content: function () { + player.draw(player.isMinHandcard() ? 2 : 1); + }, + }, + kuangfu: { + trigger: { source: "damageSource" }, + audio: 2, + filter: function (event) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.player.countCards("e"); + }, + logTarget: "player", + preHidden: true, + check: function (event, player) { + return get.attitude(player, event.player) <= 0; + }, + content: function () { + "step 0"; + var neg = get.attitude(player, trigger.player) <= 0; + player + .choosePlayerCard("e", trigger.player) + .set("ai", function (button) { + if (_status.event.neg) { + return get.buttonValue(button); + } + return 0; + }) + .set("neg", neg); + "step 1"; + if (result.bool) { + event.card = result.links[0]; + if (player.canEquip(event.card)) { + player.chooseBool("是否将" + get.translation(event.card) + "置入自己的装备区?").ai = function () { + return true; + }; + } else event._result = { bool: false }; + } else event.finish(); + "step 2"; + if (result.bool) { + trigger.player.$give(event.card, player, false); + player.equip(event.card); + } else trigger.player.discard(event.card); + }, + }, + xinfu_lingren: { + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + filter: function (event, player) { + if (event.getParent().triggeredTargets3.length > 1) return false; + if (!["basic", "trick"].includes(get.type(event.card))) return false; + if (get.tag(event.card, "damage")) return true; + return false; + }, + usable: 1, + direct: true, + derivation: ["lingren_jianxiong", "lingren_xingshang"], + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("xinfu_lingren"), "选择一名目标角色并猜测其手牌构成", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return 2 - get.attitude(_status.event.player, target); + }) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + player.logSkill("xinfu_lingren", result.targets); + var target = result.targets[0]; + event.target = target; + event.choice = { + basic: false, + trick: false, + equip: false, + }; + player.chooseButton(["凌人:猜测其有哪些类别的手牌", [["basic", "trick", "equip"], "vcard"]], [0, 3], true).set("ai", function (button) { + switch (button.link[2]) { + case "basic": + var rand = 0.95; + if (!target.countCards("h", { type: ["basic"] })) rand = 0.05; + if (!target.countCards("h")) rand = 0; + return Math.random() < rand ? true : false; + case "trick": + var rand = 0.9; + if (!target.countCards("h", { type: ["trick", "delay"] })) rand = 0.1; + if (!target.countCards("h")) rand = 0; + return Math.random() < rand ? true : false; + case "equip": + var rand = 0.75; + if (!target.countCards("h", { type: ["equip"] })) rand = 0.25; + if (!target.countCards("h")) rand = 0; + return Math.random() < rand ? true : false; + } + }); + } else { + player.storage.counttrigger.xinfu_lingren--; + event.finish(); + } + "step 2"; + if (result.bool) { + var choices = result.links.map(i => i[2]); + if (!event.isMine() && !event.isOnline()) game.delayx(); + var list = []; + event.num = 0; + ["basic", "trick", "equip"].forEach(type => { + if (choices.includes(type) == target.hasCard({ type: type }, "h")) event.num++; + }); + } + "step 3"; + player.popup("猜对" + get.cnNumber(event.num) + "项"); + game.log(player, "猜对了" + get.cnNumber(event.num) + "项"); + if (event.num > 0) { + target.addTempSkill("lingren_adddamage"); + target.storage.lingren = { + card: trigger.card, + //player:event.targett, + }; + } + if (event.num > 1) player.draw(2); + if (event.num > 2) { + player.addTempSkills(["lingren_jianxiong", "lingren_xingshang"], { + player: "phaseBegin", + }); + } + }, + ai: { + threaten: 2.4, + }, + }, + lingren_adddamage: { + onremove: function (player) { + delete player.storage.lingren; + }, + trigger: { + player: "damageBegin3", + }, + filter: function (event, player) { + var info = player.storage.lingren; + return event.card && event.card == info.card; + }, + silent: true, + popup: false, + forced: true, + charlotte: true, + content: function () { + trigger.num++; + }, + }, + lingren_jianxiong: { + audio: 1, + trigger: { + player: "damageEnd", + }, + content: function () { + "step 0"; + if (get.itemtype(trigger.cards) == "cards" && get.position(trigger.cards[0], true) == "o") { + player.gain(trigger.cards, "gain2"); + } + player.draw("nodelay"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target) return [1, 0.6]; + }, + }, + }, + }, + lingren_xingshang: { + audio: 1, + inherit: "rexingshang", + }, + xinfu_fujian: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + filter: function (event, player) { + return !game.hasPlayer(function (current) { + return current.countCards("h") == 0; + }); + }, + forced: true, + content: function () { + event.num = 0; + var list = game.filterPlayer(function (target) { + if (target.isMinHandcard()) event.num = target.countCards("h"); + return player != target; + }); + if (event.num < 1) { + event.finish(); + } else { + var target = list.randomGet(); + var cards = target.getCards("h").randomGets(event.num); + player.line(target); + var content = [get.translation(target) + "的部分手牌", cards]; + game.log(player, "观看了", target, "的部分手牌"); + player.chooseControl("ok").set("dialog", content); + } + }, + }, + fujian: { + audio: "xinfu_fujian", + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + filter(event, player) { + return game.hasPlayer(target => target != player && target.countCards("h") && !target.isMaxHandcard()); + }, + forced: true, + async content(event, trigger, player) { + const target = game + .filterPlayer(target => { + return target != player && target.countCards("h") && !target.isMaxHandcard(); + }) + .randomGet(); + player.line(target); + game.log(player, "观看了", target, "的手牌"); + player.viewHandcards(target); + }, + }, + xinfu_xionghuo: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countMark("xinfu_xionghuo") > 0; + }, + filterTarget: function (card, player, target) { + return player != target && !target.hasMark("xinfu_xionghuo"); + }, + content: function () { + player.removeMark("xinfu_xionghuo", 1); + target.addMark("xinfu_xionghuo", 1); + }, + ai: { + order: 11, + result: { + target: function (player, target) { + if ( + (player.countMark("xinfu_xionghuo") >= 2 || + !game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) < 0 && current.hasMark("xinfu_xionghuo"); + })) && + player.countCards("h", function (card) { + return ( + get.tag(card, "damage") && + player.canUse(card, target, null, true) && + player.getUseValue(card) > 0 && + get.effect_use(target, card, player) > 0 && + target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ); + }) + ) + return 3 / Math.max(1, target.hp); + if ( + (!player.hasUnknown() && + game.countPlayer(function (current) { + return get.attitude(player, current) < 0; + }) <= 1) || + player.countMark("xinfu_xionghuo") >= 2 + ) { + return -1; + } + return 0; + }, + }, + effect: { + player: function (card, player, target) { + if ( + player != target && + get.tag(card, "damage") && + target && + target.hasMark("xinfu_xionghuo") && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ) + return [1, 0, 1, -2]; + }, + }, + threaten: 1.6, + }, + marktext: "戾", + intro: { + name: "暴戾", + content: "mark", + }, + group: ["xinfu_xionghuo_init", "xinfu_xionghuo_damage", "xinfu_xionghuo_effect"], + subSkill: { + init: { + audio: "xinfu_xionghuo", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter: function (event, player) { + if (player.countMark("xinfu_xionghuo") >= 3) return false; + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + locked: false, + content: function () { + player.addMark("xinfu_xionghuo", 3 - player.countMark("xinfu_xionghuo")); + }, + }, + damage: { + audio: "xinfu_xionghuo", + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return event.player.countMark("xinfu_xionghuo") > 0 && event.player != player; + }, + forced: true, + locked: false, + logTarget: "player", + content: function () { + trigger.num++; + }, + }, + effect: { + audio: "xinfu_xionghuo", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player.countMark("xinfu_xionghuo") > 0 && event.player != player; + }, + line: false, + forced: true, + locked: false, + logTarget: "player", + content: function () { + "step 0"; + trigger.player.removeMark("xinfu_xionghuo", trigger.player.countMark("xinfu_xionghuo")); + "step 1"; + var num = get.rand(0, 2); + switch (num) { + case 0: { + player.line(trigger.player, "fire"); + trigger.player.damage("fire"); + trigger.player.addTempSkill("xinfu_xionghuo_disable"); + trigger.player.markAuto("xinfu_xionghuo_disable", [player]); + break; + } + case 1: { + player.line(trigger.player, "water"); + trigger.player.loseHp(); + trigger.player.addMark("xinfu_xionghuo_low", 1, false); + trigger.player.addTempSkill("xinfu_xionghuo_low"); + break; + } + case 2: { + player.line(trigger.player, "green"); + /* + var card1=trigger.player.getCards('h').randomGet(); + var card2=trigger.player.getCards('e').randomGet(); + var list=[]; + if(card1) list.push(card1); + if(card2) list.push(card2); + if(list.length) player.gain(list,trigger.player,'giveAuto','bySelf'); + */ + const cards = trigger.player.getGainableCards(player, "he"); + if (cards.length) player.gain(cards.randomGets(2), trigger.player, "giveAuto", "bySelf"); + break; + } + } + "step 2"; + game.delay(); + }, + }, + disable: { + mod: { + playerEnabled: function (card, player, target) { + if (card.name == "sha" && player.getStorage("xinfu_xionghuo_disable").includes(target)) return false; + }, + }, + charlotte: true, + onremove: true, + mark: true, + marktext: "禁", + intro: { content: "不能对$使用【杀】" }, + }, + low: { + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("xinfu_xionghuo_low"); + }, + }, + charlotte: true, + onremove: true, + mark: true, + marktext: "减", + intro: { content: "手牌上限-#" }, + }, + }, + }, + xinfu_shajue: { + audio: 2, + trigger: { global: "dying" }, + filter: function (event, player) { + if (event.player == player) return false; + const bool1 = !player.hasSkill("xinfu_xionghuo") || player.countMark("xinfu_xionghuo") < 3; + const bool2 = event.player.hp < 0 && get.itemtype(event.parent.cards) == "cards" && event.parent.cards.some(card => get.position(card, true) == "o"); + return bool1 || bool2; + }, + forced: true, + content: function () { + if (!player.hasSkill("xinfu_xionghuo") || player.countMark("xinfu_xionghuo") < 3) player.addMark("xinfu_xionghuo", 1); + if (trigger.player.hp < 0 && get.itemtype(trigger.parent.cards) == "cards" && trigger.parent.cards.some(card => get.position(card, true) == "o")) { + player.gain( + trigger.parent.cards.filter(card => get.position(card, true) == "o"), + "gain2" + ); + } + }, + }, + xinfu_jianjie: { audio: 3 }, + jianjie: { + group: ["jianjie_use", "jianjie_die"], + derivation: ["jianjie_huoji", "jianjie_lianhuan", "jianjie_yeyan"], + audio: "xinfu_jianjie", + trigger: { + player: "phaseZhunbeiBegin", + }, + forced: true, + locked: false, + filter: function (event, player) { + return player.phaseNumber <= 1 && game.hasPlayer(current => current != player); + }, + content: function () { + "step 0"; + player.chooseTarget("荐杰:选择一名其他角色获得“龙印”", lib.filter.notMe, true).set("ai", target => { + return get.attitude(get.player(), target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + lib.skill.jianjie.addMark("huoji", player, target); + event.target = target; + game.delayx(); + } else event.finish(); + "step 2"; + if ( + game.hasPlayer(current => { + return current != player && current != target; + }) + ) { + player + .chooseTarget( + "荐杰:选择一名其他角色获得“凤印”", + function (card, player, target) { + return target != player && target != _status.event.getParent().target; + }, + true + ) + .set("ai", target => { + return get.attitude(get.player(), target); + }); + } else event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); + lib.skill.jianjie.addMark("lianhuan", player, target); + game.delayx(); + } + }, + ai: { + threaten: 3, + }, + hasMark: (mark, player, target) => { + if (!target) return player.getStorage("jianjie_" + mark).length > 0; + return target.getStorage("jianjie_" + mark).includes(player); + }, + addMark: (mark, player, target) => { + mark = "jianjie_" + mark; + target.addAdditionalSkill(`${mark}_${player.playerid}`, mark); + target.markAuto(mark, [player]); + game.log(player, "令", target, "获得了", `#g“${mark == "jianjie_huoji" ? "龙印" : "凤印"}”`); + }, + removeMark: (mark, player, target, log) => { + if (lib.skill.jianjie.hasMark(mark, player, target, log)) { + mark = "jianjie_" + mark; + target.removeAdditionalSkill(`${mark}_${player.playerid}`); + target.unmarkAuto(mark, [player]); + if (log) game.log(target, "移去了", player, "给予的", `#g“${mark == "jianjie_huoji" ? "龙印" : "凤印"}”`); + else game.log(player, "移去了", target, "的", `#g“${mark == "jianjie_huoji" ? "龙印" : "凤印"}”`); + } + }, + subSkill: { + use: { + audio: "xinfu_jianjie", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.phaseNumber <= 1) return false; + const skill = lib.skill.jianjie; + return game.hasPlayer(function (current) { + return skill.hasMark("huoji", player, current) || skill.hasMark("lianhuan", player, current); + }); + }, + filterTarget: function (card, player, target) { + if (ui.selected.targets.length == 0) { + const skill = lib.skill.jianjie; + return skill.hasMark("huoji", player, target) || skill.hasMark("lianhuan", player, target); + } + return true; + }, + selectTarget: 2, + complexSelect: true, + complexTarget: true, + multitarget: true, + prompt: "移动场上的“龙印”或“凤印”", + targetprompt: ["失去印", "获得印"], + content: function () { + "step 0"; + var skill = lib.skill.jianjie; + var bool1 = skill.hasMark("huoji", player, targets[0]), + bool2 = skill.hasMark("lianhuan", player, targets[0]); + if (bool1 && bool2) { + player.chooseControl("龙印", "凤印").set("prompt", "选择要移动的“印”"); + } else { + event._result = { control: bool1 ? "龙印" : "凤印" }; + } + "step 1"; + var skill = lib.skill.jianjie, + mark = result.control == "龙印" ? "huoji" : "lianhuan"; + skill.removeMark(mark, player, targets[0]); + skill.addMark(mark, player, targets[1]); + game.delayx(); + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if (ui.selected.targets.length == 0) { + return get.attitude(player, target) < 0 ? -999 : -3; + } else { + return target.countCards("h") + 1; + } + }, + }, + expose: 0.4, + }, + }, + die: { + audio: "xinfu_jianjie", + trigger: { global: "die" }, + filter: function (event, player) { + const skill = lib.skill.jianjie; + return skill.hasMark("huoji", player, event.player) || skill.hasMark("lianhuan", player, event.player); + }, + forced: true, + logTarget: "player", + content: function () { + "step 0"; + if (lib.skill.jianjie.hasMark("huoji", player, trigger.player)) { + player.chooseTarget("荐杰:选择一名角色获得“龙印”", true).set("ai", target => { + return get.attitude(get.player(), target); + }); + } else event.goto(2); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + lib.skill.jianjie.addMark("huoji", player, target); + event.target = target; + game.delayx(); + } else event.finish(); + "step 2"; + if (lib.skill.jianjie.hasMark("lianhuan", player, trigger.player)) { + player.chooseTarget("荐杰:选择一名角色获得“凤印”", true).set("ai", target => { + return get.attitude(get.player(), target); + }); + } else event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); + lib.skill.jianjie.addMark("lianhuan", player, target); + game.delayx(); + } + }, + }, + huoji: { + marktext: "龙", + intro: { + name: "龙印", + content: "
  • 出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。
  • 若你同时拥有“凤印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", + }, + inherit: "rehuoji", + usable: 3, + charlotte: true, + viewAsFilter: function (player) { + const storage = player.getStorage("jianjie_huoji"); + if ( + !storage.some(source => { + return source.isIn() && source.hasSkill("jianjie"); + }) + ) + return false; + return player.hasCard(card => get.color(card) == "red", "she"); + }, + group: ["jianjie_yeyan", "jianjie_huoji_effect"], + }, + huoji_effect: { + trigger: { player: "huogongBegin" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.skill == "jianjie_huoji"; + }, + content: function () { + trigger.setContent(lib.skill.olhuoji.huogongContent); + }, + }, + lianhuan: { + marktext: "凤", + intro: { + name: "凤印", + content: "
  • 出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。
  • 若你同时拥有“龙印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", + }, + charlotte: true, + usable: 3, + filter: function (event, player) { + const storage = player.getStorage("jianjie_lianhuan"); + if ( + !storage.some(source => { + return source.isIn() && source.hasSkill("jianjie"); + }) + ) + return false; + if (!player.hasCard(card => get.suit(card) == "club", "she")) return false; + return event.type == "phase" || event.filterCard({ name: "tiesuo" }, player, event); + }, + inherit: "ollianhuan", + group: ["jianjie_yeyan", "jianjie_lianhuan_effect"], + }, + lianhuan_effect: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.skill != "jianjie_lianhuan") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(current => { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); + }) + ) + return true; + } + return false; + }, + charlotte: true, + forced: true, + popup: false, + content: function () { + "step 0"; + player + .chooseTarget("是否为" + get.translation(trigger.card) + "额外指定一个目标?", (card, player, target) => { + return !_status.event.sourcex.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("sourcex", trigger.targets) + .set("ai", function (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.delayex(); + } else event.finish(); + "step 2"; + if (result.bool) { + var targets = result.targets; + player.line(targets, "thunder"); + trigger.targets.addArray(targets); + game.log(targets, "也成为了", trigger.card, "的目标"); + } + }, + }, + yeyan: { + inherit: "yeyan", + filter: function (event, player) { + const huoji = player.getStorage("jianjie_huoji"), + lianhuan = player.getStorage("jianjie_lianhuan"); + return ( + huoji.length > 0 && + lianhuan.some(source => { + return huoji.includes(source) && source.isIn() && source.hasSkill("jianjie"); + }) + ); + }, + contentBefore: function () { + player.awakenSkill("jianjie_yeyan"); + var skill = lib.skill.jianjie; + var huoji = player.getStorage("jianjie_huoji").slice(0), + lianhuan = player.getStorage("jianjie_lianhuan").slice(0); + huoji.forEach(source => { + skill.removeMark("huoji", source, player, true); + }); + lianhuan.forEach(source => { + skill.removeMark("lianhuan", source, player, true); + }); + }, + }, + }, + }, + xinfu_yinshi: { + audio: 2, + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + const skill = lib.skill.jianjie; + if (skill.hasMark("huoji", player) || skill.hasMark("lianhuan", player)) return false; + if (!player.hasEmptySlot(2)) return false; + if (event.hasNature()) return true; + return get.type(event.card, "trick") == "trick"; + }, + content: function () { + trigger.cancel(); + }, + ai: { + notrick: true, + nofire: true, + nothunder: true, + effect: { + target: function (card, player, target, current) { + const skill = lib.skill.jianjie; + if (skill.hasMark("huoji", target) || skill.hasMark("lianhuan", target)) return false; + if (player == target && get.subtype(card) == "equip2") { + if (get.equipValue(card) <= 8) return 0; + } + if (!target.hasEmptySlot(2)) return; + if (get.tag(card, "natureDamage")) return "zerotarget"; + if (get.type(card) == "trick" && get.tag(card, "damage")) { + return "zeroplayertarget"; + } + }, + }, + }, + }, + xinfu_chenghao: { + audio: 2, + trigger: { + global: "damageEnd", + }, + filter: function (event, player) { + return event.lianhuanable == true && event.player.isIn(); + }, + frequent: true, + content: function () { + "step 0"; + event.cards = game.cardsGotoOrdering( + get.cards( + game.countPlayer(function (current) { + return current.isLinked(); + }) + 1 + ) + ).cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + "step 1"; + if (event.cards.length > 1) { + player.chooseCardButton("称好:请选择要分配的牌", true, event.cards, [1, event.cards.length]).set("ai", function (button) { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + } else if (event.cards.length == 1) { + event._result = { links: event.cards.slice(0), bool: true }; + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + event.cards.removeArray(result.links); + event.togive = result.links.slice(0); + player + .chooseTarget("选择一名角色获得" + get.translation(result.links), true) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + } + "step 3"; + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; + map[id].addArray(event.togive); + } + if (cards.length > 0) event.goto(1); + "step 4"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + list.push([source, event.given_map[i]]); + } + game.loseAsync({ + gain_list: list, + giver: player, + animate: "draw", + }).setContent("gaincardMultiple"); + }, + }, + xinfu_wuniang: { + trigger: { + player: ["useCard", "respond"], + }, + audio: 2, + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("xinfu_wuniang"), "获得一名其他角色的一张牌,然后其和场上所有的“关索”摸一张牌。", function (card, player, target) { + if (player == target) return false; + return target.countGainableCards(player, "he") > 0; + }) + .set("ai", function (target) { + return 10 - get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xinfu_wuniang", target); + player.line(target, "fire"); + event.draws = game.filterPlayer(function (current) { + if (current == target) return true; + return current.name == "guansuo" || current.name2 == "guansuo"; + }); + player.gainPlayerCard(target, "he", true); + } else event.finish(); + "step 2"; + game.asyncDraw(event.draws, 1); + game.delay(); + }, + }, + xinfu_xushen: { + derivation: ["xinfu_zhennan"], + audio: 2, + subSkill: { + count: { + trigger: { + player: "recoverBegin", + }, + forced: true, + silent: true, + popup: false, + filter: function (event, player) { + if (!event.card || event.card.name != "tao") return false; + if (!event.source || !event.source.hasSex("male")) return false; + if (!player.isDying()) return false; + if ( + game.hasPlayer(function (current) { + return current.name == "guansuo" || current.name2 == "guansuo"; + }) + ) + return false; + return true; + }, + content: function () { + trigger.xinfu_xushen = true; + }, + sub: true, + }, + }, + group: ["xinfu_xushen_count"], + trigger: { + player: "recoverAfter", + }, + limited: true, + init: function (player) { + player.storage.xinfu_xushen = false; + }, + filter: function (event, player) { + if (player.storage.xinfu_xushen) return false; + if (player.isDying()) return false; + return event.xinfu_xushen == true; + }, + direct: true, + skillAnimation: true, + animationColor: "fire", + content: function () { + "step 0"; + trigger.source.chooseBool("【许身】:是否将自己的一张武将牌替换为“关索”?").set("ai", function () { + return false; + }); + "step 1"; + if (result.bool) { + player.awakenSkill("xinfu_xushen"); + player.logSkill("xinfu_xushen", trigger.source); + if (trigger.source.name2 != undefined) { + trigger.source.chooseControl(trigger.source.name1, trigger.source.name2).set("prompt", "请选择要更换的武将牌"); + } else event._result = { control: trigger.source.name1 }; + } else event.finish(); + "step 2"; + trigger.source.reinitCharacter(result.control, "guansuo"); + player.recover(); + player.addSkills("xinfu_zhennan"); + }, + mark: true, + intro: { + content: "limited", + }, + }, + xinfu_falu: { + subSkill: { + spade: { + marktext: "♠︎️", + intro: { + name: "紫薇", + content: "mark", + }, + }, + heart: { + marktext: "♥︎️", + intro: { + name: "玉清", + content: "mark", + }, + }, + club: { + marktext: "♣︎️", + intro: { + name: "后土", + content: "mark", + }, + }, + diamond: { + marktext: "♦︎", + intro: { + name: "勾陈", + content: "mark", + }, + }, + }, + forced: true, + audio: 2, + trigger: { + player: ["loseAfter", "enterGame"], + global: ["loseAsyncAfter", "phaseBefore"], + }, + filter: function (event, player) { + if (event.name.indexOf("lose") != 0) return event.name != "phase" || game.phaseNumber == 0; + if (event.type != "discard" || event.getlx === false) return false; + var evt = event.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (!player.hasMark("xinfu_falu_" + get.suit(evt.cards2[i]))) return true; + } + return false; + }, + content: function () { + if (trigger.name.indexOf("lose") !== 0) { + for (var i = 0; i < lib.suit.length; i++) { + if (!player.hasMark("xinfu_falu_" + lib.suit[i])) player.addMark("xinfu_falu_" + lib.suit[i]); + } + return; + } + var evt = trigger.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + var suit = get.suit(evt.cards2[i]); + if (!player.hasMark("xinfu_falu_" + suit)) player.addMark("xinfu_falu_" + suit); + } + }, + ai: { + threaten: 1.4, + combo: "xinfu_zhenyi", + }, + }, + xinfu_dianhua: { + trigger: { + player: ["phaseZhunbeiBegin", "phaseJieshuBegin"], + }, + frequent: true, + audio: 2, + filter: function (event, player) { + for (var i = 0; i < lib.suit.length; i++) { + if (player.hasMark("xinfu_falu_" + lib.suit[i])) return true; + } + return false; + }, + content: function () { + "step 0"; + var num = 0; + for (var i = 0; i < lib.suit.length; i++) { + if (player.hasMark("xinfu_falu_" + lib.suit[i])) num++; + } + 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 target = _status.event.getTrigger().name == "phaseZhunbei" ? player : player.next; + var att = get.sgn(get.attitude(player, target)); + var top = []; + var judges = target.getCards("j"); + var stopped = false; + if (player != target || !target.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)) * att; + }); + if (judge(cards[0]) * att < 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)) * att; + }); + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) 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: { + combo: "xinfu_falu", + threaten: 2.2, + }, + }, + xinfu_zhenyi: { + group: ["zhenyi_spade", "zhenyi_club", "zhenyi_heart"], + trigger: { + player: "damageEnd", + }, + audio: 2, + filter: function (event, player) { + //if(!event.hasNature()) return false; + return player.hasMark("xinfu_falu_diamond"); + }, + prompt2: "弃置「勾陈♦」标记,从牌堆中获得每种类型的牌各一张。", + content: function () { + "step 0"; + player.removeMark("xinfu_falu_diamond"); + event.num = 0; + event.togain = []; + "step 1"; + var card = get.cardPile(function (card) { + for (var i = 0; i < event.togain.length; i++) { + if (get.type(card, "trick") == get.type(event.togain[i], "trick")) return false; + } + return true; + }); + if (card) { + event.togain.push(card); + event.num++; + if (event.num < 3) event.redo(); + } + "step 2"; + if (event.togain.length) { + player.gain(event.togain, "gain2"); + } + }, + ai: { + combo: "xinfu_falu", + }, + }, + zhenyi_spade: { + trigger: { + global: "judge", + }, + direct: true, + filter: function (event, player) { + return player.hasMark("xinfu_falu_spade"); + }, + content: function () { + "step 0"; + var str = get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + ",是否发动【真仪】,弃置「紫薇♠」标记并修改判定结果?"; + player + .chooseControl("spade", "heart", "diamond", "club", "cancel2") + .set("prompt", str) + .set("ai", function () { + //return '取消'; + var judging = _status.event.judging; + var trigger = _status.event.getTrigger(); + var res1 = trigger.judge(judging); + var list = lib.suit.slice(0); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0) return 0; + var getj = function (suit) { + return trigger.judge({ + name: get.name(judging), + nature: get.nature(judging), + suit: suit, + number: 5, + }); + }; + list.sort(function (a, b) { + return (getj(b) - getj(a)) * get.sgn(attitude); + }); + if ((getj(list[0]) - res1) * attitude > 0) return list[0]; + return "cancel2"; + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.control != "cancel2") { + player.addExpose(0.25); + player.removeMark("xinfu_falu_spade"); + player.logSkill("xinfu_zhenyi", trigger.player); + //player.line(trigger.player); + player.popup(result.control); + game.log(player, "将判定结果改为了", "#y" + get.translation(result.control + 2) + 5); + trigger.fixedResult = { + suit: result.control, + color: get.color({ suit: result.control }), + number: 5, + }; + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + expose: 0.5, + }, + }, + zhenyi_club: { + audio: "xinfu_zhenyi", + enable: "chooseToUse", + viewAsFilter: function (player) { + if (player == _status.currentPhase) return false; + return player.hasMark("xinfu_falu_club") && player.countCards("hs") > 0; + }, + filterCard: true, + position: "hs", + viewAs: { + name: "tao", + }, + prompt: "弃置「后土♣」标记,将一张手牌当桃使用", + check: function (card) { + return 15 - get.value(card); + }, + precontent: function () { + player.removeMark("xinfu_falu_club"); + }, + }, + zhenyi_heart: { + trigger: { + source: "damageBegin1", + }, + audio: "xinfu_zhenyi", + filter: function (event, player) { + return player.hasMark("xinfu_falu_heart"); + }, + check: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if ( + event.player.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) + ) + return false; + return true; + //return player.hasMark('xinfu_falu_spade')||get.color(ui.cardPile.firstChild)=='black'; + }, + prompt2: function (event) { + return "弃置「玉清♥」标记,令对" + get.translation(event.player) + "即将造成的伤害+1。"; + }, + logTarget: "player", + content: function () { + player.removeMark("xinfu_falu_heart"); + trigger.num++; + }, + }, + xinfu_zhennan: { + audio: 2, + trigger: { + target: "useCardToTargeted", + }, + filter: function (event, player) { + return event.card.name == "nanman"; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("xinfu_zhennan"), "对一名其他角色造成1-3点随机伤害", function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool && result.targets && result.targets.length) { + game.delay(); + player.logSkill("xinfu_zhennan", result.targets); + var num = [1, 2, 3, 1, 1, 2].randomGet(); + if (get.isLuckyStar(player)) num = 3; + //player.line(result.targets[0],'fire'); + result.targets[0].damage(num); + } + }, + ai: { + expose: 0.25, + }, + }, +}; + +export default skills; diff --git a/character/sp/sort.js b/character/sp/sort.js new file mode 100644 index 000000000..2986fc3b2 --- /dev/null +++ b/character/sp/sort.js @@ -0,0 +1,36 @@ +const characterSort = { + sp_tianji: ["sunhao", "liuxie", "caoang", "hetaihou", "sunluyu", "ol_wangrong", "zuofen", "ol_bianfuren", "qinghegongzhu", "tengfanglan", "ruiji", "caoxiancaohua", "caoyu"], + sp_sibi: ["ol_lukai", "yangxiu", "guotu", "chenlin", "chengyu", "shixie", "fuwan", "wangyun", "zhugejin", "simalang", "maliang", "buzhi", "dongyun", "kanze", "sunqian", "xizhicai", "sunshao", "duxi", "jianggan", "ol_dengzhi", "ol_yangyi", "ol_dongzhao", "ol_chendeng", "jin_yanghu", "wangyan", "xiahouxuan", "quhuang", "zhanghua", "wangguan", "sunhong", "caoxi", "tianchou"], + sp_tianzhu: ["liyi", "zhangyan", "niujin", "hejin", "hansui", "wutugu", "yanbaihu", "shamoke", "zhugedan", "huangzu", "gaogan", "tadun", "fanjiangzhangda", "ahuinan", "dongtuna", "ol_wenqin"], + sp_nvshi: ["ol_dingshangwan", "lingju", "guanyinping", "zhangxingcai", "mayunlu", "dongbai", "zhaoxiang", "ol_zhangchangpu", "daxiaoqiao", "jin_guohuai", "ol_hujinding"], + sp_shaowei: ["simahui", "zhangbao", "zhanglu", "zhugeguo", "xujing", "zhangling", "huangchengyan", "zhangzhi", "lushi"], + sp_huben: ["duanjiong", "ol_mengda", "caohong", "xiahouba", "zhugeke", "zumao", "wenpin", "litong", "mazhong", "heqi", "quyi", "luzhi", "yuejin", "dingfeng", "wuyan", "ol_zhuling", "tianyu", "huojun", "zhaoyǎn", "dengzhong", "ol_furong", "macheng", "ol_zhangyì", "ol_zhujun", "maxiumatie", "luoxian", "ol_huban", "haopu", "ol_qianzhao"], + sp_liesi: ["lvboshe", "mizhu", "weizi", "ol_liuba", "zhangshiping"], + sp_default: ["sp_diaochan", "sp_zhaoyun", "sp_sunshangxiang", "sp_caoren", "sp_jiangwei", "sp_machao", "sp_caiwenji", "jsp_guanyu", "jsp_huangyueying", "sp_pangde", "sp_jiaxu", "yuanshu", "sp_zhangliao", "sp_ol_zhanghe", "sp_menghuo", "sp_sunce"], + sp_qifu: ["ol_feiyi", "caoying", "panshu", "caochun", "yuantanyuanshang", "caoshuang", "wolongfengchu", "guansuo", "baosanniang", "fengfangnv", "jin_zhouchu"], + sp_wanglang: ["ol_wanglang", "ol_puyuan", "ol_zhouqun"], + sp_zhongdan: ["cuiyan", "huangfusong"], + sp_guozhan2: ["sp_dongzhuo", "liqueguosi", "zhangren"], + sp_others: ["hanba", "caiyang"], + sp_waitforsort: ["ol_luyusheng", "ol_pengyang", "ol_tw_zhangji", "ol_liwan", "ol_liuyan", "liupan", "ol_liupi"], +}; + +const characterSortTranslate = { + sp_tianji: "天极·皇室宗亲", + sp_sibi: "四弼·辅国文曲", + sp_tianzhu: "天柱·势冠一方", + sp_nvshi: "女史·留史巾帼", + sp_shaowei: "少微·能人异士", + sp_huben: "虎贲·勇冠三军", + sp_liesi: "列肆·豪商巨贾", + sp_default: "天同·同名异势", + sp_qifu: "灯愿·祈福武将", + sp_wanglang: "OL·限定专属", + sp_zhongdan: "忠胆英杰", + sp_guozhan: "国战", + sp_guozhan2: "国战移植", + sp_others: "其他", + sp_waitforsort: "等待分包", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/sp/translate.js b/character/sp/translate.js new file mode 100644 index 000000000..311d951f0 --- /dev/null +++ b/character/sp/translate.js @@ -0,0 +1,1242 @@ +const translates = { + xinfu_lingren: "凌人", + xinfu_lingren_info: "每回合限一次。当你使用带有「伤害」标签的基本牌或普通锦囊牌指定目标后,你可以猜测其中的一个目标的手牌中是否有基本牌,锦囊牌或装备牌。若你猜中的项目数:≥1,此牌对该角色的伤害+1;≥2,你摸两张牌;≥3,你获得技能〖奸雄〗和〖行殇〗直到你的下回合开始。", + lingren_adddamage: "凌人", + lingren_adddamage_info: "", + lingren_jianxiong: "奸雄", + lingren_jianxiong_info: "当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。", + lingren_xingshang: "行殇", + lingren_xingshang_info: "当有角色死亡后,你可以选择一项:1.回复1点体力。2.获得该角色的所有牌。", + xinfu_fujian: "伏间", + xinfu_fujian_info: "锁定技,结束阶段,你观看一名随机的其他角色的随机X张手牌。(X为场上手牌最少的角色的手牌数)", + fujian: "伏间", + fujian_info: "锁定技,准备阶段和结束阶段,你随机观看一名手牌数不为全场最多的其他角色的手牌。", + xinfu_xionghuo: "凶镬", + xinfu_xionghuo_info: "游戏开始时,你获得3个“暴戾”标记(标记上限为3)。出牌阶段,你可以交给一名其他角色一个“暴戾”标记。当你对有“暴戾”标记的其他角色造成伤害时,此伤害+1。有“暴戾”标记的其他角色的出牌阶段开始时,其移去所有“暴戾”标记并随机执行一项:1.受到1点火焰伤害且本回合不能对你使用【杀】;2.失去1点体力且本回合手牌上限-1;3.你随机获得其两张牌。", + xinfu_shajue: "杀绝", + xinfu_shajue_info: "锁定技,其他角色进入濒死状态时,你获得一个“暴戾”标记。然后若其体力值小于0,你获得使其进入濒死状态的牌。", + xinfu_jianjie: "荐杰", + jianjie: "荐杰", + jianjie_info: "①你的第一个准备阶段开始时,你令一名其他角色获得“龙印”,然后令另一名其他角色获得“凤印”。②出牌阶段限一次。若当前回合不是你的第一个回合,则你可以移动场上的“龙印”或“凤印”。③拥有“龙印”或“凤印”的其他角色死亡时,你转移该角色的“龙印”和“凤印”。④拥有“龙印”/“凤印”的角色视为拥有〖火计〗/〖连环〗,且同时拥有这两种标记的角色视为拥有〖业炎〗。", + jianjie_huoji: "火计", + jianjie_huoji_effect: "火计", + jianjie_huoji_info: "出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。", + jianjie_lianhuan: "连环", + jianjie_lianhuan_effect: "连环", + jianjie_lianhuan_info: "出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。", + jianjie_yeyan: "业炎", + jianjie_yeyan_info: "限定技。出牌阶段,你可以移去你所有的“龙印”和“凤印”,对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。", + xinfu_yinshi: "隐士", + xinfu_yinshi_info: "锁定技,若你没有“龙印”和“凤印”且防具栏为空,则当你受到属性伤害或锦囊牌造成的伤害时,防止此伤害。", + xinfu_chenghao: "称好", + xinfu_chenghao_info: "当一名角色受到属性伤害后,若其存活且其武将牌横置且是伤害传导的起点,则你可以观看牌堆顶的X张牌并分配给任意角色。(X为横置的角色数量且包含该角色)", + jianjie_faq: "关于龙凤印", + jianjie_faq_info: "龙印效果:视为拥有〖火计〗。凤印效果:视为拥有〖连环〗。(均一回合限使用三次) 龙凤印齐全:视为拥有〖业炎〗,〖业炎〗发动后移除龙凤印。", + xinfu_wuniang: "武娘", + xinfu_wuniang_info: "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌。若如此做,该角色和场上所有的“关索”各摸一张牌。", + xinfu_xushen: "许身", + xinfu_xushen_info: "限定技,当一名男性角色使用【桃】令你脱离濒死状态时,若场上没有“关索”,则其可以将自己的一张武将牌变更为“关索”。然后你回复1点体力,并获得技能〖镇南〗。", + xinfu_zhennan: "镇南", + xinfu_zhennan_info: "当你成为【南蛮入侵】的目标时,你可以对一名其他角色造成1-3点随机伤害。", + xinfu_falu: "法箓", + xinfu_falu_info: "锁定技,游戏开始时,你获得「紫薇」「后土」「玉清」「勾陈」标记各一个。当你的牌因弃置而进入弃牌堆后,根据这些牌的花色,你获得对应的标记:黑桃,你获得1枚「紫薇」;梅花,你获得1枚「后土」;红桃,你获得1枚「玉清」;方块,你获得1枚「勾陈」。(每种标记限拥有1个)", + xinfu_dianhua: "点化", + xinfu_dianhua_info: "准备阶段或结束阶段,你可以观看牌堆顶的X张牌(X为你的「紫薇」「后土」「玉清」「勾陈」标记数的总和)。若如此做,你将这些牌以任意顺序放回牌堆顶或牌堆底。", + xinfu_zhenyi: "真仪", + xinfu_zhenyi_info: "你可以在以下时机弃置相应的标记来发动以下效果:一名角色的判定牌生效前,你可以弃置一枚「紫薇」,然后将判定结果改为任意花色且点数为5;你的回合外,你可以弃置一枚「后土」,然后将你的一张手牌当【桃】使用;当你造成伤害时,你可以弃置一枚「玉清」,然后令此伤害+1;当你受到伤害后,你可以弃置一张「勾陈」,然后你从牌堆中随机获得三种类型的牌各一张。", + zhenyi_spade: "真仪", + zhenyi_spade_info: "", + zhenyi_club: "真仪", + zhenyi_club_info: "", + zhenyi_heart: "真仪", + zhenyi_heart_info: "", + zhangren: "张任", + zoushi: "邹氏", + zangba: "臧霸", + gz_jiling: "纪灵", + gz_sp_dongzhuo: "董卓", + gz_zhangjiao: "张角", + litong: "李通", + mizhu: "糜竺", + buzhi: "步骘", + chenlin: "陈琳", + yuanshu: "SP袁术", + yuanshu_prefix: "SP", + gongsunzan: "公孙瓒", + sp_diaochan: "SP貂蝉", + sp_diaochan_prefix: "SP", + yangxiu: "杨修", + sp_zhaoyun: "SP赵云", + sp_zhaoyun_prefix: "SP", + caohong: "曹洪", + liuxie: "刘协", + xiahouba: "夏侯霸", + zhugejin: "诸葛瑾", + zhugeke: "诸葛恪", + guanyinping: "关银屏", + sunhao: "孙皓", + chengyu: "程昱", + simalang: "司马朗", + gz_tianfeng: "田丰", + sp_jiaxu: "SP贾诩", + sp_jiaxu_prefix: "SP", + maliang: "马良", + sp_caoren: "SP曹仁", + sp_caoren_prefix: "SP", + yuejin: "乐进", + mifuren: "糜夫人", + sp_dongzhuo: "SP董卓", + sp_dongzhuo_prefix: "SP", + gz_jiangfei: "蒋琬费祎", + gz_jiangqing: "蒋钦", + hetaihou: "何太后", + dingfeng: "丁奉", + zhangxingcai: "张星彩", + caoang: "曹昂", + gz_kongrong: "孔融", + fuwan: "伏完", + sp_pangde: "SP庞德", + sp_pangde_prefix: "SP", + sp_sunshangxiang: "SP孙尚香", + sp_sunshangxiang_prefix: "SP", + zhugedan: "诸葛诞", + sp_machao: "SP马超", + sp_machao_prefix: "SP", + sp_jiangwei: "SP姜维", + sp_jiangwei_prefix: "SP", + zhangbao: "张宝", + yangxiou: "杨修", + shixie: "士燮", + mayunlu: "马云騄", + zhanglu: "张鲁", + wutugu: "兀突骨", + gz_mateng: "马腾", + sp_caiwenji: "SP蔡琰", + sp_caiwenji_prefix: "SP", + zhugeguo: "诸葛果", + lingcao: "凌操", + lingju: "灵雎", + lifeng: "李丰", + jsp_guanyu: "SP关羽", + jsp_guanyu_prefix: "SP", + zhuling: "朱灵", + sunluyu: "OL孙鲁育", + sunluyu_prefix: "OL", + hanba: "旱魃", + gz_panfeng: "潘凤", + zumao: "祖茂", + daxiaoqiao: "大乔小乔", + cuiyan: "崔琰", + wenpin: "文聘", + jsp_huangyueying: "SP黄月英", + jsp_huangyueying_prefix: "SP", + guansuo: "关索", + tadun: "蹋顿", + yanbaihu: "严虎", + wanglang: "王朗", + caochun: "曹纯", + dongbai: "OL董白", + dongbai_prefix: "OL", + zhaoxiang: "赵襄", + heqi: "贺齐", + kanze: "OL阚泽", + kanze_prefix: "OL", + dongyun: "董允", + mazhong: "马忠", + huangfusong: "皇甫嵩", + wangyun: "王允", + sunqian: "孙乾", + xizhicai: "戏志才", + beimihu: "卑弥呼", + luzhi: "鲁芝", + bianfuren: "卞夫人", + ol_bianfuren: "卞夫人", + shamoke: "沙摩柯", + + caoying: "曹婴", + simahui: "司马徽", + baosanniang: "鲍三娘", + majun: "马钧", + simazhao: "司马昭", + wangyuanji: "王元姬", + + jianggan: "蒋干", + hejin: "何进", + hansui: "韩遂", + niujin: "牛金", + xujing: "OL许靖", + xujing_prefix: "OL", + yuantanyuanshang: "袁谭袁尚", + + xinfenyue: "奋钺", + xinfenyue_info: "出牌阶段限X次(X为与你不同阵营的存活角色数),你可以与一名其他角色拼点,若你赢,根据你拼点牌的点数依次执行以下效果:不大于5,你获得其一张牌;不大于9,你获得牌堆里的一张【杀】; 不大于K,视为你对其使用一张雷【杀】。", + neifa: "内伐", + neifa_info: "出牌阶段开始时,你可以摸两张牌或获得场上的一张牌,然后弃置一张牌。若弃置的牌是基本牌,本回合你不能使用锦囊和装备牌,且【杀】的使用次数+X且目标+1;若弃置的不是基本牌,本回合你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标,前两次使用装备牌时摸X张牌(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5)。", + neifa_use: "内伐", + yuxu: "誉虚", + yuxu_info: "当你于出牌阶段内使用的牌结算结束后,若你此前于此阶段发动过〖誉虚〗的次数为:偶数,你可以摸一张牌;奇数,你弃置一张牌。", + yuxu2: "誉虚(弃牌)", + xjshijian: "实荐", + xjshijian_info: "一名其他角色于其回合内使用的第二张牌结算完成后,你可弃置一张牌并令其获得技能〖誉虚〗直到回合结束。", + mouzhu: "谋诛", + mouzhu_info: "出牌阶段限一次,你可以令一名有手牌的其他角色交给你一张手牌。然后若你的手牌数大于其,其选择视为对你使用一张【杀】或【决斗】。", + yanhuo: "延祸", + yanhuo_info: "当你死亡时,你可以依次弃置一名其他角色的X张牌。(X为你的牌数)", + niluan: "逆乱", + niluan_info: "其他角色的结束阶段开始时,若其本回合内使用过【杀】或其体力值大于你,则你可以将一张黑色牌当做【杀】使用。", + cuorui: "挫锐", + cuorui_info: "锁定技,游戏开始时,你摸X张牌(X为你的体力上限)。锁定技,限定技,判定阶段开始前,若你的判定区有牌,你跳过此阶段。", + cuorui_info_single: "锁定技,你的起始手牌数改为X+2(X为你剩余的备选武将数)。你跳过登场后的第一个判定阶段。", + liewei: "裂围", + liewei_info: "当你杀死一名角色后,你可以摸三张牌。", + + weicheng: "伪诚", + weicheng_info: "当牌从你的手牌区移动至其他角色的手牌区后,若你的手牌数小于体力值,你可以摸一张牌。", + daoshu: "盗书", + daoshu_info: "出牌阶段限一次。你可以选择一个花色并获得一名其他角色的一张手牌。若此牌花色与你选择的相同,则你对其造成1点伤害且你〖盗书〗于此阶段内可使用的次数上限+1。否则你须交给其一张与此牌花色不同的手牌(没有则展示手牌)。", + + xinshanjia: "缮甲", + xinshanjia_info: "出牌阶段开始时,你可以摸三张牌,然后弃置3-X张牌(X为你本局游戏内不因使用而失去过的装备牌的数目且至多为3)。若你没有以此法弃置:基本牌,此阶段你使用【杀】的次数上限+1;锦囊牌,此阶段你使用牌无距离限制;基本牌或锦囊牌,你可以视为使用一张【杀】。", + new_meibu: "魅步", + new_meibu_info: "其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得技能〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。", + new_mumu: "穆穆", + new_mumu_info: "出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌;2.获得一名角色装备区里的一张防具牌,若如此做,你本回合不能使用【杀】。", + new_zhixi: "止息", + new_zhixi_info: "锁定技。出牌阶段内,若你使用过锦囊牌或使用过的牌数不小于X,则你不能使用牌(X为你的体力值)。", + new_mumu2: "穆穆", + new_mumu2_info: "锁定技,你不能使用【杀】。", + new_xingwu: "星舞", + new_xingwu_info: "弃牌阶段开始时,你可以将一张牌置于武将牌上,称为“舞”。然后你可以选择一项:①将三张“舞”置入弃牌堆;②弃置两张手牌并将武将牌翻面。若如此做,你选择一名角色,该角色弃置其装备区的所有牌并受到2点伤害(若为女性,则改为1点)。", + new_luoyan: "落雁", + new_luoyan_info: "锁定技。若你的武将牌上有“舞”,则你视为拥有技能〖天香〗和〖流离〗。", + new_luoyan_tianxiang: "天香", + new_luoyan_tianxiang_info: "", + new_luoyan_liuli: "流离", + new_luoyan_liuli_info: "", + ol_shichou: "誓仇", + ol_shichou_info: "当你使用【杀】时,你可以令至多X+1名角色也成为此【杀】的目标(X为你已损失的体力值)。", + dc_olshichou: "誓仇", + dc_olshichou_info: "当你使用【杀】时,你可以令至多X名角色也成为此【杀】的目标。此牌结算结束后,若你未因【杀】造成过伤害,则你获得此【杀】(X为你已损失的体力值)。", + zhenwei_three: "镇卫", + zhenwei_three_info: "锁定技,敌方角色至己方其他角色的距离+1。", + huanshi_three: "缓释", + huanshi_three_info: "一名友方角色的判定牌生效前,你可打出一张牌代替之。", + + yizan: "翊赞", + yizan_info: "你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", + yizan0: "翊赞", + yizan0_info: "你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", + yizan1: "翊赞", + yizan1_info: "你可以将两张牌(其中至少一张是基本牌)当【闪】打出。", + yizan2: "翊赞", + yizan2_info: "你可以将一张基本牌当任意基本牌牌使用。", + yizan3: "翊赞", + yizan3_info: "你可以将一张基本牌当【闪】打出。", + yizan5: "翊赞", + yizan5_info: "你可以将两张牌(其中至少一张是基本牌)当【杀】打出。", + yizan6: "翊赞", + yizan6_info: "你可以将一张基本牌当【杀】打出。", + longyuan: "龙渊", + longyuan_info: "觉醒技 当你使用或打出基本牌时,若你已经已累计发动过3次〖翊赞〗,你将〖翊赞〗改为“你可以将一张基本牌当任意基本牌牌使用或打出”。", + wuniang: "武娘", + wuniang_info: "你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后该角色摸一张牌;若“关索”在场,你可令“关索”也摸一张牌。", + zhennan: "镇南", + zhennan_info: "当你成为【南蛮入侵】的目标时,你可令一名其他角色随机受到1至3点伤害。", + xushen: "许身", + xushen_info: "当其他男性角色令你脱离濒死状态时,若“关索”不在场,其可以选择是否用“关索”替换其武将牌,然后你回复1点体力并获得技能〖镇南〗。", + + wanwei: "挽危", + wanwei_info: "当你因被其他角色获得或弃置而失去牌时,你可以改为自己选择失去的牌。", + gzjili: "蒺藜", + gzjili_info: "当你于一回合内使用或打出第X张牌时,你可以摸X张牌(X为你的攻击范围)。", + + qingzhong: "清忠", + qingzhong_info: "出牌阶段开始时,你可以摸两张牌,若如此做,此阶段结束时,你与手牌数最少的角色交换手牌。", + weijing: "卫境", + weijing_info: "每轮限一次,当你需要使用【杀】或【闪】时,你可以视为使用一张【杀】或【闪】。", + zishu: "自书", + zishu_info: "锁定技。①其他角色的回合结束时,你将手牌区里所有你于此回合得到过的牌置入弃牌堆。②当你于回合内不因〖自书②〗而得到牌后,你摸一张牌。", + yingyuan: "应援", + yingyuan_info: "当你于回合内使用的牌结算完成后,你可以将其交给一名其他角色(相同牌名的牌每回合限一次)。", + xinyingyuan: "应援", + xinyingyuan_info: "当你于回合内使用一张牌后,你可以令一名其他角色从牌堆获得一张与该牌类型相同的牌(每种类型的牌每回合限一次)。", + qianya: "谦雅", + qianya_info: "当你成为锦囊牌的目标后,你可以将任意张手牌交给一名其他角色。", + shuimeng: "说盟", + shuimeng_info: "出牌阶段结束时,你可以与一名角色拼点,若你赢,视为你使用【无中生有】;若你没赢,视为其对你使用【过河拆桥】。", + xianfu: "先辅", + xianfu2: "先辅", + xianfu2_bg: "辅", + xianfu_info: "锁定技,游戏开始时,你选择一名其他角色,当其受到伤害后,你受到等量的伤害,当其回复体力后,你回复等量的体力。", + chouce: "筹策", + chouce_info: "当你受到1点伤害后,你可以判定,若结果为:黑色,你弃置一名角色区域里的一张牌;红色,你选择一名角色,其摸一张牌,若其是〖先辅〗选择的角色,改为其摸两张牌。", + fuqi: "伏骑", + fuqi_info: "锁定技,当你使用牌时,你令所有与你距离为1的其他角色不能使用或打出牌响应此牌。", + jiaozi: "骄恣", + jiaozi_info: "锁定技,若你的手牌数为全场唯一最多,则当你造成或受到伤害时,此伤害+1。", + wy_meirenji: "美人计", + wy_meirenji_info: "出牌阶段,对一名有手牌的其他男性角色使用。每名女性角色各获得其一张手牌并将一张手牌交给你,然后比较你与其的手牌数,手牌少的角色对手牌多的角色造成1点伤害。", + wy_xiaolicangdao: "笑里藏刀", + wy_xiaolicangdao_info: "出牌阶段,对一名其他角色使用。该角色摸X张牌(X为其已损失的体力值且至多为5),然后你对其造成1点伤害。", + weikui: "伪溃", + weikui2: "伪溃", + weikui_info: "出牌阶段限一次,你可以失去1点体力并选择一名有手牌的其他角色,你观看其手牌:若其手牌中有【闪】,则视为你对其使用【杀】,且本回合你计算与其的距离视为1;若其手牌中没有【闪】,你弃置其中一张牌。", + lizhan: "励战", + lizhan_info: "结束阶段,你可以令任意名已受伤的角色摸一张牌。", + wylianji: "连计", + wylianji_info: "出牌阶段限一次,你可以展示一张【杀】或黑色锦囊牌,并令一名其他角色将牌堆中的随机一张武器牌置入装备区(可替换原装备)。然后该角色选择一项:1.对除你以外的角色使用该牌,并将装备区里的武器牌交给该牌的一个目标角色;2.令你对其使用此牌,然后获得此牌,并将装备区内的武器牌交给你。", + // from here + moucheng: "谋逞", + moucheng_info: "觉醒技,当其他角色使用因〖连计〗交给其的牌累计造成伤害达到3点后,你失去技能〖连计〗,然后获得技能〖矜功〗。", + jingong: "矜功", + jingong2: "矜功", + jingong_backup: "矜功", + jingong_info: "出牌阶段限一次,你可以将一张装备牌或【杀】当做一张随机锦囊牌使用(三选一,其中一张为【美人计】或【笑里藏刀】),然后本回合的结束阶段,若你于本回合内未造成过伤害,你失去1点体力。", + fenyue: "奋钺", + fenyue2: "奋钺", + fenyue2_bg: "钺", + fenyue_info: "出牌阶段限X次,你可以与一名角色拼点,若你赢,你选择一项:1.令其不能使用或打出手牌直到回合结束;2.视为对其使用一张【杀】(不计入次数)。若你没赢,你结束出牌阶段。(X为存活的忠臣数)", + + zfengshi: "锋矢", + zfengshi_info: "当你使用【杀】指定目标后,你可以令目标弃置装备区内的一张牌。", + chuanxin: "穿心", + chuanxin_info: "当你于出牌阶段内使用【杀】或【决斗】对目标角色造成伤害时,你可以防止此伤害。若如此做,该角色选择一项:1.弃置装备区里的所有牌,若如此做,其失去1点体力;2.随机移除主武将牌上的一个技能。", + chuanxin_info_guozhan: "当你于出牌阶段内使用【杀】或【决斗】对目标角色造成伤害时,若其与你势力不同且有副将,你可以防止此伤害。若如此做,该角色选择一项:1.弃置装备区里的所有牌,若如此做,其失去1点体力;2.移除副将。", + hengjiang: "横江", + hengjiang2: "横江", + hengjiang_info: "当你受到1点伤害后,你可以令当前回合角色本回合的手牌上限-1。然后若其弃牌阶段内没有弃牌,则你摸一张牌。", + rehengjiang: "横江", + rehengjiang2: "横江", + rehengjiang3: "横江", + rehengjiang_info: "当你受到1点伤害后,你可以令当前回合角色本回合的手牌上限-1。然后若其弃牌阶段内有/没有弃牌,则你摸一/X张牌(X为你本回合内对其发动过〖横江〗的次数)。", + shuangren: "双刃", + shuangren_info: "出牌阶段开始时,你可以与一名角色拼点。若你赢,你视为对其或与其势力相同的另一名角色使用一张【杀】(不计入出牌阶段的次数限制);若你没赢,你本回合内不能对其他角色使用牌。", + xiashu: "下书", + xiashu_info: "出牌阶段开始时,你可以将所有手牌交给一名其他角色,然后该角色亮出任意数量的手牌(至少一张)。你选择一项:1.获得其亮出的手牌;2.获得其未亮出的手牌。", + kuanshi: "宽释", + kuanshi2: "宽释", + kuanshi_info: "结束阶段,你可以选择一名角色。直到你的下回合开始,该角色第一次受到大于1的伤害时,防止此伤害,然后你跳过下个回合的摸牌阶段。", + bingzheng: "秉正", + bingzheng_info: "出牌阶段结束时,你可以令手牌数不等于体力值的一名角色弃置一张手牌或摸一张牌。然后若其手牌数等于体力值,你摸一张牌,且可以交给该角色一张牌。", + sheyan: "舍宴", + sheyan_info: "当你成为普通锦囊牌的目标时(【借刀杀人】等带有指向目标的锦囊除外),你可以为此牌增加一个目标或令其对其中一个目标无效。(有效目标数至少为一)", + fuman: "抚蛮", + fuman2: "抚蛮", + fuman_info: "出牌阶段每名角色限一次,你可以将一张手牌交给一名其他角色并标记为“抚蛮”且“抚蛮”牌的牌名视为【杀】。然后当一名角色使用“抚蛮”牌结算结束后,你摸一张牌。若此牌造成过伤害,则改为摸两张牌。", + qizhou: "绮胄", + qizhou_info: "锁定技,你根据装备区里牌的花色数获得以下技能:1种或以上:〖马术〗;2种或以上:〖英姿〗;3种或以上:〖短兵〗;4种:〖奋威〗。", + shanxi: "闪袭", + shanxi_info: "出牌阶段限一次,你可以弃置一张红色基本牌,然后弃置攻击范围内的一名其他角色的一张牌。若弃置的牌是【闪】,你观看其手牌,若弃置的不是【闪】,其观看你的手牌。", + duanbing: "短兵", + duanbing_info: "当你使用【杀】选择目标后,你可以令一名距离为1的其他角色也成为此牌的目标。", + fanghun: "芳魂", + fanghun_info: "当你使用【杀】造成伤害或受到【杀】的伤害后,你获得X个“梅影”标记(X为伤害点数);你可以移去1个“梅影”标记来发动〖龙胆〗并摸一张牌。", + refanghun: "芳魂", + refanghun_info: "当你使用【杀】或成为【杀】的目标后,你获得1个“梅影”标记;你可以移去1个“梅影”标记来发动〖龙胆〗并摸一张牌。", + fanghun_sha: "龙胆", + fuhan: "扶汉", + fuhan_info: "限定技,回合开始时,你可以移去所有“梅影”标记并摸等量的牌,随机观看五名未登场的蜀势力角色,将武将牌替换为其中一名角色,并将体力上限数调整为本局游戏中移去“梅影”标记的数量(至少为2,至多为8),然后回复1点体力。", + refuhan: "扶汉", + refuhan_info: '限定技,回合开始时,你可以移去所有"梅影"标记并摸等量的牌,然后从X张蜀势力武将牌中选择并获得至多两个技能(限定技、觉醒技、隐匿技、使命技、主公技除外)。若此时你是体力值最低的角色,你回复1点体力(X为场上角色数,且X∈[4,+∞))。', + yjixi: "觊玺", + yjixi_info: "觉醒技,结束阶段,若你已连续三个自己回合未失去过体力,则你增加1点体力上限并回复1点体力,然后选择一项:获得技能〖妄尊〗;摸两张牌并获得当前主公的主公技。", + xinyongsi: "庸肆", + xinyongsi1: "庸肆", + xinyongsi2: "庸肆", + xinyongsi_info: "锁定技,摸牌阶段,你令额定摸牌数改为X(X为势力数);弃牌阶段开始时,你选择一项:1.弃置一张牌;2.失去1点体力。", + xiehui: "黠慧", + xiehui2: "黠慧", + xiehui_info: "锁定技,你的黑色牌不计入手牌上限;其他角色获得你的黑色牌时,其不能使用、打出、弃置这些牌直到其体力值扣减为止。", + lianzhu: "连诛", + lianzhu_info: "出牌阶段限一次,你可以展示并交给一名其他角色一张牌,若此牌为黑色,其选择一项:1.你摸两张牌;2.弃置两张牌。", + shanjia: "缮甲", + shanjia_info: "出牌阶段开始时,你可以摸X张牌,然后弃置等量的牌。若你以此法弃置了装备区内的牌,则你可以视为使用一张【杀】。(X为你于本局游戏内使用过的装备牌数且最大为7)", + tuifeng: "推锋", + tuifeng2: "推锋", + tuifeng_info: "1.当你受到伤害后,你可以将至多X张牌置于武将牌上(X为伤害值),称为“锋”。2.准备阶段开始时,若你的武将牌上有“锋”,你移去所有“锋”,摸2X张牌,然后你于此回合的出牌阶段内使用【杀】的次数上限+X。(X为你此次移去的“锋”数)", + ziyuan: "资援", + ziyuan_info: "出牌阶段限一次,你可以将任意张点数之和为13的手牌交给一名其他角色,然后该角色回复1点体力。", + jugu: "巨贾", + jugu_info: "锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。", + hongde: "弘德", + hongde_info: "当你一次获得或失去至少两张牌后,你可以令一名其他角色摸一张牌。", + dingpan: "定叛", + dingpan_info_identity: "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的反贼数)", + dingpan_info_doudizhu: "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的农民数)", + dingpan_info_versus_two: "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的最大阵营角色数)", + dingpan_info_versus: "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的敌方角色数)", + dingpan_info: "出牌阶段限一次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。", + weidi: "伪帝", + weidi_info: "锁定技,你视为拥有当前主公的主公技。", + juesi: "决死", + juesi_info: "出牌阶段,你可以弃置一张【杀】并选择攻击范围内的一名有牌的其他角色,该角色弃置一张牌,然后若弃置的牌不是【杀】且你的体力值不大于该角色,你视为对其使用【决斗】。", + zhenlue: "缜略", + zhenlue_info: "锁定技,你使用的普通锦囊牌不能被【无懈可击】响应;你不能成为延时锦囊牌的目标。", + jianshu: "间书", + jianshu_info: "限定技,出牌阶段,你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,然后令这两名角色拼点。赢的角色弃置两张牌,没赢的角色失去1点体力。", + yongdi: "拥嫡", + yongdi_info: "限定技,准备阶段开始时,你可令一名其他男性角色增加1点体力上限并回复1点体力,然后若该角色的武将牌上有主公技且其不为主公,其获得此主公技。", + regushe: "鼓舌", + regushe_info: "出牌阶段,若X小于7,则你可以用一张手牌与至多三名角色同时拼点,然后依次结算拼点结果,没赢的角色选择一项:1.弃置一张牌;2.令你摸一张牌。若你没赢,你获得一个“饶舌”标记。当你获得第7个“饶舌”标记时,你死亡。(X为你的“饶舌”标记数与本回合因“鼓舌”拼点而胜利的次数之和)", + rejici: "激词", + rejici2: "激词", + rejici_info: "锁定技。①当你的拼点牌亮出后,若此牌的点数不大于X,则你令此牌点数+X,并获得此次拼点中点数最大的拼点牌。②当你死亡时,你令杀死你的角色弃置7-X张牌并失去1点体力(X为你的“饶舌”标记数)。", + gushe: "鼓舌", + gushe_bg: "舌", + gushe_info: "出牌阶段限一次,你可以用一张手牌与至多三名角色同时拼点,然后依次结算拼点结果,没赢的角色选择一项:1.弃置一张牌;2.令你摸一张牌。若你没赢,你获得一个“饶舌”标记。当你获得第7个“饶舌”标记时,你死亡。", + jici: "激词", + jici_info: "当你因发动〖鼓舌〗而扣置的拼点牌亮出后,若点数小于X,你可令点数+X;若点数等于X,你可令你本回合发动〖鼓舌〗的次数上限+1。(X为你“饶舌”标记的数量)", + shefu: "设伏", + shefu2: "设伏", + shefu_bg: "伏", + shefu_info: "结束阶段开始时,你可以将一张牌移出游戏,称为「伏兵」。并为「伏兵」记录一个基本牌或锦囊牌的名称(须与其他「伏兵」记录的名称均不同)。你的回合外,当有其他角色使用与你记录的「伏兵」牌名相同的手牌时,你可以取消此牌的所有目标,然后移去该「伏兵」。若此时处于使用者的回合内,则你令使用者当前的所有非Charlotte技失效直至回合结束。", + benyu: "贲育", + benyu2: "贲育", + benyu_info: "当你受到伤害后,你可选择:①将手牌摸至与伤害来源手牌数相同(至多摸至5张);②弃置大于伤害来源手牌数的牌,然后对其造成1点伤害。", + zhidao: "雉盗", + zhidao_info: "锁定技,当你于你的回合内第一次对区域里有牌的其他角色造成伤害后,你获得其手牌、装备区和判定区里的各一张牌,然后直到回合结束,其他角色不能被选择为你使用牌的目标。", + jili: "寄篱", + jili_info: "锁定技,当一名其他角色成为红色基本牌或红色普通锦囊牌的目标时,若其与你的距离为1且你既不是此牌的使用者也不是目标,你也成为此牌的目标。", + luanzhan: "乱战", + luanzhan_info: "你使用【杀】或黑色普通锦囊牌可以额外选择X名角色为目标;当你使用【杀】或黑色普通锦囊牌指定目标后,若此牌的目标角色数小于X,则X减至0。(X为你于本局游戏内造成过伤害的次数)", + zhengnan: "征南", + zhengnan_info: "其他角色死亡后,你可以摸三张牌并获得下列技能中的任意一个:〖武圣〗、〖当先〗和〖制蛮〗。", + xinzhengnan: "征南", + xinzhengnan_info: "当一名角色进入濒死状态时,若你未因其发动过〖征南〗,则你回复1点体力并摸一张牌并获得下列技能中的任意一个:〖武圣〗、〖当先〗和〖制蛮〗(若技能全部拥有则改为摸三张牌。你以此法获得的〖当先〗结算时视为已发动过〖伏枥〗)。", + xiefang: "撷芳", + xiefang_info: "锁定技,你计算与其他角色的距离时-X。(X为女性角色数)", + qizhi: "奇制", + qizhi_info: "当你于回合内使用基本牌或锦囊牌指定目标后,你可以弃置不是此牌目标的一名角色的一张牌。若如此做,其摸一张牌。", + jinqu: "进趋", + jinqu_info: "结束阶段开始时,你可以摸两张牌,若如此做,你将手牌弃置至X张。(X为你于此回合发动过〖奇制〗的次数)", + jiqiao: "机巧", + jiqiao_info: "出牌阶段开始时,你可以弃置任意张装备牌,然后亮出牌堆顶两倍数量的牌并获得其中的非装备牌。", + linglong: "玲珑", + linglong_info: "锁定技,若你的装备区没有武器牌,则你使用【杀】的次数上限+1;若你的装备区没有防具牌,视为你装备着【八卦阵】;若你的装备区没有坐骑牌,你的手牌上限+1;若你的装备区没有宝物牌,则你视为拥有技能〖奇才〗。", + zhenwei: "镇卫", + zhenwei2: "镇卫", + zhenwei_info: "当一名其他角色成为【杀】或黑色锦囊牌的目标时(使用者不是你),若该角色的体力值小于你且此牌的目标角色数为1,你可以弃置一张牌。若如此做,你选择一项:1、摸一张牌,然后将此【杀】或黑色锦囊牌转移给你;2、令此【杀】或黑色锦囊牌无效,然后将此【杀】或黑色锦囊牌置于使用者的武将牌旁,若如此做,当前回合结束后,使用者获得使用者武将牌旁的这些牌。", + xingwu: "星舞", + xingwu_info: "弃牌阶段开始时,你可以将一张与你本回合使用的牌颜色均不同的手牌置于武将牌上:若你有至少三张“星舞”牌,你移去“星舞”牌并选择一名男性角色,该角色受到2点伤害并弃置其装备区的所有牌。", + luoyan: "落雁", + luoyan_info: "锁定技。若你的武将牌上有“星舞牌”,你拥有“天香”和“流离”。", + yinbing: "引兵", + yinbing_info: "结束阶段开始时,你可以将至少一张非基本牌置于武将牌上。每当你受到【杀】或【决斗】的伤害后,你移去一张「引兵」牌。", + juedi: "绝地", + juedi_info: "锁定技,准备阶段,若你的武将牌上有「引兵」牌,你选择一项:1.移去「引兵」牌,将手牌补至体力上限数;2.将「引兵」牌交给一名体力值不大于你的其他角色,其回复1点体力并摸等量的牌。", + kuangfu: "狂斧", + kuangfu_info: "当你使用【杀】造成伤害后,你可以选择一项:弃置其装备区内的一张牌,或将其装备区内的一张牌移动到你的装备区内。", + xintan: "心惔", + xintan_info: "出牌阶段限一次,你可以移去两张「焚」并选择一名角色,该角色失去1点体力。", + fentian: "焚天", + fentian_info: "锁定技,结束阶段开始时,若你的手牌数少于体力值,你须选择一名攻击范围内的角色,将其一张牌置于你的武将牌上,称为「焚」。锁定技,你的攻击范围+X(X为「焚」的数量)。", + zhiri: "炙日", + zhiri_info: "觉醒技,准备阶段开始时,若你的「焚」的数量不小于3,你减1点体力上限,然后获得技能〖心惔〗。", + meibu: "魅步", + meibu_info: "其他角色的出牌阶段开始时,若你不在其攻击范围内,你可以令该角色的锦囊牌均视为【杀】,直到该角色以此法使用了一张【杀】或回合结束。若如此做,则直到回合结束,视为你在其攻击范围内。", + mumu: "穆穆", + mumu_info: "出牌阶段限一次,你可以弃置一张【杀】或黑色锦囊牌,然后选择一项:弃置场上的一张武器牌,然后摸一张牌;或将场上的一张防具牌移动到你的装备区里(可替换原防具)。", + zhanyi: "战意", + zhanyi_basic_sha: "战杀", + zhanyi_basic_jiu: "战酒", + zhanyi_basic_tao: "战桃", + zhanyi_info: "出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作【杀】、【酒】或【桃】使用;锦囊牌,摸两张牌且你使用的牌无距离限制;装备牌,你使用【杀】指定目标角色后,其弃置两张牌。", + nuzhan: "怒斩", + nuzhan2: "怒斩", + nuzhan_info: "锁定技,你使用的由一张锦囊牌转化的【杀】不计入出牌阶段的次数限制;锁定技,你使用的由一张装备牌转化的【杀】的伤害值基数+1。", + danji: "单骑", + danji_info: "觉醒技,准备阶段开始时,若你的手牌数大于你的体力值且本局游戏的主公不为刘备,你减1点体力上限,然后获得〖马术〗和〖怒斩〗。", + jieyuan: "竭缘", + jieyuan_more: "竭缘", + jieyuan_less: "竭缘", + jieyuan_info: "当你对一名其他角色造成伤害时,若其体力值大于或等于你的体力值,你可弃置一张黑色手牌,令此伤害+1;当你受到一名其他角色造成的伤害时,若其体力值大于或等于你的体力值,你可弃置一张红色手牌,令此伤害-1。", + fenxin: "焚心", + fenxin_info: "锁定技,一名其他角色死亡后,若其身份为:忠臣,你本局内发动〖竭缘〗减少伤害时无视体力值限制;反贼,你本局内发动〖竭缘〗增加伤害时无视体力值限制;内奸,你本局内选择发动〖竭缘〗的牌时无颜色和区域限制。", + fenxin_info_versus: "锁定技,一名其他角色首次受到伤害后,你选择本局游戏未选择过的一项:1.发动〖竭缘〗减少伤害时无视体力值限制;2.发动〖竭缘〗增加伤害时无视体力值限制;3.发动〖竭缘〗选择的牌时无颜色和区域限制。", + qingyi: "轻逸", + qingyi1: "轻逸", + qingyi2: "轻逸", + qingyi_info: "你可以跳过判定阶段和摸牌阶段。若如此做,视为对一名角色使用了一张无距离限制的【杀】。", + xiandeng: "先登", + xiandeng_info: "锁定技,出牌阶段,你使用的第一张【杀】不计入次数且无距离限制。", + shulv: "熟虑", + shulv_info: "出牌阶段限一次,若你的手牌数大于体力值,则你可以弃置一张牌并摸一张牌。", + xisheng: "牺牲", + xisheng_info: "每名其他角色的回合限一次,你可以将两张牌当做【桃】使用。", + yuhua: "羽化", + yuhua_info: "锁定技。①你的非基本牌不计入手牌上限。②准备阶段和结束阶段开始时,你卜算1。", + qirang: "祈禳", + qirang_info: "当有装备牌进入你的装备区时,你可获得牌堆中的一张锦囊牌。若此牌为:普通锦囊牌,则当你使用此“祈禳”牌选择唯一目标后,可为此牌增加一个目标;延时锦囊牌,则你下回合发动〖羽化〗时的卜算量+1(至多为5)。", + biluan: "避乱", + biluan_info: "摸牌阶段开始时,若有与你距离不大于1的其他角色,你可以放弃摸牌。若如此做,本局内其他角色计算与你的距离时+X。(X为势力数)", + lixia: "礼下", + lixia_info: "锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你摸一张牌或令其摸一张牌。本局内其他角色计算与你的距离时-1。", + olbiluan: "避乱", + olbiluan_info: "结束阶段开始时,若有与你距离不大于1的其他角色,你可以弃置一张牌。若如此做,本局内其他角色计算与你的距离时+X。(X为场上的势力数)", + relixia: "礼下", + relixia_info: "锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你选择一至两项:1.摸一张牌;2.其摸两张牌;3.其回复1点体力。本局内其他角色计算与你的距离时-X(X为你选择的选项数)。", + rebiluan: "避乱", + rebiluan2: "避乱", + rebiluan_info: "结束阶段开始时,若有与你距离不大于1的其他角色,你可以弃置一张牌。若如此做,本局内其他角色计算与你的距离时+X。(X为场上角色数且至多为4)", + ollixia: "礼下", + ollixia_info: "锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你摸一张牌或令其摸两张牌。本局内其他角色计算与你的距离时-1。", + yishe: "义舍", + yishe_bg: "米", + yishe_info: "结束阶段开始时,若你的武将牌上没有「米」,则你可以摸两张牌。若如此做,你将两张牌置于武将牌上,称为「米」;当有「米」移至其他区域后,若你的武将牌上没有「米」,则你回复1点体力。", + bushi: "布施", + midao: "米道", + bushi_info: "当你受到1点伤害后,或其他角色受到你造成的1点伤害后,受到伤害的角色可以获得你的一张「米」。", + midao_info: "一名角色的判定牌生效前,你可以打出一张「米」代替之。", + fengpo: "凤魄", + fengpo_info: "每种牌名各限一次。当你每回合使用的第一张【杀】或【决斗】指定目标后,若目标角色数为1,你可以选择一项:1.摸X张牌,令此牌的伤害值基数+1;2.摸一张牌,令此牌的伤害值基数+X(X为其♦牌的数量)。", + chenqing: "陈情", + chenqing_info: "每轮限一次,当一名角色处于濒死状态时,你可以令另一名其他角色摸四张牌,然后其弃置四张牌。若其以此法弃置的四张牌花色各不相同,则视为该角色对濒死的角色使用一张【桃】。", + mozhi: "默识", + mozhi_info: "结束阶段,你可以将一张手牌当做你本回合出牌阶段内使用的第一张基本或普通锦囊牌使用。然后你可以将一张手牌当做你本回合出牌阶段内使用的第二张基本或普通锦囊牌使用(以此法使用的牌须满足使用的限制)。", + ranshang: "燃殇", + ranshang2: "燃殇", + ranshang_info: "锁定技,当你受到1点火焰伤害后,你获得1枚“燃”标记;结束阶段开始时,你失去X点体力。若X大于2,则你减2点体力上限并摸两张牌。(X为“燃”标记的数量)", + hanyong: "悍勇", + hanyong_info: "当你使用【南蛮入侵】或【万箭齐发】或黑桃普通【杀】时,若你已受伤,则你可以令此牌的伤害值基数+1。然后若你的体力值不小于游戏轮数,则你获得一枚“燃”标记。", + + yicong: "义从", + yongsi: "庸肆", + yongsi1: "庸肆", + yongsi2: "庸肆", + bifa: "笔伐", + bifa2: "笔伐", + songci: "颂词", + songci_draw: "颂词", + baobian: "豹变", + lihun: "离魂", + chongzhen: "冲阵", + yuanhu: "援护", + tianming: "天命", + mizhao: "密诏", + duwu: "黩武", + duwu3: "黩武", + mingzhe: "明哲", + huanshi: "缓释", + hongyuan: "弘援", + aocai: "傲才", + aocai2: "傲才", + aocai2_backup: "傲才", + aocai3: "傲才", + huxiao: "虎啸", + huxiao3: "虎啸", + xueji: "雪恨", + wuji: "武继", + shushen: "淑慎", + shenzhi: "神智", + xiongyi: "雄异", + junbing: "郡兵", + junbing2: "郡兵", + quji: "去疾", + sijian: "死谏", + suishi: "随势", + suishi2: "随势", + xiaoguo: "骁果", + duanxie: "断绁", + fenming: "奋命", + guixiu: "闺秀", + cunsi: "存嗣", + yongjue: "勇决", + hengzheng: "横征", + shengxi: "生息", + shoucheng: "守成", + shangyi: "尚义", + zniaoxiang: "鸟翔", + zhendu: "鸩毒", + qiluan: "戚乱", + qiluan2: "戚乱", + qiluan3: "戚乱", + shenxian: "甚贤", + oldshenxian: "甚贤", + qiangwu: "枪舞", + moukui: "谋溃", + moukui2: "谋溃", + lirang: "礼让", + mingshi: "名士", + liangzhu: "良助", + kaikang: "慷忾", + wangzun: "妄尊", + tongji: "同疾", + kuiwei: "溃围", + kuiwei2: "溃围", + yanzheng: "严整", + zhoufu: "咒缚", + zhoufu2: "咒缚", + zhoufu3: "咒缚", + yingbin: "影兵", + reyingbing: "影兵", + rezhoufu: "咒缚", + rezhoufu2: "咒缚", + fenxun: "奋迅", + fenxun2: "奋迅", + spmengjin: "猛进", + xiemu: "协穆", + xiemu2: "协穆", + oldxiemu: "协穆", + naman: "纳蛮", + taichen: "抬榇", + jilei: "鸡肋", + jilei2: "鸡肋", + jilei2_bg: "肋", + yawang: "雅望", + xunzhi: "殉志", + fanxiang: "返乡", + fanxiang_info: "觉醒技,准备阶段开始时,若场上有已受伤且你发动过〖良助〗的选项二的角色,则你加1点体力上限并回复1点体力,失去技能〖良助〗并获得技能〖枭姬〗。", + xunzhi_info: "准备阶段开始时,若你的上家和下家与你的体力值均不相等,你可以失去1点体力。若如此做,你本局内手牌上限+2。", + yawang_info: "锁定技,摸牌阶段开始时,你改为摸X张牌,然后你于本回合的出牌阶段内至多使用X张牌(X为与你体力值相等的角色数)。", + jilei_info: "当你受到有来源的伤害后,你可以声明一种牌的类别。若如此做,你令伤害来源不能使用、打出或弃置此类别的手牌直到其下个回合开始。", + danlao: "啖酪", + danlao_info: "当你成为【杀】或普通锦囊牌的目标后,若此牌的目标数大于1,则你可以摸一张牌,令此牌对你无效。", + gongao: "功獒", + zhuiji: "追击", + chouhai: "仇海", + chouhai_info: "锁定技,当你受到伤害时,若你没有手牌,此伤害+1。", + rechouhai: "仇海", + rechouhai_info: "锁定技,当你受到渠道为【杀】的伤害时,若你没有手牌,此伤害+1。", + guiming: "归命", + guiming_info: "主公技,锁定技,你将残蚀描述中的“已受伤角色”改为“已受伤角色或其他吴势力角色”。", + canshi: "残蚀", + canshi2: "残蚀", + canshi_info: "摸牌阶段开始时,你可以改为摸X张牌(X为已受伤的角色数),若如此做,当你于此回合内使用基本牌或锦囊牌时,你弃置一张牌。", + recanshi: "残蚀", + recanshi2: "残蚀", + recanshi_info: "摸牌阶段开始时,你可以多摸X张牌(X为已受伤的角色数),若如此做,当你于此回合内使用【杀】或普通锦囊牌时,你弃置一张牌。", + zhuiji_info: "锁定技,你与体力值不大于你的角色的距离视为1。", + kunfen: "困奋", + kunfen_info: "锁定技,结束阶段开始时,你失去1点体力,然后摸两张牌。", + fengliang: "逢亮", + fengliang_info: "觉醒技,当你进入濒死状态时,你减1点体力上限,将体力值回复至2点,获得技能〖挑衅〗并将〖困奋〗改为非锁定技。", + oldcihuai: "刺槐", + oldcihuai2: "刺槐", + oldcihuai_info: "出牌阶段开始时,你可以展示手牌。若其中没有【杀】,则当你于此阶段内手牌数变化之前/有角色死亡之前需要使用【杀】时,你可以使用无对应实体牌的【杀】。", + cihuai: "刺槐", + cihuai_info: "出牌阶段开始时,若你的手牌中没有【杀】,则你可以展示你的手牌,视为对一名角色使用一张【杀】。", + gongao_info: "锁定技,当一名角色死亡后,你增加1点体力上限,回复1点体力。", + juyi: "举义", + juyi_info: "觉醒技,准备阶段开始时,若你的体力上限大于存活角色数,你摸等同于体力上限张数的牌,然后获得技能〖崩坏〗和〖威重〗。", + weizhong: "威重", + weizhong_info: "锁定技,当你的体力上限增加或减少时,你摸一张牌。若你的手牌数为全场最少,则你改为摸两张牌。", + taichen_info: "出牌阶段限一次,你可以失去1点体力,视为对一名角色使用一张【杀】。(不计入出牌阶段的使用次数限制)", + naman_info: "当其他角色打出的【杀】结算结束后,你可以获得此牌对应的所有实体牌。", + xiemu_info: "出牌阶段限一次,你可以弃置一张【杀】并选择一个势力。若如此做,直到你的下回合开始时,当你成为该势力的其他角色使用的黑色牌的目标后,你摸两张牌。", + oldxiemu_info: "当你成为其他角色使用的黑色牌的目标后,你可以弃置一张【杀】,然后摸两张牌。", + spmengjin_info: "当你使用【杀】指定目标后,你可以弃置目标角色的一张牌。", + fenxun_info: "出牌阶段限一次,你可以弃置一张牌并选择一名其他角色,你于本回合内至其的距离视为1。", + rezhoufu_info: "①出牌阶段限一次。你可以用一张牌对一名其他角色施“咒”,且当其判定时,将“咒”作为判定牌。②一名角色的回合结束时,你令本回合移除过“咒”的角色各失去1点体力。", + reyingbing_info: '锁定技,有“咒”的角色使用与“咒”颜色相同的牌时,你摸一张牌;若这是你第二次因该“咒”摸牌,则你获得该"咒"。', + yingbin_info: "锁定技,有“咒”的角色使用与“咒”花色相同的牌时,你摸一张牌;当你因同一名角色的同一张“咒”的效果摸第二张牌时,移去该“咒”。", + zhoufu_info: "出牌阶段限一次,你可以将一张手牌置于一名没有“咒”的其他角色的武将牌旁,称为“咒”。当有“咒”的角色判定时,其改为将“咒”作为判定牌;一名角色的回合结束时,若有角色于此回合因判定而移除过“咒”,则你令这些角色各失去1点体力。", + yanzheng_info: "若你的手牌数大于你的体力值,则你可以将你装备区内的牌当做【无懈可击】使用。", + kuiwei_info: "结束阶段开始时,你可以摸2+X张牌并翻面。你的下个摸牌阶段开始时,你弃置X张牌(X为当前时机场上所有角色装备区内武器牌数之和)。", + tongji_info: "锁定技。若你的手牌数大于你的体力值,则攻击范围包含你的其他角色使用【杀】时不能指定你以外的角色为目标。", + wangzun_info: "其他角色的准备阶段开始时,你可以摸一张牌。若如此做,该角色此回合的手牌上限-1。然后你不能再发动〖妄尊〗直到回合开始。", + kaikang_info: "当一名角色成为【杀】的目标后,若你至该角色的距离为1,你可以摸一张牌。若如此做,你交给其一张牌并展示之。若为装备牌,该角色可以使用此牌。", + liangzhu_info: "当一名角色于其出牌阶段内回复体力时,你可以选择一项:1、摸一张牌;2、令该角色摸两张牌。", + mingshi_info: "当你受到伤害时,若伤害来源的体力值大于你,你可以弃置一张黑色手牌,令伤害值-1。", + lirang_info: "当你的牌因弃置而置入弃牌堆后,你可以将其中的任意张牌交给其他角色。", + moukui_info: "当你使用【杀】指定目标后,你可以选择一项:摸一张牌,或弃置其一张牌。若如此做,当此【杀】被【闪】抵消时,目标角色弃置你的一张牌。", + qiangwu_info: "出牌阶段,你可以进行判定。若如此做,直到回合结束,你使用点数小于判定结果的【杀】时不受距离限制,且你使用点数大于判定结果的【杀】时无使用次数限制。", + shenxian_info: "每名角色的回合限一次,你的回合外,当有其他角色因弃置而失去基本牌时,你可以摸一张牌。", + oldshenxian_info: "你的回合外,每当有其他角色因弃置而失去基本牌时,你可以摸一张牌。", + qiluan_info: "一名角色的回合结束时,你可以摸3X+Y张牌。(X为你本回合内杀死过的角色数,Y为本回合内其他角色杀死过的角色数)", + //qiluan_info_guozhan:'一名角色的回合结束时,若你于回合内杀死过角色,则你可以摸三张牌。', + zhendu_info: "一名角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若该角色不是你,你对其造成1点伤害。", + //zhendu_info_guozhan:'其他角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若如此做,你对其造成1点伤害。', + shangyi_info: "出牌阶段限一次,你可以观看一名其他角色的手牌,然后弃置其中的一张黑色牌。", + zniaoxiang_info: "锁定技,当你使用【杀】指定目标后,你令目标角色响应此【杀】所需要使用的【闪】的数目+1。", + shoucheng_info: "当一名角色于其回合外失去手牌时,若其没有手牌,则你可令该角色摸一张牌。", + shengxi_info: "弃牌阶段开始时,若你本回合内未造成过伤害,则你可以摸两张牌。", + hengzheng_info: "摸牌阶段开始时,若你的体力值为1或你没有手牌,则你可以放弃摸牌,改为获得每名其他角色区域内的一张牌。", + cunsi_info: "限定技,出牌阶段,你可以将所有手牌交给一名男性角色。该角色获得技能〖勇决〗,然后你将武将牌翻面。", + yongjue_info: "每回合限一次。当其他角色于回合内使用的【杀】结算完成后,若你不是此【杀】的目标角色,则你可以获得之。", + guixiu_info: "当你成为【杀】的目标后,若你的手牌数小于体力值,则你可以摸一张牌。", + fenming_info: "结束阶段开始时,若你处于横置状态,你可以弃置所有处于横置状态的角色的各一张牌。", + duanxie_info: "出牌阶段限一次,你可以令至多X名其他角色横置(X为你已损失的体力值且至少为1),然后你横置。", + xiaoguo_info: "其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。", + sijian_info: "当你失去最后的手牌时,你可以弃置一名其他角色的一张牌。", + suishi_info: "当其他角色进入濒死状态时,伤害来源可以令你摸一张牌;当其他角色死亡时,伤害来源可以令你失去1点体力。", + quji_info: "出牌阶段限一次,你可以弃置X张牌(X为你已损失的体力值),然后令至多X名已受伤的角色各回复1点体力。若你以此法弃置的牌中有黑色牌,你失去1点体力。", + junbing_info: "一名角色的结束阶段开始时,若其手牌数不大于1,该角色可以摸一张牌。若如此做,该角色将所有手牌交给你,然后你交给其等量的牌。", + xiongyi_info: "限定技,出牌阶段,你可以选择任意名角色,这些角色各摸三张牌。然后若你的体力值最小,你回复1点体力。", + xiongyi_info_guozhan: "限定技,出牌阶段,你可以令与你势力相同的所有角色各摸三张牌,然后若你的势力是角色最少的势力(或之一),则你回复1点体力。", + shenzhi_info: "准备阶段开始时,你可以弃置所有手牌。若你以此法弃置的牌数不小于X,你回复1点体力(X为你的体力值)。", + shushen_info: "当你回复1点体力时,你可以令一名其他角色选择回复1点体力或摸两张牌。", + wuji_info: "觉醒技,结束阶段开始时,若你于此回合内造成过3点或更多伤害,你加1点体力上限并回复1点体力,失去〖虎啸〗,然后从场上、牌堆或弃牌堆中获得【青龙偃月刀】。", + xueji_info: "出牌阶段限一次,你可以弃置一张红色牌,然后选择至多X名角色,横置这些角色并对其中一名角色造成1点火焰伤害。(X为你已损失的体力值且至少为1)", + huxiao_info: "锁定技,当你造成火焰伤害后,你令受伤角色摸一张牌,然后你于此回合内对其使用牌没有次数限制。", + aocai_info: "当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌(若你没有手牌则改为四张)。若你观看的牌中有此牌,你可以使用打出之。", + aocai_info_guozhan: "当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌。若你观看的牌中有此牌,你可以使用打出之。", + hongyuan_info: "摸牌阶段,你可以少摸一张牌并指定至多两名其他角色。若如此做,这些角色各摸一张牌。", + hongyuan_info_combat: "摸牌阶段,你可以少摸一张牌。若如此做,其他友方角色各摸一张牌。", + huanshi_info: "一名角色的判定牌生效前,你可令其观看你的手牌。若如此做,该角色选择你的一张牌,你打出此牌代替之。", + mingzhe_info: "当你于回合外使用或打出红色牌,或因弃置失去一张红色牌后,你可以摸一张牌。", + duwu_info: "出牌阶段,你可以弃置X张牌对你攻击范围内的一名其他角色造成1点伤害(X为该角色的体力值)。若该角色因此法进入濒死状态且存活,则你于濒死状态结算后失去1点体力,且本回合不能再发动〖黩武〗。", + tianming_info: "当你成为【杀】的目标时,你可以弃置两张牌(不足则全弃,无牌则不弃),然后摸两张牌;若此时全场体力值最多的角色仅有一名且不是你,该角色也可以如此做。", + mizhao_info: "出牌阶段限一次,你可以将所有手牌交给一名其他角色。若如此做,你令该角色与你指定的另一名有手牌的角色拼点,视为拼点赢的角色对没赢的角色使用一张【杀】。", + yuanhu_info: "结束阶段开始时,你可以将一张装备牌置于一名角色的装备区里,然后根据此装备牌的类型执行以下对应效果。武器牌:弃置该角色距离1以内的一名角色区域中的一张牌;防具牌:该角色摸一张牌;坐骑牌:该角色回复1点体力。", + lihun_info: "出牌阶段限一次,你可以弃置一张牌并选择一名其他男性角色。若如此做,你将武将牌翻面并获得其所有手牌。出牌阶段结束时,你交给其X张牌。(X为该角色的体力值)", + chongzhen_info: "当你因发动〖龙胆〗而使用或打出【杀】或【闪】时,你可以获得对方的一张手牌。", + bifa_info: "结束阶段开始时,你可以将一张手牌移出游戏并指定一名其他角色。该角色的准备阶段开始时,其观看你移出游戏的牌并选择一项:交给你一张与此牌类型相同的手牌并获得此牌;或将此牌置入弃牌堆,然后失去1点体力。", + songci_info: "①出牌阶段,你可以选择一名未以此法选择过的角色。若其手牌数:大于其体力值,其弃置两张牌;不大于其体力值,其摸两张牌。②弃牌阶段结束时,若你已对场上所有存活角色发动过〖颂词①〗,则你摸一张牌。", + yongsi_info: "锁定技。①摸牌阶段,你多摸X张牌。②弃牌阶段开始时,你弃置X张牌。(X为场上势力数)", + yicong_info: "锁定技,当你的体力值大于2时,你计算与其他角色的距离时-1;当你的体力值不大于2时,其他角色计算与你的距离时+1。", + baobian_info: "锁定技,若你的体力值为3或更少,你视为拥有技能〖挑衅〗;若你的体力值为2或更少;你视为拥有技能〖咆哮〗;若你的体力值为1,你视为拥有技能〖神速〗。", + rebaobian: "豹变", + rebaobian_info: "锁定技。当你受到伤害后,你获得以下技能中第一个未拥有的技能:〖挑衅〗/〖咆哮〗/〖神速〗。", + bingzhao: "秉诏", + bingzhao_info: "主公技,游戏开始时,你选择一个其他势力。当你对该势力的角色发动〖骨疽〗时,其可令你额外摸一张牌。", + sunshao: "孙邵", + bizheng: "弼政", + bizheng_info: "摸牌阶段结束时,你可以令一名其他角色摸两张牌。然后,若你的手牌数大于体力上限,你弃置两张牌。若其的手牌数大于体力上限,其弃置两张牌。", + yidian: "佚典", + yidian_info: "当你使用牌选择目标时,若弃牌堆中没有与此牌名称相同的牌,则你可以为此牌增加一个目标(无距离限制)。", + xinlianji: "连计", + xinlianji_info: "出牌阶段限一次,你可以弃置一张手牌,令一名角色使用牌堆中的一张随机武器牌。然后其选择一项:对你指定的一名角色使用一张【杀】,或令你将其装备区里的武器牌交给任意角色。", + xinmoucheng: "谋逞", + xinmoucheng_info: "觉醒技,准备阶段,若有角色因你发动〖连计〗使用【杀】而造成过伤害,则你失去〖连计〗并获得〖矜功〗。", + xinjingong: "矜功", + xinjingong_backup: "矜功", + xinjingong_info: "出牌阶段限一次,你可以将一张【杀】或装备牌当做三张随机锦囊牌中的一张使用。", + caiyang: "蔡阳", + yinka: "印卡", + zhangling: "张陵", + zlhuji: "虎骑", + zlhuji_info: "锁定技,你与其他角色的距离-1,当你于回合外受到伤害后,你可进行判定,若结果为红色,视为你对伤害来源使用一张【杀】(无距离限制)。", + zlshoufu: "授符", + zlshoufu2: "授符", + zlshoufu_info: "出牌阶段限一次,你可摸一张牌,然后将一张手牌置于一名没有【箓】的角色的武将牌上,称为【箓】;其不能使用和打出与【箓】同类型的牌。该角色受到伤害后,或于弃牌阶段弃置至少两张与【箓】同类型的牌后,将【箓】置入弃牌堆。", + ol_zhangchangpu: "OL张昌蒲", + ol_zhangchangpu_prefix: "OL", + olxingshen: "省身", + olxingshen_info: "当你受到伤害后,你可以随机摸至多两张牌。若如此做,你获得X个“省”,且下一次发动〖严教〗展示牌时移去所有“省”并多展示等量的牌。(X为你已损失的体力值,且你至多拥有6个“省”)", + caoshuang: "曹爽", + tuogu: "托孤", + tuogu_info: "限定技,一名角色死亡时,你可以令其选择其武将牌上的一个技能(主公技,限定技,觉醒技,隐匿技、使命技等特殊技能除外),然后你获得其选择的技能。", + retuogu: "托孤", + retuogu_info: "一名角色死亡时,你可以令其选择其武将牌上的一个技能(主公技,限定技,觉醒技,隐匿技、使命技等特殊技能除外),然后你获得其选择的技能并失去上次因〖托孤〗获得的技能。", + shanzhuan: "擅专", + shanzhuan_info: "①当你对其他角色造成伤害后,若其判定区没有延时类锦囊牌,则你可以将其的一张牌置于其的判定区。若此牌不为延时锦囊牌且此牌为:红色,此牌视为【乐不思蜀】;黑色,此牌视为【兵粮寸断】。②回合结束时,若你本回合内未造成伤害,你可摸一张牌。", + spniluan: "逆乱", + spniluan_info: "出牌阶段,你可以将一张黑色牌当做【杀】使用。此【杀】使用结算完成后,若你未因此【杀】造成过伤害,则你令此【杀】不计入使用次数。", + spweiwu: "违忤", + spweiwu_info: "出牌阶段限一次,你可以将一张红色牌当无距离限制的【顺手牵羊】使用。", + spmouzhu: "谋诛", + spmouzhu_backup: "谋诛", + spmouzhu_info: "出牌阶段限一次,你可以选择任意名“距离为1”或“体力值等于你”的其他角色,这些角色依次进行以下结算:交给你一张手牌,然后若其手牌数小于你,则其视为对你使用一张【杀】或【决斗】。", + spyanhuo: "延祸", + spyanhuo_info: "当你死亡时,你可增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。", + xiaoxi: "骁袭", + xiaoxi_info: "当你登场时,你可以视为使用一张【杀】。", + quyi: "麴义", + wolongfengchu: "卧龙凤雏", + youlong: "游龙", + youlong_info: "转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。", + luanfeng: "鸾凤", + //luanfeng_info_fullinfo:'限定技,一名角色进入濒死状态时,若其体力上限不小于你,你可令其回复至3点体力,恢复其被废除的装备栏,令其手牌补至6-X张(X为以此法恢复的装备栏数量),重置其因“改写”使用过的牌名。若该角色是你,重置你因“游龙”使用过的牌名。', + luanfeng_info: "限定技,一名角色进入濒死状态时,若其体力上限不小于你,你可令其回复至3点体力,恢复其被废除的装备栏,令其手牌补至6-X张(X为以此法恢复的装备栏数量)。若该角色是你,重置你因“游龙”使用过的牌名。", + reluanzhan: "乱战", + reluanzhan_add: "乱战", + reluanzhan_remove: "乱战", + reluanzhan_info: "当你受到或造成伤害后,你获得一个“乱”。当你使用【杀】或黑色普通锦囊牌选择目标后,你可为此牌增加至多X个目标。当你使用这些牌指定第一个目标后,若此牌目标数小于X,则你移去X/2(向上取整)个“乱”。(X为“乱”数)", + zhuixi: "追摄", + zhuixi_info: "锁定技,你使用【杀】的次数上限+1。", + reduanbing: "短兵", + reduanbing_info: "你使用【杀】选择目标后,可以为此【杀】增加一名距离为1的额外目标。你对距离为1的角色使用的【杀】需两张【闪】才能抵消。", + refenxun: "奋迅", + refenxun2: "奋迅", + refenxun_info: "出牌阶段限一次,你可以选择一名其他角色,然后本回合你计算与其的距离视为1;结束阶段开始时,若你未对其造成过伤害,你弃一张牌。", + zongyu: "宗预", + zyqiao: "气傲", + zyqiao_info: "每回合限两次。当你成为其他角色使用牌的目标后,你可以弃置其一张牌,然后你弃置一张牌。", + zyqiao_info_guozhan: "每回合限两次。当你成为其他势力的角色使用牌的目标后,你可以弃置其一张牌,然后你弃置一张牌。", + chengshang: "承赏", + chengshang_info: "当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗得到过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。", + chengshang_info_guozhan: "当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗得到过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。", + panshu: "OL潘淑", + panshu_prefix: "OL", + weiyi: "威仪", + weiyi_info: "每名角色限一次。当有角色受到伤害后,你可选择:①若其体力值不小于你,则其失去1点体力。②若其体力值不大于你且其已受伤,则其回复1点体力。", + jinzhi: "锦织", + jinzhi2: "锦织", + jinzhi_info: "当你需要使用或打出一张基本牌时,你可弃置X+1张颜色相同的牌并摸一张牌,然后视为你使用或打出了此牌。(X为你于本轮内发动此技能的次数)", + yanxiao_card: "言笑", + yanxiao_global: "言笑", + yanxiao_card_info: "判定阶段开始时,你获得判定区内的所有牌。", + gz_huangzu: "黄祖", + huangzu: "OL黄祖", + huangzu_prefix: "OL", + wangong: "挽弓", + wangong2: "挽弓", + wangong_info: "锁定技,当你使用基本牌时,你获得如下效果:当你使用下一张牌时,若此牌为【杀】,则此牌无次数和距离限制且伤害+1。", + huangchengyan: "OL黄承彦", + huangchengyan_prefix: "OL", + guanxu: "观虚", + guanxu_info: "出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可将其中一张手牌与牌堆顶五张牌中的一张交换。若如此做,你弃置其手牌中三张花色相同的牌。", + yashi: "雅士", + yashi_info: "当你受到一次伤害后,你可选择一项:1. 令伤害来源的非锁定技无效直到其下个回合开始;2. 对一名其他角色发动〖观虚〗。", + olwuniang: "武娘", + olwuniang_info: "每回合限一次,当你于回合内使用的【杀】结算完成后,若此【杀】对应的目标数为1,则你可以令目标角色选择是否对你使用使用【杀】。你于其选择结算完成后摸一张牌,且本回合内使用【杀】的次数上限+1。", + olxushen: "许身", + olxushen_info: "限定技,当你进入濒死状态时,你可将体力回复至1点并获得技能〖镇南〗。然后若场上没有存活的“关索”,则你可以令一名其他男性角色选择是否将一张武将牌替换为“关索”。", + olzhennan: "镇南", + olzhennan2: "镇南", + olzhennan_info: "【南蛮入侵】对你无效。出牌阶段限一次,你可以将任意张手牌当做【南蛮入侵】对等量的角色使用。", + gaogan: "高干", + juguan: "拒关", + juguan_backup: "拒关", + juguan_info: "出牌阶段限一次,你可将一张手牌当【杀】或【决斗】使用。若受到此牌伤害的角色未在你的下回合开始前对你造成过伤害,你的下个摸牌阶段摸牌数+2。", + duxi: "杜袭", + quxi: "驱徙", + quxi_info: "限定技。出牌阶段结束时,你可跳过下个弃牌阶段并选择两名手牌数不同的其他角色。你将武将牌翻至背面,令这两名角色中手牌数较少的角色获得另一名角色的一张牌并获得一枚“丰”,另一名角色获得一枚“歉”。拥有“丰”/“歉”的角色的摸牌阶段额定摸牌数+1/-1。拥有“丰”/“歉”的角色死亡时,或一轮游戏开始时,你可转移“丰”/“歉”。", + bixiong: "避凶", + bixiong2: "避凶", + bixiong_info: "锁定技,当你于弃牌阶段弃置手牌后,其他角色不能使用与这些牌花色相同的牌指定你为目标直到你的下回合开始。", + fuwei: "扶危", + fuwei_info: "每回合限一次。当你的牌被其他角色弃置或获得后,你可从牌堆中获得一张与此牌名称相同的牌(若没有则改为摸一张牌)。", + yuejian: "约俭", + yuejian_info: "每回合限两次。当其他角色对你使用的牌A结算结束后,你可展示所有手牌。若牌A有花色且你的手牌中没有同花色的牌,则你获得牌A对应的所有实体牌。", + ol_dengzhi: "OL邓芝", + ol_dengzhi_prefix: "OL", + olxiuhao: "修好", + olxiuhao_info: "每回合限一次。当你受到其他角色造成的伤害时,或其他角色受到你造成的伤害时,你可防止此伤害,然后令伤害来源摸两张牌。", + olsujian: "素俭", + olsujian_given: "已分配", + olsujian_info: "锁定技。弃牌阶段开始前,你将此阶段的规则改为:{你选择一项:①将所有不为本回合得到的手牌分配给其他角色。②弃置这些手牌,然后弃置一名其他角色等量的牌}。", + ol_wangrong: "OL王荣", + ol_wangrong_prefix: "OL", + olfengzi: "丰姿", + olfengzi_info: "出牌阶段限一次。当你使用有目标的基本牌或普通锦囊牌时,你可弃置一张与此牌类型相同的牌,然后令此牌结算两次。", + oljizhan: "吉占", + oljizhan_info: "摸牌阶段开始时,你可以放弃摸牌。你亮出牌堆顶的一张牌,并猜测牌堆顶的下一张牌点数大于或小于此牌。若你猜对,你可继续重复此流程。然后你获得以此法展示的所有牌。", + olfusong: "赋颂", + olfusong_info: "当你死亡时,你可以选择一名体力上限大于你的其他角色。其选择获得〖吉占〗或〖丰姿〗。", + zuofen: "左棻", + zhaosong: "诏颂", + zhaosong_info: "一名其他角色的摸牌阶段结束时,若其没有因〖诏颂〗而获得的标记,则你可令其正面向上交给你一张手牌。根据此牌的类型,该角色获得对应的标记和效果:
    锦囊牌:“诔”标记。当拥有者进入濒死状态时,其可弃置所有“诔”,将体力回复至1点并摸一张牌。
    装备牌:“赋”标记。拥有者的出牌阶段开始时,其可弃置所有“赋”,弃置一名角色区域内的至多两张牌。
    基本牌:“颂”标记。当使用者使用仅指定一个目标的【杀】时,其可弃置“颂”,为此【杀】增加至多两个目标。", + lisi: "离思", + lisi_info: "当你于回合外使用的牌结算结束后,你可将其交给一名手牌数不大于你的其他角色。", + ol_yangyi: "杨仪", + oljuanxia: "狷狭", + oljuanxia_info: "结束阶段,你可以选择一名其他角色。你依次视为对其使用至多三种单目标普通锦囊牌。然后其下回合结束时,可视为对你使用等量的【杀】。", + oldingcuo: "定措", + oldingcuo_info: "每回合限一次。当你受到或造成伤害后,你可摸两张牌。若这两张牌颜色不同,则你弃置一张手牌。", + fengfangnv: "OL冯妤", + fengfangnv_prefix: "OL", + zhuangshu: "妆梳", + zhuangshu_info: "①游戏开始时,你可将{【琼梳】,【犀梳】,【金梳】}中的一张牌置于装备区。②一名角色的回合开始时,若其宝物区为空,则你可以弃置一张牌,并根据此牌的类型,按如下关系将一张宝物牌置入该角色的装备区:{<基本牌,【琼梳】>,<锦囊牌,【犀梳】>,<装备牌,【金梳】>}。", + chuiti: "垂涕", + chuiti_info: "每回合限一次。当你或拥有〖妆梳〗牌角色的牌因弃置而进入弃牌堆后,你可使用其中的一张牌。", + zhuangshu_basic: "琼梳", + zhuangshu_basic_bg: "琼", + zhuangshu_basic_info: "当你受到伤害时,你可以弃置X张牌并防止此伤害(X为伤害值)。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。", + zhuangshu_trick: "犀梳", + zhuangshu_trick_bg: "犀", + zhuangshu_trick_info: "判定阶段开始前,你可选择:①跳过此阶段。②跳过本回合的弃牌阶段。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。", + zhuangshu_equip: "金梳", + zhuangshu_equip_bg: "金", + zhuangshu_equip_info: "锁定技。出牌阶段结束时,你将手牌摸至手牌上限(至多摸五张)。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。", + ol_dongzhao: "OL董昭", + ol_dongzhao_prefix: "OL", + olxianlve: "先略", + olxianlve_info: "①主公的回合开始时,你可声明并记录一个锦囊牌的名称并移除先前的记录。②每回合限一次,其他角色使用〖先略〗记录过的锦囊牌后,你可摸两张牌并可以分配给任意其他角色,然后你可声明并记录一个锦囊牌的名称并移除先前的记录。", + olzaowang: "造王", + olzaowang2: "造王", + olzaowang_info: "限定技。出牌阶段,你可以令一名角色加1点体力上限,回复1点体力并摸三张牌,且获得如下效果:主公死亡时,若其身份为忠臣,则其和主公交换身份牌;其死亡时,若其身份为反贼且伤害来源的身份为主公或忠臣,则以主忠胜利结束本局游戏。", + sp_ol_zhanghe: "SP张郃", + sp_ol_zhanghe_prefix: "SP", + spolzhouxuan: "周旋", + spolzhouxuan_info: "①弃牌阶段开始时,你可将任意张置于武将牌上,称为“旋”(你至多拥有五张“旋”)。②当你使用牌时,你随机将一张“旋”置入弃牌堆,然后摸一张牌(若你的手牌数不为全场唯一最多则额外摸X张牌,X为“旋”数)。③出牌阶段结束时,你将所有“旋”置入弃牌堆。", + wuyan: "吾彦", + lanjiang: "澜疆", + lanjiang_info: "结束阶段,你可以选择所有手牌数不小于你的角色。这些角色依次选择是否令你摸一张牌。然后你可以对其中一名手牌数等于你的角色造成1点伤害,随后令其中一名手牌数小于你的角色摸一张牌。", + ol_zhuling: "OL朱灵", + ol_zhuling_prefix: "OL", + jixian: "急陷", + jixian_info: "摸牌阶段结束时,你可以选择一名满足以下至少一项条件的角色:⒈装备区内有防具牌;⒉拥有的普通技能数大于你;⒊体力值等于体力上限。你视为对其使用一张【杀】,然后摸X张牌(X为其于此【杀】结算前满足的条件数);若此【杀】未造成伤害,则你失去1点体力。", + ol_chendeng: "OL陈登", + ol_chendeng_prefix: "OL", + olfengji: "丰积", + olfengji_info: "摸牌阶段开始时,你选择:⒈本回合摸牌阶段的额定摸牌数-1,且令一名其他角色下回合摸牌阶段的额定摸牌数+2;⒉本回合摸牌阶段的额定摸牌数+1。然后你选择:⒈本回合使用【杀】的次数上限-1,且令一名其他角色下回合使用【杀】的次数上限+2;⒉本回合使用【杀】的次数上限+1。", + tianyu: "田豫", + saodi: "扫狄", + saodi_info: "当你使用【杀】或普通锦囊牌指定唯一其他角色为目标时,你可从逆时针方向和顺时针方向中选择一个你与其之间角色最少的方向。你令该方向下你与其之间的所有能成为此牌额外目标的角色均成为此牌的目标。", + zhuitao: "追讨", + zhuitao_info: "①准备阶段,你可选择一名未被〖追讨〗记录过的其他角色。②你至所有〖追讨〗记录过的角色的距离-1。③当你对一名被〖追讨〗记录过的角色造成伤害时,你从〖追讨〗记录里移除该角色。", + fanjiangzhangda_ab: "范疆张达", + fanjiangzhangda: "范强张达", + yuanchou: "怨仇", + yuanchou_info: "锁定技。当你使用黑色【杀】指定目标角色后或成为黑色【杀】的目标角色后,你令目标角色的防具技能无效直到此【杀】被抵消或造成伤害。", + juesheng: "决生", + juesheng_info: "限定技。出牌阶段,你可视为使用一张【决斗】。当你因此【决斗】造成伤害时,你将伤害值改为X(X为目标角色本局游戏内使用过【杀】的数量且至少为1)且令目标角色获得此技能直到其下回合结束。", + qinghegongzhu: "清河公主", + zengou: "谮构", + zengou_info: "当有角色使用【闪】时,若其在你的攻击范围内,则你可以弃置一张非基本牌或失去1点体力,然后取消此【闪】的目标并获得其对应的实体牌。", + qhzhangji: "长姬", + qhzhangji_info: "一名角色的回合结束时,若你本回合内:造成过伤害,则你可以令其摸两张牌;受到过伤害,则你可以令其弃置两张牌。", + sp_menghuo: "SP孟获", + sp_menghuo_prefix: "SP", + spmanwang: "蛮王", + spmanwang_info: "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前等量项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。", + sppanqin: "叛侵", + sppanqin_info: "出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项。", + tengfanglan: "OL滕芳兰", + tengfanglan_prefix: "OL", + luochong: "落宠", + luochong_info: "准备阶段开始时/当你于一回合内首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):⒈令一名角色回复1点体力。⒉令一名角色失去1点体力。⒊令一名角色弃置两张牌。⒋令一名角色摸两张牌。", + aichen: "哀尘", + aichen_info: "锁定技。当你进入濒死状态时,若〖落宠〗中的剩余选项数大于1,则你选择移去〖落宠〗中的一个选项。", + weizi: "卫兹", + yuanzi: "援资", + yuanzi_info: "每轮限一次。其他角色的准备阶段开始时,你可将所有手牌交给该角色。若如此做,当该角色于本回合内造成伤害后,若其手牌数不小于你,则你摸两张牌。", + liejie: "烈节", + liejie_info: "当你受到伤害后,你可以弃置至多三张牌,摸等量的牌,然后可弃置伤害来源的至多X张牌(X为你以此法弃置的红色牌的数量)。", + ruiji: "OL芮姬", + ruiji_prefix: "OL", + qiaoli: "巧力", + qiaoli_info: "出牌阶段各限一次,你可以将一张武器牌/非武器装备牌当作【决斗】使用。若此【决斗】对应的实体牌为武器牌,当你以此【决斗】对目标角色造成伤害后,你摸X张牌(X为此牌的攻击范围),且可以将其中任意张牌分配给其他角色;若此【决斗】对应的实体牌不为武器牌,此牌不可被响应,且你于结束阶段从牌堆中获得一张装备牌。", + qiaoli_given: "已分配", + qingliang: "清靓", + qingliang_info: "每回合限一次,当你成为其他角色使用【杀】或伤害类锦囊牌的唯一目标时,你可展示所有手牌,然后选择一项:⒈你与其各摸一张牌,⒉取消此目标,然后弃置你手牌中一种花色的所有牌。", + chixueqingfeng: "赤血青锋", + chixueqingfeng2: "赤血青锋", + chixueqingfeng_info: "锁定技,当你使用【杀】指定目标后,你令目标角色不能使用或打出手牌且防具技能无效直到此【杀】结算结束。", + wushuangfangtianji: "无双方天戟", + wushuangfangtianji_skill: "无双方天戟", + wushuangfangtianji_info: "当你因执行【杀】的效果而造成伤害后,你可选择一项:⒈摸一张牌;⒉弃置目标角色的一张牌。", + guilongzhanyuedao: "鬼龙斩月刀", + guilongzhanyuedao_info: "锁定技,你使用的红色【杀】不可被响应。", + bintieshuangji: "镔铁双戟", + bintieshuangji_skill: "镔铁双戟", + bintieshuangji_info: "当你使用的【杀】被抵消后,你可失去1点体力。获得此【杀】对应的所有实体牌,摸一张牌,且本回合使用【杀】的次数上限+1。", + linglongshimandai: "玲珑狮蛮带", + linglongshimandai_info: "当你成为其他角色使用的牌的唯一目标后,你可以进行判定。若判定结果为♥,则此牌对你无效。", + linglongshimandai_skill: "玲珑狮蛮带", + hongmianbaihuapao_skill: "红棉百花袍", + hongmianbaihuapao: "红棉百花袍", + hongmianbaihuapao_info: "锁定技,当你受到属性伤害时,防止此伤害。", + qimenbagua: "奇门八卦", + qimenbagua_info: "锁定技,【杀】对你无效。", + guofengyupao: "国风玉袍", + guofengyupao_info: "锁定技,你不是其他角色使用普通锦囊牌的合法目标。", + shufazijinguan: "束发紫金冠", + shufazijinguan_skill: "束发紫金冠", + shufazijinguan_info: "准备阶段,你可以对一名其他角色造成1点伤害。", + sanlve: "三略", + sanlve_skill: "三略", + sanlve_info: "锁定技。你的攻击范围+1。你的手牌上限+1。你使用【杀】的次数上限+1。", + zhaogujing: "照骨镜", + zhaogujing_skill: "照骨镜", + zhaogujing_info: "出牌阶段结束时,你可展示手牌中的一张基本牌或普通锦囊牌,然后你视为使用一张牌名和属性与此牌相同的牌。", + xuwangzhimian: "虚妄之冕", + xuwangzhimian_info: "锁定技,摸牌阶段,你令额定摸牌数+2;你的手牌上限-1。", + ol_puyuan: "OL蒲元", + ol_puyuan_prefix: "OL", + olshengong: "神工", + olshengong_info: "出牌阶段每项限一次。你可以弃置一张武器牌/防具牌/其他装备牌,并发起一次“锻造”。然后你从锻造结果中选择一张牌,置于一名角色的装备区内(可替换原装备)。当有因你发动〖神工〗而加入游戏的牌进入弃牌堆后,你将此牌移出游戏,然后你于当前回合结束后摸一张牌。", + olqisi: "奇思", + olqisi_info: "①游戏开始时,你获得两张副类别不同的牌,并将这些牌置入你的装备区。②摸牌阶段开始时,你可以少摸一张牌并声明一种装备牌的副类别,然后从牌堆或弃牌堆中获得一张该副类别的牌。", + olzhuiji: "追击", + olzhuiji_info: "锁定技。①你至体力值不大于你的角色的距离为1。②当你使用【杀】指定距离为1的角色为目标后,你令其选择一项:⒈弃置一张牌。⒉重铸装备区内的所有牌。", + zhaoyǎn: "OL赵俨", + zhaoyǎn_prefix: "OL", + tongxie: "同协", + tongxie_info: "出牌阶段开始时,你可以选择包括你在内的至多三名角色(你与这些角色均称为“同协角色”)。这些角色中手牌数唯一最少的角色摸一张牌,且你获得如下效果直到你下回合开始:①当有“同协角色”对唯一目标角色使用的【杀】结算结束后,其他“同协角色”可以依次对目标角色使用一张【杀】(无距离和次数限制,且不能再触发此效果)。②当有“同协角色”受到伤害时,其他“同协角色”(本回合内失去过体力的角色除外)可以防止此伤害,失去1点体力。", + jin_zhouchu: "周处", + shanduan: "善断", + shanduan_info: "锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[1,2,3,4]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。", + yilie: "义烈", + yilie_info: "每轮每种牌名限一次。你可以将两张颜色相同的手牌当做任意一种基本牌使用。", + caoxiancaohua: "曹宪曹华", + huamu: "化木", + huamu_info: "当你使用手牌后,若此牌和本回合内上一张被使用的牌颜色不同,则你可以将此牌对应的所有{位于处理区或装备区}的实体牌置于你的武将牌上。这些牌中的黑色牌称为“灵杉”,红色牌称为“玉树”。", + qianmeng: "前盟", + qianmeng_info: "锁定技。当有牌移动事件结算结束后,若有角色的“灵杉”和“玉树”数量发生了变化,且二者数量相等或有一项为0,则你摸一张牌。", + liangyuan: "良缘", + liangyuan_info: "每轮每项各限一次。你可以将场上所有的“灵杉”/“玉树”置于处理区,然后将这些牌当做【酒】/【桃】使用。", + jisi: "羁肆", + jisi_info: "限定技。准备阶段,你可以令一名其他角色获得你武将牌上的一个已发动过的其他技能。然后你弃置所有手牌,并视为对其使用一张【杀】(无距离关系的限制)。", + huojun: "OL霍峻", + huojun_prefix: "OL", + qiongshou: "穷守", + qiongshou_info: "锁定技。①游戏开始时,你废除所有装备栏并摸四张牌。②你的手牌上限+4。", + fenrui: "奋锐", + fenrui_info: "结束阶段,你可以弃置一张牌并恢复一个装备栏。系统检索一张对应的装备牌,你使用之。然后你可以选择一名装备区内牌数小于你的其他角色,对其造成X点伤害(X为你与其装备区内的牌数之差,且每局限一次)。", + wangyan: "王衍", + yangkuang: "阳狂", + yangkuang_info: "当你回复体力后,若你的体力值等于体力上限,则你可以视为使用一张【酒】,然后当前回合角色摸一张牌,你摸一张牌。", + cihuang: "雌黄", + cihuang_info: "当有牌被抵消后,若此牌的目标数为1且此牌的使用者A为当前回合角色,则你可以将一张牌当做一张你本轮内未使用过的属性【杀】或单目标锦囊牌对A使用(不可被响应)。", + sanku: "三窟", + sanku_info: "锁定技。①当你进入濒死状态时,你减1点体力上限,然后将体力回复至体力上限。②当你加体力上限前,取消之。", + dengzhong: "邓忠", + dzkanpo: "勘破", + dzkanpo_info: "①当你因执行【杀】的效果而造成伤害后,你可以观看目标角色的手牌,然后获得其中一张与此【杀】花色相同的牌。②每回合限一次,你可以将一张手牌当做【杀】使用。", + dzgengzhan: "更战", + dzgengzhan_info: "①其他角色的出牌阶段限一次,当有【杀】因弃置而进入弃牌堆后,你可以获得这些【杀】。②其他角色的结束阶段,若其本回合内未使用过【杀】,则你下个出牌阶段使用【杀】的次数上限+1。", + xiahouxuan: "夏侯玄", + olhuanfu: "宦浮", + olhuanfu_info: "当你使用【杀】指定第一个目标后,或成为【杀】的目标后,你可以弃置X张牌(X∈[1, 你的体力上限])。此【杀】结算结束后,若此【杀】累计因执行效果而造成的伤害值等于X,则你摸2X张牌。", + olqingyi: "清议", + olqingyi_info: "①出牌阶段限一次,你可以选择至多两名有牌的其他角色。你和这些角色同时弃置一张牌,然后若这些牌类型均相同,则你重复此流程。②结束阶段开始时,若你本回合内发动〖清议①〗弃置的牌包含两种颜色,则你获得每种颜色的牌各一张。", + olzeyue: "迮阅", + olzeyue_info: "限定技。准备阶段,你可以选择一名于你的上个回合结束后对你造成过伤害的角色A及其武将牌上的一个非锁定技B,令A的B失效。然后每轮游戏开始时,A依次视为对你使用X张【杀】(X为B失效状态下经过的完整轮数)。当你因这些【杀】受到伤害后,你令A恢复技能B。", + xindiaodu: "调度", + xindiaodu_info: "①每回合限一次,与你势力相同的角色使用装备牌时,其可以摸一张牌。②出牌阶段开始时,你可以获得与你势力相同的一名角色装备区内的一张牌,然后你可以将此牌交给另一名与你势力相同的其他角色。", + olhuanshi: "缓释", + olhuanshi_info: "一名角色的判定牌生效前,你可以令其观看你的手牌并选择你的一张牌,你打出此牌代替判定牌。然后你可以重铸任意张牌(每回合限重铸一次)。", + olhongyuan: "弘援", + olhongyuan_info: "每阶段限一次。当你一次性获得至少两张牌以后,你可以将至多两张牌交给等量名角色。", + olmingzhe: "明哲", + olmingzhe_info: "锁定技。当你于出牌阶段外失去红色牌后,你展示这些牌中所有背面朝上移动的牌(没有则不展示),然后摸一张牌。", + ahuinan: "阿会喃", + jueman: "蟨蛮", + jueman_info: "锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均不为你,你视为使用本回合被使用的第三张基本牌;有且仅有其中之一为你,你摸一张牌。", + ol_liuba: "OL刘巴", + ol_liuba_prefix: "OL", + oltongduo: "统度", + oltongduo_info: "准备阶段,你可以令一名角色交给你一张手牌,然后出牌阶段结束时,你将此牌置于牌堆顶。", + olzhubi: "铸币", + olzhubi_tag: "币", + olzhubi_info: "①出牌阶段限X次(X为你的体力上限)。你可以令一名角色重铸一张牌,以此法获得的牌称为“币”。②一名角色的结束阶段,若其有“币”,其观看牌堆底的五张牌,然后可以用任意“币”交换其中等量张牌。", + ol_furong: "傅肜", + olxiaosi: "效死", + olxiaosi_info: "出牌阶段限一次。你可以选择一名有手牌的其他角色并弃置一张基本牌。若其有可被弃置的基本牌,其弃置一张基本牌。然后你可以以任意顺序使用你与其以此法弃置的牌(无距离和次数限制)。最后若其未以此法弃置牌,你摸一张牌。", + zhangzhi: "张芝", + olbixin: "笔心", + olbixin_info: "一名角色的准备阶段或结束阶段,你可以声明一种牌的类型(每种类型限[1]次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸[3]张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。", + olximo: "洗墨", + olximo_info: "锁定技。当你发动〖笔心〗后,你移除其描述的前五个字符。若你已发动三次〖笔心〗,交换中括号中的两个数字,失去〖洗墨〗并获得〖飞白〗。", + olfeibai: "飞白", + olfeibai_info: "转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。", + olqizhou: "绮冑", + olqizhou_info: "锁定技。每个回合开始前,或当你装备区内的牌发生变化后,你失去所有因此技能获得过的额外技能,然后根据你装备区内的花色数获得对应的技能。至少一种:〖短兵〗、至少两种:〖英姿〗、至少三种:〖奋威〗、至少四种:〖澜江〗。", + olshanxi: "闪袭", + olshanxi_info: "出牌阶段限一次。你可以选择一名攻击范围内不包含你的其他角色,展示你与其的至多X张手牌(X为你的空装备栏数)。若这些牌中有【闪】,则你弃置这些【闪】,然后获得对方的一张未展示的牌。", + macheng: "马承", + olchenglie: "骋烈", + olchenglie_info: "当你使用【杀】选择目标后,你可以令至多两名角色也成为此牌目标,并亮出牌堆顶的等同于目标数张牌,然后你可以将一张手牌与其中一张牌交换,将这些牌扣置于每名目标角色武将牌上,称为“骋烈”牌。此牌结算结束后:1.若有红色“骋烈”牌的角色:响应过此【杀】,其交给你一张牌;未响应此【杀】,其回复1点体力;2.有“骋烈”牌的角色将其“骋烈”牌置入弃牌堆。", + quhuang: "屈晃", + olqiejian: "切谏", + olqiejian_info: "当一名角色失去最后的手牌后,你可以摸一张牌,然后令其摸一张牌,你选择一项:1.弃置你或其场上的一张牌;2.你于本轮不能再对其发动此技能。", + olnishou: "泥首", + olnishou_info: "锁定技。当你装备区里的牌进入弃牌堆后,你选择一项:1.将这些牌中第一张能当【闪电】对你使用的牌当【闪电】使用;2.本阶段结束时,你与一名手牌数最少的角色交换手牌。", + zhanghua: "张华", + olbihun: "弼昏", + olbihun_info: "锁定技。当你使用牌指定其他角色为目标时,若你的手牌数大于手牌上限且若此牌的目标数:大于1,取消此目标;为1,其获得此牌。", + olchuanwu: "穿屋", + olchuanwu_info: "锁定技。当你造成或受到伤害后,你令武将牌上的前X个未失效的技能失效直到回合结束。然后你摸等同于你此次失效的技能数张牌(X为你的攻击范围)。", + oljianhe: "剑合", + oljianhe_info: "出牌阶段每名角色限一次。你可以重铸至少两张同名牌或至少两张装备牌,然后令一名角色选择一项:1.重铸等量张与你以此法重铸的牌类型相同的牌;2.受到你造成的1点雷电伤害。", + dongtuna: "董荼那", + oljianman: "鹣蛮", + oljianman_info: "锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均为你,你视为使用其中的一张牌;有且仅有其中之一为你,你弃置另一名使用者一张牌。", + maxiumatie: "马休马铁", + olkenshang: "垦伤", + olkenshang_info: "你可以将任意张牌当【杀】使用,然后你可以将此牌目标改为所有你攻击范围外的角色。此牌结算结束后,若此牌对应的实体牌数大于X,你摸X张牌(X为此牌造成过的伤害值),否则你失去一个技能。", + rekenshang: "垦伤", + rekenshang_info: "你可以将至少两张牌当【杀】使用,然后你可以将此牌目标改为等量名角色。此牌结算结束后,若此牌对应的实体牌数大于此牌造成过的伤害值,你摸一张牌。", + ol_zhujun: "OL朱儁", + ol_zhujun_prefix: "OL", + olcuipo: "摧破", + olcuipo_info: "锁定技。当你使用牌时,若此牌是你本回合使用的第X张牌(X为此牌牌名的字数),则:{若此牌为【杀】或伤害类锦囊牌,则此牌的伤害值基数+1,否则你摸一张牌}。", + ol_zhangyì: "OL张翼", + ol_zhangyì_prefix: "OL", + oldianjun: "殿军", + oldianjun_info: "锁定技。回合结束时,你受到1点无来源伤害,然后执行一个额外的出牌阶段。", + olkangrui: "亢锐", + olkangrui_info: "当一名角色于其回合内首次受到伤害后,你可以摸一张牌并选择一项:1.令其回复1点体力;2.令其于本回合下次造成的伤害+1。然后当其于本回合造成伤害时,其本回合手牌上限基数为0。", + wangguan: "王瓘", + olmiuyan: "谬焰", + olmiuyan_tag: "invisible", + olmiuyan_info: "转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的手牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。", + olshilu: "失路", + olshilu_info: "锁定技。当你受到伤害后,你摸X张牌(X为你的体力值且至多为5)。然后你展示攻击范围内一名角色的一张手牌,令此牌的牌名视为【杀】。", + ol_huban: "OL胡班", + ol_huban_prefix: "OL", + olhuiyun: "晖云", + olhuiyun_tag: "invisible", + olhuiyun_info: "每轮每项各限一次。你可以将一张牌当【火攻】使用。此牌结算结束后,你选择一项,令目标角色选择是否执行:1.使用展示的牌,然后重铸所有手牌;2.使用一张手牌,然后重铸展示牌;3.摸一张牌。", + sunhong: "孙弘", + olxianbi: "险诐", + olxianbi_info: "出牌阶段限一次。你可以选择一名角色,然后将手牌摸至或弃置至等同于其装备区里的牌数(至多摸五张),且当你因此弃置一张牌后,你随机获得弃牌堆中的另一张类型相同的牌。", + olzenrun: "谮润", + olzenrun_info: "每阶段限一次。当你摸牌时,你可以改为获得一名其他角色等量的牌,然后其选择一项:1.摸等量的牌;2.令你本局游戏不能再对其发动〖险诐〗和〖谮润〗。", + luoxian: "罗宪", + oldaili: "带砺", + oldaili_tag: "带砺", + oldaili_info: "一名角色的回合结束时,若你被展示过的手牌数为偶数,则你可以翻面,摸三张牌并展示之。", + zhangshiping: "张世平", + olhongji: "鸿济", + olhongji_info: "每轮每项各限一次。一名角色的准备阶段,若其手牌数最少/最多,你可以令其于本回合第一个摸牌阶段/出牌阶段后执行一个额外的摸牌阶段/出牌阶段(若其条件同时满足则只能选择一项)。", + olxinggu: "行贾", + olxinggu_info: "①游戏开始时,你将牌堆中的三张坐骑牌扣置于武将牌上。②结束阶段,你可以将一张〖行贾①〗牌置于一名其他角色的装备区,然后你从牌堆获得一张♦牌。", + lushi: "卢氏", + olzhuyan: "驻颜", + olzhuyan_info: "每名角色每项各限一次。结束阶段,你可以令一名角色将以下一项调整至与其上一个结束阶段结束后相同:1.体力值;2.手牌数(体力值至多失去至1,手牌数至多摸至5;若其未执行过准备阶段则改为游戏开始时)。", + olleijie: "雷劫", + olleijie_info: "准备阶段,你可以令一名角色判定,若结果为♠2~9,其受到2点雷电伤害,否则其摸两张牌。", + releijie: "雷劫", + releijie_info: "出牌阶段限一次,你可以令一名角色判定,若结果为黑桃2~9,则你视为依次对其使用两张雷【杀】,否则其摸两张牌。", + ol_liuyan: "OL刘焉", + ol_liuyan_prefix: "OL", + olpianan: "偏安", + olpianan_info: "锁定技。游戏开始或弃牌阶段结束时,你弃置所有不为【闪】的手牌(没有则不弃)。若你的手牌数小于体力值,你获得牌堆或弃牌堆中的前X张【闪】(X为你的体力值与手牌数的差)。", + olyinji: "殷积", + olyinji_info: "锁定技。结束阶段,若你的体力值不为唯一最大,你选择回复1点体力或加1点体力上限。", + olkuisi: "窥伺", + olkuisi_info: "锁定技。摸牌阶段开始时,你跳过此阶段,然后观看牌堆顶的四张牌并可以使用其中任意张。若你以此法使用的牌数不为2或3,你减1点体力上限。", + ol_wanglang: "OL王朗", + ol_wanglang_prefix: "OL", + oljici: "激词", + oljici_info: "当你的拼点牌亮出后,若点数不大于X,你可令点数+X并令〖鼓舌〗视为未发动过(X为你的“饶舌”标记数)。", + ol_mengda: "OL孟达", + ol_mengda_prefix: "OL", + olgoude: "苟得", + olgoude_info: "一名角色的回合结束时,若有与你势力相同的角色执行过以下项,则你可以执行这些角色未执行过的一项:1.摸一张牌;2.弃置一名角色的一张手牌;3.使用一张无对应实体牌的【杀】;4.变更势力。", + haopu: "郝普", + olzhenying: "镇荧", + olzhenying_info: "出牌阶段限两次。你可以选择一名手牌数不大于你的其他角色,你与其同时将手牌摸或弃置至至多两张。然后你与其中手牌数较少的角色视为对另一名角色使用一张【决斗】。", + ol_wenqin: "文钦", + olguangao: "犷骜", + olguangao_info: "当你/其他角色使用【杀】时,你/该角色可以额外指定一个目标/你为目标(有距离限制)。然后若你的手牌数为偶数,你摸一张牌并令此牌对任意目标无效(可不选)。", + olhuiqi: "彗企", + olhuiqi_info: "觉醒技。一名角色回合结束后,若你与其他两名角色于此回合成为过牌的目标,你获得〖偕举〗并获得一个额外的回合。", + olxieju: "偕举", + olxieju_info: "出牌阶段限一次。你可以令任意名本回合成为过牌的目标的角色依次视为使用一张【杀】。", + ol_zhouqun: "周群", + oltianhou: "天候", + oltianhou_info: "锁定技。准备阶段,你观看牌堆顶的一张牌,且可以用你的一张牌交换此牌。然后你亮出牌堆顶的牌,令一名角色根据此牌的花色获得对应的技能直到你下个准备阶段开始:♠〖骤雨〗;♥〖烈暑〗;♣〖严霜〗;♦〖凝雾〗。", + olchenshuo: "谶说", + olchenshuo_info: "结束阶段,你可以展示一张手牌,然后亮出牌堆顶的一张牌。若这两张牌类型/花色/点数/牌名字数中任一项相同且已展示的牌数小于3,则你重复此流程,然后获得所有所有展示牌。", + oltianhou_spade: "骤雨", + oltianhou_spade_miehuo: "骤雨", + oltianhou_spade_info: "锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。", + oltianhou_heart: "烈暑", + oltianhou_heart_info: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。", + oltianhou_club: "严霜", + oltianhou_club_info: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。", + oltianhou_diamond: "凝雾", + oltianhou_diamond_info: "锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。", + duanjiong: "段颎", + olsaogu: "扫谷", + olsaogu_info: "转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。", + olcuorui: "挫锐", + olcuorui_info: "锁定技。①游戏开始时,你将手牌摸至场上存活人数张(至多摸至8张)。②当你成为延时锦囊牌的目标后,你跳过下个判定阶段。", + olmouzhu: "谋诛", + olmouzhu_info: "出牌阶段限一次,你可以令一名有手牌的其他角色交给你一张手牌。然后若其手牌数小于你,其视为使用一张【杀】或【决斗】。", + olyanhuo: "延祸", + olyanhuo_info: "当你死亡时,你可以弃置杀死你的角色至多X张牌(X为你的牌数)。", + olniluan: "逆乱", + olniluan_info: "体力值大于你的其他角色的结束阶段,若其本回合内使用过【杀】,则你可以将一张黑色牌当作【杀】对其使用(无距离限制)。", + olxiaoxi: "骁袭", + olxiaoxi_info: "一轮游戏开始时,你可以视为使用一张无距离限制的【杀】。", + ol_qianzhao: "牵招", + olweifu: "威抚", + olweifu_info: "出牌阶段,你可以弃置一张牌并判定。你本回合下次使用与结果类型相同的牌无距离限制,且可以额外指定一个目标。若你弃置的牌与判定牌类型相同,你摸一张牌。", + olkuansai: "款塞", + olkuansai_info: "每回合限一次,当一张牌指定第一个目标后,若目标数不小于你的体力值,你可以令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。", + ol_luyusheng: "OL陆郁生", + ol_luyusheng_prefix: "OL", + olcangxin: "藏心", + olcangxin_info: "锁定技。①当你每回合第一次受到伤害时,你观看牌堆底的三张牌并弃置其中任意张牌,然后此伤害-X。②摸牌阶段开始时,你展示牌堆底的三张牌,然后摸X张牌(X为其中红桃牌的数量)。", + olrunwei: "润微", + olrunwei_info: "其他角色的弃牌阶段开始时,若其已受伤,则你可以选择一项:①令其弃置一张牌,其本回合手牌上限+1;②令其摸一张牌,其本回合手牌上限-1。", + caoxi: "曹羲", + olgangshu: "刚述", + olgangshu_info: "①当你使用非基本牌结算结束后,你可以令以下一项数值+1(每项至多加至5):1.攻击范围;2.受〖刚述〗影响的下个摸牌阶段摸牌数;3.使用【杀】的次数上限。②当有牌被你抵消后,重置你〖刚述①〗增加的所有数值。", + oljianxuan: "谏旋", + oljianxuan_info: "当你受到伤害后,你可以令一名角色摸一张牌,然后若其手牌数等于你〖刚述①〗中的任意一项对应的数值,其重复此流程。", + ol_pengyang: "彭羕", + olxiaofan: "嚣翻", + olxiaofan_info: "当你需要使用不为【无懈可击】的牌时,你可以观看牌堆底的X+1张牌并使用其中的一张。此牌结算结束时,你依次弃置以下前X个区域中的所有牌:⒈判定区、⒉装备区、⒊手牌区(X为本回合你使用过的牌中包含的类型数)。", + oltuishi: "侻失", + oltuishi_info: "锁定技。①你不能使用【无懈可击】。②当你使用点数为字母的牌时,你令此牌无效并摸一张牌,且你对手牌数小于你的角色使用的下一张牌无距离和次数限制。③当你使用伤害类卡牌结算完毕后,若此牌为你本回合使用的第三张或以上未造成伤害的卡牌,则你令〖器翻〗于本回合失效。", + ol_tw_zhangji: "张既", + skill_zhangji_A: "技能", + skill_zhangji_A_info: "出牌阶段限X次(X为你的体力值),当你使用牌指定一名其他角色为目标后,你可以观看其手牌,然后你选择一项:
    1.弃置其一张牌,然后若弃置的牌是能造成火焰伤害的牌,你摸一张牌。
    2.重铸其手牌中的所有【杀】和【决斗】。
    3.若其没有【闪】,你与其互相对对方造成1点伤害。", + skill_zhangji_B: "技能", + skill_zhangji_B_info: "当你受到1点伤害后,你可令一名手牌数小于体力上限的角色摸三张牌,然后其将手牌数弃置至其体力上限数;当你进入濒死状态时,你可令一名其他角色观看五张魏势力武将牌,其可以选择其中一张代替自己的武将牌(体力和体力上限不变)。", + ol_feiyi: "费祎", + yanru: "宴如", + yanru_info: "出牌阶段各限一次,若你的手牌数为:①奇数,你可以摸三张牌,然后弃置至少一半手牌(向下取整);②偶数,你可以弃置至少一半手牌,然后摸三张牌。", + hezhong: "和衷", + hezhong_info: "每回合每项限一次,当你的手牌数变为1后,你可以展示唯一手牌并摸一张牌,然后你选择一项:①本回合使用的下一张点数大于此牌的点数的普通锦囊牌额外结算一次;②本回合使用的下一张点数小于此牌的点数的普通锦囊牌额外结算一次。", + lvboshe: "吕伯奢", + olfushi: "缚豕", + olfushi_info: "①一名角色使用【杀】结算结束后,若你至其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时,你可以将任意张“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并选择X项(X为你以此法重铸的牌数且至多为3):1.你为此【杀】额外指定一个目标;2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-1;3.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后,若此牌被选择的效果选项相邻且此牌的目标角色座位连续,则此【杀】不计入次数限制。", + oldongdao: "东道", + oldongdao_info: "农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。", + zhangyan: "张燕", + olsuji: "肃疾", + olsuji_info: "一名角色的出牌阶段开始时,若其已受伤,你可以将一张黑色牌当【杀】使用。若其受到此【杀】的伤害,你获得其一张牌。", + ollangdao: "狼蹈", + ollangdao_info: "当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:1.令此【杀】伤害基数+1;2.令你可以为此【杀】多选择一个目标;3.令此【杀】不可被响应。然后若没有角色因此【杀】死亡,你移除本次被选择的项。", + ol_dingshangwan: "OL丁尚涴", + ol_dingshangwan_prefix: "OL", + olfudao: "抚悼", + olfudao_info: "①游戏开始时,你摸三张牌,然后可以将至多三张手牌交给一名其他角色,然后可以弃置任意张手牌,最后记录你的手牌数。②一名角色的回合结束时,若其手牌数和你发动〖抚悼①〗记录的数值相同,则你可以与其各摸一张牌。", + olfengyan: "讽言", + olfengyan_info: "锁定技。当你受到其他角色造成的伤害后或响应其他角色使用的牌时,你选择一项:①摸一张牌,然后交给其一张牌。②令其摸一张牌,然后其弃置两张牌。", + ol_liwan: "OL李婉", + ol_liwan_prefix: "OL", + ollianju: "联句", + ollianju_info: "结束阶段,你可以令一名其他角色获得你本回合使用的最后一张牌A对应的所有位于弃牌堆的实体牌并记录A的牌名,然后其下个结束阶段可以令你获得其本回合使用的最后一张牌B对应的所有位于弃牌堆的实体牌,然后若A与B的牌名相同,则你失去1点体力;若A与B的牌名不同,则你可以视为使用A。", + olsilv: "思闾", + olsilv_info: "锁定技,每回合每项限一次,当你获得或失去你发动〖联句〗记录的最后一次牌名的同名牌后,你展示这些牌,然后摸一张牌。", + xueji_old: "血祭", + xueji_old_info: "出牌阶段限一次,你可以弃置一张红色牌并对攻击范围内的至多X名角色各造成1点伤害(X为你已损失的体力值),然后这些角色各摸一张牌。", + oldhuxiao: "虎啸", + oldhuxiao_info: "锁定技,当你使用的【杀】被【闪】抵消后,你令此【杀】不计入使用次数。", + oldwuji: "武继", + oldwuji_info: "觉醒技,结束阶段,若你本回合造成了3点或更多伤害,你加1点体力上限并回复1点体力,并失去技能〖虎啸〗。", + olfeiyang: "飞扬", + //olfeiyang_info:'限定技。准备阶段,你可以弃置两张牌,然后弃置判定区的一张牌。', + olfeiyang_info: "准备阶段,你可以弃置三张牌,然后弃置判定区的一张牌。", + caoyu: "曹宇", + olgongjie: "恭节", + olgongjie_info: "每轮的首个回合开始时,你可以令任意名角色获得你的一张牌,然后你摸X张牌(X为你本次失去的花色数)。", + olxiangxv: "相胥", + olxiangxv_info: "当你的手牌数变为全场最少时,你可以获得以下效果:本回合结束时,将手牌数调整至与当前回合角色手牌数相同(至多摸至五张),然后若你以此法弃置了至少两张手牌,则你回复1点体力。", + olxiangzuo: "襄胙", + olxiangzuo_info: "限定技,当你进入濒死状态时,你可以交给一名其他角色任意张牌,然后若你已对其发动过〖恭节〗和〖相胥〗,你回复等量的体力。", + liyi: "李异", + olchanshuang: "缠双", + olchanshuang_info: "①出牌阶段限一次,你可以选择一名其他角色。你与其依次选择〖缠双③〗的一项,然后你与其依次执行各自选择的项。②结束阶段,若X大于0,你执行〖缠双③〗的前X项(X为你本回合以任意形式执行过的〖缠双③〗的选项数)。③选项:1.重铸一张牌;2.使用一张【杀】;3.弃置两张牌。", + olzhanjin: "蘸金", + olzhanjin_info: "锁定技,若你有空置的武器栏,则你视为装备【贯石斧】。", + tianchou: "田畴", + olshandao: "善刀", + olshandao_info: "出牌阶段限一次,你可以选择任意名角色,你选择这些角色的各一张牌,依次将这些牌放置到牌堆顶,然后你视为对这些角色使用【五谷丰登】,然后你视为对这些角色外的所有其他角色使用【万箭齐发】。", + ol_hujinding: "胡金定", + olqingyuan: "轻缘", + olqingyuan_info: "锁定技。①游戏开始时,或当你于本局游戏首次受到伤害后,你选择一名未以此法选择过的其他角色。②每回合限一次,你发动〖轻缘①〗选择过的角色得到牌后,你随机获得其中一名角色的随机一张手牌。", + olchongshen: "重身", + olchongshen_info: "你可以将本轮得到的红色手牌当作【闪】使用。", + guotu: "郭图", + olqushi: "趋势", + olqushi_info: "出牌阶段限一次,你可以摸一张牌,然后将一张手牌扣置于一名其他角色的武将牌上,称为“趋”。目标角色于其结束阶段移去武将牌上的所有“趋”,若其于本回合使用过与“趋”相同类别的牌,则你摸X张牌(X为其本回合使用牌指定过的目标数之和且至多为5)。", + olweijie: "诿解", + olweijie_info: "回合外每名角色的回合限一次,当你需要使用或打出一张基本牌时,你可以弃置距离为1的一名角色的一张手牌,若此牌牌名与你需要使用或打出的牌的牌名相同,则视为你使用或打出之。", + liupan: "刘磐", + olpijing: "披荆", + olpijing_info: "每回合限一次,当你使用【杀】或普通锦囊牌指定唯一目标后,你可以令至多X名其他角色成为或取消成为此牌的额外目标并依次随机交给你一张牌(X为你已损失的体力值且X至少为1)。这些角色下次使用基本牌或普通锦囊牌指定唯一目标时,其可令你成为此牌的额外目标或摸一张牌。", + ol_lukai: "OL陆凯", + ol_lukai_prefix: "OL", + olxuanzhu: "玄注", + olxuanzhu_info: "转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。", + oljiane: "謇谔", + oljiane_info: "锁定技。①当你对其他角色使用的牌生效后,其本回合无法抵消牌。②当你抵消牌后,你本回合无法成为牌的目标。", + ol_liupi: "刘辟", + olyicheng: "易城", + olyicheng_info: "出牌阶段限一次,你可以展示牌堆顶的X张牌(X为你的体力上限),然后你可以以任意手牌交换其中等量张牌,若这些牌的点数和因此增加,则你可以选择用所有手牌再次交换这些牌。", + sp_sunce: "SP孙策", + sp_sunce_prefix: "SP", + olliantao: "连讨", + olliantao_info: "出牌阶段开始时,你可以令一名其他角色选择一个颜色,然后你依次将此颜色的所有手牌当作【决斗】对其使用直到有一方进入濒死状态,然后你摸X张牌(X为你本次以此法造成的伤害数)。若没有角色因本次技能结算受到伤害,你摸三张牌,本回合手牌上限+3且本回合你不能使用【杀】。", +}; + +export default translates; diff --git a/character/sp/voices.js b/character/sp/voices.js new file mode 100644 index 000000000..29f9b1572 --- /dev/null +++ b/character/sp/voices.js @@ -0,0 +1,799 @@ +export default { + "#olliantao1": "沙场百战疾,争衡天下间。", + "#olliantao2": "征战无休,决胜千里。", + "#sp_sunce:die": "身受百创,力难从心……", + "#olyicheng1": null, + "#olyicheng2": null, + "#ol_liupi:die": "玄德公高义,辟宁死不悔!", + "#olxuanzhu1": "提笔注太玄,佐国定江山。", + "#olxuanzhu2": "总太玄之要,纵弼国之实。", + "#oljiane1": "臣者,未死于战,则死于谏。", + "#oljiane2": "君有弊,坐视之辈甚于外贼。", + "#ol_lukai:die": "注经之人,终寄身于土……", + "#olpijing1": null, + "#olpijing2": null, + "#liupan:die": null, + "#olqushi1": "将军天人之姿,可令四海归心。", + "#olqushi2": "小小锦上之花,难表一腔敬意。", + "#olweijie1": "败战之罪在你,休要多言!", + "#olweijie2": "纵汝舌灿莲花,亦难逃死罪。", + "#guotu:die": "工于心计而不成事,匹夫怀其罪……", + "#olqingyuan1": "男儿重义气,自古轻别离。", + "#olqingyuan2": "缘轻义重,倚东篱而叹长生。", + "#olchongshen1": "妾死则矣,腹中稚婴何辜?", + "#olchongshen2": "身怀六甲,君忘好生之德乎?", + "#ol_hujinding:die": "君无愧于天下,可有悔于妻儿?", + "#olshandao1": "君子藏器,待天时而动。", + "#olshandao2": "善刀而藏之,可解充栋之牛。", + "#tianchou:die": "吾罪大矣,何堪封侯之荣……", + "#olchanshuang1": "武艺精熟,勇冠三军。", + "#olchanshuang2": "以一敌二,易如反掌。", + "#olzhanjin1": "寒光纵横,血战八方!", + "#olzhanjin2": "蘸金霜刃,力贯山河!", + "#liyi:die": "此人竟如此勇猛……", + "#olgongjie1": "身负浩然之气,当以恭节待人。", + "#olgongjie2": "生于帝王之家,不可忘恭失节。", + "#olxiangxv1": "今之大魏,非一家一姓之国。", + "#olxiangxv2": "宇内同庆,奏凯歌于长垣。", + "#olxiangzuo1": "怀济沧海之心,徒拔剑而茫然。", + "#olxiangzuo2": "执三尺之青锋,卫大魏之宗庙。", + "#caoyu:die": "满园秋霜落,一人叹奈何……", + "#ollianju1": null, + "#ollianju2": null, + "#olsilv1": null, + "#olsilv2": null, + "#ol_liwan:die": "生不能同寝,死亦难同穴……", + "#olfudao1": "冰刃入腹,使肝肠寸断。", + "#olfudao2": "失子之殇,世间再无春秋。", + "#olfengyan1": "何不以曹公之命,换我儿之命乎?", + "#olfengyan2": "亲儿丧于宛城,曹公何颜复还?", + "#ol_dingshangwan:die": "今生与曹,不复相见……", + "#olsuji1": "飞燕如风,非快不得破。", + "#olsuji2": "载疾风之势,摧万仞之城。", + "#ollangdao1": "虎踞黑山,望天下百城。", + "#ollangdao2": "狼顾四野,视幽冀为饵。", + "#zhangyan:die": "草莽之辈,难登大雅之堂……", + "#skill_zhangji_A1": null, + "#skill_zhangji_A2": null, + "#skill_zhangji_B1": null, + "#skill_zhangji_B2": null, + "#ol_tw_zhangji:die": null, + "#yanru1": "国有宁日,民有丰年,大同也。", + "#yanru2": "及臻厥成,天下晏如也。", + "#hezhong1": "家和而万事兴,国亦如是。", + "#hezhong2": "你我同殿为臣,理当协力齐心。", + "#ol_feiyi:die": "今为小人所伤,皆酒醉之误……", + "#olfushi1": "缚豕待宰,要让阿瞒吃个肚儿溜圆。", + "#olfushi2": "今儿个呀,咱们吃油汪汪的猪肉!", + "#oldongdao1": "阿瞒远道而来,老夫当尽地主之谊!", + "#oldongdao2": "我乃嵩兄故交,孟德来此可无忧虑。", + "#lvboshe:die": "阿瞒,我沽酒回来……呃!", + "#olcangxin1": null, + "#olcangxin2": null, + "#olrunwei1": null, + "#olrunwei2": null, + "#ol_luyusheng:die": "父亲,郁生甚是想念……", + "#olgangshu1": "羲而立之年,当为立身之事。", + "#olgangshu2": "总六军之要,秉选举之机。", + "#oljianxuan1": "司马氏卧虎藏龙,大兄安能小觑。", + "#oljianxuan2": "兄长以兽为猎,殊不知己亦为猎乎?", + "#caoxi:die": "曹氏亡矣,大魏亡矣!", + "#olxiaofan1": null, + "#olxiaofan2": null, + "#oltuishi1": null, + "#oltuishi2": null, + "#nzry_cunmu_ol_pengyang1": null, + "#nzry_cunmu_ol_pengyang2": null, + "#ol_pengyang:die": null, + "#olweifu1": "蛮人畏威,当束甲抚之。", + "#olweifu2": "以威为抚,可定万世之太平。", + "#olkuansai1": "君既以礼相待,我何干戈相向。", + "#olkuansai2": "我备美酒,待君玉帛。", + "#ol_qianzhao:die": "玄德兄,弟……来迟矣……", + "#cuorui1": "区区乌合之众,如何困得住我?!", + "#cuorui2": "今日就让你见识见识老牛的厉害!", + "#liewei1": "敌阵已乱,速速突围!", + "#liewei2": "杀你,如同捻死一只蚂蚁!", + "#niujin:die": "这包围圈太厚,老牛,尽力了……", + "#mouzhu1": "宦官专权,今必诛之。", + "#mouzhu2": "汝等罪大恶极,快快伏法。", + "#yanhuo1": "乱世,才刚刚开始……", + "#yanhuo2": "你很快就笑不出来了……", + "#hejin:die": "不能遗祸世间……", + "#niluan1": "如果不能功成名就,那就干脆为祸一方!", + "#niluan2": "哈哈哈哈哈,天下之事皆无常!", + "#xiaoxi_hansui1": "先下手为强!", + "#xiaoxi_hansui2": "乌合之众,西凉何惧!", + "#hansui:die": "马侄儿为何……啊!", + "#olsaogu1": "大汉铁骑,必昭卫霍遗风于当年。", + "#olsaogu2": "笑驱百蛮,试问谁敢牧马于中原!", + "#duanjiong:die": "秋霜落,天下寒……", + "#oltianhou1": "雷霆雨露,皆为君恩。", + "#oltianhou2": "天象之所显,世事之所为。", + "#olchenshuo1": "命数玄奥,然吾可言之。", + "#olchenshuo2": "天地神鬼之辩,在吾唇舌之间。", + "#ol_zhouqun:die": "知万物而不知己命,大谬也……", + "#olguangao1": "策马觅封侯,长驱万里之数。", + "#olguangao2": "大丈夫行事,焉能畏首畏尾。", + "#olhuiqi1": "今大星西垂,此天降清君侧之证。", + "#olhuiqi2": "彗星竟于西北,此罚天狼之兆。", + "#ol_wenqin:die": "天不佑国魏!天不佑族文!", + "#olzhenying1": "吾闻世间有忠义,今欲为之。", + "#olzhenying2": "吴虽兵临三郡,普宁死不降。", + "#haopu:die": "徒做奔臣,死无其所……", + "#olgoude1": "蝼蚁尚且偷生,况我大将军乎。", + "#olgoude2": "为保身家性命,做奔臣又如何?", + "#ol_mengda:die": "丞相援军何其远乎?", + "#gushe1": "公既知天命,识时务,为何要兴无名之师,犯我疆界?", + "#gushe2": "你若倒戈卸甲,以礼来降,仍不失封侯之位,国安民乐,岂不美哉?", + "#jici1": "谅尔等腐草之荧光,如何比得上天空之皓月?", + "#jici2": "你……诸葛村夫,你敢!", + "#ol_wanglang:die": "你,你……哇啊……啊……", + "#olpianan1": null, + "#olpianan2": null, + "#olyinji1": null, + "#olyinji2": null, + "#olkuisi1": null, + "#olkuisi2": null, + "#ol_liuyan:die": "背疮难治,世子难继。", + "#olzhuyan1": "心有灵犀,面如不老之椿。", + "#olzhuyan2": "驻颜有术,此间永得芳容。", + "#olleijie1": "雷劫锻体,清瘴涤魂。", + "#olleijie2": "欲得长生,必受此劫。", + "#lushi:die": "人世寻大道,何其愚也……", + "#olhongji1": "玄德公当世人杰,奇货可居。", + "#olhongji2": "张某慕君高义,愿鼎力相助。", + "#olxinggu1": "乱世烽烟,贾者如火中取栗尔。", + "#olxinggu2": "天下动荡,货行千里可易千金。", + "#zhangshiping:die": "奇货犹在,其人老矣……", + "#olxianbi1": "宦海如薄冰,求生逐富贵。", + "#olxianbi2": "吾不欲为鱼肉,故为刀俎。", + "#olzenrun1": "据图谋不轨,今奉诏索命。", + "#olzenrun2": "休妄论芍陂之战,当诛之。", + "#sunhong:die": "诸葛公何至于此……", + "#oldaili1": "国朝倾覆,吾宁当为降虏乎!", + "#oldaili2": "弃百姓之所仰,君子不为也。", + "#luoxian:die": "汉亡矣,命休矣……", + "#olhuiyun1": "舍身饲离火,不负万古名。", + "#olhuiyun2": "义士今犹在,青笺气干云。", + "#ol_huban:die": "无耻鼠辈,吾耻与为伍!", + "#olmiuyan1": "未时引火,必大败蜀军。", + "#olmiuyan2": "我等诈降,必欺姜维于不意。", + "#olshilu1": "吾计不成,吾命何归?", + "#olshilu2": "烟尘四起,无处寻路。", + "#wangguan:die": "我本魏将,将军救我!!", + "#oldianjun1": "大将军勿忧,翼可领后军。", + "#oldianjun2": "诸将速行,某自领军殿后。", + "#olkangrui1": "尔等魍魉,愿试吾剑之利乎?", + "#olkangrui2": "诸君鼓力,克复中原指日可待!", + "#ol_zhangyì:die": "伯约不见疲惫之国力乎?", + "#olcuipo1": "虎贲冯河,何惧千城!", + "#olcuipo2": "长锋在手,万寇辟易。", + "#ol_zhujun:die": "李郭匹夫,安敢辱我!", + "#mashu": null, + "#mashu1": null, + "#mashu2": null, + "#olkenshang1": "择兵选将,一击而大白。", + "#olkenshang2": "纵横三辅,垦伤庸富!", + "#maxiumatie:die": "我兄弟,愿随父帅赴死。", + "#oljianman1": "鹄巡山野,见腐羝而聒鸣!", + "#oljianman2": "我蛮夷也,进退可无矩。", + "#dongtuna:die": "孟获小儿,安敢杀我!", + "#olbihun1": "辅弼天家,以扶朝纲。", + "#olbihun2": "为国治政,尽忠匡辅。", + "#oljianhe1": "身临朝阙,腰悬太阿。", + "#oljianhe2": "位登三事,当配龙泉。", + "#olchuanwu1": "祝融侵库,剑怀远志。", + "#olchuanwu2": "斩蛇穿屋,其志绥远。", + "#zhanghua:die": "桑化为柏,此非不祥乎?", + "#olqiejian1": "东宫不稳,必使众人生异。", + "#olqiejian2": "今三方鼎持,不宜擅动储君。", + "#olnishou1": "臣以泥涂首,足证本心。", + "#olnishou2": "人生百年,终埋一抔黄土。", + "#quhuang:die": "臣死谏于斯,死得其所……", + "#olchenglie1": "策马逐金雕,跨鞍寻天狼!", + "#olchenglie2": "铁蹄踏南北,烈马惊黄沙!", + "#macheng:die": "儿有辱父祖之威名……", + "#olbixin1": "携笔落云藻,文书剖纤毫。", + "#olbixin2": "执纸抒胸臆,挥笔涕汍澜。", + "#olximo1": "帛尽漂洗,以待后用。", + "#olximo2": "故帛无尽,而笔不停也。", + "#olximo3": "以帛为纸,临池习书。", + "#zhangzhi:die": "力透三分,何以言老……", + "#oltongduo1": "上下调度,臣工皆有所为。", + "#oltongduo2": "统筹部划,不糜国利分毫。", + "#olzhubi1": "钱货之通者,在乎币。", + "#olzhubi2": "融金为料,可铸五铢。", + "#ol_liuba:die": "恨未见,铸兵为币之日……", + "#olxiaosi1": "既抱必死之心,焉存偷生之意。", + "#olxiaosi2": "为国效死,死得其所。", + "#ol_furong:die": "吴狗!何有汉将军降者!", + "#jueman1": "伤人之蛇蝎,向来善藏行。", + "#jueman2": "我不欲伤人,奈何人自伤。", + "#ahuinan:die": "什么?大王要杀我?", + "#zhefu1": "非我善妒,实乃汝之过也!", + "#zhefu2": "履行不端者,当有此罚。", + "#yidu1": "彼之砒霜,吾之蜜糖。", + "#yidu2": "巧动心思,以遗他人。", + "#jin_guohuai:die": "我死后,切勿从粲、午之言。", + "#olhuanfu1": "宦海浮沉,莫问前路。", + "#olhuanfu2": "仕途险恶,吉凶难料。", + "#olqingyi1": "布政得失,愿与诸君共议。", + "#olqingyi2": "领军伐谋,还请诸位献策。", + "#olzeyue1": "以令相迮,束阀阅之家。", + "#olzeyue2": "以正相争,清朝野之妒。", + "#xiahouxuan:die": "玉山倾颓心无尘……", + "#dzkanpo1": "兵锋相交,便可知其玄机。", + "#dzkanpo2": "先发一军,以探敌营虚实。", + "#dzgengzhan1": "将无常败,军可常胜。", + "#dzgengzhan2": "前进可活,后退即死。", + "#dengzhong:die": "杀身报国,死得其所。", + "#yangkuang1": "比干忠谏剖心死,箕子披发阳狂生。", + "#yangkuang2": "梅伯数谏遭炮烙,来革顺志而用国。", + "#cihuang1": "腹存经典,口吐雌黄。", + "#cihuang2": "手把玉麈,胸蕴成篇。", + "#sanku1": "纲常难为,应存后路。", + "#sanku2": "世将大乱,当思保全。", + "#wangyan:die": "影摇枭鸱动,三窟难得生。", + "#qiongshou1": "戍守孤城,其势不侵。", + "#qiongshou2": "吾头可得,而城不可得。", + "#fenrui1": "待其疲敝,则可一击破之。", + "#fenrui2": "覆军斩将,便在旦夕之间。", + "#huojun:die": "恨,不能与使君共成霸业……", + "#huamu1": "左杉右树,可共余生。", + "#huamu2": "夫君,当与妾共越此人间之阶!", + "#huamu3": "四月寻春花更香。", + "#huamu4": "一树樱桃带雨红。", + "#huamu5": "山重水复,心有灵犀。", + "#huamu6": "灵之来兮如云。", + "#qianmeng1": "前盟已断,杉树长别。", + "#qianmeng2": "苍山有灵,杉树相依。", + "#liangyuan": null, + "#liangyuan1": "千古奇遇,共剪西窗。", + "#liangyuan2": "金玉良缘,来日方长。", + "#jisi1": "被褐怀玉,天放不羁。", + "#jisi2": "心若野马,不系璇台。", + "#caoxiancaohua:die": "爱恨有泪,聚散无常……", + "#shanduan1": "浪子回头,其期未晚矣!", + "#shanduan2": "心既存蛟虎,秉慧剑斩之!", + "#yilie1": "从来天下义,只在青山中!", + "#yilie2": "沥血染征袍,英名万古存!", + "#jin_zhouchu:die": "死战死谏,死亦可乎!", + "#tongxie1": "分则必败,合则可胜!", + "#tongxie2": "唯同心协力,方可破敌。", + "#zhaoyǎn:die": "援军不至,樊城之围难解……", + "#olshengong1": "技艺若神,大巧不工。", + "#olshengong2": "千锤百炼,始得神兵。", + "#olqisi1": "匠作之道,当佐奇思。", + "#olqisi2": "世无同刃,不循凡矩。", + "#ol_puyuan:die": "锻兵万千,不及造屋二三……", + "#qiaoli1": "别跑,且吃我一斧!", + "#qiaoli2": "让我看看你的能耐。", + "#qingliang1": "挥斧摇清风,笑颜比朝霞。", + "#qingliang2": "素手抚重斧,飞矢擦靓装。", + "#ruiji:die": "这斧头,怎么变这么重了……", + "#yuanzi1": "不过是些身外之物罢了。", + "#yuanzi2": "兹之家资,将军可尽取之。", + "#liejie1": "头可断,然节不可夺。", + "#liejie2": "血可流,而志不可改。", + "#weizi:die": "敌军势众,速退!", + "#luochong1": "宠至莫言非,思移难恃貌。", + "#luochong2": "君王一时情,安有恩长久。", + "#aichen1": "泪干红落面,心结发垂头。", + "#aichen2": "思君一叹息,苦泪无言垂。", + "#tengfanglan:die": "封侯归命,夫妻同归……", + "#spmanwang1": "不服王命,纵兵凶战危,也应以血相偿!", + "#spmanwang2": "夷汉所服,据南中诸郡,当以蛮王为号!", + "#sp_menghuo:die": "有材而得生,无材而得纵……", + "#huaiyuan1": "当怀远志,砥砺奋进。", + "#huaiyuan2": "举有成资,谋有全策。", + "#chongxin1": "非诚不行,无信不立。", + "#chongxin2": "以诚待人,可得其心。", + "#dezhang": null, + "#dezhang1": "以德怀柔,广得军心。", + "#dezhang2": "德彰四海,威震八荒。", + "#jin_yanghu:die": "当断不断,反受其乱……", + "#zengou1": "此书定能置夏侯楙于死地。", + "#zengou2": "夏侯违制,请君上定夺。", + "#qhzhangji1": "魏武有子数十,唯我最长。", + "#qhzhangji2": "长姐为大,众弟怎可悖之?", + "#qinghegongzhu:die": "我言非虚,君上何疑于我?", + "#yuanchou1": "鞭挞之仇,不共戴天!", + "#yuanchou2": "三将军怎可如此对待我二人!", + "#juesheng1": "向死而生,索性拼个鱼死网破!", + "#juesheng2": "张翼德,我二人报仇来了!", + "#fanjiangzhangda:die": "吴侯救我!", + "#saodi1": "狄获悬野,秋风扫之!", + "#saodi2": "戎狄作乱,岂能坐视!", + "#zhuitao1": "敌将休走,汝命休矣!", + "#zhuitao2": "长缨在手,敌寇何逃!", + "#tianyu:die": "命数之沙,已尽矣……", + "#olfengji1": "取舍有道,待机而赢。", + "#olfengji2": "此退彼进,月亏待盈。", + "#ol_chendeng:die": "可无命,不可无脍……", + "#jixian1": "全军出击,速攻敌城。", + "#jixian2": "勿以我为念,攻城!", + "#ol_zhuling:die": "母亲,弟弟,我来了……", + "#lanjiang1": "一人擒虎力,千军拗锋芒。", + "#lanjiang2": "勇力擎四疆,狂澜涌八荒。", + "#wuyan:die": "世间再无擒虎客……", + "#spolzhouxuan1": "详勘细察,洞若观火。", + "#spolzhouxuan2": "知敌底细,方能百战百胜。", + "#sp_ol_zhanghe:die": "我终究是看不透这人心。", + "#olxianlve1": "行略于先,未雨绸缪。", + "#olxianlve2": "先见梧叶,而后知秋。", + "#olzaowang1": "大魏当兴,吾主可王。", + "#olzaowang2": "身加九锡,当君不让。", + "#ol_dongzhao:die": "昭,一心向魏,绝无二心……", + "#zhuangshu1": "殿前妆梳,风姿绝世。", + "#zhuangshu2": "顾影徘徊,丰容靓饰。", + "#chuiti1": "悲愁垂涕,三日不食。", + "#chuiti2": "宜数涕泣,示忧愁也。", + "#fengfangnv:die": "毒妇妒我……", + "#oljuanxia": null, + "#oljuanxia1": "汝有何功,竟能居我之上!", + "#oljuanxia2": "恃才傲立,恩怨必偿。", + "#oldingcuo": null, + "#oldingcuo1": "丞相新丧,吾当继之。", + "#oldingcuo2": "规画分部,筹度粮谷。", + "#ol_yangyi:die": "魏延庸奴,吾,誓杀汝!", + "#zhaosong": null, + "#zhaosong1": "领诏者,可上而颂之。", + "#zhaosong2": "今为诏,以上告下也。", + "#lisi1": "骨肉至亲,化为他人。", + "#lisi2": "梦想魂归,见所思兮。", + "#zuofen:die": "惨怆愁悲……", + "#olfengzi1": "丰姿秀丽,礼法不失。", + "#olfengzi2": "倩影姿态,悄然入心。", + "#oljizhan1": "得吉占之兆,延福运之气。", + "#oljizhan2": "吉占逢时,化险为夷。", + "#olfusong1": "陛下垂爱,妾身方有此位。", + "#olfusong2": "长情颂,君王恩。", + "#ol_wangrong:die": "只求吾儿,一生平安……", + "#olxiuhao1": "吴蜀合同,可御魏敌。", + "#olxiuhao2": "与吴修好,共为唇齿。", + "#olsujian": null, + "#olsujian1": "不苟素俭,不置私产。", + "#olsujian2": "高风亮节,摆袖却金。", + "#ol_dengzhi:die": "修好未成,蜀汉恐危。", + "#wanwei1": "梁、沛之间,非子廉无有今日。", + "#wanwei2": "正使祸至,共死何苦!", + "#yuejian1": "无文绣珠玉,器皆黑漆。", + "#yuejian2": "性情约俭,不尚华丽。", + "#ol_bianfuren:die": "心肝涂地,惊愕断绝……", + "#quxi1": "不自改悔,终须驱徙。", + "#quxi2": "奈何驱徙,不使存活。", + "#bixiong": null, + "#bixiong1": "避凶而从吉,以趋荆州。", + "#bixiong2": "逢凶化吉,遇难成祥。", + "#duxi:die": "避凶不及,难……也……", + "#juguan1": "吾欲自立,举兵拒关。", + "#juguan2": "自立门户,拒关不开。", + "#gaogan:die": "天不助我!", + "#guanxu": null, + "#guanxu1": "不识此阵者,必为所迷。", + "#guanxu2": "虚实相生,变化无穷。", + "#yashi": null, + "#yashi1": "德行贞绝者,谓其雅士。", + "#yashi2": "鸿儒雅士,闻见多矣。", + "#huangchengyan:die": "皆为虚妄……", + "#wangong1": "强弓挽之,以射长箭!", + "#wangong2": "挽弓如月,克定江夏!", + "#huangzu:die": "命也……势也……", + "#weiyi": null, + "#weiyi1": "无威仪者,不可奉社稷。", + "#weiyi2": "有威仪者,进止雍容。", + "#jinzhi1": "织锦为旗,以扬威仪。", + "#jinzhi2": "坐而织锦,立则为仪。", + "#panshu:die": "本为织女,幸蒙帝垂怜……", + "#youlong1": "赤壁献策,再谱春秋!", + "#youlong2": "卧龙出山,谋定万古!", + "#luanfeng1": "凤栖枯木,浴火涅槃!", + "#luanfeng2": "青鸾归宇,雏凤还巢!", + "#wolongfengchu:die": "铁链,东风,也难困这魏军……", + "#mubing1": "兵者,不唯在精,亦在广。", + "#mubing2": "男儿当从军,功名马上取。", + "#ziqu1": "兵马已动,尔等速将粮草缴来。", + "#ziqu2": "留财不留命,留命不留财。", + "#diaoling1": "兵甲已足,当汇集三军。", + "#diaoling2": "临军告急,当遣将急援。", + "#sp_zhangliao:die": "孤军难鸣,进退维谷。", + "#tuogu1": "君托以六尺之孤,爽,当寄百里之命。", + "#tuogu2": "先帝以大事托我,任重而道远。", + "#shanzhuan1": "打入冷宫,禁足绝食。", + "#shanzhuan2": "我言既出,谁敢不从?", + "#caoshuang:die": "悔不该降了司马懿。", + "#yanjiao1": "性矜严教,明于教训。", + "#yanjiao2": "会虽童稚,勤见规诲。", + "#xingshen1": "居上不骄,制节谨度。", + "#xingshen2": "君子之行,皆积小以致高大。", + "#ol_zhangchangpu:die": "我还是小看了,孙氏的伎俩……", + "#zlhuji": null, + "#zlhuji1": "骑虎云游,探求道法。", + "#zlhuji2": "求仙长生,感悟万象。", + "#zlshoufu": null, + "#zlshoufu1": "得授符法,驱鬼灭害。", + "#zlshoufu2": "吾得法器,必斩万恶!", + "#zhangling:die": "远离尘世,脱俗成仙。", + "#yinka": null, + "#yinka1": null, + "#yinka2": null, + "#zhuixi": null, + "#zhuixi1": null, + "#zhuixi2": null, + "#caiyang:die": null, + "#bizheng1": "弼亮四世,正色率下。", + "#bizheng2": "弼佐辅君,国事政法。", + "#yidian": null, + "#yidian1": "无传书卷记,功过自有评。", + "#yidian2": "佚以典传,千秋谁记?", + "#sunshao:die": "此去一别,难见文举……", + "#fenyue1": "逆贼势大,且扎营寨,击其懈怠。", + "#fenyue2": "兵有其变,不在众寡。", + "#huangfusong:die": "吾只恨黄巾未平,不能报效朝廷……", + "#neifa1": "自相恩残,相煎何急。", + "#neifa2": "同室内伐,贻笑外人。", + "#yuantanyuanshang:die": "兄弟难齐心,该有此果……", + "#yuxu1": "誉名浮虚,播流四海。", + "#yuxu2": "誉虚之名,得保一时。", + "#xjshijian1": "国家安危,在于足下。", + "#xjshijian2": "行之得道,即社稷用宁。", + "#xujing:die": "漂薄风波,绝粮茹草。", + "#weicheng1": "略施谋略,敌军便信以为真。", + "#weicheng2": "吾只观雅规,而非说客。", + "#daoshu1": "得此文书,丞相定可高枕无忧。", + "#daoshu2": "让我看看,这是什么机密。", + "#jianggan:die": "丞相,再给我一次机会啊!", + "#xinfu_lingren1": "敌势已缓,休要走了老贼!", + "#xinfu_lingren2": "精兵如炬,困龙难飞!", + "#xinfu_fujian1": "兵者,诡道也。", + "#xinfu_fujian2": "粮资军备,一览无遗。", + "#caoying:die": "曹魏天下存,魂归故土安……", + "#xinfu_jianjie1": "卧龙凤雏,二者得一,可安天下。", + "#xinfu_jianjie2": "公怀王佐之才,宜择人而仕。", + "#xinfu_jianjie3": "二人齐聚,汉室可兴矣。", + "#xinfu_chenghao1": "好,很好,非常好。", + "#xinfu_chenghao2": "您的话也很好。", + "#xinfu_yinshi1": "山野闲散之人,不堪世用。", + "#xinfu_yinshi2": "我老啦,会有胜我十倍的人来帮助你。", + "#simahui:die": "这似乎……没那么好了……", + "#xinfu_wuniang1": "虽为女子身,不输男儿郎。", + "#xinfu_wuniang2": "剑舞轻盈,沙场克敌。", + "#xinfu_xushen1": "救命之恩,涌泉相报。", + "#xinfu_xushen2": "解我危难,报君华彩。", + "#baosanniang:die": "我还想与你,共骑这雪花驹……", + "#jilei1": "食之无肉,弃之有味。", + "#jilei2": "曹公之意我已了然!", + "#danlao1": "我喜欢!", + "#danlao2": "来来,一人一口!", + "#yangxiu:die": "我固自以死之晚也……", + "#bifa1": "笔墨纸砚,皆兵器也!", + "#bifa2": "汝德行败坏,人所不齿也!", + "#songci1": "将军德才兼备,大汉之栋梁也!", + "#songci2": "汝窃国奸贼,人人得而诛之!", + "#chenlin:die": "来人……我的笔呢……", + "#yuanhu1": "将军,这件兵器可还趁手?", + "#yuanhu2": "刀剑无眼,须得小心防护。", + "#yuanhu3": "宝马配英雄!哈哈哈哈……", + "#caohong:die": "福兮祸所伏……", + "#baobian1": null, + "#baobian2": null, + "#xiahouba:die": "弃魏投蜀,死而无憾。", + "#yongsi1": "大汉天下,已半入我手!", + "#yongsi2": "玉玺在手,天下我有。", + "#weidi1": "我才是皇帝!", + "#weidi2": "你们都得听我的号令!", + "#yuanshu:die": "可恶!就差……一步了……", + "#lihun1": "将军~这些都赏给妾身好不好嘛~", + "#lihun2": "这些人家不喜欢嘛~还给你吧~", + "#rebiyue1": "梦蝶幻月,如沫虚妄。", + "#rebiyue2": "水映月明,芙蓉照倩影。", + "#sp_diaochan:die": "父亲大人,对不起……", + "#longdan_sha1": "能进能退,乃真正法器!", + "#longdan_sha2": "吾乃常山赵子龙也!", + "#chongzhen1": "贼将休走,可敢与我一战?", + "#chongzhen2": "陷阵杀敌,一马当先!", + "#sp_zhaoyun:die": "这,就是失败的滋味吗?", + "#tianming1": "朕乃大汉皇帝,天命之子!", + "#tianming2": "皇汉国祚,千年不息!", + "#mizhao1": "爱卿世受皇恩,堪此重任。", + "#mizhao2": "此诏事关重大,切记小心行事。", + "#twzhuiting1": null, + "#twzhuiting2": null, + "#liuxie:die": "为什么,不把复兴汉室的权力交给我……", + "#huanshi1": "缓乐之危急,释兵之困顿。", + "#huanshi2": "尽死生之力,保友邦之安。", + "#hongyuan1": "自舍其身,施于天下。", + "#hongyuan2": "诸将莫慌,粮草已到。", + "#mingzhe1": "明以洞察,哲以保身。", + "#mingzhe2": "塞翁失马,焉知非福。", + "#zhugejin:die": "君臣不相负,来世复君臣。", + "#aocai1": "吾主圣明,泽披臣属。", + "#aocai2": "哼,易如反掌。", + "#duwu1": "破曹大功,正在今朝!", + "#duwu2": "全力攻城!言退者,斩!", + "#zhugeke:die": "重权震主,是我疏忽了。", + "#huxiao": null, + "#huxiao1": "大仇未报,还不能放弃!", + "#huxiao2": "虎父无犬女!", + "#xueji1": "取你首级,祭先父之灵!", + "#xueji2": "取你首级,祭先父之灵!", + "#wuji1": "我感受到了,父亲的力量。", + "#wuji2": "我也要像父亲那样坚强。", + "#guanyinping:die": "父亲,你来救我了吗……", + "#junbing1": "男儿慷慨,军中豪迈。", + "#junbing2": "郡国当有搜狩习战之备。", + "#quji1": "若不去兵之疾,则将何以守国?", + "#quji2": "愿为将士,略尽绵薄。", + "#simalang:die": "微功未效,有辱国恩……", + "#shenxian1": "抚慰军心,以安国事。", + "#shenxian2": "愿尽己力,为君分忧。", + "#qiangwu1": "咆哮沙场,万夫不敌!", + "#qiangwu2": "父亲未尽之业,由我继续!", + "#zhangxingcai:die": "复兴汉室之路,臣妾再也不能陪伴左右了……", + "#moukui1": "你的死期到了。", + "#moukui2": "同归于尽吧。", + "#fuwan:die": "后会有期……", + "#liangzhu1": "吾愿携弩,征战沙场,助君一战!", + "#liangzhu2": "两国结盟,你我都是一家人。", + "#fanxiang1": "今夕一别,不知何日再见。", + "#fanxiang2": "兄命难违,从此两别。", + "#sp_sunshangxiang:die": "东途难归,初心难追。", + "#kaikang1": "典将军,比比看谁杀敌更多!", + "#kaikang2": "父亲快走,有我殿后!", + "#caoang:die": "典将军,还是你赢了……", + "#weikui1": "休整片刻,且随我杀出一条血路。", + "#weikui2": "骑兵列队,准备突围。", + "#lizhan1": "行伍严整,百战不殆。", + "#lizhan2": "敌军围困万千重,我自岿然不动。", + "#sp_caoren:die": "城在人在,城破人亡。", + "#zhoufu1": "违吾咒者,倾死灭亡。", + "#zhoufu2": "咒宝符命,速显威灵。", + "#yingbin1": "所呼立至,所召立前。", + "#yingbin2": "朱雀玄武,誓为我征。", + "#zhangbao:die": "黄天……为何?!", + "#zishu1": "慢着,让我来!", + "#zishu2": "身外之物,不要也罢!", + "#yingyuan1": "接好嘞!", + "#yingyuan2": "好牌只用一次怎么够?", + "#maliang:die": "皇叔为何不听我之言?", + "#gongao1": "恪尽职守,忠心事主。", + "#gongao2": "攻城拔寨,建功立业。", + "#juyi1": "司马氏篡权,我当替天伐之!", + "#juyi2": "司马氏篡权,我当替天伐之!", + "#zhugedan:die": "诸葛一氏定会为我复仇!", + "#kunfen1": "兴蜀需时,众将且勿惫怠!", + "#kunfen2": "纵使困顿难行,亦当砥砺奋进!", + "#fengliang1": "丞相大义,维岂有不从之理?", + "#fengliang2": "得遇丞相,再生之德!", + "#sp_jiangwei:die": "伯约已尽力而为,奈何大汉,国运衰微……", + "#olzhuiji": null, + "#olzhuiji1": null, + "#olzhuiji2": null, + "#ol_shichou1": "灭族之恨,不共戴天!", + "#ol_shichou2": "休想跑!", + "#sp_machao:die": "西凉,回不去了……", + "#canshi1": "众人与蝼蚁何异?哈哈哈……", + "#canshi2": "难道一切不在朕手中?", + "#chouhai1": "哼,树敌三千又如何?", + "#chouhai2": "不发狂,就灭亡!", + "#guiming": null, + "#guiming1": "这就是末世皇帝的不归路!", + "#guiming2": "这是要我命归黄泉吗?", + "#sunhao:die": "命啊!命!", + "#biluan1": "身处乱世,自保足矣。", + "#biluan2": "避一时之乱,求长世安稳。", + "#lixia1": "英雄可安身立命于交州之地。", + "#lixia2": "将军真乃国之栋梁。", + "#shixie:die": "我这一生,足矣……", + "#fengpo1": "对付你,用不着我家哥哥亲自上阵!", + "#fengpo2": "等我提枪上马,打你个落花流水!", + "#mayunlu:die": "呜呜……是你们欺负人……", + "#yishe1": "你有你的权谋,我,哼,自有我的道义。", + "#yishe2": "行大义之举,须有向道之心。", + "#bushi1": "布施行善,乃道义之本。", + "#bushi2": "行布施,得天道。", + "#midao1": "从善从良,从五斗米道。", + "#midao2": "兼济天下,解百姓之忧。", + "#twshijun1": null, + "#twshijun2": null, + "#zhanglu:die": "但,归置于道,无意凡事争斗。", + "#ranshang1": "战火燃尽英雄胆!", + "#ranshang2": "尔等,竟如此歹毒!", + "#hanyong": null, + "#hanyong1": "藤甲军从无对手,不服来战!", + "#hanyong2": "犯我者,杀!", + "#wutugu:die": "撤,快撤!", + "#chenqing1": "陈生死离别之苦,悲乱世之跌宕。", + "#chenqing2": "乱世陈情,字字血泪!", + "#mozhi1": "博闻强识,不辱才女之名。", + "#mozhi2": "今日默书,方恨千卷诗书未能全记。", + "#sp_caiwenji:die": "昨日重现,大漠飞沙。", + "#qirang1": "集母亲之智,效父亲之法,祈以七星。", + "#qirang2": "仙甲既来,岂无仙术乎。", + "#yuhua1": "此乃仙人之物,不可轻弃。", + "#yuhua2": "凤羽飞烟,乘化仙尘。", + "#zhugeguo:die": "方生方死,方死方生。", + "#jieyuan": null, + "#jieyuan1": null, + "#jieyuan2": null, + "#fenxin": null, + "#fenxin1": "杀人,诛心。", + "#fenxin2": "主上,这是最后的机会……", + "#lingju:die": "主上,对不起……", + "#yawang1": "琰,定不负诸位雅望!", + "#yawang2": "君子,当以正气立于乱世。", + "#xunzhi1": "春秋大义,自在我心!", + "#xunzhi2": "成大义者,这点牺牲算不得什么!", + "#cuiyan:die": "尔等,皆是欺世盗名之辈!", + "#wusheng_jsp_guanyu1": "以义传魂,以武入圣!", + "#wusheng_jsp_guanyu2": "义击逆流,武安黎庶。", + "#danji": null, + "#danji1": "单骑护嫂千里,只为桃园之义!", + "#danji2": "独身远涉,赤心归国!", + "#jsp_guanyu:die": "桃园一拜,此生无憾!", + "#jiqiao1": "驭巧器,以取先机。", + "#jiqiao2": "颖悟之人,不以拙力取胜。", + "#linglong1": "哼~书中自有玲珑心~", + "#linglong2": "哼~自然是多多益善咯~", + "#jsp_huangyueying:die": "只恨不能再助夫君了……", + "#meibu": null, + "#meibu1": "若要动手,就请先杀我吧!", + "#meibu2": "萧墙之乱,宫闱之衅,实为吴国之祸啊!", + "#mumu": null, + "#mumu1": "只求相夫教子,不求参政议事。", + "#mumu2": "立储乃国家大事,我们姐妹不便参与。", + "#sunluyu:die": "姐姐,你且好自为之……", + "#fentian1": "烈火燎原,焚天灭地!", + "#fentian2": "骄阳似火,万物无生!", + "#zhiri1": "好舒服,这太阳的力量!", + "#zhiri2": "你以为这样就已经结束了?", + "#hanba:die": "应龙,是你在呼唤我吗……", + "#yinbing1": "将军走此小道,追兵交我应付!", + "#yinbing2": "追兵凶猛,末将断后!", + "#juedi1": "提起武器,最后一搏!", + "#juedi2": "困兽之斗,以全忠义!", + "#zumao:die": "孙将军,已经,安全了吧……", + "#zhenwei1": "江夏防线,固若金汤!", + "#zhenwei2": "再敢来犯,仍叫你无功而返!", + "#wenpin:die": "魏王知遇之恩,今以死相报……", + "#xingwu1": "哼,不要小瞧女孩子哦!", + "#xingwu2": "姐妹齐心,其利断金。", + "#new_luoyan": null, + "#new_luoyan1": null, + "#new_luoyan2": null, + "#daxiaoqiao:die": "伯符,公瑾,请一定要守住我们的江东啊!", + "#zhengnan1": "末将愿承父志,随丞相出征!", + "#zhengnan2": "索全凭丞相差遣,万死不辞!", + "#xiefang": null, + "#xiefang1": null, + "#xiefang2": null, + "#guansuo:die": null, + "#luanzhan1": "受袁氏大恩,当效死力。", + "#luanzhan2": "现,正是我乌桓崛起之机。", + "#tadun:die": "呃……不该趟曹袁之争的浑水……", + "#zhidao1": "乱世之中,能者为王!", + "#zhidao2": "谁有地盘,谁是老大!", + "#jili1": "寄人篱下的日子,不好过呀!", + "#jili2": "这份恩德,白虎记下了!", + "#yanbaihu:die": "严舆吾弟,为兄来陪你了。", + "#shefu1": "圈套已设,埋伏已完,只等敌军进来。", + "#shefu2": "如此天网,量你插翅也难逃。", + "#benyu1": "天下大乱,群雄并起,必有命事。", + "#benyu2": "曹公智略乃上天所授!", + "#chengyu:die": "此诚报效国家之时,吾却休矣。", + "#juesi1": "死都不怕,还能怕你!", + "#juesi2": "抬棺而战,不死不休!", + "#sp_pangde:die": "受魏王厚恩,唯以死报之。", + "#zhenlue1": null, + "#zhenlue2": null, + "#jianshu1": "来,让我看一出好戏吧。", + "#jianshu2": "纵有千军万马,离心则难成大事。", + "#yongdi1": "臣愿为世子,肝脑涂地。", + "#yongdi2": "嫡庶有别,尊卑有序。", + "#sp_jiaxu:die": "立嫡之事,真是取祸之道!", + "#tuifeng1": "摧锋陷阵,以杀贼首!", + "#tuifeng2": "敌锋之锐,我已尽知。", + "#litong:die": "战死沙场,快哉。", + "#ziyuan1": "区区薄礼,万望使君笑纳。", + "#ziyuan2": "雪中送炭,以解君愁。", + "#jugu1": "钱?要多少有多少。", + "#jugu2": "君子爱财,取之有道。", + "#mizhu:die": "劣弟背主,我之罪也。", + "#hongde1": "江南重义,东吴尚德。", + "#hongde2": "德无单行,福必双至。", + "#dingpan": null, + "#dingpan1": "从孙者生,从刘者死!", + "#dingpan2": "多行不义必自毙!", + "#buzhi:die": "交州已定,主公尽可放心。", + "#shanjia1": "缮甲厉兵,伺机而行。", + "#shanjia2": "战,当取精锐之兵,而弃驽钝也。", + "#caochun:die": "银甲在身,竟败于你手!", + "#lianzhu1": "若有不臣之心,定当株连九族。", + "#lianzhu2": "你们都是一条绳上的蚂蚱~", + "#xiehui": null, + "#xiehui1": null, + "#xiehui2": null, + "#dongbai:die": "放肆,我要让爷爷赐你们死罪!", + "#fanghun1": "万花凋落尽,一梅独傲霜。", + "#fanghun2": "暗香疏影处,凌风踏雪来!", + "#fuhan1": "承先父之志,扶汉兴刘。", + "#fuhan2": "天将降大任于我。", + "#zhaoxiang:die": "遁入阴影之中……", + "#fuman1": "恩威并施,蛮夷可为我所用!", + "#fuman2": "发兵器啦!", + "#mazhong:die": "丞相不在,你们竟然……", + "#bingzheng1": "自古,就是邪不胜正!", + "#bingzheng2": "主公面前,岂容小人搬弄是非。", + "#sheyan1": "公事为重,宴席不去也罢。", + "#sheyan2": "还是改日吧。", + "#dongyun:die": "大汉,要亡于宦官之手了……", + "#xiashu1": "吾有密信,特来献于将军。", + "#xiashu2": "将军若不信,可亲自验看!", + "#kuanshi1": "不知者,无罪。", + "#kuanshi2": "罚酒三杯,下不为例。", + "#kanze:die": "我早已做好了牺牲的准备。", + "#qizhou": null, + "#qizhou1": null, + "#qizhou2": null, + "#shanxi1": "敌援未到,需要速战速决!", + "#shanxi2": "快马加鞭,赶在敌人戒备之前!", + "#heqi:die": "别拿走……我的装备!", + "#xiaoguo1": "三军听我号令,不得撤退!", + "#xiaoguo2": "看我先登城头,立下首功!", + "#yuejin:die": "箭疮发作,吾命休矣。", + "#hengzheng1": "老夫进京平乱,岂能空手而归?", + "#hengzheng2": "谁的?都是我的!", + "#sp_dongzhuo:die": "王允老贼,罪该……", + "#zhendu1": "怪只怪你,不该生有皇子!", + "#zhendu2": "后宫之中,岂有你的位置!", + "#qiluan21": "待我召吾兄入宫,谁敢不从?", + "#qiluan22": "本后自有哥哥在外照应,有什么好担心的!", + "#hetaihou:die": "你们男人造的孽,非要说什么红颜祸水……", + "#reduanbing1": null, + "#reduanbing2": null, + "#fenxun": null, + "#fenxun1": "取封侯爵赏,正在今日!", + "#fenxun2": "给我拉过来!", + "#dingfeng:die": "这风,太冷了。", + "#gzjili1": "蒺藜骨朵,威震慑敌!", + "#gzjili2": "看我一招,铁蒺藜骨朵!", + "#shamoke:die": "五溪蛮夷,不可能输!", + "#chuanxin1": "一箭穿心,哪里可逃?", + "#chuanxin2": "穿心之痛,细细品吧,哈哈哈哈!", + "#zfengshi1": "大军压境,还不卸甲受降!", + "#zfengshi2": "放下兵器,饶你不死!", + "#zhangren:die": "老臣,绝不事二主……", + "#wylianji1": "两计扣用,以催强势。", + "#wylianji2": "容老夫细细思量。", + "#moucheng1": "董贼伏诛,天下太平!", + "#moucheng2": "叫天不应,叫地不灵,今天就是你的死期!", + "#wangyun:die": "努力谢关东诸公,勤以国家为念!", + "#qianya1": "君子不妄动,动必有道。", + "#qianya2": "哎!将军过誉了!", + "#shuimeng1": "你我唇齿相依,共御外敌,何如? ", + "#shuimeng2": "今兵薄势寡,可遣某为使往说之。", + "#sunqian:die": "恨不能……得见皇叔早登大宝,咳咳咳……", + "#tiandu_xizhicai1": "既是如此。", + "#tiandu_xizhicai2": "天意,不可逆。", + "#xianfu1": "辅佐明君,从一而终。", + "#xianfu2": "愿为主公,尽我所能。", + "#xianfu3": "赠人玫瑰,手有余香。", + "#xianfu4": "吾于此生,竭尽所能。", + "#xianfu5": "春蚕至死,蜡炬成灰!", + "#xianfu6": "主公之幸,我之幸也。", + "#chouce": null, + "#chouce1": "一筹一划,一策一略。", + "#chouce2": "主公之忧,吾之所思也。", + "#xizhicai:die": "为何……不再给我……一点点时间……", + "#fuqi1": "既来之,休走之!", + "#fuqi2": "白马?哼,定叫他有来无回!", + "#jiaozi1": "今日之获,皆是吾之功劳。", + "#jiaozi2": "今吾于此,尔等皆为飞灰!", + "#quyi:die": "为主公戎马一生,主公为何如此对我!", + "#qingzhong1": "执政为民,当尽我所能。", + "#qingzhong2": "吾自幼流离失所,更能体恤百姓之苦。", + "#weijing1": "战事兴起,最苦的,仍是百姓。", + "#weijing2": "国乃大家,保大家才有小家。", + "#luzhi:die": "年迈力微,是该告老还乡了……", +}; diff --git a/character/sp2.js b/character/sp2.js deleted file mode 100644 index 84d00450c..000000000 --- a/character/sp2.js +++ /dev/null @@ -1,14744 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "sp2", - connect: true, - character: { - star_sunjian: ["male", "qun", "4/5", ["starruijun", "stargangyi"]], - liqueguosi: ["male", "qun", 4, ["xiongsuan"]], - star_zhangchunhua: ["female", "wei", 3, ["starliangyan", "starminghui"]], - star_yuanshao: [ - "male", - "qun", - 4, - ["starxiaoyan", "starzongshi", "starjiaowang", "staraoshi"], - ["zhu"], - ], - star_dongzhuo: ["male", "qun", 5, ["starweilin", "starzhangrong", "starhaoshou"], ["zhu"]], - star_yuanshu: ["male", "qun", 4, ["starcanxi", "starpizhi", "starzhonggu"], ["zhu"]], - star_caoren: ["male", "wei", 4, ["starsujun", "starlifeng"]], - mp_liuling: ["male", "jin", 3, ["mpjiusong", "mpmaotao", "mpbishi"], ["doublegroup:wei:qun:jin"]], - dc_jikang: ["male", "wei", 3, ["new_qingxian", "dcjuexiang"]], - dc_jsp_guanyu: ["male", "wei", 4, ["new_rewusheng", "dcdanji"]], - dc_mengda: ["male", "wei", 4, ["dclibang", "dcwujie"]], - //dc_fuwan:['male','qun',4,['dcmoukui']], - guānning: ["male", "shu", 3, ["dcxiuwen", "longsong"]], - sunhuan: ["male", "wu", 4, ["dcniji"]], - sunlang: ["male", "shu", 4, ["dctingxian", "dcbenshi"]], - shiyi: ["male", "wu", 3, ["dccuichuan", "dczhengxu"]], - dc_hujinding: ["female", "shu", "3/6", ["dcdeshi", "dcwuyuan", "huaizi"]], - liyixiejing: ["male", "wu", 4, ["dcdouzhen"]], - mushun: ["male", "qun", 4, ["dcjinjian", "dcshizhao"]], - dc_zhaoyǎn: ["male", "wei", 3, ["dcfuning", "dcbingji"]], - wangwei: ["male", "qun", 4, ["dcruizhan", "dcshilie"]], - dc_huban: ["male", "wei", 4, ["dcchongyi"]], - niufu: ["male", "qun", "4/7", ["dcxiaoxi", "xiongrao"]], - bianxi: ["male", "wei", 4, ["dunxi"]], - fengfang: ["male", "qun", 3, ["dcditing", "dcbihuo"]], - qinyilu: ["male", "qun", 3, ["piaoping", "tuoxian", "chuaili"]], - yanrou: ["male", "wei", 4, ["choutao", "xiangshu"]], - dc_zhuling: ["male", "wei", 4, ["dczhanyi"]], - licaiwei: ["female", "wei", 3, ["yijiao", "qibie"]], - yanfuren: ["female", "qun", 3, ["channi", "nifu"]], - haomeng: ["male", "qun", 7, ["xiongmang"]], - re_pangdegong: ["male", "qun", 3, ["heqia", "yinyi"]], - hanmeng: ["male", "qun", 4, ["jieliang", "quanjiu"]], - xinping: ["male", "qun", 3, ["fuyuan", "zhongjie", "yongdi"]], - zhangning: ["female", "qun", 3, ["tianze", "difa"]], - tongyuan: ["male", "qun", 4, ["chaofeng", "chuanshu"]], - sp_mifangfushiren: ["male", "shu", 4, ["fengshi"]], - re_nanhualaoxian: ["male", "qun", 4, ["gongxiu", "jinghe"]], - dufuren: ["female", "wei", 3, ["yise", "shunshi"]], - caoanmin: ["male", "wei", 4, ["xianwei"]], - re_zoushi: ["female", "qun", 3, ["rehuoshui", "reqingcheng"]], - qiuliju: ["male", "qun", "4/6", ["koulve", "qljsuiren"]], - re_hucheer: ["male", "qun", 4, ["redaoji", "fuzhong"]], - re_dongcheng: ["male", "qun", 4, ["xuezhao"]], - tangji: ["female", "qun", 3, ["kangge", "jielie"]], - zhangheng: ["male", "qun", 8, ["dangzai", "liangjue"]], - duanwei: ["male", "qun", 4, ["langmie"]], - re_niujin: ["male", "wei", 4, ["recuorui", "reliewei"]], - zhangmiao: ["male", "qun", 4, ["mouni", "zongfan"]], - liangxing: ["male", "qun", 4, ["lulve", "lxzhuixi"]], - caosong: ["male", "wei", 4, ["cslilu", "csyizheng"]], - re_taoqian: ["male", "qun", 3, ["zhaohuo", "reyixiang", "reyirang"]], - zhaozhong: ["male", "qun", 6, ["yangzhong", "huangkong"]], - hanfu: ["male", "qun", 4, ["hfjieying", "weipo"]], - re_quyi: ["male", "qun", 4, ["refuqi", "jiaozi"]], - dongxie: ["female", "qun", 4, ["dcjiaoxia", "dchumei"]], - wangrong: ["female", "qun", 3, ["minsi", "jijing", "zhuide"]], - ol_dingyuan: ["male", "qun", 4, ["cixiao", "xianshuai"]], - re_hejin: ["male", "qun", 4, ["spmouzhu", "spyanhuo"]], - re_hansui: ["male", "qun", 4, ["spniluan", "spweiwu"]], - liuhong: ["male", "qun", 4, ["yujue", "tuxing"]], - zhujun: ["male", "qun", 4, ["gongjian", "kuimang"]], - re_maliang: ["male", "shu", 3, ["rexiemu", "heli"], []], - caobuxing: ["male", "wu", 3, ["moying", "juanhui"], []], - lijue: ["male", "qun", "4/6", ["xinfu_langxi", "xinfu_yisuan"], []], - zhangji: ["male", "qun", 4, ["xinfu_lveming", "xinfu_tunjun"], []], - fanchou: ["male", "qun", 4, ["xinxingluan"], []], - guosi: ["male", "qun", 4, ["xinfu_tanbei", "xinfu_sidao"], []], - lvkai: ["male", "shu", 3, ["xinfu_tunan", "xinfu_bijing"], []], - zhanggong: ["male", "wei", 3, ["xinfu_zhenxing", "xinfu_qianxin"], []], - weiwenzhugezhi: ["male", "wu", 4, ["xinfu_fuhai"], []], - beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia"]], - xurong: ["male", "qun", 4, ["xinfu_xionghuo", "xinfu_shajue"], []], - zhangqiying: ["female", "qun", 3, ["xinfu_falu", "xinfu_dianhua", "xinfu_zhenyi"], []], - sp_liuqi: ["male", "qun", 3, ["rewenji", "sptunjiang"]], - xf_tangzi: ["male", "wei", 4, ["xinfu_xingzhao"], []], - xf_huangquan: ["male", "shu", 3, ["xinfu_dianhu", "xinfu_jianji"], []], - xf_sufei: ["male", "wu", 4, ["xinfu_lianpian"], []], - xushao: ["male", "qun", 4, ["pingjian"]], - xinpi: ["male", "wei", 3, ["xpchijie", "yinju"]], - lisu: ["male", "qun", 2, ["lslixun", "lskuizhu"]], - zhangwen: ["male", "wu", 3, ["songshu", "sibian"]], - mangyachang: ["male", "qun", 4, ["spjiedao"], []], - xugong: ["male", "wu", 3, ["biaozhao", "yechou"], []], - zhangchangpu: ["female", "wei", 3, ["yanjiao", "xingshen"], []], - gaolan: ["male", "qun", 4, ["xiying"]], - sp_shenpei: ["male", "qun", 3, ["gangzhi", "beizhan"]], - xunchen: ["male", "qun", 3, ["fenglve", "mouzhi"], ["clan:颍川荀氏"]], - sp_zhanghe: ["male", "qun", 4, ["yuanlve"]], - sp_xuyou: ["male", "qun", 3, ["spshicai", "spfushi"]], - chunyuqiong: ["male", "qun", 5, ["cangchu", "sushou", "liangying"]], - lvkuanglvxiang: ["male", "qun", 4, ["liehou", "qigong"]], - }, - characterSort: { - sp2: { - sp_whlw: [ - "xurong", - "lijue", - "zhangji", - "fanchou", - "guosi", - "duanwei", - "liangxing", - "zhangheng", - "tangji", - "niufu", - "dongxie", - "liqueguosi", - ], - sp_zlzy: ["zhangqiying", "lvkai", "zhanggong", "weiwenzhugezhi", "beimihu"], - sp_longzhou: ["xf_tangzi", "xf_huangquan", "xf_sufei", "sp_liuqi"], - sp_zizouqi: ["mangyachang", "xugong", "zhangchangpu"], - sp_sbfm: ["lisu", "xinpi", "zhangwen"], - sp_guandu: [ - "sp_zhanghe", - "xunchen", - "sp_shenpei", - "gaolan", - "lvkuanglvxiang", - "chunyuqiong", - "sp_xuyou", - "xinping", - "hanmeng", - ], - sp_qihuan: ["zhaozhong", "re_hejin", "fengfang", "mushun"], - sp_binglin: [ - "re_niujin", - "sp_mifangfushiren", - "licaiwei", - "dc_zhaoyan", - "shiyi", - "sunlang", - "sunhuan", - "dc_mengda", - ], - sp_danqi: [ - "dufuren", - "qinyilu", - "bianxi", - "dc_huban", - "dc_hujinding", - "dc_zhaoyǎn", - "wangwei", - "liyixiejing", - "guānning", - "dc_jsp_guanyu", - ], - sp_fenghuo: ["re_nanhualaoxian", "tongyuan", "zhangning", "re_pangdegong"], - sp_huangjin: ["liuhong", "zhujun", "re_hansui", "xushao"], - sp_fadong: ["ol_dingyuan", "wangrong", "re_quyi", "hanfu"], - sp_xuzhou: ["re_taoqian", "caosong", "zhangmiao", "qiuliju"], - sp_zhongyuan: ["re_hucheer", "re_zoushi", "caoanmin", "re_dongcheng"], - sp_xiaohu: ["haomeng", "yanfuren", "yanrou", "dc_zhuling"], - sp_star: [ - "star_caoren", - "star_yuanshu", - "star_dongzhuo", - "star_yuanshao", - "star_zhangchunhua", - "star_sunjian", - ], - mini_qixian: ["mp_liuling"], - sp2_waitforsort: ["caobuxing", "re_maliang", "dc_jikang"], - }, - }, - skill: { - //星孙坚 - starruijun: { - audio: 2, - trigger: { - player: "useCardToPlayered", - }, - filter(event, player) { - if (event.targets.length > 1) return false; - if ( - player.hasHistory("useCard", evt => { - if (evt === event.getParent()) return false; - const targets = evt.targets; - return targets.length === 1 && targets[0] !== player; - }) - ) - return false; - const target = event.target; - if (target === player || !target.isIn()) return false; - return true; - }, - logTarget: "target", - locked: false, - check(event, player) { - return ( - get.attitude(player, event.target) <= 0 || - !player.hasCard(card => { - return game.hasPlayer(current => { - return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true); - }); - }, "hs") - ); - }, - prompt2(event, player) { - return `摸${get.cnNumber(player.getDamagedHp() + 1)}张牌,令所有除${get.translation(event.target)}外的其他角色不在你的攻击范围内,且你对其造成的伤害逐次增加。`; - }, - async content(event, trigger, player) { - await player.draw(player.getDamagedHp() + 1); - player.addTempSkill("starruijun_effect", "phaseChange"); - player.markAuto("starruijun_effect", trigger.target); - }, - subSkill: { - effect: { - audio: "starruijun", - trigger: { - source: "damageBegin2", - }, - charlotte: true, - forced: true, - onremove: true, - async content(event, trigger, player) { - let num = 1; - const evts = player.getHistory("sourceDamage", evt => { - return evt.source === player && evt.player === trigger.player; - }); - if (evts.length) num += evts.lastItem.num; - trigger.num = Math.min(5, num); - }, - mod: { - inRange(from, to) { - if (!from.getStorage("starruijun_effect").includes(to)) return false; - }, - } - }, - }, - mod: { - aiOrder(player, card, num) { - const event = get.event(); - if (!event || event.type !== "phase") return; - if ( - game.hasPlayer(current => { - return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true) && get.damageEffect(current, player, player) > 0; - }) - ) - return num * 2; - return num / 1.5; - } - }, - }, - stargangyi: { - audio: 2, - trigger: { - source: "damage", - }, - silent: true, - forced: true, - group: "stargangyi_recover", - async content(event, trigger, player) { - player.addTempSkill("stargangyi_access"); - }, - subSkill: { - recover: { - audio: "stargangyi", - trigger: { - player: "recoverBegin", - }, - filter(event, player) { - const evt = event.getParent(3); - if (!player.isDying() || evt.type !== "dying") return false; - return ["tao", "jiu"].includes(event.getParent().name); - }, - forced: true, - async content(event, trigger, player) { - trigger.num++; - }, - }, - access: { - charlotte: true, - }, - }, - mod: { - cardEnabled(card, player) { - if (player.hasSkill("stargangyi_access")) return; - if (player === _status.currentPhase && card.name === "tao") return false; - }, - cardSavable(card, player) { - if (player.hasSkill("stargangyi_access")) return; - if (player === _status.currentPhase && card.name === "tao") return false; - }, - }, - }, - //李傕郭汜 - xiongsuan: { - audio: 2, - enable: "phaseUse", - filterTarget: true, - filterCard: lib.filter.cardDiscardable, - position: "h", - usable: 1, - async content(event, trigger, player) { - const target = event.target; - await target.damage(); - await player.draw(3); - if (target != player) await player.loseHp(); - }, - ai: { - order: 9, - result: { - player(player, target) { - let res = 2 * get.effect(player, { name: "draw" }, player, player); - if (player !== target) - res += get.effect(player, { name: "losehp" }, player, player); - return res; - }, - target(player, target) { - return get.damageEffect(target, player, target); - }, - }, - }, - }, - //张春华 - starliangyan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - chooseButton: { - dialog(event, player) { - const name = get.translation(event.result.targets[0]); - const list = [ - "你摸一张牌,其弃置一张牌", - "你弃置一张牌,其摸一张牌", - "你摸两张牌,其弃置两张牌", - "你弃置两张牌,其摸两张牌", - ].map((item, i) => [i, item]); - const dialog = ui.create.dialog( - `梁燕:请选择你与${name}要执行的选项`, - [list.slice(0, 2), "tdnodes"], - [list.slice(2, 4), "tdnodes"], - "hidden" - ); - return dialog; - }, - filter(button, player) { - const link = button.link; - if (link % 2 === 0) return true; - return player.countDiscardableCards(player, "he") >= (link + 1) / 2; - }, - check(button) { - const player = get.player(), - target = get.event().getParent().result.targets[0]; - const link = button.link; - if (get.attitude(player, target) <= 0 && link === 2) return 100; - const ph = player.countCards("h"), - th = target.countCards("h"); - if (link % 2 === 0) { - const num = link / 2 + 1; - if (ph + num === th - num) return 10; - } else { - const num = (link + 1) / 2; - if (ph - num === th + num) return 10; - } - return 5; - }, - backup(links) { - return { - audio: "starliangyan", - target: get.event().result.targets[0], - link: links[0], - filterTarget(card, player, target) { - return target === lib.skill.starliangyan_backup.target; - }, - selectTarget: -1, - async content(content, trigger, player) { - const target = lib.skill.starliangyan_backup.target; - const link = lib.skill.starliangyan_backup.link; - const num = link <= 1 ? 1 : 2; - const fn = ["draw", "chooseToDiscard"]; - if (link % 2 === 1) fn.reverse(); - await player[fn[0]](num, true, "he"); - await target[fn[1]](num, true, "he"); - if (player.countCards("h") === target.countCards("h")) { - const skipper = [player, target][link % 2]; - skipper.skip("phaseDiscard"); - game.log(skipper, "跳过了下一个", "#y弃牌阶段"); - } - }, - }; - }, - prompt(links) { - return "点击“确定”以执行效果"; - }, - }, - subSkill: { - backup: {}, - }, - ai: { - order(item, player) { - if ( - !game.hasPlayer( - (current) => current !== player && get.attitude(player, current) > 0 - ) && - game.hasPlayer((current) => get.attitude(player, current) <= 0) - ) - return 10; - if ( - game.hasPlayer((current) => { - const del = player.countCards("h") - current.countCards("h"), - toFind = [2, 4].find((num) => Math.abs(del) === num); - if (toFind === 4 && del < 0 && get.attitude(player, current) <= 0) { - return true; - } - return false; - }) - ) - return 10; - return 1; - }, - result: { - target(player, target) { - const del = player.countCards("h") - target.countCards("h"), - toFind = [2, 4].find((num) => Math.abs(del) === num); - if (toFind) { - return ( - (-del * - (get.attitude(player, target) * Math.min(3, target.countCards("h"))) * - toFind) / - 10 - ); - } - return -1; - }, - }, - }, - }, - starminghui: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter(event, player) { - return player.isMinHandcard() || player.isMaxHandcard(); - }, - direct: true, - async content(event, trigger, player) { - let logged = false; - if (player.isMinHandcard()) { - const card = new lib.element.VCard({ - name: "sha", - }); - const result = await player - .chooseUseTarget( - `###${get.prompt("starminghui")}###视为使用一张无距离限制的【杀】`, - card, - false, - "nodistance" - ) - .set("logSkill", "starminghui") - .forResult(); - if (result.bool) logged = true; - } - const num = player.countCards("h"); - if (player.isMaxHandcard() && num > 0) { - const maxNum = game - .findPlayer((current) => { - if (current === player) return false; - return !game.hasPlayer((current2) => { - if (current2 === player) return false; - return current2.countCards("h") > current.countCards("h"); - }); - }) - .countCards("h"); - const leastDiscardNum = num - maxNum + 1; - const prompt = logged ? `是否将手牌弃置至不为最多?` : get.prompt("starminghui"); - const next = player - .chooseToDiscard( - prompt, - `弃置至少${get.cnNumber(leastDiscardNum)}张手牌,然后你令一名角色回复1点体力` - ) - .set("selectCard", [leastDiscardNum, Infinity]) - .set( - "goon", - game.hasPlayer((current) => - get.recoverEffect(current, get.player(), get.player()) - ) - ) - .set("ai", (card) => { - if (!get.event("goon")) return 0; - if (get.tag(card, "recover")) return 0; - if (ui.selected.cards.length === get.event("selectCard")[0] - 1) - return 6.5 - get.value(card); - return 4 - get.value(card); - }); - if (!logged) next.set("logSkill", "starminghui"); - const result = await next.forResult(); - if (!result.bool) return; - if (!player.isUnderControl(true) && !player.isOnline()) await game.asyncDelayx(); - const [bool, targets] = await player - .chooseTarget("令一名角色回复1点体力") - .set("ai", (target) => get.recoverEffect(target, get.player(), get.player())) - .forResult("bool", "targets"); - if (bool) { - const target = targets[0]; - player.line(target, "green"); - await target.recover(); - } - } - }, - }, - //星袁绍 - starxiaoyan: { - audio: 2, - trigger: { - global: "phaseBefore", - player: ["enterGame" /*,'logSkill'*/], - }, - filter(event, player) { - if (!game.hasPlayer((current) => current != player)) return false; - //if(event.name=='logSkill'&&evt.skill!='starjiaowang') return false; - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - async content(event, trigger, player) { - let targets = game.filterPlayer((current) => current != player); - player.line(targets); - for (const target of targets) await target.damage("fire"); - targets = targets.filter((i) => i.isIn()); - if (targets.length) { - for (const target of targets) { - if (!target.countCards("he")) continue; - const { - result: { bool }, - } = await target - .chooseToGive("he", player) - .set( - "prompt", - "是否交给" + - get.translation(player) + - "一张牌" + - (target.isDamaged() ? "并回复1点体力" : "") + - "?" - ) - .set("ai", (card) => { - const target = get.event("player"), - player = get.event("target"); - const att = get.attitude(target, player); - if (get.recoverEffect(target, target, target) <= 0) { - if (att <= 0) return -get.value(card); - return 0; - } - return 7 - get.value(card); - }) - .set("target", player); - if (bool) await target.recover(); - } - } - }, - }, - starzongshi: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - const cards = player.getCards("h", (card) => { - const type = get.type(card, player); - if (type != "basic" && type != "trick") return false; - return ( - lib.filter.cardUsable(card, player) && - game.hasPlayer((target) => { - return lib.filter.targetEnabled2( - card, - player, - target - ) /*&&lib.filter.targetInRange(card,player,target)*/; - }) - ); - }); - if (!cards.length) return false; - return cards.some((card) => { - const cardss = player.getCards( - "h", - (cardx) => card != cardx && get.suit(card, player) == get.suit(cardx, player) - ); - return ( - cardss.length && - !cardss.some( - (cardx) => !game.checkMod(cardx, player, "unchanged", "cardEnabled2", player) - ) - ); - }); - }, - filterCard(card, player) { - if (ui.selected.cards.length) return false; - const cards = player.getCards("h", (card) => { - const type = get.type(card, player); - if (type != "basic" && type != "trick") return false; - return ( - lib.filter.cardUsable(card, player) && - game.hasPlayer((target) => { - return lib.filter.targetEnabled2( - card, - player, - target - ) /*&&lib.filter.targetInRange(card,player,target)*/; - }) - ); - }); - if (!cards.includes(card)) return false; - const cardss = player.getCards( - "h", - (cardx) => card != cardx && get.suit(card, player) == get.suit(cardx, player) - ); - return ( - cardss.length && - !cardss.some( - (cardx) => !game.checkMod(cardx, player, "unchanged", "cardEnabled2", player) - ) - ); - }, - selectCard: [1, 2], - complexCard: true, - check(card) { - const player = get.event("player"), - select = get.copy(get.info(card).selectTarget); - let range; - if (select == undefined) range = [1, 1]; - else if (typeof select == "number") range = [select, select]; - else if (get.itemtype(select) == "select") range = select; - else if (typeof select == "function") range = select(card, player); - game.checkMod(card, player, range, "selectTarget", player); - const cards = player.getCards( - "h", - (cardx) => card != cardx && get.suit(card, player) == get.suit(cardx, player) - ); - let targets = game.filterPlayer( - (target) => - lib.filter.targetEnabled2( - card, - player, - target - ) /*&&lib.filter.targetInRange(card,player,target)*/ && - get.effect(target, card, player, player) > 0 - ); - const max = range[1], - max2 = Math.min(cards.length, targets.length); - if (max > max2) return 0; - targets = targets - .sort( - (a, b) => - get.effect(b, card, player, player) - get.effect(a, card, player, player) - ) - .slice(0, max2); - const sum = targets.reduce( - (num, target) => num + get.effect(target, card, player, player), - 0 - ); - if (max == -1) { - if ( - game - .filterPlayer((target) => { - return lib.filter.targetEnabled2( - card, - player, - target - ) /*&&lib.filter.targetInRange(card,player,target)*/; - }) - .reduce((num, target) => num + get.effect(target, card, player, player), 0) > - sum - ) - return 0; - } - return sum; - }, - position: "h", - discard: false, - lose: false, - delay: false, - async content(event, trigger, player) { - const card = event.cards[0], - cards = player.getCards( - "h", - (cardx) => card != cardx && get.suit(card, player) == get.suit(cardx, player) - ); - await player.showCards([card], get.translation(player) + "发动了【纵势】"); - const cardx = new lib.element.VCard({ - name: get.name(card, player), - nature: get.nature(card, player), - cards: cards, - }); - const { - result: { bool, targets }, - } = await player - .chooseTarget((card, player, target) => { - //return player.canUse(get.event('cardx'),target); - return lib.filter.targetEnabled2( - get.event("cardx"), - player, - target - ) /*&&lib.filter.targetInRange(get.event('cardx'),player,target)*/; - }, true) - .set("cardx", cardx) - .set("selectTarget", [1, cards.length]) - .set( - "prompt", - "请选择" + - (game.hasNature(cardx) ? get.translation(get.nature(cardx)) : "") + - "【" + - get.translation(cardx) + - "】(" + - get.translation(cards) + - ")的目标" - ) - .set("ai", (target) => { - const player = get.event("player"), - card = get.event("cardx"); - return get.effect(target, card, player, player); - }); - if (bool) player.useCard(cardx, cards, targets.sortBySeat()); - }, - ai: { - order: 9, - result: { player: 1 }, - }, - }, - starjiaowang: { - audio: 2, - trigger: { global: "roundStart" }, - filter(event, player) { - if (game.roundNumber <= 1) return false; - const history = game.getAllGlobalHistory(); - for (let i = history.length - 2; i >= 0; i--) { - const evt = history[i]["everything"]; - for (let j = evt.length - 1; j >= 0; j--) { - if (evt[j].name == "die" && evt[j].getParent(3).name != "starxiaoyan") - return false; - } - if (history[i].isRound) break; - } - return true; - }, - forced: true, - async content(event, trigger, player) { - await player.loseHp(); - if (game.hasPlayer((current) => current != player)) - player.useResult({ skill: "starxiaoyan" }, event); - }, - }, - staraoshi: { - audio: 2, - zhuSkill: true, - global: "staraoshi_global", - subSkill: { - global: { - audio: "staraoshi", - forceaudio: true, - enable: "phaseUse", - filter(event, player) { - return ( - player.group == "qun" && - game.hasPlayer((target) => - lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target) - ) - ); - }, - filterTarget(card, player, target) { - return target != player && target.hasZhuSkill("staraoshi"); - }, - prompt() { - const player = get.event("player"); - const targets = game.filterPlayer((target) => - lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target) - ); - return ( - "交给" + - get.translation(targets) + - (targets.length > 1 ? "中的一人" : "") + - "一张手牌,然后其可以发动一次【纵势】" - ); - }, - filterCard: true, - check(card) { - const player = get.event("player"); - const target = game - .filterPlayer((target) => { - return lib.skill.staraoshi.subSkill.global.filterTarget( - null, - player, - target - ); - }) - .sort((a, b) => b.countCards("h") - a.countCards("h"))[0]; - return target.getUseValue(card); - }, - discard: false, - lose: false, - delay: false, - usable: 1, - async content(event, trigger, player) { - const target = event.target, - info = get.info("starzongshi"); - await player.give(event.cards, target); - const { - result: { bool, cards }, - } = await target - .chooseCard(info.position, (card, player) => { - return get.event("info").filterCard(card, player); - }) - .set("info", info) - .set("ai", (card) => get.event("info").check(card)) - .set("selectCard", [1, 2]) - .set("complexCard", true) - .set("prompt", get.prompt("starzongshi")) - .set("prompt2", lib.translate.starzongshi_info.slice(8).slice(0, -1)); - if (bool) target.useResult({ skill: "starzongshi", cards: cards }, event); - }, - ai: { - order: 9, - result: { - target(player, target) { - return target.countCards("h") + 1; - }, - }, - }, - }, - }, - }, - //星董卓 - starweilin: { - audio: 2, - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - return ( - !event.player.getHistory("damage").length && - player.getHistory("useCard").length >= event.player.getHp() - ); - }, - forced: true, - logTarget: "player", - content: function () { - trigger.num++; - }, - }, - starzhangrong: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return player.getHp() > 0; - }, - direct: true, - content: function* (event, map) { - var player = map.player; - var str = get.cnNumber(player.getHp()); - var choiceList = [ - "令至多" + str + "名体力值大于等于你的角色各失去1点体力", - "令至多" + str + "名手牌数大于等于你的角色各弃置一张手牌", - ], - list = ["cancel2"]; - if ( - game.hasPlayer((target) => { - if (target == player) - return player.countCards("h", (card) => - lib.filter.cardDiscardable(card, player) - ); - return target.countCards("h") >= Math.max(1, player.countCards("h")); - }) - ) - list.unshift("弃牌"); - else choiceList[1] = '' + choiceList[1] + ""; - list.unshift("扣血"); - var result = yield player - .chooseControl(list) - .set( - "prompt", - "###" + - get.prompt("starzhangrong") + - "###选择其中一项令任意名符合条件的角色执行,然后你摸等量的牌,回合结束时,若这些角色中有本回合未受到过伤害的角色,则你失去1点体力" - ) - .set("ai", () => { - var player = _status.event.player; - var controls = _status.event.controls.slice(); - /* - var cards=player.getCards('hes',card=>get.tag(card,'damage')&&player.hasValueTarget(card)); - var cardx=cards.filter(card=>get.name(card)=='sha'); - cardx.sort((a,b)=>player.getUseValue(b)-player.getUseValue(a)); - cardx=cardx.slice(Math.min(cardx.length,player.getCardUsable('sha')),cardx.length); - cards.removeArray(cardx); - */ - var targets1 = game.filterPlayer( - (target) => - get.attitude(player, target) < 0 && - target.getHp() >= player.getHp() && - get.effect(target, { name: "losehp" }, player, player) > - 0 /*&&cards.some(card=>player.canUse(card,target))*/ - ); - _status.starzhangrong_check = true; - var targets2 = game.filterPlayer( - (target) => - get.attitude(player, target) < 0 && - target.countCards("h") >= Math.max(1, player.countCards("h")) && - get.effect(target, { name: "guohe_copy2" }, player, player) > - 0 /*&&cards.some(card=>player.canUse(card,target))*/ - ); - delete _status.starzhangrong_check; - [targets1, targets2].forEach((list) => { - list.sort((a, b) => get.damageEffect(b) - get.damageEffect(a)); - list = list.slice(0, Math.min(player.getHp() /*,cards.length*/)); - }); - if (!controls.includes("弃牌")) return 1 - get.sgn(targets1.length); - return Math.max(0, get.sgn(targets2.length - targets1.length)); - }) - .set("choiceList", choiceList); - if (result.control != "cancel2") { - var choice = result.index; - var result2 = yield player - .chooseTarget( - [1, player.getHp()], - "请选择【掌戎】的目标", - "令至多" + - str + - "名" + - (choice ? "手牌数" : "体力值") + - "大于你的角色各" + - (choice ? "弃置一张手牌" : "失去1点体力"), - (card, player, target) => { - var name = _status.event.card.name; - if (name == "guohe_copy2") { - if (target == player) - return player.countCards("h", (card) => - lib.filter.cardDiscardable(card, player) - ); - return target.countCards("h") >= Math.max(1, player.countCards("h")); - } - return target.getHp() >= player.getHp(); - } - ) - .set("ai", (target) => { - var player = _status.event.player; - if (get.attitude(player, target) >= 0) return 0; - return get.effect(target, _status.event.card, player, player); - }) - .set("card", { name: choice ? "guohe_copy2" : "losehp" }); - if (result2.bool) { - var targets = result2.targets.sortBySeat(); - player.logSkill("starzhangrong", targets); - targets.forEach((target) => { - target.addTempSkill("starzhangrong_threaten"); - if (choice) target.chooseToDiscard("h", true); - else target.loseHp(); - }); - player.draw(targets.length); - player - .when("phaseEnd") - .then(() => { - targets.forEach((target) => target.removeSkill("starzhangrong_threaten")); - var targetx = targets.filter( - (target) => !target.getHistory("damage").length - ); - if (targetx.length) { - targetx.forEach((target) => target.chat("乐")); - player.popup("杯具"); - player.loseHp(); - return; - } - player.popup("洗具"); - }) - .vars({ targets: targets }); - } - } - }, - global: "starzhangrong_check", - subSkill: { - check: { - mod: { - canBeDiscarded: function (card, player, target) { - if (!_status.starzhangrong_check) return; - if (player.hasSkill("starzhangrong") && get.position(card) != "h") - return false; - }, - }, - }, - threaten: { - charlotte: true, - trigger: { player: "damageEnd" }, - firstDo: true, - forced: true, - popup: false, - content: function () { - player.removeSkill("starzhangrong_threaten"); - }, - ai: { threaten: 114514 + 1919810 }, - mark: true, - markimage: "image/card/sha.png", - intro: { content: "我还没受到伤害哟!" }, - }, - }, - }, - starhaoshou: { - unique: true, - audio: 2, - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return ( - event.player != player && - event.card.name == "jiu" && - player.isDamaged() && - event.player.group == "qun" - ); - }, - direct: true, - zhuSkill: true, - content: function* (event, map) { - var player = map.player, - target = map.trigger.player; - var result = yield target - .chooseBool( - get.prompt("starhaoshou", player), - "令" + get.translation(player) + "回复1点体力" - ) - .set("choice", get.recoverEffect(player, target, target) > 0); - if (result.bool) { - target.line(player); - player.logSkill("starhaoshou"); - player.recover(); - } - }, - //global:'starhaoshou_global', - subSkill: { - global: { - audio: "starhaoshou", - forceaudio: true, - filter: function (event, player) { - if ( - !player.countCards("hes", (card) => { - if (get.position(card) == "h" && _status.connectMode) return true; - return get.name(card) == "jiu"; - }) - ) - return false; - return ( - event.type == "dying" && - event.dying && - event.dying != player && - event.dying.hp <= 0 && - event.dying.hasZhuSkill("starhaoshou") && - player.group == "qun" - ); - }, - filterCard: function (card, player) { - return get.name(card) == "jiu"; - }, - check: () => 1, - viewAs: { name: "tao" }, - position: "hes", - prompt: function () { - return "将一张【酒】当作【桃】对" + get.translation(_status.event.dying) + "使用"; - }, - ai: { - save: true, - skillTagFilter: function (player, arg, target) { - if ( - !player.countCards("hes", (card) => { - if (get.position(card) == "h" && _status.connectMode) return true; - return get.name(card) == "jiu"; - }) || - player == target || - !target.hasSkill("starhaoshou") || - player.group != "qun" - ) - return false; - }, - }, - }, - }, - }, - //星袁术 - starcanxi: { - audio: 2, - trigger: { - global: ["phaseBefore", "roundStart"], - player: "enterGame", - }, - filter: function (event, player, name) { - if (name == "roundStart") - return player.getSkills().some((skill) => skill.indexOf("starcanxi_") == 0); - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - content: function () { - "step 0"; - if (event.triggername != "roundStart") { - var list = game.filterPlayer().reduce((list, target) => list.add(target.group), []); - list.sort((a, b) => lib.group.indexOf(a) - lib.group.indexOf(b)); - list.forEach((group) => lib.skill.starcanxi.create(group, player)); - event.finish(); - return; - } - "step 1"; - var groups = player.getSkills().filter((skill) => skill.indexOf("starcanxi_") == 0); - groups = groups.map((group) => group.slice(10)); - groups.sort((a, b) => lib.group.indexOf(a) - lib.group.indexOf(b)); - var map = {}; - groups.forEach((group) => (map[group] = get.translation(group + "2"))); - event.map = map; - player - .chooseButton( - [ - '###残玺###
    请选择势力和效果
    ', - [Object.values(map), "tdnodes"], - [ - [ - [ - "wangsheng", - '', - ], - [ - "xiangsi", - '', - ], - ], - "textbutton", - ], - ], - 2, - true - ) - .set("filterButton", function (button) { - var list = ["wangsheng", "xiangsi"]; - if (!ui.selected.buttons.length) return true; - return list.includes(ui.selected.buttons[0].link) != list.includes(button.link); - }) - .set("ai", function (button) { - var player = _status.event.player; - var map = _status.event.map, - list = ["wangsheng", "xiangsi"]; - var getNum = function (group, effect) { - var num = 0, - sgn = effect == "wangsheng" ? 1.05 : -1; - game.countPlayer(function (current) { - if (!(current == player && sgn == -1)) - num += get.sgn(get.attitude(player, current)) * sgn; - }); - return num; - }; - var listx = []; - Object.keys(map).forEach((group) => - list.forEach((effect) => listx.add([group, effect])) - ); - listx.sort((a, b) => getNum(b[0], b[1]) - getNum(a[0], a[1])); - if (button.link == map[listx[0][0]] || button.link == listx[0][1]) return 1; - return 0; - }) - .set("map", map); - "step 2"; - if (result.bool) { - if (!Object.keys(event.map).some((group) => event.map[group] == result.links[0])) - result.links.reverse(); - player.popup(result.links[0]); - var group = Object.keys(event.map).find( - (group) => event.map[group] == result.links[0] - ); - var skill = "starcanxi_" + result.links[1]; - player.popup(skill); - game.log( - player, - "选择了", - "#g" + result.links[0], - "、", - "#y" + get.translation(skill) - ); - player.addTempSkill(skill, "roundStart"); - player.markAuto(skill, [group]); - } - }, - create: function (group, player) { - const skill = "starcanxi_" + group; - get.info("starcanxi").createSkill(skill); - if (!_status.postReconnect.starcanxi) { - _status.postReconnect.starcanxi = [get.info("starcanxi").createSkill, []]; - } - _status.postReconnect.starcanxi[1].add(skill); - player.addSkill(skill); - }, - createSkill(skill) { - if (!lib.skill[skill]) - game.broadcastAll((skill) => { - const group = skill.slice("starcanxi_".length); - lib.skill[skill] = { - mark: true, - charlotte: true, - onremove: function (player) { - player.addMark("starpizhi", 1, false); - }, - intro: { content: "玉玺的一角" }, - }; - lib.translate[skill] = "残玺·" + get.translation(group + "2"); - lib.skill[skill].marktext = get.translation(group); - lib.translate[skill + "_bg"] = get.translation(group); - }, skill); - }, - subSkill: { - wangsheng: { - charlotte: true, - onremove: true, - trigger: { global: "damageBegin1" }, - filter: function (event, player) { - if ( - !event.source || - !player.getStorage("starcanxi_wangsheng").includes(event.source.group) - ) - return false; - return !event.source.getHistory("sourceDamage").length; - }, - forced: true, - logTarget: "source", - content: function () { - trigger.num++; - }, - group: "starcanxi_remove", - global: "starcanxi_effect", - intro: { content: "$势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1" }, - }, - xiangsi: { - charlotte: true, - onremove: true, - trigger: { global: "recoverEnd" }, - filter: function (event, player) { - if ( - !player.getStorage("starcanxi_xiangsi").includes(event.player.group) || - event.player == player - ) - return false; - return ( - game.getGlobalHistory("changeHp", function (evt) { - return evt.getParent().name == "recover" && evt.player == event.player; - }).length == 1 - ); - }, - forced: true, - logTarget: "player", - content: function () { - trigger.player.loseHp(); - }, - group: ["starcanxi_remove", "starcanxi_cancel"], - global: "starcanxi_effect", - intro: { - content: - "其他$势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效", - }, - }, - cancel: { - charlotte: true, - trigger: { global: "useCard" }, - filter: function (event, player) { - if ( - !event.targets || - !event.targets.includes(player) || - !player.getStorage("starcanxi_xiangsi").includes(event.player.group) || - event.player == player - ) - return false; - return ( - event.player - .getHistory( - "useCard", - (evt) => evt.targets && evt.targets.includes(player) - ) - .indexOf(event) == 0 - ); - }, - forced: true, - logTarget: "player", - content: function () { - trigger.excluded.add(player); - }, - }, - effect: { - mod: { - globalFrom: function (from, to, distance) { - if ( - game.hasPlayer((target) => - target.getStorage("starcanxi_wangsheng").includes(from.group) - ) - ) - return distance - 1; - }, - }, - ai: { - effect: { - player_use: function (card, player, target) { - var targets = game.filterPlayer( - (targetx) => - targetx != player && - targetx.getStorage("starcanxi_xiangsi").includes(player.group) - ); - if (!targets.length) return; - if (get.tag(card, "recover") && target == player && target.hp > 2) - return 0; - if (get.tag(card, "damage") && targets.includes(target)) return 0.5; - }, - }, - }, - }, - remove: { - charlotte: true, - trigger: { player: "die" }, - forced: true, - popup: false, - firstDo: true, - forceDie: true, - content: function () { - player.removeSkill("starcanxi_wangsheng"); - player.removeSkill("starcanxi_xiangsi"); - }, - }, - }, - }, - starpizhi: { - audio: 2, - trigger: { player: "phaseEnd", global: "die" }, - filter: function (event, player) { - if (event.name == "phase") return player.hasMark("starpizhi"); - if ( - !player.getStorage("starcanxi_wangsheng").includes(event.player.group) && - !player.getStorage("starcanxi_xiangsi").includes(event.player.group) - ) - return false; - var groups = player.getSkills().filter((skill) => skill.indexOf("starcanxi_") == 0); - groups = groups.map((group) => group.slice(10)); - return groups.includes(event.player.group); - }, - forced: true, - content: function () { - "step 0"; - if (trigger.name == "die") { - var skills = player - .getSkills() - .filter( - (skill) => - skill.indexOf("starcanxi_") == 0 && - skill.slice(10) == trigger.player.group - ); - player.removeSkill(skills); - } - "step 1"; - player.draw(player.countMark("starpizhi")); - }, - intro: { content: "已失去#个“玺角”" }, - ai: { combo: "starcanxi" }, - }, - starzhonggu: { - unique: true, - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - filter: function (event, player) { - return !event.numFixed; - }, - forced: true, - zhuSkill: true, - content: function () { - var num = - game.roundNumber >= game.countPlayer((current) => current.group == "qun") ? 2 : -1; - trigger.num += num; - }, - }, - //星曹仁 - starsujun: { - audio: 2, - trigger: { player: "useCard" }, - filter: function (event, player) { - return player.countCards("h", { type: "basic" }) * 2 == player.countCards("h"); - }, - frequent: true, - locked: false, - content: function () { - player.draw(2); - }, - mod: { - aiOrder: function (player, card, num) { - var num = player.countCards("h") - 2 * player.countCards("h", { type: "basic" }); - if (Math.abs(num) != 1) return; - if (num == 1 && get.type(card) != "basic") return num + 10; - if (num == -1 && get.type(card) == "basic") return num + 10; - }, - }, - }, - starlifeng: { - audio: 2, - enable: "chooseToUse", - filter: function (event, player) { - if ( - !event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && - !event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) - ) - return false; - return player.hasCard((card) => { - return !player.getStorage("starlifeng_count").includes(get.color(card, player)); - }, "hs"); - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event)) - list.push(["基本", "", "sha"]); - if (event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) - list.push(["锦囊", "", "wuxie"]); - return ui.create.dialog("砺锋", [list, "vcard"]); - }, - check: function (button) { - var player = _status.event.player; - return _status.event.getParent().type == "phase" - ? player.getUseValue({ name: button.link[2] }) - : 1; - }, - backup: function (links, player) { - return { - filterCard: function (card, player) { - return !player - .getStorage("starlifeng_count") - .includes(get.color(card, player)); - }, - precontent: function () { - delete event.result.skill; - player.logSkill("starlifeng"); - event.getParent().addCount = false; - }, - popname: true, - viewAs: { - name: links[0][2], - }, - ai1: function (card) { - var player = _status.event.player; - var num = - player.countCards("h") - 2 * player.countCards("h", { type: "basic" }); - if (player.hasSkill("starsujin") && Math.abs(num) == 1) { - if (num == 1 && get.type(card) != "basic") return 15 - get.value(card); - if (num == -1 && get.type(card) == "basic") return 15 - get.value(card); - } - return 7 - get.value(card); - }, - }; - }, - prompt: function (links) { - return ( - "将一张本回合未使用过的颜色的手牌当做【" + get.translation(links[0][2]) + "】使用" - ); - }, - }, - hiddenCard: function (player, name) { - if (name == "wuxie") - return player.countCards("hs", (card) => { - return ( - !player.getStorage("starlifeng_count").includes(get.color(card, player)) || - _status.connectMode - ); - }); - }, - ai: { - respondSha: true, - skillTagFilter: function (player, tag, arg) { - if (arg == "respond") return false; - if ( - !player.countCards("hs", (card) => { - return ( - !player - .getStorage("starlifeng_count") - .includes(get.color(card, player)) || _status.connectMode - ); - }) - ) - return false; - }, - order: 10, - result: { player: 1 }, - }, - group: "starlifeng_mark", - subSkill: { - mark: { - charlotte: true, - trigger: { global: "useCard1" }, - filter: function (event, player) { - return !player.getStorage("starlifeng_count").includes(get.color(event.card)); - }, - forced: true, - popup: false, - firstDo: true, - content: function () { - player.addTempSkill("starlifeng_count"); - player.markAuto("starlifeng_count", [get.color(trigger.card)]); - }, - }, - count: { - charlotte: true, - onremove: true, - }, - }, - }, - //小程序刘伶 - mpjiusong: { - audio: 2, - enable: "chooseToUse", - trigger: { global: "useCard" }, - filterCard: function (card) { - return get.type2(card) == "trick"; - }, - viewAs: { name: "jiu" }, - position: "hs", - viewAsFilter: function (player) { - return player.hasCard((card) => get.type2(card) == "trick", "hs"); - }, - check: function (card) { - if (get.itemtype(card) !== "card") return true; - if (get.event().type == "dying") return 1 / Math.max(0.1, get.value(card)); - return 4 - get.value(card); - }, - prompt: "将一张锦囊牌当【酒】使用", - filter: function (event, player) { - if (event.name == "chooseToUse") - return player.hasCard((card) => get.type2(card) == "trick", "hs"); - return event.card.name == "jiu" && player.countMark("mpjiusong") < 3; - }, - forced: true, - locked: false, - content: function () { - player.addMark("mpjiusong"); - }, - marktext: "醉", - intro: { - name: "醉(酒颂/酕醄)", - name2: "醉", - content: "mark", - }, - }, - mpmaotao: { - audio: 2, - trigger: { global: "useCardToPlayer" }, - filter: function (event, player) { - if (event.targets.length != 1 || !event.isFirstTarget) return false; - if (!["basic", "trick"].includes(get.type(event.card))) return false; - return event.player != player && player.countMark("mpjiusong"); - }, - prompt2: function (event, player) { - let list; - if (get.type(event.card) != "delay") - list = game.filterPlayer((current) => { - return lib.filter.targetEnabled2(event.card, event.player, current); - }); - else list = game.filterPlayer((current) => current.canAddJudge(event.card)); - const gainText = `${ - list.length > 1 && !player.storage.mpmaotao_gained ? `若新目标与原目标相同,你` : "" - }${!player.storage.mpmaotao_gained ? "获得牌堆中的一张锦囊牌。" : ""}`; - return `移去1枚“醉”${ - list.length > 1 - ? `,令${get.translation(event.card)}目标改为${get.translation( - list - )}中的一名随机角色` - : "" - }。${gainText}`; - }, - check: function (event, player) { - const eff = get.effect(event.target, event.card, player, player); - let list; - if (get.type(event.card) != "delay") - list = game.filterPlayer((current) => { - return lib.filter.targetEnabled2(event.card, event.player, current); - }); - else list = game.filterPlayer((current) => current.canAddJudge(event.card)); - let list2 = list.filter( - (current) => get.effect(current, event.card, player, player) > eff - ); - let list3 = list.filter((current) => get.effect(current, event.card, player, player) > 0); - return ( - list2.length >= list.length / 2 || - (player.countMark("mpjiusong") >= 2 && list3.length >= list.length / 2) - ); - }, - content: function () { - player.removeMark("mpjiusong", 1); - var list, - oriTarget = trigger.target; - trigger.targets.remove(oriTarget); - trigger.getParent().triggeredTargets1.remove(oriTarget); - trigger.untrigger(); - game.delayx(); - if (get.type(trigger.card) != "delay") - list = game.filterPlayer((current) => { - return lib.filter.targetEnabled2(trigger.card, trigger.player, current); - }); - else list = game.filterPlayer((current) => current.canAddJudge(trigger.card)); - if (list.length) target = list.randomGet(); - trigger.targets.push(target); - trigger.player.line(target, "thunder"); - game.log(trigger.card, "的目标被改为", target); - if (target == oriTarget && !player.storage.mpmaotao_gained) { - var card = get.cardPile2((card) => get.type2(card) == "trick"); - if (card) { - if (!player.storage.mpmaotao_gained) { - player.when({ global: "phaseAfter" }).then(() => { - delete player.storage.mpmaotao_gained; - }); - player.storage.mpmaotao_gained = true; - } - player.gain(card, "gain2"); - } else { - // player.chat('没酒了!'); - // game.log('但是牌堆中已经没有','#y酒','了!'); - player.chat("没牌了!"); - game.log("但是牌堆中已经没有", "#y锦囊牌", "了!"); - } - } - }, - }, - mpbishi: { - audio: 2, - forced: true, - trigger: { global: "useCard1" }, - filter: function (event, player) { - if (get.type2(event.card) != "trick" || !get.tag(event.card, "damage")) return false; - if (!lib.skill.xunshi.isXunshi(event.card)) return false; - const targets = event.targets.slice(); - targets.remove(event.player); - return targets.length == game.countPlayer() - 2; - }, - content: function* () {}, - mod: { - targetEnabled: function (card) { - if (get.type2(card) == "trick" && get.tag(card, "damage") > 0) return false; - }, - }, - }, - //十周年嵇康 - dcjuexiang: { - derivation: "dccanyun", - audio: "juexiang", - trigger: { player: "die" }, - forced: true, - locked: false, - forceDie: true, - skillAnimation: true, - animationColor: "water", - content: function () { - "step 0"; - if (trigger.source && trigger.source.isIn()) { - trigger.source.discard(trigger.source.getCards("e")); - trigger.source.loseHp(); - } - "step 1"; - player - .chooseTarget("绝响:是否令一名其他角色获得技能〖残韵〗?", lib.filter.notMe) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .set("forceDie", true); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "thunder"); - target.addSkills("dccanyun"); - } - }, - }, - dccanyun: { - enable: "phaseUse", - filter: function (event, player) { - return game.hasPlayer(function (target) { - return lib.skill.dccanyun.filterTarget(null, player, target); - }); - }, - filterTarget: function (card, player, target) { - var list = [player]; - player.getAllHistory("useSkill", function (evt) { - if (evt.skill == "dccanyun") list.addArray(evt.targets); - }); - return !list.includes(target) && !ui.selected.targets.length; - }, - selectTarget: [1, 2], - targetprompt: function (target) { - var pe = _status.event.player.countCards("e", function (card) { - return ui.selected.cards.includes(card) == false; - }); - var te = target.countCards("e"); - if (pe > te) return "回复体力"; - else if (pe == te) return "摸一张牌"; - else if (pe < te) return "失去体力"; - }, - filterCard: true, - position: "he", - check: function (cardx) { - var player = _status.event.player; - var number = game.countPlayer(function (target) { - if (player == target) return false; - var pe = player.countCards("e", function (card) { - return card != cardx && ui.selected.cards.includes(card) == false; - }); - var te = target.countCards("e"); - if (pe > te && target.isDamaged() && get.attitude(player, target) > 2) return true; - else if (pe < te && get.attitude(player, target) < 0) return true; - return false; - }); - if (ui.selected.cards.length < number) return 6 - get.value(cardx); - else return 0; - }, - usable: 1, - content: function () { - var pe = player.countCards("e"); - var te = target.countCards("e"); - if (pe > te) target.recover(); - else if (pe == te) target.draw(); - else if (pe < te) target.loseHp(); - }, - contentAfter: function () { - if (player.hp == 1) player.draw(); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - var pe = player.countCards("e"); - var te = target.countCards("e"); - if (pe > te && target.isDamaged()) return 2; - else if (pe == te) return 1; - else if (pe < te) return -2.5; - else return 0; - }, - }, - }, - }, - //董翓 - dcjiaoxia: { - mod: { - cardUsableTarget: function (card, player, target) { - if (!player.isPhaseUsing()) return; - if (card.name == "sha" && !player.getStorage("dcjiaoxia_mark").includes(target)) - return true; - }, - targetInRange: function (card, player, target) { - if (!player.isPhaseUsing()) return; - if (card.name == "sha" && !player.getStorage("dcjiaoxia_mark").includes(target)) - return true; - }, - }, - audio: 2, - locked: false, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return player.countCards("h"); - }, - check: function (event, player) { - return player.countCards("h", (card) => { - return game.hasPlayer((target) => { - var cardx = get.autoViewAs({ name: "sha" }, [card]); - return ( - player.canUse(cardx, target) && - get.effect(target, cardx, player, player) > 0 && - (!player.hasUseTarget(card) || player.hasValueTarget(card)) - ); - }); - }); - }, - content: function () { - var cards = player.getCards("h"); - player.addTempSkill("dcjiaoxia_used", "phaseUseAfter"); - player.addGaintag(cards, "dcjiaoxia_used"); - }, - group: "dcjiaoxia_load", - subSkill: { - load: { - charlotte: true, - trigger: { player: "useCard1" }, - filter: function (event, player) { - if (!player.isPhaseUsing()) return false; - return ( - event.card.name == "sha" && - event.targets && - event.targets.some( - (target) => !player.getStorage("dcjiaoxia_mark").includes(target) - ) - ); - }, - forced: true, - popup: false, - firstDo: true, - content: function () { - player.addTempSkill("dcjiaoxia_mark", "phaseUseAfter"); - player.markAuto( - "dcjiaoxia_mark", - trigger.targets.filter( - (target) => !player.getStorage("dcjiaoxia_mark").includes(target) - ) - ); - }, - }, - mark: { - charlotte: true, - onremove: true, - }, - used: { - mod: { - aiOrder: function (player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("dcjiaoxia_used")) - return num + 1; - }, - cardname: function (card, player) { - if (get.itemtype(card) == "card" && card.hasGaintag("dcjiaoxia_used")) - return "sha"; - }, - }, - charlotte: true, - onremove: function (player) { - player.removeGaintag("dcjiaoxia_used"); - }, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return ( - event.cards && - event.cards.length == 1 && - player.hasUseTarget(get.copy(event.cards[0])) && - player.getHistory("lose", (evt) => { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("dcjiaoxia_used")) return true; - } - return false; - }).length && - player.getHistory("sourceDamage", (evt) => evt.card == event.card).length && - player.hasUseTarget(event.cards[0]) - ); - }, - direct: true, - content: function () { - player - .chooseUseTarget(trigger.cards[0], get.prompt("dcjiaoxia"), false, false) - .set("prompt2", "使用" + get.translation(card)).logSkill = "dcjiaoxia"; - }, - }, - }, - }, - dchumei: { - subSkill: { - 0: { charlotte: true }, - 1: { charlotte: true }, - 2: { charlotte: true }, - }, - onChooseToUse: function (event) { - if (!game.online && !event.dchumei_num) { - var player = event.player; - var evtx = event.getParent("phaseUse"); - event.set( - "dchumei_num", - player - .getHistory("sourceDamage", (evt) => { - return evt.getParent("phaseUse") == evtx; - }) - .reduce((sum, evt) => sum + evt.num, 0) - ); - } - }, - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (typeof event.dchumei_num != "number") return false; - return game.hasPlayer((target) => lib.skill.dchumei.filterTarget(null, player, target)); - }, - filterTarget: function (card, player, target) { - if (target.getHp() > _status.event.dchumei_num) return false; - if (!player.hasSkill("dchumei_0")) return true; - if (!player.hasSkill("dchumei_1") && target.countCards("he")) return true; - if (!player.hasSkill("dchumei_2") && target.isDamaged()) return true; - return false; - }, - content: function () { - "step 0"; - var str = get.translation(target); - player - .chooseButton( - [ - "狐魅:请选择一项", - [ - [ - [0, "令" + str + "摸一张牌"], - [1, "令" + str + "交给你一张牌"], - [2, "令" + str + "回复1点体力"], - ].filter((list) => { - if (player.hasSkill("dchumei_" + list[0])) return false; - if (list[0] == 1 && !target.countCards("he")) return false; - if (list[0] == 2 && target.isHealthy()) return false; - return true; - }), - "textbutton", - ], - ], - true - ) - .set("filterButton", (button) => { - var target = _status.event.target; - if (player.hasSkill("dchumei_" + button.link)) return false; - if (button.link == 1 && !target.countCards("he")) return false; - if (button.link == 2 && target.isHealthy()) return false; - return true; - }) - .set("ai", function (button) { - var target = _status.event.target; - return [ - get.effect(target, { name: "draw" }, player, player), - get.effect(target, { name: "shunshou_copy2" }, player, player), - get.recoverEffect(target, player, player), - ][button.link]; - }) - .set("target", target); - "step 1"; - if (result.bool) { - var num = result.links[0]; - player.addTempSkill("dchumei_" + num, "phaseUseAfter"); - switch (num) { - case 0: - target.draw(); - break; - case 1: - target.chooseCard( - "狐魅:交给" + get.translation(player) + "一张牌", - "he", - true - ); - break; - case 2: - target.recover(); - break; - } - if (num != 1) event.finish(); - } else event.finish(); - "step 2"; - if (result.bool) player.gain(result.cards, target, "giveAuto"); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (!player.hasSkill("dchumei_0")) return 1; - if (!player.hasSkill("dchumei_1")) return -1; - if (!player.hasSkill("dchumei_2")) return 1; - }, - }, - }, - }, - //魏关羽 - dcdanji: { - audio: "danji", - skillAnimation: true, - animationColor: "water", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - derivation: ["mashu", "dcnuchen"], - filter(event, player) { - return player.countCards("hej") > player.getHp(); - }, - async content(event, trigger, player) { - player.awakenSkill("dcdanji"); - await player.loseMaxHp(); - await player.recover(player.maxHp - player.hp); - await player.draw(player.getHp()); - await player.addSkills(["mashu", "dcnuchen"]); - }, - ai: { - maixie: true, - skillTagFilter: (player, tag, arg) => { - if (tag === "maixie") - return ( - player.hp >= 2 && - !player.storage.dcdanji && - !player.hasSkill("dcnuchen") && - player.countCards("h") === player.hp - ); - }, - effect: { - target: (card, player, target) => { - let hs = target.countCards("h"); - if ( - target.hp < 3 || - target.storage.dcdanji || - target.hasSkill("dcnuchen") || - hs > target.hp + 1 - ) - return; - if (get.tag(card, "draw")) return 1.6; - if (get.tag(card, "lose") || get.tag(card, "discard")) return [1, -0.8]; - if (hs === target.hp && get.tag(card, "damage")) return [1, target.hp / 3]; - if ( - hs > target.hp && - target.hp > 3 && - (card.name === "shan" || card.name === "wuxie") - ) - return "zeroplayertarget"; - }, - }, - }, - }, - dcnuchen: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.countCards("h") && target != player; - }, - content: function () { - "step 0"; - player.choosePlayerCard(target, true, "h"); - "step 1"; - if (result.bool) { - var card = result.cards[0]; - event.card = card; - player.showCards( - card, - get.translation(player) + "对" + get.translation(target) + "发动了【怒嗔】" - ); - } else event.finish(); - "step 2"; - var suit = get.suit(card); - var str = get.translation(suit); - player - .chooseToDiscard( - "怒嗔:是否弃置至少一张" + str + "牌?", - "若如此做,你对其造成等量伤害;或点击“取消”,获得其所有" + str + "手牌", - "he", - { suit: suit }, - [1, Infinity] - ) - .set("ai", (card) => { - if (ui.selected.cards.length >= _status.event.num) return 0; - return 6 - get.value(card); - }) - .set( - "num", - (function () { - var eff = get.damageEffect(target, player, player); - if (eff > 0) { - if (get.attitude(player, target) > 0) { - return 1; - } - var cards = target.getCards("h", { suit: suit }); - if (cards.length > 2 || get.value(cards) >= 6) { - return 0; - } - if ( - !player.hasSkillTag("jueqing", false, target) && - target.hasSkillTag("filterDamage", null, { player: player }) - ) - return 1; - return Infinity; - } - return 0; - })() - ); - "step 3"; - if (result.bool) { - target.damage(result.cards.length); - } else { - var cards = target.getCards("h", { suit: get.suit(card) }); - if (cards.length) player.gain(cards, target, "giveAuto", "bySelf"); - } - }, - ai: { - expose: 0.4, - order: 10, - result: { - target: function (player, target) { - return -Math.sqrt(target.countCards("h")); - }, - }, - }, - }, - //孟达 - dclibang: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterCard: true, - position: "he", - filter: function (event, player) { - return ( - player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "dclibang"); - }, "he") && game.countPlayer((current) => current != player) >= 2 - ); - }, - filterTarget: function (card, player, target) { - return target != player; - }, - selectTarget: 2, - multiline: true, - multitarget: true, - content: function () { - "step 0"; - event.num = 0; - event.cardsx = []; - event.targets.sortBySeat(); - "step 1"; - var current = targets[event.num]; - if (current.countCards("he")) player.gainPlayerCard(current, "he", true, "visibleMove"); - event.num++; - "step 2"; - if (result.bool) { - var card = result.cards[0]; - event.cardsx.push(card); - } - if (event.num < targets.length) event.goto(1); - "step 3"; - player.judge().set("callback", lib.skill.dclibang.contentx); - }, - contentx: function () { - "step 0"; - var card = event.judgeResult.card; - var color = event.judgeResult.color; - var player = event.getParent(2).player; - var cards = event.getParent(2).cardsx; - for (var cardx of cards) { - if (get.color(cardx) == color) { - if (get.position(card, true) == "o") player.gain(card, "gain2"); - return; - } - } - event.goto(3); - "step 1"; - var targets = event.getParent(2).targets.filter((target) => { - return player.canUse("sha", target); - }); - if (!targets.length) event.finish(); - else - player - .chooseTarget( - "利傍:视为对其中一名角色使用一张【杀】", - true, - (card, player, target) => { - return _status.event.targets.includes(target); - } - ) - .set("targets", targets) - .set("ai", (target) => { - return get.effect(target, { name: "sha" }, player, player); - }); - "step 2"; - if (result.bool) { - player.useCard({ name: "sha", isCard: true }, result.targets[0], false); - } - event.finish(); - "step 3"; - player.chooseCardTarget({ - filterCard: function (card) { - return get.itemtype(card) == "card"; - }, - filterTarget: function (card, player, target) { - return _status.event.targets.includes(target); - }, - selectCard: 2, - targets: event.getParent(2).targets, - position: "he", - prompt: "交给其中一名角色两张牌,或失去1点体力", - ai1: function (card) { - return 1; - }, - ai2: function (target) { - var player = _status.event.player, - card = ui.selected.cards[0]; - var val = get.value(card, target); - if (val > 0) return get.attitude(player, target) * 2; - return (val - 2) * get.attitude(player, target); - }, - }); - "step 4"; - if (result.bool) { - player.give(result.cards, result.targets[0]); - } else player.loseHp(); - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if (get.attitude(player, target) > 0 && ui.selected.targets.length) return 0.1; - return -1; - }, - }, - }, - }, - dcwujie: { - audio: 2, - trigger: { - global: ["discardBegin", "drawBegin"], - }, - forced: true, - forceDie: true, - group: "dcwujie_inf", - logTarget: "player", - filter: function (event, player) { - return ( - event.getParent().name == "die" && - event.getParent().source == event.player && - event.player != player && - event.getParent().player == player - ); - }, - content: function () { - trigger.cancel(); - }, - subSkill: { - inf: { - trigger: { player: "useCard1" }, - forced: true, - popup: false, - firstDo: true, - filter: function (event, player) { - if (get.color(event.card) == "none" && event.addCount !== false) return true; - return false; - }, - content: function () { - trigger.addCount = false; - var stat = player.getStat().card, - name = trigger.card.name; - if (typeof stat[name] == "number") stat[name]--; - }, - }, - }, - mod: { - targetInRange: function (card, player) { - const color = get.color(card); - if (color === "none" || color === "unsure") return true; - }, - cardUsable: function (card) { - const color = get.color(card); - if (color === "none" || color === "unsure") return Infinity; - }, - }, - }, - //关宁 - dcxiuwen: { - audio: 2, - trigger: { player: "useCard" }, - filter: function (event, player) { - return !player.getStorage("dcxiuwen").includes(event.card.name); - }, - frequent: true, - content: function () { - player.draw(); - player.markAuto("dcxiuwen", [trigger.card.name]); - }, - intro: { content: "已使用:$" }, - }, - oldlongsong: { - audio: "dclongsong", - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - getSkills: function (target, player, trigger) { - return target.getSkills(null, false).filter((skill) => { - var skills = game.expandSkills([skill]); - if ( - skills.filter((skillx) => { - var info = get.info(skillx); - if (!info || !info.enable || (info.usable && !(info.usable >= 1))) - return false; - if ( - info.enable != "phaseUse" && - (!Array.isArray(info.enable) || !info.enable.includes("phaseUse")) - ) - return false; - if (info.viewAs && info.usable && info.usable != 1) return false; - if ( - info.juexingji || - info.hiddenSkill || - info.charlotte || - info.limited || - info.dutySkill - ) - return false; - if ((!info.usable || info.usable > 1) && info.filter) { - try { - var bool1 = info.filter(trigger, player); - var num = player.getStat().skill[skillx]; - player.getStat().skill[skillx] = 1; - var bool2 = info.filter(trigger, player); - if (!num) delete player.getStat().skill[skillx]; - else player.getStat().skill[skillx] = num; - var bool3 = !(bool1 && !bool2); - } catch (e) { - console.trace(e); - } - if ( - !bool1 && - !bool2 && - get.skillInfoTranslation(skill, player).indexOf("出牌阶段限一次") == - -1 - ) - return false; - if ((bool1 || bool2) && bool3) return false; - } - return true; - }).length - ) - return true; - return false; - }); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - filterCard: true, - selectCard: 1, - filterTarget: function (card, player, target) { - return player != target; - }, - ai1: function (card) { - return 6 - get.value(card); - }, - ai2: function (target) { - var att = get.attitude(_status.event.player, target), - trigger = _status.event.getTrigger(), - player = _status.event.player; - return ( - lib.skill.oldlongsong.getSkills(target, player, trigger).length * 3 + att / 3 - ); - }, - prompt: get.prompt2("oldlongsong"), - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("oldlongsong", target); - event.target = target; - player.line(target, "green"); - player.give(result.cards, target); - var skills = lib.skill.oldlongsong.getSkills(target, player, trigger); - if (skills.length) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - target.disableSkill("oldlongsong_back", skills); - target.markAuto("oldlongsong_back", skills); - target.addTempSkill("oldlongsong_back", ["phaseUseAfter", "phaseAfter"]); - var str = ""; - for (var i = 0; i < skills.length; i++) { - str += "【" + get.translation(skills[i]) + "】"; - if (i != skills.length - 1) str += "、"; - } - game.log(target, "的技能", "#g" + str, "失效了"); - // game.log(player,'获得了技能','#g'+str); - player.popup(skills, "thunder"); - for (var skill of skills) { - player.addTempSkills(skill, ["phaseUseAfter", "phaseAfter"]); - } - } - } - }, - ai: { expose: 0.2 }, - subSkill: { - back: { - charlotte: true, - onremove: function (player, skill) { - var skills = player.getStorage("oldlongsong_back"); - for (var key of skills) { - game.log(player, "恢复了技能", "#g【" + get.translation(key) + "】"); - delete player.storage[key]; - } - player.enableSkill(skill); - player.popup(skills, "thunder"); - }, - }, - }, - }, - dclongsong: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - getSkills(target, skills) { - return (target && !skills ? target.getSkills(null, false) : skills).filter((skill) => { - var str = get.skillInfoTranslation(skill, target); - if (str.indexOf("当你于出牌阶段") != -1) return true; - var skills = game.expandSkills([skill]); - if ( - skills.some((skillx) => { - var info = get.info(skillx); - if (!info || !info.enable) return false; - if ( - info.enable != "phaseUse" && - info.enable != "chooseToUse" && - (!Array.isArray(info.enable) || - (!info.enable.includes("phaseUse") && - !info.enable.includes("chooseToUse"))) - ) - return false; - if ( - info.juexingji || - info.hiddenSkill || - info.charlotte || - info.limited || - info.dutySkill - ) - return false; - if (info.ai && info.ai.notemp) return false; - return true; - }) - ) - return true; - return false; - }); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - filterCard: { color: "red" }, - selectCard: 1, - position: "he", - filterTarget: function (card, player, target) { - return player != target; - }, - ai1: function (card) { - return 6 - get.value(card); - }, - ai2: function (target) { - var att = get.attitude(_status.event.player, target); - return lib.skill.dclongsong.getSkills(target).length * 2 + att / 2.5; - }, - prompt: get.prompt2("dclongsong"), - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dclongsong", target); - event.target = target; - player.line(target, "green"); - player.give(result.cards, target); - var skills = lib.skill.dclongsong.getSkills(target); - if (skills.length) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - target.disableSkill("dclongsong_back", skills); - target.markAuto("dclongsong_back", skills); - player.addTempSkill("dclongsong_remove", ["phaseUseAfter", "phaseAfter"]); - player.markAuto("dclongsong_remove", skills); - target.addTempSkill("dclongsong_back", ["phaseUseAfter", "phaseAfter"]); - var str = ""; - for (var i = 0; i < skills.length; i++) { - str += "【" + get.translation(skills[i]) + "】"; - if (i != skills.length - 1) str += "、"; - } - game.log(target, "的技能", "#g" + str, "失效了"); - // game.log(player,'获得了技能','#g'+str); - player.popup(skills, "thunder"); - for (var skill of skills) { - player.addTempSkills(skill, ["phaseUseAfter", "phaseAfter"]); - } - } - } - }, - ai: { expose: 0.2 }, - subSkill: { - back: { - charlotte: true, - onremove: function (player, skill) { - var skills = player.getStorage("dclongsong_back"); - for (var key of skills) { - game.log(player, "恢复了技能", "#g【" + get.translation(key) + "】"); - //delete player.storage[key]; - } - player.enableSkill(skill); - player.popup(skills, "thunder"); - }, - }, - remove: { - trigger: { player: ["useSkill", "logSkillBegin"] }, - forced: true, - charlotte: true, - popup: false, - onremove: true, - filter: function (event, player) { - var skill = event.sourceSkill || event.skill; - return ( - player.getStorage("dclongsong_remove").includes(skill) && - !player.getStockSkills(false, true).includes(skill) - ); - }, - content: function () { - "step 0"; - var skill = trigger.sourceSkill || trigger.skill; - player.removeSkills(skill); - player.unmarkAuto("dclongsong_remove", [skill]); - }, - }, - }, - }, - longsong: { - audio: "dclongsong", - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return game.hasPlayer(target => { - if (target == player) return false; - return target.hasCard(card => { - if (get.position(card) == "h") return true; - return get.color(card) == "red" && lib.filter.canBeGained(card, player, target); - }, "he"); - }); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseCardTarget({ - prompt: get.prompt2("longsong"), - filterTarget(card, player, target) { - if (target === player) return false; - const skills = lib.skill.dclongsong.getSkills(target).map(skill => get.translation(skill)); - if (skills.length) { - target.prompt(skills.join("
    ")); - } - return ui.selected.cards.length || target.hasCard(card => { - if (get.position(card) == "h") return true; - return get.color(card) == "red" && lib.filter.canBeGained(card, player, target); - }, "he"); - }, - filterCard: { color: "red" }, - selectCard: [0, 1], - multitarget: true, - ai1(card) { - const ai2 = get.event("ai2"); - if ( - game.hasPlayer(current => { - return ai2(current) > 0; - }) - ) { - return -1 - get.value(card); - } - return 6 - get.value(card); - }, - ai2(target) { - const player = get.event("player"), - att = get.attitude(player, target); - if (att > 0 && !target.getGainableCards(player, "he").some(card => get.color(card) == "red")) return 0; - return lib.skill.dclongsong.getSkills(target).length + (att > 0 ? 0 : Math.max(0, get.effect(target, { name: "shunshou_copy2" }, player, player))); - }, - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0], - cards = event.cards, - gainableCards = target.getGainableCards(player, "he").filter(card => get.color(card) == "red"); - if (cards) { - await player.give(cards, target); - } else { - if (gainableCards.length) { - let dialog = ["龙诵:获得" + get.translation(target) + "的一张红色牌"]; - let cards1 = gainableCards.filter(i => get.position(i) == "h"), - cards2 = gainableCards.filter(i => get.position(i) == "e"); - if (cards1.length) { - dialog.push('
    手牌区
    '); - if (player.hasSkillTag("viewHandcard", null, target, true)) dialog.push(cards1); - else dialog.push([cards1.randomSort(), "blank"]); - } - if (cards2.length) { - dialog.push('
    装备区
    '); - dialog.push(cards2); - } - const { - result: { bool, links }, - } = await player.chooseButton(dialog, true).set("ai", button => { - const player = get.event("player"), - target = get.event().getParent().targets[0]; - return get.value(button.link, player) * get.value(button.link, target) * (1 + Math.random()); - }); - if (!bool) return; - await player.gain(links, target, "giveAuto", "bySelf"); - } else { - player.popup("杯具"); - player.chat("无牌可得?!"); - game.log("但是", target, "没有红色牌可被" + get.translation(player) + "获得!"); - } - } - let skills = lib.skill.dclongsong.getSkills(target), - fromTarget = true; - if (!skills.length) { - if (!_status.characterlist) { - lib.skill.pingjian.initList(); - } - const allList = _status.characterlist.slice(0); - allList.randomSort(); - for (const name of allList) { - const curSkills = lib.character[name][3]; - const filteredSkills = lib.skill.dclongsong.getSkills(null, curSkills); - if (filteredSkills.length > 0) { - skills = filteredSkills.randomGets(1); - fromTarget = false; - break; - } - } - } - if (!skills.length) return; - if (!event.isMine() && !event.isOnline()) await game.asyncDelayx(); - skills.forEach(skill => { - player.popup(skill, "thunder"); - }); - if (fromTarget) { - target.disableSkill("dclongsong_back", skills); - target.markAuto("dclongsong_back", skills); - target.addTempSkill("dclongsong_back", ["phaseUseAfter", "phaseAfter"]); - let str = ""; - for (let i = 0; i < skills.length; i++) { - str += "【" + get.translation(skills[i]) + "】"; - if (i != skills.length - 1) str += "、"; - } - game.log(target, "的技能", "#g" + str, "失效了"); - } - player.addTempSkill("dclongsong_remove", ["phaseUseAfter", "phaseAfter"]); - player.markAuto("dclongsong_remove", skills); - await player.addTempSkills(skills, ["phaseUseAfter", "phaseAfter"]); - }, - }, - //伏完 - dcmoukui: { - audio: "moukui", - trigger: { player: "useCardToPlayered" }, - direct: true, - filter: function (event, player) { - return event.card && event.card.name == "sha" && event.isFirstTarget; - }, - content: function () { - "step 0"; - player - .chooseButton([ - get.prompt("dcmoukui"), - [ - [ - ["draw", "摸一张牌"], - [ - "discard", - "弃置" + - (trigger.targets.length == 1 - ? get.translation(trigger.targets[0]) - : "一名目标角色") + - "的一张牌", - ], - ], - "textbutton", - ], - ]) - .set("filterButton", (button) => { - if ( - button.link == "discard" && - _status.event.getTrigger().targets.every((target) => { - return target.countDiscardableCards(_status.event.player, "he") == 0; - }) - ) - return false; - return true; - }) - .set("ai", function (button) { - if ( - button.link == "discard" && - _status.event.getTrigger().targets.every((target) => { - return ( - get.effect(target, { name: "guohe_copy2" }, _status.event.player) <= 0 - ); - }) - ) - return 0; - return 1; - }) - .set("selectButton", [1, 2]); - "step 1"; - if (result.bool) { - player.logSkill("dcmoukui"); - var choices = result.links; - event.choices = choices; - if (choices.includes("draw")) { - game.log(player, "选择了", "#y选项一"); - player.draw(); - } - if (choices.includes("discard")) { - game.log(player, "选择了", "#y选项二"); - if (trigger.targets.length == 1) event.directtarget = trigger.targets[0]; - else - player - .chooseTarget( - "谋溃:弃置一名目标角色的一张牌", - true, - (card, player, target) => { - return ( - _status.event.getTrigger().targets.includes(target) && - target.countDiscardableCards(player, "he") > 0 - ); - } - ) - .set("ai", (target) => { - return get.effect( - target, - { name: "guohe_copy2" }, - _status.event.player - ); - }); - } else event.finish(); - if (choices.length >= 2) { - player.addTempSkill("dcmoukui_conseq"); - player.markAuto("dcmoukui_conseq", [trigger.card]); - } - } - "step 2"; - player.discardPlayerCard( - event.directtarget || result.targets[0], - true, - "he" - ).boolline = true; - }, - subSkill: { - conseq: { - trigger: { - global: ["shaMiss", "useCardToExcluded", "eventNeutralized", "shaCancelled"], - }, - forced: true, - popup: false, - charlotte: true, - onremove: true, - filter: function (event, player, name) { - if (!event.card) return false; - var cards = player.getStorage("dcmoukui_conseq"); - if (!cards.includes(event.card)) return false; - return true; - }, - content: function () { - "step 0"; - game.delayx(); - "step 1"; - trigger.target.discardPlayerCard(player, true, "he").boolline = true; - }, - }, - }, - }, - //孙桓 - dcniji: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - return get.type(event.card) != "equip"; - }, - frequent: true, - group: "dcniji_discard", - content: function () { - var next = player.draw(); - var evt = trigger.getParent("dcniji_discard"); - if (!evt || evt.player != player) next.gaintag = ["dcniji"]; - player.addTempSkill("dcniji_clear"); - }, - subSkill: { - clear: { - charlotte: true, - onremove: function (player) { - player.removeGaintag("dcniji"); - }, - }, - discard: { - audio: "dcniji", - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.hasCard( - (card) => - card.hasGaintag("dcniji") && - lib.filter.cardDiscardable(card, player, "dcniji"), - "h" - ); - }, - forced: true, - locked: false, - content: function () { - "step 0"; - var cards = player.getCards( - "h", - (card) => - card.hasGaintag("dcniji") && - lib.filter.cardDiscardable(card, player, "dcniji") - ); - event.cards = cards; - // if(cards.length>=player.hp){ - if (cards.some((card) => player.hasUseTarget(card))) { - player.chooseToUse({ - prompt: "是否使用一张“逆击”牌?", - filterCard: function (card, player) { - if (get.itemtype(card) == "card" && !card.hasGaintag("dcniji")) - return false; - return lib.filter.filterCard.apply(this, arguments); - }, - ai1: function (card) { - return get.player().getUseValue(card); - }, - }); - } - // } - "step 1"; - if (result.bool) game.delayex(); - var cards = cards.filter( - (card) => - get.owner(card) == player && - get.position(card) == "h" && - lib.filter.cardDiscardable(card, player, "dcniji") - ); - if (cards.length) player.discard(cards); - }, - }, - }, - }, - //孙狼 - dctingxian: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - usable: 1, - filter: function (event, player) { - return ( - event.card.name == "sha" && - event.getParent().triggeredTargets3.length == event.targets.length - ); - }, - check: function (event, player) { - return event.targets.some( - (target) => get.effect(target, event.card, player, player) <= 0 - ); - }, - content: function () { - "step 0"; - var num = player.countCards("e") + 1; - event.num = num; - player.draw(num); - "step 1"; - var num = Math.min(trigger.targets.length, num); - player - .chooseTarget( - "铤险:令此杀对其中至多" + get.cnNumber(num) + "个目标无效", - [1, num], - true, - (card, player, target) => { - return _status.event.getTrigger().targets.includes(target); - } - ) - .set("ai", (target) => { - return ( - 1 - - get.effect( - target, - _status.event.getTrigger().card, - _status.event.player, - _status.event.player - ) - ); - }); - "step 2"; - if (result.bool) { - player.line(result.targets); - trigger.getParent().excluded.addArray(result.targets); - } - }, - ai: { - effect: { - player: function (card, player, target) { - if ( - _status.event.name == "chooseToUse" && - get.name(card) == "sha" && - (!player.storage.counttrigger || !player.storage.counttrigger.dctingxian) && - !_status._dctingxian_aiChecking - ) { - _status._dctingxian_aiChecking = true; - var eff = get.effect(target, { name: "sha" }, player, player); - delete _status._dctingxian_aiChecking; - if ( - eff < 0 && - ui.selected.targets.filter((targetx) => { - if (targetx == target) return false; - _status._dctingxian_aiChecking = true; - var eff = get.effect(targetx, { name: "sha" }, player, player); - delete _status._dctingxian_aiChecking; - if (eff < 0) return true; - }).length < - player.countCards("e") + 1 - ) - return [0, 0, 0, 0.5]; - } - }, - }, - }, - }, - dcbenshi: { - audio: 2, - forced: true, - trigger: { player: "useCard1" }, - filter: function (event, player) { - if (event.card.name != "sha") return false; - var card = event.card; - var range; - var select = get.copy(get.info(card).selectTarget); - if (select == undefined) { - if (get.info(card).filterTarget == undefined) return false; - range = [1, 1]; - } else if (typeof select == "number") range = [select, select]; - else if (get.itemtype(select) == "select") range = select; - else if (typeof select == "function") range = select(card, player); - game.checkMod(card, player, range, "selectTarget", player); - return range[1] == -1; - }, - content: function () {}, - mod: { - attackRangeBase: function (player, num) { - if (num !== "unchanged") return num; - var range = 1; - var equips = player.getCards("e", function (card) { - return ( - get.subtype(card) != "equip1" && - (!ui.selected.cards || !ui.selected.cards.includes(card)) - ); - }); - for (var i = 0; i < equips.length; i++) { - var info = get.info(equips[i], false).distance; - if (!info) continue; - if (info.attackFrom) { - range -= info.attackFrom; - } - } - return range; - }, - attackRange: function (player, num) { - return num + 1; - }, - selectTarget: function (card, player, range) { - if (card.name == "sha") { - range[0] = -1; - range[1] = -1; - } - }, - }, - }, - //是仪 - dccuichuan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: true, - filterCard: true, - derivation: "dczuojian", - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - event.num = target.countCards("e"); - var subtypes = []; - for (var i = 1; i < 7; i++) { - if (target.hasEmptySlot(i)) subtypes.push("equip" + i); - } - if (subtypes.length) { - subtypes.randomSort(); - for (var subtype of subtypes) { - var card = get.cardPile2((card) => get.subtype(card) == subtype); - if (card && target.canUse(card, target)) { - target.chooseUseTarget(card, true, "nopopup"); - break; - } - } - } - "step 1"; - var numx = target.countCards("e"); - if (numx > 0) player.draw(numx); - game.delayx(); - "step 2"; - event.num2 = target.countCards("e"); - if (event.num2 == 4 && num != 4) { - player.trySkillAnimate( - "dccuichuan_animate", - "dccuichuan_animate", - player.checkShow("dccuichuan") - ); - //player.removeSkill('dccuichuan'); - //game.log(player,'失去了技能','#g【榱椽】'); - player.changeSkills(["dczuojian"], ["dccuichuan"]); - target.insertPhase(); - game.delayx(); - } - }, - subSkill: { - animate: { - skillAnimation: true, - animationColor: "wood", - }, - }, - ai: { - order: 7, - result: { - target: function (player, target) { - if (target.countCards("e") == 3) return 2; - return 1; - }, - player: function (player, target) { - if (target.countCards("e") == 3) return 0.5; - return target.countCards("e") + 1; - }, - }, - }, - }, - dczhengxu: { - audio: 2, - group: ["dczhengxu_lose", "dczhengxu_damage"], - subSkill: { - lose: { - audio: "dczhengxu", - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - prompt2: function (event, player) { - return ( - "当你失去牌后,若你本回合受到过伤害,你可以摸等量的牌(" + - get.cnNumber(event.getl(player).cards2.length) + - "张)" - ); - }, - check: () => true, - filter: function (event, player) { - if (event.name == "gain" && event.player == player) return false; - if ( - !player.getHistory("damage").length || - player.hasHistory("useSkill", (evt) => evt.skill == "dczhengxu_lose") - ) - return false; - var evt = event.getl(player); - return evt && evt.cards2 && evt.cards2.length > 0; - }, - content: function () { - player.draw(trigger.getl(player).cards2.length); - }, - ai: { - effect: { - target: (card, player, target) => { - if ( - (get.tag(card, "lose") || get.tag(card, "discard")) && - target.getHistory("damage").length && - !target.hasHistory("useSkill", (evt) => evt.skill == "dczhengxu_lose") - ) - return [1, 1]; - }, - }, - }, - }, - damage: { - audio: "dczhengxu", - trigger: { - player: "damageBegin4", - }, - prompt2: "当你受到伤害时,若你本回合失去过牌,你可以防止之", - check: () => true, - filter: function (event, player) { - if ( - !player.hasHistory("lose", (evt) => evt.cards2 && evt.cards2.length) || - player.hasHistory("useSkill", (evt) => evt.skill == "dczhengxu_damage") - ) - return false; - return true; - }, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: (card, player, target) => { - if ( - player.hasSkillTag("jueqing", false, target) || - !get.tag(card, "damage") - ) - return; - if ( - target.hasHistory( - "useSkill", - (evt) => evt.skill == "dczhengxu_damage" - ) || - !target.hasHistory("lose", (evt) => evt.cards2 && evt.cards2.length) - ) - return; - if (get.attitude(player, target) >= 0) return "zeroplayertarget"; - let num = 0, - shas = player.getCardUsable("sha"), - hs = player.getCards("hs", (i) => { - if ( - i === card || - (card.cards && card.cards.includes(i)) || - !get.tag(i, "damage") || - !player.canUse(i, target) - ) - return false; - if (get.name(i) === "sha") { - num++; - return false; - } - return true; - }); - if (card.name === "sha") shas--; - num = Math.min(num, shas); - num += hs.length; - if (!num) return "zeroplayertarget"; - num = 1 - 2 / 3 / num; - return [num, 0, num, 0]; - }, - }, - }, - }, - }, - }, - dczuojian: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - filter: function (event, player) { - return ( - player.getHistory("useCard", (evt) => { - var evtx = evt.getParent("phaseUse"); - if (evtx && evtx == event) return true; - return false; - }).length >= player.hp - ); - }, - direct: true, - content: function () { - "step 0"; - var choices = []; - var choiceList = [ - "令装备区牌数多于你的角色各摸一张牌", - "令装备区牌数少于你的角色各弃置一张手牌", - ]; - var num = player.countCards("e"); - var targets = [], - targets2 = []; - var eff = 0, - eff2 = 0; - for (var target of game.filterPlayer()) { - if (target.countCards("e") > num) { - targets.push(target); - eff += get.attitude(player, target); - } - if (target.countCards("e") < num) { - targets2.push(target); - eff2 -= get.attitude(player, target); - } - } - event.targets = targets; - event.targets2 = targets2; - if (targets.length) { - choices.push("选项一"); - choiceList[0] += "(" + get.translation(targets) + ")"; - } else choiceList[0] = '' + choiceList[0] + ""; - if (targets2.length) { - choices.push("选项二"); - choiceList[1] += "(" + get.translation(targets2) + ")"; - } else choiceList[1] = '' + choiceList[1] + ""; - if (!choices.length) event.finish(); - else - player - .chooseControl(choices, "cancel2") - .set("prompt", get.prompt("dczuojian")) - .set("choiceList", choiceList) - .set("ai", () => { - var controls = _status.event.controls, - choice = _status.event.choice; - if ( - !controls.includes("选项一") || - (controls.includes("选项二") && choice == 1) - ) - return "选项二"; - return "选项一"; - }) - .set("choice", eff <= 0 && eff2 <= 0 ? "cancel2" : eff > -eff2 ? 0 : 1); - "step 1"; - if (result.control == "选项一") { - player.logSkill("dczuojian", targets); - game.asyncDraw(targets, 1); - } else if (result.control == "选项二") { - player.logSkill("dczuojian", event.targets2); - for (var target of event.targets2) { - player.discardPlayerCard("h", target, true); - } - } - }, - }, - //胡金定 - dcdeshi: { - audio: 2, - trigger: { player: "damageBegin4" }, - forced: true, - filter: function (event, player) { - return player.isDamaged() && event.card && event.card.name == "sha"; - }, - content: function () { - "step 0"; - trigger.cancel(); - for (var func of ["discardPile", "cardPile2"]) { - var card = get[func]((card) => card.name == "sha"); - if (card) { - player.gain(card, "gain2"); - break; - } - } - "step 1"; - player.loseMaxHp(); - }, - ai: { - halfneg: true, - filterDamage: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.card && arg.card.name == "sha") return true; - return false; - }, - }, - }, - dcwuyuan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h", "sha") > 0; - }, - filterCard: { name: "sha" }, - filterTarget: lib.filter.notMe, - check: function (card) { - var player = _status.event.player; - if ( - get.color(card) == "red" && - game.hasPlayer(function (current) { - return ( - current != player && current.isDamaged() && get.attitude(player, current) > 2 - ); - }) - ) - return 2; - if (get.natureList(card).length) return 1.5; - return 1; - }, - discard: false, - lose: false, - delay: false, - content: function () { - "step 0"; - player.give(cards, target, "give"); - player.recover(); - "step 1"; - var num = 1; - if (get.natureList(cards[0]).length) num++; - player.draw("nodelay"); - target.draw(num); - if (get.color(cards[0]) == "red") target.recover(); - }, - ai: { - order: 1, - result: { - player: function (player, target) { - if (player.isDamaged()) return 1; - return 0; - }, - target: function (player, target) { - if (ui.selected.cards.length) { - var num = 1; - if (get.natureList(ui.selected.cards[0]).length) num++; - if (target.hasSkillTag("nogain")) num = 0; - if (get.color(ui.selected.cards[0]) == "red") return num + 2; - else return num + 1; - } - return 1; - }, - }, - }, - }, - //李异谢旌 - dcdouzhen: { - audio: 2, - trigger: { - player: ["useCard", "respond"], - }, - forced: true, - zhuanhuanji: "number", - mark: true, - marktext: "☯", - intro: { - content: function (storage, player) { - var str = "
  • 已转换过" + get.cnNumber(storage || 0) + "次。
  • 你的回合内,"; - str += - player.countMark("dcdouzhen") % 2 - ? "你的红色基本牌均视为普【杀】且无次数限制。" - : "你的黑色基本牌均视为【决斗】且使用时获得目标的一张牌。"; - return str; - }, - }, - filter: function (event, player) { - if ( - player != _status.currentPhase || - !event.card.isCard || - !event.cards || - event.cards.length != 1 || - get.type(event.cards[0]) != "basic" - ) - return false; - if (player.countMark("dcdouzhen") % 2) - return get.color(event.cards[0]) == "red" && event.card.name == "sha"; - return ( - event.name != "respond" && - get.color(event.cards[0]) == "black" && - event.card.name == "juedou" - ); - }, - content: function () { - if (player.countMark("dcdouzhen") % 2) { - // if(trigger.addCount!==false){ - // trigger.addCount=false; - // if(player.stat[player.stat.length-1].card.sha>0){ - // player.stat[player.stat.length-1].card.sha--; - // } - // } - } else { - if ( - trigger.targets.length && - trigger.targets.filter((i) => i.countGainableCards(player, "he") > 0).length - ) - player.gainMultiple(trigger.targets.sortBySeat(), "he"); - } - player.changeZhuanhuanji("dcdouzhen"); - }, - ai: { - effect: { - player: function (card, player, target) { - if (card.name != "juedou") return; - if ( - player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: card, - }, - true - ) - ) { - return [1, 1]; - } - var hs1 = target.getCards("h", "sha"); - var hs2 = player.getCards( - "h", - (card) => - (get.color(card) == "red" && get.type(card) == "basic") || - get.name(card) == "sha" - ); - var hsx = target.getCards("h"); - if ( - hs1.length > hs2.length + 1 || - (hsx.length > 2 && hs2.length == 0 && hsx[0].number < 6) || - (hsx.length > 3 && hs2.length == 0) || - (hs1.length > hs2.length && (!hs2.length || hs1[0].number > hs2[0].number)) - ) { - return [1, -2]; - } - return [1, -0.5]; - }, - }, - }, - mod: { - cardname: function (card, player) { - if (get.type(card, null, false) != "basic" || player != _status.currentPhase) return; - if (player.countMark("dcdouzhen") % 2) { - if (get.color(card) == "red") return "sha"; - } else { - if (get.color(card) == "black") return "juedou"; - } - }, - cardnature: function (card, player) { - if (get.type(card, null, false) != "basic" || player != _status.currentPhase) return; - if (player.countMark("dcdouzhen") % 2) { - if (get.color(card) == "red") return false; - } - }, - cardUsable: function (card, player) { - if ( - _status.currentPhase == player && - card.name == "sha" && - player.countMark("dcdouzhen") % 2 && - get.color(card) == "red" && - card.isCard - ) - return Infinity; - }, - }, - }, - //穆顺 - dcjinjian: { - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - forced: true, - locked: false, - filter: function (event, player, name) { - return ( - name == "damageSource" || - (event.source && event.source != player && event.source.isIn()) - ); - }, - content: function () { - "step 0"; - player.addMark("dcjinjian", 1); - game.delayx(); - "step 1"; - var source = trigger.source; - if (source && source != player && source.isIn() && player.canCompare(source)) { - player - .chooseBool( - "是否和" + get.translation(source) + "拼点?", - "若你赢,则你恢复1点体力" - ) - .set( - "goon", - (player.countCards("h") == 1 || - player.hasCard(function (card) { - return get.value(card) <= 5 || get.number(card) > 10; - })) && - (get.attitude(player, source) <= 0 || source.countCards("h") >= 4) - ) - .set("ai", function () { - return _status.event.goon; - }); - } else event.finish(); - "step 2"; - if (result.bool) { - player.line(trigger.source, "green"); - player.chooseToCompare(trigger.source); - } else event.finish(); - "step 3"; - if (result.bool) player.recover(); - }, - intro: { - name2: "劲", - content: "mark", - }, - mod: { - attackRange: function (player, num) { - return num + player.countMark("dcjinjian"); - }, - }, - }, - dcshizhao: { - audio: 2, - usable: 1, - trigger: { - player: ["loseAfter"], - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - filter: function (event, player) { - return ( - player != _status.currentPhase && - player.countCards("h") == 0 && - event.getl(player).hs.length > 0 - ); - }, - content: function () { - if (player.hasMark("dcjinjian")) { - player.removeMark("dcjinjian", 1); - player.draw(2); - } else { - player.addTempSkill("dcshizhao_effect"); - player.addMark("dcshizhao_effect", 1, false); - game.delayx(); - } - }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - trigger: { player: "damageBegin1" }, - forced: true, - content: function () { - trigger.num += player.countMark(event.name); - player.removeSkill(event.name); - }, - }, - }, - ai: { - combo: "dcjinjian", - }, - }, - //赵俨 - dcfuning: { - audio: 2, - trigger: { player: "useCard" }, - prompt2: function (event, player) { - return ( - "摸两张牌,然后弃置" + - get.cnNumber( - 1 + - player.getHistory("useSkill", function (evt) { - return evt.skill == "dcfuning"; - }).length - ) + - "张牌" - ); - }, - check: function (event, player) { - return ( - player.getHistory("useSkill", function (evt) { - return evt.skill == "dcfuning"; - }).length < 2 - ); - }, - content: function () { - player.draw(2); - player.chooseToDiscard( - "he", - true, - +player.getHistory("useSkill", function (evt) { - return evt.skill == "dcfuning"; - }).length - ); - }, - }, - dcbingji: { - audio: 2, - enable: "phaseUse", - usable: 4, - filter: function (event, player) { - var hs = player.getCards("h"), - suits = player.getStorage("dcbingji_mark"); - if (!hs.length) return false; - var suit = get.suit(hs[0], player); - if (suit == "none" || suits.includes(suit)) return false; - for (var i = 1; i < hs.length; i++) { - if (get.suit(hs[i], player) != suit) return false; - } - return true; - }, - ai: { - order: 10, - result: { player: 1 }, - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog("秉纪", [["sha", "tao"], "vcard"], "hidden"); - }, - filter: function (button, player) { - return lib.filter.cardEnabled( - { - name: button.link[2], - isCard: true, - storage: { dcbingji: true }, - }, - player, - "forceEnable" - ); - }, - check: function (button) { - var card = { - name: button.link[2], - isCard: true, - storage: { dcbingji: true }, - }, - player = _status.event.player; - return Math.max.apply( - Math, - game - .filterPlayer(function (target) { - if (player == target) return false; - return ( - lib.filter.targetEnabled2(card, player, target) && - lib.filter.targetInRange(card, player, target) - ); - }) - .map(function (target) { - return get.effect(target, card, player, player); - }) - ); - }, - backup: function (links, player) { - return { - viewAs: { - name: links[0][2], - isCard: true, - storage: { dcbingji: true }, - }, - filterCard: () => false, - selectCard: -1, - filterTarget: function (card, player, target) { - if (!card) card = get.card(); - if (player == target) return false; - return ( - lib.filter.targetEnabled2(card, player, target) && - lib.filter.targetInRange(card, player, target) - ); - }, - selectTarget: 1, - ignoreMod: true, - filterOk: () => true, - precontent: function () { - player.logSkill("dcbingji"); - delete event.result.skill; - var hs = player.getCards("h"); - player.showCards(hs, get.translation(player) + "发动了【秉纪】"); - player.markAuto("dcbingji_mark", [get.suit(hs[0], player)]); - player.addTempSkill("dcbingji_mark"); - }, - }; - }, - prompt: function (links, player) { - return "请选择【" + get.translation(links[0][2]) + "】的目标"; - }, - }, - subSkill: { - mark: { - charlotte: true, - onremove: true, - trigger: { player: "useCard1" }, - forced: true, - popup: false, - firstDo: true, - filter: function (event, player) { - return ( - event.addCount !== false && - event.card.name == "sha" && - event.card.storage && - event.card.storage.dcbingji - ); - }, - content: function () { - trigger.addCount = false; - player.getStat("card").sha--; - }, - }, - }, - }, - //王威 - dcruizhan: { - audio: 2, - trigger: { global: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return ( - player != event.player && - event.player.countCards("h") >= Math.max(1, event.player.hp) && - player.canCompare(event.player) - ); - }, - logTarget: "player", - check: function (event, player) { - var goon = player.hasCard(function (card) { - return card.name == "sha" || get.value(card) <= 5; - }); - var target = event.player; - if (goon && get.attitude(player, target) < 0) { - return get.effect(target, { name: "sha" }, player, player) > 0; - } - return 0; - }, - content: function () { - "step 0"; - event.target = trigger.player; - player.chooseToCompare(event.target).set("ai", 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 (player == event.player) { - if (get.name(card, player) == "sha") { - return 10 + getn(card); - } - return getn(card) - get.value(card) / 2 + addi; - } else { - if (get.name(card, player) == "sha") { - return -10 - getn(card) - get.value(card) / 2 + addi; - } - return getn(card) - get.value(card) / 2 + addi; - } - }); - "step 1"; - var bool1 = result.bool; - var bool2 = - get.name(result.player, player) == "sha" || get.name(result.target, target) == "sha"; - if (bool1 || bool2) { - if (player.canUse("sha", target, false)) { - player.useCard({ name: "sha", isCard: true }, target, false); - if (!bool1 || !bool2) event.finish(); - } else event.finish(); - } else event.finish(); - "step 2"; - if ( - target.hasCard(function (card) { - return lib.filter.canBeGained(card, target, player); - }, "he") && - player.hasHistory("sourceDamage", function (evt) { - var evtx = evt.getParent("useCard"); - return evtx && evtx.card == evt.card && evtx.getParent() == event; - }) - ) - player.gainPlayerCard(target, true, "he"); - }, - }, - dcshilie: { - audio: 2, - enable: "phaseUse", - usable: 1, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog( - "示烈:请选择一项", - [ - [ - ["recover", "回复1点体力,将两张牌置于武将牌上作为“示烈”"], - ["losehp", "失去1点体力,获得两张“示烈”牌"], - ], - "textbutton", - ], - "hidden" - ); - }, - check: function (button) { - return button.link == "recover" ? 1 : 0; - }, - backup: function (links, player) { - return get.copy(lib.skill["dcshilie_" + links[0]]); - }, - prompt: () => "点击“确定”以执行选项", - }, - intro: { - markcount: "expansion", - content: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: "dcshilie_die", - ai: { - order: 0.5, - result: { - player: function (player) { - if (player.isDamaged() && !player.countCards("h", "tao")) return 1; - return 0; - }, - }, - }, - subSkill: { - backup: {}, - recover: { - audio: "dcshilie", - selectCard: -1, - selectTarget: -1, - filterCard: () => false, - filterTarget: () => false, - multitarget: true, - content: function () { - "step 0"; - player.recover(); - "step 1"; - var hs = player.getCards("he"); - if (!hs.length) event.finish(); - else if (hs.length <= 2) event._result = { bool: true, cards: hs }; - else player.chooseCard("he", 2, true, "选择两张牌作为“示烈”牌"); - "step 2"; - if (result.bool) { - player.addToExpansion(result.cards, player, "give").gaintag.add("dcshilie"); - } else event.finish(); - "step 3"; - var cards = player.getExpansions("dcshilie"); - if (cards.length > game.countPlayer()) { - player.loseToDiscardpile(cards.slice(game.countPlayer())); - } - }, - }, - losehp: { - audio: "dcshilie", - selectCard: -1, - selectTarget: -1, - filterCard: () => false, - filterTarget: () => false, - multitarget: true, - content: function () { - "step 0"; - player.loseHp(); - "step 1"; - var hs = player.getExpansions("dcshilie"); - if (!hs.length) event.finish(); - else if (hs.length <= 2) event._result = { bool: true, links: hs }; - else player.chooseButton(["选择获得两张“示烈”牌", hs], 2, true); - "step 2"; - if (result.bool) { - player.gain(result.links, "gain2"); - } - }, - }, - die: { - audio: "dcshilie", - forceDie: true, - trigger: { player: "die" }, - filter: function (event, player) { - return player.getExpansions("dcshilie").length > 0; - }, - direct: true, - skillAnimation: true, - animationColor: "metal", - content: function () { - "step 0"; - player.chooseTarget( - get.prompt("dcshilie"), - "令一名角色获得你的“示烈”牌", - function (card, player, target) { - return target != player && target != _status.event.getTrigger().source; - } - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dcshilie_die", target); - player.give(player.getExpansions("dcshilie"), target, "give"); - } - }, - }, - }, - }, - //胡班 - dcchongyi: { - audio: 2, - init: () => { - game.addGlobalSkill("dcchongyi_ai"); - }, - onremove: () => { - if (!game.hasPlayer((i) => i.hasSkill("dcchongyi"), true)) - game.removeGlobalSkill("dcchongyi_ai"); - }, - trigger: { global: "useCard" }, - logTarget: "player", - filter: function (event, player) { - if (event.card.name != "sha" || !event.player.isIn()) return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != event.player) return false; - var goon = false; - var history = event.player.getHistory("useCard", function (evtx) { - if (goon || evtx.getParent("phaseUse") != evt) return false; - goon = true; - return true; - }); - return history[0] == event; - }, - prompt2: (event) => "令其摸两张牌,且使用【杀】的次数上限+1", - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - content: function () { - var target = trigger.player; - target.draw(2); - target.addMark("dcchongyi_sha", 1, false); - target.addTempSkill("dcchongyi_sha"); - }, - group: "dcchongyi_end", - subSkill: { - ai: { - mod: { - aiOrder: function (player, card, num) { - if (card.name != "sha") return; - var evt = _status.event.getParent("phaseUse"); - if (!evt || evt.player != player) return; - if ( - player.hasHistory("useCard", function (evtx) { - return evtx.getParent("phaseUse") == evt; - }) - ) - return; - if ( - game.hasPlayer(function (current) { - return ( - current.hasSkill("dcchongyi") && - get.attitude(player, current) >= 0 - ); - }) - ) - return num + 10; - }, - }, - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer((i) => i.hasSkill("dcchongyi"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("dcchongyi_ai"); - }, - }, - end: { - audio: "dcchongyi", - trigger: { global: "phaseUseEnd" }, - logTarget: "player", - filter: function (event, player) { - if (!event.player.isIn()) return false; - var history = event.player.getHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == event; - }); - return history.length && history[history.length - 1].card.name == "sha"; - }, - prompt2(event, player) { - const target = event.player; - const history = target.getHistory("useCard", (evt) => { - return evt.getParent("phaseUse") === event; - }); - const evt = history.lastItem, - cards = evt.cards.filterInD("d"); - let str = "令" + get.translation(target) + "本回合的手牌上限+1"; - if (cards.length) str += `,然后你获得${get.translation(cards)}`; - str += "。"; - return str; - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - async content(event, trigger, player) { - const target = trigger.player; - target.addMark("dcchongyi_keep", 1, false); - target.addTempSkill("dcchongyi_keep"); - const history = target.getHistory("useCard", (evt) => { - return evt.getParent("phaseUse") === trigger; - }); - const evt = history.lastItem, - cards = evt.cards.filterInD("d"); - if (cards.length) await player.gain(cards, "gain2"); - else await game.asyncDelayx(); - }, - }, - sha: { - charlotte: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("dcchongyi_sha"); - }, - }, - onremove: true, - intro: { content: "使用【杀】的次数上限+#" }, - }, - keep: { - charlotte: true, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("dcchongyi_keep"); - }, - }, - onremove: true, - intro: { content: "手牌上限+#" }, - }, - }, - }, - //牛辅 - dcxiaoxi: { - auto: 2, - trigger: { player: "phaseUseBegin" }, - forced: true, - filter: function (event, player) { - return player.maxHp > 1; - }, - content: function () { - "step 0"; - if (player.maxHp <= 2) event._result = { index: 0 }; - else - player - .chooseControl("1点", "2点") - .set("prompt", "宵袭:减少1或2点体力上限") - .set("ai", function () { - var player = _status.event.player; - if ( - !game.hasPlayer(function (current) { - if (!player.inRange(current) || get.attitude(player, current) >= 0) - return false; - if ( - get.effect(current, { name: "shunshou_copy2" }, player, player) > - 0 && - current.countCards("h") + - current.countCards("e", function (card) { - return get.value(card, current) > 0; - }) > - 1 - ) - return true; - if ( - get.effect(current, { name: "sha" }, player, player) > 0 && - current.countCards("hs", "shan") + current.hp > 1 - ) - return true; - }) - ) - return 0; - return 1; - }); - "step 1"; - player.loseMaxHp(1 + result.index); - event.num = 1 + result.index; - "step 2"; - if (!game.hasPlayer((current) => player.inRange(current))) event.finish(); - else - player - .chooseTarget( - "请选择【宵袭】的目标", - "然后你选择一项:⒈获得该角色的" + - get.cnNumber(num) + - "张牌。⒉视为对其使用" + - get.cnNumber(num) + - "张【杀】。", - function (card, player, target) { - return player.inRange(target); - }, - true - ) - .set("ai", function (target) { - var player = _status.event.player; - if (get.attitude(player, target) >= 0) return 0; - var eff1 = get.effect(target, { name: "shunshou_copy2" }, player, player); - if ( - eff1 > 0 && - target.countCards("h") + - target.countCards("e", function (card) { - return get.value(card, target) > 0; - }) > - 1 - ) - eff1 *= 1.6; - var eff2 = player.canUse("sha", target) - ? get.effect(target, { name: "sha" }, player, player) - : 0; - if (eff2 > 0 && target.countCards("hs", "shan") + target.hp > 1) eff2 *= 2; - return Math.max(eff1, eff2); - }); - "step 3"; - var target = result.targets[0]; - player.line(target, "green"); - event.target = target; - var bool1 = target.countGainableCards(player, "he") > 0; - var bool2 = player.canUse("sha", target); - if (!bool1 && !bool2) event.finish(); - else if (bool1 && bool2) { - var str = get.translation(target), - numx = get.cnNumber(num); - player - .chooseControl() - .set("choiceList", [ - "获得" + str + "的" + numx + "张牌", - "视为对" + str + "使用" + numx + "张【杀】", - ]) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().target; - var eff1 = get.effect(target, { name: "shunshou_copy2" }, player, player); - if ( - eff1 > 0 && - target.countCards("h") + - target.countCards("e", function (card) { - return get.value(card, target) > 0; - }) > - 1 - ) - eff1 *= 1.6; - var eff2 = player.canUse("sha", target) - ? get.effect(target, { name: "sha" }, player, player) - : 0; - if (eff2 > 0 && target.countCards("hs", "shan") + target.hp > 1) eff2 *= 2; - return eff1 > eff2 ? 0 : 1; - }); - } else event._result = { index: bool1 ? 0 : 1 }; - "step 4"; - if (result.index == 0) { - player.gainPlayerCard(target, true, num, "he"); - event.finish(); - } - "step 5"; - event.num--; - if (player.canUse("sha", target, false)) { - player.useCard({ name: "sha", isCard: true }, target, false); - if (event.num > 0) event.redo(); - } - }, - }, - xiongrao: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - limited: true, - skillAnimation: true, - animationColor: "soil", - prompt: function (event, player) { - var str = "是否发动【熊扰】?"; - str += "(可摸" + get.cnNumber(Math.max(0, 7 - player.maxHp)) + "张牌)"; - return str; - }, - logTarget: (event, player) => game.filterPlayer((current) => current != player), - check: function (event, player) { - return player.maxHp <= 3; - }, - content: function () { - player.awakenSkill("xiongrao"); - game.countPlayer(function (current) { - if (current != player) current.addTempSkill("xiongrao_blocker"); - }); - var num = 7 - player.maxHp; - if (num > 0) { - player.gainMaxHp(num); - player.draw(num); - } - }, - subSkill: { - blocker: { - init: function (player, skill) { - player.addSkillBlocker(skill); - }, - onremove: function (player, skill) { - player.removeSkillBlocker(skill); - }, - charlotte: true, - locked: true, - skillBlocker: function (skill, player) { - var info = get.info(skill); - return ( - info && - !info.charlotte && - !get.is.locked(skill) && - !info.limited && - !info.juexingji - ); - }, - mark: true, - marktext: "扰", - intro: { - content: function (list, player, skill) { - var storage = player.getSkills(null, false, false).filter(function (i) { - return lib.skill.xiongrao_blocker.skillBlocker(i, player); - }); - if (storage.length) return "失效技能:" + get.translation(storage); - return "无失效技能"; - }, - }, - }, - }, - }, - //卞喜 - dunxi: { - audio: 2, - trigger: { player: "useCard" }, - direct: true, - filter: function (event, player) { - if (!get.tag(event.card, "damage")) return false; - return event.targets.some((target) => target != player && target.isIn()); - }, - content: function () { - "step 0"; - var targets = trigger.targets.filter(function (current) { - return current != player && current.isIn(); - }); - if (targets.length == 1) { - event.target = targets[0]; - player - .chooseBool( - get.prompt("dunxi", event.target), - "令" + get.translation(event.target) + "获得一枚“钝”标记" - ) - .set("goon", get.attitude(player, event.target) < 0) - .set("ai", () => _status.event.goon); - } else { - player - .chooseTarget( - get.prompt("dunxi"), - "选择一名目标角色获得一枚“钝”标记", - function (card, player, target) { - return ( - target != player && - _status.event.getTrigger().targets.includes(target) - ); - } - ) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att >= 0) return 0; - return -att / (1 + target.hasMark("dunxi")); - }); - } - "step 1"; - if (result.bool) { - var target = event.target || result.targets[0]; - player.logSkill("dunxi", target); - target.addMark("dunxi", 1); - game.delayx(); - } - }, - intro: { content: "mark", name2: "钝" }, - group: "dunxi_random", - subSkill: { - random: { - audio: "dunxi", - trigger: { global: "useCard" }, - forced: true, - locked: false, - filter: function (event, player) { - if ( - !event.player.hasMark("dunxi") || - event.targets.length != 1 || - event._dunxi || - _status.dying.length - ) - return false; - var type = get.type2(event.card, false); - return type == "basic" || type == "trick"; - }, - logTarget: "player", - line: "fire", - content: function () { - "step 0"; - trigger._dunxi = true; - trigger.player.removeMark("dunxi", 1); - var target = trigger.targets[0]; - event.target = target; - trigger.targets.remove(target); - //trigger.triggeredTargets1.remove(target); - trigger.untrigger(); - game.delayx(); - "step 1"; - var list; - if (get.type(event.card) != "delay") - list = game.filterPlayer(function (current) { - return lib.filter.targetEnabled2(trigger.card, trigger.player, current); - }); - else - list = game.filterPlayer(function (current) { - return current.canAddJudge(event.card); - }); - if (list.length) target = list.randomGet(); - trigger.targets.push(target); - trigger.player.line(target, "fire"); - game.log(trigger.card, "的目标被改为", target); - if (target == event.target) { - trigger.player.loseHp(); - var evt = trigger.getParent("phaseUse"); - if (evt && evt.player == trigger.player) evt.skipped = true; - } - }, - }, - }, - }, - //冯方 - dcditing: { - audio: 2, - trigger: { global: "phaseUseBegin" }, - logTarget: "player", - filter: function (event, player) { - return player.hp > 0 && event.player.countCards("h") > 0 && event.player.inRange(player); - }, - prompt2: (event, player) => - "观看其" + - get.cnNumber(Math.min(player.hp, event.player.countCards("h"))) + - "张手牌并选择其中一张", - check: function (event, player) { - var target = event.player; - if (get.attitude(player, target) > 0) return true; - if (Math.min(player.hp, target.countCards("h")) > 2) return true; - return false; - }, - content: function () { - "step 0"; - var target = trigger.player; - var cards = target.getCards("h"); - var num = Math.min(cards.length, player.hp), - cards2 = cards.randomGets(num); - player - .chooseButton( - [get.translation(target) + "的手牌(" + num + "/" + cards.length + ")", cards2], - true - ) - .set("ai", function (button) { - var player = _status.event.player, - target = _status.event.getTrigger().player, - card = button.link; - var att = get.attitude(player, target); - var val = target.getUseValue(card, null, true); - if (val <= 0) return (-get.value(card, target) / 2) * get.sgn(att - 0.05); - if (target.canUse(card, player) && get.effect(player, card, target, target) > 0) { - var eff = get.effect(player, card, target, player); - if (eff < 0) val -= eff; - } - return val; - }); - "step 1"; - if (result.bool) { - player.addTempSkill("dcditing_effect", "phaseUseAfter"); - player.storage.dcditing_effect = [trigger.player, result.links[0]]; - } - }, - subSkill: { - effect: { - audio: "dcditing", - charlotte: true, - trigger: { target: "useCardToTargeted" }, - forced: true, - filter: function (event, player) { - var list = player.storage.dcditing_effect; - return list && event.player == list[0] && event.cards.includes(list[1]); - }, - content: function () { - trigger.excluded.add(player); - game.delayx(); - }, - group: ["dcditing_draw", "dcditing_gain"], - }, - draw: { - audio: "dcditing", - charlotte: true, - trigger: { global: "useCardAfter" }, - forced: true, - filter: function (event, player) { - var list = player.storage.dcditing_effect; - return ( - list && - event.player == list[0] && - event.cards.includes(list[1]) && - !event.targets.includes(player) - ); - }, - content: function () { - player.draw(2); - }, - }, - gain: { - audio: "dcditing", - charlotte: true, - trigger: { global: "phaseUseEnd" }, - forced: true, - filter: function (event, player) { - var list = player.storage.dcditing_effect; - return ( - list && - event.player == list[0] && - event.player.getCards("h").includes(list[1]) - ); - }, - content: function () { - var list = player.storage.dcditing_effect; - player.gain(list[0], list[1], "giveAuto", "bySelf"); - }, - }, - }, - }, - dcbihuo: { - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - direct: true, - filter: function (event, player) { - return event.source && event.player != event.source; - }, - content: function () { - "step 0"; - event.num = event.triggername == "damageEnd" ? 1 : -1; - player - .chooseTarget( - get.prompt("dcbihuo"), - "令一名角色下回合的额定摸牌数" + (event.num > 0 ? "+1" : "-1") - ) - .set("ai", function (target) { - var player = _status.event.player, - num = _status.event.getParent().num; - var att = get.attitude(player, target); - if (num > 0) { - if (att <= 0) return 0; - if (target.hasJudge("lebu")) return att / 10; - return ( - (att / Math.sqrt(Math.min(5, 1 + target.countCards("h")))) * - Math.sqrt(1 + target.hp) - ); - } - if (num < 0) { - if (att >= 0) return 0; - if ((target.storage.dcbihuo_effect || 0) <= -2) return -att / 10; - return ( - (-att / Math.sqrt(Math.min(5, 1 + target.countCards("h")))) * - Math.sqrt(1 + target.hp) - ); - } - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dcbihuo", target); - if (typeof target.storage.dcbihuo_effect != "number") - target.storage.dcbihuo_effect = 0; - target.storage.dcbihuo_effect += event.num; - target.addTempSkill("dcbihuo_effect", { player: "phaseAfter" }); - game.delayx(); - } - }, - subSkill: { - effect: { - charlotte: true, - trigger: { player: "phaseDrawBegin" }, - forced: true, - onremove: true, - content: function () { - var num = player.storage.dcbihuo_effect; - trigger.num += num; - game.log(player, "的额定摸牌数", "#g" + (num >= 0 ? "+" : "") + num); - }, - mark: true, - intro: { - content: (num) => "额定摸牌数" + (num >= 0 ? "+" : "") + num, - }, - }, - }, - }, - //秦宜禄 - piaoping: { - audio: 2, - trigger: { player: "useCard" }, - forced: true, - zhuanhuanji: true, - filter: function (event, player) { - return !player.hasSkill("piaoping_blocker", null, null, false); - }, - content: function () { - player.changeZhuanhuanji("piaoping"); - var num = Math.min( - player.hp, - player.getHistory("useSkill", function (evt) { - return evt.skill == "piaoping"; - }).length - ); - if (num <= 0) return; - if (player.storage.piaoping == true) player.draw(num); - else if ( - player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "piaoping"); - }, "he") - ) { - game.delayx(); - player.chooseToDiscard(true, "he", num); - } - }, - mark: true, - marktext: "☯", - intro: { - content: function (storage) { - if (storage) - return "转换技,锁定技。当你使用一张牌时,你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)"; - return "转换技,锁定技。当你使用一张牌时,你摸X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)"; - }, - }, - subSkill: { blocker: { charlotte: true } }, - }, - tuoxian: { - audio: 2, - ai: { combo: "piaoping" }, - trigger: { player: "loseAfter" }, - marktext: "栗", - filter: function (event, player) { - return ( - event.type == "discard" && - event.getParent(3).name == "piaoping" && - player.countMark("tuoxian") > 0 && - event.cards.filterInD("d").length > 0 - ); - }, - direct: true, - content: function () { - "step 0"; - event.cards = trigger.cards.filterInD("d"); - player - .chooseTarget( - lib.filter.notMe, - get.prompt("tuoxian"), - "令一名其他角色获得" + get.translation(event.cards) - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att < 0) return 0; - if (target.hasSkillTag("nogain")) att /= 10; - return att * Math.pow(1 + target.countCards("he"), 0.25); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("tuoxian", target); - player.removeMark("tuoxian", 1); - target.gain(cards, "gain2"); - } else event.finish(); - "step 2"; - target - .chooseControl() - .set("choiceList", [ - "弃置区域内的" + get.cnNumber(cards.length) + "张牌", - "令" + get.translation(player) + "的〖漂萍〗于本回合内失效", - ]) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().player; - if ( - player.hasCard(function (card) { - return ( - get.effect( - player, - { name: card.viewAs || card.name }, - player, - player - ) < 0 - ); - }, "j") || - player.hasCard(function (card) { - return get.value(card, player) <= 0; - }) - ) - return 0; - if (get.attitude(player, target) <= 0 || !target.isPhaseUsing()) return 1; - if ( - !target.needsToDiscard() && - !target.hasCard(function (card) { - return !target.hasValueTarget(card, null, true); - }, "hs") - ) - return 1; - return 0; - }); - "step 3"; - if (result.index == 0) { - if (target.countCards("j") > 0) - target.discardPlayerCard(target, cards.length, true, "hej"); - else target.chooseToDiscard("he", true, cards.length); - } else player.addTempSkill("piaoping_blocker"); - }, - init(player) { - player.addMark("tuoxian", 1, false); - }, - intro: { name2: "栗", content: "剩余可用#次" }, - }, - chuaili: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - forced: true, - filter: function (event, player) { - if (player == event.player || get.color(event.card) != "black") return false; - if (!player.hasSkill("piaoping", null, null, false)) return false; - return ( - player.storage.piaoping == true || - !player.hasSkill("chuaili_blocker", null, null, false) - ); - }, - content: function () { - if (player.storage.piaoping == true) { - player.changeZhuanhuanji("piaoping"); - } else { - player.addMark("tuoxian", 1, false); - if (player.countCards("tuoxian") > 3) player.addTempSkill("chuaili_blocker"); - } - game.delayx(); - }, - ai: { combo: "piaoping" }, - subSkill: { blocker: { charlotte: true } }, - }, - //闫柔 - choutao: { - audio: 2, - trigger: { - player: "useCard", - target: "useCardToTargeted", - }, - filter: function (event, player) { - if (event.card.name != "sha" || !event.player.isIn()) return false; - if (player == event.player) - return player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "choutao"); - }, "he"); - return event.player.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, event.player); - }, "he"); - }, - check: function (event, player) { - if (player == event.player) { - if ( - !player.hasCard(function (card) { - return get.value(card) <= 5; - }, "he") - ) - return false; - for (var i of event.targets) { - var eff1 = get.damageEffect(i, player, player); - if (eff1 < 0) return false; - if (i.hasShan() && eff1 > 0) return true; - } - var sha = false; - return ( - player.getCardUsable({ name: "sha" }) <= 0 && - player.hasCard(function (card) { - if (!sha && get.name(card) == "sha" && player.getUseValue(card) > 0) { - sha = true; - return false; - } - return sha && get.value(card) <= 5; - }, "hs") - ); - } else { - var eff1 = get.effect(event.player, { name: "guohe_copy2" }, player, player); - var eff2 = get.damageEffect(player, event.player, player); - if (!player.hasShan()) return eff1 > 0; - if (eff2 > 0) return eff1 > 0; - return player.hp > 2 && eff2 < eff1; - } - }, - logTarget: "player", - shaRelated: true, - content: function () { - "step 0"; - if (player != game.me && !player.isOnline() && !player.isUnderControl()) game.delayx(); - if (player == trigger.player) - player.chooseToDiscard("he", true).set("ai", function (card) { - var player = _status.event.player; - var val = player.getUseValue(card); - if (get.name(card) == "sha" && player.getUseValue(card) > 0) val += 5; - return 20 - val; - }); - else player.discardPlayerCard(trigger.player, true, "he"); - "step 1"; - trigger.directHit.addArray(game.players); - if (player == trigger.player && trigger.addCount !== false) { - trigger.addCount = false; - player.getStat().card.sha--; - } - }, - }, - xiangshu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - limited: true, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return ( - (player.getStat("damage") || 0) > 0 && - game.hasPlayer((current) => current.isDamaged()) - ); - }, - content: function () { - "step 0"; - event.num = Math.min(5, player.getStat("damage")); - player - .chooseTarget( - "是否发动限定技【襄戍】?", - "令一名角色回复" + event.num + "点体力并摸" + get.cnNumber(event.num) + "张牌", - function (card, player, target) { - return target.isDamaged(); - } - ) - .set("ai", function (target) { - var num = _status.event.getParent().num, - player = _status.event.player; - var att = get.attitude(player, target); - if (att > 0 && num >= Math.min(player.hp, 2)) - return att * Math.sqrt(target.getDamagedHp()); - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.awakenSkill("xiangshu"); - player.logSkill("xiangshu", target); - target.recover(num); - target.draw(num); - if (player != target) player.addExpose(0.2); - } - }, - }, - //朱灵 - dczhanyi: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - var list = ["basic", "trick", "equip"]; - var list2 = []; - var hs = player.getCards("he"); - for (var card of hs) { - var type = get.type2(card, player); - if (list.includes(type)) { - var bool = lib.filter.cardDiscardable(card, player, "dczhanyi"); - if (bool) list2.add(type); - else { - list.remove(type); - list2.remove(type); - } - } - } - return list2.length > 0; - }, - content: function () { - "step 0"; - var list = ["basic", "trick", "equip"]; - var list2 = []; - var hs = player.getCards("he"); - for (var card of hs) { - var type = get.type2(card, player); - if (list.includes(type)) { - var bool = lib.filter.cardDiscardable(card, player, "dczhanyi"); - if (bool) list2.add(type); - else { - list.remove(type); - list2.remove(type); - } - } - } - player - .chooseControl(list2, "cancel2") - .set("prompt", get.prompt("dczhanyi")) - .set("prompt2", "弃置一种类型的所有牌") - .set("ai", function () { - var player = _status.event.player; - var getval = function (control) { - if (control == "cancel2") return 0; - var hs = player.getCards("h"), - eff = 0; - var es = player.getCards("e"); - var ss = player.getCards("s"); - var sha = player.getCardUsable({ name: "sha" }); - for (var i of hs) { - var type = get.type2(i); - if (type == control) { - eff -= get.value(i, player); - } else { - switch (type) { - case "basic": - if (sha > 0 && get.name(i) == "sha") { - sha--; - var add = 3; - if ( - !player.hasValueTarget(i) && - player.hasValueTarget(i, false) - ) - add += player.getUseValue(i, false); - eff += add; - } - break; - case "trick": - if (player.hasValueTarget(i)) eff += 6; - break; - case "equip": - if (player.hasValueTarget({ name: "guohe_copy2" })) - eff += player.getUseValue({ name: "guohe_copy2" }); - break; - } - } - } - if (control == "equip") { - for (var i of es) eff -= get.value(i, player); - } else { - for (var i of ss) { - var type = get.type2(i); - if (type == control) continue; - switch (type) { - case "basic": - if (sha > 0 && get.name(i) == "sha") { - sha--; - var add = 3; - if ( - !player.hasValueTarget(i) && - player.hasValueTarget(i, false) - ) - add += player.getUseValue(i, false); - eff += add; - } - break; - case "trick": - if (player.hasValueTarget(i)) eff += 6; - break; - case "equip": - if (player.hasValueTarget({ name: "guohe_copy2" })) - eff += player.getUseValue({ name: "guohe_copy2" }); - break; - } - } - } - return eff; - }; - var controls = _status.event.controls.slice(0); - var eff = 0, - current = "cancel2"; - for (var i of controls) { - var effx = getval(i); - if (effx > eff) { - eff = effx; - current = i; - } - } - return current; - }); - "step 1"; - var type = result.control; - if (type != "cancel2") { - event.type = type; - var cards = player.getCards("he", function (card) { - return get.type2(card, player) == type; - }); - if (cards.length) { - player.logSkill("dczhanyi"); - player.discard(cards); - } else event.finish(); - } else event.finish(); - "step 2"; - var list = ["basic", "trick", "equip"]; - for (var i of list) { - if (i != event.type) player.addTempSkill("dczhanyi_" + i, { player: "phaseBegin" }); - } - }, - subSkill: { - basic: { - charlotte: true, - marktext: "基", - mark: true, - intro: { - content: "使用基本牌无距离限制,且伤害值和回复值基数+1", - }, - trigger: { source: ["damageBegin1", "recoverBegin"] }, - filter: function (event, player) { - var evt = event.getParent(); - return evt.type == "card" && get.type(evt.card, false) == "basic"; - }, - forced: true, - logTarget: "player", - content: function () { - trigger.num++; - }, - mod: { - targetInRange: function (card) { - if (get.type(card) == "basic") return true; - }, - }, - ai: { - damageBonus: true, - }, - }, - trick: { - charlotte: true, - marktext: "锦", - mark: true, - intro: { - content: "使用锦囊牌时摸一张牌,且锦囊牌不计入本回合的手牌上限", - }, - trigger: { player: "useCard" }, - filter: function (event, player) { - return get.type2(event.card) == "trick"; - }, - forced: true, - content: function () { - player.draw(); - }, - mod: { - ignoredHandcard: function (card, player) { - if (get.type2(card, player) == "trick") return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && get.type2(card, player) == "trick") - return false; - }, - }, - }, - equip: { - charlotte: true, - marktext: "装", - mark: true, - intro: { - content: "有装备牌进入你的装备区时,可弃置一名其他角色的一张牌", - }, - trigger: { player: "equipAfter" }, - filter: function (event, player) { - return game.hasPlayer( - (target) => target != player && target.countDiscardableCards(player, "he") > 0 - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - "战意:是否弃置一名其他角色的一张牌?", - function (card, player, target) { - return ( - target != player && target.countDiscardableCards(player, "he") > 0 - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy2" }, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dczhanyi_equip", target); - player.discardPlayerCard(target, "he", true); - } - }, - }, - }, - }, - //李采薇 - yijiao: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && !current.hasMark("yijiao"); - }); - }, - filterTarget: function (card, player, target) { - return target != player && !target.hasMark("yijiao"); - }, - content: function () { - "step 0"; - player - .chooseControl("10个", "20个", "30个", "40个") - .set("prompt", "要令" + get.translation(target) + "获得多少标记?") - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().target; - /*if(get.attitude(player,target)<0&&game.hasPlayer(function(current){ - return current!=player&¤t!=target&&!current.hasMark('yijiao')&&get.attitude(player,current)<0; - })) return 3;*/ - return 0; - }); - "step 1"; - target.addMark("yijiao", 10 * (1 + result.index)); - }, - ai: { - order: 1.1, - result: { - player: 1, - target: -0.5, - }, - }, - group: "yijiao_effect", - subSkill: { - effect: { - trigger: { global: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return ( - event.player.isIn() && - event.player != player && - event.player.hasMark("yijiao") - ); - }, - logTarget: "player", - content: function () { - var target = trigger.player, - num = target.countMark("yijiao"); - var num2 = 0; - target.getHistory("useCard", function (evt) { - var numz = get.number(evt.card); - if (typeof numz == "number") num2 += numz; - }); - if (num > num2) { - var hs = target.getCards("he", function (card) { - return lib.filter.cardDiscardable(card, target, "yijiao_effect"); - }); - if (hs.length) target.discard(hs.randomGets(get.rand(1, 3))); - } else if (num == num2) { - target.insertPhase(); - player.draw(2); - } else { - player.draw(3); - } - target.removeMark("yijiao", num); - }, - }, - }, - intro: { - onunmark: true, - name2: "异", - content: "mark", - }, - }, - qibie: { - audio: 2, - trigger: { global: "die" }, - filter: function (event, player) { - return ( - player.countCards("h") > 0 && - !player.hasCard(function (card) { - return !lib.filter.cardDiscardable(card, player, "qibie"); - }, "h") - ); - }, - check: function (event, player) { - return player.isDamaged() && player.countCards("h", "tao") < Math.max(2, player.hp); - }, - content: function () { - var hs = player.getCards("h"); - player.discard(hs); - player.recover(); - player.draw(hs.length + 2); - }, - }, - //严夫人 - channi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterTarget: lib.filter.notMe, - filterCard: true, - selectCard: [1, Infinity], - check: function (card) { - let player = _status.event.player, - num = player.hasSkill("nifu") ? 15 : 8; - if ( - ui.selected.cards.length <= - Math.max(1, player.needsToDiscard(), player.countCards("h") - 4) - ) - return num - get.value(card); - return num / 2 - get.value(card); - }, - position: "h", - discard: false, - lose: false, - delay: false, - content: function () { - "step 0"; - player.give(cards, target); - "step 1"; - if (target.countCards("h") > 0) { - game.broadcastAll(function (num) { - lib.skill.channi_backup.selectCard = [1, num]; - }, cards.length); - var next = target.chooseToUse(); - next.set( - "openskilldialog", - "将至多" + get.cnNumber(cards.length) + "张手牌当做【决斗】使用" - ); - next.set("norestore", true); - next.set("addCount", false); - next.set("_backupevent", "channi_backup"); - next.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - next.backup("channi_backup"); - } else event.finish(); - "step 2"; - if (result.bool) { - var evts = target.getHistory("useCard", function (evt) { - return evt.card.name == "juedou" && evt.getParent(2) == event; - }); - if (!evts.length) { - event.finish(); - return; - } - var num = evts[0].cards.length; - if ( - target.hasHistory("sourceDamage", function (evt) { - return evt.card && evt.card.name == "juedou" && evt.getParent(4) == event; - }) - ) - target.draw(num); - } else event.finish(); - "step 3"; - if ( - player.countCards("h") > 0 && - target.hasHistory("damage", function (evt) { - return evt.card && evt.card.name == "juedou" && evt.getParent(4) == event; - }) - ) - player.chooseToDiscard("h", true, player.countCards("h")); - }, - subSkill: { - backup: { - filterCard: function (card) { - return get.itemtype(card) == "card"; - }, - viewAs: { name: "juedou" }, - position: "h", - filterTarget: lib.filter.targetEnabled, - ai1: (card) => { - if (get.name(card) === "sha") return 0; - return 5.5 - get.value(card); - }, - log: false, - precontent: function () { - delete event.result.skill; - }, - }, - }, - ai: { - order: 0.3, - result: { - target: function (player, target) { - if ( - target == game.me || - target.isOnline() || - target.hasValueTarget({ name: "juedou" }) - ) - return 2; - if (player.needsToDiscard()) return 0.5; - return 0; - }, - }, - }, - }, - nifu: { - audio: 2, - trigger: { global: "phaseEnd" }, - forced: true, - filter: function (event, player) { - return player.countCards("h") != 3; - }, - content: function () { - var num = player.countCards("h") - 3; - if (num > 0) player.chooseToDiscard("h", num, true); - else player.draw(-num); - }, - }, - //郝萌 - xiongmang: { - audio: 2, - enable: "chooseToUse", - viewAs: { name: "sha" }, - viewAsFilter: function (player) { - return player.countCards("hs") > 0; - }, - selectCard: function () { - return [1, 4]; - }, - selectTarget: function () { - var card = get.card(), - player = get.player(); - if (card == undefined) return; - var range = [1, Math.max(1, ui.selected.cards.length)]; - game.checkMod(card, player, range, "selectTarget", player); - return range; - }, - complexCard: true, - filterCard: function (card) { - if (!ui.selected.cards.length) return true; - var suit = get.suit(card); - for (var i of ui.selected.cards) { - if (get.suit(i) == suit) return false; - } - return true; - }, - filterOk: function () { - if (!ui.selected.targets.length) return false; - var card = get.card(), - player = get.player(); - if (card == undefined) return; - var range = [1, Math.max(1, ui.selected.cards.length)]; - game.checkMod(card, player, range, "selectTarget", player); - if ( - (range[0] <= ui.selected.targets.length && range[1] >= ui.selected.targets.length) || - range[0] == -1 - ) - return true; - return false; - }, - check: function (card) { - var player = _status.event.player, - card = get.autoViewAs({ name: "sha" }, ui.selected.cards.concat(card)); - if ( - game.countPlayer(function (current) { - return ( - (_status.event.filterTarget || lib.filter.filterTarget)( - card, - player, - current - ) && get.effect_use(current, card, player, player) > 0 - ); - }) <= ui.selected.cards.length - ) - return 0; - return 5 - get.value(card); - }, - position: "hs", - onuse: function (links, player) { - player.addTempSkill("xiongmang_effect"); - }, - ai: { - order: () => get.order({ name: "sha" }) + 0.2, - respondSha: true, - skillTagFilter: function (player, tag, arg) { - return player.countCards("hs") > 0; - }, - }, - subSkill: { - effect: { - trigger: { player: "useCardAfter" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return ( - player.maxHp > 1 && - event.skill == "xiongmang" && - !player.hasHistory("sourceDamage", function (evt) { - return evt.card == event.card; - }) - ); - }, - content: function () { - player.loseMaxHp(); - }, - }, - }, - }, - //庞德公 - heqia: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer( - (current) => current.countCards(current == player ? "he" : "h") > 0 - ); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: get.prompt("heqia"), - prompt2: - "操作提示:选择要给出的牌和目标角色,或直接选择一名目标角色,令其将牌交给自己", - filterCard: true, - position: "he", - selectCard: function () { - if (ui.selected.targets.length && !ui.selected.targets[0].countCards("h")) - return [1, Infinity]; - return [0, Infinity]; - }, - filterTarget: function (card, player, target) { - if (player == target) return false; - if (!ui.selected.cards.length) return target.countCards("h") > 0; - return true; - }, - ai1: function (card) { - if (!_status.event.nogive || ui.selected.cards.length) return 0 - get.value(card); - return 1 / Math.max(1, get.value(card)); - }, - ai2: function (target) { - return (get.attitude(player, target) - 0.1) * (ui.selected.cards.length ? 1 : -1); - }, - nogive: !game.hasPlayer(function (current) { - return ( - current != player && - get.attitude(player, current) <= 0 && - current.countCards("h") > 0 - ); - }), - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("heqia", target); - if (result.cards.length) { - player.give(result.cards, target); - event.source = target; - event.num = result.cards.length; - event.goto(4); - } - } else event.finish(); - "step 2"; - var he = target.getCards("he"); - if (he.length > 0) { - if (he.length > 1) - target - .chooseCard( - "he", - true, - [1, Infinity], - "选择交给" + get.translation(player) + "任意张牌" - ) - .set("ai", (card) => -get.value(card)); - else event._result = { bool: true, cards: he }; - } else event.finish(); - "step 3"; - if (result.bool) { - event.source = player; - target.give(result.cards, player); - event.num = result.cards.length; - } else event.finish(); - "step 4"; - if (source && source.isIn() && source.countCards("h") > 0) { - var list = []; - for (var name of lib.inpile) { - if (get.type(name) != "basic") continue; - if (source.hasUseTarget({ name: name }, false)) list.push(["基本", "", name]); - if (name == "sha") { - for (var nature of lib.inpile_nature) { - if (source.hasUseTarget({ name: name, nature: nature }, false)) - list.push(["基本", "", name, nature]); - } - } - } - if (list.length) { - source - .chooseButton(["是否将一张手牌当做一种基本牌使用?", [list, "vcard"]]) - .set("ai", (button) => - _status.event.player.getUseValue( - { name: button.link[2], nature: button.link[3] }, - false - ) - ); - } else event.finish(); - } else event.finish(); - "step 5"; - if (result.bool) { - var card = { name: result.links[0][2], nature: result.links[0][3] }; - game.broadcastAll(function (card) { - lib.skill.heqia_backup.viewAs = card; - }, card); - var next = source.chooseToUse(); - next.set("openskilldialog", "将一张手牌当做" + get.translation(card) + "使用"); - next.set("norestore", true); - next.set("addCount", false); - next.set("_backupevent", "heqia_backup"); - next.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - next.backup("heqia_backup"); - } - }, - group: "heqia_add", - subSkill: { - backup: { - filterCard: function (card) { - return get.itemtype(card) == "card"; - }, - position: "h", - filterTarget: lib.filter.targetEnabled, - selectCard: 1, - check: (card) => 6 - get.value(card), - log: false, - precontent: function () { - delete event.result.skill; - }, - }, - add: { - trigger: { global: "useCard2" }, - charlotte: true, - direct: true, - filter: function (event, player) { - var evt = event.getParent(2); - if ( - evt.name != "heqia" || - evt.player != player || - !event.targets || - evt.num <= event.targets.length - ) - return false; - var card = event.card, - info = get.info(card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, event.player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var num = trigger.getParent(2).num - trigger.targets.length; - var prompt2 = - "是否为" + - get.translation(trigger.card) + - "增加至多" + - get.cnNumber(num) + - "个目标?"; - trigger.player - .chooseTarget(prompt2, [1, num], function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2(_status.event.card, player, target) - ); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - trigger.player.line(result.targets); - game.log(result.targets, "也成为了", trigger.card, "的目标"); - trigger.targets.addArray(result.targets); - } - }, - }, - }, - }, - yinyi: { - audio: 2, - trigger: { player: "damageBegin1" }, - forced: true, - usable: 1, - filter: function (event, player) { - return ( - event.source && - event.source.hp != player.hp && - !event.hasNature("linked") && - event.source.countCards("h") != player.countCards("h") - ); - }, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage")) { - if (player.hp == target.hp || lib.linked.includes(get.nature(card))) return; - var cards = [card]; - if (card.cards && card.cards.length) cards.addArray(card.cards); - if (ui.selected.cards.length) cards.addArray(ui.selected.cards); - if ( - player.countCards("h", function (card) { - return !cards.includes(card); - }) == target.countCards("h") - ) - return; - return "zeroplayertarget"; - } - }, - }, - }, - }, - //韩猛 - jieliang: { - trigger: { global: "phaseDrawBegin2" }, - direct: true, - filter: function (event, player) { - return ( - event.player != player && - !event.numFixed && - event.num > 1 && - player.countCards("he") > 0 - ); - }, - content: function () { - "step 0"; - event.target = trigger.player; - player - .chooseToDiscard(get.prompt2("jieliang", event.target), "he") - .set("goon", get.attitude(player, trigger.player) < -2) - .set("ai", function (card) { - if (!_status.event.goon) return 0; - return 7 - get.value(card); - }).logSkill = ["jieliang", event.target]; - "step 1"; - if (result.bool) { - trigger.num--; - if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.15); - target.addMark("jieliang_less", 1, false); - target.addTempSkill("jieliang_less"); - player.addTempSkill("jieliang_gain"); - } - }, - subSkill: { - less: { - charlotte: true, - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("jieliang_less"); - }, - }, - onremove: true, - intro: { content: "手牌上限-#" }, - }, - gain: { - trigger: { global: "loseAfter" }, - charlotte: true, - direct: true, - filter: function (event, player) { - return ( - event.type == "discard" && - event.player == _status.currentPhase && - event.getParent(3).name == "phaseDiscard" && - event.cards2.filterInD("d").length > 0 - ); - }, - content: function () { - "step 0"; - player - .chooseButton(["截粮:是否获得一张牌?", trigger.cards2.filterInD("d")]) - .set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - "step 1"; - if (result.bool) { - player.logSkill("jieliang", trigger.player); - player.gain(result.links, "gain2"); - } - }, - }, - }, - }, - quanjiu: { - audio: 2, - mod: { - aiOrder: function (player, card, num) { - if ((card.name == "jiu" || card.name == "xujiu") && get.name(card) == "sha") - return num + 0.5; - }, - cardname: function (card, player, name) { - if (card.name == "jiu" || card.name == "xujiu") return "sha"; - }, - }, - trigger: { player: "useCard1" }, - forced: true, - filter: function (event, player) { - return ( - event.addCount !== false && - event.card.isCard && - event.card.name == "sha" && - event.cards.length == 1 && - (event.cards[0].name == "jiu" || event.cards[0].name == "xujiu") - ); - }, - content: function () { - trigger.addCount = false; - player.getStat().card.sha--; - }, - }, - //辛评 - fuyuan: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - filter: function (event, player) { - var target = _status.currentPhase; - return target && target != player && target.isIn(); - }, - logTarget: function (event, player) { - var target = _status.currentPhase; - return target.countCards("h") < player.countCards("h") ? target : player; - }, - check: function (event, player) { - var target = lib.skill.fuyuan.logTarget(event, player); - return get.attitude(player, target) > 0; - }, - prompt: "是否发动【辅袁】?", - prompt2: function (event, player) { - var target = lib.skill.fuyuan.logTarget(event, player); - return "令" + get.translation(target) + (target == player ? "(你)" : "") + "摸一张牌"; - }, - content: function () { - lib.skill.fuyuan.logTarget(trigger, player).draw(); - }, - }, - zhongjie: { - trigger: { player: "die" }, - direct: true, - forceDie: true, - skillAnimation: true, - animationColor: "gray", - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("zhongjie"), lib.filter.notMe) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - //player.awakenSkill('zhongjie'); - var target = result.targets[0]; - player.logSkill("zhongjie", target); - target.gainMaxHp(); - target.recover(); - target.draw(); - } - }, - }, - //张宁 - tianze: { - audio: 2, - trigger: { global: "useCardAfter" }, - direct: true, - filter: function (event, player) { - return ( - player != event.player && - event.player.isIn() && - get.color(event.card) == "black" && - event.player.hasHistory("lose", function (evt) { - return evt && evt.hs.length && evt.getParent() == event; - }) && - event.player.isPhaseUsing() && - !player.hasSkill("tianze_block") - ); - }, - content: function () { - "step 0"; - player.addTempSkill("tianze_block"); - if ( - !player.hasCard(function (card) { - if (_status.connectMode && get.position(card) == "h") return true; - return get.color(card, player) == "black"; - }, "he") - ) - event.finish(); - else - player - .chooseToDiscard( - "he", - function (card, player) { - return get.color(card, player) == "black"; - }, - get.prompt("tianze", trigger.player), - "弃置一张黑色牌并对其造成1点伤害" - ) - .set("ai", function (card) { - if (!_status.event.goon) return 0; - return 8 - get.value(card); - }) - .set("goon", get.damageEffect(trigger.player, player, player) > 0).logSkill = [ - "tianze", - trigger.player, - ]; - "step 1"; - if (result.bool) { - if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); - trigger.player.damage(); - } else event.finish(); - "step 2"; - game.delayx(); - }, - group: "tianze_draw", - subSkill: { - block: { charlotte: true }, - draw: { - trigger: { global: "judgeEnd" }, - forced: true, - locked: false, - filter: function (event, player) { - return event.player != player && event.result && event.result.color == "black"; - }, - content: function () { - player.draw(); - }, - }, - }, - }, - difa: { - trigger: { player: "gainAfter" }, - filter: function (event, player) { - if (player != _status.currentPhase || event.getParent().name != "draw") return false; - var hs = player.getCards("h"); - if (!hs.length) return false; - for (var i of event.cards) { - if ( - hs.includes(i) && - get.color(i, player) == "red" && - lib.filter.cardDiscardable(i, player, "difa") - ) - return true; - } - return false; - }, - usable: 1, - check: function (event, player) { - var hs = player.getCards("h"), - cards = event.cards.filter(function (i) { - return ( - hs.includes(i) && - get.color(i, player) == "red" && - lib.filter.cardDiscardable(i, player, "difa") - ); - }); - var value = get.value(hs, player); - return Array.from(ui.cardPile.childNodes).some(function (card) { - return get.type2(card, false) == "trick" && get.value(card, player) > value; - }); - }, - content: function () { - "step 0"; - var hs = player.getCards("h"), - cards = trigger.cards.filter(function (i) { - return ( - hs.includes(i) && - get.color(i, player) == "red" && - lib.filter.cardDiscardable(i, player, "difa") - ); - }); - if (!cards.length) event.finish(); - else { - event.cards = cards; - player.discard(cards); - } - "step 1"; - var list = lib.inpile.filter(function (i) { - return get.type2(i, false) == "trick"; - }); - if (!list.length) event.finish(); - else - player - .chooseButton( - ["选择获得一种锦囊牌", [list.map((i) => ["锦囊", "", i]), "vcard"]], - true - ) - .set("ai", function (button) { - var card = { name: button.link[2] }; - if (!_status.event.list.includes(card.name)) return 0; - return _status.event.player.getUseValue(card); - }) - .set( - "list", - Array.from(ui.cardPile.childNodes) - .filter(function (card) { - return get.type2(card, false) == "trick"; - }) - .map(function (card) { - return card.name; - }) - .reduce(function (list, name) { - if (!list.includes(name)) list.add(name); - return list; - }, []) - ); - "step 2"; - var card = get.cardPile(function (i) { - return i.name == result.links[0][2] && !event.cards.includes(i); - }); - if (card) player.gain(card, "gain2"); - }, - }, - //童渊 - chaofeng: { - audio: 2, - trigger: { source: "damageBegin1" }, - direct: true, - filter: function (event, player) { - return ( - player.countCards("h") > 0 && player.isPhaseUsing() && !player.hasSkill("chaofeng2") - ); - }, - content: function () { - "step 0"; - var str = "弃置一张手牌并摸一张牌", - color, - type; - if (trigger.card) { - type = get.type2(trigger.card, false); - color = get.color(trigger.card, false); - if (color != "none") str += ";若弃置" + get.translation(color) + "牌则改为摸两张牌"; - if (type) str += ";若弃置类型为" + get.translation(type) + "的牌则伤害+1"; - } - var next = player.chooseToDiscard("h", get.prompt("chaofeng", trigger.player), str); - next.set("ai", function (card) { - var player = _status.event.player, - att = _status.event.att; - var val = 4.2 - get.value(card); - if (get.color(card) == _status.event.color) val += 3; - if (get.type2(card) == _status.event.type) { - if (att < 0) val += 4; - else if (att === 0) val += 2; - else val = 0; - } - return val; - }); - next.set("att", get.attitude(player, trigger.player)); - next.logSkill = ["chaofeng", trigger.player]; - if (color != "none") { - event.color = color; - next.set("color", color); - } - if (type) { - event.type = type; - next.set("type", type); - } - "step 1"; - if (result.bool) { - player.addTempSkill("chaofeng2", "phaseUseEnd"); - var card = result.cards[0]; - player.draw( - event.color && - get.color(card, card.original == "h" ? player : false) == event.color - ? 2 - : 1 - ); - if ( - event.type && - get.type2(card, card.original == "h" ? player : false) == event.type - ) - trigger.num++; - } - }, - }, - chaofeng2: {}, - chuanshu: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "die"] }, - direct: true, - limited: true, - forceDie: true, - filter: function (event, player) { - return player.isDamaged() && (event.name == "die" || player.isIn()); - }, - skillAnimation: true, - animationColor: "gray", - content: function () { - "step 0"; - player - .chooseTarget(lib.filter.notMe, get.prompt("chuanshu"), "令一名其他角色获得〖朝凤〗") - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .set("forceDie", true); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.awakenSkill("chuanshu"); - player.logSkill("chuanshu", target); - target.addSkills("chaofeng"); - if (player.isDead()) event.finish(); - } else event.finish(); - "step 2"; - player.addSkills(lib.skill.chuanshu.derivation); - }, - derivation: ["ollongdan", "drlt_congjian", "chuanyun"], - }, - longdan_tongyuan: { audio: true }, - ocongjian_tongyuan: { audio: true }, - chuanyun: { - audio: true, - trigger: { player: "useCardToPlayered" }, - shaRelated: true, - filter: function (event, player) { - return event.card.name == "sha" && event.target.countCards("e") > 0; - }, - logTarget: "target", - content: function () { - var target = trigger.target; - card = target.getCards("e").randomGet(); - if (card) target.discard(card); - }, - }, - //南华老仙 - jinghe: { - enable: "phaseUse", - filter: function (event, player) { - return !player.hasSkill("jinghe_clear"); - }, - selectCard: function () { - if (ui.selected.targets.length) return [ui.selected.targets.length, 4]; - return [1, 4]; - }, - selectTarget: function () { - return ui.selected.cards.length; - }, - filterTarget: true, - filterCard: function (card) { - if (ui.selected.cards.length) { - var name = get.name(card); - for (var i of ui.selected.cards) { - if (get.name(i) == name) return false; - } - } - return true; - }, - check: function (card) { - var player = _status.event.player; - if ( - game.countPlayer(function (current) { - return get.attitude(player, current) > 0; - }) > ui.selected.cards.length - ) - return 1; - return 0; - }, - position: "h", - complexCard: true, - discard: false, - lose: false, - delay: false, - multitarget: true, - multiline: true, - content: function () { - "step 0"; - player.showCards(cards, get.translation(player) + "发动了【经合】"); - event.skills = lib.skill.jinghe.derivation.randomGets(4); - player.addTempSkill("jinghe_clear", { player: "phaseBegin" }); - event.targets.sortBySeat(); - event.num = 0; - "step 1"; - event.target = targets[num]; - event.num++; - event.target - .chooseControl(event.skills, "cancel2") - .set( - "choiceList", - event.skills.map(function (i) { - return ( - '
    【' + - get.translation( - lib.translate[i + "_ab"] || get.translation(i).slice(0, 2) - ) + - "】
    " + - get.skillInfoTranslation(i, player) + - "
    " - ); - }) - ) - .set("displayIndex", false) - .set("prompt", "选择获得一个技能"); - "step 2"; - var skill = result.control; - if (skill != "cancel2") { - event.skills.remove(skill); - target.addAdditionalSkills("jinghe_" + player.playerid, skill); - target.popup(skill); - } - if (event.num < event.targets.length) event.goto(1); - if (target != game.me && !target.isOnline2()) game.delayx(); - }, - ai: { - threaten: 3, - order: 10, - result: { - target: 1, - }, - }, - derivation: [ - "releiji", - "rebiyue", - "new_retuxi", - "remingce", - "xinzhiyan", - "nhyinbing", - "nhhuoqi", - "nhguizhu", - "nhxianshou", - "nhlundao", - "nhguanyue", - "nhyanzheng", - ], - subSkill: { - clear: { - onremove: function (player) { - game.countPlayer(function (current) { - current.removeAdditionalSkills("jinghe_" + player.playerid); - }); - }, - }, - }, - }, - gongxiu: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.hasSkill("jinghe_clear"); - }, - content: function () { - "step 0"; - event.list1 = []; - event.list2 = []; - event.addIndex = 0; - var choices = []; - game.countPlayer(function (current) { - if (current.additionalSkills["jinghe_" + player.playerid]) event.list1.push(current); - else event.list2.push(current); - }); - event.list1.sortBySeat(); - if (event.list1.length) - choices.push( - "令" + - get.translation(event.list1) + - (event.list1.length > 1 ? "各" : "") + - "摸一张牌" - ); - else event.addIndex++; - event.list2.sortBySeat(); - if (event.list2.length) - choices.push( - "令" + - get.translation(event.list2) + - (event.list2.length > 1 ? "各" : "") + - "弃置一张手牌" - ); - player - .chooseControl("cancel2") - .set("choiceList", choices) - .set("prompt", get.prompt("gongxiu")) - .set("", function () { - var evt = _status.event.getParent(); - if ( - evt.list2.filter(function (current) { - return get.attitude(player, current) <= 0 && !current.hasSkillTag("noh"); - }).length - - evt.list1.length > - 1 - ) - return 1 - evt.addIndex; - return 0; - }); - "step 1"; - if (result.control != "cancel2") { - if (result.index + event.addIndex == 0) { - player.logSkill("gongxiu", event.list1); - game.asyncDraw(event.list1); - } else { - player.logSkill("gongxiu", event.list2); - for (var i of event.list2) i.chooseToDiscard("h", true); - event.finish(); - } - } else event.finish(); - "step 2"; - game.delayx(); - }, - ai: { - combo: "jinghe", - }, - }, - nhyinbing: { - trigger: { source: "damageBefore" }, - forced: true, - filter: function (event, player) { - return event.card && event.card.name == "sha"; - }, - content: function () { - trigger.cancel(); - trigger.player.loseHp(trigger.num); - }, - group: "nhyinbing_draw", - subSkill: { - draw: { - trigger: { global: "loseHpAfter" }, - forced: true, - filter: function (event, player) { - return player != event.player; - }, - content: function () { - player.draw(); - }, - }, - }, - ai: { - jueqing: true, - }, - }, - nhhuoqi: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - position: "he", - filterCard: true, - filterTarget: function (card, player, target) { - return target.isMinHp(); - }, - check: function (card) { - return 7 - get.value(card); - }, - content: function () { - target.recover(); - target.draw(); - }, - ai: { - order: 1, - tag: { - draw: 1, - recover: 1, - }, - result: { - target: function (player, target) { - if (target.isDamaged()) return 3; - if (ui.selected.cards.length) return 0; - return 1; - }, - }, - }, - }, - nhguizhu: { - trigger: { global: "dying" }, - usable: 1, - logTarget: "player", - frequent: true, - content: function () { - player.draw(2); - }, - }, - nhxianshou: { - enable: "phaseUse", - usable: 1, - filterTarget: true, - content: function () { - target.draw(target.isHealthy() ? 2 : 1); - }, - ai: { - order: 1, - tag: { - draw: 1, - }, - result: { - target: function (player, target) { - return target.isHealthy() ? 2 : 0.5; - }, - }, - }, - }, - nhlundao: { - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return ( - event.source && - player != event.source && - player.countCards("h") != event.source.countCards("h") - ); - }, - logTarget: "source", - check: function (event, player) { - return ( - player.countCards("h") < event.source.countCards("h") || - get.effect(event.source, { name: "guohe_copy2" }, player, player) > 0 - ); - }, - content: function () { - if (player.countCards("h") > trigger.source.countCards("h")) player.draw(); - else player.discardPlayerCard(trigger.source, "he", true); - }, - }, - nhguanyue: { - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - content: function () { - "step 0"; - var cards = get.cards(2); - player - .chooseButton(["观月:选择获得一张牌", cards.slice(0)], true) - .set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - while (cards.length) { - ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); - } - "step 1"; - if (result.bool) { - player.gain(result.links, "gain2"); - } - }, - }, - nhyanzheng: { - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player - .chooseCard("h", get.prompt("nhyanzheng")) - .set( - "goon", - (function () { - var num = player.countCards("h") - 1; - return ( - game.countPlayer(function (current) { - return get.damageEffect(current, player, player) > 0; - }) >= Math.min(3, num) - ); - })() - ) - .set("ai", function (card) { - if (_status.event.goon) return Math.max(1, get.value(card)); - return 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("nhyanzheng"); - var cards = player.getCards("h", function (card) { - return ( - card != result.cards[0] && - lib.filter.cardDiscardable(card, player, "nhyanzheng") - ); - }); - if (cards.length) { - player.discard(cards); - event.num = cards.length; - } else event.finish(); - } else event.finish(); - "step 2"; - num = Math.min(num, game.countPlayer()); - player - .chooseTarget( - [1, num], - true, - "对" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "名角色造成1点伤害" - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 3"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.line(targets, "green"); - for (var i of targets) i.damage(); - } - }, - }, - //樊稠 - xinxingluan: { - audio: "xinfu_xingluan", - usable: 1, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return player.isPhaseUsing(); - }, - async cost(event, trigger, player) { - const choiceList = [ - "观看牌堆中两张点数为6的牌并获得其中一张", - "令一名其他角色弃置一张点数为6的牌或交给你一张牌", - "获得场上一张点数为6的牌", - ], - choices = ["选项一"]; - if (game.hasPlayer((current) => current != player && current.countCards("he") > 0)) { - choices.push("选项二"); - } else { - choiceList[1] = `${choiceList[1]}`; - } - if ( - game.hasPlayer((current) => { - return current.hasCard(function (card) { - return get.number(card) == 6 && lib.filter.canBeGained(card, current, player); - }, "ej"); - }) - ) { - choices.push("选项三"); - } else { - choiceList[2] = `${choiceList[2]}`; - } - const result = await player - .chooseControl(choices, "cancel2") - .set("choiceList", choiceList) - .set("prompt", get.prompt("xinxingluan")) - .set("ai", function () { - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - if (current == player) return false; - var att = -get.sgn(get.attitude(player, current) - 0.1); - return current.hasCard(function (card) { - return ( - get.number(card) == 6 && - lib.filter.canBeGained(card, current, player) && - get.sgn(get.useful(card, current)) == att - ); - }, "ej"); - }) - ) - return "选项三"; - if ( - game.hasPlayer(function (target) { - if (target == player) return false; - var att = get.attitude(player, target); - return ( - att < 0 && - target.countCards("he") > 0 && - !target.hasCard(function (card) { - return get.value(card, target) <= 0; - }, "he") - ); - }) - ) - return "选项二"; - return "选项一"; - }) - .forResult(); - if (result.control !== "cancel2") { - const results = { bool: true, cost_data: { index: choices.indexOf(result.control) } }; - if (results.cost_data.index === 1) { - const { targets } = await player - .chooseTarget( - "令一名其他角色弃置一张点数为6的牌,否则交给你一张牌", - true, - function (card, player, current) { - return current != player && current.countCards("he") > 0; - } - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att >= 0) return 0; - if ( - !target.hasCard(function (card) { - return get.value(card, target) <= 0; - }, "he") - ) - return -att / Math.sqrt(target.countCards("he")); - return 0; - }) - .forResult(); - results.targets = targets; - } else if (results.cost_data.index === 2) { - const { targets } = await player - .chooseTarget( - "获得一名角色装备区或判定区内点数为6的牌", - true, - function (card, player, current) { - return current.hasCard(function (card) { - return ( - get.number(card) == 6 && - lib.filter.canBeGained(card, current, player) - ); - }, "ej"); - } - ) - .set("ai", function (target) { - var player = _status.event.player, - att = -get.sgn(get.attitude(player, target) - 0.1), - max = 0, - ej = target.getCards("ej", function (card) { - return ( - get.number(card) == 6 && - lib.filter.canBeGained(card, target, player) - ); - }); - for (var i of ej) { - var num = get.useful(i, target) * att; - if (num > max) max = num; - return max; - } - }) - .forResult(); - results.targets = targets; - } - event.result = results; - } - }, - content: function () { - "step 0"; - var result = event.cost_data; - if (result.index === 1) event.goto(4); - else if (result.index === 2) event.goto(3); - "step 1"; - var cards = []; - while (cards.length < 2) { - var card = get.cardPile2(function (card) { - return !cards.includes(card) && get.number(card) == 6; - }); - if (!card) break; - cards.push(card); - } - if (!cards.length) { - player.draw(6); - event.finish(); - } else if (cards.length == 1) { - event._result = { bool: true, links: cards }; - } else - player - .chooseButton(["兴乱:选择获得其中一张", cards], true) - .set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - "step 2"; - if (result.bool) { - player.gain(result.links, "gain2"); - } - event.finish(); - "step 3"; - var target = targets[0]; - player.gainPlayerCard(target, "ej", true).set("filterButton", function (button) { - return get.number(button.link) == 6; - }); - event.finish(); - "step 4"; - var target = targets[0]; - event.target = target; - target.chooseToDiscard( - "he", - "弃置一张点数为6的牌,否则交给" + get.translation(player) + "一张牌", - function (card) { - return get.number(card) == 6; - } - ).ai = (card) => 8 - get.value(card); - "step 5"; - if (!result.bool) { - target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); - } else event.finish(); - "step 6"; - if (result.bool) target.give(result.cards, player, "giveAuto"); - }, - }, - rexingluan: { - audio: "xinfu_xingluan", - usable: 1, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return ( - event.targets && - event.targets.length == 1 && - typeof get.number(event.card, false) == "number" && - player.isPhaseUsing() - ); - }, - direct: true, - content: function () { - "step 0"; - var str = "", - num = get.number(trigger.card, false), - nums = get.strNumber(num); - var list = game.filterPlayer(function (current) { - return current.hasCard(function (card) { - return get.number(card) == num && lib.filter.canBeGained(card, current, player); - }, "ej"); - }); - if (list.length) { - str += - "获得一名角色装备区或判定区内的一张点数为" + - nums + - "的牌,或直接从牌堆中获得一张点数为" + - nums + - "的牌"; - player - .chooseTarget( - get.prompt("rexingluan"), - str, - [0, 1], - function (card, player, target) { - return _status.event.targets.includes(target); - } - ) - .set("targets", list) - .set("ai", function (target) { - if (!target) return 1; - var player = _status.event.player, - num = get.number(_status.event.getTrigger().card, false), - att = -get.sgn(get.attitude(player, target)); - if ( - target.hasCard(function (card) { - return ( - get.number(card) == num && - get.effect(target, card, target, player) < 0 - ); - }, "j") - ) - return 1.2 * Math.abs(get.attitude(player, target)); - if ( - target.hasCard(function (card) { - return ( - get.number(card) == num && - get.sgn(get.value(card, target) + 0.1) == att - ); - }, "e") - ) - return Math.abs(get.attitude(player, target)); - return 0; - }); - } else { - player.chooseBool( - get.prompt("rexingluan"), - "从牌堆中获得一张点数为" + nums + "的牌" - ).ai = () => true; - } - "step 1"; - if (result.bool) { - if (result.targets && result.targets.length) { - var target = result.targets[0]; - player.logSkill("rexingluan", target); - player - .gainPlayerCard(target, "ej", true) - .set("num", get.number(trigger.card, false)) - .set("filterButton", function (button) { - return get.number(button.link) == _status.event.num; - }); - } else { - player.logSkill("rexingluan"); - var num = get.number(trigger.card, false), - card = get.cardPile2(function (i) { - return get.number(i, false) == num; - }); - if (card) player.gain(card, "gain2"); - } - } - }, - }, - //杜夫人 - yise: { - audio: 2, - trigger: { - global: "gainAfter", - player: "loseAsyncAfter", - }, - filter: function (event, player) { - if (event.name == "loseAsync") { - if (event.type != "gain") return false; - } - var cards = event.getl(player).cards2; - return game.hasPlayer(function (current) { - if (current == player) return false; - var cardsx = event.getg(current); - for (var i of cardsx) { - if (cards.includes(i)) { - if (current.isDamaged()) return true; - return get.color(i, player) == "black"; - } - } - return false; - }); - }, - direct: true, - content: function () { - "step 0"; - var cards = trigger.getl(player).cards2; - event.cards = cards; - event.targets = game - .filterPlayer(function (current) { - if (current == player) return false; - var cardsx = trigger.getg(current); - for (var i of cardsx) { - if (cards.includes(i)) return true; - } - return false; - }) - .sortBySeat(); - if (!event.targets.length) event.finish(); - "step 1"; - var target = targets.shift(); - var cardsx = trigger.getg(target); - var goon = false; - for (var i of cardsx) { - if (cards.includes(i)) { - if (target.isDamaged() || get.color(i, player) == "black") { - goon = true; - break; - } - } - } - if (goon) { - var next = game.createEvent("yise_insert"); - next.player = player; - next.target = target; - next.cards = cardsx; - next.setContent(lib.skill.yise.contentx); - } - if (targets.length > 0) event.redo(); - }, - contentx: function () { - "step 0"; - for (var i of cards) { - event[get.color(i, player)] = true; - if (event.red && event.black) break; - } - if (event.red && target.isDamaged()) { - player - .chooseBool( - get.prompt("yise", target), - "令" + get.translation(target) + "回复1点体力" - ) - .set( - "ai", - () => - get.recoverEffect( - _status.event.getParent().target, - _status.event.player, - _status.event.player - ) > 0 - ); - } - "step 1"; - if (event.black || (event.red && result.bool)) player.logSkill("yise", target); - if (event.red && result.bool) target.recover(); - if (event.black) { - target.addMark("yise_damage", 1, false); - target.addSkill("yise_damage"); - } - }, - subSkill: { - damage: { - trigger: { player: "damageBegin1" }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - return event.card && event.card.name == "sha" && event.getParent().name == "sha"; - }, - content: function () { - trigger.num += player.countMark("yise_damage"); - player.removeSkill("yise_damage"); - }, - intro: { - content: "下一次受到杀的伤害+#", - }, - }, - }, - }, - shunshi: { - trigger: { player: ["damageEnd", "phaseZhunbeiBegin"] }, - direct: true, - filter: function (event, player) { - return ( - (event.name != "damage" || player != _status.currentPhase) && - player.countCards("he") > 0 && - game.hasPlayer(function (current) { - return current != player && current != event.source; - }) - ); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: get.prompt("shunshi"), - prompt2: "将一张牌交给一名其他角色,并获得+1效果", - filterCard: true, - filterTarget: function (card, player, target) { - return target != player && target != _status.event.source; - }, - position: "he", - source: trigger.source, - ai1: function (card) { - var player = _status.event.player; - if (player.hasSkill("yise")) { - if ( - get.color(card, player) == "red" && - game.hasPlayer(function (current) { - return ( - current != player && - current != _status.event.source && - current.isDamaged() && - get.recoverEffect(current, player, player) > 0 - ); - }) - ) - return 10 - get.value(card); - if (get.color(card, player) == "black") return 4 - get.value(card); - } - return 8 - get.value(card); - }, - ai2: function (target) { - var player = _status.event.player, - card = ui.selected.cards[0]; - if (player.hasSkill("yise")) { - if (get.color(card) == "red" && target.isDamaged()) - return 2 * get.recoverEffect(target, player, player); - if (get.color(card) == "black") return -get.attitude(player, target); - } - if (get.value(card, target) < 0) return -get.attitude(player, target); - if (get.value(card, target) < 1) return 0.01 * -get.attitude(player, target); - return ( - Math.max(1, get.value(card, target) - get.value(card, player)) * - get.attitude(player, target) - ); - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("shunshi", target); - player.give(result.cards, target); - player.addMark("shunshi_mark", 1, false); - player.addTempSkill("shunshi_mark", { player: "phaseEnd" }); - } - }, - subSkill: { - mark: { - onremove: true, - trigger: { player: "phaseDrawBegin2" }, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.num += player.countMark("shunshi_mark"); - }, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("shunshi_mark"); - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("shunshi_mark"); - }, - }, - intro: { - content: "拥有#层效果", - }, - }, - }, - }, - xianwei: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return player.hasEnabledSlot(); - }, - content: function () { - "step 0"; - player.chooseToDisable().ai = function (event, player, list) { - var getVal = function (num) { - var card = player.getEquip(num); - if (card) { - var val = get.value(card); - if (val > 0) return 0; - return 5 - val; - } - switch (num) { - case "equip3": - return 4.5; - case "equip4": - return 4.4; - case "equip5": - return 4.3; - case "equip2": - return (3 - player.hp) * 1.5; - case "equip1": { - if ( - game.hasPlayer(function (current) { - return ( - (get.realAttitude || get.attitude)(player, current) < 0 && - get.distance(player, current) > 1 - ); - }) - ) - return 0; - return 3.2; - } - } - }; - list.sort(function (a, b) { - return getVal(b) - getVal(a); - }); - return list[0]; - }; - "step 1"; - var cardType = result.control; - event.cardType = cardType; - var num = player.countDisabledSlot(); - if (num < 5) player.draw(5 - num); - player - .chooseTarget( - lib.filter.notMe, - "是否令一名其他角色从牌堆中使用一张" + get.translation(cardType) + "牌?" - ) - .set("ai", function (target) { - var player = _status.event.player, - type = _status.event.cardType; - var card = get.cardPile2(function (card) { - return get.subtype(card) == type && target.canUse(card, target); - }); - if (!card) return 0; - return get.effect(target, card, target, player); - }) - .set("cardType", event.cardType); - "step 2"; - if (!result.bool) return; - var target = result.targets[0]; - player.line(target, "green"); - var card = get.cardPile2(function (card) { - return get.subtype(card) == event.cardType && target.canUse(card, target); - }); - if (card) target.chooseUseTarget(card, "nopopup", true); - else target.draw(); - }, - group: "xianwei_all", - subSkill: { - all: { - trigger: { player: "disableEquipAfter" }, - forced: true, - filter: function (event, player) { - return !player.hasEnabledSlot(); - }, - content: function () { - player.gainMaxHp(2); - player.addSkill("xianwei_effect"); - }, - }, - effect: { - charlotte: true, - mark: true, - intro: { content: "和其他角色视为在彼此的攻击范围内" }, - mod: { - inRange: () => true, - inRangeOf: () => true, - }, - }, - }, - }, - rehuoshui: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - var num = Math.min(game.countPlayer() - 1, Math.max(1, player.getDamagedHp())); - var str; - if (num > 1) { - str = "选择至多" + get.cnNumber(num) + "名其他角色。"; - var list = [ - "第一名角色的非锁定技失效直到回合结束", - ";第二名角色交给你一张手牌", - ";第三名及之后角色弃置装备区内的所有牌", - ]; - for (var i = 0; i < Math.min(3, num); i++) { - str += list[i]; - } - str += "。"; - } else str = "令一名其他角色的非锁定技本回合内失效"; - player - .chooseTarget([1, num], get.prompt("rehuoshui"), str, lib.filter.notMe) - .set("ai", function (target) { - var att = -get.attitude(_status.event.player, target); - if (att <= 0) return 0; - if ( - target.hasSkillTag("maixie") || - target.hasSkill("maixie_hp") || - target.hasSkill("maixie_defed") - ) - att *= 3; - return att / get.threaten(target); - }); - "step 1"; - if (result.bool) { - var targets = result.targets; - player.logSkill("rehuoshui", targets); - event.targets = targets; - targets[0].addTempSkill("fengyin"); - if (targets.length < 2) event.goto(5); - } else event.finish(); - "step 2"; - if (targets[1].countCards("h") == 0) event.goto(targets.length > 2 ? 4 : 5); - else targets[1].chooseCard("h", true, "交给" + get.translation(player) + "一张手牌"); - "step 3"; - if (result.bool) { - targets[1].give(result.cards, player); - } - if (targets.length < 3) { - event.goto(5); - } else { - targets.splice(0, 2); - } - "step 4"; - var target = targets.shift(); - var num = target.countCards("e"); - if (num > 0) target.chooseToDiscard("e", true, num); - if (targets.length > 0) event.redo(); - "step 5"; - game.delayx(); - }, - }, - reqingcheng: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer((current) => - lib.skill.reqingcheng.filterTarget(null, player, current) - ); - }, - filterTarget: function (card, player, target) { - return ( - target != player && - target.hasSex("male") && - target.countCards("h") <= player.countCards("h") - ); - }, - content: function () { - player.swapHandcards(target); - }, - ai: { - order: 1, - result: { - player: function (player, target) { - if (target.countCards("h") > 0) - return -Math.max( - get.value(target.getCards("h"), player) - - get.value(player.getCards("h"), player), - 0 - ); - return 0; - }, - }, - }, - }, - //丘力居 - koulve: { - audio: 2, - trigger: { source: "damageSource" }, - logTarget: "player", - filter: function (event, player) { - return ( - event.player.isDamaged() && event.player.countCards("h") > 0 && player.isPhaseUsing() - ); - }, - check: function (event, player) { - if (player.hp == 1 && player.isHealthy()) return false; - return get.attitude(player, event.player) <= 0; - }, - content: function () { - "step 0"; - player.choosePlayerCard(trigger.player, "h", true, trigger.player.getDamagedHp()); - "step 1"; - var card = result.cards; - event.cards = card; - player.showCards(card, get.translation(player) + "发动了【宼略】"); - "step 2"; - var gains = [], - red = false; - var target = trigger.player; - for (var card of cards) { - var type = get.type2(card, target); - if ((type == "basic" || type == "trick") && get.tag(card, "damage") > 0) - gains.push(card); - if (!red && get.color(card, target) == "red") red = true; - } - if (gains.length) player.gain(gains, "gain2"); - if (!red) event.finish(); - "step 3"; - player[player.isDamaged() ? "loseMaxHp" : "loseHp"](); - player.draw(2); - }, - }, - qljsuiren: { - audio: 2, - trigger: { player: "die" }, - direct: true, - forceDie: true, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return player.countCards("h", function (card) { - var type = get.type(card, player); - return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget( - lib.filter.notMe, - get.prompt("qljsuiren"), - "将所有伤害性基本牌和锦囊牌交给一名其他角色" - ) - .set("forceDie", true) - .set("ai", function (target) { - var player = _status.event.player, - cards = _status.event.aiCards; - var att = get.attitude(player, target); - if (att <= 0) return 0; - if (target.hasSkillTag("nogain")) att /= 100; - var num = 0.1; - for (var i of cards) num += Math.max(0, target.getUseValue(card)); - return num * att; - }) - .set( - "aiCards", - player.getCards("h", function (card) { - var type = get.type(card, player); - return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; - }) - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("qljsuiren", target); - player.give( - player.getCards("h", function (card) { - var type = get.type(card, player); - return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; - }), - target, - "give" - ); - } - }, - }, - //胡车儿 - redaoji: { - audio: 2, - trigger: { global: "useCard" }, - direct: true, - filter: function (event, player) { - if ( - player == event.player || - get.subtype(event.card, false) != "equip1" || - (event.player.isDead() && !event.cards.filterInD().length) - ) - return false; - var all = event.player.getAllHistory("useCard"); - for (var i of all) { - if (get.subtype(i.card, false) == "equip1") return i == event; - } - return false; - }, - content: function () { - "step 0"; - var list = []; - event.addIndex = 0; - if (trigger.cards.filterInD().length > 0) - list.push("获得" + get.translation(trigger.cards.filterInD())); - else event.addIndex++; - if (trigger.player.isIn()) - list.push("令" + get.translation(trigger.player) + "本回合不能使用或打出【杀】"); - player - .chooseControl("cancel2") - .set("choiceList", list) - .set("prompt", get.prompt("redaoji", trigger.player)) - .set("ai", function () { - var evt = _status.event.getParent(), - player = evt.player, - evt2 = evt._trigger; - if (evt.addIndex == 0) { - var noob = get.attitude(player, evt2.player) < 0 ? 1 : "cancel2"; - if (player.countMark("fuzhong") == 3) return noob; - if (get.effect(evt2.targets[0], evt2.card, evt2.player, player) <= 0) - return 0; - return noob; - } - return get.attitude(player, evt2.player) < 0 ? 0 : "cancel2"; - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("redaoji", trigger.player); - game.delayx(); - if (result.index + event.addIndex == 0) { - player.gain(trigger.cards.filterInD(), "gain2"); - } else trigger.player.addTempSkill("redaoji2"); - } - }, - }, - redaoji2: { - charlotte: true, - mark: true, - mod: { - cardEnabled: function (card) { - if (card.name == "sha") return false; - }, - cardRespondable: function (card) { - if (card.name == "sha") return false; - }, - }, - intro: { - content: "本回合不能使用或打出杀", - }, - }, - fuzhong: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - forced: true, - filter: function (event, player) { - return player.countMark("fuzhong") > 3; - }, - content: function () { - "step 0"; - player - .chooseTarget(lib.filter.notMe, "对一名其他角色造成1点伤害", true) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - target.damage("nocard"); - } - player.removeMark("fuzhong", 4); - }, - marktext: "重", - intro: { content: "mark" }, - group: ["fuzhong_gain", "fuzhong_yingzi"], - mod: { - maxHandcard: function (player, num) { - if (player.countMark("fuzhong") > 2) return num + 3; - }, - globalFrom: function (player, target, num) { - if (player.countMark("fuzhong") > 1) return num - 2; - }, - }, - subSkill: { - gain: { - audio: "fuzhong", - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - forced: true, - filter: function (event, player) { - return player != _status.currentPhase && event.getg(player).length > 0; - }, - content: function () { - player.addMark("fuzhong", 1); - }, - }, - yingzi: { - audio: "fuzhong", - trigger: { player: "phaseDrawBegin2" }, - forced: true, - filter: function (event, player) { - return !event.numFixed && player.countMark("fuzhong") > 0; - }, - content: function () { - trigger.num++; - }, - }, - }, - }, - //董承 - xuezhao: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.maxHp > 0 && player.countCards("h") > 0; - }, - filterCard: true, - position: "h", - filterTarget: lib.filter.notMe, - selectTarget: function () { - return [1, _status.event.player.maxHp]; - }, - check: function (card) { - return 2 * (_status.event.player.maxHp + 2) - get.value(card); - }, - content: function () { - "step 0"; - if (!target.countCards("he")) event._result = { bool: false }; - else - target - .chooseCard( - "he", - "交给" + - get.translation(player) + - "一张牌并摸一张牌,或不能响应其使用的牌直到回合结束" - ) - .set("ai", function (card) { - var player = _status.event.player, - target = _status.event.getParent().player, - val = get.value(card); - if (get.attitude(player, target) > 0) { - if (get.name(card, target) == "sha" && target.hasValueTarget(card)) - return 30 - val; - return 20 - val; - } - return -val; - }); - "step 1"; - if (result.bool) { - player.addTempSkill("xuezhao_sha"); - player.addMark("xuezhao_sha", 1, false); - target.give(result.cards, player); - target.draw(); - } else { - player.addTempSkill("xuezhao_hit"); - player.markAuto("xuezhao_hit", [target]); - } - }, - ai: { - threaten: 2.4, - order: 3.6, - result: { - player: function (player, target) { - if (get.attitude(target, player) > 0) { - if ( - target.countCards("e", function (card) { - return get.value(card, target) < 0; - }) - ) - return 3; - return Math.sqrt(target.countCards("he")); - } - if ( - target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) && - player.countCards("hs", function (card) { - return ( - !ui.selected.cards.includes(card) && - get.name(card) == "sha" && - player.canUse(card, target) && - get.effect(target, card, player, player) != 0 - ); - }) - ) - return -Math.sqrt(Math.abs(get.attitude(player, target))) / 2; - return 0.1; - }, - }, - }, - subSkill: { - sha: { - charlotte: true, - onremove: true, - marktext: "血", - intro: { content: "多杀#刀,誓诛曹贼!" }, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("xuezhao_sha"); - }, - }, - }, - hit: { - charlotte: true, - onremove: true, - marktext: "诏", - intro: { content: "$篡汉,其心可诛!" }, - trigger: { player: "useCard1" }, - forced: true, - popup: false, - content: function () { - trigger.directHit.addArray(player.getStorage("xuezhao_hit")); - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return player.getStorage("xuezhao_hit").includes(arg.target); - }, - }, - }, - }, - }, - //唐姬 - kangge: { - audio: 2, - trigger: { player: "phaseBegin" }, - direct: true, - filter: function (event, player) { - return ( - player.phaseNumber == 1 && - !player.storage.kangge && - game.hasPlayer((current) => current != player) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - "请选择【抗歌】的目标", - "其于回合外摸牌后,你摸等量的牌;其进入濒死状态时,你可令其回复体力至1点;其死亡后,你弃置所有牌并失去1点体力", - lib.filter.notMe, - true - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("kangge", target); - player.addSkill("kangge_clear"); - player.storage.kangge = target; - player.markSkill("kangge"); - game.delayx(); - } - }, - intro: { content: "已指定$为目标" }, - group: ["kangge_draw", "kangge_dying", "kangge_die"], - subSkill: { - draw: { - audio: "kangge", - trigger: { - global: ["gainAfter", "loseAsyncAfter"], - }, - forced: true, - filter: function (event, player) { - if (player.countMark("kangge_draw") >= 3) return false; - var target = player.storage.kangge; - return target && target != _status.currentPhase && event.getg(target).length > 0; - }, - logTarget: "player", - content: function () { - var num = Math.min( - 3 - player.countMark("kangge_draw"), - trigger.getg(player.storage.kangge).length - ); - player.addMark("kangge_draw", num, false); - player.draw(num); - }, - }, - clear: { - trigger: { global: "phaseBeginStart" }, - forced: true, - firstDo: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return player.countMark("kangge_draw") > 0; - }, - content: function () { - player.removeMark("kangge_draw", player.countMark("kangge_draw"), false); - }, - }, - dying: { - audio: "kangge", - trigger: { global: "dying" }, - logTarget: "player", - filter: function (event, player) { - return ( - event.player == player.storage.kangge && - event.player.hp < 1 && - !player.hasSkill("kangge_temp") - ); - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - prompt2: "令其将体力值回复至1点", - content: function () { - trigger.player.recover(1 - trigger.player.hp); - player.addTempSkill("kangge_temp", "roundStart"); - }, - }, - temp: {}, - die: { - audio: "kangge", - trigger: { global: "dieAfter" }, - filter: function (event, player) { - return event.player == player.storage.kangge; - }, - forced: true, - content: function () { - var cards = player.getCards("he"); - if (cards.length) player.discard(cards); - player.loseHp(); - }, - }, - }, - ai: { - threaten: 2, - }, - }, - jielie: { - audio: 2, - trigger: { player: "damageBegin4" }, - direct: true, - filter: function (event, player) { - return ( - (!event.source || - (event.source != player && event.source != player.storage.kangge)) && - player.storage.kangge && - player.storage.kangge.isIn() - ); - }, - content: function () { - "step 0"; - player - .chooseControl(lib.suit.slice(0), "cancel2") - .set("prompt", get.prompt("jielie")) - .set( - "prompt2", - "防止伤害并改为失去等量体力,且令" + - get.translation(player.storage.kangge) + - "从弃牌堆中获得等量的花色牌" - ) - .set("ai", function () { - var player = _status.event.player; - if (get.attitude(player, player.storage.kangge) <= 0) return "cancel2"; - return lib.suit.randomGet(); - }); - "step 1"; - if (result.control != "cancel2") { - event.suit = result.control; - player.logSkill("jielie", player.storage.kangge); - trigger.cancel(); - player.loseHp(trigger.num); - } else event.finish(); - "step 2"; - var cards = []; - while (cards.length < trigger.num) { - var card = get.discardPile(function (card) { - return get.suit(card, false) == event.suit && !cards.includes(card); - }); - if (card) cards.push(card); - else break; - } - if (cards.length) player.storage.kangge.gain(cards, "gain2"); - }, - }, - //张横 - dangzai: { - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return ( - !player.isDisabledJudge() && - game.hasPlayer(function (current) { - return ( - current != player && - current.countCards("j", function (card) { - return player.canAddJudge(card); - }) > 0 - ); - }) - ); - }, - content: function () { - "step 0"; - player.chooseTarget( - function (card, player, target) { - return ( - target != player && - target.countCards("j", function (card) { - return player.canAddJudge(card); - }) > 0 - ); - }, - get.prompt("dangzai"), - "将一名其他角色判定区内的一张牌移动到你的判定区内" - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("dangzai", target); - player.choosePlayerCard(target, "j", true).set("filterButton", function (button) { - return _status.event.player.canAddJudge(button.link); - }); - } else event.finish(); - "step 2"; - if (result.bool && result.cards && result.cards.length) { - var card = result.cards[0]; - target.$give(card, player); - game.delayx(); - var name = card.viewAs || card.name; - if (card.name != name) { - player.addJudge(name, card); - } else { - player.addJudge(card); - } - } - }, - }, - liangjue: { - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - filter: function (event, player) { - if (player.hp <= 1) return false; - if (event.player == player) { - if (event.name == "equip" && get.color(event.card, player) == "black") return true; - if (event.name == "addJudge" && get.color(event.cards[0], player) == "black") - return true; - } - var evt = event.getl(player); - if (!evt || !evt.es || !evt.js || (!evt.es.length && !evt.js.length)) return false; - for (var i of evt.es) { - if (get.color(i, player) == "black") return true; - } - for (var i of evt.js) { - if (get.color(i, player) == "black") return true; - } - return false; - }, - content: function () { - player.loseHp(); - player.draw(2); - }, - }, - //狼灭 - langmie: { - trigger: { global: "phaseUseEnd" }, - //forced:true, - filter: function (event, player) { - if (player == event.player || !player.countCards("he")) return false; - var map = {}; - var list = event.player.getHistory("useCard", function (evt) { - var evt2 = evt.getParent("phaseUse"); - return evt2 == event; - }); - for (var i of list) { - var name = get.type2(i.card, false); - if (!map[name]) map[name] = true; - else return true; - } - }, - frequent: true, - content: function () { - player.draw(); - }, - group: "langmie_damage", - }, - langmie_damage: { - audio: "langmie", - trigger: { global: "phaseEnd" }, - direct: true, - filter: function (event, player) { - return ( - event.player != player && - (event.player.getStat("damage") || 0) > 1 && - player.countCards("he") > 0 - ); - }, - content: function () { - "step 0"; - player - .chooseToDiscard( - "he", - get.prompt("langmie", trigger.player), - "弃置一张牌并对其造成1点伤害" - ) - .set("goon", get.damageEffect(trigger.player, player, player) > 0) - .set("ai", function (card) { - if (!_status.event.goon) return 0; - return 7 - get.value(card); - }).logSkill = ["langmie_damage", trigger.player]; - "step 1"; - if (result.bool) trigger.player.damage(); - }, - ai: { expose: 0.2 }, - }, - //牛金 - recuorui: { - audio: "cuorui", - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return ( - player.hp > 0 && - game.hasPlayer(function (current) { - return current != player && current.countGainableCards(player, "h") > 0; - }) - ); - }, - filterTarget: function (card, player, target) { - return target != player && target.countGainableCards(player, "h") > 0; - }, - selectTarget: function () { - return [1, _status.event.player.hp]; - }, - content: function () { - if (num == 0) player.awakenSkill("recuorui"); - player.gainPlayerCard(target, true, "h"); - }, - ai: { - order: 10, - result: { - player: 1, - target: function (player, target) { - if (target.hasSkillTag("noh")) return 0; - return -1; - }, - }, - }, - }, - reliewei: { - audio: "liewei", - trigger: { global: "dying" }, - filter: function (event, player) { - return ( - player == _status.currentPhase || - player.getHistory("useSkill", (evt) => evt.skill == "reliewei").length < - player.getHp() - ); - }, - frequent: true, - content: function () { - player.draw(); - }, - }, - //张邈 - mouni: { - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("h", "sha") > 0; - }, - content: function () { - "step 0"; - player.addSkill("mouni2"); - player.chooseTarget(get.prompt2("mouni"), lib.filter.notMe).set("ai", function (target) { - var player = _status.event.player, - cards = player.getCards("h", "sha"); - if ( - get.attitude(player, target) >= 0 || - !player.canUse(cards[0], target, false) || - (!player.hasJudge("lebu") && - target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) && - !player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: cards[0], - }, - true - )) - ) - return 0; - return get.effect(target, cards[0], player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("mouni", target); - event.cards = player.getCards("h", "sha"); - } else event.finish(); - "step 2"; - if (event.mouni_dying) return; - var hs = player.getCards("h"); - cards = cards.filter(function (card) { - return ( - hs.includes(card) && - get.name(card, player) == "sha" && - player.canUse( - { - name: "sha", - nature: get.nature(card, player), - isCard: true, - cards: [card], - }, - target, - false - ) - ); - }); - if (cards.length) { - var card = cards.randomRemove(1)[0]; - player.useCard(target, false, card); - event.redo(); - } - "step 3"; - if ( - player.getHistory("useCard", function (evt) { - return ( - evt.getParent() == event && - !player.getHistory("sourceDamage", function (evt2) { - return evt.card == evt2.card; - }).length - ); - }).length - ) { - player.skip("phaseUse"); - player.skip("phaseDiscard"); - } - player.removeSkill("mouni2"); - }, - }, - mouni2: { - charlotte: true, - trigger: { global: "dying" }, - forced: true, - firstDo: true, - popup: false, - filter: function (event, player) { - var evt = event.getParent("mouni"); - return evt && evt.player == player && evt.target == event.player; - }, - content: function () { - trigger.getParent("mouni").mouni_dying = true; - }, - }, - zongfan: { - derivation: "zhangu", - trigger: { player: "phaseJieshuBegin" }, - juexingji: true, - forced: true, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return ( - !player.getHistory("skipped").includes("phaseUse") && - player.getHistory("useCard", function (evt) { - return evt.getParent().name == "mouni"; - }).length > 0 - ); - }, - content: function () { - "step 0"; - player.awakenSkill("zongfan"); - var num = player.countCards("he"); - if (num > 0) { - player.chooseCardTarget({ - prompt: "是否将任意张牌交给一名其他角色?", - selectCard: [1, num], - filterCard: true, - filterTarget: lib.filter.notMe, - position: "he", - ai1: function (card) { - if (card.name == "du") return 10; - else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") - return 0; - var player = _status.event.player; - if ( - ui.selected.cards.length > 4 || - !game.hasPlayer(function (current) { - return ( - get.attitude(player, current) > 0 && - !current.hasSkillTag("nogain") - ); - }) - ) - return 0; - return 1 / Math.max(0.1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (ui.selected.cards[0].name == "du") return -att; - if (target.hasSkillTag("nogain")) att /= 6; - return att; - }, - }); - } else event.goto(2); - "step 1"; - if (result.bool) { - var cards = result.cards, - target = result.targets[0], - num = Math.min(5, cards.length); - player.give(cards, target); - player.gainMaxHp(num); - player.recover(num); - } - "step 2"; - //player.removeSkill('mouni'); - player.changeSkills(["zhangu"], ["mouni"]); - }, - }, - zhangu: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return player.maxHp > 1 && (player.countCards("h") == 0 || player.countCards("e") == 0); - }, - content: function () { - var cards = [], - types = []; - for (var i = 0; i < 3; i++) { - var card = get.cardPile2(function (card) { - return !cards.includes(card) && !types.includes(get.type2(card, false)); - }); - if (card) { - cards.push(card); - types.push(get.type2(card, false)); - } else break; - } - if (cards.length) player.gain(cards, "gain2"); - player.loseMaxHp(); - }, - }, - //梁兴 - lulve: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - var hs = player.countCards("h"); - return ( - hs > 1 && - game.hasPlayer(function (target) { - var ts = target.countCards("h"); - return target != player && ts > 0 && hs > ts; - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("lulve"), function (card, player, target) { - var hs = player.countCards("h"), - ts = target.countCards("h"); - return target != player && ts > 0 && hs > ts; - }) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.isTurnedOver()) return att / 10; - if ( - !player.hasShan() && - target.canUse({ name: "sha", isCard: true }, player, false) && - get.effect(player, { name: "sha", isCard: true }, target, player) < 0 && - player.hp < 4 - ) - return 0; - return -att * Math.sqrt(target.countCards("h")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("lulve", target); - var str = get.translation(player); - target - .chooseControl() - .set("choiceList", [ - "将所有手牌交给" + str + ",然后其将武将牌翻面", - "将武将牌翻面,然后视为对" + str + "使用【杀】", - ]) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().player; - if (player.isTurnedOver()) return 1; - if ( - !target.hasShan() && - player.canUse({ name: "sha", isCard: true }, target, false) && - get.effect(target, { name: "sha", isCard: true }, player, player) < 0 - ) - return 0; - return Math.random() < 0.5 ? 0 : 1; - }); - } else event.finish(); - "step 2"; - if (result.index == 0) { - target.give(target.getCards("h"), player); - player.turnOver(); - event.finish(); - } else target.turnOver(); - "step 3"; - if (target.canUse({ name: "sha", isCard: true }, player, false)) - target.useCard({ name: "sha", isCard: true }, player, false); - }, - }, - lxzhuixi: { - audio: 2, - trigger: { - player: "damageBegin3", - source: "damageBegin1", - }, - forced: true, - logTarget: "player", - filter: function (event, player) { - return event.source && event.player.isTurnedOver() != event.source.isTurnedOver(); - }, - content: function () { - trigger.num++; - }, - }, - //陶谦和曹嵩 - reyirang: { - audio: "yirang", - audioname: ["re_taoqian"], - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - if ( - !player.countCards("he", function (card) { - return get.type(card) != "basic"; - }) - ) { - return false; - } - return game.hasPlayer(function (current) { - return current != player; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("reyirang"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - return (get.attitude(_status.event.player, target) - 2) * target.maxHp; - }); - "step 1"; - if (result.bool) { - var cards = player.getCards("he", function (card) { - return get.type(card) != "basic"; - }); - var target = result.targets[0]; - player.logSkill("reyirang", target); - player.give(cards, target, "give"); - if (target.maxHp > player.maxHp) player.gainMaxHp(target.maxHp - player.maxHp, true); - player.recover(cards.length); - } - }, - }, - cslilu: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter: function (event, player) { - return !event.numFixed; - }, - check: function (event, player) { - return ( - Math.min(player.maxHp, 5) - player.countCards("h") > 3 || - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0; - }) - ); - }, - content: function () { - "step 0"; - trigger.changeToZero(); - "step 1"; - player.drawTo(Math.min(player.maxHp, 5)); - "step 2"; - if (player.countCards("h") > 0) { - var str = "将至少一张手牌交给一名其他角色"; - var num = player.countMark("cslilu"); - if (num < player.countCards("h")) { - if (num > 0) str += "。若给出的牌数大于" + get.cnNumber(num) + "张,则你"; - else str += ",并"; - str += "加1点体力上限并回复1点体力"; - } - player.chooseCardTarget({ - prompt: str, - filterCard: true, - filterTarget: lib.filter.notMe, - selectCard: [1, Infinity], - forced: true, - ai1: function (card) { - if (ui.selected.cards.length < _status.event.goon) { - if ( - get.tag(card, "damage") && - game.hasPlayer(function (current) { - current != player && - get.attitude(player, current) > 0 && - !current.hasSkillTag("nogain") && - !current.hasJudge("lebu") && - current.hasValueTarget(card); - }) - ) - return 1; - return 1 / Math.max(0.1, get.value(card)); - } - return 0; - }, - ai2: function (target) { - return ( - Math.sqrt(5 - Math.min(4, target.countCards("h"))) * - get.attitude(_status.event.player, target) - ); - }, - goon: (function () { - if ( - !game.hasPlayer(function (current) { - return ( - current != player && - get.attitude(player, current) > 0 && - !current.hasSkillTag("nogain") && - !current.hasJudge("lebu") - ); - }) - ) - return 1; - if (num < player.countCards("h")) return num + 1; - return 1; - })(), - }); - } else event.finish(); - "step 3"; - if (result.bool) { - var num = player.countMark("cslilu"); - player.give(result.cards, result.targets[0]); - if (result.cards.length > num) { - player.gainMaxHp(); - player.recover(); - } - player.storage.cslilu = result.cards.length; - player.markSkill("cslilu"); - } - }, - }, - csyizheng: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("csyizheng"), lib.filter.notMe) - .set("ai", function (target) { - if (target.isTurnedOver() || target.hasJudge("lebu")) return 0; - return ( - get.attitude(_status.event.player, target) * - Math.max(0, target.countCards("h") - 2) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("csyizheng", target); - player.storage.csyizheng2 = target; - player.addTempSkill("csyizheng2", { player: "phaseBegin" }); - } - }, - }, - csyizheng2: { - audio: "csyizheng", - trigger: { - global: ["recoverBegin", "damageBegin1"], - }, - forced: true, - charlotte: true, - logTarget: function (event) { - return event.name == "damage" ? event.source : event.player; - }, - filter: function (event, player) { - var target = lib.skill.csyizheng2.logTarget(event); - if (target != player.storage.csyizheng2) return false; - return player.maxHp > target.maxHp; - }, - content: function () { - player.loseMaxHp(); - trigger.num++; - }, - mark: "character", - intro: { - content: - "$造成伤害或回复体力时,若你的体力上限大于其,则你减1点体力上限,然后此伤害/回复量+1", - }, - }, - reyixiang: { - audio: "yixiang", - audioname: ["re_taoqian"], - trigger: { player: "damageBegin1" }, - forced: true, - filter: function (event, player) { - var evt = event.getParent(2); - if (evt.name != "useCard" || evt.card != event.card) return false; - var source = evt.player; - var phsu = evt.getParent("phaseUse"); - if (!source || source == player || source != phsu.player) return false; - return ( - source.getHistory("useCard", function (evt2) { - return evt2.getParent("phaseUse") == phsu; - })[0] == evt - ); - }, - content: function () { - trigger.num--; - }, - group: "reyixiang_card", - subSkill: { - card: { - audio: "yixiang", - audioname: ["re_taoqian"], - trigger: { target: "useCardToTargeted" }, - forced: true, - filter: function (event, player) { - if (get.color(event.card) != "black") return false; - var evt = event.getParent(); - var source = evt.player; - var phsu = evt.getParent("phaseUse"); - if (!source || source == player || source != phsu.player) return false; - return ( - source - .getHistory("useCard", function (evt2) { - return evt2.getParent("phaseUse") == phsu; - }) - .indexOf(evt) == 1 - ); - }, - content: function () { - trigger.excluded.add(player); - }, - }, - }, - ai: { - effect: { - target: function (card, player, target, current, isLink) { - if (isLink || typeof card !== "object" || !player.isPhaseUsing()) return; - var num; - var evt = _status.event.getParent("useCard"), - evt2 = _status.event.getParent("phaseUse"); - if (evt.card == card) { - num = player - .getHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == evt2; - }) - .indexOf(evt); - } else - num = player.getHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == evt2; - }).length; - if (num < 0 || num > 1) return; - if (num === 0 && get.tag(card, "damage")) { - if ( - target.hasSkillTag("filterDamage", null, { - player: player, - card: card, - }) || - !player.hasSkillTag("damageBonus", true, { - target: target, - card: card, - }) - ) - return "zerotarget"; - return [0.5, 0, 0.5, 0]; - } - if (num === 1 && get.color(card) == "black") return "zeroplayertarget"; - }, - }, - }, - }, - //赵忠 - yangzhong: { - audio: 2, - trigger: { - source: "damageSource", - player: "damageEnd", - }, - direct: true, - filter: function (event, player) { - var target = event.player, - source = event.source; - if (player != source && !player.hasSkill("yangzhong")) return false; - if (!target || !source || !target.isIn() || !source.isIn()) return false; - return source.countCards("he") > 1; - }, - content: function () { - "step 0"; - trigger.source - .chooseToDiscard( - "是否对" + get.translation(trigger.player) + "发动【殃众】?", - "弃置两张牌,并令其失去1点体力", - "he", - 2 - ) - .set("ai", function (card) { - var evt = _status.event; - if (get.attitude(evt.player, evt.getTrigger().player) >= 0) return 0; - return 7 - get.value(card); - }).logSkill = ["yangzhong", trigger.player]; - "step 1"; - if (result.bool) trigger.player.loseHp(); - }, - }, - huangkong: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - forced: true, - filter: function (event, player) { - if (player == _status.currentPhase || player.countCards("h")) return false; - return event.card.name == "sha" || get.type(event.card, false) == "trick"; - }, - content: function () { - player.draw(2); - }, - }, - hfjieying: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("hfjieying"), lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player; - return ( - (get.attitude(player, target) * - (1 + - target.countCards("h", function (card) { - return !get.tag(card, "damage") && target.hasValueTarget(card); - }))) / - (1 + target.countCards("h")) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("hfjieying", target); - target.addTempSkill("hfjieying2", { player: "phaseJieshuBegin" }); - } - }, - ai: { - expose: 0.05, - }, - }, - hfjieying2: { - mod: { - cardEnabled: function (card, player) { - if (player.storage.hfjieying2) return false; - }, - cardSavable: function (card, player) { - if (player.storage.hfjieying2) return false; - }, - targetInRange: function (card, player) { - if ( - player == _status.currentPhase && - (card.name == "sha" || get.type(card) == "trick") - ) - return true; - }, - aiOrder: function (player, card, num) { - var info = get.info(card); - if (!get.tag(card, "damage") && (!info || !info.toself)) return num + 8; - }, - }, - onremove: true, - trigger: { player: "useCard2" }, - direct: true, - charlotte: true, - filter: function (event, player) { - if (player != _status.currentPhase || event.targets.length != 1) return false; - var card = event.card; - if (card.name != "sha" && get.type(card) != "trick") return false; - var info = get.info(card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(card, player, current) - ); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - player - .chooseTarget(get.prompt("hfjieying2"), function (card, player, target) { - var player = _status.event.player; - return ( - !_status.event.targets.includes(target) && - lib.filter.targetEnabled2(_status.event.card, player, target) - ); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("card", trigger.card) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("hfjieying2", event.targets); - trigger.targets.addArray(event.targets); - } - }, - group: "hfjieying3", - mark: true, - intro: { - content: function (player) { - if (player) return "不能使用牌直到回合结束"; - return "使用【杀】或普通锦囊牌时无距离限制且可以多指定一个目标"; - }, - }, - }, - hfjieying3: { - trigger: { source: "damageSource" }, - forced: true, - popup: false, - filter: function (event, player) { - return !player.storage.hfjieying2 && player == _status.currentPhase; - }, - content: function () { - player.storage.hfjieying2 = true; - }, - }, - weipo: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - forced: true, - filter: function (event, player) { - return ( - player != event.player && - !player.hasSkill("weipo3") && - player.countCards("h") < Math.min(5, player.maxHp) && - (event.card.name == "sha" || get.type(event.card) == "trick") - ); - }, - content: function () { - "step 0"; - player.addTempSkill("weipo2"); - player.drawTo(Math.min(5, player.maxHp)); - "step 1"; - var evt = trigger.getParent(); - if (!evt.weipo) evt.weipo = {}; - evt.weipo[player.playerid] = player.countCards("h"); - }, - }, - weipo2: { - charlotte: true, - trigger: { global: "useCardAfter" }, - forced: true, - popup: false, - filter: function (event, player) { - return ( - event.weipo && - event.weipo[player.playerid] != undefined && - event.weipo[player.playerid] > player.countCards("h") - ); - }, - content: function () { - "step 0"; - player.addTempSkill("weipo3", { player: "phaseBegin" }); - if (player.countCards("h") && trigger.player.isIn()) { - player.chooseCard("h", true, "将一张手牌交给" + get.translation(trigger.player)); - } else event.finish(); - "step 1"; - if (result.bool) { - player.give(result.cards, trigger.player); - } - }, - }, - weipo3: { charlotte: true }, - refuqi: { - audio: "fuqi", - forced: true, - trigger: { - player: "useCard", - }, - filter: function (event, player) { - return ( - event.card && - (get.type(event.card) == "trick" || - (get.type(event.card) == "basic" && - !["shan", "tao", "jiu", "du"].includes(event.card.name))) && - game.hasPlayer(function (current) { - return current != player && get.distance(player, current) <= 1; - }) - ); - }, - content: function () { - trigger.directHit.addArray( - game.filterPlayer(function (current) { - return current != player && get.distance(player, current) <= 1; - }) - ); - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return get.distance(player, arg.target) <= 1; - }, - }, - }, - zhuide: { - audio: 2, - trigger: { player: "die" }, - forceDie: true, - skillAnimation: true, - animationColor: "thunder", - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("zhuide"), lib.filter.notMe).set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("zhuide", target); - var names = []; - var cards = []; - while (cards.length < 4) { - var card = get.cardPile2(function (card) { - return ( - !cards.includes(card) && - !names.includes(card.name) && - get.type(card) == "basic" - ); - }); - if (card) { - cards.push(card); - names.push(card.name); - } else break; - } - if (cards.length) target.gain(cards, "gain2"); - } - }, - }, - juntun: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return player.maxHp > 1; - }, - content: function () { - player.loseMaxHp(); - player.draw(player.maxHp); - }, - }, - jiaojie: { - audio: 2, - mod: { - ignoredHandcard: function (card, player) { - if (get.color(card) == "red") { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && get.color(card) == "red") { - return false; - } - }, - targetInRange: function (card) { - const color = get.color(card); - if (color === "black" || color === "unsure") return true; - }, - cardUsable: function (card) { - const color = get.color(card); - if (color === "black" || color === "unsure") return Infinity; - }, - }, - }, - decadewuniang: { - trigger: { - player: ["useCard", "respond"], - }, - audio: "xinfu_wuniang", - direct: true, - filter: function (event, player) { - return event.card.name == "sha"; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("decadewuniang"), function (card, player, target) { - if (player == target) return false; - return target.countGainableCards(player, "he") > 0; - }) - .set("ai", function (target) { - return 10 - get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("decadewuniang", target); - player.line(target, "fire"); - player.gainPlayerCard(target, "he", true); - target.draw(); - if (!player.storage.decadexushen) event.finish(); - } else event.finish(); - "step 2"; - var list = game.filterPlayer(function (current) { - return current.name == "dc_guansuo" || current.name2 == "dc_guansuo"; - }); - if (list.length) game.asyncDraw(list); - else event.finish(); - "step 3"; - game.delayx(); - }, - }, - minsi: { - audio: 2, - enable: "phaseUse", - getResult: function (cards) { - var l = cards.length; - var all = Math.pow(l, 2); - var list = []; - for (var i = 1; i < all; i++) { - var array = []; - for (var j = 0; j < l; j++) { - if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) - array.push(cards[j]); - } - var num = 0; - for (var k of array) { - num += get.number(k); - } - if (num == 13) list.push(array); - } - if (list.length) { - list.sort(function (a, b) { - if (a.length != b.length) return b.length - a.length; - return get.value(a) - get.value(b); - }); - return list[0]; - } - return list; - }, - usable: 1, - filterCard: function (card) { - 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; - }, - complexCard: true, - selectCard: function () { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - if (num == 13) return ui.selected.cards.length; - return ui.selected.cards.length + 2; - }, - check: function (card) { - var evt = _status.event; - if (!evt.minsi_choice) - evt.minsi_choice = lib.skill.minsi.getResult(evt.player.getCards("he")); - if (!evt.minsi_choice.includes(card)) return 0; - return 1; - }, - position: "he", - content: function () { - player.draw(cards.length * 2).gaintag = ["minsi2"]; - player.addTempSkill("minsi2"); - }, - ai: { - order: 5, - result: { player: 1 }, - }, - }, - minsi2: { - onremove: function (player) { - player.removeGaintag("minsi2"); - }, - mod: { - targetInRange: function (card, player, target) { - if (!card.cards || !card.cards.length) return; - for (var i of card.cards) { - if (!i.hasGaintag("minsi2") || get.color(i) != "black") return; - } - return true; - }, - ignoredHandcard: function (card, player) { - if (card.hasGaintag("minsi2") && get.color(card) == "red") { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("minsi2") && get.color(card) == "red") { - return false; - } - }, - aiOrder: function (player, card, num) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("minsi2") && - get.color(card) == "black" - ) - return num - 0.1; - }, - }, - }, - jijing: { - audio: 2, - trigger: { player: "damageEnd" }, - frequent: true, - content: function () { - "step 0"; - player.judge(); - "step 1"; - var num = result.number; - var next = player.chooseToDiscard( - "是否弃置任意张点数之和为" + get.cnNumber(num) + "的牌并回复1点体力?", - function (card) { - 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 <= _status.event.num; - }, - "he" - ); - next.set("num", num); - next.set("complexCard", true); - next.set("selectCard", function () { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - if (num == _status.event.num) return ui.selected.cards.length; - return ui.selected.cards.length + 2; - }); - next.set( - "cardResult", - (function () { - var cards = player.getCards("he"); - var l = cards.length; - var all = Math.pow(l, 2); - var list = []; - for (var i = 1; i < all; i++) { - var array = []; - for (var j = 0; j < l; j++) { - if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) - array.push(cards[j]); - } - var numx = 0; - for (var k of array) { - numx += get.number(k); - } - if (numx == num) list.push(array); - } - if (list.length) { - list.sort(function (a, b) { - return get.value(a) - get.value(b); - }); - return list[0]; - } - return list; - })() - ); - next.set("ai", function (card) { - if (!_status.event.cardResult.includes(card)) return 0; - return 6 - get.value(card); - }); - "step 2"; - if (result.bool) player.recover(); - }, - }, - cixiao: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter: function (event, player) { - if ( - !game.hasPlayer(function (current) { - return current.hasSkill("panshi"); - }) - ) - return true; - return ( - player.countCards("he") >= 1 && - game.hasPlayer(function (current) { - return current != player && !current.hasSkill("panshi"); - }) - ); - }, - content: function () { - "step 0"; - if ( - game.hasPlayer(function (current) { - return current.hasSkill("panshi"); - }) - ) - event.goto(2); - else - player - .chooseTarget( - lib.filter.notMe, - get.prompt("cixiao"), - "令一名其他角色获得「义子」标记" - ) - .set("ai", function (target) { - var player = _status.event.player; - var att = -get.attitude(player, target); - return att * target.countCards("h"); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("cixiao", target); - target.addSkills("panshi"); - } - event.finish(); - "step 2"; - var list = game.filterPlayer(function (current) { - return current.hasSkill("panshi"); - }); - player.chooseCardTarget({ - prompt: get.prompt("cixiao"), - prompt2: "弃置一张牌并将" + get.translation(list) + "的「义子」标记转移给其他角色", - position: "he", - filterTarget: function (card, player, target) { - return player != target && !target.hasSkill("panshi"); - }, - filterCard: lib.filter.cardDiscardable, - ai1: function (card) { - if (_status.event.goon) return 5 - get.value(card); - return 0; - }, - ai2: function (target) { - var player = _status.event.player; - var att = -get.attitude(player, target); - return att * target.countCards("h"); - }, - goon: (function (target) { - var att = -get.attitude(player, target); - return att * target.countCards("h") <= 0; - })(list[0]), - }); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("cixiao"); - player.discard(result.cards).delay = false; - player.line2( - game - .filterPlayer(function (current) { - if (current.hasSkill("panshi")) { - current.removeSkills("panshi"); - return true; - } - }) - .concat(result.targets), - "green" - ); - target.addSkills("panshi"); - } else event.finish(); - "step 4"; - game.delayx(); - }, - derivation: "panshi", - ai: { threaten: 8 }, - }, - panshi: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return current != player && current.hasSkill("cixiao"); - }) - ); - }, - content: function () { - "step 0"; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("cixiao"); - }); - if (targets.length == 1) { - event.target = targets[0]; - player.chooseCard("h", true, "叛弑:将一张手牌交给" + get.translation(targets)); - } else - player.chooseCardTarget({ - prompt: "叛弑:将一张手牌交给" + get.translation(targets) + "中的一名角色", - filterCard: true, - position: "h", - targets: targets, - forced: true, - filterTarget: function (card, player, target) { - return _status.event.targets.includes(target); - }, - }); - "step 1"; - if (result.bool) { - if (!target) target = result.targets[0]; - player.line(target); - player.give(result.cards, target); - } - }, - mark: true, - marktext: "子", - intro: { - name: "义子", - //content:'我是儿子', - //R·I·P——永远怀念:被棘手砍掉的“我是儿子” - content(_, player) { - const targets = game - .filterPlayer2((target) => target.hasSkill("cixiao", null, null, false)) - .sortBySeat(player); - if (!targets.length) return "我义父呢?!"; - if ( - ["name", "name1", "name2"].some((name) => { - if ( - !player[name] || - !get.character(player[name]) || - typeof get.translation(player[name]) != "string" - ) - return false; - return ( - player[name].includes("lvbu") && - get.translation(player[name]).includes("吕布") - ); - }) - ) - return "公若不弃,布愿拜为义父"; - return ( - "我是" + - get.translation(targets) + - "的" + - ((player) => { - switch (player.sex) { - case "female": - return "义女"; - case "double": - return "义子义女"; - default: - return "义子"; - } - })(player) - ); - }, - }, - group: "panshi_damage", - ai: { - halfneg: true - }, - }, - panshi_damage: { - trigger: { source: "damageBegin1" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - return ( - player.isPhaseUsing() && - event.card && - event.card.name == "sha" && - event.player.hasSkill("cixiao") - ); - }, - content: function () { - trigger.num++; - if ( - ["name", "name1", "name2"].some((name) => { - if ( - !player[name] || - !get.character(player[name]) || - typeof get.translation(player[name]) != "string" - ) - return false; - return ( - player[name].includes("lvbu") && - get.translation(player[name]).includes("吕布") - ); - }) - ) - player.chat("吾堂堂丈夫,安肯为汝子乎!"); - var evt = event.getParent("phaseUse"); - if (evt && evt.player == player) evt.skipped = true; - }, - }, - xianshuai: { - audio: 2, - trigger: { global: "damageSource" }, - forced: true, - filter: function (event, player) { - return event.source && event.source.isIn() && !player.hasSkill("xianshuai2"); - }, - content: function () { - player.addTempSkill("xianshuai2", "roundStart"); - player.draw(); - if (player == trigger.source && trigger.player.isIn()) { - player.line(trigger.player, "green"); - trigger.player.damage(); - } - }, - }, - xianshuai2: { charlotte: true }, - decadexushen: { - derivation: "decadezhennan", - audio: "xinfu_xushen", - trigger: { player: "dying" }, - limited: true, - skillAnimation: true, - animationColor: "orange", - filter: function (event, player) { - return player.hp < 1; - }, - content: function () { - player.awakenSkill("decadexushen"); - player.addSkills("decadezhennan"); - player.addTempSkill("decadexushen2"); - trigger.decadexushen = true; - player.recover(); - }, - }, - decadexushen2: { - trigger: { player: "dyingAfter" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return ( - event.decadexushen == true && - !game.hasPlayer(function (current) { - return current.name == "dc_guansuo" || current.name2 == "dc_guansuo"; - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - lib.filter.notMe, - "许身:是否令一名其他角色选择是否将其武将牌替换为“关索”并令其摸三张牌?" - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (!result.bool) { - event.finish(); - return; - } - var target = result.targets[0]; - event.target = target; - player.line(target, "fire"); - target.chooseBool( - "许身:是否将自己的一张武将牌替换为“关索”并令" + - get.translation(player) + - "摸三张牌?" - ); - "step 2"; - if (result.bool) { - if (target.name2 != undefined) { - target - .chooseControl(target.name1, target.name2) - .set("prompt", "请选择要更换的武将牌"); - } else event._result = { control: target.name1 }; - } else event.goto(4); - "step 3"; - target.reinitCharacter(result.control, "dc_guansuo"); - "step 4"; - target.draw(3); - }, - }, - decadezhennan: { - audio: "xinfu_zhennan", - trigger: { - global: "useCardToPlayered", - }, - filter: function (event, player) { - return ( - event.isFirstTarget && - event.targets && - event.targets.length > 1 && - get.type2(event.card) == "trick" - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("decadezhennan"), - "对一名其他角色造成1点伤害", - function (card, player, target) { - return target != player; - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool && result.targets && result.targets.length) { - player.logSkill("decadezhennan", result.targets); - result.targets[0].damage(); - } - }, - ai: { - expose: 0.25, - }, - }, - yujue: { - audio: 2, - derivation: "zhihu", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.hasEnabledSlot(); - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog("###鬻爵###" + lib.translate.yujue_info); - }, - chooseControl: function (event, player) { - var list = []; - for (var i = 1; i < 6; i++) { - if (player.hasEnabledSlot(i)) list.push("equip" + i); - } - list.push("cancel2"); - return list; - }, - check: function (event, player) { - for (var i = 5; i > 0; i--) { - if (player.hasEmptySlot(i)) return "equip" + i; - } - return "cancel2"; - }, - backup: function (result) { - var next = get.copy(lib.skill.yujuex); - next.position = result.control; - return next; - }, - }, - ai: { - order: 1, - result: { - player: function (player) { - if ( - game.hasPlayer(function (target) { - if (player == target) return false; - var hs = target.countCards("h"); - return hs > 2 && get.attitude(player, target) > 0; - }) - ) - return 1; - return 0; - }, - }, - }, - }, - yujuex: { - audio: "yujue", - async content(event, trigger, player) { - await player.disableEquip(lib.skill.yujue_backup.position); - if ( - player.isIn() && - game.hasPlayer(function (current) { - return current != player && current.countCards("h"); - }) - ) { - const result = await player - .chooseTarget( - true, - "选择一名角色交给你一张牌并获得技能〖执笏〗", - function (card, player, target) { - if (player == target) return false; - return target.countCards("h") > 0; - } - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target) * target.countCards("h"); - }) - .forResult(); - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target); - const result2 = await target - .chooseCard("h", true, "交给" + get.translation(player) + "一张手牌") - .forResult(); - if (result2.bool && result2.cards && result2.cards.length) { - await target.give(result2.cards, player); - target.storage.zhihu_mark = player; - await target.addSkills("zhihu"); - target.addSkill("zhihu_mark"); - } - } - } - }, - }, - zhihu: { - usable: 2, - trigger: { source: "damageSource" }, - forced: true, - filter: function (event, player) { - return player != event.player; - }, - content: function () { - player.draw(2); - }, - }, - zhihu_mark: { - mark: "character", - intro: { - content: "以$之名,授予汝技能〖执笏〗,直至$的下回合开始为止!", - }, - onremove: function (player) { - delete player.storage.zhihu_mark; - player.removeSkills("zhihu"); - }, - trigger: { global: "phaseBeginStart" }, - firstDo: true, - charlotte: true, - silent: true, - filter: function (event, player) { - return event.player == player.storage.zhihu_mark; - }, - content: function () { - player.removeSkill("zhihu_mark"); - }, - }, - tuxing: { - audio: 2, - trigger: { player: "disableEquipAfter" }, - forced: true, - content: function () { - "step 0"; - player.gainMaxHp(); - player.recover(); - "step 1"; - if (!player.hasEnabledSlot()) { - player.loseMaxHp(4); - player.addSkill("tuxing2"); - } - }, - }, - tuxing2: { - audio: "tuxing", - trigger: { source: "damageBegin1" }, - forced: true, - charlotte: true, - content: function () { - trigger.num++; - }, - mark: true, - intro: { - content: "造成伤害时,此伤害+1", - }, - }, - gongjian: { - audio: 2, - trigger: { global: "useCardToPlayered" }, - usable: 1, - logTarget: function (event) { - return event.parent.gongjian_targets.filter(function (target) { - return event.targets.includes(target) && target.countCards("he") > 0; - }); - }, - filter: function (event, player) { - if (event.card.name != "sha" || !event.isFirstTarget) return false; - if ( - event.parent.gongjian_targets && - event.parent.gongjian_targets.filter(function (target) { - return event.targets.includes(target) && target.countCards("he") > 0; - }).length > 0 - ) - return true; - return false; - }, - check: function (event, player) { - var targets = event.parent.gongjian_targets.filter(function (target) { - return event.targets.includes(target) && target.countCards("he") > 0; - }), - att = 0; - for (var i of targets) { - att += get.attitude(player, i); - } - return att < 0; - }, - content: function () { - "step 0"; - event.targets = trigger.parent.gongjian_targets.filter(function (target) { - return trigger.targets.includes(target); - }); - event.num = 0; - "step 1"; - var target = targets[num]; - player.discardPlayerCard(target, true, "he", [1, 2]).set("forceAuto", true); - "step 2"; - event.num++; - if (event.num < targets.length) event.goto(1); - else { - var cards = []; - game.getGlobalHistory("cardMove", function (evt) { - if (evt.player && evt.hs && evt.type == "discard" && evt.getParent(3) == event) { - for (var i of evt.hs) { - if (get.name(i, evt.player) == "sha" && get.position(i, true) == "d") - cards.add(i); - } - } - }); - if (cards.length) player.gain(cards, "gain2"); - } - }, - group: "gongjian_count", - subSkill: { - count: { - trigger: { global: "useCard1" }, - silent: true, - firstDo: true, - filter: function (event, player) { - return event.card && event.card.name == "sha"; - }, - content: function () { - if (player.storage.gongjian) trigger.gongjian_targets = player.storage.gongjian; - player.storage.gongjian = trigger.targets; - }, - }, - }, - }, - kuimang: { - audio: 2, - trigger: { global: "dieAfter" }, - forced: true, - filter: function (event, player) { - return ( - player.getAllHistory("sourceDamage", function (target) { - return target.player == event.player; - }).length > 0 - ); - }, - content: function () { - player.draw(2); - }, - }, - rexiemu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return !game.hasPlayer(function (current) { - return current.hasMark("rexiemu"); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("rexiemu"), lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player; - return ( - get.attitude(player, target) * - Math.sqrt(Math.max(1 + player.countCards("h"), 1 + target.countCards("h"))) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("rexiemu", target); - target.addMark("rexiemu", 1); - player.addSkill("rexiemu2"); - } - }, - intro: { content: "mark" }, - ai: { - expose: 0.1, - }, - }, - rexiemu2: { - audio: "rexiemu", - trigger: { global: ["loseAfter"] }, - forced: true, - charlotte: true, - usable: 1, - filter: function (event, player) { - return ( - (event.player == player || event.player.hasMark("rexiemu")) && - ["useCard", "respond"].includes(event.getParent().name) && - event.hs && - event.hs.length && - event.player != _status.currentPhase && - game.hasPlayer(function (current) { - return current.hasMark("rexiemu"); - }) - ); - }, - content: function () { - "step 0"; - game.asyncDraw( - game.filterPlayer(function (current) { - return ( - current == player || current == trigger.player || current.hasMark("rexiemu") - ); - }) - ); - "step 1"; - game.delayx(); - }, - group: "rexiemu3", - }, - rexiemu3: { - trigger: { player: "phaseBegin" }, - forced: true, - charlotte: true, - silent: true, - firstDo: true, - content: function () { - player.removeSkill("rexiemu2"); - game.countPlayer(function (current) { - var num = current.countMark("rexiemu"); - if (num) current.removeMark("rexiemu", num); - }); - }, - }, - heli: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return lib.skill.heli.filterTarget(null, player, current); - }); - }, - filterTarget: function (card, player, target) { - return target.countCards("h") < player.countCards("h"); - }, - content: function () { - "step 0"; - if (target.countCards("h")) target.showHandcards(); - "step 1"; - var list = []; - var cards = []; - for (var i of lib.inpile) list.add(get.type2(i)); - for (var i of list) { - if ( - !target.countCards("h", function (card) { - return get.type2(card, target) == i; - }) - ) { - var card = get.cardPile2(function (card) { - return get.type2(card, false) == i; - }); - if (card) cards.push(card); - } - } - if (cards.length) target.gain(cards, "gain2", "log"); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - return 1 / Math.sqrt(1 + target.countCards("h")); - }, - }, - }, - }, - moying: { - audio: 2, - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - direct: true, - filter: function (event, player) { - if (player == _status.currentPhase || event.getParent().name == "useCard") return false; - if (event.name == "gain" && event.player == player) return false; - var evt = event.getl(player); - return ( - evt && - evt.cards2 && - evt.cards2.length == 1 && - ["equip", "trick"].includes( - get.type2( - evt.cards2[0], - evt.type == "discard" && evt.hs.includes(evt.cards2[0]) ? player : false - ) - ) && - !player.hasSkill("moying2") - ); - }, - content: function () { - "step 0"; - var number = trigger.getl(player).cards2[0].number; - var numbers = [number - 2, number - 1, number, number + 1, number + 2].filter(function ( - number - ) { - return number >= 1 && number <= 13; - }); - if (player.isUnderControl()) { - game.swapPlayerAuto(player); - } - var switchToAuto = function () { - _status.imchoosing = false; - event._result = { - bool: true, - suit: lib.suit.randomGet(), - number: numbers.randomGet(), - }; - if (event.dialog) event.dialog.close(); - if (event.control) event.control.close(); - }; - var chooseButton = function (player, numbers) { - var event = _status.event; - player = player || event.player; - if (!event._result) event._result = {}; - var dialog = ui.create.dialog("是否发动【墨影】?", "forcebutton", "hidden"); - event.dialog = dialog; - dialog.addText("花色"); - var table = document.createElement("div"); - table.classList.add("add-setting"); - table.style.margin = "0"; - table.style.width = "100%"; - table.style.position = "relative"; - var listi = ["spade", "heart", "club", "diamond"]; - for (var i = 0; i < listi.length; i++) { - var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); - td.link = listi[i]; - table.appendChild(td); - td.innerHTML = "" + get.translation(listi[i]) + ""; - td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { - if (_status.dragged) return; - if (_status.justdragged) return; - _status.tempNoButton = true; - setTimeout(function () { - _status.tempNoButton = false; - }, 500); - var link = this.link; - var current = this.parentNode.querySelector(".bluebg"); - if (current) { - current.classList.remove("bluebg"); - } - this.classList.add("bluebg"); - event._result.suit = link; - }); - } - dialog.content.appendChild(table); - dialog.addText("点数"); - var table2 = document.createElement("div"); - table2.classList.add("add-setting"); - table2.style.margin = "0"; - table2.style.width = "100%"; - table2.style.position = "relative"; - for (var i = 0; i < numbers.length; i++) { - var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); - td.link = numbers[i]; - table2.appendChild(td); - var num = numbers[i]; - switch (num) { - case 1: - num = "A"; - break; - case 11: - num = "J"; - break; - case 12: - num = "Q"; - break; - case 13: - num = "K"; - break; - } - td.innerHTML = "" + num + ""; - td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { - if (_status.dragged) return; - if (_status.justdragged) return; - _status.tempNoButton = true; - setTimeout(function () { - _status.tempNoButton = false; - }, 500); - var link = this.link; - var current = this.parentNode.querySelector(".bluebg"); - if (current) { - current.classList.remove("bluebg"); - } - this.classList.add("bluebg"); - event._result.number = link; - }); - } - dialog.content.appendChild(table2); - dialog.add("  "); - event.dialog.open(); - - event.switchToAuto = function () { - event._result = { - bool: true, - number: numbers.randomGet(), - suit: lib.suit.randomGet(), - }; - event.dialog.close(); - event.control.close(); - game.resume(); - _status.imchoosing = false; - }; - event.control = ui.create.control("ok", "cancel2", function (link) { - var result = event._result; - if (link == "cancel2") result.bool = false; - else { - if (!result.number || !result.suit) return; - result.bool = true; - } - event.dialog.close(); - event.control.close(); - game.resume(); - _status.imchoosing = false; - }); - for (var i = 0; i < event.dialog.buttons.length; i++) { - event.dialog.buttons[i].classList.add("selectable"); - } - game.pause(); - game.countChoose(); - }; - if (event.isMine()) { - chooseButton(player, numbers); - } else if (event.isOnline()) { - event.player.send(chooseButton, event.player, numbers); - event.player.wait(); - game.pause(); - } else { - switchToAuto(); - } - "step 1"; - var map = event.result || result; - if (map.bool) { - player.logSkill("moying"); - player.addTempSkill("moying2"); - var cards = []; - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var card = ui.cardPile.childNodes[i]; - if (get.suit(card) == map.suit && get.number(card) == map.number) - cards.push(card); - } - if (cards.length) player.gain(cards, "gain2", "log"); - } - }, - }, - moying2: {}, - juanhui: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("juanhui"), - lib.filter.notMe, - "选择记录一名其他角色使用过的牌" - ) - .set("ai", function (target) { - if (target.isTurnedOver() || target.hasJudge("lebu")) return Math.random(); - return (1 + target.countCards("h")) * 2 + Math.random(); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("juanhui", target); - player.storage.juanhui2 = target; - player.storage.juanhui3 = []; - player.addSkill("juanhui2"); - } - }, - }, - juanhui2: { - charlotte: true, - mark: true, - mod: { - cardUsable: function (card) { - if (card.name == "sha" && _status.event.skill == "juanhui2_backup") return Infinity; - }, - }, - intro: { - markcount: function (storage, player) { - return player.getStorage("juanhui3").length; - }, - mark: function (dialog, storage, player) { - dialog.addText("记录目标"); - dialog.addSmall([storage]); - var vcard = player.getStorage("juanhui3"); - if (vcard.length) { - dialog.addText("记录卡牌"); - dialog.addSmall([vcard, "vcard"]); - } - }, - content: function (storage, player) { - var str = "记录目标:" + get.translation(storage); - var vcard = player.getStorage("juanhui3"); - if (vcard.length) { - str += "
    记录卡牌:"; - for (var i of vcard) { - if (i[2] == "sha" && i[3]) str += get.translation(i[3]); - str += get.translation(i[2]); - str += "、"; - } - str = str.slice(0, str.length - 1); - } - return str; - }, - }, - onremove: function (player) { - delete player.storage.juanhui2; - delete player.storage.juanhui3; - }, - group: "juanhui3", - enable: "phaseUse", - filter: function (event, player) { - return player.getStorage("juanhui3").length > 0 && player.countCards("hs") > 0; - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog("绢绘", [player.getStorage("juanhui3"), "vcard"], "hidden"); - }, - filter: function (button, player) { - return lib.filter.cardEnabled( - { - name: button.link[2], - nature: button.link[3], - }, - player, - _status.event.getParent() - ); - }, - check: function (button) { - var player = _status.event.player; - var card = { - name: button.link[2], - nature: button.link[3], - }; - if (player.getUseValue(card) > 0) return get.order(card); - return -1; - }, - backup: function (links, player) { - return { - audio: "juanhui", - popname: true, - filterCard: true, - position: "hs", - viewAs: { - name: links[0][2], - nature: links[0][3], - }, - check: function (card) { - return 6 - get.value(card); - }, - precontent: function () { - var card = event.result.card; - if (card.name == "sha") event.getParent().addCount = false; - var vcard = player.storage.juanhui3; - for (var i = 0; i < vcard.length; i++) { - if (vcard[i][2] == card.name) vcard.splice(i--, 1); - } - if (vcard.length) player.markSkill("juanhui2"); - else { - player.unmarkSkill("juanhui2"); - event.getParent().juanhui = true; - } - }, - }; - }, - prompt: function (links, player) { - return ( - "将一张手牌当做" + - (links[0][2] == "sha" && links[0][3] ? get.translation(links[0][3]) : "") + - get.translation(links[0][2]) + - "使用" - ); - }, - }, - ai: { - order: function (item, player) { - var muniu = player.getStorage("juanhui3"); - var order = 0; - for (var i = 0; i < muniu.length; i++) { - var card = { name: muniu[i][2], nature: muniu[i][3] }; - if (player.getUseValue(card) > 0) { - var order2 = get.order(card); - if (order2 > order) order = order2; - } - } - return order + 0.1; - }, - result: { - player: 1, - }, - }, - }, - juanhui3: { - charlotte: true, - firstDo: true, - trigger: { - global: "useCard2", - player: ["phaseUseEnd", "phaseUseSkipped", "useCardAfter"], - }, - silent: true, - filter: function (event, player, name) { - if (event.name == "phaseUse") return true; - else if (name == "useCardAfter") return event.getParent().juanhui; - return ( - event.player == player.storage.juanhui2 && - event.player.isPhaseUsing() && - ["basic", "trick"].includes(get.type(event.card)) && - player.getStorage("juanhui3").filter(function (vcard) { - return vcard[2] == event.card.name; - }).length == 0 - ); - }, - content: function () { - if (trigger.name == "phaseUse") player.removeSkill("juanhui2"); - else if (event.triggername == "useCardAfter") { - player.recover(); - player.drawTo(3); - } else { - var vcard = [get.type(trigger.card), "", trigger.card.name]; - if (game.hasNature(trigger.card)) vcard.push(get.nature(trigger.card)); - player.storage.juanhui3.push(vcard); - player.markSkill("juanhui2"); - } - }, - }, - mubing: { - audio: 2, - audioname: ["sp_key_yuri"], - trigger: { player: "phaseUseBegin" }, - //direct:true, - frequent: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - var num = player.storage.mubing2 ? 4 : 3; - event.num = num; - event.cards = game.cardsGotoOrdering(get.cards(num)).cards; - game.log(player, "展示了", event.cards); - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (player, id, cards) { - var str = get.translation(player) + "发动了【募兵】"; - var dialog = ui.create.dialog(str, cards); - dialog.videoId = id; - }, - player, - event.videoId, - event.cards - ); - game.addVideo("showCards", player, [ - get.translation(player) + "发动了【募兵】", - get.cardsInfo(event.cards), - ]); - game.delay(2); - "step 1"; - var numa = 0; - cards.sort(function (a, b) { - return a.number - b.number; - }); - for (var i of cards) { - if (get.value(i, player) > 0) numa += get.number(i); - } - player - .chooseToDiscard([1, Infinity], "h") - .set("ai", function (card) { - var player = _status.event.player; - var numa = _status.event.numa; - //if(card.name!='tengjia'&&get.position(card)=='e'&&get.equipValue(card,player)<=0) return 14; - var num = 0; - for (var i of ui.selected.cards) { - num += i.number; - } - if (num >= numa) return 0; - if (card.number + num >= numa) return 15 - get.value(card); - if (!ui.selected.cards.length) { - var min = _status.event.min; - if ( - card.number < min && - !player.countCards("h", function (xcard) { - return xcard != card && card.number + xcard.number > min; - }) - ) - return 0; - return card.number; - } - return Math.max(5 - get.value(card), card.number); - }) - .set("prompt", false) - .set("numa", numa) - .set("min", cards[0].number); - var func = function (id) { - var dialog = get.idDialog(id); - if (dialog) dialog.content.firstChild.innerHTML = "请选择要弃置的牌"; - }; - if (player == game.me) func(event.videoId); - else if (player.isOnline()) player.send(func, event.videoId); - "step 2"; - if (!result.bool) { - return; - } - var numx = 0; - for (var i of result.cards) { - numx += get.number(i); - } - event.numx = numx; - var next = player.chooseButton([0, num]); - next.set("dialog", event.videoId); - next.set("filterButton", function (button) { - var num = 0; - for (var i = 0; i < ui.selected.buttons.length; i++) { - num += get.number(ui.selected.buttons[i].link); - } - return num + get.number(button.link) <= _status.event.maxNum; - }); - next.set("maxNum", event.numx); - next.set("ai", function (button) { - return get.value(button.link, _status.event.player); - }); - var func = function (id) { - var dialog = get.idDialog(id); - if (dialog) dialog.content.firstChild.innerHTML = "请选择要获得的牌"; - }; - if (player == game.me) func(event.videoId); - else if (player.isOnline()) player.send(func, event.videoId); - "step 3"; - if (!result.bool) event.cards = []; - else event.cards = result.links; - "step 4"; - game.broadcastAll("closeDialog", event.videoId); - game.addVideo("cardDialog", null, event.videoId); - if (!cards.length) { - event.finish(); - return; - } - player.gain(cards, "log", "gain2"); - if (!player.storage.mubing2) { - event.finish(); - return; - } - event.given = []; - "step 5"; - var hs = player.getCards("h"); - cards = cards.filter(function (card) { - return hs.includes(card); - }); - if ( - cards.length && - game.hasPlayer(function (current) { - return current != player && !event.given.includes(current); - }) - ) - player.chooseCardTarget({ - prompt: "是否将得到的牌中的任意张交给其他角色?", - selectCard: [1, cards.length], - filterCard: function (card) { - return _status.event.cards.includes(card); - }, - filterTarget: function (card, player, target) { - return target != player && !_status.event.given.includes(target); - }, - cards: cards, - given: event.given, - ai1: function (card) { - return -1; - }, - }); - else event.finish(); - "step 6"; - if (result.bool) { - var target = result.targets[0]; - var cards = result.cards; - event.given.push(target); - event.cards.removeArray(cards); - player.line(target, "green"); - player.give(cards, target); - event.goto(5); - } - }, - }, - ziqu: { - audio: 2, - audioname: ["sp_key_yuri"], - trigger: { source: "damageBegin2" }, - filter: function (event, player) { - return ( - event.player != player && - !player.getStorage("ziqu").includes(event.player) && - event.player.countCards("he") > 0 - ); - }, - check: function (event, player) { - var target = event.player; - var eff = get.damageEffect(target, player, player); - if (get.attitude(player, target) > 0) { - if (eff >= 0) return false; - return true; - } - if (eff <= 0) return true; - if (target.hp == 1) return false; - if (event.num > 1) return false; - var cards = target.getCards("he"); - for (var i = 0; i < cards.length; i++) { - if (get.number(cards[i]) > 10) return true; - } - return false; - }, - logTarget: "player", - content: function () { - "step 0"; - trigger.cancel(); - if (!player.storage.ziqu) player.storage.ziqu = []; - player.storage.ziqu.push(trigger.player); - player.markSkill("ziqu"); - trigger.player.chooseCard(true, "he", function (card, player) { - return !player.countCards("he", function (cardx) { - return cardx.number > card.number; - }); - }); - "step 1"; - if (result.bool && result.cards && result.cards.length) - trigger.player.give(result.cards, player); - }, - intro: { content: "已对$发动过" }, - }, - mubing_rewrite: { - mark: true, - intro: { - content: - "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。", - }, - ai: { - combo: "mubing" - }, - }, - diaoling: { - audio: 2, - audioname: ["sp_key_yuri"], - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "metal", - filter: function (event, player) { - var num = 0; - player.getAllHistory("gain", function (evt) { - var evt2 = evt.getParent(); - if (evt2.name == "mubing" && evt2.player == player) - num += evt.cards.filter(function (card) { - return ( - card.name == "sha" || - get.subtype(card, false) == "equip1" || - (get.type2(card, false) == "trick" && - get.tag({ name: card.name }, "damage")) - ); - }).length; - }); - return num >= 6; - }, - content: function () { - player.awakenSkill("diaoling"); - player.storage.mubing2 = true; - player.markSkill("mubing_rewrite"); - player.chooseDrawRecover(2, true); - }, - ai: { - combo: "mubing" - }, - derivation: "mubing_rewrite", - }, - refenyin_wufan: { audio: 2 }, - //官渡之战 - xiying: { - trigger: { player: "phaseUseBegin" }, - audio: 2, - direct: true, - filter: function (event, player) { - return ( - player.countCards("h", function (card) { - return _status.connectMode || get.type(card) != "basic"; - }) > 0 - ); - }, - content: function () { - "step 0"; - var list = game.filterPlayer(function (current) { - return current != player; - }); - list.sortBySeat(); - event.targets = list; - player - .chooseToDiscard(get.prompt2("xiying"), "h", function (card) { - return get.type(card) != "basic"; - }) - .set("logSkill", ["xiying", list]) - .set("ai", function (card) { - return _status.event.val - get.value(card); - }) - .set( - "val", - (function () { - return ( - 4 * - Math.sqrt( - game.countPlayer(function (current) { - return ( - get.attitude(player, current) < 0 && - current.countCards("he") > 0 - ); - }) - ) - ); - })() - ); - "step 1"; - if (!result.bool) event.finish(); - else player.addTempSkill("xiying_gain"); - "step 2"; - var target = targets.shift(); - event.target = target; - if (target.isIn()) - target - .chooseToDiscard("he", "弃置一张牌,或本回合内不能使用或打出牌") - .set("ai", function (card) { - var player = _status.event.player; - var source = _status.event.getTrigger().player; - if (get.attitude(source, player) > 0) return -1; - if (_status.event.getRand() > 0.5) return 5 - get.value(card); - return -1; - }); - "step 3"; - if (target.isIn() && !result.bool) target.addTempSkill("xiying2"); - if (targets.length) event.goto(2); - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return arg.target.hasSkill("xiying2"); - }, - }, - subSkill: { - gain: { - trigger: { player: "phaseJieshuBegin" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return ( - player.getHistory("sourceDamage", function (evt) { - return evt.isPhaseUsing(player); - }).length > 0 - ); - }, - content: function () { - var card = get.cardPile2(function (card) { - var type = get.type(card, false); - if (type != "basic" && type != "trick") return false; - return get.tag(card, "damage") > 0; - }); - if (card) player.gain(card, "gain2"); - }, - }, - }, - }, - xiying2: { - mark: true, - intro: { content: "本回合内不能使用或打出牌" }, - mod: { - cardEnabled2: function (card) { - return false; - }, - }, - }, - gangzhi: { - audio: 2, - trigger: { - player: "damageBefore", - source: "damageBefore", - }, - forced: true, - filter: function (event, player) { - if (event.source == event.player) return false; - if (event.player == player) { - return event.source && event.source.isIn(); - } - return true; - }, - content: function () { - trigger.cancel(); - trigger.player.loseHp(trigger.num); - }, - ai: { - jueqing: true, - }, - }, - beizhan: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - audio: 2, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("beizhan")).set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - var hs = target.countCards("h"); - var ht = target.maxHp; - if (hs >= ht && target.isMaxHandcard()) return -att * hs; - if ( - hs < ht && - game.hasPlayer(function (current) { - return current.countCards("h") > ht; - }) - ) - return att * 2 * (ht - hs); - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("beizhan", target); - target.drawTo(Math.min(5, target.maxHp)); - target.addSkill("beizhan2"); - } - }, - ai: { - expose: 0.25, - }, - }, - beizhan2: { - trigger: { player: "phaseBegin" }, - silent: true, - firstDo: true, - content: function () { - player.removeSkill("beizhan2"); - if (player.isMaxHandcard()) player.addTempSkill("zishou2"); - }, - mark: true, - intro: { content: "回合开始时,若手牌数为全场最多,则回合内不能使用牌指定其他角色为目标" }, - }, - fenglve: { - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - direct: true, - content: function () { - "step 0"; - var goon = player.hasCard(function (card) { - if (get.position(card) != "h") return false; - var val = get.value(card); - if (val < 0) return true; - if (val <= 5) { - return card.number >= 12; - } - if (val <= 6) { - return card.number >= 13; - } - return false; - }); - player - .chooseTarget(get.prompt2("fenglve"), function (card, player, target) { - return player.canCompare(target); - }) - .set("ai", function (target) { - if (!_status.event.goon) return 0; - return ( - (-get.attitude(player, target) * (1 + target.countCards("e"))) / - (1 + target.countCards("j")) - ); - }) - .set("goon", goon); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("fenglve", target); - player.chooseToCompare(target); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - var num = 0; - if (target.countCards("h")) num++; - if (target.countCards("e")) num++; - if (target.countCards("j")) num++; - if (num) { - event.gainner = player; - event.giver = target; - target - .choosePlayerCard(target, num, "hej", true) - .set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if ( - get.position(button.link) == - get.position(ui.selected.buttons[i].link) - ) - return false; - } - return true; - }) - .set("prompt", "选择交给" + get.translation(event.gainner) + "的牌"); - } else event.finish(); - } else { - if (player.countCards("he")) { - event.gainner = target; - event.giver = player; - player - .choosePlayerCard(player, true, "he") - .set("prompt", "选择交给" + get.translation(event.gainner) + "的牌"); - } else event.finish(); - } - "step 3"; - event.giver.give(result.links, event.gainner); - }, - group: "fenglve2", - ai: { - expose: 0.25, - }, - }, - fenglve2: { - trigger: { - player: "chooseToCompareAfter", - target: "chooseToCompareAfter", - }, - check: function (event, player) { - var card, target; - if (player == event.player) { - card = event.card1; - target = event.target; - } else { - card = event.card2; - target = event.player; - } - return get.attitude(player, target) * get.value(card, target, "raw") > 0; - }, - filter: function (event, player) { - if (event.targets) return false; - var card, target; - if (player == event.player) { - card = event.card1; - target = event.target; - } else { - card = event.card2; - target = event.player; - } - return get.position(card, true) == "o"; - }, - prompt: function (event, player) { - var card, target; - if (player == event.player) { - card = event.card1; - target = event.target; - } else { - card = event.card2; - target = event.player; - } - return ( - "是否发动【锋略】,令" + - get.translation(target) + - "获得" + - get.translation(card) + - "?" - ); - }, - logTarget: function (event, player) { - var target; - if (player == event.player) { - target = event.target; - } else { - target = event.player; - } - return target; - }, - content: function () { - var card, target; - if (player == trigger.player) { - card = trigger.card1; - target = trigger.target; - } else { - card = trigger.card2; - target = trigger.player; - } - target.gain(card, "gain2", "log"); - }, - }, - mouzhi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterCard: true, - filterTarget: function (card, player, target) { - if (target.storage.mouzhi2 && target.storage.mouzhi2.includes(player)) return false; - return target != player; - }, - delay: 0, - lose: false, - discard: false, - check: function (card) { - if (card.name == "du") return 20; - var player = _status.event.player; - var useval = player.getUseValue(card); - var maxval = 0; - game.countPlayer(function (current) { - if ( - current != player && - !current.hasSkillTag("nogain") && - get.attitude(player, current) > 0 - ) { - var temp = current.getUseValue(card); - if (temp > maxval) maxval = temp; - } - }); - if (maxval > 0 && get.tag(card, "damage")) return 15; - if (maxval > useval) return 10; - if (player.needsToDiscard()) return 1 / Math.max(0.1, get.value(card)); - return -1; - }, - content: function () { - player.give(cards, target); - target.addTempSkill("mouzhi2", { player: "phaseEnd" }); - target.storage.mouzhi2.add(player); - target.storage.mouzhi2.sortBySeat(target); - target.markSkill("mouzhi2"); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - if (ui.selected.cards.length) { - var card = ui.selected.cards[0]; - if (card.name == "du") return target.hasSkill("lucia_duqu") ? 1 : -1; - var t = target.getUseValue(card); - var p = player.getUseValue(card); - if (t > p) return 2; - if (t > 0) return 1.5; - if (player.needsToDiscard()) return 1; - return 0; - } - return 0; - }, - }, - }, - }, - mouzhi2: { - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - onremove: true, - trigger: { source: "damageSource" }, - forced: true, - intro: { - content: "出牌阶段内第一次对一名其他角色造成伤害时,$摸一张牌", - }, - filter: function (event, player) { - var evt2 = event.getParent("phaseUse"); - if (!evt2 || evt2.player != player) return false; - var history = event.player.getHistory("damage", function (evt) { - return evt.source == player && evt.getParent("phaseUse") == evt2; - }); - return history[0] == event; - }, - content: function () { - "step 0"; - game.asyncDraw(player.storage.mouzhi2); - "step 1"; - game.delay(); - }, - }, - yuanlve: { - enable: "phaseUse", - usable: 1, - audio: 2, - filter: function (event, player) { - return player.countCards("h", function (card) { - return get.type(card) != "equip"; - }); - }, - filterCard: function (card) { - return get.type(card) != "equip"; - }, - filterTarget: lib.filter.notMe, - delay: false, - discard: false, - lose: false, - check: function (card) { - if (card.name == "du") return 20; - var player = _status.event.player; - var useval = player.getUseValue(card); - var maxval = 0; - game.countPlayer(function (current) { - if ( - current != player && - !current.hasSkillTag("nogain") && - get.attitude(player, current) > 0 - ) { - var temp = current.getUseValue(card); - if (temp > maxval) maxval = temp; - } - }); - if (maxval > useval) return 15; - if (maxval > 0) return 10; - if (player.needsToDiscard()) return 1 / Math.max(0.1, get.value(card)); - return -1; - }, - content: function () { - "step 0"; - player.give(cards, target); - "step 1"; - target.chooseUseTarget(cards[0]); - "step 2"; - if (result.bool) player.draw(); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - if (ui.selected.cards.length) { - var card = ui.selected.cards[0]; - if (card.name == "du") return target.hasSkill("lucia_duqu") ? 1 : -1; - var t = target.getUseValue(card); - var p = player.getUseValue(card); - if (t > p) return 2; - if (t > 0) return 1.5; - if (player.needsToDiscard()) return 1; - return 0; - } - return 0; - }, - }, - }, - }, - //吕旷吕翔和淳于琼和官渡哔哔机 - spshicai: { - audio: 2, - enable: "phaseUse", - position: "he", - filter: function (event, player) { - return ( - !player.storage.spshicai2 || !player.getCards("h").includes(player.storage.spshicai2) - ); - }, - filterCard: true, - 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)); - }, - content: function () { - var card = get.cards()[0]; - player.storage.spshicai2 = card; - player.gain(card, "draw"); - game.log(player, "获得了牌堆顶的一张牌"); - }, - group: "spshicai_mark", - ai: { - order: 1, - result: { player: 1 }, - }, - }, - spshicai_mark: { - trigger: { player: "phaseUseBegin" }, - silent: true, - firstDo: true, - content: function () { - player.addTempSkill("spshicai2", "phaseUseEnd"); - }, - }, - spshicai2: { - onremove: true, - mark: true, - intro: { - mark: function (dialog, content, player) { - if (player != game.me) return get.translation(player) + "观看牌堆中..."; - if (get.itemtype(_status.pileTop) != "card") return "牌堆顶无牌"; - dialog.add([_status.pileTop]); - }, - }, - }, - spfushi: { - group: ["zezhu", "chenggong"], - derivation: ["zezhu", "chenggong"], - locked: true, - }, - zezhu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - var enemy = 0; - var friend = 0; - var zhu = 0; - for (var i of game.players) { - if (i.isEnemyOf(player)) enemy++; - else friend++; - if (i != player && i.isZhu) zhu++; - } - return zhu > 0 && enemy < friend; - }, - filterTarget: function (card, player, target) { - return target != player && target.isZhu; - }, - selectTarget: -1, - multiline: true, - multitarget: true, - content: function () { - "step 0"; - event.targets.sortBySeat(); - event.targets2 = event.targets.slice(0); - "step 1"; - var target = event.targets2.shift(); - if (target.countGainableCards(player, "he") > 0) - player.gainPlayerCard(target, "he", true); - else player.draw(); - if (event.targets2.length) event.redo(); - "step 2"; - if (player.countCards("he") >= targets.length) { - player - .chooseCard( - "he", - true, - "依次选择" + - get.cnNumber(targets.length) + - "张牌,分别交给" + - get.translation(targets), - targets.length - ) - .set("ai", function (card) { - var target = _status.event.getParent().targets[ui.selected.cards.length]; - var player = _status.event.player; - return get.attitude(player, target) * get.value(card, target); - }); - } else event.finish(); - "step 3"; - var list = []; - for (var i = 0; i < targets.length; i++) { - list.push([targets[i], result.cards[i]]); - } - game.loseAsync({ - gain_list: list, - giver: player, - player: player, - cards: result.cards, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - }, - ai: { - order: 6, - result: { player: 1 }, - }, - }, - chenggong: { - audio: 2, - trigger: { global: "useCardToPlayered" }, - filter: function (event, player) { - if ( - !( - event.isFirstTarget && - event.targets && - event.targets.length > 1 && - event.player.isIn() - ) - ) - return false; - var enemy = 0; - var friend = 0; - for (var i of game.players) { - if (i.isEnemyOf(player)) enemy++; - else friend++; - } - return enemy > friend; - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - logTarget: "player", - content: function () { - trigger.player.draw(); - }, - }, - cangchu: { - trigger: { - global: "phaseBefore", - player: ["damageEnd", "enterGame"], - }, - audio: 2, - forced: true, - filter: function (event, player) { - if (event.name != "damage") return event.name != "phase" || game.phaseNumber == 0; - return event.hasNature("fire") && player.countMark("cangchu") > 0; - }, - content: function () { - if (trigger.name != "damage") player.addMark("cangchu", 3); - else { - player.removeMark("cangchu", Math.min(trigger.num, player.countMark("cangchu"))); - if (!player.hasMark("cangchu")) event.trigger("cangchuAwaken"); - } - }, - marktext: "粮", - intro: { - name2: "粮", - content: "mark", - }, - ai: { - threaten: function (player, target) { - return 1 + target.countMark("cangchu") / 2; - }, - effect: { - target: function (card, player, target, current) { - if (target.hasMark("cangchu")) { - if (card.name == "sha") { - if ( - lib.skill.global.includes("huoshaowuchao") || - game.hasNature(card, "fire") || - player.hasSkill("zhuque_skill") - ) - return 2; - } - if (get.tag(card, "fireDamage") && current < 0) return 2; - } - }, - }, - combo: "liangying", - }, - }, - sushou: { - audio: 2, - trigger: { player: "phaseDiscardBegin" }, - frequent: true, - async content(event, trigger, player) { - await player.draw(1 + player.countMark("cangchu")); - const num = Math.min( - player.countCards("h"), - player.countCards("he"), - game.countPlayer((target) => target != player && target.isFriendOf(player)) - ); - if (num) { - let list = []; - if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); - while (num - list.length > 0) { - const { - result: { bool, targets, cards }, - } = await player - .chooseCardTarget({ - prompt: "宿守:你可以交给友方角色各一张牌", - position: "he", - animate: false, - filterCard(card, player) { - return !get.event("list").some((list) => list[1] == card); - }, - filterTarget(card, player, target) { - return ( - target != player && - target.isFriendOf(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"); - } - } - }, - }, - liangying: { - trigger: { - global: "phaseDrawBegin2", - player: "cangchuAwaken", - }, - forced: true, - audio: 1, - logTarget: function (event, player) { - if (event.name == "phaseDraw") return event.player; - return game.filterPlayer(function (current) { - return current.isEnemyOf(player); - }); - }, - filter: function (event, player) { - if (event.name == "cangchu") return true; - return player.hasMark("cangchu") && !event.numFixed && event.player.isFriendOf(player); - }, - content: function () { - "step 0"; - if (trigger.name == "cangchu") { - player.loseMaxHp(); - var list = game.filterPlayer(function (current) { - return current.isEnemyOf(player); - }); - if (list.length) { - game.asyncDraw(list, 2); - } - } else { - trigger.num++; - event.finish(); - } - "step 1"; - game.delay(); - }, - ai: { - combo: "cangchu", - }, - }, - liehou: { - enable: "phaseUse", - usable: 1, - audio: 2, - filterTarget: function (card, player, target) { - return player.inRange(target) && target.countCards("h"); - }, - content: function () { - "step 0"; - target.chooseCard("h", true, "交给" + get.translation(player) + "一张牌"); - "step 1"; - if (result.bool) { - target.give(result.cards, player); - } else event.finish(); - "step 2"; - if ( - player.countCards("h") && - game.hasPlayer(function (current) { - return current != target && player.inRange(current); - }) - ) { - player.chooseCardTarget({ - position: "h", - filterCard: true, - filterTarget: function (card, player, target) { - return target != _status.event.getParent().target && player.inRange(target); - }, - forced: true, - prompt: "将一张手牌交给一名攻击范围内的其他角色", - ai1: function (card) { - var player = _status.event.player; - if (get.name(card) == "du") return 20; - if ( - game.hasPlayer(function (current) { - return ( - current != _status.event.getParent().target && - player.inRange(current) && - get.attitude(player, current) > 0 && - current.getUseValue(card) > player.getUseValue(card) && - current.getUseValue(card) > player.getUseValue(card) - ); - }) - ) - return 12; - if ( - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0; - }) - ) { - if (card.name == "wuxie") return 11; - if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; - } - return 6 / Math.max(1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player; - var card = ui.selected.cards[0]; - var att = get.attitude(player, target); - if (card.name == "du") return -6 * att; - if (att > 0) { - if ( - get.position(card) == "h" && - target.getUseValue(card) > player.getUseValue(card) - ) - return 4 * att; - if (get.value(card, target) > get.value(card, player)) return 2 * att; - return 1.2 * att; - } - return (-att * Math.min(4, target.countCards("he"))) / 6; - }, - }); - } else event.finish(); - "step 3"; - if (result.bool) player.give(result.cards, result.targets[0]); - }, - ai: { - order: 6, - result: { - target: -1, - }, - }, - }, - qigong: { - trigger: { player: "shaMiss" }, - direct: true, - audio: 2, - filter: function (event, player) { - return ( - event.target.isIn() && - game.hasPlayer(function (current) { - return current != event.target && current.canUse("sha", event.target, false); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("qigong"), - "令一名角色可再对" + get.translation(trigger.target) + "使用一张【杀】", - function (card, player, target) { - var source = _status.event.getTrigger().target; - return target != source && target.canUse("sha", source, false); - } - ) - .set("ai", function (target) { - var player = _status.event.player, - card = { name: "sha" }, - source = _status.event.getTrigger().target; - if (target.hasSha()) { - var eff1 = get.effect(source, card, target, target); - if (eff1 > 0) return get.effect(source, card, target, player); - } - return target != player ? Math.random() * get.attitude(player, target) : 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("qigong", target); - target.addTempSkill("qigong_ai", "chooseToUseEnd"); - target - .chooseToUse( - "是否再对" + get.translation(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) - .set("oncard", function () { - _status.event.directHit.addArray(game.players); - }); - } - }, - subSkill: { - ai: { - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return arg.card && arg.card.name == "sha"; - }, - }, - }, - }, - }, - //和沙摩柯一起上线的新服三将 - spjiedao: { - audio: 2, - trigger: { - source: "damageBegin1", - }, - filter: function (event, player) { - return player.isDamaged() && !player.getHistory("sourceDamage").length; - }, - logTarget: "player", - direct: true, - check: function (trigger, player) { - if (get.attitude(player, trigger.player) >= -1) return false; - return !trigger.player.hasSkillTag("filterDamage", null, { - player: player, - card: trigger.card, - }); - }, - content: function () { - "step 0"; - var num = player.getDamagedHp(); - var map = {}; - var list = []; - for (var i = 1; i <= num; i++) { - var cn = get.cnNumber(i, true); - map[cn] = i; - list.push(cn); - } - event.map = map; - player - .chooseControl(list, "cancel2", function () { - if (!lib.skill.spjiedao.check(_status.event.getTrigger(), player)) - return "cancel2"; - return get.cnNumber(_status.event.goon, true); - }) - .set("prompt", get.prompt2("spjiedao", trigger.player)) - .set("goon", num); - "step 1"; - if (result.control == "cancel2") return; - player.logSkill("spjiedao", trigger.player); - var num = event.map[result.control] || 1; - trigger.num += num; - var next = game.createEvent("spjiedao_after", null, trigger.getParent()); - next.player = player; - next.target = trigger.player; - next.num = num; - next.setContent(function () { - if (target.isIn()) player.chooseToDiscard(num, true, "he"); - }); - }, - }, - biaozhao: { - audio: 2, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - trigger: { - player: "phaseJieshuBegin", - }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0 && !player.getExpansions("biaozhao").length; - }, - content: function () { - "step 0"; - player.chooseCard("he", get.prompt("biaozhao"), "将一张牌置于武将牌上作为“表”").ai = - function (card) { - return 6 - get.value(card); - }; - "step 1"; - if (result.bool) { - player.logSkill("biaozhao"); - player.addToExpansion(result.cards, player, "give").gaintag.add("biaozhao"); - } - }, - ai: { - notemp: true, - }, - group: ["biaozhao2", "biaozhao3"], - }, - biaozhao2: { - trigger: { - global: ["loseAsyncAfter", "loseAfter", "cardsDiscardAfter"], - }, - forced: true, - audio: "biaozhao", - filter: function (event, player) { - if (event.name == "loseAsyncAfter" && event.type != "discard") return false; - if (event.name == "lose" && (event.getlx === false || event.position != ui.discardPile)) - return false; - var cards = player.getExpansions("biaozhao"); - if (!cards.length) return false; - var suit = get.suit(cards[0]); - var num = get.number(cards[0]); - var cards = event.getd(); - for (var card of cards) { - if (get.suit(card) == suit && get.number(card) == num) return true; - } - return false; - }, - content: function () { - "step 0"; - var card = player.getExpansions("biaozhao")[0]; - if (trigger.getParent().name == "discard") { - trigger.player.gain(card, player, "give", "bySelf"); - } else { - player.loseToDiscardpile(card); - } - "step 1"; - player.loseHp(); - }, - }, - biaozhao3: { - trigger: { - player: "phaseZhunbeiBegin", - }, - forced: true, - charlotte: true, - audio: "biaozhao", - filter: function (event, player) { - return player.getExpansions("biaozhao").length > 0; - }, - content: function () { - "step 0"; - var card = player.getExpansions("biaozhao")[0]; - player.loseToDiscardpile(card); - "step 1"; - event.num = 0; - game.countPlayer(function (current) { - if (current.countCards("h") > event.num) event.num = current.countCards("h"); - }); - player.chooseTarget("是否令一名角色将手牌摸至" + event.num + "张并回复1点体力?").ai = - function (target) { - var num = Math.min(event.num - target.countCards("h"), 5); - if (target.isDamaged()) num++; - return num * get.attitude(_status.event.player, target); - }; - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - var draw = Math.min(num - target.countCards("h"), 5); - if (draw) target.draw(draw); - target.recover(); - } - }, - }, - yechou: { - audio: 2, - trigger: { - player: "die", - }, - direct: true, - forceDie: true, - skillAnimation: true, - animationColor: "wood", - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("yechou"), function (card, player, target) { - return player != target && target.getDamagedHp() > 1; - }) - .set("forceDie", true) - .set("ai", function (target) { - let att = get.attitude(_status.event.player, target); - if (att > 0) return 0; - att = Math.sqrt(0.01 - att); - return ( - att * - (get.distance(_status.currentPhase, target, "absolute") || - game.players.length) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("yechou", target); - player.line(target, "green"); - target.addTempSkill("yechou2", { player: "phaseZhunbeiBegin" }); - } - }, - ai: { - expose: 0.5, - maixie_defend: true, - }, - }, - yechou2: { - mark: true, - marktext: "仇", - intro: { - content: "每个回合结束时失去1点体力直到回合开始", - }, - trigger: { - global: "phaseAfter", - }, - forced: true, - content: function () { - player.loseHp(); - }, - }, - yanjiao: { - audio: 2, - ai: { - order: 10, - result: { - player: 1, - target: 1.1, - }, - }, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player; - }, - content: function () { - "step 0"; - var num = 4; - if (player.storage.xingshen) { - num += player.storage.xingshen; - player.storage.xingshen = 0; - player.unmarkSkill("xingshen"); - } - if (player.storage.olxingshen) { - num += player.storage.olxingshen; - player.storage.olxingshen = 0; - player.unmarkSkill("olxingshen"); - } - num = Math.min(10, num); - event.cards = get.cards(num); - game.cardsGotoOrdering(event.cards); - player.showCards(event.cards); - "step 1"; - event.getedResult = lib.skill.yanjiao.getResult(cards); - if (!event.getedResult.length) { - player.addTempSkill("yanjiao2"); - event.finish(); - } - "step 2"; - target - .chooseControl("自动分配", "手动分配") - .set("prompt", "【严教】:是否让系统自动分配方案?").ai = function () { - return 0; - }; - "step 3"; - if (result.control == "手动分配") { - event.goto(8); - } - "step 4"; - event.index = 0; - event.togain = event.getedResult[event.index]; - target.showCards(event.togain[0], get.translation(target) + "分出的第一份牌"); - "step 5"; - target.showCards(event.togain[1], get.translation(target) + "分出的第二份牌"); - "step 6"; - target - .chooseControl() - .set("choiceList", [ - "获得" + get.translation(event.togain[0]), - "获得" + get.translation(event.togain[1]), - ]).ai = function () { - return Math.random() < 0.5 ? 1 : 0; - }; - "step 7"; - var list = [ - [target, event.togain[result.index]], - [player, event.togain[1 - result.index]], - ]; - game.loseAsync({ - gain_list: list, - giver: target, - animate: "gain2", - }).setContent("gaincardMultiple"); - if (event.togain[2].length > 1) player.addTempSkill("yanjiao2"); - event.finish(); - "step 8"; - var next = target.chooseToMove("严教:分出点数相等的两组牌"); - next.set("chooseTime", (cards.length * 4).toString()); - next.set("list", [ - [ - "未分配", - cards, - function (list) { - var num = 0; - for (var i of list) num += i.number; - return "未分配(点数和" + num + ")"; - }, - ], - [ - "第一组", - [], - function (list) { - var num = 0; - for (var i of list) num += i.number; - return "第一组(点数和" + num + ")"; - }, - ], - [ - "第二组", - [], - function (list) { - var num = 0; - for (var i of list) num += i.number; - return "第二组(点数和" + num + ")"; - }, - ], - ]); - next.set("filterOk", function (moved) { - var num1 = 0; - for (var i of moved[1]) num1 += i.number; - if (num1 == 0) return false; - var num2 = 0; - for (var i of moved[2]) num2 += i.number; - return num1 == num2; - }); - next.set("processAI", () => false); - "step 9"; - if (result.bool) { - var moved = result.moved; - event.getedResult = [[moved[1], moved[2], moved[0]]]; - event.goto(4); - } else { - player.addTempSkill("yanjiao2"); - } - }, - getResult: function (cards) { - var cl = cards.length; - var maxmium = Math.pow(3, cl); - var filter = function (list) { - if (!list[1].length || !list[0].length) return false; - var num1 = 0; - for (var i = 0; i < list[1].length; i++) { - num1 += list[1][i].number; - } - var num2 = 0; - for (var j = 0; j < list[0].length; j++) { - num2 += list[0][j].number; - } - return num1 == num2; - }; - var results = []; - for (var i = 0; i < maxmium; i++) { - var result = [[], [], []]; - for (var j = 0; j < cl; j++) { - result[Math.floor((i % Math.pow(3, j + 1)) / Math.pow(3, j))].push(cards[j]); - } - if (filter(result)) results.push(result); - } - var filterSame = function (list1, list2) { - if (list1[1].length == list2[0].length && list1[0].length == list2[1].length) { - for (var i = 0; i < list1[0].length; i++) { - if (!list2[1].includes(list1[0][i])) return false; - } - for (var i = 0; i < list1[1].length; i++) { - if (!list2[0].includes(list1[1][i])) return false; - } - return true; - } - return false; - }; - for (var i = 0; i < results.length; i++) { - for (var j = i + 1; j < results.length; j++) { - if (filterSame(results[i], results[j])) results.splice(j--, 1); - } - } - results.sort(function (a, b) { - return a[2].length - b[2].length; - }); - return results.slice(0, 50); - }, - }, - yanjiao2: { - marktext: "教", - mark: true, - intro: { - content: "本回合手牌上限-1", - }, - mod: { - maxHandcard: function (player, num) { - return num - 1; - }, - }, - }, - xingshen: { - audio: 2, - intro: { - content: "下一次发动【严教】时多展示#张牌", - }, - trigger: { - player: "damageEnd", - }, - frequent: true, - content: function () { - player.draw(player.isMinHandcard() ? 2 : 1); - if (!player.storage.xingshen) player.storage.xingshen = 0; - player.storage.xingshen += player.isMinHp() ? 2 : 1; - if (player.storage.xingshen > 4) player.storage.xingshen = 4; - player.markSkill("xingshen"); - }, - }, - pingjian: { - initList: function () { - var list = []; - if (_status.connectMode) list = get.charactersOL(); - else { - var list = []; - for (var i in lib.character) { - if (!lib.filter.characterDisabled2(i) && !lib.filter.characterDisabled(i)) - list.push(i); - } - } - game.countPlayer2(function (current) { - list.remove(current.name); - list.remove(current.name1); - list.remove(current.name2); - }); - _status.characterlist = list; - }, - init: function (player) { - player.addSkill("pingjian_check"); - if (!player.storage.pingjian_check) player.storage.pingjian_check = {}; - }, - audio: 2, - trigger: { player: ["damageEnd", "phaseJieshuBegin"] }, - frequent: true, - content: function () { - "step 0"; - if (!_status.characterlist) { - lib.skill.pingjian.initList(); - } - var allList = _status.characterlist.slice(0); - game.countPlayer(function (current) { - if ( - current.name && - lib.character[current.name] && - current.name.indexOf("gz_shibing") != 0 && - current.name.indexOf("gz_jun_") != 0 - ) - allList.add(current.name); - if ( - current.name1 && - lib.character[current.name1] && - current.name1.indexOf("gz_shibing") != 0 && - current.name1.indexOf("gz_jun_") != 0 - ) - allList.add(current.name1); - if ( - current.name2 && - lib.character[current.name2] && - current.name2.indexOf("gz_shibing") != 0 && - current.name2.indexOf("gz_jun_") != 0 - ) - allList.add(current.name2); - }); - var list = []; - var skills = []; - var map = []; - allList.randomSort(); - var name2 = event.triggername; - for (var i = 0; i < allList.length; i++) { - var name = allList[i]; - if (name.indexOf("zuoci") != -1 || name.indexOf("xushao") != -1) continue; - var skills2 = lib.character[name][3]; - for (var j = 0; j < skills2.length; j++) { - if (player.getStorage("pingjian").includes(skills2[j])) continue; - if (skills.includes(skills2[j])) { - list.add(name); - if (!map[name]) map[name] = []; - map[name].push(skills2[j]); - skills.add(skills2[j]); - continue; - } - var list2 = [skills2[j]]; - game.expandSkills(list2); - for (var k = 0; k < list2.length; k++) { - var info = lib.skill[list2[k]]; - if (get.is.zhuanhuanji(list2[k], player)) continue; - if ( - !info || - !info.trigger || - !info.trigger.player || - info.silent || - info.limited || - info.juexingji || - info.hiddenSkill || - info.dutySkill || - (info.zhuSkill && !player.isZhu2()) - ) - continue; - if ( - info.trigger.player == name2 || - (Array.isArray(info.trigger.player) && - info.trigger.player.includes(name2)) - ) { - if (info.ai && (info.ai.combo || info.ai.notemp || info.ai.neg)) continue; - if (info.init) continue; - if (info.filter) { - try { - var bool = info.filter(trigger, player, name2); - if (!bool) continue; - } catch (e) { - continue; - } - } - list.add(name); - if (!map[name]) map[name] = []; - map[name].push(skills2[j]); - skills.add(skills2[j]); - break; - } - } - } - if (list.length > 2) break; - } - if (skills.length) { - event.list = list; - player - .chooseControl(skills) - .set("dialog", ["评鉴:请选择尝试发动的技能", [list, "character"]]); - } else event.finish(); - "step 1"; - player.markAuto("pingjian", [result.control]); - player.addTempSkill(result.control); - player.storage.pingjian_check[result.control] = - trigger.name == "damage" ? trigger : "phaseJieshu"; - var name = event.list.find((name) => lib.character[name][3].includes(result.control)); - // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); - if (name) game.broadcastAll((player, name) => player.tempname.add(name), player, name); - }, - group: "pingjian_use", - phaseUse_special: [], - ai: { threaten: 5 }, - }, - pingjian_use: { - audio: "pingjian", - enable: "phaseUse", - usable: 1, - prompt: () => lib.translate.pingjian_info, - content: function () { - "step 0"; - var list = []; - var skills = []; - var map = []; - var evt = event.getParent(2); - if (!_status.characterlist) { - lib.skill.pingjian.initList(); - } - var allList = _status.characterlist.slice(0); - game.countPlayer(function (current) { - if ( - current.name && - lib.character[current.name] && - current.name.indexOf("gz_shibing") != 0 && - current.name.indexOf("gz_jun_") != 0 - ) - allList.add(current.name); - if ( - current.name1 && - lib.character[current.name1] && - current.name1.indexOf("gz_shibing") != 0 && - current.name1.indexOf("gz_jun_") != 0 - ) - allList.add(current.name1); - if ( - current.name2 && - lib.character[current.name2] && - current.name2.indexOf("gz_shibing") != 0 && - current.name2.indexOf("gz_jun_") != 0 - ) - allList.add(current.name2); - }); - allList.randomSort(); - for (var i = 0; i < allList.length; i++) { - var name = allList[i]; - if (name.indexOf("zuoci") != -1 || name.indexOf("xushao") != -1) continue; - var skills2 = lib.character[name][3]; - for (var j = 0; j < skills2.length; j++) { - if (player.getStorage("pingjian").includes(skills2[j])) continue; - if (get.is.locked(skills2[j], player)) continue; - var info = lib.translate[skills2[j] + "_info"]; - if ( - skills.includes(skills2[j]) || - (info && - info.indexOf("当你于出牌阶段") != -1 && - info.indexOf("当你于出牌阶段外") == -1) - ) { - list.add(name); - if (!map[name]) map[name] = []; - map[name].push(skills2[j]); - skills.add(skills2[j]); - continue; - } - var list2 = [skills2[j]]; - game.expandSkills(list2); - for (var k = 0; k < list2.length; k++) { - var info = lib.skill[list2[k]]; - if (get.is.zhuanhuanji(list2[k], player)) continue; - if ( - !info || - !info.enable || - info.charlotte || - info.limited || - info.juexingji || - info.hiddenSkill || - info.dutySkill || - (info.zhuSkill && !player.isZhu2()) - ) - continue; - if ( - info.enable == "phaseUse" || - (Array.isArray(info.enable) && info.enable.includes("phaseUse")) || - info.enable == "chooseToUse" || - (Array.isArray(info.enable) && info.enable.includes("chooseToUse")) - ) { - if (info.ai && (info.ai.combo || info.ai.notemp || info.ai.neg)) continue; - if (info.init || info.onChooseToUse) continue; - if (info.filter) { - try { - var bool = info.filter(evt, player); - if (!bool) continue; - } catch (e) { - continue; - } - } else if (info.viewAs && typeof info.viewAs != "function") { - try { - if (evt.filterCard && !evt.filterCard(info.viewAs, player, evt)) - continue; - if (info.viewAsFilter && info.viewAsFilter(player) == false) - continue; - } catch (e) { - continue; - } - } - list.add(name); - if (!map[name]) map[name] = []; - map[name].push(skills2[j]); - skills.add(skills2[j]); - break; - } - } - } - if (list.length > 2) break; - } - if (skills.length) { - event.list = list; - player - .chooseControl(skills) - .set("dialog", ["评鉴:请选择尝试发动的技能", [list, "character"]]); - } else event.finish(); - "step 1"; - player.markAuto("pingjian", [result.control]); - player.addTempSkill(result.control); - player.storage.pingjian_check[result.control] = "phaseUse"; - var name = event.list.find((name) => lib.character[name][3].includes(result.control)); - // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); - if (name) game.broadcastAll((player, name) => player.tempname.add(name), player, name); - }, - ai: { order: 12, result: { player: 1 } }, - }, - pingjian_check: { - charlotte: true, - trigger: { player: ["useSkill", "logSkillBegin"] }, - filter: function (event, player) { - var info = get.info(event.skill); - if (info && info.charlotte) return false; - var skill = event.sourceSkill || event.skill; - return player.storage.pingjian_check[skill]; - }, - direct: true, - firstDo: true, - priority: Infinity, - content: function () { - var skill = trigger.sourceSkill || trigger.skill; - player.removeSkill(skill); - const names = - player.tempname && player.tempname.filter((i) => lib.character[i][3].includes(skill)); - if (names) - game.broadcastAll( - (player, names) => player.tempname.removeArray(names), - player, - names - ); - delete player.storage.pingjian_check[skill]; - }, - group: "pingjian_check2", - }, - pingjian_check2: { - charlotte: true, - trigger: { player: ["phaseUseEnd", "damageEnd", "phaseJieshuBegin"] }, - filter: function (event, player) { - return Object.keys(player.storage.pingjian_check).find(function (skill) { - if (event.name != "damage") return player.storage.pingjian_check[skill] == event.name; - return player.storage.pingjian_check[skill] == event; - }); - }, - direct: true, - lastDo: true, - priority: -Infinity, - content: function () { - var skills = Object.keys(player.storage.pingjian_check).filter(function (skill) { - if (trigger.name != "damage") - return player.storage.pingjian_check[skill] == trigger.name; - return player.storage.pingjian_check[skill] == trigger; - }); - player.removeSkill(skills); - const names = - player.tempname && - player.tempname.filter((i) => - skills.some((skill) => lib.character[i][3].includes(skill)) - ); - if (names) - game.broadcastAll( - (player, names) => player.tempname.removeArray(names), - player, - names - ); - for (var skill of skills) delete player.storage.pingjian_check[skill]; - }, - }, - //上兵伐谋 - //伊籍在标包 不会移动 - songshu: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return ( - !player.hasSkill("songshu_reflectionblue", null, null, false) && - player.countCards("h") > 0 - ); - }, - filterTarget: function (card, player, target) { - return target != player && player.canCompare(target); - }, - content: function () { - "step 0"; - player.chooseToCompare(target).set("small", get.attitude(player, target) > 0); - "step 1"; - if (!result.bool) { - player.draw(2, "nodelay"); - target.draw(2); - player.addTempSkill("songshu_reflectionblue", "phaseUseAfter"); - } else { - target.addTempSkill("songshu_ai"); - } - }, - ai: { - basic: { - order: 1, - }, - expose: 0.2, - result: { - target: function (player, target) { - if (target.hasSkill("songshu_ai", null, null, false)) return 0; - var maxnum = 0; - var cards2 = target.getCards("h"); - for (var i = 0; i < cards2.length; i++) { - if (get.number(cards2[i]) > maxnum) { - maxnum = get.number(cards2[i]); - } - } - if (maxnum > 10) maxnum = 10; - if (maxnum < 5 && cards2.length > 1) maxnum = 5; - var cards = player.getCards("h"); - for (var i = 0; i < cards.length; i++) { - if (get.number(cards[i]) < maxnum) return 1; - } - return 0; - }, - }, - }, - }, - songshu_ai: { charlotte: true }, - songshu_reflectionblue: { charlotte: true }, - sibian: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - "step 0"; - trigger.changeToZero(); - event.cards = get.cards(4); - game.cardsGotoOrdering(event.cards); - player.showCards(event.cards); - "step 1"; - cards.sort(function (a, b) { - return b.number - a.number; - }); - var gains = []; - var mx = [cards[0].number, cards[3].number]; - for (var i = 0; i < cards.length; i++) { - if (mx.includes(cards[i].number)) gains.addArray(cards.splice(i--, 1)); - } - player.gain(gains, "gain2"); - if (cards.length > 0) - player - .chooseTarget( - "是否令一名手牌数最少的角色获得" + get.translation(cards), - function (card, player, target) { - return target.isMinHandcard(); - } - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - player.addExpose(0.2); - target.gain(cards, "gain2"); - } - }, - }, - lslixun: { - audio: 2, - forced: true, - trigger: { player: "damageBegin4" }, - marktext: "珠", - intro: { - name2: "珠", - content: "共有#个“珠”", - }, - content: function () { - trigger.cancel(); - player.addMark("lslixun", trigger.num); - }, - group: "lslixun_fate", - }, - lslixun_fate: { - audio: "lslixun", - trigger: { player: "phaseUseBegin" }, - forced: true, - filter: function (event, player) { - return player.countMark("lslixun") > 0; - }, - content: function () { - "step 0"; - event.forceDie = true; - _status.lslixun = player.countMark("lslixun"); - player.judge(function (card) { - if (get.number(card) < _status.lslixun) return -_status.lslixun; - return 1; - }).judge2 = function (result) { - return result.bool ? true : false; - }; - "step 1"; - delete _status.lslixun; - if (!result.bool) { - player.chooseToDiscard([1, player.countMark("lslixun")], "h").ai = - lib.skill.qiangxi.check; - } else event.finish(); - "step 2"; - var num = player.countMark("lslixun"); - if (result.cards && result.cards.length) num -= result.cards.length; - if (num) player.loseHp(num); - }, - }, - lskuizhu: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - direct: true, - filter: function (event, player) { - return player.isMaxHp(true) == false; - }, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("lskuizhu"), function (card, player, target) { - return target != player && target.isMaxHp(); - }).ai = function (target) { - var player = _status.event.player; - var ts = Math.min(5, target.countCards("h")); - var delta = ts - player.countCards("h"); - if (delta <= 0) return 0; - if (get.attitude(player, target) < 1) return false; - return target.countCards("he", function (card) { - return lib.skill.zhiheng.check(card) > 0; - }) > 1 - ? delta - : 0; - }; - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("lskuizhu", target); - player.drawTo(Math.min(5, target.countCards("h"))); - } else event.finish(); - "step 2"; - if (!player.countCards("h")) { - event.finish(); - return; - } - target.viewHandcards(player); - "step 3"; - if (!target.countCards("h")) { - event.finish(); - return; - } - target.chooseToDiscard( - true, - "h", - [1, player.countCards("h")], - "弃置至多" + - get.cnNumber(player.countCards("h")) + - "张手牌,并获得" + - get.translation(player) + - "等量的手牌" - ).ai = function (card) { - if (ui.selected.cards.length > 1) return -1; - return lib.skill.zhiheng.check.apply(this, arguments); - }; - "step 4"; - if ( - result.bool && - result.cards && - result.cards.length && - player.countGainableCards(target, "h") > 0 - ) { - target.gainPlayerCard(player, "h", true, result.cards.length).visible = true; - } - "step 5"; - if (result.bool && result.cards && result.cards.length > 1) { - var bool = player.storage.lslixun > 0 !== true; - player - .chooseTarget( - bool, - "令" + - get.translation(target) + - "对其攻击范围内的一名角色造成1点伤害" + - (bool ? "" : ",或点「取消」移去一个“珠”"), - function (card, player, target) { - var source = _status.event.source; - return target != source && source.inRange(target); - } - ) - .set("source", target) - .set("ai", function (target) { - return get.damageEffect(target, _status.event.source, _status.event.player); - }); - } else event.finish(); - "step 6"; - if (result.bool && result.targets && result.targets.length) { - player.line(result.targets[0]); - result.targets[0].damage(target); - } else { - player.removeMark("lslixun", 1); - } - }, - ai: { - expose: 0.25, - }, - }, - xpchijie: { - audio: 2, - trigger: { - target: "useCardToAfter", - }, - filter: function (event, player) { - var evt = event.getParent(); - var targets = evt.targets.slice(evt.num + 1); - return event.player != player && targets.length > 0; - }, - usable: 1, - prompt2: function (event, player) { - var evt = event.getParent(); - var targets = evt.targets.slice(evt.num + 1); - return "令" + get.translation(event.card) + "对" + get.translation(targets) + "无效"; - }, - check: function (event, player) { - var evt = event.getParent(); - var targets = evt.targets.slice(evt.num + 1); - var num = 0; - for (var i = 0; i < targets.length; i++) { - num += get.effect(targets[i], evt.card, evt.player, player); - } - return num < -1; - }, - content: function () { - var evt = trigger.getParent(); - evt.excluded.addArray(evt.targets); - }, - group: "xpchijie2", - }, - xpchijie2: { - trigger: { global: "useCardAfter" }, - audio: "xpchijie", - filter: function (event, player) { - return ( - event.player != player && - event.targets.includes(player) && - event.cards.filterInD().length > 0 && - !game.hasPlayer2(function (current) { - return ( - current.getHistory("damage", function (evt) { - return evt.card == event.card; - }).length > 0 - ); - }) - ); - }, - usable: 1, - check: function (event, player) { - return get.value(event.cards.filterInD(), player, "raw") > 0; - }, - prompt2: function (event, player) { - return "获得" + get.translation(event.cards.filterInD()) + "。"; - }, - content: function () { - player.gain(trigger.cards.filterInD(), "log", "gain2"); - }, - }, - xpchijie4: {}, - yinju: { - audio: 2, - enable: "phaseUse", - limited: true, - filterTarget: lib.filter.notMe, - skillAnimation: true, - animationColor: "water", - content: function () { - player.awakenSkill("yinju"); - player.storage.yinju2 = target; - player.addTempSkill("yinju2"); - }, - ai: { - result: { - order: 10, - player: function (player, target) { - if ( - player.countCards("hs", function (card) { - return get.tag(card, "damage") && player.canUse(card, target); - }) >= 1 && - target.hp <= 2 - ) - return 0.1; - if ( - player.countCards("hes", function (card) { - return player.canUse(card, target); - }) <= 2 - ) - return -100; - return 1; - }, - target: function (player, target) { - return target.isDamaged() ? 5 : 3; - }, - }, - }, - }, - yinju2: { - trigger: { - player: "useCardToPlayered", - source: "damageBefore", - }, - forced: true, - onremove: true, - filter: function (event, player, name) { - if (name == "useCardToPlayered") return event.target == player.storage.yinju2; - return event.player == player.storage.yinju2; - }, - logTarget: function (event) { - return event[event.name == "damage" ? "player" : "target"]; - }, - content: function () { - "step 0"; - if (trigger.name == "damage") { - trigger.cancel(); - trigger.player.recover(trigger.num); - event.finish(); - } else { - game.asyncDraw([player, trigger.target]); - } - "step 1"; - game.delayx(); - }, - ai: { - effect: { - player: function (card, player, target) { - if (target != player.storage.yinju2) return; - if (card.name == "lebu") return; - if (card.name !== "huogong" && get.tag(card, "damage") && target.isDamaged()) - [1, 0.6, 0, 2.4]; - return [1, 0.6, 1, 0.6]; - }, - }, - }, - }, - rewenji: { - audio: "spwenji", - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("he"); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("rewenji"), function (card, player, target) { - return target != player && target.countCards("he") > 0; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 0) return Math.sqrt(att) / 10; - return 5 - att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("rewenji", target); - target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.addTempSkill("rewenji_respond"); - player.storage.rewenji_respond = get.type2(result.cards[0], target); - event.target.give(result.cards, player, true); - } - }, - subSkill: { - respond: { - onremove: true, - trigger: { player: "useCard" }, - forced: true, - charlotte: true, - audio: "spwenji", - filter: function (event, player) { - return get.type2(event.card) == player.storage.rewenji_respond; - }, - content: function () { - trigger.directHit.addArray( - game.filterPlayer(function (current) { - return current != player; - }) - ); - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return get.type2(arg.card) == player.storage.rewenji_respond; - }, - }, - }, - }, - }, - spwenji: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("he"); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("spwenji"), function (card, player, target) { - return target != player && target.countCards("he") > 0; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 0) return Math.sqrt(att) / 10; - return 5 - att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("spwenji", target); - target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.addTempSkill("spwenji_respond"); - player.storage.spwenji_respond = result.cards[0].name; - event.target.give(result.cards, player, true); - } - }, - subSkill: { - respond: { - onremove: true, - trigger: { player: "useCard" }, - forced: true, - charlotte: true, - audio: "spwenji", - filter: function (event, player) { - return event.card.name == player.storage.spwenji_respond; - }, - content: function () { - trigger.directHit.addArray( - game.filterPlayer(function (current) { - return current != player; - }) - ); - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return arg.card.name == player.storage.spwenji_respond; - }, - }, - }, - }, - }, - sptunjiang: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - filter: function (event, player) { - //if(player.getHistory('skipped').includes('phaseUse')) return false; - return ( - player.getHistory("useCard", function (evt) { - if (evt.targets && evt.targets.length && evt.isPhaseUsing()) { - var targets = evt.targets.slice(0); - while (targets.includes(player)) targets.remove(player); - return targets.length > 0; - } - return false; - }).length == 0 - ); - }, - content: function () { - player.draw(game.countGroup()); - }, - }, - bingzhao: { - audio: 2, - unique: true, - zhuSkill: true, - forced: true, - locked: false, - intro: { - content: function (group) { - return "已选择了" + get.translation(group) + "势力"; - }, - }, - trigger: { global: ["phaseBefore", "zhuUpdate"] }, - filter: function (event, player) { - if ( - !lib.group.some(function (group) { - if (group == player.group) return false; - return ( - lib.group.includes(group) || - game.hasPlayer(function (current) { - return current.group == group; - }) - ); - }) - ) - return false; - return ( - !player.storage.bingzhao && - player.hasZhuSkill("bingzhao") && - (event.name != "phase" || game.phaseNumber == 0) - ); - }, - content: function () { - "step 0"; - var list = lib.group.filter(function (group) { - if (group == player.group) return false; - return ( - lib.group.includes(group) || - game.hasPlayer(function (current) { - return current.group == group; - }) - ); - }); - player - .chooseControl(list) - .set("prompt", "秉诏:请选择一个其他势力") - .set("ai", function () { - var listx = list.slice(0); - listx.sort(function (a, b) { - return ( - game.countPlayer(function (current) { - return current != player && current.group == b; - }) - - game.countPlayer(function (current) { - return current != player && current.group == a; - }) - ); - }); - return listx[0]; - }); - "step 1"; - var group = result.control; - player.popup(get.translation(group) + "势力", get.groupnature(group, "raw")); - game.log(player, "选择了", "#y" + get.translation(group) + "势力"); - player.storage.bingzhao = group; - player.markSkill("bingzhao"); - }, - ai: { - combo: "guju" - }, - }, - baijia: { - audio: 2, - audioname: ["tw_beimihu"], - unique: true, - derivation: "bmcanshi", - juexingji: true, - ai: { - combo: "guju", - }, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return player.hasSkill("guju") && player.storage.guju >= 7; - }, - content: function () { - player.awakenSkill("baijia"); - player.gainMaxHp(); - player.recover(); - var list = game.filterPlayer(); - for (var i = 0; i < list.length; i++) { - if (list[i] != player && !list[i].hasMark("zongkui_mark")) { - list[i].addMark("zongkui_mark", 1); - player.line(list[i], "green"); - } - } - //player.removeSkill('guju'); - player.changeSkills(["bmcanshi"], ["guju"]); - }, - }, - bmcanshi: { - audio: 2, - audioname: ["tw_beimihu"], - group: ["bmcanshi_add", "bmcanshi_remove"], - ai: { - combo: "zongkui", - }, - subSkill: { - add: { - audio: "bmcanshi", - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (!event.targets || event.targets.length != 1) return false; - var info = get.info(event.card); - if (info.multitarget) return false; - if (info.allowMultiple == false) return false; - if (info.type == "equip") return false; - if (info.type == "delay") return false; - return game.hasPlayer(function (current) { - if (!current.hasMark("zongkui_mark")) return false; - return ( - !event.targets.includes(current) && - lib.filter.targetEnabled2(event.card, player, current) - ); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt2("bmcanshi"), - [1, Infinity], - function (card, player, target) { - if (!target.hasMark("zongkui_mark")) return false; - var trigger = _status.event.getTrigger(); - return ( - !trigger.targets.includes(target) && - lib.filter.targetEnabled2(trigger.card, player, target) - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect( - target, - _status.event.getTrigger().card, - player, - player - ); - }); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets.sortBySeat(); - } else { - event.finish(); - } - "step 2"; - player.logSkill("bmcanshi", event.targets); - for (var i = 0; i < event.targets.length; i++) { - event.targets[i].removeMark("zongkui_mark", 1); - } - trigger.targets.addArray(event.targets); - }, - }, - remove: { - audio: "bmcanshi", - trigger: { - target: "useCardToTarget", - }, - check: function (event, player) { - return ( - get.attitude(event.player, player) < 0 && - get.effect(player, event.card, event.player, player) < 0 - ); - }, - logTarget: "player", - filter: function (event, player) { - if (!["basic", "trick"].includes(get.type(event.card))) return false; - if (!event.targets || event.targets.length != 1) return false; - return event.player.hasMark("zongkui_mark"); - }, - content: function () { - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - game.delay(); - trigger.player.removeMark("zongkui_mark"); - }, - }, - }, - }, - guju: { - audio: 2, - audioname: ["tw_beimihu"], - init: function (player) { - if (!player.storage.guju) player.storage.guju = 0; - }, - intro: { - content: "已因此技能得到#张牌", - }, - trigger: { global: "damageEnd" }, - forced: true, - filter: function (event, player) { - return ( - event.player != player && event.player.isIn() && event.player.hasMark("zongkui_mark") - ); - }, - content: function () { - "step 0"; - player.draw(); - player.storage.guju++; - player.markSkill("guju"); - "step 1"; - if ( - player.hasZhuSkill("bingzhao", trigger.player) && - trigger.player.group == player.storage.bingzhao && - trigger.player.isIn() - ) { - trigger.player.chooseBool("是否对" + get.translation(player) + "发动【秉诏】?").ai = - function () { - return get.attitude(trigger.player, player) > 1; - }; - } else event.finish(); - "step 2"; - if (result.bool) { - trigger.player.logSkill("bingzhao", player); - player.draw(); - player.storage.guju++; - player.markSkill("guju"); - } - }, - ai: { - combo: "zongkui", - }, - }, - zongkui: { - trigger: { - player: "phaseBeforeEnd", - global: "roundStart", - }, - direct: true, - audio: 2, - audioname: ["tw_beimihu"], - filter: function (event, player, name) { - return game.hasPlayer(function (current) { - if (name == "roundStart" && !current.isMinHp()) return false; - return current != player && !current.hasMark("zongkui_mark"); - }); - }, - content: function () { - "step 0"; - var targets = game.filterPlayer(function (current) { - if (event.triggername == "roundStart" && !current.isMinHp()) return false; - return current != player && !current.hasMark("zongkui_mark"); - }); - if (event.triggername == "roundStart" && targets.length == 1) { - event._result = { bool: true, targets: targets }; - } else { - var next = player - .chooseTarget( - get.prompt("zongkui"), - "令一名" + - (event.triggername == "roundStart" ? "体力值最小的" : "") + - "其他角色获得“傀”标记", - function (card, player, target) { - if (_status.event.round && !target.isMinHp()) return false; - return target != player && !target.hasMark("zongkui_mark"); - } - ) - .set("ai", function (target) { - var num = target.isMinHp() ? 0.5 : 1; - return num * get.threaten(target); - }) - .set("round", event.triggername == "roundStart"); - if (event.triggername == "roundStart") next.set("forced", true); - } - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("zongkui", target); - target.addMark("zongkui_mark", 1); - game.delayx(); - } - }, - subSkill: { - mark: { - marktext: "傀", - intro: { - name2: "傀", - content: "mark", - }, - }, - }, - ai: { - combo: "guju", - threaten: 1.4, - }, - }, - xinfu_langxi: { - audio: 2, - trigger: { - player: "phaseZhunbeiBegin", - }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.hp <= player.hp; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("xinfu_langxi"), - "对一名体力值不大于你的其他角色造成0-2点随机伤害", - function (card, player, target) { - return target.hp <= player.hp && target != player; - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool && result.targets && result.targets.length) { - player.logSkill("xinfu_langxi", result.targets); - var num = [1, 2, 0].randomGet(); - if (get.isLuckyStar(player)) num = 2; - player.line(result.targets[0], "green"); - result.targets[0].damage(num); - } - }, - ai: { - expose: 0.25, - threaten: 1.7, - }, - }, - xinfu_yisuan: { - usable: 1, - audio: 2, - trigger: { - player: "useCardEnd", - }, - check: function (event, player) { - return get.value(event.cards) + player.maxHp * 2 - 18 > 0; - }, - prompt2: function (event, player) { - return "你可以减1点体力上限,然后获得" + get.translation(event.cards.filterInD()) + "。"; - }, - filter: function (event, player) { - return ( - player.isPhaseUsing() && - get.type(event.card) == "trick" && - event.cards.filterInD().length > 0 - ); - }, - content: function () { - player.loseMaxHp(); - player.gain(trigger.cards.filterInD(), "gain2", "log"); - }, - }, - xinfu_xingluan: { - usable: 1, - audio: 2, - trigger: { - player: "useCardAfter", - }, - filter: function (event, player) { - if (!player.isPhaseUsing()) return false; - if (get.type(event.card) == undefined) return false; - return event.targets && event.targets.length == 1; - }, - content: function () { - var card = get.cardPile2(function (card) { - return card.number == 6; - }); - if (!card) { - player.chat("无牌可得了吗"); - game.log("但是牌堆里面已经没有点数为6的牌了!"); - event.finish(); - return; - } - player.gain(card, "gain2"); - }, - }, - xinfu_lveming: { - init: function (player) { - player.storage.xinfu_lveming = 0; - }, - mark: true, - intro: { - content: "已发动过#次", - }, - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player != target && target.countCards("e") < player.countCards("e"); - }, - content: function () { - "step 0"; - var list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].map((i) => get.strNumber(i)); - target - .chooseControl(list) - .set("ai", function () { - return get.rand(0, 12); - }) - .set("prompt", "请选择一个点数"); - "step 1"; - if (result.control) { - target.$damagepop(result.control, "thunder"); - var num = result.index + 1; - event.num = num; - } else { - target.$damagepop("K", "thunder"); - event.num = 13; - } - game.log(target, "选择的点数是", "#y" + get.strNumber(event.num)); - player.storage.xinfu_lveming++; - player.judge(function (card) { - if (card.number == _status.event.getParent("xinfu_lveming").num) return 4; - return 0; - }); - "step 2"; - if (result.bool == true) { - target.damage(2); - } else { - var card = target.getCards("hej").randomGet(); - player.gain(card, target, "giveAuto", "bySelf"); - } - }, - ai: { - order: 9, - result: { - target: function (player, target) { - var numj = target.countCards("j"); - var numhe = target.countCards("he"); - if (numhe == 0) return numj > 0 ? 6 : -6; - return -6 - (numj + 1) / numhe; - }, - }, - threaten: 1.1, - }, - }, - xinfu_tunjun: { - skillAnimation: true, - animationColor: "metal", - limited: true, - unique: true, - enable: "phaseUse", - audio: 2, - filter: function (event, player) { - if (player.storage.xinfu_tunjun) return false; - return player.storage.xinfu_lveming && player.storage.xinfu_lveming > 0; - }, - filterTarget: true, - selectTarget: 1, - content: function () { - "step 0"; - player.awakenSkill("xinfu_tunjun"); - event.num = player.storage.xinfu_lveming; - event.toequip = []; - "step 1"; - var equip = get.cardPile(function (card) { - var bool1 = true; - for (var i = 0; i < event.toequip.length; i++) { - if ( - get.type(card) == "equip" && - get.subtype(card) == get.subtype(event.toequip[i]) - ) - bool1 = false; - } - return ( - get.type(card) == "equip" && - !event.toequip.includes(card) && - target.hasEmptySlot(card) && - bool1 - ); - }); - if (equip) event.toequip.push(equip); - else event.num = 0; - event.num--; - "step 2"; - if (event.num > 0) event.goto(1); - "step 3"; - for (var i = 0; i < event.toequip.length; i++) { - target - .chooseUseTarget(event.toequip[i], true) - .set("animate", false) - .set("nopopup", true); - } - }, - ai: { - combo: "xinfu_lveming", - order: function () { - var player = _status.event.player, - num = 0; - for (var i = 1; i < 6; i++) { - num += player.countEquipableSlot(i); - } - if (num <= 2) return 6; - if ( - player.hp <= 2 || - !game.hasPlayer((current) => { - if (player == current || get.attitude(player, current) < 0 || current.hp <= 1) - return false; - return current.hp > 2 || current.countCards("hs") > 2; - }) - ) - return 1; - return 0; - }, - result: { - target: function (player, target) { - var num = 0; - for (var i = 1; i < 6; i++) { - num += target.countEquipableSlot(i); - } - return num; - }, - }, - }, - mark: true, - intro: { - content: "limited", - }, - init: function (player) { - player.storage.xinfu_tunjun = false; - }, - }, - xinfu_tanbei: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player != target; - }, - content: function () { - "step 0"; - if (target.countCards("hej") == 0) { - event._result = { index: 1 }; - } else { - target - .chooseControl() - .set("choiceList", [ - "令" + - get.translation(player) + - "随机获得你区域内的一张牌,然后其本回合内不能再对你使用牌。", - "令" + get.translation(player) + "本回合内对你使用牌没有次数与距离限制。", - ]) - .set("ai", function () { - var list = [0, 1]; - return list.randomGet(); - }); - } - "step 1"; - player.addTempSkill("tanbei_effect3"); - if (result.index == 0) { - var card = target.getCards("hej").randomGet(); - player.gain(card, target, "giveAuto", "bySelf"); - target.addTempSkill("tanbei_effect2"); - } else { - target.addTempSkill("tanbei_effect1"); - } - }, - ai: { - order: function () { - return [2, 4, 6, 8, 10].randomGet(); - }, - result: { - target: function (player, target) { - return -2 - target.countCards("h"); - }, - }, - threaten: 1.1, - }, - }, - tanbei_effect3: { - charlotte: true, - mod: { - targetInRange: function (card, player, target) { - if (target.hasSkill("tanbei_effect1")) { - return true; - } - }, - cardUsableTarget: function (card, player, target) { - if (target.hasSkill("tanbei_effect1")) return true; - }, - playerEnabled: function (card, player, target) { - if (target.hasSkill("tanbei_effect2")) return false; - }, - }, - }, - xinfu_sidao: { - audio: 2, - trigger: { - player: "useCardAfter", - }, - filter: function (event, player) { - if (player.hasSkill("xinfu_sidaoy") || !player.countCards("hs")) return false; - if (!event.targets || !event.targets.length || !event.isPhaseUsing(player)) return false; - var history = player.getHistory("useCard"); - var index = history.indexOf(event) - 1; - if (index < 0) return false; - var evt = history[index]; - if (!evt || !evt.targets || !evt.targets.length || !evt.isPhaseUsing(player)) - return false; - for (var i = 0; i < event.targets.length; i++) { - if ( - evt.targets.includes(event.targets[i]) && - lib.filter.filterTarget({ name: "shunshou" }, player, event.targets[i]) - ) - return true; - } - return false; - }, - direct: true, - content: function () { - var targets = player.getLastUsed(1).targets; - var next = player.chooseToUse(); - next.set( - "targets", - game.filterPlayer(function (current) { - return targets.includes(current) && trigger.targets.includes(current); - }) - ); - next.set("openskilldialog", get.prompt2("xinfu_sidao")); - next.set("norestore", true); - next.set("_backupevent", "xinfu_sidaox"); - next.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - next.backup("xinfu_sidaox"); - }, - }, - xinfu_sidaox: { - audio: "xinfu_sidao", - filterCard: function (card) { - return get.itemtype(card) == "card"; - }, - position: "hs", - viewAs: { - name: "shunshou", - }, - filterTarget: function (card, player, target) { - return ( - _status.event.targets && - _status.event.targets.includes(target) && - lib.filter.filterTarget.apply(this, arguments) - ); - }, - prompt: "将一张手牌当顺手牵羊使用", - check: function (card) { - return 7 - get.value(card); - }, - onuse: function (links, player) { - player.addTempSkill("xinfu_sidaoy"); - }, - }, - xinfu_sidaoy: {}, - tanbei_effect1: { - charlotte: true, - }, - tanbei_effect2: { - charlotte: true, - }, - xinfu_tunan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player; - }, - content: function () { - "step 0"; - event.cards = get.cards(1); - player.showCards( - get.translation(player) + "对" + get.translation(target) + "发动了【图南】", - event.cards - ); - "step 1"; - var card = cards[0]; - var bool1 = game.hasPlayer(function (current) { - return target.canUse(card, current, false); - }); - var bool2 = game.hasPlayer(function (current) { - return target.canUse({ name: "sha" }, current); - }); - if (bool1 && bool2) { - target - .chooseControl(function () { - return 0; - }) - .set("choiceList", [ - "使用" + get.translation(cards) + "。(没有距离限制)", - "将" + get.translation(cards) + "当做【杀】使用。", - ]) - .set("ai", function () { - return _status.event.choice; - }) - .set( - "choice", - target.getUseValue(card, false) > - target.getUseValue({ name: "sha", cards: cards }) - ? 0 - : 1 - ); - } else if (bool1) { - event.directindex = 0; - } else if (bool2) { - event.directindex = 1; - } else { - ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - event.finish(); - } - "step 2"; - var card = cards[0]; - if (result && typeof event.directindex != "number") { - event.directindex = result.index; - } - if (event.directindex == 1) { - target.chooseUseTarget({ name: "sha" }, cards, true, false).viewAs = false; - } else { - target.chooseUseTarget(card, true, false, "nodistance"); - } - }, - ai: { - order: 7, - result: { - target: 1, - }, - }, - }, - xinfu_bijing: { - audio: 2, - subSkill: { - lose: { - trigger: { - global: "phaseDiscardBegin", - }, - audio: "xinfu_bijing", - charlotte: true, - filter: function (event, player) { - if (event.player == player) return false; - return ( - player.getHistory("lose", function (evt) { - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("xinfu_bijing")) return true; - } - }).length > 0 && event.player.countCards("he") > 0 - ); - }, - forced: true, - logTarget: "player", - content: function () { - trigger.player.chooseToDiscard(2, true, "he"); - }, - sub: true, - }, - discard: { - trigger: { - player: "phaseZhunbeiBegin", - }, - forced: true, - charlotte: true, - filter: function (event, player) { - return player.hasCard( - (card) => card.hasGaintag("xinfu_bijing") && player.canRecast(card), - "h" - ); - }, - content: function () { - player.recast( - player.getCards( - "h", - (card) => card.hasGaintag("xinfu_bijing") && player.canRecast(card) - ) - ); - }, - sub: true, - }, - }, - trigger: { - player: "phaseJieshuBegin", - }, - direct: true, - filter: function (player, event) { - return event.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.chooseCard(get.prompt2("xinfu_bijing"), "h", [1, 2]).set("ai", function (card) { - if (card.name == "shan") return 6; - return 6 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("xinfu_bijing"); - player.addGaintag(result.cards, "xinfu_bijing"); - player.addSkill("xinfu_bijing_lose"); - player.addSkill("xinfu_bijing_discard"); - } - }, - }, - xinfu_zhenxing: { - audio: 2, - trigger: { - player: ["damageEnd", "phaseJieshuBegin"], - }, - direct: true, - content: function () { - "step 0"; - player - .chooseControl("一张", "两张", "三张", "cancel2") - .set("prompt", get.prompt2("xinfu_zhenxing")) - .set("", function () { - return 0; - }); - "step 1"; - if (result.control == "cancel2") event.finish(); - else { - player.logSkill("xinfu_zhenxing"); - event.num = { 一张: 1, 两张: 2, 三张: 3 }[result.control]; - } - "step 2"; - event.cards = get.cards(num); - player - .chooseButton(["【镇行】:请选择要获得的牌", event.cards]) - .set("filterButton", function (button) { - var cards = _status.event.cards; - for (var i = 0; i < cards.length; i++) { - if (button.link != cards[i] && get.suit(cards[i]) == get.suit(button.link)) - return false; - } - return true; - }) - .set("ai", function (button) { - return get.value(button.link); - }) - .set("cards", event.cards); - "step 3"; - var tothrow = []; - for (var i = event.cards.length - 1; i >= 0; i--) { - if (result.bool && result.links.includes(event.cards[i])) { - player.gain(event.cards[i], "gain2"); - } else { - event.cards[i].fix(); - ui.cardPile.insertBefore(event.cards[i], ui.cardPile.childNodes[0]); - } - } - game.updateRoundNumber(); - }, - }, - xinfu_qianxin: { - audio: 2, - group: ["xinfu_qianxin2"], - enable: "phaseUse", - usable: 1, - onChooseToUse: function (event) { - if (!game.online) { - var num1 = game.players.length - 1; - var player = event.player; - var num2 = ui.cardPile.childElementCount; - var num3 = num2; - if (num1 > num2) num3 = 0; - else if (player.storage.xinfu_qianxin) { - for (var i = 0; i < num2; i++) { - if (player.storage.xinfu_qianxin.includes(ui.cardPile.childNodes[i])) { - num3 = 0; - break; - } - } - } - event.set("qianxinNum", num3); - } - }, - filter: function (event, player) { - return event.qianxinNum && event.qianxinNum > 0; - }, - filterTarget: function (card, player, target) { - return target != player; - }, - filterCard: true, - selectCard: function () { - var num1 = game.players.length - 1; - var num2 = _status.event.qianxinNum; - return [1, Math.floor(num2 / num1)]; - }, - discard: false, - check: function () { - return -1; - }, - delay: false, - lose: false, - prompt: function () { - return ( - "选择一名角色并将任意张手牌放置于牌堆中" + - get.cnNumber(game.players.length) + - "倍数的位置(先选择的牌在上)" - ); - }, - content: function () { - "step 0"; - player.$throw(cards.length); - player.storage.xinfu_qianxin = cards.slice(0); - player.storage.xinfu_qianxin2 = target; - //cards.reverse(); - player.lose(cards, ui.cardPile).insert_index = function (event, card) { - var num1 = game.players.length, - i = event.cards.indexOf(card); - var num3 = num1 * (i + 1) - 1; - return ui.cardPile.childNodes[num3]; - }; - "step 1"; - game.updateRoundNumber(); - game.log(player, "把", get.cnNumber(cards.length), "张牌放在了牌堆里"); - game.delayx(); - }, - ai: { - order: 1, - result: { - target: -1, - }, - }, - }, - xinfu_qianxin2: { - subSkill: { - dis: { - mod: { - maxHandcard: function (player, num) { - return num - 2; - }, - }, - sub: true, - }, - }, - forced: true, - locked: false, - audio: "xinfu_qianxin", - logTarget: "player", - trigger: { - global: "phaseDiscardBegin", - }, - filter: function (event, player) { - if (player.storage.xinfu_qianxin2 != event.player) return false; - if (!player.storage.xinfu_qianxin) return false; - var hs = event.player.getCards("h"); - var cs = player.storage.xinfu_qianxin; - var bool = false; - var history = event.player.getHistory("gain"); - for (var i = 0; i < history.length; i++) { - for (var j = 0; j < history[i].cards.length; j++) { - var card = history[i].cards[j]; - if (hs.includes(card) && cs.includes(card)) return true; - } - } - return false; - }, - content: function () { - "step 0"; - delete player.storage.xinfu_qianxin2; - if (player.countCards("h") >= 4) { - event._result = { index: 1 }; - } else { - trigger.player - .chooseControl() - .set("choiceList", [ - "令" + get.translation(player) + "将手牌摸至四张", - "令自己本回合的手牌上限-2", - ]) - .set("ai", function () { - var player = _status.event.player; - var source = _status.event.getParent().player; - if (get.attitude(player, source) > 0) return 0; - if (player.hp - player.countCards("h") > 1) return 1; - return [0, 1].randomGet(); - }); - } - "step 1"; - if (result.index == 0) { - player.drawTo(4); - } else { - trigger.player.addTempSkill("xinfu_qianxin2_dis"); - } - }, - }, - xinfu_fuhai: { - subSkill: { - next: {}, - previous: {}, - }, - audio: 2, - group: ["fuhai_clear"], - intro: { - content: "已指定过#个目标", - }, - enable: "phaseUse", - filter: function (event, player) { - if (player.hasSkill("xinfu_fuhai_next") && player.hasSkill("xinfu_fuhai_previous")) - return false; - return player.countCards("h") > 0; - }, - filterTarget: function (card, player, target) { - if (![player.next, player.previous].includes(target) || target.countCards("h") == 0) - return false; - if (player.hasSkill("xinfu_fuhai_next")) return target == player.previous; - if (player.hasSkill("xinfu_fuhai_previous")) return target == player.next; - return true; - }, - line: false, - content: function () { - "step 0"; - event.side = target == player.next ? "next" : "previous"; - event.current = target; - if (!player.storage.xinfu_fuhai) player.storage.xinfu_fuhai = 1; - player.addTempSkill("xinfu_fuhai_" + event.side, "phaseUseAfter"); - "step 1"; - if ( - player.countCards("h") == 0 || - event.current.countCards("h") == 0 || - event.current == player - ) { - event.finish(); - return; - } - var next = event.current[event.side]; - if (get.attitude(event.current, player) > 0) { - if ( - get.attitude(next, target) <= 0 || - next.countCards("h") == 0 || - player.countCards("h") == 1 - ) { - event.stopm = true; - event.stopt = true; - } else { - event.stopm = false; - event.stopt = false; - } - } else { - if (get.attitude(next, target) >= 0) { - event.stopt = true; - event.stopm = false; - } else { - event.stopt = false; - event.stopm = false; - } - } - player.markSkill("xinfu_fuhai"); - player.line(event.current, "green"); - player - .chooseCard("请选择要展示的牌", true) - .set("ai", function (card) { - if (_status.event.stop) return 14 - get.number(card); - return get.number(card); - }) - .set("stop", event.stopm); - "step 2"; - event.mes = result.cards[0]; - player.showCards(event.mes); - "step 3"; - event.current - .chooseCard("请选择要展示的牌", true) - .set("ai", function (card) { - if (_status.event.stop) return get.number(card); - return 14 - get.number(card); - }) - .set("stop", event.stopt); - "step 4"; - event.tes = result.cards[0]; - event.current.showCards(event.tes); - "step 5"; - var num1 = get.number(event.mes); - var num2 = get.number(event.tes); - if (num1 < num2) { - event.current.discard(event.tes); - game.asyncDraw([player, event.current], player.storage.xinfu_fuhai); - player.addTempSkill("xinfu_fuhai_next", "phaseUseAfter"); - player.addTempSkill("xinfu_fuhai_previous", "phaseUseAfter"); - player.unmarkSkill("xinfu_fuhai"); - } else { - player.discard(event.mes); - player.storage.xinfu_fuhai++; - event.current = event.current[event.side]; - if ( - player.countCards("h") > 0 && - event.current.countCards("h") > 0 && - event.current != player - ) - event.goto(1); - } - }, - ai: { - order: 1, - result: { - player: function (player, target) { - var hs = player.countCards("h"); - var side = target == player.next ? "next" : "previous"; - var current = player; - for (var i = 0; i < hs; i++) { - current = current[side]; - if (current == player || !current.countCards("h")) return 0; - if (get.attitude(current, player) > 0) return 1; - } - return 0; - }, - }, - }, - }, - fuhai_clear: { - trigger: { - player: "phaseAfter", - }, - forced: true, - silent: true, - popup: false, - filter: function (event, player) { - return player.storage.xinfu_fuhai != undefined; - }, - content: function () { - player.unmarkSkill("xinfu_fuhai"); - delete player.storage.xinfu_fuhai; - }, - }, - xz_xunxun: { - filter: function (event, player) { - var num = game.countPlayer(function (current) { - return current.isDamaged(); - }); - return num >= 1 && !player.hasSkill("xunxun"); - }, - audio: 2, - trigger: { - player: "phaseDrawBegin1", - }, - //priority:10, - content: function () { - "step 0"; - var cards = get.cards(4); - game.cardsGotoOrdering(cards); - var next = player.chooseToMove("恂恂:将两张牌置于牌堆顶", true); - next.set("list", [["牌堆顶", cards], ["牌堆底"]]); - next.set("filterMove", function (from, to, moved) { - if (to == 1 && moved[1].length >= 2) return false; - return true; - }); - next.set("filterOk", function (moved) { - return moved[1].length == 2; - }); - next.set("processAI", function (list) { - var cards = list[0][1].slice(0).sort(function (a, b) { - return get.value(b) - get.value(a); - }); - return [cards, cards.splice(2)]; - }); - "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]); - } - game.updateRoundNumber(); - game.delayx(); - }, - }, - xinfu_xingzhao: { - audio: true, - group: ["xz_xunxun", "xinfu_xingzhao2", "xinfu_xingzhao3"], - mark: true, - intro: { - content: function (storage, player) { - var num = game.countPlayer(function (current) { - return current.isDamaged(); - }); - var str = "暂无任何效果"; - if (num >= 1) { - str = "
  • 视为拥有技能“恂恂”"; - } - if (num >= 2) { - str += ";使用装备牌时摸一张牌"; - } - if (num >= 3) { - str += ";始终跳过弃牌阶段"; - } - if (num == 0 || num >= 4) { - str += ";造成的伤害+1"; - } - return str; - }, - }, - trigger: { - player: "useCard", - }, - forced: true, - filter: function (event, player) { - if (get.type(event.card) != "equip") return false; - var num = game.countPlayer(function (current) { - return current.isDamaged(); - }); - return num >= 2; - }, - content: function () { - player.draw(); - }, - }, - xinfu_xingzhao2: { - audio: true, - trigger: { - player: ["phaseJudgeBefore", "phaseDiscardBefore"], - }, - forced: true, - filter: function (event, player) { - var num = game.countPlayer(function (current) { - return current.isDamaged(); - }); - return num >= 3; - }, - content: function () { - trigger.cancel(); - game.log(player, "跳过了" + (trigger.name == "phaseJudge" ? "判定" : "弃牌") + "阶段"); - }, - }, - xinfu_xingzhao3: { - audio: "xinfu_xingzhao", - trigger: { - source: "damageBegin1", - }, - forced: true, - filter: function (event, player) { - var num = game.countPlayer(function (current) { - return current.isDamaged(); - }); - return num == 0 || num >= 4; - }, - content: function () { - trigger.num++; - }, - }, - xinfu_dianhu: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return ( - game.hasPlayer((current) => current != player) && - (event.name != "phase" || game.phaseNumber == 0) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - "选择【点虎】的目标", - lib.translate.xinfu_dianhu_info, - true, - function (card, player, target) { - return target != player && !target.hasSkill("xinfu_dianhu2"); - } - ) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att < 0) return -att + 3; - return Math.random(); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - game.log(target, "成为了", "【点虎】", "的目标"); - target.storage.xinfu_dianhu2 = player; - target.addTempSkill("xinfu_dianhu2", { player: "die" }); - } - }, - }, - xinfu_dianhu2: { - mark: "character", - intro: { - content: "当你受到来自$的伤害或回复体力后,$摸一张牌", - }, - nopop: true, - trigger: { - player: ["damageEnd", "recoverEnd"], - }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - if (player.storage.xinfu_dianhu2 && player.storage.xinfu_dianhu2.isIn()) { - if (event.name == "damage") return event.source == player.storage.xinfu_dianhu2; - return true; - } - }, - content: function () { - "step 0"; - var target = player.storage.xinfu_dianhu2; - target.logSkill("xinfu_dianhu"); - target.draw(); - }, - onremove: true, - }, - xinfu_jianji: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player; - }, - content: function () { - "step 0"; - target.draw(); - "step 1"; - var card = result[0]; - if ( - card && - game.hasPlayer(function (current) { - return target.canUse(card, current); - }) && - get.owner(card) == target - ) { - target.chooseToUse({ - prompt: "是否使用" + get.translation(card) + "?", - filterCard: function (cardx, player, target) { - return cardx == _status.event.cardx; - }, - cardx: card, - }); - } - }, - ai: { - order: 7.5, - result: { - target: 1, - }, - }, - }, - xinfu_lianpian: { - audio: 2, - usable: 3, - trigger: { - player: "useCardToPlayered", - }, - frequent: true, - filter: function (event, player) { - if ( - !event.targets || - !event.targets.length || - event.getParent().triggeredTargets3.length > 1 || - !event.isPhaseUsing(player) - ) - return false; - var evt = player.getLastUsed(1); - if (!evt || !evt.targets || !evt.targets.length || !evt.isPhaseUsing(player)) - return false; - for (var i = 0; i < event.targets.length; i++) { - if (evt.targets.includes(event.targets[i])) return true; - } - return false; - }, - content: function () { - "step 0"; - player.draw(); - "step 1"; - event.card = result[0]; - var ablers = player.getLastUsed(1).targets.slice(0); - for (var i = 0; i < ablers.length; i++) { - if (ablers[i] == player || !trigger.targets.includes(ablers[i])) - ablers.splice(i--, 1); - } - if (event.card && get.owner(event.card) == player && ablers.length) { - player - .chooseTarget( - "是否将" + get.translation(event.card) + "交给其他角色?", - function (card, player, target) { - return _status.event.ablers.includes(target) && target != player; - } - ) - .set("ablers", ablers).ai = function () { - return false; - }; - } else event.finish(); - "step 2"; - if (result.bool) { - player.give(event.card, result.targets[0], true); - } - }, - locked: false, - mod: { - aiOrder: function (player, card, num) { - if ( - player.isPhaseUsing() && - (!player.storage.counttrigger || - !player.storage.counttrigger.xinfu_lianpian || - !player.storage.counttrigger.xinfu_lianpian < 3) - ) { - var evt = player.getLastUsed(); - if ( - evt && - evt.targets && - evt.targets.length && - evt.isPhaseUsing(player) && - game.hasPlayer(function (current) { - return ( - evt.targets.includes(current) && - player.canUse(card, current) && - get.effect(current, card, player, player) > 0 - ); - }) - ) { - return num + 10; - } - } - }, - }, - ai: { - effect: { - player: function (card, player, target) { - var evt = player.getLastUsed(); - if ( - evt && - evt.targets.includes(target) && - (!player.storage.counttrigger || - !player.storage.counttrigger.xinfu_lianpian || - !player.storage.counttrigger.xinfu_lianpian < 3) && - player.isPhaseUsing(player) - ) - return [1.5, 0]; - }, - }, - }, - }, - //糜芳傅士仁 - fengshi: { - audio: "mffengshi", - audioname: ["sp_mifangfushiren"], - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - if (!event.isFirstTarget) return false; - return event.targets.some((target) => { - return ( - player.countCards("h") > target.countCards("h") && - target.countCards("he") > 0 && - player.hasCard((card) => { - return lib.filter.cardDiscardable(card, player, "fengshi"); - }, "he") - ); - }); - }, - direct: true, - async content(event, trigger, player) { - const { - result: { bool, targets }, - } = await player - .chooseTarget( - get.prompt("fengshi"), - "弃置你与一名目标角色的各一张牌,然后令" + - get.translation(event.card) + - "对其造成的伤害+1", - (card, player, target) => { - const targets = get.event().getTrigger().targets; - if (!targets.includes(target)) return false; - return ( - player.countCards("h") > target.countCards("h") && - target.countCards("he") > 0 && - player.hasCard((card) => { - return lib.filter.cardDiscardable(card, player, "fengshi"); - }, "he") - ); - } - ) - .set("ai", (target) => { - const player = get.event("player"); - const card = get.event().getTrigger().card; - if (!get.info("dcmffengshi").check({ card: card, target: target })) return 0; - return get.effect(target, { name: "guohe_copy2" }, player, player); - }); - if (bool) { - const target = targets[0]; - player.logSkill("fengshi", target); - await player.chooseToDiscard("he", true); - await player.discardPlayerCard(target, "he", true); - if (get.tag(trigger.card, "damage")) { - var id = target.playerid; - var map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; - map[id].extraDamage++; - } - } - }, - group: "fengshi_target", - subSkill: { - target: { - inherit: "dcmffengshi", - trigger: { target: "useCardToTargeted" }, - filter(event, player) { - if (event.player == event.target) return false; - return ( - event.player.countCards("h") > player.countCards("h") && - event.player.countCards("he") > 0 && - player.hasCard((card) => { - return lib.filter.cardDiscardable(card, player, "fengshi"); - }, "he") - ); - }, - async content(event, trigger, player) { - const target = trigger.player; - await player.chooseToDiscard("he", true); - await player.discardPlayerCard(target, "he", true); - if (get.tag(trigger.card, "damage")) { - var id = player.playerid; - var map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; - map[id].extraDamage++; - } - }, - }, - }, - }, - dcmffengshi: { - audio: "mffengshi", - audioname: ["sp_mifangfushiren"], - trigger: { - player: "useCardToPlayered", - target: "useCardToTargeted", - }, - filter: function (event, player, name) { - if (event.player == event.target || event.targets.length != 1) return false; - return ( - event.player.countCards("h") > event.target.countCards("h") && - event.target.countCards("he") > 0 && - player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "dcmffengshi"); - }, "he") - ); - }, - logTarget: function (event, player) { - return player == event.player ? event.target : event.player; - }, - prompt2: function (event, player) { - var target = lib.skill.dcmffengshi.logTarget(event, player); - return ( - "弃置你与" + - get.translation(target) + - "的各一张牌,然后令" + - get.translation(event.card) + - "的伤害+1" - ); - }, - check: function (event, player) { - var viewer = player, - player = event.player, - target = event.target; - if (viewer == player) { - if (get.attitude(viewer, target) >= 0) return false; - if (player.countCards("he", (card) => get.value(card, player) < 5)) return true; - var card = get.event().getTrigger().card; - if ( - (get.tag(card, "damage") || - target.countCards("he", (card) => get.value(card, target) > 6)) && - player.countCards("he", (card) => get.value(card, player) < 7) - ) - return true; - return false; - } else { - if (get.attitude(viewer, player) >= 0) return false; - if (!get.tag(card, "damage")) return false; - if (viewer.countCards("he") > player.countCards("he")) return true; - if (viewer.countCards("he", (card) => get.value(card, target) > 6)) return false; - return true; - } - }, - content: function () { - if (get.tag(trigger.card, "damage")) trigger.getParent().baseDamage++; - var target = lib.skill.dcmffengshi.logTarget(trigger, player); - player.chooseToDiscard("he", true); - player.discardPlayerCard(target, "he", true); - }, - }, - mffengshi: { - audio: 2, - audioname: ["sp_mifangfushiren"], - trigger: { - player: "useCardToPlayered", - target: "useCardToTargeted", - }, - direct: true, - preHidden: true, - filter: function (event, player) { - if (event.player == event.target || event.targets.length != 1) return false; - if (player != event.player && !player.hasSkill("mffengshi")) return false; - return ( - event.player.countCards("h") > event.target.countCards("h") && - event.target.countCards("he") > 0 - ); - }, - content: function () { - "step 0"; - event.source = trigger.player; - event.target = player == trigger.target ? trigger.player : trigger.target; - var str; - if (player == trigger.player) str = "弃置自己的和该角色"; - else str = "令其弃置其与你的"; - var next = trigger.player - .chooseBool( - "是否对" + get.translation(trigger.target) + "发动【锋势】?", - str + "的各一张牌,然后令" + get.translation(trigger.card) + "的伤害+1" - ) - .set("ai", function () { - var player = _status.event.getParent().player; - var target = _status.event.getParent().target; - var viewer = _status.event.player; - if (viewer == player) { - if (get.attitude(viewer, target) >= 0) return false; - if (player.countCards("he", (card) => get.value(card, player) < 5)) - return true; - var card = _status.event.getTrigger().card; - if ( - (get.tag(card, "damage") || - target.countCards("he", (card) => get.value(card, target) > 6)) && - player.countCards("he", (card) => get.value(card, player) < 7) - ) - return true; - return false; - } else { - if (get.attitude(viewer, player) >= 0) return false; - if (!get.tag(card, "damage")) return false; - if (viewer.countCards("he") > player.countCards("he")) return true; - if (viewer.countCards("he", (card) => get.value(card, target) > 6)) - return false; - return true; - } - }); - if (player == next.player) next.setHiddenSkill("mffengshi"); - "step 1"; - if (result.bool) { - if (player == source) player.logSkill("mffengshi", target); - else { - player.logSkill("mffengshi"); - source.line(player, "green"); - } - if (get.tag(trigger.card, "damage")) trigger.getParent().baseDamage++; - player.chooseToDiscard("he", true); - } else event.finish(); - "step 2"; - if (target.countDiscardableCards(player, "he") > 0) - player.discardPlayerCard(target, "he", true); - }, - }, - }, - card: {}, - characterIntro: { - tangji: "唐姬,会稽太守唐瑁女,弘农怀王刘辩的妃子。刘辩死后,唐姬回归故里,因节烈不愿改嫁他人,后被汉献帝下诏封为弘农王妃。", - lijue: "李傕(一说“傕”读音“què”)(?—198年),字稚然。北地郡泥阳县(今陕西省耀县)人,汉末群雄之一。东汉末年汉献帝时的军阀、权臣,官至大司马、车骑将军、开府、领司隶校尉、假节。
    李傕本为董卓部将,后被董卓的女婿牛辅派遣至中牟与朱儁交战,大破朱儁,进而至陈留、颍川等地劫掠。初平三年(192年)董卓和牛辅被杀后,李傕归无所依,于是采用贾诩之谋,伙同郭汜、张济、樊稠等原董卓部曲将攻向长安。击败吕布,杀死王允等人,占领长安,把持朝廷大权。后诸将不和,李傕在会议上杀死了樊稠,又与郭汜分别劫持了汉献帝和众臣,相互交战,张济率兵赶来和解,于是二人罢兵,李傕出屯池阳黄白城,郭汜、张济等人随汉献帝东归前往弘农。
    后来,李傕、郭汜、张济反悔,联合起来追击汉献帝,与杨奉、董承等人几番交战。汉献帝一路逃亡,狼狈不堪,到达安邑,与李傕等人讲和。不久,汉献帝被曹操迎往许都。建安三年(198年),曹操派谒者仆射裴茂召集关西诸将段煨等人征讨李傕,灭其三族。", - zhangji: - "张济(?-196年),武威郡祖厉县(今甘肃靖远东南)人。东汉末年割据军阀之一。 张济原为董卓部将,董卓被诛杀后,张济与李傕一同率军攻破长安,任中郎将。不久,升任镇东将军,封平阳侯,出屯弘农。献帝东迁时,张济升任骠骑将军,率军护卫献帝,后来因与董承等人有矛盾,便与李傕、郭汜一同追赶献帝。 建安元年(196年),张济因军队缺粮而进攻穰城,中流矢而死。死后,部队由侄儿张绣接管。", - guosi: "郭汜(?-197年),又名郭多,凉州张掖(今甘肃张掖西北)人,东汉末年将领、军阀,献帝时权臣。原为董卓部下。董卓被杀后,凉州众将归无所依,于是采用贾诩之谋,联兵将攻向长安,击败吕布,杀死王允等人,占领长安,把持朝廷大权。几年后,郭汜被部将伍习杀死。", - fanchou: - "樊稠(?—195年),凉州金城(治今甘肃永靖西北)人。东汉末年军阀、将领。官至右将军,封万年侯。 原为董卓部将,董卓死后,伙同李傕、郭汜、张济等人合众十余万反扑长安,败吕布、杀王允,把持朝政。后马腾因与李傕有隙,于是联合韩遂举兵进攻,李傕派樊稠、郭汜等与其交战,大败马腾、韩遂于长平观下。樊稠追至陈仓,与韩遂友好罢兵,却遭李傕猜疑。兴平二年(195年),李傕让外甥骑都尉胡封在会议上将樊稠刺死(一说趁醉用杖击杀)。", - lvkai: "吕凯(?―225年),字季平,永昌郡不韦县(今云南保山东北)人,三国时期蜀汉官员。初任永昌郡五官掾功曹。章武三年(223年),建宁太守雍闿反叛,投降吴国,吴国任雍闿为永昌太守,吕凯闭境抗拒雍闿。建兴三年(225年),丞相诸葛亮南征,表奏吕凯功劳,任命他为云南太守,封阳迁亭侯。吕凯还未上任,便被叛乱的少数民族杀害。", - zhanggong: - "张恭(生卒年不详),三国时期魏国大臣,与子张就一同闻名于西域。官至西域戊己校尉、关内侯,赠执金吾。初为敦煌郡功曹。东汉末河西大乱,太守马艾卒官,他被众人推为代理长史,遂派儿子张就请曹操委任太守,直至新太守到任。魏文帝时拜西域戊己校尉。魏明帝时去世。", - weiwenzhugezhi: - "卫温 (?—231年),三国时期东吴将领,曾任将军职。诸葛直(?—231年),三国时期东吴将领。黄龙二年(230年)正月,孙权派卫温、诸葛直带领上万士兵出海寻找夷洲、亶洲,想要俘获那里的民众以充实东吴的人口,陆逊和全琮都谏言反对,孙权不听。230年和卫温一起登上台湾(当时的台湾叫做夷洲),他们是中国历史上记载的最早登陆台湾的人。卫温和诸葛直花费了约一年时间行军,士兵们因为疾病死去了十分之八到十分之九,因为亶洲太过遥远,卫温和诸葛直最终没能到达那里,只带了几千名夷洲的人返回。黄龙三年(231年),孙权认为诸葛直违背诏令,劳财伤民,无功而返,和卫温一同入狱被处死。", - xurong: "徐荣(?-192年),玄菟人(一说为辽东襄平人,《公孙度传》中说公孙度本辽东襄平人,迁居玄菟,为同郡徐荣所举,任辽东太守。同郡当是同“玄菟”郡),东汉末年将领。本为中郎将,曾向董卓推举同郡出身的公孙度出任辽东太守。于汴水之战中击败曹操的独立追击军,以及在梁东之战中击败孙坚的部队。在董卓死后,受司徒王允的命令与李傕、郭汜交战,因部将胡珍投降,寡不敌众,于新丰之战被击败,战死在乱军之中。", - zhangqiying: - "张琪瑛(196年-217年),字不详(或琪瑛为字,名不详),祖籍沛国丰县(今江苏省丰县)。她的曾祖父张陵是西汉留侯张良的十一世孙、天师道(五斗米道)教祖,她的父亲是东汉末年割据汉中的军阀张鲁。张琪瑛继承家说,是五斗米教的传人。", - beimihu: - "卑弥呼(ひみこ,约159年-约249年,有的史书也写成“俾弥呼”)是日本弥生时代邪马台国(今日本本州近畿地区)的女王,在《三国志·魏书·倭人传》中有关于她的记载。关于她的真实身份一直众说纷纭,是个极具神秘色彩的古代女性统治者。亦是日本古代宗教鬼道教的发源者。", - liuqi: "刘琦(?-209年)。兖州山阳郡高平县(今山东省济宁市微山县两城镇)人。荆州牧刘表的长子、谏议大夫刘琮兄。官至荆州刺史。建安十四年(209年)病逝。", - tangzi: "唐咨(生卒年不详),三国时魏利城(今江苏赣榆西)人。魏文帝黄初中利城郡反,推唐咨为主。后为魏军击破,遂亡至吴,官至左将军,封侯、持节。后助诸葛诞拒魏,兵败被俘。为安抚吴国军民,魏主拜唐咨为安远将军。", - huangquan: - "黄权(?-240年),字公衡。巴西郡阆中县(今四川阆中)人。三国时期蜀汉、曹魏将领。
    黄权年轻时为郡吏,后被益州牧刘璋召为主簿。曾劝谏刘璋不要迎接刘备,因而被外放为广汉县长。刘璋败,才降刘备,被拜为偏将军。建计取汉中,拜护军。刘备为汉中王,仍领益州牧,以黄权为治中从事。及刘备称帝,将伐吴,黄权劝谏而不纳。以其为镇北将军,督江北军以防魏师进攻。刘备伐吴败还,而归途隔绝,黄权不得归,无奈之下率部降魏。被魏文帝所赏识,拜镇南将军,封育阳侯,加侍中,使同车陪乘。后领益州刺史,进驻河南。景初三年(239年),迁车骑将军、仪同三司。正始元年(240年),黄权去世,谥号“景”。", - sufei: "苏飞(生卒年不详),东汉末年人物,原为东汉末年荆州牧刘表的部将,任江夏都督。
    苏飞与甘宁交好,但是数次向黄祖推荐都失败。甘宁决定投效孙权时助其逃离。后来甘宁率吴军攻破江夏,苏飞兵败被俘。孙权打算将苏飞处斩,但是因为甘宁用性命担保而赦免了苏飞。降吴后官至军都督。", - - zhangchangpu: - "钟会的母亲。《母夫人张氏传》:夫人张氏,字昌蒲,太原兹氏人,太傅定陵成侯之命妇也。", - xugong: "许贡是东汉末官吏。先后任吴郡都尉、太守,欲送密信给曹操,要曹操注意孙策,却被孙策发现而被杀。许贡生前招揽了一些门客,当中有三人不忘故主,千方百计想要手刃仇人。建安五年(公元200年),广陵太守陈登派人秘密联系孙策治下的山贼余党,企图颠覆孙策在江东的统治。孙策决定讨伐陈登,行军到丹徒时,许贡门客终于找到了机会。因为孙策有单骑出猎,在野外思考的习惯,三门客趁孙策轻装外出打猎时,放冷箭射中孙策面颊。这些门客后来在与孙策的搏斗中,被赶到的侍卫杀死。孙策此后因为伤口感染,并且俊美的容貌被毁,终于不治身亡,去世时年仅26岁。", - mangyachang: - "南蛮王孟获的部将,使一口截头大刀,骑一匹黄骠马。率军与蜀军交战,战败王平。后被平北将军马岱斩杀。只出现在《三国演义》里,正史中无此人。", - xushao: "许劭(150年—195年),字子将。汝南平舆(今河南平舆县射桥镇)人。东汉末年著名人物评论家。据说他每月都要对当时人物进行一次品评,人称为“月旦评”。曾任汝南郡功曹,后南渡投靠扬州刺史刘繇。刘繇被孙策击败后,许劭随其逃往豫章郡,并在豫章去世。", - zhangwen: - "张温(193年—230年),字惠恕,吴郡吴县(今江苏苏州)人。少修节操,容貌奇伟。孙权召拜议郎、选曹尚书,徙太子太傅。黄武三年(224),以辅义中郎将身份出使蜀汉,孙权原先害怕诸葛亮会有意留难张温,但张温不担心。在呈上蜀汉朝廷的文书刻意称颂蜀汉,以表明和解的诚意,重建两国关系。他在蜀汉表现出色,得蜀汉朝廷重视。回东吴后不久,被调进豫章的军队,事业上再无进展。孙权一方面介怀他出使蜀汉时称颂蜀汉,又嫌他声名太盛,恐怕张温不会尽忠地由他任用。当时正好碰上暨艳事件,暨艳是张温引荐的臣子,但他滥用职权,升迁评定等只看自己喜恶。事件被揭发后暨艳及同党徐彪都自杀。孙权见此,于是以张温与暨艳、徐彪等人多有来往而下罪张温,后更将张温发还到家乡吴郡。将军骆统曾上书为张温辩解,但孙权不理会。六年后,张温病逝。", - lisu: "李肃(?-192年),五原(治今内蒙古包头西北)人。永汉三年四月,司徒王允、尚书仆射士孙瑞、卓将吕布共谋诛卓。是时,天子有疾新愈,大会未央殿。布使同郡骑都尉肃等、将亲兵十馀人,伪著卫士服守掖门。布怀诏书。卓至,肃等格卓。卓惊呼布所在。布曰“有诏”,遂杀卓,夷三族。后卓女婿中郎将牛辅典兵别屯陕,分遣校尉李傕、郭汜、张济略陈留、颍川诸县。卓死,吕布使李肃至陕,欲以诏命诛辅。辅等逆与肃战,肃败走弘农,布诛肃。", - xinpi: "辛毗(生卒年不详),字佐治,颍川阳翟人。三国时期曹魏大臣。原居陇西(郡治在今甘肃临洮县),东汉光武帝建武年间,其先人东迁。当初,辛毗跟随其兄事袁绍。曹操任司空时,征召辛毗,他不受命。官渡战后,辛毗事袁绍的儿子袁谭。公元204年,曹操攻下邺城,上表推荐辛毗任议郎,后为丞相长史。公元220年,曹丕即皇帝位,以辛毗为侍中,赐爵关内侯,后赐广平亭侯。魏明帝即位,封辛毗颍乡侯,食邑三百户,后为卫尉。公元234年,诸葛亮屯兵渭南,司马懿上表魏明帝。魏明帝任辛毗为大将军军师,加使持节号。诸葛亮病逝后,辛毗返回,仍任卫尉。不久,逝世,谥肃侯。", - - liuzan: "字正明,会稽长山人人,曾任左护军,有两子:留略、留平。少为会稽郡吏,曾参与镇压黄巾起义,后被东吴大将凌统所引用,任屯骑校尉。吴五凤二年(公元255年)留赞任左护军,随孙峻征淮南,因病撤军,被魏将蒋班围困于道,力战而死,时年73岁。", - zhujun: "朱儁(?-195年),字公伟。会稽郡上虞县(今浙江绍兴上虞区)人。东汉末年名将。朱儁出身寒门,赡养母亲,以好义轻财闻名,受乡里敬重。后被太守徐珪举为孝廉,任兰陵令,颇有治绩。再升任交州刺史,以家兵五千大破叛军,平定交州。战后以功封都亭侯,入朝为谏议大夫。光和七年(184年),黄巾起义爆发,朱儁以右中郎将、持节平定三郡之地,以功进封西乡侯,迁镇贼中郎将。又率军讨平黄巾,“威声满天下”。中平二年(185年),进拜右车骑将军,更封钱塘侯。后为河内太守,击退进逼的张燕。权臣董卓秉政时,想任朱儁为副手,遭其婉拒。其后出逃荆州,更屯军中牟,徐州刺史陶谦等欲推举他为太师,并传檄各州牧伯,相邀讨伐李傕、奉迎天子。但朱儁却奉诏入京任太仆。初平三年(192年),升任太尉、录尚书事。兴平元年(194年),行骠骑将军事,持节镇关东,因故未成行。兴平二年(195年),李傕与郭汜相互攻杀,郭汜扣留朱儁作为人质。朱儁性格刚烈,即日发病而死。", - liuhong: - "汉灵帝刘宏(157年,一作156年-189年5月13日),生于冀州河间国(今河北深州)。东汉第十二位皇帝(168年-189年在位),汉章帝刘炟的玄孙。刘宏早年世袭解渎亭侯。永康元年(167年)十二月,汉桓帝刘志逝世,刘宏被外戚窦氏挑选为皇位继承人,于建宁元年(168年)正月即位。刘宏在位的大部分时期,施行党锢及宦官政治。他又设置西园,巧立名目搜刮钱财,甚至卖官鬻爵以用于自己享乐。在位晚期,爆发了黄巾起义,而凉州等地也陷入持续动乱之中。中平六年(189年),刘宏去世,谥号孝灵皇帝,葬于文陵。刘宏喜好辞赋,作有《皇羲篇》、《追德赋》、《令仪颂》、《招商歌》等。", - wangrong: - "汉灵怀皇后王荣(?~181年),赵国邯郸(今河北邯郸市)人。五官中郎将王苞孙女,汉灵帝刘宏妃子,汉献帝刘协生母。初以良家子选入掖庭,封为美人,服侍汉灵帝。光和四年(181年),生下陈留王刘协,惨遭灵思皇后毒杀。王荣死后,汉灵帝曾作《追德赋》、《令仪颂》。永汉元年(189年),其子刘协即位,是为汉献帝,追谥灵怀皇后,葬于文昭陵。", - hanfu: "韩馥(?—191年),字文节,颍川郡(今河南禹州)人。东汉末年的诸侯,冀州牧。韩馥担任过东汉的御史中丞,之后被董卓举荐为冀州牧;在各诸侯起兵讨伐董卓时,韩馥也是其中之一的参与者。韩馥与袁绍也曾经有意立刘虞为皇帝。当时冀州民殷人盛,兵粮优足,于是袁绍便用计夺取冀州,韩馥被迫投靠张邈;之后张邈与袁绍的使者见面,韩馥以为是要来杀害自己的,于是在厕所中以刻书用的小刀自杀。", - zhaozhong: - "赵忠(?—189年),安平人,东汉末年宦官,赵延之兄。桓帝、灵帝时,历为小黄门、中常侍、大长秋、车骑将军等职,封都乡侯。在职时以搜刮暴敛、骄纵贪婪见称,灵帝极为宠信,常谓“赵常侍是我母”。中平六年(189年),何进谋诛宦官,事泄,他和其余几个常侍设计伏杀何进,袁绍、袁术等人闻何进被杀,入宫杀尽宦官,后捕杀赵忠。", - caosong: - "曹嵩(?—194年),字巨高,沛郡谯县(今安徽省亳州市)人。东汉大臣,大长秋曹腾的养子,曹操之父亲。门荫入仕,历任司隶校尉、鸿胪卿、大司农,位列九卿,位高权重。中平四年(187年),靠着贿赂中官,出任太尉,位列三公。中平五年(188年),受累于黄巾之乱,坐罪免官。兴平元年(194年),投奔兖州牧曹操,遇害于徐州。延康元年(220年),追尊魏国太王。曹魏建立后,追尊皇帝,谥号为太。", - liangxing: - "梁兴(?-212年),武威郡姑臧人也,东汉末年凉州军阀之一。与张横、贾诩、段煨是同乡,曾斩杀李傕。建安十六年,同韩遂、马超联合,起兵反抗曹操。梁兴率步骑五千夜袭曹军先头部队徐晃,被击退。联军战败后,梁兴逃到蓝田,劫掠周围郡县。夏侯渊进攻蓝田联合郑浑征讨梁兴,梁兴战败,不知所终。", - zhangmiao: - "张邈(?-195年),字孟卓,东平寿张(今山东东平县)人。东汉大臣、名士,“八厨”之一。举孝廉出身,授骑都尉,出任陈留太守。参与讨伐董卓,参加汴水之战,归附于曹操。兴平元年(194年),趁着曹操讨伐徐州牧陶谦,联合陈宫发动叛乱,迎立吕布为兖州牧。受到曹操讨伐,兵败投奔徐州牧刘备。兴平二年,张邈向袁术借兵途中,被部下所杀。", - duanwei: - "段煨(?~209年),字忠明,武威郡姑臧(今甘肃省武威市)人也。东汉末年将领,东汉太尉段颎同族兄弟,与太尉贾诩、张济、宣威侯张绣乃是同乡。原为董卓帐下将领,奉命屯兵华阴,勤劳农业。兴平二年(195年),迎接汉献帝刘协东归洛阳,供给衣食补给,与护驾将领杨定不和,引发激战十余天,听从汉献帝刘协劝解。东汉建安三年(198年),攻打黄白城,击杀李傕,夷其三族,封为镇远将军、闅乡亭侯、北地太守,累迁大鸿胪、金光禄大夫。建安十四年(209年),寿终正寝。", - zhangheng: - "张横,生卒年不详,武威郡姑臧人,东汉末年凉州军阀之一。与梁兴、贾诩、段煨乃是同乡。建安三年(198),张横与梁兴、段煨等斩杀李傕。十六年(211),同韩遂、马超联合,起兵反抗曹操,兵败后不知所终。", - wenqin: "文钦(?~258年),字仲若,沛国谯郡(今安徽省亳州市)人,三国时期曹魏将领,曹操部将文稷之子。魏明帝太和年间文钦任牙门将、五营校督,后拜庐江太守、冠军将军,嘉平元年(249年),曹爽及其同党在高平陵之变中被杀,文钦心中不安,执政的司马氏集团为了安抚文钦,升其为前将军、扬州刺史,任职期间结交镇东将军毌丘俭。击退吴国太傅诸葛恪进攻,取得一定战果。正元二年(255年),文钦与镇东将军毌丘俭在扬州起兵讨伐司马师,兵败后投奔吴国,被封为镇北大将军、幽州牧,封谯侯。甘露二年(257年),文钦随吴军援救起兵反抗司马氏的诸葛诞,此后因被司马昭大军围困,军情告急,文钦与诸葛诞本就有矛盾,对文钦日益不满的诸葛诞遂将文钦杀死。淮南平定之后,文钦遗体被其二子收敛安葬。", - qiuliju: - "丘力居,东汉末年的辽西乌丸大人。拉拢中山太守张纯反叛东汉,寇略青、徐、幽、冀四州,杀略吏民。死时认为儿子楼班年幼,于是让从子蹋顿总摄三王部。", - liuba: "刘巴(?-222年),字子初,荆州零陵郡烝阳县(今湖南省衡阳县、邵东县一带)人,东汉末年至三国时期蜀汉时期官员、名士。刘巴少知名,荆州牧刘表多次征用推举,刘巴均不应就。曹操征伐荆州,荆州士人多归刘备,刘巴却北上投靠曹操。后受曹操命令招降荆南三郡,不料先为刘备所得,刘巴不能复命曹操,遂远至交趾,又辗转进入益州。刘备平定益州后,刘巴归附刘备,为左将军西曹掾,法正死后接任尚书令。章武二年(222年)去世。刘巴博学多才,为刘备解决入蜀后的财政困难问题,又与诸葛亮等共制蜀汉的法律文件《蜀科》。为人简朴清高,退无私交,曹魏大臣陈群甚敬重之。所著录于《刘令君集》。", - pengyang: - "彭羕(184年-220年),字永年,广汉(今四川广汉北)人。东汉末年官吏。彭羕起初在益州任书佐,但后来其他人向益州牧刘璋诽谤他,刘璋于是以“髡钳”(剃去头发和胡须,并戴上刑具)处罚他,并且贬奴隶。此时刘备入蜀,彭羕想投靠刘备,于是去见庞统。庞统和他会面后很欣赏他,而法正亦很清楚彭羕,于是二人共同向刘备推荐彭羕。刘备多次命令彭羕传递军情和指示给诸将,表现都十分满意,日渐被赏识。刘备入主益州,领益州牧后就任命他为治州从事。彭羕见此,又变得嚣张自矜,诸葛亮对他礼待但心中并不喜欢他,多次密告刘备,说彭羕“心大志广,难可保安”。刘备见诸葛亮这样说,决定疏远彭羕,又观察他行事,于是贬他为江阳太守。彭羕见将被派往外地,心感不悦,与马超见面时又曾对他说“老革荒悖,可复道邪!”“卿为其外,我为其内,天下不足定也。”马超听后大惊,彭羕走后以他的说话告发彭羕,彭羕于是被收监下狱。最后彭羕被处死,死时三十七岁。", - dongxie: - "董卓之女,牛辅之妻。在《三国群英传》中名为董宜,在电视剧《三国群英会之吕布与貂蝉》中名为董媛。", - caoanmin: - "曹安民(?-197年),沛国谯县(今安徽亳州)人,字安民。东汉时期人物,曹德之子,曹操之侄,曹昂的堂兄弟,曹丕的堂兄,死于宛城之战。按曹丕《典论》记载的“亡兄孝廉子脩、从兄安民遇害。”等情况来看,安民应该是曹操侄子错不了,曹丕是他们属于兄弟关系肯定不会弄错。另外从典论的记载来看安民是和子脩并提的,子脩是曹昂的字,安民则肯定也是字不是名,至于三国志中记载则应取自曹丕之《典论》但陈寿又不知曹安民其名,故写为“长子昂、弟子安民”。", - dufuren: - "杜夫人(生卒年不详),东汉末年至三国时人。有异色,原为吕布将秦宜禄之妻,生子秦朗。后为曹操纳为妾,又生曹林、曹衮、金乡公主。", - mifangfushiren: - "麋芳(生卒年不详),字子方,东海郡朐县(今江苏省连云港市)人。汉末三国时期蜀国将领,刘备糜夫人的兄弟。麋芳本为徐州牧陶谦部下,曾被曹操表为彭城相。后来辞官,随刘备从徐州辗转至邺城、汝南、新野、长坂坡、江夏等地,奔波多年。傅士仁(生卒年不详),字君义,幽州广阳郡(今北京市)人,刘备手下将领。受到刘备的重用,但被关羽轻慢。
    刘备称汉中王时,糜芳为南郡太守,但受到关羽的轻慢。后来,因未完成供给军资的任务而被关羽责骂,心中不安。吕蒙袭取荆州时,将已经投降的傅士仁展示给糜芳,麋芳于是选择投降,导致关羽兵败被杀。此后,在吴国担任将军,并且为吴征伐。", - tongyuan: - "童渊,字雄付,武术名家,与并州李彦是结拜兄弟,两人均师承义父玉真子,两人分别娶了河北颜家的两位大小姐颜云、颜雨。童飞之父,有张任、张绣为入室弟子,晚年收赵云为关门弟子,传其毕生所学。其成名技为“百鸟朝凤枪”。童渊是南方苏州评话三国中的原创人物,在历史中以及《三国演义》中并不存在。", - //zhangning:'张宁,东汉末年大贤良师张角的女儿。自幼学习太平道法,掌握天地法则。', - xinping: - "辛评(?-204年),字仲治,颍川阳翟人,东汉末年人物。曹魏卫尉辛毗之兄。原是韩馥部下,韩馥逃亡后转而辅佐袁绍。袁绍死后,辛评、郭图欲立袁谭为主,与审配等不和。后来曹操破邺,其弟辛毗在城下劝降。审配怒遣手下将辛评全家杀害。", - hanmeng: - "韩猛,又名韩若、韩荀、韩泣(上荀下大) ,东汉末年袁绍帐下名将,或与《曹瞒传》所言韩莒子为同一人。公元200年,官渡之战爆发。袁绍派遣韩猛劫掠曹操军的西道,被曹军部将曹仁击破于鸡洛山。袁绍又派韩猛前去运送粮车,因为轻敌被曹军部将徐晃、史涣击退。", - yanfuren: - "《三国志》中东汉末年著名武将吕布有一妻子,但姓名未载于史书,或为魏续的姐妹魏氏。在李傕郭汜之乱期间曾受困,幸亏被庞舒所救,私藏于府中而得以幸免。吕布被曹操围困时,反对陈宫的计谋,导致了吕布的失败。《三国演义》中,姓严,通称严夫人,和吕布生有一女欲嫁于袁术之子,未果,吕布失败后与其女一同送往许昌。", - haomeng: - "郝萌(?-196年),东汉末年吕布帐下名将。建安元年(196年),郝萌在袁术的怂恿下反叛吕布,曾一度打得吕布躲入厕所。后来,被吕布部将高顺所阻,其部将曹性临阵反叛,最终被高顺所杀。在小说《三国演义》中,吕布被围下邳时,郝萌护送许汜王楷回城时,被张飞擒获,被曹操所杀。", - licaiwei: - "李采薇,生卒年不详,汉末将领庞德之妻,庞会之母。襄樊之战时,庞德任先锋,随于禁率军增援驻守樊城的曹仁。出战前,他将妻子李采薇与年仅六岁的儿子庞会叫来面前,对李采薇说:“吾今为先锋,义当效死疆场。我若死,汝好生看养吾儿。吾儿有异相,长大必当与吾报仇也。”李采薇闻言,与儿子痛哭送别庞德。她知道丈夫已下定决心,若无法胜利归还则必当战死沙场,绝不会投降求生。其后前线果然传来消息:魏军全军覆没,于禁投降,庞德誓死不降被关羽所杀。其子庞会自幼丧父,由母亲抚养长大。成年后,庞会性格勇烈,有先父之风。他多次立下战功,深受魏文帝曹丕的喜爱。后来庞会随钟会、邓艾伐蜀,成都城破之后,尽灭关氏家以报父仇。", - yanrou: "阎柔(生卒年不详),燕国广阳(今北京市附近)人。三国时期曹魏名将。年少时曾被乌丸、鲜卑俘虏,后来却得到他们的信任。刘虞死后,阎柔被鲜于辅等推举为乌丸司马,联系鲜卑为刘虞报仇,和公孙瓒对抗。在官渡之战时归曹操,拜护乌丸校尉,对曹操讨伐乌丸有功,赐爵关内侯。曹操待其如子,曹丕也视其如亲兄弟,阎柔坐镇北方,统帅幽州兵马,抗击胡人的入侵。曹丕即位后,阎柔被拜为度辽将军。", - qinyilu: - "秦宜禄(?—200年),并州云中郡云中县人(今内蒙古自治区呼和浩特市托克托县古城镇)。东汉军阀吕布的部将。吕布战败后归降曹操,后为张飞所杀。", - fengfang: - "冯方,其字不详,司隶人。初掌校事,监察京师及周边地区,刺探文武百官秘事。十常侍之乱后,董卓进京,掌控朝政。冯方认为他胸怀不臣之心,于是弃官携女儿冯妤至江南避祸。其后董卓果然乱政,京师之地生灵涂炭,更将洛阳付之一炬。冯方因其先见之明得以保全家人。
    冯妤长大成人后,有倾国之貌。一日袁术登城观景,得见冯妤,心中非常喜欢,于是将其纳为夫人。冯方心忧自家女儿不谙世事,于是将可以让人更显妩媚的家传宝梳交给她,希望能借此使其获得袁术的宠爱。其后果然传来袁术偏爱冯夫人的消息,冯方因此宽心,接受了袁术的征辟,为其效力。然而好景不长,没过多久,冯妤自缢身亡的消息传出,冯方悲愤不已,弃官而走,自此销声匿迹。", - bianxi: "小说《三国演义》里的人物。汜水关守将,并州人氏。原是黄巾余党,后投曹操,拨来守汜水关。善使流星锤。在镇国寺设下伏兵欲谋害千里寻兄的关羽,但是寺中僧人普净暗示加以解救。最后被关羽斩杀。", - niufu: "牛辅,东汉末年武将,东汉相国董卓的女婿。曾任中郎将,征讨白波军,不能取胜。董卓被杀时,牛辅别屯于陕地。吕布派李肃前去征讨牛辅,被牛辅击败。后来,牛辅营中有士兵半夜背叛出逃,造成内乱,牛辅以为整营皆叛,于是带着金银珠宝,独与亲信胡赤儿等五六人逾城北渡河。赤儿等人以绳索系在牛辅腰间将其从城头放下,但赤儿等因为谋财而在离地面数丈高的地方就松开了绳子使得牛辅重重摔在地上腰部受伤,而后赤儿与诸胡人将牛辅斩首,将其首级送去长安。", - wangwei: - "王威,东汉末年人。荆州刺史刘表部下将领,乃忠义之士。刘表亡后,刘琮投降曹操,王威向刘琮献计偷袭曹操,刘琮没有采纳。小说《三国演义》中,曹操表刘琮为青州刺史,使远离故乡,时只有王威追随,曹操复遣于禁追杀刘琮等人,王威亦于乱军中殉主。", - liyixiejing: - "李异(生卒年不详),三国时吴将领,曾随陆逊大败蜀军。谢旌(生卒年不详),三国时期吴国名将,会稽(今属浙江)人。建安末,李异与谢旌率水陆三千,破蜀将詹晏、陈凤。刘备领兵攻孙权,李异与陆议等屯巫、秭归,为蜀将所破。黄武元年(222),陆逊破刘备于猇亭,他追踪蜀军,屯驻南山。建安二十四年,陆逊击败关羽后,遣李异、谢旌二人将水陆军三千,进攻蜀将詹晏、陈凤。李异率水军,谢旌率陆军,于险要之地设防,击败詹晏,生擒陈凤。其后进攻房陵太守邓辅、南乡太守郭睦,大破之。又攻秭归大姓文布、邓凯等所合夷兵数千人,大胜,文布、邓凯落荒而逃。在《三国演义》中,两人为孙桓麾下部将,皆有“万夫不当之勇”。刘备攻吴时,谢旌迎战张苞,不敌败走。李异接战,被关兴所斩。次日,谢旌于乱军中被张苞一矛刺死。", - shiyi: "是仪(生卒年不详),本名氏仪,字子羽,北海郡营陵县(今山东昌乐)人,三国时期吴国官员。仕东汉、东吴两朝,早年曾在本县营陵县及本郡北海郡任官,后在东吴历任骑都尉、忠义校尉、裨将军、偏将军、侍中、中执法、尚书仆射等官。先封都亭侯,后进封都乡侯。年八十一岁时病逝,死前要求节葬。", - sunlang: - "孙狼(生卒年不详),东汉末农民起义军首领。建安二十三年(218)陆浑(今河南嵩县东北)县长张固发民服徭役,百姓惶俱,狼等乘机发动起义,杀县主簿,攻破县城,后南下投奔蜀将关羽。", - sp_jiaxu: - "字文和,武威姑臧人。三国时期魏国著名谋士。曾先后担任三国军阀李傕、张绣、曹操的谋士。官至魏国太尉,谥曰肃侯。", - sunhuan: - "孙桓(198年-223年),字叔武,吴郡富春(今浙江杭州富阳区)人,三国时期吴国建武将军。孙河第三子。仪容端正,器怀聪明,博学强记,能论议应对,孙权常称为“宗室颜渊”。初擢为武卫都尉。建安二十四年(219年),参与由吕蒙指挥的袭击荆州行动,从讨关羽于华容,招揽关羽余众,得五千人以及大量牛马器械。黄武元年(222年),孙桓二十五岁,拜安东中郎将,跟随陆逊抗击进攻东吴的刘备。当时刘备率领众多兵众进攻,满山都是蜀军,孙桓奋战,与陆逊等协力击破蜀军。刘备兵败逃走,孙桓截击,“斩上夔道,扼要径”,差点生擒刘备。战后孙桓因功拜建武将军,封丹徒侯,督牛渚,修筑横江坞,期间逝世。", - guānning: - "关宁,《三国演义》的虚构人物,为关定之子,关平的哥哥,学文。关羽前往冀州寻找刘备时曾居于关定庄,关定命关宁、关平二子出拜。后关羽同刘备回到关定庄时,关羽向刘备介绍关宁、关平二人,关定即提出让关平拜关羽为义父。", - mushun: "穆顺,小说《三国演义》中的人物,男,东汉末宦官。献帝欲修书与国舅伏完,共谋图曹公。因顺为宦官中之忠义可托者,乃命顺往送书。顺藏书于发中,潜出禁宫,径至完宅,将书呈上。及完回书付顺,顺乃藏于头髻内,辞完回宫。然公闻信,先于宫门等候,顺回遇公,公喝左右,遍搜身上,并无夹带,放行。忽然风吹落其帽。公又唤回,取帽视之,遍观无物,还帽令戴。顺双手倒戴其帽。公心疑,令左右搜其头发中,搜出伏完书来。公见书大怒,执下顺于密室问之,顺不肯招。当晚将顺、完等宗族二百余口,皆斩于市。", - jsp_guanyu: - "关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。", - liuling: - "刘伶(约221年-约300年),字伯伦,西晋沛国(治今安徽濉溪县西北)人,竹林七贤之一,中国魏晋时期作家,名士。
    刘伶自幼便失去了父爱,因其父亲身材矮小,及至长大成人后,刘伶身高也不过六尺。魏齐王曹芳正始之末(249年),刘伶已成为当世名重一时的名士,并且常与嵇康、阮籍、阮咸集会于山阳竹林之下,饮酒赋诗,弹琴作歌。晋武帝司马炎泰始初年(265年)前后,曾做过一段时间的建威参军,不久朝廷下诏,入宫中策问。他大谈老庄,强调无为而治,非但没有得到重用,反而连参军之职也被罢免了,从此再无仕进。晋惠帝司马衷永康元年(300年)前后,以寿而终。
    刘伶有“品酒第一人”的美称,也被酒行业传颂至今,后人以古瀑河边上的井水酿酒,还取刘伶墓地的黄土垒成窖池酿酒,为了纪念刘伶,当地百姓也将“润泉涌”更名为“刘伶醉”。其传世作品仅有《酒德颂》《北芒客舍》两篇,其中《酒德颂》所表现出的藐视一切存在的气概,敌视礼教之士的反抗精神,既高扬了人格的力量,批判了当时的黑暗政治,同时也抒发了压抑的愤世之情,充满了浪漫色彩,气魄豪迈,用辞又骈偶间行,有无意追求而自至的特点,对后代影响极大。", - }, - characterTitle: { - chunyuqiong: "#b对决限定武将", - sp_xuyou: "#g4v4限定武将", - }, - characterFilter: { - chunyuqiong: function (mode) { - return mode != "identity" && mode != "guozhan"; - }, - sp_xuyou: function (mode) { - return mode == "versus" && ["guandu", "4v4", "four"].includes(_status.mode); - }, - }, - dynamicTranslate: { - mubing: function (player) { - if (player.storage.mubing2) - return "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。"; - return "出牌阶段开始时,你可以亮出牌堆顶的三张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。"; - }, - piaoping: function (player) { - if (player.storage.piaoping) - return '转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)'; - return '转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)'; - }, - chuaili: function (player) { - if (!player.hasSkill("piaoping", null, null, false)) - return "锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。"; - if (player.storage.piaoping) - return '锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。'; - return '锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。'; - }, - dcdouzhen: function (player) { - var str = "锁定技。①转换技。你的回合内,"; - if (player.countMark("dcdouzhen") % 2) - str += - '阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。'; - else - str += - '阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。'; - return str; - }, - }, - perfectPair: { - nanhualaoxian: ["zuoci", "yuji"], - re_nanhualaoxian: ["zuoci", "yuji"], - }, - characterReplace: { - lijue: ["lijue", "ns_lijue"], - fanchou: ["fanchou", "tw_fanchou", "ns_fanchou"], - zhangji: ["zhangji", "ns_zhangji"], - zhangchangpu: ["ol_zhangchangpu", "zhangchangpu", "sp_zhangchangpu"], - huangfusong: ["huangfusong", "sp_huangfusong", "jsrg_huangfusong", "old_huangfusong"], - dingyuan: ["ol_dingyuan", "dingyuan"], - quyi: ["quyi", "re_quyi"], - hansui: ["hansui", "re_hansui", "xin_hansui", "jsrg_hansui"], - jin_simashi: ["dc_simashi", "jin_simashi", "simashi"], - jin_yanghuiyu: ["jin_yanghuiyu", "yanghuiyu"], - taoqian: ["re_taoqian", "taoqian"], - jsp_liubei: ["jsrg_liubei", "jsp_liubei"], - dongcheng: ["re_dongcheng", "dongcheng"], - hucheer: ["re_hucheer", "hucheer", "tw_hucheer"], - nanhualaoxian: ["re_nanhualaoxian", "nanhualaoxian", "jsrg_nanhualaoxian"], - pangdegong: ["re_pangdegong", "pangdegong"], - zhujun: ["ol_zhujun", "zhujun", "sp_zhujun", "jsrg_zhujun"], - tw_liuhong: ["liuhong", "tw_liuhong", "jsrg_liuhong"], - re_hejin: ["hejin", "re_hejin", "tw_hejin", "jsrg_hejin"], - hujinding: ["dc_hujinding", "ol_hujinding", "hujinding"], - caosong: ["caosong", "sp_caosong"], - re_niujin: ["niujin", "re_niujin", "tw_niujin"], - haomeng: ["haomeng", "tw_haomeng"], - zhangning: ["zhangning", "tw_zhangning"], - caoanmin: ["caoanmin", "ns_caoanmin"], - duanwei: ["duanwei", "junk_duanwei"], - xushao: ["xushao", "jsrg_xushao"], - huban: ["ol_huban", "dc_huban", "mb_huban"], - mengda: ["ol_mengda", "dc_mengda", "pe_mengda"], - jsp_guanyu: ["jsp_guanyu", "dc_jsp_guanyu", "jsrg_guanyu"], - mushun: ["mushun", "sp_mushun"], - wangjun: ["dc_wangjun", "wangjun"], - zoushi: ["re_zoushi", "jsrg_zoushi"], - zhangmancheng: ["dc_zhangmancheng", "tw_zhangmancheng"], - }, - translate: { - lijue: "李傕", - zhangji: "张济", - fanchou: "樊稠", - guosi: "郭汜", - lvkai: "吕凯", - zhanggong: "张恭", - weiwenzhugezhi: "卫温诸葛直", - xurong: "徐荣", - zhangqiying: "张琪瑛", - sp_liuqi: "刘琦", - xf_tangzi: "唐咨", - gz_xf_huangquan: "黄权", - xf_huangquan: "OL黄权", - xf_huangquan_prefix: "OL", - gz_xf_sufei: "苏飞", - xf_sufei: "OL苏飞", - xf_sufei_prefix: "OL", - xinfu_langxi: "狼袭", - xinfu_langxi_info: "准备阶段,你可以对一名体力小于或等于你的其他角色造成0~2点随机伤害。", - xinfu_yisuan: "亦算", - xinfu_yisuan_info: - "每回合限一次。当你于出牌阶段内使用的锦囊牌结算结束后,你可以减1点体力上限并获得此牌对应的所有实体牌。", - xinfu_xingluan: "兴乱", - xinfu_xingluan_info: - "每回合限一次。当你于出牌阶段内使用的仅指定一个目标的牌结算完成后,你可以从牌堆中随机获得一张点数为6的牌。", - xinfu_lveming: "掠命", - xinfu_lveming_info: - "出牌阶段限一次,你可以选择一名装备区装备比你少的角色,令其选择一个点数,然后你进行判定:
    若点数相同,你对其造成2点伤害;
    若点数不同,则你随机获得其区域内的一张牌。", - xinfu_tunjun: "屯军", - xinfu_tunjun_info: - "限定技,出牌阶段,你可以选择一名角色,令其随机使用牌堆中的X张装备牌。(X为你发动过“掠命”的次数)", - xinfu_tanbei: "贪狈", - xinfu_tanbei_info: - "出牌阶段限一次,你可以令一名其他角色选择一项:1.令你随机获得其区域内的一张牌,本回合内你不能对其使用牌。2.令你此回合内对其使用牌没有次数与距离限制。", - xinfu_sidao: "伺盗", - xinfu_sidaox: "伺盗", - xinfu_sidao_info: - "出牌阶段限一次,当你对一名其他角色连续使用两张牌后,你可以将一张手牌当做【顺手牵羊】对其使用。", - tanbei_effect1: "贪狈", - tanbei_effect1_info: "", - tanbei_effect2: "贪狈", - tanbei_effect2_info: "", - - xinfu_tunan: "图南", - xinfu_tunan_info: - "出牌阶段限一次,你可以亮出牌堆顶的一张牌并选择一名其他角色,然后该角色选择一项:使用此牌(无距离限制);或将此牌当普通【杀】使用。", - xinfu_bijing: "闭境", - xinfu_bijing_info: - "结束阶段,你可以选择至多两张手牌并标记为“闭境”,然后你获得如下效果:1.其他角色的弃牌阶段开始时,若你于本回合内失去过“闭境”,其弃置两张牌;2.准备阶段,你重铸所有“闭境”牌。", - xinfu_zhenxing: "镇行", - xinfu_zhenxing_info: - "结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的至多三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", - xinfu_qianxin: "遣信", - xinfu_qianxin_info: - "出牌阶段限一次,若牌堆中没有“信”,你可以选择一名角色并将任意张手牌放置于牌堆中X倍数的位置(X为存活人数),称为“信”。该角色的弃牌阶段开始时,若其手牌区内有于本回合内获得过的“信”,其选择一项:令你将手牌摸至四张;本回合手牌上限-2。", - qianxin_effect: "遣信", - qianxin_effect_info: "", - xinfu_qianxin2: "遣信", - xinfu_qianxin2_info: "", - - xinfu_fuhai: "浮海", - xinfu_fuhai_info: - "出牌阶段每个方向限一次,你可以展示一张手牌并选择上家或下家。该角色展示一张手牌,若你展示的牌点数大于等于其展示的牌点数,你弃置你展示的牌,然后继续对其上家或下家重复此流程;若你展示的牌点数小于该展示角色牌的点数,则该角色弃置其展示的牌,然后你与其各摸X张牌(X为你此回合内发动此技能选择的角色数),且你此阶段内不能再发动〖浮海〗。", - fuhai_clear: "浮海", - fuhai_clear_info: "", - - xz_xunxun: "恂恂", - xz_xunxun_info: - "摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", - xinfu_xingzhao: "兴棹", - xinfu_xingzhao_info: - "锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,判定阶段或弃牌阶段开始时,你跳过此阶段。若X=0或X≥4,当你造成伤害时,此伤害+1(X为场上已受伤的角色数)。", - xinfu_xingzhao2: "兴棹", - xinfu_xingzhao2_info: "", - xinfu_xingzhao3: "兴棹", - xinfu_dianhu: "点虎", - xinfu_dianhu_info: - "锁定技,游戏开始时,你选择一名其他角色。当其受到来自你的伤害后或回复体力后,你摸一张牌。", - xinfu_dianhu2: "点虎", - xinfu_dianhu2_info: "", - xinfu_jianji: "谏计", - xinfu_jianji_info: "出牌阶段限一次,你可以令一名其他角色摸一张牌。然后该角色可以使用此牌。", - xinfu_lianpian: "联翩", - xinfu_lianpian_info: - "出牌阶段限三次。当你对一名角色连续使用牌时,你可以摸一张牌,然后可以将一张牌交给该角色。", - spwenji: "问计", - spwenji_info: - "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。", - rewenji: "问计", - rewenji_info: - "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌类型相同的牌时不能被其他角色响应。", - sptunjiang: "屯江", - sptunjiang_info: - "结束阶段,若你未于本回合的出牌阶段内使用牌指定过其他角色为目标,则你可以摸X张牌(X为全场势力数)。", - zongkui: "纵傀", - zongkui_mark: "纵傀", - zongkui_mark_bg: "傀", - zongkui_info: - "回合开始前,你可以指定一名未拥有“傀”标记的其他角色,令其获得一枚“傀”标记。一轮游戏开始时,你指定一名体力值最少且没有“傀”标记的其他角色,令其获得一枚“傀”标记。", - guju: "骨疽", - guju_info: "锁定技,拥有“傀”标记的角色受到伤害后,你摸一张牌。", - baijia: "拜假", - baijia_info: - "觉醒技,准备阶段,若你因〖骨疽〗得到的牌不少于7张,则你增加1点体力上限,回复1点体力,然后令所有未拥有“傀”标记的其他角色获得“傀”标记,最后失去技能〖骨疽〗,并获得技能〖蚕食〗。", - bmcanshi: "蚕食", - bmcanshi_info: - "一名角色使用基本牌或普通锦囊牌指定你为唯一目标时,若其有“傀”标记,你可以取消之,然后其失去“傀”标记;你使用牌仅指定一名角色为目标时,你可以额外指定任意名带有“傀”标记的角色为目标(无距离限制),然后这些角色失去“傀”标记。", - - xinpi: "辛毗", - lisu: "李肃", - zhangwen: "张温", - xushao: "许劭", - mangyachang: "忙牙长", - xugong: "许贡", - zhangchangpu: "张昌蒲", - pingjian: "评荐", - pingjian_use: "评荐", - pingjian_info: - "结束阶段开始时/当你受到伤害后/出牌阶段限一次,你可以令系统随机检索出三张拥有发动时机为结束阶段开始时/当你受到伤害后/出牌阶段的技能的武将牌。然后你可以选择尝试发动其中一个技能。每个技能每局游戏只能选择一次。", - - songshu: "颂蜀", - songshu_info: - "出牌阶段,你可以和其他角色拼点。若你没赢,你与其各摸两张牌,且你本阶段内不能再发动〖颂蜀〗。", - sibian: "思辩", - sibian_info: - "摸牌阶段,你可以放弃摸牌,改为亮出牌堆顶的四张牌,然后获得其中所有点数最大与点数最小的牌,且可以将剩余的牌交给手牌数最少的角色。", - lslixun: "利熏", - lslixun_fate: "利熏", - lslixun_info: - "锁定技,当你受到伤害时,你防止此伤害,然后获得等同于伤害值的“珠”标记。出牌阶段开始时,你进行判定,若结果点数小于“珠”的数量,你弃置等同于“珠”数量的手牌(若弃牌的牌数不够,则失去剩余数量的体力值)。", - lskuizhu: "馈珠", - lskuizhu_info: - "出牌阶段结束时,你可以选择体力值为全场最多的一名其他角色,将手牌摸至与该角色相同(最多摸至五张),然后该角色观看你的手牌,弃置任意张手牌并从观看的牌中获得等量的牌。若其得到的牌大于一张,则你选择一项:移去一个“珠”;或令其对其攻击范围内的一名角色造成1点伤害。", - xpchijie: "持节", - xpchijie_info: - "每回合每项各限一次。1.当其他角色使用的牌对你结算结束后,你可以令此牌对所有后续目标无效。2.其他角色使用的牌结算完成时,若你是此牌的目标之一且此牌未造成过伤害,则你可以获得此牌对应的所有实体牌。", - xpchijie2: "持节", - yinju: "引裾", - yinju_info: - "限定技,出牌阶段,你可以选择一名其他角色。若如此做,当你于此阶段内使用牌指定其为目标后,你与其各摸一张牌;当你即将对其造成伤害时,防止此伤害,然后其回复等量的体力。", - yinju2: "引裾", - - spjiedao: "截刀", - spjiedao_info: - "当你每回合第一次造成伤害时,你可令此伤害至多+X(X为你损失的体力值)。然后若受到此伤害的角色没有死亡,你弃置等同于此伤害加值的牌。", - biaozhao: "表召", - biaozhao_info: - "结束阶段,你可以将一张牌置于武将牌上,称为“表”。当有一张与“表”花色点数均相同的牌进入弃牌堆后,你将“表”置入弃牌堆并失去1点体力,若此牌是其他角色因弃置而进入弃牌堆的,则改为该角色获得“表”。准备阶段,若你的武将牌上有“表”,则你将“表”置入弃牌堆。然后你选择一名角色,该角色回复1点体力且将手牌摸至与全场手牌数最多的人相同(最多摸五张)。", - biaozhao2: "表召", - biaozhao2_info: "", - biaozhao3: "表召", - biaozhao3_info: "", - yechou: "业仇", - yechou_info: - "当你死亡时,你可以选择一名已损失体力值大于1的角色。直到其下个回合开始前,每个回合结束时,该角色失去1点体力。", - yechou2: "业仇", - yechou2_info: "", - yanjiao: "严教", - yanjiao_info: - "出牌阶段限一次,你可以选择一名其他角色并从牌堆顶亮出四张牌。该角色将这些牌分成点数之和相等的两组,你与其各获得其中一组,然后将剩余未分组的牌置入弃牌堆。若未分组的牌超过一张,则你本回合手牌上限-1。", - yanjiao2: "严教", - yanjiao2_info: "", - xingshen: "省身", - xingshen_info: - "当你受到伤害后,你可以摸一张牌且下一次发动〖严教〗亮出的牌数+1。若你的手牌数为全场最少,则改为摸两张牌;若你的体力值为全场最少,则〖严教〗亮出的牌数改为+2(加值总数不能超过4)。", - - sp_zhanghe: "SP张郃", - sp_zhanghe_prefix: "SP", - yuanlve: "远略", - yuanlve_info: - "出牌阶段限一次,你可以将一张非装备牌交给一名角色,然后该角色可以使用该牌并令你摸一张牌。", - xunchen: "OL荀谌", - xunchen_prefix: "OL", - fenglve: "锋略", - fenglve2: "锋略", - fenglve_info: - "出牌阶段开始时,你可以与一名角色拼点,若你赢,该角色将其区域内的各一张牌交给你;若你没赢,你交给其一张牌。当你的单人拼点结算后,你可以令对方获得你拼点的牌。", - mouzhi: "谋识", - mouzhi2: "谋识", - mouzhi_info: - "出牌阶段限一次,你可以将一张手牌交给一名角色,若如此做,当其于其下回合的出牌阶段内对一名角色造成伤害后,若是此阶段其第一次对该角色造成伤害,你摸一张牌。", - sp_shenpei: "SP审配", - sp_shenpei_prefix: "SP", - gangzhi: "刚直", - gangzhi_info: - "锁定技,当你即将受到其他角色造成的伤害时,或即将对其他角色造成伤害时,你防止此伤害,改为受到伤害的角色失去等量的体力。", - beizhan: "备战", - beizhan2: "备战", - beizhan_info: - "结束阶段,你可以令一名角色将手牌摸至体力上限(至多为5)。其下个回合开始时,若其手牌数为全场最多,则其此回合内使用的牌不能指定其他角色为目标。", - gaolan: "OL高览", - gaolan_prefix: "OL", - xiying: "袭营", - xiying2: "袭营", - xiying_info: - "出牌阶段开始时,你可以弃置一张非基本手牌,然后令所有其他角色依次选择一项:弃置一张牌,或本回合内不能使用或打出牌;且你本回合内获得如下效果:结束阶段,若你于本回合的出牌阶段内造成过伤害,则你从牌堆中获得一张伤害性基本牌或普通锦囊牌。", - lvkuanglvxiang: "OL吕旷吕翔", - lvkuanglvxiang_prefix: "OL", - liehou: "列侯", - liehou_info: - "出牌阶段限一次,你可以令一名攻击范围内的角色交给你一张手牌,然后你将一张手牌交给攻击范围内的另一名角色。", - qigong: "齐攻", - qigong_info: - "当你使用的【杀】被【闪】抵消之后,你可以令一名角色再对目标角色使用一张【杀】(不可被响应)。", - chunyuqiong: "淳于琼", - sushou: "宿守", - sushou_info: "弃牌阶段开始时,你可以摸X+1张牌(X为“粮”数),然后可以交给任意名友方角色各一张牌。", - cangchu: "仓储", - cangchu_info: - "锁定技,游戏开始时,你获得3枚“粮”标记,当你受到1点火焰伤害后,你失去一枚“粮”标记。", - liangying: "粮营", - liangying_info: - "锁定技,若你有“粮”标记,则友方角色摸牌阶段摸牌数+1;当你失去所有“粮”标记后,你减1点体力上限,然后令敌方角色各摸两张牌。", - sp_xuyou: "SP许攸", - sp_xuyou_prefix: "SP", - spshicai: "恃才", - spshicai2: "恃才", - spshicai_info: - "出牌阶段,牌堆顶的一张牌对你可见。你可以弃置一张牌,然后获得牌堆顶的一张牌,且不能再发动〖恃才〗直到此牌离开你的手牌区。", - spfushi: "附势", - spfushi_info: - "锁定技,若己方存活角色数:大于敌方,你视为拥有〖择主〗;小于敌方,你视为拥有〖逞功〗。", - zezhu: "择主", - zezhu_info: - "出牌阶段限一次,你可以获得双方主帅的各一张牌(若无牌则改为你摸一张牌),然后交给双方主帅各一张牌。", - chenggong: "逞功", - chenggong_info: "当有角色使用牌指定目标后,若此牌对目标数大于1,则你可令使用者摸一张牌。", - sp_zhangliao: "SP张辽", - sp_zhangliao_prefix: "SP", - //这仨技能给SP仲村由理毫无违和感好吗!!! - mubing: "募兵", - mubing_info: - "出牌阶段开始时,你可以亮出牌堆顶的三张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。", - ziqu: "资取", - ziqu_info: - "每名角色限一次,当你对有牌的其他角色造成伤害后,你可以防止此伤害。然后其将其点数最大的牌交给你。", - diaoling: "调令", - diaoling_info: - "觉醒技,准备阶段,若你已因〖募兵〗获得了6张或更多的【杀】或武器牌或伤害锦囊牌,则你回复1点体力或摸两张牌,然后修改〖募兵〗。", - mubing_rewrite: "募兵·改", - mubing_rewrite_info: - "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。", - caobuxing: "曹不兴", - moying: "墨影", - moying_info: - "每回合限一次,当你于回合外不因使用而失去单一一张锦囊牌或装备牌后,你可以选择一个花色和与此牌点数差绝对值不超过2的点数,然后获得牌堆中所有与此牌花色点数相同的牌。", - juanhui: "绢绘", - juanhui2: "绢绘", - juanhui2_backup: "绢绘", - juanhui_info: - '结束阶段,你可以选择一名其他角色。记录该角色下回合的出牌阶段里使用的基本牌和普通锦囊牌(每种牌名限记一次),你的下回合出牌阶段,可将一张手牌当这些牌里的任意一张牌使用(每张限使用一次,且【杀】不计次数)。当"绢绘"的牌全部用完时,你回复1点体力并将手牌摸至三张。', - re_maliang: "新杀马良", - re_maliang_prefix: "新杀", - rexiemu: "协穆", - rexiemu_info: - "结束阶段,若全场没有“协穆”标记,你可以选择一名角色获得“协穆”标记直到你的下回合开始。你或该角色在各自的回合外使用或打出手牌时,你与其各摸一张牌(每回合限一次)。", - heli: "贺励", - heli_info: - "出牌阶段限一次,你可以选择手牌数比你少的一名其他角色。该角色展示所有手牌,然后每缺少一种类型的牌,便从牌堆中随机获得一张此类型的牌。", - zhujun: "朱儁", - gongjian: "攻坚", - gongjian_info: - "每回合限一次,当有角色使用【杀】指定第一个目标后,若此【杀】的目标和本局游戏内被使用的上一张【杀】的目标的交集A不为空,则你可以依次弃置A中所有角色的至多两张牌,然后获得以此法弃置的所有【杀】。", - kuimang: "溃蟒", - kuimang_info: "锁定技,一名角色死亡后,若你对其造成过伤害,你摸两张牌。", - liuhong: "刘宏", - yujue: "鬻爵", - yujue_backup: "鬻爵", - yujue_info: - "出牌阶段限一次,你可以废除一个装备栏,然后令一名有手牌的其他角色交给你一张手牌。其获得〖执笏〗直到你的下回合开始。", - zhihu: "执笏", - zhihu_mark: "执笏", - zhihu_info: "锁定技,每回合限两次,当你对其他角色造成伤害后,你摸两张牌。", - tuxing: "图兴", - tuxing2: "图兴", - tuxing_info: - "锁定技,当你废除一个装备栏时,你加1点体力上限并回复1点体力。然后若你所有的装备栏均已被废除,则你减4点体力上限,且本局游戏内造成的伤害+1。", - re_hejin: "新杀何进", - re_hejin_prefix: "新杀", - xin_baosanniang: "新杀鲍三娘", - xin_baosanniang_prefix: "新杀", - decadexushen: "许身", - decadexushen2: "许身", - decadexushen_info: - "限定技,当你进入濒死状态后,你可以回复1点体力并获得技能“镇南”,然后如果你脱离濒死状态且“关索”不在场,你可令一名其他角色选择是否用“关索”代替其武将并令其摸三张牌。", - decadezhennan: "镇南", - decadezhennan_info: - "当有角色使用普通锦囊牌指定目标后,若此牌目标数大于1,你可以对一名其他角色造成1点伤害。", - ol_dingyuan: "丁原", - cixiao: "慈孝", - cixiao_info: - "准备阶段,若场上没有“义子”标记,你可令一名其他角色获得一个“义子”标记;若场上有“义子”标记,你可以弃置一张牌移动“义子”标记。拥有“义子”标记的角色获得技能“叛弑”。", - panshi: "叛弑", - panshi_info: - "锁定技,准备阶段,你交给有“慈孝”技能的角色一张手牌;当你于出牌阶段因使用【杀】对其他角色造成伤害时,若其拥有技能“慈孝”,则此伤害+1,且你结束出牌阶段。", - xianshuai: "先率", - xianshuai_info: - "锁定技,有角色造成伤害后,若此伤害是本轮第一次造成伤害:你摸一张牌;若伤害来源是你,则你对受伤角色再造成1点伤害。", - wangrong: "王荣", - minsi: "敏思", - minsi2: "敏思", - minsi_info: - "出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离限制,红色牌本回合不计入手牌上限。", - jijing: "吉境", - jijing_info: - "当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。", - zhuide: "追德", - zhuide_info: "当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。", - decadewuniang: "武娘", - decadewuniang_info: - "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌。若如此做,其摸一张牌。(若你已发动许身,则关索也摸一张牌)", - dongxie: "董翓", - juntun: "军屯", - juntun_info: "锁定技,准备阶段,若X大于1,则你减1点体力上限并摸X张牌(X为你的体力上限)。", - jiaojie: "狡黠", - jiaojie_info: "锁定技,你的红色牌不计入手牌上限。你使用黑色牌无距离和次数限制。", - dcjiaoxia: "狡黠", - dcjiaoxia_info: - "①出牌阶段开始时,你可以令自己的所有手牌于此阶段均视为【杀】。若如此做,你使用以此法转化的【杀】造成伤害后,你可以使用此牌对应的原卡牌。②出牌阶段,你对你本阶段未使用过【杀】的角色使用【杀】无距离和次数限制。", - dchumei: "狐魅", - dchumei_info: - "出牌阶段各限一次,你可以选择一名体力值不大于X的角色,令其:①摸一张牌。②交给你一张牌。③回复1点体力。(X为你本阶段造成的伤害数)", - buchen: "不臣", - buchen_info: "隐匿技,你于其他角色的回合登场时,可获得当前回合角色的一张牌。", - smyyingshi: "鹰视", - smyyingshi_info: "锁定技,出牌阶段,你可观看牌堆顶的X张牌(X为你的体力上限)。", - xiongzhi: "雄志", - xiongzhi_info: - "限定技,出牌阶段,你可亮出牌堆顶的一张牌并使用之。若如此做,你重复此流程,直到你以此法展示的牌无法使用。", - quanbian: "权变", - quanbian2: "权变", - quanbian_info: - "当你于出牌阶段内使用/打出手牌时,若此牌有花色且你本回合内未使用/打出过该花色的其他手牌,则你可以选择一项:①摸一张牌。②将牌堆顶X张牌中的一张置于牌堆底(X为你的体力上限)。若你发动此技能,则你本回合内不能再使用与此牌花色相同的手牌。", - re_hansui: "新杀韩遂", - re_hansui_prefix: "新杀", - re_quyi: "新杀麴义", - re_quyi_prefix: "新杀", - refuqi: "伏骑", - refuqi_info: "锁定技,当你使用牌时,你令所有距离为1的其他角色不能使用或打出牌响应此牌。", - hanfu: "韩馥", - hfjieying: "节应", - hfjieying2: "节应", - hfjieying3: "节应", - hfjieying_info: - "结束阶段,你可以选择一名其他角色,该角色下回合使用目标数为1的【杀】或普通锦囊牌无距离限制且可多指定一个目标,且当其造成伤害后,其无法再使用牌直到回合结束。", - weipo: "危迫", - weipo_info: - "锁定技,其他角色使用【杀】或普通锦囊牌指定你为目标后,若你的手牌数小于X,则你将手牌摸至X张,并记录摸牌事件结算后的手牌数Y。此牌结算结束后,若你的手牌数小于Y,则你将一张手牌交给此牌的使用者,且此技能失效直到你的下回合开始。(X为你的体力上限且至多为5)", - zhaozhong: "赵忠", - yangzhong: "殃众", - yangzhong_info: - "当你造成或受到伤害后,若受伤角色和伤害来源均存活,则伤害来源可弃置两张牌,然后令受伤角色失去1点体力。", - huangkong: "惶恐", - huangkong_info: - "锁定技,当你于回合外成为【杀】或普通锦囊牌的目标后,若你没有手牌,则你摸两张牌。", - re_taoqian: "陶谦", - reyixiang: "义襄", - reyixiang_info: - "锁定技,其他角色于其出牌阶段内使用的第一张牌对你的伤害-1;其使用的第二张牌若为黑色,则对你无效。", - caosong: "曹嵩", - cslilu: "礼赂", - cslilu_info: - "摸牌阶段,你可以放弃摸牌,改为将手牌摸至X张(X为你的体力上限和5中的最小值),然后将至少一张手牌交给一名其他角色。若你以此法给出的牌数大于你上次以此法给出的牌数,则你加1点体力上限并回复1点体力。", - csyizheng: "翊正", - csyizheng2: "翊正", - csyizheng_info: - "结束阶段开始时,你可以选择一名其他角色。你的下回合开始前,当该角色造成伤害或回复体力时,若其体力上限小于你,则你减1点体力上限,且令此伤害值/回复值+1。", - reyirang: "揖让", - reyirang_info: - "出牌阶段开始时,你可以将所有非基本牌交给一名其他角色。若其体力上限大于你,则你将体力上限调整至与其相同。然后你回复X点体力(X为你以此法交给其的牌数)。", - liangxing: "梁兴", - lulve: "掳掠", - lulve_info: - "出牌阶段开始时,你可选择一名有手牌且手牌数少于你的角色。其选择一项:①将所有手牌交给你,然后你将武将牌翻面。②将武将牌翻面,然后其视为对你使用一张【杀】。", - lxzhuixi: "追袭", - lxzhuixi_info: - "锁定技,当你造成伤害或受到伤害时,若受伤角色的翻面状态和伤害来源的翻面状态不同,则此伤害+1。", - zhangmiao: "张邈", - mouni: "谋逆", - mouni_info: - "准备阶段,你可对一名其他角色依次使用你手牌中所有的【杀】(若其进入了濒死状态,则终止此流程)。然后若这些【杀】中有未造成伤害的【杀】,则你跳过本回合的出牌阶段和弃牌阶段。", - zongfan: "纵反", - zongfan_info: - "觉醒技。结束阶段,若你本回合内因〖谋逆〗使用过【杀】且未跳过本回合的出牌阶段,则你将任意张牌交给一名其他角色,然后加X点体力上限并回复X点体力(X为你以此法给出的牌数且至多为5)。最后失去〖谋逆〗并获得〖战孤〗。", - zhangu: "战孤", - zhangu_info: - "锁定技,准备阶段,若你的体力上限大于1且没有手牌/装备区内没有牌,则你减1点体力上限,然后从牌堆中获得三张类型不同的牌。", - re_niujin: "新杀牛金", - re_niujin_prefix: "新杀", - recuorui: "摧锐", - recuorui_info: "限定技,出牌阶段,你可以依次获得至多X名角色的各一张手牌(X为你的体力值)。", - reliewei: "裂围", - reliewei_info: - "每回合限Y次,当有角色进入濒死状态时,你可以摸一张牌(Y为你的体力值,若当前回合角色为你,则Y为Infinity)。", - duanwei: "段煨", - langmie: "狼灭", - langmie_damage: "狼灭", - langmie_info: - "其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以摸一张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。", - zhangheng: "张横", - dangzai: "挡灾", - dangzai_info: "出牌阶段开始时,你可将一名其他角色判定区内的一张牌移动至你的判定区内。", - liangjue: "粮绝", - liangjue_info: - "锁定技,当有黑色牌进入或者离开你的判定区或装备区后,若你的体力值大于1,你失去1点体力,然后摸两张牌。", - tangji: "唐姬", - kangge: "抗歌", - kangge_info: - "你的第一个回合开始时,选择一名其他角色,该角色每次于其回合外得到牌后,你摸等量的牌(每回合至多摸三张);其进入濒死状态时,你可令其回复体力至1点(每轮限一次)。该角色死亡时,你弃置所有牌并失去1点体力。", - jielie: "节烈", - jielie_info: - "当你受到除自己和“抗歌”角色以外的角色造成的伤害时,你可以防止此伤害并选择一种花色,然后你失去X点体力,令“抗歌”角色从弃牌堆中随机获得X张此花色的牌(X为伤害值)。", - re_dongcheng: "董承", - xuezhao: "血诏", - xuezhao_info: - "出牌阶段限一次,你可弃置一张手牌并选择至多X名其他角色(X为你的体力上限)。这些角色依次选择是否交给你一张牌,若选择是,该角色摸一张牌且你本回合可多使用一张【杀】;若选择否,该角色本回合无法响应你使用的牌。", - re_hucheer: "胡车儿", - redaoji: "盗戟", - redaoji2: "盗戟", - redaoji_info: - "其他角色第一次使用武器牌时,你可选择一项:①获得此牌。②令其本回合内不能使用或打出【杀】。", - fuzhong: "负重", - fuzhong_info: - "锁定技,当你于回合外得到牌后,你获得一枚“重”标记。若X:大于0,你于摸牌阶段开始时令额定摸牌数+1;大于1,你至其他角色的距离-2;大于2,你的手牌上限+3;大于3,结束阶段开始时,你对一名其他角色造成1点伤害,然后移去4枚“重”(X为“重”数)。", - qiuliju: "丘力居", - koulve: "寇略", - koulve_info: - "当你于出牌阶段内对其他角色造成伤害后,你可以展示其X张手牌(X为其已损失的体力值)。若这些牌中:有带有伤害标签的基本牌或锦囊牌,则你获得之;有红色牌,则你失去1点体力(若已受伤则改为减1点体力上限),然后摸两张牌。", - qljsuiren: "随认", - qljsuiren_info: "当你死亡时,你可以将手牌中所有的带有伤害标签的基本牌或锦囊牌交给一名其他角色。", - re_zoushi: "邹氏", - rehuoshui: "祸水", - rehuoshui_info: - "准备阶段,你可以选择至多X名角色(X为你已损失的体力值且至少为1)。你令这些角色中第一名角色的非锁定技失效直到回合结束;第二名角色交给你一张手牌;第三名及之后角色弃置装备区内的所有牌。", - reqingcheng: "倾城", - reqingcheng_info: "出牌阶段限一次,你可以与一名手牌数不大于你的男性角色交换手牌。", - caoanmin: "曹安民", - xianwei: "险卫", - xianwei_info: - "锁定技,准备阶段,你废除一个装备栏并摸X张牌(X为你未废除的装备栏数),然后你可以令一名其他角色对其自己使用一张牌堆中的一张与此装备栏副类别相同的装备牌(没有可使用的牌则改为摸一张牌)。当你废除所有装备栏后,你加2点体力上限,然后你与所有其他角色视为在彼此的攻击范围内。", - dufuren: "杜夫人", - yise: "异色", - yise_info: - "其他角色得到你的牌后,若这些牌中:有红色牌,你可令其回复1点体力;有黑色牌,其下次受到因执行【杀】的效果造成的伤害时,此伤害+1。", - shunshi: "顺世", - shunshi_info: - "准备阶段开始时,或当你受到伤害后,你可将一张牌交给一名不为伤害来源的其他角色并获得如下效果直到你的回合结束:摸牌阶段的额定摸牌数+1,使用【杀】的次数上限+1,手牌上限+1。", - rexingluan: "兴乱", - rexingluan_info: - "出牌阶段限一次,当你使用的仅指定一个目标的牌结算完成后,你可以获得场上一张与此牌点数相同的牌,或获得牌堆中随机一张点数与此牌相同的牌。", - xinxingluan: "兴乱", - xinxingluan_info: - "每回合限一次。当你于出牌阶段内使用牌结算结束后,你可选择一项:①观看牌堆中的两张点数为6的牌并获得其中一张(没有则改为摸六张牌);②令一名其他角色弃置一张点数为6的牌或交给你一张牌;③获得场上的一张点数为6的牌。", - re_nanhualaoxian: "南华老仙", - gongxiu: "共修", - gongxiu_info: - "结束阶段,若你本回合内发动过〖经合〗,则你选择一项:①令所有本回合内成为过〖经合〗目标的角色各摸一张牌;②令所有本回合内未成为过〖经合〗目标的角色各弃置一张手牌。", - jinghe: "经合", - jinghe_info: - "出牌阶段限一次,你可以展示至多四张牌名各不相同的牌并选择等量的角色。系统从“写满技能的天书”中随机选择等量的技能,然后这些角色依次选择获得其中的一个。", - nhyinbing: "阴兵", - nhyinbing_info: "锁定技,你使用的【杀】造成伤害改为失去体力。其他角色失去体力后,你摸一张牌。", - nhhuoqi: "活气", - nhhuoqi_info: - "出牌阶段限一次,你可以弃置一张牌,然后令体力值最少的一名角色回复1点体力并摸一张牌。", - nhguizhu: "鬼助", - nhguizhu_info: "一名角色进入濒死状态时,你可以摸两张牌(每回合限一次)。", - nhxianshou: "仙授", - nhxianshou_info: "出牌阶段限一次,你可以选择一名角色令其摸一张牌。若其未受伤,则多摸一张。", - nhlundao: "论道", - nhlundao_info: - "当你受到伤害后,若伤害来源比你手牌多,你可以弃置其一张牌;若伤害来源比你手牌少,你摸一张牌。", - nhguanyue: "观月", - nhguanyue_info: "结束阶段,你可以观看牌堆顶两张牌,然后获得其中—张,另一张放回牌堆顶。", - nhyanzheng: "言政", - nhyanzheng_info: - "准备阶段,若你的手牌数大于1,你可以保留一张手牌并弃置其余的牌,然后选择至多等于弃牌数量的角色,对这些角色各造成1点伤害。", - sp_mifangfushiren: "糜芳傅士仁", - mffengshi: "锋势", - mffengshi_info: - "当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则此牌的使用者可令你弃置自己和对方的各一张牌,并令此牌的伤害值+1。", - dcmffengshi: "锋势", - dcmffengshi_info: - "当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则你可弃置自己和对方的各一张牌,并令此牌的伤害值+1。", - fengshi: "锋势", - fengshi_info: - "当你使用牌指定第一个目标后,你可弃置你与其中一名手牌数小于你的目标角色的各一张牌,并令此牌对其造成的伤害+1;当你成为其他角色使用牌的目标后,若你的手牌数小于其,则你可以弃置你与其的各一张牌,并令此牌对你造成的伤害+1。", - tongyuan: "童渊", - chaofeng: "朝凤", - chaofeng_info: - "出牌阶段限一次。当你造成伤害时,你可以弃置一张手牌,然后摸一张牌。若此伤害的渠道为牌且你弃置的牌:与此牌颜色相同,则你改为摸两张牌;与此牌类型相同,则此伤害+1。", - chuanshu: "传术", - chuanshu_info: - "限定技。准备阶段,若你已受伤;或当你死亡时,你可令一名其他角色获得〖朝凤〗。然后你获得〖龙胆〗、〖从谏〗和〖穿云〗。", - chuanyun: "穿云", - chuanyun_info: "当你使用【杀】指定目标后,你可令目标角色随机弃置其装备区内的一张牌。", - zhangning: "张宁", - tianze: "天则", - tianze_info: - "①每回合限触发一次。其他角色于其出牌阶段内使用的黑色手牌结算结束后,你可以弃置一张黑色牌,并对其造成1点伤害。②其他角色的判定生效后,若结果为黑色,则你摸一张牌。", - difa: "地法", - difa_info: - "每回合限一次。当你于回合内因摸牌而得到红色牌时,你可以弃置之。然后你选择一个锦囊牌的牌名,并从牌堆中获得一张此牌名的牌。", - xinping: "辛评", - fuyuan: "辅袁", - fuyuan_info: - "当你于回合外使用或打出牌时,若当前回合角色的手牌数:不小于你,你可摸一张牌;小于你,你可令其摸一张牌。", - zhongjie: "忠节", - zhongjie_info: "当你死亡时,你可令一名其他角色加1点体力上限并回复1点体力,然后摸一张牌。", - hanmeng: "韩猛", - jieliang: "截粮", - jieliang_info: - "其他角色的摸牌阶段开始时,你可弃置一张牌,令其本阶段的摸牌数和本回合的手牌上限-1。然后当其于本回合的弃牌阶段内因弃置而失去牌后,你可获得其中的一张。", - quanjiu: "劝酒", - quanjiu_info: - "锁定技。①你手牌区中的【酒】的牌名视为【杀】。②你使用对应的实体牌为一张【酒】的非转化【杀】不计入次数限制。", - re_pangdegong: "庞德公", - heqia: "和洽", - heqia_info: - "出牌阶段开始时,你可选择一项:①将任意张牌交给一名其他角色。②令一名有手牌的其他角色交给你任意张牌。然后以此法得到牌的角色可以将一张手牌当作任意基本牌使用,且当其声明使用此牌后,可以为此牌增加至至多X个目标(X为以此法移动的牌数)。", - yinyi: "隐逸", - yinyi_info: - "锁定技。每回合限一次,当你受到非属性伤害时,若你的手牌数和体力值与伤害来源均不相同,则你防止此伤害。", - haomeng: "郝萌", - xiongmang: "雄莽", - xiongmang_info: - "你可将任意张花色各不相同的手牌当做目标数上限为X的【杀】使用(X为此【杀】对应的实体牌数)。此【杀】使用结算结束后,若你未造成过渠道为此牌的伤害且体力上限大于1,则你减1点体力上限。", - yanfuren: "严夫人", - channi: "谗逆", - channi_info: - "出牌阶段限一次。你可将任意张手牌交给一名其他角色,然后其可以将至多等量的手牌当做【决斗】使用。若其因此【决斗】造成了伤害,则其摸X张牌(X为此【决斗】对应的实体牌数)。若其因此【决斗】受到过伤害,则你弃置所有手牌。", - nifu: "匿伏", - nifu_info: "锁定技。一名角色的回合结束时,你将手牌摸至或弃置至三张。", - licaiwei: "李采薇", - yijiao: "异教", - yijiao_info: - "出牌阶段限一次,你可以选择一名没有“异”标记的其他角色并声明一个整数X(X∈[1,4]),该角色获得10X个“异”标记。有“异”标记的角色的结束阶段,其移去“异”标记,且若其本回合使用牌的点数之和:1.小于“异”标记数,其随机弃置至多三张手牌;2.等于“异”标记数,你摸两张牌且该角色本回合结束后进行一个额外的回合;3.大于“异”标记数,你摸三张牌。", - qibie: "泣别", - qibie_info: - "一名角色死亡后,若你有手牌且这些手牌均可被弃置,则你可以弃置所有手牌,然后回复1点体力并摸X+2张牌(X为你弃置的牌数)。", - dc_zhuling: "朱灵", - dczhanyi: "战意", - dczhanyi_info: - "出牌阶段开始时,你可以弃置所有基本牌/锦囊牌/装备牌,然后获得另外两种类型的牌对应的效果直到你的下个回合开始:基本牌、你使用基本牌无距离限制,且伤害值和回复值基数+1;锦囊牌、你使用锦囊牌时摸一张牌,且锦囊牌不计入手牌上限;装备牌,当装备牌进入你的装备区时,你可弃置一名其他角色的一张牌。", - yanrou: "阎柔", - choutao: "仇讨", - choutao_info: - "当你使用【杀】时,或成为【杀】的目标后,你可以弃置此【杀】使用者的一张牌,令此【杀】不可被响应。若你是此【杀】的使用者,则你令此【杀】不计入次数限制。", - xiangshu: "襄戍", - xiangshu_info: - "限定技。结束阶段开始时,若你本回合内造成过伤害,则你可以选择一名已受伤的角色。该角色回复X点体力并摸X张牌(X为你本回合内造成的伤害值总和且至多为5)。", - qinyilu: "秦宜禄", - piaoping: "漂萍", - piaoping_info: - "转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)", - tuoxian: "托献", - tuoxian_info: - "每局游戏限一次。当你因执行〖漂萍〗的效果而弃置牌后,你可令一名其他角色获得这些牌,然后令该角色选择一项:⒈弃置区域内等量的牌。⒉令你的〖漂萍〗失效直到回合结束。", - chuaili: "惴栗", - chuaili_info: - "锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。", - fengfang: "冯方", - dcditing: "谛听", - dcditing_info: - "其他角色的出牌阶段开始时,若你在该角色的攻击范围内,则你可以观看其的X张手牌(X为你的体力值)并选择其中一张,且获得如下效果:①当其使用对应实体牌包含此牌的牌指定你为目标后,你令此牌对你无效。②当其使用对应实体牌包含此牌的牌结算结束后,若你不是此牌的目标,则你摸两张牌。③其出牌阶段结束时,若此牌位于其的手牌区,则你获得此牌。", - dcbihuo: "避祸", - dcbihuo_info: - "①当你受到其他角色造成的伤害后,你可令一名角色下回合摸牌阶段的额定摸牌数+1。②当你对其他角色造成伤害后,你可令一名角色下回合摸牌阶段的额定摸牌数-1。", - bianxi: "卞喜", - dunxi: "钝袭", - dunxi_info: - "①当你使用具有伤害标签的牌时,你可以令一名不为你的目标角色获得一枚“钝”。②有“钝”的角色使用基本牌或锦囊牌时,若此牌目标数为1且此时没有角色处于濒死状态,你令其移去一枚“钝”。系统随机选择一名角色,并将此牌的目标改为该角色。若该角色和原目标相同,则其失去1点体力。若其正处于出牌阶段内,则结束此阶段。", - niufu: "牛辅", - dcxiaoxi: "宵袭", - dcxiaoxi_info: - "锁定技。出牌阶段开始时,你声明X并减X点体力上限(X∈[1,2])。然后你选择一名攻击范围内的其他角色并选择一项:⒈获得该角色的X张牌。⒉视为对其使用X张【杀】。", - xiongrao: "熊扰", - xiongrao_info: - "限定技。准备阶段开始时,你可以选择所有其他角色。这些角色本回合内所有不为锁定技、限定技、觉醒技的普通技能失效。然后你将体力上限增加至7点并摸X张牌(X为你以此法增加的体力上限数)。", - dc_huban: "胡班", - dcchongyi: "崇义", - dcchongyi_info: - "①一名角色使用【杀】时,若此牌是其于当前出牌阶段内使用的第一张牌,则你可以令其摸两张牌,且其本回合使用【杀】的次数上限+1。②一名角色的出牌阶段结束时,若其于此阶段内使用的最后一张牌为【杀】,则你可以令其本回合的手牌上限+1,然后你获得此【杀】。", - wangwei: "王威", - dcruizhan: "锐战", - dcruizhan_info: - "其他角色的准备阶段开始时,若其的手牌数不小于其体力值,则你可以和其拼点。若你赢或拼点牌中有【杀】,则你视为对其使用一张【杀】。然后若此【杀】造成了伤害且以上两个条件均被满足,则你获得其一张牌。", - dcshilie: "示烈", - dcshilie_info: - "①出牌阶段限一次。你可以选择一项:⒈回复1点体力,将两张牌置于武将牌上作为“示烈”。若“示烈”牌数大于存活人数,则你将最早的多余牌置入弃牌堆;⒉失去1点体力,获得两张“示烈”牌。(满血则不回血,无牌则不移动)②当你死亡时,你可以将所有“示烈”牌交给一名不为伤害来源的其他角色。", - dc_zhaoyǎn: "赵俨", - dcfuning: "抚宁", - dcfuning_info: - "当你使用牌时,你可以摸两张牌,然后弃置X张牌(X为你本回合内发动过〖抚宁〗的次数)。", - dcbingji: "秉纪", - dcbingji_info: - "出牌阶段每种花色各限一次。若你有手牌且这些牌的花色均相同,则你可以展示手牌,然后选择一名其他角色,视为对其使用一张【杀】或【桃】(有距离限制)。", - mushun: "穆顺", - dcjinjian: "劲坚", - dcjinjian_info: - "①当你受到其他角色造成的伤害后或造成伤害后,你获得一枚“劲”。然后你可以和伤害来源拼点,若你赢,你恢复1点体力。②你的攻击范围+X(X为“劲”数)。", - dcshizhao: "失诏", - dcshizhao_info: - "锁定技。每回合限一次,当你于回合外失去手牌后,若你没有手牌,且你:有“劲”,则你移去一枚“劲”并摸两张牌;没有“劲”,则你本回合下一次受到的伤害+1。", - liyixiejing: "李异谢旌", - dcdouzhen: "斗阵", - dcdouzhen_info: - "锁定技。①转换技。你的回合内,阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。", - dc_hujinding: "新杀胡金定", - dc_hujinding_prefix: "新杀", - dcdeshi: "德释", - dcdeshi_info: - "锁定技。当你受到【杀】的伤害时,若你已受伤,则你防止此伤害并令系统从弃牌堆/牌堆中检索一张【杀】,你获得此【杀】,然后减1点体力上限。", - dcwuyuan: "武缘", - dcwuyuan_info: - "出牌阶段限一次。你可将一张【杀】交给一名其他角色,然后你回复1点体力,你与其各摸一张牌。若此【杀】为:红色【杀】,其回复1点体力;属性【杀】,其改为摸两张牌。", - shiyi: "是仪", - dccuichuan: "榱椽", - dccuichuan_info: - "出牌阶段限一次。你可以弃置一张手牌并选择一名角色,其随机使用牌堆里一张其空置装备栏对应副类别且其能对其使用的装备牌,你摸X张牌(X为其装备区里的牌数)。然后若其装备区里的牌数增加至四张,你失去〖榱椽〗,获得〖佐谏〗,且令其获得一个额外回合。", - dczhengxu: "正序", - dczhengxu_info: - "每回合每项限一次。①当你受到伤害时,若你本回合失去过牌,你可以防止此伤害。②当你失去牌后,若你本回合受到过伤害,你可以摸等量的牌。", - dczuojian: "佐谏", - dczuojian_info: - "出牌阶段结束时,若你于此阶段使用过的牌数不小于体力值,你可以选择一项:1.令装备区牌数多于你的角色各摸一张牌;2.弃置装备区牌数少于你的角色各一张手牌。", - sunlang: "孙狼", - dctingxian: "铤险", - dctingxian_info: - "每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后令此【杀】对其中至多X个目标无效(X为你装备区的牌数+1)。", - dcbenshi: "奔矢", - dcbenshi_info: - "锁定技。①你的攻击范围+1。②你的攻击范围基数不受装备区内武器牌的影响。③由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。", - sunhuan: "孙桓", - dcniji: "逆击", - dcniji_info: - "①当你成为非装备牌的目标后,你可以摸一张牌,称为“逆击”。②一名角色的结束阶段,你可以使用一张“逆击”牌,然后弃置所有“逆击”牌。", - //dc_fuwan:'新杀伏完', - //dc_fuwan_prefix:'新杀', - //dc_fuwan_ab:'伏完', - dcmoukui: "谋溃", - dcmoukui_info: - "当你使用【杀】指定第一个目标后,你可以选择任意项:1.摸一张牌;2.弃置其中一个目标角色一张牌。若你均选择,当此【杀】被无效后或被抵消后,该角色弃置你一张牌。", - guānning: "关宁", - dcxiuwen: "修文", - dcxiuwen_info: "当你使用牌时,若你未记录此牌牌名,你可以记录之并摸一张牌。", - oldlongsong: "龙诵", - oldlongsong_info: - "出牌阶段开始时,你可以将一张手牌交给一名其他角色。然后其须选择其所有的发动时机为出牌阶段内的空闲时间点且你至多能于此阶段发动一次的技能,其于此阶段这些技能失效,你获得这些技能。", - dclongsong: "龙诵", - dclongsong_info: - "出牌阶段开始时,你可以将一张红色牌交给一名其他角色。然后其须选择其所有的发动时机包含“出牌阶段”的技能,其于此阶段这些技能失效,你获得这些技能且至多可以发动一次。", - longsong: "龙诵", - longsong_info: - "出牌阶段开始时,你可以将一张红色牌交给一名其他角色或获得一名其他角色的一张红色牌,然后你本阶段获得其所有的发动时机包含“出牌阶段”的技能且至多可以发动一次,若其没有符合条件的技能,则改为随机获得一个满足条件的技能。", - dc_mengda: "孟达", - dclibang: "利傍", - dclibang_info: - "出牌阶段限一次。你可以弃置一张牌,正面向上获得两名其他角色的各一张牌。然后你判定,若结果与这两张牌的颜色均不同,你交给其中一名角色两张牌或失去1点体力,否则你获得判定牌并视为对其中一名角色使用一张【杀】。", - dcwujie: "无节", - dcwujie_info: - "锁定技。①你使用无色牌无任何次数限制且无距离限制。②当其他角色执行杀死你的奖惩而摸牌或弃牌时,取消之。", - dc_jsp_guanyu: "新杀SP关羽", - dc_jsp_guanyu_prefix: "新杀SP", - dcdanji: "单骑", - dcdanji_info: - "觉醒技。准备阶段,若你区域内的牌数大于体力值,你减1点体力上限,将体力回复至体力上限并摸等同于体力值的牌,然后获得〖马术〗和〖怒嗔〗。", - dcnuchen: "怒嗔", - dcnuchen_info: - "出牌阶段限一次。你可以展示一名其他角色的一张手牌,然后选择一项:1.弃置任意张该花色的牌,对其造成等量伤害;2.获得该角色手牌中所有此花色的牌。", - dc_jikang: "新杀嵇康", - dc_jikang_prefix: "新杀", - dcjuexiang: "绝响", - dcjuexiang_info: - "当你死亡时,杀死你的角色弃置其装备区内的所有牌并失去1点体力,然后你可以令一名其他角色获得〖残韵〗。", - dccanyun: "残韵", - dccanyun_info: - "每名角色限一次。出牌阶段,你可以弃置一张牌并选择一名其他角色,然后若其装备区里的牌数:小于你,其回复1点体力;大于你,其失去1点体力;等于你,其摸一张牌。若你的体力值为1,你摸一张牌。", - mp_liuling: "刘伶", - mpjiusong: "酒颂", - mpjiusong_info: - "①你可以将一张锦囊牌当【酒】使用。②当一名角色使用【酒】时,你获得1枚“醉”标记(“醉”数至多为3)。", - mpmaotao: "酕醄", - mpmaotao_info: - "当其他角色使用基本牌或普通锦囊牌指定唯一目标时,你可以移去1枚“醉”,令此牌的目标改为随机一名合法角色(无距离限制)。若目标角色与原目标相同且你本回合未以此法获得过牌,你从牌堆中随机获得一张锦囊牌。", - mpbishi: "避世", - mpbishi_info: "锁定技。你不能成为伤害类锦囊牌的目标。", - star_caoren: "星曹仁", - star_caoren_prefix: "星", - starsujun: "肃军", - starsujun_info: "当你使用一张牌时,若你手牌中的基本牌和非基本牌的牌数相等,你可以摸两张牌。", - starlifeng: "砺锋", - starlifeng_info: - "你可以将一张本回合未有角色使用过的颜色的手牌当做不计入次数的【杀】或【无懈可击】使用。", - star_yuanshu: "星袁术", - star_yuanshu_prefix: "星", - starcanxi: "残玺", - starcanxi_wangsheng: "妄生", - starcanxi_xiangsi: "向死", - starcanxi_cancel: "向死", - starcanxi_info: - "锁定技。①游戏开始时,你获得场上所有角色的势力对应的“玺角”标记。②一轮游戏开始时,你选择一个“玺角”对应势力并选择以下一项:1.妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1;2.向死:本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。", - starpizhi: "圮秩", - starpizhi_info: - "锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记且你本轮发动〖向死〗的势力与其相同,你失去之并摸X张牌。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)", - starzhonggu: "冢骨", - starzhonggu_info: - "主公技,锁定技。摸牌阶段,若游戏轮数大于等于场上的群势力角色数,则你额外摸两张牌,否则你少摸一张牌。", - star_dongzhuo: "星董卓", - star_dongzhuo_prefix: "星", - starweilin: "威临", - starweilin_info: - "锁定技。当你于回合内对一名其他角色造成伤害时,若其本回合未受到过伤害,且你本回合使用的牌数大于等于其体力值,则此伤害+1。", - starzhangrong: "掌戎", - starzhangrong_info: - "准备阶段,你可以选择令至多X名体力值大于等于你的角色各失去1点体力或令至多X名手牌数大于等于你的角色各弃置一张手牌(X为你的体力值)。若如此做,你摸等同于选择角色数的牌,且本回合结束时,若这些角色中存在本回合未受到过伤害的角色,则你失去1点体力。", - starhaoshou: "豪首", - //starhaoshou_info:'主公技。①其他群势力角色使用【酒】结算完毕后,其可以令你回复1点体力。②当你处于濒死状态时,其他群势力角色可以将【酒】当作【桃】对你使用。', - starhaoshou_info: "主公技。其他群势力角色使用【酒】结算完毕后,其可以令你回复1点体力。", - star_yuanshao: "星袁绍", - star_yuanshao_prefix: "星", - starxiaoyan: "硝焰", - starxiaoyan_info: - "锁定技,游戏开始时,你对所有其他角色各造成1点火属性伤害,然后这些角色可依次交给你一张牌并回复1点体力。", - starzongshi: "纵势", - starzongshi_info: - "出牌阶段,你可以展示一张可展示目标的基本牌或普通锦囊牌,然后你将手牌中所有与此牌花色相同的其他牌当作此牌使用(无距离限制),且此牌至多指定转化牌数的目标。", - starjiaowang: "骄妄", - starjiaowang_info: - "锁定技,非首轮游戏开始时,若上一轮没有角色死亡(因〖硝焰〗死亡的角色除外),则你失去1点体力并发动〖硝焰〗。", - staraoshi: "傲势", - staraoshi_info: - "主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张手牌,然后你可以发动一次〖纵势〗。", - star_zhangchunhua: "星张春华", - star_zhangchunhua_prefix: "星", - starliangyan: "梁燕", - starliangyan_info: - "出牌阶段限一次。你可以选择一名其他角色,你摸/弃置至多两张牌,令其弃置/摸等量的牌。然后若你与其手牌数相同,以此法摸牌的角色跳过其下一个弃牌阶段。", - starminghui: "明慧", - starminghui_info: - "一名角色的回合结束时,若你的手牌数:最少,你可以视为使用一张无距离限制的【杀】;最多,你可以将手牌弃置至你手牌数不为最多,然后令一名角色回复1点体力。", - liqueguosi: "李傕郭汜", - xiongsuan: "凶算", - xiongsuan_info: - "出牌阶段限一次,你可以弃置一张手牌并对一名角色造成1点伤害,然后你摸三张牌。若该角色不为你,你失去1点体力。", - star_sunjian: "星孙坚", - star_sunjian_prefix: "星", - starruijun: "锐军", - starruijun_info: "当你于出牌阶段首次使用牌指定其他角色为目标后,若目标角色数为1,你可以摸X张牌(X为你已损失的体力值+1)。直到此阶段结束,所有不为其的其他角色均不在你的攻击范围内,且当你对其造成伤害时,此伤害值改为Y(Y为你本回合上一次对其造成过的伤害值+1,至多为5)。", - stargangyi: "刚毅", - stargangyi_info: "锁定技。①你的回合内,若你本回合没有造成过伤害,你不能使用【桃】。②当你处于濒死状态时,以你为目标的【桃】或【酒】的回复值+1。", - - sp_whlw: "文和乱武", - sp_zlzy: "逐鹿中原", - sp_longzhou: "同舟共济", - sp_zizouqi: "自走棋", - sp_sbfm: "上兵伐谋", - sp_shengun: "三国奇人传", - sp_guandu: "官渡之战", - sp_huangjin: "列传·黄巾之乱", - sp_fadong: "列传·诸侯伐董", - sp_xuzhou: "列传·徐州风云", - sp_qihuan: "戚宦之争", - sp_zhongyuan: "列传·中原狼烟", - sp_binglin: "兵临城下", - sp_xiaohu: "列传·虓虎悲歌", - sp_fenghuo: "烽火连天", - sp_danqi: "千里单骑", - sp_star: "将星系列", - mini_qixian: "小程序·竹林七贤", - sp2_waitforsort: "等待分包", - }, - pinyins: { - 卑弥呼: ["Himiko"], - }, - }; -}); diff --git a/character/sp2/card.js b/character/sp2/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/sp2/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/sp2/character.js b/character/sp2/character.js new file mode 100644 index 000000000..945ce3578 --- /dev/null +++ b/character/sp2/character.js @@ -0,0 +1,96 @@ +const characters = { + star_sunjian: ["male", "qun", "4/5", ["starruijun", "stargangyi"]], + liqueguosi: ["male", "qun", 4, ["xiongsuan"]], + star_zhangchunhua: ["female", "wei", 3, ["starliangyan", "starminghui"]], + star_yuanshao: ["male", "qun", 4, ["starxiaoyan", "starzongshi", "starjiaowang", "staraoshi"], ["zhu"]], + star_dongzhuo: ["male", "qun", 5, ["starweilin", "starzhangrong", "starhaoshou"], ["zhu"]], + star_yuanshu: ["male", "qun", 4, ["starcanxi", "starpizhi", "starzhonggu"], ["zhu"]], + star_caoren: ["male", "wei", 4, ["starsujun", "starlifeng"]], + mp_liuling: ["male", "jin", 3, ["mpjiusong", "mpmaotao", "mpbishi"], ["doublegroup:wei:qun:jin"]], + dc_jikang: ["male", "wei", 3, ["new_qingxian", "dcjuexiang"]], + dc_jsp_guanyu: ["male", "wei", 4, ["new_rewusheng", "dcdanji"]], + dc_mengda: ["male", "wei", 4, ["dclibang", "dcwujie"]], + //dc_fuwan:['male','qun',4,['dcmoukui']], + guānning: ["male", "shu", 3, ["dcxiuwen", "longsong"]], + sunhuan: ["male", "wu", 4, ["dcniji"]], + sunlang: ["male", "shu", 4, ["dctingxian", "dcbenshi"]], + shiyi: ["male", "wu", 3, ["dccuichuan", "dczhengxu"]], + dc_hujinding: ["female", "shu", "3/6", ["dcdeshi", "dcwuyuan", "huaizi"]], + liyixiejing: ["male", "wu", 4, ["dcdouzhen"]], + mushun: ["male", "qun", 4, ["dcjinjian", "dcshizhao"]], + dc_zhaoyǎn: ["male", "wei", 3, ["dcfuning", "dcbingji"]], + wangwei: ["male", "qun", 4, ["dcruizhan", "dcshilie"]], + dc_huban: ["male", "wei", 4, ["dcchongyi"]], + niufu: ["male", "qun", "4/7", ["dcxiaoxi", "xiongrao"]], + bianxi: ["male", "wei", 4, ["dunxi"]], + fengfang: ["male", "qun", 3, ["dcditing", "dcbihuo"]], + qinyilu: ["male", "qun", 3, ["piaoping", "tuoxian", "chuaili"]], + yanrou: ["male", "wei", 4, ["choutao", "xiangshu"]], + dc_zhuling: ["male", "wei", 4, ["dczhanyi"]], + licaiwei: ["female", "wei", 3, ["yijiao", "qibie"]], + yanfuren: ["female", "qun", 3, ["channi", "nifu"]], + haomeng: ["male", "qun", 7, ["xiongmang"]], + re_pangdegong: ["male", "qun", 3, ["heqia", "yinyi"]], + hanmeng: ["male", "qun", 4, ["jieliang", "quanjiu"]], + xinping: ["male", "qun", 3, ["fuyuan", "zhongjie", "yongdi"]], + zhangning: ["female", "qun", 3, ["tianze", "difa"]], + tongyuan: ["male", "qun", 4, ["chaofeng", "chuanshu"]], + sp_mifangfushiren: ["male", "shu", 4, ["fengshi"]], + re_nanhualaoxian: ["male", "qun", 4, ["gongxiu", "jinghe"]], + dufuren: ["female", "wei", 3, ["yise", "shunshi"]], + caoanmin: ["male", "wei", 4, ["xianwei"]], + re_zoushi: ["female", "qun", 3, ["rehuoshui", "reqingcheng"]], + qiuliju: ["male", "qun", "4/6", ["koulve", "qljsuiren"]], + re_hucheer: ["male", "qun", 4, ["redaoji", "fuzhong"]], + re_dongcheng: ["male", "qun", 4, ["xuezhao"]], + tangji: ["female", "qun", 3, ["kangge", "jielie"]], + zhangheng: ["male", "qun", 8, ["dangzai", "liangjue"]], + duanwei: ["male", "qun", 4, ["langmie"]], + re_niujin: ["male", "wei", 4, ["recuorui", "reliewei"]], + zhangmiao: ["male", "qun", 4, ["mouni", "zongfan"]], + liangxing: ["male", "qun", 4, ["lulve", "lxzhuixi"]], + caosong: ["male", "wei", 4, ["cslilu", "csyizheng"]], + re_taoqian: ["male", "qun", 3, ["zhaohuo", "reyixiang", "reyirang"]], + zhaozhong: ["male", "qun", 6, ["yangzhong", "huangkong"]], + hanfu: ["male", "qun", 4, ["hfjieying", "weipo"]], + re_quyi: ["male", "qun", 4, ["refuqi", "jiaozi"]], + dongxie: ["female", "qun", 4, ["dcjiaoxia", "dchumei"]], + wangrong: ["female", "qun", 3, ["minsi", "jijing", "zhuide"]], + ol_dingyuan: ["male", "qun", 4, ["cixiao", "xianshuai"]], + re_hejin: ["male", "qun", 4, ["spmouzhu", "spyanhuo"]], + re_hansui: ["male", "qun", 4, ["spniluan", "spweiwu"]], + liuhong: ["male", "qun", 4, ["yujue", "tuxing"]], + zhujun: ["male", "qun", 4, ["gongjian", "kuimang"]], + re_maliang: ["male", "shu", 3, ["rexiemu", "heli"], []], + caobuxing: ["male", "wu", 3, ["moying", "juanhui"], []], + lijue: ["male", "qun", "4/6", ["xinfu_langxi", "xinfu_yisuan"], []], + zhangji: ["male", "qun", 4, ["xinfu_lveming", "xinfu_tunjun"], []], + fanchou: ["male", "qun", 4, ["xinxingluan"], []], + guosi: ["male", "qun", 4, ["xinfu_tanbei", "xinfu_sidao"], []], + lvkai: ["male", "shu", 3, ["xinfu_tunan", "xinfu_bijing"], []], + zhanggong: ["male", "wei", 3, ["xinfu_zhenxing", "xinfu_qianxin"], []], + weiwenzhugezhi: ["male", "wu", 4, ["xinfu_fuhai"], []], + beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia"]], + xurong: ["male", "qun", 4, ["xinfu_xionghuo", "xinfu_shajue"], []], + zhangqiying: ["female", "qun", 3, ["xinfu_falu", "xinfu_dianhua", "xinfu_zhenyi"], []], + sp_liuqi: ["male", "qun", 3, ["rewenji", "sptunjiang"]], + xf_tangzi: ["male", "wei", 4, ["xinfu_xingzhao"], []], + xf_huangquan: ["male", "shu", 3, ["xinfu_dianhu", "xinfu_jianji"], []], + xf_sufei: ["male", "wu", 4, ["xinfu_lianpian"], []], + xushao: ["male", "qun", 4, ["pingjian"]], + xinpi: ["male", "wei", 3, ["xpchijie", "yinju"]], + lisu: ["male", "qun", 2, ["lslixun", "lskuizhu"]], + zhangwen: ["male", "wu", 3, ["songshu", "sibian"]], + mangyachang: ["male", "qun", 4, ["spjiedao"], []], + xugong: ["male", "wu", 3, ["biaozhao", "yechou"], []], + zhangchangpu: ["female", "wei", 3, ["yanjiao", "xingshen"], []], + gaolan: ["male", "qun", 4, ["xiying"]], + sp_shenpei: ["male", "qun", 3, ["gangzhi", "beizhan"]], + xunchen: ["male", "qun", 3, ["fenglve", "mouzhi"], ["clan:颍川荀氏"]], + sp_zhanghe: ["male", "qun", 4, ["yuanlve"]], + sp_xuyou: ["male", "qun", 3, ["spshicai", "spfushi"]], + chunyuqiong: ["male", "qun", 5, ["cangchu", "sushou", "liangying"]], + lvkuanglvxiang: ["male", "qun", 4, ["liehou", "qigong"]], +}; + +export default characters; diff --git a/character/sp2/characterFilter.js b/character/sp2/characterFilter.js new file mode 100644 index 000000000..e96476582 --- /dev/null +++ b/character/sp2/characterFilter.js @@ -0,0 +1,10 @@ +const characterFilters = { + chunyuqiong(mode) { + return mode != "identity" && mode != "guozhan"; + }, + sp_xuyou(mode) { + return mode == "versus" && ["guandu", "4v4", "four"].includes(_status.mode); + }, +}; + +export default characterFilters; diff --git a/character/sp2/characterReplace.js b/character/sp2/characterReplace.js new file mode 100644 index 000000000..37d3fcc26 --- /dev/null +++ b/character/sp2/characterReplace.js @@ -0,0 +1,38 @@ +const characterReplaces = { + lijue: ["lijue", "ns_lijue"], + fanchou: ["fanchou", "tw_fanchou", "ns_fanchou"], + zhangji: ["zhangji", "ns_zhangji"], + zhangchangpu: ["ol_zhangchangpu", "zhangchangpu", "sp_zhangchangpu"], + huangfusong: ["huangfusong", "sp_huangfusong", "jsrg_huangfusong", "old_huangfusong"], + dingyuan: ["ol_dingyuan", "dingyuan"], + quyi: ["quyi", "re_quyi"], + hansui: ["hansui", "re_hansui", "xin_hansui", "jsrg_hansui"], + jin_simashi: ["dc_simashi", "jin_simashi", "simashi"], + jin_yanghuiyu: ["jin_yanghuiyu", "yanghuiyu"], + taoqian: ["re_taoqian", "taoqian"], + jsp_liubei: ["jsrg_liubei", "jsp_liubei"], + dongcheng: ["re_dongcheng", "dongcheng"], + hucheer: ["re_hucheer", "hucheer", "tw_hucheer"], + nanhualaoxian: ["re_nanhualaoxian", "nanhualaoxian", "jsrg_nanhualaoxian"], + pangdegong: ["re_pangdegong", "pangdegong"], + zhujun: ["ol_zhujun", "zhujun", "sp_zhujun", "jsrg_zhujun"], + tw_liuhong: ["liuhong", "tw_liuhong", "jsrg_liuhong"], + re_hejin: ["hejin", "re_hejin", "tw_hejin", "jsrg_hejin"], + hujinding: ["dc_hujinding", "ol_hujinding", "hujinding"], + caosong: ["caosong", "sp_caosong"], + re_niujin: ["niujin", "re_niujin", "tw_niujin"], + haomeng: ["haomeng", "tw_haomeng"], + zhangning: ["zhangning", "tw_zhangning"], + caoanmin: ["caoanmin", "ns_caoanmin"], + duanwei: ["duanwei", "junk_duanwei"], + xushao: ["xushao", "jsrg_xushao"], + huban: ["ol_huban", "dc_huban", "mb_huban"], + mengda: ["ol_mengda", "dc_mengda", "pe_mengda"], + jsp_guanyu: ["jsp_guanyu", "dc_jsp_guanyu", "jsrg_guanyu"], + mushun: ["mushun", "sp_mushun"], + wangjun: ["dc_wangjun", "wangjun"], + zoushi: ["re_zoushi", "jsrg_zoushi"], + zhangmancheng: ["dc_zhangmancheng", "tw_zhangmancheng"], +}; + +export default characterReplaces; diff --git a/character/sp2/dynamicTranslate.js b/character/sp2/dynamicTranslate.js new file mode 100644 index 000000000..166179002 --- /dev/null +++ b/character/sp2/dynamicTranslate.js @@ -0,0 +1,25 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + mubing(player) { + if (player.storage.mubing2) return "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。"; + return "出牌阶段开始时,你可以亮出牌堆顶的三张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。"; + }, + piaoping(player) { + if (player.storage.piaoping) return '转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)'; + return '转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)'; + }, + chuaili(player) { + if (!player.hasSkill("piaoping", null, null, false)) return "锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。"; + if (player.storage.piaoping) return '锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。'; + return '锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。'; + }, + dcdouzhen(player) { + var str = "锁定技。①转换技。你的回合内,"; + if (player.countMark("dcdouzhen") % 2) str += '阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。'; + else str += '阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。'; + return str; + }, +}; + +export default dynamicTranslates; diff --git a/character/sp2/index.js b/character/sp2/index.js new file mode 100644 index 000000000..ebaedbb18 --- /dev/null +++ b/character/sp2/index.js @@ -0,0 +1,37 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "sp2", + connect: true, + character: { ...characters }, + characterSort: { + sp2: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: { + chunyuqiong: "#b对决限定武将", + sp_xuyou: "#g4v4限定武将", + }, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/sp2/intro.js b/character/sp2/intro.js new file mode 100644 index 000000000..da1b541bd --- /dev/null +++ b/character/sp2/intro.js @@ -0,0 +1,69 @@ +const characterIntro = { + tangji: "唐姬,会稽太守唐瑁女,弘农怀王刘辩的妃子。刘辩死后,唐姬回归故里,因节烈不愿改嫁他人,后被汉献帝下诏封为弘农王妃。", + lijue: "李傕(一说“傕”读音“què”)(?—198年),字稚然。北地郡泥阳县(今陕西省耀县)人,汉末群雄之一。东汉末年汉献帝时的军阀、权臣,官至大司马、车骑将军、开府、领司隶校尉、假节。
    李傕本为董卓部将,后被董卓的女婿牛辅派遣至中牟与朱儁交战,大破朱儁,进而至陈留、颍川等地劫掠。初平三年(192年)董卓和牛辅被杀后,李傕归无所依,于是采用贾诩之谋,伙同郭汜、张济、樊稠等原董卓部曲将攻向长安。击败吕布,杀死王允等人,占领长安,把持朝廷大权。后诸将不和,李傕在会议上杀死了樊稠,又与郭汜分别劫持了汉献帝和众臣,相互交战,张济率兵赶来和解,于是二人罢兵,李傕出屯池阳黄白城,郭汜、张济等人随汉献帝东归前往弘农。
    后来,李傕、郭汜、张济反悔,联合起来追击汉献帝,与杨奉、董承等人几番交战。汉献帝一路逃亡,狼狈不堪,到达安邑,与李傕等人讲和。不久,汉献帝被曹操迎往许都。建安三年(198年),曹操派谒者仆射裴茂召集关西诸将段煨等人征讨李傕,灭其三族。", + zhangji: "张济(?-196年),武威郡祖厉县(今甘肃靖远东南)人。东汉末年割据军阀之一。 张济原为董卓部将,董卓被诛杀后,张济与李傕一同率军攻破长安,任中郎将。不久,升任镇东将军,封平阳侯,出屯弘农。献帝东迁时,张济升任骠骑将军,率军护卫献帝,后来因与董承等人有矛盾,便与李傕、郭汜一同追赶献帝。 建安元年(196年),张济因军队缺粮而进攻穰城,中流矢而死。死后,部队由侄儿张绣接管。", + guosi: "郭汜(?-197年),又名郭多,凉州张掖(今甘肃张掖西北)人,东汉末年将领、军阀,献帝时权臣。原为董卓部下。董卓被杀后,凉州众将归无所依,于是采用贾诩之谋,联兵将攻向长安,击败吕布,杀死王允等人,占领长安,把持朝廷大权。几年后,郭汜被部将伍习杀死。", + fanchou: "樊稠(?—195年),凉州金城(治今甘肃永靖西北)人。东汉末年军阀、将领。官至右将军,封万年侯。 原为董卓部将,董卓死后,伙同李傕、郭汜、张济等人合众十余万反扑长安,败吕布、杀王允,把持朝政。后马腾因与李傕有隙,于是联合韩遂举兵进攻,李傕派樊稠、郭汜等与其交战,大败马腾、韩遂于长平观下。樊稠追至陈仓,与韩遂友好罢兵,却遭李傕猜疑。兴平二年(195年),李傕让外甥骑都尉胡封在会议上将樊稠刺死(一说趁醉用杖击杀)。", + lvkai: "吕凯(?―225年),字季平,永昌郡不韦县(今云南保山东北)人,三国时期蜀汉官员。初任永昌郡五官掾功曹。章武三年(223年),建宁太守雍闿反叛,投降吴国,吴国任雍闿为永昌太守,吕凯闭境抗拒雍闿。建兴三年(225年),丞相诸葛亮南征,表奏吕凯功劳,任命他为云南太守,封阳迁亭侯。吕凯还未上任,便被叛乱的少数民族杀害。", + zhanggong: "张恭(生卒年不详),三国时期魏国大臣,与子张就一同闻名于西域。官至西域戊己校尉、关内侯,赠执金吾。初为敦煌郡功曹。东汉末河西大乱,太守马艾卒官,他被众人推为代理长史,遂派儿子张就请曹操委任太守,直至新太守到任。魏文帝时拜西域戊己校尉。魏明帝时去世。", + weiwenzhugezhi: "卫温 (?—231年),三国时期东吴将领,曾任将军职。诸葛直(?—231年),三国时期东吴将领。黄龙二年(230年)正月,孙权派卫温、诸葛直带领上万士兵出海寻找夷洲、亶洲,想要俘获那里的民众以充实东吴的人口,陆逊和全琮都谏言反对,孙权不听。230年和卫温一起登上台湾(当时的台湾叫做夷洲),他们是中国历史上记载的最早登陆台湾的人。卫温和诸葛直花费了约一年时间行军,士兵们因为疾病死去了十分之八到十分之九,因为亶洲太过遥远,卫温和诸葛直最终没能到达那里,只带了几千名夷洲的人返回。黄龙三年(231年),孙权认为诸葛直违背诏令,劳财伤民,无功而返,和卫温一同入狱被处死。", + xurong: "徐荣(?-192年),玄菟人(一说为辽东襄平人,《公孙度传》中说公孙度本辽东襄平人,迁居玄菟,为同郡徐荣所举,任辽东太守。同郡当是同“玄菟”郡),东汉末年将领。本为中郎将,曾向董卓推举同郡出身的公孙度出任辽东太守。于汴水之战中击败曹操的独立追击军,以及在梁东之战中击败孙坚的部队。在董卓死后,受司徒王允的命令与李傕、郭汜交战,因部将胡珍投降,寡不敌众,于新丰之战被击败,战死在乱军之中。", + zhangqiying: "张琪瑛(196年-217年),字不详(或琪瑛为字,名不详),祖籍沛国丰县(今江苏省丰县)。她的曾祖父张陵是西汉留侯张良的十一世孙、天师道(五斗米道)教祖,她的父亲是东汉末年割据汉中的军阀张鲁。张琪瑛继承家说,是五斗米教的传人。", + beimihu: "卑弥呼(ひみこ,约159年-约249年,有的史书也写成“俾弥呼”)是日本弥生时代邪马台国(今日本本州近畿地区)的女王,在《三国志·魏书·倭人传》中有关于她的记载。关于她的真实身份一直众说纷纭,是个极具神秘色彩的古代女性统治者。亦是日本古代宗教鬼道教的发源者。", + liuqi: "刘琦(?-209年)。兖州山阳郡高平县(今山东省济宁市微山县两城镇)人。荆州牧刘表的长子、谏议大夫刘琮兄。官至荆州刺史。建安十四年(209年)病逝。", + tangzi: "唐咨(生卒年不详),三国时魏利城(今江苏赣榆西)人。魏文帝黄初中利城郡反,推唐咨为主。后为魏军击破,遂亡至吴,官至左将军,封侯、持节。后助诸葛诞拒魏,兵败被俘。为安抚吴国军民,魏主拜唐咨为安远将军。", + huangquan: "黄权(?-240年),字公衡。巴西郡阆中县(今四川阆中)人。三国时期蜀汉、曹魏将领。
    黄权年轻时为郡吏,后被益州牧刘璋召为主簿。曾劝谏刘璋不要迎接刘备,因而被外放为广汉县长。刘璋败,才降刘备,被拜为偏将军。建计取汉中,拜护军。刘备为汉中王,仍领益州牧,以黄权为治中从事。及刘备称帝,将伐吴,黄权劝谏而不纳。以其为镇北将军,督江北军以防魏师进攻。刘备伐吴败还,而归途隔绝,黄权不得归,无奈之下率部降魏。被魏文帝所赏识,拜镇南将军,封育阳侯,加侍中,使同车陪乘。后领益州刺史,进驻河南。景初三年(239年),迁车骑将军、仪同三司。正始元年(240年),黄权去世,谥号“景”。", + sufei: "苏飞(生卒年不详),东汉末年人物,原为东汉末年荆州牧刘表的部将,任江夏都督。
    苏飞与甘宁交好,但是数次向黄祖推荐都失败。甘宁决定投效孙权时助其逃离。后来甘宁率吴军攻破江夏,苏飞兵败被俘。孙权打算将苏飞处斩,但是因为甘宁用性命担保而赦免了苏飞。降吴后官至军都督。", + + zhangchangpu: "钟会的母亲。《母夫人张氏传》:夫人张氏,字昌蒲,太原兹氏人,太傅定陵成侯之命妇也。", + xugong: "许贡是东汉末官吏。先后任吴郡都尉、太守,欲送密信给曹操,要曹操注意孙策,却被孙策发现而被杀。许贡生前招揽了一些门客,当中有三人不忘故主,千方百计想要手刃仇人。建安五年(公元200年),广陵太守陈登派人秘密联系孙策治下的山贼余党,企图颠覆孙策在江东的统治。孙策决定讨伐陈登,行军到丹徒时,许贡门客终于找到了机会。因为孙策有单骑出猎,在野外思考的习惯,三门客趁孙策轻装外出打猎时,放冷箭射中孙策面颊。这些门客后来在与孙策的搏斗中,被赶到的侍卫杀死。孙策此后因为伤口感染,并且俊美的容貌被毁,终于不治身亡,去世时年仅26岁。", + mangyachang: "南蛮王孟获的部将,使一口截头大刀,骑一匹黄骠马。率军与蜀军交战,战败王平。后被平北将军马岱斩杀。只出现在《三国演义》里,正史中无此人。", + xushao: "许劭(150年—195年),字子将。汝南平舆(今河南平舆县射桥镇)人。东汉末年著名人物评论家。据说他每月都要对当时人物进行一次品评,人称为“月旦评”。曾任汝南郡功曹,后南渡投靠扬州刺史刘繇。刘繇被孙策击败后,许劭随其逃往豫章郡,并在豫章去世。", + zhangwen: "张温(193年—230年),字惠恕,吴郡吴县(今江苏苏州)人。少修节操,容貌奇伟。孙权召拜议郎、选曹尚书,徙太子太傅。黄武三年(224),以辅义中郎将身份出使蜀汉,孙权原先害怕诸葛亮会有意留难张温,但张温不担心。在呈上蜀汉朝廷的文书刻意称颂蜀汉,以表明和解的诚意,重建两国关系。他在蜀汉表现出色,得蜀汉朝廷重视。回东吴后不久,被调进豫章的军队,事业上再无进展。孙权一方面介怀他出使蜀汉时称颂蜀汉,又嫌他声名太盛,恐怕张温不会尽忠地由他任用。当时正好碰上暨艳事件,暨艳是张温引荐的臣子,但他滥用职权,升迁评定等只看自己喜恶。事件被揭发后暨艳及同党徐彪都自杀。孙权见此,于是以张温与暨艳、徐彪等人多有来往而下罪张温,后更将张温发还到家乡吴郡。将军骆统曾上书为张温辩解,但孙权不理会。六年后,张温病逝。", + lisu: "李肃(?-192年),五原(治今内蒙古包头西北)人。永汉三年四月,司徒王允、尚书仆射士孙瑞、卓将吕布共谋诛卓。是时,天子有疾新愈,大会未央殿。布使同郡骑都尉肃等、将亲兵十馀人,伪著卫士服守掖门。布怀诏书。卓至,肃等格卓。卓惊呼布所在。布曰“有诏”,遂杀卓,夷三族。后卓女婿中郎将牛辅典兵别屯陕,分遣校尉李傕、郭汜、张济略陈留、颍川诸县。卓死,吕布使李肃至陕,欲以诏命诛辅。辅等逆与肃战,肃败走弘农,布诛肃。", + xinpi: "辛毗(生卒年不详),字佐治,颍川阳翟人。三国时期曹魏大臣。原居陇西(郡治在今甘肃临洮县),东汉光武帝建武年间,其先人东迁。当初,辛毗跟随其兄事袁绍。曹操任司空时,征召辛毗,他不受命。官渡战后,辛毗事袁绍的儿子袁谭。公元204年,曹操攻下邺城,上表推荐辛毗任议郎,后为丞相长史。公元220年,曹丕即皇帝位,以辛毗为侍中,赐爵关内侯,后赐广平亭侯。魏明帝即位,封辛毗颍乡侯,食邑三百户,后为卫尉。公元234年,诸葛亮屯兵渭南,司马懿上表魏明帝。魏明帝任辛毗为大将军军师,加使持节号。诸葛亮病逝后,辛毗返回,仍任卫尉。不久,逝世,谥肃侯。", + + liuzan: "字正明,会稽长山人人,曾任左护军,有两子:留略、留平。少为会稽郡吏,曾参与镇压黄巾起义,后被东吴大将凌统所引用,任屯骑校尉。吴五凤二年(公元255年)留赞任左护军,随孙峻征淮南,因病撤军,被魏将蒋班围困于道,力战而死,时年73岁。", + zhujun: "朱儁(?-195年),字公伟。会稽郡上虞县(今浙江绍兴上虞区)人。东汉末年名将。朱儁出身寒门,赡养母亲,以好义轻财闻名,受乡里敬重。后被太守徐珪举为孝廉,任兰陵令,颇有治绩。再升任交州刺史,以家兵五千大破叛军,平定交州。战后以功封都亭侯,入朝为谏议大夫。光和七年(184年),黄巾起义爆发,朱儁以右中郎将、持节平定三郡之地,以功进封西乡侯,迁镇贼中郎将。又率军讨平黄巾,“威声满天下”。中平二年(185年),进拜右车骑将军,更封钱塘侯。后为河内太守,击退进逼的张燕。权臣董卓秉政时,想任朱儁为副手,遭其婉拒。其后出逃荆州,更屯军中牟,徐州刺史陶谦等欲推举他为太师,并传檄各州牧伯,相邀讨伐李傕、奉迎天子。但朱儁却奉诏入京任太仆。初平三年(192年),升任太尉、录尚书事。兴平元年(194年),行骠骑将军事,持节镇关东,因故未成行。兴平二年(195年),李傕与郭汜相互攻杀,郭汜扣留朱儁作为人质。朱儁性格刚烈,即日发病而死。", + liuhong: "汉灵帝刘宏(157年,一作156年-189年5月13日),生于冀州河间国(今河北深州)。东汉第十二位皇帝(168年-189年在位),汉章帝刘炟的玄孙。刘宏早年世袭解渎亭侯。永康元年(167年)十二月,汉桓帝刘志逝世,刘宏被外戚窦氏挑选为皇位继承人,于建宁元年(168年)正月即位。刘宏在位的大部分时期,施行党锢及宦官政治。他又设置西园,巧立名目搜刮钱财,甚至卖官鬻爵以用于自己享乐。在位晚期,爆发了黄巾起义,而凉州等地也陷入持续动乱之中。中平六年(189年),刘宏去世,谥号孝灵皇帝,葬于文陵。刘宏喜好辞赋,作有《皇羲篇》、《追德赋》、《令仪颂》、《招商歌》等。", + wangrong: "汉灵怀皇后王荣(?~181年),赵国邯郸(今河北邯郸市)人。五官中郎将王苞孙女,汉灵帝刘宏妃子,汉献帝刘协生母。初以良家子选入掖庭,封为美人,服侍汉灵帝。光和四年(181年),生下陈留王刘协,惨遭灵思皇后毒杀。王荣死后,汉灵帝曾作《追德赋》、《令仪颂》。永汉元年(189年),其子刘协即位,是为汉献帝,追谥灵怀皇后,葬于文昭陵。", + hanfu: "韩馥(?—191年),字文节,颍川郡(今河南禹州)人。东汉末年的诸侯,冀州牧。韩馥担任过东汉的御史中丞,之后被董卓举荐为冀州牧;在各诸侯起兵讨伐董卓时,韩馥也是其中之一的参与者。韩馥与袁绍也曾经有意立刘虞为皇帝。当时冀州民殷人盛,兵粮优足,于是袁绍便用计夺取冀州,韩馥被迫投靠张邈;之后张邈与袁绍的使者见面,韩馥以为是要来杀害自己的,于是在厕所中以刻书用的小刀自杀。", + zhaozhong: "赵忠(?—189年),安平人,东汉末年宦官,赵延之兄。桓帝、灵帝时,历为小黄门、中常侍、大长秋、车骑将军等职,封都乡侯。在职时以搜刮暴敛、骄纵贪婪见称,灵帝极为宠信,常谓“赵常侍是我母”。中平六年(189年),何进谋诛宦官,事泄,他和其余几个常侍设计伏杀何进,袁绍、袁术等人闻何进被杀,入宫杀尽宦官,后捕杀赵忠。", + caosong: "曹嵩(?—194年),字巨高,沛郡谯县(今安徽省亳州市)人。东汉大臣,大长秋曹腾的养子,曹操之父亲。门荫入仕,历任司隶校尉、鸿胪卿、大司农,位列九卿,位高权重。中平四年(187年),靠着贿赂中官,出任太尉,位列三公。中平五年(188年),受累于黄巾之乱,坐罪免官。兴平元年(194年),投奔兖州牧曹操,遇害于徐州。延康元年(220年),追尊魏国太王。曹魏建立后,追尊皇帝,谥号为太。", + liangxing: "梁兴(?-212年),武威郡姑臧人也,东汉末年凉州军阀之一。与张横、贾诩、段煨是同乡,曾斩杀李傕。建安十六年,同韩遂、马超联合,起兵反抗曹操。梁兴率步骑五千夜袭曹军先头部队徐晃,被击退。联军战败后,梁兴逃到蓝田,劫掠周围郡县。夏侯渊进攻蓝田联合郑浑征讨梁兴,梁兴战败,不知所终。", + zhangmiao: "张邈(?-195年),字孟卓,东平寿张(今山东东平县)人。东汉大臣、名士,“八厨”之一。举孝廉出身,授骑都尉,出任陈留太守。参与讨伐董卓,参加汴水之战,归附于曹操。兴平元年(194年),趁着曹操讨伐徐州牧陶谦,联合陈宫发动叛乱,迎立吕布为兖州牧。受到曹操讨伐,兵败投奔徐州牧刘备。兴平二年,张邈向袁术借兵途中,被部下所杀。", + duanwei: "段煨(?~209年),字忠明,武威郡姑臧(今甘肃省武威市)人也。东汉末年将领,东汉太尉段颎同族兄弟,与太尉贾诩、张济、宣威侯张绣乃是同乡。原为董卓帐下将领,奉命屯兵华阴,勤劳农业。兴平二年(195年),迎接汉献帝刘协东归洛阳,供给衣食补给,与护驾将领杨定不和,引发激战十余天,听从汉献帝刘协劝解。东汉建安三年(198年),攻打黄白城,击杀李傕,夷其三族,封为镇远将军、闅乡亭侯、北地太守,累迁大鸿胪、金光禄大夫。建安十四年(209年),寿终正寝。", + zhangheng: "张横,生卒年不详,武威郡姑臧人,东汉末年凉州军阀之一。与梁兴、贾诩、段煨乃是同乡。建安三年(198),张横与梁兴、段煨等斩杀李傕。十六年(211),同韩遂、马超联合,起兵反抗曹操,兵败后不知所终。", + wenqin: "文钦(?~258年),字仲若,沛国谯郡(今安徽省亳州市)人,三国时期曹魏将领,曹操部将文稷之子。魏明帝太和年间文钦任牙门将、五营校督,后拜庐江太守、冠军将军,嘉平元年(249年),曹爽及其同党在高平陵之变中被杀,文钦心中不安,执政的司马氏集团为了安抚文钦,升其为前将军、扬州刺史,任职期间结交镇东将军毌丘俭。击退吴国太傅诸葛恪进攻,取得一定战果。正元二年(255年),文钦与镇东将军毌丘俭在扬州起兵讨伐司马师,兵败后投奔吴国,被封为镇北大将军、幽州牧,封谯侯。甘露二年(257年),文钦随吴军援救起兵反抗司马氏的诸葛诞,此后因被司马昭大军围困,军情告急,文钦与诸葛诞本就有矛盾,对文钦日益不满的诸葛诞遂将文钦杀死。淮南平定之后,文钦遗体被其二子收敛安葬。", + qiuliju: "丘力居,东汉末年的辽西乌丸大人。拉拢中山太守张纯反叛东汉,寇略青、徐、幽、冀四州,杀略吏民。死时认为儿子楼班年幼,于是让从子蹋顿总摄三王部。", + liuba: "刘巴(?-222年),字子初,荆州零陵郡烝阳县(今湖南省衡阳县、邵东县一带)人,东汉末年至三国时期蜀汉时期官员、名士。刘巴少知名,荆州牧刘表多次征用推举,刘巴均不应就。曹操征伐荆州,荆州士人多归刘备,刘巴却北上投靠曹操。后受曹操命令招降荆南三郡,不料先为刘备所得,刘巴不能复命曹操,遂远至交趾,又辗转进入益州。刘备平定益州后,刘巴归附刘备,为左将军西曹掾,法正死后接任尚书令。章武二年(222年)去世。刘巴博学多才,为刘备解决入蜀后的财政困难问题,又与诸葛亮等共制蜀汉的法律文件《蜀科》。为人简朴清高,退无私交,曹魏大臣陈群甚敬重之。所著录于《刘令君集》。", + pengyang: "彭羕(184年-220年),字永年,广汉(今四川广汉北)人。东汉末年官吏。彭羕起初在益州任书佐,但后来其他人向益州牧刘璋诽谤他,刘璋于是以“髡钳”(剃去头发和胡须,并戴上刑具)处罚他,并且贬奴隶。此时刘备入蜀,彭羕想投靠刘备,于是去见庞统。庞统和他会面后很欣赏他,而法正亦很清楚彭羕,于是二人共同向刘备推荐彭羕。刘备多次命令彭羕传递军情和指示给诸将,表现都十分满意,日渐被赏识。刘备入主益州,领益州牧后就任命他为治州从事。彭羕见此,又变得嚣张自矜,诸葛亮对他礼待但心中并不喜欢他,多次密告刘备,说彭羕“心大志广,难可保安”。刘备见诸葛亮这样说,决定疏远彭羕,又观察他行事,于是贬他为江阳太守。彭羕见将被派往外地,心感不悦,与马超见面时又曾对他说“老革荒悖,可复道邪!”“卿为其外,我为其内,天下不足定也。”马超听后大惊,彭羕走后以他的说话告发彭羕,彭羕于是被收监下狱。最后彭羕被处死,死时三十七岁。", + dongxie: "董卓之女,牛辅之妻。在《三国群英传》中名为董宜,在电视剧《三国群英会之吕布与貂蝉》中名为董媛。", + caoanmin: "曹安民(?-197年),沛国谯县(今安徽亳州)人,字安民。东汉时期人物,曹德之子,曹操之侄,曹昂的堂兄弟,曹丕的堂兄,死于宛城之战。按曹丕《典论》记载的“亡兄孝廉子脩、从兄安民遇害。”等情况来看,安民应该是曹操侄子错不了,曹丕是他们属于兄弟关系肯定不会弄错。另外从典论的记载来看安民是和子脩并提的,子脩是曹昂的字,安民则肯定也是字不是名,至于三国志中记载则应取自曹丕之《典论》但陈寿又不知曹安民其名,故写为“长子昂、弟子安民”。", + dufuren: "杜夫人(生卒年不详),东汉末年至三国时人。有异色,原为吕布将秦宜禄之妻,生子秦朗。后为曹操纳为妾,又生曹林、曹衮、金乡公主。", + mifangfushiren: "麋芳(生卒年不详),字子方,东海郡朐县(今江苏省连云港市)人。汉末三国时期蜀国将领,刘备糜夫人的兄弟。麋芳本为徐州牧陶谦部下,曾被曹操表为彭城相。后来辞官,随刘备从徐州辗转至邺城、汝南、新野、长坂坡、江夏等地,奔波多年。傅士仁(生卒年不详),字君义,幽州广阳郡(今北京市)人,刘备手下将领。受到刘备的重用,但被关羽轻慢。
    刘备称汉中王时,糜芳为南郡太守,但受到关羽的轻慢。后来,因未完成供给军资的任务而被关羽责骂,心中不安。吕蒙袭取荆州时,将已经投降的傅士仁展示给糜芳,麋芳于是选择投降,导致关羽兵败被杀。此后,在吴国担任将军,并且为吴征伐。", + tongyuan: "童渊,字雄付,武术名家,与并州李彦是结拜兄弟,两人均师承义父玉真子,两人分别娶了河北颜家的两位大小姐颜云、颜雨。童飞之父,有张任、张绣为入室弟子,晚年收赵云为关门弟子,传其毕生所学。其成名技为“百鸟朝凤枪”。童渊是南方苏州评话三国中的原创人物,在历史中以及《三国演义》中并不存在。", + //zhangning:'张宁,东汉末年大贤良师张角的女儿。自幼学习太平道法,掌握天地法则。', + xinping: "辛评(?-204年),字仲治,颍川阳翟人,东汉末年人物。曹魏卫尉辛毗之兄。原是韩馥部下,韩馥逃亡后转而辅佐袁绍。袁绍死后,辛评、郭图欲立袁谭为主,与审配等不和。后来曹操破邺,其弟辛毗在城下劝降。审配怒遣手下将辛评全家杀害。", + hanmeng: "韩猛,又名韩若、韩荀、韩泣(上荀下大) ,东汉末年袁绍帐下名将,或与《曹瞒传》所言韩莒子为同一人。公元200年,官渡之战爆发。袁绍派遣韩猛劫掠曹操军的西道,被曹军部将曹仁击破于鸡洛山。袁绍又派韩猛前去运送粮车,因为轻敌被曹军部将徐晃、史涣击退。", + yanfuren: "《三国志》中东汉末年著名武将吕布有一妻子,但姓名未载于史书,或为魏续的姐妹魏氏。在李傕郭汜之乱期间曾受困,幸亏被庞舒所救,私藏于府中而得以幸免。吕布被曹操围困时,反对陈宫的计谋,导致了吕布的失败。《三国演义》中,姓严,通称严夫人,和吕布生有一女欲嫁于袁术之子,未果,吕布失败后与其女一同送往许昌。", + haomeng: "郝萌(?-196年),东汉末年吕布帐下名将。建安元年(196年),郝萌在袁术的怂恿下反叛吕布,曾一度打得吕布躲入厕所。后来,被吕布部将高顺所阻,其部将曹性临阵反叛,最终被高顺所杀。在小说《三国演义》中,吕布被围下邳时,郝萌护送许汜王楷回城时,被张飞擒获,被曹操所杀。", + licaiwei: "李采薇,生卒年不详,汉末将领庞德之妻,庞会之母。襄樊之战时,庞德任先锋,随于禁率军增援驻守樊城的曹仁。出战前,他将妻子李采薇与年仅六岁的儿子庞会叫来面前,对李采薇说:“吾今为先锋,义当效死疆场。我若死,汝好生看养吾儿。吾儿有异相,长大必当与吾报仇也。”李采薇闻言,与儿子痛哭送别庞德。她知道丈夫已下定决心,若无法胜利归还则必当战死沙场,绝不会投降求生。其后前线果然传来消息:魏军全军覆没,于禁投降,庞德誓死不降被关羽所杀。其子庞会自幼丧父,由母亲抚养长大。成年后,庞会性格勇烈,有先父之风。他多次立下战功,深受魏文帝曹丕的喜爱。后来庞会随钟会、邓艾伐蜀,成都城破之后,尽灭关氏家以报父仇。", + yanrou: "阎柔(生卒年不详),燕国广阳(今北京市附近)人。三国时期曹魏名将。年少时曾被乌丸、鲜卑俘虏,后来却得到他们的信任。刘虞死后,阎柔被鲜于辅等推举为乌丸司马,联系鲜卑为刘虞报仇,和公孙瓒对抗。在官渡之战时归曹操,拜护乌丸校尉,对曹操讨伐乌丸有功,赐爵关内侯。曹操待其如子,曹丕也视其如亲兄弟,阎柔坐镇北方,统帅幽州兵马,抗击胡人的入侵。曹丕即位后,阎柔被拜为度辽将军。", + qinyilu: "秦宜禄(?—200年),并州云中郡云中县人(今内蒙古自治区呼和浩特市托克托县古城镇)。东汉军阀吕布的部将。吕布战败后归降曹操,后为张飞所杀。", + fengfang: "冯方,其字不详,司隶人。初掌校事,监察京师及周边地区,刺探文武百官秘事。十常侍之乱后,董卓进京,掌控朝政。冯方认为他胸怀不臣之心,于是弃官携女儿冯妤至江南避祸。其后董卓果然乱政,京师之地生灵涂炭,更将洛阳付之一炬。冯方因其先见之明得以保全家人。
    冯妤长大成人后,有倾国之貌。一日袁术登城观景,得见冯妤,心中非常喜欢,于是将其纳为夫人。冯方心忧自家女儿不谙世事,于是将可以让人更显妩媚的家传宝梳交给她,希望能借此使其获得袁术的宠爱。其后果然传来袁术偏爱冯夫人的消息,冯方因此宽心,接受了袁术的征辟,为其效力。然而好景不长,没过多久,冯妤自缢身亡的消息传出,冯方悲愤不已,弃官而走,自此销声匿迹。", + bianxi: "小说《三国演义》里的人物。汜水关守将,并州人氏。原是黄巾余党,后投曹操,拨来守汜水关。善使流星锤。在镇国寺设下伏兵欲谋害千里寻兄的关羽,但是寺中僧人普净暗示加以解救。最后被关羽斩杀。", + niufu: "牛辅,东汉末年武将,东汉相国董卓的女婿。曾任中郎将,征讨白波军,不能取胜。董卓被杀时,牛辅别屯于陕地。吕布派李肃前去征讨牛辅,被牛辅击败。后来,牛辅营中有士兵半夜背叛出逃,造成内乱,牛辅以为整营皆叛,于是带着金银珠宝,独与亲信胡赤儿等五六人逾城北渡河。赤儿等人以绳索系在牛辅腰间将其从城头放下,但赤儿等因为谋财而在离地面数丈高的地方就松开了绳子使得牛辅重重摔在地上腰部受伤,而后赤儿与诸胡人将牛辅斩首,将其首级送去长安。", + wangwei: "王威,东汉末年人。荆州刺史刘表部下将领,乃忠义之士。刘表亡后,刘琮投降曹操,王威向刘琮献计偷袭曹操,刘琮没有采纳。小说《三国演义》中,曹操表刘琮为青州刺史,使远离故乡,时只有王威追随,曹操复遣于禁追杀刘琮等人,王威亦于乱军中殉主。", + liyixiejing: "李异(生卒年不详),三国时吴将领,曾随陆逊大败蜀军。谢旌(生卒年不详),三国时期吴国名将,会稽(今属浙江)人。建安末,李异与谢旌率水陆三千,破蜀将詹晏、陈凤。刘备领兵攻孙权,李异与陆议等屯巫、秭归,为蜀将所破。黄武元年(222),陆逊破刘备于猇亭,他追踪蜀军,屯驻南山。建安二十四年,陆逊击败关羽后,遣李异、谢旌二人将水陆军三千,进攻蜀将詹晏、陈凤。李异率水军,谢旌率陆军,于险要之地设防,击败詹晏,生擒陈凤。其后进攻房陵太守邓辅、南乡太守郭睦,大破之。又攻秭归大姓文布、邓凯等所合夷兵数千人,大胜,文布、邓凯落荒而逃。在《三国演义》中,两人为孙桓麾下部将,皆有“万夫不当之勇”。刘备攻吴时,谢旌迎战张苞,不敌败走。李异接战,被关兴所斩。次日,谢旌于乱军中被张苞一矛刺死。", + shiyi: "是仪(生卒年不详),本名氏仪,字子羽,北海郡营陵县(今山东昌乐)人,三国时期吴国官员。仕东汉、东吴两朝,早年曾在本县营陵县及本郡北海郡任官,后在东吴历任骑都尉、忠义校尉、裨将军、偏将军、侍中、中执法、尚书仆射等官。先封都亭侯,后进封都乡侯。年八十一岁时病逝,死前要求节葬。", + sunlang: "孙狼(生卒年不详),东汉末农民起义军首领。建安二十三年(218)陆浑(今河南嵩县东北)县长张固发民服徭役,百姓惶俱,狼等乘机发动起义,杀县主簿,攻破县城,后南下投奔蜀将关羽。", + sp_jiaxu: "字文和,武威姑臧人。三国时期魏国著名谋士。曾先后担任三国军阀李傕、张绣、曹操的谋士。官至魏国太尉,谥曰肃侯。", + sunhuan: "孙桓(198年-223年),字叔武,吴郡富春(今浙江杭州富阳区)人,三国时期吴国建武将军。孙河第三子。仪容端正,器怀聪明,博学强记,能论议应对,孙权常称为“宗室颜渊”。初擢为武卫都尉。建安二十四年(219年),参与由吕蒙指挥的袭击荆州行动,从讨关羽于华容,招揽关羽余众,得五千人以及大量牛马器械。黄武元年(222年),孙桓二十五岁,拜安东中郎将,跟随陆逊抗击进攻东吴的刘备。当时刘备率领众多兵众进攻,满山都是蜀军,孙桓奋战,与陆逊等协力击破蜀军。刘备兵败逃走,孙桓截击,“斩上夔道,扼要径”,差点生擒刘备。战后孙桓因功拜建武将军,封丹徒侯,督牛渚,修筑横江坞,期间逝世。", + guānning: "关宁,《三国演义》的虚构人物,为关定之子,关平的哥哥,学文。关羽前往冀州寻找刘备时曾居于关定庄,关定命关宁、关平二子出拜。后关羽同刘备回到关定庄时,关羽向刘备介绍关宁、关平二人,关定即提出让关平拜关羽为义父。", + mushun: "穆顺,小说《三国演义》中的人物,男,东汉末宦官。献帝欲修书与国舅伏完,共谋图曹公。因顺为宦官中之忠义可托者,乃命顺往送书。顺藏书于发中,潜出禁宫,径至完宅,将书呈上。及完回书付顺,顺乃藏于头髻内,辞完回宫。然公闻信,先于宫门等候,顺回遇公,公喝左右,遍搜身上,并无夹带,放行。忽然风吹落其帽。公又唤回,取帽视之,遍观无物,还帽令戴。顺双手倒戴其帽。公心疑,令左右搜其头发中,搜出伏完书来。公见书大怒,执下顺于密室问之,顺不肯招。当晚将顺、完等宗族二百余口,皆斩于市。", + jsp_guanyu: "关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。", + liuling: "刘伶(约221年-约300年),字伯伦,西晋沛国(治今安徽濉溪县西北)人,竹林七贤之一,中国魏晋时期作家,名士。
    刘伶自幼便失去了父爱,因其父亲身材矮小,及至长大成人后,刘伶身高也不过六尺。魏齐王曹芳正始之末(249年),刘伶已成为当世名重一时的名士,并且常与嵇康、阮籍、阮咸集会于山阳竹林之下,饮酒赋诗,弹琴作歌。晋武帝司马炎泰始初年(265年)前后,曾做过一段时间的建威参军,不久朝廷下诏,入宫中策问。他大谈老庄,强调无为而治,非但没有得到重用,反而连参军之职也被罢免了,从此再无仕进。晋惠帝司马衷永康元年(300年)前后,以寿而终。
    刘伶有“品酒第一人”的美称,也被酒行业传颂至今,后人以古瀑河边上的井水酿酒,还取刘伶墓地的黄土垒成窖池酿酒,为了纪念刘伶,当地百姓也将“润泉涌”更名为“刘伶醉”。其传世作品仅有《酒德颂》《北芒客舍》两篇,其中《酒德颂》所表现出的藐视一切存在的气概,敌视礼教之士的反抗精神,既高扬了人格的力量,批判了当时的黑暗政治,同时也抒发了压抑的愤世之情,充满了浪漫色彩,气魄豪迈,用辞又骈偶间行,有无意追求而自至的特点,对后代影响极大。", +}; + +export default characterIntro; diff --git a/character/sp2/perfectPairs.js b/character/sp2/perfectPairs.js new file mode 100644 index 000000000..57ee4db43 --- /dev/null +++ b/character/sp2/perfectPairs.js @@ -0,0 +1,4 @@ +export default { + nanhualaoxian: ["zuoci", "yuji"], + re_nanhualaoxian: ["zuoci", "yuji"], +}; diff --git a/character/sp2/pinyin.js b/character/sp2/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/sp2/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/sp2/skill.js b/character/sp2/skill.js new file mode 100644 index 000000000..fd632a408 --- /dev/null +++ b/character/sp2/skill.js @@ -0,0 +1,11981 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //星孙坚 + starruijun: { + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + filter(event, player) { + if (event.targets.length > 1) return false; + if ( + player.hasHistory("useCard", evt => { + if (evt === event.getParent()) return false; + const targets = evt.targets; + return targets.length === 1 && targets[0] !== player; + }) + ) + return false; + const target = event.target; + if (target === player || !target.isIn()) return false; + return true; + }, + logTarget: "target", + locked: false, + check(event, player) { + return ( + get.attitude(player, event.target) <= 0 || + !player.hasCard(card => { + return game.hasPlayer(current => { + return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true); + }); + }, "hs") + ); + }, + prompt2(event, player) { + return `摸${get.cnNumber(player.getDamagedHp() + 1)}张牌,令所有除${get.translation(event.target)}外的其他角色不在你的攻击范围内,且你对其造成的伤害逐次增加。`; + }, + async content(event, trigger, player) { + await player.draw(player.getDamagedHp() + 1); + player.addTempSkill("starruijun_effect", "phaseChange"); + player.markAuto("starruijun_effect", trigger.target); + }, + subSkill: { + effect: { + audio: "starruijun", + trigger: { + source: "damageBegin2", + }, + charlotte: true, + forced: true, + onremove: true, + async content(event, trigger, player) { + let num = 1; + const evts = player.getHistory("sourceDamage", evt => { + return evt.source === player && evt.player === trigger.player; + }); + if (evts.length) num += evts.lastItem.num; + trigger.num = Math.min(5, num); + }, + mod: { + inRange(from, to) { + if (!from.getStorage("starruijun_effect").includes(to)) return false; + }, + }, + }, + }, + mod: { + aiOrder(player, card, num) { + const event = get.event(); + if (!event || event.type !== "phase") return; + if ( + game.hasPlayer(current => { + return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true) && get.damageEffect(current, player, player) > 0; + }) + ) + return num * 2; + return num / 1.5; + }, + }, + }, + stargangyi: { + audio: 2, + trigger: { + source: "damage", + }, + silent: true, + forced: true, + group: "stargangyi_recover", + async content(event, trigger, player) { + player.addTempSkill("stargangyi_access"); + }, + subSkill: { + recover: { + audio: "stargangyi", + trigger: { + player: "recoverBegin", + }, + filter(event, player) { + const evt = event.getParent(3); + if (!player.isDying() || evt.type !== "dying") return false; + return ["tao", "jiu"].includes(event.getParent().name); + }, + forced: true, + async content(event, trigger, player) { + trigger.num++; + }, + }, + access: { + charlotte: true, + }, + }, + mod: { + cardEnabled(card, player) { + if (player.hasSkill("stargangyi_access")) return; + if (player === _status.currentPhase && card.name === "tao") return false; + }, + cardSavable(card, player) { + if (player.hasSkill("stargangyi_access")) return; + if (player === _status.currentPhase && card.name === "tao") return false; + }, + }, + }, + //李傕郭汜 + xiongsuan: { + audio: 2, + enable: "phaseUse", + filterTarget: true, + filterCard: lib.filter.cardDiscardable, + position: "h", + usable: 1, + async content(event, trigger, player) { + const target = event.target; + await target.damage(); + await player.draw(3); + if (target != player) await player.loseHp(); + }, + ai: { + order: 9, + result: { + player(player, target) { + let res = 2 * get.effect(player, { name: "draw" }, player, player); + if (player !== target) res += get.effect(player, { name: "losehp" }, player, player); + return res; + }, + target(player, target) { + return get.damageEffect(target, player, target); + }, + }, + }, + }, + //张春华 + starliangyan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + chooseButton: { + dialog(event, player) { + const name = get.translation(event.result.targets[0]); + const list = ["你摸一张牌,其弃置一张牌", "你弃置一张牌,其摸一张牌", "你摸两张牌,其弃置两张牌", "你弃置两张牌,其摸两张牌"].map((item, i) => [i, item]); + const dialog = ui.create.dialog(`梁燕:请选择你与${name}要执行的选项`, [list.slice(0, 2), "tdnodes"], [list.slice(2, 4), "tdnodes"], "hidden"); + return dialog; + }, + filter(button, player) { + const link = button.link; + if (link % 2 === 0) return true; + return player.countDiscardableCards(player, "he") >= (link + 1) / 2; + }, + check(button) { + const player = get.player(), + target = get.event().getParent().result.targets[0]; + const link = button.link; + if (get.attitude(player, target) <= 0 && link === 2) return 100; + const ph = player.countCards("h"), + th = target.countCards("h"); + if (link % 2 === 0) { + const num = link / 2 + 1; + if (ph + num === th - num) return 10; + } else { + const num = (link + 1) / 2; + if (ph - num === th + num) return 10; + } + return 5; + }, + backup(links) { + return { + audio: "starliangyan", + target: get.event().result.targets[0], + link: links[0], + filterTarget(card, player, target) { + return target === lib.skill.starliangyan_backup.target; + }, + selectTarget: -1, + async content(content, trigger, player) { + const target = lib.skill.starliangyan_backup.target; + const link = lib.skill.starliangyan_backup.link; + const num = link <= 1 ? 1 : 2; + const fn = ["draw", "chooseToDiscard"]; + if (link % 2 === 1) fn.reverse(); + await player[fn[0]](num, true, "he"); + await target[fn[1]](num, true, "he"); + if (player.countCards("h") === target.countCards("h")) { + const skipper = [player, target][link % 2]; + skipper.skip("phaseDiscard"); + game.log(skipper, "跳过了下一个", "#y弃牌阶段"); + } + }, + }; + }, + prompt(links) { + return "点击“确定”以执行效果"; + }, + }, + subSkill: { + backup: {}, + }, + ai: { + order(item, player) { + if (!game.hasPlayer(current => current !== player && get.attitude(player, current) > 0) && game.hasPlayer(current => get.attitude(player, current) <= 0)) return 10; + if ( + game.hasPlayer(current => { + const del = player.countCards("h") - current.countCards("h"), + toFind = [2, 4].find(num => Math.abs(del) === num); + if (toFind === 4 && del < 0 && get.attitude(player, current) <= 0) { + return true; + } + return false; + }) + ) + return 10; + return 1; + }, + result: { + target(player, target) { + const del = player.countCards("h") - target.countCards("h"), + toFind = [2, 4].find(num => Math.abs(del) === num); + if (toFind) { + return (-del * (get.attitude(player, target) * Math.min(3, target.countCards("h"))) * toFind) / 10; + } + return -1; + }, + }, + }, + }, + starminghui: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter(event, player) { + return player.isMinHandcard() || player.isMaxHandcard(); + }, + direct: true, + async content(event, trigger, player) { + let logged = false; + if (player.isMinHandcard()) { + const card = new lib.element.VCard({ + name: "sha", + }); + const result = await player + .chooseUseTarget(`###${get.prompt("starminghui")}###视为使用一张无距离限制的【杀】`, card, false, "nodistance") + .set("logSkill", "starminghui") + .forResult(); + if (result.bool) logged = true; + } + const num = player.countCards("h"); + if (player.isMaxHandcard() && num > 0) { + const maxNum = game + .findPlayer(current => { + if (current === player) return false; + return !game.hasPlayer(current2 => { + if (current2 === player) return false; + return current2.countCards("h") > current.countCards("h"); + }); + }) + .countCards("h"); + const leastDiscardNum = num - maxNum + 1; + const prompt = logged ? `是否将手牌弃置至不为最多?` : get.prompt("starminghui"); + const next = player + .chooseToDiscard(prompt, `弃置至少${get.cnNumber(leastDiscardNum)}张手牌,然后你令一名角色回复1点体力`) + .set("selectCard", [leastDiscardNum, Infinity]) + .set( + "goon", + game.hasPlayer(current => get.recoverEffect(current, get.player(), get.player())) + ) + .set("ai", card => { + if (!get.event("goon")) return 0; + if (get.tag(card, "recover")) return 0; + if (ui.selected.cards.length === get.event("selectCard")[0] - 1) return 6.5 - get.value(card); + return 4 - get.value(card); + }); + if (!logged) next.set("logSkill", "starminghui"); + const result = await next.forResult(); + if (!result.bool) return; + if (!player.isUnderControl(true) && !player.isOnline()) await game.asyncDelayx(); + const [bool, targets] = await player + .chooseTarget("令一名角色回复1点体力") + .set("ai", target => get.recoverEffect(target, get.player(), get.player())) + .forResult("bool", "targets"); + if (bool) { + const target = targets[0]; + player.line(target, "green"); + await target.recover(); + } + } + }, + }, + //星袁绍 + starxiaoyan: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame" /*,'logSkill'*/], + }, + filter(event, player) { + if (!game.hasPlayer(current => current != player)) return false; + //if(event.name=='logSkill'&&evt.skill!='starjiaowang') return false; + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + async content(event, trigger, player) { + let targets = game.filterPlayer(current => current != player); + player.line(targets); + for (const target of targets) await target.damage("fire"); + targets = targets.filter(i => i.isIn()); + if (targets.length) { + for (const target of targets) { + if (!target.countCards("he")) continue; + const { + result: { bool }, + } = await target + .chooseToGive("he", player) + .set("prompt", "是否交给" + get.translation(player) + "一张牌" + (target.isDamaged() ? "并回复1点体力" : "") + "?") + .set("ai", card => { + const target = get.event("player"), + player = get.event("target"); + const att = get.attitude(target, player); + if (get.recoverEffect(target, target, target) <= 0) { + if (att <= 0) return -get.value(card); + return 0; + } + return 7 - get.value(card); + }) + .set("target", player); + if (bool) await target.recover(); + } + } + }, + }, + starzongshi: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + const cards = player.getCards("h", card => { + const type = get.type(card, player); + if (type != "basic" && type != "trick") return false; + return ( + lib.filter.cardUsable(card, player) && + game.hasPlayer(target => { + return lib.filter.targetEnabled2(card, player, target) /*&&lib.filter.targetInRange(card,player,target)*/; + }) + ); + }); + if (!cards.length) return false; + return cards.some(card => { + const cardss = player.getCards("h", cardx => card != cardx && get.suit(card, player) == get.suit(cardx, player)); + return cardss.length && !cardss.some(cardx => !game.checkMod(cardx, player, "unchanged", "cardEnabled2", player)); + }); + }, + filterCard(card, player) { + if (ui.selected.cards.length) return false; + const cards = player.getCards("h", card => { + const type = get.type(card, player); + if (type != "basic" && type != "trick") return false; + return ( + lib.filter.cardUsable(card, player) && + game.hasPlayer(target => { + return lib.filter.targetEnabled2(card, player, target) /*&&lib.filter.targetInRange(card,player,target)*/; + }) + ); + }); + if (!cards.includes(card)) return false; + const cardss = player.getCards("h", cardx => card != cardx && get.suit(card, player) == get.suit(cardx, player)); + return cardss.length && !cardss.some(cardx => !game.checkMod(cardx, player, "unchanged", "cardEnabled2", player)); + }, + selectCard: [1, 2], + complexCard: true, + check(card) { + const player = get.event("player"), + select = get.copy(get.info(card).selectTarget); + let range; + if (select == undefined) range = [1, 1]; + else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, player, range, "selectTarget", player); + const cards = player.getCards("h", cardx => card != cardx && get.suit(card, player) == get.suit(cardx, player)); + let targets = game.filterPlayer(target => lib.filter.targetEnabled2(card, player, target) /*&&lib.filter.targetInRange(card,player,target)*/ && get.effect(target, card, player, player) > 0); + const max = range[1], + max2 = Math.min(cards.length, targets.length); + if (max > max2) return 0; + targets = targets.sort((a, b) => get.effect(b, card, player, player) - get.effect(a, card, player, player)).slice(0, max2); + const sum = targets.reduce((num, target) => num + get.effect(target, card, player, player), 0); + if (max == -1) { + if ( + game + .filterPlayer(target => { + return lib.filter.targetEnabled2(card, player, target) /*&&lib.filter.targetInRange(card,player,target)*/; + }) + .reduce((num, target) => num + get.effect(target, card, player, player), 0) > sum + ) + return 0; + } + return sum; + }, + position: "h", + discard: false, + lose: false, + delay: false, + async content(event, trigger, player) { + const card = event.cards[0], + cards = player.getCards("h", cardx => card != cardx && get.suit(card, player) == get.suit(cardx, player)); + await player.showCards([card], get.translation(player) + "发动了【纵势】"); + const cardx = new lib.element.VCard({ + name: get.name(card, player), + nature: get.nature(card, player), + cards: cards, + }); + const { + result: { bool, targets }, + } = await player + .chooseTarget((card, player, target) => { + //return player.canUse(get.event('cardx'),target); + return lib.filter.targetEnabled2(get.event("cardx"), player, target) /*&&lib.filter.targetInRange(get.event('cardx'),player,target)*/; + }, true) + .set("cardx", cardx) + .set("selectTarget", [1, cards.length]) + .set("prompt", "请选择" + (game.hasNature(cardx) ? get.translation(get.nature(cardx)) : "") + "【" + get.translation(cardx) + "】(" + get.translation(cards) + ")的目标") + .set("ai", target => { + const player = get.event("player"), + card = get.event("cardx"); + return get.effect(target, card, player, player); + }); + if (bool) player.useCard(cardx, cards, targets.sortBySeat()); + }, + ai: { + order: 9, + result: { player: 1 }, + }, + }, + starjiaowang: { + audio: 2, + trigger: { global: "roundStart" }, + filter(event, player) { + if (game.roundNumber <= 1) return false; + const history = game.getAllGlobalHistory(); + for (let i = history.length - 2; i >= 0; i--) { + const evt = history[i]["everything"]; + for (let j = evt.length - 1; j >= 0; j--) { + if (evt[j].name == "die" && evt[j].getParent(3).name != "starxiaoyan") return false; + } + if (history[i].isRound) break; + } + return true; + }, + forced: true, + async content(event, trigger, player) { + await player.loseHp(); + if (game.hasPlayer(current => current != player)) player.useResult({ skill: "starxiaoyan" }, event); + }, + }, + staraoshi: { + audio: 2, + zhuSkill: true, + global: "staraoshi_global", + subSkill: { + global: { + audio: "staraoshi", + forceaudio: true, + enable: "phaseUse", + filter(event, player) { + return player.group == "qun" && game.hasPlayer(target => lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target)); + }, + filterTarget(card, player, target) { + return target != player && target.hasZhuSkill("staraoshi"); + }, + prompt() { + const player = get.event("player"); + const targets = game.filterPlayer(target => lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target)); + return "交给" + get.translation(targets) + (targets.length > 1 ? "中的一人" : "") + "一张手牌,然后其可以发动一次【纵势】"; + }, + filterCard: true, + check(card) { + const player = get.event("player"); + const target = game + .filterPlayer(target => { + return lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target); + }) + .sort((a, b) => b.countCards("h") - a.countCards("h"))[0]; + return target.getUseValue(card); + }, + discard: false, + lose: false, + delay: false, + usable: 1, + async content(event, trigger, player) { + const target = event.target, + info = get.info("starzongshi"); + await player.give(event.cards, target); + const { + result: { bool, cards }, + } = await target + .chooseCard(info.position, (card, player) => { + return get.event("info").filterCard(card, player); + }) + .set("info", info) + .set("ai", card => get.event("info").check(card)) + .set("selectCard", [1, 2]) + .set("complexCard", true) + .set("prompt", get.prompt("starzongshi")) + .set("prompt2", lib.translate.starzongshi_info.slice(8).slice(0, -1)); + if (bool) target.useResult({ skill: "starzongshi", cards: cards }, event); + }, + ai: { + order: 9, + result: { + target(player, target) { + return target.countCards("h") + 1; + }, + }, + }, + }, + }, + }, + //星董卓 + starweilin: { + audio: 2, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return !event.player.getHistory("damage").length && player.getHistory("useCard").length >= event.player.getHp(); + }, + forced: true, + logTarget: "player", + content: function () { + trigger.num++; + }, + }, + starzhangrong: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getHp() > 0; + }, + direct: true, + content: function* (event, map) { + var player = map.player; + var str = get.cnNumber(player.getHp()); + var choiceList = ["令至多" + str + "名体力值大于等于你的角色各失去1点体力", "令至多" + str + "名手牌数大于等于你的角色各弃置一张手牌"], + list = ["cancel2"]; + if ( + game.hasPlayer(target => { + if (target == player) return player.countCards("h", card => lib.filter.cardDiscardable(card, player)); + return target.countCards("h") >= Math.max(1, player.countCards("h")); + }) + ) + list.unshift("弃牌"); + else choiceList[1] = '' + choiceList[1] + ""; + list.unshift("扣血"); + var result = yield player + .chooseControl(list) + .set("prompt", "###" + get.prompt("starzhangrong") + "###选择其中一项令任意名符合条件的角色执行,然后你摸等量的牌,回合结束时,若这些角色中有本回合未受到过伤害的角色,则你失去1点体力") + .set("ai", () => { + var player = _status.event.player; + var controls = _status.event.controls.slice(); + /* + var cards=player.getCards('hes',card=>get.tag(card,'damage')&&player.hasValueTarget(card)); + var cardx=cards.filter(card=>get.name(card)=='sha'); + cardx.sort((a,b)=>player.getUseValue(b)-player.getUseValue(a)); + cardx=cardx.slice(Math.min(cardx.length,player.getCardUsable('sha')),cardx.length); + cards.removeArray(cardx); + */ + var targets1 = game.filterPlayer(target => get.attitude(player, target) < 0 && target.getHp() >= player.getHp() && get.effect(target, { name: "losehp" }, player, player) > 0 /*&&cards.some(card=>player.canUse(card,target))*/); + _status.starzhangrong_check = true; + var targets2 = game.filterPlayer(target => get.attitude(player, target) < 0 && target.countCards("h") >= Math.max(1, player.countCards("h")) && get.effect(target, { name: "guohe_copy2" }, player, player) > 0 /*&&cards.some(card=>player.canUse(card,target))*/); + delete _status.starzhangrong_check; + [targets1, targets2].forEach(list => { + list.sort((a, b) => get.damageEffect(b) - get.damageEffect(a)); + list = list.slice(0, Math.min(player.getHp() /*,cards.length*/)); + }); + if (!controls.includes("弃牌")) return 1 - get.sgn(targets1.length); + return Math.max(0, get.sgn(targets2.length - targets1.length)); + }) + .set("choiceList", choiceList); + if (result.control != "cancel2") { + var choice = result.index; + var result2 = yield player + .chooseTarget([1, player.getHp()], "请选择【掌戎】的目标", "令至多" + str + "名" + (choice ? "手牌数" : "体力值") + "大于你的角色各" + (choice ? "弃置一张手牌" : "失去1点体力"), (card, player, target) => { + var name = _status.event.card.name; + if (name == "guohe_copy2") { + if (target == player) return player.countCards("h", card => lib.filter.cardDiscardable(card, player)); + return target.countCards("h") >= Math.max(1, player.countCards("h")); + } + return target.getHp() >= player.getHp(); + }) + .set("ai", target => { + var player = _status.event.player; + if (get.attitude(player, target) >= 0) return 0; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", { name: choice ? "guohe_copy2" : "losehp" }); + if (result2.bool) { + var targets = result2.targets.sortBySeat(); + player.logSkill("starzhangrong", targets); + targets.forEach(target => { + target.addTempSkill("starzhangrong_threaten"); + if (choice) target.chooseToDiscard("h", true); + else target.loseHp(); + }); + player.draw(targets.length); + player + .when("phaseEnd") + .then(() => { + targets.forEach(target => target.removeSkill("starzhangrong_threaten")); + var targetx = targets.filter(target => !target.getHistory("damage").length); + if (targetx.length) { + targetx.forEach(target => target.chat("乐")); + player.popup("杯具"); + player.loseHp(); + return; + } + player.popup("洗具"); + }) + .vars({ targets: targets }); + } + } + }, + global: "starzhangrong_check", + subSkill: { + check: { + mod: { + canBeDiscarded: function (card, player, target) { + if (!_status.starzhangrong_check) return; + if (player.hasSkill("starzhangrong") && get.position(card) != "h") return false; + }, + }, + }, + threaten: { + charlotte: true, + trigger: { player: "damageEnd" }, + firstDo: true, + forced: true, + popup: false, + content: function () { + player.removeSkill("starzhangrong_threaten"); + }, + ai: { threaten: 114514 + 1919810 }, + mark: true, + markimage: "image/card/sha.png", + intro: { content: "我还没受到伤害哟!" }, + }, + }, + }, + starhaoshou: { + unique: true, + audio: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return event.player != player && event.card.name == "jiu" && player.isDamaged() && event.player.group == "qun"; + }, + direct: true, + zhuSkill: true, + content: function* (event, map) { + var player = map.player, + target = map.trigger.player; + var result = yield target.chooseBool(get.prompt("starhaoshou", player), "令" + get.translation(player) + "回复1点体力").set("choice", get.recoverEffect(player, target, target) > 0); + if (result.bool) { + target.line(player); + player.logSkill("starhaoshou"); + player.recover(); + } + }, + //global:'starhaoshou_global', + subSkill: { + global: { + audio: "starhaoshou", + forceaudio: true, + filter: function (event, player) { + if ( + !player.countCards("hes", card => { + if (get.position(card) == "h" && _status.connectMode) return true; + return get.name(card) == "jiu"; + }) + ) + return false; + return event.type == "dying" && event.dying && event.dying != player && event.dying.hp <= 0 && event.dying.hasZhuSkill("starhaoshou") && player.group == "qun"; + }, + filterCard: function (card, player) { + return get.name(card) == "jiu"; + }, + check: () => 1, + viewAs: { name: "tao" }, + position: "hes", + prompt: function () { + return "将一张【酒】当作【桃】对" + get.translation(_status.event.dying) + "使用"; + }, + ai: { + save: true, + skillTagFilter: function (player, arg, target) { + if ( + !player.countCards("hes", card => { + if (get.position(card) == "h" && _status.connectMode) return true; + return get.name(card) == "jiu"; + }) || + player == target || + !target.hasSkill("starhaoshou") || + player.group != "qun" + ) + return false; + }, + }, + }, + }, + }, + //星袁术 + starcanxi: { + audio: 2, + trigger: { + global: ["phaseBefore", "roundStart"], + player: "enterGame", + }, + filter: function (event, player, name) { + if (name == "roundStart") return player.getSkills().some(skill => skill.indexOf("starcanxi_") == 0); + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + content: function () { + "step 0"; + if (event.triggername != "roundStart") { + var list = game.filterPlayer().reduce((list, target) => list.add(target.group), []); + list.sort((a, b) => lib.group.indexOf(a) - lib.group.indexOf(b)); + list.forEach(group => lib.skill.starcanxi.create(group, player)); + event.finish(); + return; + } + "step 1"; + var groups = player.getSkills().filter(skill => skill.indexOf("starcanxi_") == 0); + groups = groups.map(group => group.slice(10)); + groups.sort((a, b) => lib.group.indexOf(a) - lib.group.indexOf(b)); + var map = {}; + groups.forEach(group => (map[group] = get.translation(group + "2"))); + event.map = map; + player + .chooseButton( + [ + '###残玺###
    请选择势力和效果
    ', + [Object.values(map), "tdnodes"], + [ + [ + ["wangsheng", ''], + ["xiangsi", ''], + ], + "textbutton", + ], + ], + 2, + true + ) + .set("filterButton", function (button) { + var list = ["wangsheng", "xiangsi"]; + if (!ui.selected.buttons.length) return true; + return list.includes(ui.selected.buttons[0].link) != list.includes(button.link); + }) + .set("ai", function (button) { + var player = _status.event.player; + var map = _status.event.map, + list = ["wangsheng", "xiangsi"]; + var getNum = function (group, effect) { + var num = 0, + sgn = effect == "wangsheng" ? 1.05 : -1; + game.countPlayer(function (current) { + if (!(current == player && sgn == -1)) num += get.sgn(get.attitude(player, current)) * sgn; + }); + return num; + }; + var listx = []; + Object.keys(map).forEach(group => list.forEach(effect => listx.add([group, effect]))); + listx.sort((a, b) => getNum(b[0], b[1]) - getNum(a[0], a[1])); + if (button.link == map[listx[0][0]] || button.link == listx[0][1]) return 1; + return 0; + }) + .set("map", map); + "step 2"; + if (result.bool) { + if (!Object.keys(event.map).some(group => event.map[group] == result.links[0])) result.links.reverse(); + player.popup(result.links[0]); + var group = Object.keys(event.map).find(group => event.map[group] == result.links[0]); + var skill = "starcanxi_" + result.links[1]; + player.popup(skill); + game.log(player, "选择了", "#g" + result.links[0], "、", "#y" + get.translation(skill)); + player.addTempSkill(skill, "roundStart"); + player.markAuto(skill, [group]); + } + }, + create: function (group, player) { + const skill = "starcanxi_" + group; + get.info("starcanxi").createSkill(skill); + if (!_status.postReconnect.starcanxi) { + _status.postReconnect.starcanxi = [get.info("starcanxi").createSkill, []]; + } + _status.postReconnect.starcanxi[1].add(skill); + player.addSkill(skill); + }, + createSkill(skill) { + if (!lib.skill[skill]) + game.broadcastAll(skill => { + const group = skill.slice("starcanxi_".length); + lib.skill[skill] = { + mark: true, + charlotte: true, + onremove: function (player) { + player.addMark("starpizhi", 1, false); + }, + intro: { content: "玉玺的一角" }, + }; + lib.translate[skill] = "残玺·" + get.translation(group + "2"); + lib.skill[skill].marktext = get.translation(group); + lib.translate[skill + "_bg"] = get.translation(group); + }, skill); + }, + subSkill: { + wangsheng: { + charlotte: true, + onremove: true, + trigger: { global: "damageBegin1" }, + filter: function (event, player) { + if (!event.source || !player.getStorage("starcanxi_wangsheng").includes(event.source.group)) return false; + return !event.source.getHistory("sourceDamage").length; + }, + forced: true, + logTarget: "source", + content: function () { + trigger.num++; + }, + group: "starcanxi_remove", + global: "starcanxi_effect", + intro: { content: "$势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1" }, + }, + xiangsi: { + charlotte: true, + onremove: true, + trigger: { global: "recoverEnd" }, + filter: function (event, player) { + if (!player.getStorage("starcanxi_xiangsi").includes(event.player.group) || event.player == player) return false; + return ( + game.getGlobalHistory("changeHp", function (evt) { + return evt.getParent().name == "recover" && evt.player == event.player; + }).length == 1 + ); + }, + forced: true, + logTarget: "player", + content: function () { + trigger.player.loseHp(); + }, + group: ["starcanxi_remove", "starcanxi_cancel"], + global: "starcanxi_effect", + intro: { + content: "其他$势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效", + }, + }, + cancel: { + charlotte: true, + trigger: { global: "useCard" }, + filter: function (event, player) { + if (!event.targets || !event.targets.includes(player) || !player.getStorage("starcanxi_xiangsi").includes(event.player.group) || event.player == player) return false; + return event.player.getHistory("useCard", evt => evt.targets && evt.targets.includes(player)).indexOf(event) == 0; + }, + forced: true, + logTarget: "player", + content: function () { + trigger.excluded.add(player); + }, + }, + effect: { + mod: { + globalFrom: function (from, to, distance) { + if (game.hasPlayer(target => target.getStorage("starcanxi_wangsheng").includes(from.group))) return distance - 1; + }, + }, + ai: { + effect: { + player_use: function (card, player, target) { + var targets = game.filterPlayer(targetx => targetx != player && targetx.getStorage("starcanxi_xiangsi").includes(player.group)); + if (!targets.length) return; + if (get.tag(card, "recover") && target == player && target.hp > 2) return 0; + if (get.tag(card, "damage") && targets.includes(target)) return 0.5; + }, + }, + }, + }, + remove: { + charlotte: true, + trigger: { player: "die" }, + forced: true, + popup: false, + firstDo: true, + forceDie: true, + content: function () { + player.removeSkill("starcanxi_wangsheng"); + player.removeSkill("starcanxi_xiangsi"); + }, + }, + }, + }, + starpizhi: { + audio: 2, + trigger: { player: "phaseEnd", global: "die" }, + filter: function (event, player) { + if (event.name == "phase") return player.hasMark("starpizhi"); + if (!player.getStorage("starcanxi_wangsheng").includes(event.player.group) && !player.getStorage("starcanxi_xiangsi").includes(event.player.group)) return false; + var groups = player.getSkills().filter(skill => skill.indexOf("starcanxi_") == 0); + groups = groups.map(group => group.slice(10)); + return groups.includes(event.player.group); + }, + forced: true, + content: function () { + "step 0"; + if (trigger.name == "die") { + var skills = player.getSkills().filter(skill => skill.indexOf("starcanxi_") == 0 && skill.slice(10) == trigger.player.group); + player.removeSkill(skills); + } + "step 1"; + player.draw(player.countMark("starpizhi")); + }, + intro: { content: "已失去#个“玺角”" }, + ai: { combo: "starcanxi" }, + }, + starzhonggu: { + unique: true, + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { + return !event.numFixed; + }, + forced: true, + zhuSkill: true, + content: function () { + var num = game.roundNumber >= game.countPlayer(current => current.group == "qun") ? 2 : -1; + trigger.num += num; + }, + }, + //星曹仁 + starsujun: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return player.countCards("h", { type: "basic" }) * 2 == player.countCards("h"); + }, + frequent: true, + locked: false, + content: function () { + player.draw(2); + }, + mod: { + aiOrder: function (player, card, num) { + var num = player.countCards("h") - 2 * player.countCards("h", { type: "basic" }); + if (Math.abs(num) != 1) return; + if (num == 1 && get.type(card) != "basic") return num + 10; + if (num == -1 && get.type(card) == "basic") return num + 10; + }, + }, + }, + starlifeng: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + if (!event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && !event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) return false; + return player.hasCard(card => { + return !player.getStorage("starlifeng_count").includes(get.color(card, player)); + }, "hs"); + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event)) list.push(["基本", "", "sha"]); + if (event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) list.push(["锦囊", "", "wuxie"]); + return ui.create.dialog("砺锋", [list, "vcard"]); + }, + check: function (button) { + var player = _status.event.player; + return _status.event.getParent().type == "phase" ? player.getUseValue({ name: button.link[2] }) : 1; + }, + backup: function (links, player) { + return { + filterCard: function (card, player) { + return !player.getStorage("starlifeng_count").includes(get.color(card, player)); + }, + precontent: function () { + delete event.result.skill; + player.logSkill("starlifeng"); + event.getParent().addCount = false; + }, + popname: true, + viewAs: { + name: links[0][2], + }, + ai1: function (card) { + var player = _status.event.player; + var num = player.countCards("h") - 2 * player.countCards("h", { type: "basic" }); + if (player.hasSkill("starsujin") && Math.abs(num) == 1) { + if (num == 1 && get.type(card) != "basic") return 15 - get.value(card); + if (num == -1 && get.type(card) == "basic") return 15 - get.value(card); + } + return 7 - get.value(card); + }, + }; + }, + prompt: function (links) { + return "将一张本回合未使用过的颜色的手牌当做【" + get.translation(links[0][2]) + "】使用"; + }, + }, + hiddenCard: function (player, name) { + if (name == "wuxie") + return player.countCards("hs", card => { + return !player.getStorage("starlifeng_count").includes(get.color(card, player)) || _status.connectMode; + }); + }, + ai: { + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + if ( + !player.countCards("hs", card => { + return !player.getStorage("starlifeng_count").includes(get.color(card, player)) || _status.connectMode; + }) + ) + return false; + }, + order: 10, + result: { player: 1 }, + }, + group: "starlifeng_mark", + subSkill: { + mark: { + charlotte: true, + trigger: { global: "useCard1" }, + filter: function (event, player) { + return !player.getStorage("starlifeng_count").includes(get.color(event.card)); + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + player.addTempSkill("starlifeng_count"); + player.markAuto("starlifeng_count", [get.color(trigger.card)]); + }, + }, + count: { + charlotte: true, + onremove: true, + }, + }, + }, + //小程序刘伶 + mpjiusong: { + audio: 2, + enable: "chooseToUse", + trigger: { global: "useCard" }, + filterCard: function (card) { + return get.type2(card) == "trick"; + }, + viewAs: { name: "jiu" }, + position: "hs", + viewAsFilter: function (player) { + return player.hasCard(card => get.type2(card) == "trick", "hs"); + }, + check: function (card) { + if (get.itemtype(card) !== "card") return true; + if (get.event().type == "dying") return 1 / Math.max(0.1, get.value(card)); + return 4 - get.value(card); + }, + prompt: "将一张锦囊牌当【酒】使用", + filter: function (event, player) { + if (event.name == "chooseToUse") return player.hasCard(card => get.type2(card) == "trick", "hs"); + return event.card.name == "jiu" && player.countMark("mpjiusong") < 3; + }, + forced: true, + locked: false, + content: function () { + player.addMark("mpjiusong"); + }, + marktext: "醉", + intro: { + name: "醉(酒颂/酕醄)", + name2: "醉", + content: "mark", + }, + }, + mpmaotao: { + audio: 2, + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + if (event.targets.length != 1 || !event.isFirstTarget) return false; + if (!["basic", "trick"].includes(get.type(event.card))) return false; + return event.player != player && player.countMark("mpjiusong"); + }, + prompt2: function (event, player) { + let list; + if (get.type(event.card) != "delay") + list = game.filterPlayer(current => { + return lib.filter.targetEnabled2(event.card, event.player, current); + }); + else list = game.filterPlayer(current => current.canAddJudge(event.card)); + const gainText = `${list.length > 1 && !player.storage.mpmaotao_gained ? `若新目标与原目标相同,你` : ""}${!player.storage.mpmaotao_gained ? "获得牌堆中的一张锦囊牌。" : ""}`; + return `移去1枚“醉”${list.length > 1 ? `,令${get.translation(event.card)}目标改为${get.translation(list)}中的一名随机角色` : ""}。${gainText}`; + }, + check: function (event, player) { + const eff = get.effect(event.target, event.card, player, player); + let list; + if (get.type(event.card) != "delay") + list = game.filterPlayer(current => { + return lib.filter.targetEnabled2(event.card, event.player, current); + }); + else list = game.filterPlayer(current => current.canAddJudge(event.card)); + let list2 = list.filter(current => get.effect(current, event.card, player, player) > eff); + let list3 = list.filter(current => get.effect(current, event.card, player, player) > 0); + return list2.length >= list.length / 2 || (player.countMark("mpjiusong") >= 2 && list3.length >= list.length / 2); + }, + content: function () { + player.removeMark("mpjiusong", 1); + var list, + oriTarget = trigger.target; + trigger.targets.remove(oriTarget); + trigger.getParent().triggeredTargets1.remove(oriTarget); + trigger.untrigger(); + game.delayx(); + if (get.type(trigger.card) != "delay") + list = game.filterPlayer(current => { + return lib.filter.targetEnabled2(trigger.card, trigger.player, current); + }); + else list = game.filterPlayer(current => current.canAddJudge(trigger.card)); + if (list.length) target = list.randomGet(); + trigger.targets.push(target); + trigger.player.line(target, "thunder"); + game.log(trigger.card, "的目标被改为", target); + if (target == oriTarget && !player.storage.mpmaotao_gained) { + var card = get.cardPile2(card => get.type2(card) == "trick"); + if (card) { + if (!player.storage.mpmaotao_gained) { + player.when({ global: "phaseAfter" }).then(() => { + delete player.storage.mpmaotao_gained; + }); + player.storage.mpmaotao_gained = true; + } + player.gain(card, "gain2"); + } else { + // player.chat('没酒了!'); + // game.log('但是牌堆中已经没有','#y酒','了!'); + player.chat("没牌了!"); + game.log("但是牌堆中已经没有", "#y锦囊牌", "了!"); + } + } + }, + }, + mpbishi: { + audio: 2, + forced: true, + trigger: { global: "useCard1" }, + filter: function (event, player) { + if (get.type2(event.card) != "trick" || !get.tag(event.card, "damage")) return false; + if (!lib.skill.xunshi.isXunshi(event.card)) return false; + const targets = event.targets.slice(); + targets.remove(event.player); + return targets.length == game.countPlayer() - 2; + }, + content: function* () {}, + mod: { + targetEnabled: function (card) { + if (get.type2(card) == "trick" && get.tag(card, "damage") > 0) return false; + }, + }, + }, + //十周年嵇康 + dcjuexiang: { + derivation: "dccanyun", + audio: "juexiang", + trigger: { player: "die" }, + forced: true, + locked: false, + forceDie: true, + skillAnimation: true, + animationColor: "water", + content: function () { + "step 0"; + if (trigger.source && trigger.source.isIn()) { + trigger.source.discard(trigger.source.getCards("e")); + trigger.source.loseHp(); + } + "step 1"; + player + .chooseTarget("绝响:是否令一名其他角色获得技能〖残韵〗?", lib.filter.notMe) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("forceDie", true); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); + target.addSkills("dccanyun"); + } + }, + }, + dccanyun: { + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer(function (target) { + return lib.skill.dccanyun.filterTarget(null, player, target); + }); + }, + filterTarget: function (card, player, target) { + var list = [player]; + player.getAllHistory("useSkill", function (evt) { + if (evt.skill == "dccanyun") list.addArray(evt.targets); + }); + return !list.includes(target) && !ui.selected.targets.length; + }, + selectTarget: [1, 2], + targetprompt: function (target) { + var pe = _status.event.player.countCards("e", function (card) { + return ui.selected.cards.includes(card) == false; + }); + var te = target.countCards("e"); + if (pe > te) return "回复体力"; + else if (pe == te) return "摸一张牌"; + else if (pe < te) return "失去体力"; + }, + filterCard: true, + position: "he", + check: function (cardx) { + var player = _status.event.player; + var number = game.countPlayer(function (target) { + if (player == target) return false; + var pe = player.countCards("e", function (card) { + return card != cardx && ui.selected.cards.includes(card) == false; + }); + var te = target.countCards("e"); + if (pe > te && target.isDamaged() && get.attitude(player, target) > 2) return true; + else if (pe < te && get.attitude(player, target) < 0) return true; + return false; + }); + if (ui.selected.cards.length < number) return 6 - get.value(cardx); + else return 0; + }, + usable: 1, + content: function () { + var pe = player.countCards("e"); + var te = target.countCards("e"); + if (pe > te) target.recover(); + else if (pe == te) target.draw(); + else if (pe < te) target.loseHp(); + }, + contentAfter: function () { + if (player.hp == 1) player.draw(); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + var pe = player.countCards("e"); + var te = target.countCards("e"); + if (pe > te && target.isDamaged()) return 2; + else if (pe == te) return 1; + else if (pe < te) return -2.5; + else return 0; + }, + }, + }, + }, + //董翓 + dcjiaoxia: { + mod: { + cardUsableTarget: function (card, player, target) { + if (!player.isPhaseUsing()) return; + if (card.name == "sha" && !player.getStorage("dcjiaoxia_mark").includes(target)) return true; + }, + targetInRange: function (card, player, target) { + if (!player.isPhaseUsing()) return; + if (card.name == "sha" && !player.getStorage("dcjiaoxia_mark").includes(target)) return true; + }, + }, + audio: 2, + locked: false, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h"); + }, + check: function (event, player) { + return player.countCards("h", card => { + return game.hasPlayer(target => { + var cardx = get.autoViewAs({ name: "sha" }, [card]); + return player.canUse(cardx, target) && get.effect(target, cardx, player, player) > 0 && (!player.hasUseTarget(card) || player.hasValueTarget(card)); + }); + }); + }, + content: function () { + var cards = player.getCards("h"); + player.addTempSkill("dcjiaoxia_used", "phaseUseAfter"); + player.addGaintag(cards, "dcjiaoxia_used"); + }, + group: "dcjiaoxia_load", + subSkill: { + load: { + charlotte: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (!player.isPhaseUsing()) return false; + return event.card.name == "sha" && event.targets && event.targets.some(target => !player.getStorage("dcjiaoxia_mark").includes(target)); + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + player.addTempSkill("dcjiaoxia_mark", "phaseUseAfter"); + player.markAuto( + "dcjiaoxia_mark", + trigger.targets.filter(target => !player.getStorage("dcjiaoxia_mark").includes(target)) + ); + }, + }, + mark: { + charlotte: true, + onremove: true, + }, + used: { + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcjiaoxia_used")) return num + 1; + }, + cardname: function (card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcjiaoxia_used")) return "sha"; + }, + }, + charlotte: true, + onremove: function (player) { + player.removeGaintag("dcjiaoxia_used"); + }, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + event.cards && + event.cards.length == 1 && + player.hasUseTarget(get.copy(event.cards[0])) && + player.getHistory("lose", evt => { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcjiaoxia_used")) return true; + } + return false; + }).length && + player.getHistory("sourceDamage", evt => evt.card == event.card).length && + player.hasUseTarget(event.cards[0]) + ); + }, + direct: true, + content: function () { + player.chooseUseTarget(trigger.cards[0], get.prompt("dcjiaoxia"), false, false).set("prompt2", "使用" + get.translation(card)).logSkill = "dcjiaoxia"; + }, + }, + }, + }, + dchumei: { + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, + 2: { charlotte: true }, + }, + onChooseToUse: function (event) { + if (!game.online && !event.dchumei_num) { + var player = event.player; + var evtx = event.getParent("phaseUse"); + event.set( + "dchumei_num", + player + .getHistory("sourceDamage", evt => { + return evt.getParent("phaseUse") == evtx; + }) + .reduce((sum, evt) => sum + evt.num, 0) + ); + } + }, + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (typeof event.dchumei_num != "number") return false; + return game.hasPlayer(target => lib.skill.dchumei.filterTarget(null, player, target)); + }, + filterTarget: function (card, player, target) { + if (target.getHp() > _status.event.dchumei_num) return false; + if (!player.hasSkill("dchumei_0")) return true; + if (!player.hasSkill("dchumei_1") && target.countCards("he")) return true; + if (!player.hasSkill("dchumei_2") && target.isDamaged()) return true; + return false; + }, + content: function () { + "step 0"; + var str = get.translation(target); + player + .chooseButton( + [ + "狐魅:请选择一项", + [ + [ + [0, "令" + str + "摸一张牌"], + [1, "令" + str + "交给你一张牌"], + [2, "令" + str + "回复1点体力"], + ].filter(list => { + if (player.hasSkill("dchumei_" + list[0])) return false; + if (list[0] == 1 && !target.countCards("he")) return false; + if (list[0] == 2 && target.isHealthy()) return false; + return true; + }), + "textbutton", + ], + ], + true + ) + .set("filterButton", button => { + var target = _status.event.target; + if (player.hasSkill("dchumei_" + button.link)) return false; + if (button.link == 1 && !target.countCards("he")) return false; + if (button.link == 2 && target.isHealthy()) return false; + return true; + }) + .set("ai", function (button) { + var target = _status.event.target; + return [get.effect(target, { name: "draw" }, player, player), get.effect(target, { name: "shunshou_copy2" }, player, player), get.recoverEffect(target, player, player)][button.link]; + }) + .set("target", target); + "step 1"; + if (result.bool) { + var num = result.links[0]; + player.addTempSkill("dchumei_" + num, "phaseUseAfter"); + switch (num) { + case 0: + target.draw(); + break; + case 1: + target.chooseCard("狐魅:交给" + get.translation(player) + "一张牌", "he", true); + break; + case 2: + target.recover(); + break; + } + if (num != 1) event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) player.gain(result.cards, target, "giveAuto"); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (!player.hasSkill("dchumei_0")) return 1; + if (!player.hasSkill("dchumei_1")) return -1; + if (!player.hasSkill("dchumei_2")) return 1; + }, + }, + }, + }, + //魏关羽 + dcdanji: { + audio: "danji", + skillAnimation: true, + animationColor: "water", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + derivation: ["mashu", "dcnuchen"], + filter(event, player) { + return player.countCards("hej") > player.getHp(); + }, + async content(event, trigger, player) { + player.awakenSkill("dcdanji"); + await player.loseMaxHp(); + await player.recover(player.maxHp - player.hp); + await player.draw(player.getHp()); + await player.addSkills(["mashu", "dcnuchen"]); + }, + ai: { + maixie: true, + skillTagFilter: (player, tag, arg) => { + if (tag === "maixie") return player.hp >= 2 && !player.storage.dcdanji && !player.hasSkill("dcnuchen") && player.countCards("h") === player.hp; + }, + effect: { + target: (card, player, target) => { + let hs = target.countCards("h"); + if (target.hp < 3 || target.storage.dcdanji || target.hasSkill("dcnuchen") || hs > target.hp + 1) return; + if (get.tag(card, "draw")) return 1.6; + if (get.tag(card, "lose") || get.tag(card, "discard")) return [1, -0.8]; + if (hs === target.hp && get.tag(card, "damage")) return [1, target.hp / 3]; + if (hs > target.hp && target.hp > 3 && (card.name === "shan" || card.name === "wuxie")) return "zeroplayertarget"; + }, + }, + }, + }, + dcnuchen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("h") && target != player; + }, + content: function () { + "step 0"; + player.choosePlayerCard(target, true, "h"); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + player.showCards(card, get.translation(player) + "对" + get.translation(target) + "发动了【怒嗔】"); + } else event.finish(); + "step 2"; + var suit = get.suit(card); + var str = get.translation(suit); + player + .chooseToDiscard("怒嗔:是否弃置至少一张" + str + "牌?", "若如此做,你对其造成等量伤害;或点击“取消”,获得其所有" + str + "手牌", "he", { suit: suit }, [1, Infinity]) + .set("ai", card => { + if (ui.selected.cards.length >= _status.event.num) return 0; + return 6 - get.value(card); + }) + .set( + "num", + (function () { + var eff = get.damageEffect(target, player, player); + if (eff > 0) { + if (get.attitude(player, target) > 0) { + return 1; + } + var cards = target.getCards("h", { suit: suit }); + if (cards.length > 2 || get.value(cards) >= 6) { + return 0; + } + if (!player.hasSkillTag("jueqing", false, target) && target.hasSkillTag("filterDamage", null, { player: player })) return 1; + return Infinity; + } + return 0; + })() + ); + "step 3"; + if (result.bool) { + target.damage(result.cards.length); + } else { + var cards = target.getCards("h", { suit: get.suit(card) }); + if (cards.length) player.gain(cards, target, "giveAuto", "bySelf"); + } + }, + ai: { + expose: 0.4, + order: 10, + result: { + target: function (player, target) { + return -Math.sqrt(target.countCards("h")); + }, + }, + }, + }, + //孟达 + dclibang: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + filter: function (event, player) { + return ( + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "dclibang"); + }, "he") && game.countPlayer(current => current != player) >= 2 + ); + }, + filterTarget: function (card, player, target) { + return target != player; + }, + selectTarget: 2, + multiline: true, + multitarget: true, + content: function () { + "step 0"; + event.num = 0; + event.cardsx = []; + event.targets.sortBySeat(); + "step 1"; + var current = targets[event.num]; + if (current.countCards("he")) player.gainPlayerCard(current, "he", true, "visibleMove"); + event.num++; + "step 2"; + if (result.bool) { + var card = result.cards[0]; + event.cardsx.push(card); + } + if (event.num < targets.length) event.goto(1); + "step 3"; + player.judge().set("callback", lib.skill.dclibang.contentx); + }, + contentx: function () { + "step 0"; + var card = event.judgeResult.card; + var color = event.judgeResult.color; + var player = event.getParent(2).player; + var cards = event.getParent(2).cardsx; + for (var cardx of cards) { + if (get.color(cardx) == color) { + if (get.position(card, true) == "o") player.gain(card, "gain2"); + return; + } + } + event.goto(3); + "step 1"; + var targets = event.getParent(2).targets.filter(target => { + return player.canUse("sha", target); + }); + if (!targets.length) event.finish(); + else + player + .chooseTarget("利傍:视为对其中一名角色使用一张【杀】", true, (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set("targets", targets) + .set("ai", target => { + return get.effect(target, { name: "sha" }, player, player); + }); + "step 2"; + if (result.bool) { + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); + } + event.finish(); + "step 3"; + player.chooseCardTarget({ + filterCard: function (card) { + return get.itemtype(card) == "card"; + }, + filterTarget: function (card, player, target) { + return _status.event.targets.includes(target); + }, + selectCard: 2, + targets: event.getParent(2).targets, + position: "he", + prompt: "交给其中一名角色两张牌,或失去1点体力", + ai1: function (card) { + return 1; + }, + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + var val = get.value(card, target); + if (val > 0) return get.attitude(player, target) * 2; + return (val - 2) * get.attitude(player, target); + }, + }); + "step 4"; + if (result.bool) { + player.give(result.cards, result.targets[0]); + } else player.loseHp(); + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0 && ui.selected.targets.length) return 0.1; + return -1; + }, + }, + }, + }, + dcwujie: { + audio: 2, + trigger: { + global: ["discardBegin", "drawBegin"], + }, + forced: true, + forceDie: true, + group: "dcwujie_inf", + logTarget: "player", + filter: function (event, player) { + return event.getParent().name == "die" && event.getParent().source == event.player && event.player != player && event.getParent().player == player; + }, + content: function () { + trigger.cancel(); + }, + subSkill: { + inf: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (get.color(event.card) == "none" && event.addCount !== false) return true; + return false; + }, + content: function () { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; + }, + }, + }, + mod: { + targetInRange: function (card, player) { + const color = get.color(card); + if (color === "none" || color === "unsure") return true; + }, + cardUsable: function (card) { + const color = get.color(card); + if (color === "none" || color === "unsure") return Infinity; + }, + }, + }, + //关宁 + dcxiuwen: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return !player.getStorage("dcxiuwen").includes(event.card.name); + }, + frequent: true, + content: function () { + player.draw(); + player.markAuto("dcxiuwen", [trigger.card.name]); + }, + intro: { content: "已使用:$" }, + }, + oldlongsong: { + audio: "dclongsong", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + getSkills: function (target, player, trigger) { + return target.getSkills(null, false).filter(skill => { + var skills = game.expandSkills([skill]); + if ( + skills.filter(skillx => { + var info = get.info(skillx); + if (!info || !info.enable || (info.usable && !(info.usable >= 1))) return false; + if (info.enable != "phaseUse" && (!Array.isArray(info.enable) || !info.enable.includes("phaseUse"))) return false; + if (info.viewAs && info.usable && info.usable != 1) return false; + if (info.juexingji || info.hiddenSkill || info.charlotte || info.limited || info.dutySkill) return false; + if ((!info.usable || info.usable > 1) && info.filter) { + try { + var bool1 = info.filter(trigger, player); + var num = player.getStat().skill[skillx]; + player.getStat().skill[skillx] = 1; + var bool2 = info.filter(trigger, player); + if (!num) delete player.getStat().skill[skillx]; + else player.getStat().skill[skillx] = num; + var bool3 = !(bool1 && !bool2); + } catch (e) { + console.trace(e); + } + if (!bool1 && !bool2 && get.skillInfoTranslation(skill, player).indexOf("出牌阶段限一次") == -1) return false; + if ((bool1 || bool2) && bool3) return false; + } + return true; + }).length + ) + return true; + return false; + }); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: true, + selectCard: 1, + filterTarget: function (card, player, target) { + return player != target; + }, + ai1: function (card) { + return 6 - get.value(card); + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target), + trigger = _status.event.getTrigger(), + player = _status.event.player; + return lib.skill.oldlongsong.getSkills(target, player, trigger).length * 3 + att / 3; + }, + prompt: get.prompt2("oldlongsong"), + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("oldlongsong", target); + event.target = target; + player.line(target, "green"); + player.give(result.cards, target); + var skills = lib.skill.oldlongsong.getSkills(target, player, trigger); + if (skills.length) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + target.disableSkill("oldlongsong_back", skills); + target.markAuto("oldlongsong_back", skills); + target.addTempSkill("oldlongsong_back", ["phaseUseAfter", "phaseAfter"]); + var str = ""; + for (var i = 0; i < skills.length; i++) { + str += "【" + get.translation(skills[i]) + "】"; + if (i != skills.length - 1) str += "、"; + } + game.log(target, "的技能", "#g" + str, "失效了"); + // game.log(player,'获得了技能','#g'+str); + player.popup(skills, "thunder"); + for (var skill of skills) { + player.addTempSkills(skill, ["phaseUseAfter", "phaseAfter"]); + } + } + } + }, + ai: { expose: 0.2 }, + subSkill: { + back: { + charlotte: true, + onremove: function (player, skill) { + var skills = player.getStorage("oldlongsong_back"); + for (var key of skills) { + game.log(player, "恢复了技能", "#g【" + get.translation(key) + "】"); + delete player.storage[key]; + } + player.enableSkill(skill); + player.popup(skills, "thunder"); + }, + }, + }, + }, + dclongsong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + getSkills(target, skills) { + return (target && !skills ? target.getSkills(null, false) : skills).filter(skill => { + var str = get.skillInfoTranslation(skill, target); + if (str.indexOf("当你于出牌阶段") != -1) return true; + var skills = game.expandSkills([skill]); + if ( + skills.some(skillx => { + var info = get.info(skillx); + if (!info || !info.enable) return false; + if (info.enable != "phaseUse" && info.enable != "chooseToUse" && (!Array.isArray(info.enable) || (!info.enable.includes("phaseUse") && !info.enable.includes("chooseToUse")))) return false; + if (info.juexingji || info.hiddenSkill || info.charlotte || info.limited || info.dutySkill) return false; + if (info.ai && info.ai.notemp) return false; + return true; + }) + ) + return true; + return false; + }); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: { color: "red" }, + selectCard: 1, + position: "he", + filterTarget: function (card, player, target) { + return player != target; + }, + ai1: function (card) { + return 6 - get.value(card); + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + return lib.skill.dclongsong.getSkills(target).length * 2 + att / 2.5; + }, + prompt: get.prompt2("dclongsong"), + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dclongsong", target); + event.target = target; + player.line(target, "green"); + player.give(result.cards, target); + var skills = lib.skill.dclongsong.getSkills(target); + if (skills.length) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + target.disableSkill("dclongsong_back", skills); + target.markAuto("dclongsong_back", skills); + player.addTempSkill("dclongsong_remove", ["phaseUseAfter", "phaseAfter"]); + player.markAuto("dclongsong_remove", skills); + target.addTempSkill("dclongsong_back", ["phaseUseAfter", "phaseAfter"]); + var str = ""; + for (var i = 0; i < skills.length; i++) { + str += "【" + get.translation(skills[i]) + "】"; + if (i != skills.length - 1) str += "、"; + } + game.log(target, "的技能", "#g" + str, "失效了"); + // game.log(player,'获得了技能','#g'+str); + player.popup(skills, "thunder"); + for (var skill of skills) { + player.addTempSkills(skill, ["phaseUseAfter", "phaseAfter"]); + } + } + } + }, + ai: { expose: 0.2 }, + subSkill: { + back: { + charlotte: true, + onremove: function (player, skill) { + var skills = player.getStorage("dclongsong_back"); + for (var key of skills) { + game.log(player, "恢复了技能", "#g【" + get.translation(key) + "】"); + //delete player.storage[key]; + } + player.enableSkill(skill); + player.popup(skills, "thunder"); + }, + }, + remove: { + trigger: { player: ["useSkill", "logSkillBegin"] }, + forced: true, + charlotte: true, + popup: false, + onremove: true, + filter: function (event, player) { + var skill = event.sourceSkill || event.skill; + return player.getStorage("dclongsong_remove").includes(skill) && !player.getStockSkills(false, true).includes(skill); + }, + content: function () { + "step 0"; + var skill = trigger.sourceSkill || trigger.skill; + player.removeSkills(skill); + player.unmarkAuto("dclongsong_remove", [skill]); + }, + }, + }, + }, + longsong: { + audio: "dclongsong", + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(target => { + if (target == player) return false; + return target.hasCard(card => { + if (get.position(card) == "h") return true; + return get.color(card) == "red" && lib.filter.canBeGained(card, player, target); + }, "he"); + }); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + prompt: get.prompt2("longsong"), + filterTarget(card, player, target) { + if (target === player) return false; + const skills = lib.skill.dclongsong.getSkills(target).map(skill => get.translation(skill)); + if (skills.length) { + target.prompt(skills.join("
    ")); + } + return ( + ui.selected.cards.length || + target.hasCard(card => { + if (get.position(card) == "h") return true; + return get.color(card) == "red" && lib.filter.canBeGained(card, player, target); + }, "he") + ); + }, + filterCard: { color: "red" }, + selectCard: [0, 1], + multitarget: true, + ai1(card) { + const ai2 = get.event("ai2"); + if ( + game.hasPlayer(current => { + return ai2(current) > 0; + }) + ) { + return -1 - get.value(card); + } + return 6 - get.value(card); + }, + ai2(target) { + const player = get.event("player"), + att = get.attitude(player, target); + if (att > 0 && !target.getGainableCards(player, "he").some(card => get.color(card) == "red")) return 0; + return lib.skill.dclongsong.getSkills(target).length + (att > 0 ? 0 : Math.max(0, get.effect(target, { name: "shunshou_copy2" }, player, player))); + }, + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0], + cards = event.cards, + gainableCards = target.getGainableCards(player, "he").filter(card => get.color(card) == "red"); + if (cards) { + await player.give(cards, target); + } else { + if (gainableCards.length) { + let dialog = ["龙诵:获得" + get.translation(target) + "的一张红色牌"]; + let cards1 = gainableCards.filter(i => get.position(i) == "h"), + cards2 = gainableCards.filter(i => get.position(i) == "e"); + if (cards1.length) { + dialog.push('
    手牌区
    '); + if (player.hasSkillTag("viewHandcard", null, target, true)) dialog.push(cards1); + else dialog.push([cards1.randomSort(), "blank"]); + } + if (cards2.length) { + dialog.push('
    装备区
    '); + dialog.push(cards2); + } + const { + result: { bool, links }, + } = await player.chooseButton(dialog, true).set("ai", button => { + const player = get.event("player"), + target = get.event().getParent().targets[0]; + return get.value(button.link, player) * get.value(button.link, target) * (1 + Math.random()); + }); + if (!bool) return; + await player.gain(links, target, "giveAuto", "bySelf"); + } else { + player.popup("杯具"); + player.chat("无牌可得?!"); + game.log("但是", target, "没有红色牌可被" + get.translation(player) + "获得!"); + } + } + let skills = lib.skill.dclongsong.getSkills(target), + fromTarget = true; + if (!skills.length) { + if (!_status.characterlist) { + lib.skill.pingjian.initList(); + } + const allList = _status.characterlist.slice(0); + allList.randomSort(); + for (const name of allList) { + const curSkills = lib.character[name][3]; + const filteredSkills = lib.skill.dclongsong.getSkills(null, curSkills); + if (filteredSkills.length > 0) { + skills = filteredSkills.randomGets(1); + fromTarget = false; + break; + } + } + } + if (!skills.length) return; + if (!event.isMine() && !event.isOnline()) await game.asyncDelayx(); + skills.forEach(skill => { + player.popup(skill, "thunder"); + }); + if (fromTarget) { + target.disableSkill("dclongsong_back", skills); + target.markAuto("dclongsong_back", skills); + target.addTempSkill("dclongsong_back", ["phaseUseAfter", "phaseAfter"]); + let str = ""; + for (let i = 0; i < skills.length; i++) { + str += "【" + get.translation(skills[i]) + "】"; + if (i != skills.length - 1) str += "、"; + } + game.log(target, "的技能", "#g" + str, "失效了"); + } + player.addTempSkill("dclongsong_remove", ["phaseUseAfter", "phaseAfter"]); + player.markAuto("dclongsong_remove", skills); + await player.addTempSkills(skills, ["phaseUseAfter", "phaseAfter"]); + }, + }, + //伏完 + dcmoukui: { + audio: "moukui", + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.isFirstTarget; + }, + content: function () { + "step 0"; + player + .chooseButton([ + get.prompt("dcmoukui"), + [ + [ + ["draw", "摸一张牌"], + ["discard", "弃置" + (trigger.targets.length == 1 ? get.translation(trigger.targets[0]) : "一名目标角色") + "的一张牌"], + ], + "textbutton", + ], + ]) + .set("filterButton", button => { + if ( + button.link == "discard" && + _status.event.getTrigger().targets.every(target => { + return target.countDiscardableCards(_status.event.player, "he") == 0; + }) + ) + return false; + return true; + }) + .set("ai", function (button) { + if ( + button.link == "discard" && + _status.event.getTrigger().targets.every(target => { + return get.effect(target, { name: "guohe_copy2" }, _status.event.player) <= 0; + }) + ) + return 0; + return 1; + }) + .set("selectButton", [1, 2]); + "step 1"; + if (result.bool) { + player.logSkill("dcmoukui"); + var choices = result.links; + event.choices = choices; + if (choices.includes("draw")) { + game.log(player, "选择了", "#y选项一"); + player.draw(); + } + if (choices.includes("discard")) { + game.log(player, "选择了", "#y选项二"); + if (trigger.targets.length == 1) event.directtarget = trigger.targets[0]; + else + player + .chooseTarget("谋溃:弃置一名目标角色的一张牌", true, (card, player, target) => { + return _status.event.getTrigger().targets.includes(target) && target.countDiscardableCards(player, "he") > 0; + }) + .set("ai", target => { + return get.effect(target, { name: "guohe_copy2" }, _status.event.player); + }); + } else event.finish(); + if (choices.length >= 2) { + player.addTempSkill("dcmoukui_conseq"); + player.markAuto("dcmoukui_conseq", [trigger.card]); + } + } + "step 2"; + player.discardPlayerCard(event.directtarget || result.targets[0], true, "he").boolline = true; + }, + subSkill: { + conseq: { + trigger: { + global: ["shaMiss", "useCardToExcluded", "eventNeutralized", "shaCancelled"], + }, + forced: true, + popup: false, + charlotte: true, + onremove: true, + filter: function (event, player, name) { + if (!event.card) return false; + var cards = player.getStorage("dcmoukui_conseq"); + if (!cards.includes(event.card)) return false; + return true; + }, + content: function () { + "step 0"; + game.delayx(); + "step 1"; + trigger.target.discardPlayerCard(player, true, "he").boolline = true; + }, + }, + }, + }, + //孙桓 + dcniji: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return get.type(event.card) != "equip"; + }, + frequent: true, + group: "dcniji_discard", + content: function () { + var next = player.draw(); + var evt = trigger.getParent("dcniji_discard"); + if (!evt || evt.player != player) next.gaintag = ["dcniji"]; + player.addTempSkill("dcniji_clear"); + }, + subSkill: { + clear: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("dcniji"); + }, + }, + discard: { + audio: "dcniji", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hasCard(card => card.hasGaintag("dcniji") && lib.filter.cardDiscardable(card, player, "dcniji"), "h"); + }, + forced: true, + locked: false, + content: function () { + "step 0"; + var cards = player.getCards("h", card => card.hasGaintag("dcniji") && lib.filter.cardDiscardable(card, player, "dcniji")); + event.cards = cards; + // if(cards.length>=player.hp){ + if (cards.some(card => player.hasUseTarget(card))) { + player.chooseToUse({ + prompt: "是否使用一张“逆击”牌?", + filterCard: function (card, player) { + if (get.itemtype(card) == "card" && !card.hasGaintag("dcniji")) return false; + return lib.filter.filterCard.apply(this, arguments); + }, + ai1: function (card) { + return get.player().getUseValue(card); + }, + }); + } + // } + "step 1"; + if (result.bool) game.delayex(); + var cards = cards.filter(card => get.owner(card) == player && get.position(card) == "h" && lib.filter.cardDiscardable(card, player, "dcniji")); + if (cards.length) player.discard(cards); + }, + }, + }, + }, + //孙狼 + dctingxian: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + usable: 1, + filter: function (event, player) { + return event.card.name == "sha" && event.getParent().triggeredTargets3.length == event.targets.length; + }, + check: function (event, player) { + return event.targets.some(target => get.effect(target, event.card, player, player) <= 0); + }, + content: function () { + "step 0"; + var num = player.countCards("e") + 1; + event.num = num; + player.draw(num); + "step 1"; + var num = Math.min(trigger.targets.length, num); + player + .chooseTarget("铤险:令此杀对其中至多" + get.cnNumber(num) + "个目标无效", [1, num], true, (card, player, target) => { + return _status.event.getTrigger().targets.includes(target); + }) + .set("ai", target => { + return 1 - get.effect(target, _status.event.getTrigger().card, _status.event.player, _status.event.player); + }); + "step 2"; + if (result.bool) { + player.line(result.targets); + trigger.getParent().excluded.addArray(result.targets); + } + }, + ai: { + effect: { + player: function (card, player, target) { + if (_status.event.name == "chooseToUse" && get.name(card) == "sha" && (!player.storage.counttrigger || !player.storage.counttrigger.dctingxian) && !_status._dctingxian_aiChecking) { + _status._dctingxian_aiChecking = true; + var eff = get.effect(target, { name: "sha" }, player, player); + delete _status._dctingxian_aiChecking; + if ( + eff < 0 && + ui.selected.targets.filter(targetx => { + if (targetx == target) return false; + _status._dctingxian_aiChecking = true; + var eff = get.effect(targetx, { name: "sha" }, player, player); + delete _status._dctingxian_aiChecking; + if (eff < 0) return true; + }).length < + player.countCards("e") + 1 + ) + return [0, 0, 0, 0.5]; + } + }, + }, + }, + }, + dcbenshi: { + audio: 2, + forced: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + var card = event.card; + var range; + var select = get.copy(get.info(card).selectTarget); + if (select == undefined) { + if (get.info(card).filterTarget == undefined) return false; + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, player, range, "selectTarget", player); + return range[1] == -1; + }, + content: function () {}, + mod: { + attackRangeBase: function (player, num) { + if (num !== "unchanged") return num; + var range = 1; + var equips = player.getCards("e", function (card) { + return get.subtype(card) != "equip1" && (!ui.selected.cards || !ui.selected.cards.includes(card)); + }); + for (var i = 0; i < equips.length; i++) { + var info = get.info(equips[i], false).distance; + if (!info) continue; + if (info.attackFrom) { + range -= info.attackFrom; + } + } + return range; + }, + attackRange: function (player, num) { + return num + 1; + }, + selectTarget: function (card, player, range) { + if (card.name == "sha") { + range[0] = -1; + range[1] = -1; + } + }, + }, + }, + //是仪 + dccuichuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: true, + filterCard: true, + derivation: "dczuojian", + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + event.num = target.countCards("e"); + var subtypes = []; + for (var i = 1; i < 7; i++) { + if (target.hasEmptySlot(i)) subtypes.push("equip" + i); + } + if (subtypes.length) { + subtypes.randomSort(); + for (var subtype of subtypes) { + var card = get.cardPile2(card => get.subtype(card) == subtype); + if (card && target.canUse(card, target)) { + target.chooseUseTarget(card, true, "nopopup"); + break; + } + } + } + "step 1"; + var numx = target.countCards("e"); + if (numx > 0) player.draw(numx); + game.delayx(); + "step 2"; + event.num2 = target.countCards("e"); + if (event.num2 == 4 && num != 4) { + player.trySkillAnimate("dccuichuan_animate", "dccuichuan_animate", player.checkShow("dccuichuan")); + //player.removeSkill('dccuichuan'); + //game.log(player,'失去了技能','#g【榱椽】'); + player.changeSkills(["dczuojian"], ["dccuichuan"]); + target.insertPhase(); + game.delayx(); + } + }, + subSkill: { + animate: { + skillAnimation: true, + animationColor: "wood", + }, + }, + ai: { + order: 7, + result: { + target: function (player, target) { + if (target.countCards("e") == 3) return 2; + return 1; + }, + player: function (player, target) { + if (target.countCards("e") == 3) return 0.5; + return target.countCards("e") + 1; + }, + }, + }, + }, + dczhengxu: { + audio: 2, + group: ["dczhengxu_lose", "dczhengxu_damage"], + subSkill: { + lose: { + audio: "dczhengxu", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + prompt2: function (event, player) { + return "当你失去牌后,若你本回合受到过伤害,你可以摸等量的牌(" + get.cnNumber(event.getl(player).cards2.length) + "张)"; + }, + check: () => true, + filter: function (event, player) { + if (event.name == "gain" && event.player == player) return false; + if (!player.getHistory("damage").length || player.hasHistory("useSkill", evt => evt.skill == "dczhengxu_lose")) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; + }, + content: function () { + player.draw(trigger.getl(player).cards2.length); + }, + ai: { + effect: { + target: (card, player, target) => { + if ((get.tag(card, "lose") || get.tag(card, "discard")) && target.getHistory("damage").length && !target.hasHistory("useSkill", evt => evt.skill == "dczhengxu_lose")) return [1, 1]; + }, + }, + }, + }, + damage: { + audio: "dczhengxu", + trigger: { + player: "damageBegin4", + }, + prompt2: "当你受到伤害时,若你本回合失去过牌,你可以防止之", + check: () => true, + filter: function (event, player) { + if (!player.hasHistory("lose", evt => evt.cards2 && evt.cards2.length) || player.hasHistory("useSkill", evt => evt.skill == "dczhengxu_damage")) return false; + return true; + }, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: (card, player, target) => { + if (player.hasSkillTag("jueqing", false, target) || !get.tag(card, "damage")) return; + if (target.hasHistory("useSkill", evt => evt.skill == "dczhengxu_damage") || !target.hasHistory("lose", evt => evt.cards2 && evt.cards2.length)) return; + if (get.attitude(player, target) >= 0) return "zeroplayertarget"; + let num = 0, + shas = player.getCardUsable("sha"), + hs = player.getCards("hs", i => { + if (i === card || (card.cards && card.cards.includes(i)) || !get.tag(i, "damage") || !player.canUse(i, target)) return false; + if (get.name(i) === "sha") { + num++; + return false; + } + return true; + }); + if (card.name === "sha") shas--; + num = Math.min(num, shas); + num += hs.length; + if (!num) return "zeroplayertarget"; + num = 1 - 2 / 3 / num; + return [num, 0, num, 0]; + }, + }, + }, + }, + }, + }, + dczuojian: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return ( + player.getHistory("useCard", evt => { + var evtx = evt.getParent("phaseUse"); + if (evtx && evtx == event) return true; + return false; + }).length >= player.hp + ); + }, + direct: true, + content: function () { + "step 0"; + var choices = []; + var choiceList = ["令装备区牌数多于你的角色各摸一张牌", "令装备区牌数少于你的角色各弃置一张手牌"]; + var num = player.countCards("e"); + var targets = [], + targets2 = []; + var eff = 0, + eff2 = 0; + for (var target of game.filterPlayer()) { + if (target.countCards("e") > num) { + targets.push(target); + eff += get.attitude(player, target); + } + if (target.countCards("e") < num) { + targets2.push(target); + eff2 -= get.attitude(player, target); + } + } + event.targets = targets; + event.targets2 = targets2; + if (targets.length) { + choices.push("选项一"); + choiceList[0] += "(" + get.translation(targets) + ")"; + } else choiceList[0] = '' + choiceList[0] + ""; + if (targets2.length) { + choices.push("选项二"); + choiceList[1] += "(" + get.translation(targets2) + ")"; + } else choiceList[1] = '' + choiceList[1] + ""; + if (!choices.length) event.finish(); + else + player + .chooseControl(choices, "cancel2") + .set("prompt", get.prompt("dczuojian")) + .set("choiceList", choiceList) + .set("ai", () => { + var controls = _status.event.controls, + choice = _status.event.choice; + if (!controls.includes("选项一") || (controls.includes("选项二") && choice == 1)) return "选项二"; + return "选项一"; + }) + .set("choice", eff <= 0 && eff2 <= 0 ? "cancel2" : eff > -eff2 ? 0 : 1); + "step 1"; + if (result.control == "选项一") { + player.logSkill("dczuojian", targets); + game.asyncDraw(targets, 1); + } else if (result.control == "选项二") { + player.logSkill("dczuojian", event.targets2); + for (var target of event.targets2) { + player.discardPlayerCard("h", target, true); + } + } + }, + }, + //胡金定 + dcdeshi: { + audio: 2, + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return player.isDamaged() && event.card && event.card.name == "sha"; + }, + content: function () { + "step 0"; + trigger.cancel(); + for (var func of ["discardPile", "cardPile2"]) { + var card = get[func](card => card.name == "sha"); + if (card) { + player.gain(card, "gain2"); + break; + } + } + "step 1"; + player.loseMaxHp(); + }, + ai: { + halfneg: true, + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") return true; + return false; + }, + }, + }, + dcwuyuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", "sha") > 0; + }, + filterCard: { name: "sha" }, + filterTarget: lib.filter.notMe, + check: function (card) { + var player = _status.event.player; + if ( + get.color(card) == "red" && + game.hasPlayer(function (current) { + return current != player && current.isDamaged() && get.attitude(player, current) > 2; + }) + ) + return 2; + if (get.natureList(card).length) return 1.5; + return 1; + }, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.give(cards, target, "give"); + player.recover(); + "step 1"; + var num = 1; + if (get.natureList(cards[0]).length) num++; + player.draw("nodelay"); + target.draw(num); + if (get.color(cards[0]) == "red") target.recover(); + }, + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.isDamaged()) return 1; + return 0; + }, + target: function (player, target) { + if (ui.selected.cards.length) { + var num = 1; + if (get.natureList(ui.selected.cards[0]).length) num++; + if (target.hasSkillTag("nogain")) num = 0; + if (get.color(ui.selected.cards[0]) == "red") return num + 2; + else return num + 1; + } + return 1; + }, + }, + }, + }, + //李异谢旌 + dcdouzhen: { + audio: 2, + trigger: { + player: ["useCard", "respond"], + }, + forced: true, + zhuanhuanji: "number", + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + var str = "
  • 已转换过" + get.cnNumber(storage || 0) + "次。
  • 你的回合内,"; + str += player.countMark("dcdouzhen") % 2 ? "你的红色基本牌均视为普【杀】且无次数限制。" : "你的黑色基本牌均视为【决斗】且使用时获得目标的一张牌。"; + return str; + }, + }, + filter: function (event, player) { + if (player != _status.currentPhase || !event.card.isCard || !event.cards || event.cards.length != 1 || get.type(event.cards[0]) != "basic") return false; + if (player.countMark("dcdouzhen") % 2) return get.color(event.cards[0]) == "red" && event.card.name == "sha"; + return event.name != "respond" && get.color(event.cards[0]) == "black" && event.card.name == "juedou"; + }, + content: function () { + if (player.countMark("dcdouzhen") % 2) { + // if(trigger.addCount!==false){ + // trigger.addCount=false; + // if(player.stat[player.stat.length-1].card.sha>0){ + // player.stat[player.stat.length-1].card.sha--; + // } + // } + } else { + if (trigger.targets.length && trigger.targets.filter(i => i.countGainableCards(player, "he") > 0).length) player.gainMultiple(trigger.targets.sortBySeat(), "he"); + } + player.changeZhuanhuanji("dcdouzhen"); + }, + ai: { + effect: { + player: function (card, player, target) { + if (card.name != "juedou") return; + if ( + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) + ) { + return [1, 1]; + } + var hs1 = target.getCards("h", "sha"); + var hs2 = player.getCards("h", card => (get.color(card) == "red" && get.type(card) == "basic") || get.name(card) == "sha"); + var hsx = target.getCards("h"); + if (hs1.length > hs2.length + 1 || (hsx.length > 2 && hs2.length == 0 && hsx[0].number < 6) || (hsx.length > 3 && hs2.length == 0) || (hs1.length > hs2.length && (!hs2.length || hs1[0].number > hs2[0].number))) { + return [1, -2]; + } + return [1, -0.5]; + }, + }, + }, + mod: { + cardname: function (card, player) { + if (get.type(card, null, false) != "basic" || player != _status.currentPhase) return; + if (player.countMark("dcdouzhen") % 2) { + if (get.color(card) == "red") return "sha"; + } else { + if (get.color(card) == "black") return "juedou"; + } + }, + cardnature: function (card, player) { + if (get.type(card, null, false) != "basic" || player != _status.currentPhase) return; + if (player.countMark("dcdouzhen") % 2) { + if (get.color(card) == "red") return false; + } + }, + cardUsable: function (card, player) { + if (_status.currentPhase == player && card.name == "sha" && player.countMark("dcdouzhen") % 2 && get.color(card) == "red" && card.isCard) return Infinity; + }, + }, + }, + //穆顺 + dcjinjian: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + forced: true, + locked: false, + filter: function (event, player, name) { + return name == "damageSource" || (event.source && event.source != player && event.source.isIn()); + }, + content: function () { + "step 0"; + player.addMark("dcjinjian", 1); + game.delayx(); + "step 1"; + var source = trigger.source; + if (source && source != player && source.isIn() && player.canCompare(source)) { + player + .chooseBool("是否和" + get.translation(source) + "拼点?", "若你赢,则你恢复1点体力") + .set( + "goon", + (player.countCards("h") == 1 || + player.hasCard(function (card) { + return get.value(card) <= 5 || get.number(card) > 10; + })) && + (get.attitude(player, source) <= 0 || source.countCards("h") >= 4) + ) + .set("ai", function () { + return _status.event.goon; + }); + } else event.finish(); + "step 2"; + if (result.bool) { + player.line(trigger.source, "green"); + player.chooseToCompare(trigger.source); + } else event.finish(); + "step 3"; + if (result.bool) player.recover(); + }, + intro: { + name2: "劲", + content: "mark", + }, + mod: { + attackRange: function (player, num) { + return num + player.countMark("dcjinjian"); + }, + }, + }, + dcshizhao: { + audio: 2, + usable: 1, + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + return player != _status.currentPhase && player.countCards("h") == 0 && event.getl(player).hs.length > 0; + }, + content: function () { + if (player.hasMark("dcjinjian")) { + player.removeMark("dcjinjian", 1); + player.draw(2); + } else { + player.addTempSkill("dcshizhao_effect"); + player.addMark("dcshizhao_effect", 1, false); + game.delayx(); + } + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + trigger: { player: "damageBegin1" }, + forced: true, + content: function () { + trigger.num += player.countMark(event.name); + player.removeSkill(event.name); + }, + }, + }, + ai: { + combo: "dcjinjian", + }, + }, + //赵俨 + dcfuning: { + audio: 2, + trigger: { player: "useCard" }, + prompt2: function (event, player) { + return ( + "摸两张牌,然后弃置" + + get.cnNumber( + 1 + + player.getHistory("useSkill", function (evt) { + return evt.skill == "dcfuning"; + }).length + ) + + "张牌" + ); + }, + check: function (event, player) { + return ( + player.getHistory("useSkill", function (evt) { + return evt.skill == "dcfuning"; + }).length < 2 + ); + }, + content: function () { + player.draw(2); + player.chooseToDiscard( + "he", + true, + +player.getHistory("useSkill", function (evt) { + return evt.skill == "dcfuning"; + }).length + ); + }, + }, + dcbingji: { + audio: 2, + enable: "phaseUse", + usable: 4, + filter: function (event, player) { + var hs = player.getCards("h"), + suits = player.getStorage("dcbingji_mark"); + if (!hs.length) return false; + var suit = get.suit(hs[0], player); + if (suit == "none" || suits.includes(suit)) return false; + for (var i = 1; i < hs.length; i++) { + if (get.suit(hs[i], player) != suit) return false; + } + return true; + }, + ai: { + order: 10, + result: { player: 1 }, + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("秉纪", [["sha", "tao"], "vcard"], "hidden"); + }, + filter: function (button, player) { + return lib.filter.cardEnabled( + { + name: button.link[2], + isCard: true, + storage: { dcbingji: true }, + }, + player, + "forceEnable" + ); + }, + check: function (button) { + var card = { + name: button.link[2], + isCard: true, + storage: { dcbingji: true }, + }, + player = _status.event.player; + return Math.max.apply( + Math, + game + .filterPlayer(function (target) { + if (player == target) return false; + return lib.filter.targetEnabled2(card, player, target) && lib.filter.targetInRange(card, player, target); + }) + .map(function (target) { + return get.effect(target, card, player, player); + }) + ); + }, + backup: function (links, player) { + return { + viewAs: { + name: links[0][2], + isCard: true, + storage: { dcbingji: true }, + }, + filterCard: () => false, + selectCard: -1, + filterTarget: function (card, player, target) { + if (!card) card = get.card(); + if (player == target) return false; + return lib.filter.targetEnabled2(card, player, target) && lib.filter.targetInRange(card, player, target); + }, + selectTarget: 1, + ignoreMod: true, + filterOk: () => true, + precontent: function () { + player.logSkill("dcbingji"); + delete event.result.skill; + var hs = player.getCards("h"); + player.showCards(hs, get.translation(player) + "发动了【秉纪】"); + player.markAuto("dcbingji_mark", [get.suit(hs[0], player)]); + player.addTempSkill("dcbingji_mark"); + }, + }; + }, + prompt: function (links, player) { + return "请选择【" + get.translation(links[0][2]) + "】的目标"; + }, + }, + subSkill: { + mark: { + charlotte: true, + onremove: true, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return event.addCount !== false && event.card.name == "sha" && event.card.storage && event.card.storage.dcbingji; + }, + content: function () { + trigger.addCount = false; + player.getStat("card").sha--; + }, + }, + }, + }, + //王威 + dcruizhan: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player != event.player && event.player.countCards("h") >= Math.max(1, event.player.hp) && player.canCompare(event.player); + }, + logTarget: "player", + check: function (event, player) { + var goon = player.hasCard(function (card) { + return card.name == "sha" || get.value(card) <= 5; + }); + var target = event.player; + if (goon && get.attitude(player, target) < 0) { + return get.effect(target, { name: "sha" }, player, player) > 0; + } + return 0; + }, + content: function () { + "step 0"; + event.target = trigger.player; + player.chooseToCompare(event.target).set("ai", 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 (player == event.player) { + if (get.name(card, player) == "sha") { + return 10 + getn(card); + } + return getn(card) - get.value(card) / 2 + addi; + } else { + if (get.name(card, player) == "sha") { + return -10 - getn(card) - get.value(card) / 2 + addi; + } + return getn(card) - get.value(card) / 2 + addi; + } + }); + "step 1"; + var bool1 = result.bool; + var bool2 = get.name(result.player, player) == "sha" || get.name(result.target, target) == "sha"; + if (bool1 || bool2) { + if (player.canUse("sha", target, false)) { + player.useCard({ name: "sha", isCard: true }, target, false); + if (!bool1 || !bool2) event.finish(); + } else event.finish(); + } else event.finish(); + "step 2"; + if ( + target.hasCard(function (card) { + return lib.filter.canBeGained(card, target, player); + }, "he") && + player.hasHistory("sourceDamage", function (evt) { + var evtx = evt.getParent("useCard"); + return evtx && evtx.card == evt.card && evtx.getParent() == event; + }) + ) + player.gainPlayerCard(target, true, "he"); + }, + }, + dcshilie: { + audio: 2, + enable: "phaseUse", + usable: 1, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog( + "示烈:请选择一项", + [ + [ + ["recover", "回复1点体力,将两张牌置于武将牌上作为“示烈”"], + ["losehp", "失去1点体力,获得两张“示烈”牌"], + ], + "textbutton", + ], + "hidden" + ); + }, + check: function (button) { + return button.link == "recover" ? 1 : 0; + }, + backup: function (links, player) { + return get.copy(lib.skill["dcshilie_" + links[0]]); + }, + prompt: () => "点击“确定”以执行选项", + }, + intro: { + markcount: "expansion", + content: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "dcshilie_die", + ai: { + order: 0.5, + result: { + player: function (player) { + if (player.isDamaged() && !player.countCards("h", "tao")) return 1; + return 0; + }, + }, + }, + subSkill: { + backup: {}, + recover: { + audio: "dcshilie", + selectCard: -1, + selectTarget: -1, + filterCard: () => false, + filterTarget: () => false, + multitarget: true, + content: function () { + "step 0"; + player.recover(); + "step 1"; + var hs = player.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", 2, true, "选择两张牌作为“示烈”牌"); + "step 2"; + if (result.bool) { + player.addToExpansion(result.cards, player, "give").gaintag.add("dcshilie"); + } else event.finish(); + "step 3"; + var cards = player.getExpansions("dcshilie"); + if (cards.length > game.countPlayer()) { + player.loseToDiscardpile(cards.slice(game.countPlayer())); + } + }, + }, + losehp: { + audio: "dcshilie", + selectCard: -1, + selectTarget: -1, + filterCard: () => false, + filterTarget: () => false, + multitarget: true, + content: function () { + "step 0"; + player.loseHp(); + "step 1"; + var hs = player.getExpansions("dcshilie"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, links: hs }; + else player.chooseButton(["选择获得两张“示烈”牌", hs], 2, true); + "step 2"; + if (result.bool) { + player.gain(result.links, "gain2"); + } + }, + }, + die: { + audio: "dcshilie", + forceDie: true, + trigger: { player: "die" }, + filter: function (event, player) { + return player.getExpansions("dcshilie").length > 0; + }, + direct: true, + skillAnimation: true, + animationColor: "metal", + content: function () { + "step 0"; + player.chooseTarget(get.prompt("dcshilie"), "令一名角色获得你的“示烈”牌", function (card, player, target) { + return target != player && target != _status.event.getTrigger().source; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcshilie_die", target); + player.give(player.getExpansions("dcshilie"), target, "give"); + } + }, + }, + }, + }, + //胡班 + dcchongyi: { + audio: 2, + init: () => { + game.addGlobalSkill("dcchongyi_ai"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("dcchongyi"), true)) game.removeGlobalSkill("dcchongyi_ai"); + }, + trigger: { global: "useCard" }, + logTarget: "player", + filter: function (event, player) { + if (event.card.name != "sha" || !event.player.isIn()) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + var goon = false; + var history = event.player.getHistory("useCard", function (evtx) { + if (goon || evtx.getParent("phaseUse") != evt) return false; + goon = true; + return true; + }); + return history[0] == event; + }, + prompt2: event => "令其摸两张牌,且使用【杀】的次数上限+1", + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + content: function () { + var target = trigger.player; + target.draw(2); + target.addMark("dcchongyi_sha", 1, false); + target.addTempSkill("dcchongyi_sha"); + }, + group: "dcchongyi_end", + subSkill: { + ai: { + mod: { + aiOrder: function (player, card, num) { + if (card.name != "sha") return; + var evt = _status.event.getParent("phaseUse"); + if (!evt || evt.player != player) return; + if ( + player.hasHistory("useCard", function (evtx) { + return evtx.getParent("phaseUse") == evt; + }) + ) + return; + if ( + game.hasPlayer(function (current) { + return current.hasSkill("dcchongyi") && get.attitude(player, current) >= 0; + }) + ) + return num + 10; + }, + }, + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("dcchongyi"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("dcchongyi_ai"); + }, + }, + end: { + audio: "dcchongyi", + trigger: { global: "phaseUseEnd" }, + logTarget: "player", + filter: function (event, player) { + if (!event.player.isIn()) return false; + var history = event.player.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; + }); + return history.length && history[history.length - 1].card.name == "sha"; + }, + prompt2(event, player) { + const target = event.player; + const history = target.getHistory("useCard", evt => { + return evt.getParent("phaseUse") === event; + }); + const evt = history.lastItem, + cards = evt.cards.filterInD("d"); + let str = "令" + get.translation(target) + "本回合的手牌上限+1"; + if (cards.length) str += `,然后你获得${get.translation(cards)}`; + str += "。"; + return str; + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + async content(event, trigger, player) { + const target = trigger.player; + target.addMark("dcchongyi_keep", 1, false); + target.addTempSkill("dcchongyi_keep"); + const history = target.getHistory("useCard", evt => { + return evt.getParent("phaseUse") === trigger; + }); + const evt = history.lastItem, + cards = evt.cards.filterInD("d"); + if (cards.length) await player.gain(cards, "gain2"); + else await game.asyncDelayx(); + }, + }, + sha: { + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("dcchongyi_sha"); + }, + }, + onremove: true, + intro: { content: "使用【杀】的次数上限+#" }, + }, + keep: { + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("dcchongyi_keep"); + }, + }, + onremove: true, + intro: { content: "手牌上限+#" }, + }, + }, + }, + //牛辅 + dcxiaoxi: { + auto: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + filter: function (event, player) { + return player.maxHp > 1; + }, + content: function () { + "step 0"; + if (player.maxHp <= 2) event._result = { index: 0 }; + else + player + .chooseControl("1点", "2点") + .set("prompt", "宵袭:减少1或2点体力上限") + .set("ai", function () { + var player = _status.event.player; + if ( + !game.hasPlayer(function (current) { + if (!player.inRange(current) || get.attitude(player, current) >= 0) return false; + if ( + get.effect(current, { name: "shunshou_copy2" }, player, player) > 0 && + current.countCards("h") + + current.countCards("e", function (card) { + return get.value(card, current) > 0; + }) > + 1 + ) + return true; + if (get.effect(current, { name: "sha" }, player, player) > 0 && current.countCards("hs", "shan") + current.hp > 1) return true; + }) + ) + return 0; + return 1; + }); + "step 1"; + player.loseMaxHp(1 + result.index); + event.num = 1 + result.index; + "step 2"; + if (!game.hasPlayer(current => player.inRange(current))) event.finish(); + else + player + .chooseTarget( + "请选择【宵袭】的目标", + "然后你选择一项:⒈获得该角色的" + get.cnNumber(num) + "张牌。⒉视为对其使用" + get.cnNumber(num) + "张【杀】。", + function (card, player, target) { + return player.inRange(target); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) >= 0) return 0; + var eff1 = get.effect(target, { name: "shunshou_copy2" }, player, player); + if ( + eff1 > 0 && + target.countCards("h") + + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) > + 1 + ) + eff1 *= 1.6; + var eff2 = player.canUse("sha", target) ? get.effect(target, { name: "sha" }, player, player) : 0; + if (eff2 > 0 && target.countCards("hs", "shan") + target.hp > 1) eff2 *= 2; + return Math.max(eff1, eff2); + }); + "step 3"; + var target = result.targets[0]; + player.line(target, "green"); + event.target = target; + var bool1 = target.countGainableCards(player, "he") > 0; + var bool2 = player.canUse("sha", target); + if (!bool1 && !bool2) event.finish(); + else if (bool1 && bool2) { + var str = get.translation(target), + numx = get.cnNumber(num); + player + .chooseControl() + .set("choiceList", ["获得" + str + "的" + numx + "张牌", "视为对" + str + "使用" + numx + "张【杀】"]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + var eff1 = get.effect(target, { name: "shunshou_copy2" }, player, player); + if ( + eff1 > 0 && + target.countCards("h") + + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) > + 1 + ) + eff1 *= 1.6; + var eff2 = player.canUse("sha", target) ? get.effect(target, { name: "sha" }, player, player) : 0; + if (eff2 > 0 && target.countCards("hs", "shan") + target.hp > 1) eff2 *= 2; + return eff1 > eff2 ? 0 : 1; + }); + } else event._result = { index: bool1 ? 0 : 1 }; + "step 4"; + if (result.index == 0) { + player.gainPlayerCard(target, true, num, "he"); + event.finish(); + } + "step 5"; + event.num--; + if (player.canUse("sha", target, false)) { + player.useCard({ name: "sha", isCard: true }, target, false); + if (event.num > 0) event.redo(); + } + }, + }, + xiongrao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + limited: true, + skillAnimation: true, + animationColor: "soil", + prompt: function (event, player) { + var str = "是否发动【熊扰】?"; + str += "(可摸" + get.cnNumber(Math.max(0, 7 - player.maxHp)) + "张牌)"; + return str; + }, + logTarget: (event, player) => game.filterPlayer(current => current != player), + check: function (event, player) { + return player.maxHp <= 3; + }, + content: function () { + player.awakenSkill("xiongrao"); + game.countPlayer(function (current) { + if (current != player) current.addTempSkill("xiongrao_blocker"); + }); + var num = 7 - player.maxHp; + if (num > 0) { + player.gainMaxHp(num); + player.draw(num); + } + }, + subSkill: { + blocker: { + init: function (player, skill) { + player.addSkillBlocker(skill); + }, + onremove: function (player, skill) { + player.removeSkillBlocker(skill); + }, + charlotte: true, + locked: true, + skillBlocker: function (skill, player) { + var info = get.info(skill); + return info && !info.charlotte && !get.is.locked(skill) && !info.limited && !info.juexingji; + }, + mark: true, + marktext: "扰", + intro: { + content: function (list, player, skill) { + var storage = player.getSkills(null, false, false).filter(function (i) { + return lib.skill.xiongrao_blocker.skillBlocker(i, player); + }); + if (storage.length) return "失效技能:" + get.translation(storage); + return "无失效技能"; + }, + }, + }, + }, + }, + //卞喜 + dunxi: { + audio: 2, + trigger: { player: "useCard" }, + direct: true, + filter: function (event, player) { + if (!get.tag(event.card, "damage")) return false; + return event.targets.some(target => target != player && target.isIn()); + }, + content: function () { + "step 0"; + var targets = trigger.targets.filter(function (current) { + return current != player && current.isIn(); + }); + if (targets.length == 1) { + event.target = targets[0]; + player + .chooseBool(get.prompt("dunxi", event.target), "令" + get.translation(event.target) + "获得一枚“钝”标记") + .set("goon", get.attitude(player, event.target) < 0) + .set("ai", () => _status.event.goon); + } else { + player + .chooseTarget(get.prompt("dunxi"), "选择一名目标角色获得一枚“钝”标记", function (card, player, target) { + return target != player && _status.event.getTrigger().targets.includes(target); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att >= 0) return 0; + return -att / (1 + target.hasMark("dunxi")); + }); + } + "step 1"; + if (result.bool) { + var target = event.target || result.targets[0]; + player.logSkill("dunxi", target); + target.addMark("dunxi", 1); + game.delayx(); + } + }, + intro: { content: "mark", name2: "钝" }, + group: "dunxi_random", + subSkill: { + random: { + audio: "dunxi", + trigger: { global: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + if (!event.player.hasMark("dunxi") || event.targets.length != 1 || event._dunxi || _status.dying.length) return false; + var type = get.type2(event.card, false); + return type == "basic" || type == "trick"; + }, + logTarget: "player", + line: "fire", + content: function () { + "step 0"; + trigger._dunxi = true; + trigger.player.removeMark("dunxi", 1); + var target = trigger.targets[0]; + event.target = target; + trigger.targets.remove(target); + //trigger.triggeredTargets1.remove(target); + trigger.untrigger(); + game.delayx(); + "step 1"; + var list; + if (get.type(event.card) != "delay") + list = game.filterPlayer(function (current) { + return lib.filter.targetEnabled2(trigger.card, trigger.player, current); + }); + else + list = game.filterPlayer(function (current) { + return current.canAddJudge(event.card); + }); + if (list.length) target = list.randomGet(); + trigger.targets.push(target); + trigger.player.line(target, "fire"); + game.log(trigger.card, "的目标被改为", target); + if (target == event.target) { + trigger.player.loseHp(); + var evt = trigger.getParent("phaseUse"); + if (evt && evt.player == trigger.player) evt.skipped = true; + } + }, + }, + }, + }, + //冯方 + dcditing: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + logTarget: "player", + filter: function (event, player) { + return player.hp > 0 && event.player.countCards("h") > 0 && event.player.inRange(player); + }, + prompt2: (event, player) => "观看其" + get.cnNumber(Math.min(player.hp, event.player.countCards("h"))) + "张手牌并选择其中一张", + check: function (event, player) { + var target = event.player; + if (get.attitude(player, target) > 0) return true; + if (Math.min(player.hp, target.countCards("h")) > 2) return true; + return false; + }, + content: function () { + "step 0"; + var target = trigger.player; + var cards = target.getCards("h"); + var num = Math.min(cards.length, player.hp), + cards2 = cards.randomGets(num); + player.chooseButton([get.translation(target) + "的手牌(" + num + "/" + cards.length + ")", cards2], true).set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getTrigger().player, + card = button.link; + var att = get.attitude(player, target); + var val = target.getUseValue(card, null, true); + if (val <= 0) return (-get.value(card, target) / 2) * get.sgn(att - 0.05); + if (target.canUse(card, player) && get.effect(player, card, target, target) > 0) { + var eff = get.effect(player, card, target, player); + if (eff < 0) val -= eff; + } + return val; + }); + "step 1"; + if (result.bool) { + player.addTempSkill("dcditing_effect", "phaseUseAfter"); + player.storage.dcditing_effect = [trigger.player, result.links[0]]; + } + }, + subSkill: { + effect: { + audio: "dcditing", + charlotte: true, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + var list = player.storage.dcditing_effect; + return list && event.player == list[0] && event.cards.includes(list[1]); + }, + content: function () { + trigger.excluded.add(player); + game.delayx(); + }, + group: ["dcditing_draw", "dcditing_gain"], + }, + draw: { + audio: "dcditing", + charlotte: true, + trigger: { global: "useCardAfter" }, + forced: true, + filter: function (event, player) { + var list = player.storage.dcditing_effect; + return list && event.player == list[0] && event.cards.includes(list[1]) && !event.targets.includes(player); + }, + content: function () { + player.draw(2); + }, + }, + gain: { + audio: "dcditing", + charlotte: true, + trigger: { global: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + var list = player.storage.dcditing_effect; + return list && event.player == list[0] && event.player.getCards("h").includes(list[1]); + }, + content: function () { + var list = player.storage.dcditing_effect; + player.gain(list[0], list[1], "giveAuto", "bySelf"); + }, + }, + }, + }, + dcbihuo: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + direct: true, + filter: function (event, player) { + return event.source && event.player != event.source; + }, + content: function () { + "step 0"; + event.num = event.triggername == "damageEnd" ? 1 : -1; + player.chooseTarget(get.prompt("dcbihuo"), "令一名角色下回合的额定摸牌数" + (event.num > 0 ? "+1" : "-1")).set("ai", function (target) { + var player = _status.event.player, + num = _status.event.getParent().num; + var att = get.attitude(player, target); + if (num > 0) { + if (att <= 0) return 0; + if (target.hasJudge("lebu")) return att / 10; + return (att / Math.sqrt(Math.min(5, 1 + target.countCards("h")))) * Math.sqrt(1 + target.hp); + } + if (num < 0) { + if (att >= 0) return 0; + if ((target.storage.dcbihuo_effect || 0) <= -2) return -att / 10; + return (-att / Math.sqrt(Math.min(5, 1 + target.countCards("h")))) * Math.sqrt(1 + target.hp); + } + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcbihuo", target); + if (typeof target.storage.dcbihuo_effect != "number") target.storage.dcbihuo_effect = 0; + target.storage.dcbihuo_effect += event.num; + target.addTempSkill("dcbihuo_effect", { player: "phaseAfter" }); + game.delayx(); + } + }, + subSkill: { + effect: { + charlotte: true, + trigger: { player: "phaseDrawBegin" }, + forced: true, + onremove: true, + content: function () { + var num = player.storage.dcbihuo_effect; + trigger.num += num; + game.log(player, "的额定摸牌数", "#g" + (num >= 0 ? "+" : "") + num); + }, + mark: true, + intro: { + content: num => "额定摸牌数" + (num >= 0 ? "+" : "") + num, + }, + }, + }, + }, + //秦宜禄 + piaoping: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + zhuanhuanji: true, + filter: function (event, player) { + return !player.hasSkill("piaoping_blocker", null, null, false); + }, + content: function () { + player.changeZhuanhuanji("piaoping"); + var num = Math.min( + player.hp, + player.getHistory("useSkill", function (evt) { + return evt.skill == "piaoping"; + }).length + ); + if (num <= 0) return; + if (player.storage.piaoping == true) player.draw(num); + else if ( + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "piaoping"); + }, "he") + ) { + game.delayx(); + player.chooseToDiscard(true, "he", num); + } + }, + mark: true, + marktext: "☯", + intro: { + content: function (storage) { + if (storage) return "转换技,锁定技。当你使用一张牌时,你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)"; + return "转换技,锁定技。当你使用一张牌时,你摸X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)"; + }, + }, + subSkill: { blocker: { charlotte: true } }, + }, + tuoxian: { + audio: 2, + ai: { combo: "piaoping" }, + trigger: { player: "loseAfter" }, + marktext: "栗", + filter: function (event, player) { + return event.type == "discard" && event.getParent(3).name == "piaoping" && player.countMark("tuoxian") > 0 && event.cards.filterInD("d").length > 0; + }, + direct: true, + content: function () { + "step 0"; + event.cards = trigger.cards.filterInD("d"); + player.chooseTarget(lib.filter.notMe, get.prompt("tuoxian"), "令一名其他角色获得" + get.translation(event.cards)).set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att < 0) return 0; + if (target.hasSkillTag("nogain")) att /= 10; + return att * Math.pow(1 + target.countCards("he"), 0.25); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("tuoxian", target); + player.removeMark("tuoxian", 1); + target.gain(cards, "gain2"); + } else event.finish(); + "step 2"; + target + .chooseControl() + .set("choiceList", ["弃置区域内的" + get.cnNumber(cards.length) + "张牌", "令" + get.translation(player) + "的〖漂萍〗于本回合内失效"]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().player; + if ( + player.hasCard(function (card) { + return get.effect(player, { name: card.viewAs || card.name }, player, player) < 0; + }, "j") || + player.hasCard(function (card) { + return get.value(card, player) <= 0; + }) + ) + return 0; + if (get.attitude(player, target) <= 0 || !target.isPhaseUsing()) return 1; + if ( + !target.needsToDiscard() && + !target.hasCard(function (card) { + return !target.hasValueTarget(card, null, true); + }, "hs") + ) + return 1; + return 0; + }); + "step 3"; + if (result.index == 0) { + if (target.countCards("j") > 0) target.discardPlayerCard(target, cards.length, true, "hej"); + else target.chooseToDiscard("he", true, cards.length); + } else player.addTempSkill("piaoping_blocker"); + }, + init(player) { + player.addMark("tuoxian", 1, false); + }, + intro: { name2: "栗", content: "剩余可用#次" }, + }, + chuaili: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + if (player == event.player || get.color(event.card) != "black") return false; + if (!player.hasSkill("piaoping", null, null, false)) return false; + return player.storage.piaoping == true || !player.hasSkill("chuaili_blocker", null, null, false); + }, + content: function () { + if (player.storage.piaoping == true) { + player.changeZhuanhuanji("piaoping"); + } else { + player.addMark("tuoxian", 1, false); + if (player.countCards("tuoxian") > 3) player.addTempSkill("chuaili_blocker"); + } + game.delayx(); + }, + ai: { combo: "piaoping" }, + subSkill: { blocker: { charlotte: true } }, + }, + //闫柔 + choutao: { + audio: 2, + trigger: { + player: "useCard", + target: "useCardToTargeted", + }, + filter: function (event, player) { + if (event.card.name != "sha" || !event.player.isIn()) return false; + if (player == event.player) + return player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "choutao"); + }, "he"); + return event.player.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, event.player); + }, "he"); + }, + check: function (event, player) { + if (player == event.player) { + if ( + !player.hasCard(function (card) { + return get.value(card) <= 5; + }, "he") + ) + return false; + for (var i of event.targets) { + var eff1 = get.damageEffect(i, player, player); + if (eff1 < 0) return false; + if (i.hasShan() && eff1 > 0) return true; + } + var sha = false; + return ( + player.getCardUsable({ name: "sha" }) <= 0 && + player.hasCard(function (card) { + if (!sha && get.name(card) == "sha" && player.getUseValue(card) > 0) { + sha = true; + return false; + } + return sha && get.value(card) <= 5; + }, "hs") + ); + } else { + var eff1 = get.effect(event.player, { name: "guohe_copy2" }, player, player); + var eff2 = get.damageEffect(player, event.player, player); + if (!player.hasShan()) return eff1 > 0; + if (eff2 > 0) return eff1 > 0; + return player.hp > 2 && eff2 < eff1; + } + }, + logTarget: "player", + shaRelated: true, + content: function () { + "step 0"; + if (player != game.me && !player.isOnline() && !player.isUnderControl()) game.delayx(); + if (player == trigger.player) + player.chooseToDiscard("he", true).set("ai", function (card) { + var player = _status.event.player; + var val = player.getUseValue(card); + if (get.name(card) == "sha" && player.getUseValue(card) > 0) val += 5; + return 20 - val; + }); + else player.discardPlayerCard(trigger.player, true, "he"); + "step 1"; + trigger.directHit.addArray(game.players); + if (player == trigger.player && trigger.addCount !== false) { + trigger.addCount = false; + player.getStat().card.sha--; + } + }, + }, + xiangshu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return (player.getStat("damage") || 0) > 0 && game.hasPlayer(current => current.isDamaged()); + }, + content: function () { + "step 0"; + event.num = Math.min(5, player.getStat("damage")); + player + .chooseTarget("是否发动限定技【襄戍】?", "令一名角色回复" + event.num + "点体力并摸" + get.cnNumber(event.num) + "张牌", function (card, player, target) { + return target.isDamaged(); + }) + .set("ai", function (target) { + var num = _status.event.getParent().num, + player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0 && num >= Math.min(player.hp, 2)) return att * Math.sqrt(target.getDamagedHp()); + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.awakenSkill("xiangshu"); + player.logSkill("xiangshu", target); + target.recover(num); + target.draw(num); + if (player != target) player.addExpose(0.2); + } + }, + }, + //朱灵 + dczhanyi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + var list = ["basic", "trick", "equip"]; + var list2 = []; + var hs = player.getCards("he"); + for (var card of hs) { + var type = get.type2(card, player); + if (list.includes(type)) { + var bool = lib.filter.cardDiscardable(card, player, "dczhanyi"); + if (bool) list2.add(type); + else { + list.remove(type); + list2.remove(type); + } + } + } + return list2.length > 0; + }, + content: function () { + "step 0"; + var list = ["basic", "trick", "equip"]; + var list2 = []; + var hs = player.getCards("he"); + for (var card of hs) { + var type = get.type2(card, player); + if (list.includes(type)) { + var bool = lib.filter.cardDiscardable(card, player, "dczhanyi"); + if (bool) list2.add(type); + else { + list.remove(type); + list2.remove(type); + } + } + } + player + .chooseControl(list2, "cancel2") + .set("prompt", get.prompt("dczhanyi")) + .set("prompt2", "弃置一种类型的所有牌") + .set("ai", function () { + var player = _status.event.player; + var getval = function (control) { + if (control == "cancel2") return 0; + var hs = player.getCards("h"), + eff = 0; + var es = player.getCards("e"); + var ss = player.getCards("s"); + var sha = player.getCardUsable({ name: "sha" }); + for (var i of hs) { + var type = get.type2(i); + if (type == control) { + eff -= get.value(i, player); + } else { + switch (type) { + case "basic": + if (sha > 0 && get.name(i) == "sha") { + sha--; + var add = 3; + if (!player.hasValueTarget(i) && player.hasValueTarget(i, false)) add += player.getUseValue(i, false); + eff += add; + } + break; + case "trick": + if (player.hasValueTarget(i)) eff += 6; + break; + case "equip": + if (player.hasValueTarget({ name: "guohe_copy2" })) eff += player.getUseValue({ name: "guohe_copy2" }); + break; + } + } + } + if (control == "equip") { + for (var i of es) eff -= get.value(i, player); + } else { + for (var i of ss) { + var type = get.type2(i); + if (type == control) continue; + switch (type) { + case "basic": + if (sha > 0 && get.name(i) == "sha") { + sha--; + var add = 3; + if (!player.hasValueTarget(i) && player.hasValueTarget(i, false)) add += player.getUseValue(i, false); + eff += add; + } + break; + case "trick": + if (player.hasValueTarget(i)) eff += 6; + break; + case "equip": + if (player.hasValueTarget({ name: "guohe_copy2" })) eff += player.getUseValue({ name: "guohe_copy2" }); + break; + } + } + } + return eff; + }; + var controls = _status.event.controls.slice(0); + var eff = 0, + current = "cancel2"; + for (var i of controls) { + var effx = getval(i); + if (effx > eff) { + eff = effx; + current = i; + } + } + return current; + }); + "step 1"; + var type = result.control; + if (type != "cancel2") { + event.type = type; + var cards = player.getCards("he", function (card) { + return get.type2(card, player) == type; + }); + if (cards.length) { + player.logSkill("dczhanyi"); + player.discard(cards); + } else event.finish(); + } else event.finish(); + "step 2"; + var list = ["basic", "trick", "equip"]; + for (var i of list) { + if (i != event.type) player.addTempSkill("dczhanyi_" + i, { player: "phaseBegin" }); + } + }, + subSkill: { + basic: { + charlotte: true, + marktext: "基", + mark: true, + intro: { + content: "使用基本牌无距离限制,且伤害值和回复值基数+1", + }, + trigger: { source: ["damageBegin1", "recoverBegin"] }, + filter: function (event, player) { + var evt = event.getParent(); + return evt.type == "card" && get.type(evt.card, false) == "basic"; + }, + forced: true, + logTarget: "player", + content: function () { + trigger.num++; + }, + mod: { + targetInRange: function (card) { + if (get.type(card) == "basic") return true; + }, + }, + ai: { + damageBonus: true, + }, + }, + trick: { + charlotte: true, + marktext: "锦", + mark: true, + intro: { + content: "使用锦囊牌时摸一张牌,且锦囊牌不计入本回合的手牌上限", + }, + trigger: { player: "useCard" }, + filter: function (event, player) { + return get.type2(event.card) == "trick"; + }, + forced: true, + content: function () { + player.draw(); + }, + mod: { + ignoredHandcard: function (card, player) { + if (get.type2(card, player) == "trick") return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.type2(card, player) == "trick") return false; + }, + }, + }, + equip: { + charlotte: true, + marktext: "装", + mark: true, + intro: { + content: "有装备牌进入你的装备区时,可弃置一名其他角色的一张牌", + }, + trigger: { player: "equipAfter" }, + filter: function (event, player) { + return game.hasPlayer(target => target != player && target.countDiscardableCards(player, "he") > 0); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget("战意:是否弃置一名其他角色的一张牌?", function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dczhanyi_equip", target); + player.discardPlayerCard(target, "he", true); + } + }, + }, + }, + }, + //李采薇 + yijiao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && !current.hasMark("yijiao"); + }); + }, + filterTarget: function (card, player, target) { + return target != player && !target.hasMark("yijiao"); + }, + content: function () { + "step 0"; + player + .chooseControl("10个", "20个", "30个", "40个") + .set("prompt", "要令" + get.translation(target) + "获得多少标记?") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + /*if(get.attitude(player,target)<0&&game.hasPlayer(function(current){ + return current!=player&¤t!=target&&!current.hasMark('yijiao')&&get.attitude(player,current)<0; + })) return 3;*/ + return 0; + }); + "step 1"; + target.addMark("yijiao", 10 * (1 + result.index)); + }, + ai: { + order: 1.1, + result: { + player: 1, + target: -0.5, + }, + }, + group: "yijiao_effect", + subSkill: { + effect: { + trigger: { global: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return event.player.isIn() && event.player != player && event.player.hasMark("yijiao"); + }, + logTarget: "player", + content: function () { + var target = trigger.player, + num = target.countMark("yijiao"); + var num2 = 0; + target.getHistory("useCard", function (evt) { + var numz = get.number(evt.card); + if (typeof numz == "number") num2 += numz; + }); + if (num > num2) { + var hs = target.getCards("he", function (card) { + return lib.filter.cardDiscardable(card, target, "yijiao_effect"); + }); + if (hs.length) target.discard(hs.randomGets(get.rand(1, 3))); + } else if (num == num2) { + target.insertPhase(); + player.draw(2); + } else { + player.draw(3); + } + target.removeMark("yijiao", num); + }, + }, + }, + intro: { + onunmark: true, + name2: "异", + content: "mark", + }, + }, + qibie: { + audio: 2, + trigger: { global: "die" }, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + !player.hasCard(function (card) { + return !lib.filter.cardDiscardable(card, player, "qibie"); + }, "h") + ); + }, + check: function (event, player) { + return player.isDamaged() && player.countCards("h", "tao") < Math.max(2, player.hp); + }, + content: function () { + var hs = player.getCards("h"); + player.discard(hs); + player.recover(); + player.draw(hs.length + 2); + }, + }, + //严夫人 + channi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: lib.filter.notMe, + filterCard: true, + selectCard: [1, Infinity], + check: function (card) { + let player = _status.event.player, + num = player.hasSkill("nifu") ? 15 : 8; + if (ui.selected.cards.length <= Math.max(1, player.needsToDiscard(), player.countCards("h") - 4)) return num - get.value(card); + return num / 2 - get.value(card); + }, + position: "h", + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.give(cards, target); + "step 1"; + if (target.countCards("h") > 0) { + game.broadcastAll(function (num) { + lib.skill.channi_backup.selectCard = [1, num]; + }, cards.length); + var next = target.chooseToUse(); + next.set("openskilldialog", "将至多" + get.cnNumber(cards.length) + "张手牌当做【决斗】使用"); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "channi_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("channi_backup"); + } else event.finish(); + "step 2"; + if (result.bool) { + var evts = target.getHistory("useCard", function (evt) { + return evt.card.name == "juedou" && evt.getParent(2) == event; + }); + if (!evts.length) { + event.finish(); + return; + } + var num = evts[0].cards.length; + if ( + target.hasHistory("sourceDamage", function (evt) { + return evt.card && evt.card.name == "juedou" && evt.getParent(4) == event; + }) + ) + target.draw(num); + } else event.finish(); + "step 3"; + if ( + player.countCards("h") > 0 && + target.hasHistory("damage", function (evt) { + return evt.card && evt.card.name == "juedou" && evt.getParent(4) == event; + }) + ) + player.chooseToDiscard("h", true, player.countCards("h")); + }, + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card"; + }, + viewAs: { name: "juedou" }, + position: "h", + filterTarget: lib.filter.targetEnabled, + ai1: card => { + if (get.name(card) === "sha") return 0; + return 5.5 - get.value(card); + }, + log: false, + precontent: function () { + delete event.result.skill; + }, + }, + }, + ai: { + order: 0.3, + result: { + target: function (player, target) { + if (target == game.me || target.isOnline() || target.hasValueTarget({ name: "juedou" })) return 2; + if (player.needsToDiscard()) return 0.5; + return 0; + }, + }, + }, + }, + nifu: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return player.countCards("h") != 3; + }, + content: function () { + var num = player.countCards("h") - 3; + if (num > 0) player.chooseToDiscard("h", num, true); + else player.draw(-num); + }, + }, + //郝萌 + xiongmang: { + audio: 2, + enable: "chooseToUse", + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + return player.countCards("hs") > 0; + }, + selectCard: function () { + return [1, 4]; + }, + selectTarget: function () { + var card = get.card(), + player = get.player(); + if (card == undefined) return; + var range = [1, Math.max(1, ui.selected.cards.length)]; + game.checkMod(card, player, range, "selectTarget", player); + return range; + }, + complexCard: true, + filterCard: function (card) { + if (!ui.selected.cards.length) return true; + var suit = get.suit(card); + for (var i of ui.selected.cards) { + if (get.suit(i) == suit) return false; + } + return true; + }, + filterOk: function () { + if (!ui.selected.targets.length) return false; + var card = get.card(), + player = get.player(); + if (card == undefined) return; + var range = [1, Math.max(1, ui.selected.cards.length)]; + game.checkMod(card, player, range, "selectTarget", player); + if ((range[0] <= ui.selected.targets.length && range[1] >= ui.selected.targets.length) || range[0] == -1) return true; + return false; + }, + check: function (card) { + var player = _status.event.player, + card = get.autoViewAs({ name: "sha" }, ui.selected.cards.concat(card)); + if ( + game.countPlayer(function (current) { + return (_status.event.filterTarget || lib.filter.filterTarget)(card, player, current) && get.effect_use(current, card, player, player) > 0; + }) <= ui.selected.cards.length + ) + return 0; + return 5 - get.value(card); + }, + position: "hs", + onuse: function (links, player) { + player.addTempSkill("xiongmang_effect"); + }, + ai: { + order: () => get.order({ name: "sha" }) + 0.2, + respondSha: true, + skillTagFilter: function (player, tag, arg) { + return player.countCards("hs") > 0; + }, + }, + subSkill: { + effect: { + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + player.maxHp > 1 && + event.skill == "xiongmang" && + !player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) + ); + }, + content: function () { + player.loseMaxHp(); + }, + }, + }, + }, + //庞德公 + heqia: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(current => current.countCards(current == player ? "he" : "h") > 0); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt("heqia"), + prompt2: "操作提示:选择要给出的牌和目标角色,或直接选择一名目标角色,令其将牌交给自己", + filterCard: true, + position: "he", + selectCard: function () { + if (ui.selected.targets.length && !ui.selected.targets[0].countCards("h")) return [1, Infinity]; + return [0, Infinity]; + }, + filterTarget: function (card, player, target) { + if (player == target) return false; + if (!ui.selected.cards.length) return target.countCards("h") > 0; + return true; + }, + ai1: function (card) { + if (!_status.event.nogive || ui.selected.cards.length) return 0 - get.value(card); + return 1 / Math.max(1, get.value(card)); + }, + ai2: function (target) { + return (get.attitude(player, target) - 0.1) * (ui.selected.cards.length ? 1 : -1); + }, + nogive: !game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) <= 0 && current.countCards("h") > 0; + }), + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("heqia", target); + if (result.cards.length) { + player.give(result.cards, target); + event.source = target; + event.num = result.cards.length; + event.goto(4); + } + } else event.finish(); + "step 2"; + var he = target.getCards("he"); + if (he.length > 0) { + if (he.length > 1) target.chooseCard("he", true, [1, Infinity], "选择交给" + get.translation(player) + "任意张牌").set("ai", card => -get.value(card)); + else event._result = { bool: true, cards: he }; + } else event.finish(); + "step 3"; + if (result.bool) { + event.source = player; + target.give(result.cards, player); + event.num = result.cards.length; + } else event.finish(); + "step 4"; + if (source && source.isIn() && source.countCards("h") > 0) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (source.hasUseTarget({ name: name }, false)) list.push(["基本", "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if (source.hasUseTarget({ name: name, nature: nature }, false)) list.push(["基本", "", name, nature]); + } + } + } + if (list.length) { + source.chooseButton(["是否将一张手牌当做一种基本牌使用?", [list, "vcard"]]).set("ai", button => _status.event.player.getUseValue({ name: button.link[2], nature: button.link[3] }, false)); + } else event.finish(); + } else event.finish(); + "step 5"; + if (result.bool) { + var card = { name: result.links[0][2], nature: result.links[0][3] }; + game.broadcastAll(function (card) { + lib.skill.heqia_backup.viewAs = card; + }, card); + var next = source.chooseToUse(); + next.set("openskilldialog", "将一张手牌当做" + get.translation(card) + "使用"); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "heqia_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("heqia_backup"); + } + }, + group: "heqia_add", + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card"; + }, + position: "h", + filterTarget: lib.filter.targetEnabled, + selectCard: 1, + check: card => 6 - get.value(card), + log: false, + precontent: function () { + delete event.result.skill; + }, + }, + add: { + trigger: { global: "useCard2" }, + charlotte: true, + direct: true, + filter: function (event, player) { + var evt = event.getParent(2); + if (evt.name != "heqia" || evt.player != player || !event.targets || evt.num <= event.targets.length) return false; + var card = event.card, + info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, event.player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var num = trigger.getParent(2).num - trigger.targets.length; + var prompt2 = "是否为" + get.translation(trigger.card) + "增加至多" + get.cnNumber(num) + "个目标?"; + trigger.player + .chooseTarget(prompt2, [1, num], function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + trigger.player.line(result.targets); + game.log(result.targets, "也成为了", trigger.card, "的目标"); + trigger.targets.addArray(result.targets); + } + }, + }, + }, + }, + yinyi: { + audio: 2, + trigger: { player: "damageBegin1" }, + forced: true, + usable: 1, + filter: function (event, player) { + return event.source && event.source.hp != player.hp && !event.hasNature("linked") && event.source.countCards("h") != player.countCards("h"); + }, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) { + if (player.hp == target.hp || lib.linked.includes(get.nature(card))) return; + var cards = [card]; + if (card.cards && card.cards.length) cards.addArray(card.cards); + if (ui.selected.cards.length) cards.addArray(ui.selected.cards); + if ( + player.countCards("h", function (card) { + return !cards.includes(card); + }) == target.countCards("h") + ) + return; + return "zeroplayertarget"; + } + }, + }, + }, + }, + //韩猛 + jieliang: { + trigger: { global: "phaseDrawBegin2" }, + direct: true, + filter: function (event, player) { + return event.player != player && !event.numFixed && event.num > 1 && player.countCards("he") > 0; + }, + content: function () { + "step 0"; + event.target = trigger.player; + player + .chooseToDiscard(get.prompt2("jieliang", event.target), "he") + .set("goon", get.attitude(player, trigger.player) < -2) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }).logSkill = ["jieliang", event.target]; + "step 1"; + if (result.bool) { + trigger.num--; + if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.15); + target.addMark("jieliang_less", 1, false); + target.addTempSkill("jieliang_less"); + player.addTempSkill("jieliang_gain"); + } + }, + subSkill: { + less: { + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("jieliang_less"); + }, + }, + onremove: true, + intro: { content: "手牌上限-#" }, + }, + gain: { + trigger: { global: "loseAfter" }, + charlotte: true, + direct: true, + filter: function (event, player) { + return event.type == "discard" && event.player == _status.currentPhase && event.getParent(3).name == "phaseDiscard" && event.cards2.filterInD("d").length > 0; + }, + content: function () { + "step 0"; + player.chooseButton(["截粮:是否获得一张牌?", trigger.cards2.filterInD("d")]).set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + "step 1"; + if (result.bool) { + player.logSkill("jieliang", trigger.player); + player.gain(result.links, "gain2"); + } + }, + }, + }, + }, + quanjiu: { + audio: 2, + mod: { + aiOrder: function (player, card, num) { + if ((card.name == "jiu" || card.name == "xujiu") && get.name(card) == "sha") return num + 0.5; + }, + cardname: function (card, player, name) { + if (card.name == "jiu" || card.name == "xujiu") return "sha"; + }, + }, + trigger: { player: "useCard1" }, + forced: true, + filter: function (event, player) { + return event.addCount !== false && event.card.isCard && event.card.name == "sha" && event.cards.length == 1 && (event.cards[0].name == "jiu" || event.cards[0].name == "xujiu"); + }, + content: function () { + trigger.addCount = false; + player.getStat().card.sha--; + }, + }, + //辛评 + fuyuan: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + var target = _status.currentPhase; + return target && target != player && target.isIn(); + }, + logTarget: function (event, player) { + var target = _status.currentPhase; + return target.countCards("h") < player.countCards("h") ? target : player; + }, + check: function (event, player) { + var target = lib.skill.fuyuan.logTarget(event, player); + return get.attitude(player, target) > 0; + }, + prompt: "是否发动【辅袁】?", + prompt2: function (event, player) { + var target = lib.skill.fuyuan.logTarget(event, player); + return "令" + get.translation(target) + (target == player ? "(你)" : "") + "摸一张牌"; + }, + content: function () { + lib.skill.fuyuan.logTarget(trigger, player).draw(); + }, + }, + zhongjie: { + trigger: { player: "die" }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "gray", + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("zhongjie"), lib.filter.notMe).set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + //player.awakenSkill('zhongjie'); + var target = result.targets[0]; + player.logSkill("zhongjie", target); + target.gainMaxHp(); + target.recover(); + target.draw(); + } + }, + }, + //张宁 + tianze: { + audio: 2, + trigger: { global: "useCardAfter" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.isIn() && + get.color(event.card) == "black" && + event.player.hasHistory("lose", function (evt) { + return evt && evt.hs.length && evt.getParent() == event; + }) && + event.player.isPhaseUsing() && + !player.hasSkill("tianze_block") + ); + }, + content: function () { + "step 0"; + player.addTempSkill("tianze_block"); + if ( + !player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.color(card, player) == "black"; + }, "he") + ) + event.finish(); + else + player + .chooseToDiscard( + "he", + function (card, player) { + return get.color(card, player) == "black"; + }, + get.prompt("tianze", trigger.player), + "弃置一张黑色牌并对其造成1点伤害" + ) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 8 - get.value(card); + }) + .set("goon", get.damageEffect(trigger.player, player, player) > 0).logSkill = ["tianze", trigger.player]; + "step 1"; + if (result.bool) { + if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); + trigger.player.damage(); + } else event.finish(); + "step 2"; + game.delayx(); + }, + group: "tianze_draw", + subSkill: { + block: { charlotte: true }, + draw: { + trigger: { global: "judgeEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.player != player && event.result && event.result.color == "black"; + }, + content: function () { + player.draw(); + }, + }, + }, + }, + difa: { + trigger: { player: "gainAfter" }, + filter: function (event, player) { + if (player != _status.currentPhase || event.getParent().name != "draw") return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of event.cards) { + if (hs.includes(i) && get.color(i, player) == "red" && lib.filter.cardDiscardable(i, player, "difa")) return true; + } + return false; + }, + usable: 1, + check: function (event, player) { + var hs = player.getCards("h"), + cards = event.cards.filter(function (i) { + return hs.includes(i) && get.color(i, player) == "red" && lib.filter.cardDiscardable(i, player, "difa"); + }); + var value = get.value(hs, player); + return Array.from(ui.cardPile.childNodes).some(function (card) { + return get.type2(card, false) == "trick" && get.value(card, player) > value; + }); + }, + content: function () { + "step 0"; + var hs = player.getCards("h"), + cards = trigger.cards.filter(function (i) { + return hs.includes(i) && get.color(i, player) == "red" && lib.filter.cardDiscardable(i, player, "difa"); + }); + if (!cards.length) event.finish(); + else { + event.cards = cards; + player.discard(cards); + } + "step 1"; + var list = lib.inpile.filter(function (i) { + return get.type2(i, false) == "trick"; + }); + if (!list.length) event.finish(); + else + player + .chooseButton(["选择获得一种锦囊牌", [list.map(i => ["锦囊", "", i]), "vcard"]], true) + .set("ai", function (button) { + var card = { name: button.link[2] }; + if (!_status.event.list.includes(card.name)) return 0; + return _status.event.player.getUseValue(card); + }) + .set( + "list", + Array.from(ui.cardPile.childNodes) + .filter(function (card) { + return get.type2(card, false) == "trick"; + }) + .map(function (card) { + return card.name; + }) + .reduce(function (list, name) { + if (!list.includes(name)) list.add(name); + return list; + }, []) + ); + "step 2"; + var card = get.cardPile(function (i) { + return i.name == result.links[0][2] && !event.cards.includes(i); + }); + if (card) player.gain(card, "gain2"); + }, + }, + //童渊 + chaofeng: { + audio: 2, + trigger: { source: "damageBegin1" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0 && player.isPhaseUsing() && !player.hasSkill("chaofeng2"); + }, + content: function () { + "step 0"; + var str = "弃置一张手牌并摸一张牌", + color, + type; + if (trigger.card) { + type = get.type2(trigger.card, false); + color = get.color(trigger.card, false); + if (color != "none") str += ";若弃置" + get.translation(color) + "牌则改为摸两张牌"; + if (type) str += ";若弃置类型为" + get.translation(type) + "的牌则伤害+1"; + } + var next = player.chooseToDiscard("h", get.prompt("chaofeng", trigger.player), str); + next.set("ai", function (card) { + var player = _status.event.player, + att = _status.event.att; + var val = 4.2 - get.value(card); + if (get.color(card) == _status.event.color) val += 3; + if (get.type2(card) == _status.event.type) { + if (att < 0) val += 4; + else if (att === 0) val += 2; + else val = 0; + } + return val; + }); + next.set("att", get.attitude(player, trigger.player)); + next.logSkill = ["chaofeng", trigger.player]; + if (color != "none") { + event.color = color; + next.set("color", color); + } + if (type) { + event.type = type; + next.set("type", type); + } + "step 1"; + if (result.bool) { + player.addTempSkill("chaofeng2", "phaseUseEnd"); + var card = result.cards[0]; + player.draw(event.color && get.color(card, card.original == "h" ? player : false) == event.color ? 2 : 1); + if (event.type && get.type2(card, card.original == "h" ? player : false) == event.type) trigger.num++; + } + }, + }, + chaofeng2: {}, + chuanshu: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "die"] }, + direct: true, + limited: true, + forceDie: true, + filter: function (event, player) { + return player.isDamaged() && (event.name == "die" || player.isIn()); + }, + skillAnimation: true, + animationColor: "gray", + content: function () { + "step 0"; + player + .chooseTarget(lib.filter.notMe, get.prompt("chuanshu"), "令一名其他角色获得〖朝凤〗") + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("forceDie", true); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.awakenSkill("chuanshu"); + player.logSkill("chuanshu", target); + target.addSkills("chaofeng"); + if (player.isDead()) event.finish(); + } else event.finish(); + "step 2"; + player.addSkills(lib.skill.chuanshu.derivation); + }, + derivation: ["ollongdan", "drlt_congjian", "chuanyun"], + }, + longdan_tongyuan: { audio: true }, + ocongjian_tongyuan: { audio: true }, + chuanyun: { + audio: true, + trigger: { player: "useCardToPlayered" }, + shaRelated: true, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countCards("e") > 0; + }, + logTarget: "target", + content: function () { + var target = trigger.target; + card = target.getCards("e").randomGet(); + if (card) target.discard(card); + }, + }, + //南华老仙 + jinghe: { + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("jinghe_clear"); + }, + selectCard: function () { + if (ui.selected.targets.length) return [ui.selected.targets.length, 4]; + return [1, 4]; + }, + selectTarget: function () { + return ui.selected.cards.length; + }, + filterTarget: true, + filterCard: function (card) { + if (ui.selected.cards.length) { + var name = get.name(card); + for (var i of ui.selected.cards) { + if (get.name(i) == name) return false; + } + } + return true; + }, + check: function (card) { + var player = _status.event.player; + if ( + game.countPlayer(function (current) { + return get.attitude(player, current) > 0; + }) > ui.selected.cards.length + ) + return 1; + return 0; + }, + position: "h", + complexCard: true, + discard: false, + lose: false, + delay: false, + multitarget: true, + multiline: true, + content: function () { + "step 0"; + player.showCards(cards, get.translation(player) + "发动了【经合】"); + event.skills = lib.skill.jinghe.derivation.randomGets(4); + player.addTempSkill("jinghe_clear", { player: "phaseBegin" }); + event.targets.sortBySeat(); + event.num = 0; + "step 1"; + event.target = targets[num]; + event.num++; + event.target + .chooseControl(event.skills, "cancel2") + .set( + "choiceList", + event.skills.map(function (i) { + return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; + }) + ) + .set("displayIndex", false) + .set("prompt", "选择获得一个技能"); + "step 2"; + var skill = result.control; + if (skill != "cancel2") { + event.skills.remove(skill); + target.addAdditionalSkills("jinghe_" + player.playerid, skill); + target.popup(skill); + } + if (event.num < event.targets.length) event.goto(1); + if (target != game.me && !target.isOnline2()) game.delayx(); + }, + ai: { + threaten: 3, + order: 10, + result: { + target: 1, + }, + }, + derivation: ["releiji", "rebiyue", "new_retuxi", "remingce", "xinzhiyan", "nhyinbing", "nhhuoqi", "nhguizhu", "nhxianshou", "nhlundao", "nhguanyue", "nhyanzheng"], + subSkill: { + clear: { + onremove: function (player) { + game.countPlayer(function (current) { + current.removeAdditionalSkills("jinghe_" + player.playerid); + }); + }, + }, + }, + }, + gongxiu: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.hasSkill("jinghe_clear"); + }, + content: function () { + "step 0"; + event.list1 = []; + event.list2 = []; + event.addIndex = 0; + var choices = []; + game.countPlayer(function (current) { + if (current.additionalSkills["jinghe_" + player.playerid]) event.list1.push(current); + else event.list2.push(current); + }); + event.list1.sortBySeat(); + if (event.list1.length) choices.push("令" + get.translation(event.list1) + (event.list1.length > 1 ? "各" : "") + "摸一张牌"); + else event.addIndex++; + event.list2.sortBySeat(); + if (event.list2.length) choices.push("令" + get.translation(event.list2) + (event.list2.length > 1 ? "各" : "") + "弃置一张手牌"); + player + .chooseControl("cancel2") + .set("choiceList", choices) + .set("prompt", get.prompt("gongxiu")) + .set("", function () { + var evt = _status.event.getParent(); + if ( + evt.list2.filter(function (current) { + return get.attitude(player, current) <= 0 && !current.hasSkillTag("noh"); + }).length - + evt.list1.length > + 1 + ) + return 1 - evt.addIndex; + return 0; + }); + "step 1"; + if (result.control != "cancel2") { + if (result.index + event.addIndex == 0) { + player.logSkill("gongxiu", event.list1); + game.asyncDraw(event.list1); + } else { + player.logSkill("gongxiu", event.list2); + for (var i of event.list2) i.chooseToDiscard("h", true); + event.finish(); + } + } else event.finish(); + "step 2"; + game.delayx(); + }, + ai: { + combo: "jinghe", + }, + }, + nhyinbing: { + trigger: { source: "damageBefore" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.name == "sha"; + }, + content: function () { + trigger.cancel(); + trigger.player.loseHp(trigger.num); + }, + group: "nhyinbing_draw", + subSkill: { + draw: { + trigger: { global: "loseHpAfter" }, + forced: true, + filter: function (event, player) { + return player != event.player; + }, + content: function () { + player.draw(); + }, + }, + }, + ai: { + jueqing: true, + }, + }, + nhhuoqi: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + position: "he", + filterCard: true, + filterTarget: function (card, player, target) { + return target.isMinHp(); + }, + check: function (card) { + return 7 - get.value(card); + }, + content: function () { + target.recover(); + target.draw(); + }, + ai: { + order: 1, + tag: { + draw: 1, + recover: 1, + }, + result: { + target: function (player, target) { + if (target.isDamaged()) return 3; + if (ui.selected.cards.length) return 0; + return 1; + }, + }, + }, + }, + nhguizhu: { + trigger: { global: "dying" }, + usable: 1, + logTarget: "player", + frequent: true, + content: function () { + player.draw(2); + }, + }, + nhxianshou: { + enable: "phaseUse", + usable: 1, + filterTarget: true, + content: function () { + target.draw(target.isHealthy() ? 2 : 1); + }, + ai: { + order: 1, + tag: { + draw: 1, + }, + result: { + target: function (player, target) { + return target.isHealthy() ? 2 : 0.5; + }, + }, + }, + }, + nhlundao: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source && player != event.source && player.countCards("h") != event.source.countCards("h"); + }, + logTarget: "source", + check: function (event, player) { + return player.countCards("h") < event.source.countCards("h") || get.effect(event.source, { name: "guohe_copy2" }, player, player) > 0; + }, + content: function () { + if (player.countCards("h") > trigger.source.countCards("h")) player.draw(); + else player.discardPlayerCard(trigger.source, "he", true); + }, + }, + nhguanyue: { + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + "step 0"; + var cards = get.cards(2); + player.chooseButton(["观月:选择获得一张牌", cards.slice(0)], true).set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); + } + "step 1"; + if (result.bool) { + player.gain(result.links, "gain2"); + } + }, + }, + nhyanzheng: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player + .chooseCard("h", get.prompt("nhyanzheng")) + .set( + "goon", + (function () { + var num = player.countCards("h") - 1; + return ( + game.countPlayer(function (current) { + return get.damageEffect(current, player, player) > 0; + }) >= Math.min(3, num) + ); + })() + ) + .set("ai", function (card) { + if (_status.event.goon) return Math.max(1, get.value(card)); + return 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("nhyanzheng"); + var cards = player.getCards("h", function (card) { + return card != result.cards[0] && lib.filter.cardDiscardable(card, player, "nhyanzheng"); + }); + if (cards.length) { + player.discard(cards); + event.num = cards.length; + } else event.finish(); + } else event.finish(); + "step 2"; + num = Math.min(num, game.countPlayer()); + player.chooseTarget([1, num], true, "对" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "名角色造成1点伤害").set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 3"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); + for (var i of targets) i.damage(); + } + }, + }, + //樊稠 + xinxingluan: { + audio: "xinfu_xingluan", + usable: 1, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return player.isPhaseUsing(); + }, + async cost(event, trigger, player) { + const choiceList = ["观看牌堆中两张点数为6的牌并获得其中一张", "令一名其他角色弃置一张点数为6的牌或交给你一张牌", "获得场上一张点数为6的牌"], + choices = ["选项一"]; + if (game.hasPlayer(current => current != player && current.countCards("he") > 0)) { + choices.push("选项二"); + } else { + choiceList[1] = `${choiceList[1]}`; + } + if ( + game.hasPlayer(current => { + return current.hasCard(function (card) { + return get.number(card) == 6 && lib.filter.canBeGained(card, current, player); + }, "ej"); + }) + ) { + choices.push("选项三"); + } else { + choiceList[2] = `${choiceList[2]}`; + } + const result = await player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("xinxingluan")) + .set("ai", function () { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + if (current == player) return false; + var att = -get.sgn(get.attitude(player, current) - 0.1); + return current.hasCard(function (card) { + return get.number(card) == 6 && lib.filter.canBeGained(card, current, player) && get.sgn(get.useful(card, current)) == att; + }, "ej"); + }) + ) + return "选项三"; + if ( + game.hasPlayer(function (target) { + if (target == player) return false; + var att = get.attitude(player, target); + return ( + att < 0 && + target.countCards("he") > 0 && + !target.hasCard(function (card) { + return get.value(card, target) <= 0; + }, "he") + ); + }) + ) + return "选项二"; + return "选项一"; + }) + .forResult(); + if (result.control !== "cancel2") { + const results = { bool: true, cost_data: { index: choices.indexOf(result.control) } }; + if (results.cost_data.index === 1) { + const { targets } = await player + .chooseTarget("令一名其他角色弃置一张点数为6的牌,否则交给你一张牌", true, function (card, player, current) { + return current != player && current.countCards("he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + !target.hasCard(function (card) { + return get.value(card, target) <= 0; + }, "he") + ) + return -att / Math.sqrt(target.countCards("he")); + return 0; + }) + .forResult(); + results.targets = targets; + } else if (results.cost_data.index === 2) { + const { targets } = await player + .chooseTarget("获得一名角色装备区或判定区内点数为6的牌", true, function (card, player, current) { + return current.hasCard(function (card) { + return get.number(card) == 6 && lib.filter.canBeGained(card, current, player); + }, "ej"); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = -get.sgn(get.attitude(player, target) - 0.1), + max = 0, + ej = target.getCards("ej", function (card) { + return get.number(card) == 6 && lib.filter.canBeGained(card, target, player); + }); + for (var i of ej) { + var num = get.useful(i, target) * att; + if (num > max) max = num; + return max; + } + }) + .forResult(); + results.targets = targets; + } + event.result = results; + } + }, + content: function () { + "step 0"; + var result = event.cost_data; + if (result.index === 1) event.goto(4); + else if (result.index === 2) event.goto(3); + "step 1"; + var cards = []; + while (cards.length < 2) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && get.number(card) == 6; + }); + if (!card) break; + cards.push(card); + } + if (!cards.length) { + player.draw(6); + event.finish(); + } else if (cards.length == 1) { + event._result = { bool: true, links: cards }; + } else + player.chooseButton(["兴乱:选择获得其中一张", cards], true).set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + "step 2"; + if (result.bool) { + player.gain(result.links, "gain2"); + } + event.finish(); + "step 3"; + var target = targets[0]; + player.gainPlayerCard(target, "ej", true).set("filterButton", function (button) { + return get.number(button.link) == 6; + }); + event.finish(); + "step 4"; + var target = targets[0]; + event.target = target; + target.chooseToDiscard("he", "弃置一张点数为6的牌,否则交给" + get.translation(player) + "一张牌", function (card) { + return get.number(card) == 6; + }).ai = card => 8 - get.value(card); + "step 5"; + if (!result.bool) { + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + } else event.finish(); + "step 6"; + if (result.bool) target.give(result.cards, player, "giveAuto"); + }, + }, + rexingluan: { + audio: "xinfu_xingluan", + usable: 1, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return event.targets && event.targets.length == 1 && typeof get.number(event.card, false) == "number" && player.isPhaseUsing(); + }, + direct: true, + content: function () { + "step 0"; + var str = "", + num = get.number(trigger.card, false), + nums = get.strNumber(num); + var list = game.filterPlayer(function (current) { + return current.hasCard(function (card) { + return get.number(card) == num && lib.filter.canBeGained(card, current, player); + }, "ej"); + }); + if (list.length) { + str += "获得一名角色装备区或判定区内的一张点数为" + nums + "的牌,或直接从牌堆中获得一张点数为" + nums + "的牌"; + player + .chooseTarget(get.prompt("rexingluan"), str, [0, 1], function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("targets", list) + .set("ai", function (target) { + if (!target) return 1; + var player = _status.event.player, + num = get.number(_status.event.getTrigger().card, false), + att = -get.sgn(get.attitude(player, target)); + if ( + target.hasCard(function (card) { + return get.number(card) == num && get.effect(target, card, target, player) < 0; + }, "j") + ) + return 1.2 * Math.abs(get.attitude(player, target)); + if ( + target.hasCard(function (card) { + return get.number(card) == num && get.sgn(get.value(card, target) + 0.1) == att; + }, "e") + ) + return Math.abs(get.attitude(player, target)); + return 0; + }); + } else { + player.chooseBool(get.prompt("rexingluan"), "从牌堆中获得一张点数为" + nums + "的牌").ai = () => true; + } + "step 1"; + if (result.bool) { + if (result.targets && result.targets.length) { + var target = result.targets[0]; + player.logSkill("rexingluan", target); + player + .gainPlayerCard(target, "ej", true) + .set("num", get.number(trigger.card, false)) + .set("filterButton", function (button) { + return get.number(button.link) == _status.event.num; + }); + } else { + player.logSkill("rexingluan"); + var num = get.number(trigger.card, false), + card = get.cardPile2(function (i) { + return get.number(i, false) == num; + }); + if (card) player.gain(card, "gain2"); + } + } + }, + }, + //杜夫人 + yise: { + audio: 2, + trigger: { + global: "gainAfter", + player: "loseAsyncAfter", + }, + filter: function (event, player) { + if (event.name == "loseAsync") { + if (event.type != "gain") return false; + } + var cards = event.getl(player).cards2; + return game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if (cards.includes(i)) { + if (current.isDamaged()) return true; + return get.color(i, player) == "black"; + } + } + return false; + }); + }, + direct: true, + content: function () { + "step 0"; + var cards = trigger.getl(player).cards2; + event.cards = cards; + event.targets = game + .filterPlayer(function (current) { + if (current == player) return false; + var cardsx = trigger.getg(current); + for (var i of cardsx) { + if (cards.includes(i)) return true; + } + return false; + }) + .sortBySeat(); + if (!event.targets.length) event.finish(); + "step 1"; + var target = targets.shift(); + var cardsx = trigger.getg(target); + var goon = false; + for (var i of cardsx) { + if (cards.includes(i)) { + if (target.isDamaged() || get.color(i, player) == "black") { + goon = true; + break; + } + } + } + if (goon) { + var next = game.createEvent("yise_insert"); + next.player = player; + next.target = target; + next.cards = cardsx; + next.setContent(lib.skill.yise.contentx); + } + if (targets.length > 0) event.redo(); + }, + contentx: function () { + "step 0"; + for (var i of cards) { + event[get.color(i, player)] = true; + if (event.red && event.black) break; + } + if (event.red && target.isDamaged()) { + player.chooseBool(get.prompt("yise", target), "令" + get.translation(target) + "回复1点体力").set("ai", () => get.recoverEffect(_status.event.getParent().target, _status.event.player, _status.event.player) > 0); + } + "step 1"; + if (event.black || (event.red && result.bool)) player.logSkill("yise", target); + if (event.red && result.bool) target.recover(); + if (event.black) { + target.addMark("yise_damage", 1, false); + target.addSkill("yise_damage"); + } + }, + subSkill: { + damage: { + trigger: { player: "damageBegin1" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.getParent().name == "sha"; + }, + content: function () { + trigger.num += player.countMark("yise_damage"); + player.removeSkill("yise_damage"); + }, + intro: { + content: "下一次受到杀的伤害+#", + }, + }, + }, + }, + shunshi: { + trigger: { player: ["damageEnd", "phaseZhunbeiBegin"] }, + direct: true, + filter: function (event, player) { + return ( + (event.name != "damage" || player != _status.currentPhase) && + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current != event.source; + }) + ); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt("shunshi"), + prompt2: "将一张牌交给一名其他角色,并获得+1效果", + filterCard: true, + filterTarget: function (card, player, target) { + return target != player && target != _status.event.source; + }, + position: "he", + source: trigger.source, + ai1: function (card) { + var player = _status.event.player; + if (player.hasSkill("yise")) { + if ( + get.color(card, player) == "red" && + game.hasPlayer(function (current) { + return current != player && current != _status.event.source && current.isDamaged() && get.recoverEffect(current, player, player) > 0; + }) + ) + return 10 - get.value(card); + if (get.color(card, player) == "black") return 4 - get.value(card); + } + return 8 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + if (player.hasSkill("yise")) { + if (get.color(card) == "red" && target.isDamaged()) return 2 * get.recoverEffect(target, player, player); + if (get.color(card) == "black") return -get.attitude(player, target); + } + if (get.value(card, target) < 0) return -get.attitude(player, target); + if (get.value(card, target) < 1) return 0.01 * -get.attitude(player, target); + return Math.max(1, get.value(card, target) - get.value(card, player)) * get.attitude(player, target); + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("shunshi", target); + player.give(result.cards, target); + player.addMark("shunshi_mark", 1, false); + player.addTempSkill("shunshi_mark", { player: "phaseEnd" }); + } + }, + subSkill: { + mark: { + onremove: true, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num += player.countMark("shunshi_mark"); + }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("shunshi_mark"); + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("shunshi_mark"); + }, + }, + intro: { + content: "拥有#层效果", + }, + }, + }, + }, + xianwei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.hasEnabledSlot(); + }, + content: function () { + "step 0"; + player.chooseToDisable().ai = function (event, player, list) { + var getVal = function (num) { + var card = player.getEquip(num); + if (card) { + var val = get.value(card); + if (val > 0) return 0; + return 5 - val; + } + switch (num) { + case "equip3": + return 4.5; + case "equip4": + return 4.4; + case "equip5": + return 4.3; + case "equip2": + return (3 - player.hp) * 1.5; + case "equip1": { + if ( + game.hasPlayer(function (current) { + return (get.realAttitude || get.attitude)(player, current) < 0 && get.distance(player, current) > 1; + }) + ) + return 0; + return 3.2; + } + } + }; + list.sort(function (a, b) { + return getVal(b) - getVal(a); + }); + return list[0]; + }; + "step 1"; + var cardType = result.control; + event.cardType = cardType; + var num = player.countDisabledSlot(); + if (num < 5) player.draw(5 - num); + player + .chooseTarget(lib.filter.notMe, "是否令一名其他角色从牌堆中使用一张" + get.translation(cardType) + "牌?") + .set("ai", function (target) { + var player = _status.event.player, + type = _status.event.cardType; + var card = get.cardPile2(function (card) { + return get.subtype(card) == type && target.canUse(card, target); + }); + if (!card) return 0; + return get.effect(target, card, target, player); + }) + .set("cardType", event.cardType); + "step 2"; + if (!result.bool) return; + var target = result.targets[0]; + player.line(target, "green"); + var card = get.cardPile2(function (card) { + return get.subtype(card) == event.cardType && target.canUse(card, target); + }); + if (card) target.chooseUseTarget(card, "nopopup", true); + else target.draw(); + }, + group: "xianwei_all", + subSkill: { + all: { + trigger: { player: "disableEquipAfter" }, + forced: true, + filter: function (event, player) { + return !player.hasEnabledSlot(); + }, + content: function () { + player.gainMaxHp(2); + player.addSkill("xianwei_effect"); + }, + }, + effect: { + charlotte: true, + mark: true, + intro: { content: "和其他角色视为在彼此的攻击范围内" }, + mod: { + inRange: () => true, + inRangeOf: () => true, + }, + }, + }, + }, + rehuoshui: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + var num = Math.min(game.countPlayer() - 1, Math.max(1, player.getDamagedHp())); + var str; + if (num > 1) { + str = "选择至多" + get.cnNumber(num) + "名其他角色。"; + var list = ["第一名角色的非锁定技失效直到回合结束", ";第二名角色交给你一张手牌", ";第三名及之后角色弃置装备区内的所有牌"]; + for (var i = 0; i < Math.min(3, num); i++) { + str += list[i]; + } + str += "。"; + } else str = "令一名其他角色的非锁定技本回合内失效"; + player.chooseTarget([1, num], get.prompt("rehuoshui"), str, lib.filter.notMe).set("ai", function (target) { + var att = -get.attitude(_status.event.player, target); + if (att <= 0) return 0; + if (target.hasSkillTag("maixie") || target.hasSkill("maixie_hp") || target.hasSkill("maixie_defed")) att *= 3; + return att / get.threaten(target); + }); + "step 1"; + if (result.bool) { + var targets = result.targets; + player.logSkill("rehuoshui", targets); + event.targets = targets; + targets[0].addTempSkill("fengyin"); + if (targets.length < 2) event.goto(5); + } else event.finish(); + "step 2"; + if (targets[1].countCards("h") == 0) event.goto(targets.length > 2 ? 4 : 5); + else targets[1].chooseCard("h", true, "交给" + get.translation(player) + "一张手牌"); + "step 3"; + if (result.bool) { + targets[1].give(result.cards, player); + } + if (targets.length < 3) { + event.goto(5); + } else { + targets.splice(0, 2); + } + "step 4"; + var target = targets.shift(); + var num = target.countCards("e"); + if (num > 0) target.chooseToDiscard("e", true, num); + if (targets.length > 0) event.redo(); + "step 5"; + game.delayx(); + }, + }, + reqingcheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => lib.skill.reqingcheng.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return target != player && target.hasSex("male") && target.countCards("h") <= player.countCards("h"); + }, + content: function () { + player.swapHandcards(target); + }, + ai: { + order: 1, + result: { + player: function (player, target) { + if (target.countCards("h") > 0) return -Math.max(get.value(target.getCards("h"), player) - get.value(player.getCards("h"), player), 0); + return 0; + }, + }, + }, + }, + //丘力居 + koulve: { + audio: 2, + trigger: { source: "damageSource" }, + logTarget: "player", + filter: function (event, player) { + return event.player.isDamaged() && event.player.countCards("h") > 0 && player.isPhaseUsing(); + }, + check: function (event, player) { + if (player.hp == 1 && player.isHealthy()) return false; + return get.attitude(player, event.player) <= 0; + }, + content: function () { + "step 0"; + player.choosePlayerCard(trigger.player, "h", true, trigger.player.getDamagedHp()); + "step 1"; + var card = result.cards; + event.cards = card; + player.showCards(card, get.translation(player) + "发动了【宼略】"); + "step 2"; + var gains = [], + red = false; + var target = trigger.player; + for (var card of cards) { + var type = get.type2(card, target); + if ((type == "basic" || type == "trick") && get.tag(card, "damage") > 0) gains.push(card); + if (!red && get.color(card, target) == "red") red = true; + } + if (gains.length) player.gain(gains, "gain2"); + if (!red) event.finish(); + "step 3"; + player[player.isDamaged() ? "loseMaxHp" : "loseHp"](); + player.draw(2); + }, + }, + qljsuiren: { + audio: 2, + trigger: { player: "die" }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.countCards("h", function (card) { + var type = get.type(card, player); + return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(lib.filter.notMe, get.prompt("qljsuiren"), "将所有伤害性基本牌和锦囊牌交给一名其他角色") + .set("forceDie", true) + .set("ai", function (target) { + var player = _status.event.player, + cards = _status.event.aiCards; + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (target.hasSkillTag("nogain")) att /= 100; + var num = 0.1; + for (var i of cards) num += Math.max(0, target.getUseValue(card)); + return num * att; + }) + .set( + "aiCards", + player.getCards("h", function (card) { + var type = get.type(card, player); + return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; + }) + ); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qljsuiren", target); + player.give( + player.getCards("h", function (card) { + var type = get.type(card, player); + return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; + }), + target, + "give" + ); + } + }, + }, + //胡车儿 + redaoji: { + audio: 2, + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + if (player == event.player || get.subtype(event.card, false) != "equip1" || (event.player.isDead() && !event.cards.filterInD().length)) return false; + var all = event.player.getAllHistory("useCard"); + for (var i of all) { + if (get.subtype(i.card, false) == "equip1") return i == event; + } + return false; + }, + content: function () { + "step 0"; + var list = []; + event.addIndex = 0; + if (trigger.cards.filterInD().length > 0) list.push("获得" + get.translation(trigger.cards.filterInD())); + else event.addIndex++; + if (trigger.player.isIn()) list.push("令" + get.translation(trigger.player) + "本回合不能使用或打出【杀】"); + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("prompt", get.prompt("redaoji", trigger.player)) + .set("ai", function () { + var evt = _status.event.getParent(), + player = evt.player, + evt2 = evt._trigger; + if (evt.addIndex == 0) { + var noob = get.attitude(player, evt2.player) < 0 ? 1 : "cancel2"; + if (player.countMark("fuzhong") == 3) return noob; + if (get.effect(evt2.targets[0], evt2.card, evt2.player, player) <= 0) return 0; + return noob; + } + return get.attitude(player, evt2.player) < 0 ? 0 : "cancel2"; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("redaoji", trigger.player); + game.delayx(); + if (result.index + event.addIndex == 0) { + player.gain(trigger.cards.filterInD(), "gain2"); + } else trigger.player.addTempSkill("redaoji2"); + } + }, + }, + redaoji2: { + charlotte: true, + mark: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + cardRespondable: function (card) { + if (card.name == "sha") return false; + }, + }, + intro: { + content: "本回合不能使用或打出杀", + }, + }, + fuzhong: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("fuzhong") > 3; + }, + content: function () { + "step 0"; + player.chooseTarget(lib.filter.notMe, "对一名其他角色造成1点伤害", true).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + target.damage("nocard"); + } + player.removeMark("fuzhong", 4); + }, + marktext: "重", + intro: { content: "mark" }, + group: ["fuzhong_gain", "fuzhong_yingzi"], + mod: { + maxHandcard: function (player, num) { + if (player.countMark("fuzhong") > 2) return num + 3; + }, + globalFrom: function (player, target, num) { + if (player.countMark("fuzhong") > 1) return num - 2; + }, + }, + subSkill: { + gain: { + audio: "fuzhong", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + forced: true, + filter: function (event, player) { + return player != _status.currentPhase && event.getg(player).length > 0; + }, + content: function () { + player.addMark("fuzhong", 1); + }, + }, + yingzi: { + audio: "fuzhong", + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + return !event.numFixed && player.countMark("fuzhong") > 0; + }, + content: function () { + trigger.num++; + }, + }, + }, + }, + //董承 + xuezhao: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.maxHp > 0 && player.countCards("h") > 0; + }, + filterCard: true, + position: "h", + filterTarget: lib.filter.notMe, + selectTarget: function () { + return [1, _status.event.player.maxHp]; + }, + check: function (card) { + return 2 * (_status.event.player.maxHp + 2) - get.value(card); + }, + content: function () { + "step 0"; + if (!target.countCards("he")) event._result = { bool: false }; + else + target.chooseCard("he", "交给" + get.translation(player) + "一张牌并摸一张牌,或不能响应其使用的牌直到回合结束").set("ai", function (card) { + var player = _status.event.player, + target = _status.event.getParent().player, + val = get.value(card); + if (get.attitude(player, target) > 0) { + if (get.name(card, target) == "sha" && target.hasValueTarget(card)) return 30 - val; + return 20 - val; + } + return -val; + }); + "step 1"; + if (result.bool) { + player.addTempSkill("xuezhao_sha"); + player.addMark("xuezhao_sha", 1, false); + target.give(result.cards, player); + target.draw(); + } else { + player.addTempSkill("xuezhao_hit"); + player.markAuto("xuezhao_hit", [target]); + } + }, + ai: { + threaten: 2.4, + order: 3.6, + result: { + player: function (player, target) { + if (get.attitude(target, player) > 0) { + if ( + target.countCards("e", function (card) { + return get.value(card, target) < 0; + }) + ) + return 3; + return Math.sqrt(target.countCards("he")); + } + if ( + target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) && + player.countCards("hs", function (card) { + return !ui.selected.cards.includes(card) && get.name(card) == "sha" && player.canUse(card, target) && get.effect(target, card, player, player) != 0; + }) + ) + return -Math.sqrt(Math.abs(get.attitude(player, target))) / 2; + return 0.1; + }, + }, + }, + subSkill: { + sha: { + charlotte: true, + onremove: true, + marktext: "血", + intro: { content: "多杀#刀,誓诛曹贼!" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("xuezhao_sha"); + }, + }, + }, + hit: { + charlotte: true, + onremove: true, + marktext: "诏", + intro: { content: "$篡汉,其心可诛!" }, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + content: function () { + trigger.directHit.addArray(player.getStorage("xuezhao_hit")); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return player.getStorage("xuezhao_hit").includes(arg.target); + }, + }, + }, + }, + }, + //唐姬 + kangge: { + audio: 2, + trigger: { player: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return player.phaseNumber == 1 && !player.storage.kangge && game.hasPlayer(current => current != player); + }, + content: function () { + "step 0"; + player.chooseTarget("请选择【抗歌】的目标", "其于回合外摸牌后,你摸等量的牌;其进入濒死状态时,你可令其回复体力至1点;其死亡后,你弃置所有牌并失去1点体力", lib.filter.notMe, true).set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("kangge", target); + player.addSkill("kangge_clear"); + player.storage.kangge = target; + player.markSkill("kangge"); + game.delayx(); + } + }, + intro: { content: "已指定$为目标" }, + group: ["kangge_draw", "kangge_dying", "kangge_die"], + subSkill: { + draw: { + audio: "kangge", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + forced: true, + filter: function (event, player) { + if (player.countMark("kangge_draw") >= 3) return false; + var target = player.storage.kangge; + return target && target != _status.currentPhase && event.getg(target).length > 0; + }, + logTarget: "player", + content: function () { + var num = Math.min(3 - player.countMark("kangge_draw"), trigger.getg(player.storage.kangge).length); + player.addMark("kangge_draw", num, false); + player.draw(num); + }, + }, + clear: { + trigger: { global: "phaseBeginStart" }, + forced: true, + firstDo: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.countMark("kangge_draw") > 0; + }, + content: function () { + player.removeMark("kangge_draw", player.countMark("kangge_draw"), false); + }, + }, + dying: { + audio: "kangge", + trigger: { global: "dying" }, + logTarget: "player", + filter: function (event, player) { + return event.player == player.storage.kangge && event.player.hp < 1 && !player.hasSkill("kangge_temp"); + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + prompt2: "令其将体力值回复至1点", + content: function () { + trigger.player.recover(1 - trigger.player.hp); + player.addTempSkill("kangge_temp", "roundStart"); + }, + }, + temp: {}, + die: { + audio: "kangge", + trigger: { global: "dieAfter" }, + filter: function (event, player) { + return event.player == player.storage.kangge; + }, + forced: true, + content: function () { + var cards = player.getCards("he"); + if (cards.length) player.discard(cards); + player.loseHp(); + }, + }, + }, + ai: { + threaten: 2, + }, + }, + jielie: { + audio: 2, + trigger: { player: "damageBegin4" }, + direct: true, + filter: function (event, player) { + return (!event.source || (event.source != player && event.source != player.storage.kangge)) && player.storage.kangge && player.storage.kangge.isIn(); + }, + content: function () { + "step 0"; + player + .chooseControl(lib.suit.slice(0), "cancel2") + .set("prompt", get.prompt("jielie")) + .set("prompt2", "防止伤害并改为失去等量体力,且令" + get.translation(player.storage.kangge) + "从弃牌堆中获得等量的花色牌") + .set("ai", function () { + var player = _status.event.player; + if (get.attitude(player, player.storage.kangge) <= 0) return "cancel2"; + return lib.suit.randomGet(); + }); + "step 1"; + if (result.control != "cancel2") { + event.suit = result.control; + player.logSkill("jielie", player.storage.kangge); + trigger.cancel(); + player.loseHp(trigger.num); + } else event.finish(); + "step 2"; + var cards = []; + while (cards.length < trigger.num) { + var card = get.discardPile(function (card) { + return get.suit(card, false) == event.suit && !cards.includes(card); + }); + if (card) cards.push(card); + else break; + } + if (cards.length) player.storage.kangge.gain(cards, "gain2"); + }, + }, + //张横 + dangzai: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + !player.isDisabledJudge() && + game.hasPlayer(function (current) { + return ( + current != player && + current.countCards("j", function (card) { + return player.canAddJudge(card); + }) > 0 + ); + }) + ); + }, + content: function () { + "step 0"; + player.chooseTarget( + function (card, player, target) { + return ( + target != player && + target.countCards("j", function (card) { + return player.canAddJudge(card); + }) > 0 + ); + }, + get.prompt("dangzai"), + "将一名其他角色判定区内的一张牌移动到你的判定区内" + ); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dangzai", target); + player.choosePlayerCard(target, "j", true).set("filterButton", function (button) { + return _status.event.player.canAddJudge(button.link); + }); + } else event.finish(); + "step 2"; + if (result.bool && result.cards && result.cards.length) { + var card = result.cards[0]; + target.$give(card, player); + game.delayx(); + var name = card.viewAs || card.name; + if (card.name != name) { + player.addJudge(name, card); + } else { + player.addJudge(card); + } + } + }, + }, + liangjue: { + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + if (player.hp <= 1) return false; + if (event.player == player) { + if (event.name == "equip" && get.color(event.card, player) == "black") return true; + if (event.name == "addJudge" && get.color(event.cards[0], player) == "black") return true; + } + var evt = event.getl(player); + if (!evt || !evt.es || !evt.js || (!evt.es.length && !evt.js.length)) return false; + for (var i of evt.es) { + if (get.color(i, player) == "black") return true; + } + for (var i of evt.js) { + if (get.color(i, player) == "black") return true; + } + return false; + }, + content: function () { + player.loseHp(); + player.draw(2); + }, + }, + //狼灭 + langmie: { + trigger: { global: "phaseUseEnd" }, + //forced:true, + filter: function (event, player) { + if (player == event.player || !player.countCards("he")) return false; + var map = {}; + var list = event.player.getHistory("useCard", function (evt) { + var evt2 = evt.getParent("phaseUse"); + return evt2 == event; + }); + for (var i of list) { + var name = get.type2(i.card, false); + if (!map[name]) map[name] = true; + else return true; + } + }, + frequent: true, + content: function () { + player.draw(); + }, + group: "langmie_damage", + }, + langmie_damage: { + audio: "langmie", + trigger: { global: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return event.player != player && (event.player.getStat("damage") || 0) > 1 && player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player + .chooseToDiscard("he", get.prompt("langmie", trigger.player), "弃置一张牌并对其造成1点伤害") + .set("goon", get.damageEffect(trigger.player, player, player) > 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }).logSkill = ["langmie_damage", trigger.player]; + "step 1"; + if (result.bool) trigger.player.damage(); + }, + ai: { expose: 0.2 }, + }, + //牛金 + recuorui: { + audio: "cuorui", + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return ( + player.hp > 0 && + game.hasPlayer(function (current) { + return current != player && current.countGainableCards(player, "h") > 0; + }) + ); + }, + filterTarget: function (card, player, target) { + return target != player && target.countGainableCards(player, "h") > 0; + }, + selectTarget: function () { + return [1, _status.event.player.hp]; + }, + content: function () { + if (num == 0) player.awakenSkill("recuorui"); + player.gainPlayerCard(target, true, "h"); + }, + ai: { + order: 10, + result: { + player: 1, + target: function (player, target) { + if (target.hasSkillTag("noh")) return 0; + return -1; + }, + }, + }, + }, + reliewei: { + audio: "liewei", + trigger: { global: "dying" }, + filter: function (event, player) { + return player == _status.currentPhase || player.getHistory("useSkill", evt => evt.skill == "reliewei").length < player.getHp(); + }, + frequent: true, + content: function () { + player.draw(); + }, + }, + //张邈 + mouni: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h", "sha") > 0; + }, + content: function () { + "step 0"; + player.addSkill("mouni2"); + player.chooseTarget(get.prompt2("mouni"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + cards = player.getCards("h", "sha"); + if ( + get.attitude(player, target) >= 0 || + !player.canUse(cards[0], target, false) || + (!player.hasJudge("lebu") && + target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: cards[0], + }, + true + )) + ) + return 0; + return get.effect(target, cards[0], player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("mouni", target); + event.cards = player.getCards("h", "sha"); + } else event.finish(); + "step 2"; + if (event.mouni_dying) return; + var hs = player.getCards("h"); + cards = cards.filter(function (card) { + return ( + hs.includes(card) && + get.name(card, player) == "sha" && + player.canUse( + { + name: "sha", + nature: get.nature(card, player), + isCard: true, + cards: [card], + }, + target, + false + ) + ); + }); + if (cards.length) { + var card = cards.randomRemove(1)[0]; + player.useCard(target, false, card); + event.redo(); + } + "step 3"; + if ( + player.getHistory("useCard", function (evt) { + return ( + evt.getParent() == event && + !player.getHistory("sourceDamage", function (evt2) { + return evt.card == evt2.card; + }).length + ); + }).length + ) { + player.skip("phaseUse"); + player.skip("phaseDiscard"); + } + player.removeSkill("mouni2"); + }, + }, + mouni2: { + charlotte: true, + trigger: { global: "dying" }, + forced: true, + firstDo: true, + popup: false, + filter: function (event, player) { + var evt = event.getParent("mouni"); + return evt && evt.player == player && evt.target == event.player; + }, + content: function () { + trigger.getParent("mouni").mouni_dying = true; + }, + }, + zongfan: { + derivation: "zhangu", + trigger: { player: "phaseJieshuBegin" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return ( + !player.getHistory("skipped").includes("phaseUse") && + player.getHistory("useCard", function (evt) { + return evt.getParent().name == "mouni"; + }).length > 0 + ); + }, + content: function () { + "step 0"; + player.awakenSkill("zongfan"); + var num = player.countCards("he"); + if (num > 0) { + player.chooseCardTarget({ + prompt: "是否将任意张牌交给一名其他角色?", + selectCard: [1, num], + filterCard: true, + filterTarget: lib.filter.notMe, + position: "he", + ai1: function (card) { + if (card.name == "du") return 10; + else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + var player = _status.event.player; + if ( + ui.selected.cards.length > 4 || + !game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); + }) + ) + return 0; + return 1 / Math.max(0.1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -att; + if (target.hasSkillTag("nogain")) att /= 6; + return att; + }, + }); + } else event.goto(2); + "step 1"; + if (result.bool) { + var cards = result.cards, + target = result.targets[0], + num = Math.min(5, cards.length); + player.give(cards, target); + player.gainMaxHp(num); + player.recover(num); + } + "step 2"; + //player.removeSkill('mouni'); + player.changeSkills(["zhangu"], ["mouni"]); + }, + }, + zhangu: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.maxHp > 1 && (player.countCards("h") == 0 || player.countCards("e") == 0); + }, + content: function () { + var cards = [], + types = []; + for (var i = 0; i < 3; i++) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && !types.includes(get.type2(card, false)); + }); + if (card) { + cards.push(card); + types.push(get.type2(card, false)); + } else break; + } + if (cards.length) player.gain(cards, "gain2"); + player.loseMaxHp(); + }, + }, + //梁兴 + lulve: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + var hs = player.countCards("h"); + return ( + hs > 1 && + game.hasPlayer(function (target) { + var ts = target.countCards("h"); + return target != player && ts > 0 && hs > ts; + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("lulve"), function (card, player, target) { + var hs = player.countCards("h"), + ts = target.countCards("h"); + return target != player && ts > 0 && hs > ts; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.isTurnedOver()) return att / 10; + if (!player.hasShan() && target.canUse({ name: "sha", isCard: true }, player, false) && get.effect(player, { name: "sha", isCard: true }, target, player) < 0 && player.hp < 4) return 0; + return -att * Math.sqrt(target.countCards("h")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("lulve", target); + var str = get.translation(player); + target + .chooseControl() + .set("choiceList", ["将所有手牌交给" + str + ",然后其将武将牌翻面", "将武将牌翻面,然后视为对" + str + "使用【杀】"]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().player; + if (player.isTurnedOver()) return 1; + if (!target.hasShan() && player.canUse({ name: "sha", isCard: true }, target, false) && get.effect(target, { name: "sha", isCard: true }, player, player) < 0) return 0; + return Math.random() < 0.5 ? 0 : 1; + }); + } else event.finish(); + "step 2"; + if (result.index == 0) { + target.give(target.getCards("h"), player); + player.turnOver(); + event.finish(); + } else target.turnOver(); + "step 3"; + if (target.canUse({ name: "sha", isCard: true }, player, false)) target.useCard({ name: "sha", isCard: true }, player, false); + }, + }, + lxzhuixi: { + audio: 2, + trigger: { + player: "damageBegin3", + source: "damageBegin1", + }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return event.source && event.player.isTurnedOver() != event.source.isTurnedOver(); + }, + content: function () { + trigger.num++; + }, + }, + //陶谦和曹嵩 + reyirang: { + audio: "yirang", + audioname: ["re_taoqian"], + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + if ( + !player.countCards("he", function (card) { + return get.type(card) != "basic"; + }) + ) { + return false; + } + return game.hasPlayer(function (current) { + return current != player; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("reyirang"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + return (get.attitude(_status.event.player, target) - 2) * target.maxHp; + }); + "step 1"; + if (result.bool) { + var cards = player.getCards("he", function (card) { + return get.type(card) != "basic"; + }); + var target = result.targets[0]; + player.logSkill("reyirang", target); + player.give(cards, target, "give"); + if (target.maxHp > player.maxHp) player.gainMaxHp(target.maxHp - player.maxHp, true); + player.recover(cards.length); + } + }, + }, + cslilu: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { + return !event.numFixed; + }, + check: function (event, player) { + return ( + Math.min(player.maxHp, 5) - player.countCards("h") > 3 || + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ); + }, + content: function () { + "step 0"; + trigger.changeToZero(); + "step 1"; + player.drawTo(Math.min(player.maxHp, 5)); + "step 2"; + if (player.countCards("h") > 0) { + var str = "将至少一张手牌交给一名其他角色"; + var num = player.countMark("cslilu"); + if (num < player.countCards("h")) { + if (num > 0) str += "。若给出的牌数大于" + get.cnNumber(num) + "张,则你"; + else str += ",并"; + str += "加1点体力上限并回复1点体力"; + } + player.chooseCardTarget({ + prompt: str, + filterCard: true, + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + forced: true, + ai1: function (card) { + if (ui.selected.cards.length < _status.event.goon) { + if ( + get.tag(card, "damage") && + game.hasPlayer(function (current) { + current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain") && !current.hasJudge("lebu") && current.hasValueTarget(card); + }) + ) + return 1; + return 1 / Math.max(0.1, get.value(card)); + } + return 0; + }, + ai2: function (target) { + return Math.sqrt(5 - Math.min(4, target.countCards("h"))) * get.attitude(_status.event.player, target); + }, + goon: (function () { + if ( + !game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain") && !current.hasJudge("lebu"); + }) + ) + return 1; + if (num < player.countCards("h")) return num + 1; + return 1; + })(), + }); + } else event.finish(); + "step 3"; + if (result.bool) { + var num = player.countMark("cslilu"); + player.give(result.cards, result.targets[0]); + if (result.cards.length > num) { + player.gainMaxHp(); + player.recover(); + } + player.storage.cslilu = result.cards.length; + player.markSkill("cslilu"); + } + }, + }, + csyizheng: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("csyizheng"), lib.filter.notMe).set("ai", function (target) { + if (target.isTurnedOver() || target.hasJudge("lebu")) return 0; + return get.attitude(_status.event.player, target) * Math.max(0, target.countCards("h") - 2); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("csyizheng", target); + player.storage.csyizheng2 = target; + player.addTempSkill("csyizheng2", { player: "phaseBegin" }); + } + }, + }, + csyizheng2: { + audio: "csyizheng", + trigger: { + global: ["recoverBegin", "damageBegin1"], + }, + forced: true, + charlotte: true, + logTarget: function (event) { + return event.name == "damage" ? event.source : event.player; + }, + filter: function (event, player) { + var target = lib.skill.csyizheng2.logTarget(event); + if (target != player.storage.csyizheng2) return false; + return player.maxHp > target.maxHp; + }, + content: function () { + player.loseMaxHp(); + trigger.num++; + }, + mark: "character", + intro: { + content: "$造成伤害或回复体力时,若你的体力上限大于其,则你减1点体力上限,然后此伤害/回复量+1", + }, + }, + reyixiang: { + audio: "yixiang", + audioname: ["re_taoqian"], + trigger: { player: "damageBegin1" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent(2); + if (evt.name != "useCard" || evt.card != event.card) return false; + var source = evt.player; + var phsu = evt.getParent("phaseUse"); + if (!source || source == player || source != phsu.player) return false; + return ( + source.getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == phsu; + })[0] == evt + ); + }, + content: function () { + trigger.num--; + }, + group: "reyixiang_card", + subSkill: { + card: { + audio: "yixiang", + audioname: ["re_taoqian"], + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + if (get.color(event.card) != "black") return false; + var evt = event.getParent(); + var source = evt.player; + var phsu = evt.getParent("phaseUse"); + if (!source || source == player || source != phsu.player) return false; + return ( + source + .getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == phsu; + }) + .indexOf(evt) == 1 + ); + }, + content: function () { + trigger.excluded.add(player); + }, + }, + }, + ai: { + effect: { + target: function (card, player, target, current, isLink) { + if (isLink || typeof card !== "object" || !player.isPhaseUsing()) return; + var num; + var evt = _status.event.getParent("useCard"), + evt2 = _status.event.getParent("phaseUse"); + if (evt.card == card) { + num = player + .getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == evt2; + }) + .indexOf(evt); + } else + num = player.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == evt2; + }).length; + if (num < 0 || num > 1) return; + if (num === 0 && get.tag(card, "damage")) { + if ( + target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) || + !player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ) + return "zerotarget"; + return [0.5, 0, 0.5, 0]; + } + if (num === 1 && get.color(card) == "black") return "zeroplayertarget"; + }, + }, + }, + }, + //赵忠 + yangzhong: { + audio: 2, + trigger: { + source: "damageSource", + player: "damageEnd", + }, + direct: true, + filter: function (event, player) { + var target = event.player, + source = event.source; + if (player != source && !player.hasSkill("yangzhong")) return false; + if (!target || !source || !target.isIn() || !source.isIn()) return false; + return source.countCards("he") > 1; + }, + content: function () { + "step 0"; + trigger.source.chooseToDiscard("是否对" + get.translation(trigger.player) + "发动【殃众】?", "弃置两张牌,并令其失去1点体力", "he", 2).set("ai", function (card) { + var evt = _status.event; + if (get.attitude(evt.player, evt.getTrigger().player) >= 0) return 0; + return 7 - get.value(card); + }).logSkill = ["yangzhong", trigger.player]; + "step 1"; + if (result.bool) trigger.player.loseHp(); + }, + }, + huangkong: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + if (player == _status.currentPhase || player.countCards("h")) return false; + return event.card.name == "sha" || get.type(event.card, false) == "trick"; + }, + content: function () { + player.draw(2); + }, + }, + hfjieying: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("hfjieying"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + return ( + (get.attitude(player, target) * + (1 + + target.countCards("h", function (card) { + return !get.tag(card, "damage") && target.hasValueTarget(card); + }))) / + (1 + target.countCards("h")) + ); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("hfjieying", target); + target.addTempSkill("hfjieying2", { player: "phaseJieshuBegin" }); + } + }, + ai: { + expose: 0.05, + }, + }, + hfjieying2: { + mod: { + cardEnabled: function (card, player) { + if (player.storage.hfjieying2) return false; + }, + cardSavable: function (card, player) { + if (player.storage.hfjieying2) return false; + }, + targetInRange: function (card, player) { + if (player == _status.currentPhase && (card.name == "sha" || get.type(card) == "trick")) return true; + }, + aiOrder: function (player, card, num) { + var info = get.info(card); + if (!get.tag(card, "damage") && (!info || !info.toself)) return num + 8; + }, + }, + onremove: true, + trigger: { player: "useCard2" }, + direct: true, + charlotte: true, + filter: function (event, player) { + if (player != _status.currentPhase || event.targets.length != 1) return false; + var card = event.card; + if (card.name != "sha" && get.type(card) != "trick") return false; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("hfjieying2"), function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("hfjieying2", event.targets); + trigger.targets.addArray(event.targets); + } + }, + group: "hfjieying3", + mark: true, + intro: { + content: function (player) { + if (player) return "不能使用牌直到回合结束"; + return "使用【杀】或普通锦囊牌时无距离限制且可以多指定一个目标"; + }, + }, + }, + hfjieying3: { + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return !player.storage.hfjieying2 && player == _status.currentPhase; + }, + content: function () { + player.storage.hfjieying2 = true; + }, + }, + weipo: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + return player != event.player && !player.hasSkill("weipo3") && player.countCards("h") < Math.min(5, player.maxHp) && (event.card.name == "sha" || get.type(event.card) == "trick"); + }, + content: function () { + "step 0"; + player.addTempSkill("weipo2"); + player.drawTo(Math.min(5, player.maxHp)); + "step 1"; + var evt = trigger.getParent(); + if (!evt.weipo) evt.weipo = {}; + evt.weipo[player.playerid] = player.countCards("h"); + }, + }, + weipo2: { + charlotte: true, + trigger: { global: "useCardAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.weipo && event.weipo[player.playerid] != undefined && event.weipo[player.playerid] > player.countCards("h"); + }, + content: function () { + "step 0"; + player.addTempSkill("weipo3", { player: "phaseBegin" }); + if (player.countCards("h") && trigger.player.isIn()) { + player.chooseCard("h", true, "将一张手牌交给" + get.translation(trigger.player)); + } else event.finish(); + "step 1"; + if (result.bool) { + player.give(result.cards, trigger.player); + } + }, + }, + weipo3: { charlotte: true }, + refuqi: { + audio: "fuqi", + forced: true, + trigger: { + player: "useCard", + }, + filter: function (event, player) { + return ( + event.card && + (get.type(event.card) == "trick" || (get.type(event.card) == "basic" && !["shan", "tao", "jiu", "du"].includes(event.card.name))) && + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) <= 1; + }) + ); + }, + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player && get.distance(player, current) <= 1; + }) + ); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return get.distance(player, arg.target) <= 1; + }, + }, + }, + zhuide: { + audio: 2, + trigger: { player: "die" }, + forceDie: true, + skillAnimation: true, + animationColor: "thunder", + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("zhuide"), lib.filter.notMe).set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhuide", target); + var names = []; + var cards = []; + while (cards.length < 4) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && !names.includes(card.name) && get.type(card) == "basic"; + }); + if (card) { + cards.push(card); + names.push(card.name); + } else break; + } + if (cards.length) target.gain(cards, "gain2"); + } + }, + }, + juntun: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.maxHp > 1; + }, + content: function () { + player.loseMaxHp(); + player.draw(player.maxHp); + }, + }, + jiaojie: { + audio: 2, + mod: { + ignoredHandcard: function (card, player) { + if (get.color(card) == "red") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.color(card) == "red") { + return false; + } + }, + targetInRange: function (card) { + const color = get.color(card); + if (color === "black" || color === "unsure") return true; + }, + cardUsable: function (card) { + const color = get.color(card); + if (color === "black" || color === "unsure") return Infinity; + }, + }, + }, + decadewuniang: { + trigger: { + player: ["useCard", "respond"], + }, + audio: "xinfu_wuniang", + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("decadewuniang"), function (card, player, target) { + if (player == target) return false; + return target.countGainableCards(player, "he") > 0; + }) + .set("ai", function (target) { + return 10 - get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("decadewuniang", target); + player.line(target, "fire"); + player.gainPlayerCard(target, "he", true); + target.draw(); + if (!player.storage.decadexushen) event.finish(); + } else event.finish(); + "step 2"; + var list = game.filterPlayer(function (current) { + return current.name == "dc_guansuo" || current.name2 == "dc_guansuo"; + }); + if (list.length) game.asyncDraw(list); + else event.finish(); + "step 3"; + game.delayx(); + }, + }, + minsi: { + audio: 2, + enable: "phaseUse", + getResult: function (cards) { + var l = cards.length; + var all = Math.pow(l, 2); + var list = []; + for (var i = 1; i < all; i++) { + var array = []; + for (var j = 0; j < l; j++) { + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) array.push(cards[j]); + } + var num = 0; + for (var k of array) { + num += get.number(k); + } + if (num == 13) list.push(array); + } + if (list.length) { + list.sort(function (a, b) { + if (a.length != b.length) return b.length - a.length; + return get.value(a) - get.value(b); + }); + return list[0]; + } + return list; + }, + usable: 1, + filterCard: function (card) { + 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; + }, + complexCard: true, + selectCard: function () { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); + } + if (num == 13) return ui.selected.cards.length; + return ui.selected.cards.length + 2; + }, + check: function (card) { + var evt = _status.event; + if (!evt.minsi_choice) evt.minsi_choice = lib.skill.minsi.getResult(evt.player.getCards("he")); + if (!evt.minsi_choice.includes(card)) return 0; + return 1; + }, + position: "he", + content: function () { + player.draw(cards.length * 2).gaintag = ["minsi2"]; + player.addTempSkill("minsi2"); + }, + ai: { + order: 5, + result: { player: 1 }, + }, + }, + minsi2: { + onremove: function (player) { + player.removeGaintag("minsi2"); + }, + mod: { + targetInRange: function (card, player, target) { + if (!card.cards || !card.cards.length) return; + for (var i of card.cards) { + if (!i.hasGaintag("minsi2") || get.color(i) != "black") return; + } + return true; + }, + ignoredHandcard: function (card, player) { + if (card.hasGaintag("minsi2") && get.color(card) == "red") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("minsi2") && get.color(card) == "red") { + return false; + } + }, + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("minsi2") && get.color(card) == "black") return num - 0.1; + }, + }, + }, + jijing: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { + "step 0"; + player.judge(); + "step 1"; + var num = result.number; + var next = player.chooseToDiscard( + "是否弃置任意张点数之和为" + get.cnNumber(num) + "的牌并回复1点体力?", + function (card) { + 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 <= _status.event.num; + }, + "he" + ); + next.set("num", num); + next.set("complexCard", true); + next.set("selectCard", function () { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); + } + if (num == _status.event.num) return ui.selected.cards.length; + return ui.selected.cards.length + 2; + }); + next.set( + "cardResult", + (function () { + var cards = player.getCards("he"); + var l = cards.length; + var all = Math.pow(l, 2); + var list = []; + for (var i = 1; i < all; i++) { + var array = []; + for (var j = 0; j < l; j++) { + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) array.push(cards[j]); + } + var numx = 0; + for (var k of array) { + numx += get.number(k); + } + if (numx == num) list.push(array); + } + if (list.length) { + list.sort(function (a, b) { + return get.value(a) - get.value(b); + }); + return list[0]; + } + return list; + })() + ); + next.set("ai", function (card) { + if (!_status.event.cardResult.includes(card)) return 0; + return 6 - get.value(card); + }); + "step 2"; + if (result.bool) player.recover(); + }, + }, + cixiao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + if ( + !game.hasPlayer(function (current) { + return current.hasSkill("panshi"); + }) + ) + return true; + return ( + player.countCards("he") >= 1 && + game.hasPlayer(function (current) { + return current != player && !current.hasSkill("panshi"); + }) + ); + }, + content: function () { + "step 0"; + if ( + game.hasPlayer(function (current) { + return current.hasSkill("panshi"); + }) + ) + event.goto(2); + else + player.chooseTarget(lib.filter.notMe, get.prompt("cixiao"), "令一名其他角色获得「义子」标记").set("ai", function (target) { + var player = _status.event.player; + var att = -get.attitude(player, target); + return att * target.countCards("h"); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("cixiao", target); + target.addSkills("panshi"); + } + event.finish(); + "step 2"; + var list = game.filterPlayer(function (current) { + return current.hasSkill("panshi"); + }); + player.chooseCardTarget({ + prompt: get.prompt("cixiao"), + prompt2: "弃置一张牌并将" + get.translation(list) + "的「义子」标记转移给其他角色", + position: "he", + filterTarget: function (card, player, target) { + return player != target && !target.hasSkill("panshi"); + }, + filterCard: lib.filter.cardDiscardable, + ai1: function (card) { + if (_status.event.goon) return 5 - get.value(card); + return 0; + }, + ai2: function (target) { + var player = _status.event.player; + var att = -get.attitude(player, target); + return att * target.countCards("h"); + }, + goon: (function (target) { + var att = -get.attitude(player, target); + return att * target.countCards("h") <= 0; + })(list[0]), + }); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("cixiao"); + player.discard(result.cards).delay = false; + player.line2( + game + .filterPlayer(function (current) { + if (current.hasSkill("panshi")) { + current.removeSkills("panshi"); + return true; + } + }) + .concat(result.targets), + "green" + ); + target.addSkills("panshi"); + } else event.finish(); + "step 4"; + game.delayx(); + }, + derivation: "panshi", + ai: { threaten: 8 }, + }, + panshi: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && current.hasSkill("cixiao"); + }) + ); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("cixiao"); + }); + if (targets.length == 1) { + event.target = targets[0]; + player.chooseCard("h", true, "叛弑:将一张手牌交给" + get.translation(targets)); + } else + player.chooseCardTarget({ + prompt: "叛弑:将一张手牌交给" + get.translation(targets) + "中的一名角色", + filterCard: true, + position: "h", + targets: targets, + forced: true, + filterTarget: function (card, player, target) { + return _status.event.targets.includes(target); + }, + }); + "step 1"; + if (result.bool) { + if (!target) target = result.targets[0]; + player.line(target); + player.give(result.cards, target); + } + }, + mark: true, + marktext: "子", + intro: { + name: "义子", + //content:'我是儿子', + //R·I·P——永远怀念:被棘手砍掉的“我是儿子” + content(_, player) { + const targets = game.filterPlayer2(target => target.hasSkill("cixiao", null, null, false)).sortBySeat(player); + if (!targets.length) return "我义父呢?!"; + if ( + ["name", "name1", "name2"].some(name => { + if (!player[name] || !get.character(player[name]) || typeof get.translation(player[name]) != "string") return false; + return player[name].includes("lvbu") && get.translation(player[name]).includes("吕布"); + }) + ) + return "公若不弃,布愿拜为义父"; + return ( + "我是" + + get.translation(targets) + + "的" + + (player => { + switch (player.sex) { + case "female": + return "义女"; + case "double": + return "义子义女"; + default: + return "义子"; + } + })(player) + ); + }, + }, + group: "panshi_damage", + ai: { + halfneg: true, + }, + }, + panshi_damage: { + trigger: { source: "damageBegin1" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return player.isPhaseUsing() && event.card && event.card.name == "sha" && event.player.hasSkill("cixiao"); + }, + content: function () { + trigger.num++; + if ( + ["name", "name1", "name2"].some(name => { + if (!player[name] || !get.character(player[name]) || typeof get.translation(player[name]) != "string") return false; + return player[name].includes("lvbu") && get.translation(player[name]).includes("吕布"); + }) + ) + player.chat("吾堂堂丈夫,安肯为汝子乎!"); + var evt = event.getParent("phaseUse"); + if (evt && evt.player == player) evt.skipped = true; + }, + }, + xianshuai: { + audio: 2, + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + return event.source && event.source.isIn() && !player.hasSkill("xianshuai2"); + }, + content: function () { + player.addTempSkill("xianshuai2", "roundStart"); + player.draw(); + if (player == trigger.source && trigger.player.isIn()) { + player.line(trigger.player, "green"); + trigger.player.damage(); + } + }, + }, + xianshuai2: { charlotte: true }, + decadexushen: { + derivation: "decadezhennan", + audio: "xinfu_xushen", + trigger: { player: "dying" }, + limited: true, + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { + return player.hp < 1; + }, + content: function () { + player.awakenSkill("decadexushen"); + player.addSkills("decadezhennan"); + player.addTempSkill("decadexushen2"); + trigger.decadexushen = true; + player.recover(); + }, + }, + decadexushen2: { + trigger: { player: "dyingAfter" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return ( + event.decadexushen == true && + !game.hasPlayer(function (current) { + return current.name == "dc_guansuo" || current.name2 == "dc_guansuo"; + }) + ); + }, + content: function () { + "step 0"; + player.chooseTarget(lib.filter.notMe, "许身:是否令一名其他角色选择是否将其武将牌替换为“关索”并令其摸三张牌?").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (!result.bool) { + event.finish(); + return; + } + var target = result.targets[0]; + event.target = target; + player.line(target, "fire"); + target.chooseBool("许身:是否将自己的一张武将牌替换为“关索”并令" + get.translation(player) + "摸三张牌?"); + "step 2"; + if (result.bool) { + if (target.name2 != undefined) { + target.chooseControl(target.name1, target.name2).set("prompt", "请选择要更换的武将牌"); + } else event._result = { control: target.name1 }; + } else event.goto(4); + "step 3"; + target.reinitCharacter(result.control, "dc_guansuo"); + "step 4"; + target.draw(3); + }, + }, + decadezhennan: { + audio: "xinfu_zhennan", + trigger: { + global: "useCardToPlayered", + }, + filter: function (event, player) { + return event.isFirstTarget && event.targets && event.targets.length > 1 && get.type2(event.card) == "trick"; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("decadezhennan"), "对一名其他角色造成1点伤害", function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool && result.targets && result.targets.length) { + player.logSkill("decadezhennan", result.targets); + result.targets[0].damage(); + } + }, + ai: { + expose: 0.25, + }, + }, + yujue: { + audio: 2, + derivation: "zhihu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hasEnabledSlot(); + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("###鬻爵###" + lib.translate.yujue_info); + }, + chooseControl: function (event, player) { + var list = []; + for (var i = 1; i < 6; i++) { + if (player.hasEnabledSlot(i)) list.push("equip" + i); + } + list.push("cancel2"); + return list; + }, + check: function (event, player) { + for (var i = 5; i > 0; i--) { + if (player.hasEmptySlot(i)) return "equip" + i; + } + return "cancel2"; + }, + backup: function (result) { + var next = get.copy(lib.skill.yujuex); + next.position = result.control; + return next; + }, + }, + ai: { + order: 1, + result: { + player: function (player) { + if ( + game.hasPlayer(function (target) { + if (player == target) return false; + var hs = target.countCards("h"); + return hs > 2 && get.attitude(player, target) > 0; + }) + ) + return 1; + return 0; + }, + }, + }, + }, + yujuex: { + audio: "yujue", + async content(event, trigger, player) { + await player.disableEquip(lib.skill.yujue_backup.position); + if ( + player.isIn() && + game.hasPlayer(function (current) { + return current != player && current.countCards("h"); + }) + ) { + const result = await player + .chooseTarget(true, "选择一名角色交给你一张牌并获得技能〖执笏〗", function (card, player, target) { + if (player == target) return false; + return target.countCards("h") > 0; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) * target.countCards("h"); + }) + .forResult(); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target); + const result2 = await target.chooseCard("h", true, "交给" + get.translation(player) + "一张手牌").forResult(); + if (result2.bool && result2.cards && result2.cards.length) { + await target.give(result2.cards, player); + target.storage.zhihu_mark = player; + await target.addSkills("zhihu"); + target.addSkill("zhihu_mark"); + } + } + } + }, + }, + zhihu: { + usable: 2, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + return player != event.player; + }, + content: function () { + player.draw(2); + }, + }, + zhihu_mark: { + mark: "character", + intro: { + content: "以$之名,授予汝技能〖执笏〗,直至$的下回合开始为止!", + }, + onremove: function (player) { + delete player.storage.zhihu_mark; + player.removeSkills("zhihu"); + }, + trigger: { global: "phaseBeginStart" }, + firstDo: true, + charlotte: true, + silent: true, + filter: function (event, player) { + return event.player == player.storage.zhihu_mark; + }, + content: function () { + player.removeSkill("zhihu_mark"); + }, + }, + tuxing: { + audio: 2, + trigger: { player: "disableEquipAfter" }, + forced: true, + content: function () { + "step 0"; + player.gainMaxHp(); + player.recover(); + "step 1"; + if (!player.hasEnabledSlot()) { + player.loseMaxHp(4); + player.addSkill("tuxing2"); + } + }, + }, + tuxing2: { + audio: "tuxing", + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + content: function () { + trigger.num++; + }, + mark: true, + intro: { + content: "造成伤害时,此伤害+1", + }, + }, + gongjian: { + audio: 2, + trigger: { global: "useCardToPlayered" }, + usable: 1, + logTarget: function (event) { + return event.parent.gongjian_targets.filter(function (target) { + return event.targets.includes(target) && target.countCards("he") > 0; + }); + }, + filter: function (event, player) { + if (event.card.name != "sha" || !event.isFirstTarget) return false; + if ( + event.parent.gongjian_targets && + event.parent.gongjian_targets.filter(function (target) { + return event.targets.includes(target) && target.countCards("he") > 0; + }).length > 0 + ) + return true; + return false; + }, + check: function (event, player) { + var targets = event.parent.gongjian_targets.filter(function (target) { + return event.targets.includes(target) && target.countCards("he") > 0; + }), + att = 0; + for (var i of targets) { + att += get.attitude(player, i); + } + return att < 0; + }, + content: function () { + "step 0"; + event.targets = trigger.parent.gongjian_targets.filter(function (target) { + return trigger.targets.includes(target); + }); + event.num = 0; + "step 1"; + var target = targets[num]; + player.discardPlayerCard(target, true, "he", [1, 2]).set("forceAuto", true); + "step 2"; + event.num++; + if (event.num < targets.length) event.goto(1); + else { + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.player && evt.hs && evt.type == "discard" && evt.getParent(3) == event) { + for (var i of evt.hs) { + if (get.name(i, evt.player) == "sha" && get.position(i, true) == "d") cards.add(i); + } + } + }); + if (cards.length) player.gain(cards, "gain2"); + } + }, + group: "gongjian_count", + subSkill: { + count: { + trigger: { global: "useCard1" }, + silent: true, + firstDo: true, + filter: function (event, player) { + return event.card && event.card.name == "sha"; + }, + content: function () { + if (player.storage.gongjian) trigger.gongjian_targets = player.storage.gongjian; + player.storage.gongjian = trigger.targets; + }, + }, + }, + }, + kuimang: { + audio: 2, + trigger: { global: "dieAfter" }, + forced: true, + filter: function (event, player) { + return ( + player.getAllHistory("sourceDamage", function (target) { + return target.player == event.player; + }).length > 0 + ); + }, + content: function () { + player.draw(2); + }, + }, + rexiemu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return !game.hasPlayer(function (current) { + return current.hasMark("rexiemu"); + }); + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("rexiemu"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target) * Math.sqrt(Math.max(1 + player.countCards("h"), 1 + target.countCards("h"))); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("rexiemu", target); + target.addMark("rexiemu", 1); + player.addSkill("rexiemu2"); + } + }, + intro: { content: "mark" }, + ai: { + expose: 0.1, + }, + }, + rexiemu2: { + audio: "rexiemu", + trigger: { global: ["loseAfter"] }, + forced: true, + charlotte: true, + usable: 1, + filter: function (event, player) { + return ( + (event.player == player || event.player.hasMark("rexiemu")) && + ["useCard", "respond"].includes(event.getParent().name) && + event.hs && + event.hs.length && + event.player != _status.currentPhase && + game.hasPlayer(function (current) { + return current.hasMark("rexiemu"); + }) + ); + }, + content: function () { + "step 0"; + game.asyncDraw( + game.filterPlayer(function (current) { + return current == player || current == trigger.player || current.hasMark("rexiemu"); + }) + ); + "step 1"; + game.delayx(); + }, + group: "rexiemu3", + }, + rexiemu3: { + trigger: { player: "phaseBegin" }, + forced: true, + charlotte: true, + silent: true, + firstDo: true, + content: function () { + player.removeSkill("rexiemu2"); + game.countPlayer(function (current) { + var num = current.countMark("rexiemu"); + if (num) current.removeMark("rexiemu", num); + }); + }, + }, + heli: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return lib.skill.heli.filterTarget(null, player, current); + }); + }, + filterTarget: function (card, player, target) { + return target.countCards("h") < player.countCards("h"); + }, + content: function () { + "step 0"; + if (target.countCards("h")) target.showHandcards(); + "step 1"; + var list = []; + var cards = []; + for (var i of lib.inpile) list.add(get.type2(i)); + for (var i of list) { + if ( + !target.countCards("h", function (card) { + return get.type2(card, target) == i; + }) + ) { + var card = get.cardPile2(function (card) { + return get.type2(card, false) == i; + }); + if (card) cards.push(card); + } + } + if (cards.length) target.gain(cards, "gain2", "log"); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + return 1 / Math.sqrt(1 + target.countCards("h")); + }, + }, + }, + }, + moying: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + if (player == _status.currentPhase || event.getParent().name == "useCard") return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length == 1 && ["equip", "trick"].includes(get.type2(evt.cards2[0], evt.type == "discard" && evt.hs.includes(evt.cards2[0]) ? player : false)) && !player.hasSkill("moying2"); + }, + content: function () { + "step 0"; + var number = trigger.getl(player).cards2[0].number; + var numbers = [number - 2, number - 1, number, number + 1, number + 2].filter(function (number) { + return number >= 1 && number <= 13; + }); + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + _status.imchoosing = false; + event._result = { + bool: true, + suit: lib.suit.randomGet(), + number: numbers.randomGet(), + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + }; + var chooseButton = function (player, numbers) { + var event = _status.event; + player = player || event.player; + if (!event._result) event._result = {}; + var dialog = ui.create.dialog("是否发动【墨影】?", "forcebutton", "hidden"); + event.dialog = dialog; + dialog.addText("花色"); + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + var listi = ["spade", "heart", "club", "diamond"]; + for (var i = 0; i < listi.length; i++) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.link = listi[i]; + table.appendChild(td); + td.innerHTML = "" + get.translation(listi[i]) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); + } + this.classList.add("bluebg"); + event._result.suit = link; + }); + } + dialog.content.appendChild(table); + dialog.addText("点数"); + var table2 = document.createElement("div"); + table2.classList.add("add-setting"); + table2.style.margin = "0"; + table2.style.width = "100%"; + table2.style.position = "relative"; + for (var i = 0; i < numbers.length; i++) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.link = numbers[i]; + table2.appendChild(td); + var num = numbers[i]; + switch (num) { + case 1: + num = "A"; + break; + case 11: + num = "J"; + break; + case 12: + num = "Q"; + break; + case 13: + num = "K"; + break; + } + td.innerHTML = "" + num + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); + } + this.classList.add("bluebg"); + event._result.number = link; + }); + } + dialog.content.appendChild(table2); + dialog.add("  "); + event.dialog.open(); + + event.switchToAuto = function () { + event._result = { + bool: true, + number: numbers.randomGet(), + suit: lib.suit.randomGet(), + }; + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }; + event.control = ui.create.control("ok", "cancel2", function (link) { + var result = event._result; + if (link == "cancel2") result.bool = false; + else { + if (!result.number || !result.suit) return; + result.bool = true; + } + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }); + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("selectable"); + } + game.pause(); + game.countChoose(); + }; + if (event.isMine()) { + chooseButton(player, numbers); + } else if (event.isOnline()) { + event.player.send(chooseButton, event.player, numbers); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 1"; + var map = event.result || result; + if (map.bool) { + player.logSkill("moying"); + player.addTempSkill("moying2"); + var cards = []; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (get.suit(card) == map.suit && get.number(card) == map.number) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2", "log"); + } + }, + }, + moying2: {}, + juanhui: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("juanhui"), lib.filter.notMe, "选择记录一名其他角色使用过的牌").set("ai", function (target) { + if (target.isTurnedOver() || target.hasJudge("lebu")) return Math.random(); + return (1 + target.countCards("h")) * 2 + Math.random(); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("juanhui", target); + player.storage.juanhui2 = target; + player.storage.juanhui3 = []; + player.addSkill("juanhui2"); + } + }, + }, + juanhui2: { + charlotte: true, + mark: true, + mod: { + cardUsable: function (card) { + if (card.name == "sha" && _status.event.skill == "juanhui2_backup") return Infinity; + }, + }, + intro: { + markcount: function (storage, player) { + return player.getStorage("juanhui3").length; + }, + mark: function (dialog, storage, player) { + dialog.addText("记录目标"); + dialog.addSmall([storage]); + var vcard = player.getStorage("juanhui3"); + if (vcard.length) { + dialog.addText("记录卡牌"); + dialog.addSmall([vcard, "vcard"]); + } + }, + content: function (storage, player) { + var str = "记录目标:" + get.translation(storage); + var vcard = player.getStorage("juanhui3"); + if (vcard.length) { + str += "
    记录卡牌:"; + for (var i of vcard) { + if (i[2] == "sha" && i[3]) str += get.translation(i[3]); + str += get.translation(i[2]); + str += "、"; + } + str = str.slice(0, str.length - 1); + } + return str; + }, + }, + onremove: function (player) { + delete player.storage.juanhui2; + delete player.storage.juanhui3; + }, + group: "juanhui3", + enable: "phaseUse", + filter: function (event, player) { + return player.getStorage("juanhui3").length > 0 && player.countCards("hs") > 0; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("绢绘", [player.getStorage("juanhui3"), "vcard"], "hidden"); + }, + filter: function (button, player) { + return lib.filter.cardEnabled( + { + name: button.link[2], + nature: button.link[3], + }, + player, + _status.event.getParent() + ); + }, + check: function (button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], + }; + if (player.getUseValue(card) > 0) return get.order(card); + return -1; + }, + backup: function (links, player) { + return { + audio: "juanhui", + popname: true, + filterCard: true, + position: "hs", + viewAs: { + name: links[0][2], + nature: links[0][3], + }, + check: function (card) { + return 6 - get.value(card); + }, + precontent: function () { + var card = event.result.card; + if (card.name == "sha") event.getParent().addCount = false; + var vcard = player.storage.juanhui3; + for (var i = 0; i < vcard.length; i++) { + if (vcard[i][2] == card.name) vcard.splice(i--, 1); + } + if (vcard.length) player.markSkill("juanhui2"); + else { + player.unmarkSkill("juanhui2"); + event.getParent().juanhui = true; + } + }, + }; + }, + prompt: function (links, player) { + return "将一张手牌当做" + (links[0][2] == "sha" && links[0][3] ? get.translation(links[0][3]) : "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: function (item, player) { + var muniu = player.getStorage("juanhui3"); + var order = 0; + for (var i = 0; i < muniu.length; i++) { + var card = { name: muniu[i][2], nature: muniu[i][3] }; + if (player.getUseValue(card) > 0) { + var order2 = get.order(card); + if (order2 > order) order = order2; + } + } + return order + 0.1; + }, + result: { + player: 1, + }, + }, + }, + juanhui3: { + charlotte: true, + firstDo: true, + trigger: { + global: "useCard2", + player: ["phaseUseEnd", "phaseUseSkipped", "useCardAfter"], + }, + silent: true, + filter: function (event, player, name) { + if (event.name == "phaseUse") return true; + else if (name == "useCardAfter") return event.getParent().juanhui; + return ( + event.player == player.storage.juanhui2 && + event.player.isPhaseUsing() && + ["basic", "trick"].includes(get.type(event.card)) && + player.getStorage("juanhui3").filter(function (vcard) { + return vcard[2] == event.card.name; + }).length == 0 + ); + }, + content: function () { + if (trigger.name == "phaseUse") player.removeSkill("juanhui2"); + else if (event.triggername == "useCardAfter") { + player.recover(); + player.drawTo(3); + } else { + var vcard = [get.type(trigger.card), "", trigger.card.name]; + if (game.hasNature(trigger.card)) vcard.push(get.nature(trigger.card)); + player.storage.juanhui3.push(vcard); + player.markSkill("juanhui2"); + } + }, + }, + mubing: { + audio: 2, + audioname: ["sp_key_yuri"], + trigger: { player: "phaseUseBegin" }, + //direct:true, + frequent: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + var num = player.storage.mubing2 ? 4 : 3; + event.num = num; + event.cards = game.cardsGotoOrdering(get.cards(num)).cards; + game.log(player, "展示了", event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str = get.translation(player) + "发动了【募兵】"; + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + game.addVideo("showCards", player, [get.translation(player) + "发动了【募兵】", get.cardsInfo(event.cards)]); + game.delay(2); + "step 1"; + var numa = 0; + cards.sort(function (a, b) { + return a.number - b.number; + }); + for (var i of cards) { + if (get.value(i, player) > 0) numa += get.number(i); + } + player + .chooseToDiscard([1, Infinity], "h") + .set("ai", function (card) { + var player = _status.event.player; + var numa = _status.event.numa; + //if(card.name!='tengjia'&&get.position(card)=='e'&&get.equipValue(card,player)<=0) return 14; + var num = 0; + for (var i of ui.selected.cards) { + num += i.number; + } + if (num >= numa) return 0; + if (card.number + num >= numa) return 15 - get.value(card); + if (!ui.selected.cards.length) { + var min = _status.event.min; + if ( + card.number < min && + !player.countCards("h", function (xcard) { + return xcard != card && card.number + xcard.number > min; + }) + ) + return 0; + return card.number; + } + return Math.max(5 - get.value(card), card.number); + }) + .set("prompt", false) + .set("numa", numa) + .set("min", cards[0].number); + var func = function (id) { + var dialog = get.idDialog(id); + if (dialog) dialog.content.firstChild.innerHTML = "请选择要弃置的牌"; + }; + if (player == game.me) func(event.videoId); + else if (player.isOnline()) player.send(func, event.videoId); + "step 2"; + if (!result.bool) { + return; + } + var numx = 0; + for (var i of result.cards) { + numx += get.number(i); + } + event.numx = numx; + var next = player.chooseButton([0, num]); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + var num = 0; + for (var i = 0; i < ui.selected.buttons.length; i++) { + num += get.number(ui.selected.buttons[i].link); + } + return num + get.number(button.link) <= _status.event.maxNum; + }); + next.set("maxNum", event.numx); + next.set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + var func = function (id) { + var dialog = get.idDialog(id); + if (dialog) dialog.content.firstChild.innerHTML = "请选择要获得的牌"; + }; + if (player == game.me) func(event.videoId); + else if (player.isOnline()) player.send(func, event.videoId); + "step 3"; + if (!result.bool) event.cards = []; + else event.cards = result.links; + "step 4"; + game.broadcastAll("closeDialog", event.videoId); + game.addVideo("cardDialog", null, event.videoId); + if (!cards.length) { + event.finish(); + return; + } + player.gain(cards, "log", "gain2"); + if (!player.storage.mubing2) { + event.finish(); + return; + } + event.given = []; + "step 5"; + var hs = player.getCards("h"); + cards = cards.filter(function (card) { + return hs.includes(card); + }); + if ( + cards.length && + game.hasPlayer(function (current) { + return current != player && !event.given.includes(current); + }) + ) + player.chooseCardTarget({ + prompt: "是否将得到的牌中的任意张交给其他角色?", + selectCard: [1, cards.length], + filterCard: function (card) { + return _status.event.cards.includes(card); + }, + filterTarget: function (card, player, target) { + return target != player && !_status.event.given.includes(target); + }, + cards: cards, + given: event.given, + ai1: function (card) { + return -1; + }, + }); + else event.finish(); + "step 6"; + if (result.bool) { + var target = result.targets[0]; + var cards = result.cards; + event.given.push(target); + event.cards.removeArray(cards); + player.line(target, "green"); + player.give(cards, target); + event.goto(5); + } + }, + }, + ziqu: { + audio: 2, + audioname: ["sp_key_yuri"], + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return event.player != player && !player.getStorage("ziqu").includes(event.player) && event.player.countCards("he") > 0; + }, + check: function (event, player) { + var target = event.player; + var eff = get.damageEffect(target, player, player); + if (get.attitude(player, target) > 0) { + if (eff >= 0) return false; + return true; + } + if (eff <= 0) return true; + if (target.hp == 1) return false; + if (event.num > 1) return false; + var cards = target.getCards("he"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) > 10) return true; + } + return false; + }, + logTarget: "player", + content: function () { + "step 0"; + trigger.cancel(); + if (!player.storage.ziqu) player.storage.ziqu = []; + player.storage.ziqu.push(trigger.player); + player.markSkill("ziqu"); + trigger.player.chooseCard(true, "he", function (card, player) { + return !player.countCards("he", function (cardx) { + return cardx.number > card.number; + }); + }); + "step 1"; + if (result.bool && result.cards && result.cards.length) trigger.player.give(result.cards, player); + }, + intro: { content: "已对$发动过" }, + }, + mubing_rewrite: { + mark: true, + intro: { + content: "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。", + }, + ai: { + combo: "mubing", + }, + }, + diaoling: { + audio: 2, + audioname: ["sp_key_yuri"], + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "metal", + filter: function (event, player) { + var num = 0; + player.getAllHistory("gain", function (evt) { + var evt2 = evt.getParent(); + if (evt2.name == "mubing" && evt2.player == player) + num += evt.cards.filter(function (card) { + return card.name == "sha" || get.subtype(card, false) == "equip1" || (get.type2(card, false) == "trick" && get.tag({ name: card.name }, "damage")); + }).length; + }); + return num >= 6; + }, + content: function () { + player.awakenSkill("diaoling"); + player.storage.mubing2 = true; + player.markSkill("mubing_rewrite"); + player.chooseDrawRecover(2, true); + }, + ai: { + combo: "mubing", + }, + derivation: "mubing_rewrite", + }, + refenyin_wufan: { audio: 2 }, + //官渡之战 + xiying: { + trigger: { player: "phaseUseBegin" }, + audio: 2, + direct: true, + filter: function (event, player) { + return ( + player.countCards("h", function (card) { + return _status.connectMode || get.type(card) != "basic"; + }) > 0 + ); + }, + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current != player; + }); + list.sortBySeat(); + event.targets = list; + player + .chooseToDiscard(get.prompt2("xiying"), "h", function (card) { + return get.type(card) != "basic"; + }) + .set("logSkill", ["xiying", list]) + .set("ai", function (card) { + return _status.event.val - get.value(card); + }) + .set( + "val", + (function () { + return ( + 4 * + Math.sqrt( + game.countPlayer(function (current) { + return get.attitude(player, current) < 0 && current.countCards("he") > 0; + }) + ) + ); + })() + ); + "step 1"; + if (!result.bool) event.finish(); + else player.addTempSkill("xiying_gain"); + "step 2"; + var target = targets.shift(); + event.target = target; + if (target.isIn()) + target.chooseToDiscard("he", "弃置一张牌,或本回合内不能使用或打出牌").set("ai", function (card) { + var player = _status.event.player; + var source = _status.event.getTrigger().player; + if (get.attitude(source, player) > 0) return -1; + if (_status.event.getRand() > 0.5) return 5 - get.value(card); + return -1; + }); + "step 3"; + if (target.isIn() && !result.bool) target.addTempSkill("xiying2"); + if (targets.length) event.goto(2); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg.target.hasSkill("xiying2"); + }, + }, + subSkill: { + gain: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + player.getHistory("sourceDamage", function (evt) { + return evt.isPhaseUsing(player); + }).length > 0 + ); + }, + content: function () { + var card = get.cardPile2(function (card) { + var type = get.type(card, false); + if (type != "basic" && type != "trick") return false; + return get.tag(card, "damage") > 0; + }); + if (card) player.gain(card, "gain2"); + }, + }, + }, + }, + xiying2: { + mark: true, + intro: { content: "本回合内不能使用或打出牌" }, + mod: { + cardEnabled2: function (card) { + return false; + }, + }, + }, + gangzhi: { + audio: 2, + trigger: { + player: "damageBefore", + source: "damageBefore", + }, + forced: true, + filter: function (event, player) { + if (event.source == event.player) return false; + if (event.player == player) { + return event.source && event.source.isIn(); + } + return true; + }, + content: function () { + trigger.cancel(); + trigger.player.loseHp(trigger.num); + }, + ai: { + jueqing: true, + }, + }, + beizhan: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("beizhan")).set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var hs = target.countCards("h"); + var ht = target.maxHp; + if (hs >= ht && target.isMaxHandcard()) return -att * hs; + if ( + hs < ht && + game.hasPlayer(function (current) { + return current.countCards("h") > ht; + }) + ) + return att * 2 * (ht - hs); + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("beizhan", target); + target.drawTo(Math.min(5, target.maxHp)); + target.addSkill("beizhan2"); + } + }, + ai: { + expose: 0.25, + }, + }, + beizhan2: { + trigger: { player: "phaseBegin" }, + silent: true, + firstDo: true, + content: function () { + player.removeSkill("beizhan2"); + if (player.isMaxHandcard()) player.addTempSkill("zishou2"); + }, + mark: true, + intro: { content: "回合开始时,若手牌数为全场最多,则回合内不能使用牌指定其他角色为目标" }, + }, + fenglve: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + direct: true, + content: function () { + "step 0"; + var goon = player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return card.number >= 12; + } + if (val <= 6) { + return card.number >= 13; + } + return false; + }); + player + .chooseTarget(get.prompt2("fenglve"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + return (-get.attitude(player, target) * (1 + target.countCards("e"))) / (1 + target.countCards("j")); + }) + .set("goon", goon); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("fenglve", target); + player.chooseToCompare(target); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + var num = 0; + if (target.countCards("h")) num++; + if (target.countCards("e")) num++; + if (target.countCards("j")) num++; + if (num) { + event.gainner = player; + event.giver = target; + target + .choosePlayerCard(target, num, "hej", true) + .set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.position(button.link) == get.position(ui.selected.buttons[i].link)) return false; + } + return true; + }) + .set("prompt", "选择交给" + get.translation(event.gainner) + "的牌"); + } else event.finish(); + } else { + if (player.countCards("he")) { + event.gainner = target; + event.giver = player; + player.choosePlayerCard(player, true, "he").set("prompt", "选择交给" + get.translation(event.gainner) + "的牌"); + } else event.finish(); + } + "step 3"; + event.giver.give(result.links, event.gainner); + }, + group: "fenglve2", + ai: { + expose: 0.25, + }, + }, + fenglve2: { + trigger: { + player: "chooseToCompareAfter", + target: "chooseToCompareAfter", + }, + check: function (event, player) { + var card, target; + if (player == event.player) { + card = event.card1; + target = event.target; + } else { + card = event.card2; + target = event.player; + } + return get.attitude(player, target) * get.value(card, target, "raw") > 0; + }, + filter: function (event, player) { + if (event.targets) return false; + var card, target; + if (player == event.player) { + card = event.card1; + target = event.target; + } else { + card = event.card2; + target = event.player; + } + return get.position(card, true) == "o"; + }, + prompt: function (event, player) { + var card, target; + if (player == event.player) { + card = event.card1; + target = event.target; + } else { + card = event.card2; + target = event.player; + } + return "是否发动【锋略】,令" + get.translation(target) + "获得" + get.translation(card) + "?"; + }, + logTarget: function (event, player) { + var target; + if (player == event.player) { + target = event.target; + } else { + target = event.player; + } + return target; + }, + content: function () { + var card, target; + if (player == trigger.player) { + card = trigger.card1; + target = trigger.target; + } else { + card = trigger.card2; + target = trigger.player; + } + target.gain(card, "gain2", "log"); + }, + }, + mouzhi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + filterTarget: function (card, player, target) { + if (target.storage.mouzhi2 && target.storage.mouzhi2.includes(player)) return false; + return target != player; + }, + delay: 0, + lose: false, + discard: false, + check: function (card) { + if (card.name == "du") return 20; + var player = _status.event.player; + var useval = player.getUseValue(card); + var maxval = 0; + game.countPlayer(function (current) { + if (current != player && !current.hasSkillTag("nogain") && get.attitude(player, current) > 0) { + var temp = current.getUseValue(card); + if (temp > maxval) maxval = temp; + } + }); + if (maxval > 0 && get.tag(card, "damage")) return 15; + if (maxval > useval) return 10; + if (player.needsToDiscard()) return 1 / Math.max(0.1, get.value(card)); + return -1; + }, + content: function () { + player.give(cards, target); + target.addTempSkill("mouzhi2", { player: "phaseEnd" }); + target.storage.mouzhi2.add(player); + target.storage.mouzhi2.sortBySeat(target); + target.markSkill("mouzhi2"); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + if (ui.selected.cards.length) { + var card = ui.selected.cards[0]; + if (card.name == "du") return target.hasSkill("lucia_duqu") ? 1 : -1; + var t = target.getUseValue(card); + var p = player.getUseValue(card); + if (t > p) return 2; + if (t > 0) return 1.5; + if (player.needsToDiscard()) return 1; + return 0; + } + return 0; + }, + }, + }, + }, + mouzhi2: { + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + onremove: true, + trigger: { source: "damageSource" }, + forced: true, + intro: { + content: "出牌阶段内第一次对一名其他角色造成伤害时,$摸一张牌", + }, + filter: function (event, player) { + var evt2 = event.getParent("phaseUse"); + if (!evt2 || evt2.player != player) return false; + var history = event.player.getHistory("damage", function (evt) { + return evt.source == player && evt.getParent("phaseUse") == evt2; + }); + return history[0] == event; + }, + content: function () { + "step 0"; + game.asyncDraw(player.storage.mouzhi2); + "step 1"; + game.delay(); + }, + }, + yuanlve: { + enable: "phaseUse", + usable: 1, + audio: 2, + filter: function (event, player) { + return player.countCards("h", function (card) { + return get.type(card) != "equip"; + }); + }, + filterCard: function (card) { + return get.type(card) != "equip"; + }, + filterTarget: lib.filter.notMe, + delay: false, + discard: false, + lose: false, + check: function (card) { + if (card.name == "du") return 20; + var player = _status.event.player; + var useval = player.getUseValue(card); + var maxval = 0; + game.countPlayer(function (current) { + if (current != player && !current.hasSkillTag("nogain") && get.attitude(player, current) > 0) { + var temp = current.getUseValue(card); + if (temp > maxval) maxval = temp; + } + }); + if (maxval > useval) return 15; + if (maxval > 0) return 10; + if (player.needsToDiscard()) return 1 / Math.max(0.1, get.value(card)); + return -1; + }, + content: function () { + "step 0"; + player.give(cards, target); + "step 1"; + target.chooseUseTarget(cards[0]); + "step 2"; + if (result.bool) player.draw(); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + if (ui.selected.cards.length) { + var card = ui.selected.cards[0]; + if (card.name == "du") return target.hasSkill("lucia_duqu") ? 1 : -1; + var t = target.getUseValue(card); + var p = player.getUseValue(card); + if (t > p) return 2; + if (t > 0) return 1.5; + if (player.needsToDiscard()) return 1; + return 0; + } + return 0; + }, + }, + }, + }, + //吕旷吕翔和淳于琼和官渡哔哔机 + spshicai: { + audio: 2, + enable: "phaseUse", + position: "he", + filter: function (event, player) { + return !player.storage.spshicai2 || !player.getCards("h").includes(player.storage.spshicai2); + }, + filterCard: true, + 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)); + }, + content: function () { + var card = get.cards()[0]; + player.storage.spshicai2 = card; + player.gain(card, "draw"); + game.log(player, "获得了牌堆顶的一张牌"); + }, + group: "spshicai_mark", + ai: { + order: 1, + result: { player: 1 }, + }, + }, + spshicai_mark: { + trigger: { player: "phaseUseBegin" }, + silent: true, + firstDo: true, + content: function () { + player.addTempSkill("spshicai2", "phaseUseEnd"); + }, + }, + spshicai2: { + onremove: true, + mark: true, + intro: { + mark: function (dialog, content, player) { + if (player != game.me) return get.translation(player) + "观看牌堆中..."; + if (get.itemtype(_status.pileTop) != "card") return "牌堆顶无牌"; + dialog.add([_status.pileTop]); + }, + }, + }, + spfushi: { + group: ["zezhu", "chenggong"], + derivation: ["zezhu", "chenggong"], + locked: true, + }, + zezhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var enemy = 0; + var friend = 0; + var zhu = 0; + for (var i of game.players) { + if (i.isEnemyOf(player)) enemy++; + else friend++; + if (i != player && i.isZhu) zhu++; + } + return zhu > 0 && enemy < friend; + }, + filterTarget: function (card, player, target) { + return target != player && target.isZhu; + }, + selectTarget: -1, + multiline: true, + multitarget: true, + content: function () { + "step 0"; + event.targets.sortBySeat(); + event.targets2 = event.targets.slice(0); + "step 1"; + var target = event.targets2.shift(); + if (target.countGainableCards(player, "he") > 0) player.gainPlayerCard(target, "he", true); + else player.draw(); + if (event.targets2.length) event.redo(); + "step 2"; + if (player.countCards("he") >= targets.length) { + player.chooseCard("he", true, "依次选择" + get.cnNumber(targets.length) + "张牌,分别交给" + get.translation(targets), targets.length).set("ai", function (card) { + var target = _status.event.getParent().targets[ui.selected.cards.length]; + var player = _status.event.player; + return get.attitude(player, target) * get.value(card, target); + }); + } else event.finish(); + "step 3"; + var list = []; + for (var i = 0; i < targets.length; i++) { + list.push([targets[i], result.cards[i]]); + } + game.loseAsync({ + gain_list: list, + giver: player, + player: player, + cards: result.cards, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + }, + ai: { + order: 6, + result: { player: 1 }, + }, + }, + chenggong: { + audio: 2, + trigger: { global: "useCardToPlayered" }, + filter: function (event, player) { + if (!(event.isFirstTarget && event.targets && event.targets.length > 1 && event.player.isIn())) return false; + var enemy = 0; + var friend = 0; + for (var i of game.players) { + if (i.isEnemyOf(player)) enemy++; + else friend++; + } + return enemy > friend; + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + logTarget: "player", + content: function () { + trigger.player.draw(); + }, + }, + cangchu: { + trigger: { + global: "phaseBefore", + player: ["damageEnd", "enterGame"], + }, + audio: 2, + forced: true, + filter: function (event, player) { + if (event.name != "damage") return event.name != "phase" || game.phaseNumber == 0; + return event.hasNature("fire") && player.countMark("cangchu") > 0; + }, + content: function () { + if (trigger.name != "damage") player.addMark("cangchu", 3); + else { + player.removeMark("cangchu", Math.min(trigger.num, player.countMark("cangchu"))); + if (!player.hasMark("cangchu")) event.trigger("cangchuAwaken"); + } + }, + marktext: "粮", + intro: { + name2: "粮", + content: "mark", + }, + ai: { + threaten: function (player, target) { + return 1 + target.countMark("cangchu") / 2; + }, + effect: { + target: function (card, player, target, current) { + if (target.hasMark("cangchu")) { + if (card.name == "sha") { + if (lib.skill.global.includes("huoshaowuchao") || game.hasNature(card, "fire") || player.hasSkill("zhuque_skill")) return 2; + } + if (get.tag(card, "fireDamage") && current < 0) return 2; + } + }, + }, + combo: "liangying", + }, + }, + sushou: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + frequent: true, + async content(event, trigger, player) { + await player.draw(1 + player.countMark("cangchu")); + const num = Math.min( + player.countCards("h"), + player.countCards("he"), + game.countPlayer(target => target != player && target.isFriendOf(player)) + ); + if (num) { + let list = []; + if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); + while (num - list.length > 0) { + const { + result: { bool, targets, cards }, + } = await player + .chooseCardTarget({ + prompt: "宿守:你可以交给友方角色各一张牌", + position: "he", + animate: false, + filterCard(card, player) { + return !get.event("list").some(list => list[1] == card); + }, + filterTarget(card, player, target) { + return target != player && target.isFriendOf(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"); + } + } + }, + }, + liangying: { + trigger: { + global: "phaseDrawBegin2", + player: "cangchuAwaken", + }, + forced: true, + audio: 1, + logTarget: function (event, player) { + if (event.name == "phaseDraw") return event.player; + return game.filterPlayer(function (current) { + return current.isEnemyOf(player); + }); + }, + filter: function (event, player) { + if (event.name == "cangchu") return true; + return player.hasMark("cangchu") && !event.numFixed && event.player.isFriendOf(player); + }, + content: function () { + "step 0"; + if (trigger.name == "cangchu") { + player.loseMaxHp(); + var list = game.filterPlayer(function (current) { + return current.isEnemyOf(player); + }); + if (list.length) { + game.asyncDraw(list, 2); + } + } else { + trigger.num++; + event.finish(); + } + "step 1"; + game.delay(); + }, + ai: { + combo: "cangchu", + }, + }, + liehou: { + enable: "phaseUse", + usable: 1, + audio: 2, + filterTarget: function (card, player, target) { + return player.inRange(target) && target.countCards("h"); + }, + content: function () { + "step 0"; + target.chooseCard("h", true, "交给" + get.translation(player) + "一张牌"); + "step 1"; + if (result.bool) { + target.give(result.cards, player); + } else event.finish(); + "step 2"; + if ( + player.countCards("h") && + game.hasPlayer(function (current) { + return current != target && player.inRange(current); + }) + ) { + player.chooseCardTarget({ + position: "h", + filterCard: true, + filterTarget: function (card, player, target) { + return target != _status.event.getParent().target && player.inRange(target); + }, + forced: true, + prompt: "将一张手牌交给一名攻击范围内的其他角色", + ai1: function (card) { + var player = _status.event.player; + if (get.name(card) == "du") return 20; + if ( + game.hasPlayer(function (current) { + return current != _status.event.getParent().target && player.inRange(current) && get.attitude(player, current) > 0 && current.getUseValue(card) > player.getUseValue(card) && current.getUseValue(card) > player.getUseValue(card); + }) + ) + return 12; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) { + if (card.name == "wuxie") return 11; + if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; + } + return 6 / Math.max(1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player; + var card = ui.selected.cards[0]; + var att = get.attitude(player, target); + if (card.name == "du") return -6 * att; + if (att > 0) { + if (get.position(card) == "h" && target.getUseValue(card) > player.getUseValue(card)) return 4 * att; + if (get.value(card, target) > get.value(card, player)) return 2 * att; + return 1.2 * att; + } + return (-att * Math.min(4, target.countCards("he"))) / 6; + }, + }); + } else event.finish(); + "step 3"; + if (result.bool) player.give(result.cards, result.targets[0]); + }, + ai: { + order: 6, + result: { + target: -1, + }, + }, + }, + qigong: { + trigger: { player: "shaMiss" }, + direct: true, + audio: 2, + filter: function (event, player) { + return ( + event.target.isIn() && + game.hasPlayer(function (current) { + return current != event.target && current.canUse("sha", event.target, false); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("qigong"), "令一名角色可再对" + get.translation(trigger.target) + "使用一张【杀】", function (card, player, target) { + var source = _status.event.getTrigger().target; + return target != source && target.canUse("sha", source, false); + }) + .set("ai", function (target) { + var player = _status.event.player, + card = { name: "sha" }, + source = _status.event.getTrigger().target; + if (target.hasSha()) { + var eff1 = get.effect(source, card, target, target); + if (eff1 > 0) return get.effect(source, card, target, player); + } + return target != player ? Math.random() * get.attitude(player, target) : 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qigong", target); + target.addTempSkill("qigong_ai", "chooseToUseEnd"); + target + .chooseToUse( + "是否再对" + get.translation(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) + .set("oncard", function () { + _status.event.directHit.addArray(game.players); + }); + } + }, + subSkill: { + ai: { + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg.card && arg.card.name == "sha"; + }, + }, + }, + }, + }, + //和沙摩柯一起上线的新服三将 + spjiedao: { + audio: 2, + trigger: { + source: "damageBegin1", + }, + filter: function (event, player) { + return player.isDamaged() && !player.getHistory("sourceDamage").length; + }, + logTarget: "player", + direct: true, + check: function (trigger, player) { + if (get.attitude(player, trigger.player) >= -1) return false; + return !trigger.player.hasSkillTag("filterDamage", null, { + player: player, + card: trigger.card, + }); + }, + content: function () { + "step 0"; + var num = player.getDamagedHp(); + var map = {}; + var list = []; + for (var i = 1; i <= num; i++) { + var cn = get.cnNumber(i, true); + map[cn] = i; + list.push(cn); + } + event.map = map; + player + .chooseControl(list, "cancel2", function () { + if (!lib.skill.spjiedao.check(_status.event.getTrigger(), player)) return "cancel2"; + return get.cnNumber(_status.event.goon, true); + }) + .set("prompt", get.prompt2("spjiedao", trigger.player)) + .set("goon", num); + "step 1"; + if (result.control == "cancel2") return; + player.logSkill("spjiedao", trigger.player); + var num = event.map[result.control] || 1; + trigger.num += num; + var next = game.createEvent("spjiedao_after", null, trigger.getParent()); + next.player = player; + next.target = trigger.player; + next.num = num; + next.setContent(function () { + if (target.isIn()) player.chooseToDiscard(num, true, "he"); + }); + }, + }, + biaozhao: { + audio: 2, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + trigger: { + player: "phaseJieshuBegin", + }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0 && !player.getExpansions("biaozhao").length; + }, + content: function () { + "step 0"; + player.chooseCard("he", get.prompt("biaozhao"), "将一张牌置于武将牌上作为“表”").ai = function (card) { + return 6 - get.value(card); + }; + "step 1"; + if (result.bool) { + player.logSkill("biaozhao"); + player.addToExpansion(result.cards, player, "give").gaintag.add("biaozhao"); + } + }, + ai: { + notemp: true, + }, + group: ["biaozhao2", "biaozhao3"], + }, + biaozhao2: { + trigger: { + global: ["loseAsyncAfter", "loseAfter", "cardsDiscardAfter"], + }, + forced: true, + audio: "biaozhao", + filter: function (event, player) { + if (event.name == "loseAsyncAfter" && event.type != "discard") return false; + if (event.name == "lose" && (event.getlx === false || event.position != ui.discardPile)) return false; + var cards = player.getExpansions("biaozhao"); + if (!cards.length) return false; + var suit = get.suit(cards[0]); + var num = get.number(cards[0]); + var cards = event.getd(); + for (var card of cards) { + if (get.suit(card) == suit && get.number(card) == num) return true; + } + return false; + }, + content: function () { + "step 0"; + var card = player.getExpansions("biaozhao")[0]; + if (trigger.getParent().name == "discard") { + trigger.player.gain(card, player, "give", "bySelf"); + } else { + player.loseToDiscardpile(card); + } + "step 1"; + player.loseHp(); + }, + }, + biaozhao3: { + trigger: { + player: "phaseZhunbeiBegin", + }, + forced: true, + charlotte: true, + audio: "biaozhao", + filter: function (event, player) { + return player.getExpansions("biaozhao").length > 0; + }, + content: function () { + "step 0"; + var card = player.getExpansions("biaozhao")[0]; + player.loseToDiscardpile(card); + "step 1"; + event.num = 0; + game.countPlayer(function (current) { + if (current.countCards("h") > event.num) event.num = current.countCards("h"); + }); + player.chooseTarget("是否令一名角色将手牌摸至" + event.num + "张并回复1点体力?").ai = function (target) { + var num = Math.min(event.num - target.countCards("h"), 5); + if (target.isDamaged()) num++; + return num * get.attitude(_status.event.player, target); + }; + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + var draw = Math.min(num - target.countCards("h"), 5); + if (draw) target.draw(draw); + target.recover(); + } + }, + }, + yechou: { + audio: 2, + trigger: { + player: "die", + }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yechou"), function (card, player, target) { + return player != target && target.getDamagedHp() > 1; + }) + .set("forceDie", true) + .set("ai", function (target) { + let att = get.attitude(_status.event.player, target); + if (att > 0) return 0; + att = Math.sqrt(0.01 - att); + return att * (get.distance(_status.currentPhase, target, "absolute") || game.players.length); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("yechou", target); + player.line(target, "green"); + target.addTempSkill("yechou2", { player: "phaseZhunbeiBegin" }); + } + }, + ai: { + expose: 0.5, + maixie_defend: true, + }, + }, + yechou2: { + mark: true, + marktext: "仇", + intro: { + content: "每个回合结束时失去1点体力直到回合开始", + }, + trigger: { + global: "phaseAfter", + }, + forced: true, + content: function () { + player.loseHp(); + }, + }, + yanjiao: { + audio: 2, + ai: { + order: 10, + result: { + player: 1, + target: 1.1, + }, + }, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { + "step 0"; + var num = 4; + if (player.storage.xingshen) { + num += player.storage.xingshen; + player.storage.xingshen = 0; + player.unmarkSkill("xingshen"); + } + if (player.storage.olxingshen) { + num += player.storage.olxingshen; + player.storage.olxingshen = 0; + player.unmarkSkill("olxingshen"); + } + num = Math.min(10, num); + event.cards = get.cards(num); + game.cardsGotoOrdering(event.cards); + player.showCards(event.cards); + "step 1"; + event.getedResult = lib.skill.yanjiao.getResult(cards); + if (!event.getedResult.length) { + player.addTempSkill("yanjiao2"); + event.finish(); + } + "step 2"; + target.chooseControl("自动分配", "手动分配").set("prompt", "【严教】:是否让系统自动分配方案?").ai = function () { + return 0; + }; + "step 3"; + if (result.control == "手动分配") { + event.goto(8); + } + "step 4"; + event.index = 0; + event.togain = event.getedResult[event.index]; + target.showCards(event.togain[0], get.translation(target) + "分出的第一份牌"); + "step 5"; + target.showCards(event.togain[1], get.translation(target) + "分出的第二份牌"); + "step 6"; + target.chooseControl().set("choiceList", ["获得" + get.translation(event.togain[0]), "获得" + get.translation(event.togain[1])]).ai = function () { + return Math.random() < 0.5 ? 1 : 0; + }; + "step 7"; + var list = [ + [target, event.togain[result.index]], + [player, event.togain[1 - result.index]], + ]; + game.loseAsync({ + gain_list: list, + giver: target, + animate: "gain2", + }).setContent("gaincardMultiple"); + if (event.togain[2].length > 1) player.addTempSkill("yanjiao2"); + event.finish(); + "step 8"; + var next = target.chooseToMove("严教:分出点数相等的两组牌"); + next.set("chooseTime", (cards.length * 4).toString()); + next.set("list", [ + [ + "未分配", + cards, + function (list) { + var num = 0; + for (var i of list) num += i.number; + return "未分配(点数和" + num + ")"; + }, + ], + [ + "第一组", + [], + function (list) { + var num = 0; + for (var i of list) num += i.number; + return "第一组(点数和" + num + ")"; + }, + ], + [ + "第二组", + [], + function (list) { + var num = 0; + for (var i of list) num += i.number; + return "第二组(点数和" + num + ")"; + }, + ], + ]); + next.set("filterOk", function (moved) { + var num1 = 0; + for (var i of moved[1]) num1 += i.number; + if (num1 == 0) return false; + var num2 = 0; + for (var i of moved[2]) num2 += i.number; + return num1 == num2; + }); + next.set("processAI", () => false); + "step 9"; + if (result.bool) { + var moved = result.moved; + event.getedResult = [[moved[1], moved[2], moved[0]]]; + event.goto(4); + } else { + player.addTempSkill("yanjiao2"); + } + }, + getResult: function (cards) { + var cl = cards.length; + var maxmium = Math.pow(3, cl); + var filter = function (list) { + if (!list[1].length || !list[0].length) return false; + var num1 = 0; + for (var i = 0; i < list[1].length; i++) { + num1 += list[1][i].number; + } + var num2 = 0; + for (var j = 0; j < list[0].length; j++) { + num2 += list[0][j].number; + } + return num1 == num2; + }; + var results = []; + for (var i = 0; i < maxmium; i++) { + var result = [[], [], []]; + for (var j = 0; j < cl; j++) { + result[Math.floor((i % Math.pow(3, j + 1)) / Math.pow(3, j))].push(cards[j]); + } + if (filter(result)) results.push(result); + } + var filterSame = function (list1, list2) { + if (list1[1].length == list2[0].length && list1[0].length == list2[1].length) { + for (var i = 0; i < list1[0].length; i++) { + if (!list2[1].includes(list1[0][i])) return false; + } + for (var i = 0; i < list1[1].length; i++) { + if (!list2[0].includes(list1[1][i])) return false; + } + return true; + } + return false; + }; + for (var i = 0; i < results.length; i++) { + for (var j = i + 1; j < results.length; j++) { + if (filterSame(results[i], results[j])) results.splice(j--, 1); + } + } + results.sort(function (a, b) { + return a[2].length - b[2].length; + }); + return results.slice(0, 50); + }, + }, + yanjiao2: { + marktext: "教", + mark: true, + intro: { + content: "本回合手牌上限-1", + }, + mod: { + maxHandcard: function (player, num) { + return num - 1; + }, + }, + }, + xingshen: { + audio: 2, + intro: { + content: "下一次发动【严教】时多展示#张牌", + }, + trigger: { + player: "damageEnd", + }, + frequent: true, + content: function () { + player.draw(player.isMinHandcard() ? 2 : 1); + if (!player.storage.xingshen) player.storage.xingshen = 0; + player.storage.xingshen += player.isMinHp() ? 2 : 1; + if (player.storage.xingshen > 4) player.storage.xingshen = 4; + player.markSkill("xingshen"); + }, + }, + pingjian: { + initList: function () { + var list = []; + if (_status.connectMode) list = get.charactersOL(); + else { + var list = []; + for (var i in lib.character) { + if (!lib.filter.characterDisabled2(i) && !lib.filter.characterDisabled(i)) list.push(i); + } + } + game.countPlayer2(function (current) { + list.remove(current.name); + list.remove(current.name1); + list.remove(current.name2); + }); + _status.characterlist = list; + }, + init: function (player) { + player.addSkill("pingjian_check"); + if (!player.storage.pingjian_check) player.storage.pingjian_check = {}; + }, + audio: 2, + trigger: { player: ["damageEnd", "phaseJieshuBegin"] }, + frequent: true, + content: function () { + "step 0"; + if (!_status.characterlist) { + lib.skill.pingjian.initList(); + } + var allList = _status.characterlist.slice(0); + game.countPlayer(function (current) { + if (current.name && lib.character[current.name] && current.name.indexOf("gz_shibing") != 0 && current.name.indexOf("gz_jun_") != 0) allList.add(current.name); + if (current.name1 && lib.character[current.name1] && current.name1.indexOf("gz_shibing") != 0 && current.name1.indexOf("gz_jun_") != 0) allList.add(current.name1); + if (current.name2 && lib.character[current.name2] && current.name2.indexOf("gz_shibing") != 0 && current.name2.indexOf("gz_jun_") != 0) allList.add(current.name2); + }); + var list = []; + var skills = []; + var map = []; + allList.randomSort(); + var name2 = event.triggername; + for (var i = 0; i < allList.length; i++) { + var name = allList[i]; + if (name.indexOf("zuoci") != -1 || name.indexOf("xushao") != -1) continue; + var skills2 = lib.character[name][3]; + for (var j = 0; j < skills2.length; j++) { + if (player.getStorage("pingjian").includes(skills2[j])) continue; + if (skills.includes(skills2[j])) { + list.add(name); + if (!map[name]) map[name] = []; + map[name].push(skills2[j]); + skills.add(skills2[j]); + continue; + } + var list2 = [skills2[j]]; + game.expandSkills(list2); + for (var k = 0; k < list2.length; k++) { + var info = lib.skill[list2[k]]; + if (get.is.zhuanhuanji(list2[k], player)) continue; + if (!info || !info.trigger || !info.trigger.player || info.silent || info.limited || info.juexingji || info.hiddenSkill || info.dutySkill || (info.zhuSkill && !player.isZhu2())) continue; + if (info.trigger.player == name2 || (Array.isArray(info.trigger.player) && info.trigger.player.includes(name2))) { + if (info.ai && (info.ai.combo || info.ai.notemp || info.ai.neg)) continue; + if (info.init) continue; + if (info.filter) { + try { + var bool = info.filter(trigger, player, name2); + if (!bool) continue; + } catch (e) { + continue; + } + } + list.add(name); + if (!map[name]) map[name] = []; + map[name].push(skills2[j]); + skills.add(skills2[j]); + break; + } + } + } + if (list.length > 2) break; + } + if (skills.length) { + event.list = list; + player.chooseControl(skills).set("dialog", ["评鉴:请选择尝试发动的技能", [list, "character"]]); + } else event.finish(); + "step 1"; + player.markAuto("pingjian", [result.control]); + player.addTempSkill(result.control); + player.storage.pingjian_check[result.control] = trigger.name == "damage" ? trigger : "phaseJieshu"; + var name = event.list.find(name => lib.character[name][3].includes(result.control)); + // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); + if (name) game.broadcastAll((player, name) => player.tempname.add(name), player, name); + }, + group: "pingjian_use", + phaseUse_special: [], + ai: { threaten: 5 }, + }, + pingjian_use: { + audio: "pingjian", + enable: "phaseUse", + usable: 1, + prompt: () => lib.translate.pingjian_info, + content: function () { + "step 0"; + var list = []; + var skills = []; + var map = []; + var evt = event.getParent(2); + if (!_status.characterlist) { + lib.skill.pingjian.initList(); + } + var allList = _status.characterlist.slice(0); + game.countPlayer(function (current) { + if (current.name && lib.character[current.name] && current.name.indexOf("gz_shibing") != 0 && current.name.indexOf("gz_jun_") != 0) allList.add(current.name); + if (current.name1 && lib.character[current.name1] && current.name1.indexOf("gz_shibing") != 0 && current.name1.indexOf("gz_jun_") != 0) allList.add(current.name1); + if (current.name2 && lib.character[current.name2] && current.name2.indexOf("gz_shibing") != 0 && current.name2.indexOf("gz_jun_") != 0) allList.add(current.name2); + }); + allList.randomSort(); + for (var i = 0; i < allList.length; i++) { + var name = allList[i]; + if (name.indexOf("zuoci") != -1 || name.indexOf("xushao") != -1) continue; + var skills2 = lib.character[name][3]; + for (var j = 0; j < skills2.length; j++) { + if (player.getStorage("pingjian").includes(skills2[j])) continue; + if (get.is.locked(skills2[j], player)) continue; + var info = lib.translate[skills2[j] + "_info"]; + if (skills.includes(skills2[j]) || (info && info.indexOf("当你于出牌阶段") != -1 && info.indexOf("当你于出牌阶段外") == -1)) { + list.add(name); + if (!map[name]) map[name] = []; + map[name].push(skills2[j]); + skills.add(skills2[j]); + continue; + } + var list2 = [skills2[j]]; + game.expandSkills(list2); + for (var k = 0; k < list2.length; k++) { + var info = lib.skill[list2[k]]; + if (get.is.zhuanhuanji(list2[k], player)) continue; + if (!info || !info.enable || info.charlotte || info.limited || info.juexingji || info.hiddenSkill || info.dutySkill || (info.zhuSkill && !player.isZhu2())) continue; + if (info.enable == "phaseUse" || (Array.isArray(info.enable) && info.enable.includes("phaseUse")) || info.enable == "chooseToUse" || (Array.isArray(info.enable) && info.enable.includes("chooseToUse"))) { + if (info.ai && (info.ai.combo || info.ai.notemp || info.ai.neg)) continue; + if (info.init || info.onChooseToUse) continue; + if (info.filter) { + try { + var bool = info.filter(evt, player); + if (!bool) continue; + } catch (e) { + continue; + } + } else if (info.viewAs && typeof info.viewAs != "function") { + try { + if (evt.filterCard && !evt.filterCard(info.viewAs, player, evt)) continue; + if (info.viewAsFilter && info.viewAsFilter(player) == false) continue; + } catch (e) { + continue; + } + } + list.add(name); + if (!map[name]) map[name] = []; + map[name].push(skills2[j]); + skills.add(skills2[j]); + break; + } + } + } + if (list.length > 2) break; + } + if (skills.length) { + event.list = list; + player.chooseControl(skills).set("dialog", ["评鉴:请选择尝试发动的技能", [list, "character"]]); + } else event.finish(); + "step 1"; + player.markAuto("pingjian", [result.control]); + player.addTempSkill(result.control); + player.storage.pingjian_check[result.control] = "phaseUse"; + var name = event.list.find(name => lib.character[name][3].includes(result.control)); + // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); + if (name) game.broadcastAll((player, name) => player.tempname.add(name), player, name); + }, + ai: { order: 12, result: { player: 1 } }, + }, + pingjian_check: { + charlotte: true, + trigger: { player: ["useSkill", "logSkillBegin"] }, + filter: function (event, player) { + var info = get.info(event.skill); + if (info && info.charlotte) return false; + var skill = event.sourceSkill || event.skill; + return player.storage.pingjian_check[skill]; + }, + direct: true, + firstDo: true, + priority: Infinity, + content: function () { + var skill = trigger.sourceSkill || trigger.skill; + player.removeSkill(skill); + const names = player.tempname && player.tempname.filter(i => lib.character[i][3].includes(skill)); + if (names) game.broadcastAll((player, names) => player.tempname.removeArray(names), player, names); + delete player.storage.pingjian_check[skill]; + }, + group: "pingjian_check2", + }, + pingjian_check2: { + charlotte: true, + trigger: { player: ["phaseUseEnd", "damageEnd", "phaseJieshuBegin"] }, + filter: function (event, player) { + return Object.keys(player.storage.pingjian_check).find(function (skill) { + if (event.name != "damage") return player.storage.pingjian_check[skill] == event.name; + return player.storage.pingjian_check[skill] == event; + }); + }, + direct: true, + lastDo: true, + priority: -Infinity, + content: function () { + var skills = Object.keys(player.storage.pingjian_check).filter(function (skill) { + if (trigger.name != "damage") return player.storage.pingjian_check[skill] == trigger.name; + return player.storage.pingjian_check[skill] == trigger; + }); + player.removeSkill(skills); + const names = player.tempname && player.tempname.filter(i => skills.some(skill => lib.character[i][3].includes(skill))); + if (names) game.broadcastAll((player, names) => player.tempname.removeArray(names), player, names); + for (var skill of skills) delete player.storage.pingjian_check[skill]; + }, + }, + //上兵伐谋 + //伊籍在标包 不会移动 + songshu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("songshu_reflectionblue", null, null, false) && player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + return target != player && player.canCompare(target); + }, + content: function () { + "step 0"; + player.chooseToCompare(target).set("small", get.attitude(player, target) > 0); + "step 1"; + if (!result.bool) { + player.draw(2, "nodelay"); + target.draw(2); + player.addTempSkill("songshu_reflectionblue", "phaseUseAfter"); + } else { + target.addTempSkill("songshu_ai"); + } + }, + ai: { + basic: { + order: 1, + }, + expose: 0.2, + result: { + target: function (player, target) { + if (target.hasSkill("songshu_ai", null, null, false)) return 0; + var maxnum = 0; + var cards2 = target.getCards("h"); + for (var i = 0; i < cards2.length; i++) { + if (get.number(cards2[i]) > maxnum) { + maxnum = get.number(cards2[i]); + } + } + if (maxnum > 10) maxnum = 10; + if (maxnum < 5 && cards2.length > 1) maxnum = 5; + var cards = player.getCards("h"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) < maxnum) return 1; + } + return 0; + }, + }, + }, + }, + songshu_ai: { charlotte: true }, + songshu_reflectionblue: { charlotte: true }, + sibian: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + "step 0"; + trigger.changeToZero(); + event.cards = get.cards(4); + game.cardsGotoOrdering(event.cards); + player.showCards(event.cards); + "step 1"; + cards.sort(function (a, b) { + return b.number - a.number; + }); + var gains = []; + var mx = [cards[0].number, cards[3].number]; + for (var i = 0; i < cards.length; i++) { + if (mx.includes(cards[i].number)) gains.addArray(cards.splice(i--, 1)); + } + player.gain(gains, "gain2"); + if (cards.length > 0) + player + .chooseTarget("是否令一名手牌数最少的角色获得" + get.translation(cards), function (card, player, target) { + return target.isMinHandcard(); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + player.addExpose(0.2); + target.gain(cards, "gain2"); + } + }, + }, + lslixun: { + audio: 2, + forced: true, + trigger: { player: "damageBegin4" }, + marktext: "珠", + intro: { + name2: "珠", + content: "共有#个“珠”", + }, + content: function () { + trigger.cancel(); + player.addMark("lslixun", trigger.num); + }, + group: "lslixun_fate", + }, + lslixun_fate: { + audio: "lslixun", + trigger: { player: "phaseUseBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("lslixun") > 0; + }, + content: function () { + "step 0"; + event.forceDie = true; + _status.lslixun = player.countMark("lslixun"); + player.judge(function (card) { + if (get.number(card) < _status.lslixun) return -_status.lslixun; + return 1; + }).judge2 = function (result) { + return result.bool ? true : false; + }; + "step 1"; + delete _status.lslixun; + if (!result.bool) { + player.chooseToDiscard([1, player.countMark("lslixun")], "h").ai = lib.skill.qiangxi.check; + } else event.finish(); + "step 2"; + var num = player.countMark("lslixun"); + if (result.cards && result.cards.length) num -= result.cards.length; + if (num) player.loseHp(num); + }, + }, + lskuizhu: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: function (event, player) { + return player.isMaxHp(true) == false; + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("lskuizhu"), function (card, player, target) { + return target != player && target.isMaxHp(); + }).ai = function (target) { + var player = _status.event.player; + var ts = Math.min(5, target.countCards("h")); + var delta = ts - player.countCards("h"); + if (delta <= 0) return 0; + if (get.attitude(player, target) < 1) return false; + return target.countCards("he", function (card) { + return lib.skill.zhiheng.check(card) > 0; + }) > 1 + ? delta + : 0; + }; + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("lskuizhu", target); + player.drawTo(Math.min(5, target.countCards("h"))); + } else event.finish(); + "step 2"; + if (!player.countCards("h")) { + event.finish(); + return; + } + target.viewHandcards(player); + "step 3"; + if (!target.countCards("h")) { + event.finish(); + return; + } + target.chooseToDiscard(true, "h", [1, player.countCards("h")], "弃置至多" + get.cnNumber(player.countCards("h")) + "张手牌,并获得" + get.translation(player) + "等量的手牌").ai = function (card) { + if (ui.selected.cards.length > 1) return -1; + return lib.skill.zhiheng.check.apply(this, arguments); + }; + "step 4"; + if (result.bool && result.cards && result.cards.length && player.countGainableCards(target, "h") > 0) { + target.gainPlayerCard(player, "h", true, result.cards.length).visible = true; + } + "step 5"; + if (result.bool && result.cards && result.cards.length > 1) { + var bool = player.storage.lslixun > 0 !== true; + player + .chooseTarget(bool, "令" + get.translation(target) + "对其攻击范围内的一名角色造成1点伤害" + (bool ? "" : ",或点「取消」移去一个“珠”"), function (card, player, target) { + var source = _status.event.source; + return target != source && source.inRange(target); + }) + .set("source", target) + .set("ai", function (target) { + return get.damageEffect(target, _status.event.source, _status.event.player); + }); + } else event.finish(); + "step 6"; + if (result.bool && result.targets && result.targets.length) { + player.line(result.targets[0]); + result.targets[0].damage(target); + } else { + player.removeMark("lslixun", 1); + } + }, + ai: { + expose: 0.25, + }, + }, + xpchijie: { + audio: 2, + trigger: { + target: "useCardToAfter", + }, + filter: function (event, player) { + var evt = event.getParent(); + var targets = evt.targets.slice(evt.num + 1); + return event.player != player && targets.length > 0; + }, + usable: 1, + prompt2: function (event, player) { + var evt = event.getParent(); + var targets = evt.targets.slice(evt.num + 1); + return "令" + get.translation(event.card) + "对" + get.translation(targets) + "无效"; + }, + check: function (event, player) { + var evt = event.getParent(); + var targets = evt.targets.slice(evt.num + 1); + var num = 0; + for (var i = 0; i < targets.length; i++) { + num += get.effect(targets[i], evt.card, evt.player, player); + } + return num < -1; + }, + content: function () { + var evt = trigger.getParent(); + evt.excluded.addArray(evt.targets); + }, + group: "xpchijie2", + }, + xpchijie2: { + trigger: { global: "useCardAfter" }, + audio: "xpchijie", + filter: function (event, player) { + return ( + event.player != player && + event.targets.includes(player) && + event.cards.filterInD().length > 0 && + !game.hasPlayer2(function (current) { + return ( + current.getHistory("damage", function (evt) { + return evt.card == event.card; + }).length > 0 + ); + }) + ); + }, + usable: 1, + check: function (event, player) { + return get.value(event.cards.filterInD(), player, "raw") > 0; + }, + prompt2: function (event, player) { + return "获得" + get.translation(event.cards.filterInD()) + "。"; + }, + content: function () { + player.gain(trigger.cards.filterInD(), "log", "gain2"); + }, + }, + xpchijie4: {}, + yinju: { + audio: 2, + enable: "phaseUse", + limited: true, + filterTarget: lib.filter.notMe, + skillAnimation: true, + animationColor: "water", + content: function () { + player.awakenSkill("yinju"); + player.storage.yinju2 = target; + player.addTempSkill("yinju2"); + }, + ai: { + result: { + order: 10, + player: function (player, target) { + if ( + player.countCards("hs", function (card) { + return get.tag(card, "damage") && player.canUse(card, target); + }) >= 1 && + target.hp <= 2 + ) + return 0.1; + if ( + player.countCards("hes", function (card) { + return player.canUse(card, target); + }) <= 2 + ) + return -100; + return 1; + }, + target: function (player, target) { + return target.isDamaged() ? 5 : 3; + }, + }, + }, + }, + yinju2: { + trigger: { + player: "useCardToPlayered", + source: "damageBefore", + }, + forced: true, + onremove: true, + filter: function (event, player, name) { + if (name == "useCardToPlayered") return event.target == player.storage.yinju2; + return event.player == player.storage.yinju2; + }, + logTarget: function (event) { + return event[event.name == "damage" ? "player" : "target"]; + }, + content: function () { + "step 0"; + if (trigger.name == "damage") { + trigger.cancel(); + trigger.player.recover(trigger.num); + event.finish(); + } else { + game.asyncDraw([player, trigger.target]); + } + "step 1"; + game.delayx(); + }, + ai: { + effect: { + player: function (card, player, target) { + if (target != player.storage.yinju2) return; + if (card.name == "lebu") return; + if (card.name !== "huogong" && get.tag(card, "damage") && target.isDamaged()) [1, 0.6, 0, 2.4]; + return [1, 0.6, 1, 0.6]; + }, + }, + }, + }, + rewenji: { + audio: "spwenji", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he"); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("rewenji"), function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return Math.sqrt(att) / 10; + return 5 - att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("rewenji", target); + target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.addTempSkill("rewenji_respond"); + player.storage.rewenji_respond = get.type2(result.cards[0], target); + event.target.give(result.cards, player, true); + } + }, + subSkill: { + respond: { + onremove: true, + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + audio: "spwenji", + filter: function (event, player) { + return get.type2(event.card) == player.storage.rewenji_respond; + }, + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player; + }) + ); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return get.type2(arg.card) == player.storage.rewenji_respond; + }, + }, + }, + }, + }, + spwenji: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he"); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("spwenji"), function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return Math.sqrt(att) / 10; + return 5 - att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("spwenji", target); + target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.addTempSkill("spwenji_respond"); + player.storage.spwenji_respond = result.cards[0].name; + event.target.give(result.cards, player, true); + } + }, + subSkill: { + respond: { + onremove: true, + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + audio: "spwenji", + filter: function (event, player) { + return event.card.name == player.storage.spwenji_respond; + }, + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player; + }) + ); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg.card.name == player.storage.spwenji_respond; + }, + }, + }, + }, + }, + sptunjiang: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + //if(player.getHistory('skipped').includes('phaseUse')) return false; + return ( + player.getHistory("useCard", function (evt) { + if (evt.targets && evt.targets.length && evt.isPhaseUsing()) { + var targets = evt.targets.slice(0); + while (targets.includes(player)) targets.remove(player); + return targets.length > 0; + } + return false; + }).length == 0 + ); + }, + content: function () { + player.draw(game.countGroup()); + }, + }, + bingzhao: { + audio: 2, + unique: true, + zhuSkill: true, + forced: true, + locked: false, + intro: { + content: function (group) { + return "已选择了" + get.translation(group) + "势力"; + }, + }, + trigger: { global: ["phaseBefore", "zhuUpdate"] }, + filter: function (event, player) { + if ( + !lib.group.some(function (group) { + if (group == player.group) return false; + return ( + lib.group.includes(group) || + game.hasPlayer(function (current) { + return current.group == group; + }) + ); + }) + ) + return false; + return !player.storage.bingzhao && player.hasZhuSkill("bingzhao") && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + var list = lib.group.filter(function (group) { + if (group == player.group) return false; + return ( + lib.group.includes(group) || + game.hasPlayer(function (current) { + return current.group == group; + }) + ); + }); + player + .chooseControl(list) + .set("prompt", "秉诏:请选择一个其他势力") + .set("ai", function () { + var listx = list.slice(0); + listx.sort(function (a, b) { + return ( + game.countPlayer(function (current) { + return current != player && current.group == b; + }) - + game.countPlayer(function (current) { + return current != player && current.group == a; + }) + ); + }); + return listx[0]; + }); + "step 1"; + var group = result.control; + player.popup(get.translation(group) + "势力", get.groupnature(group, "raw")); + game.log(player, "选择了", "#y" + get.translation(group) + "势力"); + player.storage.bingzhao = group; + player.markSkill("bingzhao"); + }, + ai: { + combo: "guju", + }, + }, + baijia: { + audio: 2, + audioname: ["tw_beimihu"], + unique: true, + derivation: "bmcanshi", + juexingji: true, + ai: { + combo: "guju", + }, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.hasSkill("guju") && player.storage.guju >= 7; + }, + content: function () { + player.awakenSkill("baijia"); + player.gainMaxHp(); + player.recover(); + var list = game.filterPlayer(); + for (var i = 0; i < list.length; i++) { + if (list[i] != player && !list[i].hasMark("zongkui_mark")) { + list[i].addMark("zongkui_mark", 1); + player.line(list[i], "green"); + } + } + //player.removeSkill('guju'); + player.changeSkills(["bmcanshi"], ["guju"]); + }, + }, + bmcanshi: { + audio: 2, + audioname: ["tw_beimihu"], + group: ["bmcanshi_add", "bmcanshi_remove"], + ai: { + combo: "zongkui", + }, + subSkill: { + add: { + audio: "bmcanshi", + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (!event.targets || event.targets.length != 1) return false; + var info = get.info(event.card); + if (info.multitarget) return false; + if (info.allowMultiple == false) return false; + if (info.type == "equip") return false; + if (info.type == "delay") return false; + return game.hasPlayer(function (current) { + if (!current.hasMark("zongkui_mark")) return false; + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("bmcanshi"), [1, Infinity], function (card, player, target) { + if (!target.hasMark("zongkui_mark")) return false; + var trigger = _status.event.getTrigger(); + return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.getTrigger().card, player, player); + }); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets.sortBySeat(); + } else { + event.finish(); + } + "step 2"; + player.logSkill("bmcanshi", event.targets); + for (var i = 0; i < event.targets.length; i++) { + event.targets[i].removeMark("zongkui_mark", 1); + } + trigger.targets.addArray(event.targets); + }, + }, + remove: { + audio: "bmcanshi", + trigger: { + target: "useCardToTarget", + }, + check: function (event, player) { + return get.attitude(event.player, player) < 0 && get.effect(player, event.card, event.player, player) < 0; + }, + logTarget: "player", + filter: function (event, player) { + if (!["basic", "trick"].includes(get.type(event.card))) return false; + if (!event.targets || event.targets.length != 1) return false; + return event.player.hasMark("zongkui_mark"); + }, + content: function () { + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + game.delay(); + trigger.player.removeMark("zongkui_mark"); + }, + }, + }, + }, + guju: { + audio: 2, + audioname: ["tw_beimihu"], + init: function (player) { + if (!player.storage.guju) player.storage.guju = 0; + }, + intro: { + content: "已因此技能得到#张牌", + }, + trigger: { global: "damageEnd" }, + forced: true, + filter: function (event, player) { + return event.player != player && event.player.isIn() && event.player.hasMark("zongkui_mark"); + }, + content: function () { + "step 0"; + player.draw(); + player.storage.guju++; + player.markSkill("guju"); + "step 1"; + if (player.hasZhuSkill("bingzhao", trigger.player) && trigger.player.group == player.storage.bingzhao && trigger.player.isIn()) { + trigger.player.chooseBool("是否对" + get.translation(player) + "发动【秉诏】?").ai = function () { + return get.attitude(trigger.player, player) > 1; + }; + } else event.finish(); + "step 2"; + if (result.bool) { + trigger.player.logSkill("bingzhao", player); + player.draw(); + player.storage.guju++; + player.markSkill("guju"); + } + }, + ai: { + combo: "zongkui", + }, + }, + zongkui: { + trigger: { + player: "phaseBeforeEnd", + global: "roundStart", + }, + direct: true, + audio: 2, + audioname: ["tw_beimihu"], + filter: function (event, player, name) { + return game.hasPlayer(function (current) { + if (name == "roundStart" && !current.isMinHp()) return false; + return current != player && !current.hasMark("zongkui_mark"); + }); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(function (current) { + if (event.triggername == "roundStart" && !current.isMinHp()) return false; + return current != player && !current.hasMark("zongkui_mark"); + }); + if (event.triggername == "roundStart" && targets.length == 1) { + event._result = { bool: true, targets: targets }; + } else { + var next = player + .chooseTarget(get.prompt("zongkui"), "令一名" + (event.triggername == "roundStart" ? "体力值最小的" : "") + "其他角色获得“傀”标记", function (card, player, target) { + if (_status.event.round && !target.isMinHp()) return false; + return target != player && !target.hasMark("zongkui_mark"); + }) + .set("ai", function (target) { + var num = target.isMinHp() ? 0.5 : 1; + return num * get.threaten(target); + }) + .set("round", event.triggername == "roundStart"); + if (event.triggername == "roundStart") next.set("forced", true); + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zongkui", target); + target.addMark("zongkui_mark", 1); + game.delayx(); + } + }, + subSkill: { + mark: { + marktext: "傀", + intro: { + name2: "傀", + content: "mark", + }, + }, + }, + ai: { + combo: "guju", + threaten: 1.4, + }, + }, + xinfu_langxi: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.hp <= player.hp; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("xinfu_langxi"), "对一名体力值不大于你的其他角色造成0-2点随机伤害", function (card, player, target) { + return target.hp <= player.hp && target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool && result.targets && result.targets.length) { + player.logSkill("xinfu_langxi", result.targets); + var num = [1, 2, 0].randomGet(); + if (get.isLuckyStar(player)) num = 2; + player.line(result.targets[0], "green"); + result.targets[0].damage(num); + } + }, + ai: { + expose: 0.25, + threaten: 1.7, + }, + }, + xinfu_yisuan: { + usable: 1, + audio: 2, + trigger: { + player: "useCardEnd", + }, + check: function (event, player) { + return get.value(event.cards) + player.maxHp * 2 - 18 > 0; + }, + prompt2: function (event, player) { + return "你可以减1点体力上限,然后获得" + get.translation(event.cards.filterInD()) + "。"; + }, + filter: function (event, player) { + return player.isPhaseUsing() && get.type(event.card) == "trick" && event.cards.filterInD().length > 0; + }, + content: function () { + player.loseMaxHp(); + player.gain(trigger.cards.filterInD(), "gain2", "log"); + }, + }, + xinfu_xingluan: { + usable: 1, + audio: 2, + trigger: { + player: "useCardAfter", + }, + filter: function (event, player) { + if (!player.isPhaseUsing()) return false; + if (get.type(event.card) == undefined) return false; + return event.targets && event.targets.length == 1; + }, + content: function () { + var card = get.cardPile2(function (card) { + return card.number == 6; + }); + if (!card) { + player.chat("无牌可得了吗"); + game.log("但是牌堆里面已经没有点数为6的牌了!"); + event.finish(); + return; + } + player.gain(card, "gain2"); + }, + }, + xinfu_lveming: { + init: function (player) { + player.storage.xinfu_lveming = 0; + }, + mark: true, + intro: { + content: "已发动过#次", + }, + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("e") < player.countCards("e"); + }, + content: function () { + "step 0"; + var list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].map(i => get.strNumber(i)); + target + .chooseControl(list) + .set("ai", function () { + return get.rand(0, 12); + }) + .set("prompt", "请选择一个点数"); + "step 1"; + if (result.control) { + target.$damagepop(result.control, "thunder"); + var num = result.index + 1; + event.num = num; + } else { + target.$damagepop("K", "thunder"); + event.num = 13; + } + game.log(target, "选择的点数是", "#y" + get.strNumber(event.num)); + player.storage.xinfu_lveming++; + player.judge(function (card) { + if (card.number == _status.event.getParent("xinfu_lveming").num) return 4; + return 0; + }); + "step 2"; + if (result.bool == true) { + target.damage(2); + } else { + var card = target.getCards("hej").randomGet(); + player.gain(card, target, "giveAuto", "bySelf"); + } + }, + ai: { + order: 9, + result: { + target: function (player, target) { + var numj = target.countCards("j"); + var numhe = target.countCards("he"); + if (numhe == 0) return numj > 0 ? 6 : -6; + return -6 - (numj + 1) / numhe; + }, + }, + threaten: 1.1, + }, + }, + xinfu_tunjun: { + skillAnimation: true, + animationColor: "metal", + limited: true, + unique: true, + enable: "phaseUse", + audio: 2, + filter: function (event, player) { + if (player.storage.xinfu_tunjun) return false; + return player.storage.xinfu_lveming && player.storage.xinfu_lveming > 0; + }, + filterTarget: true, + selectTarget: 1, + content: function () { + "step 0"; + player.awakenSkill("xinfu_tunjun"); + event.num = player.storage.xinfu_lveming; + event.toequip = []; + "step 1"; + var equip = get.cardPile(function (card) { + var bool1 = true; + for (var i = 0; i < event.toequip.length; i++) { + if (get.type(card) == "equip" && get.subtype(card) == get.subtype(event.toequip[i])) bool1 = false; + } + return get.type(card) == "equip" && !event.toequip.includes(card) && target.hasEmptySlot(card) && bool1; + }); + if (equip) event.toequip.push(equip); + else event.num = 0; + event.num--; + "step 2"; + if (event.num > 0) event.goto(1); + "step 3"; + for (var i = 0; i < event.toequip.length; i++) { + target.chooseUseTarget(event.toequip[i], true).set("animate", false).set("nopopup", true); + } + }, + ai: { + combo: "xinfu_lveming", + order: function () { + var player = _status.event.player, + num = 0; + for (var i = 1; i < 6; i++) { + num += player.countEquipableSlot(i); + } + if (num <= 2) return 6; + if ( + player.hp <= 2 || + !game.hasPlayer(current => { + if (player == current || get.attitude(player, current) < 0 || current.hp <= 1) return false; + return current.hp > 2 || current.countCards("hs") > 2; + }) + ) + return 1; + return 0; + }, + result: { + target: function (player, target) { + var num = 0; + for (var i = 1; i < 6; i++) { + num += target.countEquipableSlot(i); + } + return num; + }, + }, + }, + mark: true, + intro: { + content: "limited", + }, + init: function (player) { + player.storage.xinfu_tunjun = false; + }, + }, + xinfu_tanbei: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target; + }, + content: function () { + "step 0"; + if (target.countCards("hej") == 0) { + event._result = { index: 1 }; + } else { + target + .chooseControl() + .set("choiceList", ["令" + get.translation(player) + "随机获得你区域内的一张牌,然后其本回合内不能再对你使用牌。", "令" + get.translation(player) + "本回合内对你使用牌没有次数与距离限制。"]) + .set("ai", function () { + var list = [0, 1]; + return list.randomGet(); + }); + } + "step 1"; + player.addTempSkill("tanbei_effect3"); + if (result.index == 0) { + var card = target.getCards("hej").randomGet(); + player.gain(card, target, "giveAuto", "bySelf"); + target.addTempSkill("tanbei_effect2"); + } else { + target.addTempSkill("tanbei_effect1"); + } + }, + ai: { + order: function () { + return [2, 4, 6, 8, 10].randomGet(); + }, + result: { + target: function (player, target) { + return -2 - target.countCards("h"); + }, + }, + threaten: 1.1, + }, + }, + tanbei_effect3: { + charlotte: true, + mod: { + targetInRange: function (card, player, target) { + if (target.hasSkill("tanbei_effect1")) { + return true; + } + }, + cardUsableTarget: function (card, player, target) { + if (target.hasSkill("tanbei_effect1")) return true; + }, + playerEnabled: function (card, player, target) { + if (target.hasSkill("tanbei_effect2")) return false; + }, + }, + }, + xinfu_sidao: { + audio: 2, + trigger: { + player: "useCardAfter", + }, + filter: function (event, player) { + if (player.hasSkill("xinfu_sidaoy") || !player.countCards("hs")) return false; + if (!event.targets || !event.targets.length || !event.isPhaseUsing(player)) return false; + var history = player.getHistory("useCard"); + var index = history.indexOf(event) - 1; + if (index < 0) return false; + var evt = history[index]; + if (!evt || !evt.targets || !evt.targets.length || !evt.isPhaseUsing(player)) return false; + for (var i = 0; i < event.targets.length; i++) { + if (evt.targets.includes(event.targets[i]) && lib.filter.filterTarget({ name: "shunshou" }, player, event.targets[i])) return true; + } + return false; + }, + direct: true, + content: function () { + var targets = player.getLastUsed(1).targets; + var next = player.chooseToUse(); + next.set( + "targets", + game.filterPlayer(function (current) { + return targets.includes(current) && trigger.targets.includes(current); + }) + ); + next.set("openskilldialog", get.prompt2("xinfu_sidao")); + next.set("norestore", true); + next.set("_backupevent", "xinfu_sidaox"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("xinfu_sidaox"); + }, + }, + xinfu_sidaox: { + audio: "xinfu_sidao", + filterCard: function (card) { + return get.itemtype(card) == "card"; + }, + position: "hs", + viewAs: { + name: "shunshou", + }, + filterTarget: function (card, player, target) { + return _status.event.targets && _status.event.targets.includes(target) && lib.filter.filterTarget.apply(this, arguments); + }, + prompt: "将一张手牌当顺手牵羊使用", + check: function (card) { + return 7 - get.value(card); + }, + onuse: function (links, player) { + player.addTempSkill("xinfu_sidaoy"); + }, + }, + xinfu_sidaoy: {}, + tanbei_effect1: { + charlotte: true, + }, + tanbei_effect2: { + charlotte: true, + }, + xinfu_tunan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { + "step 0"; + event.cards = get.cards(1); + player.showCards(get.translation(player) + "对" + get.translation(target) + "发动了【图南】", event.cards); + "step 1"; + var card = cards[0]; + var bool1 = game.hasPlayer(function (current) { + return target.canUse(card, current, false); + }); + var bool2 = game.hasPlayer(function (current) { + return target.canUse({ name: "sha" }, current); + }); + if (bool1 && bool2) { + target + .chooseControl(function () { + return 0; + }) + .set("choiceList", ["使用" + get.translation(cards) + "。(没有距离限制)", "将" + get.translation(cards) + "当做【杀】使用。"]) + .set("ai", function () { + return _status.event.choice; + }) + .set("choice", target.getUseValue(card, false) > target.getUseValue({ name: "sha", cards: cards }) ? 0 : 1); + } else if (bool1) { + event.directindex = 0; + } else if (bool2) { + event.directindex = 1; + } else { + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + event.finish(); + } + "step 2"; + var card = cards[0]; + if (result && typeof event.directindex != "number") { + event.directindex = result.index; + } + if (event.directindex == 1) { + target.chooseUseTarget({ name: "sha" }, cards, true, false).viewAs = false; + } else { + target.chooseUseTarget(card, true, false, "nodistance"); + } + }, + ai: { + order: 7, + result: { + target: 1, + }, + }, + }, + xinfu_bijing: { + audio: 2, + subSkill: { + lose: { + trigger: { + global: "phaseDiscardBegin", + }, + audio: "xinfu_bijing", + charlotte: true, + filter: function (event, player) { + if (event.player == player) return false; + return ( + player.getHistory("lose", function (evt) { + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("xinfu_bijing")) return true; + } + }).length > 0 && event.player.countCards("he") > 0 + ); + }, + forced: true, + logTarget: "player", + content: function () { + trigger.player.chooseToDiscard(2, true, "he"); + }, + sub: true, + }, + discard: { + trigger: { + player: "phaseZhunbeiBegin", + }, + forced: true, + charlotte: true, + filter: function (event, player) { + return player.hasCard(card => card.hasGaintag("xinfu_bijing") && player.canRecast(card), "h"); + }, + content: function () { + player.recast(player.getCards("h", card => card.hasGaintag("xinfu_bijing") && player.canRecast(card))); + }, + sub: true, + }, + }, + trigger: { + player: "phaseJieshuBegin", + }, + direct: true, + filter: function (player, event) { + return event.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseCard(get.prompt2("xinfu_bijing"), "h", [1, 2]).set("ai", function (card) { + if (card.name == "shan") return 6; + return 6 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("xinfu_bijing"); + player.addGaintag(result.cards, "xinfu_bijing"); + player.addSkill("xinfu_bijing_lose"); + player.addSkill("xinfu_bijing_discard"); + } + }, + }, + xinfu_zhenxing: { + audio: 2, + trigger: { + player: ["damageEnd", "phaseJieshuBegin"], + }, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("一张", "两张", "三张", "cancel2") + .set("prompt", get.prompt2("xinfu_zhenxing")) + .set("", function () { + return 0; + }); + "step 1"; + if (result.control == "cancel2") event.finish(); + else { + player.logSkill("xinfu_zhenxing"); + event.num = { 一张: 1, 两张: 2, 三张: 3 }[result.control]; + } + "step 2"; + event.cards = get.cards(num); + player + .chooseButton(["【镇行】:请选择要获得的牌", event.cards]) + .set("filterButton", function (button) { + var cards = _status.event.cards; + for (var i = 0; i < cards.length; i++) { + if (button.link != cards[i] && get.suit(cards[i]) == get.suit(button.link)) return false; + } + return true; + }) + .set("ai", function (button) { + return get.value(button.link); + }) + .set("cards", event.cards); + "step 3"; + var tothrow = []; + for (var i = event.cards.length - 1; i >= 0; i--) { + if (result.bool && result.links.includes(event.cards[i])) { + player.gain(event.cards[i], "gain2"); + } else { + event.cards[i].fix(); + ui.cardPile.insertBefore(event.cards[i], ui.cardPile.childNodes[0]); + } + } + game.updateRoundNumber(); + }, + }, + xinfu_qianxin: { + audio: 2, + group: ["xinfu_qianxin2"], + enable: "phaseUse", + usable: 1, + onChooseToUse: function (event) { + if (!game.online) { + var num1 = game.players.length - 1; + var player = event.player; + var num2 = ui.cardPile.childElementCount; + var num3 = num2; + if (num1 > num2) num3 = 0; + else if (player.storage.xinfu_qianxin) { + for (var i = 0; i < num2; i++) { + if (player.storage.xinfu_qianxin.includes(ui.cardPile.childNodes[i])) { + num3 = 0; + break; + } + } + } + event.set("qianxinNum", num3); + } + }, + filter: function (event, player) { + return event.qianxinNum && event.qianxinNum > 0; + }, + filterTarget: function (card, player, target) { + return target != player; + }, + filterCard: true, + selectCard: function () { + var num1 = game.players.length - 1; + var num2 = _status.event.qianxinNum; + return [1, Math.floor(num2 / num1)]; + }, + discard: false, + check: function () { + return -1; + }, + delay: false, + lose: false, + prompt: function () { + return "选择一名角色并将任意张手牌放置于牌堆中" + get.cnNumber(game.players.length) + "倍数的位置(先选择的牌在上)"; + }, + content: function () { + "step 0"; + player.$throw(cards.length); + player.storage.xinfu_qianxin = cards.slice(0); + player.storage.xinfu_qianxin2 = target; + //cards.reverse(); + player.lose(cards, ui.cardPile).insert_index = function (event, card) { + var num1 = game.players.length, + i = event.cards.indexOf(card); + var num3 = num1 * (i + 1) - 1; + return ui.cardPile.childNodes[num3]; + }; + "step 1"; + game.updateRoundNumber(); + game.log(player, "把", get.cnNumber(cards.length), "张牌放在了牌堆里"); + game.delayx(); + }, + ai: { + order: 1, + result: { + target: -1, + }, + }, + }, + xinfu_qianxin2: { + subSkill: { + dis: { + mod: { + maxHandcard: function (player, num) { + return num - 2; + }, + }, + sub: true, + }, + }, + forced: true, + locked: false, + audio: "xinfu_qianxin", + logTarget: "player", + trigger: { + global: "phaseDiscardBegin", + }, + filter: function (event, player) { + if (player.storage.xinfu_qianxin2 != event.player) return false; + if (!player.storage.xinfu_qianxin) return false; + var hs = event.player.getCards("h"); + var cs = player.storage.xinfu_qianxin; + var bool = false; + var history = event.player.getHistory("gain"); + for (var i = 0; i < history.length; i++) { + for (var j = 0; j < history[i].cards.length; j++) { + var card = history[i].cards[j]; + if (hs.includes(card) && cs.includes(card)) return true; + } + } + return false; + }, + content: function () { + "step 0"; + delete player.storage.xinfu_qianxin2; + if (player.countCards("h") >= 4) { + event._result = { index: 1 }; + } else { + trigger.player + .chooseControl() + .set("choiceList", ["令" + get.translation(player) + "将手牌摸至四张", "令自己本回合的手牌上限-2"]) + .set("ai", function () { + var player = _status.event.player; + var source = _status.event.getParent().player; + if (get.attitude(player, source) > 0) return 0; + if (player.hp - player.countCards("h") > 1) return 1; + return [0, 1].randomGet(); + }); + } + "step 1"; + if (result.index == 0) { + player.drawTo(4); + } else { + trigger.player.addTempSkill("xinfu_qianxin2_dis"); + } + }, + }, + xinfu_fuhai: { + subSkill: { + next: {}, + previous: {}, + }, + audio: 2, + group: ["fuhai_clear"], + intro: { + content: "已指定过#个目标", + }, + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("xinfu_fuhai_next") && player.hasSkill("xinfu_fuhai_previous")) return false; + return player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + if (![player.next, player.previous].includes(target) || target.countCards("h") == 0) return false; + if (player.hasSkill("xinfu_fuhai_next")) return target == player.previous; + if (player.hasSkill("xinfu_fuhai_previous")) return target == player.next; + return true; + }, + line: false, + content: function () { + "step 0"; + event.side = target == player.next ? "next" : "previous"; + event.current = target; + if (!player.storage.xinfu_fuhai) player.storage.xinfu_fuhai = 1; + player.addTempSkill("xinfu_fuhai_" + event.side, "phaseUseAfter"); + "step 1"; + if (player.countCards("h") == 0 || event.current.countCards("h") == 0 || event.current == player) { + event.finish(); + return; + } + var next = event.current[event.side]; + if (get.attitude(event.current, player) > 0) { + if (get.attitude(next, target) <= 0 || next.countCards("h") == 0 || player.countCards("h") == 1) { + event.stopm = true; + event.stopt = true; + } else { + event.stopm = false; + event.stopt = false; + } + } else { + if (get.attitude(next, target) >= 0) { + event.stopt = true; + event.stopm = false; + } else { + event.stopt = false; + event.stopm = false; + } + } + player.markSkill("xinfu_fuhai"); + player.line(event.current, "green"); + player + .chooseCard("请选择要展示的牌", true) + .set("ai", function (card) { + if (_status.event.stop) return 14 - get.number(card); + return get.number(card); + }) + .set("stop", event.stopm); + "step 2"; + event.mes = result.cards[0]; + player.showCards(event.mes); + "step 3"; + event.current + .chooseCard("请选择要展示的牌", true) + .set("ai", function (card) { + if (_status.event.stop) return get.number(card); + return 14 - get.number(card); + }) + .set("stop", event.stopt); + "step 4"; + event.tes = result.cards[0]; + event.current.showCards(event.tes); + "step 5"; + var num1 = get.number(event.mes); + var num2 = get.number(event.tes); + if (num1 < num2) { + event.current.discard(event.tes); + game.asyncDraw([player, event.current], player.storage.xinfu_fuhai); + player.addTempSkill("xinfu_fuhai_next", "phaseUseAfter"); + player.addTempSkill("xinfu_fuhai_previous", "phaseUseAfter"); + player.unmarkSkill("xinfu_fuhai"); + } else { + player.discard(event.mes); + player.storage.xinfu_fuhai++; + event.current = event.current[event.side]; + if (player.countCards("h") > 0 && event.current.countCards("h") > 0 && event.current != player) event.goto(1); + } + }, + ai: { + order: 1, + result: { + player: function (player, target) { + var hs = player.countCards("h"); + var side = target == player.next ? "next" : "previous"; + var current = player; + for (var i = 0; i < hs; i++) { + current = current[side]; + if (current == player || !current.countCards("h")) return 0; + if (get.attitude(current, player) > 0) return 1; + } + return 0; + }, + }, + }, + }, + fuhai_clear: { + trigger: { + player: "phaseAfter", + }, + forced: true, + silent: true, + popup: false, + filter: function (event, player) { + return player.storage.xinfu_fuhai != undefined; + }, + content: function () { + player.unmarkSkill("xinfu_fuhai"); + delete player.storage.xinfu_fuhai; + }, + }, + xz_xunxun: { + filter: function (event, player) { + var num = game.countPlayer(function (current) { + return current.isDamaged(); + }); + return num >= 1 && !player.hasSkill("xunxun"); + }, + audio: 2, + trigger: { + player: "phaseDrawBegin1", + }, + //priority:10, + content: function () { + "step 0"; + var cards = get.cards(4); + game.cardsGotoOrdering(cards); + var next = player.chooseToMove("恂恂:将两张牌置于牌堆顶", true); + next.set("list", [["牌堆顶", cards], ["牌堆底"]]); + next.set("filterMove", function (from, to, moved) { + if (to == 1 && moved[1].length >= 2) return false; + return true; + }); + next.set("filterOk", function (moved) { + return moved[1].length == 2; + }); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(b) - get.value(a); + }); + return [cards, cards.splice(2)]; + }); + "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]); + } + game.updateRoundNumber(); + game.delayx(); + }, + }, + xinfu_xingzhao: { + audio: true, + group: ["xz_xunxun", "xinfu_xingzhao2", "xinfu_xingzhao3"], + mark: true, + intro: { + content: function (storage, player) { + var num = game.countPlayer(function (current) { + return current.isDamaged(); + }); + var str = "暂无任何效果"; + if (num >= 1) { + str = "
  • 视为拥有技能“恂恂”"; + } + if (num >= 2) { + str += ";使用装备牌时摸一张牌"; + } + if (num >= 3) { + str += ";始终跳过弃牌阶段"; + } + if (num == 0 || num >= 4) { + str += ";造成的伤害+1"; + } + return str; + }, + }, + trigger: { + player: "useCard", + }, + forced: true, + filter: function (event, player) { + if (get.type(event.card) != "equip") return false; + var num = game.countPlayer(function (current) { + return current.isDamaged(); + }); + return num >= 2; + }, + content: function () { + player.draw(); + }, + }, + xinfu_xingzhao2: { + audio: true, + trigger: { + player: ["phaseJudgeBefore", "phaseDiscardBefore"], + }, + forced: true, + filter: function (event, player) { + var num = game.countPlayer(function (current) { + return current.isDamaged(); + }); + return num >= 3; + }, + content: function () { + trigger.cancel(); + game.log(player, "跳过了" + (trigger.name == "phaseJudge" ? "判定" : "弃牌") + "阶段"); + }, + }, + xinfu_xingzhao3: { + audio: "xinfu_xingzhao", + trigger: { + source: "damageBegin1", + }, + forced: true, + filter: function (event, player) { + var num = game.countPlayer(function (current) { + return current.isDamaged(); + }); + return num == 0 || num >= 4; + }, + content: function () { + trigger.num++; + }, + }, + xinfu_dianhu: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + player + .chooseTarget("选择【点虎】的目标", lib.translate.xinfu_dianhu_info, true, function (card, player, target) { + return target != player && !target.hasSkill("xinfu_dianhu2"); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att < 0) return -att + 3; + return Math.random(); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.log(target, "成为了", "【点虎】", "的目标"); + target.storage.xinfu_dianhu2 = player; + target.addTempSkill("xinfu_dianhu2", { player: "die" }); + } + }, + }, + xinfu_dianhu2: { + mark: "character", + intro: { + content: "当你受到来自$的伤害或回复体力后,$摸一张牌", + }, + nopop: true, + trigger: { + player: ["damageEnd", "recoverEnd"], + }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + if (player.storage.xinfu_dianhu2 && player.storage.xinfu_dianhu2.isIn()) { + if (event.name == "damage") return event.source == player.storage.xinfu_dianhu2; + return true; + } + }, + content: function () { + "step 0"; + var target = player.storage.xinfu_dianhu2; + target.logSkill("xinfu_dianhu"); + target.draw(); + }, + onremove: true, + }, + xinfu_jianji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { + "step 0"; + target.draw(); + "step 1"; + var card = result[0]; + if ( + card && + game.hasPlayer(function (current) { + return target.canUse(card, current); + }) && + get.owner(card) == target + ) { + target.chooseToUse({ + prompt: "是否使用" + get.translation(card) + "?", + filterCard: function (cardx, player, target) { + return cardx == _status.event.cardx; + }, + cardx: card, + }); + } + }, + ai: { + order: 7.5, + result: { + target: 1, + }, + }, + }, + xinfu_lianpian: { + audio: 2, + usable: 3, + trigger: { + player: "useCardToPlayered", + }, + frequent: true, + filter: function (event, player) { + if (!event.targets || !event.targets.length || event.getParent().triggeredTargets3.length > 1 || !event.isPhaseUsing(player)) return false; + var evt = player.getLastUsed(1); + if (!evt || !evt.targets || !evt.targets.length || !evt.isPhaseUsing(player)) return false; + for (var i = 0; i < event.targets.length; i++) { + if (evt.targets.includes(event.targets[i])) return true; + } + return false; + }, + content: function () { + "step 0"; + player.draw(); + "step 1"; + event.card = result[0]; + var ablers = player.getLastUsed(1).targets.slice(0); + for (var i = 0; i < ablers.length; i++) { + if (ablers[i] == player || !trigger.targets.includes(ablers[i])) ablers.splice(i--, 1); + } + if (event.card && get.owner(event.card) == player && ablers.length) { + player + .chooseTarget("是否将" + get.translation(event.card) + "交给其他角色?", function (card, player, target) { + return _status.event.ablers.includes(target) && target != player; + }) + .set("ablers", ablers).ai = function () { + return false; + }; + } else event.finish(); + "step 2"; + if (result.bool) { + player.give(event.card, result.targets[0], true); + } + }, + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (player.isPhaseUsing() && (!player.storage.counttrigger || !player.storage.counttrigger.xinfu_lianpian || !player.storage.counttrigger.xinfu_lianpian < 3)) { + var evt = player.getLastUsed(); + if ( + evt && + evt.targets && + evt.targets.length && + evt.isPhaseUsing(player) && + game.hasPlayer(function (current) { + return evt.targets.includes(current) && player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + return num + 10; + } + } + }, + }, + ai: { + effect: { + player: function (card, player, target) { + var evt = player.getLastUsed(); + if (evt && evt.targets.includes(target) && (!player.storage.counttrigger || !player.storage.counttrigger.xinfu_lianpian || !player.storage.counttrigger.xinfu_lianpian < 3) && player.isPhaseUsing(player)) return [1.5, 0]; + }, + }, + }, + }, + //糜芳傅士仁 + fengshi: { + audio: "mffengshi", + audioname: ["sp_mifangfushiren"], + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget) return false; + return event.targets.some(target => { + return ( + player.countCards("h") > target.countCards("h") && + target.countCards("he") > 0 && + player.hasCard(card => { + return lib.filter.cardDiscardable(card, player, "fengshi"); + }, "he") + ); + }); + }, + direct: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt("fengshi"), "弃置你与一名目标角色的各一张牌,然后令" + get.translation(event.card) + "对其造成的伤害+1", (card, player, target) => { + const targets = get.event().getTrigger().targets; + if (!targets.includes(target)) return false; + return ( + player.countCards("h") > target.countCards("h") && + target.countCards("he") > 0 && + player.hasCard(card => { + return lib.filter.cardDiscardable(card, player, "fengshi"); + }, "he") + ); + }) + .set("ai", target => { + const player = get.event("player"); + const card = get.event().getTrigger().card; + if (!get.info("dcmffengshi").check({ card: card, target: target })) return 0; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + if (bool) { + const target = targets[0]; + player.logSkill("fengshi", target); + await player.chooseToDiscard("he", true); + await player.discardPlayerCard(target, "he", true); + if (get.tag(trigger.card, "damage")) { + var id = target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; + map[id].extraDamage++; + } + } + }, + group: "fengshi_target", + subSkill: { + target: { + inherit: "dcmffengshi", + trigger: { target: "useCardToTargeted" }, + filter(event, player) { + if (event.player == event.target) return false; + return ( + event.player.countCards("h") > player.countCards("h") && + event.player.countCards("he") > 0 && + player.hasCard(card => { + return lib.filter.cardDiscardable(card, player, "fengshi"); + }, "he") + ); + }, + async content(event, trigger, player) { + const target = trigger.player; + await player.chooseToDiscard("he", true); + await player.discardPlayerCard(target, "he", true); + if (get.tag(trigger.card, "damage")) { + var id = player.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; + map[id].extraDamage++; + } + }, + }, + }, + }, + dcmffengshi: { + audio: "mffengshi", + audioname: ["sp_mifangfushiren"], + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + filter: function (event, player, name) { + if (event.player == event.target || event.targets.length != 1) return false; + return ( + event.player.countCards("h") > event.target.countCards("h") && + event.target.countCards("he") > 0 && + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "dcmffengshi"); + }, "he") + ); + }, + logTarget: function (event, player) { + return player == event.player ? event.target : event.player; + }, + prompt2: function (event, player) { + var target = lib.skill.dcmffengshi.logTarget(event, player); + return "弃置你与" + get.translation(target) + "的各一张牌,然后令" + get.translation(event.card) + "的伤害+1"; + }, + check: function (event, player) { + var viewer = player, + player = event.player, + target = event.target; + if (viewer == player) { + if (get.attitude(viewer, target) >= 0) return false; + if (player.countCards("he", card => get.value(card, player) < 5)) return true; + var card = get.event().getTrigger().card; + if ((get.tag(card, "damage") || target.countCards("he", card => get.value(card, target) > 6)) && player.countCards("he", card => get.value(card, player) < 7)) return true; + return false; + } else { + if (get.attitude(viewer, player) >= 0) return false; + if (!get.tag(card, "damage")) return false; + if (viewer.countCards("he") > player.countCards("he")) return true; + if (viewer.countCards("he", card => get.value(card, target) > 6)) return false; + return true; + } + }, + content: function () { + if (get.tag(trigger.card, "damage")) trigger.getParent().baseDamage++; + var target = lib.skill.dcmffengshi.logTarget(trigger, player); + player.chooseToDiscard("he", true); + player.discardPlayerCard(target, "he", true); + }, + }, + mffengshi: { + audio: 2, + audioname: ["sp_mifangfushiren"], + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + direct: true, + preHidden: true, + filter: function (event, player) { + if (event.player == event.target || event.targets.length != 1) return false; + if (player != event.player && !player.hasSkill("mffengshi")) return false; + return event.player.countCards("h") > event.target.countCards("h") && event.target.countCards("he") > 0; + }, + content: function () { + "step 0"; + event.source = trigger.player; + event.target = player == trigger.target ? trigger.player : trigger.target; + var str; + if (player == trigger.player) str = "弃置自己的和该角色"; + else str = "令其弃置其与你的"; + var next = trigger.player.chooseBool("是否对" + get.translation(trigger.target) + "发动【锋势】?", str + "的各一张牌,然后令" + get.translation(trigger.card) + "的伤害+1").set("ai", function () { + var player = _status.event.getParent().player; + var target = _status.event.getParent().target; + var viewer = _status.event.player; + if (viewer == player) { + if (get.attitude(viewer, target) >= 0) return false; + if (player.countCards("he", card => get.value(card, player) < 5)) return true; + var card = _status.event.getTrigger().card; + if ((get.tag(card, "damage") || target.countCards("he", card => get.value(card, target) > 6)) && player.countCards("he", card => get.value(card, player) < 7)) return true; + return false; + } else { + if (get.attitude(viewer, player) >= 0) return false; + if (!get.tag(card, "damage")) return false; + if (viewer.countCards("he") > player.countCards("he")) return true; + if (viewer.countCards("he", card => get.value(card, target) > 6)) return false; + return true; + } + }); + if (player == next.player) next.setHiddenSkill("mffengshi"); + "step 1"; + if (result.bool) { + if (player == source) player.logSkill("mffengshi", target); + else { + player.logSkill("mffengshi"); + source.line(player, "green"); + } + if (get.tag(trigger.card, "damage")) trigger.getParent().baseDamage++; + player.chooseToDiscard("he", true); + } else event.finish(); + "step 2"; + if (target.countDiscardableCards(player, "he") > 0) player.discardPlayerCard(target, "he", true); + }, + }, +}; + +export default skills; diff --git a/character/sp2/sort.js b/character/sp2/sort.js new file mode 100644 index 000000000..5c2448f80 --- /dev/null +++ b/character/sp2/sort.js @@ -0,0 +1,44 @@ +const characterSort = { + sp_whlw: ["xurong", "lijue", "zhangji", "fanchou", "guosi", "duanwei", "liangxing", "zhangheng", "tangji", "niufu", "dongxie", "liqueguosi"], + sp_zlzy: ["zhangqiying", "lvkai", "zhanggong", "weiwenzhugezhi", "beimihu"], + sp_longzhou: ["xf_tangzi", "xf_huangquan", "xf_sufei", "sp_liuqi"], + sp_zizouqi: ["mangyachang", "xugong", "zhangchangpu"], + sp_sbfm: ["lisu", "xinpi", "zhangwen"], + sp_guandu: ["sp_zhanghe", "xunchen", "sp_shenpei", "gaolan", "lvkuanglvxiang", "chunyuqiong", "sp_xuyou", "xinping", "hanmeng"], + sp_qihuan: ["zhaozhong", "re_hejin", "fengfang", "mushun"], + sp_binglin: ["re_niujin", "sp_mifangfushiren", "licaiwei", "dc_zhaoyan", "shiyi", "sunlang", "sunhuan", "dc_mengda"], + sp_danqi: ["dufuren", "qinyilu", "bianxi", "dc_huban", "dc_hujinding", "dc_zhaoyǎn", "wangwei", "liyixiejing", "guānning", "dc_jsp_guanyu"], + sp_fenghuo: ["re_nanhualaoxian", "tongyuan", "zhangning", "re_pangdegong"], + sp_huangjin: ["liuhong", "zhujun", "re_hansui", "xushao"], + sp_fadong: ["ol_dingyuan", "wangrong", "re_quyi", "hanfu"], + sp_xuzhou: ["re_taoqian", "caosong", "zhangmiao", "qiuliju"], + sp_zhongyuan: ["re_hucheer", "re_zoushi", "caoanmin", "re_dongcheng"], + sp_xiaohu: ["haomeng", "yanfuren", "yanrou", "dc_zhuling"], + sp_star: ["star_caoren", "star_yuanshu", "star_dongzhuo", "star_yuanshao", "star_zhangchunhua", "star_sunjian"], + mini_qixian: ["mp_liuling"], + sp2_waitforsort: ["caobuxing", "re_maliang", "dc_jikang"], +}; + +const characterSortTranslate = { + sp_whlw: "文和乱武", + sp_zlzy: "逐鹿中原", + sp_longzhou: "同舟共济", + sp_zizouqi: "自走棋", + sp_sbfm: "上兵伐谋", + sp_shengun: "三国奇人传", + sp_guandu: "官渡之战", + sp_huangjin: "列传·黄巾之乱", + sp_fadong: "列传·诸侯伐董", + sp_xuzhou: "列传·徐州风云", + sp_qihuan: "戚宦之争", + sp_zhongyuan: "列传·中原狼烟", + sp_binglin: "兵临城下", + sp_xiaohu: "列传·虓虎悲歌", + sp_fenghuo: "烽火连天", + sp_danqi: "千里单骑", + sp_star: "将星系列", + mini_qixian: "小程序·竹林七贤", + sp2_waitforsort: "等待分包", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/sp2/translate.js b/character/sp2/translate.js new file mode 100644 index 000000000..338ab387f --- /dev/null +++ b/character/sp2/translate.js @@ -0,0 +1,585 @@ +const translates = { + lijue: "李傕", + zhangji: "张济", + fanchou: "樊稠", + guosi: "郭汜", + lvkai: "吕凯", + zhanggong: "张恭", + weiwenzhugezhi: "卫温诸葛直", + xurong: "徐荣", + zhangqiying: "张琪瑛", + sp_liuqi: "刘琦", + xf_tangzi: "唐咨", + gz_xf_huangquan: "黄权", + xf_huangquan: "OL黄权", + xf_huangquan_prefix: "OL", + gz_xf_sufei: "苏飞", + xf_sufei: "OL苏飞", + xf_sufei_prefix: "OL", + xinfu_langxi: "狼袭", + xinfu_langxi_info: "准备阶段,你可以对一名体力小于或等于你的其他角色造成0~2点随机伤害。", + xinfu_yisuan: "亦算", + xinfu_yisuan_info: "每回合限一次。当你于出牌阶段内使用的锦囊牌结算结束后,你可以减1点体力上限并获得此牌对应的所有实体牌。", + xinfu_xingluan: "兴乱", + xinfu_xingluan_info: "每回合限一次。当你于出牌阶段内使用的仅指定一个目标的牌结算完成后,你可以从牌堆中随机获得一张点数为6的牌。", + xinfu_lveming: "掠命", + xinfu_lveming_info: "出牌阶段限一次,你可以选择一名装备区装备比你少的角色,令其选择一个点数,然后你进行判定:
    若点数相同,你对其造成2点伤害;
    若点数不同,则你随机获得其区域内的一张牌。", + xinfu_tunjun: "屯军", + xinfu_tunjun_info: "限定技,出牌阶段,你可以选择一名角色,令其随机使用牌堆中的X张装备牌。(X为你发动过“掠命”的次数)", + xinfu_tanbei: "贪狈", + xinfu_tanbei_info: "出牌阶段限一次,你可以令一名其他角色选择一项:1.令你随机获得其区域内的一张牌,本回合内你不能对其使用牌。2.令你此回合内对其使用牌没有次数与距离限制。", + xinfu_sidao: "伺盗", + xinfu_sidaox: "伺盗", + xinfu_sidao_info: "出牌阶段限一次,当你对一名其他角色连续使用两张牌后,你可以将一张手牌当做【顺手牵羊】对其使用。", + tanbei_effect1: "贪狈", + tanbei_effect1_info: "", + tanbei_effect2: "贪狈", + tanbei_effect2_info: "", + + xinfu_tunan: "图南", + xinfu_tunan_info: "出牌阶段限一次,你可以亮出牌堆顶的一张牌并选择一名其他角色,然后该角色选择一项:使用此牌(无距离限制);或将此牌当普通【杀】使用。", + xinfu_bijing: "闭境", + xinfu_bijing_info: "结束阶段,你可以选择至多两张手牌并标记为“闭境”,然后你获得如下效果:1.其他角色的弃牌阶段开始时,若你于本回合内失去过“闭境”,其弃置两张牌;2.准备阶段,你重铸所有“闭境”牌。", + xinfu_zhenxing: "镇行", + xinfu_zhenxing_info: "结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的至多三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", + xinfu_qianxin: "遣信", + xinfu_qianxin_info: "出牌阶段限一次,若牌堆中没有“信”,你可以选择一名角色并将任意张手牌放置于牌堆中X倍数的位置(X为存活人数),称为“信”。该角色的弃牌阶段开始时,若其手牌区内有于本回合内获得过的“信”,其选择一项:令你将手牌摸至四张;本回合手牌上限-2。", + qianxin_effect: "遣信", + qianxin_effect_info: "", + xinfu_qianxin2: "遣信", + xinfu_qianxin2_info: "", + + xinfu_fuhai: "浮海", + xinfu_fuhai_info: "出牌阶段每个方向限一次,你可以展示一张手牌并选择上家或下家。该角色展示一张手牌,若你展示的牌点数大于等于其展示的牌点数,你弃置你展示的牌,然后继续对其上家或下家重复此流程;若你展示的牌点数小于该展示角色牌的点数,则该角色弃置其展示的牌,然后你与其各摸X张牌(X为你此回合内发动此技能选择的角色数),且你此阶段内不能再发动〖浮海〗。", + fuhai_clear: "浮海", + fuhai_clear_info: "", + + xz_xunxun: "恂恂", + xz_xunxun_info: "摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", + xinfu_xingzhao: "兴棹", + xinfu_xingzhao_info: "锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,判定阶段或弃牌阶段开始时,你跳过此阶段。若X=0或X≥4,当你造成伤害时,此伤害+1(X为场上已受伤的角色数)。", + xinfu_xingzhao2: "兴棹", + xinfu_xingzhao2_info: "", + xinfu_xingzhao3: "兴棹", + xinfu_dianhu: "点虎", + xinfu_dianhu_info: "锁定技,游戏开始时,你选择一名其他角色。当其受到来自你的伤害后或回复体力后,你摸一张牌。", + xinfu_dianhu2: "点虎", + xinfu_dianhu2_info: "", + xinfu_jianji: "谏计", + xinfu_jianji_info: "出牌阶段限一次,你可以令一名其他角色摸一张牌。然后该角色可以使用此牌。", + xinfu_lianpian: "联翩", + xinfu_lianpian_info: "出牌阶段限三次。当你对一名角色连续使用牌时,你可以摸一张牌,然后可以将一张牌交给该角色。", + spwenji: "问计", + spwenji_info: "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。", + rewenji: "问计", + rewenji_info: "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌类型相同的牌时不能被其他角色响应。", + sptunjiang: "屯江", + sptunjiang_info: "结束阶段,若你未于本回合的出牌阶段内使用牌指定过其他角色为目标,则你可以摸X张牌(X为全场势力数)。", + zongkui: "纵傀", + zongkui_mark: "纵傀", + zongkui_mark_bg: "傀", + zongkui_info: "回合开始前,你可以指定一名未拥有“傀”标记的其他角色,令其获得一枚“傀”标记。一轮游戏开始时,你指定一名体力值最少且没有“傀”标记的其他角色,令其获得一枚“傀”标记。", + guju: "骨疽", + guju_info: "锁定技,拥有“傀”标记的角色受到伤害后,你摸一张牌。", + baijia: "拜假", + baijia_info: "觉醒技,准备阶段,若你因〖骨疽〗得到的牌不少于7张,则你增加1点体力上限,回复1点体力,然后令所有未拥有“傀”标记的其他角色获得“傀”标记,最后失去技能〖骨疽〗,并获得技能〖蚕食〗。", + bmcanshi: "蚕食", + bmcanshi_info: "一名角色使用基本牌或普通锦囊牌指定你为唯一目标时,若其有“傀”标记,你可以取消之,然后其失去“傀”标记;你使用牌仅指定一名角色为目标时,你可以额外指定任意名带有“傀”标记的角色为目标(无距离限制),然后这些角色失去“傀”标记。", + + xinpi: "辛毗", + lisu: "李肃", + zhangwen: "张温", + xushao: "许劭", + mangyachang: "忙牙长", + xugong: "许贡", + zhangchangpu: "张昌蒲", + pingjian: "评荐", + pingjian_use: "评荐", + pingjian_info: "结束阶段开始时/当你受到伤害后/出牌阶段限一次,你可以令系统随机检索出三张拥有发动时机为结束阶段开始时/当你受到伤害后/出牌阶段的技能的武将牌。然后你可以选择尝试发动其中一个技能。每个技能每局游戏只能选择一次。", + + songshu: "颂蜀", + songshu_info: "出牌阶段,你可以和其他角色拼点。若你没赢,你与其各摸两张牌,且你本阶段内不能再发动〖颂蜀〗。", + sibian: "思辩", + sibian_info: "摸牌阶段,你可以放弃摸牌,改为亮出牌堆顶的四张牌,然后获得其中所有点数最大与点数最小的牌,且可以将剩余的牌交给手牌数最少的角色。", + lslixun: "利熏", + lslixun_fate: "利熏", + lslixun_info: "锁定技,当你受到伤害时,你防止此伤害,然后获得等同于伤害值的“珠”标记。出牌阶段开始时,你进行判定,若结果点数小于“珠”的数量,你弃置等同于“珠”数量的手牌(若弃牌的牌数不够,则失去剩余数量的体力值)。", + lskuizhu: "馈珠", + lskuizhu_info: "出牌阶段结束时,你可以选择体力值为全场最多的一名其他角色,将手牌摸至与该角色相同(最多摸至五张),然后该角色观看你的手牌,弃置任意张手牌并从观看的牌中获得等量的牌。若其得到的牌大于一张,则你选择一项:移去一个“珠”;或令其对其攻击范围内的一名角色造成1点伤害。", + xpchijie: "持节", + xpchijie_info: "每回合每项各限一次。1.当其他角色使用的牌对你结算结束后,你可以令此牌对所有后续目标无效。2.其他角色使用的牌结算完成时,若你是此牌的目标之一且此牌未造成过伤害,则你可以获得此牌对应的所有实体牌。", + xpchijie2: "持节", + yinju: "引裾", + yinju_info: "限定技,出牌阶段,你可以选择一名其他角色。若如此做,当你于此阶段内使用牌指定其为目标后,你与其各摸一张牌;当你即将对其造成伤害时,防止此伤害,然后其回复等量的体力。", + yinju2: "引裾", + + spjiedao: "截刀", + spjiedao_info: "当你每回合第一次造成伤害时,你可令此伤害至多+X(X为你损失的体力值)。然后若受到此伤害的角色没有死亡,你弃置等同于此伤害加值的牌。", + biaozhao: "表召", + biaozhao_info: "结束阶段,你可以将一张牌置于武将牌上,称为“表”。当有一张与“表”花色点数均相同的牌进入弃牌堆后,你将“表”置入弃牌堆并失去1点体力,若此牌是其他角色因弃置而进入弃牌堆的,则改为该角色获得“表”。准备阶段,若你的武将牌上有“表”,则你将“表”置入弃牌堆。然后你选择一名角色,该角色回复1点体力且将手牌摸至与全场手牌数最多的人相同(最多摸五张)。", + biaozhao2: "表召", + biaozhao2_info: "", + biaozhao3: "表召", + biaozhao3_info: "", + yechou: "业仇", + yechou_info: "当你死亡时,你可以选择一名已损失体力值大于1的角色。直到其下个回合开始前,每个回合结束时,该角色失去1点体力。", + yechou2: "业仇", + yechou2_info: "", + yanjiao: "严教", + yanjiao_info: "出牌阶段限一次,你可以选择一名其他角色并从牌堆顶亮出四张牌。该角色将这些牌分成点数之和相等的两组,你与其各获得其中一组,然后将剩余未分组的牌置入弃牌堆。若未分组的牌超过一张,则你本回合手牌上限-1。", + yanjiao2: "严教", + yanjiao2_info: "", + xingshen: "省身", + xingshen_info: "当你受到伤害后,你可以摸一张牌且下一次发动〖严教〗亮出的牌数+1。若你的手牌数为全场最少,则改为摸两张牌;若你的体力值为全场最少,则〖严教〗亮出的牌数改为+2(加值总数不能超过4)。", + + sp_zhanghe: "SP张郃", + sp_zhanghe_prefix: "SP", + yuanlve: "远略", + yuanlve_info: "出牌阶段限一次,你可以将一张非装备牌交给一名角色,然后该角色可以使用该牌并令你摸一张牌。", + xunchen: "OL荀谌", + xunchen_prefix: "OL", + fenglve: "锋略", + fenglve2: "锋略", + fenglve_info: "出牌阶段开始时,你可以与一名角色拼点,若你赢,该角色将其区域内的各一张牌交给你;若你没赢,你交给其一张牌。当你的单人拼点结算后,你可以令对方获得你拼点的牌。", + mouzhi: "谋识", + mouzhi2: "谋识", + mouzhi_info: "出牌阶段限一次,你可以将一张手牌交给一名角色,若如此做,当其于其下回合的出牌阶段内对一名角色造成伤害后,若是此阶段其第一次对该角色造成伤害,你摸一张牌。", + sp_shenpei: "SP审配", + sp_shenpei_prefix: "SP", + gangzhi: "刚直", + gangzhi_info: "锁定技,当你即将受到其他角色造成的伤害时,或即将对其他角色造成伤害时,你防止此伤害,改为受到伤害的角色失去等量的体力。", + beizhan: "备战", + beizhan2: "备战", + beizhan_info: "结束阶段,你可以令一名角色将手牌摸至体力上限(至多为5)。其下个回合开始时,若其手牌数为全场最多,则其此回合内使用的牌不能指定其他角色为目标。", + gaolan: "OL高览", + gaolan_prefix: "OL", + xiying: "袭营", + xiying2: "袭营", + xiying_info: "出牌阶段开始时,你可以弃置一张非基本手牌,然后令所有其他角色依次选择一项:弃置一张牌,或本回合内不能使用或打出牌;且你本回合内获得如下效果:结束阶段,若你于本回合的出牌阶段内造成过伤害,则你从牌堆中获得一张伤害性基本牌或普通锦囊牌。", + lvkuanglvxiang: "OL吕旷吕翔", + lvkuanglvxiang_prefix: "OL", + liehou: "列侯", + liehou_info: "出牌阶段限一次,你可以令一名攻击范围内的角色交给你一张手牌,然后你将一张手牌交给攻击范围内的另一名角色。", + qigong: "齐攻", + qigong_info: "当你使用的【杀】被【闪】抵消之后,你可以令一名角色再对目标角色使用一张【杀】(不可被响应)。", + chunyuqiong: "淳于琼", + sushou: "宿守", + sushou_info: "弃牌阶段开始时,你可以摸X+1张牌(X为“粮”数),然后可以交给任意名友方角色各一张牌。", + cangchu: "仓储", + cangchu_info: "锁定技,游戏开始时,你获得3枚“粮”标记,当你受到1点火焰伤害后,你失去一枚“粮”标记。", + liangying: "粮营", + liangying_info: "锁定技,若你有“粮”标记,则友方角色摸牌阶段摸牌数+1;当你失去所有“粮”标记后,你减1点体力上限,然后令敌方角色各摸两张牌。", + sp_xuyou: "SP许攸", + sp_xuyou_prefix: "SP", + spshicai: "恃才", + spshicai2: "恃才", + spshicai_info: "出牌阶段,牌堆顶的一张牌对你可见。你可以弃置一张牌,然后获得牌堆顶的一张牌,且不能再发动〖恃才〗直到此牌离开你的手牌区。", + spfushi: "附势", + spfushi_info: "锁定技,若己方存活角色数:大于敌方,你视为拥有〖择主〗;小于敌方,你视为拥有〖逞功〗。", + zezhu: "择主", + zezhu_info: "出牌阶段限一次,你可以获得双方主帅的各一张牌(若无牌则改为你摸一张牌),然后交给双方主帅各一张牌。", + chenggong: "逞功", + chenggong_info: "当有角色使用牌指定目标后,若此牌对目标数大于1,则你可令使用者摸一张牌。", + sp_zhangliao: "SP张辽", + sp_zhangliao_prefix: "SP", + //这仨技能给SP仲村由理毫无违和感好吗!!! + mubing: "募兵", + mubing_info: "出牌阶段开始时,你可以亮出牌堆顶的三张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。", + ziqu: "资取", + ziqu_info: "每名角色限一次,当你对有牌的其他角色造成伤害后,你可以防止此伤害。然后其将其点数最大的牌交给你。", + diaoling: "调令", + diaoling_info: "觉醒技,准备阶段,若你已因〖募兵〗获得了6张或更多的【杀】或武器牌或伤害锦囊牌,则你回复1点体力或摸两张牌,然后修改〖募兵〗。", + mubing_rewrite: "募兵·改", + mubing_rewrite_info: "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。", + caobuxing: "曹不兴", + moying: "墨影", + moying_info: "每回合限一次,当你于回合外不因使用而失去单一一张锦囊牌或装备牌后,你可以选择一个花色和与此牌点数差绝对值不超过2的点数,然后获得牌堆中所有与此牌花色点数相同的牌。", + juanhui: "绢绘", + juanhui2: "绢绘", + juanhui2_backup: "绢绘", + juanhui_info: '结束阶段,你可以选择一名其他角色。记录该角色下回合的出牌阶段里使用的基本牌和普通锦囊牌(每种牌名限记一次),你的下回合出牌阶段,可将一张手牌当这些牌里的任意一张牌使用(每张限使用一次,且【杀】不计次数)。当"绢绘"的牌全部用完时,你回复1点体力并将手牌摸至三张。', + re_maliang: "新杀马良", + re_maliang_prefix: "新杀", + rexiemu: "协穆", + rexiemu_info: "结束阶段,若全场没有“协穆”标记,你可以选择一名角色获得“协穆”标记直到你的下回合开始。你或该角色在各自的回合外使用或打出手牌时,你与其各摸一张牌(每回合限一次)。", + heli: "贺励", + heli_info: "出牌阶段限一次,你可以选择手牌数比你少的一名其他角色。该角色展示所有手牌,然后每缺少一种类型的牌,便从牌堆中随机获得一张此类型的牌。", + zhujun: "朱儁", + gongjian: "攻坚", + gongjian_info: "每回合限一次,当有角色使用【杀】指定第一个目标后,若此【杀】的目标和本局游戏内被使用的上一张【杀】的目标的交集A不为空,则你可以依次弃置A中所有角色的至多两张牌,然后获得以此法弃置的所有【杀】。", + kuimang: "溃蟒", + kuimang_info: "锁定技,一名角色死亡后,若你对其造成过伤害,你摸两张牌。", + liuhong: "刘宏", + yujue: "鬻爵", + yujue_backup: "鬻爵", + yujue_info: "出牌阶段限一次,你可以废除一个装备栏,然后令一名有手牌的其他角色交给你一张手牌。其获得〖执笏〗直到你的下回合开始。", + zhihu: "执笏", + zhihu_mark: "执笏", + zhihu_info: "锁定技,每回合限两次,当你对其他角色造成伤害后,你摸两张牌。", + tuxing: "图兴", + tuxing2: "图兴", + tuxing_info: "锁定技,当你废除一个装备栏时,你加1点体力上限并回复1点体力。然后若你所有的装备栏均已被废除,则你减4点体力上限,且本局游戏内造成的伤害+1。", + re_hejin: "新杀何进", + re_hejin_prefix: "新杀", + xin_baosanniang: "新杀鲍三娘", + xin_baosanniang_prefix: "新杀", + decadexushen: "许身", + decadexushen2: "许身", + decadexushen_info: "限定技,当你进入濒死状态后,你可以回复1点体力并获得技能“镇南”,然后如果你脱离濒死状态且“关索”不在场,你可令一名其他角色选择是否用“关索”代替其武将并令其摸三张牌。", + decadezhennan: "镇南", + decadezhennan_info: "当有角色使用普通锦囊牌指定目标后,若此牌目标数大于1,你可以对一名其他角色造成1点伤害。", + ol_dingyuan: "丁原", + cixiao: "慈孝", + cixiao_info: "准备阶段,若场上没有“义子”标记,你可令一名其他角色获得一个“义子”标记;若场上有“义子”标记,你可以弃置一张牌移动“义子”标记。拥有“义子”标记的角色获得技能“叛弑”。", + panshi: "叛弑", + panshi_info: "锁定技,准备阶段,你交给有“慈孝”技能的角色一张手牌;当你于出牌阶段因使用【杀】对其他角色造成伤害时,若其拥有技能“慈孝”,则此伤害+1,且你结束出牌阶段。", + xianshuai: "先率", + xianshuai_info: "锁定技,有角色造成伤害后,若此伤害是本轮第一次造成伤害:你摸一张牌;若伤害来源是你,则你对受伤角色再造成1点伤害。", + wangrong: "王荣", + minsi: "敏思", + minsi2: "敏思", + minsi_info: "出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离限制,红色牌本回合不计入手牌上限。", + jijing: "吉境", + jijing_info: "当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。", + zhuide: "追德", + zhuide_info: "当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。", + decadewuniang: "武娘", + decadewuniang_info: "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌。若如此做,其摸一张牌。(若你已发动许身,则关索也摸一张牌)", + dongxie: "董翓", + juntun: "军屯", + juntun_info: "锁定技,准备阶段,若X大于1,则你减1点体力上限并摸X张牌(X为你的体力上限)。", + jiaojie: "狡黠", + jiaojie_info: "锁定技,你的红色牌不计入手牌上限。你使用黑色牌无距离和次数限制。", + dcjiaoxia: "狡黠", + dcjiaoxia_info: "①出牌阶段开始时,你可以令自己的所有手牌于此阶段均视为【杀】。若如此做,你使用以此法转化的【杀】造成伤害后,你可以使用此牌对应的原卡牌。②出牌阶段,你对你本阶段未使用过【杀】的角色使用【杀】无距离和次数限制。", + dchumei: "狐魅", + dchumei_info: "出牌阶段各限一次,你可以选择一名体力值不大于X的角色,令其:①摸一张牌。②交给你一张牌。③回复1点体力。(X为你本阶段造成的伤害数)", + buchen: "不臣", + buchen_info: "隐匿技,你于其他角色的回合登场时,可获得当前回合角色的一张牌。", + smyyingshi: "鹰视", + smyyingshi_info: "锁定技,出牌阶段,你可观看牌堆顶的X张牌(X为你的体力上限)。", + xiongzhi: "雄志", + xiongzhi_info: "限定技,出牌阶段,你可亮出牌堆顶的一张牌并使用之。若如此做,你重复此流程,直到你以此法展示的牌无法使用。", + quanbian: "权变", + quanbian2: "权变", + quanbian_info: "当你于出牌阶段内使用/打出手牌时,若此牌有花色且你本回合内未使用/打出过该花色的其他手牌,则你可以选择一项:①摸一张牌。②将牌堆顶X张牌中的一张置于牌堆底(X为你的体力上限)。若你发动此技能,则你本回合内不能再使用与此牌花色相同的手牌。", + re_hansui: "新杀韩遂", + re_hansui_prefix: "新杀", + re_quyi: "新杀麴义", + re_quyi_prefix: "新杀", + refuqi: "伏骑", + refuqi_info: "锁定技,当你使用牌时,你令所有距离为1的其他角色不能使用或打出牌响应此牌。", + hanfu: "韩馥", + hfjieying: "节应", + hfjieying2: "节应", + hfjieying3: "节应", + hfjieying_info: "结束阶段,你可以选择一名其他角色,该角色下回合使用目标数为1的【杀】或普通锦囊牌无距离限制且可多指定一个目标,且当其造成伤害后,其无法再使用牌直到回合结束。", + weipo: "危迫", + weipo_info: "锁定技,其他角色使用【杀】或普通锦囊牌指定你为目标后,若你的手牌数小于X,则你将手牌摸至X张,并记录摸牌事件结算后的手牌数Y。此牌结算结束后,若你的手牌数小于Y,则你将一张手牌交给此牌的使用者,且此技能失效直到你的下回合开始。(X为你的体力上限且至多为5)", + zhaozhong: "赵忠", + yangzhong: "殃众", + yangzhong_info: "当你造成或受到伤害后,若受伤角色和伤害来源均存活,则伤害来源可弃置两张牌,然后令受伤角色失去1点体力。", + huangkong: "惶恐", + huangkong_info: "锁定技,当你于回合外成为【杀】或普通锦囊牌的目标后,若你没有手牌,则你摸两张牌。", + re_taoqian: "陶谦", + reyixiang: "义襄", + reyixiang_info: "锁定技,其他角色于其出牌阶段内使用的第一张牌对你的伤害-1;其使用的第二张牌若为黑色,则对你无效。", + caosong: "曹嵩", + cslilu: "礼赂", + cslilu_info: "摸牌阶段,你可以放弃摸牌,改为将手牌摸至X张(X为你的体力上限和5中的最小值),然后将至少一张手牌交给一名其他角色。若你以此法给出的牌数大于你上次以此法给出的牌数,则你加1点体力上限并回复1点体力。", + csyizheng: "翊正", + csyizheng2: "翊正", + csyizheng_info: "结束阶段开始时,你可以选择一名其他角色。你的下回合开始前,当该角色造成伤害或回复体力时,若其体力上限小于你,则你减1点体力上限,且令此伤害值/回复值+1。", + reyirang: "揖让", + reyirang_info: "出牌阶段开始时,你可以将所有非基本牌交给一名其他角色。若其体力上限大于你,则你将体力上限调整至与其相同。然后你回复X点体力(X为你以此法交给其的牌数)。", + liangxing: "梁兴", + lulve: "掳掠", + lulve_info: "出牌阶段开始时,你可选择一名有手牌且手牌数少于你的角色。其选择一项:①将所有手牌交给你,然后你将武将牌翻面。②将武将牌翻面,然后其视为对你使用一张【杀】。", + lxzhuixi: "追袭", + lxzhuixi_info: "锁定技,当你造成伤害或受到伤害时,若受伤角色的翻面状态和伤害来源的翻面状态不同,则此伤害+1。", + zhangmiao: "张邈", + mouni: "谋逆", + mouni_info: "准备阶段,你可对一名其他角色依次使用你手牌中所有的【杀】(若其进入了濒死状态,则终止此流程)。然后若这些【杀】中有未造成伤害的【杀】,则你跳过本回合的出牌阶段和弃牌阶段。", + zongfan: "纵反", + zongfan_info: "觉醒技。结束阶段,若你本回合内因〖谋逆〗使用过【杀】且未跳过本回合的出牌阶段,则你将任意张牌交给一名其他角色,然后加X点体力上限并回复X点体力(X为你以此法给出的牌数且至多为5)。最后失去〖谋逆〗并获得〖战孤〗。", + zhangu: "战孤", + zhangu_info: "锁定技,准备阶段,若你的体力上限大于1且没有手牌/装备区内没有牌,则你减1点体力上限,然后从牌堆中获得三张类型不同的牌。", + re_niujin: "新杀牛金", + re_niujin_prefix: "新杀", + recuorui: "摧锐", + recuorui_info: "限定技,出牌阶段,你可以依次获得至多X名角色的各一张手牌(X为你的体力值)。", + reliewei: "裂围", + reliewei_info: "每回合限Y次,当有角色进入濒死状态时,你可以摸一张牌(Y为你的体力值,若当前回合角色为你,则Y为Infinity)。", + duanwei: "段煨", + langmie: "狼灭", + langmie_damage: "狼灭", + langmie_info: "其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以摸一张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。", + zhangheng: "张横", + dangzai: "挡灾", + dangzai_info: "出牌阶段开始时,你可将一名其他角色判定区内的一张牌移动至你的判定区内。", + liangjue: "粮绝", + liangjue_info: "锁定技,当有黑色牌进入或者离开你的判定区或装备区后,若你的体力值大于1,你失去1点体力,然后摸两张牌。", + tangji: "唐姬", + kangge: "抗歌", + kangge_info: "你的第一个回合开始时,选择一名其他角色,该角色每次于其回合外得到牌后,你摸等量的牌(每回合至多摸三张);其进入濒死状态时,你可令其回复体力至1点(每轮限一次)。该角色死亡时,你弃置所有牌并失去1点体力。", + jielie: "节烈", + jielie_info: "当你受到除自己和“抗歌”角色以外的角色造成的伤害时,你可以防止此伤害并选择一种花色,然后你失去X点体力,令“抗歌”角色从弃牌堆中随机获得X张此花色的牌(X为伤害值)。", + re_dongcheng: "董承", + xuezhao: "血诏", + xuezhao_info: "出牌阶段限一次,你可弃置一张手牌并选择至多X名其他角色(X为你的体力上限)。这些角色依次选择是否交给你一张牌,若选择是,该角色摸一张牌且你本回合可多使用一张【杀】;若选择否,该角色本回合无法响应你使用的牌。", + re_hucheer: "胡车儿", + redaoji: "盗戟", + redaoji2: "盗戟", + redaoji_info: "其他角色第一次使用武器牌时,你可选择一项:①获得此牌。②令其本回合内不能使用或打出【杀】。", + fuzhong: "负重", + fuzhong_info: "锁定技,当你于回合外得到牌后,你获得一枚“重”标记。若X:大于0,你于摸牌阶段开始时令额定摸牌数+1;大于1,你至其他角色的距离-2;大于2,你的手牌上限+3;大于3,结束阶段开始时,你对一名其他角色造成1点伤害,然后移去4枚“重”(X为“重”数)。", + qiuliju: "丘力居", + koulve: "寇略", + koulve_info: "当你于出牌阶段内对其他角色造成伤害后,你可以展示其X张手牌(X为其已损失的体力值)。若这些牌中:有带有伤害标签的基本牌或锦囊牌,则你获得之;有红色牌,则你失去1点体力(若已受伤则改为减1点体力上限),然后摸两张牌。", + qljsuiren: "随认", + qljsuiren_info: "当你死亡时,你可以将手牌中所有的带有伤害标签的基本牌或锦囊牌交给一名其他角色。", + re_zoushi: "邹氏", + rehuoshui: "祸水", + rehuoshui_info: "准备阶段,你可以选择至多X名角色(X为你已损失的体力值且至少为1)。你令这些角色中第一名角色的非锁定技失效直到回合结束;第二名角色交给你一张手牌;第三名及之后角色弃置装备区内的所有牌。", + reqingcheng: "倾城", + reqingcheng_info: "出牌阶段限一次,你可以与一名手牌数不大于你的男性角色交换手牌。", + caoanmin: "曹安民", + xianwei: "险卫", + xianwei_info: "锁定技,准备阶段,你废除一个装备栏并摸X张牌(X为你未废除的装备栏数),然后你可以令一名其他角色对其自己使用一张牌堆中的一张与此装备栏副类别相同的装备牌(没有可使用的牌则改为摸一张牌)。当你废除所有装备栏后,你加2点体力上限,然后你与所有其他角色视为在彼此的攻击范围内。", + dufuren: "杜夫人", + yise: "异色", + yise_info: "其他角色得到你的牌后,若这些牌中:有红色牌,你可令其回复1点体力;有黑色牌,其下次受到因执行【杀】的效果造成的伤害时,此伤害+1。", + shunshi: "顺世", + shunshi_info: "准备阶段开始时,或当你受到伤害后,你可将一张牌交给一名不为伤害来源的其他角色并获得如下效果直到你的回合结束:摸牌阶段的额定摸牌数+1,使用【杀】的次数上限+1,手牌上限+1。", + rexingluan: "兴乱", + rexingluan_info: "出牌阶段限一次,当你使用的仅指定一个目标的牌结算完成后,你可以获得场上一张与此牌点数相同的牌,或获得牌堆中随机一张点数与此牌相同的牌。", + xinxingluan: "兴乱", + xinxingluan_info: "每回合限一次。当你于出牌阶段内使用牌结算结束后,你可选择一项:①观看牌堆中的两张点数为6的牌并获得其中一张(没有则改为摸六张牌);②令一名其他角色弃置一张点数为6的牌或交给你一张牌;③获得场上的一张点数为6的牌。", + re_nanhualaoxian: "南华老仙", + gongxiu: "共修", + gongxiu_info: "结束阶段,若你本回合内发动过〖经合〗,则你选择一项:①令所有本回合内成为过〖经合〗目标的角色各摸一张牌;②令所有本回合内未成为过〖经合〗目标的角色各弃置一张手牌。", + jinghe: "经合", + jinghe_info: "出牌阶段限一次,你可以展示至多四张牌名各不相同的牌并选择等量的角色。系统从“写满技能的天书”中随机选择等量的技能,然后这些角色依次选择获得其中的一个。", + nhyinbing: "阴兵", + nhyinbing_info: "锁定技,你使用的【杀】造成伤害改为失去体力。其他角色失去体力后,你摸一张牌。", + nhhuoqi: "活气", + nhhuoqi_info: "出牌阶段限一次,你可以弃置一张牌,然后令体力值最少的一名角色回复1点体力并摸一张牌。", + nhguizhu: "鬼助", + nhguizhu_info: "一名角色进入濒死状态时,你可以摸两张牌(每回合限一次)。", + nhxianshou: "仙授", + nhxianshou_info: "出牌阶段限一次,你可以选择一名角色令其摸一张牌。若其未受伤,则多摸一张。", + nhlundao: "论道", + nhlundao_info: "当你受到伤害后,若伤害来源比你手牌多,你可以弃置其一张牌;若伤害来源比你手牌少,你摸一张牌。", + nhguanyue: "观月", + nhguanyue_info: "结束阶段,你可以观看牌堆顶两张牌,然后获得其中—张,另一张放回牌堆顶。", + nhyanzheng: "言政", + nhyanzheng_info: "准备阶段,若你的手牌数大于1,你可以保留一张手牌并弃置其余的牌,然后选择至多等于弃牌数量的角色,对这些角色各造成1点伤害。", + sp_mifangfushiren: "糜芳傅士仁", + mffengshi: "锋势", + mffengshi_info: "当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则此牌的使用者可令你弃置自己和对方的各一张牌,并令此牌的伤害值+1。", + dcmffengshi: "锋势", + dcmffengshi_info: "当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则你可弃置自己和对方的各一张牌,并令此牌的伤害值+1。", + fengshi: "锋势", + fengshi_info: "当你使用牌指定第一个目标后,你可弃置你与其中一名手牌数小于你的目标角色的各一张牌,并令此牌对其造成的伤害+1;当你成为其他角色使用牌的目标后,若你的手牌数小于其,则你可以弃置你与其的各一张牌,并令此牌对你造成的伤害+1。", + tongyuan: "童渊", + chaofeng: "朝凤", + chaofeng_info: "出牌阶段限一次。当你造成伤害时,你可以弃置一张手牌,然后摸一张牌。若此伤害的渠道为牌且你弃置的牌:与此牌颜色相同,则你改为摸两张牌;与此牌类型相同,则此伤害+1。", + chuanshu: "传术", + chuanshu_info: "限定技。准备阶段,若你已受伤;或当你死亡时,你可令一名其他角色获得〖朝凤〗。然后你获得〖龙胆〗、〖从谏〗和〖穿云〗。", + chuanyun: "穿云", + chuanyun_info: "当你使用【杀】指定目标后,你可令目标角色随机弃置其装备区内的一张牌。", + zhangning: "张宁", + tianze: "天则", + tianze_info: "①每回合限触发一次。其他角色于其出牌阶段内使用的黑色手牌结算结束后,你可以弃置一张黑色牌,并对其造成1点伤害。②其他角色的判定生效后,若结果为黑色,则你摸一张牌。", + difa: "地法", + difa_info: "每回合限一次。当你于回合内因摸牌而得到红色牌时,你可以弃置之。然后你选择一个锦囊牌的牌名,并从牌堆中获得一张此牌名的牌。", + xinping: "辛评", + fuyuan: "辅袁", + fuyuan_info: "当你于回合外使用或打出牌时,若当前回合角色的手牌数:不小于你,你可摸一张牌;小于你,你可令其摸一张牌。", + zhongjie: "忠节", + zhongjie_info: "当你死亡时,你可令一名其他角色加1点体力上限并回复1点体力,然后摸一张牌。", + hanmeng: "韩猛", + jieliang: "截粮", + jieliang_info: "其他角色的摸牌阶段开始时,你可弃置一张牌,令其本阶段的摸牌数和本回合的手牌上限-1。然后当其于本回合的弃牌阶段内因弃置而失去牌后,你可获得其中的一张。", + quanjiu: "劝酒", + quanjiu_info: "锁定技。①你手牌区中的【酒】的牌名视为【杀】。②你使用对应的实体牌为一张【酒】的非转化【杀】不计入次数限制。", + re_pangdegong: "庞德公", + heqia: "和洽", + heqia_info: "出牌阶段开始时,你可选择一项:①将任意张牌交给一名其他角色。②令一名有手牌的其他角色交给你任意张牌。然后以此法得到牌的角色可以将一张手牌当作任意基本牌使用,且当其声明使用此牌后,可以为此牌增加至至多X个目标(X为以此法移动的牌数)。", + yinyi: "隐逸", + yinyi_info: "锁定技。每回合限一次,当你受到非属性伤害时,若你的手牌数和体力值与伤害来源均不相同,则你防止此伤害。", + haomeng: "郝萌", + xiongmang: "雄莽", + xiongmang_info: "你可将任意张花色各不相同的手牌当做目标数上限为X的【杀】使用(X为此【杀】对应的实体牌数)。此【杀】使用结算结束后,若你未造成过渠道为此牌的伤害且体力上限大于1,则你减1点体力上限。", + yanfuren: "严夫人", + channi: "谗逆", + channi_info: "出牌阶段限一次。你可将任意张手牌交给一名其他角色,然后其可以将至多等量的手牌当做【决斗】使用。若其因此【决斗】造成了伤害,则其摸X张牌(X为此【决斗】对应的实体牌数)。若其因此【决斗】受到过伤害,则你弃置所有手牌。", + nifu: "匿伏", + nifu_info: "锁定技。一名角色的回合结束时,你将手牌摸至或弃置至三张。", + licaiwei: "李采薇", + yijiao: "异教", + yijiao_info: "出牌阶段限一次,你可以选择一名没有“异”标记的其他角色并声明一个整数X(X∈[1,4]),该角色获得10X个“异”标记。有“异”标记的角色的结束阶段,其移去“异”标记,且若其本回合使用牌的点数之和:1.小于“异”标记数,其随机弃置至多三张手牌;2.等于“异”标记数,你摸两张牌且该角色本回合结束后进行一个额外的回合;3.大于“异”标记数,你摸三张牌。", + qibie: "泣别", + qibie_info: "一名角色死亡后,若你有手牌且这些手牌均可被弃置,则你可以弃置所有手牌,然后回复1点体力并摸X+2张牌(X为你弃置的牌数)。", + dc_zhuling: "朱灵", + dczhanyi: "战意", + dczhanyi_info: "出牌阶段开始时,你可以弃置所有基本牌/锦囊牌/装备牌,然后获得另外两种类型的牌对应的效果直到你的下个回合开始:基本牌、你使用基本牌无距离限制,且伤害值和回复值基数+1;锦囊牌、你使用锦囊牌时摸一张牌,且锦囊牌不计入手牌上限;装备牌,当装备牌进入你的装备区时,你可弃置一名其他角色的一张牌。", + yanrou: "阎柔", + choutao: "仇讨", + choutao_info: "当你使用【杀】时,或成为【杀】的目标后,你可以弃置此【杀】使用者的一张牌,令此【杀】不可被响应。若你是此【杀】的使用者,则你令此【杀】不计入次数限制。", + xiangshu: "襄戍", + xiangshu_info: "限定技。结束阶段开始时,若你本回合内造成过伤害,则你可以选择一名已受伤的角色。该角色回复X点体力并摸X张牌(X为你本回合内造成的伤害值总和且至多为5)。", + qinyilu: "秦宜禄", + piaoping: "漂萍", + piaoping_info: "转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)", + tuoxian: "托献", + tuoxian_info: "每局游戏限一次。当你因执行〖漂萍〗的效果而弃置牌后,你可令一名其他角色获得这些牌,然后令该角色选择一项:⒈弃置区域内等量的牌。⒉令你的〖漂萍〗失效直到回合结束。", + chuaili: "惴栗", + chuaili_info: "锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。", + fengfang: "冯方", + dcditing: "谛听", + dcditing_info: "其他角色的出牌阶段开始时,若你在该角色的攻击范围内,则你可以观看其的X张手牌(X为你的体力值)并选择其中一张,且获得如下效果:①当其使用对应实体牌包含此牌的牌指定你为目标后,你令此牌对你无效。②当其使用对应实体牌包含此牌的牌结算结束后,若你不是此牌的目标,则你摸两张牌。③其出牌阶段结束时,若此牌位于其的手牌区,则你获得此牌。", + dcbihuo: "避祸", + dcbihuo_info: "①当你受到其他角色造成的伤害后,你可令一名角色下回合摸牌阶段的额定摸牌数+1。②当你对其他角色造成伤害后,你可令一名角色下回合摸牌阶段的额定摸牌数-1。", + bianxi: "卞喜", + dunxi: "钝袭", + dunxi_info: "①当你使用具有伤害标签的牌时,你可以令一名不为你的目标角色获得一枚“钝”。②有“钝”的角色使用基本牌或锦囊牌时,若此牌目标数为1且此时没有角色处于濒死状态,你令其移去一枚“钝”。系统随机选择一名角色,并将此牌的目标改为该角色。若该角色和原目标相同,则其失去1点体力。若其正处于出牌阶段内,则结束此阶段。", + niufu: "牛辅", + dcxiaoxi: "宵袭", + dcxiaoxi_info: "锁定技。出牌阶段开始时,你声明X并减X点体力上限(X∈[1,2])。然后你选择一名攻击范围内的其他角色并选择一项:⒈获得该角色的X张牌。⒉视为对其使用X张【杀】。", + xiongrao: "熊扰", + xiongrao_info: "限定技。准备阶段开始时,你可以选择所有其他角色。这些角色本回合内所有不为锁定技、限定技、觉醒技的普通技能失效。然后你将体力上限增加至7点并摸X张牌(X为你以此法增加的体力上限数)。", + dc_huban: "胡班", + dcchongyi: "崇义", + dcchongyi_info: "①一名角色使用【杀】时,若此牌是其于当前出牌阶段内使用的第一张牌,则你可以令其摸两张牌,且其本回合使用【杀】的次数上限+1。②一名角色的出牌阶段结束时,若其于此阶段内使用的最后一张牌为【杀】,则你可以令其本回合的手牌上限+1,然后你获得此【杀】。", + wangwei: "王威", + dcruizhan: "锐战", + dcruizhan_info: "其他角色的准备阶段开始时,若其的手牌数不小于其体力值,则你可以和其拼点。若你赢或拼点牌中有【杀】,则你视为对其使用一张【杀】。然后若此【杀】造成了伤害且以上两个条件均被满足,则你获得其一张牌。", + dcshilie: "示烈", + dcshilie_info: "①出牌阶段限一次。你可以选择一项:⒈回复1点体力,将两张牌置于武将牌上作为“示烈”。若“示烈”牌数大于存活人数,则你将最早的多余牌置入弃牌堆;⒉失去1点体力,获得两张“示烈”牌。(满血则不回血,无牌则不移动)②当你死亡时,你可以将所有“示烈”牌交给一名不为伤害来源的其他角色。", + dc_zhaoyǎn: "赵俨", + dcfuning: "抚宁", + dcfuning_info: "当你使用牌时,你可以摸两张牌,然后弃置X张牌(X为你本回合内发动过〖抚宁〗的次数)。", + dcbingji: "秉纪", + dcbingji_info: "出牌阶段每种花色各限一次。若你有手牌且这些牌的花色均相同,则你可以展示手牌,然后选择一名其他角色,视为对其使用一张【杀】或【桃】(有距离限制)。", + mushun: "穆顺", + dcjinjian: "劲坚", + dcjinjian_info: "①当你受到其他角色造成的伤害后或造成伤害后,你获得一枚“劲”。然后你可以和伤害来源拼点,若你赢,你恢复1点体力。②你的攻击范围+X(X为“劲”数)。", + dcshizhao: "失诏", + dcshizhao_info: "锁定技。每回合限一次,当你于回合外失去手牌后,若你没有手牌,且你:有“劲”,则你移去一枚“劲”并摸两张牌;没有“劲”,则你本回合下一次受到的伤害+1。", + liyixiejing: "李异谢旌", + dcdouzhen: "斗阵", + dcdouzhen_info: "锁定技。①转换技。你的回合内,阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。", + dc_hujinding: "新杀胡金定", + dc_hujinding_prefix: "新杀", + dcdeshi: "德释", + dcdeshi_info: "锁定技。当你受到【杀】的伤害时,若你已受伤,则你防止此伤害并令系统从弃牌堆/牌堆中检索一张【杀】,你获得此【杀】,然后减1点体力上限。", + dcwuyuan: "武缘", + dcwuyuan_info: "出牌阶段限一次。你可将一张【杀】交给一名其他角色,然后你回复1点体力,你与其各摸一张牌。若此【杀】为:红色【杀】,其回复1点体力;属性【杀】,其改为摸两张牌。", + shiyi: "是仪", + dccuichuan: "榱椽", + dccuichuan_info: "出牌阶段限一次。你可以弃置一张手牌并选择一名角色,其随机使用牌堆里一张其空置装备栏对应副类别且其能对其使用的装备牌,你摸X张牌(X为其装备区里的牌数)。然后若其装备区里的牌数增加至四张,你失去〖榱椽〗,获得〖佐谏〗,且令其获得一个额外回合。", + dczhengxu: "正序", + dczhengxu_info: "每回合每项限一次。①当你受到伤害时,若你本回合失去过牌,你可以防止此伤害。②当你失去牌后,若你本回合受到过伤害,你可以摸等量的牌。", + dczuojian: "佐谏", + dczuojian_info: "出牌阶段结束时,若你于此阶段使用过的牌数不小于体力值,你可以选择一项:1.令装备区牌数多于你的角色各摸一张牌;2.弃置装备区牌数少于你的角色各一张手牌。", + sunlang: "孙狼", + dctingxian: "铤险", + dctingxian_info: "每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后令此【杀】对其中至多X个目标无效(X为你装备区的牌数+1)。", + dcbenshi: "奔矢", + dcbenshi_info: "锁定技。①你的攻击范围+1。②你的攻击范围基数不受装备区内武器牌的影响。③由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。", + sunhuan: "孙桓", + dcniji: "逆击", + dcniji_info: "①当你成为非装备牌的目标后,你可以摸一张牌,称为“逆击”。②一名角色的结束阶段,你可以使用一张“逆击”牌,然后弃置所有“逆击”牌。", + //dc_fuwan:'新杀伏完', + //dc_fuwan_prefix:'新杀', + //dc_fuwan_ab:'伏完', + dcmoukui: "谋溃", + dcmoukui_info: "当你使用【杀】指定第一个目标后,你可以选择任意项:1.摸一张牌;2.弃置其中一个目标角色一张牌。若你均选择,当此【杀】被无效后或被抵消后,该角色弃置你一张牌。", + guānning: "关宁", + dcxiuwen: "修文", + dcxiuwen_info: "当你使用牌时,若你未记录此牌牌名,你可以记录之并摸一张牌。", + oldlongsong: "龙诵", + oldlongsong_info: "出牌阶段开始时,你可以将一张手牌交给一名其他角色。然后其须选择其所有的发动时机为出牌阶段内的空闲时间点且你至多能于此阶段发动一次的技能,其于此阶段这些技能失效,你获得这些技能。", + dclongsong: "龙诵", + dclongsong_info: "出牌阶段开始时,你可以将一张红色牌交给一名其他角色。然后其须选择其所有的发动时机包含“出牌阶段”的技能,其于此阶段这些技能失效,你获得这些技能且至多可以发动一次。", + longsong: "龙诵", + longsong_info: "出牌阶段开始时,你可以将一张红色牌交给一名其他角色或获得一名其他角色的一张红色牌,然后你本阶段获得其所有的发动时机包含“出牌阶段”的技能且至多可以发动一次,若其没有符合条件的技能,则改为随机获得一个满足条件的技能。", + dc_mengda: "孟达", + dclibang: "利傍", + dclibang_info: "出牌阶段限一次。你可以弃置一张牌,正面向上获得两名其他角色的各一张牌。然后你判定,若结果与这两张牌的颜色均不同,你交给其中一名角色两张牌或失去1点体力,否则你获得判定牌并视为对其中一名角色使用一张【杀】。", + dcwujie: "无节", + dcwujie_info: "锁定技。①你使用无色牌无任何次数限制且无距离限制。②当其他角色执行杀死你的奖惩而摸牌或弃牌时,取消之。", + dc_jsp_guanyu: "新杀SP关羽", + dc_jsp_guanyu_prefix: "新杀SP", + dcdanji: "单骑", + dcdanji_info: "觉醒技。准备阶段,若你区域内的牌数大于体力值,你减1点体力上限,将体力回复至体力上限并摸等同于体力值的牌,然后获得〖马术〗和〖怒嗔〗。", + dcnuchen: "怒嗔", + dcnuchen_info: "出牌阶段限一次。你可以展示一名其他角色的一张手牌,然后选择一项:1.弃置任意张该花色的牌,对其造成等量伤害;2.获得该角色手牌中所有此花色的牌。", + dc_jikang: "新杀嵇康", + dc_jikang_prefix: "新杀", + dcjuexiang: "绝响", + dcjuexiang_info: "当你死亡时,杀死你的角色弃置其装备区内的所有牌并失去1点体力,然后你可以令一名其他角色获得〖残韵〗。", + dccanyun: "残韵", + dccanyun_info: "每名角色限一次。出牌阶段,你可以弃置一张牌并选择一名其他角色,然后若其装备区里的牌数:小于你,其回复1点体力;大于你,其失去1点体力;等于你,其摸一张牌。若你的体力值为1,你摸一张牌。", + mp_liuling: "刘伶", + mpjiusong: "酒颂", + mpjiusong_info: "①你可以将一张锦囊牌当【酒】使用。②当一名角色使用【酒】时,你获得1枚“醉”标记(“醉”数至多为3)。", + mpmaotao: "酕醄", + mpmaotao_info: "当其他角色使用基本牌或普通锦囊牌指定唯一目标时,你可以移去1枚“醉”,令此牌的目标改为随机一名合法角色(无距离限制)。若目标角色与原目标相同且你本回合未以此法获得过牌,你从牌堆中随机获得一张锦囊牌。", + mpbishi: "避世", + mpbishi_info: "锁定技。你不能成为伤害类锦囊牌的目标。", + star_caoren: "星曹仁", + star_caoren_prefix: "星", + starsujun: "肃军", + starsujun_info: "当你使用一张牌时,若你手牌中的基本牌和非基本牌的牌数相等,你可以摸两张牌。", + starlifeng: "砺锋", + starlifeng_info: "你可以将一张本回合未有角色使用过的颜色的手牌当做不计入次数的【杀】或【无懈可击】使用。", + star_yuanshu: "星袁术", + star_yuanshu_prefix: "星", + starcanxi: "残玺", + starcanxi_wangsheng: "妄生", + starcanxi_xiangsi: "向死", + starcanxi_cancel: "向死", + starcanxi_info: "锁定技。①游戏开始时,你获得场上所有角色的势力对应的“玺角”标记。②一轮游戏开始时,你选择一个“玺角”对应势力并选择以下一项:1.妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1;2.向死:本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。", + starpizhi: "圮秩", + starpizhi_info: "锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记且你本轮发动〖向死〗的势力与其相同,你失去之并摸X张牌。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)", + starzhonggu: "冢骨", + starzhonggu_info: "主公技,锁定技。摸牌阶段,若游戏轮数大于等于场上的群势力角色数,则你额外摸两张牌,否则你少摸一张牌。", + star_dongzhuo: "星董卓", + star_dongzhuo_prefix: "星", + starweilin: "威临", + starweilin_info: "锁定技。当你于回合内对一名其他角色造成伤害时,若其本回合未受到过伤害,且你本回合使用的牌数大于等于其体力值,则此伤害+1。", + starzhangrong: "掌戎", + starzhangrong_info: "准备阶段,你可以选择令至多X名体力值大于等于你的角色各失去1点体力或令至多X名手牌数大于等于你的角色各弃置一张手牌(X为你的体力值)。若如此做,你摸等同于选择角色数的牌,且本回合结束时,若这些角色中存在本回合未受到过伤害的角色,则你失去1点体力。", + starhaoshou: "豪首", + //starhaoshou_info:'主公技。①其他群势力角色使用【酒】结算完毕后,其可以令你回复1点体力。②当你处于濒死状态时,其他群势力角色可以将【酒】当作【桃】对你使用。', + starhaoshou_info: "主公技。其他群势力角色使用【酒】结算完毕后,其可以令你回复1点体力。", + star_yuanshao: "星袁绍", + star_yuanshao_prefix: "星", + starxiaoyan: "硝焰", + starxiaoyan_info: "锁定技,游戏开始时,你对所有其他角色各造成1点火属性伤害,然后这些角色可依次交给你一张牌并回复1点体力。", + starzongshi: "纵势", + starzongshi_info: "出牌阶段,你可以展示一张可展示目标的基本牌或普通锦囊牌,然后你将手牌中所有与此牌花色相同的其他牌当作此牌使用(无距离限制),且此牌至多指定转化牌数的目标。", + starjiaowang: "骄妄", + starjiaowang_info: "锁定技,非首轮游戏开始时,若上一轮没有角色死亡(因〖硝焰〗死亡的角色除外),则你失去1点体力并发动〖硝焰〗。", + staraoshi: "傲势", + staraoshi_info: "主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张手牌,然后你可以发动一次〖纵势〗。", + star_zhangchunhua: "星张春华", + star_zhangchunhua_prefix: "星", + starliangyan: "梁燕", + starliangyan_info: "出牌阶段限一次。你可以选择一名其他角色,你摸/弃置至多两张牌,令其弃置/摸等量的牌。然后若你与其手牌数相同,以此法摸牌的角色跳过其下一个弃牌阶段。", + starminghui: "明慧", + starminghui_info: "一名角色的回合结束时,若你的手牌数:最少,你可以视为使用一张无距离限制的【杀】;最多,你可以将手牌弃置至你手牌数不为最多,然后令一名角色回复1点体力。", + liqueguosi: "李傕郭汜", + xiongsuan: "凶算", + xiongsuan_info: "出牌阶段限一次,你可以弃置一张手牌并对一名角色造成1点伤害,然后你摸三张牌。若该角色不为你,你失去1点体力。", + star_sunjian: "星孙坚", + star_sunjian_prefix: "星", + starruijun: "锐军", + starruijun_info: "当你于出牌阶段首次使用牌指定其他角色为目标后,若目标角色数为1,你可以摸X张牌(X为你已损失的体力值+1)。直到此阶段结束,所有不为其的其他角色均不在你的攻击范围内,且当你对其造成伤害时,此伤害值改为Y(Y为你本回合上一次对其造成过的伤害值+1,至多为5)。", + stargangyi: "刚毅", + stargangyi_info: "锁定技。①你的回合内,若你本回合没有造成过伤害,你不能使用【桃】。②当你处于濒死状态时,以你为目标的【桃】或【酒】的回复值+1。", +}; + +export default translates; diff --git a/character/sp2/voices.js b/character/sp2/voices.js new file mode 100644 index 000000000..659eed59b --- /dev/null +++ b/character/sp2/voices.js @@ -0,0 +1,454 @@ +export default { + "#xiongsuan1": "朝中无一是男儿,谁敢拦我二人!", + "#xiongsuan2": "挟持天子,执掌重兵,天下可图!", + "#liqueguosi:die": "文和之言,诚不欺我……", + "#starliangyan1": null, + "#starliangyan2": null, + "#starminghui1": null, + "#starminghui2": null, + "#star_zhangchunhua:die": "怎能如此对我!", + "#starxiaoyan1": "万军付薪柴,戾火燃苍穹。", + "#starxiaoyan2": "九州硝烟起,烽火灼铁衣。", + "#starzongshi1": "四世三公之家,当为天下之望。", + "#starzongshi2": "大势在我,可怀问鼎之心。", + "#starjiaowang1": "剑顾四野,马踏青山,今谁堪敌手?", + "#starjiaowang2": "并土四州,带甲百万,吾可居大否?", + "#staraoshi1": "无傲骨近于鄙夫,有傲心方为君子。", + "#staraoshi2": "得志则喜,临富贵如何不骄?", + "#star_yuanshao:die": "骄兵必败,奈何不记前辙……", + "#starweilin1": "今吾入京城,欲寻人而食。", + "#starweilin2": "天下事在我,我今为之,谁敢不从?", + "#starzhangrong1": "尔欲行大事,问过吾掌中兵刃否?", + "#starzhangrong2": "西凉铁骑曳城,天下高楼可摧!", + "#starhaoshou1": "满朝主公,试吾剑不利否?", + "#starhaoshou2": "顺我者生,逆我者十死无生!", + "#star_dongzhuo:die": "美人迷人眼,溢权昏人智……", + "#starcanxi1": "大势散于天下,全宝玺者其谁?", + "#starcanxi2": "汉祚已僵待死,吾可取而代之。", + "#starpizhi1": "春秋无义,秉笔汗青者,胜者尔。", + "#starpizhi2": "大厦将倾,居危墙之下者,愚夫尔。", + "#starzhonggu1": "既登九五之尊位,何惧为冢中之枯骨?", + "#starzhonggu2": "天下英雄多矣,大浪淘沙,谁不老冢中?", + "#star_yuanshu:die": "英雄不死则已,死则举大名尔……", + "#starsujun1": "将为军魂,需以身作则。", + "#starsujun2": "整肃三军,可育虎贲。", + "#starlifeng1": "锋出百砺,健卒亦如是。", + "#starlifeng2": "强军者,必校之以三九,练之三伏。", + "#star_caoren:die": "濡须之败,此生之耻……", + "#mpjiusong1": "大人以天地为一朝,以万期为须臾。", + "#mpjiusong2": "以天为幕,以地为席!", + "#mpmaotao1": "痛饮酕醄,醉生梦死!", + "#mpmaotao2": "杜康既为酒圣,吾定为醉侯!", + "#mpbishi1": "往矣!吾将曳尾于涂中。", + "#mpbishi2": "仕途多舛,哪有醉卧山野痛快!", + "#mp_liuling:die": "哈……呼……(鼾声渐小)", + "#qingxian1": "抚琴拨弦,悠然自得。", + "#qingxian2": "寄情于琴,合于天地。", + "#juexiang1": "此曲不能绝矣!", + "#juexiang2": "一曲琴音,为我送别。", + "#dc_jikang:die": "多少遗恨,俱随琴音去。", + "#wusheng_dc_jsp_guanyu1": "以义传魂,以武入圣!", + "#wusheng_dc_jsp_guanyu2": "义击逆流,武安黎庶。", + "#danji": null, + "#danji1": "单骑护嫂千里,只为桃园之义!", + "#danji2": "独身远涉,赤心归国!", + "#dc_jsp_guanyu:die": null, + "#dclibang1": "天下熙攘,所为者利尔。", + "#dclibang2": "我有武力傍身,必可待价而沽。", + "#dcwujie1": "腹中有粮则脊自直,非节盈之。", + "#dcwujie2": "气节?可当粟米果腹乎!", + "#dc_mengda:die": "司马老贼害我,诸葛老贼误我……", + "#dcxiuwen1": "书生笔下三尺剑,毫锋可杀人。", + "#dcxiuwen2": "吾以书执剑,可斩世间魍魉。", + "#dclongsong1": "百家诸子,且听九霄龙吟。", + "#dclongsong2": "朗朗书声,岂虚于刀斧铮鸣。", + "#guānning:die": "为国捐生,虽死无憾……", + "#dcniji1": "善战者后动,一击而毙敌。", + "#dcniji2": "我所善者,后发制人尔。", + "#sunhuan:die": "此建功立业之时,奈何……", + "#dctingxian1": "大争之世,当举兵行义。", + "#dctingxian2": "聚兵三千众,可为天下先。", + "#dcbenshi1": "今,或为鱼肉,或为刀俎。", + "#dcbenshi2": "所征徭者必死,可先斩之。", + "#sunlang:die": "为关将军死,无憾……", + "#dccuichuan1": "老臣在,必不使吴垒倾颓。", + "#dccuichuan2": "舍老朽之躯,擎广厦之柱。", + "#dczhengxu1": "陛下怜子无序,此取祸之道。", + "#dczhengxu2": "古语有云,上尊而下卑。", + "#shiyi:die": "吾故后,务从省约……", + "#dcdeshi1": "你我素无仇怨,何故欺之太急。", + "#dcdeshi2": "恃强凌弱,非大丈夫之所为。", + "#dcwuyuan1": "生为关氏之妇,虽死亦不悔。", + "#dcwuyuan2": "我夫关长生,乃盖世之英雄。", + "#huaizi": null, + "#huaizi1": null, + "#huaizi2": null, + "#dc_hujinding:die": "妾不畏死,唯畏君断情。", + "#dcdouzhen1": "擂鼓击柝,庆我兄弟凯旋。", + "#dcdouzhen2": "匹夫欺我江东无人乎。", + "#liyixiejing:die": "蜀军凶猛,虽力战犹不敌……", + "#dcjinjian1": "卑微之人,脊中亦有七寸硬骨!", + "#dcjinjian2": "目不识丁,胸中却含三分浩气!", + "#dcshizhao1": "并无夹带,阁下多心了。", + "#dcshizhao2": "将军多虑,顺安有忤逆之心?", + "#mushun:die": "这,何来的大风?", + "#dcfuning1": "为国效力,不可逞一时之气。", + "#dcfuning2": "诸将和睦,方为国家之幸。", + "#dcbingji1": "权其轻重,而后施令。", + "#dcbingji2": "罪而后赦,以立恩威。", + "#dc_zhaoyǎn:die": "背信食言,当有此劫……", + "#dcruizhan1": "敌势汹汹,当急攻以挫其锐。", + "#dcruizhan2": "威愿领骑兵千人,以破敌前军。", + "#dcshilie1": "荆州七郡,亦有怀义之人!", + "#dcshilie2": "食禄半生,安能弃旧主而去!", + "#wangwei:die": "后有追兵,主公先行!", + "#dcchongyi1": "班虽卑微,亦知何为大义。", + "#dcchongyi2": "大义当头,且助君一臂之力。", + "#dc_huban:die": "行义而亡,虽死无憾。", + "#dcxiaoxi": null, + "#dcxiaoxi1": "夜深枭啼,亡命夺袭!", + "#dcxiaoxi2": "以夜为幕,纵兵逞凶!", + "#xiongrao1": "势如熊罴,威震四海!", + "#xiongrao2": "啸聚熊虎,兔走狐惊!", + "#niufu:die": "胡儿安敢杀我!", + "#dunxi1": "看锤!", + "#dunxi2": "且吃我一锤!", + "#bianxi:die": "以力破巧,难挡其锋……", + "#dcditing1": "奉命查验,还请配合。", + "#dcditing2": "且容我查验一二。", + "#dcbihuo1": "董卓乱政,京师不可久留。", + "#dcbihuo2": "权臣当朝,不如早日脱身。", + "#fengfang:die": "掌控校事,为人所忌。", + "#piaoping1": "奔波四处,前途未明。", + "#piaoping2": "辗转各地,功业难寻。", + "#tuoxian1": null, + "#tuoxian2": "一死一生,乃知交情。", + "#chuaili1": "近况艰难,何不忧愁?", + "#chuaili2": "形势如此,惴惕难当。", + "#qinyilu:die": "我竟落得如此下场……", + "#choutao1": "大恨深仇,此剑讨之!", + "#choutao2": "是非恩怨,此役决之!", + "#xiangshu1": "得道多襄,为公是瞻!", + "#xiangshu2": "愿为中原,永戍北疆!", + "#yanrou:die": "寒风折戍矛,铁衣裹枯骨……", + "#dczhanyi1": "以役兴国,战意磅礴!", + "#dczhanyi2": "此命不已,此战不休!", + "#dc_zhuling:die": "吾,错付曹公……", + "#yijiao1": "不能居下者,终为异教。", + "#yijiao2": "异教兴,而大义危。", + "#qibie1": "今与君别,恍如昨日,不经幽泣。", + "#qibie2": "相逢为君饮,相别为君泣。", + "#licaiwei:die": "我心孔疚,我行不来!", + "#channi1": "此人心怀叵测,将军当拔剑诛之!", + "#channi2": "请夫君听妾身之言,勿为小人所误!", + "#nifu1": "当为贤妻宜室,莫做妒妇祸家。", + "#nifu2": "将军且往沙场驰骋,妾身自有苟全之法。", + "#yanfuren:die": "妾身绝不会害将军呀!", + "#xiongmang1": "力逮千军,唯武为雄!", + "#xiongmang2": "莽行沙场,乱世称雄!", + "#haomeng:die": "曹性,汝欲反我不成?", + "#heqia1": "和洽不基,贵贱无司。", + "#heqia2": "教化大行,天下和洽。", + "#yinyi1": "但求得其栖宿而已,天下非所保也。", + "#yinyi2": "居岘山之南,沔水上,未尝入城府。", + "#re_pangdegong:die": "天地闭,贤人隐。", + "#jieliang": null, + "#jieliang1": "伏兵起,粮道绝!", + "#jieliang2": "粮草根本,截之破敌!", + "#quanjiu1": "大敌当前,怎可松懈畅饮?", + "#quanjiu2": "乌巢重地,不宜饮酒。", + "#hanmeng:die": "曹操狡诈,防不胜防……", + "#fuyuan1": "袁门一体,休戚与共。", + "#fuyuan2": "袁氏荣光,俯仰唯卿。", + "#zhongjie": null, + "#zhongjie1": "义士有忠节,可杀不可量!", + "#zhongjie2": "愿以骨血为饲,事汝君临天下。", + "#yongdi_xinping1": "袁门当兴,兴在明公!", + "#yongdi_xinping2": "主公之位,非君莫属。", + "#xinping:die": "老臣,尽力了……", + "#tianze1": "观天则,以断人事。", + "#tianze2": "乾元用九,乃见天则。", + "#difa": null, + "#difa1": "地蕴天成,微妙玄通。", + "#difa2": "观地之法,吉在其中。", + "#zhangning:die": "全气之地,当葬其止……", + "#chaofeng1": "鸾凤归巢,百鸟齐鸣。", + "#chaofeng2": "鸾凤之响,所闻皆朝。", + "#chuanshu1": "此术不传子,独传于贤。", + "#chuanshu2": "定倾之术,贤者可习之。", + "#tongyuan:die": "一门三杰,无憾矣!", + "#mffengshi_sp_mifangfushiren1": "锋芒之锐,势不可挡!", + "#mffengshi_sp_mifangfushiren2": "势须砥砺,就其锋芒。", + "#sp_mifangfushiren:die": "愧对将军……", + "#gongxiu": null, + "#gongxiu1": "福祸与共,业山可移。", + "#gongxiu2": "修行退智,遂之道也。", + "#jinghe": null, + "#jinghe1": "大哉乾元,万物资始。", + "#jinghe2": "无极之外,复无无极。", + "#re_nanhualaoxian:die": "道亦有穷时……", + "#yise1": "明丽端庄,双瞳剪水。", + "#yise2": "姿色天然,貌若桃李。", + "#shunshi": null, + "#shunshi1": "顺应时运,得保安康。", + "#shunshi2": "随遇而安,宠辱不惊。", + "#dufuren:die": "往事云烟,去日苦多。", + "#xianwei1": "曹家儿郎,何惧一死!", + "#xianwei2": "此役当战,有死无生!", + "#caoanmin:die": "伯父快走!", + "#rehuoshui1": "走不动了嘛?", + "#rehuoshui2": "别走了,再玩一会儿嘛。", + "#reqingcheng1": "我和你们真是投缘呐。", + "#reqingcheng2": "哼,眼睛都直了呀。", + "#re_zoushi:die": "年老色衰了吗……", + "#koulve1": "兵强马壮,时出寇略。", + "#koulve2": "饥则寇略,饱则弃馀。", + "#qljsuiren1": "就交给你了。", + "#qljsuiren2": "我的财富,收好!", + "#qiuliju:die": "乌丸危矣!", + "#redaoji1": "典韦勇猛,盗戟可除。", + "#redaoji2": "你的,就是我的。", + "#fuzhong1": "身负重任,绝无懈怠。", + "#fuzhong2": "勇冠其军,负重前行。", + "#re_hucheer:die": "好快的涯角枪!", + "#xuezhao": null, + "#xuezhao1": "奉旨行事,莫敢不从?", + "#xuezhao2": "衣带密诏,当诛曹公!", + "#re_dongcheng:die": "是谁走漏了风声?", + "#kangge1": "慷慨悲歌,以抗凶逆。", + "#kangge2": "忧惶昼夜,抗之以歌。", + "#jielie1": "节烈之妇,从一而终也!", + "#jielie2": "清闲贞静,守节整齐。", + "#tangji:die": "皇天崩兮后土颓……", + "#dangzai": null, + "#dangzai1": "此处有我,休得放肆!", + "#dangzai2": "退后,让我来!", + "#liangjue": null, + "#liangjue1": "行军者,切不可无粮!", + "#liangjue2": "粮尽援绝,须另谋出路。", + "#zhangheng:die": "军粮匮乏。", + "#langmie": null, + "#langmie1": "群狼四起,灭其一威众。", + "#langmie2": "贪狼强力,寡义而趋利。", + "#duanwei:die": "狼伴其侧,终不胜防。", + "#cuorui1": "区区乌合之众,如何困得住我?!", + "#cuorui2": "今日就让你见识见识老牛的厉害!", + "#liewei1": "敌阵已乱,速速突围!", + "#liewei2": "杀你,如同捻死一只蚂蚁!", + "#re_niujin:die": "这包围圈太厚,老牛,尽力了……", + "#mouni": null, + "#mouni1": "反制于人,不以鄙乎!", + "#mouni2": "与诸君终为敌,吾欲先手。", + "#zongfan": null, + "#zongfan1": "今天下未定,有能者皆可谋之!", + "#zongfan2": "吾以千里之众,当四战之地,可反也!", + "#zhangmiao:die": "独木终难支矣。", + "#lulve1": "趁火打劫,乘危掳掠。", + "#lulve2": "天下大乱,掳掠以自保。", + "#lxzhuixi1": "得势追击,胜望在握!", + "#lxzhuixi2": "诸将得令,追而袭之!", + "#liangxing:die": "夏侯渊,你竟敢!", + "#cslilu1": "乱狱滋丰,以礼赂之。", + "#cslilu2": "微薄之礼,聊表敬意!", + "#csyizheng1": "玉树盈阶,望子成龙!", + "#csyizheng2": "择善者,翊赞季兴。", + "#caosong:die": "孟德,勿忘汝父之仇!", + "#zhaohuo_re_taoqian1": "覆巢之下,安有完卵。", + "#zhaohuo_re_taoqian2": "四战之地,兵连祸结。", + "#yixiang_re_taoqian1": "阿瞒!你可攻的下这徐州城!", + "#yixiang_re_taoqian2": "得道多助,失道寡助!", + "#yirang_re_taoqian1": "百万黎庶,尽嘱明公!", + "#yirang_re_taoqian2": "徐州之主,舍君其谁!", + "#re_taoqian:die": "原知万事空,谁解托州意?", + "#yangzhong1": "宦祸所起,池鱼所终!", + "#yangzhong2": "窃权利己,弄祸殃众!", + "#huangkong1": "满腹忠心,如履薄冰!", + "#huangkong2": "咱家乃皇帝之母,能有什么坏心思?", + "#zhaozhong:die": "咱家忠心可鉴啊!!", + "#hfjieying1": "秉志持节,应时而动。", + "#hfjieying2": "授节于汝,随机应变!", + "#weipo1": "临渊勒马,进退维谷!", + "#weipo2": "前狼后虎,朝不保夕!", + "#hanfu:die": "袁本初,你为何不放过我!", + "#fuqi1": "既来之,休走之!", + "#fuqi2": "白马?哼,定叫他有来无回!", + "#jiaozi1": "今日之获,皆是吾之功劳。", + "#jiaozi2": "今吾于此,尔等皆为飞灰!", + "#re_quyi:die": "为主公戎马一生,主公为何如此对我!", + "#dcjiaoxia1": "青锋绕指柔,将军可愿提头来见?", + "#dcjiaoxia2": "我视诸君如豕犬,杀剐不过覆手之间。", + "#dchumei1": "狐假虎威,以巡山林,可使百兽折膝。", + "#dchumei2": "狐鸣青丘,其声呦呦,自有英雄入幕。", + "#dongxie:die": "新人胜旧人,现在叫人家牛夫人。", + "#minsi1": "能书会记,心思灵巧。", + "#minsi2": "才情兼备,选入掖庭。", + "#jijing1": "吉梦赐福,顺应天命。", + "#jijing2": "梦之指引,必为吉运。", + "#zhuide1": "思美人,两情悦。", + "#zhuide2": "花香蝶恋,君德妾慕。", + "#wangrong:die": "谁能护妾身幼子……", + "#cixiao1": "吾儿奉先,天下无敌!", + "#cixiao2": "父慈子孝,义理为先!", + "#xianshuai1": "九州齐喑,首义瞩吾!", + "#xianshuai2": "雄兵一击,则天下大白!", + "#ol_dingyuan:die": "你我父子,此恩今日断!", + "#mouzhu1": "宦官专权,今必诛之。", + "#mouzhu2": "汝等罪大恶极,快快伏法。", + "#yanhuo1": "乱世,才刚刚开始……", + "#yanhuo2": "你很快就笑不出来了……", + "#re_hejin:die": "不能遗祸世间……", + "#niluan1": "如果不能功成名就,那就干脆为祸一方!", + "#niluan2": "哈哈哈哈哈,天下之事皆无常!", + "#spweiwu1": "凉州寸土,不可拱手让人。", + "#spweiwu2": "明遵旨,暗忤意。", + "#re_hansui:die": "马侄儿为何?啊!!", + "#yujue1": "国库空虚,鬻爵可解。", + "#yujue2": "卖官鬻爵,酣歌畅饮。", + "#tuxing1": "国之兴亡,休戚相关。", + "#tuxing2": "兴业安民,宏图可绘。", + "#liuhong:die": "权利的滋味,让人沉沦。", + "#gongjian1": "善攻者,敌不知其所守。", + "#gongjian2": "围解自出,势必意散。", + "#kuimang1": "黄巾流寇,不过如此。", + "#kuimang2": "黄巾作乱,奉旨平叛!", + "#zhujun:die": "乞降不受,愿一战!", + "#rexiemu1": null, + "#rexiemu2": null, + "#heli1": null, + "#heli2": null, + "#re_maliang:die": "皇叔为何不听我之言?", + "#moying1": null, + "#moying2": null, + "#juanhui1": null, + "#juanhui2": null, + "#caobuxing:die": null, + "#xinfu_langxi1": "袭夺之势,如狼噬骨。", + "#xinfu_langxi2": "引吾至此,怎能不袭掠之?", + "#xinfu_yisuan1": "吾亦能善算谋划。", + "#xinfu_yisuan2": "算计人心,我也可略施一二。", + "#lijue:die": "若无内讧,也不至如此。", + "#xinfu_lveming1": "劫命掠财,毫不费力。", + "#xinfu_lveming2": "人财,皆掠之,哈哈!", + "#xinfu_tunjun1": "得封侯爵,屯军弘农。", + "#xinfu_tunjun2": "屯军弘农,养精蓄锐。", + "#zhangji:die": "哪,哪里来的乱箭?", + "#xinfu_xingluan1": "大兴兵争,长安当乱。", + "#xinfu_xingluan2": "勇猛兴军,乱世当立。", + "#fanchou:die": "唉,稚然,疑心甚重。", + "#xinfu_tanbei1": "此机,我怎么会错失。", + "#xinfu_tanbei2": "你的东西,现在是我的了!", + "#xinfu_sidao1": "连发伺动,顺手可得。", + "#xinfu_sidao2": "伺机而动,此地可窃。", + "#guosi:die": "伍习,你……", + "#xinfu_tunan1": "敢问丞相,何时挥师南下?", + "#xinfu_tunan2": "攻伐之道,一念之间。", + "#xinfu_bijing1": "拒吴闭境,臣誓保永昌!", + "#xinfu_bijing2": "一臣无二主,可战不可降!", + "#lvkai:die": "守节不易,吾愿舍身为蜀。", + "#xinfu_zhenxing1": "东征西讨,募军百里挑一。", + "#xinfu_zhenxing2": "众口铄金,积毁销骨。", + "#xinfu_qianxin1": "兵困绝地,将至如归!", + "#xinfu_qianxin2": "临危之际,速速来援!", + "#zhanggong:die": "大漠孤烟,孤立无援啊……", + "#xinfu_fuhai1": "跨海南征,波涛起浮。", + "#xinfu_fuhai2": "宦海沉浮,生死难料!", + "#weiwenzhugezhi:die": "吾皆海岱清士,岂料生死易逝……", + "#zongkui1": "准备好,听候女王的差遣了吗?", + "#zongkui2": "契约已定!", + "#guju1": "我能看到,你的灵魂在颤抖。", + "#guju2": "你死后,我将超度你的亡魂。", + "#baijia1": "以邪马台的名义!", + "#baijia2": "我要摧毁你的一切,然后建立我的国度。", + "#beimihu:die": "我还会从黄泉比良坂回来的……", + "#xinfu_xionghuo1": "此镬加之于你,定有所伤!", + "#xinfu_xionghuo2": "凶镬沿袭,怎会轻易无伤?", + "#xinfu_shajue1": "杀伐决绝,不留后患。", + "#xinfu_shajue2": "吾即出,必绝之!", + "#xurong:die": "此生无悔,心中无愧。", + "#xinfu_falu1": "求法之道,以司箓籍。", + "#xinfu_falu2": "取舍有法,方得其法。", + "#xinfu_dianhua1": "大道无形,点化无为。", + "#xinfu_dianhua2": "得此点化,必得大道。", + "#xinfu_zhenyi1": "紫薇星辰,斗数之仪。", + "#xinfu_zhenyi2": "不疾不徐,自爱自重。", + "#zhangqiying:die": "米碎面散,我心欲绝……", + "#spwenji1": "还望先生救我!", + "#spwenji2": "言出子口,入于吾耳,可以言未?", + "#sptunjiang1": "江夏冲要之地,孩儿愿往守之。", + "#sptunjiang2": "皇叔勿惊,吾与关将军已到。", + "#sp_liuqi:die": "父亲,孩儿来,见你了。", + "#xinfu_xingzhao": "拿些上好的木料来。", + "#xf_tangzi:die": "偷工减料,要不得啊...", + "#xinfu_dianhu1": "就用你,给我军祭旗!", + "#xinfu_dianhu2": "预则立,不预则废!", + "#xinfu_jianji1": "密计交于将军,可解燃眉之困。", + "#xinfu_jianji2": "锦上添花,不如雪中送炭。", + "#xf_huangquan:die": "魏王厚待于我,降魏又有何错?", + "#xinfu_lianpian1": "心无旁骛,断而敢行!", + "#xinfu_lianpian2": "需持续投入,方有回报。", + "#xf_sufei:die": "恐不能再与兴霸兄……并肩奋战了……", + "#pingjian1": "识人读心,评荐推达。", + "#pingjian2": "月旦雅评,试论天下。", + "#xushao:die": "守节好耻,不可逡巡……", + "#xpchijie1": "此战不在急,请仲达明了。", + "#xpchijie2": "持节阻战,奉帝赐诏。", + "#yinju1": "据理直谏,吾人臣本分。", + "#yinju2": "迁徙之计,危涉万民。", + "#xinpi:die": "失民心,且无食。", + "#lslixun1": "利欲熏心,财权保命。", + "#lslixun2": "利益当前,岂不心动?", + "#lskuizhu1": "与君同谋,赠君金珠。", + "#lskuizhu2": "金珠熠熠,都归将军了。", + "#lisu:die": "金银珠宝再多,也难买命啊。", + "#songshu1": "称颂蜀汉,以表诚心。", + "#songshu2": "吴蜀两和,方可安稳。", + "#sibian1": "弘雅之素,英秀之德。", + "#sibian2": "才藻俊茂,辨思如涌。", + "#zhangwen:die": "暨艳过错,强牵吾罪。", + "#spjiedao1": "我这大刀,可是不看情面的。", + "#spjiedao2": "截头大刀的威力,你来尝尝?", + "#mangyachang:die": "黄骠马也跑不快了……", + "#biaozhao1": "孙策宜加贵宠,须召还京邑!", + "#biaozhao2": "此人有祸患之像,望丞相慎之。", + "#yechou1": "会有人替我报仇的!", + "#yechou2": "我的门客,是不会放过你的!", + "#xugong:die": "终究……还是被其所害……", + "#yanjiao1": "性矜严教,明于教训。", + "#yanjiao2": "会虽童稚,勤见规诲。", + "#xingshen1": "居上不骄,制节谨度。", + "#xingshen2": "君子之行,皆积小以致高大。", + "#zhangchangpu:die": "我还是小看了,孙氏的伎俩……", + "#xiying1": "此番若功不能成,我军恐难以再战。", + "#xiying2": "速袭曹营,以解乌巢之难!", + "#gaolan:die": "郭图小辈之计……误军呐!", + "#gangzhi1": "死便死,降?断不能降!", + "#gangzhi2": "只恨箭支太少,不能射杀汝等!", + "#beizhan1": "今伐曹氏,譬如覆手之举。", + "#beizhan2": "十,则围之;五,则攻之!", + "#sp_shenpei:die": "吾君在北,但求面北而亡。", + "#fenglve1": "汝能比得上我家主公吗?", + "#fenglve2": "将军有让贤之名而身安于泰山也,实乃上策。", + "#mouzhi1": "官渡决战,袁公必胜而曹氏必败。", + "#mouzhi2": "吾既辅佐袁公,定不会使其覆巢。", + "#xunchen:die": "吾欲赴死,断不做背主之事……", + "#yuanlve1": "若不引兵救乌巢,则主公危矣!", + "#yuanlve2": "此番攻之不破,吾属尽成俘虏。", + "#sp_zhanghe:die": "袁公不听吾之言,乃至今日。", + "#spshicai1": "主公不听吾之言,实乃障目不见泰山也!", + "#spshicai2": "遣轻骑以袭许都,大事可成。", + "#spfushi": null, + "#spfushi1": null, + "#spfushi2": null, + "#sp_xuyou:die": "我军之所以败,皆因尔等指挥不当!", + "#cangchu1": "敌袭!速度整军,坚守营寨!", + "#cangchu2": "袁公所托,琼,必当死守!", + "#sushou1": "吾军之所守,为重中之重,尔等、切莫懈怠!", + "#sushou2": "今夜,需再加强巡逻,不要出了差池。", + "#liangying1": "敌袭!速度整军,坚守营寨!", + "#chunyuqiong:die": "子远老贼,吾死当追汝之魂!", + "#liehou1": "识时务者为俊杰。", + "#liehou2": "兄弟齐心,其利断金!", + "#qigong1": "打虎亲兄弟!", + "#qigong2": "丞相有令,尔敢不从?", + "#lvkuanglvxiang:die": "此处可是新野……", +}; diff --git a/character/standard.js b/character/standard.js deleted file mode 100755 index 7b5f1c003..000000000 --- a/character/standard.js +++ /dev/null @@ -1,2928 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "standard", - connect: true, - characterSort: { - standard: { - standard_2008: [ - "caocao", - "simayi", - "xiahoudun", - "zhangliao", - "xuzhu", - "guojia", - "zhenji", - "liubei", - "guanyu", - "zhangfei", - "zhugeliang", - "zhaoyun", - "machao", - "huangyueying", - "sunquan", - "ganning", - "lvmeng", - "huanggai", - "zhouyu", - "daqiao", - "luxun", - "sunshangxiang", - "huatuo", - "lvbu", - "diaochan", - ], - standard_2013: ["old_re_lidian", "huaxiong", "re_yuanshu"], - standard_2019: ["gongsunzan", "xf_yiji"], - standard_2023: ["std_panfeng", "ganfuren"], - }, - }, - character: { - old_re_lidian: ["male", "wei", 3, ["xunxun", "wangxi"], ["die_audio:lidian"]], - ganfuren: ["female", "shu", 3, ["stdshushen", "shenzhi"]], - std_panfeng: ["male", "qun", 4, ["stdkuangfu"]], - caocao: ["male", "wei", 4, ["jianxiong", "hujia"], ["zhu"]], - simayi: ["male", "wei", 3, ["fankui", "guicai"]], - xiahoudun: ["male", "wei", 4, ["ganglie"]], - zhangliao: ["male", "wei", 4, ["tuxi"]], - xuzhu: ["male", "wei", 4, ["luoyi"]], - guojia: ["male", "wei", 3, ["tiandu", "yiji"]], - zhenji: ["female", "wei", 3, ["luoshen", "qingguo"]], - liubei: ["male", "shu", 4, ["rende", "jijiang"], ["zhu"]], - guanyu: ["male", "shu", 4, ["wusheng"]], - zhangfei: ["male", "shu", 4, ["paoxiao"]], - zhugeliang: ["male", "shu", 3, ["guanxing", "kongcheng"]], - zhaoyun: ["male", "shu", 4, ["longdan"]], - machao: ["male", "shu", 4, ["mashu", "tieji"]], - huangyueying: ["female", "shu", 3, ["jizhi", "qicai"]], - sunquan: ["male", "wu", 4, ["zhiheng", "jiuyuan"], ["zhu"]], - ganning: ["male", "wu", 4, ["qixi"]], - lvmeng: ["male", "wu", 4, ["keji"]], - huanggai: ["male", "wu", 4, ["kurou"]], - zhouyu: ["male", "wu", 3, ["yingzi", "fanjian"]], - daqiao: ["female", "wu", 3, ["guose", "liuli"]], - luxun: ["male", "wu", 3, ["qianxun", "lianying"]], - sunshangxiang: ["female", "wu", 3, ["xiaoji", "jieyin"]], - huatuo: ["male", "qun", 3, ["qingnang", "jijiu"]], - lvbu: ["male", "qun", 4, ["wushuang"]], - diaochan: ["female", "qun", 3, ["lijian", "biyue"]], - huaxiong: ["male", "qun", 6, ["yaowu"]], - gongsunzan: ["male", "qun", 4, ["reyicong"]], - - xf_yiji: ["male", "shu", 3, ["xinfu_jijie", "xinfu_jiyuan"], []], - re_yuanshu: ["male", "qun", 4, ["rewangzun", "retongji"]], - }, - characterIntro: { - liubei: "先主姓刘,讳备,字玄德,涿郡涿县人,汉景帝子中山靖王胜之后也。以仁德治天下。", - guanyu: "字云长,本字长生,并州河东解州人。五虎上将之首,爵至汉寿亭侯,谥曰“壮缪侯”。被奉为“关圣帝君”,崇为“武圣”。", - zhangfei: - "字翼德,涿郡人,燕颔虎须,豹头环眼。有诗云:“长坂坡头杀气生,横枪立马眼圆睁。一声好似轰雷震,独退曹家百万兵”。", - zhugeliang: - "字孔明,号卧龙,琅琊阳都人,蜀汉丞相。在世时被封为武乡侯,谥曰忠武侯。著有《出师表》、《诫子书》等。怀不世之才,以空城戏司马,能观星象而通鬼神。", - zhaoyun: "字子龙,常山真定人。身长八尺,姿颜雄伟。长坂坡单骑救阿斗,先主云:“子龙一身都是胆也。”", - machao: "字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。", - huangyueying: - "荆州沔南白水人,沔阳名士黄承彦之女,诸葛亮之妻,诸葛瞻之母。容貌甚丑,而有奇才:上通天文,下察地理,韬略近于诸书无所不晓,诸葛亮在南阳闻其贤而迎娶。", - sunquan: "吴大帝,字仲谋,吴郡富春县人。统领吴与蜀魏三足鼎立,制衡天下。", - ganning: - "字兴霸,巴郡临江人,祖籍荆州南阳郡。为人勇猛刚强,忠心耿耿,勇往无前。曾带兵百人于二更奇袭曹营,大挫其锐气。", - lvmeng: "字子明,汝南富陂人。陈寿评曰:“吕蒙勇而有谋断,识军计,谲郝普,擒关羽,最其妙者。初虽轻果妄杀,终于克己,有国士之量,岂徒武将而已乎!”", - huanggai: - "字公覆,零陵郡泉陵县人。官至偏将军、武陵太守。以苦肉计骗曹孟德,亲往诈降,火烧战船,重创敌军。", - zhouyu: "字公瑾,庐江舒县人,任东吴三军大都督,雄姿英发,人称“美周郎”。赤壁之战前,巧用反间计杀了精通水战的叛将蔡瑁、张允。", - daqiao: "庐江皖县人,为乔公长女,孙策之妻,小乔之姊。与小乔并称为“江东二乔”,容貌国色流离。", - luxun: "本名陆议,字伯言,吴郡吴县人。历任东吴大都督、丞相。吴大帝孙权兄孙策之婿,世代为江东大族。以谦逊之书麻痹关羽,夺取荆州,又有火烧连营大破蜀军。", - sunshangxiang: - "孙夫人,乃孙权之妹。刘备定荆州,孙权进妹与其结姻,重固盟好。孙夫人才捷刚猛,有诸兄之风。后人为其立庙,号曰“枭姬庙”。", - caocao: "魏武帝曹操,字孟德,小名阿瞒、吉利,沛国谯人。精兵法,善诗歌,乃治世之能臣,乱世之奸雄也。", - simayi: "晋宣帝,字仲达,河内温人。曾任职过曹魏的大都督,太尉,太傅。少有奇节,聪明多大略,博学洽闻,伏膺儒教,世之鬼才也。", - xiahoudun: "字元让,沛国谯人。有拔矢啖睛之勇,性格勇猛刚烈。", - zhangliao: - "字文远,魏雁门马邑人。官至前将军、征东将军、晋阳侯。武功高强,又谋略过人,多次建立奇功,以800人突袭孙权十万大军,皆望风披靡。", - xuzhu: "字仲康,谯国谯县人。和典韦一同统率着曹操的亲卫队“虎卫军”。因为他十分勇猛,所以有“虎痴”的绰号。曾有裸衣斗马超之举。", - guojia: "字奉孝,颍川阳翟人,官至军师祭酒。惜天妒英才,英年早逝。有诗云:“良计环环不遗策,每临制变满座惊”。", - zhenji: "中山无极人,别称甄洛或甄宓,庙号文昭甄皇后。魏文帝曹丕的正室。懂诗文,有倾国倾城之貌,《洛神赋》即是曹植为她所作。", - huatuo: "字元化,一名旉,沛国谯人,“建安三神医”之一。集平生之所得著《青囊经》,现已失传。", - lvbu: "字奉先,五原郡九原县人。三国第一猛将,曾独力战刘关张三人,其武力世之无双。时人语曰:“人中有吕布,马中有赤兔。”", - diaochan: - "中国古代四大美女之一,有闭月羞花之貌。司徒王允之义女,由王允授意施行连环计,离间董卓、吕布,借布手除卓。后貂蝉成为吕布的妾。", - huaxiong: - "董卓旗下名将,自荐抵抗山东地区反对董卓的诸侯联军于汜水关前,他先后斩杀济北相鲍信之弟鲍忠和孙坚部将祖茂、以及袁术部将俞涉和韩馥手下潘凤等人,最后关东联军派出关羽与之一对一决斗而被杀。", - - xf_yiji: - "伊籍,字机伯,生卒年不详,兖州山阳郡(今山东金乡县)人,三国时期蜀汉官员。年少时依附于同乡刘表。刘备落难到荆州时,伊籍时常拜访,托请刘备照顾。建安十三年(208年),刘表病死,伊籍便转投刘备,一起渡江南下。建安十六年(211年),刘备入蜀帮助刘璋,伊籍亦有跟随。随后刘备和刘璋双方决裂。建安十九年(214年),刘备平定益州,任命伊籍为左将军从事中郎,其待遇次于简雍、孙乾等。后升任昭文将军,并与诸葛亮、法正、刘巴、李严共同编制《蜀科》。", - }, - perfectPair: { - xiahoudun: ["xiahouyuan"], - zhenji: ["caopi"], - caocao: ["xuzhu", "dianwei", "bianfuren"], - huangzhong: ["weiyan"], - zhugeliang: ["jiangwei", "jiangfei", "huangyueying"], - liubei: ["guanyu", "zhangfei", "ganfuren"], - zhaoyun: ["liushan"], - daqiao: ["xiaoqiao"], - zhouyu: ["huanggai", "xiaoqiao", "zhouyi"], - sunquan: ["zhoutai"], - lvbu: ["diaochan", "lvlingqi"], - machao: ["madai", "mayunlu", "yangwan"], - zhangliao: ["zangba"], - ganning: ["lingtong", "xf_sufei"], - guanyu: ["zhangfei", "liaohua"], - }, - /** @type { importCharacterConfig['skill'] } */ - skill: { - //标准版甘夫人 - stdshushen: { - audio: "shushen", - trigger: { player: "recoverEnd" }, - getIndex(event) { - return event.num || 1; - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("stdshushen"), lib.filter.notMe) - .set("ai", (target) => get.attitude(_status.event.player, target)) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - await target.draw(target.countCards("h") > 0 ? 1 : 2); - }, - ai: { threaten: 0.8, expose: 0.1 }, - }, - stdkuangfu: { - audio: "xinkuangfu", - trigger: { source: "damageSource" }, - forced: true, - usable: 1, - filter(event, player) { - return ( - player.isPhaseUsing() && - event.card && - event.card.name == "sha" && - event.player != player && - event.player.isIn() - ); - }, - async content(event, trigger, player) { - if (trigger.player.hp < player.hp) player.draw(2); - else player.loseHp(); - }, - ai: { - halfneg: true, - }, - }, - rewangzun: { - trigger: { global: "phaseZhunbeiBegin" }, - forced: true, - audio: "wangzun", - filter(event, player) { - return event.player.hp > player.hp; - }, - logTarget: "player", - async content(event, trigger, player) { - player.draw(); - let zhu = false; - const target = trigger.player; - switch (get.mode()) { - case "identity": { - zhu = target.isZhu; - break; - } - case "guozhan": { - zhu = get.is.jun(target); - break; - } - case "versus": { - zhu = target.identity == "zhu"; - break; - } - case "doudizhu": { - zhu = target == game.zhu; - break; - } - } - if (zhu) { - player.draw(); - target.addTempSkill("rewangzun2"); - target.addMark("rewangzun2", 1, false); - } - }, - }, - rewangzun2: { - onremove: true, - mod: { - maxHandcard(player, num) { - return num - player.countMark("rewangzun2"); - }, - }, - intro: { content: "手牌上限-#" }, - }, - retongji: { - trigger: { global: "useCardToTarget" }, - logTarget: "target", - audio: "tongji", - filter(event, player) { - return ( - event.card.name == "sha" && - event.player != player && - !event.targets.includes(player) && - event.target.inRange(player) && - event.target.countCards("he") > 0 - ); - }, - async cost(event, trigger, player) { - const { result } = await trigger.target - .chooseCard( - "he", - "是否对" + get.translation(player) + "发动【同疾】?", - "弃置一张牌,将" + - get.translation(trigger.card) + - "转移给" + - get.translation(player), - lib.filter.cardDiscardable - ) - .set("ai", (card) => { - if (!_status.event.check) return -1; - return get.unuseful(card) + 9; - }) - .set( - "check", - (() => { - if (trigger.target.countCards("h", "shan")) { - return -get.attitude(trigger.target, player); - } - if (get.attitude(trigger.target, player) < 5) { - return 6 - get.attitude(trigger.target, player); - } - if (trigger.target.hp == 1 && player.countCards("h", "shan") == 0) { - return 10 - get.attitude(trigger.target, player); - } - if (trigger.target.hp == 2 && player.countCards("h", "shan") == 0) { - return 8 - get.attitude(trigger.target, player); - } - return -1; - })() > 0 - ); - if (result.bool) { - event.result = { - bool: true, - cost_data: { - cards: result.cards, - }, - }; - } - }, - async content(event, trigger, player) { - trigger.target.discard(event.cost_data.cards); - const evt = trigger.getParent(); - evt.triggeredTargets2.remove(trigger.target); - evt.targets.remove(trigger.target); - evt.targets.push(player); - }, - ai: { - neg: true - }, - }, - hujia: { - audio: 2, - audioname: ["re_caocao"], - unique: true, - zhuSkill: true, - trigger: { player: ["chooseToRespondBefore", "chooseToUseBefore"] }, - filter(event, player) { - if (event.responded) return false; - if (player.storage.hujiaing) return false; - if (!player.hasZhuSkill("hujia")) return false; - if (!event.filterCard({ name: "shan", isCard: true }, player, event)) return false; - return game.hasPlayer((current) => current != player && current.group == "wei"); - }, - check(event, player) { - if (get.damageEffect(player, event.player, player) >= 0) return false; - return true; - }, - async content(event, trigger, player) { - while (true) { - let bool; - if (!event.current) event.current = player.next; - if (event.current == player) return; - else if (event.current.group == "wei") { - if ( - (event.current == game.me && !_status.auto) || - get.attitude(event.current, player) > 2 || - event.current.isOnline() - ) { - player.storage.hujiaing = true; - const next = event.current.chooseToRespond( - "是否替" + get.translation(player) + "打出一张闪?", - { name: "shan" } - ); - next.set("ai", () => { - const event = _status.event; - return get.attitude(event.player, event.source) - 2; - }); - next.set("skillwarn", "替" + get.translation(player) + "打出一张闪"); - next.autochoose = lib.filter.autoRespondShan; - next.set("source", player); - bool = (await next).result.bool; - } - } - player.storage.hujiaing = false; - if (bool) { - trigger.result = { bool: true, card: { name: "shan", isCard: true } }; - trigger.responded = true; - trigger.animate = false; - if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) { - event.current.ai.shown += 0.3; - if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; - } - return; - } else { - event.current = event.current.next; - } - } - }, - ai: { - respondShan: true, - skillTagFilter(player) { - if (player.storage.hujiaing) return false; - if (!player.hasZhuSkill("hujia")) return false; - return game.hasPlayer((current) => current != player && current.group == "wei"); - }, - }, - }, - jianxiong: { - audio: 2, - preHidden: true, - trigger: { player: "damageEnd" }, - filter(event, player) { - return get.itemtype(event.cards) == "cards" && get.position(event.cards[0], true) == "o"; - }, - async content(event, trigger, player) { - player.gain(trigger.cards, "gain2"); - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target(card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; - if (get.tag(card, "damage")) return [1, 0.55]; - }, - }, - }, - }, - fankui: { - audio: 2, - trigger: { player: "damageEnd" }, - logTarget: "source", - preHidden: true, - filter(event, player) { - return ( - event.source && - event.source.countGainableCards(player, event.source != player ? "he" : "e") > 0 && - event.num > 0 - ); - }, - async content(event, trigger, player) { - player.gainPlayerCard(true, trigger.source, trigger.source != player ? "he" : "e"); - }, - ai: { - maixie_defend: true, - effect: { - target(card, player, target) { - if (player.countCards("he") > 1 && get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; - if (get.attitude(target, player) < 0) return [1, 1]; - } - }, - }, - }, - }, - guicai: { - audio: 2, - trigger: { global: "judge" }, - preHidden: true, - filter(event, player) { - return player.countCards(get.mode() == "guozhan" ? "hes" : "hs") > 0; - }, - async cost(event, trigger, player) { - const { - result: { bool, cards }, - } = await player - .chooseCard( - get.translation(trigger.player) + - "的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - "," + - get.prompt("guicai"), - get.mode() == "guozhan" ? "hes" : "hs", - (card) => { - const player = _status.event.player; - const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - const mod = game.checkMod( - card, - player, - "unchanged", - "cardRespondable", - player - ); - if (mod != "unchanged") return mod; - return true; - } - ) - .set("ai", (card) => { - const trigger = _status.event.getTrigger(); - const player = _status.event.player; - const judging = _status.event.judging; - const result = trigger.judge(card) - trigger.judge(judging); - const attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0; - if (attitude > 0) { - return result - get.value(card) / 2; - } else { - return -result - get.value(card) / 2; - } - }) - .set("judging", trigger.player.judging[0]) - .setHiddenSkill("guicai"); - if (bool) event.result = { bool, cost_data: { cards } }; - }, - //技能的logSkill跟着打出牌走 不进行logSkill - popup: false, - async content(event, trigger, player) { - const chooseCardResultCards = event.cost_data.cards; - player.respond(chooseCardResultCards, "guicai", "highlight", "noOrdering"); - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = chooseCardResultCards[0]; - trigger.orderingCards.addArray(chooseCardResultCards); - game.log(trigger.player, "的判定牌改为", chooseCardResultCards[0]); - game.asyncDelay(2); - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - ganglie: { - audio: 2, - trigger: { player: "damageEnd" }, - filter(event, player) { - return event.source != undefined; - }, - check(event, player) { - return get.attitude(player, event.source) <= 0; - }, - logTarget: "source", - async content(event, trigger, player) { - const judgeEvent = player.judge((card) => { - if (get.suit(card) == "heart") return -2; - return 2; - }); - judgeEvent.judge2 = (result) => result.bool; - const { - result: { judge }, - } = await judgeEvent; - if (judge < 2) return; - const { - result: { bool }, - } = await trigger.source.chooseToDiscard(2).set("ai", (card) => { - if (card.name == "tao") return -10; - if (card.name == "jiu" && _status.event.player.hp == 1) return -10; - return get.unuseful(card) + 2.5 * (5 - get.owner(card).hp); - }); - if (bool == false) { - trigger.source.damage(); - } - }, - ai: { - maixie_defend: true, - effect: { - target(card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; - return 0.8; - // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; - }, - }, - }, - }, - ganglie_three: { - audio: "ganglie", - trigger: { player: "damageEnd" }, - async cost(event, trigger, player) { - const { result } = await player - .chooseTarget(get.prompt2("ganglie_three"), (card, player, target) => { - return target.isEnemyOf(player); - }) - .set("ai", (target) => { - return ( - -get.attitude(_status.event.player, target) / - Math.sqrt(1 + target.countCards("h")) - ); - }); - event.result = result; - }, - async content(event, trigger, player) { - event.target = event.targets[0]; - player.logSkill("ganglie_three", event.target); - const judgeEvent = player.judge((card) => { - if (get.suit(card) == "heart") return -2; - return 2; - }); - judgeEvent.judge2 = (result) => result.bool; - const { - result: { judge }, - } = await judgeEvent; - if (judge < 2) return; - const { - result: { bool: chooseToDiscardResultBool }, - } = await event.target.chooseToDiscard(2).set("ai", (card) => { - if (card.name == "tao") return -10; - if (card.name == "jiu" && _status.event.player.hp == 1) return -10; - return get.unuseful(card) + 2.5 * (5 - get.owner(card).hp); - }); - if (chooseToDiscardResultBool === false) { - event.target.damage(); - } - }, - ai: { - maixie_defend: true, - effect: { - target(card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; - return 0.8; - // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; - }, - }, - }, - }, - tuxi: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter(event, player) { - return !event.numFixed; - }, - async cost(event, trigger, player) { - let num = game.countPlayer( - (current) => - current != player && current.countCards("h") > 0 && get.attitude(player, current) <= 0 - ); - let check = num >= 2; - const { result } = await player - .chooseTarget( - get.prompt("tuxi"), - "获得其他一至两名角色的各一张手牌", - [1, 2], - (card, player, target) => { - return target.countCards("h") > 0 && player != target; - }, - (target) => { - if (!_status.event.aicheck) return 0; - const att = get.attitude(_status.event.player, target); - if (target.hasSkill("tuntian")) return att / 10; - return 1 - att; - } - ) - .set("aicheck", check); - event.result = result; - }, - async content(event, trigger, player) { - player.gainMultiple(event.targets); - trigger.changeToZero(); - game.asyncDelay(); - }, - ai: { - threaten: 2, - expose: 0.3, - }, - }, - luoyi: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - check(event, player) { - if (player.skipList.includes("phaseUse") || player.countCards("h") < 3) return false; - if (!player.hasSha()) return false; - return game.hasPlayer( - (current) => get.attitude(player, current) < 0 && player.canUse("sha", current) - ); - }, - preHidden: true, - filter(event, player) { - return !event.numFixed && event.num > 0; - }, - async content(event, trigger, player) { - player.addTempSkill("luoyi2", "phaseJieshuBegin"); - trigger.num--; - }, - }, - luoyi2: { - trigger: { source: "damageBegin1" }, - filter(event) { - return ( - event.card && - (event.card.name == "sha" || event.card.name == "juedou") && - event.notLink() - ); - }, - forced: true, - async content(event, trigger, player) { - trigger.num++; - }, - ai: { - damageBonus: true, - }, - }, - tiandu: { - audio: 2, - audioname: ["re_guojia", "xizhicai", "gz_nagisa"], - trigger: { player: "judgeEnd" }, - preHidden: true, - frequent(event) { - //if(get.mode()=='guozhan') return false; - return event.result.card.name !== "du"; - }, - check(event) { - return event.result.card.name !== "du"; - }, - filter(event, player) { - return get.position(event.result.card, true) == "o"; - }, - async content(event, trigger, player) { - player.gain(trigger.result.card, "gain2"); - }, - }, - yiji: { - audio: 2, - trigger: { player: "damageEnd" }, - frequent: true, - filter(event) { - return event.num > 0; - }, - getIndex(event, player, triggername) { - return event.num; - }, - async content(event, trigger, player) { - const { cards } = await game.cardsGotoOrdering(get.cards(2)); - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - if (!cards.length) return; - // event.goto -> do while - do { - const { - result: { bool, links }, - } = - cards.length == 1 - ? { result: { links: cards.slice(0), bool: true } } - : await player - .chooseCardButton("遗计:请选择要分配的牌", true, cards, [ - 1, - cards.length, - ]) - .set("ai", () => { - if (ui.selected.buttons.length == 0) return 1; - return 0; - }); - if (!bool) return; - cards.removeArray(links); - event.togive = links.slice(0); - const { - result: { targets }, - } = await player - .chooseTarget("选择一名角色获得" + get.translation(links), true) - .set("ai", (target) => { - const att = get.attitude(_status.event.player, target); - if (_status.event.enemy) { - return -att; - } else if (att > 0) { - return att / (1 + target.countCards("h")); - } else { - return att / 100; - } - }) - .set("enemy", get.value(event.togive[0], player, "raw") < 0); - if (targets.length) { - const id = targets[0].playerid, - map = event.given_map; - if (!map[id]) map[id] = []; - map[id].addArray(event.togive); - } - } while (cards.length > 0); - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - const list = []; - for (const i in event.given_map) { - const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) - player.addExpose(0.2); - list.push([source, event.given_map[i]]); - } - game.loseAsync({ - gain_list: list, - giver: player, - animate: "draw", - }).setContent("gaincardMultiple"); - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target(card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - let num = 1; - if (get.attitude(player, target) > 0) { - if (player.needsToDiscard()) num = 0.7; - else num = 0.5; - } - if (target.hp >= 4) return [1, num * 2]; - if (target.hp == 3) return [1, num * 1.5]; - if (target.hp == 2) return [1, num * 0.5]; - } - }, - }, - }, - }, - luoshen: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - frequent: true, - preHidden: true, - async content(event, trigger, player) { - while (true) { - if (event.cards == undefined) event.cards = []; - const judgeEvent = player.judge((card) => { - if (get.color(card) == "black") return 1.5; - return -1.5; - }); - judgeEvent.judge2 = (result) => result.bool; - if (get.mode() != "guozhan" && !player.hasSkillTag("rejudge")) - judgeEvent.set("callback", async (event) => { - if ( - event.judgeResult.color == "black" && - get.position(event.card, true) == "o" - ) - await player.gain(event.card, "gain2"); - }); - else - judgeEvent.set("callback", async (event) => { - if (event.judgeResult.color == "black") - event.getParent().orderingCards.remove(event.card); - }); - const { - result: { judge, card }, - } = await judgeEvent; - let bool; - if (judge > 0) { - event.cards.push(card); - bool = ( - await player - .chooseBool("是否再次发动【洛神】?") - .set("frequentSkill", "luoshen") - ).result.bool; - } else { - for (let 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"); - } - return; - } - if (!bool) { - if (event.cards.length) { - player.gain(event.cards, "gain2"); - } - return; - } - } - }, - }, - xinluoshen: { - audio: "luoshen", - // alter:true, - trigger: { player: "phaseZhunbeiBegin" }, - frequent: true, - async content(event, trigger, player) { - while (true) { - if (event.cards == undefined) event.cards = []; - const judgeEvent = player.judge((card) => { - if (get.color(card) == "black") return 1.5; - return -1.5; - }, ui.special); - judgeEvent.judge2 = (result) => result.bool; - const { - result: { judge, card }, - } = await judgeEvent; - let bool; - if (judge > 0) { - event.cards.push(card); - bool = lib.config.autoskilllist.includes("luoshen") - ? (await player.chooseBool("是否再次发动【洛神】?")).result.bool - : true; - } else { - for (let i = 0; i < event.cards.length; i++) { - if (get.position(event.cards[i]) != "s") { - event.cards.splice(i, 1); - i--; - } - } - player.gain(event.cards, "gain2"); - player.storage.xinluoshen = event.cards.slice(0); - return; - } - if (!bool) { - if (event.cards.length) { - player.gain(event.cards, "gain2"); - player.storage.xinluoshen = event.cards.slice(0); - return; - } - } - } - }, - mod: { - ignoredHandcard(card, player) { - if ( - get.is.altered("xinluoshen") && - player.storage.xinluoshen && - player.storage.xinluoshen.includes(card) - ) { - return true; - } - }, - }, - group: "xinluoshen_clear", - subSkill: { - clear: { - trigger: { player: "phaseAfter" }, - silent: true, - async content(event, trigger, player) { - delete player.storage.xinluoshen; - }, - }, - }, - }, - qingguo: { - mod: { - aiValue(player, card, num) { - if (get.name(card) != "shan" && get.color(card) != "black") return; - const cards = player.getCards( - "hs", - (card) => get.name(card) == "shan" || get.color(card) == "black" - ); - cards.sort((a, b) => { - return (get.name(b) == "shan" ? 1 : 2) - (get.name(a) == "shan" ? 1 : 2); - }); - const geti = () => { - if (cards.includes(card)) cards.indexOf(card); - return cards.length; - }; - if (get.name(card) == "shan") - return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; - return Math.max(num, [6.5, 4, 3][Math.min(geti(), 2)]); - }, - aiUseful() { - return lib.skill.qingguo.mod.aiValue.apply(this, arguments); - }, - }, - locked: false, - audio: 2, - audioname: ["sb_zhenji"], - enable: ["chooseToRespond", "chooseToUse"], - filterCard(card) { - return get.color(card) == "black"; - }, - viewAs: { name: "shan" }, - viewAsFilter(player) { - if (!player.countCards("hs", { color: "black" })) return false; - }, - position: "hs", - prompt: "将一张黑色手牌当闪使用或打出", - check() { - return 1; - }, - ai: { - order: 3, - respondShan: true, - skillTagFilter(player) { - if (!player.countCards("hs", { color: "black" })) return false; - }, - effect: { - target(card, player, target, current) { - if (get.tag(card, "respondShan") && current < 0) return 0.6; - }, - }, - }, - }, - rende: { - audio: 2, - enable: "phaseUse", - filterCard: true, - selectCard: [1, Infinity], - discard: false, - lose: false, - delay: 0, - filterTarget(card, player, target) { - return player != target; - }, - check(card) { - if (ui.selected.cards.length > 1) return 0; - if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; - if (!ui.selected.cards.length && card.name == "du") return 20; - const player = get.owner(card); - let num = 0; - const evt2 = _status.event.getParent(); - player.getHistory("lose", (evt) => { - if (evt.getParent().skill == "rende" && evt.getParent(3) == evt2) - num += evt.cards.length; - }); - if (player.hp == player.maxHp || num > 1 || player.countCards("h") <= 1) { - if (ui.selected.cards.length) { - return -1; - } - const players = game.filterPlayer(); - for (let 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); - }, - async content(event, trigger, player) { - const evt2 = event.getParent(3); - let num = 0; - player.getHistory("lose", (evt) => { - if (evt.getParent(2).name == "rende" && evt.getParent(5) == evt2) - num += evt.cards.length; - }); - player.give(event.cards, event.target); - if (num < 2 && num + event.cards.length > 1) player.recover(); - }, - ai: { - order(skill, player) { - if ( - player.hp < player.maxHp && - player.storage.rende < 2 && - player.countCards("h") > 1 - ) { - return 10; - } - return 1; - }, - result: { - target(player, target) { - if (target.hasSkillTag("nogain")) return 0; - if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { - return target.hasSkillTag("nodu") ? 0 : -10; - } - if (target.hasJudge("lebu")) return 0; - const nh = target.countCards("h"); - const np = player.countCards("h"); - if ( - player.hp == player.maxHp || - player.storage.rende < 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(card, player, target) { - if (player == target && get.type(card) == "equip") { - if (player.countCards("e", { subtype: get.subtype(card) })) { - const players = game.filterPlayer(); - for (let i = 0; i < players.length; i++) { - if (players[i] != player && get.attitude(player, players[i]) > 0) { - return 0; - } - } - } - } - }, - }, - threaten: 0.8, - }, - }, - rende1: { - trigger: { player: "phaseUseBegin" }, - silent: true, - async content(event, trigger, player) { - player.storage.rende = 0; - }, - }, - jijiang: { - audio: "jijiang1", - audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], - unique: true, - group: ["jijiang1"], - zhuSkill: true, - filter(event, player) { - if ( - !player.hasZhuSkill("jijiang") || - !game.hasPlayer((current) => current != player && current.group == "shu") - ) - return false; - return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3")); - }, - enable: ["chooseToUse", "chooseToRespond"], - viewAs: { name: "sha" }, - filterCard() { - return false; - }, - selectCard: -1, - ai: { - order() { - return get.order({ name: "sha" }) + 0.3; - }, - respondSha: true, - skillTagFilter(player) { - if ( - !player.hasZhuSkill("jijiang") || - !game.hasPlayer((current) => current != player && current.group == "shu") - ) - return false; - }, - }, - }, - jijiang1: { - audio: 2, - audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], - trigger: { player: ["useCardBegin", "respondBegin"] }, - logTarget: "targets", - filter(event, player) { - return event.skill == "jijiang"; - }, - forced: true, - async content(event, trigger, player) { - delete trigger.skill; - trigger.getParent().set("jijiang", true); - while (true) { - if (event.current == undefined) event.current = player.next; - if (event.current == player) { - player.addTempSkill("jijiang3"); - trigger.cancel(); - trigger.getParent().goto(0); - return; - } else if (event.current.group == "shu") { - const chooseToRespondEvent = event.current.chooseToRespond( - "是否替" + get.translation(player) + "打出一张杀?", - { name: "sha" } - ); - chooseToRespondEvent.set("ai", () => { - const event = _status.event; - return get.attitude(event.player, event.source) - 2; - }); - chooseToRespondEvent.set("source", player); - chooseToRespondEvent.set("jijiang", true); - chooseToRespondEvent.set( - "skillwarn", - "替" + get.translation(player) + "打出一张杀" - ); - chooseToRespondEvent.noOrdering = true; - chooseToRespondEvent.autochoose = lib.filter.autoRespondSha; - const { bool, card, cards } = (await chooseToRespondEvent).result; - if (bool) { - trigger.card = card; - trigger.cards = cards; - trigger.throw = false; - if ( - typeof event.current.ai.shown == "number" && - event.current.ai.shown < 0.95 - ) { - event.current.ai.shown += 0.3; - if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; - } - return; - } else event.current = event.current.next; - } else event.current = event.current.next; - } - }, - }, - jijiang3: { - trigger: { global: ["useCardAfter", "useSkillAfter", "phaseAfter"] }, - silent: true, - charlotte: true, - filter(event) { - return event.skill != "jijiang" && event.skill != "qinwang"; - }, - async content(event, trigger, player) { - player.removeSkill("jijiang3"); - }, - }, - wusheng: { - audio: 2, - audioname2: { - old_guanzhang: "old_fuhun", - old_guanyu: "wusheng_re_guanyu", - }, - audioname: [ - "re_guanyu", - "guanzhang", - "jsp_guanyu", - "guansuo", - "re_guanzhang", - "dc_jsp_guanyu", - ], - enable: ["chooseToRespond", "chooseToUse"], - filterCard(card, player) { - if (get.zhu(player, "shouyue")) return true; - return get.color(card) == "red"; - }, - position: "hes", - viewAs: { name: "sha" }, - viewAsFilter(player) { - if (get.zhu(player, "shouyue")) { - if (!player.countCards("hes")) return false; - } else { - if (!player.countCards("hes", { color: "red" })) return false; - } - }, - prompt: "将一张红色牌当杀使用或打出", - check(card) { - const val = get.value(card); - if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); - return 5 - val; - }, - ai: { - skillTagFilter(player) { - if (get.zhu(player, "shouyue")) { - if (!player.countCards("hes")) return false; - } else { - if (!player.countCards("hes", { color: "red" })) return false; - } - }, - respondSha: true, - }, - }, - wusheng_re_guanyu: { audio: 2 }, - zhongyi: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "orange", - filterCard: true, - position: "he", - filter(event, player) { - return player.countCards("he") > 0; - }, - discard: false, - lose: false, - async content(event, trigger, player) { - player.awakenSkill("zhongyi"); - player.addTempSkill("zhongyi2", "roundStart"); - player.addToExpansion(player, "give", event.cards).gaintag.add("zhongyi2"); - }, - }, - zhongyi2: { - trigger: { global: "damageBegin1" }, - forced: true, - popup: false, - logTarget: "source", - filter(event, player) { - return event.getParent().name == "sha" && event.source && event.source.isFriendOf(player); - }, - async content(event, trigger, player) { - trigger.num++; - }, - intro: { content: "expansion", markcount: "expansion" }, - onremove(player, skill) { - const cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - }, - paoxiao: { - audio: 2, - firstDo: true, - audioname: ["re_zhangfei", "guanzhang", "xiahouba"], - audioname2: { - old_guanzhang: "old_fuhun", - dc_xiahouba: "paoxiao_xiahouba", - }, - trigger: { player: "useCard1" }, - forced: true, - filter(event, player) { - return ( - !event.audioed && - event.card.name == "sha" && - player.countUsed("sha", true) > 1 && - event.getParent().type == "phase" - ); - }, - async content(event, trigger, player) { - trigger.audioed = true; - }, - mod: { - cardUsable(card, player, num) { - if (card.name == "sha") return Infinity; - }, - }, - ai: { - unequip: true, - skillTagFilter(player, tag, arg) { - if (!get.zhu(player, "shouyue")) return false; - if (arg && arg.name == "sha") return true; - return false; - }, - }, - }, - paoxiao_xiahouba: { audio: 2 }, - guanxing_fail: {}, - guanxing: { - audio: 2, - audioname: ["jiangwei", "re_jiangwei", "re_zhugeliang", "ol_jiangwei"], - trigger: { player: "phaseZhunbeiBegin" }, - frequent: true, - preHidden: true, - async content(event, trigger, player) { - const num = - player.hasSkill("yizhi") && player.hasSkill("guanxing") - ? 5 - : Math.min(5, game.countPlayer()); - const cards = get.cards(num); - game.cardsGotoOrdering(cards); - const next = player.chooseToMove(); - next.set("list", [["牌堆顶", cards], ["牌堆底"]]); - next.set("prompt", "观星:点击将牌移动到牌堆顶或牌堆底"); - next.processAI = (list) => { - const cards = list[0][1], - player = _status.event.player; - const top = []; - const judges = player.getCards("j"); - let stopped = false; - if (!player.hasWuxie()) { - for (let i = 0; i < judges.length; i++) { - const judge = get.judge(judges[i]); - cards.sort((a, b) => judge(b) - judge(a)); - if (judge(cards[0]) < 0) { - stopped = true; - break; - } else { - top.unshift(cards.shift()); - } - } - } - let bottom; - if (!stopped) { - cards.sort((a, b) => 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]; - }; - const { - result: { moved }, - } = await next; - const top = moved[0]; - const bottom = moved[1]; - top.reverse(); - game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { - if (event.top_cards.includes(card)) return ui.cardPile.firstChild; - return null; - }); - player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); - game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); - game.asyncDelayx(); - }, - ai: { - threaten: 1.2, - }, - }, - kongcheng: { - mod: { - targetEnabled(card, player, target, now) { - if (target.countCards("h") == 0) { - if (card.name == "sha" || card.name == "juedou") return false; - } - }, - }, - group: "kongcheng1", - audio: "kongcheng1", - audioname: ["re_zhugeliang"], - ai: { - noh: true, - skillTagFilter(player, tag) { - if (tag == "noh") { - if (player.countCards("h") != 1) return false; - } - }, - }, - }, - kongcheng1: { - audio: 2, - trigger: { player: "loseEnd" }, - forced: true, - firstDo: true, - audioname: ["re_zhugeliang"], - filter(event, player) { - if (player.countCards("h")) return false; - for (let i = 0; i < event.cards.length; i++) { - if (event.cards[i].original == "h") return true; - } - return false; - }, - async content() {}, - }, - longdan: { - audio: "longdan_sha", - audioname: ["re_zhaoyun"], - group: ["longdan_sha", "longdan_shan", "longdan_draw"], - subSkill: { - draw: { - trigger: { player: ["useCard", "respond"] }, - forced: true, - popup: false, - filter(event, player) { - if (!get.zhu(player, "shouyue")) return false; - return event.skill == "longdan_sha" || event.skill == "longdan_shan"; - }, - async content(event, trigger, player) { - player.draw(); - player.storage.fanghun2++; - }, - }, - sha: { - audio: 2, - audioname: ["re_zhaoyun"], - enable: ["chooseToUse", "chooseToRespond"], - filterCard: { name: "shan" }, - viewAs: { name: "sha" }, - viewAsFilter(player) { - if (!player.countCards("hs", "shan")) return false; - }, - position: "hs", - prompt: "将一张闪当杀使用或打出", - check() { - return 1; - }, - ai: { - effect: { - target(card, player, target, current) { - if (get.tag(card, "respondSha") && current < 0) return 0.6; - }, - }, - respondSha: true, - skillTagFilter(player) { - if (!player.countCards("hs", "shan")) return false; - }, - order() { - return get.order({ name: "sha" }) + 0.1; - }, - useful: -1, - value: -1, - }, - }, - shan: { - audio: "longdan_sha", - audioname: ["re_zhaoyun"], - enable: ["chooseToRespond", "chooseToUse"], - filterCard: { name: "sha" }, - viewAs: { name: "shan" }, - prompt: "将一张杀当闪使用或打出", - check() { - return 1; - }, - position: "hs", - viewAsFilter(player) { - if (!player.countCards("hs", "sha")) return false; - }, - ai: { - respondShan: true, - skillTagFilter(player) { - if (!player.countCards("hs", "sha")) return false; - }, - effect: { - target(card, player, target, current) { - if (get.tag(card, "respondShan") && current < 0) return 0.6; - }, - }, - order: 4, - useful: -1, - value: -1, - }, - }, - }, - }, - mashu: { - mod: { - globalFrom(from, to, distance) { - return distance - 1; - }, - }, - }, - mashu2: { - mod: { - globalFrom(from, to, distance) { - return distance - 1; - }, - }, - }, - feiying: { - mod: { - globalTo(from, to, distance) { - return distance + 1; - }, - }, - }, - tieji: { - audio: 2, - shaRelated: true, - trigger: { player: "useCardToPlayered" }, - check(event, player) { - return get.attitude(player, event.target) <= 0; - }, - filter(event, player) { - return event.card.name == "sha"; - }, - logTarget: "target", - preHidden: true, - async content(event, trigger, player) { - const judgeEvent = player.judge((card) => { - if (get.zhu(_status.event.player, "shouyue")) { - if (get.suit(card) != "spade") return 2; - } else { - if (get.color(card) == "red") return 2; - } - return -0.5; - }); - judgeEvent.judge2 = (result) => result.bool; - const { - result: { bool }, - } = await judgeEvent; - if (bool) { - trigger.getParent().directHit.add(trigger.target); - } - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if ( - get.attitude(player, arg.target) > 0 || - arg.card.name != "sha" || - !ui.cardPile.firstChild || - get.color(ui.cardPile.firstChild, player) != "red" - ) - return false; - }, - }, - }, - jizhi: { - audio: 2, - audioname: ["jianyong"], - trigger: { player: "useCard" }, - frequent: true, - preHidden: true, - filter(event) { - return get.type(event.card) == "trick" && event.card.isCard; - }, - async content(event, trigger, player) { - player.draw(); - }, - ai: { - threaten: 1.4, - noautowuxie: true, - }, - }, - xinjizhi: { - audio: "jizhi", - trigger: { player: "useCard" }, - frequent: true, - // alter:true, - filter(event) { - if (get.type(event.card) == "delay") return false; - return ( - get.type(event.card, "trick") == "trick" && - event.cards[0] && - event.cards[0] == event.card - ); - }, - async content(event, trigger, player) { - player.draw(); - }, - ai: { - threaten: 1.4, - noautowuxie: true, - }, - }, - qicai: { - mod: { - targetInRange(card, player, target, now) { - if (["trick", "delay"].includes(get.type(card))) return true; - }, - }, - }, - xinqicai: { - // alter:true, - mod: { - targetInRange(card, player, target, now) { - if (["trick", "delay"].includes(get.type(card))) return true; - }, - }, - }, - xinzhiheng: { - audio: "zhiheng", - mod: { - aiOrder(player, card, num) { - if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip") - return num; - let eq = player.getEquip(get.subtype(card)); - if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp)) - return 0; - }, - }, - locked: false, - enable: "phaseUse", - // alter:true, - usable: 1, - position: "he", - filterCard: true, - selectCard: [1, Infinity], - check(card) { - const player = _status.event.player; - if ( - get.is.altered("xinzhiheng") && - get.position(card) == "h" && - !player.countCards("h", (card) => get.value(card) >= 8) - ) { - return 8 - get.value(card); - } - return 6 - get.value(card); - }, - delay: 0, - async content(event, trigger, player) { - if (!player.hasSkill("xinzhiheng_delay")) game.asyncDelayx(); - player.draw(event.cards.length); - }, - group: "xinzhiheng_draw", - subSkill: { - draw: { - trigger: { player: "loseEnd" }, - silent: true, - filter(event, player) { - if (event.getParent(2).skill != "xinzhiheng") return false; - if (!get.is.altered("xinzhiheng")) return false; - if (player.countCards("h")) return false; - for (let i = 0; i < event.cards.length; i++) { - if (event.cards[i].original == "h") return true; - } - return false; - }, - async content(event, trigger, player) { - player.draw(); - player.addTempSkill("xinzhiheng_delay", "xinzhihengAfter"); - }, - }, - delay: {}, - }, - ai: { - order(item, player) { - if (player.hasCard((i) => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; - return 10; - }, - result: { - player: 1, - }, - nokeep: true, - skillTagFilter(player, tag, arg) { - if (tag === "nokeep") - return ( - (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && - player.isPhaseUsing() && - !player.getStat().skill.xinzhiheng && - player.hasCard((card) => get.name(card) !== "tao", "h") - ); - }, - threaten: 1.55, - }, - }, - zhiheng: { - audio: 2, - audioname: ["gz_jun_sunquan"], - mod: { - aiOrder(player, card, num) { - if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip") - return num; - let eq = player.getEquip(get.subtype(card)); - if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp)) - return 0; - }, - }, - locked: false, - enable: "phaseUse", - usable: 1, - position: "he", - filterCard: true, - selectCard: [1, Infinity], - prompt: "弃置任意张牌并摸等量的牌", - check(card) { - return 6 - get.value(card); - }, - async content(event, trigger, player) { - player.draw(event.cards.length); - }, - ai: { - order: 1, - result: { - player: 1, - }, - threaten: 1.5, - }, - }, - jiuyuan: { - audio: 2, - unique: true, - trigger: { target: "taoBegin" }, - zhuSkill: true, - forced: true, - filter(event, player) { - if (event.player == player) return false; - if (!player.hasZhuSkill("jiuyuan")) return false; - if (event.player.group != "wu") return false; - return true; - }, - async content(event, trigger, player) { - trigger.baseDamage++; - }, - }, - xinjiuyuan: { - audio: "jiuyuan", - unique: true, - // alter:true, - trigger: { target: "taoBegin" }, - zhuSkill: true, - forced: true, - filter(event, player) { - if (get.is.altered("xinjiuyuan")) return false; - if (event.player == player) return false; - if (!player.hasZhuSkill("jiuyuan")) return false; - if (player.hp > 0) return false; - if (event.player.group != "wu") return false; - return true; - }, - async content(event, trigger, player) { - player.recover(); - }, - global: "xinjiuyuan2", - }, - xinjiuyuan2: { - audio: "jiuyuan", - forceaudio: true, - trigger: { player: "taoBegin" }, - filter(event, player) { - if (!get.is.altered("xinjiuyuan")) return false; - if (player.group != "wu") return false; - return game.hasPlayer((target) => { - return ( - player != target && - target.isDamaged() && - target.hp < player.hp && - target.hasZhuSkill("xinjiuyuan", player) - ); - }); - }, - direct: true, - async content(event, trigger, player) { - event.list = game - .filterPlayer( - (target) => - player != target && - target.isDamaged() && - target.hp < player.hp && - target.hasZhuSkill("xinjiuyuan", player) - ) - .sortBySeat(); - while (event.list.length > 0) { - const current = event.list.shift(); - event.current = current; - const { - result: { bool }, - } = await player - .chooseBool(get.prompt("xinjiuyuan", current)) - .set("choice", get.attitude(player, current) > 0); - if (bool) { - player.logSkill("xinjiuyuan", event.current); - event.current.recover(); - player.draw(); - } - } - }, - }, - qixi: { - audio: 2, - audioname: ["re_ganning", "re_heqi"], - enable: "chooseToUse", - filterCard(card) { - return get.color(card) == "black"; - }, - position: "hes", - viewAs: { name: "guohe" }, - viewAsFilter(player) { - if (!player.countCards("hes", { color: "black" })) return false; - }, - prompt: "将一张黑色牌当过河拆桥使用", - check(card) { - return 4 - get.value(card); - }, - }, - keji: { - audio: 2, - audioname: ["re_lvmeng", "sp_lvmeng"], - trigger: { player: "phaseDiscardBefore" }, - frequent(event, player) { - return player.needsToDiscard(); - }, - filter(event, player) { - if (player.getHistory("skipped").includes("phaseUse")) return true; - const history = player.getHistory("useCard").concat(player.getHistory("respond")); - for (let i = 0; i < history.length; i++) { - if (history[i].card.name == "sha" && history[i].isPhaseUsing()) return false; - } - return true; - }, - async content(event, trigger, player) { - trigger.cancel(); - }, - }, - kurou: { - audio: 2, - enable: "phaseUse", - prompt: "失去1点体力并摸两张牌", - async content(event, trigger, player) { - player.loseHp(1); - player.draw(2); - }, - ai: { - basic: { - order: 1, - }, - result: { - player(player) { - if (player.countCards("h") >= player.hp - 1) return -1; - if (player.hp < 3) return -1; - return 1; - }, - }, - }, - }, - yingzi: { - audio: 2, - audioname: ["sp_lvmeng"], - trigger: { player: "phaseDrawBegin2" }, - frequent: true, - filter(event, player) { - return !event.numFixed; - }, - async content(event, trigger, player) { - trigger.num++; - }, - ai: { - threaten: 1.3, - }, - }, - fanjian: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter(event, player) { - return player.countCards("h") > 0; - }, - filterTarget(card, player, target) { - return player != target; - }, - async content(event, trigger, player) { - const target = event.target; - const control = await target - .chooseControl("heart2", "diamond2", "club2", "spade2") - .set("ai", (event) => { - switch (Math.floor(Math.random() * 6)) { - case 0: - return "heart2"; - case 1: - case 4: - case 5: - return "diamond2"; - case 2: - return "club2"; - case 3: - return "spade2"; - } - }) - .forResultControl(); - game.log(target, "选择了" + get.translation(control)); - event.choice = control; - target.chat("我选" + get.translation(event.choice)); - const { - result: { bool, cards }, - } = await target.gainPlayerCard(player, true, "h"); - if (bool && get.suit(cards[0], player) + "2" != event.choice) target.damage("nocard"); - }, - ai: { - order: 1, - result: { - target(player, target) { - const eff = get.damageEffect(target, player); - if (eff >= 0) return 1 + eff; - let value = 0, - i; - const cards = player.getCards("h"); - for (i = 0; i < cards.length; i++) value += get.value(cards[i]); - value /= player.countCards("h"); - if (target.hp == 1) return Math.min(0, value - 7); - return Math.min(0, value - 5); - }, - }, - }, - }, - guose: { - audio: 2, - filter(event, player) { - return player.countCards("hes", { suit: "diamond" }) > 0; - }, - enable: "chooseToUse", - filterCard(card) { - return get.suit(card) == "diamond"; - }, - position: "hes", - viewAs: { name: "lebu" }, - prompt: "将一张方片牌当乐不思蜀使用", - check(card) { - return 6 - get.value(card); - }, - ai: { - threaten: 1.5, - }, - }, - liuli: { - audio: 2, - audioname: ["re_daqiao", "daxiaoqiao"], - trigger: { target: "useCardToTarget" }, - preHidden: true, - filter(event, player) { - if (event.card.name != "sha") return false; - if (player.countCards("he") == 0) return false; - return game.hasPlayer((current) => { - return ( - player.inRange(current) && - current != event.player && - current != player && - lib.filter.targetEnabled(event.card, event.player, current) - ); - }); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseCardTarget({ - position: "he", - filterCard: lib.filter.cardDiscardable, - filterTarget: (card, player, target) => { - const trigger = _status.event; - if (player.inRange(target) && target != trigger.source) { - if (lib.filter.targetEnabled(trigger.card, trigger.source, target)) - return true; - } - return false; - }, - ai1: (card) => get.unuseful(card) + 9, - ai2: (target) => { - if (_status.event.player.countCards("h", "shan")) { - return -get.attitude(_status.event.player, target); - } - if (get.attitude(_status.event.player, target) < 5) { - return 6 - get.attitude(_status.event.player, target); - } - if (_status.event.player.hp == 1 && player.countCards("h", "shan") == 0) { - return 10 - get.attitude(_status.event.player, target); - } - if (_status.event.player.hp == 2 && player.countCards("h", "shan") == 0) { - return 8 - get.attitude(_status.event.player, target); - } - return -1; - }, - prompt: get.prompt("liuli"), - prompt2: "弃置一张牌,将此【杀】转移给攻击范围内的一名其他角色", - source: trigger.player, - card: trigger.card, - }) - .setHiddenSkill(event.name) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - player.logSkill(event.name, target); - player.discard(event.cards); - const evt = trigger.getParent(); - evt.triggeredTargets2.remove(player); - evt.targets.remove(player); - evt.targets.push(target); - }, - ai: { - effect: { - target(card, player, target) { - if (target.countCards("he") == 0) return; - if (card.name != "sha") return; - let min = 1; - const friend = get.attitude(player, target) > 0; - const vcard = { name: "shacopy", nature: card.nature, suit: card.suit }; - const players = game.filterPlayer(); - for (let i = 0; i < players.length; i++) { - if ( - player != players[i] && - get.attitude(target, players[i]) < 0 && - target.canUse(card, players[i]) - ) { - if (!friend) return 0; - if (get.effect(players[i], vcard, player, player) > 0) { - if (!player.canUse(card, players[0])) { - return [0, 0.1]; - } - min = 0; - } - } - } - return min; - }, - }, - }, - }, - qianxun: { - mod: { - targetEnabled(card, player, target, now) { - if (card.name == "shunshou" || card.name == "lebu") return false; - }, - }, - audio: 2, - }, - lianying: { - audio: 2, - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - frequent: true, - filter(event, player) { - if (player.countCards("h")) return false; - const evt = event.getl(player); - return evt && evt.player == player && evt.hs && evt.hs.length > 0; - }, - async content(event, trigger, player) { - player.draw(); - }, - ai: { - threaten: 0.8, - effect: { - target(card) { - if (card.name == "guohe" || card.name == "liuxinghuoyu") return 0.5; - }, - }, - noh: true, - skillTagFilter(player, tag) { - if (tag == "noh") { - if (player.countCards("h") != 1) return false; - } - }, - }, - }, - xiaoji: { - audio: 2, - audioname: ["sp_sunshangxiang", "re_sunshangxiang"], - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - frequent: true, - getIndex(event, player) { - const evt = event.getl(player); - if (evt && evt.player === player && evt.es) return evt.es.length; - return false; - }, - async content(event, trigger, player) { - player.draw(2); - }, - ai: { - noe: true, - reverseEquip: true, - effect: { - target(card, player, target, current) { - if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; - }, - }, - }, - }, - jieyin: { - audio: 2, - enable: "phaseUse", - filterCard: true, - usable: 1, - selectCard: 2, - check(card) { - const player = get.owner(card); - if (player.countCards("h") > player.hp) return 8 - get.value(card); - if (player.hp < player.maxHp) return 6 - get.value(card); - return 4 - get.value(card); - }, - filterTarget(card, player, target) { - if (!target.hasSex("male")) return false; - if (target.hp >= target.maxHp) return false; - if (target == player) return false; - return true; - }, - async content(event, trigger, player) { - player.recover(); - event.target.recover(); - }, - ai: { - order: 5.5, - result: { - player(player) { - if (player.hp < player.maxHp) return 4; - if (player.countCards("h") > player.hp) return 0; - return -1; - }, - target: 4, - }, - threaten: 2, - }, - }, - xinjieyin: { - group: ["xinjieyin_old", "xinjieyin_new"], - // alter:true, - subSkill: { - new: { - audio: "jieyin", - enable: "phaseUse", - filterCard: true, - usable: 1, - position: "he", - filter(event, player) { - if (!get.is.altered("xinjieyin")) return false; - return player.countCards("he") > 0; - }, - check(card) { - const player = _status.event.player; - if (get.position(card) == "e") { - const subtype = get.subtype(card); - if ( - !game.hasPlayer((current) => { - return ( - current != player && - current.hp != player.hp && - get.attitude(player, current) > 0 && - !current.countCards("e", { subtype }) - ); - }) - ) { - return 0; - } - // 你还想我兼容{subtype:subtype}?不可能! - if (player.countCards("h", { subtype })) return 20 - get.value(card); - return 10 - get.value(card); - } else { - if (player.countCards("e")) return 0; - if (player.countCards("h", { type: "equip" })) return 0; - return 8 - get.value(card); - } - }, - filterTarget(card, player, target) { - if (!target.hasSex("male")) return false; - card = ui.selected.cards[0]; - if (!card) return false; - if ( - get.position(card) == "e" && - target.countCards("e", { subtype: get.subtype(card) }) - ) - return false; - return true; - }, - discard: false, - delay: 0, - lose: false, - async content(event, trigger, player) { - const { cards, target } = event; - if (get.position(cards[0]) == "e") { - player.$give(cards, target); - target.equip(cards[0]); - } else { - player.discard(cards); - } - if (player.hp > target.hp) { - player.draw(); - if (target.isDamaged()) target.recover(); - } else if (player.hp < target.hp) { - target.draw(); - if (player.isDamaged()) player.recover(); - } - }, - ai: { - order() { - const player = _status.event.player; - const es = player.getCards("e"); - for (let i = 0; i < es.length; i++) { - if (player.countCards("h", { subtype: get.subtype(es[i]) })) return 10; - } - return 2; - }, - result: { - target(player, target) { - const goon = () => { - const es = player.getCards("e"); - for (let i = 0; i < es.length; i++) { - if (player.countCards("h", { subtype: get.subtype(es[i]) })) - return true; - } - return false; - }; - if (player.hp < target.hp) { - if (player.isHealthy()) { - if (!player.needsToDiscard(1) || goon()) return 0.1; - return 0; - } - return 1.5; - } - if (player.hp > target.hp) { - if (target.isHealthy()) { - if (!player.needsToDiscard(1) || goon()) return 0.1; - return 0; - } - return 1; - } - return 0; - }, - }, - }, - }, - old: { - audio: "jieyin", - enable: "phaseUse", - filterCard: true, - usable: 1, - selectCard: 2, - filter(event, player) { - if (get.is.altered("xinjieyin")) return false; - return player.countCards("h") >= 2; - }, - check(card) { - const player = get.owner(card); - if (player.countCards("h") > player.hp) return 8 - get.value(card); - if (player.hp < player.maxHp) return 6 - get.value(card); - return 4 - get.value(card); - }, - filterTarget(card, player, target) { - if (!target.hasSex("male")) return false; - if (target.hp >= target.maxHp) return false; - if (target == player) return false; - return true; - }, - async content(event, trigger, player) { - player.recover(); - event.target.recover(); - }, - ai: { - order: 5.5, - result: { - player(player) { - if (player.hp < player.maxHp) return 4; - if (player.countCards("h") > player.hp) return 0; - return -1; - }, - target: 4, - }, - }, - }, - }, - ai: { - threaten: 2.3, - }, - }, - qingnang: { - audio: 2, - enable: "phaseUse", - filterCard: true, - usable: 1, - check(card) { - return 9 - get.value(card); - }, - filterTarget(card, player, target) { - if (target.hp >= target.maxHp) return false; - return true; - }, - async content(event, trigger, player) { - event.target.recover(); - }, - ai: { - order: 9, - result: { - target(player, target) { - if (target.hp == 1) return 5; - if (player == target && player.countCards("h") > player.hp) return 5; - return 2; - }, - }, - threaten: 2, - }, - }, - jijiu: { - mod: { - aiValue(player, card, num) { - if (get.name(card) != "tao" && get.color(card) != "red") return; - const cards = player.getCards( - "hs", - (card) => get.name(card) == "tao" || get.color(card) == "red" - ); - cards.sort((a, b) => (get.name(a) == "tao" ? 1 : 2) - (get.name(b) == "tao" ? 1 : 2)); - var geti = () => { - if (cards.includes(card)) cards.indexOf(card); - return cards.length; - }; - return Math.max(num, [6.5, 4, 3, 2][Math.min(geti(), 2)]); - }, - aiUseful() { - return lib.skill.kanpo.mod.aiValue.apply(this, arguments); - }, - }, - locked: false, - audio: 2, - audioname: ["re_huatuo"], - enable: "chooseToUse", - viewAsFilter(player) { - return player != _status.currentPhase && player.countCards("hes", { color: "red" }) > 0; - }, - filterCard(card) { - return get.color(card) == "red"; - }, - position: "hes", - viewAs: { name: "tao" }, - prompt: "将一张红色牌当桃使用", - check(card) { - return 15 - get.value(card); - }, - ai: { - threaten: 1.5, - }, - }, - wushuang: { - shaRelated: true, - audio: 2, - audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], - forced: true, - locked: true, - group: ["wushuang1", "wushuang2"], - preHidden: ["wushuang1", "wushuang2"], - }, - wushuang1: { - audio: "wushuang", - audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], - trigger: { player: "useCardToPlayered" }, - forced: true, - filter(event, player) { - return event.card.name == "sha" && !event.getParent().directHit.includes(event.target); - }, - //priority:-1, - logTarget: "target", - async content(event, trigger, player) { - const id = trigger.target.playerid; - const map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].shanRequired == "number") { - map[id].shanRequired++; - } else { - map[id].shanRequired = 2; - } - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if (arg.card.name != "sha" || arg.target.countCards("h", "shan") > 1) return false; - }, - }, - }, - wushuang2: { - audio: "wushuang", - audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], - trigger: { player: "useCardToPlayered", target: "useCardToTargeted" }, - forced: true, - logTarget(trigger, player) { - return player == trigger.player ? trigger.target : trigger.player; - }, - filter(event, player) { - return event.card.name == "juedou"; - }, - //priority:-1, - async content(event, trigger, player) { - const id = (player == trigger.player ? trigger.target : trigger.player)["playerid"]; - const idt = trigger.target.playerid; - const map = trigger.getParent().customArgs; - if (!map[idt]) map[idt] = {}; - if (!map[idt].shaReq) map[idt].shaReq = {}; - if (!map[idt].shaReq[id]) map[idt].shaReq[id] = 1; - map[idt].shaReq[id]++; - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if ( - arg.card.name != "juedou" || - Math.floor(arg.target.countCards("h", "sha") / 2) > player.countCards("h", "sha") - ) - return false; - }, - }, - }, - zhanshen: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - skillAnimation: true, - animationColor: "gray", - filter(event, player) { - return ( - player.isDamaged() && - game.dead.filter((target) => target.isFriendOf(player)).length > 0 - ); - }, - async content(event, trigger, player) { - player.awakenSkill("zhanshen"); - const cards = player.getEquips(1); - if (cards.length) player.discard(cards); - player.loseMaxHp(); - player.addSkills(["mashu", "shenji"]); - }, - derivation: ["mashu", "shenji"], - }, - shenji: { - mod: { - selectTarget(card, player, range) { - if (range[1] == -1) return; - if (card.name == "sha") range[1] += 2; - }, - cardUsable(card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - }, - lijian: { - audio: 2, - audioname: ["re_diaochan"], - enable: "phaseUse", - usable: 1, - filter(event, player) { - return game.countPlayer((current) => current != player && current.hasSex("male")) > 1; - }, - check(card) { - return 10 - get.value(card); - }, - filterCard: true, - position: "he", - filterTarget(card, player, target) { - if (player == target) return false; - if (!target.hasSex("male")) return false; - if (ui.selected.targets.length == 1) { - return target.canUse({ name: "juedou" }, ui.selected.targets[0]); - } - return true; - }, - targetprompt: ["先出杀", "后出杀"], - selectTarget: 2, - multitarget: true, - async content(event, trigger, player) { - const useCardEvent = event.targets[1].useCard( - { name: "juedou", isCard: true }, - "nowuxie", - event.targets[0], - "noai" - ); - useCardEvent.animate = false; - game.asyncDelay(0.5); - }, - ai: { - order: 8, - result: { - target(player, target) { - if (ui.selected.targets.length == 0) { - return -3; - } else { - return get.effect(target, { name: "juedou" }, ui.selected.targets[0], target); - } - }, - }, - expose: 0.4, - threaten: 3, - }, - }, - biyue: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - preHidden: true, - async content(event, trigger, player) { - player.draw(); - }, - }, - xinbiyue: { - audio: "biyue", - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - // alter:true, - async content(event, trigger, player) { - player.draw(); - }, - }, - yaowu: { - trigger: { player: "damageBegin3" }, - //priority:1, - audio: 2, - filter(event) { - if (event.card && event.card.name == "sha") { - if (get.color(event.card) == "red") return true; - } - return false; - }, - forced: true, - check() { - return false; - }, - async content(event, trigger, player) { - trigger.source.chooseDrawRecover(true); - }, - ai: { - halfneg: true, - effect: { - target(card, player, target, current) { - if (card.name == "sha" && get.color(card) == "red") { - return [1, -2]; - } - }, - }, - }, - }, - new_jiangchi: { - audio: 2, - trigger: { - player: "phaseDrawEnd", - }, - async cost(event, trigger, player) { - const list = ["弃牌", "摸牌", "cancel2"]; - if (!player.countCards("he")) list.remove("弃牌"); - const control = await player - .chooseControl(list, () => { - const player = _status.event.player; - if (list.includes("弃牌")) { - if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) { - return "弃牌"; - } - if (player.countCards("h", "sha") > 2) { - return "弃牌"; - } - } - if (!player.countCards("h", "sha")) { - return "摸牌"; - } - return "cancel2"; - }) - .set("prompt", get.prompt2("new_jiangchi")) - .forResultControl(); - if (control === "cancel2") event.result = { bool: false }; - else - event.result = { - bool: true, - cost_data: control, - }; - }, - async content(event, trigger, player) { - const control = event.cost_data; - - if (control == "弃牌") { - player.chooseToDiscard(true, "he"); - player.addTempSkill("jiangchi2", "phaseUseEnd"); - } else if (control == "摸牌") { - player.draw(); - player.addTempSkill("new_jiangchi3", "phaseEnd"); - } - }, - }, - new_jiangchi3: { - mod: { - cardEnabled(card) { - if (card.name == "sha") return false; - }, - cardRespondable(card) { - if (card.name == "sha") return false; - }, - ignoredHandcard(card, player) { - if (get.name(card) == "sha") return true; - }, - cardDiscardable(card, player, name) { - if (name == "phaseDiscard" && get.name(card) == "sha") return false; - }, - }, - }, - xinfu_jijie: { - enable: "phaseUse", - usable: 1, - audio: 2, - async content(event, trigger, player) { - const card = get.bottomCards()[0]; - game.cardsGotoOrdering(card); - event.card = card; - const { - result: { bool, targets }, - } = await player - .chooseTarget(true) - .set("ai", (target) => { - let att = get.attitude(_status.event.player, target); - if (_status.event.du) { - if (target.hasSkillTag("nodu")) return 0.5; - return -att; - } - if (att > 0) { - if (_status.event.player != target) att += 2; - return att + Math.max(0, 5 - target.countCards("h")); - } - return att; - }) - .set("du", event.card.name == "du") - .set("createDialog", ["机捷:选择一名角色获得此牌", [card]]); - if (bool) { - const target = targets[0]; - player.line(target, "green"); - const gainEvent = target.gain(card, "draw"); - gainEvent.giver = player; - } - }, - ai: { - order: 7.2, - result: { - player: 1, - }, - }, - }, - xinfu_jiyuan: { - trigger: { - global: ["dying", "gainAfter", "loseAsyncAfter"], - }, - audio: 2, - getIndex(event, player) { - if (event.name !== "loseAsync") return [event.player]; - else - return game - .filterPlayer((current) => current != player && event.getg(current).length > 0) - .sortBySeat(); - }, - filter(event, player, triggername, target) { - if (!target.isIn()) return false; - if (event.name === "dying") return true; - if (event.giver !== player) return false; - if (event.name === "gain") { - return event.player != player && event.getg(target).length > 0; - } - return game.hasPlayer((current) => current != player && event.getg(current).length > 0); - }, - logTarget(event, player, triggername, target) { - return target; - }, - check(event, player, triggername, target) { - return get.attitude(player, target) > 0; - }, - async content(event, trigger, player) { - event.targets[0].draw(); - }, - }, - }, - characterReplace: { - caocao: ["caocao", "re_caocao", "sb_caocao", "dc_caocao"], - guojia: ["guojia", "re_guojia", "ps1059_guojia", "ps2070_guojia"], - simayi: ["simayi", "re_simayi", "jsrg_simayi", "ps_simayi", "ps2068_simayi"], - jin_simayi: ["jin_simayi", "junk_simayi", "ps_jin_simayi"], - zhenji: ["zhenji", "re_zhenji", "sb_zhenji", "yj_zhenji"], - xuzhu: ["xuzhu", "re_xuzhu"], - zhangliao: ["zhangliao", "re_zhangliao"], - sp_zhangliao: ["sp_zhangliao", "yj_zhangliao", "jsrg_zhangliao"], - xiahoudun: ["xiahoudun", "re_xiahoudun", "xin_xiahoudun", "sb_xiahoudun"], - liubei: ["liubei", "re_liubei", "sb_liubei", "dc_liubei", "junk_liubei"], - guanyu: [ - "guanyu", - "re_guanyu", - "ol_sb_guanyu", - "sb_guanyu", - "ps_guanyu", - "old_guanyu", - "junk_guanyu", - ], - zhangfei: [ - "zhangfei", - "re_zhangfei", - "old_zhangfei", - "xin_zhangfei", - "sb_zhangfei", - "tw_zhangfei", - "jsrg_zhangfei", - "yj_zhangfei", - ], - zhaoyun: [ - "zhaoyun", - "re_zhaoyun", - "old_zhaoyun", - "sb_zhaoyun", - "jsrg_zhaoyun", - "ps2063_zhaoyun", - "ps2067_zhaoyun", - ], - sp_zhaoyun: ["sp_zhaoyun", "jsp_zhaoyun"], - machao: ["machao", "re_machao", "sb_machao", "ps_machao"], - sp_machao: ["sp_machao", "dc_sp_machao", "jsrg_machao", "old_machao"], - zhugeliang: [ - "zhugeliang", - "re_zhugeliang", - "sb_zhugeliang", - "ps2066_zhugeliang", - "ps_zhugeliang", - ], - huangyueying: ["huangyueying", "re_huangyueying", "junk_huangyueying", "sb_huangyueying"], - sunquan: ["sunquan", "re_sunquan", "sb_sunquan", "dc_sunquan"], - zhouyu: ["zhouyu", "re_zhouyu", "dc_sb_zhouyu", "sb_zhouyu", "ps1062_zhouyu", "ps2080_zhouyu"], - luxun: ["luxun", "re_luxun", "jsrg_luxun"], - lvmeng: ["lvmeng", "re_lvmeng", "sb_lvmeng"], - huanggai: ["huanggai", "re_huanggai", "sb_huanggai"], - daqiao: ["daqiao", "re_daqiao", "sb_daqiao"], - sunshangxiang: ["sunshangxiang", "re_sunshangxiang", "sb_sunshangxiang", "jsrg_sunshangxiang"], - ganning: ["ganning", "re_ganning", "sb_ganning", "yongjian_ganning"], - yj_ganning: ["yj_ganning", "sp_ganning"], - lvbu: ["lvbu", "re_lvbu", "jsrg_lvbu", "ps_lvbu"], - diaochan: ["diaochan", "re_diaochan", "sb_diaochan"], - huatuo: ["huatuo", "re_huatuo", "old_huatuo"], - huaxiong: ["huaxiong", "re_huaxiong", "old_huaxiong", "sb_huaxiong", "ol_huaxiong"], - yuanshu: ["yuanshu", "re_yuanshu", "yl_yuanshu", "old_yuanshu", "ol_yuanshu", "star_yuanshu"], - gongsunzan: ["gongsunzan", "re_gongsunzan", "dc_gongsunzan", "xin_gongsunzan"], - re_lidian: ["re_lidian", "old_re_lidian", "junk_lidian"], - }, - translate: { - caocao: "曹操", - hujia: "护驾", - hujia_info: - "主公技,当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。", - jianxiong: "奸雄", - jianxiong_info: "当你受到伤害后,你可以获得对你造成伤害的牌。", - - simayi: "司马懿", - fankui: "反馈", - fankui_info: "当你受到伤害后,你可以获得伤害来源的一张牌。", - guicai: "鬼才", - guicai_info: "一名角色的判定牌生效前,你可以打出一张手牌代替之。", - guicai_info_guozhan: "一名角色的判定牌生效前,你可以打出一张牌代替之。", - - xiahoudun: "夏侯惇", - zhangliao: "张辽", - xuzhu: "许褚", - guojia: "郭嘉", - zhenji: "甄宓", - liubei: "刘备", - guanyu: "关羽", - zhangfei: "张飞", - zhugeliang: "诸葛亮", - zhaoyun: "赵云", - machao: "马超", - huangyueying: "黄月英", - sunquan: "孙权", - ganning: "甘宁", - lvmeng: "吕蒙", - huanggai: "黄盖", - zhouyu: "周瑜", - daqiao: "大乔", - luxun: "陆逊", - sunshangxiang: "孙尚香", - huatuo: "华佗", - lvbu: "吕布", - diaochan: "貂蝉", - huaxiong: "华雄", - xf_yiji: "伊籍", - re_yuanshu: "袁术", - caozhang: "曹彰", - - ganglie: "刚烈", - tuxi: "突袭", - luoyi: "裸衣", - luoyi2: "裸衣", - tiandu: "天妒", - yiji: "遗计", - luoshen: "洛神", - xinluoshen: "洛神", - qingguo: "倾国", - rende: "仁德", - jijiang: "激将", - jijiang1: "激将", - jijiang2: "激将", - wusheng: "武圣", - paoxiao: "咆哮", - guanxing: "观星", - kongcheng: "空城", - kongcheng1: "空城", - longdan: "龙胆", - longdan1: "龙胆", - longdan2: "龙胆", - mashu: "马术", - mashu2: "马术", - feiying: "飞影", - tieji: "铁骑", - jizhi: "集智", - qicai: "奇才", - zhiheng: "制衡", - jiuyuan: "救援", - qixi: "奇袭", - keji: "克己", - kurou: "苦肉", - yingzi: "英姿", - fanjian: "反间", - guose: "国色", - liuli: "流离", - qianxun: "谦逊", - lianying: "连营", - xiaoji: "枭姬", - jieyin: "结姻", - xinjieyin: "结姻", - qingnang: "青囊", - jijiu: "急救", - wushuang: "无双", - wushuang1: "无双", - wushuang2: "无双", - lijian: "离间", - biyue: "闭月", - xinbiyue: "闭月", - pileTop: "牌堆顶", - pileBottom: "牌堆底", - ganglie_info: - "当你受到伤害后,你可以判定。若结果不为红桃,则伤害来源须弃置两张手牌,否则受到来自你的1点伤害。", - tuxi_info: "摸牌阶段,你可以改为获得至多两名其他角色的各一张手牌。", - luoyi_info: - "摸牌阶段,你可以少摸一张牌。若如此做,当你本回合内使用【杀】或【决斗】造成伤害时,此伤害+1。", - tiandu_info: "当你的判定牌生效后,你可以获得之。", - yiji_info: "当你受到1点伤害后,你可以观看牌堆顶的两张牌,然后将其分配给任意角色。", - luoshen_info: - "准备阶段,你可以判定。若结果为黑色,你获得判定牌。你可重复此流程,直到出现红色的判定结果。", - luoshen_info_guozhan: - "准备阶段,你可以判定。若结果为黑色,则可以继续判定,直到出现红色的判定牌。然后你获得所有黑色的判定牌。(判定结果为黑色的牌在此过程中不会进入弃牌堆)", - xinluoshen_info: - "准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。", - xinluoshen_info_alter: - "准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过洛神获得的牌,不计入当前回合的手牌上限。", - qingguo_info: "你可以将一张黑色手牌当做【闪】使用或打出。", - rende_info: - "出牌阶段,你可以将任意张手牌交给其他角色。当你以此法于一回合内给出第二张牌时,你回复1点体力。", - jijiang_info: - "主公技,当你需要使用或打出【杀】时,你可以令其他蜀势力角色依次选择是否打出一张【杀】。若有角色响应,则你视为使用或打出了此【杀】。", - wusheng_info: "你可以将一张红色牌当做【杀】使用或打出。", - paoxiao_info: "锁定技,出牌阶段,你使用【杀】没有数量限制。", - guanxing_info: - "准备阶段,你可以观看牌堆顶的X张牌,并将其以任意顺序置于牌堆项或牌堆底。(X为存活角色数且至多为5)", - kongcheng_info: "锁定技,当你没有手牌时,你不能成为【杀】或【决斗】的目标。", - longdan_info: "你可以将【杀】当做【闪】,或将【闪】当做【杀】使用或打出。", - mashu_info: "锁定技,你计算与其他角色的距离时-1。", - mashu2_info: "锁定技,你计算与其他角色的距离时-1。", - feiying_info: "锁定技,其他角色计算与你的距离时+1。", - tieji_info: "当你使用【杀】指定目标后,你可以进行判定。若结果为红色,则此【杀】不可被闪避。", - jizhi_info: "当你使用非转化的普通锦囊牌时,你可以摸一张牌。", - xinjizhi: "集智", - xinjizhi_info: "当你使用非转化的普通锦囊牌时,你可以摸一张牌。", - xinjizhi_info_alter: - "每当你使用一张非转化的锦囊牌,可以摸一张牌,如果摸到的是基本牌,你可以弃置这张牌,然后本回合手牌上限+1。", - xinqicai: "奇才", - xinqicai_info: "锁定技,你使用锦囊牌无距离限制。", - xinqicai_info_alter: "锁定技,你使用的锦囊牌无距离限制,你装备区内的牌不能被弃置。", - qicai_info: "锁定技,你使用锦囊牌无距离限制。", - zhiheng_info: "出牌阶段限一次,你可以弃置任意张牌,然后摸等量的牌。", - xinzhiheng: "制衡", - xinzhiheng_info: "出牌阶段限1次,你可以弃置任意张牌并摸等量的牌。", - xinzhiheng_info_alter: - "出牌阶段限1次,你可以弃置任意张牌并摸等量的牌,如果在发动制衡时弃置了所有手牌,你额外摸一张牌。", - jiuyuan_info: "主公技,锁定技,其他吴势力角色对你使用的【桃】的回复值+1。", - xinjiuyuan: "救援", - xinjiuyuan_info: "主公技,锁定技,濒死阶段,吴势力角色对你使用的[桃]额外回复1点体力。", - xinjiuyuan_info_alter: - "主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,其可以令你回复1点体力,然后其摸一张牌。", - qixi_info: "你可以将一张黑色牌当做【过河拆桥】使用。", - keji_info: - "弃牌阶段开始时,若你于本回合的出牌阶段内没有过使用或打出过【杀】,则你可以跳过此阶段。", - kurou_info: "出牌阶段,你可以失去1点体力,然后摸两张牌。", - yingzi_info: "摸牌阶段,你可以多摸一张牌。", - fanjian_info: - "出牌阶段限一次。你可以令一名角色选择一种花色,然后其获得你的一张手牌。若其以此法选择的花色与其得到的牌花色不同,则你对其造成1点伤害。", - guose_info: "你可以将一张方片牌当做【乐不思蜀】使用。", - liuli_info: - "当你成为【杀】的目标时,你可以弃置一张牌并将此【杀】转移给攻击范围内的一名其他角色(不能是此【杀】的使用者)。", - qianxun_info: "锁定技,你不能成为【顺手牵羊】和【乐不思蜀】的目标。", - lianying_info: "当你失去最后的手牌时,你可以摸一张牌。", - xiaoji_info: "当你失去一张装备区内的牌后,你可以摸两张牌。", - jieyin_info: - "出牌阶段限一次,你可以弃置两张手牌并选择一名已经受伤的男性角色。你与其各回复1点体力。", - xinjieyin_info: - "出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。", - xinjieyin_old_info: - "出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。", - xinjieyin_new_info: - "出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。", - xinjieyin_info_alter: - "出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。", - qingnang_info: "出牌阶段限一次,你可以弃置一张手牌并令一名角色回复1点体力。", - jijiu_info: "你的回合外,你可以将一张红色牌当做【桃】使用。", - wushuang_info: - "锁定技,当你使用【杀】或【决斗】指定目标后,你令此牌需要依次使用或打出两张【闪】或【杀】响应。", - lijian_info: - "出牌阶段限一次,你可以弃置一张牌,视为一名男性角色对另一名男性角色使用一张【决斗】(不可被【无懈可击】响应)。", - biyue_info: "结束阶段,你可以摸一张牌。", - xinbiyue_info: "结束阶段,你可以摸一张牌。", - xinbiyue_info_alter: "结束阶段,你可以摸一张牌,如果你没有手牌,改为摸两张牌。", - yaowu: "耀武", - yaowu_info: "锁定技,一名角色使用红色【杀】对你造成伤害时,该角色回复1点体力或摸一张牌。", - new_jiangchi: "将驰", - new_jiangchi_info: - "摸牌阶段结束时,你可以选择一项:1、摸一张牌,若如此做,你本回合内不能使用或打出【杀】且【杀】不计入手牌上限。 2、弃置一张牌,若如此做,出牌阶段你使用【杀】无距离限制且你可以额外使用一张【杀】,直到回合结束。", - xinfu_jijie: "机捷", - xinfu_jijie_info: "出牌阶段限一次。你可以观看牌堆底的一张牌,然后将其交给一名角色。", - xinfu_jiyuan: "急援", - xinfu_jiyuan_info: "当有角色进入濒死状态时,或你将牌交给一名其他角色后,你可以令该角色摸一张牌。", - ganglie_three: "刚烈", - ganglie_three_info: - "当你受到伤害后,你可令一名敌方角色判定。若结果不为♥,其弃置两张牌或受到来自你的1点伤害。", - zhongyi: "忠义", - zhongyi2: "忠义", - zhongyi_info: - "限定技,出牌阶段,你可以将一张牌置于武将牌上。你的武将牌上有〖忠义〗牌时,己方角色使用【杀】造成的伤害+1。下轮游戏开始时,你将〖忠义〗牌置入弃牌堆。", - zhanshen: "战神", - zhanshen_info: - "觉醒技,准备阶段,若场上有已死亡的其他己方角色且你已受伤,则你弃置装备区的武器牌,减1点体力上限,获得技能〖马术〗和〖神戟〗。", - shenji: "神戟", - shenji_info: "锁定技,你使用【杀】指定的目标数上限+2,次数上限+1。", - rewangzun: "妄尊", - rewangzun2: "妄尊", - rewangzun_info: - "锁定技,一名其他角色的准备阶段开始时,若其体力值大于你,你摸一张牌。然后若其身份为主公/主帅/君主/地主且明置,则你摸一张牌,且其本回合的手牌上限-1。", - retongji: "同疾", - retongji_info: - "攻击范围内包含你的角色成为【杀】的目标时,若你不是此【杀】的使用者或目标,其可弃置一张牌,然后将此【杀】转移给你。", - std_panfeng: "潘凤", - stdkuangfu: "狂斧", - stdkuangfu_info: - "锁定技。出牌阶段限一次。当你使用【杀】对其他角色造成伤害后,若其体力值:小于你,你摸两张牌;不小于你,你失去1点体力。", - ganfuren: "甘夫人", - stdshushen: "淑慎", - stdshushen_info: - "当你回复1点体力时,你可以令一名其他角色摸一张牌(若其没有手牌则改为摸两张牌)。", - old_re_lidian: "李典", - - standard_2008: "2008版标准包", - standard_2013: "2013版标准包", - standard_2019: "2019版标准包", - standard_2023: "2023版标准包", - }, - }; -}); diff --git a/character/standard/card.js b/character/standard/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/standard/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/standard/character.js b/character/standard/character.js new file mode 100644 index 000000000..5c5dafdcb --- /dev/null +++ b/character/standard/character.js @@ -0,0 +1,37 @@ +const characters = { + old_re_lidian: ["male", "wei", 3, ["xunxun", "wangxi"], ["die_audio:lidian"]], + ganfuren: ["female", "shu", 3, ["stdshushen", "shenzhi"]], + std_panfeng: ["male", "qun", 4, ["stdkuangfu"]], + caocao: ["male", "wei", 4, ["jianxiong", "hujia"], ["zhu"]], + simayi: ["male", "wei", 3, ["fankui", "guicai"]], + xiahoudun: ["male", "wei", 4, ["ganglie"]], + zhangliao: ["male", "wei", 4, ["tuxi"]], + xuzhu: ["male", "wei", 4, ["luoyi"]], + guojia: ["male", "wei", 3, ["tiandu", "yiji"]], + zhenji: ["female", "wei", 3, ["luoshen", "qingguo"]], + liubei: ["male", "shu", 4, ["rende", "jijiang"], ["zhu"]], + guanyu: ["male", "shu", 4, ["wusheng"]], + zhangfei: ["male", "shu", 4, ["paoxiao"]], + zhugeliang: ["male", "shu", 3, ["guanxing", "kongcheng"]], + zhaoyun: ["male", "shu", 4, ["longdan"]], + machao: ["male", "shu", 4, ["mashu", "tieji"]], + huangyueying: ["female", "shu", 3, ["jizhi", "qicai"]], + sunquan: ["male", "wu", 4, ["zhiheng", "jiuyuan"], ["zhu"]], + ganning: ["male", "wu", 4, ["qixi"]], + lvmeng: ["male", "wu", 4, ["keji"]], + huanggai: ["male", "wu", 4, ["kurou"]], + zhouyu: ["male", "wu", 3, ["yingzi", "fanjian"]], + daqiao: ["female", "wu", 3, ["guose", "liuli"]], + luxun: ["male", "wu", 3, ["qianxun", "lianying"]], + sunshangxiang: ["female", "wu", 3, ["xiaoji", "jieyin"]], + huatuo: ["male", "qun", 3, ["qingnang", "jijiu"]], + lvbu: ["male", "qun", 4, ["wushuang"]], + diaochan: ["female", "qun", 3, ["lijian", "biyue"]], + huaxiong: ["male", "qun", 6, ["yaowu"]], + gongsunzan: ["male", "qun", 4, ["reyicong"]], + + xf_yiji: ["male", "shu", 3, ["xinfu_jijie", "xinfu_jiyuan"], []], + re_yuanshu: ["male", "qun", 4, ["rewangzun", "retongji"]], +}; + +export default characters; diff --git a/character/standard/characterFilter.js b/character/standard/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/standard/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/standard/characterReplace.js b/character/standard/characterReplace.js new file mode 100644 index 000000000..18e77407f --- /dev/null +++ b/character/standard/characterReplace.js @@ -0,0 +1,38 @@ +const characterReplaces = { + caocao: ["caocao", "re_caocao", "sb_caocao", "dc_caocao"], + guojia: ["guojia", "re_guojia", "ps1059_guojia", "ps2070_guojia"], + simayi: ["simayi", "re_simayi", "jsrg_simayi", "ps_simayi", "ps2068_simayi"], + jin_simayi: ["jin_simayi", "junk_simayi", "ps_jin_simayi"], + zhenji: ["zhenji", "re_zhenji", "sb_zhenji", "yj_zhenji"], + xuzhu: ["xuzhu", "re_xuzhu"], + zhangliao: ["zhangliao", "re_zhangliao"], + sp_zhangliao: ["sp_zhangliao", "yj_zhangliao", "jsrg_zhangliao"], + xiahoudun: ["xiahoudun", "re_xiahoudun", "xin_xiahoudun", "sb_xiahoudun"], + liubei: ["liubei", "re_liubei", "sb_liubei", "dc_liubei", "junk_liubei"], + guanyu: ["guanyu", "re_guanyu", "ol_sb_guanyu", "sb_guanyu", "ps_guanyu", "old_guanyu", "junk_guanyu"], + zhangfei: ["zhangfei", "re_zhangfei", "old_zhangfei", "xin_zhangfei", "sb_zhangfei", "tw_zhangfei", "jsrg_zhangfei", "yj_zhangfei"], + zhaoyun: ["zhaoyun", "re_zhaoyun", "old_zhaoyun", "sb_zhaoyun", "jsrg_zhaoyun", "ps2063_zhaoyun", "ps2067_zhaoyun"], + sp_zhaoyun: ["sp_zhaoyun", "jsp_zhaoyun"], + machao: ["machao", "re_machao", "sb_machao", "ps_machao"], + sp_machao: ["sp_machao", "dc_sp_machao", "jsrg_machao", "old_machao"], + zhugeliang: ["zhugeliang", "re_zhugeliang", "sb_zhugeliang", "ps2066_zhugeliang", "ps_zhugeliang"], + huangyueying: ["huangyueying", "re_huangyueying", "junk_huangyueying", "sb_huangyueying"], + sunquan: ["sunquan", "re_sunquan", "sb_sunquan", "dc_sunquan"], + zhouyu: ["zhouyu", "re_zhouyu", "dc_sb_zhouyu", "sb_zhouyu", "ps1062_zhouyu", "ps2080_zhouyu"], + luxun: ["luxun", "re_luxun", "jsrg_luxun"], + lvmeng: ["lvmeng", "re_lvmeng", "sb_lvmeng"], + huanggai: ["huanggai", "re_huanggai", "sb_huanggai"], + daqiao: ["daqiao", "re_daqiao", "sb_daqiao"], + sunshangxiang: ["sunshangxiang", "re_sunshangxiang", "sb_sunshangxiang", "jsrg_sunshangxiang"], + ganning: ["ganning", "re_ganning", "sb_ganning", "yongjian_ganning"], + yj_ganning: ["yj_ganning", "sp_ganning"], + lvbu: ["lvbu", "re_lvbu", "jsrg_lvbu", "ps_lvbu"], + diaochan: ["diaochan", "re_diaochan", "sb_diaochan"], + huatuo: ["huatuo", "re_huatuo", "old_huatuo"], + huaxiong: ["huaxiong", "re_huaxiong", "old_huaxiong", "sb_huaxiong", "ol_huaxiong"], + yuanshu: ["yuanshu", "re_yuanshu", "yl_yuanshu", "old_yuanshu", "ol_yuanshu", "star_yuanshu"], + gongsunzan: ["gongsunzan", "re_gongsunzan", "dc_gongsunzan", "xin_gongsunzan"], + re_lidian: ["re_lidian", "old_re_lidian", "junk_lidian"], +}; + +export default characterReplaces; diff --git a/character/standard/dynamicTranslate.js b/character/standard/dynamicTranslate.js new file mode 100644 index 000000000..cdee02b0a --- /dev/null +++ b/character/standard/dynamicTranslate.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = {}; +export default dynamicTranslates; diff --git a/character/standard/index.js b/character/standard/index.js new file mode 100644 index 000000000..d2b0f7564 --- /dev/null +++ b/character/standard/index.js @@ -0,0 +1,34 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "standard", + connect: true, + character: { ...characters }, + characterSort: { + standard: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/standard/intro.js b/character/standard/intro.js new file mode 100644 index 000000000..c7a80ac34 --- /dev/null +++ b/character/standard/intro.js @@ -0,0 +1,32 @@ +const characterIntro = { + liubei: "先主姓刘,讳备,字玄德,涿郡涿县人,汉景帝子中山靖王胜之后也。以仁德治天下。", + guanyu: "字云长,本字长生,并州河东解州人。五虎上将之首,爵至汉寿亭侯,谥曰“壮缪侯”。被奉为“关圣帝君”,崇为“武圣”。", + zhangfei: "字翼德,涿郡人,燕颔虎须,豹头环眼。有诗云:“长坂坡头杀气生,横枪立马眼圆睁。一声好似轰雷震,独退曹家百万兵”。", + zhugeliang: "字孔明,号卧龙,琅琊阳都人,蜀汉丞相。在世时被封为武乡侯,谥曰忠武侯。著有《出师表》、《诫子书》等。怀不世之才,以空城戏司马,能观星象而通鬼神。", + zhaoyun: "字子龙,常山真定人。身长八尺,姿颜雄伟。长坂坡单骑救阿斗,先主云:“子龙一身都是胆也。”", + machao: "字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。", + huangyueying: "荆州沔南白水人,沔阳名士黄承彦之女,诸葛亮之妻,诸葛瞻之母。容貌甚丑,而有奇才:上通天文,下察地理,韬略近于诸书无所不晓,诸葛亮在南阳闻其贤而迎娶。", + sunquan: "吴大帝,字仲谋,吴郡富春县人。统领吴与蜀魏三足鼎立,制衡天下。", + ganning: "字兴霸,巴郡临江人,祖籍荆州南阳郡。为人勇猛刚强,忠心耿耿,勇往无前。曾带兵百人于二更奇袭曹营,大挫其锐气。", + lvmeng: "字子明,汝南富陂人。陈寿评曰:“吕蒙勇而有谋断,识军计,谲郝普,擒关羽,最其妙者。初虽轻果妄杀,终于克己,有国士之量,岂徒武将而已乎!”", + huanggai: "字公覆,零陵郡泉陵县人。官至偏将军、武陵太守。以苦肉计骗曹孟德,亲往诈降,火烧战船,重创敌军。", + zhouyu: "字公瑾,庐江舒县人,任东吴三军大都督,雄姿英发,人称“美周郎”。赤壁之战前,巧用反间计杀了精通水战的叛将蔡瑁、张允。", + daqiao: "庐江皖县人,为乔公长女,孙策之妻,小乔之姊。与小乔并称为“江东二乔”,容貌国色流离。", + luxun: "本名陆议,字伯言,吴郡吴县人。历任东吴大都督、丞相。吴大帝孙权兄孙策之婿,世代为江东大族。以谦逊之书麻痹关羽,夺取荆州,又有火烧连营大破蜀军。", + sunshangxiang: "孙夫人,乃孙权之妹。刘备定荆州,孙权进妹与其结姻,重固盟好。孙夫人才捷刚猛,有诸兄之风。后人为其立庙,号曰“枭姬庙”。", + caocao: "魏武帝曹操,字孟德,小名阿瞒、吉利,沛国谯人。精兵法,善诗歌,乃治世之能臣,乱世之奸雄也。", + simayi: "晋宣帝,字仲达,河内温人。曾任职过曹魏的大都督,太尉,太傅。少有奇节,聪明多大略,博学洽闻,伏膺儒教,世之鬼才也。", + xiahoudun: "字元让,沛国谯人。有拔矢啖睛之勇,性格勇猛刚烈。", + zhangliao: "字文远,魏雁门马邑人。官至前将军、征东将军、晋阳侯。武功高强,又谋略过人,多次建立奇功,以800人突袭孙权十万大军,皆望风披靡。", + xuzhu: "字仲康,谯国谯县人。和典韦一同统率着曹操的亲卫队“虎卫军”。因为他十分勇猛,所以有“虎痴”的绰号。曾有裸衣斗马超之举。", + guojia: "字奉孝,颍川阳翟人,官至军师祭酒。惜天妒英才,英年早逝。有诗云:“良计环环不遗策,每临制变满座惊”。", + zhenji: "中山无极人,别称甄洛或甄宓,庙号文昭甄皇后。魏文帝曹丕的正室。懂诗文,有倾国倾城之貌,《洛神赋》即是曹植为她所作。", + huatuo: "字元化,一名旉,沛国谯人,“建安三神医”之一。集平生之所得著《青囊经》,现已失传。", + lvbu: "字奉先,五原郡九原县人。三国第一猛将,曾独力战刘关张三人,其武力世之无双。时人语曰:“人中有吕布,马中有赤兔。”", + diaochan: "中国古代四大美女之一,有闭月羞花之貌。司徒王允之义女,由王允授意施行连环计,离间董卓、吕布,借布手除卓。后貂蝉成为吕布的妾。", + huaxiong: "董卓旗下名将,自荐抵抗山东地区反对董卓的诸侯联军于汜水关前,他先后斩杀济北相鲍信之弟鲍忠和孙坚部将祖茂、以及袁术部将俞涉和韩馥手下潘凤等人,最后关东联军派出关羽与之一对一决斗而被杀。", + + xf_yiji: "伊籍,字机伯,生卒年不详,兖州山阳郡(今山东金乡县)人,三国时期蜀汉官员。年少时依附于同乡刘表。刘备落难到荆州时,伊籍时常拜访,托请刘备照顾。建安十三年(208年),刘表病死,伊籍便转投刘备,一起渡江南下。建安十六年(211年),刘备入蜀帮助刘璋,伊籍亦有跟随。随后刘备和刘璋双方决裂。建安十九年(214年),刘备平定益州,任命伊籍为左将军从事中郎,其待遇次于简雍、孙乾等。后升任昭文将军,并与诸葛亮、法正、刘巴、李严共同编制《蜀科》。", +}; + +export default characterIntro; diff --git a/character/standard/perfectPairs.js b/character/standard/perfectPairs.js new file mode 100644 index 000000000..559ffeaea --- /dev/null +++ b/character/standard/perfectPairs.js @@ -0,0 +1,17 @@ +export default { + xiahoudun: ["xiahouyuan"], + zhenji: ["caopi"], + caocao: ["xuzhu", "dianwei", "bianfuren"], + huangzhong: ["weiyan"], + zhugeliang: ["jiangwei", "jiangfei", "huangyueying"], + liubei: ["guanyu", "zhangfei", "ganfuren"], + zhaoyun: ["liushan"], + daqiao: ["xiaoqiao"], + zhouyu: ["huanggai", "xiaoqiao", "zhouyi"], + sunquan: ["zhoutai"], + lvbu: ["diaochan", "lvlingqi"], + machao: ["madai", "mayunlu", "yangwan"], + zhangliao: ["zangba"], + ganning: ["lingtong", "xf_sufei"], + guanyu: ["zhangfei", "liaohua"], +}; diff --git a/character/standard/pinyin.js b/character/standard/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/standard/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/standard/skill.js b/character/standard/skill.js new file mode 100644 index 000000000..cc6a634a3 --- /dev/null +++ b/character/standard/skill.js @@ -0,0 +1,2293 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //标准版甘夫人 + stdshushen: { + audio: "shushen", + trigger: { player: "recoverEnd" }, + getIndex(event) { + return event.num || 1; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("stdshushen"), lib.filter.notMe) + .set("ai", target => get.attitude(_status.event.player, target)) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + await target.draw(target.countCards("h") > 0 ? 1 : 2); + }, + ai: { threaten: 0.8, expose: 0.1 }, + }, + stdkuangfu: { + audio: "xinkuangfu", + trigger: { source: "damageSource" }, + forced: true, + usable: 1, + filter(event, player) { + return player.isPhaseUsing() && event.card && event.card.name == "sha" && event.player != player && event.player.isIn(); + }, + async content(event, trigger, player) { + if (trigger.player.hp < player.hp) player.draw(2); + else player.loseHp(); + }, + ai: { + halfneg: true, + }, + }, + rewangzun: { + trigger: { global: "phaseZhunbeiBegin" }, + forced: true, + audio: "wangzun", + filter(event, player) { + return event.player.hp > player.hp; + }, + logTarget: "player", + async content(event, trigger, player) { + player.draw(); + let zhu = false; + const target = trigger.player; + switch (get.mode()) { + case "identity": { + zhu = target.isZhu; + break; + } + case "guozhan": { + zhu = get.is.jun(target); + break; + } + case "versus": { + zhu = target.identity == "zhu"; + break; + } + case "doudizhu": { + zhu = target == game.zhu; + break; + } + } + if (zhu) { + player.draw(); + target.addTempSkill("rewangzun2"); + target.addMark("rewangzun2", 1, false); + } + }, + }, + rewangzun2: { + onremove: true, + mod: { + maxHandcard(player, num) { + return num - player.countMark("rewangzun2"); + }, + }, + intro: { content: "手牌上限-#" }, + }, + retongji: { + trigger: { global: "useCardToTarget" }, + logTarget: "target", + audio: "tongji", + filter(event, player) { + return event.card.name == "sha" && event.player != player && !event.targets.includes(player) && event.target.inRange(player) && event.target.countCards("he") > 0; + }, + async cost(event, trigger, player) { + const { result } = await trigger.target + .chooseCard("he", "是否对" + get.translation(player) + "发动【同疾】?", "弃置一张牌,将" + get.translation(trigger.card) + "转移给" + get.translation(player), lib.filter.cardDiscardable) + .set("ai", card => { + if (!_status.event.check) return -1; + return get.unuseful(card) + 9; + }) + .set( + "check", + (() => { + if (trigger.target.countCards("h", "shan")) { + return -get.attitude(trigger.target, player); + } + if (get.attitude(trigger.target, player) < 5) { + return 6 - get.attitude(trigger.target, player); + } + if (trigger.target.hp == 1 && player.countCards("h", "shan") == 0) { + return 10 - get.attitude(trigger.target, player); + } + if (trigger.target.hp == 2 && player.countCards("h", "shan") == 0) { + return 8 - get.attitude(trigger.target, player); + } + return -1; + })() > 0 + ); + if (result.bool) { + event.result = { + bool: true, + cost_data: { + cards: result.cards, + }, + }; + } + }, + async content(event, trigger, player) { + trigger.target.discard(event.cost_data.cards); + const evt = trigger.getParent(); + evt.triggeredTargets2.remove(trigger.target); + evt.targets.remove(trigger.target); + evt.targets.push(player); + }, + ai: { + neg: true, + }, + }, + hujia: { + audio: 2, + audioname: ["re_caocao"], + unique: true, + zhuSkill: true, + trigger: { player: ["chooseToRespondBefore", "chooseToUseBefore"] }, + filter(event, player) { + if (event.responded) return false; + if (player.storage.hujiaing) return false; + if (!player.hasZhuSkill("hujia")) return false; + if (!event.filterCard({ name: "shan", isCard: true }, player, event)) return false; + return game.hasPlayer(current => current != player && current.group == "wei"); + }, + check(event, player) { + if (get.damageEffect(player, event.player, player) >= 0) return false; + return true; + }, + async content(event, trigger, player) { + while (true) { + let bool; + if (!event.current) event.current = player.next; + if (event.current == player) return; + else if (event.current.group == "wei") { + if ((event.current == game.me && !_status.auto) || get.attitude(event.current, player) > 2 || event.current.isOnline()) { + player.storage.hujiaing = true; + const next = event.current.chooseToRespond("是否替" + get.translation(player) + "打出一张闪?", { name: "shan" }); + next.set("ai", () => { + const event = _status.event; + return get.attitude(event.player, event.source) - 2; + }); + next.set("skillwarn", "替" + get.translation(player) + "打出一张闪"); + next.autochoose = lib.filter.autoRespondShan; + next.set("source", player); + bool = (await next).result.bool; + } + } + player.storage.hujiaing = false; + if (bool) { + trigger.result = { bool: true, card: { name: "shan", isCard: true } }; + trigger.responded = true; + trigger.animate = false; + if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) { + event.current.ai.shown += 0.3; + if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; + } + return; + } else { + event.current = event.current.next; + } + } + }, + ai: { + respondShan: true, + skillTagFilter(player) { + if (player.storage.hujiaing) return false; + if (!player.hasZhuSkill("hujia")) return false; + return game.hasPlayer(current => current != player && current.group == "wei"); + }, + }, + }, + jianxiong: { + audio: 2, + preHidden: true, + trigger: { player: "damageEnd" }, + filter(event, player) { + return get.itemtype(event.cards) == "cards" && get.position(event.cards[0], true) == "o"; + }, + async content(event, trigger, player) { + player.gain(trigger.cards, "gain2"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage")) return [1, 0.55]; + }, + }, + }, + }, + fankui: { + audio: 2, + trigger: { player: "damageEnd" }, + logTarget: "source", + preHidden: true, + filter(event, player) { + return event.source && event.source.countGainableCards(player, event.source != player ? "he" : "e") > 0 && event.num > 0; + }, + async content(event, trigger, player) { + player.gainPlayerCard(true, trigger.source, trigger.source != player ? "he" : "e"); + }, + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.countCards("he") > 1 && get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; + if (get.attitude(target, player) < 0) return [1, 1]; + } + }, + }, + }, + }, + guicai: { + audio: 2, + trigger: { global: "judge" }, + preHidden: true, + filter(event, player) { + return player.countCards(get.mode() == "guozhan" ? "hes" : "hs") > 0; + }, + async cost(event, trigger, player) { + const { + result: { bool, cards }, + } = await player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("guicai"), get.mode() == "guozhan" ? "hes" : "hs", card => { + const player = _status.event.player; + const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + const mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", card => { + const trigger = _status.event.getTrigger(); + const player = _status.event.player; + const judging = _status.event.judging; + const result = trigger.judge(card) - trigger.judge(judging); + const attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result - get.value(card) / 2; + } else { + return -result - get.value(card) / 2; + } + }) + .set("judging", trigger.player.judging[0]) + .setHiddenSkill("guicai"); + if (bool) event.result = { bool, cost_data: { cards } }; + }, + //技能的logSkill跟着打出牌走 不进行logSkill + popup: false, + async content(event, trigger, player) { + const chooseCardResultCards = event.cost_data.cards; + player.respond(chooseCardResultCards, "guicai", "highlight", "noOrdering"); + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = chooseCardResultCards[0]; + trigger.orderingCards.addArray(chooseCardResultCards); + game.log(trigger.player, "的判定牌改为", chooseCardResultCards[0]); + game.asyncDelay(2); + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + ganglie: { + audio: 2, + trigger: { player: "damageEnd" }, + filter(event, player) { + return event.source != undefined; + }, + check(event, player) { + return get.attitude(player, event.source) <= 0; + }, + logTarget: "source", + async content(event, trigger, player) { + const judgeEvent = player.judge(card => { + if (get.suit(card) == "heart") return -2; + return 2; + }); + judgeEvent.judge2 = result => result.bool; + const { + result: { judge }, + } = await judgeEvent; + if (judge < 2) return; + const { + result: { bool }, + } = await trigger.source.chooseToDiscard(2).set("ai", card => { + if (card.name == "tao") return -10; + if (card.name == "jiu" && _status.event.player.hp == 1) return -10; + return get.unuseful(card) + 2.5 * (5 - get.owner(card).hp); + }); + if (bool == false) { + trigger.source.damage(); + } + }, + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + return 0.8; + // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; + }, + }, + }, + }, + ganglie_three: { + audio: "ganglie", + trigger: { player: "damageEnd" }, + async cost(event, trigger, player) { + const { result } = await player + .chooseTarget(get.prompt2("ganglie_three"), (card, player, target) => { + return target.isEnemyOf(player); + }) + .set("ai", target => { + return -get.attitude(_status.event.player, target) / Math.sqrt(1 + target.countCards("h")); + }); + event.result = result; + }, + async content(event, trigger, player) { + event.target = event.targets[0]; + player.logSkill("ganglie_three", event.target); + const judgeEvent = player.judge(card => { + if (get.suit(card) == "heart") return -2; + return 2; + }); + judgeEvent.judge2 = result => result.bool; + const { + result: { judge }, + } = await judgeEvent; + if (judge < 2) return; + const { + result: { bool: chooseToDiscardResultBool }, + } = await event.target.chooseToDiscard(2).set("ai", card => { + if (card.name == "tao") return -10; + if (card.name == "jiu" && _status.event.player.hp == 1) return -10; + return get.unuseful(card) + 2.5 * (5 - get.owner(card).hp); + }); + if (chooseToDiscardResultBool === false) { + event.target.damage(); + } + }, + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + return 0.8; + // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; + }, + }, + }, + }, + tuxi: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter(event, player) { + return !event.numFixed; + }, + async cost(event, trigger, player) { + let num = game.countPlayer(current => current != player && current.countCards("h") > 0 && get.attitude(player, current) <= 0); + let check = num >= 2; + const { result } = await player + .chooseTarget( + get.prompt("tuxi"), + "获得其他一至两名角色的各一张手牌", + [1, 2], + (card, player, target) => { + return target.countCards("h") > 0 && player != target; + }, + target => { + if (!_status.event.aicheck) return 0; + const att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + } + ) + .set("aicheck", check); + event.result = result; + }, + async content(event, trigger, player) { + player.gainMultiple(event.targets); + trigger.changeToZero(); + game.asyncDelay(); + }, + ai: { + threaten: 2, + expose: 0.3, + }, + }, + luoyi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + check(event, player) { + if (player.skipList.includes("phaseUse") || player.countCards("h") < 3) return false; + if (!player.hasSha()) return false; + return game.hasPlayer(current => get.attitude(player, current) < 0 && player.canUse("sha", current)); + }, + preHidden: true, + filter(event, player) { + return !event.numFixed && event.num > 0; + }, + async content(event, trigger, player) { + player.addTempSkill("luoyi2", "phaseJieshuBegin"); + trigger.num--; + }, + }, + luoyi2: { + trigger: { source: "damageBegin1" }, + filter(event) { + return event.card && (event.card.name == "sha" || event.card.name == "juedou") && event.notLink(); + }, + forced: true, + async content(event, trigger, player) { + trigger.num++; + }, + ai: { + damageBonus: true, + }, + }, + tiandu: { + audio: 2, + audioname: ["re_guojia", "xizhicai", "gz_nagisa"], + trigger: { player: "judgeEnd" }, + preHidden: true, + frequent(event) { + //if(get.mode()=='guozhan') return false; + return event.result.card.name !== "du"; + }, + check(event) { + return event.result.card.name !== "du"; + }, + filter(event, player) { + return get.position(event.result.card, true) == "o"; + }, + async content(event, trigger, player) { + player.gain(trigger.result.card, "gain2"); + }, + }, + yiji: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + filter(event) { + return event.num > 0; + }, + getIndex(event, player, triggername) { + return event.num; + }, + async content(event, trigger, player) { + const { cards } = await game.cardsGotoOrdering(get.cards(2)); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + if (!cards.length) return; + // event.goto -> do while + do { + const { + result: { bool, links }, + } = + cards.length == 1 + ? { result: { links: cards.slice(0), bool: true } } + : await player.chooseCardButton("遗计:请选择要分配的牌", true, cards, [1, cards.length]).set("ai", () => { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + if (!bool) return; + cards.removeArray(links); + event.togive = links.slice(0); + const { + result: { targets }, + } = await player + .chooseTarget("选择一名角色获得" + get.translation(links), true) + .set("ai", target => { + const att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + if (targets.length) { + const id = targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; + map[id].addArray(event.togive); + } + } while (cards.length > 0); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + const list = []; + for (const i in event.given_map) { + const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.2); + list.push([source, event.given_map[i]]); + } + game.loseAsync({ + gain_list: list, + giver: player, + animate: "draw", + }).setContent("gaincardMultiple"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + let num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; + } + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; + } + }, + }, + }, + }, + luoshen: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + preHidden: true, + async content(event, trigger, player) { + while (true) { + if (event.cards == undefined) event.cards = []; + const judgeEvent = player.judge(card => { + if (get.color(card) == "black") return 1.5; + return -1.5; + }); + judgeEvent.judge2 = result => result.bool; + if (get.mode() != "guozhan" && !player.hasSkillTag("rejudge")) + judgeEvent.set("callback", async event => { + if (event.judgeResult.color == "black" && get.position(event.card, true) == "o") await player.gain(event.card, "gain2"); + }); + else + judgeEvent.set("callback", async event => { + if (event.judgeResult.color == "black") event.getParent().orderingCards.remove(event.card); + }); + const { + result: { judge, card }, + } = await judgeEvent; + let bool; + if (judge > 0) { + event.cards.push(card); + bool = (await player.chooseBool("是否再次发动【洛神】?").set("frequentSkill", "luoshen")).result.bool; + } else { + for (let 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"); + } + return; + } + if (!bool) { + if (event.cards.length) { + player.gain(event.cards, "gain2"); + } + return; + } + } + }, + }, + xinluoshen: { + audio: "luoshen", + // alter:true, + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + async content(event, trigger, player) { + while (true) { + if (event.cards == undefined) event.cards = []; + const judgeEvent = player.judge(card => { + if (get.color(card) == "black") return 1.5; + return -1.5; + }, ui.special); + judgeEvent.judge2 = result => result.bool; + const { + result: { judge, card }, + } = await judgeEvent; + let bool; + if (judge > 0) { + event.cards.push(card); + bool = lib.config.autoskilllist.includes("luoshen") ? (await player.chooseBool("是否再次发动【洛神】?")).result.bool : true; + } else { + for (let i = 0; i < event.cards.length; i++) { + if (get.position(event.cards[i]) != "s") { + event.cards.splice(i, 1); + i--; + } + } + player.gain(event.cards, "gain2"); + player.storage.xinluoshen = event.cards.slice(0); + return; + } + if (!bool) { + if (event.cards.length) { + player.gain(event.cards, "gain2"); + player.storage.xinluoshen = event.cards.slice(0); + return; + } + } + } + }, + mod: { + ignoredHandcard(card, player) { + if (get.is.altered("xinluoshen") && player.storage.xinluoshen && player.storage.xinluoshen.includes(card)) { + return true; + } + }, + }, + group: "xinluoshen_clear", + subSkill: { + clear: { + trigger: { player: "phaseAfter" }, + silent: true, + async content(event, trigger, player) { + delete player.storage.xinluoshen; + }, + }, + }, + }, + qingguo: { + mod: { + aiValue(player, card, num) { + if (get.name(card) != "shan" && get.color(card) != "black") return; + const cards = player.getCards("hs", card => get.name(card) == "shan" || get.color(card) == "black"); + cards.sort((a, b) => { + return (get.name(b) == "shan" ? 1 : 2) - (get.name(a) == "shan" ? 1 : 2); + }); + const geti = () => { + if (cards.includes(card)) cards.indexOf(card); + return cards.length; + }; + if (get.name(card) == "shan") return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6.5, 4, 3][Math.min(geti(), 2)]); + }, + aiUseful() { + return lib.skill.qingguo.mod.aiValue.apply(this, arguments); + }, + }, + locked: false, + audio: 2, + audioname: ["sb_zhenji"], + enable: ["chooseToRespond", "chooseToUse"], + filterCard(card) { + return get.color(card) == "black"; + }, + viewAs: { name: "shan" }, + viewAsFilter(player) { + if (!player.countCards("hs", { color: "black" })) return false; + }, + position: "hs", + prompt: "将一张黑色手牌当闪使用或打出", + check() { + return 1; + }, + ai: { + order: 3, + respondShan: true, + skillTagFilter(player) { + if (!player.countCards("hs", { color: "black" })) return false; + }, + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.6; + }, + }, + }, + }, + rende: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + discard: false, + lose: false, + delay: 0, + filterTarget(card, player, target) { + return player != target; + }, + check(card) { + if (ui.selected.cards.length > 1) return 0; + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + if (!ui.selected.cards.length && card.name == "du") return 20; + const player = get.owner(card); + let num = 0; + const evt2 = _status.event.getParent(); + player.getHistory("lose", evt => { + if (evt.getParent().skill == "rende" && evt.getParent(3) == evt2) num += evt.cards.length; + }); + if (player.hp == player.maxHp || num > 1 || player.countCards("h") <= 1) { + if (ui.selected.cards.length) { + return -1; + } + const players = game.filterPlayer(); + for (let 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); + }, + async content(event, trigger, player) { + const evt2 = event.getParent(3); + let num = 0; + player.getHistory("lose", evt => { + if (evt.getParent(2).name == "rende" && evt.getParent(5) == evt2) num += evt.cards.length; + }); + player.give(event.cards, event.target); + if (num < 2 && num + event.cards.length > 1) player.recover(); + }, + ai: { + order(skill, player) { + if (player.hp < player.maxHp && player.storage.rende < 2 && player.countCards("h") > 1) { + return 10; + } + return 1; + }, + result: { + target(player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + return target.hasSkillTag("nodu") ? 0 : -10; + } + if (target.hasJudge("lebu")) return 0; + const nh = target.countCards("h"); + const np = player.countCards("h"); + if (player.hp == player.maxHp || player.storage.rende < 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(card, player, target) { + if (player == target && get.type(card) == "equip") { + if (player.countCards("e", { subtype: get.subtype(card) })) { + const players = game.filterPlayer(); + for (let i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 0) { + return 0; + } + } + } + } + }, + }, + threaten: 0.8, + }, + }, + rende1: { + trigger: { player: "phaseUseBegin" }, + silent: true, + async content(event, trigger, player) { + player.storage.rende = 0; + }, + }, + jijiang: { + audio: "jijiang1", + audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], + unique: true, + group: ["jijiang1"], + zhuSkill: true, + filter(event, player) { + if (!player.hasZhuSkill("jijiang") || !game.hasPlayer(current => current != player && current.group == "shu")) return false; + return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3")); + }, + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { name: "sha" }, + filterCard() { + return false; + }, + selectCard: -1, + ai: { + order() { + return get.order({ name: "sha" }) + 0.3; + }, + respondSha: true, + skillTagFilter(player) { + if (!player.hasZhuSkill("jijiang") || !game.hasPlayer(current => current != player && current.group == "shu")) return false; + }, + }, + }, + jijiang1: { + audio: 2, + audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], + trigger: { player: ["useCardBegin", "respondBegin"] }, + logTarget: "targets", + filter(event, player) { + return event.skill == "jijiang"; + }, + forced: true, + async content(event, trigger, player) { + delete trigger.skill; + trigger.getParent().set("jijiang", true); + while (true) { + if (event.current == undefined) event.current = player.next; + if (event.current == player) { + player.addTempSkill("jijiang3"); + trigger.cancel(); + trigger.getParent().goto(0); + return; + } else if (event.current.group == "shu") { + const chooseToRespondEvent = event.current.chooseToRespond("是否替" + get.translation(player) + "打出一张杀?", { name: "sha" }); + chooseToRespondEvent.set("ai", () => { + const event = _status.event; + return get.attitude(event.player, event.source) - 2; + }); + chooseToRespondEvent.set("source", player); + chooseToRespondEvent.set("jijiang", true); + chooseToRespondEvent.set("skillwarn", "替" + get.translation(player) + "打出一张杀"); + chooseToRespondEvent.noOrdering = true; + chooseToRespondEvent.autochoose = lib.filter.autoRespondSha; + const { bool, card, cards } = (await chooseToRespondEvent).result; + if (bool) { + trigger.card = card; + trigger.cards = cards; + trigger.throw = false; + if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) { + event.current.ai.shown += 0.3; + if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; + } + return; + } else event.current = event.current.next; + } else event.current = event.current.next; + } + }, + }, + jijiang3: { + trigger: { global: ["useCardAfter", "useSkillAfter", "phaseAfter"] }, + silent: true, + charlotte: true, + filter(event) { + return event.skill != "jijiang" && event.skill != "qinwang"; + }, + async content(event, trigger, player) { + player.removeSkill("jijiang3"); + }, + }, + wusheng: { + audio: 2, + audioname2: { + old_guanzhang: "old_fuhun", + old_guanyu: "wusheng_re_guanyu", + }, + audioname: ["re_guanyu", "guanzhang", "jsp_guanyu", "guansuo", "re_guanzhang", "dc_jsp_guanyu"], + enable: ["chooseToRespond", "chooseToUse"], + filterCard(card, player) { + if (get.zhu(player, "shouyue")) return true; + return get.color(card) == "red"; + }, + position: "hes", + viewAs: { name: "sha" }, + viewAsFilter(player) { + if (get.zhu(player, "shouyue")) { + if (!player.countCards("hes")) return false; + } else { + if (!player.countCards("hes", { color: "red" })) return false; + } + }, + prompt: "将一张红色牌当杀使用或打出", + check(card) { + const val = get.value(card); + if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); + return 5 - val; + }, + ai: { + skillTagFilter(player) { + if (get.zhu(player, "shouyue")) { + if (!player.countCards("hes")) return false; + } else { + if (!player.countCards("hes", { color: "red" })) return false; + } + }, + respondSha: true, + }, + }, + wusheng_re_guanyu: { audio: 2 }, + zhongyi: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + filterCard: true, + position: "he", + filter(event, player) { + return player.countCards("he") > 0; + }, + discard: false, + lose: false, + async content(event, trigger, player) { + player.awakenSkill("zhongyi"); + player.addTempSkill("zhongyi2", "roundStart"); + player.addToExpansion(player, "give", event.cards).gaintag.add("zhongyi2"); + }, + }, + zhongyi2: { + trigger: { global: "damageBegin1" }, + forced: true, + popup: false, + logTarget: "source", + filter(event, player) { + return event.getParent().name == "sha" && event.source && event.source.isFriendOf(player); + }, + async content(event, trigger, player) { + trigger.num++; + }, + intro: { content: "expansion", markcount: "expansion" }, + onremove(player, skill) { + const cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + }, + paoxiao: { + audio: 2, + firstDo: true, + audioname: ["re_zhangfei", "guanzhang", "xiahouba"], + audioname2: { + old_guanzhang: "old_fuhun", + dc_xiahouba: "paoxiao_xiahouba", + }, + trigger: { player: "useCard1" }, + forced: true, + filter(event, player) { + return !event.audioed && event.card.name == "sha" && player.countUsed("sha", true) > 1 && event.getParent().type == "phase"; + }, + async content(event, trigger, player) { + trigger.audioed = true; + }, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return Infinity; + }, + }, + ai: { + unequip: true, + skillTagFilter(player, tag, arg) { + if (!get.zhu(player, "shouyue")) return false; + if (arg && arg.name == "sha") return true; + return false; + }, + }, + }, + paoxiao_xiahouba: { audio: 2 }, + guanxing_fail: {}, + guanxing: { + audio: 2, + audioname: ["jiangwei", "re_jiangwei", "re_zhugeliang", "ol_jiangwei"], + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + preHidden: true, + async content(event, trigger, player) { + const num = player.hasSkill("yizhi") && player.hasSkill("guanxing") ? 5 : Math.min(5, game.countPlayer()); + const cards = get.cards(num); + game.cardsGotoOrdering(cards); + const next = player.chooseToMove(); + next.set("list", [["牌堆顶", cards], ["牌堆底"]]); + next.set("prompt", "观星:点击将牌移动到牌堆顶或牌堆底"); + next.processAI = list => { + const cards = list[0][1], + player = _status.event.player; + const top = []; + const judges = player.getCards("j"); + let stopped = false; + if (!player.hasWuxie()) { + for (let i = 0; i < judges.length; i++) { + const judge = get.judge(judges[i]); + cards.sort((a, b) => judge(b) - judge(a)); + if (judge(cards[0]) < 0) { + stopped = true; + break; + } else { + top.unshift(cards.shift()); + } + } + } + let bottom; + if (!stopped) { + cards.sort((a, b) => 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]; + }; + const { + result: { moved }, + } = await next; + const top = moved[0]; + const bottom = moved[1]; + top.reverse(); + game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); + game.asyncDelayx(); + }, + ai: { + threaten: 1.2, + }, + }, + kongcheng: { + mod: { + targetEnabled(card, player, target, now) { + if (target.countCards("h") == 0) { + if (card.name == "sha" || card.name == "juedou") return false; + } + }, + }, + group: "kongcheng1", + audio: "kongcheng1", + audioname: ["re_zhugeliang"], + ai: { + noh: true, + skillTagFilter(player, tag) { + if (tag == "noh") { + if (player.countCards("h") != 1) return false; + } + }, + }, + }, + kongcheng1: { + audio: 2, + trigger: { player: "loseEnd" }, + forced: true, + firstDo: true, + audioname: ["re_zhugeliang"], + filter(event, player) { + if (player.countCards("h")) return false; + for (let i = 0; i < event.cards.length; i++) { + if (event.cards[i].original == "h") return true; + } + return false; + }, + async content() {}, + }, + longdan: { + audio: "longdan_sha", + audioname: ["re_zhaoyun"], + group: ["longdan_sha", "longdan_shan", "longdan_draw"], + subSkill: { + draw: { + trigger: { player: ["useCard", "respond"] }, + forced: true, + popup: false, + filter(event, player) { + if (!get.zhu(player, "shouyue")) return false; + return event.skill == "longdan_sha" || event.skill == "longdan_shan"; + }, + async content(event, trigger, player) { + player.draw(); + player.storage.fanghun2++; + }, + }, + sha: { + audio: 2, + audioname: ["re_zhaoyun"], + enable: ["chooseToUse", "chooseToRespond"], + filterCard: { name: "shan" }, + viewAs: { name: "sha" }, + viewAsFilter(player) { + if (!player.countCards("hs", "shan")) return false; + }, + position: "hs", + prompt: "将一张闪当杀使用或打出", + check() { + return 1; + }, + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondSha") && current < 0) return 0.6; + }, + }, + respondSha: true, + skillTagFilter(player) { + if (!player.countCards("hs", "shan")) return false; + }, + order() { + return get.order({ name: "sha" }) + 0.1; + }, + useful: -1, + value: -1, + }, + }, + shan: { + audio: "longdan_sha", + audioname: ["re_zhaoyun"], + enable: ["chooseToRespond", "chooseToUse"], + filterCard: { name: "sha" }, + viewAs: { name: "shan" }, + prompt: "将一张杀当闪使用或打出", + check() { + return 1; + }, + position: "hs", + viewAsFilter(player) { + if (!player.countCards("hs", "sha")) return false; + }, + ai: { + respondShan: true, + skillTagFilter(player) { + if (!player.countCards("hs", "sha")) return false; + }, + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.6; + }, + }, + order: 4, + useful: -1, + value: -1, + }, + }, + }, + }, + mashu: { + mod: { + globalFrom(from, to, distance) { + return distance - 1; + }, + }, + }, + mashu2: { + mod: { + globalFrom(from, to, distance) { + return distance - 1; + }, + }, + }, + feiying: { + mod: { + globalTo(from, to, distance) { + return distance + 1; + }, + }, + }, + tieji: { + audio: 2, + shaRelated: true, + trigger: { player: "useCardToPlayered" }, + check(event, player) { + return get.attitude(player, event.target) <= 0; + }, + filter(event, player) { + return event.card.name == "sha"; + }, + logTarget: "target", + preHidden: true, + async content(event, trigger, player) { + const judgeEvent = player.judge(card => { + if (get.zhu(_status.event.player, "shouyue")) { + if (get.suit(card) != "spade") return 2; + } else { + if (get.color(card) == "red") return 2; + } + return -0.5; + }); + judgeEvent.judge2 = result => result.bool; + const { + result: { bool }, + } = await judgeEvent; + if (bool) { + trigger.getParent().directHit.add(trigger.target); + } + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (get.attitude(player, arg.target) > 0 || arg.card.name != "sha" || !ui.cardPile.firstChild || get.color(ui.cardPile.firstChild, player) != "red") return false; + }, + }, + }, + jizhi: { + audio: 2, + audioname: ["jianyong"], + trigger: { player: "useCard" }, + frequent: true, + preHidden: true, + filter(event) { + return get.type(event.card) == "trick" && event.card.isCard; + }, + async content(event, trigger, player) { + player.draw(); + }, + ai: { + threaten: 1.4, + noautowuxie: true, + }, + }, + xinjizhi: { + audio: "jizhi", + trigger: { player: "useCard" }, + frequent: true, + // alter:true, + filter(event) { + if (get.type(event.card) == "delay") return false; + return get.type(event.card, "trick") == "trick" && event.cards[0] && event.cards[0] == event.card; + }, + async content(event, trigger, player) { + player.draw(); + }, + ai: { + threaten: 1.4, + noautowuxie: true, + }, + }, + qicai: { + mod: { + targetInRange(card, player, target, now) { + if (["trick", "delay"].includes(get.type(card))) return true; + }, + }, + }, + xinqicai: { + // alter:true, + mod: { + targetInRange(card, player, target, now) { + if (["trick", "delay"].includes(get.type(card))) return true; + }, + }, + }, + xinzhiheng: { + audio: "zhiheng", + mod: { + aiOrder(player, card, num) { + if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip") return num; + let eq = player.getEquip(get.subtype(card)); + if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp)) return 0; + }, + }, + locked: false, + enable: "phaseUse", + // alter:true, + usable: 1, + position: "he", + filterCard: true, + selectCard: [1, Infinity], + check(card) { + const player = _status.event.player; + if (get.is.altered("xinzhiheng") && get.position(card) == "h" && !player.countCards("h", card => get.value(card) >= 8)) { + return 8 - get.value(card); + } + return 6 - get.value(card); + }, + delay: 0, + async content(event, trigger, player) { + if (!player.hasSkill("xinzhiheng_delay")) game.asyncDelayx(); + player.draw(event.cards.length); + }, + group: "xinzhiheng_draw", + subSkill: { + draw: { + trigger: { player: "loseEnd" }, + silent: true, + filter(event, player) { + if (event.getParent(2).skill != "xinzhiheng") return false; + if (!get.is.altered("xinzhiheng")) return false; + if (player.countCards("h")) return false; + for (let i = 0; i < event.cards.length; i++) { + if (event.cards[i].original == "h") return true; + } + return false; + }, + async content(event, trigger, player) { + player.draw(); + player.addTempSkill("xinzhiheng_delay", "xinzhihengAfter"); + }, + }, + delay: {}, + }, + ai: { + order(item, player) { + if (player.hasCard(i => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; + return 10; + }, + result: { + player: 1, + }, + nokeep: true, + skillTagFilter(player, tag, arg) { + if (tag === "nokeep") return (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && !player.getStat().skill.xinzhiheng && player.hasCard(card => get.name(card) !== "tao", "h"); + }, + threaten: 1.55, + }, + }, + zhiheng: { + audio: 2, + audioname: ["gz_jun_sunquan"], + mod: { + aiOrder(player, card, num) { + if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip") return num; + let eq = player.getEquip(get.subtype(card)); + if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp)) return 0; + }, + }, + locked: false, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + selectCard: [1, Infinity], + prompt: "弃置任意张牌并摸等量的牌", + check(card) { + return 6 - get.value(card); + }, + async content(event, trigger, player) { + player.draw(event.cards.length); + }, + ai: { + order: 1, + result: { + player: 1, + }, + threaten: 1.5, + }, + }, + jiuyuan: { + audio: 2, + unique: true, + trigger: { target: "taoBegin" }, + zhuSkill: true, + forced: true, + filter(event, player) { + if (event.player == player) return false; + if (!player.hasZhuSkill("jiuyuan")) return false; + if (event.player.group != "wu") return false; + return true; + }, + async content(event, trigger, player) { + trigger.baseDamage++; + }, + }, + xinjiuyuan: { + audio: "jiuyuan", + unique: true, + // alter:true, + trigger: { target: "taoBegin" }, + zhuSkill: true, + forced: true, + filter(event, player) { + if (get.is.altered("xinjiuyuan")) return false; + if (event.player == player) return false; + if (!player.hasZhuSkill("jiuyuan")) return false; + if (player.hp > 0) return false; + if (event.player.group != "wu") return false; + return true; + }, + async content(event, trigger, player) { + player.recover(); + }, + global: "xinjiuyuan2", + }, + xinjiuyuan2: { + audio: "jiuyuan", + forceaudio: true, + trigger: { player: "taoBegin" }, + filter(event, player) { + if (!get.is.altered("xinjiuyuan")) return false; + if (player.group != "wu") return false; + return game.hasPlayer(target => { + return player != target && target.isDamaged() && target.hp < player.hp && target.hasZhuSkill("xinjiuyuan", player); + }); + }, + direct: true, + async content(event, trigger, player) { + event.list = game.filterPlayer(target => player != target && target.isDamaged() && target.hp < player.hp && target.hasZhuSkill("xinjiuyuan", player)).sortBySeat(); + while (event.list.length > 0) { + const current = event.list.shift(); + event.current = current; + const { + result: { bool }, + } = await player.chooseBool(get.prompt("xinjiuyuan", current)).set("choice", get.attitude(player, current) > 0); + if (bool) { + player.logSkill("xinjiuyuan", event.current); + event.current.recover(); + player.draw(); + } + } + }, + }, + qixi: { + audio: 2, + audioname: ["re_ganning", "re_heqi"], + enable: "chooseToUse", + filterCard(card) { + return get.color(card) == "black"; + }, + position: "hes", + viewAs: { name: "guohe" }, + viewAsFilter(player) { + if (!player.countCards("hes", { color: "black" })) return false; + }, + prompt: "将一张黑色牌当过河拆桥使用", + check(card) { + return 4 - get.value(card); + }, + }, + keji: { + audio: 2, + audioname: ["re_lvmeng", "sp_lvmeng"], + trigger: { player: "phaseDiscardBefore" }, + frequent(event, player) { + return player.needsToDiscard(); + }, + filter(event, player) { + if (player.getHistory("skipped").includes("phaseUse")) return true; + const history = player.getHistory("useCard").concat(player.getHistory("respond")); + for (let i = 0; i < history.length; i++) { + if (history[i].card.name == "sha" && history[i].isPhaseUsing()) return false; + } + return true; + }, + async content(event, trigger, player) { + trigger.cancel(); + }, + }, + kurou: { + audio: 2, + enable: "phaseUse", + prompt: "失去1点体力并摸两张牌", + async content(event, trigger, player) { + player.loseHp(1); + player.draw(2); + }, + ai: { + basic: { + order: 1, + }, + result: { + player(player) { + if (player.countCards("h") >= player.hp - 1) return -1; + if (player.hp < 3) return -1; + return 1; + }, + }, + }, + }, + yingzi: { + audio: 2, + audioname: ["sp_lvmeng"], + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + filter(event, player) { + return !event.numFixed; + }, + async content(event, trigger, player) { + trigger.num++; + }, + ai: { + threaten: 1.3, + }, + }, + fanjian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0; + }, + filterTarget(card, player, target) { + return player != target; + }, + async content(event, trigger, player) { + const target = event.target; + const control = await target + .chooseControl("heart2", "diamond2", "club2", "spade2") + .set("ai", event => { + switch (Math.floor(Math.random() * 6)) { + case 0: + return "heart2"; + case 1: + case 4: + case 5: + return "diamond2"; + case 2: + return "club2"; + case 3: + return "spade2"; + } + }) + .forResultControl(); + game.log(target, "选择了" + get.translation(control)); + event.choice = control; + target.chat("我选" + get.translation(event.choice)); + const { + result: { bool, cards }, + } = await target.gainPlayerCard(player, true, "h"); + if (bool && get.suit(cards[0], player) + "2" != event.choice) target.damage("nocard"); + }, + ai: { + order: 1, + result: { + target(player, target) { + const eff = get.damageEffect(target, player); + if (eff >= 0) return 1 + eff; + let value = 0, + i; + const cards = player.getCards("h"); + for (i = 0; i < cards.length; i++) value += get.value(cards[i]); + value /= player.countCards("h"); + if (target.hp == 1) return Math.min(0, value - 7); + return Math.min(0, value - 5); + }, + }, + }, + }, + guose: { + audio: 2, + filter(event, player) { + return player.countCards("hes", { suit: "diamond" }) > 0; + }, + enable: "chooseToUse", + filterCard(card) { + return get.suit(card) == "diamond"; + }, + position: "hes", + viewAs: { name: "lebu" }, + prompt: "将一张方片牌当乐不思蜀使用", + check(card) { + return 6 - get.value(card); + }, + ai: { + threaten: 1.5, + }, + }, + liuli: { + audio: 2, + audioname: ["re_daqiao", "daxiaoqiao"], + trigger: { target: "useCardToTarget" }, + preHidden: true, + filter(event, player) { + if (event.card.name != "sha") return false; + if (player.countCards("he") == 0) return false; + return game.hasPlayer(current => { + return player.inRange(current) && current != event.player && current != player && lib.filter.targetEnabled(event.card, event.player, current); + }); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + position: "he", + filterCard: lib.filter.cardDiscardable, + filterTarget: (card, player, target) => { + const trigger = _status.event; + if (player.inRange(target) && target != trigger.source) { + if (lib.filter.targetEnabled(trigger.card, trigger.source, target)) return true; + } + return false; + }, + ai1: card => get.unuseful(card) + 9, + ai2: target => { + if (_status.event.player.countCards("h", "shan")) { + return -get.attitude(_status.event.player, target); + } + if (get.attitude(_status.event.player, target) < 5) { + return 6 - get.attitude(_status.event.player, target); + } + if (_status.event.player.hp == 1 && player.countCards("h", "shan") == 0) { + return 10 - get.attitude(_status.event.player, target); + } + if (_status.event.player.hp == 2 && player.countCards("h", "shan") == 0) { + return 8 - get.attitude(_status.event.player, target); + } + return -1; + }, + prompt: get.prompt("liuli"), + prompt2: "弃置一张牌,将此【杀】转移给攻击范围内的一名其他角色", + source: trigger.player, + card: trigger.card, + }) + .setHiddenSkill(event.name) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + player.logSkill(event.name, target); + player.discard(event.cards); + const evt = trigger.getParent(); + evt.triggeredTargets2.remove(player); + evt.targets.remove(player); + evt.targets.push(target); + }, + ai: { + effect: { + target(card, player, target) { + if (target.countCards("he") == 0) return; + if (card.name != "sha") return; + let min = 1; + const friend = get.attitude(player, target) > 0; + const vcard = { name: "shacopy", nature: card.nature, suit: card.suit }; + const players = game.filterPlayer(); + for (let i = 0; i < players.length; i++) { + if (player != players[i] && get.attitude(target, players[i]) < 0 && target.canUse(card, players[i])) { + if (!friend) return 0; + if (get.effect(players[i], vcard, player, player) > 0) { + if (!player.canUse(card, players[0])) { + return [0, 0.1]; + } + min = 0; + } + } + } + return min; + }, + }, + }, + }, + qianxun: { + mod: { + targetEnabled(card, player, target, now) { + if (card.name == "shunshou" || card.name == "lebu") return false; + }, + }, + audio: 2, + }, + lianying: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + frequent: true, + filter(event, player) { + if (player.countCards("h")) return false; + const evt = event.getl(player); + return evt && evt.player == player && evt.hs && evt.hs.length > 0; + }, + async content(event, trigger, player) { + player.draw(); + }, + ai: { + threaten: 0.8, + effect: { + target(card) { + if (card.name == "guohe" || card.name == "liuxinghuoyu") return 0.5; + }, + }, + noh: true, + skillTagFilter(player, tag) { + if (tag == "noh") { + if (player.countCards("h") != 1) return false; + } + }, + }, + }, + xiaoji: { + audio: 2, + audioname: ["sp_sunshangxiang", "re_sunshangxiang"], + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + frequent: true, + getIndex(event, player) { + const evt = event.getl(player); + if (evt && evt.player === player && evt.es) return evt.es.length; + return false; + }, + async content(event, trigger, player) { + player.draw(2); + }, + ai: { + noe: true, + reverseEquip: true, + effect: { + target(card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, + }, + }, + jieyin: { + audio: 2, + enable: "phaseUse", + filterCard: true, + usable: 1, + selectCard: 2, + check(card) { + const player = get.owner(card); + if (player.countCards("h") > player.hp) return 8 - get.value(card); + if (player.hp < player.maxHp) return 6 - get.value(card); + return 4 - get.value(card); + }, + filterTarget(card, player, target) { + if (!target.hasSex("male")) return false; + if (target.hp >= target.maxHp) return false; + if (target == player) return false; + return true; + }, + async content(event, trigger, player) { + player.recover(); + event.target.recover(); + }, + ai: { + order: 5.5, + result: { + player(player) { + if (player.hp < player.maxHp) return 4; + if (player.countCards("h") > player.hp) return 0; + return -1; + }, + target: 4, + }, + threaten: 2, + }, + }, + xinjieyin: { + group: ["xinjieyin_old", "xinjieyin_new"], + // alter:true, + subSkill: { + new: { + audio: "jieyin", + enable: "phaseUse", + filterCard: true, + usable: 1, + position: "he", + filter(event, player) { + if (!get.is.altered("xinjieyin")) return false; + return player.countCards("he") > 0; + }, + check(card) { + const player = _status.event.player; + if (get.position(card) == "e") { + const subtype = get.subtype(card); + if ( + !game.hasPlayer(current => { + return current != player && current.hp != player.hp && get.attitude(player, current) > 0 && !current.countCards("e", { subtype }); + }) + ) { + return 0; + } + // 你还想我兼容{subtype:subtype}?不可能! + if (player.countCards("h", { subtype })) return 20 - get.value(card); + return 10 - get.value(card); + } else { + if (player.countCards("e")) return 0; + if (player.countCards("h", { type: "equip" })) return 0; + return 8 - get.value(card); + } + }, + filterTarget(card, player, target) { + if (!target.hasSex("male")) return false; + card = ui.selected.cards[0]; + if (!card) return false; + if (get.position(card) == "e" && target.countCards("e", { subtype: get.subtype(card) })) return false; + return true; + }, + discard: false, + delay: 0, + lose: false, + async content(event, trigger, player) { + const { cards, target } = event; + if (get.position(cards[0]) == "e") { + player.$give(cards, target); + target.equip(cards[0]); + } else { + player.discard(cards); + } + if (player.hp > target.hp) { + player.draw(); + if (target.isDamaged()) target.recover(); + } else if (player.hp < target.hp) { + target.draw(); + if (player.isDamaged()) player.recover(); + } + }, + ai: { + order() { + const player = _status.event.player; + const es = player.getCards("e"); + for (let i = 0; i < es.length; i++) { + if (player.countCards("h", { subtype: get.subtype(es[i]) })) return 10; + } + return 2; + }, + result: { + target(player, target) { + const goon = () => { + const es = player.getCards("e"); + for (let i = 0; i < es.length; i++) { + if (player.countCards("h", { subtype: get.subtype(es[i]) })) return true; + } + return false; + }; + if (player.hp < target.hp) { + if (player.isHealthy()) { + if (!player.needsToDiscard(1) || goon()) return 0.1; + return 0; + } + return 1.5; + } + if (player.hp > target.hp) { + if (target.isHealthy()) { + if (!player.needsToDiscard(1) || goon()) return 0.1; + return 0; + } + return 1; + } + return 0; + }, + }, + }, + }, + old: { + audio: "jieyin", + enable: "phaseUse", + filterCard: true, + usable: 1, + selectCard: 2, + filter(event, player) { + if (get.is.altered("xinjieyin")) return false; + return player.countCards("h") >= 2; + }, + check(card) { + const player = get.owner(card); + if (player.countCards("h") > player.hp) return 8 - get.value(card); + if (player.hp < player.maxHp) return 6 - get.value(card); + return 4 - get.value(card); + }, + filterTarget(card, player, target) { + if (!target.hasSex("male")) return false; + if (target.hp >= target.maxHp) return false; + if (target == player) return false; + return true; + }, + async content(event, trigger, player) { + player.recover(); + event.target.recover(); + }, + ai: { + order: 5.5, + result: { + player(player) { + if (player.hp < player.maxHp) return 4; + if (player.countCards("h") > player.hp) return 0; + return -1; + }, + target: 4, + }, + }, + }, + }, + ai: { + threaten: 2.3, + }, + }, + qingnang: { + audio: 2, + enable: "phaseUse", + filterCard: true, + usable: 1, + check(card) { + return 9 - get.value(card); + }, + filterTarget(card, player, target) { + if (target.hp >= target.maxHp) return false; + return true; + }, + async content(event, trigger, player) { + event.target.recover(); + }, + ai: { + order: 9, + result: { + target(player, target) { + if (target.hp == 1) return 5; + if (player == target && player.countCards("h") > player.hp) return 5; + return 2; + }, + }, + threaten: 2, + }, + }, + jijiu: { + mod: { + aiValue(player, card, num) { + if (get.name(card) != "tao" && get.color(card) != "red") return; + const cards = player.getCards("hs", card => get.name(card) == "tao" || get.color(card) == "red"); + cards.sort((a, b) => (get.name(a) == "tao" ? 1 : 2) - (get.name(b) == "tao" ? 1 : 2)); + var geti = () => { + if (cards.includes(card)) cards.indexOf(card); + return cards.length; + }; + return Math.max(num, [6.5, 4, 3, 2][Math.min(geti(), 2)]); + }, + aiUseful() { + return lib.skill.kanpo.mod.aiValue.apply(this, arguments); + }, + }, + locked: false, + audio: 2, + audioname: ["re_huatuo"], + enable: "chooseToUse", + viewAsFilter(player) { + return player != _status.currentPhase && player.countCards("hes", { color: "red" }) > 0; + }, + filterCard(card) { + return get.color(card) == "red"; + }, + position: "hes", + viewAs: { name: "tao" }, + prompt: "将一张红色牌当桃使用", + check(card) { + return 15 - get.value(card); + }, + ai: { + threaten: 1.5, + }, + }, + wushuang: { + shaRelated: true, + audio: 2, + audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], + forced: true, + locked: true, + group: ["wushuang1", "wushuang2"], + preHidden: ["wushuang1", "wushuang2"], + }, + wushuang1: { + audio: "wushuang", + audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], + trigger: { player: "useCardToPlayered" }, + forced: true, + filter(event, player) { + return event.card.name == "sha" && !event.getParent().directHit.includes(event.target); + }, + //priority:-1, + logTarget: "target", + async content(event, trigger, player) { + const id = trigger.target.playerid; + const map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { + map[id].shanRequired++; + } else { + map[id].shanRequired = 2; + } + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (arg.card.name != "sha" || arg.target.countCards("h", "shan") > 1) return false; + }, + }, + }, + wushuang2: { + audio: "wushuang", + audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], + trigger: { player: "useCardToPlayered", target: "useCardToTargeted" }, + forced: true, + logTarget(trigger, player) { + return player == trigger.player ? trigger.target : trigger.player; + }, + filter(event, player) { + return event.card.name == "juedou"; + }, + //priority:-1, + async content(event, trigger, player) { + const id = (player == trigger.player ? trigger.target : trigger.player)["playerid"]; + const idt = trigger.target.playerid; + const map = trigger.getParent().customArgs; + if (!map[idt]) map[idt] = {}; + if (!map[idt].shaReq) map[idt].shaReq = {}; + if (!map[idt].shaReq[id]) map[idt].shaReq[id] = 1; + map[idt].shaReq[id]++; + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (arg.card.name != "juedou" || Math.floor(arg.target.countCards("h", "sha") / 2) > player.countCards("h", "sha")) return false; + }, + }, + }, + zhanshen: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + skillAnimation: true, + animationColor: "gray", + filter(event, player) { + return player.isDamaged() && game.dead.filter(target => target.isFriendOf(player)).length > 0; + }, + async content(event, trigger, player) { + player.awakenSkill("zhanshen"); + const cards = player.getEquips(1); + if (cards.length) player.discard(cards); + player.loseMaxHp(); + player.addSkills(["mashu", "shenji"]); + }, + derivation: ["mashu", "shenji"], + }, + shenji: { + mod: { + selectTarget(card, player, range) { + if (range[1] == -1) return; + if (card.name == "sha") range[1] += 2; + }, + cardUsable(card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + lijian: { + audio: 2, + audioname: ["re_diaochan"], + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.countPlayer(current => current != player && current.hasSex("male")) > 1; + }, + check(card) { + return 10 - get.value(card); + }, + filterCard: true, + position: "he", + filterTarget(card, player, target) { + if (player == target) return false; + if (!target.hasSex("male")) return false; + if (ui.selected.targets.length == 1) { + return target.canUse({ name: "juedou" }, ui.selected.targets[0]); + } + return true; + }, + targetprompt: ["先出杀", "后出杀"], + selectTarget: 2, + multitarget: true, + async content(event, trigger, player) { + const useCardEvent = event.targets[1].useCard({ name: "juedou", isCard: true }, "nowuxie", event.targets[0], "noai"); + useCardEvent.animate = false; + game.asyncDelay(0.5); + }, + ai: { + order: 8, + result: { + target(player, target) { + if (ui.selected.targets.length == 0) { + return -3; + } else { + return get.effect(target, { name: "juedou" }, ui.selected.targets[0], target); + } + }, + }, + expose: 0.4, + threaten: 3, + }, + }, + biyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + preHidden: true, + async content(event, trigger, player) { + player.draw(); + }, + }, + xinbiyue: { + audio: "biyue", + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + // alter:true, + async content(event, trigger, player) { + player.draw(); + }, + }, + yaowu: { + trigger: { player: "damageBegin3" }, + //priority:1, + audio: 2, + filter(event) { + if (event.card && event.card.name == "sha") { + if (get.color(event.card) == "red") return true; + } + return false; + }, + forced: true, + check() { + return false; + }, + async content(event, trigger, player) { + trigger.source.chooseDrawRecover(true); + }, + ai: { + halfneg: true, + effect: { + target(card, player, target, current) { + if (card.name == "sha" && get.color(card) == "red") { + return [1, -2]; + } + }, + }, + }, + }, + new_jiangchi: { + audio: 2, + trigger: { + player: "phaseDrawEnd", + }, + async cost(event, trigger, player) { + const list = ["弃牌", "摸牌", "cancel2"]; + if (!player.countCards("he")) list.remove("弃牌"); + const control = await player + .chooseControl(list, () => { + const player = _status.event.player; + if (list.includes("弃牌")) { + if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) { + return "弃牌"; + } + if (player.countCards("h", "sha") > 2) { + return "弃牌"; + } + } + if (!player.countCards("h", "sha")) { + return "摸牌"; + } + return "cancel2"; + }) + .set("prompt", get.prompt2("new_jiangchi")) + .forResultControl(); + if (control === "cancel2") event.result = { bool: false }; + else + event.result = { + bool: true, + cost_data: control, + }; + }, + async content(event, trigger, player) { + const control = event.cost_data; + + if (control == "弃牌") { + player.chooseToDiscard(true, "he"); + player.addTempSkill("jiangchi2", "phaseUseEnd"); + } else if (control == "摸牌") { + player.draw(); + player.addTempSkill("new_jiangchi3", "phaseEnd"); + } + }, + }, + new_jiangchi3: { + mod: { + cardEnabled(card) { + if (card.name == "sha") return false; + }, + cardRespondable(card) { + if (card.name == "sha") return false; + }, + ignoredHandcard(card, player) { + if (get.name(card) == "sha") return true; + }, + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && get.name(card) == "sha") return false; + }, + }, + }, + xinfu_jijie: { + enable: "phaseUse", + usable: 1, + audio: 2, + async content(event, trigger, player) { + const card = get.bottomCards()[0]; + game.cardsGotoOrdering(card); + event.card = card; + const { + result: { bool, targets }, + } = await player + .chooseTarget(true) + .set("ai", target => { + let att = get.attitude(_status.event.player, target); + if (_status.event.du) { + if (target.hasSkillTag("nodu")) return 0.5; + return -att; + } + if (att > 0) { + if (_status.event.player != target) att += 2; + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }) + .set("du", event.card.name == "du") + .set("createDialog", ["机捷:选择一名角色获得此牌", [card]]); + if (bool) { + const target = targets[0]; + player.line(target, "green"); + const gainEvent = target.gain(card, "draw"); + gainEvent.giver = player; + } + }, + ai: { + order: 7.2, + result: { + player: 1, + }, + }, + }, + xinfu_jiyuan: { + trigger: { + global: ["dying", "gainAfter", "loseAsyncAfter"], + }, + audio: 2, + getIndex(event, player) { + if (event.name !== "loseAsync") return [event.player]; + else return game.filterPlayer(current => current != player && event.getg(current).length > 0).sortBySeat(); + }, + filter(event, player, triggername, target) { + if (!target.isIn()) return false; + if (event.name === "dying") return true; + if (event.giver !== player) return false; + if (event.name === "gain") { + return event.player != player && event.getg(target).length > 0; + } + return game.hasPlayer(current => current != player && event.getg(current).length > 0); + }, + logTarget(event, player, triggername, target) { + return target; + }, + check(event, player, triggername, target) { + return get.attitude(player, target) > 0; + }, + async content(event, trigger, player) { + event.targets[0].draw(); + }, + }, +}; + +export default skills; diff --git a/character/standard/sort.js b/character/standard/sort.js new file mode 100644 index 000000000..149ca99df --- /dev/null +++ b/character/standard/sort.js @@ -0,0 +1,15 @@ +const characterSort = { + standard_2008: ["caocao", "simayi", "xiahoudun", "zhangliao", "xuzhu", "guojia", "zhenji", "liubei", "guanyu", "zhangfei", "zhugeliang", "zhaoyun", "machao", "huangyueying", "sunquan", "ganning", "lvmeng", "huanggai", "zhouyu", "daqiao", "luxun", "sunshangxiang", "huatuo", "lvbu", "diaochan"], + standard_2013: ["old_re_lidian", "huaxiong", "re_yuanshu"], + standard_2019: ["gongsunzan", "xf_yiji"], + standard_2023: ["std_panfeng", "ganfuren"], +}; + +const characterSortTranslate = { + standard_2008: "2008版标准包", + standard_2013: "2013版标准包", + standard_2019: "2019版标准包", + standard_2023: "2023版标准包", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/standard/translate.js b/character/standard/translate.js new file mode 100644 index 000000000..b2513cbd9 --- /dev/null +++ b/character/standard/translate.js @@ -0,0 +1,184 @@ +const translates = { + caocao: "曹操", + hujia: "护驾", + hujia_info: "主公技,当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。", + jianxiong: "奸雄", + jianxiong_info: "当你受到伤害后,你可以获得对你造成伤害的牌。", + + simayi: "司马懿", + fankui: "反馈", + fankui_info: "当你受到伤害后,你可以获得伤害来源的一张牌。", + guicai: "鬼才", + guicai_info: "一名角色的判定牌生效前,你可以打出一张手牌代替之。", + guicai_info_guozhan: "一名角色的判定牌生效前,你可以打出一张牌代替之。", + + xiahoudun: "夏侯惇", + zhangliao: "张辽", + xuzhu: "许褚", + guojia: "郭嘉", + zhenji: "甄宓", + liubei: "刘备", + guanyu: "关羽", + zhangfei: "张飞", + zhugeliang: "诸葛亮", + zhaoyun: "赵云", + machao: "马超", + huangyueying: "黄月英", + sunquan: "孙权", + ganning: "甘宁", + lvmeng: "吕蒙", + huanggai: "黄盖", + zhouyu: "周瑜", + daqiao: "大乔", + luxun: "陆逊", + sunshangxiang: "孙尚香", + huatuo: "华佗", + lvbu: "吕布", + diaochan: "貂蝉", + huaxiong: "华雄", + xf_yiji: "伊籍", + re_yuanshu: "袁术", + caozhang: "曹彰", + + ganglie: "刚烈", + tuxi: "突袭", + luoyi: "裸衣", + luoyi2: "裸衣", + tiandu: "天妒", + yiji: "遗计", + luoshen: "洛神", + xinluoshen: "洛神", + qingguo: "倾国", + rende: "仁德", + jijiang: "激将", + jijiang1: "激将", + jijiang2: "激将", + wusheng: "武圣", + paoxiao: "咆哮", + guanxing: "观星", + kongcheng: "空城", + kongcheng1: "空城", + longdan: "龙胆", + longdan1: "龙胆", + longdan2: "龙胆", + mashu: "马术", + mashu2: "马术", + feiying: "飞影", + tieji: "铁骑", + jizhi: "集智", + qicai: "奇才", + zhiheng: "制衡", + jiuyuan: "救援", + qixi: "奇袭", + keji: "克己", + kurou: "苦肉", + yingzi: "英姿", + fanjian: "反间", + guose: "国色", + liuli: "流离", + qianxun: "谦逊", + lianying: "连营", + xiaoji: "枭姬", + jieyin: "结姻", + xinjieyin: "结姻", + qingnang: "青囊", + jijiu: "急救", + wushuang: "无双", + wushuang1: "无双", + wushuang2: "无双", + lijian: "离间", + biyue: "闭月", + xinbiyue: "闭月", + pileTop: "牌堆顶", + pileBottom: "牌堆底", + ganglie_info: "当你受到伤害后,你可以判定。若结果不为红桃,则伤害来源须弃置两张手牌,否则受到来自你的1点伤害。", + tuxi_info: "摸牌阶段,你可以改为获得至多两名其他角色的各一张手牌。", + luoyi_info: "摸牌阶段,你可以少摸一张牌。若如此做,当你本回合内使用【杀】或【决斗】造成伤害时,此伤害+1。", + tiandu_info: "当你的判定牌生效后,你可以获得之。", + yiji_info: "当你受到1点伤害后,你可以观看牌堆顶的两张牌,然后将其分配给任意角色。", + luoshen_info: "准备阶段,你可以判定。若结果为黑色,你获得判定牌。你可重复此流程,直到出现红色的判定结果。", + luoshen_info_guozhan: "准备阶段,你可以判定。若结果为黑色,则可以继续判定,直到出现红色的判定牌。然后你获得所有黑色的判定牌。(判定结果为黑色的牌在此过程中不会进入弃牌堆)", + xinluoshen_info: "准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。", + xinluoshen_info_alter: "准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过洛神获得的牌,不计入当前回合的手牌上限。", + qingguo_info: "你可以将一张黑色手牌当做【闪】使用或打出。", + rende_info: "出牌阶段,你可以将任意张手牌交给其他角色。当你以此法于一回合内给出第二张牌时,你回复1点体力。", + jijiang_info: "主公技,当你需要使用或打出【杀】时,你可以令其他蜀势力角色依次选择是否打出一张【杀】。若有角色响应,则你视为使用或打出了此【杀】。", + wusheng_info: "你可以将一张红色牌当做【杀】使用或打出。", + paoxiao_info: "锁定技,出牌阶段,你使用【杀】没有数量限制。", + guanxing_info: "准备阶段,你可以观看牌堆顶的X张牌,并将其以任意顺序置于牌堆项或牌堆底。(X为存活角色数且至多为5)", + kongcheng_info: "锁定技,当你没有手牌时,你不能成为【杀】或【决斗】的目标。", + longdan_info: "你可以将【杀】当做【闪】,或将【闪】当做【杀】使用或打出。", + mashu_info: "锁定技,你计算与其他角色的距离时-1。", + mashu2_info: "锁定技,你计算与其他角色的距离时-1。", + feiying_info: "锁定技,其他角色计算与你的距离时+1。", + tieji_info: "当你使用【杀】指定目标后,你可以进行判定。若结果为红色,则此【杀】不可被闪避。", + jizhi_info: "当你使用非转化的普通锦囊牌时,你可以摸一张牌。", + xinjizhi: "集智", + xinjizhi_info: "当你使用非转化的普通锦囊牌时,你可以摸一张牌。", + xinjizhi_info_alter: "每当你使用一张非转化的锦囊牌,可以摸一张牌,如果摸到的是基本牌,你可以弃置这张牌,然后本回合手牌上限+1。", + xinqicai: "奇才", + xinqicai_info: "锁定技,你使用锦囊牌无距离限制。", + xinqicai_info_alter: "锁定技,你使用的锦囊牌无距离限制,你装备区内的牌不能被弃置。", + qicai_info: "锁定技,你使用锦囊牌无距离限制。", + zhiheng_info: "出牌阶段限一次,你可以弃置任意张牌,然后摸等量的牌。", + xinzhiheng: "制衡", + xinzhiheng_info: "出牌阶段限1次,你可以弃置任意张牌并摸等量的牌。", + xinzhiheng_info_alter: "出牌阶段限1次,你可以弃置任意张牌并摸等量的牌,如果在发动制衡时弃置了所有手牌,你额外摸一张牌。", + jiuyuan_info: "主公技,锁定技,其他吴势力角色对你使用的【桃】的回复值+1。", + xinjiuyuan: "救援", + xinjiuyuan_info: "主公技,锁定技,濒死阶段,吴势力角色对你使用的[桃]额外回复1点体力。", + xinjiuyuan_info_alter: "主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,其可以令你回复1点体力,然后其摸一张牌。", + qixi_info: "你可以将一张黑色牌当做【过河拆桥】使用。", + keji_info: "弃牌阶段开始时,若你于本回合的出牌阶段内没有过使用或打出过【杀】,则你可以跳过此阶段。", + kurou_info: "出牌阶段,你可以失去1点体力,然后摸两张牌。", + yingzi_info: "摸牌阶段,你可以多摸一张牌。", + fanjian_info: "出牌阶段限一次。你可以令一名角色选择一种花色,然后其获得你的一张手牌。若其以此法选择的花色与其得到的牌花色不同,则你对其造成1点伤害。", + guose_info: "你可以将一张方片牌当做【乐不思蜀】使用。", + liuli_info: "当你成为【杀】的目标时,你可以弃置一张牌并将此【杀】转移给攻击范围内的一名其他角色(不能是此【杀】的使用者)。", + qianxun_info: "锁定技,你不能成为【顺手牵羊】和【乐不思蜀】的目标。", + lianying_info: "当你失去最后的手牌时,你可以摸一张牌。", + xiaoji_info: "当你失去一张装备区内的牌后,你可以摸两张牌。", + jieyin_info: "出牌阶段限一次,你可以弃置两张手牌并选择一名已经受伤的男性角色。你与其各回复1点体力。", + xinjieyin_info: "出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。", + xinjieyin_old_info: "出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。", + xinjieyin_new_info: "出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。", + xinjieyin_info_alter: "出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。", + qingnang_info: "出牌阶段限一次,你可以弃置一张手牌并令一名角色回复1点体力。", + jijiu_info: "你的回合外,你可以将一张红色牌当做【桃】使用。", + wushuang_info: "锁定技,当你使用【杀】或【决斗】指定目标后,你令此牌需要依次使用或打出两张【闪】或【杀】响应。", + lijian_info: "出牌阶段限一次,你可以弃置一张牌,视为一名男性角色对另一名男性角色使用一张【决斗】(不可被【无懈可击】响应)。", + biyue_info: "结束阶段,你可以摸一张牌。", + xinbiyue_info: "结束阶段,你可以摸一张牌。", + xinbiyue_info_alter: "结束阶段,你可以摸一张牌,如果你没有手牌,改为摸两张牌。", + yaowu: "耀武", + yaowu_info: "锁定技,一名角色使用红色【杀】对你造成伤害时,该角色回复1点体力或摸一张牌。", + new_jiangchi: "将驰", + new_jiangchi_info: "摸牌阶段结束时,你可以选择一项:1、摸一张牌,若如此做,你本回合内不能使用或打出【杀】且【杀】不计入手牌上限。 2、弃置一张牌,若如此做,出牌阶段你使用【杀】无距离限制且你可以额外使用一张【杀】,直到回合结束。", + xinfu_jijie: "机捷", + xinfu_jijie_info: "出牌阶段限一次。你可以观看牌堆底的一张牌,然后将其交给一名角色。", + xinfu_jiyuan: "急援", + xinfu_jiyuan_info: "当有角色进入濒死状态时,或你将牌交给一名其他角色后,你可以令该角色摸一张牌。", + ganglie_three: "刚烈", + ganglie_three_info: "当你受到伤害后,你可令一名敌方角色判定。若结果不为♥,其弃置两张牌或受到来自你的1点伤害。", + zhongyi: "忠义", + zhongyi2: "忠义", + zhongyi_info: "限定技,出牌阶段,你可以将一张牌置于武将牌上。你的武将牌上有〖忠义〗牌时,己方角色使用【杀】造成的伤害+1。下轮游戏开始时,你将〖忠义〗牌置入弃牌堆。", + zhanshen: "战神", + zhanshen_info: "觉醒技,准备阶段,若场上有已死亡的其他己方角色且你已受伤,则你弃置装备区的武器牌,减1点体力上限,获得技能〖马术〗和〖神戟〗。", + shenji: "神戟", + shenji_info: "锁定技,你使用【杀】指定的目标数上限+2,次数上限+1。", + rewangzun: "妄尊", + rewangzun2: "妄尊", + rewangzun_info: "锁定技,一名其他角色的准备阶段开始时,若其体力值大于你,你摸一张牌。然后若其身份为主公/主帅/君主/地主且明置,则你摸一张牌,且其本回合的手牌上限-1。", + retongji: "同疾", + retongji_info: "攻击范围内包含你的角色成为【杀】的目标时,若你不是此【杀】的使用者或目标,其可弃置一张牌,然后将此【杀】转移给你。", + std_panfeng: "潘凤", + stdkuangfu: "狂斧", + stdkuangfu_info: "锁定技。出牌阶段限一次。当你使用【杀】对其他角色造成伤害后,若其体力值:小于你,你摸两张牌;不小于你,你失去1点体力。", + ganfuren: "甘夫人", + stdshushen: "淑慎", + stdshushen_info: "当你回复1点体力时,你可以令一名其他角色摸一张牌(若其没有手牌则改为摸两张牌)。", + old_re_lidian: "李典", +}; + +export default translates; diff --git a/character/standard/voices.js b/character/standard/voices.js new file mode 100644 index 000000000..163be6746 --- /dev/null +++ b/character/standard/voices.js @@ -0,0 +1,138 @@ +export default { + "#xunxun1": "众将死战,非我之功。", + "#xunxun2": "爱兵如子,胜乃可全。", + "#wangxi1": "大丈夫,何拘小节。", + "#wangxi2": "前尘往事,莫再提起。", + "#old_re_lidian:die": "报国杀敌,虽死犹荣……", + "#shushen1": "船到桥头自然直。", + "#shushen2": "妾身无恙,相公请安心征战。", + "#shenzhi1": "子龙将军,一切都托付给你了。", + "#shenzhi2": "阿斗,相信妈妈,没事的。", + "#ganfuren:die": "请替我照顾好阿斗。", + "#xinkuangfu1": "大斧到处,片甲不留!", + "#xinkuangfu2": "你可接得住我一斧?", + "#std_panfeng:die": "潘凤又被华雄斩了。", + "#jianxiong1": "宁教我负天下人,休教天下人负我!", + "#jianxiong2": "吾好梦中杀人!", + "#hujia1": "魏将何在?", + "#hujia2": "来人!护驾!", + "#caocao:die": "霸业未成未成啊!", + "#fankui1": "出来混,早晚要还的。", + "#fankui2": "下次注意点。", + "#guicai1": "天命?哈哈哈哈……", + "#guicai2": "吾乃天命之子!", + "#simayi:die": "难道真是天意难违?", + "#ganglie1": "鼠辈,竟敢伤我!", + "#ganglie2": "以彼之道,还施彼身!", + "#xiahoudun:die": "两边都看不见了……", + "#tuxi1": "哼,没想到吧!", + "#tuxi2": "拿来吧!", + "#zhangliao:die": "真的没想到……", + "#luoyi1": "脱!", + "#luoyi2": "谁来与我大战三百回合?", + "#xuzhu:die": "冷,好冷啊……", + "#tiandu1": "罢了。", + "#tiandu2": "也好。", + "#yiji1": "就这样吧。", + "#yiji2": "哦?", + "#guojia:die": "咳,咳……", + "#luoshen1": "髣髴兮若轻云之蔽月。", + "#luoshen2": "飘飖兮若流风之回雪。", + "#qingguo1": "凌波微步,罗袜生尘。", + "#qingguo2": "体迅飞凫,飘忽若神。", + "#zhenji:die": "悼良会之永绝兮,哀一逝而异乡。", + "#rende1": "以德服人。", + "#rende2": "唯贤唯德,能服于人。", + "#jijiang11": "蜀将何在?", + "#jijiang12": "尔等敢应战否?", + "#liubei:die": "这就是桃园吗?", + "#wusheng1": "关羽在此,尔等受死!", + "#wusheng2": "看尔乃插标卖首!", + "#guanyu:die": "什么?此地名叫麦城?", + "#paoxiao1": "燕人张飞在此!", + "#paoxiao2": "啊~~~!", + "#zhangfei:die": "实在是,杀不动了……", + "#guanxing1": "观今夜天象,知天下大事。", + "#guanxing2": "知天易,逆天难。", + "#kongcheng11": "(抚琴声)", + "#kongcheng12": "(抚琴声)", + "#zhugeliang:die": "将星陨落,天命难违。", + "#longdan_sha1": "能进能退,乃真正法器!", + "#longdan_sha2": "吾乃常山赵子龙也!", + "#zhaoyun:die": "这,就是失败的滋味吗?", + "#mashu": null, + "#mashu1": null, + "#mashu2": null, + "#tieji1": "全军突击!", + "#tieji2": "(马蹄声)", + "#machao:die": "(马蹄声)", + "#jizhi1": "哼哼~", + "#jizhi2": "哼~", + "#qicai": null, + "#qicai1": null, + "#qicai2": null, + "#huangyueying:die": "亮……", + "#zhiheng1": "容我三思。", + "#zhiheng2": "且慢。", + "#jiuyuan1": "有汝辅佐,甚好!", + "#jiuyuan2": "好舒服啊。", + "#sunquan:die": "父亲,大哥,仲谋愧矣……", + "#qixi1": "接招吧!", + "#qixi2": "你的牌太多啦!", + "#ganning:die": "二十年后,又是一条好汉……", + "#keji1": "不是不报,时候未到!", + "#keji2": "留得青山在,不怕没柴烧!", + "#lvmeng:die": "被看穿了吗……", + "#kurou1": "请鞭笞我吧,公瑾!", + "#kurou2": "赴汤蹈火,在所不辞。", + "#huanggai:die": "失血……过多了……", + "#yingzi1": "哈哈哈哈!", + "#yingzi2": "汝等看好了!", + "#fanjian1": "痛苦吧,在仇与恨的地狱中!", + "#fanjian2": "挣扎吧,在血和暗的深渊里!", + "#zhouyu:die": "既生瑜,何生……", + "#guose1": "请休息吧。", + "#guose2": "你累了。", + "#liuli1": "交给你了。", + "#liuli2": "你来嘛~", + "#daqiao:die": "伯符,我去了……", + "#qianxun1": "儒生脱尘,不为贪逸淫乐之事。", + "#qianxun2": "谦谦君子,不饮盗泉之水。", + "#lianying1": "牌不是万能的,但是没牌是万万不能的。", + "#lianying2": "旧的不去,新的不来。", + "#luxun:die": "我还是太年轻了……", + "#xiaoji1": "哼!", + "#xiaoji2": "看我的厉害!", + "#jieyin1": "夫君,身体要紧。", + "#jieyin2": "他好,我也好。", + "#sunshangxiang:die": "不!还不可以死!", + "#qingnang1": "早睡早起,方能养生。", + "#qingnang2": "越老越要补啊。", + "#jijiu1": "别紧张,有老夫呢。", + "#jijiu2": "救人一命,胜造七级浮屠。", + "#huatuo:die": "医者……不能自医啊……", + "#wushuang1": "谁能挡我!", + "#wushuang2": "神挡杀神,佛挡杀佛!", + "#lvbu:die": "不可能!", + "#lijian1": "嗯呵呵~~呵呵~~", + "#lijian2": "夫君,你要替妾身做主啊……", + "#biyue1": "失礼了~", + "#biyue2": "羡慕吧~", + "#diaochan:die": "父亲大人,对不起……", + "#yaowu1": "好大一股杀气啊!", + "#yaowu2": "好大一股酒气啊!", + "#huaxiong:die": "皮厚不挡刀啊……", + "#yicong1": "冲啊!", + "#yicong2": "众将听令,排好阵势,御敌!", + "#gongsunzan:die": "我军将败,我已无颜苟活于世……", + "#xinfu_jijie1": "一拜一起,未足为劳。", + "#xinfu_jijie2": "识言观行,方能雍容风议。", + "#xinfu_jiyuan1": "公若辞,必遭蔡瑁之害矣。", + "#xinfu_jiyuan2": "形势危急,还请速行。", + "#xf_yiji:die": "未能,救得刘公脱险……", + "#wangzun1": "真命天子,八方拜服。", + "#wangzun2": "归顺于我,封爵赏地!", + "#tongji1": "弑君之罪,当诛九族!", + "#tongji2": "你,你这是反啦!", + "#re_yuanshu:die": "把玉玺,还给我。", +}; diff --git a/character/tw.js b/character/tw.js deleted file mode 100644 index ad23edd6e..000000000 --- a/character/tw.js +++ /dev/null @@ -1,21110 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "tw", - connect: true, - characterSort: { - tw: { - tw_sp: [ - "tw_yanliang", - "tw_wenchou", - "tw_yuantan", - "tw_zhangzhao", - "tw_zhanghong", - "tw_fuwan", - "tw_yujin", - "tw_zhaoxiang", - "tw_hucheer", - "tw_hejin", - "tw_mayunlu", - "tw_re_caohong", - "tw_zangba", - "tw_liuhong", - "tw_tianyu", - "jiachong", - "duosidawang", - "wuban", - "yuejiu", - "tw_caocao", - "tw_zhangmancheng", - "tw_caozhao", - "tw_wangchang", - "tw_puyangxing", - "tw_jiangji", - "tw_niujin", - "tw_xiahouen", - "tw_xiahoushang", - "tw_zhangji", - "tw_zhangnan", - "tw_fengxí", - "tw_furong", - "tw_liwei", - "tw_yangyi", - "tw_daxiaoqiao", - "tw_dengzhi", - "tw_baoxin", - "tw_bingyuan", - "tw_fanchou", - "tw_haomeng", - "tw_huchuquan", - "tw_jianshuo", - "tw_jiling", - "tw_liufuren", - "tw_liuzhang", - "tw_mateng", - "tw_niufudongxie", - "tw_qiaorui", - "tw_weixu", - "tw_yanxiang", - "tw_yufuluo", - "tw_zhangning", - "tw_dengzhi", - "tw_yangyi", - "tw_yangang", - "tw_gongsunfan", - ], - tw_yunchouzhi: [ - "tw_wangcan", - "tw_dongzhao", - "tw_bianfuren", - "tw_feiyi", - "tw_chenzhen", - "tw_xunchen", - ], - tw_yunchouxin: ["tw_wangling", "tw_huojun", "tw_wujing", "tw_zhouchu"], - tw_yunchouren: ["tw_xujing", "tw_qiaogong"], - tw_yunchouyong: ["tw_zongyu", "tw_chendong", "tw_sunyi"], - tw_yunchouyan: ["tw_jiangqing"], - tw_zhu: ["tw_beimihu", "tw_ol_sunjian", "ol_liuyu", "tw_menghuo"], - tw_swordsman: [ - "xia_yuzhenzi", - "xia_shie", - "xia_shitao", - "xia_guanyu", - "xia_liubei", - "xia_xiahousone", - "xia_xiahoudun", - "xia_zhangwei", - "xia_xushu", - "xia_wangyue", - "xia_liyàn", - "xia_tongyuan", - "xia_lusu", - "xia_dianwei", - "xia_zhaoe", - "xia_xiahouzie", - ], - tw_mobile: ["nashime", "tw_gexuan", "tw_zhugeguo"], - tw_mobile2: [ - "tw_chengpu", - "tw_guohuai", - "old_quancong", - "tw_caoxiu", - "tw_guanqiujian", - "tw_re_fazheng", - "tw_madai", - "tw_zhangfei", - "tw_guyong", - "tw_handang", - "tw_xuezong", - "tw_yl_luzhi", - ], - tw_yijiang: [ - "tw_caoang", - "tw_caohong", - "tw_zumao", - "tw_dingfeng", - "tw_maliang", - "tw_xiahouba", - ], - tw_english: ["kaisa"], - }, - }, - character: { - tw_yanliang: ["male", "qun", 4, ["twduwang", "twylyanshi"]], - tw_wenchou: ["male", "qun", 4, ["twjuexing", "twxiayong"]], - tw_yuantan: ["male", "qun", 4, ["twqiaosi", "twbaizu"]], - xia_yuzhenzi: ["male", "qun", 3, ["twhuajing", "twtianshou"]], - xia_shie: ["male", "wei", 4, ["twdengjian", "twxinshou"]], - xia_shitao: ["male", "qun", 4, ["twjieqiu", "twenchou"]], - xia_guanyu: ["male", "qun", 4, ["twzhongyi", "twchue"]], - xia_liubei: ["male", "shu", 4, ["twshenyi", "twxinghan"]], - xia_xiahousone: ["female", "qun", 3, ["twchengxi"]], - xia_xiahoudun: ["male", "qun", 4, ["twdanlie"]], - xia_zhangwei: ["female", "qun", 3, ["twhuzhong", "twfenwang"]], - tw_zhanghong: ["male", "wu", 3, ["twquanqian", "twrouke"]], - tw_zhangzhao: ["male", "wu", 3, ["twlijian", "twchungang"]], - tw_ol_sunjian: ["male", "wu", "4/5", ["gzyinghun", "wulie", "twpolu"], ["zhu"]], - tw_menghuo: ["male", "qun", 4, ["huoshou", "rezaiqi", "twqiushou"], ["zhu"]], - ol_liuyu: ["male", "qun", 2, ["zongzuo", "zhige", "twchongwang"], ["zhu"]], - tw_gongsunfan: ["male", "qun", 4, ["twhuiyuan", "twshoushou"]], - tw_yangang: ["male", "qun", 4, ["twzhiqu", "twxianfeng"]], - xia_xiahouzie: ["female", "qun", "3/4", ["twxuechang", "twduoren"]], - xia_zhaoe: ["female", "qun", 3, ["twyanshi", "twrenchou"]], - xia_lusu: ["male", "qun", 4, ["twkaizeng", "twyangming"]], - xia_dianwei: ["male", "qun", 4, ["twliexi", "twshezhong"]], - tw_bingyuan: ["male", "qun", 3, ["twbingde", "twqingtao"]], - tw_niufudongxie: ["double", "qun", 4, ["twjuntun", "twxiongxi", "twxiafeng"]], - tw_jianshuo: ["male", "qun", 6, ["twkunsi"]], - tw_jiangji: ["male", "wei", 3, ["twjichou", "twjilun"]], - tw_mateng: ["male", "qun", 4, ["mashu", "twxiongzheng", "twluannian"], ["zhu"]], - tw_baoxin: ["male", "qun", 4, ["twmutao", "twyimou"]], - tw_liufuren: ["female", "qun", 3, ["twzhuidu", "twshigong"]], - tw_yufuluo: ["male", "qun", 6, ["twjiekuang", "twneirao"]], - tw_fengxí: ["male", "shu", 4, ["twqingkou"]], - tw_zhangji: ["male", "wei", 3, ["twdingzhen", "twyouye"]], - tw_zhangnan: ["male", "shu", 4, ["twfenwu"]], - tw_huchuquan: ["male", "qun", 4, ["twfupan"]], - tw_liwei: ["male", "shu", 4, ["twjiaohua"]], - tw_yanxiang: ["male", "qun", 3, ["twkujian", "twruilian"]], - tw_xiahouen: ["male", "wei", 5, ["twfujian", "twjianwei"]], - tw_xiahoushang: ["male", "wei", 4, ["twtanfeng"]], - tw_qiaorui: ["male", "qun", 5, ["twxiawei", "twqiongji"]], - tw_haomeng: ["male", "qun", 4, ["twgongge"]], - tw_weixu: ["male", "qun", 4, ["twsuizheng", "twtuidao"]], - xia_xushu: ["male", "qun", 4, ["twjiange", "twxiawang"]], - xia_wangyue: ["male", "qun", 4, ["twyulong", "twjianming"]], - xia_liyàn: ["male", "qun", 4, ["twzhenhu", "twlvren"]], - xia_tongyuan: ["male", "qun", 4, ["twchaofeng", "twchuanshu"]], - tw_zhangning: ["female", "qun", 3, ["twxingzhui", "twjuchen"]], - tw_yangyi: ["male", "shu", 3, ["duoduan", "twgongsun"]], - tw_dengzhi: ["male", "shu", 3, ["twjimeng", "shuaiyan"]], - tw_wangling: ["male", "wei", 4, ["twmibei", "twxingqi"], ["clan:太原王氏"]], - tw_zhugeguo: ["female", "shu", 3, ["twqirang", "twyuhua"]], - tw_fanchou: ["male", "qun", 4, ["twxingluan"]], - tw_xujing: ["male", "shu", 3, ["twboming", "twejian"]], - tw_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "twxuhe"]], - tw_xuezong: ["male", "wu", 3, ["funan", "twjiexun"]], - tw_xunchen: ["male", "qun", 3, ["twweipo", "mjchenshi", "twmouzhi"]], - tw_jiangqing: ["male", "wu", 4, ["twshangyi", "twxiangyu"]], - tw_guyong: ["male", "wu", 3, ["twgyshenxing", "twbingyi"]], - tw_chendong: ["male", "wu", 4, ["twyilie", "twfenming"]], - tw_handang: ["male", "wu", 4, ["twgongji", "twjiefan"]], - tw_jiling: ["male", "qun", 4, ["twshuangren"]], - tw_re_fazheng: ["male", "shu", 3, ["twxuanhuo", "twenyuan"]], - tw_madai: ["male", "shu", 4, ["mashu", "twqianxi"]], - tw_niujin: ["male", "wei", 4, ["twcuorui", "twliewei"]], - tw_guanqiujian: ["male", "wei", 3, ["twzhengrong", "twhongju"]], - tw_daxiaoqiao: ["female", "wu", 3, ["twxingwu", "twpingting"], ["tempname:daxiaoqiao"]], - tw_furong: ["male", "shu", 4, ["twxuewei", "twliechi"]], - tw_yl_luzhi: ["male", "qun", 3, ["twmingren", "twzhenliang"]], - tw_liuzhang: ["male", "qun", 3, ["jutu", "twyaohu", "rehuaibi"]], - tw_zongyu: ["male", "shu", 3, ["twzhibian", "twyuyan"]], - tw_zhouchu: ["male", "wu", 4, ["twguoyi", "twchuhai"]], - tw_qiaogong: ["male", "wu", 3, ["twyizhu", "twluanchou"]], - tw_feiyi: ["male", "shu", 3, ["twshengxi", "twkuanji"]], - tw_bianfuren: ["female", "wei", 3, ["twwanwei", "twyuejian"]], - tw_chenzhen: ["male", "shu", 3, ["twmuyue", "twchayi"]], - tw_caoxiu: ["male", "wei", 4, ["twqianju", "twqingxi"]], - tw_sunyi: ["male", "wu", 4, ["twzaoli"]], - tw_puyangxing: ["male", "wu", 4, ["twzhengjian", "twzhongchi"]], - tw_tianyu: ["male", "wei", 4, ["twzhenxi", "twyangshi"]], - old_quancong: ["male", "wu", 4, ["zhenshan"]], - tw_wujing: ["male", "wu", 4, ["twfenghan", "twcongji"]], - tw_wangcan: ["male", "wei", 3, ["twdianyi", "twyingji", "twshanghe"]], - tw_wangchang: ["male", "wei", 3, ["twkaiji", "twshepan"], ["clan:太原王氏"]], - tw_caozhao: ["male", "wei", 4, ["twfuzuan", "twchongqi"]], - tw_guohuai: ["male", "wei", 4, ["twjingce", "yuzhang"]], - tw_chengpu: ["male", "wu", 4, ["twlihuo", "twchunlao"]], - tw_zhangmancheng: ["male", "qun", 4, ["twfengji", "twyiju", "twbudao"]], - tw_caocao: ["male", "qun", 4, ["twlingfa"]], - tw_liuhong: ["male", "qun", 4, ["twyujue", "twgezhi", "twfengqi"], ["zhu"]], - tw_huojun: ["male", "shu", 4, ["twsidai", "twjieyu"]], - tw_zangba: ["male", "wei", 4, ["twhanyu", "twhengjiang"]], - tw_re_caohong: ["male", "wei", 4, ["twyuanhu", "twjuezhu"]], - tw_mayunlu: ["female", "shu", 4, ["mashu", "twfengpo"]], - tw_hejin: ["male", "qun", 4, ["twmouzhu", "twyanhuo"]], - tw_hucheer: ["male", "qun", 4, ["twshenxing", "twdaoji"]], - tw_yujin: ["male", "qun", 4, ["xinzhenjun"]], - tw_fuwan: ["male", "qun", 4, ["twmoukui"]], - tw_zhaoxiang: ["female", "shu", 4, ["refanghun", "twfuhan", "twqueshi"]], - yuejiu: ["male", "qun", 4, ["cuijin"]], - wuban: ["male", "shu", 4, ["jintao"], ["clan:陈留吴氏"]], - duosidawang: ["male", "qun", "4/5", ["equan", "manji"]], - jiachong: ["male", "qun", 3, ["beini", "dingfa"]], - tw_dongzhao: ["male", "wei", 3, ["twmiaolve", "twyingjia"]], - tw_gexuan: ["male", "qun", 3, ["twdanfa", "twlingbao", "twsidao"]], - tw_beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia", "bingzhao"], ["zhu"]], - nashime: ["male", "qun", 3, ["chijie", "waishi", "renshe"]], - tw_xiahouba: ["male", "shu", 4, ["twyanqin", "twbaobian"]], - tw_zumao: ["male", "wu", 4, ["twtijin"]], - tw_caoang: ["male", "wei", 4, ["twxiaolian"]], - tw_dingfeng: ["male", "wu", 4, ["twqijia", "twzhuchen"]], - tw_caohong: ["male", "wei", 4, ["twhuzhu", "twliancai"]], - tw_maliang: ["male", "shu", 3, ["twrangyi", "twbaimei"]], - kaisa: ["male", "western", 4, ["zhengfu"]], - }, - characterIntro: { - yanliang: - "颜良(?~200年),字公骥,安平郡堂阳县(今河北省新河县)人。东汉末年河北将领。颜良性格促狭,虽骁勇不可独任,为一夫之勇。官渡之战,袁绍令颜良进攻白马(今河南滑县)。曹操采用军师荀攸“声东击西、轻兵掩袭”之计,大败袁军,颜良本人也被关羽亲自斩杀死,白马之围遂解。据说颜之推是其后人。", - wenchou: - "文丑(?~200年),东汉末年河北将领。文丑为一夫之勇。建安五年(200年),带领左将军刘备进驻延津,误中曹操军师荀攸的“饵敌”之计,其麾下“五六千骑”惨败于“不满六百”的曹军骑兵。文丑本人也死于乱军之中,葬于河南省禹州市。", - yuantan: - "袁谭(?-205年),字显思,汝南郡汝阳县,袁绍长子,曾任青州刺史。建安元年(196年),击败田楷、孔融,完全占据青州。袁绍去世后,审配等伪立遗令,拥立袁尚为继承人,袁谭不能继位,心怀愤恨。后袁谭、袁尚二人的矛盾彻底爆发,袁谭联合曹操共同攻打袁尚。建安十年,曹操兴兵进攻南皮,袁谭奋力抵抗,终于在曹操急攻之下战败,为曹纯麾下虎豹骑所杀。", - yuzhenzi: - "评书三国中的人物,其人有徒弟兼义子童渊、徒弟并州李彦,有徒孙常山赵子龙、北地枪王张绣、张任等人。", - shie: "三国人物,善剑术。桓、灵间,有虎贲王越以剑术称于京师,阿得其法。魏帝曹丕曾从阿学剑术。曹丕在《典论·自叙》中说:“余又学击剑,阅师多矣,四方之法各异,唯京师为善。桓、灵之间,有虎贲王越善斯术,称於京师。河南史阿言昔与越游,具得其法,余从阿学精熟。尝与平虏将军刘勋、奋威将军邓展等共饮,宿闻展善有手臂,晓五兵,又称其能空手入白刃。余与论剑良久,谓将军非法也,余顾尝好之,又得善术,因求与余对。", - shitao: "石韬,字广元,即石广元,颍川(今河南禹州)人,仕魏,官拜典农校尉、郡守。初平年间,石韬与徐庶一同来到荆州,在荆州时与诸葛亮和庞统等人相善。与崔州平(名钧)、孟公威(名建)、徐元直(名庶)为“诸葛四友”。", - xiahousone: - "夏侯子萼,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为在貂蝉不在时血婆娑的实际首领。在海外服中,设定为夏侯惇的养女,继承了夏侯紫萼的血婆娑,之后“夏侯紫萼”这个名字就被隐匿于历史之中,而“夏侯子萼”则成为了血婆娑的首领“血蔷薇”的固定名号。", - zhangwei: - "张葳,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为被夏侯子萼救下后加入的血婆娑成员。在海外服中,设定为张奂的养女,张奂为宦官迫害时与其失散,为神秘女子所救并学得武艺,后与夏侯紫萼一起建立血婆娑。在李儒分成时为了保护百姓而牺牲。", - nashime: - "难升米(なしめ,或なんしょうまい)是倭国大夫。景初二年六月,受女王卑弥呼之命,与都市牛利出使魏国,被魏国拜为率善中郎将。", - jiachong: - "贾充(217年—282年),字公闾,平阳襄陵(今山西襄汾)人,三国曹魏至西晋时期大臣,曹魏豫州刺史贾逵之子。西晋王朝的开国元勋。出身平阳贾氏。曾参与镇压淮南二叛和弑杀魏帝曹髦,因此深得司马氏信任,其女儿贾褒(一名荃)及贾南风分别嫁予司马炎弟司马攸及次子司马衷,与司马氏结为姻亲,地位显赫。晋朝建立后,转任车骑将军、散骑常侍、尚书仆射,后升任司空、太尉等要职。更封鲁郡公。咸宁末,为使持节、假黄钺、大都督征讨吴国。吴国平定后,增邑八千户。太康三年(282年),贾充去世。西晋朝廷追赠他为太宰,礼官议谥曰荒,司马炎不采纳,改谥为武。有集五卷。", - duosidawang: - "朵思大王是《三国演义》中人物,南蛮秃龙洞的元帅,孟获弟弟孟优的朋友,据说是南蛮第一智者。", - wuban: "吴班,字元雄,生卒年不详,兖州陈留郡(治今河南省开封市)人。三国时期蜀汉将领。为领军,随刘备参加伐吴之战,后又随蜀汉丞相诸葛亮参加北伐曹魏的战争,并于公元231年(建兴九年)的北伐中大破司马懿。官至骠骑将军,封绵竹侯。吴班以豪爽侠义著称于当时,又因族妹吴氏是蜀汉穆皇后,在蜀汉将领中有较高的地位。", - yuejiu: "乐就(?-197),在袁术为攻徐州而大兴七军之际,以督战官之身份担任联络之役。但是,袁术军不幸战败,其也在寿春被曹操军逮捕并遭到斩首。", - huojun: "霍峻(178年—217年),字仲邈,南郡枝江(今湖北枝江)人,东汉末年刘备麾下名将。其兄霍笃曾在故乡聚部众数百人。后霍笃逝世,刘表以霍峻继承其部曲。208年(建安十三年),刘表病逝,霍峻便率部曲归降刘备,并被任为中郎将。后随刘备入蜀,刘备从葭萌还袭刘璋,留霍峻守葭萌城。张鲁遣将杨帛劝降霍峻,霍峻严词拒绝,杨帛退去。后刘璋将扶禁、向存等率万余人由阆水上,攻围霍峻,城中兵不过数百人,霍峻坚守一年,伺机将其击破。刘备定蜀,嘉霍峻之功,于是分广汉为梓潼郡,以峻为梓潼太守、裨将军。三年后去世,还葬成都。刘备亲率群僚临会吊祭,留宿墓上,当时的人都为他感到荣幸。", - zhangmancheng: - "张曼成(?—184年6月),东汉末年黄巾之乱时南阳黄巾军首领,杀郡守褚贡,一度占据宛城数月,后为秦颉所杀。", - caozhao: - "曹肇(?-244年),字长思,沛国谯县(今安徽亳州)人。三国时期魏国大臣,大司马曹休之子。容貌俊美,有当世才度,深得魏明帝宠信,官至散骑常侍、屯骑校尉。魏明帝临死,与燕王曹宇等托付后事。不果,以长平侯归第。正始五年(244年)卒,追赠为卫将军。", - wangchang: - "王昶(2世纪-259年),字文舒,太原郡晋阳县(今山西太原)人。三国时期曹魏将领,东汉代郡太守王泽之子。出身太原王氏,少有名气,进入曹丕幕府,授太子文学。曹丕即位后,拜散骑侍郎,迁兖州刺史,撰写《治论》、《兵书》,作为朝廷提供施政参考。魏明帝曹叡即位后,升任扬烈将军,封关内侯。齐王曹芳即位,迁徐州刺史,拜征南将军。太傅司马懿掌权后,深得器重,奏请伐吴,在江陵取得重大胜利,升任征南大将军、开府仪同三司,晋爵京陵侯。正元年间(255年),参与平定“淮南三乱”有功,迁骠骑大将军,守司空。甘露四年(259年),去世,赠司徒,谥号为穆。", - puyangxing: - "濮阳兴(?-264年),字子元,陈留(治今河南开封)人,三国时期东吴大臣,吴景帝孙休末年至末帝孙皓初年任丞相。孙权时为上虞县令,后升任尚书左曹、五官中郎将、会稽太守。孙休即位,征召为太常卫将军、平军国事,封外黄侯。永安三年(260年),力主建丹杨湖田,事倍功半,百姓大怨。后升任丞相。永安七年(264年),孙休去世,濮阳兴与张布迎立孙皓。担任侍郎,兼任青州牧。同年被万彧谮毁,流放广州,途中被孙皓派人追杀,并夷三族。", - re_caohong: - "字子廉,沛国谯(今安徽亳县)人,曹操从弟,曾献马并救护曹操。后多随军征伐,平兖州、征刘表、讨祝臂。曹丕即位时封曹洪为骠骑将军。曹叡即位,拜曹洪为后将军,更封乐城侯,后复拜为骠骑将军。曹洪逝世,追谥曰恭侯。", - jiangji: - "蒋济(?—249年5月18日),字子通,楚国平阿(今安徽省怀远县常坟镇孔岗)人。三国后期曹魏名臣,历仕曹操、曹丕、曹睿、曹芳四朝。蒋济在汉末出任九江郡吏、扬州别驾。后被曹操聘为丹杨太守,不久升任丞相府主薄,西曹属,成为曹操的心腹谋士。魏文帝时期,蒋济出任东中郎将,代替曹仁统率大军,后升任尚书。魏明帝时期,蒋济出任中护军,封侯关内,功勋颇多。景初年间担任护军将军、散骑常侍等职。曹芳继位之后,转任领军将军,封昌陵亭侯,又代司马懿为太尉。正始十年(249年),蒋济随司马懿推翻曹爽势力之后,晋封都乡侯,同年卒(一说为蒋济觉得失信于曹爽,不久后自责忧愤而死),谥曰景侯。", - huchuquan: - "呼厨泉(生卒年不详),东汉末年、三国时期匈奴单于。南匈奴羌渠单于之子,于夫罗之弟。于夫罗死后继任成为单于,曾数次依附,又反叛东汉。建安七年(公元202年),呼厨泉统领南匈奴诸部作乱平阳,钟繇率诸军围之。河北袁氏将领高干、郭援等前来增援呼厨泉,与钟繇及关中诸将大战于平阳。最终,呼厨泉惨败,从此归降曹操。建安二十一年(216年),呼厨泉被留在了邺城,南匈奴遂被分为五部。", - xiahouen: - "夏侯恩是古典小说《三国演义》中的人物,为曹操随身之背剑心腹。曹操有宝剑二口:一名“倚天剑”,一名“青釭剑”。倚天剑镇威,青釭剑杀人。倚天剑曹操自佩之,青釭剑令夏侯恩佩之。那青釭剑削铁如泥,锋利无比。《三国演义》第四十一回《刘玄德携民渡江 赵子龙单骑救主》中描写:当时夏侯恩自恃勇力,背着曹操,只顾引人抢夺掳掠。不想撞着赵云,被他一枪刺死。青釭剑自此归赵云所有。", - xiahoushang: - "夏侯尚(?~226年),字伯仁,沛国谯郡(今安徽省亳州市)人。三国时期曹魏将领,征西将军夏侯渊的堂侄。曹操平定冀州,以为军司马、五官将文学,迁黄门侍郎,随曹彰远征乌桓,得胜归来。与魏文帝曹丕亲近友好,以为征南将军,领荆州刺史,假节、都督南方诸军事,攻拔蜀国上庸,平定三郡九县,升为征南大将军;江陵击败吴将诸葛瑾,升为荆州牧,封昌陵乡侯。黄初七年(226年),去世,谥号为悼,其子夏侯玄继嗣。正始四年,配享魏武帝曹操庙庭。", - zhangnan: - "张南(?-公元222年),字文进。三国时期蜀汉将领。刘备攻伐吴国时,张南担任前部。后刘备被陆逊击败,张南兵败战死。", - fengxí: "冯习(?—222年),字休元,南郡(治今湖北省荆州市公安县)人。三国时期蜀汉将领。随刘备入川,并于刘备攻伐孙吴时担任领军,后在猇亭被吴将陆逊击败,兵败战死。", - liwei: "李遗,生卒年不详,三国时期蜀汉名臣李恢之子,关羽女儿关银屏之夫。正史鲜有其生平记载,多见于关银屏的民间传说,其名在民间传说中被传为“李蔚”,因为遗为多音字且民间传说为口头相传并不知道具体字形之故,当以史书《三国志》作李遗为正。死后夫妇二人合葬于俞元县(今云南澄江)关三小姐墓。其父去世后,继承了汉兴亭候的爵位。", - baoxin: "鲍信(151年-192年),泰山平阳(今山东新泰)人。东汉末年济北相,讨伐董卓的诸路人马之一。鲍信受何进征召在外募兵,回到洛阳时适逢董卓进京,鲍信劝袁绍除掉董卓,袁绍不同意。后袁绍、曹操等人起兵对抗董卓,鲍信也起兵响应。后联盟破裂,鲍信劝戒曹操静观其变。青州黄巾军进攻兖州,刺史刘岱不听鲍信所劝贸然出战,兵败战死。鲍信便把曹操迎立为兖州牧。在与黄巾军交战期间,鲍信为救曹操不幸战死,曹操后来追记功绩,赐封其子。", - bingyuan: - "邴原(生卒年不详),字根矩,北海朱虚(今山东临朐东)人。东汉末年名士、大臣。邴原家贫、早孤。初为北海相孔融所举。曹操为司空时,任邴原为东阁祭酒。建安十五年(210年),邴原担任丞相征事,后又代凉茂为五官将长史,闭门自守,非公事不出。随曹操征吴,于途中去世。", - jianshuo: - "蹇硕(?—189年),东汉末宦官。中平五年(188年),蹇硕为上军校尉,汉灵帝以蹇硕壮健而有武略,对其特别信任,并以其为西园军元帅,领导袁绍、曹操等八校尉,以监督司隶校尉以下诸官。蹇硕虽然握有兵权,但对何进非常畏忌,曾和宦官们一起说服灵帝派遣何进西击边章、韩遂。中平六年(189年),灵帝在病重时将刘协托给蹇硕。灵帝去世后,蹇硕想先杀何进再立刘协为天子,但因手下司马潘隐与何进有旧对何进使眼色而失败。刘辩继承帝位后,蹇硕与中常侍赵忠、郭胜等写信欲合谋除去何进兄弟,因郭胜与何进为同郡且何进及何皇后发迹亦有其功劳于是亲信何氏便怂恿赵忠等人不听蹇硕之计,且将蹇硕的书信告知何进,何进于是便派黄门将之诛杀,其部下士兵亦被何进所领。", - liufuren: - "刘夫人,东汉末年军阀袁绍的后妻,袁谭与袁尚的母亲。袁绍的二子中,袁谭年长而贤惠,袁尚年幼相貌美好。袁绍的后妻刘夫人有宠,她偏爱少子袁尚而讨厌长子袁谭,多次称赞袁尚的才能,袁绍也为三子的容貌感到惊奇,想要作为继承人,于是让袁谭做哥哥的后代,出外任青州刺史,后导致二子相争。。", - niufudongxie: - "牛辅,东汉末年武将,东汉相国董卓的女婿。董翓,牛辅之妻,董卓之女。牛辅曾任中郎将,征讨白波军,不能取胜。董卓被杀时,牛辅别屯于陕地。吕布派李肃前去征讨牛辅,被牛辅击败。后来,牛辅营中有士兵半夜背叛出逃,造成内乱,牛辅以为整营皆叛,于是带着金银珠宝,独与亲信胡赤儿等五六人逾城北渡河。赤儿等人以绳索系在牛辅腰间将其从城头放下,但赤儿等因为谋财而在离地面数丈高的地方就松开了绳子使得牛辅重重摔在地上腰部受伤,而后赤儿与诸胡人将牛辅斩首,将其首级送去长安。", - tw_zhangji: - "张既(?—223年),字德容,冯翊高陵(今陕西西安市高陵区)人。汉末三国时期曹魏名臣。举秀才出身,授新丰县令,治绩为三辅第一。河东之战时,劝说马腾参与讨伐高干、张晟叛乱。迁京兆尹,抚民兴政,联合夏侯渊平宋建,定临洮,取狄道,安郡民,迁徙氐人。张鲁投降后,建议曹操迁徙汉中百姓充实三辅,辅助曹洪击败吴兰。魏国建立后,拜尚书。黄初二年(221年),临危受命,拜雍州刺史,平定诸胡叛乱。迁凉州刺史,封西乡侯。在任期间,降苏衡,邻戴众,修工事,安抚百姓,平定西平郡麹光叛乱。一生以惠政闻名,征辟杨阜、胡遵等人,皆有名位。黄初四年(223年)去世。魏明帝曹叡即位后,追谥肃侯,其子张缉为关内侯。", - qiaorui: - "桥蕤(?—197年),东汉末年袁术部下将领,为袁术开拓地盘立下了一定战功。曹操进攻袁术时,担任迎击军的先锋。在寿春与曹操军大战,被夏侯惇杀死。据正史记载,他曾经被袁术任命为大将军。", - weixu: "魏续,东汉末年吕布帐下名将。与吕布有亲,吕布将高顺兵归续管。汉献帝建安三年(198年),曹操率军攻吕布,围之三月。魏续与侯成、宋宪缚陈宫,降曹。吕布被迫降,被缢杀在白门楼。", - yanxiang: - "阎象,东汉末期人物,袁术的主簿。献帝兴平二年(195),手执玉玺的袁术要称帝时,问于部下,只有阎象引用周文王虽拥有三分之二的天下还向殷称臣的故事进行劝谏。却未被采纳。", - yufuluo: - "东汉时匈奴单于。亦称於夫罗、栾提于夫罗、于扶罗。羌渠单于子,右贤王。前赵刘渊之祖。于东汉中平年间带兵来到中原协助东汉政府镇压起义,赶上本国叛乱,其父被杀,于是留在中原,与白波军联合,在太原、河东等地劫掠。汉末军阀混战之际,于夫罗先后与袁绍、张杨、袁术等人联合,两次与曹操交战,均被击败。后来,于夫罗去世,其弟呼厨泉继任成为单于,其子刘豹被立为左贤王。", - sp_xunchen: - "荀谌,字友若,荀彧之兄(一说荀彧之弟),荀绲之子,颍川人。曾任军阀袁绍的幕僚。帮助袁绍游说韩馥,夺取了冀州。", - sp_xujing: - "许靖(?—222年),字文休。汝南郡平舆县(今河南省平舆县)人。汉末至三国蜀汉时期重臣、名士、评论家。许靖因与从弟许邵俱以品评人物而闻名于世。后被刘翊推举为孝廉,任尚书郎。曾先后投奔孔伷、陈祎、许贡、王朗等人,于孙策攻王朗前与家属俱避难交州,受到交趾太守士燮礼待。其后受益州牧刘璋邀请,相继为巴郡、广汉、蜀郡太守。于刘备包围成都时欲越墙叛逃,为刘璋所获。刘备定蜀后欲将其弃用,在法正的建议下方以其为左将军长史。建安二十三年(218年),刘备称汉中王,任命许靖为汉中王傅。章武元年(221年),刘备称帝,任命许靖为司徒,位列三公。章武二年(222年),去世。有文集二卷。", - sp_zongyu: - "宗预(?-264年),字德艳 ,荆州南阳郡安众县(今河南省南阳市)人。三国时期蜀汉官员、将领。曾随张飞入蜀助平益州,又受辟为丞相诸葛亮手下主簿,升任参军、右中郎将。诸葛亮逝世后,宗预受命出使孙吴,得到孙权的赞赏。迁后将军,出督永安,又升任征西大将军,并受封关内侯。公元258年(景耀元年),因病回成都,受任镇军大将军。蜀汉灭亡后,宗预随后主刘禅徙往洛阳,在中途病逝。宗预为人坦率耿直,多次出使孙吴并深得孙权的敬重,为吴、汉两国同盟的巩固作出了一定的贡献。", - sp_chendong: - "陈武,东吴将领,孙策攻打刘繇,陈武前来相助,孙策非常喜爱陈武,拜为校尉,使作先锋。陈武以十数骑兵力杀敌五十余人。后于赤壁等战役屡立功勋。董袭献上严虎的人头来降孙策。赤壁之战,董袭受周瑜命,分兵去汉阳,合肥会战时接应太史慈,逍遥津支援孙权。濡须口之战时,董袭在船上督战,船覆董袭坚守殉职。", - xia_wangyue: - "王越,东汉末年游侠(生卒年不详),乃辽东燕山人士,擅使剑术, 三国时期史阿的师父,曹丕的师公,官职虎贲将军。在史书《典论》中略有记载。", - liyàn: '李彦,号称"并州第一戟",是童渊的师兄。早年间两人在玉真子门下一起习武,后成年出师开枝散叶。同为并州人的吕布在得知李彦的名声后,投入其门下学习武艺。', - re_fazheng: - "字孝直,本为刘璋部下,刘备围成都时劝说刘璋投降,而后又与刘备进取汉中,献计将曹操大将夏侯渊斩首。法正善奇谋,深受刘备信任和敬重。", - xin_guyong: - "为蔡邕之徒。其为人少言语,不饮酒,严厉正大,被张纮推荐仕于孙权。孙权任命他为会稽郡丞,行太守事,后不断升迁,官至吴国丞相。顾雍为官,多进良言,有功于吴。", - zhaoe: "赵娥,东汉酒泉郡禄福县(即肃州)人。丈夫庞子夏,表氏县(今高台县)人。庞子夏去世后,赵娥在禄福县抚养其子庞淯。她的父亲被李寿杀死。灵帝光和二年(公元179年)二月上旬的一天早晨,赵娥在都亭前与李寿相遇,她奋力挥刀杀死了李寿,随后到了都亭尊长的面前认罪伏法。后来,凉州刺史周洪、酒泉太守刘班等人共同上表朝廷,禀奏赵娥的烈义行为,刻石立碑显其赵家门户。黄门侍郎梁宽还著书追述赵娥的事迹,为其作传。西晋政治家傅玄为其作《秦女休行》诗,加以赞美。", - xiahouzie: - "夏侯紫萼,游卡桌游《三国杀阵面对决》中虚构的人物。幼年因天天帮病种的母亲采紫萼得其名。亲眼目睹母亲被宦官所杀,愤怒之下夺过佩剑斩下宦官的头颅。被神秘人所救,发现了自己的身世,决心与宦官争斗到底。后再闯荡江湖的过程中,与夏侯惇义结金兰,以夏侯家姓氏称呼。", - yangang: - "严纲(163~191年),东汉末年公孙瓒部下的冀州刺史。汉献帝初平二年(191年),袁绍与公孙瓒在界桥交战,严纲为袁绍部下麹义所斩。", - gongsunfan: - "公孙范,辽西令支(今河北迁安)人。东汉末年武将,公孙瓒从弟,官至勃海太守。公孙瓒起兵攻打袁绍之时,袁绍畏惧公孙瓒的势力,将自己的勃海太守印绶给予公孙范,意图和解,结果公孙范反而起勃海之兵帮助公孙瓒。初平二年(191年),公孙范以勃海兵助公孙瓒率二万人大破青、徐黄巾军。最后于界桥之战与公孙瓒一同败走。", - zhangzhao: - "张昭(156年-236年),字子布。徐州彭城县(今江苏省徐州市)人。汉末三国时期孙吴政权重臣。东汉末年,张昭为避战乱而南渡至扬州。孙策创业时,任命其为长史、抚军中郎将,将文武之事都委任于张昭。孙策临终前,将其弟孙权托付给张昭,张昭率群僚辅立孙权,并安抚百姓、讨伐叛军,与周瑜等辅助孙权稳定局势。孙权每次出征,常留张昭镇守后方,领幕府事,并敬称他为“张公”。赤壁之战时,张昭鉴于曹操势大,持主降论,从而被排挤出军政决策中心。孙权代理车骑将军时,任命张昭为军师。孙权被封为吴王后,任绥远将军,封由拳侯。此后曾参与撰定朝仪。孙权两次要设立丞相时,众人都推举张昭,孙权以张昭敢于直谏、性格刚直为由而不用他,先后用孙邵、顾雍。黄龙元年(229年),孙权称帝,张昭以年老多病为由,上还官位及所统领部属,改拜辅吴将军、班亚三司,改封娄侯。晚年时一度不参与政事,在家著书,即使偶有参加朝议,也常与孙权产生激烈冲突。嘉禾五年(236年),张昭去世,享年八十一岁,谥号“文”。张昭容貌严正,敢于直言谏诤,一生以忠于孙氏基业为任,但因其与孙权在个性、军政策略等方面的深层矛盾,使其以“入宫则拜孤,出宫则拜君”的地位,却终身不得任丞相。著有《春秋左氏传解》及《论语注》,今皆佚失。", - zhanghong: - "张纮(153年~212年),字子纲,徐州广陵(江苏省扬州市广陵区人)人。东汉末年文学家、官员,和张昭一起合称“二张”。曾被大将军何进、太尉朱儁、司空荀爽辟为掾属,皆不就,避难江东。孙策平定江东前,亲自多次登门邀请,张纮出仕为官。孙权即位时,建议孙权迁都秣陵。建安十七年(212年),病逝,时年六十岁,孙权为之流涕。", - }, - card: { - dz_mantianguohai: { - fullskin: true, - type: "trick", - enable: true, - derivation: "tw_dongzhao", - global: ["dz_mantianguohai"], - selectTarget: [1, 2], - filterTarget: function (card, player, target) { - return target != player && target.countCards("hej") > 0; - }, - content: function () { - player.gainPlayerCard(target, "hej", true); - }, - contentAfter: function () { - "step 0"; - var evtx = event.getParent(); - event.targets = targets.filter(function (target) { - return target.hasHistory("lose", function (evt) { - return evt.getParent(3).name == "dz_mantianguohai" && evt.getParent(4) == evtx; - }); - }); - if (!event.targets.length || !player.countCards("he")) event.finish(); - "step 1"; - var target = targets.shift(); - event.target = target; - var next = player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); - if (player.hasSkill("twyingjia") && player.countUsed("dz_mantianguohai") == 1) - next.set("ai", function (card) { - if (card.name == "dz_mantianguohai") return -10; - return -get.value(card, _status.event.getParent().target); - }); - "step 2"; - if (result.bool) { - player.give(result.cards, target); - } - "step 3"; - if (targets.length && player.countCards("h") > 0) event.goto(1); - }, - ai: { - order: 6, - tag: { - lose: 1, - loseCard: 1, - }, - result: { - target: -0.1, - }, - }, - }, - gx_lingbaoxianhu: { - fullskin: true, - type: "equip", - subtype: "equip1", - derivation: "tw_gexuan", - cardcolor: "heart", - distance: { attackFrom: -2 }, - ai: { - basic: { - equipValue: 4.5, - }, - }, - skills: ["gx_lingbaoxianhu"], - }, - gx_taijifuchen: { - fullskin: true, - type: "equip", - subtype: "equip1", - derivation: "tw_gexuan", - cardcolor: "heart", - distance: { attackFrom: -4 }, - ai: { - basic: { - equipValue: 4.5, - }, - }, - skills: ["gx_taijifuchen"], - }, - gx_chongyingshenfu: { - fullskin: true, - type: "equip", - subtype: "equip2", - derivation: "tw_gexuan", - cardcolor: "heart", - ai: { - basic: { - equipValue: 7, - }, - }, - skills: ["gx_chongyingshenfu"], - loseDelay: false, - }, - meiyingqiang: { - fullskin: true, - type: "equip", - subtype: "equip1", - cardimage: "yinyueqiang", - cardcolor: "diamond", - derivation: "tw_zhaoxiang", - distance: { attackFrom: -2 }, - ai: { - basic: { - equipValue: 4.5, - }, - }, - skills: ["meiyingqiang"], - }, - }, - characterFilter: { - nashime: function (mode) { - return mode != "guozhan"; - }, - tw_xiahouba: function (mode) { - return mode != "guozhan"; - }, - }, - skill: { - //颜良文丑,但是颜良+文丑 - twduwang: { - audio: 3, - dutySkill: true, - derivation: ["twxiayong", "twylyanshix"], - global: "twduwang_global", - group: ["twduwang_effect", "twduwang_achieve", "twduwang_fail"], - onremove: ["twduwang", "twduwang_fail"], - subSkill: { - effect: { - audio: "twduwang1.mp3", - trigger: { player: "phaseUseBegin" }, - filter(event, player) { - return game.hasPlayer((target) => { - return ( - target != player && - target.hasCard((card) => { - if (get.position(card) == "h") return true; - return target.canUse( - get.autoViewAs({ name: "juedou" }, [card]), - player, - false - ); - }, "he") - ); - }); - }, - async cost(event, trigger, player) { - let { result } = await player - .chooseTarget([1, 3], (_, player, target) => { - return ( - target != player && - target.hasCard((card) => { - if (get.position(card) == "h") return true; - return target.canUse( - get.autoViewAs({ name: "juedou" }, [card]), - player, - false - ); - }, "he") - ); - }) - .set("prompt", get.prompt("twduwang")) - .set("ai", (target) => { - const player = get.event("player"); - const num = game.countPlayer((current) => { - return ( - current != player && - current.hasCard((card) => { - if (get.position(card) == "h") return true; - return current.canUse( - get.autoViewAs({ name: "juedou" }, [card]), - player, - false - ); - }, "he") && - get.effect(current, { name: "guohe_copy2" }, current, player) + - get.effect(player, { name: "juedou" }, current, player) > - 0 - ); - }); - return ( - (Math.min(num, 3) + 1) * - get.effect(player, { name: "draw" }, player, player) + - get.effect(target, { name: "guohe_copy2" }, target, player) + - get.effect(player, { name: "juedou" }, target, player) - ); - }) - .set( - "prompt2", - "选择至多三名其他角色并摸选择角色数+1的牌,然后这些角色须将一张牌当作【决斗】对你使用" - ); - if (result.bool) result.targets.sortBySeat(); - event.result = result; - }, - async content(event, trigger, player) { - const targets = event.targets; - await player.draw(targets.length + 1); - await game.asyncDelayx(); - for (const target of targets) { - if ( - !target.hasCard((card) => { - return target.canUse( - get.autoViewAs({ name: "juedou" }, [card]), - player, - false - ); - }, "he") - ) - continue; - await target - .chooseToUse() - .set("forced", true) - .set( - "openskilldialog", - "独往:将一张牌当作【决斗】对" + get.translation(player) + "使用" - ) - .set("norestore", true) - .set("_backupevent", "twduwang_backup") - .set("targetRequired", true) - .set("complexSelect", true) - .set("custom", { - add: {}, - replace: { window: function () {} }, - }) - .backup("twduwang_backup") - .set("filterTarget", function (card, player, target) { - if ( - target != _status.event.sourcex && - !ui.selected.targets.includes(_status.event.sourcex) - ) - return false; - return lib.filter.targetEnabled.apply(this, arguments); - }) - .set("sourcex", player) - .set("addCount", false); - await game.asyncDelayx(); - } - }, - }, - backup: { - viewAs: { name: "juedou" }, - position: "he", - filterCard(card, player) { - const cardx = get.autoViewAs({ name: "juedou" }, [card]); - return lib.filter.targetEnabledx(cardx, player, get.event("sourcex")); - }, - check(card) { - if (get.name(card) == "sha") return 5 - get.value(card); - return 8 - get.value(card); - }, - precontent() { - delete event.result.skill; - }, - }, - achieve: { - audio: "twduwang2.mp3", - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - if (player.storage.twduwang_fail) return false; - const history = player.actionHistory; - if (history.length < 2) return false; - for (let i = history.length - 2; i >= 0; i--) { - if (history[i].isMe && !history[i].isSkipped) { - let num = history[i].useCard.filter((evt) => { - return evt.card.name == "juedou"; - }).length, - targets = game.players.slice().concat(game.dead.slice()); - for (const target of targets) { - num += target.actionHistory[i].useCard.filter((evt) => { - return ( - evt.card.name == "juedou" && - evt.targets && - evt.targets.includes(player) - ); - }).length; - } - return num >= (targets.length < 4 ? 3 : 4); - } - } - return false; - }, - forced: true, - skillAnimation: true, - animationColor: "metal", - async content(event, trigger, player) { - player.awakenSkill("twduwang"); - game.log(player, "完成使命"); - if (player.awakenedSkills.includes("twduwang")) { - player.restoreSkill("twduwang"); - game.log(player, "重置了技能", "#g【独往】"); - } - if (!player.storage.twduwang_fail) { - player.storage.twduwang_fail = true; - game.log(player, "修改了技能", "#g【独往】"); - } - let result, - bool1 = player.hasSkill("twxiayong", null, false, false), - bool2 = - !player.awakenedSkills.includes("twylyanshi") && - player.storage.twduwang_ylyanshi; - if (bool1 && bool2) result = { index: 2 }; - else if (bool1) result = { index: 1 }; - else if (bool2) result = { index: 0 }; - else - result = await player - .chooseControl() - .set("choiceList", ["获得〖狭勇〗", "重置〖延势〗并为其添加历战效果"]) - .set("prompt", "独往:请选择一项") - .set("ai", () => { - const player = get.event("player"), - num = game.countPlayer((current) => { - return ( - current != player && - current.hasCard((card) => { - if (get.position(card) == "h") return true; - return current.canUse( - get.autoViewAs({ name: "juedou" }, [card]), - player, - false - ); - }, "he") && - get.effect( - current, - { name: "guohe_copy2" }, - current, - player - ) / - 2.5 + - get.effect( - player, - { name: "juedou" }, - current, - player - ) > - 0 - ); - }); - return num >= 2 ? 0 : 1; - }) - .forResult(); - if (result.index == 0) await player.addSkills("twxiayong"); - if (result.index == 1) { - player.popup("twylyanshi"); - if (player.awakenedSkills.includes("twylyanshi")) { - player.restoreSkill("twylyanshi"); - game.log(player, "重置了技能", "#g【延势】"); - } - if (!player.storage.twduwang_ylyanshi) { - player.storage.twduwang_ylyanshi = true; - game.log(player, "修改了技能", "#g【延势】"); - } - } - }, - }, - fail: { - audio: "twduwang3.mp3", - trigger: { player: "die" }, - forceDie: true, - filter(event, player) { - return !player.storage.twduwang_fail; - }, - forced: true, - content() { - player.awakenSkill("twduwang"); - game.log(player, "使命失败"); - }, - }, - global: { - mod: { - cardSavable(card, player, target) { - if ( - card.name == "tao" && - target != player && - target.hasSkill("twduwang") && - !target.storage.twduwang_fail - ) - return false; - }, - }, - audio: "twduwang3.mp3", - trigger: { player: "dying" }, - filter(event, player) { - return player.hasSkill("twduwang") && !player.storage.twduwang_fail; - }, - forced: true, - content() {}, - }, - }, - }, - twylyanshi: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - filter(event, player) { - return ["juedou", "binglinchengxiax"].concat(get.zhinangs()).some((name) => { - const info = { name: name }; - return ( - get.info(info) && - player.hasCard((card) => { - return ( - get.name(card) == "sha" && - event.filterCard({ name: name, cards: [card] }, player, event) - ); - }, "hs") - ); - }); - }, - limited: true, - skillAnimation: true, - animationColor: "fire", - onremove: ["twylyanshi", "twduwang_ylyanshi"], - chooseButton: { - dialog(event, player) { - const list = ["juedou", "binglinchengxiax"] - .concat(get.zhinangs()) - .filter((name) => { - const info = { name: name }; - return ( - get.info(info) && - player.hasCard((card) => { - return ( - get.name(card) == "sha" && - event.filterCard({ name: name, cards: [card] }, player, event) - ); - }, "hs") - ); - }) - .map((name) => [get.translation(get.type(name)), "", name]); - return ui.create.dialog("延势", [list, "vcard"]); - }, - check(button) { - return get.event("player").getUseValue({ name: button.link[2] }); - }, - backup(links, player) { - return { - audio: "twylyanshi", - filterCard(card, player) { - return get.name(card) == "sha"; - }, - popname: true, - check(card) { - return 5 - get.value(card); - }, - position: "hs", - viewAs: { name: links[0][2] }, - precontent() { - delete event.result.skill; - player.logSkill("twylyanshi"); - player.awakenSkill("twylyanshi"); - if (player.storage.twduwang_ylyanshi) { - player.when({ global: "phaseEnd" }).then(() => { - if (player.awakenedSkills.includes("twylyanshi")) { - player.popup("历战"); - player.restoreSkill("twylyanshi"); - game.log(player, "触发了", "#g【延势】", "的", "#y历战", "效果"); - } - }); - } - }, - }; - }, - prompt(links, player) { - return "将一张【杀】当作" + "【" + get.translation(links[0][2]) + "】使用"; - }, - }, - subSkill: { backup: {} }, - hiddenCard(player, name) { - if ( - player.awakenedSkills.includes("twylyanshi") || - !player.countCards("hs", (card) => _status.connectMode || get.name(card) == "sha") - ) - return false; - return ["juedou", "binglinchengxiax"].concat(get.zhinangs()).includes(name); - }, - ai: { - order(item, player) { - if (!player || _status.event.type != "phase") return 0.001; - let max = 0, - names = ["juedou", "binglinchengxiax"].concat(get.zhinangs()).filter((name) => { - const info = { name: name }; - return ( - get.info(info) && - player.hasCard((card) => { - return ( - get.name(card) == "sha" && - player.hasValueTarget(get.autoViewAs(info, [card]), true, true) - ); - }, "hs") - ); - }); - if (!names.length) return 0; - names = names.map((namex) => { - return { name: namex }; - }); - names.forEach((card) => { - if (player.getUseValue(card) > 0) { - let temp = get.order(card); - if (temp > max) max = temp; - } - }); - if (max > 0) max += 0.3; - return max; - }, - result: { player: 1 }, - }, - }, - twjuexing: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer((target) => - get.info("twjuexing").filterTarget(null, player, target) - ); - }, - filterTarget(_, player, target) { - const card = new lib.element.VCard({ name: "juedou" }); - return target != player && player.canUse(card, target); - }, - usable: 1, - onremove: "twjuexing_lizhan", - async content(event, trigger, player) { - player.when({ global: "phaseEnd" }).then(() => { - player.popup("历战"); - player.addSkill("twjuexing_lizhan"); - player.addMark("twjuexing_lizhan", 1, false); - game.log(player, "触发了", "#g【绝行】", "的", "#y历战", "效果"); - }); - const target = event.target; - const card = new lib.element.VCard({ name: "juedou" }); - player.addTempSkill("twjuexing_effect"); - player - .when({ global: "useCardAfter" }) - .filter((evtx) => evtx.getParent() == event) - .then(() => { - let list = []; - var targets = [player].concat(trigger.targets); - for (const i of targets) { - if (i.isIn() && i.hasCard((card) => card.hasGaintag("twjuexing"), "h")) { - list.push([i, i.getCards("h", (card) => card.hasGaintag("twjuexing"))]); - } - } - if (list.length) { - game.loseAsync({ lose_list: list }).setContent("discardMultiple"); - } - }) - .then(() => { - let listx = []; - var targets = [player].concat(trigger.targets); - for (const i of targets) { - if (i.isIn() && i.getExpansions("twjuexing_buff").length) { - listx.push([i, i.getExpansions("twjuexing_buff")]); - } - } - if (listx.length) { - game.loseAsync({ gain_list: listx, animate: "draw" }).setContent( - "gaincardMultiple" - ); - } - }) - .then(() => { - var targets = [player].concat(trigger.targets); - targets.forEach((current) => { - current.removeSkill("twjuexing_buff"); - }); - game.delay(); - }); - await player.useCard(card, target, false); - }, - ai: { - order: 1, - result: { - target(player, target) { - return ( - get.sgn(get.attitude(player, target)) * - get.effect(target, { name: "juedou" }, player, player) * - ((player.getHp() + 1) / (target.getHp() + 1)) - ); - }, - }, - }, - subSkill: { - effect: { - trigger: { global: "useCardToBegin" }, - forced: true, - popup: false, - charlotte: true, - filter(event, player) { - return event.getParent(2).name === "twjuexing"; - }, - async content(event, trigger, player) { - const target = trigger.target; - player.addSkill("twjuexing_buff"); - target.addSkill("twjuexing_buff"); - let list = []; - for (const i of [player, target]) { - if (i.isIn() && i.countCards("h")) { - list.push([i, i.getCards("h")]); - } - } - if (list.length) { - await game - .loseAsync({ - lose_list: list, - log: true, - animate: "giveAuto", - gaintag: ["twjuexing_buff"], - }) - .setContent(get.info("sbquhu").addToExpansionMultiple); - } - if (player.getHp() > 0) - await player - .draw(player.getHp(), target.getHp() > 0 ? "nodelay" : "") - .set("gaintag", ["twjuexing"]); - if (target.getHp() > 0) - await target.draw(target.getHp()).set("gaintag", ["twjuexing"]); - await game.asyncDelay(); - }, - }, - lizhan: { - charlotte: true, - onremove: true, - marktext: "战", - intro: { content: "因【绝行】摸牌时,摸牌数+#" }, - trigger: { player: "drawBegin" }, - filter(event, player) { - if (!player.hasMark("twjuexing_lizhan")) return false; - return (event.gaintag || []).includes("twjuexing"); - }, - forced: true, - popup: false, - content() { - player.popup("历战"); - game.log(player, "触发了", "#g【绝行】", "的", "#y历战", "效果"); - trigger.num += player.countMark("twjuexing_lizhan"); - }, - }, - buff: { - charlotte: true, - onremove(player, skill) { - const cards = player.getExpansions(skill); - if (cards.length) player.gain(cards, "gain2"); - }, - intro: { - markcount: "expansion", - mark(dialog, _, player) { - var cards = player.getExpansions("twjuexing_buff"); - if (player.isUnderControl(true)) dialog.addAuto(cards); - else return "共有" + get.cnNumber(cards.length) + "张牌"; - }, - }, - }, - }, - }, - twxiayong: { - audio: 2, - audioname: ["tw_yanliang"], - locked: true, - group: "twxiayong_effect", - subSkill: { - effect: { - trigger: { global: "damageBegin1" }, - filter(event, player) { - if ( - event.getParent().type != "card" || - event.card.name != "juedou" || - !event.player.isIn() - ) - return false; - const evt = game.getGlobalHistory("useCard", (evt) => evt.card == event.card)[0]; - if (evt && evt.targets && (event.player != player || player.countCards("h"))) { - if (evt.player == player) { - return evt.targets.includes(event.player) && event.player != player; - } - return evt.targets.includes(player) && evt.player != player; - } - return false; - }, - forced: true, - popup: false, - async content(event, trigger, player) { - await player.logSkill( - "twxiayong" + (trigger.player === player ? "1" : "2"), - trigger.player - ); - if (trigger.player === player) { - const cards = player.getCards("h", (card) => { - return lib.filter.cardDiscardable(card, player, "twxiayong"); - }); - if (cards.length > 0) player.discard(cards.randomGet()); - } else { - trigger.increase("num"); - } - }, - }, - }, - }, - twxiayong1: { - audio: true, - audioname: ["tw_yanliang"], - sourceSkill: "twxiayong", - }, - twxiayong2: { - inherit: "twxiayong1", - }, - //袁谭 - twqiaosi: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return get.info("twqiaosi").getCards(player).length; - }, - check(event, player) { - const cards = get.info("twqiaosi").getCards(player); - if (cards.reduce((sum, card) => sum + get.value(card), 0)) return false; - if ( - cards.length >= player.getHp() || - cards.some( - (card) => get.name(card, player) == "tao" || get.name(card, player) == "jiu" - ) - ) - return true; - return player.getHp() > 2 && cards.length > 1; - }, - prompt2(event, player) { - const cards = get.info("twqiaosi").getCards(player); - let str = "获得" + get.translation(cards); - if (cards.length < player.getHp()) str += ",然后你失去1点体力"; - return str; - }, - async content(event, trigger, player) { - const cards = get.info("twqiaosi").getCards(player); - await player.gain(cards, "gain2"); - if (cards.length < player.getHp()) await player.loseHp(); - }, - getCards(player) { - let cards = [], - targets = game.players.slice().concat(game.dead.slice()); - for (const target of targets) { - if (target == player) continue; - const history = target.getHistory("lose", (evt) => evt.position == ui.discardPile); - if (history.length) { - for (const evt of history) cards.addArray(evt.cards2.filterInD("d")); - } - } - const historyx = game.getGlobalHistory("cardMove", (evt) => { - if (evt.name != "cardsDiscard") return false; - const evtx = evt.getParent(); - if (evtx.name != "orderingDiscard") return false; - const evt2 = evtx.relatedEvent || evtx.getParent(); - const current = evt2.player; - if (evt2.name == "phaseJudge" || current == player) return false; - return current.hasHistory("lose", (evtx3) => { - const evtx4 = evtx3.relatedEvent || evtx3.getParent(); - if (evt2 != evtx4) return false; - return evtx3.getl(current).cards2.length > 0; - }); - }); - if (historyx.length) { - for (const evtx of historyx) cards.addArray(evtx.cards.filterInD("d")); - } - return cards; - }, - }, - twbaizu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return ( - player.isDamaged() && - player.countCards("h") && - game.hasPlayer((target) => { - return target != player && target.countCards("h"); - }) && - player.getHp() + player.countMark("twbaizu_lizhan") - ); - }, - locked: true, - async cost(event, trigger, player) { - const sum = player.getHp() + player.countMark("twbaizu_lizhan"), - filterTarget = (_, player, target) => { - return target != player && target.countCards("h"); - }; - let targets = game.filterPlayer((target) => filterTarget(null, player, target)); - if (targets.length > sum) { - targets = await player - .chooseTarget( - "请选择【败族】的目标", - "令你和这些角色同时弃置一张手牌,然后你对与你弃置牌类别相同的其他角色各造成1点伤害", - filterTarget, - sum, - true - ) - .set("ai", (target) => { - const player = get.event("player"); - return ( - get.effect(target, { name: "guohe_copy2" }, target, player) + - get.damageEffect(target, player, player) - ); - }) - .forResultTargets(); - } - event.result = { bool: true, targets }; - }, - async content(event, trigger, player) { - const targets = event.targets.slice().sortBySeat(); - player.line(targets); - let list = [player] - .concat(targets) - .filter((target) => target.countDiscardableCards(target, "h")); - if (list.length) { - let discards = []; - const { result } = await player - .chooseCardOL( - list, - "败族:请弃置一张手牌", - (card, player) => { - return lib.filter.cardDiscardable(card, player); - }, - true - ) - .set("ai", get.unuseful); - if (result) { - for (let i = 0; i < result.length; i++) { - discards.push([list[i], result[i].cards]); - } - await game.loseAsync({ lose_list: discards }).setContent("discardMultiple"); - list = list.filter( - (i) => - get.type2(result[0].cards[0]) == - get.type2(result[list.indexOf(i)].cards[0]) - ); - if (list.length) { - for (const i of list) { - if (i === player) continue; - player.line(i); - await i.damage(); - } - } - } - } - player.when({ global: "phaseEnd" }).then(() => { - player.popup("历战"); - player.addMark("twbaizu_lizhan", 1, false); - game.log(player, "触发了", "#g【败族】", "的", "#y历战", "效果"); - }); - }, - subSkill: { - lizhan: { - charlotte: true, - onremove: true, - marktext: "战", - intro: { content: "【败族】目标选择数+#" }, - }, - }, - }, - //玉真子 - twhuajing: { - audio: 2, - getSkills(player) { - return player - .getCards("e", (card) => get.subtype(card) == "equip1") - .reduce((list, card) => { - const info = get.info(card); - if (info && info.skills) return list.addArray(info.skills); - return list; - }, []); - }, - trigger: { global: "phaseBefore", player: "enterGame" }, - filter(event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - locked: false, - async content(event, trigger, player) { - const skills = lib.skill.twhuajing.derivation; - for (const eff of skills) { - player.addMark(eff, 1); - player.unmarkSkill(eff); - } - player.markSkill("twhuajing"); - }, - global: "twhuajing_global", - group: "twhuajing_use", - derivation: [ - "twhuajing_jian", - "twhuajing_dao", - "twhuajing_fu", - "twhuajing_qiang", - "twhuajing_ji", - "twhuajing_gong", - ], - marktext: "武", - intro: { - markcount(storage, player) { - return lib.skill.twhuajing.derivation.filter((skill) => player.hasMark(skill)).length; - }, - content(storage, player) { - const skills = lib.skill.twhuajing.derivation.filter((skill) => - player.hasMark(skill) - ); - if (!skills.length) return "功力已消耗殆尽"; - let str = "当前武功:"; - for (const eff of skills) { - str += "
  • "; - str += lib.translate[eff]; - str += ":"; - str += lib.translate[eff + "_info"]; - } - return str; - }, - }, - subSkill: { - global: { - mod: { - attackRange(player, num) { - const skills = lib.skill.twhuajing.derivation.filter( - (skill) => player.hasMark(skill) || player.hasSkill(skill) - ); - if (skills.length) - return ( - num + - skills.length * - game.countPlayer((target) => target.hasSkill("twhuajing")) - ); - }, - }, - }, - use: { - audio: "twhuajing", - enable: "phaseUse", - filter(event, player) { - return lib.skill.twhuajing.derivation.some((skill) => player.hasMark(skill)); - }, - filterCard: true, - selectCard: [1, 4], - position: "h", - complexCard: true, - discard: false, - lose: false, - delay: false, - check(card) { - const player = get.event("player"), - skills = lib.skill.twhuajing.derivation.filter((skill) => - player.hasMark(skill) - ); - if ( - ui.selected.cards.some( - (cardx) => get.suit(cardx, player) == get.suit(card, player) - ) - ) - return 0; - return skills.length - ui.selected.cards.length; - }, - usable: 1, - prompt: "展示至多四张手牌,然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果", - async content(event, trigger, player) { - await player.showCards(event.cards, get.translation(player) + "发动了【化境】"); - const skills = lib.skill.twhuajing.derivation.filter((skill) => - player.hasMark(skill) - ); - const gainSkills = skills.randomGets( - Math.min( - skills.length, - event.cards.reduce((list, cardx) => list.add(get.suit(cardx, player)), []) - .length - ) - ); - for (const eff of gainSkills) player.popup(eff); - player.addTempSkill(gainSkills); - player.addTempSkill("twhuajing_blocker"); - player.getHistory("custom").push({ twhuajing_skills: gainSkills }); - }, - ai: { - order: 12, - result: { - player(player) { - return player.countCards("hs", (card) => { - return ( - get.name(card) == "sha" && - player.hasValueTarget(card, false, true) - ); - }); - }, - }, - }, - }, - jian: { - charlotte: true, - mark: true, - marktext: "剑", - intro: { - name: "化境·剑", - name2: "剑", - markcount: () => 0, - content: () => lib.translate.twhuajing_jian_info, - }, - nopop: true, - trigger: { player: "useCardToPlayered" }, - filter(event, player) { - return event.card.name == "sha" && event.target.countCards("he"); - }, - forced: true, - logTarget: "target", - async content(event, trigger, player) { - const target = trigger.target; - const cards = target.getDiscardableCards(player, "he"); - target.discard(cards.randomGets(Math.min(2, cards.length))).discarder = player; - }, - }, - dao: { - charlotte: true, - mark: true, - marktext: "刀", - intro: { - name: "化境·刀", - name2: "刀", - markcount: () => 0, - content: () => lib.translate.twhuajing_dao_info, - }, - nopop: true, - inherit: "guding_skill", - equipSkill: false, - }, - fu: { - charlotte: true, - mark: true, - marktext: "斧", - intro: { - name: "化境·斧", - name2: "斧", - markcount: () => 0, - content: () => lib.translate.twhuajing_fu_info, - }, - nopop: true, - trigger: { player: "shaMiss" }, - forced: true, - logTarget: "target", - async content(event, trigger, player) { - trigger.target.damage(); - }, - ai: { - directHit_ai: true, - skillTagFilter(player, tag, arg) { - if ( - !arg || - !arg.card || - arg.card.name != "sha" || - !arg.baseDamage || - arg.baseDamage <= 1 - ) - return false; - return true; - }, - }, - }, - qiang: { - charlotte: true, - mark: true, - marktext: "枪", - intro: { - name: "化境·枪", - name2: "枪", - markcount: () => 0, - content: () => lib.translate.twhuajing_qiang_info, - }, - nopop: true, - trigger: { player: "useCardAfter" }, - filter(event, player) { - return event.card.name == "sha" && get.color(event.card) == "black"; - }, - forced: true, - async content(event, trigger, player) { - const card = get.cardPile((card) => card.name == "shan"); - if (card) player.gain(card, "gain2"); - }, - }, - ji: { - charlotte: true, - mark: true, - marktext: "戟", - intro: { - name: "化境·戟", - name2: "戟", - markcount: () => 0, - content: () => lib.translate.twhuajing_ji_info, - }, - nopop: true, - trigger: { source: "damageBegin3" }, - filter(event, player) { - return event.card && event.card.name == "sha"; - }, - forced: true, - async content(event, trigger, player) { - player.draw(trigger.num); - }, - }, - gong: { - charlotte: true, - mark: true, - marktext: "弓", - intro: { - name: "化境·弓", - name2: "弓", - markcount: () => 0, - content: () => lib.translate.twhuajing_gong_info, - }, - nopop: true, - trigger: { source: "damageSource" }, - filter(event, player) { - return ( - event.card && - event.card.name == "sha" && - event.player.countDiscardableCards(player, "e") - ); - }, - forced: true, - logTarget: "player", - async content(event, trigger, player) { - trigger.player.discard( - trigger.player.getDiscardableCards(player, "e").randomGets(1) - ).discarder = player; - }, - }, - blocker: { - charlotte: true, - init(player, skill) { - player.disableSkill(skill, lib.skill.twhuajing.getSkills(player)); - }, - onremove(player, skill) { - player.enableSkill(skill); - }, - mod: { - attackRange(player, num) { - return num - player.getEquipRange(); - }, - }, - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - "phaseBefore", - ], - }, - filter(event, player) { - if (event.name == "phase") return true; - if ( - event.name == "equip" && - event.player == player && - get.subtype(event.card) == "equip1" - ) - return true; - const evt = event.getl(player); - return ( - evt && - evt.player == player && - evt.es && - evt.es.some((card) => get.subtype(card) == "equip1") - ); - }, - forced: true, - popup: false, - firstDo: true, - async content(event, trigger, player) { - player.enableSkill("twhuajing_blocker"); - player.disableSkill("twhuajing_blocker", lib.skill.twhuajing.getSkills(player)); - }, - ai: { unequip_equip1: true }, - }, - }, - }, - twtianshou: { - audio: 2, - trigger: { player: "phaseEnd" }, - filter(event, player) { - return ( - player.getHistory("sourceDamage", (evt) => { - return evt.card && evt.card.name == "sha"; - }).length && - player - .getHistory("custom", (evt) => { - return evt.twhuajing_skills; - }) - .reduce((list, evt) => list.addArray(evt.twhuajing_skills), []) - .some((skill) => player.hasMark(skill)) - ); - }, - forced: true, - async content(event, trigger, player) { - const { - result: { bool, targets }, - } = await player - .chooseTarget(lib.filter.notMe, true) - .set("prompt", "天授:令一名其他角色获得1枚“武”并获得此标记的效果") - .set("ai", (target) => { - const player = get.event("player"), - att = get.attitude(player, target); - const card = new lib.element.VCard({ name: "sha" }); - if (att > 0) - return ( - game.countPlayer((aim) => { - return ( - target.canUse(card, target) && - get.effect(aim, card, target, player) > 0 && - get.effect(aim, card, target, target) > 0 - ); - }) + 10 - ); - if (att == 0) return 1.5 + Math.random(); - return 0.1 + Math.random(); - }); - if (bool) { - const target = targets[0]; - const skills = player - .getHistory("custom", (evt) => { - return evt.twhuajing_skills; - }) - .reduce((list, evt) => list.addArray(evt.twhuajing_skills), []) - .filter((skill) => player.hasMark(skill)); - let choiceList = skills.map((i) => { - return ( - '
    【' + - get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + - "】
    " + - "
    " + - get.skillInfoTranslation(i, player) + - "
    " - ); - }); - const { - result: { control }, - } = await player - .chooseControl(skills) - .set("prompt", "选择令" + get.translation(target) + "获得的“武”") - .set("choiceList", choiceList) - .set("displayIndex", false) - .set("ai", () => get.event("controls").randomGet()); - if (control) { - player.removeMark(control, 1); - player.markSkill("twhuajing"); - player.popup(control, "metal"); - target.addTempSkill(control, { player: "phaseAfter" }); - target.addTempSkill("twhuajing_blocker", { player: "phaseAfter" }); - target.getHistory("custom").push({ twhuajing_skills: [control] }); - await player.draw(2); - } - } - }, - ai: { combo: "twhuajing" }, - }, - //史阿 - twdengjian: { - audio: 2, - trigger: { global: "phaseDiscardEnd" }, - filter(event, player) { - if (player.hasSkill("twdengjian_ban")) return false; - return ( - event.player != player && lib.skill.twdengjian.getCards(player, event.player).length - ); - }, - getCards(player, target) { - let cards = target - .getHistory("useCard", (evt) => { - return ( - evt.cards && - evt.cards.filterInD("d").some((card) => get.name(card, false) == "sha") && - target.getHistory("sourceDamage", (evtx) => { - return evtx.card && evtx.card == evt.card; - }).length - ); - }) - .reduce( - (list, evt) => - list.addArray( - evt.cards.filterInD("d").filter((card) => get.name(card, false) == "sha") - ), - [] - ); - if (cards.length) { - const history = player.actionHistory; - for (let i = history.length - 1; i >= 0; i--) { - for (let evt of history[i].gain) { - if (evt.getParent().name == "twdengjian") { - const card = evt.cards[0]; - cards = cards.filter((cardx) => get.color(cardx) != get.color(card)); - if (!cards.length) break; - } - } - if (history[i].isRound) break; - } - } - return cards; - }, - //direct:true, - frequent: true, - async content(event, trigger, player) { - const cards = lib.skill.twdengjian.getCards(player, trigger.player); - /*const {result:{bool}}=await player.chooseToDiscard(get.prompt('twdengjian'),'he') - .set('prompt2','弃置一张牌并随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】') - .set('ai',card=>7-get.value(card)) - .set('logSkill','twdengjian'); - if(bool) */ await player.gain(cards.randomGet(), "gain2").gaintag.add("twdengjianx"); - }, - group: "twdengjian_buff", - subSkill: { - ban: { charlotte: true }, - buff: { - mod: { - aiOrder(player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("twdengjianx")) - return num + 0.1; - }, - }, - audio: "twdengjian", - trigger: { player: "useCard1" }, - filter(event, player) { - return ( - event.cards && - event.cards.length == 1 && - player.getHistory("lose", (evt) => { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("twdengjianx")) return true; - } - return false; - }).length && - event.addCount !== false - ); - }, - forced: true, - locked: false, - async content(event, trigger, player) { - trigger.addCount = false; - if (player.stat[player.stat.length - 1].card.sha > 0) - player.stat[player.stat.length - 1].card.sha--; - game.log(trigger.card, "不计入次数限制"); - }, - }, - }, - }, - twdengjianx: {}, - twxinshou: { - audio: 2, - trigger: { player: "useCard" }, - filter(event, player) { - if (event.card.name != "sha") return false; - const goon = - !player.getHistory("useCard", (evt) => { - return ( - evt != event && - evt.card.name == "sha" && - get.color(evt.card) == get.color(event.card) - ); - }).length && player.isPhaseUsing(); - if (!player.hasSkill("twxinshou_0")) return goon; - if (!player.hasSkill("twxinshou_1")) - return goon && game.hasPlayer((target) => target != player); - return ( - !player.hasSkill("twdengjian_ban") && - game.hasPlayer((target) => { - if (target == player) return false; - return !target.hasSkill("twdengjian", null, null, false); - }) && - player.hasSkill("twdengjian", null, null, false) - ); - }, - direct: true, - async content(event, trigger, player) { - if (player.hasSkill("twxinshou_0") && player.hasSkill("twxinshou_1")) { - const { - result: { bool, targets }, - } = await player - .chooseTarget((card, player, target) => { - return target != player && !target.hasSkill("twdengjian", null, null, false); - }) - .set("ai", (target) => { - const player = get.event("player"); - if (get.attitude(player, target) > 0) { - if (target.isTurnedOver()) return 0; - const card = new lib.element.VCard({ name: "sha" }); - if ( - game.hasPlayer((aim) => { - return ( - target.canUse(card, target) && - get.effect(aim, card, target, player) > 0 && - get.effect(aim, card, target, target) > 0 - ); - }) - ) - return target.countCards("h") - 3; - return 0; - } - return 0; - }) - .set("prompt", get.prompt("twxinshou")) - .set( - "prompt2", - "令【登剑】失效并令一名其他角色获得【登剑】,你的下个回合开始时,其失去【登剑】,若其这期间使用【杀】造成过伤害,则你结束【登剑】的失效状态" - ); - if (bool) { - const target = targets[0]; - player.logSkill("twxinshou", target); - player.addSkill("twdengjian_ban"); - target.addAdditionalSkills("twxinshou_" + player.playerid, "twdengjian"); - player.popup("登剑"); - target.popup("登剑"); - game.log(player, "将", "#g【登剑】", "传授给了", target); - game.log(player, "的", "#g【登剑】", "被失效了"); - player - .when("phaseBegin") - .then(() => { - target.removeAdditionalSkills("twxinshou_" + player.playerid); - }) - .then(() => { - const history = game.getAllGlobalHistory("everything"); - for (let i = history.length - 1; i >= 0; i--) { - const evt = history[i]; - if ( - evt.name == "damage" && - evt.card && - evt.source && - evt.card.name == "sha" && - evt.source == target - ) { - player.popup("洗具"); - player.removeSkill("twdengjian_ban"); - game.log(player, "结束了", "#g【登剑】", "的失效状态"); - return; - } - if (evt == evtx) break; - } - player.popup("杯具"); - player.chat("剑法废掉了..."); - }) - .vars({ target: target, evtx: event }); - } - } else { - let choice = [], - choiceList = ["摸一张牌", "交给一名其他角色一张牌"]; - if (!player.hasSkill("twxinshou_0")) choice.push("摸牌"); - else choiceList[0] = '' + choiceList[0] + ""; - if (!player.hasSkill("twxinshou_1") && game.hasPlayer((target) => target != player)) - choice.push("给牌"); - else choiceList[1] = '' + choiceList[1] + ""; - const { - result: { control }, - } = await player - .chooseControl(choice, "cancel2") - .set("prompt", get.prompt("twxinshou")) - .set("choiceList", choiceList) - .set("ai", () => { - if (get.event("controls").includes("摸牌")) return "摸牌"; - const player = get.event("player"); - return game.hasPlayer((target) => { - if (target == player) return false; - if ( - player.countCards("he", (card) => card.name == "du") && - get.attitude(player, target) <= 0 - ) - return true; - if ( - player.countCards( - "he", - (card) => - get.value(card, player) < 0 && - get.attitude(player, target) * get.value(card, target) > 0 - ) - ) - return true; - return get.attitude(player, target) > 0; - }) && get.event("controls").includes("给牌") - ? "给牌" - : "cancel2"; - }); - if (control == "cancel2") return; - player.logSkill("twxinshou"); - if (control == "摸牌") { - player.addTempSkill("twxinshou_0"); - await player.draw(); - } - if (control == "给牌") { - player.addTempSkill("twxinshou_1"); - const { - result: { bool, targets }, - } = await player - .chooseTarget("交给一名其他角色一张牌", lib.filter.notMe, true) - .set("ai", (target) => { - const player = get.event("player"), - att = get.attitude(player, target); - if (player.countCards("he", (card) => card.name == "du")) return -att; - let cards = player.getCards("he", (card) => get.value(card, player) < 0); - if (cards.length) { - cards.sort((a, b) => get.value(a, player) - get.value(b, player)); - return get.value(cards[0], target) * att; - } - return att; - }); - if (bool) { - const target = targets[0]; - player.line(target); - await player.chooseToGive(target, "he", true); - } - } - } - }, - subSkill: { - 0: { charlotte: true }, - 1: { charlotte: true }, - }, - }, - //石韬 - twjieqiu: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer((target) => lib.skill.twjieqiu.filterTarget(null, player, target)); - }, - filterTarget(card, player, target) { - return target != player && !target.hasDisabledSlot(); - }, - usable: 1, - async content(event, trigger, player) { - const target = event.target, - num = target.countCards("e"); - let disables = []; - for (let i = 1; i <= 5; i++) { - for (let j = 0; j < target.countEnabledSlot(i); j++) { - disables.push(i); - } - } - target.disableEquip(disables); - if (num) await target.draw(num); - target.addSkill("twjieqiu_buff"); - target.markAuto("twjieqiu_buff", [player]); - target - .when("enableEquipEnd") - .filter((e, p) => !p.hasDisabledSlot()) - .then(() => player.removeSkill("twjieqiu_buff")); - }, - ai: { - order: 7, - result: { - target(player, target) { - return -target.countCards("e") - (get.attitude(player, target) < 0 ? 1 : 0); - }, - }, - }, - subSkill: { - used: { charlotte: true }, - buff: { - charlotte: true, - onremove: true, - trigger: { player: "phaseDiscardEnd" }, - filter(event, player) { - return player.hasDisabledSlot() && event.cards && event.cards.length; - }, - forced: true, - popup: false, - async content(event, trigger, player) { - const num = trigger.cards.length; - let list = [], - map = {}; - for (let i = 1; i < 6; i++) { - map[get.translation("equip" + i)] = "equip" + i; - if (player.hasDisabledSlot(i)) { - for (let j = 0; j < player.countDisabledSlot(i); j++) { - list.push("equip" + i); - } - } - } - let result; - const transList = list.map((i) => get.translation(i)); - if (transList.length <= num) result = { bool: true, links: transList }; - else - result = await player - .chooseButton( - ["劫囚:请选择你要恢复的装备栏", [transList, "tdnodes"]], - Math.min(transList.length, num), - true - ) - .set("map", map) - .set( - "ai", - (button) => - ["equip5", "equip4", "equip1", "equip3", "equip2"].indexOf( - get.event("map")[button.link] - ) + 2 - ) - .forResult(); - if (result.bool) - await player.enableEquip(result.links.slice().map((i) => map[i])); - }, - group: ["twjieqiu_end"], - }, - end: { - charlotte: true, - trigger: { player: "phaseEnd" }, - filter(event, player) { - return ( - player.hasDisabledSlot() && - player.getStorage("twjieqiu_buff").some((target) => { - return target.isIn() && !target.hasSkill("twjieqiu_used"); - }) - ); - }, - forced: true, - popup: false, - async content(event, trigger, player) { - const targets = player - .getStorage("twjieqiu_buff") - .filter((target) => { - return target.isIn() && !target.hasSkill("twjieqiu_used"); - }) - .sortBySeat(); - for (const target of targets) { - target.popup("劫囚"); - target.addTempSkill("twjieqiu_used", "roundStart"); - target.insertPhase(); - } - }, - }, - }, - }, - twenchou: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return game.hasPlayer((current) => - lib.skill.twenchou.filterTarget(null, player, current) - ); - }, - position: "he", - filterTarget(card, player, target) { - return target != player && target.countCards("h") && target.hasDisabledSlot(); - }, - usable: 1, - async content(event, trigger, player) { - const target = event.target; - await player.gainPlayerCard(target, "h", true, "visible"); - let list = [], - map = {}; - for (let i = 1; i < 6; i++) { - map[get.translation("equip" + i)] = "equip" + i; - if (target.hasDisabledSlot(i)) { - list.push("equip" + i); - } - } - let result; - const transList = list.map((i) => get.translation(i)); - if (transList.length == 1) result = { bool: true, links: transList }; - else - result = await player - .chooseButton( - [ - "恩仇:请选择" + get.translation(target) + "要恢复的装备栏", - [transList, "tdnodes"], - ], - true - ) - .set("map", map) - .set( - "ai", - (button) => - 1 / - (["equip5", "equip4", "equip1", "equip3", "equip2"].indexOf( - get.event("map")[button.link] - ) + - 2) - ) - .forResult(); - if (result.bool) await target.enableEquip(result.links.slice().map((i) => map[i])); - }, - ai: { - order: 9, - result: { target: -1 }, - }, - }, - //侠关羽 - twzhongyi: { - mod: { - targetInRange(card) { - if (card.name == "sha") return true; - }, - }, - audio: 2, - trigger: { player: "useCardAfter" }, - filter(event, player) { - if (event.card.name != "sha") return false; - return player.getHistory("sourceDamage", (evt) => evt.card && evt.card == event.card) - .length; - }, - forced: true, - async content(event, trigger, player) { - //const num=player.getHistory('sourceDamage',evt=>evt.card&&evt.card==trigger.card).reduce((sum,evt)=>sum+evt.num,0); - const num = game.countPlayer2((target) => { - return target.hasHistory("damage", (evt) => { - return evt.card && evt.card == trigger.card; - }); - }); - const num2 = 1 + player.getAllHistory("custom", (evt) => evt.twzhongyi).length; - let choice = ["摸牌"], - choiceList = ["摸" + get.cnNumber(num) + "张牌"]; - if (player.isDamaged()) { - choice.addArray(["回血", "背水!"]); - choiceList.addArray([ - "回复" + num + "点体力", - "失去" + num2 + "点体力,依次执行以上所有项", - ]); - } - const { - result: { control }, - } = await player - .chooseControl(choice) - .set("prompt", "忠义:请选择一项") - .set("choiceList", choiceList) - .set("ai", () => { - const player = get.event("player"); - const num = get.event("num"), - num2 = get.event("num2"); - if (player.isHealthy()) return "摸牌"; - return player.hp + - player.countCards("hs", (card) => player.canSaveCard(card, player)) - - num2 > - 0 && num > num2 - ? "背水!" - : "回血"; - }) - .set("num", num) - .set("num2", num2); - if (control != "cancel2") { - if (control == "背水!") { - await player.loseHp(num2); - player.getHistory("custom").push({ twzhongyi: true }); - } - if (control != "回血") await player.draw(num); - if (control != "摸牌") await player.recover(num); - } - }, - }, - twchue: { - audio: 2, - trigger: { player: "useCardToPlayer" }, - filter(event, player) { - return ( - event.card.name == "sha" && - event.isFirstTarget && - event.targets.length == 1 && - game.hasPlayer( - (target) => !event.targets.includes(target) && player.canUse(event.card, target) - ) - ); - }, - prompt2: "失去1点体力,额外指定至多等同于你体力值的目标", - check(event, player) { - return ( - player.hp + player.countCards("hs", (card) => player.canSaveCard(card, player)) - 1 > - 0 - ); - }, - async content(event, trigger, player) { - await player.loseHp(); - const targetx = trigger.targets.slice(), - num = player.getHp(); - if (!num) return; - const { - result: { bool, targets }, - } = await player - .chooseTarget( - "额外指定至多" + get.cnNumber(num) + "名目标", - [1, num], - (card, player, target) => { - const trigger = _status.event.getTrigger(); - return ( - !trigger.targets.includes(target) && player.canUse(trigger.card, target) - ); - } - ) - .set("ai", (target) => { - const player = get.event("player"), - trigger = _status.event.getTrigger(); - return get.effect(target, trigger.card, player, player); - }); - if (!bool) return; - player.line(targets); - trigger.targets.addArray(targets); - }, - group: ["twchue_gain", "twchue_effect"], - marktext: "勇", - intro: { - name: "勇", - content: "mark", - }, - subSkill: { - gain: { - audio: "twchue", - trigger: { player: ["damageEnd", "loseHpEnd"] }, - forced: true, - locked: false, - async content(event, trigger, player) { - await player.draw(); - player.addMark("twchue", 1); - }, - }, - effect: { - audio: "twchue", - trigger: { global: "phaseEnd" }, - filter(event, player) { - const card = new lib.element.VCard({ name: "sha" }); - return ( - player.hasUseTarget(card) && - /*player.getHistory('useSkill',evt=>{ - return evt.skill=='twchue_gain'; - }).length&&player.getHp()&&*/ player.countMark("twchue") >= player.getHp() - ); - }, - check(event, player) { - return player.hasValueTarget(new lib.element.VCard({ name: "sha" })); - }, - prompt2(event, player) { - const num = player.getHp(); - return ( - "失去" + - num + - "个“勇”标记,视为使用一张造成的伤害+1且可以额外指定" + - num + - "个目标的【杀】" - ); - }, - async content(event, trigger, player) { - const num = player.getHp(); - player.removeMark("twchue", num); - const card = new lib.element.VCard({ name: "sha" }); - player - .when("useCard2") - .filter( - (evt) => - evt.getParent(2) == event && - game.hasPlayer( - (target) => - !evt.targets.includes(target) && - player.canUse(evt.card, target) - ) - ) - .assign({ - firstDo: true, - }) - .then(() => { - trigger.baseDamage++; - player - .chooseTarget( - "额外指定至多" + get.cnNumber(num) + "名目标", - [1, num], - (card, player, target) => { - const trigger = _status.event.getTrigger(); - return ( - !trigger.targets.includes(target) && - player.canUse(trigger.card, target) - ); - } - ) - .set("ai", (target) => { - const player = get.event("player"), - trigger = _status.event.getTrigger(); - return get.effect(target, trigger.card, player, player); - }); - }) - .then(() => { - if (result.bool) { - const targets = result.targets; - player.line(targets); - trigger.targets.addArray(targets); - } - }) - .vars({ num: num }); - player.chooseUseTarget( - "视为使用造成的伤害+1且可以额外指定" + num + "个目标的【杀】", - card, - false, - true - ); - }, - }, - }, - }, - //夏侯惇 - twdanlie: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return game.hasPlayer((target) => player.canCompare(target)); - }, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - usable: 1, - selectTarget: [1, 3], - multitarget: true, - multiline: true, - group: "twdanlie_add", - content: function () { - "step 0"; - player.chooseToCompare(targets).setContent("chooseToCompareMeanwhile"); - "step 1"; - if (result.winner && result.winner == player) { - player.line(targets); - targets.forEach((target) => target.damage()); - } else player.loseHp(); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - var att = get.attitude(player, target); - if (att >= 0) return 0; - if (player.getHp() > 2) - return ( - -get.damageEffect(target, player, player) - 10 / target.countCards("h") - ); - var hs = player.getCards("h").sort((a, b) => b.number - a.number); - var ts = target.getCards("h").sort((a, b) => b.number - a.number); - if (!hs.length || !ts.length) return 0; - if (Math.min(13, hs[0].number + player.getDamagedHp()) > ts[0].number) - return -get.damageEffect(target, player, player); - return 0; - }, - }, - }, - subSkill: { - add: { - audio: "twdanlie", - trigger: { player: "compare", target: "compare" }, - filter: function (event, player) { - if (!player.isDamaged()) return false; - if (player != event.target && event.iwhile) return false; - return true; - }, - forced: true, - locked: false, - content: function () { - var num = player.getDamagedHp(); - if (player == trigger.player) { - trigger.num1 += num; - if (trigger.num1 > 13) trigger.num1 = 13; - } else { - trigger.num2 += num; - if (trigger.num2 > 13) trigger.num2 = 13; - } - game.log(player, "的拼点牌点数+", num); - }, - }, - }, - }, - //张葳 - twhuzhong: { - audio: 2, - trigger: { player: "useCardToPlayer" }, - filter: function (event, player) { - return ( - event.card.name == "sha" && - !game.hasNature(event.card, "linked") && - event.targets.length == 1 && - player.isPhaseUsing() && - (game.hasPlayer( - (target) => !event.targets.includes(target) && player.canUse(event.card, target) - ) || - event.target.countCards("h") > 0) - ); - }, - direct: true, - content: function () { - "step 0"; - var target = trigger.target; - event.target = target; - var list = ["cancel2"]; - var choiceList = [ - "令此【杀】可以额外指定一个目标", - "弃置" + - get.translation(target) + - "一张手牌,若此【杀】造成伤害,则你摸一张牌且本阶段可以额外使用一张【杀】", - ]; - if (target.countCards("h")) list.unshift("其弃置"); - else choiceList[1] = '' + choiceList[1] + ""; - if ( - game.hasPlayer( - (targetx) => - !trigger.targets.includes(targetx) && player.canUse(trigger.card, targetx) - ) - ) - list.unshift("多指"); - else choiceList[0] = '' + choiceList[0] + ""; - player - .chooseControl(list) - .set("choiceList", choiceList) - .set("ai", () => { - var controls = _status.event.controls; - var trigger = _status.event.getTrigger(); - var player = trigger.player; - var target = trigger.target; - if (controls.includes("其弃置") && _status.event.goon) return "其弃置"; - if (controls.includes("多指")) { - if ( - game.hasPlayer( - (targetx) => - !trigger.targets.includes(targetx) && - player.canUse(trigger.card, targetx) && - get.effect(targetx, trigger.card, player, player) > 0 - ) - ) - return "你弃置"; - } - return "cancel2"; - }) - .set( - "goon", - (function () { - var d1 = true; - if (player.hasSkill("jueqing") || player.hasSkill("gangzhi")) d1 = false; - if ( - !target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) || - player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: trigger.card, - }, - true - ) - ) { - if (!target.hasSkill("gangzhi")) d1 = false; - if ( - !target.hasSkillTag("filterDamage", null, { - player: player, - card: trigger.card, - }) && - get.attitude(player, target) < 0 - ) - return true; - } - if (d1) return get.damageEffect(player, player, player) > 0; - return false; - })() - ) - .set("prompt", "护众:是否摸一张牌并执行其中一项?"); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("twhuzhong", target); - player.draw(); - if (result.control == "其弃置") { - player.discardPlayerCard(target, "h", true); - player - .when("useCardAfter") - .filter((evt) => evt == trigger.getParent()) - .then(() => { - if ( - player.getHistory("sourceDamage", (evt) => evt.card == trigger.card) - .length - ) { - player.draw(); - player.addTempSkill("twhuzhong_sha", "phaseUseAfter"); - player.addMark("twhuzhong_sha", 1, false); - } - }); - event.finish(); - } - } else event.finish(); - "step 2"; - player - .chooseTarget( - "请选择" + get.translation(trigger.card) + "的额外目标", - function (card, player, target) { - var trigger = _status.event.getTrigger(); - return ( - !trigger.targets.includes(target) && player.canUse(trigger.card, target) - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - var trigger = _status.event.getTrigger(); - return get.effect(target, trigger.card, player, player); - }); - "step 3"; - if (result.bool) { - player.line(result.targets); - trigger.getParent().targets.addArray(result.targets); - game.log(result.targets, "成为了", trigger.card, "的额外目标"); - } - }, - subSkill: { - sha: { - charlotte: true, - onremove: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.countMark("twhuzhong_sha"); - }, - }, - }, - }, - }, - twfenwang: { - audio: 2, - trigger: { source: "damageBegin2", player: "damageBegin4" }, - filter: function (event, player, name) { - if (name == "damageBegin2") { - return !event.hasNature() && player.countCards("h") >= event.player.countCards("h"); - } - return event.hasNature(); - }, - forced: true, - content: function () { - "step 0"; - if (event.triggername == "damageBegin2") { - player.line(trigger.player); - trigger.num++; - event.finish(); - } else - player.chooseToDiscard("h", "弃置一张手牌,或令此伤害+1").set("ai", function (card) { - return 8 - get.value(card); - }); - "step 1"; - if (!result.bool) trigger.num++; - }, - }, - //夏侯子萼 - //差点和夏侯紫萼搞混 - twchengxi: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return game.hasPlayer((target) => lib.skill.twchengxi.filterTarget(null, player, target)); - }, - filterTarget: function (card, player, target) { - if (player.getStorage("twchengxi_used").includes(target) || target == player) - return false; - return ( - !player.hasSkillTag("noCompareSource") && - target.countCards("h") > 0 && - !target.hasSkillTag("noCompareTarget") - ); - }, - content: function () { - "step 0"; - if (!player.storage.twchengxi_used) { - player.when("phaseUseAfter").then(() => delete player.storage.twchengxi_used); - } - player.markAuto("twchengxi_used", [target]); - player.draw(); - "step 1"; - if (player.canCompare(target)) player.chooseToCompare(target); - else event.finish(); - "step 2"; - if (result.bool) { - player.addSkill("twchengxi_effect"); - } else { - var card = { name: "sha", isCard: true }; - if (target.canUse(card, player, false)) target.useCard(card, player, false); - } - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if (player.hasSkill("twchengxi_effect")) return 0; - var hs = player.getCards("h").sort((a, b) => b.number - a.number); - var ts = target.getCards("h").sort((a, b) => b.number - a.number); - if (!hs.length || !ts.length) return 0; - if (hs[0].number > ts[0].number) return -3; - if (!target.canUse({ name: "sha", isCard: true }, player, false)) return -1; - return 0; - }, - }, - }, - subSkill: { - effect: { - charlotte: true, - trigger: { player: "useCard1" }, - filter: function (event, player) { - return get.type(event.card) == "basic" || get.type(event.card) == "trick"; - }, - forced: true, - popup: false, - content: function () { - player.removeSkill("twchengxi_effect"); - player - .when("useCardAfter") - .filter((evt) => evt == trigger) - .then(() => { - if (trigger.targets) { - var card = { - name: trigger.card.name, - isCard: true, - }; - var targets = trigger.targets.filter( - (i) => i.isIn() && player.canUse(card, i, false) - ); - if (targets.length) player.useCard(card, targets, false); - } - }); - }, - mark: true, - marktext: "袭", - intro: { - content: - "使用的下一张基本牌或非延时锦囊牌结算完毕后视为对相同目标再使用一张无次数限制的同名牌", - }, - }, - }, - }, - //侠刘备 - twshenyi: { - audio: 2, - trigger: { global: "damageEnd" }, - filter: function (event, player) { - if (!event.player.isIn()) return false; - if (event.player.getHistory("damage").indexOf(event) != 0) return false; - return event.player == player || player.inRange(event.player); - }, - usable: 1, - direct: true, - content: function* (event, map) { - var player = map.player, - trigger = map.trigger; - var list = get.inpileVCardList((info) => { - return ( - ["basic", "trick", "delay"].includes(info[0]) && - !player.getStorage("twshenyi").includes(info[2]) - ); - }); - var dialog = [ - `###${get.prompt( - "twshenyi", - trigger.player - )}###
    从牌堆中将一张牌作为“侠义”置于武将牌上${ - player != trigger.player && player.countCards("h") - ? ",然后将任意张手牌交给其" - : "" - }
    `, - [list, "vcard"], - ]; - var result = yield player.chooseButton(dialog).set("ai", function (button) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player, - name = button.link[2]; - if (!get.cardPile2((card) => card.name == name)) return 0; - var value = get.value({ name: name }); - if (["tao", "jiu", "caochuan", "wuxie"].includes(name) && get.event().getRand() > 0.4) - return value * 2; - return value; - }); - if (result.bool) { - var name = result.links[0][2], - nature = result.links[0][3]; - var cardx = { name: name, nature: nature }; - player.logSkill("twshenyi", trigger.player); - player.popup(cardx); - player.markAuto("twshenyi", [name]); - game.log(player, "声明了", `#y${get.translation(cardx)}`); - var card = get.cardPile2( - (card) => get.name(card, false) == name && get.nature(card, false) == nature - ); - if (card) player.addToExpansion([card], "gain2").gaintag.add("twshenyi"); - else { - var card = get.cardPile2((card) => get.type2(card) == get.type2(name)); - if (card) player.addToExpansion([card], "gain2").gaintag.add("twshenyi"); - else player.chat("无牌可得?!"); - } - if (trigger.player != player && player.countCards("h")) { - game.delayex(); - var skill = "twshenyi_" + player.playerid; - game.broadcastAll(lib.skill.twshenyi.createGainTag, skill, player.name); - game.addVideo("skill", player, ["twshenyi", [skill, player.name]]); - var result2 = yield player - .chooseCard( - "伸义:是否将任意张牌交给" + get.translation(trigger.player) + "?", - [1, player.countCards("h")] - ) - .set("ai", (card) => { - if (!_status.event.goon) return 0; - return 7 - get.value(card); - }) - .set("goon", get.attitude(player, trigger.player) > 0); - if (result2.bool) { - player.give(result2.cards, trigger.player).gaintag.add(skill); - player.addSkill("twshenyi_draw"); - } - } - } else player.storage.counttrigger.twshenyi--; - }, - video: (player, info) => lib.skill.twshenyi.createGainTag(info[0], info[1]), - createGainTag: function (skill, name) { - if (!lib.skill[skill]) { - lib.skill[skill] = { charlotte: true }; - lib.translate[skill] = "义·" + get.translation(name); - } - if (!_status.postReconnect.twshenyi) { - _status.postReconnect.twshenyi = [lib.skill.twshenyi.createGainTag, [], []]; - } - _status.postReconnect.twshenyi[1].add(skill); - _status.postReconnect.twshenyi[2].add(name); - }, - marktext: "义", - intro: { - name: "侠义", - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - delete player.storage[skill]; - //var cards=player.getExpansions(skill); - //if(cards.length) player.loseToDiscardpile(cards); - }, - subSkill: { - draw: { - charlotte: true, - audio: "twshenyi", - trigger: { - global: [ - "loseAfter", - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter: function (event, player) { - var skill = "twshenyi_" + player.playerid; - return game.hasPlayer((target) => { - var evt = event.getl(target); - if (!evt || !evt.hs || !evt.hs.length) return false; - for (let i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes(skill)) return true; - } - return false; - }); - }, - forced: true, - direct: true, - content: function () { - var skill = "twshenyi_" + player.playerid; - var num = 0; - var targets = game.filterPlayer((target) => { - var evt = trigger.getl(target); - var numx = 0; - if (!evt || !evt.hs || !evt.hs.length) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes(skill)) numx++; - } - if (numx > 0) return (num += numx); - return false; - }); - if (num > 0) { - player.logSkill("twshenyi_draw", targets); - player.draw(num); - } - }, - }, - }, - }, - twxinghan: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return player.getExpansions("twshenyi").length > game.countPlayer(); - }, - check: function (event, player) { - if ( - player.hp >= 3 || - (player.countCards("h") >= 4 && - player - .getExpansions("twshenyi") - .every( - (card) => - !player.hasValueTarget(card) || - !get.tag(card, "damage") || - !lib.skill.xunshi.isXunshi(card) - )) - ) - return false; - return player.getExpansions("twshenyi").some((card) => player.hasValueTarget(card)); - }, - direct: true, - content: function* (event, map) { - var player = map.player; - var result = yield player - .chooseBool() - .set("createDialog", [ - get.prompt("twxinghan"), - `
    按顺序使用以下“侠义”牌。但是回合结束时你须弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)
    `, - player - .getExpansions("twshenyi") - .filter((card) => player.hasUseTarget(card)) - .reverse(), - "hidden", - ]) - .set("choice", lib.skill.twxinghan.check(null, player)); - if (!result.bool) { - event.finish(); - return; - } - while (true) { - var cards = player - .getExpansions("twshenyi") - .filter((card) => player.hasUseTarget(card)) - .reverse(); - if (!cards.length) break; - yield player.chooseUseTarget(true, cards[0], false); - } - player.when("phaseEnd").then(() => { - if (player.countCards("h")) player.chooseToDiscard(player.countCards("h"), true); - var num = Math.max(1, player.getHp() - 1); - player.loseHp(num); - }); - }, - group: "twxinghan_init", - subSkill: { - init: { - audio: "twxinghan", - trigger: { - player: ["loseEnd", "dying", "phaseBefore", "phaseAfter", "dyingAfter", "die"], - global: [ - "equipEnd", - "addJudgeEnd", - "gainEnd", - "loseAsyncEnd", - "addToExpansionEnd", - ], - }, - filter: function (event, player) { - return ( - (player.getExpansions("twshenyi").length && - event.name != "die" && - (_status.currentPhase != player || player.isDying())) ^ - player.hasSkill("twxinghan_in") - ); - }, - forced: true, - firstDo: true, - silent: true, - forceDie: true, - content: function () { - if ( - player.getExpansions("twshenyi").length && - trigger.name != "die" && - (_status.currentPhase != player || player.isDying()) - ) { - var cards = player.getExpansions("twshenyi"); - var cardsx = cards.map((card) => { - var cardx = ui.create.card(); - cardx.init(get.cardInfo(card)); - cardx._cardid = card.cardid; - return cardx; - }); - player.directgains(cardsx, null, "twxinghan_tag"); - player.addSkill("twxinghan_in"); - } else player.removeSkill("twxinghan_in"); - }, - }, - in: { - charlotte: true, - audio: "twxinghan", - trigger: { player: "addToExpansionEnd" }, - filter: function (event, player) { - return event.gaintag.includes("twshenyi"); - }, - forced: true, - locked: false, - silent: true, - content: function () { - "step 0"; - var cards2 = player.getCards("s", (card) => card.hasGaintag("twxinghan_tag")); - if (player.isOnline2()) { - player.send( - function (cards, player) { - cards.forEach((i) => i.delete()); - if (player == game.me) ui.updatehl(); - }, - cards2, - player - ); - } - cards2.forEach((i) => i.delete()); - if (player == game.me) ui.updatehl(); - "step 1"; - var cards = player.getExpansions("twshenyi"); - var cardsx = cards.map((card) => { - var cardx = ui.create.card(); - cardx.init(get.cardInfo(card)); - cardx._cardid = card.cardid; - return cardx; - }); - player.directgains(cardsx, null, "twxinghan_tag"); - }, - onremove: function (player) { - var cards2 = player.getCards("s", (card) => card.hasGaintag("twxinghan_tag")); - if (player.isOnline2()) { - player.send( - function (cards, player) { - cards.forEach((i) => i.delete()); - if (player == game.me) ui.updatehl(); - }, - cards2, - player - ); - } - cards2.forEach((i) => i.delete()); - if (player == game.me) ui.updatehl(); - }, - group: "twxinghan_use", - }, - use: { - charlotte: true, - trigger: { player: ["useCardBefore", "respondBefore"] }, - filter: function (event, player) { - var cards = player.getCards( - "s", - (card) => card.hasGaintag("twxinghan_tag") && card._cardid - ); - return ( - event.cards && - event.cards.some((card) => { - return cards.includes(card); - }) - ); - }, - forced: true, - popup: false, - firstDo: true, - content: function () { - var idList = player - .getCards("s", (card) => card.hasGaintag("twxinghan_tag")) - .map((i) => i._cardid); - var cards = player.getExpansions("twshenyi"); - var cards2 = []; - for (var card of trigger.cards) { - var cardx = cards.find((cardx) => cardx.cardid == card._cardid); - if (cardx) cards2.push(cardx); - } - var cards3 = trigger.cards.slice(); - trigger.cards = cards2; - trigger.card.cards = cards2; - if (player.isOnline2()) { - player.send( - function (cards, player) { - cards.forEach((i) => i.delete()); - if (player == game.me) ui.updatehl(); - }, - cards3, - player - ); - } - cards3.forEach((i) => i.delete()); - if (player == game.me) ui.updatehl(); - }, - }, - }, - ai: { - combo: "twshenyi", - }, - }, - //张纮 - twquanqian: { - audio: 2, - sunbenSkill: true, - enable: "phaseUse", - filter: function (event, player) { - return ( - !player.hasSkill("twquanqian_sunben") && - player.countCards("h") && - game.countPlayer() > 1 - ); - }, - filterCard: function (card, player) { - return !ui.selected.cards.some( - (cardx) => get.suit(cardx, player) == get.suit(card, player) - ); - }, - selectCard: [1, 4], - check: function (card) { - return 1 / (get.value(card) || 0.5); - }, - position: "h", - complexCard: true, - discard: false, - lose: false, - delay: false, - filterTarget: lib.filter.notMe, - usable: 1, - content: function () { - "step 0"; - player.addSkill("twquanqian_sunben"); - player.give(cards, target); - if (cards.length < 2) event.finish(); - "step 1"; - var card = get.cardPile2((card) => get.type(card) == "equip"); - if (card) player.gain(card, "gain2"); - "step 2"; - if (player.countCards("h") >= target.countCards("h")) { - if (target.countCards("h")) event._result = { index: 1 }; - else event.finish(); - } else { - var str = get.translation(target); - player - .chooseControl() - .set("choiceList", [ - "将手牌数摸至与" + str + "相同", - "观看" + str + "的手牌并获得其一种花色的所有手牌", - ]) - .set("ai", () => { - var player = _status.event.player; - var target = _status.event.target; - if ( - target.countCards("h") - player.countCards("h") > - target.countCards("h") / 4 || - get.attitude(player, target) > 0 - ) - return 0; - return 1; - }) - .set("target", target); - } - "step 3"; - if (result.index == 0) { - player.drawTo(target.countCards("h")); - event.finish(); - return; - } - var list = []; - var dialog = ["劝迁:获得" + get.translation(target) + "一种花色的所有牌"]; - for (var suit of lib.suit.concat("none")) { - if (target.countCards("h", { suit: suit })) { - dialog.push( - '
    ' + get.translation(suit + "2") + "牌
    " - ); - dialog.push(target.getCards("h", { suit: suit })); - list.push(suit); - } - } - if (!list.length) { - event.finish(); - return; - } - player - .chooseControl(list) - .set("dialog", dialog) - .set("ai", () => { - return _status.event.control; - }) - .set( - "control", - (() => { - var getv = (cards) => - cards.map((i) => get.value(i)).reduce((p, c) => p + c, 0); - return list.sort((a, b) => { - return ( - getv(target.getCards("h", { suit: b })) - - getv(target.getCards("h", { suit: a })) - ); - })[0]; - })() - ); - "step 4"; - if (result.control) - player.gain(target.getCards("h", { suit: result.control }), target, "give"); - }, - ai: { - order: 7, - result: { - target: function (player, target) { - return target.countCards("h"); - }, - }, - }, - subSkill: { - sunben: { - charlotte: true, - init: function (player) { - player.storage.twquanqian_sunben = 0; - }, - onremove: true, - mark: true, - intro: { - markcount: function (num) { - return (num || 0).toString(); - }, - content: "弃牌进度:#/6", - }, - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - if (event.type != "discard") return false; - var evt = event.getl(player); - return evt && evt.hs && evt.hs.length; - }, - forced: true, - popup: false, - firstDo: true, - content: function () { - "step 0"; - player.addMark("twquanqian_sunben", trigger.getl(player).hs.length, false); - "step 1"; - if (player.countMark("twquanqian_sunben") >= 6) { - player.removeSkill("twquanqian_sunben"); - player.popup("劝迁"); - game.log(player, "恢复了技能", "#g【劝迁】"); - } - }, - }, - }, - }, - twrouke: { - audio: 2, - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - var evt = event.getParent("phaseDraw"); - if (evt && evt.player == player) return false; - return event.getg(player).length > 1; - }, - forced: true, - content: function () { - player.draw(); - }, - }, - //张昭 - twlijian: { - getCards: function (event) { - var cards = []; - game.countPlayer2(function (current) { - current.checkHistory("lose", function (evt) { - if (evt.position == ui.discardPile && evt.getParent("phaseDiscard") == event) - cards.addArray(evt.cards); - }); - }); - game.checkGlobalHistory("cardMove", function (evt) { - if (evt.name == "cardsDiscard" && evt.getParent("phaseDiscard") == event) - cards.addArray(evt.cards); - }); - return cards.filterInD("d"); - }, - audio: 2, - sunbenSkill: true, - trigger: { global: "phaseDiscardEnd" }, - filter: function (event, player) { - if (player.hasSkill("twlijian_sunben")) return false; - if (event.player != player && event.player.isIn()) { - return lib.skill.twlijian.getCards(event).length; - } - return false; - }, - prompt2: () => - "选择任意张本阶段进入弃牌堆的牌令其获得,然后你获得剩余的牌,若其获得的牌数大于你,则你可以对其造成1点伤害", - logTarget: "player", - content: function () { - "step 0"; - player.addSkill("twlijian_sunben"); - var cards = lib.skill.twlijian.getCards(trigger), - target = trigger.player; - event.cards = cards; - event.target = target; - player - .chooseToMove("力荐:请分配" + get.translation(target) + "和你获得的牌", true) - .set("list", [[get.translation(target) + "获得的牌", cards], ["你获得的牌"]]) - .set("processAI", function (list) { - var player = _status.event.player; - var target = _status.event.getTrigger().player; - var att = get.attitude(player, target); - var cards = _status.event.cards; - var cardx = cards.filter((card) => card.name == "du"); - var cardy = cards.removeArray(cardx); - switch (get.sgn(att)) { - case 1: - return [cards, []]; - case 0: - return [cardx, cardy]; - case -1: - var num = Math.ceil(cards.length / 2) + (cards.length % 2 == 0 ? 1 : 0); - if (num > 1 && player.hasSkill("twchungang")) num--; - if ( - get.damageEffect(target, player, player) <= 0 || - num > 2 || - cardx.length > cardy.length - ) - return [cardx, cardy]; - var num2 = cardy.length - cardx.length; - num2 = Math.ceil(num2 / 2) + (num2 % 2 == 0 ? 1 : 0); - cardy.sort((a, b) => get.value(b) - get.value(a)); - cardx.addArray(cardy.slice(num, cardy.length)); - return [cardx, cardy.slice(0, num)]; - } - }) - .set("cards", cards); - "step 1"; - if (result.bool) { - target.gain(result.moved[0], "gain2"); - player.gain(result.moved[1], "gain2"); - if (result.moved[0].length > result.moved[1].length) { - player - .chooseBool("是否对" + get.translation(target) + "造成1点伤害?") - .set("choice", get.damageEffect(target, player, player) > 0); - } else event.finish(); - } else event.finish(); - "step 2"; - if (result.bool) { - player.line(target); - target.damage(); - } - }, - subSkill: { - sunben: { - charlotte: true, - init: function (player) { - player.storage.twlijian_sunben = 0; - }, - onremove: true, - mark: true, - intro: { - markcount: function (num) { - return (num || 0).toString(); - }, - content: "弃牌堆进入牌进度:#/8", - }, - trigger: { - global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - filter: function (event, player) { - var cards = event.getd(); - if (!cards.length) return false; - var list = cards.slice(); - game.checkGlobalHistory( - "cardMove", - function (evt) { - if ( - evt == event || - evt.getParent() == event || - (evt.name != "lose" && evt.name != "cardsDiscard") - ) - return false; - if (evt.name == "lose" && evt.position != ui.discardPile) return false; - list.removeArray(evt.cards); - }, - event - ); - return list.length > 0; - }, - forced: true, - popup: false, - firstDo: true, - content: function () { - "step 0"; - var cards = trigger.getd().slice(); - game.checkGlobalHistory( - "cardMove", - function (evt) { - if ( - evt == trigger || - evt.getParent() == trigger || - (evt.name != "lose" && evt.name != "cardsDiscard") - ) - return false; - if (evt.name == "lose" && evt.position != ui.discardPile) return false; - cards.removeArray(evt.cards); - }, - trigger - ); - player.addMark("twlijian_sunben", cards.length, false); - "step 1"; - if (player.countMark("twlijian_sunben") >= 8) { - player.removeSkill("twlijian_sunben"); - player.popup("力荐"); - game.log(player, "恢复了技能", "#g【力荐】"); - } - }, - }, - }, - }, - twchungang: { - audio: 2, - init: () => { - game.addGlobalSkill("twchungang_global"); - }, - onremove: (player) => { - if ( - !game.hasPlayer((i) => { - return player !== i && i.hasSkill("twchungang"); - }, true) - ) - game.removeGlobalSkill("twchungang_global"); - }, - trigger: { global: ["gainAfter", "loseAsyncAfter"] }, - filter: function (event, player) { - var evt = event.getParent("phaseDraw"); - return game.hasPlayer((target) => { - if (target == player || (evt && evt.player == target)) return false; - return event.getg(target).length > 1 && target.countCards("he"); - }); - }, - forced: true, - logTarget: function (event, player) { - var evt = event.getParent("phaseDraw"); - return game.filterPlayer((target) => { - if (target == player || (evt && evt.player == target)) return false; - return event.getg(target).length > 1 && target.countCards("he"); - }); - }, - content: function () { - for (var i of lib.skill.twchungang.logTarget(trigger, player)) { - i.chooseToDiscard("he", true); - } - }, - subSkill: { - global: { - trigger: { - player: "dieAfter", - }, - filter(event, player) { - return !game.hasPlayer((i) => i.hasSkill("twchungang"), true); - }, - silent: true, - forceDie: true, - charlotte: true, - content() { - game.removeGlobalSkill("twchungang_global"); - }, - ai: { - effect: { - target(card, player, target) { - if ((get.tag(card, "gain") || 0) < 2 && (get.tag(card, "draw") || 0) < 2) - return; - let evt = _status.event.getParent("phaseDraw"), - dis = game.countPlayer((i) => { - return target !== i && i.hasSkill("twchungang"); - }); - if (!dis || (evt && evt.player === target)) return; - return [1, -dis]; - }, - }, - }, - }, - }, - }, - //海外主公技 - //张鲁 - twshijun: { - unique: true, - global: "twshijun_global", - audio: 2, - zhuSkill: true, - ai: { combo: "yishe" }, - subSkill: { - global: { - audio: "twshijun", - usable: 1, - enable: "phaseUse", - forceaudio: true, - filter: function (event, player) { - return ( - player.group == "qun" && - game.hasPlayer(function (current) { - return ( - current != player && - current.hasZhuSkill("twshijun", player) && - !current.getExpansions("yishe").length - ); - }) - ); - }, - filterTarget: function (card, player, target) { - return ( - target != player && - target.hasZhuSkill("twshijun", player) && - !target.getExpansions("yishe").length - ); - }, - prompt: "摸一张牌然后将一张牌作为“米”置于主公的武将牌上", - content: function () { - "step 0"; - player.draw(); - if (player.countCards("he")) - player.chooseCard( - "将一张牌置于" + get.translation(target) + "的武将牌上", - "he", - true - ); - else event.finish(); - "step 1"; - if (result.bool) - target.addToExpansion(result.cards, player, "give").gaintag.add("yishe"); - }, - ai: { - order: 7, - result: { - target: 1, - }, - }, - }, - }, - }, - //张绣 - twjuxiang: { - unique: true, - global: "twjuxiang_global", - audio: 2, - zhuSkill: true, - subSkill: { - global: { - audio: "twjuxiang", - usable: 1, - enable: "phaseUse", - forceaudio: true, - filter: function (event, player) { - return ( - player.countCards("e") && - player.group == "qun" && - game.hasPlayer(function (target) { - return ( - target != player && - target.hasZhuSkill("twjuxiang", player) && - player.countCards( - "e", - (card) => - target.hasEmptySlot(get.subtype(card)) || - target.hasDisabledSlot(get.subtype(card)) - ) - ); - }) - ); - }, - filterTarget: function (card, player, target) { - return ( - target != player && - target.hasZhuSkill("twjuxiang", player) && - (target.hasEmptySlot(get.subtype(ui.selected.cards[0])) || - target.hasDisabledSlot(get.subtype(ui.selected.cards[0]))) - ); - }, - filterCard: { type: "equip" }, - position: "e", - check: function (card) { - return get.value(card); - }, - prompt: "将装备区中的一张牌置入主公的装备区中或恢复主公的对应装备栏", - discard: false, - lose: false, - content: function () { - if (target.hasEmptySlot(get.subtype(cards[0]))) { - player.$give(cards[0], target, false); - target.equip(cards[0]); - } else { - target.gain(cards[0], player, "give"); - target.enableEquip(get.subtype(cards[0])); - } - }, - ai: { - order: 7, - result: { - target: 1, - }, - }, - }, - }, - }, - //孙坚 - twpolu: { - unique: true, - audio: "repolu", - trigger: { global: ["dieAfter", "die"] }, - forceDie: true, - zhuSkill: true, - filter: function (event, player, name) { - if (!player.hasZhuSkill("twpolu")) return false; - if (name == "dieAfter" && event.source && event.source.group == "wu") return true; - if (name == "die" && event.player.group == "wu") return true; - return false; - }, - direct: true, - content: function () { - "step 0"; - if (!player.storage.twpolu) player.storage.twpolu = 0; - event.num = player.storage.twpolu + 1; - player - .chooseTarget( - [1, Infinity], - get.prompt("twpolu"), - "令任意名角色摸" + get.cnNumber(event.num) + "张牌" - ) - .set("forceDie", true).ai = function (target) { - return get.attitude(_status.event.player, target); - }; - "step 1"; - if (result.bool) { - player.storage.twpolu++; - result.targets.sortBySeat(); - player.logSkill("repolu", result.targets); - game.asyncDraw(result.targets, num); - } else event.finish(); - "step 2"; - game.delay(); - }, - }, - //孟获 - twqiushou: { - unique: true, - audio: 2, - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - if (event.card.name != "nanman") return false; - var num = 0, - bool = false; - for (var i of event.targets) { - if (!i.isAlive()) bool = true; - i.getHistory("damage", function (evt) { - if (evt.getParent(2) == event) num += evt.num; - }); - } - return player.hasZhuSkill("twqiushou") && (bool || num > 3); - }, - zhuSkill: true, - forced: true, - logTarget: function (event, player) { - return game.filterPlayer(function (target) { - return ["shu", "qun"].includes(target.group); - }); - }, - content: function () { - "step 0"; - game.asyncDraw(lib.skill.twqiushou.logTarget(trigger.player)); - "step 1"; - game.delayx(); - }, - }, - //刘协 - twzhuiting: { - unique: true, - zhuSkill: true, - audio: 2, - global: "twzhuiting_global", - subSkill: { - global: { - hiddenWuxie: function (player, info) { - if (player.group != "wei" && player.group != "qun") return false; - const target = info.target, - card = info.card; - if (!target || target == player || !target.hasZhuSkill("twzhuiting")) - return false; - if (_status.connectMode && player.countCards("hs") > 0) return true; - const color = get.color(card, false); - if (color == "none") return false; - return player.hasCard((card) => get.color(card) == color, "hes"); - }, - audio: "twzhuiting", - forceaudio: true, - enable: "chooseToUse", - filter: function (event, player) { - if (event.type != "wuxie" || (player.group != "wei" && player.group != "qun")) - return false; - const info = event.info_map, - target = info.target, - card = info.card; - if (!target || target == player || !target.hasZhuSkill("twzhuiting")) - return false; - const color = get.color(card, false); - if (color == "none") return false; - return player.hasCard((card) => get.color(card) == color, "hes"); - }, - filterCard: function (card) { - const info = _status.event.info_map; - return info && get.color(card) == get.color(info.card, false); - }, - viewAs: { name: "wuxie" }, - position: "hes", - prompt: function () { - const info = _status.event.info_map; - return ( - "将一张" + - get.translation(get.color(info.card)) + - "牌当作【无懈可击】对" + - get.translation(info.target) + - "使用" - ); - }, - check: function (card) { - return 8 - get.value(card); - }, - }, - }, - }, - //刘繇 - twniju: { - audio: 2, - zhuSkill: true, - trigger: { - global: "compare", - }, - priority: 1, - filter(event, player) { - if (!player.hasZhuSkill("twniju")) return false; - if (event.iwhile || (event.target && event.compareMeanwhile)) return false; - const participant = [event.player]; - if (event.targets) participant.addArray(event.targets); - else participant.add(event.target); - return participant.includes(player); - }, - direct: true, - async content(event, trigger, player) { - const num = game.countPlayer((current) => current.group === "qun"); - const dialog = [ - get.prompt("twniju"), - `
    令一张拼点牌的点数+${num}或-${num}
    `, - [ - [ - ["addNumber", "增加"], - ["subtractNumber", "减少"], - ], - "tdnodes", - ], - ]; - const lose_list = trigger.lose_list.slice().sort((a, b) => lib.sort.seat(a[0], b[0])); - dialog.push( - `
    ${lose_list - .map((list) => { - return get.translation(list[0]); - }) - .join("  /  ")}
    ` - ); - const cards = lose_list.map((list) => list[1]).flat(); - dialog.push(cards); - const result = await player - .chooseButton(dialog, 2) - .set("filterButton", (button) => { - const type = typeof button.link; - if (ui.selected.buttons.length && type === typeof ui.selected.buttons[0].link) - return false; - return true; - }) - .forResult(); - if (!result.bool) return; - const { links } = result; - if (typeof links[0] !== "string") links.reverse(); - let [fn, card] = links; - const selectedPlayer = lose_list.find((item) => { - if (Array.isArray(item[1])) return item[1].includes(card); - return item[1] == card; - })[0]; - player.logSkill("twniju", selectedPlayer); - selectedPlayer.addTempSkill("twniju_change"); - if (!selectedPlayer.storage.twniju_change) selectedPlayer.storage.twniju_change = []; - selectedPlayer.storage.twniju_change.push([fn, num, card]); - player - .when("chooseToCompareAfter") - .filter((evt) => evt === trigger) - .vars({ - toDraw: num, - }) - .then(() => { - const num1 = trigger.result.num1, - num2 = trigger.result.num2; - let bool = false; - if (typeof num1 === "number" && typeof num2 === "number") { - if (num1 === num2) { - bool = true; - } - } else { - const num1List = num1.toUniqued(); - const totalList = num1List.concat(num2).toUniqued(); - if (totalList.length < num1List.length + num2.length) { - bool = true; - } - } - if (bool) player.draw(toDraw); - }); - }, - subSkill: { - change: { - trigger: { global: "compare" }, - filter(event, player) { - const storage = player.getStorage("twniju_change"); - if (!storage.length) return false; - if ((player !== event.player || event.iwhile) && player !== event.target) - return false; - return event.lose_list.some((list) => { - const cards = Array.isArray(list[1]) ? list[1] : [list[1]]; - return list[0] === player && storage.some((s) => cards.includes(s[2])); - }); - }, - charlotte: true, - forced: true, - silent: true, - async content(event, trigger, player) { - const [fn, num] = player.getStorage("twniju_change").find((s) => { - return trigger.lose_list.some((list) => { - const cards = Array.isArray(list[1]) ? list[1] : [list[1]]; - return list[0] === player && cards.includes(s[2]); - }); - }); - const numId = player === trigger.player ? "num1" : "num2"; - trigger[fn](numId, num); - if (trigger[numId] > 13) trigger[numId] = 13; - else if (trigger[numId] < 1) trigger[numId] = 1; - game.log(player, "的拼点牌点数", fn === "addNumber" ? "+" : "-", num); - }, - }, - }, - }, - //刘虞 - twchongwang: { - init: function (player) { - player.storage.twchongwang = []; - player.storage.twchongwangx = []; - }, - mod: { - playerEnabled: function (card, player, target) { - if (!player.hasZhuSkill("twchongwang")) return; - if (get.tag(card, "damage") > 0 && player.storage.twchongwangx.includes(target)) - return false; - }, - targetEnabled: function (card, player, target) { - if (!target.hasZhuSkill("twchongwang")) return; - if (get.tag(card, "damage") > 0 && target.storage.twchongwangx.includes(player)) - return false; - }, - }, - locked: false, - unique: true, - onremove: true, - global: "twchongwang_global", - group: "twchongwang_clear", - audio: 2, - zhuSkill: true, - subSkill: { - clear: { - charlotte: true, - trigger: { player: "phaseAfter" }, - direct: true, - content: function () { - player.storage.twchongwangx = []; - }, - }, - global: { - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return ( - player.group == "qun" && - game.hasPlayer(function (current) { - return ( - current != player && - current.hasZhuSkill("twchongwang", player) && - !current.storage.twchongwang.includes(player) - ); - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: "崇望:是否将一张牌交给主公并获得双重庇护?", - selectCard: 1, - filterCard: true, - filterTarget: function (card, player, target) { - return ( - target != player && - target.hasZhuSkill("twchongwang", player) && - !target.storage.twchongwang.includes(player) - ); - }, - position: "he", - ai1: function (card) { - if (card.name == "du") return 10; - else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") - return 0; - var player = _status.event.player; - if ( - ui.selected.cards.length > 4 || - !game.hasPlayer(function (current) { - return ( - get.attitude(player, current) > 0 && - !current.hasSkillTag("nogain") - ); - }) - ) - return 0; - return 1 / Math.max(0.1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (ui.selected.cards[0].name == "du") return -att; - if (target.hasSkillTag("nogain")) att /= 6; - return att; - }, - }); - "step 1"; - if (result.bool) { - player.logSkill("twchongwang", result.targets[0]); - result.targets[0].gain(result.cards, player, "giveAuto"); - result.targets[0].storage.twchongwang.push(player); - result.targets[0].storage.twchongwangx.push(player); - } - }, - }, - }, - }, - //公孙范 - twhuiyuan: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - var type = get.type2(event.card); - return !player.hasHistory("gain", (evtx) => { - if (evtx.getParent("phaseUse") != evt) return false; - return evtx.cards.some((card) => get.type2(card) == type); - }); - }, - direct: true, - content: function () { - "step 0"; - var prompt2 = - "展示一名角色的一张手牌。若展示牌为" + - get.translation(get.type2(trigger.card)) + - "牌,则你获得之,否则其弃置之并摸一张牌。然后若其在你的攻击范围内,且你不在其攻击范围内,你对其造成1点伤害"; - player - .chooseTarget(get.prompt("twhuiyuan"), prompt2, (card, player, target) => { - return target.countCards("h"); - }) - .set("ai", (target) => { - var player = _status.event.player; - var att = get.attitude(player, target); - return ( - -att + - (player.inRange(target) && !target.inRange(player) - ? get.damageEffect(target, player, player) / 3 - : 0) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twhuiyuan", target); - player.choosePlayerCard( - target, - "h", - true, - "回援:展示" + get.translation(target) + "一张手牌" - ); - } else event.finish(); - "step 2"; - if (result.bool) { - var card = result.cards[0]; - target.showCards([card], get.translation(target) + "【回援】展示"); - if (get.type2(card) == get.type2(trigger.card)) { - if (lib.filter.canBeGained(card, target, player)) { - player.gain(card, target, "giveAuto", "bySelf"); - } - } else { - if (lib.filter.canBeDiscarded(card, target, player)) { - target.discard(card, "notBySelf"); - target.draw(); - } - } - } else event.finish(); - "step 3"; - if (player.inRange(target) && !target.inRange(player)) { - game.log(player, "触发了", "#y搏击", "效果"); - player.line(target); - target.damage(); - } - }, - ai: { - expose: 0.2, - threaten: 3, - }, - }, - twshoushou: { - audio: 2, - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - var cards = event.getg(player); - if (!cards.length) return false; - return ( - game.hasPlayer((current) => { - return event.getl(current).cards2.length; - }) && - game.hasPlayer((current) => { - return current.inRange(player); - }) - ); - }, - forced: true, - locked: false, - group: "twshoushou_damage", - onremove: function (player) { - if (player.countMark("twshoushou_plus") - player.countMark("twshoushou_minus") == 0) { - player.removeSkill("twshoushou_distance"); - } - }, - content: function () { - player.addSkill("twshoushou_distance"); - player.addMark("twshoushou_plus", 1, false); - }, - ai: { - halfneg: true, - }, - subSkill: { - damage: { - trigger: { - player: "damageEnd", - source: "damageSource", - }, - filter: function (event, player) { - return game.hasPlayer((current) => { - return current != player && !current.inRange(player); - }); - }, - forced: true, - locked: false, - content: function () { - player.addSkill("twshoushou_distance"); - player.addMark("twshoushou_minus", 1, false); - }, - }, - distance: { - mark: true, - marktext: "绶", - intro: { - markcount: function (storage, player) { - return ( - player.countMark("twshoushou_plus") - player.countMark("twshoushou_minus") - ); - }, - content: function (storage, player) { - var dis = - player.countMark("twshoushou_plus") - - player.countMark("twshoushou_minus"); - return "其他角色至你的距离" + (dis >= 0 ? "+" : "") + dis; - }, - }, - mod: { - globalTo: function (from, to, distance) { - return ( - distance + - to.countMark("twshoushou_plus") - - to.countMark("twshoushou_minus") - ); - }, - }, - }, - }, - }, - //严纲 - twzhiqu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - var count = get.cnNumber( - game.countPlayer((current) => { - return get.distance(player, current) <= 1; - }) - ); - player - .chooseTarget( - get.prompt("twzhiqu"), - "选择一名其他角色并视为使用牌堆顶" + - count + - "张牌中的【杀】。若你与其均在对方的攻击范围内,你改为依次对其使用牌堆顶" + - count + - "张牌中的【杀】或锦囊牌。", - lib.filter.notMe - ) - .set("ai", (target) => { - var player = _status.event.player; - return ( - get.effect(target, { name: "sha" }, player, player) * - (get.distance(player, target) == 1 ? 2 : 1) - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twzhiqu", target); - event.fight = player.inRange(target) && target.inRange(player); - if (event.fight) game.log(player, "触发了", "#y搏击", "效果"); - event.cards = game - .cardsGotoOrdering( - get.cards( - game.countPlayer((current) => { - return get.distance(player, current) <= 1; - }) - ) - ) - .cards.slice(); - } else event.finish(); - "step 2"; - if (player.isIn() && target.isIn() && cards.length) { - do var card = cards.shift(); - while ( - get.name(card) != "sha" && - (!event.fight || get.type2(card) != "trick") && - cards.length - ); - if (get.name(card) != "sha" && (!event.fight || get.type2(card) != "trick")) return; - player.showCards([card], get.translation(player) + "发动了【直取】"); - player - .chooseUseTarget(card, true, false, "nodistance") - .set("filterTarget", function (card, player, target) { - var evt = _status.event; - if (_status.event.name == "chooseTarget") evt = evt.getParent(); - if (target != player && target != evt.twzhiqu_target) return false; - return lib.filter.targetEnabledx(card, player, target); - }) - .set("twzhiqu_target", target); - event.redo(); - } - }, - }, - twxianfeng: { - audio: 2, - trigger: { source: "damageSource" }, - filter: function (event, player) { - if (!player.isPhaseUsing()) return false; - if (player == event.player) return false; - if (!event.player.isIn()) return false; - if (!event.card) return false; - return ( - event.card.name == "sha" || - (get.type(event.card) == "trick" && get.tag(event.card, "damage")) - ); - }, - logTarget: "player", - check: function (event, player) { - let att = get.attitude(player, event.player); - if (att > 0) return true; - if (!player.hasSkill("twzhiqu")) return false; - let cnt = game.countPlayer((current) => get.distance(player, current) === 2); - if (cnt > 2 || (cnt === 2 && Math.abs(att) < 2) || (cnt && Math.abs(att) < 1)) - return true; - return false; - }, - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - target - .chooseControl() - .set("choiceList", [ - "你摸一张牌,然后直到" + - get.translation(player) + - "下个回合开始时,其至其他角色的距离-1", - get.translation(player) + "摸一张牌,然后直到其下个回合开始时,你至其的距离-1", - ]) - .set("prompt", "先锋:请选择一项") - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var att = get.attitude(target, player); - if (att === 0) return 0; - if (player.hasSkill("twzhiqu")) { - var cnt = game.countPlayer( - (current) => get.distance(player, current) === 2 - ); - if (att > 0) { - if (cnt || player.needsToDiscard(1)) return 0; - return 1; - } - if (!cnt) return 0; - if ( - cnt >= 2 || - get.distance(target, player, "attack") === 2 || - get.distance(target, player) === 2 - ) - return 1; - return 0; - } - if ( - att < 0 || - (player.needsToDiscard(1) && - game.hasPlayer(function (current) { - return ( - current !== player && - current !== target && - !player.inRange(current) - ); - })) - ) - return 0; - return [0, 1].randomGet(); - })() - ); - "step 1"; - if (result.index == 0) { - target.draw(); - player.addTempSkill("twxianfeng_me", { player: "phaseBegin" }); - player.addMark("twxianfeng_me", 1, false); - } else { - player.draw(); - target.addSkill("twxianfeng_others"); - if (!target.storage.twxianfeng_others) target.storage.twxianfeng_others = {}; - if (typeof target.storage.twxianfeng_others[player.playerid] != "number") - target.storage.twxianfeng_others[player.playerid] = 0; - target.storage.twxianfeng_others[player.playerid]++; - } - }, - subSkill: { - me: { - charlotte: true, - mark: true, - intro: { content: "至其他角色的距离-#" }, - mod: { - globalFrom: function (from, to, distance) { - return distance - from.countMark("twxianfeng_me"); - }, - }, - }, - others: { - trigger: { global: ["phaseBegin", "die"] }, - filter: function (event, player) { - return ( - player.storage.twxianfeng_others && - player.storage.twxianfeng_others[event.player.playerid] - ); - }, - charlotte: true, - mark: true, - forced: true, - intro: { - markcount: function (storage, player) { - var max = 0; - for (var id in storage) { - if (storage[id] > max) max = storage[id]; - } - return max; - }, - content: function (storage, player) { - if (!storage) return ""; - var str = ""; - var map = _status.connectMode ? lib.playerOL : game.playerMap; - for (var id in storage) { - str += "至" + get.translation(map[id]) + "的距离-" + storage[id] + "、"; - } - return str.slice(0, -1); - }, - }, - content: function () { - delete player.storage.twxianfeng_others[trigger.player.playerid]; - if (get.is.empty(player.storage.twxianfeng_others)) - player.removeSkill("twxianfeng_others"); - }, - mod: { - globalFrom: function (from, to, distance) { - if ( - from.storage.twxianfeng_others && - typeof from.storage.twxianfeng_others[to.playerid] == "number" - ) - return distance - from.storage.twxianfeng_others[to.playerid]; - }, - }, - }, - }, - }, - //夏侯紫萼 - twxuechang: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - if (!target.countGainableCards(player, "he")) event.finish(); - else player.gainPlayerCard(target, "he", true); - } else { - player.damage(target); - player.addSkill("twxuechang_add"); - if (!player.storage.twxuechang_add) player.storage.twxuechang_add = {}; - if (!player.storage.twxuechang_add[target.playerid]) - player.storage.twxuechang_add[target.playerid] = 0; - player.storage.twxuechang_add[target.playerid]++; - player.markSkill("twxuechang_add"); - event.finish(); - } - "step 2"; - var card = result.cards[0]; - if (get.type(card) == "equip") { - var card = { name: "sha", isCard: true }; - if (player.canUse(card, target, false)) player.useCard(card, target, "noai", false); - } - }, - ai: { - order: 6.5, - result: { - target: function (player, target) { - var hs = player.getCards("h").sort(function (a, b) { - return get.number(b) - get.number(a); - }); - var ts = target.getCards("h").sort(function (a, b) { - return get.number(b) - get.number(a); - }); - if (!hs.length || !ts.length) return 0; - if ( - get.number(hs[0]) > get.number(ts[0]) || - get.number(hs[0]) - ts.length >= 9 + Math.min(2, player.hp / 2) - ) - return ( - get.sgnAttitude(player, target) * - get.effect(target, { name: "shunshou_copy2" }, player, player) - ); - return 0; - }, - }, - }, - subSkill: { - add: { - audio: "twxuechang", - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - return ( - player.storage.twxuechang_add && - player.storage.twxuechang_add[event.player.playerid] - ); - }, - forced: true, - charlotte: true, - content: function () { - trigger.num += player.storage.twxuechang_add[trigger.player.playerid]; - delete player.storage.twxuechang_add[trigger.player.playerid]; - if (get.is.empty(player.storage.twxuechang_add)) - player.removeSkill("twxuechang_add"); - else player.markSkill("twxuechang_add"); - }, - marktext: "偿", - intro: { - content: function (storage, player) { - if (!storage) return ""; - var str = ""; - var map = _status.connectMode ? lib.playerOL : game.playerMap; - for (var i in storage) { - str += - "
  • 下次对" + get.translation(map[i]) + "造成的伤害+" + storage[i]; - } - return str; - }, - }, - }, - }, - }, - twduoren: { - audio: 2, - trigger: { source: "dieAfter" }, - check: function (event, player) { - if (player.hp < 3 && !player.isDamaged()) return false; - var skills = event.player.getSkills(null, false, false).filter((skill) => { - if (player.hasSkill(skill, null, false, false)) return false; - var info = get.info(skill); - return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; - }); - return skills.length > 0; - }, - group: "twduoren_remove", - prompt2: function (event, player) { - var skills = event.player.getSkills(null, false, false).filter((skill) => { - if (player.hasSkill(skill, null, false, false)) return false; - var info = get.info(skill); - return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; - }); - var str = ""; - for (var i of skills) { - str += "〖" + get.translation(i) + "〗、"; - } - str = str.slice(0, str.length - 1); - return "减1点体力上限,然后" + (str.length ? "获得" + str : "听一句技能配音"); - }, - logTarget: "player", - content: function () { - "step 0"; - player.loseMaxHp(); - "step 1"; - var skills = trigger.player.getSkills(null, false, false).filter((skill) => { - if (player.hasSkill(skill, null, false, false)) return false; - var info = get.info(skill); - return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; - }); - if (skills.length) { - //for(var i of skills) player.addSkillLog(i); - player.addSkills(skills); - player.markAuto("twduoren", skills); - game.broadcastAll(function (list) { - game.expandSkills(list); - for (var i of list) { - var info = lib.skill[i]; - if (!info) continue; - if (!info.audioname2) info.audioname2 = {}; - info.audioname2.xia_xiahouzie = "twduoren"; - } - }, skills); - } - }, - subSkill: { - remove: { - trigger: { source: "dying" }, - filter: function (event, player) { - return ( - event.player != player && - player.getStorage("twduoren").some((skill) => { - return player.hasSkill(skill, null, false, false); - }) - ); - }, - forced: true, - locked: false, - content: function () { - player.removeSkills(player.getStorage("twduoren")); - delete player.storage.twduoren; - }, - }, - }, - }, - //赵娥 - twyanshi: { - audio: 2, - trigger: { global: "phaseBefore", player: "enterGame" }, - forced: true, - locked: false, - direct: true, - onremove: true, - intro: { - content: "players", - }, - filter: function (event, player) { - return ( - game.hasPlayer((current) => current != player) && - (event.name != "phase" || game.phaseNumber == 0) - ); - }, - group: ["twyanshi_hurt", "twyanshi_damage"], - content: function () { - "step 0"; - player - .chooseTarget("言誓:选择一名其他角色", lib.filter.notMe, true) - .set("ai", (target) => get.attitude(_status.event.player, target)); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twyanshi", target); - player.markAuto("twyanshi", [target]); - } - }, - mod: { - targetInRange: function (card, player, target) { - if (target.hasMark("twyanshi_mark")) return true; - }, - }, - subSkill: { - hurt: { - audio: "twyanshi", - trigger: { - global: "damageEnd", - }, - forced: true, - locked: false, - filter: function (event, player) { - if (!event.source || !event.source.isIn()) return false; - return ( - (player == event.player && - !player.getStorage("twyanshi").includes(event.source)) || - (player != event.source && - player.getStorage("twyanshi").includes(event.player)) - ); - }, - content: function () { - trigger.source.addMark("twyanshi_mark", 1); - }, - }, - damage: { - audio: "twyanshi", - trigger: { - source: ["damageBegin1", "damageSource"], - }, - forced: true, - locked: false, - filter: function (event, player) { - return event.player.hasMark("twyanshi_mark"); - }, - content: function () { - "step 0"; - if (event.triggername == "damageBegin1") { - trigger.num++; - } else { - player.draw(trigger.num); - trigger.player.removeMark( - "twyanshi_mark", - trigger.player.countMark("twyanshi_mark") - ); - } - }, - }, - mark: { - marktext: "誓", - intro: { - name: "誓", - name2: "誓", - content: "mark", - }, - }, - }, - }, - twrenchou: { - audio: 2, - trigger: { global: "die" }, - forced: true, - forceDie: true, - filter: function (event, player) { - if (!event.source || !event.source.isIn()) return false; - if (event.player == player) { - return player.getStorage("twyanshi").some((i) => i.isIn() && i.hp > 0); - } - if (player.getStorage("twyanshi").includes(event.player)) { - return player.isIn() && player.hp > 0; - } - return false; - }, - logTarget: "source", - line: false, - skillAnimation: true, - animationColor: "water", - global: "twrenchou_ai", - content: function () { - "step 0"; - var avengers = []; - if (trigger.player == player) { - avengers = player.getStorage("twyanshi").filter((i) => i.isIn() && i.hp > 0); - } - if (player.getStorage("twyanshi").includes(trigger.player)) { - avengers = [player]; - } - event.avengers = avengers; - "step 1"; - var avenger = event.avengers.shift(); - avenger.line(trigger.source, "fire"); - trigger.source.damage(avenger, avenger.hp); - "step 2"; - if (event.avengers.length && trigger.source.isIn()) event.goto(1); - }, - ai: { - combo: "twyanshi", - }, - subSkill: { - ai: { - ai: { - effect: { - target: function (card, player, target) { - if (!get.tag(card, "damage")) return; - if (target.hp > 1) return; - var num = 0; - game.filterPlayer((current) => { - if (current.getStorage("twyanshi").some((i) => target == i)) { - num += current.hp; - } - }); - var targets = target.getStorage("twyanshi").filter((i) => i.isIn()); - for (var targetx of targets) { - num += targetx.hp; - } - if (num >= player.hp) return 0; - if (num > 0) return [1, 0, 0, 0.5 - 1.5 * num]; - }, - }, - }, - }, - }, - }, - //侠典韦 - twliexi: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return player.countCards("he"); - }, - direct: true, - content: function () { - "step 0"; - var list = [[], []]; - for (var current of game.players) { - if (current == player) continue; - var cards = []; - var weapon = false; - for (var card of player.getCards("he")) { - if (!lib.filter.cardDiscardable(card, player)) continue; - if ( - get.subtype(card) == "equip1" && - !ui.selected.cards.some((i) => get.subtype(i) == "equip1") - ) { - if (16 - get.value(card) > 0) { - cards.push(card); - weapon = true; - } - } - if (7 - get.value(card) > 0) cards.push(card); - } - if (cards.length > current.hp) { - var val = 0; - for (var card of cards) { - if (get.subtype(card) != "equip1") val += get.value(card); - } - if (val < 30) list[0].push(current); - } - if ((weapon && player.hp > 2) || get.damageEffect(player, current, player) > 10) - list[1].push(current); - } - list[0].sort((a, b) => { - return get.damageEffect(b, player, player) - get.damageEffect(a, player, player); - }); - player.chooseCardTarget({ - filterCard: lib.filter.cardDiscardable, - selectCard: [1, Infinity], - position: "he", - filterTarget: lib.filter.notMe, - prompt: get.prompt2("twliexi"), - targetsx: [list[0][0], list[1][0]], - ai1: function (card) { - var targetx = _status.event.targetsx[0]; - var hasWeapon = ui.selected.cards.some((i) => get.subtype(i) == "equip1"); - if (!targetx) { - var targetx = _status.event.targetsx[1]; - if (get.subtype(card) == "equip1" && !hasWeapon) return 30 - get.value(card); - return -get.value(card); - } - if (ui.selected.cards.length > targetx.hp) return 0; - if (get.subtype(card) == "equip1" && !hasWeapon) return 30 - get.value(card); - return 7 - get.value(card); - }, - ai2: function (target) { - var targetx = _status.event.targetsx[0] || _status.event.targetsx[1]; - if (targetx == target) return 10; - return 0; - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - var cards = result.cards; - player.logSkill("twliexi", target); - player.discard(cards); - if (cards.length > target.hp) target.damage(); - else player.damage(target); - var goon = false; - for (var card of cards) { - if (get.subtype(card) == "equip1") { - goon = true; - break; - } - } - if (!goon) event.finish(); - } else event.finish(); - "step 2"; - game.delayx(); - target.damage(); - }, - }, - twshezhong: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - var damage = player.getHistory("sourceDamage").length; - if (damage) { - player - .chooseTarget( - get.prompt("twshezhong"), - "令至多" + get.cnNumber(damage) + "名其他角色下个摸牌阶段的摸牌数-1", - [1, damage], - lib.filter.notMe - ) - .set("ai", (target) => { - return -get.attitude(_status.event.player, target); - }); - } else event.goto(2); - "step 1"; - if (result.bool) { - var targets = result.targets; - player.logSkill("twshezhong", targets); - for (var target of targets) { - target.addSkill("twshezhong_minus"); - target.addMark("twshezhong_minus", 1, false); - } - } - "step 2"; - var targets = []; - for (var evt of player.getHistory("damage")) { - if (evt.source && evt.source.isIn()) targets.add(evt.source); - } - if (targets.length) { - player - .chooseTarget( - get.prompt("twshezhong"), - "将手牌摸至一名与一名本回合对你造成过伤害的角色的体力值相同,且至多摸至五张", - (card, player, target) => { - return _status.event.targets.includes(target); - } - ) - .set("ai", (target) => { - return Math.max(0.1, target.hp - _status.event.player.countCards("h")); - }) - .set("targets", targets); - } else event.finish(); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twshezhong", target); - var num = Math.min(target.hp, 5) - player.countCards("h"); - if (num > 0) player.draw(num); - } - }, - subSkill: { - minus: { - trigger: { player: "phaseDrawBegin" }, - forced: true, - onremove: true, - content: function () { - var num = player.countMark("twshezhong_minus"); - trigger.num -= num; - game.log(player, "的额定摸牌数", "#g-" + num); - player.removeSkill("twshezhong_minus"); - }, - mark: true, - intro: { - content: "额定摸牌数-#", - }, - }, - }, - }, - //侠鲁肃 - twkaizeng: { - audio: 2, - global: "twkaizeng_want", - refuseInfo: ["不给", "拒绝"], - subSkill: { - want: { - audio: "twkaizeng", - forceaudio: true, - enable: "phaseUse", - usable: 1, - charlotte: true, - filter: function (event, player) { - return game.hasPlayer((current) => { - return current != player && current.hasSkill("twkaizeng"); - }); - }, - chooseButton: { - dialog: function (event, player) { - var targets = game.filterPlayer((current) => { - return current != player && current.hasSkill("twkaizeng"); - }); - return ui.create.dialog( - "###慨赠###" + - "选择一种基本牌的牌名或非基本牌的类型,然后令" + - get.translation(targets) + - (targets.length > 1 ? "中的一人" : "") + - "选择是否交给你任意张牌" - ); - }, - chooseControl: function () { - var list = []; - var basic = []; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - var type = get.type(name, "trick"); - if (type == "basic") { - list.push(name); - basic.push(name); - } else list.add(type); - } - list.push("cancel2"); - return list; - }, - check: function (event, player) { - if (Math.random() < 0.4) { - var list = _status.event.controls.slice(); - list.remove("du"); - return list.randomGet(); - } - var targets = game.filterPlayer( - (current) => current != player && current.hasSkill("twkaizeng") - ); - targets.sort((a, b) => get.attitude(player, b) - get.attitude(player, a)); - var cards = targets[0].getCards("h"); - var list = []; - for (var card of cards) { - var type = get.type2(card); - if (type == "basic") list.add(get.name(card)); - else list.add(type); - } - var need = ["trick", "equip"].randomSort(); - need.addArray(["sha", "jiu"].randomSort()); - for (var type of need) { - if (list.includes(type)) return type; - } - return list.randomGet(); - }, - backup: function (result, player) { - return { - audio: "twkaizeng", - type: result.control, - log: false, - delay: false, - filterTarget: function (card, player, target) { - return target.hasSkill("twkaizeng"); - }, - selectTarget: function () { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("twkaizeng"); - }); - return targets.length > 1 ? 1 : -1; - }, - prepare: function (cards, player, targets) { - targets[0].logSkill("twkaizeng_want", player); - }, - content: function () { - "step 0"; - var type = lib.skill.twkaizeng_want_backup.type; - var isbasic = lib.card[type]; - target - .chooseCard( - "慨赠:是否交给" + get.translation(player) + "任意张手牌?", - "若你以此法:交给其至少两张牌,你摸一张牌;交给其的牌包含其选择的牌名或类型,你获得一张不为此牌名或类型的牌", - [1, Infinity] - ) - .set("ai", (card) => { - if (!_status.event.goon) return -get.value(card); - var player = _status.event.player, - target = _status.event.getParent().player; - if ( - ui.selected.cards.length > player.countCards("h") / 2 && - ui.selected.cards.length >= 2 - ) - return 0; - var type = _status.event.type; - var isbasic = lib.card[type]; - var add = 0; - if ( - !ui.selected.cards.some( - (i) => - get[isbasic ? "name" : "type2"](i, target) == type - ) - ) - add += 3; - if (ui.selected.cards.length < 2) add += 3; - return ( - get.value(card, target) - get.value(card, player) + add - ); - }) - .set("type", type) - .set("goon", get.attitude(target, player) > 0); - "step 1"; - if (result.bool) { - var cards = result.cards; - event.cards = cards; - target.give(cards, player); - } else { - var refuseInfo = lib.skill.twkaizeng.refuseInfo.slice(); - if (get.attitude(target, player) < 0) refuseInfo.push("没门"); - target.chat(refuseInfo.randomGet()); - event.finish(); - } - "step 2"; - if (cards.length > 1) target.draw(); - "step 3"; - var type = lib.skill.twkaizeng_want_backup.type; - var isbasic = lib.card[type]; - var fn = isbasic ? "name" : "type2"; - if (cards.some((card) => get[fn](card, player) == type)) { - var card = get.cardPile((cardx) => { - return get[fn](cardx, target) != type; - }); - if (card) target.gain(card, "gain2"); - } - "step 4"; - game.delayx(); - }, - ai: { - result: { - target: 1, - }, - }, - }; - }, - prompt: () => "请选择一名有【慨赠】的角色", - }, - ai: { - order: 10, - result: { - player: function (player) { - var targets = game.filterPlayer((current) => { - return current != player && current.hasSkill("twkaizeng"); - }); - for (var i of targets) if (get.attitude(player, i) > 0) return 1; - return 0; - }, - }, - }, - }, - want_backup: {}, - }, - ai: { - threaten: 3, - }, - }, - twyangming: { - audio: 2, - trigger: { - player: "phaseUseEnd", - }, - frequent: true, - filter: function (event, player) { - return player.hasHistory("useCard", (evt) => evt.getParent("phaseUse") == event); - }, - content: function () { - var types = []; - var history = player.getHistory("useCard", (evt) => evt.getParent("phaseUse") == trigger); - for (var evt of history) { - types.add(get.type2(evt.card)); - } - var num = types.length; - player.draw(num); - player.addTempSkill("twyangming_limit"); - player.addMark("twyangming_limit", num, false); - game.log(player, "本回合的手牌上限", "#g+" + num); - }, - subSkill: { - limit: { - charlotte: true, - onremove: true, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("twyangming_limit"); - }, - }, - }, - }, - }, - //邴原 - twbingde: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("he") && player.getStorage("twbingde_clear").length < 4; - }, - onChooseToUse: function (event) { - if (event.type == "phase" && !game.online) { - var map = {}; - event.player.getHistory("useCard", (evt) => { - var evtx = evt.getParent("phaseUse"), - suit = get.suit(evt.card); - if (!lib.suit.includes(suit)) return; - if (evtx != event.getParent("phaseUse")) return; - if (typeof map[suit] != "number") map[suit] = 0; - map[suit]++; - }); - event.set("twbingde_map", map); - } - }, - chooseButton: { - dialog: function (event, player) { - var str = get.translation("twbingde_info"), - str2 = ""; - if (event.twbingde_map) { - str2 = '
    本回合使用牌对应花色数:
    '; - str2 += '
    '; - for (var suit of lib.suit) { - str2 += - get.translation(suit) + - ":" + - get.cnNumber(event.twbingde_map[suit] || 0) + - "张;"; - } - str2 = str2.slice(0, str2.length - 1) + "
    "; - } - return ui.create.dialog("###秉德###" + str, str2); - }, - chooseControl: function (event, player) { - var list = lib.suit.slice(); - list.removeArray(player.getStorage("twbingde_clear")); - list.push("cancel2"); - return list; - }, - check: function (event, player) { - var map = event.twbingde_map; - var suit = lib.suit - .filter((i) => !player.getStorage("twbingde_clear").includes(i)) - .sort((a, b) => { - return map[b] - map[a]; - })[0]; - if (map[suit] == 0) return "cancel2"; - return suit; - }, - backup: function (result, player) { - return { - audio: "twbingde", - filterCard: true, - selectCard: 1, - position: "he", - suit: result.control, - check: function (card) { - var suit = lib.skill.twbingde.suit; - if (get.suit(card) == suit) return 10 - get.value(card); - return 6 - get.value(card); - }, - content: function () { - "step 0"; - var suit = lib.skill.twbingde_backup.suit, - num = 0; - player.popup(suit + 2); - game.log(player, "选择了", "#y" + suit + 2); - player.addTempSkill("twbingde_clear", "phaseUseAfter"); - player.markAuto("twbingde_clear", [suit]); - player.getHistory("useCard", (evt) => { - var evtx = evt.getParent("phaseUse"), - suitx = get.suit(evt.card); - if (!evtx || evtx != event.getParent("phaseUse") || suit != suitx) - return false; - num++; - }); - if (num > 0) player.draw(num); - "step 1"; - if (get.suit(cards[0], player) == lib.skill.twbingde_backup.suit) { - delete player.getStat("skill").twbingde; - } - }, - ai: { - result: { - player: 1, - }, - }, - }; - }, - prompt: () => "秉德:弃置一张牌", - }, - ai: { - order: 2, - result: { player: 1 }, - }, - subSkill: { - backup: {}, - clear: { - charlotte: true, - onremove: true, - }, - }, - }, - twqingtao: { - audio: 2, - trigger: { player: "phaseDrawEnd" }, - filter: function (event, player) { - return player.countCards("he"); - }, - direct: true, - group: "twqingtao_jieshu", - content: function () { - "step 0"; - player - .chooseCard(get.prompt2("twqingtao"), "he", lib.filter.cardRecastable) - .set("ai", function (card) { - if (card.name == "jiu" || get.type(card) != "basic") return 10 - get.value(card); - return 6 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("twqingtao"); - player.recast(result.cards); - if ( - get.name(result.cards[0]) == "jiu" || - get.type(result.cards[0], false, player) != "basic" - ) - player.draw(); - } - }, - subSkill: { - jieshu: { - audio: "twqingtao", - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return ( - player.countCards("he") > 0 && - !player.hasHistory("useSkill", (evt) => evt.skill == "twqingtao") - ); - }, - direct: true, - content: function () { - var next = game.createEvent("twqingtao"); - next.player = player; - next.setContent(lib.skill.twqingtao.content); - }, - }, - }, - }, - //牛董 - twjuntun: { - audio: 2, - trigger: { - global: ["phaseBefore", "dieAfter"], - player: "enterGame", - }, - init: function (player) { - lib.skill.baonvezhi.change(player, 0); - }, - direct: true, - derivation: ["twxiongjun", "baonvezhi_faq"], - group: "twjuntun_extra", - filter: function (event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - game.hasPlayer((current) => { - return !current.hasSkill("twxiongjun"); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("twjuntun"), - "令一名角色获得〖凶军〗", - (card, player, target) => { - return !target.hasSkill("twxiongjun"); - } - ) - .set("ai", (target) => get.attitude(player, target) - 2); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twjuntun", target); - target.addSkills("twxiongjun"); - if (target != player) player.addExpose(0.25); - } - }, - subSkill: { - extra: { - audio: 2, - trigger: { global: "damageSource" }, - forced: true, - locked: false, - filter: function (event, player) { - return ( - event.source && event.source.hasSkill("twxiongjun") && event.source != player - ); - }, - logTarget: "source", - content: function () { - lib.skill.baonvezhi.change(player, trigger.num); - }, - }, - }, - }, - baonvezhi: { - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - silent: true, - forced: true, - charlotte: true, - baonvezhi_max: 5, - change: function (player, num) { - var baonvezhi_max = lib.skill.baonvezhi.baonvezhi_max; - player.addSkill("baonvezhi"); - var tmp = player.countMark("baonvezhi"); - if (tmp + num > baonvezhi_max) num = baonvezhi_max - tmp; - else if (tmp + num < 0) num = -tmp; - if (num === 0) return; - player[num > 0 ? "addMark" : "removeMark"]("baonvezhi", Math.abs(num), false); - game.log( - player, - num >= 0 ? "获得了" : "失去了", - get.cnNumber(Math.abs(num)) + '点暴虐值' - ); - player[player.countMark("baonvezhi") > 0 ? "markSkill" : "unmarkSkill"]("baonvezhi"); - }, - filter: function (event, player) { - return player.countMark("baonvezhi") < lib.skill.baonvezhi.baonvezhi_max; - }, - content: function () { - lib.skill.baonvezhi.change(player, trigger.num); - }, - marktext: "暴", - intro: { - name: "暴虐值", - content: function (storage, player) { - return get.translation(player) + "的暴虐值为" + (player.storage.baonvezhi || 0); - }, - }, - }, - baonvezhi_faq: {}, - twxiongjun: { - init: function (player) { - lib.skill.baonvezhi.change(player, 0); - }, - trigger: { source: "damageSource" }, - forced: true, - usable: 1, - content: function () { - var targets = game.filterPlayer((current) => current.hasSkill("twxiongjun")).sortBySeat(); - player.line(targets, "green"); - game.asyncDraw(targets); - }, - }, - twxiongxi: { - audio: 2, - enable: "phaseUse", - usable: 1, - init: function (player) { - lib.skill.baonvezhi.change(player, 0); - }, - filterCard: () => true, - selectCard: function () { - return ( - (lib.skill.baonvezhi.baonvezhi_max || 5) - _status.event.player.countMark("baonvezhi") - ); - }, - check: function (card) { - return 6 - get.value(card); - }, - position: "he", - filterTarget: function (card, player, target) { - return target != player; - }, - content: function () { - target.damage(); - }, - ai: { - expose: 0.25, - order: 8, - result: { - target: function (player, target) { - return get.damageEffect(target, player, player); - }, - }, - }, - }, - twxiafeng: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return player.countMark("baonvezhi") > 0; - }, - init: function (player) { - lib.skill.baonvezhi.change(player, 0); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseButton( - ["黠凤:选择要消耗的暴虐值", [["tw_bn_1", "tw_bn_2", "tw_bn_3"], "vcard"]], - (button) => { - var num = player.countCards( - "hs", - (card) => - get.tag(card, "damage") && - game.hasPlayer( - (current) => get.effect(current, card, player, player) > 0 - ) - ); - if (num <= 0) return 0; - if (num >= 3) num = 3; - if (button.link[2] == "tw_bn_" + num) return 10; - return 1; - } - ) - .set("filterButton", (button) => { - var player = _status.event.player; - var link = button.link[2]; - if (link[link.length - 1] * 1 > player.storage.baonvezhi) return false; - return true; - }); - "step 1"; - if (result.bool) { - player.logSkill("twxiafeng"); - var link = result.links[0][2], - num = link[link.length - 1] * 1; - player.addTempSkill("twxiafeng_effect"); - player.storage.twxiafeng_effect = num; - lib.skill.baonvezhi.change(player, -num); - } - }, - subSkill: { - effect: { - trigger: { player: "useCard" }, - filter: function (event, player) { - return !player.storage.twxiafeng_effect2; - }, - forced: true, - content: function () { - var count = player.getHistory( - "useCard", - (evt) => evt.getParent("phaseUse").player == player - ).length; - if (count == player.storage.twxiafeng_effect) { - player.storage.twxiafeng_effect2 = true; - } - if (count <= player.storage.twxiafeng_effect) { - trigger.directHit.addArray(game.players); - if (trigger.addCount !== false) { - trigger.addCount = false; - var stat = player.getStat().card, - name = trigger.card.name; - if (typeof stat[name] == "number") stat[name]--; - } - } - }, - onremove: function (player) { - delete player.storage.twxiafeng_effect; - delete player.storage.twxiafeng_effect2; - }, - mod: { - targetInRange: function (card, player, target, now) { - if (!player.storage.twxiafeng_effect2) return true; - }, - cardUsableTarget: function (card, player, target) { - if (!player.storage.twxiafeng_effect2) return true; - }, - maxHandcard: function (player, num) { - return num + (player.storage.twxiafeng_effect || 0); - }, - }, - }, - }, - }, - //蒋济 - twjichou: { - audio: 2, - enable: "chooseToUse", - group: ["twjichou_ban", "twjichou_give"], - filter: function (event, player) { - if (player.hasSkill("twjichou_used") && player.hasSkill("twjichou_given")) return false; - if (!player.hasSkill("twjichou_used")) { - var record = player.getStorage("twjichou"); - for (var i of lib.inpile) { - var type = get.type(i); - if ( - type == "trick" && - !record.includes(i) && - event.filterCard({ name: i, isCard: true }, player, event) - ) - return true; - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var dialog = ui.create.dialog("急筹"); - if ( - !player.hasSkill("twjichou_used") && - !player.hasSkill("twjichou_given") && - event.type == "phase" && - player.countCards("h", (card) => { - return player.getStorage("twjichou").includes(get.name(card)); - }) - ) { - dialog._chosenOpt = []; - var table = document.createElement("div"); - table.classList.add("add-setting"); - table.style.margin = "0"; - table.style.width = "100%"; - table.style.position = "relative"; - var list = ["视为使用牌", "交出锦囊牌"]; - for (var i of list) { - var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); - td.innerHTML = "" + i + ""; - td.link = i; - if (i == list[0]) { - td.classList.add("bluebg"); - dialog._chosenOpt.add(td); - } - td.addEventListener( - lib.config.touchscreen ? "touchend" : "click", - function () { - if (_status.dragged) return; - if (_status.clicked) return; - if (_status.justdragged) return; - _status.tempNoButton = true; - _status.clicked = true; - setTimeout(function () { - _status.tempNoButton = false; - }, 500); - var link = this.link; - if (link == "交出锦囊牌") game.uncheck(); - var current = this.parentNode.querySelector(".bluebg"); - if (current) { - current.classList.remove("bluebg"); - dialog._chosenOpt.remove(current); - } - dialog._chosenOpt.add(this); - this.classList.add("bluebg"); - game.check(); - } - ); - table.appendChild(td); - dialog.buttons.add(td); - } - dialog.content.appendChild(table); - } - var list = [], - record = player.getStorage("twjichou"); - for (var name of lib.inpile) { - if ( - get.type(name) == "trick" && - !record.includes(name) && - event.filterCard({ name: name, isCard: true }, player, event) - ) - list.push(["锦囊", "", name]); - } - dialog.add([list, "vcard"]); - return dialog; - }, - filter: function (button) { - if (_status.event.dialog) { - var opts = _status.event.dialog._chosenOpt; - if ( - opts && - opts.length && - opts[0].link == "交出锦囊牌" && - typeof button.link != typeof opts[0].link - ) { - return false; - } - return true; - } - return false; - }, - select: function () { - if (_status.event.dialog) { - var opts = _status.event.dialog._chosenOpt; - return opts && opts.length && opts[0].link == "交出锦囊牌" ? 0 : 1; - } - return 0; - }, - 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.1; - return player.getUseValue({ name: button.link[2] }); - }, - backup: function (links, player) { - var isUse = links.length == 1; - var backup = get.copy(lib.skill["twjichou_" + (isUse ? "use" : "give")]); - if (isUse) backup.viewAs = { name: links[0][2], isCard: true }; - return backup; - }, - prompt: function (links, player) { - var isUse = links.length == 1; - return ( - "急筹:" + - (isUse - ? "视为使用" + get.translation(links[0][2]) + "" - : "选择要交出的牌和要交给的目标") - ); - }, - }, - hiddenCard: function (player, name) { - if (player.hasSkill("twjichou_used")) return false; - var type = get.type(name); - return type == "trick" && !player.getStorage("twjichou").includes(name); - }, - marktext: "筹", - intro: { - markcount: function (storage, player) { - if (storage && storage.length) return storage.length; - return 0; - }, - content: "已记录牌名:$", - }, - ai: { - order: 1, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - backup: {}, - used: { charlotte: true }, - given: { charlotte: true }, - ban: { - trigger: { global: "useCard1" }, - filter: function (event, player) { - return player.getStorage("twjichou").includes(event.card.name); - }, - forced: true, - locked: false, - silent: true, - content: function () { - trigger.directHit.add(player); - }, - mod: { - cardEnabled: function (card, player) { - if ( - player.getStorage("twjichou").includes(card.name) && - (get.position(card) == "h" || - (card.cards && card.cards.some((i) => get.position(i) == "h"))) - ) - return false; - }, - cardSavable: function (card, player) { - if ( - player.getStorage("twjichou").includes(card.name) && - (get.position(card) == "h" || - (card.cards && card.cards.some((i) => get.position(i) == "h"))) - ) - return false; - }, - aiValue: function (player, card) { - if (get.type(card) != "trick" || _status.twjichou_give_aiCheck) return; - if ( - !player.getFriends().length && - player.getStorage("twjichou").includes(get.name(card)) - ) - return 0; - }, - aiUseful: function () { - return lib.skill.twjichou_ban.mod.aiValue.apply(this, arguments); - }, - }, - }, - use: { - filterCard: () => false, - selectCard: -1, - audio: "twjichou", - popname: true, - onuse: function (links, player) { - player.markAuto("twjichou", [links.card.name]); - player.syncStorage("twjichou"); - player.addTempSkill("twjichou_used"); - }, - }, - give: { - audio: "twjichou", - enable: "phaseUse", - filter: function (event, player) { - return ( - player.hasSkill("twjichou_used") && - !player.hasSkill("twjichou_given") && - player.countCards("h", (i) => - player.getStorage("twjichou").includes(get.name(i)) - ) - ); - }, - filterTarget: function (card, player, target) { - return target != player; - }, - filterCard: function (card, player) { - return player.getStorage("twjichou").includes(get.name(card)); - }, - check: function (card) { - _status.twjichou_give_aiCheck = true; - var val = get.value(card); - delete _status.twjichou_give_aiCheck; - return val; - }, - prompt: () => "选择要交出的牌和要交给的目标", - selectCard: [1, Infinity], - discard: false, - lose: false, - delay: false, - content: function () { - player.give(cards, target); - player.addTempSkill("twjichou_given", "phaseUseAfter"); - }, - ai: { - order: 0.9, - result: { - target: function (player, target) { - if (target.hasSkillTag("nogain")) return 0; - if (target.hasJudge("lebu")) return 0; - return target - .getCards("h", (card) => - player.getStorage("twjichou").includes(get.name(card)) - ) - .reduce((p, c) => p + (target.getUseValue(c) || 1), 0); - }, - }, - }, - }, - }, - }, - twjilun: { - audio: 2, - trigger: { player: "damageEnd" }, - direct: true, - content: function () { - "step 0"; - var num = Math.min(Math.max(1, player.getStorage("twjichou").length), 5); - event.num = num; - var choices = ["选项一"]; - var choiceList = [ - "摸" + get.cnNumber(num) + "张牌", - "视为使用一张在〖急筹〗记录内且不在〖机论〗记录内的普通锦囊牌", - ]; - if ( - !player.getStorage("twjichou").length || - player.getStorage("twjichou").filter((name) => { - return ( - !player.getStorage("twjilun").includes(name) && - player.hasUseTarget({ name: name }) - ); - }).length == 0 - ) - choiceList[1] = '' + choiceList[1] + ""; - else choices.push("选项二"); - player - .chooseControl(choices, "cancel2") - .set("choiceList", choiceList) - .set("prompt", get.prompt("twjilun")) - .set("ai", () => { - if (_status.event.choiceList.length == 1 || !player.getStorage("twjichou").length) - return 0; - var val = - _status.event.num > 3 ? Math.min(1.5, 1 + (_status.event.num - 3) * 0.1) : 1; - for (var name of player.getStorage("twjichou")) { - if (player.getStorage("twjilun").includes(name)) continue; - if (player.getUseValue({ name: name }) > 4 * val) return 1; - } - return 0; - }) - .set("num", num); - "step 1"; - if (result.control != "cancel2") { - if (result.control == "选项一") { - player.logSkill("twjilun"); - player.draw(num); - event.finish(); - } else { - var list = []; - for (var name of player.getStorage("twjichou")) { - if (!player.getStorage("twjilun").includes(name)) { - list.push(["锦囊", "", name]); - } - } - player - .chooseButton([ - '###机论###
    是否视为使用一张〖急筹〗已记录的普通锦囊牌?
    ', - [list, "vcard"], - ]) - .set("filterButton", (button) => { - return _status.event.player.hasUseTarget({ name: button.link[2] }); - }) - .set("ai", (button) => { - return _status.event - .getParent() - .player.getUseValue({ name: button.link[2] }, null, true); - }); - } - } else event.finish(); - "step 2"; - if (result.bool) { - var card = { name: result.links[0][2], isCard: true }; - player.chooseUseTarget(card, true).set("logSkill", "twjilun"); - player.markAuto("twjilun", [card.name]); - player.syncStorage("twjilun"); - } else event.goto(0); - }, - marktext: "论", - intro: { - markcount: function (storage, player) { - if (storage && storage.length) return storage.length; - return 0; - }, - content: "已记录牌名:$", - }, - ai: { - maixie: true, - maixie_defend: true, - threaten: 0.7, - }, - }, - //蹇硕 - twkunsi: { - audio: 2, - enable: "phaseUse", - onremove: true, - derivation: "twlinglu", - filter: function (event, player) { - return game.hasPlayer(function (current) { - return ( - player.canUse({ name: "sha", isCard: true }, current, false) && - current != player && - !player.getStorage("twkunsi").includes(current) - ); - }); - }, - filterTarget: function (card, player, target) { - return ( - player.canUse({ name: "sha", isCard: true }, target, false) && - target != player && - !player.getStorage("twkunsi").includes(target) - ); - }, - content: function () { - "step 0"; - player.markAuto("twkunsi", [target]); - player.storage.twkunsi.sortBySeat(); - player.markSkill("twkunsi"); - player.useCard({ name: "sha", isCard: true }, target, false).animate = false; - "step 1"; - if ( - !player.hasHistory("sourceDamage", function (evt) { - var card = evt.card; - if (!card || card.name != "sha") return false; - var evtx = evt.getParent("useCard"); - return evtx.card == card && evtx.getParent() == event; - }) - ) { - player.line(target); - target.markAuto("twlinglu", [player]); - target.addAdditionalSkills("twkunsi_temp", "twlinglu"); - player.markAuto("twkunsi_clear", [target]); - player.addTempSkill("twkunsi_clear", { player: "phaseBegin" }); - } - }, - intro: { content: "已对$发动过〖困兕〗" }, - ai: { - order: function () { - return get.order({ name: "sha" }) - 0.1; - }, - expose: 0.2, - result: { - target: function (player, target) { - if ( - target.countCards("h") <= target.hp && - !target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) && - get.effect(target, { name: "sha", isCard: true }, player, player) > 0 - ) - return -1; - else if (target.countCards("h") > target.hp && target.hp > 2 && target.hasShan()) - return 1; - return 0; - }, - }, - }, - subSkill: { - clear: { - forced: true, - onremove: function (player, skill) { - var targets = player.getStorage(skill); - for (var target of targets) { - if (target.isIn()) { - target.removeAdditionalSkill("twkunsi_temp"); - } - } - }, - }, - }, - }, - twlinglu: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player; - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twlinglu"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.countCards("hs") > 4 && target.hp >= 3) return att; - if (player.getStorage("twlinglu").includes(target)) return -2 * att; - return -att; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twlinglu", target); - target.addTempSkill("twlinglu_order", { player: "phaseAfter" }); - if (!target.storage.twlinglu_settle) target.storage.twlinglu_settle = []; - target.storage.twlinglu_settle.unshift([player, 1]); - if (player.getStorage("twlinglu").includes(target)) - player - .chooseBool( - "是否令" + get.translation(target) + "于〖令戮〗失败时进行两次结算?" - ) - .set("ai", function () { - return true; - }); - else event.finish(); - } else event.finish(); - "step 2"; - if (result.bool) { - target.storage.twlinglu_settle[0][1]++; - game.log(target, "于本次强令失败时进行两次结算"); - } - }, - ai: { expose: 0.2 }, - subSkill: { - order: { - audio: 2, - trigger: { source: "damageSource" }, - group: "twlinglu_settle", - silent: true, - charlotte: true, - onremove: true, - mark: true, - marktext: "令", - intro: { - content: function (storage, player) { - return ( - "
  • 任务目标:于你下回合结束前造成的伤害不小于2点
  • 已造成" + - player.countMark("twlinglu_order") + - "点伤害" - ); - }, - }, - content: function () { - player.addMark("twlinglu_order", trigger.num, false); - }, - }, - settle: { - audio: "twlinglu_order", - trigger: { player: "phaseEnd" }, - charlotte: true, - silent: true, - onremove: true, - filter: function (event, player) { - return player.getStorage("twlinglu_settle").length > 0; - }, - content: function () { - "step 0"; - var list = player.getStorage("twlinglu_settle").shift(); - var target = list[0], - count = list[1] || 1; - event.target = target; - event.count = count; - "step 1"; - if (player.countMark("twlinglu_order") >= 2) { - game.log(player, "成功完成了", target, "发布的", "#g【令戮】", "强令"); - player.popup("强令成功", "wood"); - player.draw(2); - event.finish(); - } else { - game.log(player, "未完成", target, "发布的", "#g【令戮】", "强令"); - player.popup("强令失败", "fire"); - } - "step 2"; - if (player.countMark("twlinglu_order") >= 2) { - game.delayx(); - } else { - event.count--; - player.loseHp(); - } - "step 3"; - if (event.count > 0) event.goto(2); - "step 4"; - if (player.getStorage("twlinglu_settle").length > 0) { - event.goto(0); - game.delayx(); - } - }, - }, - }, - }, - //马腾 - twxiongzheng: { - audio: 2, - onremove: true, - trigger: { global: "roundStart" }, - direct: true, - content: function () { - "step 0"; - var target = player.storage.twxiongzheng_target; - delete player.storage.twxiongzheng_target; - if (!target) { - event.goto(4); - return; - } - event.target = target; - var list = [], - list2 = []; - var history = target.actionHistory; - if (history.length < 2) { - event.goto(4); - return; - } - for (var i = history.length - 2; i >= 0; i--) { - for (var evt of history[i].damage) { - if (evt.source) list.add(evt.source); - } - if (history[i].isRound) break; - } - var list2 = game.filterPlayer((i) => i != player).removeArray(list); - event.list = list; - event.list2 = list2; - var choiceList = [ - "视为对任意名上一轮未对" + get.translation(target) + "造成过伤害的角色使用一张【杀】", - "令任意名上一轮对" + get.translation(target) + "造成过伤害的角色摸两张牌", - ]; - var choices = []; - if (list2.length) { - choices.push("选项一"); - choiceList[0] += "(" + get.translation(list2) + ")"; - } else choiceList[0] = '' + choiceList[0] + ""; - if (list.length) { - choices.push("选项二"); - choiceList[1] += "(" + get.translation(list) + ")"; - } else choiceList[1] = '' + choiceList[1] + ""; - choices.push("cancel2"); - player - .chooseControl(choices) - .set("prompt", "雄争:是否选择一项?") - .set("choiceList", choiceList) - .set("ai", function () { - var player = _status.event.player; - var list = _status.event.getParent().list, - list2 = _status.event.getParent().list2; - var eff = list - .map((target) => { - if (target == player) return 0; - return get.effect(target, { name: "sha" }, player, player); - }) - .reduce((p, c) => p + c, 0), - eff2 = list2 - .map((target) => 2 * get.effect(target, { name: "draw" }, player, player)) - .reduce((p, c) => p + c, 0); - if (_status.event.controls.includes("选项二") && eff2 > eff) return "选项二"; - if (eff > 0) return 0; - return "cancel2"; - }); - "step 1"; - if (result.control == "选项一") { - event.bool = true; - if (event.list2.length) - player - .chooseTarget( - "雄争:请选择任意名满足条件的角色,你视为依次对这些角色使用一张杀", - [1, Infinity], - true, - function (card, player, target) { - return ( - player.canUse("sha", target, false, false) && - _status.event.getParent().list2.includes(target) - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "sha" }, player, player); - }); - else event.finish(); - } else if (result.control == "选项二") { - event.bool = false; - if (event.list.length) - player - .chooseTarget( - "雄争:请选择任意名满足条件的角色,这些角色摸两张牌", - [1, Infinity], - true, - function (card, player, target) { - return _status.event.getParent().list.includes(target); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "draw" }, player, player); - }); - else event.finish(); - } else event.goto(3); - "step 2"; - result.targets.sortBySeat(); - player.logSkill("twxiongzheng", result.targets); - if (event.bool) { - for (var i of result.targets) player.useCard({ name: "sha", isCard: true }, i, false); - } else game.asyncDraw(result.targets, 2); - "step 3"; - if ( - !game.hasPlayer(function (current) { - return !player.getStorage("twxiongzheng").includes(current); - }) - ) - event.finish(); - else game.delayx(); - "step 4"; - player - .chooseTarget( - get.prompt("twxiongzheng"), - "选择一名未选择过的角色,称为“雄争”角色", - function (card, player, target) { - return !player.getStorage("twxiongzheng").includes(target); - } - ) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (game.roundNumber <= 1 && player.hasUnknown()) return 0; - return -att; - }); - "step 5"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twxiongzheng", target); - player.markAuto("twxiongzheng", [target]); - player.storage.twxiongzheng_target = target; - player.addTempSkill("twxiongzheng_mark", "roundStart"); - target.addTempSkill("twxiongzheng_threaten", "roundStart"); - game.delayx(); - } - }, - subSkill: { - mark: { - intro: { - content: "$参与了〖雄争〗的争斗", - onunmark: true, - }, - charlotte: true, - onremove: true, - trigger: { global: "damage" }, - firstDo: true, - direct: true, - filter: function (event, player) { - return ( - event.player == player.storage.twxiongzheng_target && - get.itemtype(event.source) == "player" - ); - }, - content: function () { - player.markAuto("twxiongzheng_mark", [trigger.source]); - }, - }, - threaten: { - mark: true, - intro: { content: "本轮〖雄争〗目标" }, - ai: { threaten: 10 }, - }, - }, - }, - twluannian: { - audio: 2, - global: "twluannian_global", - unique: true, - zhuSkill: true, - subSkill: { - global: { - audio: "twluannian", - enable: "phaseUse", - usable: 1, - forceaudio: true, - onChooseToUse: function (event) { - if (!game.online) { - var num = 1; - game.countPlayer2((current) => { - var history = current.actionHistory; - for (var i = history.length - 1; i >= 0; i--) { - for (var evt of history[i].useSkill) { - if (evt.skill == "twluannian_global") num++; - } - if (history[i].isRound) break; - } - }); - event.set("twluannian_num", num); - } - }, - filter: function (event, player) { - if (!event.twluannian_num) return false; - return ( - player.group == "qun" && - player.countCards("he") >= event.twluannian_num && - game.hasPlayer(function (current) { - var target = current.storage.twxiongzheng_target; - return ( - target && - target.isIn() && - current != player && - current.hasZhuSkill("twluannian", player) - ); - }) - ); - }, - filterCard: true, - position: "he", - prompt: function () { - var player = _status.event.player; - var num = _status.event.twluannian_num; - var list = game - .filterPlayer(function (current) { - return current.hasZhuSkill("twluannian", player); - }) - .map((i) => i.storage.twxiongzheng_target) - .sortBySeat(); - return ( - "弃置" + - get.cnNumber(num) + - "张牌,对" + - get.translation(list) + - (list.length > 1 ? "中的一人" : "") + - "造成1点伤害" - ); - }, - selectCard: function () { - return _status.event.twluannian_num; - }, - complexSelect: true, - complexCard: true, - filterTarget: function (card, player, target) { - return game - .filterPlayer(function (current) { - return current.hasZhuSkill("twluannian", player); - }) - .map((i) => i.storage.twxiongzheng_target) - .includes(target); - }, - selectTarget: function () { - return game - .filterPlayer(function (current) { - return current.hasZhuSkill("twluannian", _status.event.player); - }) - .map((i) => i.storage.twxiongzheng_target) - .filter((i) => i && i.isIn()).length > 1 - ? 1 - : -1; - }, - check: function (card) { - return 6 - get.value(card); - }, - content: function () { - target.damage(); - }, - ai: { - order: 7, - result: { - target: function (player, target) { - return get.damageEffect(target, player, target); - }, - }, - expose: 0.25, - }, - }, - }, - ai: { - combo: "twxiongzheng" - }, - }, - //鲍信 - twmutao: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.countCards("h"); - }, - content: function () { - "step 0"; - event.togive = target.getNext(); - var cards = target.getCards("h", { name: "sha" }); - if (!cards.length) { - game.log("但", target, "没有", "#y杀", "!"); - event.finish(); - } - "step 1"; - var cards = target.getCards("h", { name: "sha" }), - card = cards.randomRemove(1)[0]; - target.give(card, event.togive); - if (cards.length) { - event.togive = event.togive.getNext(); - event.redo(); - } - "step 2"; - target.line(event.togive); - event.togive.damage(Math.min(2, event.togive.countCards("h", { name: "sha" })), target); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - var num = 0, - numx = target.countCards("h", { name: "sha" }), - targetx = target; - for (var i = 0; i < numx; i++) { - targetx = targetx.next; - if (targetx == player) targetx = targetx.next; - } - var att1 = get.attitude(player, target), - att2 = get.attitude(player, targetx); - if (att1 > 0 && att2 < 0) num = 0.25; - if (att1 < 0 && att2 < 0) num = 4; - return att1 * num * numx * (targetx.countCards("h", { name: "sha" }) + 1); - }, - }, - }, - }, - twyimou: { - audio: 2, - trigger: { global: "damageEnd" }, - filter: function (event, player) { - return event.player.isIn() && get.distance(player, event.player) <= 1; - }, - logTarget: "player", - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - content: function () { - "step 0"; - if (trigger.player != player) player.addExpose(0.3); - var target = get.translation(trigger.player); - var choiceList = [ - "令" + target + "获得牌堆里的一张【杀】", - "令" + target + "将一张牌交给另一名角色,然后" + target + "摸两张牌", - "背水!" + - (trigger.player != player ? "将所有手牌交给" + target + ",然后" : "") + - "依次执行以上所有选项", - ]; - var list = ["选项一"]; - if (trigger.player.countCards("h")) list.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - if (player.countCards("h")) list.push("背水!"); - else choiceList[2] = '' + choiceList[2] + ""; - player - .chooseControl(list) - .set("prompt", "毅谋:请选择一项") - .set("choiceList", choiceList) - .set("ai", function () { - var evt = _status.event.getTrigger(), - list = _status.event.list; - var player = _status.event.player; - var target = evt.player; - if ( - (target.hp >= target.countCards("h") + 2 || target == player) && - list.includes("背水!") - ) - return "背水!"; - if (target.countCards("h") && list.includes("选项二")) return "选项二"; - return "选项一"; - }) - .set("list", list); - "step 1"; - event.choice = result.control; - if (event.choice == "背水!" && player != trigger.player) - player.give(player.getCards("h"), trigger.player); - "step 2"; - if (event.choice != "选项二") { - var card = get.cardPile2(function (card) { - return card.name == "sha"; - }); - if (card) trigger.player.gain(card, "gain2"); - else game.log("但牌堆里已经没有", "#y杀", "了!"); - if (event.choice == "选项一") event.finish(); - } - "step 3"; - if (event.choice != "选项一") { - if (trigger.player.countCards("h")) - trigger.player.chooseCardTarget({ - prompt: "将一张手牌交给另一名其他角色并摸两张牌", - filterCard: true, - forced: true, - filterTarget: lib.filter.notMe, - ai1: function (card) { - return 1 / Math.max(0.1, get.value(card)); - }, - ai2: function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (target.hasSkillTag("nogain")) att /= 9; - return 4 + att; - }, - }); - else event.finish(); - } - "step 4"; - var target = result.targets[0]; - trigger.player.line(target); - trigger.player.give(result.cards, target); - trigger.player.draw(2); - }, - ai: { - threaten: 2.5, - }, - }, - //刘夫人 - twzhuidu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.isDamaged(); - }); - }, - filterTarget: function (card, player, target) { - if (player == target) return false; - return target.isDamaged(); - }, - chooseButton: { - dialog: function (event, player) { - var name = get.translation(event.result.targets[0]); - var dialog = ui.create.dialog("追妒:选择一项", "hidden"); - dialog.add([ - [ - ["damage", "对" + name + "造成1点伤害"], - ["discard", "弃置" + name + "装备区里的一张牌"], - ["both", "背水!若该角色为女性,弃置一张牌,然后依次执行以上所有选项"], - ], - "textbutton", - ]); - return dialog; - }, - filter: function (button, player) { - var target = _status.event.getParent().result.targets[0]; - var link = button.link; - if (link == "damage") return true; - if (link == "discard") return target.countCards("e"); - return target.hasSex("female") && player.countDiscardableCards(player, "he") > 0; - }, - check: function (button) { - switch (button.link) { - case "damage": - return 10; - case "discard": - return 1; - case "both": - return 15; - } - }, - backup: function (links) { - var backup = { - audio: "twzhuidu", - target: _status.event.result.targets[0], - choice: links[0], - filterTarget: function (card, player, target) { - return target == lib.skill.twzhuidu_backup.target; - }, - selectTarget: -1, - content: function () { - var target = lib.skill.twzhuidu_backup.target; - var choice = lib.skill.twzhuidu_backup.choice; - if (choice != "discard") target.damage(); - if (choice != "damage") player.discardPlayerCard(target, "e", true); - }, - }; - if (links[0] == "both") { - backup.filterCard = true; - backup.position = "he"; - } - return backup; - }, - prompt: function (links) { - var name = get.translation(_status.event.result.targets[0]); - switch (links[0]) { - case "damage": - return "对" + name + "造成1点伤害"; - case "discard": - return "弃置" + name + "装备区里的一张牌"; - case "both": - return ( - "背水!弃置一张牌,然后对" + name + "造成1点伤害并弃置其装备区里的一张牌" - ); - } - }, - }, - subSkill: { - backup: {}, - }, - ai: { - order: 7, - result: { - target: function (player, target) { - if (target.hasSex("female") && target.countCards("e") && player.countCards("he")) - return -2; - return -1; - }, - }, - }, - }, - twshigong: { - audio: 2, - trigger: { player: "dying" }, - filter: function (event, player) { - var target = _status.currentPhase; - return player.hp <= 0 && target && target.isIn() && target != player; - }, - skillAnimation: true, - animationColor: "gray", - limited: true, - logTarget: function (event, player) { - return _status.currentPhase; - }, - content: function () { - "step 0"; - player.awakenSkill("twshigong"); - var target = _status.currentPhase; - if (target.hp <= 0) event._result = { bool: false }; - else - target - .chooseToDiscard( - "h", - target.hp, - get.translation(player) + - "对你发动了【示恭】,是否弃置" + - get.cnNumber(target.hp) + - "张手牌?", - "若如此做,其将体力回复至1点;或者点击“取消”加1点体力上限并回复1点体力,摸一张牌,然后其将体力回复至体力上限" - ) - .set("ai", (card) => { - if (!_status.event.goon) return 0; - return 7 - get.value(card); - }) - .set("goon", get.attitude(target, player) >= 0); - "step 1"; - var target = _status.currentPhase; - if (result.bool) { - var num = 1 - player.hp; - if (num > 0) player.recover(num); - event.finish(); - } else { - target.gainMaxHp(); - target.recover(); - target.draw(); - } - "step 2"; - var num = player.maxHp - player.hp; - if (num > 0) player.recover(num); - }, - }, - //王淩 - twmibei: { - audio: "mibei", - trigger: { player: "useCardAfter" }, - group: ["twmibei_mark", "twmibei_fail"], - forced: true, - locked: false, - direct: true, - dutySkill: true, - derivation: "twmouli", - filter: function (event, player) { - var map = { basic: 0, trick: 0, equip: 0 }; - for (var name of player.getStorage("twmibei")) { - var type = get.type2(name); - if (typeof map[type] == "number") map[type]++; - } - for (var i in map) { - if (map[i] < 2) return false; - } - return true; - }, - content: function () { - player.awakenSkill("twmibei"); - player.logSkill("twmibei_achieve"); - game.log(player, "成功完成使命"); - player.addSkills("twmouli"); - }, - intro: { content: "已使用牌名:$" }, - subSkill: { - achieve: { - audio: "mibei1", - skillAnimation: true, - animationColor: "water", - }, - mark: { - trigger: { player: "useCard1" }, - filter: function (event, player) { - return !player.getStorage("twmibei").includes(event.card.name); - }, - charlotte: true, - forced: true, - silent: true, - dutySkill: true, - content: function () { - player.markAuto("twmibei", [trigger.card.name]); - }, - }, - fail: { - audio: "mibei2", - trigger: { player: "phaseUseEnd" }, - forced: true, - filter: function (event, player) { - return !player.getHistory("useCard").length; - }, - content: function () { - game.log(player, "使命失败"); - delete player.storage.twmibei; - player.addTempSkill("twmibei_less"); - player.addMark("twmibei_less", 1, false); - }, - }, - less: { - charlotte: true, - marktext: "缚", - intro: { content: "本回合手牌上限-#" }, - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("twmibei_less"); - }, - }, - }, - }, - }, - twxingqi: { - audio: "xingqi", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - var num = 0; - game.countPlayer(function (current) { - num += current.countCards("ej"); - }); - return num > player.hp; - }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - content: function () { - player.awakenSkill("twxingqi"); - player.recover(); - if (!player.awakenedSkills.includes("twmibei")) { - var list = ["basic", "equip", "trick"], - cards = []; - for (var i of list) { - var card = get.cardPile2(function (card) { - return get.type(card) == i; - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - } else player.addSkill("twxingqi_range"); - }, - subSkill: { - range: { - charlotte: true, - mark: true, - marktext: "启", - mod: { - targetInRange: () => true, - }, - intro: { content: "使用牌无距离限制" }, - }, - }, - }, - twmouli: { - audio: "mouli", - enable: "chooseToUse", - filter: function (event, player) { - if (event.type == "wuxie") return false; - if (player.hasSkill("twmouli_used")) return false; - if (!Array.isArray(event.twmouli)) return false; - for (var card of event.twmouli) { - if (event.filterCard(card, player, event)) return true; - } - return false; - }, - onChooseToUse: function (event) { - if (game.online || !event.player.hasSkill("twmouli")) return; - var cards = []; - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var card = ui.cardPile.childNodes[i]; - if (get.type(card) == "basic") cards.push(card); - } - event.set("twmouli", cards); - }, - chooseButton: { - dialog: function (event, player) { - var dialog = ui.create.dialog("谋立", "hidden"); - if (event.twmouli && event.twmouli.length) dialog.add(event.twmouli); - else dialog.addText("牌堆里没有基本牌"); - return dialog; - }, - filter: function (button, player) { - var evt = _status.event.getParent(), - card = button.link; - if (evt && evt.filterCard) return evt.filterCard(card, player, evt); - return false; - }, - check: function (button) { - var player = _status.event.player, - card = button.link; - if (_status.event.type != "phase") return 1; - if (_status.event.dying) return get.attitude(player, _status.event.dying); - if (card.name == "jiu") return player.getUseValue(card); - return player.getUseValue(card) / 4; - }, - backup: function (links, player) { - return { - audio: "mouli", - filterCard: () => false, - selectCard: -1, - viewAs: { name: links[0].name, isCard: true, cards: [links[0]] }, - popname: true, - precontent: function () { - player.logSkill("twmouli"); - player.addTempSkill("twmouli_used"); - 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; - var next = game.createEvent("twmouli_update"); - event.next.remove(next); - event.getParent().after.push(next); - next.setContent(function () { - game.updateRoundNumber(); - }); - }, - }; - }, - prompt: function (links, player) { - return "使用牌堆中的" + get.translation(links); - }, - }, - hiddenCard: function (player, name) { - return get.type(name) == "basic" && !player.getStat("skill").twmouli; - }, - subSkill: { - used: { charlotte: true }, - }, - ai: { - effect: { - target: function (card, player, target, effect) { - if (get.tag(card, "respondShan")) return 0.7; - if (get.tag(card, "respondSha")) return 0.7; - }, - }, - order: 11, - respondSha: true, - respondShan: true, - fireAttack: true, - skillTagFilter: function (player, tag, arg) { - if (arg == "respond") return false; - var list = []; - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var card = ui.cardPile.childNodes[i]; - if (get.type(card, player) == "basic" && !list.includes(card.name)) - list.push(card.name); - } - if (tag == "respondSha") return list.includes("sha"); - if (tag == "respondShan") return list.includes("shan"); - return !player.getStat("skill").twmouli; - }, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - }, - //诸葛果 - twqirang: { - audio: "qirang", - trigger: { player: "equipEnd" }, - frequent: true, - content: function () { - var card = get.cardPile(function (card) { - return get.type2(card) == "trick"; - }); - if (card) { - player.gain(card, "gain2").gaintag.add("twqirang"); - player.addTempSkill("twqirang_use"); - player.addTempSkill("twqirang_clear", [ - "phaseZhunbeiAfter", - "phaseDrawAfter", - "phaseUseAfter", - "phaseDiscardAfter", - "phaseJieshuAfter", - "phaseAfter", - ]); - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; - }, - }, - }, - subSkill: { - clear: { - charlotte: true, - onremove: function (player) { - player.removeGaintag("twqirang"); - }, - }, - use: { - audio: "qirang", - trigger: { player: "useCard2" }, - forced: true, - filter: function (event, player) { - if (get.type2(event.card) != "trick") return false; - if ( - !player.hasHistory("lose", function (evt) { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("twqirang")) return true; - } - return false; - }) - ) - return false; - return true; - }, - content: function () { - "step 0"; - game.log(trigger.card, "不可被响应"); - trigger.directHit.addArray(game.players); - var info = get.info(trigger.card); - if (info.allowMultiple == false) event.finish(); - else if (trigger.targets) { - if ( - !info.multitarget && - !game.hasPlayer(function (current) { - return ( - !trigger.targets.includes(current) && - lib.filter.targetEnabled2(trigger.card, player, current) - ); - }) - ) - event.finish(); - } else event.finish(); - "step 1"; - var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; - player - .chooseTarget(get.prompt("twqirang"), function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return true; - return lib.filter.targetEnabled2(_status.event.card, player, target); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return ( - get.effect(target, trigger.card, player, player) * - (_status.event.targets.includes(target) ? -1 : 1) - ); - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 2"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else event.finish(); - "step 3"; - if (event.targets) { - player.line(event.targets); - if (trigger.targets.includes(event.targets[0])) - trigger.targets.removeArray(event.targets); - else trigger.targets.addArray(event.targets); - } - }, - mod: { - targetInRange: function (card, player, target) { - if (!card.cards) return; - for (var i of card.cards) { - if (i.hasGaintag("twqirang")) return true; - } - }, - }, - }, - }, - }, - twyuhua: { - audio: "yuhua", - frequent: true, - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter: function (event, player) { - if (player == _status.currentPhase) return false; - if (event.name == "gain" && player == event.player) return false; - var evt = event.getl(player); - if (!evt || !evt.cards2 || !evt.cards2.length) return false; - for (var i of evt.cards2) { - if (get.type(i, player) != "basic") return true; - } - return false; - }, - content: function () { - "step 0"; - var num = 0, - evt = trigger.getl(player); - for (var i of evt.cards2) { - if (get.type(i, player) != "basic" && num < 5) num++; - } - player.chooseToGuanxing(num); - player - .chooseBool("羽化:是否摸" + get.cnNumber(num) + "张牌?") - .set("frequentSkill", "twyuhua"); - event.num = num; - "step 1"; - if (result.bool) player.draw(num); - }, - mod: { - ignoredHandcard: function (card, player) { - if (get.type(card) != "basic") return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && get.type(card) != "basic") return false; - }, - }, - }, - //樊稠 - twxingluan: { - audio: "xinfu_xingluan", - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - content: function () { - "step 0"; - event.cards = game.cardsGotoOrdering(get.cards(6)).cards; - event.list = []; - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (player, id, cards) { - var str; - if (player == game.me && !_status.auto) str = "兴乱:选择分配一种类别的牌"; - else 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 = ["basic", "trick", "equip"].filter((type) => - cards.some((card) => get.type2(card) == type) - ); - let fs = game - .filterPlayer((i) => get.attitude(_status.event.player, i) > 0) - .sort((a, b) => { - if (a === player) { - //尽量把player往前放 - if (a.hp < b.hp) return 1; - return -1; - } - if (b === player) { - if (b.hp < a.hp) return -1; - return 1; - } - return b.hp - a.hp; - }), - es = game - .filterPlayer((i) => get.attitude(_status.event.player, i) < 0) - .sort((a, b) => a.hp - b.hp), - types = list - .map((type) => { - let num = 0; - for (let i of event.cards) { - if (get.type2(i) == type) num++; - } - return [type, num]; - }) - .sort((a, b) => b[1] - a[1]); - event.tempCache = { - max: -Infinity, - tars: [], - }; - for (let idx = 0; idx < types.length; idx++) { - let f, - e, - temp = 0, - tars = [], - type = types[idx][1]; - if (es.length * 3 >= type) { - //都分给敌人 - e = -type; - while (temp < es.length && temp < type) { - e += 10 / (2 + es[temp].hp); - tars.push(es[temp]); - temp++; - } - if (e > event.tempCache.max) { - event.tempCache.type = types[idx][0]; - event.tempCache.max = e; - event.tempCache.tars = tars.slice(0); - delete event.tempCache.more; - } - } - if (fs.length * 3 >= type) { - //都分给队友 - tars = []; - f = type - 10 / (2 + fs[0].hp); - temp = type - Math.max(3, type); //让血厚的尽可能多拿 - if (temp) { - if (fs.length < 3) { - tars.push(fs[1]); - if (temp >= 3) f -= 10 / (2 + fs[1].hp); - } else { - if (player !== fs[0]) { - tars.push(player); - temp -= Math.max(2, temp); - } - if (temp) - tars.addArray( - fs - .filter((i) => fs[0] !== i && player !== i) - .sort((a, b) => { - return ( - get.attitude(_status.event.player, b) - - get.attitude(_status.event.player, a) - ); - }) - .slice(temp < 3 ? -1 : -2) - ); - } - } - if (f > event.tempCache.max) { - event.tempCache.type = types[idx][0]; - event.tempCache.max = f; - event.tempCache.more = fs[0]; - event.tempCache.tars = tars.slice(0); - } - } - } - player - .chooseControl(list) - .set("ai", function () { - return _status.event.type; - }) - .set("type", event.tempCache.type); - "step 2"; - game.broadcastAll("closeDialog", event.videoId); - event.cardsx = []; - var type = result.control; - for (var j of cards) { - if (type == get.type2(j)) event.cardsx.push(j); - } - var time = 1000 - (get.utc() - event.time); - if (time > 0) game.delay(0, time); - player.$gain2(event.cardsx, false); - game.delayx(); - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - event.num = 0; - "step 3"; - if (event.cardsx.length > 1) { - player - .chooseCardButton("兴乱:请选择要分配的牌", true, event.cardsx, [ - 1, - Math.min(3, event.cardsx.length), - ]) - .set("ai", function (button) { - if (ui.selected.buttons.length == 0) return get.buttonValue(button); - return 0; - }); - } else if (event.cardsx.length == 1) { - event._result = { links: event.cardsx.slice(0), bool: true }; - } else { - event.goto(6); - } - "step 4"; - if (result.bool) { - var cards = result.links; - event.togive = cards.slice(0); - player - .chooseTarget( - "选择获得" + get.translation(cards) + "的角色", - event.cardsx.length == 1, - (card, player, target) => { - var map = _status.event.getParent().given_map; - var togive = _status.event.getParent().togive; - return (map[target.playerid] || []).length + togive.length <= 3; - } - ) - .set("ai", function (target) { - let targets = _status.event.targets, - att = get.attitude(_status.event.player, target); - if (targets.length) { - if (targets.includes(target)) - return Math.max(1, att * _status.event.value); - return 0; - } - return att * _status.event.value; - }) - .set( - "value", - cards.reduce((p, c) => p + get.value(c, player, "raw"), 0) - ) - .set("more", event.tempCache.more) - .set( - "targets", - (function () { - let arr = [], - arr2 = []; - if ( - event.tempCache.more && - (event.given_map[event.tempCache.more.playerid] || []).length + - cards.length <= - 3 - ) - return [event.tempCache.more]; - for (let cur of event.tempCache.tars) { - let map = (event.given_map[cur.playerid] || []).length; - if (map + cards.length <= 3) { - if (map) arr2.push(cur); - else arr.push(cur); - } - } - if (arr.length) return arr; - return arr2; - })() - ); - } - "step 5"; - if (result.bool) { - event.cardsx.removeArray(event.togive); - if (result.targets.length) { - var id = result.targets[0].playerid, - map = event.given_map; - if (!map[id]) map[id] = []; - map[id].addArray(event.togive); - } - if (event.cardsx.length > 0) event.goto(3); - } else event.goto(3); - "step 6"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - var list = []; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - if (player == source) event.num += event.given_map[i].length; - player.line(source, "green"); - game.log(source, "获得了", event.given_map[i]); - list.push([source, event.given_map[i]]); - } - game.loseAsync({ - gain_list: list, - giver: player, - animate: "gain2", - }).setContent("gaincardMultiple"); - "step 7"; - var list = []; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - if (event.given_map[i].length >= num) list.push(source); - } - list.sortBySeat(); - player.line(list); - for (var i of list) { - i.loseHp(); - } - }, - }, - //许靖 - twboming: { - audio: "boming", - enable: "phaseUse", - usable: 2, - filter: function (event, player) { - return player.countCards("he"); - }, - filterCard: true, - position: "he", - filterTarget: lib.filter.notMe, - discard: false, - lose: false, - delay: false, - content: function () { - player.give(cards, target); - }, - check: function (card) { - return 5 - get.value(card); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - if (!ui.selected.cards.length) return 0; - var card = ui.selected.cards[0]; - if (get.attitude(player, target) < 0 && player.hasSkill("twejian")) { - var dam = get.damageEffect(target, player, target); - if (dam > 0) return dam; - var type = get.type(card, target), - ts = target.getCards("he", function (card) { - return get.type(card) == type; - }); - if (ts.length) { - var val = get.value(ts, target); - if (val > get.value(card)) return -Math.max(1, val); - return 0; - } - } - return get.value(card, target) / 1.5; - }, - }, - }, - group: "twboming_draw", - subSkill: { - draw: { - audio: "boming", - trigger: { player: "phaseJieshuBegin" }, - forced: true, - locked: false, - filter: function (event, player) { - var num = 0; - for (var target of game.filterPlayer((i) => i != player)) { - target.getHistory("gain", (evt) => (num += evt.cards.length)); - if (num > 1) return true; - } - return false; - }, - content: function () { - player.draw(2); - }, - }, - }, - }, - twejian: { - audio: "ejian", - trigger: { - global: ["gainAfter", "loseAsyncAfter"], - }, - filter: function (event, player) { - if (event.name == "gain") { - var cards = event.getg(event.player); - if (!cards.length) return false; - var cards2 = event.getl(player).cards2; - for (var i of cards2) { - if ( - cards.includes(i) && - event.player.countCards("he", (card) => { - return card != i && get.type2(card) == get.type2(i); - }) - ) - return true; - } - return false; - } else { - if (event.type != "gain") return false; - var cards = event.getl(player).cards2; - if (!cards.length) return false; - return game.hasPlayer((current) => { - if (current == player) return false; - var cardsx = event.getg(current); - for (var i of cardsx) { - if ( - cards.includes(i) && - current.countCards("he", (card) => { - return card != i && get.type2(card) == get.type2(i); - }) - ) - return true; - } - return false; - }); - } - }, - logTarget: function (event, player) { - if (event.name == "gain") return event.player; - else { - var cards = event.getl(player).cards2; - return game.filterPlayer((current) => { - if (current == player) return false; - var cardsx = event.getg(current); - for (var i of cardsx) { - if ( - cards.includes(i) && - current.countCards("he", (card) => { - return card != i && get.type2(card) == get.type2(i); - }) - ) - return true; - } - return false; - }); - } - }, - direct: true, - content: function () { - "step 0"; - if (trigger.name == "gain") event.targets = [trigger.player]; - else { - var cards = trigger.getl(player).cards2; - event.targets = game.filterPlayer((current) => { - if (current == player) return false; - var cardsx = trigger.getg(current); - for (var i of cardsx) { - if ( - cards.includes(i) && - current.countCards("he", (card) => { - return card != i && get.type2(card) == get.type2(i); - }) - ) - return true; - } - return false; - }); - } - "step 1"; - var target = event.targets.shift(); - event.target = target; - player - .chooseBool( - get.prompt("twejian", target), - "当其他角色得到你的牌后,若其有其他与此牌类型相同的牌,你可以令其选择一项:1.受到你造成的1点伤害;2.弃置这些牌" - ) - .set("ai", () => { - return get.attitude(player, _status.event.getParent().target) < 0; - }); - "step 2"; - if (result.bool) { - player.logSkill("twejian", target); - var cards = trigger.getg(target); - event.cards = cards; - event.cardType = []; - for (var card of cards) { - event.cardType.add(get.type(card, "trick", target)); - } - var list = ["选项一", "选项二"]; - target - .chooseControl(list) - .set("prompt", "恶荐:请选择一项") - .set("choiceList", [ - "受到1点伤害", - "弃置所有除" + - get.translation(cards) + - "外的" + - get.translation(event.cardType) + - "牌", - ]) - .set("ai", function () { - var player = _status.event.player; - var types = _status.event.cardType, - cards = player.getCards("he", function (card) { - return types.includes(get.type2(card)); - }); - if (cards.length == 1) return "选项二"; - if (cards.length >= 2) { - for (var i = 0; i < cards.length; i++) { - if (get.tag(cards[i], "save")) return "选项一"; - } - } - if (player.hp == 1) return "选项二"; - for (var i = 0; i < cards.length; i++) { - if (get.value(cards[i]) >= 8) return "选项一"; - } - if (cards.length > 2 && player.hp > 2) return "选项一"; - if (cards.length > 3) return "选项一"; - return "选项二"; - }) - .set("cardType", event.cardType); - } else event.goto(4); - "step 3"; - if (result.control == "选项一") target.damage(); - else - target.discard( - target.getCards("he", (card) => { - return event.cardType.includes(get.type2(card)) && !cards.includes(card); - }) - ); - "step 4"; - if (event.targets.length > 0) event.goto(1); - else event.finish(); - }, - ai: { - expose: 0.3, - }, - }, - //张飞 - twxuhe: { - audio: "retishen", - trigger: { player: "shaMiss" }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - logTarget: "target", - content: function () { - "step 0"; - trigger.target - .chooseControl() - .set("choiceList", [ - "受到" + get.translation(player) + "对你造成的1点伤害", - "令" + get.translation(player) + "使用的下一张牌对你造成的伤害+2", - ]) - .set("ai", function () { - var target = _status.event.player, - player = _status.event.getParent().player; - if ( - target.hp <= 3 && - target.hp > 1 && - player.countCards("hs", function (card) { - return get.tag(card, "damage") && player.canUse(card, target); - }) > 0 - ) - return 0; - return 1; - }); - "step 1"; - var target = trigger.target; - switch (result.index) { - case 0: - player.line(target, "fire"); - target.damage(); - break; - case 1: - target.line(player, "fire"); - player.storage.twxuhe_damage = target; - trigger.getParent().twxuhe = true; - player.addTempSkill("twxuhe_damage"); - break; - } - }, - subSkill: { - damage: { - charlotte: true, - onremove: true, - mark: true, - intro: { content: "本回合使用的下一张牌对$造成伤害时,此伤害+2" }, - trigger: { - source: "damageBegin1", - player: "useCardAfter", - }, - direct: true, - filter: function (event, player) { - if (event.name == "useCard") return !event.twxuhe; - if (!event.card) return false; - var evt = event.getParent(2); - var history = player.getHistory("useCard"); - return evt.name == "useCard" && history[history.indexOf(evt) - 1].twxuhe; - }, - content: function () { - if (trigger.name != "useCard") trigger.num += 2; - player.removeSkill("twxuhe_damage"); - }, - }, - }, - }, - //薛综 - twjiexun: { - intro: { content: "已发动#次" }, - audio: "jiexun", - trigger: { player: "phaseJieshuBegin" }, - onremove: true, - direct: true, - derivation: ["twfunanx", "twjiexunx"], - content: function () { - "step 0"; - var suits = {}; - game.countPlayer((current) => { - for (var card of current.getCards("ej")) { - if (typeof suits[get.suit(card)] != "number") suits[get.suit(card)] = 0; - suits[get.suit(card)]++; - } - }); - var choices = lib.suit.slice(); - choices.push("cancel2"); - var str = lib.suit - .map((suit) => { - return get.translation(suit) + ":" + get.cnNumber(suits[suit] || 0) + "张"; - }) - .join(";"); - player - .chooseControl(choices) - .set( - "prompt", - get.prompt("twjiexun") + - "(已发动过" + - get.cnNumber(player.countMark("twjiexun")) + - "次)" - ) - .set("ai", function () { - var player = _status.event.player; - var map = {}; - game.countPlayer((current) => { - for (var card of current.getCards("ej")) { - if (typeof map[get.suit(card)] != "number") map[get.suit(card)] = 0; - map[get.suit(card)]++; - } - }); - for (var suit in map) map[suit] = Math.abs(map[suit]); - var bool = game.hasPlayer( - (current) => get.attitude(player, current) > 0 && player != current - ); - var list = lib.suit - .slice() - .sort((a, b) => (bool ? 1 : -1) * ((map[b] || 0) - (map[a] || 0))); - if ((bool && map[list[0]] > 0) || !bool || player.hasMark("twjiexun")) - return list[0]; - return "cancel2"; - }) - .set("prompt2", get.skillInfoTranslation("twjiexun", player) + "
    " + str); - "step 1"; - if (result.control != "cancel2") { - var suit = result.control; - event.suit = suit; - var num1 = game.countPlayer(function (current) { - return current.countCards("ej", { suit: suit }); - }); - var num2 = player.countMark("twjiexun"); - event.num1 = num1; - event.num2 = num2; - var str = "令一名其他角色摸" + get.cnNumber(num1) + "张牌"; - if (num2) str += ",然后弃置" + get.cnNumber(num2) + "张牌"; - player - .chooseTarget("请选择【诫训】的目标", str, lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - return _status.event.eff * get.sgn(att) + att / 114514; - }) - .set("eff", num1 >= num2 && num1 > 0 ? 1 : -1); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twjiexun", target); - if (player.hasMark("twjiexun") || event.num1) player.addExpose(0.2); - player.popup(event.suit); - game.log(player, "选择了", "#y" + get.translation(event.suit)); - player.addMark("twjiexun", 1, false); - if (event.num1) target.draw(event.num1); - } else event.finish(); - "step 3"; - if (event.num2) target.chooseToDiscard(event.num2, true, "he"); - else event.finish(); - "step 4"; - if ( - result.bool && - result.autochoose && - result.cards.length == result.rawcards.length && - !player.hasSkill("funan_jiexun") - ) { - player - .chooseControl() - .set("choiceList", [ - "摸" + get.cnNumber(event.num2) + "张牌,将【诫训】的发动次数归零", - "修改【复难】和【诫训】", - ]) - .set("ai", () => _status.event.choice) - .set("prompt", "诫训:选择一项") - .set("choice", event.num2 >= 4 ? 0 : event.num2 <= 1 ? 1 : [0, 1].randomGet()); - } else event.finish(); - "step 5"; - if (result.index == 0) { - player.draw(event.num2); - player.removeMark("twjiexun", player.countMark("twjiexun"), false); - game.log(player, "归零了", "#g【诫训】", "的发动次数"); - } else { - game.log(player, "修改了", "#g【复难】", "和", "#g【诫训】"); - player.addSkill("funan_jiexun"); - } - }, - }, - //张宁 - twxingzhui: { - audio: 2, - enable: "phaseUse", - usable: 1, - mahouSkill: true, - filter: function (event, player) { - return !player.hasSkill("twxingzhui_mahou"); - }, - content: function () { - "step 0"; - player.loseHp(); - player - .chooseControl("1回合", "2回合", "3回合") - .set("prompt", "请选择施法时长") - .set("ai", function () { - return 2; - }); - "step 1"; - player.storage.twxingzhui_mahou = [result.index + 1, result.index + 1]; - player.addTempSkill("twxingzhui_mahou", { player: "die" }); - }, - ai: { - order: 2, - result: { - player: function (player, target) { - if (!player.hasFriend()) return 0; - if (player.hp > 1) return 1; - return 0; - }, - }, - }, - subSkill: { - mahou: { - trigger: { global: "phaseEnd" }, - forced: true, - popup: false, - charlotte: true, - content: function () { - "step 0"; - var list = player.storage.twxingzhui_mahou; - list[1]--; - if (list[1] == 0) { - game.log(player, "的", "#g星坠", "魔法生效"); - player.logSkill("twxingzhui"); - var num = list[0]; - event.num = num; - var cards = game.cardsGotoOrdering(get.cards(num * 2)).cards; - event.cards = cards; - player.showCards(cards, get.translation(player) + "发动了【星坠】"); - player.removeSkill("twxingzhui_mahou"); - } else { - game.log(player, "的", "#g星坠", "魔法剩余", "#g" + list[1] + "回合"); - player.markSkill("twxingzhui_mahou"); - event.finish(); - } - "step 1"; - var cards2 = []; - for (var card of event.cards) { - if (get.color(card, false) == "black") cards2.push(card); - } - if (!cards2.length) event.finish(); - else { - event.cards2 = cards2; - var str = "令一名其他角色获得其中的黑色牌(" + get.translation(cards2) + ")"; - if (cards2.length >= event.num) - str += ",然后对其造成" + get.cnNumber(event.num) + "点伤害"; - player - .chooseTarget("请选择〖星坠〗的目标", str, lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player; - if ( - _status.event.getParent().cards2.length >= - _status.event.getParent().num - ) - return get.damageEffect(target, player, player, "thunder"); - return get.attitude(player, target); - }); - } - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - target.gain(event.cards2, "gain2"); - if (event.cards2.length >= num) target.damage(event.num, "thunder"); - } - }, - mark: true, - onremove: true, - marktext: "♗", - intro: { - name: "施法:星坠", - markcount: function (storage) { - if (storage) return storage[1]; - return 0; - }, - content: function (storage) { - if (storage) - return ( - "经过" + - storage[1] + - "个“回合结束时”后,亮出牌堆顶的" + - get.cnNumber(storage[0] * 2) + - "张牌并执行后续效果" - ); - return "未指定施法效果"; - }, - }, - }, - }, - }, - twjuchen: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return ( - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > player.countCards("h"); - }) && - game.hasPlayer(function (current) { - return current != player && current.hp > player.hp; - }) - ); - }, - logTarget: function (event, player) { - return game.players.sortBySeat(player); - }, - content: function () { - "step 0"; - event.num = 0; - event.cards = []; - event.targets = game.players.sortBySeat(player); - "step 1"; - var target = targets[num]; - if (target.countCards("he")) target.chooseToDiscard("he", true); - else event._result = { bool: false }; - "step 2"; - if (result.bool && Array.isArray(result.cards)) event.cards.addArray(result.cards); - event.num++; - if (event.num < targets.length) event.goto(1); - else game.delayx(); - "step 3"; - var cards = cards.filter(function (i) { - return get.position(i, true) == "d" && get.color(i, false) == "red"; - }); - if (cards.length) player.gain(cards, "gain2"); - }, - }, - //于夫罗 - twjiekuang: { - audio: 2, - trigger: { global: "useCardToTargeted" }, - filter: function (event, player) { - if (!event.target || event.targets.length > 1) return false; - if (_status.dying.length) return false; - if (player == event.player) return false; - if (event.target.hp >= player.hp) return false; - if (!["basic", "trick"].includes(get.type(event.card))) return false; - return true; - }, - usable: 1, - direct: true, - content: function () { - "step 0"; - player - .chooseControl("失去体力", "减体力上限", "cancel2") - .set("prompt", get.prompt2("twjiekuang", trigger.target)) - .set("ai", function (card) { - if (_status.event.aisave) { - if (player.isDamaged()) return "减体力上限"; - return "失去体力"; - } - return "cancel2"; - }) - .set( - "aisave", - (function () { - var save = false; - if (get.attitude(player, trigger.target) > 2) { - if (trigger.card.name == "sha") { - if ( - player.countCards("h", "shan") || - player.getEquip(2) || - trigger.target.hp == 1 || - player.hp > trigger.target.hp + 1 - ) { - if ( - !trigger.target.countCards("h", "shan") || - trigger.target.countCards("h") < player.countCards("h") - ) { - save = true; - } - } - } else if (trigger.card.name == "juedou" && trigger.target.hp == 1) { - save = true; - } else if ( - trigger.card.name == "shunshou" && - get.attitude(player, trigger.player) < 0 && - get.attitude(trigger.player, trigger.target) < 0 - ) { - save = true; - } - } - return save; - })() - ); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("twjiekuang", trigger.target); - player[result.control == "失去体力" ? "loseHp" : "loseMaxHp"](); - player.addTempSkill("twjiekuang_after"); - trigger.getParent().twjiekuang = true; - trigger.getParent().targets.remove(trigger.target); - trigger.getParent().triggeredTargets4.remove(trigger.target); - trigger.getParent().targets.push(player); - trigger.untrigger(); - game.delayx(); - trigger.player.line(player); - } else player.storage.counttrigger.twjiekuang--; - }, - subSkill: { - after: { - charlotte: true, - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return event.twjiekuang; - }, - direct: true, - content: function () { - player.removeSkill("twjiekuang_after"); - var card = get.autoViewAs({ - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - }); - if ( - !game.countPlayer2((current) => { - return current.hasHistory("damage", (evt) => evt.card == trigger.card); - }) && - player.canUse(card, trigger.player, false) - ) { - player.useCard(card, trigger.player, false); - } - }, - }, - }, - }, - twneirao: { - audio: 2, - derivation: "twluanlve", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return Math.max(0, player.hp) + player.maxHp <= 9; - }, - content: function () { - "step 0"; - player.awakenSkill("twneirao"); - player.removeSkills("twjiekuang"); - "step 1"; - var num = player.countCards("he"), - cards = []; - player.discard(player.getCards("he")); - for (var i = 0; i < num; i++) { - var card = get.cardPile(function (card) { - return card.name == "sha" && !cards.includes(card); - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - "step 2"; - player.addSkills("twluanlve"); - }, - }, - twluanlve: { - audio: 2, - enable: "phaseUse", - onremove: true, - locked: false, - viewAs: { - name: "shunshou", - storage: { twluanlve: true }, - }, - viewAsFilter: function (player) { - return ( - player.isPhaseUsing() && - player.countCards("hs", { name: "sha" }) >= player.countMark("twluanlve") - ); - }, - filterCard: function (card, player) { - if (player.countMark("twluanlve") == 0) return false; - return card.name == "sha"; - }, - selectCard: function () { - var player = _status.event.player; - if (player.countMark("twluanlve") == 0) return -1; - return player.countMark("twluanlve"); - }, - onChooseToUse: function (event) { - if (!game.online && event.type == "phase") { - var targets = []; - game.countPlayer2((current) => { - var history = current.getHistory("useCard"); - if (!history.length) return false; - for (var evt of history) { - if (evt.card && evt.card.name == "shunshou") { - targets.addArray(evt.targets); - } - } - }); - event.set("twluanlve_ban", targets); - } - }, - position: "hs", - log: false, - group: ["twluanlve_directHit"], - precontent: function () { - player.logSkill("twluanlve"); - player.addMark("twluanlve", 1, false); - }, - ai: { - order: function () { - return get.order({ name: "shunshou" }) + 1; - }, - }, - mod: { - playerEnabled: function (card, player, target) { - if (!_status.event.twluanlve_ban || !Array.isArray(_status.event.twluanlve_ban)) - return; - if ( - player.isPhaseUsing() && - card.name == "shunshou" && - card.storage && - card.storage.twluanlve && - _status.event.twluanlve_ban.includes(target) - ) - return false; - }, - }, - subSkill: { - directHit: { - trigger: { player: "useCard" }, - filter: function (event, player) { - return event.card.name == "shunshou"; - }, - direct: true, - content: function () { - trigger.directHit.addArray(game.players); - game.log(trigger.card, "不可被响应"); - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return arg && arg.card && arg.card.name == "shunshou"; - }, - }, - }, - }, - }, - //冯习 - twqingkou: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return player.canUse("juedou", current, false); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("twqingkou"), - "视为对一名其他角色使用一张【决斗】", - function (card, player, target) { - return player.canUse("juedou", target, false); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "juedou" }, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twqingkou", target); - player.useCard( - { name: "juedou", isCard: true, storage: { twqingkou: true } }, - target, - false - ); - player.addTempSkill("twqingkou_after"); - } - }, - subSkill: { - after: { - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return event.card.storage && event.card.storage.twqingkou; - }, - charlotte: true, - direct: true, - content: function () { - var targets = game - .filterPlayer((current) => { - return current.hasHistory("sourceDamage", function (evt) { - return evt.card == trigger.card; - }); - }) - .sortBySeat(); - for (var target of targets) { - target.draw(); - if (target == player) { - player.skip("phaseJudge"); - game.log(player, "跳过了", "#y判定阶段"); - player.skip("phaseDiscard"); - game.log(player, "跳过了", "#y弃牌阶段"); - } - } - }, - }, - }, - }, - //张既 - twdingzhen: { - audio: 2, - trigger: { global: "roundStart" }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return get.distance(player, current) <= Math.max(0, player.hp); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt2("twdingzhen"), - [1, Infinity], - function (card, player, target) { - return get.distance(player, target) <= player.hp; - } - ) - .set("ai", function (target) { - var player = _status.event.player; - if (target == player) return 0; - return Math.max(-get.attitude(player, target), 1); - }); - "step 1"; - if (result.bool) { - result.targets.sortBySeat(); - var targets = result.targets; - event.targets = targets; - player.logSkill("twdingzhen", targets); - event.num = 0; - } else event.finish(); - "step 2"; - var target = targets[num]; - event.target = target; - target - .chooseToDiscard( - "h", - { name: "sha" }, - "定镇:弃置一张【杀】,或本轮你于回合内使用的第一张牌不能指定" + - get.translation(player) + - "为目标" - ) - .set("ai", function (card) { - if (_status.event.goon) return 1; - return 0; - }) - .set( - "goon", - get.attitude(target, player) < 0 && - player.countCards("hs") <= 3 && - target.countCards("hs", (card) => { - return target.hasValueTarget(card); - }) > 1 - ); - "step 3"; - if (result.bool) target.addExpose(0.1); - else { - target.addSkill("twdingzhen_target"); - target.markAuto("twdingzhen_target", [player]); - } - "step 4"; - if (event.num < event.targets.length - 1) { - event.num++; - event.goto(2); - } - }, - subSkill: { - target: { - charlotte: true, - onremove: true, - mark: true, - silent: true, - trigger: { global: "roundStart" }, - firstDo: true, - content: function () { - player.removeSkill("twdingzhen_target"); - }, - intro: { - markcount: () => 0, - content: "回合内使用的第一张牌不能指定$为目标", - }, - mod: { - playerEnabled: function (card, player, target) { - if ( - _status.currentPhase == player && - !player.countUsed() && - player.getStorage("twdingzhen_target").includes(target) - ) - return false; - }, - }, - }, - }, - }, - twyouye: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return ( - event.player != player && - !event.player.getHistory("sourceDamage", function (evt) { - return evt.player == player; - }).length && - player.getExpansions("twyouye").length < 5 - ); - }, - forced: true, - group: "twyouye_give", - content: function () { - player.addToExpansion(get.cards(), "gain2").gaintag.add("twyouye"); - }, - marktext: "蓄", - intro: { - name: "蓄(攸业)", - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - subSkill: { - give: { - audio: "twyouye", - trigger: { source: "damageSource", player: "damageEnd" }, - filter: function (event, player) { - return player.getExpansions("twyouye").length; - }, - forced: true, - content: function () { - "step 0"; - event.boolx = _status.currentPhase && _status.currentPhase.isIn(); - event.cards = player.getExpansions("twyouye"); - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - "step 1"; - if (event.cards.length > 1) { - player - .chooseCardButton("攸业:请选择要分配的牌", true, event.cards, [ - 1, - event.cards.length, - ]) - .set("ai", function (button) { - if (ui.selected.buttons.length) return 0; - return get.value(button.link, _status.event.player); - }); - } else if (event.cards.length == 1) - event._result = { links: event.cards.slice(0), bool: true }; - else event.finish(); - "step 2"; - if (result.bool) { - var cards = result.links; - event.cards2 = cards; - player - .chooseTarget( - "选择一名角色获得" + get.translation(cards), - function (card, player, target) { - var evt = _status.event.getParent(); - var cards = evt.cards, - cards2 = evt.cards2.slice(); - if (cards.removeArray(cards2).length > 0 || !evt.boolx) - return true; - return target == _status.currentPhase; - }, - event.cards.length == 1 - ) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (_status.event.enemy) return Math.max(0.01, 100 - att); - else if (att > 0) - return Math.max( - 0.1, - att / - (1 + - target.countCards("h") + - (_status.event.getParent().given_map[ - target.playerid - ] || 0)) - ); - else return Math.max(0.01, (100 + att) / 100); - }) - .set("enemy", get.value(cards[0], player, "raw") < 0); - } - "step 3"; - if (result.bool) { - var cards = event.cards2; - event.cards.removeArray(cards); - event.togive = cards.slice(0); - if (result.targets.length) { - if (result.targets[0] == _status.currentPhase) event.boolx = false; - var id = result.targets[0].playerid, - map = event.given_map; - if (!map[id]) map[id] = []; - map[id].addArray(event.togive); - } - if (event.cards.length > 0) event.goto(1); - } else event.goto(1); - "step 4"; - if (_status.connectMode) - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - var list = []; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - list.push([source, event.given_map[i]]); - game.log(source, "获得了", event.given_map[i]); - } - game.loseAsync({ - gain_list: list, - giver: player, - animate: "gain2", - }).setContent("gaincardMultiple"); - }, - }, - }, - }, - //荀谌 - twweipo: { - audio: "mjweipo", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("he"); - }); - }, - filterTarget: function (card, player, target) { - return target.countCards("he"); - }, - content: function () { - "step 0"; - target.chooseToDiscard("he", true); - "step 1"; - var list = ["binglinchengxiax"]; - list.addArray(get.zhinangs()); - player - .chooseButton(["危迫:令其获得一张智囊牌或【兵临城下】", [list, "vcard"]], true) - .set("ai", function (button) { - return _status.event.getParent().target.getUseValue({ name: button.link[2] }); - }); - "step 2"; - if (result.bool) { - var name = result.links[0][2], - card = false; - game.log(player, "选择了", "#y" + get.translation(name)); - if (name == "binglinchengxiax") { - if (!_status.binglinchengxiax) { - _status.binglinchengxiax = [ - ["spade", 7], - ["club", 7], - ["club", 13], - ]; - game.broadcastAll(function () { - lib.inpile.add("binglinchengxiax"); - }); - } - if (_status.binglinchengxiax.length) { - var info = _status.binglinchengxiax.randomRemove(); - card = game.createCard2("binglinchengxiax", info[0], info[1]); - } - } - if (!card) card = get.cardPile(name); - if (card) target.gain(card, "gain2"); - } - }, - ai: { - order: 7.1, - result: { - target: function (player, target) { - if (target == player) return player.countCards("he") ? 10 : 0.01; - return (target.countCards("he") + 0.5) * Math.sqrt(Math.max(1, target.hp)); - }, - }, - }, - }, - twmouzhi: { - audio: "mjmouzhi", - intro: { content: "上次受到伤害的颜色:$" }, - trigger: { player: "damageBegin4" }, - forced: true, - group: "twmouzhi_mark", - filter: function (event, player) { - if (!event.card || get.color(event.card) == "none") return false; - var all = player.getAllHistory("damage"); - if (!all.length) return false; - return ( - all[all.length - 1].card && - get.color(all[all.length - 1].card) == get.color(event.card) - ); - }, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: (card, player, target) => { - if (typeof card === "object" && get.tag(card, "damage")) { - let color = get.color(card); - if (color === "none") return; - let all = target.getAllHistory("damage"); - if (!all.length || !all[all.length - 1].card) return; - if (get.color(all[all.length - 1].card) === color) return "zeroplayertarget"; - } - }, - }, - }, - subSkill: { - mark: { - trigger: { player: "damage" }, - silent: true, - firstDo: true, - content: function () { - if (!trigger.card || get.color(trigger.card) == "none") - player.unmarkSkill("twmouzhi"); - else { - player.markSkill("twmouzhi"); - player.storage.twmouzhi = get.color(trigger.card); - game.broadcastAll( - function (player, color) { - if (player.marks.twmouzhi) { - player.marks.twmouzhi.firstChild.innerHTML = - ""; - } - player.storage.twmouzhi = color; - }, - player, - player.storage.twmouzhi - ); - } - }, - }, - }, - }, - //蒋钦 - twshangyi: { - audio: "shangyi", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.countCards("he") && - game.hasPlayer(function (current) { - return current != player && current.countCards("h"); - }) - ); - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h"); - }, - filterCard: true, - position: "he", - content: function () { - "step 0"; - target.viewHandcards(player); - var chooseButton; - if (player.countCards("h")) - chooseButton = player.chooseButton( - [1, 2], - [ - '###尚义###
    选择' + - get.translation(target) + - "的一张手牌以弃置,或选择你与其的各一张牌以交换
    ", - '
    ' + get.translation(target) + "的手牌
    ", - target.getCards("h"), - '
    你的手牌
    ', - player.getCards("h"), - ], - true - ); - else - chooseButton = player.chooseButton( - [ - '###尚义###
    弃置' + - get.translation(target) + - "的一张手牌
    ", - '
    ' + get.translation(target) + "的手牌
    ", - target.getCards("h"), - ], - true - ); - chooseButton.set("target", target); - chooseButton.set("ai", function (button) { - var player = _status.event.player, - owner = get.owner(button.link), - color = get.color(button.link, owner), - value = get.value(button.link, owner); - if (player.countCards("h")) { - if (!ui.selected.buttons.length) { - if ( - player.countCards("h", function (card) { - return get.color(card, player) == "red" && get.value(card) < 6; - }) && - color == "red" && - value > 7 - ) - return value * 3; - return value; - } else { - if (get.value(ui.selected.buttons[0].link) < 4) return 0; - return ( - 4 + - (get.color( - ui.selected.buttons[0].link, - get.owner(ui.selected.buttons[0].link) - ) == "red" - ? 3 - : 1) - - value - ); - } - } else { - if (color == "black") return value * 1.5; - return value; - } - }); - chooseButton.set("filterButton", function (button) { - if (get.itemtype(button.link) != "card") return false; - if (!ui.selected.buttons.length && get.owner(button.link) != _status.event.target) - return false; - if ( - ui.selected.buttons.length && - get.owner(ui.selected.buttons[0].link) == get.owner(button.link) - ) - return false; - return true; - }); - "step 1"; - if (result.bool) { - if (result.links.length == 1) { - target.discard(result.links[0]).discarder = player; - if (get.color(result.links[0], target) != "black") event.finish(); - } else { - var links = result.links.slice(); - if (get.owner(links[0]) != player) links.reverse(); - var card1 = links[0], - card2 = links[1]; - player.swapHandcards(target, [card1], [card2]); - if (get.color(card1, player) != "red" || get.color(card2, target) != "red") - event.finish(); - } - } else event.finish(); - "step 2"; - player.draw(); - }, - ai: { - order: 10, - result: { target: -1 }, - }, - }, - twxiangyu: { - group: "twxiangyu_lose", - shaRelated: true, - audio: "zniaoxiang", - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return ( - event.card.name == "sha" && - get.distance(player, event.player) < player.getAttackRange() - ); - }, - forced: true, - logTarget: "target", - init: function (player) { - var target = _status.currentPhase; - if (!target || !target != player) return; - if (!player.getStorage("twxiangyu_range").length) { - var targets = game.filterPlayer((current) => { - return current.getHistory("lose").length; - }); - if (targets.length) { - player.addTempSkill("twxiangyu_range"); - player.markAuto("twxiangyu_range", targets); - } - } - }, - content: function () { - var id = trigger.target.playerid; - var map = trigger.getParent().customArgs; - if (!map[id]) map[id] = {}; - if (typeof map[id].shanRequired == "number") { - map[id].shanRequired++; - } else map[id].shanRequired = 2; - }, - mod: { - attackRange: function (player, num) { - return num + Math.min(5, player.getStorage("twxiangyu_range").length); - }, - }, - subSkill: { - lose: { - trigger: { - global: [ - "loseAfter", - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter: function (event, player) { - return ( - player == _status.currentPhase && - game.hasPlayer(function (current) { - if (player.getStorage("twxiangyu_range").includes(current)) return false; - var evt = event.getl(current); - return evt && evt.cards2 && evt.cards2.length > 0; - }) - ); - }, - silent: true, - charlotte: true, - content: function () { - player.addTempSkill("twxiangyu_range"); - player.markAuto( - "twxiangyu_range", - game.filterPlayer(function (current) { - if (player.getStorage("twxiangyu_range").includes(current)) return false; - var evt = trigger.getl(current); - return evt && evt.cards2 && evt.cards2.length > 0; - }) - ); - player.syncStorage("twxiangyu_range"); - }, - }, - range: { - marktext: "羽", - intro: { - content: function (storage, player) { - var num = Math.min(5, storage ? storage.length : 0); - return "攻击范围+" + num; - }, - }, - charlotte: true, - onremove: true, - }, - }, - }, - //顾雍 - twgyshenxing: { - audio: "xinshenxing", - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("he") >= Math.min(2, player.countMark("twgyshenxing")); - }, - selectCard: function () { - return Math.min(2, _status.event.player.countMark("twgyshenxing")); - }, - prompt: function () { - return ( - "弃置" + - get.cnNumber(Math.min(2, _status.event.player.countMark("twgyshenxing"))) + - "张牌并摸一张牌" - ); - }, - check: function (card) { - var num = _status.event.player.countCards("h", { color: get.color(card) }); - if (get.position(card) == "e") num++; - return (Math.max(4, 7.1 - num) - get.value(card)) / num; - }, - filterCard: true, - position: "he", - content: function () { - player.draw(); - player.addMark("twgyshenxing", 1); - }, - marktext: "慎", - intro: { content: "已发动过#次" }, - ai: { - order: function (item, player) { - if (!player.hasMark("twgyshenxing")) return 10; - return 1; - }, - result: { player: 1 }, - }, - }, - twbingyi: { - audio: "bingyi_xin_guyong", - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.countCards("h"); - }, - filterx: function (event, player) { - var cards = player.getCards("h"); - if (cards.length == 1) return true; - var color = get.color(cards[0], player), - type = get.type2(cards[0], player); - for (var i = 1; i < cards.length; i++) { - if (color && get.color(cards[i], player) != color) color = false; - if (type && get.type2(cards[i], player) != type) type = false; - if (!color && !type) return false; - } - return true; - }, - filtery: function (event, player) { - var cards = player.getCards("h"); - if (player.countCards("h") <= 1) return false; - var color = get.color(cards[0], player), - type = get.type2(cards[0], player); - var colorx = true, - typex = true; - for (var i = 1; i < cards.length; i++) { - if (color && get.color(cards[i], player) != color) colorx = false; - if (type && get.type2(cards[i], player) != type) typex = false; - } - return colorx && typex; - }, - direct: true, - content: function () { - "step 0"; - event.boolx = false; - if (lib.skill.twbingyi.filtery(trigger, player)) event.boolx = true; - if (lib.skill.twbingyi.filterx(trigger, player)) { - player - .chooseTarget( - get.prompt("twbingyi"), - "选择至多" + - get.cnNumber(player.countCards("h")) + - "名角色,你展示所有手牌,这些角色各摸一张牌" + - (event.boolx ? ",然后你移去所有“慎”" : ""), - [0, player.countCards("h")] - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }).animate = false; - } else - player.chooseBool(get.prompt("twbingyi"), "展示所有手牌").ai = function () { - return false; - }; - "step 1"; - if (result.bool) { - player.logSkill("twbingyi"); - player.showHandcards(get.translation(player) + "发动了【秉壹】"); - event.targets = result.targets; - } else event.finish(); - "step 2"; - if (targets && targets.length) { - player.line(targets, "green"); - targets.sortBySeat(); - game.asyncDraw(targets); - } - "step 3"; - if (event.boolx) { - player.removeMark("twgyshenxing", player.countMark("twgyshenxing")); - } - }, - ai: { expose: 0.1 }, - }, - bingyi_xin_guyong: { audio: 2 }, - //陈武董袭 - twyilie: { - audio: "spyilie", - trigger: { player: "phaseUseBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseControl("选项一", "选项二", "背水!", "cancel2") - .set("choiceList", [ - "本阶段内使用【杀】的次数上限+1", - "本回合内使用【杀】指定处于连环状态的目标后,或使用【杀】被【闪】抵消时,摸一张牌", - "背水!失去1点体力并依次执行上述所有选项", - ]) - .set("ai", function () { - if ( - player.countCards("hs", function (card) { - return get.name(card) == "sha" && player.hasValueTarget(card); - }) > player.getCardUsable({ name: "sha" }) - ) { - return player.hp > 2 ? 2 : 0; - } - return 1; - }) - .set("prompt", get.prompt("twyilie")); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("twyilie"); - game.log(player, "选择了", "#g【毅烈】", "的", "#y" + result.control); - if (result.index % 2 == 0) player.addTempSkill("twyilie_add", "phaseUseEnd"); - if (result.index > 0) player.addTempSkill("twyilie_miss"); - if (result.index == 2) player.loseHp(); - } - }, - subSkill: { - add: { - charlotte: true, - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - mark: true, - intro: { content: "本阶段使用【杀】的次数上限+1" }, - }, - miss: { - charlotte: true, - audio: "spyilie", - trigger: { player: ["useCardToTargeted", "shaMiss"] }, - filter: function (event, player, name) { - if (name == "useCardToTargeted") - return event.card.name == "sha" && event.target.isLinked(); - return true; - }, - forced: true, - content: function () { - player.draw(); - }, - }, - }, - }, - twfenming: { - audio: "spfenming", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return game.hasPlayer(function (target) { - return target != player && (target.countCards("he") || !target.isLinked()); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twfenming"), function (card, player, target) { - return target != player && (target.countCards("he") || !target.isLinked()); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twfenming", target); - var list = [], - choiceList = [ - "令" + get.translation(target) + "弃置一张牌", - "令" + get.translation(target) + "横置", - "背水!横置并依次令" + get.translation(target) + "执行上述所有选项", - ]; - if (target.countCards("he")) list.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if (!target.isLinked()) list.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - if (target.countCards("he") && !target.isLinked() && !player.isLinked()) - list.push("背水!"); - else choiceList[2] = '' + choiceList[2] + ""; - if (list.length == 1) event._result = { control: list[0] }; - else - player - .chooseControl(list) - .set("choiceList", choiceList) - .set("ai", function () { - var list = _status.event.controls; - if (list.includes("背水!")) return "背水!"; - if (list.includes("选项一")) return "选项一"; - return "选项二"; - }) - .set("prompt", "奋命:请选择一项"); - } else event.finish(); - "step 2"; - game.log(player, "选择了", "#y" + result.control); - if (result.control == "背水!" && !player.isLinked()) player.link(true); - if (result.control != "选项二") target.chooseToDiscard("he", true); - if (result.control != "选项一" && !target.isLinked()) target.link(true); - }, - }, - //韩当 - twgongji: { - audio: "regongji", - enable: "phaseUse", - usable: 1, - position: "he", - filterCard: true, - locked: false, - filter: function (event, player) { - return player.countCards("he"); - }, - check: function (card) { - var base = 0, - player = _status.event.player, - suit = get.suit(card, player), - added = false, - added2 = false, - added3; - if ( - get.type(card) == "equip" && - game.hasPlayer(function (target) { - var att = get.attitude(player, target); - if (att >= 0) return 0; - if ( - target.countCards("he", function (card) { - return get.value(card) > 5; - }) - ) - return -att; - }) - ) - base += 6; - var hs = player.getCards("h"); - var muniu = player.getEquip("muniu"); - if (muniu && card != muniu && muniu.cards) hs = hs.concat(muniu.cards); - for (var i of hs) { - if (i != card && get.name(i) == "sha") { - if (get.suit(i, player) == suit) { - if (player.hasValueTarget(i, false)) { - added3 = true; - base += 5.5; - } - } else { - if (player.hasValueTarget(i, false)) added2 = true; - if ( - !added && - !player.hasValueTarget(i, null, true) && - player.hasValueTarget(i, false, true) - ) { - base += 4; - added = true; - } - } - } - } - if (added3 && !added2) base -= 4.5; - return base - get.value(card); - }, - content: function () { - "step 0"; - player.addTempSkill("twgongji2"); - player.markAuto("twgongji2", [get.suit(cards[0], player)]); - "step 1"; - if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") { - player - .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) { - return player != target && target.countCards("he"); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy2" }, player, player); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - player.line(result.targets, "green"); - player.discardPlayerCard(result.targets[0], "he", true); - } - }, - mod: { - attackRangeBase: function () { - return Infinity; - }, - }, - ai: { - order: 4.5, - result: { player: 1 }, - }, - }, - twgongji2: { - charlotte: true, - onremove: true, - mark: true, - intro: { content: "使用$花色的杀无任何次数限制" }, - trigger: { player: "useCard1" }, - filter: function (event, player) { - if ( - _status.currentPhase == player && - event.card.name == "sha" && - player.getStorage("twgongji2").includes(get.suit(event.card)) && - event.addCount !== false - ) - return true; - return false; - }, - forced: true, - locked: false, - popup: false, - firstDo: true, - content: function () { - trigger.addCount = false; - if (player.stat[player.stat.length - 1].card.sha > 0) { - player.stat[player.stat.length - 1].card.sha--; - } - }, - mod: { - cardUsable: function (card, player) { - if (card.name == "sha") { - const suit = get.suit(card); - if (suit === "unsure" || player.getStorage("twgongji2").includes(suit)) return Infinity; - } - }, - aiOrder: function (player, card, num) { - if ( - get.name(card) == "sha" && - !player.getStorage("twgongji2").includes(get.suit(card)) - ) - return num + 1; - }, - }, - }, - twjiefan: { - skillAnimation: true, - animationColor: "wood", - audio: "jiefan_re_handang", - limited: true, - enable: "phaseUse", - filterTarget: true, - content: function () { - "step 0"; - player.awakenSkill("twjiefan"); - event.players = game.filterPlayer(function (current) { - return current != target && current.inRange(target); - }); - event.players.sortBySeat(); - "step 1"; - if (event.players.length) { - event.current = event.players.shift(); - event.current.addTempClass("target"); - player.line(event.current, "green"); - if (!event.current.countCards("he") || !target.isIn()) - event._result = { bool: false }; - else { - event.current - .chooseToDiscard( - { subtype: "equip1" }, - "he", - "解烦:弃置一张武器牌,或令" + get.translation(target) + "摸一张牌" - ) - .set("ai", function (card) { - if (!_status.event.target.isIn()) return 0; - if (get.attitude(_status.event.player, _status.event.target) < 0) - return 7 - get.value(card); - return -1; - }) - .set("target", target); - } - } else { - player.addSkill("twjiefan2"); - player.markAuto("twjiefan2", [target]); - event.finish(); - } - "step 2"; - if (!result.bool && target.isIn()) target.draw(); - event.goto(1); - }, - ai: { - order: 5, - result: { - target: function (player, target) { - if (player.hp > 2 && game.phaseNumber < game.players.length * 2) return 0; - var num = 0, - players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != target && players[i].inRange(target)) { - num++; - } - } - return num; - }, - }, - }, - }, - twjiefan2: { - charlotte: true, - onremove: true, - trigger: { global: "dying" }, - filter: function (event, player) { - return player.getStorage("twjiefan2").includes(event.player); - }, - forced: true, - popup: false, - content: function () { - player.removeSkill("twjiefan2"); - player.restoreSkill("twjiefan"); - }, - }, - jiefan_re_handang: { audio: 2 }, - //纪灵 - twshuangren: { - audio: "shuangren", - trigger: { player: "phaseUseBegin" }, - filter: function (event, player, name) { - if (!player.countCards("h")) return false; - if (name == "phaseUseEnd") - return !player.hasHistory("sourceDamage", function (evt) { - return evt.card.name == "sha" && event.getParent("phaseUse") == evt; - }); - return true; - }, - direct: true, - group: "twshuangren_end", - preHidden: true, - content: function () { - "step 0"; - var forced = - event.getParent(2).name == "twshuangren_end" && - game.hasPlayer((current) => { - return player.canCompare(current); - }); - var str = - "与一名角色拼点,若你:赢,你可以视为对至多两名至其的距离不大于1的角色使用一张【杀】;没赢,其可以视为对你使用一张【杀】"; - player - .chooseTarget( - forced ? "双刃:选择一名角色" : get.prompt("twshuangren"), - str, - forced, - (card, player, target) => { - return player.canCompare(target); - } - ) - .set("ai", (target) => { - if (_status.event.goon) - return get.effect(target, { name: "sha" }, _status.event.player); - return 0; - }) - .set( - "goon", - event.triggername != "phaseUseBegin" || - (player.countCards("hs", "sha") > 0 && player.hasValueTarget({ name: "sha" })) - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twshuangren", target); - if (player.canCompare(target)) player.chooseToCompare(target); - else event.finish(); - } else event.finish(); - "step 2"; - if (result.bool) { - event.sha = true; - player - .chooseTarget( - [1, 2], - "请选择【杀】的目标", - true, - function (card, player, target) { - if (!player.canUse("sha", target, false, false)) return false; - return get.distance(target, _status.event.targetx) <= 1; - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "sha" }, player, player); - }) - .set("targetx", target); - } else - target - .chooseBool("双刃:是否视为对" + get.translation(player) + "使用一张杀?") - .set("choice", get.effect(player, { name: "sha" }, target, target) > 0); - "step 3"; - if (result.bool) { - if (event.sha == true) { - result.targets.sortBySeat(); - for (var i of result.targets) { - player.useCard({ name: "sha", isCard: true }, i, false); - } - } else target.useCard({ name: "sha", isCard: true }, player, false); - } - }, - subSkill: { - end: { - audio: "shuangren", - trigger: { player: "phaseUseEnd" }, - filter: function (event, player, name) { - if (!player.countCards("h")) return false; - return ( - !player.hasHistory("useSkill", function (evt) { - return evt.skill == "twshuangren"; - }) && - !player.hasHistory("sourceDamage", function (evt) { - return evt.card && evt.card.name == "sha"; - }) - ); - }, - direct: true, - preHidden: true, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt("twshuangren"), "弃置一张牌发动〖双刃〗", "he") - .set("ai", function (card) { - if (_status.event.goon) return 5 - get.value(card); - return 0; - }) - .set( - "goon", - (function () { - return player.hasCard(function (card) { - if (player.needsToDiscard() > 1) - return card.number > 10 && get.value(card) <= 5; - return ( - (card.number >= 9 && get.value(card) <= 5) || - get.value(card) <= 3 - ); - }); - })() - ) - .setHiddenSkill("twshuangren") - .set("logSkill", "twshuangren"); - "step 1"; - if (result.bool) { - player.useSkill("twshuangren"); - } - }, - }, - }, - }, - //法正 - twxuanhuo: { - audio: "rexuanhuo", - trigger: { player: "phaseDrawEnd" }, - filter: function (event, player) { - return player.countCards("he") > 1 && game.countPlayer() > 2; - }, - direct: true, - content: function () { - "step 0"; - var ai2 = function (target) { - var player = _status.event.player; - if (get.attitude(player, target) <= 0) return 0; - var list = ["sha", "juedou"]; - var num = Math.max.apply( - Math, - list.map(function (i) { - return target.getUseValue({ name: i, isCard: true }, false); - }) - ); - if (target.hasSkillTag("nogain")) num /= 4; - return num; - }; - player.chooseCardTarget({ - prompt: get.prompt2("twxuanhuo"), - filterCard: true, - selectCard: 2, - position: "he", - filterTarget: lib.filter.notMe, - goon: game.hasPlayer(function (current) { - return current != player && ai2(player, current) > 0; - }), - ai1: function (card) { - if (!_status.event.goon) return 0; - return 7 - get.value(card); - }, - ai2: ai2, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twxuanhuo", target); - player.give(result.cards, target); - } else event.finish(); - "step 2"; - if ( - game.hasPlayer(function (current) { - return current != player && current != target; - }) - ) - player - .chooseTarget( - function (card, player, target) { - return target != player && target != _status.event.target; - }, - "选择" + get.translation(target) + "使用【杀】或【决斗】的目标", - true - ) - .set("target", target) - .set("ai", function (target) { - var evt = _status.event; - var list = ["sha", "juedou"]; - return Math.max.apply( - Math, - list.map(function (i) { - var card = { name: i, isCard: true }; - if (!evt.target.canUse(card, target, false)) return 0; - return get.effect(target, card, evt.target, evt.player); - }) - ); - }); - else event.finish(); - "step 3"; - var target2 = result.targets[0]; - event.target2 = target2; - player.line(target2); - var vcards = []; - if (target.canUse({ name: "sha", isCard: true }, target2, false)) - vcards.push(["基本", "", "sha"]); - if (target.canUse({ name: "juedou", isCard: true }, target2, false)) - vcards.push(["锦囊", "", "juedou"]); - if (!vcards.length) { - if (!target.countCards("h")) event.finish(); - else event._result = { index: 1 }; - } else if (!target.countCards("h")) { - event.vcards = vcards; - event._result = { index: 0 }; - } else { - event.vcards = vcards; - target - .chooseControl() - .set("choiceList", [ - "视为对" + get.translation(target2) + "使用一张【杀】或【决斗】", - "令" + get.translation(player) + "获得你的两张牌", - ]); - } - "step 4"; - if (result.index == 0) { - if (event.vcards.length == 1) event._result = { links: event.vcards, bool: true }; - else - target - .chooseButton( - [ - "请选择要对" + get.translation(event.target2) + "使用的牌", - [event.vcards, "vcard"], - ], - true - ) - .set("ai", function (button) { - var player = _status.event.player; - return get.effect( - _status.event.getParent().target2, - { name: button.link[2], isCard: true }, - player, - player - ); - }); - } else { - player.gainPlayerCard(target, 2, "he", true); - event.finish(); - } - "step 5"; - if (result.bool) - target.useCard({ name: result.links[0][2], isCard: true }, false, event.target2); - }, - ai: { - expose: 0.15, - }, - }, - twenyuan: { - audio: "reenyuan", - group: ["twenyuan1", "twenyuan2"], - }, - twenyuan1: { - audio: "reenyuan", - trigger: { - global: ["gainAfter", "loseAsyncAfter"], - }, - direct: true, - filter: function (event, player) { - var cards = event.getg(player); - if (!cards.length || cards.length < 2) return false; - return game.countPlayer((current) => { - if (current == player) return false; - var evt = event.getl(current); - if (evt && evt.cards && evt.cards.filter((card) => cards.includes(card)).length >= 2) - return true; - return false; - }); - }, - check: function (event, player) { - var cards = event.getg(player); - var target = game.filterPlayer((current) => { - if (current == player) return false; - var evt = event.getl(current); - if (evt && evt.cards && evt.cards.filter((card) => cards.includes(card)).length >= 2) - return true; - return false; - })[0]; - return get.attitude(player, target) > 0; - }, - logTarget: function (event, player) { - var cards = event.getg(player); - return game.filterPlayer((current) => { - if (current == player) return false; - var evt = event.getl(current); - if (evt && evt.cards && evt.cards.filter((card) => cards.includes(card)).length >= 2) - return true; - return false; - }); - }, - content: function () { - "step 0"; - var target = lib.skill.twenyuan1.logTarget(trigger, player)[0]; - event.target = target; - var list = ["摸一张牌"]; - var prompt2 = "令" + get.translation(target) + "摸一张牌"; - if ((!target.countCards("h") || !target.countCards("e")) && target.isDamaged()) { - list.push("回复1点体力"); - prompt2 += "或回复1点体力"; - } - list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", get.prompt("twenyuan", target)) - .set("prompt2", prompt2) - .set("ai", () => _status.event.choice) - .set( - "choice", - (function () { - if (get.attitude(player, target) > 0) { - if (target.hp <= 2 && list.includes("回复1点体力")) return "回复1点体力"; - return 0; - } - return "cancel2"; - })() - ); - "step 1"; - if (result.control == "cancel2") { - event.finish(); - return; - } - player.logSkill("twenyuan1", target); - if (result.control == "回复1点体力") target.recover(); - else target.draw(); - }, - }, - twenyuan2: { - audio: "reenyuan", - trigger: { player: "damageEnd" }, - logTarget: "source", - filter: function (event, player) { - return event.source && event.source.isIn(); - }, - check: function (event, player) { - var att = get.attitude(player, event.source); - var num = event.source.countCards("h"); - if (att <= 0) return true; - if (get.effect(event.source, { name: "losehp" }, player, event.source) > 0) return true; - if (num > 2) return true; - if (num) return att < 4; - return false; - }, - prompt2: "令其选择一项:1.失去1点体力;2.交给你一张手牌,若此牌的花色不为♥,你摸一张牌。", - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - var target = trigger.source; - event.count--; - if (!target.countCards("h")) event._result = { bool: false }; - else - target - .chooseCard( - "h", - "恩怨:将一张手牌交给" + get.translation(player) + ",或失去1点体力" - ) - .set("ai", function (card) { - if ( - get.attitude(_status.event.player, _status.event.getParent().player) > 0 - ) { - if (get.suit(card) != "heart") return 15 - get.value(card); - return 11 - get.value(card); - } else { - var num = 12 - _status.event.player.hp * 2; - if (get.suit(card) != "heart") num -= 2; - return num - get.value(card); - } - }); - "step 2"; - var target = trigger.source; - if (result.bool) { - var card = result.cards[0]; - event.card = card; - target.give(card, player); - } else { - target.loseHp(); - event.goto(4); - } - "step 3"; - if (get.suit(card) != "heart") player.draw(); - "step 4"; - var target = trigger.source; - if (target.isIn() && event.count > 0 && player.hasSkill("twenyuan")) - player - .chooseBool(get.prompt("twenyuan", target), lib.skill.twenyuan2.prompt2) - .set("ai", function () { - var evt = _status.event.getTrigger(); - return lib.skill.twenyuan2.check(evt, evt.player); - }); - else event.finish(); - "step 5"; - if (result.bool) { - player.logSkill("twenyuan2", trigger.source); - event.goto(1); - } - }, - }, - //马岱 - twqianxi: { - audio: "qianxi", - trigger: { player: "phaseZhunbeiBegin" }, - preHidden: true, - content: function () { - "step 0"; - player.draw(); - "step 1"; - if (player.hasCard((card) => lib.filter.cardDiscardable(card, player, "tweqianxi"), "he")) - player.chooseToDiscard("he", true); - else event.finish(); - "step 2"; - if ( - !result.bool || - !game.hasPlayer((target) => { - return player != target && get.distance(player, target) <= 1; - }) - ) { - event.finish(); - return; - } - event.color = get.color(result.cards[0], player); - player - .chooseTarget(function (card, player, target) { - return player != target && get.distance(player, target) <= 1; - }, true) - .set("ai", function (target) { - return ( - get.effect( - target, - { name: "sha" }, - _status.event.player, - _status.event.player - ) + 5 - ); - }); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - target.storage.twqianxi2 = event.color; - target.addTempSkill("twqianxi2"); - player.addTempSkill("twqianxi_self"); - player.markAuto("twqianxi_self", [target]); - } - }, - subSkill: { - self: { - audio: "qianxi", - charlotte: true, - onremove: true, - forced: true, - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.hasHistory("sourceDamage", (evt) => { - if (!evt.card || evt.card.name != "sha" || !evt.player.isIn()) return false; - if (player.getStorage("twqianxi_self").includes(evt.player)) return true; - return false; - }); - }, - content: function () { - "step 0"; - var targets = []; - player.getHistory("sourceDamage", (evt) => { - if (!evt.card || evt.card.name != "sha") return false; - if (player.getStorage("twqianxi_self").includes(evt.player)) { - targets.add(evt.player); - } - return false; - }); - player.line(targets); - for (var target of targets) { - target.storage.twqianxi3 = target.storage.twqianxi2; - target.addTempSkill("twqianxi3", { player: "phaseAfter" }); - } - }, - }, - }, - }, - twqianxi2: { - mark: true, - charlotte: true, - onremove: true, - intro: { - markcount: () => 0, - content: function (storage) { - return "不能使用或打出" + get.translation(storage) + "手牌"; - }, - }, - mod: { - cardEnabled2: function (card, player) { - if ( - get.itemtype(card) == "card" && - get.color(card) == player.getStorage("twqianxi2") && - get.position(card) == "h" - ) - return false; - }, - }, - }, - twqianxi3: { - mod: { - cardEnabled2: function (card, player) { - if ( - get.itemtype(card) == "card" && - get.color(card) != player.getStorage("twqianxi3") && - get.position(card) == "h" - ) - return false; - }, - }, - mark: true, - intro: { - content: function (storage) { - return "不能使用或打出非" + get.translation(storage) + "手牌"; - }, - }, - charlotte: true, - onremove: true, - }, - //牛金 - twcuorui: { - audio: "cuorui", - limited: true, - skillAnimation: true, - animationColor: "thunder", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("h") > player.countCards("h"); - }); - }, - check: function (event, player) { - var num = 0; - for (var target of game.players) { - if (target != player && target.countCards("h") > num) num = target.countCards("h"); - } - num = Math.min(num, 5 + player.countCards("h")); - return num - player.countCards("h") >= 2; - }, - prompt: function (event, player) { - var num = 0; - for (var target of game.players) { - if (target != player && target.countCards("h") > num) num = target.countCards("h"); - } - num = Math.min(num, 5 + player.countCards("h")); - return ( - get.prompt("twcuorui") + - "(可摸" + - get.cnNumber(num - player.countCards("h")) + - "张牌)" - ); - }, - content: function () { - "step 0"; - player.awakenSkill("twcuorui"); - var num = 0; - for (var target of game.players) { - if (target != player && target.countCards("h") > num) num = target.countCards("h"); - } - num = Math.min(num, 5 + player.countCards("h")); - player.drawTo(num); - if (!player.isDisabledJudge()) { - player.disableJudge(); - event.finish(); - } else - player - .chooseTarget("挫锐:是否对一名其他角色造成1点伤害?", lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - player.line(result.targets[0]); - result.targets[0].damage(); - } - }, - }, - twliewei: { - audio: "liewei", - trigger: { source: "dieAfter" }, - forced: true, - content: function () { - "step 0"; - if ( - !player.hasSkill("twcuorui", null, null, false) || - !player.awakenedSkills.includes("twcuorui") - ) - event._result = { index: 0 }; - else - player - .chooseControl() - .set("prompt", "裂围:请选择一项") - .set("choiceList", ["摸两张牌", "重置〖挫锐〗"]) - .set("ai", function () { - return 1; - }); - "step 1"; - if (result.index == 0) player.draw(2); - else player.restoreSkill("twcuorui"); - }, - }, - //母兵脸 - twzhengrong: { - audio: "drlt_zhenrong", - trigger: { player: "useCardAfter", source: "damageSource" }, - filter: function (event, player) { - if (!event.isPhaseUsing(player)) return false; - if (event.name == "damage") - return ( - player - .getHistory("sourceDamage", (evt) => { - return evt.getParent("phaseUse") == event.getParent("phaseUse"); - }) - .indexOf(event) == 0 - ); - if (!event.targets || event.targets.every((target) => target == player)) return false; - return ( - player - .getAllHistory("useCard", function (evt) { - if (!evt.isPhaseUsing(player)) return false; - if (evt.targets.every((target) => target == player)) return false; - return true; - }) - .indexOf(event) % - 2 == - 1 - ); - }, - direct: true, - content: function () { - "step 0"; - if ( - !game.hasPlayer(function (target) { - return target != player && target.countCards("he"); - }) - ) { - event.finish(); - return; - } - player - .chooseTarget( - get.prompt("twzhengrong"), - "将一名其他角色的一张牌置于武将牌上,称为“荣”", - function (card, player, target) { - return target != player && target.countCards("he"); - } - ) - .set("ai", function (target) { - return get.effect( - target, - { name: "guohe_copy2" }, - _status.event.player, - _status.event.player - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = result.targets[0]; - player.logSkill("twzhengrong", target); - player.choosePlayerCard(target, "he", true); - } else event.finish(); - "step 2"; - if (result.bool) - player.addToExpansion(result.links, target, "give").gaintag.add("twzhengrong"); - }, - marktext: "荣", - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - }, - twhongju: { - derivation: ["twqingce", "twsaotao"], - audio: "drlt_hongju", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return player.getExpansions("twzhengrong").length >= 3; - }, - content: function () { - "step 0"; - player.awakenSkill("twhongju"); - player.draw(player.getExpansions("twzhengrong").length); - "step 1"; - if (player.countCards("h") == 0) event.goto(3); - else { - var next = player.chooseToMove("鸿举:请选择要交换的手牌和“荣”"); - next.set("list", [ - [ - get.translation(player) + "(你)的“荣”", - player.getExpansions("twzhengrong"), - "twzhengrong_tag", - ], - ["手牌区", player.getCards("h")], - ]); - next.set("filterMove", function (from, to) { - return typeof to != "number"; - }); - next.set("processAI", function (list) { - var player = _status.event.player, - cards = list[0][1].concat(list[1][1]).sort(function (a, b) { - return player.getUseValue(a) - player.getUseValue(b); - }), - cards2 = cards.splice(0, player.getExpansions("twzhengrong").length); - return [cards2, cards]; - }); - } - "step 2"; - if (result.bool) { - var pushs = result.moved[0], - gains = result.moved[1]; - pushs.removeArray(player.getExpansions("twzhengrong")); - gains.removeArray(player.getCards("h")); - if (!pushs.length || pushs.length != gains.length) return; - player.addToExpansion(pushs, player, "giveAuto").gaintag.add("twzhengrong"); - game.log(player, "将", pushs, "作为“荣”置于武将牌上"); - player.gain(gains, "gain2"); - } - "step 3"; - player.addSkills("twqingce"); - player - .chooseBool("是否减1点体力上限并获得〖扫讨〗?") - .set("ai", () => _status.event.bool) - .set( - "bool", - player.isDamaged() && player.countCards("h") >= 3 - ? Math.random() < 0.5 - ? true - : false - : false - ); - "step 4"; - if (result.bool) { - player.loseMaxHp(); - player.addSkills("twsaotao"); - game.delayx(); - } - }, - ai: { - combo: "twzhengrong" - }, - }, - twqingce: { - enable: "phaseUse", - audio: "drlt_qingce", - filter: function (event, player) { - return player.getExpansions("twzhengrong").length > 0; - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog( - "清侧:请选择要移去的“荣”", - player.getExpansions("twzhengrong"), - "hidden" - ); - }, - backup: function (links, player) { - return { - card: links[0], - filterCard: function () { - return false; - }, - selectCard: -1, - filterTarget: function (card, player, target) { - return target.countDiscardableCards(player, "hej") > 0; - }, - delay: false, - audio: "drlt_qingce", - content: lib.skill.twqingce.contentx, - ai: { - result: { - target: function (player, target) { - return get.effect(target, { name: "guohe" }, player, target); - }, - }, - }, - }; - }, - prompt: () => "弃置一名角色区域内的一张牌", - }, - contentx: function () { - "step 0"; - var card = lib.skill.twqingce_backup.card; - player.loseToDiscardpile([card]); - "step 1"; - if (target.countDiscardableCards(player, "hej") > 0) - player.discardPlayerCard("hej", true, target); - }, - ai: { - combo: "twzhengrong", - order: 8, - result: { - player: function (player) { - if ( - game.hasPlayer(function (target) { - return ( - get.effect(target, { name: "guohe" }, player, player) > - 4 * Math.max(0, 5 - player.getExpansions("twzhengrong").length) - ); - }) - ) - return 1; - return 0; - }, - }, - }, - }, - twsaotao: { - audio: 2, - trigger: { player: "useCard" }, - filter: function (event, player) { - return event.card.name == "sha" || get.type(event.card) == "trick"; - }, - forced: true, - content: function () { - trigger.directHit.addArray(game.players); - }, - ai: { directHit_ai: true }, - }, - //大小乔 - twxingwu: { - audio: "xingwu", - trigger: { player: "phaseDiscardBegin" }, - filter: function (event, player) { - return player.countCards("he"); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseCard("he", get.prompt("twxingwu"), "将一张牌置于武将牌上作为“星舞”") - .set("ai", function (card) { - if (_status.event.goon) return 20 - get.value(card); - return 7 - get.value(card); - }) - .set("goon", player.needsToDiscard() || player.getExpansions("twxingwu").length > 1); - "step 1"; - if (result.bool) { - player.logSkill("twxingwu"); - var cards = result.cards; - player.addToExpansion(cards, player, "give").gaintag.add("twxingwu"); - } else event.finish(); - "step 2"; - game.delayx(); - if ( - player.getExpansions("twxingwu").length < 3 || - !game.hasPlayer((current) => current != player) - ) - event.finish(); - "step 3"; - player - .chooseButton( - ["是否移去三张“星舞”牌并发射核弹?", player.getExpansions("twxingwu")], - 3 - ) - .set("ai", function (button) { - if (_status.event.goon) return 1; - return 0; - }) - .set( - "goon", - game.hasPlayer((current) => get.damageEffect(current, player, player) < 0) - ); - "step 4"; - if (result.bool) player.loseToDiscardpile(result.links); - else event.finish(); - "step 5"; - player - .chooseTarget( - "星舞:选择一名其他角色", - "弃置其装备区内的所有牌。然后对其造成2点伤害(若其性别包含女性则改为1点)", - true, - lib.filter.notMe - ) - .set("ai", function (target) { - return ( - get.damageEffect(target, player, player) * - Math.sqrt( - 4 + - target.countCards("e", function (card) { - return get.value(card, target) > 0; - }) - ) * - (target.hasSex("female") ? 1 : 2) - ); - }); - "step 6"; - if (result.bool && result.targets && result.targets.length) { - var target = result.targets[0]; - player.line(target, "green"); - var num = target.countCards("e"); - if (num) player.discardPlayerCard(target, "e", num, true); - target.damage(target.hasSex("female") ? 1 : 2); - } - }, - intro: { - content: "expansion", - markcount: "expansion", - onunmark: function (storage, player) { - if (player.hasSkill("twpingting")) return; - player.removeAdditionalSkill("twpingting"); - }, - }, - onremove: function (player, skill) { - if (player.hasSkill("twpingting")) return; - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - }, - twpingting: { - audio: 2, - trigger: { global: ["roundStart", "dying"] }, - init: function (player, skill) { - if (player.getExpansions("twxingwu").length) - player.addAdditionalSkill(skill, ["tianxiang", "liuli"]); - else player.removeAdditionalSkill(skill); - }, - filter: function (event, player) { - if (event.name == "dying") - return player == _status.currentPhase && event.player != player; - return true; - }, - forced: true, - group: "twpingting_update", - derivation: ["tianxiang", "liuli"], - content: function () { - "step 0"; - player.draw(); - player - .chooseCard("he", "娉婷:将一张牌置于武将牌上,称为“星舞”", true) - .set("ai", function (card) { - return -get.value(card); - }); - "step 1"; - if (result.bool) { - var cards = result.cards; - player.addToExpansion(cards, player, "give").gaintag.add("twxingwu"); - } - }, - onremove: function (player, skill) { - if (player.hasSkill("twxingwu")) return; - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - subSkill: { - update: { - trigger: { player: ["loseAfter", "loseAsyncAfter", "addToExpansionAfter"] }, - filter: function (event, player) { - var cards = player.getExpansions("twxingwu"), - skills = player.additionalSkills.twpingting; - return !( - (cards.length && skills && skills.length) || - (!cards.length && (!skills || !skills.length)) - ); - }, - forced: true, - silent: true, - content: function () { - lib.skill.twpingting.init(player, "twpingting"); - }, - }, - }, - }, - tianxiang_daxiaoqiao: { audio: 2, inherit: "tianxiang" }, - liuli_daxiaoqiao: { audio: 2, inherit: "liuli" }, - //傅肜 - twxuewei: { - audio: "xuewei", - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - return ( - event.player != player && - game.players.length > 2 && - !player.hasSkill("twxuewei_round") - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twxuewei"), function (card, player, target) { - return target != player && target != _status.event.getTrigger().player; - }) - .set("ai", function (target) { - if (get.attitude(player, _status.event.getTrigger().player) >= 0) return 0; - return get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twxuewei", trigger.player, false); - player.addTempSkill("twxuewei_round", "roundStart"); - player.line2([trigger.player, target]); - trigger.player - .chooseControl("选项一", "选项二") - .set("choiceList", [ - "本回合不能对" + get.translation(target) + "使用【杀】且手牌上限-2", - "令" + get.translation(player) + "视为对你使用一张【决斗】", - ]) - .set("ai", function () { - var player = _status.event.player, - source = _status.event.getParent().player; - if (get.effect(player, { name: "juedou" }, source, player) > 0) return 1; - if (player.hp - player.countCards("h") > 2 || player.hp <= 2) return 0; - return 1; - }); - } else event.finish(); - "step 2"; - game.log(trigger.player, "选择了", "#g【血卫】", "的", "#y" + result.control); - if (result.control == "选项一") { - trigger.player.markAuto("twxuewei_block", [target]); - trigger.player.addTempSkill("twxuewei_block"); - } else player.useCard({ name: "juedou", isCard: true }, trigger.player, false); - }, - subSkill: { - round: { charlotte: true }, - block: { - charlotte: true, - onremove: true, - locked: true, - mark: true, - marktext: "卫", - intro: { - content: function (storage, player) { - if (!storage || !storage.length) return; - return ( - "不能对" + - get.translation(storage) + - "使用【杀】;手牌上限-" + - 2 * storage.length - ); - }, - }, - mod: { - maxHandcard: function (player, num) { - return num - 2 * player.getStorage("twxuewei_block").length; - }, - playerEnabled: function (card, player, target) { - if ( - card.name == "sha" && - player.getStorage("twxuewei_block").includes(target) - ) - return false; - }, - }, - }, - }, - }, - twliechi: { - audio: "liechi", - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return ( - event.source && - event.source.hp >= player.hp && - (event.source.countCards("h") > player.countCards("h") || - event.source.countCards("he")) - ); - }, - direct: true, - content: function () { - "step 0"; - var num = trigger.source.countCards("h") - player.countCards("h"); - event.num = num; - var list = [], - choiceList = [ - "令" + get.translation(trigger.source) + "弃置" + get.cnNumber(num) + "张手牌", - "弃置" + get.translation(trigger.source) + "一张牌", - "背水!弃置一张装备牌,然后依次执行以上所有选项", - ]; - if (trigger.source.countCards("h") > player.countCards("h")) list.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if (trigger.source.countCards("he")) list.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - if ( - trigger.source.countCards("h") > player.countCards("h") && - trigger.source.countCards("he") && - player.countCards("he", { type: "equip" }) && - game.getGlobalHistory("changeHp", (evt) => { - return evt.player == player && evt.getParent()._dyinged; - }).length - ) - list.push("背水!"); - else - choiceList[2] = - '' + choiceList[2] + "(未进入过濒死状态)"; - player - .chooseControl(list, "cancel2") - .set("prompt", get.prompt("twliechi", trigger.source)) - .set("choiceList", choiceList) - .set("ai", () => _status.event.choice) - .set( - "choice", - (function () { - if (get.attitude(player, trigger.source) > 0) return "cancel2"; - if (list.includes("背水!")) return "背水!"; - if (num > 1) return "选项一"; - return "选项二"; - })() - ); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("twliechi", trigger.source); - game.log(player, "选择了", "#g【烈斥】", "的", "#y" + result.control); - if (result.control == "背水!") player.chooseToDiscard("he", { type: "equip" }, true); - if (result.control != "选项二") trigger.source.chooseToDiscard("h", num, true); - if (result.control != "选项一") player.discardPlayerCard(trigger.source, "he", true); - } - }, - }, - //卢植 - twmingren: { - marktext: "任", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: "twmingren_change", - audio: "nzry_mingren_1", - trigger: { global: "phaseBefore", player: "enterGame" }, - forced: true, - locked: false, - filter: function (event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - !player.getExpansions("twmingren").length - ); - }, - content: function () { - "step 0"; - player.draw(); - "step 1"; - if (!player.countCards("h")) event.finish(); - else - player - .chooseCard("h", "明任:将一张手牌置于武将牌上,称为“任”", true) - .set("ai", function (card) { - return 6 - get.value(card); - }); - "step 2"; - if (result.bool) - player - .addToExpansion(result.cards[0], player, "give", "log") - .gaintag.add("twmingren"); - }, - subSkill: { - change: { - audio: "nzry_mingren_1", - trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, - filter: function (event, player) { - return player.countCards("he") && player.getExpansions("twmingren").length; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseCard( - "he", - get.prompt("twmingren"), - "用一张牌替换“任”(" + - get.translation(player.getExpansions("twmingren")[0]) + - ")" - ) - .set("ai", function (card) { - var player = _status.event.player; - var color = get.color(card); - if (color == get.color(player.getExpansions("twmingren")[0])) - return false; - var num = 0; - var list = []; - player.countCards("he", function (cardx) { - if (cardx != card || get.color(cardx) != color) return false; - if (list.includes(cardx.name)) return false; - list.push(cardx.name); - switch (cardx.name) { - case "wuxie": - num += game.countPlayer() / 2.2; - break; - case "caochuan": - num += 1.1; - break; - case "shan": - num += 1; - break; - } - }); - return num * (30 - get.value(card)); - }); - "step 1"; - if (result.bool) { - player.logSkill("twmingren"); - player - .addToExpansion(result.cards[0], "log", "give", player) - .gaintag.add("twmingren"); - var card = player.getExpansions("twmingren")[0]; - if (card) player.gain(card, "gain2"); - } - }, - }, - }, - }, - twzhenliang: { - group: ["twzhenliang_1", "twzhenliang_2"], - audio: "nzry_zhenliang_1", - mark: true, - zhuanhuanji: true, - marktext: "☯", - intro: { - content: function (storage, player, skill) { - if (player.storage.twzhenliang == true) - return "当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。"; - return "出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。"; - }, - }, - subSkill: { - 1: { - audio: "nzry_zhenliang_1", - enable: "phaseUse", - filter: function (event, player) { - if (player.storage.twzhenliang) return false; - return game.hasPlayer(function (current) { - return player.inRange(current); - }); - }, - position: "he", - filterCard: true, - filterTarget: function (card, player, target) { - return player.inRange(target); - }, - check: function (card) { - var player = _status.event.player, - cardx = player.getExpansions("twmingren")[0]; - if (cardx && get.color(cardx, player) == get.color(card, player)) - return 10 - get.value(card); - return 7 - get.value(card); - }, - prompt: "弃置一张牌并对攻击范围内的一名角色造成1点伤害", - content: function () { - "step 0"; - player.changeZhuanhuanji("twzhenliang"); - var cardx = player.getExpansions("twmingren")[0]; - target.damage("nocard"); - if (!cardx || get.color(cards[0], player) != get.color(cardx, player)) - event.finish(); - "step 1"; - player.draw(); - }, - ai: { - order: 5, - result: { - player: function (player, target) { - return get.damageEffect(target, player, player); - }, - }, - }, - }, - 2: { - audio: "nzry_zhenliang_1", - trigger: { global: "damageBegin4" }, - filter: function (event, player) { - if (_status.currentPhase == player || !player.storage.twzhenliang) return false; - return ( - player.countCards("he") && - event.num > 0 && - (event.player == player || player.inRange(event.player)) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseToDiscard( - "he", - get.prompt("twzhenliang", trigger.player), - "弃置一张牌令此伤害-1" - ) - .set("ai", function (card) { - if (_status.event.goon) { - var player = _status.event.player, - cardx = player.getExpansions("twmingren")[0]; - if (cardx && get.color(cardx, player) == get.color(card, player)) - return 10 - get.value(card); - return 6 - get.value(card); - } - return 0; - }) - .set("goon", get.attitude(player, trigger.player) > 0).logSkill = [ - "twzhenliang", - trigger.player, - ]; - "step 1"; - if (result.bool) { - player.changeZhuanhuanji("twzhenliang"); - var cardx = player.getExpansions("twmingren")[0]; - if (cardx && get.color(result.cards[0], player) == get.color(cardx, player)) - player.draw(); - trigger.num--; - } - }, - }, - }, - }, - //张南 - twfenwu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && player.canUse("sha", current, false, false); - }); - }, - direct: true, - content: function () { - "step 0"; - var list = []; - player.getHistory("useCard", function (evt) { - if (get.type(evt.card) != "basic") return; - var name = evt.card.name, - nature = game.hasNature(evt.card) ? get.nature(evt.card) : ""; - if (!list.includes(name + nature)) list.push(name + nature); - }); - event.addDamage = list.length > 1; - player - .chooseTarget( - get.prompt("twfenwu"), - "失去1点体力并视为使用一张无距离限制的【杀】" + - (event.addDamage ? "(伤害基数+1)" : ""), - function (card, player, target) { - return target != player && player.canUse("sha", target, false, false); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - if (player.hp + player.countCards("hs", { name: ["tao", "jiu"] }) <= 1) return -1; - var num = 1; - if ( - (!target.mayHaveShan( - player, - "use", - target.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) || - player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: { name: "sha" }, - }, - true - )) && - !target.hasSkillTag("filterDamage", null, { - player: player, - card: { name: "sha" }, - }) - ) { - num = 1.3; - } - return get.effect(target, { name: "sha" }, player, player) * num; - }); - "step 1"; - if (result.bool) { - var num = 1; - var target = result.targets[0]; - player.logSkill("twfenwu", target); - player.loseHp(); - if (event.addDamage) { - num = 2; - game.log("#y杀", "的伤害基数+1"); - } - player.useCard({ name: "sha", isCard: true }, target, false).baseDamage = num; - } - }, - }, - //呼厨泉 - twfupan: { - audio: 3, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - check: () => true, - onremove: true, - content: function () { - "step 0"; - if (!player.storage.twfupan) player.storage.twfupan = {}; - player.draw(trigger.num); - "step 1"; - if ( - player.countCards("he") && - game.hasPlayer((current) => { - return !(player.storage.twfupan[current.playerid] >= 2) && player != current; - }) - ) { - player.chooseCardTarget({ - filterCard: true, - selectCard: 1, - position: "he", - forced: true, - targetprompt: function (target) { - return !_status.event.player.storage.twfupan[target.playerid] - ? "你摸两张牌" - : "对其
    造成伤害"; - }, - filterTarget: function (card, player, target) { - return !(player.storage.twfupan[target.playerid] >= 2) && player != target; - }, - ai1: function (card) { - var player = _status.event.player; - if (get.value(card, false, "raw") < 0) return 20 * get.value(card); - if (player == _status.currentPhase) return 20 - player.getUseValue(card); - return 20 - get.value(card); - }, - ai2: function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if ( - ui.selected.cards.length && - get.value(ui.selected.cards[0], false, "raw") < 0 - ) { - return -0.1 - att; - } - if (player.storage.twfupan[target.playerid] === undefined) return 5; - else if (player.storage.twfupan[target.playerid] === 1) - return get.damageEffect(target, player, player); - return 1; - }, - prompt: "请选择要交出的卡牌和目标角色", - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var cards = result.cards, - target = result.targets[0]; - player.line(target, "green"); - player.give(cards, target); - event.target = target; - if (!player.storage.twfupan[target.playerid]) { - player.storage.twfupan[target.playerid] = 1; - player.draw(2); - event.finish(); - } else { - player - .chooseBool( - "复叛:是否对" + get.translation(target) + "造成1点伤害?", - "然后你不能再因此技能交给其牌" - ) - .set("ai", () => _status.event.bool) - .set("bool", get.damageEffect(target, player, player) > 0); - } - } - "step 3"; - if (result.bool) { - player.line(target, "fire"); - target.damage(); - player.storage.twfupan[target.playerid]++; - } - }, - ai: { - maixie: true, - maixie_hp: true, - threaten: 0.9, - }, - }, - //刘璋 - twyaohu: { - audio: "yinlang", - trigger: { player: "phaseBegin" }, - direct: true, - filter: function (event, player) { - return ( - !player.hasSkill("twyaohu_round") && - game.hasPlayer(function (current) { - return current.group && current.group != "unknown"; - }) - ); - }, - content: function () { - "step 0"; - var list = []; - game.countPlayer(function (current) { - if (current.group && current.group != "unknown") list.add(current.group); - }); - list.sort(function (a, b) { - return lib.group.indexOf(a) - lib.group.indexOf(b); - }); - if (!player.hasSkill("twyaohu")) list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", "邀虎:请选择一个势力") - .set("ai", function () { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var getn = function (group) { - return game.countPlayer(function (current) { - if (current.group != group) return false; - if (player == current) return 2; - if (get.attitude(current, player) > 0) return 1; - return 1.3; - }); - }; - list.sort(function (a, b) { - return getn(b) - getn(a); - }); - return list[0]; - })() - ); - "step 1"; - if (result.control != "cancel2") { - player.logSkill( - "twyaohu", - game.filterPlayer(function (current) { - return current.group == result.control; - }) - ); - game.log(player, "选择了", "#y" + get.translation(result.control + 2)); - player.storage.yaohu = result.control; - player.storage.twyaohu = result.control; - player.markSkill("twyaohu"); - } - }, - ai: { combo: "jutu" }, - intro: { content: "已选择了$势力" }, - group: "twyaohu_gain", - subSkill: { - round: {}, - gain: { - audio: "yinlang", - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - return ( - event.player.group == player.storage.yaohu && - event.player.isIn() && - player.getExpansions("jutu").length > 0 - ); - }, - forced: true, - locked: false, - logTarget: "player", - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - target - .chooseButton(["选择获得一张“生”", player.getExpansions("jutu")], true) - .set("ai", function (button) { - return get.value(button.link, player); - }); - "step 1"; - if (result.bool) { - target.gain(result.links, "give", player); - } - "step 2"; - if ( - game.hasPlayer(function (current) { - return current != player && current != target; - }) - ) { - player - .chooseTarget( - true, - "选择" + get.translation(target) + "使用【杀】的目标", - function (card, player, target) { - return target != player && target != _status.event.source; - } - ) - .set("source", target) - .set("ai", function (target) { - var evt = _status.event; - return get.effect(target, { name: "sha" }, evt.source, evt.player); - }); - } else { - event._result = { bool: false }; - event.goto(4); - } - "step 3"; - var target2 = result.targets[0]; - player.line(target2, "green"); - target - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "对" + - get.translation(target2) + - "使用一张杀,否则本回合使用伤害牌指定" + - get.translation(player) + - "为目标时须交给" + - get.translation(player) + - "两张牌,否则此牌对" + - 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.targetEnabled.apply(this, arguments); - }) - .set("sourcex", target2) - .set("addCount", false); - "step 4"; - if (!result.bool) player.addTempSkill("twyaohu_effect"); - }, - }, - effect: { - audio: "yinlang", - trigger: { global: "useCardToPlayer" }, - charlotte: true, - forced: true, - filter: function (event, player) { - return event.target == player && get.tag(event.card, "damage"); - }, - logTarget: "player", - content: function () { - "step 0"; - var hs = trigger.player.getCards("he"); - if (hs.length < 2) event._result = { bool: false }; - else - trigger.player - .chooseCard( - 2, - "交给" + - get.translation(player) + - "两张牌,否则取消" + - get.translation(trigger.card) + - "对其的目标", - "he" - ) - .set("ai", (card) => { - if (_status.event.goon) return 5 - get.value(card); - return 0; - }) - .set( - "goon", - get.effect(player, trigger.card, trigger.player, trigger.player) > 0 - ); - "step 1"; - if (result.bool) { - trigger.player.give(result.cards, player); - } else { - trigger.untrigger(); - trigger.targets.remove(player); - trigger.getParent().triggeredTargets1.remove(player); - } - }, - }, - }, - }, - //李遗 - twjiaohua: { - audio: 2, - trigger: { global: "gainAfter" }, - filter: function (event, player) { - if (event.getParent().name != "draw") return false; - if (event.player != player && !event.player.isMinHp()) return false; - var cards = event.cards, - list = ["basic", "trick", "equip"]; - for (var card of cards) if (list.includes(get.type2(card))) list.remove(get.type2(card)); - for (var type of event.player.getStorage("twjiaohua_gained")) - if (list.includes(type)) list.remove(type); - return list.length > 0; - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - prompt2: function (event, player) { - var cards = event.cards, - list = ["basic", "trick", "equip"]; - for (var card of cards) if (list.includes(get.type2(card))) list.remove(get.type2(card)); - for (var type of event.player.getStorage("twjiaohua_gained")) - if (list.includes(type)) list.remove(type); - var name = event.player == player ? "你" : get.translation(event.player); - return ( - "令" + - name + - "从牌堆或弃牌堆中获得一张" + - (event.player.isUnderControl(true) - ? list - .map((i) => get.translation(i) + "牌") - .join("、") - .replace(/(.*)、/, "$1或") - : "本次未获得的类别的牌") - ); - }, - logTarget: "player", - content: function () { - trigger.player.addTempSkill("twjiaohua_gained"); - var cards = trigger.cards, - list = ["basic", "trick", "equip"]; - for (var card of cards) if (list.includes(get.type2(card))) list.remove(get.type2(card)); - for (var type of trigger.player.getStorage("twjiaohua_gained")) - if (list.includes(type)) list.remove(type); - list.randomSort(); - var card = get.cardPile(function (card) { - return list.includes(get.type2(card)); - }); - if (card) { - trigger.player.gain(card, "gain2"); - trigger.player.markAuto("twjiaohua_gained", [get.type2(card)]); - } - }, - subSkill: { - gained: { onremove: true, charlotte: true }, - }, - }, - //阎象 - twkujian: { - audio: 3, - enable: "phaseUse", - filterCard: true, - selectCard: [1, 3], - usable: 1, - discard: false, - lose: false, - delay: false, - filterTarget: lib.filter.notMe, - global: "twkujian_ai", - 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 () { - player.give(cards, target).gaintag.add("twkujianx"); - player.addSkill("twkujian_draw"); - player.addSkill("twkujian_discard"); - }, - ai: { - expose: 0.2, - order: 7, - 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; - } - } - } - }, - }, - }, - subSkill: { - draw: { - audio: "twkujian", - trigger: { global: ["useCardAfter", "respondAfter"] }, - forced: true, - logTarget: "player", - charlotte: true, - filter: function (event, player) { - return event.player.hasHistory("lose", (evt) => { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("twkujianx")) return true; - } - }); - }, - content: function () { - "step 0"; - game.asyncDraw([player, trigger.player]); - "step 1"; - game.delayx(); - }, - }, - discard: { - audio: "twkujian", - trigger: { - global: [ - "loseAfter", - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - forced: true, - logTarget: function (event, player) { - return game.filterPlayer(function (current) { - var evt = event.getl(current); - if (!evt || !evt.hs || !evt.hs.length) return false; - if (event.name == "lose") { - var name = event.getParent().name; - if (name == "useCard" || name == "respond") return false; - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("twkujianx")) return true; - } - return false; - } - return current.hasHistory("lose", function (evt) { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("twkujianx")) return true; - } - return false; - }); - }); - }, - charlotte: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - var evt = event.getl(current); - if (!evt || !evt.hs || !evt.hs.length) return false; - if (event.name == "lose") { - var name = event.getParent().name; - if (name == "useCard" || name == "respond") return false; - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("twkujianx")) return true; - } - return false; - } - return current.hasHistory("lose", function (evt) { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("twkujianx")) return true; - } - return false; - }); - }); - }, - content: function () { - "step 0"; - var event = trigger; - var targets = game.filterPlayer(function (current) { - var evt = event.getl(current); - if (!evt || !evt.hs || !evt.hs.length) return false; - if (event.name == "lose") { - var name = event.getParent().name; - if (name == "useCard" || name == "respond") return false; - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("twkujianx")) return true; - } - return false; - } - return current.hasHistory("lose", function (evt) { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("twkujianx")) return true; - } - return false; - }); - }); - targets.add(player); - targets.sortBySeat(); - _status.event.targets = targets; - "step 1"; - var target = targets.shift(); - if (target.countCards("he") > 0) target.chooseToDiscard("he", true); - if (targets.length > 0) event.redo(); - }, - }, - ai: { - charlotte: true, - ai: { - effect: { - player_use: function (card, player, target) { - if ( - card.cards && - card.cards.some((i) => i.hasGaintag("twkujianx")) && - game.hasPlayer((current) => { - return get.attitude(player, current) > 0; - }) - ) - return [1, 1]; - }, - }, - }, - mod: { - aiOrder: function (player, card, num) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("twkujianx") && - game.hasPlayer((current) => { - return get.attitude(player, current) > 0; - }) - ) - return num + 0.5; - }, - aiValue: function (player, card, num) { - if ( - get.itemtype(card) == "card" && - card.hasGaintag("twkujianx") && - game.hasPlayer((current) => { - return get.attitude(player, current) > 0; - }) - ) - return num + 0.5; - }, - }, - }, - }, - }, - twruilian: { - audio: 2, - trigger: { global: "roundStart" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("twruilian")).set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target), - eff = att / (player == target ? 2 : 1) + 1; - if (att >= 0) { - if (target.hasSkill("yongsi")) return eff * 5; - if (target.hasSkill("zhiheng") || target.hasSkill("rezhiheng")) return eff * 4; - if (target.hasSkill("rekurou")) return eff * 3; - if (target.hasSkill("xinlianji") || target.hasSkill("dclianji")) return eff * 2; - if (target.needsToDiscard()) return eff * 1.5; - return eff; - } - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twruilian", target); - player.markAuto("twruilian2", [target]); - player.addSkill("twruilian2"); - } - }, - }, - twruilian2: { - trigger: { global: "phaseEnd" }, - direct: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - return player.getStorage("twruilian2").includes(event.player); - }, - intro: { content: "已选择$" }, - content: function () { - "step 0"; - player.removeSkill("twruilian2"); - var target = trigger.player; - event.target = target; - var cards = []; - target.getHistory("lose", function (evt) { - if (evt.type == "discard") cards.addArray(evt.cards2); - }); - if (cards.length < 2) event.finish(); - else event.cards = cards; - "step 1"; - var list = []; - for (var type of ["basic", "trick", "equip"]) { - for (var card of event.cards) { - if (get.type2(card) == type) { - list.push(type); - break; - } - } - } - list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", "睿敛:是否与" + get.translation(target) + "各获得一种类型的牌?") - .set("ai", function () { - var player = _status.event.player, - list = _status.event.controls; - if ( - player.hp <= 3 && - !player.countCards("h", { name: ["shan", "tao"] }) && - list.includes("basic") - ) - return "basic"; - if (player.countCards("he", { type: "equip" }) < 2 && list.includes("equip")) - return "equip"; - if (list.includes("trick")) return "trick"; - return list.remove("cancel2").randomGet(); - }); - "step 2"; - if (result.control != "cancel2") { - player.logSkill("twruilian2", target); - var type = result.control; - var list = [target, player].sortBySeat(_status.currentPhase), - cards = []; - for (var current of list) { - var card = get.discardPile(function (card) { - return get.type2(card) == type && !cards.includes(card); - }); - if (card) { - cards.push(card); - current.gain(card, "gain2"); - } - } - } - }, - }, - //夏侯恩 - twfujian: { - audio: 2, - group: "twfujian_lose", - trigger: { - global: "phaseBefore", - player: ["enterGame", "phaseZhunbeiBegin"], - }, - filter: function (event, player) { - if (player.getEquips(1).length) return false; - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - content: function () { - var card = get.cardPile2(function (card) { - return get.type(card) == "equip" && get.subtype(card) == "equip1"; - }); - event.card = card; - if (card) player.equip(card); - else { - game.log("但是牌堆中没有武器牌了!"); - event.finish(); - } - }, - subSkill: { - lose: { - audio: "twfujian", - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter: function (event, player) { - if (player == _status.currentPhase) return false; - if (event.name == "gain" && event.player == player) return false; - var evt = event.getl(player); - if (evt && evt.cards2 && evt.cards2.some((i) => get.subtype(i) == "equip1")) - return true; - return false; - }, - forced: true, - content: function () { - player.loseHp(); - }, - }, - }, - }, - twjianwei: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - if (!player.getEquips(1).length) return false; - return game.hasPlayer(function (current) { - return player.inRange(current) && player.canCompare(current); - }); - }, - pindianCheck: function (player, target) { - 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 ( - Math.min(13, hs[0].number + player.getAttackRange()) > ts[0].number || - (ts[0].number > 9 && get.value(ts[0]) <= 5) || - target.countCards("j") - ) - return true; - return false; - }, - direct: true, - locked: false, - group: ["twjianwei_pindian", "twjianwei_zhaocha"], - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("twjianwei"), - "与攻击范围内的一名角色拼点。若你赢,你获得其每个区域里的一张牌;若其赢,其获得你装备区里的武器牌", - function (card, player, target) { - return player.inRange(target) && player.canCompare(target); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - if (lib.skill.twjianwei.pindianCheck(player, target)) - return -5 * get.attitude(player, target); - return -get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twjianwei", target); - player.chooseToCompare(target); - } else event.finish(); - "step 2"; - if (result.bool) { - var num = 0; - if (target.countCards("h")) num++; - if (target.countCards("e")) num++; - if (target.countCards("j")) num++; - if (num) { - player - .gainPlayerCard(target, num, "hej", true) - .set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if ( - get.position(button.link) == - get.position(ui.selected.buttons[i].link) - ) - return false; - } - return true; - }); - } - } else if (!result.tie) { - var card = player.getEquips(1); - if (card.length) target.gain(card, player, "give"); - } - }, - mod: { - aiValue: function (player, card, num) { - if (card.name == "qinggang" || card.name == "qibaodao") return num / 5; - }, - }, - ai: { - unequip: true, - unequip_ai: true, - skillTagFilter: function (player, tag, arg) { - if (!arg || !arg.card || arg.card.name != "sha" || !player.getEquip(1)) return false; - }, - }, - subSkill: { - pindian: { - audio: "twjianwei", - trigger: { player: "compare", target: "compare" }, - filter: function (event, player) { - if (!player.getEquips(1).length || player.getAttackRange() <= 0) return false; - if (event.player == player) return !event.iwhile; - return true; - }, - forced: true, - locked: false, - content: function () { - var num = player.getAttackRange(); - if (player == trigger.player) { - trigger.num1 += num; - if (trigger.num1 > 13) trigger.num1 = 13; - } else { - trigger.num2 += num; - if (trigger.num2 > 13) trigger.num2 = 13; - } - game.log(player, "的拼点牌点数+" + num); - }, - }, - //你是故意找茬是不是 - zhaocha: { - trigger: { global: "phaseZhunbeiBegin" }, - filter: function (event, player) { - if (event.player == player) return false; - return event.player.canCompare(player); - }, - direct: true, - content: function () { - "step 0"; - trigger.player - .chooseBool( - "剑威:是否与" + get.translation(player) + "拼点?", - "若你赢,你获得其装备区里的武器牌;若其赢,其获得你每个区域里的一张牌" - ) - .set("ai", () => _status.event.choice) - .set( - "choice", - get.attitude(trigger.player, player) < 0 && - !lib.skill.twjianwei.pindianCheck(player, trigger.player) - ); - "step 1"; - if (result.bool) { - trigger.player.logSkill("twjianwei", player); - trigger.player.chooseToCompare(player); - } else event.finish(); - "step 2"; - if (!result.tie) { - if (result.bool) { - var card = player.getEquips(1); - if (card.length) trigger.player.gain(card, player, "give"); - } else { - var num = 0; - if (trigger.player.countCards("h")) num++; - if (trigger.player.countCards("e")) num++; - if (trigger.player.countCards("j")) num++; - if (num) - player - .gainPlayerCard(trigger.player, num, "hej", true) - .set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if ( - get.position(button.link) == - get.position(ui.selected.buttons[i].link) - ) - return false; - } - return true; - }); - } - } - }, - }, - }, - }, - //夏侯尚 - twtanfeng: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countDiscardableCards(player, "hej") > 0; - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twtanfeng"), function (card, player, target) { - return target != player && target.countDiscardableCards(player, "hej") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player, - num = 1; - if (get.attitude(player, target) > 0) num = 3; - else if (!target.countCards("he") || !target.canUse("sha", player)) { - if (target.hp + target.countCards("hs", { name: ["tao", "jiu"] }) <= 1) - num = 2; - else num = 1.2; - } - return ( - get.effect(target, { name: "guohe" }, player, player) * - num * - (player.hp <= 1 && get.attitude(player, target) <= 0 ? 0 : 1) - ); - }) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twtanfeng", target); - player.discardPlayerCard(target, "hej", true); - } else event.finish(); - "step 2"; - target.chooseCardTarget({ - position: "hes", - prompt: "选择一张牌当做【杀】对" + get.translation(player) + "使用", - prompt2: - "或点击“取消”,受到其造成的1点火焰伤害,并令其跳过本回合的一个阶段(准备阶段和结束阶段除外)", - filterCard: function (card, player) { - return player.canUse( - get.autoViewAs({ name: "sha" }, [card]), - _status.event.getParent().player, - false - ); - }, - filterTarget: function (card, player, target) { - var source = _status.event.getParent().player; - if (target != source && !ui.selected.targets.includes(source)) return false; - card = get.autoViewAs({ name: "sha" }, [card]); - return lib.filter.filterTarget.apply(this, arguments); - }, - selectTarget: function () { - var card = get.card(), - player = get.player(); - if (!card) return; - card = get.autoViewAs({ name: "sha" }, [card]); - var range = [1, 1]; - game.checkMod(card, player, range, "selectTarget", player); - return range; - }, - ai1: function (card) { - var player = _status.event.player, - target = _status.event.getParent().player; - var eff = get.effect( - target, - get.autoViewAs({ name: "sha" }, [card]), - player, - player - ); - var eff2 = get.damageEffect(player, target, player, "fire"); - if (eff < 0 || eff2 > 0 || eff2 > eff || get.tag(card, "recover")) return 0; - return (player.hp == 1 ? 10 : 6) - get.value(card); - }, - ai2: function (target) { - if (target == _status.event.getParent().player) return 100; - return get.effect(target, { name: "sha" }, _status.event.player); - }, - }); - "step 3"; - if (result.bool) { - var cards = result.cards, - targets = result.targets; - var cardx = get.autoViewAs({ name: "sha" }, cards); - target.useCard(cardx, cards, targets, false); - event.finish(); - } else { - player.line(target, "fire"); - target.damage(1, "fire"); - } - "step 4"; - if (!target.isIn()) { - event.finish(); - return; - } - var list = []; - var list2 = []; - event.map = { - phaseJudge: "判定阶段", - phaseDraw: "摸牌阶段", - phaseUse: "出牌阶段", - phaseDiscard: "弃牌阶段", - }; - for (var i of ["phaseJudge", "phaseDraw", "phaseUse", "phaseDiscard"]) { - if (!player.skipList.includes(i)) { - i = event.map[i]; - list.push(i); - if (i != "判定阶段" && i != "弃牌阶段") list2.push(i); - } - } - target - .chooseControl(list) - .set("prompt", "探锋:令" + get.translation(player) + "跳过一个阶段") - .set("ai", function () { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var att = get.attitude(target, player); - var num = player.countCards("j"); - if (att > 0) { - if (list.includes("判定阶段") && num > 0) return "判定阶段"; - return "弃牌阶段"; - } - if (list.includes("摸牌阶段") && player.hasJudge("lebu")) return "摸牌阶段"; - if ( - (list.includes("出牌阶段") && player.hasJudge("bingliang")) || - player.needsToDiscard() > 0 - ) - return "出牌阶段"; - return list2.randomGet(); - })() - ); - "step 5"; - for (var i in event.map) { - if (event.map[i] == result.control) player.skip(i); - } - target.popup(result.control); - target.line(player); - game.log(player, "跳过了", "#y" + result.control); - }, - }, - //宗预 - twzhibian: { - audio: "zhibian", - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return game.hasPlayer((current) => current != player && player.canCompare(current)); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("twzhibian"), - "与一名其他角色拼点", - function (card, player, target) { - return target != player && player.canCompare(target); - } - ) - .set("ai", function (target) { - if (!_status.event.goon) return false; - var att = get.attitude(player, target); - if ( - att < 0 && - (target.countCards("h") > 1 || - target.countCards("e", function (card) { - return ( - player.canEquip(card) && - get.effect(player, card, target, player) > 0 - ); - })) - ) - return -att / Math.sqrt(target.countCards("h")); - if (!player.isDamaged()) return false; - if (att <= 0) return (1 - att) / Math.sqrt(target.countCards("h")); - return Math.sqrt((2 / att) * Math.sqrt(target.countCards("h"))); - }) - .set( - "goon", - (function () { - if ( - !player.hasCard(function (card) { - return card.number >= 14 - player.hp && get.value(card) <= 5; - }) - ) - return false; - return true; - })() - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twzhibian", target); - player.chooseToCompare(target); - } else event.finish(); - "step 2"; - if (result.bool) { - var list = [], - list2 = [ - "将" + get.translation(target) + "区域中的一张牌移动到你的区域内", - "回复1点体力", - "背水!弃置一张非基本牌,并依次执行上述所有选项", - ]; - if ( - target.countCards("h") || - target.hasCard(function (card) { - return player.canEquip(card); - }, "e") || - target.hasCard(function (card) { - return player.canAddJudge(card); - }, "j") - ) - list.push("选项一"); - else list2[0] = '' + list2[0] + ""; - if (player.isDamaged()) list.push("选项二"); - else list2[1] = '' + list2[1] + ""; - if (!list.length) { - event.finish(); - return; - } - if (player.countCards("he", (card) => get.type(card) != "basic")) list.push("背水!"); - else list2[2] = '' + list2[2] + ""; - list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", "直辩:选择一项") - .set("choiceList", list2) - .set("ai", function () { - var target = _status.event.getParent().target; - if ( - _status.event.controls.includes("背水!") && - player.isDamaged() && - (target.countCards("h") || - target.countCards("e", function (card) { - return ( - player.canEquip(card) && - get.value(card, target) >= 4 + player.getDamagedHp() - ); - })) - ) - return 2; - if ( - player.isDamaged() && - (player.hp <= 2 || - (!target.countCards("h") && - !target.countCards("e", function (card) { - return ( - player.canEquip(card) && - get.value(card, target) >= 4 + player.getDamagedHp() - ); - }))) - ) - return 1; - return 0; - }); - } else { - player.loseHp(); - event.finish(); - } - "step 3"; - if (result.control != "cancel2") { - event.control = result.control; - if ( - result.control == "背水!" && - player.countCards("he", function (card) { - return get.type(card) != "basic"; - }) - ) - player.chooseToDiscard("he", true, function (card) { - return get.type(card) != "basic"; - }); - } else event.finish(); - "step 4"; - if (event.control == "选项一" || event.control == "背水!") { - player.choosePlayerCard(target, "hej", true).set("ai", get.buttonValue); - } else event.goto(6); - "step 5"; - if (result.bool) { - var card = result.cards[0]; - switch (get.position(card)) { - case "h": - player.gain(card, target, "giveAuto"); - break; - case "e": - target.$give(card, player, false); - player.equip(card); - break; - case "j": - target.$give(card, player, false); - player.addJudge(card); - break; - } - } - "step 6"; - if (event.control == "选项二" || event.control == "背水!") player.recover(); - }, - }, - twyuyan: { - audio: "yuyan", - trigger: { target: "useCardToTarget" }, - filter: function (event, player) { - return event.card.name == "sha" && event.card.isCard && player.hp < event.player.hp; - }, - forced: true, - logTarget: "player", - content: function () { - "step 0"; - var num = get.number(trigger.card), - str = ""; - if (typeof num == "number") str = "点数大于" + get.cnNumber(num) + "的"; - else str = "非基本"; - if ( - (typeof num == "number" && - (num >= 13 || - !trigger.player.hasCard(function (card) { - if (_status.connectMode && get.position(card) == "h") return true; - return get.number(card) > num; - }, "he"))) || - (typeof num != "number" && - !trigger.player.hasCard(function (card) { - if (_status.connectMode && get.position(card) == "h") return true; - return get.type(card) != "basic"; - }, "he")) - ) - event._result = { bool: false }; - else - trigger.player - .chooseCard( - "he", - function (card) { - if (typeof _status.event.number == "number") - return get.number(card) > _status.event.number; - return get.type(card) != "basic"; - }, - "交给" + - get.translation(player) + - "一张" + - str + - "牌,或取消" + - get.translation(trigger.card) + - "对其的目标" - ) - .set("number", num) - .set("ai", function (card) { - if (card.name == "shan" || card.name == "tao" || card.name == "jiu") - return false; - return 6 - get.value(card); - }); - "step 1"; - if (result.bool) trigger.player.give(result.cards, player); - else { - trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); - trigger.untrigger(); - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if ( - card.name == "sha" && - player.hp > target.hp && - get.attitude(player, target) < 0 - ) { - var num = get.number(card); - var bs = player.getCards("h", function (cardx) { - return ( - (typeof num == "number" - ? get.number(cardx) > num - : get.type(cardx) != "basic") && - !["", "", ""].includes(cardx.name) - ); - }); - if (bs.length < 2) return 0; - if (player.hasSkill("jiu") || player.hasSkill("tianxianjiu")) return; - if (bs.length <= 2) { - for (var i = 0; i < bs.length; i++) { - if (get.value(bs[i]) < 6) { - return [1, 0, 1, -0.5]; - } - } - return 0; - } - return [1, 0, 1, -0.5]; - } - }, - }, - }, - }, - //周处 - twguoyi: { - audio: "zhangming", - trigger: { player: "useCardToTargeted" }, - filter: function (event, player) { - if (event.target == player || (event.card.storage && event.card.storage.twguoyi)) - return false; - return ( - (event.card.name == "sha" || get.type(event.card) == "trick") && - (event.target.isMaxHp() || - event.target.isMaxHandcard() || - player.countCards("h") <= player.getDamagedHp() + 1) - ); - }, - check: function (event, player) { - return get.attitude(player, event.target) <= 0; - }, - logTarget: "target", - group: "twguoyi_reuse", - content: function () { - "step 0"; - event.bool1 = false; - event.bool2 = false; - if (trigger.target.isMaxHp() || trigger.target.isMaxHandcard()) event.bool1 = true; - if (player.countCards("h") <= player.getDamagedHp() + 1) event.bool2 = true; - if (!trigger.target.countCards("he")) event._result = { index: 0 }; - else - trigger.target - .chooseControl() - .set("choiceList", [ - "本回合不能使用或打出手牌", - "弃置" + get.cnNumber(player.getDamagedHp() + 1) + "张牌", - ]) - .set("ai", function () { - var player = _status.event.player; - if (player.countCards("h") <= player.getHandcardLimit()) return 0; - return 1; - }); - "step 1"; - player.addTempSkill("twguoyi_" + result.index); - if (result.index == 0) trigger.target.addTempSkill("twguoyi_hand"); - else trigger.target.chooseToDiscard("he", player.getDamagedHp() + 1, true); - "step 2"; - if ( - (event.bool1 && event.bool2) || - (player.hasSkill("twguoyi_0") && player.hasSkill("twguoyi_1")) - ) { - if (!trigger.getParent().twguoyi_reuse) - trigger.getParent().twguoyi_reuse = { - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - storage: { twguoyi: true }, - }; - } - }, - subSkill: { - 0: { charlotte: true }, - 1: { charlotte: true }, - hand: { - charlotte: true, - mark: true, - intro: { content: "不能使用或打出手牌" }, - mod: { - cardEnabled2: function (card) { - if (get.position(card) == "h") return false; - }, - }, - }, - reuse: { - charlotte: true, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return event.twguoyi_reuse; - }, - direct: true, - content: function () { - var card = trigger.twguoyi_reuse; - for (var i of trigger.targets) { - if (!i.isIn() || !player.canUse(card, i, false)) return; - } - if (trigger.addedTarget && !trigger.addedTarget.isIn()) return; - if (trigger.addedTargets && trigger.addedTargets.length) { - for (var i of trigger.addedTargets) { - if (!i.isIn()) return; - } - } - var next = player.useCard(get.copy(card), trigger.targets, false); - if (trigger.addedTarget) next.addedTarget = trigger.addedTarget; - if (trigger.addedTargets && trigger.addedTargets.length) - next.addedTargets = trigger.addedTargets.slice(0); - }, - }, - }, - }, - twchuhai: { - audio: "chuhai", - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - var targets = []; - player.getHistory("sourceDamage", (evt) => { - if (player != evt.player && evt._dyinged) targets.add(evt.player); - }); - return targets.length >= 2; - }, - forced: true, - locked: false, - dutySkill: true, - skillAnimation: true, - animationColor: "wood", - group: "twchuhai_lose", - content: function () { - "step 0"; - game.log(player, "成功完成使命"); - player.awakenSkill("twchuhai"); - if (!player.isDisabledJudge()) player.disableJudge(); - event.current = player.next; - "step 1"; - if (!event.current.countCards("he")) event.goto(3); - else - event.current - .chooseCard("交给" + get.translation(player) + "一张牌", "he", true) - .set("ai", get.disvalue2); - "step 2"; - if (result.bool && result.cards && result.cards.length) - event.current.give(result.cards, player); - "step 3"; - event.current = event.current.next; - if (event.current != player) event.goto(1); - }, - subSkill: { - lose: { - audio: "chuhai", - trigger: { - global: ["gainAfter", "loseAsyncAfter"], - }, - forced: true, - dutySkill: true, - filter: function (event, player) { - var cards = event.getg(player); - if (!cards.length) return false; - return game.hasPlayer((current) => { - if (current == player) return false; - var evt = event.getl(current); - if (evt && evt.cards && evt.cards.length) return true; - return false; - }); - }, - content: function () { - "step 0"; - var cards = trigger.getg(player); - if (!cards.length) { - event.finish(); - return; - } - player - .chooseCard("h", "除害:将其中一张得到的牌置入弃牌堆", true, function (card) { - return _status.event.cards.includes(card); - }) - .set("ai", function (card) { - return -get.value(card); - }) - .set("cards", cards); - "step 1"; - if (result.bool) player.loseToDiscardpile(result.cards); - }, - }, - }, - }, - //桥公 - twyizhu: { - audio: "yizhu", - group: ["twyizhu_use", "twyizhu_discard"], - trigger: { player: "phaseJieshuBegin" }, - forced: true, - locked: false, - content: function () { - "step 0"; - player.draw(2); - "step 1"; - var hs = player.getCards("he"); - if (!hs.length) event.finish(); - else if (hs.length <= 2) event._result = { bool: true, cards: hs }; - else player.chooseCard("he", true, 2, "选择两张牌洗入牌堆"); - "step 2"; - if (result.bool) { - player.$throw(result.cards.length, 1000); - player.lose(result.cards, ui.cardPile).insert_index = function () { - return ui.cardPile.childNodes[get.rand(0, game.players.length * 2 - 2)]; - }; - player.markAuto("twyizhu", result.cards); - } else event.finish(); - "step 3"; - game.updateRoundNumber(); - game.delayx(); - }, - intro: { - mark: function (dialog, content, player) { - if (player == game.me || player.isUnderControl()) dialog.addAuto(content); - else { - var names = []; - for (var i of content) names.add(i.name); - return get.translation(names); - } - }, - }, - subSkill: { - use: { - audio: "yizhu", - trigger: { global: "useCardToPlayer" }, - filter: function (event, player) { - return ( - player.getStorage("twyizhu").length && - event.player != player && - event.targets.length == 1 && - event.cards.filter(function (i) { - return player.getStorage("twyizhu").includes(i); - }).length > 0 - ); - }, - logTarget: "player", - forced: true, - locked: false, - content: function () { - "step 0"; - var list = []; - if ( - !game.hasPlayer(function (current) { - return ( - current != trigger.target && - lib.filter.targetEnabled2(trigger.card, trigger.player, current) - ); - }) - ) - event.goto(3); - var filter = function (event, player) { - var card = event.card, - info = get.info(card); - if (info.allowMultiple == false) return false; - if (!info.multitarget) { - return game.hasPlayer((current) => - lib.filter.targetEnabled2(card, player, current) - ); - } - return false; - }; - var enable = filter(trigger.getParent(), trigger.player); - var prompt2 = "操作提示:"; - if (enable) prompt2 += "选择一名合法的其他角色,以增加其为目标;或"; - prompt2 += - "选择目标角色(" + - get.translation(trigger.target) + - ")和另一名合法的角色,以取消前者为目标并增加后者为目标"; - player - .chooseTarget( - "遗珠:是否" + (enable ? "增加或" : "") + "修改目标?", - prompt2, - [enable ? 1 : 2, 2], - (card, player, target) => { - var evt = _status.event.getTrigger(), - card = evt.card; - if (target == evt.target) return true; - if ( - ui.selected.targets.length && - ui.selected.targets[0] != evt.target - ) - return false; - return lib.filter.targetEnabled2(card, evt.player, target); - } - ) - .set("targetprompt", (target) => { - return target == _status.event.targetx ? "取消目标" : "增加目标"; - }) - .set("filterOk", () => { - if ( - ui.selected.targets.length == 1 && - ui.selected.targets[0] == _status.event.targetx - ) - return false; - return true; - }) - .set("ai", (target) => { - var evt = _status.event.getTrigger(), - card = evt.card, - player = _status.event.player; - if ( - target == evt.target && - get.effect(evt.target, card, evt.player, player) < 0 - ) - return 100; - if (target == evt.target) return -100; - return get.effect(target, card, evt.player, player); - }) - .set("targetx", trigger.target) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - var target = result.targets[result.targets[0] == trigger.target ? 1 : 0]; - if (result.targets.length > 1) { - player.line2([trigger.target, target]); - trigger.targets.remove(trigger.target); - trigger.getParent().triggeredTargets1.remove(trigger.target); - trigger.untrigger(); - } else player.line(target); - trigger.targets.push(target); - } - "step 2"; - var list = trigger.cards.filter(function (i) { - return player.getStorage("twyizhu").includes(i); - }); - player.unmarkAuto("twyizhu", list); - player.draw(); - game.delayx(); - }, - }, - discard: { - trigger: { - global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - silent: true, - forced: true, - locked: false, - filter: function (event, player) { - return ( - player.getStorage("twyizhu").length && - event.getd().filter(function (i) { - return player.getStorage("twyizhu").includes(i); - }).length > 0 - ); - }, - content: function () { - var list = trigger.getd().filter(function (i) { - return player.getStorage("twyizhu").includes(i); - }); - player.unmarkAuto("twyizhu", list); - }, - }, - }, - }, - twluanchou: { - audio: "luanchou", - enable: "phaseUse", - usable: 1, - selectTarget: 2, - filterTarget: true, - multitarget: true, - multiline: true, - content: function () { - "step 0"; - game.filterPlayer() - .sortBySeat() - .forEach(function (current) { - current.removeSkills("twgonghuan"); - }); - "step 1"; - targets.sortBySeat(); - for (var i of targets) i.addSkills("twgonghuan"); - }, - derivation: "twgonghuan", - ai: { - order: 10, - expose: 0.2, - result: { - target: function (player, target) { - return Math.max(0.1, target.hp) * (get.attitude(player, target) + 20); - }, - }, - }, - }, - twgonghuan: { - audio: "gonghuan", - trigger: { global: "damageBegin4" }, - usable: 1, - filter: function (event, player) { - if (event.player == player) return false; - return ( - !event.twgonghuan && - event.player.hp <= player.hp && - event.player.hasSkill("twgonghuan") - ); - }, - check: function (event, player) { - if ( - get.damageEffect(event.player, event.source, player) > 0 || - (get.attitude(player, event.player) > 0 && - get.damageEffect(event.player, event.source, event.player) > 0) - ) - return false; - return ( - get.attitude(player, event.player) > 0 && - event.player.hp < player.hp && - ((["君", "主"].includes(lib.translate[event.player.identity]) && - !["野", "内"].includes(lib.translate[player.identity])) || - player.hp + player.hujia - event.num > 0) - ); - }, - logTarget: "player", - content: function () { - trigger.cancel(); - player - .damage(trigger.source ? trigger.source : "nosource", trigger.nature, trigger.num) - .set("card", trigger.card) - .set("cards", trigger.cards).twgonghuan = true; - }, - }, - //桥蕤 - twxiawei: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - locked: false, - group: ["twxiawei_init", "twxiawei_lose", "twxiawei_unmark"], - content: function () { - "step 0"; - player - .chooseControl("1", "2", "3", "4", "cancel2") - .set("prompt", get.prompt("twxiawei")) - .set("prompt2", "妄行:将X+1张牌置于武将牌上,称为“威”") - .set("ai", function () { - var player = _status.event.player; - if (player.maxHp > 3) return 3; - return Math.min(3, player.countCards("he") + 1); - }); - "step 1"; - if (result.control != "cancel2") { - var num = result.index + 1, - cards = get.cards(num + 1); - player.logSkill("twxiawei"); - player.addTempSkill("wangxing"); - player.addMark("wangxing", num, false); - player.$gain2(cards, false); - game.log(player, "将", cards, "作为“威”置于了武将牌上"); - player.loseToSpecial(cards, "twxiawei").visible = true; - } else event.finish(); - "step 2"; - player.markSkill("twxiawei"); - game.delayx(); - }, - marktext: "威", - intro: { - mark: function (dialog, storage, player) { - var cards = player.getCards("s", function (card) { - return card.hasGaintag("twxiawei"); - }); - if (!cards || !cards.length) return; - dialog.addAuto(cards); - }, - markcount: function (storage, player) { - return player.countCards("s", function (card) { - return card.hasGaintag("twxiawei"); - }); - }, - onunmark: function (storage, player) { - var cards = player.getCards("s", function (card) { - return card.hasGaintag("twxiawei"); - }); - if (cards.length) { - player.loseToDiscardpile(cards); - } - }, - }, - mod: { - aiOrder: function (player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("twxiawei")) return num + 0.5; - }, - }, - subSkill: { - init: { - audio: "twxiawei", - trigger: { global: "phaseBefore", player: "enterGame" }, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - locked: false, - content: function () { - "step 0"; - var cards = []; - for (var i = 1; i <= 2; i++) { - var card = get.cardPile2(function (card) { - return !cards.includes(card) && get.type(card) == "basic"; - }); - if (card) cards.push(card); - } - if (cards.length) { - player.$gain2(cards, false); - game.log(player, "将", cards, "作为“威”置于了武将牌上"); - player.loseToSpecial(cards, "twxiawei").visible = true; - } else event.finish(); - "step 1"; - player.markSkill("twxiawei"); - game.delayx(); - }, - }, - lose: { - audio: "twxiawei", - trigger: { player: "phaseBegin" }, - filter: function (event, player) { - return player.countCards("s", function (card) { - return card.hasGaintag("twxiawei"); - }); - }, - forced: true, - locked: false, - content: function () { - var cards = player.getCards("s", function (card) { - return card.hasGaintag("twxiawei"); - }); - player.loseToDiscardpile(cards); - }, - }, - unmark: { - trigger: { player: "loseAfter" }, - filter: function (event, player) { - if (!event.ss || !event.ss.length) return false; - return !player.countCards("s", function (card) { - return card.hasGaintag("twxiawei"); - }); - }, - charlotte: true, - forced: true, - silent: true, - content: function () { - player.unmarkSkill("twxiawei"); - }, - }, - }, - }, - wangxing: { - trigger: { player: "phaseEnd" }, - charlotte: true, - onremove: true, - forced: true, - popup: false, - filter: function (event, player) { - return player.countMark("wangxing") > 0; - }, - content: function () { - "step 0"; - player - .chooseToDiscard( - "he", - player.countMark("wangxing"), - "妄行:请弃置" + - get.cnNumber(player.countMark("wangxing")) + - "张牌,或减1点体力上限" - ) - .set("ai", function (card) { - var player = _status.event.player; - if (player.maxHp == 1) return 100 - get.value(card); - return 5 + Math.max(0, 5 - player.maxHp) - get.value(card); - }); - "step 1"; - if (!result.bool) player.loseMaxHp(); - }, - intro: { content: "回合结束时,你须弃置#张牌,否则减1点体力上限" }, - }, - twqiongji: { - audio: 2, - trigger: { player: ["useCardAfter", "respondAfter", "damageBegin3"] }, - filter: function (event, player) { - if (event.name == "damage") - return !player.countCards("s", function (card) { - return card.hasGaintag("twxiawei"); - }); - return ( - !player.hasSkill("twqiongji_silent") && - player.getHistory("lose", function (evt) { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("twxiawei")) return true; - } - return false; - }).length > 0 - ); - }, - forced: true, - content: function () { - if (trigger.name == "damage") trigger.num++; - else { - player.draw(); - player.addTempSkill("twqiongji_silent"); - } - }, - ai: { - combo: "twxiawei", - halfneg: true, - }, - subSkill: { silent: { charlotte: true } }, - }, - //卞夫人 - twwanwei: { - audio: "wanwei", - trigger: { global: "damageBegin4" }, - filter: function (event, player) { - return event.player.isMinHp(); - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0 && event.player.hp < player.hp; - }, - usable: 1, - logTarget: "player", - prompt2: function (event, player) { - if (player != event.player) { - return ( - "防止" + - get.translation(event.player) + - "即将受到的" + - event.num + - "点伤害,然后你失去1点体力" - ); - } else if ( - event.player == player || - !game.hasPlayer(function (current) { - return current != player && current.maxHp > player.maxHp; - }) - ) { - return "于当前回合的结束阶段获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之"; - } - }, - content: function () { - if (trigger.player != player) { - trigger.cancel(); - player.loseHp(); - } - if ( - trigger.player == player || - !game.hasPlayer(function (current) { - return current != player && current.maxHp > player.maxHp; - }) - ) - player.addTempSkill("twwanwei_effect"); - }, - subSkill: { - effect: { - audio: "wanwei", - charlotte: true, - trigger: { global: "phaseJieshuBegin" }, - prompt2: "获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之", - content: function () { - "step 0"; - var card = get.cards()[0]; - player.gain(card, "gain2"); - "step 1"; - var card = get.bottomCards()[0]; - ui.cardPile.appendChild(card); - game.updateRoundNumber(); - player.showCards([card], get.translation(player) + "挽危:牌堆底的牌"); - if (player.hasUseTarget(card)) player.chooseUseTarget(card, true); - }, - }, - }, - }, - twyuejian: { - audio: "yuejian", - enable: "phaseUse", - filterCard: true, - selectCard: function () { - var player = _status.event.player; - var num = Math.max(1, player.countCards("h") - player.getHandcardLimit()); - return [1, num]; - }, - complexCard: true, - discard: false, - loseTo: "cardPile", - insert: true, - visible: true, - delay: false, - position: "he", - usable: 1, - check: function (card) { - if (ui.selected.cards.length >= 3) return 0; - var player = _status.event.player; - var num = Math.max(1, player.countCards("h") - player.getHandcardLimit()); - if (num >= 3) return 5 - get.value(card); - if (num >= 2 && player.isDamaged() && ui.selected.cards.length < 1) - return 7 - get.value(card); - if (num >= 1 && player.isDamaged() && !ui.selected.cards.length) - return 6 - get.value(card); - return 0; - }, - content: function () { - "step 0"; - player.$throw(cards.length); - var next = player.chooseToMove(); - next.set("list", [["牌堆顶", cards], ["牌堆底"]]); - next.set("prompt", "约俭:将这些牌置于牌堆顶或牌堆底"); - next.set("processAI", function (list) { - var cards = list[0][1], - player = _status.event.player; - var target = player.next; - var att = get.sgn(get.attitude(player, target)); - var top = []; - var judges = target.getCards("j"); - var stopped = false; - if (player != target || !target.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)) * att; - }); - if (judge(cards[0]) * att < 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)) * att; - }); - while (cards.length) { - if (get.value(cards[0], player) <= 5 == att > 0) break; - top.unshift(cards.shift()); - } - } - bottom = cards.sort(function (a, b) { - return player.getUseValue(a) - player.getUseValue(b); - }); - 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++) { - top[i].fix(); - ui.cardPile.insertBefore(top[i], ui.cardPile.firstChild); - } - for (i = 0; i < bottom.length; i++) { - bottom[i].fix(); - 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(); - "step 2"; - if (cards.length >= 3) player.gainMaxHp(); - "step 3"; - if (cards.length >= 2) player.recover(); - "step 4"; - if (cards.length >= 1) { - player.addSkill("twyuejian_effect"); - player.addMark("twyuejian_effect", 1, false); - } - }, - ai: { - order: 5, - result: { player: 1 }, - }, - subSkill: { - effect: { - charlotte: true, - onremove: true, - marktext: "俭", - intro: { - content: "手牌上限+#", - }, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("twyuejian_effect"); - }, - }, - }, - }, - }, - //陈震 - twmuyue: { - audio: 1, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("he") || player.hasSkill("twmuyue_effect"); - }, - chooseButton: { - dialog: function () { - var list = []; - for (var i of lib.inpile) { - var type = get.type(i); - if (type == "basic" || type == "trick") list.push([type, "", i]); - } - return ui.create.dialog("睦约", [list, "vcard"]); - }, - check: function (button) { - if ( - !get.cardPile2(function (cardx) { - return cardx.name == button.link[2]; - }) - ) - return 0; - return get.value({ name: button.link[2] }); - }, - backup: function (links, player) { - return { - audio: "twmuyue", - filterCard: function (card, player, target) { - return !player.hasSkill("twmuyue_effect"); - }, - selectCard: function () { - var player = _status.event.player; - return player.hasSkill("twmuyue_effect") ? -1 : 1; - }, - check: function (card) { - return 7 - get.value(card); - }, - position: "he", - card: links[0], - filterTarget: true, - content: function () { - "step 0"; - var card = lib.skill.twmuyue_backup.card; - event.card = card; - player.removeSkill("twmuyue_effect"); - var cardx = get.cardPile2(function (cardx) { - return cardx.name == card[2]; - }); - player.line(target, "green"); - if (cardx) target.gain(cardx, "gain2"); - else { - player.chat("无牌可得了吗?!"); - game.log( - "但是牌堆中已经没有", - "#g【" + get.translation(card[2]) + "】", - "了!" - ); - } - "step 1"; - if (cards && cards.length && get.name(cards[0], player) == card[2]) - player.addSkill("twmuyue_effect"); - }, - ai: { - result: { - target: function (player, target) { - var att = Math.abs(get.attitude(player, target)); - if (target.hasSkill("nogain")) att /= 10; - return att / Math.sqrt(get.distance(player, target, "absolute")); - }, - }, - }, - }; - }, - prompt: function (links, player) { - return ( - (player.hasSkill("twmuyue_effect") ? "" : "弃置一张牌,") + - "令一名角色从牌堆中获得一张【" + - get.translation(links[0][2]) + - "】" - ); - }, - }, - ai: { - order: 3, - result: { player: 1 }, - }, - subSkill: { - effect: { - charlotte: true, - mark: true, - intro: { content: "下一次发动【睦约】无需弃牌" }, - }, - backup: {}, - }, - }, - twchayi: { - audio: 1, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twchayi"), lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player; - return -get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twchayi", target); - if (!target.countCards("h")) event._result = { index: 1 }; - else - target - .chooseControl() - .set("choiceList", ["展示手牌", "下一次使用牌时候弃一张牌"]); - } else event.finish(); - "step 2"; - target.storage.twchayi_re = [result.index, target.countCards("h")]; - target.addSkill("twchayi_re"); - target.markSkill("twchayi_re"); - if (result.index == 0) - target.showCards(target.getCards("h"), get.translation(target) + "的手牌"); - else { - target.addMark("twchayi_effect", 1, false); - target.addSkill("twchayi_effect"); - } - }, - subSkill: { - effect: { - intro: { content: "使用下一张牌时弃置&张牌" }, - charlotte: true, - onremove: true, - audio: "twchayi", - trigger: { player: "useCard" }, - forced: true, - content: function () { - player.chooseToDiscard("he", true, player.countMark("twchayi_effect")); - player.removeSkill("twchayi_effect"); - }, - }, - re: { - charlotte: true, - onremove: true, - audio: "twchayi", - trigger: { player: "phaseEnd" }, - direct: true, - filter: function (event, player) { - return player.storage.twchayi_re; - }, - content: function () { - if (player.countCards("h") != player.storage.twchayi_re[1]) { - player.popup("察异"); - if (player.storage.twchayi_re[0] == 0) { - player.addMark("twchayi_effect", 1, false); - player.addSkill("twchayi_effect"); - } else - player.showCards( - player.getCards("h"), - get.translation(player) + "的手牌" - ); - } - player.removeSkill("twchayi_re"); - }, - marktext: "异", - intro: { - markcount: function (storage, player) { - if (!storage || !storage.length) return 0; - return storage[1]; - }, - content: function (storage, player) { - if (!storage || !storage.length) return; - return ( - "下个回合结束时,若你的手牌数不为" + - storage[1] + - ",你" + - (storage[0] == 0 ? "下次使用牌时弃置一张牌" : "展示所有手牌") - ); - }, - }, - }, - }, - }, - //费祎 - twshengxi: { - audio: "shengxi_feiyi", - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return ( - player.getHistory("useCard").length > 0 && - player.getHistory("sourceDamage").length == 0 - ); - }, - direct: true, - content: function () { - "step 0"; - var list = get.zhinangs(); - player - .chooseButton([ - "###" + get.prompt("twshengxi") + "###获得一张智囊并摸一张牌", - [list, "vcard"], - ]) - .set("ai", function (card) { - return ( - (Math.random() + 0.5) * - get.value({ name: card.link[2] }, _status.event.player) - ); - }); - "step 1"; - if (result.bool) { - player.logSkill("twshengxi"); - var card = get.cardPile2(function (card) { - return card.name == result.links[0][2]; - }); - if (card) player.gain(card, "gain2"); - player.draw(); - } - }, - group: "twshengxi_zhunbei", - subfrequent: ["zhunbei"], - subSkill: { - zhunbei: { - audio: "shengxi_feiyi", - trigger: { player: "phaseZhunbeiBegin" }, - frequent: true, - prompt2: "从游戏外或牌堆中获得一张【调剂盐梅】", - content: function () { - if (!_status.tiaojiyanmei_suits || _status.tiaojiyanmei_suits.length > 0) { - if (!lib.inpile.includes("tiaojiyanmei")) { - game.broadcastAll(function () { - lib.inpile.add("tiaojiyanmei"); - }); - } - if (!_status.tiaojiyanmei_suits) - _status.tiaojiyanmei_suits = lib.suit.slice(0); - player.gain( - game.createCard2( - "tiaojiyanmei", - _status.tiaojiyanmei_suits.randomRemove(), - 6 - ), - "gain2" - ); - } else { - var card = get.cardPile2(function (card) { - return card.name == "tiaojiyanmei"; - }); - if (card) player.gain(card, "gain2"); - } - }, - }, - }, - }, - twkuanji: { - audio: "fyjianyu", - trigger: { - player: "loseAfter", - global: ["cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], - }, - filter: function (event, player) { - if (event.name != "cardsDiscard") { - return event.getd(player, "cards2").length > 0; - } else { - if (event.cards.filterInD("d").length <= 0) return false; - var evt = event.getParent(); - if (evt.name != "orderingDiscard") return false; - var evtx = evt.relatedEvent || evt.getParent(); - if (evtx.player != player) return false; - if (evtx.name == "useCard") return false; - return player.hasHistory("lose", (evtxx) => { - return evtx == (evtxx.relatedEvent || evtxx.getParent()); - }); - } - }, - usable: 1, - direct: true, - content: function () { - "step 0"; - var cards = []; - if (trigger.name != "cardsDiscard") { - cards = trigger.getd(player, "cards2"); - } else cards = trigger.cards.filterInD("d"); - player - .chooseButton(["宽济:是否将一张牌交给一名其他角色?", cards]) - .set("ai", function (button) { - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0; - }) - ) - return Math.abs(get.value(button.link, "raw")) + 1; - return -get.value(button.link, "raw"); - }); - "step 1"; - if (result.bool) { - var card = result.links[0]; - event.card = card; - player - .chooseTarget( - "请选择【宽济】的目标", - "令一名其他角色获得" + get.translation(card), - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player; - return ( - get.attitude(player, target) * - get.value(_status.event.getParent().card, target) * - (target.hasSkillTag("nogain") ? 0.1 : 1) - ); - }); - } else { - player.storage.counttrigger.twkuanji--; - event.finish(); - } - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twkuanji", target); - target.gain(card, "gain2"); - } - }, - }, - shengxi_feiyi: { audio: 2 }, - //王越 - twyulong: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - if (!event.isFirstTarget) return false; - if (event.card.name != "sha") return false; - return event.targets.some((target) => player.canCompare(target)); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twyulong"), (card, player, target) => { - return ( - _status.event.getTrigger().targets.includes(target) && - player.canCompare(target) - ); - }) - .set("ai", (target) => { - if (player.hasCard((card) => get.value(card) < 6, "h")) - return -get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twyulong", target); - if (player.canCompare(target)) { - player.chooseToCompare(target); - } - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - var color = get.color(result.player, false); - if (color == "black") trigger.getParent().baseDamage++; - else if (color == "red") trigger.directHit.addArray(game.players); - trigger.getParent().twyulong = true; - player.addTempSkill("twyulong_addCount"); - } - }, - subSkill: { - addCount: { - charlotte: true, - forced: true, - trigger: { source: "damageSource" }, - filter: function (event, player) { - if (!event.card || event.card.name != "sha") return false; - var evt = event.getParent(2); - if (evt.name != "useCard" || !evt.twyulong) return false; - return true; - }, - content: function () { - var evt = trigger.getParent(2); - if (evt.addCount !== false) { - evt.addCount = false; - if (player.stat[player.stat.length - 1].card.sha > 0) { - player.stat[player.stat.length - 1].card.sha--; - } - } - }, - }, - }, - }, - twjianming: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - filter: function (event, player) { - if (event.card.name != "sha" || !lib.suit.includes(get.suit(event.card))) return false; - var list = []; - player.getHistory("useCard", function (evt) { - if (evt.card.name == "sha") { - if (event.card != evt.card) list.push(get.suit(evt.card)); - } - }); - player.getHistory("respond", function (evt) { - if (evt.card.name == "sha") { - if (event.card != evt.card) list.push(get.suit(evt.card)); - } - }); - return !list.includes(get.suit(event.card)); - }, - forced: true, - content: function () { - player.draw(); - }, - }, - //李彦 - twzhenhu: { - audio: 2, - trigger: { player: "useCardToPlayer" }, - filter: function (event, player) { - if (!event.isFirstTarget || !get.tag(event.card, "damage")) return false; - return ( - !player.hasSkillTag("noCompareSource") && - game.hasPlayer((target) => { - return player.canCompare(target, true); - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twzhenhu"), [1, 3], function (card, player, target) { - return player.canCompare(target, true); - }) - .set("ai", function (target) { - var player = _status.event.player, - targets = _status.event.getTrigger().targets; - var num = 0; - if (player.hasSkill("twlvren")) num += 2 * (ui.selected.targets.length + 1); - if (player.hasSkill("twchuanshu_effect")) num += 3; - var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); - if (hs.length == 0) return -1; - var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); - if (Math.min(13, get.number(hs[0]) + num) <= get.number(ts[0])) return -1; - return ( - get.effect(target, { name: "guohe_copy2" }, player, player) / 2 + - (targets.includes(target) ? get.damageEffect(target, player, player) : 0) - ); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - event.targets = targets; - player.logSkill("twzhenhu", targets); - player.draw(); - } else event.finish(); - "step 2"; - player - .chooseToCompare(targets, function (card) { - return get.number(card); - }) - .setContent("chooseToCompareMeanwhile"); - "step 3"; - if (result.winner && result.winner == player) { - event.targets.remove(result.winner); - player.line(event.targets, trigger.card.nature); - player.addTempSkill("twzhenhu_add"); - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.twzhenhu = event.targets; - } else player.loseHp(); - }, - subSkill: { - add: { - charlotte: true, - onremove: true, - forced: true, - popup: false, - trigger: { global: "damageBegin1" }, - filter: function (event, player) { - if (!event.card || !event.card.storage) return false; - var targets = event.card.storage.twzhenhu; - return targets && targets.includes(event.player); - }, - content: function () { - trigger.num++; - }, - }, - }, - }, - twlvren: { - audio: 2, - trigger: { source: "damageBegin3" }, - filter: function (event, player) { - return event.player != player && event.player.isIn() && !event.player.hasMark("twlvren"); - }, - logTarget: "player", - forced: true, - locked: false, - group: ["twlvren_more", "twlvren_add"], - content: function () { - trigger.player.addMark("twlvren", 1); - }, - ai: { - effect: { - player: function (card, player, target) { - if (target && target.hasMark("twlvren")) return 0.33; - }, - }, - }, - marktext: "刃", - intro: { name2: "刃", content: "mark" }, - subSkill: { - more: { - audio: "twlvren", - trigger: { player: "useCard2" }, - filter: function (event, player) { - var card = event.card, - info = get.info(card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - return ( - get.tag(card, "damage") && - event.targets && - game.hasPlayer(function (target) { - return ( - target.hasMark("twlvren") && - !event.targets.includes(target) && - lib.filter.targetEnabled2(card, player, target) - ); - }) - ); - } - return false; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("twlvren"), - "为" + get.translation(trigger.card) + "额外指定一个有“刃”的角色为目标", - function (card, player, target) { - var evt = _status.event.getTrigger(); - return ( - target.hasMark("twlvren") && - !evt.targets.includes(target) && - lib.filter.targetEnabled2(evt.card, player, target) - ); - } - ) - .set("ai", function (target) { - return get.effect( - target, - _status.event.getTrigger().card, - _status.event.player - ); - }); - "step 1"; - if (result.bool) { - var targets = result.targets; - player.logSkill("twlvren", targets); - player.line(targets, trigger.card.nature); - trigger.targets.addArray(targets); - for (var i of targets) i.removeMark("twlvren", i.countMark("twlvren"), false); - } - }, - }, - add: { - audio: "twlvren", - trigger: { player: "compare", target: "compare" }, - filter: function (event, player) { - if (player != event.target && event.iwhile) return false; - return true; - }, - forced: true, - locked: false, - content: function () { - var num = 2 * trigger.lose_list.length; - if (player == trigger.player) { - trigger.num1 += num; - if (trigger.num1 > 13) trigger.num1 = 13; - } else { - trigger.num2 += num; - if (trigger.num2 > 13) trigger.num2 = 13; - } - game.log(player, "的拼点牌点数+", num); - }, - }, - }, - }, - //童渊 - twchaofeng: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - if (!["sha", "shan"].includes(name)) return false; - return player.hasCard(function (card) { - const name2 = get.name(card); - return (name2 == "sha" || name2 == "shan") && name != name2; - }, "hs"); - }, - filter: function (event, player) { - const names = []; - if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event)) - names.push("shan"); - if (event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) - names.push("sha"); - return ( - names.length > 0 && - player.hasCard(function (card) { - return names.includes(get.name(card)); - }, "hs") - ); - //return false; - }, - group: "twchaofeng_compare", - chooseButton: { - dialog: function (event, player) { - var list = []; - if (event.filterCard({ name: "sha" }, player, event)) { - list.push(["基本", "", "sha"]); - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } - if (event.filterCard({ name: "shan" }, player, event)) { - list.push(["基本", "", "shan"]); - } - var dialog = ui.create.dialog("朝凤", [list, "vcard"], "hidden"); - dialog.direct = true; - return dialog; - }, - check: function (button) { - var player = _status.event.player; - var card = { name: button.link[2], nature: button.link[3] }; - if ( - _status.event.getParent().type != "phase" || - game.hasPlayer(function (current) { - return ( - player.canUse(card, current) && - get.effect(current, card, player, player) > 0 - ); - }) - ) { - switch (button.link[2]) { - case "shan": - return 5; - case "sha": - if (button.link[3] == "fire") return 2.95; - else if (button.link[3] == "thunder" || button.link[3] == "ice") - return 2.92; - else return 2.9; - } - } - return 0; - }, - backup: function (links, player) { - return { - audio: "twchaofeng", - name: links[0][2], - filterCard: function (card, player, target) { - if (lib.skill.twchaofeng_backup.name == "sha") - return get.name(card) == "shan"; - else return get.name(card) == "sha"; - }, - selectCard: 1, - check: function (card, player, target) { - return 6 - get.value(card); - }, - viewAs: { name: links[0][2], nature: links[0][3] }, - position: "hs", - popname: true, - }; - }, - prompt: function (links, player) { - var view, use; - if (links[0][2] == "sha") { - use = "【闪】"; - view = - get.translation(links[0][3] || "") + - "【" + - get.translation(links[0][2]) + - "】"; - } else { - use = "【杀】"; - view = "【闪】"; - } - return ( - "将一张" + - use + - "当做" + - view + - (_status.event.name == "chooseToUse" ? "使用" : "打出") - ); - }, - }, - ai: { - skillTagFilter: function (player, tag) { - var name; - switch (tag) { - case "respondSha": - name = "shan"; - break; - case "respondShan": - name = "sha"; - break; - } - if (!player.countCards("hs", name)) return false; - }, - order: function (item, player) { - if (player && _status.event.type == "phase") { - var max = 0; - if ( - player.countCards("hs", "shan") > 0 && - lib.inpile_nature.some( - (i) => player.getUseValue({ name: "sha", nature: i }) > 0 - ) - ) { - var temp = get.order({ name: "sha" }); - if (temp > max) max = temp; - } - if (max > 0) max += 0.3; - return max; - } - return 4; - }, - result: { - player: 1, - }, - respondSha: true, - respondShan: true, - fireAttack: true, - }, - subSkill: { - compare: { - audio: "twchaofeng", - trigger: { player: "phaseUseBegin" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("twchaofeng"), - "选择至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】", - [1, 3], - (card, player, target) => { - return player.canCompare(target); - } - ) - .set("ai", function (target) { - var player = _status.event.player, - targets = _status.event.getTrigger().targets; - var num = 0, - card = { name: "sha", nature: "fire", isCard: true }; - if (target.hasSkill("twlvren")) - num += 2 * (ui.selected.targets.length + 1); - if (target.hasSkill("twchuanshu_effect")) num += 3; - var hs = player - .getCards("h") - .sort((a, b) => get.number(b) - get.number(a)); - var ts = target - .getCards("h") - .sort((a, b) => get.number(b) - get.number(a)); - if (get.number(hs[0]) <= Math.min(13, get.number(ts[0]) + num)) { - return 6 + get.effect(player, card, target, target); - } - return ( - get.effect(target, { name: "guohe_copy2" }, player, player) / 2 + - get.effect(target, card, player, player) - ); - }); - "step 1"; - if (result.bool) { - event.targets = result.targets; - player.logSkill("twchaofeng_compare", event.targets); - player.chooseToCompare(event.targets).setContent("chooseToCompareMeanwhile"); - } - "step 2"; - if (result.winner) { - var targets = [player].addArray(event.targets).sortBySeat(player); - targets.remove(result.winner); - var card = { name: "sha", nature: "fire", isCard: true }; - var targetsx = targets.filter(function (target) { - return result.winner.canUse(card, target, false); - }); - if (targetsx.length) - result.winner.useCard(card, targetsx, "noai").set("addCount", false); - } - }, - }, - }, - }, - twchuanshu: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - limited: true, - skillAnimation: true, - animationColor: "qun", - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twchuanshu")) - .set("ai", (target) => get.attitude(_status.event.player, target)); - "step 1"; - if (result.bool) { - player.awakenSkill("twchuanshu"); - var target = result.targets[0]; - player.logSkill("twchuanshu", target); - target.addMark("twchuanshu_mark", 1, false); - target.addSkill("twchuanshu_effect"); - target.markAuto("twchuanshu_effect", [player]); - player.addSkill("twchuanshu_clear"); - player.markAuto("twchuanshu_clear", [target]); - } - }, - subSkill: { - mark: { - charlotte: true, - }, - effect: { - audio: "twchuanshu", - trigger: { - player: "compare", - target: "compare", - }, - direct: true, - forced: true, - charlotte: true, - nopop: true, - mark: true, - intro: { - content: function (storage, player) { - var shisyou = player.getStorage("twchuanshu_effect").filter((i) => i.isIn()); - var str = "
  • 拼点牌点数+3;"; - if (player.hasMark("twchuanshu_mark")) { - str += - "
  • 使用的下一张【杀】对除" + - get.translation(shisyou) + - "外的角色造成伤害时,此伤害+" + - player.countMark("twchuanshu_mark") + - ";"; - if (!shisyou.includes(player)) { - str += - "
  • 使用的下一张【杀】结算结束后," + - get.translation(shisyou) + - "摸等同于伤害值的牌;"; - } - } - str = str.slice(0, -1) + "。"; - return str; - }, - }, - filter: function (event, player, name) { - if (event.player == player && event.iwhile > 0) return false; - return (player == event.player ? event.num1 : event.num2) < 13; - }, - content: function () { - game.log(player, "的拼点牌点数+3"); - if (player == trigger.player) trigger.num1 = Math.min(13, trigger.num1 + 3); - else trigger.num2 = Math.min(13, trigger.num2 + 3); - }, - group: "twchuanshu_damage", - }, - damage: { - charlotte: true, - trigger: { player: ["useCard", "useCardAfter"], source: "damageBegin1" }, - filter: function (event, player, name) { - if (name == "useCard") - return event.card.name == "sha" && player.hasMark("twchuanshu_mark"); - if (name == "damageBegin1") - return ( - event.card && - event.card.twchuanshu_mark && - !player.getStorage("twchuanshu_effect").includes(event.player) - ); - return ( - event.card.twchuanshu_mark && - player.hasHistory("sourceDamage", function (evt) { - return evt.card == event.card; - }) && - player.getStorage("twchuanshu_effect").filter(function (target) { - return target.isIn() && target != player; - }).length - ); - }, - forced: true, - content: function () { - var name = event.triggername; - if (name == "useCard") { - var num = player.countMark("twchuanshu_mark"); - trigger.card.twchuanshu_mark = num; - player.removeMark("twchuanshu_mark", num, false); - } else if (name == "damageBegin1") trigger.num++; - else { - var num1 = trigger.card.twchuanshu_mark; - var num2 = 0; - player.getHistory("sourceDamage", function (evt) { - if (evt.card == trigger.card) num2 += evt.num; - }); - var targets = player - .getStorage("twchuanshu_effect") - .filter(function (target) { - return target.isIn() && target != player; - }); - if (targets.length == 1) targets[0].draw(num1 * num2); - else game.asyncDraw(targets, num1 * num2); - } - }, - }, - clear: { - charlotte: true, - onremove: true, - trigger: { player: "phaseBegin" }, - filter: function (event, player) { - return player.getStorage("twchuanshu_clear").length; - }, - forced: true, - silent: true, - content: function () { - "step 0"; - var targets = player.getStorage("twchuanshu_clear"); - for (var target of targets) { - target.unmarkAuto("twchuanshu_effect", [player]); - if (!target.getStorage("twchuanshu_effect").length) - target.removeSkill("twchuanshu_effect"); - } - "step 1"; - player.removeSkill("twchuanshu_clear"); - }, - }, - }, - }, - //徐庶 - twjiange: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - filterCard: function (card, player) { - return get.type(card) != "basic"; - }, - usable: 1, - locked: false, - viewAs: { name: "sha", storage: { twjiange: true } }, - viewAsFilter: function (player) { - if ( - !player.countCards("hes", function (card) { - return get.type(card) != "basic"; - }) - ) - return false; - }, - position: "hes", - selectCard: function () { - return _status.event.skill == "twjiange" ? 1 : Infinity; - }, - precontent: function () { - if (player != _status.currentPhase) { - player - .when({ player: ["useCard", "respond"] }) - .filter((evt) => evt.skill == "twjiange") - .then(() => player.draw()); - } - event.getParent().addCount = false; - }, - prompt: "将一张非基本牌当杀使用或打出", - check: function (card) { - var val = get.value(card); - if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); - return 6 - val; - }, - ai: { - order: function (item, player) { - var target = _status.currentPhase; - if (!target || target != player) return 7; - return 1; - }, - respondSha: true, - skillTagFilter: function (player) { - if ( - !player.countCards("hes", function (card) { - return get.type(card) != "basic"; - }) - ) - return false; - }, - }, - mod: { - targetInRange: function (card) { - if (card.storage && card.storage.twjiange) return true; - }, - cardUsable: function (card, player, num) { - if (card.storage && card.storage.twjiange) return Infinity; - }, - }, - }, - twxiawang: { - audio: 2, - trigger: { global: "damageEnd" }, - filter: function (event, player) { - if ( - !event.source || - get.distance(player, event.player) > 1 || - !player.canUse("sha", event.source, false, false) - ) - return false; - return player.countCards("h") > 0; - }, - direct: true, - content: function () { - player - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "侠望:是否对" + get.translation(trigger.source) + "使用一张杀?") - .set("logSkill", "twxiawang") - .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", trigger.source); - player.addTempSkill("twxiawang_damage"); - }, - subSkill: { - damage: { - trigger: { player: "useCardAfter" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - if (event.card.name != "sha") return false; - if (event.getParent(2).name != "twxiawang") return false; - if (!player.hasHistory("sourceDamage", (evt) => evt.card == event.card)) - return false; - for (var phase of lib.phaseName) { - var evt = event.getParent(phase); - if (evt && evt.name == phase) return true; - } - return false; - }, - content: function () { - player.popup(); - player.removeSkill("twjiange_damage"); - for (var phase of lib.phaseName) { - var evt = event.getParent(phase); - if (evt && evt.name == phase) { - var name = ["准备", "判定", "摸牌", "出牌", "弃牌", "结束"][ - lib.phaseName.indexOf(phase) - ]; - game.log(player, "令", _status.currentPhase, "结束了" + name + "阶段"); - player.line(_status.currentPhase, "thunder"); - evt.skipped = true; - } - } - }, - }, - }, - }, - //好萌 - twgongge: { - audio: 3, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - if (!event.isFirstTarget || !event.targets) return false; - return get.tag(event.card, "damage"); - }, - direct: true, - usable: 1, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twgongge"), function (card, player, target) { - var trigger = _status.event.getTrigger(); - return trigger.targets.includes(target); - }) - .set("ai", function (target) { - var player = _status.event.player; - var trigger = _status.event.getTrigger(); - var att = get.attitude(player, target); - var damageNum = trigger.getParent().baseDamage; - var map = trigger.getParent().customArgs, - id = target.playerid; - if (map[id]) { - if (typeof map[id].baseDamage == "number") damageNum = map[id].baseDamage; - if (typeof map[id].extraDamage == "number") damageNum += map[id].extraDamage; - } - if ( - target.hasSkillTag("filterDamage", null, { - player: trigger.player, - card: trigger.card, - }) - ) - damageNum = 1; - var num = - target.getSkills(null, false, false).filter(function (skill) { - var info = get.info(skill); - return info && !info.charlotte; - }).length + 1; - var list = [0, 0, 0]; - var player = _status.event.player; - list[0] = num; - list[1] = - get.effect(target, { name: "guohe_copy2" }, player, player) > 0 - ? target.hp - damageNum < player.hp - ? num - : num - Math.min(player.getCards("he"), num - 1) - : 0; - if (_status.event.yimie(trigger, player, target, damageNum)) - list[2] = - (get.recoverEffect(target, player, player) > - get.damageEffect(target, player, player) - ? Math.min(num - 1, target.getDamagedHp()) - : num - 1) * 2; - return Math.max.apply(Math, list); - }) - .set("yimie", function (trigger, player, target, damageNum) { - var hit = true; - var att = get.attitude(player, target); - if ( - get.type(trigger.card) == "trick" && - trigger.player.countCards("hs", { name: "wuxie" }) - ) - hit = false; - if ( - trigger.card.name == "huogong" && - trigger.player.countCards("h", function (card) { - var list = []; - for (var i of player.getCards("h")) list.push(get.suit(i)); - return !list.includes(get.suit(card)); - }) - ) - hit = false; - var key; - switch (trigger.card.name) { - case "sha": - case "wanjian": - key = ["shan"]; - break; - case "juedou": - case "nanman": - case "jiedao": - key = ["sha"]; - break; - default: - key = []; - break; - } - if (get.type(trigger.card) == "trick") key.push("wuxie"); - key.push("caochuan"); - var bool1 = get.recoverEffect(target, player, player) > 0 ? 1 : -1; - var bool2 = - (att > 0 && !hit) || - (target.countCards("hs", { name: key }) && - !trigger.getParent().directHit.includes(target)) - ? 1 - : -1; - if (att <= 0 && target.hp - damageNum > 0) return false; - return (bool1 = bool2 && att != 0); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twgongge", target); - var num = - target.getSkills(null, false, false).filter(function (skill) { - var info = get.info(skill); - return info && !info.charlotte; - }).length + 1; - event.num = num; - var list = []; - var choiceList = [ - "摸" + - get.cnNumber(num) + - "张牌,若" + - get.translation(target) + - "响应此牌,则你跳过下个摸牌阶段", - "弃置" + - get.translation(target) + - get.cnNumber(num) + - "张牌,此牌结算完毕后,若" + - get.translation(target) + - "的体力值不小于你,你交给" + - get.translation(target) + - get.cnNumber(num - 1) + - "张牌", - "令此牌对" + - get.translation(target) + - "造成的伤害+" + - (num - 1) + - ",此伤害结算完成后,其回复等量的体力值", - ]; - list.push("摸牌"); - if (target.countDiscardableCards(player, "he")) list.push("拆牌"); - else choiceList[1] = '' + choiceList[1] + ""; - list.push("加伤"); - player - .chooseControl(list) - .set( - "prompt", - "攻阁:请选择一项(" + - get.translation(target) + - "对应X值:" + - (num - 1) + - ")" - ) - .set("ai", () => _status.event.choice) - .set( - "choice", - (function () { - var att = get.attitude(player, target); - var damageNum = trigger.getParent().baseDamage; - var map = trigger.getParent().customArgs, - id = target.playerid; - if (map[id]) { - if (typeof map[id].baseDamage == "number") - damageNum = map[id].baseDamage; - if (typeof map[id].extraDamage == "number") - damageNum += map[id].extraDamage; - } - if ( - target.hasSkillTag("filterDamage", null, { - player: trigger.player, - card: trigger.card, - }) - ) - damageNum = 1; - var yimie = function () { - if (damageNum == 1) return false; - var hit = true; - if ( - get.type(trigger.card) == "trick" && - trigger.player.countCards("hs", { name: "wuxie" }) - ) - hit = false; - if ( - trigger.card.name == "huogong" && - trigger.player.countCards("h", function (card) { - var list = []; - for (var i of player.getCards("h")) list.push(get.suit(i)); - return !list.includes(get.suit(card)); - }) - ) - hit = false; - var key; - switch (trigger.card.name) { - case "sha": - case "wanjian": - key = ["shan"]; - break; - case "juedou": - case "nanman": - case "jiedao": - key = ["sha"]; - break; - default: - key = []; - break; - } - key.push("caochuan"); - var bool1 = get.recoverEffect(target, player, player) > 0 ? 1 : -1; - var bool2 = - (att > 0 && !hit) || - (target.countCards("hs", { name: key }) && - !trigger.getParent().directHit.includes(target)) - ? 1 - : -1; - if (att <= 0 && target.hp - damageNum > 0) return false; - return (bool1 = bool2 && att != 0); - }; - if (yimie()) return "加伤"; - if ( - list.includes("拆牌") && - get.effect(target, { name: "guohe_copy2" }, player, player) > 0 && - target.hp - damageNum < player.hp - ) - return "拆牌"; - return "摸牌"; - })() - ) - .set("choiceList", choiceList); - } else { - player.storage.counttrigger.twgongge--; - event.finish(); - } - "step 2"; - game.log(player, "选择了", "#y" + result.control); - switch (result.control) { - case "摸牌": - player.draw(num); - player.addTempSkill("twgongge_buff1"); - var evt = { - card: trigger.card, - target: target, - }; - player.storage.twgongge_buff1 = evt; - break; - case "拆牌": - player.discardPlayerCard(num, target, "he", true); - player.addTempSkill("twgongge_buff2"); - var evt = { - card: trigger.card, - target: target, - num: num - 1, - }; - player.storage.twgongge_buff2 = evt; - break; - case "加伤": - player.addTempSkill("twgongge_buff3"); - var evt = { - card: trigger.card, - target: target, - num: num - 1, - }; - player.storage.twgongge_buff3 = evt; - break; - } - }, - subSkill: { - //摸牌后续 - buff1: { - charlotte: true, - onremove: true, - trigger: { global: ["useCard", "respond"] }, - filter: function (event, player) { - if (player.skipList.includes("phaseDraw")) return false; - if (!Array.isArray(event.respondTo) || player != event.respondTo[0]) return false; - var evt = player.storage.twgongge_buff1; - if (evt.target == event.player && evt.card == event.respondTo[1]) return true; - return false; - }, - direct: true, - popup: false, - content: function () { - player.skip("phaseDraw"); - game.log(player, "跳过了下个", "#g摸牌阶段"); - player.addTempSkill("twgongge_buff1_mark", "phaseDrawSkipped"); - }, - }, - //拆牌后续 - buff2: { - charlotte: true, - onremove: true, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - if (!player.countCards("he")) return false; - var evt = player.storage.twgongge_buff2; - if (evt.card == event.card && evt.target.isIn() && evt.target.hp >= player.hp) - return true; - return false; - }, - direct: true, - popup: false, - content: function () { - "step 0"; - var evt = player.storage.twgongge_buff2; - var target = evt.target, - num = evt.num; - event.target = target; - if (player.countCards("he") <= num) - event._result = { bool: true, cards: player.getCards("he") }; - else - player.chooseCard( - "he", - num, - "攻阁:交给" + get.translation(target) + get.cnNumber(num) + "张牌", - true - ); - "step 1"; - if (result.bool) player.give(result.cards, target); - }, - }, - //加伤后续 - buff3: { - charlotte: true, - onremove: true, - trigger: { source: "damageBegin1", player: "useCardAfter" }, - filter: function (event, player) { - if (!event.card) return false; - var evt = player.storage.twgongge_buff3; - if ( - evt.card == event.card && - evt.target.isIn() && - (event.name == "useCard" || event.player == evt.target) - ) - return true; - return false; - }, - direct: true, - popup: false, - content: function () { - var evt = player.storage.twgongge_buff3; - if (trigger.name == "damage") trigger.num += evt.num; - else if (evt.target.isIn()) evt.target.recover(evt.num); - }, - }, - buff1_mark: { - mark: true, - intro: { - content: "跳过下一个摸牌阶段", - }, - }, - }, - }, - //魏续 - twsuizheng: { - audio: 3, - trigger: { global: "phaseBefore", player: "enterGame" }, - filter: function (event, player) { - return ( - game.hasPlayer((current) => current != player) && - (event.name != "phase" || game.phaseNumber == 0) - ); - }, - forced: true, - content: function () { - "step 0"; - player - .chooseTarget( - "请选择【随征】的目标", - lib.translate.twsuizheng_info, - lib.filter.notMe, - true - ) - .set("ai", function (target) { - var player = _status.event.player; - return Math.max( - 1 + get.attitude(player, target) * get.threaten(target), - Math.random() - ); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - game.log(player, "选择了", target, "作为", "“随征”角色"); - player.markAuto("twsuizheng", [target]); - player.addSkill("twsuizheng_draw"); - player.addSkill("twsuizheng_xianfu"); - } - }, - ai: { expose: 0.3 }, - intro: { content: "已选择$为“随征”角色" }, - subSkill: { - draw: { - charlotte: true, - audio: "twsuizheng", - trigger: { global: "damageSource" }, - filter: function (event, player) { - return player.getStorage("twsuizheng").includes(event.source); - }, - forced: true, - logTarget: "source", - content: function () { - player.draw(); - }, - }, - xianfu: { - audio: "twsuizheng", - trigger: { global: "damageEnd" }, - filter: function (event, player) { - return ( - player.getStorage("twsuizheng").includes(event.player) && event.player.isIn() - ); - }, - forced: true, - charlotte: true, - logTarget: "player", - content: function () { - "step 0"; - player - .chooseToDiscard( - 2, - "随征:弃置两张基本牌", - "若你弃牌,你令" + - get.translation(trigger.player) + - "回复1点体力;或点击“取消”失去1点体力,令" + - get.translation(trigger.player) + - "获得一张【杀】或【决斗】", - { type: "basic" } - ) - .set("ai", function (card) { - if (_status.event.refuse) return -1; - return 6 - get.value(card); - }) - .set( - "refuse", - get.attitude(player, trigger.player) <= 0 || - get.effect(player, { name: "losehp" }) >= 0 - ); - "step 1"; - if (result.bool) trigger.player.recover(); - else { - player.loseHp(); - var card = get.cardPile(function (card) { - return card.name == "sha" || card.name == "juedou"; - }); - if (card) trigger.player.gain(card, "gain2"); - } - }, - }, - }, - }, - twtuidao: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - var targets = player.getStorage("twsuizheng"); - if (!targets.length) return false; - return targets.some((target) => target.hp <= 2 || !target.isIn()); - }, - check: function (event, player) { - var targets = player.getStorage("twsuizheng"); - var val = 0; - for (var target of targets) { - if (target.hp <= 2 && target.isIn()) val -= get.attitude(player, target); - else if (!target.isIn()) val += 6; - } - return val > 0; - }, - limited: true, - skillAnimation: true, - animationColor: "thunder", - content: function () { - "step 0"; - player.awakenSkill("twtuidao"); - var list1 = ["equip3", "equip4"].map((i) => get.translation(i)), - list2 = ["basic", "trick", "equip"].map((i) => get.translation(i)); - var targets = player.getStorage("twsuizheng"), - str = get.translation(targets); - if (targets.length) str = "与" + str; - player - .chooseButton(2, true, [ - "颓盗:废除你" + str + "的一个坐骑栏废除并选择一个类别", - "坐骑栏", - [list1, "tdnodes"], - "类别", - [list2, "tdnodes"], - ]) - .set("filterButton", function (button) { - var list = _status.event.list, - link = button.link; - if (ui.selected.buttons.length) { - if (list.includes(ui.selected.buttons[0].link) && list.includes(link)) - return false; - if (!list.includes(ui.selected.buttons[0].link) && !list.includes(link)) - return false; - } - return true; - }) - .set("ai", function (button) { - var player = _status.event.player; - var list = _status.event.list, - link = button.link; - if (list.includes(link)) { - if (player.hasDisabledSlot(4)) return "攻击马"; - if (player.hasDisabledSlot(3)) return "防御马"; - return "攻击马"; - } - if (!list.includes(link)) { - var player = _status.event.player; - var targets = player.getStorage("twsuizheng"); - for (var target of targets) { - if (target.isIn()) { - var listx = [0, 0, 0], - list2 = ["basic", "trick", "equip"].map((i) => - get.translation(i) - ); - for (var i of target.getCards("he")) - listx[list2.indexOf(get.translation(get.type2(i)))]++; - return list2[listx.indexOf(Math.max.apply(Math, listx))]; - } - } - return 1 + Math.random(); - } - }) - .set("list", list1); - "step 1"; - if (result.links[0].indexOf("马") == -1) result.links.reverse(); - var subtype = result.links[0] == "防御马" ? "equip3" : "equip4", - type = { 基本: "basic", 锦囊: "trick", 装备: "equip" }[result.links[1]]; - player.disableEquip(subtype); - var targets = player.getStorage("twsuizheng"); - for (var target of targets) { - if (target && target.isIn()) { - target.disableEquip(subtype); - var cards = target.getCards("he", (card) => get.type2(card) == type); - player.gain(cards, target, "give"); - event.gainners = cards; - } else { - var cards = []; - for (var i = 1; i <= 2; i++) { - var card = get.cardPile2(function (card) { - return !cards.includes(card) && get.type2(card) == type; - }); - if (card) cards.push(card); - else break; - } - player.gain(cards, "gain2"); - event.gainners = cards; - } - } - "step 2"; - player - .chooseTarget("请重新选择【随征】目标", true, function (card, player, target) { - return !player.getStorage("twsuizheng").includes(target); - }) - .set("ai", function (target) { - var player = _status.event.player; - return Math.max( - 1 + get.attitude(player, target) * get.threaten(target), - Math.random() - ); - }); - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - game.log(player, "选择了", target, "作为", "“随征”角色"); - delete player.storage.twsuizheng; - player.markAuto("twsuizheng", [target]); - } - }, - ai: { combo: "twsuizheng" }, - }, - //曹休 - twqianju: { - audio: 2, - trigger: { source: "damageSource" }, - filter: function (event, player) { - return get.distance(player, event.player) <= 1 && player.countCards("e") < 5; - }, - forced: true, - usable: 1, - content: function () { - var card = get.cardPile(function (card) { - return get.type(card) == "equip" && player.canEquip(card); - }); - if (card) { - player.$gain2(card); - game.delayx(); - player.equip(card); - } - }, - mod: { - globalFrom: function (from, to, distance) { - return distance - from.countCards("e"); - }, - }, - }, - twqingxi: { - audio: "xinqingxi", - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return ( - event.card.name == "sha" && - player - .getHistory("useCard", (evt) => evt.card.name == "sha") - .indexOf(event.getParent()) == 0 - ); - }, - check: function (event, player) { - return true; - }, - logTarget: "target", - content: function () { - "step 0"; - var target = trigger.target; - event.target = target; - if (!target.countCards("e")) event._result = { index: 0 }; - else - target - .chooseControl() - .set("ai", function () { - if (_status.event.goon || player.hp > 2) return 0; - return 1; - }) - .set("choiceList", [ - "令" + - get.translation(player) + - "摸" + - get.cnNumber(Math.max(1, player.countCards("e"))) + - "张牌,且此【杀】不可被响应", - "弃置装备区中的所有牌并弃置" + - get.translation(player) + - "装备区等量的牌,此【杀】造成的伤害+1", - ]) - .set("goon", get.attitude(target, player) > 0); - "step 1"; - if (result.index == 0) { - player.draw(Math.max(1, player.countCards("e"))); - trigger.getParent().directHit.add(target); - game.log(trigger.card, "不可被", target, "响应"); - event.finish(); - } else { - var num = target.countCards("e"); - target.discard(target.getCards("e")); - target.discardPlayerCard(player, "e", num, true); - } - "step 2"; - var map = trigger.customArgs; - var id = target.playerid; - if (!map[id]) map[id] = {}; - if (!map[id].extraDamage) map[id].extraDamage = 0; - map[id].extraDamage++; - game.log(trigger.card, "对", target, "造成的伤害+1"); - game.delayx(); - }, - }, - //孙翊 - twzaoli: { - audio: "zaoli", - trigger: { player: "phaseUseBegin" }, - init: function (player) { - if (player.isPhaseUsing()) { - var hs = player.getCards("h"); - player.getHistory("gain", function (evt) { - hs.removeArray(evt.cards); - }); - if (hs.length) player.addGaintag(hs, "twzaoli"); - } - }, - filter: function (event, player) { - return player.countCards("he"); - }, - forced: true, - group: "twzaoli_mark", - content: function () { - "step 0"; - if (player.countCards("h", (card) => get.type(card) != "equip")) { - player - .chooseCard( - "h", - [1, Infinity], - true, - "躁厉:请选择至少一张非装备手牌,你弃置这些牌和所有装备牌", - (card, player) => { - return ( - get.type(card) != "equip" && - lib.filter.cardDiscardable(card, player, "twzaoli") - ); - } - ) - .set("ai", function (card) { - if (!card.hasGaintag("twzaoli_temp")) return 5 - get.value(card); - return 1; - }); - } - "step 1"; - var cards = player.getCards("he", { type: "equip" }); - var subtype = []; - event.subtype = subtype.addArray(cards.map((card) => get.subtype(card))); - cards.addArray(result.cards || []); - if (cards.length) player.discard(cards); - event.cards = cards; - "step 2"; - player.draw(cards.length); - "step 3"; - var num = 0; - if (event.subtype.length) { - for (var i of event.subtype) { - var card = get.cardPile2(function (card) { - return get.type(card) == "equip" && get.subtype(card) == i; - }); - if (card) { - num++; - player.$gain2(card); - game.delayx(); - player.equip(card); - } - } - } - if (num <= 2) event.finish(); - "step 4"; - player.loseHp(); - }, - onremove: function (player) { - player.removeGaintag("twzaoli"); - }, - mod: { - cardEnabled2: function (card, player) { - if ( - player.isPhaseUsing() && - get.itemtype(card) == "card" && - card.hasGaintag("twzaoli") - ) - return false; - }, - }, - subSkill: { - mark: { - trigger: { player: ["phaseUseBegin", "phaseUseAfter", "phaseAfter"] }, - filter: function (event, player) { - return player.countCards("h"); - }, - direct: true, - firstDo: true, - content: function () { - if (event.triggername == "phaseUseBegin") { - var hs = player.getCards("h"); - player.getHistory("gain", function (evt) { - hs.removeArray(evt.cards); - }); - if (hs.length) player.addGaintag(hs, "twzaoli"); - } else { - player.removeGaintag("twzaoli"); - } - }, - }, - }, - }, - //邓芝 - twjimeng: { - audio: "jimeng", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countGainableCards(player, "he") > 0; - }); - }, - filterTarget: function (card, player, target) { - return target != player && target.countGainableCards(player, "hej") > 0; - }, - content: function () { - "step 0"; - player.gainPlayerCard(target, "hej", true); - "step 1"; - var hs = player.getCards("he"); - if (hs.length) { - if (hs.length == 1) event._result = { bool: true, cards: hs }; - else player.chooseCard(true, "交给" + get.translation(target) + "一张牌", "he", true); - } else event.finish(); - "step 2"; - player.give(result.cards, target); - "step 3"; - if (target.hp >= player.hp) player.draw(); - }, - ai: { - order: 8, - result: { - player: function (player, target) { - if (target.hp >= player.hp) return 1; - return 0; - }, - target: function (player, target) { - return get.effect(target, { name: "shunshou" }, player, target) / 10; - }, - }, - }, - }, - //杨仪 - twgongsun: { - audio: "gongsun", - trigger: { player: "phaseUseBegin" }, - forced: true, - direct: true, - filter: function (event, player) { - return game.hasPlayer((current) => player.inRange(current)); - }, - content: function () { - "step 0"; - player - .chooseTarget( - "共损:请选择一名攻击范围内的角色", - lib.translate.twgongsun_info, - true, - function (card, player, target) { - return player != target && player.inRange(target); - } - ) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target) * (1 + target.countCards("h")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twgongsun", target); - player.addTempSkill("twgongsun_shadow", { player: ["phaseBegin", "die"] }); - player - .chooseControl(lib.suit) - .set("prompt", "共损:请选择一个花色") - .set("ai", function (button) { - return lib.suit.randomGet(); - }); - } else event.finish(); - "step 2"; - var suit = result.control; - player.popup(suit + 2, "soil"); - game.log(player, "选择了", suit + 2); - player.storage.twgongsun_shadow.push([target, suit]); - player.markSkill("twgongsun_shadow"); - }, - }, - twgongsun_shadow: { - global: "twgongsun_shadow2", - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - marktext: "损", - onremove: true, - intro: { - content: function (shadow) { - var str = ""; - for (var i = 0; i < shadow.length; i++) { - if (i > 0) str += "
    "; - str += get.translation(shadow[i][0]); - str += ":"; - str += get.translation(shadow[i][1]); - } - return str; - }, - }, - mod: { - cardEnabled: function (card, player) { - var list = player.storage.twgongsun_shadow; - for (var i = 0; i < list.length; i++) { - if (list[i][1] == card.suit) return false; - } - }, - cardRespondable: function (card, player) { - var list = player.storage.twgongsun_shadow; - for (var i = 0; i < list.length; i++) { - if (list[i][1] == card.suit) return false; - } - }, - cardSavable: function (card, player) { - var list = player.storage.twgongsun_shadow; - for (var i = 0; i < list.length; i++) { - if (list[i][1] == card.suit) return false; - } - }, - cardDiscardable: function (card, player) { - var list = player.storage.twgongsun_shadow; - for (var i = 0; i < list.length; i++) { - if (list[i][1] == card.suit) return false; - } - }, - }, - }, - twgongsun_shadow2: { - mod: { - cardEnabled: function (card, player) { - if ( - game.hasPlayer(function (current) { - var list = current.storage.twgongsun_shadow; - if (!list) return false; - for (var i = 0; i < list.length; i++) { - if (list[i][0] == player && list[i][1] == card.suit) return true; - } - return false; - }) - ) - return false; - }, - cardSavable: function (card, player) { - if ( - game.hasPlayer(function (current) { - var list = current.storage.twgongsun_shadow; - if (!list) return false; - for (var i = 0; i < list.length; i++) { - if (list[i][0] == player && list[i][1] == card.suit) return true; - } - return false; - }) - ) - return false; - }, - cardRespondable: function (card, player) { - if ( - game.hasPlayer(function (current) { - var list = current.storage.twgongsun_shadow; - if (!list) return false; - for (var i = 0; i < list.length; i++) { - if (list[i][0] == player && list[i][1] == card.suit) return true; - } - return false; - }) - ) - return false; - }, - cardDiscardable: function (card, player) { - if ( - game.hasPlayer(function (current) { - var list = current.storage.twgongsun_shadow; - if (!list) return false; - for (var i = 0; i < list.length; i++) { - if (list[i][0] == player && list[i][1] == card.suit) return true; - } - return false; - }) - ) - return false; - }, - }, - }, - //濮阳兴 - twzhengjian: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter: function (event, player) { - if (event.name == "phase" && game.phaseNumber != 0) return false; - return !player.hasSkill("twzhengjian_eff0") && !player.hasSkill("twzhengjian_eff1"); - }, - content: function () { - "step 0"; - player - .chooseControl() - .set("prompt", "征建:请选择一种效果") - .set("choiceList", [ - "令“出牌阶段内未使用过非基本牌”的其他角色受到惩罚", - "令“出牌阶段内未得到过牌”的其他角色受到惩罚", - ]) - .set("ai", () => (Math.random() <= 0.5 ? 0 : 1)); - "step 1"; - player.addSkill("twzhengjian_eff" + result.index); - game.log( - player, - "获得了", - "#g【征建】", - "的", - "#y效果" + get.cnNumber(result.index + 1, true) - ); - game.delayx(); - }, - onremove: true, - subSkill: { - eff0: { - audio: "twzhengjian", - trigger: { global: "phaseUseEnd" }, - forced: true, - charlotte: true, - marktext: "建", - mark: true, - filter: function (event, player) { - if (event.player == player || event._twzhengjian || !event.player.isIn()) - return false; - if ( - event.player.hasHistory("useCard", function (evt) { - return ( - evt.getParent("phaseUse") == event && get.type(evt.card) != "basic" - ); - }) - ) - return false; - return player.storage.twzhengjian || event.player.countCards("he") > 0; - }, - logTarget: "player", - content: function () { - "step 0"; - trigger._twzhengjian = true; - var target = trigger.player; - event.target = target; - if (player.storage.twzhengjian) { - player - .chooseBool("征建:是否对" + get.translation(target) + "造成1点伤害?") - .set("ai", () => _status.event.goon) - .set("goon", get.damageEffect(target, player, _status.event.player) > 0); - } else { - target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); - } - "step 1"; - if (result.bool) { - if (result.cards && result.cards.length) { - target.give(result.cards, player).type = "twzhengjian"; - } else target.damage(); - } - player - .chooseBool("是否变更【征建】的效果?") - .set("ai", () => Math.random() > 0.5); - "step 2"; - if (result.bool) { - player.removeSkill("twzhengjian_eff0"); - player.addSkill("twzhengjian_eff1"); - game.log(player, "将", "#g【征建】", "的效果变更为", "#y效果二"); - } - }, - intro: { - content: function (storage, player) { - if (player.storage.twzhengjian) - return "其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则你可对其造成1点伤害,然后你可失去此效果并获得〖征建〗的效果二。"; - return "其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果二。"; - }, - }, - }, - eff1: { - audio: "twzhengjian", - trigger: { global: "phaseUseEnd" }, - forced: true, - charlotte: true, - marktext: "征", - mark: true, - filter: function (event, player) { - if (event.player == player || event._twzhengjian || !event.player.isIn()) - return false; - if ( - event.player.hasHistory("gain", function (evt) { - return evt.getParent("phaseUse") == event; - }) - ) - return false; - return player.storage.twzhengjian || event.player.countCards("he") > 0; - }, - logTarget: "player", - content: function () { - "step 0"; - trigger._twzhengjian = true; - var target = trigger.player; - event.target = target; - if (player.storage.twzhengjian) { - player - .chooseBool("征建:是否对" + get.translation(target) + "造成1点伤害?") - .set("ai", () => _status.event.goon) - .set("goon", get.damageEffect(target, player, _status.event.player) > 0); - } else { - target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); - } - "step 1"; - if (result.bool) { - if (result.cards && result.cards.length) { - target.give(result.cards, player).type = "twzhengjian"; - } else target.damage(); - } - player - .chooseBool("是否变更【征建】的效果?") - .set("ai", () => Math.random() > 0.5); - "step 2"; - if (result.bool) { - player.removeSkill("twzhengjian_eff1"); - player.addSkill("twzhengjian_eff0"); - game.log(player, "将", "#g【征建】", "的效果变更为", "#y效果一"); - } - }, - intro: { - content: function (storage, player) { - if (player.storage.twzhengjian) - return "其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则你可对其造成1点伤害,然后你可失去此效果并获得〖征建〗的效果一。"; - return "其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果一。"; - }, - }, - }, - }, - }, - twzhongchi: { - audio: 2, - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - forced: true, - skillAnimation: true, - animationColor: "wood", - filter: function (event, player) { - if ( - player.storage.twzhengjian || - !player.hasSkill("twzhengjian", null, null, false) || - !event.getg(player).length - ) - return false; - var num1 = game.countPlayer2(); - var list = []; - player.getAllHistory("gain", function (evt) { - if (evt.type == "twzhengjian") list.add(evt.source); - }); - return list.length >= Math.ceil(num1 / 2); - }, - content: function () { - "step 0"; - player.awakenSkill("twzhongchi"); - "step 1"; - player.recover(2); - player.addSkill("twzhongchi_effect"); - player.storage.twzhengjian = true; - "step 2"; - game.delayx(); - }, - subSkill: { - effect: { - mark: true, - marktext: "斥", - intro: { content: "受到渠道为【杀】的伤害+1" }, - trigger: { player: "damageBegin1" }, - forced: true, - filter: function (event, player) { - return event.card && event.card.name == "sha"; - }, - content: function () { - trigger.num++; - }, - }, - }, - ai: { - combo: "twzhengjian", - }, - }, - //田豫 - twzhenxi: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - direct: true, - filter: function (event, player) { - var target = event.target; - return ( - event.card.name == "sha" && - (target.countCards("h") > 0 || - target.hasCard(function (card) { - return game.hasPlayer(function (current) { - return current != target && current.canEquip(card); - }); - }, "e") || - target.hasCard(function (card) { - return game.hasPlayer(function (current) { - return current != target && current.canAddJudge(card); - }); - }, "j")) - ); - }, - usable: 1, - content: function () { - "step 0"; - var target = trigger.target; - event.target = target; - var str = get.translation(target); - var list = [ - "弃置" + str + "的" + get.cnNumber(get.distance(player, target)) + "张手牌", - "将" + str + "装备区或判定区内的一张牌移动到另一名角色的对应区域内", - ]; - var choices = []; - if (target.countCards("h") > 0) choices.push("选项一"); - else list[0] = '' + list[0] + ""; - if ( - target.hasCard(function (card) { - return game.hasPlayer(function (current) { - return current != target && current.canEquip(card); - }); - }, "e") || - target.hasCard(function (card) { - return game.hasPlayer(function (current) { - return current != target && current.canAddJudge(card); - }); - }, "j") - ) - choices.push("选项二"); - else list[1] = '' + list[1] + ""; - if (choices.length == 2 && (target.hp > player.hp || target.isMaxHp())) - choices.push("全部执行"); - choices.push("cancel2"); - player - .chooseControl(choices) - .set("choiceList", list) - .set("prompt", get.prompt("twzhenxi", target)) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getTrigger().target; - var eff1 = 0, - eff2 = 0; - var choices = _status.event.controls.slice(0); - if (choices.includes("选项一")) { - eff1 = -get.distance(player, target) * get.attitude(player, target); - } - if (choices.includes("选项二")) { - var equip = 0, - judge = 0, - att = get.attitude(player, target); - var es = target.getCards("e"), - js = target.getCards("j"); - for (var i of es) { - var val = get.value(i); - if (att > 0) { - if ( - val <= Math.min(0, equip) && - game.hasPlayer(function (current) { - return ( - current != target && - current.canEquip(i) && - get.effect(current, i, player, player) > 0 - ); - }) - ) - equip = val; - } else { - if ( - val > Math.max(0, equip) && - game.hasPlayer(function (current) { - return ( - current != target && - current.canEquip(i) && - get.effect(current, i, player, player) > 0 - ); - }) - ) - equip = val; - } - } - for (var i of js) { - var card = { name: i.viewAs || i.name }; - var effect = get.effect(target, card, player, player); - if (effect < 0) { - game.countPlayer(function (current) { - if (current != target && current.canAddJudge(i)) { - var eff = get.effect(current, card, player, player); - judge = Math.max(eff, judge); - } - }); - } - } - eff2 = Math.max(-equip * att, judge); - } - if (eff1 > 0) { - if (eff2 > 0) { - if (choices.includes("全部执行")) return "全部执行"; - else if (eff2 >= eff1) return "选项二"; - } - return "选项一"; - } else if (eff2 > 0) return "选项二"; - return "cancel2"; - }); - "step 1"; - if (result.control == "cancel2") { - event.finish(); - return; - } - player.logSkill("twzhenxi", target); - event.control = result.control; - if (event.control != "选项二") - player.discardPlayerCard(target, true, "h", get.distance(player, target)); - if (event.control == "选项一") event.finish(); - "step 2"; - if ( - event.control != "选项一" && - (target.hasCard(function (card) { - return game.hasPlayer(function (current) { - return current != target && current.canEquip(card); - }); - }, "e") || - target.hasCard(function (card) { - return game.hasPlayer(function (current) { - return current != target && current.canAddJudge(card); - }); - }, "j")) - ) { - player - .chooseTarget( - true, - "将" + get.translation(target) + "区域内的一张牌移动给另一名角色", - function (card, player, target) { - var source = _status.event.preTarget; - if (source == target) return false; - return ( - source.hasCard(function (card) { - return target.canEquip(card); - }, "e") || - source.hasCard(function (card) { - return target.canAddJudge(card); - }, "j") - ); - } - ) - .set("preTarget", target) - .set("ai", function (target) { - var player = _status.event.player, - source = _status.event.preTarget; - var att = get.attitude(player, source); - var es = source.getCards("e", function (card) { - return target.canEquip(card); - }), - js = source.getCards("j", function (card) { - return target.canAddJudge(card); - }); - var eff = 0; - for (var i of es) { - var val = get.value(i, source); - if (att > 0 ? val <= 0 : val > 0) { - eff = Math.max(eff, get.effect(target, i, player, player)); - } - } - for (var i of js) { - var card = { name: i.viewAs || i.name }; - if (get.effect(source, card, player, player) < 0) { - eff = Math.max(eff, get.effect(target, card, player, player)); - } - } - return eff; - }); - } else event.finish(); - "step 3"; - if (result.bool) { - var target2 = result.targets[0]; - event.target2 = target2; - player - .choosePlayerCard( - "ej", - true, - function (button) { - var player = _status.event.player; - var targets0 = _status.event.targets0; - var targets1 = _status.event.targets1; - if ( - get.attitude(player, targets0) > 0 && - get.attitude(player, targets1) < 0 - ) { - if (get.position(button.link) == "j") return 12; - if ( - get.value(button.link, targets0) < 0 && - get.effect(targets1, button.link, player, targets1) > 0 - ) - return 10; - return 0; - } else { - if (get.position(button.link) == "j") return -10; - return ( - get.value(button.link) * - get.effect(targets1, button.link, player, targets1) - ); - } - }, - target - ) - .set("targets0", target) - .set("targets1", target2) - .set("filterButton", function (button) { - var targets1 = _status.event.targets1; - if (get.position(button.link) == "j") { - return targets1.canAddJudge(button.link); - } else { - return targets1.canEquip(button.link); - } - }) - .set("ai", function (button) { - var player = _status.event.player, - target = _status.event.targets1, - source = _status.event.targets0; - var att = get.attitude(player, source); - var card = button.link; - if (get.position(card) == "e") { - var val = get.value(card); - if (att > 0 ? val > 0 : val <= 0) return 0; - return get.effect(target, card, player, player); - } - var cardx = { name: card.viewAs || card.name }; - if (get.effect(source, cardx, player, player) >= 0) return 0; - return get.effect(target, cardx, player, player); - }); - } else { - event.finish(); - } - "step 4"; - if (result.bool && result.links.length) { - var link = result.links[0]; - if (get.position(link) == "e") { - event.target2.equip(link); - } else if (link.viewAs) { - event.target2.addJudge({ name: link.viewAs }, [link]); - } else { - event.target2.addJudge(link); - } - target.$give(link, event.target2, false); - game.log(target, "的", link, "被移动给了", event.target2); - game.delay(); - } - }, - ai: { - unequip_ai: true, - skillTagFilter: function (player, tag, arg) { - if (!arg || !arg.name || arg.name != "sha") return false; - if (player.storage.counttrigger && player.storage.counttrigger.twzhenxi) return false; - if (!arg.target) return false; - var card = arg.target.getEquip(2); - return ( - card && - get.value(card) > 0 && - game.hasPlayer(function (current) { - return ( - current != arg.target && - current.canEquip(card) && - get.effect(current, card, player, player) > 0 - ); - }) - ); - }, - }, - }, - twyangshi: { - audio: 2, - trigger: { player: "damageEnd" }, - forced: true, - content: function () { - if ( - game.hasPlayer(function (current) { - return current != player && !player.inRange(current); - }) - ) { - player.addSkill("twyangshi_distance"); - player.addMark("twyangshi_distance", 1, false); - } else { - var card = get.cardPile2(function (card) { - return card.name == "sha"; - }); - if (card) player.gain(card, "gain2"); - else game.log("但是牌堆里已经没有杀了!"); - } - }, - subSkill: { - distance: { - charlotte: true, - onremove: true, - mod: { - attackRange: function (player, num) { - return num + player.countMark("twyangshi_distance"); - }, - }, - intro: { - content: "攻击范围+#", - }, - }, - }, - }, - //全琮 - zhenshan: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - filter: function (event, player) { - if (event.type == "wuxie" || player.hasSkill("zhenshan_used")) return false; - var nh = player.countCards("h"); - if ( - !game.hasPlayer(function (current) { - return current != player && current.countCards("h") < nh; - }) - ) { - return false; - } - for (var i of lib.inpile) { - if (get.type(i) != "basic") continue; - var card = { name: i, isCard: true }; - if (event.filterCard(card, player, event)) return true; - if (i == "sha") { - for (var j of lib.inpile_nature) { - card.nature = j; - if (event.filterCard(card, player, event)) return true; - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i of lib.inpile) { - if (get.type(i) != "basic") continue; - var card = { name: i, isCard: true }; - if (event.filterCard(card, player, event)) list.push(["基本", "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) { - card.nature = j; - if (event.filterCard(card, player, event)) list.push(["基本", "", i, j]); - } - } - } - return ui.create.dialog("振赡", [list, "vcard"], "hidden"); - }, - check: function (button) { - var player = _status.event.player; - var card = { name: button.link[2], nature: button.link[3] }; - if (card.name == "jiu") return 0; - if ( - game.hasPlayer(function (current) { - return get.effect(current, card, player, player) > 0; - }) - ) { - if (card.name == "sha") { - var eff = player.getUseValue(card); - if (eff > 0) return 2.9 + eff / 10; - return 0; - } else if (card.name == "tao" || card.name == "shan") { - return 4; - } - } - return 0; - }, - backup: function (links, player) { - return { - filterCard: function () { - return false; - }, - viewAs: { - name: links[0][2], - nature: links[0][3], - isCard: true, - }, - selectCard: -1, - precontent: function () { - "step 0"; - player - .chooseTarget( - "选择一名手牌数小于你的角色交换手牌", - function (card, player, target) { - return ( - target != player && - target.countCards("h") < player.countCards("h") - ); - }, - true - ) - .set("ai", function (target) { - return ( - get.attitude(player, target) * - Math.sqrt(target.countCards("h") + 1) - ); - }); - "step 1"; - if (result.bool) { - player.logSkill("zhenshan", result.targets); - player.addTempSkill("zhenshan_used"); - player.swapHandcards(result.targets[0]); - delete event.result.skill; - } else event.finish(); - "step 2"; - game.delayx(); - }, - }; - }, - prompt: function (links, player) { - return ( - "选择" + - get.translation(links[0][3] || "") + - "【" + - get.translation(links[0][2]) + - "】的目标" - ); - }, - }, - subSkill: { - used: { charlotte: true }, - }, - ai: { - order: function () { - var player = _status.event.player; - var event = _status.event; - var nh = player.countCards("h"); - if ( - game.hasPlayer(function (current) { - return get.attitude(player, current) > 0 && current.countCards("h") < nh; - }) - ) { - if (event.type == "dying") { - if (event.filterCard({ name: "tao" }, player, event)) { - return 0.5; - } - } else { - if ( - event.filterCard({ name: "tao" }, player, event) || - event.filterCard({ name: "shan" }, player, event) - ) { - return 4; - } - if (event.filterCard({ name: "sha" }, player, event)) { - return 2.9; - } - } - } - return 0; - }, - save: true, - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - if (player.hasSkill("zhenshan_used")) return false; - var nh = player.countCards("h"); - return game.hasPlayer(function (current) { - return current != player && current.countCards("h") < nh; - }); - }, - result: { - player: function (player) { - if (_status.event.type == "dying") { - return get.attitude(player, _status.event.dying); - } else { - return 1; - } - }, - }, - }, - }, - //吴景 - twfenghan: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - direct: true, - usable: 1, - filter: function (event, player) { - return ( - event.isFirstTarget && - event.targets.length > 0 && - (event.card.name == "sha" || - (get.type(event.card, false) == "trick" && get.tag(event.card, "damage") > 0)) - ); - }, - content: function () { - "step 0"; - var num = trigger.targets.length; - player - .chooseTarget( - [1, num], - get.prompt("twfenghan"), - "令至多" + get.cnNumber(num) + "名角色各摸一张牌" - ) - .set("ai", function (target) { - return ( - Math.sqrt(5 - Math.min(4, target.countCards("h"))) * - get.attitude(_status.event.player, target) * - (target.hasSkillTag("nogain") ? 0.1 : 1) - ); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.logSkill("twfenghan", targets); - if (targets.length > 1) game.asyncDraw(targets); - else { - targets[0].draw(); - event.finish(); - } - } else { - player.storage.counttrigger.twfenghan--; - event.finish(); - } - "step 2"; - game.delayx(); - }, - }, - twcongji: { - audio: 2, - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - direct: true, - filter: function (event, player) { - if ( - player == _status.currentPhase || - event.type != "discard" || - event.getlx === false || - !game.hasPlayer((current) => current != player) - ) - return false; - var evt = event.getl(player); - for (var i of evt.cards2) { - if (get.color(i, player) == "red" && get.position(i, true) == "d") return true; - } - return false; - }, - content: function () { - "step 0"; - var cards = [], - cards2 = trigger.getl(player).cards2; - for (var i of cards2) { - if (get.color(i, player) == "red" && get.position(i, true) == "d") cards.push(i); - } - player - .chooseButton(["从击:选择任意张牌交给其他角色", cards], [1, cards.length]) - .set( - "goon", - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0; - }) - ) - .set("ai", function (button) { - if (_status.event.goon) return get.value(button.link); - return button.link.name == "du" ? 1 : 0; - }); - "step 1"; - if (result.bool) { - event.cards = result.links; - player - .chooseTarget( - "选择一名角色获得以下牌:", - get.translation(cards), - true, - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player, - cards = _status.event.getParent().cards; - if (cards[0].name == "du") return -get.attitude(player, target); - var att = get.attitude(player, target); - if (att <= 0) return 0; - if (target.hasSkillTag("nogain")) att /= 10; - if (target.hasJudge("lebu")) att /= 4; - return get.value(cards, target) * att; - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twcongji", target); - target.gain(cards, "gain2"); - } - }, - }, - //王粲 - twdianyi: { - audio: 2, - trigger: { player: "phaseEnd" }, - forced: true, - filter: function (event, player) { - if (!player.getHistory("sourceDamage").length) return player.countCards("h") != 4; - return player.countCards("h") > 0; - }, - content: function () { - var num = player.countCards("h"); - if (player.getHistory("sourceDamage").length) player.chooseToDiscard("h", true, num); - else if (num > 4) player.chooseToDiscard("h", true, num - 4); - else player.drawTo(4); - }, - }, - twyingji: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - return ( - player != _status.currentPhase && - lib.inpile.includes(name) && - player.countCards("h") == 0 - ); - }, - filter: function (event, player) { - if (player == _status.currentPhase || player.countCards("h") > 0) return false; - for (var i of lib.inpile) { - if (i == "wuxie") continue; - var type = get.type(i); - if ( - (type == "basic" || type == "trick") && - event.filterCard({ name: i, isCard: true }, player, event) - ) - return true; - if (i == "sha") { - for (var j of lib.inpile_nature) { - if (event.filterCard({ name: i, nature: j, isCard: true }, player, event)) - return true; - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i of lib.inpile) { - if (i == "wuxie") continue; - var type = get.type(i); - if (type == "basic" || type == "trick") { - var card = { name: i, isCard: true }; - if (event.filterCard(card, player, event)) list.push([type, "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) { - card.nature = j; - if (event.filterCard(card, player, event)) - list.push(["基本", "", "sha", j]); - } - } - } - } - return ui.create.dialog("应机", [list, "vcard"]); - }, - check: function (button) { - var player = _status.event.player; - var card = { name: button.link[2], nature: button.link[3] }; - var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; - return val; - }, - backup: function (links, player) { - return { - viewAs: { - name: links[0][2], - nature: links[0][3], - isCard: true, - }, - filterCard: () => false, - selectCard: -1, - precontent: function () { - player.logSkill("twyingji"); - player.draw("nodelay"); - delete event.result.skill; - }, - }; - }, - prompt: function (links) { - return ( - "将一张手牌当做" + - (get.translation(links[0][3]) || "") + - get.translation(links[0][2]) + - "使用" - ); - }, - }, - ai: { - fireAttack: true, - respondShan: true, - respondSha: true, - skillTagFilter: function (player) { - if (player == _status.currentPhase || player.countCards("h") > 0) return false; - }, - order: 10, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying) > 0; - return 1; - }, - }, - }, - group: ["twyingji_wuxie"], - }, - twyingji_wuxie: { - enable: "chooseToUse", - viewAs: { - name: "wuxie", - isCard: true, - }, - viewAsFilter: function (player) { - return player != _status.currentPhase && player.countCards("h") == 0; - }, - filterCard: () => false, - prompt: "视为使用【无懈可击】并摸一张牌", - selectCard: [0, 1], - check: () => 1, - precontent: function () { - player.logSkill("twyingji"); - player.draw("nodelay"); - delete event.result.skill; - }, - ai: { - order: 4, - }, - }, - twshanghe: { - trigger: { player: "dying" }, - limited: true, - audio: 2, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("he") > 0; - }); - }, - prompt: "是否发动【觞贺】?", - skillAnimation: true, - animationColor: "soil", - logTarget: (event, player) => game.filterPlayer((current) => current != player), - content: function () { - "step 0"; - player.awakenSkill("twshanghe"); - event.targets = game.filterPlayer((current) => current != player); - event.num = 0; - event.jiu = false; - "step 1"; - event.current = targets[num]; - if (!event.current.countCards("he")) event.goto(3); - else - event.current - .chooseCard("交给" + get.translation(player) + "一张牌", "he", true) - .set("ai", function (card) { - var evt = _status.event.getParent(); - return 100 - get.value(card); - }); - "step 2"; - if (result.bool && result.cards && result.cards.length) { - event.current.give(result.cards, player); - if (!event.jiu && get.name(result.cards[0], player) == "jiu") event.jiu = true; - } - "step 3"; - event.num++; - if (event.num < targets.length) event.goto(1); - else if (!event.jiu && player.hp < 1) player.recover(1 - player.hp); - }, - }, - //王昶 - twkaiji: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - var num = 1 + player.getStorage("twkaiji").length; - player - .chooseTarget( - [1, num], - get.prompt("twkaiji"), - "令至多" + get.cnNumber(num) + "名角色各摸一张牌" - ) - .set("ai", function (target) { - return ( - Math.sqrt(5 - Math.min(4, target.countCards("h"))) * - get.attitude(_status.event.player, target) * - (target.hasSkillTag("nogain") ? 0.1 : 1) - ); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - event.targets = targets; - player.logSkill("twkaiji", targets); - if (targets.length == 1) targets[0].draw(); - else game.asyncDraw(targets); - } else event.finish(); - "step 2"; - if (targets.length > 1) game.delayx(); - if ( - game.hasPlayer(function (current) { - return ( - targets.includes(current) && - current.hasHistory("gain", function (evt) { - return ( - evt.getParent(2) == event && - get.type(evt.cards[0], current) != "basic" - ); - }) - ); - }) - ) - player.draw(); - }, - group: "twkaiji_count", - subSkill: { - count: { - trigger: { global: "dying" }, - forced: true, - firstDo: true, - silent: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return !player.getStorage("twkaiji").includes(event.player); - }, - content: function () { - player.markAuto("twkaiji", [trigger.player]); - }, - }, - }, - }, - twshepan: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - usable: 1, - direct: true, - filter: function (event, player) { - return player != event.player; - }, - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - var choiceList = [ - "摸一张牌", - "将" + get.translation(target) + "区域内的一张牌置于牌堆顶", - ]; - var choices = ["选项一"]; - if (target.countCards("hej") > 0) choices.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - choices.push("cancel2"); - player - .chooseControl(choices) - .set("choiceList", choiceList) - .set( - "choice", - (function () { - if ( - choices.length > 2 && - get.effect(target, { name: "guohe_copy" }, player, player) > 0 - ) - return 1; - return 0; - })() - ); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("twshepan", target); - if (result.index == 1) player.choosePlayerCard(target, "hej", true); - else { - player.draw(); - event.goto(3); - } - } else { - player.storage.counttrigger.twshepan--; - event.finish(); - } - "step 2"; - var card = result.cards[0]; - target.$throw(get.position(card) == "h" ? 1 : card, 1000); - target.lose(card, ui.cardPile, "insert"); - "step 3"; - game.delayx(); - if (target.isIn() && player.countCards("h") == target.countCards("h")) { - player.storage.counttrigger.twshepan--; - player - .chooseBool("是否令" + get.translation(trigger.card) + "对自己无效?") - .set("ai", function () { - var evt = _status.event.getTrigger(); - return get.effect(evt.target, evt.card, evt.player, evt.target) < 0; - }); - } else event.finish(); - "step 4"; - if (result.bool) trigger.excluded.add(player); - }, - }, - //曹肇 - twfuzuan: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return ( - current.getSkills(null, false, false).filter(function (i) { - return get.is.zhuanhuanji(i, current); - }).length > 0 - ); - }); - }, - filterTarget: function (card, player, target) { - return ( - target.getSkills(null, false, false).filter(function (i) { - return get.is.zhuanhuanji(i, target); - }).length > 0 - ); - }, - content: function () { - "step 0"; - var list = target.getSkills(null, false, false).filter(function (i) { - return get.is.zhuanhuanji(i, target); - }); - if (list.length == 1) { - event._result = { control: list[0] }; - } else - player - .chooseControl(list) - .set("prompt", "选择变更" + get.translation(target) + "一个技能的状态") - .set("choice", list.includes("twfeifu") ? "twfeifu" : 0) - .set("ai", () => _status.event.choice); - "step 1"; - var skill = result.control; - target.changeZhuanhuanji(skill); - target.popup(skill, "wood"); - game.log(target, "的", "#g【" + get.translation(skill) + "】", "发生了状态变更"); - game.delayx(); - }, - ai: { - order: 8, - result: { - target: function (player, target) { - if (!target.hasSkill("twfeifu")) return 0; - return target.storage.twfeifu ? -1 : 1; - }, - }, - }, - group: "twfuzuan_damage", - subSkill: { - damage: { - audio: "twfuzuan", - trigger: { - player: "damageEnd", - source: "damageSource", - }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return ( - current.getSkills(null, false, false).filter(function (i) { - return get.is.zhuanhuanji(i, current); - }).length > 0 - ); - }); - }, - content: function () { - "step 0"; - player - .chooseTarget( - lib.skill.twfuzuan.filterTarget, - get.prompt("twfuzuan"), - "变更一名角色的一个转换技的状态" - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, "twfuzuan", player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twfuzuan", target); - var next = game.createEvent("twfuzuan"); - next.player = player; - next.target = target; - next.setContent(lib.skill.twfuzuan.content); - } - }, - }, - }, - }, - twchongqi: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - logTarget: () => game.filterPlayer().sortBySeat(), - content: function () { - "step 0"; - game.filterPlayer() - .sortBySeat() - .forEach(function (current) { - current.addSkills("twfeifu"); - }); - //game.log(player,'令所有其他角色获得了技能','#g【非服】') - game.delayx(); - "step 1"; - player - .chooseTarget( - "是否减1点体力上限,并令一名其他角色获得技能【复纂】?", - lib.filter.notMe - ) - .set("ai", function (target) { - var player = _status.event.player; - if (player.hasUnknown() && !target.isZhu) return 0; - if (player.getEnemies().includes(target)) return 0; - return get.attitude(player, target); - }); - "step 2"; - if (result.bool) { - player.loseMaxHp(); - var target = result.targets[0]; - player.line(target, "fire"); - target.addSkills("twfuzuan"); - game.delayx(); - } - }, - derivation: "twfeifu", - }, - twfeifu: { - audio: 2, - trigger: { - player: "useCardToPlayered", - target: "useCardToTargeted", - }, - zhuanhuanji: true, - forced: true, - mark: true, - marktext: "☯", - intro: { - content: function (storage, player) { - return ( - (storage ? "当你使用【杀】指定唯一目标后" : "当你成为【杀】的唯一目标后") + - "目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。" - ); - }, - }, - filter: function (event, player, name) { - return ( - event.card.name == "sha" && - event.targets.length == 1 && - event.player.isIn() && - event.target.countCards("he") > 0 && - (name == "useCardToPlayered") == Boolean(player.storage.twfeifu) - ); - }, - logTarget: function (event, player) { - return player.storage.twfeifu ? event.target : event.player; - }, - content: function () { - "step 0"; - player.changeZhuanhuanji("twfeifu"); - trigger.target.chooseCard( - "he", - true, - "非服:交给" + get.translation(trigger.player) + "一张牌", - "若选择装备牌,则其可以使用此牌" - ); - "step 1"; - if (result.bool) { - var card = result.cards[0]; - event.card = card; - trigger.target.give(card, trigger.player); - } else event.finish(); - "step 2"; - var target = trigger.player; - if ( - target.getCards("h").includes(card) && - get.type(card, target) == "equip" && - target.hasUseTarget(card) - ) - target.chooseUseTarget(card, "nopopup"); - }, - }, - //Powered by @污言噫对 - twjingce: { - marktext: "策", - intro: { - name: "策", - content: "mark", - }, - audio: 2, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - var history = player.getHistory("useCard", function (evtx) { - return evtx.getParent("phaseUse") == evt; - }); - return history && history.indexOf(event) == player.hp - 1; - }, - frequent: true, - content: function () { - "step 0"; - player.draw(2); - "step 1"; - if ( - player.getHistory("sourceDamage").length || - player.getHistory("gain", function (evt) { - return ( - evt.getParent("phaseUse") == trigger.getParent("phaseUse") && - evt.getParent().name == "draw" - ); - }).length > 1 - ) - player.addMark("twjingce", 1); - }, - }, - yuzhang: { - audio: 2, - trigger: { - player: "damageEnd", - }, - filter: function (event, player) { - return event.source && player.hasMark("twjingce"); - }, - direct: true, - content: function () { - "step 0"; - var choiceList = ["令" + get.translation(trigger.source) + "本回合不能再使用或打出牌"]; - if (trigger.source.countCards("he")) - choiceList.push("令" + get.translation(trigger.source) + "弃置两张牌"); - player - .chooseControl("cancel2") - .set("prompt2", get.prompt2("yuzhang")) - .set("choiceList", choiceList) - .set("ai", function () { - var player = _status.event.player, - source = _status.event.source; - if (get.attitude(player, source) >= 0) return "cancel2"; - if ( - source.hasSkillTag("noh") || - source.hasSkillTag("noe") || - source.countCards("h") >= 4 - ) - return 0; - if (source.hp > 1 && source.countCards("he") > 1) return 1; - return [0, 1].randomGet(); - }) - .set("source", trigger.source); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("yuzhang", trigger.source); - player.removeMark("twjingce", 1); - if (result.index == 0) trigger.source.addTempSkill("yuzhang_dontuse"); - else trigger.source.chooseToDiscard("he", 2, true); - } - }, - group: "yuzhang_skip", - subSkill: { - skip: { - audio: "yuzhang", - trigger: { - player: [ - "phaseZhunbeiBefore", - "phaseJudgeBefore", - "phaseDrawBefore", - "phaseUseBefore", - "phaseDiscardBefore", - "phaseJieshuBefore", - ], - }, - filter: function (event, player) { - return player.hasMark("twjingce"); - }, - prompt2: function (event, player) { - var str = "弃置一枚“策”并跳过"; - var list = lib.skill.yuzhang.subSkill.skip.trigger.player.slice(); - list = list.map((i) => i.slice(0, -6)); - str += ["准备", "判定", "摸牌", "出牌", "弃牌", "结束"][list.indexOf(event.name)]; - str += "阶段"; - return str; - }, - check: function (event, player) { - if (event.name == "phaseDiscard") return player.needsToDiscard(); - if (event.name == "phaseJudge") return player.countCards("j"); - return false; - }, - content: function () { - player.removeMark("twjingce", 1); - trigger.cancel(); - }, - }, - dontuse: { - charlotte: true, - mark: true, - mod: { - cardEnabled2: function (card) { - return false; - }, - }, - intro: { - content: "不能使用或打出牌", - }, - }, - }, - ai: { - combo: "twjingce", - }, - }, - twlihuo: { - trigger: { player: "useCard1" }, - filter: function (event, player) { - if (event.card.name == "sha" && !game.hasNature(event.card)) return true; - return false; - }, - audio: "lihuo", - prompt2: function (event) { - return "将" + get.translation(event.card) + "改为火属性"; - }, - audioname: ["re_chengpu"], - check: function (event, player) { - return game.hasPlayer(function (current) { - return ( - !event.targets.includes(current) && - player.canUse(event.card, current) && - get.effect( - current, - { name: "sha", nature: "fire", cards: event.cards.slice(0) }, - player, - player - ) > 0 - ); - }); - }, - content: function () { - game.setNature(trigger.card, "fire"); - trigger.card.twlihuo_buffed = true; - }, - group: ["twlihuo2", "twlihuo3"], - ai: { - fireAttack: true, - }, - }, - twlihuo2: { - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; - return game.hasPlayer(function (current) { - return !event.targets.includes(current) && player.canUse(event.card, current); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("twlihuo"), - "为" + get.translation(trigger.card) + "增加一个目标", - function (card, player, target) { - return ( - !_status.event.sourcex.includes(target) && - player.canUse(_status.event.card, target) - ); - } - ) - .set("sourcex", trigger.targets) - .set("card", trigger.card) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, _status.event.card, player, player); - }); - "step 1"; - if (result.bool) { - if (!event.isMine() && !_status.connectMode) game.delayx(); - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - player.logSkill("twlihuo", event.target); - trigger.targets.push(event.target); - }, - }, - twlihuo3: { - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return (event.card.twlihuo_buffed = - true && - player.getHistory("sourceDamage", function (evt) { - return evt.card == event.card && evt._dyinged; - }).length > 0); - }, - forced: true, - audio: "lihuo", - audioname: ["re_chengpu"], - content: function () { - player.loseHp(); - }, - }, - twchunlao: { - audio: "chunlao", - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter: function (event, player) { - return ( - game.hasPlayer(function (current) { - return current.countCards("hej") > 0; - }) && - !game.hasPlayer(function (current) { - return current.getExpansions("twchunlao").length > 0; - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("twchunlao"), - "将一名角色区域内的一张牌作为“醇”置于其武将牌上", - function (card, player, target) { - return target.countCards("hej") > 0; - } - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target) * (player == target ? 1 : 2); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twchunlao", target); - player.choosePlayerCard(target, "hej", true); - } else event.finish(); - "step 2"; - if (result.bool) { - target.addToExpansion(result.cards, target, "give").gaintag.add("twchunlao"); - } - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - group: ["twchunlao_sha", "twchunlao_dying"], - subSkill: { - sha: { - trigger: { global: "useCard" }, - direct: true, - filter: function (event, player) { - return ( - event.card.name == "sha" && - event.player.countCards("he") > 0 && - event.player.getExpansions("twchunlao").length > 0 - ); - }, - content: function () { - "step 0"; - event.target = trigger.player; - event.target - .chooseCard( - "he", - "醇醪:是否交给" + - get.translation(player) + - "一张牌,令" + - get.translation(trigger.card) + - "的伤害值基数+1?" - ) - .set("ai", function (card) { - if (!_status.event.goon) return 3.5 - get.value(card); - return 7 - get.value(card); - }) - .set( - "goon", - (function () { - if (get.attitude(target, player) < 0) return false; - var 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 - ) - return true; - } - } - return d1; - })() - ); - if (!event.target.isUnderControl(true) && !event.target.isOnline()) game.delayx(); - "step 1"; - if (result.bool) { - target.logSkill("twchunlao", player); - if (!target.hasSkill("twchunlao")) game.trySkillAudio("twchunlao", player); - if (player != target) target.give(result.cards, player, "giveAuto"); - trigger.baseDamage++; - } - }, - }, - dying: { - audio: "chunlao", - trigger: { global: "dying" }, - logTarget: "player", - filter: function (event, player) { - return event.player.getExpansions("twchunlao").length > 0; - }, - prompt2: (event, player) => - "移去" + - get.translation(event.player) + - "武将牌上的“醇”并摸一张牌,然后令其回复1点体力", - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - content: function () { - var target = trigger.player, - cards = target.getExpansions("twchunlao"); - if (cards.length) target.loseToDiscardpile(cards); - player.draw(); - target.recover(); - }, - }, - }, - }, - //张曼成 - twfengji: { - audio: 2, - mahouSkill: true, - trigger: { player: "phaseUseBegin" }, - filter: function (event, player) { - return ( - !player.getExpansions("twfengji").length && - !player.hasSkill("twfengji_mahou") && - player.countCards("he") - ); - }, - direct: true, - content: function () { - "step 0"; - player.chooseCard("he", get.prompt2("twfengji")).set("ai", function (card) { - var name = card.name, - num = 0; - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - if (ui.cardPile.childNodes[i].name == name) num++; - } - if (num < 2) return false; - return 8 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("twfengji"); - player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("twfengji"); - player - .chooseControl("1回合", "2回合", "3回合") - .set("prompt", "请选择施法时长") - .set("ai", function () { - var player = _status.event.player; - var safe = Math.min( - player.getHandcardLimit(), - player.countCards("h", "shan") - ); - if (safe < Math.min(3, game.countPlayer())) { - var next = player.next; - while (next != player && get.attitude(next, player) > 0) { - safe++; - next = next.next; - } - } - return Math.max(2, Math.min(safe, 3, game.countPlayer())) - 1; - }); - } else event.finish(); - "step 2"; - player.storage.twfengji_mahou = [result.index + 1, result.index + 1]; - player.addTempSkill("twfengji_mahou", { player: "die" }); - }, - marktext: "示", - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - subSkill: { - mahou: { - trigger: { global: "phaseEnd" }, - forced: true, - popup: false, - charlotte: true, - content: function () { - var list = player.storage.twfengji_mahou; - list[1]--; - if (list[1] == 0) { - game.log(player, "的“蜂集”魔法生效"); - player.logSkill("twfengji"); - var cards = player.getExpansions("twfengji"); - if (cards.length) { - var cards2 = [], - num = list[0]; - for (var card of cards) { - for (var i = 0; i < num; i++) { - var card2 = get.cardPile2(function (cardx) { - return cardx.name == card.name && !cards2.includes(cardx); - }); - if (card2) cards2.push(card2); - else break; - } - } - game.delayx(); - if (cards2.length) player.gain(cards2, "gain2"); - player.loseToDiscardpile(cards); - } - player.removeSkill("twfengji_mahou"); - } else { - game.log(player, "的“蜂集”魔法剩余", "#g" + list[1] + "回合"); - player.markSkill("twfengji_mahou"); - } - }, - ai: { threaten: 2.5 }, - mark: true, - onremove: true, - //该图标为灵魂宝石 - marktext: "♗", - intro: { - name: "施法:蜂集", - markcount: function (storage) { - if (storage) return storage[1]; - return 0; - }, - content: function (storage) { - if (storage) { - return ( - "经过" + - storage[1] + - "个“回合结束时”后,若有“示”,则从牌堆中获得" + - storage[0] + - "张和“示”名称相同的牌" - ); - } - return "未指定施法效果"; - }, - }, - }, - }, - }, - twyiju: { - audio: 2, - locked: false, - mod: { - attackRangeBase: function (player, num) { - if (player.getExpansions("twfengji").length) return player.hp; - }, - cardUsable: function (card, player, num) { - if (card.name == "sha" && player.getExpansions("twfengji").length) - return num - 1 + player.hp; - }, - }, - trigger: { player: "damageBegin3" }, - filter: function (event, player) { - return player.getExpansions("twfengji").length > 0; - }, - forced: true, - content: function () { - trigger.num++; - var cards = player.getExpansions("twfengji"); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { - halfneg: true, - combo: "twfengji", - }, - }, - twbudao: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - derivation: [ - "twzhouhu", - "twharvestinori", - "twzuhuo", - "twzhouzu", - "twhuangjin", - "twguimen", - "twdidao", - ], - limited: true, - skillAnimation: true, - animationColor: "metal", - check: function (event, player) { - return !player.hasUnknown() || !player.hasFriend(); - }, - skillValue: { - twzhouhu: (target) => (Math.random() < 0.6 ? 0.1 : 1), - twzuhuo: (target, player) => (get.damageEffect(target, player, player) > 0 ? 0.1 : 1), - twharvestinori: (target) => 0.9 + Math.random() / 5, - twhuangjin: (target) => Math.random() / 5, - twguimen: (target) => - Math.sqrt(Math.min(3, target.countCards("he", { suit: "spade" }))) * 0.09, - twzhouzu: (target) => { - var rand = Math.random(); - if (rand < 0.8) return 1 - Math.sqrt(0.8 - rand); - return 1; - }, - twdidao: (target, player) => { - if ( - [target, player].some((current) => - current.getSkills().some((skill) => { - var info = get.info(skill); - if (!info || !info.ai || !info.ai.rejudge) return false; - return true; - }) - ) - ) { - return 0.05; - } - return 0.85 + Math.random() / 5; - }, - }, - content: function () { - "step 0"; - player.awakenSkill("twbudao"); - player.loseMaxHp(); - player.recover(); - var skills = lib.skill.twbudao.derivation, - map = lib.skill.twbudao.skillValue; - skills = skills.randomGets(3); - var target = game - .filterPlayer() - .sort((a, b) => get.attitude(player, b) - get.attitude(player, a))[0]; - if (player.identity == "nei" || get.attitude(player, target) < 6) target = player; - player - .chooseControl(skills) - .set( - "choiceList", - skills.map(function (i) { - return ( - '
    【' + - get.translation( - lib.translate[i + "_ab"] || get.translation(i).slice(0, 2) - ) + - "】
    " + - get.skillInfoTranslation(i, player) + - "
    " - ); - }) - ) - .set("displayIndex", false) - .set("prompt", "布道:选择获得一个技能") - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - skills.sort( - (a, b) => (map[b](target, player) || 0.5) - (map[a](target, player) || 0.5) - )[0] - ); - "step 1"; - var skill = result.control; - player.addSkills(skill); - event.twbudao_skill = skill; - player - .chooseTarget( - lib.filter.notMe, - "是否令一名其他角色也获得【" + get.translation(skill) + "】?" - ) - .set("ai", function (target) { - var player = _status.event.player; - if (player.identity == "nei") return 0; - return get.attitude(player, target); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - target.addSkills(event.twbudao_skill); - var cards = target.getCards("he"); - if (!cards.length) event.finish(); - else if (cards.length == 1) event._result = { bool: true, cards: cards }; - else - target.chooseCard( - "he", - true, - "交给" + get.translation(player) + "一张牌作为学费" - ); - } else event.finish(); - "step 3"; - if (result.bool) target.give(result.cards, player); - }, - }, - twzhouhu: { - audio: 2, - mahouSkill: true, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - !player.hasSkill("twzhouhu_mahou") && - player.countCards("h", lib.skill.twzhouhu.filterCard) > 0 - ); - }, - filterCard: { color: "red" }, - check: function (card) { - if (_status.event.player.isHealthy()) return 0; - return 7 - get.value(card); - }, - content: function () { - "step 0"; - player - .chooseControl("1回合", "2回合", "3回合") - .set("prompt", "请选择施法时长") - .set("ai", function () { - var player = _status.event.player; - var safe = 1; - if (safe < Math.min(3, game.countPlayer(), player.getDamagedHp())) { - var next = player.next; - while (next != player && get.attitude(next, player) > 0) { - safe++; - next = next.next; - } - } - return ( - Math.max(1, Math.min(safe, 3, game.countPlayer(), player.getDamagedHp())) - 1 - ); - }); - "step 1"; - player.storage.twzhouhu_mahou = [result.index + 1, result.index + 1]; - player.addTempSkill("twzhouhu_mahou", { player: "die" }); - }, - ai: { - order: 2, - result: { - player: 1, - }, - }, - subSkill: { - mahou: { - trigger: { global: "phaseEnd" }, - forced: true, - popup: false, - charlotte: true, - content: function () { - var list = player.storage.twzhouhu_mahou; - list[1]--; - if (list[1] == 0) { - game.log(player, "的“咒护”魔法生效"); - player.logSkill("twzhouhu"); - var num = list[0]; - player.recover(num); - player.removeSkill("twzhouhu_mahou"); - } else { - game.log(player, "的“咒护”魔法剩余", "#g" + list[1] + "回合"); - player.markSkill("twzhouhu_mahou"); - } - }, - mark: true, - onremove: true, - marktext: "♗", - intro: { - name: "施法:咒护", - markcount: function (storage) { - if (storage) return storage[1]; - return 0; - }, - content: function (storage) { - if (storage) { - return ( - "经过" + storage[1] + "个“回合结束时”后,回复" + storage[0] + "点体力" - ); - } - return "未指定施法效果"; - }, - }, - }, - }, - }, - twharvestinori: { - audio: 2, - mahouSkill: true, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - !player.hasSkill("twharvestinori_mahou") && - player.countCards("h", lib.skill.twharvestinori.filterCard) > 0 - ); - }, - filterCard: { color: "black" }, - check: function (card) { - return 8 - get.value(card); - }, - content: function () { - "step 0"; - player - .chooseControl("1回合", "2回合", "3回合") - .set("prompt", "请选择施法时长") - .set("ai", function () { - var player = _status.event.player; - var safe = player.hp; - if (safe < Math.min(3, game.countPlayer())) { - var next = player.next; - while (next != player && get.attitude(next, player) > 0) { - safe++; - next = next.next; - } - } - return Math.max(1, Math.min(safe, 3, game.countPlayer())) - 1; - }); - "step 1"; - player.storage.twharvestinori_mahou = [result.index + 1, result.index + 1]; - player.addTempSkill("twharvestinori_mahou", { player: "die" }); - }, - ai: { - order: 8, - result: { - player: 1, - }, - }, - subSkill: { - mahou: { - trigger: { global: "phaseEnd" }, - forced: true, - popup: false, - charlotte: true, - content: function () { - var list = player.storage.twharvestinori_mahou; - list[1]--; - if (list[1] == 0) { - game.log(player, "的“丰祈”魔法生效"); - player.logSkill("twharvestinori"); - var num = list[0] * 2; - player.draw(num); - player.removeSkill("twharvestinori_mahou"); - } else { - game.log(player, "的“丰祈”魔法剩余", "#g" + list[1] + "回合"); - player.markSkill("twharvestinori_mahou"); - } - }, - mark: true, - onremove: true, - marktext: "♗", - intro: { - name: "施法:丰祈", - markcount: function (storage) { - if (storage) return storage[1]; - return 0; - }, - content: function (storage) { - if (storage) { - return ( - "经过" + storage[1] + "个“回合结束时”后,摸" + storage[0] * 2 + "张牌" - ); - } - return "未指定施法效果"; - }, - }, - }, - }, - }, - twzuhuo: { - audio: 2, - mahouSkill: true, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - !player.hasSkill("twzuhuo_mahou") && - player.countCards("he", lib.skill.twzuhuo.filterCard) > 0 - ); - }, - filterCard: function (card) { - return get.type(card) != "basic"; - }, - position: "he", - check: function (card) { - return 7 - get.value(card); - }, - content: function () { - "step 0"; - player - .chooseControl("1回合", "2回合", "3回合") - .set("prompt", "请选择施法时长") - .set("ai", function () { - var player = _status.event.player; - var safe = Math.min(player.getHandcardLimit(), player.countCards("h", "shan")); - if (safe < Math.min(3, game.countPlayer())) { - var next = player.next; - while (next != player && get.attitude(next, player) > 0) { - safe++; - next = next.next; - } - } - return Math.max(2, Math.min(safe, 3, game.countPlayer())) - 1; - }); - "step 1"; - player.storage.twzuhuo_mahou = [result.index + 1, result.index + 1]; - player.addTempSkill("twzuhuo_mahou", { player: "die" }); - }, - ai: { - order: 2, - result: { - player: 1, - }, - }, - subSkill: { - mahou: { - trigger: { global: "phaseEnd" }, - forced: true, - popup: false, - charlotte: true, - content: function () { - var list = player.storage.twzuhuo_mahou; - list[1]--; - if (list[1] == 0) { - game.log(player, "的“阻祸”魔法生效"); - player.logSkill("twzuhuo"); - var num = list[0]; - player.addSkill("twzuhuo_effect"); - player.addMark("twzuhuo_effect", num, false); - player.removeSkill("twzuhuo_mahou"); - } else { - game.log(player, "的“阻祸”魔法剩余", "#g" + list[1] + "回合"); - player.markSkill("twzuhuo_mahou"); - } - }, - mark: true, - onremove: true, - marktext: "♗", - intro: { - name: "施法:阻祸", - markcount: function (storage) { - if (storage) return storage[1]; - return 0; - }, - content: function (storage) { - if (storage) { - return ( - "经过" + - storage[1] + - "个“回合结束时”后,获得" + - storage[0] + - "层“防止一次伤害”的效果" - ); - } - return "未指定施法效果"; - }, - }, - }, - effect: { - charlotte: true, - onremove: true, - trigger: { player: "damageBegin2" }, - forced: true, - filter: function (event, player) { - return player.hasMark("twzuhuo_effect"); - }, - content: function () { - trigger.cancel(); - player.removeMark("twzuhuo_effect", 1, false); - if (!player.countMark("twzuhuo_effect")) player.removeSkill("twzuhuo_effect"); - }, - marktext: "阻︎", - intro: { - onremove: true, - content: "防止接下来的#次伤害", - }, - }, - }, - }, - twzhouzu: { - audio: 2, - enable: "phaseUse", - usable: 1, - mahouSkill: true, - filter: function (event, player) { - return !player.hasSkill("twzhouzu_mahou"); - }, - filterTarget: function (card, player, target) { - return player != target; - }, - line: false, - delay: false, - content: function () { - "step 0"; - player - .chooseControl("1回合", "2回合", "3回合") - .set("prompt", "请选择施法时长") - .set("ai", function () { - var player = _status.event.player; - var safe = 1; - if (safe < Math.min(3, game.countPlayer())) { - var next = player.next; - while (next != player && get.attitude(next, player) > 0) { - safe++; - next = next.next; - } - } - return Math.max(2, Math.min(safe, 3, game.countPlayer())) - 1; - }); - "step 1"; - player.storage.twzhouzu_mahou = [result.index + 1, result.index + 1, target]; - player.addTempSkill("twzhouzu_mahou", { player: "die" }); - }, - subSkill: { - mahou: { - trigger: { - global: "phaseEnd", - }, - forced: true, - popup: false, - charlotte: true, - content: function () { - var list = player.storage.twzhouzu_mahou; - list[1]--; - if (list[1] == 0) { - game.log(player, "的“咒诅”魔法生效"); - var num = list[0], - target = list[2]; - player.logSkill("twzhouzu", target); - target.chooseToDiscard( - get.translation(player) + - "对你的“咒诅”魔法生效,请弃置" + - get.cnNumber(list[0]) + - "张牌", - list[0], - true - ); - target.damage("thunder"); - player.removeSkill("twzhouzu_mahou"); - } else { - game.log(player, "的“咒阻”魔法剩余", "#g" + list[1] + "回合"); - player.markSkill("twzhouzu_mahou"); - } - }, - mark: true, - onremove: true, - marktext: "♗", - intro: { - name: "施法:咒诅", - markcount: function (storage) { - if (storage) return storage[1]; - return 0; - }, - content: function (storage) { - if (storage) { - return ( - "经过" + - storage[1] + - "个“回合结束时”后,你令" + - get.translation(storage[2]) + - "弃置" + - get.cnNumber(storage[0]) + - "张牌,然后你对其造成1点雷电伤害" - ); - } - return "未指定施法效果"; - }, - }, - }, - }, - ai: { - order: 1, - result: { - target: -5, - }, - }, - }, - twhuangjin: { - audio: 2, - trigger: { target: "useCardToTarget" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - return event.card.name == "sha" && typeof get.number(event.card) == "number"; - }, - content: function () { - "step 0"; - player.judge(function (result) { - var evt = _status.event.getTrigger(); - if (Math.abs(get.number(result) - get.number(evt.card)) <= 1) return 2; - return -1; - }).judge2 = function (result) { - return result.bool; - }; - "step 1"; - if (result.bool) { - trigger.getParent().excluded.add(player); - } - }, - ai: { - effect: { - target: function (card, player, target, current, isLink) { - if (card.name == "sha" && !isLink) return 0.8; - }, - }, - }, - }, - twguimen: { - audio: 2, - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - direct: true, - filter: function (event, player) { - if (event.type != "discard") return false; - var evt = event.getl(player); - for (var card of evt.cards2) { - if (get.suit(card, player) == "spade") return true; - } - return false; - }, - forced: true, - content: function () { - "step 0"; - var cards = []; - var evt = trigger.getl(player); - for (var card of evt.cards2) { - if (get.suit(card, player) == "spade") cards.push(card); - } - if (!cards.length) event.finish(); - else event.cards = cards; - "step 1"; - if (event.cards.length == 1) { - event._result = { bool: true, links: event.cards }; - } else { - player.chooseButton(["鬼门:选择一张♠牌,为其进行判定", event.cards], true); - } - "step 2"; - if (result.bool && result.links) { - event.judgingSpade = result.links[0]; - event.cards.remove(event.judgingSpade); - game.log(player, "选择", "#y" + get.translation(event.judgingSpade), "进行判定"); - player.judge(function (result) { - var card = _status.event.getParent().judgingSpade; - if (Math.abs(get.number(result) - get.number(card)) <= 1) return 4; - return -1; - }).judge2 = function (result) { - return result.bool; - }; - } else event.finish(); - "step 3"; - if (result.bool && game.hasPlayer((current) => current != player)) { - player - .chooseTarget("选择一名其他角色,对其造成2点雷电伤害", lib.filter.notMe, true) - .set("ai", (target) => get.damageEffect(target, player, player, "thunder")); - } - "step 4"; - if (result.bool) { - player.line(result.targets[0], "thunder"); - result.targets[0].damage(2, "thunder"); - } - if (event.cards.length) event.goto(1); - }, - }, - twdidao: { - audio: 2, - trigger: { global: "judge" }, - filter: function (event, player) { - return player.countCards("hes"); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseCard( - get.translation(trigger.player) + - "的" + - (trigger.judgestr || "") + - "判定为" + - get.translation(trigger.player.judging[0]) + - "," + - get.prompt("twdidao"), - "hes", - function (card) { - var player = _status.event.player; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - } - ) - .set("ai", function (card) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) { - if (trigger.player != player) return 0; - var checkx = get.color(card, player) == get.color(judging); - if (checkx > 0) return checkx; - return 0; - } - return result * (attitude > 0 ? 1 : -1); - }) - .set("judging", trigger.player.judging[0]); - "step 1"; - if (result.bool) { - player.respond(result.cards, "highlight", "twdidao", "noOrdering"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.$gain2(trigger.player.judging[0]); - player.gain(trigger.player.judging[0]); - var card = result.cards[0]; - if (get.color(card, player) == get.color(trigger.player.judging[0])) - player.draw("nodelay"); - trigger.player.judging[0] = result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player, "的判定牌改为", result.cards[0]); - } - "step 3"; - game.delay(2); - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - //群曹操 - twlingfa: { - audio: 2, - trigger: { global: "roundStart" }, - direct: true, - content: function () { - "step 0"; - if (game.roundNumber < 3 || !player.hasSkill("twlingfa")) { - var str; - switch (game.roundNumber) { - case 1: - str = - "获得如下效果直到本轮结束:其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。"; - break; - case 2: - str = - "获得如下效果直到本轮结束:其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。"; - break; - default: - str = "失去【令法】并获得【治暗】"; - break; - } - player.chooseBool(get.prompt("twlingfa"), str); - } else event._result = { bool: true }; - "step 1"; - if (result.bool) { - switch (game.roundNumber) { - case 1: - player.logSkill( - "twlingfa", - game.filterPlayer((current) => current != player).sortBySeat() - ); - player.addTempSkill("twlingfa_sha", "roundStart"); - break; - case 2: - player.logSkill( - "twlingfa", - game.filterPlayer((current) => current != player).sortBySeat() - ); - player.addTempSkill("twlingfa_tao", "roundStart"); - break; - default: - player.logSkill("twlingfa"); - player.addSkills(["twzhian"], ["twlingfa"]); - break; - } - } - }, - subSkill: { - sha: { - audio: "twlingfa", - trigger: { global: "useCard" }, - charlotte: true, - forced: true, - filter: function (event, player) { - return ( - player != event.player && - event.card.name == "sha" && - event.player.countCards("he") > 0 - ); - }, - logTarget: "player", - content: function () { - "step 0"; - game.delayx(); - trigger.player - .chooseToDiscard( - "he", - "令法:弃置一张牌,或受到来自" + get.translation(player) + "的1点伤害" - ) - .set("goon", get.damageEffect(trigger.player, player, trigger.player) < 0) - .set("ai", function (card) { - if (!_status.event.goon) return 0; - return 8 - get.value(card); - }); - "step 1"; - if (!result.bool) { - trigger.player.damage(); - } - }, - mark: true, - marktext: '', - intro: { - content: - "其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。", - }, - }, - tao: { - audio: "twlingfa", - trigger: { global: "useCard" }, - charlotte: true, - forced: true, - filter: function (event, player) { - return ( - player != event.player && - event.card.name == "tao" && - event.player.countCards("he") > 0 - ); - }, - logTarget: "player", - content: function () { - "step 0"; - game.delayx(); - trigger.player - .chooseCard( - "he", - "令法:交给" + get.translation(player) + "一张牌,否则受到来自其的1点伤害" - ) - .set("goon", get.damageEffect(trigger.player, player, trigger.player) < 0) - .set("ai", function (card) { - if (!_status.event.goon) return 0; - return 8 - get.value(card); - }); - "step 1"; - if (!result.bool) { - trigger.player.damage(); - } else trigger.player.give(result.cards, player); - }, - mark: true, - marktext: '', - intro: { - content: - "其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。", - }, - }, - }, - derivation: "twzhian", - }, - twzhian: { - audio: 2, - init: function (player) { - game.addGlobalSkill("twzhian_ai"); - }, - onremove: function (player) { - if (!game.hasPlayer((current) => current.hasSkill("twzhian"), true)) - game.removeGlobalSkill("twzhian_ai"); - }, - usable: 1, - trigger: { global: "useCardAfter" }, - direct: true, - filter: function (event, player) { - var type = get.type(event.card); - if (type != "delay" && type != "equip") return false; - if (event.cards.length != 1) return false; - var position = get.position(event.cards[0]); - if (position == "e" || position == "j") return true; - return event.player.isIn(); - }, - content: function () { - "step 0"; - var str = get.translation(trigger.cards[0]), - owner = get.owner(trigger.cards[0]); - var choiceList = [ - "弃置" + (owner ? get.translation(owner) + "区域内的" : "") + str, - "弃置一张手牌并获得" + str, - "对" + get.translation(trigger.player) + "造成1点伤害", - ]; - var choices = []; - if (owner && lib.filter.canBeDiscarded(card, player, owner)) choices.push("选项一"); - else choiceList[0] = '' + choiceList[0] + ""; - if ( - owner && - player.hasCard(function (card) { - return lib.filter.cardDiscardable(card, player, "twzhian"); - }, "h") && - lib.filter.canBeGained(card, player, owner) - ) - choices.push("选项二"); - else choiceList[1] = '' + choiceList[1] + ""; - if (trigger.player.isIn()) choices.push("选项三"); - else choiceList[2] = '' + choiceList[2] + ""; - player - .chooseControl(choices, "cancel2") - .set("choiceList", choiceList) - .set("prompt", get.prompt("twzhian")) - .set("ai", function () { - var player = _status.event.player, - choices = _status.event.controls.slice(0); - var card = _status.event.getTrigger().cards[0], - owner = get.owner(card); - var getEffect = function (choice) { - if (choice == "cancel2") return 0.1; - if (choice == "选项三") { - return get.damageEffect( - _status.event.getTrigger().player, - player, - player - ); - } - var result; - if (get.position(card) == "j") { - result = - -get.effect( - player, - { - name: card.viewAs || card.name, - cards: [card], - }, - player, - player - ) * get.sgn(get.attitude(player, owner)); - } else - result = - -(get.value(card, owner) - 0.01) * - get.sgn(get.attitude(player, owner)); - if (choice == "选项一") return result; - if ( - player.hasCard(function (cardx) { - return ( - lib.filter.cardDiscardable(cardx, player, "twzhian") && - get.value(cardx, player) < get.value(card, player) - ); - }, "h") - ) - return result * 1.2; - return 0; - }; - choices.sort(function (a, b) { - return getEffect(b) - getEffect(a); - }); - return choices[0]; - }); - "step 1"; - if (result.control != "cancel2") { - var card = trigger.cards[0], - owner = get.owner(card); - switch (result.control) { - case "选项一": - player.logSkill("twzhian", owner); - owner.discard(card, "notBySelf"); - event.finish(); - break; - case "选项二": - player.chooseToDiscard("h", true).logSkill = ["twzhian", owner]; - event.target = owner; - break; - case "选项三": - player.logSkill("twzhian", trigger.player); - trigger.player.damage(); - event.finish(); - break; - } - } else player.storage.counttrigger.twzhian--; - "step 2"; - if (result.bool && target.getCards("ej").includes(trigger.cards[0])) - player.gain(trigger.cards, target, "give", "bySelf"); - }, - subSkill: { - ai: { - trigger: { player: "dieAfter" }, - filter: function (event, player) { - return !game.hasPlayer((current) => current.hasSkill("twzhian"), true); - }, - silent: true, - forceDie: true, - content: function () { - game.removeGlobalSkill("twzhian_ai"); - }, - ai: { - effect: { - player: function (card, player, target) { - if (get.type(card) !== "delay" && get.type(card) !== "equip") return 1; - let za = game.findPlayer( - (cur) => - cur.hasSkill("twzhian") && - (!cur.storage.counttrigger || - !cur.storage.counttrigger.twzhian) && - get.attitude(player, cur) <= 0 - ); - if (za) return [0.5, -0.8]; - }, - }, - }, - }, - }, - }, - twyujue: { - audio: 2, - global: "twyujue_give", - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - direct: true, - filter: function (event, player) { - if (player == _status.currentPhase) return false; - var cards = event.getg(player); - if (!cards.length) return false; - return game.hasPlayer(function (current) { - if (current == player) return false; - var evt = event.getl(current); - if (!evt || !evt.cards2 || !evt.cards2.filter((card) => cards.includes(card)).length) - return false; - return !current.hasSkill("twyujue_effect0") || !current.hasSkill("twyujue_effect1"); - }); - }, - content: function () { - "step 0"; - var cards = trigger.getg(player); - var list = game - .filterPlayer(function (current) { - if (current == player) return false; - var evt = trigger.getl(current); - if ( - !evt || - !evt.cards2 || - !evt.cards2.filter((card) => cards.includes(card)).length - ) - return false; - return ( - !current.hasSkill("twyujue_effect0") || !current.hasSkill("twyujue_effect1") - ); - }) - .sortBySeat(); - event.targets = list; - "step 1"; - var target = event.targets.shift(); - if (target.isIn()) { - event.target = target; - var num = 2; - if (target.hasSkill("twyujue_effect0")) num--; - if (target.hasSkill("twyujue_effect1")) num--; - var cards = trigger.getg(player); - num = Math.min( - num, - trigger.getl(target).cards2.filter((i) => cards.includes(i)).length - ); - if (num > 0) event.count = num; - else if (targets.length > 0) event.redo(); - else event.finish(); - } else if (targets.length > 0) event.redo(); - else event.finish(); - "step 2"; - event.count--; - player - .chooseBool( - get.prompt("twyujue", target), - "可令其选择本回合内未选择过的一项:⒈弃置攻击范围内一名角色的一张牌。⒉下一次使用牌时,从牌堆中获得一张同类别的牌。" - ) - .set("ai", function () { - var evt = _status.event.getParent(); - return get.attitude(evt.player, evt.target) > 0; - }); - "step 3"; - if (result.bool) { - player.logSkill("twyujue", target); - var list = [0, 1]; - if (target.hasSkill("twyujue_effect0")) list.remove(0); - if (target.hasSkill("twyujue_effect1")) list.remove(1); - if (!list.length) event.goto(6); - else if (list.length == 1) event._result = { index: list[0] }; - else - target - .chooseControl() - .set("choiceList", [ - "弃置攻击范围内一名角色的一张牌", - "下一次使用牌时,从牌堆中获得一张同类别的牌", - ]) - .set("ai", function () { - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return ( - player.inRange(current) && - current.countDiscardableCards(player, "he") > 0 && - get.effect(current, { name: "guohe_copy2" }, player, player) > - 0 - ); - }) - ) - return 0; - return 1; - }); - } else event.goto(6); - "step 4"; - target.addTempSkill("twyujue_effect" + result.index); - if (result.index == 0) { - if ( - game.hasPlayer(function (current) { - return ( - target.inRange(current) && current.countDiscardableCards(target, "he") > 0 - ); - }) - ) { - target - .chooseTarget( - "弃置攻击范围内一名角色的一张牌", - true, - function (card, player, target) { - return ( - player.inRange(target) && - target.countDiscardableCards(player, "he") > 0 - ); - } - ) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy2" }, player, player); - }); - } else event.goto(6); - } else event.goto(6); - "step 5"; - if (result.bool) { - var target2 = result.targets[0]; - target.line(target2, "green"); - target.discardPlayerCard(target2, "he", true); - } - "step 6"; - game.delayx(); - if (event.count > 0) event.goto(2); - else if (targets.length) event.goto(1); - }, - subSkill: { - clear: { - onremove: true, - }, - effect0: { charlotte: true }, - effect1: { - charlotte: true, - trigger: { player: "useCard" }, - usable: 1, - forced: true, - popup: false, - content: function () { - player.unmarkSkill("twyujue_effect1"); - var type2 = get.type2(trigger.card, false); - var card = get.cardPile2(function (card) { - return get.type2(card, false) == type2; - }); - if (card) trigger.player.gain(card, "gain2"); - }, - mark: true, - marktext: "爵", - intro: { content: "使用下一张牌时,从牌堆中获得一张类型相同的牌" }, - }, - }, - }, - twyujue_give: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - if (!player.countCards("he")) return false; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("twyujue"); - }); - if (!targets.length) return false; - for (var target of targets) { - var num = 2; - if (player.group == "qun" && target.hasZhuSkill("twfengqi", player)) num = 4; - if (target.countMark("twyujue_clear") < num) return true; - } - return false; - }, - selectCard: function () { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("twyujue"); - }); - return [ - 1, - Math.max.apply( - Math, - targets.map(function (target) { - var num = 2; - if (player.group == "qun" && target.hasZhuSkill("twfengqi", player)) num = 4; - return num - target.countMark("twyujue_clear"); - }) - ), - ]; - }, - filterCard: true, - filterTarget: function (card, player, target) { - if (!target.hasSkill("twyujue")) return false; - var num = 2; - if (player.group == "qun" && target.hasZhuSkill("twfengqi", player)) num = 4; - return num - target.countMark("twyujue_clear") >= Math.max(1, ui.selected.cards.length); - }, - selectTarget: function () { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("twyujue"); - }); - return targets.length > 1 ? 1 : -1; - }, - complexSelect: true, - prompt: function () { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("twyujue"); - }); - return ( - "将任意张牌交给" + get.translation(targets) + (targets.length > 1 ? "中的一人" : "") - ); - }, - position: "he", - discard: false, - lose: false, - delay: false, - check: function (card) { - if (ui.selected.cards.length) return 0; - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return ( - lib.skill.twyujue_give.filterTarget(null, player, current) && - get.attitude(player, current) > 0 - ); - }) - ) { - var val = get.value(card); - if (val <= 0 && get.position(card) == "e") return 100 - val; - if ( - !player.hasSkill("twyujue_effect1") && - player.hasCard(function (cardx) { - return cardx != card && player.getUseValue(cardx, null, true) > 0; - }, "hs") - ) - return 6 - get.value(card); - if ( - !player.hasSkill("twyujue_effect0") && - game.hasPlayer(function (current) { - return ( - player.inRange(current) && - current.countDiscardableCards(player, "he") > 0 && - get.effect(current, { name: "guohe_copy2" }, player, player) > 0 - ); - }) - ) - return 5.5 - get.value(card); - } - return 0; - }, - content: function () { - game.trySkillAudio("twyujue", target); - player.give(cards, target); - target.addTempSkill("twyujue_clear"); - target.addMark("twyujue_clear", cards.length, false); - }, - ai: { - order: 10, - result: { target: 1 }, - }, - }, - twgezhi: { - audio: 2, - trigger: { player: "useCard" }, - direct: true, - filter: function (event, player) { - if (!player.countCards("h")) return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - var type = get.type2(event.card, false); - return !player.hasHistory( - "useCard", - function (evtx) { - return ( - evtx != event && - get.type2(evtx.card, false) == type && - evtx.getParent("phaseUse") == evt - ); - }, - event - ); - }, - content: function () { - "step 0"; - if (!event.isMine() && !event.isOnline()) game.delayx(); - player - .chooseCard("是否发动【革制】重铸一张牌?", lib.filter.cardRecastable) - .set("ai", function (card) { - return 5.5 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("twgezhi"); - player.recast(result.cards); - } - }, - group: "twgezhi_buff", - subSkill: { - buff: { - audio: "twgezhi", - trigger: { player: "phaseUseEnd" }, - direct: true, - filter: function (event, player) { - return ( - player.getHistory("lose", function (evt) { - return ( - evt.getParent(3).name == "twgezhi" && - evt.getParent("phaseUse") == event - ); - }).length > 1 - ); - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("twgezhi"), - "你可以令一名角色选择获得一个其未获得过的效果:⒈攻击范围+2;⒉手牌上限+2;⒊加1点体力上限。", - function (card, player, target) { - return ( - !target.hasSkill("twgezhi_选项一") || - !target.hasSkill("twgezhi_选项二") || - !target.hasSkill("twgezhi_选项三") - ); - } - ) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("twgezhi", target); - var list = []; - for (var i = 1; i <= 3; i++) { - var str = "选项" + get.cnNumber(i, true); - if (!target.hasSkill("twgezhi_" + str)) list.push(str); - } - if (list.length == 1) event._result = { control: list[0] }; - else - target - .chooseControl(list) - .set("choiceList", [ - "令自己的攻击范围+2", - "令自己的手牌上限+2", - "令自己的体力上限+1", - ]) - .set("ai", function () { - var player = _status.event.player, - controls = _status.event.controls; - if ( - controls.includes("选项一") && - game.hasPlayer(function (current) { - return ( - (get.realAttitude || get.attitude)(player, current) < - 0 && get.distance(player, current, "attack") > 1 - ); - }) - ) - return "选项一"; - if (controls.includes("选项二") && player.needsToDiscard()) - return "选项二"; - if (controls.includes("选项三")) return "选项三"; - return controls.randomGet(); - }); - } else { - event._triggered = null; - event.finish(); - } - "step 2"; - target.addSkill("twgezhi_" + result.control); - if (result.control == "选项三") target.gainMaxHp(); - "step 3"; - game.delayx(); - }, - }, - 选项一: { - charlotte: true, - mod: { - attackFrom: function (from, to, distance) { - return distance - 2; - }, - }, - mark: true, - marktext: " +2 ", - intro: { content: "攻击范围+2" }, - }, - 选项二: { - charlotte: true, - mod: { - maxHandcard: function (player, num) { - return num + 2; - }, - }, - mark: true, - marktext: " +2 ", - intro: { content: "手牌上限+2" }, - }, - 选项三: { - charlotte: true, - mark: true, - marktext: " +1 ", - intro: { content: "体力上限+1" }, - }, - }, - }, - twfengqi: { - audio: 2, - zhuSkill: true, - trigger: { player: "twgezhi_buffAfter" }, - direct: true, - filter: function (event, player) { - if ( - !event.target || - !event.target.isIn() || - !player.hasZhuSkill("twfengqi", event.target) - ) - return false; - var target = event.target; - return target.getStockSkills(true, true).some((skill) => { - if (target.hasSkill(skill)) return false; - var info = get.info(skill); - return info && info.zhuSkill; - }); - }, - skillAnimation: true, - animationColor: "thunder", - content: function () { - "step 0"; - event.target = trigger.target; - event.target.chooseBool(get.prompt("twfengqi"), "获得武将牌上的所有主公技"); - "step 1"; - if (result.bool) { - target.logSkill("twfengqi", player); - var skills = target.getStockSkills(true, true).filter((skill) => { - if (target.hasSkill(skill)) return false; - var info = get.info(skill); - return info && info.zhuSkill; - }); - target.addSkills(skills); - //for(var i of skills) target.addSkillLog(i); - } - }, - ai: { - combo: "twyujue" - }, - }, - twsidai: { - audio: 2, - enable: "phaseUse", - usable: 1, - locked: false, - limited: true, - skillAnimation: true, - animationColor: "fire", - filter: function (event, player) { - var cards = player.getCards("h", { type: "basic" }); - if (!cards.length) return false; - for (var i of cards) { - if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; - } - return event.filterCard( - get.autoViewAs({ name: "sha", storage: { twsidai: true } }, cards), - player, - event - ); - }, - viewAs: { name: "sha", storage: { twsidai: true } }, - filterCard: { type: "basic" }, - selectCard: -1, - check: () => 1, - onuse: function (result, player) { - player.awakenSkill("twsidai"); - player.addTempSkill("twsidai_effect"); - }, - ai: { - order: 2.9, - result: { - target: function (player, target) { - var cards = ui.selected.cards.slice(0); - var names = []; - for (var i of cards) names.add(i.name); - if (names.length < player.hp) return 0; - if (player.hasUnknown() && (player.identity != "fan" || !target.isZhu)) return 0; - if (get.attitude(player, target) >= 0) return -20; - return lib.card.sha.ai.result.target.apply(this, arguments); - }, - }, - }, - mod: { - cardUsable: function (card) { - if (card.storage && card.storage.twsidai) return Infinity; - }, - targetInRange: function (card) { - if (card.storage && card.storage.twsidai) return true; - }, - }, - subSkill: { - effect: { - charlotte: true, - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - if ( - !event.card || - !event.card.storage || - !event.card.storage.twsidai || - event.getParent().type != "card" - ) - return false; - for (var i of event.cards) { - if (i.name == "jiu") return true; - } - return false; - }, - forced: true, - popup: false, - content: function () { - trigger.num *= 2; - game.log(trigger.card, "的伤害值", "#y×2"); - }, - group: ["twsidai_tao", "twsidai_shan"], - }, - tao: { - trigger: { source: "damageSource" }, - filter: function (event, player) { - if ( - !event.card || - !event.card.storage || - !event.card.storage.twsidai || - !event.player.isIn() - ) - return false; - for (var i of event.cards) { - if (i.name == "tao") return true; - } - return false; - }, - forced: true, - popup: false, - content: function () { - trigger.player.loseMaxHp(); - }, - }, - shan: { - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - if ( - !event.card || - !event.card.storage || - !event.card.storage.twsidai || - !event.target.isIn() - ) - return false; - for (var i of event.cards) { - if (i.name == "shan") return true; - } - return false; - }, - forced: true, - popup: false, - content: function () { - "step 0"; - trigger.target - .chooseToDiscard( - "h", - { type: "basic" }, - "弃置一张基本牌,否则不能响应" + get.translation(trigger.card) - ) - .set("ai", function (card) { - var player = _status.event.player; - if ( - player.hasCard("hs", function (cardx) { - return cardx != card && get.name(cardx, player) == "shan"; - }) - ) - return 12 - get.value(card); - return 0; - }); - "step 1"; - if (!result.bool) trigger.directHit.add(trigger.target); - }, - }, - }, - }, - twjieyu: { - audio: 2, - trigger: { player: ["phaseJieshuBegin", "damageEnd"] }, - round: 1, - filter: function (event, player) { - if (event.name != "phaseJieshu") { - var history = player.getHistory("damage"); - for (var i of history) { - if (i == event) break; - return false; - } - var all = player.actionHistory; - for (var i = all.length - 2; i >= 0; i--) { - if (all[i].damage.length) return false; - if (all[i].isRound) break; - } - } - return ( - player.countCards("h") > 0 && - !player.hasCard(function (card) { - return !lib.filter.cardDiscardable(card, player, "twjieyu"); - }, "h") - ); - }, - check: function (event, player) { - var cards = [], - names = []; - for (var i = 0; i < ui.discardPile.childNodes.length; i++) { - var card = ui.discardPile.childNodes[i]; - if (get.type(card, false) == "basic" && !names.includes(card.name)) { - cards.push(card); - names.push(card.name); - } - } - if (!names.includes("shan") || !names.includes("tao")) return false; - if (player.countCards("h", "shan") < 2 && player.countCards("h", "tao") < 1) return true; - return false; - }, - content: function () { - "step 0"; - player.discard(player.getCards("h")); - "step 1"; - var cards = [], - names = []; - for (var i = 0; i < ui.discardPile.childNodes.length; i++) { - var card = ui.discardPile.childNodes[i]; - if (get.type(card, false) == "basic" && !names.includes(card.name)) { - cards.push(card); - names.push(card.name); - } - } - if (cards.length) player.gain(cards, "gain2"); - }, - }, - twhanyu: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - var cards = [], - types = ["basic", "trick", "equip"]; - for (var i of types) { - var card = get.cardPile2(function (card) { - return get.type2(card, false) == i; - }); - if (card) cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - }, - }, - twhengjiang: { - audio: "hengjiang", - trigger: { player: "useCardToPlayer" }, - filter: function (event, player) { - return ( - !player.hasSkill("twhengjiang2") && - event.targets.length == 1 && - ["basic", "trick"].includes(get.type(event.card, false)) && - player.isPhaseUsing() && - game.hasPlayer(function (current) { - return ( - player.inRange(current) && - lib.filter.targetEnabled2(event.card, player, current) - ); - }) - ); - }, - prompt: "是否发动【横江】?", - prompt2: function (event, player) { - return ( - "将" + - get.translation(event.card) + - "的目标改为" + - get.translation(lib.skill.twhengjiang.logTarget(event, player)) - ); - }, - logTarget: function (event, player) { - return game - .filterPlayer(function (current) { - return ( - player.inRange(current) && - lib.filter.targetEnabled2(event.card, player, current) - ); - }) - .sortBySeat(); - }, - check: function (event, player) { - var effect1 = get.effect(event.target, event.card, player, player); - var effect2 = 0, - targets = lib.skill.twhengjiang.logTarget(event, player); - for (var i of targets) effect2 += get.effect(i, event.card, player, player); - return effect2 > effect1; - }, - content: function () { - var targets = lib.skill.twhengjiang.logTarget(trigger, player); - trigger.targets.length = 0; - trigger.targets.addArray(targets); - trigger.getParent().triggeredTargets1.length = 0; - trigger.getParent().twhengjiang_buffed = true; - player.addTempSkill("twhengjiang2", "phaseUseAfter"); - }, - }, - twhengjiang2: { - charlotte: true, - trigger: { player: "useCardAfter" }, - forced: true, - popup: false, - filter: function (event, player) { - return ( - event.twhengjiang_buffed && - game.hasPlayer2(function (current) { - return ( - current != player && - (current.hasHistory("useCard", function (evt) { - return evt.respondTo && evt.respondTo[1] == event.card; - }) || - current.hasHistory("respond", function (evt) { - return evt.respondTo && evt.respondTo[1] == event.card; - })) - ); - }) - ); - }, - content: function () { - player.draw( - game.countPlayer2(function (current) { - return ( - current != player && - (current.hasHistory("useCard", function (evt) { - return evt.respondTo && evt.respondTo[1] == trigger.card; - }) || - current.hasHistory("respond", function (evt) { - return evt.respondTo && evt.respondTo[1] == trigger.card; - })) - ); - }) - ); - }, - }, - twyuanhu: { - audio: "yuanhu", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.hasCard({ type: "equip" }, "eh"); - }, - filterCard: { type: "equip" }, - filterTarget: function (card, player, target) { - var card = ui.selected.cards[0]; - return target.canEquip(card); - }, - discard: false, - lose: false, - prepare: "give", - position: "he", - check: function (card) { - if (get.position(card) == "h") return 9 - get.value(card); - return 7 - get.value(card); - }, - content: function () { - "step 0"; - target.equip(cards[0]); - "step 1"; - event.goto(3); - switch (get.subtype(cards[0])) { - case "equip1": - if ( - game.hasPlayer(function (current) { - return ( - current != target && - get.distance(target, current) == 1 && - current.countCards("hej") > 0 - ); - }) - ) { - player - .chooseTarget( - true, - "弃置一名距离" + get.translation(target) + "为1的角色区域内的一张牌", - function (card, player, target) { - var current = _status.event.current; - return ( - current != target && - get.distance(current, target) == 1 && - current.countCards("hej") > 0 - ); - } - ) - .set("current", target) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy" }, player, player); - }); - event.goto(2); - } - break; - case "equip2": - target.draw(); - break; - case "equip3": - case "equip4": - case "equip5": - case "equip6": - target.recover(); - break; - } - "step 2"; - var target = result.targets[0]; - player.line(target); - player.discardPlayerCard(target, true, "hej"); - "step 3"; - if (target.hp <= player.hp || target.countCards("h") <= player.countCards("h")) { - player.draw(); - player.addTempSkill("twyuanhu_end"); - } - }, - ai: { - order: 10, - result: { - player: function (player, target) { - if (get.attitude(player, target) == 0) return 0; - if (!ui.selected.cards.length) return; - var eff = get.effect(target, ui.selected.cards[0], player, player), - sub = get.subtype(ui.selected.cards[0], false); - if (target == player) eff += 4; - else { - var hp = player.hp, - hs = player.countCards("h", (card) => card != ui.selected.cards[0]); - var tp = target.hp, - ts = target.countCards("h"); - if (sub == "equip2") ts++; - if ( - tp < target.maxHp && - (sub == "equip3" || sub == "equip4" || sub == "equip5" || sub == "equip6") - ) - tp++; - if (tp <= hp || ts <= hs) eff += 2; - } - if (sub == "equip1") { - var list = game - .filterPlayer(function (current) { - return ( - current != target && - get.distance(target, current) == 1 && - current.countCards("hej") < 0 - ); - }) - .map(function (i) { - return get.effect(i, { name: "guohe_copy" }, player, player); - }) - .sort((a, b) => b - a); - if (list.length) eff += list[0]; - } - return eff; - }, - target: function (player, target) { - if (!ui.selected.cards.length) return 0; - var sub = get.subtype(ui.selected.cards[0], false); - var eff = get.effect(target, ui.selected.cards[0], player, target); - if (sub == "equip2") eff += get.effect(target, { name: "draw" }, target, target); - if ( - target.isDamaged() && - (sub == "equip3" || sub == "equip4" || sub == "equip5" || sub == "equip6") - ) - eff += get.recoverEffect(target, player, player); - return eff; - }, - }, - }, - subSkill: { - end: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - charlotte: true, - filter: function (event, player) { - return player.hasSkill("twyuanhu") && player.hasCard({ type: "equip" }, "eh"); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: get.prompt("twyuanhu"), - prompt2: - "将一张装备牌置入一名角色的装备区内。若此牌为:武器牌,你弃置与其距离为1的另一名角色区域的一张牌;防具牌,其摸一张牌;坐骑牌或宝物牌,其回复1点体力。然后若其体力值或手牌数不大于你,则你摸一张牌。", - filterCard: lib.skill.twyuanhu.filterCard, - filterTarget: lib.skill.twyuanhu.filterTarget, - position: "he", - ai1: lib.skill.twyuanhu.check, - ai2: function (target) { - var player = _status.event.player; - return get.effect(target, "twyuanhu", player, player); - }, - }); - "step 1"; - if (result.bool) { - result.skill = "twyuanhu"; - player.useResult(result, event); - } - }, - }, - }, - }, - twjuezhu: { - audio: 2, - limited: true, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - filter: function (event, player) { - return player.hasEnabledSlot(3) || player.hasEnabledSlot(4); - }, - skillAnimation: true, - animationColor: "water", - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("twjuezhu"), [1, 2], function (card, player, target) { - return !ui.selected.targets.length && !target.hasSkill("feiying"); - }) - .set("multitarget", true) - .set("promptbar", "none") - .set("ai", function (target) { - if (player.hasUnknown()) return false; - return get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - event.target = result.targets[0]; - var list = []; - if (player.hasEnabledSlot(3)) list.push("equip3"); - if (player.hasEnabledSlot(4)) list.push("equip4"); - if (list.length == 1) event._result = { control: list[0] }; - else player.chooseControl(list).set("prompt", "选择废除一个坐骑栏"); - } else event.finish(); - "step 2"; - player.logSkill("twjuezhu", target); - player.awakenSkill("twjuezhu"); - player.disableEquip(result.control); - target.disableJudge(); - player.markAuto("twjuezhu_restore", [[target, result.control]]); - player.addSkill("twjuezhu_restore"); - target.addSkills("feiying"); - }, - subSkill: { - restore: { - trigger: { global: "die" }, - forced: true, - charlotte: true, - filter: function (event, player) { - for (var i of player.getStorage("twjuezhu_restore")) { - if (i[0] == event.player && player.hasDisabledSlot(i[1])) return true; - } - return false; - }, - content: function () { - var list = []; - for (var i of player.getStorage("twjuezhu_restore")) { - if (i[0] == trigger.player && player.hasDisabledSlot(i[1])) list.push(i[1]); - } - player.enableEquip(list); - }, - }, - }, - derivation: "feiying", - }, - twfengpo: { - audio: "fengpo", - trigger: { player: "useCardToPlayered" }, - logTarget: "target", - filter: function (event, player) { - return ( - (event.card.name == "sha" || event.card.name == "juedou") && - event.targets.length == 1 && - event.target.countCards("h") > 0 - ); - }, - onremove: true, - content: function () { - "step 0"; - event.target = trigger.target; - player.viewHandcards(trigger.target); - "step 1"; - var num = target.countCards( - "h", - player.storage.twfengpo ? { color: "red" } : { suit: "diamond" } - ); - if (!num) { - event.finish(); - return; - } - event.num = num; - player - .chooseControl() - .set("choiceList", [ - "摸" + num + "张牌", - "令" + get.translation(trigger.card) + "的伤害值基数+" + num, - ]); - "step 2"; - if (result.index == 0) player.draw(num); - else trigger.getParent().baseDamage += num; - }, - group: "twfengpo_kill", - subSkill: { - kill: { - audio: "fengpo", - trigger: { source: "die" }, - forced: true, - filter: (event, player) => !player.storage.twfengpo, - skillAnimation: true, - animationColor: "fire", - content: function () { - player.storage.twfengpo = true; - player.popup("凤魄"); - game.log(player, "恢复了技能", "#g【凤魄】"); - }, - }, - }, - }, - twmouzhu: { - audio: "mouzhu", - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - contentBefore: function () { - var target = targets[0], - evt = event.getParent(); - evt._target = target; - var list = game.filterPlayer(function (current) { - return current != player && current != target && current.hp <= player.hp; - }); - if (!list.length) { - player.loseHp(); - evt.finish(); - } else { - evt.targets = list.sortBySeat(); - player.line(list); - } - }, - content: function () { - "step 0"; - target - .chooseCard("he", "是否交给" + get.translation(player) + "一张牌?") - .set("ai", function (card) { - if (_status.event.goon) return 7 - get.value(card); - return 0; - }) - .set("goon", get.attitude(target, player) > 0); - "step 1"; - if (result.bool) { - target.give(result.cards, player); - } else { - game.log(target, "拒绝给牌"); - } - }, - contentAfter: function () { - "step 0"; - var num = 0, - par = event.getParent(); - player.getHistory("gain", function (evt) { - if (evt.getParent(2) == par) num += evt.cards.length; - }); - if (!num) { - player.loseHp(); - for (var i of targets) i.loseHp(); - event.finish(); - } else { - var target = event.getParent()._target; - event.target = target; - event.num = num; - var bool1 = player.canUse("sha", target, false), - bool2 = player.canUse("juedou", target, false); - if (bool1 && bool2) - target - .chooseControl("sha", "juedou") - .set("prompt", "谋诛:视为被" + get.translation(player) + "使用一张…") - .set("prompt2", "(伤害值基数:" + num + ")") - .set("ai", function () { - var target = _status.event.player, - player = _status.event.getParent().player; - if ( - target.hasShan() || - get.effect(target, { name: "sha" }, player, target) > 0 - ) - return "sha"; - if (get.effect(target, { name: "juedou" }, player, target) > 0) - return "juedou"; - return "sha"; - }); - else if (bool1) event._result = { control: "sha" }; - else if (bool2) event._result = { control: "juedou" }; - else event.finish(); - } - "step 1"; - if (result.control && lib.card[result.control]) - player.useCard( - { - name: result.control, - isCard: true, - }, - false, - target - ).baseDamage = num; - }, - ai: { - order: 9, - result: { - target: function (player, target) { - if (get.attitude(player, target) >= 0) return 0; - var list = game.filterPlayer(function (current) { - return current != player && current != target && current.hp <= player.hp; - }); - if (!list.length) return 0; - return ( - -Math.min( - -get.effect(target, { name: "sha" }, player, target), - -get.effect(target, { name: "juedou" }, player, target) - ) * - list.reduce(function (num, current) { - return num + (2 + get.sgn(get.attitude(current, player))); - }, 0) - ); - }, - }, - }, - }, - twyanhuo: { - audio: "yanhuo", - trigger: { player: "die" }, - direct: true, - forceDie: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return ( - player.countCards("he") > 0 && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }) - ); - }, - content: function () { - "step 0"; - var num = player.countCards("he"), - str = get.cnNumber(num); - event.num1 = num; - event.num2 = 1; - var list = ["令一名其他角色弃置" + str + "张牌"]; - if (num > 1) { - list.push("令至多" + str + "名其他角色各弃置一张牌"); - } - player - .chooseControl("cancel2") - .set("choiceList", list) - .set("prompt", get.prompt("twyanhuo")) - .set("forceDie", true); - "step 1"; - if (result.control != "cancel2") { - if (result.index == 0) { - event.num2 = event.num1; - event.num1 = 1; - } - player - .chooseTarget( - [1, event.num1], - true, - "请选择【延祸】的目标", - function (card, player, target) { - return target != player && target.countCards("he") > 0; - } - ) - .set("forceDie", true) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var targets = result.targets.sortBySeat(); - player.logSkill("twyanhuo", targets); - for (var i of targets) i.chooseToDiscard(true, "he", event.num2); - } - }, - }, - twshenxing: { - mod: { - globalFrom: function (player, target, distance) { - var es = player.getCards("e", function (card) { - return !ui.selected.cards.includes(card); - }); - for (var i of es) { - var type = get.subtype(i); - if (type == "equip3" || type == "equip4" || type == "equip6") return distance; - } - return distance - 1; - }, - maxHandcard: function (player, distance) { - var es = player.getCards("e", function (card) { - return !ui.selected.cards.includes(card); - }); - for (var i of es) { - var type = get.subtype(i); - if (type == "equip3" || type == "equip4" || type == "equip6") return distance; - } - return distance + 1; - }, - }, - }, - twdaoji: { - audio: "daoji", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.hasCard(lib.skill.twdaoji.filterCard, "he"); - }, - filterCard: function (card) { - return get.type(card) != "basic"; - }, - position: "he", - filterTarget: function (card, player, target) { - return ( - target != player && - player.inRange(target) && - target.hasCard((card) => lib.filter.canBeGained(card, target, player), "he") - ); - }, - check: function (card) { - return 8 - get.value(card); - }, - content: function () { - "step 0"; - player.gainPlayerCard(target, "he", true); - "step 1"; - if (result.bool && result.cards && result.cards.length == 1) { - var card = result.cards[0]; - if (player.getCards("h").includes(card)) { - var type = get.type(card); - if (type == "basic") player.draw(); - else if (type == "equip") { - if (player.hasUseTarget(card)) player.chooseUseTarget(card, "nopopup", true); - target.damage("nocard"); - } - } - } - }, - ai: { - order: 6, - result: { - target: function (player, target) { - var eff = get.effect(target, { name: "shunshou_copy2" }, player, target); - if (target.countCards("e") > 0) eff += get.damageEffect(target, player, target); - return eff; - }, - }, - }, - }, - xinzhenjun: { - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - filterCard: true, - filterTarget: lib.filter.notMe, - position: "he", - prompt: get.prompt2("xinzhenjun"), - ai1: function (card) { - var player = _status.event.player; - if (card.name == "sha" && get.color(card) == "red") { - for (var i = 0; i < game.players.length; i++) { - var current = game.players[i]; - if ( - current != player && - get.attitude(player, current) > 0 && - current.hasValueTarget(card) - ) - return 7; - } - return 0; - } - return 7 - get.value(card); - }, - ai2: function (target) { - var player = _status.event.player; - var card = ui.selected.cards[0]; - var att = get.attitude(player, target); - if (get.value(card) < 0) return -att * 2; - if ( - target.countCards("h", { name: "sha", color: "red" }) || - target.hasSkill("wusheng") || - target.hasSkill("new_rewusheng") || - target.hasSkill("wushen") || - (card.name == "sha" && - get.color(card) == "red" && - target.hasValueTarget(card)) - ) - return att * 2; - var eff = 0; - game.countPlayer(function (current) { - if (target != current && get.distance(target, current, "attack") > 1) return; - var eff2 = get.damageEffect(current, player, player); - if (eff2 > eff) eff = eff2; - }); - if (att > 0 && eff > 0) eff += 2 * att; - return eff; - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("xinzhenjun", target); - player.give(result.cards, target); - } else event.finish(); - "step 2"; - target.chooseToUse({ - filterCard: function (card) { - return ( - get.name(card) == "sha" && - get.color(card) != "black" && - lib.filter.cardEnabled.apply(this, arguments) - ); - }, - prompt: - "请使用一张不为黑色的【杀】,否则" + - get.translation(player) + - "可以对你或你攻击范围内的一名其他角色造成1点伤害", - }); - "step 3"; - if (result.bool) { - var num = 1; - game.countPlayer2(function (current) { - current.getHistory("damage", function (evt) { - if (evt.getParent(evt.notLink() ? 4 : 8) == event) num += evt.num; - }); - }); - player.draw(num); - event.finish(); - } else { - player - .chooseTarget( - "是否对" + get.translation(target) + "或其攻击范围内的一名角色造成1点伤害?", - function (card, player, target) { - return ( - target == _status.event.targetx || - _status.event.targetx.inRange(target) - ); - } - ) - .set("targetx", event.target).ai = function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }; - } - "step 4"; - if (result.bool) { - player.line(result.targets); - result.targets[0].damage("nocard"); - } - }, - }, - twmoukui: { - audio: "moukui", - trigger: { player: "useCardToPlayered" }, - direct: true, - preHidden: true, - filter: function (event, player) { - return event.card && event.card.name == "sha"; - }, - content: function () { - "step 0"; - var list = ["选项一"]; - if (trigger.target.countDiscardableCards(player, "he") > 0) list.push("选项二"); - list.push("背水!"); - list.push("cancel2"); - player - .chooseControl(list) - .set("choiceList", [ - "摸一张牌", - "弃置" + get.translation(trigger.target) + "的一张牌", - "背水!依次执行以上两项。然后若此【杀】未令其进入濒死状态,则其弃置你的一张牌。", - ]) - .set("prompt", get.prompt("twmoukui", trigger.target)) - .setHiddenSkill("twmoukui"); - "step 1"; - if (result.control != "cancel2") { - var target = trigger.target; - player.logSkill("twmoukui", target); - if (result.control == "选项一" || result.control == "背水!") player.draw(); - if (result.control == "选项二" || result.control == "背水!") - player.discardPlayerCard(target, true, "he"); - if (result.control == "背水!") { - player.addTempSkill("twmoukui_effect"); - var evt = trigger.getParent(); - if (!evt.twmoukui_effect) evt.twmoukui_effect = []; - evt.twmoukui_effect.add(target); - } - } - }, - subSkill: { - effect: { - trigger: { player: "useCardAfter" }, - charlotte: true, - forced: true, - filter: function (event, player) { - return ( - event.twmoukui_effect && - event.twmoukui_effect.filter(function (current) { - return ( - current.isIn() && - !current.hasHistory("damage", function (evt) { - return evt._dyinged && evt.card == event.card; - }) - ); - }).length > 0 - ); - }, - content: function () { - var list = trigger.twmoukui_effect - .filter(function (current) { - return ( - current.isIn() && - !current.hasHistory("damage", function (evt) { - return evt._dyinged && evt.card == event.card; - }) - ); - }) - .sortBySeat(); - for (var i of list) { - i.discardPlayerCard(player, true, "he").boolline = true; - } - }, - }, - }, - }, - twfuhan: { - audio: "fuhan", - trigger: { player: "phaseZhunbeiBegin" }, - unique: true, - limited: true, - skillAnimation: true, - animationColor: "orange", - forceunique: true, - filter: function (event, player) { - return player.countMark("fanghun") > 0; - }, - prompt: function (event, player) { - var num = Math.max(2, player.storage.fanghun); - num = Math.min(num, 8); - return get.prompt("twfuhan") + "(体力上限:" + num + ")"; - }, - check: function (event, player) { - if (player.storage.fanghun >= Math.min(4, player.maxHp)) return true; - if (player.hp <= 2 && player.storage.fanghun >= 3) return true; - return false; - }, - content: function () { - "step 0"; - var num = Math.max(2, player.storage.fanghun); - num = Math.min(num, 8); - event.num = num; - player.removeMark("fanghun", player.storage.fanghun); - player.awakenSkill("twfuhan"); - if (_status.characterlist) { - list = []; - for (var i = 0; i < _status.characterlist.length; i++) { - var name = _status.characterlist[i]; - if (lib.character[name][1] == "shu") list.push(name); - } - } else if (_status.connectMode) { - list = get.charactersOL(function (i) { - return lib.character[i][1] != "shu"; - }); - } else { - list = get.gainableCharacters(function (info) { - return info[1] == "shu"; - }); - } - var players = game.players.concat(game.dead); - for (var i = 0; i < players.length; i++) { - list.remove(players[i].name); - list.remove(players[i].name1); - list.remove(players[i].name2); - } - list.remove("zhaoxiang"); - player.chooseButton( - ["扶汉:选择获得一张武将牌上的所有技能", [list.randomGets(5), "character"]], - true - ); - "step 1"; - if (result.bool) { - var name = result.links[0]; - player.flashAvatar("twhuashen", name); - game.log(player, "获得了", "#y" + get.translation(name), "的所有技能"); - player.addSkills(lib.character[name][3]); - } - "step 2"; - var num = event.num - player.maxHp; - if (num > 0) player.gainMaxHp(num); - else player.loseMaxHp(-num); - player.recover(); - "step 3"; - var card = get.cardPile("meiyingqiang", "field"); - if (card) { - player.gain(card, "gain2", "log"); - } - }, - ai: { - combo: "refanghun", - }, - }, - twqueshi: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter: function (event, player) { - return (event.name != "phase" || game.phaseNumber == 0) && player.hasEquipableSlot(1); - }, - content: function () { - if (!lib.inpile.includes("meiyingqiang")) { - lib.inpile.push("meiyingqiang"); - player.equip(game.createCard("meiyingqiang", "diamond", 12)); - } else { - var card = get.cardPile(function (card) { - return card.name == "meiyingqiang" && !player.getEquips(1).includes(card); - }, "field"); - if (card) player.equip(card); - } - }, - }, - meiyingqiang: { - equipSkill: true, - trigger: { - player: ["loseAfter"], - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - filter: function (event, player) { - if (player == _status.currentPhase) return false; - var evt = event.getl(player); - if (!evt || !evt.cards2 || !evt.cards2.length) return false; - var list = player.getHistory("lose", function (evt) { - return evt.cards2 && evt.cards2.length; - }); - if (event.name == "lose") { - if (list.indexOf(event) != 0) return false; - } else { - if ( - !player.hasHistory("lose", function (evt) { - return evt.getParent() == event && list.indexOf(evt) == 0; - }) - ) - return false; - } - return _status.connectMode || !lib.config.skip_shan || player.hasSha(); - }, - direct: true, - content: function () { - if (trigger.delay === false) game.delayx(); - player - .chooseToUse("梅影枪:是否使用一张【杀】?", function (card) { - if (get.name(card) != "sha") return false; - return lib.filter.cardEnabled.apply(this, arguments); - }) - .set("addCount", false).logSkill = "meiyingqiang"; - }, - }, - cuijin: { - trigger: { global: "useCard" }, - direct: true, - filter: function (event, player) { - return ( - event.card.name == "sha" && - (event.player == player || player.inRange(event.player)) && - player.countCards("he") > 0 - ); - }, - checkx(event, player) { - let d1 = true, - e = false; - if (event.player.hasSkill("jueqing") || event.player.hasSkill("gangzhi")) d1 = false; - for (let tar of event.targets) { - if (event.card.name == "sha") { - if ( - !tar.mayHaveShan( - player, - "use", - tar.getCards("h", (i) => { - return i.hasGaintag("sha_notshan"); - }) - ) || - event.player.hasSkillTag( - "directHit_ai", - true, - { - target: tar, - card: event.card, - }, - true - ) - ) { - if (!tar.hasSkill("gangzhi")) d1 = false; - if ( - !tar.hasSkillTag("filterDamage", null, { - player: event.player, - card: event.card, - }) - ) { - let att = get.attitude(_status.event.player, tar); - if (att > 0) return false; - if (att < 0) e = true; - } - } - } else e = true; - } - if (e) return true; - if (d1) return get.damageEffect(event.player, player, _status.event.player) > 0; - return false; - }, - content: function () { - "step 0"; - if (player != game.me && !player.isOnline()) game.delayx(); - var target = trigger.player; - event.target = target; - player - .chooseToDiscard( - "he", - get.prompt("cuijin", target), - "弃置一张牌并令" + - get.translation(trigger.player) + - "使用的【杀】伤害+1,但若其未造成伤害,则你对其造成1点伤害。" - ) - .set("ai", function (card) { - if (_status.event.goon) return 7 - get.value(card); - return 0; - }) - .set("goon", lib.skill.cuijin.checkx(trigger, player)).logSkill = ["cuijin", target]; - "step 1"; - if (result.bool) { - if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; - trigger.baseDamage++; - player.addTempSkill("cuijin_damage"); - player.markAuto("cuijin_damage", [trigger.card]); - } - }, - subSkill: { - damage: { - trigger: { global: "useCardAfter" }, - forced: true, - popup: false, - charlotte: true, - onremove: true, - filter: function (event, player) { - return player.storage.cuijin_damage.includes(event.card); - }, - content: function () { - player.storage.cuijin_damage.remove(trigger.card); - if (!player.storage.cuijin_damage.length) player.removeSkill("cuijin_damage"); - if ( - trigger.player.isIn() && - !game.hasPlayer2(function (current) { - return current.hasHistory("damage", function (evt) { - return evt.card == trigger.card; - }); - }) - ) { - player.line(trigger.player, "green"); - trigger.player.damage(); - } - }, - }, - }, - }, - jintao: { - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - targetInRange: function (card) { - if (card.name == "sha") return true; - }, - }, - audio: 2, - trigger: { player: "useCard" }, - forced: true, - filter: function (event, player) { - if (event.card.name != "sha") return false; - var evt = event.getParent("phaseUse"); - if (!evt || evt.player != player) return false; - var index = player - .getHistory("useCard", function (evtx) { - return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; - }) - .indexOf(event); - return index == 0 || index == 1; - }, - content: function () { - var evt = trigger.getParent("phaseUse"); - var index = player - .getHistory("useCard", function (evtx) { - return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; - }) - .indexOf(trigger); - if (index == 0) { - game.log(trigger.card, "伤害+1"); - if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; - trigger.baseDamage++; - } else { - game.log(trigger.card, "不可被响应"); - trigger.directHit.addArray(game.players); - } - }, - }, - equan: { - audio: 2, - trigger: { global: "damageEnd" }, - forced: true, - filter: function (event, player) { - return player == _status.currentPhase && event.player.isIn(); - }, - logTarget: "player", - content: function () { - trigger.player.addMark("equan", trigger.num, false); - }, - group: ["equan_block", "equan_lose"], - marktext: "毒", - intro: { - name: "恶泉(毒)", - name2: "毒", - }, - subSkill: { - lose: { - audio: "equan", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function () { - return game.hasPlayer(function (current) { - return current.hasMark("equan"); - }); - }, - logTarget: function () { - return game.filterPlayer(function (current) { - return current.hasMark("equan"); - }); - }, - content: function () { - game.countPlayer(function (current) { - var num = current.countMark("equan"); - if (num) { - current.removeMark("equan", num); - current.loseHp(num); - } - }); - }, - }, - block: { - trigger: { global: "dyingBegin" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - var evt = event.getParent(2); - return evt.name == "equan_lose" && evt.player == player; - }, - content: function () { - trigger.player.addTempSkill("baiban"); - }, - }, - }, - }, - manji: { - audio: 2, - trigger: { global: "loseHpAfter" }, - forced: true, - filter: function (event, player) { - return player != event.player && (player.hp >= event.player.hp || player.isDamaged()); - }, - logTarget: "player", - content: function () { - if (player.hp <= trigger.player.hp) player.recover(); - if (player.hp >= trigger.player.hp) player.draw(); - }, - }, - beini: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.hp >= player.hp; - }, - content: function () { - "step 0"; - var str = get.translation(target); - player - .chooseControl() - .set("choiceList", [ - "摸两张牌,然后令" + str + "视为对自己使用【杀】", - "令" + str + "摸两张牌,然后视为对其使用【杀】", - ]) - .set("ai", function () { - var evt = _status.event.getParent(), - player = evt.player, - target = evt.target; - var card = { name: "sha", isCard: true }, - att = get.attitude(player, target) > 0; - if ( - !target.canUse(card, player, false) || - get.effect(player, card, target, player) >= 0 - ) - return 0; - if ( - att && - (!player.canUse(card, target, false) || - get.effect(target, card, player, player) >= 0) - ) - return 1; - if ( - target.hasSkill("nogain") && - player.canUse(card, target, false) && - get.effect(target, card, player, player) > 0 - ) - return 1; - if (player.hasShan()) return 0; - if (att && target.hasShan()) return 1; - return 0; - }); - "step 1"; - var list = [player, target]; - if (result.index == 1) list.reverse(); - event.list = list; - list[0].draw(2); - "step 2"; - var list = event.list; - if (list[1].isIn() && list[0].isIn() && list[1].canUse("sha", list[0], false)) - list[1].useCard({ name: "sha", isCard: true }, list[0], false, "noai"); - }, - ai: { - order: 5, - expose: 0, - result: { - player: function (player, target) { - var card = { name: "sha", isCard: true }, - att = get.attitude(player, target) > 0; - if ( - !target.canUse(card, player, false) || - get.effect(player, card, target, player) >= 0 - ) - return 2; - if ( - att && - (!player.canUse(card, target, false) || - get.effect(target, card, player, player) >= 0) - ) - return 2; - if (target.hasSkill("nogain") && player.canUse(card, target, false)) - return get.effect(target, card, player, player); - if (player.hasShan()) return 1; - if (att && target.hasShan()) return 1; - return 0; - }, - }, - }, - }, - dingfa: { - audio: 2, - trigger: { player: "phaseDiscardAfter" }, - direct: true, - filter: function (event, player) { - var num = 0; - player.getHistory("lose", function (evt) { - num += evt.cards2.length; - }); - return num >= player.hp; - }, - content: function () { - "step 0"; - player - .chooseTarget( - get.prompt("dingfa"), - "操作提示:选择自己以回复体力,或选择其他角色以造成伤害", - function (card, player, target) { - return target == player ? player.isDamaged() : true; - } - ) - .set("ai", function (target) { - return target != player - ? get.damageEffect(target, player, player) - : get.recoverEffect(player, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("dingfa", target); - if (target == player) player.recover(); - else target.damage(); - } - }, - }, - dz_mantianguohai: { - mod: { - ignoredHandcard: function (card, player) { - if (get.name(card) == "dz_mantianguohai") return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "cardsDiscard" && get.name(card) == "dz_mantianguohai") return false; - }, - }, - }, - twmiaolve: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - locked: false, - content: function () { - if (!lib.inpile.includes("dz_mantianguohai")) lib.inpile.add("dz_mantianguohai"); - if (!_status.dz_mantianguohai_suits) _status.dz_mantianguohai_suits = lib.suit.slice(0); - var list = _status.dz_mantianguohai_suits.randomRemove(2).map(function (i) { - return game.createCard2("dz_mantianguohai", i, 5); - }); - if (list.length) player.gain(list, "gain2", "log"); - }, - group: "twmiaolve_damage", - subSkill: { - damage: { - trigger: { player: "damageEnd" }, - direct: true, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - var list = ["dz_mantianguohai"]; - list.addArray(get.zhinangs()); - player - .chooseButton([get.prompt("twmiaolve"), [list, "vcard"]]) - .set("ai", function (button) { - if ( - button.link[2] == "dz_mantianguohai" && - player.countCards("hs", "dz_mantianguohai") < 2 - ) - return 10; - return get.value({ name: button.link[2] }); - }); - "step 2"; - if (result.bool) { - player.logSkill("twmiaolve"); - var name = result.links[0][2]; - if (name == "dz_mantianguohai") { - if (!lib.inpile.includes("dz_mantianguohai")) - lib.inpile.add("dz_mantianguohai"); - if (!_status.dz_mantianguohai_suits) - _status.dz_mantianguohai_suits = lib.suit.slice(0); - if (_status.dz_mantianguohai_suits.length) - player.gain( - game.createCard2( - "dz_mantianguohai", - _status.dz_mantianguohai_suits.randomRemove(), - 5 - ), - "gain2" - ); - else { - var card = get.cardPile(function (card) { - return card.name == name; - }); - if (card) player.gain(card, "gain2"); - } - player.draw(); - } else { - var card = get.cardPile(function (card) { - return card.name == name; - }); - if (card) player.gain(card, "gain2"); - } - if (event.count > 0 && player.hasSkill("twmiaolve")) event.goto(1); - } - }, - }, - }, - }, - twyingjia: { - audio: 2, - trigger: { global: "phaseEnd" }, - direct: true, - filter: function (event, player) { - if (!player.countCards("he")) return false; - var history = player.getHistory("useCard"), - map = {}; - for (var i of history) { - if (get.type2(i.card) == "trick") { - if (!map[i.card.name]) map[i.card.name] = true; - else return true; - } - } - return false; - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: get.prompt("twyingjia"), - prompt2: "弃置一张牌并令一名角色进行一个额外回合", - filterCard: lib.filter.cardDiscardable, - filterTarget: true, - ai1: function (card) { - return 8 - get.value(card); - }, - ai2: function (target) { - if (target.hasJudge("lebu")) return -1; - var player = _status.event.player; - if (get.attitude(player, target) > 4) { - return ( - get.threaten(target) / - Math.sqrt(target.hp + 1) / - Math.sqrt(target.countCards("h") + 1) - ); - } - return -1; - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("twyingjia", target); - player.discard(result.cards); - target.insertPhase(); - } - }, - }, - gx_lingbaoxianhu: { - trigger: { - source: "damageSource", - global: "dieAfter", - }, - forced: true, - equipSkill: true, - filter: function (event, player) { - if (event.name == "damage") return event.num > 1; - return true; - }, - content: function () { - player.gainMaxHp(); - player.recover(); - }, - }, - gx_taijifuchen: { - trigger: { player: "useCardToPlayered" }, - forced: true, - equipSkill: true, - filter: function (event, player) { - return event.card && event.card.name == "sha"; - }, - logTarget: "target", - content: function () { - "step 0"; - var suit = get.suit(trigger.card); - var num = trigger.target.countCards("h", "shan"); - var next = trigger.target - .chooseToDiscard("弃置一张牌,或不能响应" + get.translation(trigger.card), "he") - .set("ai", function (card) { - var num = _status.event.num; - if (num == 0) return 0; - if (card.name == "shan") return num > 1 ? 2 : 0; - return (get.suit(card) != _status.event.suit ? 9 : 6) - get.value(card); - }) - .set("num", num); - if (lib.suit.includes(suit)) { - next.set( - "prompt2", - "若弃置的是" + - get.translation(suit) + - "牌,则改为" + - get.translation(player) + - "获得之" - ); - next.set("suit", suit); - } - "step 1"; - if (result.bool) { - var card = result.cards[0]; - if ( - get.suit(card, trigger.target) == get.suit(trigger.card, false) && - get.position(card) == "d" - ) - player.gain(card, "gain2"); - } else trigger.directHit.add(trigger.target); - }, - }, - gx_chongyingshenfu: { - trigger: { player: "damageEnd" }, - forced: true, - equipSkill: true, - filter: function (event, player) { - if ( - !event.card || - !event.card.name || - player.getStorage("gx_chongyingshenfu_effect").includes(event.card.name) - ) - return false; - if (player.hasSkillTag("unequip2")) return false; - if ( - event.source.hasSkillTag("unequip", false, { - name: event.card.name, - target: player, - card: event.card, - }) - ) - return false; - return true; - }, - content: function () { - player.markAuto("gx_chongyingshenfu_effect", [trigger.card.name]); - }, - group: "gx_chongyingshenfu_effect", - subSkill: { - effect: { - trigger: { player: "damageBegin4" }, - forced: true, - equipSkill: true, - filter: function (event, player) { - if ( - !event.card || - !event.card.name || - !player.storage.gx_chongyingshenfu_effect || - !player.getStorage("gx_chongyingshenfu_effect").includes(event.card.name) - ) - return false; - if (player.hasSkillTag("unequip2")) return false; - if ( - event.source.hasSkillTag("unequip", false, { - name: event.card.name, - target: player, - card: event.card, - }) - ) - return false; - return true; - }, - content: function () { - trigger.num--; - }, - ai: { - effect: { - target: function (card, player, target) { - if ( - typeof card == "object" && - target.storage.gx_chongyingshenfu_effect && - target.getStorage("gx_chongyingshenfu_effect").includes(card.name) && - !target.hasSkillTag("unequip2") && - (get.itemtype(player) !== "player" || - (!player.hasSkillTag("jueqing", false, target) && - !player.hasSkillTag("unequip", false, { - name: card.name, - target: target, - card: card, - }))) - ) { - if ( - player && - player.hasSkillTag("damageBonus", true, { - target: target, - card: card, - }) - ) - return 0.5; - return "zeroplayertarget"; - } - }, - }, - }, - onremove: true, - intro: { - content: "受到$造成的伤害-1", - }, - }, - }, - }, - twdanfa: { - audio: 2, - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseCard("he", get.prompt("twdanfa"), "将一张牌作为“丹”置于武将牌上") - .set("ai", function (card) { - if (player.storage.twdanfa) { - var suit = get.suit(card); - for (var i of player.storage.twdanfa) { - if (get.suit(i, false) == suit) return 4 - get.value(card); - } - } - return 5.5 - get.value(card); - }); - "step 1"; - if (result.bool) { - var card = result.cards[0]; - player.logSkill("twdanfa"); - game.log(player, "将", card, "放在了武将牌上"); - player.$give(card, player, false); - player.lose(card, ui.special, "toStorage"); - player.markAuto("twdanfa", result.cards); - } else event.finish(); - "step 2"; - game.delayx(); - }, - mark: true, - intro: { - content: "cards", - onunmark: "throw", - }, - group: "twdanfa_draw", - subSkill: { - draw: { - audio: "twdanfa", - trigger: { player: "useCard" }, - forced: true, - locked: false, - filter: function (event, player) { - if (!player.storage.twdanfa || !player.storage.twdanfa.length) return false; - var suit = get.suit(event.card, false); - if ( - suit == "none" || - (player.storage.twdanfa_count && player.storage.twdanfa_count.includes(suit)) - ) - return false; - for (var i of player.storage.twdanfa) { - if (get.suit(i, false) == suit) return true; - } - return false; - }, - content: function () { - player.draw(); - player.addTempSkill("twdanfa_count"); - if (!player.storage.twdanfa_count) player.storage.twdanfa_count = []; - player.storage.twdanfa_count.push(get.suit(trigger.card, false)); - }, - }, - count: { onremove: true }, - }, - }, - twlingbao: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - var list = player.getStorage("twdanfa"); - if (list.length < 2) return false; - var suit = get.suit(list[0], false); - for (var i = 1; i < list.length; i++) { - if (get.suit(list[i], false) != suit) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog("灵宝", player.storage.twdanfa); - }, - filter: function (button, player) { - if (!ui.selected.buttons.length) return true; - return get.suit(button.link) != get.suit(ui.selected.buttons[0].link); - }, - select: 2, - backup: function (links) { - var obj = get.copy(lib.skill["twlingbao_" + get.color(links)]); - obj.cards = links; - obj.audio = "twlingbao"; - obj.filterCard = () => false; - obj.selectCard = -1; - return obj; - }, - prompt: function (links) { - return lib.skill["twlingbao_" + get.color(links)].prompt; - }, - check: function (button) { - var storage = _status.event.player.storage.twdanfa.slice(0); - storage.remove(button.link); - if ( - storage.filter(function (card) { - return card.suit == button.link.suit; - }).length - ) - return 1 + Math.random(); - return 0; - }, - }, - subSkill: { - red: { - filterTarget: function (card, player, target) { - return target.isDamaged(); - }, - delay: false, - prompt: "令一名角色回复1点体力", - content: function () { - "step 0"; - var cards = lib.skill.twlingbao_backup.cards; - player.$throw(cards, 1000); - player.unmarkAuto("twdanfa", cards); - game.log(player, "将", cards, "置入了弃牌堆"); - game.delayx(); - game.cardsDiscard(cards); - "step 1"; - target.recover(); - }, - ai: { - tag: { - recover: 1, - }, - result: { - target: 1.5, - }, - }, - }, - black: { - filterTarget: function (card, player, target) { - return target.countDiscardableCards(player, "hej") > 0; - }, - delay: false, - prompt: "弃置一名角色区域内至多两张区域不同的牌", - content: function () { - "step 0"; - var cards = lib.skill.twlingbao_backup.cards; - player.$throw(cards, 1000); - player.unmarkAuto("twdanfa", cards); - game.log(player, "将", cards, "置入了弃牌堆"); - game.delayx(); - game.cardsDiscard(cards); - "step 1"; - var num = 0; - if (target.countDiscardableCards(player, "h")) num++; - if (target.countDiscardableCards(player, "e")) num++; - if (target.countDiscardableCards(player, "j")) num++; - if (num) { - player - .discardPlayerCard(target, [1, Math.max(2, num)], "hej", true) - .set("filterButton", function (button) { - for (var i = 0; i < ui.selected.buttons.length; i++) { - if ( - get.position(button.link) == - get.position(ui.selected.buttons[i].link) - ) - return false; - } - return true; - }); - } - }, - ai: { - tag: { - lose: 1.5, - loseCard: 1.5, - discard: 1.5, - }, - result: { - target: function (player, target) { - if ( - get.attitude(player, target) > 0 && - target.countCards("e", function (card) { - return get.value(card, target) <= 0; - }) > 0 && - target.countCards("j", function (card) { - return get.effect(target, card, target, target) < 0; - }) > 8 - ) - return 3; - if ( - target.countCards("h") > 0 && - target.countCards("e", function (card) { - return get.value(card, target) > 0; - }) > 0 - ) - return -2; - return 0; - }, - }, - }, - }, - none: { - selectTarget: 2, - filterTarget: function (card, player, target) { - if (!ui.selected.targets.length) return true; - return target.countCards("he") > 0; - }, - complexSelect: true, - targetprompt: ["摸牌", "弃牌"], - delay: false, - prompt: "令一名角色摸一张牌并令另一名角色弃置一张牌", - multitarget: true, - multiline: true, - content: function () { - "step 0"; - var cards = lib.skill.twlingbao_backup.cards; - player.$throw(cards, 1000); - player.unmarkAuto("twdanfa", cards); - game.log(player, "将", cards, "置入了弃牌堆"); - game.delayx(); - game.cardsDiscard(cards); - "step 1"; - targets[0].draw(); - targets[1].chooseToDiscard("he", true); - }, - ai: { - result: { - target: function (player, target) { - if (!ui.selected.targets.length) return 1; - if ( - target.countCards("e", function (card) { - return get.value(card, target) <= 0; - }) > 0 - ) - return 1; - return -1; - }, - }, - }, - }, - backup: { audio: "twlingbao" }, - }, - ai: { - order: 1, - result: { player: 1 }, - combo: "twdanfa", - }, - }, - twsidao: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter: function (event, player) { - return (event.name != "phase" || game.phaseNumber == 0) && !player.storage.twsidao; - }, - content: function () { - "step 0"; - player - .chooseButton( - [ - "请选择你的初始法宝", - [["gx_lingbaoxianhu", "gx_taijifuchen", "gx_chongyingshenfu"], "vcard"], - ], - true - ) - .set("ai", function (button) { - return button.link[2] == "gx_chongyingshenfu" ? 2 : 1; - }); - "step 1"; - if (result.bool) { - var card = game.createCard2(result.links[0][2], "heart", 1); - lib.inpile.add(result.links[0][2]); - player.storage.twsidao = card; - player.chooseUseTarget(card, "nopopup", true); - } - }, - group: "twsidao_equip", - subSkill: { - equip: { - audio: "twsidao", - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - var card = player.storage.twsidao; - return card && card.isInPile() && player.hasUseTarget(card); - }, - content: function () { - player.chooseUseTarget(player.storage.twsidao, "nopopup", true); - }, - }, - }, - }, - twrangyi: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterTarget: lib.filter.notMe, - delay: 0, - content: function () { - "step 0"; - event.cards = player.getCards("h"); - player.give(event.cards, target).gaintag.add("twrangyi"); - target.addTempSkill("twrangyi2"); - "step 1"; - target.chooseToUse({ - prompt: "请使用得到的一张牌,或者受到来自" + get.translation(player) + "的1点伤害", - filterCard: function (card, player) { - if (get.itemtype(card) != "card" || !card.hasGaintag("twrangyi")) return false; - return lib.filter.filterCard(card, player, event); - }, - cards: cards, - }); - "step 2"; - target.removeSkill("twrangyi2"); - if (!result.bool) target.damage("nocard"); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - var hs = player.getCards("h"); - for (var i = 0; i < hs.length; i++) { - var hi = hs[i]; - if (hi.name == "tao" || target.hasValueTarget(hi, null, true)) return 1; - } - return get.damageEffect(target, player, target); - }, - }, - }, - }, - twrangyi2: { - trigger: { player: "useCard" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - var evt = event.getParent(2); - return ( - evt.name == "twrangyi" && - evt.player.isIn() && - player.countCards("h", function (card) { - return card.hasGaintag("twrangyi"); - }) > 0 - ); - }, - content: function () { - var cards = player.getCards("h", function (card) { - return card.hasGaintag("twrangyi"); - }); - game.delayx(); - player.give(cards, trigger.getParent(2).player); - }, - onremove: function (player) { - player.removeGaintag("twrangyi"); - }, - }, - twbaimei: { - audio: 2, - trigger: { - player: "damageBegin4", - }, - forced: true, - filter: function (event, player) { - if (player.countCards("h")) return false; - if (event.hasNature()) return true; - return get.type(event.card, "trick") == "trick"; - }, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (target.countCards("h")) return; - if (get.tag(card, "natureDamage")) return "zeroplayertarget"; - if (get.type(card) == "trick" && get.tag(card, "damage")) { - return "zeroplayertarget"; - } - }, - }, - }, - }, - twhuzhu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (e, player) { - return player.countCards("e") > 0; - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - target.chooseCard("交给" + get.translation(player) + "一张手牌", "h", true); - "step 1"; - target.give(result.cards, player); - "step 2"; - if (player.countGainableCards(player, "e")) target.gainPlayerCard(player, "e", true); - "step 3"; - if (target.isDamaged() && target.hp <= player.hp) { - player - .chooseBool("是否令" + get.translation(target) + "回复1点体力?") - .set("ai", function () { - return get.recoverEffect(target, player, player); - }); - } - "step 4"; - if (result.bool) target.recover(); - }, - ai: { - order: 8, - result: { - target: function (player, target) { - var eff = - target.isDamaged() && target.hp <= player.hp - ? get.recoverEffect(target, player, target) - : 0; - if (eff <= 0 && !player.countGainableCards(target, "e")) return -1; - return eff; - }, - }, - }, - }, - twliancai: { - audio: 2, - trigger: { player: ["turnOverEnd", "phaseJieshuBegin"] }, - filter: function (card, player, target) { - return target == "phaseJieshuBegin" || player.countCards("h") < player.hp; - }, - filterTarget: function (card, player, target) { - return target != player && target.countGainableCards(player, "e") > 0; - }, - check: function (card, player) { - if (card.name == "turnOver") return true; - if (player.isTurnedOver()) return true; - if (player.hp - player.countCards("h") > 1) return true; - return game.hasPlayer(function (current) { - return ( - lib.skill.twliancai.filterTarget(null, player, current) && - lib.skill.twliancai.filterAI(current) - ); - }); - }, - filterAI: function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (target.isDamaged() && target.countCards("e", "baiyin") && att > 0) return 2 * att; - return -att; - }, - prompt2: function (card, player, target) { - return card.name == "phaseJieshu" - ? "将武将牌翻面,然后获得一名其他角色装备区内的一张牌" - : "将手牌摸至与体力值相同"; - }, - content: function () { - "step 0"; - if (event.triggername == "phaseJieshuBegin") player.turnOver(); - else { - player.draw(player.hp - player.countCards("h")); - event.finish(); - } - "step 1"; - player.chooseTarget("获得一名角色装备区内的一张牌", lib.skill.twliancai.filterTarget).ai = - lib.skill.twliancai.filterAI; - "step 2"; - if (result.bool) { - player.line(result.targets, "thunder"); - player.gainPlayerCard("e", true, result.targets[0]); - } - }, - }, - twqijia: { - //group:'twqijia_alka', - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("e", function (card) { - return !player.getStorage("twqijia_alka").includes(get.subtype(card)); - }); - }, - filterTarget: function (card, player, target) { - return target != player && player.canUse({ name: "sha" }, target); - }, - position: "e", - filterCard: function (card, player) { - return !player.getStorage("twqijia_alka").includes(get.subtype(card)); - }, - content: function () { - "step 0"; - player.addTempSkill("twqijia_alka"); - player.storage.twqijia_alka.push(get.subtype(cards[0])); - player.useCard({ name: "sha" }, target, false); - }, - subSkill: { - alka: { - charlotte: true, - onremove: function (player) { - delete player.storage.twqijia_alka; - delete player.storage.twzhuchen; - player.unmarkSkill("twzhuchen"); - }, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - if (!player.storage.twzhuchen) player.storage.twzhuchen = []; - }, - mod: { - globalFrom: function (from, to, distance) { - if (from.storage.twzhuchen && from.storage.twzhuchen.includes(to)) - return -Infinity; - }, - }, - }, - }, - check: function (card) { - return 7 - get.value(card); - }, - ai: { - order: function () { - return get.order({ name: "sha" }) - 0.2; - }, - result: { - target: function (player, target) { - return get.effect(target, { name: "sha" }, player, player); - }, - }, - }, - }, - twzhuchen: { - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("h", lib.skill.twzhuchen.filterCard) > 0; - }, - filterCard: function (card, player) { - var name = get.name(card, player); - return name == "tao" || name == "jiu"; - }, - filterTarget: lib.filter.notMe, - content: function () { - player.addTempSkill("twqijia_alka"); - player.storage.twzhuchen.add(target); - player.markSkill("twzhuchen"); - }, - intro: { - content: function (content, player) { - return "至" + get.translation(content) + "的距离视为1"; - }, - }, - }, - twxiaolian: { - audio: 2, - trigger: { global: "useCardToTarget" }, - logTarget: "target", - filter: function (event, player) { - return ( - event.card && - event.card.name == "sha" && - event.player != player && - event.targets.length == 1 && - event.targets[0] != player - ); - }, - check: function (event, player) { - return ( - get.effect(event.targets[0], event.card, event.player, player) <= - get.effect(player, event.card, event.player, player) - ); - }, - content: function () { - trigger.getParent().twxiaolian = trigger.targets[0]; - trigger.targets.length = 0; - trigger.getParent().triggeredTargets2.length = 0; - trigger.targets.push(player); - }, - group: "twxiaolian_damage", - subSkill: { - distance: { - sub: true, - charlotte: true, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - mark: true, - marktext: "马", - intro: { - content: "cards", - onunmark: "throw", - }, - mod: { - globalTo: function (from, to, distance) { - if (from != to && to.storage.twxiaolian_distance) - return distance + to.storage.twxiaolian_distance.length; - }, - }, - }, - damage: { - sub: true, - trigger: { player: "damageEnd" }, - direct: true, - filter: function (event, player) { - return event.getParent(2).twxiaolian != undefined; - }, - content: function () { - "step 0"; - var target = trigger.getParent(2).twxiaolian; - event.target = target; - player.chooseCard( - "是否将一张牌当做【马】置于" + get.translation(target) + "的武将牌旁?", - "he" - ).ai = function (card) { - if ( - get.attitude( - _status.event.player, - _status.event.getParent("twxiaolian_damage").target - ) > 2 - ) - return 7 - get.value(card); - return 0; - }; - "step 1"; - if (result.bool) { - player.logSkill("twxiaolian", target); - player.lose(result.cards, ui.special, "toStorage"); - target.addSkill("twxiaolian_distance"); - target.storage.twxiaolian_distance.addArray(result.cards); - target.markSkill("twxiaolian_distance"); - } - }, - }, - }, - }, - twtijin: { - audio: 2, - trigger: { global: "useCardToPlayer" }, - filter: function (event, player) { - return ( - event.card && - event.card.name == "sha" && - event.player != player && - event.target != player && - event.targets.length == 1 && - event.player.inRange(player) - ); - }, - logTarget: "target", - check: function (event, player) { - return ( - get.effect(event.targets[0], event.card, event.player, player) <= - get.effect(player, event.card, event.player, player) - ); - }, - content: function () { - "step 0"; - trigger.targets.length = 0; - trigger.getParent().triggeredTargets1.length = 0; - trigger.targets.push(player); - var next = game.createEvent("twtijin_discard", null, trigger.getParent(2)); - next.player = player; - next.target = trigger.player; - next.setContent(function () { - if (target.isDead() || !target.countCards("he")) return; - player.line(target, "green"); - player.discardPlayerCard(target, true, "he"); - }); - }, - }, - twyanqin: { - audio: 2, - trigger: { player: "phaseBegin" }, - direct: true, - content: function () { - "step 0"; - var list = []; - if (player.group != "wei") list.push("wei2"); - if (player.group != "shu") list.push("shu2"); - list.push("cancel2"); - player - .chooseControl(list) - .set("ai", function () { - return list.randomGet(); - }) - .set("prompt", get.prompt2("twyanqin")); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("twyanqin"); - var group = result.control.slice(0, 3); - player.changeGroup(group); - } - }, - }, - twbaobian: { - audio: 2, - trigger: { source: "damageBegin2" }, - filter: function (event, player) { - var card = event.card; - if (!card || (card.name != "sha" && card.name != "juedou")) return false; - return ( - event.player.group == player.group || event.player.countCards("h") > event.player.hp - ); - }, - check: function (event, player) { - var att = get.attitude(player, event.player); - if (event.player.group == player.group) return att > 0; - return att < 0; - }, - logTarget: "player", - content: function () { - var target = trigger.player; - if (target.group == player.group) { - trigger.cancel(); - var num = target.maxHp - target.countCards("h"); - if (num) target.draw(num); - } else { - player.discardPlayerCard(target, "h", true, target.countCards("h") - target.hp); - } - }, - }, - chijie: { - audio: true, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - direct: true, - filter: function (event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - game.hasPlayer(function (current) { - return current.group != player.group && lib.group.includes(current.group); - }) - ); - }, - content: function () { - "step 0"; - var list = lib.group.filter(function (group) { - return ( - group != player.group && - game.hasPlayer(function (current) { - return current.group == group; - }) - ); - }); - list.push("cancel2"); - player - .chooseControl(list) - .set("prompt", get.prompt("chijie")) - .set("prompt2", "将自己的势力变更为场上存在的一个势力") - .set("ai", function () { - return list.randomGet(); - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("chijie"); - player.changeGroup(result.control); - } - }, - }, - waishi: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - let used = player.getStat("skill").waishi; - if (used && used > player.countMark("waishi_remover")) return false; - return ( - player.countCards("he") > 0 && - game.hasPlayer((target) => target != player && target.countCards("h") > 0) - ); - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") >= ui.selected.cards.length; - }, - filterCard: true, - position: "he", - check: function (card) { - if ( - !game.hasPlayer(function (current) { - return ( - current != _status.event.player && - current.countCards("h") > ui.selected.cards.length - ); - }) - ) - return 0; - return 6 - get.value(card); - }, - selectCard: function () { - if (!ui.selected.targets.length) return [1, game.countGroup()]; - return [1, Math.min(ui.selected.targets[0].countCards("h"), game.countGroup())]; - }, - discard: false, - lose: false, - delay: 0, - content: function () { - "step 0"; - player.choosePlayerCard(target, true, "h", cards.length); - "step 1"; - player.swapHandcards(target, cards, result.cards); - game.delayex(); - "step 2"; - if (target.countCards("h") > player.countCards("h") || player.group == target.group) - player.draw(); - }, - ai: { - order: 7, - result: { - player: function (player, target) { - if ( - player.countCards("h") < target.countCards("h") || - player.group == target.group - ) - return 1; - return 0.1; - }, - }, - }, - subSkill: { - remover: { - charlotte: true, - onremove: function (player) { - player.clearMark("waishi_remover", false); - }, - intro: { - content: "〖外使〗的发动次数+#", - }, - }, - }, - }, - renshe: { - audio: 2, - trigger: { player: "damageEnd" }, - direct: true, - content: function () { - "step 0"; - var choiceList = [ - "将势力变更为场上现存的一个其他势力", - "令〖外使〗的发动次数+1直到下个出牌阶段结束", - "与另一名其他角色各摸一张牌", - ]; - var controls = ["选项二"]; - if ( - game.hasPlayer((current) => { - return current.group != player.group && lib.group.includes(current.group); - }) - ) - controls.unshift("选项一"); - if (game.hasPlayer((current) => current != player)) controls.push("选项三"); - player - .chooseControl(controls, "cancel2") - .set("prompt", get.prompt("renshe")) - .set("choiceList", choiceList) - .set("ai", function () { - if ( - game.hasPlayer(function (current) { - return get.attitude(player, current) > 0 || current.hasSkillTag("nogain"); - }) - ) - return "选项三"; - return "选项二"; - }); - "step 1"; - if (result.control == "cancel2") event.finish(); - else { - player.logSkill("renshe"); - switch (result.control) { - case "选项一": - event.goto(3); - break; - case "选项二": - player.addMark("waishi_remover", 1, false); - player.addTempSkill("waishi_remover", { player: "phaseUseAfter" }); - event.finish(); - break; - case "选项三": - player - .chooseTarget("请选择一名角色,与其各摸一张牌", lib.filter.notMe, true) - .set("ai", function (target) { - if (target.hasSkillTag("nogain")) return 0.1; - return get.attitude(_status.event.player, target); - }); - } - } - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - game.asyncDraw([player, target].sortBySeat()); - } - game.delayex(); - event.finish(); - "step 3"; - var list = lib.group.filter(function (group) { - return ( - group != player.group && - game.hasPlayer(function (current) { - return current.group == group; - }) - ); - }); - player - .chooseControl(list) - .set("prompt", get.prompt("chijie")) - .set("prompt2", "将自己的势力变更为场上存在的一个势力") - .set("ai", function () { - return list.randomGet(); - }); - "step 4"; - player.changeGroup(result.control); - }, - }, - //英文版特典武将凯撒 - zhengfu: { - trigger: { - player: "useCardToPlayered", - }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - filter: function (event, player) { - return event.card.name == "sha"; - }, - logTarget: "target", - line: false, - content: function () { - "step 0"; - player.line(trigger.target, { color: [220, 90, 139] }); - player - .chooseControl(["basic", "trick", "equip"]) - .set("ai", function () { - var player = _status.event.target; - if (!player.countCards("h", "sha") && player.countCards("h", "shan")) - return "trick"; - return "basic"; - }) - .set("prompt", "请选择一种牌的类别") - .set("target", trigger.target); - "step 1"; - trigger.target - .chooseCard( - "he", - "交给" + - get.translation(player) + - "一张" + - get.translation(result.control) + - "牌,否则此【杀】不可被闪避", - function (card) { - return get.type2(card) == _status.event.control; - } - ) - .set("ai", function (card) { - var num = _status.event.num; - if (num == 0) return 0; - if (card.name == "shan") return num > 1 ? 2 : 0; - return 8 - get.value(card); - }) - .set("num", trigger.target.countCards("h", "shan")) - .set("control", result.control); - "step 2"; - if (result.bool) { - var cards = result.cards; - trigger.target.give(cards, player); - } else { - trigger.getParent().directHit.add(trigger.target); - game.delay(); - } - }, - }, - }, - perfectPair: { - tw_liufuren: ["yuanshao"], - tw_xiahoushang: ["caopi"], - }, - characterReplace: { - tw_caocao: ["tw_caocao", "jsrg_caocao", "yj_caocao"], - mateng: ["tw_mateng", "mateng"], - xiahouen: ["tw_xiahouen", "jsrg_xiahouen"], - jiangji: ["dc_jiangji", "tw_jiangji", "jiangji"], - baoxin: ["tw_baoxin", "baoxin"], - yanxiang: ["yanxiang", "tw_yanxiang"], - liwei: ["liwei", "tw_liwei"], - }, - dynamicTranslate: { - twfeifu: function (player) { - var str = "锁定技,转换技。"; - if (!player.storage.twfeifu) str += ''; - str += "阴:当你成为【杀】的唯一目标后;"; - if (!player.storage.twfeifu) str += ""; - if (player.storage.twfeifu) str += ''; - str += "阳:当你使用【杀】指定唯一目标后;"; - if (player.storage.twfeifu) str += ""; - str += "目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。"; - return str; - }, - twfengpo: function (player) { - if (player.storage.twfengpo) - return "当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的红色牌数)。"; - return "①当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的♦数)。②当你杀死一名角色后,你将〖凤魄①〗中的“♦数”改为“红色牌数”。"; - }, - twjiexun: function (player) { - return lib.translate[player.hasSkill("funan_jiexun") ? "twjiexunx_info" : "twjiexun_info"]; - }, - twzhenliang: function (player) { - if (player.storage.twzhenliang) - return '转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。'; - return '转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。'; - }, - twdengjian: function (player) { - let str = - "①其他角色的弃牌阶段结束时,你可以随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。"; - if (player.hasSkill("twdengjian_ban")) str = '' + str + ""; - str += "②你使用“剑法”牌不计入次数限制。"; - return str; - }, - twduwang(player) { - let str = "使命技。"; - if (!player.storage.twduwang_fail) str += "①"; - str += - "出牌阶段开始时,你可以选择至多三名有牌的其他角色,摸X张牌(X为选择角色数+1),然后这些角色依次将一张牌当【决斗】对你使用。"; - if (!player.storage.twduwang_fail) - str += `\ - ②当你处于濒死状态时,其他角色不能对你使用【桃】。\ - ③使命:使用【决斗】或成为【决斗】目标的次数之和不小于4(若游戏总人数小于4则改为3)。\ - ④成功:准备阶段,若你于你的上回合完成了〖独往③〗的使命,则你重置〖独往〗并将〖独往〗修改至只保留〖独往①〗的效果,选择一项:⒈获得〖狭勇〗;⒉重置〖延势〗并令其获得历战效果。\ - ⑤失败:当你死亡时,使命失败。`; - return str; - }, - twylyanshi(player) { - return lib.translate[ - (player.storage.twduwang_ylyanshi ? "twylyanshix" : "twylyanshi") + "_info" - ]; - }, - }, - translate: { - tw_beimihu: "TW卑弥呼", - tw_beimihu_prefix: "TW", - nashime: "难升米", - tw_xiahouba: "TW夏侯霸", - tw_xiahouba_prefix: "TW", - tw_zumao: "TW祖茂", - tw_zumao_prefix: "TW", - tw_caoang: "TW曹昂", - tw_caoang_prefix: "TW", - tw_dingfeng: "TW丁奉", - tw_dingfeng_prefix: "TW", - tw_caohong: "TW将曹洪", - tw_caohong_prefix: "TW将", - tw_maliang: "TW马良", - tw_maliang_prefix: "TW", - - twyanqin: "姻亲", - twyanqin_info: "准备阶段,你可以将势力变更为魏或蜀。", - twbaobian: "豹变", - twbaobian_info: - "当你使用【杀】或【决斗】造成伤害时,若目标角色的势力与你相同,则你可以防止此伤害,然后其将手牌数补充至与体力值相同。若不同且其手牌数大于体力值,则你可以将其手牌弃置至与其体力值相同。", - twtijin: "替巾", - twtijin_info: - "当你攻击范围内的一名其他角色使用【杀】指定另一名其他角色为目标时,你可以将此【杀】的目标改为你。若如此做,此【杀】结算完成后,你弃置该角色的一张牌。", - twxiaolian: "孝廉", - twxiaolian_info: - "当一名其他角色使用【杀】指定另一名其他角色为目标时,你可以将此【杀】的目标改为你。若如此做,当你受到此【杀】的伤害后,你可以将一张牌置于此【杀】原目标的武将牌旁,称为“马”,且令其获得如下效果:其他角色计算至其的距离+X(X为其武将牌旁的“马”数)。", - twqijia: "弃甲", - twqijia_info: - "出牌阶段,你可以弃置一张装备区内的牌(每种类型的装备牌限一次),然后视为对攻击范围内的一名其他角色使用了一张【杀】。", - twzhuchen: "诛綝", - twzhuchen_info: - "出牌阶段,你可以弃置一张【桃】或【酒】并选择一名其他角色。你与其的距离视为1直到此阶段结束。", - twhuzhu: "护主", - twhuzhu_info: - "出牌阶段限一次,若你的装备区内有牌,则你可以令一名其他角色交给你一张手牌,然后获得你装备区内的一张牌。若其体力值不大于你,则你可以令其回复1点体力。", - twliancai: "敛财", - twliancai_info: - "结束阶段,你可以将武将牌翻面,然后获得一名其他角色装备区内的一张牌。当你的武将牌翻面时,你可以将手牌补至与体力值相同。", - twrangyi: "攘夷", - twrangyi2: "攘夷", - twrangyi_info: - "出牌阶段限一次,你可以将所有手牌交给一名其他角色,然后令其选择一项:1.使用其中的一张牌,并于此牌被使用时将其余的牌交还给你。2.受到来自你的1点伤害。", - twbaimei: "白眉", - twbaimei_info: "锁定技,若你没有手牌,则防止你受到的所有属性伤害和锦囊牌造成的伤害。", - chijie: "持节", - chijie_info: "游戏开始时,你可以选择一个现存势力,你的势力视为该势力。", - waishi: "外使", - waishi_info: - "出牌阶段限一次,你可以用至多X张牌交换一名其他角色等量的手牌(X为现存势力数),然后若其与你势力相同或手牌多于你,你摸一张牌。", - renshe: "忍涉", - renshe_info: - "当你受到伤害后,你可以选择一项:将势力改为现存的另一个势力;或可以额外发动一次“外使”直到你的下个出牌阶段结束;或与另一名其他角色各摸一张牌。", - tw_gexuan: "TW葛玄", - tw_gexuan_prefix: "TW", - twdanfa: "丹法", - twdanfa_info: - "准备阶段或结束阶段开始时,你可将一张牌置于武将牌上,称为“丹”。每回合每种花色限一次,当你使用牌时,若“丹”中有与此牌花色相同的牌,则你摸一张牌。", - twlingbao: "灵宝", - twlingbao_info: - "出牌阶段限一次,你可以将两张花色不同的“丹”置入弃牌堆。若这两张牌:均为红色,你令一名其他角色回复1点体力;均为黑色,你弃置一名其他角色区域内至多两张区域不同牌;颜色不同,则你令一名角色摸一张牌,并令另一名角色弃置一张牌。", - twsidao: "司道", - twsidao_info: - "游戏开始时,你选择一张“法宝”置入装备区。准备阶段,若你以此法选择的法宝在牌堆/弃牌堆中,则你使用之。", - gx_lingbaoxianhu: "灵宝仙壶", - gx_lingbaoxianhu_info: - "锁定技,当你造成点数大于1的伤害后,或有角色死亡后,你加1点体力上限并回复1点体力。", - gx_taijifuchen: "太极拂尘", - gx_taijifuchen_info: - "锁定技,当你使用【杀】指定目标后,你令目标角色选择一项:①弃置一张牌,若此牌和【杀】花色相同,则你获得之。②其不可响应此【杀】。", - gx_chongyingshenfu: "冲应神符", - gx_chongyingshenfu_info: - "锁定技。①当你受到牌造成的伤害后,你记录此牌的名称。②当你受到〖冲应神符①〗记录过的牌造成的伤害时,你令此牌伤害-1。", - tw_dongzhao: "TW董昭", - tw_dongzhao_prefix: "TW", - twmiaolve: "妙略", - twmiaolve_info: - "游戏开始时,你获得两张【瞒天过海】。当你受到1点伤害后,你可选择:①获得一张【瞒天过海】并摸一张牌。②获得一张智囊。", - twyingjia: "迎驾", - twyingjia_info: - "一名角色的回合结束时,若你本回合内使用过两张或更多的同名锦囊牌,则你可弃置一张手牌并令一名角色进行一个额外回合。", - dz_mantianguohai: "瞒天过海", - dz_mantianguohai_info: - "此牌不计入拥有者的手牌上限。出牌阶段,对一至两名区域内有牌的其他角色使用。你获得目标角色一张牌,然后依次交给每名目标角色各一张牌。", - jiachong: "TW贾充", - jiachong_prefix: "TW", - beini: "悖逆", - beini_info: - "出牌阶段限一次,你可以选择一名体力值不小于你的角色,令你或其摸两张牌,然后未摸牌的角色视为对摸牌的角色使用一张【杀】。", - dingfa: "定法", - dingfa_info: - "弃牌阶段结束时,若本回合你失去的牌数不小于你的体力值,你可以选择一项:1、回复1点体力;2、对一名其他角色造成1点伤害。", - duosidawang: "朵思大王", - equan: "恶泉", - equan_info: - "锁定技。①当有角色于你的回合内受到伤害后,其获得X枚“毒”(X为伤害值)。②准备阶段,你令所有拥有“毒”标记的角色移去所有“毒”标记并失去等量的体力。③当有角色因〖恶泉②〗进入濒死状态时,你令其所有技能失效直到回合结束。", - manji: "蛮汲", - manji_info: - "锁定技。其他角色失去体力后,若你的体力值:不大于该角色,你回复1点体力;不小于该角色,你摸一张牌。", - wuban: "TW吴班", - wuban_prefix: "TW", - jintao: "进讨", - jintao_info: - "锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】伤害+1,第二张【杀】不可被响应。", - yuejiu: "TW乐就", - yuejiu_prefix: "TW", - cuijin: "催进", - cuijin_info: - "当你或你攻击范围内的角色使用【杀】时,你可以弃置一张牌并获得如下效果:此【杀】的伤害值基数+1,且当此【杀】结算结束后,若未造成过伤害,则你对使用者造成1点伤害。", - tw_zhaoxiang: "TW赵襄", - tw_zhaoxiang_prefix: "TW", - twfuhan: "扶汉", - twfuhan_info: - '限定技。准备阶段开始时时,你可以移去所有"梅影"标记,然后从五张未登场的蜀势力武将牌中选择一名获得其所有技能,将体力上限数调整为以此技能移去所有“梅影”标记的数量(最少为2,最多为8)并回复1点体力,然后从牌堆/弃牌堆/场上获得【梅影枪】。', - twqueshi: "鹊拾", - twqueshi_info: "游戏开始时,你将【梅影枪】置于你的装备区。", - meiyingqiang: "梅影枪", - meiyingqiang_info: "当你于其他角色的回合内第一次失去牌时,你可以使用一张【杀】。", - tw_fuwan: "TW伏完", - tw_fuwan_prefix: "TW", - twmoukui: "谋溃", - twmoukui_info: - "当你使用【杀】指定目标后,你可以选择一项:①摸一张牌;②弃置该角色的一张牌;③背水:若此【杀】未因造成伤害而令该角色进入过濒死状态,则该角色弃置你的一张牌。", - tw_yujin: "SP于禁", - tw_yujin_prefix: "SP", - xinzhenjun: "镇军", - xinzhenjun_info: - "出牌阶段开始时,你可以将一张牌交给一名其他角色,令其选择是否使用一张不为黑色的【杀】。若其选择是,则你于此【杀】结算完成后摸1+X张牌(X为此【杀】造成的伤害总点数)。若其选择否,则你对其或其攻击范围内的一名其他角色造成1点伤害。", - tw_hucheer: "TW胡车儿", - tw_hucheer_prefix: "TW", - twshenxing: "神行", - twshenxing_info: "锁定技。若你的装备区内没有坐骑牌,则你至其他角色的距离-1且手牌上限+1。", - twdaoji: "盗戟", - twdaoji_info: - "出牌阶段限一次,你可以弃置一张非基本牌并选择一名攻击范围内的角色,获得其一张牌。若你以此法得到的牌为:基本牌,你摸一张牌;装备牌,你使用此牌并对其造成1点伤害。", - tw_hejin: "TW何进", - tw_hejin_prefix: "TW", - twmouzhu: "谋诛", - twmouzhu_info: - "出牌阶段限一次,你可以选择一名其他角色A。你令除A外所有体力值小于等于你的其他角色依次选择是否交给你一张牌。若你以此法得到的牌数X:等于0,你和所有进行选择的角色依次失去1点体力。大于0,你令A选择由你视为对其使用一张伤害值基数为X的【杀】或【决斗】。", - twyanhuo: "延祸", - twyanhuo_info: - "当你死亡时,你可以选择一项:①令一名其他角色弃置X张牌。②令X名其他角色依次弃置一张牌。(X为你的牌数)", - tw_mayunlu: "TW马云禄", - tw_mayunlu_prefix: "TW", - twfengpo: "凤魄", - twfengpo_info: - "①当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的♦数)。②当你杀死一名角色后,你将〖凤魄①〗中的“♦数”改为“红色牌数”。", - tw_re_caohong: "TW曹洪", - tw_re_caohong_prefix: "TW", - twyuanhu: "援护", - twyuanhu_info: - "出牌阶段限一次。你可将一张装备牌置入一名角色的装备区内。若此牌为:武器牌,你弃置与其距离为1的另一名角色区域的一张牌;防具牌,其摸一张牌;坐骑牌或宝物牌,其回复1点体力。然后若其体力值或手牌数不大于你,则你摸一张牌,且你可以于本回合的结束阶段发动一次〖援护〗。", - twjuezhu: "决助", - twjuezhu_info: - "限定技。准备阶段,你可废除一个坐骑栏,令一名角色获得〖飞影〗并废除判定区。该角色死亡后,你恢复以此法废除的装备栏。", - tw_zangba: "TW臧霸", - tw_zangba_prefix: "TW", - twhanyu: "捍御", - twhanyu_info: "锁定技。游戏开始时,你获得牌堆中的基本牌,锦囊牌,装备牌各一张。", - twhengjiang: "横江", - twhengjiang_info: - "出牌阶段限一次,当你使用基本牌或普通锦囊牌指定唯一目标后,你可将此牌的目标改为攻击范围内的所有合法目标,然后你于此牌结算结束后摸X张牌(X为因响应此牌而使用或打出过牌的角色数)。", - tw_huojun: "TW霍峻", - tw_huojun_prefix: "TW", - twsidai: "伺怠", - twsidai_info: - "限定技。出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用(无距离和次数限制)。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限;包含【酒】,则当目标角色受到此牌的伤害时,此伤害×2。", - twjieyu: "竭御", - twjieyu_info: - "每轮限一次。结束阶段开始时,或当你于一轮内第一次受到伤害后,你可以弃置所有手牌,然后从弃牌堆中获得不同牌名的基本牌各一张。", - tw_liuhong: "TW刘宏", - tw_liuhong_prefix: "TW", - twyujue: "鬻爵", - twyujue_give: "鬻爵", - twyujue_info: - "①其他角色的出牌阶段内,可以交给你任意张牌(每阶段上限为两张)。②当你于回合外获得其他角色的一张牌后,你可令其选择本回合内未选择过的一项:⒈弃置攻击范围内一名角色的一张牌。⒉下一次使用牌时,从牌堆中获得一张同类别的牌。", - twgezhi: "革制", - twgezhi_info: - "①当你于出牌阶段内首次使用某种类别的牌时,你可以重铸一张手牌。②出牌阶段结束时,若你本阶段内因〖革制①〗失去过至少两张牌,则你可以令一名角色选择获得一个其未获得过的效果:⒈攻击范围+2;⒉手牌上限+2;⒊加1点体力上限。", - twfengqi: "烽起", - twfengqi_info: - "主公技,锁定技。①其他群势力角色发动〖鬻爵①〗时,将每阶段上限改为四张。②以其他角色为目标的〖革制②〗结算结束后,目标角色可以获得其武将牌上的主公技。", - tw_caocao: "TW曹操", - tw_caocao_prefix: "TW", - twlingfa: "令法", - twlingfa_info: - "①第一轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。②第二轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。③第三轮游戏开始时,你失去〖令法〗并获得〖治暗〗。", - twzhian: "治暗", - twzhian_info: - "每回合限一次。一名角色使用装备牌或延时锦囊牌后,你可选择:⒈弃置位于场上的此牌。⒉弃置一张手牌并获得位于场上的此牌。⒊对其造成1点伤害。", - tw_zhangmancheng: "TW张曼成", - tw_zhangmancheng_prefix: "TW", - twfengji: "蜂集", - twfengji_info: - "出牌阶段开始时,若你没有“示”,则你可以将一张牌作为“示”置于武将牌上并施法:从牌堆中获得X张与“示”牌名相同的牌,然后移去“示”。", - twyiju: "蚁聚", - twyiju_info: - "若你的武将牌上有“示”,则:①你使用【杀】的次数上限和攻击范围的基数改为你的体力值。②当你受到伤害时,你移去“示”,且令此伤害+1。", - twbudao: "布道", - twbudao_info: - "限定技。准备阶段,你可减1点体力上限,回复1点体力并选择获得一个〖布道〗技能池里的技能(三选一)。然后你可以令一名其他角色也获得此技能并交给你一张牌。", - twzhouhu: "咒护", - twzhouhu_info: "出牌阶段限一次。你可以弃置一张红色手牌并施法:回复X点体力。", - twharvestinori: "丰祈", - twharvestinori_info: "出牌阶段限一次。你可以弃置一张黑色手牌并施法:摸2X张牌。", - twzuhuo: "阻祸", - twzuhuo_info: "出牌阶段限一次。你可以弃置一张非基本牌并施法:防止你受到的下X次伤害。", - twzhouzu: "咒诅", - twzhouzu_info: - "出牌阶段限一次。你可以对一名其他角色施法:其弃置X张牌,然后你对其造成1点雷电伤害。", - twhuangjin: "黄巾", - twhuangjin_info: - "锁定技。当你一名角色使用【杀】指定你为目标时,若此【杀】有点数,你判定,若点数与此【杀】点数差值不大于1,则此【杀】对你无效。", - twguimen: "鬼门", - twguimen_info: - "锁定技。当你弃置牌时,若其中有♠牌,你为每一张♠牌判定,若此牌点数与结果之差不大于1,你对一名其他角色造成2点雷电伤害。", - twdidao: "地道", - twdidao_info: - "一名角色的判定牌生效前,你可以打出一张牌作为判定牌并获得原判定牌。若你以此法打出的牌与原判定牌颜色相同,你摸一张牌。", - tw_chengpu: "TW程普", - tw_chengpu_prefix: "TW", - twlihuo: "疠火", - twlihuo2: "疠火", - twlihuo3: "疠火", - twlihuo_info: - "①当你声明使用普【杀】后,你可以将此【杀】改为火【杀】。此牌使用结算结束后,若有角色因此【杀】造成的伤害进入过濒死状态,则你失去1点体力。②当你使用火【杀】选择目标后,你可为此牌增加一个目标。", - twchunlao: "醇醪", - twchunlao_info: - "①准备阶段,若场上没有“醇”,则你可将一名角色区域内的一张牌置于其武将牌上,称为“醇”。②一名角色使用【杀】时,若其有“醇”,则其可以交给你一张牌,令此【杀】的伤害值基数+1。③一名角色进入濒死状态时,若其有“醇”,则你可以移去“醇”并摸一张牌,然后令其回复1点体力。", - tw_guohuai: "TW郭淮", - tw_guohuai_prefix: "TW", - twjingce: "精策", - twjingce_info: - "当你于出牌阶段使用第X张牌结算完毕后,你可以摸两张牌(X为你的体力值)。若此阶段你此前已摸过牌或本回合造成过伤害,你获得一枚“策”标记。", - yuzhang: "御嶂", - yuzhang_info: - "你可以弃置一枚“策”标记,然后跳过一个阶段。当你受到伤害后,你可弃置一枚“策”标记,然后选择一项:⒈令伤害来源弃置两张牌;⒉令伤害来源本回合不能再使用或打出牌。", - tw_caozhao: "曹肇", - twfuzuan: "复纂", - twfuzuan_info: - "出牌阶段限一次/当你受到伤害后/当你对其他角色造成伤害后,你可选择一名拥有转换技的角色,变更其的一个转换技的的状态。", - twchongqi: "宠齐", - twchongqi_info: - "锁定技。游戏开始时,你令所有角色获得〖非服〗。然后你可减1点体力上限,令一名其他角色获得〖复纂〗。", - twfeifu: "非服", - twfeifu_info: - "锁定技,转换技。阴:当你成为【杀】的唯一目标后;阳:当你使用【杀】指定唯一目标后;目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。", - tw_wangchang: "TW王昶", - tw_wangchang_prefix: "TW", - twkaiji: "开济", - twkaiji_info: - "准备阶段,你可令至多X名角色各摸一张牌(X为本局游戏内进入过濒死状态的角色数+1)。若有角色以此法获得了非基本牌,则你摸一张牌。", - twshepan: "慑叛", - twshepan_info: - "每回合限一次。当你成为其他角色使用牌的目标后,你可选择一项:⒈摸一张牌。⒉将其区域内的一张牌置于牌堆顶。然后若你的手牌数与其相等,则你将此技能的发动次数归零,且可以令此牌对你无效。", - tw_wangcan: "TW王粲", - tw_wangcan_prefix: "TW", - twdianyi: "典仪", - twdianyi_info: - "锁定技。你的回合结束时,若你本回合内:造成过伤害,你弃置所有手牌;未造成过伤害,你将手牌数调整至四张。", - twyingji: "应机", - twyingji_wuxie: "应机", - twyingji_info: - "当你于回合外需要使用或打出一张基本牌或普通锦囊牌时,若你没有手牌,则你可摸一张牌,然后视为使用或打出此牌。", - twshanghe: "觞贺", - twshanghe_info: - "限定技。当你进入濒死状态时,你可令所有其他角色依次交给你一张牌;若这些牌中没有【酒】,则你将体力回复至1点。", - tw_wujing: "TW吴景", - tw_wujing_prefix: "TW", - twfenghan: "锋捍", - twfenghan_info: - "每回合限一次。当你使用【杀】或伤害类锦囊牌指定第一个目标后,你可令至多X名角色各摸一张牌(X为此牌的目标数)。", - twcongji: "从击", - twcongji_info: "当你的红色牌于回合外因弃置而进入弃牌堆后,你可令一名其他角色获得这些牌。", - old_quancong: "TW全琮", - old_quancong_prefix: "TW", - zhenshan: "振赡", - zhenshan_info: - "每回合限一次,当你需要使用或打出一张基本牌时,你可以与一名手牌数少于你的角色交换手牌,视为使用或打出此牌。", - tw_tianyu: "TW田豫", - tw_tianyu_prefix: "TW", - gz_tw_tianyu: "田豫", - twzhenxi: "震袭", - twzhenxi_info: - "每回合限一次。当你使用【杀】指定目标后,你可选择一项:⒈弃置其X张手牌(X为你至其的距离);⒉将其装备区或判定区内的一张牌移动到另一名角色的装备区或判定区内。若其体力值大于你或其体力值为全场最高,则你可以改为依次执行以上两项。", - twyangshi: "扬师", - twyangshi_info: - "锁定技。当你受到伤害后,若场上有不在你攻击范围内的其他角色,则你令攻击范围+1;若没有,则你从牌堆中获得一张【杀】。", - tw_puyangxing: "濮阳兴", - twzhengjian: "征建", - twzhengjian_info: - "游戏开始时,你可选择获得一项效果:⒈其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果二。⒉其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果一。", - twzhongchi: "众斥", - twzhongchi_info: - "锁定技,限定技。当你因〖征建〗而得到牌后,若已经有至少X名角色因〖征建〗而交给你过牌(X为游戏人数的一半且向上取整),则你回复2点体力,且于本局游戏内受到渠道为【杀】的伤害+1,且你将〖征建〗中的“其须交给你一张牌”改为“你可对其造成1点伤害”。", - tw_bingyuan: "邴原", - twbingde: "秉德", - twbingde_info: - "出牌阶段限一次。你可以选择一个本阶段未选择过的花色并弃置一张牌,你摸等同于本阶段你使用此花色的牌数,然后若你以此法弃置的牌的花色与你选择的花色相同,你令你〖秉德〗于此阶段发动的次数上限+1。", - twqingtao: "清滔", - twqingtao_info: - "①摸牌阶段结束时,你可以重铸一张牌。若此牌为【酒】或非基本牌,你摸一张牌。②结束阶段,若你本回合未发动〖清滔①〗,你可以发动〖清滔①〗。", - tw_jiangji: "TW蒋济", - tw_jiangji_prefix: "TW", - twjichou: "急筹", - twjichou_info: - "①每回合限一次。你可以视为使用一张未被〖急筹①〗记录过的普通锦囊牌并记录此牌。②你无法响应或{使用对应实体牌包含你的手牌的}〖急筹①〗记录过的锦囊牌。③出牌阶段限一次。你可将手牌中任意张〖急筹①〗记录过的锦囊牌交给其他角色。", - twjilun: "机论", - twjilun_info: - "当你受到伤害后,你可以摸X张牌(X为〖急筹①〗记录数且至少为1,至多为5),或视为使用一张〖急筹①〗记录过且未被〖机论〗记录过的普通锦囊牌并记录此牌。", - tw_niufudongxie: "牛辅董翓", - baonvezhi_faq: "关于暴虐值", - baonvezhi_faq_info: "
  • 当你造成或受到伤害后,你获得等量的暴虐值;
  • 暴虐值的上限为5。", - twjuntun: "军屯", - twjuntun_info: - "①游戏开始时或当其他角色死亡后,你可令一名角色获得〖凶军〗。②当其他角色造成伤害后,若其拥有〖凶军〗,你获得等同于此次伤害值的暴虐值。", - twxiongxi: "凶袭", - twxiongxi_info: - "出牌阶段限一次。你可以弃置X张牌对一名其他角色造成1点伤害(X为你的暴虐值与暴虐值上限之差)。", - twxiafeng: "黠凤", - twxiafeng_info: - "出牌阶段开始时,你可消耗至多3点暴虐值并获得如下效果直到回合结束:你使用的前X张牌没有距离和次数限制且不可被响应,你的手牌上限+X(X为你以此法消耗的暴虐值)。", - tw_bn_1: "一点", - tw_bn_2: "两点", - tw_bn_3: "三点", - tw_bn_1_bg: "一", - tw_bn_2_bg: "二", - tw_bn_3_bg: "三", - twxiongjun: "凶军", - twxiongjun_info: "锁定技,每回合限一次。当你造成伤害后,所有拥有〖凶军〗的角色摸一张牌。", - tw_jianshuo: "蹇硕", - twkunsi: "困兕", - twkunsi_info: - "出牌阶段,你可以视为对一名未以此法选择过的其他角色使用一张【杀】。若此【杀】未造成伤害,其获得〖令戮〗直到你下回合开始,且当你成为其〖令戮〗的目标后,其可令你于〖令戮〗失败时进行两次结算。", - twlinglu: "令戮", - twlinglu_info: - "强令:①任务:执行角色于其下回合结束前造成的伤害不小于2点。②成功:其摸两张牌。③失败:其失去1点体力。", - tw_mateng: "TW马腾", - tw_mateng_prefix: "TW", - twxiongzheng: "雄争", - twxiongzheng_info: - "一轮游戏开始时,①若你上一轮发动过〖雄争〗且选择过“雄争”角色,你可以选择一项:1.视为对任意名上一轮内未对“雄争”角色造成过伤害的角色依次使用一张【杀】;2.令任意名上一轮对“雄争”角色造成过伤害的角色摸两张牌。②你可以选择一名未以此法选择过的角色,称为“雄争”角色。", - twluannian: "乱年", - twluannian_info: - "主公技。其他群势力角色的出牌阶段限一次。其可以弃置X张牌并对“雄争”角色造成1点伤害(X为所有角色于本轮发动〖乱年〗的次数+1)。", - tw_baoxin: "TW鲍信", - tw_baoxin_prefix: "TW", - twmutao: "募讨", - twmutao_info: - "出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】依次交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。", - twyimou: "毅谋", - twyimou_info: - "当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色并摸两张牌;3.背水:将所有手牌交给其(若受伤角色为你则跳过此步骤),然后依次执行上述所有选项。", - tw_liufuren: "刘夫人", - twzhuidu: "追妒", - twzhuidu_info: - "出牌阶段限一次。你可以选择一名已受伤的其他角色并选择一项:1.对其造成1点伤害;2.弃置其装备区里的一张牌;3.背水:若该角色为女性,弃置一张牌,然后依次执行上述所有选项。", - twshigong: "示恭", - twshigong_info: - "限定技。当你于回合外进入濒死状态时,你可以令当前回合角色选择一项:1.加1点体力上限并回复1点体力,摸一张牌,然后令你将体力回复至体力上限;2.弃置X张手牌,然后令你将体力回复至1点(X为其体力值)。", - tw_wangling: "TW王淩", - tw_wangling_prefix: "TW", - twmibei: "秘备", - twmibei_info: - "使命技。①使命:使用每种类型且牌名不同的牌各两张。②成功:当你使用牌后,若你于本次事件完成了〖秘备①〗的使命,你获得〖谋立〗。③失败:出牌阶段结束时,若你本回合未使用过牌,你本回合手牌上限-1并重置〖秘备〗。", - twxingqi: "星启", - twxingqi_info: - "觉醒技。准备阶段,若场上的牌数大于你的体力值,你回复1点体力,然后若〖秘备〗:未完成,你从牌堆中获得每种类型的牌各一张;已完成,本局游戏你使用牌无距离限制。", - twmouli: "谋立", - twmouli_backup: "谋立", - twmouli_info: "每回合限一次。你可以使用牌堆中的一张基本牌。", - tw_zhugeguo: "TW诸葛果", - tw_zhugeguo_prefix: "TW", - twqirang: "祈禳", - twqirang_info: - "当有装备牌进入你的装备区时,你可以从牌堆中获得一张锦囊牌,你本阶段使用此牌无距离限制且不可被响应,且当你使用此牌时,你可以为这张牌增加或减少一个目标。", - twyuhua: "羽化", - twyuhua_info: - "锁定技。①你的非基本牌不计入手牌上限。②当你于回合外失去牌后,若其中有非基本牌,你可以卜算X,然后你可以摸X张牌(X为其中非基本牌数且至多为5)。", - tw_fanchou: "TW樊稠", - tw_fanchou_prefix: "TW", - twxingluan: "兴乱", - twxingluan_info: - "结束阶段,你可以亮出牌堆顶的六张牌,然后你可以选择一种类型的牌并分配给任意角色(每名角色至多三张)。然后所有以此法得到过牌且得到的牌数不少于你的角色失去1点体力。", - tw_xujing: "TW许靖", - tw_xujing_prefix: "TW", - twboming: "博名", - twboming_info: - "①出牌阶段限两次。你可以将一张牌交给一名其他角色。②结束阶段,若所有其他角色于此回合得到的牌数之和大于1,你摸两张牌。", - twejian: "恶荐", - twejian_info: - "当其他角色得到你的牌后,若其有其他与此牌类型相同的牌,你可以令其选择一项:1.受到你造成的1点伤害;2.弃置这些牌。", - tw_zhangfei: "TW张飞", - tw_zhangfei_prefix: "TW", - twxuhe: "虚吓", - twxuhe_info: - "当你使用的【杀】被【闪】抵消时,你可以令其选择一项:1.受到你造成的1点伤害;2.本回合你使用的下一张牌对其造成伤害时,此伤害+2。", - tw_xuezong: "TW薛综", - tw_xuezong_prefix: "TW", - twjiexun: "诫训", - twjiexun_info: - "结束阶段,你可以选择一个花色并令一名其他角色摸等同于场上此花色牌数张牌,然后其弃置X张牌。若其以此法弃置了所有牌,你选择一项:1.摸X张牌,然后将X归零;2.修改〖复难〗和〖诫训〗(X为此前〖诫训〗的发动次数)。", - twfunanx: "复难·改", - twjiexunx: "诫训·改", - twfunanx_info: "当其他角色使用或打出牌响应你使用的牌时,你可获得其使用或打出的牌。", - twjiexunx_info: - "结束阶段,你可选择一个花色并令一名其他角色摸等同于场上此花色牌数张牌,然后其弃置X张牌(X为此前〖诫训〗的发动次数)。", - tw_zhangning: "TW张宁", - tw_zhangning_prefix: "TW", - twxingzhui: "星坠", - twxingzhui_info: - "出牌阶段限一次。你可以失去1点体力并施法:亮出牌堆顶2X张牌,若其中有黑色牌,则你可令一名其他角色获得这些黑色牌。若黑色牌的数量不小于X,则你对其造成X点雷电伤害。", - twjuchen: "聚尘", - twjuchen_info: - "结束阶段,若你的手牌数和体力值均不为全场最多,则你可以令所有角色弃置一张牌,然后你获得其中的红色牌。", - tw_yufuluo: "于夫罗", - twjiekuang: "竭匡", - twjiekuang_info: - "每回合限一次。当一名体力值小于你的角色成为其他角色使用基本牌或普通锦囊牌的唯一目标后,若没有角色处于濒死状态,你可以失去1点体力或减1点体力上限,将此牌的目标转移给你。然后此牌结算结束后,若此牌未造成伤害且此牌的使用者是你使用此牌名的牌的合法目标,你视为对此牌的使用者使用一张同名牌。", - twneirao: "内扰", - twneirao_info: - "觉醒技。准备阶段,若你的体力值与体力上限之和不大于9,你失去〖竭匡〗,弃置所有牌并从牌堆或弃牌堆中获得等量的【杀】,然后获得〖乱掠〗。", - twluanlve: "乱掠", - twluanlve_info: - "①出牌阶段,你可以将X张【杀】当做【顺手牵羊】对一名本阶段未成为过【顺手牵羊】的目标的角色使用(X为你以此法使用【顺手牵羊】的次数)。②当你使用牌时,若此牌为【顺手牵羊】,你令此牌不能被响应。", - tw_fengxí: "冯习", - twqingkou: "轻寇", - twqingkou_info: - "准备阶段,你可以视为对一名其他角色使用一张【决斗】。然后此牌的伤害来源摸一张牌,若伤害来源包括你,你跳过本回合的判定阶段和弃牌阶段。", - tw_zhangji: "张既", - twdingzhen: "定镇", //丁真 - twdingzhen_info: - "一轮游戏开始时,你可以选择任意名你至其距离不大于X的角色(X为你的体力值),这些角色选择一项:1.弃置一张【杀】;2.本轮其于回合内使用的第一张牌不能指定你为目标。", - twyouye: "攸业", - twyouye_info: - "锁定技。①其他角色的结束阶段,若其本回合未对你造成过伤害且“蓄”数小于5,你将牌堆顶的牌置于武将牌上,称为“蓄”。②当你造成或受到伤害后,若你有“蓄”,你将所有“蓄”分配给任意角色(若当前回合角色存活,则你至少为当前回合角色分配一张)。", - tw_xunchen: "TW荀谌", - tw_xunchen_prefix: "TW", - twweipo: "危迫", - twweipo_info: - "出牌阶段限一次。你可以令一名角色弃置一张牌,然后令其获得一张【兵临城下】或一张由你选择的智囊牌。", - twmouzhi: "谋识", - twmouzhi_info: - "锁定技。当你受到伤害时,若伤害渠道对应的牌和你上次受到的伤害渠道对应的牌颜色相同,则你防止此伤害。", - tw_jiangqing: "TW蒋钦", - tw_jiangqing_prefix: "TW", - twshangyi: "尚义", - twshangyi_info: - "出牌阶段限一次。你可以弃置一张牌并选择一名有手牌的其他角色,你令其观看你的手牌,然后你观看其手牌并选择一项:1.弃置其中一张牌;2.与其交换一张手牌。若你以此法弃置了其的黑色牌,或你与其交换的两张牌均为红色,你摸一张牌。", - twxiangyu: "翔羽", - twxiangyu_info: - "锁定技。①你于回合内的攻击范围+X(X为本回合失去过牌的角色数且至多为5)。②当你使用【杀】指定目标后,若你至目标角色的距离小于你的攻击范围,你令此目标角色抵消此【杀】所需使用的【闪】数+1。", - twgyshenxing: "慎行", - twgyshenxing_info: - "出牌阶段,你可以弃置X张牌,然后摸一张牌并获得1枚“慎”标记(X为你的“慎”数且至多为2)。", - tw_guyong: "TW顾雍", - tw_guyong_prefix: "TW", - twbingyi: "秉壹", - twbingyi_info: - "结束阶段,你可以展示所有手牌,若这些牌的颜色均相同或类别均相同,你可以令至多Y名角色各摸一张牌(Y为你的手牌数)。若你以此法展示的牌数大于1且这些牌的颜色均相同且类别均相同,你移去所有“慎”。", - twyilie: "毅烈", - twyilie_info: - "出牌阶段开始时,你可以选择一项:1.本阶段内使用【杀】的次数上限+1;2.本回合内使用【杀】指定处于连环状态的目标后,或使用【杀】被【闪】抵消时,摸一张牌;3.背水:失去1点体力,然后依次执行上述所有选项。", - tw_chendong: "TW陈武董袭", - tw_chendong_prefix: "TW", - twfenming: "奋命", - twfenming_info: - "准备阶段,你可以选择一名其他角色并选择一项:1.令其弃置一张牌;2.令其横置;3.背水:横置,然后依次执行上述所有选项。", - tw_handang: "TW韩当", - tw_handang_prefix: "TW", - twgongji: "弓骑", - twgongji2: "弓骑", - twgongji_info: - "①你的攻击范围无限。②出牌阶段限一次,你可以弃置一张牌,然后你使用与此牌花色相同的【杀】无任何次数限制直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。", - twjiefan: "解烦", - twjiefan_info: - "限定技。出牌阶段,你可以选择一名角色,令攻击范围内含有其的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。然后当其第一次进入濒死状态后,你重置〖解烦〗。", - tw_jiling: "TW纪灵", - tw_jiling_prefix: "TW", - twshuangren: "双刃", - twshuangren_info: - "①出牌阶段开始时,你可以与一名角色拼点。若你:赢,你可以视为对至多两名至其的距离不大于1的角色依次使用一张【杀】;没赢,其可以视为对你使用一张【杀】。②出牌阶段结束时,若你本回合未发动过〖双刃①〗且未造成过渠道为【杀】的伤害,你可以弃置一张牌发动〖双刃①〗。", - tw_re_fazheng: "TW法正", - tw_re_fazheng_prefix: "TW", - twxuanhuo: "眩惑", - twxuanhuo_info: - "摸牌阶段结束时,你可以交给一名其他角色两张牌,然后其选择一项:1.视为对你选择的另一名其他角色使用一张【杀】或【决斗】,2.令你获得其两张牌。", - twenyuan: "恩怨", - twenyuan1: "恩怨", - twenyuan2: "恩怨", - twenyuan_info: - "①当你获得一名其他角色的至少两张牌后,你可以令其摸一张牌,若其手牌区或装备区没有牌,则你可以改为令其回复1点体力。②当你受到1点伤害后,你可令伤害来源选择一项:1.失去1点体力;2.交给你一张手牌,若此牌的花色不为♥,你摸一张牌。", - tw_madai: "TW马岱", - tw_madai_prefix: "TW", - twqianxi: "潜袭", - twqianxi2: "潜袭", - twqianxi3: "潜袭", - twqianxi2_bg: "潜", - twqianxi3_bg: "袭", - twqianxi_info: - "准备阶段,你可以摸一张牌并弃置一张牌,令一名距离为1的角色本回合不能使用或打出与你弃置的牌颜色相同的手牌。然后本回合的结束阶段,若你本回合对其造成过渠道为【杀】的伤害,你令其不能使用或打出与你以此法弃置的牌颜色不同的牌直到其下回合结束。", - tw_niujin: "TW牛金", - tw_niujin_prefix: "TW", - twcuorui: "挫锐", - twcuorui_info: - "限定技。准备阶段,你可以将手牌摸至X张(X为场上角色手牌数最多的角色的手牌数,且至多摸5张)。然后若你的判定区:未废除,你废除判定区;已废除,你可以对一名其他角色造成1点伤害。", - twliewei: "裂围", - twliewei_info: - "锁定技。当你杀死一名角色后,你选择一项:1.摸两张牌;2.若你拥有〖挫锐〗且〖挫锐〗已发动过,重置〖挫锐〗。", - tw_guanqiujian: "TW毌丘俭", - tw_guanqiujian_prefix: "TW", - twzhengrong: "征荣", - twzhengrong_tag: "荣", - twzhengrong_info: - "当你于出牌阶段使用牌结算结束后,若此牌为你于本局游戏你的出牌阶段内使用的第偶数张指定了其他角色为目标的牌,或你于出牌阶段第一次造成伤害后,你可以将一名其他角色的一张牌置于你的武将牌上,称为“荣”。", - twhongju: "鸿举", - twhongju_info: - "觉醒技。准备阶段,若你的“荣”数不小于3,你摸等同于“荣”数的牌,且可以用任意手牌交换等量的“荣”,获得〖清侧〗,然后可以减1点体力上限并获得〖扫讨〗。", - twqingce: "清侧", - twqingce_backup: "清侧", - twqingce_info: - "出牌阶段,你可以将一张“荣”置入弃牌堆并选择一名区域内有牌的角色,你弃置其区域里的一张牌。", - twsaotao: "扫讨", - twsaotao_info: "锁定技。你使用【杀】和普通锦囊牌不能被响应。", - tw_daxiaoqiao: "TW大乔小乔", - tw_daxiaoqiao_prefix: "TW", - twxingwu: "星舞", - twxingwu_info: - "弃牌阶段开始时,你可以将一张牌置于武将牌上,称为“星舞”。然后你可移去三张“星舞”,弃置一名其他角色装备区里的所有牌,然后对其造成2点伤害(若其性别包含女性则改为1点伤害)。", - twpingting: "娉婷", - twpingting_info: - "锁定技。①一轮游戏开始时或其他角色于你的回合内进入濒死状态时,你摸一张牌并将一张牌置于武将牌上,称为“星舞”。②若你有“星舞”,你视为拥有〖天香〗和〖流离〗。", - tw_furong: "TW傅肜", - tw_furong_prefix: "TW", - twxuewei: "血卫", - twxuewei_info: - "每轮限一次。一名其他角色A的出牌阶段开始时,你可以选择另一名其他角色B,然后你令A选择一项:1.本回合不能对B使用【杀】且手牌上限-2;2.你视为对A使用一张【决斗】。", - twliechi: "烈斥", - twliechi_info: - "当你受到伤害后,若伤害来源的体力值不小于你,你可以选择一项:1.令其将手牌数弃置至与你的手牌数相同;2.弃置其一张牌;3.背水:若你本回合进入过濒死状态,弃置一张装备牌,然后依次执行上述所有选项。", - tw_yl_luzhi: "TW卢植", - tw_yl_luzhi_prefix: "TW", - twmingren: "明任", - twmingren_info: - "①游戏开始时,你摸一张牌,然后将一张手牌置于武将牌上,称为“任”。②出牌阶段开始时或出牌阶段结束时,你可以用一张牌替换“任”。", - twzhenliang: "贞良", - twzhenliang_info: - "转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。", - tw_zhangnan: "张南", - twfenwu: "奋武", - twfenwu_info: - "结束阶段,你可以失去1点体力并视为使用一张无距离限制的【杀】。若本回合你使用过的基本牌种数大于1,此【杀】伤害基数+1。", - tw_huchuquan: "呼厨泉", - twfupan: "复叛", - twfupan_info: - "当你造成或受到伤害后,你可以摸X张牌并将一张牌交给一名其他角色(X为伤害值)。若你此前:未以此法交给过该角色牌,你摸两张牌;以此法交给过该角色牌,你可{对其造成1点伤害,然后你不能再以此法交给其牌}。", - tw_liuzhang: "TW刘璋", - tw_liuzhang_prefix: "TW", - twyaohu: "邀虎", - twyaohu_info: - "每轮限一次。回合开始时,你须选择场上的一个势力。该势力的角色的出牌阶段开始时,其获得你的一张“生”,然后其须选择一项:1.对你指定的另一名的其他角色使用一张【杀】(无距离限制);2.本回合其使用伤害牌指定你为目标时须交给你两张牌,否则取消此目标。", - tw_liwei: "TW李遗", - tw_liwei_prefix: "TW", - twjiaohua: "教化", - twjiaohua_info: - "当你或体力值最小的其他角色因摸牌而得到牌后,你可以令该角色从牌堆或弃牌堆中获得一张本次未获得的类别的牌(每种类别每回合限一次)。", - tw_yanxiang: "TW阎象", - tw_yanxiang_prefix: "TW", - twkujian: "苦谏", - twkujianx: "谏", - twkujian_info: - "出牌阶段限一次。你可以将至多三张手牌交给一名其他角色,称为“谏”,你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸一张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。", - twruilian: "睿敛", - twruilian2: "睿敛", - twruilian_info: - "一轮游戏开始时,你可以选择一名角色。其下回合结束时,若其本回合弃置过至少两张牌,你可以选择其本回合弃置过的一种类别,你与其各从弃牌堆中获得一张此类别的牌。", - tw_xiahouen: "夏侯恩", - twfujian: "负剑", - twfujian_info: - "锁定技。①游戏开始时或准备阶段,若你的装备区里没有武器牌,你随机将牌堆中的一张武器牌置入装备区。②当你于回合外失去武器牌后,你失去1点体力。", - twjianwei: "剑威", - twjianwei_info: - "①若你的装备区里有武器牌,你使用【杀】无视防具且拼点牌点数+X(X为你的攻击范围)。②{其他角色的准备阶段,其可以与你拼点}/{准备阶段,你可以与攻击范围内的一名角色拼点}。若你赢,你获得其每个区域内的各一张牌;若其赢,其获得你装备区里的武器牌。", - tw_xiahoushang: "夏侯尚", - twtanfeng: "探锋", - twtanfeng_info: - "准备阶段,你可以弃置一名其他角色区域内的一张牌,然后其选择一项:1.受到你造成的1点火焰伤害,然后令你跳过本回合的一个阶段(准备阶段和结束阶段除外);2.将一张牌当做【杀】对你使用(有距离限制)。", - tw_zongyu: "TW宗预", - tw_zongyu_prefix: "TW", - twzhibian: "直辩", - twzhibian_info: - "出牌阶段开始时,你可以与一名其他角色拼点。若你赢,你可以选择一项:{1.将其区域里的一张牌移动到你的对应区域;2.回复1点体力;3.背水:弃置一张非基本牌,然后依次执行上述所有选项};若你没赢,你失去1点体力。", - twyuyan: "御严", - twyuyan_info: - "锁定技。当你成为体力值大于你的角色使用的【杀】的目标时,你令使用者选择一项:1.交给你一张点数大于此【杀】的牌(若此【杀】无点数则改为非基本牌)。2.取消此目标。", - tw_zhouchu: "TW周处", - tw_zhouchu_prefix: "TW", - twguoyi: "果毅", - twguoyi_info: - "当你不因〖果毅〗使用【杀】或普通锦囊牌指定一名其他角色为目标后,若其体力值或手牌数最大,或你的手牌数不大于X(X为你已损失的体力值+1),你可令其选择一项:1.本回合不能使用或打出手牌;2.弃置X张牌。若条件均满足,或其于本回合两个选项均已选择过,则你于此牌结算结束后依次视为对此牌的所有目标使用一张名称和属性相同的牌。", - twchuhai: "除害", - twchuhai_info: - "使命技。①使命:令至少两名其他角色进入濒死状态。②成功:一名角色的回合结束时,若你于本回合完成了〖除害①〗的使命,你废除判定区,然后每名其他角色依次交给你一张牌。③当你获得其他角色的牌后,你须将其中的一张牌置入弃牌堆。", - tw_qiaogong: "TW桥公", - tw_qiaogong_prefix: "TW", - twyizhu: "遗珠", - twyizhu_info: - "①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中,称为“遗珠”(X为角色数,选择牌的牌名对其他角色可见)。②当有其他角色使用“遗珠”指定唯一目标时,你可以选择一项:1.增加一个目标;2.取消此目标,增加一个目标。然后移除此牌对应的“遗珠”记录并摸一张牌。", - twluanchou: "鸾俦", - twluanchou_info: "出牌阶段限一次。你可以令两名角色获得〖共患〗直到你下次发动此技能。", - twgonghuan: "共患", - twgonghuan_info: - "每回合限一次。当其他角色受到伤害时,若其拥有〖共患〗且其体力值不大于你,你可以将此伤害转移给你(不触发〖共患〗)。", - tw_qiaorui: "TW桥蕤", - tw_qiaorui_prefix: "TW", - wangxing: "妄行", - twxiawei: "狭威", - twxiawei_info: - "①游戏开始时,你将牌堆中的两张基本牌置于武将牌上,称为“威”。②回合开始时,你将所有“威”置入弃牌堆。③你可以将“威”如手牌般使用或打出。④妄行:准备阶段,你可以将牌堆顶的X+1张牌置于武将牌上,称为“威”。", - twqiongji: "穷技", - twqiongji_info: - "锁定技。①每回合限一次。当你使用或打出“威”后,你摸一张牌。②当你受到伤害时,若你没有“威”,此伤害+1。", - tw_bianfuren: "TW卞夫人", - tw_bianfuren_prefix: "TW", - twwanwei: "挽危", - twwanwei_info: - "每回合限一次。当一名体力值最小的角色受到伤害时:若该角色不为你,你可以防止此伤害,然后失去1点体力;若该角色为你,或你的体力上限最大,你可以于当前回合的结束阶段获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之。", - twyuejian: "约俭", - twyuejian_info: - "出牌阶段限一次。你可以将X张牌置于牌堆顶或牌堆底(X为你的手牌数减你的手牌上限且至少为1)。若你以此法失去的牌数:不小于3,你的体力上限+1;不小于2,你回复1点体力;不小于1,你的手牌上限+1。", - tw_chenzhen: "TW陈震", - tw_chenzhen_prefix: "TW", - twmuyue: "睦约", - twmuyue_info: - "出牌阶段限一次。你可以弃置一张牌并选择一个基本牌或普通锦囊牌的牌名,然后令一名角色从牌堆中获得一张此牌名的牌。若你以此法弃置的牌的牌名与你选择的牌名相同,你下次发动〖睦约〗无需弃牌。", - twchayi: "察异", - twchayi_info: - "结束阶段,你可以选择一名其他角色,令其选择一项:1.展示所有手牌;2.下次使用牌时弃置一张牌。该角色的下个回合结束时,若其手牌数与其上一次成为〖察异〗目标后的手牌数不相同,其执行另一项。", - tw_feiyi: "TW费祎", - tw_feiyi_prefix: "TW", - twshengxi: "生息", - twshengxi_info: - "①准备阶段,你可以获得一张【调剂盐梅】。②结束阶段,若你本回合使用过牌且未造成伤害,则你可以获得一张智囊并摸一张牌。", - twkuanji: "宽济", - twkuanji_info: - "每回合限一次。当你的牌不因使用而进入弃牌堆后,你可以令一名其他角色获得其中的一张牌。", - xia_wangyue: "王越", - twyulong: "驭龙", - twyulong_info: - "当你使用【杀】指定第一个目标后,你可以与一名目标角色拼点。若你赢,且你此次的拼点牌为:黑色,此【杀】伤害+1;红色,此【杀】不可被响应。当此【杀】造成伤害后,若你赢,你令此【杀】不计入次数。", - twjianming: "剑鸣", - twjianming_info: "锁定技。每回合每种花色限一次,当你使用或打出【杀】时,你摸一张牌。", - xia_liyàn: "李彦", - twzhenhu: "震虎", - twzhenhu_info: - "当你使用伤害牌指定第一个目标时,你可以摸一张牌并与至多三名其他角色共同拼点。若你赢,此牌对所有本次拼点没赢的角色造成的伤害+1;若你没赢,你失去1点体力。", - twlvren: "履刃", - twlvren_info: - "①当你对其他角色造成伤害时,你令其获得1枚“刃”标记。②当你使用伤害牌时,你可以额外指定一名有“刃”的角色并移去其所有“刃”。③你的拼点牌点数+2X(X为参与此次拼点的角色数)。", - xia_tongyuan: "侠童渊", - xia_tongyuan_prefix: "侠", - twchaofeng: "朝凤", - twchaofeng_backup: "朝凤", - twchaofeng_info: - "①你可以将一张【杀】当做【闪】、【闪】当做任意一种【杀】使用或打出。②出牌阶段开始时,你可以与至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】。", - twchuanshu: "传术", - twchuanshu_info: - "限定技。准备阶段,你可以选择一名角色。直到你的下回合开始,其获得以下效果:1.当其拼点牌亮出时,此牌点数+3;2.其使用的下一张【杀】对除你外的角色造成伤害时,此伤害+1;3.若其不为你,其使用的下一张【杀】结算结束后,你摸等同于其因此【杀】造成的伤害值数的牌。", - xia_xushu: "侠徐庶", - xia_xushu_prefix: "侠", - twjiange: "剑歌", - twjiange_info: - "每回合限一次。你可以将一张非基本牌当做【杀】使用或打出(无距离和次数限制,且不计入次数)。若此时不为你的回合,你摸一张牌。", - twxiawang: "侠望", - twxiawang_info: - "当一名角色受到伤害后,若你至其的距离不大于1,你可以对伤害来源使用一张【杀】。当此【杀】结算结束后,若你造成过渠道为此牌的伤害,结束当前阶段。", - tw_haomeng: "TW郝萌", - tw_haomeng_prefix: "TW", - twgongge: "攻阁", - twgongge_info: - "摧坚:你可以选择一项:1.摸X+1张牌。其响应此牌后,跳过你的下一个摸牌阶段;2.弃置其X+1张牌。此牌结算结束后,若其体力值不小于你,你交给其X张牌;3.此牌对其造成的伤害+X。此牌结算结束后,其回复X点体力。", - tw_weixu: "魏续", - twsuizheng: "随征", - twsuizheng_info: - "锁定技。游戏开始时,你选择一名其他角色,称为“随征”角色。你获得以下效果:当“随征”角色造成伤害后,你摸一张牌;当“随征”角色受到伤害后,你选择一项:1.失去1点体力,令其从牌堆或弃牌堆中获得一张【杀】或【决斗】;2.弃置两张基本牌,令其回复1点体力。", - twtuidao: "颓盗", - twtuidao_info: - "限定技。准备阶段,若“随征”角色的体力值不大于2或“随征”角色已死亡,你可以废除你与其的一个坐骑栏并选择一个类别,然后若“随征”角色存活,你获得其所有此类别的牌,否则你从牌堆中获得两张此类别的牌。然后你将“随征”角色改为另一名角色。", - tw_caoxiu: "TW曹休", - tw_caoxiu_prefix: "TW", - twqianju: "千驹", - twqianju_info: - "锁定技。①你计算与其他角色的距离-X(X为你装备区的牌数)。②每回合限一次。当你对距离为1以内的角色造成伤害后,若你的装备区存在空置装备栏,你从牌堆或弃牌堆中将一张你空置装备栏对应副类别的装备牌置于你的装备区。", - twqingxi: "倾袭", - twqingxi_info: - "当你使用张【杀】指定目标后,若此牌为你于本回合使用的第一张【杀】,你可以令目标角色选择一项:1.令你摸Y张牌,此【杀】不可被其响应(Y为你装备区的牌数且至少为1);2.若其装备区里有牌,弃置装备区里的所有牌,然后弃置你装备区里的等量张牌,令此【杀】对其造成的伤害+1。", - tw_sunyi: "TW孙翊", - tw_sunyi_prefix: "TW", - twzaoli: "躁厉", - twzaoli_info: - "锁定技。①出牌阶段,你只能使用或打出你本回合得到的手牌。②出牌阶段开始时,你须弃置你区域内的所有装备牌并弃置任意张非装备手牌,你摸等量的牌,从牌堆中将你此次弃置的装备牌对应副类别的装备牌置入装备区。若你以此法置入了超过两张装备牌,你失去1点体力。", - tw_yangyi: "TW杨仪", - tw_yangyi_prefix: "TW", - twgongsun: "共损", - twgongsun_shadow: "共损", - twgongsun_info: - "锁定技。出牌阶段开始时,你选择攻击范围内的一名其他角色并选择一种花色,直至你的下个回合开始前或你死亡时,你与其均无法使用、打出或弃置该花色的手牌。", - tw_dengzhi: "TW邓芝", - tw_dengzhi_prefix: "TW", - twjimeng: "急盟", - twjimeng_info: - "出牌阶段限一次。你可以获得一名其他角色区域内的一张牌,然后交给其一张牌。若其体力值不小于你,你摸一张牌。", - xia_lusu: "侠鲁肃", - xia_lusu_prefix: "侠", - twkaizeng: "慨赠", - twkaizeng_info: - "其他角色的出牌阶段限一次。其可以选择一种基本牌的牌名或非基本牌的类型,然后令你选择是否交给其任意张手牌。若你以此法:交给其至少两张牌,你摸一张牌;交给其的牌中包含其选择的牌名或类型的牌,你获得一张与此牌名或类型不同的牌。", - twyangming: "扬名", - twyangming_info: - "出牌阶段结束时,你可以摸X张牌,且令本回合的手牌上限+X(X为你本阶段使用过的牌的类型数)。", - xia_dianwei: "侠典韦", - xia_dianwei_prefix: "侠", - twliexi: "烈袭", - twliexi_info: - "准备阶段,你可以弃置任意张牌并选择一名其他角色。若你以此法弃置的牌数大于其体力值,你对其造成1点伤害;否则其对你造成1点伤害。然后若你弃置的牌中有武器牌,你对其造成1点伤害。", - twshezhong: "慑众", - twshezhong_info: - "结束阶段,若你:本回合对其他角色造成过伤害,你可以令至多X名其他角色下个摸牌阶段的额定摸牌数-1(X为你本回合造成的伤害值);本回合受到过伤害,你可以将手牌摸至与其中一名伤害来源的体力值相同(至多摸至5)。", - xia_zhaoe: "赵娥", - twyanshi: "言誓", - twyanshi_info: - "①游戏开始时,你选择一名其他角色,称为“言誓”角色。②当你或“言誓”角色受到二者之外角色造成的伤害后,伤害来源获得1枚“誓”标记。③你对有“誓”的角色使用牌无距离限制。④当你对有“誓”的角色造成伤害时,此伤害+1,且当你对这些角色造成伤害后,你摸等同于伤害值的牌并移去其所有“誓”。", - twrenchou: "刃仇", - twrenchou_info: - "锁定技。当你或“言誓”角色死亡时,若二者中的另一名角色A存活,A对杀死你或其的角色造成X点伤害(X为A的体力值)。", - xia_xiahouzie: "夏侯紫萼", - twxuechang: "血偿", - twxuechang_info: - "出牌阶段限一次。你可以与一名其他角色拼点。若你:赢,你获得其一张牌,若此牌为装备牌,你视为对其使用一张【杀】;没赢,其对你造成1点伤害,且你下次对其造成的伤害+1。", - twduoren: "夺刃", - twduoren_info: - "①当你杀死角色后,你可以减1点体力上限,然后获得其所有的非主公技和非隐匿技。②当你令其他角色进入濒死状态时,你失去因〖夺刃①〗获得的技能。", - tw_yangang: "严纲", - twzhiqu: "直取", - twzhiqu_info: - "结束阶段,你可以选择一名其他角色并依次使用牌堆顶X张牌中的【杀】。搏击:依次使用牌堆顶X张牌中的锦囊牌(X为你距离不大于1内的角色数,且你或其以外的角色不是你以此法使用牌的合法目标)。", - twxianfeng: "先锋", - twxianfeng_info: - "当你于出牌阶段使用【杀】或伤害类锦囊牌对其他角色造成伤害后,你可以令受伤角色选择一项:1.其摸一张牌,然后直到你下个回合开始时,你至其他角色的距离-1;2.你摸一张牌,然后直到你下个回合开始时,其至你的距离-1。", - tw_gongsunfan: "公孙范", - twhuiyuan: "回援", - twhuiyuan_info: - "当你于出牌阶段使用牌结算结束后,若你未于此阶段获得过此类型的牌,你可以展示一名角色的一张手牌,若此牌与你使用的牌类型相同,你获得此牌,否则你弃置此牌,然后其摸一张牌。游击:对其造成1点伤害。", - twshoushou: "收绶", - twshoushou_info: - "①当你获得其他角色的牌时,若你在任意角色的攻击范围内,其他角色至你的距离+1。②当你造成或受到伤害后,若你不在任意其他角色的攻击范围内,其他角色至你的距离-1。", - twshijun: "师君", - twshijun_info: - "主公技,其他群势力角色出牌阶段限一次,若你没有“米”,其可以摸一张牌,然后将一张牌置于你的武将牌上,称为“米”。", - twjuxiang: "踞襄", - twjuxiang_info: - "主公技,其他群势力角色出牌阶段限一次,其可以选择其装备区的一张牌移动到你的装备区中,若你对应的装备栏已被废除,则改为交给你此装备牌,然后恢复你的对应装备栏。", - tw_ol_sunjian: "TW孙坚", - tw_ol_sunjian_prefix: "TW", - twpolu: "破虏", - twpolu_info: - "主公技,当吴势力角色杀死一名角色或死亡后,你可以令任意名角色各摸X张牌(X为你此前发动过此技能的次数+1)。", - tw_menghuo: "TW孟获", - tw_menghuo_prefix: "TW", - twqiushou: "酋首", - twqiushou_info: - "主公技,锁定技,当一张【南蛮入侵】结算结束后,若此牌造成的伤害大于3点或有角色因此死亡,所有蜀势力和群势力角色各摸一张牌。", - twzhuiting: "坠廷", - twzhuiting_info: - "主公技,当一张锦囊牌即将对你生效时,其他魏势力角色和群势力角色可将一张与此牌颜色相同的牌当作【无懈可击】使用。", - twniju: "逆拒", - twniju_info: - "主公技。当你的拼点牌亮出后,你可以令本次拼点事件中的一张拼点牌的点数+X或-X。然后当本次拼点事件结束后,若有两张拼点牌的点数相等,你摸X张牌(X为场上群势力角色数)。", - ol_liuyu: "TW刘虞", - ol_liuyu_prefix: "TW", - twchongwang: "崇望", - twchongwang_info: - "主公技,其他群势力角色的出牌阶段开始时,其可以交给你一张牌,然后你与其使用【杀】或伤害性锦囊牌指定目标时不能指定对方为目标直至你的下回合结束(每名角色限发动一次)。", - tw_zhangzhao: "张昭", - twlijian: "力荐", - twlijian_info: - "昂扬技。其他角色的弃牌阶段结束时,你可以令其获得任意本阶段进入弃牌堆的牌(可不选),然后你获得其余的牌,若其得到的牌数大于你,你可以对其造成1点伤害。
    激昂:八张牌进入弃牌堆。", - twchungang: "纯刚", - twchungang_info: "锁定技。一名其他角色于摸牌阶段外得到超过一张牌时,你令其弃置一张牌。", - tw_zhanghong: "张纮", - twquanqian: "劝迁", - twquanqian_info: - "昂扬技。出牌阶段限一次,你可以将至多四张花色各不相同的手牌交给一名其他角色,然后若你交出的牌数大于1,则你从牌堆中获得一张装备牌,然后选择一项:①将手牌数摸至与其相同;②观看其手牌并获得其一种花色的所有牌。
    激昂:你弃置六张手牌。", - twrouke: "柔克", - twrouke_info: "锁定技。当你于摸牌阶段外得到超过一张牌时,你摸一张牌。", - kaisa: "凯撒", - zhengfu: "征服", - zhengfu_info: - "当你使用【杀】指定目标时,你可以选择一种牌的类别,然后除非目标角色交给你一种该类别的牌,否则其不能闪避此【杀】。", - xia_xiahoudun: "侠夏侯惇", - xia_xiahoudun_prefix: "侠", - twdanlie: "胆烈", - twdanlie_info: - "①出牌阶段限一次。你可以与至多三名其他角色共同拼点。若你赢,你对没赢的角色依次造成1点伤害;若你没赢,你失去1点体力。②你的拼点牌点数+X(X为你已损失的体力值)。", - xia_zhangwei: "张葳", - twhuzhong: "护众", - twhuzhong_info: - "当你于出牌阶段使用无属性【杀】指定唯一目标角色时,你可以摸一张牌并选择一项:①为此牌额外选择一个目标;②弃置其一张手牌,此牌结算完毕后,若此牌造成过伤害,则你摸一张牌且本阶段可以额外使用一张【杀】。", - twfenwang: "焚亡", - twfenwang_info: - "锁定技。①当你受到属性伤害时,你须弃置一张牌或令此伤害+1。②当你对其他角色造成非属性伤害时,若你的手牌数大于等于其,则此伤害+1。", - xia_xiahousone: "夏侯子萼", - twchengxi: "承袭", - twchengxi_info: - "出牌阶段每名角色限一次,你可以摸一张牌并与一名其他角色拼点。若你赢,你使用的下一张基本牌或非延时锦囊牌结算完毕后,你视为对原目标使用一张无次数限制的同名牌;若你没赢,其视为对你使用一张无距离限制的【杀】。", - xia_liubei: "侠刘备", - xia_liubei_prefix: "侠", - twshenyi: "伸义", - twshenyi_info: - "每回合限一次,当你或你攻击范围内的一名角色于一回合内首次受到伤害后,你可以声明一种基本牌或锦囊牌(每种牌名限一次),然后从牌堆中将一张同名牌(若没有同名牌则改为同类型的牌)称为“侠义”置于武将牌上。若受伤角色不为你,则你可以将任意张手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。", - twxinghan: "兴汉", - twxinghan_info: - "①你的回合外或你处于濒死状态时,你可以如手牌般使用或打出“侠义”牌。②准备阶段,若“侠义”牌数大于存活角色数,则你可以依次使用其中所有可以使用的牌。然后你获得如下效果:回合结束时,你弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)。", - twxinghan_tag: "侠义", - xia_guanyu: "侠关羽", - xia_guanyu_prefix: "侠", - twzhongyi: "忠义", - twzhongyi_info: - "锁定技。①你使用【杀】无距离限制。②当你使用【杀】结算完毕后,你选择一项:⒈摸X张牌;⒉回复X点体力;⒊背水:失去Y点体力,依次执行以上两项(X为受到此牌造成的伤害的角色数,Y为你本局游戏选择此项的次数)。", - twchue: "除恶", - twchue_info: - "①当你使用【杀】指定唯一目标时,若场上存在可称为此【杀】目标的非目标角色,则你可以失去1点体力,为此牌额外指定Z个目标。②当你受到伤害或失去体力后,你摸一张牌并获得1个“勇”标记。③回合结束时,若你的“勇”标记数大于等于Z,则你可以失去Z个“勇”标记,视为使用一张伤害+1且可以额外指定Z个目标的【杀】。(Z为你的体力值)", - xia_shitao: "石韬", - twjieqiu: "劫囚", - twjieqiu_info: - "出牌阶段限一次,你可以选择一名装备区没有废除栏的其他角色,废除其所有装备栏,然后其摸X张牌(X为其废除装备栏前的装备区牌数),直到其恢复所有装备栏前:其弃牌阶段结束时,其恢复等同于其弃置牌数的装备栏;其回合结束时,若其仍有已废除的装备栏,则你执行一个额外回合(每轮限一次)。", - twenchou: "恩仇", - twenchou_info: - "出牌阶段限一次,你可以观看一名存在废除装备栏的其他角色的手牌并获得其中一张牌,然后你恢复其一个装备栏。", - xia_shie: "史阿", - twdengjian: "登剑", - twdengjianx: "剑法", - twdengjian_info: - "①其他角色的弃牌阶段结束时,你可以随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。②你使用“剑法”牌不计入次数限制。", - twxinshou: "心授", - twxinshou_info: - "①当你于出牌阶段使用【杀】时,若此【杀】与你本回合使用的所有其他【杀】的颜色均不相同,则你可以选择执行以下一项本回合未执行过的项:⒈摸一张牌;⒉交给一名其他角色一张牌。②当你使用【杀】时,若〖心授①〗的两项本回合均已被你选择过,则你可以令〖登剑①〗失效并令一名其他角色获得〖登剑〗,你的下个回合开始时,其失去〖登剑〗,若其这期间使用【杀】造成过伤害,则你结束〖登剑①〗的失效状态。", - xia_yuzhenzi: "玉真子", - twhuajing: "化境", - twhuajing_info: - "①游戏开始时,你获得6个效果各不相同的无效果“武”标记。②一名拥有“武”标记的角色的攻击范围+X(X为其拥有的“武”标记数)。③出牌阶段限一次,你可以展示至多四张手牌,然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果。④拥有“武”标记效果的角色的武器牌失效(武器牌不提供攻击范围且武器技能失效)。", - twhuajing_jian: "剑", - twhuajing_jian_info: "当你使用【杀】指定目标后,你随机弃置目标角色两张牌。", - twhuajing_dao: "刀", - twhuajing_dao_info: "当你使用【杀】对没有手牌的目标角色造成伤害时,此伤害+1。", - twhuajing_fu: "斧", - twhuajing_fu_info: "当你使用的【杀】被【闪】响应后,你对目标角色造成1点伤害。", - twhuajing_qiang: "枪", - twhuajing_qiang_info: "当你使用黑色【杀】结算完毕后,你从牌堆或弃牌堆中获得一张【闪】。", - twhuajing_ji: "戟", - twhuajing_ji_info: "当你使用【杀】造成伤害时,你摸一张牌。", - twhuajing_gong: "弓", - twhuajing_gong_info: "当你使用【杀】造成伤害后,你随机弃置受伤角色装备区里的一张牌。", - twtianshou: "天授", - twtianshou_info: - "锁定技,回合结束时,若你本回合使用【杀】造成过伤害,且你拥有本回合获得过效果的“武”标记,则你须将其中一个“武”标记交给一名其他角色并令其获得此标记的效果直到其回合结束,然后你摸两张牌。", - tw_yanliang: "颜良", - tw_wenchou: "文丑", - tw_yuantan: "袁谭", - twduwang: "独往", - twduwang_info: - "使命技。①出牌阶段开始时,你可以选择至多三名有牌的其他角色,摸X张牌(X为选择角色数+1),然后这些角色依次将一张牌当【决斗】对你使用。②当你处于濒死状态时,其他角色不能对你使用【桃】。③使命:使用【决斗】或成为【决斗】目标的次数之和不小于4(若游戏总人数小于4则改为3)。④成功:准备阶段,若你于你的上回合完成了〖独往③〗的使命,则你重置〖独往〗并将〖独往〗修改至只保留〖独往①〗的效果,选择一项:⒈获得〖狭勇〗;⒉重置〖延势〗并令其获得历战效果。⑤失败:当你死亡时,使命失败。", - twylyanshi: "延势", - twylyanshi_info: "限定技。你可以将一张【杀】当作【决斗】、【兵临城下】或任意智囊牌使用或打出。", - twylyanshix: "延势·改", - twylyanshix_info: - "限定技。你可以将一张【杀】当作【决斗】、【兵临城下】或任意智囊牌使用或打出。历战:重置〖延势〗。", - twjuexing: "绝行", - twjuexing_info: - "出牌阶段限一次。你可以视为对一名其他角色使用一张【决斗】。此牌对一名角色生效时,你与其将所有手牌扣置于武将牌上,然后各摸等同于当前体力值的牌。此牌结算结束后,你与所有目标角色弃置本次以此法摸的牌,然后获得扣置于武将牌上的牌。历战:当你因〖绝行〗摸牌时,摸牌数+1。", - twxiayong: "狭勇", - twxiayong1: "狭勇", - twxiayong2: "狭勇", - twxiayong_info: - "锁定技。当你使用的【决斗】或目标角色包括你的【决斗】造成伤害时,若受伤角色为你,则你随机弃置一张手牌;否则你令此伤害+1。", - twqiaosi: "峭嗣", - twqiaosi_info: - "结束阶段,你可以获得由其他角色区域直接置入或经由处理区置入弃牌堆的所有牌,然后若你以此法获得的牌数小于你的体力值,则你失去1点体力。", - twbaizu: "败族", - twbaizu_info: - "锁定技。结束阶段,若你已受伤且你有手牌,则你须选择X名有手牌的其他角色(X为你的体力值),你与这些角色同时弃置一张手牌,然后你对与你弃置牌类别相同的所有其他角色各造成1点伤害。历战:〖败族〗目标选择数+1。", - - tw_mobile: "海外服·稀有专属", - tw_yunchouzhi: "运筹帷幄·智", - tw_yunchouxin: "运筹帷幄·信", - tw_yunchouren: "运筹帷幄·仁", - tw_yunchouyong: "运筹帷幄·勇", - tw_yunchouyan: "运筹帷幄·严", - tw_zhu: "海外服·主公", - tw_sp: "海外服·SP", - tw_swordsman: "海外服·武侠篇", - tw_mobile2: "海外服·异构", - tw_yijiang: "一将成名TW", - tw_english: "英文版", - }, - pinyins: { - 凯撒: ["Caesar"], - 难升米: ["Nashime"], - }, - }; -}); diff --git a/character/tw/card.js b/character/tw/card.js new file mode 100644 index 000000000..662a9dc1e --- /dev/null +++ b/character/tw/card.js @@ -0,0 +1,111 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + dz_mantianguohai: { + fullskin: true, + type: "trick", + enable: true, + derivation: "tw_dongzhao", + global: ["dz_mantianguohai"], + selectTarget: [1, 2], + filterTarget: function (card, player, target) { + return target != player && target.countCards("hej") > 0; + }, + content: function () { + player.gainPlayerCard(target, "hej", true); + }, + contentAfter: function () { + "step 0"; + var evtx = event.getParent(); + event.targets = targets.filter(function (target) { + return target.hasHistory("lose", function (evt) { + return evt.getParent(3).name == "dz_mantianguohai" && evt.getParent(4) == evtx; + }); + }); + if (!event.targets.length || !player.countCards("he")) event.finish(); + "step 1"; + var target = targets.shift(); + event.target = target; + var next = player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); + if (player.hasSkill("twyingjia") && player.countUsed("dz_mantianguohai") == 1) + next.set("ai", function (card) { + if (card.name == "dz_mantianguohai") return -10; + return -get.value(card, _status.event.getParent().target); + }); + "step 2"; + if (result.bool) { + player.give(result.cards, target); + } + "step 3"; + if (targets.length && player.countCards("h") > 0) event.goto(1); + }, + ai: { + order: 6, + tag: { + lose: 1, + loseCard: 1, + }, + result: { + target: -0.1, + }, + }, + }, + gx_lingbaoxianhu: { + fullskin: true, + type: "equip", + subtype: "equip1", + derivation: "tw_gexuan", + cardcolor: "heart", + distance: { attackFrom: -2 }, + ai: { + basic: { + equipValue: 4.5, + }, + }, + skills: ["gx_lingbaoxianhu"], + }, + gx_taijifuchen: { + fullskin: true, + type: "equip", + subtype: "equip1", + derivation: "tw_gexuan", + cardcolor: "heart", + distance: { attackFrom: -4 }, + ai: { + basic: { + equipValue: 4.5, + }, + }, + skills: ["gx_taijifuchen"], + }, + gx_chongyingshenfu: { + fullskin: true, + type: "equip", + subtype: "equip2", + derivation: "tw_gexuan", + cardcolor: "heart", + ai: { + basic: { + equipValue: 7, + }, + }, + skills: ["gx_chongyingshenfu"], + loseDelay: false, + }, + meiyingqiang: { + fullskin: true, + type: "equip", + subtype: "equip1", + cardimage: "yinyueqiang", + cardcolor: "diamond", + derivation: "tw_zhaoxiang", + distance: { attackFrom: -2 }, + ai: { + basic: { + equipValue: 4.5, + }, + }, + skills: ["meiyingqiang"], + }, +}; +export default cards; diff --git a/character/tw/character.js b/character/tw/character.js new file mode 100644 index 000000000..a5d41a217 --- /dev/null +++ b/character/tw/character.js @@ -0,0 +1,116 @@ +const characters = { + tw_yanliang: ["male", "qun", 4, ["twduwang", "twylyanshi"]], + tw_wenchou: ["male", "qun", 4, ["twjuexing", "twxiayong"]], + tw_yuantan: ["male", "qun", 4, ["twqiaosi", "twbaizu"]], + xia_yuzhenzi: ["male", "qun", 3, ["twhuajing", "twtianshou"]], + xia_shie: ["male", "wei", 4, ["twdengjian", "twxinshou"]], + xia_shitao: ["male", "qun", 4, ["twjieqiu", "twenchou"]], + xia_guanyu: ["male", "qun", 4, ["twzhongyi", "twchue"]], + xia_liubei: ["male", "shu", 4, ["twshenyi", "twxinghan"]], + xia_xiahousone: ["female", "qun", 3, ["twchengxi"]], + xia_xiahoudun: ["male", "qun", 4, ["twdanlie"]], + xia_zhangwei: ["female", "qun", 3, ["twhuzhong", "twfenwang"]], + tw_zhanghong: ["male", "wu", 3, ["twquanqian", "twrouke"]], + tw_zhangzhao: ["male", "wu", 3, ["twlijian", "twchungang"]], + tw_ol_sunjian: ["male", "wu", "4/5", ["gzyinghun", "wulie", "twpolu"], ["zhu"]], + tw_menghuo: ["male", "qun", 4, ["huoshou", "rezaiqi", "twqiushou"], ["zhu"]], + ol_liuyu: ["male", "qun", 2, ["zongzuo", "zhige", "twchongwang"], ["zhu"]], + tw_gongsunfan: ["male", "qun", 4, ["twhuiyuan", "twshoushou"]], + tw_yangang: ["male", "qun", 4, ["twzhiqu", "twxianfeng"]], + xia_xiahouzie: ["female", "qun", "3/4", ["twxuechang", "twduoren"]], + xia_zhaoe: ["female", "qun", 3, ["twyanshi", "twrenchou"]], + xia_lusu: ["male", "qun", 4, ["twkaizeng", "twyangming"]], + xia_dianwei: ["male", "qun", 4, ["twliexi", "twshezhong"]], + tw_bingyuan: ["male", "qun", 3, ["twbingde", "twqingtao"]], + tw_niufudongxie: ["double", "qun", 4, ["twjuntun", "twxiongxi", "twxiafeng"]], + tw_jianshuo: ["male", "qun", 6, ["twkunsi"]], + tw_jiangji: ["male", "wei", 3, ["twjichou", "twjilun"]], + tw_mateng: ["male", "qun", 4, ["mashu", "twxiongzheng", "twluannian"], ["zhu"]], + tw_baoxin: ["male", "qun", 4, ["twmutao", "twyimou"]], + tw_liufuren: ["female", "qun", 3, ["twzhuidu", "twshigong"]], + tw_yufuluo: ["male", "qun", 6, ["twjiekuang", "twneirao"]], + tw_fengxí: ["male", "shu", 4, ["twqingkou"]], + tw_zhangji: ["male", "wei", 3, ["twdingzhen", "twyouye"]], + tw_zhangnan: ["male", "shu", 4, ["twfenwu"]], + tw_huchuquan: ["male", "qun", 4, ["twfupan"]], + tw_liwei: ["male", "shu", 4, ["twjiaohua"]], + tw_yanxiang: ["male", "qun", 3, ["twkujian", "twruilian"]], + tw_xiahouen: ["male", "wei", 5, ["twfujian", "twjianwei"]], + tw_xiahoushang: ["male", "wei", 4, ["twtanfeng"]], + tw_qiaorui: ["male", "qun", 5, ["twxiawei", "twqiongji"]], + tw_haomeng: ["male", "qun", 4, ["twgongge"]], + tw_weixu: ["male", "qun", 4, ["twsuizheng", "twtuidao"]], + xia_xushu: ["male", "qun", 4, ["twjiange", "twxiawang"]], + xia_wangyue: ["male", "qun", 4, ["twyulong", "twjianming"]], + xia_liyàn: ["male", "qun", 4, ["twzhenhu", "twlvren"]], + xia_tongyuan: ["male", "qun", 4, ["twchaofeng", "twchuanshu"]], + tw_zhangning: ["female", "qun", 3, ["twxingzhui", "twjuchen"]], + tw_yangyi: ["male", "shu", 3, ["duoduan", "twgongsun"]], + tw_dengzhi: ["male", "shu", 3, ["twjimeng", "shuaiyan"]], + tw_wangling: ["male", "wei", 4, ["twmibei", "twxingqi"], ["clan:太原王氏"]], + tw_zhugeguo: ["female", "shu", 3, ["twqirang", "twyuhua"]], + tw_fanchou: ["male", "qun", 4, ["twxingluan"]], + tw_xujing: ["male", "shu", 3, ["twboming", "twejian"]], + tw_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "twxuhe"]], + tw_xuezong: ["male", "wu", 3, ["funan", "twjiexun"]], + tw_xunchen: ["male", "qun", 3, ["twweipo", "mjchenshi", "twmouzhi"]], + tw_jiangqing: ["male", "wu", 4, ["twshangyi", "twxiangyu"]], + tw_guyong: ["male", "wu", 3, ["twgyshenxing", "twbingyi"]], + tw_chendong: ["male", "wu", 4, ["twyilie", "twfenming"]], + tw_handang: ["male", "wu", 4, ["twgongji", "twjiefan"]], + tw_jiling: ["male", "qun", 4, ["twshuangren"]], + tw_re_fazheng: ["male", "shu", 3, ["twxuanhuo", "twenyuan"]], + tw_madai: ["male", "shu", 4, ["mashu", "twqianxi"]], + tw_niujin: ["male", "wei", 4, ["twcuorui", "twliewei"]], + tw_guanqiujian: ["male", "wei", 3, ["twzhengrong", "twhongju"]], + tw_daxiaoqiao: ["female", "wu", 3, ["twxingwu", "twpingting"], ["tempname:daxiaoqiao"]], + tw_furong: ["male", "shu", 4, ["twxuewei", "twliechi"]], + tw_yl_luzhi: ["male", "qun", 3, ["twmingren", "twzhenliang"]], + tw_liuzhang: ["male", "qun", 3, ["jutu", "twyaohu", "rehuaibi"]], + tw_zongyu: ["male", "shu", 3, ["twzhibian", "twyuyan"]], + tw_zhouchu: ["male", "wu", 4, ["twguoyi", "twchuhai"]], + tw_qiaogong: ["male", "wu", 3, ["twyizhu", "twluanchou"]], + tw_feiyi: ["male", "shu", 3, ["twshengxi", "twkuanji"]], + tw_bianfuren: ["female", "wei", 3, ["twwanwei", "twyuejian"]], + tw_chenzhen: ["male", "shu", 3, ["twmuyue", "twchayi"]], + tw_caoxiu: ["male", "wei", 4, ["twqianju", "twqingxi"]], + tw_sunyi: ["male", "wu", 4, ["twzaoli"]], + tw_puyangxing: ["male", "wu", 4, ["twzhengjian", "twzhongchi"]], + tw_tianyu: ["male", "wei", 4, ["twzhenxi", "twyangshi"]], + old_quancong: ["male", "wu", 4, ["zhenshan"]], + tw_wujing: ["male", "wu", 4, ["twfenghan", "twcongji"]], + tw_wangcan: ["male", "wei", 3, ["twdianyi", "twyingji", "twshanghe"]], + tw_wangchang: ["male", "wei", 3, ["twkaiji", "twshepan"], ["clan:太原王氏"]], + tw_caozhao: ["male", "wei", 4, ["twfuzuan", "twchongqi"]], + tw_guohuai: ["male", "wei", 4, ["twjingce", "yuzhang"]], + tw_chengpu: ["male", "wu", 4, ["twlihuo", "twchunlao"]], + tw_zhangmancheng: ["male", "qun", 4, ["twfengji", "twyiju", "twbudao"]], + tw_caocao: ["male", "qun", 4, ["twlingfa"]], + tw_liuhong: ["male", "qun", 4, ["twyujue", "twgezhi", "twfengqi"], ["zhu"]], + tw_huojun: ["male", "shu", 4, ["twsidai", "twjieyu"]], + tw_zangba: ["male", "wei", 4, ["twhanyu", "twhengjiang"]], + tw_re_caohong: ["male", "wei", 4, ["twyuanhu", "twjuezhu"]], + tw_mayunlu: ["female", "shu", 4, ["mashu", "twfengpo"]], + tw_hejin: ["male", "qun", 4, ["twmouzhu", "twyanhuo"]], + tw_hucheer: ["male", "qun", 4, ["twshenxing", "twdaoji"]], + tw_yujin: ["male", "qun", 4, ["xinzhenjun"]], + tw_fuwan: ["male", "qun", 4, ["twmoukui"]], + tw_zhaoxiang: ["female", "shu", 4, ["refanghun", "twfuhan", "twqueshi"]], + yuejiu: ["male", "qun", 4, ["cuijin"]], + wuban: ["male", "shu", 4, ["jintao"], ["clan:陈留吴氏"]], + duosidawang: ["male", "qun", "4/5", ["equan", "manji"]], + jiachong: ["male", "qun", 3, ["beini", "dingfa"]], + tw_dongzhao: ["male", "wei", 3, ["twmiaolve", "twyingjia"]], + tw_gexuan: ["male", "qun", 3, ["twdanfa", "twlingbao", "twsidao"]], + tw_beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia", "bingzhao"], ["zhu"]], + nashime: ["male", "qun", 3, ["chijie", "waishi", "renshe"]], + tw_xiahouba: ["male", "shu", 4, ["twyanqin", "twbaobian"]], + tw_zumao: ["male", "wu", 4, ["twtijin"]], + tw_caoang: ["male", "wei", 4, ["twxiaolian"]], + tw_dingfeng: ["male", "wu", 4, ["twqijia", "twzhuchen"]], + tw_caohong: ["male", "wei", 4, ["twhuzhu", "twliancai"]], + tw_maliang: ["male", "shu", 3, ["twrangyi", "twbaimei"]], + kaisa: ["male", "western", 4, ["zhengfu"]], +}; + +export default characters; diff --git a/character/tw/characterFilter.js b/character/tw/characterFilter.js new file mode 100644 index 000000000..798cf01a1 --- /dev/null +++ b/character/tw/characterFilter.js @@ -0,0 +1,10 @@ +const characterFilters = { + nashime(mode) { + return mode != "guozhan"; + }, + tw_xiahouba(mode) { + return mode != "guozhan"; + }, +}; + +export default characterFilters; diff --git a/character/tw/characterReplace.js b/character/tw/characterReplace.js new file mode 100644 index 000000000..8813d1ce2 --- /dev/null +++ b/character/tw/characterReplace.js @@ -0,0 +1,11 @@ +const characterReplaces = { + tw_caocao: ["tw_caocao", "jsrg_caocao", "yj_caocao"], + mateng: ["tw_mateng", "mateng"], + xiahouen: ["tw_xiahouen", "jsrg_xiahouen"], + jiangji: ["dc_jiangji", "tw_jiangji", "jiangji"], + baoxin: ["tw_baoxin", "baoxin"], + yanxiang: ["yanxiang", "tw_yanxiang"], + liwei: ["liwei", "tw_liwei"], +}; + +export default characterReplaces; diff --git a/character/tw/dynamicTranslate.js b/character/tw/dynamicTranslate.js new file mode 100644 index 000000000..8f17da7a0 --- /dev/null +++ b/character/tw/dynamicTranslate.js @@ -0,0 +1,48 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + twfeifu(player) { + var str = "锁定技,转换技。"; + if (!player.storage.twfeifu) str += ''; + str += "阴:当你成为【杀】的唯一目标后;"; + if (!player.storage.twfeifu) str += ""; + if (player.storage.twfeifu) str += ''; + str += "阳:当你使用【杀】指定唯一目标后;"; + if (player.storage.twfeifu) str += ""; + str += "目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。"; + return str; + }, + twfengpo(player) { + if (player.storage.twfengpo) return "当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的红色牌数)。"; + return "①当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的♦数)。②当你杀死一名角色后,你将〖凤魄①〗中的“♦数”改为“红色牌数”。"; + }, + twjiexun(player) { + return lib.translate[player.hasSkill("funan_jiexun") ? "twjiexunx_info" : "twjiexun_info"]; + }, + twzhenliang(player) { + if (player.storage.twzhenliang) return '转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。'; + return '转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。'; + }, + twdengjian(player) { + let str = "①其他角色的弃牌阶段结束时,你可以随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。"; + if (player.hasSkill("twdengjian_ban")) str = '' + str + ""; + str += "②你使用“剑法”牌不计入次数限制。"; + return str; + }, + twduwang(player) { + let str = "使命技。"; + if (!player.storage.twduwang_fail) str += "①"; + str += "出牌阶段开始时,你可以选择至多三名有牌的其他角色,摸X张牌(X为选择角色数+1),然后这些角色依次将一张牌当【决斗】对你使用。"; + if (!player.storage.twduwang_fail) + str += `\ + ②当你处于濒死状态时,其他角色不能对你使用【桃】。\ + ③使命:使用【决斗】或成为【决斗】目标的次数之和不小于4(若游戏总人数小于4则改为3)。\ + ④成功:准备阶段,若你于你的上回合完成了〖独往③〗的使命,则你重置〖独往〗并将〖独往〗修改至只保留〖独往①〗的效果,选择一项:⒈获得〖狭勇〗;⒉重置〖延势〗并令其获得历战效果。\ + ⑤失败:当你死亡时,使命失败。`; + return str; + }, + twylyanshi(player) { + return lib.translate[(player.storage.twduwang_ylyanshi ? "twylyanshix" : "twylyanshi") + "_info"]; + }, +}; +export default dynamicTranslates; diff --git a/character/tw/index.js b/character/tw/index.js new file mode 100644 index 000000000..ed0cc96a9 --- /dev/null +++ b/character/tw/index.js @@ -0,0 +1,34 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "tw", + connect: true, + character: { ...characters }, + characterSort: { + tw: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/tw/intro.js b/character/tw/intro.js new file mode 100644 index 000000000..06c739de8 --- /dev/null +++ b/character/tw/intro.js @@ -0,0 +1,55 @@ +const characterIntro = { + yanliang: "颜良(?~200年),字公骥,安平郡堂阳县(今河北省新河县)人。东汉末年河北将领。颜良性格促狭,虽骁勇不可独任,为一夫之勇。官渡之战,袁绍令颜良进攻白马(今河南滑县)。曹操采用军师荀攸“声东击西、轻兵掩袭”之计,大败袁军,颜良本人也被关羽亲自斩杀死,白马之围遂解。据说颜之推是其后人。", + wenchou: "文丑(?~200年),东汉末年河北将领。文丑为一夫之勇。建安五年(200年),带领左将军刘备进驻延津,误中曹操军师荀攸的“饵敌”之计,其麾下“五六千骑”惨败于“不满六百”的曹军骑兵。文丑本人也死于乱军之中,葬于河南省禹州市。", + yuantan: "袁谭(?-205年),字显思,汝南郡汝阳县,袁绍长子,曾任青州刺史。建安元年(196年),击败田楷、孔融,完全占据青州。袁绍去世后,审配等伪立遗令,拥立袁尚为继承人,袁谭不能继位,心怀愤恨。后袁谭、袁尚二人的矛盾彻底爆发,袁谭联合曹操共同攻打袁尚。建安十年,曹操兴兵进攻南皮,袁谭奋力抵抗,终于在曹操急攻之下战败,为曹纯麾下虎豹骑所杀。", + yuzhenzi: "评书三国中的人物,其人有徒弟兼义子童渊、徒弟并州李彦,有徒孙常山赵子龙、北地枪王张绣、张任等人。", + shie: "三国人物,善剑术。桓、灵间,有虎贲王越以剑术称于京师,阿得其法。魏帝曹丕曾从阿学剑术。曹丕在《典论·自叙》中说:“余又学击剑,阅师多矣,四方之法各异,唯京师为善。桓、灵之间,有虎贲王越善斯术,称於京师。河南史阿言昔与越游,具得其法,余从阿学精熟。尝与平虏将军刘勋、奋威将军邓展等共饮,宿闻展善有手臂,晓五兵,又称其能空手入白刃。余与论剑良久,谓将军非法也,余顾尝好之,又得善术,因求与余对。", + shitao: "石韬,字广元,即石广元,颍川(今河南禹州)人,仕魏,官拜典农校尉、郡守。初平年间,石韬与徐庶一同来到荆州,在荆州时与诸葛亮和庞统等人相善。与崔州平(名钧)、孟公威(名建)、徐元直(名庶)为“诸葛四友”。", + xiahousone: "夏侯子萼,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为在貂蝉不在时血婆娑的实际首领。在海外服中,设定为夏侯惇的养女,继承了夏侯紫萼的血婆娑,之后“夏侯紫萼”这个名字就被隐匿于历史之中,而“夏侯子萼”则成为了血婆娑的首领“血蔷薇”的固定名号。", + zhangwei: "张葳,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为被夏侯子萼救下后加入的血婆娑成员。在海外服中,设定为张奂的养女,张奂为宦官迫害时与其失散,为神秘女子所救并学得武艺,后与夏侯紫萼一起建立血婆娑。在李儒分成时为了保护百姓而牺牲。", + nashime: "难升米(なしめ,或なんしょうまい)是倭国大夫。景初二年六月,受女王卑弥呼之命,与都市牛利出使魏国,被魏国拜为率善中郎将。", + jiachong: "贾充(217年—282年),字公闾,平阳襄陵(今山西襄汾)人,三国曹魏至西晋时期大臣,曹魏豫州刺史贾逵之子。西晋王朝的开国元勋。出身平阳贾氏。曾参与镇压淮南二叛和弑杀魏帝曹髦,因此深得司马氏信任,其女儿贾褒(一名荃)及贾南风分别嫁予司马炎弟司马攸及次子司马衷,与司马氏结为姻亲,地位显赫。晋朝建立后,转任车骑将军、散骑常侍、尚书仆射,后升任司空、太尉等要职。更封鲁郡公。咸宁末,为使持节、假黄钺、大都督征讨吴国。吴国平定后,增邑八千户。太康三年(282年),贾充去世。西晋朝廷追赠他为太宰,礼官议谥曰荒,司马炎不采纳,改谥为武。有集五卷。", + duosidawang: "朵思大王是《三国演义》中人物,南蛮秃龙洞的元帅,孟获弟弟孟优的朋友,据说是南蛮第一智者。", + wuban: "吴班,字元雄,生卒年不详,兖州陈留郡(治今河南省开封市)人。三国时期蜀汉将领。为领军,随刘备参加伐吴之战,后又随蜀汉丞相诸葛亮参加北伐曹魏的战争,并于公元231年(建兴九年)的北伐中大破司马懿。官至骠骑将军,封绵竹侯。吴班以豪爽侠义著称于当时,又因族妹吴氏是蜀汉穆皇后,在蜀汉将领中有较高的地位。", + yuejiu: "乐就(?-197),在袁术为攻徐州而大兴七军之际,以督战官之身份担任联络之役。但是,袁术军不幸战败,其也在寿春被曹操军逮捕并遭到斩首。", + huojun: "霍峻(178年—217年),字仲邈,南郡枝江(今湖北枝江)人,东汉末年刘备麾下名将。其兄霍笃曾在故乡聚部众数百人。后霍笃逝世,刘表以霍峻继承其部曲。208年(建安十三年),刘表病逝,霍峻便率部曲归降刘备,并被任为中郎将。后随刘备入蜀,刘备从葭萌还袭刘璋,留霍峻守葭萌城。张鲁遣将杨帛劝降霍峻,霍峻严词拒绝,杨帛退去。后刘璋将扶禁、向存等率万余人由阆水上,攻围霍峻,城中兵不过数百人,霍峻坚守一年,伺机将其击破。刘备定蜀,嘉霍峻之功,于是分广汉为梓潼郡,以峻为梓潼太守、裨将军。三年后去世,还葬成都。刘备亲率群僚临会吊祭,留宿墓上,当时的人都为他感到荣幸。", + zhangmancheng: "张曼成(?—184年6月),东汉末年黄巾之乱时南阳黄巾军首领,杀郡守褚贡,一度占据宛城数月,后为秦颉所杀。", + caozhao: "曹肇(?-244年),字长思,沛国谯县(今安徽亳州)人。三国时期魏国大臣,大司马曹休之子。容貌俊美,有当世才度,深得魏明帝宠信,官至散骑常侍、屯骑校尉。魏明帝临死,与燕王曹宇等托付后事。不果,以长平侯归第。正始五年(244年)卒,追赠为卫将军。", + wangchang: "王昶(2世纪-259年),字文舒,太原郡晋阳县(今山西太原)人。三国时期曹魏将领,东汉代郡太守王泽之子。出身太原王氏,少有名气,进入曹丕幕府,授太子文学。曹丕即位后,拜散骑侍郎,迁兖州刺史,撰写《治论》、《兵书》,作为朝廷提供施政参考。魏明帝曹叡即位后,升任扬烈将军,封关内侯。齐王曹芳即位,迁徐州刺史,拜征南将军。太傅司马懿掌权后,深得器重,奏请伐吴,在江陵取得重大胜利,升任征南大将军、开府仪同三司,晋爵京陵侯。正元年间(255年),参与平定“淮南三乱”有功,迁骠骑大将军,守司空。甘露四年(259年),去世,赠司徒,谥号为穆。", + puyangxing: "濮阳兴(?-264年),字子元,陈留(治今河南开封)人,三国时期东吴大臣,吴景帝孙休末年至末帝孙皓初年任丞相。孙权时为上虞县令,后升任尚书左曹、五官中郎将、会稽太守。孙休即位,征召为太常卫将军、平军国事,封外黄侯。永安三年(260年),力主建丹杨湖田,事倍功半,百姓大怨。后升任丞相。永安七年(264年),孙休去世,濮阳兴与张布迎立孙皓。担任侍郎,兼任青州牧。同年被万彧谮毁,流放广州,途中被孙皓派人追杀,并夷三族。", + re_caohong: "字子廉,沛国谯(今安徽亳县)人,曹操从弟,曾献马并救护曹操。后多随军征伐,平兖州、征刘表、讨祝臂。曹丕即位时封曹洪为骠骑将军。曹叡即位,拜曹洪为后将军,更封乐城侯,后复拜为骠骑将军。曹洪逝世,追谥曰恭侯。", + jiangji: "蒋济(?—249年5月18日),字子通,楚国平阿(今安徽省怀远县常坟镇孔岗)人。三国后期曹魏名臣,历仕曹操、曹丕、曹睿、曹芳四朝。蒋济在汉末出任九江郡吏、扬州别驾。后被曹操聘为丹杨太守,不久升任丞相府主薄,西曹属,成为曹操的心腹谋士。魏文帝时期,蒋济出任东中郎将,代替曹仁统率大军,后升任尚书。魏明帝时期,蒋济出任中护军,封侯关内,功勋颇多。景初年间担任护军将军、散骑常侍等职。曹芳继位之后,转任领军将军,封昌陵亭侯,又代司马懿为太尉。正始十年(249年),蒋济随司马懿推翻曹爽势力之后,晋封都乡侯,同年卒(一说为蒋济觉得失信于曹爽,不久后自责忧愤而死),谥曰景侯。", + huchuquan: "呼厨泉(生卒年不详),东汉末年、三国时期匈奴单于。南匈奴羌渠单于之子,于夫罗之弟。于夫罗死后继任成为单于,曾数次依附,又反叛东汉。建安七年(公元202年),呼厨泉统领南匈奴诸部作乱平阳,钟繇率诸军围之。河北袁氏将领高干、郭援等前来增援呼厨泉,与钟繇及关中诸将大战于平阳。最终,呼厨泉惨败,从此归降曹操。建安二十一年(216年),呼厨泉被留在了邺城,南匈奴遂被分为五部。", + xiahouen: "夏侯恩是古典小说《三国演义》中的人物,为曹操随身之背剑心腹。曹操有宝剑二口:一名“倚天剑”,一名“青釭剑”。倚天剑镇威,青釭剑杀人。倚天剑曹操自佩之,青釭剑令夏侯恩佩之。那青釭剑削铁如泥,锋利无比。《三国演义》第四十一回《刘玄德携民渡江 赵子龙单骑救主》中描写:当时夏侯恩自恃勇力,背着曹操,只顾引人抢夺掳掠。不想撞着赵云,被他一枪刺死。青釭剑自此归赵云所有。", + xiahoushang: "夏侯尚(?~226年),字伯仁,沛国谯郡(今安徽省亳州市)人。三国时期曹魏将领,征西将军夏侯渊的堂侄。曹操平定冀州,以为军司马、五官将文学,迁黄门侍郎,随曹彰远征乌桓,得胜归来。与魏文帝曹丕亲近友好,以为征南将军,领荆州刺史,假节、都督南方诸军事,攻拔蜀国上庸,平定三郡九县,升为征南大将军;江陵击败吴将诸葛瑾,升为荆州牧,封昌陵乡侯。黄初七年(226年),去世,谥号为悼,其子夏侯玄继嗣。正始四年,配享魏武帝曹操庙庭。", + zhangnan: "张南(?-公元222年),字文进。三国时期蜀汉将领。刘备攻伐吴国时,张南担任前部。后刘备被陆逊击败,张南兵败战死。", + fengxí: "冯习(?—222年),字休元,南郡(治今湖北省荆州市公安县)人。三国时期蜀汉将领。随刘备入川,并于刘备攻伐孙吴时担任领军,后在猇亭被吴将陆逊击败,兵败战死。", + liwei: "李遗,生卒年不详,三国时期蜀汉名臣李恢之子,关羽女儿关银屏之夫。正史鲜有其生平记载,多见于关银屏的民间传说,其名在民间传说中被传为“李蔚”,因为遗为多音字且民间传说为口头相传并不知道具体字形之故,当以史书《三国志》作李遗为正。死后夫妇二人合葬于俞元县(今云南澄江)关三小姐墓。其父去世后,继承了汉兴亭候的爵位。", + baoxin: "鲍信(151年-192年),泰山平阳(今山东新泰)人。东汉末年济北相,讨伐董卓的诸路人马之一。鲍信受何进征召在外募兵,回到洛阳时适逢董卓进京,鲍信劝袁绍除掉董卓,袁绍不同意。后袁绍、曹操等人起兵对抗董卓,鲍信也起兵响应。后联盟破裂,鲍信劝戒曹操静观其变。青州黄巾军进攻兖州,刺史刘岱不听鲍信所劝贸然出战,兵败战死。鲍信便把曹操迎立为兖州牧。在与黄巾军交战期间,鲍信为救曹操不幸战死,曹操后来追记功绩,赐封其子。", + bingyuan: "邴原(生卒年不详),字根矩,北海朱虚(今山东临朐东)人。东汉末年名士、大臣。邴原家贫、早孤。初为北海相孔融所举。曹操为司空时,任邴原为东阁祭酒。建安十五年(210年),邴原担任丞相征事,后又代凉茂为五官将长史,闭门自守,非公事不出。随曹操征吴,于途中去世。", + jianshuo: "蹇硕(?—189年),东汉末宦官。中平五年(188年),蹇硕为上军校尉,汉灵帝以蹇硕壮健而有武略,对其特别信任,并以其为西园军元帅,领导袁绍、曹操等八校尉,以监督司隶校尉以下诸官。蹇硕虽然握有兵权,但对何进非常畏忌,曾和宦官们一起说服灵帝派遣何进西击边章、韩遂。中平六年(189年),灵帝在病重时将刘协托给蹇硕。灵帝去世后,蹇硕想先杀何进再立刘协为天子,但因手下司马潘隐与何进有旧对何进使眼色而失败。刘辩继承帝位后,蹇硕与中常侍赵忠、郭胜等写信欲合谋除去何进兄弟,因郭胜与何进为同郡且何进及何皇后发迹亦有其功劳于是亲信何氏便怂恿赵忠等人不听蹇硕之计,且将蹇硕的书信告知何进,何进于是便派黄门将之诛杀,其部下士兵亦被何进所领。", + liufuren: "刘夫人,东汉末年军阀袁绍的后妻,袁谭与袁尚的母亲。袁绍的二子中,袁谭年长而贤惠,袁尚年幼相貌美好。袁绍的后妻刘夫人有宠,她偏爱少子袁尚而讨厌长子袁谭,多次称赞袁尚的才能,袁绍也为三子的容貌感到惊奇,想要作为继承人,于是让袁谭做哥哥的后代,出外任青州刺史,后导致二子相争。。", + niufudongxie: "牛辅,东汉末年武将,东汉相国董卓的女婿。董翓,牛辅之妻,董卓之女。牛辅曾任中郎将,征讨白波军,不能取胜。董卓被杀时,牛辅别屯于陕地。吕布派李肃前去征讨牛辅,被牛辅击败。后来,牛辅营中有士兵半夜背叛出逃,造成内乱,牛辅以为整营皆叛,于是带着金银珠宝,独与亲信胡赤儿等五六人逾城北渡河。赤儿等人以绳索系在牛辅腰间将其从城头放下,但赤儿等因为谋财而在离地面数丈高的地方就松开了绳子使得牛辅重重摔在地上腰部受伤,而后赤儿与诸胡人将牛辅斩首,将其首级送去长安。", + tw_zhangji: "张既(?—223年),字德容,冯翊高陵(今陕西西安市高陵区)人。汉末三国时期曹魏名臣。举秀才出身,授新丰县令,治绩为三辅第一。河东之战时,劝说马腾参与讨伐高干、张晟叛乱。迁京兆尹,抚民兴政,联合夏侯渊平宋建,定临洮,取狄道,安郡民,迁徙氐人。张鲁投降后,建议曹操迁徙汉中百姓充实三辅,辅助曹洪击败吴兰。魏国建立后,拜尚书。黄初二年(221年),临危受命,拜雍州刺史,平定诸胡叛乱。迁凉州刺史,封西乡侯。在任期间,降苏衡,邻戴众,修工事,安抚百姓,平定西平郡麹光叛乱。一生以惠政闻名,征辟杨阜、胡遵等人,皆有名位。黄初四年(223年)去世。魏明帝曹叡即位后,追谥肃侯,其子张缉为关内侯。", + qiaorui: "桥蕤(?—197年),东汉末年袁术部下将领,为袁术开拓地盘立下了一定战功。曹操进攻袁术时,担任迎击军的先锋。在寿春与曹操军大战,被夏侯惇杀死。据正史记载,他曾经被袁术任命为大将军。", + weixu: "魏续,东汉末年吕布帐下名将。与吕布有亲,吕布将高顺兵归续管。汉献帝建安三年(198年),曹操率军攻吕布,围之三月。魏续与侯成、宋宪缚陈宫,降曹。吕布被迫降,被缢杀在白门楼。", + yanxiang: "阎象,东汉末期人物,袁术的主簿。献帝兴平二年(195),手执玉玺的袁术要称帝时,问于部下,只有阎象引用周文王虽拥有三分之二的天下还向殷称臣的故事进行劝谏。却未被采纳。", + yufuluo: "东汉时匈奴单于。亦称於夫罗、栾提于夫罗、于扶罗。羌渠单于子,右贤王。前赵刘渊之祖。于东汉中平年间带兵来到中原协助东汉政府镇压起义,赶上本国叛乱,其父被杀,于是留在中原,与白波军联合,在太原、河东等地劫掠。汉末军阀混战之际,于夫罗先后与袁绍、张杨、袁术等人联合,两次与曹操交战,均被击败。后来,于夫罗去世,其弟呼厨泉继任成为单于,其子刘豹被立为左贤王。", + sp_xunchen: "荀谌,字友若,荀彧之兄(一说荀彧之弟),荀绲之子,颍川人。曾任军阀袁绍的幕僚。帮助袁绍游说韩馥,夺取了冀州。", + sp_xujing: "许靖(?—222年),字文休。汝南郡平舆县(今河南省平舆县)人。汉末至三国蜀汉时期重臣、名士、评论家。许靖因与从弟许邵俱以品评人物而闻名于世。后被刘翊推举为孝廉,任尚书郎。曾先后投奔孔伷、陈祎、许贡、王朗等人,于孙策攻王朗前与家属俱避难交州,受到交趾太守士燮礼待。其后受益州牧刘璋邀请,相继为巴郡、广汉、蜀郡太守。于刘备包围成都时欲越墙叛逃,为刘璋所获。刘备定蜀后欲将其弃用,在法正的建议下方以其为左将军长史。建安二十三年(218年),刘备称汉中王,任命许靖为汉中王傅。章武元年(221年),刘备称帝,任命许靖为司徒,位列三公。章武二年(222年),去世。有文集二卷。", + sp_zongyu: "宗预(?-264年),字德艳 ,荆州南阳郡安众县(今河南省南阳市)人。三国时期蜀汉官员、将领。曾随张飞入蜀助平益州,又受辟为丞相诸葛亮手下主簿,升任参军、右中郎将。诸葛亮逝世后,宗预受命出使孙吴,得到孙权的赞赏。迁后将军,出督永安,又升任征西大将军,并受封关内侯。公元258年(景耀元年),因病回成都,受任镇军大将军。蜀汉灭亡后,宗预随后主刘禅徙往洛阳,在中途病逝。宗预为人坦率耿直,多次出使孙吴并深得孙权的敬重,为吴、汉两国同盟的巩固作出了一定的贡献。", + sp_chendong: "陈武,东吴将领,孙策攻打刘繇,陈武前来相助,孙策非常喜爱陈武,拜为校尉,使作先锋。陈武以十数骑兵力杀敌五十余人。后于赤壁等战役屡立功勋。董袭献上严虎的人头来降孙策。赤壁之战,董袭受周瑜命,分兵去汉阳,合肥会战时接应太史慈,逍遥津支援孙权。濡须口之战时,董袭在船上督战,船覆董袭坚守殉职。", + xia_wangyue: "王越,东汉末年游侠(生卒年不详),乃辽东燕山人士,擅使剑术, 三国时期史阿的师父,曹丕的师公,官职虎贲将军。在史书《典论》中略有记载。", + liyàn: '李彦,号称"并州第一戟",是童渊的师兄。早年间两人在玉真子门下一起习武,后成年出师开枝散叶。同为并州人的吕布在得知李彦的名声后,投入其门下学习武艺。', + re_fazheng: "字孝直,本为刘璋部下,刘备围成都时劝说刘璋投降,而后又与刘备进取汉中,献计将曹操大将夏侯渊斩首。法正善奇谋,深受刘备信任和敬重。", + xin_guyong: "为蔡邕之徒。其为人少言语,不饮酒,严厉正大,被张纮推荐仕于孙权。孙权任命他为会稽郡丞,行太守事,后不断升迁,官至吴国丞相。顾雍为官,多进良言,有功于吴。", + zhaoe: "赵娥,东汉酒泉郡禄福县(即肃州)人。丈夫庞子夏,表氏县(今高台县)人。庞子夏去世后,赵娥在禄福县抚养其子庞淯。她的父亲被李寿杀死。灵帝光和二年(公元179年)二月上旬的一天早晨,赵娥在都亭前与李寿相遇,她奋力挥刀杀死了李寿,随后到了都亭尊长的面前认罪伏法。后来,凉州刺史周洪、酒泉太守刘班等人共同上表朝廷,禀奏赵娥的烈义行为,刻石立碑显其赵家门户。黄门侍郎梁宽还著书追述赵娥的事迹,为其作传。西晋政治家傅玄为其作《秦女休行》诗,加以赞美。", + xiahouzie: "夏侯紫萼,游卡桌游《三国杀阵面对决》中虚构的人物。幼年因天天帮病种的母亲采紫萼得其名。亲眼目睹母亲被宦官所杀,愤怒之下夺过佩剑斩下宦官的头颅。被神秘人所救,发现了自己的身世,决心与宦官争斗到底。后再闯荡江湖的过程中,与夏侯惇义结金兰,以夏侯家姓氏称呼。", + yangang: "严纲(163~191年),东汉末年公孙瓒部下的冀州刺史。汉献帝初平二年(191年),袁绍与公孙瓒在界桥交战,严纲为袁绍部下麹义所斩。", + gongsunfan: "公孙范,辽西令支(今河北迁安)人。东汉末年武将,公孙瓒从弟,官至勃海太守。公孙瓒起兵攻打袁绍之时,袁绍畏惧公孙瓒的势力,将自己的勃海太守印绶给予公孙范,意图和解,结果公孙范反而起勃海之兵帮助公孙瓒。初平二年(191年),公孙范以勃海兵助公孙瓒率二万人大破青、徐黄巾军。最后于界桥之战与公孙瓒一同败走。", + zhangzhao: + "张昭(156年-236年),字子布。徐州彭城县(今江苏省徐州市)人。汉末三国时期孙吴政权重臣。东汉末年,张昭为避战乱而南渡至扬州。孙策创业时,任命其为长史、抚军中郎将,将文武之事都委任于张昭。孙策临终前,将其弟孙权托付给张昭,张昭率群僚辅立孙权,并安抚百姓、讨伐叛军,与周瑜等辅助孙权稳定局势。孙权每次出征,常留张昭镇守后方,领幕府事,并敬称他为“张公”。赤壁之战时,张昭鉴于曹操势大,持主降论,从而被排挤出军政决策中心。孙权代理车骑将军时,任命张昭为军师。孙权被封为吴王后,任绥远将军,封由拳侯。此后曾参与撰定朝仪。孙权两次要设立丞相时,众人都推举张昭,孙权以张昭敢于直谏、性格刚直为由而不用他,先后用孙邵、顾雍。黄龙元年(229年),孙权称帝,张昭以年老多病为由,上还官位及所统领部属,改拜辅吴将军、班亚三司,改封娄侯。晚年时一度不参与政事,在家著书,即使偶有参加朝议,也常与孙权产生激烈冲突。嘉禾五年(236年),张昭去世,享年八十一岁,谥号“文”。张昭容貌严正,敢于直言谏诤,一生以忠于孙氏基业为任,但因其与孙权在个性、军政策略等方面的深层矛盾,使其以“入宫则拜孤,出宫则拜君”的地位,却终身不得任丞相。著有《春秋左氏传解》及《论语注》,今皆佚失。", + zhanghong: "张纮(153年~212年),字子纲,徐州广陵(江苏省扬州市广陵区人)人。东汉末年文学家、官员,和张昭一起合称“二张”。曾被大将军何进、太尉朱儁、司空荀爽辟为掾属,皆不就,避难江东。孙策平定江东前,亲自多次登门邀请,张纮出仕为官。孙权即位时,建议孙权迁都秣陵。建安十七年(212年),病逝,时年六十岁,孙权为之流涕。", +}; + +export default characterIntro; diff --git a/character/tw/perfectPairs.js b/character/tw/perfectPairs.js new file mode 100644 index 000000000..5e62102cc --- /dev/null +++ b/character/tw/perfectPairs.js @@ -0,0 +1,4 @@ +export default { + tw_liufuren: ["yuanshao"], + tw_xiahoushang: ["caopi"], +}; diff --git a/character/tw/pinyin.js b/character/tw/pinyin.js new file mode 100644 index 000000000..979fb4428 --- /dev/null +++ b/character/tw/pinyin.js @@ -0,0 +1,5 @@ +const pinyins = { + 凯撒: ["Caesar"], + 难升米: ["Nashime"], +}; +export default pinyins; diff --git a/character/tw/skill.js b/character/tw/skill.js new file mode 100644 index 000000000..b8397d9ef --- /dev/null +++ b/character/tw/skill.js @@ -0,0 +1,17130 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //颜良文丑,但是颜良+文丑 + twduwang: { + audio: 3, + dutySkill: true, + derivation: ["twxiayong", "twylyanshix"], + global: "twduwang_global", + group: ["twduwang_effect", "twduwang_achieve", "twduwang_fail"], + onremove: ["twduwang", "twduwang_fail"], + subSkill: { + effect: { + audio: "twduwang1.mp3", + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(target => { + return ( + target != player && + target.hasCard(card => { + if (get.position(card) == "h") return true; + return target.canUse(get.autoViewAs({ name: "juedou" }, [card]), player, false); + }, "he") + ); + }); + }, + async cost(event, trigger, player) { + let { result } = await player + .chooseTarget([1, 3], (_, player, target) => { + return ( + target != player && + target.hasCard(card => { + if (get.position(card) == "h") return true; + return target.canUse(get.autoViewAs({ name: "juedou" }, [card]), player, false); + }, "he") + ); + }) + .set("prompt", get.prompt("twduwang")) + .set("ai", target => { + const player = get.event("player"); + const num = game.countPlayer(current => { + return ( + current != player && + current.hasCard(card => { + if (get.position(card) == "h") return true; + return current.canUse(get.autoViewAs({ name: "juedou" }, [card]), player, false); + }, "he") && + get.effect(current, { name: "guohe_copy2" }, current, player) + get.effect(player, { name: "juedou" }, current, player) > 0 + ); + }); + return (Math.min(num, 3) + 1) * get.effect(player, { name: "draw" }, player, player) + get.effect(target, { name: "guohe_copy2" }, target, player) + get.effect(player, { name: "juedou" }, target, player); + }) + .set("prompt2", "选择至多三名其他角色并摸选择角色数+1的牌,然后这些角色须将一张牌当作【决斗】对你使用"); + if (result.bool) result.targets.sortBySeat(); + event.result = result; + }, + async content(event, trigger, player) { + const targets = event.targets; + await player.draw(targets.length + 1); + await game.asyncDelayx(); + for (const target of targets) { + if ( + !target.hasCard(card => { + return target.canUse(get.autoViewAs({ name: "juedou" }, [card]), player, false); + }, "he") + ) + continue; + await target + .chooseToUse() + .set("forced", true) + .set("openskilldialog", "独往:将一张牌当作【决斗】对" + get.translation(player) + "使用") + .set("norestore", true) + .set("_backupevent", "twduwang_backup") + .set("targetRequired", true) + .set("complexSelect", true) + .set("custom", { + add: {}, + replace: { window: function () {} }, + }) + .backup("twduwang_backup") + .set("filterTarget", function (card, player, target) { + if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player) + .set("addCount", false); + await game.asyncDelayx(); + } + }, + }, + backup: { + viewAs: { name: "juedou" }, + position: "he", + filterCard(card, player) { + const cardx = get.autoViewAs({ name: "juedou" }, [card]); + return lib.filter.targetEnabledx(cardx, player, get.event("sourcex")); + }, + check(card) { + if (get.name(card) == "sha") return 5 - get.value(card); + return 8 - get.value(card); + }, + precontent() { + delete event.result.skill; + }, + }, + achieve: { + audio: "twduwang2.mp3", + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + if (player.storage.twduwang_fail) return false; + const history = player.actionHistory; + if (history.length < 2) return false; + for (let i = history.length - 2; i >= 0; i--) { + if (history[i].isMe && !history[i].isSkipped) { + let num = history[i].useCard.filter(evt => { + return evt.card.name == "juedou"; + }).length, + targets = game.players.slice().concat(game.dead.slice()); + for (const target of targets) { + num += target.actionHistory[i].useCard.filter(evt => { + return evt.card.name == "juedou" && evt.targets && evt.targets.includes(player); + }).length; + } + return num >= (targets.length < 4 ? 3 : 4); + } + } + return false; + }, + forced: true, + skillAnimation: true, + animationColor: "metal", + async content(event, trigger, player) { + player.awakenSkill("twduwang"); + game.log(player, "完成使命"); + if (player.awakenedSkills.includes("twduwang")) { + player.restoreSkill("twduwang"); + game.log(player, "重置了技能", "#g【独往】"); + } + if (!player.storage.twduwang_fail) { + player.storage.twduwang_fail = true; + game.log(player, "修改了技能", "#g【独往】"); + } + let result, + bool1 = player.hasSkill("twxiayong", null, false, false), + bool2 = !player.awakenedSkills.includes("twylyanshi") && player.storage.twduwang_ylyanshi; + if (bool1 && bool2) result = { index: 2 }; + else if (bool1) result = { index: 1 }; + else if (bool2) result = { index: 0 }; + else + result = await player + .chooseControl() + .set("choiceList", ["获得〖狭勇〗", "重置〖延势〗并为其添加历战效果"]) + .set("prompt", "独往:请选择一项") + .set("ai", () => { + const player = get.event("player"), + num = game.countPlayer(current => { + return ( + current != player && + current.hasCard(card => { + if (get.position(card) == "h") return true; + return current.canUse(get.autoViewAs({ name: "juedou" }, [card]), player, false); + }, "he") && + get.effect(current, { name: "guohe_copy2" }, current, player) / 2.5 + get.effect(player, { name: "juedou" }, current, player) > 0 + ); + }); + return num >= 2 ? 0 : 1; + }) + .forResult(); + if (result.index == 0) await player.addSkills("twxiayong"); + if (result.index == 1) { + player.popup("twylyanshi"); + if (player.awakenedSkills.includes("twylyanshi")) { + player.restoreSkill("twylyanshi"); + game.log(player, "重置了技能", "#g【延势】"); + } + if (!player.storage.twduwang_ylyanshi) { + player.storage.twduwang_ylyanshi = true; + game.log(player, "修改了技能", "#g【延势】"); + } + } + }, + }, + fail: { + audio: "twduwang3.mp3", + trigger: { player: "die" }, + forceDie: true, + filter(event, player) { + return !player.storage.twduwang_fail; + }, + forced: true, + content() { + player.awakenSkill("twduwang"); + game.log(player, "使命失败"); + }, + }, + global: { + mod: { + cardSavable(card, player, target) { + if (card.name == "tao" && target != player && target.hasSkill("twduwang") && !target.storage.twduwang_fail) return false; + }, + }, + audio: "twduwang3.mp3", + trigger: { player: "dying" }, + filter(event, player) { + return player.hasSkill("twduwang") && !player.storage.twduwang_fail; + }, + forced: true, + content() {}, + }, + }, + }, + twylyanshi: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter(event, player) { + return ["juedou", "binglinchengxiax"].concat(get.zhinangs()).some(name => { + const info = { name: name }; + return ( + get.info(info) && + player.hasCard(card => { + return get.name(card) == "sha" && event.filterCard({ name: name, cards: [card] }, player, event); + }, "hs") + ); + }); + }, + limited: true, + skillAnimation: true, + animationColor: "fire", + onremove: ["twylyanshi", "twduwang_ylyanshi"], + chooseButton: { + dialog(event, player) { + const list = ["juedou", "binglinchengxiax"] + .concat(get.zhinangs()) + .filter(name => { + const info = { name: name }; + return ( + get.info(info) && + player.hasCard(card => { + return get.name(card) == "sha" && event.filterCard({ name: name, cards: [card] }, player, event); + }, "hs") + ); + }) + .map(name => [get.translation(get.type(name)), "", name]); + return ui.create.dialog("延势", [list, "vcard"]); + }, + check(button) { + return get.event("player").getUseValue({ name: button.link[2] }); + }, + backup(links, player) { + return { + audio: "twylyanshi", + filterCard(card, player) { + return get.name(card) == "sha"; + }, + popname: true, + check(card) { + return 5 - get.value(card); + }, + position: "hs", + viewAs: { name: links[0][2] }, + precontent() { + delete event.result.skill; + player.logSkill("twylyanshi"); + player.awakenSkill("twylyanshi"); + if (player.storage.twduwang_ylyanshi) { + player.when({ global: "phaseEnd" }).then(() => { + if (player.awakenedSkills.includes("twylyanshi")) { + player.popup("历战"); + player.restoreSkill("twylyanshi"); + game.log(player, "触发了", "#g【延势】", "的", "#y历战", "效果"); + } + }); + } + }, + }; + }, + prompt(links, player) { + return "将一张【杀】当作" + "【" + get.translation(links[0][2]) + "】使用"; + }, + }, + subSkill: { backup: {} }, + hiddenCard(player, name) { + if (player.awakenedSkills.includes("twylyanshi") || !player.countCards("hs", card => _status.connectMode || get.name(card) == "sha")) return false; + return ["juedou", "binglinchengxiax"].concat(get.zhinangs()).includes(name); + }, + ai: { + order(item, player) { + if (!player || _status.event.type != "phase") return 0.001; + let max = 0, + names = ["juedou", "binglinchengxiax"].concat(get.zhinangs()).filter(name => { + const info = { name: name }; + return ( + get.info(info) && + player.hasCard(card => { + return get.name(card) == "sha" && player.hasValueTarget(get.autoViewAs(info, [card]), true, true); + }, "hs") + ); + }); + if (!names.length) return 0; + names = names.map(namex => { + return { name: namex }; + }); + names.forEach(card => { + if (player.getUseValue(card) > 0) { + let temp = get.order(card); + if (temp > max) max = temp; + } + }); + if (max > 0) max += 0.3; + return max; + }, + result: { player: 1 }, + }, + }, + twjuexing: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(target => get.info("twjuexing").filterTarget(null, player, target)); + }, + filterTarget(_, player, target) { + const card = new lib.element.VCard({ name: "juedou" }); + return target != player && player.canUse(card, target); + }, + usable: 1, + onremove: "twjuexing_lizhan", + async content(event, trigger, player) { + player.when({ global: "phaseEnd" }).then(() => { + player.popup("历战"); + player.addSkill("twjuexing_lizhan"); + player.addMark("twjuexing_lizhan", 1, false); + game.log(player, "触发了", "#g【绝行】", "的", "#y历战", "效果"); + }); + const target = event.target; + const card = new lib.element.VCard({ name: "juedou" }); + player.addTempSkill("twjuexing_effect"); + player + .when({ global: "useCardAfter" }) + .filter(evtx => evtx.getParent() == event) + .then(() => { + let list = []; + var targets = [player].concat(trigger.targets); + for (const i of targets) { + if (i.isIn() && i.hasCard(card => card.hasGaintag("twjuexing"), "h")) { + list.push([i, i.getCards("h", card => card.hasGaintag("twjuexing"))]); + } + } + if (list.length) { + game.loseAsync({ lose_list: list }).setContent("discardMultiple"); + } + }) + .then(() => { + let listx = []; + var targets = [player].concat(trigger.targets); + for (const i of targets) { + if (i.isIn() && i.getExpansions("twjuexing_buff").length) { + listx.push([i, i.getExpansions("twjuexing_buff")]); + } + } + if (listx.length) { + game.loseAsync({ gain_list: listx, animate: "draw" }).setContent("gaincardMultiple"); + } + }) + .then(() => { + var targets = [player].concat(trigger.targets); + targets.forEach(current => { + current.removeSkill("twjuexing_buff"); + }); + game.delay(); + }); + await player.useCard(card, target, false); + }, + ai: { + order: 1, + result: { + target(player, target) { + return get.sgn(get.attitude(player, target)) * get.effect(target, { name: "juedou" }, player, player) * ((player.getHp() + 1) / (target.getHp() + 1)); + }, + }, + }, + subSkill: { + effect: { + trigger: { global: "useCardToBegin" }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + return event.getParent(2).name === "twjuexing"; + }, + async content(event, trigger, player) { + const target = trigger.target; + player.addSkill("twjuexing_buff"); + target.addSkill("twjuexing_buff"); + let list = []; + for (const i of [player, target]) { + if (i.isIn() && i.countCards("h")) { + list.push([i, i.getCards("h")]); + } + } + if (list.length) { + await game + .loseAsync({ + lose_list: list, + log: true, + animate: "giveAuto", + gaintag: ["twjuexing_buff"], + }) + .setContent(get.info("sbquhu").addToExpansionMultiple); + } + if (player.getHp() > 0) await player.draw(player.getHp(), target.getHp() > 0 ? "nodelay" : "").set("gaintag", ["twjuexing"]); + if (target.getHp() > 0) await target.draw(target.getHp()).set("gaintag", ["twjuexing"]); + await game.asyncDelay(); + }, + }, + lizhan: { + charlotte: true, + onremove: true, + marktext: "战", + intro: { content: "因【绝行】摸牌时,摸牌数+#" }, + trigger: { player: "drawBegin" }, + filter(event, player) { + if (!player.hasMark("twjuexing_lizhan")) return false; + return (event.gaintag || []).includes("twjuexing"); + }, + forced: true, + popup: false, + content() { + player.popup("历战"); + game.log(player, "触发了", "#g【绝行】", "的", "#y历战", "效果"); + trigger.num += player.countMark("twjuexing_lizhan"); + }, + }, + buff: { + charlotte: true, + onremove(player, skill) { + const cards = player.getExpansions(skill); + if (cards.length) player.gain(cards, "gain2"); + }, + intro: { + markcount: "expansion", + mark(dialog, _, player) { + var cards = player.getExpansions("twjuexing_buff"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + }, + }, + }, + }, + twxiayong: { + audio: 2, + audioname: ["tw_yanliang"], + locked: true, + group: "twxiayong_effect", + subSkill: { + effect: { + trigger: { global: "damageBegin1" }, + filter(event, player) { + if (event.getParent().type != "card" || event.card.name != "juedou" || !event.player.isIn()) return false; + const evt = game.getGlobalHistory("useCard", evt => evt.card == event.card)[0]; + if (evt && evt.targets && (event.player != player || player.countCards("h"))) { + if (evt.player == player) { + return evt.targets.includes(event.player) && event.player != player; + } + return evt.targets.includes(player) && evt.player != player; + } + return false; + }, + forced: true, + popup: false, + async content(event, trigger, player) { + await player.logSkill("twxiayong" + (trigger.player === player ? "1" : "2"), trigger.player); + if (trigger.player === player) { + const cards = player.getCards("h", card => { + return lib.filter.cardDiscardable(card, player, "twxiayong"); + }); + if (cards.length > 0) player.discard(cards.randomGet()); + } else { + trigger.increase("num"); + } + }, + }, + }, + }, + twxiayong1: { + audio: true, + audioname: ["tw_yanliang"], + sourceSkill: "twxiayong", + }, + twxiayong2: { + inherit: "twxiayong1", + }, + //袁谭 + twqiaosi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return get.info("twqiaosi").getCards(player).length; + }, + check(event, player) { + const cards = get.info("twqiaosi").getCards(player); + if (cards.reduce((sum, card) => sum + get.value(card), 0)) return false; + if (cards.length >= player.getHp() || cards.some(card => get.name(card, player) == "tao" || get.name(card, player) == "jiu")) return true; + return player.getHp() > 2 && cards.length > 1; + }, + prompt2(event, player) { + const cards = get.info("twqiaosi").getCards(player); + let str = "获得" + get.translation(cards); + if (cards.length < player.getHp()) str += ",然后你失去1点体力"; + return str; + }, + async content(event, trigger, player) { + const cards = get.info("twqiaosi").getCards(player); + await player.gain(cards, "gain2"); + if (cards.length < player.getHp()) await player.loseHp(); + }, + getCards(player) { + let cards = [], + targets = game.players.slice().concat(game.dead.slice()); + for (const target of targets) { + if (target == player) continue; + const history = target.getHistory("lose", evt => evt.position == ui.discardPile); + if (history.length) { + for (const evt of history) cards.addArray(evt.cards2.filterInD("d")); + } + } + const historyx = game.getGlobalHistory("cardMove", evt => { + if (evt.name != "cardsDiscard") return false; + const evtx = evt.getParent(); + if (evtx.name != "orderingDiscard") return false; + const evt2 = evtx.relatedEvent || evtx.getParent(); + const current = evt2.player; + if (evt2.name == "phaseJudge" || current == player) return false; + return current.hasHistory("lose", evtx3 => { + const evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evt2 != evtx4) return false; + return evtx3.getl(current).cards2.length > 0; + }); + }); + if (historyx.length) { + for (const evtx of historyx) cards.addArray(evtx.cards.filterInD("d")); + } + return cards; + }, + }, + twbaizu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player.isDamaged() && + player.countCards("h") && + game.hasPlayer(target => { + return target != player && target.countCards("h"); + }) && + player.getHp() + player.countMark("twbaizu_lizhan") + ); + }, + locked: true, + async cost(event, trigger, player) { + const sum = player.getHp() + player.countMark("twbaizu_lizhan"), + filterTarget = (_, player, target) => { + return target != player && target.countCards("h"); + }; + let targets = game.filterPlayer(target => filterTarget(null, player, target)); + if (targets.length > sum) { + targets = await player + .chooseTarget("请选择【败族】的目标", "令你和这些角色同时弃置一张手牌,然后你对与你弃置牌类别相同的其他角色各造成1点伤害", filterTarget, sum, true) + .set("ai", target => { + const player = get.event("player"); + return get.effect(target, { name: "guohe_copy2" }, target, player) + get.damageEffect(target, player, player); + }) + .forResultTargets(); + } + event.result = { bool: true, targets }; + }, + async content(event, trigger, player) { + const targets = event.targets.slice().sortBySeat(); + player.line(targets); + let list = [player].concat(targets).filter(target => target.countDiscardableCards(target, "h")); + if (list.length) { + let discards = []; + const { result } = await player + .chooseCardOL( + list, + "败族:请弃置一张手牌", + (card, player) => { + return lib.filter.cardDiscardable(card, player); + }, + true + ) + .set("ai", get.unuseful); + if (result) { + for (let i = 0; i < result.length; i++) { + discards.push([list[i], result[i].cards]); + } + await game.loseAsync({ lose_list: discards }).setContent("discardMultiple"); + list = list.filter(i => get.type2(result[0].cards[0]) == get.type2(result[list.indexOf(i)].cards[0])); + if (list.length) { + for (const i of list) { + if (i === player) continue; + player.line(i); + await i.damage(); + } + } + } + } + player.when({ global: "phaseEnd" }).then(() => { + player.popup("历战"); + player.addMark("twbaizu_lizhan", 1, false); + game.log(player, "触发了", "#g【败族】", "的", "#y历战", "效果"); + }); + }, + subSkill: { + lizhan: { + charlotte: true, + onremove: true, + marktext: "战", + intro: { content: "【败族】目标选择数+#" }, + }, + }, + }, + //玉真子 + twhuajing: { + audio: 2, + getSkills(player) { + return player + .getCards("e", card => get.subtype(card) == "equip1") + .reduce((list, card) => { + const info = get.info(card); + if (info && info.skills) return list.addArray(info.skills); + return list; + }, []); + }, + trigger: { global: "phaseBefore", player: "enterGame" }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + locked: false, + async content(event, trigger, player) { + const skills = lib.skill.twhuajing.derivation; + for (const eff of skills) { + player.addMark(eff, 1); + player.unmarkSkill(eff); + } + player.markSkill("twhuajing"); + }, + global: "twhuajing_global", + group: "twhuajing_use", + derivation: ["twhuajing_jian", "twhuajing_dao", "twhuajing_fu", "twhuajing_qiang", "twhuajing_ji", "twhuajing_gong"], + marktext: "武", + intro: { + markcount(storage, player) { + return lib.skill.twhuajing.derivation.filter(skill => player.hasMark(skill)).length; + }, + content(storage, player) { + const skills = lib.skill.twhuajing.derivation.filter(skill => player.hasMark(skill)); + if (!skills.length) return "功力已消耗殆尽"; + let str = "当前武功:"; + for (const eff of skills) { + str += "
  • "; + str += lib.translate[eff]; + str += ":"; + str += lib.translate[eff + "_info"]; + } + return str; + }, + }, + subSkill: { + global: { + mod: { + attackRange(player, num) { + const skills = lib.skill.twhuajing.derivation.filter(skill => player.hasMark(skill) || player.hasSkill(skill)); + if (skills.length) return num + skills.length * game.countPlayer(target => target.hasSkill("twhuajing")); + }, + }, + }, + use: { + audio: "twhuajing", + enable: "phaseUse", + filter(event, player) { + return lib.skill.twhuajing.derivation.some(skill => player.hasMark(skill)); + }, + filterCard: true, + selectCard: [1, 4], + position: "h", + complexCard: true, + discard: false, + lose: false, + delay: false, + check(card) { + const player = get.event("player"), + skills = lib.skill.twhuajing.derivation.filter(skill => player.hasMark(skill)); + if (ui.selected.cards.some(cardx => get.suit(cardx, player) == get.suit(card, player))) return 0; + return skills.length - ui.selected.cards.length; + }, + usable: 1, + prompt: "展示至多四张手牌,然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果", + async content(event, trigger, player) { + await player.showCards(event.cards, get.translation(player) + "发动了【化境】"); + const skills = lib.skill.twhuajing.derivation.filter(skill => player.hasMark(skill)); + const gainSkills = skills.randomGets(Math.min(skills.length, event.cards.reduce((list, cardx) => list.add(get.suit(cardx, player)), []).length)); + for (const eff of gainSkills) player.popup(eff); + player.addTempSkill(gainSkills); + player.addTempSkill("twhuajing_blocker"); + player.getHistory("custom").push({ twhuajing_skills: gainSkills }); + }, + ai: { + order: 12, + result: { + player(player) { + return player.countCards("hs", card => { + return get.name(card) == "sha" && player.hasValueTarget(card, false, true); + }); + }, + }, + }, + }, + jian: { + charlotte: true, + mark: true, + marktext: "剑", + intro: { + name: "化境·剑", + name2: "剑", + markcount: () => 0, + content: () => lib.translate.twhuajing_jian_info, + }, + nopop: true, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return event.card.name == "sha" && event.target.countCards("he"); + }, + forced: true, + logTarget: "target", + async content(event, trigger, player) { + const target = trigger.target; + const cards = target.getDiscardableCards(player, "he"); + target.discard(cards.randomGets(Math.min(2, cards.length))).discarder = player; + }, + }, + dao: { + charlotte: true, + mark: true, + marktext: "刀", + intro: { + name: "化境·刀", + name2: "刀", + markcount: () => 0, + content: () => lib.translate.twhuajing_dao_info, + }, + nopop: true, + inherit: "guding_skill", + equipSkill: false, + }, + fu: { + charlotte: true, + mark: true, + marktext: "斧", + intro: { + name: "化境·斧", + name2: "斧", + markcount: () => 0, + content: () => lib.translate.twhuajing_fu_info, + }, + nopop: true, + trigger: { player: "shaMiss" }, + forced: true, + logTarget: "target", + async content(event, trigger, player) { + trigger.target.damage(); + }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (!arg || !arg.card || arg.card.name != "sha" || !arg.baseDamage || arg.baseDamage <= 1) return false; + return true; + }, + }, + }, + qiang: { + charlotte: true, + mark: true, + marktext: "枪", + intro: { + name: "化境·枪", + name2: "枪", + markcount: () => 0, + content: () => lib.translate.twhuajing_qiang_info, + }, + nopop: true, + trigger: { player: "useCardAfter" }, + filter(event, player) { + return event.card.name == "sha" && get.color(event.card) == "black"; + }, + forced: true, + async content(event, trigger, player) { + const card = get.cardPile(card => card.name == "shan"); + if (card) player.gain(card, "gain2"); + }, + }, + ji: { + charlotte: true, + mark: true, + marktext: "戟", + intro: { + name: "化境·戟", + name2: "戟", + markcount: () => 0, + content: () => lib.translate.twhuajing_ji_info, + }, + nopop: true, + trigger: { source: "damageBegin3" }, + filter(event, player) { + return event.card && event.card.name == "sha"; + }, + forced: true, + async content(event, trigger, player) { + player.draw(trigger.num); + }, + }, + gong: { + charlotte: true, + mark: true, + marktext: "弓", + intro: { + name: "化境·弓", + name2: "弓", + markcount: () => 0, + content: () => lib.translate.twhuajing_gong_info, + }, + nopop: true, + trigger: { source: "damageSource" }, + filter(event, player) { + return event.card && event.card.name == "sha" && event.player.countDiscardableCards(player, "e"); + }, + forced: true, + logTarget: "player", + async content(event, trigger, player) { + trigger.player.discard(trigger.player.getDiscardableCards(player, "e").randomGets(1)).discarder = player; + }, + }, + blocker: { + charlotte: true, + init(player, skill) { + player.disableSkill(skill, lib.skill.twhuajing.getSkills(player)); + }, + onremove(player, skill) { + player.enableSkill(skill); + }, + mod: { + attackRange(player, num) { + return num - player.getEquipRange(); + }, + }, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter", "phaseBefore"], + }, + filter(event, player) { + if (event.name == "phase") return true; + if (event.name == "equip" && event.player == player && get.subtype(event.card) == "equip1") return true; + const evt = event.getl(player); + return evt && evt.player == player && evt.es && evt.es.some(card => get.subtype(card) == "equip1"); + }, + forced: true, + popup: false, + firstDo: true, + async content(event, trigger, player) { + player.enableSkill("twhuajing_blocker"); + player.disableSkill("twhuajing_blocker", lib.skill.twhuajing.getSkills(player)); + }, + ai: { unequip_equip1: true }, + }, + }, + }, + twtianshou: { + audio: 2, + trigger: { player: "phaseEnd" }, + filter(event, player) { + return ( + player.getHistory("sourceDamage", evt => { + return evt.card && evt.card.name == "sha"; + }).length && + player + .getHistory("custom", evt => { + return evt.twhuajing_skills; + }) + .reduce((list, evt) => list.addArray(evt.twhuajing_skills), []) + .some(skill => player.hasMark(skill)) + ); + }, + forced: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(lib.filter.notMe, true) + .set("prompt", "天授:令一名其他角色获得1枚“武”并获得此标记的效果") + .set("ai", target => { + const player = get.event("player"), + att = get.attitude(player, target); + const card = new lib.element.VCard({ name: "sha" }); + if (att > 0) + return ( + game.countPlayer(aim => { + return target.canUse(card, target) && get.effect(aim, card, target, player) > 0 && get.effect(aim, card, target, target) > 0; + }) + 10 + ); + if (att == 0) return 1.5 + Math.random(); + return 0.1 + Math.random(); + }); + if (bool) { + const target = targets[0]; + const skills = player + .getHistory("custom", evt => { + return evt.twhuajing_skills; + }) + .reduce((list, evt) => list.addArray(evt.twhuajing_skills), []) + .filter(skill => player.hasMark(skill)); + let choiceList = skills.map(i => { + return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + "
    " + get.skillInfoTranslation(i, player) + "
    "; + }); + const { + result: { control }, + } = await player + .chooseControl(skills) + .set("prompt", "选择令" + get.translation(target) + "获得的“武”") + .set("choiceList", choiceList) + .set("displayIndex", false) + .set("ai", () => get.event("controls").randomGet()); + if (control) { + player.removeMark(control, 1); + player.markSkill("twhuajing"); + player.popup(control, "metal"); + target.addTempSkill(control, { player: "phaseAfter" }); + target.addTempSkill("twhuajing_blocker", { player: "phaseAfter" }); + target.getHistory("custom").push({ twhuajing_skills: [control] }); + await player.draw(2); + } + } + }, + ai: { combo: "twhuajing" }, + }, + //史阿 + twdengjian: { + audio: 2, + trigger: { global: "phaseDiscardEnd" }, + filter(event, player) { + if (player.hasSkill("twdengjian_ban")) return false; + return event.player != player && lib.skill.twdengjian.getCards(player, event.player).length; + }, + getCards(player, target) { + let cards = target + .getHistory("useCard", evt => { + return ( + evt.cards && + evt.cards.filterInD("d").some(card => get.name(card, false) == "sha") && + target.getHistory("sourceDamage", evtx => { + return evtx.card && evtx.card == evt.card; + }).length + ); + }) + .reduce((list, evt) => list.addArray(evt.cards.filterInD("d").filter(card => get.name(card, false) == "sha")), []); + if (cards.length) { + const history = player.actionHistory; + for (let i = history.length - 1; i >= 0; i--) { + for (let evt of history[i].gain) { + if (evt.getParent().name == "twdengjian") { + const card = evt.cards[0]; + cards = cards.filter(cardx => get.color(cardx) != get.color(card)); + if (!cards.length) break; + } + } + if (history[i].isRound) break; + } + } + return cards; + }, + //direct:true, + frequent: true, + async content(event, trigger, player) { + const cards = lib.skill.twdengjian.getCards(player, trigger.player); + /*const {result:{bool}}=await player.chooseToDiscard(get.prompt('twdengjian'),'he') + .set('prompt2','弃置一张牌并随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】') + .set('ai',card=>7-get.value(card)) + .set('logSkill','twdengjian'); + if(bool) */ await player.gain(cards.randomGet(), "gain2").gaintag.add("twdengjianx"); + }, + group: "twdengjian_buff", + subSkill: { + ban: { charlotte: true }, + buff: { + mod: { + aiOrder(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("twdengjianx")) return num + 0.1; + }, + }, + audio: "twdengjian", + trigger: { player: "useCard1" }, + filter(event, player) { + return ( + event.cards && + event.cards.length == 1 && + player.getHistory("lose", evt => { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twdengjianx")) return true; + } + return false; + }).length && + event.addCount !== false + ); + }, + forced: true, + locked: false, + async content(event, trigger, player) { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) player.stat[player.stat.length - 1].card.sha--; + game.log(trigger.card, "不计入次数限制"); + }, + }, + }, + }, + twdengjianx: {}, + twxinshou: { + audio: 2, + trigger: { player: "useCard" }, + filter(event, player) { + if (event.card.name != "sha") return false; + const goon = + !player.getHistory("useCard", evt => { + return evt != event && evt.card.name == "sha" && get.color(evt.card) == get.color(event.card); + }).length && player.isPhaseUsing(); + if (!player.hasSkill("twxinshou_0")) return goon; + if (!player.hasSkill("twxinshou_1")) return goon && game.hasPlayer(target => target != player); + return ( + !player.hasSkill("twdengjian_ban") && + game.hasPlayer(target => { + if (target == player) return false; + return !target.hasSkill("twdengjian", null, null, false); + }) && + player.hasSkill("twdengjian", null, null, false) + ); + }, + direct: true, + async content(event, trigger, player) { + if (player.hasSkill("twxinshou_0") && player.hasSkill("twxinshou_1")) { + const { + result: { bool, targets }, + } = await player + .chooseTarget((card, player, target) => { + return target != player && !target.hasSkill("twdengjian", null, null, false); + }) + .set("ai", target => { + const player = get.event("player"); + if (get.attitude(player, target) > 0) { + if (target.isTurnedOver()) return 0; + const card = new lib.element.VCard({ name: "sha" }); + if ( + game.hasPlayer(aim => { + return target.canUse(card, target) && get.effect(aim, card, target, player) > 0 && get.effect(aim, card, target, target) > 0; + }) + ) + return target.countCards("h") - 3; + return 0; + } + return 0; + }) + .set("prompt", get.prompt("twxinshou")) + .set("prompt2", "令【登剑】失效并令一名其他角色获得【登剑】,你的下个回合开始时,其失去【登剑】,若其这期间使用【杀】造成过伤害,则你结束【登剑】的失效状态"); + if (bool) { + const target = targets[0]; + player.logSkill("twxinshou", target); + player.addSkill("twdengjian_ban"); + target.addAdditionalSkills("twxinshou_" + player.playerid, "twdengjian"); + player.popup("登剑"); + target.popup("登剑"); + game.log(player, "将", "#g【登剑】", "传授给了", target); + game.log(player, "的", "#g【登剑】", "被失效了"); + player + .when("phaseBegin") + .then(() => { + target.removeAdditionalSkills("twxinshou_" + player.playerid); + }) + .then(() => { + const history = game.getAllGlobalHistory("everything"); + for (let i = history.length - 1; i >= 0; i--) { + const evt = history[i]; + if (evt.name == "damage" && evt.card && evt.source && evt.card.name == "sha" && evt.source == target) { + player.popup("洗具"); + player.removeSkill("twdengjian_ban"); + game.log(player, "结束了", "#g【登剑】", "的失效状态"); + return; + } + if (evt == evtx) break; + } + player.popup("杯具"); + player.chat("剑法废掉了..."); + }) + .vars({ target: target, evtx: event }); + } + } else { + let choice = [], + choiceList = ["摸一张牌", "交给一名其他角色一张牌"]; + if (!player.hasSkill("twxinshou_0")) choice.push("摸牌"); + else choiceList[0] = '' + choiceList[0] + ""; + if (!player.hasSkill("twxinshou_1") && game.hasPlayer(target => target != player)) choice.push("给牌"); + else choiceList[1] = '' + choiceList[1] + ""; + const { + result: { control }, + } = await player + .chooseControl(choice, "cancel2") + .set("prompt", get.prompt("twxinshou")) + .set("choiceList", choiceList) + .set("ai", () => { + if (get.event("controls").includes("摸牌")) return "摸牌"; + const player = get.event("player"); + return game.hasPlayer(target => { + if (target == player) return false; + if (player.countCards("he", card => card.name == "du") && get.attitude(player, target) <= 0) return true; + if (player.countCards("he", card => get.value(card, player) < 0 && get.attitude(player, target) * get.value(card, target) > 0)) return true; + return get.attitude(player, target) > 0; + }) && get.event("controls").includes("给牌") + ? "给牌" + : "cancel2"; + }); + if (control == "cancel2") return; + player.logSkill("twxinshou"); + if (control == "摸牌") { + player.addTempSkill("twxinshou_0"); + await player.draw(); + } + if (control == "给牌") { + player.addTempSkill("twxinshou_1"); + const { + result: { bool, targets }, + } = await player.chooseTarget("交给一名其他角色一张牌", lib.filter.notMe, true).set("ai", target => { + const player = get.event("player"), + att = get.attitude(player, target); + if (player.countCards("he", card => card.name == "du")) return -att; + let cards = player.getCards("he", card => get.value(card, player) < 0); + if (cards.length) { + cards.sort((a, b) => get.value(a, player) - get.value(b, player)); + return get.value(cards[0], target) * att; + } + return att; + }); + if (bool) { + const target = targets[0]; + player.line(target); + await player.chooseToGive(target, "he", true); + } + } + } + }, + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, + }, + }, + //石韬 + twjieqiu: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(target => lib.skill.twjieqiu.filterTarget(null, player, target)); + }, + filterTarget(card, player, target) { + return target != player && !target.hasDisabledSlot(); + }, + usable: 1, + async content(event, trigger, player) { + const target = event.target, + num = target.countCards("e"); + let disables = []; + for (let i = 1; i <= 5; i++) { + for (let j = 0; j < target.countEnabledSlot(i); j++) { + disables.push(i); + } + } + target.disableEquip(disables); + if (num) await target.draw(num); + target.addSkill("twjieqiu_buff"); + target.markAuto("twjieqiu_buff", [player]); + target + .when("enableEquipEnd") + .filter((e, p) => !p.hasDisabledSlot()) + .then(() => player.removeSkill("twjieqiu_buff")); + }, + ai: { + order: 7, + result: { + target(player, target) { + return -target.countCards("e") - (get.attitude(player, target) < 0 ? 1 : 0); + }, + }, + }, + subSkill: { + used: { charlotte: true }, + buff: { + charlotte: true, + onremove: true, + trigger: { player: "phaseDiscardEnd" }, + filter(event, player) { + return player.hasDisabledSlot() && event.cards && event.cards.length; + }, + forced: true, + popup: false, + async content(event, trigger, player) { + const num = trigger.cards.length; + let list = [], + map = {}; + for (let i = 1; i < 6; i++) { + map[get.translation("equip" + i)] = "equip" + i; + if (player.hasDisabledSlot(i)) { + for (let j = 0; j < player.countDisabledSlot(i); j++) { + list.push("equip" + i); + } + } + } + let result; + const transList = list.map(i => get.translation(i)); + if (transList.length <= num) result = { bool: true, links: transList }; + else + result = await player + .chooseButton(["劫囚:请选择你要恢复的装备栏", [transList, "tdnodes"]], Math.min(transList.length, num), true) + .set("map", map) + .set("ai", button => ["equip5", "equip4", "equip1", "equip3", "equip2"].indexOf(get.event("map")[button.link]) + 2) + .forResult(); + if (result.bool) await player.enableEquip(result.links.slice().map(i => map[i])); + }, + group: ["twjieqiu_end"], + }, + end: { + charlotte: true, + trigger: { player: "phaseEnd" }, + filter(event, player) { + return ( + player.hasDisabledSlot() && + player.getStorage("twjieqiu_buff").some(target => { + return target.isIn() && !target.hasSkill("twjieqiu_used"); + }) + ); + }, + forced: true, + popup: false, + async content(event, trigger, player) { + const targets = player + .getStorage("twjieqiu_buff") + .filter(target => { + return target.isIn() && !target.hasSkill("twjieqiu_used"); + }) + .sortBySeat(); + for (const target of targets) { + target.popup("劫囚"); + target.addTempSkill("twjieqiu_used", "roundStart"); + target.insertPhase(); + } + }, + }, + }, + }, + twenchou: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(current => lib.skill.twenchou.filterTarget(null, player, current)); + }, + position: "he", + filterTarget(card, player, target) { + return target != player && target.countCards("h") && target.hasDisabledSlot(); + }, + usable: 1, + async content(event, trigger, player) { + const target = event.target; + await player.gainPlayerCard(target, "h", true, "visible"); + let list = [], + map = {}; + for (let i = 1; i < 6; i++) { + map[get.translation("equip" + i)] = "equip" + i; + if (target.hasDisabledSlot(i)) { + list.push("equip" + i); + } + } + let result; + const transList = list.map(i => get.translation(i)); + if (transList.length == 1) result = { bool: true, links: transList }; + else + result = await player + .chooseButton(["恩仇:请选择" + get.translation(target) + "要恢复的装备栏", [transList, "tdnodes"]], true) + .set("map", map) + .set("ai", button => 1 / (["equip5", "equip4", "equip1", "equip3", "equip2"].indexOf(get.event("map")[button.link]) + 2)) + .forResult(); + if (result.bool) await target.enableEquip(result.links.slice().map(i => map[i])); + }, + ai: { + order: 9, + result: { target: -1 }, + }, + }, + //侠关羽 + twzhongyi: { + mod: { + targetInRange(card) { + if (card.name == "sha") return true; + }, + }, + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + if (event.card.name != "sha") return false; + return player.getHistory("sourceDamage", evt => evt.card && evt.card == event.card).length; + }, + forced: true, + async content(event, trigger, player) { + //const num=player.getHistory('sourceDamage',evt=>evt.card&&evt.card==trigger.card).reduce((sum,evt)=>sum+evt.num,0); + const num = game.countPlayer2(target => { + return target.hasHistory("damage", evt => { + return evt.card && evt.card == trigger.card; + }); + }); + const num2 = 1 + player.getAllHistory("custom", evt => evt.twzhongyi).length; + let choice = ["摸牌"], + choiceList = ["摸" + get.cnNumber(num) + "张牌"]; + if (player.isDamaged()) { + choice.addArray(["回血", "背水!"]); + choiceList.addArray(["回复" + num + "点体力", "失去" + num2 + "点体力,依次执行以上所有项"]); + } + const { + result: { control }, + } = await player + .chooseControl(choice) + .set("prompt", "忠义:请选择一项") + .set("choiceList", choiceList) + .set("ai", () => { + const player = get.event("player"); + const num = get.event("num"), + num2 = get.event("num2"); + if (player.isHealthy()) return "摸牌"; + return player.hp + player.countCards("hs", card => player.canSaveCard(card, player)) - num2 > 0 && num > num2 ? "背水!" : "回血"; + }) + .set("num", num) + .set("num2", num2); + if (control != "cancel2") { + if (control == "背水!") { + await player.loseHp(num2); + player.getHistory("custom").push({ twzhongyi: true }); + } + if (control != "回血") await player.draw(num); + if (control != "摸牌") await player.recover(num); + } + }, + }, + twchue: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter(event, player) { + return event.card.name == "sha" && event.isFirstTarget && event.targets.length == 1 && game.hasPlayer(target => !event.targets.includes(target) && player.canUse(event.card, target)); + }, + prompt2: "失去1点体力,额外指定至多等同于你体力值的目标", + check(event, player) { + return player.hp + player.countCards("hs", card => player.canSaveCard(card, player)) - 1 > 0; + }, + async content(event, trigger, player) { + await player.loseHp(); + const targetx = trigger.targets.slice(), + num = player.getHp(); + if (!num) return; + const { + result: { bool, targets }, + } = await player + .chooseTarget("额外指定至多" + get.cnNumber(num) + "名目标", [1, num], (card, player, target) => { + const trigger = _status.event.getTrigger(); + return !trigger.targets.includes(target) && player.canUse(trigger.card, target); + }) + .set("ai", target => { + const player = get.event("player"), + trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, player, player); + }); + if (!bool) return; + player.line(targets); + trigger.targets.addArray(targets); + }, + group: ["twchue_gain", "twchue_effect"], + marktext: "勇", + intro: { + name: "勇", + content: "mark", + }, + subSkill: { + gain: { + audio: "twchue", + trigger: { player: ["damageEnd", "loseHpEnd"] }, + forced: true, + locked: false, + async content(event, trigger, player) { + await player.draw(); + player.addMark("twchue", 1); + }, + }, + effect: { + audio: "twchue", + trigger: { global: "phaseEnd" }, + filter(event, player) { + const card = new lib.element.VCard({ name: "sha" }); + return ( + player.hasUseTarget(card) && + /*player.getHistory('useSkill',evt=>{ + return evt.skill=='twchue_gain'; + }).length&&player.getHp()&&*/ player.countMark("twchue") >= player.getHp() + ); + }, + check(event, player) { + return player.hasValueTarget(new lib.element.VCard({ name: "sha" })); + }, + prompt2(event, player) { + const num = player.getHp(); + return "失去" + num + "个“勇”标记,视为使用一张造成的伤害+1且可以额外指定" + num + "个目标的【杀】"; + }, + async content(event, trigger, player) { + const num = player.getHp(); + player.removeMark("twchue", num); + const card = new lib.element.VCard({ name: "sha" }); + player + .when("useCard2") + .filter(evt => evt.getParent(2) == event && game.hasPlayer(target => !evt.targets.includes(target) && player.canUse(evt.card, target))) + .assign({ + firstDo: true, + }) + .then(() => { + trigger.baseDamage++; + player + .chooseTarget("额外指定至多" + get.cnNumber(num) + "名目标", [1, num], (card, player, target) => { + const trigger = _status.event.getTrigger(); + return !trigger.targets.includes(target) && player.canUse(trigger.card, target); + }) + .set("ai", target => { + const player = get.event("player"), + trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, player, player); + }); + }) + .then(() => { + if (result.bool) { + const targets = result.targets; + player.line(targets); + trigger.targets.addArray(targets); + } + }) + .vars({ num: num }); + player.chooseUseTarget("视为使用造成的伤害+1且可以额外指定" + num + "个目标的【杀】", card, false, true); + }, + }, + }, + }, + //夏侯惇 + twdanlie: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer(target => player.canCompare(target)); + }, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + usable: 1, + selectTarget: [1, 3], + multitarget: true, + multiline: true, + group: "twdanlie_add", + content: function () { + "step 0"; + player.chooseToCompare(targets).setContent("chooseToCompareMeanwhile"); + "step 1"; + if (result.winner && result.winner == player) { + player.line(targets); + targets.forEach(target => target.damage()); + } else player.loseHp(); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if (player.getHp() > 2) return -get.damageEffect(target, player, player) - 10 / target.countCards("h"); + var hs = player.getCards("h").sort((a, b) => b.number - a.number); + var ts = target.getCards("h").sort((a, b) => b.number - a.number); + if (!hs.length || !ts.length) return 0; + if (Math.min(13, hs[0].number + player.getDamagedHp()) > ts[0].number) return -get.damageEffect(target, player, player); + return 0; + }, + }, + }, + subSkill: { + add: { + audio: "twdanlie", + trigger: { player: "compare", target: "compare" }, + filter: function (event, player) { + if (!player.isDamaged()) return false; + if (player != event.target && event.iwhile) return false; + return true; + }, + forced: true, + locked: false, + content: function () { + var num = player.getDamagedHp(); + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += num; + if (trigger.num2 > 13) trigger.num2 = 13; + } + game.log(player, "的拼点牌点数+", num); + }, + }, + }, + }, + //张葳 + twhuzhong: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + return event.card.name == "sha" && !game.hasNature(event.card, "linked") && event.targets.length == 1 && player.isPhaseUsing() && (game.hasPlayer(target => !event.targets.includes(target) && player.canUse(event.card, target)) || event.target.countCards("h") > 0); + }, + direct: true, + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + var list = ["cancel2"]; + var choiceList = ["令此【杀】可以额外指定一个目标", "弃置" + get.translation(target) + "一张手牌,若此【杀】造成伤害,则你摸一张牌且本阶段可以额外使用一张【杀】"]; + if (target.countCards("h")) list.unshift("其弃置"); + else choiceList[1] = '' + choiceList[1] + ""; + if (game.hasPlayer(targetx => !trigger.targets.includes(targetx) && player.canUse(trigger.card, targetx))) list.unshift("多指"); + else choiceList[0] = '' + choiceList[0] + ""; + player + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", () => { + var controls = _status.event.controls; + var trigger = _status.event.getTrigger(); + var player = trigger.player; + var target = trigger.target; + if (controls.includes("其弃置") && _status.event.goon) return "其弃置"; + if (controls.includes("多指")) { + if (game.hasPlayer(targetx => !trigger.targets.includes(targetx) && player.canUse(trigger.card, targetx) && get.effect(targetx, trigger.card, player, player) > 0)) return "你弃置"; + } + return "cancel2"; + }) + .set( + "goon", + (function () { + var d1 = true; + if (player.hasSkill("jueqing") || player.hasSkill("gangzhi")) d1 = false; + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) || + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: trigger.card, + }, + true + ) + ) { + if (!target.hasSkill("gangzhi")) d1 = false; + if ( + !target.hasSkillTag("filterDamage", null, { + player: player, + card: trigger.card, + }) && + get.attitude(player, target) < 0 + ) + return true; + } + if (d1) return get.damageEffect(player, player, player) > 0; + return false; + })() + ) + .set("prompt", "护众:是否摸一张牌并执行其中一项?"); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("twhuzhong", target); + player.draw(); + if (result.control == "其弃置") { + player.discardPlayerCard(target, "h", true); + player + .when("useCardAfter") + .filter(evt => evt == trigger.getParent()) + .then(() => { + if (player.getHistory("sourceDamage", evt => evt.card == trigger.card).length) { + player.draw(); + player.addTempSkill("twhuzhong_sha", "phaseUseAfter"); + player.addMark("twhuzhong_sha", 1, false); + } + }); + event.finish(); + } + } else event.finish(); + "step 2"; + player + .chooseTarget("请选择" + get.translation(trigger.card) + "的额外目标", function (card, player, target) { + var trigger = _status.event.getTrigger(); + return !trigger.targets.includes(target) && player.canUse(trigger.card, target); + }) + .set("ai", function (target) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, player, player); + }); + "step 3"; + if (result.bool) { + player.line(result.targets); + trigger.getParent().targets.addArray(result.targets); + game.log(result.targets, "成为了", trigger.card, "的额外目标"); + } + }, + subSkill: { + sha: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("twhuzhong_sha"); + }, + }, + }, + }, + }, + twfenwang: { + audio: 2, + trigger: { source: "damageBegin2", player: "damageBegin4" }, + filter: function (event, player, name) { + if (name == "damageBegin2") { + return !event.hasNature() && player.countCards("h") >= event.player.countCards("h"); + } + return event.hasNature(); + }, + forced: true, + content: function () { + "step 0"; + if (event.triggername == "damageBegin2") { + player.line(trigger.player); + trigger.num++; + event.finish(); + } else + player.chooseToDiscard("h", "弃置一张手牌,或令此伤害+1").set("ai", function (card) { + return 8 - get.value(card); + }); + "step 1"; + if (!result.bool) trigger.num++; + }, + }, + //夏侯子萼 + //差点和夏侯紫萼搞混 + twchengxi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer(target => lib.skill.twchengxi.filterTarget(null, player, target)); + }, + filterTarget: function (card, player, target) { + if (player.getStorage("twchengxi_used").includes(target) || target == player) return false; + return !player.hasSkillTag("noCompareSource") && target.countCards("h") > 0 && !target.hasSkillTag("noCompareTarget"); + }, + content: function () { + "step 0"; + if (!player.storage.twchengxi_used) { + player.when("phaseUseAfter").then(() => delete player.storage.twchengxi_used); + } + player.markAuto("twchengxi_used", [target]); + player.draw(); + "step 1"; + if (player.canCompare(target)) player.chooseToCompare(target); + else event.finish(); + "step 2"; + if (result.bool) { + player.addSkill("twchengxi_effect"); + } else { + var card = { name: "sha", isCard: true }; + if (target.canUse(card, player, false)) target.useCard(card, player, false); + } + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if (player.hasSkill("twchengxi_effect")) return 0; + var hs = player.getCards("h").sort((a, b) => b.number - a.number); + var ts = target.getCards("h").sort((a, b) => b.number - a.number); + if (!hs.length || !ts.length) return 0; + if (hs[0].number > ts[0].number) return -3; + if (!target.canUse({ name: "sha", isCard: true }, player, false)) return -1; + return 0; + }, + }, + }, + subSkill: { + effect: { + charlotte: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return get.type(event.card) == "basic" || get.type(event.card) == "trick"; + }, + forced: true, + popup: false, + content: function () { + player.removeSkill("twchengxi_effect"); + player + .when("useCardAfter") + .filter(evt => evt == trigger) + .then(() => { + if (trigger.targets) { + var card = { + name: trigger.card.name, + isCard: true, + }; + var targets = trigger.targets.filter(i => i.isIn() && player.canUse(card, i, false)); + if (targets.length) player.useCard(card, targets, false); + } + }); + }, + mark: true, + marktext: "袭", + intro: { + content: "使用的下一张基本牌或非延时锦囊牌结算完毕后视为对相同目标再使用一张无次数限制的同名牌", + }, + }, + }, + }, + //侠刘备 + twshenyi: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (!event.player.isIn()) return false; + if (event.player.getHistory("damage").indexOf(event) != 0) return false; + return event.player == player || player.inRange(event.player); + }, + usable: 1, + direct: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + var list = get.inpileVCardList(info => { + return ["basic", "trick", "delay"].includes(info[0]) && !player.getStorage("twshenyi").includes(info[2]); + }); + var dialog = [`###${get.prompt("twshenyi", trigger.player)}###
    从牌堆中将一张牌作为“侠义”置于武将牌上${player != trigger.player && player.countCards("h") ? ",然后将任意张手牌交给其" : ""}
    `, [list, "vcard"]]; + var result = yield player.chooseButton(dialog).set("ai", function (button) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player, + name = button.link[2]; + if (!get.cardPile2(card => card.name == name)) return 0; + var value = get.value({ name: name }); + if (["tao", "jiu", "caochuan", "wuxie"].includes(name) && get.event().getRand() > 0.4) return value * 2; + return value; + }); + if (result.bool) { + var name = result.links[0][2], + nature = result.links[0][3]; + var cardx = { name: name, nature: nature }; + player.logSkill("twshenyi", trigger.player); + player.popup(cardx); + player.markAuto("twshenyi", [name]); + game.log(player, "声明了", `#y${get.translation(cardx)}`); + var card = get.cardPile2(card => get.name(card, false) == name && get.nature(card, false) == nature); + if (card) player.addToExpansion([card], "gain2").gaintag.add("twshenyi"); + else { + var card = get.cardPile2(card => get.type2(card) == get.type2(name)); + if (card) player.addToExpansion([card], "gain2").gaintag.add("twshenyi"); + else player.chat("无牌可得?!"); + } + if (trigger.player != player && player.countCards("h")) { + game.delayex(); + var skill = "twshenyi_" + player.playerid; + game.broadcastAll(lib.skill.twshenyi.createGainTag, skill, player.name); + game.addVideo("skill", player, ["twshenyi", [skill, player.name]]); + var result2 = yield player + .chooseCard("伸义:是否将任意张牌交给" + get.translation(trigger.player) + "?", [1, player.countCards("h")]) + .set("ai", card => { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }) + .set("goon", get.attitude(player, trigger.player) > 0); + if (result2.bool) { + player.give(result2.cards, trigger.player).gaintag.add(skill); + player.addSkill("twshenyi_draw"); + } + } + } else player.storage.counttrigger.twshenyi--; + }, + video: (player, info) => lib.skill.twshenyi.createGainTag(info[0], info[1]), + createGainTag: function (skill, name) { + if (!lib.skill[skill]) { + lib.skill[skill] = { charlotte: true }; + lib.translate[skill] = "义·" + get.translation(name); + } + if (!_status.postReconnect.twshenyi) { + _status.postReconnect.twshenyi = [lib.skill.twshenyi.createGainTag, [], []]; + } + _status.postReconnect.twshenyi[1].add(skill); + _status.postReconnect.twshenyi[2].add(name); + }, + marktext: "义", + intro: { + name: "侠义", + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + delete player.storage[skill]; + //var cards=player.getExpansions(skill); + //if(cards.length) player.loseToDiscardpile(cards); + }, + subSkill: { + draw: { + charlotte: true, + audio: "twshenyi", + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + var skill = "twshenyi_" + player.playerid; + return game.hasPlayer(target => { + var evt = event.getl(target); + if (!evt || !evt.hs || !evt.hs.length) return false; + for (let i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes(skill)) return true; + } + return false; + }); + }, + forced: true, + direct: true, + content: function () { + var skill = "twshenyi_" + player.playerid; + var num = 0; + var targets = game.filterPlayer(target => { + var evt = trigger.getl(target); + var numx = 0; + if (!evt || !evt.hs || !evt.hs.length) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes(skill)) numx++; + } + if (numx > 0) return (num += numx); + return false; + }); + if (num > 0) { + player.logSkill("twshenyi_draw", targets); + player.draw(num); + } + }, + }, + }, + }, + twxinghan: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getExpansions("twshenyi").length > game.countPlayer(); + }, + check: function (event, player) { + if (player.hp >= 3 || (player.countCards("h") >= 4 && player.getExpansions("twshenyi").every(card => !player.hasValueTarget(card) || !get.tag(card, "damage") || !lib.skill.xunshi.isXunshi(card)))) return false; + return player.getExpansions("twshenyi").some(card => player.hasValueTarget(card)); + }, + direct: true, + content: function* (event, map) { + var player = map.player; + var result = yield player + .chooseBool() + .set("createDialog", [ + get.prompt("twxinghan"), + `
    按顺序使用以下“侠义”牌。但是回合结束时你须弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)
    `, + player + .getExpansions("twshenyi") + .filter(card => player.hasUseTarget(card)) + .reverse(), + "hidden", + ]) + .set("choice", lib.skill.twxinghan.check(null, player)); + if (!result.bool) { + event.finish(); + return; + } + while (true) { + var cards = player + .getExpansions("twshenyi") + .filter(card => player.hasUseTarget(card)) + .reverse(); + if (!cards.length) break; + yield player.chooseUseTarget(true, cards[0], false); + } + player.when("phaseEnd").then(() => { + if (player.countCards("h")) player.chooseToDiscard(player.countCards("h"), true); + var num = Math.max(1, player.getHp() - 1); + player.loseHp(num); + }); + }, + group: "twxinghan_init", + subSkill: { + init: { + audio: "twxinghan", + trigger: { + player: ["loseEnd", "dying", "phaseBefore", "phaseAfter", "dyingAfter", "die"], + global: ["equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd"], + }, + filter: function (event, player) { + return (player.getExpansions("twshenyi").length && event.name != "die" && (_status.currentPhase != player || player.isDying())) ^ player.hasSkill("twxinghan_in"); + }, + forced: true, + firstDo: true, + silent: true, + forceDie: true, + content: function () { + if (player.getExpansions("twshenyi").length && trigger.name != "die" && (_status.currentPhase != player || player.isDying())) { + var cards = player.getExpansions("twshenyi"); + var cardsx = cards.map(card => { + var cardx = ui.create.card(); + cardx.init(get.cardInfo(card)); + cardx._cardid = card.cardid; + return cardx; + }); + player.directgains(cardsx, null, "twxinghan_tag"); + player.addSkill("twxinghan_in"); + } else player.removeSkill("twxinghan_in"); + }, + }, + in: { + charlotte: true, + audio: "twxinghan", + trigger: { player: "addToExpansionEnd" }, + filter: function (event, player) { + return event.gaintag.includes("twshenyi"); + }, + forced: true, + locked: false, + silent: true, + content: function () { + "step 0"; + var cards2 = player.getCards("s", card => card.hasGaintag("twxinghan_tag")); + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards2, + player + ); + } + cards2.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + "step 1"; + var cards = player.getExpansions("twshenyi"); + var cardsx = cards.map(card => { + var cardx = ui.create.card(); + cardx.init(get.cardInfo(card)); + cardx._cardid = card.cardid; + return cardx; + }); + player.directgains(cardsx, null, "twxinghan_tag"); + }, + onremove: function (player) { + var cards2 = player.getCards("s", card => card.hasGaintag("twxinghan_tag")); + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards2, + player + ); + } + cards2.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + group: "twxinghan_use", + }, + use: { + charlotte: true, + trigger: { player: ["useCardBefore", "respondBefore"] }, + filter: function (event, player) { + var cards = player.getCards("s", card => card.hasGaintag("twxinghan_tag") && card._cardid); + return ( + event.cards && + event.cards.some(card => { + return cards.includes(card); + }) + ); + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + var idList = player.getCards("s", card => card.hasGaintag("twxinghan_tag")).map(i => i._cardid); + var cards = player.getExpansions("twshenyi"); + var cards2 = []; + for (var card of trigger.cards) { + var cardx = cards.find(cardx => cardx.cardid == card._cardid); + if (cardx) cards2.push(cardx); + } + var cards3 = trigger.cards.slice(); + trigger.cards = cards2; + trigger.card.cards = cards2; + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards3, + player + ); + } + cards3.forEach(i => i.delete()); + if (player == game.me) ui.updatehl(); + }, + }, + }, + ai: { + combo: "twshenyi", + }, + }, + //张纮 + twquanqian: { + audio: 2, + sunbenSkill: true, + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("twquanqian_sunben") && player.countCards("h") && game.countPlayer() > 1; + }, + filterCard: function (card, player) { + return !ui.selected.cards.some(cardx => get.suit(cardx, player) == get.suit(card, player)); + }, + selectCard: [1, 4], + check: function (card) { + return 1 / (get.value(card) || 0.5); + }, + position: "h", + complexCard: true, + discard: false, + lose: false, + delay: false, + filterTarget: lib.filter.notMe, + usable: 1, + content: function () { + "step 0"; + player.addSkill("twquanqian_sunben"); + player.give(cards, target); + if (cards.length < 2) event.finish(); + "step 1"; + var card = get.cardPile2(card => get.type(card) == "equip"); + if (card) player.gain(card, "gain2"); + "step 2"; + if (player.countCards("h") >= target.countCards("h")) { + if (target.countCards("h")) event._result = { index: 1 }; + else event.finish(); + } else { + var str = get.translation(target); + player + .chooseControl() + .set("choiceList", ["将手牌数摸至与" + str + "相同", "观看" + str + "的手牌并获得其一种花色的所有手牌"]) + .set("ai", () => { + var player = _status.event.player; + var target = _status.event.target; + if (target.countCards("h") - player.countCards("h") > target.countCards("h") / 4 || get.attitude(player, target) > 0) return 0; + return 1; + }) + .set("target", target); + } + "step 3"; + if (result.index == 0) { + player.drawTo(target.countCards("h")); + event.finish(); + return; + } + var list = []; + var dialog = ["劝迁:获得" + get.translation(target) + "一种花色的所有牌"]; + for (var suit of lib.suit.concat("none")) { + if (target.countCards("h", { suit: suit })) { + dialog.push('
    ' + get.translation(suit + "2") + "牌
    "); + dialog.push(target.getCards("h", { suit: suit })); + list.push(suit); + } + } + if (!list.length) { + event.finish(); + return; + } + player + .chooseControl(list) + .set("dialog", dialog) + .set("ai", () => { + return _status.event.control; + }) + .set( + "control", + (() => { + var getv = cards => cards.map(i => get.value(i)).reduce((p, c) => p + c, 0); + return list.sort((a, b) => { + return getv(target.getCards("h", { suit: b })) - getv(target.getCards("h", { suit: a })); + })[0]; + })() + ); + "step 4"; + if (result.control) player.gain(target.getCards("h", { suit: result.control }), target, "give"); + }, + ai: { + order: 7, + result: { + target: function (player, target) { + return target.countCards("h"); + }, + }, + }, + subSkill: { + sunben: { + charlotte: true, + init: function (player) { + player.storage.twquanqian_sunben = 0; + }, + onremove: true, + mark: true, + intro: { + markcount: function (num) { + return (num || 0).toString(); + }, + content: "弃牌进度:#/6", + }, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + if (event.type != "discard") return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length; + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + "step 0"; + player.addMark("twquanqian_sunben", trigger.getl(player).hs.length, false); + "step 1"; + if (player.countMark("twquanqian_sunben") >= 6) { + player.removeSkill("twquanqian_sunben"); + player.popup("劝迁"); + game.log(player, "恢复了技能", "#g【劝迁】"); + } + }, + }, + }, + }, + twrouke: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.player == player) return false; + return event.getg(player).length > 1; + }, + forced: true, + content: function () { + player.draw(); + }, + }, + //张昭 + twlijian: { + getCards: function (event) { + var cards = []; + game.countPlayer2(function (current) { + current.checkHistory("lose", function (evt) { + if (evt.position == ui.discardPile && evt.getParent("phaseDiscard") == event) cards.addArray(evt.cards); + }); + }); + game.checkGlobalHistory("cardMove", function (evt) { + if (evt.name == "cardsDiscard" && evt.getParent("phaseDiscard") == event) cards.addArray(evt.cards); + }); + return cards.filterInD("d"); + }, + audio: 2, + sunbenSkill: true, + trigger: { global: "phaseDiscardEnd" }, + filter: function (event, player) { + if (player.hasSkill("twlijian_sunben")) return false; + if (event.player != player && event.player.isIn()) { + return lib.skill.twlijian.getCards(event).length; + } + return false; + }, + prompt2: () => "选择任意张本阶段进入弃牌堆的牌令其获得,然后你获得剩余的牌,若其获得的牌数大于你,则你可以对其造成1点伤害", + logTarget: "player", + content: function () { + "step 0"; + player.addSkill("twlijian_sunben"); + var cards = lib.skill.twlijian.getCards(trigger), + target = trigger.player; + event.cards = cards; + event.target = target; + player + .chooseToMove("力荐:请分配" + get.translation(target) + "和你获得的牌", true) + .set("list", [[get.translation(target) + "获得的牌", cards], ["你获得的牌"]]) + .set("processAI", function (list) { + var player = _status.event.player; + var target = _status.event.getTrigger().player; + var att = get.attitude(player, target); + var cards = _status.event.cards; + var cardx = cards.filter(card => card.name == "du"); + var cardy = cards.removeArray(cardx); + switch (get.sgn(att)) { + case 1: + return [cards, []]; + case 0: + return [cardx, cardy]; + case -1: + var num = Math.ceil(cards.length / 2) + (cards.length % 2 == 0 ? 1 : 0); + if (num > 1 && player.hasSkill("twchungang")) num--; + if (get.damageEffect(target, player, player) <= 0 || num > 2 || cardx.length > cardy.length) return [cardx, cardy]; + var num2 = cardy.length - cardx.length; + num2 = Math.ceil(num2 / 2) + (num2 % 2 == 0 ? 1 : 0); + cardy.sort((a, b) => get.value(b) - get.value(a)); + cardx.addArray(cardy.slice(num, cardy.length)); + return [cardx, cardy.slice(0, num)]; + } + }) + .set("cards", cards); + "step 1"; + if (result.bool) { + target.gain(result.moved[0], "gain2"); + player.gain(result.moved[1], "gain2"); + if (result.moved[0].length > result.moved[1].length) { + player.chooseBool("是否对" + get.translation(target) + "造成1点伤害?").set("choice", get.damageEffect(target, player, player) > 0); + } else event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) { + player.line(target); + target.damage(); + } + }, + subSkill: { + sunben: { + charlotte: true, + init: function (player) { + player.storage.twlijian_sunben = 0; + }, + onremove: true, + mark: true, + intro: { + markcount: function (num) { + return (num || 0).toString(); + }, + content: "弃牌堆进入牌进度:#/8", + }, + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + filter: function (event, player) { + var cards = event.getd(); + if (!cards.length) return false; + var list = cards.slice(); + game.checkGlobalHistory( + "cardMove", + function (evt) { + if (evt == event || evt.getParent() == event || (evt.name != "lose" && evt.name != "cardsDiscard")) return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + list.removeArray(evt.cards); + }, + event + ); + return list.length > 0; + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + "step 0"; + var cards = trigger.getd().slice(); + game.checkGlobalHistory( + "cardMove", + function (evt) { + if (evt == trigger || evt.getParent() == trigger || (evt.name != "lose" && evt.name != "cardsDiscard")) return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + cards.removeArray(evt.cards); + }, + trigger + ); + player.addMark("twlijian_sunben", cards.length, false); + "step 1"; + if (player.countMark("twlijian_sunben") >= 8) { + player.removeSkill("twlijian_sunben"); + player.popup("力荐"); + game.log(player, "恢复了技能", "#g【力荐】"); + } + }, + }, + }, + }, + twchungang: { + audio: 2, + init: () => { + game.addGlobalSkill("twchungang_global"); + }, + onremove: player => { + if ( + !game.hasPlayer(i => { + return player !== i && i.hasSkill("twchungang"); + }, true) + ) + game.removeGlobalSkill("twchungang_global"); + }, + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + return game.hasPlayer(target => { + if (target == player || (evt && evt.player == target)) return false; + return event.getg(target).length > 1 && target.countCards("he"); + }); + }, + forced: true, + logTarget: function (event, player) { + var evt = event.getParent("phaseDraw"); + return game.filterPlayer(target => { + if (target == player || (evt && evt.player == target)) return false; + return event.getg(target).length > 1 && target.countCards("he"); + }); + }, + content: function () { + for (var i of lib.skill.twchungang.logTarget(trigger, player)) { + i.chooseToDiscard("he", true); + } + }, + subSkill: { + global: { + trigger: { + player: "dieAfter", + }, + filter(event, player) { + return !game.hasPlayer(i => i.hasSkill("twchungang"), true); + }, + silent: true, + forceDie: true, + charlotte: true, + content() { + game.removeGlobalSkill("twchungang_global"); + }, + ai: { + effect: { + target(card, player, target) { + if ((get.tag(card, "gain") || 0) < 2 && (get.tag(card, "draw") || 0) < 2) return; + let evt = _status.event.getParent("phaseDraw"), + dis = game.countPlayer(i => { + return target !== i && i.hasSkill("twchungang"); + }); + if (!dis || (evt && evt.player === target)) return; + return [1, -dis]; + }, + }, + }, + }, + }, + }, + //海外主公技 + //张鲁 + twshijun: { + unique: true, + global: "twshijun_global", + audio: 2, + zhuSkill: true, + ai: { combo: "yishe" }, + subSkill: { + global: { + audio: "twshijun", + usable: 1, + enable: "phaseUse", + forceaudio: true, + filter: function (event, player) { + return ( + player.group == "qun" && + game.hasPlayer(function (current) { + return current != player && current.hasZhuSkill("twshijun", player) && !current.getExpansions("yishe").length; + }) + ); + }, + filterTarget: function (card, player, target) { + return target != player && target.hasZhuSkill("twshijun", player) && !target.getExpansions("yishe").length; + }, + prompt: "摸一张牌然后将一张牌作为“米”置于主公的武将牌上", + content: function () { + "step 0"; + player.draw(); + if (player.countCards("he")) player.chooseCard("将一张牌置于" + get.translation(target) + "的武将牌上", "he", true); + else event.finish(); + "step 1"; + if (result.bool) target.addToExpansion(result.cards, player, "give").gaintag.add("yishe"); + }, + ai: { + order: 7, + result: { + target: 1, + }, + }, + }, + }, + }, + //张绣 + twjuxiang: { + unique: true, + global: "twjuxiang_global", + audio: 2, + zhuSkill: true, + subSkill: { + global: { + audio: "twjuxiang", + usable: 1, + enable: "phaseUse", + forceaudio: true, + filter: function (event, player) { + return ( + player.countCards("e") && + player.group == "qun" && + game.hasPlayer(function (target) { + return target != player && target.hasZhuSkill("twjuxiang", player) && player.countCards("e", card => target.hasEmptySlot(get.subtype(card)) || target.hasDisabledSlot(get.subtype(card))); + }) + ); + }, + filterTarget: function (card, player, target) { + return target != player && target.hasZhuSkill("twjuxiang", player) && (target.hasEmptySlot(get.subtype(ui.selected.cards[0])) || target.hasDisabledSlot(get.subtype(ui.selected.cards[0]))); + }, + filterCard: { type: "equip" }, + position: "e", + check: function (card) { + return get.value(card); + }, + prompt: "将装备区中的一张牌置入主公的装备区中或恢复主公的对应装备栏", + discard: false, + lose: false, + content: function () { + if (target.hasEmptySlot(get.subtype(cards[0]))) { + player.$give(cards[0], target, false); + target.equip(cards[0]); + } else { + target.gain(cards[0], player, "give"); + target.enableEquip(get.subtype(cards[0])); + } + }, + ai: { + order: 7, + result: { + target: 1, + }, + }, + }, + }, + }, + //孙坚 + twpolu: { + unique: true, + audio: "repolu", + trigger: { global: ["dieAfter", "die"] }, + forceDie: true, + zhuSkill: true, + filter: function (event, player, name) { + if (!player.hasZhuSkill("twpolu")) return false; + if (name == "dieAfter" && event.source && event.source.group == "wu") return true; + if (name == "die" && event.player.group == "wu") return true; + return false; + }, + direct: true, + content: function () { + "step 0"; + if (!player.storage.twpolu) player.storage.twpolu = 0; + event.num = player.storage.twpolu + 1; + player.chooseTarget([1, Infinity], get.prompt("twpolu"), "令任意名角色摸" + get.cnNumber(event.num) + "张牌").set("forceDie", true).ai = function (target) { + return get.attitude(_status.event.player, target); + }; + "step 1"; + if (result.bool) { + player.storage.twpolu++; + result.targets.sortBySeat(); + player.logSkill("repolu", result.targets); + game.asyncDraw(result.targets, num); + } else event.finish(); + "step 2"; + game.delay(); + }, + }, + //孟获 + twqiushou: { + unique: true, + audio: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + if (event.card.name != "nanman") return false; + var num = 0, + bool = false; + for (var i of event.targets) { + if (!i.isAlive()) bool = true; + i.getHistory("damage", function (evt) { + if (evt.getParent(2) == event) num += evt.num; + }); + } + return player.hasZhuSkill("twqiushou") && (bool || num > 3); + }, + zhuSkill: true, + forced: true, + logTarget: function (event, player) { + return game.filterPlayer(function (target) { + return ["shu", "qun"].includes(target.group); + }); + }, + content: function () { + "step 0"; + game.asyncDraw(lib.skill.twqiushou.logTarget(trigger.player)); + "step 1"; + game.delayx(); + }, + }, + //刘协 + twzhuiting: { + unique: true, + zhuSkill: true, + audio: 2, + global: "twzhuiting_global", + subSkill: { + global: { + hiddenWuxie: function (player, info) { + if (player.group != "wei" && player.group != "qun") return false; + const target = info.target, + card = info.card; + if (!target || target == player || !target.hasZhuSkill("twzhuiting")) return false; + if (_status.connectMode && player.countCards("hs") > 0) return true; + const color = get.color(card, false); + if (color == "none") return false; + return player.hasCard(card => get.color(card) == color, "hes"); + }, + audio: "twzhuiting", + forceaudio: true, + enable: "chooseToUse", + filter: function (event, player) { + if (event.type != "wuxie" || (player.group != "wei" && player.group != "qun")) return false; + const info = event.info_map, + target = info.target, + card = info.card; + if (!target || target == player || !target.hasZhuSkill("twzhuiting")) return false; + const color = get.color(card, false); + if (color == "none") return false; + return player.hasCard(card => get.color(card) == color, "hes"); + }, + filterCard: function (card) { + const info = _status.event.info_map; + return info && get.color(card) == get.color(info.card, false); + }, + viewAs: { name: "wuxie" }, + position: "hes", + prompt: function () { + const info = _status.event.info_map; + return "将一张" + get.translation(get.color(info.card)) + "牌当作【无懈可击】对" + get.translation(info.target) + "使用"; + }, + check: function (card) { + return 8 - get.value(card); + }, + }, + }, + }, + //刘繇 + twniju: { + audio: 2, + zhuSkill: true, + trigger: { + global: "compare", + }, + priority: 1, + filter(event, player) { + if (!player.hasZhuSkill("twniju")) return false; + if (event.iwhile || (event.target && event.compareMeanwhile)) return false; + const participant = [event.player]; + if (event.targets) participant.addArray(event.targets); + else participant.add(event.target); + return participant.includes(player); + }, + direct: true, + async content(event, trigger, player) { + const num = game.countPlayer(current => current.group === "qun"); + const dialog = [ + get.prompt("twniju"), + `
    令一张拼点牌的点数+${num}或-${num}
    `, + [ + [ + ["addNumber", "增加"], + ["subtractNumber", "减少"], + ], + "tdnodes", + ], + ]; + const lose_list = trigger.lose_list.slice().sort((a, b) => lib.sort.seat(a[0], b[0])); + dialog.push( + `
    ${lose_list + .map(list => { + return get.translation(list[0]); + }) + .join("  /  ")}
    ` + ); + const cards = lose_list.map(list => list[1]).flat(); + dialog.push(cards); + const result = await player + .chooseButton(dialog, 2) + .set("filterButton", button => { + const type = typeof button.link; + if (ui.selected.buttons.length && type === typeof ui.selected.buttons[0].link) return false; + return true; + }) + .forResult(); + if (!result.bool) return; + const { links } = result; + if (typeof links[0] !== "string") links.reverse(); + let [fn, card] = links; + const selectedPlayer = lose_list.find(item => { + if (Array.isArray(item[1])) return item[1].includes(card); + return item[1] == card; + })[0]; + player.logSkill("twniju", selectedPlayer); + selectedPlayer.addTempSkill("twniju_change"); + if (!selectedPlayer.storage.twniju_change) selectedPlayer.storage.twniju_change = []; + selectedPlayer.storage.twniju_change.push([fn, num, card]); + player + .when("chooseToCompareAfter") + .filter(evt => evt === trigger) + .vars({ + toDraw: num, + }) + .then(() => { + const num1 = trigger.result.num1, + num2 = trigger.result.num2; + let bool = false; + if (typeof num1 === "number" && typeof num2 === "number") { + if (num1 === num2) { + bool = true; + } + } else { + const num1List = num1.toUniqued(); + const totalList = num1List.concat(num2).toUniqued(); + if (totalList.length < num1List.length + num2.length) { + bool = true; + } + } + if (bool) player.draw(toDraw); + }); + }, + subSkill: { + change: { + trigger: { global: "compare" }, + filter(event, player) { + const storage = player.getStorage("twniju_change"); + if (!storage.length) return false; + if ((player !== event.player || event.iwhile) && player !== event.target) return false; + return event.lose_list.some(list => { + const cards = Array.isArray(list[1]) ? list[1] : [list[1]]; + return list[0] === player && storage.some(s => cards.includes(s[2])); + }); + }, + charlotte: true, + forced: true, + silent: true, + async content(event, trigger, player) { + const [fn, num] = player.getStorage("twniju_change").find(s => { + return trigger.lose_list.some(list => { + const cards = Array.isArray(list[1]) ? list[1] : [list[1]]; + return list[0] === player && cards.includes(s[2]); + }); + }); + const numId = player === trigger.player ? "num1" : "num2"; + trigger[fn](numId, num); + if (trigger[numId] > 13) trigger[numId] = 13; + else if (trigger[numId] < 1) trigger[numId] = 1; + game.log(player, "的拼点牌点数", fn === "addNumber" ? "+" : "-", num); + }, + }, + }, + }, + //刘虞 + twchongwang: { + init: function (player) { + player.storage.twchongwang = []; + player.storage.twchongwangx = []; + }, + mod: { + playerEnabled: function (card, player, target) { + if (!player.hasZhuSkill("twchongwang")) return; + if (get.tag(card, "damage") > 0 && player.storage.twchongwangx.includes(target)) return false; + }, + targetEnabled: function (card, player, target) { + if (!target.hasZhuSkill("twchongwang")) return; + if (get.tag(card, "damage") > 0 && target.storage.twchongwangx.includes(player)) return false; + }, + }, + locked: false, + unique: true, + onremove: true, + global: "twchongwang_global", + group: "twchongwang_clear", + audio: 2, + zhuSkill: true, + subSkill: { + clear: { + charlotte: true, + trigger: { player: "phaseAfter" }, + direct: true, + content: function () { + player.storage.twchongwangx = []; + }, + }, + global: { + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ( + player.group == "qun" && + game.hasPlayer(function (current) { + return current != player && current.hasZhuSkill("twchongwang", player) && !current.storage.twchongwang.includes(player); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: "崇望:是否将一张牌交给主公并获得双重庇护?", + selectCard: 1, + filterCard: true, + filterTarget: function (card, player, target) { + return target != player && target.hasZhuSkill("twchongwang", player) && !target.storage.twchongwang.includes(player); + }, + position: "he", + ai1: function (card) { + if (card.name == "du") return 10; + else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + var player = _status.event.player; + if ( + ui.selected.cards.length > 4 || + !game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); + }) + ) + return 0; + return 1 / Math.max(0.1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -att; + if (target.hasSkillTag("nogain")) att /= 6; + return att; + }, + }); + "step 1"; + if (result.bool) { + player.logSkill("twchongwang", result.targets[0]); + result.targets[0].gain(result.cards, player, "giveAuto"); + result.targets[0].storage.twchongwang.push(player); + result.targets[0].storage.twchongwangx.push(player); + } + }, + }, + }, + }, + //公孙范 + twhuiyuan: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var type = get.type2(event.card); + return !player.hasHistory("gain", evtx => { + if (evtx.getParent("phaseUse") != evt) return false; + return evtx.cards.some(card => get.type2(card) == type); + }); + }, + direct: true, + content: function () { + "step 0"; + var prompt2 = "展示一名角色的一张手牌。若展示牌为" + get.translation(get.type2(trigger.card)) + "牌,则你获得之,否则其弃置之并摸一张牌。然后若其在你的攻击范围内,且你不在其攻击范围内,你对其造成1点伤害"; + player + .chooseTarget(get.prompt("twhuiyuan"), prompt2, (card, player, target) => { + return target.countCards("h"); + }) + .set("ai", target => { + var player = _status.event.player; + var att = get.attitude(player, target); + return -att + (player.inRange(target) && !target.inRange(player) ? get.damageEffect(target, player, player) / 3 : 0); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twhuiyuan", target); + player.choosePlayerCard(target, "h", true, "回援:展示" + get.translation(target) + "一张手牌"); + } else event.finish(); + "step 2"; + if (result.bool) { + var card = result.cards[0]; + target.showCards([card], get.translation(target) + "【回援】展示"); + if (get.type2(card) == get.type2(trigger.card)) { + if (lib.filter.canBeGained(card, target, player)) { + player.gain(card, target, "giveAuto", "bySelf"); + } + } else { + if (lib.filter.canBeDiscarded(card, target, player)) { + target.discard(card, "notBySelf"); + target.draw(); + } + } + } else event.finish(); + "step 3"; + if (player.inRange(target) && !target.inRange(player)) { + game.log(player, "触发了", "#y搏击", "效果"); + player.line(target); + target.damage(); + } + }, + ai: { + expose: 0.2, + threaten: 3, + }, + }, + twshoushou: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + var cards = event.getg(player); + if (!cards.length) return false; + return ( + game.hasPlayer(current => { + return event.getl(current).cards2.length; + }) && + game.hasPlayer(current => { + return current.inRange(player); + }) + ); + }, + forced: true, + locked: false, + group: "twshoushou_damage", + onremove: function (player) { + if (player.countMark("twshoushou_plus") - player.countMark("twshoushou_minus") == 0) { + player.removeSkill("twshoushou_distance"); + } + }, + content: function () { + player.addSkill("twshoushou_distance"); + player.addMark("twshoushou_plus", 1, false); + }, + ai: { + halfneg: true, + }, + subSkill: { + damage: { + trigger: { + player: "damageEnd", + source: "damageSource", + }, + filter: function (event, player) { + return game.hasPlayer(current => { + return current != player && !current.inRange(player); + }); + }, + forced: true, + locked: false, + content: function () { + player.addSkill("twshoushou_distance"); + player.addMark("twshoushou_minus", 1, false); + }, + }, + distance: { + mark: true, + marktext: "绶", + intro: { + markcount: function (storage, player) { + return player.countMark("twshoushou_plus") - player.countMark("twshoushou_minus"); + }, + content: function (storage, player) { + var dis = player.countMark("twshoushou_plus") - player.countMark("twshoushou_minus"); + return "其他角色至你的距离" + (dis >= 0 ? "+" : "") + dis; + }, + }, + mod: { + globalTo: function (from, to, distance) { + return distance + to.countMark("twshoushou_plus") - to.countMark("twshoushou_minus"); + }, + }, + }, + }, + }, + //严纲 + twzhiqu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + var count = get.cnNumber( + game.countPlayer(current => { + return get.distance(player, current) <= 1; + }) + ); + player.chooseTarget(get.prompt("twzhiqu"), "选择一名其他角色并视为使用牌堆顶" + count + "张牌中的【杀】。若你与其均在对方的攻击范围内,你改为依次对其使用牌堆顶" + count + "张牌中的【杀】或锦囊牌。", lib.filter.notMe).set("ai", target => { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player) * (get.distance(player, target) == 1 ? 2 : 1); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twzhiqu", target); + event.fight = player.inRange(target) && target.inRange(player); + if (event.fight) game.log(player, "触发了", "#y搏击", "效果"); + event.cards = game + .cardsGotoOrdering( + get.cards( + game.countPlayer(current => { + return get.distance(player, current) <= 1; + }) + ) + ) + .cards.slice(); + } else event.finish(); + "step 2"; + if (player.isIn() && target.isIn() && cards.length) { + do var card = cards.shift(); + while (get.name(card) != "sha" && (!event.fight || get.type2(card) != "trick") && cards.length); + if (get.name(card) != "sha" && (!event.fight || get.type2(card) != "trick")) return; + player.showCards([card], get.translation(player) + "发动了【直取】"); + player + .chooseUseTarget(card, true, false, "nodistance") + .set("filterTarget", function (card, player, target) { + var evt = _status.event; + if (_status.event.name == "chooseTarget") evt = evt.getParent(); + if (target != player && target != evt.twzhiqu_target) return false; + return lib.filter.targetEnabledx(card, player, target); + }) + .set("twzhiqu_target", target); + event.redo(); + } + }, + }, + twxianfeng: { + audio: 2, + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (!player.isPhaseUsing()) return false; + if (player == event.player) return false; + if (!event.player.isIn()) return false; + if (!event.card) return false; + return event.card.name == "sha" || (get.type(event.card) == "trick" && get.tag(event.card, "damage")); + }, + logTarget: "player", + check: function (event, player) { + let att = get.attitude(player, event.player); + if (att > 0) return true; + if (!player.hasSkill("twzhiqu")) return false; + let cnt = game.countPlayer(current => get.distance(player, current) === 2); + if (cnt > 2 || (cnt === 2 && Math.abs(att) < 2) || (cnt && Math.abs(att) < 1)) return true; + return false; + }, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + target + .chooseControl() + .set("choiceList", ["你摸一张牌,然后直到" + get.translation(player) + "下个回合开始时,其至其他角色的距离-1", get.translation(player) + "摸一张牌,然后直到其下个回合开始时,你至其的距离-1"]) + .set("prompt", "先锋:请选择一项") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var att = get.attitude(target, player); + if (att === 0) return 0; + if (player.hasSkill("twzhiqu")) { + var cnt = game.countPlayer(current => get.distance(player, current) === 2); + if (att > 0) { + if (cnt || player.needsToDiscard(1)) return 0; + return 1; + } + if (!cnt) return 0; + if (cnt >= 2 || get.distance(target, player, "attack") === 2 || get.distance(target, player) === 2) return 1; + return 0; + } + if ( + att < 0 || + (player.needsToDiscard(1) && + game.hasPlayer(function (current) { + return current !== player && current !== target && !player.inRange(current); + })) + ) + return 0; + return [0, 1].randomGet(); + })() + ); + "step 1"; + if (result.index == 0) { + target.draw(); + player.addTempSkill("twxianfeng_me", { player: "phaseBegin" }); + player.addMark("twxianfeng_me", 1, false); + } else { + player.draw(); + target.addSkill("twxianfeng_others"); + if (!target.storage.twxianfeng_others) target.storage.twxianfeng_others = {}; + if (typeof target.storage.twxianfeng_others[player.playerid] != "number") target.storage.twxianfeng_others[player.playerid] = 0; + target.storage.twxianfeng_others[player.playerid]++; + } + }, + subSkill: { + me: { + charlotte: true, + mark: true, + intro: { content: "至其他角色的距离-#" }, + mod: { + globalFrom: function (from, to, distance) { + return distance - from.countMark("twxianfeng_me"); + }, + }, + }, + others: { + trigger: { global: ["phaseBegin", "die"] }, + filter: function (event, player) { + return player.storage.twxianfeng_others && player.storage.twxianfeng_others[event.player.playerid]; + }, + charlotte: true, + mark: true, + forced: true, + intro: { + markcount: function (storage, player) { + var max = 0; + for (var id in storage) { + if (storage[id] > max) max = storage[id]; + } + return max; + }, + content: function (storage, player) { + if (!storage) return ""; + var str = ""; + var map = _status.connectMode ? lib.playerOL : game.playerMap; + for (var id in storage) { + str += "至" + get.translation(map[id]) + "的距离-" + storage[id] + "、"; + } + return str.slice(0, -1); + }, + }, + content: function () { + delete player.storage.twxianfeng_others[trigger.player.playerid]; + if (get.is.empty(player.storage.twxianfeng_others)) player.removeSkill("twxianfeng_others"); + }, + mod: { + globalFrom: function (from, to, distance) { + if (from.storage.twxianfeng_others && typeof from.storage.twxianfeng_others[to.playerid] == "number") return distance - from.storage.twxianfeng_others[to.playerid]; + }, + }, + }, + }, + }, + //夏侯紫萼 + twxuechang: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + if (!target.countGainableCards(player, "he")) event.finish(); + else player.gainPlayerCard(target, "he", true); + } else { + player.damage(target); + player.addSkill("twxuechang_add"); + if (!player.storage.twxuechang_add) player.storage.twxuechang_add = {}; + if (!player.storage.twxuechang_add[target.playerid]) player.storage.twxuechang_add[target.playerid] = 0; + player.storage.twxuechang_add[target.playerid]++; + player.markSkill("twxuechang_add"); + event.finish(); + } + "step 2"; + var card = result.cards[0]; + if (get.type(card) == "equip") { + var card = { name: "sha", isCard: true }; + if (player.canUse(card, target, false)) player.useCard(card, target, "noai", false); + } + }, + ai: { + order: 6.5, + result: { + target: function (player, target) { + var hs = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); + }); + var ts = target.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); + }); + if (!hs.length || !ts.length) return 0; + if (get.number(hs[0]) > get.number(ts[0]) || get.number(hs[0]) - ts.length >= 9 + Math.min(2, player.hp / 2)) return get.sgnAttitude(player, target) * get.effect(target, { name: "shunshou_copy2" }, player, player); + return 0; + }, + }, + }, + subSkill: { + add: { + audio: "twxuechang", + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return player.storage.twxuechang_add && player.storage.twxuechang_add[event.player.playerid]; + }, + forced: true, + charlotte: true, + content: function () { + trigger.num += player.storage.twxuechang_add[trigger.player.playerid]; + delete player.storage.twxuechang_add[trigger.player.playerid]; + if (get.is.empty(player.storage.twxuechang_add)) player.removeSkill("twxuechang_add"); + else player.markSkill("twxuechang_add"); + }, + marktext: "偿", + intro: { + content: function (storage, player) { + if (!storage) return ""; + var str = ""; + var map = _status.connectMode ? lib.playerOL : game.playerMap; + for (var i in storage) { + str += "
  • 下次对" + get.translation(map[i]) + "造成的伤害+" + storage[i]; + } + return str; + }, + }, + }, + }, + }, + twduoren: { + audio: 2, + trigger: { source: "dieAfter" }, + check: function (event, player) { + if (player.hp < 3 && !player.isDamaged()) return false; + var skills = event.player.getSkills(null, false, false).filter(skill => { + if (player.hasSkill(skill, null, false, false)) return false; + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }); + return skills.length > 0; + }, + group: "twduoren_remove", + prompt2: function (event, player) { + var skills = event.player.getSkills(null, false, false).filter(skill => { + if (player.hasSkill(skill, null, false, false)) return false; + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }); + var str = ""; + for (var i of skills) { + str += "〖" + get.translation(i) + "〗、"; + } + str = str.slice(0, str.length - 1); + return "减1点体力上限,然后" + (str.length ? "获得" + str : "听一句技能配音"); + }, + logTarget: "player", + content: function () { + "step 0"; + player.loseMaxHp(); + "step 1"; + var skills = trigger.player.getSkills(null, false, false).filter(skill => { + if (player.hasSkill(skill, null, false, false)) return false; + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }); + if (skills.length) { + //for(var i of skills) player.addSkillLog(i); + player.addSkills(skills); + player.markAuto("twduoren", skills); + game.broadcastAll(function (list) { + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.xia_xiahouzie = "twduoren"; + } + }, skills); + } + }, + subSkill: { + remove: { + trigger: { source: "dying" }, + filter: function (event, player) { + return ( + event.player != player && + player.getStorage("twduoren").some(skill => { + return player.hasSkill(skill, null, false, false); + }) + ); + }, + forced: true, + locked: false, + content: function () { + player.removeSkills(player.getStorage("twduoren")); + delete player.storage.twduoren; + }, + }, + }, + }, + //赵娥 + twyanshi: { + audio: 2, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + direct: true, + onremove: true, + intro: { + content: "players", + }, + filter: function (event, player) { + return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); + }, + group: ["twyanshi_hurt", "twyanshi_damage"], + content: function () { + "step 0"; + player.chooseTarget("言誓:选择一名其他角色", lib.filter.notMe, true).set("ai", target => get.attitude(_status.event.player, target)); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twyanshi", target); + player.markAuto("twyanshi", [target]); + } + }, + mod: { + targetInRange: function (card, player, target) { + if (target.hasMark("twyanshi_mark")) return true; + }, + }, + subSkill: { + hurt: { + audio: "twyanshi", + trigger: { + global: "damageEnd", + }, + forced: true, + locked: false, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return (player == event.player && !player.getStorage("twyanshi").includes(event.source)) || (player != event.source && player.getStorage("twyanshi").includes(event.player)); + }, + content: function () { + trigger.source.addMark("twyanshi_mark", 1); + }, + }, + damage: { + audio: "twyanshi", + trigger: { + source: ["damageBegin1", "damageSource"], + }, + forced: true, + locked: false, + filter: function (event, player) { + return event.player.hasMark("twyanshi_mark"); + }, + content: function () { + "step 0"; + if (event.triggername == "damageBegin1") { + trigger.num++; + } else { + player.draw(trigger.num); + trigger.player.removeMark("twyanshi_mark", trigger.player.countMark("twyanshi_mark")); + } + }, + }, + mark: { + marktext: "誓", + intro: { + name: "誓", + name2: "誓", + content: "mark", + }, + }, + }, + }, + twrenchou: { + audio: 2, + trigger: { global: "die" }, + forced: true, + forceDie: true, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + if (event.player == player) { + return player.getStorage("twyanshi").some(i => i.isIn() && i.hp > 0); + } + if (player.getStorage("twyanshi").includes(event.player)) { + return player.isIn() && player.hp > 0; + } + return false; + }, + logTarget: "source", + line: false, + skillAnimation: true, + animationColor: "water", + global: "twrenchou_ai", + content: function () { + "step 0"; + var avengers = []; + if (trigger.player == player) { + avengers = player.getStorage("twyanshi").filter(i => i.isIn() && i.hp > 0); + } + if (player.getStorage("twyanshi").includes(trigger.player)) { + avengers = [player]; + } + event.avengers = avengers; + "step 1"; + var avenger = event.avengers.shift(); + avenger.line(trigger.source, "fire"); + trigger.source.damage(avenger, avenger.hp); + "step 2"; + if (event.avengers.length && trigger.source.isIn()) event.goto(1); + }, + ai: { + combo: "twyanshi", + }, + subSkill: { + ai: { + ai: { + effect: { + target: function (card, player, target) { + if (!get.tag(card, "damage")) return; + if (target.hp > 1) return; + var num = 0; + game.filterPlayer(current => { + if (current.getStorage("twyanshi").some(i => target == i)) { + num += current.hp; + } + }); + var targets = target.getStorage("twyanshi").filter(i => i.isIn()); + for (var targetx of targets) { + num += targetx.hp; + } + if (num >= player.hp) return 0; + if (num > 0) return [1, 0, 0, 0.5 - 1.5 * num]; + }, + }, + }, + }, + }, + }, + //侠典韦 + twliexi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.countCards("he"); + }, + direct: true, + content: function () { + "step 0"; + var list = [[], []]; + for (var current of game.players) { + if (current == player) continue; + var cards = []; + var weapon = false; + for (var card of player.getCards("he")) { + if (!lib.filter.cardDiscardable(card, player)) continue; + if (get.subtype(card) == "equip1" && !ui.selected.cards.some(i => get.subtype(i) == "equip1")) { + if (16 - get.value(card) > 0) { + cards.push(card); + weapon = true; + } + } + if (7 - get.value(card) > 0) cards.push(card); + } + if (cards.length > current.hp) { + var val = 0; + for (var card of cards) { + if (get.subtype(card) != "equip1") val += get.value(card); + } + if (val < 30) list[0].push(current); + } + if ((weapon && player.hp > 2) || get.damageEffect(player, current, player) > 10) list[1].push(current); + } + list[0].sort((a, b) => { + return get.damageEffect(b, player, player) - get.damageEffect(a, player, player); + }); + player.chooseCardTarget({ + filterCard: lib.filter.cardDiscardable, + selectCard: [1, Infinity], + position: "he", + filterTarget: lib.filter.notMe, + prompt: get.prompt2("twliexi"), + targetsx: [list[0][0], list[1][0]], + ai1: function (card) { + var targetx = _status.event.targetsx[0]; + var hasWeapon = ui.selected.cards.some(i => get.subtype(i) == "equip1"); + if (!targetx) { + var targetx = _status.event.targetsx[1]; + if (get.subtype(card) == "equip1" && !hasWeapon) return 30 - get.value(card); + return -get.value(card); + } + if (ui.selected.cards.length > targetx.hp) return 0; + if (get.subtype(card) == "equip1" && !hasWeapon) return 30 - get.value(card); + return 7 - get.value(card); + }, + ai2: function (target) { + var targetx = _status.event.targetsx[0] || _status.event.targetsx[1]; + if (targetx == target) return 10; + return 0; + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var cards = result.cards; + player.logSkill("twliexi", target); + player.discard(cards); + if (cards.length > target.hp) target.damage(); + else player.damage(target); + var goon = false; + for (var card of cards) { + if (get.subtype(card) == "equip1") { + goon = true; + break; + } + } + if (!goon) event.finish(); + } else event.finish(); + "step 2"; + game.delayx(); + target.damage(); + }, + }, + twshezhong: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + var damage = player.getHistory("sourceDamage").length; + if (damage) { + player.chooseTarget(get.prompt("twshezhong"), "令至多" + get.cnNumber(damage) + "名其他角色下个摸牌阶段的摸牌数-1", [1, damage], lib.filter.notMe).set("ai", target => { + return -get.attitude(_status.event.player, target); + }); + } else event.goto(2); + "step 1"; + if (result.bool) { + var targets = result.targets; + player.logSkill("twshezhong", targets); + for (var target of targets) { + target.addSkill("twshezhong_minus"); + target.addMark("twshezhong_minus", 1, false); + } + } + "step 2"; + var targets = []; + for (var evt of player.getHistory("damage")) { + if (evt.source && evt.source.isIn()) targets.add(evt.source); + } + if (targets.length) { + player + .chooseTarget(get.prompt("twshezhong"), "将手牌摸至一名与一名本回合对你造成过伤害的角色的体力值相同,且至多摸至五张", (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set("ai", target => { + return Math.max(0.1, target.hp - _status.event.player.countCards("h")); + }) + .set("targets", targets); + } else event.finish(); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twshezhong", target); + var num = Math.min(target.hp, 5) - player.countCards("h"); + if (num > 0) player.draw(num); + } + }, + subSkill: { + minus: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + onremove: true, + content: function () { + var num = player.countMark("twshezhong_minus"); + trigger.num -= num; + game.log(player, "的额定摸牌数", "#g-" + num); + player.removeSkill("twshezhong_minus"); + }, + mark: true, + intro: { + content: "额定摸牌数-#", + }, + }, + }, + }, + //侠鲁肃 + twkaizeng: { + audio: 2, + global: "twkaizeng_want", + refuseInfo: ["不给", "拒绝"], + subSkill: { + want: { + audio: "twkaizeng", + forceaudio: true, + enable: "phaseUse", + usable: 1, + charlotte: true, + filter: function (event, player) { + return game.hasPlayer(current => { + return current != player && current.hasSkill("twkaizeng"); + }); + }, + chooseButton: { + dialog: function (event, player) { + var targets = game.filterPlayer(current => { + return current != player && current.hasSkill("twkaizeng"); + }); + return ui.create.dialog("###慨赠###" + "选择一种基本牌的牌名或非基本牌的类型,然后令" + get.translation(targets) + (targets.length > 1 ? "中的一人" : "") + "选择是否交给你任意张牌"); + }, + chooseControl: function () { + var list = []; + var basic = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + var type = get.type(name, "trick"); + if (type == "basic") { + list.push(name); + basic.push(name); + } else list.add(type); + } + list.push("cancel2"); + return list; + }, + check: function (event, player) { + if (Math.random() < 0.4) { + var list = _status.event.controls.slice(); + list.remove("du"); + return list.randomGet(); + } + var targets = game.filterPlayer(current => current != player && current.hasSkill("twkaizeng")); + targets.sort((a, b) => get.attitude(player, b) - get.attitude(player, a)); + var cards = targets[0].getCards("h"); + var list = []; + for (var card of cards) { + var type = get.type2(card); + if (type == "basic") list.add(get.name(card)); + else list.add(type); + } + var need = ["trick", "equip"].randomSort(); + need.addArray(["sha", "jiu"].randomSort()); + for (var type of need) { + if (list.includes(type)) return type; + } + return list.randomGet(); + }, + backup: function (result, player) { + return { + audio: "twkaizeng", + type: result.control, + log: false, + delay: false, + filterTarget: function (card, player, target) { + return target.hasSkill("twkaizeng"); + }, + selectTarget: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("twkaizeng"); + }); + return targets.length > 1 ? 1 : -1; + }, + prepare: function (cards, player, targets) { + targets[0].logSkill("twkaizeng_want", player); + }, + content: function () { + "step 0"; + var type = lib.skill.twkaizeng_want_backup.type; + var isbasic = lib.card[type]; + target + .chooseCard("慨赠:是否交给" + get.translation(player) + "任意张手牌?", "若你以此法:交给其至少两张牌,你摸一张牌;交给其的牌包含其选择的牌名或类型,你获得一张不为此牌名或类型的牌", [1, Infinity]) + .set("ai", card => { + if (!_status.event.goon) return -get.value(card); + var player = _status.event.player, + target = _status.event.getParent().player; + if (ui.selected.cards.length > player.countCards("h") / 2 && ui.selected.cards.length >= 2) return 0; + var type = _status.event.type; + var isbasic = lib.card[type]; + var add = 0; + if (!ui.selected.cards.some(i => get[isbasic ? "name" : "type2"](i, target) == type)) add += 3; + if (ui.selected.cards.length < 2) add += 3; + return get.value(card, target) - get.value(card, player) + add; + }) + .set("type", type) + .set("goon", get.attitude(target, player) > 0); + "step 1"; + if (result.bool) { + var cards = result.cards; + event.cards = cards; + target.give(cards, player); + } else { + var refuseInfo = lib.skill.twkaizeng.refuseInfo.slice(); + if (get.attitude(target, player) < 0) refuseInfo.push("没门"); + target.chat(refuseInfo.randomGet()); + event.finish(); + } + "step 2"; + if (cards.length > 1) target.draw(); + "step 3"; + var type = lib.skill.twkaizeng_want_backup.type; + var isbasic = lib.card[type]; + var fn = isbasic ? "name" : "type2"; + if (cards.some(card => get[fn](card, player) == type)) { + var card = get.cardPile(cardx => { + return get[fn](cardx, target) != type; + }); + if (card) target.gain(card, "gain2"); + } + "step 4"; + game.delayx(); + }, + ai: { + result: { + target: 1, + }, + }, + }; + }, + prompt: () => "请选择一名有【慨赠】的角色", + }, + ai: { + order: 10, + result: { + player: function (player) { + var targets = game.filterPlayer(current => { + return current != player && current.hasSkill("twkaizeng"); + }); + for (var i of targets) if (get.attitude(player, i) > 0) return 1; + return 0; + }, + }, + }, + }, + want_backup: {}, + }, + ai: { + threaten: 3, + }, + }, + twyangming: { + audio: 2, + trigger: { + player: "phaseUseEnd", + }, + frequent: true, + filter: function (event, player) { + return player.hasHistory("useCard", evt => evt.getParent("phaseUse") == event); + }, + content: function () { + var types = []; + var history = player.getHistory("useCard", evt => evt.getParent("phaseUse") == trigger); + for (var evt of history) { + types.add(get.type2(evt.card)); + } + var num = types.length; + player.draw(num); + player.addTempSkill("twyangming_limit"); + player.addMark("twyangming_limit", num, false); + game.log(player, "本回合的手牌上限", "#g+" + num); + }, + subSkill: { + limit: { + charlotte: true, + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("twyangming_limit"); + }, + }, + }, + }, + }, + //邴原 + twbingde: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") && player.getStorage("twbingde_clear").length < 4; + }, + onChooseToUse: function (event) { + if (event.type == "phase" && !game.online) { + var map = {}; + event.player.getHistory("useCard", evt => { + var evtx = evt.getParent("phaseUse"), + suit = get.suit(evt.card); + if (!lib.suit.includes(suit)) return; + if (evtx != event.getParent("phaseUse")) return; + if (typeof map[suit] != "number") map[suit] = 0; + map[suit]++; + }); + event.set("twbingde_map", map); + } + }, + chooseButton: { + dialog: function (event, player) { + var str = get.translation("twbingde_info"), + str2 = ""; + if (event.twbingde_map) { + str2 = '
    本回合使用牌对应花色数:
    '; + str2 += '
    '; + for (var suit of lib.suit) { + str2 += get.translation(suit) + ":" + get.cnNumber(event.twbingde_map[suit] || 0) + "张;"; + } + str2 = str2.slice(0, str2.length - 1) + "
    "; + } + return ui.create.dialog("###秉德###" + str, str2); + }, + chooseControl: function (event, player) { + var list = lib.suit.slice(); + list.removeArray(player.getStorage("twbingde_clear")); + list.push("cancel2"); + return list; + }, + check: function (event, player) { + var map = event.twbingde_map; + var suit = lib.suit + .filter(i => !player.getStorage("twbingde_clear").includes(i)) + .sort((a, b) => { + return map[b] - map[a]; + })[0]; + if (map[suit] == 0) return "cancel2"; + return suit; + }, + backup: function (result, player) { + return { + audio: "twbingde", + filterCard: true, + selectCard: 1, + position: "he", + suit: result.control, + check: function (card) { + var suit = lib.skill.twbingde.suit; + if (get.suit(card) == suit) return 10 - get.value(card); + return 6 - get.value(card); + }, + content: function () { + "step 0"; + var suit = lib.skill.twbingde_backup.suit, + num = 0; + player.popup(suit + 2); + game.log(player, "选择了", "#y" + suit + 2); + player.addTempSkill("twbingde_clear", "phaseUseAfter"); + player.markAuto("twbingde_clear", [suit]); + player.getHistory("useCard", evt => { + var evtx = evt.getParent("phaseUse"), + suitx = get.suit(evt.card); + if (!evtx || evtx != event.getParent("phaseUse") || suit != suitx) return false; + num++; + }); + if (num > 0) player.draw(num); + "step 1"; + if (get.suit(cards[0], player) == lib.skill.twbingde_backup.suit) { + delete player.getStat("skill").twbingde; + } + }, + ai: { + result: { + player: 1, + }, + }, + }; + }, + prompt: () => "秉德:弃置一张牌", + }, + ai: { + order: 2, + result: { player: 1 }, + }, + subSkill: { + backup: {}, + clear: { + charlotte: true, + onremove: true, + }, + }, + }, + twqingtao: { + audio: 2, + trigger: { player: "phaseDrawEnd" }, + filter: function (event, player) { + return player.countCards("he"); + }, + direct: true, + group: "twqingtao_jieshu", + content: function () { + "step 0"; + player.chooseCard(get.prompt2("twqingtao"), "he", lib.filter.cardRecastable).set("ai", function (card) { + if (card.name == "jiu" || get.type(card) != "basic") return 10 - get.value(card); + return 6 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("twqingtao"); + player.recast(result.cards); + if (get.name(result.cards[0]) == "jiu" || get.type(result.cards[0], false, player) != "basic") player.draw(); + } + }, + subSkill: { + jieshu: { + audio: "twqingtao", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("he") > 0 && !player.hasHistory("useSkill", evt => evt.skill == "twqingtao"); + }, + direct: true, + content: function () { + var next = game.createEvent("twqingtao"); + next.player = player; + next.setContent(lib.skill.twqingtao.content); + }, + }, + }, + }, + //牛董 + twjuntun: { + audio: 2, + trigger: { + global: ["phaseBefore", "dieAfter"], + player: "enterGame", + }, + init: function (player) { + lib.skill.baonvezhi.change(player, 0); + }, + direct: true, + derivation: ["twxiongjun", "baonvezhi_faq"], + group: "twjuntun_extra", + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + game.hasPlayer(current => { + return !current.hasSkill("twxiongjun"); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("twjuntun"), "令一名角色获得〖凶军〗", (card, player, target) => { + return !target.hasSkill("twxiongjun"); + }) + .set("ai", target => get.attitude(player, target) - 2); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twjuntun", target); + target.addSkills("twxiongjun"); + if (target != player) player.addExpose(0.25); + } + }, + subSkill: { + extra: { + audio: 2, + trigger: { global: "damageSource" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.source && event.source.hasSkill("twxiongjun") && event.source != player; + }, + logTarget: "source", + content: function () { + lib.skill.baonvezhi.change(player, trigger.num); + }, + }, + }, + }, + baonvezhi: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + silent: true, + forced: true, + charlotte: true, + baonvezhi_max: 5, + change: function (player, num) { + var baonvezhi_max = lib.skill.baonvezhi.baonvezhi_max; + player.addSkill("baonvezhi"); + var tmp = player.countMark("baonvezhi"); + if (tmp + num > baonvezhi_max) num = baonvezhi_max - tmp; + else if (tmp + num < 0) num = -tmp; + if (num === 0) return; + player[num > 0 ? "addMark" : "removeMark"]("baonvezhi", Math.abs(num), false); + game.log(player, num >= 0 ? "获得了" : "失去了", get.cnNumber(Math.abs(num)) + '点暴虐值'); + player[player.countMark("baonvezhi") > 0 ? "markSkill" : "unmarkSkill"]("baonvezhi"); + }, + filter: function (event, player) { + return player.countMark("baonvezhi") < lib.skill.baonvezhi.baonvezhi_max; + }, + content: function () { + lib.skill.baonvezhi.change(player, trigger.num); + }, + marktext: "暴", + intro: { + name: "暴虐值", + content: function (storage, player) { + return get.translation(player) + "的暴虐值为" + (player.storage.baonvezhi || 0); + }, + }, + }, + baonvezhi_faq: {}, + twxiongjun: { + init: function (player) { + lib.skill.baonvezhi.change(player, 0); + }, + trigger: { source: "damageSource" }, + forced: true, + usable: 1, + content: function () { + var targets = game.filterPlayer(current => current.hasSkill("twxiongjun")).sortBySeat(); + player.line(targets, "green"); + game.asyncDraw(targets); + }, + }, + twxiongxi: { + audio: 2, + enable: "phaseUse", + usable: 1, + init: function (player) { + lib.skill.baonvezhi.change(player, 0); + }, + filterCard: () => true, + selectCard: function () { + return (lib.skill.baonvezhi.baonvezhi_max || 5) - _status.event.player.countMark("baonvezhi"); + }, + check: function (card) { + return 6 - get.value(card); + }, + position: "he", + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { + target.damage(); + }, + ai: { + expose: 0.25, + order: 8, + result: { + target: function (player, target) { + return get.damageEffect(target, player, player); + }, + }, + }, + }, + twxiafeng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countMark("baonvezhi") > 0; + }, + init: function (player) { + lib.skill.baonvezhi.change(player, 0); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseButton(["黠凤:选择要消耗的暴虐值", [["tw_bn_1", "tw_bn_2", "tw_bn_3"], "vcard"]], button => { + var num = player.countCards("hs", card => get.tag(card, "damage") && game.hasPlayer(current => get.effect(current, card, player, player) > 0)); + if (num <= 0) return 0; + if (num >= 3) num = 3; + if (button.link[2] == "tw_bn_" + num) return 10; + return 1; + }) + .set("filterButton", button => { + var player = _status.event.player; + var link = button.link[2]; + if (link[link.length - 1] * 1 > player.storage.baonvezhi) return false; + return true; + }); + "step 1"; + if (result.bool) { + player.logSkill("twxiafeng"); + var link = result.links[0][2], + num = link[link.length - 1] * 1; + player.addTempSkill("twxiafeng_effect"); + player.storage.twxiafeng_effect = num; + lib.skill.baonvezhi.change(player, -num); + } + }, + subSkill: { + effect: { + trigger: { player: "useCard" }, + filter: function (event, player) { + return !player.storage.twxiafeng_effect2; + }, + forced: true, + content: function () { + var count = player.getHistory("useCard", evt => evt.getParent("phaseUse").player == player).length; + if (count == player.storage.twxiafeng_effect) { + player.storage.twxiafeng_effect2 = true; + } + if (count <= player.storage.twxiafeng_effect) { + trigger.directHit.addArray(game.players); + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; + } + } + }, + onremove: function (player) { + delete player.storage.twxiafeng_effect; + delete player.storage.twxiafeng_effect2; + }, + mod: { + targetInRange: function (card, player, target, now) { + if (!player.storage.twxiafeng_effect2) return true; + }, + cardUsableTarget: function (card, player, target) { + if (!player.storage.twxiafeng_effect2) return true; + }, + maxHandcard: function (player, num) { + return num + (player.storage.twxiafeng_effect || 0); + }, + }, + }, + }, + }, + //蒋济 + twjichou: { + audio: 2, + enable: "chooseToUse", + group: ["twjichou_ban", "twjichou_give"], + filter: function (event, player) { + if (player.hasSkill("twjichou_used") && player.hasSkill("twjichou_given")) return false; + if (!player.hasSkill("twjichou_used")) { + var record = player.getStorage("twjichou"); + for (var i of lib.inpile) { + var type = get.type(i); + if (type == "trick" && !record.includes(i) && event.filterCard({ name: i, isCard: true }, player, event)) return true; + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("急筹"); + if ( + !player.hasSkill("twjichou_used") && + !player.hasSkill("twjichou_given") && + event.type == "phase" && + player.countCards("h", card => { + return player.getStorage("twjichou").includes(get.name(card)); + }) + ) { + dialog._chosenOpt = []; + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + var list = ["视为使用牌", "交出锦囊牌"]; + for (var i of list) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.innerHTML = "" + i + ""; + td.link = i; + if (i == list[0]) { + td.classList.add("bluebg"); + dialog._chosenOpt.add(td); + } + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.clicked) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + _status.clicked = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + if (link == "交出锦囊牌") game.uncheck(); + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); + dialog._chosenOpt.remove(current); + } + dialog._chosenOpt.add(this); + this.classList.add("bluebg"); + game.check(); + }); + table.appendChild(td); + dialog.buttons.add(td); + } + dialog.content.appendChild(table); + } + var list = [], + record = player.getStorage("twjichou"); + for (var name of lib.inpile) { + if (get.type(name) == "trick" && !record.includes(name) && event.filterCard({ name: name, isCard: true }, player, event)) list.push(["锦囊", "", name]); + } + dialog.add([list, "vcard"]); + return dialog; + }, + filter: function (button) { + if (_status.event.dialog) { + var opts = _status.event.dialog._chosenOpt; + if (opts && opts.length && opts[0].link == "交出锦囊牌" && typeof button.link != typeof opts[0].link) { + return false; + } + return true; + } + return false; + }, + select: function () { + if (_status.event.dialog) { + var opts = _status.event.dialog._chosenOpt; + return opts && opts.length && opts[0].link == "交出锦囊牌" ? 0 : 1; + } + return 0; + }, + 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.1; + return player.getUseValue({ name: button.link[2] }); + }, + backup: function (links, player) { + var isUse = links.length == 1; + var backup = get.copy(lib.skill["twjichou_" + (isUse ? "use" : "give")]); + if (isUse) backup.viewAs = { name: links[0][2], isCard: true }; + return backup; + }, + prompt: function (links, player) { + var isUse = links.length == 1; + return "急筹:" + (isUse ? "视为使用" + get.translation(links[0][2]) + "" : "选择要交出的牌和要交给的目标"); + }, + }, + hiddenCard: function (player, name) { + if (player.hasSkill("twjichou_used")) return false; + var type = get.type(name); + return type == "trick" && !player.getStorage("twjichou").includes(name); + }, + marktext: "筹", + intro: { + markcount: function (storage, player) { + if (storage && storage.length) return storage.length; + return 0; + }, + content: "已记录牌名:$", + }, + ai: { + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { + backup: {}, + used: { charlotte: true }, + given: { charlotte: true }, + ban: { + trigger: { global: "useCard1" }, + filter: function (event, player) { + return player.getStorage("twjichou").includes(event.card.name); + }, + forced: true, + locked: false, + silent: true, + content: function () { + trigger.directHit.add(player); + }, + mod: { + cardEnabled: function (card, player) { + if (player.getStorage("twjichou").includes(card.name) && (get.position(card) == "h" || (card.cards && card.cards.some(i => get.position(i) == "h")))) return false; + }, + cardSavable: function (card, player) { + if (player.getStorage("twjichou").includes(card.name) && (get.position(card) == "h" || (card.cards && card.cards.some(i => get.position(i) == "h")))) return false; + }, + aiValue: function (player, card) { + if (get.type(card) != "trick" || _status.twjichou_give_aiCheck) return; + if (!player.getFriends().length && player.getStorage("twjichou").includes(get.name(card))) return 0; + }, + aiUseful: function () { + return lib.skill.twjichou_ban.mod.aiValue.apply(this, arguments); + }, + }, + }, + use: { + filterCard: () => false, + selectCard: -1, + audio: "twjichou", + popname: true, + onuse: function (links, player) { + player.markAuto("twjichou", [links.card.name]); + player.syncStorage("twjichou"); + player.addTempSkill("twjichou_used"); + }, + }, + give: { + audio: "twjichou", + enable: "phaseUse", + filter: function (event, player) { + return player.hasSkill("twjichou_used") && !player.hasSkill("twjichou_given") && player.countCards("h", i => player.getStorage("twjichou").includes(get.name(i))); + }, + filterTarget: function (card, player, target) { + return target != player; + }, + filterCard: function (card, player) { + return player.getStorage("twjichou").includes(get.name(card)); + }, + check: function (card) { + _status.twjichou_give_aiCheck = true; + var val = get.value(card); + delete _status.twjichou_give_aiCheck; + return val; + }, + prompt: () => "选择要交出的牌和要交给的目标", + selectCard: [1, Infinity], + discard: false, + lose: false, + delay: false, + content: function () { + player.give(cards, target); + player.addTempSkill("twjichou_given", "phaseUseAfter"); + }, + ai: { + order: 0.9, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (target.hasJudge("lebu")) return 0; + return target.getCards("h", card => player.getStorage("twjichou").includes(get.name(card))).reduce((p, c) => p + (target.getUseValue(c) || 1), 0); + }, + }, + }, + }, + }, + }, + twjilun: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + var num = Math.min(Math.max(1, player.getStorage("twjichou").length), 5); + event.num = num; + var choices = ["选项一"]; + var choiceList = ["摸" + get.cnNumber(num) + "张牌", "视为使用一张在〖急筹〗记录内且不在〖机论〗记录内的普通锦囊牌"]; + if ( + !player.getStorage("twjichou").length || + player.getStorage("twjichou").filter(name => { + return !player.getStorage("twjilun").includes(name) && player.hasUseTarget({ name: name }); + }).length == 0 + ) + choiceList[1] = '' + choiceList[1] + ""; + else choices.push("选项二"); + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("twjilun")) + .set("ai", () => { + if (_status.event.choiceList.length == 1 || !player.getStorage("twjichou").length) return 0; + var val = _status.event.num > 3 ? Math.min(1.5, 1 + (_status.event.num - 3) * 0.1) : 1; + for (var name of player.getStorage("twjichou")) { + if (player.getStorage("twjilun").includes(name)) continue; + if (player.getUseValue({ name: name }) > 4 * val) return 1; + } + return 0; + }) + .set("num", num); + "step 1"; + if (result.control != "cancel2") { + if (result.control == "选项一") { + player.logSkill("twjilun"); + player.draw(num); + event.finish(); + } else { + var list = []; + for (var name of player.getStorage("twjichou")) { + if (!player.getStorage("twjilun").includes(name)) { + list.push(["锦囊", "", name]); + } + } + player + .chooseButton(['###机论###
    是否视为使用一张〖急筹〗已记录的普通锦囊牌?
    ', [list, "vcard"]]) + .set("filterButton", button => { + return _status.event.player.hasUseTarget({ name: button.link[2] }); + }) + .set("ai", button => { + return _status.event.getParent().player.getUseValue({ name: button.link[2] }, null, true); + }); + } + } else event.finish(); + "step 2"; + if (result.bool) { + var card = { name: result.links[0][2], isCard: true }; + player.chooseUseTarget(card, true).set("logSkill", "twjilun"); + player.markAuto("twjilun", [card.name]); + player.syncStorage("twjilun"); + } else event.goto(0); + }, + marktext: "论", + intro: { + markcount: function (storage, player) { + if (storage && storage.length) return storage.length; + return 0; + }, + content: "已记录牌名:$", + }, + ai: { + maixie: true, + maixie_defend: true, + threaten: 0.7, + }, + }, + //蹇硕 + twkunsi: { + audio: 2, + enable: "phaseUse", + onremove: true, + derivation: "twlinglu", + filter: function (event, player) { + return game.hasPlayer(function (current) { + return player.canUse({ name: "sha", isCard: true }, current, false) && current != player && !player.getStorage("twkunsi").includes(current); + }); + }, + filterTarget: function (card, player, target) { + return player.canUse({ name: "sha", isCard: true }, target, false) && target != player && !player.getStorage("twkunsi").includes(target); + }, + content: function () { + "step 0"; + player.markAuto("twkunsi", [target]); + player.storage.twkunsi.sortBySeat(); + player.markSkill("twkunsi"); + player.useCard({ name: "sha", isCard: true }, target, false).animate = false; + "step 1"; + if ( + !player.hasHistory("sourceDamage", function (evt) { + var card = evt.card; + if (!card || card.name != "sha") return false; + var evtx = evt.getParent("useCard"); + return evtx.card == card && evtx.getParent() == event; + }) + ) { + player.line(target); + target.markAuto("twlinglu", [player]); + target.addAdditionalSkills("twkunsi_temp", "twlinglu"); + player.markAuto("twkunsi_clear", [target]); + player.addTempSkill("twkunsi_clear", { player: "phaseBegin" }); + } + }, + intro: { content: "已对$发动过〖困兕〗" }, + ai: { + order: function () { + return get.order({ name: "sha" }) - 0.1; + }, + expose: 0.2, + result: { + target: function (player, target) { + if ( + target.countCards("h") <= target.hp && + !target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) && + get.effect(target, { name: "sha", isCard: true }, player, player) > 0 + ) + return -1; + else if (target.countCards("h") > target.hp && target.hp > 2 && target.hasShan()) return 1; + return 0; + }, + }, + }, + subSkill: { + clear: { + forced: true, + onremove: function (player, skill) { + var targets = player.getStorage(skill); + for (var target of targets) { + if (target.isIn()) { + target.removeAdditionalSkill("twkunsi_temp"); + } + } + }, + }, + }, + }, + twlinglu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player; + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twlinglu"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.countCards("hs") > 4 && target.hp >= 3) return att; + if (player.getStorage("twlinglu").includes(target)) return -2 * att; + return -att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twlinglu", target); + target.addTempSkill("twlinglu_order", { player: "phaseAfter" }); + if (!target.storage.twlinglu_settle) target.storage.twlinglu_settle = []; + target.storage.twlinglu_settle.unshift([player, 1]); + if (player.getStorage("twlinglu").includes(target)) + player.chooseBool("是否令" + get.translation(target) + "于〖令戮〗失败时进行两次结算?").set("ai", function () { + return true; + }); + else event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) { + target.storage.twlinglu_settle[0][1]++; + game.log(target, "于本次强令失败时进行两次结算"); + } + }, + ai: { expose: 0.2 }, + subSkill: { + order: { + audio: 2, + trigger: { source: "damageSource" }, + group: "twlinglu_settle", + silent: true, + charlotte: true, + onremove: true, + mark: true, + marktext: "令", + intro: { + content: function (storage, player) { + return "
  • 任务目标:于你下回合结束前造成的伤害不小于2点
  • 已造成" + player.countMark("twlinglu_order") + "点伤害"; + }, + }, + content: function () { + player.addMark("twlinglu_order", trigger.num, false); + }, + }, + settle: { + audio: "twlinglu_order", + trigger: { player: "phaseEnd" }, + charlotte: true, + silent: true, + onremove: true, + filter: function (event, player) { + return player.getStorage("twlinglu_settle").length > 0; + }, + content: function () { + "step 0"; + var list = player.getStorage("twlinglu_settle").shift(); + var target = list[0], + count = list[1] || 1; + event.target = target; + event.count = count; + "step 1"; + if (player.countMark("twlinglu_order") >= 2) { + game.log(player, "成功完成了", target, "发布的", "#g【令戮】", "强令"); + player.popup("强令成功", "wood"); + player.draw(2); + event.finish(); + } else { + game.log(player, "未完成", target, "发布的", "#g【令戮】", "强令"); + player.popup("强令失败", "fire"); + } + "step 2"; + if (player.countMark("twlinglu_order") >= 2) { + game.delayx(); + } else { + event.count--; + player.loseHp(); + } + "step 3"; + if (event.count > 0) event.goto(2); + "step 4"; + if (player.getStorage("twlinglu_settle").length > 0) { + event.goto(0); + game.delayx(); + } + }, + }, + }, + }, + //马腾 + twxiongzheng: { + audio: 2, + onremove: true, + trigger: { global: "roundStart" }, + direct: true, + content: function () { + "step 0"; + var target = player.storage.twxiongzheng_target; + delete player.storage.twxiongzheng_target; + if (!target) { + event.goto(4); + return; + } + event.target = target; + var list = [], + list2 = []; + var history = target.actionHistory; + if (history.length < 2) { + event.goto(4); + return; + } + for (var i = history.length - 2; i >= 0; i--) { + for (var evt of history[i].damage) { + if (evt.source) list.add(evt.source); + } + if (history[i].isRound) break; + } + var list2 = game.filterPlayer(i => i != player).removeArray(list); + event.list = list; + event.list2 = list2; + var choiceList = ["视为对任意名上一轮未对" + get.translation(target) + "造成过伤害的角色使用一张【杀】", "令任意名上一轮对" + get.translation(target) + "造成过伤害的角色摸两张牌"]; + var choices = []; + if (list2.length) { + choices.push("选项一"); + choiceList[0] += "(" + get.translation(list2) + ")"; + } else choiceList[0] = '' + choiceList[0] + ""; + if (list.length) { + choices.push("选项二"); + choiceList[1] += "(" + get.translation(list) + ")"; + } else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "雄争:是否选择一项?") + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player; + var list = _status.event.getParent().list, + list2 = _status.event.getParent().list2; + var eff = list + .map(target => { + if (target == player) return 0; + return get.effect(target, { name: "sha" }, player, player); + }) + .reduce((p, c) => p + c, 0), + eff2 = list2.map(target => 2 * get.effect(target, { name: "draw" }, player, player)).reduce((p, c) => p + c, 0); + if (_status.event.controls.includes("选项二") && eff2 > eff) return "选项二"; + if (eff > 0) return 0; + return "cancel2"; + }); + "step 1"; + if (result.control == "选项一") { + event.bool = true; + if (event.list2.length) + player + .chooseTarget("雄争:请选择任意名满足条件的角色,你视为依次对这些角色使用一张杀", [1, Infinity], true, function (card, player, target) { + return player.canUse("sha", target, false, false) && _status.event.getParent().list2.includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); + else event.finish(); + } else if (result.control == "选项二") { + event.bool = false; + if (event.list.length) + player + .chooseTarget("雄争:请选择任意名满足条件的角色,这些角色摸两张牌", [1, Infinity], true, function (card, player, target) { + return _status.event.getParent().list.includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "draw" }, player, player); + }); + else event.finish(); + } else event.goto(3); + "step 2"; + result.targets.sortBySeat(); + player.logSkill("twxiongzheng", result.targets); + if (event.bool) { + for (var i of result.targets) player.useCard({ name: "sha", isCard: true }, i, false); + } else game.asyncDraw(result.targets, 2); + "step 3"; + if ( + !game.hasPlayer(function (current) { + return !player.getStorage("twxiongzheng").includes(current); + }) + ) + event.finish(); + else game.delayx(); + "step 4"; + player + .chooseTarget(get.prompt("twxiongzheng"), "选择一名未选择过的角色,称为“雄争”角色", function (card, player, target) { + return !player.getStorage("twxiongzheng").includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (game.roundNumber <= 1 && player.hasUnknown()) return 0; + return -att; + }); + "step 5"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twxiongzheng", target); + player.markAuto("twxiongzheng", [target]); + player.storage.twxiongzheng_target = target; + player.addTempSkill("twxiongzheng_mark", "roundStart"); + target.addTempSkill("twxiongzheng_threaten", "roundStart"); + game.delayx(); + } + }, + subSkill: { + mark: { + intro: { + content: "$参与了〖雄争〗的争斗", + onunmark: true, + }, + charlotte: true, + onremove: true, + trigger: { global: "damage" }, + firstDo: true, + direct: true, + filter: function (event, player) { + return event.player == player.storage.twxiongzheng_target && get.itemtype(event.source) == "player"; + }, + content: function () { + player.markAuto("twxiongzheng_mark", [trigger.source]); + }, + }, + threaten: { + mark: true, + intro: { content: "本轮〖雄争〗目标" }, + ai: { threaten: 10 }, + }, + }, + }, + twluannian: { + audio: 2, + global: "twluannian_global", + unique: true, + zhuSkill: true, + subSkill: { + global: { + audio: "twluannian", + enable: "phaseUse", + usable: 1, + forceaudio: true, + onChooseToUse: function (event) { + if (!game.online) { + var num = 1; + game.countPlayer2(current => { + var history = current.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + for (var evt of history[i].useSkill) { + if (evt.skill == "twluannian_global") num++; + } + if (history[i].isRound) break; + } + }); + event.set("twluannian_num", num); + } + }, + filter: function (event, player) { + if (!event.twluannian_num) return false; + return ( + player.group == "qun" && + player.countCards("he") >= event.twluannian_num && + game.hasPlayer(function (current) { + var target = current.storage.twxiongzheng_target; + return target && target.isIn() && current != player && current.hasZhuSkill("twluannian", player); + }) + ); + }, + filterCard: true, + position: "he", + prompt: function () { + var player = _status.event.player; + var num = _status.event.twluannian_num; + var list = game + .filterPlayer(function (current) { + return current.hasZhuSkill("twluannian", player); + }) + .map(i => i.storage.twxiongzheng_target) + .sortBySeat(); + return "弃置" + get.cnNumber(num) + "张牌,对" + get.translation(list) + (list.length > 1 ? "中的一人" : "") + "造成1点伤害"; + }, + selectCard: function () { + return _status.event.twluannian_num; + }, + complexSelect: true, + complexCard: true, + filterTarget: function (card, player, target) { + return game + .filterPlayer(function (current) { + return current.hasZhuSkill("twluannian", player); + }) + .map(i => i.storage.twxiongzheng_target) + .includes(target); + }, + selectTarget: function () { + return game + .filterPlayer(function (current) { + return current.hasZhuSkill("twluannian", _status.event.player); + }) + .map(i => i.storage.twxiongzheng_target) + .filter(i => i && i.isIn()).length > 1 + ? 1 + : -1; + }, + check: function (card) { + return 6 - get.value(card); + }, + content: function () { + target.damage(); + }, + ai: { + order: 7, + result: { + target: function (player, target) { + return get.damageEffect(target, player, target); + }, + }, + expose: 0.25, + }, + }, + }, + ai: { + combo: "twxiongzheng", + }, + }, + //鲍信 + twmutao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("h"); + }, + content: function () { + "step 0"; + event.togive = target.getNext(); + var cards = target.getCards("h", { name: "sha" }); + if (!cards.length) { + game.log("但", target, "没有", "#y杀", "!"); + event.finish(); + } + "step 1"; + var cards = target.getCards("h", { name: "sha" }), + card = cards.randomRemove(1)[0]; + target.give(card, event.togive); + if (cards.length) { + event.togive = event.togive.getNext(); + event.redo(); + } + "step 2"; + target.line(event.togive); + event.togive.damage(Math.min(2, event.togive.countCards("h", { name: "sha" })), target); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + var num = 0, + numx = target.countCards("h", { name: "sha" }), + targetx = target; + for (var i = 0; i < numx; i++) { + targetx = targetx.next; + if (targetx == player) targetx = targetx.next; + } + var att1 = get.attitude(player, target), + att2 = get.attitude(player, targetx); + if (att1 > 0 && att2 < 0) num = 0.25; + if (att1 < 0 && att2 < 0) num = 4; + return att1 * num * numx * (targetx.countCards("h", { name: "sha" }) + 1); + }, + }, + }, + }, + twyimou: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return event.player.isIn() && get.distance(player, event.player) <= 1; + }, + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + content: function () { + "step 0"; + if (trigger.player != player) player.addExpose(0.3); + var target = get.translation(trigger.player); + var choiceList = ["令" + target + "获得牌堆里的一张【杀】", "令" + target + "将一张牌交给另一名角色,然后" + target + "摸两张牌", "背水!" + (trigger.player != player ? "将所有手牌交给" + target + ",然后" : "") + "依次执行以上所有选项"]; + var list = ["选项一"]; + if (trigger.player.countCards("h")) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (player.countCards("h")) list.push("背水!"); + else choiceList[2] = '' + choiceList[2] + ""; + player + .chooseControl(list) + .set("prompt", "毅谋:请选择一项") + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event.getTrigger(), + list = _status.event.list; + var player = _status.event.player; + var target = evt.player; + if ((target.hp >= target.countCards("h") + 2 || target == player) && list.includes("背水!")) return "背水!"; + if (target.countCards("h") && list.includes("选项二")) return "选项二"; + return "选项一"; + }) + .set("list", list); + "step 1"; + event.choice = result.control; + if (event.choice == "背水!" && player != trigger.player) player.give(player.getCards("h"), trigger.player); + "step 2"; + if (event.choice != "选项二") { + var card = get.cardPile2(function (card) { + return card.name == "sha"; + }); + if (card) trigger.player.gain(card, "gain2"); + else game.log("但牌堆里已经没有", "#y杀", "了!"); + if (event.choice == "选项一") event.finish(); + } + "step 3"; + if (event.choice != "选项一") { + if (trigger.player.countCards("h")) + trigger.player.chooseCardTarget({ + prompt: "将一张手牌交给另一名其他角色并摸两张牌", + filterCard: true, + forced: true, + filterTarget: lib.filter.notMe, + ai1: function (card) { + return 1 / Math.max(0.1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 9; + return 4 + att; + }, + }); + else event.finish(); + } + "step 4"; + var target = result.targets[0]; + trigger.player.line(target); + trigger.player.give(result.cards, target); + trigger.player.draw(2); + }, + ai: { + threaten: 2.5, + }, + }, + //刘夫人 + twzhuidu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.isDamaged(); + }); + }, + filterTarget: function (card, player, target) { + if (player == target) return false; + return target.isDamaged(); + }, + chooseButton: { + dialog: function (event, player) { + var name = get.translation(event.result.targets[0]); + var dialog = ui.create.dialog("追妒:选择一项", "hidden"); + dialog.add([ + [ + ["damage", "对" + name + "造成1点伤害"], + ["discard", "弃置" + name + "装备区里的一张牌"], + ["both", "背水!若该角色为女性,弃置一张牌,然后依次执行以上所有选项"], + ], + "textbutton", + ]); + return dialog; + }, + filter: function (button, player) { + var target = _status.event.getParent().result.targets[0]; + var link = button.link; + if (link == "damage") return true; + if (link == "discard") return target.countCards("e"); + return target.hasSex("female") && player.countDiscardableCards(player, "he") > 0; + }, + check: function (button) { + switch (button.link) { + case "damage": + return 10; + case "discard": + return 1; + case "both": + return 15; + } + }, + backup: function (links) { + var backup = { + audio: "twzhuidu", + target: _status.event.result.targets[0], + choice: links[0], + filterTarget: function (card, player, target) { + return target == lib.skill.twzhuidu_backup.target; + }, + selectTarget: -1, + content: function () { + var target = lib.skill.twzhuidu_backup.target; + var choice = lib.skill.twzhuidu_backup.choice; + if (choice != "discard") target.damage(); + if (choice != "damage") player.discardPlayerCard(target, "e", true); + }, + }; + if (links[0] == "both") { + backup.filterCard = true; + backup.position = "he"; + } + return backup; + }, + prompt: function (links) { + var name = get.translation(_status.event.result.targets[0]); + switch (links[0]) { + case "damage": + return "对" + name + "造成1点伤害"; + case "discard": + return "弃置" + name + "装备区里的一张牌"; + case "both": + return "背水!弃置一张牌,然后对" + name + "造成1点伤害并弃置其装备区里的一张牌"; + } + }, + }, + subSkill: { + backup: {}, + }, + ai: { + order: 7, + result: { + target: function (player, target) { + if (target.hasSex("female") && target.countCards("e") && player.countCards("he")) return -2; + return -1; + }, + }, + }, + }, + twshigong: { + audio: 2, + trigger: { player: "dying" }, + filter: function (event, player) { + var target = _status.currentPhase; + return player.hp <= 0 && target && target.isIn() && target != player; + }, + skillAnimation: true, + animationColor: "gray", + limited: true, + logTarget: function (event, player) { + return _status.currentPhase; + }, + content: function () { + "step 0"; + player.awakenSkill("twshigong"); + var target = _status.currentPhase; + if (target.hp <= 0) event._result = { bool: false }; + else + target + .chooseToDiscard("h", target.hp, get.translation(player) + "对你发动了【示恭】,是否弃置" + get.cnNumber(target.hp) + "张手牌?", "若如此做,其将体力回复至1点;或者点击“取消”加1点体力上限并回复1点体力,摸一张牌,然后其将体力回复至体力上限") + .set("ai", card => { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }) + .set("goon", get.attitude(target, player) >= 0); + "step 1"; + var target = _status.currentPhase; + if (result.bool) { + var num = 1 - player.hp; + if (num > 0) player.recover(num); + event.finish(); + } else { + target.gainMaxHp(); + target.recover(); + target.draw(); + } + "step 2"; + var num = player.maxHp - player.hp; + if (num > 0) player.recover(num); + }, + }, + //王淩 + twmibei: { + audio: "mibei", + trigger: { player: "useCardAfter" }, + group: ["twmibei_mark", "twmibei_fail"], + forced: true, + locked: false, + direct: true, + dutySkill: true, + derivation: "twmouli", + filter: function (event, player) { + var map = { basic: 0, trick: 0, equip: 0 }; + for (var name of player.getStorage("twmibei")) { + var type = get.type2(name); + if (typeof map[type] == "number") map[type]++; + } + for (var i in map) { + if (map[i] < 2) return false; + } + return true; + }, + content: function () { + player.awakenSkill("twmibei"); + player.logSkill("twmibei_achieve"); + game.log(player, "成功完成使命"); + player.addSkills("twmouli"); + }, + intro: { content: "已使用牌名:$" }, + subSkill: { + achieve: { + audio: "mibei1", + skillAnimation: true, + animationColor: "water", + }, + mark: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + return !player.getStorage("twmibei").includes(event.card.name); + }, + charlotte: true, + forced: true, + silent: true, + dutySkill: true, + content: function () { + player.markAuto("twmibei", [trigger.card.name]); + }, + }, + fail: { + audio: "mibei2", + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + return !player.getHistory("useCard").length; + }, + content: function () { + game.log(player, "使命失败"); + delete player.storage.twmibei; + player.addTempSkill("twmibei_less"); + player.addMark("twmibei_less", 1, false); + }, + }, + less: { + charlotte: true, + marktext: "缚", + intro: { content: "本回合手牌上限-#" }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("twmibei_less"); + }, + }, + }, + }, + }, + twxingqi: { + audio: "xingqi", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + var num = 0; + game.countPlayer(function (current) { + num += current.countCards("ej"); + }); + return num > player.hp; + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + player.awakenSkill("twxingqi"); + player.recover(); + if (!player.awakenedSkills.includes("twmibei")) { + var list = ["basic", "equip", "trick"], + cards = []; + for (var i of list) { + var card = get.cardPile2(function (card) { + return get.type(card) == i; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + } else player.addSkill("twxingqi_range"); + }, + subSkill: { + range: { + charlotte: true, + mark: true, + marktext: "启", + mod: { + targetInRange: () => true, + }, + intro: { content: "使用牌无距离限制" }, + }, + }, + }, + twmouli: { + audio: "mouli", + enable: "chooseToUse", + filter: function (event, player) { + if (event.type == "wuxie") return false; + if (player.hasSkill("twmouli_used")) return false; + if (!Array.isArray(event.twmouli)) return false; + for (var card of event.twmouli) { + if (event.filterCard(card, player, event)) return true; + } + return false; + }, + onChooseToUse: function (event) { + if (game.online || !event.player.hasSkill("twmouli")) return; + var cards = []; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (get.type(card) == "basic") cards.push(card); + } + event.set("twmouli", cards); + }, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("谋立", "hidden"); + if (event.twmouli && event.twmouli.length) dialog.add(event.twmouli); + else dialog.addText("牌堆里没有基本牌"); + return dialog; + }, + filter: function (button, player) { + var evt = _status.event.getParent(), + card = button.link; + if (evt && evt.filterCard) return evt.filterCard(card, player, evt); + return false; + }, + check: function (button) { + var player = _status.event.player, + card = button.link; + if (_status.event.type != "phase") return 1; + if (_status.event.dying) return get.attitude(player, _status.event.dying); + if (card.name == "jiu") return player.getUseValue(card); + return player.getUseValue(card) / 4; + }, + backup: function (links, player) { + return { + audio: "mouli", + filterCard: () => false, + selectCard: -1, + viewAs: { name: links[0].name, isCard: true, cards: [links[0]] }, + popname: true, + precontent: function () { + player.logSkill("twmouli"); + player.addTempSkill("twmouli_used"); + 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; + var next = game.createEvent("twmouli_update"); + event.next.remove(next); + event.getParent().after.push(next); + next.setContent(function () { + game.updateRoundNumber(); + }); + }, + }; + }, + prompt: function (links, player) { + return "使用牌堆中的" + get.translation(links); + }, + }, + hiddenCard: function (player, name) { + return get.type(name) == "basic" && !player.getStat("skill").twmouli; + }, + subSkill: { + used: { charlotte: true }, + }, + ai: { + effect: { + target: function (card, player, target, effect) { + if (get.tag(card, "respondShan")) return 0.7; + if (get.tag(card, "respondSha")) return 0.7; + }, + }, + order: 11, + respondSha: true, + respondShan: true, + fireAttack: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + var list = []; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (get.type(card, player) == "basic" && !list.includes(card.name)) list.push(card.name); + } + if (tag == "respondSha") return list.includes("sha"); + if (tag == "respondShan") return list.includes("shan"); + return !player.getStat("skill").twmouli; + }, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + }, + //诸葛果 + twqirang: { + audio: "qirang", + trigger: { player: "equipEnd" }, + frequent: true, + content: function () { + var card = get.cardPile(function (card) { + return get.type2(card) == "trick"; + }); + if (card) { + player.gain(card, "gain2").gaintag.add("twqirang"); + player.addTempSkill("twqirang_use"); + player.addTempSkill("twqirang_clear", ["phaseZhunbeiAfter", "phaseDrawAfter", "phaseUseAfter", "phaseDiscardAfter", "phaseJieshuAfter", "phaseAfter"]); + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, + }, + subSkill: { + clear: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("twqirang"); + }, + }, + use: { + audio: "qirang", + trigger: { player: "useCard2" }, + forced: true, + filter: function (event, player) { + if (get.type2(event.card) != "trick") return false; + if ( + !player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twqirang")) return true; + } + return false; + }) + ) + return false; + return true; + }, + content: function () { + "step 0"; + game.log(trigger.card, "不可被响应"); + trigger.directHit.addArray(game.players); + var info = get.info(trigger.card); + if (info.allowMultiple == false) event.finish(); + else if (trigger.targets) { + if ( + !info.multitarget && + !game.hasPlayer(function (current) { + return !trigger.targets.includes(current) && lib.filter.targetEnabled2(trigger.card, player, current); + }) + ) + event.finish(); + } else event.finish(); + "step 1"; + var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; + player + .chooseTarget(get.prompt("twqirang"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return true; + return lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 2"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else event.finish(); + "step 3"; + if (event.targets) { + player.line(event.targets); + if (trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); + else trigger.targets.addArray(event.targets); + } + }, + mod: { + targetInRange: function (card, player, target) { + if (!card.cards) return; + for (var i of card.cards) { + if (i.hasGaintag("twqirang")) return true; + } + }, + }, + }, + }, + }, + twyuhua: { + audio: "yuhua", + frequent: true, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (event.name == "gain" && player == event.player) return false; + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + for (var i of evt.cards2) { + if (get.type(i, player) != "basic") return true; + } + return false; + }, + content: function () { + "step 0"; + var num = 0, + evt = trigger.getl(player); + for (var i of evt.cards2) { + if (get.type(i, player) != "basic" && num < 5) num++; + } + player.chooseToGuanxing(num); + player.chooseBool("羽化:是否摸" + get.cnNumber(num) + "张牌?").set("frequentSkill", "twyuhua"); + event.num = num; + "step 1"; + if (result.bool) player.draw(num); + }, + mod: { + ignoredHandcard: function (card, player) { + if (get.type(card) != "basic") return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.type(card) != "basic") return false; + }, + }, + }, + //樊稠 + twxingluan: { + audio: "xinfu_xingluan", + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + "step 0"; + event.cards = game.cardsGotoOrdering(get.cards(6)).cards; + event.list = []; + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str; + if (player == game.me && !_status.auto) str = "兴乱:选择分配一种类别的牌"; + else 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 = ["basic", "trick", "equip"].filter(type => cards.some(card => get.type2(card) == type)); + let fs = game + .filterPlayer(i => get.attitude(_status.event.player, i) > 0) + .sort((a, b) => { + if (a === player) { + //尽量把player往前放 + if (a.hp < b.hp) return 1; + return -1; + } + if (b === player) { + if (b.hp < a.hp) return -1; + return 1; + } + return b.hp - a.hp; + }), + es = game.filterPlayer(i => get.attitude(_status.event.player, i) < 0).sort((a, b) => a.hp - b.hp), + types = list + .map(type => { + let num = 0; + for (let i of event.cards) { + if (get.type2(i) == type) num++; + } + return [type, num]; + }) + .sort((a, b) => b[1] - a[1]); + event.tempCache = { + max: -Infinity, + tars: [], + }; + for (let idx = 0; idx < types.length; idx++) { + let f, + e, + temp = 0, + tars = [], + type = types[idx][1]; + if (es.length * 3 >= type) { + //都分给敌人 + e = -type; + while (temp < es.length && temp < type) { + e += 10 / (2 + es[temp].hp); + tars.push(es[temp]); + temp++; + } + if (e > event.tempCache.max) { + event.tempCache.type = types[idx][0]; + event.tempCache.max = e; + event.tempCache.tars = tars.slice(0); + delete event.tempCache.more; + } + } + if (fs.length * 3 >= type) { + //都分给队友 + tars = []; + f = type - 10 / (2 + fs[0].hp); + temp = type - Math.max(3, type); //让血厚的尽可能多拿 + if (temp) { + if (fs.length < 3) { + tars.push(fs[1]); + if (temp >= 3) f -= 10 / (2 + fs[1].hp); + } else { + if (player !== fs[0]) { + tars.push(player); + temp -= Math.max(2, temp); + } + if (temp) + tars.addArray( + fs + .filter(i => fs[0] !== i && player !== i) + .sort((a, b) => { + return get.attitude(_status.event.player, b) - get.attitude(_status.event.player, a); + }) + .slice(temp < 3 ? -1 : -2) + ); + } + } + if (f > event.tempCache.max) { + event.tempCache.type = types[idx][0]; + event.tempCache.max = f; + event.tempCache.more = fs[0]; + event.tempCache.tars = tars.slice(0); + } + } + } + player + .chooseControl(list) + .set("ai", function () { + return _status.event.type; + }) + .set("type", event.tempCache.type); + "step 2"; + game.broadcastAll("closeDialog", event.videoId); + event.cardsx = []; + var type = result.control; + for (var j of cards) { + if (type == get.type2(j)) event.cardsx.push(j); + } + var time = 1000 - (get.utc() - event.time); + if (time > 0) game.delay(0, time); + player.$gain2(event.cardsx, false); + game.delayx(); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + event.num = 0; + "step 3"; + if (event.cardsx.length > 1) { + player.chooseCardButton("兴乱:请选择要分配的牌", true, event.cardsx, [1, Math.min(3, event.cardsx.length)]).set("ai", function (button) { + if (ui.selected.buttons.length == 0) return get.buttonValue(button); + return 0; + }); + } else if (event.cardsx.length == 1) { + event._result = { links: event.cardsx.slice(0), bool: true }; + } else { + event.goto(6); + } + "step 4"; + if (result.bool) { + var cards = result.links; + event.togive = cards.slice(0); + player + .chooseTarget("选择获得" + get.translation(cards) + "的角色", event.cardsx.length == 1, (card, player, target) => { + var map = _status.event.getParent().given_map; + var togive = _status.event.getParent().togive; + return (map[target.playerid] || []).length + togive.length <= 3; + }) + .set("ai", function (target) { + let targets = _status.event.targets, + att = get.attitude(_status.event.player, target); + if (targets.length) { + if (targets.includes(target)) return Math.max(1, att * _status.event.value); + return 0; + } + return att * _status.event.value; + }) + .set( + "value", + cards.reduce((p, c) => p + get.value(c, player, "raw"), 0) + ) + .set("more", event.tempCache.more) + .set( + "targets", + (function () { + let arr = [], + arr2 = []; + if (event.tempCache.more && (event.given_map[event.tempCache.more.playerid] || []).length + cards.length <= 3) return [event.tempCache.more]; + for (let cur of event.tempCache.tars) { + let map = (event.given_map[cur.playerid] || []).length; + if (map + cards.length <= 3) { + if (map) arr2.push(cur); + else arr.push(cur); + } + } + if (arr.length) return arr; + return arr2; + })() + ); + } + "step 5"; + if (result.bool) { + event.cardsx.removeArray(event.togive); + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; + map[id].addArray(event.togive); + } + if (event.cardsx.length > 0) event.goto(3); + } else event.goto(3); + "step 6"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + if (player == source) event.num += event.given_map[i].length; + player.line(source, "green"); + game.log(source, "获得了", event.given_map[i]); + list.push([source, event.given_map[i]]); + } + game.loseAsync({ + gain_list: list, + giver: player, + animate: "gain2", + }).setContent("gaincardMultiple"); + "step 7"; + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + if (event.given_map[i].length >= num) list.push(source); + } + list.sortBySeat(); + player.line(list); + for (var i of list) { + i.loseHp(); + } + }, + }, + //许靖 + twboming: { + audio: "boming", + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return player.countCards("he"); + }, + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + content: function () { + player.give(cards, target); + }, + check: function (card) { + return 5 - get.value(card); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var card = ui.selected.cards[0]; + if (get.attitude(player, target) < 0 && player.hasSkill("twejian")) { + var dam = get.damageEffect(target, player, target); + if (dam > 0) return dam; + var type = get.type(card, target), + ts = target.getCards("he", function (card) { + return get.type(card) == type; + }); + if (ts.length) { + var val = get.value(ts, target); + if (val > get.value(card)) return -Math.max(1, val); + return 0; + } + } + return get.value(card, target) / 1.5; + }, + }, + }, + group: "twboming_draw", + subSkill: { + draw: { + audio: "boming", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + var num = 0; + for (var target of game.filterPlayer(i => i != player)) { + target.getHistory("gain", evt => (num += evt.cards.length)); + if (num > 1) return true; + } + return false; + }, + content: function () { + player.draw(2); + }, + }, + }, + }, + twejian: { + audio: "ejian", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + filter: function (event, player) { + if (event.name == "gain") { + var cards = event.getg(event.player); + if (!cards.length) return false; + var cards2 = event.getl(player).cards2; + for (var i of cards2) { + if ( + cards.includes(i) && + event.player.countCards("he", card => { + return card != i && get.type2(card) == get.type2(i); + }) + ) + return true; + } + return false; + } else { + if (event.type != "gain") return false; + var cards = event.getl(player).cards2; + if (!cards.length) return false; + return game.hasPlayer(current => { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if ( + cards.includes(i) && + current.countCards("he", card => { + return card != i && get.type2(card) == get.type2(i); + }) + ) + return true; + } + return false; + }); + } + }, + logTarget: function (event, player) { + if (event.name == "gain") return event.player; + else { + var cards = event.getl(player).cards2; + return game.filterPlayer(current => { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if ( + cards.includes(i) && + current.countCards("he", card => { + return card != i && get.type2(card) == get.type2(i); + }) + ) + return true; + } + return false; + }); + } + }, + direct: true, + content: function () { + "step 0"; + if (trigger.name == "gain") event.targets = [trigger.player]; + else { + var cards = trigger.getl(player).cards2; + event.targets = game.filterPlayer(current => { + if (current == player) return false; + var cardsx = trigger.getg(current); + for (var i of cardsx) { + if ( + cards.includes(i) && + current.countCards("he", card => { + return card != i && get.type2(card) == get.type2(i); + }) + ) + return true; + } + return false; + }); + } + "step 1"; + var target = event.targets.shift(); + event.target = target; + player.chooseBool(get.prompt("twejian", target), "当其他角色得到你的牌后,若其有其他与此牌类型相同的牌,你可以令其选择一项:1.受到你造成的1点伤害;2.弃置这些牌").set("ai", () => { + return get.attitude(player, _status.event.getParent().target) < 0; + }); + "step 2"; + if (result.bool) { + player.logSkill("twejian", target); + var cards = trigger.getg(target); + event.cards = cards; + event.cardType = []; + for (var card of cards) { + event.cardType.add(get.type(card, "trick", target)); + } + var list = ["选项一", "选项二"]; + target + .chooseControl(list) + .set("prompt", "恶荐:请选择一项") + .set("choiceList", ["受到1点伤害", "弃置所有除" + get.translation(cards) + "外的" + get.translation(event.cardType) + "牌"]) + .set("ai", function () { + var player = _status.event.player; + var types = _status.event.cardType, + cards = player.getCards("he", function (card) { + return types.includes(get.type2(card)); + }); + if (cards.length == 1) return "选项二"; + if (cards.length >= 2) { + for (var i = 0; i < cards.length; i++) { + if (get.tag(cards[i], "save")) return "选项一"; + } + } + if (player.hp == 1) return "选项二"; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i]) >= 8) return "选项一"; + } + if (cards.length > 2 && player.hp > 2) return "选项一"; + if (cards.length > 3) return "选项一"; + return "选项二"; + }) + .set("cardType", event.cardType); + } else event.goto(4); + "step 3"; + if (result.control == "选项一") target.damage(); + else + target.discard( + target.getCards("he", card => { + return event.cardType.includes(get.type2(card)) && !cards.includes(card); + }) + ); + "step 4"; + if (event.targets.length > 0) event.goto(1); + else event.finish(); + }, + ai: { + expose: 0.3, + }, + }, + //张飞 + twxuhe: { + audio: "retishen", + trigger: { player: "shaMiss" }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + logTarget: "target", + content: function () { + "step 0"; + trigger.target + .chooseControl() + .set("choiceList", ["受到" + get.translation(player) + "对你造成的1点伤害", "令" + get.translation(player) + "使用的下一张牌对你造成的伤害+2"]) + .set("ai", function () { + var target = _status.event.player, + player = _status.event.getParent().player; + if ( + target.hp <= 3 && + target.hp > 1 && + player.countCards("hs", function (card) { + return get.tag(card, "damage") && player.canUse(card, target); + }) > 0 + ) + return 0; + return 1; + }); + "step 1"; + var target = trigger.target; + switch (result.index) { + case 0: + player.line(target, "fire"); + target.damage(); + break; + case 1: + target.line(player, "fire"); + player.storage.twxuhe_damage = target; + trigger.getParent().twxuhe = true; + player.addTempSkill("twxuhe_damage"); + break; + } + }, + subSkill: { + damage: { + charlotte: true, + onremove: true, + mark: true, + intro: { content: "本回合使用的下一张牌对$造成伤害时,此伤害+2" }, + trigger: { + source: "damageBegin1", + player: "useCardAfter", + }, + direct: true, + filter: function (event, player) { + if (event.name == "useCard") return !event.twxuhe; + if (!event.card) return false; + var evt = event.getParent(2); + var history = player.getHistory("useCard"); + return evt.name == "useCard" && history[history.indexOf(evt) - 1].twxuhe; + }, + content: function () { + if (trigger.name != "useCard") trigger.num += 2; + player.removeSkill("twxuhe_damage"); + }, + }, + }, + }, + //薛综 + twjiexun: { + intro: { content: "已发动#次" }, + audio: "jiexun", + trigger: { player: "phaseJieshuBegin" }, + onremove: true, + direct: true, + derivation: ["twfunanx", "twjiexunx"], + content: function () { + "step 0"; + var suits = {}; + game.countPlayer(current => { + for (var card of current.getCards("ej")) { + if (typeof suits[get.suit(card)] != "number") suits[get.suit(card)] = 0; + suits[get.suit(card)]++; + } + }); + var choices = lib.suit.slice(); + choices.push("cancel2"); + var str = lib.suit + .map(suit => { + return get.translation(suit) + ":" + get.cnNumber(suits[suit] || 0) + "张"; + }) + .join(";"); + player + .chooseControl(choices) + .set("prompt", get.prompt("twjiexun") + "(已发动过" + get.cnNumber(player.countMark("twjiexun")) + "次)") + .set("ai", function () { + var player = _status.event.player; + var map = {}; + game.countPlayer(current => { + for (var card of current.getCards("ej")) { + if (typeof map[get.suit(card)] != "number") map[get.suit(card)] = 0; + map[get.suit(card)]++; + } + }); + for (var suit in map) map[suit] = Math.abs(map[suit]); + var bool = game.hasPlayer(current => get.attitude(player, current) > 0 && player != current); + var list = lib.suit.slice().sort((a, b) => (bool ? 1 : -1) * ((map[b] || 0) - (map[a] || 0))); + if ((bool && map[list[0]] > 0) || !bool || player.hasMark("twjiexun")) return list[0]; + return "cancel2"; + }) + .set("prompt2", get.skillInfoTranslation("twjiexun", player) + "
    " + str); + "step 1"; + if (result.control != "cancel2") { + var suit = result.control; + event.suit = suit; + var num1 = game.countPlayer(function (current) { + return current.countCards("ej", { suit: suit }); + }); + var num2 = player.countMark("twjiexun"); + event.num1 = num1; + event.num2 = num2; + var str = "令一名其他角色摸" + get.cnNumber(num1) + "张牌"; + if (num2) str += ",然后弃置" + get.cnNumber(num2) + "张牌"; + player + .chooseTarget("请选择【诫训】的目标", str, lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + return _status.event.eff * get.sgn(att) + att / 114514; + }) + .set("eff", num1 >= num2 && num1 > 0 ? 1 : -1); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twjiexun", target); + if (player.hasMark("twjiexun") || event.num1) player.addExpose(0.2); + player.popup(event.suit); + game.log(player, "选择了", "#y" + get.translation(event.suit)); + player.addMark("twjiexun", 1, false); + if (event.num1) target.draw(event.num1); + } else event.finish(); + "step 3"; + if (event.num2) target.chooseToDiscard(event.num2, true, "he"); + else event.finish(); + "step 4"; + if (result.bool && result.autochoose && result.cards.length == result.rawcards.length && !player.hasSkill("funan_jiexun")) { + player + .chooseControl() + .set("choiceList", ["摸" + get.cnNumber(event.num2) + "张牌,将【诫训】的发动次数归零", "修改【复难】和【诫训】"]) + .set("ai", () => _status.event.choice) + .set("prompt", "诫训:选择一项") + .set("choice", event.num2 >= 4 ? 0 : event.num2 <= 1 ? 1 : [0, 1].randomGet()); + } else event.finish(); + "step 5"; + if (result.index == 0) { + player.draw(event.num2); + player.removeMark("twjiexun", player.countMark("twjiexun"), false); + game.log(player, "归零了", "#g【诫训】", "的发动次数"); + } else { + game.log(player, "修改了", "#g【复难】", "和", "#g【诫训】"); + player.addSkill("funan_jiexun"); + } + }, + }, + //张宁 + twxingzhui: { + audio: 2, + enable: "phaseUse", + usable: 1, + mahouSkill: true, + filter: function (event, player) { + return !player.hasSkill("twxingzhui_mahou"); + }, + content: function () { + "step 0"; + player.loseHp(); + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + return 2; + }); + "step 1"; + player.storage.twxingzhui_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twxingzhui_mahou", { player: "die" }); + }, + ai: { + order: 2, + result: { + player: function (player, target) { + if (!player.hasFriend()) return 0; + if (player.hp > 1) return 1; + return 0; + }, + }, + }, + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; + var list = player.storage.twxingzhui_mahou; + list[1]--; + if (list[1] == 0) { + game.log(player, "的", "#g星坠", "魔法生效"); + player.logSkill("twxingzhui"); + var num = list[0]; + event.num = num; + var cards = game.cardsGotoOrdering(get.cards(num * 2)).cards; + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【星坠】"); + player.removeSkill("twxingzhui_mahou"); + } else { + game.log(player, "的", "#g星坠", "魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twxingzhui_mahou"); + event.finish(); + } + "step 1"; + var cards2 = []; + for (var card of event.cards) { + if (get.color(card, false) == "black") cards2.push(card); + } + if (!cards2.length) event.finish(); + else { + event.cards2 = cards2; + var str = "令一名其他角色获得其中的黑色牌(" + get.translation(cards2) + ")"; + if (cards2.length >= event.num) str += ",然后对其造成" + get.cnNumber(event.num) + "点伤害"; + player.chooseTarget("请选择〖星坠〗的目标", str, lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + if (_status.event.getParent().cards2.length >= _status.event.getParent().num) return get.damageEffect(target, player, player, "thunder"); + return get.attitude(player, target); + }); + } + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + target.gain(event.cards2, "gain2"); + if (event.cards2.length >= num) target.damage(event.num, "thunder"); + } + }, + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:星坠", + markcount: function (storage) { + if (storage) return storage[1]; + return 0; + }, + content: function (storage) { + if (storage) return "经过" + storage[1] + "个“回合结束时”后,亮出牌堆顶的" + get.cnNumber(storage[0] * 2) + "张牌并执行后续效果"; + return "未指定施法效果"; + }, + }, + }, + }, + }, + twjuchen: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > player.countCards("h"); + }) && + game.hasPlayer(function (current) { + return current != player && current.hp > player.hp; + }) + ); + }, + logTarget: function (event, player) { + return game.players.sortBySeat(player); + }, + content: function () { + "step 0"; + event.num = 0; + event.cards = []; + event.targets = game.players.sortBySeat(player); + "step 1"; + var target = targets[num]; + if (target.countCards("he")) target.chooseToDiscard("he", true); + else event._result = { bool: false }; + "step 2"; + if (result.bool && Array.isArray(result.cards)) event.cards.addArray(result.cards); + event.num++; + if (event.num < targets.length) event.goto(1); + else game.delayx(); + "step 3"; + var cards = cards.filter(function (i) { + return get.position(i, true) == "d" && get.color(i, false) == "red"; + }); + if (cards.length) player.gain(cards, "gain2"); + }, + }, + //于夫罗 + twjiekuang: { + audio: 2, + trigger: { global: "useCardToTargeted" }, + filter: function (event, player) { + if (!event.target || event.targets.length > 1) return false; + if (_status.dying.length) return false; + if (player == event.player) return false; + if (event.target.hp >= player.hp) return false; + if (!["basic", "trick"].includes(get.type(event.card))) return false; + return true; + }, + usable: 1, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("失去体力", "减体力上限", "cancel2") + .set("prompt", get.prompt2("twjiekuang", trigger.target)) + .set("ai", function (card) { + if (_status.event.aisave) { + if (player.isDamaged()) return "减体力上限"; + return "失去体力"; + } + return "cancel2"; + }) + .set( + "aisave", + (function () { + var save = false; + if (get.attitude(player, trigger.target) > 2) { + if (trigger.card.name == "sha") { + if (player.countCards("h", "shan") || player.getEquip(2) || trigger.target.hp == 1 || player.hp > trigger.target.hp + 1) { + if (!trigger.target.countCards("h", "shan") || trigger.target.countCards("h") < player.countCards("h")) { + save = true; + } + } + } else if (trigger.card.name == "juedou" && trigger.target.hp == 1) { + save = true; + } else if (trigger.card.name == "shunshou" && get.attitude(player, trigger.player) < 0 && get.attitude(trigger.player, trigger.target) < 0) { + save = true; + } + } + return save; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("twjiekuang", trigger.target); + player[result.control == "失去体力" ? "loseHp" : "loseMaxHp"](); + player.addTempSkill("twjiekuang_after"); + trigger.getParent().twjiekuang = true; + trigger.getParent().targets.remove(trigger.target); + trigger.getParent().triggeredTargets4.remove(trigger.target); + trigger.getParent().targets.push(player); + trigger.untrigger(); + game.delayx(); + trigger.player.line(player); + } else player.storage.counttrigger.twjiekuang--; + }, + subSkill: { + after: { + charlotte: true, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return event.twjiekuang; + }, + direct: true, + content: function () { + player.removeSkill("twjiekuang_after"); + var card = get.autoViewAs({ + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }); + if ( + !game.countPlayer2(current => { + return current.hasHistory("damage", evt => evt.card == trigger.card); + }) && + player.canUse(card, trigger.player, false) + ) { + player.useCard(card, trigger.player, false); + } + }, + }, + }, + }, + twneirao: { + audio: 2, + derivation: "twluanlve", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return Math.max(0, player.hp) + player.maxHp <= 9; + }, + content: function () { + "step 0"; + player.awakenSkill("twneirao"); + player.removeSkills("twjiekuang"); + "step 1"; + var num = player.countCards("he"), + cards = []; + player.discard(player.getCards("he")); + for (var i = 0; i < num; i++) { + var card = get.cardPile(function (card) { + return card.name == "sha" && !cards.includes(card); + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + "step 2"; + player.addSkills("twluanlve"); + }, + }, + twluanlve: { + audio: 2, + enable: "phaseUse", + onremove: true, + locked: false, + viewAs: { + name: "shunshou", + storage: { twluanlve: true }, + }, + viewAsFilter: function (player) { + return player.isPhaseUsing() && player.countCards("hs", { name: "sha" }) >= player.countMark("twluanlve"); + }, + filterCard: function (card, player) { + if (player.countMark("twluanlve") == 0) return false; + return card.name == "sha"; + }, + selectCard: function () { + var player = _status.event.player; + if (player.countMark("twluanlve") == 0) return -1; + return player.countMark("twluanlve"); + }, + onChooseToUse: function (event) { + if (!game.online && event.type == "phase") { + var targets = []; + game.countPlayer2(current => { + var history = current.getHistory("useCard"); + if (!history.length) return false; + for (var evt of history) { + if (evt.card && evt.card.name == "shunshou") { + targets.addArray(evt.targets); + } + } + }); + event.set("twluanlve_ban", targets); + } + }, + position: "hs", + log: false, + group: ["twluanlve_directHit"], + precontent: function () { + player.logSkill("twluanlve"); + player.addMark("twluanlve", 1, false); + }, + ai: { + order: function () { + return get.order({ name: "shunshou" }) + 1; + }, + }, + mod: { + playerEnabled: function (card, player, target) { + if (!_status.event.twluanlve_ban || !Array.isArray(_status.event.twluanlve_ban)) return; + if (player.isPhaseUsing() && card.name == "shunshou" && card.storage && card.storage.twluanlve && _status.event.twluanlve_ban.includes(target)) return false; + }, + }, + subSkill: { + directHit: { + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card.name == "shunshou"; + }, + direct: true, + content: function () { + trigger.directHit.addArray(game.players); + game.log(trigger.card, "不可被响应"); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg && arg.card && arg.card.name == "shunshou"; + }, + }, + }, + }, + }, + //冯习 + twqingkou: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return player.canUse("juedou", current, false); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("twqingkou"), "视为对一名其他角色使用一张【决斗】", function (card, player, target) { + return player.canUse("juedou", target, false); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "juedou" }, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twqingkou", target); + player.useCard({ name: "juedou", isCard: true, storage: { twqingkou: true } }, target, false); + player.addTempSkill("twqingkou_after"); + } + }, + subSkill: { + after: { + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return event.card.storage && event.card.storage.twqingkou; + }, + charlotte: true, + direct: true, + content: function () { + var targets = game + .filterPlayer(current => { + return current.hasHistory("sourceDamage", function (evt) { + return evt.card == trigger.card; + }); + }) + .sortBySeat(); + for (var target of targets) { + target.draw(); + if (target == player) { + player.skip("phaseJudge"); + game.log(player, "跳过了", "#y判定阶段"); + player.skip("phaseDiscard"); + game.log(player, "跳过了", "#y弃牌阶段"); + } + } + }, + }, + }, + }, + //张既 + twdingzhen: { + audio: 2, + trigger: { global: "roundStart" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return get.distance(player, current) <= Math.max(0, player.hp); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twdingzhen"), [1, Infinity], function (card, player, target) { + return get.distance(player, target) <= player.hp; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (target == player) return 0; + return Math.max(-get.attitude(player, target), 1); + }); + "step 1"; + if (result.bool) { + result.targets.sortBySeat(); + var targets = result.targets; + event.targets = targets; + player.logSkill("twdingzhen", targets); + event.num = 0; + } else event.finish(); + "step 2"; + var target = targets[num]; + event.target = target; + target + .chooseToDiscard("h", { name: "sha" }, "定镇:弃置一张【杀】,或本轮你于回合内使用的第一张牌不能指定" + get.translation(player) + "为目标") + .set("ai", function (card) { + if (_status.event.goon) return 1; + return 0; + }) + .set( + "goon", + get.attitude(target, player) < 0 && + player.countCards("hs") <= 3 && + target.countCards("hs", card => { + return target.hasValueTarget(card); + }) > 1 + ); + "step 3"; + if (result.bool) target.addExpose(0.1); + else { + target.addSkill("twdingzhen_target"); + target.markAuto("twdingzhen_target", [player]); + } + "step 4"; + if (event.num < event.targets.length - 1) { + event.num++; + event.goto(2); + } + }, + subSkill: { + target: { + charlotte: true, + onremove: true, + mark: true, + silent: true, + trigger: { global: "roundStart" }, + firstDo: true, + content: function () { + player.removeSkill("twdingzhen_target"); + }, + intro: { + markcount: () => 0, + content: "回合内使用的第一张牌不能指定$为目标", + }, + mod: { + playerEnabled: function (card, player, target) { + if (_status.currentPhase == player && !player.countUsed() && player.getStorage("twdingzhen_target").includes(target)) return false; + }, + }, + }, + }, + }, + twyouye: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + event.player != player && + !event.player.getHistory("sourceDamage", function (evt) { + return evt.player == player; + }).length && + player.getExpansions("twyouye").length < 5 + ); + }, + forced: true, + group: "twyouye_give", + content: function () { + player.addToExpansion(get.cards(), "gain2").gaintag.add("twyouye"); + }, + marktext: "蓄", + intro: { + name: "蓄(攸业)", + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + subSkill: { + give: { + audio: "twyouye", + trigger: { source: "damageSource", player: "damageEnd" }, + filter: function (event, player) { + return player.getExpansions("twyouye").length; + }, + forced: true, + content: function () { + "step 0"; + event.boolx = _status.currentPhase && _status.currentPhase.isIn(); + event.cards = player.getExpansions("twyouye"); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + "step 1"; + if (event.cards.length > 1) { + player.chooseCardButton("攸业:请选择要分配的牌", true, event.cards, [1, event.cards.length]).set("ai", function (button) { + if (ui.selected.buttons.length) return 0; + return get.value(button.link, _status.event.player); + }); + } else if (event.cards.length == 1) event._result = { links: event.cards.slice(0), bool: true }; + else event.finish(); + "step 2"; + if (result.bool) { + var cards = result.links; + event.cards2 = cards; + player + .chooseTarget( + "选择一名角色获得" + get.translation(cards), + function (card, player, target) { + var evt = _status.event.getParent(); + var cards = evt.cards, + cards2 = evt.cards2.slice(); + if (cards.removeArray(cards2).length > 0 || !evt.boolx) return true; + return target == _status.currentPhase; + }, + event.cards.length == 1 + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) return Math.max(0.01, 100 - att); + else if (att > 0) return Math.max(0.1, att / (1 + target.countCards("h") + (_status.event.getParent().given_map[target.playerid] || 0))); + else return Math.max(0.01, (100 + att) / 100); + }) + .set("enemy", get.value(cards[0], player, "raw") < 0); + } + "step 3"; + if (result.bool) { + var cards = event.cards2; + event.cards.removeArray(cards); + event.togive = cards.slice(0); + if (result.targets.length) { + if (result.targets[0] == _status.currentPhase) event.boolx = false; + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; + map[id].addArray(event.togive); + } + if (event.cards.length > 0) event.goto(1); + } else event.goto(1); + "step 4"; + if (_status.connectMode) + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + list.push([source, event.given_map[i]]); + game.log(source, "获得了", event.given_map[i]); + } + game.loseAsync({ + gain_list: list, + giver: player, + animate: "gain2", + }).setContent("gaincardMultiple"); + }, + }, + }, + }, + //荀谌 + twweipo: { + audio: "mjweipo", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("he"); + }); + }, + filterTarget: function (card, player, target) { + return target.countCards("he"); + }, + content: function () { + "step 0"; + target.chooseToDiscard("he", true); + "step 1"; + var list = ["binglinchengxiax"]; + list.addArray(get.zhinangs()); + player.chooseButton(["危迫:令其获得一张智囊牌或【兵临城下】", [list, "vcard"]], true).set("ai", function (button) { + return _status.event.getParent().target.getUseValue({ name: button.link[2] }); + }); + "step 2"; + if (result.bool) { + var name = result.links[0][2], + card = false; + game.log(player, "选择了", "#y" + get.translation(name)); + if (name == "binglinchengxiax") { + if (!_status.binglinchengxiax) { + _status.binglinchengxiax = [ + ["spade", 7], + ["club", 7], + ["club", 13], + ]; + game.broadcastAll(function () { + lib.inpile.add("binglinchengxiax"); + }); + } + if (_status.binglinchengxiax.length) { + var info = _status.binglinchengxiax.randomRemove(); + card = game.createCard2("binglinchengxiax", info[0], info[1]); + } + } + if (!card) card = get.cardPile(name); + if (card) target.gain(card, "gain2"); + } + }, + ai: { + order: 7.1, + result: { + target: function (player, target) { + if (target == player) return player.countCards("he") ? 10 : 0.01; + return (target.countCards("he") + 0.5) * Math.sqrt(Math.max(1, target.hp)); + }, + }, + }, + }, + twmouzhi: { + audio: "mjmouzhi", + intro: { content: "上次受到伤害的颜色:$" }, + trigger: { player: "damageBegin4" }, + forced: true, + group: "twmouzhi_mark", + filter: function (event, player) { + if (!event.card || get.color(event.card) == "none") return false; + var all = player.getAllHistory("damage"); + if (!all.length) return false; + return all[all.length - 1].card && get.color(all[all.length - 1].card) == get.color(event.card); + }, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: (card, player, target) => { + if (typeof card === "object" && get.tag(card, "damage")) { + let color = get.color(card); + if (color === "none") return; + let all = target.getAllHistory("damage"); + if (!all.length || !all[all.length - 1].card) return; + if (get.color(all[all.length - 1].card) === color) return "zeroplayertarget"; + } + }, + }, + }, + subSkill: { + mark: { + trigger: { player: "damage" }, + silent: true, + firstDo: true, + content: function () { + if (!trigger.card || get.color(trigger.card) == "none") player.unmarkSkill("twmouzhi"); + else { + player.markSkill("twmouzhi"); + player.storage.twmouzhi = get.color(trigger.card); + game.broadcastAll( + function (player, color) { + if (player.marks.twmouzhi) { + player.marks.twmouzhi.firstChild.innerHTML = ""; + } + player.storage.twmouzhi = color; + }, + player, + player.storage.twmouzhi + ); + } + }, + }, + }, + }, + //蒋钦 + twshangyi: { + audio: "shangyi", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he") && + game.hasPlayer(function (current) { + return current != player && current.countCards("h"); + }) + ); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h"); + }, + filterCard: true, + position: "he", + content: function () { + "step 0"; + target.viewHandcards(player); + var chooseButton; + if (player.countCards("h")) chooseButton = player.chooseButton([1, 2], ['###尚义###
    选择' + get.translation(target) + "的一张手牌以弃置,或选择你与其的各一张牌以交换
    ", '
    ' + get.translation(target) + "的手牌
    ", target.getCards("h"), '
    你的手牌
    ', player.getCards("h")], true); + else chooseButton = player.chooseButton(['###尚义###
    弃置' + get.translation(target) + "的一张手牌
    ", '
    ' + get.translation(target) + "的手牌
    ", target.getCards("h")], true); + chooseButton.set("target", target); + chooseButton.set("ai", function (button) { + var player = _status.event.player, + owner = get.owner(button.link), + color = get.color(button.link, owner), + value = get.value(button.link, owner); + if (player.countCards("h")) { + if (!ui.selected.buttons.length) { + if ( + player.countCards("h", function (card) { + return get.color(card, player) == "red" && get.value(card) < 6; + }) && + color == "red" && + value > 7 + ) + return value * 3; + return value; + } else { + if (get.value(ui.selected.buttons[0].link) < 4) return 0; + return 4 + (get.color(ui.selected.buttons[0].link, get.owner(ui.selected.buttons[0].link)) == "red" ? 3 : 1) - value; + } + } else { + if (color == "black") return value * 1.5; + return value; + } + }); + chooseButton.set("filterButton", function (button) { + if (get.itemtype(button.link) != "card") return false; + if (!ui.selected.buttons.length && get.owner(button.link) != _status.event.target) return false; + if (ui.selected.buttons.length && get.owner(ui.selected.buttons[0].link) == get.owner(button.link)) return false; + return true; + }); + "step 1"; + if (result.bool) { + if (result.links.length == 1) { + target.discard(result.links[0]).discarder = player; + if (get.color(result.links[0], target) != "black") event.finish(); + } else { + var links = result.links.slice(); + if (get.owner(links[0]) != player) links.reverse(); + var card1 = links[0], + card2 = links[1]; + player.swapHandcards(target, [card1], [card2]); + if (get.color(card1, player) != "red" || get.color(card2, target) != "red") event.finish(); + } + } else event.finish(); + "step 2"; + player.draw(); + }, + ai: { + order: 10, + result: { target: -1 }, + }, + }, + twxiangyu: { + group: "twxiangyu_lose", + shaRelated: true, + audio: "zniaoxiang", + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && get.distance(player, event.player) < player.getAttackRange(); + }, + forced: true, + logTarget: "target", + init: function (player) { + var target = _status.currentPhase; + if (!target || !target != player) return; + if (!player.getStorage("twxiangyu_range").length) { + var targets = game.filterPlayer(current => { + return current.getHistory("lose").length; + }); + if (targets.length) { + player.addTempSkill("twxiangyu_range"); + player.markAuto("twxiangyu_range", targets); + } + } + }, + content: function () { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { + map[id].shanRequired++; + } else map[id].shanRequired = 2; + }, + mod: { + attackRange: function (player, num) { + return num + Math.min(5, player.getStorage("twxiangyu_range").length); + }, + }, + subSkill: { + lose: { + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + return ( + player == _status.currentPhase && + game.hasPlayer(function (current) { + if (player.getStorage("twxiangyu_range").includes(current)) return false; + var evt = event.getl(current); + return evt && evt.cards2 && evt.cards2.length > 0; + }) + ); + }, + silent: true, + charlotte: true, + content: function () { + player.addTempSkill("twxiangyu_range"); + player.markAuto( + "twxiangyu_range", + game.filterPlayer(function (current) { + if (player.getStorage("twxiangyu_range").includes(current)) return false; + var evt = trigger.getl(current); + return evt && evt.cards2 && evt.cards2.length > 0; + }) + ); + player.syncStorage("twxiangyu_range"); + }, + }, + range: { + marktext: "羽", + intro: { + content: function (storage, player) { + var num = Math.min(5, storage ? storage.length : 0); + return "攻击范围+" + num; + }, + }, + charlotte: true, + onremove: true, + }, + }, + }, + //顾雍 + twgyshenxing: { + audio: "xinshenxing", + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") >= Math.min(2, player.countMark("twgyshenxing")); + }, + selectCard: function () { + return Math.min(2, _status.event.player.countMark("twgyshenxing")); + }, + prompt: function () { + return "弃置" + get.cnNumber(Math.min(2, _status.event.player.countMark("twgyshenxing"))) + "张牌并摸一张牌"; + }, + check: function (card) { + var num = _status.event.player.countCards("h", { color: get.color(card) }); + if (get.position(card) == "e") num++; + return (Math.max(4, 7.1 - num) - get.value(card)) / num; + }, + filterCard: true, + position: "he", + content: function () { + player.draw(); + player.addMark("twgyshenxing", 1); + }, + marktext: "慎", + intro: { content: "已发动过#次" }, + ai: { + order: function (item, player) { + if (!player.hasMark("twgyshenxing")) return 10; + return 1; + }, + result: { player: 1 }, + }, + }, + twbingyi: { + audio: "bingyi_xin_guyong", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h"); + }, + filterx: function (event, player) { + var cards = player.getCards("h"); + if (cards.length == 1) return true; + var color = get.color(cards[0], player), + type = get.type2(cards[0], player); + for (var i = 1; i < cards.length; i++) { + if (color && get.color(cards[i], player) != color) color = false; + if (type && get.type2(cards[i], player) != type) type = false; + if (!color && !type) return false; + } + return true; + }, + filtery: function (event, player) { + var cards = player.getCards("h"); + if (player.countCards("h") <= 1) return false; + var color = get.color(cards[0], player), + type = get.type2(cards[0], player); + var colorx = true, + typex = true; + for (var i = 1; i < cards.length; i++) { + if (color && get.color(cards[i], player) != color) colorx = false; + if (type && get.type2(cards[i], player) != type) typex = false; + } + return colorx && typex; + }, + direct: true, + content: function () { + "step 0"; + event.boolx = false; + if (lib.skill.twbingyi.filtery(trigger, player)) event.boolx = true; + if (lib.skill.twbingyi.filterx(trigger, player)) { + player.chooseTarget(get.prompt("twbingyi"), "选择至多" + get.cnNumber(player.countCards("h")) + "名角色,你展示所有手牌,这些角色各摸一张牌" + (event.boolx ? ",然后你移去所有“慎”" : ""), [0, player.countCards("h")]).set("ai", function (target) { + return get.attitude(_status.event.player, target); + }).animate = false; + } else + player.chooseBool(get.prompt("twbingyi"), "展示所有手牌").ai = function () { + return false; + }; + "step 1"; + if (result.bool) { + player.logSkill("twbingyi"); + player.showHandcards(get.translation(player) + "发动了【秉壹】"); + event.targets = result.targets; + } else event.finish(); + "step 2"; + if (targets && targets.length) { + player.line(targets, "green"); + targets.sortBySeat(); + game.asyncDraw(targets); + } + "step 3"; + if (event.boolx) { + player.removeMark("twgyshenxing", player.countMark("twgyshenxing")); + } + }, + ai: { expose: 0.1 }, + }, + bingyi_xin_guyong: { audio: 2 }, + //陈武董袭 + twyilie: { + audio: "spyilie", + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("选项一", "选项二", "背水!", "cancel2") + .set("choiceList", ["本阶段内使用【杀】的次数上限+1", "本回合内使用【杀】指定处于连环状态的目标后,或使用【杀】被【闪】抵消时,摸一张牌", "背水!失去1点体力并依次执行上述所有选项"]) + .set("ai", function () { + if ( + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card); + }) > player.getCardUsable({ name: "sha" }) + ) { + return player.hp > 2 ? 2 : 0; + } + return 1; + }) + .set("prompt", get.prompt("twyilie")); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("twyilie"); + game.log(player, "选择了", "#g【毅烈】", "的", "#y" + result.control); + if (result.index % 2 == 0) player.addTempSkill("twyilie_add", "phaseUseEnd"); + if (result.index > 0) player.addTempSkill("twyilie_miss"); + if (result.index == 2) player.loseHp(); + } + }, + subSkill: { + add: { + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + mark: true, + intro: { content: "本阶段使用【杀】的次数上限+1" }, + }, + miss: { + charlotte: true, + audio: "spyilie", + trigger: { player: ["useCardToTargeted", "shaMiss"] }, + filter: function (event, player, name) { + if (name == "useCardToTargeted") return event.card.name == "sha" && event.target.isLinked(); + return true; + }, + forced: true, + content: function () { + player.draw(); + }, + }, + }, + }, + twfenming: { + audio: "spfenming", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return target != player && (target.countCards("he") || !target.isLinked()); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twfenming"), function (card, player, target) { + return target != player && (target.countCards("he") || !target.isLinked()); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twfenming", target); + var list = [], + choiceList = ["令" + get.translation(target) + "弃置一张牌", "令" + get.translation(target) + "横置", "背水!横置并依次令" + get.translation(target) + "执行上述所有选项"]; + if (target.countCards("he")) list.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (!target.isLinked()) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (target.countCards("he") && !target.isLinked() && !player.isLinked()) list.push("背水!"); + else choiceList[2] = '' + choiceList[2] + ""; + if (list.length == 1) event._result = { control: list[0] }; + else + player + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", function () { + var list = _status.event.controls; + if (list.includes("背水!")) return "背水!"; + if (list.includes("选项一")) return "选项一"; + return "选项二"; + }) + .set("prompt", "奋命:请选择一项"); + } else event.finish(); + "step 2"; + game.log(player, "选择了", "#y" + result.control); + if (result.control == "背水!" && !player.isLinked()) player.link(true); + if (result.control != "选项二") target.chooseToDiscard("he", true); + if (result.control != "选项一" && !target.isLinked()) target.link(true); + }, + }, + //韩当 + twgongji: { + audio: "regongji", + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + locked: false, + filter: function (event, player) { + return player.countCards("he"); + }, + check: function (card) { + var base = 0, + player = _status.event.player, + suit = get.suit(card, player), + added = false, + added2 = false, + added3; + if ( + get.type(card) == "equip" && + game.hasPlayer(function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + }) + ) + base += 6; + var hs = player.getCards("h"); + var muniu = player.getEquip("muniu"); + if (muniu && card != muniu && muniu.cards) hs = hs.concat(muniu.cards); + for (var i of hs) { + if (i != card && get.name(i) == "sha") { + if (get.suit(i, player) == suit) { + if (player.hasValueTarget(i, false)) { + added3 = true; + base += 5.5; + } + } else { + if (player.hasValueTarget(i, false)) added2 = true; + if (!added && !player.hasValueTarget(i, null, true) && player.hasValueTarget(i, false, true)) { + base += 4; + added = true; + } + } + } + } + if (added3 && !added2) base -= 4.5; + return base - get.value(card); + }, + content: function () { + "step 0"; + player.addTempSkill("twgongji2"); + player.markAuto("twgongji2", [get.suit(cards[0], player)]); + "step 1"; + if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") { + player + .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) { + return player != target && target.countCards("he"); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + player.line(result.targets, "green"); + player.discardPlayerCard(result.targets[0], "he", true); + } + }, + mod: { + attackRangeBase: function () { + return Infinity; + }, + }, + ai: { + order: 4.5, + result: { player: 1 }, + }, + }, + twgongji2: { + charlotte: true, + onremove: true, + mark: true, + intro: { content: "使用$花色的杀无任何次数限制" }, + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (_status.currentPhase == player && event.card.name == "sha" && player.getStorage("twgongji2").includes(get.suit(event.card)) && event.addCount !== false) return true; + return false; + }, + forced: true, + locked: false, + popup: false, + firstDo: true, + content: function () { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + }, + mod: { + cardUsable: function (card, player) { + if (card.name == "sha") { + const suit = get.suit(card); + if (suit === "unsure" || player.getStorage("twgongji2").includes(suit)) return Infinity; + } + }, + aiOrder: function (player, card, num) { + if (get.name(card) == "sha" && !player.getStorage("twgongji2").includes(get.suit(card))) return num + 1; + }, + }, + }, + twjiefan: { + skillAnimation: true, + animationColor: "wood", + audio: "jiefan_re_handang", + limited: true, + enable: "phaseUse", + filterTarget: true, + content: function () { + "step 0"; + player.awakenSkill("twjiefan"); + event.players = game.filterPlayer(function (current) { + return current != target && current.inRange(target); + }); + event.players.sortBySeat(); + "step 1"; + if (event.players.length) { + event.current = event.players.shift(); + event.current.addTempClass("target"); + player.line(event.current, "green"); + if (!event.current.countCards("he") || !target.isIn()) event._result = { bool: false }; + else { + event.current + .chooseToDiscard({ subtype: "equip1" }, "he", "解烦:弃置一张武器牌,或令" + get.translation(target) + "摸一张牌") + .set("ai", function (card) { + if (!_status.event.target.isIn()) return 0; + if (get.attitude(_status.event.player, _status.event.target) < 0) return 7 - get.value(card); + return -1; + }) + .set("target", target); + } + } else { + player.addSkill("twjiefan2"); + player.markAuto("twjiefan2", [target]); + event.finish(); + } + "step 2"; + if (!result.bool && target.isIn()) target.draw(); + event.goto(1); + }, + ai: { + order: 5, + result: { + target: function (player, target) { + if (player.hp > 2 && game.phaseNumber < game.players.length * 2) return 0; + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != target && players[i].inRange(target)) { + num++; + } + } + return num; + }, + }, + }, + }, + twjiefan2: { + charlotte: true, + onremove: true, + trigger: { global: "dying" }, + filter: function (event, player) { + return player.getStorage("twjiefan2").includes(event.player); + }, + forced: true, + popup: false, + content: function () { + player.removeSkill("twjiefan2"); + player.restoreSkill("twjiefan"); + }, + }, + jiefan_re_handang: { audio: 2 }, + //纪灵 + twshuangren: { + audio: "shuangren", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player, name) { + if (!player.countCards("h")) return false; + if (name == "phaseUseEnd") + return !player.hasHistory("sourceDamage", function (evt) { + return evt.card.name == "sha" && event.getParent("phaseUse") == evt; + }); + return true; + }, + direct: true, + group: "twshuangren_end", + preHidden: true, + content: function () { + "step 0"; + var forced = + event.getParent(2).name == "twshuangren_end" && + game.hasPlayer(current => { + return player.canCompare(current); + }); + var str = "与一名角色拼点,若你:赢,你可以视为对至多两名至其的距离不大于1的角色使用一张【杀】;没赢,其可以视为对你使用一张【杀】"; + player + .chooseTarget(forced ? "双刃:选择一名角色" : get.prompt("twshuangren"), str, forced, (card, player, target) => { + return player.canCompare(target); + }) + .set("ai", target => { + if (_status.event.goon) return get.effect(target, { name: "sha" }, _status.event.player); + return 0; + }) + .set("goon", event.triggername != "phaseUseBegin" || (player.countCards("hs", "sha") > 0 && player.hasValueTarget({ name: "sha" }))); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twshuangren", target); + if (player.canCompare(target)) player.chooseToCompare(target); + else event.finish(); + } else event.finish(); + "step 2"; + if (result.bool) { + event.sha = true; + player + .chooseTarget([1, 2], "请选择【杀】的目标", true, function (card, player, target) { + if (!player.canUse("sha", target, false, false)) return false; + return get.distance(target, _status.event.targetx) <= 1; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }) + .set("targetx", target); + } else target.chooseBool("双刃:是否视为对" + get.translation(player) + "使用一张杀?").set("choice", get.effect(player, { name: "sha" }, target, target) > 0); + "step 3"; + if (result.bool) { + if (event.sha == true) { + result.targets.sortBySeat(); + for (var i of result.targets) { + player.useCard({ name: "sha", isCard: true }, i, false); + } + } else target.useCard({ name: "sha", isCard: true }, player, false); + } + }, + subSkill: { + end: { + audio: "shuangren", + trigger: { player: "phaseUseEnd" }, + filter: function (event, player, name) { + if (!player.countCards("h")) return false; + return ( + !player.hasHistory("useSkill", function (evt) { + return evt.skill == "twshuangren"; + }) && + !player.hasHistory("sourceDamage", function (evt) { + return evt.card && evt.card.name == "sha"; + }) + ); + }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt("twshuangren"), "弃置一张牌发动〖双刃〗", "he") + .set("ai", function (card) { + if (_status.event.goon) return 5 - get.value(card); + return 0; + }) + .set( + "goon", + (function () { + return player.hasCard(function (card) { + if (player.needsToDiscard() > 1) return card.number > 10 && get.value(card) <= 5; + return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; + }); + })() + ) + .setHiddenSkill("twshuangren") + .set("logSkill", "twshuangren"); + "step 1"; + if (result.bool) { + player.useSkill("twshuangren"); + } + }, + }, + }, + }, + //法正 + twxuanhuo: { + audio: "rexuanhuo", + trigger: { player: "phaseDrawEnd" }, + filter: function (event, player) { + return player.countCards("he") > 1 && game.countPlayer() > 2; + }, + direct: true, + content: function () { + "step 0"; + var ai2 = function (target) { + var player = _status.event.player; + if (get.attitude(player, target) <= 0) return 0; + var list = ["sha", "juedou"]; + var num = Math.max.apply( + Math, + list.map(function (i) { + return target.getUseValue({ name: i, isCard: true }, false); + }) + ); + if (target.hasSkillTag("nogain")) num /= 4; + return num; + }; + player.chooseCardTarget({ + prompt: get.prompt2("twxuanhuo"), + filterCard: true, + selectCard: 2, + position: "he", + filterTarget: lib.filter.notMe, + goon: game.hasPlayer(function (current) { + return current != player && ai2(player, current) > 0; + }), + ai1: function (card) { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }, + ai2: ai2, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twxuanhuo", target); + player.give(result.cards, target); + } else event.finish(); + "step 2"; + if ( + game.hasPlayer(function (current) { + return current != player && current != target; + }) + ) + player + .chooseTarget( + function (card, player, target) { + return target != player && target != _status.event.target; + }, + "选择" + get.translation(target) + "使用【杀】或【决斗】的目标", + true + ) + .set("target", target) + .set("ai", function (target) { + var evt = _status.event; + var list = ["sha", "juedou"]; + return Math.max.apply( + Math, + list.map(function (i) { + var card = { name: i, isCard: true }; + if (!evt.target.canUse(card, target, false)) return 0; + return get.effect(target, card, evt.target, evt.player); + }) + ); + }); + else event.finish(); + "step 3"; + var target2 = result.targets[0]; + event.target2 = target2; + player.line(target2); + var vcards = []; + if (target.canUse({ name: "sha", isCard: true }, target2, false)) vcards.push(["基本", "", "sha"]); + if (target.canUse({ name: "juedou", isCard: true }, target2, false)) vcards.push(["锦囊", "", "juedou"]); + if (!vcards.length) { + if (!target.countCards("h")) event.finish(); + else event._result = { index: 1 }; + } else if (!target.countCards("h")) { + event.vcards = vcards; + event._result = { index: 0 }; + } else { + event.vcards = vcards; + target.chooseControl().set("choiceList", ["视为对" + get.translation(target2) + "使用一张【杀】或【决斗】", "令" + get.translation(player) + "获得你的两张牌"]); + } + "step 4"; + if (result.index == 0) { + if (event.vcards.length == 1) event._result = { links: event.vcards, bool: true }; + else + target.chooseButton(["请选择要对" + get.translation(event.target2) + "使用的牌", [event.vcards, "vcard"]], true).set("ai", function (button) { + var player = _status.event.player; + return get.effect(_status.event.getParent().target2, { name: button.link[2], isCard: true }, player, player); + }); + } else { + player.gainPlayerCard(target, 2, "he", true); + event.finish(); + } + "step 5"; + if (result.bool) target.useCard({ name: result.links[0][2], isCard: true }, false, event.target2); + }, + ai: { + expose: 0.15, + }, + }, + twenyuan: { + audio: "reenyuan", + group: ["twenyuan1", "twenyuan2"], + }, + twenyuan1: { + audio: "reenyuan", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + direct: true, + filter: function (event, player) { + var cards = event.getg(player); + if (!cards.length || cards.length < 2) return false; + return game.countPlayer(current => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.filter(card => cards.includes(card)).length >= 2) return true; + return false; + }); + }, + check: function (event, player) { + var cards = event.getg(player); + var target = game.filterPlayer(current => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.filter(card => cards.includes(card)).length >= 2) return true; + return false; + })[0]; + return get.attitude(player, target) > 0; + }, + logTarget: function (event, player) { + var cards = event.getg(player); + return game.filterPlayer(current => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.filter(card => cards.includes(card)).length >= 2) return true; + return false; + }); + }, + content: function () { + "step 0"; + var target = lib.skill.twenyuan1.logTarget(trigger, player)[0]; + event.target = target; + var list = ["摸一张牌"]; + var prompt2 = "令" + get.translation(target) + "摸一张牌"; + if ((!target.countCards("h") || !target.countCards("e")) && target.isDamaged()) { + list.push("回复1点体力"); + prompt2 += "或回复1点体力"; + } + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("twenyuan", target)) + .set("prompt2", prompt2) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + if (get.attitude(player, target) > 0) { + if (target.hp <= 2 && list.includes("回复1点体力")) return "回复1点体力"; + return 0; + } + return "cancel2"; + })() + ); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + return; + } + player.logSkill("twenyuan1", target); + if (result.control == "回复1点体力") target.recover(); + else target.draw(); + }, + }, + twenyuan2: { + audio: "reenyuan", + trigger: { player: "damageEnd" }, + logTarget: "source", + filter: function (event, player) { + return event.source && event.source.isIn(); + }, + check: function (event, player) { + var att = get.attitude(player, event.source); + var num = event.source.countCards("h"); + if (att <= 0) return true; + if (get.effect(event.source, { name: "losehp" }, player, event.source) > 0) return true; + if (num > 2) return true; + if (num) return att < 4; + return false; + }, + prompt2: "令其选择一项:1.失去1点体力;2.交给你一张手牌,若此牌的花色不为♥,你摸一张牌。", + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + var target = trigger.source; + event.count--; + if (!target.countCards("h")) event._result = { bool: false }; + else + target.chooseCard("h", "恩怨:将一张手牌交给" + get.translation(player) + ",或失去1点体力").set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { + if (get.suit(card) != "heart") return 15 - get.value(card); + return 11 - get.value(card); + } else { + var num = 12 - _status.event.player.hp * 2; + if (get.suit(card) != "heart") num -= 2; + return num - get.value(card); + } + }); + "step 2"; + var target = trigger.source; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + target.give(card, player); + } else { + target.loseHp(); + event.goto(4); + } + "step 3"; + if (get.suit(card) != "heart") player.draw(); + "step 4"; + var target = trigger.source; + if (target.isIn() && event.count > 0 && player.hasSkill("twenyuan")) + player.chooseBool(get.prompt("twenyuan", target), lib.skill.twenyuan2.prompt2).set("ai", function () { + var evt = _status.event.getTrigger(); + return lib.skill.twenyuan2.check(evt, evt.player); + }); + else event.finish(); + "step 5"; + if (result.bool) { + player.logSkill("twenyuan2", trigger.source); + event.goto(1); + } + }, + }, + //马岱 + twqianxi: { + audio: "qianxi", + trigger: { player: "phaseZhunbeiBegin" }, + preHidden: true, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (player.hasCard(card => lib.filter.cardDiscardable(card, player, "tweqianxi"), "he")) player.chooseToDiscard("he", true); + else event.finish(); + "step 2"; + if ( + !result.bool || + !game.hasPlayer(target => { + return player != target && get.distance(player, target) <= 1; + }) + ) { + event.finish(); + return; + } + event.color = get.color(result.cards[0], player); + player + .chooseTarget(function (card, player, target) { + return player != target && get.distance(player, target) <= 1; + }, true) + .set("ai", function (target) { + return get.effect(target, { name: "sha" }, _status.event.player, _status.event.player) + 5; + }); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + target.storage.twqianxi2 = event.color; + target.addTempSkill("twqianxi2"); + player.addTempSkill("twqianxi_self"); + player.markAuto("twqianxi_self", [target]); + } + }, + subSkill: { + self: { + audio: "qianxi", + charlotte: true, + onremove: true, + forced: true, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hasHistory("sourceDamage", evt => { + if (!evt.card || evt.card.name != "sha" || !evt.player.isIn()) return false; + if (player.getStorage("twqianxi_self").includes(evt.player)) return true; + return false; + }); + }, + content: function () { + "step 0"; + var targets = []; + player.getHistory("sourceDamage", evt => { + if (!evt.card || evt.card.name != "sha") return false; + if (player.getStorage("twqianxi_self").includes(evt.player)) { + targets.add(evt.player); + } + return false; + }); + player.line(targets); + for (var target of targets) { + target.storage.twqianxi3 = target.storage.twqianxi2; + target.addTempSkill("twqianxi3", { player: "phaseAfter" }); + } + }, + }, + }, + }, + twqianxi2: { + mark: true, + charlotte: true, + onremove: true, + intro: { + markcount: () => 0, + content: function (storage) { + return "不能使用或打出" + get.translation(storage) + "手牌"; + }, + }, + mod: { + cardEnabled2: function (card, player) { + if (get.itemtype(card) == "card" && get.color(card) == player.getStorage("twqianxi2") && get.position(card) == "h") return false; + }, + }, + }, + twqianxi3: { + mod: { + cardEnabled2: function (card, player) { + if (get.itemtype(card) == "card" && get.color(card) != player.getStorage("twqianxi3") && get.position(card) == "h") return false; + }, + }, + mark: true, + intro: { + content: function (storage) { + return "不能使用或打出非" + get.translation(storage) + "手牌"; + }, + }, + charlotte: true, + onremove: true, + }, + //牛金 + twcuorui: { + audio: "cuorui", + limited: true, + skillAnimation: true, + animationColor: "thunder", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h"); + }); + }, + check: function (event, player) { + var num = 0; + for (var target of game.players) { + if (target != player && target.countCards("h") > num) num = target.countCards("h"); + } + num = Math.min(num, 5 + player.countCards("h")); + return num - player.countCards("h") >= 2; + }, + prompt: function (event, player) { + var num = 0; + for (var target of game.players) { + if (target != player && target.countCards("h") > num) num = target.countCards("h"); + } + num = Math.min(num, 5 + player.countCards("h")); + return get.prompt("twcuorui") + "(可摸" + get.cnNumber(num - player.countCards("h")) + "张牌)"; + }, + content: function () { + "step 0"; + player.awakenSkill("twcuorui"); + var num = 0; + for (var target of game.players) { + if (target != player && target.countCards("h") > num) num = target.countCards("h"); + } + num = Math.min(num, 5 + player.countCards("h")); + player.drawTo(num); + if (!player.isDisabledJudge()) { + player.disableJudge(); + event.finish(); + } else + player.chooseTarget("挫锐:是否对一名其他角色造成1点伤害?", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + player.line(result.targets[0]); + result.targets[0].damage(); + } + }, + }, + twliewei: { + audio: "liewei", + trigger: { source: "dieAfter" }, + forced: true, + content: function () { + "step 0"; + if (!player.hasSkill("twcuorui", null, null, false) || !player.awakenedSkills.includes("twcuorui")) event._result = { index: 0 }; + else + player + .chooseControl() + .set("prompt", "裂围:请选择一项") + .set("choiceList", ["摸两张牌", "重置〖挫锐〗"]) + .set("ai", function () { + return 1; + }); + "step 1"; + if (result.index == 0) player.draw(2); + else player.restoreSkill("twcuorui"); + }, + }, + //母兵脸 + twzhengrong: { + audio: "drlt_zhenrong", + trigger: { player: "useCardAfter", source: "damageSource" }, + filter: function (event, player) { + if (!event.isPhaseUsing(player)) return false; + if (event.name == "damage") + return ( + player + .getHistory("sourceDamage", evt => { + return evt.getParent("phaseUse") == event.getParent("phaseUse"); + }) + .indexOf(event) == 0 + ); + if (!event.targets || event.targets.every(target => target == player)) return false; + return ( + player + .getAllHistory("useCard", function (evt) { + if (!evt.isPhaseUsing(player)) return false; + if (evt.targets.every(target => target == player)) return false; + return true; + }) + .indexOf(event) % + 2 == + 1 + ); + }, + direct: true, + content: function () { + "step 0"; + if ( + !game.hasPlayer(function (target) { + return target != player && target.countCards("he"); + }) + ) { + event.finish(); + return; + } + player + .chooseTarget(get.prompt("twzhengrong"), "将一名其他角色的一张牌置于武将牌上,称为“荣”", function (card, player, target) { + return target != player && target.countCards("he"); + }) + .set("ai", function (target) { + return get.effect(target, { name: "guohe_copy2" }, _status.event.player, _status.event.player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = result.targets[0]; + player.logSkill("twzhengrong", target); + player.choosePlayerCard(target, "he", true); + } else event.finish(); + "step 2"; + if (result.bool) player.addToExpansion(result.links, target, "give").gaintag.add("twzhengrong"); + }, + marktext: "荣", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + }, + twhongju: { + derivation: ["twqingce", "twsaotao"], + audio: "drlt_hongju", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.getExpansions("twzhengrong").length >= 3; + }, + content: function () { + "step 0"; + player.awakenSkill("twhongju"); + player.draw(player.getExpansions("twzhengrong").length); + "step 1"; + if (player.countCards("h") == 0) event.goto(3); + else { + var next = player.chooseToMove("鸿举:请选择要交换的手牌和“荣”"); + next.set("list", [ + [get.translation(player) + "(你)的“荣”", player.getExpansions("twzhengrong"), "twzhengrong_tag"], + ["手牌区", player.getCards("h")], + ]); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return player.getUseValue(a) - player.getUseValue(b); + }), + cards2 = cards.splice(0, player.getExpansions("twzhengrong").length); + return [cards2, cards]; + }); + } + "step 2"; + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("twzhengrong")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.addToExpansion(pushs, player, "giveAuto").gaintag.add("twzhengrong"); + game.log(player, "将", pushs, "作为“荣”置于武将牌上"); + player.gain(gains, "gain2"); + } + "step 3"; + player.addSkills("twqingce"); + player + .chooseBool("是否减1点体力上限并获得〖扫讨〗?") + .set("ai", () => _status.event.bool) + .set("bool", player.isDamaged() && player.countCards("h") >= 3 ? (Math.random() < 0.5 ? true : false) : false); + "step 4"; + if (result.bool) { + player.loseMaxHp(); + player.addSkills("twsaotao"); + game.delayx(); + } + }, + ai: { + combo: "twzhengrong", + }, + }, + twqingce: { + enable: "phaseUse", + audio: "drlt_qingce", + filter: function (event, player) { + return player.getExpansions("twzhengrong").length > 0; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("清侧:请选择要移去的“荣”", player.getExpansions("twzhengrong"), "hidden"); + }, + backup: function (links, player) { + return { + card: links[0], + filterCard: function () { + return false; + }, + selectCard: -1, + filterTarget: function (card, player, target) { + return target.countDiscardableCards(player, "hej") > 0; + }, + delay: false, + audio: "drlt_qingce", + content: lib.skill.twqingce.contentx, + ai: { + result: { + target: function (player, target) { + return get.effect(target, { name: "guohe" }, player, target); + }, + }, + }, + }; + }, + prompt: () => "弃置一名角色区域内的一张牌", + }, + contentx: function () { + "step 0"; + var card = lib.skill.twqingce_backup.card; + player.loseToDiscardpile([card]); + "step 1"; + if (target.countDiscardableCards(player, "hej") > 0) player.discardPlayerCard("hej", true, target); + }, + ai: { + combo: "twzhengrong", + order: 8, + result: { + player: function (player) { + if ( + game.hasPlayer(function (target) { + return get.effect(target, { name: "guohe" }, player, player) > 4 * Math.max(0, 5 - player.getExpansions("twzhengrong").length); + }) + ) + return 1; + return 0; + }, + }, + }, + }, + twsaotao: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card.name == "sha" || get.type(event.card) == "trick"; + }, + forced: true, + content: function () { + trigger.directHit.addArray(game.players); + }, + ai: { directHit_ai: true }, + }, + //大小乔 + twxingwu: { + audio: "xingwu", + trigger: { player: "phaseDiscardBegin" }, + filter: function (event, player) { + return player.countCards("he"); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt("twxingwu"), "将一张牌置于武将牌上作为“星舞”") + .set("ai", function (card) { + if (_status.event.goon) return 20 - get.value(card); + return 7 - get.value(card); + }) + .set("goon", player.needsToDiscard() || player.getExpansions("twxingwu").length > 1); + "step 1"; + if (result.bool) { + player.logSkill("twxingwu"); + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("twxingwu"); + } else event.finish(); + "step 2"; + game.delayx(); + if (player.getExpansions("twxingwu").length < 3 || !game.hasPlayer(current => current != player)) event.finish(); + "step 3"; + player + .chooseButton(["是否移去三张“星舞”牌并发射核弹?", player.getExpansions("twxingwu")], 3) + .set("ai", function (button) { + if (_status.event.goon) return 1; + return 0; + }) + .set( + "goon", + game.hasPlayer(current => get.damageEffect(current, player, player) < 0) + ); + "step 4"; + if (result.bool) player.loseToDiscardpile(result.links); + else event.finish(); + "step 5"; + player.chooseTarget("星舞:选择一名其他角色", "弃置其装备区内的所有牌。然后对其造成2点伤害(若其性别包含女性则改为1点)", true, lib.filter.notMe).set("ai", function (target) { + return ( + get.damageEffect(target, player, player) * + Math.sqrt( + 4 + + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) + ) * + (target.hasSex("female") ? 1 : 2) + ); + }); + "step 6"; + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + var num = target.countCards("e"); + if (num) player.discardPlayerCard(target, "e", num, true); + target.damage(target.hasSex("female") ? 1 : 2); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + onunmark: function (storage, player) { + if (player.hasSkill("twpingting")) return; + player.removeAdditionalSkill("twpingting"); + }, + }, + onremove: function (player, skill) { + if (player.hasSkill("twpingting")) return; + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + }, + twpingting: { + audio: 2, + trigger: { global: ["roundStart", "dying"] }, + init: function (player, skill) { + if (player.getExpansions("twxingwu").length) player.addAdditionalSkill(skill, ["tianxiang", "liuli"]); + else player.removeAdditionalSkill(skill); + }, + filter: function (event, player) { + if (event.name == "dying") return player == _status.currentPhase && event.player != player; + return true; + }, + forced: true, + group: "twpingting_update", + derivation: ["tianxiang", "liuli"], + content: function () { + "step 0"; + player.draw(); + player.chooseCard("he", "娉婷:将一张牌置于武将牌上,称为“星舞”", true).set("ai", function (card) { + return -get.value(card); + }); + "step 1"; + if (result.bool) { + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("twxingwu"); + } + }, + onremove: function (player, skill) { + if (player.hasSkill("twxingwu")) return; + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + subSkill: { + update: { + trigger: { player: ["loseAfter", "loseAsyncAfter", "addToExpansionAfter"] }, + filter: function (event, player) { + var cards = player.getExpansions("twxingwu"), + skills = player.additionalSkills.twpingting; + return !((cards.length && skills && skills.length) || (!cards.length && (!skills || !skills.length))); + }, + forced: true, + silent: true, + content: function () { + lib.skill.twpingting.init(player, "twpingting"); + }, + }, + }, + }, + tianxiang_daxiaoqiao: { audio: 2, inherit: "tianxiang" }, + liuli_daxiaoqiao: { audio: 2, inherit: "liuli" }, + //傅肜 + twxuewei: { + audio: "xuewei", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player != player && game.players.length > 2 && !player.hasSkill("twxuewei_round"); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twxuewei"), function (card, player, target) { + return target != player && target != _status.event.getTrigger().player; + }) + .set("ai", function (target) { + if (get.attitude(player, _status.event.getTrigger().player) >= 0) return 0; + return get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twxuewei", trigger.player, false); + player.addTempSkill("twxuewei_round", "roundStart"); + player.line2([trigger.player, target]); + trigger.player + .chooseControl("选项一", "选项二") + .set("choiceList", ["本回合不能对" + get.translation(target) + "使用【杀】且手牌上限-2", "令" + get.translation(player) + "视为对你使用一张【决斗】"]) + .set("ai", function () { + var player = _status.event.player, + source = _status.event.getParent().player; + if (get.effect(player, { name: "juedou" }, source, player) > 0) return 1; + if (player.hp - player.countCards("h") > 2 || player.hp <= 2) return 0; + return 1; + }); + } else event.finish(); + "step 2"; + game.log(trigger.player, "选择了", "#g【血卫】", "的", "#y" + result.control); + if (result.control == "选项一") { + trigger.player.markAuto("twxuewei_block", [target]); + trigger.player.addTempSkill("twxuewei_block"); + } else player.useCard({ name: "juedou", isCard: true }, trigger.player, false); + }, + subSkill: { + round: { charlotte: true }, + block: { + charlotte: true, + onremove: true, + locked: true, + mark: true, + marktext: "卫", + intro: { + content: function (storage, player) { + if (!storage || !storage.length) return; + return "不能对" + get.translation(storage) + "使用【杀】;手牌上限-" + 2 * storage.length; + }, + }, + mod: { + maxHandcard: function (player, num) { + return num - 2 * player.getStorage("twxuewei_block").length; + }, + playerEnabled: function (card, player, target) { + if (card.name == "sha" && player.getStorage("twxuewei_block").includes(target)) return false; + }, + }, + }, + }, + }, + twliechi: { + audio: "liechi", + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source && event.source.hp >= player.hp && (event.source.countCards("h") > player.countCards("h") || event.source.countCards("he")); + }, + direct: true, + content: function () { + "step 0"; + var num = trigger.source.countCards("h") - player.countCards("h"); + event.num = num; + var list = [], + choiceList = ["令" + get.translation(trigger.source) + "弃置" + get.cnNumber(num) + "张手牌", "弃置" + get.translation(trigger.source) + "一张牌", "背水!弃置一张装备牌,然后依次执行以上所有选项"]; + if (trigger.source.countCards("h") > player.countCards("h")) list.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (trigger.source.countCards("he")) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if ( + trigger.source.countCards("h") > player.countCards("h") && + trigger.source.countCards("he") && + player.countCards("he", { type: "equip" }) && + game.getGlobalHistory("changeHp", evt => { + return evt.player == player && evt.getParent()._dyinged; + }).length + ) + list.push("背水!"); + else choiceList[2] = '' + choiceList[2] + "(未进入过濒死状态)"; + player + .chooseControl(list, "cancel2") + .set("prompt", get.prompt("twliechi", trigger.source)) + .set("choiceList", choiceList) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + if (get.attitude(player, trigger.source) > 0) return "cancel2"; + if (list.includes("背水!")) return "背水!"; + if (num > 1) return "选项一"; + return "选项二"; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("twliechi", trigger.source); + game.log(player, "选择了", "#g【烈斥】", "的", "#y" + result.control); + if (result.control == "背水!") player.chooseToDiscard("he", { type: "equip" }, true); + if (result.control != "选项二") trigger.source.chooseToDiscard("h", num, true); + if (result.control != "选项一") player.discardPlayerCard(trigger.source, "he", true); + } + }, + }, + //卢植 + twmingren: { + marktext: "任", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "twmingren_change", + audio: "nzry_mingren_1", + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && !player.getExpansions("twmingren").length; + }, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (!player.countCards("h")) event.finish(); + else + player.chooseCard("h", "明任:将一张手牌置于武将牌上,称为“任”", true).set("ai", function (card) { + return 6 - get.value(card); + }); + "step 2"; + if (result.bool) player.addToExpansion(result.cards[0], player, "give", "log").gaintag.add("twmingren"); + }, + subSkill: { + change: { + audio: "nzry_mingren_1", + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + filter: function (event, player) { + return player.countCards("he") && player.getExpansions("twmingren").length; + }, + direct: true, + content: function () { + "step 0"; + player.chooseCard("he", get.prompt("twmingren"), "用一张牌替换“任”(" + get.translation(player.getExpansions("twmingren")[0]) + ")").set("ai", function (card) { + var player = _status.event.player; + var color = get.color(card); + if (color == get.color(player.getExpansions("twmingren")[0])) return false; + var num = 0; + var list = []; + player.countCards("he", function (cardx) { + if (cardx != card || get.color(cardx) != color) return false; + if (list.includes(cardx.name)) return false; + list.push(cardx.name); + switch (cardx.name) { + case "wuxie": + num += game.countPlayer() / 2.2; + break; + case "caochuan": + num += 1.1; + break; + case "shan": + num += 1; + break; + } + }); + return num * (30 - get.value(card)); + }); + "step 1"; + if (result.bool) { + player.logSkill("twmingren"); + player.addToExpansion(result.cards[0], "log", "give", player).gaintag.add("twmingren"); + var card = player.getExpansions("twmingren")[0]; + if (card) player.gain(card, "gain2"); + } + }, + }, + }, + }, + twzhenliang: { + group: ["twzhenliang_1", "twzhenliang_2"], + audio: "nzry_zhenliang_1", + mark: true, + zhuanhuanji: true, + marktext: "☯", + intro: { + content: function (storage, player, skill) { + if (player.storage.twzhenliang == true) return "当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。"; + return "出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。"; + }, + }, + subSkill: { + 1: { + audio: "nzry_zhenliang_1", + enable: "phaseUse", + filter: function (event, player) { + if (player.storage.twzhenliang) return false; + return game.hasPlayer(function (current) { + return player.inRange(current); + }); + }, + position: "he", + filterCard: true, + filterTarget: function (card, player, target) { + return player.inRange(target); + }, + check: function (card) { + var player = _status.event.player, + cardx = player.getExpansions("twmingren")[0]; + if (cardx && get.color(cardx, player) == get.color(card, player)) return 10 - get.value(card); + return 7 - get.value(card); + }, + prompt: "弃置一张牌并对攻击范围内的一名角色造成1点伤害", + content: function () { + "step 0"; + player.changeZhuanhuanji("twzhenliang"); + var cardx = player.getExpansions("twmingren")[0]; + target.damage("nocard"); + if (!cardx || get.color(cards[0], player) != get.color(cardx, player)) event.finish(); + "step 1"; + player.draw(); + }, + ai: { + order: 5, + result: { + player: function (player, target) { + return get.damageEffect(target, player, player); + }, + }, + }, + }, + 2: { + audio: "nzry_zhenliang_1", + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + if (_status.currentPhase == player || !player.storage.twzhenliang) return false; + return player.countCards("he") && event.num > 0 && (event.player == player || player.inRange(event.player)); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard("he", get.prompt("twzhenliang", trigger.player), "弃置一张牌令此伤害-1") + .set("ai", function (card) { + if (_status.event.goon) { + var player = _status.event.player, + cardx = player.getExpansions("twmingren")[0]; + if (cardx && get.color(cardx, player) == get.color(card, player)) return 10 - get.value(card); + return 6 - get.value(card); + } + return 0; + }) + .set("goon", get.attitude(player, trigger.player) > 0).logSkill = ["twzhenliang", trigger.player]; + "step 1"; + if (result.bool) { + player.changeZhuanhuanji("twzhenliang"); + var cardx = player.getExpansions("twmingren")[0]; + if (cardx && get.color(result.cards[0], player) == get.color(cardx, player)) player.draw(); + trigger.num--; + } + }, + }, + }, + }, + //张南 + twfenwu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && player.canUse("sha", current, false, false); + }); + }, + direct: true, + content: function () { + "step 0"; + var list = []; + player.getHistory("useCard", function (evt) { + if (get.type(evt.card) != "basic") return; + var name = evt.card.name, + nature = game.hasNature(evt.card) ? get.nature(evt.card) : ""; + if (!list.includes(name + nature)) list.push(name + nature); + }); + event.addDamage = list.length > 1; + player + .chooseTarget(get.prompt("twfenwu"), "失去1点体力并视为使用一张无距离限制的【杀】" + (event.addDamage ? "(伤害基数+1)" : ""), function (card, player, target) { + return target != player && player.canUse("sha", target, false, false); + }) + .set("ai", function (target) { + var player = _status.event.player; + if (player.hp + player.countCards("hs", { name: ["tao", "jiu"] }) <= 1) return -1; + var num = 1; + if ( + (!target.mayHaveShan( + player, + "use", + target.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) || + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: { name: "sha" }, + }, + true + )) && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: { name: "sha" }, + }) + ) { + num = 1.3; + } + return get.effect(target, { name: "sha" }, player, player) * num; + }); + "step 1"; + if (result.bool) { + var num = 1; + var target = result.targets[0]; + player.logSkill("twfenwu", target); + player.loseHp(); + if (event.addDamage) { + num = 2; + game.log("#y杀", "的伤害基数+1"); + } + player.useCard({ name: "sha", isCard: true }, target, false).baseDamage = num; + } + }, + }, + //呼厨泉 + twfupan: { + audio: 3, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + check: () => true, + onremove: true, + content: function () { + "step 0"; + if (!player.storage.twfupan) player.storage.twfupan = {}; + player.draw(trigger.num); + "step 1"; + if ( + player.countCards("he") && + game.hasPlayer(current => { + return !(player.storage.twfupan[current.playerid] >= 2) && player != current; + }) + ) { + player.chooseCardTarget({ + filterCard: true, + selectCard: 1, + position: "he", + forced: true, + targetprompt: function (target) { + return !_status.event.player.storage.twfupan[target.playerid] ? "你摸两张牌" : "对其
    造成伤害"; + }, + filterTarget: function (card, player, target) { + return !(player.storage.twfupan[target.playerid] >= 2) && player != target; + }, + ai1: function (card) { + var player = _status.event.player; + if (get.value(card, false, "raw") < 0) return 20 * get.value(card); + if (player == _status.currentPhase) return 20 - player.getUseValue(card); + return 20 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (ui.selected.cards.length && get.value(ui.selected.cards[0], false, "raw") < 0) { + return -0.1 - att; + } + if (player.storage.twfupan[target.playerid] === undefined) return 5; + else if (player.storage.twfupan[target.playerid] === 1) return get.damageEffect(target, player, player); + return 1; + }, + prompt: "请选择要交出的卡牌和目标角色", + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var cards = result.cards, + target = result.targets[0]; + player.line(target, "green"); + player.give(cards, target); + event.target = target; + if (!player.storage.twfupan[target.playerid]) { + player.storage.twfupan[target.playerid] = 1; + player.draw(2); + event.finish(); + } else { + player + .chooseBool("复叛:是否对" + get.translation(target) + "造成1点伤害?", "然后你不能再因此技能交给其牌") + .set("ai", () => _status.event.bool) + .set("bool", get.damageEffect(target, player, player) > 0); + } + } + "step 3"; + if (result.bool) { + player.line(target, "fire"); + target.damage(); + player.storage.twfupan[target.playerid]++; + } + }, + ai: { + maixie: true, + maixie_hp: true, + threaten: 0.9, + }, + }, + //刘璋 + twyaohu: { + audio: "yinlang", + trigger: { player: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return ( + !player.hasSkill("twyaohu_round") && + game.hasPlayer(function (current) { + return current.group && current.group != "unknown"; + }) + ); + }, + content: function () { + "step 0"; + var list = []; + game.countPlayer(function (current) { + if (current.group && current.group != "unknown") list.add(current.group); + }); + list.sort(function (a, b) { + return lib.group.indexOf(a) - lib.group.indexOf(b); + }); + if (!player.hasSkill("twyaohu")) list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "邀虎:请选择一个势力") + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var getn = function (group) { + return game.countPlayer(function (current) { + if (current.group != group) return false; + if (player == current) return 2; + if (get.attitude(current, player) > 0) return 1; + return 1.3; + }); + }; + list.sort(function (a, b) { + return getn(b) - getn(a); + }); + return list[0]; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill( + "twyaohu", + game.filterPlayer(function (current) { + return current.group == result.control; + }) + ); + game.log(player, "选择了", "#y" + get.translation(result.control + 2)); + player.storage.yaohu = result.control; + player.storage.twyaohu = result.control; + player.markSkill("twyaohu"); + } + }, + ai: { combo: "jutu" }, + intro: { content: "已选择了$势力" }, + group: "twyaohu_gain", + subSkill: { + round: {}, + gain: { + audio: "yinlang", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player.group == player.storage.yaohu && event.player.isIn() && player.getExpansions("jutu").length > 0; + }, + forced: true, + locked: false, + logTarget: "player", + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + target.chooseButton(["选择获得一张“生”", player.getExpansions("jutu")], true).set("ai", function (button) { + return get.value(button.link, player); + }); + "step 1"; + if (result.bool) { + target.gain(result.links, "give", player); + } + "step 2"; + if ( + game.hasPlayer(function (current) { + return current != player && current != target; + }) + ) { + player + .chooseTarget(true, "选择" + get.translation(target) + "使用【杀】的目标", function (card, player, target) { + return target != player && target != _status.event.source; + }) + .set("source", target) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.source, evt.player); + }); + } else { + event._result = { bool: false }; + event.goto(4); + } + "step 3"; + var target2 = result.targets[0]; + player.line(target2, "green"); + target + .chooseToUse( + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + "对" + get.translation(target2) + "使用一张杀,否则本回合使用伤害牌指定" + get.translation(player) + "为目标时须交给" + get.translation(player) + "两张牌,否则此牌对" + 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.targetEnabled.apply(this, arguments); + }) + .set("sourcex", target2) + .set("addCount", false); + "step 4"; + if (!result.bool) player.addTempSkill("twyaohu_effect"); + }, + }, + effect: { + audio: "yinlang", + trigger: { global: "useCardToPlayer" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return event.target == player && get.tag(event.card, "damage"); + }, + logTarget: "player", + content: function () { + "step 0"; + var hs = trigger.player.getCards("he"); + if (hs.length < 2) event._result = { bool: false }; + else + trigger.player + .chooseCard(2, "交给" + get.translation(player) + "两张牌,否则取消" + get.translation(trigger.card) + "对其的目标", "he") + .set("ai", card => { + if (_status.event.goon) return 5 - get.value(card); + return 0; + }) + .set("goon", get.effect(player, trigger.card, trigger.player, trigger.player) > 0); + "step 1"; + if (result.bool) { + trigger.player.give(result.cards, player); + } else { + trigger.untrigger(); + trigger.targets.remove(player); + trigger.getParent().triggeredTargets1.remove(player); + } + }, + }, + }, + }, + //李遗 + twjiaohua: { + audio: 2, + trigger: { global: "gainAfter" }, + filter: function (event, player) { + if (event.getParent().name != "draw") return false; + if (event.player != player && !event.player.isMinHp()) return false; + var cards = event.cards, + list = ["basic", "trick", "equip"]; + for (var card of cards) if (list.includes(get.type2(card))) list.remove(get.type2(card)); + for (var type of event.player.getStorage("twjiaohua_gained")) if (list.includes(type)) list.remove(type); + return list.length > 0; + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + prompt2: function (event, player) { + var cards = event.cards, + list = ["basic", "trick", "equip"]; + for (var card of cards) if (list.includes(get.type2(card))) list.remove(get.type2(card)); + for (var type of event.player.getStorage("twjiaohua_gained")) if (list.includes(type)) list.remove(type); + var name = event.player == player ? "你" : get.translation(event.player); + return ( + "令" + + name + + "从牌堆或弃牌堆中获得一张" + + (event.player.isUnderControl(true) + ? list + .map(i => get.translation(i) + "牌") + .join("、") + .replace(/(.*)、/, "$1或") + : "本次未获得的类别的牌") + ); + }, + logTarget: "player", + content: function () { + trigger.player.addTempSkill("twjiaohua_gained"); + var cards = trigger.cards, + list = ["basic", "trick", "equip"]; + for (var card of cards) if (list.includes(get.type2(card))) list.remove(get.type2(card)); + for (var type of trigger.player.getStorage("twjiaohua_gained")) if (list.includes(type)) list.remove(type); + list.randomSort(); + var card = get.cardPile(function (card) { + return list.includes(get.type2(card)); + }); + if (card) { + trigger.player.gain(card, "gain2"); + trigger.player.markAuto("twjiaohua_gained", [get.type2(card)]); + } + }, + subSkill: { + gained: { onremove: true, charlotte: true }, + }, + }, + //阎象 + twkujian: { + audio: 3, + enable: "phaseUse", + filterCard: true, + selectCard: [1, 3], + usable: 1, + discard: false, + lose: false, + delay: false, + filterTarget: lib.filter.notMe, + global: "twkujian_ai", + 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 () { + player.give(cards, target).gaintag.add("twkujianx"); + player.addSkill("twkujian_draw"); + player.addSkill("twkujian_discard"); + }, + ai: { + expose: 0.2, + order: 7, + 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; + } + } + } + }, + }, + }, + subSkill: { + draw: { + audio: "twkujian", + trigger: { global: ["useCardAfter", "respondAfter"] }, + forced: true, + logTarget: "player", + charlotte: true, + filter: function (event, player) { + return event.player.hasHistory("lose", evt => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; + } + }); + }, + content: function () { + "step 0"; + game.asyncDraw([player, trigger.player]); + "step 1"; + game.delayx(); + }, + }, + discard: { + audio: "twkujian", + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + logTarget: function (event, player) { + return game.filterPlayer(function (current) { + var evt = event.getl(current); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + var name = event.getParent().name; + if (name == "useCard" || name == "respond") return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("twkujianx")) return true; + } + return false; + } + return current.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; + } + return false; + }); + }); + }, + charlotte: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + var evt = event.getl(current); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + var name = event.getParent().name; + if (name == "useCard" || name == "respond") return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("twkujianx")) return true; + } + return false; + } + return current.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; + } + return false; + }); + }); + }, + content: function () { + "step 0"; + var event = trigger; + var targets = game.filterPlayer(function (current) { + var evt = event.getl(current); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + var name = event.getParent().name; + if (name == "useCard" || name == "respond") return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("twkujianx")) return true; + } + return false; + } + return current.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; + } + return false; + }); + }); + targets.add(player); + targets.sortBySeat(); + _status.event.targets = targets; + "step 1"; + var target = targets.shift(); + if (target.countCards("he") > 0) target.chooseToDiscard("he", true); + if (targets.length > 0) event.redo(); + }, + }, + ai: { + charlotte: true, + ai: { + effect: { + player_use: function (card, player, target) { + if ( + card.cards && + card.cards.some(i => i.hasGaintag("twkujianx")) && + game.hasPlayer(current => { + return get.attitude(player, current) > 0; + }) + ) + return [1, 1]; + }, + }, + }, + mod: { + aiOrder: function (player, card, num) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("twkujianx") && + game.hasPlayer(current => { + return get.attitude(player, current) > 0; + }) + ) + return num + 0.5; + }, + aiValue: function (player, card, num) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("twkujianx") && + game.hasPlayer(current => { + return get.attitude(player, current) > 0; + }) + ) + return num + 0.5; + }, + }, + }, + }, + }, + twruilian: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("twruilian")).set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + eff = att / (player == target ? 2 : 1) + 1; + if (att >= 0) { + if (target.hasSkill("yongsi")) return eff * 5; + if (target.hasSkill("zhiheng") || target.hasSkill("rezhiheng")) return eff * 4; + if (target.hasSkill("rekurou")) return eff * 3; + if (target.hasSkill("xinlianji") || target.hasSkill("dclianji")) return eff * 2; + if (target.needsToDiscard()) return eff * 1.5; + return eff; + } + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twruilian", target); + player.markAuto("twruilian2", [target]); + player.addSkill("twruilian2"); + } + }, + }, + twruilian2: { + trigger: { global: "phaseEnd" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return player.getStorage("twruilian2").includes(event.player); + }, + intro: { content: "已选择$" }, + content: function () { + "step 0"; + player.removeSkill("twruilian2"); + var target = trigger.player; + event.target = target; + var cards = []; + target.getHistory("lose", function (evt) { + if (evt.type == "discard") cards.addArray(evt.cards2); + }); + if (cards.length < 2) event.finish(); + else event.cards = cards; + "step 1"; + var list = []; + for (var type of ["basic", "trick", "equip"]) { + for (var card of event.cards) { + if (get.type2(card) == type) { + list.push(type); + break; + } + } + } + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "睿敛:是否与" + get.translation(target) + "各获得一种类型的牌?") + .set("ai", function () { + var player = _status.event.player, + list = _status.event.controls; + if (player.hp <= 3 && !player.countCards("h", { name: ["shan", "tao"] }) && list.includes("basic")) return "basic"; + if (player.countCards("he", { type: "equip" }) < 2 && list.includes("equip")) return "equip"; + if (list.includes("trick")) return "trick"; + return list.remove("cancel2").randomGet(); + }); + "step 2"; + if (result.control != "cancel2") { + player.logSkill("twruilian2", target); + var type = result.control; + var list = [target, player].sortBySeat(_status.currentPhase), + cards = []; + for (var current of list) { + var card = get.discardPile(function (card) { + return get.type2(card) == type && !cards.includes(card); + }); + if (card) { + cards.push(card); + current.gain(card, "gain2"); + } + } + } + }, + }, + //夏侯恩 + twfujian: { + audio: 2, + group: "twfujian_lose", + trigger: { + global: "phaseBefore", + player: ["enterGame", "phaseZhunbeiBegin"], + }, + filter: function (event, player) { + if (player.getEquips(1).length) return false; + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + content: function () { + var card = get.cardPile2(function (card) { + return get.type(card) == "equip" && get.subtype(card) == "equip1"; + }); + event.card = card; + if (card) player.equip(card); + else { + game.log("但是牌堆中没有武器牌了!"); + event.finish(); + } + }, + subSkill: { + lose: { + audio: "twfujian", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + if (evt && evt.cards2 && evt.cards2.some(i => get.subtype(i) == "equip1")) return true; + return false; + }, + forced: true, + content: function () { + player.loseHp(); + }, + }, + }, + }, + twjianwei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (!player.getEquips(1).length) return false; + return game.hasPlayer(function (current) { + return player.inRange(current) && player.canCompare(current); + }); + }, + pindianCheck: function (player, target) { + 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 (Math.min(13, hs[0].number + player.getAttackRange()) > ts[0].number || (ts[0].number > 9 && get.value(ts[0]) <= 5) || target.countCards("j")) return true; + return false; + }, + direct: true, + locked: false, + group: ["twjianwei_pindian", "twjianwei_zhaocha"], + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("twjianwei"), "与攻击范围内的一名角色拼点。若你赢,你获得其每个区域里的一张牌;若其赢,其获得你装备区里的武器牌", function (card, player, target) { + return player.inRange(target) && player.canCompare(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + if (lib.skill.twjianwei.pindianCheck(player, target)) return -5 * get.attitude(player, target); + return -get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twjianwei", target); + player.chooseToCompare(target); + } else event.finish(); + "step 2"; + if (result.bool) { + var num = 0; + if (target.countCards("h")) num++; + if (target.countCards("e")) num++; + if (target.countCards("j")) num++; + if (num) { + player.gainPlayerCard(target, num, "hej", true).set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.position(button.link) == get.position(ui.selected.buttons[i].link)) return false; + } + return true; + }); + } + } else if (!result.tie) { + var card = player.getEquips(1); + if (card.length) target.gain(card, player, "give"); + } + }, + mod: { + aiValue: function (player, card, num) { + if (card.name == "qinggang" || card.name == "qibaodao") return num / 5; + }, + }, + ai: { + unequip: true, + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.card || arg.card.name != "sha" || !player.getEquip(1)) return false; + }, + }, + subSkill: { + pindian: { + audio: "twjianwei", + trigger: { player: "compare", target: "compare" }, + filter: function (event, player) { + if (!player.getEquips(1).length || player.getAttackRange() <= 0) return false; + if (event.player == player) return !event.iwhile; + return true; + }, + forced: true, + locked: false, + content: function () { + var num = player.getAttackRange(); + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += num; + if (trigger.num2 > 13) trigger.num2 = 13; + } + game.log(player, "的拼点牌点数+" + num); + }, + }, + //你是故意找茬是不是 + zhaocha: { + trigger: { global: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (event.player == player) return false; + return event.player.canCompare(player); + }, + direct: true, + content: function () { + "step 0"; + trigger.player + .chooseBool("剑威:是否与" + get.translation(player) + "拼点?", "若你赢,你获得其装备区里的武器牌;若其赢,其获得你每个区域里的一张牌") + .set("ai", () => _status.event.choice) + .set("choice", get.attitude(trigger.player, player) < 0 && !lib.skill.twjianwei.pindianCheck(player, trigger.player)); + "step 1"; + if (result.bool) { + trigger.player.logSkill("twjianwei", player); + trigger.player.chooseToCompare(player); + } else event.finish(); + "step 2"; + if (!result.tie) { + if (result.bool) { + var card = player.getEquips(1); + if (card.length) trigger.player.gain(card, player, "give"); + } else { + var num = 0; + if (trigger.player.countCards("h")) num++; + if (trigger.player.countCards("e")) num++; + if (trigger.player.countCards("j")) num++; + if (num) + player.gainPlayerCard(trigger.player, num, "hej", true).set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.position(button.link) == get.position(ui.selected.buttons[i].link)) return false; + } + return true; + }); + } + } + }, + }, + }, + }, + //夏侯尚 + twtanfeng: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countDiscardableCards(player, "hej") > 0; + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twtanfeng"), function (card, player, target) { + return target != player && target.countDiscardableCards(player, "hej") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player, + num = 1; + if (get.attitude(player, target) > 0) num = 3; + else if (!target.countCards("he") || !target.canUse("sha", player)) { + if (target.hp + target.countCards("hs", { name: ["tao", "jiu"] }) <= 1) num = 2; + else num = 1.2; + } + return get.effect(target, { name: "guohe" }, player, player) * num * (player.hp <= 1 && get.attitude(player, target) <= 0 ? 0 : 1); + }) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twtanfeng", target); + player.discardPlayerCard(target, "hej", true); + } else event.finish(); + "step 2"; + target.chooseCardTarget({ + position: "hes", + prompt: "选择一张牌当做【杀】对" + get.translation(player) + "使用", + prompt2: "或点击“取消”,受到其造成的1点火焰伤害,并令其跳过本回合的一个阶段(准备阶段和结束阶段除外)", + filterCard: function (card, player) { + return player.canUse(get.autoViewAs({ name: "sha" }, [card]), _status.event.getParent().player, false); + }, + filterTarget: function (card, player, target) { + var source = _status.event.getParent().player; + if (target != source && !ui.selected.targets.includes(source)) return false; + card = get.autoViewAs({ name: "sha" }, [card]); + return lib.filter.filterTarget.apply(this, arguments); + }, + selectTarget: function () { + var card = get.card(), + player = get.player(); + if (!card) return; + card = get.autoViewAs({ name: "sha" }, [card]); + var range = [1, 1]; + game.checkMod(card, player, range, "selectTarget", player); + return range; + }, + ai1: function (card) { + var player = _status.event.player, + target = _status.event.getParent().player; + var eff = get.effect(target, get.autoViewAs({ name: "sha" }, [card]), player, player); + var eff2 = get.damageEffect(player, target, player, "fire"); + if (eff < 0 || eff2 > 0 || eff2 > eff || get.tag(card, "recover")) return 0; + return (player.hp == 1 ? 10 : 6) - get.value(card); + }, + ai2: function (target) { + if (target == _status.event.getParent().player) return 100; + return get.effect(target, { name: "sha" }, _status.event.player); + }, + }); + "step 3"; + if (result.bool) { + var cards = result.cards, + targets = result.targets; + var cardx = get.autoViewAs({ name: "sha" }, cards); + target.useCard(cardx, cards, targets, false); + event.finish(); + } else { + player.line(target, "fire"); + target.damage(1, "fire"); + } + "step 4"; + if (!target.isIn()) { + event.finish(); + return; + } + var list = []; + var list2 = []; + event.map = { + phaseJudge: "判定阶段", + phaseDraw: "摸牌阶段", + phaseUse: "出牌阶段", + phaseDiscard: "弃牌阶段", + }; + for (var i of ["phaseJudge", "phaseDraw", "phaseUse", "phaseDiscard"]) { + if (!player.skipList.includes(i)) { + i = event.map[i]; + list.push(i); + if (i != "判定阶段" && i != "弃牌阶段") list2.push(i); + } + } + target + .chooseControl(list) + .set("prompt", "探锋:令" + get.translation(player) + "跳过一个阶段") + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var att = get.attitude(target, player); + var num = player.countCards("j"); + if (att > 0) { + if (list.includes("判定阶段") && num > 0) return "判定阶段"; + return "弃牌阶段"; + } + if (list.includes("摸牌阶段") && player.hasJudge("lebu")) return "摸牌阶段"; + if ((list.includes("出牌阶段") && player.hasJudge("bingliang")) || player.needsToDiscard() > 0) return "出牌阶段"; + return list2.randomGet(); + })() + ); + "step 5"; + for (var i in event.map) { + if (event.map[i] == result.control) player.skip(i); + } + target.popup(result.control); + target.line(player); + game.log(player, "跳过了", "#y" + result.control); + }, + }, + //宗预 + twzhibian: { + audio: "zhibian", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return game.hasPlayer(current => current != player && player.canCompare(current)); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("twzhibian"), "与一名其他角色拼点", function (card, player, target) { + return target != player && player.canCompare(target); + }) + .set("ai", function (target) { + if (!_status.event.goon) return false; + var att = get.attitude(player, target); + if ( + att < 0 && + (target.countCards("h") > 1 || + target.countCards("e", function (card) { + return player.canEquip(card) && get.effect(player, card, target, player) > 0; + })) + ) + return -att / Math.sqrt(target.countCards("h")); + if (!player.isDamaged()) return false; + if (att <= 0) return (1 - att) / Math.sqrt(target.countCards("h")); + return Math.sqrt((2 / att) * Math.sqrt(target.countCards("h"))); + }) + .set( + "goon", + (function () { + if ( + !player.hasCard(function (card) { + return card.number >= 14 - player.hp && get.value(card) <= 5; + }) + ) + return false; + return true; + })() + ); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twzhibian", target); + player.chooseToCompare(target); + } else event.finish(); + "step 2"; + if (result.bool) { + var list = [], + list2 = ["将" + get.translation(target) + "区域中的一张牌移动到你的区域内", "回复1点体力", "背水!弃置一张非基本牌,并依次执行上述所有选项"]; + if ( + target.countCards("h") || + target.hasCard(function (card) { + return player.canEquip(card); + }, "e") || + target.hasCard(function (card) { + return player.canAddJudge(card); + }, "j") + ) + list.push("选项一"); + else list2[0] = '' + list2[0] + ""; + if (player.isDamaged()) list.push("选项二"); + else list2[1] = '' + list2[1] + ""; + if (!list.length) { + event.finish(); + return; + } + if (player.countCards("he", card => get.type(card) != "basic")) list.push("背水!"); + else list2[2] = '' + list2[2] + ""; + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "直辩:选择一项") + .set("choiceList", list2) + .set("ai", function () { + var target = _status.event.getParent().target; + if ( + _status.event.controls.includes("背水!") && + player.isDamaged() && + (target.countCards("h") || + target.countCards("e", function (card) { + return player.canEquip(card) && get.value(card, target) >= 4 + player.getDamagedHp(); + })) + ) + return 2; + if ( + player.isDamaged() && + (player.hp <= 2 || + (!target.countCards("h") && + !target.countCards("e", function (card) { + return player.canEquip(card) && get.value(card, target) >= 4 + player.getDamagedHp(); + }))) + ) + return 1; + return 0; + }); + } else { + player.loseHp(); + event.finish(); + } + "step 3"; + if (result.control != "cancel2") { + event.control = result.control; + if ( + result.control == "背水!" && + player.countCards("he", function (card) { + return get.type(card) != "basic"; + }) + ) + player.chooseToDiscard("he", true, function (card) { + return get.type(card) != "basic"; + }); + } else event.finish(); + "step 4"; + if (event.control == "选项一" || event.control == "背水!") { + player.choosePlayerCard(target, "hej", true).set("ai", get.buttonValue); + } else event.goto(6); + "step 5"; + if (result.bool) { + var card = result.cards[0]; + switch (get.position(card)) { + case "h": + player.gain(card, target, "giveAuto"); + break; + case "e": + target.$give(card, player, false); + player.equip(card); + break; + case "j": + target.$give(card, player, false); + player.addJudge(card); + break; + } + } + "step 6"; + if (event.control == "选项二" || event.control == "背水!") player.recover(); + }, + }, + twyuyan: { + audio: "yuyan", + trigger: { target: "useCardToTarget" }, + filter: function (event, player) { + return event.card.name == "sha" && event.card.isCard && player.hp < event.player.hp; + }, + forced: true, + logTarget: "player", + content: function () { + "step 0"; + var num = get.number(trigger.card), + str = ""; + if (typeof num == "number") str = "点数大于" + get.cnNumber(num) + "的"; + else str = "非基本"; + if ( + (typeof num == "number" && + (num >= 13 || + !trigger.player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.number(card) > num; + }, "he"))) || + (typeof num != "number" && + !trigger.player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.type(card) != "basic"; + }, "he")) + ) + event._result = { bool: false }; + else + trigger.player + .chooseCard( + "he", + function (card) { + if (typeof _status.event.number == "number") return get.number(card) > _status.event.number; + return get.type(card) != "basic"; + }, + "交给" + get.translation(player) + "一张" + str + "牌,或取消" + get.translation(trigger.card) + "对其的目标" + ) + .set("number", num) + .set("ai", function (card) { + if (card.name == "shan" || card.name == "tao" || card.name == "jiu") return false; + return 6 - get.value(card); + }); + "step 1"; + if (result.bool) trigger.player.give(result.cards, player); + else { + trigger.targets.remove(player); + trigger.getParent().triggeredTargets2.remove(player); + trigger.untrigger(); + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && player.hp > target.hp && get.attitude(player, target) < 0) { + var num = get.number(card); + var bs = player.getCards("h", function (cardx) { + return (typeof num == "number" ? get.number(cardx) > num : get.type(cardx) != "basic") && !["", "", ""].includes(cardx.name); + }); + if (bs.length < 2) return 0; + if (player.hasSkill("jiu") || player.hasSkill("tianxianjiu")) return; + if (bs.length <= 2) { + for (var i = 0; i < bs.length; i++) { + if (get.value(bs[i]) < 6) { + return [1, 0, 1, -0.5]; + } + } + return 0; + } + return [1, 0, 1, -0.5]; + } + }, + }, + }, + }, + //周处 + twguoyi: { + audio: "zhangming", + trigger: { player: "useCardToTargeted" }, + filter: function (event, player) { + if (event.target == player || (event.card.storage && event.card.storage.twguoyi)) return false; + return (event.card.name == "sha" || get.type(event.card) == "trick") && (event.target.isMaxHp() || event.target.isMaxHandcard() || player.countCards("h") <= player.getDamagedHp() + 1); + }, + check: function (event, player) { + return get.attitude(player, event.target) <= 0; + }, + logTarget: "target", + group: "twguoyi_reuse", + content: function () { + "step 0"; + event.bool1 = false; + event.bool2 = false; + if (trigger.target.isMaxHp() || trigger.target.isMaxHandcard()) event.bool1 = true; + if (player.countCards("h") <= player.getDamagedHp() + 1) event.bool2 = true; + if (!trigger.target.countCards("he")) event._result = { index: 0 }; + else + trigger.target + .chooseControl() + .set("choiceList", ["本回合不能使用或打出手牌", "弃置" + get.cnNumber(player.getDamagedHp() + 1) + "张牌"]) + .set("ai", function () { + var player = _status.event.player; + if (player.countCards("h") <= player.getHandcardLimit()) return 0; + return 1; + }); + "step 1"; + player.addTempSkill("twguoyi_" + result.index); + if (result.index == 0) trigger.target.addTempSkill("twguoyi_hand"); + else trigger.target.chooseToDiscard("he", player.getDamagedHp() + 1, true); + "step 2"; + if ((event.bool1 && event.bool2) || (player.hasSkill("twguoyi_0") && player.hasSkill("twguoyi_1"))) { + if (!trigger.getParent().twguoyi_reuse) + trigger.getParent().twguoyi_reuse = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + storage: { twguoyi: true }, + }; + } + }, + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, + hand: { + charlotte: true, + mark: true, + intro: { content: "不能使用或打出手牌" }, + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; + }, + }, + }, + reuse: { + charlotte: true, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return event.twguoyi_reuse; + }, + direct: true, + content: function () { + var card = trigger.twguoyi_reuse; + for (var i of trigger.targets) { + if (!i.isIn() || !player.canUse(card, i, false)) return; + } + if (trigger.addedTarget && !trigger.addedTarget.isIn()) return; + if (trigger.addedTargets && trigger.addedTargets.length) { + for (var i of trigger.addedTargets) { + if (!i.isIn()) return; + } + } + var next = player.useCard(get.copy(card), trigger.targets, false); + if (trigger.addedTarget) next.addedTarget = trigger.addedTarget; + if (trigger.addedTargets && trigger.addedTargets.length) next.addedTargets = trigger.addedTargets.slice(0); + }, + }, + }, + }, + twchuhai: { + audio: "chuhai", + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + var targets = []; + player.getHistory("sourceDamage", evt => { + if (player != evt.player && evt._dyinged) targets.add(evt.player); + }); + return targets.length >= 2; + }, + forced: true, + locked: false, + dutySkill: true, + skillAnimation: true, + animationColor: "wood", + group: "twchuhai_lose", + content: function () { + "step 0"; + game.log(player, "成功完成使命"); + player.awakenSkill("twchuhai"); + if (!player.isDisabledJudge()) player.disableJudge(); + event.current = player.next; + "step 1"; + if (!event.current.countCards("he")) event.goto(3); + else event.current.chooseCard("交给" + get.translation(player) + "一张牌", "he", true).set("ai", get.disvalue2); + "step 2"; + if (result.bool && result.cards && result.cards.length) event.current.give(result.cards, player); + "step 3"; + event.current = event.current.next; + if (event.current != player) event.goto(1); + }, + subSkill: { + lose: { + audio: "chuhai", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + forced: true, + dutySkill: true, + filter: function (event, player) { + var cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer(current => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.length) return true; + return false; + }); + }, + content: function () { + "step 0"; + var cards = trigger.getg(player); + if (!cards.length) { + event.finish(); + return; + } + player + .chooseCard("h", "除害:将其中一张得到的牌置入弃牌堆", true, function (card) { + return _status.event.cards.includes(card); + }) + .set("ai", function (card) { + return -get.value(card); + }) + .set("cards", cards); + "step 1"; + if (result.bool) player.loseToDiscardpile(result.cards); + }, + }, + }, + }, + //桥公 + twyizhu: { + audio: "yizhu", + group: ["twyizhu_use", "twyizhu_discard"], + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + content: function () { + "step 0"; + player.draw(2); + "step 1"; + var hs = player.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, 2, "选择两张牌洗入牌堆"); + "step 2"; + if (result.bool) { + player.$throw(result.cards.length, 1000); + player.lose(result.cards, ui.cardPile).insert_index = function () { + return ui.cardPile.childNodes[get.rand(0, game.players.length * 2 - 2)]; + }; + player.markAuto("twyizhu", result.cards); + } else event.finish(); + "step 3"; + game.updateRoundNumber(); + game.delayx(); + }, + intro: { + mark: function (dialog, content, player) { + if (player == game.me || player.isUnderControl()) dialog.addAuto(content); + else { + var names = []; + for (var i of content) names.add(i.name); + return get.translation(names); + } + }, + }, + subSkill: { + use: { + audio: "yizhu", + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + return ( + player.getStorage("twyizhu").length && + event.player != player && + event.targets.length == 1 && + event.cards.filter(function (i) { + return player.getStorage("twyizhu").includes(i); + }).length > 0 + ); + }, + logTarget: "player", + forced: true, + locked: false, + content: function () { + "step 0"; + var list = []; + if ( + !game.hasPlayer(function (current) { + return current != trigger.target && lib.filter.targetEnabled2(trigger.card, trigger.player, current); + }) + ) + event.goto(3); + var filter = function (event, player) { + var card = event.card, + info = get.info(card); + if (info.allowMultiple == false) return false; + if (!info.multitarget) { + return game.hasPlayer(current => lib.filter.targetEnabled2(card, player, current)); + } + return false; + }; + var enable = filter(trigger.getParent(), trigger.player); + var prompt2 = "操作提示:"; + if (enable) prompt2 += "选择一名合法的其他角色,以增加其为目标;或"; + prompt2 += "选择目标角色(" + get.translation(trigger.target) + ")和另一名合法的角色,以取消前者为目标并增加后者为目标"; + player + .chooseTarget("遗珠:是否" + (enable ? "增加或" : "") + "修改目标?", prompt2, [enable ? 1 : 2, 2], (card, player, target) => { + var evt = _status.event.getTrigger(), + card = evt.card; + if (target == evt.target) return true; + if (ui.selected.targets.length && ui.selected.targets[0] != evt.target) return false; + return lib.filter.targetEnabled2(card, evt.player, target); + }) + .set("targetprompt", target => { + return target == _status.event.targetx ? "取消目标" : "增加目标"; + }) + .set("filterOk", () => { + if (ui.selected.targets.length == 1 && ui.selected.targets[0] == _status.event.targetx) return false; + return true; + }) + .set("ai", target => { + var evt = _status.event.getTrigger(), + card = evt.card, + player = _status.event.player; + if (target == evt.target && get.effect(evt.target, card, evt.player, player) < 0) return 100; + if (target == evt.target) return -100; + return get.effect(target, card, evt.player, player); + }) + .set("targetx", trigger.target) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + var target = result.targets[result.targets[0] == trigger.target ? 1 : 0]; + if (result.targets.length > 1) { + player.line2([trigger.target, target]); + trigger.targets.remove(trigger.target); + trigger.getParent().triggeredTargets1.remove(trigger.target); + trigger.untrigger(); + } else player.line(target); + trigger.targets.push(target); + } + "step 2"; + var list = trigger.cards.filter(function (i) { + return player.getStorage("twyizhu").includes(i); + }); + player.unmarkAuto("twyizhu", list); + player.draw(); + game.delayx(); + }, + }, + discard: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + silent: true, + forced: true, + locked: false, + filter: function (event, player) { + return ( + player.getStorage("twyizhu").length && + event.getd().filter(function (i) { + return player.getStorage("twyizhu").includes(i); + }).length > 0 + ); + }, + content: function () { + var list = trigger.getd().filter(function (i) { + return player.getStorage("twyizhu").includes(i); + }); + player.unmarkAuto("twyizhu", list); + }, + }, + }, + }, + twluanchou: { + audio: "luanchou", + enable: "phaseUse", + usable: 1, + selectTarget: 2, + filterTarget: true, + multitarget: true, + multiline: true, + content: function () { + "step 0"; + game.filterPlayer() + .sortBySeat() + .forEach(function (current) { + current.removeSkills("twgonghuan"); + }); + "step 1"; + targets.sortBySeat(); + for (var i of targets) i.addSkills("twgonghuan"); + }, + derivation: "twgonghuan", + ai: { + order: 10, + expose: 0.2, + result: { + target: function (player, target) { + return Math.max(0.1, target.hp) * (get.attitude(player, target) + 20); + }, + }, + }, + }, + twgonghuan: { + audio: "gonghuan", + trigger: { global: "damageBegin4" }, + usable: 1, + filter: function (event, player) { + if (event.player == player) return false; + return !event.twgonghuan && event.player.hp <= player.hp && event.player.hasSkill("twgonghuan"); + }, + check: function (event, player) { + if (get.damageEffect(event.player, event.source, player) > 0 || (get.attitude(player, event.player) > 0 && get.damageEffect(event.player, event.source, event.player) > 0)) return false; + return get.attitude(player, event.player) > 0 && event.player.hp < player.hp && ((["君", "主"].includes(lib.translate[event.player.identity]) && !["野", "内"].includes(lib.translate[player.identity])) || player.hp + player.hujia - event.num > 0); + }, + logTarget: "player", + content: function () { + trigger.cancel(); + player + .damage(trigger.source ? trigger.source : "nosource", trigger.nature, trigger.num) + .set("card", trigger.card) + .set("cards", trigger.cards).twgonghuan = true; + }, + }, + //桥蕤 + twxiawei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + locked: false, + group: ["twxiawei_init", "twxiawei_lose", "twxiawei_unmark"], + content: function () { + "step 0"; + player + .chooseControl("1", "2", "3", "4", "cancel2") + .set("prompt", get.prompt("twxiawei")) + .set("prompt2", "妄行:将X+1张牌置于武将牌上,称为“威”") + .set("ai", function () { + var player = _status.event.player; + if (player.maxHp > 3) return 3; + return Math.min(3, player.countCards("he") + 1); + }); + "step 1"; + if (result.control != "cancel2") { + var num = result.index + 1, + cards = get.cards(num + 1); + player.logSkill("twxiawei"); + player.addTempSkill("wangxing"); + player.addMark("wangxing", num, false); + player.$gain2(cards, false); + game.log(player, "将", cards, "作为“威”置于了武将牌上"); + player.loseToSpecial(cards, "twxiawei").visible = true; + } else event.finish(); + "step 2"; + player.markSkill("twxiawei"); + game.delayx(); + }, + marktext: "威", + intro: { + mark: function (dialog, storage, player) { + var cards = player.getCards("s", function (card) { + return card.hasGaintag("twxiawei"); + }); + if (!cards || !cards.length) return; + dialog.addAuto(cards); + }, + markcount: function (storage, player) { + return player.countCards("s", function (card) { + return card.hasGaintag("twxiawei"); + }); + }, + onunmark: function (storage, player) { + var cards = player.getCards("s", function (card) { + return card.hasGaintag("twxiawei"); + }); + if (cards.length) { + player.loseToDiscardpile(cards); + } + }, + }, + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("twxiawei")) return num + 0.5; + }, + }, + subSkill: { + init: { + audio: "twxiawei", + trigger: { global: "phaseBefore", player: "enterGame" }, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + locked: false, + content: function () { + "step 0"; + var cards = []; + for (var i = 1; i <= 2; i++) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && get.type(card) == "basic"; + }); + if (card) cards.push(card); + } + if (cards.length) { + player.$gain2(cards, false); + game.log(player, "将", cards, "作为“威”置于了武将牌上"); + player.loseToSpecial(cards, "twxiawei").visible = true; + } else event.finish(); + "step 1"; + player.markSkill("twxiawei"); + game.delayx(); + }, + }, + lose: { + audio: "twxiawei", + trigger: { player: "phaseBegin" }, + filter: function (event, player) { + return player.countCards("s", function (card) { + return card.hasGaintag("twxiawei"); + }); + }, + forced: true, + locked: false, + content: function () { + var cards = player.getCards("s", function (card) { + return card.hasGaintag("twxiawei"); + }); + player.loseToDiscardpile(cards); + }, + }, + unmark: { + trigger: { player: "loseAfter" }, + filter: function (event, player) { + if (!event.ss || !event.ss.length) return false; + return !player.countCards("s", function (card) { + return card.hasGaintag("twxiawei"); + }); + }, + charlotte: true, + forced: true, + silent: true, + content: function () { + player.unmarkSkill("twxiawei"); + }, + }, + }, + }, + wangxing: { + trigger: { player: "phaseEnd" }, + charlotte: true, + onremove: true, + forced: true, + popup: false, + filter: function (event, player) { + return player.countMark("wangxing") > 0; + }, + content: function () { + "step 0"; + player.chooseToDiscard("he", player.countMark("wangxing"), "妄行:请弃置" + get.cnNumber(player.countMark("wangxing")) + "张牌,或减1点体力上限").set("ai", function (card) { + var player = _status.event.player; + if (player.maxHp == 1) return 100 - get.value(card); + return 5 + Math.max(0, 5 - player.maxHp) - get.value(card); + }); + "step 1"; + if (!result.bool) player.loseMaxHp(); + }, + intro: { content: "回合结束时,你须弃置#张牌,否则减1点体力上限" }, + }, + twqiongji: { + audio: 2, + trigger: { player: ["useCardAfter", "respondAfter", "damageBegin3"] }, + filter: function (event, player) { + if (event.name == "damage") + return !player.countCards("s", function (card) { + return card.hasGaintag("twxiawei"); + }); + return ( + !player.hasSkill("twqiongji_silent") && + player.getHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twxiawei")) return true; + } + return false; + }).length > 0 + ); + }, + forced: true, + content: function () { + if (trigger.name == "damage") trigger.num++; + else { + player.draw(); + player.addTempSkill("twqiongji_silent"); + } + }, + ai: { + combo: "twxiawei", + halfneg: true, + }, + subSkill: { silent: { charlotte: true } }, + }, + //卞夫人 + twwanwei: { + audio: "wanwei", + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + return event.player.isMinHp(); + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0 && event.player.hp < player.hp; + }, + usable: 1, + logTarget: "player", + prompt2: function (event, player) { + if (player != event.player) { + return "防止" + get.translation(event.player) + "即将受到的" + event.num + "点伤害,然后你失去1点体力"; + } else if ( + event.player == player || + !game.hasPlayer(function (current) { + return current != player && current.maxHp > player.maxHp; + }) + ) { + return "于当前回合的结束阶段获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之"; + } + }, + content: function () { + if (trigger.player != player) { + trigger.cancel(); + player.loseHp(); + } + if ( + trigger.player == player || + !game.hasPlayer(function (current) { + return current != player && current.maxHp > player.maxHp; + }) + ) + player.addTempSkill("twwanwei_effect"); + }, + subSkill: { + effect: { + audio: "wanwei", + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + prompt2: "获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之", + content: function () { + "step 0"; + var card = get.cards()[0]; + player.gain(card, "gain2"); + "step 1"; + var card = get.bottomCards()[0]; + ui.cardPile.appendChild(card); + game.updateRoundNumber(); + player.showCards([card], get.translation(player) + "挽危:牌堆底的牌"); + if (player.hasUseTarget(card)) player.chooseUseTarget(card, true); + }, + }, + }, + }, + twyuejian: { + audio: "yuejian", + enable: "phaseUse", + filterCard: true, + selectCard: function () { + var player = _status.event.player; + var num = Math.max(1, player.countCards("h") - player.getHandcardLimit()); + return [1, num]; + }, + complexCard: true, + discard: false, + loseTo: "cardPile", + insert: true, + visible: true, + delay: false, + position: "he", + usable: 1, + check: function (card) { + if (ui.selected.cards.length >= 3) return 0; + var player = _status.event.player; + var num = Math.max(1, player.countCards("h") - player.getHandcardLimit()); + if (num >= 3) return 5 - get.value(card); + if (num >= 2 && player.isDamaged() && ui.selected.cards.length < 1) return 7 - get.value(card); + if (num >= 1 && player.isDamaged() && !ui.selected.cards.length) return 6 - get.value(card); + return 0; + }, + content: function () { + "step 0"; + player.$throw(cards.length); + var next = player.chooseToMove(); + next.set("list", [["牌堆顶", cards], ["牌堆底"]]); + next.set("prompt", "约俭:将这些牌置于牌堆顶或牌堆底"); + next.set("processAI", function (list) { + var cards = list[0][1], + player = _status.event.player; + var target = player.next; + var att = get.sgn(get.attitude(player, target)); + var top = []; + var judges = target.getCards("j"); + var stopped = false; + if (player != target || !target.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)) * att; + }); + if (judge(cards[0]) * att < 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)) * att; + }); + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) break; + top.unshift(cards.shift()); + } + } + bottom = cards.sort(function (a, b) { + return player.getUseValue(a) - player.getUseValue(b); + }); + 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++) { + top[i].fix(); + ui.cardPile.insertBefore(top[i], ui.cardPile.firstChild); + } + for (i = 0; i < bottom.length; i++) { + bottom[i].fix(); + 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(); + "step 2"; + if (cards.length >= 3) player.gainMaxHp(); + "step 3"; + if (cards.length >= 2) player.recover(); + "step 4"; + if (cards.length >= 1) { + player.addSkill("twyuejian_effect"); + player.addMark("twyuejian_effect", 1, false); + } + }, + ai: { + order: 5, + result: { player: 1 }, + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + marktext: "俭", + intro: { + content: "手牌上限+#", + }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("twyuejian_effect"); + }, + }, + }, + }, + }, + //陈震 + twmuyue: { + audio: 1, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") || player.hasSkill("twmuyue_effect"); + }, + chooseButton: { + dialog: function () { + var list = []; + for (var i of lib.inpile) { + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + } + return ui.create.dialog("睦约", [list, "vcard"]); + }, + check: function (button) { + if ( + !get.cardPile2(function (cardx) { + return cardx.name == button.link[2]; + }) + ) + return 0; + return get.value({ name: button.link[2] }); + }, + backup: function (links, player) { + return { + audio: "twmuyue", + filterCard: function (card, player, target) { + return !player.hasSkill("twmuyue_effect"); + }, + selectCard: function () { + var player = _status.event.player; + return player.hasSkill("twmuyue_effect") ? -1 : 1; + }, + check: function (card) { + return 7 - get.value(card); + }, + position: "he", + card: links[0], + filterTarget: true, + content: function () { + "step 0"; + var card = lib.skill.twmuyue_backup.card; + event.card = card; + player.removeSkill("twmuyue_effect"); + var cardx = get.cardPile2(function (cardx) { + return cardx.name == card[2]; + }); + player.line(target, "green"); + if (cardx) target.gain(cardx, "gain2"); + else { + player.chat("无牌可得了吗?!"); + game.log("但是牌堆中已经没有", "#g【" + get.translation(card[2]) + "】", "了!"); + } + "step 1"; + if (cards && cards.length && get.name(cards[0], player) == card[2]) player.addSkill("twmuyue_effect"); + }, + ai: { + result: { + target: function (player, target) { + var att = Math.abs(get.attitude(player, target)); + if (target.hasSkill("nogain")) att /= 10; + return att / Math.sqrt(get.distance(player, target, "absolute")); + }, + }, + }, + }; + }, + prompt: function (links, player) { + return (player.hasSkill("twmuyue_effect") ? "" : "弃置一张牌,") + "令一名角色从牌堆中获得一张【" + get.translation(links[0][2]) + "】"; + }, + }, + ai: { + order: 3, + result: { player: 1 }, + }, + subSkill: { + effect: { + charlotte: true, + mark: true, + intro: { content: "下一次发动【睦约】无需弃牌" }, + }, + backup: {}, + }, + }, + twchayi: { + audio: 1, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("twchayi"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + return -get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twchayi", target); + if (!target.countCards("h")) event._result = { index: 1 }; + else target.chooseControl().set("choiceList", ["展示手牌", "下一次使用牌时候弃一张牌"]); + } else event.finish(); + "step 2"; + target.storage.twchayi_re = [result.index, target.countCards("h")]; + target.addSkill("twchayi_re"); + target.markSkill("twchayi_re"); + if (result.index == 0) target.showCards(target.getCards("h"), get.translation(target) + "的手牌"); + else { + target.addMark("twchayi_effect", 1, false); + target.addSkill("twchayi_effect"); + } + }, + subSkill: { + effect: { + intro: { content: "使用下一张牌时弃置&张牌" }, + charlotte: true, + onremove: true, + audio: "twchayi", + trigger: { player: "useCard" }, + forced: true, + content: function () { + player.chooseToDiscard("he", true, player.countMark("twchayi_effect")); + player.removeSkill("twchayi_effect"); + }, + }, + re: { + charlotte: true, + onremove: true, + audio: "twchayi", + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.storage.twchayi_re; + }, + content: function () { + if (player.countCards("h") != player.storage.twchayi_re[1]) { + player.popup("察异"); + if (player.storage.twchayi_re[0] == 0) { + player.addMark("twchayi_effect", 1, false); + player.addSkill("twchayi_effect"); + } else player.showCards(player.getCards("h"), get.translation(player) + "的手牌"); + } + player.removeSkill("twchayi_re"); + }, + marktext: "异", + intro: { + markcount: function (storage, player) { + if (!storage || !storage.length) return 0; + return storage[1]; + }, + content: function (storage, player) { + if (!storage || !storage.length) return; + return "下个回合结束时,若你的手牌数不为" + storage[1] + ",你" + (storage[0] == 0 ? "下次使用牌时弃置一张牌" : "展示所有手牌"); + }, + }, + }, + }, + }, + //费祎 + twshengxi: { + audio: "shengxi_feiyi", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getHistory("useCard").length > 0 && player.getHistory("sourceDamage").length == 0; + }, + direct: true, + content: function () { + "step 0"; + var list = get.zhinangs(); + player.chooseButton(["###" + get.prompt("twshengxi") + "###获得一张智囊并摸一张牌", [list, "vcard"]]).set("ai", function (card) { + return (Math.random() + 0.5) * get.value({ name: card.link[2] }, _status.event.player); + }); + "step 1"; + if (result.bool) { + player.logSkill("twshengxi"); + var card = get.cardPile2(function (card) { + return card.name == result.links[0][2]; + }); + if (card) player.gain(card, "gain2"); + player.draw(); + } + }, + group: "twshengxi_zhunbei", + subfrequent: ["zhunbei"], + subSkill: { + zhunbei: { + audio: "shengxi_feiyi", + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + prompt2: "从游戏外或牌堆中获得一张【调剂盐梅】", + content: function () { + if (!_status.tiaojiyanmei_suits || _status.tiaojiyanmei_suits.length > 0) { + if (!lib.inpile.includes("tiaojiyanmei")) { + game.broadcastAll(function () { + lib.inpile.add("tiaojiyanmei"); + }); + } + if (!_status.tiaojiyanmei_suits) _status.tiaojiyanmei_suits = lib.suit.slice(0); + player.gain(game.createCard2("tiaojiyanmei", _status.tiaojiyanmei_suits.randomRemove(), 6), "gain2"); + } else { + var card = get.cardPile2(function (card) { + return card.name == "tiaojiyanmei"; + }); + if (card) player.gain(card, "gain2"); + } + }, + }, + }, + }, + twkuanji: { + audio: "fyjianyu", + trigger: { + player: "loseAfter", + global: ["cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + filter: function (event, player) { + if (event.name != "cardsDiscard") { + return event.getd(player, "cards2").length > 0; + } else { + if (event.cards.filterInD("d").length <= 0) return false; + var evt = event.getParent(); + if (evt.name != "orderingDiscard") return false; + var evtx = evt.relatedEvent || evt.getParent(); + if (evtx.player != player) return false; + if (evtx.name == "useCard") return false; + return player.hasHistory("lose", evtxx => { + return evtx == (evtxx.relatedEvent || evtxx.getParent()); + }); + } + }, + usable: 1, + direct: true, + content: function () { + "step 0"; + var cards = []; + if (trigger.name != "cardsDiscard") { + cards = trigger.getd(player, "cards2"); + } else cards = trigger.cards.filterInD("d"); + player.chooseButton(["宽济:是否将一张牌交给一名其他角色?", cards]).set("ai", function (button) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) + return Math.abs(get.value(button.link, "raw")) + 1; + return -get.value(button.link, "raw"); + }); + "step 1"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + player.chooseTarget("请选择【宽济】的目标", "令一名其他角色获得" + get.translation(card), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target) * get.value(_status.event.getParent().card, target) * (target.hasSkillTag("nogain") ? 0.1 : 1); + }); + } else { + player.storage.counttrigger.twkuanji--; + event.finish(); + } + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twkuanji", target); + target.gain(card, "gain2"); + } + }, + }, + shengxi_feiyi: { audio: 2 }, + //王越 + twyulong: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget) return false; + if (event.card.name != "sha") return false; + return event.targets.some(target => player.canCompare(target)); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twyulong"), (card, player, target) => { + return _status.event.getTrigger().targets.includes(target) && player.canCompare(target); + }) + .set("ai", target => { + if (player.hasCard(card => get.value(card) < 6, "h")) return -get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twyulong", target); + if (player.canCompare(target)) { + player.chooseToCompare(target); + } + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + var color = get.color(result.player, false); + if (color == "black") trigger.getParent().baseDamage++; + else if (color == "red") trigger.directHit.addArray(game.players); + trigger.getParent().twyulong = true; + player.addTempSkill("twyulong_addCount"); + } + }, + subSkill: { + addCount: { + charlotte: true, + forced: true, + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (!event.card || event.card.name != "sha") return false; + var evt = event.getParent(2); + if (evt.name != "useCard" || !evt.twyulong) return false; + return true; + }, + content: function () { + var evt = trigger.getParent(2); + if (evt.addCount !== false) { + evt.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + } + }, + }, + }, + }, + twjianming: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + if (event.card.name != "sha" || !lib.suit.includes(get.suit(event.card))) return false; + var list = []; + player.getHistory("useCard", function (evt) { + if (evt.card.name == "sha") { + if (event.card != evt.card) list.push(get.suit(evt.card)); + } + }); + player.getHistory("respond", function (evt) { + if (evt.card.name == "sha") { + if (event.card != evt.card) list.push(get.suit(evt.card)); + } + }); + return !list.includes(get.suit(event.card)); + }, + forced: true, + content: function () { + player.draw(); + }, + }, + //李彦 + twzhenhu: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (!event.isFirstTarget || !get.tag(event.card, "damage")) return false; + return ( + !player.hasSkillTag("noCompareSource") && + game.hasPlayer(target => { + return player.canCompare(target, true); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twzhenhu"), [1, 3], function (card, player, target) { + return player.canCompare(target, true); + }) + .set("ai", function (target) { + var player = _status.event.player, + targets = _status.event.getTrigger().targets; + var num = 0; + if (player.hasSkill("twlvren")) num += 2 * (ui.selected.targets.length + 1); + if (player.hasSkill("twchuanshu_effect")) num += 3; + var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + if (hs.length == 0) return -1; + var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + if (Math.min(13, get.number(hs[0]) + num) <= get.number(ts[0])) return -1; + return get.effect(target, { name: "guohe_copy2" }, player, player) / 2 + (targets.includes(target) ? get.damageEffect(target, player, player) : 0); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + event.targets = targets; + player.logSkill("twzhenhu", targets); + player.draw(); + } else event.finish(); + "step 2"; + player + .chooseToCompare(targets, function (card) { + return get.number(card); + }) + .setContent("chooseToCompareMeanwhile"); + "step 3"; + if (result.winner && result.winner == player) { + event.targets.remove(result.winner); + player.line(event.targets, trigger.card.nature); + player.addTempSkill("twzhenhu_add"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.twzhenhu = event.targets; + } else player.loseHp(); + }, + subSkill: { + add: { + charlotte: true, + onremove: true, + forced: true, + popup: false, + trigger: { global: "damageBegin1" }, + filter: function (event, player) { + if (!event.card || !event.card.storage) return false; + var targets = event.card.storage.twzhenhu; + return targets && targets.includes(event.player); + }, + content: function () { + trigger.num++; + }, + }, + }, + }, + twlvren: { + audio: 2, + trigger: { source: "damageBegin3" }, + filter: function (event, player) { + return event.player != player && event.player.isIn() && !event.player.hasMark("twlvren"); + }, + logTarget: "player", + forced: true, + locked: false, + group: ["twlvren_more", "twlvren_add"], + content: function () { + trigger.player.addMark("twlvren", 1); + }, + ai: { + effect: { + player: function (card, player, target) { + if (target && target.hasMark("twlvren")) return 0.33; + }, + }, + }, + marktext: "刃", + intro: { name2: "刃", content: "mark" }, + subSkill: { + more: { + audio: "twlvren", + trigger: { player: "useCard2" }, + filter: function (event, player) { + var card = event.card, + info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + return ( + get.tag(card, "damage") && + event.targets && + game.hasPlayer(function (target) { + return target.hasMark("twlvren") && !event.targets.includes(target) && lib.filter.targetEnabled2(card, player, target); + }) + ); + } + return false; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("twlvren"), "为" + get.translation(trigger.card) + "额外指定一个有“刃”的角色为目标", function (card, player, target) { + var evt = _status.event.getTrigger(); + return target.hasMark("twlvren") && !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target); + }) + .set("ai", function (target) { + return get.effect(target, _status.event.getTrigger().card, _status.event.player); + }); + "step 1"; + if (result.bool) { + var targets = result.targets; + player.logSkill("twlvren", targets); + player.line(targets, trigger.card.nature); + trigger.targets.addArray(targets); + for (var i of targets) i.removeMark("twlvren", i.countMark("twlvren"), false); + } + }, + }, + add: { + audio: "twlvren", + trigger: { player: "compare", target: "compare" }, + filter: function (event, player) { + if (player != event.target && event.iwhile) return false; + return true; + }, + forced: true, + locked: false, + content: function () { + var num = 2 * trigger.lose_list.length; + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += num; + if (trigger.num2 > 13) trigger.num2 = 13; + } + game.log(player, "的拼点牌点数+", num); + }, + }, + }, + }, + //童渊 + twchaofeng: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if (!["sha", "shan"].includes(name)) return false; + return player.hasCard(function (card) { + const name2 = get.name(card); + return (name2 == "sha" || name2 == "shan") && name != name2; + }, "hs"); + }, + filter: function (event, player) { + const names = []; + if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event)) names.push("shan"); + if (event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) names.push("sha"); + return ( + names.length > 0 && + player.hasCard(function (card) { + return names.includes(get.name(card)); + }, "hs") + ); + //return false; + }, + group: "twchaofeng_compare", + chooseButton: { + dialog: function (event, player) { + var list = []; + if (event.filterCard({ name: "sha" }, player, event)) { + list.push(["基本", "", "sha"]); + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } + if (event.filterCard({ name: "shan" }, player, event)) { + list.push(["基本", "", "shan"]); + } + var dialog = ui.create.dialog("朝凤", [list, "vcard"], "hidden"); + dialog.direct = true; + return dialog; + }, + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + _status.event.getParent().type != "phase" || + game.hasPlayer(function (current) { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + switch (button.link[2]) { + case "shan": + return 5; + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder" || button.link[3] == "ice") return 2.92; + else return 2.9; + } + } + return 0; + }, + backup: function (links, player) { + return { + audio: "twchaofeng", + name: links[0][2], + filterCard: function (card, player, target) { + if (lib.skill.twchaofeng_backup.name == "sha") return get.name(card) == "shan"; + else return get.name(card) == "sha"; + }, + selectCard: 1, + check: function (card, player, target) { + return 6 - get.value(card); + }, + viewAs: { name: links[0][2], nature: links[0][3] }, + position: "hs", + popname: true, + }; + }, + prompt: function (links, player) { + var view, use; + if (links[0][2] == "sha") { + use = "【闪】"; + view = get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】"; + } else { + use = "【杀】"; + view = "【闪】"; + } + return "将一张" + use + "当做" + view + (_status.event.name == "chooseToUse" ? "使用" : "打出"); + }, + }, + ai: { + skillTagFilter: function (player, tag) { + var name; + switch (tag) { + case "respondSha": + name = "shan"; + break; + case "respondShan": + name = "sha"; + break; + } + if (!player.countCards("hs", name)) return false; + }, + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + if (player.countCards("hs", "shan") > 0 && lib.inpile_nature.some(i => player.getUseValue({ name: "sha", nature: i }) > 0)) { + var temp = get.order({ name: "sha" }); + if (temp > max) max = temp; + } + if (max > 0) max += 0.3; + return max; + } + return 4; + }, + result: { + player: 1, + }, + respondSha: true, + respondShan: true, + fireAttack: true, + }, + subSkill: { + compare: { + audio: "twchaofeng", + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("twchaofeng"), "选择至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】", [1, 3], (card, player, target) => { + return player.canCompare(target); + }) + .set("ai", function (target) { + var player = _status.event.player, + targets = _status.event.getTrigger().targets; + var num = 0, + card = { name: "sha", nature: "fire", isCard: true }; + if (target.hasSkill("twlvren")) num += 2 * (ui.selected.targets.length + 1); + if (target.hasSkill("twchuanshu_effect")) num += 3; + var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + if (get.number(hs[0]) <= Math.min(13, get.number(ts[0]) + num)) { + return 6 + get.effect(player, card, target, target); + } + return get.effect(target, { name: "guohe_copy2" }, player, player) / 2 + get.effect(target, card, player, player); + }); + "step 1"; + if (result.bool) { + event.targets = result.targets; + player.logSkill("twchaofeng_compare", event.targets); + player.chooseToCompare(event.targets).setContent("chooseToCompareMeanwhile"); + } + "step 2"; + if (result.winner) { + var targets = [player].addArray(event.targets).sortBySeat(player); + targets.remove(result.winner); + var card = { name: "sha", nature: "fire", isCard: true }; + var targetsx = targets.filter(function (target) { + return result.winner.canUse(card, target, false); + }); + if (targetsx.length) result.winner.useCard(card, targetsx, "noai").set("addCount", false); + } + }, + }, + }, + }, + twchuanshu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + limited: true, + skillAnimation: true, + animationColor: "qun", + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("twchuanshu")).set("ai", target => get.attitude(_status.event.player, target)); + "step 1"; + if (result.bool) { + player.awakenSkill("twchuanshu"); + var target = result.targets[0]; + player.logSkill("twchuanshu", target); + target.addMark("twchuanshu_mark", 1, false); + target.addSkill("twchuanshu_effect"); + target.markAuto("twchuanshu_effect", [player]); + player.addSkill("twchuanshu_clear"); + player.markAuto("twchuanshu_clear", [target]); + } + }, + subSkill: { + mark: { + charlotte: true, + }, + effect: { + audio: "twchuanshu", + trigger: { + player: "compare", + target: "compare", + }, + direct: true, + forced: true, + charlotte: true, + nopop: true, + mark: true, + intro: { + content: function (storage, player) { + var shisyou = player.getStorage("twchuanshu_effect").filter(i => i.isIn()); + var str = "
  • 拼点牌点数+3;"; + if (player.hasMark("twchuanshu_mark")) { + str += "
  • 使用的下一张【杀】对除" + get.translation(shisyou) + "外的角色造成伤害时,此伤害+" + player.countMark("twchuanshu_mark") + ";"; + if (!shisyou.includes(player)) { + str += "
  • 使用的下一张【杀】结算结束后," + get.translation(shisyou) + "摸等同于伤害值的牌;"; + } + } + str = str.slice(0, -1) + "。"; + return str; + }, + }, + filter: function (event, player, name) { + if (event.player == player && event.iwhile > 0) return false; + return (player == event.player ? event.num1 : event.num2) < 13; + }, + content: function () { + game.log(player, "的拼点牌点数+3"); + if (player == trigger.player) trigger.num1 = Math.min(13, trigger.num1 + 3); + else trigger.num2 = Math.min(13, trigger.num2 + 3); + }, + group: "twchuanshu_damage", + }, + damage: { + charlotte: true, + trigger: { player: ["useCard", "useCardAfter"], source: "damageBegin1" }, + filter: function (event, player, name) { + if (name == "useCard") return event.card.name == "sha" && player.hasMark("twchuanshu_mark"); + if (name == "damageBegin1") return event.card && event.card.twchuanshu_mark && !player.getStorage("twchuanshu_effect").includes(event.player); + return ( + event.card.twchuanshu_mark && + player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) && + player.getStorage("twchuanshu_effect").filter(function (target) { + return target.isIn() && target != player; + }).length + ); + }, + forced: true, + content: function () { + var name = event.triggername; + if (name == "useCard") { + var num = player.countMark("twchuanshu_mark"); + trigger.card.twchuanshu_mark = num; + player.removeMark("twchuanshu_mark", num, false); + } else if (name == "damageBegin1") trigger.num++; + else { + var num1 = trigger.card.twchuanshu_mark; + var num2 = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.card == trigger.card) num2 += evt.num; + }); + var targets = player.getStorage("twchuanshu_effect").filter(function (target) { + return target.isIn() && target != player; + }); + if (targets.length == 1) targets[0].draw(num1 * num2); + else game.asyncDraw(targets, num1 * num2); + } + }, + }, + clear: { + charlotte: true, + onremove: true, + trigger: { player: "phaseBegin" }, + filter: function (event, player) { + return player.getStorage("twchuanshu_clear").length; + }, + forced: true, + silent: true, + content: function () { + "step 0"; + var targets = player.getStorage("twchuanshu_clear"); + for (var target of targets) { + target.unmarkAuto("twchuanshu_effect", [player]); + if (!target.getStorage("twchuanshu_effect").length) target.removeSkill("twchuanshu_effect"); + } + "step 1"; + player.removeSkill("twchuanshu_clear"); + }, + }, + }, + }, + //徐庶 + twjiange: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filterCard: function (card, player) { + return get.type(card) != "basic"; + }, + usable: 1, + locked: false, + viewAs: { name: "sha", storage: { twjiange: true } }, + viewAsFilter: function (player) { + if ( + !player.countCards("hes", function (card) { + return get.type(card) != "basic"; + }) + ) + return false; + }, + position: "hes", + selectCard: function () { + return _status.event.skill == "twjiange" ? 1 : Infinity; + }, + precontent: function () { + if (player != _status.currentPhase) { + player + .when({ player: ["useCard", "respond"] }) + .filter(evt => evt.skill == "twjiange") + .then(() => player.draw()); + } + event.getParent().addCount = false; + }, + prompt: "将一张非基本牌当杀使用或打出", + check: function (card) { + var val = get.value(card); + if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); + return 6 - val; + }, + ai: { + order: function (item, player) { + var target = _status.currentPhase; + if (!target || target != player) return 7; + return 1; + }, + respondSha: true, + skillTagFilter: function (player) { + if ( + !player.countCards("hes", function (card) { + return get.type(card) != "basic"; + }) + ) + return false; + }, + }, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.twjiange) return true; + }, + cardUsable: function (card, player, num) { + if (card.storage && card.storage.twjiange) return Infinity; + }, + }, + }, + twxiawang: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (!event.source || get.distance(player, event.player) > 1 || !player.canUse("sha", event.source, false, false)) return false; + return player.countCards("h") > 0; + }, + direct: true, + content: function () { + player + .chooseToUse( + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + "侠望:是否对" + get.translation(trigger.source) + "使用一张杀?" + ) + .set("logSkill", "twxiawang") + .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", trigger.source); + player.addTempSkill("twxiawang_damage"); + }, + subSkill: { + damage: { + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (event.getParent(2).name != "twxiawang") return false; + if (!player.hasHistory("sourceDamage", evt => evt.card == event.card)) return false; + for (var phase of lib.phaseName) { + var evt = event.getParent(phase); + if (evt && evt.name == phase) return true; + } + return false; + }, + content: function () { + player.popup(); + player.removeSkill("twjiange_damage"); + for (var phase of lib.phaseName) { + var evt = event.getParent(phase); + if (evt && evt.name == phase) { + var name = ["准备", "判定", "摸牌", "出牌", "弃牌", "结束"][lib.phaseName.indexOf(phase)]; + game.log(player, "令", _status.currentPhase, "结束了" + name + "阶段"); + player.line(_status.currentPhase, "thunder"); + evt.skipped = true; + } + } + }, + }, + }, + }, + //好萌 + twgongge: { + audio: 3, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget || !event.targets) return false; + return get.tag(event.card, "damage"); + }, + direct: true, + usable: 1, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twgongge"), function (card, player, target) { + var trigger = _status.event.getTrigger(); + return trigger.targets.includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + var att = get.attitude(player, target); + var damageNum = trigger.getParent().baseDamage; + var map = trigger.getParent().customArgs, + id = target.playerid; + if (map[id]) { + if (typeof map[id].baseDamage == "number") damageNum = map[id].baseDamage; + if (typeof map[id].extraDamage == "number") damageNum += map[id].extraDamage; + } + if ( + target.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: trigger.card, + }) + ) + damageNum = 1; + var num = + target.getSkills(null, false, false).filter(function (skill) { + var info = get.info(skill); + return info && !info.charlotte; + }).length + 1; + var list = [0, 0, 0]; + var player = _status.event.player; + list[0] = num; + list[1] = get.effect(target, { name: "guohe_copy2" }, player, player) > 0 ? (target.hp - damageNum < player.hp ? num : num - Math.min(player.getCards("he"), num - 1)) : 0; + if (_status.event.yimie(trigger, player, target, damageNum)) list[2] = (get.recoverEffect(target, player, player) > get.damageEffect(target, player, player) ? Math.min(num - 1, target.getDamagedHp()) : num - 1) * 2; + return Math.max.apply(Math, list); + }) + .set("yimie", function (trigger, player, target, damageNum) { + var hit = true; + var att = get.attitude(player, target); + if (get.type(trigger.card) == "trick" && trigger.player.countCards("hs", { name: "wuxie" })) hit = false; + if ( + trigger.card.name == "huogong" && + trigger.player.countCards("h", function (card) { + var list = []; + for (var i of player.getCards("h")) list.push(get.suit(i)); + return !list.includes(get.suit(card)); + }) + ) + hit = false; + var key; + switch (trigger.card.name) { + case "sha": + case "wanjian": + key = ["shan"]; + break; + case "juedou": + case "nanman": + case "jiedao": + key = ["sha"]; + break; + default: + key = []; + break; + } + if (get.type(trigger.card) == "trick") key.push("wuxie"); + key.push("caochuan"); + var bool1 = get.recoverEffect(target, player, player) > 0 ? 1 : -1; + var bool2 = (att > 0 && !hit) || (target.countCards("hs", { name: key }) && !trigger.getParent().directHit.includes(target)) ? 1 : -1; + if (att <= 0 && target.hp - damageNum > 0) return false; + return (bool1 = bool2 && att != 0); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twgongge", target); + var num = + target.getSkills(null, false, false).filter(function (skill) { + var info = get.info(skill); + return info && !info.charlotte; + }).length + 1; + event.num = num; + var list = []; + var choiceList = ["摸" + get.cnNumber(num) + "张牌,若" + get.translation(target) + "响应此牌,则你跳过下个摸牌阶段", "弃置" + get.translation(target) + get.cnNumber(num) + "张牌,此牌结算完毕后,若" + get.translation(target) + "的体力值不小于你,你交给" + get.translation(target) + get.cnNumber(num - 1) + "张牌", "令此牌对" + get.translation(target) + "造成的伤害+" + (num - 1) + ",此伤害结算完成后,其回复等量的体力值"]; + list.push("摸牌"); + if (target.countDiscardableCards(player, "he")) list.push("拆牌"); + else choiceList[1] = '' + choiceList[1] + ""; + list.push("加伤"); + player + .chooseControl(list) + .set("prompt", "攻阁:请选择一项(" + get.translation(target) + "对应X值:" + (num - 1) + ")") + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var att = get.attitude(player, target); + var damageNum = trigger.getParent().baseDamage; + var map = trigger.getParent().customArgs, + id = target.playerid; + if (map[id]) { + if (typeof map[id].baseDamage == "number") damageNum = map[id].baseDamage; + if (typeof map[id].extraDamage == "number") damageNum += map[id].extraDamage; + } + if ( + target.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: trigger.card, + }) + ) + damageNum = 1; + var yimie = function () { + if (damageNum == 1) return false; + var hit = true; + if (get.type(trigger.card) == "trick" && trigger.player.countCards("hs", { name: "wuxie" })) hit = false; + if ( + trigger.card.name == "huogong" && + trigger.player.countCards("h", function (card) { + var list = []; + for (var i of player.getCards("h")) list.push(get.suit(i)); + return !list.includes(get.suit(card)); + }) + ) + hit = false; + var key; + switch (trigger.card.name) { + case "sha": + case "wanjian": + key = ["shan"]; + break; + case "juedou": + case "nanman": + case "jiedao": + key = ["sha"]; + break; + default: + key = []; + break; + } + key.push("caochuan"); + var bool1 = get.recoverEffect(target, player, player) > 0 ? 1 : -1; + var bool2 = (att > 0 && !hit) || (target.countCards("hs", { name: key }) && !trigger.getParent().directHit.includes(target)) ? 1 : -1; + if (att <= 0 && target.hp - damageNum > 0) return false; + return (bool1 = bool2 && att != 0); + }; + if (yimie()) return "加伤"; + if (list.includes("拆牌") && get.effect(target, { name: "guohe_copy2" }, player, player) > 0 && target.hp - damageNum < player.hp) return "拆牌"; + return "摸牌"; + })() + ) + .set("choiceList", choiceList); + } else { + player.storage.counttrigger.twgongge--; + event.finish(); + } + "step 2"; + game.log(player, "选择了", "#y" + result.control); + switch (result.control) { + case "摸牌": + player.draw(num); + player.addTempSkill("twgongge_buff1"); + var evt = { + card: trigger.card, + target: target, + }; + player.storage.twgongge_buff1 = evt; + break; + case "拆牌": + player.discardPlayerCard(num, target, "he", true); + player.addTempSkill("twgongge_buff2"); + var evt = { + card: trigger.card, + target: target, + num: num - 1, + }; + player.storage.twgongge_buff2 = evt; + break; + case "加伤": + player.addTempSkill("twgongge_buff3"); + var evt = { + card: trigger.card, + target: target, + num: num - 1, + }; + player.storage.twgongge_buff3 = evt; + break; + } + }, + subSkill: { + //摸牌后续 + buff1: { + charlotte: true, + onremove: true, + trigger: { global: ["useCard", "respond"] }, + filter: function (event, player) { + if (player.skipList.includes("phaseDraw")) return false; + if (!Array.isArray(event.respondTo) || player != event.respondTo[0]) return false; + var evt = player.storage.twgongge_buff1; + if (evt.target == event.player && evt.card == event.respondTo[1]) return true; + return false; + }, + direct: true, + popup: false, + content: function () { + player.skip("phaseDraw"); + game.log(player, "跳过了下个", "#g摸牌阶段"); + player.addTempSkill("twgongge_buff1_mark", "phaseDrawSkipped"); + }, + }, + //拆牌后续 + buff2: { + charlotte: true, + onremove: true, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + if (!player.countCards("he")) return false; + var evt = player.storage.twgongge_buff2; + if (evt.card == event.card && evt.target.isIn() && evt.target.hp >= player.hp) return true; + return false; + }, + direct: true, + popup: false, + content: function () { + "step 0"; + var evt = player.storage.twgongge_buff2; + var target = evt.target, + num = evt.num; + event.target = target; + if (player.countCards("he") <= num) event._result = { bool: true, cards: player.getCards("he") }; + else player.chooseCard("he", num, "攻阁:交给" + get.translation(target) + get.cnNumber(num) + "张牌", true); + "step 1"; + if (result.bool) player.give(result.cards, target); + }, + }, + //加伤后续 + buff3: { + charlotte: true, + onremove: true, + trigger: { source: "damageBegin1", player: "useCardAfter" }, + filter: function (event, player) { + if (!event.card) return false; + var evt = player.storage.twgongge_buff3; + if (evt.card == event.card && evt.target.isIn() && (event.name == "useCard" || event.player == evt.target)) return true; + return false; + }, + direct: true, + popup: false, + content: function () { + var evt = player.storage.twgongge_buff3; + if (trigger.name == "damage") trigger.num += evt.num; + else if (evt.target.isIn()) evt.target.recover(evt.num); + }, + }, + buff1_mark: { + mark: true, + intro: { + content: "跳过下一个摸牌阶段", + }, + }, + }, + }, + //魏续 + twsuizheng: { + audio: 3, + trigger: { global: "phaseBefore", player: "enterGame" }, + filter: function (event, player) { + return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); + }, + forced: true, + content: function () { + "step 0"; + player.chooseTarget("请选择【随征】的目标", lib.translate.twsuizheng_info, lib.filter.notMe, true).set("ai", function (target) { + var player = _status.event.player; + return Math.max(1 + get.attitude(player, target) * get.threaten(target), Math.random()); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + game.log(player, "选择了", target, "作为", "“随征”角色"); + player.markAuto("twsuizheng", [target]); + player.addSkill("twsuizheng_draw"); + player.addSkill("twsuizheng_xianfu"); + } + }, + ai: { expose: 0.3 }, + intro: { content: "已选择$为“随征”角色" }, + subSkill: { + draw: { + charlotte: true, + audio: "twsuizheng", + trigger: { global: "damageSource" }, + filter: function (event, player) { + return player.getStorage("twsuizheng").includes(event.source); + }, + forced: true, + logTarget: "source", + content: function () { + player.draw(); + }, + }, + xianfu: { + audio: "twsuizheng", + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return player.getStorage("twsuizheng").includes(event.player) && event.player.isIn(); + }, + forced: true, + charlotte: true, + logTarget: "player", + content: function () { + "step 0"; + player + .chooseToDiscard(2, "随征:弃置两张基本牌", "若你弃牌,你令" + get.translation(trigger.player) + "回复1点体力;或点击“取消”失去1点体力,令" + get.translation(trigger.player) + "获得一张【杀】或【决斗】", { type: "basic" }) + .set("ai", function (card) { + if (_status.event.refuse) return -1; + return 6 - get.value(card); + }) + .set("refuse", get.attitude(player, trigger.player) <= 0 || get.effect(player, { name: "losehp" }) >= 0); + "step 1"; + if (result.bool) trigger.player.recover(); + else { + player.loseHp(); + var card = get.cardPile(function (card) { + return card.name == "sha" || card.name == "juedou"; + }); + if (card) trigger.player.gain(card, "gain2"); + } + }, + }, + }, + }, + twtuidao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + var targets = player.getStorage("twsuizheng"); + if (!targets.length) return false; + return targets.some(target => target.hp <= 2 || !target.isIn()); + }, + check: function (event, player) { + var targets = player.getStorage("twsuizheng"); + var val = 0; + for (var target of targets) { + if (target.hp <= 2 && target.isIn()) val -= get.attitude(player, target); + else if (!target.isIn()) val += 6; + } + return val > 0; + }, + limited: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + player.awakenSkill("twtuidao"); + var list1 = ["equip3", "equip4"].map(i => get.translation(i)), + list2 = ["basic", "trick", "equip"].map(i => get.translation(i)); + var targets = player.getStorage("twsuizheng"), + str = get.translation(targets); + if (targets.length) str = "与" + str; + player + .chooseButton(2, true, ["颓盗:废除你" + str + "的一个坐骑栏废除并选择一个类别", "坐骑栏", [list1, "tdnodes"], "类别", [list2, "tdnodes"]]) + .set("filterButton", function (button) { + var list = _status.event.list, + link = button.link; + if (ui.selected.buttons.length) { + if (list.includes(ui.selected.buttons[0].link) && list.includes(link)) return false; + if (!list.includes(ui.selected.buttons[0].link) && !list.includes(link)) return false; + } + return true; + }) + .set("ai", function (button) { + var player = _status.event.player; + var list = _status.event.list, + link = button.link; + if (list.includes(link)) { + if (player.hasDisabledSlot(4)) return "攻击马"; + if (player.hasDisabledSlot(3)) return "防御马"; + return "攻击马"; + } + if (!list.includes(link)) { + var player = _status.event.player; + var targets = player.getStorage("twsuizheng"); + for (var target of targets) { + if (target.isIn()) { + var listx = [0, 0, 0], + list2 = ["basic", "trick", "equip"].map(i => get.translation(i)); + for (var i of target.getCards("he")) listx[list2.indexOf(get.translation(get.type2(i)))]++; + return list2[listx.indexOf(Math.max.apply(Math, listx))]; + } + } + return 1 + Math.random(); + } + }) + .set("list", list1); + "step 1"; + if (result.links[0].indexOf("马") == -1) result.links.reverse(); + var subtype = result.links[0] == "防御马" ? "equip3" : "equip4", + type = { 基本: "basic", 锦囊: "trick", 装备: "equip" }[result.links[1]]; + player.disableEquip(subtype); + var targets = player.getStorage("twsuizheng"); + for (var target of targets) { + if (target && target.isIn()) { + target.disableEquip(subtype); + var cards = target.getCards("he", card => get.type2(card) == type); + player.gain(cards, target, "give"); + event.gainners = cards; + } else { + var cards = []; + for (var i = 1; i <= 2; i++) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && get.type2(card) == type; + }); + if (card) cards.push(card); + else break; + } + player.gain(cards, "gain2"); + event.gainners = cards; + } + } + "step 2"; + player + .chooseTarget("请重新选择【随征】目标", true, function (card, player, target) { + return !player.getStorage("twsuizheng").includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + return Math.max(1 + get.attitude(player, target) * get.threaten(target), Math.random()); + }); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + game.log(player, "选择了", target, "作为", "“随征”角色"); + delete player.storage.twsuizheng; + player.markAuto("twsuizheng", [target]); + } + }, + ai: { combo: "twsuizheng" }, + }, + //曹休 + twqianju: { + audio: 2, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return get.distance(player, event.player) <= 1 && player.countCards("e") < 5; + }, + forced: true, + usable: 1, + content: function () { + var card = get.cardPile(function (card) { + return get.type(card) == "equip" && player.canEquip(card); + }); + if (card) { + player.$gain2(card); + game.delayx(); + player.equip(card); + } + }, + mod: { + globalFrom: function (from, to, distance) { + return distance - from.countCards("e"); + }, + }, + }, + twqingxi: { + audio: "xinqingxi", + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && player.getHistory("useCard", evt => evt.card.name == "sha").indexOf(event.getParent()) == 0; + }, + check: function (event, player) { + return true; + }, + logTarget: "target", + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + if (!target.countCards("e")) event._result = { index: 0 }; + else + target + .chooseControl() + .set("ai", function () { + if (_status.event.goon || player.hp > 2) return 0; + return 1; + }) + .set("choiceList", ["令" + get.translation(player) + "摸" + get.cnNumber(Math.max(1, player.countCards("e"))) + "张牌,且此【杀】不可被响应", "弃置装备区中的所有牌并弃置" + get.translation(player) + "装备区等量的牌,此【杀】造成的伤害+1"]) + .set("goon", get.attitude(target, player) > 0); + "step 1"; + if (result.index == 0) { + player.draw(Math.max(1, player.countCards("e"))); + trigger.getParent().directHit.add(target); + game.log(trigger.card, "不可被", target, "响应"); + event.finish(); + } else { + var num = target.countCards("e"); + target.discard(target.getCards("e")); + target.discardPlayerCard(player, "e", num, true); + } + "step 2"; + var map = trigger.customArgs; + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; + map[id].extraDamage++; + game.log(trigger.card, "对", target, "造成的伤害+1"); + game.delayx(); + }, + }, + //孙翊 + twzaoli: { + audio: "zaoli", + trigger: { player: "phaseUseBegin" }, + init: function (player) { + if (player.isPhaseUsing()) { + var hs = player.getCards("h"); + player.getHistory("gain", function (evt) { + hs.removeArray(evt.cards); + }); + if (hs.length) player.addGaintag(hs, "twzaoli"); + } + }, + filter: function (event, player) { + return player.countCards("he"); + }, + forced: true, + group: "twzaoli_mark", + content: function () { + "step 0"; + if (player.countCards("h", card => get.type(card) != "equip")) { + player + .chooseCard("h", [1, Infinity], true, "躁厉:请选择至少一张非装备手牌,你弃置这些牌和所有装备牌", (card, player) => { + return get.type(card) != "equip" && lib.filter.cardDiscardable(card, player, "twzaoli"); + }) + .set("ai", function (card) { + if (!card.hasGaintag("twzaoli_temp")) return 5 - get.value(card); + return 1; + }); + } + "step 1"; + var cards = player.getCards("he", { type: "equip" }); + var subtype = []; + event.subtype = subtype.addArray(cards.map(card => get.subtype(card))); + cards.addArray(result.cards || []); + if (cards.length) player.discard(cards); + event.cards = cards; + "step 2"; + player.draw(cards.length); + "step 3"; + var num = 0; + if (event.subtype.length) { + for (var i of event.subtype) { + var card = get.cardPile2(function (card) { + return get.type(card) == "equip" && get.subtype(card) == i; + }); + if (card) { + num++; + player.$gain2(card); + game.delayx(); + player.equip(card); + } + } + } + if (num <= 2) event.finish(); + "step 4"; + player.loseHp(); + }, + onremove: function (player) { + player.removeGaintag("twzaoli"); + }, + mod: { + cardEnabled2: function (card, player) { + if (player.isPhaseUsing() && get.itemtype(card) == "card" && card.hasGaintag("twzaoli")) return false; + }, + }, + subSkill: { + mark: { + trigger: { player: ["phaseUseBegin", "phaseUseAfter", "phaseAfter"] }, + filter: function (event, player) { + return player.countCards("h"); + }, + direct: true, + firstDo: true, + content: function () { + if (event.triggername == "phaseUseBegin") { + var hs = player.getCards("h"); + player.getHistory("gain", function (evt) { + hs.removeArray(evt.cards); + }); + if (hs.length) player.addGaintag(hs, "twzaoli"); + } else { + player.removeGaintag("twzaoli"); + } + }, + }, + }, + }, + //邓芝 + twjimeng: { + audio: "jimeng", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countGainableCards(player, "he") > 0; + }); + }, + filterTarget: function (card, player, target) { + return target != player && target.countGainableCards(player, "hej") > 0; + }, + content: function () { + "step 0"; + player.gainPlayerCard(target, "hej", true); + "step 1"; + var hs = player.getCards("he"); + if (hs.length) { + if (hs.length == 1) event._result = { bool: true, cards: hs }; + else player.chooseCard(true, "交给" + get.translation(target) + "一张牌", "he", true); + } else event.finish(); + "step 2"; + player.give(result.cards, target); + "step 3"; + if (target.hp >= player.hp) player.draw(); + }, + ai: { + order: 8, + result: { + player: function (player, target) { + if (target.hp >= player.hp) return 1; + return 0; + }, + target: function (player, target) { + return get.effect(target, { name: "shunshou" }, player, target) / 10; + }, + }, + }, + }, + //杨仪 + twgongsun: { + audio: "gongsun", + trigger: { player: "phaseUseBegin" }, + forced: true, + direct: true, + filter: function (event, player) { + return game.hasPlayer(current => player.inRange(current)); + }, + content: function () { + "step 0"; + player + .chooseTarget("共损:请选择一名攻击范围内的角色", lib.translate.twgongsun_info, true, function (card, player, target) { + return player != target && player.inRange(target); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) * (1 + target.countCards("h")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twgongsun", target); + player.addTempSkill("twgongsun_shadow", { player: ["phaseBegin", "die"] }); + player + .chooseControl(lib.suit) + .set("prompt", "共损:请选择一个花色") + .set("ai", function (button) { + return lib.suit.randomGet(); + }); + } else event.finish(); + "step 2"; + var suit = result.control; + player.popup(suit + 2, "soil"); + game.log(player, "选择了", suit + 2); + player.storage.twgongsun_shadow.push([target, suit]); + player.markSkill("twgongsun_shadow"); + }, + }, + twgongsun_shadow: { + global: "twgongsun_shadow2", + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + marktext: "损", + onremove: true, + intro: { + content: function (shadow) { + var str = ""; + for (var i = 0; i < shadow.length; i++) { + if (i > 0) str += "
    "; + str += get.translation(shadow[i][0]); + str += ":"; + str += get.translation(shadow[i][1]); + } + return str; + }, + }, + mod: { + cardEnabled: function (card, player) { + var list = player.storage.twgongsun_shadow; + for (var i = 0; i < list.length; i++) { + if (list[i][1] == card.suit) return false; + } + }, + cardRespondable: function (card, player) { + var list = player.storage.twgongsun_shadow; + for (var i = 0; i < list.length; i++) { + if (list[i][1] == card.suit) return false; + } + }, + cardSavable: function (card, player) { + var list = player.storage.twgongsun_shadow; + for (var i = 0; i < list.length; i++) { + if (list[i][1] == card.suit) return false; + } + }, + cardDiscardable: function (card, player) { + var list = player.storage.twgongsun_shadow; + for (var i = 0; i < list.length; i++) { + if (list[i][1] == card.suit) return false; + } + }, + }, + }, + twgongsun_shadow2: { + mod: { + cardEnabled: function (card, player) { + if ( + game.hasPlayer(function (current) { + var list = current.storage.twgongsun_shadow; + if (!list) return false; + for (var i = 0; i < list.length; i++) { + if (list[i][0] == player && list[i][1] == card.suit) return true; + } + return false; + }) + ) + return false; + }, + cardSavable: function (card, player) { + if ( + game.hasPlayer(function (current) { + var list = current.storage.twgongsun_shadow; + if (!list) return false; + for (var i = 0; i < list.length; i++) { + if (list[i][0] == player && list[i][1] == card.suit) return true; + } + return false; + }) + ) + return false; + }, + cardRespondable: function (card, player) { + if ( + game.hasPlayer(function (current) { + var list = current.storage.twgongsun_shadow; + if (!list) return false; + for (var i = 0; i < list.length; i++) { + if (list[i][0] == player && list[i][1] == card.suit) return true; + } + return false; + }) + ) + return false; + }, + cardDiscardable: function (card, player) { + if ( + game.hasPlayer(function (current) { + var list = current.storage.twgongsun_shadow; + if (!list) return false; + for (var i = 0; i < list.length; i++) { + if (list[i][0] == player && list[i][1] == card.suit) return true; + } + return false; + }) + ) + return false; + }, + }, + }, + //濮阳兴 + twzhengjian: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + if (event.name == "phase" && game.phaseNumber != 0) return false; + return !player.hasSkill("twzhengjian_eff0") && !player.hasSkill("twzhengjian_eff1"); + }, + content: function () { + "step 0"; + player + .chooseControl() + .set("prompt", "征建:请选择一种效果") + .set("choiceList", ["令“出牌阶段内未使用过非基本牌”的其他角色受到惩罚", "令“出牌阶段内未得到过牌”的其他角色受到惩罚"]) + .set("ai", () => (Math.random() <= 0.5 ? 0 : 1)); + "step 1"; + player.addSkill("twzhengjian_eff" + result.index); + game.log(player, "获得了", "#g【征建】", "的", "#y效果" + get.cnNumber(result.index + 1, true)); + game.delayx(); + }, + onremove: true, + subSkill: { + eff0: { + audio: "twzhengjian", + trigger: { global: "phaseUseEnd" }, + forced: true, + charlotte: true, + marktext: "建", + mark: true, + filter: function (event, player) { + if (event.player == player || event._twzhengjian || !event.player.isIn()) return false; + if ( + event.player.hasHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event && get.type(evt.card) != "basic"; + }) + ) + return false; + return player.storage.twzhengjian || event.player.countCards("he") > 0; + }, + logTarget: "player", + content: function () { + "step 0"; + trigger._twzhengjian = true; + var target = trigger.player; + event.target = target; + if (player.storage.twzhengjian) { + player + .chooseBool("征建:是否对" + get.translation(target) + "造成1点伤害?") + .set("ai", () => _status.event.goon) + .set("goon", get.damageEffect(target, player, _status.event.player) > 0); + } else { + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + } + "step 1"; + if (result.bool) { + if (result.cards && result.cards.length) { + target.give(result.cards, player).type = "twzhengjian"; + } else target.damage(); + } + player.chooseBool("是否变更【征建】的效果?").set("ai", () => Math.random() > 0.5); + "step 2"; + if (result.bool) { + player.removeSkill("twzhengjian_eff0"); + player.addSkill("twzhengjian_eff1"); + game.log(player, "将", "#g【征建】", "的效果变更为", "#y效果二"); + } + }, + intro: { + content: function (storage, player) { + if (player.storage.twzhengjian) return "其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则你可对其造成1点伤害,然后你可失去此效果并获得〖征建〗的效果二。"; + return "其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果二。"; + }, + }, + }, + eff1: { + audio: "twzhengjian", + trigger: { global: "phaseUseEnd" }, + forced: true, + charlotte: true, + marktext: "征", + mark: true, + filter: function (event, player) { + if (event.player == player || event._twzhengjian || !event.player.isIn()) return false; + if ( + event.player.hasHistory("gain", function (evt) { + return evt.getParent("phaseUse") == event; + }) + ) + return false; + return player.storage.twzhengjian || event.player.countCards("he") > 0; + }, + logTarget: "player", + content: function () { + "step 0"; + trigger._twzhengjian = true; + var target = trigger.player; + event.target = target; + if (player.storage.twzhengjian) { + player + .chooseBool("征建:是否对" + get.translation(target) + "造成1点伤害?") + .set("ai", () => _status.event.goon) + .set("goon", get.damageEffect(target, player, _status.event.player) > 0); + } else { + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + } + "step 1"; + if (result.bool) { + if (result.cards && result.cards.length) { + target.give(result.cards, player).type = "twzhengjian"; + } else target.damage(); + } + player.chooseBool("是否变更【征建】的效果?").set("ai", () => Math.random() > 0.5); + "step 2"; + if (result.bool) { + player.removeSkill("twzhengjian_eff1"); + player.addSkill("twzhengjian_eff0"); + game.log(player, "将", "#g【征建】", "的效果变更为", "#y效果一"); + } + }, + intro: { + content: function (storage, player) { + if (player.storage.twzhengjian) return "其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则你可对其造成1点伤害,然后你可失去此效果并获得〖征建〗的效果一。"; + return "其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果一。"; + }, + }, + }, + }, + }, + twzhongchi: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + forced: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + if (player.storage.twzhengjian || !player.hasSkill("twzhengjian", null, null, false) || !event.getg(player).length) return false; + var num1 = game.countPlayer2(); + var list = []; + player.getAllHistory("gain", function (evt) { + if (evt.type == "twzhengjian") list.add(evt.source); + }); + return list.length >= Math.ceil(num1 / 2); + }, + content: function () { + "step 0"; + player.awakenSkill("twzhongchi"); + "step 1"; + player.recover(2); + player.addSkill("twzhongchi_effect"); + player.storage.twzhengjian = true; + "step 2"; + game.delayx(); + }, + subSkill: { + effect: { + mark: true, + marktext: "斥", + intro: { content: "受到渠道为【杀】的伤害+1" }, + trigger: { player: "damageBegin1" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.name == "sha"; + }, + content: function () { + trigger.num++; + }, + }, + }, + ai: { + combo: "twzhengjian", + }, + }, + //田豫 + twzhenxi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + var target = event.target; + return ( + event.card.name == "sha" && + (target.countCards("h") > 0 || + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }); + }, "e") || + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canAddJudge(card); + }); + }, "j")) + ); + }, + usable: 1, + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + var str = get.translation(target); + var list = ["弃置" + str + "的" + get.cnNumber(get.distance(player, target)) + "张手牌", "将" + str + "装备区或判定区内的一张牌移动到另一名角色的对应区域内"]; + var choices = []; + if (target.countCards("h") > 0) choices.push("选项一"); + else list[0] = '' + list[0] + ""; + if ( + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }); + }, "e") || + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canAddJudge(card); + }); + }, "j") + ) + choices.push("选项二"); + else list[1] = '' + list[1] + ""; + if (choices.length == 2 && (target.hp > player.hp || target.isMaxHp())) choices.push("全部执行"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", list) + .set("prompt", get.prompt("twzhenxi", target)) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().target; + var eff1 = 0, + eff2 = 0; + var choices = _status.event.controls.slice(0); + if (choices.includes("选项一")) { + eff1 = -get.distance(player, target) * get.attitude(player, target); + } + if (choices.includes("选项二")) { + var equip = 0, + judge = 0, + att = get.attitude(player, target); + var es = target.getCards("e"), + js = target.getCards("j"); + for (var i of es) { + var val = get.value(i); + if (att > 0) { + if ( + val <= Math.min(0, equip) && + game.hasPlayer(function (current) { + return current != target && current.canEquip(i) && get.effect(current, i, player, player) > 0; + }) + ) + equip = val; + } else { + if ( + val > Math.max(0, equip) && + game.hasPlayer(function (current) { + return current != target && current.canEquip(i) && get.effect(current, i, player, player) > 0; + }) + ) + equip = val; + } + } + for (var i of js) { + var card = { name: i.viewAs || i.name }; + var effect = get.effect(target, card, player, player); + if (effect < 0) { + game.countPlayer(function (current) { + if (current != target && current.canAddJudge(i)) { + var eff = get.effect(current, card, player, player); + judge = Math.max(eff, judge); + } + }); + } + } + eff2 = Math.max(-equip * att, judge); + } + if (eff1 > 0) { + if (eff2 > 0) { + if (choices.includes("全部执行")) return "全部执行"; + else if (eff2 >= eff1) return "选项二"; + } + return "选项一"; + } else if (eff2 > 0) return "选项二"; + return "cancel2"; + }); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + return; + } + player.logSkill("twzhenxi", target); + event.control = result.control; + if (event.control != "选项二") player.discardPlayerCard(target, true, "h", get.distance(player, target)); + if (event.control == "选项一") event.finish(); + "step 2"; + if ( + event.control != "选项一" && + (target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }); + }, "e") || + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canAddJudge(card); + }); + }, "j")) + ) { + player + .chooseTarget(true, "将" + get.translation(target) + "区域内的一张牌移动给另一名角色", function (card, player, target) { + var source = _status.event.preTarget; + if (source == target) return false; + return ( + source.hasCard(function (card) { + return target.canEquip(card); + }, "e") || + source.hasCard(function (card) { + return target.canAddJudge(card); + }, "j") + ); + }) + .set("preTarget", target) + .set("ai", function (target) { + var player = _status.event.player, + source = _status.event.preTarget; + var att = get.attitude(player, source); + var es = source.getCards("e", function (card) { + return target.canEquip(card); + }), + js = source.getCards("j", function (card) { + return target.canAddJudge(card); + }); + var eff = 0; + for (var i of es) { + var val = get.value(i, source); + if (att > 0 ? val <= 0 : val > 0) { + eff = Math.max(eff, get.effect(target, i, player, player)); + } + } + for (var i of js) { + var card = { name: i.viewAs || i.name }; + if (get.effect(source, card, player, player) < 0) { + eff = Math.max(eff, get.effect(target, card, player, player)); + } + } + return eff; + }); + } else event.finish(); + "step 3"; + if (result.bool) { + var target2 = result.targets[0]; + event.target2 = target2; + player + .choosePlayerCard( + "ej", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if (get.attitude(player, targets0) > 0 && get.attitude(player, targets1) < 0) { + if (get.position(button.link) == "j") return 12; + if (get.value(button.link, targets0) < 0 && get.effect(targets1, button.link, player, targets1) > 0) return 10; + return 0; + } else { + if (get.position(button.link) == "j") return -10; + return get.value(button.link) * get.effect(targets1, button.link, player, targets1); + } + }, + target + ) + .set("targets0", target) + .set("targets1", target2) + .set("filterButton", function (button) { + var targets1 = _status.event.targets1; + if (get.position(button.link) == "j") { + return targets1.canAddJudge(button.link); + } else { + return targets1.canEquip(button.link); + } + }) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.targets1, + source = _status.event.targets0; + var att = get.attitude(player, source); + var card = button.link; + if (get.position(card) == "e") { + var val = get.value(card); + if (att > 0 ? val > 0 : val <= 0) return 0; + return get.effect(target, card, player, player); + } + var cardx = { name: card.viewAs || card.name }; + if (get.effect(source, cardx, player, player) >= 0) return 0; + return get.effect(target, cardx, player, player); + }); + } else { + event.finish(); + } + "step 4"; + if (result.bool && result.links.length) { + var link = result.links[0]; + if (get.position(link) == "e") { + event.target2.equip(link); + } else if (link.viewAs) { + event.target2.addJudge({ name: link.viewAs }, [link]); + } else { + event.target2.addJudge(link); + } + target.$give(link, event.target2, false); + game.log(target, "的", link, "被移动给了", event.target2); + game.delay(); + } + }, + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.name || arg.name != "sha") return false; + if (player.storage.counttrigger && player.storage.counttrigger.twzhenxi) return false; + if (!arg.target) return false; + var card = arg.target.getEquip(2); + return ( + card && + get.value(card) > 0 && + game.hasPlayer(function (current) { + return current != arg.target && current.canEquip(card) && get.effect(current, card, player, player) > 0; + }) + ); + }, + }, + }, + twyangshi: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + content: function () { + if ( + game.hasPlayer(function (current) { + return current != player && !player.inRange(current); + }) + ) { + player.addSkill("twyangshi_distance"); + player.addMark("twyangshi_distance", 1, false); + } else { + var card = get.cardPile2(function (card) { + return card.name == "sha"; + }); + if (card) player.gain(card, "gain2"); + else game.log("但是牌堆里已经没有杀了!"); + } + }, + subSkill: { + distance: { + charlotte: true, + onremove: true, + mod: { + attackRange: function (player, num) { + return num + player.countMark("twyangshi_distance"); + }, + }, + intro: { + content: "攻击范围+#", + }, + }, + }, + }, + //全琮 + zhenshan: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + if (event.type == "wuxie" || player.hasSkill("zhenshan_used")) return false; + var nh = player.countCards("h"); + if ( + !game.hasPlayer(function (current) { + return current != player && current.countCards("h") < nh; + }) + ) { + return false; + } + for (var i of lib.inpile) { + if (get.type(i) != "basic") continue; + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(card, player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of lib.inpile) { + if (get.type(i) != "basic") continue; + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) list.push(["基本", "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(card, player, event)) list.push(["基本", "", i, j]); + } + } + } + return ui.create.dialog("振赡", [list, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if (card.name == "jiu") return 0; + if ( + game.hasPlayer(function (current) { + return get.effect(current, card, player, player) > 0; + }) + ) { + if (card.name == "sha") { + var eff = player.getUseValue(card); + if (eff > 0) return 2.9 + eff / 10; + return 0; + } else if (card.name == "tao" || card.name == "shan") { + return 4; + } + } + return 0; + }, + backup: function (links, player) { + return { + filterCard: function () { + return false; + }, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + selectCard: -1, + precontent: function () { + "step 0"; + player + .chooseTarget( + "选择一名手牌数小于你的角色交换手牌", + function (card, player, target) { + return target != player && target.countCards("h") < player.countCards("h"); + }, + true + ) + .set("ai", function (target) { + return get.attitude(player, target) * Math.sqrt(target.countCards("h") + 1); + }); + "step 1"; + if (result.bool) { + player.logSkill("zhenshan", result.targets); + player.addTempSkill("zhenshan_used"); + player.swapHandcards(result.targets[0]); + delete event.result.skill; + } else event.finish(); + "step 2"; + game.delayx(); + }, + }; + }, + prompt: function (links, player) { + return "选择" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】的目标"; + }, + }, + subSkill: { + used: { charlotte: true }, + }, + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + var nh = player.countCards("h"); + if ( + game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 && current.countCards("h") < nh; + }) + ) { + if (event.type == "dying") { + if (event.filterCard({ name: "tao" }, player, event)) { + return 0.5; + } + } else { + if (event.filterCard({ name: "tao" }, player, event) || event.filterCard({ name: "shan" }, player, event)) { + return 4; + } + if (event.filterCard({ name: "sha" }, player, event)) { + return 2.9; + } + } + } + return 0; + }, + save: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (player.hasSkill("zhenshan_used")) return false; + var nh = player.countCards("h"); + return game.hasPlayer(function (current) { + return current != player && current.countCards("h") < nh; + }); + }, + result: { + player: function (player) { + if (_status.event.type == "dying") { + return get.attitude(player, _status.event.dying); + } else { + return 1; + } + }, + }, + }, + }, + //吴景 + twfenghan: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + usable: 1, + filter: function (event, player) { + return event.isFirstTarget && event.targets.length > 0 && (event.card.name == "sha" || (get.type(event.card, false) == "trick" && get.tag(event.card, "damage") > 0)); + }, + content: function () { + "step 0"; + var num = trigger.targets.length; + player.chooseTarget([1, num], get.prompt("twfenghan"), "令至多" + get.cnNumber(num) + "名角色各摸一张牌").set("ai", function (target) { + return Math.sqrt(5 - Math.min(4, target.countCards("h"))) * get.attitude(_status.event.player, target) * (target.hasSkillTag("nogain") ? 0.1 : 1); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("twfenghan", targets); + if (targets.length > 1) game.asyncDraw(targets); + else { + targets[0].draw(); + event.finish(); + } + } else { + player.storage.counttrigger.twfenghan--; + event.finish(); + } + "step 2"; + game.delayx(); + }, + }, + twcongji: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + direct: true, + filter: function (event, player) { + if (player == _status.currentPhase || event.type != "discard" || event.getlx === false || !game.hasPlayer(current => current != player)) return false; + var evt = event.getl(player); + for (var i of evt.cards2) { + if (get.color(i, player) == "red" && get.position(i, true) == "d") return true; + } + return false; + }, + content: function () { + "step 0"; + var cards = [], + cards2 = trigger.getl(player).cards2; + for (var i of cards2) { + if (get.color(i, player) == "red" && get.position(i, true) == "d") cards.push(i); + } + player + .chooseButton(["从击:选择任意张牌交给其他角色", cards], [1, cards.length]) + .set( + "goon", + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) + .set("ai", function (button) { + if (_status.event.goon) return get.value(button.link); + return button.link.name == "du" ? 1 : 0; + }); + "step 1"; + if (result.bool) { + event.cards = result.links; + player.chooseTarget("选择一名角色获得以下牌:", get.translation(cards), true, lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + cards = _status.event.getParent().cards; + if (cards[0].name == "du") return -get.attitude(player, target); + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 4; + return get.value(cards, target) * att; + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twcongji", target); + target.gain(cards, "gain2"); + } + }, + }, + //王粲 + twdianyi: { + audio: 2, + trigger: { player: "phaseEnd" }, + forced: true, + filter: function (event, player) { + if (!player.getHistory("sourceDamage").length) return player.countCards("h") != 4; + return player.countCards("h") > 0; + }, + content: function () { + var num = player.countCards("h"); + if (player.getHistory("sourceDamage").length) player.chooseToDiscard("h", true, num); + else if (num > 4) player.chooseToDiscard("h", true, num - 4); + else player.drawTo(4); + }, + }, + twyingji: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + return player != _status.currentPhase && lib.inpile.includes(name) && player.countCards("h") == 0; + }, + filter: function (event, player) { + if (player == _status.currentPhase || player.countCards("h") > 0) return false; + for (var i of lib.inpile) { + if (i == "wuxie") continue; + var type = get.type(i); + if ((type == "basic" || type == "trick") && event.filterCard({ name: i, isCard: true }, player, event)) return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: i, nature: j, isCard: true }, player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of lib.inpile) { + if (i == "wuxie") continue; + var type = get.type(i); + if (type == "basic" || type == "trick") { + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) list.push([type, "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(card, player, event)) list.push(["基本", "", "sha", j]); + } + } + } + } + return ui.create.dialog("应机", [list, "vcard"]); + }, + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + return val; + }, + backup: function (links, player) { + return { + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + filterCard: () => false, + selectCard: -1, + precontent: function () { + player.logSkill("twyingji"); + player.draw("nodelay"); + delete event.result.skill; + }, + }; + }, + prompt: function (links) { + return "将一张手牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + fireAttack: true, + respondShan: true, + respondSha: true, + skillTagFilter: function (player) { + if (player == _status.currentPhase || player.countCards("h") > 0) return false; + }, + order: 10, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying) > 0; + return 1; + }, + }, + }, + group: ["twyingji_wuxie"], + }, + twyingji_wuxie: { + enable: "chooseToUse", + viewAs: { + name: "wuxie", + isCard: true, + }, + viewAsFilter: function (player) { + return player != _status.currentPhase && player.countCards("h") == 0; + }, + filterCard: () => false, + prompt: "视为使用【无懈可击】并摸一张牌", + selectCard: [0, 1], + check: () => 1, + precontent: function () { + player.logSkill("twyingji"); + player.draw("nodelay"); + delete event.result.skill; + }, + ai: { + order: 4, + }, + }, + twshanghe: { + trigger: { player: "dying" }, + limited: true, + audio: 2, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he") > 0; + }); + }, + prompt: "是否发动【觞贺】?", + skillAnimation: true, + animationColor: "soil", + logTarget: (event, player) => game.filterPlayer(current => current != player), + content: function () { + "step 0"; + player.awakenSkill("twshanghe"); + event.targets = game.filterPlayer(current => current != player); + event.num = 0; + event.jiu = false; + "step 1"; + event.current = targets[num]; + if (!event.current.countCards("he")) event.goto(3); + else + event.current.chooseCard("交给" + get.translation(player) + "一张牌", "he", true).set("ai", function (card) { + var evt = _status.event.getParent(); + return 100 - get.value(card); + }); + "step 2"; + if (result.bool && result.cards && result.cards.length) { + event.current.give(result.cards, player); + if (!event.jiu && get.name(result.cards[0], player) == "jiu") event.jiu = true; + } + "step 3"; + event.num++; + if (event.num < targets.length) event.goto(1); + else if (!event.jiu && player.hp < 1) player.recover(1 - player.hp); + }, + }, + //王昶 + twkaiji: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + var num = 1 + player.getStorage("twkaiji").length; + player.chooseTarget([1, num], get.prompt("twkaiji"), "令至多" + get.cnNumber(num) + "名角色各摸一张牌").set("ai", function (target) { + return Math.sqrt(5 - Math.min(4, target.countCards("h"))) * get.attitude(_status.event.player, target) * (target.hasSkillTag("nogain") ? 0.1 : 1); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + event.targets = targets; + player.logSkill("twkaiji", targets); + if (targets.length == 1) targets[0].draw(); + else game.asyncDraw(targets); + } else event.finish(); + "step 2"; + if (targets.length > 1) game.delayx(); + if ( + game.hasPlayer(function (current) { + return ( + targets.includes(current) && + current.hasHistory("gain", function (evt) { + return evt.getParent(2) == event && get.type(evt.cards[0], current) != "basic"; + }) + ); + }) + ) + player.draw(); + }, + group: "twkaiji_count", + subSkill: { + count: { + trigger: { global: "dying" }, + forced: true, + firstDo: true, + silent: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return !player.getStorage("twkaiji").includes(event.player); + }, + content: function () { + player.markAuto("twkaiji", [trigger.player]); + }, + }, + }, + }, + twshepan: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + usable: 1, + direct: true, + filter: function (event, player) { + return player != event.player; + }, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var choiceList = ["摸一张牌", "将" + get.translation(target) + "区域内的一张牌置于牌堆顶"]; + var choices = ["选项一"]; + if (target.countCards("hej") > 0) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set( + "choice", + (function () { + if (choices.length > 2 && get.effect(target, { name: "guohe_copy" }, player, player) > 0) return 1; + return 0; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("twshepan", target); + if (result.index == 1) player.choosePlayerCard(target, "hej", true); + else { + player.draw(); + event.goto(3); + } + } else { + player.storage.counttrigger.twshepan--; + event.finish(); + } + "step 2"; + var card = result.cards[0]; + target.$throw(get.position(card) == "h" ? 1 : card, 1000); + target.lose(card, ui.cardPile, "insert"); + "step 3"; + game.delayx(); + if (target.isIn() && player.countCards("h") == target.countCards("h")) { + player.storage.counttrigger.twshepan--; + player.chooseBool("是否令" + get.translation(trigger.card) + "对自己无效?").set("ai", function () { + var evt = _status.event.getTrigger(); + return get.effect(evt.target, evt.card, evt.player, evt.target) < 0; + }); + } else event.finish(); + "step 4"; + if (result.bool) trigger.excluded.add(player); + }, + }, + //曹肇 + twfuzuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, current); + }).length > 0 + ); + }); + }, + filterTarget: function (card, player, target) { + return ( + target.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, target); + }).length > 0 + ); + }, + content: function () { + "step 0"; + var list = target.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, target); + }); + if (list.length == 1) { + event._result = { control: list[0] }; + } else + player + .chooseControl(list) + .set("prompt", "选择变更" + get.translation(target) + "一个技能的状态") + .set("choice", list.includes("twfeifu") ? "twfeifu" : 0) + .set("ai", () => _status.event.choice); + "step 1"; + var skill = result.control; + target.changeZhuanhuanji(skill); + target.popup(skill, "wood"); + game.log(target, "的", "#g【" + get.translation(skill) + "】", "发生了状态变更"); + game.delayx(); + }, + ai: { + order: 8, + result: { + target: function (player, target) { + if (!target.hasSkill("twfeifu")) return 0; + return target.storage.twfeifu ? -1 : 1; + }, + }, + }, + group: "twfuzuan_damage", + subSkill: { + damage: { + audio: "twfuzuan", + trigger: { + player: "damageEnd", + source: "damageSource", + }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, current); + }).length > 0 + ); + }); + }, + content: function () { + "step 0"; + player.chooseTarget(lib.skill.twfuzuan.filterTarget, get.prompt("twfuzuan"), "变更一名角色的一个转换技的状态").set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, "twfuzuan", player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twfuzuan", target); + var next = game.createEvent("twfuzuan"); + next.player = player; + next.target = target; + next.setContent(lib.skill.twfuzuan.content); + } + }, + }, + }, + }, + twchongqi: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + logTarget: () => game.filterPlayer().sortBySeat(), + content: function () { + "step 0"; + game.filterPlayer() + .sortBySeat() + .forEach(function (current) { + current.addSkills("twfeifu"); + }); + //game.log(player,'令所有其他角色获得了技能','#g【非服】') + game.delayx(); + "step 1"; + player.chooseTarget("是否减1点体力上限,并令一名其他角色获得技能【复纂】?", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + if (player.hasUnknown() && !target.isZhu) return 0; + if (player.getEnemies().includes(target)) return 0; + return get.attitude(player, target); + }); + "step 2"; + if (result.bool) { + player.loseMaxHp(); + var target = result.targets[0]; + player.line(target, "fire"); + target.addSkills("twfuzuan"); + game.delayx(); + } + }, + derivation: "twfeifu", + }, + twfeifu: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + zhuanhuanji: true, + forced: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + return (storage ? "当你使用【杀】指定唯一目标后" : "当你成为【杀】的唯一目标后") + "目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。"; + }, + }, + filter: function (event, player, name) { + return event.card.name == "sha" && event.targets.length == 1 && event.player.isIn() && event.target.countCards("he") > 0 && (name == "useCardToPlayered") == Boolean(player.storage.twfeifu); + }, + logTarget: function (event, player) { + return player.storage.twfeifu ? event.target : event.player; + }, + content: function () { + "step 0"; + player.changeZhuanhuanji("twfeifu"); + trigger.target.chooseCard("he", true, "非服:交给" + get.translation(trigger.player) + "一张牌", "若选择装备牌,则其可以使用此牌"); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + trigger.target.give(card, trigger.player); + } else event.finish(); + "step 2"; + var target = trigger.player; + if (target.getCards("h").includes(card) && get.type(card, target) == "equip" && target.hasUseTarget(card)) target.chooseUseTarget(card, "nopopup"); + }, + }, + //Powered by @污言噫对 + twjingce: { + marktext: "策", + intro: { + name: "策", + content: "mark", + }, + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var history = player.getHistory("useCard", function (evtx) { + return evtx.getParent("phaseUse") == evt; + }); + return history && history.indexOf(event) == player.hp - 1; + }, + frequent: true, + content: function () { + "step 0"; + player.draw(2); + "step 1"; + if ( + player.getHistory("sourceDamage").length || + player.getHistory("gain", function (evt) { + return evt.getParent("phaseUse") == trigger.getParent("phaseUse") && evt.getParent().name == "draw"; + }).length > 1 + ) + player.addMark("twjingce", 1); + }, + }, + yuzhang: { + audio: 2, + trigger: { + player: "damageEnd", + }, + filter: function (event, player) { + return event.source && player.hasMark("twjingce"); + }, + direct: true, + content: function () { + "step 0"; + var choiceList = ["令" + get.translation(trigger.source) + "本回合不能再使用或打出牌"]; + if (trigger.source.countCards("he")) choiceList.push("令" + get.translation(trigger.source) + "弃置两张牌"); + player + .chooseControl("cancel2") + .set("prompt2", get.prompt2("yuzhang")) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + source = _status.event.source; + if (get.attitude(player, source) >= 0) return "cancel2"; + if (source.hasSkillTag("noh") || source.hasSkillTag("noe") || source.countCards("h") >= 4) return 0; + if (source.hp > 1 && source.countCards("he") > 1) return 1; + return [0, 1].randomGet(); + }) + .set("source", trigger.source); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("yuzhang", trigger.source); + player.removeMark("twjingce", 1); + if (result.index == 0) trigger.source.addTempSkill("yuzhang_dontuse"); + else trigger.source.chooseToDiscard("he", 2, true); + } + }, + group: "yuzhang_skip", + subSkill: { + skip: { + audio: "yuzhang", + trigger: { + player: ["phaseZhunbeiBefore", "phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore", "phaseJieshuBefore"], + }, + filter: function (event, player) { + return player.hasMark("twjingce"); + }, + prompt2: function (event, player) { + var str = "弃置一枚“策”并跳过"; + var list = lib.skill.yuzhang.subSkill.skip.trigger.player.slice(); + list = list.map(i => i.slice(0, -6)); + str += ["准备", "判定", "摸牌", "出牌", "弃牌", "结束"][list.indexOf(event.name)]; + str += "阶段"; + return str; + }, + check: function (event, player) { + if (event.name == "phaseDiscard") return player.needsToDiscard(); + if (event.name == "phaseJudge") return player.countCards("j"); + return false; + }, + content: function () { + player.removeMark("twjingce", 1); + trigger.cancel(); + }, + }, + dontuse: { + charlotte: true, + mark: true, + mod: { + cardEnabled2: function (card) { + return false; + }, + }, + intro: { + content: "不能使用或打出牌", + }, + }, + }, + ai: { + combo: "twjingce", + }, + }, + twlihuo: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; + return false; + }, + audio: "lihuo", + prompt2: function (event) { + return "将" + get.translation(event.card) + "改为火属性"; + }, + audioname: ["re_chengpu"], + check: function (event, player) { + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current) && get.effect(current, { name: "sha", nature: "fire", cards: event.cards.slice(0) }, player, player) > 0; + }); + }, + content: function () { + game.setNature(trigger.card, "fire"); + trigger.card.twlihuo_buffed = true; + }, + group: ["twlihuo2", "twlihuo3"], + ai: { + fireAttack: true, + }, + }, + twlihuo2: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("twlihuo"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { + return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); + }) + .set("sourcex", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }); + "step 1"; + if (result.bool) { + if (!event.isMine() && !_status.connectMode) game.delayx(); + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + player.logSkill("twlihuo", event.target); + trigger.targets.push(event.target); + }, + }, + twlihuo3: { + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return (event.card.twlihuo_buffed = + true && + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card && evt._dyinged; + }).length > 0); + }, + forced: true, + audio: "lihuo", + audioname: ["re_chengpu"], + content: function () { + player.loseHp(); + }, + }, + twchunlao: { + audio: "chunlao", + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return ( + game.hasPlayer(function (current) { + return current.countCards("hej") > 0; + }) && + !game.hasPlayer(function (current) { + return current.getExpansions("twchunlao").length > 0; + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("twchunlao"), "将一名角色区域内的一张牌作为“醇”置于其武将牌上", function (card, player, target) { + return target.countCards("hej") > 0; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) * (player == target ? 1 : 2); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twchunlao", target); + player.choosePlayerCard(target, "hej", true); + } else event.finish(); + "step 2"; + if (result.bool) { + target.addToExpansion(result.cards, target, "give").gaintag.add("twchunlao"); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + group: ["twchunlao_sha", "twchunlao_dying"], + subSkill: { + sha: { + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && event.player.countCards("he") > 0 && event.player.getExpansions("twchunlao").length > 0; + }, + content: function () { + "step 0"; + event.target = trigger.player; + event.target + .chooseCard("he", "醇醪:是否交给" + get.translation(player) + "一张牌,令" + get.translation(trigger.card) + "的伤害值基数+1?") + .set("ai", function (card) { + if (!_status.event.goon) return 3.5 - get.value(card); + return 7 - get.value(card); + }) + .set( + "goon", + (function () { + if (get.attitude(target, player) < 0) return false; + var 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 + ) + return true; + } + } + return d1; + })() + ); + if (!event.target.isUnderControl(true) && !event.target.isOnline()) game.delayx(); + "step 1"; + if (result.bool) { + target.logSkill("twchunlao", player); + if (!target.hasSkill("twchunlao")) game.trySkillAudio("twchunlao", player); + if (player != target) target.give(result.cards, player, "giveAuto"); + trigger.baseDamage++; + } + }, + }, + dying: { + audio: "chunlao", + trigger: { global: "dying" }, + logTarget: "player", + filter: function (event, player) { + return event.player.getExpansions("twchunlao").length > 0; + }, + prompt2: (event, player) => "移去" + get.translation(event.player) + "武将牌上的“醇”并摸一张牌,然后令其回复1点体力", + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + content: function () { + var target = trigger.player, + cards = target.getExpansions("twchunlao"); + if (cards.length) target.loseToDiscardpile(cards); + player.draw(); + target.recover(); + }, + }, + }, + }, + //张曼成 + twfengji: { + audio: 2, + mahouSkill: true, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return !player.getExpansions("twfengji").length && !player.hasSkill("twfengji_mahou") && player.countCards("he"); + }, + direct: true, + content: function () { + "step 0"; + player.chooseCard("he", get.prompt2("twfengji")).set("ai", function (card) { + var name = card.name, + num = 0; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + if (ui.cardPile.childNodes[i].name == name) num++; + } + if (num < 2) return false; + return 8 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("twfengji"); + player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("twfengji"); + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = Math.min(player.getHandcardLimit(), player.countCards("h", "shan")); + if (safe < Math.min(3, game.countPlayer())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } + } + return Math.max(2, Math.min(safe, 3, game.countPlayer())) - 1; + }); + } else event.finish(); + "step 2"; + player.storage.twfengji_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twfengji_mahou", { player: "die" }); + }, + marktext: "示", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twfengji_mahou; + list[1]--; + if (list[1] == 0) { + game.log(player, "的“蜂集”魔法生效"); + player.logSkill("twfengji"); + var cards = player.getExpansions("twfengji"); + if (cards.length) { + var cards2 = [], + num = list[0]; + for (var card of cards) { + for (var i = 0; i < num; i++) { + var card2 = get.cardPile2(function (cardx) { + return cardx.name == card.name && !cards2.includes(cardx); + }); + if (card2) cards2.push(card2); + else break; + } + } + game.delayx(); + if (cards2.length) player.gain(cards2, "gain2"); + player.loseToDiscardpile(cards); + } + player.removeSkill("twfengji_mahou"); + } else { + game.log(player, "的“蜂集”魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twfengji_mahou"); + } + }, + ai: { threaten: 2.5 }, + mark: true, + onremove: true, + //该图标为灵魂宝石 + marktext: "♗", + intro: { + name: "施法:蜂集", + markcount: function (storage) { + if (storage) return storage[1]; + return 0; + }, + content: function (storage) { + if (storage) { + return "经过" + storage[1] + "个“回合结束时”后,若有“示”,则从牌堆中获得" + storage[0] + "张和“示”名称相同的牌"; + } + return "未指定施法效果"; + }, + }, + }, + }, + }, + twyiju: { + audio: 2, + locked: false, + mod: { + attackRangeBase: function (player, num) { + if (player.getExpansions("twfengji").length) return player.hp; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha" && player.getExpansions("twfengji").length) return num - 1 + player.hp; + }, + }, + trigger: { player: "damageBegin3" }, + filter: function (event, player) { + return player.getExpansions("twfengji").length > 0; + }, + forced: true, + content: function () { + trigger.num++; + var cards = player.getExpansions("twfengji"); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { + halfneg: true, + combo: "twfengji", + }, + }, + twbudao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + derivation: ["twzhouhu", "twharvestinori", "twzuhuo", "twzhouzu", "twhuangjin", "twguimen", "twdidao"], + limited: true, + skillAnimation: true, + animationColor: "metal", + check: function (event, player) { + return !player.hasUnknown() || !player.hasFriend(); + }, + skillValue: { + twzhouhu: target => (Math.random() < 0.6 ? 0.1 : 1), + twzuhuo: (target, player) => (get.damageEffect(target, player, player) > 0 ? 0.1 : 1), + twharvestinori: target => 0.9 + Math.random() / 5, + twhuangjin: target => Math.random() / 5, + twguimen: target => Math.sqrt(Math.min(3, target.countCards("he", { suit: "spade" }))) * 0.09, + twzhouzu: target => { + var rand = Math.random(); + if (rand < 0.8) return 1 - Math.sqrt(0.8 - rand); + return 1; + }, + twdidao: (target, player) => { + if ( + [target, player].some(current => + current.getSkills().some(skill => { + var info = get.info(skill); + if (!info || !info.ai || !info.ai.rejudge) return false; + return true; + }) + ) + ) { + return 0.05; + } + return 0.85 + Math.random() / 5; + }, + }, + content: function () { + "step 0"; + player.awakenSkill("twbudao"); + player.loseMaxHp(); + player.recover(); + var skills = lib.skill.twbudao.derivation, + map = lib.skill.twbudao.skillValue; + skills = skills.randomGets(3); + var target = game.filterPlayer().sort((a, b) => get.attitude(player, b) - get.attitude(player, a))[0]; + if (player.identity == "nei" || get.attitude(player, target) < 6) target = player; + player + .chooseControl(skills) + .set( + "choiceList", + skills.map(function (i) { + return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; + }) + ) + .set("displayIndex", false) + .set("prompt", "布道:选择获得一个技能") + .set("ai", () => { + return _status.event.choice; + }) + .set("choice", skills.sort((a, b) => (map[b](target, player) || 0.5) - (map[a](target, player) || 0.5))[0]); + "step 1"; + var skill = result.control; + player.addSkills(skill); + event.twbudao_skill = skill; + player.chooseTarget(lib.filter.notMe, "是否令一名其他角色也获得【" + get.translation(skill) + "】?").set("ai", function (target) { + var player = _status.event.player; + if (player.identity == "nei") return 0; + return get.attitude(player, target); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.addSkills(event.twbudao_skill); + var cards = target.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length == 1) event._result = { bool: true, cards: cards }; + else target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌作为学费"); + } else event.finish(); + "step 3"; + if (result.bool) target.give(result.cards, player); + }, + }, + twzhouhu: { + audio: 2, + mahouSkill: true, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.hasSkill("twzhouhu_mahou") && player.countCards("h", lib.skill.twzhouhu.filterCard) > 0; + }, + filterCard: { color: "red" }, + check: function (card) { + if (_status.event.player.isHealthy()) return 0; + return 7 - get.value(card); + }, + content: function () { + "step 0"; + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = 1; + if (safe < Math.min(3, game.countPlayer(), player.getDamagedHp())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } + } + return Math.max(1, Math.min(safe, 3, game.countPlayer(), player.getDamagedHp())) - 1; + }); + "step 1"; + player.storage.twzhouhu_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twzhouhu_mahou", { player: "die" }); + }, + ai: { + order: 2, + result: { + player: 1, + }, + }, + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twzhouhu_mahou; + list[1]--; + if (list[1] == 0) { + game.log(player, "的“咒护”魔法生效"); + player.logSkill("twzhouhu"); + var num = list[0]; + player.recover(num); + player.removeSkill("twzhouhu_mahou"); + } else { + game.log(player, "的“咒护”魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twzhouhu_mahou"); + } + }, + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:咒护", + markcount: function (storage) { + if (storage) return storage[1]; + return 0; + }, + content: function (storage) { + if (storage) { + return "经过" + storage[1] + "个“回合结束时”后,回复" + storage[0] + "点体力"; + } + return "未指定施法效果"; + }, + }, + }, + }, + }, + twharvestinori: { + audio: 2, + mahouSkill: true, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.hasSkill("twharvestinori_mahou") && player.countCards("h", lib.skill.twharvestinori.filterCard) > 0; + }, + filterCard: { color: "black" }, + check: function (card) { + return 8 - get.value(card); + }, + content: function () { + "step 0"; + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = player.hp; + if (safe < Math.min(3, game.countPlayer())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } + } + return Math.max(1, Math.min(safe, 3, game.countPlayer())) - 1; + }); + "step 1"; + player.storage.twharvestinori_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twharvestinori_mahou", { player: "die" }); + }, + ai: { + order: 8, + result: { + player: 1, + }, + }, + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twharvestinori_mahou; + list[1]--; + if (list[1] == 0) { + game.log(player, "的“丰祈”魔法生效"); + player.logSkill("twharvestinori"); + var num = list[0] * 2; + player.draw(num); + player.removeSkill("twharvestinori_mahou"); + } else { + game.log(player, "的“丰祈”魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twharvestinori_mahou"); + } + }, + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:丰祈", + markcount: function (storage) { + if (storage) return storage[1]; + return 0; + }, + content: function (storage) { + if (storage) { + return "经过" + storage[1] + "个“回合结束时”后,摸" + storage[0] * 2 + "张牌"; + } + return "未指定施法效果"; + }, + }, + }, + }, + }, + twzuhuo: { + audio: 2, + mahouSkill: true, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.hasSkill("twzuhuo_mahou") && player.countCards("he", lib.skill.twzuhuo.filterCard) > 0; + }, + filterCard: function (card) { + return get.type(card) != "basic"; + }, + position: "he", + check: function (card) { + return 7 - get.value(card); + }, + content: function () { + "step 0"; + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = Math.min(player.getHandcardLimit(), player.countCards("h", "shan")); + if (safe < Math.min(3, game.countPlayer())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } + } + return Math.max(2, Math.min(safe, 3, game.countPlayer())) - 1; + }); + "step 1"; + player.storage.twzuhuo_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twzuhuo_mahou", { player: "die" }); + }, + ai: { + order: 2, + result: { + player: 1, + }, + }, + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twzuhuo_mahou; + list[1]--; + if (list[1] == 0) { + game.log(player, "的“阻祸”魔法生效"); + player.logSkill("twzuhuo"); + var num = list[0]; + player.addSkill("twzuhuo_effect"); + player.addMark("twzuhuo_effect", num, false); + player.removeSkill("twzuhuo_mahou"); + } else { + game.log(player, "的“阻祸”魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twzuhuo_mahou"); + } + }, + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:阻祸", + markcount: function (storage) { + if (storage) return storage[1]; + return 0; + }, + content: function (storage) { + if (storage) { + return "经过" + storage[1] + "个“回合结束时”后,获得" + storage[0] + "层“防止一次伤害”的效果"; + } + return "未指定施法效果"; + }, + }, + }, + effect: { + charlotte: true, + onremove: true, + trigger: { player: "damageBegin2" }, + forced: true, + filter: function (event, player) { + return player.hasMark("twzuhuo_effect"); + }, + content: function () { + trigger.cancel(); + player.removeMark("twzuhuo_effect", 1, false); + if (!player.countMark("twzuhuo_effect")) player.removeSkill("twzuhuo_effect"); + }, + marktext: "阻︎", + intro: { + onremove: true, + content: "防止接下来的#次伤害", + }, + }, + }, + }, + twzhouzu: { + audio: 2, + enable: "phaseUse", + usable: 1, + mahouSkill: true, + filter: function (event, player) { + return !player.hasSkill("twzhouzu_mahou"); + }, + filterTarget: function (card, player, target) { + return player != target; + }, + line: false, + delay: false, + content: function () { + "step 0"; + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = 1; + if (safe < Math.min(3, game.countPlayer())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } + } + return Math.max(2, Math.min(safe, 3, game.countPlayer())) - 1; + }); + "step 1"; + player.storage.twzhouzu_mahou = [result.index + 1, result.index + 1, target]; + player.addTempSkill("twzhouzu_mahou", { player: "die" }); + }, + subSkill: { + mahou: { + trigger: { + global: "phaseEnd", + }, + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twzhouzu_mahou; + list[1]--; + if (list[1] == 0) { + game.log(player, "的“咒诅”魔法生效"); + var num = list[0], + target = list[2]; + player.logSkill("twzhouzu", target); + target.chooseToDiscard(get.translation(player) + "对你的“咒诅”魔法生效,请弃置" + get.cnNumber(list[0]) + "张牌", list[0], true); + target.damage("thunder"); + player.removeSkill("twzhouzu_mahou"); + } else { + game.log(player, "的“咒阻”魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twzhouzu_mahou"); + } + }, + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:咒诅", + markcount: function (storage) { + if (storage) return storage[1]; + return 0; + }, + content: function (storage) { + if (storage) { + return "经过" + storage[1] + "个“回合结束时”后,你令" + get.translation(storage[2]) + "弃置" + get.cnNumber(storage[0]) + "张牌,然后你对其造成1点雷电伤害"; + } + return "未指定施法效果"; + }, + }, + }, + }, + ai: { + order: 1, + result: { + target: -5, + }, + }, + }, + twhuangjin: { + audio: 2, + trigger: { target: "useCardToTarget" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return event.card.name == "sha" && typeof get.number(event.card) == "number"; + }, + content: function () { + "step 0"; + player.judge(function (result) { + var evt = _status.event.getTrigger(); + if (Math.abs(get.number(result) - get.number(evt.card)) <= 1) return 2; + return -1; + }).judge2 = function (result) { + return result.bool; + }; + "step 1"; + if (result.bool) { + trigger.getParent().excluded.add(player); + } + }, + ai: { + effect: { + target: function (card, player, target, current, isLink) { + if (card.name == "sha" && !isLink) return 0.8; + }, + }, + }, + }, + twguimen: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + direct: true, + filter: function (event, player) { + if (event.type != "discard") return false; + var evt = event.getl(player); + for (var card of evt.cards2) { + if (get.suit(card, player) == "spade") return true; + } + return false; + }, + forced: true, + content: function () { + "step 0"; + var cards = []; + var evt = trigger.getl(player); + for (var card of evt.cards2) { + if (get.suit(card, player) == "spade") cards.push(card); + } + if (!cards.length) event.finish(); + else event.cards = cards; + "step 1"; + if (event.cards.length == 1) { + event._result = { bool: true, links: event.cards }; + } else { + player.chooseButton(["鬼门:选择一张♠牌,为其进行判定", event.cards], true); + } + "step 2"; + if (result.bool && result.links) { + event.judgingSpade = result.links[0]; + event.cards.remove(event.judgingSpade); + game.log(player, "选择", "#y" + get.translation(event.judgingSpade), "进行判定"); + player.judge(function (result) { + var card = _status.event.getParent().judgingSpade; + if (Math.abs(get.number(result) - get.number(card)) <= 1) return 4; + return -1; + }).judge2 = function (result) { + return result.bool; + }; + } else event.finish(); + "step 3"; + if (result.bool && game.hasPlayer(current => current != player)) { + player.chooseTarget("选择一名其他角色,对其造成2点雷电伤害", lib.filter.notMe, true).set("ai", target => get.damageEffect(target, player, player, "thunder")); + } + "step 4"; + if (result.bool) { + player.line(result.targets[0], "thunder"); + result.targets[0].damage(2, "thunder"); + } + if (event.cards.length) event.goto(1); + }, + }, + twdidao: { + audio: 2, + trigger: { global: "judge" }, + filter: function (event, player) { + return player.countCards("hes"); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("twdidao"), "hes", function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) { + if (trigger.player != player) return 0; + var checkx = get.color(card, player) == get.color(judging); + if (checkx > 0) return checkx; + return 0; + } + return result * (attitude > 0 ? 1 : -1); + }) + .set("judging", trigger.player.judging[0]); + "step 1"; + if (result.bool) { + player.respond(result.cards, "highlight", "twdidao", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.$gain2(trigger.player.judging[0]); + player.gain(trigger.player.judging[0]); + var card = result.cards[0]; + if (get.color(card, player) == get.color(trigger.player.judging[0])) player.draw("nodelay"); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + } + "step 3"; + game.delay(2); + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + //群曹操 + twlingfa: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + content: function () { + "step 0"; + if (game.roundNumber < 3 || !player.hasSkill("twlingfa")) { + var str; + switch (game.roundNumber) { + case 1: + str = "获得如下效果直到本轮结束:其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。"; + break; + case 2: + str = "获得如下效果直到本轮结束:其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。"; + break; + default: + str = "失去【令法】并获得【治暗】"; + break; + } + player.chooseBool(get.prompt("twlingfa"), str); + } else event._result = { bool: true }; + "step 1"; + if (result.bool) { + switch (game.roundNumber) { + case 1: + player.logSkill("twlingfa", game.filterPlayer(current => current != player).sortBySeat()); + player.addTempSkill("twlingfa_sha", "roundStart"); + break; + case 2: + player.logSkill("twlingfa", game.filterPlayer(current => current != player).sortBySeat()); + player.addTempSkill("twlingfa_tao", "roundStart"); + break; + default: + player.logSkill("twlingfa"); + player.addSkills(["twzhian"], ["twlingfa"]); + break; + } + } + }, + subSkill: { + sha: { + audio: "twlingfa", + trigger: { global: "useCard" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player != event.player && event.card.name == "sha" && event.player.countCards("he") > 0; + }, + logTarget: "player", + content: function () { + "step 0"; + game.delayx(); + trigger.player + .chooseToDiscard("he", "令法:弃置一张牌,或受到来自" + get.translation(player) + "的1点伤害") + .set("goon", get.damageEffect(trigger.player, player, trigger.player) < 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 8 - get.value(card); + }); + "step 1"; + if (!result.bool) { + trigger.player.damage(); + } + }, + mark: true, + marktext: '', + intro: { + content: "其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。", + }, + }, + tao: { + audio: "twlingfa", + trigger: { global: "useCard" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player != event.player && event.card.name == "tao" && event.player.countCards("he") > 0; + }, + logTarget: "player", + content: function () { + "step 0"; + game.delayx(); + trigger.player + .chooseCard("he", "令法:交给" + get.translation(player) + "一张牌,否则受到来自其的1点伤害") + .set("goon", get.damageEffect(trigger.player, player, trigger.player) < 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 8 - get.value(card); + }); + "step 1"; + if (!result.bool) { + trigger.player.damage(); + } else trigger.player.give(result.cards, player); + }, + mark: true, + marktext: '', + intro: { + content: "其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。", + }, + }, + }, + derivation: "twzhian", + }, + twzhian: { + audio: 2, + init: function (player) { + game.addGlobalSkill("twzhian_ai"); + }, + onremove: function (player) { + if (!game.hasPlayer(current => current.hasSkill("twzhian"), true)) game.removeGlobalSkill("twzhian_ai"); + }, + usable: 1, + trigger: { global: "useCardAfter" }, + direct: true, + filter: function (event, player) { + var type = get.type(event.card); + if (type != "delay" && type != "equip") return false; + if (event.cards.length != 1) return false; + var position = get.position(event.cards[0]); + if (position == "e" || position == "j") return true; + return event.player.isIn(); + }, + content: function () { + "step 0"; + var str = get.translation(trigger.cards[0]), + owner = get.owner(trigger.cards[0]); + var choiceList = ["弃置" + (owner ? get.translation(owner) + "区域内的" : "") + str, "弃置一张手牌并获得" + str, "对" + get.translation(trigger.player) + "造成1点伤害"]; + var choices = []; + if (owner && lib.filter.canBeDiscarded(card, player, owner)) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if ( + owner && + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "twzhian"); + }, "h") && + lib.filter.canBeGained(card, player, owner) + ) + choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (trigger.player.isIn()) choices.push("选项三"); + else choiceList[2] = '' + choiceList[2] + ""; + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("twzhian")) + .set("ai", function () { + var player = _status.event.player, + choices = _status.event.controls.slice(0); + var card = _status.event.getTrigger().cards[0], + owner = get.owner(card); + var getEffect = function (choice) { + if (choice == "cancel2") return 0.1; + if (choice == "选项三") { + return get.damageEffect(_status.event.getTrigger().player, player, player); + } + var result; + if (get.position(card) == "j") { + result = + -get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) * get.sgn(get.attitude(player, owner)); + } else result = -(get.value(card, owner) - 0.01) * get.sgn(get.attitude(player, owner)); + if (choice == "选项一") return result; + if ( + player.hasCard(function (cardx) { + return lib.filter.cardDiscardable(cardx, player, "twzhian") && get.value(cardx, player) < get.value(card, player); + }, "h") + ) + return result * 1.2; + return 0; + }; + choices.sort(function (a, b) { + return getEffect(b) - getEffect(a); + }); + return choices[0]; + }); + "step 1"; + if (result.control != "cancel2") { + var card = trigger.cards[0], + owner = get.owner(card); + switch (result.control) { + case "选项一": + player.logSkill("twzhian", owner); + owner.discard(card, "notBySelf"); + event.finish(); + break; + case "选项二": + player.chooseToDiscard("h", true).logSkill = ["twzhian", owner]; + event.target = owner; + break; + case "选项三": + player.logSkill("twzhian", trigger.player); + trigger.player.damage(); + event.finish(); + break; + } + } else player.storage.counttrigger.twzhian--; + "step 2"; + if (result.bool && target.getCards("ej").includes(trigger.cards[0])) player.gain(trigger.cards, target, "give", "bySelf"); + }, + subSkill: { + ai: { + trigger: { player: "dieAfter" }, + filter: function (event, player) { + return !game.hasPlayer(current => current.hasSkill("twzhian"), true); + }, + silent: true, + forceDie: true, + content: function () { + game.removeGlobalSkill("twzhian_ai"); + }, + ai: { + effect: { + player: function (card, player, target) { + if (get.type(card) !== "delay" && get.type(card) !== "equip") return 1; + let za = game.findPlayer(cur => cur.hasSkill("twzhian") && (!cur.storage.counttrigger || !cur.storage.counttrigger.twzhian) && get.attitude(player, cur) <= 0); + if (za) return [0.5, -0.8]; + }, + }, + }, + }, + }, + }, + twyujue: { + audio: 2, + global: "twyujue_give", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + direct: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + var cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer(function (current) { + if (current == player) return false; + var evt = event.getl(current); + if (!evt || !evt.cards2 || !evt.cards2.filter(card => cards.includes(card)).length) return false; + return !current.hasSkill("twyujue_effect0") || !current.hasSkill("twyujue_effect1"); + }); + }, + content: function () { + "step 0"; + var cards = trigger.getg(player); + var list = game + .filterPlayer(function (current) { + if (current == player) return false; + var evt = trigger.getl(current); + if (!evt || !evt.cards2 || !evt.cards2.filter(card => cards.includes(card)).length) return false; + return !current.hasSkill("twyujue_effect0") || !current.hasSkill("twyujue_effect1"); + }) + .sortBySeat(); + event.targets = list; + "step 1"; + var target = event.targets.shift(); + if (target.isIn()) { + event.target = target; + var num = 2; + if (target.hasSkill("twyujue_effect0")) num--; + if (target.hasSkill("twyujue_effect1")) num--; + var cards = trigger.getg(player); + num = Math.min(num, trigger.getl(target).cards2.filter(i => cards.includes(i)).length); + if (num > 0) event.count = num; + else if (targets.length > 0) event.redo(); + else event.finish(); + } else if (targets.length > 0) event.redo(); + else event.finish(); + "step 2"; + event.count--; + player.chooseBool(get.prompt("twyujue", target), "可令其选择本回合内未选择过的一项:⒈弃置攻击范围内一名角色的一张牌。⒉下一次使用牌时,从牌堆中获得一张同类别的牌。").set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target) > 0; + }); + "step 3"; + if (result.bool) { + player.logSkill("twyujue", target); + var list = [0, 1]; + if (target.hasSkill("twyujue_effect0")) list.remove(0); + if (target.hasSkill("twyujue_effect1")) list.remove(1); + if (!list.length) event.goto(6); + else if (list.length == 1) event._result = { index: list[0] }; + else + target + .chooseControl() + .set("choiceList", ["弃置攻击范围内一名角色的一张牌", "下一次使用牌时,从牌堆中获得一张同类别的牌"]) + .set("ai", function () { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return player.inRange(current) && current.countDiscardableCards(player, "he") > 0 && get.effect(current, { name: "guohe_copy2" }, player, player) > 0; + }) + ) + return 0; + return 1; + }); + } else event.goto(6); + "step 4"; + target.addTempSkill("twyujue_effect" + result.index); + if (result.index == 0) { + if ( + game.hasPlayer(function (current) { + return target.inRange(current) && current.countDiscardableCards(target, "he") > 0; + }) + ) { + target + .chooseTarget("弃置攻击范围内一名角色的一张牌", true, function (card, player, target) { + return player.inRange(target) && target.countDiscardableCards(player, "he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + } else event.goto(6); + } else event.goto(6); + "step 5"; + if (result.bool) { + var target2 = result.targets[0]; + target.line(target2, "green"); + target.discardPlayerCard(target2, "he", true); + } + "step 6"; + game.delayx(); + if (event.count > 0) event.goto(2); + else if (targets.length) event.goto(1); + }, + subSkill: { + clear: { + onremove: true, + }, + effect0: { charlotte: true }, + effect1: { + charlotte: true, + trigger: { player: "useCard" }, + usable: 1, + forced: true, + popup: false, + content: function () { + player.unmarkSkill("twyujue_effect1"); + var type2 = get.type2(trigger.card, false); + var card = get.cardPile2(function (card) { + return get.type2(card, false) == type2; + }); + if (card) trigger.player.gain(card, "gain2"); + }, + mark: true, + marktext: "爵", + intro: { content: "使用下一张牌时,从牌堆中获得一张类型相同的牌" }, + }, + }, + }, + twyujue_give: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.countCards("he")) return false; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("twyujue"); + }); + if (!targets.length) return false; + for (var target of targets) { + var num = 2; + if (player.group == "qun" && target.hasZhuSkill("twfengqi", player)) num = 4; + if (target.countMark("twyujue_clear") < num) return true; + } + return false; + }, + selectCard: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("twyujue"); + }); + return [ + 1, + Math.max.apply( + Math, + targets.map(function (target) { + var num = 2; + if (player.group == "qun" && target.hasZhuSkill("twfengqi", player)) num = 4; + return num - target.countMark("twyujue_clear"); + }) + ), + ]; + }, + filterCard: true, + filterTarget: function (card, player, target) { + if (!target.hasSkill("twyujue")) return false; + var num = 2; + if (player.group == "qun" && target.hasZhuSkill("twfengqi", player)) num = 4; + return num - target.countMark("twyujue_clear") >= Math.max(1, ui.selected.cards.length); + }, + selectTarget: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("twyujue"); + }); + return targets.length > 1 ? 1 : -1; + }, + complexSelect: true, + prompt: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("twyujue"); + }); + return "将任意张牌交给" + get.translation(targets) + (targets.length > 1 ? "中的一人" : ""); + }, + position: "he", + discard: false, + lose: false, + delay: false, + check: function (card) { + if (ui.selected.cards.length) return 0; + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return lib.skill.twyujue_give.filterTarget(null, player, current) && get.attitude(player, current) > 0; + }) + ) { + var val = get.value(card); + if (val <= 0 && get.position(card) == "e") return 100 - val; + if ( + !player.hasSkill("twyujue_effect1") && + player.hasCard(function (cardx) { + return cardx != card && player.getUseValue(cardx, null, true) > 0; + }, "hs") + ) + return 6 - get.value(card); + if ( + !player.hasSkill("twyujue_effect0") && + game.hasPlayer(function (current) { + return player.inRange(current) && current.countDiscardableCards(player, "he") > 0 && get.effect(current, { name: "guohe_copy2" }, player, player) > 0; + }) + ) + return 5.5 - get.value(card); + } + return 0; + }, + content: function () { + game.trySkillAudio("twyujue", target); + player.give(cards, target); + target.addTempSkill("twyujue_clear"); + target.addMark("twyujue_clear", cards.length, false); + }, + ai: { + order: 10, + result: { target: 1 }, + }, + }, + twgezhi: { + audio: 2, + trigger: { player: "useCard" }, + direct: true, + filter: function (event, player) { + if (!player.countCards("h")) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var type = get.type2(event.card, false); + return !player.hasHistory( + "useCard", + function (evtx) { + return evtx != event && get.type2(evtx.card, false) == type && evtx.getParent("phaseUse") == evt; + }, + event + ); + }, + content: function () { + "step 0"; + if (!event.isMine() && !event.isOnline()) game.delayx(); + player.chooseCard("是否发动【革制】重铸一张牌?", lib.filter.cardRecastable).set("ai", function (card) { + return 5.5 - get.value(card); + }); + "step 1"; + if (result.bool) { + player.logSkill("twgezhi"); + player.recast(result.cards); + } + }, + group: "twgezhi_buff", + subSkill: { + buff: { + audio: "twgezhi", + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: function (event, player) { + return ( + player.getHistory("lose", function (evt) { + return evt.getParent(3).name == "twgezhi" && evt.getParent("phaseUse") == event; + }).length > 1 + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("twgezhi"), "你可以令一名角色选择获得一个其未获得过的效果:⒈攻击范围+2;⒉手牌上限+2;⒊加1点体力上限。", function (card, player, target) { + return !target.hasSkill("twgezhi_选项一") || !target.hasSkill("twgezhi_选项二") || !target.hasSkill("twgezhi_选项三"); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twgezhi", target); + var list = []; + for (var i = 1; i <= 3; i++) { + var str = "选项" + get.cnNumber(i, true); + if (!target.hasSkill("twgezhi_" + str)) list.push(str); + } + if (list.length == 1) event._result = { control: list[0] }; + else + target + .chooseControl(list) + .set("choiceList", ["令自己的攻击范围+2", "令自己的手牌上限+2", "令自己的体力上限+1"]) + .set("ai", function () { + var player = _status.event.player, + controls = _status.event.controls; + if ( + controls.includes("选项一") && + game.hasPlayer(function (current) { + return (get.realAttitude || get.attitude)(player, current) < 0 && get.distance(player, current, "attack") > 1; + }) + ) + return "选项一"; + if (controls.includes("选项二") && player.needsToDiscard()) return "选项二"; + if (controls.includes("选项三")) return "选项三"; + return controls.randomGet(); + }); + } else { + event._triggered = null; + event.finish(); + } + "step 2"; + target.addSkill("twgezhi_" + result.control); + if (result.control == "选项三") target.gainMaxHp(); + "step 3"; + game.delayx(); + }, + }, + 选项一: { + charlotte: true, + mod: { + attackFrom: function (from, to, distance) { + return distance - 2; + }, + }, + mark: true, + marktext: " +2 ", + intro: { content: "攻击范围+2" }, + }, + 选项二: { + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + 2; + }, + }, + mark: true, + marktext: " +2 ", + intro: { content: "手牌上限+2" }, + }, + 选项三: { + charlotte: true, + mark: true, + marktext: " +1 ", + intro: { content: "体力上限+1" }, + }, + }, + }, + twfengqi: { + audio: 2, + zhuSkill: true, + trigger: { player: "twgezhi_buffAfter" }, + direct: true, + filter: function (event, player) { + if (!event.target || !event.target.isIn() || !player.hasZhuSkill("twfengqi", event.target)) return false; + var target = event.target; + return target.getStockSkills(true, true).some(skill => { + if (target.hasSkill(skill)) return false; + var info = get.info(skill); + return info && info.zhuSkill; + }); + }, + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + event.target = trigger.target; + event.target.chooseBool(get.prompt("twfengqi"), "获得武将牌上的所有主公技"); + "step 1"; + if (result.bool) { + target.logSkill("twfengqi", player); + var skills = target.getStockSkills(true, true).filter(skill => { + if (target.hasSkill(skill)) return false; + var info = get.info(skill); + return info && info.zhuSkill; + }); + target.addSkills(skills); + //for(var i of skills) target.addSkillLog(i); + } + }, + ai: { + combo: "twyujue", + }, + }, + twsidai: { + audio: 2, + enable: "phaseUse", + usable: 1, + locked: false, + limited: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + var cards = player.getCards("h", { type: "basic" }); + if (!cards.length) return false; + for (var i of cards) { + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; + } + return event.filterCard(get.autoViewAs({ name: "sha", storage: { twsidai: true } }, cards), player, event); + }, + viewAs: { name: "sha", storage: { twsidai: true } }, + filterCard: { type: "basic" }, + selectCard: -1, + check: () => 1, + onuse: function (result, player) { + player.awakenSkill("twsidai"); + player.addTempSkill("twsidai_effect"); + }, + ai: { + order: 2.9, + result: { + target: function (player, target) { + var cards = ui.selected.cards.slice(0); + var names = []; + for (var i of cards) names.add(i.name); + if (names.length < player.hp) return 0; + if (player.hasUnknown() && (player.identity != "fan" || !target.isZhu)) return 0; + if (get.attitude(player, target) >= 0) return -20; + return lib.card.sha.ai.result.target.apply(this, arguments); + }, + }, + }, + mod: { + cardUsable: function (card) { + if (card.storage && card.storage.twsidai) return Infinity; + }, + targetInRange: function (card) { + if (card.storage && card.storage.twsidai) return true; + }, + }, + subSkill: { + effect: { + charlotte: true, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.twsidai || event.getParent().type != "card") return false; + for (var i of event.cards) { + if (i.name == "jiu") return true; + } + return false; + }, + forced: true, + popup: false, + content: function () { + trigger.num *= 2; + game.log(trigger.card, "的伤害值", "#y×2"); + }, + group: ["twsidai_tao", "twsidai_shan"], + }, + tao: { + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.twsidai || !event.player.isIn()) return false; + for (var i of event.cards) { + if (i.name == "tao") return true; + } + return false; + }, + forced: true, + popup: false, + content: function () { + trigger.player.loseMaxHp(); + }, + }, + shan: { + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.twsidai || !event.target.isIn()) return false; + for (var i of event.cards) { + if (i.name == "shan") return true; + } + return false; + }, + forced: true, + popup: false, + content: function () { + "step 0"; + trigger.target.chooseToDiscard("h", { type: "basic" }, "弃置一张基本牌,否则不能响应" + get.translation(trigger.card)).set("ai", function (card) { + var player = _status.event.player; + if ( + player.hasCard("hs", function (cardx) { + return cardx != card && get.name(cardx, player) == "shan"; + }) + ) + return 12 - get.value(card); + return 0; + }); + "step 1"; + if (!result.bool) trigger.directHit.add(trigger.target); + }, + }, + }, + }, + twjieyu: { + audio: 2, + trigger: { player: ["phaseJieshuBegin", "damageEnd"] }, + round: 1, + filter: function (event, player) { + if (event.name != "phaseJieshu") { + var history = player.getHistory("damage"); + for (var i of history) { + if (i == event) break; + return false; + } + var all = player.actionHistory; + for (var i = all.length - 2; i >= 0; i--) { + if (all[i].damage.length) return false; + if (all[i].isRound) break; + } + } + return ( + player.countCards("h") > 0 && + !player.hasCard(function (card) { + return !lib.filter.cardDiscardable(card, player, "twjieyu"); + }, "h") + ); + }, + check: function (event, player) { + var cards = [], + names = []; + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var card = ui.discardPile.childNodes[i]; + if (get.type(card, false) == "basic" && !names.includes(card.name)) { + cards.push(card); + names.push(card.name); + } + } + if (!names.includes("shan") || !names.includes("tao")) return false; + if (player.countCards("h", "shan") < 2 && player.countCards("h", "tao") < 1) return true; + return false; + }, + content: function () { + "step 0"; + player.discard(player.getCards("h")); + "step 1"; + var cards = [], + names = []; + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var card = ui.discardPile.childNodes[i]; + if (get.type(card, false) == "basic" && !names.includes(card.name)) { + cards.push(card); + names.push(card.name); + } + } + if (cards.length) player.gain(cards, "gain2"); + }, + }, + twhanyu: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + var cards = [], + types = ["basic", "trick", "equip"]; + for (var i of types) { + var card = get.cardPile2(function (card) { + return get.type2(card, false) == i; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + }, + }, + twhengjiang: { + audio: "hengjiang", + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + return ( + !player.hasSkill("twhengjiang2") && + event.targets.length == 1 && + ["basic", "trick"].includes(get.type(event.card, false)) && + player.isPhaseUsing() && + game.hasPlayer(function (current) { + return player.inRange(current) && lib.filter.targetEnabled2(event.card, player, current); + }) + ); + }, + prompt: "是否发动【横江】?", + prompt2: function (event, player) { + return "将" + get.translation(event.card) + "的目标改为" + get.translation(lib.skill.twhengjiang.logTarget(event, player)); + }, + logTarget: function (event, player) { + return game + .filterPlayer(function (current) { + return player.inRange(current) && lib.filter.targetEnabled2(event.card, player, current); + }) + .sortBySeat(); + }, + check: function (event, player) { + var effect1 = get.effect(event.target, event.card, player, player); + var effect2 = 0, + targets = lib.skill.twhengjiang.logTarget(event, player); + for (var i of targets) effect2 += get.effect(i, event.card, player, player); + return effect2 > effect1; + }, + content: function () { + var targets = lib.skill.twhengjiang.logTarget(trigger, player); + trigger.targets.length = 0; + trigger.targets.addArray(targets); + trigger.getParent().triggeredTargets1.length = 0; + trigger.getParent().twhengjiang_buffed = true; + player.addTempSkill("twhengjiang2", "phaseUseAfter"); + }, + }, + twhengjiang2: { + charlotte: true, + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.twhengjiang_buffed && + game.hasPlayer2(function (current) { + return ( + current != player && + (current.hasHistory("useCard", function (evt) { + return evt.respondTo && evt.respondTo[1] == event.card; + }) || + current.hasHistory("respond", function (evt) { + return evt.respondTo && evt.respondTo[1] == event.card; + })) + ); + }) + ); + }, + content: function () { + player.draw( + game.countPlayer2(function (current) { + return ( + current != player && + (current.hasHistory("useCard", function (evt) { + return evt.respondTo && evt.respondTo[1] == trigger.card; + }) || + current.hasHistory("respond", function (evt) { + return evt.respondTo && evt.respondTo[1] == trigger.card; + })) + ); + }) + ); + }, + }, + twyuanhu: { + audio: "yuanhu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hasCard({ type: "equip" }, "eh"); + }, + filterCard: { type: "equip" }, + filterTarget: function (card, player, target) { + var card = ui.selected.cards[0]; + return target.canEquip(card); + }, + discard: false, + lose: false, + prepare: "give", + position: "he", + check: function (card) { + if (get.position(card) == "h") return 9 - get.value(card); + return 7 - get.value(card); + }, + content: function () { + "step 0"; + target.equip(cards[0]); + "step 1"; + event.goto(3); + switch (get.subtype(cards[0])) { + case "equip1": + if ( + game.hasPlayer(function (current) { + return current != target && get.distance(target, current) == 1 && current.countCards("hej") > 0; + }) + ) { + player + .chooseTarget(true, "弃置一名距离" + get.translation(target) + "为1的角色区域内的一张牌", function (card, player, target) { + var current = _status.event.current; + return current != target && get.distance(current, target) == 1 && current.countCards("hej") > 0; + }) + .set("current", target) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy" }, player, player); + }); + event.goto(2); + } + break; + case "equip2": + target.draw(); + break; + case "equip3": + case "equip4": + case "equip5": + case "equip6": + target.recover(); + break; + } + "step 2"; + var target = result.targets[0]; + player.line(target); + player.discardPlayerCard(target, true, "hej"); + "step 3"; + if (target.hp <= player.hp || target.countCards("h") <= player.countCards("h")) { + player.draw(); + player.addTempSkill("twyuanhu_end"); + } + }, + ai: { + order: 10, + result: { + player: function (player, target) { + if (get.attitude(player, target) == 0) return 0; + if (!ui.selected.cards.length) return; + var eff = get.effect(target, ui.selected.cards[0], player, player), + sub = get.subtype(ui.selected.cards[0], false); + if (target == player) eff += 4; + else { + var hp = player.hp, + hs = player.countCards("h", card => card != ui.selected.cards[0]); + var tp = target.hp, + ts = target.countCards("h"); + if (sub == "equip2") ts++; + if (tp < target.maxHp && (sub == "equip3" || sub == "equip4" || sub == "equip5" || sub == "equip6")) tp++; + if (tp <= hp || ts <= hs) eff += 2; + } + if (sub == "equip1") { + var list = game + .filterPlayer(function (current) { + return current != target && get.distance(target, current) == 1 && current.countCards("hej") < 0; + }) + .map(function (i) { + return get.effect(i, { name: "guohe_copy" }, player, player); + }) + .sort((a, b) => b - a); + if (list.length) eff += list[0]; + } + return eff; + }, + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var sub = get.subtype(ui.selected.cards[0], false); + var eff = get.effect(target, ui.selected.cards[0], player, target); + if (sub == "equip2") eff += get.effect(target, { name: "draw" }, target, target); + if (target.isDamaged() && (sub == "equip3" || sub == "equip4" || sub == "equip5" || sub == "equip6")) eff += get.recoverEffect(target, player, player); + return eff; + }, + }, + }, + subSkill: { + end: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + charlotte: true, + filter: function (event, player) { + return player.hasSkill("twyuanhu") && player.hasCard({ type: "equip" }, "eh"); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt("twyuanhu"), + prompt2: "将一张装备牌置入一名角色的装备区内。若此牌为:武器牌,你弃置与其距离为1的另一名角色区域的一张牌;防具牌,其摸一张牌;坐骑牌或宝物牌,其回复1点体力。然后若其体力值或手牌数不大于你,则你摸一张牌。", + filterCard: lib.skill.twyuanhu.filterCard, + filterTarget: lib.skill.twyuanhu.filterTarget, + position: "he", + ai1: lib.skill.twyuanhu.check, + ai2: function (target) { + var player = _status.event.player; + return get.effect(target, "twyuanhu", player, player); + }, + }); + "step 1"; + if (result.bool) { + result.skill = "twyuanhu"; + player.useResult(result, event); + } + }, + }, + }, + }, + twjuezhu: { + audio: 2, + limited: true, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.hasEnabledSlot(3) || player.hasEnabledSlot(4); + }, + skillAnimation: true, + animationColor: "water", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twjuezhu"), [1, 2], function (card, player, target) { + return !ui.selected.targets.length && !target.hasSkill("feiying"); + }) + .set("multitarget", true) + .set("promptbar", "none") + .set("ai", function (target) { + if (player.hasUnknown()) return false; + return get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + event.target = result.targets[0]; + var list = []; + if (player.hasEnabledSlot(3)) list.push("equip3"); + if (player.hasEnabledSlot(4)) list.push("equip4"); + if (list.length == 1) event._result = { control: list[0] }; + else player.chooseControl(list).set("prompt", "选择废除一个坐骑栏"); + } else event.finish(); + "step 2"; + player.logSkill("twjuezhu", target); + player.awakenSkill("twjuezhu"); + player.disableEquip(result.control); + target.disableJudge(); + player.markAuto("twjuezhu_restore", [[target, result.control]]); + player.addSkill("twjuezhu_restore"); + target.addSkills("feiying"); + }, + subSkill: { + restore: { + trigger: { global: "die" }, + forced: true, + charlotte: true, + filter: function (event, player) { + for (var i of player.getStorage("twjuezhu_restore")) { + if (i[0] == event.player && player.hasDisabledSlot(i[1])) return true; + } + return false; + }, + content: function () { + var list = []; + for (var i of player.getStorage("twjuezhu_restore")) { + if (i[0] == trigger.player && player.hasDisabledSlot(i[1])) list.push(i[1]); + } + player.enableEquip(list); + }, + }, + }, + derivation: "feiying", + }, + twfengpo: { + audio: "fengpo", + trigger: { player: "useCardToPlayered" }, + logTarget: "target", + filter: function (event, player) { + return (event.card.name == "sha" || event.card.name == "juedou") && event.targets.length == 1 && event.target.countCards("h") > 0; + }, + onremove: true, + content: function () { + "step 0"; + event.target = trigger.target; + player.viewHandcards(trigger.target); + "step 1"; + var num = target.countCards("h", player.storage.twfengpo ? { color: "red" } : { suit: "diamond" }); + if (!num) { + event.finish(); + return; + } + event.num = num; + player.chooseControl().set("choiceList", ["摸" + num + "张牌", "令" + get.translation(trigger.card) + "的伤害值基数+" + num]); + "step 2"; + if (result.index == 0) player.draw(num); + else trigger.getParent().baseDamage += num; + }, + group: "twfengpo_kill", + subSkill: { + kill: { + audio: "fengpo", + trigger: { source: "die" }, + forced: true, + filter: (event, player) => !player.storage.twfengpo, + skillAnimation: true, + animationColor: "fire", + content: function () { + player.storage.twfengpo = true; + player.popup("凤魄"); + game.log(player, "恢复了技能", "#g【凤魄】"); + }, + }, + }, + }, + twmouzhu: { + audio: "mouzhu", + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + contentBefore: function () { + var target = targets[0], + evt = event.getParent(); + evt._target = target; + var list = game.filterPlayer(function (current) { + return current != player && current != target && current.hp <= player.hp; + }); + if (!list.length) { + player.loseHp(); + evt.finish(); + } else { + evt.targets = list.sortBySeat(); + player.line(list); + } + }, + content: function () { + "step 0"; + target + .chooseCard("he", "是否交给" + get.translation(player) + "一张牌?") + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) > 0); + "step 1"; + if (result.bool) { + target.give(result.cards, player); + } else { + game.log(target, "拒绝给牌"); + } + }, + contentAfter: function () { + "step 0"; + var num = 0, + par = event.getParent(); + player.getHistory("gain", function (evt) { + if (evt.getParent(2) == par) num += evt.cards.length; + }); + if (!num) { + player.loseHp(); + for (var i of targets) i.loseHp(); + event.finish(); + } else { + var target = event.getParent()._target; + event.target = target; + event.num = num; + var bool1 = player.canUse("sha", target, false), + bool2 = player.canUse("juedou", target, false); + if (bool1 && bool2) + target + .chooseControl("sha", "juedou") + .set("prompt", "谋诛:视为被" + get.translation(player) + "使用一张…") + .set("prompt2", "(伤害值基数:" + num + ")") + .set("ai", function () { + var target = _status.event.player, + player = _status.event.getParent().player; + if (target.hasShan() || get.effect(target, { name: "sha" }, player, target) > 0) return "sha"; + if (get.effect(target, { name: "juedou" }, player, target) > 0) return "juedou"; + return "sha"; + }); + else if (bool1) event._result = { control: "sha" }; + else if (bool2) event._result = { control: "juedou" }; + else event.finish(); + } + "step 1"; + if (result.control && lib.card[result.control]) + player.useCard( + { + name: result.control, + isCard: true, + }, + false, + target + ).baseDamage = num; + }, + ai: { + order: 9, + result: { + target: function (player, target) { + if (get.attitude(player, target) >= 0) return 0; + var list = game.filterPlayer(function (current) { + return current != player && current != target && current.hp <= player.hp; + }); + if (!list.length) return 0; + return ( + -Math.min(-get.effect(target, { name: "sha" }, player, target), -get.effect(target, { name: "juedou" }, player, target)) * + list.reduce(function (num, current) { + return num + (2 + get.sgn(get.attitude(current, player))); + }, 0) + ); + }, + }, + }, + }, + twyanhuo: { + audio: "yanhuo", + trigger: { player: "die" }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); + }, + content: function () { + "step 0"; + var num = player.countCards("he"), + str = get.cnNumber(num); + event.num1 = num; + event.num2 = 1; + var list = ["令一名其他角色弃置" + str + "张牌"]; + if (num > 1) { + list.push("令至多" + str + "名其他角色各弃置一张牌"); + } + player.chooseControl("cancel2").set("choiceList", list).set("prompt", get.prompt("twyanhuo")).set("forceDie", true); + "step 1"; + if (result.control != "cancel2") { + if (result.index == 0) { + event.num2 = event.num1; + event.num1 = 1; + } + player + .chooseTarget([1, event.num1], true, "请选择【延祸】的目标", function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("forceDie", true) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("twyanhuo", targets); + for (var i of targets) i.chooseToDiscard(true, "he", event.num2); + } + }, + }, + twshenxing: { + mod: { + globalFrom: function (player, target, distance) { + var es = player.getCards("e", function (card) { + return !ui.selected.cards.includes(card); + }); + for (var i of es) { + var type = get.subtype(i); + if (type == "equip3" || type == "equip4" || type == "equip6") return distance; + } + return distance - 1; + }, + maxHandcard: function (player, distance) { + var es = player.getCards("e", function (card) { + return !ui.selected.cards.includes(card); + }); + for (var i of es) { + var type = get.subtype(i); + if (type == "equip3" || type == "equip4" || type == "equip6") return distance; + } + return distance + 1; + }, + }, + }, + twdaoji: { + audio: "daoji", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hasCard(lib.skill.twdaoji.filterCard, "he"); + }, + filterCard: function (card) { + return get.type(card) != "basic"; + }, + position: "he", + filterTarget: function (card, player, target) { + return target != player && player.inRange(target) && target.hasCard(card => lib.filter.canBeGained(card, target, player), "he"); + }, + check: function (card) { + return 8 - get.value(card); + }, + content: function () { + "step 0"; + player.gainPlayerCard(target, "he", true); + "step 1"; + if (result.bool && result.cards && result.cards.length == 1) { + var card = result.cards[0]; + if (player.getCards("h").includes(card)) { + var type = get.type(card); + if (type == "basic") player.draw(); + else if (type == "equip") { + if (player.hasUseTarget(card)) player.chooseUseTarget(card, "nopopup", true); + target.damage("nocard"); + } + } + } + }, + ai: { + order: 6, + result: { + target: function (player, target) { + var eff = get.effect(target, { name: "shunshou_copy2" }, player, target); + if (target.countCards("e") > 0) eff += get.damageEffect(target, player, target); + return eff; + }, + }, + }, + }, + xinzhenjun: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: true, + filterTarget: lib.filter.notMe, + position: "he", + prompt: get.prompt2("xinzhenjun"), + ai1: function (card) { + var player = _status.event.player; + if (card.name == "sha" && get.color(card) == "red") { + for (var i = 0; i < game.players.length; i++) { + var current = game.players[i]; + if (current != player && get.attitude(player, current) > 0 && current.hasValueTarget(card)) return 7; + } + return 0; + } + return 7 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + var card = ui.selected.cards[0]; + var att = get.attitude(player, target); + if (get.value(card) < 0) return -att * 2; + if (target.countCards("h", { name: "sha", color: "red" }) || target.hasSkill("wusheng") || target.hasSkill("new_rewusheng") || target.hasSkill("wushen") || (card.name == "sha" && get.color(card) == "red" && target.hasValueTarget(card))) return att * 2; + var eff = 0; + game.countPlayer(function (current) { + if (target != current && get.distance(target, current, "attack") > 1) return; + var eff2 = get.damageEffect(current, player, player); + if (eff2 > eff) eff = eff2; + }); + if (att > 0 && eff > 0) eff += 2 * att; + return eff; + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xinzhenjun", target); + player.give(result.cards, target); + } else event.finish(); + "step 2"; + target.chooseToUse({ + filterCard: function (card) { + return get.name(card) == "sha" && get.color(card) != "black" && lib.filter.cardEnabled.apply(this, arguments); + }, + prompt: "请使用一张不为黑色的【杀】,否则" + get.translation(player) + "可以对你或你攻击范围内的一名其他角色造成1点伤害", + }); + "step 3"; + if (result.bool) { + var num = 1; + game.countPlayer2(function (current) { + current.getHistory("damage", function (evt) { + if (evt.getParent(evt.notLink() ? 4 : 8) == event) num += evt.num; + }); + }); + player.draw(num); + event.finish(); + } else { + player + .chooseTarget("是否对" + get.translation(target) + "或其攻击范围内的一名角色造成1点伤害?", function (card, player, target) { + return target == _status.event.targetx || _status.event.targetx.inRange(target); + }) + .set("targetx", event.target).ai = function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }; + } + "step 4"; + if (result.bool) { + player.line(result.targets); + result.targets[0].damage("nocard"); + } + }, + }, + twmoukui: { + audio: "moukui", + trigger: { player: "useCardToPlayered" }, + direct: true, + preHidden: true, + filter: function (event, player) { + return event.card && event.card.name == "sha"; + }, + content: function () { + "step 0"; + var list = ["选项一"]; + if (trigger.target.countDiscardableCards(player, "he") > 0) list.push("选项二"); + list.push("背水!"); + list.push("cancel2"); + player + .chooseControl(list) + .set("choiceList", ["摸一张牌", "弃置" + get.translation(trigger.target) + "的一张牌", "背水!依次执行以上两项。然后若此【杀】未令其进入濒死状态,则其弃置你的一张牌。"]) + .set("prompt", get.prompt("twmoukui", trigger.target)) + .setHiddenSkill("twmoukui"); + "step 1"; + if (result.control != "cancel2") { + var target = trigger.target; + player.logSkill("twmoukui", target); + if (result.control == "选项一" || result.control == "背水!") player.draw(); + if (result.control == "选项二" || result.control == "背水!") player.discardPlayerCard(target, true, "he"); + if (result.control == "背水!") { + player.addTempSkill("twmoukui_effect"); + var evt = trigger.getParent(); + if (!evt.twmoukui_effect) evt.twmoukui_effect = []; + evt.twmoukui_effect.add(target); + } + } + }, + subSkill: { + effect: { + trigger: { player: "useCardAfter" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return ( + event.twmoukui_effect && + event.twmoukui_effect.filter(function (current) { + return ( + current.isIn() && + !current.hasHistory("damage", function (evt) { + return evt._dyinged && evt.card == event.card; + }) + ); + }).length > 0 + ); + }, + content: function () { + var list = trigger.twmoukui_effect + .filter(function (current) { + return ( + current.isIn() && + !current.hasHistory("damage", function (evt) { + return evt._dyinged && evt.card == event.card; + }) + ); + }) + .sortBySeat(); + for (var i of list) { + i.discardPlayerCard(player, true, "he").boolline = true; + } + }, + }, + }, + }, + twfuhan: { + audio: "fuhan", + trigger: { player: "phaseZhunbeiBegin" }, + unique: true, + limited: true, + skillAnimation: true, + animationColor: "orange", + forceunique: true, + filter: function (event, player) { + return player.countMark("fanghun") > 0; + }, + prompt: function (event, player) { + var num = Math.max(2, player.storage.fanghun); + num = Math.min(num, 8); + return get.prompt("twfuhan") + "(体力上限:" + num + ")"; + }, + check: function (event, player) { + if (player.storage.fanghun >= Math.min(4, player.maxHp)) return true; + if (player.hp <= 2 && player.storage.fanghun >= 3) return true; + return false; + }, + content: function () { + "step 0"; + var num = Math.max(2, player.storage.fanghun); + num = Math.min(num, 8); + event.num = num; + player.removeMark("fanghun", player.storage.fanghun); + player.awakenSkill("twfuhan"); + if (_status.characterlist) { + list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + if (lib.character[name][1] == "shu") list.push(name); + } + } else if (_status.connectMode) { + list = get.charactersOL(function (i) { + return lib.character[i][1] != "shu"; + }); + } else { + list = get.gainableCharacters(function (info) { + return info[1] == "shu"; + }); + } + var players = game.players.concat(game.dead); + for (var i = 0; i < players.length; i++) { + list.remove(players[i].name); + list.remove(players[i].name1); + list.remove(players[i].name2); + } + list.remove("zhaoxiang"); + player.chooseButton(["扶汉:选择获得一张武将牌上的所有技能", [list.randomGets(5), "character"]], true); + "step 1"; + if (result.bool) { + var name = result.links[0]; + player.flashAvatar("twhuashen", name); + game.log(player, "获得了", "#y" + get.translation(name), "的所有技能"); + player.addSkills(lib.character[name][3]); + } + "step 2"; + var num = event.num - player.maxHp; + if (num > 0) player.gainMaxHp(num); + else player.loseMaxHp(-num); + player.recover(); + "step 3"; + var card = get.cardPile("meiyingqiang", "field"); + if (card) { + player.gain(card, "gain2", "log"); + } + }, + ai: { + combo: "refanghun", + }, + }, + twqueshi: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.hasEquipableSlot(1); + }, + content: function () { + if (!lib.inpile.includes("meiyingqiang")) { + lib.inpile.push("meiyingqiang"); + player.equip(game.createCard("meiyingqiang", "diamond", 12)); + } else { + var card = get.cardPile(function (card) { + return card.name == "meiyingqiang" && !player.getEquips(1).includes(card); + }, "field"); + if (card) player.equip(card); + } + }, + }, + meiyingqiang: { + equipSkill: true, + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + var list = player.getHistory("lose", function (evt) { + return evt.cards2 && evt.cards2.length; + }); + if (event.name == "lose") { + if (list.indexOf(event) != 0) return false; + } else { + if ( + !player.hasHistory("lose", function (evt) { + return evt.getParent() == event && list.indexOf(evt) == 0; + }) + ) + return false; + } + return _status.connectMode || !lib.config.skip_shan || player.hasSha(); + }, + direct: true, + content: function () { + if (trigger.delay === false) game.delayx(); + player + .chooseToUse("梅影枪:是否使用一张【杀】?", function (card) { + if (get.name(card) != "sha") return false; + return lib.filter.cardEnabled.apply(this, arguments); + }) + .set("addCount", false).logSkill = "meiyingqiang"; + }, + }, + cuijin: { + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && (event.player == player || player.inRange(event.player)) && player.countCards("he") > 0; + }, + checkx(event, player) { + let d1 = true, + e = false; + if (event.player.hasSkill("jueqing") || event.player.hasSkill("gangzhi")) d1 = false; + for (let tar of event.targets) { + if (event.card.name == "sha") { + if ( + !tar.mayHaveShan( + player, + "use", + tar.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) || + event.player.hasSkillTag( + "directHit_ai", + true, + { + target: tar, + card: event.card, + }, + true + ) + ) { + if (!tar.hasSkill("gangzhi")) d1 = false; + if ( + !tar.hasSkillTag("filterDamage", null, { + player: event.player, + card: event.card, + }) + ) { + let att = get.attitude(_status.event.player, tar); + if (att > 0) return false; + if (att < 0) e = true; + } + } + } else e = true; + } + if (e) return true; + if (d1) return get.damageEffect(event.player, player, _status.event.player) > 0; + return false; + }, + content: function () { + "step 0"; + if (player != game.me && !player.isOnline()) game.delayx(); + var target = trigger.player; + event.target = target; + player + .chooseToDiscard("he", get.prompt("cuijin", target), "弃置一张牌并令" + get.translation(trigger.player) + "使用的【杀】伤害+1,但若其未造成伤害,则你对其造成1点伤害。") + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", lib.skill.cuijin.checkx(trigger, player)).logSkill = ["cuijin", target]; + "step 1"; + if (result.bool) { + if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; + trigger.baseDamage++; + player.addTempSkill("cuijin_damage"); + player.markAuto("cuijin_damage", [trigger.card]); + } + }, + subSkill: { + damage: { + trigger: { global: "useCardAfter" }, + forced: true, + popup: false, + charlotte: true, + onremove: true, + filter: function (event, player) { + return player.storage.cuijin_damage.includes(event.card); + }, + content: function () { + player.storage.cuijin_damage.remove(trigger.card); + if (!player.storage.cuijin_damage.length) player.removeSkill("cuijin_damage"); + if ( + trigger.player.isIn() && + !game.hasPlayer2(function (current) { + return current.hasHistory("damage", function (evt) { + return evt.card == trigger.card; + }); + }) + ) { + player.line(trigger.player, "green"); + trigger.player.damage(); + } + }, + }, + }, + }, + jintao: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + targetInRange: function (card) { + if (card.name == "sha") return true; + }, + }, + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var index = player + .getHistory("useCard", function (evtx) { + return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; + }) + .indexOf(event); + return index == 0 || index == 1; + }, + content: function () { + var evt = trigger.getParent("phaseUse"); + var index = player + .getHistory("useCard", function (evtx) { + return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; + }) + .indexOf(trigger); + if (index == 0) { + game.log(trigger.card, "伤害+1"); + if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; + trigger.baseDamage++; + } else { + game.log(trigger.card, "不可被响应"); + trigger.directHit.addArray(game.players); + } + }, + }, + equan: { + audio: 2, + trigger: { global: "damageEnd" }, + forced: true, + filter: function (event, player) { + return player == _status.currentPhase && event.player.isIn(); + }, + logTarget: "player", + content: function () { + trigger.player.addMark("equan", trigger.num, false); + }, + group: ["equan_block", "equan_lose"], + marktext: "毒", + intro: { + name: "恶泉(毒)", + name2: "毒", + }, + subSkill: { + lose: { + audio: "equan", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function () { + return game.hasPlayer(function (current) { + return current.hasMark("equan"); + }); + }, + logTarget: function () { + return game.filterPlayer(function (current) { + return current.hasMark("equan"); + }); + }, + content: function () { + game.countPlayer(function (current) { + var num = current.countMark("equan"); + if (num) { + current.removeMark("equan", num); + current.loseHp(num); + } + }); + }, + }, + block: { + trigger: { global: "dyingBegin" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + var evt = event.getParent(2); + return evt.name == "equan_lose" && evt.player == player; + }, + content: function () { + trigger.player.addTempSkill("baiban"); + }, + }, + }, + }, + manji: { + audio: 2, + trigger: { global: "loseHpAfter" }, + forced: true, + filter: function (event, player) { + return player != event.player && (player.hp >= event.player.hp || player.isDamaged()); + }, + logTarget: "player", + content: function () { + if (player.hp <= trigger.player.hp) player.recover(); + if (player.hp >= trigger.player.hp) player.draw(); + }, + }, + beini: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.hp >= player.hp; + }, + content: function () { + "step 0"; + var str = get.translation(target); + player + .chooseControl() + .set("choiceList", ["摸两张牌,然后令" + str + "视为对自己使用【杀】", "令" + str + "摸两张牌,然后视为对其使用【杀】"]) + .set("ai", function () { + var evt = _status.event.getParent(), + player = evt.player, + target = evt.target; + var card = { name: "sha", isCard: true }, + att = get.attitude(player, target) > 0; + if (!target.canUse(card, player, false) || get.effect(player, card, target, player) >= 0) return 0; + if (att && (!player.canUse(card, target, false) || get.effect(target, card, player, player) >= 0)) return 1; + if (target.hasSkill("nogain") && player.canUse(card, target, false) && get.effect(target, card, player, player) > 0) return 1; + if (player.hasShan()) return 0; + if (att && target.hasShan()) return 1; + return 0; + }); + "step 1"; + var list = [player, target]; + if (result.index == 1) list.reverse(); + event.list = list; + list[0].draw(2); + "step 2"; + var list = event.list; + if (list[1].isIn() && list[0].isIn() && list[1].canUse("sha", list[0], false)) list[1].useCard({ name: "sha", isCard: true }, list[0], false, "noai"); + }, + ai: { + order: 5, + expose: 0, + result: { + player: function (player, target) { + var card = { name: "sha", isCard: true }, + att = get.attitude(player, target) > 0; + if (!target.canUse(card, player, false) || get.effect(player, card, target, player) >= 0) return 2; + if (att && (!player.canUse(card, target, false) || get.effect(target, card, player, player) >= 0)) return 2; + if (target.hasSkill("nogain") && player.canUse(card, target, false)) return get.effect(target, card, player, player); + if (player.hasShan()) return 1; + if (att && target.hasShan()) return 1; + return 0; + }, + }, + }, + }, + dingfa: { + audio: 2, + trigger: { player: "phaseDiscardAfter" }, + direct: true, + filter: function (event, player) { + var num = 0; + player.getHistory("lose", function (evt) { + num += evt.cards2.length; + }); + return num >= player.hp; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("dingfa"), "操作提示:选择自己以回复体力,或选择其他角色以造成伤害", function (card, player, target) { + return target == player ? player.isDamaged() : true; + }) + .set("ai", function (target) { + return target != player ? get.damageEffect(target, player, player) : get.recoverEffect(player, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dingfa", target); + if (target == player) player.recover(); + else target.damage(); + } + }, + }, + dz_mantianguohai: { + mod: { + ignoredHandcard: function (card, player) { + if (get.name(card) == "dz_mantianguohai") return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "cardsDiscard" && get.name(card) == "dz_mantianguohai") return false; + }, + }, + }, + twmiaolve: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + locked: false, + content: function () { + if (!lib.inpile.includes("dz_mantianguohai")) lib.inpile.add("dz_mantianguohai"); + if (!_status.dz_mantianguohai_suits) _status.dz_mantianguohai_suits = lib.suit.slice(0); + var list = _status.dz_mantianguohai_suits.randomRemove(2).map(function (i) { + return game.createCard2("dz_mantianguohai", i, 5); + }); + if (list.length) player.gain(list, "gain2", "log"); + }, + group: "twmiaolve_damage", + subSkill: { + damage: { + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + var list = ["dz_mantianguohai"]; + list.addArray(get.zhinangs()); + player.chooseButton([get.prompt("twmiaolve"), [list, "vcard"]]).set("ai", function (button) { + if (button.link[2] == "dz_mantianguohai" && player.countCards("hs", "dz_mantianguohai") < 2) return 10; + return get.value({ name: button.link[2] }); + }); + "step 2"; + if (result.bool) { + player.logSkill("twmiaolve"); + var name = result.links[0][2]; + if (name == "dz_mantianguohai") { + if (!lib.inpile.includes("dz_mantianguohai")) lib.inpile.add("dz_mantianguohai"); + if (!_status.dz_mantianguohai_suits) _status.dz_mantianguohai_suits = lib.suit.slice(0); + if (_status.dz_mantianguohai_suits.length) player.gain(game.createCard2("dz_mantianguohai", _status.dz_mantianguohai_suits.randomRemove(), 5), "gain2"); + else { + var card = get.cardPile(function (card) { + return card.name == name; + }); + if (card) player.gain(card, "gain2"); + } + player.draw(); + } else { + var card = get.cardPile(function (card) { + return card.name == name; + }); + if (card) player.gain(card, "gain2"); + } + if (event.count > 0 && player.hasSkill("twmiaolve")) event.goto(1); + } + }, + }, + }, + }, + twyingjia: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + filter: function (event, player) { + if (!player.countCards("he")) return false; + var history = player.getHistory("useCard"), + map = {}; + for (var i of history) { + if (get.type2(i.card) == "trick") { + if (!map[i.card.name]) map[i.card.name] = true; + else return true; + } + } + return false; + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + prompt: get.prompt("twyingjia"), + prompt2: "弃置一张牌并令一名角色进行一个额外回合", + filterCard: lib.filter.cardDiscardable, + filterTarget: true, + ai1: function (card) { + return 8 - get.value(card); + }, + ai2: function (target) { + if (target.hasJudge("lebu")) return -1; + var player = _status.event.player; + if (get.attitude(player, target) > 4) { + return get.threaten(target) / Math.sqrt(target.hp + 1) / Math.sqrt(target.countCards("h") + 1); + } + return -1; + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twyingjia", target); + player.discard(result.cards); + target.insertPhase(); + } + }, + }, + gx_lingbaoxianhu: { + trigger: { + source: "damageSource", + global: "dieAfter", + }, + forced: true, + equipSkill: true, + filter: function (event, player) { + if (event.name == "damage") return event.num > 1; + return true; + }, + content: function () { + player.gainMaxHp(); + player.recover(); + }, + }, + gx_taijifuchen: { + trigger: { player: "useCardToPlayered" }, + forced: true, + equipSkill: true, + filter: function (event, player) { + return event.card && event.card.name == "sha"; + }, + logTarget: "target", + content: function () { + "step 0"; + var suit = get.suit(trigger.card); + var num = trigger.target.countCards("h", "shan"); + var next = trigger.target + .chooseToDiscard("弃置一张牌,或不能响应" + get.translation(trigger.card), "he") + .set("ai", function (card) { + var num = _status.event.num; + if (num == 0) return 0; + if (card.name == "shan") return num > 1 ? 2 : 0; + return (get.suit(card) != _status.event.suit ? 9 : 6) - get.value(card); + }) + .set("num", num); + if (lib.suit.includes(suit)) { + next.set("prompt2", "若弃置的是" + get.translation(suit) + "牌,则改为" + get.translation(player) + "获得之"); + next.set("suit", suit); + } + "step 1"; + if (result.bool) { + var card = result.cards[0]; + if (get.suit(card, trigger.target) == get.suit(trigger.card, false) && get.position(card) == "d") player.gain(card, "gain2"); + } else trigger.directHit.add(trigger.target); + }, + }, + gx_chongyingshenfu: { + trigger: { player: "damageEnd" }, + forced: true, + equipSkill: true, + filter: function (event, player) { + if (!event.card || !event.card.name || player.getStorage("gx_chongyingshenfu_effect").includes(event.card.name)) return false; + if (player.hasSkillTag("unequip2")) return false; + if ( + event.source.hasSkillTag("unequip", false, { + name: event.card.name, + target: player, + card: event.card, + }) + ) + return false; + return true; + }, + content: function () { + player.markAuto("gx_chongyingshenfu_effect", [trigger.card.name]); + }, + group: "gx_chongyingshenfu_effect", + subSkill: { + effect: { + trigger: { player: "damageBegin4" }, + forced: true, + equipSkill: true, + filter: function (event, player) { + if (!event.card || !event.card.name || !player.storage.gx_chongyingshenfu_effect || !player.getStorage("gx_chongyingshenfu_effect").includes(event.card.name)) return false; + if (player.hasSkillTag("unequip2")) return false; + if ( + event.source.hasSkillTag("unequip", false, { + name: event.card.name, + target: player, + card: event.card, + }) + ) + return false; + return true; + }, + content: function () { + trigger.num--; + }, + ai: { + effect: { + target: function (card, player, target) { + if ( + typeof card == "object" && + target.storage.gx_chongyingshenfu_effect && + target.getStorage("gx_chongyingshenfu_effect").includes(card.name) && + !target.hasSkillTag("unequip2") && + (get.itemtype(player) !== "player" || + (!player.hasSkillTag("jueqing", false, target) && + !player.hasSkillTag("unequip", false, { + name: card.name, + target: target, + card: card, + }))) + ) { + if ( + player && + player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ) + return 0.5; + return "zeroplayertarget"; + } + }, + }, + }, + onremove: true, + intro: { + content: "受到$造成的伤害-1", + }, + }, + }, + }, + twdanfa: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + direct: true, + content: function () { + "step 0"; + player.chooseCard("he", get.prompt("twdanfa"), "将一张牌作为“丹”置于武将牌上").set("ai", function (card) { + if (player.storage.twdanfa) { + var suit = get.suit(card); + for (var i of player.storage.twdanfa) { + if (get.suit(i, false) == suit) return 4 - get.value(card); + } + } + return 5.5 - get.value(card); + }); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + player.logSkill("twdanfa"); + game.log(player, "将", card, "放在了武将牌上"); + player.$give(card, player, false); + player.lose(card, ui.special, "toStorage"); + player.markAuto("twdanfa", result.cards); + } else event.finish(); + "step 2"; + game.delayx(); + }, + mark: true, + intro: { + content: "cards", + onunmark: "throw", + }, + group: "twdanfa_draw", + subSkill: { + draw: { + audio: "twdanfa", + trigger: { player: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + if (!player.storage.twdanfa || !player.storage.twdanfa.length) return false; + var suit = get.suit(event.card, false); + if (suit == "none" || (player.storage.twdanfa_count && player.storage.twdanfa_count.includes(suit))) return false; + for (var i of player.storage.twdanfa) { + if (get.suit(i, false) == suit) return true; + } + return false; + }, + content: function () { + player.draw(); + player.addTempSkill("twdanfa_count"); + if (!player.storage.twdanfa_count) player.storage.twdanfa_count = []; + player.storage.twdanfa_count.push(get.suit(trigger.card, false)); + }, + }, + count: { onremove: true }, + }, + }, + twlingbao: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var list = player.getStorage("twdanfa"); + if (list.length < 2) return false; + var suit = get.suit(list[0], false); + for (var i = 1; i < list.length; i++) { + if (get.suit(list[i], false) != suit) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("灵宝", player.storage.twdanfa); + }, + filter: function (button, player) { + if (!ui.selected.buttons.length) return true; + return get.suit(button.link) != get.suit(ui.selected.buttons[0].link); + }, + select: 2, + backup: function (links) { + var obj = get.copy(lib.skill["twlingbao_" + get.color(links)]); + obj.cards = links; + obj.audio = "twlingbao"; + obj.filterCard = () => false; + obj.selectCard = -1; + return obj; + }, + prompt: function (links) { + return lib.skill["twlingbao_" + get.color(links)].prompt; + }, + check: function (button) { + var storage = _status.event.player.storage.twdanfa.slice(0); + storage.remove(button.link); + if ( + storage.filter(function (card) { + return card.suit == button.link.suit; + }).length + ) + return 1 + Math.random(); + return 0; + }, + }, + subSkill: { + red: { + filterTarget: function (card, player, target) { + return target.isDamaged(); + }, + delay: false, + prompt: "令一名角色回复1点体力", + content: function () { + "step 0"; + var cards = lib.skill.twlingbao_backup.cards; + player.$throw(cards, 1000); + player.unmarkAuto("twdanfa", cards); + game.log(player, "将", cards, "置入了弃牌堆"); + game.delayx(); + game.cardsDiscard(cards); + "step 1"; + target.recover(); + }, + ai: { + tag: { + recover: 1, + }, + result: { + target: 1.5, + }, + }, + }, + black: { + filterTarget: function (card, player, target) { + return target.countDiscardableCards(player, "hej") > 0; + }, + delay: false, + prompt: "弃置一名角色区域内至多两张区域不同的牌", + content: function () { + "step 0"; + var cards = lib.skill.twlingbao_backup.cards; + player.$throw(cards, 1000); + player.unmarkAuto("twdanfa", cards); + game.log(player, "将", cards, "置入了弃牌堆"); + game.delayx(); + game.cardsDiscard(cards); + "step 1"; + var num = 0; + if (target.countDiscardableCards(player, "h")) num++; + if (target.countDiscardableCards(player, "e")) num++; + if (target.countDiscardableCards(player, "j")) num++; + if (num) { + player.discardPlayerCard(target, [1, Math.max(2, num)], "hej", true).set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.position(button.link) == get.position(ui.selected.buttons[i].link)) return false; + } + return true; + }); + } + }, + ai: { + tag: { + lose: 1.5, + loseCard: 1.5, + discard: 1.5, + }, + result: { + target: function (player, target) { + if ( + get.attitude(player, target) > 0 && + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) > 0 && + target.countCards("j", function (card) { + return get.effect(target, card, target, target) < 0; + }) > 8 + ) + return 3; + if ( + target.countCards("h") > 0 && + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) > 0 + ) + return -2; + return 0; + }, + }, + }, + }, + none: { + selectTarget: 2, + filterTarget: function (card, player, target) { + if (!ui.selected.targets.length) return true; + return target.countCards("he") > 0; + }, + complexSelect: true, + targetprompt: ["摸牌", "弃牌"], + delay: false, + prompt: "令一名角色摸一张牌并令另一名角色弃置一张牌", + multitarget: true, + multiline: true, + content: function () { + "step 0"; + var cards = lib.skill.twlingbao_backup.cards; + player.$throw(cards, 1000); + player.unmarkAuto("twdanfa", cards); + game.log(player, "将", cards, "置入了弃牌堆"); + game.delayx(); + game.cardsDiscard(cards); + "step 1"; + targets[0].draw(); + targets[1].chooseToDiscard("he", true); + }, + ai: { + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return 1; + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) > 0 + ) + return 1; + return -1; + }, + }, + }, + }, + backup: { audio: "twlingbao" }, + }, + ai: { + order: 1, + result: { player: 1 }, + combo: "twdanfa", + }, + }, + twsidao: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && !player.storage.twsidao; + }, + content: function () { + "step 0"; + player.chooseButton(["请选择你的初始法宝", [["gx_lingbaoxianhu", "gx_taijifuchen", "gx_chongyingshenfu"], "vcard"]], true).set("ai", function (button) { + return button.link[2] == "gx_chongyingshenfu" ? 2 : 1; + }); + "step 1"; + if (result.bool) { + var card = game.createCard2(result.links[0][2], "heart", 1); + lib.inpile.add(result.links[0][2]); + player.storage.twsidao = card; + player.chooseUseTarget(card, "nopopup", true); + } + }, + group: "twsidao_equip", + subSkill: { + equip: { + audio: "twsidao", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + var card = player.storage.twsidao; + return card && card.isInPile() && player.hasUseTarget(card); + }, + content: function () { + player.chooseUseTarget(player.storage.twsidao, "nopopup", true); + }, + }, + }, + }, + twrangyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: lib.filter.notMe, + delay: 0, + content: function () { + "step 0"; + event.cards = player.getCards("h"); + player.give(event.cards, target).gaintag.add("twrangyi"); + target.addTempSkill("twrangyi2"); + "step 1"; + target.chooseToUse({ + prompt: "请使用得到的一张牌,或者受到来自" + get.translation(player) + "的1点伤害", + filterCard: function (card, player) { + if (get.itemtype(card) != "card" || !card.hasGaintag("twrangyi")) return false; + return lib.filter.filterCard(card, player, event); + }, + cards: cards, + }); + "step 2"; + target.removeSkill("twrangyi2"); + if (!result.bool) target.damage("nocard"); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + var hi = hs[i]; + if (hi.name == "tao" || target.hasValueTarget(hi, null, true)) return 1; + } + return get.damageEffect(target, player, target); + }, + }, + }, + }, + twrangyi2: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + var evt = event.getParent(2); + return ( + evt.name == "twrangyi" && + evt.player.isIn() && + player.countCards("h", function (card) { + return card.hasGaintag("twrangyi"); + }) > 0 + ); + }, + content: function () { + var cards = player.getCards("h", function (card) { + return card.hasGaintag("twrangyi"); + }); + game.delayx(); + player.give(cards, trigger.getParent(2).player); + }, + onremove: function (player) { + player.removeGaintag("twrangyi"); + }, + }, + twbaimei: { + audio: 2, + trigger: { + player: "damageBegin4", + }, + forced: true, + filter: function (event, player) { + if (player.countCards("h")) return false; + if (event.hasNature()) return true; + return get.type(event.card, "trick") == "trick"; + }, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (target.countCards("h")) return; + if (get.tag(card, "natureDamage")) return "zeroplayertarget"; + if (get.type(card) == "trick" && get.tag(card, "damage")) { + return "zeroplayertarget"; + } + }, + }, + }, + }, + twhuzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (e, player) { + return player.countCards("e") > 0; + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + target.chooseCard("交给" + get.translation(player) + "一张手牌", "h", true); + "step 1"; + target.give(result.cards, player); + "step 2"; + if (player.countGainableCards(player, "e")) target.gainPlayerCard(player, "e", true); + "step 3"; + if (target.isDamaged() && target.hp <= player.hp) { + player.chooseBool("是否令" + get.translation(target) + "回复1点体力?").set("ai", function () { + return get.recoverEffect(target, player, player); + }); + } + "step 4"; + if (result.bool) target.recover(); + }, + ai: { + order: 8, + result: { + target: function (player, target) { + var eff = target.isDamaged() && target.hp <= player.hp ? get.recoverEffect(target, player, target) : 0; + if (eff <= 0 && !player.countGainableCards(target, "e")) return -1; + return eff; + }, + }, + }, + }, + twliancai: { + audio: 2, + trigger: { player: ["turnOverEnd", "phaseJieshuBegin"] }, + filter: function (card, player, target) { + return target == "phaseJieshuBegin" || player.countCards("h") < player.hp; + }, + filterTarget: function (card, player, target) { + return target != player && target.countGainableCards(player, "e") > 0; + }, + check: function (card, player) { + if (card.name == "turnOver") return true; + if (player.isTurnedOver()) return true; + if (player.hp - player.countCards("h") > 1) return true; + return game.hasPlayer(function (current) { + return lib.skill.twliancai.filterTarget(null, player, current) && lib.skill.twliancai.filterAI(current); + }); + }, + filterAI: function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (target.isDamaged() && target.countCards("e", "baiyin") && att > 0) return 2 * att; + return -att; + }, + prompt2: function (card, player, target) { + return card.name == "phaseJieshu" ? "将武将牌翻面,然后获得一名其他角色装备区内的一张牌" : "将手牌摸至与体力值相同"; + }, + content: function () { + "step 0"; + if (event.triggername == "phaseJieshuBegin") player.turnOver(); + else { + player.draw(player.hp - player.countCards("h")); + event.finish(); + } + "step 1"; + player.chooseTarget("获得一名角色装备区内的一张牌", lib.skill.twliancai.filterTarget).ai = lib.skill.twliancai.filterAI; + "step 2"; + if (result.bool) { + player.line(result.targets, "thunder"); + player.gainPlayerCard("e", true, result.targets[0]); + } + }, + }, + twqijia: { + //group:'twqijia_alka', + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("e", function (card) { + return !player.getStorage("twqijia_alka").includes(get.subtype(card)); + }); + }, + filterTarget: function (card, player, target) { + return target != player && player.canUse({ name: "sha" }, target); + }, + position: "e", + filterCard: function (card, player) { + return !player.getStorage("twqijia_alka").includes(get.subtype(card)); + }, + content: function () { + "step 0"; + player.addTempSkill("twqijia_alka"); + player.storage.twqijia_alka.push(get.subtype(cards[0])); + player.useCard({ name: "sha" }, target, false); + }, + subSkill: { + alka: { + charlotte: true, + onremove: function (player) { + delete player.storage.twqijia_alka; + delete player.storage.twzhuchen; + player.unmarkSkill("twzhuchen"); + }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + if (!player.storage.twzhuchen) player.storage.twzhuchen = []; + }, + mod: { + globalFrom: function (from, to, distance) { + if (from.storage.twzhuchen && from.storage.twzhuchen.includes(to)) return -Infinity; + }, + }, + }, + }, + check: function (card) { + return 7 - get.value(card); + }, + ai: { + order: function () { + return get.order({ name: "sha" }) - 0.2; + }, + result: { + target: function (player, target) { + return get.effect(target, { name: "sha" }, player, player); + }, + }, + }, + }, + twzhuchen: { + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h", lib.skill.twzhuchen.filterCard) > 0; + }, + filterCard: function (card, player) { + var name = get.name(card, player); + return name == "tao" || name == "jiu"; + }, + filterTarget: lib.filter.notMe, + content: function () { + player.addTempSkill("twqijia_alka"); + player.storage.twzhuchen.add(target); + player.markSkill("twzhuchen"); + }, + intro: { + content: function (content, player) { + return "至" + get.translation(content) + "的距离视为1"; + }, + }, + }, + twxiaolian: { + audio: 2, + trigger: { global: "useCardToTarget" }, + logTarget: "target", + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.player != player && event.targets.length == 1 && event.targets[0] != player; + }, + check: function (event, player) { + return get.effect(event.targets[0], event.card, event.player, player) <= get.effect(player, event.card, event.player, player); + }, + content: function () { + trigger.getParent().twxiaolian = trigger.targets[0]; + trigger.targets.length = 0; + trigger.getParent().triggeredTargets2.length = 0; + trigger.targets.push(player); + }, + group: "twxiaolian_damage", + subSkill: { + distance: { + sub: true, + charlotte: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + mark: true, + marktext: "马", + intro: { + content: "cards", + onunmark: "throw", + }, + mod: { + globalTo: function (from, to, distance) { + if (from != to && to.storage.twxiaolian_distance) return distance + to.storage.twxiaolian_distance.length; + }, + }, + }, + damage: { + sub: true, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return event.getParent(2).twxiaolian != undefined; + }, + content: function () { + "step 0"; + var target = trigger.getParent(2).twxiaolian; + event.target = target; + player.chooseCard("是否将一张牌当做【马】置于" + get.translation(target) + "的武将牌旁?", "he").ai = function (card) { + if (get.attitude(_status.event.player, _status.event.getParent("twxiaolian_damage").target) > 2) return 7 - get.value(card); + return 0; + }; + "step 1"; + if (result.bool) { + player.logSkill("twxiaolian", target); + player.lose(result.cards, ui.special, "toStorage"); + target.addSkill("twxiaolian_distance"); + target.storage.twxiaolian_distance.addArray(result.cards); + target.markSkill("twxiaolian_distance"); + } + }, + }, + }, + }, + twtijin: { + audio: 2, + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.player != player && event.target != player && event.targets.length == 1 && event.player.inRange(player); + }, + logTarget: "target", + check: function (event, player) { + return get.effect(event.targets[0], event.card, event.player, player) <= get.effect(player, event.card, event.player, player); + }, + content: function () { + "step 0"; + trigger.targets.length = 0; + trigger.getParent().triggeredTargets1.length = 0; + trigger.targets.push(player); + var next = game.createEvent("twtijin_discard", null, trigger.getParent(2)); + next.player = player; + next.target = trigger.player; + next.setContent(function () { + if (target.isDead() || !target.countCards("he")) return; + player.line(target, "green"); + player.discardPlayerCard(target, true, "he"); + }); + }, + }, + twyanqin: { + audio: 2, + trigger: { player: "phaseBegin" }, + direct: true, + content: function () { + "step 0"; + var list = []; + if (player.group != "wei") list.push("wei2"); + if (player.group != "shu") list.push("shu2"); + list.push("cancel2"); + player + .chooseControl(list) + .set("ai", function () { + return list.randomGet(); + }) + .set("prompt", get.prompt2("twyanqin")); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("twyanqin"); + var group = result.control.slice(0, 3); + player.changeGroup(group); + } + }, + }, + twbaobian: { + audio: 2, + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + var card = event.card; + if (!card || (card.name != "sha" && card.name != "juedou")) return false; + return event.player.group == player.group || event.player.countCards("h") > event.player.hp; + }, + check: function (event, player) { + var att = get.attitude(player, event.player); + if (event.player.group == player.group) return att > 0; + return att < 0; + }, + logTarget: "player", + content: function () { + var target = trigger.player; + if (target.group == player.group) { + trigger.cancel(); + var num = target.maxHp - target.countCards("h"); + if (num) target.draw(num); + } else { + player.discardPlayerCard(target, "h", true, target.countCards("h") - target.hp); + } + }, + }, + chijie: { + audio: true, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + direct: true, + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + game.hasPlayer(function (current) { + return current.group != player.group && lib.group.includes(current.group); + }) + ); + }, + content: function () { + "step 0"; + var list = lib.group.filter(function (group) { + return ( + group != player.group && + game.hasPlayer(function (current) { + return current.group == group; + }) + ); + }); + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("chijie")) + .set("prompt2", "将自己的势力变更为场上存在的一个势力") + .set("ai", function () { + return list.randomGet(); + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("chijie"); + player.changeGroup(result.control); + } + }, + }, + waishi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + let used = player.getStat("skill").waishi; + if (used && used > player.countMark("waishi_remover")) return false; + return player.countCards("he") > 0 && game.hasPlayer(target => target != player && target.countCards("h") > 0); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") >= ui.selected.cards.length; + }, + filterCard: true, + position: "he", + check: function (card) { + if ( + !game.hasPlayer(function (current) { + return current != _status.event.player && current.countCards("h") > ui.selected.cards.length; + }) + ) + return 0; + return 6 - get.value(card); + }, + selectCard: function () { + if (!ui.selected.targets.length) return [1, game.countGroup()]; + return [1, Math.min(ui.selected.targets[0].countCards("h"), game.countGroup())]; + }, + discard: false, + lose: false, + delay: 0, + content: function () { + "step 0"; + player.choosePlayerCard(target, true, "h", cards.length); + "step 1"; + player.swapHandcards(target, cards, result.cards); + game.delayex(); + "step 2"; + if (target.countCards("h") > player.countCards("h") || player.group == target.group) player.draw(); + }, + ai: { + order: 7, + result: { + player: function (player, target) { + if (player.countCards("h") < target.countCards("h") || player.group == target.group) return 1; + return 0.1; + }, + }, + }, + subSkill: { + remover: { + charlotte: true, + onremove: function (player) { + player.clearMark("waishi_remover", false); + }, + intro: { + content: "〖外使〗的发动次数+#", + }, + }, + }, + }, + renshe: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + var choiceList = ["将势力变更为场上现存的一个其他势力", "令〖外使〗的发动次数+1直到下个出牌阶段结束", "与另一名其他角色各摸一张牌"]; + var controls = ["选项二"]; + if ( + game.hasPlayer(current => { + return current.group != player.group && lib.group.includes(current.group); + }) + ) + controls.unshift("选项一"); + if (game.hasPlayer(current => current != player)) controls.push("选项三"); + player + .chooseControl(controls, "cancel2") + .set("prompt", get.prompt("renshe")) + .set("choiceList", choiceList) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 || current.hasSkillTag("nogain"); + }) + ) + return "选项三"; + return "选项二"; + }); + "step 1"; + if (result.control == "cancel2") event.finish(); + else { + player.logSkill("renshe"); + switch (result.control) { + case "选项一": + event.goto(3); + break; + case "选项二": + player.addMark("waishi_remover", 1, false); + player.addTempSkill("waishi_remover", { player: "phaseUseAfter" }); + event.finish(); + break; + case "选项三": + player.chooseTarget("请选择一名角色,与其各摸一张牌", lib.filter.notMe, true).set("ai", function (target) { + if (target.hasSkillTag("nogain")) return 0.1; + return get.attitude(_status.event.player, target); + }); + } + } + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.asyncDraw([player, target].sortBySeat()); + } + game.delayex(); + event.finish(); + "step 3"; + var list = lib.group.filter(function (group) { + return ( + group != player.group && + game.hasPlayer(function (current) { + return current.group == group; + }) + ); + }); + player + .chooseControl(list) + .set("prompt", get.prompt("chijie")) + .set("prompt2", "将自己的势力变更为场上存在的一个势力") + .set("ai", function () { + return list.randomGet(); + }); + "step 4"; + player.changeGroup(result.control); + }, + }, + //英文版特典武将凯撒 + zhengfu: { + trigger: { + player: "useCardToPlayered", + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + filter: function (event, player) { + return event.card.name == "sha"; + }, + logTarget: "target", + line: false, + content: function () { + "step 0"; + player.line(trigger.target, { color: [220, 90, 139] }); + player + .chooseControl(["basic", "trick", "equip"]) + .set("ai", function () { + var player = _status.event.target; + if (!player.countCards("h", "sha") && player.countCards("h", "shan")) return "trick"; + return "basic"; + }) + .set("prompt", "请选择一种牌的类别") + .set("target", trigger.target); + "step 1"; + trigger.target + .chooseCard("he", "交给" + get.translation(player) + "一张" + get.translation(result.control) + "牌,否则此【杀】不可被闪避", function (card) { + return get.type2(card) == _status.event.control; + }) + .set("ai", function (card) { + var num = _status.event.num; + if (num == 0) return 0; + if (card.name == "shan") return num > 1 ? 2 : 0; + return 8 - get.value(card); + }) + .set("num", trigger.target.countCards("h", "shan")) + .set("control", result.control); + "step 2"; + if (result.bool) { + var cards = result.cards; + trigger.target.give(cards, player); + } else { + trigger.getParent().directHit.add(trigger.target); + game.delay(); + } + }, + }, +}; + +export default skills; diff --git a/character/tw/sort.js b/character/tw/sort.js new file mode 100644 index 000000000..d09ed771b --- /dev/null +++ b/character/tw/sort.js @@ -0,0 +1,31 @@ +const characterSort = { + tw_sp: ["tw_yanliang", "tw_wenchou", "tw_yuantan", "tw_zhangzhao", "tw_zhanghong", "tw_fuwan", "tw_yujin", "tw_zhaoxiang", "tw_hucheer", "tw_hejin", "tw_mayunlu", "tw_re_caohong", "tw_zangba", "tw_liuhong", "tw_tianyu", "jiachong", "duosidawang", "wuban", "yuejiu", "tw_caocao", "tw_zhangmancheng", "tw_caozhao", "tw_wangchang", "tw_puyangxing", "tw_jiangji", "tw_niujin", "tw_xiahouen", "tw_xiahoushang", "tw_zhangji", "tw_zhangnan", "tw_fengxí", "tw_furong", "tw_liwei", "tw_yangyi", "tw_daxiaoqiao", "tw_dengzhi", "tw_baoxin", "tw_bingyuan", "tw_fanchou", "tw_haomeng", "tw_huchuquan", "tw_jianshuo", "tw_jiling", "tw_liufuren", "tw_liuzhang", "tw_mateng", "tw_niufudongxie", "tw_qiaorui", "tw_weixu", "tw_yanxiang", "tw_yufuluo", "tw_zhangning", "tw_dengzhi", "tw_yangyi", "tw_yangang", "tw_gongsunfan"], + tw_yunchouzhi: ["tw_wangcan", "tw_dongzhao", "tw_bianfuren", "tw_feiyi", "tw_chenzhen", "tw_xunchen"], + tw_yunchouxin: ["tw_wangling", "tw_huojun", "tw_wujing", "tw_zhouchu"], + tw_yunchouren: ["tw_xujing", "tw_qiaogong"], + tw_yunchouyong: ["tw_zongyu", "tw_chendong", "tw_sunyi"], + tw_yunchouyan: ["tw_jiangqing"], + tw_zhu: ["tw_beimihu", "tw_ol_sunjian", "ol_liuyu", "tw_menghuo"], + tw_swordsman: ["xia_yuzhenzi", "xia_shie", "xia_shitao", "xia_guanyu", "xia_liubei", "xia_xiahousone", "xia_xiahoudun", "xia_zhangwei", "xia_xushu", "xia_wangyue", "xia_liyàn", "xia_tongyuan", "xia_lusu", "xia_dianwei", "xia_zhaoe", "xia_xiahouzie"], + tw_mobile: ["nashime", "tw_gexuan", "tw_zhugeguo"], + tw_mobile2: ["tw_chengpu", "tw_guohuai", "old_quancong", "tw_caoxiu", "tw_guanqiujian", "tw_re_fazheng", "tw_madai", "tw_zhangfei", "tw_guyong", "tw_handang", "tw_xuezong", "tw_yl_luzhi"], + tw_yijiang: ["tw_caoang", "tw_caohong", "tw_zumao", "tw_dingfeng", "tw_maliang", "tw_xiahouba"], + tw_english: ["kaisa"], +}; + +const characterSortTranslate = { + tw_mobile: "海外服·稀有专属", + tw_yunchouzhi: "运筹帷幄·智", + tw_yunchouxin: "运筹帷幄·信", + tw_yunchouren: "运筹帷幄·仁", + tw_yunchouyong: "运筹帷幄·勇", + tw_yunchouyan: "运筹帷幄·严", + tw_zhu: "海外服·主公", + tw_sp: "海外服·SP", + tw_swordsman: "海外服·武侠篇", + tw_mobile2: "海外服·异构", + tw_yijiang: "一将成名TW", + tw_english: "英文版", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/tw/translate.js b/character/tw/translate.js new file mode 100644 index 000000000..4cf79bb6f --- /dev/null +++ b/character/tw/translate.js @@ -0,0 +1,691 @@ +const translates = { + tw_beimihu: "TW卑弥呼", + tw_beimihu_prefix: "TW", + nashime: "难升米", + tw_xiahouba: "TW夏侯霸", + tw_xiahouba_prefix: "TW", + tw_zumao: "TW祖茂", + tw_zumao_prefix: "TW", + tw_caoang: "TW曹昂", + tw_caoang_prefix: "TW", + tw_dingfeng: "TW丁奉", + tw_dingfeng_prefix: "TW", + tw_caohong: "TW将曹洪", + tw_caohong_prefix: "TW将", + tw_maliang: "TW马良", + tw_maliang_prefix: "TW", + + twyanqin: "姻亲", + twyanqin_info: "准备阶段,你可以将势力变更为魏或蜀。", + twbaobian: "豹变", + twbaobian_info: "当你使用【杀】或【决斗】造成伤害时,若目标角色的势力与你相同,则你可以防止此伤害,然后其将手牌数补充至与体力值相同。若不同且其手牌数大于体力值,则你可以将其手牌弃置至与其体力值相同。", + twtijin: "替巾", + twtijin_info: "当你攻击范围内的一名其他角色使用【杀】指定另一名其他角色为目标时,你可以将此【杀】的目标改为你。若如此做,此【杀】结算完成后,你弃置该角色的一张牌。", + twxiaolian: "孝廉", + twxiaolian_info: "当一名其他角色使用【杀】指定另一名其他角色为目标时,你可以将此【杀】的目标改为你。若如此做,当你受到此【杀】的伤害后,你可以将一张牌置于此【杀】原目标的武将牌旁,称为“马”,且令其获得如下效果:其他角色计算至其的距离+X(X为其武将牌旁的“马”数)。", + twqijia: "弃甲", + twqijia_info: "出牌阶段,你可以弃置一张装备区内的牌(每种类型的装备牌限一次),然后视为对攻击范围内的一名其他角色使用了一张【杀】。", + twzhuchen: "诛綝", + twzhuchen_info: "出牌阶段,你可以弃置一张【桃】或【酒】并选择一名其他角色。你与其的距离视为1直到此阶段结束。", + twhuzhu: "护主", + twhuzhu_info: "出牌阶段限一次,若你的装备区内有牌,则你可以令一名其他角色交给你一张手牌,然后获得你装备区内的一张牌。若其体力值不大于你,则你可以令其回复1点体力。", + twliancai: "敛财", + twliancai_info: "结束阶段,你可以将武将牌翻面,然后获得一名其他角色装备区内的一张牌。当你的武将牌翻面时,你可以将手牌补至与体力值相同。", + twrangyi: "攘夷", + twrangyi2: "攘夷", + twrangyi_info: "出牌阶段限一次,你可以将所有手牌交给一名其他角色,然后令其选择一项:1.使用其中的一张牌,并于此牌被使用时将其余的牌交还给你。2.受到来自你的1点伤害。", + twbaimei: "白眉", + twbaimei_info: "锁定技,若你没有手牌,则防止你受到的所有属性伤害和锦囊牌造成的伤害。", + chijie: "持节", + chijie_info: "游戏开始时,你可以选择一个现存势力,你的势力视为该势力。", + waishi: "外使", + waishi_info: "出牌阶段限一次,你可以用至多X张牌交换一名其他角色等量的手牌(X为现存势力数),然后若其与你势力相同或手牌多于你,你摸一张牌。", + renshe: "忍涉", + renshe_info: "当你受到伤害后,你可以选择一项:将势力改为现存的另一个势力;或可以额外发动一次“外使”直到你的下个出牌阶段结束;或与另一名其他角色各摸一张牌。", + tw_gexuan: "TW葛玄", + tw_gexuan_prefix: "TW", + twdanfa: "丹法", + twdanfa_info: "准备阶段或结束阶段开始时,你可将一张牌置于武将牌上,称为“丹”。每回合每种花色限一次,当你使用牌时,若“丹”中有与此牌花色相同的牌,则你摸一张牌。", + twlingbao: "灵宝", + twlingbao_info: "出牌阶段限一次,你可以将两张花色不同的“丹”置入弃牌堆。若这两张牌:均为红色,你令一名其他角色回复1点体力;均为黑色,你弃置一名其他角色区域内至多两张区域不同牌;颜色不同,则你令一名角色摸一张牌,并令另一名角色弃置一张牌。", + twsidao: "司道", + twsidao_info: "游戏开始时,你选择一张“法宝”置入装备区。准备阶段,若你以此法选择的法宝在牌堆/弃牌堆中,则你使用之。", + gx_lingbaoxianhu: "灵宝仙壶", + gx_lingbaoxianhu_info: "锁定技,当你造成点数大于1的伤害后,或有角色死亡后,你加1点体力上限并回复1点体力。", + gx_taijifuchen: "太极拂尘", + gx_taijifuchen_info: "锁定技,当你使用【杀】指定目标后,你令目标角色选择一项:①弃置一张牌,若此牌和【杀】花色相同,则你获得之。②其不可响应此【杀】。", + gx_chongyingshenfu: "冲应神符", + gx_chongyingshenfu_info: "锁定技。①当你受到牌造成的伤害后,你记录此牌的名称。②当你受到〖冲应神符①〗记录过的牌造成的伤害时,你令此牌伤害-1。", + tw_dongzhao: "TW董昭", + tw_dongzhao_prefix: "TW", + twmiaolve: "妙略", + twmiaolve_info: "游戏开始时,你获得两张【瞒天过海】。当你受到1点伤害后,你可选择:①获得一张【瞒天过海】并摸一张牌。②获得一张智囊。", + twyingjia: "迎驾", + twyingjia_info: "一名角色的回合结束时,若你本回合内使用过两张或更多的同名锦囊牌,则你可弃置一张手牌并令一名角色进行一个额外回合。", + dz_mantianguohai: "瞒天过海", + dz_mantianguohai_info: "此牌不计入拥有者的手牌上限。出牌阶段,对一至两名区域内有牌的其他角色使用。你获得目标角色一张牌,然后依次交给每名目标角色各一张牌。", + jiachong: "TW贾充", + jiachong_prefix: "TW", + beini: "悖逆", + beini_info: "出牌阶段限一次,你可以选择一名体力值不小于你的角色,令你或其摸两张牌,然后未摸牌的角色视为对摸牌的角色使用一张【杀】。", + dingfa: "定法", + dingfa_info: "弃牌阶段结束时,若本回合你失去的牌数不小于你的体力值,你可以选择一项:1、回复1点体力;2、对一名其他角色造成1点伤害。", + duosidawang: "朵思大王", + equan: "恶泉", + equan_info: "锁定技。①当有角色于你的回合内受到伤害后,其获得X枚“毒”(X为伤害值)。②准备阶段,你令所有拥有“毒”标记的角色移去所有“毒”标记并失去等量的体力。③当有角色因〖恶泉②〗进入濒死状态时,你令其所有技能失效直到回合结束。", + manji: "蛮汲", + manji_info: "锁定技。其他角色失去体力后,若你的体力值:不大于该角色,你回复1点体力;不小于该角色,你摸一张牌。", + wuban: "TW吴班", + wuban_prefix: "TW", + jintao: "进讨", + jintao_info: "锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】伤害+1,第二张【杀】不可被响应。", + yuejiu: "TW乐就", + yuejiu_prefix: "TW", + cuijin: "催进", + cuijin_info: "当你或你攻击范围内的角色使用【杀】时,你可以弃置一张牌并获得如下效果:此【杀】的伤害值基数+1,且当此【杀】结算结束后,若未造成过伤害,则你对使用者造成1点伤害。", + tw_zhaoxiang: "TW赵襄", + tw_zhaoxiang_prefix: "TW", + twfuhan: "扶汉", + twfuhan_info: '限定技。准备阶段开始时时,你可以移去所有"梅影"标记,然后从五张未登场的蜀势力武将牌中选择一名获得其所有技能,将体力上限数调整为以此技能移去所有“梅影”标记的数量(最少为2,最多为8)并回复1点体力,然后从牌堆/弃牌堆/场上获得【梅影枪】。', + twqueshi: "鹊拾", + twqueshi_info: "游戏开始时,你将【梅影枪】置于你的装备区。", + meiyingqiang: "梅影枪", + meiyingqiang_info: "当你于其他角色的回合内第一次失去牌时,你可以使用一张【杀】。", + tw_fuwan: "TW伏完", + tw_fuwan_prefix: "TW", + twmoukui: "谋溃", + twmoukui_info: "当你使用【杀】指定目标后,你可以选择一项:①摸一张牌;②弃置该角色的一张牌;③背水:若此【杀】未因造成伤害而令该角色进入过濒死状态,则该角色弃置你的一张牌。", + tw_yujin: "SP于禁", + tw_yujin_prefix: "SP", + xinzhenjun: "镇军", + xinzhenjun_info: "出牌阶段开始时,你可以将一张牌交给一名其他角色,令其选择是否使用一张不为黑色的【杀】。若其选择是,则你于此【杀】结算完成后摸1+X张牌(X为此【杀】造成的伤害总点数)。若其选择否,则你对其或其攻击范围内的一名其他角色造成1点伤害。", + tw_hucheer: "TW胡车儿", + tw_hucheer_prefix: "TW", + twshenxing: "神行", + twshenxing_info: "锁定技。若你的装备区内没有坐骑牌,则你至其他角色的距离-1且手牌上限+1。", + twdaoji: "盗戟", + twdaoji_info: "出牌阶段限一次,你可以弃置一张非基本牌并选择一名攻击范围内的角色,获得其一张牌。若你以此法得到的牌为:基本牌,你摸一张牌;装备牌,你使用此牌并对其造成1点伤害。", + tw_hejin: "TW何进", + tw_hejin_prefix: "TW", + twmouzhu: "谋诛", + twmouzhu_info: "出牌阶段限一次,你可以选择一名其他角色A。你令除A外所有体力值小于等于你的其他角色依次选择是否交给你一张牌。若你以此法得到的牌数X:等于0,你和所有进行选择的角色依次失去1点体力。大于0,你令A选择由你视为对其使用一张伤害值基数为X的【杀】或【决斗】。", + twyanhuo: "延祸", + twyanhuo_info: "当你死亡时,你可以选择一项:①令一名其他角色弃置X张牌。②令X名其他角色依次弃置一张牌。(X为你的牌数)", + tw_mayunlu: "TW马云禄", + tw_mayunlu_prefix: "TW", + twfengpo: "凤魄", + twfengpo_info: "①当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的♦数)。②当你杀死一名角色后,你将〖凤魄①〗中的“♦数”改为“红色牌数”。", + tw_re_caohong: "TW曹洪", + tw_re_caohong_prefix: "TW", + twyuanhu: "援护", + twyuanhu_info: "出牌阶段限一次。你可将一张装备牌置入一名角色的装备区内。若此牌为:武器牌,你弃置与其距离为1的另一名角色区域的一张牌;防具牌,其摸一张牌;坐骑牌或宝物牌,其回复1点体力。然后若其体力值或手牌数不大于你,则你摸一张牌,且你可以于本回合的结束阶段发动一次〖援护〗。", + twjuezhu: "决助", + twjuezhu_info: "限定技。准备阶段,你可废除一个坐骑栏,令一名角色获得〖飞影〗并废除判定区。该角色死亡后,你恢复以此法废除的装备栏。", + tw_zangba: "TW臧霸", + tw_zangba_prefix: "TW", + twhanyu: "捍御", + twhanyu_info: "锁定技。游戏开始时,你获得牌堆中的基本牌,锦囊牌,装备牌各一张。", + twhengjiang: "横江", + twhengjiang_info: "出牌阶段限一次,当你使用基本牌或普通锦囊牌指定唯一目标后,你可将此牌的目标改为攻击范围内的所有合法目标,然后你于此牌结算结束后摸X张牌(X为因响应此牌而使用或打出过牌的角色数)。", + tw_huojun: "TW霍峻", + tw_huojun_prefix: "TW", + twsidai: "伺怠", + twsidai_info: "限定技。出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用(无距离和次数限制)。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限;包含【酒】,则当目标角色受到此牌的伤害时,此伤害×2。", + twjieyu: "竭御", + twjieyu_info: "每轮限一次。结束阶段开始时,或当你于一轮内第一次受到伤害后,你可以弃置所有手牌,然后从弃牌堆中获得不同牌名的基本牌各一张。", + tw_liuhong: "TW刘宏", + tw_liuhong_prefix: "TW", + twyujue: "鬻爵", + twyujue_give: "鬻爵", + twyujue_info: "①其他角色的出牌阶段内,可以交给你任意张牌(每阶段上限为两张)。②当你于回合外获得其他角色的一张牌后,你可令其选择本回合内未选择过的一项:⒈弃置攻击范围内一名角色的一张牌。⒉下一次使用牌时,从牌堆中获得一张同类别的牌。", + twgezhi: "革制", + twgezhi_info: "①当你于出牌阶段内首次使用某种类别的牌时,你可以重铸一张手牌。②出牌阶段结束时,若你本阶段内因〖革制①〗失去过至少两张牌,则你可以令一名角色选择获得一个其未获得过的效果:⒈攻击范围+2;⒉手牌上限+2;⒊加1点体力上限。", + twfengqi: "烽起", + twfengqi_info: "主公技,锁定技。①其他群势力角色发动〖鬻爵①〗时,将每阶段上限改为四张。②以其他角色为目标的〖革制②〗结算结束后,目标角色可以获得其武将牌上的主公技。", + tw_caocao: "TW曹操", + tw_caocao_prefix: "TW", + twlingfa: "令法", + twlingfa_info: "①第一轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。②第二轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。③第三轮游戏开始时,你失去〖令法〗并获得〖治暗〗。", + twzhian: "治暗", + twzhian_info: "每回合限一次。一名角色使用装备牌或延时锦囊牌后,你可选择:⒈弃置位于场上的此牌。⒉弃置一张手牌并获得位于场上的此牌。⒊对其造成1点伤害。", + tw_zhangmancheng: "TW张曼成", + tw_zhangmancheng_prefix: "TW", + twfengji: "蜂集", + twfengji_info: "出牌阶段开始时,若你没有“示”,则你可以将一张牌作为“示”置于武将牌上并施法:从牌堆中获得X张与“示”牌名相同的牌,然后移去“示”。", + twyiju: "蚁聚", + twyiju_info: "若你的武将牌上有“示”,则:①你使用【杀】的次数上限和攻击范围的基数改为你的体力值。②当你受到伤害时,你移去“示”,且令此伤害+1。", + twbudao: "布道", + twbudao_info: "限定技。准备阶段,你可减1点体力上限,回复1点体力并选择获得一个〖布道〗技能池里的技能(三选一)。然后你可以令一名其他角色也获得此技能并交给你一张牌。", + twzhouhu: "咒护", + twzhouhu_info: "出牌阶段限一次。你可以弃置一张红色手牌并施法:回复X点体力。", + twharvestinori: "丰祈", + twharvestinori_info: "出牌阶段限一次。你可以弃置一张黑色手牌并施法:摸2X张牌。", + twzuhuo: "阻祸", + twzuhuo_info: "出牌阶段限一次。你可以弃置一张非基本牌并施法:防止你受到的下X次伤害。", + twzhouzu: "咒诅", + twzhouzu_info: "出牌阶段限一次。你可以对一名其他角色施法:其弃置X张牌,然后你对其造成1点雷电伤害。", + twhuangjin: "黄巾", + twhuangjin_info: "锁定技。当你一名角色使用【杀】指定你为目标时,若此【杀】有点数,你判定,若点数与此【杀】点数差值不大于1,则此【杀】对你无效。", + twguimen: "鬼门", + twguimen_info: "锁定技。当你弃置牌时,若其中有♠牌,你为每一张♠牌判定,若此牌点数与结果之差不大于1,你对一名其他角色造成2点雷电伤害。", + twdidao: "地道", + twdidao_info: "一名角色的判定牌生效前,你可以打出一张牌作为判定牌并获得原判定牌。若你以此法打出的牌与原判定牌颜色相同,你摸一张牌。", + tw_chengpu: "TW程普", + tw_chengpu_prefix: "TW", + twlihuo: "疠火", + twlihuo2: "疠火", + twlihuo3: "疠火", + twlihuo_info: "①当你声明使用普【杀】后,你可以将此【杀】改为火【杀】。此牌使用结算结束后,若有角色因此【杀】造成的伤害进入过濒死状态,则你失去1点体力。②当你使用火【杀】选择目标后,你可为此牌增加一个目标。", + twchunlao: "醇醪", + twchunlao_info: "①准备阶段,若场上没有“醇”,则你可将一名角色区域内的一张牌置于其武将牌上,称为“醇”。②一名角色使用【杀】时,若其有“醇”,则其可以交给你一张牌,令此【杀】的伤害值基数+1。③一名角色进入濒死状态时,若其有“醇”,则你可以移去“醇”并摸一张牌,然后令其回复1点体力。", + tw_guohuai: "TW郭淮", + tw_guohuai_prefix: "TW", + twjingce: "精策", + twjingce_info: "当你于出牌阶段使用第X张牌结算完毕后,你可以摸两张牌(X为你的体力值)。若此阶段你此前已摸过牌或本回合造成过伤害,你获得一枚“策”标记。", + yuzhang: "御嶂", + yuzhang_info: "你可以弃置一枚“策”标记,然后跳过一个阶段。当你受到伤害后,你可弃置一枚“策”标记,然后选择一项:⒈令伤害来源弃置两张牌;⒉令伤害来源本回合不能再使用或打出牌。", + tw_caozhao: "曹肇", + twfuzuan: "复纂", + twfuzuan_info: "出牌阶段限一次/当你受到伤害后/当你对其他角色造成伤害后,你可选择一名拥有转换技的角色,变更其的一个转换技的的状态。", + twchongqi: "宠齐", + twchongqi_info: "锁定技。游戏开始时,你令所有角色获得〖非服〗。然后你可减1点体力上限,令一名其他角色获得〖复纂〗。", + twfeifu: "非服", + twfeifu_info: "锁定技,转换技。阴:当你成为【杀】的唯一目标后;阳:当你使用【杀】指定唯一目标后;目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。", + tw_wangchang: "TW王昶", + tw_wangchang_prefix: "TW", + twkaiji: "开济", + twkaiji_info: "准备阶段,你可令至多X名角色各摸一张牌(X为本局游戏内进入过濒死状态的角色数+1)。若有角色以此法获得了非基本牌,则你摸一张牌。", + twshepan: "慑叛", + twshepan_info: "每回合限一次。当你成为其他角色使用牌的目标后,你可选择一项:⒈摸一张牌。⒉将其区域内的一张牌置于牌堆顶。然后若你的手牌数与其相等,则你将此技能的发动次数归零,且可以令此牌对你无效。", + tw_wangcan: "TW王粲", + tw_wangcan_prefix: "TW", + twdianyi: "典仪", + twdianyi_info: "锁定技。你的回合结束时,若你本回合内:造成过伤害,你弃置所有手牌;未造成过伤害,你将手牌数调整至四张。", + twyingji: "应机", + twyingji_wuxie: "应机", + twyingji_info: "当你于回合外需要使用或打出一张基本牌或普通锦囊牌时,若你没有手牌,则你可摸一张牌,然后视为使用或打出此牌。", + twshanghe: "觞贺", + twshanghe_info: "限定技。当你进入濒死状态时,你可令所有其他角色依次交给你一张牌;若这些牌中没有【酒】,则你将体力回复至1点。", + tw_wujing: "TW吴景", + tw_wujing_prefix: "TW", + twfenghan: "锋捍", + twfenghan_info: "每回合限一次。当你使用【杀】或伤害类锦囊牌指定第一个目标后,你可令至多X名角色各摸一张牌(X为此牌的目标数)。", + twcongji: "从击", + twcongji_info: "当你的红色牌于回合外因弃置而进入弃牌堆后,你可令一名其他角色获得这些牌。", + old_quancong: "TW全琮", + old_quancong_prefix: "TW", + zhenshan: "振赡", + zhenshan_info: "每回合限一次,当你需要使用或打出一张基本牌时,你可以与一名手牌数少于你的角色交换手牌,视为使用或打出此牌。", + tw_tianyu: "TW田豫", + tw_tianyu_prefix: "TW", + gz_tw_tianyu: "田豫", + twzhenxi: "震袭", + twzhenxi_info: "每回合限一次。当你使用【杀】指定目标后,你可选择一项:⒈弃置其X张手牌(X为你至其的距离);⒉将其装备区或判定区内的一张牌移动到另一名角色的装备区或判定区内。若其体力值大于你或其体力值为全场最高,则你可以改为依次执行以上两项。", + twyangshi: "扬师", + twyangshi_info: "锁定技。当你受到伤害后,若场上有不在你攻击范围内的其他角色,则你令攻击范围+1;若没有,则你从牌堆中获得一张【杀】。", + tw_puyangxing: "濮阳兴", + twzhengjian: "征建", + twzhengjian_info: "游戏开始时,你可选择获得一项效果:⒈其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果二。⒉其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果一。", + twzhongchi: "众斥", + twzhongchi_info: "锁定技,限定技。当你因〖征建〗而得到牌后,若已经有至少X名角色因〖征建〗而交给你过牌(X为游戏人数的一半且向上取整),则你回复2点体力,且于本局游戏内受到渠道为【杀】的伤害+1,且你将〖征建〗中的“其须交给你一张牌”改为“你可对其造成1点伤害”。", + tw_bingyuan: "邴原", + twbingde: "秉德", + twbingde_info: "出牌阶段限一次。你可以选择一个本阶段未选择过的花色并弃置一张牌,你摸等同于本阶段你使用此花色的牌数,然后若你以此法弃置的牌的花色与你选择的花色相同,你令你〖秉德〗于此阶段发动的次数上限+1。", + twqingtao: "清滔", + twqingtao_info: "①摸牌阶段结束时,你可以重铸一张牌。若此牌为【酒】或非基本牌,你摸一张牌。②结束阶段,若你本回合未发动〖清滔①〗,你可以发动〖清滔①〗。", + tw_jiangji: "TW蒋济", + tw_jiangji_prefix: "TW", + twjichou: "急筹", + twjichou_info: "①每回合限一次。你可以视为使用一张未被〖急筹①〗记录过的普通锦囊牌并记录此牌。②你无法响应或{使用对应实体牌包含你的手牌的}〖急筹①〗记录过的锦囊牌。③出牌阶段限一次。你可将手牌中任意张〖急筹①〗记录过的锦囊牌交给其他角色。", + twjilun: "机论", + twjilun_info: "当你受到伤害后,你可以摸X张牌(X为〖急筹①〗记录数且至少为1,至多为5),或视为使用一张〖急筹①〗记录过且未被〖机论〗记录过的普通锦囊牌并记录此牌。", + tw_niufudongxie: "牛辅董翓", + baonvezhi_faq: "关于暴虐值", + baonvezhi_faq_info: "
  • 当你造成或受到伤害后,你获得等量的暴虐值;
  • 暴虐值的上限为5。", + twjuntun: "军屯", + twjuntun_info: "①游戏开始时或当其他角色死亡后,你可令一名角色获得〖凶军〗。②当其他角色造成伤害后,若其拥有〖凶军〗,你获得等同于此次伤害值的暴虐值。", + twxiongxi: "凶袭", + twxiongxi_info: "出牌阶段限一次。你可以弃置X张牌对一名其他角色造成1点伤害(X为你的暴虐值与暴虐值上限之差)。", + twxiafeng: "黠凤", + twxiafeng_info: "出牌阶段开始时,你可消耗至多3点暴虐值并获得如下效果直到回合结束:你使用的前X张牌没有距离和次数限制且不可被响应,你的手牌上限+X(X为你以此法消耗的暴虐值)。", + tw_bn_1: "一点", + tw_bn_2: "两点", + tw_bn_3: "三点", + tw_bn_1_bg: "一", + tw_bn_2_bg: "二", + tw_bn_3_bg: "三", + twxiongjun: "凶军", + twxiongjun_info: "锁定技,每回合限一次。当你造成伤害后,所有拥有〖凶军〗的角色摸一张牌。", + tw_jianshuo: "蹇硕", + twkunsi: "困兕", + twkunsi_info: "出牌阶段,你可以视为对一名未以此法选择过的其他角色使用一张【杀】。若此【杀】未造成伤害,其获得〖令戮〗直到你下回合开始,且当你成为其〖令戮〗的目标后,其可令你于〖令戮〗失败时进行两次结算。", + twlinglu: "令戮", + twlinglu_info: "强令:①任务:执行角色于其下回合结束前造成的伤害不小于2点。②成功:其摸两张牌。③失败:其失去1点体力。", + tw_mateng: "TW马腾", + tw_mateng_prefix: "TW", + twxiongzheng: "雄争", + twxiongzheng_info: "一轮游戏开始时,①若你上一轮发动过〖雄争〗且选择过“雄争”角色,你可以选择一项:1.视为对任意名上一轮内未对“雄争”角色造成过伤害的角色依次使用一张【杀】;2.令任意名上一轮对“雄争”角色造成过伤害的角色摸两张牌。②你可以选择一名未以此法选择过的角色,称为“雄争”角色。", + twluannian: "乱年", + twluannian_info: "主公技。其他群势力角色的出牌阶段限一次。其可以弃置X张牌并对“雄争”角色造成1点伤害(X为所有角色于本轮发动〖乱年〗的次数+1)。", + tw_baoxin: "TW鲍信", + tw_baoxin_prefix: "TW", + twmutao: "募讨", + twmutao_info: "出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】依次交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。", + twyimou: "毅谋", + twyimou_info: "当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色并摸两张牌;3.背水:将所有手牌交给其(若受伤角色为你则跳过此步骤),然后依次执行上述所有选项。", + tw_liufuren: "刘夫人", + twzhuidu: "追妒", + twzhuidu_info: "出牌阶段限一次。你可以选择一名已受伤的其他角色并选择一项:1.对其造成1点伤害;2.弃置其装备区里的一张牌;3.背水:若该角色为女性,弃置一张牌,然后依次执行上述所有选项。", + twshigong: "示恭", + twshigong_info: "限定技。当你于回合外进入濒死状态时,你可以令当前回合角色选择一项:1.加1点体力上限并回复1点体力,摸一张牌,然后令你将体力回复至体力上限;2.弃置X张手牌,然后令你将体力回复至1点(X为其体力值)。", + tw_wangling: "TW王淩", + tw_wangling_prefix: "TW", + twmibei: "秘备", + twmibei_info: "使命技。①使命:使用每种类型且牌名不同的牌各两张。②成功:当你使用牌后,若你于本次事件完成了〖秘备①〗的使命,你获得〖谋立〗。③失败:出牌阶段结束时,若你本回合未使用过牌,你本回合手牌上限-1并重置〖秘备〗。", + twxingqi: "星启", + twxingqi_info: "觉醒技。准备阶段,若场上的牌数大于你的体力值,你回复1点体力,然后若〖秘备〗:未完成,你从牌堆中获得每种类型的牌各一张;已完成,本局游戏你使用牌无距离限制。", + twmouli: "谋立", + twmouli_backup: "谋立", + twmouli_info: "每回合限一次。你可以使用牌堆中的一张基本牌。", + tw_zhugeguo: "TW诸葛果", + tw_zhugeguo_prefix: "TW", + twqirang: "祈禳", + twqirang_info: "当有装备牌进入你的装备区时,你可以从牌堆中获得一张锦囊牌,你本阶段使用此牌无距离限制且不可被响应,且当你使用此牌时,你可以为这张牌增加或减少一个目标。", + twyuhua: "羽化", + twyuhua_info: "锁定技。①你的非基本牌不计入手牌上限。②当你于回合外失去牌后,若其中有非基本牌,你可以卜算X,然后你可以摸X张牌(X为其中非基本牌数且至多为5)。", + tw_fanchou: "TW樊稠", + tw_fanchou_prefix: "TW", + twxingluan: "兴乱", + twxingluan_info: "结束阶段,你可以亮出牌堆顶的六张牌,然后你可以选择一种类型的牌并分配给任意角色(每名角色至多三张)。然后所有以此法得到过牌且得到的牌数不少于你的角色失去1点体力。", + tw_xujing: "TW许靖", + tw_xujing_prefix: "TW", + twboming: "博名", + twboming_info: "①出牌阶段限两次。你可以将一张牌交给一名其他角色。②结束阶段,若所有其他角色于此回合得到的牌数之和大于1,你摸两张牌。", + twejian: "恶荐", + twejian_info: "当其他角色得到你的牌后,若其有其他与此牌类型相同的牌,你可以令其选择一项:1.受到你造成的1点伤害;2.弃置这些牌。", + tw_zhangfei: "TW张飞", + tw_zhangfei_prefix: "TW", + twxuhe: "虚吓", + twxuhe_info: "当你使用的【杀】被【闪】抵消时,你可以令其选择一项:1.受到你造成的1点伤害;2.本回合你使用的下一张牌对其造成伤害时,此伤害+2。", + tw_xuezong: "TW薛综", + tw_xuezong_prefix: "TW", + twjiexun: "诫训", + twjiexun_info: "结束阶段,你可以选择一个花色并令一名其他角色摸等同于场上此花色牌数张牌,然后其弃置X张牌。若其以此法弃置了所有牌,你选择一项:1.摸X张牌,然后将X归零;2.修改〖复难〗和〖诫训〗(X为此前〖诫训〗的发动次数)。", + twfunanx: "复难·改", + twjiexunx: "诫训·改", + twfunanx_info: "当其他角色使用或打出牌响应你使用的牌时,你可获得其使用或打出的牌。", + twjiexunx_info: "结束阶段,你可选择一个花色并令一名其他角色摸等同于场上此花色牌数张牌,然后其弃置X张牌(X为此前〖诫训〗的发动次数)。", + tw_zhangning: "TW张宁", + tw_zhangning_prefix: "TW", + twxingzhui: "星坠", + twxingzhui_info: "出牌阶段限一次。你可以失去1点体力并施法:亮出牌堆顶2X张牌,若其中有黑色牌,则你可令一名其他角色获得这些黑色牌。若黑色牌的数量不小于X,则你对其造成X点雷电伤害。", + twjuchen: "聚尘", + twjuchen_info: "结束阶段,若你的手牌数和体力值均不为全场最多,则你可以令所有角色弃置一张牌,然后你获得其中的红色牌。", + tw_yufuluo: "于夫罗", + twjiekuang: "竭匡", + twjiekuang_info: "每回合限一次。当一名体力值小于你的角色成为其他角色使用基本牌或普通锦囊牌的唯一目标后,若没有角色处于濒死状态,你可以失去1点体力或减1点体力上限,将此牌的目标转移给你。然后此牌结算结束后,若此牌未造成伤害且此牌的使用者是你使用此牌名的牌的合法目标,你视为对此牌的使用者使用一张同名牌。", + twneirao: "内扰", + twneirao_info: "觉醒技。准备阶段,若你的体力值与体力上限之和不大于9,你失去〖竭匡〗,弃置所有牌并从牌堆或弃牌堆中获得等量的【杀】,然后获得〖乱掠〗。", + twluanlve: "乱掠", + twluanlve_info: "①出牌阶段,你可以将X张【杀】当做【顺手牵羊】对一名本阶段未成为过【顺手牵羊】的目标的角色使用(X为你以此法使用【顺手牵羊】的次数)。②当你使用牌时,若此牌为【顺手牵羊】,你令此牌不能被响应。", + tw_fengxí: "冯习", + twqingkou: "轻寇", + twqingkou_info: "准备阶段,你可以视为对一名其他角色使用一张【决斗】。然后此牌的伤害来源摸一张牌,若伤害来源包括你,你跳过本回合的判定阶段和弃牌阶段。", + tw_zhangji: "张既", + twdingzhen: "定镇", //丁真 + twdingzhen_info: "一轮游戏开始时,你可以选择任意名你至其距离不大于X的角色(X为你的体力值),这些角色选择一项:1.弃置一张【杀】;2.本轮其于回合内使用的第一张牌不能指定你为目标。", + twyouye: "攸业", + twyouye_info: "锁定技。①其他角色的结束阶段,若其本回合未对你造成过伤害且“蓄”数小于5,你将牌堆顶的牌置于武将牌上,称为“蓄”。②当你造成或受到伤害后,若你有“蓄”,你将所有“蓄”分配给任意角色(若当前回合角色存活,则你至少为当前回合角色分配一张)。", + tw_xunchen: "TW荀谌", + tw_xunchen_prefix: "TW", + twweipo: "危迫", + twweipo_info: "出牌阶段限一次。你可以令一名角色弃置一张牌,然后令其获得一张【兵临城下】或一张由你选择的智囊牌。", + twmouzhi: "谋识", + twmouzhi_info: "锁定技。当你受到伤害时,若伤害渠道对应的牌和你上次受到的伤害渠道对应的牌颜色相同,则你防止此伤害。", + tw_jiangqing: "TW蒋钦", + tw_jiangqing_prefix: "TW", + twshangyi: "尚义", + twshangyi_info: "出牌阶段限一次。你可以弃置一张牌并选择一名有手牌的其他角色,你令其观看你的手牌,然后你观看其手牌并选择一项:1.弃置其中一张牌;2.与其交换一张手牌。若你以此法弃置了其的黑色牌,或你与其交换的两张牌均为红色,你摸一张牌。", + twxiangyu: "翔羽", + twxiangyu_info: "锁定技。①你于回合内的攻击范围+X(X为本回合失去过牌的角色数且至多为5)。②当你使用【杀】指定目标后,若你至目标角色的距离小于你的攻击范围,你令此目标角色抵消此【杀】所需使用的【闪】数+1。", + twgyshenxing: "慎行", + twgyshenxing_info: "出牌阶段,你可以弃置X张牌,然后摸一张牌并获得1枚“慎”标记(X为你的“慎”数且至多为2)。", + tw_guyong: "TW顾雍", + tw_guyong_prefix: "TW", + twbingyi: "秉壹", + twbingyi_info: "结束阶段,你可以展示所有手牌,若这些牌的颜色均相同或类别均相同,你可以令至多Y名角色各摸一张牌(Y为你的手牌数)。若你以此法展示的牌数大于1且这些牌的颜色均相同且类别均相同,你移去所有“慎”。", + twyilie: "毅烈", + twyilie_info: "出牌阶段开始时,你可以选择一项:1.本阶段内使用【杀】的次数上限+1;2.本回合内使用【杀】指定处于连环状态的目标后,或使用【杀】被【闪】抵消时,摸一张牌;3.背水:失去1点体力,然后依次执行上述所有选项。", + tw_chendong: "TW陈武董袭", + tw_chendong_prefix: "TW", + twfenming: "奋命", + twfenming_info: "准备阶段,你可以选择一名其他角色并选择一项:1.令其弃置一张牌;2.令其横置;3.背水:横置,然后依次执行上述所有选项。", + tw_handang: "TW韩当", + tw_handang_prefix: "TW", + twgongji: "弓骑", + twgongji2: "弓骑", + twgongji_info: "①你的攻击范围无限。②出牌阶段限一次,你可以弃置一张牌,然后你使用与此牌花色相同的【杀】无任何次数限制直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。", + twjiefan: "解烦", + twjiefan_info: "限定技。出牌阶段,你可以选择一名角色,令攻击范围内含有其的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。然后当其第一次进入濒死状态后,你重置〖解烦〗。", + tw_jiling: "TW纪灵", + tw_jiling_prefix: "TW", + twshuangren: "双刃", + twshuangren_info: "①出牌阶段开始时,你可以与一名角色拼点。若你:赢,你可以视为对至多两名至其的距离不大于1的角色依次使用一张【杀】;没赢,其可以视为对你使用一张【杀】。②出牌阶段结束时,若你本回合未发动过〖双刃①〗且未造成过渠道为【杀】的伤害,你可以弃置一张牌发动〖双刃①〗。", + tw_re_fazheng: "TW法正", + tw_re_fazheng_prefix: "TW", + twxuanhuo: "眩惑", + twxuanhuo_info: "摸牌阶段结束时,你可以交给一名其他角色两张牌,然后其选择一项:1.视为对你选择的另一名其他角色使用一张【杀】或【决斗】,2.令你获得其两张牌。", + twenyuan: "恩怨", + twenyuan1: "恩怨", + twenyuan2: "恩怨", + twenyuan_info: "①当你获得一名其他角色的至少两张牌后,你可以令其摸一张牌,若其手牌区或装备区没有牌,则你可以改为令其回复1点体力。②当你受到1点伤害后,你可令伤害来源选择一项:1.失去1点体力;2.交给你一张手牌,若此牌的花色不为♥,你摸一张牌。", + tw_madai: "TW马岱", + tw_madai_prefix: "TW", + twqianxi: "潜袭", + twqianxi2: "潜袭", + twqianxi3: "潜袭", + twqianxi2_bg: "潜", + twqianxi3_bg: "袭", + twqianxi_info: "准备阶段,你可以摸一张牌并弃置一张牌,令一名距离为1的角色本回合不能使用或打出与你弃置的牌颜色相同的手牌。然后本回合的结束阶段,若你本回合对其造成过渠道为【杀】的伤害,你令其不能使用或打出与你以此法弃置的牌颜色不同的牌直到其下回合结束。", + tw_niujin: "TW牛金", + tw_niujin_prefix: "TW", + twcuorui: "挫锐", + twcuorui_info: "限定技。准备阶段,你可以将手牌摸至X张(X为场上角色手牌数最多的角色的手牌数,且至多摸5张)。然后若你的判定区:未废除,你废除判定区;已废除,你可以对一名其他角色造成1点伤害。", + twliewei: "裂围", + twliewei_info: "锁定技。当你杀死一名角色后,你选择一项:1.摸两张牌;2.若你拥有〖挫锐〗且〖挫锐〗已发动过,重置〖挫锐〗。", + tw_guanqiujian: "TW毌丘俭", + tw_guanqiujian_prefix: "TW", + twzhengrong: "征荣", + twzhengrong_tag: "荣", + twzhengrong_info: "当你于出牌阶段使用牌结算结束后,若此牌为你于本局游戏你的出牌阶段内使用的第偶数张指定了其他角色为目标的牌,或你于出牌阶段第一次造成伤害后,你可以将一名其他角色的一张牌置于你的武将牌上,称为“荣”。", + twhongju: "鸿举", + twhongju_info: "觉醒技。准备阶段,若你的“荣”数不小于3,你摸等同于“荣”数的牌,且可以用任意手牌交换等量的“荣”,获得〖清侧〗,然后可以减1点体力上限并获得〖扫讨〗。", + twqingce: "清侧", + twqingce_backup: "清侧", + twqingce_info: "出牌阶段,你可以将一张“荣”置入弃牌堆并选择一名区域内有牌的角色,你弃置其区域里的一张牌。", + twsaotao: "扫讨", + twsaotao_info: "锁定技。你使用【杀】和普通锦囊牌不能被响应。", + tw_daxiaoqiao: "TW大乔小乔", + tw_daxiaoqiao_prefix: "TW", + twxingwu: "星舞", + twxingwu_info: "弃牌阶段开始时,你可以将一张牌置于武将牌上,称为“星舞”。然后你可移去三张“星舞”,弃置一名其他角色装备区里的所有牌,然后对其造成2点伤害(若其性别包含女性则改为1点伤害)。", + twpingting: "娉婷", + twpingting_info: "锁定技。①一轮游戏开始时或其他角色于你的回合内进入濒死状态时,你摸一张牌并将一张牌置于武将牌上,称为“星舞”。②若你有“星舞”,你视为拥有〖天香〗和〖流离〗。", + tw_furong: "TW傅肜", + tw_furong_prefix: "TW", + twxuewei: "血卫", + twxuewei_info: "每轮限一次。一名其他角色A的出牌阶段开始时,你可以选择另一名其他角色B,然后你令A选择一项:1.本回合不能对B使用【杀】且手牌上限-2;2.你视为对A使用一张【决斗】。", + twliechi: "烈斥", + twliechi_info: "当你受到伤害后,若伤害来源的体力值不小于你,你可以选择一项:1.令其将手牌数弃置至与你的手牌数相同;2.弃置其一张牌;3.背水:若你本回合进入过濒死状态,弃置一张装备牌,然后依次执行上述所有选项。", + tw_yl_luzhi: "TW卢植", + tw_yl_luzhi_prefix: "TW", + twmingren: "明任", + twmingren_info: "①游戏开始时,你摸一张牌,然后将一张手牌置于武将牌上,称为“任”。②出牌阶段开始时或出牌阶段结束时,你可以用一张牌替换“任”。", + twzhenliang: "贞良", + twzhenliang_info: "转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。", + tw_zhangnan: "张南", + twfenwu: "奋武", + twfenwu_info: "结束阶段,你可以失去1点体力并视为使用一张无距离限制的【杀】。若本回合你使用过的基本牌种数大于1,此【杀】伤害基数+1。", + tw_huchuquan: "呼厨泉", + twfupan: "复叛", + twfupan_info: "当你造成或受到伤害后,你可以摸X张牌并将一张牌交给一名其他角色(X为伤害值)。若你此前:未以此法交给过该角色牌,你摸两张牌;以此法交给过该角色牌,你可{对其造成1点伤害,然后你不能再以此法交给其牌}。", + tw_liuzhang: "TW刘璋", + tw_liuzhang_prefix: "TW", + twyaohu: "邀虎", + twyaohu_info: "每轮限一次。回合开始时,你须选择场上的一个势力。该势力的角色的出牌阶段开始时,其获得你的一张“生”,然后其须选择一项:1.对你指定的另一名的其他角色使用一张【杀】(无距离限制);2.本回合其使用伤害牌指定你为目标时须交给你两张牌,否则取消此目标。", + tw_liwei: "TW李遗", + tw_liwei_prefix: "TW", + twjiaohua: "教化", + twjiaohua_info: "当你或体力值最小的其他角色因摸牌而得到牌后,你可以令该角色从牌堆或弃牌堆中获得一张本次未获得的类别的牌(每种类别每回合限一次)。", + tw_yanxiang: "TW阎象", + tw_yanxiang_prefix: "TW", + twkujian: "苦谏", + twkujianx: "谏", + twkujian_info: "出牌阶段限一次。你可以将至多三张手牌交给一名其他角色,称为“谏”,你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸一张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。", + twruilian: "睿敛", + twruilian2: "睿敛", + twruilian_info: "一轮游戏开始时,你可以选择一名角色。其下回合结束时,若其本回合弃置过至少两张牌,你可以选择其本回合弃置过的一种类别,你与其各从弃牌堆中获得一张此类别的牌。", + tw_xiahouen: "夏侯恩", + twfujian: "负剑", + twfujian_info: "锁定技。①游戏开始时或准备阶段,若你的装备区里没有武器牌,你随机将牌堆中的一张武器牌置入装备区。②当你于回合外失去武器牌后,你失去1点体力。", + twjianwei: "剑威", + twjianwei_info: "①若你的装备区里有武器牌,你使用【杀】无视防具且拼点牌点数+X(X为你的攻击范围)。②{其他角色的准备阶段,其可以与你拼点}/{准备阶段,你可以与攻击范围内的一名角色拼点}。若你赢,你获得其每个区域内的各一张牌;若其赢,其获得你装备区里的武器牌。", + tw_xiahoushang: "夏侯尚", + twtanfeng: "探锋", + twtanfeng_info: "准备阶段,你可以弃置一名其他角色区域内的一张牌,然后其选择一项:1.受到你造成的1点火焰伤害,然后令你跳过本回合的一个阶段(准备阶段和结束阶段除外);2.将一张牌当做【杀】对你使用(有距离限制)。", + tw_zongyu: "TW宗预", + tw_zongyu_prefix: "TW", + twzhibian: "直辩", + twzhibian_info: "出牌阶段开始时,你可以与一名其他角色拼点。若你赢,你可以选择一项:{1.将其区域里的一张牌移动到你的对应区域;2.回复1点体力;3.背水:弃置一张非基本牌,然后依次执行上述所有选项};若你没赢,你失去1点体力。", + twyuyan: "御严", + twyuyan_info: "锁定技。当你成为体力值大于你的角色使用的【杀】的目标时,你令使用者选择一项:1.交给你一张点数大于此【杀】的牌(若此【杀】无点数则改为非基本牌)。2.取消此目标。", + tw_zhouchu: "TW周处", + tw_zhouchu_prefix: "TW", + twguoyi: "果毅", + twguoyi_info: "当你不因〖果毅〗使用【杀】或普通锦囊牌指定一名其他角色为目标后,若其体力值或手牌数最大,或你的手牌数不大于X(X为你已损失的体力值+1),你可令其选择一项:1.本回合不能使用或打出手牌;2.弃置X张牌。若条件均满足,或其于本回合两个选项均已选择过,则你于此牌结算结束后依次视为对此牌的所有目标使用一张名称和属性相同的牌。", + twchuhai: "除害", + twchuhai_info: "使命技。①使命:令至少两名其他角色进入濒死状态。②成功:一名角色的回合结束时,若你于本回合完成了〖除害①〗的使命,你废除判定区,然后每名其他角色依次交给你一张牌。③当你获得其他角色的牌后,你须将其中的一张牌置入弃牌堆。", + tw_qiaogong: "TW桥公", + tw_qiaogong_prefix: "TW", + twyizhu: "遗珠", + twyizhu_info: "①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中,称为“遗珠”(X为角色数,选择牌的牌名对其他角色可见)。②当有其他角色使用“遗珠”指定唯一目标时,你可以选择一项:1.增加一个目标;2.取消此目标,增加一个目标。然后移除此牌对应的“遗珠”记录并摸一张牌。", + twluanchou: "鸾俦", + twluanchou_info: "出牌阶段限一次。你可以令两名角色获得〖共患〗直到你下次发动此技能。", + twgonghuan: "共患", + twgonghuan_info: "每回合限一次。当其他角色受到伤害时,若其拥有〖共患〗且其体力值不大于你,你可以将此伤害转移给你(不触发〖共患〗)。", + tw_qiaorui: "TW桥蕤", + tw_qiaorui_prefix: "TW", + wangxing: "妄行", + twxiawei: "狭威", + twxiawei_info: "①游戏开始时,你将牌堆中的两张基本牌置于武将牌上,称为“威”。②回合开始时,你将所有“威”置入弃牌堆。③你可以将“威”如手牌般使用或打出。④妄行:准备阶段,你可以将牌堆顶的X+1张牌置于武将牌上,称为“威”。", + twqiongji: "穷技", + twqiongji_info: "锁定技。①每回合限一次。当你使用或打出“威”后,你摸一张牌。②当你受到伤害时,若你没有“威”,此伤害+1。", + tw_bianfuren: "TW卞夫人", + tw_bianfuren_prefix: "TW", + twwanwei: "挽危", + twwanwei_info: "每回合限一次。当一名体力值最小的角色受到伤害时:若该角色不为你,你可以防止此伤害,然后失去1点体力;若该角色为你,或你的体力上限最大,你可以于当前回合的结束阶段获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之。", + twyuejian: "约俭", + twyuejian_info: "出牌阶段限一次。你可以将X张牌置于牌堆顶或牌堆底(X为你的手牌数减你的手牌上限且至少为1)。若你以此法失去的牌数:不小于3,你的体力上限+1;不小于2,你回复1点体力;不小于1,你的手牌上限+1。", + tw_chenzhen: "TW陈震", + tw_chenzhen_prefix: "TW", + twmuyue: "睦约", + twmuyue_info: "出牌阶段限一次。你可以弃置一张牌并选择一个基本牌或普通锦囊牌的牌名,然后令一名角色从牌堆中获得一张此牌名的牌。若你以此法弃置的牌的牌名与你选择的牌名相同,你下次发动〖睦约〗无需弃牌。", + twchayi: "察异", + twchayi_info: "结束阶段,你可以选择一名其他角色,令其选择一项:1.展示所有手牌;2.下次使用牌时弃置一张牌。该角色的下个回合结束时,若其手牌数与其上一次成为〖察异〗目标后的手牌数不相同,其执行另一项。", + tw_feiyi: "TW费祎", + tw_feiyi_prefix: "TW", + twshengxi: "生息", + twshengxi_info: "①准备阶段,你可以获得一张【调剂盐梅】。②结束阶段,若你本回合使用过牌且未造成伤害,则你可以获得一张智囊并摸一张牌。", + twkuanji: "宽济", + twkuanji_info: "每回合限一次。当你的牌不因使用而进入弃牌堆后,你可以令一名其他角色获得其中的一张牌。", + xia_wangyue: "王越", + twyulong: "驭龙", + twyulong_info: "当你使用【杀】指定第一个目标后,你可以与一名目标角色拼点。若你赢,且你此次的拼点牌为:黑色,此【杀】伤害+1;红色,此【杀】不可被响应。当此【杀】造成伤害后,若你赢,你令此【杀】不计入次数。", + twjianming: "剑鸣", + twjianming_info: "锁定技。每回合每种花色限一次,当你使用或打出【杀】时,你摸一张牌。", + xia_liyàn: "李彦", + twzhenhu: "震虎", + twzhenhu_info: "当你使用伤害牌指定第一个目标时,你可以摸一张牌并与至多三名其他角色共同拼点。若你赢,此牌对所有本次拼点没赢的角色造成的伤害+1;若你没赢,你失去1点体力。", + twlvren: "履刃", + twlvren_info: "①当你对其他角色造成伤害时,你令其获得1枚“刃”标记。②当你使用伤害牌时,你可以额外指定一名有“刃”的角色并移去其所有“刃”。③你的拼点牌点数+2X(X为参与此次拼点的角色数)。", + xia_tongyuan: "侠童渊", + xia_tongyuan_prefix: "侠", + twchaofeng: "朝凤", + twchaofeng_backup: "朝凤", + twchaofeng_info: "①你可以将一张【杀】当做【闪】、【闪】当做任意一种【杀】使用或打出。②出牌阶段开始时,你可以与至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】。", + twchuanshu: "传术", + twchuanshu_info: "限定技。准备阶段,你可以选择一名角色。直到你的下回合开始,其获得以下效果:1.当其拼点牌亮出时,此牌点数+3;2.其使用的下一张【杀】对除你外的角色造成伤害时,此伤害+1;3.若其不为你,其使用的下一张【杀】结算结束后,你摸等同于其因此【杀】造成的伤害值数的牌。", + xia_xushu: "侠徐庶", + xia_xushu_prefix: "侠", + twjiange: "剑歌", + twjiange_info: "每回合限一次。你可以将一张非基本牌当做【杀】使用或打出(无距离和次数限制,且不计入次数)。若此时不为你的回合,你摸一张牌。", + twxiawang: "侠望", + twxiawang_info: "当一名角色受到伤害后,若你至其的距离不大于1,你可以对伤害来源使用一张【杀】。当此【杀】结算结束后,若你造成过渠道为此牌的伤害,结束当前阶段。", + tw_haomeng: "TW郝萌", + tw_haomeng_prefix: "TW", + twgongge: "攻阁", + twgongge_info: "摧坚:你可以选择一项:1.摸X+1张牌。其响应此牌后,跳过你的下一个摸牌阶段;2.弃置其X+1张牌。此牌结算结束后,若其体力值不小于你,你交给其X张牌;3.此牌对其造成的伤害+X。此牌结算结束后,其回复X点体力。", + tw_weixu: "魏续", + twsuizheng: "随征", + twsuizheng_info: "锁定技。游戏开始时,你选择一名其他角色,称为“随征”角色。你获得以下效果:当“随征”角色造成伤害后,你摸一张牌;当“随征”角色受到伤害后,你选择一项:1.失去1点体力,令其从牌堆或弃牌堆中获得一张【杀】或【决斗】;2.弃置两张基本牌,令其回复1点体力。", + twtuidao: "颓盗", + twtuidao_info: "限定技。准备阶段,若“随征”角色的体力值不大于2或“随征”角色已死亡,你可以废除你与其的一个坐骑栏并选择一个类别,然后若“随征”角色存活,你获得其所有此类别的牌,否则你从牌堆中获得两张此类别的牌。然后你将“随征”角色改为另一名角色。", + tw_caoxiu: "TW曹休", + tw_caoxiu_prefix: "TW", + twqianju: "千驹", + twqianju_info: "锁定技。①你计算与其他角色的距离-X(X为你装备区的牌数)。②每回合限一次。当你对距离为1以内的角色造成伤害后,若你的装备区存在空置装备栏,你从牌堆或弃牌堆中将一张你空置装备栏对应副类别的装备牌置于你的装备区。", + twqingxi: "倾袭", + twqingxi_info: "当你使用张【杀】指定目标后,若此牌为你于本回合使用的第一张【杀】,你可以令目标角色选择一项:1.令你摸Y张牌,此【杀】不可被其响应(Y为你装备区的牌数且至少为1);2.若其装备区里有牌,弃置装备区里的所有牌,然后弃置你装备区里的等量张牌,令此【杀】对其造成的伤害+1。", + tw_sunyi: "TW孙翊", + tw_sunyi_prefix: "TW", + twzaoli: "躁厉", + twzaoli_info: "锁定技。①出牌阶段,你只能使用或打出你本回合得到的手牌。②出牌阶段开始时,你须弃置你区域内的所有装备牌并弃置任意张非装备手牌,你摸等量的牌,从牌堆中将你此次弃置的装备牌对应副类别的装备牌置入装备区。若你以此法置入了超过两张装备牌,你失去1点体力。", + tw_yangyi: "TW杨仪", + tw_yangyi_prefix: "TW", + twgongsun: "共损", + twgongsun_shadow: "共损", + twgongsun_info: "锁定技。出牌阶段开始时,你选择攻击范围内的一名其他角色并选择一种花色,直至你的下个回合开始前或你死亡时,你与其均无法使用、打出或弃置该花色的手牌。", + tw_dengzhi: "TW邓芝", + tw_dengzhi_prefix: "TW", + twjimeng: "急盟", + twjimeng_info: "出牌阶段限一次。你可以获得一名其他角色区域内的一张牌,然后交给其一张牌。若其体力值不小于你,你摸一张牌。", + xia_lusu: "侠鲁肃", + xia_lusu_prefix: "侠", + twkaizeng: "慨赠", + twkaizeng_info: "其他角色的出牌阶段限一次。其可以选择一种基本牌的牌名或非基本牌的类型,然后令你选择是否交给其任意张手牌。若你以此法:交给其至少两张牌,你摸一张牌;交给其的牌中包含其选择的牌名或类型的牌,你获得一张与此牌名或类型不同的牌。", + twyangming: "扬名", + twyangming_info: "出牌阶段结束时,你可以摸X张牌,且令本回合的手牌上限+X(X为你本阶段使用过的牌的类型数)。", + xia_dianwei: "侠典韦", + xia_dianwei_prefix: "侠", + twliexi: "烈袭", + twliexi_info: "准备阶段,你可以弃置任意张牌并选择一名其他角色。若你以此法弃置的牌数大于其体力值,你对其造成1点伤害;否则其对你造成1点伤害。然后若你弃置的牌中有武器牌,你对其造成1点伤害。", + twshezhong: "慑众", + twshezhong_info: "结束阶段,若你:本回合对其他角色造成过伤害,你可以令至多X名其他角色下个摸牌阶段的额定摸牌数-1(X为你本回合造成的伤害值);本回合受到过伤害,你可以将手牌摸至与其中一名伤害来源的体力值相同(至多摸至5)。", + xia_zhaoe: "赵娥", + twyanshi: "言誓", + twyanshi_info: "①游戏开始时,你选择一名其他角色,称为“言誓”角色。②当你或“言誓”角色受到二者之外角色造成的伤害后,伤害来源获得1枚“誓”标记。③你对有“誓”的角色使用牌无距离限制。④当你对有“誓”的角色造成伤害时,此伤害+1,且当你对这些角色造成伤害后,你摸等同于伤害值的牌并移去其所有“誓”。", + twrenchou: "刃仇", + twrenchou_info: "锁定技。当你或“言誓”角色死亡时,若二者中的另一名角色A存活,A对杀死你或其的角色造成X点伤害(X为A的体力值)。", + xia_xiahouzie: "夏侯紫萼", + twxuechang: "血偿", + twxuechang_info: "出牌阶段限一次。你可以与一名其他角色拼点。若你:赢,你获得其一张牌,若此牌为装备牌,你视为对其使用一张【杀】;没赢,其对你造成1点伤害,且你下次对其造成的伤害+1。", + twduoren: "夺刃", + twduoren_info: "①当你杀死角色后,你可以减1点体力上限,然后获得其所有的非主公技和非隐匿技。②当你令其他角色进入濒死状态时,你失去因〖夺刃①〗获得的技能。", + tw_yangang: "严纲", + twzhiqu: "直取", + twzhiqu_info: "结束阶段,你可以选择一名其他角色并依次使用牌堆顶X张牌中的【杀】。搏击:依次使用牌堆顶X张牌中的锦囊牌(X为你距离不大于1内的角色数,且你或其以外的角色不是你以此法使用牌的合法目标)。", + twxianfeng: "先锋", + twxianfeng_info: "当你于出牌阶段使用【杀】或伤害类锦囊牌对其他角色造成伤害后,你可以令受伤角色选择一项:1.其摸一张牌,然后直到你下个回合开始时,你至其他角色的距离-1;2.你摸一张牌,然后直到你下个回合开始时,其至你的距离-1。", + tw_gongsunfan: "公孙范", + twhuiyuan: "回援", + twhuiyuan_info: "当你于出牌阶段使用牌结算结束后,若你未于此阶段获得过此类型的牌,你可以展示一名角色的一张手牌,若此牌与你使用的牌类型相同,你获得此牌,否则你弃置此牌,然后其摸一张牌。游击:对其造成1点伤害。", + twshoushou: "收绶", + twshoushou_info: "①当你获得其他角色的牌时,若你在任意角色的攻击范围内,其他角色至你的距离+1。②当你造成或受到伤害后,若你不在任意其他角色的攻击范围内,其他角色至你的距离-1。", + twshijun: "师君", + twshijun_info: "主公技,其他群势力角色出牌阶段限一次,若你没有“米”,其可以摸一张牌,然后将一张牌置于你的武将牌上,称为“米”。", + twjuxiang: "踞襄", + twjuxiang_info: "主公技,其他群势力角色出牌阶段限一次,其可以选择其装备区的一张牌移动到你的装备区中,若你对应的装备栏已被废除,则改为交给你此装备牌,然后恢复你的对应装备栏。", + tw_ol_sunjian: "TW孙坚", + tw_ol_sunjian_prefix: "TW", + twpolu: "破虏", + twpolu_info: "主公技,当吴势力角色杀死一名角色或死亡后,你可以令任意名角色各摸X张牌(X为你此前发动过此技能的次数+1)。", + tw_menghuo: "TW孟获", + tw_menghuo_prefix: "TW", + twqiushou: "酋首", + twqiushou_info: "主公技,锁定技,当一张【南蛮入侵】结算结束后,若此牌造成的伤害大于3点或有角色因此死亡,所有蜀势力和群势力角色各摸一张牌。", + twzhuiting: "坠廷", + twzhuiting_info: "主公技,当一张锦囊牌即将对你生效时,其他魏势力角色和群势力角色可将一张与此牌颜色相同的牌当作【无懈可击】使用。", + twniju: "逆拒", + twniju_info: "主公技。当你的拼点牌亮出后,你可以令本次拼点事件中的一张拼点牌的点数+X或-X。然后当本次拼点事件结束后,若有两张拼点牌的点数相等,你摸X张牌(X为场上群势力角色数)。", + ol_liuyu: "TW刘虞", + ol_liuyu_prefix: "TW", + twchongwang: "崇望", + twchongwang_info: "主公技,其他群势力角色的出牌阶段开始时,其可以交给你一张牌,然后你与其使用【杀】或伤害性锦囊牌指定目标时不能指定对方为目标直至你的下回合结束(每名角色限发动一次)。", + tw_zhangzhao: "张昭", + twlijian: "力荐", + twlijian_info: "昂扬技。其他角色的弃牌阶段结束时,你可以令其获得任意本阶段进入弃牌堆的牌(可不选),然后你获得其余的牌,若其得到的牌数大于你,你可以对其造成1点伤害。
    激昂:八张牌进入弃牌堆。", + twchungang: "纯刚", + twchungang_info: "锁定技。一名其他角色于摸牌阶段外得到超过一张牌时,你令其弃置一张牌。", + tw_zhanghong: "张纮", + twquanqian: "劝迁", + twquanqian_info: "昂扬技。出牌阶段限一次,你可以将至多四张花色各不相同的手牌交给一名其他角色,然后若你交出的牌数大于1,则你从牌堆中获得一张装备牌,然后选择一项:①将手牌数摸至与其相同;②观看其手牌并获得其一种花色的所有牌。
    激昂:你弃置六张手牌。", + twrouke: "柔克", + twrouke_info: "锁定技。当你于摸牌阶段外得到超过一张牌时,你摸一张牌。", + kaisa: "凯撒", + zhengfu: "征服", + zhengfu_info: "当你使用【杀】指定目标时,你可以选择一种牌的类别,然后除非目标角色交给你一种该类别的牌,否则其不能闪避此【杀】。", + xia_xiahoudun: "侠夏侯惇", + xia_xiahoudun_prefix: "侠", + twdanlie: "胆烈", + twdanlie_info: "①出牌阶段限一次。你可以与至多三名其他角色共同拼点。若你赢,你对没赢的角色依次造成1点伤害;若你没赢,你失去1点体力。②你的拼点牌点数+X(X为你已损失的体力值)。", + xia_zhangwei: "张葳", + twhuzhong: "护众", + twhuzhong_info: "当你于出牌阶段使用无属性【杀】指定唯一目标角色时,你可以摸一张牌并选择一项:①为此牌额外选择一个目标;②弃置其一张手牌,此牌结算完毕后,若此牌造成过伤害,则你摸一张牌且本阶段可以额外使用一张【杀】。", + twfenwang: "焚亡", + twfenwang_info: "锁定技。①当你受到属性伤害时,你须弃置一张牌或令此伤害+1。②当你对其他角色造成非属性伤害时,若你的手牌数大于等于其,则此伤害+1。", + xia_xiahousone: "夏侯子萼", + twchengxi: "承袭", + twchengxi_info: "出牌阶段每名角色限一次,你可以摸一张牌并与一名其他角色拼点。若你赢,你使用的下一张基本牌或非延时锦囊牌结算完毕后,你视为对原目标使用一张无次数限制的同名牌;若你没赢,其视为对你使用一张无距离限制的【杀】。", + xia_liubei: "侠刘备", + xia_liubei_prefix: "侠", + twshenyi: "伸义", + twshenyi_info: "每回合限一次,当你或你攻击范围内的一名角色于一回合内首次受到伤害后,你可以声明一种基本牌或锦囊牌(每种牌名限一次),然后从牌堆中将一张同名牌(若没有同名牌则改为同类型的牌)称为“侠义”置于武将牌上。若受伤角色不为你,则你可以将任意张手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。", + twxinghan: "兴汉", + twxinghan_info: "①你的回合外或你处于濒死状态时,你可以如手牌般使用或打出“侠义”牌。②准备阶段,若“侠义”牌数大于存活角色数,则你可以依次使用其中所有可以使用的牌。然后你获得如下效果:回合结束时,你弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)。", + twxinghan_tag: "侠义", + xia_guanyu: "侠关羽", + xia_guanyu_prefix: "侠", + twzhongyi: "忠义", + twzhongyi_info: "锁定技。①你使用【杀】无距离限制。②当你使用【杀】结算完毕后,你选择一项:⒈摸X张牌;⒉回复X点体力;⒊背水:失去Y点体力,依次执行以上两项(X为受到此牌造成的伤害的角色数,Y为你本局游戏选择此项的次数)。", + twchue: "除恶", + twchue_info: "①当你使用【杀】指定唯一目标时,若场上存在可称为此【杀】目标的非目标角色,则你可以失去1点体力,为此牌额外指定Z个目标。②当你受到伤害或失去体力后,你摸一张牌并获得1个“勇”标记。③回合结束时,若你的“勇”标记数大于等于Z,则你可以失去Z个“勇”标记,视为使用一张伤害+1且可以额外指定Z个目标的【杀】。(Z为你的体力值)", + xia_shitao: "石韬", + twjieqiu: "劫囚", + twjieqiu_info: "出牌阶段限一次,你可以选择一名装备区没有废除栏的其他角色,废除其所有装备栏,然后其摸X张牌(X为其废除装备栏前的装备区牌数),直到其恢复所有装备栏前:其弃牌阶段结束时,其恢复等同于其弃置牌数的装备栏;其回合结束时,若其仍有已废除的装备栏,则你执行一个额外回合(每轮限一次)。", + twenchou: "恩仇", + twenchou_info: "出牌阶段限一次,你可以观看一名存在废除装备栏的其他角色的手牌并获得其中一张牌,然后你恢复其一个装备栏。", + xia_shie: "史阿", + twdengjian: "登剑", + twdengjianx: "剑法", + twdengjian_info: "①其他角色的弃牌阶段结束时,你可以随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。②你使用“剑法”牌不计入次数限制。", + twxinshou: "心授", + twxinshou_info: "①当你于出牌阶段使用【杀】时,若此【杀】与你本回合使用的所有其他【杀】的颜色均不相同,则你可以选择执行以下一项本回合未执行过的项:⒈摸一张牌;⒉交给一名其他角色一张牌。②当你使用【杀】时,若〖心授①〗的两项本回合均已被你选择过,则你可以令〖登剑①〗失效并令一名其他角色获得〖登剑〗,你的下个回合开始时,其失去〖登剑〗,若其这期间使用【杀】造成过伤害,则你结束〖登剑①〗的失效状态。", + xia_yuzhenzi: "玉真子", + twhuajing: "化境", + twhuajing_info: "①游戏开始时,你获得6个效果各不相同的无效果“武”标记。②一名拥有“武”标记的角色的攻击范围+X(X为其拥有的“武”标记数)。③出牌阶段限一次,你可以展示至多四张手牌,然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果。④拥有“武”标记效果的角色的武器牌失效(武器牌不提供攻击范围且武器技能失效)。", + twhuajing_jian: "剑", + twhuajing_jian_info: "当你使用【杀】指定目标后,你随机弃置目标角色两张牌。", + twhuajing_dao: "刀", + twhuajing_dao_info: "当你使用【杀】对没有手牌的目标角色造成伤害时,此伤害+1。", + twhuajing_fu: "斧", + twhuajing_fu_info: "当你使用的【杀】被【闪】响应后,你对目标角色造成1点伤害。", + twhuajing_qiang: "枪", + twhuajing_qiang_info: "当你使用黑色【杀】结算完毕后,你从牌堆或弃牌堆中获得一张【闪】。", + twhuajing_ji: "戟", + twhuajing_ji_info: "当你使用【杀】造成伤害时,你摸一张牌。", + twhuajing_gong: "弓", + twhuajing_gong_info: "当你使用【杀】造成伤害后,你随机弃置受伤角色装备区里的一张牌。", + twtianshou: "天授", + twtianshou_info: "锁定技,回合结束时,若你本回合使用【杀】造成过伤害,且你拥有本回合获得过效果的“武”标记,则你须将其中一个“武”标记交给一名其他角色并令其获得此标记的效果直到其回合结束,然后你摸两张牌。", + tw_yanliang: "颜良", + tw_wenchou: "文丑", + tw_yuantan: "袁谭", + twduwang: "独往", + twduwang_info: "使命技。①出牌阶段开始时,你可以选择至多三名有牌的其他角色,摸X张牌(X为选择角色数+1),然后这些角色依次将一张牌当【决斗】对你使用。②当你处于濒死状态时,其他角色不能对你使用【桃】。③使命:使用【决斗】或成为【决斗】目标的次数之和不小于4(若游戏总人数小于4则改为3)。④成功:准备阶段,若你于你的上回合完成了〖独往③〗的使命,则你重置〖独往〗并将〖独往〗修改至只保留〖独往①〗的效果,选择一项:⒈获得〖狭勇〗;⒉重置〖延势〗并令其获得历战效果。⑤失败:当你死亡时,使命失败。", + twylyanshi: "延势", + twylyanshi_info: "限定技。你可以将一张【杀】当作【决斗】、【兵临城下】或任意智囊牌使用或打出。", + twylyanshix: "延势·改", + twylyanshix_info: "限定技。你可以将一张【杀】当作【决斗】、【兵临城下】或任意智囊牌使用或打出。历战:重置〖延势〗。", + twjuexing: "绝行", + twjuexing_info: "出牌阶段限一次。你可以视为对一名其他角色使用一张【决斗】。此牌对一名角色生效时,你与其将所有手牌扣置于武将牌上,然后各摸等同于当前体力值的牌。此牌结算结束后,你与所有目标角色弃置本次以此法摸的牌,然后获得扣置于武将牌上的牌。历战:当你因〖绝行〗摸牌时,摸牌数+1。", + twxiayong: "狭勇", + twxiayong1: "狭勇", + twxiayong2: "狭勇", + twxiayong_info: "锁定技。当你使用的【决斗】或目标角色包括你的【决斗】造成伤害时,若受伤角色为你,则你随机弃置一张手牌;否则你令此伤害+1。", + twqiaosi: "峭嗣", + twqiaosi_info: "结束阶段,你可以获得由其他角色区域直接置入或经由处理区置入弃牌堆的所有牌,然后若你以此法获得的牌数小于你的体力值,则你失去1点体力。", + twbaizu: "败族", + twbaizu_info: "锁定技。结束阶段,若你已受伤且你有手牌,则你须选择X名有手牌的其他角色(X为你的体力值),你与这些角色同时弃置一张手牌,然后你对与你弃置牌类别相同的所有其他角色各造成1点伤害。历战:〖败族〗目标选择数+1。", +}; + +export default translates; diff --git a/character/tw/voices.js b/character/tw/voices.js new file mode 100644 index 000000000..785be32db --- /dev/null +++ b/character/tw/voices.js @@ -0,0 +1,558 @@ +export default { + "#twduwang1": "阿瞒聚众来犯,吾一人可挡万敌!", + "#twduwang2": "勇绝河北,吾足以一柱擎天!", + "#twduwang3": null, + "#twylyanshi1": "今破曹军,明日当直取许都!", + "#twylyanshi2": "全军整肃,此战不得有失!", + "#tw_yanliang:die": "哥哥,切不可轻敌!", + "#twjuexing1": "阿瞒且寄汝首,待吾一骑取之!", + "#twjuexing2": "杀!尽奸贼败军之众!", + "#twxiayong1": "一招之差,不足决此战胜负!", + "#twxiayong2": "这般身手,也敢来战我?", + "#tw_wenchou:die": "黄泉路上,你我兄弟亦不可独行……", + "#twqiaosi1": null, + "#twqiaosi2": null, + "#twbaizu1": null, + "#twbaizu2": null, + "#tw_yuantan:die": null, + "#twhuajing1": "瞬息之间,已蕴森罗万象之法!", + "#twhuajing2": "万般兵器,皆由吾心所化!", + "#twtianshou1": "既怀远志,此武可助汝成之!", + "#twtianshou2": "汝得此术,当勤为善行,勿动恶念!", + "#xia_yuzhenzi:die": "吾身归去,如化大道。", + "#twdengjian1": "百家剑法之长,皆凝于此剑!", + "#twdengjian2": "君剑法超群,观之似有所得!", + "#twxinshou1": "传汝于心,授汝以要!", + "#twxinshou2": "公子少怀大志,可承吾剑!", + "#xia_shie:die": "江湖路远,吾等终会有再见之时。", + "#twjieqiu1": "元直莫慌,石韬来也!", + "#twjieqiu2": "一群鼠辈,焉能挡我等去路!", + "#twenchou1": "江湖快意,恩仇必报!", + "#twenchou2": "今日之因,明日之果!", + "#xia_shitao:die": "想不到竟中了官府的埋伏……", + "#twzhongyi1": "忠照白日,义贯长虹!", + "#twzhongyi2": "忠铸吾骨,义全吾身!", + "#twchue1": "关某此生,誓斩天下恶徒!", + "#twchue2": "政法不行,羽当替天行之!", + "#xia_guanyu:die": "丈夫终有一死,唯恨壮志难酬。", + "#twshenyi1": "施仁德于天下,伸大义于四海!", + "#twshenyi2": "汉道虽衰,亦不容汝等奸祟放肆!", + "#twxinghan1": "继先汉之荣,开万世泰平!", + "#twxinghan2": "立此兴汉之志,终不可渝!", + "#xia_liubei:die": "楼桑羽葆,终是一梦……", + "#twchengxi1": "从今日始,血婆娑由我继之。", + "#twchengxi2": "夏侯之名,吾师之愿,子萼定不相负!", + "#xia_xiahousone:die": "蔷薇凋零,永沉血海……", + "#twdanlie1": "师者如父,辱师之仇亦如辱父!", + "#twdanlie2": "壮士自怀豪烈胆,初生幼虎敢搏龙!", + "#xia_xiahoudun:die": "英雄烈胆,何惧泉台一战……", + "#twhuzhong1": "此难当头,吾誓保百姓无恙!", + "#twhuzhong2": "天崩于前,吾必先众人而死!", + "#twfenwang1": "洛阳逢此大难,吾,亦难脱身。", + "#twfenwang2": "大火之下,黑影,已无所遁形!", + "#xia_zhangwei:die": "百姓……安否……", + "#twquanqian1": "欲承奕世之基,当迁龙兴之地。", + "#twquanqian2": "吴郡僻远,宜迁都秣陵,以承王业。", + "#twrouke1": "宽以待人,柔能克刚,则英雄莫敌。", + "#twrouke2": "务崇宽惠,顺天命以行诛。", + "#tw_zhanghong:die": "惟愿主公从善如流,老臣去矣……", + "#twlijian1": "陛下欲复昔日桓公之事乎?", + "#twlijian2": "君者当御贤于后,安可校勇于猛兽!", + "#twchungang1": "陛下若此,天下何以观之!", + "#twchungang2": "偏听谄谀之言,此为万民所仰之君乎?", + "#tw_zhangzhao:die": "哼哼!此皆老臣罪责,陛下岂会有过……", + "#yinghun_ol_sunjian1": "提刀奔走,灭敌不休。", + "#yinghun_ol_sunjian2": "贼寇草莽,我且出战。", + "#wulie1": "孙武之后,英烈勇战。", + "#wulie2": "兴义之中,忠烈之名。", + "#repolu1": "斩敌复城,扬我江东军威!", + "#tw_ol_sunjian:die": null, + "#huoshou11": "背黑锅我来,送死?你去!", + "#huoshou12": "通通算我的!", + "#rezaiqi1": "挫而弥坚,战而弥勇!", + "#rezaiqi2": "蛮人骨硬,其势复来!", + "#twqiushou1": null, + "#twqiushou2": null, + "#tw_menghuo:die": "七纵之恩……来世……再报了……", + "#zongzuo1": "尽死生之力,保大厦不倾。", + "#zongzuo2": "乾坤倒,黎民苦,高祖后,岂任之?", + "#zhige1": "天下和而平乱,神器宁而止戈。", + "#zhige2": "刀兵纷争既止,国运福祚绵长。", + "#twchongwang1": null, + "#twchongwang2": null, + "#ol_liuyu:die": "怀柔之计,终非良策。", + "#twhuiyuan1": "起渤海之兵,襄吾兄成事!", + "#twhuiyuan2": "发一州之力,随手足之势!", + "#twshoushou1": "此印既授,吾自当收之!", + "#twshoushou2": "本初虽已示弱,此仇亦不能饶!", + "#tw_gongsunfan:die": "公孙氏之业,终付之一炬……", + "#twzhiqu1": "八百之众,哼,须臾可灭!", + "#twzhiqu2": "此战首功,当由我取之!", + "#twxianfeng1": "吾领万余白马,可堪此战先锋!", + "#twxianfeng2": "白马先发,敌不攻而散!", + "#tw_yangang:die": "诸将,冲锋!呃啊!", + "#twxuechang1": "风尘难掩忠魂血,杀尽宦祸不得偿!", + "#twxuechang2": "霜刃绚练,血舞婆娑。", + "#twduoren1": "便以汝血,封汝之刀!", + "#twduoren2": "血婆娑之剑,从不会沾无辜之血。", + "#xia_xiahouzie:die": "祖父,紫萼不能为您昭雪了……", + "#twyanshi1": "当以贼血,污此白刃!", + "#twyanshi2": "骨肉至亲,血脉相连。", + "#twrenchou1": "禄福夜雪白,都亭朝霞红!", + "#twrenchou2": "塞亡父之冤魂,血三弟之永恨!", + "#xia_zhaoe:die": "乞就刑戮,肃明王法……", + "#twkaizeng1": "此心唯念天下之士,不较细软锱铢!", + "#twkaizeng2": "千金散尽何须虑,但求天下俱欢颜!", + "#twyangming1": "善名高布凌霄阙,仁德始铸黄金台!", + "#twyangming2": "失千金之利,得万人之心!", + "#xia_lusu:die": "人心不足,巴蛇吞象……", + "#twliexi1": "短兵强击,贯汝心扉!", + "#twliexi2": "性刚情烈,目不容奸!", + "#twshezhong1": "此乃吾之私怨,与汝等何干?!", + "#twshezhong2": "拦吾去路者,下场有如此贼!", + "#xia_dianwei:die": "少智无谋,空负此身勇武……", + "#twbingde1": "秉德纯懿,志行忠方。", + "#twbingde2": "慎所与,节所偏,德毕迩矣。", + "#twqingtao1": "君子当如滔流,循道而不失其行。", + "#twqingtao2": "探赜索隐,钩深致远。日月在躬,隐之弥曜。", + "#tw_bingyuan:die": "人能弘道,非道弘人。", + "#twjuntun1": "屯安邑之地,慑山东之贼。", + "#twjuntun2": "长安丰饶,当以军养军。", + "#twxiongxi1": "凶兵厉袭,片瓦不存!", + "#twxiongxi2": "尽起西凉狼兵,袭掠中原之地!", + "#twxiafeng1": "穷奇凶戾,黠凤诡诈。", + "#twxiafeng2": "鸾凤襄蛟,黠风殷狰。", + "#tw_niufudongxie:die": "董公遗命,谁可继之……", + "#twkunsi1": "豺狼虎兕雄壮,西园将校威风!", + "#twkunsi2": "灵帝遗命,岂容尔等放肆?", + "#tw_jianshuo:die": "郭胜,汝竟下此狠手!", + "#twjichou1": "此危亡之时,当出此急谋。", + "#twjichou2": "急筹布画,运策捭阖。", + "#twjilun1": "时移不移,违天之祥也。", + "#twjilun2": "民望不因,违人之咎也。", + "#tw_jiangji:die": "洛水之誓,言犹在耳……咳咳咳……", + "#mashu": null, + "#mashu1": null, + "#mashu2": null, + "#twxiongzheng1": "凶年荒岁,当兴乱自保!", + "#twxiongzheng2": "天下大势,分分合合。", + "#twluannian1": "西凉男儿,怀天下之志!", + "#twluannian2": "金戈铁马,争乱世之雄!", + "#tw_mateng:die": "皇叔,剩下的就靠你了……", + "#twmutao1": "董贼暴乱,天下定当奋节讨之!", + "#twmutao2": "募州郡义士,讨祸国逆贼!", + "#twyimou1": "今畜士众之力,据其要害,贼可破之。", + "#twyimou2": "泰然若定,攻敌自溃!", + "#tw_baoxin:die": "区区黄巾流寇,如何挡我?呃啊……", + "#twzhuidu1": "到了阴司地府,你们也别想好过!", + "#twzhuidu2": "髡头墨面,杀人诛心。", + "#twshigong1": "冀州安定,此司空之功也……", + "#twshigong2": "妾当自缚,以示诚心。", + "#tw_liufuren:die": "害人终害己,最毒妇人心……", + "#twjiekuang1": "昔汉帝安疆之恩,今当竭力以报。", + "#twjiekuang2": "发兵援汉,以示竭忠之心。", + "#twneirao1": "家破父亡,请留汉土。", + "#twneirao2": "虚国匡汉,无力安家。", + "#tw_yufuluo:die": "胡马依北风,越鸟巢南枝……", + "#twqingkou1": "哈哈哈哈,鼠辈岂能当我大汉雄师?", + "#twqingkou2": "凛凛汉将,岂畏江东鼠辈?", + "#tw_fengxí:die": "陛下,速退白帝……", + "#twdingzhen1": "招抚流民,兴复县邑。", + "#twdingzhen2": "容民畜众,群羌归土。", + "#twyouye1": "筑城西疆,开万代太平。", + "#twyouye2": "镇边戍卫,许万民攸业。", + "#tw_zhangji:die": "恨不见四海肃眘,羌胡徕服。", + "#twfenwu1": "合围夷道,兵困吴贼!", + "#twfenwu2": "纵兵摧城,奋武破敌!", + "#tw_zhangnan:die": "骨埋吴地,魂归汉土……", + "#twfupan1": "胜者为王,吾等……无话可说……", + "#twfupan2": "此为吾等,复兴匈奴之良机!", + "#twfupan3": "今乱平阳之地,汉人如何可防?", + "#tw_huchuquan:die": "久困汉庭,无力再叛……", + "#twjiaohua1": "教民崇化,以定南疆。", + "#twjiaohua2": "知礼数,崇王化,则民不复叛矣。", + "#tw_liwei:die": "安南重任,万不可轻之……", + "#twkujian1": "吾之所言,皆为公之大业。", + "#twkujian2": "明公虽奕世克昌,未若有周之盛。", + "#twkujian3": "公岂徒有纳谏之名乎?", + "#twruilian1": "公若擅进庸肆,必失民心!", + "#twruilian2": "外敛虚进之势,内减弊民之政。", + "#tw_yanxiang:die": "若遇明主,或可青史留名……", + "#twfujian1": "得此宝剑,如虎添翼!", + "#twfujian2": "丞相至宝,汝岂配用之?啊!……", + "#twjianwei1": "小小匹夫,可否闻长坂剑神之名号?", + "#twjianwei2": "此剑吹毛得过,削铁如泥。", + "#tw_xiahouen:die": "长坂剑神,也陨落了……", + "#twtanfeng1": "探敌薄防之地,夺敌不备之间。", + "#twtanfeng2": "探锋之锐,以待进取之机。", + "#tw_xiahoushang:die": "陛下垂怜至此,臣纵死无憾……", + "#twxiawei1": "既闻仲帝威名,还不速速归降!", + "#twxiawei2": "仲朝国土,岂容贼军放肆!", + "#twqiongji1": "我技虽穷,势不可衰!", + "#twqiongji2": "战在其势,何妨技穷?", + "#tw_qiaorui:die": "曹贼……安敢犯仲国之威……", + "#twgongge1": "弓弩并射难近其身,若退又恐难安己命!", + "#twgongge2": "既已决心反之,当速擒吕布以溃其兵士!", + "#twgongge3": "今行至如此,唯殊死一搏!", + "#tw_haomeng:die": "反复小儿!汝竟临阵倒戈……", + "#twsuizheng1": "续得将军器重,愿随将军出征!", + "#twsuizheng2": "将军莫慌,万事有吾!", + "#twsuizheng3": "吾与将军有亲,哼!尔等岂可与我相比!", + "#twtuidao1": "将军大势已去,续无可奈何啊。", + "#twtuidao2": "续投明主,还望将军勿怪才是。", + "#tw_weixu:die": "颜良小儿,竟敢杀我同伴,看我为其……啊!", + "#twjiange1": "纵剑为舞,击缶而歌!", + "#twjiange2": "辞亲历山野,仗剑唱大风!", + "#twxiawang1": "天下兴亡,侠客当为之己任。", + "#twxiawang2": "隐居江湖之远,敢争天下之先!", + "#xia_xushu:die": "天下为公……", + "#twyulong1": "三尺青锋,为君驭六龙,定九州!", + "#twyulong2": "十年砺剑,当率千军之众,堪万夫之雄!", + "#twjianming1": "弹剑作谱,鸣之铮铮。", + "#twjianming2": "剑鸣凄凄,穿心刺骨。", + "#xia_wangyue:die": "汉室中兴,不系于吾一人……", + "#twzhenhu1": "戟出势如虎,百兽尽皆服!", + "#twzhenhu2": "横戟冲阵,敌纵为猛虎凶豺,亦不敢前!", + "#twlvren1": "坚甲利刃,破之如鲁缟!", + "#twlvren2": "攻城破阵,如履平地!", + "#xia_liyàn:die": "戾气入髓,不可再起杀心……", + "#twchaofeng1": "枪出惊百鸟,技现震诸雄。", + "#twchaofeng2": "出如鸾凤高翱,收若百鸟归林。", + "#twchuanshu1": "此术集百家之法,当传万世。", + "#twchuanshu2": "某虽无名于世,此术可传之万年。", + "#xia_tongyuan:die": "隐居山水,空老病榻。", + "#twxingzhui1": "中宫黯弱,紫宫当明。", + "#twxingzhui2": "星坠如雨,月掩轩辕。", + "#twjuchen1": "流沙聚散,黄巾浮沉。", + "#twjuchen2": "积土为台,聚尘为砂。", + "#tw_zhangning:die": "风过烟尘散,雨罢雷音绝。", + "#duoduan1": "北伐之事,丞相亦听我定夺。", + "#duoduan2": "筹定规画,片刻既定!", + "#gongsun1": "我岂能与魏延这种莽夫共事!", + "#gongsun2": "早知如此,投靠魏国又如何!", + "#tw_yangyi:die": "我功勋卓著,只为昏君奸臣所害,唉!", + "#jimeng1": "今日之言,皆是为保两国无虞。", + "#jimeng2": "天下之势已如水火,还望重修盟好。", + "#shuaiyan1": "并魏之日,想来便是两国争战之时。", + "#shuaiyan2": "在下所言,至诚至率。", + "#tw_dengzhi:die": "使命既成,但死无妨!", + "#mibei1": "密为之备,不可有失。", + "#mibei2": "事以密成,语以泄败!", + "#xingqi1": "司马氏虽权尊势重,吾等徐图亦无不可!", + "#xingqi2": "先谋后事者昌,先事后谋者亡!", + "#tw_wangling:die": "一生尽忠事魏,不料今日晚节尽毁啊!", + "#qirang1": "集母亲之智,效父亲之法,祈以七星。", + "#qirang2": "仙甲既来,岂无仙术乎。", + "#yuhua1": "此乃仙人之物,不可轻弃。", + "#yuhua2": "凤羽飞烟,乘化仙尘。", + "#tw_zhugeguo:die": "方生方死,方死方生。", + "#xinfu_xingluan1": "大兴兵争,长安当乱。", + "#xinfu_xingluan2": "勇猛兴军,乱世当立。", + "#tw_fanchou:die": "唉,稚然,疑心甚重。", + "#boming1": "先载附从,吾后行即可。", + "#boming2": "诸位速速上船,靖随后便至。", + "#ejian1": "为政者当沙汰秽浊,显拔幽滞,以顺民心。", + "#ejian2": "此所谓寡助之至,天下叛之矣。", + "#tw_xujing:die": "漂薄风波,绝粮茹草。", + "#paoxiao1": "燕人张飞在此!", + "#paoxiao2": "啊~~~!", + "#retishen1": "谁,还敢过来一战?!", + "#retishen2": "欺我无谋?定要尔等血偿!", + "#tw_zhangfei:die": "实在是,杀不动了……", + "#funan1": "礼尚往来,乃君子风范。", + "#funan2": "以子之矛,攻子之盾。", + "#jiexun1": "帝王应以社稷为重,以大观为主。", + "#jiexun2": "吾冒昧进谏,只求陛下思虑。", + "#tw_xuezong:die": "尔等,竟做如此有辱斯文之事。", + "#mjweipo1": "想必……将军心中已有所计较。", + "#mjweipo2": "谌言尽于此,采纳与否还凭将军。", + "#mjchenshi1": "将军已为此二者所围,形势实不容乐观。", + "#mjchenshi2": "此二人若合力攻之,则将军危矣。", + "#mjmouzhi1": "潜谋于无形,胜于不争不费。", + "#mjmouzhi2": "欲思其成,必虑其败也。", + "#tw_xunchen:die": "吾欲赴死,断不做背主之事……", + "#shangyi1": "大丈夫为人坦荡,看下手牌算什么。", + "#shangyi2": "敌情已了然于胸,即刻出发!", + "#zniaoxiang1": "此战,必是有死无生!", + "#zniaoxiang2": "抢占先机,占尽优势!", + "#tw_jiangqing:die": null, + "#xinshenxing1": "事前多思,事后少悔。", + "#xinshenxing2": "权衡斟酌,再虑一番。", + "#bingyi_xin_guyong1": "志爱公利,道德纯备。", + "#bingyi_xin_guyong2": "秉持吾志,一心为公。", + "#tw_guyong:die": "病躯渐重,国事难安……", + "#spyilie1": "哈哈哈哈!来吧!", + "#spyilie2": "哼!都来受死!", + "#spfenming1": "合肥一役,吾等必拼死效力!", + "#spfenming2": "主公勿忧,待吾等上前一战!", + "#tw_chendong:die": "杀身为主,死而无憾。", + "#regongji": null, + "#regongji1": "射石饮羽,弦无虚发!", + "#regongji2": "驭马前行,弓急弦发!", + "#jiefan_re_handang1": "援军已至,看你们往哪里逃!", + "#jiefan_re_handang2": "长驱直入,迎刃而解。", + "#tw_handang:die": "今后,只能靠你了。", + "#shuangren": null, + "#shuangren1": "吃我一箭!", + "#shuangren2": "仲国大将纪灵在此!", + "#tw_jiling:die": "额,将军为何咆哮不断……", + "#rexuanhuo1": "光以眩目,言以惑人。", + "#rexuanhuo2": "我法孝直如何会害你?", + "#reenyuan1": "善因得善果,恶因得恶报!", + "#reenyuan2": "私我者赠之琼瑶,厌我者报之斧钺!", + "#tw_re_fazheng:die": null, + "#qianxi1": "喊什么喊?我敢杀你!", + "#qianxi2": "笑什么笑?叫你得意!", + "#tw_madai:die": "反骨贼已除,丞相放心……", + "#cuorui1": "区区乌合之众,如何困得住我?!", + "#cuorui2": "今日就让你见识见识老牛的厉害!", + "#liewei1": "敌阵已乱,速速突围!", + "#liewei2": "杀你,如同捻死一只蚂蚁!", + "#tw_niujin:die": "这包围圈太厚,老牛,尽力了……", + "#drlt_zhenrong1": "东征高句丽,保辽东安稳。", + "#drlt_zhenrong2": "跨海东征,家国俱荣。", + "#drlt_hongju1": "一举拿下,鸿途可得。", + "#drlt_hongju2": "鸿飞荣升,举重若轻。", + "#tw_guanqiujian:die": "峥嵘一生,然被平民所击射!", + "#xingwu1": "哼,不要小瞧女孩子哦!", + "#xingwu2": "姐妹齐心,其利断金。", + "#twpingting1": null, + "#twpingting2": null, + "#tw_daxiaoqiao:die": "伯符,公瑾,请一定要守住我们的江东啊!", + "#xuewei1": "吾主之尊,岂容尔等贼寇近前?", + "#xuewei2": "血佑忠魂,身卫英主。", + "#liechi1": "吾受汉帝恩,岂容吴贼辱?", + "#liechi2": "汉将有死无降,怎会如吴狗一般?", + "#tw_furong:die": "吾主既然得返,此番已是功成……", + "#nzry_mingren_11": "吾之任,君之明举!", + "#nzry_mingren_12": "得义真所救,吾任之必尽瘁以报。", + "#nzry_zhenliang_11": "贞洁贤良,吾之本心。", + "#nzry_zhenliang_12": "风霜以别草木之性,危乱而见贞良之节。", + "#tw_yl_luzhi:die": null, + "#xiusheng1": "百姓安乐足矣,穷兵黩武实不可取啊。", + "#xiusheng2": "内乱初定,更应休养生息。", + "#yinlang1": "益州疲敝,还望贤兄相助。", + "#yinlang2": "内讨米贼,外拒强曹,璋无宗兄万万不可啊。", + "#huaibi1": "哎!匹夫无罪,怀璧其罪啊。", + "#huaibi2": "粮草尽皆在此,宗兄可自取之。", + "#tw_liuzhang:die": "引狼入室,噬脐莫及啊!", + "#zhibian1": "两国各增守将,皆事势宜然,何足相问。", + "#zhibian2": "固边大计,乃立国之本,岂有不设之理。", + "#yuyan1": "正直敢言,不惧圣怒。", + "#yuyan2": "威武不能屈,方为大丈夫。", + "#tw_zongyu:die": "吾年逾七十,唯少一死耳……", + "#zhangming1": "心怀远志,何愁声名不彰!", + "#zhangming2": "从今始学,成为有用之才!", + "#chuhai1": "有我在此,安敢为害?!", + "#chuhai2": "小小孽畜,还不伏诛?!", + "#chuhai3": "此番不成,明日再战!", + "#tw_zhouchu:die": "改励自砥,誓除三害……", + "#yizhu1": "老夫有二女,视之如明珠。", + "#yizhu2": "将军若得遇小女,万望护送而归。", + "#luanchou1": "愿汝永结鸾俦,以期共盟鸳蝶。", + "#luanchou2": "夫妻相濡以沫,方可百年偕老。", + "#tw_qiaogong:die": "为父所念,为汝二人啊……", + "#shengxi_feiyi1": "利治小之宜,秉居静之理。", + "#shengxi_feiyi2": "外却骆谷之师,内保宁缉之实。", + "#fyjianyu1": "功以才成,业由才广,弃才不用,非长计也。", + "#fyjianyu2": "舍此不任而防后患,是备风波而废舟楫也。", + "#tw_feiyi:die": "臣请告陛下,宦权日盛,必乱社稷也。", + "#wanwei1": "梁、沛之间,非子廉无有今日。", + "#wanwei2": "正使祸至,共死何苦!", + "#yuejian1": "无文绣珠玉,器皆黑漆。", + "#yuejian2": "性情约俭,不尚华丽。", + "#tw_bianfuren:die": "心肝涂地,惊愕断绝……", + "#twmuyue1": "震以不才,得充下使,愿促两国盟好。", + "#twchayi1": "震奉聘叙好,若有违贵国典制,万望告之。", + "#tw_chenzhen:die": "若毁盟约,则两败俱伤!", + "#twqianju1": null, + "#twqianju2": null, + "#xinqingxi1": "此残兵败将,胜之若儿戏耳!", + "#xinqingxi2": "有休在此,主公何虑?哈哈哈哈!", + "#tw_caoxiu:die": "兵行险招,终有一失。", + "#zaoli1": "喜怒不形于色,诈伪要明之徒。", + "#zaoli2": "摇舌鼓唇,竖子是之也!", + "#tw_sunyi:die": "叛我贼子,虽死亦不饶之……", + "#twzhengjian1": "修建未成,皆因尔等懈怠。", + "#twzhengjian2": "哼!何故建田不成!", + "#twzhongchi1": "陛下,兴已知错。", + "#twzhongchi2": "微臣有罪,任凭陛下处置。", + "#tw_puyangxing:die": "陛下已流放吾等,为何……啊!", + "#twzhenxi1": "戮胡首领,捣其王廷!", + "#twzhenxi2": "震江扫寇,袭贼平戎!", + "#twyangshi1": "扬师北疆,剪覆胡奴!", + "#twyangshi2": "陈兵百万,慑敌心胆!", + "#tw_tianyu:die": "钟鸣漏尽,夜行不休……", + "#zhenshan1": "施人恩惠,可以扬名!", + "#zhenshan2": "乐民之乐者,民亦乐其乐。", + "#old_quancong:die": "劳民伤财之事……何必呢?", + "#twfenghan1": null, + "#twfenghan2": null, + "#twcongji1": null, + "#twcongji2": null, + "#tw_wujing:die": "贼寇未除,奈何吾身先丧……", + "#twdianyi1": "旧仪废弛,兴造制度。", + "#twdianyi2": "礼仪卒度,笑语卒获。", + "#twyingji1": "辩适于世,论合于时。", + "#twyingji2": "辩言出于口,不失思忖心。", + "#twshanghe1": "今使海内回心,望风而愿治,皆明公之功也。", + "#twshanghe2": "明公平定兵乱,使百姓可安,粲当奉觞以贺之。", + "#tw_wangcan:die": "虽无铅刀用,庶几奋薄身。", + "#twkaiji1": "力除秦汉之弊,方可治化复兴。", + "#twkaiji2": "约官实录,勿与百姓争利。", + "#twshepan1": "遣五军案大道发还,贼望必喜而轻敌。", + "#twshepan2": "以所获铠马驰环城,贼见必怒而失智。", + "#tw_wangchang:die": "吾切至之言,望尔等引以为戒。", + "#twfuzuan1": "望陛下听臣忠言,勿信资等无知之论。", + "#twfuzuan2": "前朝王莽之乱,可为今事之鉴。", + "#twchongqi1": "吾既身承宠遇,敢不为君分忧?", + "#twchongqi2": "臣得君上垂青,已是此生之幸。", + "#tw_caozhao:die": "虽极荣宠,亦有尽时。", + "#twjingce1": "方策精详,有备无患。", + "#twjingce2": "精兵拒敌,策守如山。", + "#yuzhang1": "吾已料敌布防,蜀军休想进犯!", + "#yuzhang2": "诸君依策行事,定保魏境无虞!", + "#tw_guohuai:die": "姜维小儿,竟然……", + "#lihuo1": "将士们,引火对敌!", + "#lihuo2": "和我同归于尽吧!", + "#chunlao1": "唉,帐中不可无酒啊!", + "#chunlao2": "无碍,且饮一杯!", + "#tw_chengpu:die": "没,没有酒了……", + "#twfengji1": "蜂趋蚁附,皆为道来。", + "#twfengji2": "蜂攒蚁集,皆为道往!", + "#twyiju1": "鸱张蚁聚,为从天道!", + "#twyiju2": "黄天之道,苍天之示。", + "#twbudao1": "得天之力,从天之道。", + "#twbudao2": "黄天大道,泽及苍生。", + "#tw_zhangmancheng:die": "天师,曼成尽力了。", + "#twlingfa1": "吾明令在此,汝何以犯之?", + "#twlingfa2": "法不阿贵,绳不挠曲!", + "#tw_caocao:die": "奸宦当道,难以匡正啊……", + "#twyujue1": "财物交足,官位任取。", + "#twyujue2": "卖官鬻爵,取财之道。", + "#twgezhi1": "改革旧制,保我汉室长存!", + "#twgezhi2": "革除旧弊,方乃中兴!", + "#twfengqi1": null, + "#twfengqi2": null, + "#tw_liuhong:die": "汉室中兴,还需尔等忠良。", + "#twsidai1": "敌军疲乏,正是战机,随我杀!", + "#twsidai2": "敌军无备,随我冲锋!", + "#twjieyu1": "葭萌,蜀之咽喉,峻必竭力守之。", + "#twjieyu2": "吾头可得,城不可得。", + "#tw_huojun:die": "恨,不能与使君共成霸业……", + "#twhanyu1": "霸起泰山,称雄东方!", + "#twhanyu2": "乱贼何惧,霸自可御之!", + "#hengjiang1": "霸必奋勇杀敌,一雪夷陵之耻!", + "#hengjiang2": "江横索寒,阻敌绝境之中!", + "#tw_zangba:die": "短刃沉江,负主重托……", + "#yuanhu1": "将军,这件兵器可还趁手?", + "#yuanhu2": "刀剑无眼,须得小心防护。", + "#yuanhu3": "宝马配英雄!哈哈哈哈……", + "#twjuezhu1": "曹君速上马,洪自断后。", + "#twjuezhu2": "天下可无洪,不可无君。", + "#tw_re_caohong:die": null, + "#fengpo1": "对付你,用不着我家哥哥亲自上阵!", + "#fengpo2": "等我提枪上马,打你个落花流水!", + "#tw_mayunlu:die": "呜呜……是你们欺负人……", + "#mouzhu1": "宦官专权,今必诛之。", + "#mouzhu2": "汝等罪大恶极,快快伏法。", + "#yanhuo1": "乱世,才刚刚开始……", + "#yanhuo2": "你很快就笑不出来了……", + "#tw_hejin:die": "不能遗祸世间……", + "#twshenxing": null, + "#twshenxing1": null, + "#twshenxing2": null, + "#daoji1": "八十斤双戟?于我如探囊取物!", + "#daoji2": "以汝之矛,攻汝之盾!", + "#tw_hucheer:die": "未料一伸手,便被……敌酋捉……", + "#xinzhenjun1": "将怀其威,则镇其军。", + "#xinzhenjun2": "治军之道,得之于严。", + "#tw_yujin:die": "命归九泉,何颜面对……", + "#moukui1": "你的死期到了。", + "#moukui2": "同归于尽吧。", + "#tw_fuwan:die": "后会有期……", + "#fanghun1": "万花凋落尽,一梅独傲霜。", + "#fanghun2": "暗香疏影处,凌风踏雪来!", + "#fuhan1": "承先父之志,扶汉兴刘。", + "#fuhan2": "天将降大任于我。", + "#twqueshi": null, + "#twqueshi1": null, + "#twqueshi2": null, + "#tw_zhaoxiang:die": "遁入阴影之中……", + "#cuijin": null, + "#cuijin1": "诸军速行,违者军法论处!", + "#cuijin2": "快!贻误军机者,定斩不赦!", + "#yuejiu:die": "哼,动手吧!", + "#jintao1": "一雪前耻,誓报前仇!", + "#jintao2": "量敌而进,直讨吴境!", + "#wuban:die": "恨,杀不尽吴狗!", + "#equan1": "哈哈哈哈哈哈,有此毒泉,大王尽可宽心。", + "#equan2": "有此四泉足矣,何用刀兵?", + "#manji1": "嗯~~不错,不错。", + "#manji2": "哈哈哈哈哈哈,痛快!痛快!", + "#duosidawang:die": "快快放箭!快快放箭!", + "#beini1": "今日污无用清名,明朝自得新圣褒嘉。", + "#beini2": "吾佐奉朝日暖旭,又何惮落月残辉?", + "#dingfa1": "峻礼教之防,准五服以制罪。", + "#dingfa2": "礼律并重,臧善否恶,宽简弼国。", + "#jiachong:die": "此生从势忠命,此刻,只乞不获恶谥……", + "#twmiaolve1": "智者通权达变,以解临近之难。", + "#twmiaolve2": "依吾计而行,此患乃除耳。", + "#twyingjia1": "行非常之事,乃有非常之功,愿将军三思。", + "#twyingjia2": "将军今留匡弼,事势不便,惟移驾幸许耳。", + "#tw_dongzhao:die": "为曹公助书方略,实昭之幸也……", + "#twdanfa1": "取五灵三使之药,炼九光七曜之丹。", + "#twdanfa2": "云液踊跃成雪霜,流珠之英能延年。", + "#twlingbao": null, + "#twlingbao1": "洞明于至道,俯弘于世教。", + "#twlingbao2": "凝神太虚镜,北冥探玄珠。", + "#twsidao1": "执吾法器,以司正道。", + "#twsidao2": "内修道法,外需宝器。", + "#tw_gexuan:die": "金丹难成,大道难修……", + "#zongkui_tw_beimihu1": "不要抵抗,接受我的操纵吧。", + "#zongkui_tw_beimihu2": "当我的傀儡,你将受益良多。", + "#guju_tw_beimihu1": "你还没有见过真正的恐惧。", + "#guju_tw_beimihu2": "这些,你就感到害怕了吗?", + "#baijia_tw_beimihu1": "没有人能阻止我的觉醒。", + "#baijia_tw_beimihu2": "哼哼哼……这才是我的真面目。", + "#bingzhao1": null, + "#bingzhao2": null, + "#tw_beimihu:die": "鬼道破灭,我有何寄托?", + "#chijie": "按照女王的命令,选择目标吧!", + "#waishi1": "贵国的繁荣,在下都看到了。", + "#waishi2": "希望我们两国,可以世代修好。", + "#renshe1": "无论风雨再大,都无法阻挡我的脚步。", + "#renshe2": "一定不能辜负女王的期望!", + "#nashime:die": "请把这身残躯,带回我的家乡……", + "#twyanqin1": null, + "#twyanqin2": null, + "#twbaobian1": null, + "#twbaobian2": null, + "#tw_xiahouba:die": "弃魏投蜀,死而无憾。", + "#twtijin1": null, + "#twtijin2": null, + "#tw_zumao:die": "孙将军,已经,安全了吧……", + "#twxiaolian1": null, + "#twxiaolian2": null, + "#tw_caoang:die": "典将军,还是你赢了……", + "#twqijia1": null, + "#twqijia2": null, + "#twzhuchen": null, + "#twzhuchen1": null, + "#twzhuchen2": null, + "#tw_dingfeng:die": "这风,太冷了。", + "#twhuzhu1": null, + "#twhuzhu2": null, + "#twliancai1": null, + "#twliancai2": null, + "#tw_caohong:die": "福兮祸所伏……", + "#twrangyi1": null, + "#twrangyi2": null, + "#twbaimei1": null, + "#twbaimei2": null, + "#tw_maliang:die": "皇叔为何不听我之言?", + "#zhengfu": null, + "#zhengfu1": null, + "#zhengfu2": null, + "#kaisa:die": null, +}; diff --git a/character/xianding/card.js b/character/xianding/card.js new file mode 100644 index 000000000..339352456 --- /dev/null +++ b/character/xianding/card.js @@ -0,0 +1,193 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + //武关羽的兵临城下水淹七军 + shuiyanqijuny: { + audio: "shuiyanqijun", + fullskin: true, + cardimage: "shuiyanqijunx", + enable: true, + filterTarget: true, + type: "trick", + selectTarget: [1, 2], + targetprompt: ["受伤弃牌", "受伤摸牌"], + contentBefore() { + var evt = event.getParent(), + target = evt.stocktargets[0]; + evt.shuiyanqijun_target = target; + }, + content() { + target.damage("thunder"); + if (target != event.getParent().shuiyanqijun_target) target.draw(); + else target.chooseToDiscard("he", true); + }, + ai: { + order: 6, + value: 4, + useful: 2, + tag: { + damage: 1, + thunderDamage: 1, + natureDamage: 1, + loseCard: 1, + }, + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return -1.5; + return -0.5; + }, + }, + }, + }, + pyzhuren_heart: { + fullskin: true, + derivation: "puyuan", + cardcolor: "heart", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -2 }, + skills: ["pyzhuren_heart"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { + delete _status.pyzhuren[card.name]; + } + }, + ai: { + basic: { + equipValue: 4, + }, + }, + }, + pyzhuren_diamond: { + fullskin: true, + derivation: "puyuan", + cardcolor: "diamond", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -1 }, + skills: ["pyzhuren_diamond"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { + delete _status.pyzhuren[card.name]; + } + }, + ai: { + basic: { + equipValue: 3, + }, + }, + }, + pyzhuren_club: { + fullskin: true, + derivation: "puyuan", + cardcolor: "club", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -1 }, + skills: ["pyzhuren_club"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { + delete _status.pyzhuren[card.name]; + } + }, + ai: { + basic: { + equipValue: 5, + }, + }, + loseDelay: false, + onLose: function () { + var next = game.createEvent("baiyin_recover"); + event.next.remove(next); + var evt = event.getParent(); + if (evt.getlx === false) evt = evt.getParent(); + evt.after.push(next); + next.player = player; + next.setContent(function () { + if (player.isDamaged()) player.logSkill("pyzhuren_club"); + player.recover(); + }); + }, + }, + pyzhuren_spade: { + fullskin: true, + derivation: "puyuan", + cardcolor: "spade", + type: "equip", + subtype: "equip1", + skills: ["pyzhuren_spade"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { + delete _status.pyzhuren[card.name]; + } + }, + ai: { + basic: { + equipValue: 3, + }, + }, + }, + pyzhuren_shandian: { + fullskin: true, + derivation: "puyuan", + cardcolor: "spade", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -3 }, + skills: ["pyzhuren_shandian"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { + delete _status.pyzhuren[card.name]; + } + }, + ai: { + basic: { + equipValue: 3, + }, + }, + }, + dagongche: { + fullskin: true, + derivation: "zhangfen", + cardcolor: "spade", + type: "equip", + subtype: "equip5", + skills: ["dagongche_skill"], + cardPrompt: function (card) { + if (!card.storage) return "出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。"; + var str = "出牌阶段开始时,你可以视为使用一张"; + if (card.storage.大攻车选项一) str += "无距离限制且无视防具的"; + str += "【杀】"; + if (card.storage.大攻车选项二) str += "(此【杀】的目标上限+" + card.storage.大攻车选项二 + ")"; + str += ",且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其"; + var num = 1; + if (card.storage.大攻车选项三) num += card.storage.大攻车选项三; + str += get.cnNumber(num); + str += "张牌。当此牌离开你的装备区后,销毁之。"; + return str; + }, + destroy: true, + ai: { + basic: { + equipValue: 3, + }, + }, + }, + pilitoushiche: { + fullskin: true, + derivation: "dc_liuye", + cardimage: "ly_piliche", + cardcolor: "diamond", + type: "equip", + subtype: "equip5", + skills: ["pilitoushiche"], + destroy: true, + ai: { + basic: { + equipValue: 3, + }, + }, + }, +}; + +export default cards; diff --git a/character/xianding/character.js b/character/xianding/character.js new file mode 100644 index 000000000..571cd68b6 --- /dev/null +++ b/character/xianding/character.js @@ -0,0 +1,101 @@ +const characters = { + guanyue: ["male", "shu", 4, ["dcshouzhi", "dcfenhui"]], + sp_zhenji: ["female", "qun", 3, ["dcjijie", "dchuiji"]], + wu_guanyu: ["male", "shu", 5, ["dcjuewu", "dcwuyou", "dcyixian"]], + caofang: ["male", "wei", 4, ["dczhimin", "dcjujian"], ["zhu"]], + dc_sb_simayi: ["male", "wei", 3, ["dcsbquanmou", "dcsbpingliao"]], + chendong: ["male", "wu", 4, ["dcduanxie", "fenming"]], + lvfan: ["male", "wu", 3, ["diaodu", "diancai"]], + cuimao: ["male", "wei", 3, ["zhengbi", "fengying"]], + huzun: ["male", "wei", 4, ["dczhantao", "dcanjing"]], + zhugemengxue: ["female", "wei", 3, ["dcjichun", "dchanying"]], + bailingyun: ["female", "wei", 3, ["dclinghui", "dcxiace", "dcyuxin"]], + dc_qinghegongzhu: ["female", "wei", 3, ["dczhangji", "dczengou"]], + caoxian: ["female", "wei", 3, ["dclingxi", "dczhifou"]], + dc_sb_zhouyu: ["male", "wu", 4, ["dcsbronghuo", "dcsbyingmou"]], + dc_sb_lusu: ["male", "wu", 3, ["dcsbmingshi", "dcsbmengmou"]], + zhangjian: ["male", "qun", 105, ["dc_zj_a", "dc_zj_b"], ["unseen"]], + zhugeruoxue: ["female", "wei", 3, ["dcqiongying", "dcnuanhui"]], + caoyi: ["female", "wei", 4, ["dcmiyi", "dcyinjun"]], + malingli: ["female", "shu", 3, ["dclima", "dcxiaoyin", "dchuahuo"]], + wu_luxun: ["male", "wu", 3, ["dcxiongmu", "dczhangcai", "dcruxian"]], + dc_xujing: ["male", "shu", 3, ["dcshangyu", "dccaixia"]], + dc_zhaoxiang: ["female", "shu", 4, ["refanghun", "refuhan"]], + dc_guansuo: ["male", "shu", 4, ["xinzhengnan", "xiefang"]], + xin_baosanniang: ["female", "shu", 3, ["decadewuniang", "decadexushen"]], + dc_shixie: ["male", "qun", 3, ["rebiluan", "ollixia"]], + dc_sp_machao: ["male", "qun", 4, ["zhuiji", "dc_olshichou"]], + old_huangfusong: ["male", "qun", 4, ["xinfenyue"]], + dc_xiahouba: ["male", "shu", 4, ["rebaobian"]], + dc_daxiaoqiao: ["female", "wu", 3, ["dcxingwu", "dcluoyan"], ["tempname:daxiaoqiao"]], + tianshangyi: ["female", "wei", 3, ["dcposuo", "dcxiaoren"]], + sunlingluan: ["female", "wu", 3, ["dclingyue", "dcpandi"]], + dc_wangjun: ["male", "qun", 4, ["dctongye", "dcchangqu"]], + zhoubuyi: ["male", "wei", 3, ["dcshiji", "dcsilun"]], + dc_duyu: ["male", "wei", 4, ["dcjianguo", "dcdyqingshi"]], + ganfurenmifuren: ["female", "shu", 3, ["dcchanjuan", "dcxunbie"]], + dc_ganfuren: ["female", "shu", 3, ["dcshushen", "dcshenzhi"]], + dc_mifuren: ["female", "shu", 3, ["dcguixiu", "dccunsi"]], + wanglang: ["male", "wei", 3, ["regushe", "rejici"]], + ruanji: ["male", "wei", 3, ["dczhaowen", "dcjiudun"]], + wu_zhugeliang: ["male", "shu", "4/7", ["dcjincui", "dcqingshi", "dczhizhe"]], + duanqiaoxiao: ["female", "wei", 3, ["dccaizhuang", "dchuayi"]], + zhangjinyun: ["female", "shu", 3, ["dchuizhi", "dcjijiao"]], + huanfan: ["male", "wei", 3, ["dcjianzheng", "dcfumou"]], + chentai: ["male", "wei", 4, ["dcctjiuxian", "dcchenyong"]], + sunyu: ["male", "wu", 3, ["dcquanshou", "dcshexue"]], + xizheng: ["male", "shu", 3, ["dcdanyi", "dcwencan"]], + dc_ruiji: ["female", "wu", 4, ["dcwangyuan", "dclingyin", "dcliying"]], + zerong: ["male", "qun", 4, ["dccansi", "dcfozong"]], + xielingyu: ["female", "wu", 3, ["dcyuandi", "dcxinyou"]], + dc_yangbiao: ["male", "qun", 3, ["dczhaohan", "dcjinjie", "dcjue"]], + dc_tengfanglan: ["female", "wu", 3, ["dcluochong", "dcaichen"]], + yanghong: ["male", "qun", 3, ["dcjianji", "dcyuanmo"]], + xuelingyun: ["female", "wei", 3, ["dcxialei", "dcanzhi"]], + dc_wangyun: ["male", "qun", 4, ["dclianji", "dcmoucheng"], ["clan:太原王氏"]], + dc_zhouxuān: ["male", "wei", 3, ["dcwumei", "dczhanmeng"]], + chengbing: ["male", "wu", 3, ["dcjingzao", "dcenyu"]], + dongguiren: ["female", "qun", 3, ["dclianzhi", "dclingfang", "dcfengying"]], + yuanji: ["female", "wu", 3, ["dcfangdu", "dcjiexing"]], + zhujianping: ["male", "qun", 3, ["dcxiangmian", "dctianji"]], + zhaozhi: ["male", "shu", 3, ["dctongguan", "dcmengjie"]], + dc_liuye: ["male", "wei", 3, ["dcpoyuan", "dchuace"]], + luyi: ["female", "qun", 3, ["dcyaoyi", "dcfuxue"]], + dingshangwan: ["female", "wei", 3, ["dcfengyan", "dcfudao"]], + quanhuijie: ["female", "wu", 3, ["dchuishu", "dcyishu", "dcligong"]], + dukui: ["male", "wei", 3, ["dcfanyin", "dcpeiqi"]], + zhangfen: ["male", "wu", 4, ["dcwanglu", "dcxianzhu", "dcchaixie"]], + liuhui: ["male", "qun", 4, ["dcgeyuan", "dcjieshu", "dcgusuan"]], + dc_wangchang: ["male", "wei", 3, ["dckaiji", "dcpingxi"], ["clan:太原王氏"]], + zhaoang: ["male", "wei", "3/4", ["dczhongjie", "dcsushou"]], + caohua: ["female", "wei", 3, ["caiyi", "guili"]], + dc_liuyu: ["male", "qun", 3, ["dcsuifu", "dcpijing"]], + dc_huangzu: ["male", "qun", 4, ["dcjinggong", "dcxiaojuan"]], + laiyinger: ["female", "qun", 3, ["xiaowu", "huaping"]], + caomao: ["male", "wei", "3/4", ["qianlong", "fensi", "juetao", "zhushi"], ["zhu"]], + dc_luotong: ["male", "wu", 3, ["renzheng", "jinjian"]], + re_fengfangnv: ["female", "qun", 3, ["tiqi", "baoshu"]], + wufan: ["male", "wu", 4, ["tianyun", "wfyuyan"]], + re_zhangbao: ["male", "qun", 3, ["xinzhoufu", "xinyingbing"]], + re_sunyi: ["male", "wu", 5, ["syjiqiao", "syxiongyi"]], + caojinyu: ["female", "wei", 3, ["yuqi", "shanshen", "xianjing"]], + zhouyi: ["female", "wu", 3, ["zhukou", "mengqing"]], + re_panshu: ["female", "wu", 3, ["zhiren", "yaner"]], + yangwan: ["female", "shu", 3, ["youyan", "zhuihuan"]], + ruanyu: ["male", "wei", 3, ["xingzuo", "miaoxian"]], + fanyufeng: ["female", "qun", 3, ["bazhan", "jiaoying"]], + guozhao: ["female", "wei", 3, ["pianchong", "zunwei"]], + re_xinxianying: ["female", "wei", 3, ["rezhongjian", "recaishi"]], + liubian: ["male", "qun", 3, ["shiyuan", "dushi", "yuwei"], ["zhu"]], + re_liuzan: ["male", "wu", 4, ["refenyin", "liji"]], + wenyang: ["male", "wei", 5, ["xinlvli", "choujue"]], + wangshuang: ["male", "wei", 8, ["spzhuilie"]], + huaman: ["female", "shu", 3, ["manyi", "mansi", "souying", "zhanyuan"]], + puyuan: ["male", "shu", 4, ["pytianjiang", "pyzhuren"]], + guanlu: ["male", "wei", 3, ["tuiyan", "busuan", "mingjie"]], + gexuan: ["male", "wu", 3, ["gxlianhua", "zhafu"]], + leitong: ["male", "shu", 4, ["kuiji"]], + wulan: ["male", "shu", 4, ["wlcuorui"]], +}; + +export default characters; diff --git a/character/xianding/characterFilter.js b/character/xianding/characterFilter.js new file mode 100644 index 000000000..85add03e9 --- /dev/null +++ b/character/xianding/characterFilter.js @@ -0,0 +1,10 @@ +const characterFilters = { + // leitong(mode) { + // return mode != "identity" && mode != "guozhan"; + // }, + // wulan(mode) { + // return mode != "identity" && mode != "guozhan"; + // }, +}; + +export default characterFilters; diff --git a/character/xianding/characterReplace.js b/character/xianding/characterReplace.js new file mode 100644 index 000000000..79699d495 --- /dev/null +++ b/character/xianding/characterReplace.js @@ -0,0 +1,18 @@ +const characterReplaces = { + wenyang: ["wenyang", "db_wenyang", "diy_wenyang"], + gexuan: ["gexuan", "tw_gexuan"], + panshu: ["panshu", "re_panshu"], + yangwan: ["yangwan", "sp_yangwan"], + sunyi: ["re_sunyi", "sunyi", "tw_sunyi"], + fengfangnv: ["fengfangnv", "re_fengfangnv"], + luotong: ["dc_luotong", "luotong"], + dc_wangchang: ["dc_wangchang", "tw_wangchang"], + guozhao: ["guozhao", "xin_guozhao", "jsrg_guozhao"], + dingshangwan: ["dingshangwan", "ol_dingshangwan"], + qinghegongzhu: ["qinghegongzhu", "dc_qinghegongzhu"], + caofang: ["caofang", "jsrg_caofang"], + caomao: ["caomao", "mb_caomao"], + sp_zhenji: ["sp_zhenji", "jsrg_zhenji"], +}; + +export default characterReplaces; diff --git a/character/xianding/dynamicTranslate.js b/character/xianding/dynamicTranslate.js new file mode 100644 index 000000000..bebb6e081 --- /dev/null +++ b/character/xianding/dynamicTranslate.js @@ -0,0 +1,100 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + xinlvli(player) { + var str = "每回合限一次"; + if (player.storage.choujue) str += "(自己的回合内则改为限两次)"; + str += ",当你造成"; + if (player.storage.beishui) str += "或受到"; + str += "伤害后,你可选择:1,若你的体力值大于你的手牌数,你摸X张牌;2,若你的手牌数大于你的体力值且你已受伤,你回复X点体力(X为你的手牌数与体力值之差)。"; + return str; + }, + lvli(player) { + var str = "每名角色的回合限一次"; + if (player.storage.choujue) str += "(自己的回合内则改为限两次)"; + str += ",你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)"; + if (player.storage.beishui) str += "。当你受到伤害后,你也可以以此法使用一张牌。"; + return str; + }, + rezhongjian(player) { + return "出牌阶段限" + (player.hasSkill("recaishi2") ? "两" : "一") + "次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。"; + }, + bazhan(player) { + if (player.storage.bazhan) return '转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到此牌的角色执行一项:①回复1点体力。②复原武将牌。'; + return '转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到此牌的角色执行一项:①回复1点体力。②复原武将牌。'; + }, + zhiren(player) { + return "当你于" + (player.hasSkill("yaner_zhiren") ? "一" : "你的") + "回合内使用第一张非转化牌时,你可依次执行以下选项中的前X项:①卜算X。②可弃置场上的一张装备牌和延时锦囊牌。③回复1点体力。④摸三张牌。(X为此牌的名称的字数)"; + }, + yuqi(player) { + var info = lib.skill.yuqi.getInfo(player); + return "每回合限两次。当有角色受到伤害后,若你至其的距离不大于" + info[0] + ",则你可以观看牌堆顶的" + info[1] + "张牌。你将其中至多" + info[2] + "张牌交给受伤角色,然后可以获得剩余牌中的至多" + info[3] + "张牌,并将其余牌以原顺序放回牌堆顶。(所有具有颜色的数字至多为5)"; + }, + caiyi(player) { + var current = player.storage.caiyi, + list = player.storage.caiyi_info || [[], []]; + var str = "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项。"; + var list1 = ["⒈回复X点体力。", "⒉摸X张牌。", "⒊复原武将牌。", "⒋随机执行一个已经移除过的阴选项;"], + list2 = ["⒈受到X点伤害。", "⒉弃置X张牌。", "⒊翻面并横置。", "⒋随机执行一个已经移除过的阳选项。"], + str1 = "阴:", + str2 = "阳:"; + for (var i = 0; i < 4; i++) { + var clip1 = list1[i], + clip2 = list2[i]; + if (list[0].includes(i)) clip1 = '' + clip1 + ""; + if (list[1].includes(i)) clip2 = '' + clip2 + ""; + str1 += clip1; + str2 += clip2; + } + if (current) str2 = '' + str2 + ""; + else str1 = '' + str1 + ""; + return str + str1 + str2 + "(X为该阴阳态剩余选项的数量)。"; + }, + dchuishu(player) { + var list = lib.skill.dchuishu.getList(player); + return "摸牌阶段结束时,你可以摸[" + list[0] + "]张牌。若如此做:你弃置[" + list[1] + "]张手牌,且当你于本回合内弃置第[" + list[2] + "]+1张牌后,你从弃牌堆中随机获得〖慧淑〗第三个括号数字张非基本牌。"; + }, + dcshoutan(player) { + if (player.storage.dcshoutan) return '转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。'; + return '转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。'; + }, + dcluochong(player) { + return "一轮游戏开始时,你可以弃置任意名角色区域里的共计至多[" + (4 - player.countMark("dcluochong")) + "]张牌,然后若你以此法弃置了一名角色的至少三张牌,则你方括号内的数字-1。"; + }, + dczhangcai(player) { + return "当你使用或打出" + (player.hasSkill("dczhangcai_all") ? "" : "点数为8的") + "牌时,你可以摸X张牌(X为你手牌区里" + (player.hasSkill("dczhangcai_all") ? "与此牌点数相同" : "点数为8") + "的牌数且至少为1)。"; + }, + dcsbmengmou(player) { + var storage = player.storage.dcsbmengmou; + var str = "转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:"; + if (!storage) str += ''; + str += "阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;"; + if (!storage) str += ""; + if (storage) str += ''; + str += "阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。"; + if (storage) str += ""; + str += "(X为你的体力上限,Y为X-其打出【杀】数)"; + return str; + }, + dcsbyingmou(player) { + var storage = player.storage.dcsbyingmou; + var str = "转换技,每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色:"; + if (!storage) str += ''; + str += "阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;"; + if (!storage) str += ""; + if (storage) str += ''; + str += "阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。"; + if (storage) str += ""; + return str; + }, + dcsbquanmou(player) { + if (player.storage.dcsbquanmou) return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。'; + return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。'; + }, + dcshouzhi(player) { + let skillName = "dcshouzhi"; + if (player.storage.dcshouzhi_modified) skillName += "_modified"; + return lib.translate[`${skillName}_info`]; + }, +}; +export default dynamicTranslates; diff --git a/character/xianding/index.js b/character/xianding/index.js new file mode 100644 index 000000000..16517baa9 --- /dev/null +++ b/character/xianding/index.js @@ -0,0 +1,40 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "xianding", + connect: true, + character: { ...characters }, + characterSort: { + xianding: characterSort, + }, + characterSubstitute: { + dc_sb_simayi: [], + dc_sb_zhouyu: [], + //dc_sb_lusu: [], + }, + characterFilter: { ...characterFilters }, + characterTitle: { + // wulan:'#b对决限定武将', + // leitong:'#b对决限定武将', + }, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/xianding/intro.js b/character/xianding/intro.js new file mode 100644 index 000000000..5bbc127bb --- /dev/null +++ b/character/xianding/intro.js @@ -0,0 +1,60 @@ +const characterIntro = { + cuimao: "请分别查看「崔琰」和「毛玠」的武将介绍。", + bailingyun: "柏灵筠,女,是电视剧《大军师司马懿之军师联盟》、《虎啸龙吟》中的主要角色之一,由张钧甯饰演。20岁,是曹丕赏赐司马懿的美人,也是曹丕的眼线,被送入司马府中为妾室。柔弱美貌、心机极深。", + caoxian: "曹宪(生卒年不详),女,沛国谯县(今安徽省亳州市)人。东汉末年历史人物,汉献帝刘协嫔妃,魏武帝曹操女儿。建安十八年,嫁给汉献帝刘协,受封为贵人。黄初元年(220年),兄弟曹丕称帝后,汉献帝成为山阳公,不知所终。", + zhangjian: "张臶(136年-240年),字子明,钜鹿人。汉末三国时期隐士、音乐家,精通谶纬之学。张臶生活的年代从东汉一直到曹魏齐王时期,受到朝廷多次征召,一直回避,不愿做官。他活了一百零五岁,是三国时期有可靠记载的最长寿的人之一。", + puyuan: "蒲元是三国时蜀汉杰出的工匠。为诸葛亮造刀三千口,并且制作木牛流马。后来姜维为他写过两部传记《蒲元传》《蒲元别传》。", + guanlu: "管辂(209年-256年),字公明,平原(今山东德州平原县)人。三国时期曹魏术士。年八九岁,便喜仰观星辰。成人后,精通《周易》,善于卜筮、相术,习鸟语,相传每言辄中,出神入化。体性宽大,常以德报怨。正元初,为少府丞。北宋时被追封为平原子。管辂是历史上著名的术士,被后世奉为卜卦观相的祖师。", + gexuan: "葛玄(164年-244年),汉族,吴丹阳郡句容县都乡吉阳里人(今句容市),祖籍山东琅琊,三国著名高道,道教灵宝派祖师。字孝先,号仙翁,被尊称为“葛天师”。道教尊为葛仙翁,又称太极仙翁,与张道陵、许逊、萨守坚共为四大天师。为汉下邳僮侯葛艾后裔,祖葛矩,安平太守,黄门郎;从祖葛弥,豫章第五郡太守。父葛焉,字德儒,州主簿,山阴令,散骑常侍,大尚书。随左慈学道,得《太清丹经》、《黄帝九鼎神丹经》、《金液丹经》等道经。曾采药海山,吴嘉禾二年(233年),在閤皂山修道建庵,筑坛立炉,修炼九转金丹。喜好遨游山川,去过括苍山、南岳山、罗浮山。编撰《灵宝经诰》,精研上清、灵宝等道家真经,并嘱弟子世世箓传。", + wulan: "吴兰(?~218年),青州(今山东潍坊市)人。东汉末年将领。初为益州牧刘璋部将,后来归降刘备。汉中之战中,与马超、张飞各领一军,驻扎于下辩。建安二十三年,为曹操将领曹洪、张郃所败,退回汉中。途中,为阴平氐族首领强端所杀。", + leitong: "雷铜(?-218年),阴平(今甘肃文县)人,氐族,东汉末年益州名将。本属益州牧刘璋麾下。刘备攻取益州后,归刘备麾下。参加汉中之战,为魏将张郃所杀。", + huaman: "花鬘,古典戏曲《龙凤巾》(一名《化外奇缘》)中的人物,身份为三国时期南蛮王孟获与祝融夫人的女儿,关索的夫人之一。在关于关三小姐·关银屏的民间传说中,其名字为“花中秀”,与关索其他几位夫人鲍三娘、王桃、王悦都被关索之姐关银屏编入自己的女兵营中。花鬘在《三国志》,《三国演义》均未有提及,只是戏曲中的虚构人物。其形象并非一般君主家中闺秀,而是与其母祝融相似,是一个可以披甲上阵,善于刀枪作战的女武将。戏曲中在诸葛亮平定南蛮时,花鬘曾与关索作战,失败被俘,两人互生爱意,南蛮王孟获降服后二人成婚。近些年,花鬘接连在各类三国题材的游戏中登场,更广被人知晓。", + wangshuang: "王双(?-228年),三国时期曹魏将领。蜀汉建兴六年(228年)冬,诸葛亮出散关,攻陈仓,后粮尽而退。王双率领骑兵追击蜀军,但在与蜀军的交战中被击败,王双也被蜀军所斩。在《三国演义》中,王双字子全,是陇西郡狄道县(今甘肃临洮县)人,有万夫不当之勇。在诸葛亮北伐期间,被魏延所斩。", + wenyang: "文俶(238年—291年),一作文淑,字次骞,小名阿鸯,世称文鸯,谯郡(今安徽亳州市)人。魏末晋初名将,曹魏扬州刺史文钦之子。骁勇善战,依附大将军曹爽,效忠于王室。司马师废黜皇帝曹芳后,随父联合毌丘俭于淮南起兵勤王。兵败之后,向南投奔吴国。诸葛诞发动淮南叛乱,奉命率军驰援。双方发生内讧,父亲为诸葛诞所害,遂降于司马昭,封关内侯。西晋建立后,任平虏护军。咸宁三年(277年),拜平西将军、都督凉秦雍州三州军事,大破鲜卑首领秃发树机能,名震天下,迁使持节、护东夷校尉、监辽东军事。八王之乱中,为诸葛诞外孙、东安王司马繇所诬杀,惨遭灭族,时年五十四岁。", + liubian: "刘辩(176年-190年3月6日),是汉灵帝刘宏与何皇后的嫡长子。刘辩在灵帝驾崩后继位为帝,史称少帝,由于年幼,实权掌握在临朝称制的母亲何太后和母舅大将军何进手中。少帝在位时期,东汉政权已经名存实亡,他即位后不久即遭遇以何进为首的外戚集团和以十常侍为首的内廷宦官集团这两大敌对政治集团的火并,被迫出宫,回宫后又受制于以“勤王”为名进京的凉州军阀董卓,终于被废为弘农王,成为东汉唯一被废黜的皇帝,其同父异母弟陈留王刘协继位为帝,是为汉献帝。被废黜一年之后,刘辩在董卓胁迫下自尽,时年仅十五岁(一说十八岁),其弟献帝追谥他为怀王。中国古代的史书中称刘辩为皇子辩、少帝和弘农王等。因为在位不逾年,传统上称东汉共十二帝,刘辩与东汉另一位少帝刘懿都不在其中,亦皆无本纪;不过,现代史学界也有观点承认两位少帝均是汉朝皇帝,则刘辩为东汉第十三位皇帝。", + guozhao: "郭照,电视剧《军师联盟》中的女主角之一,由唐艺昕饰演。原型为文德皇后郭氏(字女王),魏国皇后,张春华的义妹,深爱曹丕,替甄宓抚育曹叡,因甄宓之死被曹叡记恨,曹丕死后,成为皇太后,被曹叡逼上死路。自尽身亡。", + fanyufeng: "樊夫人,东汉末年人物,昔桂阳太守赵范寡嫂。赵云随刘备平定江南四郡后,刘备以赵云为桂阳太守。赵范居心叵测,要将自己的嫂嫂樊氏嫁给赵云,但遭到赵云的拒绝。后来,赵范逃走,樊氏也下落不明。2001年,应日本日中青少年文化中心成立50周年之邀,北京京剧院赴日进行40场巡回演出,这次访日的剧目都不同程度地进行了加工改编,以符合日本观众的需求。《取桂阳》是根据老本重新排演的,叶金援饰赵云,王怡饰樊玉凤。剧中的樊玉凤成为文武双全的巾帼英雄,被赵云收降,后来在《龙凤呈祥》中也参与堵截东吴的追兵。", + ruanyu: "阮瑀(约165—212年),字元瑜,陈留尉氏(今河南开封市尉氏县)人,是东汉末年文学家,建安七子之一。阮瑀所作章表书记很出色,当时军国书檄文字,多为阮瑀与陈琳所拟。名作有《为曹公作书与孙权》。诗有《驾出北郭门行》,描写孤儿受后母虐待的苦难遭遇,比较生动形象。年轻时曾受学于蔡邕,蔡邕称他为“奇才”。后徙为丞相仓曹掾属。诗歌语言朴素,往往能反映出一般的社会问题。阮瑀的音乐修养颇高,他的儿子阮籍,孙子阮咸皆当时名人,位列“竹林七贤”,妙于音律。明人辑有《阮元瑜集》。", + yangwan: "杨氏(婉字出自小说,史书无记载),生卒年不详,东汉末年凉州人。早年嫁于东汉前将军、槐里侯马腾之子马超,追随马超转战并州、雍州、凉州,为马超生下子嗣。公元212年,马超联军在渭南战败后,杨婉随马超逃亡凉州,很快马超反攻吞并陇上诸郡县。公元213年,杨婉为了帮助马超,结识王异,了解马超这些投降部下。可惜被王异蛊惑,遭致马超大败。自己和孩子都被赵衢、梁宽杀害。", + zhouyi: "周夷,游卡桌游旗下产品《三国杀》自行杜撰的人物。设定为周瑜的妹妹,和周瑜一同征战。", + caojinyu: "金乡公主,本姓曹氏,名字不详,沛国谯县(今安徽省亳州市)人。魏武帝曹操的女儿,母为杜夫人。适婚的时候,嫁给曹操的养子何晏。高平陵之变,何晏作为大将军曹爽的党羽,遭到太傅司马懿处死。在何晏母亲尹夫人苦苦哀求下,何晏的儿子得以保全。", + wufan: "吴范(?-226年),字文则,会稽上虞(今浙江绍兴上虞区)人。三国时期孙吴官员,擅长术数。与刘惇、赵达、严武、曹不兴、皇象、宋寿和郑妪合称“吴中八绝”。吴范以推算天象节气和观察气候闻名于郡中。孙权起于东南,他委身事奉,每推算灾祥多应验,遂显名。孙权委以骑都尉,领太史令。初,孙权为将军时,他曾说江南有王气。及孙权立为吴王,论功行封,欲以为都亭侯,但因不愿将其术要诀告知孙权,为权所怨恨,被除名。黄武中,病死。", + caomao: "曹髦(241年11月15日-260年6月2日),字彦士,沛国谯县(今安徽省亳州市)人,魏文帝曹丕之孙,东海王曹霖之子,曹魏第四位皇帝(254年11月1日-260年6月2日)。正始二年(241年),生于东海王宫,自幼聪明好学,才慧早成,正始五年(244年),封为高贵乡公,嘉平六年(254年),大将军司马师废除齐王曹芳后,拥立为帝,年号正元,曹髦文才武略,崇拜少康,不满司马氏专权秉政,甘露五年(260年),亲自讨伐司马昭,为太子舍人成济所弑,年仅十九岁,以王礼葬于洛阳西北。曹髦擅长诗文,创制了九言诗,传世文章有《伤魂赋并序》《颜子论》等。爱好儒学,亲赴太学论道,著有《春秋左氏传音》(失传)。精通绘画,一说为中国第一位成为画家的皇帝,唐张彦远《历代名画记》目曹髦为中品。", + laiyinger: "来莺儿,是个传说中的人物,正史及古代典籍并无记载。相传来莺儿是东汉歌妓,建安年间洛阳名妓,后爱上曹操的侍卫王图,王图因延误军机而押赴刑场,当时来莺儿奋不顾身以己命换王图一死。新编古装潮剧《曹营恋歌》,秦腔《雀台歌女》讲述了歌女来莺儿与情人王图及曹操三人之间催人泪下的故事。", + caohua: "曹华,东汉末年人物,曹操之女,为汉献帝妃嫔。建安十八年(213年),曹操进为魏公,把曹宪、曹节、曹华三个女儿,一齐都送给汉献帝刘协做了妃子,皆封为夫人,聘以束帛五万匹,年龄尚小者在魏公国待年长而聘。", + zhaoang: "赵昂,字伟章(一作伟璋),天水冀人。汉末时曹操部下。初为羌道令,建安中转参军事徒居州治冀城。建安十八年,马超围冀城多天,城中饥困,凉州刺史韦康不愿百姓再受苦而打算投降,赵昂进劝但不为所纳。后马超背信弃义杀韦康并劫其子赵月为人质,把他送至南郑。欲以此要迫使赵昂为己所用。后与梁宽、赵衢、庞恭、杨阜等结谋为康报仇,并举兵讨伐马超。马超兵败遂弃城,投奔张鲁。得张鲁之援后马超于建安十九年复寇,赵昂与妻子王异坚守祁山三十天至夏侯渊的救兵解围,其子赵月终为马超斩杀。自冀城之难,至于祁山,赵昂出九奇策。", + liuhui: "刘徽(约225年—约295年),汉族,山东滨州邹平市人,魏晋期间伟大的数学家,中国古典数学理论的奠基人之一。在中国数学史上作出了极大的贡献,他的杰作《九章算术注》和《海岛算经》,是中国最宝贵的数学遗产。刘徽思想敏捷,方法灵活,既提倡推理又主张直观。他是中国最早明确主张用逻辑推理的方式来论证数学命题的人。刘徽的一生是为数学刻苦探求的一生。他虽然地位低下,但人格高尚。他不是沽名钓誉的庸人,而是学而不厌的伟人,他给我们中华民族留下了宝贵的财富。2021年5月,国际天文学联合会(IAU)批准中国在嫦娥五号降落地点附近月球地貌的命名,刘徽(liuhui)为八个地貌地名之一。", + zhangfen: "张奋,徐州彭城(今江苏徐州)人。三国时期孙吴将领,辅吴将军张昭的侄子。善于制作攻城器械。在步骘举荐下,担任将军,累迁平州都督,册封乐乡亭侯,病逝于任上。", + dukui: "杜夔,字公良,河南人,擅长音律,聪明过人。管弦等各种乐器,他无所不能。他长期总管歌舞音乐,精心研究,继承复兴了前代古乐,并有所创新。仕于曹操、曹丕之世,以通晓音乐称于世。早年任雅乐郎,汉中平五年(188年),因病离职。州郡的司徒以礼相请,他因时世混乱而奔荆州。荆州牧刘表的儿子刘琮投降曹操后,曹操以杜夔为军谋祭酒 ,参与太乐署之事,令他创制雅乐。魏文帝曹丕黄初年间,任太乐令、协律都尉。", + quanhuijie: "全皇后(244年-301年),吴郡钱塘(今浙江杭州)人,吴废帝孙亮的皇后,全尚之女,母孙恭之女。吴大帝长女全公主的侄孙女。赤乌十三年(250年),因全公主推荐全氏被册为孙亮的太子妃,建兴二年(253年),全氏被立为皇后。太平三年(258年),孙亮被权臣孙綝贬为会稽王,全皇后也一同贬为会稽王夫人。永安三年(260年),全皇后随夫到侯官,孙亮在途中死去,全皇后在侯官居住二十余年,吴亡后返回吴郡,永宁元年(301年)去世。", + dingshangwan: "丁尚涴,又名丁夫人。东汉末年权臣曹操的原配夫人。丁尚涴嫁给曹操时,曹操另有刘夫人,生长子曹昂和清河长公主。后刘夫人早亡,曹昂便由丁尚涴抚养,丁尚涴视其为己出。
    建安二年(公元197年),曹昂随军出征宛城,战死沙场。丁尚涴悲痛欲绝,口出怨言数落曹操,又悲啼不止。曹操恼羞成怒,将其打发回了娘家。不久之后,心生悔意的曹操亲自前往丁家,打算将丁尚涴接回。然而丁尚涴却只是闷头织布。曹操手抚其背,说:“顾我共载归乎!”丁尚涴依旧不理不睬。曹操走到门口,又回过头:“得无尚可邪!”然而依旧得不到回应,只得感叹:“真诀矣。”于是与之和离,并让丁家允许她改嫁,丁家不敢为之。
    丁尚涴去世后,卞夫人请求曹操安葬她,于是葬在许城以南。后来曹操病重,知道自己时日无多,临终前叹道:“我前后行意,于心未曾有所负也。假令死而有灵,子修若问‘我母所在’,我将何辞以答!”", + luyi: "卢弈,游卡桌游《三国杀》中虚构的人物。设定为卢植之女。至情至孝。其人虽体弱多病,然而却天资聪颖,有过目不忘、出口成章之才。先后拜蔡邕、王允等人为师,纳诸家之长融会贯通。又善弈棋,曾与当时国手山子道、王九真、郭凯对弈,不分胜负,一时之间名动京华,被太学征辟为女博士,世人皆称其为“女先生”。董卓之乱后,卢弈随父亲隐居乡野,创办上谷学宫,邀天下士子论道。相传诸葛亮、曹植、荀彧、张昭等人都参加过。各学派在卢弈主持下论道,成为一时佳话。后上谷学宫遭曹魏所忌,卢弈为请求曹叡赦免学宫,与司马懿对无棋之弈。卢弈破指凝血,以血为棋,终胜司马懿半子。但却旧伤复发,局终而陨。", + zhaozhi: "赵直,豫章人,生于公元175年左右,死年不详,字不详。为蜀汉官方占梦者。曾预言蒋琬位极人臣、何祗48岁去世、魏延离死期不远,后果一一应验。", + dongguiren: "董贵人(?—200年),父董承,汉献帝刘协妃嫔之一。董贵人父亲被曹操所杀,自己也受牵连。董贵人虽有身孕,汉献帝数次为她向曹操求情,仍被杀。", + zhujianping: "朱建平(生卒年不详),汉末三国时期沛国(今安徽省)人。精通相术,于街巷之间为人相面,效果非常灵验。三国时,他在街头巷尾给人们看相。曹丕做五官将时,请他看相,朱建平说:将军寿命80,40会有小难,愿您多多保护。 又说曹彪:您居于自己的封国,到57当遭兵灾,要好好提防此事。 结果曹丕40去世,曹彪57岁时,犯了与王凌合谋罪,被赐死。他的妙算,都这么准确,即使是唐举,许负也比不上。时人将他与平原郡相士管公明并称为“朱”、“管”。", + yuanji: "袁氏(生卒年不详),汝南郡汝阳县(今河南商水)人,袁术之女,孙权妃嫔。袁夫人出身世家大族汝南袁氏,其父袁术败亡后,入吴宫拜为夫人,以节操品行着称。", + chengbing: "程秉(生卒年不详),字德枢,汝南南顿(今河南项城西)人。三国时期吴国官员、儒学家。起初跟随郑玄,后来北方荒乱而到交州避难,期间与刘熙考究五经大义,因此通绕五经。后来交趾太守士燮任命程秉为长史。吴大帝孙权听闻程秉的名声,于是以礼征召他,程秉到后,被任命为太子太傅。黄武四年(225年),孙权为太子孙登娶周瑜之女为妃,程秉以太常身份于吴郡迎候,孙权亲身上程秉的船,可见孙权对他的极为礼待。程秉又教诲孙登对婚后相处要尊重儒家礼教。后来因病在任职期间逝世。著有《周易摘》、《尚书驳》、《论语弼》,凡三万余言。", + dc_zhouxuān: "周宣,生卒年不详,字孔和,乐安(治今山东高苑西北)人,擅长解梦,在郡做官时曾为太守解过梦,后又给曹丕解梦,都灵验。官至中郎,死于魏明帝末年。", + xuelingyun: "薛灵芸,东晋王嘉志怪小说《拾遗记》中的人物,魏文帝曹丕的宫人,妙于针工,虽处于深帷之内,不用灯烛之光,裁制立成。凡不是薛灵芸缝制的衣服,文帝一概不穿,宫中号为针神。薛灵芸的故事在正史中虽无记载,却由于许多野史笔记偶尔提及,如《拾遗记》、《太平广记》、《艳异编》等,渐于后世成为中国古代著名美女形象。", + yanghong: "杨弘,东汉末年袁术部将。袁术死后,杨弘等将其众欲归孙策,后庐江太守刘勋截击,转归于勋。", + xielingyu: "谢夫人,会稽山阴(今浙江省绍兴市)人,东汉尚书郎、徐令谢煚之女,吴大帝孙权的原配发妻,又称谢妃。深受孙权宠爱,爱幸有宠。后来孙权为了巩固江东政权,又纳徐氏,欲让谢夫人屈居其下。谢夫人不同意,失志早卒。谢夫人的弟弟是三国著名史学家、武陵太守谢承。豫章太守谢斐与谢夫人同宗同族。", + zerong: "笮融(?—195年),丹杨(治今安徽宣城)人,东汉末年豪强,生性残暴却笃信佛教,为佛教在中国的发展做出了很大贡献。东汉末年投奔徐州刺史陶谦,督管下邳、彭城、广陵三郡运粮。将其中大量物资占为己有累积财力,遂在徐州一带大规模崇佛,修建豪华佛寺,铸造金铜大佛,衣以锦彩,并举行浴佛节,招揽信徒万余人。其崇佛活动奠定了中国大型佛事活动的基础。后又投奔赵昱、薛礼、朱皓并将他们杀害,扬州牧刘繇因此兴兵讨伐笮融。笮融兵败后逃入深山,由于当地山民同样对他恨之入骨,便联手搜捕、杀死笮融,并将他的首级献给刘繇。", + huanfan: "桓范(?~249年),字元则,沛郡龙亢县(今安徽省怀远县龙亢镇)人。三国时期曹魏大臣、文学家、画家。建安末年,担任丞相府掾,联合王象等共同撰写《皇览》。延康元年,担任羽林左监。魏明帝时,历任中领军、尚书,出任征虏将军、东中郎将、兖州刺史等。正始年间,授大司农,为大将军曹爽出谋划策,号称“智囊 ”。高平陵政变(249年)发生后,力劝曹爽挟带皇帝曹芳进入许昌,没有得到采纳,最终被太傅司马懿诛杀。桓范颇有文才,著有《世要论》(《桓范新书》)。善于画画,唐朝张彦远《历代名画记》目为中品。", + sunyu: "孙瑜(177年-215年),字仲异,吴郡富春(今浙江富阳)人,孙坚之弟孙静的次子,孙权的堂兄。官至奋威将军、丹杨太守。孙瑜初以恭义校尉的身份统领士兵,曾跟随周瑜、孙权等人征战,擅于安抚部下、招降纳顺。孙瑜爱读古籍,又请学者马普来为将领官员的子弟讲学,于是东吴开始设立学官。215年,孙瑜去世,时年三十九岁。", + xizheng: "郤正(?-278年),本名郤纂,字令先,司州河南郡偃师县(今河南省偃师市)人,三国蜀汉至西晋时期学者、官员。少好学,广读古籍。弱冠即善写文章,为蜀汉朝廷征为秘书吏,官至秘书令。公元263年(景耀六年),曹魏攻伐蜀汉,后主刘禅投降,郤正为之撰写投降书。后随刘禅前往洛阳,受封关内侯,又得到晋武帝司马炎赏识,任巴西郡太守,公元278年(咸宁四年)去世。郤正为人不重名利,曾作《释讥》,表明自己淡泊之心境;又醉心于文学,共作诗歌、论著、辞赋等近百篇,但多散佚于后世。", + zhangjinyun: "张瑾云,张星彩的妹妹,刘禅的第二任皇后,238年正月立为皇后。景耀六年(263年),蜀汉灭亡,刘禅被俘,此后,受封为安乐公。张皇后也随之成为安乐公夫人,咸熙元年(264年),随刘禅到洛阳。", + duanqiaoxiao: "段巧笑,三国时代魏国魏文帝时的宫人,甚受到魏文帝的宠爱。传说她以原有的化妆品中的米粉和胡粉,再加入葵花子汁,发明了女性化妆用的脂粉。", + ruanji: "阮籍(公元210年~263年),字嗣宗,陈留尉氏(今河南省开封市)人,三国时期魏国诗人、竹林七贤之一。阮瑀之子,门荫入仕,累迁步兵校尉,世称阮步兵。崇奉老庄之学,政治上则采取谨慎避祸的态度。景元四年(公元263年),阮籍去世,享年五十三岁。作为“正始之音”的代表,著有《咏怀八十二首》、《大人先生传》等,其著作收录在《阮籍集》中。", + ganfurenmifuren: "甘夫人,刘备起兵后于沛城娶之为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。
    糜夫人,刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。", + sunlingluan: "孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。", + zhoubuyi: "周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。", + tianshangyi: "田尚衣,一作陈尚衣,魏文帝曹丕宫中著名宫人。能歌善舞,一时冠绝于世,私以为比之汉宫飞燕也不遑多让。", + malingli: "马伶俐,游卡桌游原创角色,设定上为,马超之女,其身形虽娇小,却继承了马超英勇略带冲动的个性,活泼阳光,调皮伶俐,爱摆弄爆竹烟花一类的小器具,包包里经常放置用五色彩纸包装的小炸弹球。马伶俐从小跟随马超和马云騄学习战斗技巧,战斗力超强,坚强的意志和勇气也得到了提升,同时擅长马术,有一匹可爱的小白马伴随其身边。后马伶俐成年,嫁与刘备之子刘理,获封梁王妃。两人琴瑟相和,极为恩爱,常结伴出游,被人誉为天作之合。", + zhugeruoxue: "诸葛氏(“若雪”为网络小说虚构),诸葛亮的二姐,庞山民之妻。", + zhugemengxue: "诸葛氏(“梦雪”为网络小说虚构),诸葛亮的大姐。", + caoyi: "曹轶,游卡桌游旗下产品《三国杀》原创角色。设定上为曹纯所收养的孙女,从小受到曹纯的教导,在军营中长大,性情坚毅有担当,军事谋略丰富,战斗能力超强。曹轶喜欢美食,特别是甜食,并且擅长制作各种点心。她身边跟随的雪白小老虎是曹纯在她及笄时送的生辰礼物,希望她如小老虎一样,英勇无畏。曹轶与曹婴交好,两人以姐妹相称。曹轶成年后继承祖父衣钵,接手精锐部队“虎豹骑”,成为新的虎豹骑的统领者。", + huzun: "胡遵(?~256年),安定临泾(今甘肃省镇原县)人,三国时期曹魏大臣,官至卫将军,封阴密侯。出身安定胡氏。历任征东将军、征东大将军、卫将军等职。早年由张既征辟。后追随司马懿,参与平定匈奴胡薄居姿职叛乱、抵御诸葛亮北伐、平定公孙渊叛乱。嘉平四年(252年),作为曹魏三征之一的征东将军,主持征讨东吴,被诸葛恪击败。正元元年(255年)参与平定淮南三叛的第二叛毌丘俭、文钦之乱,事后升任卫将军。甘露元年(256年)秋七月己卯去世,追赠车骑将军。", + guanyue: "关樾,传说记载之人物,声称是关羽之孙,关平长子。未见载于正史,仅记载于清朝地方志以及传说。清·《江陵县志》:“娶镇东将军女赵氏。生子樾,世居江陵。”。清·《关氏宗谱·江陵县儒学册结》:“平子樾,因守祖、父陵墓遂家于荆州焉,此荆州之关氏所由来也。”", +}; + +export default characterIntro; diff --git a/character/xianding/pinyin.js b/character/xianding/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/xianding/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/xianding/skill.js b/character/xianding/skill.js new file mode 100644 index 000000000..a05a72fc2 --- /dev/null +++ b/character/xianding/skill.js @@ -0,0 +1,16574 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //关樾 + dcshouzhi: { + audio: 2, + trigger: { + global: "phaseEnd", + }, + filter(event, player) { + let delt = 0; + player.checkHistory("lose", evt => { + delt -= evt.hs.length; + }); + player.checkHistory("gain", evt => { + delt += evt.cards.length; + }); + return delt < 0 || (delt > 0 && player.countCards("h")); + }, + locked(skill, player) { + return player && player.storage.dcshouzhi_modified; + }, + derivation: ["dcshouzhi_modified"], + onremove: ["dcshouzhi_modified"], + async cost(event, trigger, player) { + let delt = 0; + player.checkHistory("lose", evt => { + delt -= evt.hs.length; + }); + player.checkHistory("gain", evt => { + delt += evt.cards.length; + }); + const forced = !player.storage.dcshouzhi_modified; + if (delt < 0) { + const bool = forced ? true : await player.chooseBool(get.prompt("dcshouzhi"), "你可以摸两张牌。").forResultBool(); + event.result = { bool }; + } else { + const next = player.chooseCard("守执:请弃置一张手牌").set("filterCard", (card, player) => { + return lib.filter.cardDiscardable(card, player, "dcshouzhi"); + }); + next.set("forced", forced); + if (!forced) { + next.set("prompt", get.prompt("dcshouzhi")) + .set("prompt2", "你可以弃置一张手牌。") + .set("ai", card => { + const player = get.player(); + if (player.hasSkill("dcxingmen") && get.recoverEffect(player, player) > 0) return 6 - get.value(card); + return 0; + }); + } + event.result = await next.forResult(); + } + }, + async content(event, trigger, player) { + const { cards } = event; + if (cards && cards.length) await player.discard(cards); + else await player.draw(2); + await game.asyncDelayx(); + }, + }, + dcfenhui: { + audio: 2, + enable: "phaseUse", + limited: true, + filterTarget(card, player, target) { + const list = get.event("dcfenhui_enabled"); + if (!list || !list.length) return false; + return list.includes(target); + }, + onChooseToUse(event) { + if (game.online) return; + const player = event.player; + const evts = player.getAllHistory("useCard", evt => { + return get.color(evt.card, player) === "black" && evt.targets && evt.targets.length; + }); + event.set( + "dcfenhui_enabled", + game.filterPlayer(current => { + return evts.filter(evt => evt.targets.includes(current)).length; + }) + ); + }, + skillAnimation: true, + animationColor: "fire", + derivation: ["dcxingmen"], + async content(event, trigger, player) { + player.awakenSkill("dcfenhui"); + const target = event.target; + const count = player.getAllHistory("useCard", evt => { + return get.color(evt.card, player) === "black" && evt.targets && evt.targets.includes(target); + }).length; + target.addMark("dcfenhui_mark", Math.min(5, count)); + player.addSkill("dcfenhui_effect"); + }, + subSkill: { + effect: { + audio: "dcfenhui", + trigger: { + source: "damageBegin1", + global: "die", + }, + filter(event, player) { + return event.player.hasMark("dcfenhui_mark"); + }, + logTarget: "player", + forced: true, + charlotte: true, + async content(event, trigger, player) { + if (trigger.name === "damage") { + trigger.player.removeMark("dcfenhui_mark", 1); + trigger.num++; + } else { + await player.loseMaxHp(); + player.storage.dcshouzhi_modified = true; + await player.addSkills("dcxingmen"); + } + }, + }, + mark: { + marktext: "恨", + intro: { + name: "恨(奋恚)", + name2: "恨", + content: "mark", + }, + }, + }, + ai: { + order: 6, + result: { + target(player, target) { + if ( + !player.hasCard(card => { + return get.tag(card, "damage") && player.canUse(card, target, true, true) && get.effect(target, card, player, player) > 0; + }, "hs") + ) + return 0; + const count = Math.min( + 5, + player.getAllHistory("useCard", evt => { + return get.color(evt.card, player) === "black" && evt.targets && evt.targets.includes(target); + }).length + ); + let value = Math.max(player.getHp(true), 3) - count; + if ( + (count - 1) * + (target.hasSkillTag("filterDamage", null, { + player: player, + }) + ? 1 + : 2) >= + target.getHp(true) + + target.countCards("hs", card => { + return target.canSaveCard(card, target); + }) + ) + value -= 2; + return Math.min(0, value); + }, + }, + }, + }, + dcxingmen: { + audio: 2, + trigger: { + player: "loseAfter", + }, + filter(event, player) { + return event.getParent(2).name === "dcshouzhi" && player.isDamaged(); + }, + frequent: true, + prompt2: "你可以回复1点体力。", + group: ["dcxingmen_norespond"], + check(event, player) { + return get.recoverEffect(player, player) > 0; + }, + async content(event, trigger, player) { + await player.recover(); + }, + subSkill: { + norespond: { + audio: "dcxingmen", + trigger: { + player: "gainAfter", + }, + filter(event, player) { + return event.getParent().name === "draw" && event.cards.length >= 2 && event.cards.every(card => get.color(card) === "red"); + }, + forced: true, + locked: false, + popup: false, + async content(event, trigger, player) { + player.addGaintag(trigger.cards, "dcxingmen"); + player.addSkill("dcxingmen_directHit"); + }, + }, + directHit: { + audio: "dcxingmen", + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + filter(event, player) { + return player.hasHistory("lose", evt => { + if (evt.getParent() !== event) return false; + return Object.values(evt.gaintag_map).some(tags => tags.includes("dcxingmen")); + }); + }, + async content(event, trigger, player) { + trigger.directHit.addArray(game.filterPlayer()); + game.log(trigger.card, "不可被响应"); + }, + }, + }, + }, + //武关羽 + dcjuewu: { + audio: 2, + enable: "chooseToUse", + filter(event, player) { + if ( + !player.hasCard(card => { + return _status.connectMode || get.number(card) === 2; + }, "hes") + ) + return false; + for (const name of ["shuiyanqijuny"].concat(lib.inpile)) { + if (player.getStorage("dcjuewu_used").includes(name)) continue; + const card = get.autoViewAs({ name }, "unsure"); + if (!get.tag(card, "damage")) continue; + if (event.filterCard(card, player, event)) return true; + if (name === "sha") { + for (const nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; + } + } + } + return false; + }, + hiddenCard(player, name) { + if (!lib.inpile.includes(name)) return false; + if (player.getStorage("dcjuewu_used").includes(name)) return false; + if ( + !player.hasCard(card => { + return _status.connectMode || get.number(card) === 2; + }, "hes") + ) + return false; + return get.tag({ name }, "damage"); + }, + group: "dcjuewu_inTwo", + chooseButton: { + dialog(event, player) { + let list = get.inpileVCardList(info => { + return get.tag({ name: info[2] }, "damage"); + }); + if (!list.some(info => info[2] === "shuiyanqijuny")) list.add(["锦囊", "", "shuiyanqijuny"]); + list = list.filter(info => { + const name = info[2], + nature = info[3]; + if (player.getStorage("dcjuewu_used").includes(name)) return false; + const card = get.autoViewAs({ name, nature }, "unsure"); + return event.filterCard(card, player, event); + }); + return ui.create.dialog("绝武", [list, "vcard"]); + }, + check(button) { + if (get.event().getParent().type != "phase") return 1; + const player = get.player(); + return player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }, + backup(links, player) { + return { + audio: "dcjuewu", + filterCard(card, player) { + return get.number(card) === 2; + }, + position: "hes", + check(card) { + return 8 - get.value(card); + }, + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + }, + precontent() { + if (!player.storage.dcjuewu_used) { + player.when({ global: "phaseAfter" }).then(() => { + delete player.storage.dcjuewu_used; + }); + } + player.markAuto("dcjuewu_used", event.result.card.name); + }, + }; + }, + prompt(links, player) { + return "将一张点数为2的牌当" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + subSkill: { + backup: {}, + inTwo: { + audio: "dcjuewu", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + filter(event, player) { + const cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer(current => { + if (current === player) return false; + const evt = event.getl(current); + return evt && evt.hs.length + evt.es.length + evt.js.length > 0; + }); + }, + forced: true, + locked: false, + async content(event, trigger, player) { + player.addGaintag(trigger.getg(player), "dcjuewu_two"); + player.addSkill("dcjuewu_two"); + }, + }, + two: { + charlotte: true, + mod: { + cardnumber(card) { + if (card.hasGaintag("dcjuewu_two")) return 2; + }, + }, + }, + }, + ai: { + fireAttack: true, + respondSha: true, + skillTagFilter(player) { + if ( + !player.hasCard(card => { + return _status.connectMode || get.number(card) === 2; + }, "hes") + ) + return false; + }, + order: 1, + result: { + player(player) { + if (get.event("dying")) return get.attitude(player, get.event("dying")); + return 1; + }, + }, + }, + }, + dcwuyou: { + audio: 2, + global: "dcwuyou_g", + subSkill: { + g: { + audio: "dcwuyou", + enable: "phaseUse", + usable: 1, + filter(event, player) { + if (!player.countCards("h")) return false; + return game.hasPlayer(current => { + return current.hasSkill("dcwuyou"); + }); + }, + filterCard: true, + filterTarget(card, player, target) { + return target.hasSkill("dcwuyou"); + }, + selectTarget() { + const count = game.countPlayer(current => { + return current.hasSkill("dcwuyou"); + }); + return count > 1 ? 1 : -1; + }, + check(card) { + const player = get.player(); + const hasFriend = game.hasPlayer(current => { + return current.hasSkill("dcwuyou") && get.attitude(player, current) > 0; + }); + return (hasFriend ? 7 : 1) - get.value(card); + }, + prompt() { + const player = get.player(), + list = game.filterPlayer(current => { + return current.hasSkill("dcwuyou"); + }), + list2 = list.filter(current => current !== player); + const moreThanOne = list.length > 1, + includesMe = list.includes(player); + let str = "选择一张手牌,"; + if (includesMe) str += `点击“确定”,${moreThanOne ? "或" : ""}`; + if (moreThanOne || !includesMe) str += `将此牌交给${get.translation(list2)}${list2.length > 1 ? "中的一人" : ""},`; + str += "然后执行后续效果。"; + return str; + }, + discard: false, + lose: false, + delay: false, + async content(event, trigger, player) { + const { target } = event; + const isMe = target === player; + let { cards } = event; + if (!isMe) await player.give(cards, target); + const names = lib.inpile + .filter(name => { + return get.type2(name) !== "equip"; + }) + .randomGets(5); + if (names.includes("sha")) names.splice(names.indexOf("sha") + 1, 0, ...lib.inpile_nature.map(nature => ["sha", nature])); + const vcard = names.map(namex => { + let name = namex, + nature; + if (Array.isArray(namex)) [name, nature] = namex; + const info = [get.type(name), "", name, nature]; + return info; + }); + const links = await target + .chooseButton(["武佑:选择一个牌名", [vcard, "vcard"]], true) + .set("user", player) + .set("ai", button => { + const player = get.player(), + user = get.event("user"); + return user.getUseValue({ name: button.link[2], nature: button.link[3] }) * get.attitude(player, user); + }) + .forResultLinks(); + if (!links || !links.length) return; + const viewAs = { name: links[0][2], nature: links[0][3] }; + if (!isMe) { + cards = await target + .chooseToGive(player) + .set("ai", card => { + const player = get.event("player"), + target = get.event().getParent().player; + if (get.attitude(player, target) <= 0) return 0; + return 6 - get.value(card); + }) + .forResultCards(); + } + if (!cards) return; + const card = cards[0]; + if (player.getCards("h").includes(card)) { + if (!player.storage.dcwuyou_transfer) player.storage.dcwuyou_transfer = {}; + player.storage.dcwuyou_transfer[card.cardid] = viewAs; + player.addGaintag(cards, "dcwuyou_transfer"); + player.addSkill("dcwuyou_transfer"); + } + }, + ai: { + order: 10, + result: { + player(player, target) { + if (get.attitude(player, target) > 0) return 1; + return 0; + }, + target: 0.5, + }, + }, + }, + transfer: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + if (event.addCount === false) return false; + return player.hasHistory("lose", evt => { + if (evt.getParent() != event) return false; + for (const i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcwuyou_transfer")) return true; + } + return false; + }); + }, + async content(event, trigger, player) { + trigger.addCount = false; + const stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] === "number") stat[name]--; + }, + mod: { + cardname(card, player) { + const map = player.storage.dcwuyou_transfer; + if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("dcwuyou_transfer")) return map[card.cardid].name; + }, + cardnature(card, player) { + const map = player.storage.dcwuyou_transfer; + if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("dcwuyou_transfer")) return map[card.cardid].nature || false; + }, + cardUsable(card) { + if (!card.cards) return; + if (card.cards.some(card => card.hasGaintag("dcwuyou_transfer"))) return Infinity; + }, + }, + }, + }, + }, + dcyixian: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "metal", + chooseButton: { + dialog(event, player) { + const dialog = ui.create.dialog("义贤:你可以选择一项", "hidden"); + dialog.add([ + [ + ["field", "获得场上的所有装备牌"], + ["discardPile", "获得弃牌堆中的所有装备牌"], + ], + "textbutton", + ]); + return dialog; + }, + check(button) { + const player = get.player(); + if (button.link == "field") + return game + .filterPlayer() + .map(current => { + const cards = current.getCards("e"), + att = get.sgnAttitude(player, current); + return cards + .map(card => { + return Math.max(player.hasSkill("dcjuewu") ? 5 : 0, get.value(card, player)) - get.value(card, current) * att; + }) + .reduce((p, c) => p + c, 0); + }) + .reduce((p, c) => p + c, 0); + if (button.link == "discardPile") + return Array.from(ui.discardPile.childNodes) + .filter(card => { + return get.type(card) === "equip"; + }) + .map(card => { + return Math.max(player.hasSkill("dcjuewu") ? 5 : 0, get.value(card, player)); + }) + .reduce((p, c) => p + c, 0); + return 0.1; + }, + backup(links) { + return { + audio: "dcyixian", + filterCard: () => false, + selectCard: -1, + pos: links[0], + filterTarget: () => false, + selectTarget: -1, + skillAnimation: true, + animationColor: "metal", + async content(event, trigger, player) { + player.awakenSkill("dcyixian"); + const position = lib.skill.dcyixian_backup.pos; + let cards = []; + if (position === "field") { + cards.addArray( + game + .filterPlayer() + .map(current => current.getCards("e")) + .flat() + ); + } else { + cards.addArray( + Array.from(ui.discardPile.childNodes).filter(card => { + return get.type(card) === "equip"; + }) + ); + } + if (!cards.length) return; + await player.gain(cards, position === "field" ? "give" : "gain2"); + const pairs = game.filterPlayer().map(current => { + let lostNum = 0; + current.checkHistory("lose", evt => { + if (evt.getParent(2) === event) lostNum += evt.cards2.length; + }); + return [current, lostNum]; + }); + for (const pair of pairs) { + const [target, num] = pair; + if (!num) continue; + const bool = await player + .chooseBool(`是否令${get.translation(target)}摸${get.cnNumber(num)}张牌并回复1点体力?`) + .set("choice", get.effect(target, { name: "draw" }, player, player) + get.recoverEffect(target, player, player) / 5 > 0) + .forResultBool(); + if (bool) { + player.line(target, "green"); + await target.draw(num); + await target.recover(); + } + if (!event.isMine() && !event.isOnline()) await game.asyncDelayx(); + } + }, + }; + }, + prompt(links) { + return `点击“确定”,从${links[0] === "field" ? "场上" : "弃牌堆中"}获得所有装备牌`; + }, + }, + subSkill: { + backup: {}, + }, + ai: { + order: 10, + threaten: 2.9, + result: { + player(player) { + const enemies = game.filterPlayer(current => { + return get.rawAttitude(player, current) < 0 && get.attitude(player, current) >= 0; + }), + knownEnemies = game.filterPlayer(current => { + return get.attitude(player, current) < 0; + }); + if ((!knownEnemies.length && player.countCards("e") > 1) || (player.getHp() > 3 && enemies.length > 0 && knownEnemies.length < 2 && knownEnemies.length < enemies.length && !knownEnemies.some(enemy => get.attitude(player, enemy) <= -9))) return 0; + const val1 = game + .filterPlayer() + .map(current => { + const cards = current.getCards("e"), + att = get.sgnAttitude(player, current); + return cards + .map(card => { + return Math.max(player.hasSkill("dcjuewu") ? 5 : 0, get.value(card, player)) - get.value(card, current) * att; + }) + .reduce((p, c) => p + c, 0); + }) + .reduce((p, c) => p + c, 0); + const val2 = Array.from(ui.discardPile.childNodes) + .filter(card => { + return get.type(card) === "equip"; + }) + .map(card => { + return Math.max(player.hasSkill("dcjuewu") ? 5 : 0, get.value(card, player)); + }) + .reduce((p, c) => p + c, 0); + return Math.max(val1, val2) > 20 ? 4 : 0; + }, + }, + }, + }, + //SP甄宓 + dcjijie: { + audio: 2, + trigger: { + global: ["gainAfter", "loseAsyncAfter", "recoverAfter"], + }, + getIndex(event, player) { + if (event.name !== "loseAsync") return [[event.player]]; + return [ + game + .filterPlayer(current => { + return current !== player && _status.currentPhase !== current && event.getg(current).length > 0; + }) + .sortBySeat(), + ]; + }, + filter(event, player, triggername, targets) { + if (player.getStorage("dcjijie_used").includes(event.name == "recover" ? "recover" : "draw")) return false; + if (event.name === "recover") return targets[0] !== player && _status.currentPhase !== targets[0] && player.isDamaged(); + return targets.some(current => { + return current !== player && _status.currentPhase !== current && event.getg(current).length > 0; + }); + }, + forced: true, + logTarget(event, player, triggername, targets) { + return targets; + }, + async content(event, trigger, player) { + player.addTempSkill("dcjijie_used"); + if (trigger.name === "recover") { + player.markAuto("dcjijie_used", ["recover"]); + await player.recover(trigger.num); + } else { + const count = game.countPlayer(current => { + if (current === player || _status.currentPhase === current) return 0; + return trigger.getg(current).length; + }); + player.markAuto("dcjijie_used", ["draw"]); + await player.draw(count); + } + }, + subSkill: { + used: { + charlotte: true, + onremove: true, + }, + }, + }, + dchuiji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: true, + chooseButton: { + dialog(event, player) { + const name = get.translation(event.result.targets[0]); + const dialog = ui.create.dialog( + `惠济:请选择要令${name}执行的选项`, + [ + [ + ["draw", "令其摸两张牌"], + ["equip", "令其随机使用牌堆中的一张装备牌"], + ], + "textbutton", + ], + "hidden" + ); + return dialog; + }, + filter(button, player) { + const target = get.event().getParent().result.targets[0]; + const link = button.link; + if (button.link === "equip" && target.isMin()) return false; + return true; + }, + check(button) { + const player = get.player(), + target = get.event().getParent().result.targets[0]; + const link = button.link; + const att = get.attitude(player, target) / 5; + const hs = target.countCards("h"); + if (link === "draw") { + return (2 - (hs + 2 > game.countPlayer()) * hs) * att; + } + return (1.1 - (hs > game.countPlayer()) * hs) * att; + }, + backup(links) { + return { + audio: "dchuiji", + target: get.event().result.targets[0], + link: links[0], + filterTarget(card, player, target) { + return target === lib.skill.dchuiji_backup.target; + }, + selectTarget: -1, + async content(event, trigger, player) { + const link = lib.skill.dchuiji_backup.link; + const { target } = event; + if (link === "draw") await target.draw(2); + else { + const card = get.cardPile2(card => { + if (get.type(card) !== "equip") return false; + return target.canUse(card, target) && !get.cardtag(card, "gifts"); + }); + if (card) await target.chooseUseTarget(card, true).set("nopopup", true); + else { + game.log("但是牌堆里没有", target, "的装备!"); + await game.asyncDelayx(); + } + } + if (target.countCards("h") < game.countPlayer()) return; + player + .when({ global: "wuguRemained" }) + .filter(evt => { + return evt.getParent(3) === event; + }) + .vars({ originalOwner: target }) + .then(() => { + const remained = trigger.remained.filterInD("d"); + if (!remained.length) return event.finish(); + player.line(originalOwner); + originalOwner.gain(remained, "gain2"); + }); + await target.chooseUseTarget( + { + name: "wugu", + storage: { + fixedShownCards: target.getCards("h"), + }, + }, + true + ); + }, + }; + }, + prompt(links) { + return "点击“确定”以执行效果"; + }, + }, + subSkill: { + backup: {}, + }, + ai: { + order(item, player) { + if (!game.hasPlayer(current => current !== player && get.attitude(player, current) > 0) && game.hasPlayer(current => get.attitude(player, current) <= 0)) return 10; + if ( + game.hasPlayer(current => { + const del = player.countCards("h") - current.countCards("h"), + toFind = [2, 4].find(num => Math.abs(del) === num); + if (toFind === 4 && del < 0 && get.attitude(player, current) <= 0) { + return true; + } + return false; + }) + ) + return 10; + return 1; + }, + result: { + target(player, target) { + const del = player.countCards("h") - target.countCards("h"), + toFind = [2, 4].find(num => Math.abs(del) === num); + if (toFind) { + return (-del * (get.attitude(player, target) * Math.min(3, target.countCards("h"))) * toFind) / 10; + } + return -1; + }, + }, + }, + }, + //曹芳 + dczhimin: { + audio: 2, + trigger: { global: "roundStart" }, + filter(event, player) { + return game.hasPlayer(current => current != player && current.countCards("h")) && player.getHp() > 0; + }, + forced: true, + group: ["dczhimin_mark", "dczhimin_draw"], + async content(event, trigger, player) { + const targets = await player + .chooseTarget( + `置民:请选择至多${get.cnNumber(player.getHp())}名其他角色`, + "你获得这些角色各自手牌中的随机一张点数最小的牌", + (card, player, target) => { + return target !== player && target.countCards("h"); + }, + [1, player.getHp()], + true + ) + .set("ai", target => { + const player = get.player(); + return get.effect(target, { name: "shunshou_copy", position: "h" }, player, player) + 0.1; + }) + .forResultTargets(); + if (!targets || !targets.length) return; + targets.sortBySeat(trigger.player); + player.line(targets, "thunder"); + const toGain = []; + for (const target of targets) { + const cards = target.getCards("h"), + minNumber = cards.map(card => get.number(card)).sort((a, b) => a - b)[0]; + const gainableCards = cards + .filter(card => { + return get.number(card) === minNumber && lib.filter.canBeGained(card, player, target); + }) + .randomSort(); + toGain.push(gainableCards[0]); + } + if (toGain.length) await player.gain(toGain, "giveAuto"); + await game.asyncDelayx(); + }, + ai: { + threaten: 5.8, + }, + mod: { + aiOrder(player, card, num) { + if ( + num > 0 && + get.itemtype(card) === "card" && + card.hasGaintag("dczhimin_tag") && + player.countCards("h", cardx => { + return cardx.hasGaintag("dczhimin_tag") && cardx !== card; + }) < player.maxHp + ) + return num / 10; + }, + }, + subSkill: { + mark: { + audio: "dczhimin", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + forced: true, + filter(event, player) { + if (_status.currentPhase === player || !event.getg(player).some(card => get.position(card) === "h" && get.owner(card) === player)) return false; + return true; + }, + async content(event, trigger, player) { + player.addGaintag( + trigger.getg(player).filter(card => get.position(card) === "h" && get.owner(card) === player), + "dczhimin_tag" + ); + }, + }, + draw: { + audio: "dczhimin", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter(event, player) { + const evt = event.getl(player); + if (!evt.hs.length) return false; + return Object.values(evt.gaintag_map).flat().includes("dczhimin_tag"); + }, + async content(event, trigger, player) { + const count = player.maxHp - player.countCards("h"); + if (count <= 0) return; + await player.draw(count); + }, + }, + }, + }, + dcjujian: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuSkill: true, + filter(event, player) { + return game.hasPlayer(current => { + return player.hasZhuSkill("dcjujian", current) && current.group === "wei" && current !== player; + }); + }, + filterTarget(_, player, target) { + return player.hasZhuSkill("dcjujian", target) && target.group === "wei" && target !== player; + }, + async content(event, trigger, player) { + const target = event.targets[0]; + await target.draw(); + target.addTempSkill("dcjujian_forbid", "roundStart"); + target.markAuto("dcjujian_forbid", player); + }, + ai: { + result: { + target(player, target) { + const num = target.countCards("hs", card => { + return get.type(card) == "trick" && target.canUse(card, player) && get.effect(player, card, target, player) < -2; + }), + att = get.attitude(player, target); + if (att < 0) return -0.74 * num; + return 1.5; + }, + }, + }, + subSkill: { + forbid: { + audio: "dcjujian", + trigger: { + player: "useCardToBefore", + }, + filter(event, player) { + if (get.type(event.card) !== "trick") return false; + return player.getStorage("dcjujian_forbid").includes(event.target); + }, + forced: true, + charlotte: true, + onremove: true, + direct: true, + async content(event, trigger, player) { + await trigger.target.logSkill("dcjujian_forbid", player); + trigger.cancel(); + }, + intro: { + content: "使用普通锦囊牌对$无效", + }, + ai: { + effect: { + player(card, player, target, current) { + if (get.type(card) == "trick" && player.getStorage("dcjujian_forbid").includes(target)) return "zeroplayertarget"; + }, + }, + }, + }, + }, + }, + //谋司马懿 + dcsbquanmou: { + audio: 2, + audioname: ["dc_sb_simayi_shadow"], + zhuanhuanji: true, + marktext: "☯", + enable: "phaseUse", + filter(event, player) { + const selected = player.getStorage("dcsbquanmou_selected"); + return game.hasPlayer(current => !selected.includes(current) && player.inRange(current) && current.countCards("he") > 0); + }, + filterTarget(card, player, target) { + if (player === target) return false; + const selected = player.getStorage("dcsbquanmou_selected"); + return !selected.includes(target) && player.inRange(target) && target.countCards("he") > 0; + }, + prompt() { + const player = get.player(); + if (player.storage.dcsbquanmou) return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。"; + return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害时,取消之。"; + }, + async content(event, trigger, player) { + const target = event.targets[0]; + player.changeZhuanhuanji("dcsbquanmou"); + player.changeSkin("dcsbquanmou", "dc_sb_simayi" + (player.storage.dcsbquanmou ? "_shadow" : "")); + player.markAuto("dcsbquanmou_selected", [target]); + const cards = await target.chooseCard("he", true, `选择交给${get.translation(player)}一张牌`).forResultCards(); + if (cards && cards.length) { + await target.give(cards, player); + const key = `dcsbquanmou_${Boolean(!player.storage.dcsbquanmou)}`; + player.addTempSkill(key, { global: ["phaseUseBefore", "phaseChange"] }); + player.markAuto(key, [target]); + target.addAdditionalSkill(`${key}_${player.playerid}`, `${key}_mark`); + } + }, + ai: { + order: 9, + result: { + player: function (player, target) { + if (player.storage.dcsbquanmou) return 1; + return 1 + game.countPlayer(i => player !== i && target !== i && !i.hasSkill("false_mark") && get.attitude(player, i) < 0); + }, + target: function (player, target) { + let res = target.hasSkillTag("noh") ? 0 : -1; + if (player.storage.dcsbquanmou) return res + 0.6; + return res; + }, + }, + }, + onremove: true, + mark: true, + intro: { + content: storage => { + if (storage) return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。"; + return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害时,取消之。"; + }, + }, + group: "dcsbquanmou_change", + subSkill: { + change: { + audio: "dcsbquanmou", + audioname: ["dc_sb_simayi_shadow"], + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + prompt2(event, player) { + //无名杀先阳后阴,不要问为什么 + return "切换【权谋】为状态" + (player.storage.dcsbquanmou ? "阳" : "阴"); + }, + check: () => Math.random() > 0.5, + content() { + player.changeZhuanhuanji("dcsbquanmou"); + player.changeSkin("dcsbquanmou", "dc_sb_simayi" + (player.storage.dcsbquanmou ? "_shadow" : "")); + }, + }, + true: { + charlotte: true, + audio: "dcsbquanmou", + audioname: ["dc_sb_simayi_shadow"], + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter(event, player) { + return player.getStorage("dcsbquanmou_true").includes(event.player); + }, + async content(event, trigger, player) { + const target = trigger.player; + player.getStorage("dcsbquanmou_true").remove(target); + target.removeAdditionalSkill(`dcsbquanmou_true_${player.playerid}`); + if (game.hasPlayer(current => current != player && current != target)) { + const result = await player + .chooseTarget([1, 3], `权谋:是否对${get.translation(target)}之外的至多三名其他角色各造成1点伤害?`, (card, player, target) => { + return target != player && target != get.event().getTrigger().player; + }) + .set("ai", target => { + const player = get.player(); + return get.damageEffect(target, player, player); + }) + .forResult(); + if (result.bool) { + await player.logSkill("dcsbquanmou", result.targets); + for (let i of result.targets) { + if (i.isIn()) await i.damage(); + } + } + } + }, + onremove(player, skill) { + game.filterPlayer(current => { + current.removeAdditionalSkill(`${skill}_${player.playerid}`); + }); + delete player.storage[skill]; + delete player.storage.dcsbquanmou_selected; + }, + }, + true_mark: { + charlotte: true, + mark: true, + marktext: "讨", + intro: { + name: "权谋 - 阳", + content: () => { + return `当你下次受到${get.translation(_status.currentPhase)}造成的伤害后,其可以对除你之外的至多三名其他角色各造成1点伤害。`; + }, + }, + ai: { + threaten: 2.5, + effect: { + target(card, player, target) { + if (get.tag(card, "damage") && player && player.hasSkill("dcsbquanmou_true")) { + let tars = game.countPlayer(i => player !== i && target !== i && get.attitude(player, target) < 0 && !target.hasSkill("dcsbquanmou_false_mark")); + return [1, 0, 1, (6 * Math.min(3, tars)) / (3 + Math.pow(target.countCards("h"), 2))]; + } + }, + }, + }, + }, + false: { + charlotte: true, + audio: "dcsbquanmou", + audioname: ["dc_sb_simayi_shadow"], + trigger: { source: "damageBegin2" }, + forced: true, + filter(event, player) { + return player.getStorage("dcsbquanmou_false").includes(event.player); + }, + async content(event, trigger, player) { + const target = trigger.player; + player.getStorage("dcsbquanmou_false").remove(target); + target.removeAdditionalSkill(`dcsbquanmou_false_${player.playerid}`); + trigger.cancel(); + }, + onremove(player, skill) { + game.filterPlayer(current => { + current.removeAdditionalSkill(`${skill}_${player.playerid}`); + }); + delete player.storage[skill]; + delete player.storage.dcsbquanmou_selected; + }, + }, + false_mark: { + charlotte: true, + mark: true, + marktext: "抚", + intro: { + name: "权谋 - 阴", + content: () => { + return `当你下次受到${get.translation(_status.currentPhase)}造成的伤害时,防止此伤害。`; + }, + }, + ai: { + nodamage: true, + nofire: true, + nothunder: true, + skillTagFilter(player, tag, arg) { + return arg && arg.player && arg.player.hasSkill("dcsbquanmou_false"); + }, + effect: { + target(card, player, target) { + if (get.tag(card, "damage") && player && player.hasSkill("dcsbquanmou_false")) return "zeroplayertarget"; + }, + }, + }, + }, + }, + }, + dcsbpingliao: { + audio: 2, + audioname: ["dc_sb_simayi_shadow"], + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return event.card.name == "sha"; + }, + logTarget(event, player) { + return game.filterPlayer(current => player.inRange(current)); + }, + async content(event, trigger, player) { + const unrespondedTargets = []; + const respondedTargets = []; + let nonnonTargetResponded = false; + const targets = game.filterPlayer().sortBySeat(); + const prompt = `###是否打出红色基本牌响应${get.translation(player)}?###${get.translation(player)}使用了一张不公开目标的${get.translation(trigger.card)}。若你选择响应且你不是此牌的隐藏目标,则其摸两张牌;若你选择不响应且你是此牌的隐藏目标,则你本回合内不能使用或打出手牌。`; + for (let target of targets) { + if (target.isIn() && player.inRange(target)) { + const result = await target + .chooseToRespond(prompt, (card, player) => { + if (get.type(card) !== "basic") return false; + const color = get.color(card); + return color == "red" || color == "unsure"; + }) + .set("ai", card => { + const player = get.player(), + event = get.event(); + const source = event.getParent().player; + //是队友且没有其他疑似队友的选手响应 那响应一下 + if (get.attitude(player, source) > 0) { + if ( + !event.respondedTargets.some(current => { + return get.attitude(player, current) > 0 || get.attitude(source, current) >= 0; + }) + ) + return get.order(card); + return -1; + } + //如果自己没有其他的闪桃就不响应 + else { + const needsTao = player.hp <= 1; + const shanAndTao = player.getCards("hs", card => { + const name = get.name(card); + return name == "shan" || (needsTao && name == "shan"); + }); + shanAndTao.remove(card); + if (card.cards) shanAndTao.removeArray(card.cards); + if (!shanAndTao.length) return 0; + } + return event.getRand("dcsbpingliao") > 1 / Math.max(1, player.hp) ? 0 : get.order(card); + }) + .set("respondedTargets", respondedTargets) + .forResult(); + if (result.bool) { + respondedTargets.push(target); + if (!trigger.targets.includes(target)) nonnonTargetResponded = true; + await game.asyncDelay(); + } else if (trigger.targets.includes(target)) unrespondedTargets.push(target); + } + } + unrespondedTargets.forEach(current => { + current.addTempSkill("dcsbpingliao_blocker"); + game.log(current, "本回合内无法使用或打出手牌"); + }); + if (nonnonTargetResponded) { + player.draw(2); + player.addTempSkill("dcsbpingliao_buff", { global: "phaseChange" }); + player.addMark("dcsbpingliao_buff", 1, false); + } + }, + ai: { + ignoreLogAI: true, + skillTagFilter: function (player, tag, args) { + if (args) { + return args.card && get.name(args.card) == "sha"; + } + }, + }, + group: "dcsbpingliao_hide", + subSkill: { + hide: { + trigger: { player: "useCard0" }, + forced: true, + filter(event, player) { + return event.card.name == "sha"; + }, + async content(event, trigger, player) { + trigger.hideTargets = true; + game.log(player, "隐藏了", trigger.card, "的目标"); + }, + }, + buff: { + onremove: true, + charlotte: true, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("dcsbpingliao_buff"); + }, + }, + mark: true, + intro: { + content: "本阶段内使用【杀】的次数上限+#", + }, + }, + blocker: { + charlotte: true, + mod: { + cardEnabled2(card, player) { + if (player.getCards("h").includes(card)) return false; + }, + }, + mark: true, + marktext: "封", + intro: { + content: "本回合内不能使用或打出手牌", + }, + }, + }, + }, + //陈武董袭 + dcduanxie: { + audio: "duanxie", + inherit: "duanxie", + selectTarget: 1, + }, + //吕范 + diaodu: { + audio: 2, + trigger: { player: ["phaseUseBegin", "logSkill"] }, + filter(event, player) { + if (event.name == "logSkill" && event.skill != "diancai") return false; + return game.hasPlayer(target => { + return get.distance(player, target) <= 1 && target.countGainableCards(player, "e"); + }); + }, + direct: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt2("diaodu"), (card, player, target) => { + return get.distance(player, target) <= 1 && target.countGainableCards(player, "e"); + }) + .set("ai", target => { + const player = get.event("player"), + att = get.attitude(player, target); + let num = 0; + if (target.hasSkill("gzxiaoji")) num += 2.5; + if (target.isDamaged() && target.getEquip("baiyin")) num += 2.5; + if (target.hasSkill("xuanlve")) num += 2; + return get.sgn(att) * num + (target == player ? 1 : 0); + }); + if (bool) { + const aim = targets[0]; + player.logSkill("diaodu", aim); + const { + result: { bool, cards }, + } = await player.gainPlayerCard(aim, "e", true); + if (bool && game.hasPlayer(target => target != aim)) { + const card = cards[0]; + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "调度:将" + get.translation(card) + "交给另一名角色", + (card, player, target) => { + return target != get.event("aim"); + }, + true + ) + .set("ai", target => { + const player = get.event("player"); + return get.attitude(player, target); + }) + .set("aim", aim); + if (bool && get.owner(card) == player) { + const target = targets[0]; + player.line(target, "green"); + if (target != player) await player.give([card], target); + if (get.owner(card) == target) { + const { + result: { bool }, + } = await target.chooseUseTarget(card); + if (bool) await player.draw(); + else await target.draw(); + } + } + } + } + }, + }, + diancai: { + audio: 2, + inherit: "mbdiancai", + filter(event, player) { + if (_status.currentPhase === player) return false; + let num = player + .getHistory("lose", evt => { + return evt.cards2 && evt.cards2.length && evt.getParent("phaseUse") == event; + }) + .reduce((sum, evt) => { + return sum + evt.cards2.length; + }, 0); + return num >= Math.min(5, player.getHp()); + }, + }, + //崔琰毛玠 + zhengbi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(target => target != player); + }, + direct: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player.chooseTarget(get.prompt2("zhengbi"), lib.filter.notMe).set("ai", target => { + const player = get.event("player"); + return -get.attitude(player, target) * target.countCards("he"); + }); + if (bool) { + const target = targets[0], + str = get.translation(target); + player.logSkill("zhengbi", target); + let choiceList = ["此阶段结束时,若" + str + "本阶段获得过牌,则你获得其手牌区和装备区各一张牌"]; + if (player.countCards("h", { type: "basic" })) choiceList.push("交给" + str + "一张基本牌,然后其交给你一张非基本牌或两张基本牌"); + const { + result: { index }, + } = await player + .chooseControl() + .set("choiceList", choiceList) + .set("ai", () => get.event("controls").length - 1); + if (index == 0) { + player.line(target); + player + .when("phaseUseEnd") + .filter(evt => evt == trigger) + .then(() => { + if (target.isIn() && target.getHistory("gain", evt => evt.getParent("phaseUse") == trigger).length) { + player.line(target); + let num = (target.countGainableCards(player, "h") > 0) + (target.countGainableCards(player, "e") > 0); + if (num) { + player.gainPlayerCard(target, num, "he", true).set("filterButton", button => { + return !ui.selected.buttons.some(but => get.position(button.link) == get.position(but.link)); + }); + } + } + }) + .vars({ target: target }); + } else { + const { + result: { bool }, + } = await player.chooseToGive(target, { type: "basic" }, true).set("prompt", "征辟:交给" + str + "一张基本牌"); + if (bool) { + let choices = []; + if (target.countCards("he", { type: ["trick", "delay", "equip"] })) choices.push("一张非基本牌"); + if (target.countCards("h", { type: "basic" }) > 1) choices.push("两张基本牌"); + if (choices.length) { + const { + result: { control }, + } = await target + .chooseControl(choices) + .set("ai", function (event, player) { + if (choices.length > 1) { + if ( + player.countCards("he", { type: ["trick", "delay", "equip"] }, function (card) { + return get.value(card) < 7; + }) + ) + return 0; + return 1; + } + return 0; + }) + .set("prompt", "征辟:交给" + get.translation(player) + "…"); + const check = control == "一张非基本牌"; + await target.chooseToGive("he", check ? 1 : 2, { type: check ? ["trick", "delay", "equip"] : "basic" }, player, true).set("prompt", "征辟:交给" + get.translation(player) + control); + } else if (target.countCards("h")) await target.give(target.getCards("h"), player); + } + } + } + }, + }, + fengying: { + unique: true, + limited: true, + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countCards("h") && player.countCards("h") == player.countDiscardableCards(player, "h"); + }, + skillAnimation: true, + animationColor: "thunder", + async content(event, trigger, player) { + player.awakenSkill("fengying"); + await player.discard(player.getCards("h")); + const evt = player.insertPhase(); + player + .when("phaseBegin") + .filter(evtx => evtx == evt) + .then(() => { + if (player.isMinHp() && player.maxHp > 0 && player.countCards("h") < player.maxHp) { + player.drawTo(player.maxHp); + } + }); + }, + ai: { + order: 0.0001, + result: { + player(player) { + return player.isMinHp() ? 1 : 0; + }, + }, + }, + }, + //胡遵 + dczhantao: { + audio: 2, + trigger: { global: "damageEnd" }, + filter(event, player) { + if (!event.player.isIn() || (event.player !== player && !player.inRange(event.player))) return false; + return event.source && event.source != player; + }, + check(event, player) { + if (!event.source.isIn() || !event.card || typeof get.number(event.card) !== "number") return 0; + return get.effect(event.source, { name: "sha" }, player, player) >= 0; + }, + logTarget: "player", + async content(event, trigger, player) { + player + .judge(card => { + const evt = get.event().getParent(get.event("eventName")).getTrigger(); + if (!evt.source || !evt.source.isIn() || !evt.card || typeof get.number(evt.card) !== "number") return 0; + if (get.number(card) > get.number(evt.card)) return 1.5; + return 0; + }) + .set("judge2", r => r.bool) + .set("callback", () => { + const evtx = event.getParent(); + const evt = event.getParent(evtx.eventName).getTrigger(); + if (!evt.source || !evt.source.isIn() || !evt.card || typeof get.number(evt.card) !== "number") return; + if (event.judgeResult.number > get.number(evt.card)) { + const sha = new lib.element.VCard({ name: "sha" }), + target = evt.source; + if (player.canUse(sha, target, false, false)) { + player.useCard(sha, target, false); + } + } + }) + .set("eventName", event.name); + }, + }, + dcanjing: { + audio: 2, + trigger: { source: "damageSource" }, + filter(event, player) { + return game.hasPlayer(current => current.isDamaged()); + }, + usable: 1, + direct: true, + async content(event, trigger, player) { + const maxCount = player.getAllHistory("useSkill", evt => evt.skill === "dcanjing").length + 1; + const result = await player + .chooseTarget(get.prompt2("dcanjing"), (card, player, target) => target.isDamaged(), [1, maxCount]) + .set("ai", target => { + return get.attitude(get.player(), target) > 0; + }) + .forResult(); + if (!result.bool) return player.storage.counttrigger.dcanjing--; + const targets = result.targets.slice(); + targets.sortBySeat(_status.currentPhase); + player.logSkill("dcanjing", targets); + for (const target of targets) await target.draw(); + const minHp = targets.map(i => i.getHp()).sort((a, b) => a - b)[0]; + await game.asyncDelayx(); + for (const target of targets) { + if (!target.isIn()) continue; + if (target.getHp() === minHp) await target.recover(); + } + }, + }, + //诸葛梦雪 + dcjichun: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countCards("he", card => lib.skill.dcjichun.filterCard(card, player)); + }, + filterCard(card, player) { + if (!get.cardNameLength(card) || ui.selected.cards.length) return false; + if ( + game.hasPlayer(target => { + return target.countCards("h") < player.countCards("h"); + }) + ) + return true; + if ( + lib.filter.cardDiscardable(card, player) && + game.hasPlayer(target => { + return target.countCards("h") > player.countCards("h") && target.countDiscardableCards(player, "hej"); + }) + ) + return true; + return false; + }, + selectCard: [1, 2], + filterTarget(cardx, player, target) { + if (!ui.selected.cards.length) return false; + const card = ui.selected.cards[0]; + if (target.countCards("h") < player.countCards("h")) return true; + if (lib.filter.cardDiscardable(card, player) && target.countCards("h") > player.countCards("h") && target.countDiscardableCards(player, "hej")) return true; + return false; + }, + usable: 1, + position: "he", + check(card) { + return get.cardNameLength(card); + }, + complexCard: true, + complexSelect: true, + lose: false, + discard: false, + delay: false, + targetprompt() { + const target = ui.selected.targets[0], + player = get.event("player"); + return target.countCards("h") < player.countCards("h") ? "给牌摸牌" : "双双弃牌"; + }, + async content(event, trigger, player) { + const card = event.cards[0], + target = event.target; + const num = get.cardNameLength(card); + await player.showCards([card], get.translation(player) + "发动了【寄春】"); + if (target.countCards("h") < player.countCards("h")) { + await player.give(card, target); + await player.draw(num); + } else { + await player.discard(card); + await player.discardPlayerCard(target, "hej", [1, num]); + } + }, + ai: { + order: 7, + result: { + target(player, target) { + return target.countCards("h") < player.countCards("h") ? get.attitude(player, target) : -get.effect(target, { name: "guohe" }, player, player); + }, + }, + }, + }, + dchanying: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + async content(event, trigger, player) { + const card = get.cardPile(card => get.type(card) == "equip" && !get.cardtag(card, "gifts")); + if (!card) { + player.chat("无牌可得?!"); + game.log("但是牌堆已经没有装备牌了!"); + return; + } + await player.showCards([card], get.translation(player) + "发动了【寒英】"); + if (game.hasPlayer(target => target.countCards("h") == player.countCards("h") && target.hasUseTarget(card))) { + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "请选择使用" + get.translation(card) + "的目标角色", + (card, player, target) => { + return target.countCards("h") == player.countCards("h") && target.hasUseTarget(get.event("card")); + }, + true + ) + .set("ai", target => get.effect(target, get.event("card"), target, get.event("player"))) + .set("card", card); + if (bool) { + const target = targets[0]; + player.line(target); + target.chooseUseTarget(card, true, "nopopup"); + } + } else { + player.chat("无人可装?!"); + game.log("但是场上没有角色可以使用", card, "!"); + } + }, + }, + //柏灵筠 + dclinghui: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + if (_status.currentPhase === player) return true; + return game.getGlobalHistory("everything", evt => evt.name == "dying").length; + }, + frequent: true, + async content(event, trigger, player) { + let cards = get.cards(3); + await game.cardsGotoOrdering(cards); + const { + result: { bool, links }, + } = await player + .chooseButton(["灵慧:是否使用其中的一张牌并随机获得其中一张剩余牌?", cards]) + .set("filterButton", button => { + return get.player().hasUseTarget(button.link); + }) + .set("ai", button => { + return get.event("player").getUseValue(button.link); + }); + if (bool) { + const card = links[0]; + cards.remove(card); + player.$gain2(card, false); + await game.asyncDelayx(); + await player.chooseUseTarget(true, card, false); + cards = cards.filterInD(); + if (cards.length) { + const cardx = cards.randomRemove(); + await player.gain(cardx, "gain2"); + } + } + if (cards.length) { + cards.reverse(); + game.cardsGotoPile(cards.filterInD(), "insert"); + game.log(player, "将", get.cnNumber(cards.length), "张牌置于了牌堆顶"); + } + }, + }, + dcxiace: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + filter(event, player) { + const bool1 = event.player == player && !player.hasHistory("custom", evt => evt.dcxiace == "player") && game.hasPlayer(target => target != player && !target.hasSkill("fengyin")); + const bool2 = + event.source && + event.source == player && + !player.hasHistory("custom", evt => evt.dcxiace == "source") && + player.isDamaged() && + player.countCards("he", card => { + if (_status.connectMode && get.position(card) == "h") return true; + return lib.filter.cardDiscardable(card, player); + }); + return bool1 || bool2; + }, + direct: true, + async content(event, trigger, player) { + if (trigger.player == player && !player.hasHistory("custom", evt => evt.dcxiace == "player") && game.hasPlayer(target => target != player && !target.hasSkill("fengyin"))) { + const { + result: { bool, targets }, + } = await player + .chooseTarget((card, player, target) => { + return target != player && !target.hasSkill("fengyin"); + }) + .set("prompt", get.prompt("dcxiace")) + .set("prompt2", "令一名其他角色的非锁定技于本回合失效") + .set("ai", target => { + const player = get.event("player"); + return ( + -get.sgn(get.attitude(player, target)) * + (target.getSkills(null, false, false).filter(skill => { + return !get.is.locked(skill); + }).length + + 1) * + (target === _status.currentPhase ? 10 : 1) + ); + }); + if (bool) { + const target = targets[0]; + player.logSkill("dcxiace", target); + player.getHistory("custom").push({ dcxiace: "player" }); + target.addTempSkill("fengyin"); + } + } + if ( + trigger.source && + trigger.source == player && + !player.hasHistory("custom", evt => evt.dcxiace == "source") && + player.isDamaged() && + player.countCards("he", card => { + if (_status.connectMode && get.position(card) == "h") return true; + return lib.filter.cardDiscardable(card, player); + }) && + player.hasSkill("dcxiace") + ) { + const { + result: { bool }, + } = await player + .chooseToDiscard("he", get.prompt("dcxiace"), "弃置一张牌并回复1点体力") + .set("ai", card => { + const player = get.event("player"); + if (get.recoverEffect(player, player, player) <= 0) return 0; + return 7 - get.value(card); + }) + .set("logSkill", "dcxiace"); + if (bool) { + player.getHistory("custom").push({ dcxiace: "source" }); + await player.recover(); + } + } + }, + }, + dcyuxin: { + unique: true, + limited: true, + audio: 2, + trigger: { global: "dying" }, + filter(event, player) { + return event.player.hp < (event.player == player ? 1 : player.getHp()); + }, + prompt2(event, player) { + return "令其将体力值回复至" + (event.player == player ? 1 : player.getHp()) + "点"; + }, + check(event, player) { + if (get.recoverEffect(event.player, player, player) <= 0) return false; + return lib.skill.luanfeng.check(event, player); + }, + logTarget: "player", + skillAnimation: true, + animationColor: "thunder", + async content(event, trigger, player) { + player.awakenSkill("dcyuxin"); + trigger.player.recover((trigger.player == player ? 1 : player.getHp()) - trigger.player.hp); + }, + }, + //清河公主 + dczhangji: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + return event.targets && event.targets.length > 1 && event.targets.includes(player); + }, + forced: true, + logTarget: "player", + content: function* (event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + let targets = trigger.targets.slice(); + targets.sortBySeat(_status.currentPhase || target); + targets.remove(player); + player + .when({ global: "useCardToTargeted" }) + .filter(evt => targets.length && evt.getParent() == trigger && evt.targets.length == evt.getParent().triggeredTargets4.length) + .then(() => { + trigger.getParent().targets = [player].concat(targets); + trigger.getParent().triggeredTargets4 = [player].concat(targets); + }) + .vars({ targets: targets }); + player + .when({ target: ["useCardToEnd", "useCardToExcluded"] }) + .filter(evt => targets.length && evt.getParent() == trigger) + .then(() => { + player.draw(targets.length); + }) + .vars({ targets: targets }); + }, + }, + dczengou: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.maxHp > 0 && player.countCards("he") > 0; + }, + filterCard: true, + selectCard: () => [1, _status.event.player.maxHp], + position: "he", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + usable: 1, + check: function (card) { + if (card.name == "tao" || card.name == "jiu") return 0; + return 1 / (get.value(card) || 0.5); + }, + content: function* (event, map) { + const player = map.player, + cards = event.cards, + target = event.target; + yield player.give(cards, target).gaintag.add("dczengou_debuff"); + yield player.draw(cards.length); + target.addSkill("dczengou_debuff"); + }, + ai: { + order: 10, + result: { target: -1 }, + }, + subSkill: { + debuff: { + charlotte: true, + mark: true, + intro: { + content: "下次体力值增加或使用牌结算完毕后展示所有手牌,然后失去手牌中“谮构”牌数的体力值", + }, + trigger: { player: ["changeHp", "useCardAfter"] }, + filter: function (event, player) { + return event.name == "useCard" || event.num > 0; + }, + forced: true, + popup: false, + content: function () { + player.removeSkill("dczengou_debuff"); + const cards = player.getCards("h", card => card.hasGaintag("dczengou_debuff")); + player.showHandcards(); + if (cards.length) player.loseHp(cards.length); + }, + mod: { + aiValue: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dczengou_debuff")) return -1; + }, + aiUseful: function () { + return lib.skill.dczengou.subSkill.debuff.mod.aiValue.apply(this, arguments); + }, + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dczengou_debuff")) { + const cards = player.getCards("h", card => card.hasGaintag("dczengou_debuff")); + if (cards.length == 1) return num + 10; + return 0; + } + }, + }, + }, + }, + }, + //曹宪 + dclingxi: { + audio: 2, + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + filter: function (event, player) { + return player.countCards("he") && player.maxHp > 0; + }, + direct: true, + content: function* (event, map) { + var player = map.player, + num = player.maxHp; + var result = yield player + .chooseCard(get.prompt("dclingxi"), "将至多" + get.cnNumber(num) + "张牌称为“翼”置于武将牌上", "he", [1, num]) + .set("ai", card => { + let player = _status.event.player, + dis = player.needsToDiscard(0, (i, player) => { + return !player.canIgnoreHandcard(i) && !ui.selected.cards.includes(i); + }), + cards = ui.selected.cards.concat(player.getExpansions("dclingxi")), + suit = get.suit(card, false); + if (_status.event.suits.length < 4) _status.event.suits.add(get.suit(ui.selected.cards.at(-1), false)); + if (_status.event.triggerName === "phaseUseEnd") { + if (_status.event.suits.includes(suit)) return (dis ? 10 : 3) - get.useful(card); + return (dis ? 6 : 1) - get.useful(card); + } + _status.event.hvt.remove(ui.selected.cards.at(-1)); + if (_status.event.hvt.length === 1 && card === _status.event.hvt[0]) return 0; + let temp; + if ( + !cards.some(i => { + temp = get.suit(i, false); + return cards.some(j => { + return i !== j && suit === get.suit(j, false); + }); + }) && + suit === temp + ) + return 15 - get.value(card); + if (!_status.event.hvt.length) { + if (_status.event.suits.includes(suit)) return (dis ? 10 : 3) - get.useful(card); + return (dis ? 6 : 1) - get.useful(card); + } + if (_status.event.hvt.includes(card)) { + if (!_status.event.suits.includes(suit)) return 6 - get.value(card); + if (card.name === "sha") return 3 - get.value(card); + return 1 - get.value(card); + } + return 15 - get.value(card); + }) + .set("complexCard", true) + .set( + "hvt", + player.getCards("hs", card => { + return card.name === "zhuge" || player.hasValueTarget(card, null, true); + }) + ) + .set( + "suits", + (() => { + let suits = []; + player.getExpansions("dclingxi").forEach(i => { + suits.add(get.suit(i, false)); + }); + return suits; + })() + ) + .set("triggerName", event.triggername); + if (result.bool) { + player.logSkill("dclingxi"); + player.addToExpansion(result.cards, player, "give").gaintag.add("dclingxi"); + } + }, + marktext: "翼", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "dclingxi_effect", + subSkill: { + effect: { + audio: "dclingxi", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter"], + }, + filter: function (event, player) { + var num = 2 * player.getExpansions("dclingxi").reduce((list, card) => list.add(get.suit(card, false)), []).length; + num -= player.countCards("h"); + if (!num) return false; + if (event.name == "lose" && event.getlx !== false) { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dclingxi")) return true; + } + return false; + } + return game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" || event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dclingxi") && evt.player == player) return true; + } + return false; + }).length; + }, + forced: true, + locked: false, + content: function () { + var num = 2 * player.getExpansions("dclingxi").reduce((list, card) => list.add(get.suit(card, false)), []).length; + num -= player.countCards("h"); + if (num > 0) player.draw(num); + else player.chooseToDiscard("h", -num, true); + }, + }, + }, + ai: { + combo: "dczhifou", + }, + }, + dczhifou: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + var num = player.getHistory("useSkill", evt => evt.skill == "dczhifou").length + 1; + return player.getExpansions("dclingxi").length >= num; + }, + direct: true, + content: function* (event, map) { + var player = map.player, + cards = player.getExpansions("dclingxi"); + var num = player.getHistory("useSkill", evt => evt.skill == "dczhifou").length + 1; + var result = yield player + .chooseButton(["###" + get.prompt("dczhifou") + "###移去至少" + get.cnNumber(num) + "张武将牌上的“翼”", cards], [num, cards.length]) + .set("ai", button => { + if (!_status.event.res.bool) return 0; + if (_status.event.res.cards.includes(button.link)) return 1; + return 0; + }) + .set("num", num) + .set( + "res", + (() => { + if ( + player.isPhaseUsing() && + player.hasCard(i => { + return player.hasValueTarget(i, null, true); + }, "h") + ) + return false; + let suits = [], + cs = player.getExpansions("dclingxi"), + cards = [], + temp = num; + for (let i = 0; i < cs.length; i++) { + if (!temp) break; + let suit = get.suit(cs[i], false); + if (suits.includes(suit)) { + cards.push(cs.splice(i--, 1)[0]); + temp--; + } else suits.push(suit); + } + while (temp > 0) { + cards.push(cs.pop()); + temp--; + } + temp = suits.length * 2 - player.countCards("h"); + if (temp > 0 || (!temp && num < Math.max(2, 5 - player.hp))) cs = true; + else cs = false; + return { + bool: cs, + cards: cards, + }; + })() + ); + if (result.bool) { + player.logSkill("dczhifou"); + player.loseToDiscardpile(result.links); + var list = [], + choiceList = ["将一张牌称为“翼”置于你的武将牌上", "弃置两张牌", "失去1点体力"]; + if (!player.hasSkill("dczhifou_0") && game.hasPlayer(target => target.countCards("he"))) list.push("置入“翼”"); + else choiceList[0] = '' + choiceList[0] + ""; + if ( + !player.hasSkill("dczhifou_1") && + game.hasPlayer(target => { + return target == player ? target.countDiscardableCards(target, "he") : target.countCards("he"); + }) + ) + list.push("弃置卡牌"); + else choiceList[1] = '' + choiceList[1] + ""; + if (!player.hasSkill("dczhifou_2")) list.push("失去体力"); + else choiceList[2] = '' + choiceList[2] + ""; + if (!list.length) return; + var str = ""; + for (var i of list) { + str += i; + str += "、"; + } + str = str.slice(0, -1); + var result2 = yield player + .chooseTarget( + "知否:令一名角色执行以下一项", + str, + (card, player, target) => { + if (!player.hasSkill("dczhifou_2")) return true; + if (!player.hasSkill("dczhifou_0") && target.countCards("he")) return true; + return target == player ? target.countDiscardableCards(target, "he") : target.countCards("he"); + }, + true + ) + .set("ai", target => { + var player = _status.event.player, + list = []; + if (!player.hasSkill("dczhifou_0")) list.push(get.effect(target, { name: "guohe_copy2" }, target, player) / 2); + if (!player.hasSkill("dczhifou_1")) list.push(get.effect(target, { name: "guohe_copy2" }, target, player)); + if (!player.hasSkill("dczhifou_2")) list.push(get.effect(target, { name: "losehp" }, player, player)); + return list.sort((a, b) => b - a)[0]; + }); + if (result2.bool) { + var target = result2.targets[0]; + player.line(target); + list = list.filter(control => { + if (control == "失去体力") return true; + if (control == "置入“翼”" && target.countCards("he")) return true; + return target.countDiscardableCards(target, "he"); + }); + var result3; + if (!list.length) { + game.log(target, "没有可执行项"); + return; + } else if (list.length == 1) result3 = { control: list[0] }; + else + result3 = yield player + .chooseControl(list) + .set("prompt", "知否:请选择一项") + .set( + "choiceList", + choiceList.map(str => "令" + get.translation(target) + str) + ) + .set("ai", () => { + var player = _status.event.player; + var target = _status.event.target; + var getNum = function (control) { + return [get.effect(target, { name: "guohe_copy2" }, target, player) / 2, get.effect(target, { name: "guohe_copy2" }, target, player), get.effect(target, { name: "losehp" }, target, player)][["置入“翼”", "弃置卡牌", "失去体力"].indexOf(control)]; + }; + var controls = _status.event.controls.slice(); + return controls.sort((a, b) => getNum(b) - getNum(a))[0]; + }) + .set("target", target); + switch (result3.control) { + case "置入“翼”": + player.addTempSkill("dczhifou_0"); + var result4 = yield target.chooseCard("he", choiceList[0], true); + if (result4.bool) player.addToExpansion(result4.cards, target, "give").gaintag.add("dclingxi"); + break; + case "弃置卡牌": + player.addTempSkill("dczhifou_1"); + target.chooseToDiscard("he", 2, true); + break; + case "失去体力": + player.addTempSkill("dczhifou_2"); + target.loseHp(); + break; + } + } + } + }, + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, + 2: { charlotte: true }, + }, + ai: { + combo: "dclingxi", + }, + }, + //周瑜 + //无 双 万 军 取 首 + dcsbronghuo: { + audio: 2, + audioname: ["dc_sb_zhouyu_shadow"], + trigger: { player: "useCard1" }, + filter: function (event, player) { + return (event.card.name == "sha" && game.hasNature(event.card, "fire")) || event.card.name == "huogong"; + }, + forced: true, + content: function () { + trigger.baseDamage = game.countGroup(); + }, + ai: { threaten: 3.5 }, + }, + dcsbyingmou: { + mark: true, + marktext: "☯", + zhuanhuanji: true, + intro: { + content: function (storage) { + if (!storage) return "每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】。"; + return "每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。"; + }, + }, + audio: 2, + audioname: ["dc_sb_zhouyu_shadow"], + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.isFirstTarget && event.targets.some(target => target != player); + }, + usable: 1, + direct: true, + content: function* (event, map) { + var result, + player = map.player, + targets = map.trigger.targets; + var storage = player.storage.dcsbyingmou; + if (storage) { + result = yield player + .chooseCardTarget({ + prompt: get.prompt("dcsbyingmou"), + prompt2: "选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)", + filterTarget: function (card, player, target) { + if (!ui.selected.targets.length) return _status.event.targets.includes(target); + return target.isMaxHandcard(); + }, + selectTarget: 2, + complexSelect: true, + complexTarget: true, + multitarget: true, + targetprompt: ["目标角色", "使用角色"], + filterCard: () => false, + selectCard: -1, + ai2: function (target) { + var player = _status.event.player; + var getNum = function (player, target, source) { + return player + .getCards("h", card => { + if (get.name(card) != "sha" && (get.type(card) != "trick" || !get.tag(card, "damage"))) return false; + return player.canUse(card, target, false); + }) + .reduce((sum, card) => sum + get.effect(target, card, player, source), 0); + }; + if (!ui.selected.targets.length) { + var targets = game.filterPlayer(target => target.isMaxHandcard()); + targets.sort((a, b) => getNum(b, target, player) - getNum(a, target, player)); + return getNum(targets[0], target, player) + 1; + } + return getNum(target, ui.selected.targets[0], player) + 1; + }, + }) + .set("targets", targets); + } else + result = yield player + .chooseTarget(get.prompt("dcsbyingmou"), "选择一名目标角色,将手牌数摸至与其相同,然后视为对其使用一张【火攻】", (card, player, target) => _status.event.targets.includes(target)) + .set("ai", target => { + var player = _status.event.player; + return Math.max(0, Math.min(5, target.countCards("h") - player.countCards("h"))) * 2 + get.effect(target, { name: "huogong" }, player, player); + }) + .set("targets", targets); + if (result.bool) { + var target = result.targets[0]; + if (storage) { + yield player.logSkill("dcsbyingmou", result.targets, false); + player.line2(result.targets); + player.changeZhuanhuanji("dcsbyingmou"); + player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : "")); + var source = result.targets[1], + discard = true; + while (true) { + var cards = source.getCards("h", card => { + if (get.name(card) != "sha" && (get.type(card) != "trick" || !get.tag(card, "damage"))) return false; + return source.canUse(card, target, false); + }); + if (cards.length) { + if (discard) discard = false; + yield source.useCard(cards.randomGet(), target, false); + } else break; + } + if (discard && player.countCards("h") < source.countCards("h")) source.chooseToDiscard(source.countCards("h") - player.countCards("h"), "h", true); + } else { + yield player.logSkill("dcsbyingmou", target); + player.changeZhuanhuanji("dcsbyingmou"); + player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : "")); + if (player.countCards("h") < target.countCards("h")) player.draw(Math.min(5, target.countCards("h") - player.countCards("h"))); + if (player.canUse({ name: "huogong" }, target, false)) player.useCard({ name: "huogong" }, target, false); + } + } else player.storage.counttrigger.dcsbyingmou--; + }, + group: "dcsbyingmou_change", + subSkill: { + change: { + audio: "dcsbyingmou", + audioname: ["dc_sb_zhouyu_shadow"], + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + prompt2(event, player) { + //无名杀先阳后阴,不要问为什么 + return "切换【英谋】为状态" + (player.storage.dcsbyingmou ? "阳" : "阴"); + }, + check: () => Math.random() > 0.5, + content() { + player.changeZhuanhuanji("dcsbyingmou"); + player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : "")); + }, + }, + }, + }, + //鲁肃 + dcsbmingshi: { + audio: 2, + audioname: ["dc_sb_lusu_shadow"], + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { + return !event.numFixed; + }, + frequent: true, + content: function () { + trigger.num += 2; + player + .when("phaseDrawEnd") + .filter((evt, player) => evt == trigger && player.countCards("h")) + .then(() => { + var str = "明势:请展示三张牌并令一名其他角色选择获得其中的一张牌"; + if (player.countCards("h") <= 3) str = "明势:展示手牌并令一名其他角色选择获得其中的一张牌"; + player.chooseCardTarget({ + prompt: str, + filterTarget: lib.filter.notMe, + filterCard: true, + selectCard: function () { + var player = _status.event.player; + if (player.countCards("h") <= 3) return -1; + return 3; + }, + position: "h", + forced: true, + ai1: function (card) { + return -get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + if (player.hasSkill("dcsbmengmou") && !get.is.blocked("dcsbmengmou", player) && player.storage.dcsbmengmou && get.attitude(player, target) < 0) return get.effect(target, { name: "losehp" }, player, player); + return get.attitude(player, target); + }, + }); + }) + .then(() => { + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var cards = result.cards; + player.showCards(cards, get.translation(player) + "发动了【明势】"); + target + .chooseButton(["明势:请获得其中一张牌", cards], true) + .set("filterButton", button => { + return lib.filter.canBeGained(button.link, _status.event.source, _status.event.player); + }) + .set("ai", button => get.value(button.link)) + .set("source", player); + } else event.finish(); + }) + .then(() => { + if (result.bool) { + var card = result.links[0]; + if (lib.filter.canBeGained(card, player, target)) target.gain(card, player, "giveAuto"); + else game.log("但", card, "不能被", player, "获得!"); + } + }); + }, + }, + dcsbmengmou: { + mark: true, + marktext: "☯", + zhuanhuanji: true, + intro: { + content: function (storage) { + if (!storage) return "每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力。(X为你的体力上限)"; + return "每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力上限,Y为X-其打出【杀】数)"; + }, + }, + audio: 2, + audioname: ["dc_sb_lusu_shadow"], + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + if (typeof player.maxHp != "number" || player.maxHp <= 0) return false; + if (event.name == "loseAsync" && event.type != "gain") return false; + if (player.hasSkill("dcsbmengmou_true") && player.hasSkill("dcsbmengmou_false")) return false; + var cards1 = event.getl(player).cards2, + cards2 = event.getg(player); + return ( + game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getg(current); + return cardsx.some(i => cards1.includes(i)); + }) || + game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getl(current).cards2; + return cards2.some(i => cardsx.includes(i)); + }) + ); + }, + direct: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + var storage = player.storage.dcsbmengmou; + player.addTempSkill("dcsbmengmou_effect", "dcsbmengmouAfter"); + var targets = [], + num = player.maxHp; + var cards1 = trigger.getl(player).cards2; + var cards2 = trigger.getg(player); + targets.addArray( + game.filterPlayer(function (current) { + if (current == player) return false; + var cardsx = trigger.getg(current); + return cardsx.some(i => cards1.includes(i)); + }) + ); + targets.addArray( + game.filterPlayer(function (current) { + if (current == player) return false; + var cardsx = trigger.getl(current).cards2; + return cards2.some(i => cardsx.includes(i)); + }) + ); + targets.sortBySeat(); + var check_true = function (player, target) { + if (get.attitude(player, target) > 0) { + if ( + target.countCards("hs", card => { + if (get.name(card) != "sha") return false; + return target.hasValueTarget(card); + }) + ) + return 4; + return 0.5; + } + if (get.attitude(player, target) < 0) { + if ( + !target.countCards("hs", card => { + if (get.name(card) != "sha") return false; + return target.hasValueTarget(card); + }) + ) { + if ( + target.countCards("hs", card => { + if (get.name(card) != "sha") return false; + return target.hasUseTarget(card); + }) + ) + return -3; + return -1; + } + return 0; + } + return 0; + }; + var check_false = function (player, target) { + if (get.attitude(player, target) < 0) return get.effect(target, { name: "losehp" }, player, player); + return 0; + }; + var result, target; + if (targets.length == 1) { + target = targets[0]; + var str; + if (storage) str = "令" + get.translation(target) + "打出至多" + get.cnNumber(num) + "张【杀】,然后其失去Y点体力。(Y为" + num + "-其打出【杀】数)"; + else str = "令" + get.translation(target) + "使用至多" + get.cnNumber(num) + "张【杀】,其每以此法造成1点伤害,其回复1点体力"; + result = yield player.chooseBool(get.prompt("dcsbmengmou", target), str).set("choice", (storage ? check_false(player, target) : check_true(player, target)) > 0); + } else { + result = yield player + .chooseTarget(get.prompt("dcsbmengmou"), lib.skill.dcsbmengmou.intro.content(storage), (card, player, target) => _status.event.targets.includes(target)) + .set("ai", target => { + return _status.event.check(_status.event.player, target); + }) + .set("targets", targets) + .set("check", storage ? check_false : check_true) + .set("ainmate", false); + } + if (result.bool) { + if (!target) target = result.targets[0]; + yield player.logSkill("dcsbmengmou", target); + player.addTempSkill("dcsbmengmou_" + (storage || false)); + player.changeZhuanhuanji("dcsbmengmou"); + //鲁肃暂时没有另一张原画(悲 + //player.changeSkin("dcsbmengmou", "dc_sb_lusu" + (player.storage.dcsbmengmou ? "_shadow" : "")); + while (num > 0) { + num--; + var result2; + if (storage) { + result2 = yield target + .chooseToRespond((card, player) => { + return get.name(card) == "sha"; + }) + .set("ai", card => { + return 1 + Math.random(); + }) + .set("prompt", "盟谋:是否打出一张【杀】?") + .set("prompt2", "当前进度:" + (3 - num) + "/3"); + } else + result2 = yield target + .chooseToUse(card => { + if (!lib.filter.cardEnabled(card, _status.event.player, _status.event)) return false; + return get.name(card) == "sha"; + }) + .set("prompt", "盟谋:是否使用一张【杀】?") + .set("prompt2", "当前进度:" + (3 - num) + "/3"); + if (!result2.bool) { + if (storage) { + target.popup("杯具"); + target.loseHp(num + 1); + } + break; + } + } + } + }, + group: "dcsbmengmou_change", + subSkill: { + effect: { + charlotte: true, + trigger: { global: "damageSource" }, + filter: function (event, player) { + if (!event.source || event.getParent().type != "card") return false; + if (event.source.isHealthy() || event.card.name != "sha") return false; + return event.getParent(4).name == "dcsbmengmou" && event.getParent(4).player == player; + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + trigger.source.recover(trigger.num); + }, + }, + true: { charlotte: true }, + false: { charlotte: false }, + change: { + audio: "dcsbmengmou", + audioname: ["dc_sb_lusu_shadow"], + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + prompt2(event, player) { + //无名杀先阳后阴,不要问为什么 + return "切换【盟谋】为状态" + (player.storage.dcsbmengmou ? "阳" : "阴"); + }, + check: () => Math.random() > 0.5, + content() { + player.changeZhuanhuanji("dcsbmengmou"); + //鲁肃暂时没有另一张原画(悲 + //player.changeSkin("dcsbmengmou", "dc_sb_lusu" + (player.storage.dcsbmengmou ? "_shadow" : "")); + }, + }, + }, + }, + //张臶 + dc_zj_a: { + audio: 2, + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + return event.getParent().type == "card"; + }, + forced: true, + content: function () { + var num = get.number(trigger.card); + if (typeof num == "number" && num > 0) trigger.num = num; + else trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && typeof get.number(card) != "number") return "zeroplayertarget"; + }, + }, + }, + }, + dc_zj_b: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countDiscardableCards(player, "he"); + }, + direct: true, + content: function* (event, map) { + var player = map.player; + var result = yield player.chooseTarget(get.prompt2("dc_zj_b"), lib.filter.notMe).set("ai", target => { + var player = _status.event.player; + if (!player.hasFriend()) return 0; + return -game.countPlayer(current => current.inRange(target) && get.attitude(current, target) < 0 && get.damageEffect(target, current, current) > 0); + }); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dc_zj_b", target); + player.discard(player.getCards("he")).discarder = player; + target.addSkill("dc_zj_a"); + target.addSkill("dc_zj_b_threaten"); + player + .when("phaseBegin") + .then(() => { + if (target.isIn()) { + target.removeSkill("dc_zj_a"); + target.removeSkill("dc_zj_b_threaten"); + } + }) + .vars({ target: target }); + } + }, + subSkill: { + //定要将你赶尽杀绝 + threaten: { + charlotte: true, + mark: true, + marktext: "噩", + intro: { content: "已经开始汗流浃背了" }, + ai: { threaten: 114514 * 1919810 }, + }, + }, + }, + //诸葛若雪 + dcqiongying: { + audio: 2, + enable: "phaseUse", + usable: 1, + direct: true, + filter: function (event, player) { + return player.canMoveCard(); + }, + content: function* (event, map) { + const player = map.player; + event.pushHandler("onNextMoveCard", (event, option) => { + if (_status.connectMode && event.step == 1 && event._result.bool && option.state == "end") { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + }); + let result = yield player + .moveCard(false, `###琼英###移动场上的一张牌,然后弃置一张与此牌花色相同的手牌(若没有则展示手牌)。`) + .set("logSkill", "dcqiongying") + .set("custom", { + add: {}, + replace: { + window: () => { + if (get.event().name == "chooseTarget") ui.click.cancel(); + }, + }, + }); + if (result.bool) { + const card = result.card, + suit = get.suit(card); + if (!player.hasCard({ suit: suit })) player.showHandcards(); + else player.chooseToDiscard({ suit: suit }, true, `请弃置一张${get.translation(suit)}手牌`); + } else { + player.getStat("skill").dcqiongying--; + } + }, + ai: { + expose: 0.2, + order: function (item, player) { + if (player.countCards("h") <= 4) return 0.5; + return 9; + }, + result: { + player: function (player) { + if (player.canMoveCard(true)) return 1; + return 0; + }, + }, + }, + }, + dcnuanhui: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function* (event, map) { + const player = map.player; + let result = yield player + .chooseTarget(get.prompt("dcnuanhui"), "选择一名装备区有牌的角色,该角色可以依次使用X张基本牌(X为其装备区牌数且至少为1)") + .set("ai", target => { + return get.event("aiTarget") == target ? 10 : 0; + }) + .set( + "aiTarget", + (() => { + const player = get.player(); + const list = get.inpileVCardList(info => { + return info[0] == "basic"; + }); + if (!list.length) return null; + const getUseValue = target => { + if (get.attitude(player, target) <= 0) return -1; + const toUse = []; + const hp = target.hp; + let eff = 0, + count = Math.max(1, target.countCards("e")); + while (count--) { + target.hp = Math.min(target.maxHp, target.hp + toUse.filter(card => card.name == "tao").length); + const listx = list + .map(info => { + const card = new lib.element.VCard({ + name: info[2], + nature: info[3], + isCard: true, + }); + return [card, target.getUseValue(card)]; + }) + .sort((a, b) => { + return b[1] - a[1]; + }); + const mostValuablePair = listx[0].slice(); + if (mostValuablePair[1] <= 0) mostValuablePair[1] = 0; + eff += mostValuablePair[1]; + toUse.push(mostValuablePair[0]); + target.hp = hp; + } + if (toUse.length > 1 && eff > 0) { + eff -= target + .getCards("e", card => { + return lib.filter.cardDiscardable(card, target, "dcnuanhui"); + }) + .map(card => { + return get.value(card, target); + }) + .reduce((p, c) => { + return p + c; + }, 0); + } + return eff; + }; + const playerList = game + .filterPlayer() + .map(current => [current, getUseValue(current)]) + .sort((a, b) => b[1] - a[1]); + if (playerList[0][1] <= 0) return null; + return playerList[0][0]; + })() + ); + if (!result.bool) return event.finish(); + const target = result.targets[0]; + player.logSkill("dcnuanhui", target); + if (!target.isUnderControl(true) && !target.isOnline()) game.delayx(); + const total = Math.max(1, target.countCards("e")); + let count = 0, + forced = false, + used = [], + discard = false; + while (count < total) { + const basicList = get.inpileVCardList(info => { + return info[0] == "basic" && target.hasUseTarget({ name: info[2], nature: info[3], isCard: true }); + }); + if (!basicList.length) { + game.log("但是", target, "无牌可出!"); + break; + } + const str = forced ? "视为使用一张基本牌" : "是否视为使用一张基本牌?"; + const result = yield target.chooseButton([str, [basicList, "vcard"]], forced).set("ai", button => { + return get.player().getUseValue({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }); + if (!result.bool) { + game.log("但是", target, "不愿出牌!"); + break; + } + forced = true; + const card = new lib.element.VCard({ + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }); + const result2 = yield target.chooseUseTarget(card, true, false); + if (!discard && result2.bool) { + if (used.includes(result.links[0][2])) discard = true; + else used.add(result.links[0][2]); + } + count++; + } + if (discard) { + const cards = target.getCards("e", card => { + return lib.filter.cardDiscardable(card, target, "dcnuanhui"); + }); + if (cards.length) target.discard(cards).discarder = target; + } + }, + ai: { + expose: 0.3, + threaten: 3.7, + }, + }, + //曹轶 + dcmiyi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function* (event, map) { + const player = map.player; + if (_status.connectMode) + game.broadcastAll(() => { + _status.noclearcountdown = true; + }); + let result = yield player + .chooseControl(["回复体力", "受到伤害"], "cancel2") + .set("choiceList", ["令你即将选择的角色各回复1点体力", "令你即将选择的角色各受到你造成的1点伤害"]) + .set("prompt", get.prompt("dcmiyi")) + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + (() => { + let damage = 0; + game.countPlayer(current => { + let eff = get.damageEffect(current, player, player); + if (!current.isDamaged()) { + if (eff > 0) eff = -eff; + } else if (current.hasSkillTag("maixie")) { + if (get.attitude(player, current) <= 0) { + if (current.getHp(true) >= 2) eff = 0; + else eff /= 10; + } else if (current.getHp(true) >= 2) { + eff += 30; + } + } else eff /= 3; + damage += eff; + }); + if (damage < -20) return 0; + if (damage > 5) return 1; + if (lib.skill.mbhuiyao.getUnrealDamageTargets(player, [[player], game.filterPlayer()])) return 0; + return "cancel2"; + })() + ); + if (result.control == "cancel2") { + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + return event.finish(); + } + const func = ["recover", "damage"], + ind = result.index; + const fn = func[ind]; + result = yield player + .chooseTarget(`蜜饴:令任意名角色${result.control.slice(0, 2)}1点${result.control.slice(2)}`, [1, Infinity]) + .set("ai", target => { + const toDamage = get.event("toDamage"); + let eff = get.damageEffect(target, player, player); + if (toDamage) { + if (target.hasSkillTag("maixie")) { + if (get.attitude(player, target) <= 0) { + if (target.getHp(true) >= 2) eff = 0; + else eff /= 10; + } else if (target.getHp(true) >= 2) { + eff += 30; + } + } + return eff; + } + if (!target.isDamaged()) { + eff *= -2; + } + if (target.getHp(true) >= 2) return -eff; + return 0; + }) + .set("toDamage", result.index == 1); + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (!result.bool) return event.finish(); + const targets = result.targets.slice().sortBySeat(); + player.logSkill("dcmiyi", targets, fn == "damage" ? "fire" : "green"); + while (targets.length) { + const target = targets.shift(); + if (!target.isIn()) continue; + target[fn](); + target + .when({ global: "phaseJieshuBegin" }) + .vars({ + fn: func[ind ^ 1], + source: player, + }) + .then(() => { + if (source.isIn()) { + if (!trigger._dcmiyi_logged) { + source.logSkill("dcmiyi"); + trigger._dcmiyi_logged = true; + } + source.line(player, fn == "damage" ? "fire" : "green"); + } + player[fn](source); + }); + } + }, + }, + dcyinjun: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + if (get.name(event.card, false) != "sha" && get.type2(event.card) != "trick") return false; + if (event.targets.length != 1 || !event.targets[0].isIn()) return false; + if (!player.canUse(new lib.element.VCard({ name: "sha" }), event.targets[0], false)) return false; + return player.hasHistory("lose", evt => { + if (evt.getParent() != event) return false; + return event.cards.every(card => { + return evt.hs.includes(card); + }); + }); + }, + prompt2: function (event, player) { + return `视为对${get.translation(event.targets)}使用一张无伤害来源的【杀】`; + }, + check: function (event, player) { + const sha = new lib.element.VCard({ name: "sha" }); + return Math.max(...[event.targets[0], player].map(source => get.effect(event.targets[0], sha, source, player))) > 0; + }, + logTarget: "targets", + content: function* (event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.targets[0]; + yield (player.useCard(new lib.element.VCard({ name: "sha" }), target, false).oncard = () => { + get.event().customArgs.default.customSource = { + isDead: () => true, + }; + }); + if (player.getHistory("useSkill", evt => evt.skill == "dcyinjun").length > player.getHp()) { + player.tempBanSkill("dcyinjun"); + } + }, + }, + //马伶俐 + dclima: { + audio: 2, + mod: { + globalFrom: function (from, to, distance) { + return ( + distance - + Math.max( + 1, + game.countPlayer(current => { + return current.countCards("e", card => { + return get.is.attackingMount(card) || get.is.defendingMount(card); + }); + }) + ) + ); + }, + }, + }, + dcxiaoyin: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(current => get.distance(player, current) <= 1); + }, + group: "dcxiaoyin_damage", + prompt2: function (event, player) { + return `亮出牌堆顶的${get.cnNumber(game.countPlayer(current => get.distance(player, current) <= 1))}张牌,获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上。`; + }, + frequent: true, + check: () => true, + content: function* (event, map) { + var player = map.player; + var count = game.countPlayer(current => get.distance(player, current) <= 1); + var cards = game.cardsGotoOrdering(get.cards(count)).cards; + yield player.showCards(cards, `${get.translation(player)}【硝引】亮出`); + player.gain( + cards.filter(i => get.color(i, false) == "red"), + "gain2" + ); + var blackOnes = cards.filter(i => get.color(i, false) == "black"); + if (!blackOnes.length) return event.finish(); + event.videoId = lib.status.videoId++; + var func = (cards, id) => { + var dialog = ui.create.dialog("硝引:剩余的黑色牌", `
    请选择至多${get.cnNumber(cards.length)}名座次连续的其他角色,然后将以下这些牌置于这些角色的武将牌上。
    `, cards); + dialog.videoId = id; + return dialog; + }; + if (player == game.me) func(blackOnes, event.videoId); + else if (player.isOnline2()) { + player.send(func, blackOnes, event.videoId); + } + var targets = game.filterPlayer(current => current != player); + if (targets.length == 1) var result = { bool: true, targets: targets }; + else + var result = yield player + .chooseTarget([1, blackOnes.length], true, (card, player, target) => { + if (player == target) return false; + var selected = ui.selected.targets; + if (!selected.length) return true; + for (var i of selected) { + if (i.getNext() == target || i.getPrevious() == target) return true; + } + return false; + }) + .set("complexSelect", true) + .set("complexTarget", true) + .set("multitarget", true) + .set("multiline", true) + .set("ai", target => { + if (get.event("aiTargets").includes(target)) return 10; + return 0.1; + }) + .set( + "aiTargets", + (() => { + var targets = game.filterPlayer(i => i != player).sortBySeat(player); + var maxEff = -Infinity, + aiTargets = []; + for (var i = 0; i < targets.length; i++) { + for (var j = 0; j < blackOnes.length; j++) { + if (targets.length < i + j) break; + var targetsx = targets.slice(i, j); + var tmpEff = targetsx + .map(current => { + return get.damageEffect(current, current, player, "fire"); + }) + .reduce((p, c) => { + return p + c; + }, 0); + if (tmpEff > maxEff) { + maxEff = tmpEff; + aiTargets = targetsx; + } + } + } + return aiTargets; + })() + ) + .set("prompt", false); + if (!result.bool) { + event.finish(); + return; + } + var func = (num, id) => { + var dialog = get.idDialog(id); + if (dialog) dialog.content.childNodes[1].innerHTML = `
    将${get.cnNumber(num)}张黑色牌按照选择的角色的座次顺序置于这些角色武将牌上
    `; + }; + var targets = result.targets.slice().sortBySeat(player); + var num = targets.length; + if (player == game.me) func(num, event.videoId); + else if (player.isOnline2()) player.send(func, num, event.videoId); + if (blackOnes.length == 1) var result = { bool: true, links: blackOnes }; + else + var result = yield player + .chooseButton(true, num) + .set("dialog", event.videoId) + .set("ai", () => 1); + game.broadcastAll("closeDialog", event.videoId); + if (result.bool) { + var cards = result.links; + player.line(targets); + targets.forEach((current, ind) => { + current.addToExpansion(cards[ind], "gain2").gaintag.add("dcxiaoyin"); + game.log(current, "将", cards[ind], "当“硝引”置于了武将牌上"); + }); + } + }, + marktext: "硝", + intro: { + content: "expansion", + markcount: "expansion", + }, + subSkill: { + damage: { + audio: "dcxiaoyin", + trigger: { global: "damageBegin3" }, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return event.player.getExpansions("dcxiaoyin").length; + }, + //direct:true, + async cost(event, trigger, player) { + const source = trigger.source, + target = trigger.player; + const cards = target.getExpansions("dcxiaoyin"); + if (trigger.hasNature("fire")) { + const types = cards.map(i => get.type2(i, false)); + const str = get.translation(types).replace(/(.*)、/, "$1或"); + event.result = await source + .chooseCard(`硝引:是否弃置一张${str}牌?`, `若如此做,将${get.translation(target)}的对应的“硝引”牌置入弃牌堆,令你对其造成的伤害+1`, "he", function (card, player) { + if (!get.event("types").includes(get.type2(card))) return false; + return lib.filter.cardDiscardable.apply(this, arguments); + }) + .set("types", types) + .set("ai", card => { + if (get.event("goon")) return 7 - get.value(card); + return 0; + }) + .set("goon", get.damageEffect(target, player, player, "fire") > 0 && get.attitude(player, target) <= 0) + .forResult(); + } else { + event.result = await source + .chooseBool(`###是否响应${get.translation(player)}的【硝引】?###获得${get.translation(target)}的一张“硝引”牌(${get.translation(cards)}),然后将你对其造成的此次伤害改为火焰伤害。`) + .set( + "choice", + (() => { + if (get.damageEffect(target, source, source, "fire") < get.damageEffect(target, source, source) - 5) return false; + if (cards.map(i => get.value(i)).reduce((p, c) => p + c, 0) > 0) return true; + return false; + })() + ) + .forResult(); + } + }, + async content(event, trigger, player) { + const source = trigger.source, + target = trigger.player; + if (trigger.hasNature("fire")) { + source.line(target, "fire"); + const type = get.type2(event.cards[0]); + await source.discard(event.cards).set("discarder", source); + //await game.asyncDelayx(); + const cardsToDiscard = target.getExpansions("dcxiaoyin").filter(card => get.type2(card, false) === type); + if (cardsToDiscard.length === 1) await target.loseToDiscardpile(cardsToDiscard); + else if (cardsToDiscard.length > 1) { + const result = await source.chooseButton([`请选择移去${get.translation(source)}的一张“硝引”牌`, cardsToDiscard], true).forResult(); + await target.loseToDiscardpile(result.links); + } + trigger.addNumber("num", 1); + } else { + source.line(target, "fire"); + const cards = target.getExpansions("dcxiaoyin"); + if (cards.length === 1) await source.gain(cards, target, "give"); + else if (cards.length > 1) { + const result = await source.chooseButton([`请选择获得${get.translation(source)}的一张“硝引”牌`, cards], true).forResult(); + await source.gain(result.links, target, "give"); + } + game.setNature(trigger, "fire"); + } + }, + }, + }, + ai: { + threaten: 4, + }, + }, + dchuahuo: { + audio: 2, + enable: "phaseUse", + usable: 1, + viewAs: { + name: "sha", + nature: "fire", + storage: { dchuahuo: true }, + }, + filterCard: { color: "red" }, + position: "hs", + filter: function (event, player) { + return player.countCards("hs", { color: "red" }); + }, + check: function (card) { + return 6 - get.value(card); + }, + precontent: function () { + event.getParent().addCount = false; + player + .when("useCardToPlayer") + .filter(evt => evt.card.storage && evt.card.storage.dchuahuo) + .then(() => { + if (trigger.target.getExpansions("dcxiaoyin").length) { + var targets = game.filterPlayer(current => { + return current.getExpansions("dcxiaoyin").length; + }); + player.chooseBool(`是否更改${get.translation(trigger.card)}的目标?`, `将此牌的目标改为所有有“硝引”的角色(${get.translation(targets)})。`).set("choice", targets.map(current => get.effect(current, trigger.card, player, player)).reduce((p, c) => p + c, 0) > get.effect(trigger.target, trigger.card, player, player)); + } else event.finish(); + }) + .then(() => { + if (result.bool) { + trigger.targets.length = 0; + trigger.getParent().triggeredTargets1.length = 0; + trigger.untrigger(); + var targets = game.filterPlayer(current => { + return current.getExpansions("dcxiaoyin").length; + }); + player.line(targets, "fire"); + trigger.targets.addArray(targets); + game.log(targets, "成为了", trigger.card, "的新目标"); + game.delayx(); + } + }); + }, + ai: { + order: () => get.order({ name: "sha" }) + 0.2, + result: { player: 1 }, + }, + }, + //武陆逊 + dcxiongmu: { + audio: 2, + trigger: { global: "roundStart" }, + // filter:function(event,player){ + // return player.countCards('h') { + return 6 - get.value(card); + }); + "step 2"; + if (result.bool) { + var cards = result.cards; + event.cards = cards; + game.log(player, `将${get.cnNumber(cards.length)}张牌置入了牌堆`); + player.loseToDiscardpile(cards, ui.cardPile, "blank").set("log", false).insert_index = function () { + return ui.cardPile.childNodes[get.rand(0, ui.cardPile.childNodes.length - 1)]; + }; + } else event.finish(); + "step 3"; + var list = [], + shown = []; + var piles = ["cardPile", "discardPile"]; + for (var pile of piles) { + for (var i = 0; i < ui[pile].childNodes.length; i++) { + var card = ui[pile].childNodes[i]; + var number = get.number(card, false); + if (!list.includes(card) && number == 8) { + list.push(card); + if (pile == "discardPile") shown.push(card); + if (list.length >= cards.length) break; + } + } + if (list.length >= cards.length) break; + } + if (list.length) { + var next = player.gain(list); + next.shown_cards = shown; + next.set("animate", function (event) { + var player = event.player, + cards = event.cards, + shown = event.shown_cards; + if (shown.length < cards.length) { + var num = cards.length - shown.length; + player.$draw(num); + game.log(player, "从牌堆获得了", get.cnNumber(num), "张点数为8的牌"); + } + if (shown.length > 0) { + player.$gain2(shown, false); + game.log(player, "从弃牌堆获得了", shown); + } + return 500; + }); + next.gaintag.add("dcxiongmu_tag"); + player.addTempSkill("dcxiongmu_tag", "roundStart"); + } + }, + ai: { + effect: { + target: function (card, player, target) { + if (target.countCards("h") > target.getHp() || player.hasSkillTag("jueqing")) return; + if (player._dcxiongmu_temp) return; + if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return; + if (get.tag(card, "damage")) { + if (target.getHistory("damage").length > 0) { + return [1, -2]; + } else { + if (get.attitude(player, target) > 0 && target.hp > 1) { + return 0; + } + if (get.attitude(player, target) < 0 && !player.hasSkillTag("damageBonus")) { + if (card.name == "sha") return; + var sha = false; + player._dcxiongmu_temp = true; + var num = player.countCards("h", function (card) { + if (card.name == "sha") { + if (sha) { + return false; + } else { + sha = true; + } + } + return get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0; + }); + delete player._dcxiongmu_temp; + if (player.hasSkillTag("damage")) { + num++; + } + if (num < 2) { + var enemies = player.getEnemies(); + if (enemies.length == 1 && enemies[0] == target && player.needsToDiscard()) { + return; + } + return 0; + } + } + } + } + }, + }, + }, + subSkill: { + minus: { + audio: "dcxiongmu", + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return ( + player.countCards("h") <= player.getHp() && + game + .getGlobalHistory( + "everything", + evt => { + return evt.name == "damage" && evt.player == player; + }, + event + ) + .indexOf(event) == 0 + ); + }, + forced: true, + locked: false, + content: function () { + trigger.num--; + }, + }, + tag: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("dcxiongmu_tag"); + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcxiongmu_tag")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcxiongmu_tag")) return false; + }, + }, + }, + }, + }, + dczhangcai: { + audio: 2, + 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"], + }, + filter: function (event, player) { + if (player.hasSkill("dczhangcai_all")) return true; + return get.number(event.card) == 8; + }, + prompt2: function (event, player) { + const num = player.hasSkill("dczhangcai_all") ? get.number(event.card) : 8; + let count = 1; + if (typeof num == "number") + count = Math.max( + 1, + player.countCards("h", card => get.number(card) == num) + ); + return "你可以摸" + get.cnNumber(count) + "张牌。"; + }, + check: (event, player) => { + const num = player.hasSkill("dczhangcai_all") ? get.number(event.card) : 8; + let count = 1; + if (typeof num == "number") + count = Math.max( + 1, + player.countCards("h", card => get.number(card) == num) + ); + return ui.cardPile.childNodes.length + ui.discardPile.childNodes.length >= count; + }, + frequent: true, + locked: false, + content: function () { + var num = player.hasSkill("dczhangcai_all") ? get.number(trigger.card) : 8; + var count = 1; + if (typeof num == "number") + count = Math.max( + 1, + player.countCards("h", card => get.number(card) == num) + ); + player.draw(count); + }, + ai: { + threaten: 4, + }, + subSkill: { + all: { + charlotte: true, + mark: true, + intro: { + content: "当你使用或打出牌时,你可以摸X张牌(X为你手牌中与此牌点数相同的牌数且至少为1)", + }, + }, + }, + }, + dcruxian: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player.awakenSkill("dcruxian"); + player.addTempSkill("dczhangcai_all", { player: "phaseBegin" }); + }, + ai: { + combo: "dczhangcai", + order: 15, + result: { + player: function (player) { + if (!player.hasSkill("dczhangcai")) return 0; + if (player.countCards("hs", card => get.number(card) != 8 && player.hasValueTarget(card)) > 3 || player.hp == 1) return 5; + return 0; + }, + }, + }, + }, + //新杀许靖 + dcshangyu: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + content: function () { + "step 0"; + var card = get.cardPile(card => get.name(card, false) == "sha"); + if (card) { + event.card = card; + player.gain(card, "gain2").gaintag.add("dcshangyu_tag"); + player.markAuto("dcshangyu", card); + } else { + player.chat("不是,连杀都没有?"); + event.finish(); + } + "step 1"; + if (get.owner(card) == player && get.position(card) == "h" && game.hasPlayer(current => current != player)) { + let targets = game + .filterPlayer( + i => { + return get.attitude(player, i) > 0; + }, + null, + true + ) + .sortBySeat( + get.zhu(player) || + game.findPlayer(i => { + return i.getSeatNum() === 1; + }) + ); + if (targets.includes(player)) targets = targets.slice(0, targets.indexOf(player)); + player + .chooseTarget(`是否将${get.translation(card)}交给一名其他角色?`, lib.filter.notMe) + .set("ai", target => { + let idx = _status.event.targets.indexOf(target); + if (idx < 0) return -1; + return 1 / (idx + 1); + }) + .set("targets", targets); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); + player.give(card, target).gaintag.add("dcshangyu_tag"); + } + player.addSkill("dcshangyu_effect"); + }, + subSkill: { + effect: { + audio: "dcshangyu", + trigger: { + global: "damageSource", + }, + filter: function (event, player) { + return event.cards && event.cards.some(card => player.getStorage("dcshangyu").includes(card)); + }, + forced: true, + charlotte: true, + direct: true, + group: ["dcshangyu_transfer", "dcshangyu_addTag"], + content: function () { + "step 0"; + var list = [player]; + if (trigger.source && trigger.source.isIn()) { + player.logSkill("dcshangyu_effect", trigger.source); + list.push(trigger.source); + } else player.logSkill("dcshangyu_effect"); + list.sortBySeat(); + game.asyncDraw(list); + }, + }, + transfer: { + audio: "dcshangyu", + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], + }, + forced: true, + direct: true, + filter: function (event, player) { + if ( + !game.hasPlayer(current => { + return !player.getStorage("dcshangyu_transfer").includes(current); + }) + ) + return false; + return event.getd().some(card => { + return get.position(card) == "d" && player.getStorage("dcshangyu").includes(card); + }); + }, + content: function () { + "step 0"; + var cards = trigger.getd().filter(card => { + return get.position(card) == "d" && player.getStorage("dcshangyu").includes(card); + }), + targets = game + .filterPlayer(current => { + return !player.getStorage("dcshangyu_transfer").includes(current); + }) + .sortBySeat(_status.currentPhase); + if (targets.length && targets[0] === _status.currentPhase && !_status.currentPhase.getCardUsable("sha")) targets.push(targets.shift()); + event.cards = cards; + player + .chooseTarget( + `赏誉:将${get.translation(cards)}交给一名可选角色`, + (card, player, target) => { + return !player.getStorage("dcshangyu_transfer").includes(target); + }, + true + ) + .set("ai", target => { + let att = get.sgnAttitude(_status.event.player, target), + idx = 1 + _status.event.targets.indexOf(target); + if (att < 0) return -idx; + return att + 1 / idx; + }) + .set("targets", targets); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcshangyu_transfer", target); + if (!player.storage.dcshangyu_transfer) { + player.when({ global: "phaseAfter" }).then(() => { + player.unmarkSkill("dcshangyu_transfer"); + delete player.storage.dcshangyu_transfer; + }); + } + player.markAuto("dcshangyu_transfer", target); + target.gain(cards, "gain2").set("giver", player).gaintag.add("dcshangyu_tag"); + } + }, + intro: { + content: "本回合已交给过$", + }, + }, + addTag: { + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + charlotte: true, + popup: false, + silent: true, + lastDo: true, + filter: function (event, player) { + return game.hasPlayer(current => { + var cards = event.getg(current); + return cards.some(card => player.getStorage("dcshangyu").includes(card)); + }); + }, + content: function () { + game.countPlayer(current => { + var cards = trigger.getg(current); + if (cards.length) { + cards = cards.filter(card => player.getStorage("dcshangyu").includes(card)); + current.addGaintag(cards, "dcshangyu_tag"); + } + }); + }, + }, + }, + }, + dccaixia: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + filter: function (event, player) { + return !player.hasMark("dccaixia_clear"); + }, + direct: true, + locked: false, + content: function () { + "step 0"; + var choices = Array.from({ + length: Math.min(5, game.players.length + game.dead.length), + }).map((_, i) => get.cnNumber(i + 1, true)); + player + .chooseControl(choices, "cancel2") + .set("prompt", get.prompt("dccaixia")) + .set("prompt2", "你可以摸至多" + get.cnNumber(choices.length) + "张牌,但是你此后需要再使用等量的牌才可再发动本技能。") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var cards = player.getCards("hs", card => get.name(card, player) !== "sha" && player.hasValueTarget(card)); + var damage = Math.min(player.getCardUsable({ name: "sha" }), player.countCards("hs", "sha")) + cards.filter(i => get.tag(i, "damage")).length; + if (player.isPhaseUsing() || player.hp + player.hujia + player.countCards("hs", i => get.tag(card, "recover")) > 2) { + if (damage) return Math.min(choices.length - 1, cards.length - damage); + return Math.min(choices.length - 1, cards.length - 1); + } + return choices.length - 1; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("dccaixia"); + var num = result.index + 1; + player.draw(num); + player.addMark("dccaixia_clear", num); + player.addSkill("dccaixia_clear"); + } + }, + mod: { + aiOrder: function (player, card, num) { + if (!get.tag(card, "damage")) return; + if (player.countMark("dccaixia_clear") > 1) return num / 3; + return num + 6; + }, + }, + subSkill: { + clear: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + return player.hasMark("dccaixia_clear"); + }, + forced: true, + popup: false, + charlotte: true, + content: function () { + player.removeMark("dccaixia_clear", 1); + }, + intro: { + name: "才瑕", + name2: "瑕", + content: "距离刷新技能还需使用&张牌", + }, + }, + }, + }, + //十周年二乔 + dcxingwu: { + intro: { + content: "expansion", + markcount: "expansion", + onunmark: function (storage, player) { + player.removeAdditionalSkill("dcluoyan"); + }, + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + audio: "xingwu", + trigger: { player: "phaseDiscardBegin" }, + filter: function (event, player) { + return player.countCards("h"); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard("h", get.prompt("dcxingwu"), "将一张手牌作为“舞”置于武将牌上") + .set("ai", function (card) { + var att = 1, + list = []; + for (var i of player.getExpansions("dcxingwu")) { + if (!list.includes(get.suit(i))) list.push(get.suit(i)); + } + if (!list.includes(get.suit(card))) att = 2; + if (_status.event.goon) return (20 - get.value(card)) * att; + return (7 - get.value(card)) * att; + }) + .set("goon", player.needsToDiscard() || player.getExpansions("dcxingwu").length == 2); + "step 1"; + if (result.bool) { + player.logSkill("dcxingwu"); + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("dcxingwu"); + } + "step 2"; + game.delayx(); + if (player.getExpansions("dcxingwu").length > 2) { + player.chooseButton(["是否移去三张“舞”并发射核弹?", player.getExpansions("dcxingwu")], 3).ai = button => { + if ( + game.hasPlayer(function (current) { + return get.attitude(player, current) < 0; + }) + ) + return 1; + return 0; + }; + } else event.finish(); + "step 3"; + if (result.bool) { + event.cards = result.links; + var list = [], + str = ["小型", "中型", "巨型"]; + for (var i of event.cards) { + if (!list.includes(get.suit(i))) list.push(get.suit(i)); + } + player.chooseTarget("请选择" + str[list.length - 1] + "核弹的投射的目标(伤害:" + list.length + "点)", lib.filter.notMe, true).ai = target => { + var att = 1; + if (target.sex == "male") att = 1.5; + if ((target.hp == target.sex) == "male" ? 2 : 1) att *= 1.2; + if (get.mode() == "identity" && player.identity == "fan" && target.isZhu) att *= 3; + return -get.attitude(player, target) * att * Math.max(1, target.countCards("e")); + }; + } + "step 4"; + if (result.bool) { + var list = []; + for (var i of event.cards) { + if (!list.includes(get.suit(i))) list.push(get.suit(i)); + } + player.loseToDiscardpile(event.cards); + player.logSkill("dcxingwu", result.targets[0]); + player.discardPlayerCard(result.targets[0], "e", result.targets[0].countCards("e"), true); + result.targets[0].damage(result.targets[0].sex == "female" ? 1 : list.length); + } + }, + }, + dcluoyan: { + derivation: ["retianxiang", "liuli"], + init: function (player) { + if (player.getExpansions("dcxingwu").length) player.addAdditionalSkill("dcluoyan", ["retianxiang", "liuli"]); + else player.removeAdditionalSkill("dcluoyan"); + }, + onremove: function (player) { + player.removeAdditionalSkill("dcluoyan"); + }, + trigger: { player: ["loseAfter", "loseAsyncAfter", "addToExpansionAfter"] }, + filter: function (event, player) { + var cards = player.getExpansions("dcxingwu"), + skills = player.additionalSkills.dcluoyan; + return !((cards.length && skills && skills.length) || (!cards.length && (!skills || !skills.length))); + }, + forced: true, + silent: true, + content: function () { + lib.skill.dcluoyan.init(player, "dcluoyan"); + }, + ai: { + combo: "dcxingwu", + }, + }, + retianxiang_daxiaoqiao: { + audio: "tianxiang_daxiaoqiao", + inherit: "retianxiang", + }, + //田尚衣 + dcposuo: { + onChooseToUse: function (event) { + if (!game.online && !event.dcposuo_cards) { + var player = event.player; + var evtx = event.getParent("phaseUse"); + var suits = lib.suit.slice(0).reverse(); + suits = suits.filter(suit => !player.getStorage("dcposuo_suits").includes(suit) && player.countCards("hs", card => get.suit(card, player) == suit)); + if ( + !suits.length || + player.getHistory("sourceDamage", evt => { + return evt.player != player && evt.getParent("phaseUse") == evtx; + }).length + ) + event.set("dcposuo_cards", undefined); + else { + var list = [], + cards = Array.from(ui.cardPile.childNodes); + cards.addArray(Array.from(ui.discardPile.childNodes)); + game.countPlayer(current => cards.addArray(current.getCards("hejxs"))); + for (var name of lib.inpile) { + if (!get.tag({ name: name }, "damage") || get.type(new lib.element.VCard({ name: name })) === "delay") continue; + let same = cards.filter(card => get.name(card, false) == name && !get.natureList(card, false).length); + if (same.length) { + for (var suit of suits) { + if (same.some(card => get.suit(card, false) == suit)) { + list.push([suit, "", name, undefined, suit]); + } + } + } + for (var nature of lib.inpile_nature) { + same = cards.filter(card => get.name(card, false) == name && get.is.sameNature(get.natureList(card, false), nature)); + if (same.length) { + for (var suit of suits) { + if (same.some(card => get.suit(card, false) == suit)) { + list.push([suit, "", name, nature, suit]); + } + } + } + } + } + event.set("dcposuo_cards", list); + } + } + }, + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return event.dcposuo_cards && event.dcposuo_cards.length; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("婆娑", [event.dcposuo_cards, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player; + return player.getUseValue({ name: button.link[2], nature: button.link[3] }); + }, + backup: function (links, player) { + return { + suit: links[0][4], + filterCard: function (card, player) { + return get.suit(card, player) == lib.skill.dcposuo_backup.suit; + }, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + check: function (card) { + return 6.5 - get.value(card); + }, + precontent: function () { + player.logSkill("dcposuo"); + delete event.result.skill; + player.addTempSkill("dcposuo_suits", "phaseUseAfter"); + player.markAuto("dcposuo_suits", [get.suit(event.result.cards[0])]); + }, + }; + }, + prompt: function (links, player) { + var suit = links[0][4]; + var name = links[0][2]; + var nature = links[0][3]; + return "将一张" + get.translation(suit) + "牌当作" + (get.translation(nature) || "") + get.translation(name) + "使用"; + }, + }, + ai: { + order: 10, + result: { player: 1 }, + }, + subSkill: { + suits: { + charlotte: true, + onremove: true, + }, + }, + }, + dcxiaoren: { + audio: 2, + trigger: { + source: "damageSource", + }, + usable: 1, + check: (event, player) => { + let rev = game.countPlayer(i => { + return i.isDamaged() && get.attitude(_status.event.player, i) > 0; + }); + if (!event.player.isIn() || game.countPlayer() < 2) return rev; + if (get.damageEffect(event.player.getPrevious(), player, _status.event.player) > -rev) return true; + return get.damageEffect(event.player.getNext(), player, _status.event.player) > -rev; + }, + content: function () { + "step 0"; + player.addTempSkill("dcxiaoren_dying"); + event.target = trigger.player; + "step 1"; + player.judge(); + "step 2"; + if (result.color == "red") + player.chooseTarget("绡刃:是否令一名角色回复1点体力(若回满则额外摸一张牌)?").set("ai", target => { + let rec = get.recoverEffect(target, _status.event.player, _status.event.player); + if (target.getDamagedHp() <= 1) return rec + get.effect(target, { name: "draw" }, target, _status.event.player); + return rec; + }); + else if (result.color != "black" || !trigger.player.isIn() || game.countPlayer() < 2) event.goto(9); + else event.goto(5); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target); + target.recover(); + } else event.goto(9); + "step 4"; + if (event.target.isHealthy()) event.target.draw(); + event.goto(9); + "step 5"; + var targets = [].addArray([target.getPrevious(), target.getNext()]); + if (targets.length > 1) + player + .chooseTarget( + "绡刃:对其中一名角色造成1点伤害", + (card, player, target) => { + return _status.event.targets.includes(target); + }, + true + ) + .set("ai", target => { + let player = _status.event.player; + return get.damageEffect(target, player, player); + }) + .set("targets", targets); + else if (targets.length) event._result = { bool: true, targets: targets }; + "step 6"; + if (result.bool) { + let target = result.targets[0]; + event.target = target; + player.line(target); + target.damage("nocard"); + } else event.goto(9); + "step 7"; + if (player.storage.dcxiaoren_dying || get.is.blocked(event.name, player)) event._result = { bool: false }; + else if (event.frequent) event._result = { bool: true }; + else + player + .chooseBool("绡刃:是否再次进行判定并执行对应效果直到未能执行此项或有角色进入濒死状态?") + .set("ai", function () { + return _status.event.bool; + }) + .set("bool", lib.skill.dcxiaoren.check({ player: event.target }, player)); + "step 8"; + if (result.bool) { + event.frequent = true; + event.goto(1); + } + "step 9"; + player.removeSkill("dcxiaoren_dying"); + }, + subSkill: { + dying: { + init: player => { + delete player.storage.dcxiaoren_dying; + }, + onremove: player => { + delete player.storage.dcxiaoren_dying; + }, + trigger: { global: "dying" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + player.storage.dcxiaoren_dying = true; + }, + }, + }, + }, + //孙翎鸾 + dclingyue: { + audio: 2, + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + var history = event.source.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + if (i == history.length - 1) { + if (history[i].sourceDamage.indexOf(event) > 0) return false; + } else if (history[i].sourceDamage.some(evt => evt != event)) return false; + if (history[i].isRound) break; + } + return true; + }, + content: function () { + var num = 1, + current = _status.currentPhase; + if (current && trigger.source != current) { + var num = 0, + players = game.players.slice(0).concat(game.dead); + for (var target of players) { + target.getHistory("sourceDamage", function (evt) { + num += evt.num; + }); + } + } + player.draw(num); + }, + }, + dcpandi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + var players = event.dcpandi; + if (!players || !players.length) return false; + var source = player.storage.dcpandi_effect; + return get.itemtype(source) != "player" || !source.isIn(); + }, + pandi_wrapKey: function () { + var str = ""; + for (var arg of arguments) { + if (arg === null || arg === undefined) { + str += arg + "-"; + continue; + } + switch (get.itemtype(arg)) { + case "player": + str += "p:" + arg.playerid; + break; + case "card": + if (arg.cardid) { + str += "c:" + arg.cardid; + } else { + str += "c:" + arg.name; + } + break; + default: + str += "n:" + arg; + break; + } + str += "-"; + } + return str; + }, + pandi_effect: function (target, card, player, viewer) { + if (!_status.event) return get.effect(target, card, player, viewer); + var key = lib.skill.dcpandi.pandi_wrapKey.apply(null, arguments); + var effect = _status.event.getTempCache("effect", key); + if (effect !== undefined) return effect; + effect = get.effect(target, card, player, viewer); + _status.event.putTempCache("effect", key, effect); + return effect; + }, + pandi_canUse: function (player, card, target, arg1, arg2) { + if (!_status.event) return player.canUse(card, target, arg1, arg2); + var key = lib.skill.dcpandi.pandi_wrapKey.apply(null, arguments); + var effect = _status.event.getTempCache("canUse", key); + if (effect !== undefined) return effect; + effect = player.canUse(card, target, arg1, arg2); + _status.event.putTempCache("canUse", key, effect); + return effect; + }, + pandi_effect_use: function (target, card, player, viewer) { + if (!_status.event) return get.effect_use(target, card, player, viewer); + var key = lib.skill.dcpandi.pandi_wrapKey.apply(null, arguments); + var effect = _status.event.getTempCache("effect_use", key); + if (effect !== undefined) return effect; + effect = get.effect_use(target, card, player, viewer); + _status.event.putTempCache("effect_use", key, effect); + return effect; + }, + onChooseToUse: function (event) { + if (!game.online && event.type == "phase" && !event.dcpandi) { + var players = game.filterPlayer(function (current) { + return current != event.player && current.getHistory("sourceDamage").length == 0; + }); + event.set("dcpandi", players); + } + }, + filterTarget: function (card, player, target) { + var players = _status.event.dcpandi; + if (!players || !players.length) return false; + return players.includes(target); + }, + content: function () { + if (target.isIn()) { + player.storage.dcpandi_effect = target; + player.addTempSkill("dcpandi_effect", "phaseUseAfter"); + } + }, + ai: { + threaten: 4, + order: 12, + result: { + player: function (player, target) { + return player.getCards("hs").reduce(function (eff, card) { + return Math.max(eff, lib.skill.dcpandi.getUseValue(card, target, player) - lib.skill.dcpandi.getUseValue(card, player, player)); + }, 0); + }, + }, + }, + getUseValue: function (card, player, viewer) { + if (typeof card == "string") { + card = { name: card, isCard: true }; + } + var key = lib.skill.dcpandi.pandi_wrapKey(card, player, viewer); + if (_status.event) { + var uv = _status.event.getTempCache("getUseValue", key); + if (uv !== undefined) { + return uv; + } + } + var targets = game.filterPlayer(); + var value = []; + var min = 0; + var info = get.info(card); + if (!info || info.notarget) { + if (_status.event) { + _status.event.putTempCache("getUseValue", key, 0); + } + return 0; + } + var range; + var select = get.copy(info.selectTarget); + if (select == undefined) { + if (info.filterTarget == undefined) { + if (_status.event) { + _status.event.putTempCache("getUseValue", key, true); + } + return true; + } + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + if (info.singleCard) range = [1, 1]; + game.checkMod(card, player, range, "selectTarget", player); + if (!range) { + if (_status.event) { + _status.event.putTempCache("getUseValue", key, 0); + } + return 0; + } + for (var i = 0; i < targets.length; i++) { + if (lib.skill.dcpandi.pandi_canUse(player, card, targets[i], null, true)) { + var eff = lib.skill.dcpandi.pandi_effect(targets[i], card, player, viewer); + value.push(eff); + } + } + value.sort(function (a, b) { + return b - a; + }); + for (var i = 0; i < value.length; i++) { + if (i == range[1] || (range[1] != -1 && value[i] <= 0)) break; + min += value[i]; + } + if (_status.event) { + _status.event.putTempCache("getUseValue", key, min); + } + return min; + }, + subSkill: { + effect: { + audio: "dcpandi", + charlotte: true, + priority: Infinity, + onremove: true, + mark: "character", + intro: { + content: "下一张牌视为由$使用", + }, + trigger: { player: "useCardBefore" }, + forced: true, + filter: function (event, player) { + var source = player.storage.dcpandi_effect; + return get.itemtype(source) == "player" && source.isIn(); + }, + logTarget: (event, player) => player.storage.dcpandi_effect, + content: function () { + trigger.player = player.storage.dcpandi_effect; + trigger.noai = true; + player.removeSkill("dcpandi_effect"); + game.delay(0.5); + }, + ai: { + order: function (card, player, target, current) { + if (typeof card != "object") return; + var source = player.storage.dcpandi_effect; + if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return; + return [0, lib.skill.dcpandi.pandi_effect_use(target, card, source, player), 0, lib.skill.dcpandi.pandi_effect(target, card, source, target)]; + }, + }, + mod: { + selectCard: function (card, player, range) { + var source = player.storage.dcpandi_effect; + if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return; + var range, + info = get.info(card); + var select = get.copy(info.selectTarget); + if (select == undefined) { + if (info.filterTarget == undefined) return [0, 0]; + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, source); + game.checkMod(card, source, range, "selectTarget", source); + }, + cardEnabled2: function (card, player, event) { + var source = player.storage.dcpandi_effect; + if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return; + var check = game.checkMod(card, source, event, "unchanged", "cardEnabled2", source); + return check; + }, + cardEnabled: function (card, player, event) { + var source = player.storage.dcpandi_effect; + if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return; + if (event === "forceEnable") { + var mod = game.checkMod(card, source, event, "unchanged", "cardEnabled", source); + if (mod != "unchanged") return mod; + return true; + } else { + var filter = get.info(card).enable; + if (!filter) return; + var mod = game.checkMod(card, player, source, "unchanged", "cardEnabled", source); + if (mod != "unchanged") return mod; + if (typeof filter == "boolean") return filter; + if (typeof filter == "function") return filter(card, source, event); + } + }, + cardUsable: function (card, player, num) { + var source = player.storage.dcpandi_effect; + if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return; + var event = _status.event; + if (event.type == "chooseToUse_button") event = event.getParent(); + if (source != _status.event.player) return true; + if (info.updateUsable == "phaseUse") { + if (event.getParent().name != "phaseUse") return true; + if (event.getParent().player != source) return true; + } + event.addCount_extra = true; + var num = info.usable; + if (typeof num == "function") num = num(card, source); + num = game.checkMod(card, source, num, event, "cardUsable", source); + if (typeof num != "number") return true; + if (source.countUsed(card) < num) return true; + if ( + game.hasPlayer(function (current) { + return game.checkMod(card, source, current, false, "cardUsableTarget", source); + }) + ) { + return true; + } + return false; + }, + playerEnabled: function (card, player, target) { + var source = player.storage.dcpandi_effect; + if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return; + return lib.filter.targetEnabledx(card, source, target); + }, + targetInRange: function (card, player, target) { + var source = player.storage.dcpandi_effect; + if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return; + return lib.filter.targetInRange(card, source, target); + }, + }, + }, + }, + }, + //新服灭霸 + dctongye: { + audio: 2, + trigger: { + global: ["phaseBefore", "dieAfter"], + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + if (game.countGroup() > 4) return false; + if (event.name == "die") return true; + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + player.addSkill("dctongye_buff"); + var num = game.countGroup(); + if (num <= 4) { + player.addMark("dctongye_handcard", 3, false); + game.log(player, "手牌上限", "#y+3"); + } + if (num <= 3) { + player.addMark("dctongye_range", 3, false); + game.log(player, "攻击范围", "#y+3"); + } + if (num <= 2) { + player.addMark("dctongye_sha", 3, false); + game.log(player, "使用杀的次数上限", "#y+3"); + } + if (num <= 1) { + player.addMark("dctongye_draw", 3, false); + game.log(player, "摸牌阶段额定摸牌数", "#y+3"); + } + }, + subSkill: { + buff: { + audio: "dctongye", + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + if (!player.hasMark("dctongye_draw")) return false; + return !event.numFixed; + }, + content: function () { + trigger.num += player.countMark("dctongye_draw"); + }, + charlotte: true, + onremove: ["dctongye_handcard", "dctongye_range", "dctongye_sha", "dctongye_draw"], + mark: true, + marktext: "统", + intro: { + content: function (storage, player) { + var str = ""; + var hand = player.countMark("dctongye_handcard"), + range = player.countMark("dctongye_range"), + sha = player.countMark("dctongye_sha"), + draw = player.countMark("dctongye_draw"); + if (hand > 0) { + str += "
  • 手牌上限+" + hand + ";"; + } + if (range > 0) { + str += "
  • 攻击范围+" + range + ";"; + } + if (sha > 0) { + str += "
  • 使用【杀】的次数上限+" + sha + ";"; + } + if (draw > 0) { + str += "
  • 摸牌阶段额定摸牌数+" + draw + "。"; + } + str = str.slice(0, -1) + "。"; + return str; + }, + }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("dctongye_handcard"); + }, + attackRange: function (player, num) { + return num + player.countMark("dctongye_range"); + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") { + return num + player.countMark("dctongye_sha"); + } + }, + }, + ai: { + threaten: 2.6, + }, + }, + }, + }, + dcmianyao: { + audio: 2, + trigger: { + player: "phaseDrawEnd", + }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player + .chooseCard("h", get.prompt("dcmianyao"), "展示点数最小的一张牌并随机插入牌堆中,然后于回合结束时摸此牌点数张牌。", function (card, player) { + var num = get.number(card, player); + return !player.hasCard(card2 => { + return card != card2 && get.number(card2, player) < num; + }); + }) + .set("ai", card => { + var player = _status.event.player; + var value = player.getUseValue(card, null, true); + if (value > 5 && get.number(card) <= 2) return 0; + return 1 + 1 / Math.max(0.1, value); + }); + "step 1"; + if (result.bool) { + player.logSkill("dcmianyao"); + var card = result.cards[0]; + event.card = card; + player.showCards([card], get.translation(player) + "发动了【免徭】"); + } else event.finish(); + "step 2"; + player.$throw(1, 1000); + player.lose(card, ui.cardPile).insert_index = function () { + return ui.cardPile.childNodes[get.rand(0, ui.cardPile.childNodes.length - 1)]; + }; + player.addTempSkill("dcmianyao_draw"); + var num = get.number(card); + if (num > 0) player.addMark("dcmianyao_draw", num, false); + }, + subSkill: { + draw: { + trigger: { + player: "phaseEnd", + }, + filter: function (event, player) { + return player.hasMark("dcmianyao_draw"); + }, + forced: true, + charlotte: true, + onremove: true, + content: function () { + player.draw(player.countMark("dcmianyao_draw")); + }, + }, + }, + }, + dcchangqu: { + audio: 2, + enable: "phaseUse", + usable: 1, + selectTarget: function () { + return [1, game.countPlayer() - 1]; + }, + complexSelect: true, + complexTarget: true, + multitarget: true, + multiline: true, + filterTarget: function (card, player, target) { + if (player == target) return false; + var next = player.getNext(), + prev = player.getPrevious(); + var selected = ui.selected.targets; + if (!selected.includes(next) && !selected.includes(prev)) return target == next || target == prev; + for (var i of selected) { + if (i.getNext() == target || i.getPrevious() == target) return true; + } + return false; + }, + contentBefore: function () { + event.getParent()._dcchangqu_targets = targets.slice(); + }, + content: function () { + "step 0"; + event.targets = event.getParent()._dcchangqu_targets; + var current = targets[0]; + current.addMark("dcchangqu_warship"); + current.addMark("dcchangqu_warshipx", 1, false); + event.num = 0; + game.delayx(); + "step 1"; + var target = targets.shift(); + event.target = target; + var num = Math.max(1, event.num); + var nextPlayer = targets.find(i => { + return i.isIn(); + }); + if (target.hasMark("dcchangqu_warshipx")) { + var prompt2 = "是否交给" + get.translation(player) + get.cnNumber(num) + "张手牌?" + (nextPlayer ? "若如此做,将“战舰”移动给" + get.translation(nextPlayer) + "," : ",") + "否则你下次受到的属性伤害值+" + num; + target + .chooseCard(get.translation(player) + "对你发动了【长驱】", prompt2, num) + .set("ai", card => { + if (_status.event.att > 0) return 15 - get.value(card); + if (_status.event.take) return 0; + return 8.2 - 0.8 * Math.min(5, _status.event.target.hp + _status.event.target.hujia) - get.value(card); + }) + .set("att", get.attitude(target, player)) + .set("take", function () { + var base = num; + var getEffect = function (target, player, num) { + var natures = ["fire", "thunder", "ice"]; + return ( + natures + .map(nature => { + return (get.damageEffect(target, target, player, nature) * Math.sqrt(num)) / Math.min(1.5, 1 + target.countCards("h")); + }) + .reduce((sum, eff) => { + return sum + eff; + }, 0) / natures.length + ); + }; + var eff = getEffect(player, player, base); + return targets + .some((current, ind) => { + var num = base + ind + 1; + var effx = getEffect(current, player, num); + return effx < eff; + }) + .set("target", target); + }); + } else event.goto(4); + "step 2"; + if (result.bool) { + var cards = result.cards; + target.give(cards, player); + event.num++; + } else { + target.addSkill("dcchangqu_add"); + target.addMark("dcchangqu_add", Math.max(1, event.num), false); + target.link(true); + event.goto(4); + } + "step 3"; + var nextPlayer = targets.find(i => { + return i.isIn(); + }); + if (nextPlayer) { + target.line(nextPlayer); + nextPlayer.addMark("dcchangqu_warship", target.countMark("dcchangqu_warship")); + nextPlayer.addMark("dcchangqu_warshipx", target.countMark("dcchangqu_warshipx"), false); + event.goto(1); + game.delayx(); + } + target.removeMark("dcchangqu_warship", target.countMark("dcchangqu_warship")); + target.removeMark("dcchangqu_warshipx", target.countMark("dcchangqu_warshipx"), false); + "step 4"; + var targets = game.players.slice().concat(game.dead); + targets.forEach(i => { + delete i.storage.dcchangqu_warshipx; + }); + }, + ai: { + order: 10, + expose: 0.05, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + var targets = game.filterPlayer(i => i != player); + targets.sortBySeat(player); + var targets2 = targets.reverse(); + var sum = 0; + var maxSum = -Infinity, + maxIndex = -1; + var maxSum2 = -Infinity, + maxIndex2 = -1; + for (var i = 0; i < targets.length; i++) { + var current = targets[i]; + var att = -get.attitude(player, current) - 0.1; + var val = Math.sqrt(i + 1) * att; + val /= 0.01 + Math.max(3, current.countCards("h") / 2); + sum += val; + if (sum > maxSum) { + maxSum = sum; + maxIndex = i; + } + } + var sum = 0; + for (var i = 0; i < targets2.length; i++) { + var current = targets[i]; + var att = -get.attitude(player, current) - 0.1; + var val = Math.sqrt(i + 1) * att; + val /= 0.01 + Math.max(3, current.countCards("h") / 2); + sum += val; + if (sum > maxSum2) { + maxSum2 = sum; + maxIndex2 = i; + } + } + if (maxSum < maxSum2) { + targets = targets2; + maxIndex = maxIndex2; + } + if (ui.selected.targets.length > maxIndex) return -100 * get.sgnAttitude(player, target); + if (target == targets[ui.selected.targets.length]) return get.sgnAttitude(player, target); + return 0; + }, + }, + }, + subSkill: { + warship: { + marktext: "舰", + intro: { + name: "战舰", + name2: "战舰", + content: "这里停了&艘战舰!不过啥用没有。", + }, + }, + add: { + trigger: { + player: "damageBegin3", + }, + filter: function (event, player) { + return event.hasNature() && player.hasMark("dcchangqu_add"); + }, + forced: true, + onremove: true, + charlotte: true, + content: function () { + "step 0"; + trigger.num += player.countMark("dcchangqu_add"); + player.removeSkill("dcchangqu_add"); + }, + marktext: "驱", + intro: { + content: "下次受到的属性伤害+#", + }, + }, + }, + }, + //周不疑 + dcshiji: { + audio: 2, + trigger: { + global: "phaseJieshuBegin", + }, + filter: function (event, player) { + return event.player.isIn() && !event.player.getHistory("sourceDamage").length; + }, + direct: true, + content: function () { + "step 0"; + trigger.player.addTempSkill("dcshiji_forbidself"); + var list = []; + for (var name of lib.inpile) { + var type = get.type(name); + if (type != "trick") continue; + if (player.getStorage("dcshiji_used").includes(name)) continue; + var card = { + name: name, + storage: { dcshiji: true }, + }; + if (trigger.player.hasUseTarget(card)) { + list.push([type, "", name]); + } + } + if (list.length) { + player + .chooseButton([get.prompt("dcshiji", trigger.player), [list, "vcard"]]) + .set("ai", button => { + if (_status.event.tochoose) return _status.event.getTrigger().player.getUseValue({ name: button.link[2] }); + return 0; + }) + .set( + "tochoose", + get.attitude(player, trigger.player) > 0 && + trigger.player.hasCard(card => { + return get.value(card) < 7; + }, "hes") + ); + } else event.finish(); + "step 1"; + if (result.bool) { + var card = { + name: result.links[0][2], + storage: { dcshiji: true }, + }; + var str = get.translation(card); + player.logSkill("dcshiji", trigger.player); + player.addTempSkill("dcshiji_used", "roundStart"); + player.markAuto("dcshiji_used", [card.name]); + player.popup(str); + game.log(player, "声明了", "#y" + str); + game.broadcastAll(function (card) { + lib.skill.dcshiji_backup.viewAs = card; + lib.skill.dcshiji_backup.prompt = "十计:是否将一张牌当做" + get.translation(card) + "使用?"; + }, card); + var next = trigger.player.chooseToUse(); + next.set("openskilldialog", "十计:是否将一张牌当做" + get.translation(card) + "使用?"); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "dcshiji_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("dcshiji_backup"); + } + }, + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card"; + }, + position: "hes", + selectCard: 1, + check: card => 7 - get.value(card), + popname: true, + }, + used: { + charlotte: true, + onremove: true, + mark: true, + marktext: "计", + intro: { + content: "本轮已声明过$", + }, + }, + forbidself: { + charlotte: true, + mod: { + targetEnabled: function (card, player, target) { + if (player == target && card.storage && card.storage.dcshiji) return false; + }, + }, + }, + }, + }, + dcsilun: { + audio: 2, + trigger: { + player: ["phaseZhunbeiBegin", "damageEnd"], + }, + frequent: true, + content: function () { + "step 0"; + player.draw(4); + event.count = 0; + event.equipCount = {}; + game.countPlayer(current => { + event.equipCount[current.playerid] = current.countCards("e"); + }, true); + "step 1"; + if (!player.countCards("he")) event.goto(5); + else + player.chooseCard("四论:选择一张牌(" + (event.count + 1) + "/" + "4)", "然后选择将此牌置于场上或牌堆的两端", true, "he").set("ai", card => { + var player = _status.event.player; + if (["equip", "delay"].includes(get.type(card)) && player.hasValueTarget(card)) return 50; + return 50 - get.value(card); + }); + "step 2"; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + event.count++; + var choices = ["牌堆顶", "牌堆底"]; + var type = get.type(card); + if ( + (type == "equip" && + game.hasPlayer(current => { + return current.canEquip(card); + })) || + (type == "delay" && + game.hasPlayer(current => { + return current.canAddJudge(card); + })) + ) + choices.unshift("场上"); + player + .chooseControl(choices) + .set("prompt", "请选择要将" + get.translation(card) + "置于的位置") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (["equip", "delay"].includes(get.type(card)) && player.hasValueTarget(card) && choices.includes("场上")) return "场上"; + var val = get.value(card); + var next = _status.currentPhase; + if (next) { + if (trigger.name == "damage") next = next.getNext(); + if ((get.attitude(player, next) > 0 && val >= 6) || (get.attitude(player, next) < 0 && val <= 4.5)) return "牌堆顶"; + } + return "牌堆底"; + })() + ); + } + "step 3"; + if (result.control == "场上") { + var type = get.type(card); + player + .chooseTarget("将" + get.translation(card) + "置于一名角色的场上", true, (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set( + "targets", + game.filterPlayer(current => { + if (type == "equip") return current.canEquip(card); + if (type == "delay") return current.canAddJudge(card); + return false; + }) + ) + .set("ai", target => { + var player = _status.event.player; + var card = _status.event.card; + return ( + get.attitude(player, target) * + (get.type(card) == "equip" + ? get.value(card, target) + : get.effect( + target, + { + name: card.viewAs || card.name, + cards: [card], + }, + target, + target + )) + ); + }) + .set("card", card); + } else { + player.$throw(card, 1000); + var next = player.lose(card, ui.cardPile, "visible"); + if (result.control == "牌堆顶") next.insert_card = true; + game.log(player, "将", card, "置于了", "#y" + result.control); + } + "step 4"; + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target); + player.$give(card, target, false); + if (get.type(card) == "equip") { + target.equip(card); + } else { + target.addJudge(card); + } + } + "step 5"; + game.countPlayer(current => { + var count = current.countCards("e"); + var prevCount = event.equipCount[current.playerid] || 0; + if (count != prevCount) { + current.link(false); + current.turnOver(false); + } + event.equipCount[current.playerid] = count; + }); + if (event.count < 4) event.goto(1); + }, + }, + //杜预 + dcjianguo: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("dcjianguo_0") || !player.hasSkill("dcjianguo_1"); + }, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("谏国:请选择一项", "hidden"); + dialog.add([ + [ + ["discard", "令一名角色摸一张牌,然后弃置一半手牌"], + ["draw", "令一名角色弃置一张牌,然后摸等同于手牌数一半的牌"], + ], + "textbutton", + ]); + return dialog; + }, + filter: function (button, player) { + if (button.link == "discard" && player.hasSkill("dcjianguo_0")) return false; + if (button.link == "draw" && player.hasSkill("dcjianguo_1")) return false; + return true; + }, + check: function (button) { + var player = _status.event.player; + if (button.link == "discard") { + var discard = Math.max.apply( + Math, + game + .filterPlayer(current => { + return lib.skill.dcjianguo_discard.filterTarget(null, player, current); + }) + .map(current => { + return get.effect(current, "dcjianguo_discard", player, player); + }) + ); + return discard; + } + if (button.link == "draw") { + var draw = Math.max.apply( + Math, + game + .filterPlayer(current => { + return lib.skill.dcjianguo_draw.filterTarget(null, player, current); + }) + .map(current => { + return get.effect(current, "dcjianguo_draw", player, player); + }) + ); + return draw; + } + return 0; + }, + backup: function (links) { + return get.copy(lib.skill["dcjianguo_" + links[0]]); + }, + prompt: function (links) { + if (links[0] == "discard") return "令一名角色摸一张牌,然后弃置一半手牌"; + return "令一名角色弃置一张牌,然后摸等同于手牌数一半的牌"; + }, + }, + ai: { + order: 10, + threaten: 2.8, + result: { + //想让杜预两个技能自我联动写起来太累了,开摆 + player: 1, + }, + }, + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, + backup: { audio: "dcjianguo" }, + discard: { + audio: "dcjianguo", + filterTarget: () => true, + filterCard: () => false, + selectCard: -1, + content: function () { + "step 0"; + player.addTempSkill("dcjianguo_0", "phaseUseAfter"); + target.draw(); + game.delayex(); + "step 1"; + var num = Math.ceil(target.countCards("h") / 2); + if (num > 0) target.chooseToDiscard(num, true, "谏国:请弃置" + get.cnNumber(num) + "张手牌"); + }, + ai: { + result: { + target: function (player, target) { + return 1.1 - Math.floor(target.countCards("h") / 2); + }, + }, + tag: { + gain: 1, + loseCard: 2, + }, + }, + }, + draw: { + audio: "dcjianguo", + filterTarget: function (card, player, target) { + return target.countCards("he"); + }, + filterCard: () => false, + selectCard: -1, + content: function () { + "step 0"; + player.addTempSkill("dcjianguo_1", "phaseUseAfter"); + target.chooseToDiscard("he", true, "谏国:请弃置一张牌"); + "step 1"; + var num = Math.ceil(target.countCards("h") / 2); + if (num > 0) target.draw(num); + }, + ai: { + result: { + target: function (player, target) { + var fix = 0; + var num = target.countCards("h"); + if (player == target && num % 2 == 1 && num >= 5) fix += 1; + return Math.ceil(num / 2 - 0.5) + fix; + }, + }, + tag: { + loseCard: 1, + gain: 2, + }, + }, + }, + }, + }, + dcdyqingshi: { + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + filter: function (event, player) { + if (player != _status.currentPhase) return false; + if (!event.isFirstTarget) return false; + if (event.card.name != "sha" && get.type(event.card, false) != "trick") return false; + if (player.countCards("h") != player.getHistory("useCard").indexOf(event.getParent()) + 1) return false; + return event.targets.some(target => { + return target != player && target.isIn(); + }); + }, + direct: true, + locked: false, + content: function () { + "step 0"; + var targets = trigger.targets.filter(target => { + return target != player && target.isIn(); + }); + player + .chooseTarget(get.prompt("dcdyqingshi"), "对一名不为你的目标角色造成1点伤害", (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set("ai", target => { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }) + .set("targets", targets); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcdyqingshi", target); + target.damage(); + } + }, + mod: { + aiOrder: function (player, card, num) { + if (_status.currentPhase != player) return; + var cardsh = []; + if (Array.isArray(card.cards)) { + cardsh.addArray( + card.cards.filter(card => { + return get.position(card) == "h"; + }) + ); + } + var del = player.countCards("h") - cardsh.length - player.getHistory("useCard").length - 1; + if (del < 0) return; + if (del > 0) { + if (card.name == "sha" || get.type(card, false) != "trick") return num / 3; + return num + 1; + } + return num + 15; + }, + }, + }, + //甘糜 + dcchanjuan: { + init: function (player) { + if (!player.storage.dcchanjuan) { + player.storage.dcchanjuan = {}; + } + }, + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + if ( + event.targets.length != 1 || + !player.hasHistory("lose", evt => { + if (evt.getParent() != event) return false; + return event.cards.every(card => evt.hs.includes(card)); + }) + ) + return false; + if (!["basic", "trick"].includes(get.type(event.card, false))) return false; + if (event.getParent(2).name == "dcchanjuan") return false; + return !player.storage.dcchanjuan[event.card.name] || player.storage.dcchanjuan[event.card.name] < 2; + }, + direct: true, + content: function () { + "step 0"; + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }; + player + .chooseUseTarget(card, get.prompt("dcchanjuan"), false, false) + .set("prompt2", "视为再使用一张" + get.translation(card)) + .set("logSkill", "dcchanjuan"); + "step 1"; + if (result.bool) { + if (!player.storage.dcchanjuan[trigger.card.name]) player.storage.dcchanjuan[trigger.card.name] = 0; + player.storage.dcchanjuan[trigger.card.name]++; + var list1 = trigger.targets, + list2 = result.targets; + if (list1.slice().removeArray(list2).length == 0 && list2.slice().removeArray(list1).length == 0) player.draw(); + } + }, + ai: { threaten: 2 }, + mark: true, + intro: { + markcount: storage => 0, + content: function (storage) { + var str = "已使用牌名:", + names = Object.keys(storage); + if (!names.length) str += "无"; + else + names.forEach(name => { + str += "
  • 【"; + str += get.translation(name); + str += "】:"; + str += storage[name] + "次"; + }); + return str; + }, + }, + }, + dcxunbie: { + audio: 2, + trigger: { + player: "dying", + }, + filter: function (event, player) { + if (player.hp > 0) return false; + var characters = ["dc_ganfuren", "dc_mifuren"]; + game.countPlayer(current => { + if (current.name1 == "dc_ganfuren" || current.name2 == "dc_ganfuren") { + characters.remove("dc_ganfuren"); + } + if (current.name1 == "dc_mifuren" || current.name2 == "dc_mifuren") { + characters.remove("dc_mifuren"); + } + }); + return characters.length; + }, + check: () => true, + skillAnimation: true, + animationColor: "fire", + limited: true, + derivation: ["dcyongjue", "dcshushen", "dcshenzhi", "dcguixiu", "dccunsi"], + content: function () { + "step 0"; + player.awakenSkill("dcxunbie"); + if (player.name1 == "ganfurenmifuren" || player.name2 == "ganfurenmifuren") { + var characters = ["dc_ganfuren", "dc_mifuren"]; + game.countPlayer(current => { + if (current.name1 == "dc_ganfuren" || current.name2 == "dc_ganfuren") { + characters.remove("dc_ganfuren"); + } + if (current.name1 == "dc_mifuren" || current.name2 == "dc_mifuren") { + characters.remove("dc_mifuren"); + } + }); + if (characters.length == 1) event._result = { control: characters[0] }; + else { + player + .chooseControl(characters) + .set("dialog", ["选择要替换成的武将", [characters, "character"]]) + .set("ai", () => [0, 1].randomGet()); + } + } else event.goto(2); + "step 1"; + var character = result.control; + if (!_status.characterlist) { + lib.skill.pingjian.initList(); + } + player.reinitCharacter("ganfurenmifuren", character); + "step 2"; + player.recover(1 - player.hp); + player.addTempSkill("dcxunbie_muteki", { player: "phaseAfter" }); + }, + subSkill: { + muteki: { + trigger: { + player: "damageBegin4", + }, + charlotte: true, + forced: true, + content: function () { + trigger.cancel(); + }, + mark: true, + intro: { content: "防止受到的所有伤害直到我的回合结束" }, + ai: { + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) return "zeroplayertarget"; + }, + }, + }, + }, + }, + }, + //散装版糜夫人 + dcguixiu: { + audio: "guixiu", + trigger: { + player: "phaseBegin", + }, + forced: true, + onremove: true, + filter: function (event, player) { + return !player.hasMark("dcguixiu"); + }, + group: "dcguixiu_rec", + content: function () { + player.addMark("dcguixiu", 1, false); + player.draw(2); + }, + subSkill: { + rec: { + audio: "guixiu", + trigger: { + player: "useSkillAfter", + }, + forced: true, + filter: function (event, player) { + return event.skill == "dccunsi" && player.isDamaged(); + }, + content: function () { + player.recover(); + }, + }, + }, + }, + dccunsi: { + audio: "cunsi", + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + filterTarget: true, + derivation: "dcyongjue", + content: function () { + "step 0"; + player.awakenSkill("dccunsi"); + target.addSkillLog("dcyongjue"); + if (target != player) player.draw(2); + }, + ai: { + order: 10, + result: { + target: 1, + }, + }, + }, + dcyongjue: { + audio: "yongjue", + trigger: { + player: "useCard", + }, + filter: function (event, player) { + var evtx = event.getParent("phaseUse"); + if (!evtx || evtx.player != player) return false; + return ( + player + .getHistory("useCard", evt => { + return evt.card.name == "sha" && event.getParent("phaseUse") == evtx; + }) + .indexOf(event) == 0 + ); + }, + direct: true, + content: function () { + "step 0"; + var choices = ["选项一"]; + var choiceList = ["令" + get.translation(trigger.card) + "不计入次数", "获得此牌"]; + if (trigger.cards.length) { + choices.push("选项二"); + choiceList[1] = "获得" + get.translation(trigger.cards); + } else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (choices.length == 3 && trigger.addCount === false) return 1; + if (player.getCardUsable({ name: "sha" }) < player.countCards("hs", "sha")) return 0; + if (choices.length == 3) return 1; + return 0; + })() + ); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + return; + } + player.logSkill("dcyongjue"); + game.log(player, "选择了", "#y" + result.control); + if (result.control == "选项一") { + if (trigger.addCount !== false) { + trigger.addCount = false; + trigger.player.getStat().card.sha--; + } + } else { + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); + } + }, + }, + //散装版甘夫人 + dcshushen: { + audio: "shushen", + trigger: { + player: "recoverEnd", + }, + direct: true, + content: function () { + "step 0"; + event.num = trigger.num; + "step 1"; + player.chooseTarget(get.prompt("dcshushen"), "选择一名其他角色,然后令其回复1点体力或令你与其各摸一张牌", lib.filter.notMe).set("ai", target => { + var player = _status.event.player; + return get.recoverEffect(target, player, player) / 2 + get.attitude(player, target); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dcshushen", target); + event.num--; + var choices = ["选项二"]; + var choiceList = ["令" + get.translation(target) + "回复1点体力", "你与" + get.translation(target) + "各摸一张牌"]; + if (target.isDamaged()) choices.unshift("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "淑慎:请选择一项") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (target.hp <= 2 || get.recoverEffect(target, player, player) > 20) return 0; + return "选项二"; + })() + ); + } else event.finish(); + "step 3"; + if (result.control == "选项一") { + target.recover(); + } else { + var drawers = [player, target].sortBySeat(_status.currentPhase); + game.asyncDraw(drawers); + } + "step 4"; + if (event.num > 0) event.goto(1); + }, + }, + dcshenzhi: { + audio: "shenzhi", + trigger: { + player: "phaseZhunbeiBegin", + }, + filter: function (event, player) { + return player.countCards("h") > player.hp; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt("dcshenzhi"), "弃置一张手牌,然后回复1点体力") + .set("logSkill", "dcshenzhi") + .set("ai", card => { + var player = _status.event.player; + if (!player.isDamaged()) return 0; + return Math.min(3, 10 - 2 * player.hp) - get.value(card); + }); + "step 1"; + if (result.bool) { + player.recover(); + } + }, + }, + //阮籍 + dczhaowen: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h"); + }, + check: function (event, player) { + return player.hasCard(card => { + return get.color(card) == "black" || (get.color(card) == "red" && player.hasValueTarget(card)); + }); + }, + content: function () { + "step 0"; + player.showHandcards(); + "step 1"; + player.addTempSkill("dczhaowen_effect"); + game.broadcastAll(function (cards) { + cards.forEach(card => card.addGaintag("dczhaowen_tag")); + }, player.getCards("h")); + }, + ai: { + threaten: 3, + }, + subSkill: { + effect: { + audio: "dczhaowen", + enable: "chooseToUse", + charlotte: true, + onremove: function (player) { + player.removeGaintag("dczhaowen_tag"); + }, + hiddenCard: function (player, name) { + return ( + get.type(name) == "trick" && + !player.getStorage("dczhaowen_viewed").includes(name) && + player.countCards("h", card => { + return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag"); + }) > 0 + ); + }, + filter: function (event, player) { + if ( + !player.hasCard(card => { + return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag"); + }) + ) + return false; + var storage = player.getStorage("dczhaowen_viewed"); + for (var i of lib.inpile) { + if (!storage.includes(i) && get.type(i) == "trick" && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var cards = player.getCards("h", card => { + return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag"); + }); + var storage = player.getStorage("dczhaowen_viewed"); + var list = []; + for (var i of lib.inpile) { + if (!storage.includes(i) && get.type(i) == "trick" && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) { + list.push(["锦囊", "", i]); + } + } + return ui.create.dialog("昭文", [list, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player; + return player.getUseValue({ name: button.link[2] }) + 1; + }, + backup: function (links, player) { + return { + audio: "dczhaowen", + popname: true, + filterCard: function (card, player) { + return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag"); + }, + selectCard: 1, + position: "h", + viewAs: { + name: links[0][2], + }, + onuse: function (links, player) { + player.addTempSkill("dczhaowen_viewed"); + player.markAuto("dczhaowen_viewed", [links.card.name]); + }, + }; + }, + prompt: function (links, player) { + return "将一张展示过的黑色手牌当做" + get.translation(links[0][2]) + "使用"; + }, + }, + group: "dczhaowen_draw", + mod: { + aiOrder: function (player, card, num) { + var cards = []; + if (card.cards) cards.addArray(cards); + if (get.itemtype(card) == "card") cards.push(card); + for (var cardx of cards) { + if (get.color(cardx) != "red") continue; + if (cardx.hasGaintag("dczhaowen_tag")) return num + 0.2; + } + }, + }, + ai: { + order: 12, + result: { + player: 1, + }, + }, + }, + draw: { + audio: "dczhaowen", + forced: true, + charlotte: true, + trigger: { player: "useCard" }, + filter: function (event, player) { + var cards = event.cards.filter(card => get.color(card, player) == "red"); + return player.hasHistory("lose", evt => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dczhaowen_tag")) { + if (cards.some(card => card.cardid == i)) return true; + } + } + }); + }, + content: function () { + var num = 0; + var cards = trigger.cards.filter(card => get.color(card, player) == "red"); + player.getHistory("lose", evt => { + if (trigger != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dczhaowen_tag")) { + if (cards.some(card => card.cardid == i)) num++; + } + } + }); + while (num--) player.draw(); + }, + ai: { + effect: { + player: (card, player, target) => { + if (get.itemtype(card) === "card" && cardx.hasGaintag("dczhaowen_tag") && get.color(card, player) === "red") return [1, 1]; + }, + }, + }, + }, + viewed: { + onremove: true, + charlotte: true, + }, + effect_backup: { + audio: "dczhaowen", + }, + }, + }, + dcjiudun: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + if (event.player == player || get.color(event.card) != "black") return false; + if (player.hasSkill("jiu")) + return player.countCards("h", card => { + return _status.connectMode || lib.filter.cardDiscardable(card, player, "dcjiudun"); + }); + return true; + }, + direct: true, + content: function () { + "step 0"; + if (player.hasSkill("jiu")) { + player + .chooseToDiscard(get.prompt("dcjiudun"), '
    弃置一张手牌,令' + get.translation(trigger.card) + "对你无效
    ") + .set("logSkill", "dcjiudun") + .set("ai", card => { + if (_status.event.goon) return 4.5 + Math.max(0, 3 - player.hp) - get.value(card); + return 0; + }) + .set( + "goon", + (function () { + if (get.effect(player, trigger.card, trigger.player, player) < -4 * Math.max(0, 5 - Math.sqrt(player.countCards("h")))) return true; + return false; + })() + ); + event.goto(2); + } else { + player.chooseBool(get.prompt("dcjiudun"), "摸一张牌,然后视为使用一张【酒】").set("ai", () => 1); + } + "step 1"; + if (result.bool) { + player.logSkill("dcjiudun"); + player.draw(); + player.chooseUseTarget("jiu", true); + } + event.finish(); + "step 2"; + if (result.bool) { + trigger.excluded.add(player); + game.log(trigger.card, "对", player, "无效"); + } + }, + ai: { + jiuSustain: true, + skillTagFilter: function (player, tag, name) { + if (name != "phase") return false; + }, + effect: { + target: (card, player, target) => { + if (player === target || typeof card !== "object" || get.color(card) !== "black") return; + if (target.hasSkill("jiu")) { + if ( + card.name !== "huogong" && + get.tag(card, "damage") && + get.attitude(player, target) <= 0 && + target.hasCard(i => { + return _status.connectMode || lib.filter.cardDiscardable(i, player, "dcjiudun"); + }, "h") + ) + return [0, -1]; + } else return [1, 1.2]; + }, + }, + }, + }, + //武诸葛 + dcjincui: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return true; + }, + forced: true, + group: "dcjincui_advent", + content: function () { + "step 0"; + var num = 0; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (get.number(card) == 7) { + num++; + if (num >= player.maxHp) break; + } + } + if (num < 1) num = 1; + if (num > player.hp) player.recover(num - player.hp); + else if (num < player.hp) player.loseHp(player.hp - num); + "step 1"; + var num = player.hp; + 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 target = _status.event.getTrigger().name == "phaseZhunbei" ? player : player.next; + var att = get.sgn(get.attitude(player, target)); + var top = []; + var judges = target.getCards("j"); + var stopped = false; + if (player != target || !target.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)) * att; + }); + if (judge(cards[0]) * att < 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)) * att; + }); + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) break; + top.unshift(cards.shift()); + } + } + bottom = cards; + return [top, bottom]; + }; + "step 2"; + 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]); + } + if (event.triggername == "phaseZhunbeiBegin" && top.length == 0) { + player.addTempSkill("reguanxing_on"); + } + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); + game.updateRoundNumber(); + game.delayx(); + }, + ai: { + guanxing: true, + effect: { + target: function (card, player, target) { + if (!get.tag(card, "damage")) return; + var num = 0, + bool = false; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (get.number(card) == 7) { + num++; + if (num >= target.hp) { + bool = true; + break; + } + } + } + if (bool) return 0.2; + }, + }, + threaten: 0.6, + }, + subSkill: { + advent: { + audio: "dcjincui", + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") < 7; + }, + content: function () { + player.drawTo(7); + }, + }, + }, + }, + dcqingshi: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + if (!player.isPhaseUsing() || player.hasSkill("dcqingshi_blocker")) return false; + if (player.getStorage("dcqingshi_clear").includes(event.card.name)) return false; + if ( + player.hasCard(card => { + return get.name(card) == event.card.name; + }) + ) + return true; + return false; + }, + direct: true, + content: function () { + "step 0"; + var choices = []; + var choiceList = ["令" + get.translation(trigger.card) + "对其中一个目标角色造成的伤害+1", "令任意名其他角色各摸一张牌", "摸三张牌,然后〖情势〗于本回合失效"]; + if (trigger.targets && trigger.targets.length) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + "(无目标角色)"; + if (game.countPlayer(i => i != player)) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (player.hp > 0) choices.push("选项三"); + else choiceList[2] = '' + choiceList[1] + "(体力值为0)"; + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("dcqingshi")) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (() => { + var choicesx = choices.slice(); + var cards = player.getCards("hs"); + var bool1 = + get.tag(trigger.card, "damage") && + choicesx.includes("选项一") && + trigger.targets.some(current => { + return get.attitude(player, current) < 0; + }), + bool2 = choicesx.includes("选项二"); + if (bool2) + bool2 = game.countPlayer(function (current) { + return player != current && get.attitude(player, current) > 0; + }); + else bool2 = 0; + if (bool1 || bool2) { + for (var i = 0; i < cards.length; i++) { + var name = get.name(cards[i]); + if (player.getStorage("dcqingshi_clear").includes(name)) continue; + for (var j = i + 1; j < cards.length; j++) { + if (name === get.name(cards[j]) && get.position(cards[i]) + get.position(cards[j]) !== "ss" && player.hasValueTarget(cards[i])) { + choicesx.remove("选项三"); + break; + } + } + } + } + if (bool2 > 2) return "选项二"; + if (choicesx.includes("选项三")) return "选项三"; + if (bool2 === 2) return "选项二"; + if (bool1) return "选项一"; + if (bool2) return "选项二"; + return "cancel2"; + })() + ); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("dcqingshi"); + game.log(player, "选择了", "#y" + result.control); + var index = ["选项一", "选项二", "选项三"].indexOf(result.control) + 1; + player.addTempSkill("dcqingshi_clear"); + player.markAuto("dcqingshi_clear", [trigger.card.name]); + var next = game.createEvent("dcqingshi_after"); + next.player = player; + next.card = trigger.card; + next.setContent(lib.skill.dcqingshi["content" + index]); + } + }, + content1: function () { + "step 0"; + player + .chooseTarget("令" + get.translation(card) + "对其中一个目标造成的伤害+1", true, (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set("ai", target => { + return 2 - get.attitude(_status.event.player, target); + }) + .set("targets", event.getParent().getTrigger().targets); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + player.addTempSkill("dcqingshi_ex"); + if (!player.storage.dcqingshi_ex) player.storage.dcqingshi_ex = []; + player.storage.dcqingshi_ex.push([target, card]); + } + }, + content2: function () { + "step 0"; + player.chooseTarget("令任意名其他角色各摸一张牌", [1, Infinity], true, lib.filter.notMe).set("ai", target => { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var targets = result.targets; + targets.sortBySeat(); + player.line(targets); + game.asyncDraw(targets); + game.delayex(); + } + }, + content3: function () { + "step 0"; + player.draw(3); + player.addTempSkill("dcqingshi_blocker"); + }, + subSkill: { + ex: { + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return ( + player.storage.dcqingshi_ex && + player.storage.dcqingshi_ex.some(info => { + return info[0] == event.player && info[1] == event.card; + }) + ); + }, + forced: true, + charlotte: true, + popup: false, + onremove: true, + content: function () { + trigger.num++; + for (var i = 0; i < player.storage.dcqingshi_ex.length; i++) { + if (player.storage.dcqingshi_ex[i][1] == trigger.card) player.storage.dcqingshi_ex.splice(i--, 1); + } + }, + }, + clear: { + onremove: true, + charlotte: true, + }, + blocker: { charlotte: true }, + }, + ai: { + threaten: 6, + }, + }, + dczhizhe: { + audio: 2, + enable: "phaseUse", + limited: true, + filterCard: true, + position: "h", + discard: false, + lose: false, + delay: false, + skillAnimation: true, + animationColor: "metal", + check: function (card) { + if (get.type(card) != "basic" && get.type(card) != "trick") return 0; + return get.value(card) - 7.5; + }, + content: function () { + "step 0"; + var card = cards[0]; + player.awakenSkill("dczhizhe"); + var cardx = game.createCard2(card.name, card.suit, card.number, card.nature); + player.gain(cardx).gaintag.add("dczhizhe"); + player.addSkill("dczhizhe_effect"); + }, + ai: { + order: 15, + result: { + player: 1, + }, + }, + subSkill: { + effect: { + mod: { + aiOrder: function (player, card, num) { + if (num > 0 && get.itemtype(card) === "card" && card.hasGaintag("dczhizhe")) return num + 0.16; + }, + aiValue: function (player, card, num) { + if (num > 0 && get.itemtype(card) === "card" && card.hasGaintag("dczhizhe")) return 2 * num; + }, + aiUseful: function (player, card, num) { + if (num > 0 && !player._dczhizhe_mod && get.itemtype(card) === "card" && card.hasGaintag("dczhizhe")) { + if (player.canIgnoreHandcard(card)) return Infinity; + player._dczhizhe_mod = true; + if ( + player.hp < 3 && + player.needsToDiscard(0, (i, player) => { + return !player.canIgnoreHandcard(i) && get.useful(i) > 6; + }) + ) + return num * 1.5; + return num * 10; + } + }, + }, + trigger: { player: ["useCardAfter", "respondAfter"] }, + charlotte: true, + forced: true, + filter: function (event, player) { + 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("dczhizhe")) { + if ( + event.cards.some(card => { + return get.position(card, true) == "o" && card.cardid == i; + }) + ) + return true; + } + } + return false; + }); + }, + content: function () { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.getParent() != trigger) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dczhizhe")) { + var cardsx = trigger.cards.filter(card => { + return get.position(card, true) == "o" && card.cardid == i; + }); + if (cardsx.length) cards.addArray(cardsx); + } + } + }); + if (cards.length) { + player.gain(cards, "gain2").gaintag.addArray(["dczhizhe", "dczhizhe_clear"]); + player.addTempSkill("dczhizhe_clear"); + } + }, + }, + clear: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("dczhizhe_clear"); + }, + mod: { + cardEnabled2: function (card, player) { + var cards = []; + if (card.cards) cards.addArray(cards); + if (get.itemtype(card) == "card") cards.push(card); + for (var cardx of cards) { + if (cardx.hasGaintag("dczhizhe_clear")) return false; + } + }, + cardRespondable: function (card, player) { + var cards = []; + if (card.cards) cards.addArray(cards); + if (get.itemtype(card) == "card") cards.push(card); + for (var cardx of cards) { + if (cardx.hasGaintag("dczhizhe_clear")) return false; + } + }, + cardSavable: function (card, player) { + var cards = []; + if (card.cards) cards.addArray(cards); + if (get.itemtype(card) == "card") cards.push(card); + for (var cardx of cards) { + if (cardx.hasGaintag("dczhizhe_clear")) return false; + } + }, + }, + }, + }, + }, + //段巧笑 + dccaizhuang: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "dccaizhuang"); + }, "he"); + }, + complexCard: true, + selectCard: [1, Infinity], + position: "he", + filterCard: true, + check: function (card) { + let cache = lib.skill.dccaizhuang.tempCache(); + if (!cache || cache.no) return 0; + let player = _status.event.player, + suit = get.suit(card); + if ( + ui.selected.cards.filter(i => { + return get.suit(i) === suit; + }).length < (cache[suit] || 0) + ) { + if (get.position(card) === "h") return 15 - get.value(card); + return 9 - get.value(card); + } + return 0; + }, + tempCache() { + let cache = _status.event.getTempCache("dccaizhuang", "dsuits"); + if (cache) return cache; + cache = { no: true }; + _status.event.putTempCache("dccaizhuang", "dsuits", cache); + let player = _status.event.player, + suits = {}; + lib.suit.forEach(i => { + suits[i] = 0; + }); + player.getCards("h", i => { + let suit = get.suit(i); + if (lib.suit.includes(suit)) suits[suit]++; + }); + let sortedSuits = Object.fromEntries(Object.entries(suits).sort((a, b) => b[1] - a[1])); + let dis = 0, + idx = 0, + dsuits = 0, + leave = 0; + for (let i in sortedSuits) { + idx++; + if (!sortedSuits[i]) continue; + let num = 1; + if (idx > 2 || sortedSuits[i] < 3) num = sortedSuits[i]; + cache[i] = num; + dis += num; + suits[i] -= num; + dsuits++; + } + for (let i in suits) { + if (suits[i]) leave++; + } + player.getCards("e", i => { + let suit = get.suit(i); + if (!cache[suit]) { + dsuits++; + cache[suit] = 1; + dis++; + } + }); + let draw = 0, + e = [0, 1, 4 / 3, 2, 4]; + if (dsuits <= leave) return false; + do { + draw += e[dsuits--]; + } while (dsuits > leave); + if (draw > dis) { + delete cache.no; + _status.event.putTempCache("dccaizhuang", "dsuits", cache); + return cache; + } + return false; + }, + content: function () { + "step 0"; + var suits = []; + cards.forEach(i => { + if (suits.length >= 4) return; + let suit = get.suit(i, player); + if (lib.suit.includes(suit)) suits.add(suit); + }); + event.num = suits.length; + "step 1"; + var suits = []; + player.countCards("h", card => { + if (suits.length >= 4) return; + var suit = get.suit(card); + if (lib.suit.includes(suit)) suits.add(suit); + }); + if (suits.length >= event.num) event.finish(); + "step 2"; + player.draw(); + event.goto(1); + }, + ai: { + order: 2, + result: { player: 1 }, + }, + }, + dchuayi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + "step 0"; + player.judge(() => 1).judge2 = result => result.bool; + "step 1"; + var color = result.color; + if (color == "red" || color == "black") player.addTempSkill("dchuayi_" + color, { player: "phaseBegin" }); + }, + subSkill: { + red: { + trigger: { global: "phaseEnd" }, + charlotte: true, + forced: true, + content: function () { + player.draw(); + }, + mark: true, + intro: { + name: "华衣·红", + content: "一名角色的回合结束时,你摸一张牌", + }, + }, + black: { + trigger: { player: "damageEnd" }, + charlotte: true, + forced: true, + content: function () { + player.draw(2); + }, + mark: true, + intro: { + name: "华衣·黑", + content: "当你受到伤害后,摸两张牌", + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.5; + else num = 0.3; + } + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; + } + }, + }, + }, + }, + }, + }, + //张瑾云 + dchuizhi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt("dchuizhi"), "你可以选择弃置任意张手牌并点击“确定”,将手牌摸至与全场手牌数最多的角色数相同。", [0, Infinity]) + .set("logSkill", "dchuizhi") + .set("ai", card => { + if (_status.event.isMax) { + if (ui.selected.cards.length) return -get.value(card); + return 0; + } + return 6 - get.value(card); + }) + .set("isMax", player.isMaxHandcard()); + "step 1"; + if (result.bool) { + var num = 0, + targets = game.filterPlayer(); + for (var current of targets) { + if (current.isMaxHandcard()) { + num = current.countCards("h"); + break; + } + } + num = Math.max(1, Math.min(5, num - player.countCards("h"))); + player.draw(num); + } + }, + }, + dcjijiao: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + init: function (player) { + player.addSkill("dcjijiao_machi"); + }, + onremove: function (player) { + player.removeSkill("dcjijiao_machi"); + }, + onChooseToUse: function (event) { + if (event.dcjijiao == undefined && !game.online) { + var bool = lib.skill.dcjijiao.getCards(event.player, true); + event.set("dcjijiao", bool); + } + }, + filter: function (event, player) { + return event.dcjijiao; + }, + filterTarget: true, + getCards: function (player, bool) { + var cards = Array.from(ui.discardPile.childNodes); + var gains = cards.slice(0); + var history = game.getAllGlobalHistory("cardMove", function (evt) { + if (evt.name == "lose") return evt.position == ui.discardPile; + return evt.name == "cardsDiscard"; + }); + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + var cards2 = evt.cards.filter(function (card) { + return cards.includes(card); + }); + if (cards2.length) { + if (!lib.skill.dcjijiao.isUse(evt, player)) { + gains.removeArray(cards2); + } + cards.removeArray(cards2); + } + if (!cards.length) break; + } + if (bool) return gains.some(card => get.type2(card, false) == "trick"); + return gains.filter(card => get.type2(card, false) == "trick"); + }, + isUse: function (event, player) { + if (event.name != "cardsDiscard") return event.type == "discard" && event.player == player; + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + return evt2.name == "useCard" && evt2.player == player; + }, + content: function () { + player.awakenSkill("dcjijiao"); + var cards = lib.skill.dcjijiao.getCards(player); + if (cards.length) { + target.gain(cards, "gain2").gaintag.add("dcjijiao"); + target.addSkill("dcjijiao_nowuxie"); + } + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (ui.cardPile.childNodes.length > game.players.length * 5 && !player.hasSkill("dcjijiao_risutoa") && !game.hasPlayer(current => current.hp <= 1) && game.countPlayer(current => current.hp === 2 && current.countCards("hes") < 3) <= 1) return 0; + return 5; + }, + }, + }, + subSkill: { + machi: { + charlotte: true, + forced: true, + popup: false, + trigger: { + global: ["washCard", "die"], + }, + filter: function (event, player) { + return player.hasSkill("dcjijiao", null, false, false); + }, + content: function () { + player.addSkill("dcjijiao_risutoa"); + }, + }, + risutoa: { + charlotte: true, + forced: true, + popup: false, + trigger: { global: "phaseAfter" }, + content: function () { + if (player.awakenedSkills.includes("dcjijiao")) { + player.restoreSkill("dcjijiao"); + game.log(player, "重置了", "#g【继椒】"); + //player.removeSkill('dcjijiao_machi'); + } + player.removeSkill("dcjijiao_risutoa"); + }, + }, + nowuxie: { + trigger: { player: "useCard1" }, + forced: true, + charlotte: true, + firstDo: true, + popup: false, + filter: function (event, player) { + if (get.type(event.card) != "trick") 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("dcjijiao")) return true; + } + return false; + }); + }, + content: function () { + trigger.nowuxie = true; + }, + onremove: function (player) { + player.removeGaintag("dcjijiao"); + }, + }, + }, + }, + //桓范 + dcjianzheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("h") && target != player; + }, + content: function () { + "step 0"; + var forced = target.hasCard(i => player.hasUseTarget(i), "h"); + player + .choosePlayerCard(target, "h", "visible", forced, "获得并使用其中一张牌") + .set("filterButton", button => { + return _status.event.player.hasUseTarget(button.link); + }) + .set("ai", button => { + return _status.event.player.getUseValue(button.link); + }); + "step 1"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + player.gain(card, "giveAuto"); + } else event.goto(3); + "step 2"; + if (get.position(card) == "h" && get.owner(card) == player && player.hasUseTarget(card)) { + if (get.name(card, player) == "sha") player.chooseUseTarget(card, true, false); + else player.chooseUseTarget(card, true); + } + "step 3"; + if ( + player.hasHistory("useCard", evt => { + return evt.getParent(2).name == "dcjianzheng" && evt.targets.includes(target); + }) + ) { + player.link(true); + target.link(true); + } else event.finish(); + "step 4"; + target.viewHandcards(player); + }, + ai: { + order: 10, + expose: 0.2, + result: { + target: function (player, target) { + return -Math.sqrt(target.countCards("h")); + }, + }, + }, + }, + //fumo! + dcfumou: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return player.getDamagedHp() > 0; + }, + content: function () { + "step 0"; + event.num = trigger.num; + "step 1"; + player.chooseTarget(get.prompt2("dcfumou"), [1, player.getDamagedHp()]).set("ai", target => { + var att = get.attitude(_status.event.player, target); + if (target.countCards("h") >= 3 || (target.countCards("e") && !target.isDamaged())) { + if (!target.canMoveCard()) return -att; + else if (!target.canMoveCard(true)) return -att / 5; + } + return att; + }); + "step 2"; + if (result.bool) { + var targets = result.targets; + targets.sortBySeat(player); + event.targets = targets; + player.logSkill("dcfumou", targets); + event.num--; + } else event.finish(); + "step 3"; + var target = targets.shift(); + event.target = target; + var choices = []; + var choiceList = ["移动场上的一张牌", "弃置所有手牌并摸两张牌", "弃置装备区里的所有牌并回复1点体力"]; + if (target.canMoveCard()) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if ( + target.countCards("h") && + !target.hasCard(card => { + return !lib.filter.cardDiscardable(card, target, "dcfumou"); + }, "h") + ) + choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if ( + target.countCards("e") && + !target.hasCard(card => { + return !lib.filter.cardDiscardable(card, target, "dcfumou"); + }, "h") + ) + choices.push("选项三"); + else choiceList[2] = '' + choiceList[2] + ""; + if (choices.length) { + target + .chooseControl(choices) + .set("prompt", "腹谋:请选择一项") + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (choices.length == 1) return choices[0]; + var func = (choice, target) => { + switch (choice) { + case "选项一": + if (target.canMoveCard(true)) return 5; + return 3; + case "选项二": + if (target.countCards("h") < 2 && get.value(target.getCards("h")[0]) < 6) return 4.5; + return 4.5 - target.countCards("h"); + case "选项三": + var e2 = target.getEquip(2); + if (target.hp + target.countCards("hs", ["tao", "jiu"]) < 2 && !e2) return 5.5; + if (get.recoverEffect(target, target, target) <= 0) return 3; + if (!e2) return 4.4; + return 5 - 1.5 * target.countCards("e"); + } + }; + var choicesx = choices.map(i => [i, func(i, target)]).sort((a, b) => b[1] - a[1]); + return choicesx[0][0]; + })() + ); + } else event.goto(5); + "step 4"; + game.log(target, "选择了", "#y" + result.control); + if (result.control == "选项一") { + target.moveCard(true); + } else if (result.control == "选项二") { + target.chooseToDiscard(true, "h", target.countCards("h")); + target.draw(2); + } else { + target.chooseToDiscard(true, "e", target.countCards("e")); + target.recover(); + } + "step 5"; + if (event.targets.length) event.goto(3); + // else if(event.num) event.goto(1); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; + } + if (target.hp == 2 && target.hasFriend()) return [1, num * 1.5]; + if (target.hp >= 2) return [1, num]; + } + }, + }, + }, + }, + //陈泰 + dcctjiuxian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: lib.filter.cardRecastable, + selectCard: function () { + return Math.ceil(_status.event.player.countCards("h") / 2); + }, + check: function (card) { + return 6.5 - get.value(card); + }, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.recast(cards); + "step 1"; + player.addTempSkill("dcctjiuxian_help"); + player.chooseUseTarget( + { + name: "juedou", + isCard: true, + storage: { dcctjiuxian: true }, + }, + true + ); + }, + ai: { + order: function () { + return 0.9 * get.order({ name: "juedou" }); + }, + tag: { + respond: 2, + respondSha: 2, + damage: 1, + }, + result: { + player: function (player) { + let target = null, + maxval = 0; + for (let i of game.players) { + let jdeff = get.effect( + i, + { + name: "juedou", + isCard: true, + cards: ui.selected.cards, + storage: { dcctjiuxian: true }, + }, + player, + player + ); + if ( + i === player || + !player.canUse( + { + name: "juedou", + isCard: true, + cards: ui.selected.cards, + storage: { dcctjiuxian: true }, + }, + i + ) || + jdeff < 0 + ) + continue; + let receff = 0; + game.filterPlayer(function (current) { + if (player != current && i.inRange(current) && current.isDamaged()) receff = Math.max(receff, get.recoverEffect(current, i, i)); + }); + if (jdeff + receff / 5 > maxval) { + target = i; + maxval = jdeff + receff / 5; + } + } + if (target) return maxval / 80; + return 0; + }, + }, + }, + subSkill: { + help: { + trigger: { global: "damageSource" }, + filter: function (event, player) { + return ( + event.card && + event.card.storage && + event.card.storage.dcctjiuxian && + event.player.isIn() && + event.getParent(2).targets.includes(event.player) && + game.hasPlayer(current => { + return current != player && event.player.inRange(current) && current.isDamaged(); + }) + ); + }, + direct: true, + forced: true, + charlotte: true, + content: function () { + "step 0"; + player + .chooseTarget("救陷:是否令其攻击范围内的一名其他角色回复1点体力?", (card, player, target) => { + if (_status.event.player == target) return false; + return target.isDamaged() && _status.event.targetx.inRange(target); + }) + .set("targetx", trigger.player) + .set("ai", target => get.recoverEffect(target, _status.event.player, _status.event.player)); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcctjiuxian_help", target); + target.recover(player); + } + }, + }, + }, + }, + dcchenyong: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + return player.getHistory("useCard").length; + }, + content: function () { + var types = []; + var history = player.getHistory("useCard"); + for (var evt of history) { + types.add(get.type2(evt.card)); + } + var num = types.length; + player.draw(num); + }, + ai: { threaten: 2.2 }, + }, + //孙瑜 + dcquanshou: { + audio: 2, + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + return event.player.countCards("h") <= event.player.maxHp; + }, + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) > 0) return true; + const draw = event.player.maxHp - event.player.countCards("h"); + return draw <= 2 && event.player.getHp(true) - draw >= 1; + }, + content: function () { + "step 0"; + var draw = Math.min(5, trigger.player.maxHp - trigger.player.countCards("h")); + trigger.player + .chooseControl() + .set("choiceList", [(draw > 0 ? "摸" + get.cnNumber(draw) + "张牌,然后" : "令") + "你本回合使用【杀】的次数上限-1", "当你本回合使用牌被抵消后," + get.translation(player) + "摸一张牌"]) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var draw = Math.min(5, Math.max(0, trigger.player.maxHp - trigger.player.countCards("h"))); + if (get.attitude(trigger.player, player) > 0) { + if (draw >= 3 || trigger.player.getCardUsable("sha") > 1) return "选项一"; + if ( + !draw || + (draw <= 1 && + trigger.player.countCards("hs", card => { + return get.name(card) == "sha" && trigger.player.hasValueTarget(card); + })) + ) + return "选项二"; + return "选项一"; + } else { + if (draw >= 4) return "选项一"; + if ( + draw < 2 && + trigger.player.countCards("hs", card => { + return trigger.player.hasValueTarget(card); + }) + ) + return "选项二"; + return "选项一"; + } + })() + ) + .set("prompt", "劝守:请选择一项"); + "step 1"; + game.log(trigger.player, "选择了", "#y" + result.control); + if (result.control == "选项一") { + var draw = Math.min(5, trigger.player.maxHp - trigger.player.countCards("h")); + if (draw > 0) trigger.player.draw(draw); + trigger.player.addTempSkill("dcquanshou_sha"); + trigger.player.addMark("dcquanshou_sha", 1, false); + } else { + trigger.player.addTempSkill("dcquanshou_respond"); + trigger.player.markAuto("dcquanshou_respond", [player]); + } + }, + ai: { + expose: 0.1, + }, + subSkill: { + sha: { + charlotte: true, + onremove: true, + marktext: "守", + intro: { content: "使用【杀】的次数上限-#" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num - player.countMark("dcquanshou_sha"); + }, + }, + }, + respond: { + trigger: { player: ["shaMiss", "eventNeutralized"] }, + filter: function (event, player) { + if (event.type != "card" && event.name != "_wuxie") return false; + return player.getStorage("dcquanshou_respond").some(i => i.isIn()); + }, + forced: true, + popup: false, + charlotte: true, + onremove: true, + marktext: '', + intro: { content: "本回合使用的牌被抵消后,$摸一张牌" }, + content: function () { + var targets = player.getStorage("dcquanshou_respond"); + targets.sortBySeat(); + for (var target of targets) { + if (target.isIn()) { + target.logSkill("dcquanshou_respond", player); + target.draw(); + } + } + }, + }, + }, + }, + dcshexue: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + var cards = lib.skill.dcshexue.getLast(); + return cards.some(card => player.hasUseTarget(card, false)); + }, + getLast: function () { + var cards = []; + for (var current of game.filterPlayer()) { + var history = current.actionHistory; + if (history.length < 2) continue; + if (history[history.length - 2].isMe) { + var evts = history[history.length - 2].useCard; + for (var i = evts.length - 1; i >= 0; i--) { + var evt = evts[i]; + if (get.type(evt.card) != "basic" && get.type(evt.card) != "trick") continue; + var evtx = evt.getParent("phaseUse"); + if (evtx && evtx.player == current) cards.push({ name: evt.card.name, nature: evt.card.nature }); + } + } + } + return cards; + }, + direct: true, + group: "dcshexue_end", + content: function () { + "step 0"; + var cards = lib.skill.dcshexue.getLast(); + cards = cards.filter(card => player.hasUseTarget(card, false)); + player.chooseButton(["设学:是否将一张牌当作其中一张牌使用?", [cards, "vcard"]]); + "step 1"; + if (!result.bool) return; + var card = result.links[0]; + game.broadcastAll(function (card) { + lib.skill.dcshexue_backup.viewAs = card; + }, card); + var next = player.chooseToUse(); + next.set("openskilldialog", `###${get.prompt("dcshexue")}###将一张牌当做${get.translation(card.nature) || ""}【${get.translation(card.name)}】使用`); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "dcshexue_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("dcshexue_backup"); + }, + subSkill: { + backup: { + audio: "dcshexue", + filterCard: function (card) { + return get.itemtype(card) == "card"; + }, + filterTarget: lib.filter.targetEnabled, + position: "hes", + selectCard: 1, + check: card => 6 - get.value(card), + popname: true, + }, + end: { + audio: "dcshexue", + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return player.getHistory("useCard", evt => { + return evt.getParent("phaseUse") == event && (get.type(evt.card) == "basic" || get.type(evt.card) == "trick"); + }).length; + }, + prompt2: function (event, player) { + return "令下一回合的角色于其出牌阶段开始时选择是否将一张牌当做你本阶段使用过的一张基本牌或普通锦囊牌使用?"; + }, + check: function (event, player) { + let evt = event.getParent("phase").getParent(); + let nextPlayer = player.getNext(); + if (evt && evt.next && evt.next.length) { + nextPlayer = evt.next[0].player; + } + return get.attitude(player, nextPlayer) > 0; + }, + content: function () { + var history = player.getHistory("useCard", evt => { + return evt.getParent("phaseUse") == trigger && (get.type(evt.card) == "basic" || get.type(evt.card) == "trick"); + }); + player.addSkill("dcshexue_studyclear"); + if (!player.storage.dcshexue_studyclear) player.storage.dcshexue_studyclear = []; + history.forEach(evt => { + var card = evt.card; + card = { name: card.name, nature: card.nature }; + player.storage.dcshexue_studyclear.push(card); + }); + }, + }, + study: { + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.getStorage("dcshexue_study").some(i => event.player.hasUseTarget(i, false)); + }, + onremove: true, + charlotte: true, + direct: true, + content: function () { + "step 0"; + event.cards = player.getStorage("dcshexue_study"); + "step 1"; + var card = cards.pop(); + if (trigger.player.hasUseTarget(card, false)) { + game.broadcastAll(function (card) { + lib.skill.dcshexue_backup.viewAs = card; + lib.skill.dcshexue_backup.prompt = "设学:是否将一张牌当做" + get.translation(card) + "使用?"; + }, card); + var next = trigger.player.chooseToUse(); + next.set("openskilldialog", `###${get.prompt("dcshexue_study")}###将一张牌当做${get.translation(card.nature) || ""}【${get.translation(card.name)}】使用`); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "dcshexue_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("dcshexue_backup"); + } + if (cards.length) event.redo(); + }, + }, + studyclear: { + trigger: { global: "phaseBegin" }, + charlotte: true, + forceDie: true, + silent: true, + onremove: true, + lastDo: true, + content: function () { + trigger.player.addTempSkill("dcshexue_study"); + if (!trigger.player.storage.dcshexue_study) trigger.player.storage.dcshexue_study = []; + trigger.player.storage.dcshexue_study = trigger.player.storage.dcshexue_study.concat(player.getStorage("dcshexue_studyclear")); + player.removeSkill("dcshexue_studyclear"); + }, + }, + }, + }, + //郤正 + dcdanyi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget) return false; + if (!event.targets || !event.targets.length) return false; + var evt = lib.skill.dcjianying.getLastUsed(player, event.getParent()); + if (!evt || !evt.targets || !evt.targets.length) return false; + return event.targets.some(target => evt.targets.includes(target)); + }, + frequent: true, + locked: false, + content: function () { + var evt = lib.skill.dcjianying.getLastUsed(player, trigger.getParent()); + player.draw(trigger.targets.filter(target => evt.targets.includes(target)).length); + }, + mod: { + aiOrder: function (player, card, num) { + var evt = player.getLastUsed(); + if ( + evt && + evt.targets && + evt.targets.length && + game.hasPlayer(current => { + return evt.targets.includes(current) && player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) + return num + 10; + }, + }, + ai: { + effect: { + player: function (card, player, target) { + var evt = player.getLastUsed(); + if (evt && evt.targets.includes(target)) return [1.5, 0]; + }, + }, + }, + }, + dcwencan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + if (ui.selected.targets.length) { + if (ui.selected.targets[0].hp == target.hp) return false; + } + return target != player; + }, + selectTarget: [1, 2], + complexTarget: true, + multiline: true, + content: function () { + "step 0"; + target + .chooseToDiscard(get.translation(player) + "对你发动了【文灿】", "是否弃置两张花色不同的牌?或者点击“取消”,令其本回合对你使用牌无距离和次数限制", "he", 2, (card, player) => { + if (!ui.selected.cards.length) return true; + var suit = get.suit(card, player); + for (var i of ui.selected.cards) { + if (get.suit(i, player) == suit) return false; + } + return true; + }) + .set("complexCard", true) + .set("ai", card => { + if (_status.event.nofear) return 0; + return 5 - get.value(card); + }) + .set( + "nofear", + player.countCards("hs", card => { + return get.tag(card, "damage") && player.canUse(card, target, false) && get.effect(target, card, player, target) <= 0; + }) < target.hp + ); + "step 1"; + if (!result.bool) { + player.addTempSkill("dcwencan_paoxiao"); + player.markAuto("dcwencan_paoxiao", [target]); + } + }, + subSkill: { + paoxiao: { + charlotte: true, + onremove: true, + marktext: "灿", + intro: { content: "对$使用牌无距离和次数限制" }, + mod: { + cardUsableTarget: function (card, player, target) { + if (player.getStorage("dcwencan_paoxiao").includes(target)) return true; + }, + targetInRange: function (card, player, target) { + if (player.getStorage("dcwencan_paoxiao").includes(target)) return true; + }, + }, + }, + }, + ai: { + order: 9, + result: { target: -1 }, + }, + }, + //芮姬 + dcwangyuan: { + audio: 2, + trigger: { + player: ["loseAfter", "logSkill"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + frequent: true, + filter: function (event, player, name) { + if (player == _status.currentPhase) return name == "logSkill" && event.skill == "dcliying" && player.getExpansions("dcwangyuan").length < game.countPlayer2(); + if (name == "logSkill") return false; + if (player.getExpansions("dcwangyuan").length >= game.countPlayer()) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("dcwangyuan"); + var card = get.cardPile2(cardx => { + var type = get.type2(cardx); + return (type == "basic" || type == "trick") && !cards.some(cardxx => get.name(cardx, false) == get.name(cardxx, false)); + }); + if (card) player.addToExpansion(card, "gain2").gaintag.add("dcwangyuan"); + }, + ai: { + combo: "dclingyin", + }, + marktext: "妄", + intro: { + name: "妄(妄缘/铃音)", + content: "expansion", + markcount: "expansion", + }, + }, + dclingyin: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.getExpansions("dcwangyuan").length; + }, + direct: true, + content: function () { + "step 0"; + var cards = player.getExpansions("dcwangyuan"); + player + .chooseButton([get.prompt("dclingyin") + "(当前轮数:" + get.cnNumber(game.roundNumber, true) + ")", cards], [1, game.roundNumber]) + .set("ai", button => { + var color = _status.event.color, + player = _status.event.player; + if (ui.selected.buttons.length > 0 && ui.selected.buttons.length == player.getExpansions("dcwangyuan").length - 1) return 0; + if (color == 1) return get.value(button.link); + if (color) return get.color(button.link) == color ? 1 : 0; + return 0; + }) + .set( + "color", + (function () { + var cardsR = cards.filter(i => get.color(i) == "red"); + if (cardsR.length == cards.length || cardsR.length == 0 || cards.length <= game.roundNumber) return 1; + if (cardsR.length <= game.roundNumber) return "red"; + if (cards.length - cardsR.length <= game.roundNumber) return "black"; + return 1; + })() + ); + "step 1"; + if (result.bool) { + player.logSkill("dclingyin"); + var cards = result.links; + player.gain(cards, "gain2"); + var cardsx = player.getExpansions("dcwangyuan").removeArray(cards); + if (cardsx.length <= 1 || get.color(cardsx) != "none") { + player.addTempSkill("dclingyin_effect"); + player.addMark("dclingyin_effect", 1, false); + game.log(player, "获得了", "#g【铃音】", "的后续效果"); + } + } + }, + ai: { + combo: "dcwangyuan", + threaten: 3, + }, + subSkill: { + effect: { + audio: "dclingyin", + enable: "phaseUse", + trigger: { source: "damageBegin1" }, + viewAs: { name: "juedou" }, + charlotte: true, + forced: true, + onremove: true, + prompt: "将一张武器牌或防具牌当【决斗】使用", + filterCard: function (card) { + return get.subtype(card) == "equip1" || get.subtype(card) == "equip2"; + }, + position: "hes", + filter: function (event, player) { + if (event.name == "chooseToUse") return player.countCards("hes", { subtype: ["equip1", "equip2"] }) > 0; + return event.player != player; + }, + content: function () { + trigger.num += player.countMark("dclingyin_effect"); + }, + ai: { + damageBonus: true, + }, + }, + }, + }, + dcliying: { + audio: 2, + usable: 1, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + var cards = event.getg(player).filter(i => get.owner(i) == player && get.position(i) == "h"); + if (!cards.length) return false; + var evt = event.getParent("phaseDraw"); + if (evt && evt.name == "phaseDraw") return false; + return true; + }, + direct: true, + content: function () { + "step 0"; + var cards = trigger.getg(player).filter(i => get.owner(i) == player && get.position(i) == "h"); + player + .chooseCardTarget({ + prompt: get.prompt("dcliying"), + prompt2: "选择本次获得的任意张牌交给一名其他角色,然后摸一张牌", + filterTarget: lib.filter.notMe, + filterCard: card => _status.event.cards.includes(card), + cards: cards, + selectCard: [1, cards.length], + ai1: function (card) { + if (ui.selected.cards.length) return 0; + return 3 / (Math.abs(get.value(card)) + 0.1); + }, + ai2: function (target) { + return get.value(ui.selected.cards, target) * get.attitude(_status.event.player, target); + }, + }) + .set("cards", cards); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcliying", target); + player.give(result.cards, target); + player.draw(); + //if(player!=_status.currentPhase) event.finish(); + } else { + player.storage.counttrigger.dcliying--; + event.finish(); + } /* + 'step 2' + var cards=player.getExpansions('dcwangyuan'); + var card=get.cardPile2(cardx=>{ + var type=get.type2(cardx); + return (type=='basic'||type=='trick')&&!cards.some(cardxx=>get.name(cardx,false)==get.name(cardxx,false)); + }); + if(card) player.addToExpansion(card,'gain2').gaintag.add('dcwangyuan');*/ + }, + }, + //谢灵毓 + dcyuandi: { + audio: 2, + init: () => { + game.addGlobalSkill("dcyuandi_ai"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("dcyuandi"), true)) game.removeGlobalSkill("dcyuandi_ai"); + }, + trigger: { global: "useCard" }, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + if (event.player == player || !event.targets || event.targets.length > 1 || event.targets[0] != event.player) return false; + return ( + event.player + .getHistory("useCard", evtx => { + return evtx.getParent("phaseUse") == evt; + }) + .indexOf(event) == 0 + ); + }, + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + var name = get.translation(target); + var choices = ["选项二"]; + var choiceList = ["弃置" + name + "一张手牌", "你与" + name + "各摸一张牌"]; + if (target.countDiscardableCards(player, "h")) choices.unshift("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set("prompt", get.prompt("dcyuandi", trigger.player)) + .set( + "choice", + (function () { + if (get.attitude(player, target) < 0) { + if (choices.includes("选项一")) return "选项一"; + return "cancel2"; + } + return "选项二"; + })() + ); + "step 1"; + if (result.control != "cancel2") { + var target = trigger.player; + player.logSkill("dcyuandi", target); + if (result.control == "选项一") { + player.discardPlayerCard(target, "h", true); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15); + } else game.asyncDraw([target, player]); + } + }, + subSkill: { + ai: { + mod: { + aiOrder: function (player, card, num) { + var info = get.info(card); + if (!info || !info.toself) return; + var evt = _status.event.getParent("phaseUse"); + if (!evt || evt.player != player) return; + if (player.hasHistory("useCard", evtx => evtx.getParent("phaseUse") == evt)) return; + if ( + game.hasPlayer(current => { + return current.hasSkill("dcyuandi") && get.attitude(player, current) >= 0; + }) + ) + return num + 10; + return num / 3; + }, + }, + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("dcyuandi"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("dcyuandi_ai"); + }, + }, + }, + }, + dcxinyou: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") < player.maxHp || player.isDamaged(); + }, + content: function () { + "step 0"; + player.recover(player.getDamagedHp(true)); + player.drawTo(player.maxHp); + "step 1"; + var check = 0; + if ( + player.hasHistory("gain", evt => { + return evt.getParent(2) == event && evt.cards.length >= 3; + }) + ) + check |= 1; + if ( + game.getGlobalHistory("changeHp", evt => { + return evt.getParent().name == "recover" && evt.getParent(2) == event; + }).length + ) + check |= 2; + if (check > 0) { + player.addTempSkill("dcxinyou_effect"); + player.storage.dcxinyou_effect = check; + } + }, + ai: { + order: 1, + result: { player: 1 }, + }, + subSkill: { + effect: { + audio: "dcxinyou", + trigger: { player: "phaseJieshuBegin" }, + charlotte: true, + forced: true, + onremove: true, + filter: function (event, player) { + return player.storage.dcxinyou_effect; + }, + content: function () { + if ((player.storage.dcxinyou_effect & 1) > 0) player.loseHp(); + if ((player.storage.dcxinyou_effect & 2) > 0) player.chooseToDiscard("心幽:请弃置一张牌", 1, true, "he"); + }, + }, + }, + }, + //笮融 + dccansi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + "step 0"; + player.recover(); + if (!game.hasPlayer(current => current != player)) event.finish(); + else + player.chooseTarget("残肆:选择一名其他角色", true, lib.filter.notMe).set("ai", target => { + var player = _status.event.player; + var list = ["recover", "sha", "juedou", "huogong"]; + return list.reduce((p, c) => { + return p + get.effect(target, { name: c }, player, player); + }, 0); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "fire"); + target.recover(); + event.list = ["sha", "juedou", "huogong"]; + player.addTempSkill("dccansi_draw"); + player.storage.dccansi_draw = target; + } else event.finish(); + "step 2"; + var card = { name: event.list.shift(), isCard: true }; + if (target.isIn() && player.canUse(card, target, false)) player.useCard(card, target, false); + if (event.list.length) event.redo(); + "step 3"; + player.removeSkill("dccansi_draw"); + }, + subSkill: { + draw: { + trigger: { global: "damageEnd" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return event.getParent(3).name == "dccansi" && player.storage.dccansi_draw == event.player; + }, + content: function () { + for (var i = 0; i < trigger.num; i++) { + player.draw(2); + } + }, + }, + }, + ai: { + threaten: 5, + expose: 0.3, + }, + }, + dcfozong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h") > 7; + }, + forced: true, + direct: true, + intro: { + markcount: "expansion", + content: "expansion", + }, + content: function () { + "step 0"; + var num = player.countCards("h") - 7; + player.chooseCard("佛宗:将" + get.cnNumber(num) + "张手牌置于武将上", true, num); + "step 1"; + if (result.bool) { + var cards = result.cards; + player.logSkill("dcfozong"); + player.addToExpansion(cards, player, "give").gaintag.add("dcfozong"); + } + "step 2"; + var cards = player.getExpansions("dcfozong"); + if (cards.length < 7) event.finish(); + else { + event.targets = game.filterPlayer(i => i != player).sortBySeat(player); + game.delayx(); + } + "step 3"; + var target = targets.shift(); + event.target = target; + player.line(target); + var cards = player.getExpansions("dcfozong"); + if (!cards.length) event._result = { bool: false }; + else + target + .chooseButton(['###佛宗###
    获得一张牌并令' + get.translation(player) + "回复1点体力,或点击“取消”令其失去1点体力
    ", cards]) + .set("ai", button => { + if (_status.event.refuse) return get.value(button.link) - 7.5; + return get.value(button.link); + }) + .set("refuse", get.attitude(target, player) < 1 && get.effect(player, { name: "losehp" }, player, target) > 0); + "step 4"; + if (result.bool) { + var card = result.links[0]; + target.gain(card, "give", player); + player.recover(target); + } else player.loseHp(); + "step 5"; + if (targets.length) event.goto(3); + }, + ai: { halfneg: true }, + }, + //滕芳兰 + dcluochong: { + audio: 2, + trigger: { global: "roundStart" }, + filter: function (event, player) { + return game.hasPlayer(current => current.countDiscardableCards(player, "hej") > 0); + }, + direct: true, + async content(event, trigger, player) { + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + const lose_list = []; + let num = 4 - player.countMark("dcluochong"); + while (num > 0) { + const result = await player + .chooseTarget(get.prompt("dcluochong"), `弃置任意名角色区域内的累计至多${num}张牌`, (card, player, target) => { + return target.hasCard(card => { + const discarded = _status.event.lose_list.find(item => item[0] == target); + if (discarded && discarded[1].includes(card)) return false; + return lib.filter.canBeDiscarded(card, player, target, "dcluochong"); + }, "hej"); + }) + .set("ai", target => { + const player = _status.event.player, + discarded = _status.event.lose_list.find(item => item[0] == target); + if (discarded) { + if (target == player) return 0; + const num = discarded[1].length; + if (num > 1 && player.hp + player.hujia > 2) return 0; + } + if (target == player) { + if (ui.cardPile.childNodes.length > 80 && player.hasCard(card => get.value(card) < 8)) return 20; + return 0; + } + return get.effect(target, { name: "guohe_copy2" }, player, player); + }) + .set("lose_list", lose_list) + .forResult(); + if (result.bool) { + const target = result.targets[0]; + const cards = await player + .choosePlayerCard(target, true, "hej", [1, num], `选择弃置${get.translation(target)}区域内的牌`) + .set("filterButton", button => { + const card = button.link, + target = _status.event.target, + player = get.player(); + const discarded = _status.event.lose_list.find(item => item[0] == target); + if (discarded && discarded[1].includes(card)) return false; + return lib.filter.canBeDiscarded(card, player, target, "dcluochong"); + }) + .set("lose_list", lose_list) + .set("ai", button => { + if (ui.selected.buttons.length > 0) return false; + var val = get.buttonValue(button); + if (get.attitude(_status.event.player, _status.event.target) > 0) return -val; + return val; + }) + .forResultCards(); + num -= cards.length; + const index = lose_list.find(item => item[0] == target); + if (!index) { + lose_list.push([target, cards]); + } else { + index[1].addArray(cards); + } + } else { + break; + } + } + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (lose_list.length > 0) { + lib.tempSortSeat = trigger.player; + lose_list.sort((a, b) => { + return lib.sort.seat(a[0], b[0]); + }); + delete lib.tempSortSeat; + player.logSkill( + "dcluochong", + lose_list.map(i => i[0]) + ); + if (lose_list.some(i => i[1].length > 2)) { + game.log(player, "可弃置牌数", "#g-1"); + player.addMark("dcluochong", 1, false); + } + if (lose_list[0].length == 1) { + lose_list[0][0].discard(lose_list[0][1]); + } else { + game.loseAsync({ + lose_list: lose_list, + discarder: player, + }).setContent("discardMultiple"); + } + } + }, + ai: { + threaten: 2.5, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "delay" && current < 0) { + var current = _status.currentPhase; + if (current.getSeatNum() > target.getSeatNum()) return "zerotarget"; + } + }, + }, + }, + }, + dcaichen: { + audio: 2, + init: function (player) { + game.addGlobalSkill("dcaichen_hit"); + }, + onremove: function (player) { + if (!game.hasPlayer(current => current.hasSkill("dcaichen"), true)) game.removeGlobalSkill("dcaichen_hit"); + }, + trigger: { + player: ["loseAfter", "phaseDiscardBefore"], + global: "loseAsyncAfter", + target: "useCardToTargeted", + }, + filter: function (event, player, name) { + if (event.name == "phaseDiscard") return ui.cardPile.childNodes.length > 40; + if (name == "useCardToTargeted") return ui.cardPile.childNodes.length < 40 && get.suit(event.card) == "spade"; + if (event.getParent().name != "dcluochong") return false; + if (event.name == "loseAsync" && !event.getl(player).cards.length) return false; + return ui.cardPile.childNodes.length > 80; + }, + forced: true, + content: function () { + if (trigger.name.indexOf("lose") == 0) player.draw(2); + else if (trigger.name == "phaseDiscard") { + trigger.cancel(); + game.log(player, "跳过了弃牌阶段"); + } else { + trigger.directHit.add(player); + game.log(player, "不可响应", trigger.card); + } + }, + subSkill: { + hit: { + trigger: { player: "dieAfter" }, + filter: function (event, player) { + return !game.hasPlayer(current => current.hasSkill("dcaichen"), true); + }, + silent: true, + forceDie: true, + content: function () { + game.removeGlobalSkill("dcaichen_hit"); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg && arg.card && arg.target && arg.target.hasSkill("dcaichen") && ui.cardPile.childNodes.length < 40 && get.suit(arg.card) === "spade"; + }, + }, + }, + }, + }, + //杨彪 + dczhaohan: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num += 2; + trigger.dczhaohan = true; + player.addTempSkill("dczhaohan_choose", "phaseDrawAfter"); + }, + subSkill: { + choose: { + trigger: { player: "gainAfter" }, + filter: function (event, player) { + return event.getParent(2).dczhaohan && player.countCards("h") >= 2; + }, + forced: true, + charlotte: true, + popup: false, + content: function () { + "step 0"; + var choices = [], + choiceList = ["将两张手牌交给一名没有手牌的角色", "弃置两张手牌"]; + if (game.hasPlayer(current => current.countCards("h") == 0)) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + choices.push("选项二"); + if (choices.length == 1) event._result = { control: "选项二" }; + else + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + if ( + game.hasPlayer(current => { + return current.countCards("h") == 0 && get.attitude(player, current) > 0; + }) + ) + return "选项一"; + return "选项二"; + })() + ); + "step 1"; + if (result.control == "选项一") { + player.chooseCardTarget({ + filterCard: true, + selectCard: 2, + forced: true, + filterTarget: function (card, player, target) { + return !target.countCards("h"); + }, + ai1: function (card) { + return 7 - get.value(card); + }, + ai2: function (target) { + return get.attitude(_status.event.player, target); + }, + prompt: "将两张手牌交给一名没有手牌的角色", + }); + } else { + player.chooseToDiscard("昭汉:请弃置两张手牌", true, 2); + event.finish(); + } + "step 2"; + if (result.bool) { + player.give(result.cards, result.targets[0]); + } + }, + }, + }, + }, + oldjinjie: { + audio: "dcjinjie", + trigger: { global: "dying" }, + hasPhase: function (player) { + var history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + if (history[i].isMe && !history[i].isSkipped) return true; + if (history[i].isRound) break; + } + return false; + }, + direct: true, + content: function () { + "step 0"; + player.chooseBool(get.prompt("oldjinjie", trigger.player), "令其摸一张牌").set("ai", () => { + return get.attitude(_status.event.player, _status.event.getTrigger().player) > 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("oldjinjie", trigger.player); + trigger.player.draw(); + } else event.finish(); + if (lib.skill.oldjinjie.hasPhase(player)) event.finish(); + "step 2"; + var num = 0; + var history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + for (var evt of history[i].useSkill) { + if (evt.skill == "oldjinjie") num++; + } + if (history[i].isRound) break; + } + if (num == 0) { + player.chooseBool(get.prompt("oldjinjie", trigger.player), "令其回复1点体力").set("ai", () => { + var player = _status.event.player; + return get.effect(_status.event.getTrigger().player, { name: "tao" }, player, player) > 0; + }); + } else { + player + .chooseToDiscard(get.prompt("oldjinjie", trigger.player), "弃置" + get.cnNumber(num) + "张牌,令其回复1点体力", "he", num) + .set("ai", card => { + if (_status.event.eff > 0) return get.value({ name: "tao" }) - get.value(card); + return 0; + }) + .set("eff", get.effect(trigger.player, { name: "tao" }, player, player)); + } + "step 3"; + if (result.bool) { + player.line(trigger.player, "green"); + trigger.player.recover(); + } + }, + }, + dcjinjie: { + audio: 2, + trigger: { global: "dying" }, + async cost(event, trigger, player) { + const target = trigger.player; + const result = await player + .chooseControl( + [0, 1, 2, 3].map(i => get.cnNumber(i, true)), + "cancel2" + ) + .set("prompt", get.prompt("dcjinjie", target)) + .set("prompt2", `令${get.translation(target)}摸至多三张牌,然后你可以弃置等量的牌令其回复1点体力。`) + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + (() => { + if (get.attitude(player, target) <= 0) return "cancel2"; + if (target === player) return 3; + const unusefulCount = player.countCards("he", card => { + return lib.filter.cardDiscardable(card, player, "dcjinjie") && get.value(card) < 5 && !player.canSaveCard(card, target); + }); + if ( + [player, target] + .unique() + .map(current => { + return current.countCards("hs", card => { + return player.canSaveCard(card, target); + }); + }) + .reduce((p, c) => p + c) > unusefulCount + ) { + return 3; + } + return Math.min(3, unusefulCount); + })() + ) + .forResult(); + if (result.control !== "cancel2") { + event.result = { + bool: true, + cost_data: { + index: result.index, + }, + }; + } + }, + round: 1, + logTarget: "player", + async content(event, trigger, player) { + const num = event.cost_data.index, + target = trigger.player; + if (num > 0) await target.draw(num); + let next; + if (num > 0) { + next = player + .chooseToDiscard(`尽节:是否弃置${get.cnNumber(num)}张牌,令${get.translation(target)}回复1点体力?`, num, "he") + .set("ai", card => { + if (get.event("goon")) { + return 100 / Math.max(0.01, get.value(card) + 20); + } + return 0; + }) + .set( + "goon", + (() => { + if (get.attitude(player, target) <= 0) return false; + const count = player.countCards("hs", card => { + return player.canSaveCard(card, target); + }); + return ( + !count || + (count > 0 && + player.countCards("he", card => { + return get.value(card) < 5; + }) >= num) + ); + })() + ); + } else { + next = player.chooseBool(`尽节:是否令${get.translation(target)}回复1点体力?`).set("choice", get.attitude(player, target) > 0); + } + const bool = await next.forResultBool(); + if (bool) { + player.line(target, "green"); + await target.recover(); + } + }, + subSkill: { + round: {}, + }, + }, + oldjue: { + audio: "dcjue", + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(current => (current.getHp() > player.getHp() || current.countCards("h") > player.countCards("h")) && player.canUse("sha", current, false)); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("oldjue"), "视为对一名体力值或手牌数大于你的角色使用一张【杀】", (card, player, target) => { + return player.canUse("sha", target, false) && (target.getHp() > player.getHp() || target.countCards("h") > player.countCards("h")); + }) + .set("ai", target => { + return get.effect(target, { name: "sha" }, _status.event.player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("oldjue", target); + player.useCard({ name: "sha", isCard: true }, target, false); + } + }, + }, + dcjue: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + if (!lib.skill.dcjue.getCards().length) return false; + return ( + (event.player !== player && event.player.isIn()) || + (event.player === player && + game.hasPlayer(current => { + return current.isIn(); + })) + ); + }, + round: 1, + async cost(event, trigger, player) { + let maxLimit = lib.skill.dcjue.getCards().length; + if (trigger.player === player) { + event.result = await player + .chooseTarget(get.prompt("dcjue"), `选择一名其他角色,视为对其依次随机使用X次【杀】/【过河拆桥】/【五谷丰登】(X为${maxLimit}与其体力上限中的较小值)。`) + .set("filterTarget", lib.filter.notMe) + .set("ai", target => { + return -get.attitude(get.player(), target); + }) + .forResult(); + } else { + const target = trigger.player; + maxLimit = Math.min(maxLimit, target.maxHp); + event.result = await player + .chooseBool(get.prompt("dcjue", target), `视为对${get.translation(target)}依次随机使用${get.cnNumber(maxLimit)}次【杀】/【过河拆桥】/【五谷丰登】。`) + .set("choice", get.attitude(player, target) < 0) + .forResult(); + } + }, + logTarget: "player", + getCards() { + const cards = []; + game.countPlayer2(current => { + current.getHistory("lose", evt => { + if (evt.type == "discard") cards.addArray(evt.cards2.filterInD("d")); + }); + }); + return cards; + }, + async content(event, trigger, player) { + const target = event.targets ? event.targets[0] : trigger.player; + const nameList = ["sha", "guohe", "wugu"]; + let maxLimit = Math.min(lib.skill.dcjue.getCards().length, target.maxHp); + while (maxLimit--) { + if (!target.isIn()) return; + const list = nameList.slice().randomSort(); + for (const name of list) { + const card = new lib.element.VCard({ name }); + if (player.canUse(card, target)) { + await player.useCard(card, target); + await game.asyncDelayx(); + break; + } + } + } + }, + }, + //杨弘 + dcjianji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.getAttackRange() >= 1; + }, + selectTarget: function () { + return [1, _status.event.player.getAttackRange()]; + }, + complexSelect: true, + complexTarget: true, + filterTarget: function (card, player, target) { + var selected = ui.selected.targets; + if (!selected.length) return true; + for (var i of selected) { + if (i.getNext() == target || i.getPrevious() == target) return true; + } + return false; + }, + contentBefore: function () { + event.getParent()._dcjianji_discarded = []; + }, + content: function () { + "step 0"; + if (target.countCards("he") > 0) target.chooseToDiscard(true, "he"); + else event.finish(); + "step 1"; + if (result.bool) { + event.getParent()._dcjianji_discarded.push(target); + } + }, + contentAfter: function () { + "step 0"; + var list = targets.filter(target => { + var num = target.countCards("h"); + return targets.every(targetx => { + return targetx.countCards("h") <= num; + }); + }); + if (list.length) { + event.list = list; + event.current = event.list.shift(); + event.getParent()._dcjianji_discarded.remove(player); + event.targets = event.getParent()._dcjianji_discarded; + } else event.finish(); + "step 1"; + var targets = event.targets.slice(); + targets.remove(event.current); + if (!targets.length) event._result = { bool: false }; + else + event.current + .chooseTarget("间计:是否视为对除" + get.translation(player) + "外的弃置过牌的一名角色使用一张杀?", (card, player, target) => { + return _status.event.targets.includes(target) && player.canUse("sha", target, false); + }) + .set("targets", event.targets) + .set("ai", target => { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); + "step 2"; + if (result.bool) { + event.current.useCard({ name: "sha", isCard: true }, result.targets, false); + } + "step 3"; + if (event.list.length) { + event.current = event.list.shift(); + event.goto(1); + } + }, + ai: { + order: 7, + result: { + target: function (player, target) { + var eff = get.effect(target, { name: "guohe_copy2" }, player, target) / 2; + if (ui.selected.targets.length && eff < 0) { + var len = target.countCards("h"); + if ( + ui.selected.targets.every(i => { + return i.countCards("h") < len + 1; + }) && + ui.selected.targets.some(i => { + return get.effect(i, { name: "sha" }, target, player) > 0; + }) + ) + return 0.1; + } + return ui.selected.targets.reduce((p, c) => p + get.effect(c, { name: "guohe_copy2" }, player, c) / 2, 0) + eff; + }, + }, + }, + }, + dcyuanmo: { + audio: 2, + trigger: { player: ["damageEnd", "phaseZhunbeiBegin"] }, + direct: true, + group: "dcyuanmo_add", + init: function (player) { + player.storage.dcyuanmo_range = 0; + }, + change: function (player, num) { + player.addSkill("dcyuanmo_range"); + if (typeof player.storage.dcyuanmo_range !== "number") player.storage.dcyuanmo_range = 0; + if (!num) return; + player.storage.dcyuanmo_range += num; + if (player.storage.dcyuanmo_range != 0) player.markSkill("dcyuanmo_range"); + else player.unmarkSkill("dcyuanmo_range"); + game.log(player, "的攻击范围", (num > 0 ? "+" : "") + num); + }, + content: function () { + "step 0"; + event.targets = game.filterPlayer(current => player.inRange(current)); + var choiceList = ["攻击范围+1。然后若你攻击范围内的角色数因此增加,你可以获得其中任意名角色的一张牌", "攻击范围-1。然后你摸两张牌"]; + player + .chooseControl("cancel2") + .set("prompt", get.prompt("dcyuanmo")) + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if ( + trigger.name == "phaseZhunbei" && + player.getAttackRange() == 1 && + !player.hasCard(card => { + if (get.subtype(card) != "equip1" && !player.hasUseTarget(card)) return false; + var num = 1; + var info = get.info(card, false); + if (info && info.distance && typeof info.distance.attackFrom == "number") num -= info.distance.attackFrom; + return num > 1; + }, "hs") + ) + return "选项一"; + var targets = event.targets.slice(), + targetsx = []; + var _tmp = player.storage.dcyuanmo_range; + player.storage.dcyuanmo_range++; + try { + targetsx = game.filterPlayer(current => player.inRange(current)); + } catch (e) { + player.storage.dcyuanmo_range = _tmp; + } + player.storage.dcyuanmo_range = _tmp; + targetsx.removeArray(targets); + return targetsx.reduce((p, c) => { + return p + Math.max(0, get.effect(c, { name: "shunshou_copy2" }, player, player)); + }, 0) > + get.effect(player, { name: "draw" }, player, player) * 1.3 + ? "选项一" + : "选项二"; + })() + ); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + return; + } + player.logSkill("dcyuanmo"); + if (result.control == "选项一") { + lib.skill.dcyuanmo.change(player, 1); + var targetsx = game.filterPlayer(current => player.inRange(current)); + if (targetsx.length <= targets.length) { + event.finish(); + } else event.targets = targetsx.removeArray(targets); + } else { + lib.skill.dcyuanmo.change(player, -1); + player.draw(2); + event.finish(); + } + "step 2"; + player + .chooseTarget("远谟:获得任意名本次进入你攻击范围的角色的一张牌", [1, targets.length], (card, player, target) => { + return _status.event.getParent().targets.includes(target) && target.countGainableCards(player, "he") > 0; + }) + .set("ai", target => { + var player = _status.event.player; + return get.effect(target, { name: "shunshou_copy2" }, player, player); + }); + "step 3"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets); + for (var target of targets) { + player.gainPlayerCard(target, "he", true); + } + } + }, + subSkill: { + add: { + audio: "dcyuanmo", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return !game.hasPlayer(current => player.inRange(current)); + }, + prompt2: "令你的攻击范围+1", + check: () => true, + content: function () { + lib.skill.dcyuanmo.change(player, 1); + }, + }, + range: { + charlotte: true, + intro: { + content: function (storage, player) { + var num = player.storage.dcyuanmo_range; + return "攻击范围" + (num >= 0 ? "+" : "") + num; + }, + }, + mod: { + attackRange: function (player, num) { + return num + player.countMark("dcyuanmo_range"); + }, + }, + }, + }, + }, + //薛灵芸 + dcxialei: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + filter: function (event, player) { + if (player.countMark("dcxialei_clear") >= 3) return false; + if (event.name != "cardsDiscard") { + return event.getd(player, "cards2").some(i => get.color(i, player) == "red"); + } else { + if (!event.cards.filterInD("d").some(i => get.color(i, player) == "red")) return false; + var evt = event.getParent(); + if (evt.name != "orderingDiscard") return false; + var evtx = evt.relatedEvent || evt.getParent(); + if (evtx.player != player) return false; + return player.hasHistory("lose", evtxx => { + return evtx == (evtxx.relatedEvent || evtxx.getParent()) && evtxx.cards2.length > 0; + }); + } + }, + content: function () { + "step 0"; + var cards = get.cards(3 - player.countMark("dcxialei_clear")); + event.cards = cards; + game.cardsGotoOrdering(cards); + if (cards.length == 1) event._result = { bool: true, links: cards }; + else player.chooseButton(["霞泪:获得其中的一张牌", cards], true); + "step 1"; + if (result.bool) { + var card = result.links[0]; + player.gain(card, "gain2"); + event.cards.remove(card); + if (event.cards.length) { + player + .chooseBool() + .set("createDialog", ["是否将剩余牌置于牌堆底?", event.cards]) + .set("ai", () => _status.event.bool) + .set( + "bool", + (function () { + if (!player.hasSkill("dcanzhi")) return Math.random() < 0.5; + if (player.hasSkill("dcanzhi_blocker")) { + var next = _status.currentPhase.getNext(); + var judges = next.getCards("j"); + var val = 0; + if (judges.length && !next.hasWuxie()) { + var att = get.attitude(player, next); + for (var i = 0; ; i++) { + var judge = judges[i] && get.judge(judges[i]), + card = event.cards[i]; + if (!judge || !card) break; + val += judge(card) * att; + i++; + } + } + if (val > 0) return false; + else if (val == 0) return Math.random() < 0.5; + return true; + } + var card = event.cards[0]; + if ( + get.color(card, player) == "red" && + player.isPhaseUsing() && + player.countCards("hs", card => { + return get.color(card) == "red" && player.hasValueTarget(card) && ["basic", "trick"].includes(get.type(card)); + }) > 0 + ) + return false; + if (get.color(card, player) == "black") return false; + return true; + })() + ); + } else event.goto(3); + } else event.finish(); + "step 2"; + if (result.bool) { + player.popup("牌堆底"); + game.log(player, "将" + get.cnNumber(event.cards.length) + "张牌置于了牌堆底"); + } else player.popup("牌堆顶"); + while (cards.length) { + var card = cards.pop(); + card.fix(); + if (result.bool) ui.cardPile.appendChild(card); + else ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + } + game.updateRoundNumber(); + "step 3"; + player.addMark("dcxialei_clear", 1, false); + player.addTempSkill("dcxialei_clear"); + }, + subSkill: { clear: { onremove: true } }, + }, + dcanzhi: { + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("dcanzhi_blocker"); + }, + group: "dcanzhi_damage", + content: function () { + "step 0"; + player.judge(result => { + if (get.color(result) == "red") return _status.event.getParent().player.countMark("dcxialei_clear") / 2; + return 2; + }).judge2 = result => result.bool; + "step 1"; + if (result.color == "red") { + player.removeSkill("dcxialei_clear"); + event.finish(); + } else if (result.color == "black") { + player.addTempSkill("dcanzhi_blocker"); + player + .chooseTarget("暗织:是否令一名非当前回合角色获得本回合进入弃牌堆的两张牌?", (card, player, target) => { + return target != _status.currentPhase; + }) + .set("ai", target => { + return get.effect(target, { name: "wuzhong" }, _status.event.player); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target); + var cards = []; + game.getGlobalHistory("cardMove", evt => { + if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") { + cards.addArray(evt.cards.filterInD("d")); + } + }); + if (cards.length) { + player.chooseButton(["暗织:选择令" + get.translation(target) + "获得的牌", cards], true, Math.min(cards.length, 2)).set("ai", button => { + var player = _status.event.player, + target = _status.event.getParent().target; + return get.sgnAttitude(player, target) * get.value(button.link, target); + }); + } + } else event.finish(); + "step 3"; + if (result.bool) { + target.gain(result.links, "gain2"); + } + }, + ai: { + combo: "dcxialei", + order: function (item, player) { + if (player.countMark("dcxialei_clear") >= 2) return 10; + if (player.hasHistory("useSkill", evt => evt.skill == "dcxialei") && get.color(ui.cardPile.firstChild, player) == "red" && player.countMark("dcxialei_clear") > 0) return 9; + return 1; + }, + result: { + player: function (player) { + return 1; + }, + }, + }, + subSkill: { + damage: { + audio: "dcanzhi", + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return !player.hasSkill("dcanzhi_blocker"); + }, + check: function (event, player) { + return game.hasPlayer(current => { + return get.attitude(player, current) > 0 && current != _status.currentPhase; + }); + }, + prompt2: "你判定,若结果为红色,你重置〖霞泪〗的观看牌数;若结果为黑色,〖暗织〗于本回合失效,然后你可以令一名非当前回合角色获得本回合进入弃牌堆的两张牌。", + content: function () { + event.setContent(lib.skill.dcanzhi.content); + event.goto(0); + }, + }, + blocker: { charlotte: true }, + }, + }, + //十周年王允 + dclianji: { + enable: "phaseUse", + audio: "wylianji", + usable: 1, + check: function (card) { + return 5 - get.value(card); + }, + filterTarget: function (card, player, target) { + return target != player; + }, + filterCard: true, + content: function () { + "step 0"; + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip1" && targets[0].hasUseTarget(card); + }); + if (card) { + if (card.name == "qinggang" && !lib.inpile.includes("qibaodao")) { + card.remove(); + card = game.createCard("qibaodao", card.suit, card.number); + } + targets[0].chooseUseTarget(card, true, "nopopup", "nothrow"); + } else { + player.chat("没有装备牌了吗"); + game.log("但是牌堆里已经没有装备牌了!"); + } + "step 1"; + game.updateRoundNumber(); + targets[0] + .chooseToUse(get.translation(player) + "对你发动了【连计】", { name: "sha" }) + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if (target == _status.event.source) return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("addCount", false) + .set("source", player) + .set("prompt2", "对除" + get.translation(player) + "外的一名角色使用一张【杀】,并将装备区内的武器牌交给其中一名目标角色;或点击“取消”,令" + get.translation(player) + "视为对你使用一张【杀】,并获得你装备区内的武器牌"); + "step 2"; + var card = targets[0].getEquips(1); + if (result.bool) { + player.addSkill("dclianji_1"); + if (card.length && result.targets.filter(target => target.isIn()).length > 0) { + event.card = card; + targets[0] + .chooseTarget(true, "将" + get.translation(card) + "交给一名目标角色", (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + var card = _status.event.getParent().card[0]; + return (target.hasSkillTag("nogain") ? 0 : get.attitude(_status.event.player, target)) * Math.max(0.1, target.getUseValue(card)); + }) + .set("targets", result.targets); + } else event.finish(); + } else { + player.addSkill("dclianji_2"); + event.goto(4); + } + "step 3"; + targets[0].give(card, result.targets[0], "give"); + event.finish(); + "step 4"; + player.useCard({ name: "sha", isCard: true }, targets[0], false); + "step 5"; + var card = targets[0].getEquips(1); + if (card.length) targets[0].give(card, player, "give"); + }, + ai: { + order: 4, + result: { + target: function (player, target) { + if (game.countPlayer() == 2) return -3; + if (!target.getEquip(1)) { + if ( + game.hasPlayer(function (current) { + return current != target && !current.hasSkillTag("nogain") && get.attitude(current, target) > 0; + }) + ) + return 3; + return -3; + } + if ( + !game.hasPlayer(function (current) { + return current != target && !current.hasSkillTag("nogain") && get.attitude(current, target) > 0; + }) + ) + return -6; + return 4 - get.value(target.getEquip(1)); + }, + }, + }, + subSkill: { + 1: { charlotte: true, onremove: true }, + 2: { charlotte: true, onremove: true }, + }, + }, + dcmoucheng: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: "moucheng", + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + derivation: "xinjingong", + unique: true, + filter: function (event, player) { + return player.hasSkill("dclianji_1") && player.hasSkill("dclianji_2"); + }, + content: function () { + player.awakenSkill("dcmoucheng"); + player.changeSkills(["xinjingong"], ["dclianji"]); + }, + ai: { + combo: "dclianji", + }, + }, + //周宣 + dcwumei: { + audio: 2, + trigger: { player: "phaseBeginStart" }, + filter: function (event, player) { + return !player.hasSkill("dcwumei_used"); + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("dcwumei")).set("ai", target => { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcwumei", target); + player.addTempSkill("dcwumei_used", "roundStart"); + target.insertPhase(); + target.addTempSkill("dcwumei_wake", "phaseAfter"); + var targets = game.filterPlayer(); + if (!target.storage.dcwumei_wake) target.storage.dcwumei_wake = [[], []]; + for (var targetx of targets) { + target.storage.dcwumei_wake[0].push(targetx); + target.storage.dcwumei_wake[1].push(targetx.hp); + } + target.markSkill("dcwumei_wake"); + if (!trigger._finished) { + trigger.finish(); + trigger.untrigger(true); + trigger._triggered = 5; + game.players + .slice() + .concat(game.dead) + .forEach(current => { + current.getHistory().isSkipped = true; + current.getStat().isSkipped = true; + }); + var evt = player.insertPhase(); + delete evt.skill; + game.broadcastAll(function (player) { + player.classList.remove("glow_phase"); + delete _status.currentPhase; + }, player); + } + } + }, + subSkill: { + used: { charlotte: true }, + wake: { + init: function (player) { + game.addGlobalSkill("dcwumei_all"); + }, + onremove: function (player) { + game.removeGlobalSkill("dcwumei_all"); + delete player.storage.dcwumei_wake; + }, + trigger: { player: "phaseJieshuBegin" }, + charlotte: true, + popup: false, + forced: true, + filter: function (event, player) { + return player.storage.dcwumei_wake && player.storage.dcwumei_wake.length; + }, + content: function () { + var storage = player.storage.dcwumei_wake; + for (var i = 0; i < storage[0].length; i++) { + var target = storage[0][i]; + if (target && target.isIn()) { + if (target.hp != storage[1][i]) { + game.log(target, "将体力从", get.cnNumber(target.hp, true), "改为", get.cnNumber(storage[1][i], true)); + target.changeHp(storage[1][i] - target.hp)._triggered = null; + } + } + } + player.removeSkill("dcwumei_wake"); + }, + marktext: "寐", + intro: { + markcount: function (storage, player) { + if (!storage || !storage.length) return 0; + return storage[0].length; + }, + content: function (storage, player) { + if (!storage || !storage.length) return "无信息"; + var str = "所有角色于回合开始时的体力值:
    "; + for (var i = 0; i < storage[0].length; i++) { + var str2 = get.translation(storage[0][i]) + ":" + storage[1][i]; + if (!storage[0][i].isIn()) str2 = '' + str2 + "(已故)"; + str += "
  • " + str2; + } + return str; + }, + }, + }, + all: { + trigger: { player: "dieAfter" }, + filter: function (event, player) { + return !game.hasPlayer(current => current.hasSkill("dcwumei_wake"), true); + }, + silent: true, + forceDie: true, + content: function () { + game.removeGlobalSkill("dcwumei_all"); + }, + ai: { + effect: { + player_use: function (card, player, target) { + if (get.tag(card, "recover") && target.hp > 0) return 0; + if (get.tag(card, "damage")) return 0.5; + }, + }, + }, + }, + }, + }, + dczhanmeng: { + audio: 2, + trigger: { player: "useCard" }, + filter(event, player) { + return ( + !player.hasSkill("dczhanmeng_choice1") || + !player.hasSkill("dczhanmeng_choice2") || + (!player.hasSkill("dczhanmeng_choice0") && + !game.hasPlayer2(current => { + const history = current.actionHistory; + if (history.length < 2) return false; + for (let i = history.length - 2; i >= 0; i--) { + if (history[i].isSkipped) continue; + const list = history[i].useCard.map(evt => evt.card.name); + return list.includes(event.card.name); + } + return false; + }, true)) + ); + }, + direct: true, + content() { + "step 0"; + var list = []; + var choiceList = ["上回合若没有同名牌被使用过,你获得一张非伤害牌", "下回合当同名牌首次被使用后,你获得一张伤害牌", "令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害"]; + var used = game.hasPlayer2(current => { + var history = current.actionHistory; + if (history.length < 2) return false; + for (let i = history.length - 2; i >= 0; i--) { + if (history[i].isSkipped) continue; + const list = history[i].useCard.map(evt => evt.card.name); + return list.includes(trigger.card.name); + } + return false; + }, true); + if (!player.hasSkill("dczhanmeng_choice0") && !used) list.push("选项一"); + else choiceList[0] = '' + choiceList[0] + (used ? "(同名牌被使用过)" : "(已选择)") + ""; + if (!player.hasSkill("dczhanmeng_choice1")) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + "(已选择)"; + var other = game.hasPlayer(current => current != player); + if (!player.hasSkill("dczhanmeng_choice2") && other) list.push("选项三"); + else choiceList[2] = '' + choiceList[2] + (!other ? "(没人啦)" : "(已选择)") + ""; + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("dczhanmeng")) + .set("ai", () => { + var choices = _status.event.controls.slice().remove("cancel2"); + var player = _status.event.player, + evt = _status.event.getTrigger(); + if (!game.hasPlayer(current => get.attitude(player, current) < 0)) choices.remove("选项三"); + else if (choices.includes("选项三")) return "选项三"; + if (choices.includes("选项二")) { + if (evt.card.name == "sha") return "选项二"; + if (get.type(evt.card, null, false) == "equip") choices.remove("选项二"); + } + if (!choices.length) return "cancel2"; + return choices.randomGet(); + }) + .set("choiceList", choiceList); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + return; + } + if (result.control == "选项一") { + player.logSkill("dczhanmeng"); + game.log(player, "选择了", "#y" + result.control); + player.addTempSkill("dczhanmeng_choice0"); + var card = get.cardPile2(card => { + return !get.tag(card, "damage"); + }); + if (card) player.gain(card, "gain2"); + event.finish(); + } else if (result.control == "选项二") { + player.logSkill("dczhanmeng"); + game.log(player, "选择了", "#y" + result.control); + player.addTempSkill("dczhanmeng_choice1"); + trigger["dczhanmeng_" + player.playerid] = true; + player.addSkill("dczhanmeng_delay"); + event.finish(); + } else { + player.addTempSkill("dczhanmeng_choice2"); + player.chooseTarget("占梦:令一名其他角色弃置两张牌", lib.filter.notMe, true).set("ai", target => { + var player = _status.event.player; + var eff1 = get.effect(target, { name: "guohe_copy2" }, player, player) + 0.1; + var eff2 = get.damageEffect(target, player, player, "fire") + 0.1; + if (eff1 < 0 && eff2 < 0) return -eff1 * eff2; + return eff1 * eff2; + }); + } + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dczhanmeng", target); + game.log(player, "选择了", "#y选项三"); + target.chooseToDiscard(2, "he", true); + } else event.finish(); + "step 3"; + if (result.bool) { + var cards = result.cards; + var num = 0; + for (var card of cards) { + num += get.number(card, false); + } + if (num > 10) { + player.line(target, "fire"); + target.damage("fire"); + } + } + }, + ai: { threaten: 8 }, + subSkill: { + delay: { + trigger: { global: ["useCardAfter", "phaseBeginStart"] }, + charlotte: true, + forced: true, + popup: false, + silent: true, + filter(event, player, name) { + var history = player.actionHistory; + if (history.length < 2) return false; + var list = history[history.length - 2].useCard; + if (name == "phaseBeginStart") { + return !list.some(evt => evt["dczhanmeng_" + player.playerid]); + } + for (var evt of list) { + if ( + evt["dczhanmeng_" + player.playerid] && + event.card.name == evt.card.name && + game + .getGlobalHistory("useCard", evtx => { + return evtx.card.name == event.card.name; + }) + .indexOf(event) == 0 + ) + return true; + } + return false; + }, + content() { + if (event.triggername != "phaseBeginStart") { + player.logSkill("dczhanmeng_delay"); + var card = get.cardPile2(card => { + return get.tag(card, "damage"); + }); + if (card) player.gain(card, "gain2"); + } else player.removeSkill("dczhanmeng_delay"); + }, + }, + choice0: { charlotte: true }, + choice1: { charlotte: true }, + choice2: { charlotte: true }, + }, + }, + //程秉 + dcjingzao: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (3 + player.countMark("dcjingzao_add") - player.countMark("dcjingzao_ban") <= 0) return false; + return game.hasPlayer(current => lib.skill.dcjingzao.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return player != target && !target.hasSkill("dcjingzao_temp"); + }, + content: function () { + "step 0"; + target.addTempSkill("dcjingzao_temp"); + var cards = game.cardsGotoOrdering(get.cards(3 + player.countMark("dcjingzao_add") - player.countMark("dcjingzao_ban"))).cards; + event.cards = cards; + game.log(player, "亮出了", event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, target, id, cards) { + var str = get.translation(player) + "对" + (target == game.me ? "你" : get.translation(target)) + "发动了【经造】"; + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + target, + event.videoId, + event.cards + ); + game.addVideo("showCards", player, [get.translation(player) + "发动了【经造】", get.cardsInfo(event.cards)]); + game.delay(cards.length - 1); + "step 1"; + target + .chooseToDiscard("he") + .set("prompt", false) + .set("filterCard", card => { + var names = _status.event.getParent().cards.map(i => i.name); + return names.includes(get.name(card)); + }) + .set("ai", card => { + var target = _status.event.player, + player = _status.event.getParent().player; + var att = get.attitude(target, player), + val = get.value(card); + if (!lib.skill.dcjingzao.filter(null, player)) { + if (att > 0) return 0; + return 6 - val; + } else { + if (att > 0) return 4 - val; + return 0; + } + }); + var update = function (id, source) { + var dialog = get.idDialog(id); + if (dialog) { + var div = ui.create.div("", dialog.content, 1); + var name = get.translation(source); + div.innerHTML = "弃置一张满足条件的牌,然后" + name + "〖经造〗本回合亮出牌数+1;或点“取消”令" + name + "随机获得每种牌名的牌各一张,且〖经造〗本回合失效"; + ui.update(); + } + }; + if (target == game.me) update(event.videoId, player); + else if (target.isOnline()) target.send(update, event.videoId, player); + "step 2"; + game.broadcastAll("closeDialog", event.videoId); + if (result.bool) { + player.addTempSkill("dcjingzao_add"); + player.addMark("dcjingzao_add", 1, false); + } else { + var cards = cards.randomSort(), + cards2 = []; + for (var card of cards) { + if (!cards2.map(i => i.name).includes(card.name)) cards2.push(card); + } + if (cards2.length) player.gain(cards2, "gain2"); + player.addTempSkill("dcjingzao_ban"); + player.addMark("dcjingzao_ban", cards2.length, false); + } + }, + ai: { + order: 7, + result: { + player: 1, + }, + }, + subSkill: { + add: { charlotte: true, onremove: true }, + ban: { charlotte: true, onremove: true }, + temp: { charlotte: true }, + }, + }, + dcenyu: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + return ( + event.player != player && + game.hasPlayer2(current => { + return current.hasHistory("useCard", evt => { + return evt.card.name == event.card.name && evt != event.getParent() && evt.targets && evt.targets.includes(player); + }); + }) && + (event.card.name == "sha" || get.type(event.card) == "trick") + ); + }, + content: function () { + trigger.getParent().excluded.add(player); + }, + ai: { + effect: { + target: (card, player, target) => { + if (player === target) return; + if ( + game.hasPlayer2(current => { + return current.hasHistory("useCard", evt => evt.card.name == card.name && evt.targets && evt.targets.includes(target)); + }) && + (card.name == "sha" || get.type(card) == "trick") + ) + return "zeroplayertarget"; + }, + }, + }, + }, + //董贵人 + dclianzhi: { + audio: 2, + trigger: { player: "dying" }, + usable: 1, + forced: true, + locked: false, + derivation: "dcshouze", + group: ["dclianzhi_connect", "dclianzhi_reproach"], + filter: function (event, player) { + return player.getStorage("dclianzhi").filter(i => i && i.isIn()).length; + }, + content: function () { + player.recover(); + game.asyncDraw([player].concat(player.getStorage("dclianzhi").filter(i => i && i.isIn())).sortBySeat()); + }, + ai: { + threaten: 0.6, + }, + subSkill: { + connect: { + audio: "dclianzhi", + trigger: { + player: "enterGame", + global: "phaseBefore", + }, + forced: true, + direct: true, + filter: function (event, player) { + return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + player + .chooseTarget("连枝:请选择一名其他角色", lib.translate.dclianzhi_info, true, (card, player, target) => { + return target != player && !player.getStorage("dclianzhi").includes(target); + }) + .set("ai", target => { + var att = get.attitude(_status.event.player, target); + if (att > 0) return att + 1; + if (att == 0) return Math.random(); + return att; + }) + .set("animate", false); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dclianzhi"); + player.markAuto("dclianzhi", [target]); + } + }, + }, + reproach: { + audio: "dclianzhi", + trigger: { global: "dieAfter" }, + filter: function (event, player) { + return player.getStorage("dclianzhi").includes(event.player); + }, + direct: true, + content: function () { + "step 0"; + var num = Math.max(1, player.countMark("dclingfang")); + player + .chooseTarget(get.prompt("dclianzhi"), "选择一名其他角色,你与其各获得〖受责〗,且其获得" + num + "枚“绞”标记", (card, player, target) => { + return target != player; + }) + .set("ai", target => -get.attitude(_status.event.player, target)); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dclianzhi_reproach", target); + player.addSkills("dcshouze"); + target.addSkills("dcshouze"); + target.addMark("dclingfang", Math.max(1, player.countMark("dclingfang"))); + } + }, + }, + }, + }, + dclingfang: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + global: "useCardAfter", + }, + forced: true, + filter: function (event, player) { + if (event.name != "useCard") return true; + if (get.color(event.card) != "black") return false; + if (event.player == player) return !event.targets || !event.targets.includes(player); + return event.targets && event.targets.includes(player); + }, + content: function () { + player.addMark("dclingfang", 1); + }, + ai: { + combo: "dcfengying", + }, + marktext: "绞", + intro: { + name: "绞", + name2: "绞", + content: "mark", + }, + }, + dcfengying: { + audio: 2, + enable: "chooseToUse", + group: "dcfengying_record", + locked: false, + filter: function (event, player) { + var mark = player.countMark("dclingfang"); + if (mark <= 0 || !player.hasCard(card => get.number(card) <= mark, "hs")) return false; + var storage = player.getStorage("dcfengying"); + if (!storage.length) return false; + var storage2 = player.getStorage("dcfengying_used"); + return storage.some(name => { + return !storage2.includes(name) && event.filterCard(get.autoViewAs({ name }, "unsure"), player, event); + }); + }, + hiddenCard: function (player, name) { + var list = player.getStorage("dcfengying"); + if (player.getStorage("dcfengying_used").includes(name)) return false; + return list.includes(name) && player.hasCard(card => get.number(card) <= player.countMark("dclingfang"), "hs"); + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of player.storage.dcfengying) { + if (get.type(name) == "basic") list.push(["基本", "", name]); + if (get.type(name) == "trick") list.push(["锦囊", "", name]); + } + return ui.create.dialog("风影", [list, "vcard"]); + }, + filter: function (button, player) { + var card = { name: button.link[2], storage: { dcfengying: true } }; + if (player.getStorage("dcfengying_used").includes(card.name)) return false; + return _status.event.getParent().filterCard(get.autoViewAs(card, "unsure"), player, _status.event.getParent()); + }, + check: function (button) { + var player = _status.event.player; + if (player.countCards("hs", button.link[2]) > 0) return 0; + if (button.link[2] == "wugu") return; + var effect = player.getUseValue(button.link[2]); + if (effect > 0) return effect; + return 0; + }, + backup: function (links, player) { + return { + filterCard: function (card, player, event) { + return get.number(card) <= player.countMark("dclingfang"); + }, + audio: "dcfengying", + selectCard: 1, + popname: true, + check: function (card) { + return 6 - get.value(card) + get.number(card) / 15; + }, + position: "hs", + viewAs: { + name: links[0][2], + storage: { dcfengying: true }, + }, + precontent: function () { + player.logSkill("dcfengying"); + player.addTempSkill("dcfengying_used"); + player.markAuto("dcfengying_used", [event.result.card.name]); + event.getParent().addCount = false; + delete event.result.skill; + }, + }; + }, + prompt: function (links, player) { + return "将一张点数不大于" + get.strNumber(player.countMark("dclingfang")) + "的手牌当做" + get.translation(links[0][2]) + "使用(无距离和次数限制)"; + }, + }, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dcfengying) return true; + }, + cardUsable: function (card, player) { + if (card.storage && card.storage.dcfengying) return Infinity; + }, + }, + ai: { + order: 4, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + threaten: 2, + combo: "dclingfang", + }, + subSkill: { + record: { + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + return ui.discardPile.childNodes.length > 0; + }, + forced: true, + popup: false, + content: function () { + player.storage.dcfengying = []; + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var card = ui.discardPile.childNodes[i]; + if (get.color(card, false) != "black") continue; + if (!["basic", "trick"].includes(get.type(card))) continue; + player.storage.dcfengying.add(card.name); + } + player.storage.dcfengying.sort((a, b) => { + return lib.inpile.indexOf(a) - lib.inpile.indexOf(b); + }); + }, + }, + used: { + charlotte: true, + onremove: true, + intro: { + content: "已使用过$", + }, + }, + }, + }, + dcshouze: { + audio: true, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("dclingfang") > 0; + }, + content: function () { + "step 0"; + player.removeMark("dclingfang", 1); + "step 1"; + var card = get.discardPile(card => get.color(card, false) == "black"); + if (card) player.gain(card, "gain2"); + player.loseHp(); + }, + ai: { + combo: "dclingfang", + }, + }, + //袁姬 + dcmengchi: { + audio: "dcfangdu", + trigger: { player: ["linkBefore", "damageEnd"] }, + forced: true, + filter: function (event, player) { + var num = player.getStat("gain"); + if (num && num > 0) return false; + if (event.name == "link") return !player.isLinked(); + return event.hasNature(); + }, + content: function () { + if (trigger.name == "link") trigger.cancel(); + else player.recover(); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.itemtype(player) != "player" || player._dcmengchi_aiChecking || target.getStat("gain")) return; + if (card.name == "tiesuo" && !target.isLinked()) return 0; + if (player.hasSkillTag("jueqing", false, target)) return; + if (!get.tag(card, "damage") || get.tag(card, "natureDamage")) return; + if (target.hp <= 1) return 0.75; + if ( + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) && + player.hasSkillTag("damageBonus", false, { + target: target, + card: card, + }) + ) { + if (target.hp > 2) return 0.5; + return 0.75; + } + if (get.attitude(player, target) > 0) return [0, 0]; + var sha = player.getCardUsable({ name: "sha" }); + player._dcmengchi_aiChecking = true; + var num = player.countCards("h", function (card) { + if (get.name(card) == "sha") { + if (sha == 0) return false; + else sha--; + } + return player.canUse(card, target) && get.effect(target, card, player, player) > 0; + }); + delete player._dcmengchi_aiChecking; + if (player.hasSkillTag("damage")) num++; + if (num < 2) return [0, 0]; + }, + }, + }, + mod: { + cardEnabled: function (card, player) { + if (!player.getStat("gain")) return false; + }, + cardSavable: function (card, player) { + if (!player.getStat("gain")) return false; + }, + }, + }, + dcfangdu: { + audio: 2, + trigger: { + player: "damageEnd", + }, + forced: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + return ( + (!event.hasNature() && + !player.hasHistory( + "damage", + evt => { + return !evt.hasNature() && evt != event; + }, + event + )) || + (event.hasNature() && + !player.hasHistory( + "damage", + evt => { + return evt.hasNature() && evt != event; + }, + event + ) && + event.source && + event.source.isIn() && + event.source.countGainableCards(player, "h")) + ); + }, + content: function () { + "step 0"; + if (!trigger.hasNature()) { + player.recover(); + } else { + var cards = trigger.source.getGainableCards(player, "h"); + if (cards.length) { + player.gain(cards.randomGet(), trigger.source, "giveAuto", "bySelf"); + } + } + }, + ai: { + effect: { + target: function (card, player, target) { + if (player._dcfangdu_aiChecking || target == _status.currentPhase) return; + if (!get.tag(card, "damage") || player.hasSkillTag("jueqing", false, target)) return; + if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return; + if (!get.tag(card, "natureDamage")) { + if (target.hasHistory("damage", evt => !evt.hasNature())) return 1.5; + else if ( + target.hp <= 1 || + (player.hasSkillTag("damageBonus", false, { + target: target, + card: card, + }) && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + })) + ) + return 0.75; + else { + if (get.attitude(player, target) > 0) return [0, 0]; + var sha = player.getCardUsable({ name: "sha" }); + player._dcfangdu_aiChecking = true; + var num = player.countCards("h", function (card) { + if (get.name(card) == "sha") { + if (sha == 0) return false; + else sha--; + } + return player.canUse(card, target) && get.effect(target, card, player, player) > 0; + }); + delete player._dcfangdu_aiChecking; + if (player.hasSkillTag("damage")) num++; + if (num < 2) return [0, 0]; + } + } + if (get.tag(card, "natureDamage") && !target.hasHistory("damage", evt => evt.hasNature()) && player.countCards("he") > 1) return [1, 1, 1, -1]; + }, + }, + }, + }, + dcjiexing: { + audio: 2, + trigger: { player: ["recoverEnd", "damageEnd", "loseHpEnd"] }, + check: function (event, player) { + var current = _status.currentPhase; + if (!player.hasSkill("dcmengchi") || get.attitude(player, current) >= 0) return true; + var num = player.getStat("gain"); + if (num && num > 0) return true; + if (current.countCards("hs", card => current.canUse(card, player) && get.effect(player, card, current, player) < 0) >= 2) return false; + return true; + }, + frequent: "check", + content: function () { + player.draw().gaintag = ["dcjiexing"]; + player.addTempSkill("dcjiexing_add"); + }, + subSkill: { + add: { + charlotte: true, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcjiexing")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcjiexing")) return false; + }, + }, + onremove: function (player) { + player.removeGaintag("dcjiexing"); + }, + }, + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "recover")) return [1, 1]; + if (get.tag(card, "damage")) { + var draw = 0.9; + if (target.hasSkill("dcmengchi") && target.getStat("gain")) draw = 1.8; + if ( + target.hp <= 1 || + (card.name == "sha" && player.hasSkill("jiu")) || + (get.itemtype(player) == "player" && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) && + player.hasSkillTag("damageBonus", false, { + target: target, + card: card, + })) + ) { + if (target.hp > 2) return [1, draw]; + return; + } + return [1, draw]; + } + }, + }, + }, + }, + //朱建平 + olddcxiangmian: { + audio: "dcxiangmian", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return !player.getStorage("olddcxiangmian").includes(event.player) && player != event.player; + }, + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) < 0; + }, + content: function () { + "step 0"; + player.judge(card => 2 / Math.sqrt(get.number(card, false))).set("judge2", result => result.bool); + "step 1"; + player.markAuto("olddcxiangmian", [trigger.player]); + trigger.player.addSkill("olddcxiangmian_countdown"); + if (!trigger.player.storage["olddcxiangmian_countdown"]) trigger.player.storage["olddcxiangmian_countdown"] = []; + [player.playerid, result.suit, result.number].forEach(i => trigger.player.storage["olddcxiangmian_countdown"].push(i)); + trigger.player.markSkill("olddcxiangmian_countdown"); + }, + intro: { content: "已对$发动过技能" }, + ai: { + expose: 0.3, + }, + subSkill: { + countdown: { + trigger: { player: "useCardAfter" }, + mark: true, + marktext: "噬", + silent: true, + forced: true, + charlotte: true, + intro: { + markcount: function (storage) { + if (storage) { + var list = storage.filter((_, i) => i % 3 == 2); + return Math.min.apply(null, list); + } + }, + content: function (storage, player) { + var str = "使用"; + for (var i = 0; i < storage.length / 3; i++) { + str += get.cnNumber(storage[i * 3 + 2]) + "张" + get.translation(storage[i * 3 + 1]) + "牌、"; + } + str = str.slice(0, -1); + str += "后,失去等同于体力值的体力"; + return str; + }, + }, + filter: function (event, player) { + if (!player.getStorage("olddcxiangmian_countdown").length) return false; + return player + .getStorage("olddcxiangmian_countdown") + .filter((_, i) => i % 3 == 1) + .includes(get.suit(event.card, player)); + }, + content: function () { + "step 0"; + var storage = player.getStorage("olddcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if (storage[i * 3 + 1] == get.suit(trigger.card, player)) { + storage[i * 3 + 2]--; + } + } + player.markSkill("olddcxiangmian_countdown"); + "step 1"; + var storage = player.getStorage("olddcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if (storage[i * 3 + 2] <= 0) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + player.logSkill("olddcxiangmian_countdown"); + var target = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.storage["olddcxiangmian_countdown"].splice(i * 3, 3); + if (!player.getStorage("olddcxiangmian_countdown").length) { + player.removeSkill("olddcxiangmian_countdown"); + } + if (player.hp > 0) player.loseHp(player.hp); + i--; + } + } + }, + ai: { + effect: { + player_use: function (card, player, target) { + if (typeof card != "object") return; + var storage = player.getStorage("olddcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if (get.suit(card, player) == storage[i * 3 + 1] && storage[i * 3 + 2] == 1 && !player.canSave(player) && !get.tag(card, "save")) return "zeroplayertarget"; + } + }, + }, + }, + }, + }, + }, + dcxiangmian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => lib.skill.dcxiangmian.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return !player.getStorage("dcxiangmian").includes(target) && player != target; + }, + content: function () { + "step 0"; + target.judge(card => -2 / Math.sqrt(get.number(card, false))).set("judge2", result => (result.bool === false ? true : false)); + "step 1"; + player.markAuto("dcxiangmian", [target]); + target.addSkill("dcxiangmian_countdown"); + if (!target.storage["dcxiangmian_countdown"]) target.storage["dcxiangmian_countdown"] = []; + [player.playerid, result.suit, result.number].forEach(i => target.storage["dcxiangmian_countdown"].push(i)); + target.markSkill("dcxiangmian_countdown"); + }, + intro: { content: "已对$发动过技能" }, + ai: { + expose: 0.3, + order: 10, + result: { target: -5 }, + }, + subSkill: { + countdown: { + trigger: { player: "useCardAfter" }, + mark: true, + marktext: "💀", + silent: true, + forced: true, + charlotte: true, + intro: { + markcount: function (storage) { + if (storage) { + var list = storage.filter((_, i) => i % 3 == 2); + return Math.min.apply(null, list); + } + }, + content: function (storage, player) { + if (!storage) return; + var str = "使用"; + str += + get.cnNumber( + Math.min.apply( + null, + storage.filter((_, i) => i % 3 == 2) + ) + ) + "张牌后,或使用一张"; + for (var i = 0; i < storage.length / 3; i++) { + str += get.translation(storage[i * 3 + 1]) + "、"; + } + str = str.slice(0, -1); + str += "后,失去等同于体力值的体力"; + return str; + }, + }, + filter: function (event, player) { + if (!player.getStorage("dcxiangmian_countdown").length) return false; + //return (player.getStorage('dcxiangmian_countdown').filter((_,i)=>i%3==1)).includes(get.suit(event.card,player)); + return true; + }, + content: function () { + "step 0"; + var storage = player.getStorage("dcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if (storage[i * 3 + 1] == get.suit(trigger.card, player)) { + storage[i * 3 + 2] = 0; + } else storage[i * 3 + 2]--; + } + player.markSkill("dcxiangmian_countdown"); + "step 1"; + var storage = player.getStorage("dcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if (storage[i * 3 + 2] <= 0) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + player.logSkill("dcxiangmian_countdown"); + player.storage["dcxiangmian_countdown"].splice(i * 3, 3); + if (!player.getStorage("dcxiangmian_countdown").length) { + player.removeSkill("dcxiangmian_countdown"); + } + if (player.hp > 0) player.loseHp(player.hp); + i--; + } + } + }, + ai: { + effect: { + player_use: function (card, player, target) { + if (typeof card != "object") return; + var storage = player.getStorage("dcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if ((storage[i * 3 + 2] == 1 || get.suit(card, player) == storage[i * 3 + 1]) && !player.canSave(player) && !get.tag(card, "save")) return "zeroplayertarget"; + } + }, + }, + }, + }, + }, + }, + dctianji: { + audio: 2, + trigger: { global: "cardsDiscardAfter" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent().relatedEvent; + return evt && evt.name == "judge" && event.cards.filterInD("d").length; + }, + content: function () { + var card = trigger.cards[0], + cards = [], + func = ["type2", "suit", "number"]; + for (var fn of func) { + var cardx = get.cardPile2(cardxx => { + if (get[fn](card, player) == get[fn](cardxx, player) && !cards.includes(cardxx)) { + return true; + } + }); + if (cardx) cards.push(cardx); + } + /*if(cards.length&&!player.isMaxHandcard(true)) player.draw(); + else*/ if (cards.length) player.gain(cards, "gain2"); + }, + }, + //赵直 + dctongguan: { + trigger: { + global: "phaseBegin", + }, + filter: function (event, player) { + return ( + event.player + .getAllHistory() + .filter(history => { + return history.isMe && !history.isSkipped; + }) + .indexOf(event.player.getHistory()) === 0 && + lib.skill.dctongguan.derivation.some(i => { + return (player.getStorage("dctongguan")[i] || 0) < 2; + }) + ); + }, + forced: true, + locked: false, + logTarget: "player", + derivation: ["dctongguan_wuyong", "dctongguan_gangying", "dctongguan_duomou", "dctongguan_guojue", "dctongguan_renzhi"], + content: function () { + "step 0"; + var skills = lib.skill.dctongguan.derivation.slice(); + player + .chooseControl( + skills.filter(i => { + return (player.getStorage("dctongguan")[i] || 0) < 2; + }) + ) + .set( + "choiceList", + skills.map(i => { + var info = ""; + switch (player.getStorage("dctongguan")[i]) { + case 1: + info = ' style="opacity:0.65;"'; + break; + case 2: + info = ' style="text-decoration:line-through; opacity:0.3;"'; + break; + } + return '
    「' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "」
    " + "" + get.skillInfoTranslation(i, player) + "(已选过" + get.cnNumber(player.getStorage("dctongguan")[i] || 0) + "次)" + ""; + }) + ) + .set("displayIndex", false) + .set("prompt", "统观:为" + get.translation(trigger.player) + "选择一个属性") + .set("ai", function () { + var controls = _status.event.controls, + target = _status.event.getTrigger().player; + var str = target + .getSkills(null, false, false) + .map(i => get.skillInfoTranslation(i)) + .join(""); + var choices = []; + if (controls.includes("dctongguan_wuyong") && /你对\S{1,15}造成\S{1,10}伤害/.test(str)) choices.push("dctongguan_wuyong"); + if (controls.includes("dctongguan_gangying") && /回复\S{1,5}体力/.test(str) && _status.event.player.getFriends().length) choices.push("dctongguan_gangying"); + if (controls.includes("dctongguan_duomou") && /你(可|可以)?摸\S{1,3}张牌/.test(str)) choices.push("dctongguan_duomou"); + if (controls.includes("dctongguan_guojue") && /(当【过河拆桥】使用|((弃置|获得)\S{1,5}其他角色\S{1,7}牌|))/.test(str)) choices.push("dctongguan_guojue"); + if (controls.includes("dctongguan_renzhi") && /交给\S{0,5}其他角色/.test(str) && _status.event.player.getFriends().length) choices.push("dctongguan_renzhi"); + if (choices.length) return choices.randomGet(); + return _status.event.controls.randomGet(); + }); + "step 1"; + if (result.control) { + var skill = result.control; + var func = lib.skill.dctongguan.localMark; + if (event.player == game.me) func(skill, trigger.player); + else if (event.isOnline()) player.send(func, skill, trigger.player); + // game.log(player,'为',trigger.player,'选择了','#g「'+get.translation(skill)+'」','属性'); + game.log(player, "为", trigger.player, "选择了", "#g一个属性"); + // player.popup(skill); + trigger.player.addSkill(skill); + if (!player.storage.dctongguan) player.storage.dctongguan = {}; + if (!player.storage.dctongguan[skill]) player.storage.dctongguan[skill] = 0; + player.storage.dctongguan[skill]++; + } + }, + localMark: function (skill, player) { + var name = skill, + info; + if (player.marks[name]) player.updateMarks(); + if (lib.skill[name]) info = lib.skill[name].intro; + if (!info) return; + if (player.marks[name]) player.marks[name].info = info; + else player.marks[name] = player.mark(name, info); + player.updateMarks(); + }, + ai: { + combo: "dcmengjie", + }, + subSkill: { + forceFinish: { charlotte: true }, + wuyong: { + marktext: "勇", + intro: { + name: "武勇", + content: "属性目标:造成伤害", + }, + charlotte: true, + silent: true, + nopop: true, + }, + gangying: { + marktext: "刚", + intro: { + name: "刚硬", + content: "属性目标:回复体力,或于得到牌后手牌数大于体力值", + }, + charlotte: true, + silent: true, + forced: true, + nopop: true, + lastDo: true, + trigger: { player: "gainEnd" }, + filter: function (event, player) { + return player.countCards("h") > player.hp; + }, + content: function () { + trigger._dctongguan_gangying = true; + }, + }, + duomou: { + marktext: "谋", + intro: { + name: "多谋", + content: "属性目标:于摸牌阶段外摸牌", + }, + charlotte: true, + silent: true, + nopop: true, + }, + guojue: { + marktext: "决", + intro: { + name: "果决", + content: "属性目标:弃置或获得其他角色牌", + }, + charlotte: true, + silent: true, + nopop: true, + }, + renzhi: { + marktext: "仁", + intro: { + name: "仁智", + content: "属性目标:交给其他角色牌", + }, + charlotte: true, + silent: true, + nopop: true, + }, + }, + }, + dcmengjie: { + trigger: { + global: "phaseEnd", + }, + forced: true, + direct: true, + locked: false, + filter: function (event, player) { + var target = event.player; + if ( + (target.hasSkill("dctongguan_gangying") && + (target.hasHistory("gain", function (evt) { + return evt._dctongguan_gangying == true; + }) || + game.getGlobalHistory("changeHp", function (evt) { + return evt.player == target && (evt.getParent().name == "recover" || target.countCards("h") > target.hp); + }).length > 0)) || + (target.hasSkill("dctongguan_wuyong") && target.getHistory("sourceDamage").length) || + (target.hasSkill("dctongguan_duomou") && target.getHistory("gain", evt => evt.getParent().name == "draw" && evt.getParent("phaseDraw").name != "phaseDraw").length) + ) { + return true; + } + var guojue = false, + renzhi = false; + game.countPlayer2(current => { + if (current == target) return false; + if ( + !guojue && + current.hasHistory("lose", evt => { + if (evt.type == "discard") { + if ((evt.discarder || evt.getParent(2).player) != target) return false; + if (!evt.getl(current).cards2.length) return false; + return true; + } else if (evt.type == "gain") { + var evtx = evt.getParent(); + if (evtx.giver || evtx.getParent().name == "gift") return false; + var cards = evtx.getg(target); + if (!cards.length) return false; + var cards2 = evtx.getl(current).cards2; + for (var card of cards2) { + if (cards.includes(card)) return true; + } + } + return false; + }) + ) + guojue = true; + if ( + !renzhi && + current.hasHistory("gain", evt => { + if (evt.giver != target || evt.getParent().name == "gift") return false; + return evt.cards.length; + }) + ) + renzhi = true; + }); + return (target.hasSkill("dctongguan_guojue") && guojue) || (target.hasSkill("dctongguan_renzhi") && renzhi); + }, + rules: [ + target => target.getHistory("sourceDamage").length, + target => + target.hasHistory("gain", function (evt) { + return evt._dctongguan_gangying; + }) || + game.getGlobalHistory("changeHp", function (evt) { + return evt.player == target && evt.getParent().name == "recover"; + }).length > 0 || + target.countCards("h") > target.hp, + target => target.getHistory("gain", evt => evt.getParent().name == "draw" && evt.getParent("phaseDraw").name != "phaseDraw").length, + (target, bool) => bool, + (target, bool) => bool, + ], + content: function () { + "step 0"; + event.nowProperty = 0; + var target = trigger.player; + var guojue = false, + renzhi = false; + game.countPlayer2(current => { + if (current == target) return false; + if ( + !guojue && + current.hasHistory("lose", evt => { + if (evt.type == "discard") { + if ((evt.discarder || evt.getParent(2).player) != target) return false; + if (!evt.getl(current).cards2.length) return false; + return true; + } else if (evt.type == "gain") { + var evtx = evt.getParent(); + if (evtx.giver || evtx.getParent().name == "gift") return false; + var cards = evtx.getg(target); + if (!cards.length) return false; + var cards2 = evtx.getl(current).cards2; + for (var card of cards2) { + if (cards.includes(card)) return true; + } + } + return false; + }) + ) + guojue = true; + if ( + !renzhi && + current.hasHistory("gain", evt => { + if (evt.giver != target || evt.getParent().name == "gift") return false; + return evt.cards.length; + }) + ) + renzhi = true; + }); + event.guojue = guojue; + event.renzhi = renzhi; + "step 1"; + if (event.nowProperty >= 5) { + event.finish(); + return; + } + var skills = lib.skill.dctongguan.derivation; + if (trigger.player.hasSkill(skills[event.nowProperty]) && lib.skill.dcmengjie.rules[event.nowProperty](trigger.player, event[event.nowProperty == 3 ? "guojue" : "renzhi"])) { + event.goto(2 + event.nowProperty * 2); + } else event.redo(); + event.nowProperty++; + "step 2"; + if (!game.hasPlayer(current => current != player)) event._result = { bool: false }; + else player.chooseTarget("梦解:对一名其他角色造成1点伤害", true, lib.filter.notMe).set("ai", target => get.damageEffect(target, player, player)); + "step 3"; + if (result.bool) { + player.logSkill("dcmengjie", result.targets[0]); + result.targets[0].damage(); + } + game.delayx(); + event.goto(1); + "step 4"; + if (game.hasPlayer(target => target != player && target.isDamaged())) + player + .chooseTarget("梦解:令一名角色回复1点体力", function (card, player, target) { + return target.isDamaged(); + }) + .set("ai", target => get.recoverEffect(target, player, player)); + else event._result = { bool: false }; + "step 5"; + if (result.bool) { + player.logSkill("dcmengjie", result.targets[0]); + result.targets[0].recover(); + } + game.delayx(); + event.goto(1); + "step 6"; + player.logSkill("dcmengjie"); + player.draw(2); + "step 7"; + game.delayx(); + event.goto(1); + "step 8"; + if (game.hasPlayer(target => target.countDiscardableCards(player, "hej"))) + player + .chooseTarget("梦解:弃置一名角色区域内至多两张牌", true, (card, player, target) => { + return target.countDiscardableCards(player, "hej"); + }) + .set("ai", target => get.effect(target, { name: "guohe" }, player, player)); + else event._result = { bool: false }; + "step 9"; + if (result.bool) { + player.logSkill("dcmengjie", result.targets[0]); + player.discardPlayerCard(result.targets[0], true, "hej", [1, 2]); + } + game.delayx(); + event.goto(1); + ("step 10"); + if (!game.hasPlayer(current => current != player)) event._result = { bool: false }; + else + player + .chooseTarget("梦解:令一名其他角色将手牌补至上限", true, (card, player, target) => { + return target != player; + }) + .set("ai", target => { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 6; + if (att > 2) { + return Math.min(5, target.maxHp) - target.countCards("h"); + } + return att / 3; + }); + ("step 11"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcmengjie", target); + var num = Math.min(5, target.maxHp - target.countCards("h")); + target.draw(num); + } + game.delayx(); + event.goto(1); + }, + ai: { + combo: "dctongguan", + }, + }, + //刘晔 + dcpoyuan: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["phaseZhunbeiBegin", "enterGame"], + }, + filter: function (event, player) { + if (event.name == "phase" && game.phaseNumber > 0) return false; + if (player.getEquip("pilitoushiche")) { + return game.hasPlayer(function (current) { + return current != player && current.countDiscardableCards(player, "he") > 0; + }); + } else { + return player.hasEquipableSlot(5); + } + }, + direct: true, + content: function () { + "step 0"; + if (player.getEquip("pilitoushiche")) { + event.goto(2); + player + .chooseTarget(get.prompt("dcpoyuan"), "弃置一名其他角色的至多两张牌", function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player, + cards = target.getDiscardableCards(player, "he"); + var att = get.attitude(player, target); + if (att < 0 && target.hasSkillTag("noe")) att /= 2; + var zheng = [], + fu = []; + for (var i of cards) { + var val = get.value(i, target); + if (val > 0) zheng.push(i); + else fu.push(i); + } + zheng.sort((a, b) => get.value(b, target) - get.value(a, target)); + fu.sort((a, b) => get.value(b, target) - get.value(a, target)); + zheng = zheng.slice(0, 2); + fu = fu.slice(0, 2); + var eff1 = 0, + eff2 = 0; + for (var i of zheng) eff1 += get.value(i, target); + for (var i of fu) { + if (get.position(i) == "e") eff2 += 1 - get.value(i, target); + } + return -att * Math.max(eff1, eff2); + }); + } else { + player.chooseBool(get.prompt("dcpoyuan"), "装备一张【霹雳投石车】").set("ai", function () { + return true; + }); + } + "step 1"; + if (result.bool) { + player.logSkill("dcpoyuan"); + var card = game.createCard("pilitoushiche", "diamond", 9); + player.$gain2(card); + game.delayx(); + player.equip(card); + } + event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcpoyuan", target); + player.discardPlayerCard(target, true, "he", [1, 2]); + } + }, + }, + dchuace: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return event.dchuace && event.dchuace.length > 0 && player.countCards("hs") > 0; + }, + onChooseToUse: function (event) { + if (game.online || event.dchuace) return; + var list = lib.inpile.filter(function (i) { + return get.type(i) == "trick" && lib.filter.filterCard({ name: i }, event.player, event); + }); + if (!list.length) { + event.set("dchuace", list); + return; + } + var history = _status.globalHistory; + var stop = false; + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + if (!stop) { + if (evt.isRound) stop = true; + continue; + } else { + for (var j of evt.useCard) list.remove(j.card.name); + if (evt.isRound) break; + } + } + event.set("dchuace", list); + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("画策", [event.dchuace, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player, + card = { name: button.link[2] }; + return player.getUseValue(card); + }, + backup: function (links, player) { + return { + audio: "dchuace", + viewAs: { name: links[0][2] }, + ai1: card => 7 - get.value(card), + filterCard: true, + position: "hs", + popname: true, + }; + }, + prompt: function (links, player) { + return "将一张手牌当做【" + get.translation(links[0][2]) + "】使用"; + }, + }, + ai: { + order: 6, + result: { player: 1 }, + }, + subSkill: { backup: {} }, + }, + pilitoushiche: { + trigger: { player: ["useCard", "respond"] }, + forced: true, + equipSkill: true, + filter: function (event, player) { + return get.type(event.card) == "basic"; + }, + content: function () { + if (player == _status.currentPhase) trigger.baseDamage++; + else player.draw(); + }, + mod: { + targetInRange: function (card, player) { + if (get.type(card) == "basic" && player == _status.currentPhase) return true; + }, + }, + }, + //路易 + dcyaoyi: { + audio: 2, + getZhuanhuanji: function (player, bool) { + var skills = player.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, player); + }); + if (!bool) return skills; + if (!skills.length) return "none"; + var state = lib.skill.dcyaoyi.getState(player, skills[0]); + for (var i = 1; i < skills.length; i++) { + if (lib.skill.dcyaoyi.getState(player, skills[i]) != state) return "none"; + } + return state; + }, + getState: function (player, skill) { + var info = get.info(skill), + zhuanhuan = info.zhuanhuanji; + if (zhuanhuan && zhuanhuan == "number") return player.countMark(skill) % 2 == 1; + return Boolean(player.storage[skill]); + }, + trigger: { + player: "enterGame", + global: "phaseBefore", + }, + forced: true, + filter: function (event, player) { + if (event.name == "phase" && game.phaseNumber != 0) return false; + return game.hasPlayer(function (current) { + return lib.skill.dcyaoyi.getZhuanhuanji(current).length == 0; + }); + }, + logTarget: function () { + return game.filterPlayer(function (current) { + return lib.skill.dcyaoyi.getZhuanhuanji(current).length == 0; + }); + }, + content: function () { + var targets = lib.skill.dcyaoyi.logTarget().sortBySeat(); + for (var target of targets) target.addSkills("dcshoutan"); + game.delayx(); + }, + global: "dcyaoyi_blocker", + subSkill: { + blocker: { + mod: { + targetEnabled: function (card, player, target) { + if ( + player == target || + !game.hasPlayer(function (current) { + return current.hasSkill("dcyaoyi"); + }) + ) + return; + var state1 = lib.skill.dcyaoyi.getZhuanhuanji(player, true); + if (state1 == "none") return; + if (lib.skill.dcyaoyi.getZhuanhuanji(target, true) == state1) return false; + }, + cardSavable: function (card, player, target) { + if ( + player == target || + !game.hasPlayer(function (current) { + return current.hasSkill("dcyaoyi"); + }) + ) + return; + var state1 = lib.skill.dcyaoyi.getZhuanhuanji(player, true); + if (state1 == "none") return; + if (lib.skill.dcyaoyi.getZhuanhuanji(target, true) == state1) return false; + }, + }, + }, + }, + }, + dcshoutan: { + audio: 2, + enable: "phaseUse", + position: "h", + filter: function (event, player) { + if (player.hasSkill("dcyaoyi")) return !player.hasSkill("dcshoutan_blocker", null, null, false); + return player.countCards("h") > 0 && !player.getStat("skill").dcshoutan; + }, + selectCard: function () { + if (_status.event.player.hasSkill("dcyaoyi")) return [0, 1]; + return [1, 1]; + }, + filterCard: function (card, player) { + if (player.hasSkill("dcyaoyi")) return false; + var color = get.color(card, player); + if (player.storage.dcshoutan) return color == "black"; + return color != "black"; + }, + prompt: function () { + var player = _status.event.player; + if (player.hasSkill("dcyaoyi")) return "点击“确认”来变更转换技状态"; + if (player.storage.dcshoutan) return "弃置一张黑色手牌,变更转换技状态"; + return "弃置一张非黑色手牌,变更转换技状态"; + }, + check: function (card) { + return 11 - get.value(card); + }, + content: function () { + player.changeZhuanhuanji("dcshoutan"); + player.addTempSkill("dcshoutan_blocker", { + player: ["useCard1", "useSkillBegin", "phaseUseEnd"], + }); + }, + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + if (storage) return "转换技。出牌阶段限一次,你可以弃置一张黑色手牌。"; + return "转换技。出牌阶段限一次,你可以弃置一张不为黑色的手牌。"; + }, + }, + ai: { + order: 0.1, + result: { + player: function (player) { + var base = 0; + if (ui.selected.cards.length) base = get.value(ui.selected.cards[0]); + var status = player.storage.dcshoutan; + var cards = player.getCards("hs", function (card) { + return !ui.selected.cards.includes(card); + }); + for (var card of cards) { + var val1 = player.getUseValue(card, null, true); + player.storage.dcshoutan = !status; + var val2 = 0; + try { + val2 = player.getUseValue(card, null, true); + } catch (e) { + player.storage.dcshoutan = status; + } + player.storage.dcshoutan = status; + if (val2 > val1) base -= val2 - val1; + } + if (base < 0) return 1; + return 0; + }, + }, + }, + subSkill: { blocker: { charlotte: true } }, + }, + dcfuxue: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.hp > 0 && ui.discardPile.childNodes.length > 0; + }, + content: function () { + "step 0"; + var cards = Array.from(ui.discardPile.childNodes); + var gains = cards.slice(0); + var history = game.getAllGlobalHistory("cardMove", function (evt) { + if (evt.name == "lose") return evt.position == ui.discardPile; + return evt.name == "cardsDiscard"; + }); + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + var cards2 = evt.cards.filter(function (card) { + return cards.includes(card); + }); + if (cards2.length) { + if (lib.skill.dcfuxue.isUse(evt)) { + gains.removeArray(cards2); + } + cards.removeArray(cards2); + } + if (!cards.length) break; + } + if (gains.length) { + var num = player.hp; + player.chooseButton(["复学:选择获得" + (num > 0 ? "至多" : "") + get.cnNumber(num) + "张牌", gains], [1, num]).set("ai", function (button) { + var player = _status.event.player, + card = button.link; + var getn = function (card) { + return player.countCards("h", card.name) + ui.selected.buttons.filter(button => button.link.name == card.name).length; + }; + var val = player.getUseValue(card); + if (card.name == "tao" && getn(card) >= player.getDamagedHp()) return 0; + if (card.name == "sha" && getn(card) >= player.getCardUsable("sha")) return 0; + return val; + }); + } else event.finish(); + "step 1"; + if (result.bool) { + player.logSkill("dcfuxue"); + player.gain(result.links, "gain2").gaintag.add("dcfuxue"); + } + }, + isUse: function (event) { + if (event.name != "cardsDiscard") return false; + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + return evt2.name == "phaseJudge" || evt2.name == "useCard"; + }, + group: "dcfuxue_draw", + subSkill: { + draw: { + audio: "dcfuxue", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcfuxue")) return num + 0.5; + }, + }, + filter: function (event, player) { + return ( + player.hp > 0 && + !player.hasCard(function (card) { + return card.hasGaintag("dcfuxue"); + }, "h") + ); + }, + content: function () { + player.draw(player.hp); + }, + }, + }, + }, + //丁尚涴 + dcfengyan: { + enable: "phaseUse", + usable: 2, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("讽言:请选择一项", "hidden"); + dialog.add([ + [ + ["gain", "令一名体力值不大于你的其他角色交给你一张手牌"], + ["sha", "视为对一名手牌数不大于你的其他角色使用一张【杀】"], + ], + "textbutton", + ]); + return dialog; + }, + filter: function (button, player) { + return !player.hasSkill("dcfengyan_" + button.link, null, null, false); + }, + check: function (button) { + var player = _status.event.player; + if ( + button.link == "gain" && + game.hasPlayer(function (current) { + return lib.skill.dcfengyan_gain.filterTarget(null, player, current) && get.effect(current, "dcfengyan_gain", player, player) > 0; + }) + ) + return 4; + if ( + button.link == "sha" && + game.hasPlayer(function (current) { + return lib.skill.dcfengyan_sha.filterTarget(null, player, current) && get.effect(current, "dcfengyan_sha", player, player) > 0; + }) + ) + return 4; + return 2; + }, + backup: function (links) { + return get.copy(lib.skill["dcfengyan_" + links[0]]); + }, + prompt: function (links) { + if (links[0] == "gain") return "令一名体力值不大于你的其他角色交给你一张手牌"; + return "视为对一名手牌数不大于你的其他角色使用【杀】"; + }, + }, + ai: { + order: 10, + threaten: 1.7, + result: { player: 1 }, + }, + subSkill: { + backup: { audio: "dcfengyan" }, + gain: { + audio: "dcfengyan", + filterTarget: function (card, player, target) { + return target != player && target.hp <= player.hp && target.countCards("h") > 0; + }, + filterCard: () => false, + selectCard: -1, + content: function () { + "step 0"; + player.addTempSkill("dcfengyan_gain", "phaseUseAfter"); + target.chooseCard("h", true, "交给" + get.translation(player) + "一张牌"); + "step 1"; + if (result.bool) target.give(result.cards, player); + }, + ai: { + tag: { + loseCard: 1, + gain: 1, + }, + result: { + player: 0.1, + target: -1, + }, + }, + }, + sha: { + audio: "dcfengyan", + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") <= player.countCards("h") && player.canUse("sha", target, false); + }, + filterCard: () => false, + selectCard: -1, + content: function () { + player.addTempSkill("dcfengyan_sha", "phaseUseAfter"); + player.useCard( + { + name: "sha", + isCard: true, + }, + target, + false + ); + }, + ai: { + result: { + player: function (player, target) { + return get.effect( + target, + { + name: "sha", + isCard: true, + }, + player, + player + ); + }, + }, + }, + }, + }, + }, + dcfudao: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && game.hasPlayer(current => current != player); + }, + content: function () { + "step 0"; + player.chooseTarget(true, lib.filter.notMe, "抚悼:请选择一名“继子”", "你或“继子”每回合首次使用牌指定对方为目标后各摸两张牌;杀死你或“继子”的角色称为“决裂”。你或“继子”对“决裂”造成的伤害+1。“决裂”对你使用牌后,其本回合内不能再使用牌。").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcfudao", target); + game.log(target, "成为了", player, "的继子"); + player.addSkill("dcfudao_effect"); + target.addSkill("dcfudao_effect"); + player.markAuto("dcfudao_effect", [target]); + target.markAuto("dcfudao_effect", [player]); + } + }, + group: "dcfudao_refuse", + subSkill: { + effect: { + trigger: { player: "useCardToPlayered" }, + forced: true, + charlotte: true, + usable: 1, + filter: function (event, player) { + var target = event.target; + if (player == target || !target.isIn()) return false; + return player.getStorage("dcfudao_effect").includes(target); + }, + logTarget: "target", + content: function () { + "step 0"; + var list = [player, trigger.target]; + list.sortBySeat(); + game.asyncDraw(list, 2); + "step 1"; + game.delayx(); + }, + marktext: "继", + intro: { content: "已和$成为继母子关系" }, + group: ["dcfudao_revenge", "dcfudao_deadmark"], + }, + deadmark: { + trigger: { player: "dieBegin" }, + forced: true, + popup: false, + lastDo: true, + silent: true, + filter: function (event, player) { + return get.itemtype(event.source) == "player"; + }, + content: function () { + trigger.source.markAuto("dcfudao_deadmark", [player]); + }, + marktext: "裂", + intro: { + name: "决裂", + content: "你害死了$!", + }, + }, + revenge: { + trigger: { source: "damageBegin1" }, + forced: true, + filter: function (event, player) { + var storage1 = event.player.getStorage("dcfudao_deadmark"), + storage2 = player.getStorage("dcfudao_effect"); + for (var i of storage1) { + if (storage2.includes(i)) return true; + } + return false; + }, + content: function () { + trigger.num++; + }, + logTarget: "player", + }, + refuse: { + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + var storage1 = event.player.getStorage("dcfudao_deadmark"), + storage2 = player.getStorage("dcfudao_effect"); + for (var i of storage1) { + if (storage2.includes(i)) return true; + } + return false; + }, + content: function () { + trigger.player.addTempSkill("dcfudao_blocker"); + }, + logTarget: "player", + }, + blocker: { + charlotte: true, + mod: { + cardEnabled: () => false, + cardSavable: () => false, + }, + }, + }, + }, + //全惠解 + dchuishu: { + audio: 2, + getList: function (player) { + if (!player.storage.dchuishu) return [3, 1, 2]; + return player.storage.dchuishu.slice(0); + }, + trigger: { player: "phaseDrawEnd" }, + content: function () { + "step 0"; + var list = lib.skill.dchuishu.getList(player); + event.list = list; + player.draw(list[0]); + "step 1"; + player.addTempSkill("dchuishu_effect"); + player.chooseToDiscard("h", true, event.list[1]); + }, + onremove: true, + mark: true, + intro: { + markcount: function (storage, player) { + var list = lib.skill.dchuishu.getList(player); + return Math.max.apply(Math, list); + }, + content: function (storage, player) { + var list = lib.skill.dchuishu.getList(player); + return "摸牌阶段结束时,你可以摸[" + list[0] + "]张牌。若如此做:你弃置[" + list[1] + "]张手牌,且当你于本回合内弃置第[" + list[2] + "]+1张牌后,你从弃牌堆中获得[" + list[2] + "]张非基本牌。"; + }, + }, + subSkill: { + effect: { + charlotte: true, + audio: "dchuishu", + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + var num = lib.skill.dchuishu.getList(player)[2]; + if (typeof num != "number") return false; + if (event.type != "discard" || event.getlx === false) return false; + var evt = event.getl(player); + if (evt.cards2.length == 0) return false; + var prev = 0, + goon = true; + player.getHistory("lose", function (evt) { + if (!goon || evt.type != "discard") return false; + prev += evt.cards2.length; + if (evt == event || event.getParent() == event) { + goon = false; + return false; + } + }); + return prev > num; + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + var num = lib.skill.dchuishu.getList(player)[2]; + var cards = []; + for (var i = 0; i < num; i++) { + var card = get.discardPile(function (card) { + return get.type(card) != "basic" && !cards.includes(card); + }); + if (card) cards.push(card); + else break; + } + if (cards.length) player.gain(cards, "gain2"); + }, + }, + }, + }, + dcyishu: { + audio: 2, + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.cards2.length) return false; + return !player.isPhaseUsing() && player.hasSkill("dchuishu", null, null, false); + }, + content: function () { + "step 0"; + var list = lib.skill.dchuishu.getList(player); + var min = list[0], + max = list[0]; + for (var i of list) { + if (i < min) min = i; + if (i > max) max = i; + } + var exps = ["摸牌数[", "弃牌数[", "目标牌数["]; + var choices_min = [], + choices_max = []; + for (var i = 0; i < list.length; i++) { + if (list[i] == min) choices_min.push(exps[i] + min + "]"); + if (list[i] == max) choices_max.push(exps[i] + max + "]"); + } + if (choices_min.length == 1 && choices_max.length == 1) { + event._result = { bool: true, min: choices_min[0], max: choices_max[0] }; + } else { + if (player.isUnderControl()) game.swapPlayerAuto(player); + var switchToAuto = function () { + _status.imchoosing = false; + event._result = { + bool: true, + min: choices_min[0], + max: choices_max[0], + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + }; + var chooseButton = function (player, min, max) { + var event = _status.event; + player = player || event.player; + var list = lib.skill.dchuishu.getList(player); + if (!event._result) event._result = {}; + var dialog = ui.create.dialog("###易数:请选择更改的数值###令〖慧淑〗的一个最小数值+2并令一个最大数值-1", "forcebutton", "hidden"); + event.dialog = dialog; + dialog.addText("最小值+2"); + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + for (var i = 0; i < min.length; i++) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.link = min[i]; + table.appendChild(td); + td.innerHTML = "" + min[i] + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) current.classList.remove("bluebg"); + this.classList.add("bluebg"); + event._result.min = link; + }); + } + dialog.content.appendChild(table); + dialog.addText("最大值-1"); + var table2 = document.createElement("div"); + table2.classList.add("add-setting"); + table2.style.margin = "0"; + table2.style.width = "100%"; + table2.style.position = "relative"; + for (var i = 0; i < max.length; i++) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.link = max[i]; + table2.appendChild(td); + td.innerHTML = "" + max[i] + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) current.classList.remove("bluebg"); + this.classList.add("bluebg"); + event._result.max = link; + }); + } + dialog.content.appendChild(table2); + dialog.add("  "); + event.dialog.open(); + event.switchToAuto = function () { + event._result = { + bool: true, + min: min[0], + max: max[0], + }; + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }; + event.control = ui.create.control("ok", function (link) { + var result = event._result; + if (!result.min || !result.max) return; + result.bool = true; + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }); + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("selectable"); + } + game.pause(); + game.countChoose(); + }; + if (event.isMine()) chooseButton(player, choices_min, choices_max); + else if (event.isOnline()) { + event.player.send(chooseButton, event.player, choices_min, choices_max); + event.player.wait(); + game.pause(); + } else switchToAuto(); + } + "step 1"; + var map = event.result || result; + if (map.bool) { + var min = map.min, + max = map.max; + min = min.slice(0, min.indexOf("[")); + max = max.slice(0, max.indexOf("[")); + var exps = ["摸牌数", "弃牌数", "目标牌数"]; + var list = lib.skill.dchuishu.getList(player); + list[exps.indexOf(min)] += 2; + list[exps.indexOf(max)]--; + game.log(player, "令", "#g【慧淑】", "中的", "#y" + min, "+2"); + game.log(player, "令", "#g【慧淑】", "中的", "#y" + max, "-1"); + player.storage.dchuishu = list; + } else event.finish(); + "step 2"; + player.markSkill("dchuishu"); + game.delayx(); + }, + ai: { combo: "dchuishu" }, + }, + dcligong: { + audio: 2, + juexingji: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + if (!player.hasSkill("dchuishu")) return false; + var list = lib.skill.dchuishu.getList(player); + for (var i of list) { + if (i >= 5) return true; + } + return false; + }, + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player.awakenSkill("dcligong"); + player.gainMaxHp(); + player.recover(); + "step 1"; + player.removeSkills("dcyishu"); + "step 2"; + var list; + if (_status.characterlist) { + list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + if (lib.character[name][1] == "wu" && (lib.character[name][0] == "female" || lib.character[name][0] == "double")) list.push(name); + } + } else if (_status.connectMode) { + list = get.charactersOL(function (i) { + return lib.character[i][1] != "wu" || (lib.character[i][0] != "female" && lib.character[i][0] != "double"); + }); + } else { + list = get.gainableCharacters(function (info) { + return info[1] == "wu" && (info[0] == "female" || info[0] == "double"); + }); + } + var players = game.players.concat(game.dead); + for (var i = 0; i < players.length; i++) { + list.remove(players[i].name); + list.remove(players[i].name1); + list.remove(players[i].name2); + } + list = list.randomGets(4); + var skills = []; + for (var i of list) { + skills.addArray( + (lib.character[i][3] || []).filter(function (skill) { + var info = get.info(skill); + return info && !info.charlotte; + }) + ); + } + if (!list.length || !skills.length) { + event.result = { + bool: false, + skills: [], + }; + return; + } + if (player.isUnderControl()) { + game.swapPlayerAuto(player); + } + var switchToAuto = function () { + _status.imchoosing = false; + event._result = { + bool: true, + skills: skills.randomGets(2), + }; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + }; + var chooseButton = function (list, skills) { + var event = _status.event; + if (!event._result) event._result = {}; + event._result.skills = []; + var rSkill = event._result.skills; + var dialog = ui.create.dialog("请选择获得至多两个技能", [list, "character"], "hidden"); + event.dialog = dialog; + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + for (var i = 0; i < skills.length; i++) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.link = skills[i]; + table.appendChild(td); + td.innerHTML = "" + get.translation(skills[i]) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + if (!this.classList.contains("bluebg")) { + if (rSkill.length >= 2) return; + rSkill.add(link); + this.classList.add("bluebg"); + } else { + this.classList.remove("bluebg"); + rSkill.remove(link); + } + }); + } + dialog.content.appendChild(table); + dialog.add("  "); + dialog.open(); + + event.switchToAuto = function () { + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }; + event.control = ui.create.control("ok", function (link) { + event.dialog.close(); + event.control.close(); + game.resume(); + _status.imchoosing = false; + }); + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("selectable"); + } + game.pause(); + game.countChoose(); + }; + if (event.isMine()) { + chooseButton(list, skills); + } else if (event.isOnline()) { + event.player.send(chooseButton, list, skills); + event.player.wait(); + game.pause(); + } else { + switchToAuto(); + } + "step 3"; + var map = event.result || result; + if (map.skills && map.skills.length) { + //player.removeSkill('dchuishu'); + //for(var i of map.skills) player.addSkillLog(i); + player.changeSkills(map.skills, ["dchuishu"]); + player.markAuto("zhuSkill_dcligong", map.skills); + } else { + player.draw(3); + } + }, + ai: { + combo: "dchuishu", + }, + }, + //杜夔 + dcfanyin: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ui.cardPile.childNodes.length > 0; + }, + frequent: true, + locked: false, + content: function () { + "step 0"; + var card = false; + if (typeof event.num != "number") { + var num = false; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var cardx = ui.cardPile.childNodes[i], + numc = get.number(cardx, false); + if (!num || numc < num) { + num = numc; + card = cardx; + if (num == 1) break; + } + } + event.num = num; + } else { + card = get.cardPile2(function (card) { + return get.number(card, false) == event.num; + }); + } + if (!card) event.finish(); + else { + event.card = card; + game.cardsGotoOrdering(card); + player.showCards(card, get.translation(player) + "发动了【泛音】"); + } + "step 1"; + if (!player.hasUseTarget(card, false)) event._result = { index: 1 }; + else { + player + .chooseControl() + .set("choiceList", ["使用" + get.translation(card) + "(无距离限制)", "令本回合使用的下一张牌可以多选择一个目标"]) + .set("ai", function () { + var player = _status.event.player, + card = _status.event.getParent().card; + if (player.hasValueTarget(card, false)) return 0; + return 1; + }); + } + "step 2"; + if (result.index == 0) { + var cardx = get.autoViewAs(card); + cardx.storage.dcfanyin = true; + player.chooseUseTarget(cardx, [card], true, false); + } else { + player.addTempSkill("dcfanyin_effect"); + player.addMark("dcfanyin_effect", 1, false); + } + event.num *= 2; + if (event.num <= 13) event.goto(0); + }, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dcfanyin) return true; + }, + }, + subSkill: { + effect: { + audio: "dcfanyin", + trigger: { player: "useCard2" }, + forced: true, + charlotte: true, + popup: false, + onremove: true, + filter: function (event, player) { + var type = get.type(event.card, null, false); + return type == "basic" || type == "trick"; + }, + content: function () { + "step 0"; + var num = player.countMark("dcfanyin_effect"); + player.removeSkill("dcfanyin_effect"); + var filter = function (event, player) { + var card = event.card, + info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && lib.filter.targetInRange(card, player, current); + }) + ) { + return true; + } + } + return false; + }; + if (!filter(trigger, player)) event.finish(); + else { + var prompt = "为" + get.translation(trigger.card) + "增加至多" + get.cnNumber(num) + "个目标?"; + trigger.player + .chooseTarget(get.prompt("dcfanyin_effect"), prompt, [1, num], function (card, player, target) { + var player = _status.event.player; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + } + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + "step 2"; + player.logSkill("dcfanyin_effect", result.targets); + game.log(result.targets, "也成为了", trigger.card, "的目标"); + trigger.targets.addArray(result.targets); + }, + intro: { content: "使用下一张牌选择目标后,可以增加#个目标" }, + }, + }, + }, + dcpeiqi: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return player.canMoveCard(); + }, + check: function (event, player) { + return player.canMoveCard(true); + }, + content: function () { + "step 0"; + player.moveCard(true); + "step 1"; + if (result.bool && player.canMoveCard()) { + var goon = true, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + for (var j = i + 1; j < players.length; j++) { + if (!players[i].inRange(players[j]) || !players[i].inRangeOf(players[j])) { + goon = false; + break; + } + } + if (!goon) break; + } + if (goon) player.moveCard(); + } + }, + }, + //张奋和大风车 + dcwanglu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + if (!player.hasEquipableSlot(5) || player.getEquip("dagongche")) { + var next = player.phaseUse(); + event.next.remove(next); + trigger.getParent().next.push(next); + } else { + var card = game.createCard("dagongche", "spade", 9); + player.$gain2(card); + game.delayx(); + player.equip(card); + } + }, + broadcast: function (player) { + var card = player.getEquip("dagongche"); + if (card) + game.broadcast( + function (card, storage) { + card.storage = storage; + }, + card, + card.storage + ); + }, + }, + dcxianzhu: { + audio: 2, + trigger: { source: "damageSource" }, + direct: true, + filter: function (event, player) { + if (!event.card || event.card.name != "sha") return false; + var card = player.getEquip("dagongche"); + if (!card) return false; + var num = 0; + for (var i = 1; i <= 3; i++) { + var key = "大攻车选项" + get.cnNumber(i, true); + if (card.storage[key]) num += card.storage[key]; + } + return num < 5; + }, + content: function () { + "step 0"; + var choiceList = ["令【杀】无距离限制且无视防具", "令【杀】的可选目标数+1", "令后续的弃牌数量+1"]; + var list = []; + var card = player.getEquip("dagongche"); + for (var i = 1; i <= 3; i++) { + var key = "大攻车选项" + get.cnNumber(i, true); + var num = card.storage[key]; + if (i == 1) { + if (!num) list.push("选项一"); + else choiceList[0] = '' + choiceList[0] + "(已强化)"; + } else { + list.push("选项" + get.cnNumber(i, true)); + if (num) choiceList[i - 1] += "(已强化" + num + "次)"; + } + } + player + .chooseControl(list, "cancel2") + .set("prompt", "是否发动【陷筑】强化【大攻车】?") + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + controls = _status.event.controls.slice(0); + var getval = function (choice) { + var card = player.getEquip("dagongche"); + if (choice == "选项一") { + card.storage.大攻车选项一 = 1; + var goon = false; + if ( + game.hasPlayer(function (current) { + var eff1 = 0, + eff2 = 0; + var cardx = { name: "sha", isCard: true }; + if (player.canUse(cardx, current)) eff1 = get.effect(current, cardx, player, player); + cardx.storage = { dagongche: true }; + if (player.canUse(cardx, current)) eff2 = get.effect(current, cardx, player, player); + return eff2 > eff1; + }) + ) + goon = true; + delete card.storage.大攻车选项一; + if (goon) return 5; + return 0; + } else if (choice == "选项二") { + var num = 1; + if (card.storage.大攻车选项二) num += card.storage.大攻车选项二; + var cardx = { name: "sha", isCard: true }; + if ( + game.countPlayer(function (current) { + return player.canUse(cardx, current) && get.effect(current, cardx, player, player) > 0; + }) > num + ) + return 2; + } else if (choice == "选项三") return 1; + return 0; + }; + var eff = 0, + current = "cancel2"; + for (var i of controls) { + var effx = getval(i); + if (effx > eff) { + eff = effx; + current = i; + } + } + return current; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("dcxianzhu"); + var card = player.getEquip("dagongche"), + key = "大攻车" + result.control; + if (!card.storage[key]) card.storage[key] = 0; + card.storage[key]++; + lib.skill.dcwanglu.broadcast(player); + } + }, + ai: { + combo: "dcwanglu", + }, + }, + dcchaixie: { + audio: 2, + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.es || !evt.es.length) return false; + for (var card of evt.es) { + if (card.name == "dagongche") { + for (var i = 1; i <= 3; i++) { + if (card.storage["大攻车选项" + get.cnNumber(i, true)]) return true; + } + } + } + return false; + }, + content: function () { + var num = 0; + var evt = trigger.getl(player); + for (var card of evt.es) { + if (card.name == "dagongche") { + for (var i = 1; i <= 3; i++) { + var key = "大攻车选项" + get.cnNumber(i, true); + if (card.storage[key]) num += card.storage[key]; + } + } + } + player.draw(num); + }, + ai: { + combo: "dcwanglu", + }, + }, + dagongche_skill: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + var cardx = { + name: "sha", + isCard: true, + storage: { dagongche: true }, + }; + return player.hasUseTarget(cardx); + }, + equipSkill: true, + content: function () { + var card = { + name: "sha", + isCard: true, + storage: { dagongche: true }, + }; + lib.skill.dcwanglu.broadcast(player); + player.chooseUseTarget(card, "大攻车:是否视为使用【杀】?", false).logSkill = "dagongche_skill"; + }, + mod: { + targetInRange: function (card, player, target) { + if (card.storage && card.storage.dagongche) { + var cardx = player.getEquip("dagongche"); + if (cardx && cardx.storage.大攻车选项一) return true; + } + }, + selectTarget: function (card, player, range) { + if (card.storage && card.storage.dagongche && range[1] != -1) { + var cardx = player.getEquip("dagongche"); + if (cardx && cardx.storage.大攻车选项二) range[1] += cardx.storage.大攻车选项二; + } + }, + canBeDiscarded: function (card) { + if (card.name == "dagongche" && get.position(card) == "e") { + for (var i = 1; i <= 3; i++) { + if (card.storage["大攻车选项" + get.cnNumber(i, true)]) return; + } + return false; + } + }, + }, + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.card || !arg.card.storage || !arg.card.storage.dagongche) return false; + var card = player.getEquip("dagongche"); + if (!card || !card.storage.大攻车选项一) return false; + }, + }, + group: "dagongche_skill_discard", + subSkill: { + discard: { + trigger: { source: "damageSource" }, + equipSkill: true, + forced: true, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.dagongche) return false; + if (event.getParent().type != "card") return false; + return event.player.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, event.player, player); + }, "he"); + }, + logTarget: "player", + content: function () { + var num = 1; + var cardx = player.getEquip("dagongche"); + if (cardx && cardx.storage.大攻车选项三) num += cardx.storage.大攻车选项三; + player.discardPlayerCard(trigger.player, true, num, "he"); + }, + }, + }, + }, + //刘徽 + dcgeyuan: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], + }, + forced: true, + filter: function (event, player) { + var cards = event.getd(); + for (var i of cards) { + if (lib.skill.dcgeyuan.filterNumber(player, get.number(i, false))) return true; + } + return false; + }, + content: function () { + "step 0"; + event.cards = trigger.getd(); + "step 1"; + var card = false; + for (var i of cards) { + if (lib.skill.dcgeyuan.filterNumber(player, get.number(i, false))) { + card = i; + cards.remove(card); + break; + } + } + if (card) { + var number = get.number(card, false); + game.log(player, "将", "#y" + get.strNumber(number), "记录为", "#g“圆环之弧”"); + player.markAuto("dcgeyuan_homura", [number]); + player.markSkill("dcgeyuan"); + if (player.getStorage("dcgeyuan").length > player.getStorage("dcgeyuan_homura").length) { + if (cards.length > 0) event.redo(); + else event.finish(); + } else if (player.storage.dcgusuan) event.goto(5); + } else event.finish(); + "step 2"; + var list = player.getStorage("dcgeyuan_homura"); + var num1 = list[0], + num2 = list[list.length - 1]; + event.cards2 = []; + var lose_list = [], + players = game.filterPlayer(); + for (var current of players) { + var cards = current.getCards("ej", function (card) { + var num = get.number(card); + return num == num1 || num == num2; + }); + if (cards.length > 0) { + current.$throw(cards); + lose_list.push([current, cards]); + event.cards2.addArray(cards); + } + } + if (lose_list.length) { + event.lose_list = lose_list; + game.loseAsync({ + lose_list: lose_list, + }).setContent("chooseToCompareLose"); + } + "step 3"; + var list = player.getStorage("dcgeyuan_homura"); + var num1 = list[0], + num2 = list[list.length - 1]; + var cards = event.cards2; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + var number = get.number(card, false); + if (number == num1 || number == num2) cards.push(card); + } + if (cards.length > 0) { + if (event.lose_list) game.delayx(); + player.gain(cards, "gain2"); + } + "step 4"; + var list = player.getStorage("dcgeyuan_homura"); + var num1 = list[0], + num2 = list[list.length - 1]; + player.storage.dcgeyuan_homura = []; + game.log(player, "清空了", "#g“圆环之弧”"); + player.markSkill("dcgeyuan"); + if (player.getStorage("dcgeyuan").length > 3) { + player.unmarkAuto("dcgeyuan", [num1, num2]); + game.log(player, "从", "#g“圆环之理”", "中移除了", "#y" + get.strNumber(num1), "和", "#y" + get.strNumber(num2)); + } + event.finish(); + "step 5"; + player.chooseTarget("割圆:选择至多三名角色", "第一名角色摸三张牌,第二名角色弃置四张牌,第三名角色将所有手牌与牌堆底的牌交换", true, [1, 3]); + "step 6"; + if (result.bool) { + var targets = result.targets; + event.targets = targets; + player.line(targets); + targets[0].draw(3); + if (targets.length < 2) event.goto(4); + } else event.goto(4); + "step 7"; + if (targets[1].countCards("he") > 0) targets[1].chooseToDiscard("he", true, 4); + if (targets.length < 3) event.goto(4); + "step 8"; + var target = targets[2]; + var cards = get.bottomCards(5); + game.cardsGotoOrdering(cards); + var hs = target.getCards("h"); + if (hs.length > 0) target.lose(hs, ui.cardPile); + target.gain(cards, "draw"); + event.goto(4); + }, + group: "dcgeyuan_kyubey", + filterNumber: function (player, num) { + var list1 = player.getStorage("dcgeyuan"); + var list2 = player.getStorage("dcgeyuan_homura"); + if (!list1.includes(num)) return false; + if (!list2.length) return true; + if (list2.includes(num)) return false; + var madoka = list1.indexOf(num); + for (var i of list2) { + var homura = list1.indexOf(i); + var dist = Math.abs(madoka - homura); + if (dist == 1 || dist == list1.length - 1) return true; + } + return false; + }, + subSkill: { + kyubey: { + audio: "dcgeyuan", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && !player.storage.dcgusuan; + }, + content: function () { + var list = []; + for (var i = 1; i <= 13; i++) { + list.push(i); + } + list.randomSort(); + player.storage.dcgeyuan = list; + player.markSkill("dcgeyuan"); + var str = "#y"; + for (var i = 0; i < 13; i++) { + str += get.strNumber(list[i]); + if (i != 12) str += ","; + } + game.log(player, "将", "#y“圆环之理”", "赋值为", str); + }, + }, + }, + intro: { + name: "圆环之理", + markcount: function (storage, player) { + if (!player.storage.dcgeyuan || !player.getStorage("dcgeyuan_homura").length) return 0; + var list = player.storage.dcgeyuan.filter(i => lib.skill.dcgeyuan.filterNumber(player, i)); + if (!list.length) return 0; + list = list.map(num => { + var list = [1, 10, 11, 12, 13]; + if (list.includes(num)) return ["A", "X", "J", "Q", "K"][list.indexOf(num)]; + return parseFloat(num); + }); + return list.reduce((str, num) => { + return str + num; + }, ""); + }, + mark: function (dialog, storage, player) { + dialog.content.style["overflow-x"] = "visible"; + var list = storage; + if (!storage || !storage.length) return "(圆环之理尚不存在)"; + var list2 = player.getStorage("dcgeyuan_homura"); + var core = document.createElement("div"); + core.style.width = "0"; + var centerX = -15, + centerY = 80, + radius = 80; + var radian = (Math.PI * 2) / list.length; + var fulllist = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]; + for (var i = 0; i < list.length; i++) { + var td = document.createElement("div"); + var color = ""; + if (list2[0] == list[i]) color = ' class="yellowtext"'; + else if (list2.includes(list[i])) color = ' class="greentext"'; + td.innerHTML = "[" + fulllist[list[i] - 1] + "]"; + td.style.position = "absolute"; + core.appendChild(td); + td.style.left = centerX + radius * Math.sin(radian * i) + "px"; + td.style.top = centerY - radius * Math.cos(radian * i) + "px"; + } + dialog.content.appendChild(core); + }, + }, + }, + dcjieshu: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + var num = get.number(event.card, false); + if (typeof num != "number") return false; + return lib.skill.dcgeyuan.filterNumber(player, num); + }, + content: function () { + player.draw(); + }, + mod: { + ignoredHandcard: function (card, player) { + if (!player.getStorage("dcgeyuan").includes(get.number(card))) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && !player.getStorage("dcgeyuan").includes(get.number(card))) return false; + }, + }, + ai: { + combo: "dcgeyuan", + }, + }, + dcgusuan: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "soil", + filter: function (event, player) { + return player.getStorage("dcgeyuan").length == 3; + }, + content: function () { + player.awakenSkill("dcgusuan"); + player.storage.dcgusuan = true; + player.loseMaxHp(); + }, + ai: { combo: "dcgeyuan" }, + derivation: "dcgeyuan_magica", + }, + //王昶 + dckaiji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.maxHp <= 0) return false; + if (!player.storage.dckaiji) return true; + return player.hasCard(card => lib.filter.cardDiscardable(card, player, "phaseUse"), "he"); + }, + filterCard: function (card, player) { + if (!player.storage.dckaiji) return false; + return true; + }, + position: "he", + selectCard: function () { + var player = _status.event.player; + return player.storage.dckaiji ? [1, player.maxHp] : -1; + }, + check: function (card) { + var player = _status.event.player; + if (!player.hasSkill("dcpingxi")) { + if (ui.selected.cards.length) return 0; + if (player.needsToDiscard()) return 12 - get.value(card); + return 2 * player.hp + 1.5 - get.value(card); + } + var num = lib.skill.dcpingxi.getNum() + ui.selected.cards.length; + if ( + num < + game.countPlayer(function (current) { + if (current == player || current.countCards("he") == 0) return false; + return get.effect(current, { name: "guohe_copy2" }, player, player) + get.effect(current, { name: "sha" }, player, player) > 0; + }) + ) { + if ( + get.position(card) == "h" && + player.needsToDiscard(0, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) + return 7 + 1 / Math.max(1, get.value(card)); + return 7 - get.value(card); + } + return 0; + }, + content: function () { + player.changeZhuanhuanji("dckaiji"); + if (!cards.length) player.draw(Math.min(player.maxHp, 5)); + }, + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content: storage => "转换技。出牌阶段限一次,你可以" + (storage ? "弃置至多X张牌" : "摸X张牌") + "(X为你的体力上限且至多为5)。", + }, + ai: { + threaten: 1.6, + order: function (item, player) { + if (player.storage.dckaiji) return 0.1; + return 8; + }, + result: { player: 1 }, + }, + }, + dcpingxi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + getNum: function () { + var num = 0; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name == "lose" && evt.type == "discard") num += evt.cards2.length; + }); + return num; + }, + filter: function (event, player) { + return ( + lib.skill.dcpingxi.getNum() > 0 && + game.hasPlayer(function (current) { + return current != player; + }) + ); + }, + content: function () { + "step 0"; + var num = lib.skill.dcpingxi.getNum(); + player + .chooseTarget( + [1, num], + function (card, player, target) { + return target != player; + }, + get.prompt("dcpingxi"), + "选择至多" + get.cnNumber(num) + "名其他角色。弃置这些角色的各一张牌,然后视为对这些角色使用一张【杀】" + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player) + get.effect(target, { name: "sha" }, player, player); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + event.targets = targets; + player.logSkill("dcpingxi", targets); + event.num = 0; + } else event.finish(); + "step 2"; + var target = targets[num]; + if ( + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ) + player.discardPlayerCard(target, "he", true); + event.num++; + if (event.num < targets.length) event.redo(); + "step 3"; + var targetsx = targets.filter(function (target) { + return player.canUse("sha", target, false); + }); + if (targetsx.length > 0) + player.useCard( + { + name: "sha", + isCard: true, + }, + targetsx + ); + }, + }, + //赵昂 + dczhongjie: { + audio: 2, + round: 1, + trigger: { global: "dying" }, + logTarget: "player", + filter: function (event, player) { + return event.player.hp < 1 && event.reason && event.reason.name == "loseHp"; + }, + check: function (event, player) { + return get.attitude(player, event.player) > 2; + }, + content: function () { + trigger.player.recover(); + trigger.player.draw(); + }, + }, + dcsushou: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return player.hp > 0 && event.player.isMaxHandcard(true); + }, + logTarget: "player", + check: function (event, player) { + var num = player.hp; + if (player.hasSkill("dczhongjie") && (player.storage.dczhongjie_roundcount || 0) < game.roundNumber) num++; + return num > 1; + }, + content: function () { + "step 0"; + player.loseHp(); + event.target = trigger.player; + "step 1"; + var num = player.getDamagedHp(); + if (num > 0) player.draw(num); + if (player == target) event.finish(); + "step 2"; + var ts = target.getCards("h"); + if (ts.length < 2) event.finish(); + else { + var hs = player.getCards("h"); + ts = ts.randomGets(Math.floor(ts.length / 2)); + if (!hs.length) { + player.viewCards(get.translation(target) + "的部分手牌"); + event.finish(); + return; + } + var next = player.chooseToMove("夙守:交换至多" + get.cnNumber(Math.min(hs.length, ts.length, player.getDamagedHp())) + "张牌"); + next.set("list", [ + [get.translation(target) + "的部分手牌", ts, "dcsushou_tag"], + ["你的手牌", hs], + ]); + next.set("filterMove", function (from, to, moved) { + if (typeof to == "number") return false; + var player = _status.event.player; + var hs = player.getCards("h"); + var changed = hs.filter(function (card) { + return !moved[1].includes(card); + }); + var changed2 = moved[1].filter(function (card) { + return !hs.includes(card); + }); + if (changed.length < player.getDamagedHp()) return true; + var pos1 = moved[0].includes(from.link) ? 0 : 1, + pos2 = moved[0].includes(to.link) ? 0 : 1; + if (pos1 == pos2) return true; + if (pos1 == 0) { + if (changed.includes(from.link)) return true; + return changed2.includes(to.link); + } + if (changed2.includes(from.link)) return true; + return changed.includes(to.link); + }); + next.set("max", Math.min(hs.length, ts.length, player.getDamagedHp())); + next.set("processAI", function (list) { + if (_status.event.max) { + let gain = list[0][1] + .sort((a, b) => { + return player.getUseValue(b, null, true) - player.getUseValue(a, null, true); + }) + .slice(0, _status.event.max), + give = list[1][1] + .sort((a, b) => { + return get.value(a, player) - get.value(b, player); + }) + .slice(0, _status.event.max); + for (let i of gain) { + if (get.value(i, player) < get.value(give[0], player)) continue; + let j = give.shift(); + list[0][1].remove(i); + list[0][1].push(j); + list[1][1].remove(j); + list[1][1].push(i); + if (!give.length) break; + } + } + return [list[0][1], list[1][1]]; + }); + } + "step 3"; + var moved = result.moved; + var hs = player.getCards("h"), + ts = target.getCards("h"); + var cards1 = [], + cards2 = []; + for (var i of result.moved[0]) { + if (!ts.includes(i)) cards1.push(i); + } + for (var i of result.moved[1]) { + if (!hs.includes(i)) cards2.push(i); + } + if (cards1.length) { + player.swapHandcards(target, cards1, cards2); + } + }, + }, + //蓝曹华 + caiyi: { + audio: 2, + zhuanhuanji: true, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + onremove: function (player) { + delete player.storage.caiyi; + delete player.storage.caiyi_info; + }, + filter: function (event, player) { + if (player.storage.caiyi_info) { + if (player.storage.caiyi_info[player.storage.caiyi ? 1 : 0].length >= 4) return false; + } + return true; + }, + choices: [ + ["回复X点体力", "摸X张牌", "复原武将牌", "随机执行一个已经移除过的选项"], + ["受到X点伤害", "弃置X张牌", "翻面并横置", "随机执行一个已经移除过的选项"], + ], + filterx: [ + [player => player.isDamaged(), () => true, player => player.isTurnedOver() || player.isLinked(), () => true], + [ + () => true, + player => + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "caiyi"); + }, "he"), + player => !player.isTurnedOver() || !player.isLinked(), + () => true, + ], + ], + content: function () { + "step 0"; + if (!player.storage.caiyi_info) player.storage.caiyi_info = [[], []]; + var index = player.storage.caiyi ? 1 : 0; + event.index = index; + var list = player.storage.caiyi_info[index], + choices = lib.skill.caiyi.choices[index], + numbers = ["⒈", ";⒉", ";⒊", ";⒋"]; + event.num = 4 - list.length; + var str = "令一名角色选择执行其中一项:"; + for (var i = 0; i < 4; i++) { + if (list.includes(i)) continue; + if (i == 3 && !list.length) continue; + str += numbers.shift(); + str += choices[i]; + } + str += "。"; + str = str.replace(/X/g, get.cnNumber(event.num)); + player.chooseTarget(get.prompt("caiyi") + "(当前状态:" + (index ? "阳" : "阴") + ")", str).set("ai", function (target) { + var player = _status.event.player; + return (player.storage.caiyi ? -1 : 1) * get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("caiyi", target); + player.changeZhuanhuanji("caiyi"); + event.goto(event.index == 1 ? 5 : 2); + } else event.finish(); + "step 2"; + var list = [], + str = get.cnNumber(num); + var choiceList = ["回复" + str + "点体力。", "摸" + str + "张牌。", "将武将牌翻至正面且重置。", "随机执行一个已经被移除的选项。"]; + var storage = player.storage.caiyi_info[event.index]; + for (var i = 0; i < 4; i++) { + if (storage.includes(i)) { + choiceList[i] = '' + choiceList[i] + ""; + } else if (!lib.skill.caiyi.filterx[event.index][i](target) || (i == 3 && !storage.length)) { + choiceList[i] = '' + choiceList[i] + ""; + } else list.push("选项" + get.cnNumber(i + 1, true)); + } + if (!list.length) { + event.finish(); + return; + } + target + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event, + player = evt.player; + var list = evt.controls.slice(0); + var gett = function (choice) { + if (choice == "cancel2") return 0.1; + var max = 0, + func = { + 选项一: function (current) { + max = get.recoverEffect(current, player, player) * Math.min(evt.getParent().num, player.getDamagedHp()); + }, + 选项二: function (target) { + max = get.effect(target, { name: "draw" }, player, player) * evt.getParent().num; + }, + 选项三: function (target) { + if (player.isTurnedOver()) max += 25; + if (player.isLinked()) max += get.effect(player, { name: "tiesuo" }, player, player); + }, + 选项四: function (target) { + max = 3; + }, + }[choice]; + func(player); + return max; + }; + return list.sort(function (a, b) { + return gett(b) - gett(a); + })[0]; + }); + "step 3"; + var index2 = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); + player.storage.caiyi_info[event.index].push(index2); + if (index2 == 3) { + var list = player.storage.caiyi_info[event.index].filter(function (i) { + return i != 3 && lib.skill.caiyi.filterx[event.index][i](target); + }); + if (!list.length) { + event.finish(); + return; + } + index2 = list.randomGet(); + } + switch (index2) { + case 0: + target.recover(num); + break; + case 1: + target.draw(num); + break; + case 2: + !target.isTurnedOver() || target.turnOver(); + break; + } + if (index2 != 2) event.finish(); + "step 4"; + !target.isLinked() || target.link(); + event.finish(); + "step 5"; + var list = [], + str = get.cnNumber(num); + var choiceList = ["受到" + str + "点伤害。", "弃置" + str + "张牌。", "将武将牌翻至背面并横置。", "随机执行一个已经被移除的选项。"]; + var storage = player.storage.caiyi_info[event.index]; + for (var i = 0; i < 4; i++) { + if (storage.includes(i)) { + choiceList[i] = '' + choiceList[i] + ""; + } else if (!lib.skill.caiyi.filterx[event.index][i](target) || (i == 3 && !storage.length)) { + choiceList[i] = '' + choiceList[i] + ""; + } else list.push("选项" + get.cnNumber(i + 1, true)); + } + if (!list.length) { + event.finish(); + return; + } + target + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event, + player = evt.player; + var list = evt.controls.slice(0); + var gett = function (choice) { + if (choice == "cancel2") return 0.1; + var max = 0, + func = { + 选项一: function (current) { + max = get.effect(current, { name: "damage" }, player, player) * evt.getParent().num; + }, + 选项二: function (target) { + max = get.effect(target, { name: "guohe_copy2" }, player, player) * Math.min(player.countCards("he"), evt.getParent().num); + }, + 选项三: function (target) { + if (!player.isTurnedOver()) max -= 5; + if (!player.isLinked()) max += get.effect(player, { name: "tiesuo" }, player, player); + }, + 选项四: function (target) { + max = -3; + }, + }[choice]; + func(player); + return max; + }; + return list.sort(function (a, b) { + return gett(b) - gett(a); + })[0]; + }); + "step 6"; + var index2 = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); + player.storage.caiyi_info[event.index].push(index2); + if (index2 == 3) { + var list = player.storage.caiyi_info[event.index].filter(function (i) { + return i != 3 && lib.skill.caiyi.filterx[event.index][i](target); + }); + if (!list.length) { + event.finish(); + return; + } + index2 = list.randomGet(); + } + switch (index2) { + case 0: + target.damage(num); + break; + case 1: + target.chooseToDiscard(num, true, "he"); + break; + case 2: + target.isTurnedOver() || target.turnOver(); + break; + } + if (index2 != 2) event.finish(); + "step 7"; + target.isLinked() || target.link(); + event.finish(); + }, + mark: true, + marktext: "☯", + intro: { + content: function (storage) { + if (storage) return "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项:⒈受到X点伤害。⒉弃置X张牌。⒊翻面并横置。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。"; + return "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项:⒈回复X点体力。⒉摸X张牌,⒊复原武将牌。⒋随机执行一个已经移除过的阴选项。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。"; + }, + }, + }, + guili: { + audio: 2, + trigger: { player: "phaseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.phaseNumber == 1 && game.hasPlayer(current => current != player); + }, + content: function () { + "step 0"; + player.chooseTarget(lib.filter.notMe, true, "请选择【归离】的目标", lib.translate.guili_info).set("ai", function (target) { + return -get.threaten(target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.log(player, "选择了", target); + player.storage.guili_insert = target; + player.addSkill("guili_insert"); + game.delayx(); + } + }, + onremove: true, + subSkill: { + insert: { + mark: true, + intro: { + content: "players", + }, + trigger: { global: "phaseAfter" }, + forced: true, + charlotte: true, + logTarget: "player", + filter: function (event, player) { + if (event.player != player.storage.guili_insert) return false; + if (event.player.getHistory("sourceDamage").length > 0) return false; + var history = event.player.actionHistory; + if (history[history.length - 1].isRound) return true; + for (var i = history.length - 2; i >= 0; i--) { + if (history[i].isMe) return false; + if (history[i].isRound) return true; + } + return false; + }, + content: function () { + player.insertPhase(); + }, + }, + }, + }, + //刘虞 + dcsuifu: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + if (player == event.player || !event.player.countCards("h")) return false; + var num = 0; + game.countPlayer(function (current) { + if (current == player || current.getSeatNum() == 1) { + current.getHistory("damage", function (evt) { + num += evt.num; + }); + } + }); + return num >= 2; + }, + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) <= 0; + }, + content: function () { + "step 0"; + var target = trigger.player, + cards = target.getCards("h"); + target.lose(cards, ui.cardPile, "insert"); + target.$throw(cards.length); + game.updateRoundNumber(); + game.log(player, "将", target, "的", get.cnNumber(cards.length), "张手牌置于牌堆顶"); + "step 1"; + game.delayx(); + player.chooseUseTarget({ name: "wugu", isCard: true }, true); + }, + }, + dcpijing: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget([1, game.countPlayer()], get.prompt("dcpijing"), "令任意名角色获得技能〖自牧〗").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var targets = result.targets; + targets.add(player); + targets.sortBySeat(); + player.logSkill("dcpijing", targets); + game.countPlayer(function (current) { + if (!targets.includes(current)) current.removeSkills("dczimu"); + else current.addSkills("dczimu"); + }); + game.delayx(); + } + }, + derivation: "dczimu", + }, + dczimu: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + mark: true, + logTarget: function (event, player) { + return game + .filterPlayer(function (current) { + return current.hasSkill("dczimu", null, null, false); + }) + .sortBySeat(); + }, + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current.hasSkill("dczimu", null, null, false); + }); + if (list.length > 0) { + if (list.length == 1) list[0].draw(); + else { + game.asyncDraw(list); + event.delay = true; + } + } + "step 1"; + player.removeSkills("dczimu"); + if (event.delay) game.delayx(); + }, + marktext: "牧", + intro: { + content: "锁定技。当你受到伤害后,你令所有拥有〖自牧〗的角色各摸一张牌,然后你失去〖自牧〗。", + }, + }, + //黄祖 + dcjinggong: { + audio: 2, + enable: "chooseToUse", + locked: false, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dcjinggong) return true; + }, + }, + viewAsFilter: function (player) { + return player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "ehs"); + }, + position: "hes", + filterCard: { type: "equip" }, + viewAs: { + name: "sha", + storage: { dcjinggong: true }, + }, + check: function (card) { + return 6 - get.value(card); + }, + ai: { + respondSha: true, + skillTagFilter: function (player) { + return player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "ehs"); + }, + }, + group: "dcjinggong_base", + subSkill: { + base: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return event.skill == "dcjinggong" && event.targets.length > 0; + }, + content: function () { + trigger.baseDamage = Math.min(5, get.distance(player, trigger.targets[0])); + }, + }, + }, + }, + dcxiaojuan: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + logTarget: "target", + filter: function (event, player) { + return event.targets.length == 1 && player != event.target && event.target.countCards("h") > 1; + }, + check: function (event, player) { + var target = event.target; + if (get.attitude(player, target) >= 0) return false; + if (get.color(event.card) == "none") return true; + return Math.floor(target.countCards("h") / 2) >= Math.floor(player.countCards("h") / 2); + }, + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + var num = Math.floor(target.countCards("h") / 2); + if (num > 0) player.discardPlayerCard(target, "h", num, true); + else event.finish(); + "step 1"; + var suit = get.suit(trigger.card); + if (result.bool && lib.suit.includes(suit) && player.countCards("h") > 1) { + var bool = false; + for (var i of result.cards) { + if (get.suit(i, target) == suit) { + bool = true; + break; + } + } + if (!bool) event.finish(); + } else event.finish(); + "step 2"; + if (player.countCards("h") > 0) player.chooseToDiscard("h", 1, true); + }, + }, + //来莺儿 + xiaowu: { + audio: 2, + enable: "phaseUse", + usable: 1, + selectTarget: function () { + return [1, game.countPlayer() - 1]; + }, + complexSelect: true, + complexTarget: true, + filterTarget: function (card, player, target) { + if (player == target) return false; + var next = player.getNext(), + prev = player.getPrevious(); + var selected = ui.selected.targets; + if (!selected.includes(next) && !selected.includes(prev)) return target == next || target == prev; + for (var i of selected) { + if (i.getNext() == target || i.getPrevious() == target) return true; + } + return false; + }, + contentBefore: function () { + event.getParent()._xiaowu_targets = []; + }, + content: function () { + "step 0"; + if (!target.isIn()) { + event.finish(); + return; + } + target + .chooseControl() + .set("choiceList", ["令" + get.translation(player) + "摸一张牌", "令自己摸一张牌"]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().player; + var all = _status.event.getParent().targets.length, + dam = _status.event.getParent(2)._xiaowu_targets.length; + if (get.attitude(player, target) > 0 || dam >= Math.floor(all / 2)) return 0; + return 1; + }); + "step 1"; + if (result.index == 0) { + player.draw(); + } else { + target.draw(); + event.getParent()._xiaowu_targets.push(target); + } + }, + contentAfter: function () { + var targetsx = event.getParent()._xiaowu_targets; + var num = targets.length - targetsx.length - targetsx.length; + if (num > 0) player.addMark("shawu", 1); + else if (num < 0) { + player.line(targetsx, "fire"); + for (var i of targetsx) i.damage(); + } + }, + ai: { + order: 8, + result: { player: 1 }, + }, + }, + huaping: { + audio: 2, + trigger: { global: "die" }, + limited: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + return player != event.player; + }, + logTarget: "player", + check: function (event, player) { + return get.rank(event.player.name, true) >= 5; + }, + content: function () { + player.awakenSkill("huaping"); + var skills = trigger.player.getSkills(null, false, false).filter(function (i) { + var info = get.info(i); + return info && !info.charlotte; + }); + if (skills.length) { + //for(var i of skills) player.addSkillLog(i); + player.addSkills(skills); + } + player.removeSkills("xiaowu"); + var num = player.countMark("shawu"); + if (num > 0) { + player.removeMark("shawu", num); + player.draw(num); + } + }, + group: "huaping_give", + subSkill: { + give: { + audio: "huaping", + trigger: { player: "die" }, + direct: true, + filter: function (event, player) { + return event.player == player; + }, + forceDie: true, + skillAnimation: true, + animationColor: "gray", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("huaping"), "令一名其他角色获得〖沙舞〗", lib.filter.notMe) + .set("forceDie", true) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) + 100; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.awakenSkill("huaping"); + player.logSkill("huaping_give", target); + target.addSkills("shawu"); + var num = player.countMark("shawu"); + if (num > 0) { + player.removeMark("shawu", num); + target.addMark("shawu", num); + } + } + }, + }, + }, + derivation: "shawu", + }, + shawu: { + audio: 2, + trigger: { player: "useCardToTargeted" }, + shaRelated: true, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.player.isIn() && + (player.hasMark("shawu") || + player.countCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "shawu"); + }) > 1) + ); + }, + content: function () { + "step 0"; + var list = []; + if ( + player.countCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "shawu"); + }) > 1 + ) + list.push("弃置手牌"); + if (player.hasMark("shawu")) list.push("移除标记"); + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("shawu", trigger.target)) + .set("prompt2", "弃置两张手牌,或移去一枚“沙”并摸两张牌,然后对该角色造成1点伤害") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().target; + if (get.damageEffect(target, player, player) <= 0) return "cancel2"; + if (player.hasMark("shawu")) return "移除标记"; + if ( + player.countCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "shawu") && get.value(card) <= 6.5; + }) > 1 + ) + return "弃置手牌"; + return "cancel2"; + }); + "step 1"; + var target = trigger.target; + if (result.control == "cancel2") { + event.finish(); + return; + } else if (result.control == "移除标记") { + player.logSkill("shawu", target); + player.removeMark("shawu", 1); + player.draw(2); + target.damage(); + event.finish(); + } else { + player.chooseToDiscard("h", true, 2).logSkill = ["shawu", target]; + } + "step 2"; + trigger.target.damage(); + }, + intro: { + content: "mark", + }, + }, + //曹髦 + qianlong: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { + "step 0"; + var cards = get.cards(3); + event.cards = cards; + game.cardsGotoOrdering(cards); + //展示牌 + game.log(player, "展示了", event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + if (player == game.me || player.isUnderControl()) return; + var str = get.translation(player) + "发动了【潜龙】"; + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + game.addVideo("showCards", player, [get.translation(player) + "发动了【潜龙】", get.cardsInfo(event.cards)]); + if (player != game.me && !player.isUnderControl() && !player.isOnline()) game.delay(2); + //选牌 + var next = player.chooseToMove("潜龙:获得至多" + get.cnNumber(Math.min(3, player.getDamagedHp())) + "张牌并将其余牌置于牌堆底"); + next.set("list", [["置于牌堆底", cards], ["自己获得"]]); + next.set("filterMove", function (from, to, moved) { + if (moved[0].includes(from.link)) { + if (typeof to == "number") { + if (to == 1) { + if (moved[1].length >= _status.event.player.getDamagedHp()) return false; + } + return true; + } + } + return true; + }); + next.set("processAI", function (list) { + let cards = list[0][1].slice(0), + player = _status.event.player; + cards.sort((a, b) => { + return get.value(b, player) - get.value(a, player); + }); + if (!player.storage.juetao && player.hasSkill("juetao") && player.hasSha()) { + let gain, + bottom, + pai = cards.filter(card => card.name !== "sha"); + pai.sort((a, b) => { + return get.value(b, player) - get.value(a, player); + }); + gain = pai.splice(0, player.getDamagedHp()); + bottom = cards.slice(0); + bottom.removeArray(gain); + return [bottom, gain]; + } + return [cards, cards.splice(0, player.getDamagedHp())]; + }); + "step 1"; + game.broadcastAll("closeDialog", event.videoId); + game.addVideo("cardDialog", null, event.videoId); + var moved = result.moved; + if (moved[0].length > 0) { + for (var i of moved[0]) { + i.fix(); + ui.cardPile.appendChild(i); + } + } + if (moved[1].length > 0) player.gain(moved[1], "gain2"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (!target.hasFriend()) return; + var num = 1; + if (!player.needsToDiscard() && target.isDamaged()) { + num = 0.7; + } else { + num = 0.5; + } + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; + } + }, + }, + }, + }, + fensi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + "step 0"; + if ( + !game.hasPlayer(function (current) { + return current != player && current.hp >= player.hp; + }) + ) { + player.damage(); + event.finish(); + return; + } else { + player + .chooseTarget(true, "忿肆:对一名体力值不小于你的角色造成1点伤害", function (card, player, target) { + return target.hp >= player.hp; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.damage(); + } else event.finish(); + "step 2"; + if (target.isIn() && target.canUse("sha", player, false)) target.useCard({ name: "sha", isCard: true }, player, false, "noai"); + }, + }, + juetao: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.hp == 1; + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("juetao"), lib.filter.notMe).set("ai", function (target) { + let att = -get.attitude(_status.event.player, target); + if (att <= 0) return att; + if (target.hasSkillTag("nodamage") || target.getEquip("qimenbagua")) return 0.01 * att; + if (target.getEquip("tengjia") || target.getEquip("renwang")) return 0.3 * att; + if (target.getEquip("rewrite_tengjia") || target.getEquip("rewrite_renwang")) return 0.2 * att; + if ( + target.hasSkillTag( + "freeShan", + false, + { + player: _status.event.player, + }, + true + ) + ) + return 0.3 * att; + if (target.getEquip(2)) return att / 2; + return 1.2 * att; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("juetao", target); + player.awakenSkill("juetao"); + } else event.finish(); + "step 2"; + var card = get.bottomCards()[0]; + game.cardsGotoOrdering(card); + player.showCards(card); + player + .chooseUseTarget(card, true, false, "nodistance") + .set("filterTarget", function (card, player, target) { + var evt = _status.event; + if (_status.event.name == "chooseTarget") evt = evt.getParent(); + if (target != player && target != evt.juetao_target) return false; + return lib.filter.targetEnabledx(card, player, target); + }) + .set("juetao_target", target); + "step 3"; + if (result.bool && target.isIn()) event.goto(2); + }, + }, + zhushi: { + audio: 2, + usable: 1, + trigger: { global: "recoverEnd" }, + direct: true, + zhuSkill: true, + filter: function (event, player) { + return player != event.player && event.player.group == "wei" && event.player == _status.currentPhase && event.player.isIn() && player.hasZhuSkill("zhushi", event.player); + }, + content: function () { + "step 0"; + var str = get.translation(player); + trigger.player + .chooseBool("是否响应" + get.translation(player) + "的主公技【助势】?", "令" + get.translation(player) + "摸一张牌") + .set("goon", get.attitude(trigger.player, player) > 0) + .set("ai", () => _status.event.goon); + "step 1"; + if (result.bool) { + player.logSkill("zhushi"); + trigger.player.line(player, "thunder"); + player.draw(); + } else player.storage.counttrigger.zhushi--; + }, + }, + //骆统 + renzheng: { + audio: 2, + trigger: { global: ["damageCancelled", "damageZero", "damageAfter"] }, + forced: true, + filter: function (event, player, name) { + if (name == "damageCancelled") return true; + for (var i of event.change_history) { + if (i < 0) return true; + } + return false; + }, + content: function () { + player.draw(2); + }, + }, + jinjian: { + audio: 2, + trigger: { source: "damageBegin1" }, + logTarget: "player", + filter: function (event, player) { + return !event.jinjian_source2 && !player.hasSkill("jinjian_source2"); + }, + prompt2: "令即将对其造成的伤害+1", + check: function (event, player) { + return ( + get.attitude(player, event.player) < 0 && + !event.player.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) + ); + }, + content: function () { + trigger.jinjian_source = true; + trigger.num++; + player.addTempSkill("jinjian_source2"); + }, + group: "jinjian_player", + subSkill: { + player: { + audio: "jinjian", + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return !event.jinjian_player2 && !player.hasSkill("jinjian_player2"); + }, + prompt2: "令即将受到的伤害-1", + content: function () { + trigger.jinjian_player = true; + trigger.num--; + player.addTempSkill("jinjian_player2"); + }, + }, + source2: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !event.jinjian_source; + }, + content: function () { + trigger.num--; + trigger.jinjian_source2 = true; + player.removeSkill("jinjian_source2"); + }, + marktext: " -1 ", + intro: { + content: "下次造成的伤害-1", + }, + }, + player2: { + trigger: { player: "damageBegin3" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !event.jinjian_player; + }, + content: function () { + trigger.num++; + trigger.jinjian_player2 = true; + player.removeSkill("jinjian_player2"); + }, + marktext: " +1 ", + intro: { + content: "下次受到的伤害+1", + }, + }, + }, + ai: { + maixie_defend: true, + threaten: 0.9, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing")) return; + //if(target.hujia) return; + if (player._jinjian_tmp) return; + if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return; + if (get.tag(card, "damage")) { + if (target.hasSkill("jinjian_player2")) { + return [1, -2]; + } else { + if (get.attitude(player, target) > 0) { + return [0, 0.2]; + } + if (get.attitude(player, target) < 0 && !player.hasSkillTag("damageBonus")) { + var sha = player.getCardUsable({ name: "sha" }); + player._jinjian_tmp = true; + var num = player.countCards("h", function (card) { + if (card.name == "sha") { + if (sha == 0) { + return false; + } else { + sha--; + } + } + return get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0; + }); + delete player._jinjian_tmp; + if (player.hasSkillTag("damage")) { + num++; + } + if (num < 2) { + return [0, 0.8]; + } + } + } + } + }, + }, + }, + }, + //冯妤 + tiqi: { + audio: 2, + trigger: { global: ["phaseDrawEnd", "phaseDrawSkipped", "phaseDrawCancelled"] }, + filter: function (event, player) { + if (player == event.player) return false; + var num = 0; + event.player.getHistory("gain", function (evt) { + if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == event) num += evt.cards.length; + }); + return num != 2; + }, + frequent: true, + logTarget: "player", + content: function () { + "step 0"; + var num = 0; + trigger.player.getHistory("gain", function (evt) { + if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == trigger) num += evt.cards.length; + }); + num = Math.abs(num - 2); + event.num = num; + player.draw(num); + "step 1"; + if (trigger.player.isIn()) { + player + .chooseControl(" +" + num + " ", " -" + num + " ", "cancel2") + .set("prompt", "是否改变" + get.translation(trigger.player) + "本回合的手牌上限?") + .set("ai", function () { + var sgn = get.sgn(get.attitude(_status.event.player, _status.event.getTrigger().player)); + if (sgn == 0) return 2; + if (sgn == 1) return 0; + return 1; + }); + } else event.finish(); + "step 2"; + if (result.index < 2) { + var target = trigger.player; + player.line(target); + if (!target.storage.tiqi_effect) target.storage.tiqi_effect = 0; + target.storage.tiqi_effect += num * get.sgn(0.5 - result.index); + target.addTempSkill("tiqi_effect"); + target.markSkill("tiqi_effect"); + } + }, + subSkill: { + effect: { + mod: { + maxHandcard: function (player, num) { + if (typeof player.storage.tiqi_effect == "number") return num + player.storage.tiqi_effect; + }, + }, + charlotte: true, + onremove: true, + mark: true, + intro: { + content: num => "手牌上限" + (num < 0 ? "" : "+") + num, + }, + }, + }, + }, + baoshu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.maxHp > 0; + }, + content: function () { + "step 0"; + player.chooseTarget([1, player.maxHp], get.prompt("baoshu"), "令至多" + get.cnNumber(player.maxHp) + "名角色重置武将牌并获得“梳”").set("ai", function (target) { + var att = get.attitude(player, target); + if (att <= 0) return 0; + //if(target.isTurnedOver()) return 3*att; + if (target.isLinked() && get.effect(target, { name: "tiesuo" }, player, player) > 0) return 1.6 * att; + if (ui.selected.targets.length >= Math.sqrt(1 + player.maxHp)) return 0; + if (target != player) return 1.3 * att; + return att; + }); + "step 1"; + if (result.bool) { + var targets = result.targets; + targets.sortBySeat(); + player.logSkill("baoshu", targets); + event.targets = targets; + event.num = 0; + event.num2 = 1 + player.maxHp - targets.length; + } else event.finish(); + "step 2"; + var target = targets[num]; + event.target = target; + if (!target.isIn()) { + if (num < targets.length - 1) { + event.num++; + event.goto(2); + } else event.finish(); + } else if (target.isLinked()) target.link(); + "step 3"; + if (target.isIn()) target.addMark("baoshu", event.num2); + if (num < targets.length - 1) { + event.num++; + event.goto(2); + } else event.finish(); + }, + marktext: "梳", + intro: { + name2: "梳", + content: "mark", + }, + group: "baoshu_draw", + subSkill: { + draw: { + trigger: { global: "phaseDrawBegin2" }, + forced: true, + popup: false, + filter: function (event, player) { + return !event.numFixed && event.player.hasMark("baoshu"); + }, + content: function () { + var target = trigger.player, + num = target.countMark("baoshu"); + trigger.player.logSkill("baoshu_draw"); + trigger.num += num; + trigger.player.removeMark("baoshu", num); + }, + }, + }, + }, + //吴范 + tianyun: { + audio: 2, + trigger: { global: "phaseBegin" }, + frequent: true, + filter: function (event, player) { + return event.player.getSeatNum() == game.roundNumber && player.countCards("h") > 0; + }, + content: function () { + "step 0"; + var suits = [], + hs = player.getCards("h"); + for (var i of hs) { + suits.add(get.suit(i, player)); + } + var num = suits.length; + event.num = num; + 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]; + return [[], cards]; + }; + "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(); + if (top.length) { + game.delayx(); + event.finish(); + } + "step 2"; + player + .chooseTarget("是否令一名角色摸" + get.cnNumber(num) + "张牌,然后失去1点体力?") + .set("", function (target) { + if (!_status.event.goon || target.hasSkillTag("nogain")) return 0; + return get.attitude(_status.event.player, target) * Math.sqrt(Math.max(1, 5 - target.getCards("h"))); + }) + .set("goon", num > 1 && player.hp > 5 - num); + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.draw(num); + player.loseHp(); + } else game.delayx(); + }, + group: "tianyun_gain", + subSkill: { + gain: { + audio: "tianyun", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + if (event.name == "phase" && game.phaseNumber != 0) return false; + var suits = lib.suit.slice(0), + hs = player.getCards("h"); + for (var i of hs) { + suits.remove(get.suit(i, player)); + if (!suits.length) return false; + } + return true; + }, + content: function () { + var suits = lib.suit.slice(0), + hs = player.getCards("h"); + for (var i of hs) { + suits.remove(get.suit(i, player)); + } + var cards = []; + for (var i of suits) { + var card = get.cardPile(function (card) { + return get.suit(card, false) == i; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + }, + }, + }, + }, + wfyuyan: { + audio: 2, + derivation: "refenyin", + trigger: { global: "roundStart" }, + forced: true, + locked: false, + content: function () { + "step 0"; + var next = player + .chooseTarget("请选择【预言】的目标", true) + .set("animate", false) + .set("ai", function () { + return Math.random(); + }); + "step 1"; + if (result.bool) { + player.storage.wfyuyan = result.targets[0]; + player.addSkill("wfyuyan_dying"); + player.addSkill("wfyuyan_damage"); + } + }, + subSkill: { + dying: { + trigger: { global: "dying" }, + forced: true, + charlotte: true, + popup: false, + content: function () { + if (trigger.player == player.storage.wfyuyan) { + player.logSkill("wfyuyan", trigger.player); + player.addTempSkill("iwasawa_refenyin", { player: "phaseEnd" }); + } + player.removeSkill("wfyuyan_dying"); + }, + }, + damage: { + trigger: { global: "damageSource" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.source && event.source.isIn(); + }, + content: function () { + if (trigger.source == player.storage.wfyuyan) { + player.logSkill("wfyuyan", trigger.source); + player.draw(2); + } + player.removeSkill("wfyuyan_damage"); + }, + }, + }, + }, + //张宝 + xinzhoufu: { + audio: "zhoufu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterCard: true, + filterTarget: function (card, player, target) { + return target != player && !target.getExpansions("xinzhoufu2").length; + }, + check: function (card) { + return 6 - get.value(card); + }, + position: "he", + discard: false, + lose: false, + delay: false, + content: function () { + target.addToExpansion(cards, player, "give").gaintag.add("xinzhoufu2"); + target.addSkill("xinzhoufu_judge"); + }, + ai: { + order: 9, + result: { + target: function (player, target) { + if (player.inRange(target)) return -1.3; + return -1; + }, + }, + }, + subSkill: { + judge: { + audio: "zhoufu", + trigger: { player: "judgeBefore" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !event.directresult && player.getExpansions("xinzhoufu2").length; + }, + content: function () { + var cards = [player.getExpansions("xinzhoufu2")[0]]; + trigger.directresult = cards[0]; + }, + }, + }, + }, + xinzhoufu2: { + intro: { + content: "expansion", + markcount: "expansion", + }, + }, + xinyingbing: { + audio: "yingbin", + trigger: { player: "useCardToPlayered" }, + forced: true, + logTarget: "target", + filter: function (event, player) { + return ( + event.target.getExpansions("xinzhoufu2").length > 0 && + !player.hasHistory("gain", function (evt) { + var evtx = evt.getParent(2); + return evtx && evtx.name == "xinyingbing" && evtx._trigger.target == event.target; + }) + ); + }, + content: function () { + player.draw(2); + }, + ai: { + effect: { + player: function (card, player, target) { + if ( + target && + target.getExpansions("xinzhoufu2").length > 0 && + !player.hasHistory("gain", function (evt) { + var evtx = evt.getParent(2); + return evtx && evtx.name == "xinyingbing" && evtx._trigger.target == target; + }) + ) + return [1, 1]; + }, + }, + combo: "xinzhoufu", + }, + }, + //孙翊 + syjiqiao: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + content: function () { + var cards = get.cards(player.maxHp); + cards.sort(function (a, b) { + return get.color(b).length - get.color(a).length; + }); + player.addToExpansion(cards, "gain2").gaintag.add("syjiqiao"); + player.addTempSkill("syjiqiao_gain", "phaseUseAfter"); + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + subSkill: { + gain: { + audio: "syjiqiao", + trigger: { player: "useCardAfter" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player.hasCard(card => card.hasGaintag("syjiqiao"), "x"); + }, + content: function () { + "step 0"; + var cards = player.getExpansions("syjiqiao"); + var dialog = ["激峭:选择获得一张牌"]; + var reds = [], + blacks = []; + for (var i of cards) (get.color(i) == "red" ? reds : blacks).push(i); + if (reds.length > 0) { + dialog.push('
    红色牌
    '); + dialog.push(reds); + } + if (blacks.length > 0) { + dialog.push('
    黑色牌
    '); + dialog.push(blacks); + } + player.chooseButton(dialog, true).set("ai", function (button) { + var player = _status.event.player; + var color = get.color(button.link), + cards = player.getExpansions("syjiqiao"); + var num1 = cards.filter(card => get.color(card) == color).length, + num2 = cards.length - num1; + if (num1 >= num2) return get.value(button.link); + return 0; + }); + "step 1"; + if (result.bool) { + player.gain(result.links, "gain2"); + } else event.finish(); + "step 2"; + var map = { red: 0, black: 0 }, + cards = player.getExpansions("syjiqiao"); + for (var i of cards) { + var color = get.color(i, false); + if (map[color] != undefined) map[color]++; + } + if (map.red == map.black) player.recover(); + else player.loseHp(); + }, + onremove: function (player) { + var cards = player.getExpansions("syjiqiao"); + if (cards.length) player.loseToDiscardpile(cards); + }, + }, + }, + }, + syxiongyi: { + audio: 2, + skillAnimation: true, + animationColor: "wood", + limited: true, + enable: "chooseToUse", + filter: function (event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; + return true; + }, + async content(event, trigger, player) { + "step 0"; + player.awakenSkill("syxiongyi"); + if (!_status.characterlist) { + lib.skill.pingjian.initList(); + } + if (_status.characterlist.includes("xushi")) { + if (player.name2 && get.character(player.name2)[3].includes("syxiongyi")) { + await player.reinitCharacter(player.name2, "xushi"); + } else { + await player.reinitCharacter(player.name1, "xushi"); + } + if (player.hp < 3) await player.recover(3 - player.hp); + } else { + await player.addSkills("olhunzi"); + if (player.hp < 1) await player.recover(1 - player.hp); + } + }, + ai: { + order: 1, + save: true, + skillTagFilter: function (player, arg, target) { + return player == target; + }, + result: { + player: 10, + }, + }, + derivation: ["olhunzi", "reyingzi", "gzyinghun"], + }, + gzyinghun_re_sunyi: { audio: 1 }, + reyingzi_re_sunyi: { audio: 1 }, + //曹金玉 + yuqi: { + audio: 2, + trigger: { global: "damageEnd" }, + init: function (player) { + if (!player.storage.yuqi) player.storage.yuqi = [0, 3, 1, 1]; + }, + getInfo: function (player) { + if (!player.storage.yuqi) player.storage.yuqi = [0, 3, 1, 1]; + return player.storage.yuqi; + }, + onremove: true, + usable: 2, + filter: function (event, player) { + var list = lib.skill.yuqi.getInfo(player); + return event.player.isIn() && get.distance(player, event.player) <= list[0]; + }, + logTarget: "player", + content: function () { + "step 0"; + event.list = lib.skill.yuqi.getInfo(player); + var cards = get.cards(event.list[1]); + event.cards = cards; + game.cardsGotoOrdering(cards); + var next = player.chooseToMove(true, "隅泣(若对话框显示不完整,可下滑操作)"); + next.set("list", [["牌堆顶的牌", cards], ["交给" + get.translation(trigger.player) + "(至少一张" + (event.list[2] > 1 ? ",至多" + get.cnNumber(event.list[2]) + "张" : "") + ")"], ["交给自己(至多" + get.cnNumber(event.list[3]) + "张)"]]); + next.set("filterMove", function (from, to, moved) { + var info = lib.skill.yuqi.getInfo(_status.event.player); + if (to == 1) return moved[1].length < info[2]; + if (to == 2) return moved[2].length < info[3]; + return true; + }); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(b, "raw") - get.value(a, "raw"); + }), + player = _status.event.player, + target = _status.event.getTrigger().player; + var info = lib.skill.yuqi.getInfo(_status.event.player); + var cards1 = cards.splice(0, Math.min(info[3], cards.length - 1)); + var card2; + if (get.attitude(player, target) > 0) card2 = cards.shift(); + else card2 = cards.pop(); + return [cards, [card2], cards1]; + }); + next.set("filterOk", function (moved) { + return moved[1].length > 0; + }); + "step 1"; + if (result.bool) { + var moved = result.moved; + cards.removeArray(moved[1]); + cards.removeArray(moved[2]); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); + } + var list = [[trigger.player, moved[1]]]; + if (moved[2].length) list.push([player, moved[2]]); + game.loseAsync({ + gain_list: list, + giver: player, + animate: "gain2", + }).setContent("gaincardMultiple"); + } + }, + mark: true, + intro: { + content: function (storage, player) { + var info = lib.skill.yuqi.getInfo(player); + return '
    蓝色:' + info[0] + " 红色:" + info[1] + "
    绿色:" + info[2] + " 黄色:" + info[3] + "
    "; + }, + }, + ai: { + threaten: 8.8, + }, + }, + shanshen: { + audio: 2, + trigger: { global: "die" }, + direct: true, + content: function () { + "step 0"; + event.goon = !player.hasAllHistory("sourceDamage", function (evt) { + return evt.player == trigger.player; + }); + var list = lib.skill.yuqi.getInfo(player); + player + .chooseControl("蓝色(" + list[0] + ")", "红色(" + list[1] + ")", "绿色(" + list[2] + ")", "黄色(" + list[3] + ")", "cancel2") + .set("prompt", get.prompt("shanshen")) + .set("prompt2", "令〖隅泣〗中的一个数字+2" + (event.goon ? "并回复1点体力" : "")) + .set("ai", function () { + var player = _status.event.player, + info = lib.skill.yuqi.getInfo(player); + if ( + info[0] < info[3] && + game.countPlayer(function (current) { + return get.distance(player, current) <= info[0]; + }) < Math.min(3, game.countPlayer()) + ) + return 0; + if (info[3] < info[1] - 1) return 3; + if (info[1] < 5) return 1; + if ( + info[0] < 5 && + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) > info[0]; + }) + ) + return 0; + return 2; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("shanshen", trigger.player); + var list = lib.skill.yuqi.getInfo(player); + list[result.index] = Math.min(5, list[result.index] + 2); + game.log(player, "将", result.control, "数字改为", "#y" + list[result.index]); + player.markSkill("yuqi"); + if (event.goon) player.recover(); + } + }, + ai: { + combo: "yuqi", + }, + }, + xianjing: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + var list = lib.skill.yuqi.getInfo(player); + player + .chooseControl("蓝色(" + list[0] + ")", "红色(" + list[1] + ")", "绿色(" + list[2] + ")", "黄色(" + list[3] + ")", "cancel2") + .set("prompt", get.prompt("xianjing")) + .set("prompt2", "令〖隅泣〗中的一个数字+1") + .set("ai", function () { + var player = _status.event.player, + info = lib.skill.yuqi.getInfo(player); + if ( + info[0] < info[3] && + game.countPlayer(function (current) { + return get.distance(player, current) <= info[0]; + }) < Math.min(3, game.countPlayer()) + ) + return 0; + if (info[3] < info[1] - 1) return 3; + if (info[1] < 5) return 1; + if ( + info[0] < 5 && + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) > info[0]; + }) + ) + return 0; + return 2; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("xianjing"); + var list = lib.skill.yuqi.getInfo(player); + list[result.index] = Math.min(5, list[result.index] + 1); + game.log(player, "将", result.control, "数字改为", "#y" + list[result.index]); + player.markSkill("yuqi"); + if (player.isDamaged()) event.finish(); + } else event.finish(); + "step 2"; + var list = lib.skill.yuqi.getInfo(player); + player + .chooseControl("蓝色(" + list[0] + ")", "红色(" + list[1] + ")", "绿色(" + list[2] + ")", "黄色(" + list[3] + ")", "cancel2") + .set("prompt", "是否令〖隅泣〗中的一个数字+1?") + .set("ai", function () { + var player = _status.event.player, + info = lib.skill.yuqi.getInfo(player); + if ( + info[0] < info[3] && + game.countPlayer(function (current) { + return get.distance(player, current) <= info[0]; + }) < Math.min(3, game.countPlayer()) + ) + return 0; + if (info[3] < info[1] - 1) return 3; + if (info[1] < 5) return 1; + if ( + info[0] < 5 && + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) > info[0]; + }) + ) + return 0; + return 2; + }); + "step 3"; + if (result.control != "cancel2") { + var list = lib.skill.yuqi.getInfo(player); + list[result.index] = Math.min(5, list[result.index] + 1); + game.log(player, "将", result.control, "数字改为", "#y" + list[result.index]); + player.markSkill("yuqi"); + } + }, + ai: { + combo: "yuqi", + }, + }, + //周夷 + zhukou: { + audio: 2, + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (!player.getHistory("useCard").length) return false; + var evt = event.getParent("phaseUse"); + if (!evt || !evt.player) return false; + return ( + player + .getHistory("sourceDamage", function (evtx) { + return evtx.getParent("phaseUse") == evt; + }) + .indexOf(event) == 0 + ); + }, + frequent: true, + content: function () { + player.draw(player.getHistory("useCard").length); + }, + group: "zhukou_all", + subSkill: { + all: { + audio: "zhukou", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return game.countPlayer(current => current != player) > 1 && !player.getHistory("sourceDamage").length; + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("zhukou"), "对两名其他角色各造成1点伤害", 2, lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("zhukou", targets); + for (var i of targets) i.damage(); + } + }, + }, + }, + }, + mengqing: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return game.countPlayer(current => current.isDamaged()) > player.hp; + }, + juexingji: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + player.awakenSkill("mengqing"); + player.gainMaxHp(3); + player.recover(3); + //player.removeSkill('zhukou'); + //player.addSkill('yuyun'); + player.changeSkills(["yuyun"], ["zhukou"]); + }, + derivation: "yuyun", + }, + yuyun: { + trigger: { player: "phaseUseBegin" }, + forced: true, + filter: function (event, player) { + return player.hp > 0 || player.maxHp > 1; + }, + content: function () { + "step 0"; + if (player.maxHp <= 1) event._result = { control: "失去体力", index: 0 }; + else if (player.hp < 1) event._result = { control: "减体力上限", index: 1 }; + else + player + .chooseControl("失去体力", "减体力上限") + .set("prompt", "玉陨:失去1点体力或减1点体力上限") + .set("ai", function () { + var player = _status.event.player; + if (player.hp < 2 || player.getDamagedHp() > 2) return 1; + return 0; + }); + "step 1"; + if (result.index == 1) player.loseMaxHp(); + else player.loseHp(); + "step 2"; + var list = ["选项一:摸两张牌", "选项二:对一名其他角色造成1点伤害,且本回合对其使用【杀】无距离和次数限制", "选项三:本回合手牌上限视为无限", "选项四:获得一名其他角色区域内的一张牌", "选项五:令一名其他角色将手牌数摸至体力上限(至多摸至五张)"]; + var next = player.chooseButton([ + "玉陨:请选择一" + (player.getDamagedHp() > 0 ? "至" + get.cnNumber(player.getDamagedHp() + 1) : "") + "项", + [ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ], + ]); + next.set("dialog", event.videoId); + next.set("forced", true); + next.set("ai", function (button) { + var player = _status.event.player; + switch (button.link) { + case 0: + return 2; + case 1: + return ( + Math.max( + 0.5, + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card); + }) - player.getCardUsable({ name: "sha" }) + ) + + Math.max.apply( + Math, + game + .filterPlayer(function (current) { + return current != player; + }) + .map(function (target) { + return get.damageEffect(target, player, player); + }) + ) + ); + case 2: + return player.needsToDiscard() / 4; + case 3: + var num = 0; + return ( + 0.8 * + Math.max.apply( + Math, + game + .filterPlayer(function (current) { + return current != player && current.hasCard(card => lib.filter.canBeGained(card, current, player), "hej"); + }) + .map(function (target) { + return get.effect(target, { name: "shunshou_copy" }, player, player); + }) + ) + ); + case 4: + var num = 0; + game.countPlayer(function (current) { + if (current != player && get.attitude(player, current) > 0) { + var num2 = Math.min(5, current.maxHp) - current.countCards("h"); + if (num2 > num) num = num2; + } + }); + return num * 0.8; + } + }); + if (player.getDamagedHp() > 0) next.set("selectButton", [1, 1 + player.getDamagedHp()]); + "step 3"; + result.links.sort(); + for (var i of result.links) game.log(player, "选择了", "#g【玉陨】", "的", "#y选项" + get.cnNumber(1 + i, true)); + event.links = result.links; + if (result.links.includes(0)) player.draw(2); + if (result.links.includes(2)) player.addTempSkill("yuyun_114514"); + "step 4"; + if ( + event.links.includes(1) && + game.hasPlayer(function (current) { + return current != player; + }) + ) + player.chooseTarget(lib.filter.notMe, true, "对一名其他角色造成1点伤害").set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + else if (event.links.includes(3)) event.goto(6); + else if (event.links.includes(4)) event.goto(8); + else event.finish(); + "step 5"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.damage(); + player.markAuto("yuyun_sha", [target]); + player.addTempSkill("yuyun_sha"); + } + if (event.links.includes(3)) event.goto(6); + else if (event.links.includes(4)) event.goto(8); + else event.finish(); + "step 6"; + if ( + event.links.includes(3) && + game.hasPlayer(function (current) { + return current != player && current.hasCard(card => lib.filter.canBeGained(card, current, player), "hej"); + }) + ) { + player + .chooseTarget(true, "获得一名其他角色区域内的一张牌", function (card, player, current) { + return current != player && current.hasCard(card => lib.filter.canBeGained(card, current, player), "hej"); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "shunshou_copy" }, player, player); + }); + } else if (event.links.includes(4)) event.goto(8); + else event.finish(); + "step 7"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.gainPlayerCard(target, "hej", true); + } + if (!event.links.includes(4)) event.finish(); + "step 8"; + if ( + event.links.includes(4) && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") < Math.min(5, current.maxHp); + }) + ) { + player + .chooseTarget(true, "令一名其他角色将手牌数摸至体力上限", function (card, player, current) { + return current != player && current.countCards("h") < Math.min(5, current.maxHp); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 6; + if (att > 2) { + return Math.min(5, target.maxHp) - target.countCards("h"); + } + return att / 3; + }); + } else event.finish(); + "step 9"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.drawTo(Math.min(5, target.maxHp)); + } + }, + subSkill: { + 114514: { + mod: { + maxHandcardFinal: function (player, num) { + return 114514; + }, + }, + charlotte: true, + }, + sha: { + mod: { + cardUsableTarget: function (card, player, target) { + if (card.name == "sha" && player.getStorage("yuyun_sha").includes(target)) return Infinity; + }, + targetInRange: function (card, player, target) { + if (card.name == "sha" && player.getStorage("yuyun_sha").includes(target)) return true; + }, + }, + charlotte: true, + onremove: true, + }, + }, + }, + //潘淑 + zhiren: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return ( + (player == _status.currentPhase || player.hasSkill("yaner_zhiren")) && + event.card.isCard && + player + .getHistory("useCard", function (evt) { + return evt.card.isCard; + }) + .indexOf(event) == 0 + ); + }, + frequent: true, + locked: false, + content: function () { + "step 0"; + event.num = get.translation(trigger.card.name).length; + player.chooseToGuanxing(event.num); + if (event.num < 2) event.finish(); + "step 1"; + if ( + !game.hasPlayer(function (current) { + return current.countDiscardableCards(player, "e") > 0; + }) + ) { + event.goto(3); + } else + player + .chooseTarget("织纴:是否弃置一名角色装备区内的一张牌?", function (card, player, target) { + return target.countDiscardableCards(player, "e") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + es = target.getCards("e"), + val = 0; + for (var i of es) { + var eff = -(get.value(i, target) - 0.1) * att; + if (eff > val) val = eff; + } + return eff; + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.addExpose(0.15); + player.line(target, "green"); + player.discardPlayerCard(target, "e", true); + } else event.goto(5); + if (event.num < 3) event.finish(); + "step 3"; + if ( + !game.hasPlayer(function (current) { + return current.countDiscardableCards(player, "j") > 0; + }) + ) { + if (event.num < 3) event.finish(); + else event.goto(5); + } else + player + .chooseTarget("织纴:是否弃置一名角色判定区内的一张牌?", function (card, player, target) { + return target.countDiscardableCards(player, "j") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + es = target.getCards("j"), + val = 0; + for (var i of es) { + var eff = -get.effect(target, i, target, player); + if (eff > val) val = eff; + } + return eff; + }); + "step 4"; + if (result.bool) { + var target = result.targets[0]; + player.addExpose(0.15); + player.line(target, "green"); + player.discardPlayerCard(target, "j", true); + } + if (event.num < 3) event.finish(); + "step 5"; + player.recover(); + if (event.num < 4) event.finish(); + "step 6"; + player.draw(3); + }, + mod: { + aiOrder: function (player, card, num) { + if ( + player == _status.currentPhase && + !player.getHistory("useCard", function (evt) { + return evt.card.isCard; + }).length + ) + return num + Math.pow(get.translation(card.name).length, 2); + }, + }, + }, + yaner: { + audio: 2, + trigger: { + global: ["equipAfter", "addJudgeAfter", "loseAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + var current = _status.currentPhase; + if (!current || current == player || !current.isIn() || !current.isPhaseUsing()) return false; + var evt = event.getl(current); + return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; + }, + usable: 1, + logTarget: function () { + return _status.currentPhase; + }, + prompt2: "与该角色各摸两张牌", + check: function (event, player) { + return get.attitude(player, _status.currentPhase) > 0; + }, + content: function () { + "step 0"; + game.asyncDraw([_status.currentPhase, player], 2); + "step 1"; + var e1 = player.getHistory("gain", function (evt) { + return evt.getParent(2) == event; + })[0]; + if (e1 && e1.cards && e1.cards.length == 2 && get.type(e1.cards[0]) == get.type(e1.cards[1])) { + player.addTempSkill("yaner_zhiren", { player: "phaseBegin" }); + game.log(player, "修改了技能", "#g【织纴】"); + } + var target = _status.currentPhase; + if (target.isIn() && target.isDamaged()) { + var e2 = target.getHistory("gain", function (evt) { + return evt.getParent(2) == event; + })[0]; + if (e2 && e2.cards && e2.cards.length == 2 && get.type(e2.cards[0]) == get.type(e2.cards[1])) target.recover(); + } + "step 2"; + game.delayx(); + }, + subSkill: { + zhiren: { charlotte: true }, + }, + ai: { + expose: 0.5, + }, + }, + //杨婉 + youyan: { + audio: 2, + // trigger:{ + // player:'loseAfter', + // global:'loseAsyncAfter', + // }, + trigger: { + player: ["loseAfter", "equipAfter"], + global: ["loseAsyncAfter", "cardsDiscardAfter"], + }, + //usable:1, + prompt2: function (event, player) { + var cards2 = []; + if (event.name == "cardsDiscard") { + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evtx2 = evtx.relatedEvent || evtx.getParent(); + if (evtx2.name == "useCard" || evtx2.name == "respond") return false; + player.getHistory("lose", evtx3 => { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + if (!evtx3.cards2 || !evtx3.cards2.length) return false; + cards2.addArray(evtx3.cards2.filterInD("d")); + }); + } else if (event.name == "loseAsync") { + player.hasHistory("lose", evt => { + if (evt.getParent() != event || evt.position != ui.discardPile) return false; + cards2.addArray(evt.cards2.filterInD("d")); + }); + } else { + cards2.addArray(event.getd(player).filterInD("d")); + } + return "获得与" + get.translation(cards2) + "花色" + (cards2.length > 1 ? "各" : "") + "不相同的牌各一张"; + }, + filter: function (event, player) { + if (player != _status.currentPhase) return false; + var cards2 = []; + if (event.name == "cardsDiscard") { + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evtx2 = evtx.relatedEvent || evtx.getParent(); + if (evtx2.name == "useCard" || evtx2.name == "respond") return false; + player.getHistory("lose", evtx3 => { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + if (!evtx3.cards2 || !evtx3.cards2.length) return false; + cards2.addArray(evtx3.cards2.filterInD("d")); + }); + } else if (event.name == "loseAsync") { + player.hasHistory("lose", evt => { + if (evt.getParent() != event || evt.position != ui.discardPile) return false; + cards2.addArray(evt.cards2.filterInD("d")); + }); + } else { + cards2.addArray(event.getd(player).filterInD("d")); + } + if (!cards2.length) return false; + var list = []; + for (var i of cards2) { + list.add(get.suit(i, player)); + if (list.length >= lib.suit.length) return false; + } + var evt = event.getParent("phaseUse"); + if (evt && evt.player == player && !evt.youyaned) return true; + var evt = event.getParent("phaseDiscard"); + if (evt && evt.player == player && !evt.youyaned) return true; + return false; + }, + content: function () { + var evt = trigger.getParent("phaseUse"); + if (evt && evt.player == player) evt.youyaned = true; + else { + var evt = trigger.getParent("phaseDiscard"); + if (evt) evt.youyaned = true; + } + var list = [], + cards = []; + var cards2 = []; + if (trigger.name == "cardsDiscard") { + var evtx = trigger.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evtx2 = evtx.relatedEvent || evtx.getParent(); + if (evtx2.name == "useCard" || evtx2.name == "respond") return false; + player.getHistory("lose", evtx3 => { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + if (!evtx3.cards2 || !evtx3.cards2.length) return false; + cards2.addArray(evtx3.cards2.filterInD("d")); + }); + } else if (trigger.name == "loseAsync") { + player.hasHistory("lose", evt => { + if (evt.getParent() != trigger || evt.position != ui.discardPile) return false; + cards2.addArray(evt.cards2.filterInD("d")); + }); + } else { + cards2.addArray(trigger.getd(player).filterInD("d")); + } + for (var i of cards2) { + list.add(get.suit(i, player)); + } + for (var i of lib.suit) { + if (list.includes(i)) continue; + var card = get.cardPile2(function (card) { + return get.suit(card, false) == i; + }); + if (card) cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + }, + ai: { + effect: { + player_use: function (card, player, target) { + if ( + typeof card == "object" && + player == _status.currentPhase && + //(!player.storage.counttrigger||!player.storage.counttrigger.youyan)&& + player.needsToDiscard() == 1 && + card.cards && + card.cards.filter(function (i) { + return get.position(i) == "h"; + }).length > 0 && + !get.tag(card, "draw") && + !get.tag(card, "gain") && + !get.tag(card, "discard") + ) + return "zeroplayertarget"; + }, + }, + }, + }, + zhuihuan: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return !current.hasSkill("zhuihuan2_new"); + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("zhuihuan"), "令一名角色获得“追还”效果", function (card, player, target) { + return !target.hasSkill("zhuihuan2_new"); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkill("maixie") || target.hasSkill("maixie_defend")) att /= 3; + if (target != player) att /= Math.pow(game.players.length - get.distance(player, target, "absolute"), 0.7); + return att; + }) + .set("animate", false); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhuihuan"); + target.addTempSkill("zhuihuan2_new", { player: "phaseZhunbei" }); + game.delayx(); + } + }, + }, + zhuihuan2_new: { + trigger: { player: "phaseZhunbeiBegin" }, + charlotte: true, + forced: true, + onremove: true, + filter: function (event, player) { + if (player.storage.zhuihuan2_new) { + for (var source of player.storage.zhuihuan2_new) { + if (!source.isIn()) continue; + if (source.hp > player.hp) return true; + return source.countCards("h") > 0; + } + } + }, + logTarget: function (event, player) { + return player.storage.zhuihuan2_new.filter(function (target) { + return target.isIn(); + }); + }, + content: function () { + "step 0"; + event.targets = player.storage.zhuihuan2_new; + player.removeSkill("zhuihuan2_new"); + "step 1"; + var target = targets.shift(); + if (target.isIn()) { + if (target.hp > player.hp) target.damage(2); + else { + var hs = target.getCards("h"); + if (hs.length) target.discard(hs.randomGets(2)); + } + } + if (targets.length) event.redo(); + }, + group: "zhuihuan2_new_count", + subSkill: { + count: { + trigger: { player: "damage" }, + forced: true, + silent: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return get.itemtype(event.source) == "player"; + }, + content: function () { + player.markAuto("zhuihuan2_new", [trigger.source]); + }, + }, + }, + }, + zhuihuan2: { + trigger: { player: "damageEnd" }, + forced: true, + charlotte: true, + logTarget: "source", + filter: function (event, player) { + var source = event.source; + if (source.hp > player.hp) return true; + return source.countCards("h") > 0; + }, + content: function () { + if (player.hp < trigger.source.hp) trigger.source.damage(); + else trigger.source.discard(trigger.source.getCards("h").randomGet()); + }, + mark: true, + intro: { + content: "当你受到伤害后,若伤害来源体力值大于你,则你对其造成1点伤害,否则其随机弃置一张手牌", + }, + }, + //阮瑀 + xingzuo: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + frequent: true, + content: function () { + "step 0"; + player.addTempSkill("xingzuo2"); + var cards = get.bottomCards(3); + event.cards2 = cards; + game.cardsGotoOrdering(cards); + var next = player.chooseToMove("兴作:将三张牌置于牌堆底"); + var list = [["牌堆底", cards]], + hs = player.getCards("h"); + if (hs.length) { + list.push(["手牌", hs]); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + } + next.set("list", list); + next.set("processAI", function (list) { + var allcards = list[0][1].slice(0), + cards = []; + if (list.length > 1) { + allcards = allcards.concat(list[1][1]); + } + var canchoose = allcards.slice(0); + var player = _status.event.player; + var getv = function (button) { + if ( + button.name == "sha" && + allcards.filter(function (card) { + return ( + card.name == "sha" && + !cards.filter(function () { + return button == card; + }).length + ); + }).length > player.getCardUsable({ name: "sha" }) + ) + return 10; + return -player.getUseValue(button, player); + }; + while (cards.length < 3) { + canchoose.sort(function (a, b) { + return getv(b) - getv(a); + }); + cards.push(canchoose.shift()); + } + return [cards, canchoose]; + }); + "step 1"; + if (result.bool) { + event.forceDie = true; + var cards = result.moved[0]; + event.cards = cards; + player.storage.xingzuo2 = cards; + var hs = player.getCards("h"); + var lose = [], + gain = event.cards2; + for (var i of cards) { + if (hs.includes(i)) lose.push(i); + else gain.remove(i); + } + if (lose.length) player.lose(lose, ui.cardPile); + if (gain.length) player.gain(gain, "draw"); + } else event.finish(); + "step 2"; + for (var i of cards) { + if (!"hejsdx".includes(get.position(i, true))) { + i.fix(); + ui.cardPile.appendChild(i); + } + } + game.updateRoundNumber(); + }, + }, + xingzuo2: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return target.countCards("h") > 0; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(function (card, player, target) { + return target.countCards("h") > 0; + }, "兴作:是否令一名角色将其手牌与牌堆底的三张牌替换?") + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + hs = target.getCards("h"), + num = hs.length; + var getv = function (list, target) { + var num = 0; + for (var i of list) num += get.value(i, target); + return num; + }, + val = getv(hs, target) - getv(player.storage.xingzuo2, target); + if (num < 3) return att * Math.sqrt(Math.max(0, -val)) * 1.5; + if (num == 3) return -att * Math.sqrt(Math.max(0, val)); + if (player.hp < (num > 4 ? 3 : 2)) return 0; + return -att * Math.sqrt(Math.max(0, val)); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xingzuo", target); + var cards = get.bottomCards(3); + game.cardsGotoOrdering(cards); + var hs = target.getCards("h"); + target.lose(hs, ui.cardPile); + target.gain(cards, "draw"); + if (hs.length > 3) player.loseHp(); + } else event.finish(); + "step 2"; + game.updateRoundNumber(); + }, + }, + miaoxian: { + hiddenCard: function (player, name) { + return get.type(name) == "trick" && !player.hasSkill("miaoxian2") && player.countCards("h", { color: "black" }) == 1; + }, + enable: "chooseToUse", + filter: function (event, player) { + if (player.hasSkill("miaoxian2")) return false; + var cards = player.getCards("h", { color: "black" }); + if (cards.length != 1) return false; + var mod2 = game.checkMod(cards[0], player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; + for (var i of lib.inpile) { + if ( + get.type(i) == "trick" && + event.filterCard( + { + name: i, + cards: cards, + }, + player, + event + ) + ) + return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var cards = player.getCards("h", { color: "black" }); + var list = []; + for (var i of lib.inpile) { + if ( + get.type(i) == "trick" && + event.filterCard( + { + name: i, + cards: cards, + }, + player, + event + ) + ) { + list.push(["锦囊", "", i]); + } + } + return ui.create.dialog("妙弦", [list, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player; + return player.getUseValue({ name: button.link[2] }) + 1; + }, + backup: function (links, player) { + return { + audio: "miaoxian", + popname: true, + filterCard: { color: "black" }, + selectCard: -1, + position: "h", + viewAs: { + name: links[0][2], + }, + onuse: function (links, player) { + player.addTempSkill("miaoxian2"); + }, + }; + }, + prompt: function (links, player) { + return "将" + get.translation(player.getCards("h", { color: "black" })[0]) + "当做" + get.translation(links[0][2]) + "使用"; + }, + }, + group: "miaoxian_use", + subfrequent: ["use"], + subSkill: { + use: { + audio: "miaoxian", + trigger: { player: "loseAfter" }, + frequent: true, + prompt: "是否发动【妙弦】摸一张牌?", + filter: function (event, player) { + var evt = event.getParent(); + if (evt.name != "useCard") return false; + return event.hs && event.hs.length == 1 && event.cards && event.cards.length == 1 && get.color(event.hs[0], player) == "red" && !player.countCards("h", { color: "red" }); + }, + content: function () { + player.draw(); + }, + }, + backup: { + audio: "miaoxian", + }, + }, + ai: { + order: 12, + result: { + player: 1, + }, + }, + }, + miaoxian2: { + charlotte: true, + }, + //樊玉凤 + bazhan: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuanhuanji: true, + marktext: "☯", + mark: true, + intro: { + content: function (storage, player) { + return "出牌阶段限一次," + (storage ? "你可以获得一名其他角色的至多两张手牌。" : "你可以将至多两张手牌交给一名其他角色。") + "若以此法移动的牌包含【酒】或♥牌,则你可令得到牌的角色执行一项:①回复1点体力。②复原武将牌。"; + }, + }, + filter: function (event, player) { + if (player.storage.bazhan) { + return game.hasPlayer(function (current) { + return current != player && current.countGainableCards(player, "h") > 0; + }); + } + return player.countCards("h") > 0; + }, + filterCard: true, + discard: false, + lose: false, + selectCard: function () { + if (_status.event.player.storage.bazhan) return 0; + return [1, 2]; + }, + filterTarget: function (card, player, target) { + if (player == target) return false; + if (player.storage.bazhan) return target.countGainableCards(player, "h") > 0; + return true; + }, + prompt: function () { + if (_status.event.player.storage.bazhan) return "获得一名其他角色的至多两张手牌"; + return "将至多两张手牌交给一名其他角色"; + }, + delay: false, + check: function (card) { + var player = _status.event.player; + var bool1 = false, + bool2 = false; + for (var i of game.players) { + if (get.attitude(player, i) <= 0 || player == i) continue; + bool1 = true; + if (i.isDamaged() || i.isTurnedOver()) { + bool2 = true; + break; + } + } + if (bool2 && !ui.selected.cards.length && (get.suit(card, player) == "heart" || get.name(card, player) == "jiu")) return 10; + if (bool1) return 9 - get.value(card); + if (get.color(card) == "red") return 5 - get.value(card); + return 0; + }, + content: function () { + "step 0"; + if (player.storage.bazhan) { + event.recover = player; + player.gainPlayerCard(target, "h", true, "visibleMove", [1, 2]); + } else { + event.recover = target; + player.give(cards, target); + } + player.changeZhuanhuanji("bazhan"); + "step 1"; + var target = event.recover; + if (result.bool && result.cards && result.cards.length) { + cards = result.cards; + } + if ( + !cards || + !target || + !target.getCards("h").filter(function (i) { + return cards.includes(i); + }).length || + (function () { + for (var card of cards) { + if (get.suit(card, target) == "heart" || get.name(card, target) == "jiu") return false; + } + return true; + })() + ) { + event.finish(); + return; + } + var list = []; + event.addIndex = 0; + var str = get.translation(target); + if (target.isDamaged()) list.push("令" + str + "回复1点体力"); + else event.addIndex++; + if (target.isLinked() || target.isTurnedOver()) list.push("令" + get.translation(target) + "复原武将牌"); + if (!list.length) event.finish(); + else + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("ai", function () { + var evt = _status.event.getParent(); + if (get.attitude(evt.player, evt.target) < 0) return "cancel2"; + if (target.hp > 1 && target.isTurnedOver()) return 1 - evt.addIndex; + return 0; + }); + "step 2"; + if (result.control == "cancel2") event.finish(); + else if (result.index + event.addIndex == 0) { + event.recover.recover(); + event.finish(); + } else if (event.recover.isLinked()) event.recover.link(); + "step 3"; + if (event.recover.isTurnedOver()) event.recover.turnOver(); + }, + ai: { + order: 7, + result: { + target: function (player, target) { + if (player.storage.bazhan) return -1; + if (ui.selected.cards.length) { + var cards = ui.selected.cards, + card = cards[0]; + if (get.value(cards, target) < 0) return -0.5; + if (get.attitude(player, target) > 0) { + if ((target.isDamaged() || target.isTurnedOver()) && (get.suit(card, target) == "heart" || get.name(card, target) == "jiu")) return 3; + if (target.hasUseTarget(card) && target.getUseValue(card) > player.getUseValue(card, null, true)) return 1.4; + return 1; + } + } + return 0; + }, + }, + }, + }, + jiaoying: { + audio: 2, + trigger: { source: "gainEnd" }, + forced: true, + filter: function (event, player) { + if (player == event.player) return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length; + }, + logTarget: "player", + content: function () { + var target = trigger.player; + if (!target.storage.jiaoying2) target.storage.jiaoying2 = []; + var cs = trigger.getl(player).hs; + for (var i of cs) target.storage.jiaoying2.add(get.color(i, player)); + target.addTempSkill("jiaoying2"); + target.markSkill("jiaoying2"); + player.addTempSkill("jiaoying3"); + if (!player.storage.jiaoying3) player.storage.jiaoying3 = []; + player.storage.jiaoying3.add(target); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + var target = arg.target; + if (target.getStorage("jiaoying2").includes("red") && get.tag(arg.card, "respondShan") && !target.hasSkillTag("respondShan", true, null, true)) return true; + return false; + }, + }, + }, + jiaoying2: { + onremove: true, + charlotte: true, + mod: { + cardEnabled2: function (card, player) { + if (player.getStorage("jiaoying2").includes(get.color(card))) return false; + }, + }, + intro: { + content: "本回合内不能使用或打出$牌", + }, + }, + jiaoying3: { + onremove: true, + trigger: { global: "useCard1" }, + silent: true, + firstDo: true, + charlotte: true, + filter: function (event, player) { + return player.storage.jiaoying3.includes(event.player); + }, + content: function () { + while (player.storage.jiaoying3.includes(trigger.player)) player.storage.jiaoying3.remove(trigger.player); + if (!player.storage.jiaoying3.length) player.removeSkill("jiaoying3"); + }, + group: "jiaoying3_draw", + }, + jiaoying3_draw: { + trigger: { global: "phaseEnd" }, + direct: true, + charlotte: true, + filter: function (event, player) { + return ( + player.getStorage("jiaoying3").length > 0 && + game.hasPlayer(function (current) { + return current.countCards("h") < 5; + }) + ); + }, + content: function () { + "step 0"; + player.storage.jiaoying3.shift(); + player + .chooseTarget("醮影:令一名角色将手牌摸至五张", function (card, player, target) { + return target.countCards("h") < 5; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 2) { + return 5 - target.countCards("h"); + } + return att / 3; + }); + "step 1"; + if (result.bool) { + player.logSkill("jiaoying", result.targets); + for (var i = 0; i < result.targets.length; i++) { + result.targets[i].drawTo(5); + } + if (lib.skill.jiaoying3_draw.filter(null, player)) event.goto(0); + } + }, + }, + //郭照 + pianchong: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + "step 0"; + trigger.changeToZero(); + var cards = []; + var card1 = get.cardPile2(function (card) { + return get.color(card, false) == "red"; + }); + if (card1) cards.push(card1); + var card2 = get.cardPile2(function (card) { + return get.color(card, false) == "black"; + }); + if (card2) cards.push(card2); + if (cards.length) player.gain(cards, "gain2"); + "step 1"; + player + .chooseControl("red", "black") + .set("prompt", "偏宠:请选择一种颜色。直至你的下回合开始时,失去该颜色的一张牌后,从牌堆获得另一种颜色的一张牌。") + .set("ai", function () { + var red = 0, + black = 0; + var player = _status.event.player; + var cards = player.getCards("he"); + for (var i of cards) { + var add = 1; + var color = get.color(i, player); + if (get.position(i) == "e") add = 0.5; + else if (get.name(i, player) != "sha" && player.hasValueTarget(i)) add = 1.5; + if (color == "red") red += add; + else black += add; + } + if (black > red) return "black"; + return "red"; + }); + "step 2"; + player.storage.pianchong2 = result.control; + player.addTempSkill("pianchong2", { player: "phaseBeginStart" }); + player.popup(result.control, result.control == "red" ? "fire" : "thunder"); + game.log(player, "声明了", "#y" + get.translation(result.control)); + }, + ai: { + threaten: 4.8, + }, + }, + pianchong2: { + audio: "pianchong", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + for (var i of evt.cards2) { + if (get.color(i, player) == player.storage.pianchong2) return true; + } + return false; + }, + content: function () { + "step 0"; + var num = trigger.getl(player).cards2.filter(function (card) { + return get.color(card, player) == player.storage.pianchong2; + }).length; + var cards = []; + while (num--) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && get.color(card, false) != player.storage.pianchong2; + }); + if (card) cards.push(card); + else break; + } + if (cards.length) player.gain(cards, "gain2"); + }, + mark: true, + intro: { + content: "失去一张$牌后,从牌堆中获得一张与此牌颜色不同的牌", + }, + }, + zunwei: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + let storage = player.getStorage("zunwei"); + return ( + storage.length < 3 && + game.hasPlayer(current => { + return (player.isDamaged() && current.getHp() > player.getHp() && !storage.includes(0)) || (current.countCards("h") > player.countCards("h") && !storage.includes(1)) || (current.countCards("e") > player.countCards("e") && !storage.includes(2)); + }) + ); + }, + chooseButton: { + dialog: function (event, player) { + var list = ["选择体力值大于你的一名角色", "选择手牌数大于你的一名角色", "选择装备数大于你的一名角色"]; + var choiceList = ui.create.dialog("尊位:请选择一项", "forcebutton", "hidden"); + choiceList.add([ + list.map((item, i) => { + if (player.getStorage("zunwei").includes(i)) item = `${item}`; + return [i, item]; + }), + "textbutton", + ]); + return choiceList; + }, + filter: function (button) { + const player = get.player(); + if (player.getStorage("zunwei").includes(button.link)) return false; + if (button.link == 0) { + if (!player.isDamaged()) return false; + return game.hasPlayer(current => { + return current.getHp() > player.getHp(); + }); + } + if (button.link == 1) { + return game.hasPlayer(current => { + return current.countCards("h") > player.countCards("h"); + }); + } + if (button.link == 2) { + return game.hasPlayer(current => { + return current.countCards("e") > player.countCards("e"); + }); + } + }, + backup: function (links) { + var next = get.copy(lib.skill.zunwei.backups[links[0]]); + next.audio = "zunwei"; + next.filterCard = function () { + return false; + }; + next.selectCard = -1; + return next; + }, + check: function (button) { + var player = _status.event.player; + switch (button.link) { + case 0: { + var target = game.findPlayer(function (current) { + return current.isMaxHp(); + }); + return (Math.min(target.hp, player.maxHp) - player.hp) * 2; + } + case 1: { + var target = game.findPlayer(function (current) { + return current.isMaxHandcard(); + }); + return Math.min(5, target.countCards("h") - player.countCards("h")) * 0.8; + } + case 2: { + var target = game.findPlayer(function (current) { + return current.isMaxEquip(); + }); + return (target.countCards("e") - player.countCards("e")) * 1.4; + } + } + }, + prompt: function (links) { + return ["选择一名体力值大于你的其他角色,将体力值回复至与其相同", "选择一名手牌数大于你的其他角色,将手牌数摸至与其相同", "选择一名装备区内牌数大于你的其他角色,依次使用牌堆中的装备牌,直到装备数与其相同"][links[0]]; + }, + }, + backups: [ + { + filterTarget: function (card, player, target) { + if (player.isHealthy()) return false; + return target.hp > player.hp; + }, + content: function () { + player.recover(target.hp - player.hp); + if (!player.storage.zunwei) player.storage.zunwei = []; + player.storage.zunwei.add(0); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return Math.min(target.hp, player.maxHp) - player.hp; + }, + }, + }, + }, + { + filterTarget: function (card, player, target) { + return target.countCards("h") > player.countCards("h"); + }, + content: function () { + player.draw(Math.min(5, target.countCards("h") - player.countCards("h"))); + if (!player.storage.zunwei) player.storage.zunwei = []; + player.storage.zunwei.add(1); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return Math.min(5, target.countCards("h") - player.countCards("h")); + }, + }, + }, + }, + { + filterTarget: function (card, player, target) { + return target.countCards("e") > player.countCards("e"); + }, + content: function () { + "step 0"; + if (!player.storage.zunwei) player.storage.zunwei = []; + player.storage.zunwei.add(2); + event.num = 1; + "step 1"; + var type = "equip" + num; + if (!player.hasEmptySlot(type)) return; + var card = get.cardPile2(function (card) { + return get.subtype(card, false) == type && player.canUse(card, player); + }); + if (card) player.chooseUseTarget(card, true).nopopup = true; + "step 2"; + event.num++; + if (event.num <= 5 && target.isIn() && player.countCards("e") < target.countCards("e")) event.goto(1); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return target.countCards("e") - player.countCards("e"); + }, + }, + }, + }, + ], + ai: { + order: 10, + result: { + player: 1, + }, + }, + }, + //辛宪英 + rezhongjian: { + enable: "phaseUse", + audio: "zhongjian", + usable: 2, + filter: function (event, player) { + if (player.getStat().skill.rezhongjian && !player.hasSkill("recaishi2")) return false; + return game.hasPlayer(function (current) { + return lib.skill.rezhongjian.filterTarget(null, player, current); + }); + }, + filterTarget: function (card, player, target) { + if (!player.storage.rezhongjian2) return true; + return !player.storage.rezhongjian2[0].includes(target) && !player.storage.rezhongjian2[1].includes(target); + }, + content: function () { + "step 0"; + player + .chooseControl() + .set("prompt", "忠鉴:为" + get.translation(target) + "选择获得一项效果") + .set("choiceList", ["令其于下回合开始前首次造成伤害后弃置两张牌", "令其于下回合开始前首次受到伤害后摸两张牌"]) + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.getParent().target) > 0 ? 1 : 0; + }); + "step 1"; + player.addTempSkill("rezhongjian2", { player: "phaseBeginStart" }); + //var str=['造成伤害弃牌','受到伤害摸牌'][result.index]; + //player.popup(str,['fire','wood'][result.index]); + //game.log(player,'选择了','#y'+str) + player.storage.rezhongjian2[result.index].push(target); + player.markSkill("rezhongjian2"); + }, + ai: { + order: 10, + expose: 0, + result: { + player: function (player, target) { + if (get.attitude(player, target) == 0) return false; + var sgn = get.sgn((get.realAttitude || get.attitude)(player, target)); + if ( + game.countPlayer(function (current) { + return get.sgn((get.realAttitude || get.attitude)(player, current)) == sgn; + }) <= + game.countPlayer(function (current) { + return get.sgn((get.realAttitude || get.attitude)(player, current)) != sgn; + }) + ) + return 1; + return 0.9; + }, + }, + }, + }, + rezhongjian2: { + trigger: { + global: ["damageSource", "damageEnd"], + }, + forced: true, + filter: function (event, player, name) { + var num = name == "damageSource" ? 0 : 1; + var logTarget = name == "damageSource" ? event.source : event.player; + return logTarget && logTarget.isIn() && player.storage.rezhongjian2[num].includes(logTarget); + }, + logTarget: function (event, player, name) { + return name == "damageSource" ? event.source : event.player; + }, + content: function () { + var num = event.triggername == "damageSource" ? 0 : 1; + var target = event.triggername == "damageSource" ? trigger.source : trigger.player; + var storage = player.storage.rezhongjian2; + storage[num].remove(target); + if (storage[0].length + storage[1].length) player.markSkill("rezhongjian2"); + else player.removeSkill("rezhongjian2"); + target[event.triggername == "damageSource" ? "chooseToDiscard" : "draw"](2, true, "he"); + player.draw(); + }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = [[], []]; + }, + onremove: true, + intro: { + markcount: function (storage) { + return storage[0].length + storage[1].length; + }, + mark: function (dialog, storage, player) { + if (player == game.me || player.isUnderControl()) { + if (storage[0].length) { + dialog.addText("弃牌"); + dialog.add([storage[0], "player"]); + } + if (storage[1].length) { + dialog.addText("摸牌"); + dialog.add([storage[1], "player"]); + } + } else { + var list = storage[0].concat(storage[1]).sortBySeat(player); + dialog.add([list, "player"]); + } + }, + }, + }, + recaishi: { + trigger: { player: "phaseDrawEnd" }, + direct: true, + audio: "caishi", + isSame: function (event) { + var cards = []; + event.player.getHistory("gain", function (evt) { + if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == event) cards.addArray(evt.cards); + }); + if (!cards.length) return "nogain"; + var list = []; + for (var i = 0; i < cards.length; i++) { + list.add(get.suit(cards[i])); + } + if (list.length == 1) return true; + if (list.length == cards.length) return false; + return "nogain"; + }, + filter: function (event, player) { + var isSame = lib.skill.recaishi.isSame(event); + if (isSame == "nogain") return false; + return isSame || player.isDamaged(); + }, + content: function () { + "step 0"; + if (lib.skill.recaishi.isSame(trigger)) { + player.logSkill("recaishi"); + player.addTempSkill("recaishi2"); + event.finish(); + return; + } + player.chooseBool(get.prompt("recaishi"), "回复1点体力,然后本回合内不能对自己使用牌").set("ai", function () { + if (player.countCards("h", "tao")) return false; + if (player.hp < 2) return true; + return ( + player.countCards("h", function (card) { + var info = get.info(card); + return info && (info.toself || info.selectTarget == -1) && player.canUse(card, player) && player.getUseValue(card) > 0; + }) == 0 + ); + }); + "step 1"; + if (result.bool) { + player.logSkill("recaishi"); + player.recover(); + player.addTempSkill("recaishi3"); + } + }, + }, + recaishi2: {}, + recaishi3: { + mod: { + targetEnabled: function (card, player, target) { + if (player == target) return false; + }, + }, + mark: true, + intro: { content: "本回合内不能对自己使用牌" }, + }, + //刘辩 + shiyuan: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + frequent: true, + filter: function (event, player) { + var num = 1; + if (_status.currentPhase && _status.currentPhase != player && _status.currentPhase.group == "qun" && player.hasZhuSkill("yuwei", _status.currentPhase)) num = 2; + return ( + player != event.player && + player.getHistory("gain", function (evt) { + return evt.getParent(2).name == "shiyuan" && evt.cards.length == 2 + get.sgn(event.player.hp - player.hp); + }).length < num + ); + }, + content: function () { + player.draw(2 + get.sgn(trigger.player.hp - player.hp)); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.itemtype(player) !== "player" || player === target) return 1; + let num = 1, + ds = 2 + get.sgn(player.hp - target.hp); + if (player === _status.currentPhase && _status.currentPhase.group === "qun" && target.hasZhuSkill("yuwei", player)) num = 2; + if ( + target.getHistory("gain", function (evt) { + return evt.getParent(2).name === "shiyuan" && evt.cards.length === ds; + }).length >= num + ) + return 1; + let name = get.name(card); + if (get.tag(card, "lose") || name === "huogong" || name === "juedou" || name === "tiesuo") return [1, ds]; + if (!target.hasFriend()) return 1; + return [1, 0.8 * ds]; + }, + }, + }, + }, + dushi: { + audio: 2, + global: "dushi2", + locked: true, + trigger: { player: "die" }, + forceDie: true, + direct: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return game.hasPlayer(current => current != player); + }, + content: function () { + "step 0"; + player + .chooseTarget("请选择【毒逝】的目标", "选择一名其他角色,令其获得技能【毒逝】", true, lib.filter.notMe) + .set("forceDie", true) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dushi", target); + target.markSkill("dushi"); + target.addSkills("dushi"); + } + }, + intro: { content: "您已经获得弘农王的诅咒" }, + }, + dushi2: { + mod: { + cardSavable: function (card, player, target) { + if (card.name == "tao" && target != player && target.hasSkill("dushi")) return false; + }, + }, + }, + yuwei: { + audio: 2, + trigger: { player: "shiyuanBegin" }, + filter: function (event, player) { + return _status.currentPhase.group == "qun"; + }, + zhuSkill: true, + forced: true, + content: function () {}, + ai: { combo: "shiyuan" }, + }, + //新岩泽(划掉)留赞 + refenyin: { + audio: 2, + audioname: ["wufan"], + trigger: { global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"] }, + forced: true, + filter: function (event, player) { + if (player != _status.currentPhase) return false; + var cards = event.getd(); + if (!cards.length) return false; + var list = []; + var num = cards.length; + for (var i = 0; i < cards.length; i++) { + var card = cards[i]; + list.add(get.suit(card, false)); + } + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" && evt.name != "cardsDiscard") return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + if (evt == event || evt.getParent() == event) return false; + num += evt.cards.length; + for (var i = 0; i < evt.cards.length; i++) { + var card = evt.cards[i]; + list.remove(get.suit(card, evt.cards2 && evt.cards2.includes(card) ? evt.player : false)); + } + }); + player.storage.refenyin_mark2 = num; + return list.length > 0; + }, + content: function () { + var list = []; + var list2 = []; + var cards = trigger.getd(); + for (var i = 0; i < cards.length; i++) { + var card = cards[i]; + var suit = get.suit(card, false); + list.add(suit); + list2.add(suit); + } + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" && evt.name != "cardsDiscard") return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + if (evt == trigger || evt.getParent() == trigger) return false; + for (var i = 0; i < evt.cards.length; i++) { + var card = evt.cards[i]; + var suit = get.suit(card, false); + list.remove(suit); + list2.add(suit); + } + }); + list2.sort(); + player.draw(list.length); + player.storage.refenyin_mark = list2; + player.addTempSkill("refenyin_mark"); + player.markSkill("refenyin_mark"); + }, + subSkill: { + mark: { + onremove: function (player) { + delete player.storage.refenyin_mark; + delete player.storage.refenyin_mark2; + }, + intro: { + content: function (s, p) { + var str = "本回合已经进入过弃牌堆的卡牌的花色:"; + for (var i = 0; i < s.length; i++) { + str += get.translation(s[i]); + } + str += "
    本回合进入过弃牌堆的牌数:"; + str += p.storage.refenyin_mark2; + return str; + }, + }, + }, + }, + }, + liji: { + enable: "phaseUse", + audio: 2, + filter: function (event, player) { + return (player.getStat().skill.liji || 0) < (event.liji_num || 0); + }, + onChooseToUse: function (event) { + if (game.online) return; + var num = 0; + var evt2 = event.getParent(); + if (!evt2.liji_all) evt2.liji_all = game.players.length > 4 ? 8 : 4; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name == "cardsDiscard" || (evt.name == "lose" && evt.position == ui.discardPile)) num += evt.cards.length; + }); + event.set("liji_num", Math.floor(num / evt2.liji_all)); + }, + filterCard: true, + position: "he", + check: function (card) { + var val = get.value(card); + if (!_status.event.player.getStorage("refenyin_mark").includes(get.suit(card))) return 12 - val; + return 8 - val; + }, + filterTarget: lib.filter.notMe, + content: function () { + target.damage("nocard"); + }, + ai: { + order: 1, + result: { + target: -1.5, + }, + tag: { + damage: 1, + }, + }, + }, + //文鸯 + xinlvli: { + audio: "lvli", + trigger: { player: "damageEnd", source: "damageSource" }, + filter: function (event, player, name) { + var stat = player.getStat().skill; + if (!stat.xinlvli) stat.xinlvli = 0; + if (name == "damageEnd" && !player.storage.beishui) return false; + if (stat.xinlvli > 1) return false; + if (stat.xinlvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false; + if (player.hp == player.countCards("h")) return false; + if (player.hp < player.countCards("h") && player.isHealthy()) return false; + return true; + }, + content: function () { + var stat = player.getStat().skill; + stat.xinlvli++; + var num = player.hp - player.countCards("h"); + if (num > 0) player.draw(num); + else player.recover(-num); + }, + //group:'lvli3', + }, + lvli: { + audio: 2, + init: function (player, skill) { + player.storage[skill] = 0; + }, + enable: "chooseToUse", + filter: function (event, player) { + if (player.storage.lvli > 1) return false; + if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false; + return event.type != "wuxie" && event.type != "respondShan"; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if (name == "wuxie") continue; + if (name == "sha") { + list.push(["基本", "", "sha"]); + list.push(["基本", "", "sha", "fire"]); + list.push(["基本", "", "sha", "thunder"]); + } else if (get.type(name) == "trick") list.push(["锦囊", "", name]); + else if (get.type(name) == "basic") list.push(["基本", "", name]); + } + return ui.create.dialog(event.lvli6 ? get.prompt("lvli") : "膂力", [list, "vcard"]); + }, + filter: function (button, player) { + var evt = _status.event.getParent(); + if (evt && typeof evt.filterCard == "function") return evt.filterCard({ name: button.link[2] }, player, evt); + return lib.filter.filterCard({ name: button.link[2], isCard: true }, player, _status.event.getParent()); + }, + check: function (button) { + var player = _status.event.player; + if (player.countCards("h", button.link[2])) return 0; + if (_status.event.getParent().type != "phase" && !_status.event.getParent().lvli6) return 1; + return player.getUseValue({ name: button.link[2], isCard: true }); + }, + backup: function (links, player) { + return { + filterCard: function () { + return false; + }, + audio: "lvli", + selectCard: -1, + check: function (card) { + return 1; + }, + viewAs: { name: links[0][2], nature: links[0][3], isCard: true }, + }; + }, + prompt: function (links, player) { + return "请选择" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "的目标"; + }, + }, + ai: { + order: 4, + result: { + player: 1, + }, + threaten: 2.9, + fireAttack: true, + }, + group: ["lvli2", "lvli3", "lvli4", "lvli5", "lvli6"], + }, + lvli2: { + trigger: { player: ["useCardBefore", "respondBefore"] }, + forced: true, + popup: false, + priority: 35, + filter: function (event, player) { + return event.skill == "lvli_backup" || event.skill == "lvli5" || event.skill == "lvli4"; + }, + content: function () { + "step 0"; + player.logSkill("lvli"); + player.storage.lvli++; + player.popup(trigger.card.name, trigger.name == "useCard" ? "metal" : "wood"); + "step 1"; + var random = 0.5 + player.countCards("e") * 0.1; + if (get.isLuckyStar(player)) random = 1; + if (random >= Math.random()) { + player.popup("洗具"); + } else { + player.popup("杯具"); + trigger.cancel(); + if (!trigger.getParent().lvli6) { + trigger.getParent().goto(0); + } + game.broadcastAll( + function (str) { + var dialog = ui.create.dialog(str); + dialog.classList.add("center"); + setTimeout(function () { + dialog.close(); + }, 1000); + }, + get.translation(player) + "声明的" + get.translation(trigger.card.name) + "并没有生效" + ); + game.log("然而什么都没有发生"); + game.delay(2); + } + }, + }, + lvli3: { + trigger: { global: "phaseBefore" }, + forced: true, + silent: true, + popup: false, + content: function () { + player.storage.lvli = 0; + }, + }, + lvli4: { + log: false, + enable: "chooseToUse", + viewAsFilter: function (player) { + if (player.storage.lvli > 1) return false; + if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false; + return true; + }, + filterCard: function () { + return false; + }, + selectCard: -1, + viewAs: { name: "shan" }, + ai: { + skillTagFilter: function (player) { + if (player.storage.lvli > 1) return false; + if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false; + return true; + }, + threaten: 1.5, + respondShan: true, + }, + }, + lvli5: { + log: false, + enable: "chooseToUse", + viewAsFilter: function (player) { + if (player.storage.lvli > 1) return false; + if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false; + return true; + }, + filterCard: function () { + return false; + }, + selectCard: -1, + viewAs: { name: "wuxie" }, + }, + lvli6: { + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + if (!player.storage.beishui) return false; + if (player.storage.lvli > 1) return false; + if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false; + return true; + }, + content: function () { + var next = player.chooseToUse(); + next.set("norestore", true); + next.set("_backupevent", "lvli"); + next.backup("lvli"); + next.set("lvli6", true); + }, + }, + choujue: { + derivation: ["beishui", "qingjiao"], + trigger: { global: "phaseAfter" }, + audio: 2, + skillAnimation: true, + animationColor: "water", + unique: true, + juexingji: true, + forced: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = false; + }, + filter: function (event, player) { + if (player.storage.choujue) return false; + return Math.abs(player.hp - player.countCards("h")) >= 3; + }, + content: function () { + player.awakenSkill("choujue"); + player.storage.choujue = true; + player.loseMaxHp(); + player.addSkills("beishui"); + }, + }, + beishui: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: 2, + skillAnimation: "epic", + animationColor: "thunder", + unique: true, + juexingji: true, + forced: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = false; + }, + filter: function (event, player) { + if (player.storage.beishui) return false; + return Math.min(player.hp, player.countCards("h")) < 2; + }, + content: function () { + player.awakenSkill("beishui"); + player.storage.beishui = true; + player.loseMaxHp(); + player.addSkills("qingjiao"); + }, + }, + qingjiao: { + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + if (!ui.cardPile.hasChildNodes() && !ui.discardPile.hasChildNodes()); + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of hs) { + if (!lib.filter.cardDiscardable(i, player, "qingjiao")) return false; + } + return true; + }, + //check:function(event,player){ + // return player.countCards('h')<=player.hp; + //}, + content: function () { + "step 0"; + player.chooseToDiscard(true, "h", player.countCards("h")); + "step 1"; + var evt = trigger.getParent(); + if (evt && evt.getParent && !evt.qingjiao) { + evt.qingjiao = true; + var next = game.createEvent("qingjiao_discard", false, evt.getParent()); + next.player = player; + next.setContent(function () { + var hs = player.getCards("he"); + if (hs.length) player.discard(hs); + }); + } + "step 2"; + var list = []; + var typelist = []; + var getType = function (card) { + var sub = get.subtype(card); + if (sub) return sub; + return card.name; + }; + for (var i = 0; i < ui.cardPile.childElementCount; i++) { + var node = ui.cardPile.childNodes[i]; + var typex = getType(node); + if (!typelist.includes(typex)) { + list.push(node); + typelist.push(typex); + if (list.length >= 8) break; + } + } + if (list.length < 8) { + for (var i = 0; i < ui.discardPile.childElementCount; i++) { + var node = ui.discardPile.childNodes[i]; + var typex = getType(node); + if (!typelist.includes(typex)) { + list.push(node); + typelist.push(typex); + if (list.length >= 8) break; + } + } + } + player.gain(list, "gain2"); + }, + }, + //王双 + spzhuilie: { + mod: { + targetInRange: function (card) { + if (card.name == "sha") return true; + }, + }, + trigger: { player: "useCardToTargeted" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && !player.inRange(event.target); + }, + forced: true, + logTarget: "target", + content: function () { + "step 0"; + player.judge(function (card) { + var type = get.subtype(card); + return ["equip1", "equip4", "equip3", "equip6"].includes(type) ? 6 : -6; + // switch(type){ + // case 'equip':return 4; + // case 'trick':return -4; + // default:return 0; + // } + }).judge2 = function (result) { + return result.bool; + }; + "step 1"; + if (trigger.getParent().addCount !== false) { + trigger.getParent().addCount = false; + var stat = player.getStat(); + if (stat && stat.card && stat.card.sha) stat.card.sha--; + } + if (result.bool === true) { + var map = trigger.customArgs; + var id = trigger.target.playerid; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; + map[id].extraDamage += trigger.target.hp - 1; + } else if (result.bool === false) player.loseHp(); + }, + }, + spzhuilie2: { + onremove: true, + intro: { + content: "使用【杀】的次数上限+#", + }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("spzhuilie2"); + }, + }, + }, + //花鬘 + manyi: { + audio: 2, + audioname: ["mengyou", "menghuo", "zhurong"], + trigger: { target: "useCardToBefore" }, + filter: function (event, player) { + return event.card.name == "nanman"; + }, + forced: true, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: function (card) { + if (card.name == "nanman") return "zerotarget"; + }, + }, + }, + group: "manyi_single", + subSkill: { + single: { + trigger: { + player: "enterGame", + global: "gameDrawAfter", + }, + filter: function (event, player) { + return get.mode() == "single" && _status.mode == "normal"; + }, + direct: true, + content: function () { + player.chooseUseTarget("nanman", get.prompt("manyi"), "视为使用一张【南蛮入侵】").logSkill = "manyi"; + }, + }, + }, + }, + mansi: { + audio: 2, + group: "mansi_viewas", + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return event.card && event.card.name == "nanman"; + }, + frequent: true, + content: function () { + player.draw(); + player.addMark("mansi", 1, false); + }, + intro: { content: "已因此技能得到了#张牌" }, + }, + mansi_viewas: { + audio: "mansi", + position: "h", + enable: "phaseUse", + usable: 1, + filterCard: true, + selectCard: -1, + filter: function (event, player) { + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i = 0; i < hs.length; i++) { + var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; + } + return true; + }, + viewAs: { name: "nanman" }, + ai: { + order: 0.1, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && !player.getStat("skill").mansi_viewas && player.hasCard(card => get.name(card) !== "tao", "h"); + }, + }, + }, + souying: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + direct: true, + filter: function (event, player, name) { + if (!player.countCards("he") || player.hasSkill("souying2")) return false; + if (!event.targets || event.targets.length != 1 || event.player == event.target) return false; + if (event.card.name != "sha" && get.type(event.card) != "trick") return false; + if (name == "useCardToPlayered") { + if (!event.cards.filterInD().length) return false; + var target = event.target; + return ( + player + .getHistory("useCard", function (evt) { + return evt.targets && evt.targets.includes(target); + }) + .indexOf(event.getParent()) > 0 + ); + } else { + var source = event.player; + return ( + source + .getHistory("useCard", function (evt) { + return evt.targets && evt.targets.includes(player); + }) + .indexOf(event.getParent()) > 0 + ); + } + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard("he"); + var prompt; + if (event.triggername == "useCardToTargeted") { + event.target = trigger.player; + prompt = "令" + get.translation(trigger.card) + "对你无效"; + next.set("goon", -get.effect(player, trigger.card, trigger.player, player)); + } else { + event.target = trigger.targets[0]; + prompt = "弃置一张牌,并获得" + get.translation(trigger.cards.filterInD()); + next.set("goon", get.value(trigger.cards.filterInD())); + } + next.set("prompt", get.prompt("souying", event.target)); + next.set("prompt2", prompt); + next.set("ai", function (card) { + return _status.event.goon - get.value(card); + }); + next.set("logSkill", ["souying", event.target]); + "step 1"; + if (result.bool) { + player.addTempSkill("souying2"); + if (event.triggername == "useCardToPlayered") player.gain(trigger.cards.filterInD(), "gain2"); + else trigger.excluded.add(player); + } + }, + ai: { + expose: 0.25, + }, + }, + souying2: {}, + zhanyuan: { + unique: true, + audio: 2, + derivation: "hmxili", + skillAnimation: true, + animationColor: "soil", + juexingji: true, + forced: true, + filter: function (event, player) { + return player.countMark("mansi") > 7; + }, + trigger: { player: "phaseZhunbeiBegin" }, + content: function () { + "step 0"; + player.awakenSkill("zhanyuan"); + player.gainMaxHp(); + player.recover(); + "step 1"; + player.chooseTarget("是否失去〖蛮嗣〗,令一名其他男性角色和自己一同获得技能〖系力〗?", function (card, player, target) { + return target != player && target.hasSex("male"); + }).ai = function (target) { + return get.attitude(_status.event.player, target); + }; + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.changeSkills(["hmxili"], ["mansi"]); + target.addSkills("hmxili"); + } + }, + ai: { + combo: "mansi", + }, + }, + hmxili: { + trigger: { global: "damageBegin1" }, + direct: true, + audio: 2, + filter: function (event, player) { + return event.source && event.source != player && event.source == _status.currentPhase && event.source.hasSkill("hmxili") && !event.player.hasSkill("hmxili") && player.countCards("he") > 0 && !player.hasSkill("hmxili2"); + }, + content: function () { + "step 0"; + player.chooseToDiscard("是否弃置一张牌,令" + get.translation(trigger.source) + "对" + get.translation(trigger.player) + "的伤害+1,且你与其各摸两张牌?", "he").set("logSkill", ["hmxili", trigger.player]).ai = function (card) { + return 9 - get.value(card); + }; + "step 1"; + if (result.bool) { + game.asyncDraw([trigger.source, player], 2); + trigger.num++; + player.addTempSkill("hmxili2"); + } else event.finish(); + "step 2"; + game.delayx(); + }, + }, + hmxili2: {}, + //吴兰雷铜 + wlcuorui: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + if (!["identity", "guozhan"].includes(get.mode())) { + return game.hasPlayer(function (current) { + return current.isFriendOf(player) && current.countDiscardableCards(player, "hej") > 0; + }); + } + return game.hasPlayer(current => { + return get.distance(player, current) <= 1 && current.countDiscardableCards(player, "hej") > 0; + }); + }, + content: function () { + "step 0"; + if (!["identity", "guozhan"].includes(get.mode())) { + player + .chooseTarget(function (card, player, target) { + return target.isFriendOf(player) && target.countDiscardableCards(player, "hej") > 0; + }, get.prompt2("wlcuorui")) + .set("ai", function (target) { + if ( + target.countCards("e", function (card) { + return card.name != "tengjia" && get.value(card, target) <= 0; + }) + ) + return 10; + if ( + target.countCards("j", function (card) { + return get.effect(target, { name: card.viewAs || card.name }, target, target) < 0; + }) + ) + return 10; + return Math.random() + 0.2 - 1 / target.countCards("hej"); + }); + } else { + player + .chooseTarget(function (card, player, target) { + return get.distance(player, target) <= 1 && target.countDiscardableCards(player, "hej") > 0; + }, get.prompt2("wlcuorui")) + .set("ai", function (target) { + if ( + game.hasPlayer(current => { + return current != target && get.attitude(_status.event.player, current) < 0; + }) + ) + return get.effect(target, { name: "guohe" }, player, player) + 10; + return 0; + }); + } + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("wlcuorui", target); + player.discardPlayerCard(target, "hej", true); + if (["identity", "guozhan"].includes(get.mode())) event.goto(7); + } else event.finish(); + "step 2"; + if (!result.cards || !result.cards.length) { + event.finish(); + return; + } + var color = get.color(result.cards[0], result.cards[0].original == "j" ? false : target); + event.color = color; + var list = []; + if ( + game.hasPlayer(function (current) { + return (get.mode() == "versus" ? current.isEnemyOf(player) : current != player && current != target) && current.countCards("h"); + }) + ) + list.push("展示手牌"); + if ( + game.hasPlayer(function (current) { + return (get.mode() == "versus" ? current.isEnemyOf(player) : current != player && current != target) && current.countCards("e", { color: color }); + }) + ) + list.push("弃置装备"); + if (!list.length) { + event.finish(); + return; + } + if (list.length == 1) event._result = { control: list[0] }; + else + player + .chooseControl(list) + .set("prompt", "挫锐:展示对手的至多两张手牌,或弃置对手装备区内至多两张" + get.translation(color) + "牌") + .set("ai", function () { + var player = _status.event.player; + var color = _status.event.getParent().color; + if ( + game.countPlayer(function (current) { + if (!current.isEnemyOf(player)) return false; + return current.countCards("e", function (card) { + return get.color(card) == color && get.value(card) > 0; + }); + }) > 1 + ) + return 1; + return 0; + }); + "step 3"; + if (result.control == "弃置装备") event.goto(5); + else { + var dialog = ["请选择要展示的牌"]; + var list = game + .filterPlayer(function (current) { + return current.isEnemyOf(player) && current.countCards("h"); + }) + .sortBySeat(); + for (var i of list) { + dialog.push('
    ' + get.translation(i) + "
    "); + if (player.hasSkillTag("viewHandcard", null, i, true)) dialog.push(i.getCards("h")); + else dialog.push([i.getCards("h"), "blank"]); + } + player + .chooseButton([1, 2], true) + .set("createDialog", dialog) + .set("ai", function (button) { + var color = get.color(button.link) == _status.event.getParent().color; + return color ? Math.random() : 0.35; + }); + } + "step 4"; + player.showCards(result.links); + var map = {}; + var map2 = {}; + for (var i of result.links) { + var id = get.owner(i).playerid; + if (!map[id]) map[id] = []; + map[id].push(i); + if (get.color(i) != event.color) continue; + if (!map2[id]) map2[id] = []; + map2[id].push(i); + } + for (var i in map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + if (map2[i]) player.gain(map2[i], source, "bySelf", "give"); + player.line(source); + game.log(player, "展示了", source, "的", map[i]); + } + event.next.sort(function (a, b) { + return lib.sort.seat(a.source || a.player, b.source || b.player); + }); + event.finish(); + "step 5"; + var dialog = ["请选择要弃置的牌"]; + var list = game + .filterPlayer(function (current) { + return ( + current.isEnemyOf(player) && + current.countCards("e", function (card) { + return get.color(card) == event.color; + }) + ); + }) + .sortBySeat(); + for (var i of list) { + dialog.push('
    ' + get.translation(i) + "
    "); + dialog.push( + i.getCards("e", function (card) { + return get.color(card) == event.color; + }) + ); + } + player + .chooseButton([1, 2], true) + .set("createDialog", dialog) + .set("ai", function (button) { + var owner = get.owner(button.link); + return get.value(button.link, owner); + }); + "step 6"; + var map = {}; + for (var i of result.links) { + if (get.color(i) != event.color) continue; + var id = get.owner(i).playerid; + if (!map[id]) map[id] = []; + map[id].push(i); + } + for (var i in map) { + (_status.connectMode ? lib.playerOL : game.playerMap)[i].discard(map[i], "notBySelf").discarder = player; + } + event.next.sort(function (a, b) { + return lib.sort.seat(a.player, b.player); + }); + event.finish(); + "step 7"; + if (!result.cards || !result.cards.length) { + event.finish(); + return; + } + if ( + game.hasPlayer(current => { + return current.countCards("he") > 0 && current != player && current != target; + }) + ) { + var color = get.color(result.cards[0], result.cards[0].original == "j" ? false : target); + event.color = color; + var next = player.chooseTarget(true, "挫锐:选择另一名其他角色", "弃置该角色装备区里至多两张" + get.translation(event.color) + "牌;或展示该角色的至多两张手牌,然后获得其中的" + get.translation(event.color) + "牌"); + next.set("filterTarget", (card, player, target) => { + return target.countCards("he") > 0 && target != player && target != _status.event.getParent().target; + }); + next.set("ai", target => { + return -get.attitude(_status.event.player, target) * target.countCards("he") + 0.1; + }); + } else event.finish(); + "step 8"; + if (result.bool) { + var targetx = result.targets[0]; + event.targetx = targetx; + player.line(targetx); + player + .choosePlayerCard(targetx, "he", true, [1, 2]) + .set("prompt", "展示至多两张手牌,或弃置至多两张" + get.translation(event.color) + "装备") + .set("filterButton", button => { + if (ui.selected.buttons.length) { + var linkx = ui.selected.buttons[0].link; + if (get.position(button.link) != get.position(linkx)) return false; + } + if (get.position(button.link) == "e") return get.color(button.link, _status.event.target) == _status.event.getParent().color; + return true; + }) + .set("target", targetx); + } else event.finish(); + "step 9"; + if (result.bool) { + var cards = result.links; + if (get.position(cards[0]) == "e") { + event.targetx.discard(cards, "notBySelf").discarder = player; + event.finish(); + } else { + player.showCards(cards, get.translation(event.targetx) + "因【挫锐】展示的牌"); + var cards2 = cards.filter(card => { + return get.color(card) == event.color; + }); + if (cards2.length) player.gain(cards2, event.targetx, "give"); + } + } + }, + }, + kuiji: { + audio: 2, + usable: 1, + enable: "phaseUse", + filter: function (event, player) { + if (player.hasJudge("bingliang")) return false; + return ( + player.countCards("hes", function (card) { + return get.color(card) == "black" && get.type(card) == "basic"; + }) > 0 + ); + }, + position: "hes", + discard: false, + lose: false, + delay: false, + prepare: function (cards, player) { + player.$give(cards, player, false); + }, + filterCard: function (card, player, event) { + return get.color(card) == "black" && get.type(card) == "basic" && player.canAddJudge({ name: "bingliang", cards: [card] }); + }, + selectTarget: -1, + filterTarget: function (card, player, target) { + return player == target; + }, + check: function (card) { + return 9 - get.value(card); + }, + // onuse:function(links,player){ + // var next=game.createEvent('kuiji_content',false,_status.event.getParent()); + // next.player=player; + // next.setContent(lib.skill.kuiji.kuiji_content); + // }, + // kuiji_content:function(){ + content: function () { + "step 0"; + player.addJudge({ name: "bingliang" }, cards); + player.draw(); + "step 1"; + var next = player.chooseTarget().set("ai", function (target) { + let player = _status.event.player; + if ( + target.hasSkillTag( + "filterDamage", + null, + { + player: player, + }, + true + ) + ) + return get.damageEffect(target, player, player); + return 2 * get.damageEffect(target, player, player); + }); + if (!["identity", "guozhan"].includes(get.mode())) { + next.set("prompt", "选择一名体力值最大的敌方角色,对其造成2点伤害"); + next.set("filterTarget", function (card, player, target) { + return ( + target.isEnemyOf(player) && + !game.hasPlayer(function (current) { + return current.isEnemyOf(player) && current.hp > target.hp; + }) + ); + }); + } else { + next.set("prompt", "选择一名除你外体力值最大的角色,对其造成2点伤害"); + next.set("filterTarget", function (card, player, target) { + return ( + player != target && + !game.hasPlayer(function (current) { + return current != player && current.hp > target.hp; + }) + ); + }); + } + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + target.damage(2); + } + }, + ai: { + result: { + target: function (player, target) { + let es; + if (["identity", "guozhan"].includes(get.mode())) + es = game.hasPlayer(i => { + return ( + i != player && + !game.hasPlayer(j => { + return player !== j && j.hp > i.hp; + }) && + get.attitude(player, i) < 0 + ); + }); + else + es = game.hasPlayer(i => { + return ( + i.isEnemyOf(player) && + !game.hasPlayer(j => { + return j.hp > i.hp && j.isEnemyOf(player); + }) && + get.attitude(player, i) < 0 + ); + }); + if (es) return 2; + return -1.5; + }, + }, + order: 12, + }, + group: "kuiji_dying", + subSkill: { + dying: { + trigger: { global: "dying" }, + filter: function (event, player) { + let evt = event.getParent(2); + return evt && evt.name == "kuiji"; + }, + locked: true, + direct: true, + content: function () { + "step 0"; + var list; + if (["identity", "guozhan"].includes(get.mode())) + list = game + .filterPlayer(current => { + return ( + current !== trigger.player && + !game.hasPlayer(i => { + return trigger.player !== i && i.hp < current.hp; + }) + ); + }) + .filter(i => i.isDamaged()); + else + list = game + .filterPlayer(current => { + return ( + current.isFriendOf(player) && + !game.hasPlayer(i => { + return i.hp < current.hp && i.isFriendOf(player); + }) + ); + }) + .filter(i => i.isDamaged()); + if (list.length > 1) + player + .chooseTarget( + "溃击:选择一名角色回复1点体力", + (card, player, target) => { + return _status.event.list.includes(target); + }, + true + ) + .set("list", list) + .set("ai", target => { + return get.recoverEffect(target, player, _status.event.player); + }); + else if (list.length) event._result = { bool: true, targets: list }; + else event._result = { bool: false }; + "step 1"; + if (result.bool) { + let target = result.targets[0]; + player.logSkill("kuiji", target); + target.recover(); + } + }, + }, + }, + }, + //蒲元 + pytianjiang: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + var i = 0; + var list = []; + while (i++ < 2) { + var card = get.cardPile(function (card) { + if (get.type(card) != "equip") return false; + return list.length == 0 || get.subtype(card) != get.subtype(list[0]); + }); + if (card) list.push(card); + } + if (!list.length) { + event.finish(); + return; + } + event.list = list; + player.gain(event.list, "gain2"); + "step 1"; + game.delay(1); + var card = event.list.shift(); + if (player.getCards("h").includes(card)) { + player.$give(card, player, false); + player.equip(card); + } + if (event.list.length) event.redo(); + }, + group: "pytianjiang_move", + }, + pytianjiang_move: { + audio: "pytianjiang", + prompt: "将装备区里的一张牌移动至其他角色的装备区", + enable: "phaseUse", + position: "e", + filter: function (event, player) { + return player.countCards("e") > 0; + }, + check: function () { + return 1; + }, + filterCard: true, + filterTarget: function (event, player, target) { + return target != player && target.canEquip(ui.selected.cards[0], true); + }, + prepare: "give", + discard: false, + lose: false, + content: function () { + "step 0"; + target.equip(cards[0]); + "step 1"; + if (cards[0].name.indexOf("pyzhuren_") == 0 && !player.getCards("e").includes(cards[0])) player.draw(2); + }, + ai: { + order: (item, player) => { + if (player.hasCard(i => get.subtype(i) === "equip1", "h")) return 11; + return 1; + }, + expose: 0.2, + result: { + target: function (player, target) { + if (ui.selected.cards.length) { + let card = ui.selected.cards[0], + tv = get.value(card, target), + sub = get.subtype(card); + if (sub === "equip1") { + let ev = Infinity, + te = target.getEquips(1); + if (!te.length) return tv; + te.forEach(i => { + ev = Math.min(ev, get.value(i)); + }); + if (card.name.indexOf("pyzhuren_") == 0) return 2 + tv - ev; + return tv - ev; + } + if (target.hasCard(i => get.subtype(i) === sub, "he")) return 0; + let pv = get.value(card, player); + if (pv > 0 && Math.abs(tv) <= pv) return 0; + return tv; + } + return 0; + }, + }, + }, + }, + pyzhuren: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + selectCard: 1, + check: function (card) { + var player = _status.event.player; + var name = "pyzhuren_" + card[card.name == "shandian" ? "name" : "suit"]; + if (!lib.card[name] || (_status.pyzhuren && _status.pyzhuren[name])) { + if (!player.countCards("h", "sha")) return 4 - get.value(card); + return 0; + } + return 7 - get.value(card); + }, + content: function () { + //player.addSkill('pyzhuren_destroy'); + if (!_status.pyzhuren) _status.pyzhuren = {}; + var rand = 0.85; + var num = get.number(cards[0]); + if (num > 4) rand = 0.9; + if (num > 8) rand = 0.95; + if (num > 12 || cards[0].name == "shandian" || get.isLuckyStar(player)) rand = 1; + var name = "pyzhuren_" + cards[0][cards[0].name == "shandian" ? "name" : "suit"]; + if (!lib.card[name] || _status.pyzhuren[name] || Math.random() > rand) { + player.popup("杯具"); + game.log(player, "锻造失败"); + var card = get.cardPile(function (card) { + return card.name == "sha"; + }); + if (card) player.gain(card, "gain2"); + } else { + _status.pyzhuren[name] = true; + var card = game.createCard(name, cards[0].name == "shandian" ? "spade" : cards[0].suit, 1); + card.destroyed = "discardPile"; + player.gain(card, "gain2"); + } + }, + ai: { + order: 10, + result: { + player: 1, + }, + }, + }, + pyzhuren_heart: { + audio: true, + trigger: { source: "damageSource" }, + usable: 1, + equipSkill: true, + filter: function (event, player) { + return event.getParent().name == "sha"; + }, + content: function () { + "step 0"; + player.judge(function (card) { + var player = _status.event.getParent("pyzhuren_heart").player; + if (player.isHealthy() && get.color(card) == "red") return 0; + return 2; + }); + "step 1"; + if (result.color == "red") player.recover(); + else player.draw(2); + }, + ai: { + equipValue: function (card, player) { + if (player.isDamaged()) return 4.5; + return 6; + }, + basic: { + equipValue: 4.5, + }, + }, + }, + pyzhuren_diamond: { + audio: true, + trigger: { source: "damageBegin1" }, + direct: true, + usable: 2, + equipSkill: true, + mod: { + cardUsable: function (card, player, num) { + var cardx = player.getEquip("pyzhuren_diamond"); + if (card.name == "sha" && (!cardx || player.hasSkill("pyzhuren_diamond", null, false) || (!_status.pyzhuren_diamond_temp && !ui.selected.cards.includes(cardx)))) { + return num + 1; + } + }, + cardEnabled2: function (card, player) { + if (!_status.event.addCount_extra || player.hasSkill("pyzhuren_diamond", null, false)) return; + if (card && card == player.getEquip("pyzhuren_diamond")) { + _status.pyzhuren_diamond_temp = true; + var bool = lib.filter.cardUsable(get.autoViewAs({ name: "sha" }, ui.selected.cards.concat([card])), player); + delete _status.pyzhuren_diamond_temp; + if (!bool) return false; + } + }, + }, + filter: function (event, player) { + if (event.getParent().name != "sha") return false; + return ( + player.countCards("he", function (card) { + return card != player.getEquip("pyzhuren_diamond"); + }) > 0 + ); + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "he", + function (card, player) { + return card != player.getEquip("pyzhuren_diamond"); + }, + get.prompt(event.name, trigger.player), + "弃置一张牌,令即将对其造成的伤害+1" + ); + next.set("target", trigger.player); + next.ai = function (card) { + if (_status.event.goon) return 30 / (1 + _status.event.target.hp) - get.value(card); + return -1; + }; + next.set( + "goon", + get.attitude(player, trigger.player) < 0 && + !trigger.player.hasSkillTag("filterDamage", null, { + player: player, + card: trigger.card, + }) && + get.damageEffect(trigger.player, player, player, get.natureList(trigger)) > 0 + ); + next.logSkill = [event.name, trigger.player]; + "step 1"; + if (result.bool) trigger.num++; + else player.storage.counttrigger.pyzhuren_diamond--; + }, + ai: { + expose: 0.25, + equipValue: function (card, player) { + return Math.min(7, 3.6 + player.countCards("h") / 2); + }, + basic: { + equipValue: 4.5, + }, + }, + }, + pyzhuren_club: { + audio: true, + trigger: { player: "useCard2" }, + direct: true, + equipSkill: true, + filter: function (event, player) { + if (event.card.name != "sha" && get.type(event.card) != "trick") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + var num = player.getHistory("useSkill", function (evt) { + return evt.skill == "pyzhuren_club"; + }).length; + if (num >= 2) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "额外指定一个目标"; + player + .chooseTarget([1, player.storage.fumian_red], get.prompt(event.name), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } + "step 2"; + if (event.targets) { + player.logSkill(event.name, event.targets); + trigger.targets.addArray(event.targets); + } + }, + ai: { + equipValue: function (card, player) { + if (player.getEnemies().length < 2) { + if (player.isDamaged()) return 0; + return 1; + } + return 4.5; + }, + basic: { + equipValue: 4.5, + }, + }, + }, + pyzhuren_spade: { + audio: true, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha"; //&&event.targets.length==1&&get.color(event.card)=='black'; + }, + check: function (event, player) { + return get.attitude(player, event.target) <= 0; + }, + equipSkill: true, + logTarget: "target", + content: function () { + var num = player.getHistory("useSkill", function (evt) { + return evt.skill == "pyzhuren_spade"; + }).length; + trigger.target.loseHp(Math.min(num, 5)); //.set('source',player); + }, + ai: { + equipValue: function (card, player) { + return 1 + 4 * Math.min(5, player.getCardUsable("sha")); + }, + basic: { + equipValue: 5, + }, + jueqing: true, + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "unequip_ai") return arg && arg.name === "sha"; + }, + }, + }, + pyzhuren_shandian: { + audio: true, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha"; //&&event.targets.length==1; + }, + check: function (event, player) { + return get.attitude(player, event.target) <= 0; + }, + equipSkill: true, + logTarget: "target", + content: function () { + "step 0"; + trigger.target.judge(function (card) { + var suit = get.suit(card); + if (suit == "spade") return -10; + if (suit == "club") return -5; + return 0; + }).judge2 = function (result) { + return result.color == "black" ? true : false; + }; + "step 1"; + if (result.suit == "spade") { + trigger.target.damage(3, "thunder"); + //trigger.getParent().excluded.add(trigger.target); + } else if (result.suit == "club") { + trigger.target.damage("thunder"); + player.recover(); + player.draw(); + } + }, + ai: { + equipValue: function (card, player) { + if (player.isDamaged()) return 6; + return 4.8; + }, + basic: { + equipValue: 5, + }, + }, + }, + //管辂和葛玄 + gxlianhua: { + derivation: ["reyingzi", "reguanxing", "xinzhiyan", "gongxin"], + audio: 2, + init: function (player, skill) { + if (!player.storage[skill]) + player.storage[skill] = { + red: 0, + black: 0, + }; + }, + marktext: "丹", + intro: { + name: "丹血", + markcount: function (storage) { + return storage.red + storage.black; + }, + content: function (storage) { + return "共有" + (storage.red + storage.black) + "个标记"; + }, + }, + trigger: { global: "damageEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.player != player && event.player.isIn() && _status.currentPhase != player; + }, + content: function () { + player.storage.gxlianhua[player.getFriends().includes(trigger.player) ? "red" : "black"]++; + player.markSkill("gxlianhua"); + }, + group: "gxlianhua_harmonia", + subSkill: { + harmonia: { + forced: true, + audio: "gxlianhua", + sub: true, + trigger: { player: "phaseZhunbeiBegin" }, + //filter:function(event,player){ + // return player.storage.gxlianhua&&player.storage.gxlianhua.red+player.storage.gxlianhua.black>0; + //}, + content: function () { + var cards = []; + var cards2 = []; + var skill = ""; + var red = player.storage.gxlianhua.red; + var black = player.storage.gxlianhua.black; + player.storage.gxlianhua = { red: 0, black: 0 }; + player.unmarkSkill("gxlianhua"); + if (red + black < 4) { + cards = ["tao"]; + skill = "reyingzi"; + } else if (red > black) { + cards = ["wuzhong"]; + skill = "reguanxing"; + } else if (red < black) { + cards = ["shunshou"]; + skill = "xinzhiyan"; + } else { + cards = ["sha", "juedou"]; + skill = "gongxin"; + } + for (var i = 0; i < cards.length; i++) { + var card = get.cardPile(function (shiona) { + return shiona.name == cards[i]; + }); + if (card) cards2.push(card); + } + player.addTempSkills(skill); + if (cards2.length) player.gain(cards2, "gain2", "log"); + }, + }, + }, + }, + zhafu: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "wood", + filterTarget: lib.filter.notMe, + content: function () { + player.awakenSkill("zhafu"); + player.addSkill("zhafu_hf"); + target.addMark("zhafu_hf", 1); + }, + ai: { + order: 1, + result: { + player: function (player, target) { + return Math.max( + 0, + 1 + + target.countCards("h") - + game.countPlayer(current => { + if (get.attitude(target, current) > 0) return 0.3; + if (target.hasJudge("lebu")) return 0.6; + if (target.inRange(current)) return 1.5; + return 1; + }) + ); + }, + target: function (player, target) { + return -Math.max( + 0, + 1 + + target.countCards("h") - + game.countPlayer(current => { + if (get.attitude(target, current) > 0) return 0.3; + if (target.hasJudge("lebu")) return 0.6; + if (target.inRange(current)) return 1.5; + return 1; + }) + ); + }, + }, + }, + subSkill: { + hf: { + trigger: { + global: "phaseDiscardBegin", + }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.player != player && event.player.hasMark("zhafu_hf"); + }, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + target.removeMark("zhafu_hf", 1); + if (target.countCards("h") <= 1) event.finish(); + "step 1"; + target.chooseCard("h", true, "选择保留一张手牌,将其余的手牌交给" + get.translation(player)).set("ai", get.value); + "step 2"; + var cards = target.getCards("h"); + cards.remove(result.cards[0]); + target.give(cards, player); + }, + intro: { + content: "mark", + onunmark: true, + }, + }, + }, + }, + tuiyan: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + frequent: true, + content: function () { + "step 0"; + var cards = get.cards(3); + event.cards = cards; + game.log(player, "观看了牌堆顶的" + get.cnNumber(cards.length) + "张牌"); + player.chooseControl("ok").set("dialog", ["推演", cards]); + "step 1"; + while (cards.length) { + ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); + } + game.updateRoundNumber(); + }, + }, + busuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + var type = get.type(name, "trick"); + if (["basic", "trick"].includes(type)) list.push([type, "", name]); + } + player.chooseButton(["选择至多两种牌", [list, "vcard"]], true, [1, 2]).set("ai", function (button) { + var target = _status.event.getParent().target; + var card = { name: button.link[2] }; + if (get.type(card) == "basic" || !target.hasUseTarget(card)) return false; + return get.attitude(_status.event.player, target) * (target.getUseValue(card) - 0.1); + }); + "step 1"; + target.storage.busuan_angelbeats = result.links.slice(0); + target.addSkill("busuan_angelbeats"); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + if (att > 0) return 1; + return -5 / (target.countCards("h") + 1); + }, + }, + }, + }, + busuan_angelbeats: { + mark: true, + intro: { + mark: function (dialog, content, player) { + if (content && content.length) dialog.add([content, "vcard"]); + }, + }, + trigger: { player: "drawBefore" }, + forced: true, + filter: function (event, player) { + return event.getParent().name == "phaseDraw"; + }, + onremove: true, + content: function () { + "step 0"; + var list = player.storage["busuan_angelbeats"]; + var cards = []; + for (var i = 0; i < Math.min(trigger.num, list.length); i++) { + var card = get.cardPile(function (cardx) { + return !cards.includes(cardx) && cardx.name == list[Math.min(i, list.length - 1)][2]; + }); + if (card) { + player.storage.busuan_angelbeats.splice(i--, 1); + trigger.num--; + cards.push(card); + } + } + if (cards.length) { + player.gain(cards, "gain2", "log"); + } + "step 1"; + if (!trigger.num) trigger.cancel(); + if (!player.storage.busuan_angelbeats.length) player.removeSkill("busuan_angelbeats"); + }, + }, + mingjie: { + audio: 1, + trigger: { player: "phaseJieshuBegin" }, + check: function () { + return ui.cardPile.hasChildNodes() && get.color(ui.cardPile.firstChild) != "black"; + }, + content: function () { + "step 0"; + event.count = 0; + "step 1"; + player.draw("visible"); + "step 2"; + if (Array.isArray(result)) { + event.count += result.length; + if (get.color(result) != "red") { + if (player.hp > 1) player.loseHp(); + event.finish(); + } else if (event.count < 3) + player.chooseBool("是否继续发动【命戒】?").ai = function () { + if (event.count == 2) return Math.random() < 0.5; + return lib.skill.mingjie.check(); + }; + } else event.finish(); + "step 3"; + if (result.bool) event.goto(1); + }, + }, +}; + +export default skills; diff --git a/character/xianding/sort.js b/character/xianding/sort.js new file mode 100644 index 000000000..5168b092c --- /dev/null +++ b/character/xianding/sort.js @@ -0,0 +1,37 @@ +const characterSort = { + sp2_huben: ["chendong", "wangshuang", "wenyang", "re_liuzan", "dc_huangzu", "wulan", "leitong", "chentai", "dc_duyu", "dc_wangjun", "dc_xiahouba", "old_huangfusong", "huzun"], + sp2_shengun: ["puyuan", "guanlu", "gexuan", "wufan", "re_zhangbao", "dukui", "zhaozhi", "zhujianping", "dc_zhouxuān", "zerong"], + sp2_bizhe: ["dc_luotong", "dc_wangchang", "chengbing", "dc_yangbiao", "ruanji", "cuimao"], + sp2_huangjia: ["caomao", "liubian", "dc_liuyu", "quanhuijie", "dingshangwan", "yuanji", "xielingyu", "sunyu", "ganfurenmifuren", "dc_ganfuren", "dc_mifuren", "dc_shixie", "caofang"], + sp2_zhangtai: ["guozhao", "fanyufeng", "ruanyu", "yangwan", "re_panshu"], + sp2_jinse: ["caojinyu", "re_sunyi", "re_fengfangnv", "caohua", "laiyinger", "zhangfen", "zhugeruoxue", "caoxian", "dc_qinghegongzhu", "zhugemengxue"], + sp2_yinyu: ["zhouyi", "luyi", "sunlingluan", "caoyi"], + sp2_wangzhe: ["dc_daxiaoqiao", "dc_sp_machao", "sp_zhenji"], + sp2_doukou: ["re_xinxianying", "huaman", "xuelingyun", "dc_ruiji", "duanqiaoxiao", "tianshangyi", "malingli", "bailingyun"], + sp2_jichu: ["zhaoang", "dc_liuye", "dc_wangyun", "yanghong", "huanfan", "xizheng", "lvfan"], + sp2_yuxiu: ["dongguiren", "dc_tengfanglan", "zhangjinyun", "zhoubuyi", "dc_xujing", "guanyue"], + sp2_qifu: ["dc_guansuo", "xin_baosanniang", "dc_zhaoxiang"], + sp2_gaoshan: ["wanglang", "liuhui", "zhangjian"], + sp2_wumiao: ["wu_zhugeliang", "wu_luxun", "wu_guanyu"], + sp2_mouding: ["dc_sb_lusu", "dc_sb_zhouyu", "dc_sb_simayi"], +}; + +const characterSortTranslate = { + sp2_yinyu: "隐山之玉", + sp2_huben: "百战虎贲", + sp2_shengun: "奇人异士", + sp2_huangjia: "皇家贵胄", + sp2_zhangtai: "章台春望", + sp2_jinse: "锦瑟良缘", + sp2_bizhe: "笔舌如椽", + sp2_wangzhe: "往者可荐", + sp2_doukou: "豆蔻梢头", + sp2_jichu: "计将安出", + sp2_yuxiu: "钟灵毓秀", + sp2_wumiao: "武庙", + sp2_gaoshan: "高山仰止", + sp2_qifu: "祈福", + sp2_mouding: "谋定天下", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/xianding/translate.js b/character/xianding/translate.js new file mode 100644 index 000000000..3f382e134 --- /dev/null +++ b/character/xianding/translate.js @@ -0,0 +1,596 @@ +const translates = { + puyuan: "蒲元", + pytianjiang: "天匠", + pytianjiang_info: "游戏开始时,你随机获得两张不同副类别的装备牌,并置入你的装备区。出牌阶段,你可以将装备区的牌移动至其他角色的装备区(可替换原装备)。若你以此法移动了〖铸刃〗的衍生装备,你摸两张牌。", + pytianjiang_move: "天匠", + pyzhuren: "铸刃", + pyzhuren_info: "出牌阶段限一次,你可以弃置一张手牌。根据此牌的花色点数,你有一定概率打造成功并获得一张武器牌(若打造失败或武器已有则改为摸一张【杀】,花色决定武器名称,点数决定成功率)。此武器牌进入弃牌堆时,将其移出游戏。", + pyzhuren_destroy: "铸刃", + pyzhuren_heart: "红缎枪", + pyzhuren_heart_info: "每回合限一次,当你使用【杀】造成伤害后,你可以进行判定,若结果为:红色,你回复1点体力;黑色:你摸两张牌。", + pyzhuren_diamond: "烈淬刀", + pyzhuren_diamond_info: "每回合限两次,当你使用【杀】对目标角色造成伤害时,你可以弃置一张牌,令此伤害+1。你使用【杀】的次数上限+1。", + pyzhuren_club: "水波剑", + pyzhuren_club_info: "每回合限两次,当你使用普通锦囊牌或【杀】时,你可以为此牌增加一个目标。当你失去装备区里的【水波剑】后,你回复1点体力。", + pyzhuren_spade: "混毒弯匕", + pyzhuren_spade_info: "当你使用【杀】指定目标后,你可令其失去X点体力(X为此技能本回合内发动过的次数且至多为5)。", + pyzhuren_shandian: "天雷刃", + pyzhuren_shandian_info: "当你使用【杀】指定目标后,可令其进行判定,若结果为:黑桃,其受到3点雷属性伤害;梅花,其受到1点雷属性伤害,你回复1点体力并摸一张牌。", + guanlu: "管辂", + tuiyan: "推演", + tuiyan_info: "出牌阶段开始时,你可以观看牌堆顶的三张牌。", + busuan: "卜算", + busuan_info: "出牌阶段限一次,你可以选择一名其他角色,然后选择至多两张不同的卡牌名称(限基本牌或锦囊牌)。该角色下次摸牌阶段摸牌时,改为从牌堆或弃牌堆中获得你选择的牌。", + busuan_angelbeats: "卜算", + mingjie: "命戒", + mingjie_info: "结束阶段,你可以摸一张牌,若此牌为红色,你可以重复此流程直到摸到黑色牌或摸到第三张牌。当你以此法摸到黑色牌时,若你的体力值大于1,则你失去1点体力。", + gexuan: "葛玄", + gxlianhua: "炼化", + gxlianhua_info: "你的回合外,每当有其他角色受到伤害后,你获得一个“丹血”标记(该角色与你阵营一致时为红色,不一致为黑色,此颜色对所有玩家均不可见)直到你的准备阶段开始。准备阶段,根据你获得的“丹血”标记的数量和颜色,你从牌堆/弃牌堆中获得相应的牌以及相应技能直到回合结束。3枚或以下:〖英姿〗和【桃】;超过3枚且红色“丹血”较多:〖观星〗和【无中生有】;超过3枚且黑色“丹血”较多:〖直言〗和【顺手牵羊】;超过3枚且红色和黑色一样多:【杀】、【决斗】和〖攻心〗。", + zhafu: "札符", + zhafu_info: "限定技,出牌阶段,你可以选择一名其他角色,令其获得一枚「札」。有「札」的角色弃牌阶段开始时,若其手牌数大于1,其移去「札」并选择保留一张手牌,然后将其余的手牌交给你。", + leitong: "雷铜", + kuiji: "溃击", + kuiji_info: "出牌阶段限一次。你可以将一张黑色基本牌当作【兵粮寸断】置于你的判定区,然后摸一张牌。若如此做,你可以对体力值最多的一名对手造成2点伤害。对手因此进入濒死状态时,你或队友体力值最少的一方回复1点体力。", + kuiji_info_identity: "出牌阶段限一次。你可以将一张黑色基本牌当做【兵粮寸断】置于你的判定区,摸一张牌,然后你可以对体力值最多的一名其他角色造成2点伤害。该角色因此进入濒死状态时,你可令一名除其外体力值最少的角色回复1点体力。", + kuiji_info_guozhan: "出牌阶段限一次。你可以将一张黑色基本牌当做【兵粮寸断】置于你的判定区,摸一张牌,然后你可以对体力值最多的一名其他角色造成2点伤害。该角色因此进入濒死状态时,你可令一名除其外体力值最少的角色回复1点体力。", + wulan: "吴兰", + wlcuorui: "挫锐", + wlcuorui_info: "出牌阶段开始时,你可以弃置你或队友区域里的一张牌。若如此做,你选择一项:1.弃置对手装备区里至多两张与此牌颜色相同的牌;2.展示对手的共计两张手牌,然后获得其中与此牌颜色相同的牌。", + wlcuorui_info_identity: "出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。", + wlcuorui_info_guozhan: "出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。", + huaman: "花鬘", + manyi: "蛮裔", + manyi_info: "锁定技,【南蛮入侵】对你无效。", + manyi_info_single_normal: "锁定技,【南蛮入侵】对你无效。当你登场时,你可以视为使用一张【南蛮入侵】。", + mansi_viewas: "蛮嗣", + mansi: "蛮嗣", + mansi_info: "出牌阶段限一次,你可以将所有手牌当做【南蛮入侵】使用;当有角色受到【南蛮入侵】的伤害后,你摸一张牌。", + souying: "薮影", + souying_info: "每回合限一次,当你对其他角色(或其他角色对你)使用【杀】或普通锦囊牌指定唯一目标后,若此牌不是本回合你对其(或其对你)使用的第一张【杀】或普通锦囊牌,你可以弃置一张牌,获得此牌对应的所有实体牌(或令此牌对你无效)。", + zhanyuan: "战缘", + zhanyuan_info: "觉醒技,准备阶段,若你已因蛮嗣累计获得超过七张牌,你加1点体力上限并回复1点体力,并可以选择一名男性角色,你与其获得技能〖系力〗,然后你失去技能〖蛮嗣〗。", + hmxili: "系力", + hmxili_info: "每回合限一次,你的回合外,当其他拥有【系力】技能的角色在其回合内对没有【系力】技能的角色造成伤害时,你可以弃置一张牌,令此伤害+1,然后你与其各摸两张牌。", + wangshuang: "王双", + spzhuilie: "追猎", + spzhuilie2: "追猎", + spzhuilie_info: "锁定技,你使用【杀】无距离限制;当你使用【杀】指定目标后,若其不在你的攻击范围内,此【杀】不计入使用次数限制且你判定。若判定结果为武器牌或坐骑牌,此【杀】的伤害基数改为X(X为其体力值)。否则你失去1点体力。", + wenyang: "文鸯", + xinlvli: "膂力", + xinlvli_info: "每回合限一次,当你造成伤害后,你可选择:1,若你的体力值大于你的手牌数,你摸X张牌;2,若你的手牌数大于你的体力值且你已受伤,你回复X点体力(X为你的手牌数与体力值之差)。", + lvli: "膂力", + lvli4: "膂力", + lvli5: "膂力", + lvli_info: "每名角色的回合限一次,你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)。", + choujue: "仇决", + choujue_info: "觉醒技,一名角色的回合结束时,若你的手牌数和体力值相差3或更多,你减1点体力上限并获得技能〖背水〗,然后将〖膂力〗改为“在自己的回合时每回合限两次”。", + beishui: "背水", + beishui_info: "觉醒技,准备阶段,若你的手牌数或体力值小于2,你减1点体力上限并获得技能〖清剿〗,然后将〖膂力〗改为受到伤害后也可以发动。", + qingjiao: "清剿", + qingjiao_info: "出牌阶段开始时,你可以弃置所有手牌,然后从牌堆或弃牌堆中随机获得八张牌名各不相同且副类别不同的牌。若如此做,结束阶段,你弃置所有牌。", + re_liuzan: "留赞", + refenyin: "奋音", + refenyin_info: "锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。", + liji: "力激", + liji_info: "出牌阶段限X次,你可以弃置一张牌并对一名其他角色造成1点伤害。(X为本回合内进入过弃牌堆的卡牌数除以8,若场上人数小于5则改为除以4,向下取整)", + liubian: "刘辩", + shiyuan: "诗怨", + shiyuan_info: "每回合每项限一次,当你成为其他角色使用牌的目标后:①若其体力值大于你,你摸三张牌。②若其体力值等于你,你摸两张牌。③若其体力值小于你,你摸一张牌。", + dushi: "毒逝", + dushi_info: "锁定技,你处于濒死状态时,其他角色不能对你使用【桃】。你死亡时,你选择一名其他角色获得〖毒逝〗。", + yuwei: "余威", + yuwei_info: "主公技,锁定技,其他群雄角色的回合内,你将〖诗怨〗改为“每回合每项限两次”。", + re_xinxianying: "新杀辛宪英", + re_xinxianying_prefix: "新杀", + rezhongjian: "忠鉴", + rezhongjian2: "忠鉴", + rezhongjian_info: "出牌阶段限一次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。", + recaishi: "才识", + recaishi3: "才识", + recaishi_info: "摸牌阶段结束时,若你于本阶段内因摸牌而获得的所有的牌:花色均相同,你将〖忠鉴〗于本回合内改为“出牌阶段限两次”。不均相同,你可回复1点体力。若如此做,你本回合内不能对自己使用牌。", + guozhao: "郭照", + pianchong: "偏宠", + pianchong2: "偏宠", + pianchong_info: "摸牌阶段开始时,你可放弃摸牌。若如此做,你从牌堆中获得一张红色牌和一张黑色牌。然后你选择一种颜色。你的下回合开始前,当你失去该颜色的一张牌后,你从牌堆中获得另一种颜色的一张牌。", + zunwei: "尊位", + zunwei_backup: "尊位", + zunwei_info: "出牌阶段限一次,你可选择本局游戏内未选择过的一项:①若你已受伤,则你可以选择一名体力值大于你的其他角色,你将体力值回复至X(X为你的体力上限与其体力值中的较小值)②选择一名手牌数大于你的其他角色,你将手牌数摸至与其相同(至多摸五张)③选择一名装备区内牌数大于你的其他角色。你令X=1。若你装备区内的('equip'+X)栏为空,则你使用牌堆中的一张副类别为('equip'+X),且能对自己使用的装备牌。你令X+1。若X不大于5,且你装备区内的牌数仍小于目标角色,则你重复此流程。", + fanyufeng: "樊玉凤", + bazhan: "把盏", + bazhan_info: "转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到牌的角色执行一项:①回复1点体力。②复原武将牌。", + jiaoying: "醮影", + jiaoying2: "醮影", + jiaoying3: "醮影", + jiaoying3_draw: "醮影", + jiaoying_info: "锁定技,其他角色得到你的手牌后,该角色本回合不能使用或打出与此牌颜色相同的牌。然后此回合结束时,若其本回合没有再使用牌,你令一名角色将手牌摸至五张。", + ruanyu: "阮瑀", + xingzuo: "兴作", + xingzuo2: "兴作", + xingzuo_info: "出牌阶段开始时,你可观看牌堆底的三张牌并用任意张手牌替换其中等量的牌。若如此做,结束阶段,你可令一名有手牌的角色用所有手牌替换牌堆底的三张牌。若其因此法失去的牌多于三张,则你失去1点体力。", + miaoxian: "妙弦", + miaoxian_info: "若你的手牌中仅有一张黑色牌,你可将此牌当作任意一张普通锦囊牌使用(每回合限一次);若你的手牌中仅有一张红色牌,你使用此牌时摸一张牌。", + yangwan: "杨婉", + youyan: "诱言", + youyan_info: "出牌阶段/弃牌阶段各限一次。当有牌进入弃牌堆后,若其中有你不因使用或打出而失去的牌,你可以从牌堆中获得你本次失去的牌中没有的花色的牌各一张。", + zhuihuan: "追还", + zhuihuan2: "追还", + zhuihuan2_new: "追还", + zhuihuan_info: "结束阶段开始时,你可以选择一名角色(对其他角色不可见)。记录所有对该角色造成过伤害的角色。该角色的下个准备阶段开始时停止记录,且所有记录过的角色:若体力值大于该角色,则受到其造成的2点伤害;若体力值小于等于该角色,则随机弃置两张手牌。", + re_panshu: "潘淑", + zhiren: "织纴", + zhiren_info: "当你于你的回合内使用第一张非转化牌时,你可依次执行以下选项中的前X项:①卜算X。②可弃置场上的一张装备牌和延时锦囊牌。③回复1点体力。④摸三张牌。(X为此牌的名称的字数)", + yaner: "燕尔", + yaner_info: "每回合限一次。当有其他角色于其出牌阶段内失去手牌后,若其没有手牌,则你可以与其各摸两张牌。若其以此法摸得的两张牌类型相同,则其回复1点体力。若你以此法摸得的两张牌类型相同,则你将〖织纴〗中的“你的回合内”改为“一回合内”直至你下回合开始。", + zhouyi: "周夷", + zhukou: "逐寇", + zhukou_info: "①当你于一名角色的出牌阶段第一次造成伤害后,你可以摸X张牌(X为本回合你已使用的牌数)。②你的结束阶段,若你本回合没有造成伤害,你可以对两名其他角色各造成1点伤害。", + mengqing: "氓情", + mengqing_info: "觉醒技。准备阶段,若场上已受伤的角色数大于你的体力值,你加3点体力上限并回复3点体力,失去〖逐寇〗,获得〖玉殒〗。", + yuyun: "玉殒", + yuyun_info: "锁定技,出牌阶段开始时,你失去1点体力或体力上限(不能减至1以下),然后选择X+1项(X为你已损失的体力值):①摸两张牌;②对一名其他角色造成1点伤害,然后本回合对其使用【杀】无距离和次数限制;③本回合的手牌上限视为无限;④获得一名其他角色区域内的一张牌;⑤令一名其他角色将手牌摸至体力上限(最多摸至5)。", + caojinyu: "曹金玉", + yuqi: "隅泣", + yuqi_info: "每回合限两次。当有角色受到伤害后,若你至其的距离不大于0,则你可以观看牌堆顶的3张牌。你将其中至多1张牌交给受伤角色,然后可以获得剩余牌中的至多1张牌,并将其余牌以原顺序放回牌堆顶。(所有具有颜色的数字至多为5)", + shanshen: "善身", + shanshen_info: "当有角色死亡时,你可令你的〖隅泣〗中的一个具有颜色的数字+2。然后若你未对该角色造成过伤害,则你回复1点体力。", + xianjing: "娴静", + xianjing_info: "准备阶段,你可令你的〖隅泣〗中的一个具有颜色的数字+1。若你的体力值等于体力上限,则你可以重复一次此流程。", + re_sunyi: "孙翊", + syjiqiao: "激峭", + syjiqiao_info: "出牌阶段开始时,你可将牌堆顶的X张牌置于你的武将牌上(X为你的体力上限)。当你于此出牌阶段内使用的牌结算结束后,你可以获得其中的一张牌,然后若剩余牌中红色牌和黑色牌的数量:不相等,你失去1点体力;相等,你回复1点体力。出牌阶段结束时,你将这些牌置入弃牌堆。", + syxiongyi: "凶疑", + syxiongyi_info: "限定技。当你处于濒死状态时,若剩余武将牌堆中:有“徐氏”,则你可以将体力值回复至3点,并将此武将牌替换为“徐氏”;没有“徐氏”,则你可以将体力值回复至1点并获得〖魂姿〗。", + re_zhangbao: "新杀张宝", + re_zhangbao_prefix: "新杀", + xinzhoufu: "咒缚", + xinzhoufu2: "咒缚", + xinzhoufu_info: "出牌阶段限一次。你可以将一张手牌置于一名其他角色的武将牌上并称为“咒”,且当其判定时,将其“咒”作为判定牌。", + xinyingbing: "影兵", + xinyingbing_info: "锁定技。每回合每名角色限一次,当你使用牌指定有“咒”的角色为目标后,你摸两张牌。", + wufan: "吴范", + tianyun: "天运", + tianyun_info: "①游戏的第一个回合开始前,你从牌堆中获得手牌区内没有的花色的各一张牌。②一名角色的回合开始时,若其座位号等于游戏轮数,则你可观看牌堆顶的X张牌并以任意顺序置于牌堆顶或牌堆底。若你将所有的牌均置于了牌堆底,则你可以令一名角色摸X张牌,然后失去1点体力。(X为你手牌中包含的花色数)", + wfyuyan: "预言", + wfyuyan_info: "一轮游戏开始时,你选择一名角色(对其他角色不可见):当第一次有角色于本轮内进入濒死状态时,若其是你选择的角色,则你获得〖奋音〗直到你的回合结束;当第一次有角色于本轮内造成伤害后,若其是你选择的角色,则你摸两张牌。", + re_fengfangnv: "冯妤", + tiqi: "涕泣", + tiqi_info: "其他角色的摸牌阶段结束时/被跳过时,若其于本阶段内因摸牌而得到的牌数X不等于2,则你可以摸|X-2|张牌,并可令其本回合的手牌上限±|X-2|。", + baoshu: "宝梳", + baoshu_info: "①准备阶段,你可选择Y名角色,这些角色重置武将牌并获得(X-Y+1)个“梳”(X为你的体力上限,Y∈[1, X])。②一名角色的摸牌阶段开始时,若其有“梳”,则其本阶段的额定摸牌数+Z且移去Z个“梳”(Z为其“梳”的数量)。", + dc_luotong: "骆统", + renzheng: "仁政", + renzheng_info: "锁定技。当有伤害被防止时,或伤害值发生过减少的伤害事件结算结束后,你摸两张牌。", + jinjian: "进谏", + jinjian_info: "①当你造成伤害时,你可令此伤害+1,然后你本回合内下一次造成的伤害-1且不触发〖进谏①〗。②当你受到伤害时,你可令此伤害-1。然后你于本回合内下一次受到的伤害+1且不触发〖进谏②〗。", + caomao: "曹髦", + qianlong: "潜龙", + qianlong_info: "当你受到伤害后,你可以亮出牌堆顶的三张牌并获得其中的至多X张牌(X为你已损失的体力值),然后将剩余的牌置于牌堆底。", + fensi: "忿肆", + fensi_info: "锁定技。准备阶段,你须选择一名体力值不小于你的角色并对其造成1点伤害,然后若你选择的角色不为你自己,则其视为对你使用一张【杀】。", + juetao: "决讨", + juetao_info: "限定技。出牌阶段开始时,若你的体力值为1,则你可以选择一名其他角色。你亮出牌堆底的一张牌,若此牌能被你使用,则你使用此牌并重复此流程直到出现不可使用的牌或其死亡(你与其以外的角色不是此牌的合法目标)。", + zhushi: "助势", + zhushi_info: "主公技。每回合限一次,其他魏势力角色于回合内回复体力时,其可令你摸一张牌。", + laiyinger: "来莺儿", + xiaowu: "绡舞", + xiaowu_info: "出牌阶段限一次,你可以选择任意名座位连续且包含你的上家/下家的其他角色。这些角色依次选择一项:⒈令你摸一张牌;⒉其摸一张牌。然后若选择选项一的角色数大于选项二的角色数,则你获得一枚“沙”;若选择选项二的角色数大于选项一的角色数,则你对这些角色依次造成1点伤害。", + huaping: "化萍", + huaping_info: "限定技。①一名其他角色死亡时,你可获得其当前拥有的所有不带有「Charlotte」标签的技能,然后你失去〖绡舞〗,移去所有“沙”并摸等量的牌。②当你死亡时,你可令一名其他角色获得〖沙舞〗和你的所有“沙”。", + shawu: "沙舞", + shawu_info: "当你使用【杀】指定目标后,你可选择一项:⒈弃置两张手牌;⒉移去一枚“沙”并摸两张牌。然后你对目标角色造成1点伤害。", + dc_huangzu: "黄祖", + dcjinggong: "精弓", + dcjinggong_info: "你可以将一张装备牌当做无距离限制的【杀】使用。当你声明使用此【杀】后,你将此杀的伤害值基数改为X(X为你至此【杀】第一个目标角色的距离且至多为5)。", + dcxiaojuan: "骁隽", + dcxiaojuan_info: "当你使用牌指定其他角色为唯一目标后,你可以弃置其一半的手牌(向下取整)。若这些牌中有与你使用牌花色相同的牌,则你弃置一张手牌。", + dc_liuyu: "新杀刘虞", + dc_liuyu_prefix: "新杀", + dcsuifu: "绥抚", + dcsuifu_info: "其他角色的结束阶段开始时,若你和一号位本回合内累计受到过的伤害值大于1,则你可以将该角色的所有手牌置于牌堆顶,然后视为使用一张【五谷丰登】。", + dcpijing: "辟境", + dcpijing_info: "结束阶段开始时,你可以选择任意名角色。你令所有未选择的角色失去〖自牧〗,然后你和这些角色获得〖自牧〗。", + dczimu: "自牧", + dczimu_info: "锁定技。当你受到伤害后,你令所有拥有〖自牧〗的角色各摸一张牌,然后你失去〖自牧〗。", + caohua: "曹华", + caiyi: "彩翼", + caiyi_info: "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项。阴:⒈回复X点体力。⒉摸X张牌,⒊复原武将牌。⒋随机执行一个已经移除过的阴选项;阳:⒈受到X点伤害。⒉弃置X张牌。⒊翻面并横置。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。", + guili: "归离", + guili_info: "你的第一个回合开始时,你须选择一名其他角色。该角色每轮的第一个回合结束后,若其本回合内未造成过伤害,则你执行一个额外的回合。", + zhaoang: "赵昂", + dczhongjie: "忠节", + dczhongjie_info: "每轮限一次。当有角色因失去体力而进入濒死状态时,你可令其回复1点体力并摸一张牌。", + dcsushou: "夙守", + dcsushou_tag: "对方手牌", + dcsushou_info: "一名角色的出牌阶段开始时,若其手牌数为全场唯一最多,则你可以失去1点体力并摸X张牌。然后若该角色不是你,则你可以观看其一半的手牌(向下取整),且用至多X张手牌替换其中等量的牌。(X为你已损失的体力值)", + dc_wangchang: "王昶", + dckaiji: "开济", + dckaiji_info: "转换技。出牌阶段限一次,你可以:阴:摸X张牌;阳:弃置至多X张牌(X为你的体力上限且至多为5)。", + dcpingxi: "平袭", + dcpingxi_info: "结束阶段,若X大于0,则你可以选择至多X名其他角色(X为本回合内因弃置而进入弃牌堆的牌数)。你依次弃置这些角色的各一张牌,然后视为对这些角色使用一张【杀】。", + liuhui: "刘徽", + dcgeyuan: "割圆", + dcgeyuan_info: "锁定技。①游戏开始时,你将从A至K的所有整数排列为一个环形链表,称为“圆环之理”。②当有一张牌进入弃牌堆后,若此牌的点数在“圆环之理”内,且“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你将此牌的点数记录进“圆环之弧”;然后若“圆环之弧”与“圆环之理”长度相同,则你从“圆环之理”中移除“圆环之弧”记录的第一个和最后一个数字A和B(当“圆环之理”长度不大于3时则不移除),清空“圆环之弧”,获得场上和牌堆中所有点数为A和B的牌。", + dcjieshu: "解术", + dcjieshu_info: "锁定技。①所有点数不在“圆环之理”中的牌不计入你的手牌上限。②当你使用牌时,若“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你摸一张牌。", + dcgusuan: "股算", + dcgusuan_info: "觉醒技。一名角色的回合结束时,若你的“圆环之理”长度为3,则你减1点体力上限并修改〖割圆〗。", + dcgeyuan_magica: "割圆·改", + dcgeyuan_magica_info: "锁定技。当有一张牌进入弃牌堆后,若此牌的点数在“圆环之理”内,且“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你将此牌的点数记录进“圆环之弧”;然后若“圆环之弧”与“圆环之理”长度相同,则你清空“圆环之弧”并选择至多三名角色,这些角色中的第一名角色摸三张牌,第二名角色弃置四张牌,第三名角色将其手牌与牌堆底的五张牌交换。", + zhangfen: "张奋", + dcwanglu: "望橹", + dcwanglu_info: "锁定技。准备阶段开始时,若你的装备区内:有【大攻车】,则你获得一个额外的出牌阶段;没有【大攻车】,则你将一张【大攻车】置入装备区。", + dcxianzhu: "陷筑", + dcxianzhu_info: "当你造成渠道为【杀】伤害后,你可以为你装备区内的【大攻车】选择一项强化(每张【大攻车】最多被强化五次):⒈通过【大攻车】使用【杀】无视距离和防具;⒉通过此【大攻车】使用的【杀】可以额外选择1个目标(可叠加);⒊通过此【大攻车】使用的【杀】造成伤害后的弃置牌数+1(可叠加)。", + dcchaixie: "拆械", + dcchaixie_info: "锁定技。当你的【大攻车】被销毁后,你摸X张牌(X为此【大攻车】被强化过的次数)。", + dagongche: "大攻车", + dagongche_skill: "大攻车", + dagongche_info: "出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。", + dukui: "杜夔", + dcfanyin: "泛音", + dcfanyin_info: "出牌阶段开始时,你可以亮出牌堆中点数最小的一张牌。然后你选择一项,并可以亮出一张点数为此牌二倍的牌且重复此流程:⒈使用此牌(无距离限制);⒉你于本回合内使用的下一张基本牌或普通锦囊牌选择目标后,可以增加一个目标。", + dcpeiqi: "配器", + dcpeiqi_info: "当你受到伤害后,你可以移动场上的一张牌。然后若场上所有角色均在彼此的攻击范围内,则你可以再移动场上的一张牌。", + quanhuijie: "全惠解", + dchuishu: "慧淑", + dchuishu_info: "摸牌阶段结束时,你可以摸[3]张牌。若如此做:你弃置[1]张手牌,且当你于本回合内弃置第[2]+1张牌后,你从弃牌堆中随机获得〖慧淑〗第三个括号数字张非基本牌。", + dcyishu: "易数", + dcyishu_info: "锁定技。当你不因出牌阶段而失去牌后,你同时令{〖慧淑〗的中括号内最小的一个数字+2}且{〖慧淑〗的中括号内最大的一个数字-1}。", + dcligong: "离宫", + dcligong_info: "觉醒技。准备阶段,若〖慧淑〗的中括号内有不小于5的数字,则你加1点体力上限,回复1点体力并失去〖易数〗。系统随机检索四张吴势力的女性武将牌,然后你选择一项:⒈摸三张牌。⒉失去〖慧淑〗,然后获得这些武将牌上的任意两个非Charlotte技能。", + dingshangwan: "丁尚涴", + dcfengyan: "讽言", + dcfengyan_info: "出牌阶段每项各限一次。你可以:⒈令一名体力值不大于你的其他角色交给你一张手牌。⒉视为对一名手牌数不大于你的角色使用一张【杀】(无距离和次数限制)。", + dcfudao: "抚悼", + dcfudao_info: "游戏开始时,你选择一名其他角色,称为“继子”角色。当你或“继子”每回合首次使用牌指定对方为目标后,你与其各摸两张牌。当有角色杀死你或“继子”后,该角色称为“决裂”角色。当你或“继子”对“决裂”造成伤害时,此伤害+1。当你成为“决裂”角色使用牌的目标后,其本回合内不能再使用牌。", + luyi: "卢弈", + dcyaoyi: "邀弈", + dcyaoyi_info: "锁定技。①游戏开始时,你令所有存活且未拥有转换技的角色获得〖手谈〗。②你发动〖手谈〗时无需弃置牌,且无次数限制。③所有拥有转换技的角色不能使用牌指定其他拥有转换技且双方所有转换技状态均相同的角色为目标。", + dcfuxue: "复学", + dcfuxue_info: "①准备阶段,你可以从弃牌堆中选择获得至多X张不因使用而进入弃牌堆的牌。②结束阶段,若你的手牌区中没有因〖复学①〗得到的牌,则你摸X张牌(X为你的体力值)。", + dcshoutan: "手谈", + dcshoutan_info: "转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。", + dc_liuye: "刘晔", + dcpoyuan: "破垣", + dcpoyuan_info: "游戏开始时或准备阶段开始时,若你的装备区内:没有【霹雳投石车】,则你可以将一张【霹雳投石车】置入装备区;有【霹雳投石车】,则你可以弃置一名其他角色至多两张牌。", + dchuace: "画策", + dchuace_info: "出牌阶段限一次。你可以将一张手牌当做上一轮内未被使用过的普通锦囊牌使用。", + pilitoushiche: "霹雳投石车", + pilitoushiche_info: "锁定技。①你于回合内使用基本牌无距离限制,且当你于回合内使用基本牌时,你令此牌的牌面数值+1。②当你于回合外使用或打出基本牌时,你摸一张牌。③当此牌离开你的装备区时,销毁之。", + zhaozhi: "赵直", + dctongguan: "统观", + dctongguan_info: "一名角色的第一个回合开始时,你为其选择一项属性(每个属性至多选两次,且仅对你可见)。", + dcmengjie: "梦解", + dcmengjie_info: "一名角色的回合结束时,若其本回合完成了其〖统观〗属性,你执行对应效果:
  • 「武勇」造成伤害:对一名其他角色造成1点伤害;
  • 「刚硬」回复体力,或于得到牌后手牌数大于体力值:令一名角色回复1点体力;
  • 「多谋」于摸牌阶段外摸牌:摸两张牌;
  • 「果决」弃置或获得其他角色的牌:弃置一名角色区域内至多两张牌;
  • 「仁智」交给其他角色牌:令一名其他角色将手牌补至体力上限(至多摸五张)。", + dctongguan_wuyong: "武勇", + dctongguan_wuyong_info: "任务目标:造成伤害。", + dctongguan_gangying: "刚硬", + dctongguan_gangying_info: "任务目标:回复体力,或于得到牌后手牌数大于体力值。", + dctongguan_duomou: "多谋", + dctongguan_duomou_info: "任务目标:于摸牌阶段外摸牌。", + dctongguan_guojue: "果决", + dctongguan_guojue_info: "任务目标:弃置或获得其他角色的牌。", + dctongguan_renzhi: "仁智", + dctongguan_renzhi_info: "任务目标:交给其他角色牌。", + zhujianping: "朱建平", + olddcxiangmian: "相面", + olddcxiangmian_info: "其他角色的结束阶段,你可以判定。然后你不能再对其发动此技能,其获得以下效果:当其使用第X张结果的花色的牌后(X为结果的点数),其失去等同于其体力值的体力。", + dcxiangmian: "相面", + dcxiangmian_info: "出牌阶段限一次。你可以令一名其他角色判定,然后你不能再对其发动此技能,其获得以下效果:当其使用结果的花色的牌后,或当其使用X张牌后(X为结果的点数),其失去等同于其体力值的体力。", + dctianji: "天机", + dctianji_info: "锁定技。当判定牌进入弃牌堆后,你从牌堆随机获得分别与该牌类型、花色和点数相同的牌各一张。", + yuanji: "袁姬", + dcmengchi: "蒙斥", + dcmengchi_info: "锁定技。若你未于当前回合得到过牌:你不能使用牌;当你横置前,取消之;当你受到无属性伤害后,回复1点体力。", + dcfangdu: "芳妒", + dcfangdu_info: "锁定技。当你于回合外受到伤害后,若此次伤害为你于本回合受到的:第一次无属性伤害,你回复1点体力;第一次属性伤害,你随机获得伤害来源的一张手牌。", + dcjiexing: "节行", + dcjiexing_info: "当你受到伤害后、失去体力后或回复体力后,你可以摸一张牌,且此牌不计入本回合的手牌上限。", + dongguiren: "董贵人", + dclianzhi: "连枝", + dclianzhi_info: "①游戏开始时,你选择一名其他角色(仅你可见)。②每回合限一次。当你进入濒死状态时,若〖连枝①〗角色存活,你回复1点体力并与其各摸一张牌。③当〖连枝①〗角色死亡后,你可以与一名其他角色各获得〖受责〗,且其获得与你拥有的等量枚“绞”标记(至少获得1枚)。", + dclingfang: "凌芳", + dclingfang_info: "锁定技。准备阶段,或当其他角色使用黑色牌结算结束后,若你是此牌的目标,或你使用黑色牌结算结束后,若你不是此牌目标,你获得1枚“绞”。", + dcfengying: "风影", + dcfengying_info: "①一名角色的回合开始时,你记录弃牌堆中所有黑色基本牌或黑色普通锦囊牌的牌名。②每回合每种牌名各限一次。你可以将一张点数不大于“绞”数的手牌当做任意一张〖风影①〗记录中的牌使用(无距离和次数限制)。", + dcshouze: "受责", + dcshouze_info: "锁定技。结束阶段,若你有“绞”,你弃1枚“绞”,随机获得弃牌堆中的一张黑色牌,失去1点体力。", + chengbing: "程秉", + dcjingzao: "经造", + dcjingzao_info: "出牌阶段每名角色限一次,你可以选择一名其他角色并亮出牌堆顶三张牌,其选择一项:1.弃置一张牌名与这些牌的其中一张牌名相同的牌,然后你本回合发动〖经造〗亮出的牌数+1;2.令你随机获得这些牌中每种牌名的牌各一张,然后你本回合发动〖经造〗亮出的牌数-X(X为你获得的牌数)。", + dcenyu: "恩遇", + dcenyu_info: "锁定技。当你成为其他角色使用【杀】或普通锦囊牌的目标后,若你本回合成为过此牌名的牌的目标,此牌对你无效。", + dc_zhouxuān: "周宣", + dcwumei: "寤寐", + dcwumei_info: "每轮限一次。回合开始时,你可以令一名角色记录场上所有角色的体力值并进行一个额外的回合,并将你的回合移至该回合后进行。该角色以此法进行的回合的结束阶段,将场上所有角色的体力值改为记录内的对应数值。", + dczhanmeng: "占梦", + dczhanmeng_info: "当你使用牌时,你可以选择本回合未选择过的一项:1.上一回合内,若没有同名牌被使用过,你获得一张非伤害牌;2.下一回合内,当同名牌首次被使用后,你获得一张伤害牌;3.令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害。", + dc_wangyun: "新杀王允", + dc_wangyun_prefix: "新杀", + dclianji: "连计", + dclianji_info: "出牌阶段限一次。你可以弃置一张手牌并选择一名其他角色,其随机使用牌堆中的一张武器牌,然后其选择一项:1.对另一名其他角色使用一张【杀】,并将武器牌交给其中一个目标;2.令你视为对其使用一张【杀】,并将武器牌交给你。", + dcmoucheng: "谋逞", + dcmoucheng_info: "觉醒技。准备阶段,若你发动过〖连计〗且两个选项均被选择过,你失去〖连计〗,然后获得〖矜功〗。", + xuelingyun: "薛灵芸", + dcxialei: "霞泪", + dcxialei_info: "当你的红色牌进入弃牌堆后,或当你使用或打出的红色牌经由处理区进入弃牌堆后,你可以观看牌堆顶的三张牌,获得其中的一张牌,且可以将其余牌置于牌堆底。然后你本回合以此法观看的牌数-1。", + dcanzhi: "暗织", + dcanzhi_info: "出牌阶段或当你受到伤害后,你可以判定,若结果为红色,你重置〖霞泪〗的观看牌数;若结果为黑色,〖暗织〗于本回合失效,然后你可以令一名非当前回合角色获得本回合进入弃牌堆的两张牌。", + yanghong: "杨弘", + dcjianji: "间计", + dcjianji_info: "出牌阶段限一次。你可以令至多X名座位连续的角色依次弃置一张牌。然后其中手牌数最多的角色可以视为对一名其他以此法弃置过牌的角色使用一张【杀】(X为你的攻击范围)。", + dcyuanmo: "远谟", + dcyuanmo_info: "①准备阶段或当你受到伤害后,你可以选择一项:1.攻击范围+1,然后若你攻击范围内的角色数因此增加,你可以获得任意名本次进入你攻击范围的角色各一张牌;2.攻击范围-1,然后摸两张牌。②结束阶段,若你的攻击范围内没有角色,你可以令你的攻击范围+1。", + dc_yangbiao: "杨彪", + dczhaohan: "昭汉", + dczhaohan_info: "摸牌阶段,你可以多摸两张牌,然后你于得到牌后选择一项:1.将两张手牌交给一名没有手牌的角色;2.弃置两张手牌。", + oldjinjie: "尽节", + oldjinjie_info: "当一名角色进入濒死状态时,你可以令其摸一张牌。然后若你本轮未进行过回合,你可以弃置X张手牌令其回复1点体力(X为本轮你发动过〖尽节〗的次数)。", + dcjinjie: "尽节", + dcjinjie_info: "每轮限一次。当一名角色进入濒死状态时,你可以声明一个整数X(X∈[0,3]),令其摸X张牌,然后你可以弃置X张牌令其回复1点体力(若X为0则跳过摸牌和弃牌的步骤)。", + oldjue: "举讹", + oldjue_info: "准备阶段,你可以视为对一名体力值或手牌数大于你的角色使用一张【杀】。", + dcjue: "举讹", + dcjue_info: "每轮限一次。一名角色的结束阶段,你可以视为对其随机使用【杀】/【过河拆桥】/【五谷丰登】,直到你以此法使用的牌数不小于Y(Y为本回合因弃置进入弃牌堆的牌数,且至多为其体力上限)。若此时是你的回合,改为你选择一名其他角色。", + dc_tengfanglan: "滕芳兰", + dcluochong: "落宠", + dcluochong_info: "一轮游戏开始时,你可以弃置任意名角色区域里的共计至多[4]张牌,然后若你以此法弃置了一名角色的至少三张牌,则你方括号内的数字-1。", + dcaichen: "哀尘", + dcaichen_info: "锁定技。若牌堆剩余数:大于80,当你因〖落宠〗弃置你区域内的牌后,你摸两张牌;大于40,你跳过弃牌阶段;小于40,你不能响应♠牌。", + xielingyu: "谢灵毓", + dcyuandi: "元嫡", + dcyuandi_info: "当其他角色于其出牌阶段使用第一张牌时,若此牌仅指定其为目标,你可以选择一项:1.弃置其一张手牌;2.你与其各摸一张牌。", + dcxinyou: "心幽", + dcxinyou_info: "出牌阶段限一次。你可以将体力回复至上限并将手牌补至体力上限。若你以此法:获得了至少三张牌,你于结束阶段失去1点体力;回复了体力,你于结束阶段弃置一张牌。", + zerong: "笮融", + dccansi: "残肆", + dccansi_info: "锁定技。准备阶段,你回复1点体力,然后选择一名其他角色,其回复1点体力,你视为对其依次使用以下能使用的牌:【杀】(无距离限制)、【决斗】、【火攻】。当其以此法受到1点伤害后,你摸两张牌。", + dcfozong: "佛宗", + dcfozong_info: "锁定技。出牌阶段开始时,若你的手牌数大于7,你将X张手牌置于武将牌上(X为你的手牌数-7)。然后若你的武将牌上有至少七张牌,其他角色依次选择一项:1.获得其中的一张牌并令你回复1点体力;2.令你失去1点体力。", + dc_ruiji: "芮姬", + dcwangyuan: "妄缘", + dcwangyuan_info: "当你于回合外失去牌后,或于回合内发动〖俐影〗后,你可以随机将牌堆里的一张与你所有“妄”牌名均不同的基本牌或锦囊牌置于武将牌上,称为“妄”(不超过游戏人数)。", + dclingyin: "铃音", + // dclingyin_info:'出牌阶段开始时,你可以获得至多X张“妄”(X为游戏轮数)然后若你的“妄”颜色均相同,你于本回合对其他角色造成的伤害+1,且可以将一张武器牌或防具牌当【决斗】使用。', + dclingyin_info: "出牌阶段开始时,你可以选择至多X张“妄”(X为游戏轮数),若这些牌以外的“妄”中不存在颜色不同的牌,则你于本回合对其他角色造成的伤害+1,且可以将一张武器牌或防具牌当【决斗】使用。你获得这些牌。", + dcliying: "俐影", + dcliying_info: "每回合限一次。当你于摸牌阶段外得到牌后,你可以将这些牌中的任意张交给一名其他角色,然后摸一张牌。", + huanfan: "桓范", + dcjianzheng: "谏诤", + dcjianzheng_info: "出牌阶段限一次。你可以观看一名其他角色的手牌,然后若其中有你可以使用的手牌,你获得并使用其中一张。若你以此法使用牌指定了其为目标,你令你与其横置,然后其观看你的手牌。", + dcfumou: "腹谋", + dcfumou_info: "当你受到伤害后,你可以令至多X名角色从你开始逆时针依次选择一项:1.移动场上的一张牌;2.弃置所有手牌并摸两张牌;3.弃置装备区里的所有牌并回复1点体力(X为你已损失的体力值)。", + chentai: "陈泰", + dcctjiuxian: "救陷", + dcctjiuxian_info: "出牌阶段限一次。你可以重铸一半数量的手牌(向上取整),然后视为使用一张【决斗】。当此牌对目标角色造成伤害后,你可以令其攻击范围内的一名其他角色回复1点体力。", + dcchenyong: "沉勇", + dcchenyong_info: "结束阶段,你可以摸X张牌(X为本回合你使用过的牌的类型数)。", + sunyu: "孙瑜", + dcquanshou: "劝守", + dcquanshou_info: "一名角色的回合开始时,若其手牌数不大于其体力上限,你可以令其选择一项:1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1(至多摸五张);2.其本回合使用牌被抵消后,你摸一张牌。", + dcshexue: "设学", + dcshexue_info: "①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的一张基本牌或普通锦囊牌使用(一名角色因〖设学〗使用的牌均无距离和次数限制)。", + xizheng: "郤正", + dcdanyi: "耽意", + dcdanyi_info: "当你使用牌指定第一个目标后,你可以摸X张牌(X为此牌目标数与你使用的上一张牌相同的目标数)。", + dcwencan: "文灿", + dcwencan_info: "出牌阶段限一次。你可以选择至多两名体力值不同的其他角色,这些角色依次选择一项:1.弃置两张花色不同的牌;2.本回合你对其使用牌无距离和次数限制。", + zhangjinyun: "张瑾云", + dchuizhi: "蕙质", + dchuizhi_info: "准备阶段,你可以选择是否弃置任意张手牌,然后将手牌摸至与全场手牌数最多的角色相同(至少摸一张,至多摸五张)。", + dcjijiao: "继椒", + dcjijiao_info: "限定技。出牌阶段,你可以令一名角色获得所有弃牌堆中你于本局游戏内使用或弃置过的普通锦囊牌,且这些牌不能被【无懈可击】响应。一名角色的回合结束后,若本回合牌堆洗过牌或有角色死亡,你重置〖继椒〗。", + duanqiaoxiao: "段巧笑", + dccaizhuang: "彩妆", + dccaizhuang_info: "出牌阶段限一次,你可以弃置任意张牌。然后若你手牌中的花色数小于你以此法弃置的牌的花色数,你摸一张牌并重复此流程。", + dchuayi: "华衣", + dchuayi_info: "结束阶段,你可以判定,然后你获得如下效果直到你下回合开始时:红色,一名角色的回合结束时,你摸一张牌;黑色,当你受到伤害后,你摸两张牌。", + wu_zhugeliang: "武诸葛亮", + wu_zhugeliang_prefix: "武", + dcjincui: "尽瘁", + dcjincui_info: "锁定技。①游戏开始时,你将手牌摸至七张。②准备阶段,你将体力值回复或失去至等同于牌堆中点数为7的牌数(你的体力值最低因此调整至1)。然后你观看牌堆顶X张牌,将这些牌以任意顺序置于牌堆顶或牌堆底(X为你的体力值)。", + dcqingshi: "情势", + dcqingshi_info: "当你于出牌阶段使用牌时,若你手牌中有同名牌且你本回合未因此牌名的牌发动过该技能,你可以选择一项:1.令此牌对其中一个目标角色造成的伤害+1;2.令任意名其他角色各摸一张牌;3.摸三张牌,然后〖情势〗于本回合无效。", + dczhizhe: "智哲", + dczhizhe_clear: "invisible", + dczhizhe_info: "限定技。出牌阶段,你可以选择一张手牌并复制之。当你使用或打出此复制牌结算结束后,你获得之,然后你本回合不能再使用或打出此牌。", + ruanji: "阮籍", + dczhaowen: "昭文", + dczhaowen_tag: "昭文", + dczhaowen_info: "出牌阶段开始时,你可以展示所有手牌。然后你于本回合获得如下效果:1.你可以将其中一张黑色牌当做任意一张普通锦囊牌使用(每回合每种牌名限一次);2.当你使用其中的一张红色牌时,你摸一张牌。", + dcjiudun: "酒遁", + dcjiudun_info: "①以你为目标的【酒】(使用方法①)的作用效果改为“目标对应的角色使用的下一张【杀】的伤害基数+1”。②当你成为其他角色使用黑色牌的目标后,若你:未处于【酒】状态,你可以摸一张牌并视为使用一张【酒】;处于【酒】状态,你可以弃置一张手牌令此牌对你无效。", + ganfurenmifuren: "甘夫人糜夫人", + dcchanjuan: "婵娟", + dcchanjuan_info: "每种牌名限两次。当你使用手牌中仅指定单一目标的【杀】或普通锦囊牌结算结束后,你可以视为使用一张名称和属性均相同的牌。若这两张牌指定的目标完全相同,你摸一张牌。", + dcxunbie: "殉别", + dcxunbie_info: "限定技。当你进入濒死状态时,你可以将此武将牌替换为“甘夫人”或“糜夫人”(不能选择已在场上的武将)。然后回复至1点体力并防止所有伤害直到你的下一个回合结束。", + dc_mifuren: "糜夫人", + dcguixiu: "闺秀", + dcguixiu_info: "锁定技。①回合开始时,若你于本局游戏未发动过〖闺秀①〗,你摸两张牌。②当你发动〖存嗣〗后,你回复1点体力。", + dccunsi: "存嗣", + dccunsi_info: "限定技。出牌阶段,你可以令一名角色获得〖勇决〗。若该角色不为你,你摸两张牌。", + dcyongjue: "勇决", + dcyongjue_info: "当你于出牌阶段使用第一张【杀】时,你可以选择一项:1.令此【杀】不计入次数;2.获得此牌。", + dc_ganfuren: "甘夫人", + dcshushen: "淑慎", + dcshushen_info: "当你回复1点体力后,你可以选择一名其他角色并选择一项:1.令其回复1点体力;2.你与其各摸一张牌。", + dcshenzhi: "神智", + dcshenzhi_info: "准备阶段,若你的手牌数大于体力值,你可以弃置一张手牌,然后回复1点体力。", + dc_duyu: "杜预", + dcjianguo: "谏国", + dcjianguo_info: "出牌阶段各限一次。你可以选择一名角色并选择一项:1.令其摸一张牌,然后其弃置一半的手牌;2.令其弃置一张牌,然后其摸等同于手牌数一半的牌(均向上取整)。", + dcdyqingshi: "倾势", + dcdyqingshi_info: "当你于回合内使用【杀】或普通锦囊牌指定第一个目标后,若目标角色包括其他角色且此牌为你本回合使用的第X张牌,你可以对其中一名不为你的目标角色造成1点伤害(X为你的手牌数)。", + sunlingluan: "孙翎鸾", + dclingyue: "聆乐", + dclingyue_info: "锁定技。一名角色于一轮内首次造成伤害后,你摸一张牌。若此时是该角色回合外,则改为摸X张牌(X为本回合全场造成的伤害值)。", + dcpandi: "盻睇", + dcpandi_info: "出牌阶段,你可以选择一名本回合内未造成过伤害的角色。你本阶段内使用的下一张牌改为以该角色为基准判断使用目标合法性,且使用者改为该角色。", + zhoubuyi: "周不疑", + dcshiji: "十计", + dcshiji_info: "一名角色的结束阶段,若其本回合未造成过伤害,你可以声明一种本轮未以此法声明过的普通锦囊牌,然后其可以将一张牌当你声明的牌使用(其不是此牌的合法目标)。", + dcsilun: "四论", + dcsilun_info: "准备阶段或当你受到伤害后,你可以摸四张牌,然后将四张牌依次置于场上或牌堆两端(对所有角色可见)。装备区牌数因此变化的角色复原其武将牌。", + dc_wangjun: "王濬", + dcmianyao: "免徭", + dcmianyao_info: "摸牌阶段结束时,你可以展示手牌中点数最小的一张牌并将此牌随机插入牌堆中。然后你于此回合结束时摸等同于此牌点数的牌。", + dcchangqu: "长驱", + dcchangqu_info: "出牌阶段限一次。你可以开一艘战舰(你从你的上家或下家开始选择任意名座位连续的其他角色,且起点角色获得“战舰”标记)。这些角色按照你选择的顺序依次执行:{若其有本次获得的“战舰”,其选择一项:1.交给你X张手牌,然后将“战舰”移动给你选择的下一名目标角色;2.令其下次受到的属性伤害值+X,然后横置(X为本次〖长驱〗中选项一被选择过的次数且至少为1)。}。", + dctongye: "统业", + dctongye_info: "锁定技。游戏开始时或一名角色死亡后,若场上势力数:不大于4,你的手牌上限+3;不大于3,你的攻击范围+3;不大于2,你使用【杀】的次数上限+3;不大于1,你摸牌阶段额定摸牌数+3。", + tianshangyi: "田尚衣", + dcposuo: "婆娑", + dcposuo_info: "出牌阶段,若你本阶段未对其他角色造成过伤害,则你可以将一张你本阶段未以此法使用过的花色的手牌当作任意一张存在于游戏的同花色伤害牌使用。", + dcxiaoren: "绡刃", + dcxiaoren_info: "每回合限一次,当你造成伤害后,你可以进行判定,若结果为:红色,你可以令一名角色回复1点体力,然后若其满体力,其摸一张牌;黑色,你对受伤角色的上家或下家造成1点伤害,然后你可以重复此流程直到未能执行此项或有角色进入濒死状态。", + dc_daxiaoqiao: "新杀大乔小乔", + dc_daxiaoqiao_prefix: "新杀", + dcxingwu: "星舞", + dcxingwu_info: "弃牌阶段开始时,你可以将一张手牌置于武将牌上,称为“星舞”。若你的“星舞”牌达到三张,则你可移去三张“星舞”,弃置一名其他角色装备区里的所有牌,然后对其造成X点伤害(X为移去的“星舞”牌的花色数,若为女性角色则改为1点伤害)。", + dcluoyan: "落雁", + dcluoyan_info: "锁定技,若你有“星舞”牌,你视为拥有技能〖天香〗和〖流离〗。", + dc_xiahouba: "新杀夏侯霸", + dc_xiahouba_prefix: "新杀", + old_huangfusong: "新杀皇甫嵩", + old_huangfusong_prefix: "新杀", + dc_sp_machao: "群马超", + dc_sp_machao_prefix: "群", + dc_shixie: "新杀士燮", + dc_shixie_prefix: "新杀", + dc_guansuo: "新杀关索", + dc_guansuo_prefix: "新杀", + dc_zhaoxiang: "新杀赵襄", + dc_zhaoxiang_prefix: "新杀", + dc_xujing: "许靖", + dcshangyu: "赏誉", + dcshangyu_tag: "赏誉", + dcshangyu_info: "锁定技。游戏开始时,你获得一张【杀】并记录之,并可以将此牌交给一名角色。然后你获得如下效果:1.当一名角色使用此牌造成伤害后,你与其各摸一张牌;2.当此牌进入弃牌堆后,你将此牌交给一名本回合未以此法得到过此牌的角色。", + dccaixia: "才瑕", + dccaixia_info: "当你造成或受到伤害后,若你没有“瑕”,你可以摸至多X张牌并获得X枚“瑕”,然后当你使用牌时,移去1枚“瑕”(X为本局游戏总角色数且至多为5)。", + wu_luxun: "武陆逊", + wu_luxun_prefix: "武", + dcxiongmu: "雄幕", + dcxiongmu_tag: "雄幕", + dcxiongmu_info: "①一轮游戏开始时,你可以将手牌摸至体力上限(若手牌数不小于体力上限则跳过),然后将任意张牌随机置入牌堆,从牌堆或弃牌堆中获得等量的点数为8的牌,且这些牌不计入手牌上限。②当你于一回合首次受到伤害时,若你的手牌数不大于你的体力值,此伤害-1。", + dczhangcai: "彰才", + dczhangcai_info: "当你使用或打出点数为8的牌时,你可以摸X张牌(X为你手牌区里点数为8的牌数且至少为1)。", + dcruxian: "儒贤", + dcruxian_info: "限定技。出牌阶段,你可以令你〖彰才〗的点数限制取消,且摸牌数改为等同于你手牌区内与此牌点数相同的牌数且至少为1,直到你的下回合开始。", + malingli: "马伶俐", + dclima: "骊马", + dclima_info: "锁定技。你计算至其他角色的距离-X(X为场上的坐骑牌数且至少为1)。", + dcxiaoyin: "硝引", + dcxiaoyin_info: "①准备阶段,你可以亮出牌堆顶的Y张牌(Y为你距离1以内的角色数),获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上,称为“硝引”。②当一名有“硝引”牌的角色受到伤害时,若此伤害为:火焰伤害,来源可以弃置其“硝引”牌包含的类型的牌,将一张对应的“硝引”置入弃牌堆,令此伤害+1;非火焰伤害,来源可以获得一张“硝引”牌,将此伤害改为火焰伤害。", + dchuahuo: "花火", + dchuahuo_info: "出牌阶段限一次。你可以将一张红色手牌当不计入次数的火【杀】使用。然后当你使用此牌指定第一个目标后,若目标角色有“硝引”牌,你可以将此【杀】的目标改为所有有“硝引”牌的角色。", + caoyi: "曹轶", + dcmiyi: "蜜饴", + dcmiyi_info: "准备阶段,你可以选择一项:1.回复1点体力;2.受到你造成的1点伤害。然后你令任意名角色执行该项。若如此做,这些角色于结束阶段执行另一项。", + dcyinjun: "寅君", + dcyinjun_info: "当你使用对应实体牌均为你的手牌的【杀】或锦囊牌结算结束后,若此牌目标为1,你可以视为对该目标使用一张无伤害来源的【杀】。然后若你本回合发动〖寅君〗的次数大于你的体力值,〖寅君〗失效直到回合结束。", + zhugeruoxue: "诸葛若雪", + dcqiongying: "琼英", + dcqiongying_info: "出牌阶段限一次。你可以移动场上的一张牌,然后你弃置一张与此牌花色相同的手牌(若没有该花色的手牌则改为展示所有手牌)。", + dcnuanhui: "暖惠", + dcnuanhui_info: "结束阶段,你可以选择一名装备区有牌的角色,其可以视为依次使用X张基本牌(X为其装备区牌数且至少为1)。若其此次以此法使用了同名牌,其弃置装备区里的所有牌。", + zhangjian: "张臶", + dc_zj_a: "技能", + dc_zj_a_info: "锁定技。当你受到牌造成的伤害时,若此牌有点数,则你将此伤害值改为此牌点数,否则你防止此伤害。", + dc_zj_b: "技能", + dc_zj_b_info: "结束阶段,你可以弃置所有牌并令一名其他角色获得〖技能〗直到你的下个回合开始。", + dc_sb_lusu: "新杀谋鲁肃", + dc_sb_lusu_prefix: "新杀谋", + dcsbmingshi: "明势", + dcsbmingshi_info: "摸牌阶段,你可以多摸两张牌,然后展示三张牌并令一名其他角色选择获得其中的一张牌。", + dcsbmengmou: "盟谋", + dcsbmengmou_info: "转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力上限,Y为X-其打出【杀】数)", + dc_sb_zhouyu: "新杀谋周瑜", + dc_sb_zhouyu_prefix: "新杀谋", + dcsbronghuo: "融火", + dcsbronghuo_info: "锁定技,当你使用火【杀】或【火攻】时,此牌伤害基值改为场上势力数。", + dcsbyingmou: "英谋", + dcsbyingmou_info: "转换技,每回合限一次,当你使用牌指定其他角色为目标后,你可以选择一名目标角色:阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。", + caoxian: "曹宪", + dclingxi: "灵犀", + dclingxi_info: "出牌阶段开始和结束时,你可以将至多X张牌称为“翼”置于你的武将牌上(X为你的体力上限)。当你失去武将牌上的“翼”时,你将手牌数调整至Y张(Y为你武将牌上的“翼”所含有的花色数的两倍)。", + dczhifou: "知否", + dczhifou_info: "当你使用牌结算完毕后,你可以移去至少X张武将牌上的“翼”(X为本回合此前发动此技能的次数+1),然后选择一名角色并选择一项令其执行(每个选项每回合限选择一次):①将一张牌称为“翼”置于你的武将牌上;②弃置两张牌;③失去1点体力。", + dc_qinghegongzhu: "新杀清河公主", + dc_qinghegongzhu_prefix: "新杀", + dczhangji: "长姬", + dczhangji_info: "锁定技,一名角色使用多目标牌时,若你是此牌的目标之一,则你先结算此牌的效果,然后你摸X张牌(X为此牌的其他目标数)。", + dczengou: "谮构", + dczengou_info: "出牌阶段限一次,你可以将至多体力上限张牌称为“谮构”交给一名其他角色并摸等量张牌。若如此做,其下次体力值增加或使用牌结算完毕后,其展示所有手牌,然后失去Y点体力(Y为其手牌中的“谮构”牌数)。", + bailingyun: "柏灵筠", + dclinghui: "灵慧", + dclinghui_info: "一名角色的结束阶段,若当前回合角色为你或本回合有角色进入过濒死状态,则你可以观看牌堆顶的三张牌,然后你可以使用其中一张牌并随机获得其中一张剩余牌。", + dcxiace: "黠策", + dcxiace_info: "每回合每项各限一次。当你造成/受到伤害后,你可以弃置一张牌并回复1点体力/令一名其他角色的非锁定技于本回合失效。", + dcyuxin: "御心", + dcyuxin_info: "限定技,一名角色进入濒死状态时,你可以令其将体力回复至X点(X为1,若该角色不为你则X为你的体力值)。", + zhugemengxue: "诸葛梦雪", + dcjichun: "寄春", + dcjichun_info: "出牌阶段限一次,你可以展示一张牌并选择一项:①将此牌交给一名手牌数小于你的角色,然后摸X张牌。②弃置此牌并弃置一名手牌数大于你的角色区域里至多X张牌。(X为此牌牌名字数)", + dchanying: "寒英", + dchanying_info: "准备阶段,你可以亮出牌堆里的一张非赠物装备牌,然后令一名手牌数等于你的角色使用此牌。", + huzun: "胡遵", + dczhantao: "斩涛", + dczhantao_info: "当你或你攻击范围内的角色受到伤害后,若你不为伤害来源,你可以判定,若造成此伤害的渠道为牌且此牌有点数且判定结果点数大于此牌的点数,你视为对来源使用一张【杀】。", + dcanjing: "安境", + dcanjing_info: "每回合限一次。当你造成伤害后,你可以令至多X名已受伤的角色各摸一张牌,然后其中体力值最少的角色回复1点体力(X为你本局游戏发动〖安境〗的次数)。", + cuimao: "崔琰毛玠", + zhengbi: "征辟", + zhengbi_info: "出牌阶段开始时,你可以选择一名其他角色并选择一项:①本阶段结束时,若其本阶段得到过牌,则你获得其手牌区和装备区各一张牌;②将一张基本牌交给该角色,然后其交给你一张非基本牌或两张基本牌。", + fengying: "奉迎", + fengying_info: "限定技,出牌阶段,你可以弃置所有手牌。若如此做,你于本回合结束后进行一个额外回合,此额外回合开始时,若你的体力值为全场最低,则你将手牌数摸至体力上限。", + lvfan: "吕范", + diaodu: "调度", + diaodu_info: "出牌阶段开始时,或当你发动〖典财〗后,你可以获得一名距离不大于1的一名角色A装备区里的一张牌,然后你将此牌交给另一名角色B,然后B选择是否使用此牌,若B使用/不使用,则你/B摸一张牌。", + diancai: "典财", + diancai_info: "其他角色的出牌阶段结束时,若你于此阶段失去了至少X张牌,则你可以将手牌摸至体力上限(X为你的体力值且X至多为5)。", + chendong: "陈武董袭", + dcduanxie: "断绁", + dcduanxie_info: "出牌阶段限一次,你可以令一名其他角色横置,然后你横置。", + dc_sb_simayi: "新杀谋司马懿", + dc_sb_simayi_prefix: "新杀谋", + dcsbquanmou: "权谋", + dcsbquanmou_info: "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。", + dcsbpingliao: "平辽", + dcsbpingliao_info: "锁定技。当你声明使用【杀】时,你令此【杀】的目标对其他角色不可见,且你令攻击范围内的其他角色依次选择是否打出一张红色基本牌。所有角色选择完成后,此牌的目标角色中没有以此法打出牌的角色本回合内无法使用或打出手牌;若有不为此牌目标的角色以此法打出了牌,则你摸两张牌,且你本回合使用【杀】的次数上限+1。", + caofang: "曹芳", + dczhimin: "置民", + dczhimin_tag: "民", + dczhimin_info: "锁定技。①一轮游戏开始时,你选择至多X名其他角色(X为你的体力值),获得这些角色各自手牌中的随机一张点数最小的牌。②当你于你的回合外得到牌后,你将这些牌标记为“民”。③当你失去“民”后,你将手牌补至体力上限。", + dcjujian: "拒谏", + dcjujian_info: "主公技。出牌阶段限一次,你可以令一名其他魏势力角色摸一张牌,然后你令其于本轮内使用的普通锦囊牌对你无效。", + wu_guanyu: "武关羽", + wu_guanyu_prefix: "武", + dcjuewu: "绝武", + dcjuewu_two: "2点", + dcjuewu_info: "①每回合每种牌名限一次。你可以将一张点数为2的牌当任意伤害类牌使用(包括【水淹七军】)。②当你得到其他角色区域内的牌后,你令这些牌的点数均视为2直到你失去这些牌。", + dcwuyou: "武佑", + dcwuyou_info: "①出牌阶段限一次。你可以选择一张手牌,从系统随机生成的五个非装备牌牌名中选择一个,令此牌的牌名与属性视为与你选择的相同。②其他角色的出牌阶段限一次。其可以交给你一张手牌,你从系统随机生成的五个非装备牌牌名中选择一个,然后可以交给其一张手牌,令此牌的牌名与属性视为与你选择的相同(一名角色使用〖武佑〗转化的牌无距离且无任何次数限制)。", + dcyixian: "义贤", + dcyixian_info: "限定技。出牌阶段,你可以选择一项:⒈获得场上的所有装备牌;⒉获得弃牌堆中的所有装备牌。然后你依次选择是否令被你以此法获得牌的角色摸X张牌并回复1点体力(X为其以此法失去的牌数)。", + shuiyanqijuny: "水淹七军", + shuiyanqijuny_info: "出牌阶段,对至多两名角色使用。目标角色受到1点雷属性伤害,然后若其:是此牌的使用者选择的第一个目标,其弃置一张牌;不是第一个目标,其摸一张牌。", + sp_zhenji: "SP甄宓", + sp_zhenji_prefix: "SP", + dcjijie: "己诫", + dcjijie_info: "锁定技。每回合每项各限一次,其他角色于其回合外得到牌后/回复体力后,你摸等量的牌/回复等量的体力。", + dchuiji: "惠济", + dchuiji_info: "出牌阶段限一次。你可以令一名角色摸两张牌或从牌堆中随机使用一张不为赠物的装备牌,然后若其手牌数不小于存活角色数,其视为使用一张【五谷丰登】。系统不于此牌使用准备工作结束时执行亮出牌堆顶的牌的动作,改为你令其将所有手牌置于处理区,然后令所有目标角色依次获得其中一张牌。当这些牌因执行【五谷丰登】的执行动作而置于弃牌堆后,你令其获得这些牌。", + guanyue: "关樾", + dcshouzhi: "守执", + dcshouzhi_info: "锁定技。一名角色的回合结束时,若你的手牌数:大于本回合开始时的手牌数,你弃置一张手牌;小于本回合开始时的手牌数,你摸两张牌。", + dcshouzhi_modified: "守执·改", + dcshouzhi_modified_info: "一名角色的回合结束时,若你的手牌数:大于本回合开始时的手牌数,你可以弃置一张手牌;小于本回合开始时的手牌数,你可以摸两张牌。", + dcfenhui: "奋恚", + dcfenhui_info: "限定技。出牌阶段,你可以令一名角色获得X枚“恨”标记,你摸等量的牌(X为本局游戏你使用黑色牌指定其为目标的次数,至多为5)。你获得如下效果:⒈当你对其造成伤害时,你移去其1枚“恨”,令此伤害+1;⒉当其死亡时,若其有“恨”,你减1点体力上限,修改〖守执〗并获得〖兴门〗。", + dcxingmen: "兴门", + dcxingmen_info: "①当你因〖守执〗弃置而失去牌后,你可以回复1点体力。②当你因摸牌而得到牌后,若这些牌均为红色且牌数不小于2,则你使用这些牌时不能被响应。", +}; + +export default translates; diff --git a/character/xianding/voices.js b/character/xianding/voices.js new file mode 100644 index 000000000..efe42e6cd --- /dev/null +++ b/character/xianding/voices.js @@ -0,0 +1,518 @@ +export default { + "#dcjijie1": null, + "#dcjijie2": null, + "#dchuiji1": null, + "#dchuiji2": null, + "#sp_zhenji:die": "悼良会之永绝兮,哀一逝而异乡。", + "#dcjuewu1": null, + "#dcjuewu2": null, + "#dcwuyou1": null, + "#dcwuyou2": null, + "#dcyixian1": null, + "#dcyixian2": null, + "#wu_guanyu:die": "什么?此地名叫麦城?", + "#dczhimin1": "渤海虽阔,亦不及朕胸腹之广。", + "#dczhimin2": "民众渡海而来,当筑梧居相待。", + "#dcjujian1": "尔等眼中,只见到朕的昏庸吗?", + "#dcjujian2": "我做天子,不得自在邪?", + "#caofang:die": "匹夫无罪,怀璧其罪……", + "#dcsbquanmou1": "洛水为誓,皇天为证,吾意不在刀兵。", + "#dcsbquanmou2": "以谋代战,攻形不以力,攻心不以勇。", + "#dcsbpingliao1": "烽烟起大荒,戎军远役,问不臣者谁?", + "#dcsbpingliao2": "挥斥千军之贲,长驱万里之远。", + "#dc_sb_simayi:die": "以权谋而立者,必失大义于千秋……", + "#duanxie1": "区区绳索就想挡住吾等去路?!", + "#duanxie2": "以身索敌,何惧同伤!", + "#fenming1": "东吴男儿,岂是贪生怕死之辈?", + "#fenming2": "不惜性命,也要保主公周全!", + "#chendong:die": "杀身卫主,死而无憾!", + "#diaodu1": "诸军兵器战具,皆由我调配!", + "#diaodu2": "甲胄兵器,按我所说之法分发!", + "#diancai1": "军资之用,不可擅作主张!", + "#diancai2": "善用资财,乃为政上法!", + "#lvfan:die": "闻主公欲授大司马之职,容臣不能……谢恩了……", + "#zhengbi1": "跅弛之士,在御之而已。", + "#zhengbi2": "内不避亲,外不避仇。", + "#fengying1": "二臣恭奉,以迎皇嗣。", + "#fengying2": "奉旨典选,以迎忠良。", + "#cuimao:die": "为世所痛惜,冤哉……", + "#dczhantao1": null, + "#dczhantao2": null, + "#dcanjing1": null, + "#dcanjing2": null, + "#huzun:die": null, + "#dcjichun1": "寒梅不争春,空任群芳妒。", + "#dcjichun2": "三九寒天,尤有寒英凌霜。", + "#dchanying1": "寒冬已至,花开不远矣。", + "#dchanying2": "梅凌霜雪,其香不逊晚来者。", + "#zhugemengxue:die": "雪落青丝上,与君共白头。", + "#dclinghui1": "福兮祸所依,祸兮福所伏。", + "#dclinghui2": "枯桑知风,沧海知寒。", + "#dcxiace1": "风之积非厚,其负大翼也无力。", + "#dcxiace2": "人情同于抔土,岂穷达而异心。", + "#dcyuxin1": "得一人知情识趣,何妨同甘共苦。", + "#dcyuxin2": "临千军而不改其静,御心无波尔。", + "#bailingyun:die": "世人皆惧司马,独我痴情仲达……", + "#dczhangji1": null, + "#dczhangji2": null, + "#dczengou1": null, + "#dczengou2": null, + "#dc_qinghegongzhu:die": "我言非虚,君上何疑于我?", + "#dclingxi1": "灵犀渡清潭,涟漪扰我心。", + "#dclingxi2": "心有玲珑曲,万籁皆空灵。", + "#dczhifou1": "满怀相思意,念君君可知?", + "#dczhifou2": "世有人万万,相知无二三。", + "#caoxian:die": "恨生枭雄府,恨嫁君王家……", + "#dcsbronghuo1": "火莲绽江矶,炎映三千弱水。", + "#dcsbronghuo2": "奇志吞樯橹,潮平百万寇贼。", + "#dcsbyingmou1": "行计以险,纵略以奇,敌虽百万亦戏之如犬豕。", + "#dcsbyingmou2": "若生铸剑为犁之心,须有纵钺止戈之力。", + "#dc_sb_zhouyu:die": "人生之艰难,犹如不息之长河……", + "#dcsbmingshi1": "联刘以抗曹,此可行之大势。", + "#dcsbmingshi2": "强敌在北,唯协力可御之。", + "#dcsbmengmou1": "合左抑右,定两家之盟。", + "#dcsbmengmou2": "求同存异,邀英雄问鼎。", + "#dc_sb_lusu:die": "虎可为之用,亦可为之伤……", + "#dc_zj_a1": null, + "#dc_zj_a2": null, + "#dc_zj_b1": null, + "#dc_zj_b2": null, + "#zhangjian:die": null, + "#dcqiongying1": "冰心碎玉壶,光转琼英灿。", + "#dcqiongying2": "玉心玲珑意,撷英倚西楼。", + "#dcnuanhui1": "暖阳映雪,可照八九之风光。", + "#dcnuanhui2": "晓风和畅,吹融附柳之霜雪。", + "#zhugeruoxue:die": "自古佳人叹白头……", + "#dcmiyi1": "百战黄沙苦,舒颜红袖甜。", + "#dcmiyi2": "撷蜜凝饴糖,入喉润心颜。", + "#dcyinjun1": "既乘虎豹之威,当弘大魏万年。", + "#dcyinjun2": "今日青锋在手,可驯四方虎狼。", + "#caoyi:die": "霜落寒鸦浦,天下无故人……", + "#dclima1": null, + "#dclima2": null, + "#dcxiaoyin1": "鹿栖于野,必能奔光而来。", + "#dcxiaoyin2": "磨硝作引,可点心中灵犀。", + "#dchuahuo1": "馏石漆取上清,可为胜爆竹之花火。", + "#dchuahuo2": "莫道繁花好颜色,此火犹胜二月黄。", + "#malingli:die": "花无百日好,人无再少年……", + "#dcxiongmu1": "步步为营者,定无后顾之虞。", + "#dcxiongmu2": "明公彀中藏龙卧虎,放之海内皆可称贤。", + "#dczhangcai1": "今提墨笔绘乾坤,湖海添色山永春。", + "#dczhangcai2": "手提玉剑斥千军,昔日锦鲤化金龙。", + "#dcruxian1": "儒门有言,仁为己任,此生不负孔孟之礼。", + "#dcruxian2": "儒道尚仁而有礼,贤者知命而独悟。", + "#wu_luxun:die": "此生清白,不为浊泥所染……", + "#dcshangyu1": "君满腹才学,当为国之大器。", + "#dcshangyu2": "一腔青云之志,正待梦日之时。", + "#dccaixia1": "玉有十色五光,微瑕难掩其瑜。", + "#dccaixia2": "吾习扫天下之术,不善净一屋之秽。", + "#dc_xujing:die": "时人如江鲫,所逐者功利尔...", + "#fanghun1": "万花凋落尽,一梅独傲霜。", + "#fanghun2": "暗香疏影处,凌风踏雪来!", + "#fuhan1": "承先父之志,扶汉兴刘。", + "#fuhan2": "天将降大任于我。", + "#dc_zhaoxiang:die": "遁入阴影之中……", + "#zhengnan1": "末将愿承父志,随丞相出征!", + "#zhengnan2": "索全凭丞相差遣,万死不辞!", + "#xiefang": null, + "#xiefang1": null, + "#xiefang2": null, + "#dc_guansuo:die": null, + "#xinfu_wuniang1": "虽为女子身,不输男儿郎。", + "#xinfu_wuniang2": "剑舞轻盈,沙场克敌。", + "#xinfu_xushen1": "救命之恩,涌泉相报。", + "#xinfu_xushen2": "解我危难,报君华彩。", + "#xin_baosanniang:die": "我还想与你,共骑这雪花驹……", + "#biluan1": "身处乱世,自保足矣。", + "#biluan2": "避一时之乱,求长世安稳。", + "#lixia1": "英雄可安身立命于交州之地。", + "#lixia2": "将军真乃国之栋梁。", + "#dc_shixie:die": "我这一生,足矣……", + "#zhuiji": null, + "#zhuiji1": null, + "#zhuiji2": null, + "#ol_shichou1": "灭族之恨,不共戴天!", + "#ol_shichou2": "休想跑!", + "#dc_sp_machao:die": null, + "#fenyue1": "逆贼势大,且扎营寨,击其懈怠。", + "#fenyue2": "兵有其变,不在众寡。", + "#old_huangfusong:die": "吾只恨黄巾未平,不能报效朝廷……", + "#rebaobian1": "变可生,不变则死。", + "#rebaobian2": "适时而动,穷极则变。", + "#dc_xiahouba:die": "弃魏投蜀,死而无憾。", + "#xingwu1": "哼,不要小瞧女孩子哦!", + "#xingwu2": "姐妹齐心,其利断金。", + "#dcluoyan": null, + "#dcluoyan1": null, + "#dcluoyan2": null, + "#dc_daxiaoqiao:die": "伯符,公瑾,请一定要守护住我们的江东啊!", + "#dcposuo1": "绯纱婆娑起,佳人笑靥红。", + "#dcposuo2": "红烛映俏影,一舞影斑斓。", + "#dcxiaoren1": "红绡举腕重,明眸最溺人。", + "#dcxiaoren2": "飘然回雪轻,言然游龙惊。", + "#tianshangyi:die": "红梅待百花,魏宫无春风……", + "#dclingyue1": "宫商催角羽,仙乐自可聆。", + "#dclingyue2": "玉琶奏折柳,天地尽箫声。", + "#dcpandi1": "待君归时,共泛轻舟于湖海。", + "#dcpandi2": "妾有一曲,可壮卿之峥嵘。", + "#sunlingluan:die": "良人当归,苦酒何妨……", + "#dctongye1": "白首全金瓯,著风流于春秋。", + "#dctongye2": "长戈斩王气,统大业于四海。", + "#dcchangqu1": "布横江之铁索,徒自缚耳。", + "#dcchangqu2": "艨艟击浪,可下千里江陵。", + "#dc_wangjun:die": "未蹈曹刘覆辙,险遭士载之厄……", + "#dcshiji1": "哼~区区十丈之城,何须丞相图画。", + "#dcshiji2": "顽垒在前,可依不疑之计施为。", + "#dcsilun1": "习守静之术,行务时之风。", + "#dcsilun2": "纵笔瑞白雀,满座尽高朋。", + "#zhoubuyi:die": "人心者,叵测也。", + "#dcjianguo1": "彭蠡雁惊,此诚平吴之时。", + "#dcjianguo2": "奏三陈之诏,谏一国之弊。", + "#dcdyqingshi1": "潮起万丈之仞,可阻江南春风。", + "#dcdyqingshi2": "缮甲兵,耀威武,伐吴指日可待。", + "#dc_duyu:die": "六合即归一统,奈何寿数已尽……", + "#dcchanjuan1": "姐妹一心,共侍玄德无忧。", + "#dcchanjuan2": "双姝从龙,姊妹宠荣与共。", + "#dcxunbie1": "既为君之妇,何惧为君之鬼。", + "#dcxunbie2": "今临难将罹,唯求不负皇叔。", + "#ganfurenmifuren:die": "人生百年,奈何于我十不存一……", + "#shushen1": "船到桥头自然直。", + "#shushen2": "妾身无恙,相公请安心征战。", + "#shenzhi1": "子龙将军,一切都托付给你了。", + "#shenzhi2": "阿斗,相信妈妈,没事的。", + "#dc_ganfuren:die": "请替我照顾好阿斗。", + "#guixiu1": "闺楼独看花月,倚窗顾影自怜。", + "#guixiu2": "闺中女子,亦可秀气英拔。", + "#cunsi1": "一切,便托付将军了……", + "#cunsi2": "存汉室之嗣,留汉室之本。", + "#dc_mifuren:die": "阿斗被救,妾身……再无牵挂……", + "#gushe1": "公既知天命,识时务,为何要兴无名之师,犯我疆界?", + "#gushe2": "你若倒戈卸甲,以礼来降,仍不失封侯之位,国安民乐,岂不美哉?", + "#jici1": "谅尔等腐草之荧光,如何比得上天空之皓月?", + "#jici2": "你……诸葛村夫,你敢!", + "#wanglang:die": "你,你…哇啊…啊……", + "#dczhaowen1": "我辈昭昭,正始之音浩荡。", + "#dczhaowen2": "正文之昭,微言之绪,绝而复续。", + "#dcjiudun1": "籍不胜酒力,恐失言失仪。", + "#dcjiudun2": "秋月春风正好,不如大醉归去。", + "#ruanji:die": "诸君,欲与我同醉否?", + "#dcjincui1": "情记三顾之恩,亮必继之以死。", + "#dcjincui2": "身负六尺之孤,臣当鞠躬尽瘁。", + "#dcqingshi1": "兵者,行霸道之势,彰王道之实。", + "#dcqingshi2": "将为军魂,可因势而袭,其有战无类。", + "#dczhizhe1": "轻舟载浊酒,此去,我欲借箭十万。", + "#dczhizhe2": "主公有多大胆略,亮便有多少谋略。", + "#wu_zhugeliang:die": "天下事,了犹未了,终以不了了之……", + "#dccaizhuang1": "素手调脂粉,女子自有好颜色。", + "#dccaizhuang2": "为悦己者容,撷彩云为妆。", + "#dchuayi1": "皓腕凝霜雪,罗襦绣鹧鸪。", + "#dchuayi2": "绝色戴珠玉,佳人配华衣。", + "#duanqiaoxiao:die": "佳人时光少,君王总薄情……", + "#dchuizhi1": "妾有一席幽梦,予君三千暗香。", + "#dchuizhi2": "我有玲珑之心,其情唯衷陛下。", + "#dcjijiao1": "哀吾姊早逝,幸陛下垂怜。", + "#dcjijiao2": "居椒之殊荣,妾得之惶恐。", + "#zhangjinyun:die": "陛下,妾身来陪你了……", + "#dcjianzheng1": "将军今出洛阳,恐难再回。", + "#dcjianzheng2": "贼示弱于外,必包藏祸心。", + "#dcfumou1": "某有良谋,可为将军所用。", + "#dcfumou2": "吾负十斗之囊,其盈一石之智。", + "#huanfan:die": "有良言而不用,君何愚哉……", + "#dcctjiuxian1": "救袍泽于水火,返清明于天下。", + "#dcctjiuxian2": "与君共扼王旗,焉能见死不救。", + "#dcchenyong1": "将者,当泰山崩于前而不改色。", + "#dcchenyong2": "救将陷之城,焉求益兵之助。", + "#chentai:die": "公非旦,我非勃……", + "#dcquanshou1": "曹军势大,不可刚其锋。", + "#dcquanshou2": "持重待守,不战而胜十万雄兵。", + "#dcshexue1": "虽为武夫,亦需极目汗青。", + "#dcshexue2": "武可靖天下,然不能定天下。", + "#sunyu:die": "孙氏始得江东,奈何魂归黄泉……", + "#dcdanyi1": "满城锦绣,何及笔下春秋?", + "#dcdanyi2": "一心向学,不闻窗外风雨。", + "#dcwencan1": "宴友以文,书声喧哗,众宾欢也。", + "#dcwencan2": "众星灿于九天,犹雅文耀于万世。", + "#xizheng:die": "此生有涯,奈何学海无涯……", + "#dcwangyuan1": "小女子不才,愿伴公子余生。", + "#dcwangyuan2": "纵有万钧之力,然不斩情丝。", + "#dclingyin1": "环佩婉尔,心动情动铃儿动。", + "#dclingyin2": "小鹿撞入我怀,银铃焉能不鸣?", + "#dcliying1": "飞影略白鹭,日暮栖君怀。", + "#dcliying2": "妾影婆娑,摇曳君心。", + "#dc_ruiji:die": "佳人芳华逝,空余孤铃鸣……", + "#dccansi1": "君不入地狱,谁入地狱?", + "#dccansi2": "众生皆苦,唯渡众生于极乐。", + "#dcfozong1": "此身无长物,愿奉骨肉为浮屠。", + "#dcfozong2": "驱大白牛车,颂无上功德。", + "#zerong:die": "此劫,不可避……", + "#dcyuandi1": "此生与君为好,共结连理。", + "#dcyuandi2": "结发元嫡,其情唯衷孙郎。", + "#dcxinyou1": "我有幽月一斛,可醉十里春风。", + "#dcxinyou2": "心在方外,故而不闻市井之声。", + "#xielingyu:die": "翠瓦红墙处,最折意中人。", + "#dczhaohan1": "此心昭昭,惟愿汉明。", + "#dczhaohan2": "天曰昭德!天曰昭汉!", + "#dcjinjie1": "大汉养士百载,今乃奉节之时。", + "#dcjinjie2": "尔等皆忘天地君亲师乎?", + "#dcjue1": "尔等一家之言,难堵天下悠悠之口。", + "#dcjue2": "区区黄门而敛财千万,可诛其九族。", + "#dc_yangbiao:die": "愧无日磾先见之明,犹怀老牛舐犊之爱……", + "#dcluochong1": "陛下独宠她人,奈何雨露不均。", + "#dcluochong2": "妾贵于佳丽,然宠不及三千。", + "#dcaichen1": "君可负妾,然妾不负君。", + "#dcaichen2": "所思所想,皆系陛下。", + "#dc_tengfanglan:die": "今生缘尽,来世两宽……", + "#dcjianji1": "备枭雄也,布虓虎也,当间之。", + "#dcjianji2": "二虎和则我亡,二虎斗则我兴。", + "#dcyuanmo1": "强敌不可战,弱敌不可恕。", + "#dcyuanmo2": "孙伯符羽翼已丰,主公当图刘备。", + "#yanghong:die": "主公为何不听我一言?", + "#dcxialei1": "采霞揾晶泪,沾我青衫湿。", + "#dcxialei2": "登车入宫墙,垂泪凝如瑙。", + "#dcanzhi": null, + "#dcanzhi1": "深闱行彩线,唯手熟尔。", + "#dcanzhi2": "星月独照人,何谓之暗?", + "#xuelingyun:die": "寒月隐幕,难作衣裳。", + "#wylianji1": "两计扣用,以催强势。", + "#wylianji2": "容老夫细细思量。", + "#moucheng1": "董贼伏诛,天下太平!", + "#moucheng2": "叫天不应,叫地不灵,今天就是你的死期!", + "#dc_wangyun:die": "逆贼何必多言,今日有死而已!", + "#dcwumei1": "大梦若期,皆付一枕黄粱。", + "#dcwumei2": "日所思之,故夜所梦之。", + "#dczhanmeng1": "梦境缥缈,然有迹可占。", + "#dczhanmeng2": "万物有兆,唯梦可卜。", + "#dc_zhouxuān:die": "人生如梦,假时亦真。", + "#dcjingzao1": "闭门绝韦编,造经教世人。", + "#dcjingzao2": "著文成经,可教万世之人。", + "#dcenyu1": "君以国士待我,我必国士报之。", + "#dcenyu2": "吾本乡野腐儒,幸隆君之大恩。", + "#chengbing:die": "著经未成,此憾事也……", + "#dclianzhi1": "刘董同气连枝,一损则俱损。", + "#dclianzhi2": "妾虽女流,然亦有忠侍陛下之心。", + "#dclingfang1": "曹贼欲加之罪,何患无据可言。", + "#dclingfang2": "花落水自流,何须怨东风。", + "#dcfengying1": "可怜东篱寒累树,孤影落秋风。", + "#dcfengying2": "西风落,西风落,宫墙不堪破。", + "#dongguiren:die": "陛下乃大汉皇帝,不可言乞。", + "#dcfangdu1": "浮萍却红尘,何意染是非?", + "#dcfangdu2": "我本无意争春,奈何群芳相妒。", + "#dcjiexing1": "女子有节,安能贰其行?", + "#dcjiexing2": "坐受雨露,皆为君恩。", + "#yuanji:die": "妾本蒲柳,幸荣君恩……", + "#dcxiangmian1": "以吾之见,阁下命不久矣。", + "#dcxiangmian2": "印堂发黑,将军危在旦夕。", + "#dctianji1": "顺天而行,坐收其利。", + "#dctianji2": "只可意会,不可言传。", + "#zhujianping:die": "天机,不可泄露啊……", + "#dctongguan": null, + "#dctongguan1": "极目宇宙,可观如织之命数。", + "#dctongguan2": "命河长往,唯我立于川上。", + "#dcmengjie": null, + "#dcmengjie1": "唇舌之语,难言虚实之境。", + "#dcmengjie2": "解梦之术,如镜中观花尔。", + "#zhaozhi:die": "解人之梦者,犹在己梦中。", + "#dcpoyuan1": "砲石飞空,坚垣难存。", + "#dcpoyuan2": "声若霹雳,人马俱摧。", + "#dchuace1": "筹画所料,无有不中。", + "#dchuace2": "献策破敌,所谋皆应。", + "#dc_liuye:die": "功名富贵,到头来,不过黄土一抔…", + "#dcyaoyi1": "对弈未分高下,胜负可问春风。", + "#dcyaoyi2": "我掷三十六道,邀君游弈其中。", + "#dcfuxue1": "普天之大,唯此处可安书桌。", + "#dcfuxue2": "书中自有风月,何故东奔西顾?", + "#luyi:die": "此生博弈,落子未有悔……", + "#dcfengyan": null, + "#dcfengyan1": "既将我儿杀之,何复念之!", + "#dcfengyan2": "乞问曹公,吾儿何时归还?", + "#dcfudao": null, + "#dcfudao1": "弑子之仇,不共戴天!", + "#dcfudao2": "眼中泪绝,尽付仇怆。", + "#dingshangwan:die": "吾儿既丧,天地无光……", + "#dchuishu1": "心有慧镜,善解百般人意。", + "#dchuishu2": "袖着静淑,可揾夜阑之泪。", + "#dcyishu1": "此命由我,如织之数可易。", + "#dcyishu2": "易天定之数,结人定之缘。", + "#dcligong1": "伴君离高墙,日暮江湖远。", + "#dcligong2": "巍巍宫门开,自此不复来。", + "#quanhuijie:die": "妾有愧于陛下。", + "#dcfanyin1": "此音可协,此律可振。", + "#dcfanyin2": "玄妙殊巧,可谓绝技。", + "#dcpeiqi1": "声依永,律和声。", + "#dcpeiqi2": "音律不协,不可用也。", + "#dukui:die": "此钟不堪用,再铸!", + "#dcwanglu1": "大攻车前,坚城弗当。", + "#dcwanglu2": "大攻既作,天下可望!", + "#dcxianzhu1": "敌垒已陷,当长驱直入!", + "#dcxianzhu2": "舍命陷登,击蛟蟒于狂澜!", + "#dcchaixie1": "利器经久,拆合自用。", + "#dcchaixie2": "损一得十,如鲸落宇。", + "#zhangfen:die": "身陨外,愿魂归江东……", + "#dcgeyuan1": "绘同径之距,置内圆而割之。", + "#dcgeyuan2": "矩割弥细,圆失弥少,以至不可割。", + "#dcjieshu1": "累乘除以成九数者,可以加减解之。", + "#dcjieshu2": "数有其理,见筹一可知沙数。", + "#dcgusuan1": "勾中容横,股中容直,可知其玄五。", + "#dcgusuan2": "累矩连索,类推衍化,开立而得法。", + "#liuhui:die": "算学如海,穷我一生,只得杯水……", + "#dckaiji1": "谋虑渊深,料远若近。", + "#dckaiji2": "视昧而察,筹不虚运。", + "#dcpingxi1": "地有常险,守无常势。", + "#dcpingxi2": "国有常众,战无常胜。", + "#dc_wangchang:die": "志存开济,人亡政息……", + "#dczhongjie1": "气节之士,不可不救。", + "#dczhongjie2": "志士遭祸,应施以援手。", + "#dcsushou1": "敌众我寡,怎可少谋?", + "#dcsushou2": "临城据守,当出奇计。", + "#zhaoang:die": "援军为何迟迟不至?", + "#caiyi1": "凰凤化越,彩翼犹存。", + "#caiyi2": "身披彩翼,心有灵犀。", + "#guili1": "既离厄海,当归泸沽。", + "#guili2": "山野如春,不如归去。", + "#caohua:die": "自古忠孝难两全……", + "#dcsuifu1": "以柔克刚,方是良策。", + "#dcsuifu2": "镇抚边疆,为国家计。", + "#dcpijing1": "群寇来袭,愿和将军同御外侮。", + "#dcpijing2": "天下不宁,愿与阁下共守此州。", + "#dc_liuyu:die": "公孙瓒谋逆,人人可诛!", + "#dcjinggong1": "屈臂发弓,亲射猛虎。", + "#dcjinggong2": "幼习弓弩,正为此时!", + "#dcxiaojuan1": "骁锐敢斗,威震江夏!", + "#dcxiaojuan2": "得隽为雄,气贯大江!", + "#dc_huangzu:die": "周瑜小儿,竟破了我的埋伏?", + "#xiaowu1": "繁星临云袖,明月耀舞衣。", + "#xiaowu2": "逐舞飘轻袖,传歌共绕梁。", + "#huaping1": "风絮飘残,化萍而终。", + "#huaping2": "莲泥刚倩,藕丝萦绕。", + "#laiyinger:die": "谷底幽兰艳,芳魂永留香……", + "#qianlong1": "鸟栖于林,龙潜于渊。", + "#qianlong2": "游鱼惊钓,潜龙飞天。", + "#fensi1": "此贼之心,路人皆知!", + "#fensi2": "孤君烈忿,怒愈秋霜。", + "#juetao1": "登车拔剑起,奋跃搏乱臣!", + "#juetao2": "陵云决心意,登辇讨不臣!", + "#zhushi1": "可有爱卿愿助朕讨贼?", + "#zhushi2": "泱泱大魏,忠臣俱亡乎?", + "#caomao:die": "宁作高贵乡公死,不作汉献帝生……", + "#renzheng1": "仁政如水,可润万物", + "#renzheng2": "为官一任,当造福一方。", + "#jinjian1": "臣代天子牧民,闻苛自当谏之。", + "#jinjian2": "为将者死战,为臣者死谏!", + "#dc_luotong:die": "而立之年,奈何早逝。", + "#tiqi1": "远望中原,涕泪交流。", + "#tiqi2": "瞻望家乡,泣涕如雨。", + "#baoshu1": "明镜映梳台,黛眉衬粉面。", + "#baoshu2": "头作扶摇髻,首枕千金梳。", + "#re_fengfangnv:die": "诸位,为何如此对我?", + "#tianyun1": "天垂象,见吉凶。", + "#tianyun2": "治历数,知风气。", + "#wfyuyan1": "差若毫厘,谬以千里,需慎之。", + "#wfyuyan2": "六爻之动,三极之道也。", + "#wufan:die": "天运之术今绝矣……", + "#zhoufu1": "违吾咒者,倾死灭亡。", + "#zhoufu2": "咒宝符命,速显威灵。", + "#yingbin1": "所呼立至,所召立前。", + "#yingbin2": "朱雀玄武,誓为我征。", + "#re_zhangbao:die": "黄天……为何?!", + "#syjiqiao1": "为将者,当躬冒矢石!", + "#syjiqiao2": "吾承父兄之志,危又何惧?", + "#syxiongyi1": "此仇不报,吾恨难消!", + "#syxiongyi2": "功业未立,汝可继之!", + "#re_sunyi:die": "功业未成而身先死,惜哉,惜哉!", + "#yuqi1": "孤影独泣,困于隅角。", + "#yuqi2": "向隅而泣,黯然伤感。", + "#shanshen1": "好善为德,坚守本心。", + "#shanshen2": "洁身自爱,独善其身。", + "#xianjing1": "文静娴丽,举止柔美。", + "#xianjing2": "娴静淡雅,温婉穆穆。", + "#caojinyu:die": "平叔之情,吾岂不明。", + "#zhukou1": "草莽贼寇,不过如此。", + "#zhukou2": "轻装上阵,利剑出鞘。", + "#mengqing": null, + "#mengqing1": "女之耽兮,不可说也。", + "#mengqing2": "淇水汤汤,渐车帷裳。", + "#zhouyi:die": "江水寒,萧瑟起……", + "#zhiren1": "穿针引线,栩栩如生。", + "#zhiren2": "纺绩织纴,布帛可成。", + "#yaner1": "如胶似漆,白首相随。", + "#yaner2": "新婚燕尔,亲睦和美。", + "#re_panshu:die": "有喜必忧,以为深戒!", + "#youyan1": "诱言者,为人所不齿。", + "#youyan2": "诱言之弊,不可不慎。", + "#zhuihuan1": "伤人者,追而还之!", + "#zhuihuan2": "追而还击,皆为因果。", + "#yangwan:die": "遇人不淑……", + "#xingzuo1": "顺人之情,时之势,兴作可成。", + "#xingzuo2": "兴作从心,相继不绝。", + "#miaoxian": null, + "#miaoxian1": "女为悦者容,士为知己死。", + "#miaoxian2": "与君高歌,请君侧耳。", + "#ruanyu:die": "良时忽过,身为土灰。", + "#bazhan1": "此酒,当配将军。", + "#bazhan2": "这杯酒,敬于将军。", + "#jiaoying1": "独酌清醮,霓裳自舞。", + "#jiaoying2": "醮影倩丽,何人爱怜。", + "#fanyufeng:die": "醮妇再遇良人难……", + "#pianchong1": "得陛下怜爱,恩宠不衰。", + "#pianchong2": "谬蒙圣恩,光授殊宠。", + "#zunwei1": "处尊居显,位极椒房。", + "#zunwei2": "自在东宫,及即尊位。", + "#guozhao:die": "我的出身,不配为后?", + "#zhongjian1": "浊世风云变幻,当以明眸洞察。", + "#zhongjian2": "心中自有明镜,可鉴奸佞忠良。", + "#caishi1": "清识难尚,至德可师。", + "#caishi2": "知书达礼,博古通今。", + "#re_xinxianying:die": "吾一生明鉴,竟错看于你。", + "#shiyuan1": "感怀诗于前,绝怨赋于后。", + "#shiyuan2": "汉宫楚歌起,四面无援矣。", + "#dushi1": "孤无病,此药无需服。", + "#dushi2": "辟恶之毒,为最毒。", + "#yuwei1": null, + "#yuwei2": null, + "#liubian:die": "侯非侯,王非王……", + "#refenyin1": "斗志高歌,士气昂扬!", + "#refenyin2": "抗音而歌,左右应之!", + "#liji1": "破敌搴旗,未尝负败!", + "#liji2": "鸷猛壮烈,万人不敌!", + "#re_liuzan:die": "若因病困此,命矣。", + "#lvli1": "此击若中,万念俱灰!", + "#lvli2": "姿器膂力,万人之雄。", + "#choujue1": "家仇未报,怎可独安?", + "#choujue2": "逆臣之军,不足畏惧!", + "#wenyang:die": "痛贯心膂,天灭大魏啊!", + "#spzhuilie": null, + "#spzhuilie1": "哈哈!我喜欢,猎夺沙场的快感!", + "#spzhuilie2": "追敌夺魂,猎尽贼寇。", + "#wangshuang:die": "我居然,被蜀军所击倒。", + "#manyi1": "蛮族的力量,你可不要小瞧!", + "#manyi2": "南蛮女子,该当英勇善战!", + "#mansi1": "多谢父母怜爱。", + "#mansi2": "承父母庇护,得此福气。", + "#souying1": "真薮影移,险战不惧!", + "#souying2": "幽薮影单,只身勇斗!", + "#zhanyuan1": "势不同,情相随。", + "#zhanyuan2": "战中结缘,虽苦亦甜。", + "#huaman:die": "南蛮之地的花,还在开吗……", + "#pytianjiang1": "天赐匠法,精心锤炼。", + "#pytianjiang2": "巧夺天工,超凡脱俗。", + "#pyzhuren1": "此刀,可劈铁珠之筒。", + "#pyzhuren2": "造刀三千口,用法各不同。", + "#puyuan:die": "铸木镂冰,怎成大器。", + "#tuiyan1": "鸟语略知,万物略懂。", + "#tuiyan2": "玄妙之舒巧,推微而知晓。", + "#busuan1": "喜仰视星辰,夜不肯寐。", + "#busuan2": "今日一卦,便知命数。", + "#mingjie1": "戒律循规,不可妄贪。", + "#guanlu:die": "怀我好英,心非草木……", + "#gxlianhua1": "草木精炼,万物化丹。", + "#gxlianhua2": "白日青山,飞升化仙。", + "#zhafu1": "垂恩广救,慈悲在怀。", + "#zhafu2": "行符敕鬼,神变善易。", + "#gexuan:die": "善变化,拙用身。", + "#kuiji1": "绝域奋击,孤注一掷。", + "#kuiji2": "舍得一身剐,不畏君王威。", + "#leitong:die": "翼德救我……", + "#wlcuorui1": "减辎疾行,挫敌军锐气。", + "#wlcuorui2": "外物当舍,摄敌为重。", + "#wulan:die": "蛮狗,尔敢杀我!", +}; diff --git a/character/xinghuoliaoyuan.js b/character/xinghuoliaoyuan.js deleted file mode 100755 index da8ac9125..000000000 --- a/character/xinghuoliaoyuan.js +++ /dev/null @@ -1,1998 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "xinghuoliaoyuan", - connect: true, - character: { - wangcan: ["male", "qun", 3, ["xinfu_sanwen", "xinfu_qiai", "xinfu_denglou"]], - sp_taishici: ["male", "qun", 4, ["xinfu_jixu"]], - re_jsp_pangtong: ["male", "wu", 3, ["xinfu_guolun", "xinfu_songsang"]], - lvdai: ["male", "wu", 4, ["xinfu_qinguo"]], - re_zhangliang: ["male", "qun", 4, ["xinfu_jijun", "xinfu_fangtong"]], - lvqian: ["male", "wei", 4, ["xinfu_weilu", "xinfu_zengdao"]], - panjun: ["male", "wu", 3, ["xinfu_guanwei", "xinfu_gongqing"]], - duji: ["male", "wei", 3, ["xinfu_andong", "xinfu_yingshi"]], - zhoufang: ["male", "wu", 3, ["xinfu_duanfa", "xinfu_youdi"]], - yanjun: ["male", "wu", 3, ["xinfu_guanchao", "xinfu_xunxian"]], - liuyao: ["male", "qun", 4, ["xinfu_kannan", "twniju"], ["zhu"]], - liuyan: ["male", "qun", 3, ["xinfu_tushe", "xinfu_limu"]], - }, - characterSort: { - xinghuoliaoyuan: { - // xinghuoliaoyuan_tianfu:[], - xinghuoliaoyuan_tianliang: ["duji", "liuyan", "yanjun"], - xinghuoliaoyuan_tianji: ["panjun", "wangcan"], - xinghuoliaoyuan_tiantong: ["re_jsp_pangtong", "sp_taishici"], - xinghuoliaoyuan_tianxiang: ["lvdai", "zhoufang", "liuyao"], - xinghuoliaoyuan_qisha: ["lvqian", "re_zhangliang"], - }, - }, - characterIntro: { - wangcan: - "王粲(177年-217年2月17日),字仲宣。山阳郡高平县(今山东微山两城镇)人。东汉末年文学家,“建安七子”之一,太尉王龚曾孙、司空王畅之孙。", - re_jsp_pangtong: - "庞统,字士元,襄阳(治今湖北襄阳)人。三国时刘备帐下谋士,官拜军师中郎将。才智与诸葛亮齐名,人称“凤雏”。在进围雒县时,统率众攻城,不幸被流矢击中去世,时年三十六岁。追赐统为关内侯,谥曰靖侯。庞统死后,葬于落凤庞统墓坡。", - lvdai: "吕岱(161年-256年),字定公,广陵海陵(今江苏如皋)人。三国时期吴国重臣、将领。吕岱一生戮力奉公,为孙吴开疆拓土,功勋赫赫。太平元年(256年),吕岱去世,年九十六。", - lvqian: "吕虔(生卒年不详),字子恪。任城国(今山东济宁东南)人。汉末至三国曹魏时期将领。 吕虔有勇有谋,曹操在兖州时,任命他为从事,率领家丁驻守湖陆。后升任泰山太守,与夏侯渊共同镇压济南等地的黄巾军。被推举为秀才,加任骑都尉,仍管辖泰山郡。 曹丕继任魏王后,加吕虔为裨将军,封益寿亭侯。再升任徐州刺史,加任威虏将军。任用王祥为别驾,将民政事务都委托于他,为世人所称赞。曹叡继位后,改封万年亭侯。吕虔死后,其子吕翻世袭万年亭侯。", - panjun: "潘濬(一作潘浚)(?-239年),字承明。武陵郡汉寿县(今湖南汉寿)人。三国时期吴国重臣,蜀汉大司马蒋琬的表弟。 潘濬为人聪察,对问有机理,拜大儒宋忠为师,得到“建安七子”之一的王粲赏识。不到三十,即被荆州牧刘表任命为江夏从事,因按杀贪污的沙羡长而闻名。建安十六年(211年),被刘备任命为荆州治中从事,与守臣关羽不睦。建安二十四年(219年),孙权得荆州,拜潘濬为辅军中郎将。又迁奋威将军,封常迁亭侯。孙权称帝后,拜少府,进封刘阳侯,又改太常。黄龙三年(231年),授假节,与吕岱率军五万平五溪蛮夷叛乱,经三年而斩获数万,使得一方宁静。潘濬为人刚正不阿,在吕壹弄权时,屡请孙权将其诛杀。甚至想亲手击杀吕壹,使吕壹对他非常畏惧。 赤乌二年(239年),潘濬去世。", - duji: "杜畿(163年—224年),字伯侯,京兆杜陵(今陕西西安东南)人。东汉末及三国时曹魏官吏及将领。西汉御史大夫杜延年的后代。历官郡功曹、守郑县令,善于断案。荀彧将他举荐给曹操,曹操任命他为司空司直,调任护羌校尉,使持节领西平太守。 曹丕受禅登基后,封杜畿为丰乐亭侯。官至尚书仆射。后在陶河试航时遇上大风沉没,杜畿淹死,死时六十二岁,曹丕为之涕泣,追赠其为太仆,谥戴侯。", - zhoufang: - "周鲂(生卒年不详),字子鱼。吴郡阳羡县(今江苏宜兴)人。三国时期吴国将领。周鲂年少时好学,被举为孝廉。历任宁国县长、怀安县长、钱塘侯相,一月之内,便斩杀作乱的彭式及其党羽,因而升任丹阳西部都尉。彭绮率数万人反叛时,周鲂被任命为鄱阳太守,与胡综共同将其生擒,因功加职昭义校尉。后诈降曹休,诱其率军接应,使曹休在石亭之战中一败涂地,战后因功被加职为裨将军,封关内侯。贼帅董嗣凭险骚扰豫章等郡,周鲂派间谍将其诱杀,不费兵卒即安定数郡。周鲂在鄱阳赏罚分明、恩威并施,于任职十三年后去世。", - yanjun: "严畯(生卒年不详),字曼才,彭城(治今江苏徐州)人,三国时期孙吴官员、学者。性情忠厚,待人以诚。少好学,精通《诗》、《书》、《三礼》,又好《说文》。避乱江东,与诸葛瑾、步骘是好朋友,被张昭推荐给孙权作骑都尉、从事中郎。建安二十二年(217年),横江将军鲁肃去世,孙权打算让严畯接替其位。严畯很有自知之明,知道自己没有能力对抗在荆州的关羽和北面的曹魏,便坚决不接受此任命。后来担任尚书令。严畯享年七十八岁。著有《孝经传》、《潮水论》。", - liuyao: "刘繇(一读yóu)(156年-197年),字正礼。东莱牟平(今山东牟平)人。东汉末年宗室、大臣,汉末群雄之一,齐悼惠王刘肥之后,太尉刘宠之侄。
    刘繇最初被推举为孝廉,授郎中。任下邑县长时,因拒郡守请托而弃官。后被征辟为司空掾属,除授侍御史,因战乱而不到任,避居淮浦。兴平元年(194年),被任命为扬州刺史。他先后与袁术、孙策交战,一度被朝廷加授为扬州牧、振武将军,但最终还是败归丹徒。此后,刘繇又击破反叛的笮融,旋即病逝,年四十二。", - liuyan: "刘焉(?-194年),字君郎(《华阳国志》又作君朗)。江夏郡竟陵县(今湖北省天门市)人。东汉末年宗室、军阀,汉末群雄之一,西汉鲁恭王刘余之后。
    刘焉初以汉朝宗室身份,拜为中郎,历任雒阳令、冀州刺史、南阳太守、宗正、太常等官。因益州刺史郄俭在益州大肆聚敛,贪婪成风,加上当时天下大乱。刘焉欲取得一安身立命之所,割据一方,于是向朝廷求为益州牧,封阳城侯,前往益州整饬吏治。郄俭为黄巾军所杀,刘焉进入益州,派张鲁盘踞汉中,张鲁截断交通,斩杀汉使,从此益州与中央道路不通。刘焉进一步对内打击地方豪强,巩固自身势力,益州因而处于半独立的状态。兴平元年(194年),刘焉因背疮迸发而逝世,其子刘璋继领益州牧。", - }, - characterTitle: {}, - perfectPair: { - lijue: ["guosi", "jiaxu"], - zhangji: ["zhangxiu", "drlt_zhangxiu", "zoushi"], - xf_sufei: ["ganning"], - //baosanniang:['guansuo'], - simahui: ["pangdegong"], - zhangqiying: ["zhanglu"], - pangtong: ["zhugejin"], - taishici: ["liuyao", "kongrong"], - //zhaotongzhaoguang:['zhaoyun','mayunlu'], - }, - skill: { - xinyingshi: { - audio: "xinfu_yingshi", - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return ( - player.countCards("he") > 0 && - !game.hasPlayer(function (current) { - return current.getExpansions("xinyingshi_cards").length > 0; - }) - ); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - filterCard: true, - filterTarget: lib.filter.notMe, - selectCard: [1, player.countCards("he")], - position: "he", - prompt: get.prompt("xinyingshi"), - prompt2: "将任意张牌置于一名其他角色的武将牌上作为“酬”", - ai1: function (card) { - return 1 - player.getUseValue(card); - }, - ai2: function (target) { - var player = _status.event.player; - return ( - (1 + - game.countPlayer(function (current) { - return ( - get.attitude(player, current) > 0 && - current.inRange(target) && - get.damageEffect(target, current, player) > 0 - ); - })) * - -get.attitude(player, target) - ); - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0], - cards = result.cards; - player.logSkill("xinyingshi", target); - target.addSkill("xinyingshi_cards"); - target.addToExpansion(player, "give", cards).gaintag.add("xinyingshi_cards"); - target.storage.xinyingshi_source = player; - } - }, - subSkill: { - cards: { - trigger: { player: "damageSource" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return ( - event.source && - event.source.isIn() && - event.card && - event.getParent().type == "card" && - player.getExpansions("xinyingshi_cards").length - ); - }, - logTarget: "source", - content: function () { - "step 0"; - event.target = trigger.source; - event.target.chooseButton([ - "应势:请选择你的赏金", - player.getExpansions("xinyingshi_cards"), - ]); - "step 1"; - if (result.bool) { - var cards = [result.links[0]]; - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var card = ui.cardPile.childNodes[i]; - if (card.number == cards[0].number && card.suit == cards[0].suit) - cards.push(card); - } - player.$give(cards[0], target); - if (cards.length > 1) { - setTimeout(function () { - target.$gain2(cards.slice(1)); - }, get.delayx(200, 200)); - game.log(target, "从牌堆获得了", cards.slice(1)); - } - game.delay(0, get.delayx(500, 500)); - target.gain(cards); - } - "step 2"; - if (!player.getExpansions("xinyingshi_cards").length) - player.removeSkill("xinyingshi_cards"); - }, - marktext: "酬", - intro: { - content: "expansion", - markcount: "expansion", - }, - ai: { threaten: 3 }, - group: "xinyingshi_regain", - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - delete player.storage.xinyingshi_source; - }, - }, - regain: { - trigger: { player: "die" }, - forced: true, - charlotte: true, - forceDie: true, - filter: function (event, player) { - return ( - player.storage.xinyingshi_source && - player.storage.xinyingshi_source.isIn() && - player.getExpansions("xinyingshi_cards").length > 0 - ); - }, - content: function () { - player.storage.xinyingshi_source.gain( - player.getExpansions("xinyingshi_cards"), - player, - "give", - "bySelf" - ); - }, - }, - }, - }, - xinfu_guolun: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.choosePlayerCard(target, true, "h"); - "step 1"; - event.cardt = result.cards[0]; - target.showCards(event.cardt); - player.chooseCard("he").set("ai", function (card) { - var event = _status.event.getParent(), - player = event.player; - var numt = get.number(event.cardt); - var att = get.attitude(player, target); - var value = get.value(event.cardt); - var num = get.number(card); - if (num < numt || att > 2) return value + 6 - get.value(card); - else if (num == numt) return value - get.value(card); - return -1; - }); - "step 2"; - if (!result.bool) event.finish(); - else { - player.showCards(result.cards); - event.cardp = result.cards[0]; - } - "step 3"; - player.swapHandcards(target, [event.cardp], [event.cardt]); - "step 4"; - var nump = get.number(event.cardp, player); - var numt = get.number(event.cardt, target); - if (nump < numt) { - player.draw(); - } else if (nump > numt) { - target.draw(); - } - }, - ai: { - threaten: 1.5, - order: 8, - result: { - player: function (player, target) { - if (get.attitude(player, target) > 0) return 1.5; - return 0.5; - }, - }, - }, - }, - xinfu_zhanji: { - audio: 2, - trigger: { - player: "gainAfter", - }, - forced: true, - filter: function (event, player) { - if (!player.isPhaseUsing()) return false; - return event.getParent().name == "draw" && event.getParent(2).name != "xinfu_zhanji"; - }, - content: function () { - player.draw("nodelay"); - }, - }, - xinfu_songsang: { - limited: true, - skillAnimation: true, - animationColor: "wood", - audio: 2, - derivation: "xinfu_zhanji", - trigger: { global: "dieAfter" }, - logTarget: "player", - async content(e, t, player) { - player.awakenSkill("xinfu_songsang"); - if (player.isDamaged()) { - player.recover(); - } else player.gainMaxHp(); - player.addSkills("xinfu_zhanji"); - }, - }, - xinfu_jixu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterTarget: function (card, player, target) { - if (player == target) return false; - if (ui.selected.targets.length) { - return target.hp == ui.selected.targets[0].hp; - } - return true; - }, - selectTarget: [1, Infinity], - multitarget: true, - multiline: true, - content: function () { - "step 0"; - targets.sort(lib.sort.seat); - "step 1"; - if (!event.num) event.num = 0; - if (!event.caicuolist) event.caicuolist = []; - targets[event.num].chooseBool("是否押杀?").ai = function (event, player) { - var evt = _status.event.getParent(); - if (get.attitude(targets[event.num], evt.player) > 0) - return evt.player.countCards("h", "sha") ? false : true; - return Math.random() < 0.5; - }; - "step 2"; - if (result.bool) { - targets[event.num].chat("有杀"); - game.log(targets[event.num], "认为", player, "#g有杀"); - if (!player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); - } else { - targets[event.num].chat("没杀"); - game.log(targets[event.num], "认为", player, "#y没有杀"); - if (player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); - } - event.num++; - game.delay(); - if (event.num < targets.length) event.goto(1); - "step 3"; - player.popup(player.countCards("h", "sha") ? "有杀" : "没杀"); - game.log(player, player.countCards("h", "sha") ? "有杀" : "没杀"); - if (event.caicuolist.length == 0) { - var evt = _status.event.getParent("phaseUse"); - if (evt && evt.name == "phaseUse") { - evt.skipped = true; - event.finish(); - } - } else { - player.draw(event.caicuolist.length); - if (player.countCards("h", "sha")) { - player.addTempSkill("jixu_sha"); - player.storage.jixu_sha = event.caicuolist; - event.finish(); - } else event.num = 0; - } - "step 4"; - if (event.num < event.caicuolist.length) { - var target = event.caicuolist[event.num]; - player.discardPlayerCard(true, "he", target); - event.num++; - event.redo(); - } - }, - ai: { - order: function () { - return get.order({ name: "sha" }) + 0.1; - }, - result: { - target: function (player, target) { - var raweffect = function (player, target) { - if (player.countCards("h", "sha")) { - return get.effect(target, { name: "sha" }, player, target); - } else { - var att = get.attitude(player, target); - var nh = target.countCards("h"); - if (att > 0) { - if ( - target.getEquip("baiyin") && - target.isDamaged() && - get.recoverEffect(target, player, player) > 0 - ) { - if (target.hp == 1 && !target.hujia) return 1.6; - if (target.hp == 2) return 0.01; - return 0; - } - } - var es = target.getCards("e"); - var noe = es.length == 0 || target.hasSkillTag("noe"); - var noe2 = es.length == 1 && es[0].name == "baiyin" && target.isDamaged(); - var noh = nh == 0 || target.hasSkillTag("noh"); - if (noh && (noe || noe2)) return 0; - if (att <= 0 && !target.countCards("he")) return 1.5; - return -1.5; - } - }; - var num = game.countPlayer(function (current) { - return ( - current != player && - current.hp == target.hp && - raweffect(player, current) * get.attitude(player, current) > 0 - ); - }); - return raweffect(player, target) * Math.max(0, num - 1); - }, - }, - expose: 0.4, - }, - }, - jixu_sha: { - audio: "xinfu_jixu", - trigger: { - player: "useCard", - }, - onremove: function (player) { - delete player.storage.jixu_sha; - }, - filter: function (event, player) { - if (event.card.name == "sha") { - return game.hasPlayer(function (current) { - return ( - current != player && - player.storage.jixu_sha.includes(current) && - !event.targets.includes(current) - ); - }); - } - return false; - }, - forced: true, - silent: true, - popup: false, - content: function () { - player.logSkill("xinfu_jixu"); - for (var i = 0; i < player.storage.jixu_sha.length; i++) { - if ( - !trigger.targets.includes(player.storage.jixu_sha[i]) && - player.canUse("sha", player.storage.jixu_sha[i], false) - ) { - player.line(player.storage.jixu_sha[i], trigger.card.nature); - trigger.targets.push(player.storage.jixu_sha[i]); - } - } - }, - }, - xinfu_sanwen: { - audio: 2, - usable: 1, - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - var cards = event.getg(player); - if (!cards || !cards.length) return false; - var namelist = []; - var namedlist = []; - for (var i = 0; i < cards.length; i++) { - namelist.add(get.name(cards[i])); - } - var hs = player.getCards("h"); - for (var j = 0; j < hs.length; j++) { - if (namelist.includes(get.name(hs[j])) && !cards.includes(hs[j])) return true; - } - return false; - }, - content: function () { - "step 0"; - var namelist = []; - var namedlist = []; - var nameddlist = []; - var namedddlist = []; - var cards = trigger.getg(player); - for (var i = 0; i < cards.length; i++) { - namelist.add(get.name(cards[i])); - } - var hs = player.getCards("h"); - for (var j = 0; j < hs.length; j++) { - if (namelist.includes(get.name(hs[j])) && !cards.includes(hs[j])) { - namedlist.push(hs[j]); - namedddlist.add(get.name(hs[j])); - } - } - for (var k = 0; k < cards.length; k++) { - if (namedddlist.includes(get.name(cards[k]))) nameddlist.push(cards[k]); - } - var showlist = namedlist.concat(nameddlist); - player.showCards(showlist); - player.discard(nameddlist); - player.draw(2 * nameddlist.length); - }, - }, - xinfu_qiai: { - skillAnimation: true, - animationColor: "gray", - trigger: { player: "dying" }, - limited: true, - audio: 2, - content: function () { - "step 0"; - player.awakenSkill("xinfu_qiai"); - event.targets = game - .filterPlayer(function (current) { - return current != player; - }) - .sortBySeat(); - if (!event.targets.length) event.finish(); - "step 1"; - event.current = event.targets.shift(); - if (!event.current.countCards("he")) event.goto(3); - else - event.current - .chooseCard("交给" + get.translation(player) + "一张牌", "he", true) - .set("ai", function (card) { - var evt = _status.event.getParent(); - if (get.attitude(_status.event.player, evt.player) > 2) { - if (card.name == "jiu") return 120; - if (card.name == "tao") return 110; - } - return 100 - get.value(card); - }); - "step 2"; - if (result.bool && result.cards && result.cards.length) { - event.current.give(result.cards, player); - } - "step 3"; - if (event.targets.length > 0) event.goto(1); - }, - }, - xinfu_denglou: { - audio: 2, - trigger: { - player: "phaseJieshuBegin", - }, - limited: true, - filter: function (event, player) { - return player.countCards("h") == 0; - }, - skillAnimation: true, - animationColor: "gray", - content: function () { - "step 0"; - player.awakenSkill("xinfu_denglou"); - event.cards = get.cards(4); - event.gains = []; - event.discards = []; - var content = ["牌堆顶的四张牌", event.cards]; - game.log(player, "观看了", "#y牌堆顶的四张牌"); - player.chooseControl("ok").set("dialog", content); - "step 1"; - if (get.type(event.cards[0]) != "basic") { - event.gains.push(event.cards[0]); - event.cards.remove(event.cards[0]); - } else { - var bool = game.hasPlayer(function (current) { - return player.canUse(event.cards[0], current); - }); - if (bool) { - player.chooseUseTarget(event.cards[0], true, false); - } else event.discards.push(event.cards[0]); - event.cards.remove(event.cards[0]); - } - "step 2"; - if (event.cards.length) event.goto(1); - else { - if (event.gains.length) player.gain(event.gains, "gain2"); - if (event.discards.length) { - player.$throw(event.discards); - game.cardsDiscard(event.discards); - } - } - }, - }, - qinguo_use: { audio: 2 }, - xinfu_qinguo: { - group: "xinfu_qinguo_recover", - audio: "qinguo_use", - subfrequent: ["recover"], - trigger: { - player: "useCardEnd", - }, - filter: function (event, player) { - return get.type(event.card) == "equip"; - }, - direct: true, - content: function () { - player.chooseUseTarget( - { name: "sha" }, - get.prompt("xinfu_qinguo"), - "视为使用一张【杀】", - false - ).logSkill = "xinfu_qinguo"; - }, - subSkill: { - recover: { - audio: "qinguo_use", - trigger: { - player: "loseAfter", - global: [ - "equipAfter", - "addJudgeAfter", - "gainAfter", - "loseAsyncAfter", - "addToExpansionAfter", - ], - }, - prompt: "是否发动【勤国】回复1点体力?", - filter: function (event, player) { - if (player.isHealthy() || player.countCards("e") != player.hp) return false; - var evt = event.getl(player); - if (event.name == "equip" && event.player == player) - return !evt || evt.cards.length != 1; - return evt && evt.es.length; - }, - frequent: true, - content: function () { - player.recover(); - }, - }, - }, - ai: { - effect: { - target: function (card, player, target, current) { - if ( - get.type(card) == "equip" && - !get.cardtag(card, "gifts") && - game.hasPlayer(function (current) { - return target.canUse("sha", current); - }) - ) - return [1, 1.5]; - }, - }, - noe: true, - reverseEquip: true, - skillTagFilter: function (player, tag, arg) { - if (tag == "noe") return player.countCards("e") == player.hp + 1; - return game.hasPlayer(function (current) { - return player.canUse("sha", current); - }); - }, - }, - }, - xinfu_jijun: { - ai: { - reverseEquip: true, - effect: { - target: function (card, player, target, current) { - if ( - get.type(card) == "equip" && - player == target && - player == _status.currentPhase && - get.subtype(card) == "equip1" - ) - return [1, 3]; - }, - }, - combo: "xinfu_fangtong", - }, - audio: 2, - trigger: { - player: "useCardToPlayered", - }, - frequent: true, - filter: function (event, player) { - if (player != _status.currentPhase) return false; - if (event.getParent().triggeredTargets3.length > 1) return false; - if (get.type(event.card) == "equip" && get.subtype(event.card) != "equip1") return false; - if (event.targets.includes(player)) return true; - return false; - }, - callback: function () { - player.addToExpansion(card, "gain2").gaintag.add("xinfu_jijun"); - }, - content: function () { - player.judge(function (card) { - return 1; - }).callback = lib.skill.xinfu_jijun.callback; - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - intro: { - content: "expansion", - markcount: "expansion", - mark: function (dialog, content, player) { - var content = player.getExpansions("xinfu_jijun"); - if (content && content.length) { - dialog.addAuto(content); - if (player == game.me || player.isUnderControl()) { - var list = lib.skill.xinfu_fangtong.getAuto(player); - if (list.length > 0) { - dialog.addText( - "
  • 推荐方案:" + - get.translation(list[0]) + - "+ " + - get.translation(list.slice(1)) - ); - } - } - } - }, - }, - marktext: "方", - }, - xinfu_fangtong: { - getAuto: function (player) { - var hs = player.getCards("he"); - var ss = player.getExpansions("xinfu_jijun"); - var bool = false, - max = Math.pow(2, ss.length), - index, - i; - for (i = 0; i < hs.length; i++) { - for (var j = 1; j < max; j++) { - var num = get.number(hs[i]); - index = j.toString(2); - while (index.length < ss.length) { - index = "0" + index; - } - for (var k = 0; k < ss.length; k++) { - if (index[k] == "1") num += get.number(ss[k]); - } - if (num == 36) { - bool = true; - break; - } - } - if (bool) break; - } - if (!bool) return []; - var list = [hs[i]]; - for (var k = 0; k < ss.length; k++) { - if (index[k] == "1") list.push(ss[k]); - } - return list; - }, - audio: 2, - trigger: { - player: "phaseJieshuBegin", - }, - filter: function (event, player) { - return player.countCards("he") > 0 && player.getExpansions("xinfu_jijun").length > 0; - }, - direct: true, - skillAnimation: true, - animationColor: "metal", - content: function () { - "step 0"; - var info = ["是否发动【方统】?"]; - info.push('
    ' + get.translation(player) + "的“方”
    "); - info.push(player.getExpansions("xinfu_jijun")); - if (player.countCards("h")) { - info.push('
    ' + get.translation(player) + "的手牌区
    "); - info.push(player.getCards("h")); - } - if (player.countCards("e")) { - info.push('
    ' + get.translation(player) + "的装备区
    "); - info.push(player.getCards("e")); - } - var next = player.chooseButton(); - next.set("createDialog", info); - next.set("selectButton", function () { - var num = 0; - for (var i = 0; i < ui.selected.buttons.length; i++) { - num += get.number(ui.selected.buttons[i]); - } - if (num == 36) return ui.selected.buttons.length; - return ui.selected.buttons.length + 2; - }); - next.set("filterButton", function (button) { - var player = _status.event.player, - cards = player.getExpansions("xinfu_jijun"); - if (ui.selected.buttons.length) { - if (!cards.includes(button.link)) return false; - } else if (cards.includes(button.link)) return false; - var num = 0; - for (var i = 0; i < ui.selected.buttons.length; i++) { - num += get.number(ui.selected.buttons[i]); - } - return get.number(button.link) + num <= 36; - }); - next.set("autolist", lib.skill.xinfu_fangtong.getAuto(player)); - next.set("processAI", function () { - if (_status.event.autolist && _status.event.autolist.length > 0) { - return { - bool: true, - links: _status.event.autolist, - }; - } - return { bool: false }; - }); - next.set("complexSelect", true); - "step 1"; - if (result.bool) { - player.logSkill("xinfu_fangtong"); - var tothrow = []; - var cards = result.links.slice(0); - for (var i = 0; i < cards.length; i++) { - if (get.position(cards[i]) == "x") { - tothrow.push(cards[i]); - } else { - player.discard(cards[i]).delay = false; - } - } - player.loseToDiscardpile(tothrow); - player - .chooseTarget( - "选择一个目标并对其造成3点雷电伤害", - true, - function (card, player, target) { - return target != player; - } - ) - .set("ai", function (target) { - return get.damageEffect( - target, - _status.event.player, - _status.event.player, - "thunder" - ); - }); - } else { - event.finish(); - } - "step 2"; - var target = result.targets[0]; - player.line(target, "thunder"); - target.damage(3, "thunder"); - }, - ai: { - combo: "xinfu_jijun", - }, - }, - xinfu_weilu: { - audio: 2, - trigger: { - player: "damageEnd", - }, - filter: function (event, player) { - return ( - event.source && - event.source.isIn() && - !player.getStorage("xinfu_weilu_effect").includes(event.source) - ); - }, - check: function (event, player) { - return get.effect(event.source, { name: "losehp" }, player, player) >= 0; - }, - forced: true, - logTarget: "source", - content: function () { - player.addTempSkill("xinfu_weilu_effect", { player: "die" }); - player.markAuto("xinfu_weilu_effect", [trigger.source]); - game.delayx(); - }, - ai: { - maixie_defend: true, - threaten: 0.85, - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return; - return 0.9; - }, - }, - }, - subSkill: { - effect: { - audio: "xinfu_weilu", - trigger: { player: "phaseUseBegin" }, - charlotte: true, - forced: true, - logTarget: function (event, player) { - return player.getStorage("xinfu_weilu_effect").filter(function (current) { - return current.isIn() && current.hp > 1; - }); - }, - content: function () { - "step 0"; - var targets = player.getStorage("xinfu_weilu_effect"); - player.removeSkill("xinfu_weilu_effect"); - event.targets = targets.sortBySeat(); - "step 1"; - var target = targets.shift(); - if (target.isIn() && target.hp > 1) { - event._delay = true; - var num = target.hp - 1; - player.markAuto("xinfu_weilu_recover", [[target, num]]); - target.loseHp(num); - } - if (targets.length > 0) event.redo(); - else if (!event._delay) event.finish(); - "step 2"; - player.addTempSkill("xinfu_weilu_recover", { - player: ["phaseUseAfter", "phaseAfter"], - }); - game.delayx(); - }, - onremove: true, - intro: { content: "已将$列入“威虏”战略打击目标" }, - }, - recover: { - audio: "xinfu_weilu", - charlotte: true, - trigger: { player: "phaseUseEnd" }, - forced: true, - filter: function (event, player) { - var targets = player.getStorage("xinfu_weilu_recover"); - for (var i of targets) { - if (i[0].isIn() && i[0].isDamaged()) return true; - } - return false; - }, - onremove: true, - logTarget: function (event, player) { - var logs = [], - targets = player.getStorage("xinfu_weilu_recover"); - for (var i of targets) { - if (i[0].isIn() && i[0].isDamaged()) logs.add(i[0]); - } - return logs; - }, - content: function () { - "step 0"; - event.list = player.getStorage("xinfu_weilu_recover").slice(0); - event.list.sort(function (a, b) { - return lib.sort.seat(a[0], b[0]); - }); - "step 1"; - var group = event.list.shift(); - if (group[0].isIn() && group[0].isDamaged()) { - group[0].recover(group[1]); - event._delay = true; - } - if (event.list.length > 0) event.redo(); - else if (!event._delay) event.finish(); - "step 2"; - game.delayx(); - }, - }, - }, - }, - xinfu_zengdao: { - audio: 2, - limited: true, - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("e") > 0; - }, - filterTarget: lib.filter.notMe, - skillAnimation: true, - animationColor: "thunder", - position: "e", - filterCard: true, - selectCard: [1, Infinity], - discard: false, - lose: false, - content: function () { - player.awakenSkill("xinfu_zengdao"); - target.addToExpansion(cards, player, "give").gaintag.add("xinfu_zengdao2"); - target.addSkill("xinfu_zengdao2"); - }, - ai: { - order: function () { - var player = _status.event.player, - num = 0; - if (player.hasCard((card) => get.value(card, player) < 0, "e")) return 9; - for (var i = 1; i < 6; i++) { - num += player.countEquipableSlot(i); - } - if (num <= 2) return 9; - var targets = player.getStorage("xinfu_weilu_recover"), - num = 0; - if ( - player.hp <= 2 || - !game.hasPlayer((current) => { - if (player == current || get.attitude(player, current) < 0 || current.hp <= 1) - return false; - for (var arr of targets) { - if (current == arr[0]) break; - } - return current.hp > 2 || current.countCards("hs") > 2; - }) - ) - return 1; - return 0; - }, - result: { - target: function (player, target) { - if (target.hasValueTarget({ name: "sha", isCard: true })) - return ui.selected.cards.length; - return 0; - }, - }, - }, - }, - xinfu_zengdao2: { - trigger: { source: "damageBegin1" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return player.getExpansions("xinfu_zengdao2").length > 0; - }, - content: function () { - "step 0"; - player.chooseCardButton( - "将一张“刀”置入弃牌堆", - player.getExpansions("xinfu_zengdao2"), - true - ); - "step 1"; - if (result.bool) { - trigger.num++; - player.loseToDiscardpile(result.links); - } - }, - marktext: "刀", - intro: { - content: "expansion", - markcount: "expansion", - onunmark: function (storage, player) { - player.removeSkill("xinfu_zengdao2"); - }, - }, - }, - xinfu_guanwei: { - audio: 2, - usable: 1, - init: () => { - game.addGlobalSkill("xinfu_guanwei_ai"); - }, - onremove: () => { - if (!game.hasPlayer((i) => i.hasSkill("xinfu_guanwei"), true)) - game.removeGlobalSkill("xinfu_guanwei_ai"); - }, - trigger: { - global: "phaseUseEnd", - }, - filter: function (event, player) { - var history = event.player.getHistory("useCard"); - var num = 0; - var suit = false; - for (var i = 0; i < history.length; i++) { - var suit2 = get.suit(history[i].card); - if (!lib.suit.includes(suit2)) return false; - if (suit && suit != suit2) return false; - suit = suit2; - num++; - } - return num > 1; - }, - direct: true, - content: function () { - "step 0"; - var target = trigger.player; - player - .chooseToDiscard( - "he", - get.prompt("xinfu_guanwei", trigger.player), - "弃置一张牌,令其摸两张牌并进行一个额外的出牌阶段。" - ) - .set("ai", function (card) { - if (get.attitude(_status.event.player, _status.event.targetx) < 1) return 0; - return 9 - get.value(card); - }) - .set("logSkill", ["xinfu_guanwei", target]) - .set("targetx", target); - "step 1"; - if (result.bool) { - player.line(trigger.player, "green"); - trigger.player.draw(2); - } else { - player.storage.counttrigger.xinfu_guanwei--; - event.finish(); - } - "step 2"; - var next = trigger.player.phaseUse(); - event.next.remove(next); - trigger.getParent("phase").next.push(next); - }, - ai: { - expose: 0.5, - }, - subSkill: { - ai: { - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer((i) => i.hasSkill("xinfu_guanwei"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("xinfu_guanwei_ai"); - }, - ai: { - effect: { - player_use: function (card, player, target) { - if (typeof card != "object" || !player.isPhaseUsing()) return; - var hasPanjun = game.hasPlayer(function (current) { - return ( - current.hasSkill("xinfu_guanwei") && - (!current.storage.counttrigger || - !current.storage.counttrigger.xinfu_guanwei) && - get.attitude(current, player) >= 1 && - current.hasCard(function (card) { - return ( - get.value(card) < 7 || - (current != game.me && - !current.isUnderControl() && - !current.isOnline() && - get.value(card) < 9) - ); - }, "he") - ); - }); - if (!hasPanjun) return; - var suitx = get.suit(card); - var history = player.getHistory("useCard"); - if (!history.length) { - var val = 0; - if ( - player.hasCard(function (cardx) { - return ( - get.suit(cardx) == suitx && - card != cardx && - (!card.cards || !card.cards.includes(cardx)) && - player.hasValueTarget(cardx) - ); - }, "hs") - ) - val = [2, 0.1]; - if (val) return val; - return; - } - var num = 0; - var suit = false; - for (var i = 0; i < history.length; i++) { - var suit2 = get.suit(history[i].card); - if (!lib.suit.includes(suit2)) return; - if (suit && suit != suit2) return; - suit = suit2; - num++; - } - if (suitx == suit && num == 1) return [1, 0.1]; - if ( - suitx != suit && - (num > 1 || - (num <= 1 && - player.hasCard(function (cardx) { - return ( - get.suit(cardx) == suit && - player.hasValueTarget(cardx) - ); - }, "hs"))) - ) - return "zeroplayertarget"; - }, - }, - }, - }, - }, - }, - xinfu_gongqing_gz_panjun: { audio: 2 }, - xinfu_gongqing: { - audio: 2, - audioname2: { gz_panjun: "xinfu_gongqing_gz_panjun" }, - trigger: { - player: ["damageBegin3", "damageBegin4"], - }, - forced: true, - filter: function (event, player, name) { - if (!event.source) return false; - var range = event.source.getAttackRange(); - if (name == "damageBegin3") return range > 3; - return event.num > 1 && range < 3; - }, - preHidden: true, - content: function () { - trigger.num = event.triggername == "damageBegin4" ? 1 : trigger.num + 1; - }, - ai: { - filterDamage: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.player) { - if (arg.player.hasSkillTag("jueqing", false, player)) return false; - if (arg.player.getAttackRange() < 3) return true; - } - return false; - }, - }, - }, - xinfu_andong: { - subSkill: { - add: { - sub: true, - mod: { - ignoredHandcard: function (card, player) { - if (get.suit(card) == "heart") { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && get.suit(card) == "heart") return false; - }, - }, - }, - }, - audio: 2, - trigger: { - player: "damageBegin4", - }, - filter: function (event, player) { - return get.itemtype(event.source) == "player"; - }, - logTarget: "source", - content: function () { - "step 0"; - if (!trigger.source.countCards("h")) event._result = { index: 1 }; - else - trigger.source - .chooseControlList( - [ - "令" + get.translation(player) + "观看你的手牌,并获得其中所有的红桃牌。", - "防止即将对" + - get.translation(player) + - "造成的伤害,并使自己本回合内的红桃手牌不计入手牌上限。", - ], - true - ) - .set("ai", function (event, player) { - var target = _status.event.getParent().player; - var player = _status.event.player; - if (get.attitude(player, target) > 0) return 1; - return 0; - }); - "step 1"; - if (result.index == 1) { - trigger.cancel(); - trigger.source.addTempSkill("xinfu_andong_add"); - event.finish(); - } else { - player.viewHandcards(trigger.source); - } - "step 2"; - var cards = trigger.source.getCards("h"); - var togain = []; - for (var i = 0; i < cards.length; i++) { - if (get.suit(cards[i]) == "heart") togain.push(cards[i]); - } - if (togain.length) player.gain(togain, trigger.source, "giveAuto", "bySelf"); - }, - }, - xinfu_yingshi: { - audio: 2, - group: ["yingshi_die"], - trigger: { - player: "phaseUseBegin", - }, - direct: true, - filter: function (event, player) { - return ( - player.countCards("he", { suit: "heart" }) > 0 && - !game.hasPlayer(function (current) { - return current.hasSkill("yingshi_heart"); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("xinfu_yingshi"), function (card, player, target) { - return target != player; - }) - .set("ai", function () { - return -1; - }); - "step 1"; - if (result.bool) { - var cards = player.getCards("he", { suit: "heart" }); - var target = result.targets[0]; - player.logSkill("xinfu_yingshi", target); - target.addSkill("yingshi_heart"); - target.addToExpansion(cards, player, "give").gaintag.add("xinfu_yingshi"); - } - }, - marktext: "酬", - intro: { - markcount: "expansion", - content: "expansion", - onunmark: function (storage, player) { - player.removeSkill("yingshi_heart"); - }, - }, - }, - yingshi_heart: { - charlotte: true, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return ( - event.source && - event.source.isIn() && - event.card && - event.card.name == "sha" && - player.getExpansions("xinfu_yingshi").length > 0 - ); - }, - forced: true, - logTarget: "source", - content: function () { - "step 0"; - trigger.source.chooseCardButton( - "应势:选择获得一张“酬”", - player.getExpansions("xinfu_yingshi"), - true - ); - "step 1"; - if (result.bool) { - trigger.source.gain(result.links, player, "give"); - } - }, - }, - yingshi_die: { - audio: "xinfu_yingshi", - forced: true, - trigger: { global: "die" }, - logTarget: "player", - filter: function (event, player) { - return event.player.getExpansions("xinfu_yingshi").length > 0; - }, - content: function () { - var target = trigger.player; - player.gain(target.getExpansions("xinfu_yingshi"), target, "give", "bySelf"); - }, - }, - xinfu_duanfa: { - init: function (player) { - player.storage.xinfu_duanfa = 0; - }, - audio: 2, - enable: "phaseUse", - position: "he", - filter: function (card, player) { - return player.storage.xinfu_duanfa < player.maxHp; - }, - filterCard: function (card) { - return get.color(card) == "black"; - }, - selectCard: function () { - var player = _status.event.player; - return [1, player.maxHp - player.storage.xinfu_duanfa]; - }, - check: function (card) { - return 6 - get.value(card); - }, - delay: false, - content: function () { - player.draw(cards.length); - player.storage.xinfu_duanfa += cards.length; - }, - group: "xinfu_duanfa_clear", - subSkill: { - clear: { - trigger: { - player: "phaseBefore", - }, - forced: true, - silent: true, - popup: false, - content: function () { - player.storage.xinfu_duanfa = 0; - }, - sub: true, - }, - }, - ai: { - order: 1, - result: { - player: 1, - }, - }, - }, - xinfu_youdi: { - audio: 2, - trigger: { - player: "phaseJieshuBegin", - }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("xinfu_youdi"), function (card, player, target) { - return player != target; - }) - .set("ai", function (target) { - var player = _status.event.player; - if ( - player.countCards("h", "sha") > player.countCards("h") / 3 && - player.countCards("h", { color: "red" }) > player.countCards("h") / 2 - ) - return 0; - if (target.countCards("he") == 0) return 0.1; - return -get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - game.delay(); - player.logSkill("xinfu_youdi", result.targets); - event.target = result.targets[0]; - event.target.discardPlayerCard(player, "h", true); - } else { - event.finish(); - } - "step 2"; - if (get.color(result.links[0]) != "black") player.draw("nodelay"); - if (result.links[0].name != "sha" && event.target.countCards("he")) { - player.gainPlayerCard("he", event.target, true); - } - }, - ai: { - expose: 0.3, - threaten: 1.4, - }, - }, - xinfu_guanchao: { - subSkill: { - dizeng: { - mark: true, - marktext: "增", - intro: { - content: "单调递增", - }, - trigger: { - player: "useCard", - }, - audio: "xinfu_guanchao", - forced: true, - mod: { - aiOrder: function (player, card, num) { - if (typeof card.number != "number") return; - var history = player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing(); - }); - if (history.length == 0) return num + 10 * (14 - card.number); - var num = get.number(history[0].card); - if (!num) return; - for (var i = 1; i < history.length; i++) { - var num2 = get.number(history[i].card); - if (!num2 || num2 <= num) return; - num = num2; - } - if (card.number > num) return num + 10 * (14 - card.number); - }, - }, - filter: function (event, player) { - var history = player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing(); - }); - if (history.length < 2) return false; - var num = get.number(history[0].card); - if (!num) return false; - for (var i = 1; i < history.length; i++) { - var num2 = get.number(history[i].card); - if (!num2 || num2 <= num) return false; - num = num2; - } - return true; - }, - content: function () { - player.draw(); - }, - sub: true, - }, - dijian: { - mark: true, - marktext: "减", - intro: { - content: "单调递减", - }, - init: function (player) { - player.storage.guanchao = 0; - }, - onremove: function (player) { - delete player.storage.guanchao; - }, - trigger: { - player: "useCard", - }, - audio: "xinfu_guanchao", - forced: true, - mod: { - aiOrder: function (player, card, num) { - if (typeof card.number != "number") return; - var history = player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing(); - }); - if (history.length == 0) return num + 10 * card.number; - var num = get.number(history[0].card); - if (!num) return; - for (var i = 1; i < history.length; i++) { - var num2 = get.number(history[i].card); - if (!num2 || num2 >= num) return; - num = num2; - } - if (card.number < num) return num + 10 * card.number; - }, - }, - filter: function (event, player) { - var history = player.getHistory("useCard", function (evt) { - return evt.isPhaseUsing(); - }); - if (history.length < 2) return false; - var num = get.number(history[0].card); - if (!num) return false; - for (var i = 1; i < history.length; i++) { - var num2 = get.number(history[i].card); - if (!num2 || num2 >= num) return false; - num = num2; - } - return true; - }, - content: function () { - player.draw(); - }, - sub: true, - }, - }, - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - direct: true, - content: function () { - "step 0"; - var list = ["递增", "递减", "取消"]; - player - .chooseControl(list) - .set("prompt", get.prompt2("xinfu_guanchao")) - .set("ai", function () { - return [0, 1].randomGet(); - }); - "step 1"; - switch (result.control) { - case "递增": { - player.logSkill("xinfu_guanchao"); - player.addTempSkill("xinfu_guanchao_dizeng", "phaseUseEnd"); - break; - } - case "递减": { - player.logSkill("xinfu_guanchao"); - player.addTempSkill("xinfu_guanchao_dijian", "phaseUseEnd"); - break; - } - case "取消": { - break; - } - } - }, - }, - xinfu_xunxian: { - usable: 1, - audio: 2, - trigger: { - player: ["useCardAfter", "respond"], - }, - filter: function (event, player) { - if ( - get.itemtype(event.cards) !== "cards" || - !game.hasPlayer((current) => { - if (current === player) return false; - return ( - current.getHp() > player.getHp() || - current.countCards("h") > player.countCards("h") - ); - }) - ) - return false; - for (var i = 0; i < event.cards.length; i++) { - if (event.cards[i].isInPile()) { - return true; - } - } - return false; - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("xinfu_xunxian"), (card, player, target) => { - if (target === player) return false; - return ( - target.getHp() > player.getHp() || - target.countCards("h") > player.countCards("h") - ); - }) - .set("ai", (target) => { - let att = get.attitude(_status.event.player, target), - name = _status.event.cards[0].name; - if (att < 3) return 0; - if (target.hasJudge("lebu")) att /= 5; - if (name === "sha" && target.hasSha()) att /= 5; - if (name === "wuxie" && target.needsToDiscard(_status.event.cards)) att /= 5; - return att / (1 + get.distance(player, target, "absolute")); - }) - .set("cards", trigger.cards) - .forResult(); - }, - async content(event, trigger, player) { - let list = []; - for (let i = 0; i < trigger.cards.length; i++) { - if (trigger.cards[i].isInPile()) { - list.push(trigger.cards[i]); - } - } - if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); - event.targets[0].gain(list, "gain2").giver = player; - }, - }, - xinfu_kannan: { - audio: 2, - subSkill: { - phase: { - sub: true, - }, - }, - enable: "phaseUse", - filter: function (event, player) { - if (player.hasSkill("xinfu_kannan_phase")) return false; - if (player.getStat().skill.xinfu_kannan >= player.hp) return false; - return player.countCards("h") > 0; - }, - filterTarget: function (card, player, target) { - if (target.hasSkill("xinfu_kannan_phase")) return false; - return player.canCompare(target); - }, - ai: { - order: function () { - return get.order({ name: "sha" }) + 0.4; - }, - result: { - target: function (player, target) { - if ( - player.hasCard(function (card) { - if (get.position(card) != "h") return false; - var val = get.value(card); - if (val < 0) return true; - if (val <= 5) { - return card.number >= 12; - } - if (val <= 6) { - return card.number >= 13; - } - return false; - }) - ) - return -1; - return 0; - }, - }, - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - player.addTempSkill("xinfu_kannan_phase"); - if (!player.hasSkill("kannan_eff")) { - player.addSkill("kannan_eff"); - } else { - if (!player.storage.kannan_eff) player.storage.kannan_eff = 0; - } - player.storage.kannan_eff++; - player.markSkill("kannan_eff"); - } else { - target.addTempSkill("xinfu_kannan_phase"); - if (!target.hasSkill("kannan_eff")) { - target.addSkill("kannan_eff"); - } else { - if (!target.storage.kannan_eff) player.storage.kannan_eff = 0; - //target.storage.kannan_eff++; - //target.markSkill('kannan_eff'); - } - target.storage.kannan_eff++; - target.markSkill("kannan_eff"); - } - }, - }, - kannan_eff: { - mark: true, - intro: { - content: "下一张杀的伤害基数+#", - }, - trigger: { - player: "useCard", - }, - filter: function (event) { - return event.card && event.card.name == "sha"; - }, - forced: true, - content: function () { - if (!trigger.baseDamage) trigger.baseDamage = 1; - trigger.baseDamage += player.storage.kannan_eff; - player.removeSkill("kannan_eff"); - }, - init: function (player) { - player.storage.kannan_eff = 0; - }, - onremove: function (player) { - delete player.storage.kannan_eff; - }, - ai: { - damageBonus: true, - }, - }, - xinfu_tushe: { - audio: 2, - mod: { - aiOrder(player, card, num) { - if (get.tag(card, "multitarget")) { - if (player.countCards("h", { type: "basic" })) return num / 10; - return num * 10; - } - if (get.type(card) === "basic") return num + 10; - }, - aiValue(player, card, num) { - if (card.name === "zhangba") { - let fact = (n) => { - if (n > 1) return n * fact(n - 1); - return 1; - }, - basic = 0; - return fact( - Math.min( - player.countCards("hs", (i) => { - if (get.tag(i, "multitarget")) return 2; - if (!["shan", "tao", "jiu"].includes(card.name)) return 1; - basic++; - }) / - (1 + basic), - player.getCardUsable("sha") - ) - ); - } - if (["shan", "tao", "jiu"].includes(card.name)) { - if (player.getEquip("zhangba") && player.countCards("hs") > 1) return 0.01; - return num / 2; - } - if (get.tag(card, "multitarget")) return num + game.players.length; - }, - aiUseful(player, card, num) { - if (get.name(card, player) === "shan") { - if ( - player.countCards("hs", (i) => { - if (card === i || (card.cards && card.cards.includes(i))) return false; - return get.name(i, player) === "shan"; - }) - ) - return -1; - return num / Math.pow(Math.max(1, player.hp), 2); - } - }, - }, - trigger: { - player: "useCardToPlayered", - }, - locked: false, - frequent: true, - filter: function (event, player) { - if (get.type(event.card) == "equip") return false; - if (event.getParent().triggeredTargets3.length > 1) return false; - return event.targets.length > 0 && !player.countCards("h", { type: "basic" }); - }, - content: function () { - player.draw(trigger.targets.length); - }, - ai: { - presha: true, - pretao: true, - threaten: 1.8, - effect: { - player(card, player, target) { - if ( - typeof card === "object" && - card.name !== "shan" && - get.type(card) !== "equip" && - !player.countCards("h", (i) => { - if (card === i || (card.cards && card.cards.includes(i))) return false; - return get.type(i) === "basic"; - }) - ) { - let targets = [], - evt = _status.event.getParent("useCard"); - targets.addArray(ui.selected.targets); - if (evt && evt.card == card) targets.addArray(evt.targets); - if (targets.length) return [1, targets.length]; - if (get.tag(card, "multitarget")) return [1, game.players.length - 1]; - return [1, 1]; - } - }, - }, - }, - }, - xinfu_limu: { - mod: { - targetInRange: function (card, player, target) { - if (player.countCards("j") && player.inRange(target)) { - return true; - } - }, - cardUsableTarget: function (card, player, target) { - if (player.countCards("j") && player.inRange(target)) return true; - }, - aiOrder(player, card, num) { - if ( - get.type(card, "delay") && - player.canUse(card, player) && - player.canAddJudge(card) - ) - return 15; - }, - }, - locked: false, - audio: 2, - enable: "phaseUse", - discard: false, - filter: function (event, player) { - if (player.hasJudge("lebu")) return false; - return player.countCards("hes", { suit: "diamond" }) > 0; - }, - viewAs: { name: "lebu" }, - //prepare:"throw", - position: "hes", - filterCard: function (card, player, event) { - return get.suit(card) == "diamond" && player.canAddJudge({ name: "lebu", cards: [card] }); - }, - selectTarget: -1, - filterTarget: function (card, player, target) { - return player == target; - }, - check(card) { - var player = _status.event.player; - if (!player.getEquip("zhangba")) { - let damaged = player.maxHp - player.hp - 1; - if ( - player.countCards("h", function (cardx) { - if (cardx == card) return false; - if (cardx.name == "tao") { - if (damaged < 1) return true; - damaged--; - } - return ["shan", "jiu"].includes(cardx.name); - }) > 0 - ) - return 0; - } - if (card.name == "shan") return 15; - if (card.name == "tao" || card.name == "jiu") return 10; - return 9 - get.value(card); - }, - onuse: function (links, player) { - var next = game.createEvent("limu_recover", false, _status.event.getParent()); - next.player = player; - next.setContent(function () { - player.recover(); - }); - }, - ai: { - result: { - target(player, target) { - let res = lib.card.lebu.ai.result.target(player, target); - if (target.isDamaged()) - return res + 2 * Math.abs(get.recoverEffect(target, player, target)); - return res; - }, - ignoreStatus: true, - }, - order(item, player) { - if (player.hp > 1 && player.countCards("j")) return 0; - return 12; - }, - effect: { - target(card, player, target) { - if ( - target.isPhaseUsing() && - typeof card === "object" && - get.type(card, target) === "delay" && - !target.countCards("j") - ) { - let shas = - target.getCards("hs", (i) => { - if (card === i || (card.cards && card.cards.includes(i))) - return false; - return get.name(i, target) === "sha" && target.getUseValue(i) > 0; - }) - target.getCardUsable("sha"); - if (shas > 0) return [1, 1.5 * shas]; - } - }, - }, - }, - }, - }, - characterReplace: { - duji: ["duji", "re_duji", "ns_duji"], - sp_taishici: ["sp_taishici", "re_sp_taishici"], - mazhong: ["mazhong", "re_mazhong"], - wenpin: ["wenpin", "re_wenpin"], - liuyan: ["liuyan", "jsrg_liuyan", "ol_liuyan"], - }, - translate: { - xinghuoliaoyuan: "星火燎原", - sp_taishici: "SP太史慈", - sp_taishici_prefix: "SP", - wangcan: "王粲", - re_jsp_pangtong: "SP庞统", - re_jsp_pangtong_prefix: "SP", - lvdai: "吕岱", - re_zhangliang: "张梁", - lvqian: "吕虔", - panjun: "潘濬", - duji: "杜畿", - zhoufang: "周鲂", - yanjun: "严畯", - liuyao: "刘繇", - liuyan: "刘焉", - xinfu_guolun: "过论", - xinfu_guolun_info: - "出牌阶段限一次,你可以展示一名其他角色的手牌,然后展示你的一张牌。你与其交换这两张牌,然后展示的牌点数较小的角色摸一张牌。", - xinfu_zhanji: "展骥", - xinfu_zhanji_info: - "锁定技。你的出牌阶段内,当你因摸牌且不是因为此技能效果而得到牌后,你摸一张牌。", - xinfu_songsang: "送丧", - xinfu_songsang_info: - "限定技,其他角色死亡时,你可以回复1点体力(若你未受伤,则改为加1点体力上限);然后获得技能〖展骥〗。", - xinfu_jixu: "击虚", - xinfu_jixu_info: - "出牌阶段限一次,若你有手牌,你可以令任意名体力值相等的其他角色猜测你的手牌中是否有【杀】。然后,你摸X张牌(X为猜错的角色数)。若你有【杀】,则你本回合内使用【杀】时,所有这些角色均成为【杀】的目标;若你没有【杀】,则你弃置所有这些角色的各一张牌。若X为零,你结束出牌阶段。", - jixu_sha: "击虚", - jixu_sha_info: "", - xinfu_sanwen: "散文", - xinfu_sanwen_info: - "每回合限一次。当你得到牌后,若你的原手牌中有与这些牌名称相同的牌,则你可以展示这些牌,弃置新得到的同名牌并摸两倍的牌。", - xinfu_qiai: "七哀", - xinfu_qiai_info: "限定技,当你进入濒死状态时,你可以令所有其他角色依次交给你一张牌。", - xinfu_denglou: "登楼", - xinfu_denglou_info: - "限定技,结束阶段,若你没有手牌,则你可以观看牌堆顶的四张牌,依次使用其中的所有基本牌(不能使用则弃置),然后获得其余的牌。", - qinguo_use: "勤国", - qinguo_use_info: "", - xinfu_qinguo: "勤国", - xinfu_qinguo_info: - "当你使用的装备牌结算完成时,你可以视为使用一张【杀】;当你因使用或失去装备牌导致装备区内牌的数量发生变化后,若你装备区内牌的数量等于你的体力值,则你回复1点体力。", - qinguo_lose: "勤国", - qinguo_lose_info: "", - xinfu_jijun: "集军", - xinfu_jijun_info: - "当你于回合内使用非装备牌或武器牌指定目标后,若你是此牌的目标,你可以进行一次判定。然后,你将判定牌置于自己的武将牌上,称之为「方」。", - xinfu_fangtong: "方统", - xinfu_fangtong_info: - "结束阶段,你可以弃置总点数之和为36的一张牌与任意张「方」,并对一名其他角色造成3点雷电伤害。", - xinfu_weilu: "威虏", - xinfu_weilu_info: - "锁定技,当你受到伤害后,伤害来源获得一枚「虏」。你的下个出牌阶段开始时,所有有「虏」的角色将体力失去至1点。此阶段结束后,这些角色回复以此法失去的体力。", - weilu_effect: "威虏", - weilu_effect_info: "", - weilu_effect2: "威虏", - weilu_effect2_info: "", - xinfu_zengdao: "赠刀", - xinfu_zengdao_info: - "限定技,出牌阶段,你可以将装备区内的任意张牌置于一名其他角色的武将牌旁,称之为“刀”。该角色造成伤害时,其须移去一张“刀”,然后此伤害+1。", - xinfu_zengdao2: "赠刀", - xinfu_zengdao2_info: "", - xinfu_guanwei: "观微", - xinfu_guanwei_info: - "每回合限一次。一名角色的出牌阶段结束时,若其本回合使用过两张以上的牌且这些牌均有花色且花色均相同,则你可以弃置一张牌,令其摸两张牌并进行一个额外的出牌阶段。", - xinfu_gongqing: "公清", - xinfu_gongqing_info: - "锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", - xinfu_andong: "安东", - xinfu_andong_info: - "当你受到伤害时,你可以令伤害来源选择一项:1.令你观看其的手牌并获得其中的所有红桃牌;2.防止此伤害,然后其本回合内的红桃手牌不计入手牌上限。", - xinfu_yingshi: "应势", - xinfu_yingshi_info: - "出牌阶段开始时,若场上的所有角色均没有「酬」,则你可以将所有的红桃牌置于一名其他角色的武将牌旁,称之为「酬」。有「酬」的角色受到【杀】的伤害后/死亡时,伤害来源/你获得其中的一张/所有的「酬」。", - yingshi_heart: "应势", - yingshi_heart_info: "", - yingshi_die: "应势", - yingshi_die_info: "", - xinfu_duanfa: "断发", - xinfu_duanfa_info: - "出牌阶段,你可以弃置任意张黑色牌,然后摸等量的牌。(每回合内限X张,X为你的体力上限)", - xinfu_youdi: "诱敌", - xinfu_youdi_info: - "结束阶段开始时,你可以令一名其他角色弃置你的一张手牌,若此牌:不为黑色,你摸一张牌。不为【杀】,你获得该角色的一张牌。", - xinfu_guanchao: "观潮", - xinfu_guanchao_info: - "出牌阶段开始时,你可以选择获得一项效果直到回合结束:1.当你使用牌时,若你此阶段使用过的所有牌的点数为递增,你摸一张牌;2.当你使用牌时,若你此阶段使用过的所有牌的点数为递减,你摸一张牌。", - xinfu_xunxian: "逊贤", - xinfu_xunxian_info: - "每回合限一次。当你使用或打出的牌结算完成后,你可以将其对应的所有实体牌交给一名手牌数或体力值大于你的角色。", - xinfu_kannan: "戡难", - xinfu_kannan_info: - "出牌阶段限X次,你可以与一名本回合内未成为过〖戡难〗目标的角色拼点。若你赢,你使用的下一张【杀】的伤害值基数+1,且你本回合内不能再发动〖戡难〗。若你没赢,其使用的下一张【杀】的伤害值基数+1。(X为你的体力值)。", - kannan_eff: "戡难", - kannan_eff_info: "", - xinfu_tushe: "图射", - xinfu_tushe_info: - "当你使用非装备牌指定目标后,若你没有基本牌,则你可以摸X张牌。(X为此牌指定的目标数)", - xinfu_limu: "立牧", - xinfu_limu_info: - "出牌阶段,你可以将一张♦牌当做【乐不思蜀】对自己使用,然后回复1点体力。只要你的判定区内有牌,你对攻击范围内的其他角色使用牌便没有次数和距离限制。", - xinyingshi: "应势", - xinyingshi_info: - "出牌阶段开始时,若场上所有角色的武将牌上均没有“酬”,则你可以将任意张牌置于一名角色的武将牌上,称为“酬”。若如此做:当有角色使用牌对有“酬”的角色造成伤害后,其可以获得一张“酬”,并获得牌堆中所有与“酬”花色点数均相同的牌;有“酬”的角色死亡时,你获得其所有“酬”。", - - xinghuoliaoyuan_tianfu: "天府", - xinghuoliaoyuan_tianliang: "天梁", - xinghuoliaoyuan_tianji: "天机", - xinghuoliaoyuan_tiantong: "天同", - xinghuoliaoyuan_tianxiang: "天相", - xinghuoliaoyuan_qisha: "七杀", - }, - }; -}); diff --git a/character/xinghuoliaoyuan/card.js b/character/xinghuoliaoyuan/card.js new file mode 100644 index 000000000..e6afc4e85 --- /dev/null +++ b/character/xinghuoliaoyuan/card.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = {}; +export default cards; diff --git a/character/xinghuoliaoyuan/character.js b/character/xinghuoliaoyuan/character.js new file mode 100644 index 000000000..75c41c6b1 --- /dev/null +++ b/character/xinghuoliaoyuan/character.js @@ -0,0 +1,16 @@ +const characters = { + wangcan: ["male", "qun", 3, ["xinfu_sanwen", "xinfu_qiai", "xinfu_denglou"]], + sp_taishici: ["male", "qun", 4, ["xinfu_jixu"]], + re_jsp_pangtong: ["male", "wu", 3, ["xinfu_guolun", "xinfu_songsang"]], + lvdai: ["male", "wu", 4, ["xinfu_qinguo"]], + re_zhangliang: ["male", "qun", 4, ["xinfu_jijun", "xinfu_fangtong"]], + lvqian: ["male", "wei", 4, ["xinfu_weilu", "xinfu_zengdao"]], + panjun: ["male", "wu", 3, ["xinfu_guanwei", "xinfu_gongqing"]], + duji: ["male", "wei", 3, ["xinfu_andong", "xinfu_yingshi"]], + zhoufang: ["male", "wu", 3, ["xinfu_duanfa", "xinfu_youdi"]], + yanjun: ["male", "wu", 3, ["xinfu_guanchao", "xinfu_xunxian"]], + liuyao: ["male", "qun", 4, ["xinfu_kannan", "twniju"], ["zhu"]], + liuyan: ["male", "qun", 3, ["xinfu_tushe", "xinfu_limu"]], +}; + +export default characters; diff --git a/character/xinghuoliaoyuan/characterFilter.js b/character/xinghuoliaoyuan/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/xinghuoliaoyuan/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/xinghuoliaoyuan/characterReplace.js b/character/xinghuoliaoyuan/characterReplace.js new file mode 100644 index 000000000..dd383b17a --- /dev/null +++ b/character/xinghuoliaoyuan/characterReplace.js @@ -0,0 +1,9 @@ +const characterReplaces = { + duji: ["duji", "re_duji", "ns_duji"], + sp_taishici: ["sp_taishici", "re_sp_taishici"], + mazhong: ["mazhong", "re_mazhong"], + wenpin: ["wenpin", "re_wenpin"], + liuyan: ["liuyan", "jsrg_liuyan", "ol_liuyan"], +}; + +export default characterReplaces; diff --git a/character/xinghuoliaoyuan/dynamicTranslate.js b/character/xinghuoliaoyuan/dynamicTranslate.js new file mode 100644 index 000000000..cdee02b0a --- /dev/null +++ b/character/xinghuoliaoyuan/dynamicTranslate.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = {}; +export default dynamicTranslates; diff --git a/character/xinghuoliaoyuan/index.js b/character/xinghuoliaoyuan/index.js new file mode 100644 index 000000000..2561dca6e --- /dev/null +++ b/character/xinghuoliaoyuan/index.js @@ -0,0 +1,34 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "xinghuoliaoyuan", + connect: true, + character: { ...characters }, + characterSort: { + xinghuoliaoyuan: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/xinghuoliaoyuan/intro.js b/character/xinghuoliaoyuan/intro.js new file mode 100644 index 000000000..787e2e728 --- /dev/null +++ b/character/xinghuoliaoyuan/intro.js @@ -0,0 +1,14 @@ +const characterIntro = { + wangcan: "王粲(177年-217年2月17日),字仲宣。山阳郡高平县(今山东微山两城镇)人。东汉末年文学家,“建安七子”之一,太尉王龚曾孙、司空王畅之孙。", + re_jsp_pangtong: "庞统,字士元,襄阳(治今湖北襄阳)人。三国时刘备帐下谋士,官拜军师中郎将。才智与诸葛亮齐名,人称“凤雏”。在进围雒县时,统率众攻城,不幸被流矢击中去世,时年三十六岁。追赐统为关内侯,谥曰靖侯。庞统死后,葬于落凤庞统墓坡。", + lvdai: "吕岱(161年-256年),字定公,广陵海陵(今江苏如皋)人。三国时期吴国重臣、将领。吕岱一生戮力奉公,为孙吴开疆拓土,功勋赫赫。太平元年(256年),吕岱去世,年九十六。", + lvqian: "吕虔(生卒年不详),字子恪。任城国(今山东济宁东南)人。汉末至三国曹魏时期将领。 吕虔有勇有谋,曹操在兖州时,任命他为从事,率领家丁驻守湖陆。后升任泰山太守,与夏侯渊共同镇压济南等地的黄巾军。被推举为秀才,加任骑都尉,仍管辖泰山郡。 曹丕继任魏王后,加吕虔为裨将军,封益寿亭侯。再升任徐州刺史,加任威虏将军。任用王祥为别驾,将民政事务都委托于他,为世人所称赞。曹叡继位后,改封万年亭侯。吕虔死后,其子吕翻世袭万年亭侯。", + panjun: "潘濬(一作潘浚)(?-239年),字承明。武陵郡汉寿县(今湖南汉寿)人。三国时期吴国重臣,蜀汉大司马蒋琬的表弟。 潘濬为人聪察,对问有机理,拜大儒宋忠为师,得到“建安七子”之一的王粲赏识。不到三十,即被荆州牧刘表任命为江夏从事,因按杀贪污的沙羡长而闻名。建安十六年(211年),被刘备任命为荆州治中从事,与守臣关羽不睦。建安二十四年(219年),孙权得荆州,拜潘濬为辅军中郎将。又迁奋威将军,封常迁亭侯。孙权称帝后,拜少府,进封刘阳侯,又改太常。黄龙三年(231年),授假节,与吕岱率军五万平五溪蛮夷叛乱,经三年而斩获数万,使得一方宁静。潘濬为人刚正不阿,在吕壹弄权时,屡请孙权将其诛杀。甚至想亲手击杀吕壹,使吕壹对他非常畏惧。 赤乌二年(239年),潘濬去世。", + duji: "杜畿(163年—224年),字伯侯,京兆杜陵(今陕西西安东南)人。东汉末及三国时曹魏官吏及将领。西汉御史大夫杜延年的后代。历官郡功曹、守郑县令,善于断案。荀彧将他举荐给曹操,曹操任命他为司空司直,调任护羌校尉,使持节领西平太守。 曹丕受禅登基后,封杜畿为丰乐亭侯。官至尚书仆射。后在陶河试航时遇上大风沉没,杜畿淹死,死时六十二岁,曹丕为之涕泣,追赠其为太仆,谥戴侯。", + zhoufang: "周鲂(生卒年不详),字子鱼。吴郡阳羡县(今江苏宜兴)人。三国时期吴国将领。周鲂年少时好学,被举为孝廉。历任宁国县长、怀安县长、钱塘侯相,一月之内,便斩杀作乱的彭式及其党羽,因而升任丹阳西部都尉。彭绮率数万人反叛时,周鲂被任命为鄱阳太守,与胡综共同将其生擒,因功加职昭义校尉。后诈降曹休,诱其率军接应,使曹休在石亭之战中一败涂地,战后因功被加职为裨将军,封关内侯。贼帅董嗣凭险骚扰豫章等郡,周鲂派间谍将其诱杀,不费兵卒即安定数郡。周鲂在鄱阳赏罚分明、恩威并施,于任职十三年后去世。", + yanjun: "严畯(生卒年不详),字曼才,彭城(治今江苏徐州)人,三国时期孙吴官员、学者。性情忠厚,待人以诚。少好学,精通《诗》、《书》、《三礼》,又好《说文》。避乱江东,与诸葛瑾、步骘是好朋友,被张昭推荐给孙权作骑都尉、从事中郎。建安二十二年(217年),横江将军鲁肃去世,孙权打算让严畯接替其位。严畯很有自知之明,知道自己没有能力对抗在荆州的关羽和北面的曹魏,便坚决不接受此任命。后来担任尚书令。严畯享年七十八岁。著有《孝经传》、《潮水论》。", + liuyao: "刘繇(一读yóu)(156年-197年),字正礼。东莱牟平(今山东牟平)人。东汉末年宗室、大臣,汉末群雄之一,齐悼惠王刘肥之后,太尉刘宠之侄。
    刘繇最初被推举为孝廉,授郎中。任下邑县长时,因拒郡守请托而弃官。后被征辟为司空掾属,除授侍御史,因战乱而不到任,避居淮浦。兴平元年(194年),被任命为扬州刺史。他先后与袁术、孙策交战,一度被朝廷加授为扬州牧、振武将军,但最终还是败归丹徒。此后,刘繇又击破反叛的笮融,旋即病逝,年四十二。", + liuyan: "刘焉(?-194年),字君郎(《华阳国志》又作君朗)。江夏郡竟陵县(今湖北省天门市)人。东汉末年宗室、军阀,汉末群雄之一,西汉鲁恭王刘余之后。
    刘焉初以汉朝宗室身份,拜为中郎,历任雒阳令、冀州刺史、南阳太守、宗正、太常等官。因益州刺史郄俭在益州大肆聚敛,贪婪成风,加上当时天下大乱。刘焉欲取得一安身立命之所,割据一方,于是向朝廷求为益州牧,封阳城侯,前往益州整饬吏治。郄俭为黄巾军所杀,刘焉进入益州,派张鲁盘踞汉中,张鲁截断交通,斩杀汉使,从此益州与中央道路不通。刘焉进一步对内打击地方豪强,巩固自身势力,益州因而处于半独立的状态。兴平元年(194年),刘焉因背疮迸发而逝世,其子刘璋继领益州牧。", +}; + +export default characterIntro; diff --git a/character/xinghuoliaoyuan/perfectPairs.js b/character/xinghuoliaoyuan/perfectPairs.js new file mode 100644 index 000000000..d66d955b0 --- /dev/null +++ b/character/xinghuoliaoyuan/perfectPairs.js @@ -0,0 +1,11 @@ +export default { + lijue: ["guosi", "jiaxu"], + zhangji: ["zhangxiu", "drlt_zhangxiu", "zoushi"], + xf_sufei: ["ganning"], + //baosanniang:['guansuo'], + simahui: ["pangdegong"], + zhangqiying: ["zhanglu"], + pangtong: ["zhugejin"], + taishici: ["liuyao", "kongrong"], + //zhaotongzhaoguang:['zhaoyun','mayunlu'], +}; diff --git a/character/xinghuoliaoyuan/pinyin.js b/character/xinghuoliaoyuan/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/xinghuoliaoyuan/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/xinghuoliaoyuan/skill.js b/character/xinghuoliaoyuan/skill.js new file mode 100644 index 000000000..80021689b --- /dev/null +++ b/character/xinghuoliaoyuan/skill.js @@ -0,0 +1,1682 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + xinyingshi: { + audio: "xinfu_yingshi", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + !game.hasPlayer(function (current) { + return current.getExpansions("xinyingshi_cards").length > 0; + }) + ); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: true, + filterTarget: lib.filter.notMe, + selectCard: [1, player.countCards("he")], + position: "he", + prompt: get.prompt("xinyingshi"), + prompt2: "将任意张牌置于一名其他角色的武将牌上作为“酬”", + ai1: function (card) { + return 1 - player.getUseValue(card); + }, + ai2: function (target) { + var player = _status.event.player; + return ( + (1 + + game.countPlayer(function (current) { + return get.attitude(player, current) > 0 && current.inRange(target) && get.damageEffect(target, current, player) > 0; + })) * + -get.attitude(player, target) + ); + }, + }); + "step 1"; + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + player.logSkill("xinyingshi", target); + target.addSkill("xinyingshi_cards"); + target.addToExpansion(player, "give", cards).gaintag.add("xinyingshi_cards"); + target.storage.xinyingshi_source = player; + } + }, + subSkill: { + cards: { + trigger: { player: "damageSource" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.source && event.source.isIn() && event.card && event.getParent().type == "card" && player.getExpansions("xinyingshi_cards").length; + }, + logTarget: "source", + content: function () { + "step 0"; + event.target = trigger.source; + event.target.chooseButton(["应势:请选择你的赏金", player.getExpansions("xinyingshi_cards")]); + "step 1"; + if (result.bool) { + var cards = [result.links[0]]; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (card.number == cards[0].number && card.suit == cards[0].suit) cards.push(card); + } + player.$give(cards[0], target); + if (cards.length > 1) { + setTimeout( + function () { + target.$gain2(cards.slice(1)); + }, + get.delayx(200, 200) + ); + game.log(target, "从牌堆获得了", cards.slice(1)); + } + game.delay(0, get.delayx(500, 500)); + target.gain(cards); + } + "step 2"; + if (!player.getExpansions("xinyingshi_cards").length) player.removeSkill("xinyingshi_cards"); + }, + marktext: "酬", + intro: { + content: "expansion", + markcount: "expansion", + }, + ai: { threaten: 3 }, + group: "xinyingshi_regain", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + delete player.storage.xinyingshi_source; + }, + }, + regain: { + trigger: { player: "die" }, + forced: true, + charlotte: true, + forceDie: true, + filter: function (event, player) { + return player.storage.xinyingshi_source && player.storage.xinyingshi_source.isIn() && player.getExpansions("xinyingshi_cards").length > 0; + }, + content: function () { + player.storage.xinyingshi_source.gain(player.getExpansions("xinyingshi_cards"), player, "give", "bySelf"); + }, + }, + }, + }, + xinfu_guolun: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.choosePlayerCard(target, true, "h"); + "step 1"; + event.cardt = result.cards[0]; + target.showCards(event.cardt); + player.chooseCard("he").set("ai", function (card) { + var event = _status.event.getParent(), + player = event.player; + var numt = get.number(event.cardt); + var att = get.attitude(player, target); + var value = get.value(event.cardt); + var num = get.number(card); + if (num < numt || att > 2) return value + 6 - get.value(card); + else if (num == numt) return value - get.value(card); + return -1; + }); + "step 2"; + if (!result.bool) event.finish(); + else { + player.showCards(result.cards); + event.cardp = result.cards[0]; + } + "step 3"; + player.swapHandcards(target, [event.cardp], [event.cardt]); + "step 4"; + var nump = get.number(event.cardp, player); + var numt = get.number(event.cardt, target); + if (nump < numt) { + player.draw(); + } else if (nump > numt) { + target.draw(); + } + }, + ai: { + threaten: 1.5, + order: 8, + result: { + player: function (player, target) { + if (get.attitude(player, target) > 0) return 1.5; + return 0.5; + }, + }, + }, + }, + xinfu_zhanji: { + audio: 2, + trigger: { + player: "gainAfter", + }, + forced: true, + filter: function (event, player) { + if (!player.isPhaseUsing()) return false; + return event.getParent().name == "draw" && event.getParent(2).name != "xinfu_zhanji"; + }, + content: function () { + player.draw("nodelay"); + }, + }, + xinfu_songsang: { + limited: true, + skillAnimation: true, + animationColor: "wood", + audio: 2, + derivation: "xinfu_zhanji", + trigger: { global: "dieAfter" }, + logTarget: "player", + async content(e, t, player) { + player.awakenSkill("xinfu_songsang"); + if (player.isDamaged()) { + player.recover(); + } else player.gainMaxHp(); + player.addSkills("xinfu_zhanji"); + }, + }, + xinfu_jixu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + if (player == target) return false; + if (ui.selected.targets.length) { + return target.hp == ui.selected.targets[0].hp; + } + return true; + }, + selectTarget: [1, Infinity], + multitarget: true, + multiline: true, + content: function () { + "step 0"; + targets.sort(lib.sort.seat); + "step 1"; + if (!event.num) event.num = 0; + if (!event.caicuolist) event.caicuolist = []; + targets[event.num].chooseBool("是否押杀?").ai = function (event, player) { + var evt = _status.event.getParent(); + if (get.attitude(targets[event.num], evt.player) > 0) return evt.player.countCards("h", "sha") ? false : true; + return Math.random() < 0.5; + }; + "step 2"; + if (result.bool) { + targets[event.num].chat("有杀"); + game.log(targets[event.num], "认为", player, "#g有杀"); + if (!player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); + } else { + targets[event.num].chat("没杀"); + game.log(targets[event.num], "认为", player, "#y没有杀"); + if (player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); + } + event.num++; + game.delay(); + if (event.num < targets.length) event.goto(1); + "step 3"; + player.popup(player.countCards("h", "sha") ? "有杀" : "没杀"); + game.log(player, player.countCards("h", "sha") ? "有杀" : "没杀"); + if (event.caicuolist.length == 0) { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; + event.finish(); + } + } else { + player.draw(event.caicuolist.length); + if (player.countCards("h", "sha")) { + player.addTempSkill("jixu_sha"); + player.storage.jixu_sha = event.caicuolist; + event.finish(); + } else event.num = 0; + } + "step 4"; + if (event.num < event.caicuolist.length) { + var target = event.caicuolist[event.num]; + player.discardPlayerCard(true, "he", target); + event.num++; + event.redo(); + } + }, + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.1; + }, + result: { + target: function (player, target) { + var raweffect = function (player, target) { + if (player.countCards("h", "sha")) { + return get.effect(target, { name: "sha" }, player, target); + } else { + var att = get.attitude(player, target); + var nh = target.countCards("h"); + if (att > 0) { + if (target.getEquip("baiyin") && target.isDamaged() && get.recoverEffect(target, player, player) > 0) { + if (target.hp == 1 && !target.hujia) return 1.6; + if (target.hp == 2) return 0.01; + return 0; + } + } + var es = target.getCards("e"); + var noe = es.length == 0 || target.hasSkillTag("noe"); + var noe2 = es.length == 1 && es[0].name == "baiyin" && target.isDamaged(); + var noh = nh == 0 || target.hasSkillTag("noh"); + if (noh && (noe || noe2)) return 0; + if (att <= 0 && !target.countCards("he")) return 1.5; + return -1.5; + } + }; + var num = game.countPlayer(function (current) { + return current != player && current.hp == target.hp && raweffect(player, current) * get.attitude(player, current) > 0; + }); + return raweffect(player, target) * Math.max(0, num - 1); + }, + }, + expose: 0.4, + }, + }, + jixu_sha: { + audio: "xinfu_jixu", + trigger: { + player: "useCard", + }, + onremove: function (player) { + delete player.storage.jixu_sha; + }, + filter: function (event, player) { + if (event.card.name == "sha") { + return game.hasPlayer(function (current) { + return current != player && player.storage.jixu_sha.includes(current) && !event.targets.includes(current); + }); + } + return false; + }, + forced: true, + silent: true, + popup: false, + content: function () { + player.logSkill("xinfu_jixu"); + for (var i = 0; i < player.storage.jixu_sha.length; i++) { + if (!trigger.targets.includes(player.storage.jixu_sha[i]) && player.canUse("sha", player.storage.jixu_sha[i], false)) { + player.line(player.storage.jixu_sha[i], trigger.card.nature); + trigger.targets.push(player.storage.jixu_sha[i]); + } + } + }, + }, + xinfu_sanwen: { + audio: 2, + usable: 1, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + var cards = event.getg(player); + if (!cards || !cards.length) return false; + var namelist = []; + var namedlist = []; + for (var i = 0; i < cards.length; i++) { + namelist.add(get.name(cards[i])); + } + var hs = player.getCards("h"); + for (var j = 0; j < hs.length; j++) { + if (namelist.includes(get.name(hs[j])) && !cards.includes(hs[j])) return true; + } + return false; + }, + content: function () { + "step 0"; + var namelist = []; + var namedlist = []; + var nameddlist = []; + var namedddlist = []; + var cards = trigger.getg(player); + for (var i = 0; i < cards.length; i++) { + namelist.add(get.name(cards[i])); + } + var hs = player.getCards("h"); + for (var j = 0; j < hs.length; j++) { + if (namelist.includes(get.name(hs[j])) && !cards.includes(hs[j])) { + namedlist.push(hs[j]); + namedddlist.add(get.name(hs[j])); + } + } + for (var k = 0; k < cards.length; k++) { + if (namedddlist.includes(get.name(cards[k]))) nameddlist.push(cards[k]); + } + var showlist = namedlist.concat(nameddlist); + player.showCards(showlist); + player.discard(nameddlist); + player.draw(2 * nameddlist.length); + }, + }, + xinfu_qiai: { + skillAnimation: true, + animationColor: "gray", + trigger: { player: "dying" }, + limited: true, + audio: 2, + content: function () { + "step 0"; + player.awakenSkill("xinfu_qiai"); + event.targets = game + .filterPlayer(function (current) { + return current != player; + }) + .sortBySeat(); + if (!event.targets.length) event.finish(); + "step 1"; + event.current = event.targets.shift(); + if (!event.current.countCards("he")) event.goto(3); + else + event.current.chooseCard("交给" + get.translation(player) + "一张牌", "he", true).set("ai", function (card) { + var evt = _status.event.getParent(); + if (get.attitude(_status.event.player, evt.player) > 2) { + if (card.name == "jiu") return 120; + if (card.name == "tao") return 110; + } + return 100 - get.value(card); + }); + "step 2"; + if (result.bool && result.cards && result.cards.length) { + event.current.give(result.cards, player); + } + "step 3"; + if (event.targets.length > 0) event.goto(1); + }, + }, + xinfu_denglou: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + limited: true, + filter: function (event, player) { + return player.countCards("h") == 0; + }, + skillAnimation: true, + animationColor: "gray", + content: function () { + "step 0"; + player.awakenSkill("xinfu_denglou"); + event.cards = get.cards(4); + event.gains = []; + event.discards = []; + var content = ["牌堆顶的四张牌", event.cards]; + game.log(player, "观看了", "#y牌堆顶的四张牌"); + player.chooseControl("ok").set("dialog", content); + "step 1"; + if (get.type(event.cards[0]) != "basic") { + event.gains.push(event.cards[0]); + event.cards.remove(event.cards[0]); + } else { + var bool = game.hasPlayer(function (current) { + return player.canUse(event.cards[0], current); + }); + if (bool) { + player.chooseUseTarget(event.cards[0], true, false); + } else event.discards.push(event.cards[0]); + event.cards.remove(event.cards[0]); + } + "step 2"; + if (event.cards.length) event.goto(1); + else { + if (event.gains.length) player.gain(event.gains, "gain2"); + if (event.discards.length) { + player.$throw(event.discards); + game.cardsDiscard(event.discards); + } + } + }, + }, + qinguo_use: { audio: 2 }, + xinfu_qinguo: { + group: "xinfu_qinguo_recover", + audio: "qinguo_use", + subfrequent: ["recover"], + trigger: { + player: "useCardEnd", + }, + filter: function (event, player) { + return get.type(event.card) == "equip"; + }, + direct: true, + content: function () { + player.chooseUseTarget({ name: "sha" }, get.prompt("xinfu_qinguo"), "视为使用一张【杀】", false).logSkill = "xinfu_qinguo"; + }, + subSkill: { + recover: { + audio: "qinguo_use", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + prompt: "是否发动【勤国】回复1点体力?", + filter: function (event, player) { + if (player.isHealthy() || player.countCards("e") != player.hp) return false; + var evt = event.getl(player); + if (event.name == "equip" && event.player == player) return !evt || evt.cards.length != 1; + return evt && evt.es.length; + }, + frequent: true, + content: function () { + player.recover(); + }, + }, + }, + ai: { + effect: { + target: function (card, player, target, current) { + if ( + get.type(card) == "equip" && + !get.cardtag(card, "gifts") && + game.hasPlayer(function (current) { + return target.canUse("sha", current); + }) + ) + return [1, 1.5]; + }, + }, + noe: true, + reverseEquip: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "noe") return player.countCards("e") == player.hp + 1; + return game.hasPlayer(function (current) { + return player.canUse("sha", current); + }); + }, + }, + }, + xinfu_jijun: { + ai: { + reverseEquip: true, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && player == target && player == _status.currentPhase && get.subtype(card) == "equip1") return [1, 3]; + }, + }, + combo: "xinfu_fangtong", + }, + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + frequent: true, + filter: function (event, player) { + if (player != _status.currentPhase) return false; + if (event.getParent().triggeredTargets3.length > 1) return false; + if (get.type(event.card) == "equip" && get.subtype(event.card) != "equip1") return false; + if (event.targets.includes(player)) return true; + return false; + }, + callback: function () { + player.addToExpansion(card, "gain2").gaintag.add("xinfu_jijun"); + }, + content: function () { + player.judge(function (card) { + return 1; + }).callback = lib.skill.xinfu_jijun.callback; + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", + mark: function (dialog, content, player) { + var content = player.getExpansions("xinfu_jijun"); + if (content && content.length) { + dialog.addAuto(content); + if (player == game.me || player.isUnderControl()) { + var list = lib.skill.xinfu_fangtong.getAuto(player); + if (list.length > 0) { + dialog.addText("
  • 推荐方案:" + get.translation(list[0]) + "+ " + get.translation(list.slice(1))); + } + } + } + }, + }, + marktext: "方", + }, + xinfu_fangtong: { + getAuto: function (player) { + var hs = player.getCards("he"); + var ss = player.getExpansions("xinfu_jijun"); + var bool = false, + max = Math.pow(2, ss.length), + index, + i; + for (i = 0; i < hs.length; i++) { + for (var j = 1; j < max; j++) { + var num = get.number(hs[i]); + index = j.toString(2); + while (index.length < ss.length) { + index = "0" + index; + } + for (var k = 0; k < ss.length; k++) { + if (index[k] == "1") num += get.number(ss[k]); + } + if (num == 36) { + bool = true; + break; + } + } + if (bool) break; + } + if (!bool) return []; + var list = [hs[i]]; + for (var k = 0; k < ss.length; k++) { + if (index[k] == "1") list.push(ss[k]); + } + return list; + }, + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + filter: function (event, player) { + return player.countCards("he") > 0 && player.getExpansions("xinfu_jijun").length > 0; + }, + direct: true, + skillAnimation: true, + animationColor: "metal", + content: function () { + "step 0"; + var info = ["是否发动【方统】?"]; + info.push('
    ' + get.translation(player) + "的“方”
    "); + info.push(player.getExpansions("xinfu_jijun")); + if (player.countCards("h")) { + info.push('
    ' + get.translation(player) + "的手牌区
    "); + info.push(player.getCards("h")); + } + if (player.countCards("e")) { + info.push('
    ' + get.translation(player) + "的装备区
    "); + info.push(player.getCards("e")); + } + var next = player.chooseButton(); + next.set("createDialog", info); + next.set("selectButton", function () { + var num = 0; + for (var i = 0; i < ui.selected.buttons.length; i++) { + num += get.number(ui.selected.buttons[i]); + } + if (num == 36) return ui.selected.buttons.length; + return ui.selected.buttons.length + 2; + }); + next.set("filterButton", function (button) { + var player = _status.event.player, + cards = player.getExpansions("xinfu_jijun"); + if (ui.selected.buttons.length) { + if (!cards.includes(button.link)) return false; + } else if (cards.includes(button.link)) return false; + var num = 0; + for (var i = 0; i < ui.selected.buttons.length; i++) { + num += get.number(ui.selected.buttons[i]); + } + return get.number(button.link) + num <= 36; + }); + next.set("autolist", lib.skill.xinfu_fangtong.getAuto(player)); + next.set("processAI", function () { + if (_status.event.autolist && _status.event.autolist.length > 0) { + return { + bool: true, + links: _status.event.autolist, + }; + } + return { bool: false }; + }); + next.set("complexSelect", true); + "step 1"; + if (result.bool) { + player.logSkill("xinfu_fangtong"); + var tothrow = []; + var cards = result.links.slice(0); + for (var i = 0; i < cards.length; i++) { + if (get.position(cards[i]) == "x") { + tothrow.push(cards[i]); + } else { + player.discard(cards[i]).delay = false; + } + } + player.loseToDiscardpile(tothrow); + player + .chooseTarget("选择一个目标并对其造成3点雷电伤害", true, function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + return get.damageEffect(target, _status.event.player, _status.event.player, "thunder"); + }); + } else { + event.finish(); + } + "step 2"; + var target = result.targets[0]; + player.line(target, "thunder"); + target.damage(3, "thunder"); + }, + ai: { + combo: "xinfu_jijun", + }, + }, + xinfu_weilu: { + audio: 2, + trigger: { + player: "damageEnd", + }, + filter: function (event, player) { + return event.source && event.source.isIn() && !player.getStorage("xinfu_weilu_effect").includes(event.source); + }, + check: function (event, player) { + return get.effect(event.source, { name: "losehp" }, player, player) >= 0; + }, + forced: true, + logTarget: "source", + content: function () { + player.addTempSkill("xinfu_weilu_effect", { player: "die" }); + player.markAuto("xinfu_weilu_effect", [trigger.source]); + game.delayx(); + }, + ai: { + maixie_defend: true, + threaten: 0.85, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + return 0.9; + }, + }, + }, + subSkill: { + effect: { + audio: "xinfu_weilu", + trigger: { player: "phaseUseBegin" }, + charlotte: true, + forced: true, + logTarget: function (event, player) { + return player.getStorage("xinfu_weilu_effect").filter(function (current) { + return current.isIn() && current.hp > 1; + }); + }, + content: function () { + "step 0"; + var targets = player.getStorage("xinfu_weilu_effect"); + player.removeSkill("xinfu_weilu_effect"); + event.targets = targets.sortBySeat(); + "step 1"; + var target = targets.shift(); + if (target.isIn() && target.hp > 1) { + event._delay = true; + var num = target.hp - 1; + player.markAuto("xinfu_weilu_recover", [[target, num]]); + target.loseHp(num); + } + if (targets.length > 0) event.redo(); + else if (!event._delay) event.finish(); + "step 2"; + player.addTempSkill("xinfu_weilu_recover", { + player: ["phaseUseAfter", "phaseAfter"], + }); + game.delayx(); + }, + onremove: true, + intro: { content: "已将$列入“威虏”战略打击目标" }, + }, + recover: { + audio: "xinfu_weilu", + charlotte: true, + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + var targets = player.getStorage("xinfu_weilu_recover"); + for (var i of targets) { + if (i[0].isIn() && i[0].isDamaged()) return true; + } + return false; + }, + onremove: true, + logTarget: function (event, player) { + var logs = [], + targets = player.getStorage("xinfu_weilu_recover"); + for (var i of targets) { + if (i[0].isIn() && i[0].isDamaged()) logs.add(i[0]); + } + return logs; + }, + content: function () { + "step 0"; + event.list = player.getStorage("xinfu_weilu_recover").slice(0); + event.list.sort(function (a, b) { + return lib.sort.seat(a[0], b[0]); + }); + "step 1"; + var group = event.list.shift(); + if (group[0].isIn() && group[0].isDamaged()) { + group[0].recover(group[1]); + event._delay = true; + } + if (event.list.length > 0) event.redo(); + else if (!event._delay) event.finish(); + "step 2"; + game.delayx(); + }, + }, + }, + }, + xinfu_zengdao: { + audio: 2, + limited: true, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("e") > 0; + }, + filterTarget: lib.filter.notMe, + skillAnimation: true, + animationColor: "thunder", + position: "e", + filterCard: true, + selectCard: [1, Infinity], + discard: false, + lose: false, + content: function () { + player.awakenSkill("xinfu_zengdao"); + target.addToExpansion(cards, player, "give").gaintag.add("xinfu_zengdao2"); + target.addSkill("xinfu_zengdao2"); + }, + ai: { + order: function () { + var player = _status.event.player, + num = 0; + if (player.hasCard(card => get.value(card, player) < 0, "e")) return 9; + for (var i = 1; i < 6; i++) { + num += player.countEquipableSlot(i); + } + if (num <= 2) return 9; + var targets = player.getStorage("xinfu_weilu_recover"), + num = 0; + if ( + player.hp <= 2 || + !game.hasPlayer(current => { + if (player == current || get.attitude(player, current) < 0 || current.hp <= 1) return false; + for (var arr of targets) { + if (current == arr[0]) break; + } + return current.hp > 2 || current.countCards("hs") > 2; + }) + ) + return 1; + return 0; + }, + result: { + target: function (player, target) { + if (target.hasValueTarget({ name: "sha", isCard: true })) return ui.selected.cards.length; + return 0; + }, + }, + }, + }, + xinfu_zengdao2: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("xinfu_zengdao2").length > 0; + }, + content: function () { + "step 0"; + player.chooseCardButton("将一张“刀”置入弃牌堆", player.getExpansions("xinfu_zengdao2"), true); + "step 1"; + if (result.bool) { + trigger.num++; + player.loseToDiscardpile(result.links); + } + }, + marktext: "刀", + intro: { + content: "expansion", + markcount: "expansion", + onunmark: function (storage, player) { + player.removeSkill("xinfu_zengdao2"); + }, + }, + }, + xinfu_guanwei: { + audio: 2, + usable: 1, + init: () => { + game.addGlobalSkill("xinfu_guanwei_ai"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("xinfu_guanwei"), true)) game.removeGlobalSkill("xinfu_guanwei_ai"); + }, + trigger: { + global: "phaseUseEnd", + }, + filter: function (event, player) { + var history = event.player.getHistory("useCard"); + var num = 0; + var suit = false; + for (var i = 0; i < history.length; i++) { + var suit2 = get.suit(history[i].card); + if (!lib.suit.includes(suit2)) return false; + if (suit && suit != suit2) return false; + suit = suit2; + num++; + } + return num > 1; + }, + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + player + .chooseToDiscard("he", get.prompt("xinfu_guanwei", trigger.player), "弃置一张牌,令其摸两张牌并进行一个额外的出牌阶段。") + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.targetx) < 1) return 0; + return 9 - get.value(card); + }) + .set("logSkill", ["xinfu_guanwei", target]) + .set("targetx", target); + "step 1"; + if (result.bool) { + player.line(trigger.player, "green"); + trigger.player.draw(2); + } else { + player.storage.counttrigger.xinfu_guanwei--; + event.finish(); + } + "step 2"; + var next = trigger.player.phaseUse(); + event.next.remove(next); + trigger.getParent("phase").next.push(next); + }, + ai: { + expose: 0.5, + }, + subSkill: { + ai: { + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("xinfu_guanwei"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("xinfu_guanwei_ai"); + }, + ai: { + effect: { + player_use: function (card, player, target) { + if (typeof card != "object" || !player.isPhaseUsing()) return; + var hasPanjun = game.hasPlayer(function (current) { + return ( + current.hasSkill("xinfu_guanwei") && + (!current.storage.counttrigger || !current.storage.counttrigger.xinfu_guanwei) && + get.attitude(current, player) >= 1 && + current.hasCard(function (card) { + return get.value(card) < 7 || (current != game.me && !current.isUnderControl() && !current.isOnline() && get.value(card) < 9); + }, "he") + ); + }); + if (!hasPanjun) return; + var suitx = get.suit(card); + var history = player.getHistory("useCard"); + if (!history.length) { + var val = 0; + if ( + player.hasCard(function (cardx) { + return get.suit(cardx) == suitx && card != cardx && (!card.cards || !card.cards.includes(cardx)) && player.hasValueTarget(cardx); + }, "hs") + ) + val = [2, 0.1]; + if (val) return val; + return; + } + var num = 0; + var suit = false; + for (var i = 0; i < history.length; i++) { + var suit2 = get.suit(history[i].card); + if (!lib.suit.includes(suit2)) return; + if (suit && suit != suit2) return; + suit = suit2; + num++; + } + if (suitx == suit && num == 1) return [1, 0.1]; + if ( + suitx != suit && + (num > 1 || + (num <= 1 && + player.hasCard(function (cardx) { + return get.suit(cardx) == suit && player.hasValueTarget(cardx); + }, "hs"))) + ) + return "zeroplayertarget"; + }, + }, + }, + }, + }, + }, + xinfu_gongqing_gz_panjun: { audio: 2 }, + xinfu_gongqing: { + audio: 2, + audioname2: { gz_panjun: "xinfu_gongqing_gz_panjun" }, + trigger: { + player: ["damageBegin3", "damageBegin4"], + }, + forced: true, + filter: function (event, player, name) { + if (!event.source) return false; + var range = event.source.getAttackRange(); + if (name == "damageBegin3") return range > 3; + return event.num > 1 && range < 3; + }, + preHidden: true, + content: function () { + trigger.num = event.triggername == "damageBegin4" ? 1 : trigger.num + 1; + }, + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; + if (arg.player.getAttackRange() < 3) return true; + } + return false; + }, + }, + }, + xinfu_andong: { + subSkill: { + add: { + sub: true, + mod: { + ignoredHandcard: function (card, player) { + if (get.suit(card) == "heart") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.suit(card) == "heart") return false; + }, + }, + }, + }, + audio: 2, + trigger: { + player: "damageBegin4", + }, + filter: function (event, player) { + return get.itemtype(event.source) == "player"; + }, + logTarget: "source", + content: function () { + "step 0"; + if (!trigger.source.countCards("h")) event._result = { index: 1 }; + else + trigger.source.chooseControlList(["令" + get.translation(player) + "观看你的手牌,并获得其中所有的红桃牌。", "防止即将对" + get.translation(player) + "造成的伤害,并使自己本回合内的红桃手牌不计入手牌上限。"], true).set("ai", function (event, player) { + var target = _status.event.getParent().player; + var player = _status.event.player; + if (get.attitude(player, target) > 0) return 1; + return 0; + }); + "step 1"; + if (result.index == 1) { + trigger.cancel(); + trigger.source.addTempSkill("xinfu_andong_add"); + event.finish(); + } else { + player.viewHandcards(trigger.source); + } + "step 2"; + var cards = trigger.source.getCards("h"); + var togain = []; + for (var i = 0; i < cards.length; i++) { + if (get.suit(cards[i]) == "heart") togain.push(cards[i]); + } + if (togain.length) player.gain(togain, trigger.source, "giveAuto", "bySelf"); + }, + }, + xinfu_yingshi: { + audio: 2, + group: ["yingshi_die"], + trigger: { + player: "phaseUseBegin", + }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("he", { suit: "heart" }) > 0 && + !game.hasPlayer(function (current) { + return current.hasSkill("yingshi_heart"); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xinfu_yingshi"), function (card, player, target) { + return target != player; + }) + .set("ai", function () { + return -1; + }); + "step 1"; + if (result.bool) { + var cards = player.getCards("he", { suit: "heart" }); + var target = result.targets[0]; + player.logSkill("xinfu_yingshi", target); + target.addSkill("yingshi_heart"); + target.addToExpansion(cards, player, "give").gaintag.add("xinfu_yingshi"); + } + }, + marktext: "酬", + intro: { + markcount: "expansion", + content: "expansion", + onunmark: function (storage, player) { + player.removeSkill("yingshi_heart"); + }, + }, + }, + yingshi_heart: { + charlotte: true, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source && event.source.isIn() && event.card && event.card.name == "sha" && player.getExpansions("xinfu_yingshi").length > 0; + }, + forced: true, + logTarget: "source", + content: function () { + "step 0"; + trigger.source.chooseCardButton("应势:选择获得一张“酬”", player.getExpansions("xinfu_yingshi"), true); + "step 1"; + if (result.bool) { + trigger.source.gain(result.links, player, "give"); + } + }, + }, + yingshi_die: { + audio: "xinfu_yingshi", + forced: true, + trigger: { global: "die" }, + logTarget: "player", + filter: function (event, player) { + return event.player.getExpansions("xinfu_yingshi").length > 0; + }, + content: function () { + var target = trigger.player; + player.gain(target.getExpansions("xinfu_yingshi"), target, "give", "bySelf"); + }, + }, + xinfu_duanfa: { + init: function (player) { + player.storage.xinfu_duanfa = 0; + }, + audio: 2, + enable: "phaseUse", + position: "he", + filter: function (card, player) { + return player.storage.xinfu_duanfa < player.maxHp; + }, + filterCard: function (card) { + return get.color(card) == "black"; + }, + selectCard: function () { + var player = _status.event.player; + return [1, player.maxHp - player.storage.xinfu_duanfa]; + }, + check: function (card) { + return 6 - get.value(card); + }, + delay: false, + content: function () { + player.draw(cards.length); + player.storage.xinfu_duanfa += cards.length; + }, + group: "xinfu_duanfa_clear", + subSkill: { + clear: { + trigger: { + player: "phaseBefore", + }, + forced: true, + silent: true, + popup: false, + content: function () { + player.storage.xinfu_duanfa = 0; + }, + sub: true, + }, + }, + ai: { + order: 1, + result: { + player: 1, + }, + }, + }, + xinfu_youdi: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xinfu_youdi"), function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (player.countCards("h", "sha") > player.countCards("h") / 3 && player.countCards("h", { color: "red" }) > player.countCards("h") / 2) return 0; + if (target.countCards("he") == 0) return 0.1; + return -get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + game.delay(); + player.logSkill("xinfu_youdi", result.targets); + event.target = result.targets[0]; + event.target.discardPlayerCard(player, "h", true); + } else { + event.finish(); + } + "step 2"; + if (get.color(result.links[0]) != "black") player.draw("nodelay"); + if (result.links[0].name != "sha" && event.target.countCards("he")) { + player.gainPlayerCard("he", event.target, true); + } + }, + ai: { + expose: 0.3, + threaten: 1.4, + }, + }, + xinfu_guanchao: { + subSkill: { + dizeng: { + mark: true, + marktext: "增", + intro: { + content: "单调递增", + }, + trigger: { + player: "useCard", + }, + audio: "xinfu_guanchao", + forced: true, + mod: { + aiOrder: function (player, card, num) { + if (typeof card.number != "number") return; + var history = player.getHistory("useCard", function (evt) { + return evt.isPhaseUsing(); + }); + if (history.length == 0) return num + 10 * (14 - card.number); + var num = get.number(history[0].card); + if (!num) return; + for (var i = 1; i < history.length; i++) { + var num2 = get.number(history[i].card); + if (!num2 || num2 <= num) return; + num = num2; + } + if (card.number > num) return num + 10 * (14 - card.number); + }, + }, + filter: function (event, player) { + var history = player.getHistory("useCard", function (evt) { + return evt.isPhaseUsing(); + }); + if (history.length < 2) return false; + var num = get.number(history[0].card); + if (!num) return false; + for (var i = 1; i < history.length; i++) { + var num2 = get.number(history[i].card); + if (!num2 || num2 <= num) return false; + num = num2; + } + return true; + }, + content: function () { + player.draw(); + }, + sub: true, + }, + dijian: { + mark: true, + marktext: "减", + intro: { + content: "单调递减", + }, + init: function (player) { + player.storage.guanchao = 0; + }, + onremove: function (player) { + delete player.storage.guanchao; + }, + trigger: { + player: "useCard", + }, + audio: "xinfu_guanchao", + forced: true, + mod: { + aiOrder: function (player, card, num) { + if (typeof card.number != "number") return; + var history = player.getHistory("useCard", function (evt) { + return evt.isPhaseUsing(); + }); + if (history.length == 0) return num + 10 * card.number; + var num = get.number(history[0].card); + if (!num) return; + for (var i = 1; i < history.length; i++) { + var num2 = get.number(history[i].card); + if (!num2 || num2 >= num) return; + num = num2; + } + if (card.number < num) return num + 10 * card.number; + }, + }, + filter: function (event, player) { + var history = player.getHistory("useCard", function (evt) { + return evt.isPhaseUsing(); + }); + if (history.length < 2) return false; + var num = get.number(history[0].card); + if (!num) return false; + for (var i = 1; i < history.length; i++) { + var num2 = get.number(history[i].card); + if (!num2 || num2 >= num) return false; + num = num2; + } + return true; + }, + content: function () { + player.draw(); + }, + sub: true, + }, + }, + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + direct: true, + content: function () { + "step 0"; + var list = ["递增", "递减", "取消"]; + player + .chooseControl(list) + .set("prompt", get.prompt2("xinfu_guanchao")) + .set("ai", function () { + return [0, 1].randomGet(); + }); + "step 1"; + switch (result.control) { + case "递增": { + player.logSkill("xinfu_guanchao"); + player.addTempSkill("xinfu_guanchao_dizeng", "phaseUseEnd"); + break; + } + case "递减": { + player.logSkill("xinfu_guanchao"); + player.addTempSkill("xinfu_guanchao_dijian", "phaseUseEnd"); + break; + } + case "取消": { + break; + } + } + }, + }, + xinfu_xunxian: { + usable: 1, + audio: 2, + trigger: { + player: ["useCardAfter", "respond"], + }, + filter: function (event, player) { + if ( + get.itemtype(event.cards) !== "cards" || + !game.hasPlayer(current => { + if (current === player) return false; + return current.getHp() > player.getHp() || current.countCards("h") > player.countCards("h"); + }) + ) + return false; + for (var i = 0; i < event.cards.length; i++) { + if (event.cards[i].isInPile()) { + return true; + } + } + return false; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("xinfu_xunxian"), (card, player, target) => { + if (target === player) return false; + return target.getHp() > player.getHp() || target.countCards("h") > player.countCards("h"); + }) + .set("ai", target => { + let att = get.attitude(_status.event.player, target), + name = _status.event.cards[0].name; + if (att < 3) return 0; + if (target.hasJudge("lebu")) att /= 5; + if (name === "sha" && target.hasSha()) att /= 5; + if (name === "wuxie" && target.needsToDiscard(_status.event.cards)) att /= 5; + return att / (1 + get.distance(player, target, "absolute")); + }) + .set("cards", trigger.cards) + .forResult(); + }, + async content(event, trigger, player) { + let list = []; + for (let i = 0; i < trigger.cards.length; i++) { + if (trigger.cards[i].isInPile()) { + list.push(trigger.cards[i]); + } + } + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); + event.targets[0].gain(list, "gain2").giver = player; + }, + }, + xinfu_kannan: { + audio: 2, + subSkill: { + phase: { + sub: true, + }, + }, + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("xinfu_kannan_phase")) return false; + if (player.getStat().skill.xinfu_kannan >= player.hp) return false; + return player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + if (target.hasSkill("xinfu_kannan_phase")) return false; + return player.canCompare(target); + }, + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.4; + }, + result: { + target: function (player, target) { + if ( + player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return card.number >= 12; + } + if (val <= 6) { + return card.number >= 13; + } + return false; + }) + ) + return -1; + return 0; + }, + }, + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + player.addTempSkill("xinfu_kannan_phase"); + if (!player.hasSkill("kannan_eff")) { + player.addSkill("kannan_eff"); + } else { + if (!player.storage.kannan_eff) player.storage.kannan_eff = 0; + } + player.storage.kannan_eff++; + player.markSkill("kannan_eff"); + } else { + target.addTempSkill("xinfu_kannan_phase"); + if (!target.hasSkill("kannan_eff")) { + target.addSkill("kannan_eff"); + } else { + if (!target.storage.kannan_eff) player.storage.kannan_eff = 0; + //target.storage.kannan_eff++; + //target.markSkill('kannan_eff'); + } + target.storage.kannan_eff++; + target.markSkill("kannan_eff"); + } + }, + }, + kannan_eff: { + mark: true, + intro: { + content: "下一张杀的伤害基数+#", + }, + trigger: { + player: "useCard", + }, + filter: function (event) { + return event.card && event.card.name == "sha"; + }, + forced: true, + content: function () { + if (!trigger.baseDamage) trigger.baseDamage = 1; + trigger.baseDamage += player.storage.kannan_eff; + player.removeSkill("kannan_eff"); + }, + init: function (player) { + player.storage.kannan_eff = 0; + }, + onremove: function (player) { + delete player.storage.kannan_eff; + }, + ai: { + damageBonus: true, + }, + }, + xinfu_tushe: { + audio: 2, + mod: { + aiOrder(player, card, num) { + if (get.tag(card, "multitarget")) { + if (player.countCards("h", { type: "basic" })) return num / 10; + return num * 10; + } + if (get.type(card) === "basic") return num + 10; + }, + aiValue(player, card, num) { + if (card.name === "zhangba") { + let fact = n => { + if (n > 1) return n * fact(n - 1); + return 1; + }, + basic = 0; + return fact( + Math.min( + player.countCards("hs", i => { + if (get.tag(i, "multitarget")) return 2; + if (!["shan", "tao", "jiu"].includes(card.name)) return 1; + basic++; + }) / + (1 + basic), + player.getCardUsable("sha") + ) + ); + } + if (["shan", "tao", "jiu"].includes(card.name)) { + if (player.getEquip("zhangba") && player.countCards("hs") > 1) return 0.01; + return num / 2; + } + if (get.tag(card, "multitarget")) return num + game.players.length; + }, + aiUseful(player, card, num) { + if (get.name(card, player) === "shan") { + if ( + player.countCards("hs", i => { + if (card === i || (card.cards && card.cards.includes(i))) return false; + return get.name(i, player) === "shan"; + }) + ) + return -1; + return num / Math.pow(Math.max(1, player.hp), 2); + } + }, + }, + trigger: { + player: "useCardToPlayered", + }, + locked: false, + frequent: true, + filter: function (event, player) { + if (get.type(event.card) == "equip") return false; + if (event.getParent().triggeredTargets3.length > 1) return false; + return event.targets.length > 0 && !player.countCards("h", { type: "basic" }); + }, + content: function () { + player.draw(trigger.targets.length); + }, + ai: { + presha: true, + pretao: true, + threaten: 1.8, + effect: { + player(card, player, target) { + if ( + typeof card === "object" && + card.name !== "shan" && + get.type(card) !== "equip" && + !player.countCards("h", i => { + if (card === i || (card.cards && card.cards.includes(i))) return false; + return get.type(i) === "basic"; + }) + ) { + let targets = [], + evt = _status.event.getParent("useCard"); + targets.addArray(ui.selected.targets); + if (evt && evt.card == card) targets.addArray(evt.targets); + if (targets.length) return [1, targets.length]; + if (get.tag(card, "multitarget")) return [1, game.players.length - 1]; + return [1, 1]; + } + }, + }, + }, + }, + xinfu_limu: { + mod: { + targetInRange: function (card, player, target) { + if (player.countCards("j") && player.inRange(target)) { + return true; + } + }, + cardUsableTarget: function (card, player, target) { + if (player.countCards("j") && player.inRange(target)) return true; + }, + aiOrder(player, card, num) { + if (get.type(card, "delay") && player.canUse(card, player) && player.canAddJudge(card)) return 15; + }, + }, + locked: false, + audio: 2, + enable: "phaseUse", + discard: false, + filter: function (event, player) { + if (player.hasJudge("lebu")) return false; + return player.countCards("hes", { suit: "diamond" }) > 0; + }, + viewAs: { name: "lebu" }, + //prepare:"throw", + position: "hes", + filterCard: function (card, player, event) { + return get.suit(card) == "diamond" && player.canAddJudge({ name: "lebu", cards: [card] }); + }, + selectTarget: -1, + filterTarget: function (card, player, target) { + return player == target; + }, + check(card) { + var player = _status.event.player; + if (!player.getEquip("zhangba")) { + let damaged = player.maxHp - player.hp - 1; + if ( + player.countCards("h", function (cardx) { + if (cardx == card) return false; + if (cardx.name == "tao") { + if (damaged < 1) return true; + damaged--; + } + return ["shan", "jiu"].includes(cardx.name); + }) > 0 + ) + return 0; + } + if (card.name == "shan") return 15; + if (card.name == "tao" || card.name == "jiu") return 10; + return 9 - get.value(card); + }, + onuse: function (links, player) { + var next = game.createEvent("limu_recover", false, _status.event.getParent()); + next.player = player; + next.setContent(function () { + player.recover(); + }); + }, + ai: { + result: { + target(player, target) { + let res = lib.card.lebu.ai.result.target(player, target); + if (target.isDamaged()) return res + 2 * Math.abs(get.recoverEffect(target, player, target)); + return res; + }, + ignoreStatus: true, + }, + order(item, player) { + if (player.hp > 1 && player.countCards("j")) return 0; + return 12; + }, + effect: { + target(card, player, target) { + if (target.isPhaseUsing() && typeof card === "object" && get.type(card, target) === "delay" && !target.countCards("j")) { + let shas = + target.getCards("hs", i => { + if (card === i || (card.cards && card.cards.includes(i))) return false; + return get.name(i, target) === "sha" && target.getUseValue(i) > 0; + }) - target.getCardUsable("sha"); + if (shas > 0) return [1, 1.5 * shas]; + } + }, + }, + }, + }, +}; + +export default skills; diff --git a/character/xinghuoliaoyuan/sort.js b/character/xinghuoliaoyuan/sort.js new file mode 100644 index 000000000..ddad8554b --- /dev/null +++ b/character/xinghuoliaoyuan/sort.js @@ -0,0 +1,19 @@ +const characterSort = { + // xinghuoliaoyuan_tianfu:[], + xinghuoliaoyuan_tianliang: ["duji", "liuyan", "yanjun"], + xinghuoliaoyuan_tianji: ["panjun", "wangcan"], + xinghuoliaoyuan_tiantong: ["re_jsp_pangtong", "sp_taishici"], + xinghuoliaoyuan_tianxiang: ["lvdai", "zhoufang", "liuyao"], + xinghuoliaoyuan_qisha: ["lvqian", "re_zhangliang"], +}; + +const characterSortTranslate = { + xinghuoliaoyuan_tianfu: "天府", + xinghuoliaoyuan_tianliang: "天梁", + xinghuoliaoyuan_tianji: "天机", + xinghuoliaoyuan_tiantong: "天同", + xinghuoliaoyuan_tianxiang: "天相", + xinghuoliaoyuan_qisha: "七杀", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/xinghuoliaoyuan/translate.js b/character/xinghuoliaoyuan/translate.js new file mode 100644 index 000000000..ef3ac94ed --- /dev/null +++ b/character/xinghuoliaoyuan/translate.js @@ -0,0 +1,85 @@ +const translates = { + xinghuoliaoyuan: "星火燎原", + sp_taishici: "SP太史慈", + sp_taishici_prefix: "SP", + wangcan: "王粲", + re_jsp_pangtong: "SP庞统", + re_jsp_pangtong_prefix: "SP", + lvdai: "吕岱", + re_zhangliang: "张梁", + lvqian: "吕虔", + panjun: "潘濬", + duji: "杜畿", + zhoufang: "周鲂", + yanjun: "严畯", + liuyao: "刘繇", + liuyan: "刘焉", + xinfu_guolun: "过论", + xinfu_guolun_info: "出牌阶段限一次,你可以展示一名其他角色的手牌,然后展示你的一张牌。你与其交换这两张牌,然后展示的牌点数较小的角色摸一张牌。", + xinfu_zhanji: "展骥", + xinfu_zhanji_info: "锁定技。你的出牌阶段内,当你因摸牌且不是因为此技能效果而得到牌后,你摸一张牌。", + xinfu_songsang: "送丧", + xinfu_songsang_info: "限定技,其他角色死亡时,你可以回复1点体力(若你未受伤,则改为加1点体力上限);然后获得技能〖展骥〗。", + xinfu_jixu: "击虚", + xinfu_jixu_info: "出牌阶段限一次,若你有手牌,你可以令任意名体力值相等的其他角色猜测你的手牌中是否有【杀】。然后,你摸X张牌(X为猜错的角色数)。若你有【杀】,则你本回合内使用【杀】时,所有这些角色均成为【杀】的目标;若你没有【杀】,则你弃置所有这些角色的各一张牌。若X为零,你结束出牌阶段。", + jixu_sha: "击虚", + jixu_sha_info: "", + xinfu_sanwen: "散文", + xinfu_sanwen_info: "每回合限一次。当你得到牌后,若你的原手牌中有与这些牌名称相同的牌,则你可以展示这些牌,弃置新得到的同名牌并摸两倍的牌。", + xinfu_qiai: "七哀", + xinfu_qiai_info: "限定技,当你进入濒死状态时,你可以令所有其他角色依次交给你一张牌。", + xinfu_denglou: "登楼", + xinfu_denglou_info: "限定技,结束阶段,若你没有手牌,则你可以观看牌堆顶的四张牌,依次使用其中的所有基本牌(不能使用则弃置),然后获得其余的牌。", + qinguo_use: "勤国", + qinguo_use_info: "", + xinfu_qinguo: "勤国", + xinfu_qinguo_info: "当你使用的装备牌结算完成时,你可以视为使用一张【杀】;当你因使用或失去装备牌导致装备区内牌的数量发生变化后,若你装备区内牌的数量等于你的体力值,则你回复1点体力。", + qinguo_lose: "勤国", + qinguo_lose_info: "", + xinfu_jijun: "集军", + xinfu_jijun_info: "当你于回合内使用非装备牌或武器牌指定目标后,若你是此牌的目标,你可以进行一次判定。然后,你将判定牌置于自己的武将牌上,称之为「方」。", + xinfu_fangtong: "方统", + xinfu_fangtong_info: "结束阶段,你可以弃置总点数之和为36的一张牌与任意张「方」,并对一名其他角色造成3点雷电伤害。", + xinfu_weilu: "威虏", + xinfu_weilu_info: "锁定技,当你受到伤害后,伤害来源获得一枚「虏」。你的下个出牌阶段开始时,所有有「虏」的角色将体力失去至1点。此阶段结束后,这些角色回复以此法失去的体力。", + weilu_effect: "威虏", + weilu_effect_info: "", + weilu_effect2: "威虏", + weilu_effect2_info: "", + xinfu_zengdao: "赠刀", + xinfu_zengdao_info: "限定技,出牌阶段,你可以将装备区内的任意张牌置于一名其他角色的武将牌旁,称之为“刀”。该角色造成伤害时,其须移去一张“刀”,然后此伤害+1。", + xinfu_zengdao2: "赠刀", + xinfu_zengdao2_info: "", + xinfu_guanwei: "观微", + xinfu_guanwei_info: "每回合限一次。一名角色的出牌阶段结束时,若其本回合使用过两张以上的牌且这些牌均有花色且花色均相同,则你可以弃置一张牌,令其摸两张牌并进行一个额外的出牌阶段。", + xinfu_gongqing: "公清", + xinfu_gongqing_info: "锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", + xinfu_andong: "安东", + xinfu_andong_info: "当你受到伤害时,你可以令伤害来源选择一项:1.令你观看其的手牌并获得其中的所有红桃牌;2.防止此伤害,然后其本回合内的红桃手牌不计入手牌上限。", + xinfu_yingshi: "应势", + xinfu_yingshi_info: "出牌阶段开始时,若场上的所有角色均没有「酬」,则你可以将所有的红桃牌置于一名其他角色的武将牌旁,称之为「酬」。有「酬」的角色受到【杀】的伤害后/死亡时,伤害来源/你获得其中的一张/所有的「酬」。", + yingshi_heart: "应势", + yingshi_heart_info: "", + yingshi_die: "应势", + yingshi_die_info: "", + xinfu_duanfa: "断发", + xinfu_duanfa_info: "出牌阶段,你可以弃置任意张黑色牌,然后摸等量的牌。(每回合内限X张,X为你的体力上限)", + xinfu_youdi: "诱敌", + xinfu_youdi_info: "结束阶段开始时,你可以令一名其他角色弃置你的一张手牌,若此牌:不为黑色,你摸一张牌。不为【杀】,你获得该角色的一张牌。", + xinfu_guanchao: "观潮", + xinfu_guanchao_info: "出牌阶段开始时,你可以选择获得一项效果直到回合结束:1.当你使用牌时,若你此阶段使用过的所有牌的点数为递增,你摸一张牌;2.当你使用牌时,若你此阶段使用过的所有牌的点数为递减,你摸一张牌。", + xinfu_xunxian: "逊贤", + xinfu_xunxian_info: "每回合限一次。当你使用或打出的牌结算完成后,你可以将其对应的所有实体牌交给一名手牌数或体力值大于你的角色。", + xinfu_kannan: "戡难", + xinfu_kannan_info: "出牌阶段限X次,你可以与一名本回合内未成为过〖戡难〗目标的角色拼点。若你赢,你使用的下一张【杀】的伤害值基数+1,且你本回合内不能再发动〖戡难〗。若你没赢,其使用的下一张【杀】的伤害值基数+1。(X为你的体力值)。", + kannan_eff: "戡难", + kannan_eff_info: "", + xinfu_tushe: "图射", + xinfu_tushe_info: "当你使用非装备牌指定目标后,若你没有基本牌,则你可以摸X张牌。(X为此牌指定的目标数)", + xinfu_limu: "立牧", + xinfu_limu_info: "出牌阶段,你可以将一张♦牌当做【乐不思蜀】对自己使用,然后回复1点体力。只要你的判定区内有牌,你对攻击范围内的其他角色使用牌便没有次数和距离限制。", + xinyingshi: "应势", + xinyingshi_info: "出牌阶段开始时,若场上所有角色的武将牌上均没有“酬”,则你可以将任意张牌置于一名角色的武将牌上,称为“酬”。若如此做:当有角色使用牌对有“酬”的角色造成伤害后,其可以获得一张“酬”,并获得牌堆中所有与“酬”花色点数均相同的牌;有“酬”的角色死亡时,你获得其所有“酬”。", +}; + +export default translates; diff --git a/character/xinghuoliaoyuan/voices.js b/character/xinghuoliaoyuan/voices.js new file mode 100644 index 000000000..3fd8f54f7 --- /dev/null +++ b/character/xinghuoliaoyuan/voices.js @@ -0,0 +1,60 @@ +export default { + "#xinfu_sanwen1": "文若春华,思若泉涌。", + "#xinfu_sanwen2": "独步汉南,散文天下。", + "#xinfu_qiai1": "未知身死处,何能两相完?", + "#xinfu_qiai2": "悟彼下泉人,喟然伤心肝。", + "#xinfu_denglou1": "登兹楼以四望兮,聊暇日以销忧。", + "#xinfu_denglou2": "惟日月之逾迈兮,俟河清其未极。", + "#wangcan:die": "一作驴鸣悲,万古送葬别。", + "#xinfu_jixu1": "击虚箭射,懈敌戒备。", + "#xinfu_jixu2": "虚实难辨,方迷敌方之心!", + "#sp_taishici:die": "刘繇之见,短浅也……", + "#xinfu_guolun1": "品过是非,讨评好坏。", + "#xinfu_guolun2": "若有天下太平时,必讨四海之内才。", + "#xinfu_songsang1": "送丧至东吴,使命已完。", + "#xinfu_songsang2": "送丧虽至,吾与孝则得相交。", + "#re_jsp_pangtong:die": "我终究……不得东吴赏识。", + "#qinguo_use1": "为国勤事,体素精勤。", + "#qinguo_use2": "忠勤为国,通达治体。", + "#lvdai:die": "再也不能,为吴国奉身了。", + "#xinfu_jijun1": "集万千义军,定天下大局!", + "#xinfu_jijun2": "集民力万千,亦可为军!", + "#xinfu_fangtong1": "统领方队,为民意所举!", + "#xinfu_fangtong2": "三十六方,必为大统!", + "#re_zhangliang:die": "人公也难逃被人所杀……", + "#xinfu_weilu1": "贼人势大,需从长计议。", + "#xinfu_weilu2": "时机未到,先行撤退。", + "#xinfu_zengdao1": "有功赏之,有过罚之。", + "#xinfu_zengdao2": "治军之道,功过分明。", + "#lvqian:die": "我自泰山郡以来,百姓获安,镇军伐贼,此生已无憾!", + "#xinfu_guanwei1": "今日宴请诸位,有要事相商。", + "#xinfu_guanwei2": "天下未定,请主公以大局为重。", + "#xinfu_gongqing1": "尔辈何故与降虏交善。", + "#xinfu_gongqing2": "豪将在外,增兵必成祸患啊!", + "#panjun:die": "耻失荆州,耻失荆州啊!", + "#xinfu_andong1": "勇足以当大难,智涌以安万变。", + "#xinfu_andong2": "宽猛克济,方安河东之民。", + "#xinfu_yingshi1": "应民之声,势民之根。", + "#xinfu_yingshi2": "应势而谋,顺民而为。", + "#duji:die": "试船而溺之,虽亡而忠至。", + "#xinfu_duanfa1": "身体发肤,受之父母。", + "#xinfu_duanfa2": "今断发以明志,尚不可证吾之心意?", + "#xinfu_youdi1": "东吴已容不下我,愿降以保周全。", + "#xinfu_youdi2": "笺书七条,足以表我归降之心。", + "#zhoufang:die": "功亏一篑,功亏一篑啊。", + "#xinfu_guanchao1": "朝夕之间,可知所进退。", + "#xinfu_guanchao2": "月盈,潮起晨暮也;月亏,潮起日半也。", + "#xinfu_xunxian1": "督军之才,子明强于我甚多。", + "#xinfu_xunxian2": "此间重任,公卿可担之。", + "#yanjun:die": "著作,还……没完成……", + "#xinfu_kannan1": "俊才之杰,材匪戡难。", + "#xinfu_kannan2": "戡,克也,难,攻之。", + "#twniju1": null, + "#twniju2": null, + "#liuyao:die": "伯符小儿,还我子义!", + "#xinfu_tushe1": "非英杰不图?吾既谋之且射毕!", + "#xinfu_tushe2": "汉室衰微,朝纲祸乱,必图后福。", + "#xinfu_limu1": "米贼作乱,吾必为益州自保。", + "#xinfu_limu2": "废史立牧,可得一方安定。", + "#liuyan:die": "背疮难治,世子难继。", +}; diff --git a/character/yijiang.js b/character/yijiang.js deleted file mode 100755 index 166b66d67..000000000 --- a/character/yijiang.js +++ /dev/null @@ -1,15755 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "yijiang", - connect: true, - //connectBanned:['qinmi'], - characterSort: { - yijiang: { - yijiang_2011: ["caozhi", "yujin", "zhangchunhua", "xin_fazheng", "xin_masu", "xin_xushu", "xusheng", "lingtong", "wuguotai", "chengong", "gaoshun"], - yijiang_2012: ["wangyi", "xunyou", "zhonghui", "old_madai", "liaohua", "guanzhang", "bulianshi", "handang", "chengpu", "liubiao", "old_huaxiong", "caozhang"], - yijiang_2013: ["manchong", "guohuai", "caochong", "guanping", "liufeng", "jianyong", "yufan", "panzhangmazhong", "zhuran", "xin_liru", "fuhuanghou"], - yijiang_2014: ["hanhaoshihuan", "chenqun", "caozhen", "zhangsong", "wuyi", "zhoucang", "zhuhuan", "guyong", "sunluban", "yj_jushou", "caifuren"], - yijiang_2015: ["caoxiu", "caorui", "zhongyao", "xiahoushi", "liuchen", "zhangyi", "zhuzhi", "quancong", "sunxiu", "gongsunyuan", "guotufengji"], - yijiang_2016: ["guohuanghou", "sunziliufang", "huanghao", "liyan", "sundeng", "cenhun", "zhangrang", "liuyu"], - yijiang_2017: ["xinxianying", "jikang", "wuxian", "qinmi", "xuezong", "xushi", "caiyong", "caojie"], - yijiang_2022: ["lukai", "kebineng", "zhugeshang", "liwan", "wuanguo", "hanlong", "yj_sufei", "yj_qiaozhou"], - yijiang_2023: ["xiahoumao", "chenshi", "sunli", "feiyao"], - yijiang_2024: ["linghuyu", "yj_simafu", "yj_xuangongzhu", "xukun"], - }, - }, - character: { - xiahoumao: ["male", "wei", 4, ["tongwei", "cuguo"]], - chenshi: ["male", "shu", 4, ["qingbei"]], - sunli: ["male", "wei", 4, ["kangli"]], - feiyao: ["male", "wei", 4, ["zhenfeng"]], - wuanguo: ["male", "qun", 4, ["diezhang", "duanwan"]], - hanlong: ["male", "wei", 4, ["duwang", "cibei"]], - yj_qiaozhou: ["male", "shu", 3, ["shiming", "jiangxi"]], - yj_sufei: ["male", "wu", 4, ["shuojian"]], - liwan: ["female", "wei", 3, ["liandui", "biejun"]], - zhugeshang: ["male", "shu", 3, ["sangu", "yizu"]], - kebineng: ["male", "qun", 4, ["kousheng"]], - lukai: ["male", "wu", 4, ["lkbushi", "lkzhongzhuang"]], - xin_fazheng: ["male", "shu", 3, ["xinxuanhuo", "xinenyuan"]], - guanzhang: ["male", "shu", 4, ["fuhun"]], - wangyi: ["female", "wei", 3, ["zhenlie", "miji"]], - caozhang: ["male", "wei", 4, ["new_jiangchi"]], - guohuai: ["male", "wei", 4, ["rejingce"]], - zhangchunhua: ["female", "wei", 3, ["jueqing", "shangshi"]], - caozhi: ["male", "wei", 3, ["luoying", "jiushi"]], - caochong: ["male", "wei", 3, ["chengxiang", "renxin"]], - xunyou: ["male", "wei", 3, ["qice", "zhiyu"], ["clan:颍川荀氏"]], - xin_xushu: ["male", "shu", 3, ["xinwuyan", "xinjujian"], ["border:wei"]], - xin_masu: ["male", "shu", 3, ["olsanyao", "rezhiman"]], - zhuran: ["male", "wu", 4, ["danshou"]], - xusheng: ["male", "wu", 4, ["xinpojun"]], - wuguotai: ["female", "wu", 3, ["ganlu", "buyi"]], - lingtong: ["male", "wu", 4, ["xuanfeng"]], - liubiao: ["male", "qun", 3, ["rezishou", "zongshi"]], - yufan: ["male", "wu", 3, ["zhiyan", "zongxuan"]], - chengong: ["male", "qun", 3, ["mingce", "zhichi"]], - bulianshi: ["female", "wu", 3, ["old_anxu", "zhuiyi"]], - handang: ["male", "wu", 4, ["gongji", "jiefan"]], - fuhuanghou: ["female", "qun", 3, ["qiuyuan", "zhuikong"]], - zhonghui: ["male", "wei", 4, ["quanji", "zili"], ["clan:颍川钟氏"]], - jianyong: ["male", "shu", 3, ["qiaoshui", "jyzongshi"]], - old_madai: ["male", "shu", 4, ["mashu", "qianxi"]], - liufeng: ["male", "shu", 4, ["xiansi"]], - manchong: ["male", "wei", 3, ["junxing", "yuce"]], - chenqun: ["male", "wei", 3, ["pindi", "faen"]], - sunluban: ["female", "wu", 3, ["chanhui", "jiaojin"]], - guyong: ["male", "wu", 3, ["shenxing", "olbingyi"]], - caifuren: ["female", "qun", 3, ["qieting", "xianzhou"]], - yj_jushou: ["male", "qun", 3, ["jianying", "shibei"]], - zhangsong: ["male", "shu", 3, ["qiangzhi", "xiantu"]], - zhuhuan: ["male", "wu", 4, ["fenli", "pingkou"]], - xiahoushi: ["female", "shu", 3, ["qiaoshi", "yanyu"]], - - panzhangmazhong: ["male", "wu", 4, ["duodao", "anjian"]], - zhoucang: ["male", "shu", 4, ["xinzhongyong"]], - guanping: ["male", "shu", 4, ["longyin"]], - liaohua: ["male", "shu", 4, ["dangxian", "fuli"]], - chengpu: ["male", "wu", 4, ["lihuo", "chunlao"]], - gaoshun: ["male", "qun", 4, ["xinxianzhen", "jinjiu"]], - caozhen: ["male", "wei", 4, ["xinsidi"]], - wuyi: ["male", "shu", 4, ["benxi"], ["clan:陈留吴氏"]], - hanhaoshihuan: ["male", "wei", 4, ["shenduan", "yonglve"]], - - caorui: ["male", "wei", 3, ["huituo", "mingjian", "xingshuai"], ["zhu"]], - caoxiu: ["male", "wei", 4, ["qianju", "qingxi"]], - zhongyao: ["male", "wei", 3, ["huomo", "zuoding"], ["clan:颍川钟氏"]], - liuchen: ["male", "shu", 4, ["zhanjue", "qinwang"], ["zhu"]], - zhangyi: ["male", "shu", 4, ["wurong", "shizhi"]], - sunxiu: ["male", "wu", 3, ["yanzhu", "xingxue", "xinzhaofu"], ["zhu"]], - zhuzhi: ["male", "wu", 4, ["xinanguo"]], - quancong: ["male", "wu", 4, ["yaoming"]], - gongsunyuan: ["male", "qun", 4, ["huaiyi"]], - guotufengji: ["male", "qun", 3, ["jigong", "shifei"]], - - xin_liru: ["male", "qun", 3, ["xinjuece", "xinmieji", "xinfencheng"]], - - guohuanghou: ["female", "wei", 3, ["jiaozhao", "danxin"]], - liuyu: ["male", "qun", 2, ["xinzhige", "xinzongzuo"]], - liyan: ["male", "shu", 3, ["dcduliang", "fulin"]], - sundeng: ["male", "wu", 4, ["kuangbi"]], - - cenhun: ["male", "wu", 4, ["jishe", "lianhuo"]], - huanghao: ["male", "shu", 3, ["qinqing", "huisheng"]], - zhangrang: ["male", "qun", 3, ["taoluan"], ["sex:male_castrated"]], - sunziliufang: ["male", "wei", 3, ["guizao", "jiyu"]], - - xinxianying: ["female", "wei", 3, ["zhongjian", "caishi"]], - wuxian: ["female", "shu", 3, ["fumian", "daiyan"], ["clan:陈留吴氏"]], - xushi: ["female", "wu", 3, ["wengua", "fuzhu"]], - caojie: ["female", "qun", 3, ["shouxi", "huimin"]], - - caiyong: ["male", "qun", 3, ["bizhuan", "tongbo"]], - jikang: ["male", "wei", 3, ["qingxian", "juexiang"]], - qinmi: ["male", "shu", 3, ["jianzheng", "zhuandui", "tianbian"]], - xuezong: ["male", "wu", 3, ["funan", "xinjiexun"]], - - old_huaxiong: ["male", "qun", 6, ["shiyong"]], - - yujin: ["male", "wei", 4, ["rezhenjun"], []], - - linghuyu: ["male", "wei", 4, ["xvzhi"]], - yj_simafu: ["male", "wei", 3, ["beiyu", "duchi"]], - yj_xuangongzhu: ["female", "wei", 3, ["yjqimei", "yjzhuiji"]], - xukun: ["male", "wu", 4, ["fazhu"]], - }, - characterIntro: { - linghuyu: "令狐愚(?-249年),字公治,太原人。曹魏时期将领, 原名浚。太尉王凌的外甥,弘农太守令狐邵之侄。黄初年间出任和戎护军,后任曹爽府长史、兖州刺史。嘉平年间,与王凌一起密谋废除曹芳,共立楚王曹彪,事未行而病卒。嘉平三年(251年),事泄,王凌服毒自尽,与此事相连者,皆夷三族。王凌及令狐愚被开棺暴尸三日, 亲土埋之。", - xukun: "徐琨,字号不详,吴郡富春县(今浙江省杭州市富阳区)人。三国时期吴国开国功臣,武烈皇帝孙坚的外甥,吴大帝孙权的表兄弟,徐夫人的生父。出身吴郡豪门,最初担任郡吏。投靠舅舅孙坚,参与征伐董卓有功,拜偏将军。孙坚逝后,追随孙策,攻讨扬州刺史刘繇,采取奇袭作战方式,占领丹阳郡,为孙策开拓江东事业奠定基础,领丹杨太守。适逢吴景归附江东,改授督军中郎将。孙权嗣位后,平定庐江太守李术叛乱,击破皖城,册封广德侯,加号平虏将军。后来,随孙权征讨黄祖,身中流矢,不治而亡。", - sunli: "孙礼(?—250年),字德达,涿郡容城县人。三国时期曹魏名将。曹操平定幽州后,孙礼被征召为司空军谋掾。后被任命为河间郡丞,升至荥阳都尉。后孙礼被调为鲁国相。历任山阳、平原、平昌、琅邪郡太守。从大司马曹休在夹石征吴,孙礼谏其不可深入作战,曹休不听遂战败。后孙礼调任阳平郡太守。明帝时入为尚书,受遗诏拜大将军长史,加散骑常侍。曹爽令孙礼出任扬州刺史,加管伏波将军,赐爵关内侯。孙礼率兵御东吴军队,奋不顾身,贼众乃退。朝廷赐绢七百匹,孙礼皆以绢付亡者家,无以入身。后征拜少府,出为荆州刺史,迁冀州牧。爽见礼奏,大怒,劾礼怨望,结刑五岁。在家期年,众人多以为言,除城门校尉。出为并州刺史,加振武将军,使持节,护匈奴中郎将。爽诛后,入为司隶校尉。迁司空,封大利亭侯,邑一百户。嘉平二年(250年),孙礼去世,谥号景侯。其孙孙元继承爵位。《全三国文》录有孙礼文一篇《清河平原争界案图宜属平原疏》。陈寿评曰“孙礼刚断伉厉”。", - xiahoumao: "夏侯楙,字子林,沛国谯县(今安徽省亳州市)人,曹魏名将夏侯惇之子,三国时期魏国官员、将领,其妻为曹操之女清河公主。在魏国历任侍中、尚书、安西将军、镇东将军,假节,封列侯。曾一度驻守曹魏都城长安,但蜀汉北伐后就被调离。", - chenshi: "陈式,生卒年不详,三国时期蜀汉将领。最初为刘备军中重要的基层指挥官,后成长为高级将领。在诸葛亮第三次北伐期间,在诸葛亮的军事指挥下攻克了魏国的武都、阴平二郡。", - feiyao: "费曜(生卒年不详),又作费瑶、费繇,三国时期曹魏将领。魏初,参与平河西之乱。明帝时官任后将军,跟随曹真、司马懿多次对抗蜀汉。《三国演义》中作“费耀”,随曹真和诸葛亮的第二次北伐军作战。怀疑姜维作内应是假,自告奋勇替曹真出征,结果被事先埋伏的姜维包围,自尽而死。", - wuanguo: "武安国,历史小说《三国演义》中人物,是北海太守孔融的部将,兵器为一把长柄铁锤,重五十余斤。诸侯伐董时,双方于虎牢关相峙,吕布撰战,一合而斩穆顺,关东军大惊。北海太守孔融部将武安国,使铁锤飞马而出,吕布挥戟拍马来迎,战到十余合,一戟砍断安国手腕,安国弃锤于地而走,八路军兵齐出,这才救了他性命。", - hanlong: "韩龙,汉末三国时期刺客。韩龙使得魏国北方边得到数十年的安宁,减少魏国的军政压力,得以休养生息。太和二年,豫遣译夏舍诣比能女婿郁筑鞬部,舍为鞬所杀。其秋,豫将西部鲜卑蒲头、泄归泥出塞讨郁筑鞬,大破之。还至马城,比能自将三万骑围豫七日。上谷太守阎志,阎柔之弟也,素为鲜卑所信。志往解喻,即解围去。后幽州刺史王雄并领校尉,抚以恩信。比能数款塞,诣州奉贡献。至青龙元年,比能诱纳步度根,使叛并州,与结和亲,自勒万骑迎其累重於陉北。并州刺史毕轨遣将军苏尚、董弼等击之,比能遣子将骑与尚等会战於楼烦,临陈害尚、弼。至三年中,雄遣勇士韩龙刺杀比能,更立其弟。", - liwan: "李婉(生卒年不详),字淑文,里居不详,贾充之妻,魏晋时期才女,约景元年间(260年前后)在世。著有《典戒》。《隋书·经籍志》载李婉有文集一卷,今失传。", - zhugeshang: "诸葛尚(244年2月-263年11月),琅琊阳都(今山东沂南)人,诸葛瞻长子,诸葛亮之孙。诸葛尚博览兵书且精通武艺。炎兴元年(公元263年),出任先锋,抗拒魏国大将邓艾,与其父诸葛瞻同战死于绵竹,时年十九岁。", - kebineng: "轲比能(?~235年),为中国三国时期的鲜卑首领之一。轲比能出身鲜卑支部,因他作战勇敢,执法公平,不贪财物,所以被鲜卑民众推举为大人。轲比能因其部落近塞,所以他抓住有利条件积极学习汉族先进技术和文化,促进了鲜卑族的进步和北方的民族融合。轲比能统率下的部众,战守有法,战斗力相当强大。自曹操北征后向曹氏进贡表示效忠。魏文帝时,轲比能受封附义王。轲比能在进行部落统一战争时,受魏国干涉,受沉重打击,于是对魏怀贰,献书魏帝表忠,以麻痹魏庭,使之放松警惕。此后,轲比能的部众变得强盛,控弦十余万骑,为害魏国边境。每次钞略得财物,轲比能都公开透明地均平分配,所以得部众死力,各部大人都敬畏之。实力强大后,他继续部落统一战争,于是威行诸部落,建立起强大的鲜卑族政权。深感威胁的魏国幽州刺史王雄派刺客韩龙将其刺杀,其政权立刻崩溃,鲜卑民族再次陷入混战。", - lukai: "陆凯(198-269年),字敬风,吴郡吴县(今江苏省苏州市)人。三国时期吴国重臣,丞相陆逊的族侄,大司马陆抗的族兄。黄武年间,举孝廉出身,曾任永兴县长、诸暨县长,颇有治绩。拜建武都尉、儋耳太守,与聂友率军讨伐朱崖和儋耳,迁建武校尉。五凤二年(255年),讨斩零陵山贼陈毖,拜偏将军、巴丘督,册封都乡侯。迁武昌右部督,随军进入寿春。后拜荡魏将军,加号绥远将军。吴景帝孙休继位,拜征北将军、假节、领豫州牧。孙皓即位,迁任镇西大将军,都督巴丘,又领荆州牧,进封嘉兴侯。宝鼎元年(266年),迁左丞相。以正直及屡次劝谏孙皓而闻名。建衡元年(269年),去世,时年七十二。", - caozhi: "字子建,沛国谯人,三国曹魏著名文学家,建安文学代表人物。魏武帝曹操之子,魏文帝曹丕之弟,生前曾为陈王,去世后谥号“思”,因此又称陈思王。南朝宋文学家谢灵运更有“天下才有一石,曹子建独占八斗”的评价。王士祯尝论汉魏以来二千年间诗家堪称“仙才”者,曹植、李白、苏轼三人耳。", - gaoshun: "中国东汉末年将领,吕布帐下中郎将。史载高顺为人清白有威严,不好饮酒,所统率的部队精锐非常,号称“陷阵营”。屡进忠言于吕布,吕布虽知其忠而不能用。曹操击破吕布后,高顺被曹操所杀。", - chengong: "字公台,东汉末年吕布帐下谋士,东郡东武阳人。性情刚直,足智多谋,年少时与海内知名之士相互结交。192年,陈宫等人主张曹操接任兖州牧。但此后陈宫因曹操杀害边让而与曹操反目,并游说张邈等人背叛曹操迎吕布入兖州,辅助吕布攻打曹操。吕布战败后,随吕布等一同被曹操所擒,决意赴死。", - lingtong: "字公绩,吴郡馀杭人,三国时期吴国名将。凌操之子,官至偏将军。", - masu: "字幼常,襄阳宜城人,三国时期蜀汉大臣,侍中马良之弟。初以荆州从事跟随刘备取蜀入川,曾任绵竹、成都令、越嶲太守。诸葛亮北伐时因作战失误而失守街亭,因而被诸葛亮所斩。", - wuguotai: "吴国太,小说《三国演义》中的人物,不见于正史记载。在小说中,吴国太被描述为孙坚的次妻,孙坚正妻武烈皇后(小说中写作吴太夫人)的妹妹,孙朗、孙仁(孙尚香)的母亲。", - xusheng: "字文向,琅邪莒县人。三国时期吴将。徐盛最初因讨伐山贼有功而被加为中郎将,后于濡须口之战中表现出色,得到孙权的赞赏。魏文帝曹丕伐吴时,徐盛以疑城之计退去魏军。", - yujin: "字文则,泰山钜平人。三国时期曹魏武将。本为鲍信部将,后属曹操,曹操称赞他可与古代名将相比。然而在建安二十四年的襄樊之战中,于禁在败给关羽后投降,致使一代名将晚节不保。", - zhangchunhua: "西晋宣穆皇后张春华(189-247),河内平皋(今河南温县)人。她是晋宣帝司马懿之妻,晋景帝司马师、晋文帝司马昭的母亲。后被追尊为皇后。", - fazheng: "字孝直,本为刘璋部下,刘备围成都时劝说刘璋投降,而后又与刘备进取汉中,献计将曹操大将夏侯渊斩首。法正善奇谋,深受刘备信任和敬重。", - xushu: "字元直,与司马徽、诸葛亮等人为友。先化名单福仕官于新野的刘备,后因曹操囚禁其母而不得不弃备投操,临行前向刘备推荐诸葛亮之才。入曹营后,一言不发,不曾为曹操进献过一计半策。后人形容徐庶“身在曹营心在汉”。", - caozhang: "字子文,是曹操与武宣卞皇后所生第二子,曹丕之弟,曹植之兄,曹魏任城王。曹彰武艺过人,曹操问诸子志向时自言“好为将”,因此得到曹操的赞赏。其胡须黄色,被曹操称为“黄须儿”。", - xunyou: "字公达,颍川颍阴人。东汉末年曹操的五谋臣之一,荀彧从子,被曹操称为“谋主”。官至尚书令。正始五年被追谥为敬侯。", - liaohua: "本名淳,字元俭,襄阳中卢(今湖北襄樊)人。三国时期蜀国后期将领,以勇敢果断著称。廖化是三国时代中经历了魏、蜀、吴整个兴衰过程极少数人中的一个,与严颜、黄忠共称为蜀汉三老将。", - bulianshi: "步夫人(?-238),讳练师,临淮淮阴人。东吴丞相步骘同族,吴大帝孙权之妃,在孙权众夫人中最受孙权的宠爱(宠冠后庭),生有二女:孙鲁班、孙鲁育。赤乌元年卒,追封为皇后,葬于蒋陵。", - chengpu: "字德谋,右北平土垠人。历仕孙坚、孙策、孙权三任君主。孙策死后,他与张昭等人共同辅佐孙权,并讨伐江东境内的山贼,功勋卓著。被人们尊称为“程公”。", - handang: "字义公,辽西令支(今河北迁安)人,吴国将领。韩当因为长于弓箭、骑术并且膂力过人而被孙坚赏识,追随他四处征伐周旋,数次冒险犯难,攻陷敌人、擒拿俘虏。对江东基业的逐渐稳固和吴国的建立有着重要影响。", - liubiao: "刘表,字景升,山阳郡高平(今山东微山)人。东汉末年名士,汉室宗亲,荆州牧,汉末群雄之一。", - zhonghui: "字士季。魏名将,太傅钟繇之子。公元263年,他与邓艾带兵攻打蜀国,最终导致蜀国灭亡。之后钟会设计害死邓艾,联合姜维准备自立,最终因部下反叛失败,与姜维一同死于兵变。", - wangyi: "益州刺史赵昂之妻,赵英、赵月之母。马超作乱凉州时,王异协助丈夫守城,多有功勋,自马超攻冀城至祁山坚守,赵昂曾出奇计九条,王异皆有参与。", - guanzhang: "关兴,名将关羽之子,继承了父亲汉寿亭侯的爵位。年少时即受诸葛亮器重,在蜀汉担任侍中、中监军之职,后在夷陵之战中报了杀父之仇。张苞,张飞的长子,使用父亲的家传蛇矛为兵器,勇猛剽悍不弱其父。", - madai: "名将马超的从弟。早年他曾经从曹操手中死里逃生,后跟随马超大战曹操。后在诸葛亮病逝后受杨仪派遣斩杀了蜀将魏延。曾率领军队出师北伐,被魏将牛金击败而退还。", - caochong: "字仓舒,曹操之子。从小聪明仁爱,与众不同,深受曹操喜爱。留有“曹冲称象”的典故。曹操几次对群臣夸耀他,有让他继嗣之意。可惜曹冲在建安十三病逝,年仅13岁。", - guohuai: "魏国名将,夏侯渊战死时郭淮收集残兵,与杜袭共推张郃为主将而得以稳定局势。曹丕称帝后,赐郭淮爵关内侯,又任镇西长史。诸葛亮伐魏时,郭淮料敌准确,多立战功,而后亦曾击退姜维。", - manchong: "初在曹操手下任许县县令,掌管司法,以执法严格著称;转任汝南太守,开始参与军事,曾参与赤壁之战。后关羽围攻樊城,满宠协助曹仁守城,劝阻了弃城而逃的计划,成功坚持到援军到来。曹丕在位期间,满宠驻扎在新野,负责荆州侧的对吴作战。曹叡在位期间,满宠转任到扬州,接替曹休负责东侧对吴作战,屡有功劳。", - guanping: "关平是关羽在战乱中所收之义子。关羽脱离曹军后,与刘备于关定家中重逢,关定欲使年仅十八岁的关平随关羽同行,刘备便主张让关羽与关平结为义父子。自此后关平随侍在关羽身边,一生东征西讨。他武勇过人,不逊乃父,曾跟随刘备出征西川,立下战功,后来又与曹魏猛将庞德大战三十回合,不分胜负。", - jianyong: "简雍为刘备同乡,年少时与刘备相识。黄巾之乱时,刘备加入对抗黄巾军的战争,简雍便跟随他奔走。常作为谈客,往来使命,刘备围成都时简雍作为刘备使臣成功劝说刘璋投降。简雍擅于辩论、议事。性情简单直接、不拘小节。", - liufeng: "刘备义子。性格刚猛,气力过人。随赵云、张飞等扫荡西川,颇有战功,而后又统领孟达攻取上庸,深为刘备信任。但是后来关羽北伐曹魏,多次要求刘封起兵相助,刘封不从。而后又侵凌孟达,迫其降魏。孟达与魏徐晃共袭刘封,并劝刘封投降,刘封不降,又遭部下叛变,败归成都。刘备在诸葛亮的建议下赐死刘封,刘封自裁,刘备深表痛惜。", - panzhangmazhong: "马忠为潘璋部将。于麦城之战中设伏擒获关羽及关平。刘备伐吴时,马忠随潘璋等往拒,突袭射伤蜀将黄忠,导致黄忠阵亡。不久,潘璋为关兴所杀,马忠领兵围击,击退张苞援军。后降将糜、傅发动兵变,刺杀了马忠,将首级献于刘备。", - yufan: "虞翻初在会稽被太守王朗任命为功曹,曾劝谏王朗躲开孙策未果。后孙策占江东仍任命他为功曹。吕蒙袭取荆州时,虞翻提醒其躲过了埋伏,成功占领城池。后因为直言进谏被孙权发配到交州。", - zhuran: "吴国著名将领,吕蒙白衣渡江取荆州,朱然协助潘璋捉住了关羽。黄武元年,刘备兵伐东吴,朱然与孙桓抵抗刘备大军。后又参加夷陵之战,追击刘备,被前来接应的赵云一枪刺死。", - fuhuanghou: "执金吾伏完之女,汉献帝的皇后,后因怨恨曹操诛董承,与父伏完密谋曹操,事情泄漏,曹将伏皇后禁闭冷宫逼其自缢,所生二位皇子亦被鸩杀。", - liru: "董卓的首席谋士,为董卓所亲信,大小事宜皆与其商议。董卓趁乱进京、说降吕布、废立皇帝、迁都长安等举动,均离不开李儒的参谋之功,并奉命毒杀皇帝刘辩。李傕被曹操击败后,李儒从此不知所踪,消失在历史长河中。", - caozhen: "曹操族子,官至大将军、大司马。其父为曹操招募人马时被州郡所杀,曹操因怜悯曹真少年丧父而待其如亲子一般,因赞赏曹真的勇猛而让他率领虎豹骑。曹真在镇守曹魏西北边境时表现突出,魏文帝时期督众将大破羌胡联军,平定河西;魏明帝时期屡次对抗诸葛亮的北伐。", - hanhaoshihuan: "韩浩和史涣都以忠勇著称,两人皆是曹操心腹将领,共同掌管禁兵。", - chenqun: "陈群一直位居要职,先后受曹操、曹丕托孤,成为魏国重臣,官至司空。其子陈泰,亦是魏国后期名将。最大的贡献为创立了九品中正制,为后期的人才选拔和管理打好了基础。", - wuyi: "初为益州牧刘璋的部将,刘备进攻益州时,泠苞在雒城大败,吴懿自告奋勇,领兵前往救援。不料被赵云和张飞生擒,吴懿于是归降。刘备自称汉中王,迎娶吴懿之妹。诸葛亮出师北伐,吴懿以左将军、高阳侯的身份跟随出征,屡立战功。诸葛亮逝世后,吴懿随姜维一并镇守汉中。", - zhoucang: "原为张宝部将。关羽千里走单骑时,周仓投降关羽,成为了关羽的贴身护卫。建安十六年(公元211年),刘备攻打成都时,周仓跟随关羽镇守荆州。关羽水淹七军时,周仓曾生擒魏军的立义将军庞德,关羽被孙权斩首之后,周仓在麦城大哭失声,拔剑自刎而死。", - zhangsong: "刘璋的部下,长相丑陋但有过目不忘的本领。张松奉命出使许都被曹操赶出,归蜀时为刘备所厚待,于是将西川地理图献予刘备,劝刘备取益州,愿为内应,并派好友孟达、法正帮助刘备。", - sunluban: "孙权之女。孙鲁班与孙权二子孙和不睦。孙权长子孙登死后,孙和被立为太子。孙鲁班向孙权进谗言废孙和太子之位,孙和被废后忧愤而死。", - zhuhuan: "字休穆,吴郡吴县(今江苏苏州)人,吴国名将,官至前将军、青州牧,假节,封为嘉兴侯。有一子朱异。", - guyong: "为蔡邕之徒。其为人少言语,不饮酒,严厉正大,被张纮推荐仕于孙权。孙权任命他为会稽郡丞,行太守事,后不断升迁,官至吴国丞相。顾雍为官,多进良言,有功于吴。", - jushou: "袁绍帐下谋士。史载他“少有大志,擅于谋略”。曾为冀州别驾,举茂才,并当过两次县令。后来又当韩馥别驾,被韩馥表为骑都尉。袁绍占据冀州后任用沮授为从事。经常对袁绍提出良策,但很多时候袁绍并不听从。官渡之战时袁绍大败,沮授未及逃走,被曹操所获,因拒降被曹操处死。", - caifuren: "原是刘表的小妾,正室死后,成为了刘表的后妻。因刘琮娶了自己的侄女所以对其偏爱有加。刘备客居荆州时险些受其所害。刘表死后为了让刘琮即位不惜献州于曹操。", - caorui: "魏文帝曹丕长子,曹魏第二位皇帝。在位期间指挥曹真、司马懿等人成功防御了吴、蜀的多次攻伐,并且平定鲜卑,攻灭公孙渊,颇有建树。", - caoxiu: "曹操族子,曹操大宴铜雀台之时,射箭夺袍。曹休随曹操四处征伐,在攻蜀汉中之战,伐吴濡须口之战均有登场,曾放冷箭射倒凌统的马匹,后又协助夏侯惇平息洛阳纵火叛乱,总管御林兵马,协助曹丕代汉。", - zhongyao: "初为长安郡守,马超反叛时,引军攻打长安,钟繇率军防卫。后城破,钟繇从东门弃城而走,退守潼关。后奉献帝令繇草拟诏令,册立曹操为魏王,曹操以钟繇为相国。明帝即位时,钟繇为太傅。诸葛亮北伐,钟繇举荐司马懿前往抵御。", - liuchen: "刘禅第五子,自幼聪明,英敏过人。魏军兵临城下时,刘禅准备投降,刘谌劝阻刘禅投降不成后悲愤不已,遂自杀于昭烈庙。", - xiahoushi: "夏侯渊从女,夏侯霸从妹,出城拾柴时被张飞所得,取其为妻。后生有二女,其中一人为星彩。", - zhangyi: "曾随诸葛亮南征孟获,七擒孟获的战斗中立下赫赫战功,与祝融夫人单挑。诸葛亮病死五丈原,告诉姜维张嶷忠贞勇猛,经验丰富,是可以依靠的武将,后于征伐魏国时为掩护姜维撤退阵亡。", - sunxiu: "孙权第六子,孙綝发动政变罢黜孙亮后,迎立孙休为帝。后孙綝专权,孙休遣使丁奉等人将其诛杀。孙休在位期间,颁布良制,嘉惠百姓,促进了东吴的繁荣。", - zhuzhi: "孙坚旧将,朱然嗣父,孙坚阵亡后,孙策附袁术,朱治、吕范为之定计,用玉玺向袁术借兵夺取江东。孙策平定东路后,任命朱治为吴郡太守,收军返回江东。后来赤壁之战,大都督周瑜令朱治、吕范为四方巡警使,催督六郡官军。", - quancong: "吴国名将,孙策进兵江东时归顺之,深得孙权赏识,孙权甚至将孙鲁班许配之。", - gongsunyuan: "辽东太守公孙度之孙,辽东割据首领。趁魏、吴骚乱之际自称燕王,发动叛乱,与魏对抗。败给司马懿率领的讨伐大军,被围困后乞降不被接受,与子修在欲出城逃跑时被斩杀。", - guotufengji: "两人均是袁绍帐下谋士。曾联手献计,利用公孙瓒攻击韩馥,又劝说韩馥请袁绍抵挡公孙瓒,终替袁绍拿下冀州。官渡之战期间,两人进谗逼反张郃高览,逼死田丰。使得袁绍的实力大损。", - guohuanghou: "明元郭皇后(并非郭女王),在三国志有正传。曹叡夫人,曹丕的儿媳妇,曹芳,曹髦,曹奂三朝太后,是唯一经历了曹魏全部皇帝时代的贵族女性。曹魏后三帝时期,由于皇帝年少,太后与重臣一同处理政务。史书上对郭皇后有两种截然不同的记载,一种是曹芳被废和曹髦死后郭太后发诏书斥责他们不配人君,另一种却提及曹芳被夺权期间,太后与曹芳相拥而泣,曹髦讨伐司马昭前,曾向太后禀报。", - liyan: "字正方,蜀汉重臣。初为刘表部下,曹操入主荆州时,李严西奔入蜀。刘备入川,李严率众投降,深得刘备器重,受命与诸葛亮、法正等人一同编制《蜀科》,又率军平定了蜀中盗贼。白帝城托孤,与诸葛亮共受遗诏同扶幼主。其人性格矜高难近,终因督粮不利且谎报实情而被流放,后在当地去世。", - sundeng: "字子高,孙权长子。孙权称帝后其被立为太子,受诸葛恪等人辅佐。其人性情温和而能礼贤下士,加之爱民如子,因此深受爱戴。曾劝服孙权在孙虑之死时节哀,并劝谏孙权勿用吕壹苛政。后不幸早逝,临终前上书建言,推荐了多位良臣。其亡故令孙权极为悲伤,也为南鲁党争的祸乱埋下了伏笔。", - liuyu: "伯安,幽州牧,汉室宗亲。在幽州两度任职,颇有威望。张纯、张举叛乱,刘虞恩威并施将其平定,又鼓励农商,大大改善了当地经济民生,青徐二州流民纷纷前来避难。后坚拒袁绍等人立其为帝的请求,派兵迎接献帝,却为袁术所扣,并因此事激化了与公孙瓒的矛盾,最终被击败,为其所害。", - cenhun: "岑昏为宦官,官列中常侍,孙皓即位后得到宠幸。280年,晋龙骧将军王濬率军伐吴,岑昏建议以铁锁链封锁长江,阻挡晋军进攻。王濬以火船烧锁链破其计,沿途东吴将士或死或降。群臣上奏东吴衰败之因在于岑昏,将他与蜀汉的黄皓并列为误国之奸臣。", - sunziliufang: "孙资在曹操手下历任县令,参丞相军事;刘放曾有劝王松归顺曹操之举,为曹操所欣赏,遂招为司空府官,又外放历任几处县令。魏国初建之际,孙资与刘放俱任秘书郎。曹丕继位后,二人一同掌握机密。曹睿病危时,二人力荐曹爽,又推荐招回司马懿辅政。最后,曹睿独召曹爽、司马懿、刘放、孙资同受诏命,而免去曹宇、夏侯献、曹肇、秦朗的官职。", - huanghao: "宦官。为后主刘禅所宠,专秉朝政。黄皓与大将军姜维不睦,维启后主杀之,后主不从。皓阴以心腹阎宇替维。景耀六年,蜀亡,邓艾预欲杀之,皓贿赂左右得免。及后主迁洛阳,皓为司马昭凌迟处死。", - zhangrang: "汉中常侍。同赵忠、曹节、段珪等为“十常侍”,为灵帝所宠。让等专权乱政、卖官索财,朝野皆痛恨之。郎中张钧上书奏请诛杀十常侍,帝不允,让等阴杀钧。及灵帝崩,大将军何进欲杀让等,让阴结何太后,招进入宫,斩杀之。部将袁绍引兵攻让,让等劫帝走河上。追急,让投水自尽。", - jikang: "嵇康(224年-263年,一作223年-262年),字叔夜。谯国铚县(今安徽省濉溪县)人。三国时期曹魏思想家、音乐家、文学家。
    嵇康幼年聪颖,博览群书,广习诸艺,又喜爱老庄学说。身长七尺八寸,容止出众。后娶魏武帝曹操曾孙女长乐亭主为妻,拜郎中,调中散大夫,世称“嵇中散”。后隐居不仕,屡拒为官。因得罪司隶校尉钟会,遭其构陷,而被掌权的大将军司马昭处死,时年四十岁。", - xinxianying: "辛氏(191年—269年),字宪英,祖籍陇西,颍川阳翟(今河南禹州)人。魏晋时期著名才女,曹魏侍中辛毗之女,卫尉羊耽之妻。辛宪英聪朗有才鉴,曾劝弟辛敞尽忠职守,预言钟会将会叛乱。泰始五年(公元269年),辛宪英逝世,享年七十九岁。", - wuxian: "穆皇后吴氏(?—245年),陈留(今河南开封)人,车骑将军吴懿之妹,三国时期蜀汉昭烈帝刘备的皇后。
    吴氏早年丧父,其父生前与刘焉交情深厚,所以全家跟随刘焉来到蜀地。后刘焉听相面者说吴氏有大贵之相,于是为儿子刘瑁迎娶吴氏。刘瑁死后,吴氏成为寡妇。
    建安十九年(214年),刘备平定益州,纳吴氏为夫人。建安二十四年(219年),刘备自称汉中王,立吴氏为汉中王后。章武元年(221年),刘备称帝,建立蜀汉,立吴氏为皇后。章武三年(223年),刘备去世,太子刘禅即位,尊嫡母吴氏为皇太后。延熙八年(245年),吴氏去世,谥号穆皇后,葬入刘备的惠陵。", - qinmi: "秦宓(?-226年),字子敕。广汉郡绵竹县(今四川德阳北)人。三国蜀汉时大臣、学者。秦宓善舌辩。早年仕于益州牧刘璋麾下,后降刘备。刘备伐吴时,秦宓劝阻,刘备大怒,欲杀秦宓。因诸葛亮及时求情,才保住性命,仅被下狱,后被释放,拜左中郎将、长水校尉。吴蜀同盟后,孙权派张温至成都回访。酒宴之上,秦宓与张温舌战,说得张温无言以对。后官至大司农。建兴四年(226年),秦宓病逝。", - xushi: "徐氏,孙权之弟孙翊的妻子,著名烈女。孙翊的部下妫览、戴员买通家将边鸿将孙翊杀死,并将全部罪责推给边鸿,又谋杀了前来查问的太守孙河。徐夫人一面用美人计色诱妫览、戴员,令其放松警惕;一面对孙翊生前亲信孙高、傅婴说明真相并晓以大义,最终成功地在内室中将杀夫凶手妫览、戴员诛杀。", - xuezong: "薛综(?―243年),字敬文,沛郡竹邑(今安徽濉溪)人,三国时期吴国名臣。少时避乱至交州,师从刘熙。士燮归附孙权,召其为五官中郎将,出任合浦、交阯太守。后从征至九真,回朝任谒者仆射。232年,升任尚书仆射。240年,改任选曹尚书。242年,担任太子少傅,兼任选部职任。243年,薛综去世。薛综是当时名儒,著有诗赋难论数万言,集为《私载》,并著有《五宗图述》、《二京解》。", - caiyong: "蔡邕(133年-192年),字伯喈。陈留郡圉县(今河南杞县南)人。东汉时期名臣,文学家、书法家,才女蔡文姬之父。蔡邕早年拒朝廷征召之命,后被征辟为司徒掾属,任河平长、郎中、议郎等职,曾参与续写《东观汉记》及刻印熹平石经。后因罪被流放朔方,几经周折,避难江南十二年。董卓掌权时,强召蔡邕为祭酒。三日之内,历任侍御史、治书侍御史、尚书、侍中、左中郎将等职,封高阳乡侯,世称“蔡中郎”。董卓被诛杀后,蔡邕因在王允座上感叹而被下狱,不久便死于狱中,年六十。", - caojie: "曹节(196年―260年),沛国谯县(今安徽亳州)人,汉献帝刘协第二任皇后,魏武帝曹操的女儿。建安十八年(213年),曹操将女儿曹宪、曹节、曹华三姐妹同时入宫中,封为夫人。建安十九年(214年),并封为贵人。曹操废掉汉献帝第一位皇后伏寿,将她囚禁而死。曹操要汉献帝立曹节为皇后,汉献帝只得依从。建安二十五年(220年),曹操去世,曹丕袭封魏王位。曹丕授意华歆去逼汉献帝让位。曹节怒斥华歆,华歆只好退出宫去。第二天又逼汉献帝将帝位禅让给曹丕。并以武力威胁,向曹节索要玺印,曹节无奈,将玺印掷于栏板之下。面对曹丕篡位,她极为愤怒,高喊:“老天有眼,决不让你长久!”汉献帝被废为山阳公,曹节为山阳公夫人。景元元年(260年),曹节病逝,仍以汉朝礼仪合葬于献帝的禅陵,谥号献穆皇后。", - }, - perfectPair: { - wuguotai: ["sunjian", "sunshangxiang"], - zhangchunhua: ["simayi"], - caozhi: ["zhenji"], - xunyou: ["xunyu"], - xushu: ["liubei"], - lingtong: ["ganning"], - chengong: ["lvbu"], - bulianshi: ["sunquan"], - fuhuanghou: ["liuxie"], - sunluban: ["quancong"], - caifuren: ["liubiao"], - xiahoushi: ["zhangfei"], - zhoucang: ["guanyu"], - guanping: ["guanyu"], - sundeng: ["sunquan", "zhoufei"], - liru: ["dongzhuo"], - liuchen: ["liushan"], - yujin: ["xiahoudun"], - fazheng: ["liubei"], - zhonghui: ["jiangwei"], - }, - skill: { - //一将2024 - //令狐愚 - xvzhi: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return ( - game.countPlayer(target => { - return lib.skill.xvzhi.filterTarget(null, player, target); - }) > 1 - ); - }, - filterTarget(card, player, target) { - const stat = player.getStat("xvzhi"); - return target.countCards("h") && (!stat || !stat.includes(target)); - }, - selectTarget:2, - usable: 1, - multiline: true, - multitarget: true, - async content(event, trigger, player) { - const targets = event.targets; - if (!player.getStat().xvzhi) player.getStat().xvzhi = []; - player.getStat().xvzhi.addArray(targets); - if (targets.some(i => !i.countCards("h"))) return; - const result = await player - .chooseCardOL(targets, "h", true, [1, Infinity], "蓄志:选择任意张手牌并与对方交换") - .set("ai", card => { - const player = get.event("player"), - target = get.event().getParent(2).targets.find(i => i != player); - const sha = new lib.element.VCard({ name: "sha" }); - const playerEffect = player.hasUseTarget(sha, false) - ? Math.max( - ...game.filterPlayer(current => - player.canUse(sha, current, false) - ).map(current => { - return get.effect(current, sha, player, player); - }) - ) - : 0; - const targetEffect = target.hasUseTarget(sha, false) - ? Math.max( - ...game.filterPlayer(current => - target.canUse(sha, current, false) - ).map(current => { - return get.effect(current, sha, player, player); - }) - ) - : 0; - return 5 + 2 * get.sgn(playerEffect - targetEffect) - get.value(card); - }) - .forResult(); - await targets[0].swapHandcards(targets[1], result[0].cards, result[1].cards); - if (result[0].cards.length == result[1].cards.length) { - await player.draw(2); - player.getStat("skill").xvzhi--; - } else { - const aim = targets[result[0].cards.length > result[1].cards.length ? 0 : 1]; - const sha = new lib.element.VCard({ name: "sha" }); - if (aim.hasUseTarget(sha, false)) { - await aim.chooseUseTarget(sha, true, false, "nodistance"); - } - } - }, - ai: { - order: 5, - result: { - target(player, target) { - return get.sgn(get.attitude(player, target)) * target.countCards("h"); - }, - }, - }, - }, - //司马孚 - beiyu: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - return player.countCards("h") < player.maxHp; - }, - usable: 1, - async content(event, trigger, player) { - await player.drawTo(player.maxHp); - if (!player.countCards("h")) return; - const suits = player - .getCards("h") - .reduce((list, card) => list.add(get.suit(card)), []) - .sort((a, b) => lib.suit.indexOf(b) - lib.suit.indexOf(a)); - const result = await player - .chooseControl(suits) - .set("prompt", "备预:将一种花色的手牌牌置于牌堆底") - .set("ai", () => { - const player = get.event("player"); - let suits = get.event("controls").slice(); - suits.sort((a, b) => player.countCards("h", { suit: a }) - player.countCards("h", { suit: b })); - return suits[0]; - }) - .forResult(); - if (result.control) { - const suit = result.control, - cards = player.getCards("h", { suit: suit }); - if (cards.length) { - let resultx; - if (cards.length == 1) { - resultx = { bool: true, moved: [cards] }; - } else { - resultx = await player - .chooseToMove("备预:将牌按顺序置于牌堆底", true) - .set("list", [["牌堆底", cards]]) - .set("processAI", list => { - return [list[0][1].slice(0)]; - }) - .forResult(); - } - if (resultx.bool) { - const moved = resultx.moved[0]; - if (moved.length) { - await player.lose(cards, ui.cardPile); - for (let i = 0; i < moved.length; i++) { - const card = moved[i]; - card.fix(); - ui.cardPile.appendChild(card); - } - } - } - } - } - }, - ai: { - order: 0.001, - result: { player: 1 }, - }, - }, - duchi: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - filter(event, player) { - return event.player != player; - }, - usable: 1, - logTarget: "player", - check(event, player) { - return get.effect(player, event.card, event.player, player) <= 0; - }, - async content(event, trigger, player) { - await player.draw().set("bottom", true); - if (player.countCards("h")) { - await player.showHandcards(get.translation(player) + "发动了【督持】"); - const colors = player.getCards("h").reduce((list, card) => list.add(get.color(card)), []); - if (colors.length == 1) { - player.popup("洗具"); - trigger.getParent().excluded.add(player); - return; - } - } - player.popup("杯具"); - }, - ai: { threaten: 0.8 }, - }, - //宣公主 - yjqimei: { - audio: 2, - enable: "phaseUse", - filter(event, player) { - const count = player.getStat("skill").yjqimei; - if (count && count > 0 && !player.hasSkill("yjqimei_rewrite")) return false; - return true; - }, - filterTarget: lib.filter.notMe, - usable: 2, - async content(event, trigger, player) { - const target = event.target; - await player.draw(2, "nodelay"); - await target.draw(2); - const targets = [player, target].filter(current => current.countDiscardableCards(current, "he")); - if (targets.length) { - const result = await player - .chooseCardOL(targets, "he", true, 2, "齐眉:请弃置两张牌", (card, player, target) => { - return lib.filter.cardDiscardable(card, player); - }) - .forResult(); - if (result.length == 1) targets[0].discard(result[0].cards); - else { - await game - .loseAsync({ - lose_list: [ - [targets[0], result[0].cards], - [targets[1], result[1].cards], - ], - }) - .setContent("discardMultiple"); - await game.asyncDelayx(); - } - let cards = result.reduce((list, evt) => { - list.addArray(evt.cards); - return list; - }, []); - const suits = cards.reduce((list, card) => list.add(get.suit(card)), []); - switch (suits.length) { - case 1: - while (cards.length) { - const card = cards.shift(); - if (player.hasUseTarget(card)) { - player.$gain2(card, false); - await game.asyncDelayx(); - await player.chooseUseTarget(true, card, false); - } - } - break; - case 2: - for (const current of [player, target]) { - if (!current.isIn()) continue; - if (current.isLinked()) await current.link(false); - if (current.isTurnedOver()) await current.turnOver(false); - } - break; - case 3: - for (const current of [player, target]) { - if (current.isIn() && !current.isLinked()) await current.link(true); - } - break; - case 4: - await player.draw("nodelay"); - await target.draw(); - player.addTempSkill("yjqimei_rewrite"); - break; - } - } - }, - ai: { - order: 9, - result: { - target(player, target) { - const att = get.sgn(get.attitude(player, target)); - return (2 + att) * att; - }, - }, - }, - subSkill: { rewrite: { charlotte: true } }, - }, - yjzhuiji: { - audio: 2, - trigger: { player: "die" }, - filter(event, player) { - return game.hasPlayer(target => { - return ( - target != player && - Array.from({ length: 5 }) - .map((_, i) => i + 1) - .some(i => target.hasEmptySlot(i)) - ); - }); - }, - forceDie: true, - skillAnimation: true, - animationColor: "water", - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("yjzhuiji"), (card, player, target) => { - return ( - target != player && - Array.from({ length: 5 }) - .map((_, i) => i + 1) - .some(i => target.hasEmptySlot(i)) - ); - }) - .set("ai", target => { - const player = get.event("player"); - return ( - get.sgn(get.attitude(player, target)) * - Array.from({ length: 5 }) - .map((_, i) => i + 1) - .reduce((sum, i) => sum + target.countEmptySlot(i), 0) - ); - }) - .set("forceDie", true) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - let num = 1, - cards = []; - while (num <= 5) { - while (target.hasEmptySlot(num)) { - const card = get.cardPile2(card => { - return !cards.includes(card) && get.subtype(card) == "equip" + num && target.canUse(card, target); - }); - if (card) { - cards.push(card); - target.$gain2(card, false); - await game.asyncDelayx(); - await target.chooseUseTarget(card, true, "nopopup"); - } else break; - } - num++; - } - if (cards.length) { - target.addSkill("yjzhuiji_buff"); - target.markAuto("yjzhuiji_buff", cards); - } - }, - subSkill: { - buff: { - charlotte: true, - mod: { - aiValue(player, card, num) { - if (player.getStorage("yjzhuiji_buff").includes(card)) return num + 100; - }, - aiUseful(player, card, num) { - if (player.getStorage("yjzhuiji_buff").includes(card)) return num / 114514; - }, - }, - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter(event, player) { - const evt = event.getl(player); - return evt && evt.es && evt.es.some(i => player.getStorage("yjzhuiji_buff").includes(i)); - }, - forced: true, - popup: false, - firstDo: true, - content() { - const evt = trigger.getl(player); - const cards = evt.es.filter(i => player.getStorage("yjzhuiji_buff").includes(i)); - player.unmarkAuto("yjzhuiji_buff", cards); - for (const card of cards) player.disableEquip(get.subtype(card)); - }, - intro: { - mark(dialog, storage) { - if (storage && storage.length) dialog.addSmall([storage, "vcard"]); - else return "暂无装备"; - }, - }, - }, - }, - }, - //徐琨 - fazhu: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - return player.hasCard(card => !get.tag(card, "damage") && player.canRecast(card), "hej"); - }, - async content(event, trigger, player) { - const cardx = player.getCards("hej", card => !get.tag(card, "damage") && player.canRecast(card)); - await player.recast(cardx); - const cards = player - .getHistory("gain", evt => evt.getParent(3) == event) - .reduce((list, evt) => { - list.addArray(evt.cards); - return list; - }, []); - let num = Math.min(cards.length, game.countPlayer()), - list = []; - if (!num) return; - if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); - while (num - list.length > 0 && cards.some(i => get.owner(i) == player && get.position(i) == "h" && !i.hasGaintag("olsujian_given"))) { - const result = await player - .chooseCardTarget({ - prompt: "筏铸:将以此法获得的牌交给任意角色各一张", - position: "he", - animate: false, - filterCard(card, player) { - if (!get.event("cards").includes(card)) return false; - return !get.event("list").some(list => list[1] == card); - }, - filterTarget(card, player, target) { - return !get.event("list").some(list => list[0] == target); - }, - ai1(card) { - if (card.name == "sha") return 2.5; - return 1 + Math.random(); - }, - ai2(target) { - return get.attitude(get.event("player"), target); - }, - }) - .set("forced", !list.length) - .set("list", list) - .set("cards", cards) - .forResult(); - if (result.bool) { - list.push([result.targets[0], result.cards[0]]); - player.addGaintag(result.cards, "olsujian_given"); - } else break; - } - if (_status.connectMode) { - game.broadcastAll(() => { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - if (list.length) { - const targets = list.slice().map(list => list[0]); - await game - .loseAsync({ - gain_list: list, - player: player, - cards: list.slice().map(list => list[1]), - giver: player, - animate: "giveAuto", - }) - .setContent("gaincardMultiple"); - for (const target of targets) { - await target - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.cardEnabled.apply(this, arguments); - }) - .set("openskilldialog", "筏铸:是否使用一张【杀】(无距离限制)?") - .set("norestore", true) - .set("custom", { - add: {}, - replace: { window: function () {} }, - }) - .set("targetRequired", true) - .set("complexSelect", true) - .set("filterTarget", function (card, player, target) { - return lib.filter.targetEnabled.apply(this, arguments); - }) - .set("addCount", false); - } - } - }, - ai: { - effect: { - target(card, player, target) { - if (!card || get.type(card) != "delay") return; - if (!get.tag(card, "damage") && target.canRecast(card)) return "zeroplayertarget"; - }, - }, - }, - }, - //一将2023 - //孙礼 - kangli: { - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - forced: true, - locked: false, - content: function () { - player.draw(2).gaintag = ["kangli"]; - player.when({ source: "damageBegin1" }).then(() => { - var cards = player.getCards("h", card => card.hasGaintag("kangli") && lib.filter.cardDiscardable(card, player, "kangli")); - if (cards.length) player.discard(cards); - }); - }, - ai: { - maixie: true, - }, - }, - //夏侯楙 - tongwei: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("he", card => lib.skill.tongwei.filterCard(card, player)) > 1 && game.hasPlayer(i => i != player); - }, - filterTarget: lib.filter.notMe, - filterCard: lib.filter.cardRecastable, - selectCard: 2, - position: "he", - discard: false, - lose: false, - delay: false, - popname: true, - check: function (card) { - var num = 6.5; - if (ui.selected.cards.length) { - var cardx = ui.selected.cards[0]; - num = get.number(cardx); - } - var del = Math.abs(get.number(card) - num); - return 5 + del / 5 - get.value(card); - }, - content: function () { - "step 0"; - player.recast(cards); - "step 1"; - var numbers = cards.map(c => get.number(c, player)).sort((a, b) => a - b); - target.when("useCard1").then(() => { - trigger._tongwei_checked = true; - }); - target - .when("useCardAfter") - .assign({ - numbers: numbers, - playerx: player, - mod: { - aiOrder: function (player, card, num) { - var number = get.number(card); - if (typeof number != "number" || number <= numbers[0] || number >= numbers[1]) return num + 10; - }, - }, - }) - .filter((event, player) => { - return event._tongwei_checked; - }) - .then(() => { - var number = get.number(trigger.card); - var numbers = get.info(event.name).numbers; - event.playerx = get.info(event.name).playerx; - if (typeof number != "number" || number <= numbers[0] || number >= numbers[1]) event.finish(); - }) - .then(() => { - var playerx = event.playerx; - var names = ["sha", "guohe"].filter(name => playerx.canUse({ name: name, isCard: true }, player, false)); - if (!names.length) event.finish(); - else if (names.length == 1) event._result = { links: [[null, null, names[0]]] }; - else - playerx - .chooseButton([`请选择要视为对${get.translation(player)}使用的牌`, [names, "vcard"]], true) - .set("ai", button => { - return button.link[0][2] == _status.event.choice; - }) - .set( - "choice", - (function () { - var list = names - .map(name => { - return [name, get.effect(player, { name: name, isCard: true }, playerx, playerx)]; - }) - .sort((a, b) => { - return b[1] - a[1]; - }); - return list[0][0]; - })() - ); - }) - .then(() => { - var name = result.links[0][2]; - var card = { name: name, isCard: true }, - playerx = event.playerx; - if (playerx.canUse(card, player, false)) playerx.useCard(card, player, "tongwei"); - }); - }, - ai: { - expose: 0.2, - order: 7, - threaten: 2.2, - result: { - target: -1, - }, - }, - }, - cuguo: { - audio: 2, - trigger: { player: ["shaMiss", "eventNeutralized"] }, - filter: function (event, player) { - if (event.type != "card" && event.name != "_wuxie") return false; - if ( - !event.target || - !event.target.isIn() || - !player.canUse( - { - name: event.card.name, - nature: event.card.nature, - isCard: true, - }, - event.target, - false - ) - ) - return false; - if (!player.hasCard(card => lib.filter.cardDiscardable(card, player), "he")) return false; - var history = game.getGlobalHistory("everything"); - for (var evt of history) { - if (evt._neutralized || (evt.responded && (!evt.result || !evt.result.bool))) { - var evtx = evt.getParent(); - return evtx.name == "useCard" && evtx.player == player && evt == event; - } - } - return false; - }, - forced: true, - direct: true, - content: function () { - "step 0"; - var card = { - name: trigger.card.name, - nature: trigger.card.nature, - isCard: true, - storage: { cuguo: true }, - }; - event.card = card; - player.chooseToDiscard("蹙国:请弃置一张牌", `视为你对${get.translation(trigger.target)}使用一张${get.translation(card.nature || "")}【${get.translation(card.name)}】`, "he", true).set("logSkill", ["cuguo", trigger.target]); - "step 1"; - if (player.canUse(card, trigger.target, false)) { - player.useCard(card, trigger.target); - player - .when("useCardAfter") - .filter(event => { - return event.card.storage && event.card.storage.cuguo; - }) - .then(() => { - if ( - game.hasGlobalHistory("everything", evt => { - if (evt._neutralized || (evt.responded && (!evt.result || !evt.result.bool))) { - if (evt.getParent() == trigger) return true; - } - return false; - }) - ) { - player.loseHp(); - } - }); - } - }, - }, - //陈式 - qingbei: { - audio: 2, - trigger: { global: "roundStart" }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseButton(['###擎北:是否选择任意种花色?###
    你不能于本轮能使用这些花色,且使用牌后摸等同于选择花色数的牌
    ', [lib.suit.map(i => ["", "", "lukai_" + i]), "vcard"]], [1, 4]); - next.set("ai", button => { - var player = _status.event.player; - var suit = button.link[2].slice(6); - var val = player - .getCards("hs", { suit: suit }) - .map(card => { - return get.value(card) + player.getUseValue(card) / 3; - }) - .reduce((p, c) => { - return p + c; - }, 0); - if (val > 10 && ui.selected.buttons.length > 0) return -1; - if (val > 6 && ui.selected.buttons.length == 2) return -1; - if (ui.selected.buttons.length == 3) return -1; - return 1 + 1 / val; - }); - "step 1"; - if (result.bool) { - var suits = result.links.map(i => i[2].slice(6)); - player.logSkill("qingbei"); - player.addTempSkill("qingbei_effect", "roundStart"); - player.setStorage("qingbei_effect", suits); - player.markSkill("qingbei_effect"); - } - }, - ai: { - threaten: 2.3, - }, - subSkill: { - effect: { - audio: "qingbei", - trigger: { player: "useCardAfter" }, - charlotte: true, - onremove: true, - forced: true, - filter: function (event, player) { - if (!lib.suit.includes(get.suit(event.card))) return false; - return player.getStorage("qingbei_effect").length; - }, - content: function () { - player.draw(player.getStorage("qingbei_effect").length); - }, - mark: true, - intro: { - content: storage => `本轮内不能使用${get.translation(storage)}花色的牌,且使用一张有花色的牌后摸${get.cnNumber(storage.length)}张牌`, - }, - mod: { - cardEnabled: function (card, player) { - if (player.getStorage("qingbei_effect").includes(get.suit(card))) return false; - }, - cardSavable: function (card, player) { - if (player.getStorage("qingbei_effect").includes(get.suit(card))) return false; - }, - }, - }, - }, - }, - //费曜 - zhenfeng: { - audio: 2, - trigger: { global: "useCard" }, - usable: 1, - filter: function (event, player) { - return event.player != player && event.player == _status.currentPhase && event.player.countCards("h") <= event.player.getHp(); - }, - check: function (event, player) { - var type = get.type2(event.card, event.player); - if (type == "equip" && event.player.hasCard(card => event.player.hasValueTarget(card))) return false; - if (get.attitude(player, event.player) > 0 && event.player.getHp() + event.player.countCards("hs", ["shan", "caochuan"]) <= 3) return false; - return true; - }, - onremove: true, - logTarget: "player", - content: function () { - "step 0"; - var choices = Array.from({ length: trigger.player.countCards("h") + 1 }).map((_, i) => get.cnNumber(i, true)); - var type = get.type2(trigger.card, trigger.player); - player - .chooseControl(choices) - .set("prompt", "镇锋:猜测其手牌中的" + get.translation(type) + "牌数") - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - var num = trigger.player.countCards("h", card => get.type2(card) == type); - var knownNum = trigger.player.countKnownCards(_status.event.player, card => get.type2(card) == type); - if (trigger.player.isAllCardsKnown(_status.event.player)) { - return knownNum; - } - var restNum = num - knownNum; - var numx; - if (type == "basic") numx = num + Math.floor(Math.random() * restNum + 1); - else if (type == "trick") { - if (num > 2) numx = 2; - else numx = 1; - if (Math.random() < 0.5) { - numx += Math.random() > 0.5 ? 1 : -1; - } - } else { - numx = [0, 1].randomGet(); - } - if (numx < knownNum) numx = knownNum; - else if (numx >= choices.length) numx = choices.length - 1; - return numx; - })() - ); - "step 1"; - var guessedNum = result.index; - player.chat("我猜" + get.cnNumber(guessedNum) + "张"); - game.log(player, "猜测", trigger.player, "有", get.cnNumber(guessedNum) + "张" + get.translation(type) + "牌"); - event.guessedNum = guessedNum; - game.delay(); - "step 2"; - var type = get.type2(trigger.card, trigger.player); - var count = trigger.player.countCards("h", card => get.type2(card) == type); - var guessedNum = event.guessedNum; - if (count == guessedNum) { - player.popup("洗具"); - game.log(player, "猜测", "#g正确"); - if (player.countMark("zhenfeng") < 5) player.addMark("zhenfeng", 1, false); - player.draw(player.countMark("zhenfeng")); - if (player.canUse("sha", trigger.player, false)) player.useCard({ name: "sha", isCard: true }, trigger.player); - } else { - player.popup("杯具"); - game.log(player, "猜测", "#y错误"); - player.clearMark("zhenfeng"); - if (Math.abs(count - guessedNum) > 1 && trigger.player.canUse("sha", player, false)) { - trigger.player.useCard({ name: "sha", isCard: true }, player, false, "noai"); - } - } - }, - intro: { - content: "已连续猜对#次", - }, - }, - //新杀小加强 李严 - dcduliang: { - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player != target && target.countCards("he") > 0; - }, - audio: "duliang", - content: function () { - "step 0"; - player.gainPlayerCard(target, "he", true); - "step 1"; - var name = get.translation(target); - player - .chooseControl(function () { - return Math.random() < 0.5 ? "选项一" : "选项二"; - }) - .set("prompt", "督粮:请选择一项") - .set("choiceList", ["你观看牌堆顶的两张牌,然后令" + name + "获得其中的一或两张基本牌", "令" + name + "于下回合的摸牌阶段额外摸一张牌"]); - "step 2"; - if (result.control == "选项一") { - var cards = get.cards(2), - bool = false; - event.cards = cards; - game.cardsGotoOrdering(cards); - for (var card of cards) { - if (get.type(card) == "basic") { - bool = true; - break; - } - } - player - .chooseButton(["督粮:选择令" + get.translation(target) + "获得的牌", cards], [1, 2], bool) - .set("filterButton", button => { - return get.type(button.link) == "basic"; - }) - .set("ai", button => { - return _status.event.sgn * get.value(button.link); - }) - .set("sgn", get.sgnAttitude(player, target) > 0); - } else { - target.addTempSkill("dcduliang2", { player: "phaseAfter" }); - target.addMark("dcduliang2", 1, false); - event.finish(); - } - "step 3"; - if (result.bool) { - var cardsx = result.links; - target.gain(cardsx, "draw"); - game.log(target, "获得了" + get.cnNumber(cardsx.length) + "张牌"); - cards.removeArray(cardsx); - cards.reverse(); - } - for (var i = 0; i < cards.length; i++) { - ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); - } - game.updateRoundNumber(); - }, - ai: { - order: 4, - result: { - target: -1, - player: 0.1, - }, - }, - }, - dcduliang2: { - trigger: { player: "phaseDrawBegin" }, - forced: true, - mark: true, - audio: false, - onremove: true, - charlotte: true, - intro: { - content: "下回合的摸牌阶段额外摸#张牌", - }, - content: function () { - trigger.num += player.countMark("dcduliang2"); - }, - }, - //苏飞 - shuojian: { - audio: 2, - enable: "phaseUse", - usable: 3, - filterTarget: lib.filter.notMe, - filterCard: true, - position: "he", - discard: false, - lose: false, - delay: false, - check: function (card, player) { - return 6 - get.value(card); - }, - content: function () { - "step 0"; - player.give(cards, target); - "step 1"; - var num = 3 - get.skillCount("shuojian") + 1; - event.num = num; - event.num2 = num; - if (event.num == 0) event.finish(); - "step 2"; - var forced = num != event.num2; - var prompt = "###" + get.translation(player) + "对你发动了【数谏】###视为使用" + get.cnNumber(num) + "张【过河拆桥】" + (forced ? "" : "且" + get.translation(player) + "此技能本回合失效,或点击“取消”令其摸" + get.cnNumber(num) + "张牌"); - if (!target.hasUseTarget({ name: "guohe" })) event._result = { bool: false }; - else - target - .chooseUseTarget(prompt, "guohe", forced) - .set("ai", function () { - var evt = _status.event; - if (evt.name == "chooseTarget") evt = evt.getParent(); - if (!evt.goon) return 0; - return get.effect_use.apply(this, arguments); - }) - .set("goon", target.getUseValue({ name: "guohe" }) > (get.sgnAttitude(target, player) * player.getUseValue({ name: "wuzhong" })) / (2 - num * 0.4)); - "step 3"; - if (!result.bool) { - player.draw(num); - if (num > 1) player.chooseToDiscard("he", num - 1, true); - event.finish(); - } - "step 4"; - if (--event.num2 > 0) { - event.goto(2); - } else player.tempBanSkill("shuojian"); - }, - ai: { - expose: 0.15, - order: 8, - result: { target: 1 }, - }, - }, - //谯周 - shiming: { - audio: 2, - trigger: { global: "phaseDrawBegin1" }, - filter: function (event, player) { - return !player.hasSkill("shiming_round"); - }, - check: function (event, player) { - return true; //get.attitude(player,event.player)<0||get.damageEffect(event.player,event.player,player)>0; - }, - logTarget: "player", - content: function () { - "step 0"; - player.addTempSkill("shiming_round", "roundStart"); - var cards = get.cards(3); - player - .chooseButton(["识命:是否将其中一张置于牌堆底?", cards.slice(0)]) - .set("ai", button => { - var att = _status.event.att, - damage = _status.event.damage, - val = get.value(button.link, _status.event.player); - if ((att > 0 && damage < 0) || (att <= 0 && damage > 0)) return 6 - val; - return val - 5.99; - }) - .set("att", get.attitude(player, trigger.player)) - .set("damage", get.damageEffect(trigger.player, trigger.player, player) > 0 && trigger.player.hp <= 3 ? 1 : -1); - while (cards.length) ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); - "step 1"; - if (result.bool) { - var card = result.links[0]; - card.fix(); - ui.cardPile.appendChild(card); - player.popup("一下", "wood"); - game.log(player, "将一张牌置于了牌堆底"); - } - "step 2"; - trigger.player - .chooseBool("是否跳过摸牌阶段并对自己造成1点伤害,然后从牌堆底摸三张牌?") - .set("ai", () => _status.event.bool) - .set("bool", get.damageEffect(trigger.player, trigger.player) >= -6 || trigger.player.hp > 3); - "step 3"; - if (result.bool) { - trigger.cancel(); - trigger.player.damage(trigger.player); - } else event.finish(); - "step 4"; - trigger.player.draw(3, "bottom"); - }, - subSkill: { - round: { - mark: true, - intro: { content: "本轮已发动〖识命〗" }, - }, - }, - }, - jiangxi: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - var zhu = game.findPlayer(i => i.getSeatNum() == 1); - return ( - (zhu && - player.hasSkill("shiming_round") && - (game.getGlobalHistory("changeHp", evt => { - return evt.player == zhu && evt._dyinged; - }).length > 0 || - zhu.getHistory("damage").length == 0)) || - !game.hasPlayer2(current => current.getHistory("damage").length > 0) - ); - }, - direct: true, - content: function () { - "step 0"; - if (player.hasSkill("shiming_round")) { - var zhu = game.findPlayer(i => i.getSeatNum() == 1); - if ( - game.getGlobalHistory("changeHp", evt => { - return evt.player == zhu && evt._dyinged; - }).length > 0 || - zhu.getHistory("damage").length == 0 - ) { - player.chooseBool(get.prompt("jiangxi"), "重置〖识命〗"); - } - } else event.goto(2); - "step 1"; - if (result.bool) { - player.logSkill("jiangxi"); - event.logged = true; - player.removeSkill("shiming_round"); - player.draw(); - } - "step 2"; - if (!game.hasPlayer2(current => current.getHistory("damage").length > 0)) { - player - .chooseBool(get.prompt("jiangxi"), "与" + get.translation(trigger.player) + "各摸一张牌") - .set("ai", () => _status.event.bool) - .set("bool", trigger.player.getUseValue({ name: "wuzhong" }) + player.getUseValue({ name: "wuzhong" }) > 0); - } else event.finish(); - "step 3"; - if (result.bool) { - if (!event.logged) player.logSkill("jiangxi"); - trigger.player.draw("nodelay"); - player.draw(); - } - }, - }, - //韩龙 - duwang: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - var cards = []; - for (var i = 0; i < ui.cardPile.childNodes.length; i++) { - var card = ui.cardPile.childNodes[i]; - if (card.name != "sha") cards.push(card); - if (cards.length >= 5) break; - } - if (cards.length) player.addToExpansion(cards, "gain2").gaintag.add("duwang"); - }, - marktext: "刺", - intro: { - name: "刺", - name2: "刺", - content: "expansion", - markcount: "expansion", - }, - mod: { - globalFrom: function (from, to, distance) { - return distance + Math.min(1, from.getExpansions("duwang").filter(i => i.name != "sha").length); - }, - globalTo: function (from, to, distance) { - return distance + Math.min(1, to.getExpansions("duwang").filter(i => i.name != "sha").length); - }, - }, - }, - cibei: { - audio: 2, - trigger: { global: "cardsDiscardAfter" }, - filter: function (event, player) { - if (!player.getExpansions("duwang").filter(i => i.name != "sha").length) return false; - var evt = event.getParent(); - if (evt.name != "orderingDiscard") return false; - var evtx = evt.relatedEvent || evt.getParent(); - return ( - evtx.name == "useCard" && - evtx.card.name == "sha" && - event.cards.filterInD("d").length && - game.hasPlayer2(current => - current.hasHistory("sourceDamage", evtxx => { - return evtxx.card == evtx.card; - }) - ) - ); - }, - direct: true, - group: "cibei_fullyReady", - content: function () { - "step 0"; - player.chooseButton(["###" + get.prompt("cibei") + '###
    将一张“刺”置入弃牌堆,并将' + get.translation(trigger.cards.filterInD("d")) + "置入“刺”
    ", player.getExpansions("duwang")]).set("filterButton", button => { - return button.link.name != "sha"; - }); - "step 1"; - if (result.bool) { - player.logSkill("cibei"); - player.loseToDiscardpile(result.links); - player.addToExpansion(trigger.cards.filterInD("d"), "gain2").gaintag.add("duwang"); - if (game.hasPlayer(current => current.countDiscardableCards(player, "hej") > 0)) - player - .chooseTarget("刺北:弃置一名角色区域内的一张牌", true, (card, player, target) => { - return target.countDiscardableCards(player, "hej") > 0; - }) - .set("ai", target => { - return get.effect(target, { name: "guohe" }, _status.event.player); - }); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - player.discardPlayerCard(target, "hej", true); - player.addExpose(0.1); - } - }, - ai: { - combo: "duwang", - }, - subSkill: { - fullyReady: { - trigger: { global: "phaseEnd" }, - forced: true, - locked: false, - filter: function (event, player) { - var storage = player.getExpansions("duwang"); - return storage.length > 0 && storage.every(i => i.name == "sha"); - }, - content: function () { - player.gain(player.getExpansions("duwang"), "gain2").gaintag.add("cibei_mark"); - player.addSkill("cibei_mark"); - }, - }, - mark: { - trigger: { player: "useCard1" }, - onremove: true, - charlotte: true, - silent: true, - firstDo: true, - filter: function (event, player) { - return player.hasHistory("lose", evt => { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("cibei_mark")) return true; - } - return false; - }); - }, - content: function () { - if (trigger.addCount !== false) { - trigger.addCount = false; - var stat = player.getStat().card, - name = trigger.card.name; - if (typeof stat[name] == "number") stat[name]--; - } - }, - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("cibei_mark")) return true; - }, - cardDiscardable: function (card, player, name) { - if (card.hasGaintag("cibei_mark")) return false; - }, - canBeDiscarded: function (card) { - if (card.hasGaintag("cibei_mark")) return false; - }, - targetInRange: function (card, player, target) { - if (!card.cards) return; - for (var i of card.cards) { - if (i.hasGaintag("cibei_mark")) return true; - } - }, - cardUsable: function (card, player) { - if (!card.cards) return; - for (var i of card.cards) { - if (i.hasGaintag("cibei_mark")) return true; - } - }, - }, - }, - }, - }, - //武安国 - diezhang: { - audio: 2, - locked: false, - zhuanhuanji: function (player, skill) { - if (!player.storage.duanwan) player.storage[skill] = !player.storage[skill]; - }, - trigger: { global: ["eventNeutralized", "shaMiss"] }, - filter: function (event, player) { - if (player.hasSkill("diezhang_used")) return false; - if (event.type != "card") return false; - var evt = event._neutralize_event; - var user, responder; - if (event.name == "sha") { - user = event.player; - responder = event.target; - } else { - if (evt.type != "card") return false; - user = event.player; - responder = evt.player; - } - if (!player.storage.diezhang) { - if (user != player || responder == player) return false; - return player.countDiscardableCards(player, "he") > 0 && player.canUse("sha", responder, false); - } else { - if (user == player || responder != player) return false; - return player.canUse("sha", user, false); - } - }, - direct: true, - content: function () { - "step 0"; - var evt = trigger._neutralize_event; - var user, responder; - if (trigger.name == "sha") { - user = trigger.player; - responder = trigger.target; - } else { - user = trigger.player; - responder = evt.player; - } - var num = player.storage.duanwan ? 2 : 1; - event.num = num; - if (!player.storage.diezhang) { - var target = responder; - event.target = target; - var next = player - .chooseToDiscard(get.prompt("diezhang", target), "弃置一张牌,视为对其使用" + get.cnNumber(num) + "张【杀】", "he") - .set("ai", card => { - if (_status.event.goon) return 6 - get.value(card); - return 0; - }) - .set("logSkill", ["diezhang", target]); - } else { - var target = user; - event.target = target; - var next = player.chooseBool(get.prompt("diezhang", target), "摸" + get.cnNumber(num) + "张牌,视为对其使用一张【杀】").set("ai", () => _status.event.goon); - } - next.set("goon", get.effect(target, { name: "sha" }, player, player) > 0); - "step 1"; - if (result.bool) { - if (player.storage.duanwan) player.addTempSkill("diezhang_used"); - player.changeZhuanhuanji("diezhang"); - if (!result.cards || !result.cards.length) { - player.logSkill("diezhang", target); - player.draw(num, "nodelay"); - player.useCard({ name: "sha", isCard: true }, target, false); - } else while (num--) player.useCard({ name: "sha", isCard: true }, target, false); - } - }, - marktext: "☯", - mark: true, - intro: { - content: function (storage, player) { - var cnNum = get.cnNumber(player.storage.duanwan ? 2 : 1); - if (storage) return "当其他角色使用牌被你抵消后,你可以摸" + cnNum + "张牌,视为对其使用一张【杀】。"; - return "当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用" + cnNum + "张【杀】。"; - }, - }, - mod: { - cardUsable: function (card, player, num) { - if (!player.storage.duanwan && card.name == "sha") return num + 1; - }, - }, - subSkill: { used: { charlotte: true } }, - }, - duanwan: { - audio: 2, - enable: "chooseToUse", - skillAnimation: true, - animationColor: "soil", - limited: true, - filter: function (event, player) { - return event.type == "dying" && player == event.dying; - }, - content: function () { - player.changeZhuanhuanji("diezhang"); - player.awakenSkill("duanwan"); - var num = 2 - player.hp; - if (num > 0) player.recover(num); - }, - ai: { - save: true, - skillTagFilter: function (player, tag, target) { - return player == target; - }, - result: { player: 1 }, - }, - }, - //李婉 - liandui: { - audio: 2, - trigger: { global: "useCard" }, - filter: function (event, player) { - var history = game.getAllGlobalHistory("useCard"); - var index = history.indexOf(event); - if (index <= 0) return false; - var previous = history[index - 1].player; - if (event.player == player && previous != player && previous.isIn()) return true; - if (event.player != player && previous == player) return true; - return false; - }, - direct: true, - content: function () { - "step 0"; - var history = game.getAllGlobalHistory("useCard"); - var index = history.indexOf(trigger); - var previous = history[index - 1].player; - var user = trigger.player, - target = previous; - event.user = user; - event.target = target; - if (user) { - user.chooseBool("是否对" + get.translation(target) + "发动【联对】?", "令" + get.translation(target) + "摸两张牌") - .set("ai", () => _status.event.bool) - .set("bool", get.effect(target, { name: "draw" }, user, user) > 0); - } - "step 1"; - if (result.bool) { - event.user.logSkill("liandui", target); - target.draw(2); - } - }, - }, - biejun: { - audio: 2, - global: "biejun_give", - trigger: { player: "damageBegin4" }, - filter: function (event, player) { - return ( - !player.hasSkill("biejun_used") && - player.countCards("h", card => { - return card.hasGaintag("biejun"); - }) == 0 - ); - }, - prompt2: "翻面并防止此伤害", - check: function (event, player) { - return player.isTurnedOver() || event.num >= player.hp || get.distance(_status.currentPhase, player, "absolute") >= 3; - }, - content: function () { - player.addTempSkill("biejun_used"); - player.turnOver(); - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (get.tag(card, "damage")) { - if (player.getNext() == target && lib.skill.biejun.filter(null, target) && target.isTurnedOver()) return [0, 1]; - } - }, - }, - }, - subSkill: { - used: { charlotte: true }, - give: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - if (!player.countCards("h")) return false; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("biejun"); - }); - if (!targets.length) return false; - return true; - }, - selectCard: 1, - filterCard: true, - filterTarget: function (card, player, target) { - return target.hasSkill("biejun"); - }, - selectTarget: function () { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("biejun"); - }); - return targets.length > 1 ? 1 : -1; - }, - complexSelect: true, - prompt: function () { - var player = _status.event.player; - var targets = game.filterPlayer(function (current) { - return current != player && current.hasSkill("biejun"); - }); - return "将一张手牌交给" + get.translation(targets) + (targets.length > 1 ? "中的一人" : ""); - }, - position: "h", - discard: false, - lose: false, - delay: false, - check: function (card) { - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return lib.skill.biejun_give.filterTarget(null, player, current) && get.attitude(player, current) > 0; - }) - ) { - return 5 - get.value(card); - } - return -get.value(card); - }, - content: function () { - game.trySkillAudio("biejun", target); - player.give(cards, target).gaintag.add("biejun"); - target.addTempSkill("biejun_tag"); - }, - ai: { - order: 2, - result: { target: 1 }, - }, - }, - tag: { - charlotte: true, - forced: true, - onremove: function (player) { - player.removeGaintag("biejun"); - }, - }, - }, - }, - //诸葛尚 - sangu: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - getEffect: function (player, target, event, list1, list2) { - let att = get.attitude(player, target); - if (att === 0) return 0; - let getv = function (name, player, arg) { - let v = event.getTempCache("sangu", player.id + name); - if (typeof v === "number") return v; - v = player.getUseValue({ name: name, storage: { sangu: true } }, arg); - event.putTempCache("sangu", player.id + name, v); - return v; - }; - if (att < 0) { - for (let i of list1) { - if (getv(i, target) <= 0 || getv(i, target) <= 0) return -att * Math.sqrt(get.threaten(target)) * 2; - } - return 0; - } else { - let list = list1.concat(player.hp > 1 ? list2 : []), - eff = 0; - list.sort(function (a, b) { - return getv(b, target) - getv(a, target); - }); - list = list.slice(3); - for (let i of list) { - let res = getv(i, target); - if (res <= 5) break; - else eff += res; - } - return Math.sqrt(eff / 1.5) * att; - } - }, - content: function () { - "step 0"; - event.list1 = []; - event.list2 = []; - event.used = []; - player.getHistory("useCard", function (evt) { - event.used.add(evt.card.name); - }); - for (let name of lib.inpile) { - let add = false, - type = get.type(name); - if (name === "sha") add = true; - else if (type === "trick") { - let info = lib.card[name]; - if (info && !info.singleCard && !info.notarget) add = true; - } - if (!add) continue; - if (event.used.includes(name)) event.list1.push(name); - else event.list2.push(name); - } - if (!event.list1.length && !event.list2.length) event.finish(); - else - player - .chooseTarget(get.prompt2("sangu"), lib.filter.notMe) - .set("ai", function (target) { - return lib.skill.sangu.getEffect(_status.event.player, target, _status.event.getTrigger(), _status.event.list1, _status.event.list2); - }) - .set("list1", event.list1) - .set("list2", event.list2); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sangu", target); - event.target = target; - } else event.finish(); - "step 2"; - var dialog = ["为" + get.translation(target) + "选择至多三个牌名"]; - if (event.list1.length) { - dialog.push('
    本回合已使用过的牌
    '); - dialog.push([event.list1.map(i => [get.type(i), "", i]), "vcard"]); - } - if (event.list2.length) { - dialog.push('
    本回合未使用过的牌
    '); - dialog.push([event.list2.map(i => [get.type(i), "", i]), "vcard"]); - } - player - .chooseButton(dialog, true, [1, 3]) - .set("ai", function (button) { - let name = button.link[2], - list = _status.event.list, - player = _status.event.player, - target = _status.event.getParent().target, - trigger = _status.event.getTrigger(), - getv = (name, player) => { - let v = trigger.getTempCache("sangu", player.id + name); - if (typeof v === "number") return v; - v = player.getUseValue({ name: name, storage: { sangu: true } }); - trigger.putTempCache("sangu", player.id + name, v); - return v; - }; - if (get.attitude(player, target) < 0) { - if (!list.includes(name)) return 0; - return -getv(name, target); - } else { - if (player.hp < 2 && !list.includes(name)) return 0; - let val = getv(name, target), - base = 5; - val = Math.min(15, val - base); - if (name === "wuzhong" || name === "dongzhuxianji") val += 15; - else if (name === "shunshou") val += 6; - return val; - } - }) - .set("list", event.list1); - "step 3"; - if (result.bool) { - var names = result.links.map(i => i[2]); - if (!target.storage.sangu_effect) target.storage.sangu_effect = []; - target.storage.sangu_effect = target.storage.sangu_effect.concat(names); - game.log(player, "为", target, "选择了", "#y" + get.translation(names)); - target.addTempSkill("sangu_effect", { player: "phaseUseAfter" }); - target.markSkill("sangu_effect"); - var bool = true; - for (var i of names) { - if (!event.used.includes(i)) { - bool = false; - break; - } - } - if (bool) { - target.addTempSkill("sangu_prevent", { player: "phaseUseAfter" }); - target.markAuto("sangu_prevent", [player]); - } - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage") && card.storage && card.storage.sangu) return "zeroplayertarget"; - }, - }, - }, - subSkill: { - effect: { - trigger: { player: "phaseUseBegin" }, - charlotte: true, - forced: true, - popup: false, - content: function () { - player.addTempSkill("sangu_viewas"); - }, - onremove: true, - intro: { - mark: function (dialog, storage, player) { - if (!storage || !storage.length) return "当前无可用牌"; - dialog.add([[storage[0]], "vcard"]); - if (storage.length > 1) dialog.addSmall([storage.slice(1), "vcard"]); - }, - content: "$", - }, - }, - viewas: { - mod: { - hiddenCard: function (player, name) { - var storage = player.getStorage("sangu_effect"); - if (storage.length) return name == storage[0]; - }, - cardname: function (card, player) { - if (_status.event.name != "chooseToUse" || _status.event.skill) return; - var storage = player.getStorage("sangu_effect"); - if (storage.length) return storage[0]; - }, - cardnature: function (card, player) { - if (_status.event.name != "chooseToUse" || _status.event.skill) return; - var storage = player.getStorage("sangu_effect"); - if (storage.length) return false; - }, - }, - trigger: { player: ["useCard", "respond"] }, - forced: true, - charlotte: true, - filter: function (event, player) { - return event.cards.length > 0 && player.getStorage("sangu_effect").length > 0; - }, - content: function () { - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.sangu = true; - player.unmarkAuto("sangu_effect", [player.getStorage("sangu_effect")[0]]); - }, - }, - prevent: { - trigger: { source: "damageBegin2" }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - return event.card && event.card.storage && event.card.storage.sangu && player.getStorage("sangu_prevent").includes(event.player); - }, - content: function () { - trigger.cancel(); - }, - }, - }, - }, - yizu: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - forced: true, - usable: 1, - filter: function (event, player) { - return player.isDamaged() && player.hp <= event.player.hp && (event.card.name == "sha" || event.card.name == "juedou"); - }, - content: function () { - player.recover(); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (target.isHealthy() || (card.name != "sha" && card.name != "juedou")) return; - if (target.storage.counttrigger && target.storage.counttrigger.yizu && current < 0) return 5; - if (player.hp < target.hp) return; - if (current > 0) return 1.2; - if (get.attitude(player, target) >= 0) return; - var copy = get.effect(target, { name: "shacopy" }, player, player); - if ( - copy > 0 && - player.isPhaseUsing() && - Math.min( - player.getCardUsable("sha"), - player.countCards("hs", function (card) { - return get.name(card) == "sha" && player.canUse(card, target, null, true); - }) - ) >= 2 - ) - return; - return [0, 2]; - }, - }, - }, - }, - //轲比能 - kousheng: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player - .chooseCard("h", [1, player.countCards("h")], get.prompt("kousheng"), "你可以选择任意张手牌,这些手牌于本回合内视为无次数限制的【杀】。但当有角色受到这些【杀】的伤害后,其可以用所有手牌交换剩余的牌。") - .set("standard", player.getUseValue({ name: "sha" }, null, true)) - .set("ai", function (card) { - var player = _status.event.player, - standard = _status.event.standard; - if (standard <= 0) return 0; - var eff = player.getUseValue(card, null, true); - if (eff <= standard) return standard - eff + 0.1; - return 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("kousheng"); - player.addGaintag(result.cards, "kousheng"); - player.addTempSkill("kousheng_effect"); - game.delayx(); - } - }, - subSkill: { - effect: { - audio: "kousheng", - trigger: { player: "useCard1" }, - forced: true, - charlotte: true, - firstDo: true, - filter: function (event, player) { - if (event.card.name != "sha") 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("kousheng")) return true; - } - return false; - }); - }, - content: function () { - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.kousheng = true; - if (trigger.addCount !== false) { - trigger.addCount = false; - player.getStat("card").sha--; - } - }, - onremove: function (player) { - player.removeGaintag("kousheng"); - }, - mod: { - cardUsable: function (card, player, target) { - if (card.name != "sha" || !card.cards) return; - for (var i of card.cards) { - if (i.hasGaintag("kousheng")) return Infinity; - } - }, - cardname: function (card) { - if (get.itemtype(card) == "card" && card.hasGaintag("kousheng")) return "sha"; - }, - cardnature: function (card) { - if (get.itemtype(card) == "card" && card.hasGaintag("kousheng")) return false; - }, - }, - group: "kousheng_damage", - }, - damage: { - audio: "kousheng", - trigger: { source: "damageSource" }, - forced: true, - filter: function (event, player) { - if (!event.card || !event.card.storage || !event.card.storage.kousheng || event.getParent().type != "card") return false; - var target = event.player; - return ( - target.isIn() && - player.hasCard(function (card) { - return card.hasGaintag("kousheng"); - }, "h") - ); - }, - content: function () { - "step 0"; - var target = trigger.player; - event.target = target; - var cards = player.getCards("h", function (card) { - return card.hasGaintag("kousheng"); - }); - event.cards = cards; - var str = get.translation(player); - player.showCards(cards, str + "的【寇旌】牌"); - if (target.countCards("h") > 0) - target.chooseBool("是否交换“寇旌”牌?", "用你的所有手牌交换" + str + "的下列“寇旌”牌:" + get.translation(cards)).set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().player; - if (player.hasShan() || player.countCards("hs", { name: ["tao", "jiu"] }) > 0 || get.attitude(player, target) >= 0) return false; - var hs1 = player.getCards("h"), - hs2 = _status.event.getParent().cards; - if (hs2.length >= player.hp) return true; - if (get.value(hs1, player) >= get.value(hs2, target)) return false; - return true; - }); - else event.finish(); - "step 1"; - if (result.bool) { - player.swapHandcards(target, cards, target.getCards("h")); - } - }, - }, - }, - }, - //陆凯 - lkbushi: { - audio: 2, - getBushi: function (player) { - if (!player.storage.lkbushi) return ["spade", "heart", "club", "diamond"]; - return player.storage.lkbushi; - }, - onremove: true, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - locked: false, - content: function () { - "step 0"; - var list = lib.skill.lkbushi.getBushi(player); - list = list.map(function (i) { - return ["", "", "lukai_" + i]; - }); - var next = player.chooseToMove("卜筮:是否调整〖卜筮〗的花色顺序?"); - next.set("list", [ - [ - "无次数限制/使用打出摸牌
    可弃牌无效/结束阶段获得", - [list, "vcard"], - function (list) { - var list2 = list.map(function (i) { - return get.translation(i[2].slice(6)); - }); - return "你使用" + list2[0] + "牌时无次数限制;使用或打出" + list2[1] + "时,摸一张牌;
    成为" + list2[2] + "牌目标后可弃一张牌无效;结束阶段获得一张" + list2[3] + "牌"; - }, - ], - ]); - next.set("processAI", function () { - var player = _status.event.player; - var list = lib.skill.lkbushi.getBushi(player); - var list2 = []; - var hs = player.getCards("hs", function (card) { - return player.hasValueTarget(card); - }); - list.sort(function (a, b) { - return hs.filter(i => get.suit(i) == b).length - hs.filter(i => get.suit(i) == a).length; - }); - list2.push(list.shift()); - hs = player.getCards("hs", "sha"); - list.sort(function (a, b) { - return hs.filter(i => get.suit(i) == b).length - hs.filter(i => get.suit(i) == a).length; - }); - list2.unshift(list.shift()); - list.randomSort(); - list2.addArray(list); - return [list2.map(i => ["", "", "lukai_" + i])]; - }); - "step 1"; - if (result.bool) { - var list = lib.skill.lkbushi.getBushi(player), - list2 = result.moved[0].map(function (i) { - return i[2].slice(6); - }); - for (var i = 0; i < 4; i++) { - if (list[i] != list2[i]) { - player.logSkill("lkbushi"); - player.storage.lkbushi = list2; - var str = "#g"; - for (var j = 0; j < 4; j++) { - str += get.translation(list2[j]); - if (j != 3) str += "/"; - } - game.log(player, "将", "#g【卜筮】", "的花色序列改为", str); - game.delayx(); - break; - } - } - } - }, - mark: true, - marktext: "筮", - intro: { - content: function (storage, player) { - var list = lib.skill.lkbushi.getBushi(player).map(i => get.translation(i)); - return "①你使用" + list[0] + "牌无次数限制。②当你使用或打出" + list[1] + "牌后,你摸一张牌。③当你成为" + list[2] + "牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张" + list[3] + "牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。"; - }, - }, - group: ["lkbushi_unlimit", "lkbushi_draw", "lkbushi_defend", "lkbushi_gain"], - subSkill: { - unlimit: { - mod: { - cardUsable: function (card, player) { - const list = lib.skill.lkbushi.getBushi(player), - suit = get.suit(card); - if (suit === "unsure" || list[0] === suit) return Infinity; - }, - }, - trigger: { player: "useCard1" }, - forced: true, - popup: false, - silent: true, - firstDo: true, - filter: function (event, player) { - if (event.addCount === false) return true; - var list = lib.skill.lkbushi.getBushi(player); - return list[0] == get.suit(event.card); - }, - content: function () { - trigger.addCount = false; - var stat = player.getStat().card, - name = trigger.card.name; - if (stat[name] && typeof stat[name] == "number") stat[name]--; - }, - }, - draw: { - audio: "lkbushi", - trigger: { player: ["useCard", "respond"] }, - forced: true, - locked: false, - filter: function (event, player) { - var list = lib.skill.lkbushi.getBushi(player); - return list[1] == get.suit(event.card); - }, - content: function () { - player.draw(); - }, - }, - defend: { - audio: "lkbushi", - trigger: { target: "useCardToTargeted" }, - direct: true, - filter: function (event, player) { - var list = lib.skill.lkbushi.getBushi(player); - return list[2] == get.suit(event.card) && !event.excluded.includes(player) && player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player - .chooseToDiscard("he", get.prompt("lkbushi"), "弃置一张牌,令" + get.translation(trigger.card) + "对你无效") - .set("ai", function (card) { - if (_status.event.eff >= 0) return false; - return -_status.event.eff * 1.1 - get.value(card); - }) - .set("eff", get.effect(player, trigger.card, trigger.player, player)).logSkill = ["lkbushi_defend", trigger.player]; - "step 1"; - if (result.bool) { - trigger.excluded.add(player); - } - }, - }, - gain: { - audio: "lkbushi", - trigger: { player: "phaseJieshuBegin" }, - forced: true, - locked: false, - content: function () { - var list = lib.skill.lkbushi.getBushi(player); - var card = get.cardPile(function (card) { - return get.suit(card, false) == list[3]; - }); - if (card) player.gain(card, "gain2"); - }, - }, - }, - }, - lkzhongzhuang: { - audio: 2, - trigger: { source: ["damageBegin1", "damageBegin4"] }, - forced: true, - filter: function (event, player, name) { - if (!event.card || event.card.name != "sha" || event.getParent().type != "card") return false; - var range = player.getAttackRange(); - if (name == "damageBegin1") return range > 3; - return range < 3 && event.num > 1; - }, - content: function () { - if (event.triggername == "damageBegin1") trigger.num++; - else trigger.num = 1; - }, - global: "lkzhongzhuang_ai", - subSkill: { - ai: { - ai: { - filterDamage: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.card && arg.card.name == "sha") { - if (arg.player && arg.player.hasSkill("lkzhongzhuang") && arg.player.getAttackRange() < 3) return true; - } - return false; - }, - }, - }, - }, - }, - //顾雍 - olbingyi: { - audio: "bingyi", - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - return event.type == "discard" && event.getl(player).cards2.length > 0 && player.countCards("h") > 0 && !player.hasSkill("olbingyi_blocker", null, null, false); - }, - prompt2: function (event, player) { - var str = "展示所有手牌,然后", - hs = player.getCards("h"); - var color = get.color(hs); - if (color == "none") return str + "无事发生"; - str += "令至多" + get.cnNumber(hs.length) + "名其他角色和自己各摸一张牌"; - return str; - }, - check: function (event, player) { - var color = get.color(player.getCards("h")); - return color != "none"; - }, - content: function () { - "step 0"; - player.addTempSkill("olbingyi_blocker", ["phaseZhunbeiAfter", "phaseJudgeAfter", "phaseDrawAfter", "phaseUseAfter", "phaseDiscardAfter", "phaseJieshuAfter"]); - player.showHandcards(get.translation(player) + "发动了【秉壹】"); - if (get.color(player.getCards("h")) == "none") event.finish(); - "step 1"; - var num = player.countCards("h"); - player.chooseTarget([1, num], "令至多" + get.cnNumber(num) + "名角色也各摸一张牌", lib.filter.notMe).set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); - if (target.hasSkillTag("nogain")) att /= 10; - return att; - }); - "step 2"; - var targets = [player]; - if (result.bool) { - targets.addArray(result.targets); - player.line(targets, "green"); - game.asyncDraw(targets.sortBySeat()); - } else { - player.draw(); - event.finish(); - } - "step 3"; - game.delayx(); - }, - subSkill: { blocker: { charlotte: true } }, - }, - //孙体 - xinzhaofu: { - audio: "zhaofu", - enable: "phaseUse", - usable: 1, - mark: true, - limited: true, - skillAnimation: true, - animationColor: "wood", - selectTarget: [1, 2], - filterTarget: lib.filter.notMe, - zhuSkill: true, - contentBefore: function () { - player.awakenSkill("xinzhaofu"); - }, - content: function () { - target.addSkill("xinzhaofu_effect"); - target.markAuto("xinzhaofu_effect", [player]); - }, - ai: { - order: 9, - result: { - target: function (player, target) { - var targets = game.filterPlayer(function (current) { - return current.group == "wu" && get.attitude(player, current) > 0; - }); - if (targets.length) { - for (var targetx of targets) { - if (!targetx.inRange(target)) return -1; - } - return -0.5; - } - return 0; - }, - }, - }, - subSkill: { - effect: { - charlotte: true, - mark: true, - intro: { content: "已视为在其他吴势力角色的攻击范围内" }, - mod: { - inRangeOf: function (from, to) { - if (from.group != "wu") return; - var list = to.getStorage("xinzhaofu_effect"); - for (var i of list) { - if (i != from) return true; - } - }, - }, - }, - }, - }, - xinkuangbi: { - audio: "kuangbi", - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player && target.countCards("he") > 0; - }, - content: function () { - "step 0"; - target.chooseCard("he", [1, 3], "匡弼:交给" + get.translation(player) + "一至三张牌", true).set("ai", function (card) { - if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { - return 7 - get.value(card); - } - return -get.value(card); - }); - "step 1"; - if (result.bool) { - target.give(result.cards, player, "giveAuto").gaintag.add("xinkuangbi_keep"); - player.addTempSkill("xinkuangbi_keep"); - target.addSkill("xinkuangbi_draw"); - target.addMark("xinkuangbi_draw", result.cards.length, false); - } - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (get.attitude(player, target) > 0) { - return Math.sqrt(target.countCards("he")); - } - return 0; - }, - player: 1, - }, - }, - subSkill: { - keep: { - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("xinkuangbi_keep")) return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("xinkuangbi_keep")) return false; - }, - }, - charlotte: true, - onremove: function (player) { - player.removeGaintag("xinkuangbi_keep"); - }, - }, - draw: { - trigger: { player: "phaseBegin" }, - forced: true, - charlotte: true, - onremove: true, - intro: { - content: "下回合开始时摸#张牌", - }, - content: function () { - player.draw(player.countMark("xinkuangbi_draw")); - player.removeSkill("xinkuangbi_draw"); - }, - }, - }, - }, - rejingce: { - audio: "jingce", - trigger: { player: "phaseUseEnd" }, - frequent: true, - filter: function (event, player) { - return ( - player.getHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == event; - }).length > 0 - ); - }, - content: function () { - var list = []; - player.getHistory("useCard", function (evt) { - if (evt.getParent("phaseUse") == trigger) list.add(get.type2(evt.card)); - }); - player.draw(list.length); - }, - group: "rejingce_add", - }, - rejingce_add: { - trigger: { player: "loseEnd" }, - silent: true, - firstDo: true, - filter: function (event, player) { - if (event.getParent().name != "useCard" || player != _status.currentPhase) return false; - var list = player.getStorage("rejingce2"); - for (var i of event.cards) { - if (!list.includes(get.suit(i, player))) return true; - } - return false; - }, - content: function () { - if (!player.storage.rejingce2) player.storage.rejingce2 = []; - for (var i of trigger.cards) player.storage.rejingce2.add(get.suit(i, player)); - player.storage.rejingce2.sort(); - player.addTempSkill("rejingce2"); - player.markSkill("rejingce2"); - }, - }, - rejingce2: { - onremove: true, - intro: { - content: "当前已使用花色:$", - }, - mod: { - maxHandcard: function (player, num) { - return num + player.getStorage("rejingce2").length; - }, - }, - }, - rejueqing: { - audio: 2, - trigger: { source: "damageBegin2" }, - skillAnimation: true, - animationColor: "water", - filter: function (event, player) { - return player != event.player && !player.storage.rejueqing_rewrite; - }, - prompt2: function (event, player) { - var num = get.cnNumber(2 * event.num, true); - return "令即将对其造成的伤害翻倍至" + num + "点,并令自己失去" + get.cnNumber(event.num) + "点体力"; - }, - check: function (event, player) { - return ( - player.hp > event.num && - event.player.hp > event.num && - !event.player.hasSkillTag("filterDamage", null, { - player: player, - card: event.card, - }) && - get.attitude(player, event.player) < 0 - ); - }, - locked: function (skill, player) { - return player && player.storage.rejueqing_rewrite; - }, - logTarget: "player", - content: function () { - player.loseHp(trigger.num); - trigger.num *= 2; - player.storage.rejueqing_rewrite = true; - }, - derivation: "rejueqing_rewrite", - group: "rejueqing_rewrite", - subSkill: { - rewrite: { - trigger: { source: "damageBefore" }, - forced: true, - charlotte: true, - audio: "rejueqing", - filter: function (event, player) { - return player.storage.rejueqing_rewrite == true; - }, - check: function () { - return false; - }, - content: function () { - trigger.cancel(); - trigger.player.loseHp(trigger.num); - }, - ai: { - jueqing: true, - skillTagFilter: function (player) { - return player.storage.rejueqing_rewrite == true; - }, - }, - }, - }, - }, - reshangshi: { - audio: 2, - trigger: { - player: ["loseAfter", "changeHp", "gainMaxHpAfter", "loseMaxHpAfter"], - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - frequent: true, - prompt: function (event, player) { - return "是否发动【伤逝】将手牌摸至" + get.cnNumber(player.getDamagedHp()) + "张?"; - }, - prompt2: false, - filter: function (event, player) { - if (event.getl && !event.getl(player)) return false; - return player.countCards("h") < player.getDamagedHp(); - }, - content: function () { - player.draw(player.getDamagedHp() - player.countCards("h")); - }, - ai: { - noh: true, - skillTagFilter: function (player, tag) { - if (tag == "noh" && player.maxHp - player.hp < player.countCards("h")) { - return false; - } - }, - }, - group: "reshangshi_2nd", - }, - reshangshi_2nd: { - trigger: { player: "damageBegin3" }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - player - .chooseToDiscard("是否发动【伤逝】弃置一张牌?", "he") - .set("logSkill", "reshangshi") - .set("ai", function (card) { - var player = _status.event.player; - if (player.countCards("h") > player.getDamagedHp() + _status.event.getTrigger().num) return 1; - if (player.isPhaseUsing()) return 0.1 - player.getUseValue(card, null, true) / Math.max(0.1, get.value(card)); - return (get.position(card) == "h" ? 5 : 0.1) - get.value(card); - }); - }, - }, - oldzhenlie: { - audio: 2, - trigger: { player: "judge" }, - check: function (event, player) { - return event.judge(player.judging[0]) < 0; - }, - content: function () { - "step 0"; - var card = get.cards()[0]; - event.card = card; - game.cardsGotoOrdering(card).relatedEvent = trigger; - "step 1"; - player.$throw(card); - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = card; - game.log(trigger.player, "的判定牌改为", card); - game.delay(2); - }, - }, - oldmiji: { - trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, - audio: 2, - filter: function (event, player) { - return player.isDamaged(); - }, - content: function () { - "step 0"; - player.judge(function (card) { - return get.color(card) == "black" ? 1 : -1; - }).judge2 = function (result) { - return result.bool; - }; - "step 1"; - if (result.bool && player.maxHp > player.hp) { - var cards = get.cards(player.maxHp - player.hp); - event.cards = cards; - player - .chooseTarget(true) - .set("ai", function (target) { - return get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); - }) - .set("createDialog", ["请选择一名角色获得这些牌", event.cards]); - } else { - event.finish(); - } - "step 2"; - player.line(result.targets); - result.targets[0].gain(event.cards, "draw"); - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.tag(card, "recover") && target.hp == target.maxHp - 1) return [0, 0]; - if (target.hasFriend()) { - if ((get.tag(card, "damage") == 1 || get.tag(card, "loseHp")) && target.hp == target.maxHp) return [0, 1]; - } - }, - }, - threaten: function (player, target) { - if (target.hp == 1) return 3; - if (target.hp == 2) return 2; - return 1; - }, - }, - }, - oldqianxi: { - audio: 2, - trigger: { source: "damageBegin2" }, - check: function (event, player) { - var att = get.attitude(player, event.player); - if (event.player.hp == event.player.maxHp) return att < 0; - if (event.player.hp == event.player.maxHp - 1 && (event.player.maxHp <= 3 || event.player.hasSkillTag("maixie"))) return att < 0; - return att > 0; - }, - filter: function (event, player) { - return event.card && event.card.name == "sha" && get.distance(player, event.player) <= 1; - }, - logTarget: "player", - content: function () { - "step 0"; - player.judge(function (card) { - return get.suit(card) != "heart" ? 1 : -1; - }).judge2 = function (result) { - return result.bool; - }; - "step 1"; - if (result.bool) { - trigger.cancel(); - trigger.player.loseMaxHp(true); - } - }, - }, - old_fuhun: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - "step 0"; - trigger.changeToZero(); - "step 1"; - var cards = get.cards(2); - event.cards = cards; - player.showCards(cards, get.translation(player) + "发动了【父魂】"); - "step 2"; - player.gain(cards, "gain2"); - if (get.color(cards[0]) != get.color(cards[1])) { - player.addTempSkills(["wusheng", "paoxiao"]); - } - }, - derivation: ["wusheng", "paoxiao"], - }, - shiyong: { - audio: 2, - trigger: { player: "damageEnd" }, - forced: true, - check: function () { - return false; - }, - filter: function (event, player) { - return event.card && event.card.name == "sha" && (get.color(event.card) == "red" || event.getParent(2).jiu == true); - }, - content: function () { - player.loseMaxHp(); - }, - ai: { - neg: true, - }, - }, - xindanshou: { - audio: 2, - trigger: { - global: "phaseJieshuBegin", - target: "useCardToTargeted", - }, - direct: true, - filter: function (event, player, name) { - return ((name == "phaseJieshuBegin" && event.player != player && player.countCards("he") >= event.player.countCards("h")) || (event.targets && event.targets.includes(player) && ["basic", "trick"].includes(get.type(event.card, "trick")))) && !player.hasSkill("xindanshou_as"); - }, - content: function () { - "step 0"; - if (event.triggername == "phaseJieshuBegin") { - var num = trigger.player.countCards("h"); - if (num > 0) - player - .chooseToDiscard(get.prompt("xindanshou", trigger.player), num, "弃置" + get.cnNumber(num) + "张牌并对" + get.translation(trigger.player) + "造成1点伤害", "he") - .set("logSkill", ["xindanshou", trigger.player]) - .set("ai", function (card) { - if (get.damageEffect(_status.event.getTrigger().player, _status.event.player, _status.event.player) > 0) return Math.max(5.5, 8 - _status.event.selectTarget) - get.value(card); - return -1; - }); - else - player.chooseBool(get.prompt("xindanshou", trigger.player), "对" + get.translation(trigger.player) + "造成1点伤害").ai = function () { - return get.damageEffect(trigger.player, player, player) > 0; - }; - } else { - var num = 0; - game.countPlayer2(function (current) { - var history = current.getHistory("useCard"); - for (var j = 0; j < history.length; j++) { - if (["basic", "trick"].includes(get.type(history[j].card, "trick")) && history[j].targets && history[j].targets.includes(player)) num++; - } - }); - event.num = num; - player - .chooseBool(get.prompt("xindanshou") + "(可摸" + get.cnNumber(num) + "张牌)", get.translation("xindanshou_info")) - .set("ai", function () { - return _status.event.choice; - }) - .set( - "choice", - (function () { - if (player.isPhaseUsing()) { - if ( - player.countCards("h", function (card) { - return ["basic", "trick"].includes(get.type(card, "trick")) && player.canUse(card, player, null, true) && get.effect(player, card, player) > 0 && player.getUseValue(card, null, true) > 0; - }) - ) - return false; - return true; - } - if (num > 2) return true; - var card = trigger.card; - if (get.tag(card, "damage") && player.hp <= trigger.getParent().baseDamage && (!get.tag(card, "respondShan") || !player.hasShan()) && (!get.tag(card, "respondSha") || !player.hasSha())) return true; - var source = _status.currentPhase, - todis = source.countCards("h") - source.needsToDiscard(); - if ( - todis <= - Math.max( - Math.min( - 2 + (source.hp <= 1 ? 1 : 0), - player.countCards("he", function (card) { - return get.value(card, player) < Math.max(5.5, 8 - todis); - }) - ), - player.countCards("he", function (card) { - return get.value(card, player) <= 0; - }) - ) && - get.damageEffect(source, player, player) > 0 - ) - return false; - if (!source.isPhaseUsing() || get.attitude(player, source) > 0) return true; - if (card.name == "sha" && !source.getCardUsable("sha")) return true; - return Math.random() < num / 3; - })() - ); - } - "step 1"; - if (result.bool) { - if (!result.cards || !result.cards.length) { - player.logSkill("xindanshou", trigger.player); - } - if (event.triggername == "useCardToTargeted") { - player.draw(num); - player.addTempSkill("xindanshou_as"); - } else { - trigger.player.damage("nocard"); - } - } - }, - subSkill: { as: { sub: true } }, - ai: { - threaten: 0.6, - effect: { - target: function (card, player, target, current) { - if (typeof card != "object" || target.hasSkill("xindanshou_as") || !["basic", "trick"].includes(get.type(card, "trick"))) return; - var num = 0; - game.countPlayer2(function (current) { - var history = current.getHistory("useCard"); - for (var j = 0; j < history.length; j++) { - if (["basic", "trick"].includes(get.type(history[j].card, "trick")) && history[j].targets && history[j].targets.includes(player)) num++; - } - }); - if (player == target && current > 0) return [1.1, num]; - return [0.9, num]; - }, - }, - }, - }, - xinbenxi: { - group: ["xinbenxi_summer", "xinbenxi_damage"], - audio: 2, - trigger: { - player: "useCard2", - }, - forced: true, - mod: { - globalFrom: function (from, to, distance) { - if (_status.currentPhase == from) { - return distance - from.storage.xinbenxi; - } - }, - wuxieRespondable: function (card, player, target, current) { - if (player != current && player.storage.xinbenxi_directHit.includes(card)) { - return false; - } - }, - }, - init: function (player) { - player.storage.xinbenxi_directHit = []; - player.storage.xinbenxi_damage = []; - player.storage.xinbenxi_unequip = []; - player.storage.xinbenxi = 0; - }, - filter: function (trigger, player) { - return ( - _status.currentPhase == player && - trigger.targets && - trigger.targets.length == 1 && - (get.name(trigger.card) == "sha" || get.type(trigger.card) == "trick") && - !game.hasPlayer(function (current) { - return get.distance(player, current) > 1; - }) - ); - }, - filterx: function (event, player) { - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var list = ["为XXX多选择一个目标", " 令XXX无视防具牌 ", " 令XXX不可被抵消 ", "当XXX造成伤害时摸牌"], - card = get.translation(trigger.card); - for (var i = 0; i < list.length; i++) { - list[i] = [i, list[i].replace(/XXX/g, card)]; - } - var next = player.chooseButton(["奔袭:请选择一至两项", [list.slice(0, 2), "tdnodes"], [list.slice(2, 4), "tdnodes"]]); - next.set("forced", true); - next.set("selectButton", [1, 2]); - next.set("filterButton", function (button) { - if (button.link == 0) { - return _status.event.bool1; - } - return true; - }); - next.set("bool1", lib.skill.xinbenxi.filterx(trigger, player)); - next.set("ai", function (button) { - var player = _status.event.player; - var event = _status.event.getTrigger(); - switch (button.link) { - case 0: { - if ( - game.hasPlayer(function (current) { - return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current) && get.effect(current, event.card, player, player) > 0; - }) - ) - return 1.6 + Math.random(); - return 0; - } - case 1: { - if ( - event.targets.filter(function (current) { - var eff1 = get.effect(current, event.card, player, player); - player._xinbenxi_ai = true; - var eff2 = get.effect(current, event.card, player, player); - delete player._xinbenxi_ai; - return eff1 > eff2; - }).length - ) - return 1.9 + Math.random(); - return Math.random(); - } - case 2: { - var num = 1.3; - if ( - event.card.name == "sha" && - event.targets.filter(function (current) { - if ( - current.mayHaveShan( - player, - "use", - current.getCards("h", i => { - return i.hasGaintag("sha_notshan"); - }) - ) && - get.attitude(player, current) <= 0 - ) { - if (current.hasSkillTag("useShan")) num = 1.9; - return true; - } - return false; - }).length - ) - return num + Math.random(); - return 0.5 + Math.random(); - } - case 3: { - return (get.tag(event.card, "damage") || 0) + Math.random(); - } - } - }); - "step 1"; - var map = [ - function (trigger, player, event) { - player - .chooseTarget("请选择" + get.translation(trigger.card) + "的额外目标", true, function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card, player, target); - }) - .set("targets", trigger.targets) - .set("card", trigger.card) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }); - }, - function (trigger, player, event) { - player.storage.xinbenxi_unequip.add(trigger.card); - }, - function (trigger, player, event) { - player.storage.xinbenxi_directHit.add(trigger.card); - trigger.nowuxie = true; - trigger.customArgs.default.directHit2 = true; - }, - function (trigger, player, event) { - player.storage.xinbenxi_damage.add(trigger.card); - }, - ]; - for (var i = 0; i < result.links.length; i++) { - game.log(player, "选择了", "#g【奔袭】", "的", "#y选项" + get.cnNumber(result.links[i] + 1, true)); - map[result.links[i]](trigger, player, event); - } - if (!result.links.includes(0)) event.finish(); - "step 2"; - if (result.targets) { - player.line(result.targets); - trigger.targets.addArray(result.targets); - } - }, - ai: { - unequip: true, - unequip_ai: true, - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (tag == "unequip") { - if (arg && player.storage.xinbenxi_unequip.includes(arg.card)) return true; - return false; - } - if ( - _status.currentPhase != player || - game.hasPlayer(function (current) { - return get.distance(player, current) > 1; - }) - ) - return false; - if (tag == "directHit_ai") return arg.card.name == "sha"; - if (!arg || !arg.card || (arg.card.name != "sha" && arg.card.name != "chuqibuyi")) return false; - var card = arg.target.getEquip(2); - if (card && card.name.indexOf("bagua") != -1) return true; - if (player._xinbenxi_ai) return false; - }, - }, - subSkill: { - damage: { - sub: true, - trigger: { global: "damageBegin1" }, - audio: 2, - forced: true, - filter: function (event, player) { - return event.card && player.storage.xinbenxi_damage.includes(event.card); - }, - content: function () { - player.draw(); - }, - }, - summer: { - sub: true, - trigger: { player: ["phaseAfter", "useCardAfter", "useCard"] }, - silent: true, - filter: function (event, player) { - return player == _status.currentPhase; - }, - content: function () { - if (trigger.name == "phase") { - player.storage.xinbenxi = 0; - return; - } else if (event.triggername == "useCard") { - player.logSkill("xinbenxi"); - player.storage.xinbenxi++; - player.syncStorage("xinbenxi"); - return; - } else { - player.storage.xinbenxi_unequip.remove(event.card); - player.storage.xinbenxi_directHit.remove(event.card); - player.storage.xinbenxi_damage.remove(event.card); - } - }, - }, - }, - }, - xinyaoming: { - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - filter: function (event, player) { - return game.hasPlayer(function (target) { - return ["摸牌", "弃牌", "制衡"].some(function (control) { - var storage = player.getStorage("xinyaoming_kanon"); - if (storage.includes(control)) return false; - if (control == "摸牌" && target != player) return true; - if (control == "弃牌" && target != player && target.countCards("h")) return true; - if (control == "制衡") return true; - return false; - }); - }); - }, - direct: true, - content: function () { - "step 0"; - var func = function () { - game.countPlayer(function (target) { - var list = ["摸牌", "弃牌", "制衡"].filter(function (control) { - var storage = player.getStorage("xinyaoming_kanon"); - if (storage.includes(control)) return false; - if (control == "摸牌" && target != player) return true; - if (control == "弃牌" && target != player && target.countCards("h")) return true; - if (control == "制衡") return true; - return false; - }), - str = ""; - for (var i of list) str += i + "
    "; - str = str.slice(0, -4); - target.prompt(str); - }); - }; - if (event.player == game.me) func(); - else if (event.isOnline()) player.send(func); - player - .chooseTarget(get.prompt2("xinyaoming"), function (card, player, target) { - var storage = player.getStorage("xinyaoming_kanon"); - if (!storage.includes("制衡")) return true; - if (target == player) return false; - return !storage.includes("摸牌") || target.countCards("h"); - }) - .set("ai", function (target) { - var player = _status.event.player; - var storage = player.getStorage("xinyaoming_kanon"); - if (get.attitude(player, target) > 0 && !storage.includes("摸牌") && target != player) return get.effect(target, { name: "draw" }, player, player); - if (get.attitude(player, target) < 0 && !storage.includes("弃牌") && target != player && target.countCards("h")) return get.effect(target, { name: "guohe_copy2" }, player, player); - if (get.attitude(player, target) > 0 && !storage.includes("制衡")) return get.effect(target, { name: "kaihua" }, player, player); - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("xinyaoming", target); - var controls = ["摸牌", "弃牌", "制衡"].filter(function (control) { - var storage = player.getStorage("xinyaoming_kanon"); - if (storage.includes(control)) return false; - if (control == "摸牌" && target != player) return true; - if (control == "弃牌" && target != player && target.countCards("h")) return true; - if (control == "制衡") return true; - return false; - }); - if (controls.length == 1) event._result = { control: controls[0] }; - else { - var str = get.translation(target); - var choiceList = ["令" + str + "摸一张牌", "弃置" + str + "一张手牌", "令" + str + "弃置至多两张牌,然后其摸等量的牌"]; - var list = ["摸牌", "弃牌", "制衡"]; - for (var i = 0; i < 3; i++) { - if (!controls.includes(list[i])) { - choiceList[i] = '' + choiceList[i] + ""; - } - } - player - .chooseControl(controls) - .set("choiceList", choiceList) - .set("ai", function () { - var player = _status.event.player; - var target = _status.event.target; - var controls = _status.event.controls.slice(); - var map = { - 摸牌: get.effect(target, { name: "draw" }, player, player), - 弃牌: get.effect(target, { name: "guohe_copy2" }, player, player), - 制衡: get.effect(target, { name: "kaihua" }, player, player), - }; - controls.sort((a, b) => map[b] - map[a]); - return controls[0]; - }) - .set("target", target); - } - } else event.finish(); - "step 2"; - player.addTempSkill("xinyaoming_kanon"); - player.markAuto("xinyaoming_kanon", [result.control]); - switch (result.control) { - case "摸牌": - target.draw(); - break; - case "弃牌": - player.discardPlayerCard(target, "h", true); - break; - case "制衡": - target.chooseToDiscard([1, 2], "he", "邀名:弃置至多两张牌,然后摸等量的牌", true).set("ai", card => lib.skill.zhiheng.check(card)); - break; - } - if (result.control != "制衡") event.finish(); - "step 3"; - if (result.bool) { - target.draw(result.cards.length); - } - }, - subSkill: { - kanon: { - charlotte: true, - onremove: true, - }, - }, - }, - xinfuli: { - audio: 2, - skillAnimation: true, - animationColor: "soil", - unique: true, - limited: true, - enable: "chooseToUse", - mark: true, - filter: function (event, player) { - if (event.type != "dying") return false; - if (player != event.dying) return false; - return true; - }, - content: function () { - "step 0"; - player.awakenSkill("xinfuli"); - event.num = game.countGroup(); - player.recover(event.num - player.hp); - "step 1"; - var num2 = num - player.countCards("h"); - if (num2) player.draw(num2); - "step 2"; - if (num > 2) player.turnOver(); - player.storage.xinfuli = true; - }, - ai: { - save: true, - skillTagFilter: function (player, arg, target) { - return player == target; - }, - result: { - player: 10, - }, - threaten: function (player, target) { - if (!target.storage.xinfuli) return 0.9; - }, - }, - intro: { - content: "limited", - }, - }, - xindangxian: { - trigger: { player: "phaseBegin" }, - forced: true, - audio: "dangxian", - audioname: ["guansuo", "xin_liaohua", "re_liaohua"], - audioname2: { - dc_guansuo: "dangxian_guansuo", - }, - content: function () { - trigger.phaseList.splice(trigger.num, 0, "phaseUse|xindangxian"); - }, - group: "xindangxian_rewrite", - subSkill: { - rewrite: { - trigger: { player: "phaseUseBegin" }, - forced: true, - popup: false, - filter: function (kagari) { - return kagari._extraPhaseReason == "xindangxian"; - }, - content: function () { - "step 0"; - if (player.storage.xinfuli) { - player.chooseBool("是否失去1点体力并获得一张【杀】?").ai = function () { - return player.hp > 2 && !player.hasSha(); - }; - } else event._result = { bool: true }; - "step 1"; - if (!result.bool) { - event.finish(); - return; - } - player.loseHp(); - "step 2"; - var card = get.cardPile(function (card) { - return card.name == "sha"; - }); - if (card) player.gain(card, "gain2"); - "step 3"; - game.updateRoundNumber(); - }, - }, - }, - }, - dangxian_guansuo: { audio: 2 }, - xinjunxing: { - inherit: "junxing", - audio: "junxing", - content: function () { - "step 0"; - var types = []; - for (var i = 0; i < cards.length; i++) { - types.add(get.type(cards[i], "trick", player)); - } - target - .chooseToDiscard(function (card) { - return !_status.event.types.includes(get.type(card, "trick")); - }) - .set("ai", function (card) { - if (_status.event.player.isTurnedOver()) return -1; - return 8 - get.value(card); - }) - .set("types", types) - .set("dialog", ["弃置一张与" + get.translation(player) + "弃置的牌类别均不同的牌,或将武将牌翻面", "hidden", cards]); - "step 1"; - if (!result.bool) { - target.turnOver(); - } else event.finish(); - "step 2"; - var num = 4 - target.countCards("h"); - if (num) target.draw(num); - }, - }, - xinzhige: { - enable: "phaseUse", - usable: 1, - audio: "zhige", - position: "he", - selectTarget: 2, - multitarget: true, - targetprompt: ["出杀人", "出杀目标"], - filterTarget: function (card, player, target) { - if (ui.selected.targets.length == 0) { - return target != player && target.inRange(player); - } else { - return ui.selected.targets[0].inRange(target); - } - }, - content: function () { - "step 0"; - targets[0].chooseCard("交给" + get.translation(player) + "一张【杀】或武器牌,否则视为对" + get.translation(targets[1]) + "使用一张【杀】", "he", function (card) { - return get.name(card) == "sha" || get.subtype(card) == "equip1"; - }).ai = function (card) { - var player = _status.event.player; - var target = _status.event.getParent("xinzhige").targets[1]; - return get.effect(target, { name: "sha" }, player, player) >= 0 ? -1 : 9 - get.value(card); - }; - "step 1"; - if (result.bool) { - targets[0].give(result.cards, player, "give"); - } else { - if (targets[0].canUse("sha", targets[1])) targets[0].useCard({ name: "sha", isCard: true }, targets[1]); - } - }, - ai: { - result: { - target: function (player, target) { - if (ui.selected.targets.length) { - var from = ui.selected.targets[0]; - return get.effect(target, { name: "sha" }, from, target); - } - var effs = [0, 0]; - game.countPlayer(function (current) { - if (current != target && target.canUse("sha", current)) { - var eff = get.effect(current, { name: "sha" }, target, target); - if (eff > effs[0]) effs[0] = eff; - if (eff < effs[1]) effs[1] = eff; - } - }); - return effs[get.attitude(player, target) > 0 ? 0 : 1]; - }, - }, - order: 8.5, - expose: 0.2, - }, - }, - xinzongzuo: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - audio: "zongzuo", - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - var num = game.countGroup(); - player.gainMaxHp(num); - event.num = num; - "step 1"; - player.recover(event.num); - //player.update(); - }, - group: "xinzongzuo_lose", - subSkill: { - lose: { - trigger: { global: "dieAfter" }, - forced: true, - audio: "zongzuo", - filter: function (event, player) { - if (!lib.group.includes(event.player.group)) return false; - if ( - game.hasPlayer(function (current) { - return current.group == event.player.group; - }) - ) { - return false; - } - return true; - }, - content: function () { - "step 0"; - player.loseMaxHp(); - "step 1"; - player.draw(2); - }, - }, - }, - }, - xintaoluan: { - hiddenCard: function (player, name) { - return !player.getStorage("xintaoluan").includes(name) && player.countCards("hes") > 0 && !player.hasSkill("xintaoluan3") && lib.inpile.includes(name); - }, - audio: "taoluan", - enable: "chooseToUse", - filter: function (event, player) { - return ( - !player.hasSkill("xintaoluan3") && - player.hasCard(card => - lib.inpile.some(name => { - if (player.getStorage("xintaoluan").includes(name)) return false; - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - if (event.filterCard({ name: name, isCard: true, cards: [card] }, player, event)) return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - if (event.filterCard({ name: name, nature: nature, isCard: true, cards: [card] }, player, event)) return true; - } - } - return false; - }, "hes") - ) > 0 && - !_status.dying.length - ); - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var name of lib.inpile) { - if (get.type(name) == "basic" || get.type(name) == "trick") { - if (player.getStorage("xintaoluan").includes(name)) continue; - list.push([get.translation(get.type(name)), "", name]); - if (name == "sha") { - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } - } - } - 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) { - var player = _status.event.player; - var card = { name: button.link[2], nature: button.link[3] }; - if (player.countCards("hes", cardx => cardx.name == card.name)) return 0; - return _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; - }, - backup: function (links, player) { - return { - filterCard: true, - audio: "taoluan", - popname: true, - check: function (card) { - return 7 - get.value(card); - }, - position: "hes", - viewAs: { name: links[0][2], nature: links[0][3] }, - onuse: function (result, player) { - var evt = _status.event.getParent("phase"); - if (evt && evt.name == "phase" && !evt.xintaoluan) { - evt.xintaoluan = true; - var next = game.createEvent("xintaoluan_clear"); - _status.event.next.remove(next); - evt.after.push(next); - next.player = player; - next.setContent(function () { - delete player.storage.xintaoluan; - delete player.storage.xintaoluan2; - }); - } - player.markAuto("xintaoluan", [result.card.name]); - }, - }; - }, - prompt: function (links, player) { - return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; - }, - }, - ai: { - order: 4, - save: true, - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - if (!player.countCards("hes") || player.hasSkill("taoluan3")) return false; - if (tag == "respondSha" || tag == "respondShan") { - if (arg == "respond") return false; - return !player.getStorage("taoluan").includes(tag == "respondSha" ? "sha" : "shan"); - } - return !player.getStorage("taoluan").includes("tao") || (!player.getStorage("taoluan").includes("jiu") && arg == player); - }, - result: { - player: function (player) { - var num = player.countMark("xintaoluan2"); - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != player && players[i].countCards("he") > (num + 1) * 2 && get.attitude(player, players[i]) > 0) { - return 1; - } - } - return 0; - }, - }, - threaten: 1.9, - }, - group: "xintaoluan2", - }, - xintaoluan2: { - trigger: { player: ["useCardAfter", "respondAfter"] }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - if (!game.hasPlayer(current => current != player)) return false; - return event.skill == "xintaoluan_backup"; - }, - content: function () { - "step 0"; - player.addMark("xintaoluan2", 1, false); - event.num = player.countMark("xintaoluan2"); - player - .chooseTarget( - true, - function (card, player, target) { - return target != player; - }, - '滔乱

    令一名其他角色选择一项:1.交给你' + get.cnNumber(event.num) + "张与你以此法使用的牌类别不同的牌;2.你失去" + get.cnNumber(event.num) + "点体力" - ) - .set("ai", function (target) { - var player = _status.event.player; - if (get.attitude(player, target) > 0) { - if (get.attitude(target, player) > 0) { - return target.countCards("h"); - } - return target.countCards("h") / 2; - } - return 0; - }); - "step 1"; - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - var type = get.type(trigger.card, "trick"); - target - .chooseCard('滔乱

    交给' + get.translation(player) + get.cnNumber(num) + "张不为" + get.translation(type) + "牌的牌,或令其失去" + get.cnNumber(num) + "点体力且滔乱无效直到回合结束", "he", num, function (card, player, target) { - return get.type(card, "trick") != _status.event.cardType; - }) - .set("cardType", type) - .set("ai", function (card) { - if (_status.event.att) { - return 11 - get.value(card); - } - return 0; - }) - .set("att", get.attitude(target, player) > 0); - "step 2"; - var target = event.target; - if (result.bool) { - target.give(result.cards, player, "give"); - } else { - player.addTempSkill("xintaoluan3"); - player.loseHp(num); - } - }, - }, - xintaoluan3: { charlotte: true }, - xintaoluan_backup: {}, - xincaishi: { - trigger: { - player: "phaseDrawBegin2", - }, - audio: "caishi", - direct: true, - content: function () { - "step 0"; - var choiceList = ["手牌上限-1且发动【忠鉴】时可以多展示对方的一张牌"]; - if (!trigger.numFixed) { - choiceList.push("摸牌阶段多摸两张牌,然后本回合内不能发动【忠鉴】"); - if (trigger.num > 0) { - choiceList.unshift("摸牌阶段少摸一张牌,发动【忠鉴】时可以多展示自己的一张牌直到回合结束"); - event.first = true; - } - } - var next = player.chooseControl("cancel2"); - next.set("choiceList", choiceList); - next.set("prompt", get.prompt("xincaishi")); - next.set("ai", function () { - return 2; - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("xincaishi"); - if (!event.first) result.index++; - trigger.num += result.index > 1 ? 2 : result.index - 1; - player.addTempSkill("xincaishi_" + result.index); - } - }, - subSkill: { - 0: { - mark: true, - intro: { - content: "发动【忠鉴】时可以多展示自己的一张牌", - }, - }, - 1: { - mark: true, - intro: { - content: "发动【忠鉴】时可以多展示目标角色的一张牌", - }, - mod: { - maxHandcard: function (player, num) { - return num - 1; - }, - }, - }, - 2: { - mark: true, - intro: { - content: "不能发动【忠鉴】直到回合结束", - }, - }, - }, - }, - xinzhongjian: { - audio: "zhongjian", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return !player.hasSkill("xincaishi_2") && player.countCards("h") > 0; - }, - filterTarget: function (event, player, target) { - return target != player && target.countCards("h") > 0; - }, - filterCard: true, - selectCard: function () { - return _status.event.player.hasSkill("xincaishi_0") ? [1, 2] : [1, 1]; - }, - check: function () { - return 1; - }, - discard: false, - lose: false, - content: function () { - "step 0"; - event.suits = []; - event.nums = []; - for (var i = 0; i < cards.length; i++) { - event.suits.push(get.suit(cards[i])); - event.nums.push(get.number(cards[i])); - } - player.showCards(cards); - "step 1"; - player.choosePlayerCard(target, "h", [1, player.hasSkill("xincaishi_1") ? 4 : 3], "请选择要展示的牌", true).ai = function () { - return Math.random(); - }; - "step 2"; - event.cards2 = result.cards.slice(0); - target.showCards(event.cards2); - "step 3"; - var card = event.cards2.shift(); - var bool = false; - if (event.suits.includes(get.suit(card))) { - bool = true; - player.draw(); - } - if (event.nums.includes(get.number(card))) { - bool = true; - target.damage("nocard"); - } - if (!bool && player.countCards("h")) player.chooseToDiscard("h", true); - "step 4"; - if (event.cards2.length) event.goto(3); - }, - ai: { - result: { - target: function (player, target) { - return -target.countCards("h"); - }, - }, - }, - }, - new_qingxian: { - group: ["qingxian_draw"], - enable: "phaseUse", - audio: "qingxian", - usable: 1, - position: "he", - filterTarget: function (card, player, target) { - return target != player; - }, - complexCard: true, - complexSelect: true, - selectTarget: function () { - return ui.selected.cards.length; - }, - filterCard: true, - selectCard: function () { - var player = _status.event.player; - return [1, player.hp]; - }, - check: function (cardx) { - var player = _status.event.player; - var number = game.countPlayer(function (target) { - if (player == target) return false; - var pe = player.countCards("e", function (card) { - return card != cardx && ui.selected.cards.includes(card) == false; - }); - var te = target.countCards("e"); - if (pe > te && target.isDamaged() && get.attitude(player, target) > 2) return true; - else if (pe == te && get.attitude(player, target) > 2) return true; - else if (pe < te && get.attitude(player, target) < 0) return true; - return false; - }); - if (ui.selected.cards.length < number) return 7 - get.value(cardx); - else return 0; - }, - targetprompt: function (target) { - var pe = _status.event.player.countCards("e", function (card) { - return ui.selected.cards.includes(card) == false; - }); - var te = target.countCards("e"); - if (pe > te) return "回复体力"; - else if (pe == te) return "摸一张牌"; - else if (pe < te) return "失去体力"; - }, - line: "thunder", - content: function () { - var pe = player.countCards("e"); - var te = target.countCards("e"); - if (pe > te) target.recover(); - else if (pe == te) target.draw(); - else if (pe < te) target.loseHp(); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - var pe = player.countCards("e", function (card) { - return ui.selected.cards.includes(card) == false; - }); - var te = target.countCards("e"); - if (pe > te && target.isDamaged()) return 2; - else if (pe == te) return 1; - else if (pe < te) return -2.5; - else return 0; - }, - }, - }, - }, - new_juexiang: { - audio: "qingxian_jilie", - trigger: { - player: "die", - }, - forced: true, - forceDie: true, - skillAnimation: true, - animationColor: "water", - derivation: ["new_canyun"], - content: function () { - "step 0"; - if (trigger.source) { - trigger.source.discard(trigger.source.getCards("e")); - trigger.source.loseHp(); - } - "step 1"; - player - .chooseTarget("【绝响】:是否令一名其他角色获得技能〖残韵〗?", function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.countCards("ej", { suit: "club" })) att = att * 2; - return 10 + att; - }) - .set("forceDie", true); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "thunder"); - target.addSkills("new_canyun"); - target - .discardPlayerCard("是否弃置自己区域内的一张梅花牌,获得技能〖绝响〗?", target, "hej") - .set("ai", function (card) { - if (get.position(card) == "j") return 100 + get.value(card); - return 100 - get.value(card); - }) - .set("visible", true) - .set("filterButton", function (card) { - return get.suit(card.link) == "club"; - }); - } else event.finish(); - "step 3"; - if (result.bool) target.addSkills("new_juexiang"); - }, - }, - new_canyun: { - group: ["qingxian_draw"], - complexCard: true, - complexSelect: true, - marktext: "韵", - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - intro: { - content: function (storage) { - var str = ""; - var str2 = "
  • 出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色(不能选择已经成为过〖残韵〗目标的角色)。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)"; - if (storage.length > 0) { - for (var i = 0; i < storage.length; i++) { - str += "、"; - str += get.translation(storage[i]); - } - str = str.slice(1); - str2 += "
  • 已对" + str + "发动过〖残韵〗"; - } - return str2; - }, - }, - mark: true, - enable: "phaseUse", - usable: 1, - check: function (cardx) { - var player = _status.event.player; - var number = game.countPlayer(function (target) { - if (player == target) return false; - var pe = player.countCards("e", function (card) { - return card != cardx && ui.selected.cards.includes(card) == false; - }); - var te = target.countCards("e"); - if (pe > te && target.isDamaged() && get.attitude(player, target) > 2) return true; - else if (pe < te && get.attitude(player, target) < 0) return true; - return false; - }); - if (ui.selected.cards.length < number) return 6 - get.value(cardx); - else return 0; - }, - filter: function (event, player) { - if (!player.storage.new_canyun) player.storage.new_canyun = []; - return game.hasPlayer(function (current) { - return current != player && !player.storage.new_canyun.includes(current); - }); - }, - filterTarget: function (card, player, target) { - return target != player && !player.storage.new_canyun.includes(target); - }, - selectTarget: function () { - return ui.selected.cards.length; - }, - filterCard: true, - selectCard: function () { - var player = _status.event.player; - return [1, player.hp]; - }, - targetprompt: function (target) { - var pe = _status.event.player.countCards("e", function (card) { - return ui.selected.cards.includes(card) == false; - }); - var te = target.countCards("e"); - if (pe > te) return "回复体力"; - else if (pe == te) return "摸一张牌"; - else if (pe < te) return "失去体力"; - }, - line: "thunder", - position: "he", - content: function () { - player.storage.new_canyun.push(target); - var pe = player.countCards("e"); - var te = target.countCards("e"); - if (pe > te) target.recover(); - else if (pe == te) target.draw(); - else if (pe < te) target.loseHp(); - }, - ai: { - order: 10, - result: { - target: function (player, target) { - var pe = player.countCards("e"); - var te = target.countCards("e"); - if (pe > te && target.isDamaged()) return 2; - else if (pe == te) return 1; - else if (pe < te) return -2.5; - else return 0; - }, - }, - }, - }, - qingxian_draw: { - trigger: { - player: ["new_qingxianAfter", "new_canyunAfter"], - }, - forced: true, - popup: false, - silent: false, - filter: function (event, player) { - return event.target == event.targets[event.targets.length - 1] && event.targets.length == player.hp; - }, - content: function () { - player.draw(); - }, - }, - zhenjun: { - audio: "jieyue", - trigger: { - player: "phaseZhunbeiBegin", - }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("h") > current.hp; - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("zhenjun"), function (card, player, target) { - return target.countCards("h") > target.hp; - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target) * (target.countCards("e") + 1); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - var num = target.countCards("h") - target.hp; - player.line(target, "thunder"); - player.logSkill("zhenjun", target); - player.discardPlayerCard(num, target, true); - } - "step 2"; - if (result.cards && result.cards.length) { - event.num = 0; - event.num2 = result.cards.length; - for (var i = 0; i < result.cards.length; i++) { - if (get.type(result.cards[i], null, result.cards[i].original == "h" ? target : false) != "equip") { - event.num++; - } - } - if (event.num > 0) { - var prompt = "弃置" + get.cnNumber(event.num) + "张牌,或令" + get.translation(event.target) + "摸" + get.cnNumber(event.num2) + "张牌"; - player.chooseToDiscard(event.num, prompt, "he").ai = function (card) { - return 5 - get.value(card); - }; - } else event.finish(); - } else event.finish(); - "step 3"; - if (!result.bool) { - event.target.draw(event.num2); - } - }, - }, - rezhenjun: { - audio: "jieyue", - trigger: { - player: "phaseZhunbeiBegin", - }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("h") > 0; - }); - }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("rezhenjun"), (card, player, target) => { - return target.countCards("he"); - }).ai = function (target) { - return -get.attitude(_status.event.player, target) * (target.countCards("e") + 1); - }; - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - var num = Math.max(target.countCards("h") - target.hp, 1); - player.logSkill("rezhenjun", target); - player.discardPlayerCard(num, target, true); - } - "step 2"; - if (result.cards && result.cards.length) { - event.num = 0; - for (var i = 0; i < result.cards.length; i++) { - if (get.type(result.cards[i]) != "equip") { - event.num++; - } - } - if (event.num > 0) { - var prompt = "弃置" + get.cnNumber(event.num) + "张牌,或令" + get.translation(event.target) + "摸" + get.cnNumber(event.num) + "张牌"; - player.chooseToDiscard(event.num, prompt, "he").ai = function (card) { - return 5 - get.value(card); - }; - } else event.finish(); - } else event.finish(); - "step 3"; - if (!result.bool) { - event.target.draw(event.num); - } - }, - }, - fenli: { - audio: 2, - audioname: ["xin_zhuhuan"], - group: ["fenli_draw", "fenli_use", "fenli_discard"], - subfrequent: ["discard"], - subSkill: { - draw: { - audio: "fenli", - audioname: ["xin_zhuhuan"], - trigger: { player: "phaseDrawBefore" }, - prompt: "是否发动【奋励】跳过摸牌阶段?", - filter: function (event, player) { - return player.isMaxHandcard(); - }, - check: function (event, player) { - if (player.getHistory("skipped").length > 0) return false; - return game.hasPlayer(function (current) { - return get.attitude(player, current) < 0 && current.hp == 1 && get.damageEffect(current, player, player) > 0; - }); - }, - content: function () { - trigger.cancel(); - }, - }, - use: { - audio: "fenli", - audioname: ["xin_zhuhuan"], - trigger: { player: "phaseUseBefore" }, - prompt: "是否发动【奋励】跳过出牌阶段?", - filter: function (event, player) { - return player.isMaxHp(); - }, - check: function (event, player) { - if (!player.needsToDiscard() || (player.countCards("e") && player.isMaxEquip())) return true; - if (player.getHistory("skipped").length > 0) return false; - return game.hasPlayer(function (current) { - return get.attitude(player, current) < 0 && current.hp == 1 && get.damageEffect(current, player, player) > 0; - }); - }, - content: function () { - trigger.cancel(); - }, - }, - discard: { - audio: "fenli", - audioname: ["xin_zhuhuan"], - trigger: { player: "phaseDiscardBefore" }, - prompt: "是否发动【奋励】跳过弃牌阶段?", - frequent: true, - filter: function (event, player) { - return player.isMaxEquip() && player.countCards("e"); - }, - content: function () { - trigger.cancel(); - }, - }, - }, - ai: { - combo: "pingkou", - }, - }, - pingkou: { - audio: 2, - trigger: { player: "phaseEnd" }, - direct: true, - filter: function (event, player) { - return player.getHistory("skipped").length > 0; - }, - content: function () { - "step 0"; - player - .chooseTarget([1, player.getHistory("skipped").length], get.prompt2("pingkou"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - player.logSkill("pingkou", result.targets); - event.targets = result.targets.slice(0).sortBySeat(); - } else { - event.finish(); - } - "step 2"; - if (event.targets && event.targets.length) { - event.targets.shift().damage(); - event.redo(); - } - }, - ai: { - combo: "fenli", - effect: { - target: function (card) { - if (card.name == "lebu" || card.name == "bingliang") return 0.5; - }, - }, - }, - }, - xinanguo: { - audio: "anguo", - enable: "phaseUse", - usable: 1, - filterTarget: lib.filter.notMe, - content: function () { - "step 0"; - if (target.isMinHandcard()) { - target.draw(); - event.h = true; - } - "step 1"; - if (target.isMinHp() && target.isDamaged()) { - target.recover(); - event.hp = true; - } - "step 2"; - var equip = get.cardPile(function (card) { - return get.type(card) == "equip" && target.hasUseTarget(card); - }); - if (target.isMinEquip() && equip) { - target.chooseUseTarget(equip, "nothrow", "nopopup", true); - event.e = true; - } - "step 3"; - game.updateRoundNumber(); - if (!event.h && player.isMinHandcard()) { - player.draw(); - } - "step 4"; - if (!event.hp && player.isMinHp() && player.isDamaged()) { - player.recover(); - } - "step 5"; - if (!event.e && player.isMinEquip()) { - var equip = get.cardPile(function (card) { - return get.type(card) == "equip" && player.hasUseTarget(card); - }); - if (equip) player.chooseUseTarget(equip, "nothrow", "nopopup", true); - } - "step 6"; - game.updateRoundNumber(); - }, - ai: { - threaten: 1.6, - order: 9, - result: { - player: function (player, target) { - if (get.attitude(player, target) <= 0) { - if (target.isMinHandcard() || target.isMinEquip() || target.isMinHp()) return -1; - } - var num = 0; - if (player.isMinHandcard() || target.isMinHandcard()) num++; - if (player.isMinEquip() || target.isMinEquip()) num++; - if ((player.isMinHp() && player.isDamaged()) || (target.isMinHp() && target.isDamaged())) num += 2.1; - return num; - }, - }, - }, - }, - pindi: { - audio: 2, - enable: "phaseUse", - filterTarget: function (card, player, target) { - if (player == target) return false; - if (player.storage.pindi_target && player.storage.pindi_target.includes(target)) { - return false; - } - return true; - }, - filterCard: function (card, player) { - if (player.storage.pindi_type && player.storage.pindi_type.includes(get.type2(card))) { - return false; - } - return true; - }, - subSkill: { - clear: { - trigger: { player: "phaseAfter" }, - silent: true, - content: function () { - delete player.storage.pindi_target; - delete player.storage.pindi_type; - }, - }, - }, - //group:'pindi_clear', - check: function (card) { - var num = _status.event.player.getStat("skill").pindi || 0; - return 6 + num - get.value(card); - }, - position: "he", - content: function () { - "step 0"; - if (!player.storage.pindi_target) { - player.storage.pindi_target = []; - } - if (!player.storage.pindi_type) { - player.storage.pindi_type = []; - } - player.storage.pindi_target.push(target); - player.storage.pindi_type.push(get.type2(cards[0], cards[0].original == "h" ? player : false)); - event.num = player.getStat("skill").pindi; - var evt = _status.event.getParent("phase"); - if (evt && evt.name == "phase" && !evt.pindi) { - var next = game.createEvent("rerende_clear"); - _status.event.next.remove(next); - evt.after.push(next); - evt.pindi = true; - next.player = player; - next.setContent(lib.skill.pindi_clear.content); - } - player.syncStorage(); - if (target.countCards("he") == 0) event._result = { index: 0 }; - else { - player - .chooseControlList(["令" + get.translation(target) + "摸" + get.cnNumber(event.num) + "张牌", "令" + get.translation(target) + "弃置" + get.cnNumber(event.num) + "张牌"], function () { - return _status.event.choice; - }) - .set("choice", get.attitude(player, target) > 0 ? 0 : 1); - } - "step 1"; - if (result.index == 0) { - target.draw(event.num); - } else { - target.chooseToDiscard(event.num, "he", true); - } - "step 2"; - if (target.isDamaged()) { - player.link(true); - } - }, - ai: { - order: 8, - threaten: 1.8, - result: { - target: function (player, target) { - var att = get.attitude(player, target); - var num = (player.getStat("skill").pindi || 0) + 1; - if (att <= 0 && target.countCards("he") < num) return 0; - return get.sgn(att); - }, - }, - }, - }, - funan: { - audio: 2, - trigger: { global: ["respond", "useCard"] }, - filter: function (event, player) { - if (!event.respondTo) return false; - if (event.player == player) return false; - if (player != event.respondTo[0]) return false; - if (!player.hasSkill("funan_jiexun")) { - var cards = []; - if (get.itemtype(event.respondTo[1]) == "card") cards.push(event.respondTo[1]); - else if (event.respondTo[1].cards) cards.addArray(event.respondTo[1].cards); - return cards.filterInD("od").length > 0; - } else return event.cards.filterInD("od").length > 0; - }, - logTarget: "player", - content: function () { - "step 0"; - if (!player.hasSkill("funan_jiexun")) { - var cards = []; - if (get.itemtype(trigger.respondTo[1]) == "card") cards.push(trigger.respondTo[1]); - else if (trigger.respondTo[1].cards) cards.addArray(trigger.respondTo[1].cards); - cards = cards.filterInD("od"); - trigger.player.gain(cards, "gain2", "log").gaintag.add("funan"); - trigger.player.addTempSkill("funan_use"); - } - "step 1"; - var cards = trigger.cards.filterInD("od"); - player.gain(cards, "log", "gain2"); - }, - subSkill: { - jiexun: { - charlotte: true, - mark: true, - marktext: "复", - intro: { - content: "你发动“复难”时,无须令其他角色获得你使用的牌", - }, - }, - use: { - onremove: function (player) { - player.removeGaintag("funan"); - }, - charlotte: true, - mod: { - cardEnabled2: function (card, player) { - if (get.itemtype(card) == "card" && card.hasGaintag("funan")) { - return false; - } - }, - }, - }, - }, - }, - jiexun: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - onremove: true, - direct: true, - content: function () { - "step 0"; - var num1 = game.countPlayer(function (current) { - return current.countCards("ej", { suit: "diamond" }); - }); - var num2 = player.countMark("jiexun"); - event.num1 = num1; - event.num2 = num2; - var str = "令目标摸" + get.cnNumber(num1) + "张牌"; - if (num2) { - str += ",然后弃置" + get.cnNumber(num2) + "张牌;若目标因此法弃置了所有牌,则你失去“诫训”,然后你发动“复难”时,无须令其获得你使用的牌"; - } - player - .chooseTarget(get.prompt("jiexun"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - return _status.event.coeff * get.attitude(_status.event.player, target); - }) - .set("coeff", num1 >= num2 ? 1 : -1) - .set("prompt2", str); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("jiexun", target); - if (event.num1) { - target.draw(event.num1); - } - player.addMark("jiexun", 1, false); - } else { - event.finish(); - } - "step 2"; - if (event.num2) { - event.target.chooseToDiscard(event.num2, true, "he"); - } else { - event.finish(); - } - "step 3"; - if (result.bool && result.autochoose && result.cards.length == result.rawcards.length) { - player.removeSkills("jiexun"); - player.addSkill("funan_jiexun"); - } - }, - }, - xinjiexun: { - audio: "jiexun", - trigger: { player: "phaseJieshuBegin" }, - onremove: true, - direct: true, - content: function () { - "step 0"; - var num1 = game.countPlayer(function (current) { - return current.countCards("ej", { suit: "diamond" }); - }); - var num2 = player.countMark("xinjiexun"); - event.num1 = num1; - event.num2 = num2; - var str = "令目标摸" + get.cnNumber(num1) + "张牌"; - if (num2) { - str += ",然后弃置" + get.cnNumber(num2) + "张牌"; - } - player - .chooseTarget(get.prompt("xinjiexun"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - return _status.event.coeff * get.attitude(_status.event.player, target); - }) - .set("coeff", num1 >= num2 ? 1 : -1) - .set("prompt2", str); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("xinjiexun", target); - if (event.num1) { - target.draw(event.num1); - } - player.addMark("xinjiexun", 1, false); - } else { - event.finish(); - } - "step 2"; - if (event.num2) { - event.target.chooseToDiscard(event.num2, true, "he"); - } else { - event.finish(); - } - "step 3"; - if (result.bool && result.autochoose && result.cards.length == result.rawcards.length) { - player.removeMark("xinjiexun", player.countMark("xinjiexun"), false); - player.addSkill("funan_jiexun"); - } - }, - intro: { content: "已经发动过了#次" }, - }, - zhuandui: { - shaRelated: true, - audio: 2, - group: ["zhuandui_respond", "zhuandui_use"], - subSkill: { - use: { - audio: "zhuandui", - trigger: { player: "useCardToPlayered" }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - filter: function (event, player) { - return event.card.name == "sha" && player.canCompare(event.target); - }, - logTarget: "target", - content: function () { - "step 0"; - player.chooseToCompare(trigger.target); - "step 1"; - if (result.bool) { - trigger.getParent().directHit.add(trigger.target); - } - }, - }, - respond: { - audio: "zhuandui", - trigger: { target: "useCardToTargeted" }, - check: function (event, player) { - return get.effect(player, event.card, event.player, player) < 0; - }, - filter: function (event, player) { - return event.card.name == "sha" && player.canCompare(event.player); - }, - logTarget: "player", - content: function () { - "step 0"; - player.chooseToCompare(trigger.player); - "step 1"; - if (result.bool) { - trigger.getParent().excluded.add(player); - } - }, - }, - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (player._zhuandui_temp || tag !== "directHit_ai") return false; - player._zhuandui_temp = true; - var bool = (function () { - if (arg.card.name != "sha" || get.attitude(player, arg.target) >= 0 || !arg.target.countCards("h")) return false; - if ( - arg.target.countCards("h") == 1 && - (!arg.target.hasSkillTag( - "freeShan", - false, - { - player: player, - card: arg.card, - }, - true - ) || - player.hasSkillTag("unequip", false, { - name: arg.card ? arg.card.name : null, - target: arg.target, - card: arg.card, - }) || - player.hasSkillTag("unequip_ai", false, { - name: arg.card ? arg.card.name : null, - target: arg.target, - card: arg.card, - })) - ) - return true; - return ( - player.countCards("h", function (card) { - return card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) && get.value(card) <= 4 && (get.number(card) >= 11 + arg.target.countCards("h") / 2 || get.suit(card, player) == "heart"); - }) > 0 - ); - })(); - delete player._zhuandui_temp; - return bool; - }, - effect: { - target: function (card, player, target, current) { - if (card.name == "sha" && current < 0) return 0.7; - }, - }, - }, - }, - tianbian: { - audio: 2, - enable: "chooseCard", - check: function (event, player) { - var player = _status.event.player; - return !player.hasCard(function (card) { - var val = get.value(card); - return val < 0 || (val <= 4 && (get.number(card) >= 11 || get.suit(card) == "heart")); - }, "h") - ? 20 - : 0; - }, - filter: function (event) { - return event.type == "compare" && !event.directresult; - }, - onCompare: function (player) { - return game.cardsGotoOrdering(get.cards()).cards; - }, - group: "tianbian_number", - subSkill: { - number: { - trigger: { player: "compare", target: "compare" }, - filter: function (event, player) { - if (event.player == player) { - return !event.iwhile && get.suit(event.card1) == "heart"; //&&event.card1.vanishtag.includes('tianbian'); - } else { - return get.suit(event.card2) == "heart"; //&&event.card2.vanishtag.includes('tianbian'); - } - }, - silent: true, - content: function () { - game.log(player, "拼点牌点数视为", "#yK"); - if (player == trigger.player) { - trigger.num1 = 13; - } else { - trigger.num2 = 13; - } - }, - }, - }, - }, - jianzheng: { - audio: 2, - trigger: { global: "useCardToPlayer" }, - filter: function (event, player) { - if (!player.countCards("h")) return false; - return event.player != player && event.card.name == "sha" && !event.targets.includes(player) && event.player.inRange(player); - }, - direct: true, - content: function () { - "step 0"; - var effect = 0; - for (var i = 0; i < trigger.targets.length; i++) { - effect -= get.effect(trigger.targets[i], trigger.card, trigger.player, player); - } - if (effect > 0) { - if (get.color(trigger.card) != "black") { - effect = 0; - } else { - effect = 1; - } - if (trigger.targets.length == 1) { - if (trigger.targets[0].hp == 1) { - effect++; - } - if (effect > 0 && trigger.targets[0].countCards("h") < player.countCards("h")) { - effect++; - } - } - if (effect > 0) { - effect += 6; - } - } - player - .chooseCard("h", get.prompt2("jianzheng", trigger.player)) - .set("ai", function (card) { - if (_status.event.effect >= 0) { - var val = get.value(card); - if (val < 0) return 10 - val; - return _status.event.effect - val; - } - return 0; - }) - .set("effect", effect) - .set("logSkill", ["jianzheng", trigger.player]); - "step 1"; - if (result.bool && result.cards) { - event.card = result.cards[0]; - trigger.targets.length = 0; - trigger.getParent().triggeredTargets1.length = 0; - } else { - event.finish(); - } - "step 2"; - if (!event.isMine()) game.delayx(); - "step 3"; - if (event.card) { - player.logSkill("jianzheng", trigger.player); - player.lose(event.card, ui.cardPile, "visible", "insert"); - player.$throw(event.card, 1000); - game.log(player, "将", card, "置于牌堆顶"); - } - "step 4"; - if (get.color(trigger.card) != "black") { - trigger.getParent().targets.push(player); - trigger.player.line(player); - game.delay(); - } - }, - ai: { - threaten: 1.1, - expose: 0.25, - }, - }, - qingxian: { - audio: 2, - group: ["qingxian_jilie", "qingxian_rouhe", "qingxian_dying"], - ai: { - threaten: 0.8, - maixie: true, - maixie_hp: true, - maixie_defend: true, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (target.hp > 1 && target.hasFriend()) return 0.4; - } - }, - }, - }, - subSkill: { - dying: { - audio: "qingxian", - trigger: { global: "dyingAfter" }, - filter: function (event, player) { - return player.storage.qingxian && player.storage.qingxian > 0 && !_status.dying.length; - }, - direct: true, - content: function () { - "step 0"; - player.storage.qingxian--; - player - .chooseTarget(get.prompt("qingxian"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.isHealthy() && att > 0) return 0; - if (target.hp == 1 && att != 0) { - if (att > 0) return 9; - else return 10; - } else { - return Math.sqrt(Math.abs(att)); - } - }) - .set("prompt2", "当你回复体力后,你可以令一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你回复1点体力"); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("qingxian", target); - event.insert(lib.skill.qingxian.content_choose, { - target: target, - player: player, - }); - } - "step 2"; - if (lib.skill.qingxian_dying.filter(trigger, player)) event.goto(0); - }, - }, - rouhe: { - audio: "qingxian", - trigger: { player: "recoverEnd" }, - direct: true, - content: function () { - "step 0"; - if (_status.dying.length) { - if (!player.storage.qingxian) player.storage.qingxian = 0; - player.storage.qingxian++; - event.finish(); - return; - } - player - .chooseTarget(get.prompt("qingxian"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.isHealthy() && att > 0) return 0; - if (target.hp == 1 && att != 0) { - if (att > 0) return 9; - else return 10; - } else { - return Math.sqrt(Math.abs(att)); - } - }) - .set("prompt2", "当你回复体力后,你可以令一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你回复1点体力"); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("qingxian", target); - event.insert(lib.skill.qingxian.content_choose, { - target: target, - player: player, - }); - } - }, - }, - jilie: { - audio: "qingxian", - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return event.source && event.source.isIn(); - }, - check: function (event, player) { - if (get.attitude(player, event.source) > 0 && event.source.isHealthy()) { - return false; - } - return true; - }, - logTarget: "source", - prompt2: "当你受到伤害后,你可以令伤害来源执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你回复1点体力", - content: function () { - event.insert(lib.skill.qingxian.content_choose, { - target: trigger.source, - player: player, - }); - }, - }, - }, - content_choose: function () { - "step 0"; - if (target.isHealthy()) { - event._result = { index: 0 }; - } else { - var index; - if (get.attitude(player, target) > 0) { - index = 1; - } else { - index = 0; - } - player - .chooseControlList(["令" + get.translation(target) + "失去1点体力,随机使用一张装备牌", "令" + get.translation(target) + "回复1点体力,弃置一张装备牌"], true, function (event, player) { - return _status.event.index; - }) - .set("index", index); - } - "step 1"; - if (result.index == 0) { - target.loseHp(); - event.card = get.cardPile(function (card) { - return get.type(card) == "equip" && target.canUse(card, target); - }); - if (event.card) { - target.chooseUseTarget(event.card, "nothrow", "nopopup", true); - event.goto(3); - } else { - event.finish(); - } - } else { - target.recover(); - if (target.countCards("he", { type: "equip" })) { - target - .chooseToDiscard("he", true, "弃置一张装备牌", function (card) { - return get.type(card) == "equip"; - }) - .set("ai", function (card) { - var val = -get.value(card); - if (get.suit(card) == "club") { - val += _status.event.att * 10; - } - return val; - }) - .set("att", get.sgnAttitude(target, player)); - } else { - event.finish(); - } - } - "step 2"; - if (result && result.cards) { - event.card = result.cards[0]; - } - "step 3"; - if (event.card && get.suit(event.card) == "club") { - player.draw(); - } - }, - }, - juexiang: { - audio: 2, - trigger: { player: "die" }, - direct: true, - forceDie: true, - skillAnimation: true, - animationColor: "thunder", - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("juexiang"), function (card, player, target) { - return target != player; - }) - .set("forceDie", true) - .set("ai", function (target) { - return get.attitude(_status.event.player, target) / Math.sqrt(target.hp + 1); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("juexiang", target); - target.addSkills(lib.skill.juexiang.derivation.randomGet()); - target.addTempSkill("juexiang_club", { player: "phaseZhunbeiBegin" }); - } - }, - derivation: ["juexiang_ji", "juexiang_lie", "juexiang_rou", "juexiang_he"], - subSkill: { - ji: { - audio: 1, - mark: true, - nopop: true, - intro: { - content: "info", - }, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return event.source && event.source.isIn() && event.source != player; - }, - check: function (event, player) { - return get.attitude(player, event.source) < 0; - }, - logTarget: "source", - content: function () { - trigger.source.loseHp(); - var card = get.cardPile(function (card) { - return get.type(card) == "equip" && trigger.source.canUse(card, trigger.source); - }); - if (card) { - trigger.source.chooseUseTarget(card, "nothrow", "nopopup", true); - } - }, - ai: { - maixie_defend: true, - }, - }, - lie: { - audio: 1, - mark: true, - nopop: true, - intro: { - content: "info", - }, - trigger: { - player: "recoverEnd", - global: "dyingAfter", - }, - direct: true, - content: function () { - "step 0"; - if (_status.dying.length) { - if (event.triggername == "recoverEnd") { - if (!player.storage.juexiang_lie) player.storage.juexiang_lie = 0; - player.storage.juexiang_lie++; - } - event.finish(); - return; - } - if (event.triggername == "dyingAfter") { - if (!player.storage.juexiang_lie) { - event.finish(); - return; - } - player.storage.juexiang_lie--; - } - player - .chooseTarget(get.prompt2("juexiang_lie"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - return -get.attitude(player, target) / (1 + target.hp); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("juexiang_lie", target); - target.loseHp(); - var card = get.cardPile(function (card) { - return get.type(card) == "equip" && target.canUse(card, target); - }); - if (card) { - target.chooseUseTarget(card, true, "nothrow", "nopopup", true); - } - } - if (event.triggername == "dyingAfter" && player.storage.juexiang_lie > 0) event.goto(0); - }, - }, - rou: { - audio: 1, - mark: true, - nopop: true, - intro: { - content: "info", - }, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return event.source && event.source.isIn() && event.source != player; - }, - check: function (event, player) { - var att = get.attitude(player, event.source); - if (player.isHealthy()) { - return att < 0; - } else { - return att > 0; - } - }, - logTarget: "source", - content: function () { - trigger.source.recover(); - if (trigger.source.countCards("he", { type: "equip" })) { - trigger.source.chooseToDiscard("he", true, "弃置一张装备牌", function (card) { - return get.type(card) == "equip"; - }); - } - }, - ai: { - maixie_defend: true, - }, - }, - he: { - audio: 1, - mark: true, - nopop: true, - intro: { - content: "info", - }, - trigger: { player: "recoverEnd" }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("juexiang_he"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.isHealthy() && target.countCards("he")) { - return -att; - } else { - return (10 * att) / (1 + target.hp); - } - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("juexiang_he", target); - target.recover(); - if (target.countCards("he", { type: "equip" })) { - target.chooseToDiscard("he", true, "弃置一张装备牌", function (card) { - return get.type(card) == "equip"; - }); - } - } - }, - }, - club: { - mark: true, - nopop: true, - intro: { - content: "info", - }, - mod: { - targetEnabled: function (card, player, target) { - if (get.suit(card) == "club" && player != target) { - return false; - } - }, - }, - }, - }, - }, - bizhuan: { - audio: 2, - trigger: { - player: "useCard", - target: "useCardToTargeted", - }, - filter: function (event, player) { - if (event.name != "useCard" && event.player == event.target) return false; - if (player.getExpansions("bizhuan").length >= 4) return false; - return get.suit(event.card) == "spade"; - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - frequent: true, - locked: false, - content: function () { - player.addToExpansion(get.cards(), "gain2").gaintag.add("bizhuan"); - }, - mod: { - maxHandcard: function (player, num) { - return num + player.getExpansions("bizhuan").length; - }, - }, - }, - tongbo: { - trigger: { player: "phaseDrawAfter" }, - direct: true, - filter: function (event, player) { - return player.getExpansions("bizhuan").length > 0 && player.countCards("he") > 0; - }, - content: function () { - "step 0"; - var four = false; - var nofour = !player.hasFriend(); - var expansions = player.getExpansions("bizhuan"); - if (expansions.length == 4) { - var suits = ["club", "spade", "heart", "diamond"]; - var list = player.getCards("he").concat(expansions); - for (var i = 0; i < list.length; i++) { - suits.remove(get.suit(list[i])); - if (suits.length == 0) { - four = true; - break; - } - } - } - var next = player.chooseToMove("通博:是否交换“书”和手牌?").set("four", four).set("suits2", suits2).set("nofour", nofour); - next.set("list", [ - [get.translation(player) + "(你)的“书”", expansions], - ["你的牌", player.getCards("he")], - ]); - next.set("filterMove", function (from, to) { - return typeof to != "number"; - }); - next.set("processAI", function (list) { - var player = _status.event.player, - cards = list[0][1].concat(list[1][1]), - cards2 = []; - if (_status.event.four) { - var sorted = [[], [], [], []]; - for (var i of cards) { - var index = lib.suit.indexOf(get.suit(i, false)); - if (sorted[index]) sorted[index].push(i); - } - if (_status.event.nofour) { - sorted.sort(function (a, b) { - return a.length - b.length; - }); - var cards3 = cards.slice(0).sort(function (a, b) { - return get.useful(a) - get.useful(b); - }); - cards3.removeArray(sorted[0]); - cards2 = cards3.slice(0, 4); - cards.removeArray(cards2); - } else { - for (var i of sorted) { - cards2.push(i.randomGet()); - cards.remove(cards2); - } - } - } else { - cards.sort(function (a, b) { - return get.useful(a) - get.useful(b); - }); - cards2 = cards.splice(0, player.getExpansions("bizhuan").length); - } - return [cards2, cards]; - }); - "step 1"; - if (result.bool) { - var pushs = result.moved[0], - gains = result.moved[1]; - pushs.removeArray(player.getExpansions("bizhuan")); - gains.removeArray(player.getCards("he")); - if (!pushs.length || pushs.length != gains.length) { - event.finish(); - return; - } - player.logSkill("tongbo"); - player.addToExpansion(pushs, "give", player).gaintag.add("bizhuan"); - player.gain(gains, "gain2"); - } - "step 2"; - var suits2 = ["club", "spade", "heart", "diamond"]; - var expansions = player.getExpansions("bizhuan"); - for (var i = 0; i < expansions.length; i++) { - suits2.remove(get.suit(expansions[i])); - } - if (suits2.length > 0) { - event.finish(); - } - "step 3"; - event.cards = player.getExpansions("bizhuan").slice(0); - if (event.cards.length > 1) { - player.chooseCardButton("将所有“书”交给任意名其他角色", true, event.cards, [1, event.cards.length]).set("ai", function (button) { - if (ui.selected.buttons.length == 0) return 1; - return 0; - }); - } else if (event.cards.length == 1) { - event._result = { links: event.cards.slice(0), bool: true }; - } else { - event.finish(); - } - "step 4"; - if (result.bool) { - for (var i = 0; i < result.links.length; i++) { - event.cards.remove(result.links[i]); - } - event.togive = result.links.slice(0); - player - .chooseTarget("将" + get.translation(result.links) + "交给一名其他角色", true, function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (_status.event.enemy) { - return -att; - } else if (att > 0) { - return att / (1 + target.countCards("h")); - } else { - return att / 100; - } - }) - .set("enemy", get.value(event.togive[0], player, "raw") < 0); - } else { - event.finish(); - } - "step 5"; - if (result.targets.length) { - result.targets[0].gain(event.togive, "draw").giver = player; - player.line(result.targets[0], "green"); - game.log(result.targets[0], "获得了" + get.cnNumber(event.togive.length) + "张", "#g“书”"); - if (event.cards.length) event.goto(3); - } - }, - ai: { - combo: "bizhuan", - }, - }, - shouxi: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - direct: true, - init: function (player) { - if (!player.storage.shouxi) player.storage.shouxi = []; - }, - filter: function (event, player) { - return event.card.name == "sha" && event.player.isIn(); - }, - content: function () { - "step 0"; - var list = lib.inpile.filter(function (i) { - if (player.storage.shouxi.includes(i)) return false; - var type = get.type2(i); - if (type == "basic" || type == "trick") return true; - return false; - }); - for (var i = 0; i < list.length; i++) { - list[i] = [get.type(list[i]), "", list[i]]; - } - player.chooseButton([get.prompt("shouxi", trigger.player), [list, "vcard"]]).set("ai", function (button) { - return Math.random(); - }); - "step 1"; - if (result.bool) { - player.logSkill("shouxi"); - var name = result.links[0][2]; - event.vcard = result.links; - event.cardname = name; - player.storage.shouxi.add(name); - player.popup(name); - game.log(player, "声明了", "#y" + get.translation(name)); - } else { - event.finish(); - } - "step 2"; - var name = event.cardname; - trigger.player - .chooseToDiscard(function (card) { - return card.name == _status.event.cardname; - }) - .set("ai", function (card) { - if (_status.event.att < 0) { - return 10 - get.value(card); - } - return 0; - }) - .set("att", get.attitude(trigger.player, player)) - .set("cardname", name) - .set("dialog", ["守玺:请弃置一张【" + get.translation(name) + "】,否则此【杀】对" + get.translation(player) + "无效", [event.vcard, "vcard"]]); - "step 3"; - if (result.bool == false) { - trigger.excluded.push(player); - } else { - trigger.player.gainPlayerCard(player); - } - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (card.name == "sha" && get.attitude(player, target) < 0) { - return 0.3; - } - }, - }, - }, - }, - huimin: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - check: function (event, player) { - return ( - game.countPlayer(function (current) { - if (current.countCards("h") < current.hp) { - return get.sgn(get.attitude(player, current)); - } - }) >= 0 - ); - }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("h") < current.hp; - }); - }, - content: function () { - "step 0"; - event.list = game - .filterPlayer(function (current) { - return current.countCards("h") < current.hp; - }) - .sortBySeat(); - player.draw(event.list.length); - "step 1"; - player - .chooseTarget( - true, - function (card, player, target) { - var list = _status.event.list; - return list.includes(target); - }, - "选择一名角色作为分牌起点" - ) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att <= 0) return att; - var list = _status.event.list; - var index = list.indexOf(target); - var prev; - if (index == 0) { - prev = list[list.length - 1]; - } else { - prev = list[index - 1]; - } - if (get.attitude(player, prev) < 0) return att; - return 0; - }) - .set("list", event.list); - "step 2"; - var index = event.list.indexOf(result.targets[0]); - if (index < 0) index = 0; - var tmp = event.list.splice(index); - event.list = tmp.concat(event.list); - player.line(result.targets, "green"); - player.chooseCard("h", "选择要分配的手牌", event.list.length, true); - "step 3"; - var cards = result.cards; - player.lose(cards, ui.ordering); - event.togain = cards; - if (result.bool && cards.length) { - var dialog = ui.create.dialog("惠民", cards, true); - _status.dieClose.push(dialog); - dialog.videoId = lib.status.videoId++; - event.dialogID = dialog.videoId; - game.addVideo("cardDialog", null, ["惠民", get.cardsInfo(cards), dialog.videoId]); - game.broadcast( - function (cards, id) { - var dialog = ui.create.dialog("惠民", cards, true); - _status.dieClose.push(dialog); - dialog.videoId = id; - }, - cards, - dialog.videoId - ); - } else { - event.finish(); - } - "step 4"; - game.delay(); - "step 5"; - if (event.list.length && event.togain.length) { - event.current = event.list.shift(); - var next = event.current.chooseButton(true, function (button) { - return get.value(button.link, _status.event.player); - }); - next.set("dialog", event.dialogID); - next.set("closeDialog", false); - next.set("dialogdisplay", true); - next.set("cardFilter", event.togain.slice(0)); - next.set("filterButton", function (button) { - return _status.event.cardFilter.includes(button.link); - }); - } else { - for (var i = 0; i < ui.dialogs.length; i++) { - if (ui.dialogs[i].videoId == event.dialogID) { - var dialog = ui.dialogs[i]; - dialog.close(); - _status.dieClose.remove(dialog); - break; - } - } - if (event.togain.length) { - game.cardsDiscard(event.togain); - } - game.broadcast(function (id) { - var dialog = get.idDialog(id); - if (dialog) { - dialog.close(); - _status.dieClose.remove(dialog); - } - }, event.dialogID); - game.addVideo("cardDialog", null, event.dialogID); - event.finish(); - } - "step 6"; - var card = result.links[0], - target = event.current; - if (card) { - target.gain(card, "gain2"); - event.togain.remove(card); - } - var capt = get.translation(target) + "选择了" + get.translation(card); - game.broadcastAll( - function (card, id, name, capt) { - var dialog = get.idDialog(id); - if (dialog) { - dialog.content.firstChild.innerHTML = capt; - for (var i = 0; i < dialog.buttons.length; i++) { - if (dialog.buttons[i].link == card) { - dialog.buttons[i].querySelector(".info").innerHTML = name; - break; - } - } - game.addVideo("dialogCapt", null, [dialog.videoId, dialog.content.firstChild.innerHTML]); - } - }, - card, - event.dialogID, - (function (target) { - if (target._tempTranslate) return target._tempTranslate; - var name = target.name; - if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; - return get.translation(name); - })(target), - capt - ); - if (event.togain.length) event.goto(5); - else { - for (var i = 0; i < ui.dialogs.length; i++) { - if (ui.dialogs[i].videoId == event.dialogID) { - var dialog = ui.dialogs[i]; - dialog.close(); - _status.dieClose.remove(dialog); - break; - } - } - if (event.togain.length) { - game.cardsDiscard(event.togain); - } - game.broadcast(function (id) { - var dialog = get.idDialog(id); - if (dialog) { - dialog.close(); - _status.dieClose.remove(dialog); - } - }, event.dialogID); - game.addVideo("cardDialog", null, event.dialogID); - event.finish(); - } - }, - }, - fuzhu: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return event.player != player && event.player.hasSex("male") && ui.cardPile.childElementCount <= player.hp * 10; - }, - check: function (event, player) { - return get.attitude(player, event.player) < 0 && get.effect(event.player, { name: "sha" }, player, player) > 0; - }, - logTarget: "player", - skillAnimation: true, - animationColor: "wood", - onWash: function () { - _status.event.getParent("fuzhu").washed = true; - return "remove"; - }, - content: function () { - "step 0"; - event.washed = false; - lib.onwash.push(lib.skill.fuzhu.onWash); - event.total = game.players.length + game.dead.length; - "step 1"; - event.total--; - var card = get.cardPile2(function (card) { - return card.name == "sha" && player.canUse(card, trigger.player, false); - }); - if (card) { - player.useCard(card, trigger.player, false); - } - "step 2"; - if (event.total > 0 && !event.washed && ui.cardPile.childElementCount <= player.hp * 10 && trigger.player.isIn()) event.goto(1); - "step 3"; - lib.onwash.remove(lib.skill.fuzhu.onWash); - game.washCard(); - }, - ai: { - threaten: 1.5, - }, - }, - wengua: { - global: "wengua2", - audio: 2, - }, - wengua2: { - audio: "wengua", - enable: "phaseUse", - filter: function (event, player) { - if (player.hasSkill("wengua3")) return false; - return ( - player.countCards("he") && - game.hasPlayer(function (current) { - return current.hasSkill("wengua"); - }) - ); - }, - log: false, - delay: false, - filterCard: true, - discard: false, - lose: false, - position: "he", - prompt: function () { - var player = _status.event.player; - var list = game.filterPlayer(function (current) { - return current.hasSkill("wengua"); - }); - if (list.length == 1 && list[0] == player) return "将一张牌置于牌堆顶或是牌堆底"; - var str = "将一张牌交给" + get.translation(list); - if (list.length > 1) str += "中的一人"; - return str; - }, - check: function (card) { - if (card.name == "sha") return 5; - return 8 - get.value(card); - }, - content: function () { - "step 0"; - var targets = game.filterPlayer(function (current) { - return current.hasSkill("wengua"); - }); - if (targets.length == 1) { - event.target = targets[0]; - event.goto(2); - } else if (targets.length > 0) { - player - .chooseTarget(true, "选择【问卦】的目标", function (card, player, target) { - return _status.event.list.includes(target); - }) - .set("list", targets) - .set("ai", function (target) { - var player = _status.event.player; - return get.attitude(player, target); - }); - } else { - event.finish(); - } - "step 1"; - if (result.bool && result.targets.length) { - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - if (event.target) { - player.logSkill("wengua", event.target); - player.addTempSkill("wengua3", "phaseUseEnd"); - event.card = cards[0]; - if (event.target != player) { - player.give(cards, event.target); - } - } else { - event.finish(); - } - delete _status.noclearcountdown; - game.stopCountChoose(); - "step 3"; - if (event.target.getCards("he").includes(event.card)) { - event.target.chooseControlList("问卦", "将" + get.translation(event.card) + "置于牌堆顶", "将" + get.translation(event.card) + "置于牌堆底", event.target == player, function () { - if (get.attitude(event.target, player) < 0) return 2; - return 1; - }); - } else { - event.finish(); - } - "step 4"; - event.index = result.index; - if (event.index == 0 || event.index == 1) { - var next = event.target.lose(event.card, ui.cardPile); - if (event.index == 0) next.insert_card = true; - game.broadcastAll(function (player) { - var cardx = ui.create.card(); - cardx.classList.add("infohidden"); - cardx.classList.add("infoflip"); - player.$throw(cardx, 1000, "nobroadcast"); - }, event.target); - } else event.finish(); - "step 5"; - game.delay(); - "step 6"; - if (event.index == 1) { - game.log(event.target, "将得到的牌置于牌堆底"); - if (ui.cardPile.childElementCount == 1 || player == event.target) { - player.draw(); - } else { - game.asyncDraw([player, target], null, null); - } - } else if (event.index == 0) { - game.log(player, "将获得的牌置于牌堆顶"); - if (ui.cardPile.childElementCount == 1 || player == event.target) { - player.draw("bottom"); - } else { - game.asyncDraw([player, target], null, null, true); - } - } - }, - ai: { - order: 2, - threaten: 1.5, - result: { - player: function (player, target) { - var target = game.findPlayer(function (current) { - return current.hasSkill("wengua"); - }); - if (target) { - return get.attitude(player, target); - } - }, - }, - }, - }, - wengua3: { charlotte: true }, - daiyan: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - init: function () { - lib.onwash.push(function () { - delete _status.daiyan_notao; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("daiyan"), function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var player = _status.event.player; - var att = get.attitude(player, target); - if (att > 0) { - if (_status.daiyan_notao) { - return 0; - } else { - if (target == player.storage.daiyan) return 0; - return (2 * att) / Math.sqrt(1 + target.hp); - } - } else { - if (_status.daiyan_notao) { - if (target == player.storage.daiyan) return -3 * att; - return -att; - } else { - return 0; - } - } - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("daiyan", target); - var tao = get.cardPile2(function (card) { - return get.suit(card) == "heart" && get.type(card) == "basic"; - }); - if (tao) { - target.gain(tao, "gain2"); - } else { - _status.daiyan_notao = true; - } - if (target == player.storage.daiyan) { - target.loseHp(); - } - player.storage.daiyan = target; - } else { - delete player.storage.daiyan; - } - }, - ai: { - threaten: 1.5, - expose: 0.2, - }, - }, - fumian: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - if (player.storage.fumian_choice == "draw") { - player.chooseControlList(get.prompt("fumian"), "摸牌阶段多摸一张牌", "使用红色牌可以多选择两个目标(限一次)", function (event, player) { - if (player.hp == 1 || player.countCards("h") <= 1) return 0; - return 1; - }); - } else if (player.storage.fumian_choice == "red") { - player.chooseControlList(get.prompt("fumian"), "摸牌阶段多摸两张牌", "使用红色牌可以多选择一个目标(限一次)", function (event, player) { - return 0; - }); - } else { - player.chooseControlList(get.prompt("fumian"), "摸牌阶段多摸一张牌", "使用红色牌可以多选择一个目标(限一次)", function (event, player) { - if (player.hp == 1 || player.countCards("h") < player.hp) return 0; - return 1; - }); - } - "step 1"; - if (player.storage.fumian_choice == "draw") { - if (result.index == 0) { - player.storage.fumian_draw = 1; - } else if (result.index == 1) { - player.storage.fumian_red = 2; - delete player.storage.fumian_choice; - } - } else if (player.storage.fumian_choice == "red") { - if (result.index == 0) { - player.storage.fumian_draw = 2; - delete player.storage.fumian_choice; - } else if (result.index == 1) { - player.storage.fumian_red = 1; - } - } else { - if (result.index == 0) { - player.storage.fumian_draw = 1; - player.storage.fumian_choice = "draw"; - } else if (result.index == 1) { - player.storage.fumian_red = 1; - player.storage.fumian_choice = "red"; - } - } - if (result.index == 0) { - player.logSkill("fumian"); - player.addTempSkill("fumian_draw"); - } else if (result.index == 1) { - player.logSkill("fumian"); - player.addTempSkill("fumian_red"); - } - }, - ai: { - threaten: 1.3, - }, - subSkill: { - draw: { - trigger: { player: "phaseDrawBegin2" }, - forced: true, - popup: false, - onremove: true, - filter: function (event, player) { - return !event.numFixed && typeof player.storage.fumian_draw == "number"; - }, - content: function () { - trigger.num += player.storage.fumian_draw; - }, - }, - red2: {}, - red: { - trigger: { player: "useCard2" }, - direct: true, - mark: true, - onremove: true, - intro: { - content: "你使用红色牌可以多选择#个目标(限一次)", - }, - filter: function (event, player) { - if (get.color(event.card) != "red") return false; - if (player.hasSkill("fumian_red2")) return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var prompt2 = "额外指定"; - if (player.storage.fumian_red == 2) { - prompt2 += "至多两"; - } else { - prompt2 += "一"; - } - prompt2 += "名" + get.translation(trigger.card) + "的目标"; - player - .chooseTarget([1, player.storage.fumian_red], get.prompt("fumian"), function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card, player, target); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - if (!event.isMine()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("fumian", event.targets); - trigger.targets.addArray(event.targets); - player.addTempSkill("fumian_red2"); - } - }, - }, - }, - }, - zhongjian: { - audio: 2, - enable: "phaseUse", - usable: 2, - filter: function (event, player) { - if (!player.countCards("h")) return false; - if (player.getStat("skill").zhongjian && !player.hasSkill("zhongjian2")) return false; - return game.hasPlayer(function (current) { - return current != player && Math.min(current.hp, current.countCards("h")) > 0; - }); - }, - filterCard: true, - check: function () { - return Math.random(); - }, - discard: false, - lose: false, - delay: false, - filterTarget: function (card, player, target) { - return target != player && target.hp > 0 && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.showCards(cards); - "step 1"; - player.choosePlayerCard(target, "h", Math.min(target.countCards("h"), target.hp), true); - "step 2"; - var hs = result.cards; - target.showCards(hs); - var colors = []; - var numbers = []; - for (var i = 0; i < cards.length; i++) { - colors.add(get.color(cards[i])); - numbers.add(get.number(cards[i])); - } - event.bool1 = false; - event.bool2 = false; - for (var i = 0; i < hs.length; i++) { - if (!event.bool1 && colors.includes(get.color(hs[i]))) event.bool1 = true; - if (!event.bool2 && numbers.includes(get.number(hs[i]))) event.bool2 = true; - } - "step 3"; - if (event.bool1) { - var filterTarget = function (card, player, target) { - return target != player && target.countDiscardableCards(player, "he") > 0; - }; - if ( - !game.hasPlayer(function (current) { - return filterTarget(null, player, current); - }) - ) - event._result = { bool: false }; - else - player.chooseTarget(filterTarget, "弃置一名其他角色的一张牌或摸一张牌").set("ai", function (target) { - var att = get.attitude(player, target); - if (att >= 0) return 0; - if ( - target.countCards("he", function (card) { - return get.value(card) > 5; - }) - ) - return -att; - return 0; - }); - } else { - event.goto(5); - } - "step 4"; - if (!result.bool) player.draw(); - else { - var target = result.targets[0]; - player.line(target, "green"); - player.discardPlayerCard(target, true, "he"); - } - "step 5"; - if (event.bool2) { - player.addTempSkill("zhongjian2"); - } - if (!event.bool1 && !event.bool2) { - player.addSkill("caishix"); - if (typeof player.storage.caishix != "number") player.storage.caishix = 0; - player.storage.caishix--; - player.markSkill("caishix"); - player.popup("杯具"); - } - }, - ai: { - order: 8, - result: { - player: function (player, target) { - return Math.min(target.hp, target.countCards("h")); - }, - }, - }, - }, - zhongjian2: {}, - caishi: { - audio: 2, - trigger: { player: "phaseDrawBegin" }, - direct: true, - content: function () { - "step 0"; - if (player.isHealthy()) { - event.type = 0; - player.chooseBool(get.prompt("caishi"), "令自己的手牌上限+1", function () { - return true; - }); - } else { - event.type = 1; - player.chooseControlList(get.prompt("caishi"), "令自己的手牌上限+1", "回复1点体力,然后本回合你的牌不能对自己使用", function () { - return 1; - }); - } - "step 1"; - if (event.type) { - if (result.control != "cancel2") { - player.logSkill("caishi"); - if (result.index == 0) { - player.addSkill("caishix"); - if (typeof player.storage.caishix != "number") player.storage.caishix = 0; - player.storage.caishix++; - player.markSkill("caishix"); - } else if (result.index == 1) { - player.recover(); - player.addTempSkill("caishi3"); - } - } - } else { - if (result.bool) { - player.logSkill("caishi"); - player.addSkill("caishix"); - if (typeof player.storage.caishix != "number") player.storage.caishix = 0; - player.storage.caishix++; - player.markSkill("caishix"); - } - } - }, - }, - caishix: { - intro: { - content: function (storage) { - if (storage > 0) return "手牌上限+" + storage; - if (storage < 0) return "手牌上限" + storage; - return "手牌上限无变化"; - }, - }, - mod: { - maxHandcard: function (player, num) { - if (typeof player.storage.caishix == "number") return num + player.storage.caishix; - }, - }, - charlotte: true, - onremove: true, - }, - caishi2: { - mod: { - playerEnabled: function (card, player, target) { - if (player != target) return false; - }, - }, - }, - caishi3: { - mod: { - playerEnabled: function (card, player, target) { - if (player == target) return false; - }, - }, - }, - ttt: { - mod: { - targetEnabled: function (card) { - if (card.name == "tao") return false; - }, - }, - }, - jyzongshi: { - audio: 2, - audioname: ["re_jianyong"], - trigger: { - player: ["chooseToCompareAfter", "compareMultipleAfter"], - target: ["chooseToCompareAfter", "compareMultipleAfter"], - }, - filter: function (event, player) { - if (event.preserve) return false; - if (player == event.player) { - if (event.num1 > event.num2) { - return !get.owner(event.card2); - } else { - return !get.owner(event.card1); - } - } else { - if (event.num1 < event.num2) { - return !get.owner(event.card1); - } else { - return !get.owner(event.card2); - } - } - }, - check: function (event, player) { - if (player == event.player) { - if (event.num1 > event.num2) { - return event.card2.name != "du"; - } else { - return event.card1.name != "du"; - } - } else { - if (event.num1 < event.num2) { - return event.card1.name != "du"; - } else { - return event.card2.name != "du"; - } - } - }, - content: function () { - if (player == trigger.player) { - if (trigger.num1 > trigger.num2) { - player.gain(trigger.card2, "gain2", "log"); - } else { - player.gain(trigger.card1, "gain2", "log"); - } - } else { - if (trigger.num1 < trigger.num2) { - player.gain(trigger.card1, "gain2", "log"); - } else { - player.gain(trigger.card2, "gain2", "log"); - } - } - }, - }, - xinsidi: { - audio: "sidi", - trigger: { global: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - if (event.player == player || event.player.isDead()) return false; - return player.countCards("e") > 0; - }, - content: function () { - "step 0"; - var goon = true; - if (get.attitude(player, trigger.player) >= -0.8) goon = false; - else if (trigger.player.countCards("h") <= 3) goon = false; - else if (player.countCards("h", "shan") == 0) goon = false; - var es = player.getCards("e"); - var color = []; - for (var i = 0; i < es.length; i++) { - color.add(get.color(es[i])); - } - if (color.length == 2) color = "all"; - else color = color[0]; - player - .chooseToDiscard(get.prompt2("xinsidi", trigger.player), "he", function (card) { - if (get.type(card) == "basic") return false; - if (_status.event.color == "all") return true; - return get.color(card) == _status.event.color; - }) - .set("ai", function (card) { - if (_status.event.goon) return 6 - get.value(card); - return 0; - }) - .set("goon", goon) - .set("color", color) - .set("logSkill", ["xinsidi", trigger.player]); - "step 1"; - if (result.bool) { - trigger.player.addSkill("xinsidi2"); - trigger.player.markAuto("xinsidi2", [get.color(result.cards[0], result.cards[0].original == "h" ? player : false)]); - trigger.player.storage.xinsidi4 = player; - trigger.player.syncStorage("xinsidi2"); - } - }, - ai: { - threaten: 1.5, - }, - }, - xinsidi2: { - mark: true, - group: ["xinsidi2_end"], - subSkill: { - end: { - trigger: { player: "phaseUseEnd" }, - forced: true, - popup: false, - audio: false, - content: function () { - "step 0"; - if ( - player.storage.xinsidi4.isIn() && - !player.getHistory("useCard", function (evt) { - return evt.card.name == "sha"; - }).length && - player.storage.xinsidi4.canUse({ name: "sha", isCard: true }, player, false) - ) { - player.storage.xinsidi4.logSkill("xinsidi", player); - player.storage.xinsidi4.useCard({ name: "sha", isCard: true }, player); - } - "step 1"; - delete player.storage.xinsidi2; - delete player.storage.xinsidi3; - delete player.storage.xinsidi4; - player.removeSkill("xinsidi2"); - }, - }, - }, - mod: { - cardEnabled: function (card, player) { - if (player.getStorage("xinsidi2").includes(get.color(card))) return false; - }, - cardRespondable: function (card, player) { - if (player.getStorage("xinsidi2").includes(get.color(card))) return false; - }, - cardSavable: function (card, player) { - if (player.getStorage("xinsidi2").includes(get.color(card))) return false; - }, - }, - intro: { - content: "不能使用或打出$的牌", - }, - }, - taoluan: { - hiddenCard: function (player, name) { - return !player.getStorage("taoluan").includes(name) && player.countCards("hes") > 0 && !player.hasSkill("taoluan3") && lib.inpile.includes(name); - }, - audio: 2, - enable: "chooseToUse", - filter: function (event, player) { - return ( - !player.hasSkill("taoluan3") && - player.hasCard(card => - lib.inpile.some(name => { - if (player.getStorage("taoluan").includes(name)) return false; - if (get.type(name) != "basic" && get.type(name) != "trick") return false; - if (event.filterCard({ name: name, isCard: true, cards: [card] }, player, event)) return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - if (event.filterCard({ name: name, nature: nature, isCard: true, cards: [card] }, player, event)) return true; - } - } - return false; - }, "hes") - ) > 0 - ); - }, - onremove: true, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var name of lib.inpile) { - if (get.type(name) == "basic" || get.type(name) == "trick") { - if (player.getStorage("taoluan").includes(name)) continue; - list.push([get.translation(get.type(name)), "", name]); - if (name == "sha") { - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } - } - } - 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) { - var player = _status.event.player; - var card = { name: button.link[2], nature: button.link[3] }; - if (player.countCards("hes", cardx => cardx.name == card.name)) return 0; - return _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; - }, - backup: function (links, player) { - return { - audio: "taoluan", - filterCard: true, - popname: true, - check: function (card) { - return 7 - get.value(card); - }, - position: "hes", - viewAs: { name: links[0][2], nature: links[0][3] }, - onuse: function (result, player) { - player.markAuto("taoluan", [result.card.name]); - }, - }; - }, - prompt: function (links, player) { - return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; - }, - }, - ai: { - save: true, - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - if (!player.countCards("hes") || player.hasSkill("taoluan3")) return false; - if (tag == "respondSha" || tag == "respondShan") { - if (arg == "respond") return false; - return !player.getStorage("taoluan").includes(tag == "respondSha" ? "sha" : "shan"); - } - return !player.getStorage("taoluan").includes("tao") || (!player.getStorage("taoluan").includes("jiu") && arg == player); - }, - order: 4, - result: { - player: function (player) { - var allshown = true, - players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i].ai.shown == 0) { - allshown = false; - } - if (players[i] != player && players[i].countCards("h") && get.attitude(player, players[i]) > 0) { - return 1; - } - } - if (allshown) return 1; - return 0; - }, - }, - threaten: 1.9, - }, - group: "taoluan2", - }, - taoluan2: { - charlotte: true, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - if (!game.hasPlayer(current => current != player)) return false; - return event.skill == "taoluan_backup"; - }, - forced: true, - popup: false, - content: function () { - "step 0"; - player - .chooseTarget( - true, - function (card, player, target) { - return target != player; - }, - '滔乱

    令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力' - ) - .set("ai", function (target) { - var player = _status.event.player; - if (get.attitude(player, target) > 0) { - if (get.attitude(target, player) > 0) { - return target.countCards("he"); - } - return target.countCards("he") / 2; - } - return 0; - }); - "step 1"; - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - var type = get.type(trigger.card, "trick"); - target - .chooseCard('滔乱

    交给' + get.translation(player) + "一张不为" + get.translation(type) + "牌的牌,或令其失去1点体力且滔乱无效直到回合结束", "he", function (card, player, target) { - return get.type(card, "trick") != _status.event.cardType; - }) - .set("cardType", type) - .set("ai", function (card) { - if (_status.event.att) { - return 11 - get.value(card); - } - return 0; - }) - .set("att", get.attitude(target, player) > 0); - "step 2"; - var target = event.target; - if (result.bool) { - target.give(result.cards, player); - } else { - player.addTempSkill("taoluan3"); - player.loseHp(); - } - }, - }, - taoluan3: { charlotte: true }, - taoluan_backup: {}, - jishe: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.getHandcardLimit() > 0; - }, - usable: 20, - locked: false, - content: function () { - player.draw(); - player.addTempSkill("jishe2"); - player.addMark("jishe2", 1, false); - }, - ai: { - order: 10, - result: { - player: function (player) { - if (!player.needsToDiscard(1)) { - return 1; - } - return 0; - }, - }, - }, - group: ["jishe3"], - }, - jishe2: { - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("jishe2"); - }, - }, - onremove: true, - charlotte: true, - marktext: "奢", - intro: { content: "手牌上限-#" }, - }, - jishe3: { - audio: "jishe", - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - if (player.countCards("h")) return false; - return game.hasPlayer(function (current) { - return !current.isLinked(); - }); - }, - content: function () { - "step 0"; - var num = game.countPlayer(function (current) { - return !current.isLinked(); - }); - player - .chooseTarget(get.prompt("jishe"), "横置至多" + get.cnNumber(Math.min(num, player.hp)) + "名未横置的角色", [1, Math.min(num, player.hp)], function (card, player, target) { - return !target.isLinked(); - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - player.logSkill("jishe", result.targets); - event.targets = result.targets; - event.num = 0; - } else { - event.finish(); - } - "step 2"; - if (event.num < event.targets.length) { - event.targets[event.num].link(); - event.num++; - event.redo(); - } - }, - ai: { - expose: 0.3, - }, - }, - lianhuo: { - audio: 2, - trigger: { player: "damageBegin3" }, - forced: true, - filter: function (event, player) { - return player.isLinked() && event.notLink() && event.hasNature("fire"); - }, - content: function () { - trigger.num++; - }, - ai: { - halfneg: true, - }, - }, - huisheng: { - audio: 2, - audioname: ["dc_huanghao"], - trigger: { player: "damageBegin4" }, - direct: true, - filter: function (event, player) { - if (!player.countCards("he")) return false; - if (!event.source || event.source == player || !event.source.isIn()) return false; - if (player.storage.huisheng && player.storage.huisheng.includes(event.source)) return false; - return true; - }, - init: function (player) { - if (player.storage.huisheng) player.storage.huisheng = []; - }, - content: function () { - "step 0"; - var att = get.attitude(player, trigger.source) > 0; - var goon = false; - if (player.hp == 1) { - goon = true; - } else { - var he = player.getCards("he"); - var num = 0; - for (var i = 0; i < he.length; i++) { - if (get.value(he[i]) < 8) { - num++; - if (num >= 2) { - goon = true; - break; - } - } - } - } - player - .chooseCard("he", [1, player.countCards("he")], get.prompt2("huisheng", trigger.source)) - .set("ai", function (card) { - if (_status.event.att) { - return 10 - get.value(card); - } - if (_status.event.goon) { - return 8 - get.value(card); - } - if (!ui.selected.cards.length) { - return 7 - get.value(card); - } - return 0; - }) - .set("goon", goon) - .set("att", att); - "step 1"; - if (result.bool) { - player.logSkill("huisheng", trigger.source); - game.delay(); - event.num = result.cards.length; - var goon = false; - if (event.num > 2 || get.attitude(trigger.source, player) >= 0) { - goon = true; - } - var forced = false; - var str = "获得其中一张牌并防止伤害"; - if (trigger.source.countCards("he") < event.num) { - forced = true; - } else { - str += ",或取消并弃置" + get.cnNumber(result.cards.length) + "张牌"; - } - trigger.source - .chooseButton([str, result.cards], forced) - .set("ai", function (button) { - if (_status.event.goon) { - return get.value(button.link); - } - return get.value(button.link) - 8; - }) - .set("goon", goon); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - var card = result.links[0]; - trigger.source.gain(card, player, "giveAuto", "bySelf"); - trigger.cancel(); - if (!player.storage.huisheng) player.storage.huisheng = []; - player.storage.huisheng.push(trigger.source); - } else { - trigger.source.chooseToDiscard(event.num, true, "he"); - } - }, - }, - qinqing: { - audio: 2, - mode: ["identity", "versus", "doudizhu"], - available: function (mode) { - if (mode == "versus" && _status.mode != "four") return false; - if (mode == "identity" && _status.mode == "purple") return false; - }, - getZhu: player => { - if (get.mode == "doudizhu") return game.findPlayer(i => i.identity == "zhu"); - return get.zhu(player); - }, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - var zhu = get.info("qinqing").getZhu(player); - if (!zhu || (get.mode != "doudizhu" && !zhu.isZhu)) return false; - return game.hasPlayer(function (current) { - return current != zhu && current.inRange(zhu); - }); - }, - content: function () { - "step 0"; - event.zhu = get.info("qinqing").getZhu(player); - player - .chooseTarget(get.prompt2("qinqing"), [1, Infinity], function (card, player, target) { - var zhu = get.event("zhu"); - if (target == zhu) return false; - return target.inRange(zhu); - }) - .set("ai", function (target) { - var he = target.countCards("he"); - var zhu = get.event("zhu"); - if (get.attitude(_status.event.player, target) > 0) { - if (he == 0) return 1; - if (target.countCards("h") > zhu.countCards("h")) return 1; - } else { - if (he > 0) return 1; - } - return 0; - }) - .set("zhu", event.zhu); - "step 1"; - if (result.bool) { - event.targets = result.targets.slice(0).sortBySeat(); - event.list = event.targets.slice(0); - player.logSkill("qinqing", event.targets); - } else { - event.finish(); - } - "step 2"; - if (event.targets.length) { - var target = event.targets.shift(); - if (target.countCards("he")) { - player.discardPlayerCard(target, "he", true); - } - target.draw(); - event.redo(); - } - "step 3"; - var num = 0; - if (event.zhu) { - var nh = event.zhu.countCards("h"); - for (var i = 0; i < event.list.length; i++) { - if (event.list[i].countCards("h") > nh) { - num++; - } - } - if (num) { - player.draw(num); - } - } - }, - ai: { - threaten: 1.2, - }, - }, - guizao: { - audio: 2, - trigger: { player: "phaseDiscardEnd" }, - direct: true, - filter: function (event, player) { - if (event.cards && event.cards.length > 1) { - var suits = []; - for (var i = 0; i < event.cards.length; i++) { - var suit = get.suit(event.cards[i]); - if (suits.includes(suit)) { - return false; - } else { - suits.push(suit); - } - } - return true; - } - return false; - }, - content: function () { - player.chooseDrawRecover(get.prompt("guizao"), "摸一张牌或回复1点体力").logSkill = "guizao"; - }, - }, - jiyu: { - audio: 2, - enable: "phaseUse", - locked: false, - filter: function (event, player) { - if (!player.getStat().skill.jiyu || !player.storage.jiyu2) return true; - var hs = player.getCards("h"); - for (var i = 0; i < hs.length; i++) { - if (!player.storage.jiyu2.includes(get.suit(hs[i]))) { - return true; - } - } - return false; - }, - filterTarget: function (card, player, target) { - return target.countCards("h") && (!player.storage.jiyu || !player.storage.jiyu.includes(target)); - }, - content: function () { - "step 0"; - var evt = _status.event.getParent("phaseUse"); - if (evt && evt.name == "phaseUse" && !evt.jiyu) { - evt.jiyu = true; - var next = game.createEvent("jiyu_clear"); - _status.event.next.remove(next); - evt.after.push(next); - next.player = player; - next.setContent(function () { - game.broadcastAll(function (player) { - delete player.storage.jiyu; - delete player.storage.jiyu2; - }, player); - }); - } - if (!player.storage.jiyu) player.storage.jiyu = []; - player.storage.jiyu.push(target); - var spade = true; - if (player.isTurnedOver() || get.attitude(target, player) > 0 || target.hp <= 2) { - spade = false; - } - target - .chooseToDiscard("h", true) - .set("ai", function (card) { - if (get.suit(card) == "spade") { - if (_status.event.spade) { - return 10 - get.value(card); - } else { - return -10 - get.value(card); - } - } - if (_status.event.getParent().player.storage.jiyu2 && _status.event.getParent().player.storage.jiyu2.includes(get.suit(card))) { - return -3 - get.value(card); - } - return -get.value(card); - }) - .set("spade", spade); - "step 1"; - if (!result.cards || !result.cards.length) return; - var card = result.cards[0]; - if (get.suit(card, target) == "spade") { - player.turnOver(); - target.loseHp(); - } - if (!player.storage.jiyu2) player.storage.jiyu2 = []; - player.storage.jiyu2.add(get.suit(card)); - }, - onremove: ["jiyu", "jiyu2"], - ai: { - order: 9, - result: { - target: function (player, target) { - if (player.isTurnedOver() || target.countCards("h") <= 3) return -1; - return 0; - }, - }, - }, - mod: { - cardEnabled: function (card, player) { - if (player.storage.jiyu2 && player.storage.jiyu2.includes(get.suit(card))) return false; - }, - cardSavable: function (card, player) { - if (player.storage.jiyu2 && player.storage.jiyu2.includes(get.suit(card))) return false; - }, - }, - }, - jiyu2: { - trigger: { player: ["phaseUseBegin", "phaseUseAfter"] }, - silent: true, - content: function () { - player.storage.jiyu = []; - player.storage.jiyu2 = []; - }, - }, - jiaozhao: { - mod: { - targetEnabled: function (card, player, target) { - if (card.storage && card.storage.jiaozhao && card.storage.jiaozhao == target) return false; - }, - }, - enable: "phaseUse", - usable: 1, - audio: 2, - check: function (card) { - return 8 - get.value(card); - }, - filter: function (event, player) { - return player.countMark("xindanxin") < 2 && player.countCards("h") > 0; - }, - filterCard: true, - discard: false, - lose: false, - delay: false, - locked: false, - content: function () { - "step 0"; - player.showCards(cards); - "step 1"; - if (player.countMark("xindanxin") > 1) { - event.target = player; - } else { - var targets = game.filterPlayer(); - targets.remove(player); - targets.sort(function (a, b) { - return Math.max(1, get.distance(player, a)) - Math.max(1, get.distance(player, b)); - }); - var distance = Math.max(1, get.distance(player, targets[0])); - for (var i = 1; i < targets.length; i++) { - if (Math.max(1, get.distance(player, targets[i])) > distance) { - targets.splice(i); - break; - } - } - player - .chooseTarget("请选择【矫诏】的目标", true, function (card, player, target) { - return _status.event.targets.includes(target); - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .set("targets", targets); - } - "step 2"; - if (!event.target) { - event.target = result.targets[0]; - player.line(result.targets, "green"); - } - if (!event.target) { - event.finish(); - return; - } - var list = []; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - if (name == "sha") { - list.push(["基本", "", "sha"]); - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); - } else if (get.type(name) == "basic") list.push(["基本", "", name]); - else if (player.countMark("xindanxin") > 0 && get.type(name) == "trick") list.push(["锦囊", "", name]); - } - event.target - .chooseButton(["矫诏", [list, "vcard"]], true) - .set("ai", function (button) { - var player = _status.event.getParent().player, - card = { - name: button.link[2], - nature: button.link[3], - storage: { - jiaozhao: player, - }, - }; - return player.getUseValue(card, null, true) * _status.event.att; - }) - .set("att", get.attitude(event.target, player) > 0 ? 1 : -1); - "step 3"; - var chosen = result.links[0][2]; - var nature = result.links[0][3]; - var fakecard = { - name: chosen, - storage: { jiaozhao: player }, - }; - if (nature) fakecard.nature = nature; - event.target.showCards( - game.createCard({ - name: chosen, - nature: nature, - suit: cards[0].suit, - number: cards[0].number, - }), - get.translation(event.target) + "声明了" + get.translation(chosen) - ); - player.storage.jiaozhao = cards[0]; - player.storage.jiaozhao_card = fakecard; - game.broadcastAll( - function (name, card) { - lib.skill.jiaozhao2.viewAs = fakecard; - card.addGaintag("jiaozhao"); - }, - fakecard, - cards[0] - ); - player.addTempSkill("jiaozhao2", "phaseUseEnd"); - }, - ai: { - order: 9, - result: { - player: 1, - }, - }, - group: "jiaozhao3", - }, - jiaozhao2: { - enable: "phaseUse", - audio: "jiaozhao", - charlotte: true, - filter: function (event, player) { - if (!player.storage.jiaozhao || !lib.skill.jiaozhao2.viewAs) return false; - var name = lib.skill.jiaozhao2.viewAs.name; - return player.getCards("h").includes(player.storage.jiaozhao) && player.storage.jiaozhao.hasGaintag("jiaozhao") && game.checkMod(player.storage.jiaozhao, player, "unchanged", "cardEnabled2", player) !== false; - }, - filterCard: function (card, player) { - return card == player.storage.jiaozhao; - }, - selectCard: -1, - popname: true, - prompt: function () { - return "选择" + get.translation(lib.skill.jiaozhao2.viewAs) + "的目标"; - }, - check: function (card) { - return 8 - get.value(card); - }, - ai: { - order: 6, - }, - onremove: function (player) { - player.removeGaintag("jiaozhao"); - delete player.storage.jiaozhao; - delete player.storage.jiaozhao_card; - }, - }, - jiaozhao3: { - audio: "jiaozhao", - enable: "phaseUse", - filter: function (event, player) { - return (player.getStat("skill").jiaozhao || 0) + (player.getStat("skill").jiaozhao3 || 0) < player.countMark("xindanxin") - 1 && player.countCards("h") > 0; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i of lib.inpile) { - var type = get.type(i, false); - if (type == "basic" || type == "trick") { - var card = { - name: i, - storage: { - jiaozhao: player, - }, - }; - if (event.filterCard(card, player, event)) list.push([type, "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) { - card.nature = j; - if (event.filterCard(card, player, event)) list.push([type, "", i, j]); - } - } - } - } - if (list.length) return ui.create.dialog("矫诏", [list, "vcard"]); - return ui.create.dialog("矫诏:当前没有可用牌"); - }, - check: function (button) { - var player = _status.event.player, - card = { - name: button.link[2], - nature: button.link[3], - storage: { - jiaozhao: player, - }, - }; - return player.getUseValue(card); - }, - backup: function (links, player) { - return { - audio: "jiaozhao", - filterCard: true, - position: "h", - popname: true, - viewAs: { - name: links[0][2], - nature: links[0][3], - storage: { - jiaozhao: player, - }, - }, - check: function (card) { - return 8 - get.value(card); - }, - }; - }, - prompt: function (links, player) { - return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; - }, - }, - ai: { - order: 9, - result: { - player: 1, - }, - }, - }, - jiaozhao3_backup: { audio: "jiaozhao" }, - xindanxin: { - trigger: { player: "damageEnd" }, - frequent: true, - audio: "danxin", - content: function () { - player.draw(); - if (player.countMark("xindanxin") < 3) { - player.addMark("xindanxin", 1, false); - game.log(player, "修改了技能", "#g【矫诏】"); - } - }, - intro: { content: "【矫诏】加成等级:Lv.#" }, - ai: { - maixie: true, - effect: { - target: (card, player, target) => { - if (!get.tag(card, "damage")) return; - if (target.hp + target.hujia < 2 || player.hasSkillTag("jueqing", false, target)) return 1.8; - if (target.countMark("xindanxin") > 1) return [1, 1]; - return [1, 0.8 * target.hp - 0.5]; - }, - }, - }, - }, - danxin: { - trigger: { player: "damageEnd" }, - frequent: true, - audio: 2, - content: function () { - "step 0"; - if (player.countMark("xindanxin") >= 2) { - player.draw(); - event.finish(); - } else { - var list = ["draw_card", "更改描述"]; - var prompt; - if (player.countMark("xindanxin") == 0) { - prompt = '摸一张牌或更改矫诏的描述

    更改描述:将“选择距离最近的一名其他角色,该角色”改为“你”'; - } else { - prompt = '摸一张牌或更改矫诏的描述

    更改描述:将“基本牌”改为“基本牌或普通锦囊牌”'; - } - player - .chooseControl(list, function () { - if (!_status.event.player.hasSkill("jiaozhao")) return "draw_card"; - return "更改描述"; - }) - .set("prompt", prompt); - } - "step 1"; - if (result.control == "draw_card") { - player.draw(); - } else { - game.log(player, "更改了", "【矫诏】", "的描述"); - player.popup("更改描述"); - player.addMark("xindanxin", 1, false); - } - }, - ai: { - maixie: true, - effect: { - target: (card, player, target) => { - if (!get.tag(card, "damage")) return; - if (target.hp < 2 || player.hasSkillTag("jueqing", false, target)) return 1.5; - return [1, 1]; - }, - }, - }, - }, - zongzuo: { - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - audio: 2, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - var num = game.countGroup(); - player.gainMaxHp(num); - event.num = num; - "step 1"; - player.recover(event.num); - //player.update(); - }, - group: "zongzuo_lose", - subSkill: { - lose: { - trigger: { global: "dieAfter" }, - forced: true, - audio: "zongzuo", - filter: function (event, player) { - if (!lib.group.includes(event.player.group)) return false; - if ( - game.hasPlayer(function (current) { - return current.group == event.player.group; - }) - ) { - return false; - } - return true; - }, - content: function () { - player.loseMaxHp(); - }, - }, - }, - }, - zhige: { - enable: "phaseUse", - usable: 1, - audio: 2, - filter: function (event, player) { - return player.countCards("h") > player.hp; - }, - filterTarget: function (card, player, target) { - return get.distance(target, player, "attack") <= 1 && target.countCards("e") > 0; - }, - content: function () { - "step 0"; - target.chooseToUse({ name: "sha" }, "止戈:使用一张杀,或将其装备区里的一张牌交给" + get.translation(player)); - "step 1"; - if (!result.bool && target.countCards("e")) { - target.chooseCard("e", true, "将其装备区里的一张牌交给" + get.translation(player)); - } else { - event.finish(); - } - "step 2"; - if (result.bool && result.cards && result.cards.length) { - target.give(result.cards, player); - } - }, - ai: { - expose: 0.2, - order: 5, - result: { - target: -1, - player: function (player, target) { - if (target.countCards("h") == 0) return 0; - if (target.countCards("h") == 1) return -0.1; - if (player.hp <= 2) return -2; - if (player.countCards("h", "shan") == 0) return -1; - return -0.5; - }, - }, - }, - }, - kuangbi: { - enable: "phaseUse", - usable: 1, - audio: 2, - filterTarget: function (card, player, target) { - return target != player && target.countCards("he") > 0; - }, - content: function () { - "step 0"; - target.chooseCard("he", [1, 3], "匡弼:将至多三张牌置于" + get.translation(player) + "的武将牌上", true).set("ai", function (card) { - if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { - return 7 - get.value(card); - } - return -get.value(card); - }); - "step 1"; - if (result.bool) { - player.addToExpansion(result.cards, target, "give").gaintag.add("kuangbi"); - if (!player.storage.kuangbi_draw) player.storage.kuangbi_draw = [[], []]; - player.storage.kuangbi_draw[0].push(target); - player.storage.kuangbi_draw[1].push(result.cards.length); - player.addSkill("kuangbi_draw"); - player.syncStorage("kuangbi_draw"); - player.updateMarks("kuangbi_draw"); - } - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - delete player.storage[skill]; - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (get.attitude(player, target) > 0) { - return Math.sqrt(target.countCards("he")); - } - return 0; - }, - player: 1, - }, - }, - subSkill: { - draw: { - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - mark: true, - charlotte: true, - audio: "kuangbi", - onremove: true, - filter: function (event, player) { - return player.getExpansions("kuangbi").length; - }, - content: function () { - player.gain(player.getExpansions("kuangbi"), "gain2"); - var storage = player.storage.kuangbi_draw; - if (storage.length) { - for (var i = 0; i < storage[0].length; i++) { - var target = storage[0][i], - num = storage[1][i]; - if (target && target.isIn()) { - player.line(target); - target.draw(num); - } - } - } - player.removeSkill("kuangbi_draw"); - }, - }, - }, - }, - fulin: { - trigger: { player: "phaseDiscardBegin" }, - audio: 2, - forced: true, - content: function () { - player.addTempSkill("fulin2", "phaseDiscardAfter"); - }, - group: ["fulin_count", "fulin_reset"], - subSkill: { - reset: { - trigger: { player: ["phaseBefore", "phaseAfter"] }, - silent: true, - priority: 10, - content: function () { - player.removeGaintag("fulin"); - }, - }, - count: { - trigger: { player: "gainBegin" }, - audio: "fulin", - forced: true, - silent: true, - filter: function (event, player) { - return _status.currentPhase == player; - }, - content: function () { - trigger.gaintag.add("fulin"); - }, - }, - }, - onremove: function (player) { - player.removeGaintag("fulin"); - }, - }, - fulin2: { - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("fulin")) { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("fulin")) { - return false; - } - }, - }, - }, - duliang: { - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player != target && target.countCards("h") > 0; - }, - audio: 2, - content: function () { - "step 0"; - player.gainPlayerCard(target, "h", true); - "step 1"; - var name = get.translation(target); - player - .chooseControl(function () { - return Math.random() < 0.5 ? "选项一" : "选项二"; - }) - .set("prompt", "督粮") - .set("choiceList", ["令" + name + "观看牌堆顶的两张牌,然后获得其中的基本牌", "令" + name + "于下个摸牌阶段额外摸一张牌"]); - "step 2"; - if (result.control == "选项一") { - var cards = get.cards(2); - target.viewCards("督粮", cards); - event.cards2 = []; - event.tothrow = []; - for (var i = 0; i < cards.length; i++) { - if (get.type(cards[i]) == "basic") { - ui.special.appendChild(cards[i]); - event.cards2.push(cards[i]); - } else { - event.tothrow.push(cards[i]); - } - } - while (event.tothrow.length) { - ui.cardPile.insertBefore(event.tothrow.pop(), ui.cardPile.firstChild); - } - } else { - target.addSkill("duliang2"); - target.updateMarks("duliang2"); - target.storage.duliang2++; - event.finish(); - } - "step 3"; - if (event.cards2 && event.cards2.length) { - target.gain(event.cards2, "draw"); - game.log(target, "获得了" + get.cnNumber(event.cards2.length) + "张牌"); - } - game.updateRoundNumber(); - }, - ai: { - order: 4, - result: { - target: -1, - player: 0.1, - }, - }, - }, - duliang2: { - trigger: { player: "phaseDrawBegin" }, - forced: true, - mark: true, - audio: false, - onremove: true, - charlotte: true, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = 0; - }, - intro: { - content: "下个摸牌阶段额外摸#张牌", - }, - content: function () { - trigger.num += player.storage.duliang2; - player.removeSkill("duliang2"); - }, - }, - xinfencheng: { - skillAnimation: "epic", - animationColor: "gray", - audio: 2, - audioname: ["re_liru"], - enable: "phaseUse", - filter: function (event, player) { - return !player.storage.xinfencheng; - }, - filterTarget: function (card, player, target) { - return player != target; - }, - unique: true, - limited: true, - selectTarget: -1, - multitarget: true, - multiline: true, - mark: true, - line: "fire", - content: function () { - "step 0"; - player.storage.xinfencheng = true; - player.awakenSkill("xinfencheng"); - event.num = 1; - event.targets = targets.slice(0); - event.targets.sort(lib.sort.seat); - "step 1"; - if (event.targets.length) { - var target = event.targets.shift(); - event.target = target; - var res = get.damageEffect(target, player, target, "fire"); - target - .chooseToDiscard("he", "弃置至少" + get.cnNumber(event.num) + "张牌或受到2点火焰伤害", [num, Infinity]) - .set("ai", function (card) { - if (ui.selected.cards.length >= _status.event.getParent().num) return -1; - if (_status.event.player.hasSkillTag("nofire")) return -1; - if (_status.event.res >= 0) return 6 - get.value(card); - if (get.type(card) != "basic") { - return 10 - get.value(card); - } - return 8 - get.value(card); - }) - .set("res", res); - } else { - event.finish(); - } - "step 2"; - if (!result.bool) { - event.target.damage(2, "fire"); - event.num = 1; - } else { - event.num = result.cards.length + 1; - } - event.goto(1); - }, - ai: { - order: 1, - result: { - player: function (player) { - var num = 0, - eff = 0, - players = game - .filterPlayer(function (current) { - return current != player; - }) - .sortBySeat(player); - for (var target of players) { - if (get.damageEffect(target, player, target, "fire") >= 0) { - num = 0; - continue; - } - var shao = false; - num++; - if ( - target.countCards("he", function (card) { - if (get.type(card) != "basic") { - return get.value(card) < 10; - } - return get.value(card) < 8; - }) < num - ) - shao = true; - if (shao) { - eff -= 4 * (get.realAttitude || get.attitude)(player, target); - num = 0; - } else eff -= (num * (get.realAttitude || get.attitude)(player, target)) / 4; - } - if (eff < 4) return 0; - return eff; - }, - }, - }, - init: function (player) { - player.storage.xinfencheng = false; - }, - intro: { - content: "limited", - }, - }, - xinjuece: { - audio: "juece", - audioname: ["dc_liru"], - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (player) { - return player.countCards("h") == 0; - }); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("xinjuece"), "对一名没有手牌的角色造成1点伤害", function (card, player, target) { - return target.countCards("h") == 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - player.logSkill("xinjuece", result.targets); - result.targets[0].damage(); - } - }, - }, - xinmieji: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h", { type: ["trick", "delay"], color: "black" }); - }, - filterCard: function (card) { - return get.color(card) == "black" && get.type(card, "trick") == "trick"; - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - discard: false, - delay: false, - check: function (card) { - return 8 - get.value(card); - }, - loseTo: "cardPile", - insert: true, - visible: true, - content: function () { - "step 0"; - player.showCards(cards); - "step 1"; - target.chooseToDiscard("he", true).set("prompt", "请弃置一张锦囊牌,或依次弃置两张非锦囊牌。"); - "step 2"; - if ( - (!result.cards || get.type(result.cards[0], "trick", result.cards[0].original == "h" ? target : false) != "trick") && - target.countCards("he", function (card) { - return get.type(card, "trick") != "trick"; - }) - ) { - target - .chooseToDiscard("he", true, function (card) { - return get.type(card, "trick") != "trick"; - }) - .set("prompt", "请弃置第二张非锦囊牌"); - } - }, - ai: { - order: 9, - result: { - target: -1, - }, - }, - }, - qianju: { - mod: { - globalFrom: function (from, to, distance) { - return distance - from.getDamagedHp(); - }, - }, - }, - reqianju: { - mod: { - globalFrom: function (from, to, distance) { - return distance - Math.max(1, from.getDamagedHp()); - }, - }, - }, - reqingxi: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - filter: function (event, player) { - return event.card.name == "sha" || event.card.name == "juedou"; - }, - check: function (event, player) { - return get.attitude(player, event.target) < 0; - }, - logTarget: "target", - content: function () { - "step 0"; - var num = Math.min( - game.countPlayer(function (current) { - return player.inRange(current); - }), - player.getEquips(1).length ? 4 : 2 - ); - if (trigger.target.countCards("h") < num) { - event.directfalse = true; - } else { - trigger.target.chooseToDiscard(num, "弃置" + get.cnNumber(num) + "张手牌,或令" + get.translation(trigger.card) + "的伤害+1").set("ai", function (card) { - var player = _status.event.player; - if (player.hp == 1) { - if (get.type(card) == "basic") { - return 8 - get.value(card); - } else { - return 10 - get.value(card); - } - } else { - if (num > 2) { - return 0; - } - return 8 - get.value(card); - } - }); - } - "step 1"; - if (!event.directfalse && result.bool) { - var e1 = player.getEquips(1); - if (e1.length) { - player.discard(e1, "notBySelf"); - } - event.finish(); - } else { - var id = trigger.target.playerid; - var map = trigger.customArgs; - if (!map[id]) map[id] = {}; - if (!map[id].extraDamage) map[id].extraDamage = 0; - map[id].extraDamage++; - player.judge(function (card) { - if (get.color(card) == "red") return 1; - return 0; - }).judge2 = function (result) { - return result.bool; - }; - } - "step 2"; - if (result.color == "red") trigger.directHit.add(trigger.target); - }, - }, - reqingxi2: { - mod: { - cardEnabled: function (card, player) { - if ( - player.storage.reqingxi2 && - player.storage.reqingxi2.filter(function (cd) { - return get.color(cd) == get.color(card); - }).length - ) - return false; - }, - cardRespondable: function (card, player) { - if ( - player.storage.reqingxi2 && - player.storage.reqingxi2.filter(function (cd) { - return get.color(cd) == get.color(card); - }).length - ) - return false; - }, - }, - firstDo: true, - onremove: true, - trigger: { - player: ["damage", "damageCancelled", "damageZero"], - target: ["shaMiss", "useCardToExcluded"], - }, - charlotte: true, - filter: function (event, player) { - return player.storage.reqingxi2 && event.card && player.storage.reqingxi2.includes(event.card); - }, - silent: true, - forced: true, - popup: false, - priority: 12, - content: function () { - player.storage.reqingxi2.remove(trigger.card); - if (!player.storage.reqingxi2.length) player.removeSkill("reqingxi2"); - }, - }, - qingxi: { - audio: 2, - trigger: { source: "damageBegin1" }, - check: function (event, player) { - return get.attitude(player, event.player) < 0; - }, - filter: function (event, player) { - return event.getParent().name == "sha" && player.getEquips(1).length > 0; - }, - content: function () { - "step 0"; - var num = player.getEquipRange(); - if (trigger.player.countCards("h") < num) { - event.directfalse = true; - } else { - trigger.player.chooseToDiscard(num, "弃置" + get.cnNumber(num) + "张手牌,或令杀的伤害+1").set("ai", function (card) { - var player = _status.event.player; - if (player.hp == 1) { - if (get.type(card) == "basic") { - return 8 - get.value(card); - } else { - return 10 - get.value(card); - } - } else { - if (num > 2) { - return 0; - } - return 8 - get.value(card); - } - }); - } - "step 1"; - if (!event.directfalse && result.bool) { - var e1 = player.getEquips(1); - if (e1.length) { - player.discard(e1, "notBySelf"); - } - } else { - trigger.num++; - } - }, - }, - jieyue: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseCardTarget({ - filterTarget: function (card, player, target) { - return target != player && target.countCards("he") > 0; - }, - filterCard: lib.filter.cardDiscardable, - ai1: function (card) { - return 7 - get.useful(card); - }, - ai2: function (target) { - return 1 - get.attitude(_status.event.player, target); - }, - prompt: get.prompt2("jieyue"), - }); - "step 1"; - if (result.bool) { - player.logSkill("jieyue", result.targets); - player.discard(result.cards); - var target = result.targets[0]; - event.target = target; - target.chooseCard("将一张牌置于" + get.translation(player) + "的武将牌上,或令其弃置你的一张牌", "he").set("ai", function (card) { - if (card.name == "du") return 20; - var player = _status.event.player; - if (get.attitude(player, _status.event.getParent().player) > 0) { - return 8 - get.value(card); - } - var nh = player.countCards("h"); - if (nh <= 2) { - return 6 - get.value(card); - } - if (nh <= 3) { - return 2 - get.value(card); - } - return 0; - }); - } else { - event.finish(); - } - "step 2"; - if (result.bool && result.cards && result.cards.length) { - player.addToExpansion(result.cards, "give", target).gaintag.add("jieyue"); - } else if (event.target.countCards("he")) { - player.discardPlayerCard(event.target, true); - } - }, - ai: { expose: 0.1 }, - marktext: "节", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: ["jieyue_wuxie", "jieyue_shan", "jieyue_gain"], - subSkill: { - wuxie: { - audio: true, - enable: "chooseToUse", - filterCard: function (card) { - return get.color(card) == "black"; - }, - viewAsFilter: function (player) { - return player.getExpansions("jieyue").length && player.countCards("hs", { color: "black" }) > 0; - }, - position: "hs", - viewAs: { name: "wuxie" }, - prompt: "将一张黑色手牌当无懈可击使用", - check: function (card) { - return 8 - get.value(card); - }, - }, - shan: { - audio: true, - enable: ["chooseToRespond", "chooseToUse"], - filterCard: function (card) { - return get.color(card) == "red"; - }, - position: "hs", - viewAs: { name: "shan" }, - viewAsFilter: function (player) { - return player.getExpansions("jieyue").length && player.countCards("hs", { color: "red" }) > 0; - }, - prompt: "将一张红色手牌当闪使用或打出", - check: () => 1, - ai: { - respondShan: true, - skillTagFilter: function (player) { - if (!player.getExpansions("jieyue").length || !player.countCards("hs", { color: "red" })) return false; - }, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "respondShan") && current < 0) return 0.8; - }, - }, - }, - }, - gain: { - audio: "jieyue", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return player.getExpansions("jieyue").length; - }, - forced: true, - content: function () { - var cards = player.getExpansions("jieyue"); - if (cards.length) player.gain(cards, "gain2"); - }, - }, - }, - }, - jinjiu: { - mod: { - cardname: function (card, player) { - if (card.name == "jiu") return "sha"; - }, - }, - ai: { - skillTagFilter: function (player) { - if (!player.countCards("h", "jiu")) return false; - }, - respondSha: true, - }, - audio: 2, - trigger: { player: ["useCard1", "respond"] }, - firstDo: true, - forced: true, - filter: function (event, player) { - return event.card.name == "sha" && !event.skill && event.cards.length == 1 && event.cards[0].name == "jiu"; - }, - content: function () {}, - }, - xinxianzhen: { - audio: "xianzhen", - inherit: "xianzhen", - }, - xinxianzhen2: { - audio: "xianzhen", - audioname2: { - ol_gaoshun: "rexianzhen", - }, - mod: { - targetInRange: function (card, player, target) { - if (target == player.storage.xinxianzhen) return true; - }, - cardUsableTarget: function (card, player, target) { - if (target == player.storage.xinxianzhen) return true; - }, - }, - ai: { - unequip: true, - skillTagFilter: function (player, tag, arg) { - if (arg.target != player.storage.xinxianzhen) return false; - }, - effect: { - player: function (card, player, target, current, isLink) { - if (isLink || !player.storage.xinxianzhen) return; - if (target != player.storage.xinxianzhen && ["sha", "guohe", "shunshou", "huogong", "juedou"].includes(card.name)) { - if (get.effect(player.storage.xinxianzhen, card, player, player) > 0) { - return [1, 2]; - } - } - }, - }, - }, - trigger: { player: "useCard2" }, - filter: function (event, player) { - return player.storage.xinxianzhen && player.storage.xinxianzhen.isIn() && (event.card.name == "sha" || get.type(event.card) == "trick") && event.targets && event.targets.length == 1 && !event.targets.includes(player.storage.xinxianzhen); - }, - check: function (event, player) { - return get.effect(player.storage.xinxianzhen, event.card, player, player) > 0; - }, - logTarget: function (event, player) { - return player.storage.xinxianzhen; - }, - prompt2: (event, player) => "令" + get.translation(player.storage.decadexianzhen2) + "也成为" + get.translation(event.card) + "的目标", - content: function () { - var target = player.storage.xinxianzhen; - trigger.targets.push(target); - game.log(target, "成为了", trigger.card, "的额外目标"); - }, - }, - xinxianzhen3: { - charlotte: true, - mod: { - cardEnabled: function (card) { - if (card.name == "sha") return false; - }, - ignoredHandcard: function (card, player) { - if (get.name(card) == "sha") { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && get.name(card) == "sha") { - return false; - } - }, - }, - }, - xianzhen: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { - player.storage[event.name] = target; - player.addTempSkill(event.name + 2); - } else { - player.addTempSkill(event.name + 3); - } - }, - ai: { - order: function (name, player) { - var cards = player.getCards("h"); - if (player.countCards("h", "sha") == 0) { - return 1; - } - for (var i = 0; i < cards.length; i++) { - if (cards[i].name != "sha" && get.number(cards[i]) > 11 && get.value(cards[i]) < 7) { - return 9; - } - } - return get.order({ name: "sha" }) - 1; - }, - result: { - player: function (player) { - if (player.countCards("h", "sha") > 0) return 0; - var num = player.countCards("h"); - if (num > player.hp) return 0; - if (num == 1) return -2; - if (num == 2) return -1; - return -0.7; - }, - target: function (player, target) { - var num = target.countCards("h"); - if (num == 1) return -1; - if (num == 2) return -0.7; - return -0.5; - }, - }, - threaten: 1.3, - }, - }, - xianzhen2: { - charlotte: true, - mod: { - targetInRange: function (card, player, target) { - if (target == player.storage.xianzhen) return true; - }, - cardUsableTarget: function (card, player, target) { - if (target == player.storage.xianzhen) return true; - }, - }, - ai: { - unequip: true, - skillTagFilter: function (player, tag, arg) { - if (arg.target != player.storage.xianzhen) return false; - }, - }, - }, - xianzhen3: { - charlotte: true, - mod: { - cardEnabled: function (card) { - if (card.name == "sha") return false; - }, - }, - }, - lihuo: { - trigger: { player: "useCard1" }, - filter: function (event, player) { - if (event.card.name == "sha" && !game.hasNature(event.card)) return true; - return false; - }, - audio: 2, - audioname: ["re_chengpu"], - check: function (event, player) { - return false; - }, - content: function () { - game.setNature(trigger.card, "fire"); - var next = game.createEvent("lihuo_clear"); - next.player = player; - next.card = trigger.card; - event.next.remove(next); - next.forceDie = true; - trigger.after.push(next); - next.setContent(function () { - if ( - player.isIn() && - player.getHistory("sourceDamage", function (evt) { - return evt.getParent(2) == event.parent; - }).length > 0 - ) - player.loseHp(); - game.setNature(card, [], true); - }); - }, - group: "lihuo2", - }, - lihuo2: { - trigger: { player: "useCard2" }, - filter: function (event, player) { - if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; - return game.hasPlayer(function (current) { - return !event.targets.includes(current) && player.canUse(event.card, current); - }); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("lihuo"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { - return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); - }) - .set("sourcex", trigger.targets) - .set("card", trigger.card) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, _status.event.card, player, player); - }); - "step 1"; - if (result.bool) { - if (!event.isMine() && !_status.connectMode) game.delayx(); - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - player.logSkill("lihuo", event.target); - trigger.targets.push(event.target); - }, - }, - lihuo3: { - trigger: { player: "useCardAfter" }, - vanish: true, - filter: function (event, player) { - return event.card.name == "sha"; - }, - forced: true, - audio: false, - content: function () { - player.loseHp(); - player.removeSkill("lihuo3"); - }, - }, - chunlao: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - audio: 2, - audioname: ["xin_chengpu"], - filter: function (event, player) { - return player.countCards("h") > 0 && (_status.connectMode || player.countCards("h", "sha") > 0) && !player.getExpansions("chunlao").length; - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - content: function () { - "step 0"; - player - .chooseCard([1, Math.max(1, player.countCards("h", "sha"))], get.prompt("chunlao"), { - name: "sha", - }) - .set("ai", function () { - return 1; - }); - "step 1"; - if (result.bool) { - player.logSkill("chunlao"); - player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("chunlao"); - } - }, - ai: { - effect: { - player: function (card, player, target) { - if (_status.currentPhase != player) return; - if (card.name == "sha" && !player.needsToDiscard() && !player.getExpansions("chunlao").length && target.hp > 1) { - return "zeroplayertarget"; - } - }, - }, - threaten: 1.4, - }, - group: "chunlao2", - }, - chunlao2: { - enable: "chooseToUse", - filter: function (event, player) { - return event.type == "dying" && event.dying && event.dying.hp <= 0 && player.getExpansions("chunlao").length > 0; - }, - filterTarget: function (card, player, target) { - return target == _status.event.dying; - }, - direct: true, - clearTime: true, - delay: false, - selectTarget: -1, - content: function () { - "step 0"; - player.chooseCardButton(get.translation("chunlao"), player.getExpansions("chunlao"), true); - "step 1"; - if (result.bool) { - player.logSkill("chunlao", target); - player.loseToDiscardpile(result.links); - event.type = "dying"; - target.useCard({ name: "jiu", isCard: true }, target); - } - }, - ai: { - order: 6, - skillTagFilter: function (player) { - return player.getExpansions("chunlao").length > 0; - }, - save: true, - result: { - target: 3, - }, - threaten: 1.6, - }, - }, - chunlao2_old: { - trigger: { global: "dying" }, - //priority:6, - filter: function (event, player) { - return event.player.hp <= 0 && player.storage.chunlao.length > 0; - }, - direct: true, - content: function () { - "step 0"; - var att = get.attitude(player, trigger.player); - player - .chooseCardButton(get.prompt("chunlao", trigger.player), player.storage.chunlao) - .set("ai", function (button) { - if (_status.event.att > 0) return 1; - return 0; - }) - .set("att", att); - "step 1"; - if (result.bool) { - player.logSkill("chunlao", trigger.player); - player.$throw(result.links); - player.storage.chunlao.remove(result.links[0]); - result.links[0].discard(); - player.syncStorage("chunlao"); - trigger.player.useCard({ name: "jiu", isCard: true }, trigger.player); - if (!player.storage.chunlao.length) { - player.unmarkSkill("chunlao"); - } else { - player.markSkill("chunlao"); - } - } - }, - ai: { - expose: 0.2, - }, - }, - shenduan: { - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - if (event.type != "discard" || event.getlx === false) return; - var evt = event.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (get.color(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "black" && get.type(evt.cards2[i]) == "basic" && get.position(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "d") { - return true; - } - } - return false; - }, - audio: 2, - direct: true, - content: function () { - "step 0"; - var cards = []; - var evt = trigger.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (get.color(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "black" && get.type(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "basic" && get.position(evt.cards2[i]) == "d") { - cards.push(evt.cards2[i]); - } - } - if (!cards.length) { - event.finish(); - } else { - event.cards = cards; - } - "step 1"; - if (event.cards.length) { - player - .chooseTarget(get.prompt("shenduan"), "将" + get.translation(event.cards) + (event.cards.length > 1 ? "中的一张牌" : "") + "当做【兵粮寸断】对一名其他角色使用", function (card, player, target) { - var cs = _status.event.cards; - for (var i = 0; i < cs.length; i++) { - if (player.canUse({ name: "bingliang", cards: [cs[i]] }, target, false)) return true; - } - return false; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "bingliang" }, player, player); - }) - .set("cards", cards); - } else { - event.finish(); - } - "step 2"; - if (result.bool && result.targets && result.targets.length) { - event.current = result.targets[0]; - if (event.cards.length == 1) { - event.directCard = event.cards[0]; - } else { - delete event.directCard; - player - .chooseCardButton("选择一张牌当作兵断寸断使用", event.cards, true) - .set("filterButton", function (button) { - return player.canUse({ name: "bingliang", cards: [button.link] }, _status.event.target, false); - }) - .set("target", event.current); - } - } else { - event.finish(); - } - "step 3"; - var card; - if (event.directCard) { - card = event.directCard; - } else if (result.links && result.links.length && event.cards.includes(result.links[0])) { - card = result.links[0]; - } - if (card) { - event.cards.remove(card); - player.line(event.current); - player.useCard({ name: "bingliang" }, event.current, [card], "shenduan").animate = false; - event.goto(1); - } - }, - }, - reshenduan: { - audio: 2, - trigger: { - global: "loseAsyncAfter", - player: "loseAfter", - }, - filter: function (event, player) { - if (event.type != "discard" || event.getlx === false) return; - var evt = event.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (get.color(evt.cards2[i], player) == "black" && ["basic", "equip"].includes(get.type(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false)) && get.position(evt.cards2[i]) == "d") { - return true; - } - } - return false; - }, - direct: true, - content: function () { - "step 0"; - var cards = []; - var evt = trigger.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (get.color(evt.cards2[i], player) == "black" && ["basic", "equip"].includes(get.type(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false)) && get.position(evt.cards2[i]) == "d") { - cards.push(evt.cards2[i]); - } - } - if (!cards.length) { - event.finish(); - } else { - event.cards = cards; - } - "step 1"; - if (event.cards.length) { - player - .chooseTarget(get.prompt("shenduan"), "将" + get.translation(event.cards) + (event.cards.length > 1 ? "中的一张牌" : "") + "当做【兵粮寸断】对一名其他角色使用", function (card, player, target) { - var cs = _status.event.cards; - for (var i = 0; i < cs.length; i++) { - if (player.canUse({ name: "bingliang", cards: [cs[i]] }, target, false)) return true; - } - return false; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "bingliang" }, player, player); - }) - .set("cards", cards); - } else { - event.finish(); - } - "step 2"; - if (result.bool && result.targets && result.targets.length) { - event.current = result.targets[0]; - if (event.cards.length == 1) { - event.directCard = event.cards[0]; - } else { - delete event.directCard; - player - .chooseCardButton("选择一张牌当作兵断寸断使用", event.cards, true) - .set("filterButton", function (button) { - return player.canUse({ name: "bingliang", cards: [button.link] }, _status.event.target, false); - }) - .set("target", event.current); - } - } else { - event.finish(); - } - "step 3"; - var card; - if (event.directCard) { - card = event.directCard; - } else if (result.links && result.links.length && event.cards.includes(result.links[0])) { - card = result.links[0]; - } - if (card) { - event.cards.remove(card); - player.line(event.current); - player.useCard({ name: "bingliang" }, event.current, [card], "reshenduan").animate = false; - event.goto(1); - } - }, - }, - reyonglve: { - audio: 2, - trigger: { global: "phaseJudgeBegin" }, - direct: true, - filter: function (event, player) { - return event.player != player && event.player.countCards("j") > 0; - }, - content: function () { - "step 0"; - var att = get.attitude(player, trigger.player); - var nh = trigger.player.countCards("h"); - var eff = get.effect(trigger.player, { name: "sha", isCard: true }, player, player); - if (player.inRange(trigger.player) || !player.canUse({ name: "sha", isCard: true }, trigger.player, false)) eff = 0; - player - .discardPlayerCard(get.prompt("yonglve", trigger.player), trigger.player, "j") - .set("ai", function (button) { - var name = button.link.viewAs || button.link.name; - var att = _status.event.att; - var nh = _status.event.nh; - var eff = _status.event.eff; - var trigger = _status.event.getTrigger(); - if (att > 0 && eff >= 0) return 1; - if (att >= 0 && eff > 0) return 1; - if ( - att > 0 && - (trigger.player.hp >= 3 || - trigger.player.hasSkillTag("freeShan", false, { - player: _status.event.player, - card: new lib.element.VCard({ name: "sha", isCard: true }), - }) || - trigger.player.countCards("h", "shan")) - ) { - if (name == "lebu" && nh > trigger.player.hp) return 1; - if (name == "bingliang" && nh < trigger.player.hp) return 1; - } - return 0; - }) - .set("att", att) - .set("nh", nh) - .set("eff", eff) - .set("logSkill", ["reyonglve", trigger.player]); - "step 1"; - if (result.bool) { - if (!player.inRange(trigger.player) && player.canUse({ name: "sha", isCard: true }, trigger.player, false)) { - player.useCard({ name: "sha", isCard: true }, trigger.player); - } else player.draw(); - } - }, - }, - yonglve: { - trigger: { global: "phaseJudgeBegin" }, - direct: true, - audio: 2, - filter: function (event, player) { - return event.player != player && event.player.countCards("j") > 0 && player.inRange(event.player); - }, - content: function () { - "step 0"; - var att = get.attitude(player, trigger.player); - var nh = trigger.player.countCards("h"); - var eff = get.effect(trigger.player, { name: "sha", isCard: true }, player, player); - if (!player.canUse({ name: "sha", isCard: true }, trigger.player)) eff = 0; - player - .discardPlayerCard(get.prompt("yonglve", trigger.player), trigger.player, "j") - .set("ai", function (button) { - var name = button.link.viewAs || button.link.name; - var att = _status.event.att; - var nh = _status.event.nh; - var eff = _status.event.eff; - var trigger = _status.event.getTrigger(); - if (att > 0 && eff >= 0) return 1; - if (att >= 0 && eff > 0) return 1; - if ( - att > 0 && - (trigger.player.hp >= 3 || - trigger.player.hasSkillTag("freeShan", false, { - player: _status.event.player, - card: new lib.element.VCard({ name: "sha", isCard: true }), - }) || - trigger.player.countCards("h", "shan")) - ) { - if (name == "lebu" && nh > trigger.player.hp) return 1; - if (name == "bingliang" && nh < trigger.player.hp) return 1; - } - return 0; - }) - .set("att", att) - .set("nh", nh) - .set("eff", eff) - .set("logSkill", ["yonglve", trigger.player]); - "step 1"; - if (result.bool) { - if (player.canUse({ name: "sha", isCard: true }, trigger.player)) { - event.related = player.useCard({ name: "sha", isCard: true }, trigger.player); - } - } else { - event.finish(); - } - "step 2"; - if ( - !event.related || - !game.hasPlayer2(function (current) { - return ( - current.getHistory("damage", function (evt) { - return evt.getParent(2) == event.related; - }).length > 0 - ); - }) - ) { - player.draw(); - } - }, - //group:'yonglve2' - }, - yonglve2: { - trigger: { source: "damage" }, - forced: true, - popup: false, - filter: function (event) { - return event.parent.skill == "yonglve"; - }, - content: function () { - player.storage.yonglve = true; - }, - }, - benxi: { - audio: 2, - trigger: { player: "useCard2" }, - forced: true, - filter: function (event, player) { - return player.isPhaseUsing(); - }, - content: function () {}, - mod: { - globalFrom: function (from, to, distance) { - if (_status.currentPhase == from) { - return distance - from.countUsed(); - } - }, - selectTarget: function (card, player, range) { - if (_status.currentPhase == player) { - if (card.name == "sha" && range[1] != -1) { - if ( - !game.hasPlayer(function (current) { - return get.distance(player, current) > 1; - }) - ) { - range[1]++; - } - } - } - }, - }, - ai: { - unequip: true, - skillTagFilter: function (player) { - if ( - game.hasPlayer(function (current) { - return get.distance(player, current) > 1; - }) - ) { - return false; - } - }, - }, - }, - sidi: { - audio: 2, - trigger: { global: "useCard" }, - filter: function (event, player) { - if (event.card.name != "shan") return false; - if (event.player == player) return true; - return _status.currentPhase == player; - }, - frequent: true, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - content: function () { - player.addToExpansion(get.cards(), "gain2").gaintag.add("sidi"); - }, - group: "sidi2", - }, - sidi2: { - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - if (event.player == player || event.player.isDead()) return false; - if (!player.getExpansions("sidi").length) return false; - return true; - }, - check: function (event, player) { - if (get.attitude(player, event.player) >= 0) return false; - if (event.player.getEquip("zhuge")) return false; - if (event.player.hasSkill("paoxiao")) return false; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (event.player.canUse("sha", players[i]) && get.attitude(player, players[i]) > 0) break; - } - if (i == players.length) return false; - var nh = event.player.countCards("h"); - var nsha = event.player.countCards("h", "sha"); - if (nh < 2) return false; - switch (nh) { - case 2: - if (nsha) return Math.random() < 0.4; - return Math.random() < 0.2; - case 3: - if (nsha) return Math.random() < 0.8; - return Math.random() < 0.3; - case 4: - if (nsha > 1) return true; - if (nsha) return Math.random() < 0.9; - return Math.random() < 0.5; - default: - return true; - } - }, - logTarget: "player", - content: function () { - "step 0"; - var cards = player.getExpansions("sidi"); - if (cards.length == 1) { - event.directbutton = cards[0]; - } else { - player.chooseCardButton("弃置一张“司敌”牌", cards, true); - } - "step 1"; - var button; - if (event.directbutton) { - button = event.directbutton; - } else if (result.bool && result.links && result.links.length) { - button = result.links[0]; - } - if (button) { - player.loseToDiscardpile(button); - trigger.player.addTempSkill("sidi3", "phaseUseAfter"); - trigger.player.addMark("sidi3", 1, false); - } - }, - }, - sidi3: { - mod: { - cardUsable: function (card, player, num) { - if (card.name == "sha") return num - player.countMark("sidi3"); - }, - }, - onremove: true, - }, - zhongyong: { - audio: 2, - trigger: { player: "shaMiss" }, - direct: true, - filter: function (event, player) { - return event.responded && get.itemtype(event.responded.cards) == "cards"; - }, - content: function () { - "step 0"; - var cards = trigger.responded.cards; - event.cards = cards; - player - .chooseTarget("忠勇:将" + get.translation(trigger.responded.cards) + "交给一名角色", function (card, player, target) { - return target != _status.event.source; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.countCards("h", "shan") && target.countCards("h") >= 2) { - att /= 1.5; - } - return att; - }) - .set("source", trigger.target); - "step 1"; - if (result.bool) { - player.logSkill("zhongyong", result.targets); - result.targets[0].gain(event.cards, "gain2"); - if (result.targets[0] == player) { - event.finish(); - } - } else { - event.finish(); - } - "step 2"; - player.chooseToUse("是否对" + get.translation(trigger.target) + "再使用一张杀?", { name: "sha" }, trigger.target, -1).set("addCount", false); - }, - }, - xinzhongyong: { - trigger: { player: "useCardAfter" }, - audio: "zhongyong", - direct: true, - filter: function (event, player) { - return event.card.name == "sha"; - }, - content: function () { - "step 0"; - event.sha = trigger.cards.slice(0).filterInD(); - event.shan = []; - game.countPlayer2(function (current) { - current.getHistory("useCard", function (evt) { - if (evt.card.name == "shan" && evt.getParent(3) == trigger) event.shan.addArray(evt.cards); - }); - }); - event.shan.filterInD("d"); - if (!event.sha.length && !event.shan.length) event.finish(); - player - .chooseTarget(get.prompt2("xinzhongyong"), function (card, player, target) { - return !_status.event.source.includes(target) && target != player; - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .set("source", trigger.targets); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("xinzhongyong", target); - if (event.sha.length && event.shan.length) { - player - .chooseControl() - .set("choiceList", ["将" + get.translation(event.sha) + "交给" + get.translation(target), "将" + get.translation(event.shan) + "交给" + get.translation(target)]) - .set("ai", function () { - return _status.event.choice; - }) - .set( - "choice", - (function () { - if (get.color(event.sha) != "black") return 0; - return 1; - })() - ); - } else event._result = { index: event.sha.length ? 0 : 1 }; - } else { - event.finish(); - } - "step 2"; - var cards = result.index == 0 ? event.sha : event.shan; - event.useSha = false; - target.gain(cards, "gain2"); - for (var i = 0; i < cards.length; i++) { - if (get.color(cards[i]) == "red") { - event.useSha = true; - break; - } - } - "step 3"; - if (event.useSha) { - event.target - .chooseToUse("是否使用一张杀?", { name: "sha" }) - .set("filterTarget", function (card, player, target) { - return target != _status.event.sourcex && _status.event.sourcex.inRange(target) && lib.filter.targetEnabled.apply(this, arguments); - }) - .set("sourcex", player) - .set("addCount", false); - } - }, - }, - dangxian: { - trigger: { player: "phaseBegin" }, - forced: true, - audio: 2, - audioname: ["guansuo"], - content: function () { - trigger.phaseList.splice(trigger.num, 0, "phaseUse|dangxian"); - }, - }, - longyin: { - audio: 2, - shaRelated: true, - init: player => { - game.addGlobalSkill("longyin_order"); - }, - onremove: player => { - if (!game.hasPlayer(current => current.hasSkill("longyin"), true)) game.removeGlobalSkill("longyin_order"); - }, - trigger: { global: "useCard" }, - direct: true, - filter: function (event, player) { - return event.card.name == "sha" && player.countCards("he") > 0 && event.player.isPhaseUsing(); - }, - content: function () { - "step 0"; - var go = false; - if (get.attitude(player, trigger.player) > 0) { - if (get.color(trigger.card) == "red") { - go = true; - } else if (trigger.addCount === false || !trigger.player.isPhaseUsing()) go = false; - else if (!trigger.player.hasSkill("paoxiao") && !trigger.player.hasSkill("tanlin3") && !trigger.player.hasSkill("zhaxiang2") && !trigger.player.hasSkill("fengnu") && !trigger.player.getEquip("zhuge")) { - var nh = trigger.player.countCards("h"); - if (player == trigger.player) { - go = player.countCards("h", "sha") > 0; - } else if (nh >= 4) { - go = true; - } else if (player.countCards("h", "sha")) { - if (nh == 3) { - go = Math.random() < 0.8; - } else if (nh == 2) { - go = Math.random() < 0.5; - } - } else if (nh >= 3) { - if (nh == 3) { - go = Math.random() < 0.5; - } else if (nh == 2) { - go = Math.random() < 0.2; - } - } - } - } - //AI停顿 - if ( - go && - !event.isMine() && - !event.isOnline() && - player.hasCard(function (card) { - return get.value(card) < 6 && lib.filter.cardDiscardable(card, player, event.name); - }, "he") - ) { - game.delayx(); - } - var next = player.chooseToDiscard(get.prompt("longyin"), "弃置一张牌" + (get.color(trigger.card) == "red" ? "并摸一张牌" : "") + ",令" + get.translation(trigger.player) + "本次使用的【杀】不计入使用次数", "he"); - next.logSkill = ["longyin", trigger.player]; - next.set("ai", function (card) { - if (_status.event.go) { - return 6 - get.value(card); - } - return 0; - }); - next.set("go", go); - "step 1"; - if (result.bool) { - if (trigger.addCount !== false) { - trigger.addCount = false; - trigger.player.getStat().card.sha--; - } - if (get.color(trigger.card) == "red") { - player.draw(); - } - // player.logSkill('longyin',trigger.player); - } - }, - ai: { - expose: 0.2, - }, - subSkill: { - order: { - mod: { - aiOrder: (player, card, num) => { - if (num && card.name === "sha" && get.color(card) === "red") { - let gp = game.findPlayer(current => { - return current.hasSkill("longyin") && current.hasCard(i => true, "he"); - }); - if (gp) return num + 0.15 * Math.sign(get.attitude(player, gp)); - } - }, - }, - trigger: { player: "dieAfter" }, - filter: (event, player) => { - return !game.hasPlayer(current => current.hasSkill("longyin"), true); - }, - silent: true, - forceDie: true, - charlotte: true, - content: () => { - game.removeGlobalSkill("longyin_order"); - }, - }, - }, - }, - jigong: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - check: function (event, player) { - var nh = player.countCards("h") - player.countCards("h", { type: "equip" }); - if (nh <= 1) return true; - if (player.countCards("h", "tao")) return false; - if (nh <= 2) return Math.random() < 0.7; - if (nh <= 3) return Math.random() < 0.4; - return false; - }, - content: function () { - player.draw(2); - player.addTempSkill("jigong2"); - }, - }, - jigong2: { - mod: { - maxHandcardBase: function (player, num) { - var damage = player.getStat().damage; - if (typeof damage == "number") return damage; - return 0; - }, - }, - }, - shifei: { - audio: 2, - audioname: ["re_guotufengji"], - enable: ["chooseToRespond", "chooseToUse"], - filter: function (event, player) { - if (!_status.currentPhase || event.shifei) return false; - if (!event.filterCard({ name: "shan", isCard: true }, player, event)) return false; - if (event.name != "chooseToUse" && !lib.filter.cardRespondable({ name: "shan", isCard: true }, player, event)) return false; - return true; - }, - delay: false, - checkx: function (player) { - if (get.attitude(player, _status.currentPhase) > 0) return true; - var nh = _status.currentPhase.countCards("h") + 1; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i].countCards("h") >= nh) { - if (!player.countCards("h", "shan") || get.attitude(player, players[i]) <= 0) return true; - } - } - return false; - }, - content: function () { - "step 0"; - player.line(_status.currentPhase, "green"); - _status.currentPhase.draw(); - "step 1"; - if (_status.currentPhase.isMaxHandcard(true)) { - event.finish(); - var evt = event.getParent(2); - evt.set("shifei", true); - evt.goto(0); - return; - } - var targets = game.filterPlayer(function (current) { - return current.isMaxHandcard(); - }); - if (targets.length == 1) { - event.onlytarget = targets[0]; - } else if (targets.length) { - player - .chooseTarget("选择一名角色弃置其一张牌", true, function (card, player, target) { - return _status.event.targets.includes(target); - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }) - .set("targets", targets); - } else { - event.finish(); - } - "step 2"; - var evt = event.getParent(2); - var target; - if (event.onlytarget) { - target = event.onlytarget; - } else if (result.targets && result.targets.length) { - target = result.targets[0]; - } - if (target) { - player.line(target, "green"); - player.discardPlayerCard(target, "he", true); - evt.result = { bool: true, card: { name: "shan", isCard: true }, cards: [] }; - evt.redo(); - } else { - evt.set("shifei", true); - evt.goto(0); - } - }, - ai: { - respondShan: true, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "respondShan") && current < 0) { - var nh = player.countCards("h"); - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i].countCards("h") > nh) return 0.4; - } - } - }, - }, - order: 8, - result: { - player: function (player) { - return lib.skill.shifei.checkx(player) ? 1 : 0; - }, - }, - }, - }, - huaiyi: { - audio: 2, - enable: "phaseUse", - usable: 1, - delay: false, - filter: function (event, player) { - return player.countCards("h", { color: "red" }) && player.countCards("h", { color: "black" }); - }, - content: function () { - "step 0"; - player.showHandcards(); - "step 1"; - player.chooseControl("红色", "黑色").set("ai", function () { - var player = _status.event.player; - if (player.countCards("h", { color: "red" }) == 1 && player.countCards("h", { color: "black" }) > 1) return "红色"; - return "黑色"; - }); - "step 2"; - event.control = result.control; - var cards; - if (event.control == "红色") { - cards = player.getCards("h", { color: "red" }); - } else { - cards = player.getCards("h", { color: "black" }); - } - player.discard(cards); - event.num = cards.length; - "step 3"; - player - .chooseTarget("请选择至多" + get.cnNumber(event.num) + "名有牌的其他角色,获得这些角色的各一张牌。", [1, event.num], function (card, player, target) { - return target != player && target.countCards("he") > 0; - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target) + 0.5; - }); - "step 4"; - if (result.bool && result.targets) { - player.line(result.targets, "green"); - event.targets = result.targets; - event.targets.sort(lib.sort.seat); - event.gained = 0; - } else { - event.finish(); - } - "step 5"; - if (player.isIn() && event.targets.length) { - player.gainPlayerCard(event.targets.shift(), "he", true); - } else event.finish(); - "step 6"; - if (result.bool) { - event.gained += result.cards.length; - } - if (event.targets.length) event.goto(5); - "step 7"; - if (event.gained > 1) player.loseHp(); - }, - ai: { - order: function (item, player) { - if (player.countCards("h", { color: "red" }) == 1) return 10; - if (player.countCards("h", { color: "black" }) == 1) return 10; - return 1; - }, - result: { - player: 1, - }, - }, - }, - yaoming: { - audio: 2, - trigger: { player: "damageEnd", source: "damageSource" }, - direct: true, - filter: function (event, player) { - if (player.hasSkill("yaoming2")) return false; - var nh = player.countCards("h"); - return game.hasPlayer(function (current) { - return current.countCards("h") != nh; - }); - }, - content: function () { - "step 0"; - var nh = player.countCards("h"); - player - .chooseTarget(get.prompt2("yaoming"), function (card, player, target) { - return _status.event.nh != target.countCards("h"); - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.countCards("h") > _status.event.nh) return -att; - return att; - }) - .set("nh", nh); - "step 1"; - if (result.bool) { - player.logSkill("yaoming", result.targets); - player.addTempSkill("yaoming2"); - var target = result.targets[0]; - if (target.countCards("h") < player.countCards("h")) { - target.draw(); - } else { - target.discard(target.getCards("h").randomGet()); - } - } - }, - ai: { - expose: 0.2, - }, - }, - yaoming2: {}, - anguo: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player != target && target.countCards("e") > 0; - }, - content: function () { - "step 0"; - player.choosePlayerCard(target, "e", true); - "step 1"; - if (result.links) { - var num = 0, - players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (target.inRange(players[i])) { - num++; - } - } - event.num = num; - target.gain(result.links, "gain2"); - } else { - event.finish(); - } - "step 2"; - var num2 = 0, - players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (target.inRange(players[i])) { - num2++; - } - } - if (event.num > num2) { - player.draw(); - } - }, - ai: { - order: 7, - result: { - target: function (player, target) { - if (target.hasSkillTag("noe")) return 1; - if (target.getEquip(1) || target.getEquip(4)) return -1; - if (target.getEquip(2)) return -0.7; - return -0.5; - }, - }, - }, - }, - reyanzhu: { - enable: "phaseUse", - audio: 2, - usable: 1, - filterTarget: lib.filter.notMe, - derivation: ["reyanzhu_rewrite", "rexingxue_rewrite"], - prompt: function () { - return lib.translate[(_status.event.player.storage.reyanzhu ? "reyanzhu_rewrite" : "reyanzhu") + "_info"]; - }, - content: function () { - "step 0"; - if (player.storage.reyanzhu || !target.countCards("e")) event._result = { index: 1 }; - else - target - .chooseControl() - .set("prompt", get.translation(player) + "发动了【宴诛】,请选择一项") - .set("choiceList", ["将装备区内的所有牌交给" + get.translation(player) + "并令其修改技能", "弃置一张牌,并令下次受到的伤害+1直到下回合开始"]) - .set("ai", function () { - if (_status.event.player.countCards("e") >= 3) return 1; - return 0; - }); - "step 1"; - if (result.index == 0) { - target.give(target.getCards("e"), player); - player.storage.reyanzhu = true; - } else { - target.addTempSkill("reyanzhu2", { player: "phaseBegin" }); - target.addMark("reyanzhu2", 1, false); - if (!player.storage.reyanzhu && target.countCards("he") > 0) target.chooseToDiscard("he", true); - } - }, - ai: { - order: 6, - result: { - target: function (player, target) { - if (player.storage.reyanzhu) return -1; - var ne = target.countCards("e"); - if (!ne) return -2; - if (ne >= 2) return -ne; - return 0; - }, - }, - }, - }, - reyanzhu2: { - trigger: { player: "damageBegin3" }, - forced: true, - onremove: true, - content: function () { - trigger.num += player.countMark("reyanzhu2"); - game.log(player, "受到的伤害+" + player.countMark("reyanzhu2")); - player.removeSkill("reyanzhu2"); - }, - intro: { - content: "下次受到的伤害+#直到下回合开始", - }, - }, - rexingxue: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - audio: 2, - filter: function (event, player) { - return (player.storage.reyanzhu ? player.maxHp : player.hp) > 0; - }, - content: function () { - "step 0"; - player.chooseTarget([1, player.storage.reyanzhu ? player.maxHp : player.hp], get.prompt("rexingxue"), "令所有目标角色依次摸一张牌,然后所有手牌数大于体力值的目标角色依次将一张牌置于牌堆顶").set("ai", function (target) { - var att = get.attitude(player, target); - if (target.countCards("h") == target.hp - 1) att *= 2; - return att; - }); - "step 1"; - if (result.bool) { - event.targets = result.targets.sortBySeat(); - player.logSkill("rexingxue", event.targets); - game.asyncDraw(result.targets); - } else event.finish(); - "step 2"; - game.delay(); - "step 3"; - if (event.targets.length) { - event.target = event.targets.shift(); - if (event.target.isDead()) event.redo(); - } else event.finish(); - "step 4"; - if (target.isIn() && target.countCards("h") && target.countCards("h") > target.hp) target.chooseCard("he", true, "将一张牌置于牌堆顶"); - else event.goto(3); - "step 5"; - if (result && result.cards) { - event.card = result.cards[0]; - target.lose(result.cards, ui.cardPile, "insert"); - game.log(target, "将", get.position(event.card) == "h" ? "一张牌" : event.card, "置于牌堆顶"); - game.broadcastAll(function (player) { - var cardx = ui.create.card(); - cardx.classList.add("infohidden"); - cardx.classList.add("infoflip"); - player.$throw(cardx, 1000, "nobroadcast"); - }, target); - } - event.goto(3); - }, - }, - rezhaofu: { - unique: true, - global: "rezhaofu2", - zhuSkill: true, - }, - rezhaofu2: { - mod: { - inRangeOf: function (from, to) { - if (from.group != "wu") return; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (from != players[i] && to != players[i] && players[i].hasZhuSkill("rezhaofu", from)) { - if (players[i].inRange(to)) return true; - } - } - }, - }, - }, - zhaofu: { - unique: true, - global: "zhaofu2", - zhuSkill: true, - locked: true, - }, - zhaofu2: { - mod: { - inRangeOf: function (from, to) { - if (from.group != "wu") return; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (from != players[i] && to != players[i] && players[i].hasZhuSkill("zhaofu", from)) { - if (get.distance(players[i], to) <= 1) return true; - } - } - }, - }, - }, - xingxue: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - async content(event, trigger, player) { - var num = player.hp; - if (!player.hasSkill("yanzhu")) { - num = player.maxHp; - } - const { - result: { targets, bool }, - } = await player.chooseTarget([1, num], get.prompt2("xingxue")).set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (target.countCards("he")) return att; - return att / 10; - }); - if (bool) { - player.logSkill("xingxue", targets); - const chooseToPutCard = async function (target) { - await target.draw(); - if (target.countCards("he")) { - const { - result: { cards, bool }, - } = await target.chooseCard("选择一张牌置于牌堆顶", "he", true); - if (bool) { - await target.lose(cards, ui.cardPile, "insert"); - } - game.broadcastAll(function (player) { - var cardx = ui.create.card(); - cardx.classList.add("infohidden"); - cardx.classList.add("infoflip"); - player.$throw(cardx, 1000, "nobroadcast"); - }, target); - if (player == game.me) { - await game.asyncDelay(0.5); - } - } - }; - await game.doAsyncInOrder(targets, chooseToPutCard); - } - }, - }, - yanzhu: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.countCards("he") > 0 && target != player; - }, - content: function () { - "step 0"; - if (target.countCards("e")) { - target.chooseBool("是否将装备区内的所有牌交给" + get.translation(player) + "?").set("ai", function () { - if (_status.event.player.countCards("e") >= 3) return false; - return true; - }); - } else { - target.chooseToDiscard(true, "he"); - event.finish(); - } - "step 1"; - if (result.bool) { - var es = target.getCards("e"); - target.give(es, player, "give"); - player.removeSkills("yanzhu"); - } else { - target.chooseToDiscard(true, "he"); - } - }, - ai: { - order: 6, - result: { - target: function (player, target) { - var ne = target.countCards("e"); - if (!ne) return -2; - if (ne >= 2) return -ne; - return 0; - }, - }, - }, - }, - shizhi: { - mod: { - cardname: function (card, player, name) { - if (card.name == "shan" && player.hp == 1) return "sha"; - }, - }, - ai: { - skillTagFilter: function (player) { - if (!player.countCards("h", "shan")) return false; - if (player.hp != 1) return false; - }, - respondSha: true, - halfneg: true, - }, - audio: 2, - audioname: ["xin_zhangyi"], - trigger: { player: ["useCard1", "respond"] }, - firstDo: true, - forced: true, - filter: function (event, player) { - return event.card.name == "sha" && !event.skill && event.cards.length == 1 && event.cards[0].name == "shan"; - }, - content: function () {}, - }, - wurong: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterTarget: function (card, player, target) { - return target.countCards("h") > 0 && target != player; - }, - content: function () { - "step 0"; - if (target.countCards("h") == 0 || player.countCards("h") == 0) { - event.finish(); - return; - } - "step 1"; - var sendback = function () { - if (_status.event != event) { - return function () { - event.resultOL = _status.event.resultOL; - }; - } - }; - if (player.isOnline()) { - player.wait(sendback); - event.ol = true; - player.send(function () { - game.me.chooseCard(true).set("glow_result", true).ai = function () { - return Math.random(); - }; - game.resume(); - }); - } else { - event.localPlayer = true; - player.chooseCard(true).set("glow_result", true).ai = function () { - return Math.random(); - }; - } - if (target.isOnline()) { - target.wait(sendback); - event.ol = true; - target.send(function () { - var rand = Math.random() < 0.4; - game.me.chooseCard(true).set("glow_result", true).ai = function (card) { - if (rand) return card.name == "shan" ? 1 : 0; - return card.name == "shan" ? 0 : 1; - }; - game.resume(); - }); - } else { - event.localTarget = true; - } - "step 2"; - if (event.localPlayer) { - event.card1 = result.cards[0]; - } - if (event.localTarget) { - var rand = Math.random() < 0.4; - target.chooseCard(true).set("glow_result", true).ai = function (card) { - if (rand) return card.name == "shan" ? 1 : 0; - return card.name == "shan" ? 0 : 1; - }; - } - "step 3"; - if (event.localTarget) { - event.card2 = result.cards[0]; - } - if (!event.resultOL && event.ol) { - game.pause(); - } - "step 4"; - try { - if (!event.card1) event.card1 = event.resultOL[player.playerid].cards[0]; - if (!event.card2) event.card2 = event.resultOL[target.playerid].cards[0]; - if (!event.card1 || !event.card2) { - throw "err"; - } - } catch (e) { - console.log(e); - event.finish(); - return; - } - game.broadcastAll( - function (card1, card2) { - card1.classList.remove("glow"); - card2.classList.remove("glow"); - }, - event.card1, - event.card2 - ); - "step 5"; - game.broadcastAll(function () { - ui.arena.classList.add("thrownhighlight"); - }); - game.addVideo("thrownhighlight1"); - player.$compare(event.card1, target, event.card2); - game.delay(4); - "step 6"; - var next = game.createEvent("showCards"); - next.player = player; - next.cards = [event.card1]; - next.setContent("emptyEvent"); - game.log(player, "展示了", event.card1); - "step 7"; - var next = game.createEvent("showCards"); - next.player = target; - next.cards = [event.card2]; - next.setContent("emptyEvent"); - game.log(target, "展示了", event.card2); - "step 8"; - var name1 = get.name(event.card1); - var name2 = get.name(event.card2); - if (name1 == "sha" && name2 != "shan") { - player.discard(event.card1).set("animate", false); - target.$gain2(event.card2); - var clone = event.card1.clone; - if (clone) { - clone.style.transition = "all 0.5s"; - clone.style.transform = "scale(1.2)"; - clone.delete(); - game.addVideo("deletenode", player, get.cardsInfo([clone])); - } - game.broadcast(function (card) { - var clone = card.clone; - if (clone) { - clone.style.transition = "all 0.5s"; - clone.style.transform = "scale(1.2)"; - clone.delete(); - } - }, event.card1); - target.damage("nocard"); - } else if (name1 != "sha" && name2 == "shan") { - player.discard(event.card1).set("animate", false); - target.$gain2(event.card2); - var clone = event.card1.clone; - if (clone) { - clone.style.transition = "all 0.5s"; - clone.style.transform = "scale(1.2)"; - clone.delete(); - game.addVideo("deletenode", player, get.cardsInfo([clone])); - } - game.broadcast(function (card) { - var clone = card.clone; - if (clone) { - clone.style.transition = "all 0.5s"; - clone.style.transform = "scale(1.2)"; - clone.delete(); - } - }, event.card1); - player.gainPlayerCard(target, true, "he"); - } else { - player.$gain2(event.card1); - target.$gain2(event.card2); - } - game.broadcastAll(function () { - ui.arena.classList.remove("thrownhighlight"); - }); - game.addVideo("thrownhighlight2"); - }, - ai: { - order: 6, - result: { - target: -1, - }, - }, - }, - zhanjue: { - audio: 2, - enable: "phaseUse", - filterCard: true, - selectCard: -1, - position: "h", - filter: function (event, player) { - if (player.getStat().skill.zhanjue_draw && player.getStat().skill.zhanjue_draw >= 2) return false; - var hs = player.getCards("h"); - if (!hs.length) return false; - for (var i = 0; i < hs.length; i++) { - var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player); - if (mod2 === false) return false; - } - return true; - }, - viewAs: { name: "juedou" }, - group: ["zhanjue4"], - ai: { - damage: true, - order: 1, - effect: { - player: function (card, player, target) { - if (_status.event.skill == "zhanjue") { - if ( - player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: card, - }, - true - ) - ) - return; - if (player.countCards("h") >= 3 || target.countCards("h") >= 3) return "zeroplayertarget"; - if (player.countCards("h", "tao")) return "zeroplayertarget"; - if (target.countCards("h", "sha") > 1) return "zeroplayertarget"; - } - }, - }, - nokeep: true, - skillTagFilter: function (player, tag, arg) { - if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && player.countSkill("zhanjue_draw") < 2 && player.hasCard(card => get.name(card) != "tao", "h"); - }, - }, - }, - zhanjue2: { - audio: false, - trigger: { player: "phaseBefore" }, - silent: true, - content: function () { - player.storage.zhanjue = 0; - }, - }, - zhanjue3: { - audio: false, - trigger: { player: "damageAfter", source: "damageAfter" }, - forced: true, - popup: false, - filter: function (event, player) { - return event.parent.skill == "zhanjue"; - }, - content: function () { - trigger.player.addTempSkill("zhanjue5"); - }, - }, - zhanjue4: { - audio: false, - trigger: { player: "useCardAfter" }, - forced: true, - popup: false, - filter: function (event, player) { - return event.skill == "zhanjue"; - }, - content: function () { - "step 0"; - var stat = player.getStat().skill; - if (!stat.zhanjue_draw) stat.zhanjue_draw = 0; - stat.zhanjue_draw++; - player.draw("nodelay"); - var list = game.filterPlayer(function (current) { - if ( - current.getHistory("damage", function (evt) { - return evt.card == trigger.card; - }).length > 0 - ) { - if (current == player) { - stat.zhanjue_draw++; - } - return true; - } - return false; - }); - if (list.length) { - list.sortBySeat(); - game.asyncDraw(list); - } - "step 1"; - game.delay(); - }, - }, - zhanjue5: {}, - qinwang: { - audio: "qinwang1", - unique: true, - group: ["qinwang1"], - zhuSkill: true, - filter: function (event, player) { - if ( - !player.hasZhuSkill("qinwang") || - !game.hasPlayer(function (current) { - return current != player && current.group == "shu"; - }) || - !player.countCards("he") - ) - return false; - return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3")); - }, - enable: ["chooseToUse", "chooseToRespond"], - viewAs: { - name: "sha", - cards: [], - suit: "none", - number: null, - isCard: true, - }, - filterCard: lib.filter.cardDiscardable, - position: "he", - check: function (card) { - var player = _status.event.player, - players = game.filterPlayer(); - if (player.hasSkill("qinwang_ai")) return false; - for (var i = 0; i < players.length; i++) { - var nh = players[i].countCards("h"); - if (players[i] != player && players[i].group == "shu" && get.attitude(players[i], player) > 2 && nh >= 3 && players[i].countCards("h", "sha")) { - return 5 - get.value(card); - } - } - return 0; - }, - ai: { - order: function () { - return get.order({ name: "sha" }) - 0.3; - }, - respondSha: true, - skillTagFilter: function (player) { - if ( - !player.hasZhuSkill("qinwang") || - !game.hasPlayer(function (current) { - return current != player && current.group == "shu"; - }) || - !player.countCards("he") - ) - return false; - }, - }, - }, - qinwang1: { - audio: 2, - trigger: { player: ["useCardBegin", "respondBegin"] }, - logTarget: "targets", - filter: function (event, player) { - return event.skill == "qinwang"; - }, - forced: true, - content: function () { - "step 0"; - delete trigger.skill; - delete trigger.card.cards; - player.discard(trigger.cards); - delete trigger.cards; - trigger.getParent().set("jijiang", true); - "step 1"; - if (event.current == undefined) event.current = player.next; - if (event.current == player) { - player.addTempSkill("jijiang3"); - player.addTempSkill("qinwang_ai"); - event.finish(); - trigger.cancel(); - trigger.getParent().goto(0); - } else if (event.current.group == "shu") { - var next = event.current.chooseToRespond("是否替" + get.translation(player) + "打出一张杀?", { name: "sha" }); - next.set("ai", function () { - var event = _status.event; - return get.attitude(event.player, event.source) - 2; - }); - next.set("source", player); - next.set("jijiang", true); - next.set("skillwarn", "替" + get.translation(player) + "打出一张杀"); - next.noOrdering = true; - next.autochoose = lib.filter.autoRespondSha; - } else { - event.current = event.current.next; - event.redo(); - } - "step 2"; - if (result.bool) { - event.current.draw(); - event.finish(); - trigger.card = result.card; - trigger.cards = result.cards; - trigger.throw = false; - if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) { - event.current.ai.shown += 0.3; - if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; - } - } else { - event.current = event.current.next; - event.goto(1); - } - }, - }, - qinwang_ai: {}, - zuoding: { - audio: 2, - audioname: ["re_zhongyao"], - trigger: { global: "useCardToPlayered" }, - filter: function (event, player) { - if (event.getParent().triggeredTargets3.length > 1) return false; - return ( - get.suit(event.card) == "spade" && - _status.currentPhase == event.player && - event.targets && - event.targets.length && - event.player != player && - game.countPlayer2(function (current) { - return current.getHistory("damage").length > 0; - }) == 0 - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("zuoding"), "令一名目标角色摸一张牌", function (card, player, target) { - return _status.event.targets.includes(target); - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .set("targets", trigger.targets); - "step 1"; - if (result.bool) { - player.logSkill("zuoding", result.targets); - result.targets[0].draw(); - } - }, - ai: { - expose: 0.2, - }, - //group:'zuoding3' - }, - zuoding2: {}, - zuoding3: { - trigger: { global: "damage" }, - silent: true, - content: function () { - player.addTempSkill("zuoding2"); - }, - }, - huomo: { - audio: 2, - audioname: ["huzhao", "re_zhongyao"], - enable: "chooseToUse", - onChooseToUse: function (event) { - if (game.online || event.huomo_list) return; - var list = lib.skill.huomo.getUsed(event.player); - event.set("huomo_list", list); - }, - getUsed: function (player) { - var list = []; - player.getHistory("useCard", function (evt) { - if (get.type(evt.card, null, false) == "basic") list.add(evt.card.name); - }); - return list; - }, - hiddenCard: function (player, name) { - if (get.type(name) != "basic") return false; - var list = lib.skill.huomo.getUsed(player); - if (list.includes(name)) return false; - return player.hasCard(function (card) { - return get.color(card) == "black" && get.type(card) != "basic"; - }, "eh"); - }, - filter: function (event, player) { - if ( - event.type == "wuxie" || - !player.hasCard(function (card) { - return get.color(card) == "black" && get.type(card) != "basic"; - }, "eh") - ) - return false; - var list = event.huomo_list || lib.skill.huomo.getUsed(player); - for (var name of lib.inpile) { - if (get.type(name) != "basic" || list.includes(name)) continue; - var card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) return true; - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(card, player, event)) return true; - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var vcards = []; - var list = event.huomo_list || lib.skill.huomo.getUsed(player); - for (var name of lib.inpile) { - if (get.type(name) != "basic" || list.includes(name)) continue; - var card = { name: name, isCard: true }; - if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); - if (name == "sha") { - for (var nature of lib.inpile_nature) { - card.nature = nature; - if (event.filterCard(card, player, event)) vcards.push(["基本", "", name, nature]); - } - } - } - return ui.create.dialog("活墨", [vcards, "vcard"], "hidden"); - }, - check: function (button) { - var player = _status.event.player; - var card = { name: button.link[2], nature: button.link[3] }; - if ( - game.hasPlayer(function (current) { - return player.canUse(card, current) && get.effect(current, card, player, player) > 0; - }) - ) { - switch (button.link[2]) { - case "tao": - return 5; - case "jiu": - return 3.01; - case "sha": - if (button.link[3] == "fire") return 2.95; - else if (button.link[3] == "thunder") return 2.92; - else return 2.9; - case "shan": - return 1; - } - } - return 0; - }, - backup: function (links, player) { - return { - check: function (card) { - return 1 / Math.max(0.1, get.value(card)); - }, - filterCard: function (card) { - return get.type(card) != "basic" && get.color(card) == "black"; - }, - viewAs: { - name: links[0][2], - nature: links[0][3], - suit: "none", - number: null, - isCard: true, - }, - position: "he", - popname: true, - ignoreMod: true, - precontent: function () { - player.logSkill("huomo"); - var card = event.result.cards[0]; - game.log(player, "将", card, "置于牌堆顶"); - event.result.card = { - name: event.result.card.name, - nature: event.result.card.nature, - }; - event.result.cards = []; - player.loseToDiscardpile(card, ui.cardPile, "visible", "insert").log = false; - }, - }; - }, - prompt: function (links, player) { - return "将一张黑色非基本牌置于牌堆顶并视为使用一张" + get.translation(links[0][3] || "") + get.translation(links[0][2]); - }, - }, - ai: { - order: function () { - var player = _status.event.player; - var event = _status.event; - var list = lib.skill.huomo.getUsed(player); - if (!list.includes("jiu") && event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0) { - return 3.1; - } - return 2.9; - }, - respondSha: true, - fireAttack: true, - respondShan: true, - skillTagFilter: function (player, tag, arg) { - if (tag == "fireAttack") return true; - if ( - player.hasCard(function (card) { - return get.color(card) == "black" && get.type(card) != "basic"; - }, "he") - ) { - var list = lib.skill.huomo.getUsed(player); - if (tag == "respondSha") { - if (arg != "use") return false; - if (list.includes("sha")) return false; - } else if (tag == "respondShan") { - if (list.includes("shan")) return false; - } - } else { - return false; - } - }, - result: { - player: 1, - }, - }, - }, - // taoxi:{ - // audio:2, - // trigger:{player:'useCardToPlayered'}, - // filter:function(event,player){ - // return _status.currentPhase==player&&event.targets.length==1&& - // event.target.countCards('h')>0&&!player.hasSkill('taoxi4')&&player!=event.target; - // }, - // check:function(event,player){ - // return get.attitude(player,event.target)<0; - // }, - // intro:{ - // content:'card' - // }, - // content:function(){ - // var card=trigger.target.getCards('h').randomGet(); - // player.showCards([card]); - // player.storage.taoxi=card; - // player.storage.taoxi2=trigger.target; - // player.syncStorage('taoxi'); - // player.markSkill('taoxi'); - // player.addTempSkill('taoxi4'); - // }, - // group:['taoxi2','taoxi3'] - // }, - // taoxi2:{ - // audio:false, - // enable:'phaseUse', - // filter:function(event,player){ - // if(player.storage.taoxi&&player.storage.taoxi2&& - // get.owner(player.storage.taoxi)==player.storage.taoxi2&& - // lib.filter.filterCard(player.storage.taoxi,player,event)){ - // return true; - // } - // return false; - // }, - // filterTarget:function(card,player,target){ - // return player.canUse(player.storage.taoxi,target); - // }, - // selectTarget:function(){ - // var info=get.info(_status.event.player.storage.taoxi); - // if(info.notarget) return -1; - // return get.select(info.selectTarget); - // }, - // multitarget:true, - // multiline:true, - // content:function(){ - // 'step 0' - // var card=player.storage.taoxi; - // if(!card){ - // event.finish(); - // return; - // } - // var owner=get.owner(card); - // if(owner){ - // owner.lose(card,ui.special); - // } - // event.card=card; - // player.$throw(card); - // 'step 1' - // player.useCard(event.card,targets).animate=false; - // delete player.storage.taoxi; - // delete player.storage.taoxi2; - // player.unmarkSkill('taoxi'); - // }, - // ai:{ - // order:8, - // result:{ - // target:function(player,target){ - // return get.effect(target,player.storage.taoxi,player,target); - // }, - // player:1 - // } - // } - // }, - // taoxi3:{ - // trigger:{player:'phaseJieshuBegin'}, - // forced:true, - // popup:false, - // filter:function(event,player){ - // return player.storage.taoxi?true:false; - // }, - // content:function(){ - // if(get.owner(player.storage.taoxi)==player.storage.taoxi2){ - // player.loseHp(); - // } - // delete player.storage.taoxi; - // delete player.storage.taoxi2; - // player.unmarkSkill('taoxi'); - // } - // }, - // taoxi4:{}, - taoxi: { - audio: 2, - trigger: { player: "useCardToPlayered" }, - check: function (event, player) { - if (get.attitude(player, event.target) >= 0) return false; - var cards = event.target.getCards("h"); - if (cards.filter(card => player.hasUseTarget(card)).length >= cards.length / 2) return true; - return false; - }, - filter: function (event, player) { - return player.isPhaseUsing() && event.targets.length == 1 && event.target.countCards("h") > 0 && player != event.target && !player.hasSkill("taoxi_used"); - }, - logTarget: "target", - content: function () { - "step 0"; - player.choosePlayerCard(trigger.target, "h", true); - "step 1"; - if (result.bool) { - var card = result.links[0]; - player.showCards(card, get.translation(player) + "对" + get.translation(trigger.target) + "发动了【讨袭】"); - if (!player.storage.taoxi_list) player.storage.taoxi_list = [[], []]; - if (!player.storage.taoxi_list[1].some(i => i._cardid == card.cardid)) { - var cardx = ui.create.card(); - cardx.init(get.cardInfo(card)); - cardx._cardid = card.cardid; - player.directgains([cardx], null, "taoxi"); - player.storage.taoxi_list[0].push(trigger.target); - player.storage.taoxi_list[1].push(cardx); - player.markSkill("taoxi_list"); - player.addTempSkill("taoxi_list"); - player.addTempSkill("taoxi_use"); - player.addTempSkill("taoxi_used", "phaseUseAfter"); - } - } - }, - subSkill: { - used: {}, - use: { - trigger: { player: "useCardBefore" }, - charlotte: true, - forced: true, - popup: false, - firstDo: true, - group: "taoxi_lose", - filter: function (event, player) { - if (!player.storage.taoxi_list || !player.storage.taoxi_list.length) return false; - var list = player.storage.taoxi_list[1]; - return ( - event.cards && - event.cards.some(card => { - return list.includes(card); - }) - ); - }, - content: function () { - var cards = [], - list = player.storage.taoxi_list; - for (var card of trigger.cards) { - var bool = false; - for (var i = 0; i < list[0].length; i++) { - if (list[1][i] == card) { - var cardid = card._cardid; - var cardx = list[0][i].getCards("h", cardxx => cardxx.cardid == cardid)[0]; - if (cardx && get.position(cardx) == "h") { - cards.push(cardx); - list[0][i].$throw(cardx); - bool = true; - break; - } - } - } - if (!bool) cards.push(card); - } - trigger.cards = cards; - trigger.card.cards = cards; - trigger.throw = false; - }, - mod: { - aiOrder: function (player, card, num) { - var list = player.storage.taoxi_list; - if (!list || !list[1]) return; - if (list[1].includes(card)) return num + 0.5; - }, - cardEnabled2: function (card) { - if (get.itemtype(card) == "card" && card.hasGaintag("taoxi") && _status.event.name == "chooseToRespond") return false; - }, - }, - ai: { - effect: { - player_use: function (card, player, target) { - var list = player.storage.taoxi_list; - if (!list || !list[1]) return; - if (list[1].includes(card)) return [1, 1]; - }, - }, - }, - }, - lose: { - trigger: { - global: ["loseEnd", "equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd"], - }, - charlotte: true, - forced: true, - popup: false, - firstDo: true, - filter: function (event, player) { - var list = player.storage.taoxi_list; - if (!list || !list[0].length) return false; - return game.hasPlayer(function (current) { - if (!list[0].includes(current)) return; - var evt = event.getl(current); - if ( - evt && - evt.hs && - evt.hs.some(card => { - return list[1].some(i => i._cardid == card.cardid); - }) - ) - return true; - return false; - }); - }, - content: function () { - var list = player.storage.taoxi_list; - var targets = game.filterPlayer(function (current) { - if (!list[0].includes(current)) return; - var evt = trigger.getl(current); - if ( - evt && - evt.hs && - evt.hs.some(card => { - return list[1].some(i => i._cardid == card.cardid); - }) - ) - return true; - return false; - }); - for (var target of targets) { - var hs = trigger.getl(target).hs; - for (var i = 0; i < list[0].length; i++) { - if (hs.some(j => j.cardid == list[1][i]._cardid)) { - if (player.isOnline2()) { - player.send( - function (list, i) { - game.me.storage.taoxi_list = list; - list[1][i].delete(); - list[0].splice(i, 1); - list[1].splice(i, 1); - }, - player.storage.taoxi_list, - i - ); - } - list[1][i].delete(); - list[0].splice(i, 1); - list[1].splice(i, 1); - i--; - } - } - } - }, - }, - list: { - trigger: { player: "phaseEnd" }, - charlotte: true, - forced: true, - onremove: function (player) { - game.broadcastAll(function (player) { - player.storage.taoxi_list[1].forEach(i => i.delete()); - delete player.storage.taoxi_list; - }, player); - }, - filter: function (event, player) { - return player.storage.taoxi_list && player.storage.taoxi_list[0].length > 0; - }, - content: function () { - player.loseHp(); - }, - }, - }, - }, - xingshuai: { - skillAnimation: true, - animationColor: "thunder", - audio: 2, - trigger: { player: "dying" }, - //priority:6, - zhuSkill: true, - filter: function (event, player) { - if (player.hp > 0) return false; - if (!player.hasZhuSkill("xingshuai")) return false; - return game.hasPlayer(function (current) { - return current != player && current.group == "wei"; - }); - }, - mark: true, - unique: true, - limited: true, - content: function () { - "step 0"; - player.awakenSkill("xingshuai"); - var targets = game.filterPlayer(); - targets.remove(player); - event.targets = targets; - event.damages = []; - "step 1"; - if (event.targets.length) { - var current = event.targets.shift(); - if (current.group == "wei") { - current - .chooseBool("是否令" + get.translation(player) + "回复1点体力?") - .set("ai", function () { - return get.attitude(_status.event.player, _status.event.target) > 2; - }) - .set("target", player); - event.current = current; - } else { - event.redo(); - } - } else { - event.goto(3); - } - "step 2"; - if (result.bool) { - event.damages.push(event.current); - event.current.line(player, "green"); - game.log(event.current, "令", player, "回复1点体力"); - player.recover(); - } - if (event.targets.length) { - event.goto(1); - } - "step 3"; - if (event.damages.length) { - var next = game.createEvent("xingshuaI_next"); - event.next.remove(next); - trigger.after.push(next); - next.targets = event.damages; - next.setContent(function () { - targets.shift().damage(); - if (targets.length) event.redo(); - }); - } - }, - }, - mingjian: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player != target; - }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterCard: true, - selectCard: -1, - discard: false, - lose: false, - delay: false, - content: function () { - player.give(cards, target); - target.addTempSkill("mingjian2", { player: "phaseAfter" }); - target.storage.mingjian2++; - target.updateMarks("mingjian2"); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - if (target.hasSkillTag("nogain")) return 0; - if (player.countCards("h") == player.countCards("h", "du")) return -1; - if (target.hasJudge("lebu")) return 0; - if (get.attitude(player, target) > 3) { - var basis = get.threaten(target); - if ( - player == get.zhu(player) && - player.hp <= 2 && - player.countCards("h", "shan") && - !game.hasPlayer(function (current) { - return get.attitude(current, player) > 3 && current.countCards("h", "tao") > 0; - }) - ) - return 0; - if (target.countCards("h") + player.countCards("h") > target.hp + 2) return basis * 0.8; - return basis; - } - return 0; - }, - }, - }, - }, - mingjian2: { - charlotte: true, - mark: true, - intro: { - content: "手牌上限+#,出杀次数+#", - }, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = 0; - }, - onremove: true, - mod: { - maxHandcard: function (player, num) { - return num + player.storage.mingjian2; - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + player.storage.mingjian2; - }, - }, - }, - mingjian_old: { - audio: 2, - trigger: { player: "phaseUseBefore" }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - var go = Math.random() < 0.5; - player.chooseTarget(get.prompt("mingjian_old"), function (card, player, target) { - return player != target; - }).ai = function (target) { - var att = get.attitude(player, target); - if (att > 3) { - if (player.countCards("h") > player.hp) return att; - if (go) return att; - } - return 0; - }; - "step 1"; - if (result.bool) { - player.logSkill("mingjian_old", result.targets); - trigger.cancel(); - var target = result.targets[0]; - target.addSkill("mingjian2_old"); - var hs = player.getCards("h"); - player.give(hs, target); - } - }, - }, - mingjian2_old: { - audio: false, - trigger: { global: "phaseAfter" }, - forced: true, - popup: false, - charlotte: true, - content: function () { - if (lib.config.glow_phase) { - if (_status.currentPhase) { - _status.currentPhase.classList.remove("glow_phase"); - } - player.classList.add("glow_phase"); - } - game.addVideo("phaseChange", player); - _status.currentPhase = player; - player.ai.tempIgnore = []; - player.stat.push({ card: {}, skill: {} }); - player.phaseUse(); - player.removeSkill("mingjian2_old"); - }, - }, - huituo: { - audio: 2, - audioname: ["re_caorui"], - trigger: { player: "damageEnd" }, - direct: true, - content: function () { - "step 0"; - var forced = event.forced === undefined ? false : event.forced; - var info = get.skillInfoTranslation("huituo", player); - var str = `###${forced ? "恢拓:请选择一名角色" : get.prompt("huituo")}###令一名角色判定。若结果为红色,其回复1点体力;若结果为黑色,其摸${get.cnNumber(trigger.num)}张牌`; - player.chooseTarget(str, event.forced).set("ai", function (target) { - var player = _status.event.player; - if (get.attitude(player, target) > 0) { - return get.recoverEffect(target, player, player) + 1; - } - return 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("huituo", result.targets); - var target = result.targets[0]; - event.target = target; - target.judge(function (card) { - if (target.hp == target.maxHp) { - if (get.color(card) == "red") return -1; - } - if (get.color(card) == "red") return 1; - return 0; - }); - } else { - event.finish(); - } - "step 2"; - if (result.color) { - if (result.color == "red") { - if (event.target.hp < event.target.maxHp) event.target.recover(); - } else { - event.target.draw(trigger.num); - } - } - }, - ai: { - maixie: true, - maixie_hp: true, - }, - }, - duodao: { - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return player.countCards("he") > 0 && event.source && event.card && event.card.name == "sha"; - }, - direct: true, - //priority:5, - audio: 2, - content: function () { - "step 0"; - var prompt = "弃置一张牌"; - if (trigger.source.getEquips(1).length) prompt += ",然后获得" + get.translation(trigger.source) + "装备区中的" + get.translation(trigger.source.getEquips(1)); - var next = player.chooseToDiscard("he", get.prompt("duodao", trigger.source), prompt); - next.logSkill = ["duodao", trigger.source]; - next.set("ai", function (card) { - if (!_status.event.getTrigger().source.getEquip(1)) return 0; - if (get.attitude(_status.event.player, _status.event.getTrigger().source) <= 0) { - return 6 - get.value(card); - } - return 0; - }); - "step 1"; - if (result.bool && trigger.source.getEquips(1).length) { - player.gain(trigger.source.getEquips(1), trigger.source, "give", "bySelf"); - } - }, - ai: { - maixie_defend: true, - }, - }, - reanjian: { - trigger: { player: "useCardToPlayered" }, - forced: true, - audio: 2, - filter: function (event, player) { - return event.card.name == "sha" && !event.target.inRange(player); - }, - logTarget: "target", - content: function () { - trigger.getParent().reanjian_buffed = true; - var map = trigger.customArgs; - var id = trigger.target.playerid; - if (!map[id]) map[id] = {}; - if (!map[id].extraDamage) map[id].extraDamage = 0; - map[id].extraDamage++; - trigger.target.addTempSkill("reanjian2"); - trigger.target.addTempSkill("reanjian4"); - trigger.target.storage.reanjian2.add(trigger.card); - }, - ai: { - unequip_ai: true, - skillTagFilter: function (player, tag, arg) { - if (arg && arg.name == "sha" && arg.target && !arg.target.inRange(player)) return true; - return false; - }, - }, - }, - reanjian2: { - firstDo: true, - ai: { unequip2: true }, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - onremove: true, - trigger: { - player: ["damage", "damageCancelled", "damageZero"], - target: ["shaMiss", "useCardToExcluded"], - }, - charlotte: true, - filter: function (event, player) { - return player.storage.reanjian2 && event.card && player.storage.reanjian2.includes(event.card); - }, - silent: true, - forced: true, - popup: false, - priority: 12, - content: function () { - player.storage.reanjian2.remove(trigger.card); - if (!player.storage.reanjian2.length) player.removeSkill("reanjian2"); - }, - }, - reanjian3: { - mod: { - cardSavable: function (card) { - if (card.name == "tao") return false; - }, - }, - }, - reanjian4: { - trigger: { player: "dyingBegin" }, - forced: true, - silent: true, - firstDo: true, - filter: function (event, player) { - return (event.getParent(2).reanjian_buffed = true); - }, - content: function () { - player.addTempSkill("reanjian3", { global: ["dyingEnd", "phaseEnd"] }); - }, - }, - reduodao: { - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - return event.card.name == "sha" && (get.color(event.card) == "red" ? event.player.getEquips(1).length > 0 : player.countCards("he") > 0); - }, - direct: true, - audio: 2, - content: function () { - "step 0"; - var prompt = "弃置一张牌"; - if (trigger.player.getEquips(1).length) prompt += ",然后获得" + get.translation(trigger.player) + "装备区中的" + get.translation(trigger.player.getEquips(1)); - var next = player.chooseToDiscard("he", get.prompt("reduodao", trigger.player), prompt); - next.logSkill = ["reduodao", trigger.player]; - next.set("ai", function (card) { - if (!_status.event.getTrigger().player.getEquips(1).length) return 0; - if (get.attitude(_status.event.player, _status.event.getTrigger().player) * get.value(_status.event.getTrigger().player.getEquips(1)) <= 0) { - return 6 - get.value(card); - } - return 0; - }); - "step 1"; - if (result.bool && trigger.player.getEquips(1).length) { - if (!result.cards || !result.cards.length) player.logSkill("reduodao", trigger.player); - player.gain(trigger.player.getEquips(1), trigger.player, "give", "bySelf"); - } - }, - }, - anjian: { - audio: 2, - trigger: { source: "damageBegin1" }, - check: function (event, player) { - return get.attitude(player, event.player) <= 0; - }, - forced: true, - filter: function (event, player) { - return event.getParent().name == "sha" && !event.player.inRange(player); - }, - content: function () { - trigger.num++; - }, - }, - xinpojun: { - shaRelated: true, - trigger: { player: "useCardToPlayered" }, - direct: true, - filter: function (event, player) { - return event.card.name == "sha" && player.isPhaseUsing() && event.target.hp > 0 && event.target.countCards("he") > 0; - }, - audio: 2, - content: function () { - "step 0"; - player.choosePlayerCard(trigger.target, "he", [1, Math.min(trigger.target.countCards("he"), trigger.target.hp)], get.prompt("xinpojun", trigger.target)).set("forceAuto", true); - "step 1"; - if (result.bool && result.links.length) { - var target = trigger.target; - player.logSkill("xinpojun", target); - target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("xinpojun2"); - target.addSkill("xinpojun2"); - } - }, - ai: { - unequip_ai: true, - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false; - if (tag == "directHit_ai") return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); - if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; - return false; - }, - }, - }, - xinpojun2: { - trigger: { global: "phaseEnd" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return player.getExpansions("xinpojun2").length > 0; - }, - content: function () { - "step 0"; - var cards = player.getExpansions("xinpojun2"); - player.gain(cards, "draw"); - game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌"); - "step 1"; - player.removeSkill("xinpojun2"); - }, - intro: { - markcount: "expansion", - mark: function (dialog, storage, player) { - var cards = player.getExpansions("xinpojun2"); - if (player.isUnderControl(true)) dialog.addAuto(cards); - else return "共有" + get.cnNumber(cards.length) + "张牌"; - }, - }, - }, - qiaoshi: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return event.player != player && event.player.countCards("h") == player.countCards("h") && event.player.isIn(); - }, - check: function (event, player) { - return get.attitude(player, event.player) >= 0; - }, - logTarget: "player", - content: function () { - game.asyncDraw([trigger.player, player]); - }, - }, - yanyu: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.hasCard(card => lib.skill.yanyu.filterCard(card, player), "h"); - }, - filterCard: (card, player) => get.name(card) == "sha" && player.canRecast(card), - discard: false, - lose: false, - delay: false, - content: function () { - player.recast(cards); - }, - ai: { - basic: { - order: 1, - }, - result: { - player: 1, - }, - }, - group: "yanyu2", - }, - yanyu2: { - trigger: { player: "phaseUseEnd" }, - filter: function (event, player) { - return ( - player.getHistory("useSkill", function (evt) { - return evt.event.getParent("phaseUse") == event && evt.skill == "yanyu"; - }).length >= 2 - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("yanyu"), "令一名男性角色摸两张牌", function (card, player, target) { - return target.hasSex("male") && target != player; - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - player.logSkill("yanyu", result.targets); - result.targets[0].draw(2); - } - }, - }, - youdi: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("youdi"), function (card, player, target) { - return player != target; - }) - .set("ai", function (target) { - if (!_status.event.goon) return 0; - if (target.countCards("he") == 0) return 0; - return -get.attitude(_status.event.player, target); - }) - .set("goon", player.countCards("h", "sha") <= player.countCards("h") / 3); - "step 1"; - if (result.bool) { - game.delay(); - player.logSkill("youdi", result.targets); - event.target = result.targets[0]; - event.target.discardPlayerCard(player, "he", true); - } else { - event.finish(); - } - "step 2"; - if (result.links[0].name != "sha" && event.target.countGainableCards(player, "he")) { - player.gainPlayerCard("he", event.target, true); - } - }, - ai: { - expose: 0.2, - }, - }, - fuhun: { - enable: ["chooseToUse", "chooseToRespond"], - filterCard: true, - selectCard: 2, - position: "hs", - audio: 2, - audioname: ["re_guanzhang"], - derivation: ["new_rewusheng", "olpaoxiao"], - viewAs: { name: "sha" }, - prompt: "将两张手牌当杀使用或打出", - viewAsFilter: function (player) { - return player.countCards("hs") > 1; - }, - check: function (card) { - if (_status.event.player.hasSkill("new_rewusheng") && get.color(card) == "red") return 0; - if (_status.event.name == "chooseToRespond") { - if (card.name == "sha") return 0; - return 6 - get.useful(card); - } - if (_status.event.player.countCards("hs") < 4) return 6 - get.useful(card); - return 7 - get.useful(card); - }, - ai: { - respondSha: true, - skillTagFilter: function (player) { - if (player.countCards("hs") < 2) return false; - }, - order: function (item, player) { - if (player.hasSkill("new_rewusheng") && player.hasSkill("olpaoxiao")) { - return 1; - } - if (player.countCards("hs") < 4) { - return 1; - } - return 4; - }, - }, - group: "fuhun2", - }, - fuhun2: { - audio: "fuhun", - audioname: ["re_guanzhang"], - trigger: { source: "damageSource" }, - forced: true, - filter: function (event, player) { - if (["new_rewusheng", "olpaoxiao"].every(skill => player.hasSkill(skill, null, false, false))) return false; - return event.getParent().skill == "fuhun"; - }, - content: function () { - player.addTempSkills(["new_rewusheng", "olpaoxiao"]); - // player.addTempSkill('fuhun3'); - }, - }, - fuhun3: {}, - fencheng: { - skillAnimation: "epic", - animationColor: "gray", - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return !player.storage.fencheng; - }, - filterTarget: function (card, player, target) { - return player != target; - }, - unique: true, - limited: true, - selectTarget: -1, - mark: true, - line: "fire", - content: function () { - "step 0"; - player.storage.fencheng = true; - player.awakenSkill("fencheng"); - var res = get.damageEffect(target, player, target, "fire"); - var num = Math.max(1, target.countCards("e")); - target - .chooseToDiscard(num, "he", "弃置" + get.cnNumber(num) + "张牌或受到1点火焰伤害") - .set("ai", function (card) { - var res = _status.event.res; - var num = _status.event.num; - var player = _status.event.player; - if (res >= 0) return -1; - if (num > 2 && player.hp > 1) return -1; - if (num > 1 && player.hp > 2) return -1; - if (get.position(card) == "e") { - return 10 - get.value(card); - } - return 6 - get.value(card); - }) - .set("res", res) - .set("num", num); - "step 1"; - if (!result.bool) { - target.damage("fire"); - } - }, - ai: { - order: 1, - result: { - player: function (player) { - var num = 0, - players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (player != players[i] && get.damageEffect(players[i], player, players[i], "fire") < 0) { - var att = get.attitude(player, players[i]); - if (att > 0) { - num -= Math.max(1, players[i].countCards("e")); - } else if (att < 0) { - num += Math.max(1, players[i].countCards("e")); - } - } - } - if (players.length < 5) { - return num - 1; - } else { - return num - 2; - } - }, - }, - }, - init: function (player) { - player.storage.fencheng = false; - }, - intro: { - content: "limited", - }, - }, - mieji: { - trigger: { player: "useCard2" }, - direct: true, - audio: 2, - filter: function (event, player) { - if (get.type(event.card) != "trick" || get.color(event.card) != "black") return false; - if (!event.targets || event.targets.length != 1) return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); - }) - ) { - return true; - } - } - return false; - }, - position: "he", - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("mieji"), "为" + get.translation(trigger.card) + "增加一个额外目标", function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); - }) - .set("autodelay", true) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - player.logSkill("mieji", result.targets); - trigger.targets.push(result.targets[0]); - } - }, - }, - junxing: { - enable: "phaseUse", - audio: 2, - usable: 1, - filterCard: true, - selectCard: [1, Infinity], - filter: function (event, player) { - return player.countCards("h") > 0; - }, - check: function (card) { - if (ui.selected.cards.length) return -1; - var val = get.value(card); - if (get.type(card) == "basic") return 8 - get.value(card); - return 5 - get.value(card); - }, - filterTarget: function (card, player, target) { - return player != target; - }, - content: function () { - "step 0"; - var types = []; - for (var i = 0; i < cards.length; i++) { - types.add(get.type(cards[i], "trick", player)); - } - target - .chooseToDiscard(function (card) { - return !_status.event.types.includes(get.type(card, "trick")); - }) - .set("ai", function (card) { - if (_status.event.player.isTurnedOver()) return -1; - return 8 - get.value(card); - }) - .set("types", types) - .set("dialog", ["弃置一张与" + get.translation(player) + "弃置的牌类别均不同的牌,或将武将牌翻面", "hidden", cards]); - "step 1"; - if (!result.bool) { - target.turnOver(); - target.draw(cards.length); - } - }, - ai: { - order: 2, - expose: 0.3, - threaten: 1.8, - result: { - target: function (player, target) { - if (target.hasSkillTag("noturn")) return 0; - if (target.isTurnedOver()) return 2; - return -1 / (target.countCards("h") + 1); - }, - }, - }, - }, - juece: { - audio: 2, - trigger: { - global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - direct: true, - filter: function (event, player) { - if (_status.currentPhase != player) return false; - return game.hasPlayer(current => { - if (current == player || current.countCards("h")) return false; - var evt = event.getl(current); - return evt && evt.hs && evt.hs.length; - }); - }, - check: function (event, player) { - return get.damageEffect(event.player, player, player) > 0; - }, - content: function () { - "step 0"; - var targets = game.filterPlayer(current => { - if (current == player || current.countCards("h")) return false; - var evt = trigger.getl(current); - return evt && evt.hs && evt.hs.length; - }); - event.targets = targets; - "step 1"; - var target = event.targets.shift(); - event.target = target; - player.chooseBool(get.prompt2("juece", target)).set("ai", () => { - return get.damageEffect(_status.event.getParent().target, _status.event.player, _status.event.player) >= 0; - }); - "step 2"; - if (result.bool) { - player.logSkill("juece", target); - target.damage(); - } - "step 3"; - if (targets.length) event.goto(1); - }, - ai: { - threaten: 1.1, - }, - }, - jiefan: { - skillAnimation: true, - animationColor: "wood", - audio: 2, - audioname: ["re_handang"], - unique: true, - limited: true, - mark: true, - init: function (player) { - player.storage.jiefan = false; - }, - enable: "phaseUse", - filter: function (event, player) { - return !player.storage.jiefan; - }, - intro: { - content: "limited", - }, - filterTarget: true, - content: function () { - "step 0"; - player.awakenSkill("jiefan"); - player.storage.jiefan = true; - event.players = game.filterPlayer(function (current) { - return current != target && current.inRange(target); - }); - event.players.sortBySeat(target); - "step 1"; - if (event.players.length) { - event.current = event.players.shift(); - event.current.addTempClass("target"); - player.line(event.current, "green"); - if (event.current.countCards("he") && target.isIn()) { - event.current - .chooseToDiscard({ subtype: "equip1" }, "he", "弃置一张武器牌或让" + get.translation(target) + "摸一张牌") - .set("ai", function (card) { - if (get.attitude(_status.event.player, _status.event.target) < 0) return 7 - get.value(card); - return -1; - }) - .set("target", target); - event.tempbool = false; - } else { - event.tempbool = true; - } - } else { - event.finish(); - } - "step 2"; - if (event.tempbool || result.bool == false) { - target.draw(); - } - event.goto(1); - }, - ai: { - order: 5, - result: { - target: function (player, target) { - if (player.hp > 2) { - if (game.phaseNumber < game.players.length * 2) return 0; - } - var num = 0, - players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != target && players[i].inRange(target)) { - num++; - } - } - return num; - }, - }, - }, - }, - fuli: { - skillAnimation: true, - animationColor: "soil", - audio: 2, - unique: true, - limited: true, - enable: "chooseToUse", - init: function (player) { - player.storage.fuli = false; - }, - mark: true, - filter: function (event, player) { - if (event.type != "dying") return false; - if (player != event.dying) return false; - if (player.storage.fuli) return false; - return true; - }, - content: function () { - "step 0"; - player.awakenSkill("fuli"); - player.recover(game.countGroup() - player.hp); - "step 1"; - player.turnOver(); - player.storage.fuli = true; - }, - ai: { - save: true, - skillTagFilter: function (player, arg, target) { - return player == target && player.storage.fuli != true; - }, - result: { - player: 10, - }, - threaten: function (player, target) { - if (!target.storage.fuli) return 0.9; - }, - }, - intro: { - content: "limited", - }, - }, - qianxi: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - preHidden: true, - content: function () { - "step 0"; - player.draw(); - player.chooseToDiscard("he", true); - "step 1"; - if (!result.bool) { - event.finish(); - return; - } - event.color = get.color(result.cards[0], result.cards[0].original == "h" ? player : false); - player - .chooseTarget(function (card, player, target) { - return player != target && get.distance(player, target) <= 1; - }, true) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - "step 2"; - if (result.bool && result.targets.length) { - result.targets[0].storage.qianxi2 = event.color; - result.targets[0].addTempSkill("qianxi2"); - player.line(result.targets, "green"); - game.addVideo("storage", result.targets[0], ["qianxi2", event.color]); - } - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - if (tag !== "directHit_ai" || !arg.target.hasSkill("qianxi2")) return false; - if (arg.card.name == "sha") - return ( - arg.target.storage.qianxi2 == "red" && - (!arg.target.hasSkillTag( - "freeShan", - false, - { - player: player, - card: arg.card, - }, - true - ) || - player.hasSkillTag("unequip", false, { - name: arg.card ? arg.card.name : null, - target: arg.target, - card: arg.card, - }) || - player.hasSkillTag("unequip_ai", false, { - name: arg.card ? arg.card.name : null, - target: arg.target, - card: arg.card, - })) - ); - return arg.target.storage.qianxi2 == "black"; - }, - }, - }, - qianxi2: { - //trigger:{global:'phaseAfter'}, - forced: true, - mark: true, - audio: false, - content: function () { - player.removeSkill("qianxi2"); - delete player.storage.qianxi2; - }, - mod: { - cardEnabled2: function (card, player) { - if (get.color(card) == player.storage.qianxi2 && get.position(card) == "h") return false; - }, - }, - intro: { - content: function (color) { - return "不能使用或打出" + get.translation(color) + "的手牌"; - }, - }, - }, - zhiman: { - audio: 2, - audioname: ["guansuo"], - trigger: { source: "damageBegin2" }, - check: function (event, player) { - if (get.damageEffect(event.player, player, player) < 0) return true; - var att = get.attitude(player, event.player); - if (att > 0 && event.player.countCards("j")) return true; - if (event.num > 1) { - if (att < 0) return false; - if (att > 0) return true; - } - var cards = event.player.getGainableCards(player, "e"); - for (var i = 0; i < cards.length; i++) { - if (get.equipValue(cards[i]) >= 6) return true; - } - return false; - }, - filter: function (event, player) { - return player != event.player; - }, - logTarget: "player", - content: function () { - if (trigger.player.countGainableCards(player, "ej")) { - player.gainPlayerCard(trigger.player, "ej", true); - } - trigger.cancel(); - }, - }, - sanyao: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target.isMaxHp(); - }, - filter: function (event, player) { - return player.countCards("he") > 0; - }, - check: function (card) { - return 7 - get.value(card); - }, - position: "he", - filterCard: true, - content: function () { - target.damage("nocard"); - }, - ai: { - result: { - target: function (player, target) { - if (target.countCards("j") && get.attitude(player, target) > 0) { - return 1; - } - if (target.countCards("e")) { - return -1; - } - return get.damageEffect(target, player); - }, - }, - order: 7, - }, - }, - olsanyao: { - enable: "phaseUse", - audio: "sanyao", - filter: function (event, player) { - return player.countCards("he") > 0 && (!player.hasSkill("olsanyao0") || !player.hasSkill("olsanyao1")); - }, - chooseButton: { - dialog: function (event, player) { - var list = ["选择手牌数最多的一名角色", "选择体力值最大的一名角色"]; - var choiceList = ui.create.dialog("散谣:请选择一项", "forcebutton", "hidden"); - choiceList.add([ - list.map((item, i) => { - return [i, item]; - }), - "textbutton", - ]); - return choiceList; - }, - filter: function (button, player) { - return !player.hasSkill("olsanyao" + button.link); - }, - check: function (button) { - var player = _status.event.player; - if ( - game.hasPlayer( - [ - function (target) { - var num = target.countCards("h"); - return ( - !game.hasPlayer(function (current) { - return current != target && current.countCards("h") > num; - }) && get.effect(target, "sanyao", player, player) > 0 - ); - }, - function (target) { - var num = target.hp; - return ( - !game.hasPlayer(function (current) { - return current != target && current.hp > num; - }) && get.effect(target, "sanyao", player, player) > 0 - ); - }, - ][button.link] - ) - ) - return 1 + button.link; - return 0; - }, - backup: function (links) { - return { - audio: "sanyao", - filterTarget: [ - function (card, player, target) { - var num = target.countCards("h"); - return !game.hasPlayer(function (current) { - return current != target && current.countCards("h") > num; - }); - }, - function (card, player, target) { - return !game.hasPlayer(function (current) { - return current != target && current.hp > target.hp; - }); - }, - ][links[0]], - index: links[0], - filterCard: true, - check: function (card) { - return 7 - get.value(card); - }, - position: "he", - content: function () { - player.addTempSkill("olsanyao" + lib.skill[event.name].index); - target.damage("nocard"); - }, - ai: lib.skill.sanyao.ai, - }; - }, - prompt: function () { - return "请选择【散谣】的目标"; - }, - }, - ai: { - order: 7, - result: { - player: 1, - }, - }, - }, - olsanyao0: {}, - olsanyao1: {}, - rezhiman: { - audio: "zhiman", - audioname: ["guansuo", "re_masu"], - audioname2: { - dc_guansuo: "zhiman_guansuo", - }, - trigger: { source: "damageBegin2" }, - filter: function (event, player) { - return player != event.player; - }, - check: function (event, player) { - if (get.damageEffect(event.player, player, player) < 0) return true; - var att = get.attitude(player, event.player); - if (att > 0 && event.player.countCards("j")) return true; - if (event.num > 1) { - if (att < 0) return false; - if (att > 0) return true; - } - var cards = event.player.getGainableCards(player, "he"); - for (var i = 0; i < cards.length; i++) { - if (get.equipValue(cards[i]) >= 6) return true; - } - return false; - }, - logTarget: "player", - content: function () { - if (trigger.player.countGainableCards(player, "hej")) { - player.gainPlayerCard(trigger.player, "hej", true); - } - trigger.cancel(); - }, - }, - zhiman_guansuo: { audio: 2 }, - resanyao: { - audio: 2, - enable: "phaseUse", - usable: 1, - selectCard: function () { - var player = _status.event.player; - return [ - Math.max(1, ui.selected.targets.length), - game.countPlayer(function (target) { - return ( - target != player && - !game.hasPlayer(function (current) { - return current != player && current.hp > target.hp; - }) - ); - }), - ]; - }, - selectTarget: function () { - return ui.selected.cards.length; - }, - filterTarget: function (card, player, target) { - return ( - target != player && - !game.hasPlayer(function (current) { - return current != player && current.hp > target.hp; - }) - ); - }, - check: function (card) { - var player = _status.event.player; - if ( - game.countPlayer(function (target) { - return ( - target != player && - !game.hasPlayer(function (current) { - return current != player && current.hp > target.hp; - }) && - get.effect(target, "sanyao", player, player) > 0 - ); - }) <= ui.selected.cards.length - ) - return 0; - return 7 - get.value(card); - }, - position: "he", - filterCard: true, - content: function () { - target.damage("nocard"); - }, - ai: { - result: { - target: function (player, target) { - var disbool = false; - if (player.hasSkill("rezhiman")) { - if (target.countCards("j") && get.attitude(player, target) > 0) { - return 1; - } - if ( - target.countCards("he", function (card) { - return card.name == "tengjia" || get.value(card) > 0; - }) - ) { - disbool = true; - } - } - var damage = get.damageEffect(target, player); - if (disbool && get.attitude(player, target) < 0) return Math.min(-1, damage); - return damage; - }, - }, - order: 7, - }, - }, - reqiaoshui: { - audio: 2, - enable: "phaseUse", - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) player.addTempSkill("qiaoshui3", "phaseUseEnd"); - else { - player.addTempSkill("qiaoshui4"); - event.getParent(3).skipped = true; - } - }, - ai: { - order: function (item, player) { - if ( - player.countCards("h", function (card) { - return player.hasValueTarget(card); - }) - ) - return 10; - return 1; - }, - result: { - target: function (player, target) { - if ( - player.countCards("h", function (card) { - return player.hasValueTarget(card); - }) - ) { - if (player.hasSkill("qiaoshui3")) return 0; - var nd = !player.needsToDiscard(); - if ( - player.hasCard(function (card) { - if (get.position(card) != "h") return false; - var val = get.value(card); - if (nd && val < 0) return true; - if (val <= 5) { - return get.number(card) >= 12; - } - if (val <= 6) { - return get.number(card) >= 13; - } - return false; - }) - ) - return -1; - return 0; - } - return -1; - }, - }, - }, - }, - qiaoshui: { - audio: 2, - audioname2: { - re_jianyong: "reqiaoshui", - xin_jianyong: "xinqiaoshui", - }, - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("qiaoshui"), function (card, player, target) { - return player.canCompare(target); - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target) / target.countCards("h"); - }); - "step 1"; - if (result.bool) { - player.logSkill("qiaoshui", result.targets[0]); - player.chooseToCompare(result.targets[0]); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.addTempSkill("qiaoshui3"); - } else { - player.addTempSkill("qiaoshui2"); - } - }, - ai: { - expose: 0.1, - }, - }, - qiaoshui2: { - mod: { - cardEnabled: function (card) { - if (get.type(card, "trick") == "trick") return false; - }, - }, - }, - qiaoshui3: { - charlotte: true, - audio: "qiaoshui", - audioname2: { - re_jianyong: "reqiaoshui", - xin_jianyong: "xinqiaoshui", - ol_jianyong: "olqiaoshui", - }, - trigger: { player: "useCard2" }, - filter: function (event, player) { - var type = get.type(event.card); - return type == "basic" || type == "trick"; - }, - direct: true, - content: function () { - "step 0"; - player.removeSkill("qiaoshui3"); - var goon = false; - var info = get.info(trigger.card); - if (trigger.targets && !info.multitarget) { - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (lib.filter.targetEnabled2(trigger.card, player, players[i]) && !trigger.targets.includes(players[i])) { - goon = true; - break; - } - } - } - if (goon) { - player - .chooseTarget("巧说:是否额外指定一名" + get.translation(trigger.card) + "的目标?", function (card, player, target) { - var trigger = _status.event; - if (trigger.targets.includes(target)) return false; - return lib.filter.targetEnabled2(trigger.card, _status.event.player, target); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player); - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - } else { - if (!info.multitarget && trigger.targets && trigger.targets.length > 1) { - event.goto(3); - } - } - "step 1"; - if (result.bool) { - if (!event.isMine()) game.delayx(); - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - if (event.target) { - player.logSkill("qiaoshui3", event.target); - trigger.targets.add(event.target); - } - event.finish(); - "step 3"; - player - .chooseTarget("巧说:是否减少一名" + get.translation(trigger.card) + "的目标?", function (card, player, target) { - return _status.event.targets.includes(target); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - return -get.effect(target, trigger.card, trigger.player, _status.event.player); - }) - .set("targets", trigger.targets); - "step 4"; - if (result.bool) { - event.targets = result.targets; - if (event.isMine()) { - player.logSkill("qiaoshui3", event.targets); - event.finish(); - } - for (var i = 0; i < result.targets.length; i++) { - trigger.targets.remove(result.targets[i]); - } - game.delay(); - } else { - event.finish(); - } - "step 5"; - player.logSkill("qiaoshui3", event.targets); - }, - }, - qiaoshui4: { - mod: { - ignoredHandcard: function (card, player) { - if (get.type(card, "trick", player) == "trick") { - return true; - } - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && get.type(card, "trick", player) == "trick") { - return false; - } - }, - }, - }, - jyzongshi_old: { - audio: 2, - trigger: { target: "useCardToBegin" }, - filter: function (event, player) { - if (event.targets && event.targets.length > 1) return false; - return event.card && get.type(event.card) == "trick" && event.player != player; - }, - frequent: true, - content: function () { - player.draw(); - }, - ai: { - effect: function (card, player, target) { - if (get.type(card) == "trick") return [1, 1]; - }, - }, - }, - shenxing: { - audio: 2, - enable: "phaseUse", - position: "he", - filterCard: true, - selectCard: 2, - prompt: "弃置两张牌并摸一张牌", - check: function (card) { - var player = _status.event.player; - if (!player.hasSkill("olbingyi") || player.hasSkill("olbingyi_blocker", null, null, false)) return 4 - get.value(card); - var red = 0, - black = 0, - hs = player.getCards("h"); - for (var i of hs) { - if (ui.selected.cards.includes(i)) continue; - var color = get.color(i, player); - if (color == "red") red++; - if (color == "black") black++; - } - if (red > 2 && black > 2) return 4 - get.value(card); - if (red == 0 || black == 0) return 8 - get.value(card); - var color = get.color(card); - if (black <= red) return (color == "black" && get.position(card) == "h" ? 8 : 4) - get.value(card); - return (color == "red" && get.position(card) == "h" ? 8 : 4) - get.value(card); - }, - content: function () { - player.draw(); - }, - ai: { - order: 9, - result: { - player: function (player, target) { - if (!ui.selected.cards.length) return 1; - if (!player.hasSkill("olbingyi") || player.hasSkill("olbingyi_blocker", null, null, false)) return 1; - var red = 0, - black = 0, - hs = player.getCards("h"); - for (var i of hs) { - if (ui.selected.cards.includes(i)) continue; - var color = get.color(i); - if (color == "red") red++; - if (color == "black") black++; - } - var val = 0; - for (var i of ui.selected.cards) val += get.value(i, player); - if (red == 0 || black == 0) { - if (red + black == 0) return 0; - var num = - Math.min( - red + black, - game.countPlayer(function (current) { - return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); - }) - ) + 1; - if (num * 7 > val) return 1; - } - if (val < 8) return 1; - return 0; - }, - }, - }, - }, - bingyi: { - audio: 2, - audioname: ["xin_guyong"], - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterx: function (event, player) { - var cards = player.getCards("h"); - if (cards.length < 1) return false; - var color = get.color(cards[0]); - for (var i = 1; i < cards.length; i++) { - if (get.color(cards[i]) != color) return false; - } - return true; - }, - direct: true, - content: function () { - "step 0"; - if (lib.skill.bingyi.filterx(trigger, player)) { - player - .chooseTarget(get.prompt("bingyi"), "展示所有手牌,并令至多" + get.cnNumber(player.countCards("h")) + "名角色各摸一张牌", [1, player.countCards("h")], function (card, player, target) { - return true; - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - } else - player.chooseBool(get.prompt("bingyi"), "展示所有手牌").ai = function () { - return false; - }; - "step 1"; - if (result.bool) { - player.logSkill("bingyi"); - player.showHandcards(get.translation(player) + "发动了【秉壹】"); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (targets && targets.length) { - player.line(targets, "green"); - targets.sortBySeat(); - game.asyncDraw(targets); - } - }, - ai: { - expose: 0.1, - }, - }, - xiantu: { - //unique:true, - audio: "xiantu1", - group: "xiantu2", - //gainable:true, - //forceunique:true, - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - return event.player != player; - }, - logTarget: "player", - check: function (event, player) { - if (get.attitude(player, event.player) < 5) return false; - if (player.maxHp - player.hp >= 2) return false; - if (player.hp == 1) return false; - if (player.hp == 2 && player.countCards("h") < 2) return false; - if (event.player.countCards("h") >= event.player.hp) return false; - return true; - }, - content: function () { - "step 0"; - if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); - player.draw(2); - "step 1"; - player.chooseCard(2, "he", true, "交给" + get.translation(trigger.player) + "两张牌").set("ai", function (card) { - if (ui.selected.cards.length && card.name == ui.selected.cards[0].name) return -1; - if (get.tag(card, "damage")) return 1; - if (get.type(card) == "equip") return 1; - return 0; - }); - "step 2"; - player.give(result.cards, trigger.player); - trigger.player.addSkill("xiantu4"); - trigger.player.storage.xiantu4.push(player); - }, - ai: { - threaten: 1.1, - }, - }, - xiantu1: { audio: true }, - xiantu2: { audio: true }, - xiantu4: { - trigger: { player: "phaseUseEnd" }, - forced: true, - audio: false, - onremove: true, - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - charlotte: true, - content: function () { - while (player.storage.xiantu4.length) { - var current = player.storage.xiantu4.shift(); - if (current.isDead()) continue; - current.logSkill("xiantu2"); - current.loseHp(); - } - player.removeSkill("xiantu4"); - }, - group: "xiantu3", - }, - xiantu3: { - trigger: { source: "dieAfter" }, - forced: true, - audio: false, - content: function () { - player.removeSkill("xiantu4"); - }, - }, - qiangzhi: { - audio: 2, - audioname: ["re_zhangsong"], - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }); - }, - subfrequent: ["draw"], - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("qiangzhi"), function (card, player, target) { - return target != player && target.countCards("h") > 0; - }) - .set("ai", function () { - return Math.random(); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("qiangzhi", target); - player.choosePlayerCard(target, "h", true); - } else event.finish(); - "step 2"; - var card = result.cards[0]; - target.showCards(card, get.translation(target) + "因【强识】展示"); - player.storage.qiangzhi_draw = get.type(card, "trick"); - game.addVideo("storage", player, ["qiangzhi_draw", player.storage.qiangzhi_draw]); - player.addTempSkill("qiangzhi_draw", "phaseUseEnd"); - }, - }, - qiangzhi_draw: { - trigger: { player: "useCard" }, - frequent: true, - popup: false, - charlotte: true, - prompt: "是否执行【强识】的效果摸一张牌?", - filter: function (event, player) { - return get.type(event.card, "trick") == player.storage.qiangzhi_draw; - }, - content: function () { - player.draw(); - }, - onremove: true, - mark: true, - intro: { - content: function (type) { - return get.translation(type) + "牌"; - }, - }, - }, - dingpin: { - audio: 2, - enable: "phaseUse", - onChooseToUse: function (event) { - if (event.type != "phase" || game.online) return; - var list = [], - player = event.player; - player.getHistory("useCard", function (evt) { - list.add(get.type2(evt.card)); - }); - player.getHistory("lose", function (evt) { - if (evt.type != "discard") return; - for (var i of evt.cards2) { - list.add(get.type2(i, evt.hs.includes(i) ? player : false)); - } - }); - event.set("dingpin_types", list); - }, - filter: function (event, player) { - var list = event.dingpin_types || []; - return ( - player.countCards("he", function (card) { - return !list.includes(get.type2(card)); - }) > 0 - ); - }, - filterCard: function (card) { - var list = _status.event.dingpin_types || []; - return !list.includes(get.type2(card)); - }, - position: "he", - filterTarget: function (card, player, target) { - return !target.hasSkill("dingpin2"); - }, - content: function () { - "step 0"; - target.judge(function (card) { - var evt = _status.event.getParent("dingpin"), - color = get.color(card); - switch (color) { - case "black": - return evt.target.getDamagedHp(); - case "red": - return get.sgn(get.attitude(evt.target, evt.player)) * -3; - } - return 0; - }).judge2 = function (result) { - if (result.color == "black") return true; - return false; - }; - "step 1"; - switch (result.color) { - case "black": - if (target.getDamagedHp() > 0) target.draw(target.getDamagedHp()); - target.addTempSkill("dingpin2"); - break; - case "red": - player.turnOver(); - break; - } - }, - ai: { - order: 9, - result: { - target: function (player, target) { - if (player.isTurnedOver()) return target.getDamagedHp(); - var card = ui.cardPile.firstChild; - if (!card) return; - if (get.color(card) == "black") return target.getDamagedHp(); - return 0; - }, - }, - }, - }, - dingpin2: { charlotte: true }, - faen: { - audio: 2, - trigger: { global: ["turnOverAfter", "linkAfter"] }, - filter: function (event, player) { - if (event.name == "link") return event.player.isLinked(); - return !event.player.isTurnedOver(); - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - logTarget: "player", - content: function () { - trigger.player.draw(); - }, - ai: { - expose: 0.2, - }, - }, - jiaojin: { - audio: 2, - trigger: { player: "damageBegin3" }, - filter: function (event, player) { - return player.countCards("he", { type: "equip" }) && event.source && event.source.hasSex("male"); - }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseToDiscard("he", "骄矜:是否弃置一张装备牌令伤害-1?", function (card, player) { - return get.type(card) == "equip"; - }); - next.set("ai", function (card) { - var player = _status.event.player; - if (player.hp == 1 || _status.event.getTrigger().num > 1) { - return 9 - get.value(card); - } - if (player.hp == 2) { - return 8 - get.value(card); - } - return 7 - get.value(card); - }); - next.logSkill = "jiaojin"; - "step 1"; - if (result.bool) { - game.delay(0.5); - trigger.num--; - } - }, - }, - chanhui: { - audio: 2, - trigger: { player: "useCardToPlayer" }, - filter: function (event, player) { - if (_status.currentPhase != player) return false; - if (player.hasSkill("chanhui2")) return false; - if (event.targets.length > 1) return false; - var card = event.card; - if (card.name == "sha") return true; - if (get.color(card) == "black" && get.type(card) == "trick") return true; - return false; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("chanhui"), function (card, player, target) { - if (player == target) return false; - var evt = _status.event.getTrigger(); - return !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player) + 0.01; - }); - "step 1"; - if (result.bool) { - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - player.addTempSkill("chanhui2"); - player.logSkill("chanhui", event.target); - event.target.chooseCard("交给" + get.translation(player) + "一张手牌,或成为" + get.translation(trigger.card) + "的额外目标").set("ai", function (card) { - return 5 - get.value(card); - }); - "step 3"; - if (result.bool) { - target.give(result.cards, player); - trigger.untrigger(); - trigger.getParent().player = event.target; - game.log(event.target, "成为了", trigger.card, "的使用者"); - } else { - game.log(event.target, "成为了", trigger.card, "的额外目标"); - trigger.getParent().targets.push(event.target); - } - }, - }, - rechanhui: { - audio: 2, - trigger: { player: "useCardToPlayer" }, - filter: function (event, player) { - if (player.hasSkill("rechanhui2")) return false; - if (event.targets.length > 1) return false; - var card = event.card; - if (card.name == "sha" || get.type(card) == "trick") return true; - return false; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("rechanhui"), function (card, player, target) { - if (player == target) return false; - var trigger = _status.event; - return player.canUse(trigger.card, target, false) && trigger.targets.includes(target) == false; - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player) + 0.01; - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - //game.delay(0,200); - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - player.logSkill("rechanhui", event.target); - event.target.chooseCard("交给" + get.translation(player) + "一张牌,或成为" + get.translation(trigger.card) + "的额外目标", "he").set("ai", function (card) { - return 5 - get.value(card); - }); - "step 3"; - if (result.bool) { - target.give(result.cards, player); - trigger.untrigger(); - trigger.getParent().player = event.target; - game.log(event.target, "成为了", trigger.card, "的使用者"); - } else { - game.log(event.target, "成为了", trigger.card, "的额外目标"); - trigger.getParent().targets.push(event.target); - player.addTempSkill("rechanhui2"); - } - }, - }, - rechanhui2: { charlotte: true }, - rejiaojin2: { charlotte: true }, - rejiaojin: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - return ( - (event.card.name == "sha" || get.type(event.card) == "trick") && - event.player != player && - player.countCards("he", function (card) { - return _status.connectMode || get.type(card) == "equip"; - }) && - !player.hasSkill("rejiaojin2") - ); - }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseToDiscard("he", "骄矜:是否弃置一张装备牌令" + get.translation(trigger.card) + "对你无效?", function (card, player) { - return get.type(card) == "equip"; - }); - next.set("ai", function (card) { - if (_status.event.goon2) { - return 3 + _status.event.val - get.value(card); - } - return 0; - }); - next.set("val", get.value(trigger.cards.filterInD())); - next.set("goon2", get.effect(player, trigger.card, trigger.player, player) < 0); - next.logSkill = ["rejiaojin", trigger.player]; - "step 1"; - if (result.bool) { - var cards = trigger.cards.filterInD(); - if (cards.length) player.gain(cards, "gain2", "log"); - trigger.excluded.push(player); - if (trigger.player.hasSex("female")) player.addTempSkill("rejiaojin2"); - } - }, - }, - chanhui2: {}, - quanji: { - audio: 2, - trigger: { player: "damageEnd" }, - frequent: true, - locked: false, - notemp: true, - filter: function (event) { - return event.num > 0; - }, - content: function () { - "step 0"; - event.count = trigger.num; - "step 1"; - event.count--; - player.draw(); - "step 2"; - if (player.countCards("h")) { - player.chooseCard("将一张手牌置于武将牌上作为“权”", true); - } else { - event.goto(4); - } - "step 3"; - if (result.cards && result.cards.length) { - player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("quanji"); - } - "step 4"; - if (event.count > 0 && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { - player.chooseBool(get.prompt2("quanji")).set("frequentSkill", event.name); - } else event.finish(); - "step 5"; - if (result.bool) { - player.logSkill("quanji"); - event.goto(1); - } - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - mod: { - maxHandcard: function (player, num) { - return num + player.getExpansions("quanji").length; - }, - }, - ai: { - maixie: true, - maixie_hp: true, - threaten: 0.8, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; - if (!target.hasSkill("paiyi") && target.hp > 1) return [0.5, get.tag(card, "damage") * 1.5]; - if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5]; - if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; - } - }, - }, - }, - }, - zili: { - skillAnimation: true, - animationColor: "thunder", - audio: 2, - audioname: ["re_zhonghui"], - unique: true, - juexingji: true, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - derivation: "paiyi", - filter: function (event, player) { - return !player.hasSkill("paiyi") && player.getExpansions("quanji").length >= 3; - }, - content: function () { - "step 0"; - player.awakenSkill("zili"); - player.chooseDrawRecover(2, true, function (event, player) { - if (player.hp == 1 && player.isDamaged()) return "recover_hp"; - return "draw_card"; - }); - "step 1"; - player.loseMaxHp(); - player.addSkills("paiyi"); - }, - ai: { - combo: "quanji", - }, - }, - paiyi: { - enable: "phaseUse", - usable: 1, - audio: 2, - audioname: ["re_zhonghui"], - filter: function (event, player) { - return player.getExpansions("quanji").length > 0; - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog("排异", player.getExpansions("quanji"), "hidden"); - }, - backup: function (links, player) { - return { - audio: "paiyi", - audioname: ["re_zhonghui"], - filterTarget: true, - filterCard: function () { - return false; - }, - selectCard: -1, - card: links[0], - delay: false, - content: lib.skill.paiyi.contentx, - ai: { - order: 10, - result: { - target: function (player, target) { - if (player != target) return 0; - if (player.hasSkill("requanji") || player.countCards("h") + 2 <= player.hp + player.getExpansions("quanji").length) return 1; - return 0; - }, - }, - }, - }; - }, - prompt: function () { - return "请选择〖排异〗的目标"; - }, - }, - contentx: function () { - "step 0"; - var card = lib.skill.paiyi_backup.card; - player.loseToDiscardpile(card); - "step 1"; - target.draw(2); - "step 2"; - if (target.countCards("h") > player.countCards("h")) { - target.damage(); - } - }, - ai: { - order: 1, - combo: "quanji", - result: { - player: 1, - }, - }, - }, - xianzhou: { - skillAnimation: true, - animationColor: "gray", - audio: 2, - audioname: ["xin_caifuren"], - unique: true, - limited: true, - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("e") > 0; - }, - filterTarget: function (card, player, target) { - return player != target; - }, - mark: true, - delay: false, - content: function () { - "step 0"; - player.awakenSkill("xianzhou"); - var cards = player.getCards("e"); - player.give(cards, target); - event.num = cards.length; - game.delay(); - "step 1"; - target - .chooseTarget([1, event.num], "令" + get.translation(player) + "回复" + event.num + "点体力,或对攻击范围内的" + event.num + "名角色造成1点伤害", function (card, player, target2) { - return _status.event.player.inRange(target2); - }) - .set("ai", function (target2) { - var target = _status.event.player; - var player = _status.event.getParent().player; - if (get.attitude(target, player) > 0) { - if (player.hp + event.num <= player.maxHp || player.hp == 1) return -1; - } - return get.damageEffect(target2, target, target); - }); - "step 2"; - if (result.bool) { - target.line(result.targets, "green"); - event.targets = result.targets; - event.num2 = 0; - } else { - player.recover(event.num); - event.finish(); - } - "step 3"; - if (event.num2 < event.targets.length) { - event.targets[event.num2].damage(target); - event.num2++; - event.redo(); - } - }, - intro: { - content: "limited", - }, - ai: { - order: 1, - result: { - target: 1, - player: function (player) { - var bool = true, - players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != player && get.attitude(player, players[i]) > 2 && get.attitude(players[i], player) > 2) { - bool = false; - break; - } - } - if (bool) return -10; - if (player.hp == 1) return 1; - if (game.phaseNumber < game.players.length) return -10; - if (player.countCards("e") + player.hp <= player.maxHp) return 1; - return -10; - }, - }, - }, - }, - qieting: { - audio: 2, - trigger: { global: "phaseEnd" }, - filter: function (event, player) { - if (event.player == player || !event.player.isIn()) return false; - var history = event.player.getHistory("useCard"); - for (var i = 0; i < history.length; i++) { - if (!history[i].targets) continue; - for (var j = 0; j < history[i].targets.length; j++) { - if (history[i].targets[j] != event.player) return false; - } - } - return true; - }, - direct: true, - content: function () { - "step 0"; - var next; - if ( - trigger.player.hasCard(function (card) { - return player.canEquip(card); - }, "e") - ) { - next = player - .chooseControl("移动装备", "draw_card", "cancel2", function (event, player) { - var source = _status.event.sourcex; - var att = get.attitude(player, source); - if (source.hasSkillTag("noe")) { - if (att > 0) { - return "移动装备"; - } - } else { - if ( - att <= 0 && - source.countCards("e", function (card) { - return get.value(card, source) > 0 && get.effect(player, card, player, player) > 0; - }) - ) { - return "移动装备"; - } - } - return "draw_card"; - }) - .set("sourcex", trigger.player); - } else { - next = player.chooseControl("draw_card", "cancel2", function () { - return "draw_card"; - }); - } - next.set("prompt", get.prompt("qieting", trigger.player)); - "step 1"; - if (result.control == "移动装备") { - player.logSkill("qieting", trigger.player); - player - .choosePlayerCard(trigger.player, "e", "将一张装备牌移至你的装备区", true) - .set("filterButton", function (button) { - return _status.event.player.canEquip(button.link); - }) - .set("ai", function (button) { - return get.effect(player, button.link, player, player); - }); - } else { - if (result.control == "draw_card") { - player.logSkill("qieting"); - player.draw(); - } - event.finish(); - } - "step 2"; - if (result && result.links && result.links.length) { - game.delay(2); - trigger.player.$give(result.links[0], player, false); - player.equip(result.links[0]); - player.addExpose(0.2); - } - }, - }, - oldzhuikong: { - audio: "zhuikong", - inherit: "zhuikong", - }, - zhuikong: { - audio: 2, - trigger: { global: "phaseZhunbeiBegin" }, - check: function (event, player) { - if (get.attitude(player, event.player) < -2) { - var cards = player.getCards("h"); - if (cards.length > player.hp) return true; - for (var i = 0; i < cards.length; i++) { - var useful = get.useful(cards[i]); - if (useful < 5) return true; - if (get.number(cards[i]) > 9 && useful < 7) return true; - } - } - return false; - }, - logTarget: "player", - filter: function (event, player) { - return player.hp < player.maxHp && player.canCompare(event.player); - }, - content: function () { - "step 0"; - player.chooseToCompare(trigger.player); - "step 1"; - if (result.bool) { - if (event.name == "zhuikong") trigger.player.addTempSkill("zishou2"); - else trigger.player.skip("phaseUse"); - } else { - trigger.player.storage.zhuikong_distance = player; - trigger.player.addTempSkill("zhuikong_distance"); - } - }, - subSkill: { - distance: { - sub: true, - onremove: true, - mod: { - globalFrom: function (from, to, distance) { - if (from.storage.zhuikong_distance == to) return -Infinity; - }, - }, - }, - }, - }, - oldqiuyuan: { - audio: "qiuyuan", - inherit: "qiuyuan", - filter: function (event, player) { - return ( - event.card.name == "sha" && - game.hasPlayer(function (current) { - return current != player && !event.targets.includes(current) && current.countCards("h") > 0 && lib.filter.targetEnabled(event.card, event.player, current); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("oldqiuyuan"), function (card, player, target) { - var evt = _status.event.getTrigger(); - return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled(evt.card, evt.player, target) && target.countCards("h") > 0; - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, trigger.player, player) + 0.1; - }) - .set("targets", trigger.targets) - .set("playerx", trigger.player); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("oldqiuyuan", target); - event.target = target; - target - .chooseCard("交给" + get.translation(player) + "一张牌,若此牌不为【闪】,则也成为此杀的额外目标", true) - .set("ai", function (card) { - return -get.value(card, player, "raw"); - }) - .set("sourcex", player); - game.delay(); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - target.give(result.cards, player, "give"); - if (get.name(result.cards[0]) != "shan") { - trigger.getParent().targets.push(event.target); - trigger.getParent().triggeredTargets2.push(event.target); - game.log(event.target, "成为了额外目标"); - } - game.delay(); - } - }, - }, - qiuyuan: { - audio: 2, - trigger: { target: "useCardToTarget" }, - direct: true, - filter: function (event, player) { - return ( - event.card.name == "sha" && - game.hasPlayer(function (current) { - return current != player && !event.targets.includes(current) && lib.filter.targetEnabled(event.card, event.player, current); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("qiuyuan"), function (card, player, target) { - var evt = _status.event.getTrigger(); - return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled(evt.card, evt.player, target); - }) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, trigger.player, player) + 0.1; - }) - .set("targets", trigger.targets) - .set("playerx", trigger.player); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("qiuyuan", target); - event.target = target; - target - .chooseCard({ name: "shan" }, "交给" + get.translation(player) + "一张闪,或成为此杀的额外目标") - .set("ai", function (card) { - return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1; - }) - .set("sourcex", player); - game.delay(); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - target.give(result.cards, player); - game.delay(); - } else { - trigger.getParent().targets.push(event.target); - trigger.getParent().triggeredTargets2.push(event.target); - game.log(event.target, "成为了额外目标"); - } - }, - ai: { - expose: 0.2, - effect: { - target: function (card, player, target) { - if (card.name != "sha") return; - var players = game.filterPlayer(); - if (get.attitude(player, target) <= 0) { - for (var i = 0; i < players.length; i++) { - var target2 = players[i]; - if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, target) > 0 && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) < 0) { - if (target.hp == target.maxHp) return 0.3; - return 0.6; - } - } - } else { - for (var i = 0; i < players.length; i++) { - var target2 = players[i]; - if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) > 0) { - if (player.canUse(card, target2)) return; - if (target.hp == target.maxHp) return [0, 1]; - return [0, 0]; - } - } - } - }, - }, - }, - }, - gongji: { - enable: "phaseUse", - usable: 1, - audio: 2, - position: "he", - filterCard: true, - check: function (card) { - if (get.type(card) != "equip") return 0; - var player = _status.currentPhase; - if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { - return 11 - get.equipValue(card); - } - return 6 - get.equipValue(card); - }, - content: function () { - "step 0"; - player.addTempSkill("gongji2"); - "step 1"; - if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") { - player - .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) { - return player != target && target.countCards("he") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - if (get.attitude(player, target) < 0) { - return Math.max(0.5, get.effect(target, { name: "sha" }, player, player)); - } - return 0; - }); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.line(result.targets, "green"); - event.target = result.targets[0]; - player.discardPlayerCard(event.target, "he", true).ai = get.buttonValue; - } - }, - ai: { - order: 9, - result: { - player: 1, - }, - }, - }, - gongji2: { - mod: { - attackRangeBase: function () { - return Infinity; - }, - }, - }, - zhuiyi: { - audio: 2, - audioname: ["re_bulianshi"], - trigger: { player: "die" }, - direct: true, - skillAnimation: true, - animationColor: "wood", - forceDie: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("zhuiyi"), function (card, player, target) { - return player != target && _status.event.sourcex != target; - }) - .set("forceDie", true) - .set("ai", function (target) { - var num = get.attitude(_status.event.player, target); - if (num > 0) { - if (target.hp == 1) { - num += 2; - } - if (target.hp < target.maxHp) { - num += 2; - } - } - return num; - }) - .set("sourcex", trigger.source); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("zhuiyi", target); - player.line(target, "green"); - target.recover(); - target.draw(3); - } - }, - ai: { - expose: 0.5, - }, - }, - old_anxu: { - enable: "phaseUse", - usable: 1, - multitarget: true, - audio: "anxu", - filterTarget: function (card, player, target) { - if (player == target) return false; - var num = target.countCards("h"); - if (ui.selected.targets.length) { - return num < ui.selected.targets[0].countCards("h"); - } - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (num > players[i].countCards("h")) return true; - } - return false; - }, - selectTarget: 2, - content: function () { - "step 0"; - var gainner, giver; - if (targets[0].countCards("h") < targets[1].countCards("h")) { - gainner = targets[0]; - giver = targets[1]; - } else { - gainner = targets[1]; - giver = targets[0]; - } - gainner.gainPlayerCard(giver, true, "h", "visibleMove"); - event.gainner = gainner; - event.giver = giver; - "step 1"; - if (result.cards) { - event.bool = false; - var card = result.cards[0]; - if (get.suit(card) != "spade") event.bool = true; - } - "step 2"; - if (event.bool) { - player.draw(); - } - }, - ai: { - order: 10.5, - threaten: 2.3, - result: { - target: function (player, target) { - var num = target.countCards("h"); - var att = get.attitude(player, target); - if (ui.selected.targets.length == 0) { - if (att > 0) return -1; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - var num2 = players[i].countCards("h"); - var att2 = get.attitude(player, players[i]); - if (num2 < num) { - if (att2 > 0) return -3; - return -1; - } - } - return 0; - } else { - return 1; - } - }, - player: 1, - }, - }, - }, - anxu: { - enable: "phaseUse", - usable: 1, - multitarget: true, - audio: 2, - filterTarget: function (card, player, target) { - if (player == target) return false; - var num = target.countCards("h"); - if (ui.selected.targets.length) { - return num < ui.selected.targets[0].countCards("h"); - } - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (num > players[i].countCards("h")) return true; - } - return false; - }, - selectTarget: 2, - content: function () { - "step 0"; - var gainner, giver; - if (targets[0].countCards("h") < targets[1].countCards("h")) { - gainner = targets[0]; - giver = targets[1]; - } else { - gainner = targets[1]; - giver = targets[0]; - } - giver.chooseCard("选择一张手牌交给" + get.translation(gainner), true); - event.gainner = gainner; - event.giver = giver; - "step 1"; - var card = result.cards[0]; - event.giver.give(card, event.gainner); - "step 2"; - if (event.gainner.countCards("h") == event.giver.countCards("h")) { - player.chooseDrawRecover(true); - } - }, - ai: { - order: 10.5, - threaten: 1.6, - result: { - target: function (player, target) { - var num = target.countCards("h"); - var att = get.attitude(player, target); - if (ui.selected.targets.length == 0) { - if (att > 0) return -1; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - var num2 = players[i].countCards("h"); - var att2 = get.attitude(player, players[i]); - if (att2 >= 0 && num2 < num) return -1; - } - return 0; - } else { - return 1; - } - }, - player: 0.1, - }, - }, - }, - mingce: { - enable: "phaseUse", - usable: 1, - audio: 2, - position: "he", - filterCard: function (card) { - return get.name(card) == "sha" || get.type(card) == "equip"; - }, - filter: function (event, player) { - return player.countCards("h", "sha") > 0 || player.countCards("he", { type: "equip" }) > 0; - }, - check: function (card) { - return 8 - get.value(card); - }, - selectTarget: 2, - multitarget: true, - discard: false, - lose: false, - targetprompt: ["得到牌", "出杀目标"], - filterTarget: function (card, player, target) { - if (ui.selected.targets.length == 0) { - return player != target; - } else { - return ui.selected.targets[0].inRange(target); - } - }, - delay: false, - content: function () { - "step 0"; - player.give(cards, targets[0], "visible"); - "step 1"; - if (!lib.filter.filterTarget({ name: "sha", isCard: true }, targets[0], targets[1])) event._result = { control: "draw_card" }; - else - targets[0] - .chooseControl("draw_card", "出杀", function () { - var player = _status.event.player; - var target = _status.event.target; - if (get.effect(_status.event.target, { name: "sha" }, player, player) > 0) { - return 1; - } - return 0; - }) - .set("target", targets[1]) - .set("prompt", "对" + get.translation(targets[1]) + "使用一张杀,或摸一张牌"); - "step 2"; - if (result.control == "draw_card") { - targets[0].draw(); - } else { - targets[0].useCard({ name: "sha", isCard: true }, targets[1]); - } - }, - ai: { - result: { - player: function (player) { - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != player && get.attitude(player, players[i]) > 1 && get.attitude(players[i], player) > 1) { - return 1; - } - } - return 0; - }, - target: function (player, target) { - if (ui.selected.targets.length) { - return -0.1; - } - return 1; - }, - }, - order: 8.5, - expose: 0.2, - }, - }, - xinxuanhuo: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - direct: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("xinxuanhuo"), function (card, player, target) { - return player != target; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 0) { - if (target.countCards("h") < target.hp) att += 2; - return att - target.countCards("h") / 3; - } else { - return -1; - } - }); - "step 1"; - if (result.bool) { - trigger.changeToZero(); - player.logSkill("xinxuanhuo", result.targets); - event.target = result.targets[0]; - event.target.draw(2); - } else { - event.finish(); - } - "step 2"; - if ( - game.hasPlayer(function (current) { - return target.canUse("sha", current); - }) - ) - player - .chooseTarget("选择出杀的目标", true, function (card, player, target) { - return _status.event.target.canUse("sha", target); - }) - .set("ai", function (target) { - return get.effect(target, { name: "sha" }, _status.event.target, _status.event.player); - }) - .set("target", event.target); - "step 3"; - if (result.bool && result.targets.length) { - game.log(player, "指定的出杀目标为", result.targets); - event.target.line(result.targets); - event.target.chooseToUse("对" + get.translation(result.targets) + "使用一张杀,或令" + get.translation(player) + "获得你的两张牌", { name: "sha" }, result.targets[0], -1); - } else { - event.bool = true; - } - "step 4"; - if (event.bool || result.bool == false) { - player.gainPlayerCard("he", event.target, Math.min(2, event.target.countCards("he")), true); - } - }, - ai: { - expose: 0.2, - }, - }, - zhichi: { - audio: 2, - trigger: { player: "damageEnd" }, - audioname: ["re_chengong"], - forced: true, - filter: function (event, player) { - return _status.currentPhase != player; - }, - content: function () { - player.addTempSkill("zhichi2", ["phaseAfter", "phaseBefore"]); - }, - }, - zhichi2: { - trigger: { target: "useCardToBefore" }, - forced: true, - charlotte: true, - priority: 15, - filter: function (event, player) { - return get.type(event.card) == "trick" || event.card.name == "sha"; - }, - content: function () { - game.log(player, "发动了智迟,", trigger.card, "对", trigger.target, "失效"); - trigger.cancel(); - }, - mark: true, - intro: { - content: "杀或普通锦囊牌对你无效", - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "trick" || card.name == "sha") return "zeroplayertarget"; - }, - }, - }, - }, - zongxuan: { - audio: 2, - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - filter: function (event, player) { - if (event.type != "discard" || event.getlx === false) return; - var evt = event.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (get.position(evt.cards2[i]) == "d") { - return true; - } - } - return false; - }, - check: function (trigger, player) { - if ( - trigger.getParent(3).name != "phaseDiscard" || - !game.hasPlayer(function (current) { - return current.isDamaged() && get.recoverEffect(current, player, player) > 0; - }) - ) - return false; - var evt = trigger.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (get.position(evt.cards2[i], true) == "d" && get.type(evt.cards2[i], false) == "equip") { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var cards = []; - var evt = trigger.getl(player); - for (var i = 0; i < evt.cards2.length; i++) { - if (get.position(evt.cards2[i], true) == "d") { - cards.push(evt.cards2[i]); - } - } - var next = player.chooseToMove("纵玄:将任意张牌置于牌堆顶", true); - next.set("list", [["本次弃置的牌", cards], ["牌堆顶"]]); - next.set("filterOk", function (moved) { - return moved[1].length > 0; - }); - next.set("processAI", function (list) { - var cards = list[0][1].slice(0), - cards2 = cards.filter(function (i) { - return get.type(i, false) == "equip"; - }), - cards3; - if (cards2.length) { - cards3 = cards2.randomGet(); - } else cards3 = cards.randomGet(); - return [[], [cards3]]; - }); - "step 1"; - if (result.bool) { - var cards = result.moved[1]; - game.log(player, "将", cards, "置于了牌堆顶"); - while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); - } - }, - }, - zhiyan: { - audio: 2, - audioname: ["gexuan", "re_yufan"], - trigger: { player: "phaseJieshuBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt("zhiyan"), "令一名角色摸一张牌并展示之。若为装备牌,则其回复1点体力").set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - event.target = result.targets[0]; - player.logSkill("zhiyan", result.targets); - event.bool = false; - event.target.draw("visible"); - } else { - event.finish(); - } - "step 2"; - var card = result[0]; - if (get.type(card) == "equip") { - if (target.getCards("h").includes(card) && target.hasUseTarget(card)) { - event.target.chooseUseTarget(card, true, "nopopup"); - game.delay(); - } - event.bool = true; - } - "step 3"; - if (event.bool) target.recover(); - }, - ai: { - expose: 0.2, - threaten: 1.2, - }, - }, - miji: { - audio: 2, - audioname: ["re_wangyi"], - locked: false, - mod: { - aiOrder: function (player, card, num) { - if (num > 0 && _status.event && _status.event.type === "phase" && get.tag(card, "recover")) { - if (player.needsToDiscard()) return num / 3; - return 0; - } - }, - }, - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.hp < player.maxHp; - }, - content: function () { - "step 0"; - event.num = player.getDamagedHp(); - player.draw(event.num); - if (_status.connectMode) - game.broadcastAll(function () { - _status.noclearcountdown = true; - }); - event.given_map = {}; - event._forcing = false; - event.aicheck = (function () { - let res = { - bool: true, - cards: [], - }, - cards = player.getCards("he"), - tars = game.filterPlayer(i => player !== i); - cards.forEach(i => { - let o = get.value(i, player), - max = o, - temp, - t; - tars.forEach(tar => { - temp = get.value(i, tar); - if (temp > max) { - max = temp; - t = tar; - } - }); - if (t) res.cards.push([i, t, max - o]); - }); - if (res.cards.length < event.num) res.bool = false; - else if (res.cards.length > event.num) - res.cards - .sort((a, b) => { - return b[2] - a[2]; - }) - .slice(0, event.num); - return res; - })(); - "step 1"; - player.chooseCardTarget({ - filterCard(card) { - return get.itemtype(card) == "card" && !card.hasGaintag("miji_tag"); - }, - filterTarget: lib.filter.notMe, - selectCard: [1, event.num], - prompt: "请选择要分配的卡牌和目标", - forced: event._forcing, - ai1(card) { - if (!_status.event.res.bool || ui.selected.cards.length) return 0; - for (let arr of _status.event.res.cards) { - if (arr[0] === card) return arr[2]; - } - return 0; - }, - ai2(target) { - let card = ui.selected.cards[0]; - for (let arr of _status.event.res.cards) { - if (arr[0] === card) return get.attitude(player, target); - } - let val = target.getUseValue(card); - if (val > 0) return val * get.attitude(player, target) * 2; - return get.value(card, target) * get.attitude(player, target); - }, - res: event.aicheck, - }); - "step 2"; - if (result.bool) { - event._forcing = true; - var res = result.cards, - target = result.targets[0].playerid; - player.addGaintag(res, "miji_tag"); - event.num -= res.length; - if (!event.given_map[target]) event.given_map[target] = []; - event.given_map[target].addArray(res); - if (event.num > 0) event.goto(1); - } - "step 3"; - if (_status.connectMode) { - game.broadcastAll(function () { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - var map = [], - cards = []; - for (var i in event.given_map) { - var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, "green"); - if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.18); - map.push([source, event.given_map[i]]); - cards.addArray(event.given_map[i]); - } - game.loseAsync({ - gain_list: map, - player: player, - cards: cards, - giver: player, - animate: "giveAuto", - }).setContent("gaincardMultiple"); - }, - ai: { - threaten: function (player, target) { - return 0.6 + 0.7 * target.getDamagedHp(); - }, - effect: { - target: function (card, player, target) { - if (target.hp <= 2 && get.tag(card, "damage")) { - var num = 1; - if ( - get.itemtype(player) == "player" && - player.hasSkillTag("damageBonus", false, { - target: target, - card: card, - }) && - !target.hasSkillTag("filterDamage", null, { - player: player, - card: card, - }) - ) - num = 2; - if (target.hp > num) return [1, 1]; - } - }, - }, - }, - }, - zhenlie: { - audio: 2, - audioname: ["re_wangyi"], - filter: function (event, player) { - return event.player != player && event.card && (event.card.name == "sha" || get.type(event.card) == "trick"); - }, - logTarget: "player", - check: function (event, player) { - if (event.getParent().excluded.includes(player)) return false; - if (get.attitude(player, event.player) > 0 || (player.hp < 2 && !get.tag(event.card, "damage"))) return false; - let evt = event.getParent(), - directHit = (evt.nowuxie && get.type(event.card, "trick") === "trick") || (evt.directHit && evt.directHit.includes(player)) || (evt.customArgs && evt.customArgs.default && evt.customArgs.default.directHit2); - if (get.tag(event.card, "respondSha")) { - if (directHit || player.countCards("h", { name: "sha" }) === 0) return true; - } else if (get.tag(event.card, "respondShan")) { - if (directHit || player.countCards("h", { name: "shan" }) === 0) return true; - } else if (get.tag(event.card, "damage")) { - if (event.card.name === "huogong") return event.player.countCards("h") > 4 - player.hp - player.hujia; - if (event.card.name === "shuiyanqijunx") return player.countCards("e") === 0; - return true; - } else if (player.hp > 2) { - if (event.card.name === "shunshou" || (event.card.name === "zhujinqiyuan" && (event.card.yingbian || get.distance(event.player, player) < 0))) return true; - } - return false; - }, - trigger: { target: "useCardToTargeted" }, - content: function () { - "step 0"; - if (get.attitude(player, trigger.player) < 0 && trigger.player.countDiscardableCards(player, "he")) player.addTempSkill("zhenlie_lose"); - player.loseHp(); - "step 1"; - player.removeSkill("zhenlie_lose"); - trigger.getParent().excluded.add(player); - "step 2"; - if (trigger.player.countCards("he")) { - if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.12); - player.discardPlayerCard(trigger.player, "he", true); - } - }, - subSkill: { - lose: { - charlotte: true, - }, - }, - ai: { - filterDamage: true, - skillTagFilter: (player, tag, arg) => { - return arg && arg.jiu == true; - }, - effect: { - target: (card, player, target) => { - if (target.hp <= 0 && target.hasSkill("zhenlie_lose") && get.tag(card, "recover")) return [1, 1.2]; - }, - }, - }, - }, - //吾彦... - wuyan: { audio: 2 }, - xswuyan: { - audio: "wuyan", - trigger: { target: "useCardToBefore", player: "useCardToBefore" }, - forced: true, - check: function (event, player) { - return get.effect(event.target, event.card, event.player, player) < 0; - }, - filter: function (event, player) { - if (!event.target) return false; - if (event.player == player && event.target == player) return false; - return get.type(event.card) == "trick"; - }, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "trick" && player != target) return "zeroplayertarget"; - }, - player: function (card, player, target, current) { - if (get.type(card) == "trick" && player != target) return "zeroplayertarget"; - }, - }, - }, - }, - xinwuyan: { - audio: 2, - trigger: { source: "damageBegin2", player: "damageBegin4" }, - forced: true, - check: function (event, player) { - if (player == event.player) return true; - return false; - }, - filter: function (event, player) { - return get.type(event.card, "trick") == "trick"; - }, - content: function () { - trigger.cancel(); - }, - ai: { - notrick: true, - notricksource: true, - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "trick" && get.tag(card, "damage")) { - return "zeroplayertarget"; - } - }, - player: function (card, player, target, current) { - if (get.type(card) == "trick" && get.tag(card, "damage")) { - return "zeroplayertarget"; - } - }, - }, - }, - }, - xinjujian: { - trigger: { player: "phaseJieshuBegin" }, - direct: true, - audio: 2, - filter: function (event, player) { - return player.countCards("he") > player.countCards("he", { type: "basic" }); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - filterTarget: function (card, player, target) { - return player != target; - }, - filterCard: function (card, player) { - return get.type(card) != "basic" && lib.filter.cardDiscardable(card, player); - }, - ai1: function (card) { - if (get.tag(card, "damage") && get.type(card) == "trick") { - return 20; - } - return 9 - get.value(card); - }, - ai2: function (target) { - var att = get.attitude(_status.event.player, target); - if (att > 0) { - if (target.isTurnedOver()) att += 3; - if (target.hp == 1) att += 3; - } - return att; - }, - position: "he", - prompt: get.prompt2("xinjujian"), - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("xinjujian", target); - player.discard(result.cards); - if (target.hp == target.maxHp && !target.isTurnedOver() && !target.isLinked()) { - target.draw(2); - event.finish(); - } else { - var controls = ["draw_card"]; - if (target.hp < target.maxHp) { - controls.push("recover_hp"); - } - if (target.isLinked() | target.isTurnedOver()) { - controls.push("reset_character"); - } - target.chooseControl(controls).ai = function () { - if (target.isTurnedOver()) { - return "reset_character"; - } else if (target.hp == 1 && target.maxHp > 2) { - return "recover_hp"; - } else if (target.hp == 2 && target.maxHp > 2 && target.countCards("h") > 1) { - return "recover_hp"; - } else { - return "draw_card"; - } - }; - } - } else { - event.finish(); - } - "step 2"; - event.control = result.control; - switch (event.control) { - case "recover_hp": - event.target.recover(); - event.finish(); - break; - case "draw_card": - event.target.draw(2); - event.finish(); - break; - case "reset_character": - if (event.target.isTurnedOver()) event.target.turnOver(); - break; - } - "step 3"; - if (event.control == "reset_character" && event.target.isLinked()) { - event.target.link(); - } - }, - ai: { - expose: 0.2, - threaten: 1.4, - }, - }, - jujian: { - enable: "phaseUse", - usable: 1, - audio: 2, - filterCard: true, - position: "he", - selectCard: [1, 3], - check: function (card) { - var player = get.owner(card); - if (get.type(card) == "trick") return 10; - if (player.countCards("h") - player.hp - ui.selected.cards.length > 0) { - return 8 - get.value(card); - } - return 4 - get.value(card); - }, - filterTarget: function (card, player, target) { - return player != target; - }, - content: function () { - target.draw(cards.length); - if (cards.length == 3) { - if (get.type(cards[0], "trick") == get.type(cards[1], "trick") && get.type(cards[0], "trick") == get.type(cards[2], "trick")) { - player.recover(); - } - } - }, - ai: { - expose: 0.2, - order: 1, - result: { - target: 1, - }, - }, - }, - yizhong: { - trigger: { target: "shaBefore" }, - forced: true, - audio: 2, - filter: function (event, player) { - if (!player.hasEmptySlot(2)) return false; - return event.card.name == "sha" && get.color(event.card) == "black"; - }, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target) { - if (player == target && get.subtypes(card).includes("equip2")) { - if (get.equipValue(card) <= 8) return 0; - } - if (!player.hasEmptySlot(2)) return; - if (card.name == "sha" && get.color(card) == "black") return "zerotarget"; - }, - }, - }, - }, - jueqing: { - trigger: { source: "damageBefore" }, - forced: true, - audio: 2, - //priority:16, - check: function () { - return false; - }, - content: function () { - trigger.cancel(); - trigger.player.loseHp(trigger.num); - }, - ai: { - jueqing: true, - }, - }, - shangshi: { - audio: 2, - trigger: { - player: ["loseAfter", "changeHp", "gainMaxHpAfter", "loseMaxHpAfter"], - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - frequent: true, - filter: function (event, player) { - if (event.getl && !event.getl(player)) return false; - return player.countCards("h") < player.getDamagedHp(); - }, - content: function () { - player.draw(player.getDamagedHp() - player.countCards("h")); - }, - ai: { - noh: true, - skillTagFilter: function (player, tag) { - if (tag == "noh" && player.maxHp - player.hp < player.countCards("h")) { - return false; - } - }, - }, - }, - luoying: { - //unique:true, - //gainable:true, - group: ["luoying_discard", "luoying_judge"], - subfrequent: ["judge"], - subSkill: { - discard: { - audio: 2, - trigger: { global: "loseAfter" }, - filter: function (event, player) { - if (event.type != "discard" || event.getlx === false) return false; - var cards = event.cards.slice(0); - var evt = event.getl(player); - if (evt && evt.cards) cards.removeArray(evt.cards); - for (var i = 0; i < cards.length; i++) { - if (cards[i].original != "j" && get.suit(cards[i], event.player) == "club" && get.position(cards[i], true) == "d") { - return true; - } - } - return false; - }, - direct: true, - content: function () { - "step 0"; - if (trigger.delay == false) game.delay(); - "step 1"; - var cards = [], - cards2 = trigger.cards.slice(0), - evt = trigger.getl(player); - if (evt && evt.cards) cards2.removeArray(evt.cards); - for (var i = 0; i < cards2.length; i++) { - if (cards2[i].original != "j" && get.suit(cards2[i], trigger.player) == "club" && get.position(cards2[i], true) == "d") { - cards.push(cards2[i]); - } - } - if (cards.length) { - player.chooseButton(["落英:选择要获得的牌", cards], [1, cards.length]).set("ai", function (button) { - return get.value(button.link, _status.event.player, "raw"); - }); - } - "step 2"; - if (result.bool) { - player.logSkill(event.name); - player.gain(result.links, "gain2", "log"); - } - }, - }, - judge: { - audio: 2, - trigger: { global: "cardsDiscardAfter" }, - //frequent:'check', - direct: true, - filter: function (event, player) { - var evt = event.getParent().relatedEvent; - if (!evt || evt.name != "judge") return; - if (evt.player == player) return false; - if (get.position(event.cards[0], true) != "d") return false; - return get.suit(event.cards[0]) == "club"; - }, - content: function () { - "step 0"; - player.chooseButton(["落英:选择要获得的牌", trigger.cards], [1, trigger.cards.length]).set("ai", function (button) { - return get.value(button.link, _status.event.player, "raw"); - }); - "step 1"; - if (result.bool) { - player.logSkill(event.name); - player.gain(result.links, "gain2", "log"); - } - }, - }, - }, - }, - jiushi: { - audio: "jiushi1", - group: ["jiushi1", "jiushi2", "jiushi3"], - }, - jiushi1: { - audio: 2, - enable: "chooseToUse", - hiddenCard: function (player, name) { - if (name == "jiu") return !player.isTurnedOver(); - return false; - }, - filter: function (event, player) { - if (player.classList.contains("turnedover")) return false; - return event.filterCard({ name: "jiu", isCard: true }, player, event); - }, - content: function () { - if (_status.event.getParent(2).type == "dying") { - event.dying = player; - event.type = "dying"; - } - player.turnOver(); - player.useCard({ name: "jiu", isCard: true }, player); - }, - ai: { - order: 5, - result: { - player: function (player) { - if (_status.event.parent.name == "phaseUse") { - if (player.countCards("h", "jiu") > 0) return 0; - if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1) return 0; - if (!player.countCards("h", "sha")) return 0; - var targets = []; - var target; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (get.attitude(player, players[i]) < 0) { - if (player.canUse("sha", players[i], true, true)) { - targets.push(players[i]); - } - } - } - if (targets.length) { - target = targets[0]; - } else { - return 0; - } - var num = get.effect(target, { name: "sha" }, player, player); - for (var i = 1; i < targets.length; i++) { - var num2 = get.effect(targets[i], { name: "sha" }, player, player); - if (num2 > num) { - target = targets[i]; - num = num2; - } - } - if (num <= 0) return 0; - var e2 = target.getEquip(2); - if (e2) { - if (e2.name == "tengjia") { - if (!player.countCards("h", { name: "sha", nature: "fire" }) && !player.getEquip("zhuque")) return 0; - } - if (e2.name == "renwang") { - if (!player.countCards("h", { name: "sha", color: "red" })) return 0; - } - if (e2.name == "baiyin") return 0; - } - if (player.getEquip("guanshi") && player.countCards("he") > 2) return 1; - return target.countCards("h") > 3 ? 0 : 1; - } - if (player == _status.event.dying || player.isTurnedOver()) return 3; - }, - }, - effect: { - target: function (card, player, target) { - if (card.name == "guiyoujie") return [0, 0.5]; - if (target.isTurnedOver()) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (target.hp == 1) return; - return [1, target.countCards("h") / 2]; - } - } - }, - }, - }, - }, - jiushi2: { - trigger: { player: "damageBegin3" }, - silent: true, - firstDo: true, - filter: function (event, player) { - return player.classList.contains("turnedover"); - }, - content: function () { - trigger.jiushi = true; - }, - }, - jiushi3: { - audio: "jiushi1", - trigger: { player: "damageEnd" }, - check: function (event, player) { - return player.isTurnedOver(); - }, - prompt: "是否发动【酒诗】,将武将牌翻面?", - filter: function (event, player) { - if (event.jiushi) { - return true; - } - return false; - }, - content: function () { - delete trigger.jiushi; - player.turnOver(); - }, - }, - zongshi: { - audio: 2, - mod: { - maxHandcard: function (player, num) { - return num + game.countGroup(); - }, - }, - }, - zishou: { - audio: 2, - audioname: ["re_liubiao"], - trigger: { player: "phaseDrawBegin2" }, - check: function (event, player) { - return player.countCards("h") <= (player.hasSkill("zongshi") ? player.maxHp : player.hp - 2) || player.skipList.includes("phaseUse"); - }, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - trigger.num += game.countGroup(); - player.addTempSkill("zishou2"); - }, - ai: { - threaten: 1.5, - }, - }, - zishou2: { - mod: { - playerEnabled: function (card, player, target) { - if (player != target) return false; - }, - }, - }, - olddanshou: { - audio: "danshou", - trigger: { source: "damageSource" }, - //priority:9, - check: function (event, player) { - return get.attitude(player, event.player) <= 0; - }, - content: function () { - "step 0"; - player.draw(); - var cards = Array.from(ui.ordering.childNodes); - while (cards.length) { - cards.shift().discard(); - } - "step 1"; - var evt = _status.event.getParent("phase"); - if (evt) { - game.resetSkills(); - _status.event = evt; - _status.event.finish(); - _status.event.untrigger(true); - } - }, - ai: { - jueqing: true, - }, - }, - danshou: { - enable: "phaseUse", - filterCard: true, - position: "he", - audio: 2, - filter: function (event, player) { - var num = player.getStat().skill.danshou; - if (num) { - num++; - } else { - num = 1; - } - return player.countCards("he") >= num; - }, - check: function (card) { - if (ui.selected.cards.length >= 2) { - return 4 - get.value(card); - } - return 6 - get.value(card); - }, - selectCard: function (card) { - var num = _status.event.player.getStat().skill.danshou; - if (num) return num + 1; - return 1; - }, - filterTarget: function (card, player, target) { - if (player == target) return false; - var num = player.getStat().skill.danshou; - if (num) { - num++; - } else { - num = 1; - } - if (num <= 2 && !target.countCards("he")) return false; - return player.inRange(target); - }, - content: function () { - "step 0"; - var num = player.getStat().skill.danshou; - switch (num) { - case 1: - player.discardPlayerCard(target, true); - break; - case 2: - target.chooseCard("选择一张牌交给" + get.translation(player), "he", true); - break; - case 3: - target.damage("nocard"); - break; - default: - game.asyncDraw([player, target], 2); - } - if (num != 2) event.finish(); - "step 1"; - if (result.cards) { - target.give(result.cards, player); - } - }, - ai: { - order: 8.6, - result: { - target: function (player, target) { - var num = player.getStat().skill.danshou; - if (num) { - num++; - } else { - num = 1; - } - if (num > 3) return 0; - if (num == 3) return get.damageEffect(target, player, target); - return -1; - }, - }, - }, - }, - qice: { - audio: 2, - audioname: ["clan_xunyou"], - enable: "phaseUse", - filter: function (event, player) { - const hs = player.getCards("h"); - if (!hs.length) return false; - if ( - hs.some(card => { - const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - return mod2 === false; - }) - ) - return false; - return lib.inpile.some(name => { - if (get.type(name) != "trick") return false; - const card = get.autoViewAs({ name }, hs); - return event.filterCard(card, player, event); - }); - }, - usable: 1, - chooseButton: { - dialog: function (player) { - var list = []; - for (var i = 0; i < lib.inpile.length; i++) { - if (get.type(lib.inpile[i]) == "trick") list.push(["锦囊", "", lib.inpile[i]]); - } - return ui.create.dialog(get.translation("qice"), [list, "vcard"]); - }, - filter: function (button, player) { - const event = _status.event.getParent(), - card = get.autoViewAs( - { - name: button.link[2], - }, - player.getCards("h") - ); - return event.filterCard(card, player, event); - }, - check: function (button) { - var player = _status.event.player; - var recover = 0, - lose = 1, - players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i].hp == 1 && get.damageEffect(players[i], player, player) > 0 && !players[i].hasSha()) { - return button.link[2] == "juedou" ? 2 : -1; - } - if (!players[i].isOut()) { - if (players[i].hp < players[i].maxHp) { - if (get.attitude(player, players[i]) > 0) { - if (players[i].hp < 2) { - lose--; - recover += 0.5; - } - lose--; - recover++; - } else if (get.attitude(player, players[i]) < 0) { - if (players[i].hp < 2) { - lose++; - recover -= 0.5; - } - lose++; - recover--; - } - } else { - if (get.attitude(player, players[i]) > 0) { - lose--; - } else if (get.attitude(player, players[i]) < 0) { - lose++; - } - } - } - } - if (lose > recover && lose > 0) return button.link[2] == "nanman" ? 1 : -1; - if (lose < recover && recover > 0) return button.link[2] == "taoyuan" ? 1 : -1; - return button.link[2] == "wuzhong" ? 1 : -1; - }, - backup: function (links, player) { - return { - audio: "qice", - audioname: ["clan_xunyou"], - filterCard: true, - selectCard: -1, - position: "h", - popname: true, - viewAs: { name: links[0][2] }, - }; - }, - prompt: function (links, player) { - return "将全部手牌当作" + get.translation(links[0][2]) + "使用"; - }, - }, - ai: { - order: 1, - result: { - player: function (player) { - var num = 0; - var cards = player.getCards("h"); - if (cards.length >= 3 && player.hp >= 3) return 0; - for (var i = 0; i < cards.length; i++) { - num += Math.max(0, get.value(cards[i], player, "raw")); - } - num /= cards.length; - num *= Math.min(cards.length, player.hp); - return 12 - num; - }, - }, - nokeep: true, - skillTagFilter: function (player, tag, arg) { - if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && !player.getStat("skill").qice && player.hasCard(card => get.name(card) != "tao", "h"); - }, - threaten: 1.6, - }, - }, - zhiyu: { - audio: 2, - trigger: { player: "damageEnd" }, - preHidden: true, - content: function () { - "step 0"; - player.draw(); - "step 1"; - if (!player.countCards("h")) event.finish(); - else player.showHandcards(); - "step 2"; - if (!trigger.source) return; - var cards = player.getCards("h"); - var color = get.color(cards[0], player); - for (var i = 1; i < cards.length; i++) { - if (get.color(cards[i], player) != color) return; - } - trigger.source.chooseToDiscard(true); - }, - ai: { - maixie_defend: true, - threaten: 0.9, - }, - }, - xuanfeng: { - audio: 2, - audioname: ["boss_lvbu3", "re_heqi"], - trigger: { - player: ["loseAfter", "phaseDiscardEnd"], - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - direct: true, - filter: function (event, player) { - if (event.name == "phaseDiscard") { - var cards = []; - player.getHistory("lose", function (evt) { - if (evt && evt.type == "discard" && evt.getParent("phaseDiscard") == event && evt.hs) cards.addArray(evt.hs); - }); - return cards.length > 1; - } else { - var evt = event.getl(player); - return evt && evt.es && evt.es.length > 0; - } - }, - content: function () { - "step 0"; - event.count = 2; - event.logged = false; - "step 1"; - player - .chooseTarget(get.prompt("xuanfeng"), "弃置一名其他角色的一张牌", function (card, player, target) { - if (player == target) return false; - return target.countDiscardableCards(player, "he"); - }) - .set("ai", function (target) { - return -get.attitude(_status.event.player, target); - }); - "step 2"; - if (result.bool) { - if (!event.logged) { - player.logSkill("xuanfeng", result.targets); - event.logged = true; - } else player.line(result.targets[0], "green"); - player.discardPlayerCard(result.targets[0], "he", true); - event.count--; - } else event.finish(); - "step 3"; - if (event.count) event.goto(1); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; - }, - }, - reverseEquip: true, - noe: true, - }, - }, - jiangchi: { - audio: 2, - trigger: { player: "phaseDrawBegin2" }, - direct: true, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - "step 0"; - player.chooseControl("jiangchi_less", "jiangchi_more", "cancel2", function () { - var player = _status.event.player; - if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) { - return "jiangchi_less"; - } - if (player.countCards("h", "sha") > 2) { - return "jiangchi_less"; - } - if (player.hp - player.countCards("h") > 1) { - return "jiangchi_more"; - } - return "cancel2"; - }); - "step 1"; - if (result.control == "jiangchi_less") { - trigger.num--; - player.addTempSkill("jiangchi2", "phaseUseEnd"); - player.logSkill("jiangchi"); - } else if (result.control == "jiangchi_more") { - trigger.num++; - player.addTempSkill("jiangchi3", "phaseUseEnd"); - player.logSkill("jiangchi"); - } - }, - }, - jiangchi2: { - mod: { - targetInRange: function (card, player, target, now) { - if (card.name == "sha") return true; - }, - cardUsable: function (card, player, num) { - if (card.name == "sha") return num + 1; - }, - }, - }, - jiangchi3: { - mod: { - cardEnabled: function (card) { - if (card.name == "sha") return false; - }, - }, - }, - xinzhan: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return player.countCards("h") > player.maxHp; - }, - usable: 1, - content: function () { - "step 0"; - var cards = get.cards(3); - event.cards = cards; - var next = player.chooseCardButton(cards, "选择获得的红桃牌", [1, Infinity]).set("filterButton", function (button) { - return get.suit(button.link) == "heart"; - }); - "step 1"; - if (result.bool) { - player.gain(result.links, "draw"); - } - for (var i = event.cards.length - 1; i >= 0; i--) { - if (!result.bool || !result.links.includes(event.cards[i])) { - ui.cardPile.insertBefore(event.cards[i], ui.cardPile.firstChild); - } - } - }, - ai: { - order: 11, - result: { - player: 1, - }, - }, - }, - huilei: { - audio: 2, - trigger: { player: "die" }, - forced: true, - forceDie: true, - filter: function (event) { - return event.source && event.source.isIn(); - }, - logTarget: "source", - skillAnimation: true, - animationColor: "thunder", - content: function () { - trigger.source.discard(trigger.source.getCards("he")); - }, - ai: { - threaten: 0.7, - }, - }, - xinenyuan: { - audio: 2, - group: ["xinenyuan1", "xinenyuan2"], - }, - xinenyuan1: { - audio: true, - trigger: { player: "gainEnd" }, - filter: function (event, player) { - return event.source && event.source.isIn() && event.source != player && event.cards.length >= 2; - }, - logTarget: "source", - check: function (event, player) { - return get.attitude(player, event.source) > 0; - }, - prompt2: function (event, player) { - return "令" + get.translation(event.source) + "摸一张牌"; - }, - content: function () { - trigger.source.draw(); - }, - }, - xinenyuan2: { - audio: true, - trigger: { player: "damageEnd" }, - check: function (event, player) { - var att = get.attitude(player, event.source); - var num = event.source.countCards("h"); - if (att <= 0) return true; - if (num > 2) return true; - if (num) return att < 4; - return false; - }, - filter: function (event, player) { - return event.source && event.source != player && event.num > 0 && event.source.isIn(); - }, - logTarget: "source", - prompt2: function (event, player) { - return "令" + get.translation(event.source) + "交给你一张手牌或失去1点体力"; - }, - content: function () { - "step 0"; - event.num = trigger.num; - "step 1"; - trigger.source.chooseCard("选择一张手牌交给" + get.translation(player) + ",或点“取消”失去1点体力").set("ai", function (card) { - var player = _status.event.getParent().player, - source = _status.event.player; - if (get.effect(source, { name: "losehp" }, source, source) >= 0) return 0; - if (get.attitude(player, source) > 0) return 11 - get.value(card); - return 7 - get.value(card); - }); - "step 2"; - if (result.bool) { - trigger.source.give(result.cards, player); - } else { - trigger.source.loseHp(); - } - if (event.num > 1 && player.hasSkill("xinenyuan") && trigger.source && trigger.source.isIn()) { - player.logSkill("xinenyuan", trigger.source); - event.num--; - event.goto(1); - } - }, - ai: { - maixie_defend: true, - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; - if (!target.hasFriend()) return; - if (get.tag(card, "damage")) return [1, 0, 0, -0.7]; - }, - }, - }, - }, - enyuan: { - audio: 2, - locked: true, - group: ["enyuan1", "enyuan2"], - }, - enyuan1: { - audio: true, - trigger: { player: "damageEnd" }, - forced: true, - filter: function (event, player) { - return event.source && event.source != player && event.source.isIn(); - }, - logTarget: "source", - content: function () { - "step 0"; - trigger.source - .chooseCard("选择一张红桃牌交给" + get.translation(player) + ",或点“取消”失去1点体力", function (card) { - return get.suit(card) == "heart"; - }) - .set("ai", function (card) { - var player = _status.event.getParent().player, - source = _status.event.player; - if (get.effect(source, { name: "losehp" }, source, source) >= 0) return 0; - if (get.attitude(player, source) > 0) return 11 - get.value(card); - return 7 - get.value(card); - }); - "step 1"; - if (result.bool) { - trigger.source.give(result.cards, player); - } else { - trigger.source.loseHp(); - } - }, - ai: { - maixie_defend: true, - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - if (get.tag(card, "damage")) return [1, 0, 0, -1]; - }, - }, - }, - }, - enyuan2: { - audio: true, - trigger: { player: "recoverEnd" }, - forced: true, - logTarget: "source", - filter: function (event, player) { - return event.source && event.source != player && event.source.isIn(); - }, - content: function () { - "step 0"; - event.num = trigger.num; - "step 1"; - if (event.num > 0) { - player.logSkill("enyuan1", trigger.source); - trigger.source.draw(); - event.num--; - event.redo(); - } - }, - }, - xuanhuo: { - audio: 2, - enable: "phaseUse", - usable: 1, - discard: false, - lose: false, - delay: 0, - filter: function (event, player) { - return player.countCards("he", { suit: "heart" }); - }, - filterCard: function (card) { - return get.suit(card) == "heart"; - }, - filterTarget: function (card, player, target) { - if (game.countPlayer() == 2) return false; - return player != target; - }, - check: function (card) { - var player = get.owner(card); - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i] != player && get.attitude(player, players[i]) > 3) break; - } - if (i == players.length) return -1; - return 5 - get.value(card); - }, - content: function () { - "step 0"; - player.give(cards, target); - // game.delay(); - "step 1"; - player.gainPlayerCard(target, "he", true); - "step 2"; - var source = target; - event.card = result.links[0]; - if (player.getCards("h").includes(event.card)) - player - .chooseTarget("将" + get.translation(event.card) + "交给另一名其他角色", function (card, player, target) { - return target != _status.event.sourcex && target != player; - }) - .set("ai", function (target) { - return get.attitude(_status.event.player, target); - }) - .set("sourcex", target); - else event.finish(); - "step 3"; - if (result.bool) { - player.give(card, result.targets[0], "give"); - game.delay(); - } - }, - ai: { - result: { - target: -0.5, - }, - basic: { - order: 9, - }, - }, - }, - ganlu: { - enable: "phaseUse", - usable: 1, - audio: 2, - selectTarget: 2, - filterTarget: function (card, player, target) { - if (target.isMin()) return false; - if (ui.selected.targets.length == 0) return true; - if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0) return false; - return Math.abs(ui.selected.targets[0].countCards("e") - target.countCards("e")) <= player.maxHp - player.hp; - }, - multitarget: true, - content: function () { - targets[0].swapEquip(targets[1]); - }, - ai: { - order: 10, - threaten: function (player, target) { - return 0.8 * Math.max(1 + target.maxHp - target.hp); - }, - result: { - target: function (player, target) { - var list1 = []; - var list2 = []; - var num = player.maxHp - player.hp; - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (get.attitude(player, players[i]) > 0) list1.push(players[i]); - else if (get.attitude(player, players[i]) < 0) list2.push(players[i]); - } - list1.sort(function (a, b) { - return a.countCards("e") - b.countCards("e"); - }); - list2.sort(function (a, b) { - return b.countCards("e") - a.countCards("e"); - }); - var delta; - for (var i = 0; i < list1.length; i++) { - for (var j = 0; j < list2.length; j++) { - delta = list2[j].countCards("e") - list1[i].countCards("e"); - if (delta <= 0) continue; - if (delta <= num) { - if (target == list1[i] || target == list2[j]) { - return get.attitude(player, target); - } - return 0; - } - } - } - return 0; - }, - }, - effect: { - target: function (card, player, target) { - if (target.hp == target.maxHp && get.tag(card, "damage")) return 0.2; - }, - }, - }, - }, - buyi: { - trigger: { global: "dying" }, - //priority:6, - audio: 2, - audioname: ["re_wuguotai"], - filter: function (event, player) { - return event.player.hp <= 0 && event.player.countCards("h") > 0; - }, - direct: true, - content: function () { - "step 0"; - var check; - if (trigger.player.isUnderControl(true, player)) { - check = player.hasCard(function (card) { - return get.type(card) != "basic"; - }); - } else { - check = get.attitude(player, trigger.player) > 0; - } - player - .choosePlayerCard(trigger.player, get.prompt("buyi", trigger.player), "h") - .set("ai", function (button) { - if (!_status.event.check) return 0; - if (_status.event.target.isUnderControl(true, _status.event.player)) { - if (get.type(button.link) != "basic") { - return 10 - get.value(button.link); - } - return 0; - } else { - return Math.random(); - } - }) - .set("check", check) - .set("filterButton", function (button) { - if (_status.event.player == _status.event.target) { - return lib.filter.cardDiscardable(button.link, _status.event.player); - } - return true; - }); - "step 1"; - if (result.bool) { - player.logSkill("buyi", trigger.player); - event.card = result.links[0]; - player.showCards([event.card], get.translation(player) + "展示的手牌"); - } else { - event.finish(); - } - "step 2"; - if (get.type(event.card) != "basic") { - trigger.player.recover(); - trigger.player.discard(event.card); - } - }, - ai: { - threaten: 1.4, - }, - }, - pojun: { - audio: 2, - trigger: { source: "damageSource" }, - check: function (event, player) { - if (event.player.isTurnedOver()) return get.attitude(player, event.player) > 0; - if (event.player.hp < 3) { - return get.attitude(player, event.player) < 0; - } - return get.attitude(player, event.player) > 0; - }, - filter: function (event) { - if (event._notrigger.includes(event.player)) return false; - return event.card && event.card.name == "sha" && event.player.isIn(); - }, - logTarget: "player", - content: function () { - "step 0"; - trigger.player.draw(Math.min(5, trigger.player.hp)); - "step 1"; - trigger.player.turnOver(); - }, - }, - jingce: { - trigger: { player: "phaseUseEnd" }, - frequent: true, - filter: function (event, player) { - return player.countUsed(null, true) >= player.hp; - }, - content: function () { - player.draw(2); - }, - audio: 2, - }, - xinjingce: { - trigger: { player: "phaseJieshuBegin" }, - frequent: true, - filter: function (event, player) { - return player.countUsed(null, true) >= player.hp; - }, - content: function () { - player.draw(2); - }, - audio: 2, - }, - oldchengxiang: { - audio: "chengxiang", - inherit: "chengxiang", - }, - chengxiang: { - trigger: { player: "damageEnd" }, - //direct:true, - frequent: true, - audio: 2, - content: function () { - "step 0"; - event.cards = get.cards(4); - game.cardsGotoOrdering(event.cards); - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (player, id, cards, num) { - var str; - if (player == game.me && !_status.auto) { - str = "称象:选择任意张点数不大于" + num + "的牌"; - } else { - str = "称象"; - } - var dialog = ui.create.dialog(str, cards); - dialog.videoId = id; - }, - player, - event.videoId, - event.cards, - event.name == "oldchengxiang" ? 12 : 13 - ); - event.time = get.utc(); - game.addVideo("showCards", player, ["称象", get.cardsInfo(event.cards)]); - game.addVideo("delay", null, 2); - "step 1"; - var next = player.chooseButton([0, 4]); - next.set("dialog", event.videoId); - next.set("filterButton", function (button) { - var num = 0; - for (var i = 0; i < ui.selected.buttons.length; i++) { - num += get.number(ui.selected.buttons[i].link); - } - return num + get.number(button.link) <= _status.event.maxNum; - }); - next.set("maxNum", event.name == "oldchengxiang" ? 12 : 13); - next.set("ai", function (button) { - let player = _status.event.player, - name = get.name(button.link), - val = get.value(button.link, player); - if (name === "tao") return val + 2 * Math.min(3, 1 + player.getDamagedHp()); - if (name === "jiu" && player.hp < 3) return val + 2 * (2.8 - player.hp); - if (name === "wuxie" && player.countCards("j") && !player.hasWuxie()) return val + 5; - if (player.hp > 1 && player.hasSkill("renxin") && player.hasFriend() && get.type(button.link) === "equip") return val + 4; - return val; - }); - "step 2"; - if (result.bool && result.links) { - //player.logSkill('chengxiang'); - var cards2 = []; - for (var i = 0; i < result.links.length; i++) { - cards2.push(result.links[i]); - cards.remove(result.links[i]); - } - event.cards2 = cards2; - } else { - event.finish(); - } - var time = 1000 - (get.utc() - event.time); - if (time > 0) { - game.delay(0, time); - } - "step 3"; - game.broadcastAll("closeDialog", event.videoId); - var cards2 = event.cards2; - player.gain(cards2, "log", "gain2"); - }, - ai: { - maixie: true, - maixie_hp: true, - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage")) { - if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; - if (!target.hasFriend()) return; - if (target.hp >= 4) return [1, 2]; - if (target.hp == 3) return [1, 1.5]; - if (target.hp == 2) return [1, 0.5]; - } - }, - }, - }, - }, - oldrenxin: { - audio: "renxin", - trigger: { global: "dying" }, - //priority:6, - filter: function (event, player) { - return event.player != player && event.player.hp <= 0 && player.countCards("h") > 0; - }, - check: function (event, player) { - if (get.attitude(player, event.player) <= 0) return false; - if (player.countCards("h", { name: ["tao", "jiu"] }) + event.player.hp < 0) return false; - return true; - }, - content: function () { - "step 0"; - player.turnOver(); - "step 1"; - player.give(player.getCards("h"), trigger.player); - "step 2"; - trigger.player.recover(); - }, - }, - renxin: { - trigger: { global: "damageBegin4" }, - audio: 2, - audioname: ["re_caochong"], - //priority:6, - filter: function (event, player) { - return event.player != player && event.player.hp == 1 && player.countCards("he", { type: "equip" }) > 0; - }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseToDiscard(get.prompt("renxin", trigger.player), "弃置一张装备牌并将武将牌翻面,然后防止" + get.translation(trigger.player) + "受到的伤害", { type: "equip" }, "he"); - next.logSkill = ["renxin", trigger.player]; - next.set("ai", function (card) { - var player = _status.event.player; - if (get.attitude(player, _status.event.getTrigger().player) > 3) { - return 11 - get.value(card); - } - return -1; - }); - "step 1"; - if (result.bool) { - player.turnOver(); - } else { - event.finish(); - } - "step 2"; - trigger.cancel(); - }, - ai: { - expose: 0.5, - }, - }, - yuce: { - audio: 2, - audioname: ["re_manchong"], - trigger: { player: "damageEnd" }, - direct: true, - filter: function (event, player) { - return player.countCards("h") > 0 && player.isDamaged(); - }, - content: function () { - "step 0"; - var next = player.chooseCard(get.prompt2("yuce")); - next.set("ai", function (card) { - if (get.type(card) == "basic") return 1; - return Math.abs(get.value(card)) + 1; - }); - "step 1"; - if (result.bool) { - player.logSkill("yuce"); - player.showCards(result.cards); - var type = get.type(result.cards[0], "trick"); - if (trigger.source) { - trigger.source - .chooseToDiscard("弃置一张不为" + get.translation(type) + "牌的牌或令" + get.translation(player) + "回复1点体力", function (card) { - return get.type(card, "trick") != _status.event.type; - }) - .set("ai", function (card) { - if (get.recoverEffect(_status.event.getParent().player, _status.event.player, _status.event.player) < 0) { - return 7 - get.value(card); - } - return 0; - }) - .set("type", type); - } else { - event.recover = true; - } - } else { - event.finish(); - } - "step 2"; - if (event.recover) { - player.recover(); - } else if (result.bool) { - //player.draw(); - } else { - player.recover(); - } - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage" && target.countCards("h"))) { - return 0.8; - } - }, - }, - }, - }, - xiansi: { - audio: 2, - audioname: ["re_liufeng"], - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget( - get.prompt2(event.name), - [1, 2], - function (card, player, target) { - return target.countCards("he") > 0; - }, - function (target) { - return -get.attitude(_status.event.player, target); - } - ); - "step 1"; - if (result.bool) { - result.targets.sortBySeat(); - player.logSkill(event.name, result.targets); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets.length) { - var target = event.targets.shift(); - event.current = target; - player.choosePlayerCard(target, true); - } else { - event.finish(); - } - "step 3"; - if (result.bool) { - player.addToExpansion(result.cards, event.current, "give").gaintag.add("xiansi"); - event.goto(2); - } - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player) { - var cards = player.getExpansions("xiansi"); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { - threaten: 2, - }, - global: "xiansi2", - group: "xiansix", - }, - xiansix: {}, - xiansi2: { - enable: "chooseToUse", - audio: 2, - audioname2: { re_liufeng: "rexiansi" }, - viewAs: { name: "sha", isCard: true }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.hasSkill("xiansix") && current.getExpansions("xiansi").length > 1 && event.filterTarget({ name: "sha" }, player, current); - }); - }, - filterTarget: function (card, player, target) { - var bool = false; - var players = ui.selected.targets.slice(0); - for (var i = 0; i < players.length; i++) { - if (players[i].hasSkill("xiansix") && players[i].getExpansions("xiansi").length > 1) bool = true; - break; - } - if (!bool && (!target.hasSkill("xiansix") || target.getExpansions("xiansi").length <= 1)) return false; - return _status.event._backup.filterTarget.apply(this, arguments); - }, - complexSelect: true, - selectCard: -1, - filterCard: function () { - return false; - }, - forceaudio: true, - prompt: "弃置一名有【逆】的角色的两张【逆】,然后视为对包含其在内的角色使用【杀】。", - delay: false, - log: false, - precontent: function () { - "step 0"; - var targets = event.result.targets.filter(function (current) { - return current.getExpansions("xiansi").length > 1 && current.hasSkill("xiansix"); - }); - if (targets.length == 1) { - event.target = targets[0]; - event.goto(2); - } else if (targets.length > 0) { - player - .chooseTarget(true, "选择弃置【陷嗣】牌的目标", function (card, player, target) { - return _status.event.list.includes(target); - }) - .set("list", targets) - .set("ai", function (target) { - var player = _status.event.player; - return get.attitude(player, target); - }); - } else { - event.finish(); - } - "step 1"; - if (result.bool && result.targets.length) { - event.target = result.targets[0]; - } else { - event.finish(); - } - "step 2"; - if (event.target) { - if (event.target.getExpansions("xiansi").length == 2) { - event.directresult = event.target.getExpansions("xiansi").slice(0); - } else { - player.chooseCardButton("移去两张“逆”", 2, event.target.getExpansions("xiansi"), true); - } - } else { - event.finish(); - } - "step 3"; - if (event.directresult || result.bool) { - player.logSkill("xiansi2_log", event.target); - game.trySkillAudio("xiansi2", event.target, true); - var links = event.directresult || result.links; - target.loseToDiscardpile(links); - } - }, - ai: { - order: function () { - return get.order({ name: "sha" }) + 0.05; - }, - }, - subSkill: { log: {} }, - }, - shibei: { - trigger: { player: "damageEnd" }, - forced: true, - audio: 2, - audioname: ["xin_jushou"], - check: function (event, player) { - return player.getHistory("damage").indexOf(event) == 0; - }, - content: function () { - if (player.getHistory("damage").indexOf(trigger) > 0) { - player.loseHp(); - } else { - player.recover(); - } - }, - subSkill: { - damaged: {}, - ai: {}, - }, - ai: { - maixie_defend: true, - threaten: 0.9, - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing")) return; - if (target.hujia) return; - if (player._shibei_tmp) return; - if (target.hasSkill("shibei_ai")) return; - if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return; - if (get.tag(card, "damage")) { - if (target.getHistory("damage").length > 0) { - return [1, -2]; - } else { - if (get.attitude(player, target) > 0 && target.hp > 1) { - return 0; - } - if (get.attitude(player, target) < 0 && !player.hasSkillTag("damageBonus")) { - if (card.name == "sha") return; - var sha = false; - player._shibei_tmp = true; - var num = player.countCards("h", function (card) { - if (card.name == "sha") { - if (sha) { - return false; - } else { - sha = true; - } - } - return get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0; - }); - delete player._shibei_tmp; - if (player.hasSkillTag("damage")) { - num++; - } - if (num < 2) { - var enemies = player.getEnemies(); - if (enemies.length == 1 && enemies[0] == target && player.needsToDiscard()) { - return; - } - return 0; - } - } - } - } - }, - }, - }, - }, - shibei_old: { - audio: 2, - trigger: { player: "damageAfter" }, - forced: true, - content: function () { - "step 0"; - player.judge(function (card) { - if (player.hasSkill("shibei2")) { - if (get.color(card) == "black") return -1; - } else { - if (get.color(card) == "red") return 1; - } - return 0; - }); - "step 1"; - if (result.judge > 0) { - player.recover(); - } else if (result.judge < 0) { - player.loseHp(); - } - if (!player.hasSkill("shibei2")) { - player.addTempSkill("shibei2"); - } - }, - }, - shibei2: {}, - jianying: { - audio: 2, - locked: false, - mod: { - aiOrder: function (player, card, num) { - if (typeof card == "object" && player.isPhaseUsing()) { - var evt = player.getLastUsed(); - if (evt && evt.card && ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || (evt.card.number && evt.card.number == get.number(card)))) { - return num + 10; - } - } - }, - }, - trigger: { player: "useCard" }, - frequent: true, - filter: function (event, player) { - var evt = player.getLastUsed(1); - if (!evt || !evt.card) return false; - if (!player.isPhaseUsing()) return false; - var evt2 = evt.getParent("phaseUse"); - if (!evt2 || evt2.name != "phaseUse" || evt2.player != player) return false; - return (get.suit(evt.card) != "none" && get.suit(evt.card) == get.suit(event.card)) || (typeof get.number(evt.card, false) == "number" && get.number(evt.card, false) == get.number(event.card)); - }, - content: function () { - player.draw(); - }, - group: "jianying_mark", - init: function (player) { - if (player.isPhaseUsing()) { - var evt = _status.event.getParent("phaseUse"); - var history = player.getHistory("useCard", function (evt2) { - return evt2.getParent("phaseUse") == evt; - }); - if (history.length) { - var trigger = history[history.length - 1]; - if (get.suit(trigger.card, player) == "none" || typeof get.number(trigger.card, player) != "number") return; - player.storage.jianying_mark = trigger.card; - player.markSkill("jianying_mark"); - game.broadcastAll( - function (player, suit) { - if (player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML = get.translation(suit); - }, - player, - get.suit(trigger.card, player) - ); - player.when("phaseUseAfter").then(() => { - player.unmarkSkill("jianying_mark"); - delete player.storage.jianying_mark; - }); - } - } - }, - onremove: function (player) { - player.unmarkSkill("jianying_mark"); - delete player.storage.jianying_mark; - }, - subSkill: { - mark: { - charlotte: true, - trigger: { player: "useCard1" }, - filter: function (event, player) { - return player.isPhaseUsing(); - }, - forced: true, - popup: false, - firstDo: true, - content: function () { - if (get.suit(trigger.card, player) == "none" || typeof get.number(trigger.card, player) != "number") player.unmarkSkill("jianying_mark"); - else { - player.storage.jianying_mark = trigger.card; - player.markSkill("jianying_mark"); - game.broadcastAll( - function (player, suit) { - if (player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML = get.translation(suit); - }, - player, - get.suit(trigger.card, player) - ); - player.when("phaseUseAfter").then(() => { - player.unmarkSkill("jianying_mark"); - delete player.storage.jianying_mark; - }); - } - }, - intro: { - markcount: function (card, player) { - var num = get.number(card, player); - var list = [1, 11, 12, 13]; - if (list.includes(num)) return ["A", "J", "Q", "K"][list.indexOf(num)]; - return parseFloat(num); - }, - content: function (card, player) { - var suit = get.suit(card, player); - var num = get.number(card, player); - var str = "
  • 上一张牌的花色:" + get.translation(suit); - str += "
  • 上一张牌的点数:"; - var list = [1, 11, 12, 13]; - if (list.includes(num)) str += ["A(1)", "J(11)", "Q(12)", "K(13)"][list.indexOf(num)]; - else str += parseFloat(num); - return str; - }, - }, - }, - }, - }, - zzhenggong: { - trigger: { player: "damageEnd" }, - direct: true, - filter: function (event, player) { - return event.source && event.source.countCards("e") > 0; - }, - content: function () { - "step 0"; - var att = get.attitude(player, trigger.source); - player.gainPlayerCard("e", get.prompt("zzhenggong"), trigger.source).ai = function (button) { - if (att <= 0) { - return get.equipValue(button.link); - } - return 0; - }; - "step 1"; - if (result.bool) { - player.logSkill("zzhenggong", trigger.source); - var card = result.links[0]; - if (player.getCards("h").includes(card)) { - player.$give(card, player, false); - player.equip(card); - } - } - }, - ai: { - maixie_defend: true, - }, - }, - zquanji: { - trigger: { global: "phaseBegin" }, - //priority:15, - check: function (event, player) { - var att = get.attitude(player, event.player); - if (att < 0) { - var nh1 = event.player.countCards("h"); - var nh2 = player.countCards("h"); - return nh1 <= 2 && nh2 > nh1 + 1; - } - if (att > 0 && event.player.hasJudge("lebu") && event.player.countCards("h") > event.player.hp + 1) return true; - return false; - }, - logTarget: "player", - filter: function (event, player) { - return event.player != player && player.canCompare(event.player); - }, - content: function () { - "step 0"; - player.chooseToCompare(trigger.player); - "step 1"; - if (result.bool) { - trigger.player.skip("phaseZhunbei"); - trigger.player.skip("phaseJudge"); - } - }, - ai: { - expose: 0.2, - }, - }, - zbaijiang: { - skillAnimation: true, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - unique: true, - derivation: ["zyexin", "zzili", "zpaiyi"], - filter: function (event, player) { - return player.countCards("e") >= 2; - }, - content: function () { - player.awakenSkill("zbaijiang"); - player.gainMaxHp(); - player.changeSkills(["zyexin", "zzili"], ["zquanji", "zzhenggong"]); - }, - }, - zyexin: { - trigger: { player: "damageEnd", source: "damageSource" }, - marktext: "权", - frequent: true, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - content: function () { - player.addToExpansion("zyexin", get.cards(), "gain2").gaintag.add("zyexin"); - }, - group: "zyexin2", - }, - zyexin2: { - enable: "phaseUse", - usable: 1, - lose: false, - discard: false, - delay: false, - selectCard: [1, Infinity], - filterCard: true, - filter: function (event, player) { - return player.getExpansions("zyexin").length > 0; - }, - prompt: "用任意数量的手牌与等量的“权”交换", - content: function () { - "step 0"; - player.addToExpansion(cards, "give", player).gaintag.add("zyexin"); - "step 1"; - player.chooseCardButton(player.getExpansions("zyexin"), "选择" + get.cnNumber(cards.length) + "张牌作为手牌", cards.length, true).ai = function (button) { - return get.value(button.link); - }; - "step 2"; - player.gain(result.links, "gain2"); - }, - ai: { - order: 5, - result: { - player: 1, - }, - }, - }, - zzili: { - skillAnimation: true, - unique: true, - derivation: "zpaiyi", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return player.getExpansions("zyexin").length >= 4; - }, - forced: true, - async content(e, t, player) { - player.awakenSkill("zzili"); - player.loseMaxHp(); - player.addSkills("zpaiyi"); - }, - // intro:{ - // content:'limited' - // } - }, - zpaiyi: { - trigger: { player: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.getExpansions("zyexin").length; - }, - direct: true, - content: function () { - "step 0"; - var next = player.chooseCardButton(get.prompt("zpaiyi"), player.getExpansions("zyexin")); - next.set("ai", function (button) { - return get.value(button.link); - }); - "step 1"; - if (result.bool) { - var card = result.links[0]; - event.card = card; - player - .chooseTarget(function (card, player, target) { - var card = _status.event.card; - var type = get.type(card); - switch (type) { - case "basic": - case "trick": - return true; - case "delay": - return target.canAddJudge(card); - case "equip": - return target.canEquip(card, true); - } - return true; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, _status.event.card, player, player); - }) - .set("card", card); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - var type = get.type(event.card), - target = result.targets[0]; - player.logSkill("zpaiyi", target); - switch (type) { - case "basic": - case "trick": - player.give(event.card, target, "give"); - break; - case "delay": - player.$give(event.card, target, false); - target.addJudge(event.card); - break; - case "equip": - player.$give(event.card, target, false); - target.equip(event.card); - } - if (player != result.targets[0]) { - player.chooseBool("是否摸一张牌?"); - } else event.finish(); - } else event.finish(); - "step 3"; - if (result.bool) player.draw(); - }, - ai: { - combo: "zyexin", - }, - }, - }, - card: { - lukai_spade: { fullskin: true }, - lukai_heart: { fullskin: true }, - lukai_diamond: { fullskin: true }, - lukai_club: { fullskin: true }, - }, - dynamicTranslate: { - rejueqing: function (player) { - if (player.storage.rejueqing_rewrite) return "锁定技,你即将造成的伤害均视为失去体力。"; - return "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。"; - }, - reyanzhu: function (player) { - if (!player.storage.reyanzhu) return "出牌阶段限一次,你可以令一名其他角色选择一项:将装备区里的所有牌交给你并令你修改〖宴诛〗和〖兴学〗,或弃置一张牌并令下一次受到的伤害+1直到其下回合开始。"; - return "出牌阶段限一次,你可以选择一名其他角色。该角色下一次受到的伤害+1直到其下回合开始。"; - }, - rexingxue: function (player) { - if (player.storage.reyanzhu) return "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力上限)。"; - return "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力值)。"; - }, - jiaozhao: function (player) { - var num = player.countMark("xindanxin"); - if (num > 2) return "出牌阶段限两次,你可以将一张手牌当做任意基本牌或普通锦囊牌使用(你不能对自己使用此牌)。"; - if (num > 1) return "出牌阶段限一次,你可以将一张手牌当做任意基本牌或普通锦囊牌使用(你不能对自己使用此牌)。"; - if (num > 0) return "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌或普通锦囊牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌,且此牌不可被【无懈可击】响应)。"; - return "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌,且此牌不可被【无懈可击】响应)。"; - }, - funan: function (player) { - if (player.hasSkill("funan_jiexun")) return "其他角色使用或打出牌响应你使用的牌时,你可获得其使用或打出的牌。"; - return "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。"; - }, - lkbushi: function (player) { - var list = lib.skill.lkbushi.getBushi(player).map(i => get.translation(i)); - return "①你使用" + list[0] + "牌无次数限制。②当你使用或打出" + list[1] + "牌后,你摸一张牌。③当你成为" + list[2] + "牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张" + list[3] + "牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。"; - }, - diezhang: function (player) { - var str = ""; - str += player.storage.duanwan ? "" : "①出牌阶段,你使用杀的次数上限+1。②"; - str += "转换技" + (player.storage.duanwan ? ",每回合限一次" : "") + "。"; - var cnNum = get.cnNumber(player.storage.duanwan ? 2 : 1); - var yinStr = "阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用" + cnNum + "张【杀】"; - var yangStr = "阳:当其他角色使用牌被你抵消后,你可以摸" + cnNum + "张牌,视为对其使用一张【杀】"; - if (player.storage.diezhang) { - if (player.storage.duanwan) yinStr = '' + yinStr + ""; - yangStr = '' + yangStr + ""; - } else { - yinStr = '' + yinStr + ""; - if (player.storage.duanwan) yangStr = '' + yangStr + ""; - } - return str + yinStr + ";" + yangStr + "。"; - }, - }, - characterReplace: { - caozhi: ["caozhi", "dc_caozhi", "re_caozhi", "ps_caozhi"], - zhangchunhua: ["zhangchunhua", "re_zhangchunhua"], - yujin: ["yujin", "yujin_yujin", "ol_yujin", "sb_yujin", "xin_yujin", "re_yujin"], - dc_xushu: ["re_xushu", "dc_xushu"], - xushu: ["xin_xushu", "xushu"], - fazheng: ["xin_fazheng", "re_fazheng", "sb_fazheng", "tw_re_fazheng", "fazheng"], - masu: ["xin_masu", "re_masu", "masu"], - xusheng: ["xusheng", "xin_xusheng", "re_xusheng", "old_xusheng"], - wuguotai: ["wuguotai", "xin_wuguotai", "re_wuguotai"], - lingtong: ["lingtong", "xin_lingtong", "ol_lingtong", "re_lingtong", "old_lingtong"], - gaoshun: ["gaoshun", "xin_gaoshun", "ol_gaoshun", "re_gaoshun", "sb_gaoshun", "old_gaoshun"], - zhonghui: ["zhonghui", "xin_zhonghui", "re_zhonghui", "old_zhonghui", "pe_zhonghui"], - wangyi: ["wangyi", "ol_wangyi", "re_wangyi", "old_wangyi"], - caozhang: ["caozhang", "ol_caozhang", "re_caozhang", "xin_caozhang"], - guanzhang: ["guanzhang", "re_guanzhang", "old_guanzhang"], - madai: ["old_madai", "re_madai", "tw_madai", "madai"], - liaohua: ["liaohua", "re_liaohua", "xin_liaohua"], - bulianshi: ["bulianshi", "dc_bulianshi", "re_bulianshi", "old_bulianshi"], - handang: ["handang", "xin_handang", "re_handang", "tw_handang", "old_handang"], - chengpu: ["chengpu", "ol_chengpu", "re_chengpu", "xin_chengpu", "tw_chengpu", "ns_chengpu"], - liubiao: ["liubiao", "xin_liubiao", "re_liubiao", "sb_liubiao", "oldre_liubiao", "old_liubiao"], - manchong: ["manchong", "re_manchong"], - caochong: ["caochong", "re_caochong", "old_caochong"], - guohuai: ["guohuai", "re_guohuai", "xin_guohuai", "tw_guohuai", "ol_guohuai"], - jianyong: ["jianyong", "ol_jianyong", "re_jianyong", "xin_jianyong"], - panzhangmazhong: ["panzhangmazhong", "re_panzhangmazhong", "xin_panzhangmazhong"], - yufan: ["yufan", "ol_yufan", "xin_yufan", "re_yufan"], - zhuran: ["zhuran", "re_zhuran", "xin_zhuran", "old_zhuran"], - liru: ["xin_liru", "dc_liru", "re_liru", "yj_liru", "+liru"], - fuhuanghou: ["fuhuanghou", "re_fuhuanghou", "xin_fuhuanghou", "old_fuhuanghou"], - chenqun: ["chenqun", "dc_chenqun", "re_chenqun", "old_chenqun"], - hanhaoshihuan: ["hanhaoshihuan", "re_hanhaoshihuan"], - caozhen: ["caozhen", "re_caozhen", "xin_caozhen", "old_caozhen"], - wuyi: ["wuyi", "re_wuyi", "xin_wuyi"], - sunluban: ["re_sunluban", "xin_sunluban", "sunluban"], - zhuhuan: ["re_zhuhuan", "xin_zhuhuan", "zhuhuan", "old_zhuhuan"], - caoxiu: ["caoxiu", "re_caoxiu", "xin_caoxiu", "tw_caoxiu", "old_caoxiu"], - xiahoushi: ["xiahoushi", "re_xiahoushi", "sb_xiahoushi"], - zhangyi: ["zhangyi", "re_zhangyi", "xin_zhangyi"], - quancong: ["quancong", "re_quancong", "xin_quancong", "old_quancong"], - sunxiu: ["sunxiu", "re_sunxiu", "xin_sunxiu"], - zhuzhi: ["zhuzhi", "re_zhuzhi", "xin_zhuzhi", "old_zhuzhi"], - liuyu: ["liuyu", "dc_liuyu", "ol_liuyu"], - zhangrang: ["zhangrang", "ol_zhangrang", "junk_zhangrang"], - jikang: ["jikang", "re_jikang", "dc_jikang"], - xinxianying: ["xinxianying", "re_xinxianying", "ol_xinxianying", "sp_xinxianying"], - gongsunyuan: ["gongsunyuan", "re_gongsunyuan"], - zhoucang: ["zhoucang", "re_zhoucang", "xin_zhoucang"], - guotufengji: ["guotufengji", "re_guotufengji"], - guanping: ["guanping", "re_guanping"], - caifuren: ["caifuren", "re_caifuren", "xin_caifuren"], - guyong: ["guyong", "re_guyong", "xin_guyong", "tw_guyong"], - yj_jushou: ["yj_jushou", "re_jushou", "xin_jushou"], - guohuanghou: ["guohuanghou", "re_guohuanghou"], - liuchen: ["liuchen", "re_liuchen"], - liufeng: ["liufeng", "re_liufeng"], - sundeng: ["sundeng", "re_sundeng", "ns_sundeng"], - caiyong: ["caiyong", "re_caiyong"], - chengong: ["chengong", "re_chengong", "sb_chengong"], - xunyou: ["xunyou", "re_xunyou", "clan_xunyou"], - xuezong: ["xuezong", "tw_xuezong"], - huanghao: ["huanghao", "dc_huanghao", "old_huanghao"], - caorui: ["caorui", "re_caorui", "old_caorui"], - sunziliufang: ["sunziliufang", "dc_sunziliufang"], - liyan: ["liyan", "old_liyan"], - zhangsong: ["zhangsong", "re_zhangsong"], - zhongyao: ["zhongyao", "re_zhongyao"], - liwan: ["ol_liwan", "liwan"], - wuxian: ["wuxian", "clan_wuxian"], - simafu: ["simafu", "yj_simafu"], - xuangongzhu: ["yj_xuangongzhu", "xuangongzhu"], - }, - translate: { - old_huaxiong: "将华雄", - old_huaxiong_prefix: "将", - yufan: "虞翻", - xushu: "旧徐庶", - xushu_prefix: "旧", - caozhi: "曹植", - zhangchunhua: "张春华", - lingtong: "凌统", - xunyou: "荀攸", - liubiao: "刘表", - zhuran: "朱然", - yujin: "于禁", - masu: "旧马谡", - masu_prefix: "旧", - xin_masu: "马谡", - xin_fazheng: "法正", - wuguotai: "吴国太", - chengong: "陈宫", - xusheng: "徐盛", - guohuai: "郭淮", - caochong: "曹冲", - bulianshi: "步练师", - handang: "韩当", - fuhuanghou: "伏寿", - caifuren: "蔡夫人", - zhonghui: "钟会", - old_zhonghui: "旧钟会", - old_zhonghui_prefix: "旧", - sunluban: "孙鲁班", - chenqun: "陈群", - zhangsong: "张松", - guyong: "顾雍", - jianyong: "简雍", - old_madai: "马岱", - gz_madai: "马岱", - xin_xushu: "徐庶", - manchong: "满宠", - liufeng: "刘封", - liru: "旧李儒", - liru_prefix: "旧", - yj_jushou: "沮授", - zhuhuan: "朱桓", - xiahoushi: "夏侯氏", - panzhangmazhong: "潘璋马忠", - caorui: "曹叡", - caoxiu: "曹休", - zhongyao: "钟繇", - liuchen: "刘谌", - zhangyi: "张嶷", - sunxiu: "孙休", - zhuzhi: "朱治", - quancong: "全琮", - gongsunyuan: "公孙渊", - guotufengji: "郭图逢纪", - zhoucang: "周仓", - guanping: "关平", - liaohua: "廖化", - caozhen: "曹真", - wuyi: "吴懿", - hanhaoshihuan: "韩浩史涣", - chengpu: "程普", - gaoshun: "高顺", - xin_liru: "李儒", - guohuanghou: "郭皇后", - liuyu: "刘虞", - sundeng: "孙登", - liyan: "李严", - sunziliufang: "孙资刘放", - huanghao: "黄皓", - zhangrang: "张让", - cenhun: "岑昏", - xinxianying: "辛宪英", - wuxian: "吴苋", - xushi: "徐氏", - caojie: "曹节", - xuezong: "薛综", - jikang: "嵇康", - qinmi: "秦宓", - caiyong: "蔡邕", - - new_qingxian: "清弦", - new_qingxian_info: "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", - new_juexiang: "绝响", - new_juexiang_info: "锁定技,当你死亡后,杀死你的角色弃置装备区内的所有牌并失去1点体力。然后,你可以令一名其他角色获得技能〖残韵〗。若该角色区域内有梅花牌,则其可以弃置其中的一张,然后其获得技能〖绝响〗。", - new_canyun: "残韵", - new_canyun_info: "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色(不能选择已经成为过〖残韵〗目标的角色)。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", - qingxian_draw: "清弦", - qingxian_draw_info: "", - zhenjun: "镇军", - zhenjun_info: "准备阶段,你可以弃置一名手牌数多于体力值的角色的X张牌(X为其手牌数和体力值之差),然后选择一项:1.你弃置等同于其中非装备牌数量的牌;2.其摸等量的牌。", - rezhenjun: "镇军", - rezhenjun_info: "准备阶段,你可以弃置一名角色的X张牌(X为其手牌数和体力值之差且至少为1),然后选择一项:1.你弃置X张牌;2.其摸X张牌。(X为其弃置的牌中非装备牌的数量)", - fenli: "奋励", - fenli_info: "若你的手牌数为全场最多,你可以跳过摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。", - pingkou: "平寇", - pingkou_info: "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。", - xinanguo: "安国", - xinanguo_info: "出牌阶段限一次,你可以选择一名其他角色,若其手牌数为全场最少,其摸一张牌;体力值为全场最低,回复1点体力;装备区内牌数为全场最少,随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。", - pindi: "品第", - pindi_info: "出牌阶段,你可以弃置一张牌并选择一名其他角色(不能弃置相同类型牌且不能指定相同的角色),然后令其执行一项:摸X张牌;弃置X张牌(X为本回合此技能发动次数)。若其已受伤,你横置。", - funan_jiexun: "诫训", - bizhuan: "辟撰", - bizhuan_bg: "书", - bizhuan_info: "当你使用黑桃牌后,或你成为其他角色使用黑桃牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”;你至多拥有四张“书”,你每有一张“书” ,手牌上限+1。", - tongbo: "通博", - tongbo_info: "摸牌阶段摸牌后,你可以用任意张牌替换等量的“书”,然后若你的“书”包含四种花色,你将所有“书”交给任意名其他角色。", - qingxian: "清弦", - qingxian_info: "当你受到伤害/回复体力后,你可以令伤害来源/一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你摸一张牌。", - juexiang: "绝响", - juexiang_info: "当你死亡后,你可以令一名角色随机获得“清弦残谱”其中一个技能,然后直到其下回合开始,其不能被选择为其他角色使用梅花牌的目标。", - juexiang_ji: "激弦", - juexiang_ji_info: "当你受到伤害后,你可以令伤害来源失去1点体力,随机使用一张装备。", - juexiang_lie: "烈弦", - juexiang_lie_info: "当你回复体力后,你可以令一名其他角色失去1点体力,随机使用一张装备。", - juexiang_rou: "柔弦", - juexiang_rou_info: "当你受到伤害后,你可以令伤害来源回复1点体力,弃置一张装备。", - juexiang_he: "和弦", - juexiang_he_info: "当你回复体力后,你可以令一名其他角色回复1点体力,弃置一张装备。", - juexiang_club: "绝响", - juexiang_club_bg: "响", - juexiang_club_info: "直到下回合开始,不能被选择为其他角色使用梅花牌的目标。", - jianzheng: "谏征", - jianzheng_info: "当一名其他角色使用【杀】指定目标时,若你在其攻击范围内且你不是目标,则你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。", - zhuandui: "专对", - zhuandui_info: "当你使用【杀】指定目标/成为【杀】的目标后,你可以与目标角色/此【杀】使用者拼点,若你赢,此杀不能被【闪】响应/对你无效。", - zhuandui_use_info: "当你使用【杀】指定目标后,你可以与目标角色拼点,若你赢,此杀不能被【闪】响应。", - zhuandui_respond_info: "当你成为【杀】的目标后,你可以与此【杀】使用者拼点,若你赢,此杀对你无效。", - tianbian: "天辩", - tianbian_info: "你拼点时,可以改为用牌堆顶的一张牌进行拼点;当你拼点的牌亮出后,若此牌花色为红桃,则此牌的点数视为K。", - funan: "复难", - funan_info: "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。", - jiexun: "诫训", - jiexun_info: "结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你失去〖诫训〗,然后你发动〖复难〗时,无须令对方获得你使用的牌。", - xinjiexun: "诫训", - xinjiexun_info: "结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你将X归零,然后你发动〖复难〗时,无须令对方获得你使用的牌。", - shouxi: "守玺", - shouxi_info: "当你成为【杀】的目标后,你可声明一种未以此法声明过的基本牌或锦囊牌的牌名。若使用者弃置一张你声明的牌,其获得你的一张牌;若否,则此【杀】对你无效。", - huimin: "惠民", - huimin_info: "结束阶段,你可以摸X张牌并展示等量手牌(X为手牌数小于其体力值的角色数),然后从你指定的一名角色开始这些角色依次选择并获得其中一张。", - wengua: "问卦", - wengua2: "问卦", - wengua_info: "其他角色/你的出牌阶段限一次,其可以交给你一张牌,(若当前回合角色为你,则跳过此步骤),你可以将此牌/一张牌置于牌堆顶或牌堆底,然后你与其/你从另一端摸一张牌。", - fuzhu: "伏诛", - fuzhu_info: "一名男性角色的结束阶段,若牌堆剩余牌数不大于你体力值的十倍,则你可以依次对其使用牌堆中所有的【杀】(不能超过游戏人数),然后洗牌。", - fumian: "福绵", - fumian_info: "准备阶段,你可以选择一项:1.摸牌阶段多摸一张牌;2.使用红色牌可以多选择一个目标(限一次)。若与你上回合选择的选项不同,则该选项数值+1并复原此技能。", - daiyan: "怠宴", - daiyan_info: "结束阶段,你可以令一名其他角色从牌堆中获得一张红桃基本牌,然后若其于上回合成为过该技能目标,则其失去1点体力。", - xinzhongjian: "忠鉴", - xinzhongjian_info: "出牌阶段限一次,你可以展示自己的一张手牌,然后展示一名其他角色的至多三张手牌。其展示的牌中:每有一张花色相同,你摸一张牌;点数相同,你对其造成1点伤害;均不同,你弃置一张手牌。", - zhongjian: "忠鉴", - zhongjian_bg: "鉴", - zhongjian3: "忠鉴", - zhongjian3_bg: "鉴", - zhongjian_info: "出牌阶段限一次,你可以展示一张手牌,然后展示一名其他角色的X张手牌(X为其体力值)。若以此法展示的牌与你展示的牌:有颜色相同的,你选择:①摸一张牌。②弃置一名其他角色的一张牌;有点数相同的,本回合此技能改为“出牌阶段限两次”;均不同,你的手牌上限-1。", - caishi: "才识", - caishix: "才识/忠鉴", - caishi_info: "摸牌阶段开始时,你可以选择一项:1.令手牌上限+1;2.回复1点体力,本回合内不能对自己使用牌。", - xincaishi: "才识", - xincaishi_info: "摸牌阶段,你可以选择一项:1.少摸一张牌,然后本回合发动〖忠鉴〗时可以多展示自己的一张牌;2.本回合手牌上限-1,然后本回合发动〖忠鉴〗时可以多展示对方的一张牌;3.多摸两张牌,本回合不能发动〖忠鉴〗。", - guizao: "瑰藻", - guizao_info: "弃牌阶段结束时,若你于此阶段弃置牌的数量不小于2且它们的花色各不相同,你可以回复1点体力或摸一张牌。", - jiyu: "讥谀", - jiyu_info: "出牌阶段限一次,你可以令一名角色弃置一张手牌。若如此做,你不能使用与之相同花色的牌,直到回合结束。若其以此法弃置的牌为黑桃,你翻面并令其失去1点体力。若你有未被〖讥谀〗限制的手牌,则你可以继续发动此技能,但不能选择本回合已经选择过的目标。", - qinqing: "寝情", - qinqing_info: "结束阶段,你可以选择任意名攻击范围内含有主公的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比主公多的角色数)。", - qinqing_info_doudizhu: "结束阶段,你可以选择任意名攻击范围内含有地主的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比地主多的角色数)。", - huisheng: "贿生", - huisheng_info: "当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张,防止此伤害,然后你不能再对其发动〖贿生〗;2.弃置等量的牌。", - jishe: "极奢", - jishe2: "极奢", - jishe_info: "①出牌阶段限20次,若你的手牌上限大于0,你可以摸一张牌,然后你本回合的手牌上限-1。②结束阶段开始时,若你没有手牌,则你可以横置至多X名角色的武将牌(X为你的体力值)。", - lianhuo: "链祸", - lianhuo_info: "锁定技,当你受到火焰伤害时,若你的武将牌处于横置状态且此伤害不为连环伤害,则此伤害+1。", - taoluan: "滔乱", - taoluan_backup: "滔乱", - taoluan_info: "你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力且〖滔乱〗无效直到回合结束。", - xintaoluan: "滔乱", - xintaoluan_backup: "滔乱", - xintaoluan_info: "若场上没有濒死的角色,则你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本回合内你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你X张与你以此法使用的牌类别不同的牌;2.你失去X点体力且滔乱无效直到回合结束(X为你本回合内发动过〖滔乱〗的次数且至多为3)。", - jiaozhao: "矫诏", - jiaozhao3: "矫诏", - jiaozhao3_backup: "矫诏", - jiaozhao2: "矫诏", - jiaozhao_info: "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌)。", - danxin: "殚心", - danxin_info: "当你受到伤害后,你可以摸一张牌,或对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。", - xindanxin: "殚心", - xindanxin_info: "当你受到伤害后,你可以摸一张牌,并对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。3.将“出牌阶段限一次”改为“出牌阶段限两次”。", - duliang: "督粮", - duliang2: "督粮", - duliang_info: "出牌阶段限一次,你可以获得一名其他角色的一张手牌,然后选择一项:1.令其观看牌堆顶的两张牌,然后获得其中的基本牌;2.令其于下个摸牌阶段额外摸一张牌。", - fulin: "腹鳞", - fulin_info: "锁定技,你于回合内得到的牌不计入你本回合的手牌上限。", - kuangbi: "匡弼", - kuangbi_info: "出牌阶段限一次,你可以选择一名有牌的其他角色,该角色将其的一至三张牌置于你的武将牌上。若如此做,你的下个准备阶段,你获得武将牌上的所有牌,然后其摸等量的牌。", - xinzhige: "止戈", - xinzhige_info: "出牌阶段限一次,你可以令一名攻击范围内含有你的其他角色交给你一张【杀】或武器牌,否则其视为对你指定的另一名其攻击范围内的角色使用了一张【杀】。", - zhige: "止戈", - zhige_info: "出牌阶段限一次,若你的手牌数大于你的体力值,你可以选择攻击范围内含有你的一名其他角色,其选择一项:1.使用一张【杀】;2.将装备区里的一张牌交给你。", - xinzongzuo: "宗祚", - xinzongzuo_info: "锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限并摸两张牌。", - zongzuo: "宗祚", - zongzuo_info: "锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限。", - xinjuece: "绝策", - xinjuece_info: "结束阶段,你可以对一名没有手牌的角色造成1点伤害。", - xinmieji: "灭计", - xinmieji_info: "出牌阶段限一次,你可以展示一张黑色锦囊牌并将之置于牌堆顶,然后令有手牌的一名其他角色选择一项:弃置一张锦囊牌;或依次弃置两张非锦囊牌。", - xinfencheng: "焚城", - xinfencheng_info: "限定技。出牌阶段,你可以令所有其他角色各选择一项:弃置至少X张牌(X为该角色的上家以此法弃置牌的数量+1);或受到你对其造成的2点火焰伤害。", - qianju: "千驹", - qianju_info: "锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值)。", - qingxi: "倾袭", - qingxi_info: "当你使用【杀】对目标角色造成伤害时,若你的装备区里有武器牌,你可以令其选择一项:1、弃置X张手牌(X为此武器牌的攻击范围),若如此做,其弃置你的此武器牌;2、令伤害值+1。", - reqianju: "千驹", - reqianju_info: "锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值且至少为1)。", - reqingxi: "倾袭", - reqingxi_info: "当你使用【杀】或【决斗】指定目标后,你可以令其选择一项:1、弃置X张手牌(X为你攻击范围内的角色数,且当你装备区内有武器牌/没有武器牌时至多为4/2),若如此做,其弃置你的此武器牌;2、令此牌的伤害值+1且你进行判定,若结果为红色,则其不能响应此牌。", - jieyue: "节钺", - jieyue_info: "①结束阶段,你可以弃置一张手牌,然后令一名其他角色选择一项:1.将一张牌置于你的武将牌上,称之为“节”;2.令你弃置其一张牌。②若你有“节”,你可以将红色/黑色手牌当作【闪】/【无懈可击】使用或打出。③准备阶段,若你有“节”,则你获得之。", - xianzhen: "陷阵", - xianzhen_info: "出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视与该角色的距离;无视该角色的防具且对其使用【杀】没有次数限制。若你没赢,你不能使用【杀】直到回合结束。", - xinxianzhen: "陷阵", - xinxianzhen_info: "出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标。若你没赢,你不能使用【杀】且你的【杀】不计入手牌上限直到回合结束。", - xinxianzhen2: "陷阵", - jinjiu: "禁酒", - jinjiu_info: "锁定技,你的【酒】均视为【杀】。", - chunlao: "醇醪", - chunlao2: "醇醪", - chunlao_info: "结束阶段开始时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】。", - lihuo: "疠火", - lihuo_info: "当你声明使用普通【杀】后,你可以将此【杀】改为火【杀】。若以此法使用的【杀】造成了伤害,则此【杀】结算后你失去1点体力;你使用火【杀】选择目标后,可以额外指定一个目标。", - shenduan: "慎断", - shenduan_info: "当你的黑色基本牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。", - yonglve: "勇略", - yonglve_info: "一名其他角色的判定阶段开始时,若其在你攻击范围内,则你可以弃置其判定区里的一张牌,视为对该角色使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。", - reshenduan: "慎断", - reshenduan_info: "当你的黑色基本牌或装备牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。", - reyonglve: "勇略", - reyonglve_info: "其他角色的判定阶段开始时,你可以弃置其判定区里的一张牌。然后若该角色在你攻击范围内,你摸一张牌。若其在你攻击范围外,视为你对其使用一张【杀】。", - benxi: "奔袭", - benxi_info: "锁定技,你的回合内,你每使用一次牌后,你的进攻距离+1直到回合结束;你的回合内,若你与所有角色的距离均为1,你无视其他角色的防具,且你使用的【杀】可额外指定一个目标。", - xinbenxi: "奔袭", - xinbenxi_info: "锁定技,当你于回合内使用牌时,你本回合计算与其他角色的距离-1。你的回合内,若你至场上所有其他角色的距离均不大于1,则当你使用【杀】或普通锦囊牌选择唯一目标后,你选择至多两项:1.为此牌多指定一个目标;2.令此牌无视防具;3.令此牌不可被抵消;4.此牌造成伤害时摸一张牌。", - sidi: "司敌", - sidi2: "司敌", - sidi3: "司敌", - sidi_info: "①当你使用或其他角色在你的回合内使用【闪】时,你可以将牌堆顶的牌置于你的武将牌上,称为“司敌”牌。②其他角色的出牌阶段开始时,你可以移去一张“司敌”牌,令其本阶段使用【杀】的次数上限-1。", - xinsidi: "司敌", - xinsidi2: "司敌", - xinsidi_info: "其他角色出牌阶段开始时,你可以弃置一张与你装备区里的牌颜色相同的非基本牌,然后该角色于此阶段内不能使用和打出与此牌颜色相同的牌。此阶段结束时,若其此阶段没有使用【杀】,视为你对其使用了【杀】。", - dangxian: "当先", - dangxian_info: "锁定技,回合开始时,你执行一个额外的出牌阶段。", - xindangxian: "当先", - xindangxian_info: "锁定技,回合开始时,你执行一个额外的出牌阶段。此阶段开始时,你失去1点体力并从牌堆/弃牌堆中获得一张【杀】(若你已发动过〖伏枥〗,则可以不发动此效果)。", - longyin: "龙吟", - longyin_info: "当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数,若此【杀】为红色,你摸一张牌。", - zhongyong: "忠勇", - zhongyong_info: "当你于出牌阶段内使用的【杀】被目标角色使用的【闪】抵消时,你可以将此【闪】交给除该角色外的一名角色。若获得此【闪】的角色不是你,你可以对相同的目标再使用一张【杀】。", - xinzhongyong: "忠勇", - xinzhongyong_info: "当你使用的【杀】结算完毕后,你可以将此【杀】或目标角色使用的【闪】交给一名该角色以外的其他角色,以此法得到红色牌的角色可以对你攻击范围内的角色使用一张【杀】。", - jigong: "急攻", - jigong_info: "出牌阶段开始时,你可以摸两张牌。若如此做,你本回合的手牌上限改为X(X为你此阶段造成的伤害点数之和)。", - shifei: "饰非", - shifei_info: "当你需要使用或打出【闪】时,你可以令当前回合角色摸一张牌。然后若其手牌数不为全场唯一最多,则你弃置全场手牌数最多(或之一)角色的一张牌,视为你使用或打出了一张【闪】。", - huaiyi: "怀异", - huaiyi_info: "出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。", - yaoming: "邀名", - yaoming_info: "每回合限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置手牌数大于你的一名角色的一张手牌;2. 令手牌数小于你的一名角色摸一张牌。", - xinyaoming: "邀名", - xinyaoming_info: "每回合每个选项限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置一名其他角色的一张手牌;2. 令一名其他角色摸一张牌;3.令一名角色弃置至多两张牌,然后摸等量的牌。", - anguo: "安国", - anguo_info: "出牌阶段限一次,你可以选择一名其他角色装备区里的一张牌,令其获得此牌。然后若该角色攻击范围内的角色数因此减少,则你摸一张牌。", - yanzhu: "宴诛", - yanzhu_info: "出牌阶段限一次,你可以令一名有牌的其他角色选择一项:令你获得其装备区里所有的牌,然后你失去技能〖宴诛〗;或弃置一张牌。", - xingxue: "兴学", - xingxue_info: "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值,若你已失去技能〖宴诛〗,则将X改为你的体力上限)。", - zhaofu: "诏缚", - zhaofu_info: "主公技,锁定技,你距离为1的角色视为在其他吴势力角色的攻击范围内。", - reyanzhu: "宴诛", - reyanzhu2: "宴诛", - reyanzhu_info: "出牌阶段限一次,你可以令一名其他角色选择一项:将装备区里的所有牌交给你并令你修改〖宴诛〗和〖兴学〗,或弃置一张牌并令下一次受到的伤害+1直到其下回合开始。", - reyanzhu_rewrite: "宴诛·改", - reyanzhu_rewrite_info: "出牌阶段限一次,你可以选择一名其他角色。该角色下一次受到的伤害+1直到其下回合开始。", - rexingxue: "兴学", - rexingxue_info: "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力值)。", - rexingxue_rewrite: "兴学·改", - rexingxue_rewrite_info: "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力上限)。", - rezhaofu: "诏缚", - rezhaofu_info: "主公技,锁定技,你攻击范围内的角色视为在其他吴势力角色的攻击范围内。", - wurong: "怃戎", - wurong_info: "出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你弃置此【杀】并对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你弃置你展示的牌并获得其一张牌。", - shizhi: "矢志", - shizhi_info: "锁定技,当你的体力值为1时,你的【闪】均视为【杀】。", - zhanjue: "战绝", - zhanjue_info: "出牌阶段,你可以将所有手牌当作【决斗】使用。此【决斗】结算后,你与以此法受到伤害的角色各摸一张牌。若你在同一阶段内以此法摸了两张或更多的牌,则此技能失效直到回合结束。", - qinwang: "勤王", - qinwang1: "勤王", - qinwang2: "勤王", - qinwang_info: "主公技,当你需要使用或打出一张【杀】时,你可以弃置一张牌,然后视为你发动了〖激将①〗。若有角色响应,则该角色打出【杀】时摸一张牌。", - huomo: "活墨", - huomo_info: "当你需要使用一张本回合内未使用过的基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。", - zuoding: "佐定", - zuoding_info: "当其他角色于其回合内使用♠牌指定目标后,若本回合内没有角色受到过伤害,则你可以令其中一名目标角色摸一张牌。", - taoxi: "讨袭", - taoxi2: "讨袭", - taoxi3: "讨袭", - taoxi_info: "出牌阶段限一次。当你使用牌指定一名其他角色为唯一目标后,你可以亮出其一张手牌直到回合结束,并且你于此回合内可以将此牌如手牌般使用。回合结束时,若此牌仍在该角色手牌区里,你失去1点体力。", - huituo: "恢拓", - huituo_info: "当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害点数)。", - mingjian: "明鉴", - mingjian2: "明鉴", - mingjian_info: "出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。", - xingshuai: "兴衰", - xingshuai_info: "主公技,限定技,当你进入濒死状态时,其他魏势力角色可依次令你回复1点体力,然后这些角色依次受到1点伤害。", - reduodao: "夺刀", - reduodao_info: "当你成为【杀】的目标后,你可以弃置一张牌。然后你获得此【杀】使用者装备区里的武器牌。", - reanjian: "暗箭", - reanjian_info: "锁定技,当你使用【杀】指定目标后,若你不在其攻击范围内,则此杀伤害+1且无视其防具。若其因执行此【杀】的效果受到伤害而进入濒死状态,则其不能使用【桃】直到此濒死事件结算结束。", - duodao: "夺刀", - duodao_info: "当你受到【杀】造成的伤害后,你可以弃置一张牌,然后获得伤害来源装备区里的武器牌。", - anjian: "暗箭", - anjian_info: "锁定技,当你使用【杀】对目标角色造成伤害时,若你不在其攻击范围内,则此杀伤害+1。", - xinpojun: "破军", - xinpojun2: "破军", - xinpojun_info: "当你于出牌阶段内使用【杀】指定一个目标后,你可以将其至多X张牌扣置于该角色的武将牌旁(X为其体力值)。若如此做,当前回合结束后,该角色获得其武将牌旁的所有牌。", - - qiaoshi: "樵拾", - qiaoshi_info: "其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。", - yanyu: "燕语", - yanyu2: "燕语", - yanyu_info: "出牌阶段,你可以重铸【杀】。出牌阶段结束时,若你于此阶段以此法重铸了至少两张【杀】,则你可以令一名男性角色摸两张牌。", - - zzhenggong: "争功", - zzhenggong_info: "当你受到伤害后,你可以获得伤害来源装备区里的一张牌并置入你的装备区。", - zquanji: "权计", - zquanji_info: "其他角色的回合开始时,你可以与该角色拼点。若你赢,该角色跳过准备阶段和判定阶段。", - zbaijiang: "拜将", - zbaijiang_info: "觉醒技。准备阶段,若你装备区里的牌数不少于两张,你加1点体力上限,失去〖权计〗和〖争功〗,获得〖野心〗和〖自立〗。", - zyexin: "野心", - zyexin2: "野心", - zyexin_info: "①当你造成或受到伤害后,你可以将牌堆顶的一张牌置于你的武将牌上,称为“权”。②出牌阶段限一次。你可以用任意数量的手牌与等量的“权”交换。", - zzili: "自立", - zzili_info: "觉醒技。准备阶段,若你的“权”数不小于4,你减1点体力上限并获得〖排异〗。", - zpaiyi: "排异", - zpaiyi_info: "结束阶段,你可以选择一张“权”,若此牌为:装备牌,你将此牌置入一名角色的装备区;延时类锦囊牌,你将此牌置入一名角色的判定区;基本牌或普通锦囊牌,你将此牌交给一名角色。然后若此牌的目标区域对应的角色不为你,你可以摸一张牌。", - shibei: "矢北", - shibei_info: "锁定技,当你受到伤害后:若此伤害是你本回合第一次受到的伤害,则你回复1点体力;否则你失去1点体力。", - jianying: "渐营", - jianying_info: "当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。", - xinenyuan: "恩怨", - xinenyuan1: "恩怨", - xinenyuan2: "恩怨", - xinenyuan_info: "当你获得一名其他角色两张或更多的牌后,你可以令其摸一张牌;当你受到1点伤害后,你可以令伤害来源选择一项:1、将一张手牌交给你;2、失去1点体力。", - xinxuanhuo: "眩惑", - xinxuanhuo_info: "摸牌阶段开始时,你可以改为令一名其他角色摸两张牌,然后该角色需对其攻击范围内你选择的另一名角色使用一张【杀】,否则你获得其两张牌。", - fuhun: "父魂", - fuhun2: "父魂", - fuhun_info: "你可以将两张手牌当做【杀】使用或打出;当你于出牌阶段以此法使用的【杀】造成伤害后,你获得〖武圣〗和〖咆哮〗直到回合结束。", - yuce: "御策", - yuce_info: "当你受到伤害后,你可以展示一张手牌,并令伤害来源选择一项:弃置一张与此牌类型不同的手牌,或令你回复1点体力。", - xiansi: "陷嗣", - xiansix: "陷嗣", - xiansi_bg: "逆", - xiansi2: "陷嗣", - xiansi_info: "准备阶段开始时,你可以将一至两名角色的各一张牌置于你的武将牌上,称为“逆”;当一名角色需要对你使用【杀】时,其可以移去两张“逆”,然后视为对你使用了一张【杀】。", - chanhui: "谮毁", - chanhui_info: "出牌阶段限一次,当你使用【杀】或黑色普通锦囊牌指定唯一目标时,你可令可以成为此牌目标的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标。", - rechanhui: "谮毁", - rechanhui_info: "当你使用【杀】或普通锦囊牌指定唯一目标时,你可令可以成为此牌目标(无距离限制)的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标且你本回合内不能再次发动〖谮毁〗。", - jiaojin: "骄矜", - jiaojin_info: "当你受到男性角色造成的伤害时,你可以弃置一张装备牌,令此伤害-1。", - rejiaojin: "骄矜", - rejiaojin_info: "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以弃置一张装备牌,令此牌对你无效并获得此牌对应的所有实体牌。若此牌的使用者为女性角色,则你令〖骄矜〗失效直到回合结束。", - shenxing: "慎行", - shenxing_info: "出牌阶段,你可以弃置两张牌,然后摸一张牌。", - bingyi: "秉壹", - bingyi_info: "结束阶段开始时,你可以展示所有手牌,若这些牌颜色均相同,则你令至多X名角色各摸一张牌(X为你的手牌数)。", - qiangzhi: "强识", - qiangzhi_draw: "强识", - qiangzhi_info: "出牌阶段开始时,你可以展示一名其他角色的一张手牌。若如此做,当你于此阶段内使用与此牌类别相同的牌时,你可以摸一张牌。", - xiantu: "献图", - xiantu2: "献图", - xiantu3: "献图", - xiantu_info: "一名其他角色的出牌阶段开始时,你可以摸两张牌,然后交给其两张牌。若如此做,此阶段结束时,若该角色未于此阶段内杀死过角色,则你失去1点体力。", - dingpin: "定品", - dingpin_info: "出牌阶段,你可以弃置一张手牌,然后令一名已受伤的角色判定,若结果为黑色,该角色摸X张牌(X为该角色已损失的体力值),然后你本回合不能再对其发动〖定品〗;若结果为红色,你翻面(你不能弃置本回合已弃置或使用过的类型的牌)。", - faen: "法恩", - faen_info: "当一名角色翻至正面或横置后,你可以令其摸一张牌。", - jyzongshi: "纵适", - jyzongshi_info: "当你拼点赢时,你可以获得对方此次拼点的牌;当你拼点没赢时,你可以收回你此次拼点的牌。", - qiaoshui: "巧说", - qiaoshui3: "巧说", - qiaoshui_info: "出牌阶段开始时,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你不能使用锦囊牌直到回合结束。", - reqiaoshui: "巧说", - reqiaoshui_info: "出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你结束出牌阶段且本回合内锦囊牌不计入手牌上限。", - junxing: "峻刑", - junxing_info: "出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面再摸X张牌(X为你以此法弃置的手牌数量)。", - xinjunxing: "峻刑", - xinjunxing_info: "出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面,然后将手牌摸至四张。", - - xswuyan: "无言", - xinwuyan: "无言", - jujian: "举荐", - xinjujian: "举荐", - luoying: "落英", - luoying_discard: "落英", - luoying_judge: "落英", - luoying_judge_noconf: "落英·判定", - jiushi: "酒诗", - jiushi1: "酒诗", - jiushi2: "酒诗", - jiushi3: "酒诗", - jueqing: "绝情", - shangshi: "伤逝", - xuanfeng: "旋风", - zhiyu: "智愚", - qice: "奇策", - qice_backup: "奇策", - jiangchi: "将驰", - jiangchi_less: "少摸一张", - jiangchi_more: "多摸一张", - zishou: "自守", - zongshi: "宗室", - danshou: "胆守", - olddanshou: "胆守", - xindanshou: "胆守", - yizhong: "毅重", - xinzhan: "心战", - xinzhan_gain: "获得", - xinzhan_place: "牌堆顶", - huilei: "挥泪", - enyuan: "恩怨", - enyuan1: "恩怨", - enyuan2: "恩怨", - xuanhuo: "眩惑", - ganlu: "甘露", - buyi: "补益", - mingce: "明策", - zhichi: "智迟", - zhichi2: "智迟", - pojun: "破军", - jingce: "精策", - xinjingce: "精策", - chengxiang: "称象", - oldchengxiang: "称象", - renxin: "仁心", - oldrenxin: "仁心", - zhenlie: "贞烈", - miji: "秘计", - miji_tag: "已分配", - zhiyan: "直言", - zongxuan: "纵玄", - anxu: "安恤", - old_anxu: "安恤", - zhuiyi: "追忆", - gongji: "弓骑", - qiuyuan: "求援", - oldqiuyuan: "求援", - zhuikong: "惴恐", - oldzhuikong: "惴恐", - qieting: "窃听", - xianzhou: "献州", - quanji: "权计", - zili: "自立", - paiyi: "排异", - paiyi_backup: "排异", - sanyao: "散谣", - olsanyao: "散谣", - olsanyao_backup: "散谣", - zhiman: "制蛮", - resanyao: "散谣", - rezhiman: "制蛮", - qianxi: "潜袭", - qianxi2: "潜袭", - qianxi2_bg: "袭", - fuli: "伏枥", - xinfuli: "伏枥", - jiefan: "解烦", - juece: "绝策", - mieji: "灭计", - fencheng: "焚城", - youdi: "诱敌", - youdi_info: "结束阶段开始时,你可以令一名其他角色弃置你的一张牌,若此牌不为【杀】,你获得该角色的一张牌。", - fencheng_info: "限定技。出牌阶段,你可令所有其他角色依次选择一项:弃置X张牌;或受到1点火焰伤害。(X为该角色装备区里牌的数量且至少为1)", - mieji_info: "当你使用黑色普通锦囊牌选择目标后,若目标数为1,则你可以额外指定一个目标。", - juece_info: "当其他角色在你回合内失去最后的手牌后,你可以对其造成1点伤害。", - jiefan_info: "限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。", - fuli_info: "限定技,当你处于濒死状态时,你可以将体力回复至与场上势力数相同,然后翻面。", - xinfuli_info: "限定技,当你处于濒死状态时,可以将体力回复至X点并将手牌摸至X张(X为场上势力数)。若X大于2,你翻面。", - qianxi_info: "准备阶段,你可以摸一张牌,并弃置一张牌,然后令一名距离为1的角色不能使用或打出与你弃置的牌颜色相同的手牌直到回合结束。", - zhiman_info: "当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其装备区或判定区的一张牌。", - sanyao_info: "出牌阶段限一次,你可以弃置一张牌并指定一名体力值最多(或之一)的角色,你对其造成1点伤害。", - olsanyao_info: "出牌阶段每项各限一次,你可以弃置一张牌并指定一名体力值或手牌数最多(或之一)的角色,并对其造成1点伤害。", - rezhiman_info: "当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其区域内的一张牌。", - resanyao_info: "出牌阶段限一次,你可以弃置任意张牌并指定等量除你外体力值最多(或之一)的其他角色。你对这些角色依次造成1点伤害。", - paiyi_info: "出牌阶段限一次,你可以移去一张“权”并选择一名角色,令其摸两张牌,然后若其手牌数大于你,你对其造成1点伤害。", - zili_info: "觉醒技,准备阶段开始时,若“权”的数量不小于3,你减1点体力上限,然后选择一项:1、回复1点体力;2、摸两张牌。然后你获得技能“排异”。", - quanji_info: "当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。", - xianzhou_info: "限定技。出牌阶段,你可以将装备区内的所有牌交给一名其他角色,然后该角色选择一项:令你回复X点体力;或对其攻击范围内的X名角色各造成1点伤害(X为你以此法交给该角色的牌的数量)。", - qieting_info: "其他角色的回合结束时,若其未于此回合内使用过指定其他角色为目标的牌,你可以选择一项:将其装备区里的一张牌移动至你装备区里的相应位置;或摸一张牌。", - zhuikong_info: "其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色本回合使用的牌不能指定除该角色外的角色为目标。若你没赢,其本回合至你的距离视为1。", - oldzhuikong_info: "其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色跳过本回合的出牌阶段。若你没赢,其本回合至你的距离视为1。", - qiuyuan_info: "当你成为【杀】的目标时,你可以令一名其他角色选择一项:①、交给你一张【闪】;②、成为此【杀】的额外目标。", - oldqiuyuan_info: "当你成为【杀】的目标时,你可以令一名有手牌的其他角色正面朝上交给你一张牌。若此牌不为【闪】,则该角色也成为此【杀】的额外目标。", - gongji_info: "出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。", - zhuiyi_info: "当你死亡时,你可以令一名其他角色(杀死你的角色除外)摸三张牌,然后其回复1点体力。", - anxu_info: "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌多的角色将一张手牌交给手牌少的角色,然后若这两名角色手牌数相等,你摸一张牌或回复1点体力。", - old_anxu_info: "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌。", - zongxuan_info: "当你的牌因弃置而进入弃牌堆后,你可以将其按任意顺序置于牌堆顶。", - zhiyan_info: "结束阶段,你可以令一名角色摸一张牌并展示之,若为装备牌,其使用此牌并回复1点体力。", - miji_info: "结束阶段,若你已受伤,则可以摸X张牌,然后可以将等量的牌交给其他角色(X为你已损失的体力值)。", - zhenlie_info: "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后弃置对方一张牌。", - chengxiang_info: "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。", - oldchengxiang_info: "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于12的牌。", - renxin_info: "当体力值为1的一名其他角色受到伤害时,你可以将武将牌翻面并弃置一张装备牌,然后防止此伤害。", - oldrenxin_info: "其他角色进入濒死状态时,你可以将所有手牌交给该角色并翻面,然后该角色回复1点体力。", - jingce_info: "出牌阶段结束时,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。", - xinjingce_info: "结束阶段,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。", - xswuyan_info: "锁定技,你使用的普通锦囊牌对其他角色无效;其他角色使用的普通锦囊牌对你无效。", - xinwuyan_info: "锁定技,当你使用锦囊牌造成伤害时,你防止此伤害;锁定技,当你受到锦囊牌对你造成的伤害时,你防止此伤害。", - jujian_info: "出牌阶段限一次,你可以弃至多三张牌,然后令一名其他角色摸等量的牌。若你以此法弃牌不少于三张且均为同一类别,你回复1点体力。", - xinjujian_info: "结束阶段开始时,你可以弃置一张非基本牌并选择一名其他角色,令其选择一项:1.摸两张牌;2.回复1点体力;3.将其武将牌翻转至正面朝上并重置之。", - luoying_info: "当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。", - jiushi_info: "当你需要使用一张【酒】时,若你的武将牌正面朝上,则你可以将武将牌翻面并视为使用了一张【酒】;当你受到伤害时,若你的武将牌背面朝上,则你可在此伤害结算后将武将牌翻回正面。", - jueqing_info: "锁定技,你即将造成的伤害均视为失去体力。", - shangshi_info: "当你的手牌数小于X时,你可以将手牌摸至X张(X为你已损失的体力值)。", - xuanfeng_info: "当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌。", - zhiyu_info: "当你受到伤害后,你可以摸一张牌,然后展示所有手牌。若颜色均相同,你令伤害来源弃置一张手牌。", - qice_info: "出牌阶段限一次,你可以将所有的手牌(至少一张)当做任意一张普通锦囊牌使用。", - jiangchi_info: "摸牌阶段摸牌时,你可以选择一项:1、额外摸一张牌,若如此做,你不能使用或打出【杀】直到回合结束。 2、少摸一张牌,若如此做,你使用【杀】无距离限制且可以多使用一张【杀】直到回合结束。", - zishou_info: "摸牌阶段,你可以额外摸X张牌(X为场上势力数)。然后你于本回合的出牌阶段内使用的牌不能指定其他角色为目标。", - zongshi_info: "锁定技,你的手牌上限+X(X为场上现存势力数)。", - danshou_info: "出牌阶段,你可以选择你攻击范围内的一名其他角色,然后弃置X张牌(X为此前你于此阶段你发动“胆守”的次数+1)。若X:为1,你弃置该角色的一张牌;为2,令该角色交给你一张牌;为3,你对该角色造成1点伤害;不小于4,你与该角色各摸两张牌。", - olddanshou_info: "当你造成伤害后,你可以摸一张牌。若如此做,终止一切结算,当前回合结束。", - xindanshou_info: "①每回合限一次,当你成为基本牌或锦囊牌的目标后,你可以摸X张牌(X为你本回合内成为过基本牌或锦囊牌的目标的次数)。②一名其他角色的结束阶段,若你本回合内没有发动过〖胆守①〗,则你可以弃置X张牌并对其造成1点伤害(X为其手牌数,无牌则不弃)。", - yizhong_info: "锁定技,当你的防具栏为空时,黑色的【杀】对你无效。", - xinzhan_info: "出牌阶段限一次,若你的手牌数大于你的体力上限,你可以观看牌堆顶的三张牌,然后展示其中任意红桃牌并获得之。", - huilei_info: "锁定技,当你死亡时,杀死你的角色弃置所有的牌。", - enyuan_info: "锁定技。①当其他角色令你回复1点体力后,该角色摸一张牌。②当其他角色对你造成伤害后,其须交给你一张♥手牌,否则失去1点体力。", - xuanhuo_info: "出牌阶段限一次,你可以将一张红桃手牌交给一名其他角色,获得该角色的一张牌,然后交给除该角色外的一名其他角色。", - ganlu_info: "出牌阶段限一次,你可以选择两名装备区内装备数之差不大于X的角色,令其交换装备区内的牌(X为你已损失的体力值)。", - buyi_info: "当有角色进入濒死状态时,你可以展示该角色的一张手牌:若此牌不为基本牌,则该角色弃置此牌并回复1点体力。", - mingce_info: "出牌阶段,你可以交给一名其他角色一张装备牌或【杀】,然后令该角色选择一项:1. 视为对其攻击范围内的另一名由你指定的角色使用一张【杀】。2. 摸一张牌。每回合限一次。", - zhichi_info: "锁定技,当你于回合外受到伤害后,所有【杀】或普通锦囊牌对你无效直到回合结束。", - zhichi2_info: "智迟已发动", - pojun_info: "当你使用【杀】造成伤害后,你可以令受伤角色摸X张牌,然后其翻面(X为该角色的体力值且至多为5)。", - shiyong: "恃勇", - shiyong_info: "锁定技,当你受到一次红色【杀】或【酒】【杀】造成的伤害后,须减1点体力上限。", - old_guanzhang: "旧关兴张苞", - old_guanzhang_prefix: "旧", - wangyi: "王异", - oldqianxi: "潜袭", - oldqianxi_info: "当你使用【杀】对距离为1的目标角色造成伤害时,你可以进行一次判定,若判定结果不为红桃,你防止此伤害,令其减1点体力上限。", - oldzhenlie: "贞烈", - oldzhenlie_info: "在你的判定牌生效前,你可以亮出牌堆顶的一张牌代替之。", - oldmiji: "秘计", - oldmiji_info: "准备/结束阶段开始时,若你已受伤,你可以判定,若判定结果为黑色,你观看牌堆顶的X张牌(X为你已损失的体力值),然后将这些牌交给一名角色。", - old_fuhun: "父魂", - old_fuhun_info: "摸牌阶段开始时,你可以放弃摸牌,改为从牌堆顶亮出两张牌并获得之,若亮出的牌颜色不同,你获得〖武圣〗和〖咆哮〗直到回合结束。", - rejueqing: "绝情", - rejueqing_info: "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力并修改〖绝情〗(X为伤害值)。", - rejueqing_1st: "绝情", - rejueqing_rewrite: "绝情·改", - rejueqing_rewrite_info: "锁定技,你即将造成的伤害均视为失去体力。", - reshangshi: "伤逝", - reshangshi_2nd: "伤逝", - reshangshi_info: "当你受到伤害时,你可以弃置一张牌。当你的手牌数小于X时,你可以将手牌摸至X张。(X为你已损失的体力值)", - rejingce: "精策", - rejingce2: "精策", - rejingce_add: "精策", - rejingce_info: "当你于一回合内首次使用某种花色的手牌时,你的手牌上限+1。出牌阶段结束时,你可以摸X张牌(X为你本阶段内使用过的牌的类型数)。", - xinkuangbi: "匡弼", - xinkuangbi_info: "出牌阶段限一次。你可以令一名其他角色交给你至多三张牌(不计入你本回合的手牌上限)。然后其于其的下回合开始时摸等量的牌。", - xinzhaofu: "诏缚", - xinzhaofu_info: "主公技,限定技。出牌阶段,你可选择至多两名其他角色。这两名角色视为在所有其他吴势力角色的攻击范围内。", - olbingyi: "秉壹", - olbingyi_info: "每阶段限一次。当你因弃置而失去牌后,你可以展示所有手牌。若这些牌的颜色均相同,则你可以与至多X名其他角色各摸一张牌(X为你的手牌数)。", - lukai: "陆凯", - lukai_spade: "♠", - lukai_spade_bg: "♠️", - lukai_heart: "♥", - lukai_heart_bg: "♥️", - lukai_club: "♣", - lukai_club_bg: "♣", - lukai_diamond: "♦", - lukai_diamond_bg: "♦️️", - lkbushi: "卜筮", - lkbushi_info: "①你使用♠牌无次数限制。②当你使用或打出♥牌后,你摸一张牌。③当你成为♣牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张♦牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。", - lkzhongzhuang: "忠壮", - lkzhongzhuang_info: "锁定技。①当你因执行【杀】的效果而造成伤害时,若你的攻击范围大于3,则此伤害+1。②当一名角色受到你因执行【杀】的效果而造成的伤害时,若你的攻击范围小于3,则此伤害改为1。", - kebineng: "轲比能", - kousheng: "寇旌", - kousheng_info: "①出牌阶段开始时,你可以选择任意张手牌,这些牌称为“寇旌”直到回合结束。②你的“寇旌”均视为【杀】且无次数限制。③当你因执行对应实体牌包含“寇旌”的【杀】的效果而造成伤害后,你展示所有“寇旌”牌,然后目标角色可以用所有手牌交换这些牌。", - zhugeshang: "诸葛尚", - sangu: "三顾", - sangu_info: "结束阶段,你可以选择至多三个{【杀】或不为notarget或singleCard的普通锦囊牌}中的牌名,然后令一名其他角色记录这些牌名。该角色的下个出牌阶段开始时,其的手牌于其需要使用牌时均视为其记录中的第一张牌直到此阶段结束,且当其使用或打出有对应实体牌的牌时,移除这些牌中的第一张牌。若你以此法选择过的牌名均为你本回合内使用过的牌名,则防止你因其以此法使用牌造成的伤害。", - yizu: "轶祖", - yizu_info: "锁定技。每回合限一次,当你成为【杀】或【决斗】的目标后,若你的体力值不大于使用者的体力值,则你回复1点体力。", - liwan: "李婉", - liandui: "联对", - liandui_info: "①当你使用牌时,若本局游戏内上一张被使用的牌的使用者不为你,你可以令其摸两张牌。②其他角色使用牌时,若本局游戏内上一张被使用的牌的使用者为你,其可以令你摸两张牌。", - biejun: "别君", - biejun_info: "①其他角色的出牌阶段限一次。其可以将一张手牌交给你。②每回合限一次。当你受到伤害时,若你手牌中没有本回合因〖别君①〗得到的牌,你可以翻面并防止此伤害。", - yj_sufei: "苏飞", - shuojian: "数谏", - shuojian_info: "出牌阶段限三次。你可以交给一名其他角色一张牌,其选择一项:1.令你摸X张牌并弃置X-1张牌;2.视为使用X张【过河拆桥】,然后此技能本回合失效(X为此技能本阶段剩余发动次数+1)。", - yj_qiaozhou: "谯周", - shiming: "识命", - shiming_info: "每轮限一次。一名角色的摸牌阶段,你可以观看牌堆顶的三张牌,并可以将其中一张置于牌堆底。然后该角色可以改为对自己造成1点伤害,然后从牌堆底摸三张牌。", - jiangxi: "将息", - jiangxi_info: "一名角色的回合结束时,若一号位于此回合内进入过濒死状态或未受到过伤害,你可以重置〖识命〗并摸一张牌;若所有角色均未受到过伤害,你可以与当前回合角色各摸一张牌。", - hanlong: "韩龙", - duwang: "独往", - duwang_info: "锁定技。①游戏开始时,你从牌堆顶将五张不为【杀】的牌置于武将牌上,称为“刺”。②若你有牌名不为【杀】“刺”,你至其他角色或其他角色至你的距离+1。", - cibei: "刺北", - cibei_info: "①当一名角色使用【杀】造成伤害且此牌对应的实体牌进入弃牌堆后,你可以将一张不为【杀】的“刺”置入弃牌堆,并将这些牌置入“刺”,然后弃置一名角色区域里的一张牌。②一名角色的回合结束时,若你的“刺”均为【杀】,你获得所有“刺”,且这些牌不能被弃置,不计入手牌上限,且当你使用对应实体牌包含这些牌的牌时无次数和距离限制。", - wuanguo: "武安国", - diezhang: "叠嶂", - diezhang_info: "转换技。①出牌阶段,你使用杀的次数上限+1。②阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用X张【杀】;阳:当其他角色使用牌被你抵消后,你可以摸X张牌,视为对其使用一张【杀】(X为1)。", - duanwan: "断腕", - duanwan_info: "限定技。当你处于濒死状态时,你可以将体力回复至2点,然后删除〖叠嶂①〗和当前转换技状态的〖叠嶂②〗分支,并将〖叠嶂〗修改为“每回合限一次”且将X修改为2。", - dcduliang: "督粮", - dcduliang2: "督粮", - dcduliang_info: "出牌阶段限一次。你可以获得一名其他角色的一张牌,然后选择一项:1.你观看牌堆顶的两张牌,然后令其获得其中的一或两张基本牌;2.令其于下回合的摸牌阶段额外摸一张牌。", - sunli: "孙礼", - kangli: "伉厉", - kangli_info: "当你造成或受到伤害后,你摸两张牌。然后你下次造成伤害时弃置这些牌。", - xiahoumao: "夏侯楙", - tongwei: "统围", - tongwei_info: "出牌阶段限一次。你可以重铸两张牌并指定一名其他角色,当其使用的下一张牌结算结束后,若此牌点数在你上次以此法重铸的牌的点数之间,你视为对其使用一张【杀】或【过河拆桥】。", - cuguo: "蹙国", - cuguo_info: "锁定技。当你于一回合使用牌首次被抵消后,你弃置一张牌,视为对此牌的目标角色使用一张该被抵消的牌。此牌结算结束后,若此牌被抵消,你失去1点体力。", - chenshi: "陈式", - qingbei: "擎北", - qingbei_info: "一轮游戏开始时,你可以选择任意种花色,你不能于本轮内使用这些花色的牌。然后当你于本轮使用一张有花色的牌结算结束后,你摸等同于你上一次〖擎北〗选择过的花色数的牌。", - feiyao: "费曜", - zhenfeng: "镇锋", - zhenfeng_info: "每回合限一次。当其他角色于其回合内使用牌时,若其手牌数不大于其体力值,你可以猜测其手牌中与此牌类别相同的牌数。若你猜对,你摸X张牌并视为对其使用一张【杀】(X为你连续猜对的次数且至多为5);若你猜错且差值大于1,其视为对你使用一张【杀】。", - linghuyu: "令狐愚", - yj_simafu: "司马孚", - yj_xuangongzhu: "宣公主", - xukun: "徐琨", - xvzhi: "蓄志", - xvzhi_info: "出牌阶段限一次,你可令两名角色各选择任意张手牌并交换这些牌,然后获得牌数较少的角色视为使用无视距离的【杀】;若获得牌数相等,你摸两张牌且可以对此阶段未以此法选择过的角色再发动一次〖蓄志〗。", - beiyu: "备预", - beiyu_info: "出牌阶段限一次,你可将手牌摸至体力上限,然后你将一种花色的所有手牌置于牌堆底。", - duchi: "督持", - duchi_info: "每回合限一次,当你成为其他角色使用牌的目标后,你可从牌堆底摸一张牌并展示所有手牌,若颜色均相同,则此牌对你无效。", - yjqimei: "齐眉", - yjqimei_info: "出牌阶段限一次,你可以选择一名其他角色,你与其各摸两张牌并弃置两张牌,然后你根据你与其弃置牌的花色总数执行以下效果:1、你依次使用这些弃置的牌中可以使用的牌;2、你与其复原武将牌;3、你与其横置武将牌;4、你与其各摸一张牌,然后你修改〖齐眉〗为“出牌阶段限两次”直到回合结束。", - yjzhuiji: "追姬", - yjzhuiji_info: "当你死亡时,你可以令一名角色从牌堆和弃牌堆中的随机使用任意装备牌直至其没有空置的装备栏。若如此做,当其失去以此法使用的装备牌后,其废除对应的装备栏。", - fazhu: "筏铸", - fazhu_info: "准备阶段,你可以重铸你的区域内的所有非伤害牌,然后将以此法获得的牌交给至多等量名角色各一张,这些角色可以依次使用一张无距离限制的【杀】。", - - yijiang_2011: "一将成名2011", - yijiang_2012: "一将成名2012", - yijiang_2013: "一将成名2013", - yijiang_2014: "一将成名2014", - yijiang_2015: "一将成名2015", - yijiang_2016: "原创设计2016", - yijiang_2017: "原创设计2017", - yijiang_2022: "原创设计2022", - yijiang_2023: "一将成名2023", - yijiang_2024: "一将成名2024", - }, - }; -}); diff --git a/character/yijiang/card.js b/character/yijiang/card.js new file mode 100644 index 000000000..1fd2fa8b3 --- /dev/null +++ b/character/yijiang/card.js @@ -0,0 +1,10 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + lukai_spade: { fullskin: true }, + lukai_heart: { fullskin: true }, + lukai_diamond: { fullskin: true }, + lukai_club: { fullskin: true }, +}; + +export default cards; diff --git a/character/yijiang/character.js b/character/yijiang/character.js new file mode 100644 index 000000000..90786887b --- /dev/null +++ b/character/yijiang/character.js @@ -0,0 +1,102 @@ +const characters = { + xiahoumao: ["male", "wei", 4, ["tongwei", "cuguo"]], + chenshi: ["male", "shu", 4, ["qingbei"]], + sunli: ["male", "wei", 4, ["kangli"]], + feiyao: ["male", "wei", 4, ["zhenfeng"]], + wuanguo: ["male", "qun", 4, ["diezhang", "duanwan"]], + hanlong: ["male", "wei", 4, ["duwang", "cibei"]], + yj_qiaozhou: ["male", "shu", 3, ["shiming", "jiangxi"]], + yj_sufei: ["male", "wu", 4, ["shuojian"]], + liwan: ["female", "wei", 3, ["liandui", "biejun"]], + zhugeshang: ["male", "shu", 3, ["sangu", "yizu"]], + kebineng: ["male", "qun", 4, ["kousheng"]], + lukai: ["male", "wu", 4, ["lkbushi", "lkzhongzhuang"]], + xin_fazheng: ["male", "shu", 3, ["xinxuanhuo", "xinenyuan"]], + guanzhang: ["male", "shu", 4, ["fuhun"]], + wangyi: ["female", "wei", 3, ["zhenlie", "miji"]], + caozhang: ["male", "wei", 4, ["new_jiangchi"]], + guohuai: ["male", "wei", 4, ["rejingce"]], + zhangchunhua: ["female", "wei", 3, ["jueqing", "shangshi"]], + caozhi: ["male", "wei", 3, ["luoying", "jiushi"]], + caochong: ["male", "wei", 3, ["chengxiang", "renxin"]], + xunyou: ["male", "wei", 3, ["qice", "zhiyu"], ["clan:颍川荀氏"]], + xin_xushu: ["male", "shu", 3, ["xinwuyan", "xinjujian"], ["border:wei"]], + xin_masu: ["male", "shu", 3, ["olsanyao", "rezhiman"]], + zhuran: ["male", "wu", 4, ["danshou"]], + xusheng: ["male", "wu", 4, ["xinpojun"]], + wuguotai: ["female", "wu", 3, ["ganlu", "buyi"]], + lingtong: ["male", "wu", 4, ["xuanfeng"]], + liubiao: ["male", "qun", 3, ["rezishou", "zongshi"]], + yufan: ["male", "wu", 3, ["zhiyan", "zongxuan"]], + chengong: ["male", "qun", 3, ["mingce", "zhichi"]], + bulianshi: ["female", "wu", 3, ["old_anxu", "zhuiyi"]], + handang: ["male", "wu", 4, ["gongji", "jiefan"]], + fuhuanghou: ["female", "qun", 3, ["qiuyuan", "zhuikong"]], + zhonghui: ["male", "wei", 4, ["quanji", "zili"], ["clan:颍川钟氏"]], + jianyong: ["male", "shu", 3, ["qiaoshui", "jyzongshi"]], + old_madai: ["male", "shu", 4, ["mashu", "qianxi"]], + liufeng: ["male", "shu", 4, ["xiansi"]], + manchong: ["male", "wei", 3, ["junxing", "yuce"]], + chenqun: ["male", "wei", 3, ["pindi", "faen"]], + sunluban: ["female", "wu", 3, ["chanhui", "jiaojin"]], + guyong: ["male", "wu", 3, ["shenxing", "olbingyi"]], + caifuren: ["female", "qun", 3, ["qieting", "xianzhou"]], + yj_jushou: ["male", "qun", 3, ["jianying", "shibei"]], + zhangsong: ["male", "shu", 3, ["qiangzhi", "xiantu"]], + zhuhuan: ["male", "wu", 4, ["fenli", "pingkou"]], + xiahoushi: ["female", "shu", 3, ["qiaoshi", "yanyu"]], + + panzhangmazhong: ["male", "wu", 4, ["duodao", "anjian"]], + zhoucang: ["male", "shu", 4, ["xinzhongyong"]], + guanping: ["male", "shu", 4, ["longyin"]], + liaohua: ["male", "shu", 4, ["dangxian", "fuli"]], + chengpu: ["male", "wu", 4, ["lihuo", "chunlao"]], + gaoshun: ["male", "qun", 4, ["xinxianzhen", "jinjiu"]], + caozhen: ["male", "wei", 4, ["xinsidi"]], + wuyi: ["male", "shu", 4, ["benxi"], ["clan:陈留吴氏"]], + hanhaoshihuan: ["male", "wei", 4, ["shenduan", "yonglve"]], + + caorui: ["male", "wei", 3, ["huituo", "mingjian", "xingshuai"], ["zhu"]], + caoxiu: ["male", "wei", 4, ["qianju", "qingxi"]], + zhongyao: ["male", "wei", 3, ["huomo", "zuoding"], ["clan:颍川钟氏"]], + liuchen: ["male", "shu", 4, ["zhanjue", "qinwang"], ["zhu"]], + zhangyi: ["male", "shu", 4, ["wurong", "shizhi"]], + sunxiu: ["male", "wu", 3, ["yanzhu", "xingxue", "xinzhaofu"], ["zhu"]], + zhuzhi: ["male", "wu", 4, ["xinanguo"]], + quancong: ["male", "wu", 4, ["yaoming"]], + gongsunyuan: ["male", "qun", 4, ["huaiyi"]], + guotufengji: ["male", "qun", 3, ["jigong", "shifei"]], + + xin_liru: ["male", "qun", 3, ["xinjuece", "xinmieji", "xinfencheng"]], + + guohuanghou: ["female", "wei", 3, ["jiaozhao", "danxin"]], + liuyu: ["male", "qun", 2, ["xinzhige", "xinzongzuo"]], + liyan: ["male", "shu", 3, ["dcduliang", "fulin"]], + sundeng: ["male", "wu", 4, ["kuangbi"]], + + cenhun: ["male", "wu", 4, ["jishe", "lianhuo"]], + huanghao: ["male", "shu", 3, ["qinqing", "huisheng"]], + zhangrang: ["male", "qun", 3, ["taoluan"], ["sex:male_castrated"]], + sunziliufang: ["male", "wei", 3, ["guizao", "jiyu"]], + + xinxianying: ["female", "wei", 3, ["zhongjian", "caishi"]], + wuxian: ["female", "shu", 3, ["fumian", "daiyan"], ["clan:陈留吴氏"]], + xushi: ["female", "wu", 3, ["wengua", "fuzhu"]], + caojie: ["female", "qun", 3, ["shouxi", "huimin"]], + + caiyong: ["male", "qun", 3, ["bizhuan", "tongbo"]], + jikang: ["male", "wei", 3, ["qingxian", "juexiang"]], + qinmi: ["male", "shu", 3, ["jianzheng", "zhuandui", "tianbian"]], + xuezong: ["male", "wu", 3, ["funan", "xinjiexun"]], + + old_huaxiong: ["male", "qun", 6, ["shiyong"]], + + yujin: ["male", "wei", 4, ["rezhenjun"], []], + + linghuyu: ["male", "wei", 4, ["xvzhi"]], + yj_simafu: ["male", "wei", 3, ["beiyu", "duchi"]], + yj_xuangongzhu: ["female", "wei", 3, ["yjqimei", "yjzhuiji"]], + xukun: ["male", "wu", 4, ["fazhu"]], +}; + +export default characters; diff --git a/character/yijiang/characterFilter.js b/character/yijiang/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/yijiang/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/yijiang/characterReplace.js b/character/yijiang/characterReplace.js new file mode 100644 index 000000000..171d751e4 --- /dev/null +++ b/character/yijiang/characterReplace.js @@ -0,0 +1,75 @@ +const characterReplaces = { + caozhi: ["caozhi", "dc_caozhi", "re_caozhi", "ps_caozhi"], + zhangchunhua: ["zhangchunhua", "re_zhangchunhua"], + yujin: ["yujin", "yujin_yujin", "ol_yujin", "sb_yujin", "xin_yujin", "re_yujin"], + dc_xushu: ["re_xushu", "dc_xushu"], + xushu: ["xin_xushu", "xushu"], + fazheng: ["xin_fazheng", "re_fazheng", "sb_fazheng", "tw_re_fazheng", "fazheng"], + masu: ["xin_masu", "re_masu", "masu"], + xusheng: ["xusheng", "xin_xusheng", "re_xusheng", "old_xusheng"], + wuguotai: ["wuguotai", "xin_wuguotai", "re_wuguotai"], + lingtong: ["lingtong", "xin_lingtong", "ol_lingtong", "re_lingtong", "old_lingtong"], + gaoshun: ["gaoshun", "xin_gaoshun", "ol_gaoshun", "re_gaoshun", "sb_gaoshun", "old_gaoshun"], + zhonghui: ["zhonghui", "xin_zhonghui", "re_zhonghui", "old_zhonghui", "pe_zhonghui"], + wangyi: ["wangyi", "ol_wangyi", "re_wangyi", "old_wangyi"], + caozhang: ["caozhang", "ol_caozhang", "re_caozhang", "xin_caozhang"], + guanzhang: ["guanzhang", "re_guanzhang", "old_guanzhang"], + madai: ["old_madai", "re_madai", "tw_madai", "madai"], + liaohua: ["liaohua", "re_liaohua", "xin_liaohua"], + bulianshi: ["bulianshi", "dc_bulianshi", "re_bulianshi", "old_bulianshi"], + handang: ["handang", "xin_handang", "re_handang", "tw_handang", "old_handang"], + chengpu: ["chengpu", "ol_chengpu", "re_chengpu", "xin_chengpu", "tw_chengpu", "ns_chengpu"], + liubiao: ["liubiao", "xin_liubiao", "re_liubiao", "sb_liubiao", "oldre_liubiao", "old_liubiao"], + manchong: ["manchong", "re_manchong"], + caochong: ["caochong", "re_caochong", "old_caochong"], + guohuai: ["guohuai", "re_guohuai", "xin_guohuai", "tw_guohuai", "ol_guohuai"], + jianyong: ["jianyong", "ol_jianyong", "re_jianyong", "xin_jianyong"], + panzhangmazhong: ["panzhangmazhong", "re_panzhangmazhong", "xin_panzhangmazhong"], + yufan: ["yufan", "ol_yufan", "xin_yufan", "re_yufan"], + zhuran: ["zhuran", "re_zhuran", "xin_zhuran", "old_zhuran"], + liru: ["xin_liru", "dc_liru", "re_liru", "yj_liru", "+liru"], + fuhuanghou: ["fuhuanghou", "re_fuhuanghou", "xin_fuhuanghou", "old_fuhuanghou"], + chenqun: ["chenqun", "dc_chenqun", "re_chenqun", "old_chenqun"], + hanhaoshihuan: ["hanhaoshihuan", "re_hanhaoshihuan"], + caozhen: ["caozhen", "re_caozhen", "xin_caozhen", "old_caozhen"], + wuyi: ["wuyi", "re_wuyi", "xin_wuyi"], + sunluban: ["re_sunluban", "xin_sunluban", "sunluban"], + zhuhuan: ["re_zhuhuan", "xin_zhuhuan", "zhuhuan", "old_zhuhuan"], + caoxiu: ["caoxiu", "re_caoxiu", "xin_caoxiu", "tw_caoxiu", "old_caoxiu"], + xiahoushi: ["xiahoushi", "re_xiahoushi", "sb_xiahoushi"], + zhangyi: ["zhangyi", "re_zhangyi", "xin_zhangyi"], + quancong: ["quancong", "re_quancong", "xin_quancong", "old_quancong"], + sunxiu: ["sunxiu", "re_sunxiu", "xin_sunxiu"], + zhuzhi: ["zhuzhi", "re_zhuzhi", "xin_zhuzhi", "old_zhuzhi"], + liuyu: ["liuyu", "dc_liuyu", "ol_liuyu"], + zhangrang: ["zhangrang", "ol_zhangrang", "junk_zhangrang"], + jikang: ["jikang", "re_jikang", "dc_jikang"], + xinxianying: ["xinxianying", "re_xinxianying", "ol_xinxianying", "sp_xinxianying"], + gongsunyuan: ["gongsunyuan", "re_gongsunyuan"], + zhoucang: ["zhoucang", "re_zhoucang", "xin_zhoucang"], + guotufengji: ["guotufengji", "re_guotufengji"], + guanping: ["guanping", "re_guanping"], + caifuren: ["caifuren", "re_caifuren", "xin_caifuren"], + guyong: ["guyong", "re_guyong", "xin_guyong", "tw_guyong"], + yj_jushou: ["yj_jushou", "re_jushou", "xin_jushou"], + guohuanghou: ["guohuanghou", "re_guohuanghou"], + liuchen: ["liuchen", "re_liuchen"], + liufeng: ["liufeng", "re_liufeng"], + sundeng: ["sundeng", "re_sundeng", "ns_sundeng"], + caiyong: ["caiyong", "re_caiyong"], + chengong: ["chengong", "re_chengong", "sb_chengong"], + xunyou: ["xunyou", "re_xunyou", "clan_xunyou"], + xuezong: ["xuezong", "tw_xuezong"], + huanghao: ["huanghao", "dc_huanghao", "old_huanghao"], + caorui: ["caorui", "re_caorui", "old_caorui"], + sunziliufang: ["sunziliufang", "dc_sunziliufang"], + liyan: ["liyan", "old_liyan"], + zhangsong: ["zhangsong", "re_zhangsong"], + zhongyao: ["zhongyao", "re_zhongyao"], + liwan: ["ol_liwan", "liwan"], + wuxian: ["wuxian", "clan_wuxian"], + simafu: ["simafu", "yj_simafu"], + xuangongzhu: ["yj_xuangongzhu", "xuangongzhu"], +}; + +export default characterReplaces; diff --git a/character/yijiang/dynamicTranslate.js b/character/yijiang/dynamicTranslate.js new file mode 100644 index 000000000..3f5ae03fd --- /dev/null +++ b/character/yijiang/dynamicTranslate.js @@ -0,0 +1,49 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = { + rejueqing(player) { + if (player.storage.rejueqing_rewrite) return "锁定技,你即将造成的伤害均视为失去体力。"; + return "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。"; + }, + reyanzhu(player) { + if (!player.storage.reyanzhu) return "出牌阶段限一次,你可以令一名其他角色选择一项:将装备区里的所有牌交给你并令你修改〖宴诛〗和〖兴学〗,或弃置一张牌并令下一次受到的伤害+1直到其下回合开始。"; + return "出牌阶段限一次,你可以选择一名其他角色。该角色下一次受到的伤害+1直到其下回合开始。"; + }, + rexingxue(player) { + if (player.storage.reyanzhu) return "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力上限)。"; + return "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力值)。"; + }, + jiaozhao(player) { + var num = player.countMark("xindanxin"); + if (num > 2) return "出牌阶段限两次,你可以将一张手牌当做任意基本牌或普通锦囊牌使用(你不能对自己使用此牌)。"; + if (num > 1) return "出牌阶段限一次,你可以将一张手牌当做任意基本牌或普通锦囊牌使用(你不能对自己使用此牌)。"; + if (num > 0) return "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌或普通锦囊牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌,且此牌不可被【无懈可击】响应)。"; + return "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌,且此牌不可被【无懈可击】响应)。"; + }, + funan(player) { + if (player.hasSkill("funan_jiexun")) return "其他角色使用或打出牌响应你使用的牌时,你可获得其使用或打出的牌。"; + return "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。"; + }, + lkbushi(player) { + var list = lib.skill.lkbushi.getBushi(player).map(i => get.translation(i)); + return "①你使用" + list[0] + "牌无次数限制。②当你使用或打出" + list[1] + "牌后,你摸一张牌。③当你成为" + list[2] + "牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张" + list[3] + "牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。"; + }, + diezhang(player) { + var str = ""; + str += player.storage.duanwan ? "" : "①出牌阶段,你使用杀的次数上限+1。②"; + str += "转换技" + (player.storage.duanwan ? ",每回合限一次" : "") + "。"; + var cnNum = get.cnNumber(player.storage.duanwan ? 2 : 1); + var yinStr = "阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用" + cnNum + "张【杀】"; + var yangStr = "阳:当其他角色使用牌被你抵消后,你可以摸" + cnNum + "张牌,视为对其使用一张【杀】"; + if (player.storage.diezhang) { + if (player.storage.duanwan) yinStr = '' + yinStr + ""; + yangStr = '' + yangStr + ""; + } else { + yinStr = '' + yinStr + ""; + if (player.storage.duanwan) yangStr = '' + yangStr + ""; + } + return str + yinStr + ";" + yangStr + "。"; + }, +}; + +export default dynamicTranslates; diff --git a/character/yijiang/index.js b/character/yijiang/index.js new file mode 100644 index 000000000..70722c5cc --- /dev/null +++ b/character/yijiang/index.js @@ -0,0 +1,35 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "yijiang", + connect: true, + // connectBanned:['qinmi'], + character: { ...characters }, + characterSort: { + yijiang: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/yijiang/intro.js b/character/yijiang/intro.js new file mode 100644 index 000000000..008242b95 --- /dev/null +++ b/character/yijiang/intro.js @@ -0,0 +1,87 @@ +const characterIntro = { + linghuyu: "令狐愚(?-249年),字公治,太原人。曹魏时期将领, 原名浚。太尉王凌的外甥,弘农太守令狐邵之侄。黄初年间出任和戎护军,后任曹爽府长史、兖州刺史。嘉平年间,与王凌一起密谋废除曹芳,共立楚王曹彪,事未行而病卒。嘉平三年(251年),事泄,王凌服毒自尽,与此事相连者,皆夷三族。王凌及令狐愚被开棺暴尸三日, 亲土埋之。", + xukun: "徐琨,字号不详,吴郡富春县(今浙江省杭州市富阳区)人。三国时期吴国开国功臣,武烈皇帝孙坚的外甥,吴大帝孙权的表兄弟,徐夫人的生父。出身吴郡豪门,最初担任郡吏。投靠舅舅孙坚,参与征伐董卓有功,拜偏将军。孙坚逝后,追随孙策,攻讨扬州刺史刘繇,采取奇袭作战方式,占领丹阳郡,为孙策开拓江东事业奠定基础,领丹杨太守。适逢吴景归附江东,改授督军中郎将。孙权嗣位后,平定庐江太守李术叛乱,击破皖城,册封广德侯,加号平虏将军。后来,随孙权征讨黄祖,身中流矢,不治而亡。", + sunli: "孙礼(?—250年),字德达,涿郡容城县人。三国时期曹魏名将。曹操平定幽州后,孙礼被征召为司空军谋掾。后被任命为河间郡丞,升至荥阳都尉。后孙礼被调为鲁国相。历任山阳、平原、平昌、琅邪郡太守。从大司马曹休在夹石征吴,孙礼谏其不可深入作战,曹休不听遂战败。后孙礼调任阳平郡太守。明帝时入为尚书,受遗诏拜大将军长史,加散骑常侍。曹爽令孙礼出任扬州刺史,加管伏波将军,赐爵关内侯。孙礼率兵御东吴军队,奋不顾身,贼众乃退。朝廷赐绢七百匹,孙礼皆以绢付亡者家,无以入身。后征拜少府,出为荆州刺史,迁冀州牧。爽见礼奏,大怒,劾礼怨望,结刑五岁。在家期年,众人多以为言,除城门校尉。出为并州刺史,加振武将军,使持节,护匈奴中郎将。爽诛后,入为司隶校尉。迁司空,封大利亭侯,邑一百户。嘉平二年(250年),孙礼去世,谥号景侯。其孙孙元继承爵位。《全三国文》录有孙礼文一篇《清河平原争界案图宜属平原疏》。陈寿评曰“孙礼刚断伉厉”。", + xiahoumao: "夏侯楙,字子林,沛国谯县(今安徽省亳州市)人,曹魏名将夏侯惇之子,三国时期魏国官员、将领,其妻为曹操之女清河公主。在魏国历任侍中、尚书、安西将军、镇东将军,假节,封列侯。曾一度驻守曹魏都城长安,但蜀汉北伐后就被调离。", + chenshi: "陈式,生卒年不详,三国时期蜀汉将领。最初为刘备军中重要的基层指挥官,后成长为高级将领。在诸葛亮第三次北伐期间,在诸葛亮的军事指挥下攻克了魏国的武都、阴平二郡。", + feiyao: "费曜(生卒年不详),又作费瑶、费繇,三国时期曹魏将领。魏初,参与平河西之乱。明帝时官任后将军,跟随曹真、司马懿多次对抗蜀汉。《三国演义》中作“费耀”,随曹真和诸葛亮的第二次北伐军作战。怀疑姜维作内应是假,自告奋勇替曹真出征,结果被事先埋伏的姜维包围,自尽而死。", + wuanguo: "武安国,历史小说《三国演义》中人物,是北海太守孔融的部将,兵器为一把长柄铁锤,重五十余斤。诸侯伐董时,双方于虎牢关相峙,吕布撰战,一合而斩穆顺,关东军大惊。北海太守孔融部将武安国,使铁锤飞马而出,吕布挥戟拍马来迎,战到十余合,一戟砍断安国手腕,安国弃锤于地而走,八路军兵齐出,这才救了他性命。", + hanlong: "韩龙,汉末三国时期刺客。韩龙使得魏国北方边得到数十年的安宁,减少魏国的军政压力,得以休养生息。太和二年,豫遣译夏舍诣比能女婿郁筑鞬部,舍为鞬所杀。其秋,豫将西部鲜卑蒲头、泄归泥出塞讨郁筑鞬,大破之。还至马城,比能自将三万骑围豫七日。上谷太守阎志,阎柔之弟也,素为鲜卑所信。志往解喻,即解围去。后幽州刺史王雄并领校尉,抚以恩信。比能数款塞,诣州奉贡献。至青龙元年,比能诱纳步度根,使叛并州,与结和亲,自勒万骑迎其累重於陉北。并州刺史毕轨遣将军苏尚、董弼等击之,比能遣子将骑与尚等会战於楼烦,临陈害尚、弼。至三年中,雄遣勇士韩龙刺杀比能,更立其弟。", + liwan: "李婉(生卒年不详),字淑文,里居不详,贾充之妻,魏晋时期才女,约景元年间(260年前后)在世。著有《典戒》。《隋书·经籍志》载李婉有文集一卷,今失传。", + zhugeshang: "诸葛尚(244年2月-263年11月),琅琊阳都(今山东沂南)人,诸葛瞻长子,诸葛亮之孙。诸葛尚博览兵书且精通武艺。炎兴元年(公元263年),出任先锋,抗拒魏国大将邓艾,与其父诸葛瞻同战死于绵竹,时年十九岁。", + kebineng: "轲比能(?~235年),为中国三国时期的鲜卑首领之一。轲比能出身鲜卑支部,因他作战勇敢,执法公平,不贪财物,所以被鲜卑民众推举为大人。轲比能因其部落近塞,所以他抓住有利条件积极学习汉族先进技术和文化,促进了鲜卑族的进步和北方的民族融合。轲比能统率下的部众,战守有法,战斗力相当强大。自曹操北征后向曹氏进贡表示效忠。魏文帝时,轲比能受封附义王。轲比能在进行部落统一战争时,受魏国干涉,受沉重打击,于是对魏怀贰,献书魏帝表忠,以麻痹魏庭,使之放松警惕。此后,轲比能的部众变得强盛,控弦十余万骑,为害魏国边境。每次钞略得财物,轲比能都公开透明地均平分配,所以得部众死力,各部大人都敬畏之。实力强大后,他继续部落统一战争,于是威行诸部落,建立起强大的鲜卑族政权。深感威胁的魏国幽州刺史王雄派刺客韩龙将其刺杀,其政权立刻崩溃,鲜卑民族再次陷入混战。", + lukai: "陆凯(198-269年),字敬风,吴郡吴县(今江苏省苏州市)人。三国时期吴国重臣,丞相陆逊的族侄,大司马陆抗的族兄。黄武年间,举孝廉出身,曾任永兴县长、诸暨县长,颇有治绩。拜建武都尉、儋耳太守,与聂友率军讨伐朱崖和儋耳,迁建武校尉。五凤二年(255年),讨斩零陵山贼陈毖,拜偏将军、巴丘督,册封都乡侯。迁武昌右部督,随军进入寿春。后拜荡魏将军,加号绥远将军。吴景帝孙休继位,拜征北将军、假节、领豫州牧。孙皓即位,迁任镇西大将军,都督巴丘,又领荆州牧,进封嘉兴侯。宝鼎元年(266年),迁左丞相。以正直及屡次劝谏孙皓而闻名。建衡元年(269年),去世,时年七十二。", + caozhi: "字子建,沛国谯人,三国曹魏著名文学家,建安文学代表人物。魏武帝曹操之子,魏文帝曹丕之弟,生前曾为陈王,去世后谥号“思”,因此又称陈思王。南朝宋文学家谢灵运更有“天下才有一石,曹子建独占八斗”的评价。王士祯尝论汉魏以来二千年间诗家堪称“仙才”者,曹植、李白、苏轼三人耳。", + gaoshun: "中国东汉末年将领,吕布帐下中郎将。史载高顺为人清白有威严,不好饮酒,所统率的部队精锐非常,号称“陷阵营”。屡进忠言于吕布,吕布虽知其忠而不能用。曹操击破吕布后,高顺被曹操所杀。", + chengong: "字公台,东汉末年吕布帐下谋士,东郡东武阳人。性情刚直,足智多谋,年少时与海内知名之士相互结交。192年,陈宫等人主张曹操接任兖州牧。但此后陈宫因曹操杀害边让而与曹操反目,并游说张邈等人背叛曹操迎吕布入兖州,辅助吕布攻打曹操。吕布战败后,随吕布等一同被曹操所擒,决意赴死。", + lingtong: "字公绩,吴郡馀杭人,三国时期吴国名将。凌操之子,官至偏将军。", + masu: "字幼常,襄阳宜城人,三国时期蜀汉大臣,侍中马良之弟。初以荆州从事跟随刘备取蜀入川,曾任绵竹、成都令、越嶲太守。诸葛亮北伐时因作战失误而失守街亭,因而被诸葛亮所斩。", + wuguotai: "吴国太,小说《三国演义》中的人物,不见于正史记载。在小说中,吴国太被描述为孙坚的次妻,孙坚正妻武烈皇后(小说中写作吴太夫人)的妹妹,孙朗、孙仁(孙尚香)的母亲。", + xusheng: "字文向,琅邪莒县人。三国时期吴将。徐盛最初因讨伐山贼有功而被加为中郎将,后于濡须口之战中表现出色,得到孙权的赞赏。魏文帝曹丕伐吴时,徐盛以疑城之计退去魏军。", + yujin: "字文则,泰山钜平人。三国时期曹魏武将。本为鲍信部将,后属曹操,曹操称赞他可与古代名将相比。然而在建安二十四年的襄樊之战中,于禁在败给关羽后投降,致使一代名将晚节不保。", + zhangchunhua: "西晋宣穆皇后张春华(189-247),河内平皋(今河南温县)人。她是晋宣帝司马懿之妻,晋景帝司马师、晋文帝司马昭的母亲。后被追尊为皇后。", + fazheng: "字孝直,本为刘璋部下,刘备围成都时劝说刘璋投降,而后又与刘备进取汉中,献计将曹操大将夏侯渊斩首。法正善奇谋,深受刘备信任和敬重。", + xushu: "字元直,与司马徽、诸葛亮等人为友。先化名单福仕官于新野的刘备,后因曹操囚禁其母而不得不弃备投操,临行前向刘备推荐诸葛亮之才。入曹营后,一言不发,不曾为曹操进献过一计半策。后人形容徐庶“身在曹营心在汉”。", + caozhang: "字子文,是曹操与武宣卞皇后所生第二子,曹丕之弟,曹植之兄,曹魏任城王。曹彰武艺过人,曹操问诸子志向时自言“好为将”,因此得到曹操的赞赏。其胡须黄色,被曹操称为“黄须儿”。", + xunyou: "字公达,颍川颍阴人。东汉末年曹操的五谋臣之一,荀彧从子,被曹操称为“谋主”。官至尚书令。正始五年被追谥为敬侯。", + liaohua: "本名淳,字元俭,襄阳中卢(今湖北襄樊)人。三国时期蜀国后期将领,以勇敢果断著称。廖化是三国时代中经历了魏、蜀、吴整个兴衰过程极少数人中的一个,与严颜、黄忠共称为蜀汉三老将。", + bulianshi: "步夫人(?-238),讳练师,临淮淮阴人。东吴丞相步骘同族,吴大帝孙权之妃,在孙权众夫人中最受孙权的宠爱(宠冠后庭),生有二女:孙鲁班、孙鲁育。赤乌元年卒,追封为皇后,葬于蒋陵。", + chengpu: "字德谋,右北平土垠人。历仕孙坚、孙策、孙权三任君主。孙策死后,他与张昭等人共同辅佐孙权,并讨伐江东境内的山贼,功勋卓著。被人们尊称为“程公”。", + handang: "字义公,辽西令支(今河北迁安)人,吴国将领。韩当因为长于弓箭、骑术并且膂力过人而被孙坚赏识,追随他四处征伐周旋,数次冒险犯难,攻陷敌人、擒拿俘虏。对江东基业的逐渐稳固和吴国的建立有着重要影响。", + liubiao: "刘表,字景升,山阳郡高平(今山东微山)人。东汉末年名士,汉室宗亲,荆州牧,汉末群雄之一。", + zhonghui: "字士季。魏名将,太傅钟繇之子。公元263年,他与邓艾带兵攻打蜀国,最终导致蜀国灭亡。之后钟会设计害死邓艾,联合姜维准备自立,最终因部下反叛失败,与姜维一同死于兵变。", + wangyi: "益州刺史赵昂之妻,赵英、赵月之母。马超作乱凉州时,王异协助丈夫守城,多有功勋,自马超攻冀城至祁山坚守,赵昂曾出奇计九条,王异皆有参与。", + guanzhang: "关兴,名将关羽之子,继承了父亲汉寿亭侯的爵位。年少时即受诸葛亮器重,在蜀汉担任侍中、中监军之职,后在夷陵之战中报了杀父之仇。张苞,张飞的长子,使用父亲的家传蛇矛为兵器,勇猛剽悍不弱其父。", + madai: "名将马超的从弟。早年他曾经从曹操手中死里逃生,后跟随马超大战曹操。后在诸葛亮病逝后受杨仪派遣斩杀了蜀将魏延。曾率领军队出师北伐,被魏将牛金击败而退还。", + caochong: "字仓舒,曹操之子。从小聪明仁爱,与众不同,深受曹操喜爱。留有“曹冲称象”的典故。曹操几次对群臣夸耀他,有让他继嗣之意。可惜曹冲在建安十三病逝,年仅13岁。", + guohuai: "魏国名将,夏侯渊战死时郭淮收集残兵,与杜袭共推张郃为主将而得以稳定局势。曹丕称帝后,赐郭淮爵关内侯,又任镇西长史。诸葛亮伐魏时,郭淮料敌准确,多立战功,而后亦曾击退姜维。", + manchong: "初在曹操手下任许县县令,掌管司法,以执法严格著称;转任汝南太守,开始参与军事,曾参与赤壁之战。后关羽围攻樊城,满宠协助曹仁守城,劝阻了弃城而逃的计划,成功坚持到援军到来。曹丕在位期间,满宠驻扎在新野,负责荆州侧的对吴作战。曹叡在位期间,满宠转任到扬州,接替曹休负责东侧对吴作战,屡有功劳。", + guanping: "关平是关羽在战乱中所收之义子。关羽脱离曹军后,与刘备于关定家中重逢,关定欲使年仅十八岁的关平随关羽同行,刘备便主张让关羽与关平结为义父子。自此后关平随侍在关羽身边,一生东征西讨。他武勇过人,不逊乃父,曾跟随刘备出征西川,立下战功,后来又与曹魏猛将庞德大战三十回合,不分胜负。", + jianyong: "简雍为刘备同乡,年少时与刘备相识。黄巾之乱时,刘备加入对抗黄巾军的战争,简雍便跟随他奔走。常作为谈客,往来使命,刘备围成都时简雍作为刘备使臣成功劝说刘璋投降。简雍擅于辩论、议事。性情简单直接、不拘小节。", + liufeng: "刘备义子。性格刚猛,气力过人。随赵云、张飞等扫荡西川,颇有战功,而后又统领孟达攻取上庸,深为刘备信任。但是后来关羽北伐曹魏,多次要求刘封起兵相助,刘封不从。而后又侵凌孟达,迫其降魏。孟达与魏徐晃共袭刘封,并劝刘封投降,刘封不降,又遭部下叛变,败归成都。刘备在诸葛亮的建议下赐死刘封,刘封自裁,刘备深表痛惜。", + panzhangmazhong: "马忠为潘璋部将。于麦城之战中设伏擒获关羽及关平。刘备伐吴时,马忠随潘璋等往拒,突袭射伤蜀将黄忠,导致黄忠阵亡。不久,潘璋为关兴所杀,马忠领兵围击,击退张苞援军。后降将糜、傅发动兵变,刺杀了马忠,将首级献于刘备。", + yufan: "虞翻初在会稽被太守王朗任命为功曹,曾劝谏王朗躲开孙策未果。后孙策占江东仍任命他为功曹。吕蒙袭取荆州时,虞翻提醒其躲过了埋伏,成功占领城池。后因为直言进谏被孙权发配到交州。", + zhuran: "吴国著名将领,吕蒙白衣渡江取荆州,朱然协助潘璋捉住了关羽。黄武元年,刘备兵伐东吴,朱然与孙桓抵抗刘备大军。后又参加夷陵之战,追击刘备,被前来接应的赵云一枪刺死。", + fuhuanghou: "执金吾伏完之女,汉献帝的皇后,后因怨恨曹操诛董承,与父伏完密谋曹操,事情泄漏,曹将伏皇后禁闭冷宫逼其自缢,所生二位皇子亦被鸩杀。", + liru: "董卓的首席谋士,为董卓所亲信,大小事宜皆与其商议。董卓趁乱进京、说降吕布、废立皇帝、迁都长安等举动,均离不开李儒的参谋之功,并奉命毒杀皇帝刘辩。李傕被曹操击败后,李儒从此不知所踪,消失在历史长河中。", + caozhen: "曹操族子,官至大将军、大司马。其父为曹操招募人马时被州郡所杀,曹操因怜悯曹真少年丧父而待其如亲子一般,因赞赏曹真的勇猛而让他率领虎豹骑。曹真在镇守曹魏西北边境时表现突出,魏文帝时期督众将大破羌胡联军,平定河西;魏明帝时期屡次对抗诸葛亮的北伐。", + hanhaoshihuan: "韩浩和史涣都以忠勇著称,两人皆是曹操心腹将领,共同掌管禁兵。", + chenqun: "陈群一直位居要职,先后受曹操、曹丕托孤,成为魏国重臣,官至司空。其子陈泰,亦是魏国后期名将。最大的贡献为创立了九品中正制,为后期的人才选拔和管理打好了基础。", + wuyi: "初为益州牧刘璋的部将,刘备进攻益州时,泠苞在雒城大败,吴懿自告奋勇,领兵前往救援。不料被赵云和张飞生擒,吴懿于是归降。刘备自称汉中王,迎娶吴懿之妹。诸葛亮出师北伐,吴懿以左将军、高阳侯的身份跟随出征,屡立战功。诸葛亮逝世后,吴懿随姜维一并镇守汉中。", + zhoucang: "原为张宝部将。关羽千里走单骑时,周仓投降关羽,成为了关羽的贴身护卫。建安十六年(公元211年),刘备攻打成都时,周仓跟随关羽镇守荆州。关羽水淹七军时,周仓曾生擒魏军的立义将军庞德,关羽被孙权斩首之后,周仓在麦城大哭失声,拔剑自刎而死。", + zhangsong: "刘璋的部下,长相丑陋但有过目不忘的本领。张松奉命出使许都被曹操赶出,归蜀时为刘备所厚待,于是将西川地理图献予刘备,劝刘备取益州,愿为内应,并派好友孟达、法正帮助刘备。", + sunluban: "孙权之女。孙鲁班与孙权二子孙和不睦。孙权长子孙登死后,孙和被立为太子。孙鲁班向孙权进谗言废孙和太子之位,孙和被废后忧愤而死。", + zhuhuan: "字休穆,吴郡吴县(今江苏苏州)人,吴国名将,官至前将军、青州牧,假节,封为嘉兴侯。有一子朱异。", + guyong: "为蔡邕之徒。其为人少言语,不饮酒,严厉正大,被张纮推荐仕于孙权。孙权任命他为会稽郡丞,行太守事,后不断升迁,官至吴国丞相。顾雍为官,多进良言,有功于吴。", + jushou: "袁绍帐下谋士。史载他“少有大志,擅于谋略”。曾为冀州别驾,举茂才,并当过两次县令。后来又当韩馥别驾,被韩馥表为骑都尉。袁绍占据冀州后任用沮授为从事。经常对袁绍提出良策,但很多时候袁绍并不听从。官渡之战时袁绍大败,沮授未及逃走,被曹操所获,因拒降被曹操处死。", + caifuren: "原是刘表的小妾,正室死后,成为了刘表的后妻。因刘琮娶了自己的侄女所以对其偏爱有加。刘备客居荆州时险些受其所害。刘表死后为了让刘琮即位不惜献州于曹操。", + caorui: "魏文帝曹丕长子,曹魏第二位皇帝。在位期间指挥曹真、司马懿等人成功防御了吴、蜀的多次攻伐,并且平定鲜卑,攻灭公孙渊,颇有建树。", + caoxiu: "曹操族子,曹操大宴铜雀台之时,射箭夺袍。曹休随曹操四处征伐,在攻蜀汉中之战,伐吴濡须口之战均有登场,曾放冷箭射倒凌统的马匹,后又协助夏侯惇平息洛阳纵火叛乱,总管御林兵马,协助曹丕代汉。", + zhongyao: "初为长安郡守,马超反叛时,引军攻打长安,钟繇率军防卫。后城破,钟繇从东门弃城而走,退守潼关。后奉献帝令繇草拟诏令,册立曹操为魏王,曹操以钟繇为相国。明帝即位时,钟繇为太傅。诸葛亮北伐,钟繇举荐司马懿前往抵御。", + liuchen: "刘禅第五子,自幼聪明,英敏过人。魏军兵临城下时,刘禅准备投降,刘谌劝阻刘禅投降不成后悲愤不已,遂自杀于昭烈庙。", + xiahoushi: "夏侯渊从女,夏侯霸从妹,出城拾柴时被张飞所得,取其为妻。后生有二女,其中一人为星彩。", + zhangyi: "曾随诸葛亮南征孟获,七擒孟获的战斗中立下赫赫战功,与祝融夫人单挑。诸葛亮病死五丈原,告诉姜维张嶷忠贞勇猛,经验丰富,是可以依靠的武将,后于征伐魏国时为掩护姜维撤退阵亡。", + sunxiu: "孙权第六子,孙綝发动政变罢黜孙亮后,迎立孙休为帝。后孙綝专权,孙休遣使丁奉等人将其诛杀。孙休在位期间,颁布良制,嘉惠百姓,促进了东吴的繁荣。", + zhuzhi: "孙坚旧将,朱然嗣父,孙坚阵亡后,孙策附袁术,朱治、吕范为之定计,用玉玺向袁术借兵夺取江东。孙策平定东路后,任命朱治为吴郡太守,收军返回江东。后来赤壁之战,大都督周瑜令朱治、吕范为四方巡警使,催督六郡官军。", + quancong: "吴国名将,孙策进兵江东时归顺之,深得孙权赏识,孙权甚至将孙鲁班许配之。", + gongsunyuan: "辽东太守公孙度之孙,辽东割据首领。趁魏、吴骚乱之际自称燕王,发动叛乱,与魏对抗。败给司马懿率领的讨伐大军,被围困后乞降不被接受,与子修在欲出城逃跑时被斩杀。", + guotufengji: "两人均是袁绍帐下谋士。曾联手献计,利用公孙瓒攻击韩馥,又劝说韩馥请袁绍抵挡公孙瓒,终替袁绍拿下冀州。官渡之战期间,两人进谗逼反张郃高览,逼死田丰。使得袁绍的实力大损。", + guohuanghou: "明元郭皇后(并非郭女王),在三国志有正传。曹叡夫人,曹丕的儿媳妇,曹芳,曹髦,曹奂三朝太后,是唯一经历了曹魏全部皇帝时代的贵族女性。曹魏后三帝时期,由于皇帝年少,太后与重臣一同处理政务。史书上对郭皇后有两种截然不同的记载,一种是曹芳被废和曹髦死后郭太后发诏书斥责他们不配人君,另一种却提及曹芳被夺权期间,太后与曹芳相拥而泣,曹髦讨伐司马昭前,曾向太后禀报。", + liyan: "字正方,蜀汉重臣。初为刘表部下,曹操入主荆州时,李严西奔入蜀。刘备入川,李严率众投降,深得刘备器重,受命与诸葛亮、法正等人一同编制《蜀科》,又率军平定了蜀中盗贼。白帝城托孤,与诸葛亮共受遗诏同扶幼主。其人性格矜高难近,终因督粮不利且谎报实情而被流放,后在当地去世。", + sundeng: "字子高,孙权长子。孙权称帝后其被立为太子,受诸葛恪等人辅佐。其人性情温和而能礼贤下士,加之爱民如子,因此深受爱戴。曾劝服孙权在孙虑之死时节哀,并劝谏孙权勿用吕壹苛政。后不幸早逝,临终前上书建言,推荐了多位良臣。其亡故令孙权极为悲伤,也为南鲁党争的祸乱埋下了伏笔。", + liuyu: "伯安,幽州牧,汉室宗亲。在幽州两度任职,颇有威望。张纯、张举叛乱,刘虞恩威并施将其平定,又鼓励农商,大大改善了当地经济民生,青徐二州流民纷纷前来避难。后坚拒袁绍等人立其为帝的请求,派兵迎接献帝,却为袁术所扣,并因此事激化了与公孙瓒的矛盾,最终被击败,为其所害。", + cenhun: "岑昏为宦官,官列中常侍,孙皓即位后得到宠幸。280年,晋龙骧将军王濬率军伐吴,岑昏建议以铁锁链封锁长江,阻挡晋军进攻。王濬以火船烧锁链破其计,沿途东吴将士或死或降。群臣上奏东吴衰败之因在于岑昏,将他与蜀汉的黄皓并列为误国之奸臣。", + sunziliufang: "孙资在曹操手下历任县令,参丞相军事;刘放曾有劝王松归顺曹操之举,为曹操所欣赏,遂招为司空府官,又外放历任几处县令。魏国初建之际,孙资与刘放俱任秘书郎。曹丕继位后,二人一同掌握机密。曹睿病危时,二人力荐曹爽,又推荐招回司马懿辅政。最后,曹睿独召曹爽、司马懿、刘放、孙资同受诏命,而免去曹宇、夏侯献、曹肇、秦朗的官职。", + huanghao: "宦官。为后主刘禅所宠,专秉朝政。黄皓与大将军姜维不睦,维启后主杀之,后主不从。皓阴以心腹阎宇替维。景耀六年,蜀亡,邓艾预欲杀之,皓贿赂左右得免。及后主迁洛阳,皓为司马昭凌迟处死。", + zhangrang: "汉中常侍。同赵忠、曹节、段珪等为“十常侍”,为灵帝所宠。让等专权乱政、卖官索财,朝野皆痛恨之。郎中张钧上书奏请诛杀十常侍,帝不允,让等阴杀钧。及灵帝崩,大将军何进欲杀让等,让阴结何太后,招进入宫,斩杀之。部将袁绍引兵攻让,让等劫帝走河上。追急,让投水自尽。", + jikang: "嵇康(224年-263年,一作223年-262年),字叔夜。谯国铚县(今安徽省濉溪县)人。三国时期曹魏思想家、音乐家、文学家。
    嵇康幼年聪颖,博览群书,广习诸艺,又喜爱老庄学说。身长七尺八寸,容止出众。后娶魏武帝曹操曾孙女长乐亭主为妻,拜郎中,调中散大夫,世称“嵇中散”。后隐居不仕,屡拒为官。因得罪司隶校尉钟会,遭其构陷,而被掌权的大将军司马昭处死,时年四十岁。", + xinxianying: "辛氏(191年—269年),字宪英,祖籍陇西,颍川阳翟(今河南禹州)人。魏晋时期著名才女,曹魏侍中辛毗之女,卫尉羊耽之妻。辛宪英聪朗有才鉴,曾劝弟辛敞尽忠职守,预言钟会将会叛乱。泰始五年(公元269年),辛宪英逝世,享年七十九岁。", + wuxian: "穆皇后吴氏(?—245年),陈留(今河南开封)人,车骑将军吴懿之妹,三国时期蜀汉昭烈帝刘备的皇后。
    吴氏早年丧父,其父生前与刘焉交情深厚,所以全家跟随刘焉来到蜀地。后刘焉听相面者说吴氏有大贵之相,于是为儿子刘瑁迎娶吴氏。刘瑁死后,吴氏成为寡妇。
    建安十九年(214年),刘备平定益州,纳吴氏为夫人。建安二十四年(219年),刘备自称汉中王,立吴氏为汉中王后。章武元年(221年),刘备称帝,建立蜀汉,立吴氏为皇后。章武三年(223年),刘备去世,太子刘禅即位,尊嫡母吴氏为皇太后。延熙八年(245年),吴氏去世,谥号穆皇后,葬入刘备的惠陵。", + qinmi: "秦宓(?-226年),字子敕。广汉郡绵竹县(今四川德阳北)人。三国蜀汉时大臣、学者。秦宓善舌辩。早年仕于益州牧刘璋麾下,后降刘备。刘备伐吴时,秦宓劝阻,刘备大怒,欲杀秦宓。因诸葛亮及时求情,才保住性命,仅被下狱,后被释放,拜左中郎将、长水校尉。吴蜀同盟后,孙权派张温至成都回访。酒宴之上,秦宓与张温舌战,说得张温无言以对。后官至大司农。建兴四年(226年),秦宓病逝。", + xushi: "徐氏,孙权之弟孙翊的妻子,著名烈女。孙翊的部下妫览、戴员买通家将边鸿将孙翊杀死,并将全部罪责推给边鸿,又谋杀了前来查问的太守孙河。徐夫人一面用美人计色诱妫览、戴员,令其放松警惕;一面对孙翊生前亲信孙高、傅婴说明真相并晓以大义,最终成功地在内室中将杀夫凶手妫览、戴员诛杀。", + xuezong: "薛综(?―243年),字敬文,沛郡竹邑(今安徽濉溪)人,三国时期吴国名臣。少时避乱至交州,师从刘熙。士燮归附孙权,召其为五官中郎将,出任合浦、交阯太守。后从征至九真,回朝任谒者仆射。232年,升任尚书仆射。240年,改任选曹尚书。242年,担任太子少傅,兼任选部职任。243年,薛综去世。薛综是当时名儒,著有诗赋难论数万言,集为《私载》,并著有《五宗图述》、《二京解》。", + caiyong: "蔡邕(133年-192年),字伯喈。陈留郡圉县(今河南杞县南)人。东汉时期名臣,文学家、书法家,才女蔡文姬之父。蔡邕早年拒朝廷征召之命,后被征辟为司徒掾属,任河平长、郎中、议郎等职,曾参与续写《东观汉记》及刻印熹平石经。后因罪被流放朔方,几经周折,避难江南十二年。董卓掌权时,强召蔡邕为祭酒。三日之内,历任侍御史、治书侍御史、尚书、侍中、左中郎将等职,封高阳乡侯,世称“蔡中郎”。董卓被诛杀后,蔡邕因在王允座上感叹而被下狱,不久便死于狱中,年六十。", + caojie: "曹节(196年―260年),沛国谯县(今安徽亳州)人,汉献帝刘协第二任皇后,魏武帝曹操的女儿。建安十八年(213年),曹操将女儿曹宪、曹节、曹华三姐妹同时入宫中,封为夫人。建安十九年(214年),并封为贵人。曹操废掉汉献帝第一位皇后伏寿,将她囚禁而死。曹操要汉献帝立曹节为皇后,汉献帝只得依从。建安二十五年(220年),曹操去世,曹丕袭封魏王位。曹丕授意华歆去逼汉献帝让位。曹节怒斥华歆,华歆只好退出宫去。第二天又逼汉献帝将帝位禅让给曹丕。并以武力威胁,向曹节索要玺印,曹节无奈,将玺印掷于栏板之下。面对曹丕篡位,她极为愤怒,高喊:“老天有眼,决不让你长久!”汉献帝被废为山阳公,曹节为山阳公夫人。景元元年(260年),曹节病逝,仍以汉朝礼仪合葬于献帝的禅陵,谥号献穆皇后。", +}; + +export default characterIntro; diff --git a/character/yijiang/perfectPairs.js b/character/yijiang/perfectPairs.js new file mode 100644 index 000000000..e9364724f --- /dev/null +++ b/character/yijiang/perfectPairs.js @@ -0,0 +1,22 @@ +export default { + wuguotai: ["sunjian", "sunshangxiang"], + zhangchunhua: ["simayi"], + caozhi: ["zhenji"], + xunyou: ["xunyu"], + xushu: ["liubei"], + lingtong: ["ganning"], + chengong: ["lvbu"], + bulianshi: ["sunquan"], + fuhuanghou: ["liuxie"], + sunluban: ["quancong"], + caifuren: ["liubiao"], + xiahoushi: ["zhangfei"], + zhoucang: ["guanyu"], + guanping: ["guanyu"], + sundeng: ["sunquan", "zhoufei"], + liru: ["dongzhuo"], + liuchen: ["liushan"], + yujin: ["xiahoudun"], + fazheng: ["liubei"], + zhonghui: ["jiangwei"], +}; diff --git a/character/yijiang/pinyin.js b/character/yijiang/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/yijiang/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/yijiang/skill.js b/character/yijiang/skill.js new file mode 100644 index 000000000..d4c5429c0 --- /dev/null +++ b/character/yijiang/skill.js @@ -0,0 +1,14742 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //一将2024 + //令狐愚 + xvzhi: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return ( + game.countPlayer(target => { + return lib.skill.xvzhi.filterTarget(null, player, target); + }) > 1 + ); + }, + filterTarget(card, player, target) { + const stat = player.getStat("xvzhi"); + return target.countCards("h") && (!stat || !stat.includes(target)); + }, + selectTarget: 2, + usable: 1, + multiline: true, + multitarget: true, + async content(event, trigger, player) { + const targets = event.targets; + if (!player.getStat().xvzhi) player.getStat().xvzhi = []; + player.getStat().xvzhi.addArray(targets); + if (targets.some(i => !i.countCards("h"))) return; + const result = await player + .chooseCardOL(targets, "h", true, [1, Infinity], "蓄志:选择任意张手牌并与对方交换") + .set("ai", card => { + const player = get.event("player"), + target = get + .event() + .getParent(2) + .targets.find(i => i != player); + const sha = new lib.element.VCard({ name: "sha" }); + const playerEffect = player.hasUseTarget(sha, false) + ? Math.max( + ...game + .filterPlayer(current => player.canUse(sha, current, false)) + .map(current => { + return get.effect(current, sha, player, player); + }) + ) + : 0; + const targetEffect = target.hasUseTarget(sha, false) + ? Math.max( + ...game + .filterPlayer(current => target.canUse(sha, current, false)) + .map(current => { + return get.effect(current, sha, player, player); + }) + ) + : 0; + return 5 + 2 * get.sgn(playerEffect - targetEffect) - get.value(card); + }) + .forResult(); + await targets[0].swapHandcards(targets[1], result[0].cards, result[1].cards); + if (result[0].cards.length == result[1].cards.length) { + await player.draw(2); + player.getStat("skill").xvzhi--; + } else { + const aim = targets[result[0].cards.length > result[1].cards.length ? 0 : 1]; + const sha = new lib.element.VCard({ name: "sha" }); + if (aim.hasUseTarget(sha, false)) { + await aim.chooseUseTarget(sha, true, false, "nodistance"); + } + } + }, + ai: { + order: 5, + result: { + target(player, target) { + return get.sgn(get.attitude(player, target)) * target.countCards("h"); + }, + }, + }, + }, + //司马孚 + beiyu: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countCards("h") < player.maxHp; + }, + usable: 1, + async content(event, trigger, player) { + await player.drawTo(player.maxHp); + if (!player.countCards("h")) return; + const suits = player + .getCards("h") + .reduce((list, card) => list.add(get.suit(card)), []) + .sort((a, b) => lib.suit.indexOf(b) - lib.suit.indexOf(a)); + const result = await player + .chooseControl(suits) + .set("prompt", "备预:将一种花色的手牌牌置于牌堆底") + .set("ai", () => { + const player = get.event("player"); + let suits = get.event("controls").slice(); + suits.sort((a, b) => player.countCards("h", { suit: a }) - player.countCards("h", { suit: b })); + return suits[0]; + }) + .forResult(); + if (result.control) { + const suit = result.control, + cards = player.getCards("h", { suit: suit }); + if (cards.length) { + let resultx; + if (cards.length == 1) { + resultx = { bool: true, moved: [cards] }; + } else { + resultx = await player + .chooseToMove("备预:将牌按顺序置于牌堆底", true) + .set("list", [["牌堆底", cards]]) + .set("processAI", list => { + return [list[0][1].slice(0)]; + }) + .forResult(); + } + if (resultx.bool) { + const moved = resultx.moved[0]; + if (moved.length) { + await player.lose(cards, ui.cardPile); + for (let i = 0; i < moved.length; i++) { + const card = moved[i]; + card.fix(); + ui.cardPile.appendChild(card); + } + } + } + } + } + }, + ai: { + order: 0.001, + result: { player: 1 }, + }, + }, + duchi: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter(event, player) { + return event.player != player; + }, + usable: 1, + logTarget: "player", + check(event, player) { + return get.effect(player, event.card, event.player, player) <= 0; + }, + async content(event, trigger, player) { + await player.draw().set("bottom", true); + if (player.countCards("h")) { + await player.showHandcards(get.translation(player) + "发动了【督持】"); + const colors = player.getCards("h").reduce((list, card) => list.add(get.color(card)), []); + if (colors.length == 1) { + player.popup("洗具"); + trigger.getParent().excluded.add(player); + return; + } + } + player.popup("杯具"); + }, + ai: { threaten: 0.8 }, + }, + //宣公主 + yjqimei: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + const count = player.getStat("skill").yjqimei; + if (count && count > 0 && !player.hasSkill("yjqimei_rewrite")) return false; + return true; + }, + filterTarget: lib.filter.notMe, + usable: 2, + async content(event, trigger, player) { + const target = event.target; + await player.draw(2, "nodelay"); + await target.draw(2); + const targets = [player, target].filter(current => current.countDiscardableCards(current, "he")); + if (targets.length) { + const result = await player + .chooseCardOL(targets, "he", true, 2, "齐眉:请弃置两张牌", (card, player, target) => { + return lib.filter.cardDiscardable(card, player); + }) + .forResult(); + if (result.length == 1) targets[0].discard(result[0].cards); + else { + await game + .loseAsync({ + lose_list: [ + [targets[0], result[0].cards], + [targets[1], result[1].cards], + ], + }) + .setContent("discardMultiple"); + await game.asyncDelayx(); + } + let cards = result.reduce((list, evt) => { + list.addArray(evt.cards); + return list; + }, []); + const suits = cards.reduce((list, card) => list.add(get.suit(card)), []); + switch (suits.length) { + case 1: + while (cards.length) { + const card = cards.shift(); + if (player.hasUseTarget(card)) { + player.$gain2(card, false); + await game.asyncDelayx(); + await player.chooseUseTarget(true, card, false); + } + } + break; + case 2: + for (const current of [player, target]) { + if (!current.isIn()) continue; + if (current.isLinked()) await current.link(false); + if (current.isTurnedOver()) await current.turnOver(false); + } + break; + case 3: + for (const current of [player, target]) { + if (current.isIn() && !current.isLinked()) await current.link(true); + } + break; + case 4: + await player.draw("nodelay"); + await target.draw(); + player.addTempSkill("yjqimei_rewrite"); + break; + } + } + }, + ai: { + order: 9, + result: { + target(player, target) { + const att = get.sgn(get.attitude(player, target)); + return (2 + att) * att; + }, + }, + }, + subSkill: { rewrite: { charlotte: true } }, + }, + yjzhuiji: { + audio: 2, + trigger: { player: "die" }, + filter(event, player) { + return game.hasPlayer(target => { + return ( + target != player && + Array.from({ length: 5 }) + .map((_, i) => i + 1) + .some(i => target.hasEmptySlot(i)) + ); + }); + }, + forceDie: true, + skillAnimation: true, + animationColor: "water", + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("yjzhuiji"), (card, player, target) => { + return ( + target != player && + Array.from({ length: 5 }) + .map((_, i) => i + 1) + .some(i => target.hasEmptySlot(i)) + ); + }) + .set("ai", target => { + const player = get.event("player"); + return ( + get.sgn(get.attitude(player, target)) * + Array.from({ length: 5 }) + .map((_, i) => i + 1) + .reduce((sum, i) => sum + target.countEmptySlot(i), 0) + ); + }) + .set("forceDie", true) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + let num = 1, + cards = []; + while (num <= 5) { + while (target.hasEmptySlot(num)) { + const card = get.cardPile2(card => { + return !cards.includes(card) && get.subtype(card) == "equip" + num && target.canUse(card, target); + }); + if (card) { + cards.push(card); + target.$gain2(card, false); + await game.asyncDelayx(); + await target.chooseUseTarget(card, true, "nopopup"); + } else break; + } + num++; + } + if (cards.length) { + target.addSkill("yjzhuiji_buff"); + target.markAuto("yjzhuiji_buff", cards); + } + }, + subSkill: { + buff: { + charlotte: true, + mod: { + aiValue(player, card, num) { + if (player.getStorage("yjzhuiji_buff").includes(card)) return num + 100; + }, + aiUseful(player, card, num) { + if (player.getStorage("yjzhuiji_buff").includes(card)) return num / 114514; + }, + }, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + const evt = event.getl(player); + return evt && evt.es && evt.es.some(i => player.getStorage("yjzhuiji_buff").includes(i)); + }, + forced: true, + popup: false, + firstDo: true, + content() { + const evt = trigger.getl(player); + const cards = evt.es.filter(i => player.getStorage("yjzhuiji_buff").includes(i)); + player.unmarkAuto("yjzhuiji_buff", cards); + for (const card of cards) player.disableEquip(get.subtype(card)); + }, + intro: { + mark(dialog, storage) { + if (storage && storage.length) dialog.addSmall([storage, "vcard"]); + else return "暂无装备"; + }, + }, + }, + }, + }, + //徐琨 + fazhu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return player.hasCard(card => !get.tag(card, "damage") && player.canRecast(card), "hej"); + }, + async content(event, trigger, player) { + const cardx = player.getCards("hej", card => !get.tag(card, "damage") && player.canRecast(card)); + await player.recast(cardx); + const cards = player + .getHistory("gain", evt => evt.getParent(3) == event) + .reduce((list, evt) => { + list.addArray(evt.cards); + return list; + }, []); + let num = Math.min(cards.length, game.countPlayer()), + list = []; + if (!num) return; + if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); + while (num - list.length > 0 && cards.some(i => get.owner(i) == player && get.position(i) == "h" && !i.hasGaintag("olsujian_given"))) { + const result = await player + .chooseCardTarget({ + prompt: "筏铸:将以此法获得的牌交给任意角色各一张", + position: "he", + animate: false, + filterCard(card, player) { + if (!get.event("cards").includes(card)) return false; + return !get.event("list").some(list => list[1] == card); + }, + filterTarget(card, player, target) { + return !get.event("list").some(list => list[0] == target); + }, + ai1(card) { + if (card.name == "sha") return 2.5; + return 1 + Math.random(); + }, + ai2(target) { + return get.attitude(get.event("player"), target); + }, + }) + .set("forced", !list.length) + .set("list", list) + .set("cards", cards) + .forResult(); + if (result.bool) { + list.push([result.targets[0], result.cards[0]]); + player.addGaintag(result.cards, "olsujian_given"); + } else break; + } + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (list.length) { + const targets = list.slice().map(list => list[0]); + await game + .loseAsync({ + gain_list: list, + player: player, + cards: list.slice().map(list => list[1]), + giver: player, + animate: "giveAuto", + }) + .setContent("gaincardMultiple"); + for (const target of targets) { + await target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.cardEnabled.apply(this, arguments); + }) + .set("openskilldialog", "筏铸:是否使用一张【杀】(无距离限制)?") + .set("norestore", true) + .set("custom", { + add: {}, + replace: { window: function () {} }, + }) + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("addCount", false); + } + } + }, + ai: { + effect: { + target(card, player, target) { + if (!card || get.type(card) != "delay") return; + if (!get.tag(card, "damage") && target.canRecast(card)) return "zeroplayertarget"; + }, + }, + }, + }, + //一将2023 + //孙礼 + kangli: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + forced: true, + locked: false, + content: function () { + player.draw(2).gaintag = ["kangli"]; + player.when({ source: "damageBegin1" }).then(() => { + var cards = player.getCards("h", card => card.hasGaintag("kangli") && lib.filter.cardDiscardable(card, player, "kangli")); + if (cards.length) player.discard(cards); + }); + }, + ai: { + maixie: true, + }, + }, + //夏侯楙 + tongwei: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he", card => lib.skill.tongwei.filterCard(card, player)) > 1 && game.hasPlayer(i => i != player); + }, + filterTarget: lib.filter.notMe, + filterCard: lib.filter.cardRecastable, + selectCard: 2, + position: "he", + discard: false, + lose: false, + delay: false, + popname: true, + check: function (card) { + var num = 6.5; + if (ui.selected.cards.length) { + var cardx = ui.selected.cards[0]; + num = get.number(cardx); + } + var del = Math.abs(get.number(card) - num); + return 5 + del / 5 - get.value(card); + }, + content: function () { + "step 0"; + player.recast(cards); + "step 1"; + var numbers = cards.map(c => get.number(c, player)).sort((a, b) => a - b); + target.when("useCard1").then(() => { + trigger._tongwei_checked = true; + }); + target + .when("useCardAfter") + .assign({ + numbers: numbers, + playerx: player, + mod: { + aiOrder: function (player, card, num) { + var number = get.number(card); + if (typeof number != "number" || number <= numbers[0] || number >= numbers[1]) return num + 10; + }, + }, + }) + .filter((event, player) => { + return event._tongwei_checked; + }) + .then(() => { + var number = get.number(trigger.card); + var numbers = get.info(event.name).numbers; + event.playerx = get.info(event.name).playerx; + if (typeof number != "number" || number <= numbers[0] || number >= numbers[1]) event.finish(); + }) + .then(() => { + var playerx = event.playerx; + var names = ["sha", "guohe"].filter(name => playerx.canUse({ name: name, isCard: true }, player, false)); + if (!names.length) event.finish(); + else if (names.length == 1) event._result = { links: [[null, null, names[0]]] }; + else + playerx + .chooseButton([`请选择要视为对${get.translation(player)}使用的牌`, [names, "vcard"]], true) + .set("ai", button => { + return button.link[0][2] == _status.event.choice; + }) + .set( + "choice", + (function () { + var list = names + .map(name => { + return [name, get.effect(player, { name: name, isCard: true }, playerx, playerx)]; + }) + .sort((a, b) => { + return b[1] - a[1]; + }); + return list[0][0]; + })() + ); + }) + .then(() => { + var name = result.links[0][2]; + var card = { name: name, isCard: true }, + playerx = event.playerx; + if (playerx.canUse(card, player, false)) playerx.useCard(card, player, "tongwei"); + }); + }, + ai: { + expose: 0.2, + order: 7, + threaten: 2.2, + result: { + target: -1, + }, + }, + }, + cuguo: { + audio: 2, + trigger: { player: ["shaMiss", "eventNeutralized"] }, + filter: function (event, player) { + if (event.type != "card" && event.name != "_wuxie") return false; + if ( + !event.target || + !event.target.isIn() || + !player.canUse( + { + name: event.card.name, + nature: event.card.nature, + isCard: true, + }, + event.target, + false + ) + ) + return false; + if (!player.hasCard(card => lib.filter.cardDiscardable(card, player), "he")) return false; + var history = game.getGlobalHistory("everything"); + for (var evt of history) { + if (evt._neutralized || (evt.responded && (!evt.result || !evt.result.bool))) { + var evtx = evt.getParent(); + return evtx.name == "useCard" && evtx.player == player && evt == event; + } + } + return false; + }, + forced: true, + direct: true, + content: function () { + "step 0"; + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + storage: { cuguo: true }, + }; + event.card = card; + player.chooseToDiscard("蹙国:请弃置一张牌", `视为你对${get.translation(trigger.target)}使用一张${get.translation(card.nature || "")}【${get.translation(card.name)}】`, "he", true).set("logSkill", ["cuguo", trigger.target]); + "step 1"; + if (player.canUse(card, trigger.target, false)) { + player.useCard(card, trigger.target); + player + .when("useCardAfter") + .filter(event => { + return event.card.storage && event.card.storage.cuguo; + }) + .then(() => { + if ( + game.hasGlobalHistory("everything", evt => { + if (evt._neutralized || (evt.responded && (!evt.result || !evt.result.bool))) { + if (evt.getParent() == trigger) return true; + } + return false; + }) + ) { + player.loseHp(); + } + }); + } + }, + }, + //陈式 + qingbei: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseButton(['###擎北:是否选择任意种花色?###
    你不能于本轮能使用这些花色,且使用牌后摸等同于选择花色数的牌
    ', [lib.suit.map(i => ["", "", "lukai_" + i]), "vcard"]], [1, 4]); + next.set("ai", button => { + var player = _status.event.player; + var suit = button.link[2].slice(6); + var val = player + .getCards("hs", { suit: suit }) + .map(card => { + return get.value(card) + player.getUseValue(card) / 3; + }) + .reduce((p, c) => { + return p + c; + }, 0); + if (val > 10 && ui.selected.buttons.length > 0) return -1; + if (val > 6 && ui.selected.buttons.length == 2) return -1; + if (ui.selected.buttons.length == 3) return -1; + return 1 + 1 / val; + }); + "step 1"; + if (result.bool) { + var suits = result.links.map(i => i[2].slice(6)); + player.logSkill("qingbei"); + player.addTempSkill("qingbei_effect", "roundStart"); + player.setStorage("qingbei_effect", suits); + player.markSkill("qingbei_effect"); + } + }, + ai: { + threaten: 2.3, + }, + subSkill: { + effect: { + audio: "qingbei", + trigger: { player: "useCardAfter" }, + charlotte: true, + onremove: true, + forced: true, + filter: function (event, player) { + if (!lib.suit.includes(get.suit(event.card))) return false; + return player.getStorage("qingbei_effect").length; + }, + content: function () { + player.draw(player.getStorage("qingbei_effect").length); + }, + mark: true, + intro: { + content: storage => `本轮内不能使用${get.translation(storage)}花色的牌,且使用一张有花色的牌后摸${get.cnNumber(storage.length)}张牌`, + }, + mod: { + cardEnabled: function (card, player) { + if (player.getStorage("qingbei_effect").includes(get.suit(card))) return false; + }, + cardSavable: function (card, player) { + if (player.getStorage("qingbei_effect").includes(get.suit(card))) return false; + }, + }, + }, + }, + }, + //费曜 + zhenfeng: { + audio: 2, + trigger: { global: "useCard" }, + usable: 1, + filter: function (event, player) { + return event.player != player && event.player == _status.currentPhase && event.player.countCards("h") <= event.player.getHp(); + }, + check: function (event, player) { + var type = get.type2(event.card, event.player); + if (type == "equip" && event.player.hasCard(card => event.player.hasValueTarget(card))) return false; + if (get.attitude(player, event.player) > 0 && event.player.getHp() + event.player.countCards("hs", ["shan", "caochuan"]) <= 3) return false; + return true; + }, + onremove: true, + logTarget: "player", + content: function () { + "step 0"; + var choices = Array.from({ length: trigger.player.countCards("h") + 1 }).map((_, i) => get.cnNumber(i, true)); + var type = get.type2(trigger.card, trigger.player); + player + .chooseControl(choices) + .set("prompt", "镇锋:猜测其手牌中的" + get.translation(type) + "牌数") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var num = trigger.player.countCards("h", card => get.type2(card) == type); + var knownNum = trigger.player.countKnownCards(_status.event.player, card => get.type2(card) == type); + if (trigger.player.isAllCardsKnown(_status.event.player)) { + return knownNum; + } + var restNum = num - knownNum; + var numx; + if (type == "basic") numx = num + Math.floor(Math.random() * restNum + 1); + else if (type == "trick") { + if (num > 2) numx = 2; + else numx = 1; + if (Math.random() < 0.5) { + numx += Math.random() > 0.5 ? 1 : -1; + } + } else { + numx = [0, 1].randomGet(); + } + if (numx < knownNum) numx = knownNum; + else if (numx >= choices.length) numx = choices.length - 1; + return numx; + })() + ); + "step 1"; + var guessedNum = result.index; + player.chat("我猜" + get.cnNumber(guessedNum) + "张"); + game.log(player, "猜测", trigger.player, "有", get.cnNumber(guessedNum) + "张" + get.translation(type) + "牌"); + event.guessedNum = guessedNum; + game.delay(); + "step 2"; + var type = get.type2(trigger.card, trigger.player); + var count = trigger.player.countCards("h", card => get.type2(card) == type); + var guessedNum = event.guessedNum; + if (count == guessedNum) { + player.popup("洗具"); + game.log(player, "猜测", "#g正确"); + if (player.countMark("zhenfeng") < 5) player.addMark("zhenfeng", 1, false); + player.draw(player.countMark("zhenfeng")); + if (player.canUse("sha", trigger.player, false)) player.useCard({ name: "sha", isCard: true }, trigger.player); + } else { + player.popup("杯具"); + game.log(player, "猜测", "#y错误"); + player.clearMark("zhenfeng"); + if (Math.abs(count - guessedNum) > 1 && trigger.player.canUse("sha", player, false)) { + trigger.player.useCard({ name: "sha", isCard: true }, player, false, "noai"); + } + } + }, + intro: { + content: "已连续猜对#次", + }, + }, + //新杀小加强 李严 + dcduliang: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("he") > 0; + }, + audio: "duliang", + content: function () { + "step 0"; + player.gainPlayerCard(target, "he", true); + "step 1"; + var name = get.translation(target); + player + .chooseControl(function () { + return Math.random() < 0.5 ? "选项一" : "选项二"; + }) + .set("prompt", "督粮:请选择一项") + .set("choiceList", ["你观看牌堆顶的两张牌,然后令" + name + "获得其中的一或两张基本牌", "令" + name + "于下回合的摸牌阶段额外摸一张牌"]); + "step 2"; + if (result.control == "选项一") { + var cards = get.cards(2), + bool = false; + event.cards = cards; + game.cardsGotoOrdering(cards); + for (var card of cards) { + if (get.type(card) == "basic") { + bool = true; + break; + } + } + player + .chooseButton(["督粮:选择令" + get.translation(target) + "获得的牌", cards], [1, 2], bool) + .set("filterButton", button => { + return get.type(button.link) == "basic"; + }) + .set("ai", button => { + return _status.event.sgn * get.value(button.link); + }) + .set("sgn", get.sgnAttitude(player, target) > 0); + } else { + target.addTempSkill("dcduliang2", { player: "phaseAfter" }); + target.addMark("dcduliang2", 1, false); + event.finish(); + } + "step 3"; + if (result.bool) { + var cardsx = result.links; + target.gain(cardsx, "draw"); + game.log(target, "获得了" + get.cnNumber(cardsx.length) + "张牌"); + cards.removeArray(cardsx); + cards.reverse(); + } + for (var i = 0; i < cards.length; i++) { + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); + } + game.updateRoundNumber(); + }, + ai: { + order: 4, + result: { + target: -1, + player: 0.1, + }, + }, + }, + dcduliang2: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + mark: true, + audio: false, + onremove: true, + charlotte: true, + intro: { + content: "下回合的摸牌阶段额外摸#张牌", + }, + content: function () { + trigger.num += player.countMark("dcduliang2"); + }, + }, + //苏飞 + shuojian: { + audio: 2, + enable: "phaseUse", + usable: 3, + filterTarget: lib.filter.notMe, + filterCard: true, + position: "he", + discard: false, + lose: false, + delay: false, + check: function (card, player) { + return 6 - get.value(card); + }, + content: function () { + "step 0"; + player.give(cards, target); + "step 1"; + var num = 3 - get.skillCount("shuojian") + 1; + event.num = num; + event.num2 = num; + if (event.num == 0) event.finish(); + "step 2"; + var forced = num != event.num2; + var prompt = "###" + get.translation(player) + "对你发动了【数谏】###视为使用" + get.cnNumber(num) + "张【过河拆桥】" + (forced ? "" : "且" + get.translation(player) + "此技能本回合失效,或点击“取消”令其摸" + get.cnNumber(num) + "张牌"); + if (!target.hasUseTarget({ name: "guohe" })) event._result = { bool: false }; + else + target + .chooseUseTarget(prompt, "guohe", forced) + .set("ai", function () { + var evt = _status.event; + if (evt.name == "chooseTarget") evt = evt.getParent(); + if (!evt.goon) return 0; + return get.effect_use.apply(this, arguments); + }) + .set("goon", target.getUseValue({ name: "guohe" }) > (get.sgnAttitude(target, player) * player.getUseValue({ name: "wuzhong" })) / (2 - num * 0.4)); + "step 3"; + if (!result.bool) { + player.draw(num); + if (num > 1) player.chooseToDiscard("he", num - 1, true); + event.finish(); + } + "step 4"; + if (--event.num2 > 0) { + event.goto(2); + } else player.tempBanSkill("shuojian"); + }, + ai: { + expose: 0.15, + order: 8, + result: { target: 1 }, + }, + }, + //谯周 + shiming: { + audio: 2, + trigger: { global: "phaseDrawBegin1" }, + filter: function (event, player) { + return !player.hasSkill("shiming_round"); + }, + check: function (event, player) { + return true; //get.attitude(player,event.player)<0||get.damageEffect(event.player,event.player,player)>0; + }, + logTarget: "player", + content: function () { + "step 0"; + player.addTempSkill("shiming_round", "roundStart"); + var cards = get.cards(3); + player + .chooseButton(["识命:是否将其中一张置于牌堆底?", cards.slice(0)]) + .set("ai", button => { + var att = _status.event.att, + damage = _status.event.damage, + val = get.value(button.link, _status.event.player); + if ((att > 0 && damage < 0) || (att <= 0 && damage > 0)) return 6 - val; + return val - 5.99; + }) + .set("att", get.attitude(player, trigger.player)) + .set("damage", get.damageEffect(trigger.player, trigger.player, player) > 0 && trigger.player.hp <= 3 ? 1 : -1); + while (cards.length) ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); + "step 1"; + if (result.bool) { + var card = result.links[0]; + card.fix(); + ui.cardPile.appendChild(card); + player.popup("一下", "wood"); + game.log(player, "将一张牌置于了牌堆底"); + } + "step 2"; + trigger.player + .chooseBool("是否跳过摸牌阶段并对自己造成1点伤害,然后从牌堆底摸三张牌?") + .set("ai", () => _status.event.bool) + .set("bool", get.damageEffect(trigger.player, trigger.player) >= -6 || trigger.player.hp > 3); + "step 3"; + if (result.bool) { + trigger.cancel(); + trigger.player.damage(trigger.player); + } else event.finish(); + "step 4"; + trigger.player.draw(3, "bottom"); + }, + subSkill: { + round: { + mark: true, + intro: { content: "本轮已发动〖识命〗" }, + }, + }, + }, + jiangxi: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + var zhu = game.findPlayer(i => i.getSeatNum() == 1); + return ( + (zhu && + player.hasSkill("shiming_round") && + (game.getGlobalHistory("changeHp", evt => { + return evt.player == zhu && evt._dyinged; + }).length > 0 || + zhu.getHistory("damage").length == 0)) || + !game.hasPlayer2(current => current.getHistory("damage").length > 0) + ); + }, + direct: true, + content: function () { + "step 0"; + if (player.hasSkill("shiming_round")) { + var zhu = game.findPlayer(i => i.getSeatNum() == 1); + if ( + game.getGlobalHistory("changeHp", evt => { + return evt.player == zhu && evt._dyinged; + }).length > 0 || + zhu.getHistory("damage").length == 0 + ) { + player.chooseBool(get.prompt("jiangxi"), "重置〖识命〗"); + } + } else event.goto(2); + "step 1"; + if (result.bool) { + player.logSkill("jiangxi"); + event.logged = true; + player.removeSkill("shiming_round"); + player.draw(); + } + "step 2"; + if (!game.hasPlayer2(current => current.getHistory("damage").length > 0)) { + player + .chooseBool(get.prompt("jiangxi"), "与" + get.translation(trigger.player) + "各摸一张牌") + .set("ai", () => _status.event.bool) + .set("bool", trigger.player.getUseValue({ name: "wuzhong" }) + player.getUseValue({ name: "wuzhong" }) > 0); + } else event.finish(); + "step 3"; + if (result.bool) { + if (!event.logged) player.logSkill("jiangxi"); + trigger.player.draw("nodelay"); + player.draw(); + } + }, + }, + //韩龙 + duwang: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + var cards = []; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (card.name != "sha") cards.push(card); + if (cards.length >= 5) break; + } + if (cards.length) player.addToExpansion(cards, "gain2").gaintag.add("duwang"); + }, + marktext: "刺", + intro: { + name: "刺", + name2: "刺", + content: "expansion", + markcount: "expansion", + }, + mod: { + globalFrom: function (from, to, distance) { + return distance + Math.min(1, from.getExpansions("duwang").filter(i => i.name != "sha").length); + }, + globalTo: function (from, to, distance) { + return distance + Math.min(1, to.getExpansions("duwang").filter(i => i.name != "sha").length); + }, + }, + }, + cibei: { + audio: 2, + trigger: { global: "cardsDiscardAfter" }, + filter: function (event, player) { + if (!player.getExpansions("duwang").filter(i => i.name != "sha").length) return false; + var evt = event.getParent(); + if (evt.name != "orderingDiscard") return false; + var evtx = evt.relatedEvent || evt.getParent(); + return ( + evtx.name == "useCard" && + evtx.card.name == "sha" && + event.cards.filterInD("d").length && + game.hasPlayer2(current => + current.hasHistory("sourceDamage", evtxx => { + return evtxx.card == evtx.card; + }) + ) + ); + }, + direct: true, + group: "cibei_fullyReady", + content: function () { + "step 0"; + player.chooseButton(["###" + get.prompt("cibei") + '###
    将一张“刺”置入弃牌堆,并将' + get.translation(trigger.cards.filterInD("d")) + "置入“刺”
    ", player.getExpansions("duwang")]).set("filterButton", button => { + return button.link.name != "sha"; + }); + "step 1"; + if (result.bool) { + player.logSkill("cibei"); + player.loseToDiscardpile(result.links); + player.addToExpansion(trigger.cards.filterInD("d"), "gain2").gaintag.add("duwang"); + if (game.hasPlayer(current => current.countDiscardableCards(player, "hej") > 0)) + player + .chooseTarget("刺北:弃置一名角色区域内的一张牌", true, (card, player, target) => { + return target.countDiscardableCards(player, "hej") > 0; + }) + .set("ai", target => { + return get.effect(target, { name: "guohe" }, _status.event.player); + }); + } else event.finish(); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + player.line(target); + player.discardPlayerCard(target, "hej", true); + player.addExpose(0.1); + } + }, + ai: { + combo: "duwang", + }, + subSkill: { + fullyReady: { + trigger: { global: "phaseEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + var storage = player.getExpansions("duwang"); + return storage.length > 0 && storage.every(i => i.name == "sha"); + }, + content: function () { + player.gain(player.getExpansions("duwang"), "gain2").gaintag.add("cibei_mark"); + player.addSkill("cibei_mark"); + }, + }, + mark: { + trigger: { player: "useCard1" }, + onremove: true, + charlotte: true, + silent: true, + firstDo: true, + filter: function (event, player) { + return player.hasHistory("lose", evt => { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("cibei_mark")) return true; + } + return false; + }); + }, + content: function () { + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; + } + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("cibei_mark")) return true; + }, + cardDiscardable: function (card, player, name) { + if (card.hasGaintag("cibei_mark")) return false; + }, + canBeDiscarded: function (card) { + if (card.hasGaintag("cibei_mark")) return false; + }, + targetInRange: function (card, player, target) { + if (!card.cards) return; + for (var i of card.cards) { + if (i.hasGaintag("cibei_mark")) return true; + } + }, + cardUsable: function (card, player) { + if (!card.cards) return; + for (var i of card.cards) { + if (i.hasGaintag("cibei_mark")) return true; + } + }, + }, + }, + }, + }, + //武安国 + diezhang: { + audio: 2, + locked: false, + zhuanhuanji: function (player, skill) { + if (!player.storage.duanwan) player.storage[skill] = !player.storage[skill]; + }, + trigger: { global: ["eventNeutralized", "shaMiss"] }, + filter: function (event, player) { + if (player.hasSkill("diezhang_used")) return false; + if (event.type != "card") return false; + var evt = event._neutralize_event; + var user, responder; + if (event.name == "sha") { + user = event.player; + responder = event.target; + } else { + if (evt.type != "card") return false; + user = event.player; + responder = evt.player; + } + if (!player.storage.diezhang) { + if (user != player || responder == player) return false; + return player.countDiscardableCards(player, "he") > 0 && player.canUse("sha", responder, false); + } else { + if (user == player || responder != player) return false; + return player.canUse("sha", user, false); + } + }, + direct: true, + content: function () { + "step 0"; + var evt = trigger._neutralize_event; + var user, responder; + if (trigger.name == "sha") { + user = trigger.player; + responder = trigger.target; + } else { + user = trigger.player; + responder = evt.player; + } + var num = player.storage.duanwan ? 2 : 1; + event.num = num; + if (!player.storage.diezhang) { + var target = responder; + event.target = target; + var next = player + .chooseToDiscard(get.prompt("diezhang", target), "弃置一张牌,视为对其使用" + get.cnNumber(num) + "张【杀】", "he") + .set("ai", card => { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set("logSkill", ["diezhang", target]); + } else { + var target = user; + event.target = target; + var next = player.chooseBool(get.prompt("diezhang", target), "摸" + get.cnNumber(num) + "张牌,视为对其使用一张【杀】").set("ai", () => _status.event.goon); + } + next.set("goon", get.effect(target, { name: "sha" }, player, player) > 0); + "step 1"; + if (result.bool) { + if (player.storage.duanwan) player.addTempSkill("diezhang_used"); + player.changeZhuanhuanji("diezhang"); + if (!result.cards || !result.cards.length) { + player.logSkill("diezhang", target); + player.draw(num, "nodelay"); + player.useCard({ name: "sha", isCard: true }, target, false); + } else while (num--) player.useCard({ name: "sha", isCard: true }, target, false); + } + }, + marktext: "☯", + mark: true, + intro: { + content: function (storage, player) { + var cnNum = get.cnNumber(player.storage.duanwan ? 2 : 1); + if (storage) return "当其他角色使用牌被你抵消后,你可以摸" + cnNum + "张牌,视为对其使用一张【杀】。"; + return "当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用" + cnNum + "张【杀】。"; + }, + }, + mod: { + cardUsable: function (card, player, num) { + if (!player.storage.duanwan && card.name == "sha") return num + 1; + }, + }, + subSkill: { used: { charlotte: true } }, + }, + duanwan: { + audio: 2, + enable: "chooseToUse", + skillAnimation: true, + animationColor: "soil", + limited: true, + filter: function (event, player) { + return event.type == "dying" && player == event.dying; + }, + content: function () { + player.changeZhuanhuanji("diezhang"); + player.awakenSkill("duanwan"); + var num = 2 - player.hp; + if (num > 0) player.recover(num); + }, + ai: { + save: true, + skillTagFilter: function (player, tag, target) { + return player == target; + }, + result: { player: 1 }, + }, + }, + //李婉 + liandui: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + var history = game.getAllGlobalHistory("useCard"); + var index = history.indexOf(event); + if (index <= 0) return false; + var previous = history[index - 1].player; + if (event.player == player && previous != player && previous.isIn()) return true; + if (event.player != player && previous == player) return true; + return false; + }, + direct: true, + content: function () { + "step 0"; + var history = game.getAllGlobalHistory("useCard"); + var index = history.indexOf(trigger); + var previous = history[index - 1].player; + var user = trigger.player, + target = previous; + event.user = user; + event.target = target; + if (user) { + user.chooseBool("是否对" + get.translation(target) + "发动【联对】?", "令" + get.translation(target) + "摸两张牌") + .set("ai", () => _status.event.bool) + .set("bool", get.effect(target, { name: "draw" }, user, user) > 0); + } + "step 1"; + if (result.bool) { + event.user.logSkill("liandui", target); + target.draw(2); + } + }, + }, + biejun: { + audio: 2, + global: "biejun_give", + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return ( + !player.hasSkill("biejun_used") && + player.countCards("h", card => { + return card.hasGaintag("biejun"); + }) == 0 + ); + }, + prompt2: "翻面并防止此伤害", + check: function (event, player) { + return player.isTurnedOver() || event.num >= player.hp || get.distance(_status.currentPhase, player, "absolute") >= 3; + }, + content: function () { + player.addTempSkill("biejun_used"); + player.turnOver(); + trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (get.tag(card, "damage")) { + if (player.getNext() == target && lib.skill.biejun.filter(null, target) && target.isTurnedOver()) return [0, 1]; + } + }, + }, + }, + subSkill: { + used: { charlotte: true }, + give: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (!player.countCards("h")) return false; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("biejun"); + }); + if (!targets.length) return false; + return true; + }, + selectCard: 1, + filterCard: true, + filterTarget: function (card, player, target) { + return target.hasSkill("biejun"); + }, + selectTarget: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("biejun"); + }); + return targets.length > 1 ? 1 : -1; + }, + complexSelect: true, + prompt: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("biejun"); + }); + return "将一张手牌交给" + get.translation(targets) + (targets.length > 1 ? "中的一人" : ""); + }, + position: "h", + discard: false, + lose: false, + delay: false, + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return lib.skill.biejun_give.filterTarget(null, player, current) && get.attitude(player, current) > 0; + }) + ) { + return 5 - get.value(card); + } + return -get.value(card); + }, + content: function () { + game.trySkillAudio("biejun", target); + player.give(cards, target).gaintag.add("biejun"); + target.addTempSkill("biejun_tag"); + }, + ai: { + order: 2, + result: { target: 1 }, + }, + }, + tag: { + charlotte: true, + forced: true, + onremove: function (player) { + player.removeGaintag("biejun"); + }, + }, + }, + }, + //诸葛尚 + sangu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + getEffect: function (player, target, event, list1, list2) { + let att = get.attitude(player, target); + if (att === 0) return 0; + let getv = function (name, player, arg) { + let v = event.getTempCache("sangu", player.id + name); + if (typeof v === "number") return v; + v = player.getUseValue({ name: name, storage: { sangu: true } }, arg); + event.putTempCache("sangu", player.id + name, v); + return v; + }; + if (att < 0) { + for (let i of list1) { + if (getv(i, target) <= 0 || getv(i, target) <= 0) return -att * Math.sqrt(get.threaten(target)) * 2; + } + return 0; + } else { + let list = list1.concat(player.hp > 1 ? list2 : []), + eff = 0; + list.sort(function (a, b) { + return getv(b, target) - getv(a, target); + }); + list = list.slice(3); + for (let i of list) { + let res = getv(i, target); + if (res <= 5) break; + else eff += res; + } + return Math.sqrt(eff / 1.5) * att; + } + }, + content: function () { + "step 0"; + event.list1 = []; + event.list2 = []; + event.used = []; + player.getHistory("useCard", function (evt) { + event.used.add(evt.card.name); + }); + for (let name of lib.inpile) { + let add = false, + type = get.type(name); + if (name === "sha") add = true; + else if (type === "trick") { + let info = lib.card[name]; + if (info && !info.singleCard && !info.notarget) add = true; + } + if (!add) continue; + if (event.used.includes(name)) event.list1.push(name); + else event.list2.push(name); + } + if (!event.list1.length && !event.list2.length) event.finish(); + else + player + .chooseTarget(get.prompt2("sangu"), lib.filter.notMe) + .set("ai", function (target) { + return lib.skill.sangu.getEffect(_status.event.player, target, _status.event.getTrigger(), _status.event.list1, _status.event.list2); + }) + .set("list1", event.list1) + .set("list2", event.list2); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sangu", target); + event.target = target; + } else event.finish(); + "step 2"; + var dialog = ["为" + get.translation(target) + "选择至多三个牌名"]; + if (event.list1.length) { + dialog.push('
    本回合已使用过的牌
    '); + dialog.push([event.list1.map(i => [get.type(i), "", i]), "vcard"]); + } + if (event.list2.length) { + dialog.push('
    本回合未使用过的牌
    '); + dialog.push([event.list2.map(i => [get.type(i), "", i]), "vcard"]); + } + player + .chooseButton(dialog, true, [1, 3]) + .set("ai", function (button) { + let name = button.link[2], + list = _status.event.list, + player = _status.event.player, + target = _status.event.getParent().target, + trigger = _status.event.getTrigger(), + getv = (name, player) => { + let v = trigger.getTempCache("sangu", player.id + name); + if (typeof v === "number") return v; + v = player.getUseValue({ name: name, storage: { sangu: true } }); + trigger.putTempCache("sangu", player.id + name, v); + return v; + }; + if (get.attitude(player, target) < 0) { + if (!list.includes(name)) return 0; + return -getv(name, target); + } else { + if (player.hp < 2 && !list.includes(name)) return 0; + let val = getv(name, target), + base = 5; + val = Math.min(15, val - base); + if (name === "wuzhong" || name === "dongzhuxianji") val += 15; + else if (name === "shunshou") val += 6; + return val; + } + }) + .set("list", event.list1); + "step 3"; + if (result.bool) { + var names = result.links.map(i => i[2]); + if (!target.storage.sangu_effect) target.storage.sangu_effect = []; + target.storage.sangu_effect = target.storage.sangu_effect.concat(names); + game.log(player, "为", target, "选择了", "#y" + get.translation(names)); + target.addTempSkill("sangu_effect", { player: "phaseUseAfter" }); + target.markSkill("sangu_effect"); + var bool = true; + for (var i of names) { + if (!event.used.includes(i)) { + bool = false; + break; + } + } + if (bool) { + target.addTempSkill("sangu_prevent", { player: "phaseUseAfter" }); + target.markAuto("sangu_prevent", [player]); + } + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && card.storage && card.storage.sangu) return "zeroplayertarget"; + }, + }, + }, + subSkill: { + effect: { + trigger: { player: "phaseUseBegin" }, + charlotte: true, + forced: true, + popup: false, + content: function () { + player.addTempSkill("sangu_viewas"); + }, + onremove: true, + intro: { + mark: function (dialog, storage, player) { + if (!storage || !storage.length) return "当前无可用牌"; + dialog.add([[storage[0]], "vcard"]); + if (storage.length > 1) dialog.addSmall([storage.slice(1), "vcard"]); + }, + content: "$", + }, + }, + viewas: { + mod: { + hiddenCard: function (player, name) { + var storage = player.getStorage("sangu_effect"); + if (storage.length) return name == storage[0]; + }, + cardname: function (card, player) { + if (_status.event.name != "chooseToUse" || _status.event.skill) return; + var storage = player.getStorage("sangu_effect"); + if (storage.length) return storage[0]; + }, + cardnature: function (card, player) { + if (_status.event.name != "chooseToUse" || _status.event.skill) return; + var storage = player.getStorage("sangu_effect"); + if (storage.length) return false; + }, + }, + trigger: { player: ["useCard", "respond"] }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.cards.length > 0 && player.getStorage("sangu_effect").length > 0; + }, + content: function () { + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sangu = true; + player.unmarkAuto("sangu_effect", [player.getStorage("sangu_effect")[0]]); + }, + }, + prevent: { + trigger: { source: "damageBegin2" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return event.card && event.card.storage && event.card.storage.sangu && player.getStorage("sangu_prevent").includes(event.player); + }, + content: function () { + trigger.cancel(); + }, + }, + }, + }, + yizu: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + usable: 1, + filter: function (event, player) { + return player.isDamaged() && player.hp <= event.player.hp && (event.card.name == "sha" || event.card.name == "juedou"); + }, + content: function () { + player.recover(); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (target.isHealthy() || (card.name != "sha" && card.name != "juedou")) return; + if (target.storage.counttrigger && target.storage.counttrigger.yizu && current < 0) return 5; + if (player.hp < target.hp) return; + if (current > 0) return 1.2; + if (get.attitude(player, target) >= 0) return; + var copy = get.effect(target, { name: "shacopy" }, player, player); + if ( + copy > 0 && + player.isPhaseUsing() && + Math.min( + player.getCardUsable("sha"), + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.canUse(card, target, null, true); + }) + ) >= 2 + ) + return; + return [0, 2]; + }, + }, + }, + }, + //轲比能 + kousheng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player + .chooseCard("h", [1, player.countCards("h")], get.prompt("kousheng"), "你可以选择任意张手牌,这些手牌于本回合内视为无次数限制的【杀】。但当有角色受到这些【杀】的伤害后,其可以用所有手牌交换剩余的牌。") + .set("standard", player.getUseValue({ name: "sha" }, null, true)) + .set("ai", function (card) { + var player = _status.event.player, + standard = _status.event.standard; + if (standard <= 0) return 0; + var eff = player.getUseValue(card, null, true); + if (eff <= standard) return standard - eff + 0.1; + return 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("kousheng"); + player.addGaintag(result.cards, "kousheng"); + player.addTempSkill("kousheng_effect"); + game.delayx(); + } + }, + subSkill: { + effect: { + audio: "kousheng", + trigger: { player: "useCard1" }, + forced: true, + charlotte: true, + firstDo: true, + filter: function (event, player) { + if (event.card.name != "sha") 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("kousheng")) return true; + } + return false; + }); + }, + content: function () { + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.kousheng = true; + if (trigger.addCount !== false) { + trigger.addCount = false; + player.getStat("card").sha--; + } + }, + onremove: function (player) { + player.removeGaintag("kousheng"); + }, + mod: { + cardUsable: function (card, player, target) { + if (card.name != "sha" || !card.cards) return; + for (var i of card.cards) { + if (i.hasGaintag("kousheng")) return Infinity; + } + }, + cardname: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("kousheng")) return "sha"; + }, + cardnature: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("kousheng")) return false; + }, + }, + group: "kousheng_damage", + }, + damage: { + audio: "kousheng", + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.kousheng || event.getParent().type != "card") return false; + var target = event.player; + return ( + target.isIn() && + player.hasCard(function (card) { + return card.hasGaintag("kousheng"); + }, "h") + ); + }, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var cards = player.getCards("h", function (card) { + return card.hasGaintag("kousheng"); + }); + event.cards = cards; + var str = get.translation(player); + player.showCards(cards, str + "的【寇旌】牌"); + if (target.countCards("h") > 0) + target.chooseBool("是否交换“寇旌”牌?", "用你的所有手牌交换" + str + "的下列“寇旌”牌:" + get.translation(cards)).set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().player; + if (player.hasShan() || player.countCards("hs", { name: ["tao", "jiu"] }) > 0 || get.attitude(player, target) >= 0) return false; + var hs1 = player.getCards("h"), + hs2 = _status.event.getParent().cards; + if (hs2.length >= player.hp) return true; + if (get.value(hs1, player) >= get.value(hs2, target)) return false; + return true; + }); + else event.finish(); + "step 1"; + if (result.bool) { + player.swapHandcards(target, cards, target.getCards("h")); + } + }, + }, + }, + }, + //陆凯 + lkbushi: { + audio: 2, + getBushi: function (player) { + if (!player.storage.lkbushi) return ["spade", "heart", "club", "diamond"]; + return player.storage.lkbushi; + }, + onremove: true, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + locked: false, + content: function () { + "step 0"; + var list = lib.skill.lkbushi.getBushi(player); + list = list.map(function (i) { + return ["", "", "lukai_" + i]; + }); + var next = player.chooseToMove("卜筮:是否调整〖卜筮〗的花色顺序?"); + next.set("list", [ + [ + "无次数限制/使用打出摸牌
    可弃牌无效/结束阶段获得", + [list, "vcard"], + function (list) { + var list2 = list.map(function (i) { + return get.translation(i[2].slice(6)); + }); + return "你使用" + list2[0] + "牌时无次数限制;使用或打出" + list2[1] + "时,摸一张牌;
    成为" + list2[2] + "牌目标后可弃一张牌无效;结束阶段获得一张" + list2[3] + "牌"; + }, + ], + ]); + next.set("processAI", function () { + var player = _status.event.player; + var list = lib.skill.lkbushi.getBushi(player); + var list2 = []; + var hs = player.getCards("hs", function (card) { + return player.hasValueTarget(card); + }); + list.sort(function (a, b) { + return hs.filter(i => get.suit(i) == b).length - hs.filter(i => get.suit(i) == a).length; + }); + list2.push(list.shift()); + hs = player.getCards("hs", "sha"); + list.sort(function (a, b) { + return hs.filter(i => get.suit(i) == b).length - hs.filter(i => get.suit(i) == a).length; + }); + list2.unshift(list.shift()); + list.randomSort(); + list2.addArray(list); + return [list2.map(i => ["", "", "lukai_" + i])]; + }); + "step 1"; + if (result.bool) { + var list = lib.skill.lkbushi.getBushi(player), + list2 = result.moved[0].map(function (i) { + return i[2].slice(6); + }); + for (var i = 0; i < 4; i++) { + if (list[i] != list2[i]) { + player.logSkill("lkbushi"); + player.storage.lkbushi = list2; + var str = "#g"; + for (var j = 0; j < 4; j++) { + str += get.translation(list2[j]); + if (j != 3) str += "/"; + } + game.log(player, "将", "#g【卜筮】", "的花色序列改为", str); + game.delayx(); + break; + } + } + } + }, + mark: true, + marktext: "筮", + intro: { + content: function (storage, player) { + var list = lib.skill.lkbushi.getBushi(player).map(i => get.translation(i)); + return "①你使用" + list[0] + "牌无次数限制。②当你使用或打出" + list[1] + "牌后,你摸一张牌。③当你成为" + list[2] + "牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张" + list[3] + "牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。"; + }, + }, + group: ["lkbushi_unlimit", "lkbushi_draw", "lkbushi_defend", "lkbushi_gain"], + subSkill: { + unlimit: { + mod: { + cardUsable: function (card, player) { + const list = lib.skill.lkbushi.getBushi(player), + suit = get.suit(card); + if (suit === "unsure" || list[0] === suit) return Infinity; + }, + }, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + silent: true, + firstDo: true, + filter: function (event, player) { + if (event.addCount === false) return true; + var list = lib.skill.lkbushi.getBushi(player); + return list[0] == get.suit(event.card); + }, + content: function () { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (stat[name] && typeof stat[name] == "number") stat[name]--; + }, + }, + draw: { + audio: "lkbushi", + trigger: { player: ["useCard", "respond"] }, + forced: true, + locked: false, + filter: function (event, player) { + var list = lib.skill.lkbushi.getBushi(player); + return list[1] == get.suit(event.card); + }, + content: function () { + player.draw(); + }, + }, + defend: { + audio: "lkbushi", + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + var list = lib.skill.lkbushi.getBushi(player); + return list[2] == get.suit(event.card) && !event.excluded.includes(player) && player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player + .chooseToDiscard("he", get.prompt("lkbushi"), "弃置一张牌,令" + get.translation(trigger.card) + "对你无效") + .set("ai", function (card) { + if (_status.event.eff >= 0) return false; + return -_status.event.eff * 1.1 - get.value(card); + }) + .set("eff", get.effect(player, trigger.card, trigger.player, player)).logSkill = ["lkbushi_defend", trigger.player]; + "step 1"; + if (result.bool) { + trigger.excluded.add(player); + } + }, + }, + gain: { + audio: "lkbushi", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + content: function () { + var list = lib.skill.lkbushi.getBushi(player); + var card = get.cardPile(function (card) { + return get.suit(card, false) == list[3]; + }); + if (card) player.gain(card, "gain2"); + }, + }, + }, + }, + lkzhongzhuang: { + audio: 2, + trigger: { source: ["damageBegin1", "damageBegin4"] }, + forced: true, + filter: function (event, player, name) { + if (!event.card || event.card.name != "sha" || event.getParent().type != "card") return false; + var range = player.getAttackRange(); + if (name == "damageBegin1") return range > 3; + return range < 3 && event.num > 1; + }, + content: function () { + if (event.triggername == "damageBegin1") trigger.num++; + else trigger.num = 1; + }, + global: "lkzhongzhuang_ai", + subSkill: { + ai: { + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") { + if (arg.player && arg.player.hasSkill("lkzhongzhuang") && arg.player.getAttackRange() < 3) return true; + } + return false; + }, + }, + }, + }, + }, + //顾雍 + olbingyi: { + audio: "bingyi", + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + return event.type == "discard" && event.getl(player).cards2.length > 0 && player.countCards("h") > 0 && !player.hasSkill("olbingyi_blocker", null, null, false); + }, + prompt2: function (event, player) { + var str = "展示所有手牌,然后", + hs = player.getCards("h"); + var color = get.color(hs); + if (color == "none") return str + "无事发生"; + str += "令至多" + get.cnNumber(hs.length) + "名其他角色和自己各摸一张牌"; + return str; + }, + check: function (event, player) { + var color = get.color(player.getCards("h")); + return color != "none"; + }, + content: function () { + "step 0"; + player.addTempSkill("olbingyi_blocker", ["phaseZhunbeiAfter", "phaseJudgeAfter", "phaseDrawAfter", "phaseUseAfter", "phaseDiscardAfter", "phaseJieshuAfter"]); + player.showHandcards(get.translation(player) + "发动了【秉壹】"); + if (get.color(player.getCards("h")) == "none") event.finish(); + "step 1"; + var num = player.countCards("h"); + player.chooseTarget([1, num], "令至多" + get.cnNumber(num) + "名角色也各摸一张牌", lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + "step 2"; + var targets = [player]; + if (result.bool) { + targets.addArray(result.targets); + player.line(targets, "green"); + game.asyncDraw(targets.sortBySeat()); + } else { + player.draw(); + event.finish(); + } + "step 3"; + game.delayx(); + }, + subSkill: { blocker: { charlotte: true } }, + }, + //孙体 + xinzhaofu: { + audio: "zhaofu", + enable: "phaseUse", + usable: 1, + mark: true, + limited: true, + skillAnimation: true, + animationColor: "wood", + selectTarget: [1, 2], + filterTarget: lib.filter.notMe, + zhuSkill: true, + contentBefore: function () { + player.awakenSkill("xinzhaofu"); + }, + content: function () { + target.addSkill("xinzhaofu_effect"); + target.markAuto("xinzhaofu_effect", [player]); + }, + ai: { + order: 9, + result: { + target: function (player, target) { + var targets = game.filterPlayer(function (current) { + return current.group == "wu" && get.attitude(player, current) > 0; + }); + if (targets.length) { + for (var targetx of targets) { + if (!targetx.inRange(target)) return -1; + } + return -0.5; + } + return 0; + }, + }, + }, + subSkill: { + effect: { + charlotte: true, + mark: true, + intro: { content: "已视为在其他吴势力角色的攻击范围内" }, + mod: { + inRangeOf: function (from, to) { + if (from.group != "wu") return; + var list = to.getStorage("xinzhaofu_effect"); + for (var i of list) { + if (i != from) return true; + } + }, + }, + }, + }, + }, + xinkuangbi: { + audio: "kuangbi", + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; + }, + content: function () { + "step 0"; + target.chooseCard("he", [1, 3], "匡弼:交给" + get.translation(player) + "一至三张牌", true).set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { + return 7 - get.value(card); + } + return -get.value(card); + }); + "step 1"; + if (result.bool) { + target.give(result.cards, player, "giveAuto").gaintag.add("xinkuangbi_keep"); + player.addTempSkill("xinkuangbi_keep"); + target.addSkill("xinkuangbi_draw"); + target.addMark("xinkuangbi_draw", result.cards.length, false); + } + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0) { + return Math.sqrt(target.countCards("he")); + } + return 0; + }, + player: 1, + }, + }, + subSkill: { + keep: { + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("xinkuangbi_keep")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("xinkuangbi_keep")) return false; + }, + }, + charlotte: true, + onremove: function (player) { + player.removeGaintag("xinkuangbi_keep"); + }, + }, + draw: { + trigger: { player: "phaseBegin" }, + forced: true, + charlotte: true, + onremove: true, + intro: { + content: "下回合开始时摸#张牌", + }, + content: function () { + player.draw(player.countMark("xinkuangbi_draw")); + player.removeSkill("xinkuangbi_draw"); + }, + }, + }, + }, + rejingce: { + audio: "jingce", + trigger: { player: "phaseUseEnd" }, + frequent: true, + filter: function (event, player) { + return ( + player.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; + }).length > 0 + ); + }, + content: function () { + var list = []; + player.getHistory("useCard", function (evt) { + if (evt.getParent("phaseUse") == trigger) list.add(get.type2(evt.card)); + }); + player.draw(list.length); + }, + group: "rejingce_add", + }, + rejingce_add: { + trigger: { player: "loseEnd" }, + silent: true, + firstDo: true, + filter: function (event, player) { + if (event.getParent().name != "useCard" || player != _status.currentPhase) return false; + var list = player.getStorage("rejingce2"); + for (var i of event.cards) { + if (!list.includes(get.suit(i, player))) return true; + } + return false; + }, + content: function () { + if (!player.storage.rejingce2) player.storage.rejingce2 = []; + for (var i of trigger.cards) player.storage.rejingce2.add(get.suit(i, player)); + player.storage.rejingce2.sort(); + player.addTempSkill("rejingce2"); + player.markSkill("rejingce2"); + }, + }, + rejingce2: { + onremove: true, + intro: { + content: "当前已使用花色:$", + }, + mod: { + maxHandcard: function (player, num) { + return num + player.getStorage("rejingce2").length; + }, + }, + }, + rejueqing: { + audio: 2, + trigger: { source: "damageBegin2" }, + skillAnimation: true, + animationColor: "water", + filter: function (event, player) { + return player != event.player && !player.storage.rejueqing_rewrite; + }, + prompt2: function (event, player) { + var num = get.cnNumber(2 * event.num, true); + return "令即将对其造成的伤害翻倍至" + num + "点,并令自己失去" + get.cnNumber(event.num) + "点体力"; + }, + check: function (event, player) { + return ( + player.hp > event.num && + event.player.hp > event.num && + !event.player.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) && + get.attitude(player, event.player) < 0 + ); + }, + locked: function (skill, player) { + return player && player.storage.rejueqing_rewrite; + }, + logTarget: "player", + content: function () { + player.loseHp(trigger.num); + trigger.num *= 2; + player.storage.rejueqing_rewrite = true; + }, + derivation: "rejueqing_rewrite", + group: "rejueqing_rewrite", + subSkill: { + rewrite: { + trigger: { source: "damageBefore" }, + forced: true, + charlotte: true, + audio: "rejueqing", + filter: function (event, player) { + return player.storage.rejueqing_rewrite == true; + }, + check: function () { + return false; + }, + content: function () { + trigger.cancel(); + trigger.player.loseHp(trigger.num); + }, + ai: { + jueqing: true, + skillTagFilter: function (player) { + return player.storage.rejueqing_rewrite == true; + }, + }, + }, + }, + }, + reshangshi: { + audio: 2, + trigger: { + player: ["loseAfter", "changeHp", "gainMaxHpAfter", "loseMaxHpAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + frequent: true, + prompt: function (event, player) { + return "是否发动【伤逝】将手牌摸至" + get.cnNumber(player.getDamagedHp()) + "张?"; + }, + prompt2: false, + filter: function (event, player) { + if (event.getl && !event.getl(player)) return false; + return player.countCards("h") < player.getDamagedHp(); + }, + content: function () { + player.draw(player.getDamagedHp() - player.countCards("h")); + }, + ai: { + noh: true, + skillTagFilter: function (player, tag) { + if (tag == "noh" && player.maxHp - player.hp < player.countCards("h")) { + return false; + } + }, + }, + group: "reshangshi_2nd", + }, + reshangshi_2nd: { + trigger: { player: "damageBegin3" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + player + .chooseToDiscard("是否发动【伤逝】弃置一张牌?", "he") + .set("logSkill", "reshangshi") + .set("ai", function (card) { + var player = _status.event.player; + if (player.countCards("h") > player.getDamagedHp() + _status.event.getTrigger().num) return 1; + if (player.isPhaseUsing()) return 0.1 - player.getUseValue(card, null, true) / Math.max(0.1, get.value(card)); + return (get.position(card) == "h" ? 5 : 0.1) - get.value(card); + }); + }, + }, + oldzhenlie: { + audio: 2, + trigger: { player: "judge" }, + check: function (event, player) { + return event.judge(player.judging[0]) < 0; + }, + content: function () { + "step 0"; + var card = get.cards()[0]; + event.card = card; + game.cardsGotoOrdering(card).relatedEvent = trigger; + "step 1"; + player.$throw(card); + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = card; + game.log(trigger.player, "的判定牌改为", card); + game.delay(2); + }, + }, + oldmiji: { + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + audio: 2, + filter: function (event, player) { + return player.isDamaged(); + }, + content: function () { + "step 0"; + player.judge(function (card) { + return get.color(card) == "black" ? 1 : -1; + }).judge2 = function (result) { + return result.bool; + }; + "step 1"; + if (result.bool && player.maxHp > player.hp) { + var cards = get.cards(player.maxHp - player.hp); + event.cards = cards; + player + .chooseTarget(true) + .set("ai", function (target) { + return get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + }) + .set("createDialog", ["请选择一名角色获得这些牌", event.cards]); + } else { + event.finish(); + } + "step 2"; + player.line(result.targets); + result.targets[0].gain(event.cards, "draw"); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "recover") && target.hp == target.maxHp - 1) return [0, 0]; + if (target.hasFriend()) { + if ((get.tag(card, "damage") == 1 || get.tag(card, "loseHp")) && target.hp == target.maxHp) return [0, 1]; + } + }, + }, + threaten: function (player, target) { + if (target.hp == 1) return 3; + if (target.hp == 2) return 2; + return 1; + }, + }, + }, + oldqianxi: { + audio: 2, + trigger: { source: "damageBegin2" }, + check: function (event, player) { + var att = get.attitude(player, event.player); + if (event.player.hp == event.player.maxHp) return att < 0; + if (event.player.hp == event.player.maxHp - 1 && (event.player.maxHp <= 3 || event.player.hasSkillTag("maixie"))) return att < 0; + return att > 0; + }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && get.distance(player, event.player) <= 1; + }, + logTarget: "player", + content: function () { + "step 0"; + player.judge(function (card) { + return get.suit(card) != "heart" ? 1 : -1; + }).judge2 = function (result) { + return result.bool; + }; + "step 1"; + if (result.bool) { + trigger.cancel(); + trigger.player.loseMaxHp(true); + } + }, + }, + old_fuhun: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + "step 0"; + trigger.changeToZero(); + "step 1"; + var cards = get.cards(2); + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【父魂】"); + "step 2"; + player.gain(cards, "gain2"); + if (get.color(cards[0]) != get.color(cards[1])) { + player.addTempSkills(["wusheng", "paoxiao"]); + } + }, + derivation: ["wusheng", "paoxiao"], + }, + shiyong: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + check: function () { + return false; + }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && (get.color(event.card) == "red" || event.getParent(2).jiu == true); + }, + content: function () { + player.loseMaxHp(); + }, + ai: { + neg: true, + }, + }, + xindanshou: { + audio: 2, + trigger: { + global: "phaseJieshuBegin", + target: "useCardToTargeted", + }, + direct: true, + filter: function (event, player, name) { + return ((name == "phaseJieshuBegin" && event.player != player && player.countCards("he") >= event.player.countCards("h")) || (event.targets && event.targets.includes(player) && ["basic", "trick"].includes(get.type(event.card, "trick")))) && !player.hasSkill("xindanshou_as"); + }, + content: function () { + "step 0"; + if (event.triggername == "phaseJieshuBegin") { + var num = trigger.player.countCards("h"); + if (num > 0) + player + .chooseToDiscard(get.prompt("xindanshou", trigger.player), num, "弃置" + get.cnNumber(num) + "张牌并对" + get.translation(trigger.player) + "造成1点伤害", "he") + .set("logSkill", ["xindanshou", trigger.player]) + .set("ai", function (card) { + if (get.damageEffect(_status.event.getTrigger().player, _status.event.player, _status.event.player) > 0) return Math.max(5.5, 8 - _status.event.selectTarget) - get.value(card); + return -1; + }); + else + player.chooseBool(get.prompt("xindanshou", trigger.player), "对" + get.translation(trigger.player) + "造成1点伤害").ai = function () { + return get.damageEffect(trigger.player, player, player) > 0; + }; + } else { + var num = 0; + game.countPlayer2(function (current) { + var history = current.getHistory("useCard"); + for (var j = 0; j < history.length; j++) { + if (["basic", "trick"].includes(get.type(history[j].card, "trick")) && history[j].targets && history[j].targets.includes(player)) num++; + } + }); + event.num = num; + player + .chooseBool(get.prompt("xindanshou") + "(可摸" + get.cnNumber(num) + "张牌)", get.translation("xindanshou_info")) + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (player.isPhaseUsing()) { + if ( + player.countCards("h", function (card) { + return ["basic", "trick"].includes(get.type(card, "trick")) && player.canUse(card, player, null, true) && get.effect(player, card, player) > 0 && player.getUseValue(card, null, true) > 0; + }) + ) + return false; + return true; + } + if (num > 2) return true; + var card = trigger.card; + if (get.tag(card, "damage") && player.hp <= trigger.getParent().baseDamage && (!get.tag(card, "respondShan") || !player.hasShan()) && (!get.tag(card, "respondSha") || !player.hasSha())) return true; + var source = _status.currentPhase, + todis = source.countCards("h") - source.needsToDiscard(); + if ( + todis <= + Math.max( + Math.min( + 2 + (source.hp <= 1 ? 1 : 0), + player.countCards("he", function (card) { + return get.value(card, player) < Math.max(5.5, 8 - todis); + }) + ), + player.countCards("he", function (card) { + return get.value(card, player) <= 0; + }) + ) && + get.damageEffect(source, player, player) > 0 + ) + return false; + if (!source.isPhaseUsing() || get.attitude(player, source) > 0) return true; + if (card.name == "sha" && !source.getCardUsable("sha")) return true; + return Math.random() < num / 3; + })() + ); + } + "step 1"; + if (result.bool) { + if (!result.cards || !result.cards.length) { + player.logSkill("xindanshou", trigger.player); + } + if (event.triggername == "useCardToTargeted") { + player.draw(num); + player.addTempSkill("xindanshou_as"); + } else { + trigger.player.damage("nocard"); + } + } + }, + subSkill: { as: { sub: true } }, + ai: { + threaten: 0.6, + effect: { + target: function (card, player, target, current) { + if (typeof card != "object" || target.hasSkill("xindanshou_as") || !["basic", "trick"].includes(get.type(card, "trick"))) return; + var num = 0; + game.countPlayer2(function (current) { + var history = current.getHistory("useCard"); + for (var j = 0; j < history.length; j++) { + if (["basic", "trick"].includes(get.type(history[j].card, "trick")) && history[j].targets && history[j].targets.includes(player)) num++; + } + }); + if (player == target && current > 0) return [1.1, num]; + return [0.9, num]; + }, + }, + }, + }, + xinbenxi: { + group: ["xinbenxi_summer", "xinbenxi_damage"], + audio: 2, + trigger: { + player: "useCard2", + }, + forced: true, + mod: { + globalFrom: function (from, to, distance) { + if (_status.currentPhase == from) { + return distance - from.storage.xinbenxi; + } + }, + wuxieRespondable: function (card, player, target, current) { + if (player != current && player.storage.xinbenxi_directHit.includes(card)) { + return false; + } + }, + }, + init: function (player) { + player.storage.xinbenxi_directHit = []; + player.storage.xinbenxi_damage = []; + player.storage.xinbenxi_unequip = []; + player.storage.xinbenxi = 0; + }, + filter: function (trigger, player) { + return ( + _status.currentPhase == player && + trigger.targets && + trigger.targets.length == 1 && + (get.name(trigger.card) == "sha" || get.type(trigger.card) == "trick") && + !game.hasPlayer(function (current) { + return get.distance(player, current) > 1; + }) + ); + }, + filterx: function (event, player) { + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var list = ["为XXX多选择一个目标", " 令XXX无视防具牌 ", " 令XXX不可被抵消 ", "当XXX造成伤害时摸牌"], + card = get.translation(trigger.card); + for (var i = 0; i < list.length; i++) { + list[i] = [i, list[i].replace(/XXX/g, card)]; + } + var next = player.chooseButton(["奔袭:请选择一至两项", [list.slice(0, 2), "tdnodes"], [list.slice(2, 4), "tdnodes"]]); + next.set("forced", true); + next.set("selectButton", [1, 2]); + next.set("filterButton", function (button) { + if (button.link == 0) { + return _status.event.bool1; + } + return true; + }); + next.set("bool1", lib.skill.xinbenxi.filterx(trigger, player)); + next.set("ai", function (button) { + var player = _status.event.player; + var event = _status.event.getTrigger(); + switch (button.link) { + case 0: { + if ( + game.hasPlayer(function (current) { + return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current) && get.effect(current, event.card, player, player) > 0; + }) + ) + return 1.6 + Math.random(); + return 0; + } + case 1: { + if ( + event.targets.filter(function (current) { + var eff1 = get.effect(current, event.card, player, player); + player._xinbenxi_ai = true; + var eff2 = get.effect(current, event.card, player, player); + delete player._xinbenxi_ai; + return eff1 > eff2; + }).length + ) + return 1.9 + Math.random(); + return Math.random(); + } + case 2: { + var num = 1.3; + if ( + event.card.name == "sha" && + event.targets.filter(function (current) { + if ( + current.mayHaveShan( + player, + "use", + current.getCards("h", i => { + return i.hasGaintag("sha_notshan"); + }) + ) && + get.attitude(player, current) <= 0 + ) { + if (current.hasSkillTag("useShan")) num = 1.9; + return true; + } + return false; + }).length + ) + return num + Math.random(); + return 0.5 + Math.random(); + } + case 3: { + return (get.tag(event.card, "damage") || 0) + Math.random(); + } + } + }); + "step 1"; + var map = [ + function (trigger, player, event) { + player + .chooseTarget("请选择" + get.translation(trigger.card) + "的额外目标", true, function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("targets", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }); + }, + function (trigger, player, event) { + player.storage.xinbenxi_unequip.add(trigger.card); + }, + function (trigger, player, event) { + player.storage.xinbenxi_directHit.add(trigger.card); + trigger.nowuxie = true; + trigger.customArgs.default.directHit2 = true; + }, + function (trigger, player, event) { + player.storage.xinbenxi_damage.add(trigger.card); + }, + ]; + for (var i = 0; i < result.links.length; i++) { + game.log(player, "选择了", "#g【奔袭】", "的", "#y选项" + get.cnNumber(result.links[i] + 1, true)); + map[result.links[i]](trigger, player, event); + } + if (!result.links.includes(0)) event.finish(); + "step 2"; + if (result.targets) { + player.line(result.targets); + trigger.targets.addArray(result.targets); + } + }, + ai: { + unequip: true, + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "unequip") { + if (arg && player.storage.xinbenxi_unequip.includes(arg.card)) return true; + return false; + } + if ( + _status.currentPhase != player || + game.hasPlayer(function (current) { + return get.distance(player, current) > 1; + }) + ) + return false; + if (tag == "directHit_ai") return arg.card.name == "sha"; + if (!arg || !arg.card || (arg.card.name != "sha" && arg.card.name != "chuqibuyi")) return false; + var card = arg.target.getEquip(2); + if (card && card.name.indexOf("bagua") != -1) return true; + if (player._xinbenxi_ai) return false; + }, + }, + subSkill: { + damage: { + sub: true, + trigger: { global: "damageBegin1" }, + audio: 2, + forced: true, + filter: function (event, player) { + return event.card && player.storage.xinbenxi_damage.includes(event.card); + }, + content: function () { + player.draw(); + }, + }, + summer: { + sub: true, + trigger: { player: ["phaseAfter", "useCardAfter", "useCard"] }, + silent: true, + filter: function (event, player) { + return player == _status.currentPhase; + }, + content: function () { + if (trigger.name == "phase") { + player.storage.xinbenxi = 0; + return; + } else if (event.triggername == "useCard") { + player.logSkill("xinbenxi"); + player.storage.xinbenxi++; + player.syncStorage("xinbenxi"); + return; + } else { + player.storage.xinbenxi_unequip.remove(event.card); + player.storage.xinbenxi_directHit.remove(event.card); + player.storage.xinbenxi_damage.remove(event.card); + } + }, + }, + }, + }, + xinyaoming: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return ["摸牌", "弃牌", "制衡"].some(function (control) { + var storage = player.getStorage("xinyaoming_kanon"); + if (storage.includes(control)) return false; + if (control == "摸牌" && target != player) return true; + if (control == "弃牌" && target != player && target.countCards("h")) return true; + if (control == "制衡") return true; + return false; + }); + }); + }, + direct: true, + content: function () { + "step 0"; + var func = function () { + game.countPlayer(function (target) { + var list = ["摸牌", "弃牌", "制衡"].filter(function (control) { + var storage = player.getStorage("xinyaoming_kanon"); + if (storage.includes(control)) return false; + if (control == "摸牌" && target != player) return true; + if (control == "弃牌" && target != player && target.countCards("h")) return true; + if (control == "制衡") return true; + return false; + }), + str = ""; + for (var i of list) str += i + "
    "; + str = str.slice(0, -4); + target.prompt(str); + }); + }; + if (event.player == game.me) func(); + else if (event.isOnline()) player.send(func); + player + .chooseTarget(get.prompt2("xinyaoming"), function (card, player, target) { + var storage = player.getStorage("xinyaoming_kanon"); + if (!storage.includes("制衡")) return true; + if (target == player) return false; + return !storage.includes("摸牌") || target.countCards("h"); + }) + .set("ai", function (target) { + var player = _status.event.player; + var storage = player.getStorage("xinyaoming_kanon"); + if (get.attitude(player, target) > 0 && !storage.includes("摸牌") && target != player) return get.effect(target, { name: "draw" }, player, player); + if (get.attitude(player, target) < 0 && !storage.includes("弃牌") && target != player && target.countCards("h")) return get.effect(target, { name: "guohe_copy2" }, player, player); + if (get.attitude(player, target) > 0 && !storage.includes("制衡")) return get.effect(target, { name: "kaihua" }, player, player); + return 0; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xinyaoming", target); + var controls = ["摸牌", "弃牌", "制衡"].filter(function (control) { + var storage = player.getStorage("xinyaoming_kanon"); + if (storage.includes(control)) return false; + if (control == "摸牌" && target != player) return true; + if (control == "弃牌" && target != player && target.countCards("h")) return true; + if (control == "制衡") return true; + return false; + }); + if (controls.length == 1) event._result = { control: controls[0] }; + else { + var str = get.translation(target); + var choiceList = ["令" + str + "摸一张牌", "弃置" + str + "一张手牌", "令" + str + "弃置至多两张牌,然后其摸等量的牌"]; + var list = ["摸牌", "弃牌", "制衡"]; + for (var i = 0; i < 3; i++) { + if (!controls.includes(list[i])) { + choiceList[i] = '' + choiceList[i] + ""; + } + } + player + .chooseControl(controls) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player; + var target = _status.event.target; + var controls = _status.event.controls.slice(); + var map = { + 摸牌: get.effect(target, { name: "draw" }, player, player), + 弃牌: get.effect(target, { name: "guohe_copy2" }, player, player), + 制衡: get.effect(target, { name: "kaihua" }, player, player), + }; + controls.sort((a, b) => map[b] - map[a]); + return controls[0]; + }) + .set("target", target); + } + } else event.finish(); + "step 2"; + player.addTempSkill("xinyaoming_kanon"); + player.markAuto("xinyaoming_kanon", [result.control]); + switch (result.control) { + case "摸牌": + target.draw(); + break; + case "弃牌": + player.discardPlayerCard(target, "h", true); + break; + case "制衡": + target.chooseToDiscard([1, 2], "he", "邀名:弃置至多两张牌,然后摸等量的牌", true).set("ai", card => lib.skill.zhiheng.check(card)); + break; + } + if (result.control != "制衡") event.finish(); + "step 3"; + if (result.bool) { + target.draw(result.cards.length); + } + }, + subSkill: { + kanon: { + charlotte: true, + onremove: true, + }, + }, + }, + xinfuli: { + audio: 2, + skillAnimation: true, + animationColor: "soil", + unique: true, + limited: true, + enable: "chooseToUse", + mark: true, + filter: function (event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; + return true; + }, + content: function () { + "step 0"; + player.awakenSkill("xinfuli"); + event.num = game.countGroup(); + player.recover(event.num - player.hp); + "step 1"; + var num2 = num - player.countCards("h"); + if (num2) player.draw(num2); + "step 2"; + if (num > 2) player.turnOver(); + player.storage.xinfuli = true; + }, + ai: { + save: true, + skillTagFilter: function (player, arg, target) { + return player == target; + }, + result: { + player: 10, + }, + threaten: function (player, target) { + if (!target.storage.xinfuli) return 0.9; + }, + }, + intro: { + content: "limited", + }, + }, + xindangxian: { + trigger: { player: "phaseBegin" }, + forced: true, + audio: "dangxian", + audioname: ["guansuo", "xin_liaohua", "re_liaohua"], + audioname2: { + dc_guansuo: "dangxian_guansuo", + }, + content: function () { + trigger.phaseList.splice(trigger.num, 0, "phaseUse|xindangxian"); + }, + group: "xindangxian_rewrite", + subSkill: { + rewrite: { + trigger: { player: "phaseUseBegin" }, + forced: true, + popup: false, + filter: function (kagari) { + return kagari._extraPhaseReason == "xindangxian"; + }, + content: function () { + "step 0"; + if (player.storage.xinfuli) { + player.chooseBool("是否失去1点体力并获得一张【杀】?").ai = function () { + return player.hp > 2 && !player.hasSha(); + }; + } else event._result = { bool: true }; + "step 1"; + if (!result.bool) { + event.finish(); + return; + } + player.loseHp(); + "step 2"; + var card = get.cardPile(function (card) { + return card.name == "sha"; + }); + if (card) player.gain(card, "gain2"); + "step 3"; + game.updateRoundNumber(); + }, + }, + }, + }, + dangxian_guansuo: { audio: 2 }, + xinjunxing: { + inherit: "junxing", + audio: "junxing", + content: function () { + "step 0"; + var types = []; + for (var i = 0; i < cards.length; i++) { + types.add(get.type(cards[i], "trick", player)); + } + target + .chooseToDiscard(function (card) { + return !_status.event.types.includes(get.type(card, "trick")); + }) + .set("ai", function (card) { + if (_status.event.player.isTurnedOver()) return -1; + return 8 - get.value(card); + }) + .set("types", types) + .set("dialog", ["弃置一张与" + get.translation(player) + "弃置的牌类别均不同的牌,或将武将牌翻面", "hidden", cards]); + "step 1"; + if (!result.bool) { + target.turnOver(); + } else event.finish(); + "step 2"; + var num = 4 - target.countCards("h"); + if (num) target.draw(num); + }, + }, + xinzhige: { + enable: "phaseUse", + usable: 1, + audio: "zhige", + position: "he", + selectTarget: 2, + multitarget: true, + targetprompt: ["出杀人", "出杀目标"], + filterTarget: function (card, player, target) { + if (ui.selected.targets.length == 0) { + return target != player && target.inRange(player); + } else { + return ui.selected.targets[0].inRange(target); + } + }, + content: function () { + "step 0"; + targets[0].chooseCard("交给" + get.translation(player) + "一张【杀】或武器牌,否则视为对" + get.translation(targets[1]) + "使用一张【杀】", "he", function (card) { + return get.name(card) == "sha" || get.subtype(card) == "equip1"; + }).ai = function (card) { + var player = _status.event.player; + var target = _status.event.getParent("xinzhige").targets[1]; + return get.effect(target, { name: "sha" }, player, player) >= 0 ? -1 : 9 - get.value(card); + }; + "step 1"; + if (result.bool) { + targets[0].give(result.cards, player, "give"); + } else { + if (targets[0].canUse("sha", targets[1])) targets[0].useCard({ name: "sha", isCard: true }, targets[1]); + } + }, + ai: { + result: { + target: function (player, target) { + if (ui.selected.targets.length) { + var from = ui.selected.targets[0]; + return get.effect(target, { name: "sha" }, from, target); + } + var effs = [0, 0]; + game.countPlayer(function (current) { + if (current != target && target.canUse("sha", current)) { + var eff = get.effect(current, { name: "sha" }, target, target); + if (eff > effs[0]) effs[0] = eff; + if (eff < effs[1]) effs[1] = eff; + } + }); + return effs[get.attitude(player, target) > 0 ? 0 : 1]; + }, + }, + order: 8.5, + expose: 0.2, + }, + }, + xinzongzuo: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + audio: "zongzuo", + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + var num = game.countGroup(); + player.gainMaxHp(num); + event.num = num; + "step 1"; + player.recover(event.num); + //player.update(); + }, + group: "xinzongzuo_lose", + subSkill: { + lose: { + trigger: { global: "dieAfter" }, + forced: true, + audio: "zongzuo", + filter: function (event, player) { + if (!lib.group.includes(event.player.group)) return false; + if ( + game.hasPlayer(function (current) { + return current.group == event.player.group; + }) + ) { + return false; + } + return true; + }, + content: function () { + "step 0"; + player.loseMaxHp(); + "step 1"; + player.draw(2); + }, + }, + }, + }, + xintaoluan: { + hiddenCard: function (player, name) { + return !player.getStorage("xintaoluan").includes(name) && player.countCards("hes") > 0 && !player.hasSkill("xintaoluan3") && lib.inpile.includes(name); + }, + audio: "taoluan", + enable: "chooseToUse", + filter: function (event, player) { + return ( + !player.hasSkill("xintaoluan3") && + player.hasCard(card => + lib.inpile.some(name => { + if (player.getStorage("xintaoluan").includes(name)) return false; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + if (event.filterCard({ name: name, isCard: true, cards: [card] }, player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if (event.filterCard({ name: name, nature: nature, isCard: true, cards: [card] }, player, event)) return true; + } + } + return false; + }, "hes") + ) > 0 && + !_status.dying.length + ); + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) == "basic" || get.type(name) == "trick") { + if (player.getStorage("xintaoluan").includes(name)) continue; + list.push([get.translation(get.type(name)), "", name]); + if (name == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } + } + } + 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) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if (player.countCards("hes", cardx => cardx.name == card.name)) return 0; + return _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + }, + backup: function (links, player) { + return { + filterCard: true, + audio: "taoluan", + popname: true, + check: function (card) { + return 7 - get.value(card); + }, + position: "hes", + viewAs: { name: links[0][2], nature: links[0][3] }, + onuse: function (result, player) { + var evt = _status.event.getParent("phase"); + if (evt && evt.name == "phase" && !evt.xintaoluan) { + evt.xintaoluan = true; + var next = game.createEvent("xintaoluan_clear"); + _status.event.next.remove(next); + evt.after.push(next); + next.player = player; + next.setContent(function () { + delete player.storage.xintaoluan; + delete player.storage.xintaoluan2; + }); + } + player.markAuto("xintaoluan", [result.card.name]); + }, + }; + }, + prompt: function (links, player) { + return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 4, + save: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (!player.countCards("hes") || player.hasSkill("taoluan3")) return false; + if (tag == "respondSha" || tag == "respondShan") { + if (arg == "respond") return false; + return !player.getStorage("taoluan").includes(tag == "respondSha" ? "sha" : "shan"); + } + return !player.getStorage("taoluan").includes("tao") || (!player.getStorage("taoluan").includes("jiu") && arg == player); + }, + result: { + player: function (player) { + var num = player.countMark("xintaoluan2"); + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && players[i].countCards("he") > (num + 1) * 2 && get.attitude(player, players[i]) > 0) { + return 1; + } + } + return 0; + }, + }, + threaten: 1.9, + }, + group: "xintaoluan2", + }, + xintaoluan2: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + if (!game.hasPlayer(current => current != player)) return false; + return event.skill == "xintaoluan_backup"; + }, + content: function () { + "step 0"; + player.addMark("xintaoluan2", 1, false); + event.num = player.countMark("xintaoluan2"); + player + .chooseTarget( + true, + function (card, player, target) { + return target != player; + }, + '滔乱

    令一名其他角色选择一项:1.交给你' + get.cnNumber(event.num) + "张与你以此法使用的牌类别不同的牌;2.你失去" + get.cnNumber(event.num) + "点体力" + ) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) { + if (get.attitude(target, player) > 0) { + return target.countCards("h"); + } + return target.countCards("h") / 2; + } + return 0; + }); + "step 1"; + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var type = get.type(trigger.card, "trick"); + target + .chooseCard('滔乱

    交给' + get.translation(player) + get.cnNumber(num) + "张不为" + get.translation(type) + "牌的牌,或令其失去" + get.cnNumber(num) + "点体力且滔乱无效直到回合结束", "he", num, function (card, player, target) { + return get.type(card, "trick") != _status.event.cardType; + }) + .set("cardType", type) + .set("ai", function (card) { + if (_status.event.att) { + return 11 - get.value(card); + } + return 0; + }) + .set("att", get.attitude(target, player) > 0); + "step 2"; + var target = event.target; + if (result.bool) { + target.give(result.cards, player, "give"); + } else { + player.addTempSkill("xintaoluan3"); + player.loseHp(num); + } + }, + }, + xintaoluan3: { charlotte: true }, + xintaoluan_backup: {}, + xincaishi: { + trigger: { + player: "phaseDrawBegin2", + }, + audio: "caishi", + direct: true, + content: function () { + "step 0"; + var choiceList = ["手牌上限-1且发动【忠鉴】时可以多展示对方的一张牌"]; + if (!trigger.numFixed) { + choiceList.push("摸牌阶段多摸两张牌,然后本回合内不能发动【忠鉴】"); + if (trigger.num > 0) { + choiceList.unshift("摸牌阶段少摸一张牌,发动【忠鉴】时可以多展示自己的一张牌直到回合结束"); + event.first = true; + } + } + var next = player.chooseControl("cancel2"); + next.set("choiceList", choiceList); + next.set("prompt", get.prompt("xincaishi")); + next.set("ai", function () { + return 2; + }); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("xincaishi"); + if (!event.first) result.index++; + trigger.num += result.index > 1 ? 2 : result.index - 1; + player.addTempSkill("xincaishi_" + result.index); + } + }, + subSkill: { + 0: { + mark: true, + intro: { + content: "发动【忠鉴】时可以多展示自己的一张牌", + }, + }, + 1: { + mark: true, + intro: { + content: "发动【忠鉴】时可以多展示目标角色的一张牌", + }, + mod: { + maxHandcard: function (player, num) { + return num - 1; + }, + }, + }, + 2: { + mark: true, + intro: { + content: "不能发动【忠鉴】直到回合结束", + }, + }, + }, + }, + xinzhongjian: { + audio: "zhongjian", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.hasSkill("xincaishi_2") && player.countCards("h") > 0; + }, + filterTarget: function (event, player, target) { + return target != player && target.countCards("h") > 0; + }, + filterCard: true, + selectCard: function () { + return _status.event.player.hasSkill("xincaishi_0") ? [1, 2] : [1, 1]; + }, + check: function () { + return 1; + }, + discard: false, + lose: false, + content: function () { + "step 0"; + event.suits = []; + event.nums = []; + for (var i = 0; i < cards.length; i++) { + event.suits.push(get.suit(cards[i])); + event.nums.push(get.number(cards[i])); + } + player.showCards(cards); + "step 1"; + player.choosePlayerCard(target, "h", [1, player.hasSkill("xincaishi_1") ? 4 : 3], "请选择要展示的牌", true).ai = function () { + return Math.random(); + }; + "step 2"; + event.cards2 = result.cards.slice(0); + target.showCards(event.cards2); + "step 3"; + var card = event.cards2.shift(); + var bool = false; + if (event.suits.includes(get.suit(card))) { + bool = true; + player.draw(); + } + if (event.nums.includes(get.number(card))) { + bool = true; + target.damage("nocard"); + } + if (!bool && player.countCards("h")) player.chooseToDiscard("h", true); + "step 4"; + if (event.cards2.length) event.goto(3); + }, + ai: { + result: { + target: function (player, target) { + return -target.countCards("h"); + }, + }, + }, + }, + new_qingxian: { + group: ["qingxian_draw"], + enable: "phaseUse", + audio: "qingxian", + usable: 1, + position: "he", + filterTarget: function (card, player, target) { + return target != player; + }, + complexCard: true, + complexSelect: true, + selectTarget: function () { + return ui.selected.cards.length; + }, + filterCard: true, + selectCard: function () { + var player = _status.event.player; + return [1, player.hp]; + }, + check: function (cardx) { + var player = _status.event.player; + var number = game.countPlayer(function (target) { + if (player == target) return false; + var pe = player.countCards("e", function (card) { + return card != cardx && ui.selected.cards.includes(card) == false; + }); + var te = target.countCards("e"); + if (pe > te && target.isDamaged() && get.attitude(player, target) > 2) return true; + else if (pe == te && get.attitude(player, target) > 2) return true; + else if (pe < te && get.attitude(player, target) < 0) return true; + return false; + }); + if (ui.selected.cards.length < number) return 7 - get.value(cardx); + else return 0; + }, + targetprompt: function (target) { + var pe = _status.event.player.countCards("e", function (card) { + return ui.selected.cards.includes(card) == false; + }); + var te = target.countCards("e"); + if (pe > te) return "回复体力"; + else if (pe == te) return "摸一张牌"; + else if (pe < te) return "失去体力"; + }, + line: "thunder", + content: function () { + var pe = player.countCards("e"); + var te = target.countCards("e"); + if (pe > te) target.recover(); + else if (pe == te) target.draw(); + else if (pe < te) target.loseHp(); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + var pe = player.countCards("e", function (card) { + return ui.selected.cards.includes(card) == false; + }); + var te = target.countCards("e"); + if (pe > te && target.isDamaged()) return 2; + else if (pe == te) return 1; + else if (pe < te) return -2.5; + else return 0; + }, + }, + }, + }, + new_juexiang: { + audio: "qingxian_jilie", + trigger: { + player: "die", + }, + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "water", + derivation: ["new_canyun"], + content: function () { + "step 0"; + if (trigger.source) { + trigger.source.discard(trigger.source.getCards("e")); + trigger.source.loseHp(); + } + "step 1"; + player + .chooseTarget("【绝响】:是否令一名其他角色获得技能〖残韵〗?", function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countCards("ej", { suit: "club" })) att = att * 2; + return 10 + att; + }) + .set("forceDie", true); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "thunder"); + target.addSkills("new_canyun"); + target + .discardPlayerCard("是否弃置自己区域内的一张梅花牌,获得技能〖绝响〗?", target, "hej") + .set("ai", function (card) { + if (get.position(card) == "j") return 100 + get.value(card); + return 100 - get.value(card); + }) + .set("visible", true) + .set("filterButton", function (card) { + return get.suit(card.link) == "club"; + }); + } else event.finish(); + "step 3"; + if (result.bool) target.addSkills("new_juexiang"); + }, + }, + new_canyun: { + group: ["qingxian_draw"], + complexCard: true, + complexSelect: true, + marktext: "韵", + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + intro: { + content: function (storage) { + var str = ""; + var str2 = "
  • 出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色(不能选择已经成为过〖残韵〗目标的角色)。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)"; + if (storage.length > 0) { + for (var i = 0; i < storage.length; i++) { + str += "、"; + str += get.translation(storage[i]); + } + str = str.slice(1); + str2 += "
  • 已对" + str + "发动过〖残韵〗"; + } + return str2; + }, + }, + mark: true, + enable: "phaseUse", + usable: 1, + check: function (cardx) { + var player = _status.event.player; + var number = game.countPlayer(function (target) { + if (player == target) return false; + var pe = player.countCards("e", function (card) { + return card != cardx && ui.selected.cards.includes(card) == false; + }); + var te = target.countCards("e"); + if (pe > te && target.isDamaged() && get.attitude(player, target) > 2) return true; + else if (pe < te && get.attitude(player, target) < 0) return true; + return false; + }); + if (ui.selected.cards.length < number) return 6 - get.value(cardx); + else return 0; + }, + filter: function (event, player) { + if (!player.storage.new_canyun) player.storage.new_canyun = []; + return game.hasPlayer(function (current) { + return current != player && !player.storage.new_canyun.includes(current); + }); + }, + filterTarget: function (card, player, target) { + return target != player && !player.storage.new_canyun.includes(target); + }, + selectTarget: function () { + return ui.selected.cards.length; + }, + filterCard: true, + selectCard: function () { + var player = _status.event.player; + return [1, player.hp]; + }, + targetprompt: function (target) { + var pe = _status.event.player.countCards("e", function (card) { + return ui.selected.cards.includes(card) == false; + }); + var te = target.countCards("e"); + if (pe > te) return "回复体力"; + else if (pe == te) return "摸一张牌"; + else if (pe < te) return "失去体力"; + }, + line: "thunder", + position: "he", + content: function () { + player.storage.new_canyun.push(target); + var pe = player.countCards("e"); + var te = target.countCards("e"); + if (pe > te) target.recover(); + else if (pe == te) target.draw(); + else if (pe < te) target.loseHp(); + }, + ai: { + order: 10, + result: { + target: function (player, target) { + var pe = player.countCards("e"); + var te = target.countCards("e"); + if (pe > te && target.isDamaged()) return 2; + else if (pe == te) return 1; + else if (pe < te) return -2.5; + else return 0; + }, + }, + }, + }, + qingxian_draw: { + trigger: { + player: ["new_qingxianAfter", "new_canyunAfter"], + }, + forced: true, + popup: false, + silent: false, + filter: function (event, player) { + return event.target == event.targets[event.targets.length - 1] && event.targets.length == player.hp; + }, + content: function () { + player.draw(); + }, + }, + zhenjun: { + audio: "jieyue", + trigger: { + player: "phaseZhunbeiBegin", + }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h") > current.hp; + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("zhenjun"), function (card, player, target) { + return target.countCards("h") > target.hp; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) * (target.countCards("e") + 1); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var num = target.countCards("h") - target.hp; + player.line(target, "thunder"); + player.logSkill("zhenjun", target); + player.discardPlayerCard(num, target, true); + } + "step 2"; + if (result.cards && result.cards.length) { + event.num = 0; + event.num2 = result.cards.length; + for (var i = 0; i < result.cards.length; i++) { + if (get.type(result.cards[i], null, result.cards[i].original == "h" ? target : false) != "equip") { + event.num++; + } + } + if (event.num > 0) { + var prompt = "弃置" + get.cnNumber(event.num) + "张牌,或令" + get.translation(event.target) + "摸" + get.cnNumber(event.num2) + "张牌"; + player.chooseToDiscard(event.num, prompt, "he").ai = function (card) { + return 5 - get.value(card); + }; + } else event.finish(); + } else event.finish(); + "step 3"; + if (!result.bool) { + event.target.draw(event.num2); + } + }, + }, + rezhenjun: { + audio: "jieyue", + trigger: { + player: "phaseZhunbeiBegin", + }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h") > 0; + }); + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("rezhenjun"), (card, player, target) => { + return target.countCards("he"); + }).ai = function (target) { + return -get.attitude(_status.event.player, target) * (target.countCards("e") + 1); + }; + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var num = Math.max(target.countCards("h") - target.hp, 1); + player.logSkill("rezhenjun", target); + player.discardPlayerCard(num, target, true); + } + "step 2"; + if (result.cards && result.cards.length) { + event.num = 0; + for (var i = 0; i < result.cards.length; i++) { + if (get.type(result.cards[i]) != "equip") { + event.num++; + } + } + if (event.num > 0) { + var prompt = "弃置" + get.cnNumber(event.num) + "张牌,或令" + get.translation(event.target) + "摸" + get.cnNumber(event.num) + "张牌"; + player.chooseToDiscard(event.num, prompt, "he").ai = function (card) { + return 5 - get.value(card); + }; + } else event.finish(); + } else event.finish(); + "step 3"; + if (!result.bool) { + event.target.draw(event.num); + } + }, + }, + fenli: { + audio: 2, + audioname: ["xin_zhuhuan"], + group: ["fenli_draw", "fenli_use", "fenli_discard"], + subfrequent: ["discard"], + subSkill: { + draw: { + audio: "fenli", + audioname: ["xin_zhuhuan"], + trigger: { player: "phaseDrawBefore" }, + prompt: "是否发动【奋励】跳过摸牌阶段?", + filter: function (event, player) { + return player.isMaxHandcard(); + }, + check: function (event, player) { + if (player.getHistory("skipped").length > 0) return false; + return game.hasPlayer(function (current) { + return get.attitude(player, current) < 0 && current.hp == 1 && get.damageEffect(current, player, player) > 0; + }); + }, + content: function () { + trigger.cancel(); + }, + }, + use: { + audio: "fenli", + audioname: ["xin_zhuhuan"], + trigger: { player: "phaseUseBefore" }, + prompt: "是否发动【奋励】跳过出牌阶段?", + filter: function (event, player) { + return player.isMaxHp(); + }, + check: function (event, player) { + if (!player.needsToDiscard() || (player.countCards("e") && player.isMaxEquip())) return true; + if (player.getHistory("skipped").length > 0) return false; + return game.hasPlayer(function (current) { + return get.attitude(player, current) < 0 && current.hp == 1 && get.damageEffect(current, player, player) > 0; + }); + }, + content: function () { + trigger.cancel(); + }, + }, + discard: { + audio: "fenli", + audioname: ["xin_zhuhuan"], + trigger: { player: "phaseDiscardBefore" }, + prompt: "是否发动【奋励】跳过弃牌阶段?", + frequent: true, + filter: function (event, player) { + return player.isMaxEquip() && player.countCards("e"); + }, + content: function () { + trigger.cancel(); + }, + }, + }, + ai: { + combo: "pingkou", + }, + }, + pingkou: { + audio: 2, + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.getHistory("skipped").length > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget([1, player.getHistory("skipped").length], get.prompt2("pingkou"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + player.logSkill("pingkou", result.targets); + event.targets = result.targets.slice(0).sortBySeat(); + } else { + event.finish(); + } + "step 2"; + if (event.targets && event.targets.length) { + event.targets.shift().damage(); + event.redo(); + } + }, + ai: { + combo: "fenli", + effect: { + target: function (card) { + if (card.name == "lebu" || card.name == "bingliang") return 0.5; + }, + }, + }, + }, + xinanguo: { + audio: "anguo", + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + if (target.isMinHandcard()) { + target.draw(); + event.h = true; + } + "step 1"; + if (target.isMinHp() && target.isDamaged()) { + target.recover(); + event.hp = true; + } + "step 2"; + var equip = get.cardPile(function (card) { + return get.type(card) == "equip" && target.hasUseTarget(card); + }); + if (target.isMinEquip() && equip) { + target.chooseUseTarget(equip, "nothrow", "nopopup", true); + event.e = true; + } + "step 3"; + game.updateRoundNumber(); + if (!event.h && player.isMinHandcard()) { + player.draw(); + } + "step 4"; + if (!event.hp && player.isMinHp() && player.isDamaged()) { + player.recover(); + } + "step 5"; + if (!event.e && player.isMinEquip()) { + var equip = get.cardPile(function (card) { + return get.type(card) == "equip" && player.hasUseTarget(card); + }); + if (equip) player.chooseUseTarget(equip, "nothrow", "nopopup", true); + } + "step 6"; + game.updateRoundNumber(); + }, + ai: { + threaten: 1.6, + order: 9, + result: { + player: function (player, target) { + if (get.attitude(player, target) <= 0) { + if (target.isMinHandcard() || target.isMinEquip() || target.isMinHp()) return -1; + } + var num = 0; + if (player.isMinHandcard() || target.isMinHandcard()) num++; + if (player.isMinEquip() || target.isMinEquip()) num++; + if ((player.isMinHp() && player.isDamaged()) || (target.isMinHp() && target.isDamaged())) num += 2.1; + return num; + }, + }, + }, + }, + pindi: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + if (player == target) return false; + if (player.storage.pindi_target && player.storage.pindi_target.includes(target)) { + return false; + } + return true; + }, + filterCard: function (card, player) { + if (player.storage.pindi_type && player.storage.pindi_type.includes(get.type2(card))) { + return false; + } + return true; + }, + subSkill: { + clear: { + trigger: { player: "phaseAfter" }, + silent: true, + content: function () { + delete player.storage.pindi_target; + delete player.storage.pindi_type; + }, + }, + }, + //group:'pindi_clear', + check: function (card) { + var num = _status.event.player.getStat("skill").pindi || 0; + return 6 + num - get.value(card); + }, + position: "he", + content: function () { + "step 0"; + if (!player.storage.pindi_target) { + player.storage.pindi_target = []; + } + if (!player.storage.pindi_type) { + player.storage.pindi_type = []; + } + player.storage.pindi_target.push(target); + player.storage.pindi_type.push(get.type2(cards[0], cards[0].original == "h" ? player : false)); + event.num = player.getStat("skill").pindi; + var evt = _status.event.getParent("phase"); + if (evt && evt.name == "phase" && !evt.pindi) { + var next = game.createEvent("rerende_clear"); + _status.event.next.remove(next); + evt.after.push(next); + evt.pindi = true; + next.player = player; + next.setContent(lib.skill.pindi_clear.content); + } + player.syncStorage(); + if (target.countCards("he") == 0) event._result = { index: 0 }; + else { + player + .chooseControlList(["令" + get.translation(target) + "摸" + get.cnNumber(event.num) + "张牌", "令" + get.translation(target) + "弃置" + get.cnNumber(event.num) + "张牌"], function () { + return _status.event.choice; + }) + .set("choice", get.attitude(player, target) > 0 ? 0 : 1); + } + "step 1"; + if (result.index == 0) { + target.draw(event.num); + } else { + target.chooseToDiscard(event.num, "he", true); + } + "step 2"; + if (target.isDamaged()) { + player.link(true); + } + }, + ai: { + order: 8, + threaten: 1.8, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + var num = (player.getStat("skill").pindi || 0) + 1; + if (att <= 0 && target.countCards("he") < num) return 0; + return get.sgn(att); + }, + }, + }, + }, + funan: { + audio: 2, + trigger: { global: ["respond", "useCard"] }, + filter: function (event, player) { + if (!event.respondTo) return false; + if (event.player == player) return false; + if (player != event.respondTo[0]) return false; + if (!player.hasSkill("funan_jiexun")) { + var cards = []; + if (get.itemtype(event.respondTo[1]) == "card") cards.push(event.respondTo[1]); + else if (event.respondTo[1].cards) cards.addArray(event.respondTo[1].cards); + return cards.filterInD("od").length > 0; + } else return event.cards.filterInD("od").length > 0; + }, + logTarget: "player", + content: function () { + "step 0"; + if (!player.hasSkill("funan_jiexun")) { + var cards = []; + if (get.itemtype(trigger.respondTo[1]) == "card") cards.push(trigger.respondTo[1]); + else if (trigger.respondTo[1].cards) cards.addArray(trigger.respondTo[1].cards); + cards = cards.filterInD("od"); + trigger.player.gain(cards, "gain2", "log").gaintag.add("funan"); + trigger.player.addTempSkill("funan_use"); + } + "step 1"; + var cards = trigger.cards.filterInD("od"); + player.gain(cards, "log", "gain2"); + }, + subSkill: { + jiexun: { + charlotte: true, + mark: true, + marktext: "复", + intro: { + content: "你发动“复难”时,无须令其他角色获得你使用的牌", + }, + }, + use: { + onremove: function (player) { + player.removeGaintag("funan"); + }, + charlotte: true, + mod: { + cardEnabled2: function (card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("funan")) { + return false; + } + }, + }, + }, + }, + }, + jiexun: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + onremove: true, + direct: true, + content: function () { + "step 0"; + var num1 = game.countPlayer(function (current) { + return current.countCards("ej", { suit: "diamond" }); + }); + var num2 = player.countMark("jiexun"); + event.num1 = num1; + event.num2 = num2; + var str = "令目标摸" + get.cnNumber(num1) + "张牌"; + if (num2) { + str += ",然后弃置" + get.cnNumber(num2) + "张牌;若目标因此法弃置了所有牌,则你失去“诫训”,然后你发动“复难”时,无须令其获得你使用的牌"; + } + player + .chooseTarget(get.prompt("jiexun"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + return _status.event.coeff * get.attitude(_status.event.player, target); + }) + .set("coeff", num1 >= num2 ? 1 : -1) + .set("prompt2", str); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jiexun", target); + if (event.num1) { + target.draw(event.num1); + } + player.addMark("jiexun", 1, false); + } else { + event.finish(); + } + "step 2"; + if (event.num2) { + event.target.chooseToDiscard(event.num2, true, "he"); + } else { + event.finish(); + } + "step 3"; + if (result.bool && result.autochoose && result.cards.length == result.rawcards.length) { + player.removeSkills("jiexun"); + player.addSkill("funan_jiexun"); + } + }, + }, + xinjiexun: { + audio: "jiexun", + trigger: { player: "phaseJieshuBegin" }, + onremove: true, + direct: true, + content: function () { + "step 0"; + var num1 = game.countPlayer(function (current) { + return current.countCards("ej", { suit: "diamond" }); + }); + var num2 = player.countMark("xinjiexun"); + event.num1 = num1; + event.num2 = num2; + var str = "令目标摸" + get.cnNumber(num1) + "张牌"; + if (num2) { + str += ",然后弃置" + get.cnNumber(num2) + "张牌"; + } + player + .chooseTarget(get.prompt("xinjiexun"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + return _status.event.coeff * get.attitude(_status.event.player, target); + }) + .set("coeff", num1 >= num2 ? 1 : -1) + .set("prompt2", str); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xinjiexun", target); + if (event.num1) { + target.draw(event.num1); + } + player.addMark("xinjiexun", 1, false); + } else { + event.finish(); + } + "step 2"; + if (event.num2) { + event.target.chooseToDiscard(event.num2, true, "he"); + } else { + event.finish(); + } + "step 3"; + if (result.bool && result.autochoose && result.cards.length == result.rawcards.length) { + player.removeMark("xinjiexun", player.countMark("xinjiexun"), false); + player.addSkill("funan_jiexun"); + } + }, + intro: { content: "已经发动过了#次" }, + }, + zhuandui: { + shaRelated: true, + audio: 2, + group: ["zhuandui_respond", "zhuandui_use"], + subSkill: { + use: { + audio: "zhuandui", + trigger: { player: "useCardToPlayered" }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + filter: function (event, player) { + return event.card.name == "sha" && player.canCompare(event.target); + }, + logTarget: "target", + content: function () { + "step 0"; + player.chooseToCompare(trigger.target); + "step 1"; + if (result.bool) { + trigger.getParent().directHit.add(trigger.target); + } + }, + }, + respond: { + audio: "zhuandui", + trigger: { target: "useCardToTargeted" }, + check: function (event, player) { + return get.effect(player, event.card, event.player, player) < 0; + }, + filter: function (event, player) { + return event.card.name == "sha" && player.canCompare(event.player); + }, + logTarget: "player", + content: function () { + "step 0"; + player.chooseToCompare(trigger.player); + "step 1"; + if (result.bool) { + trigger.getParent().excluded.add(player); + } + }, + }, + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (player._zhuandui_temp || tag !== "directHit_ai") return false; + player._zhuandui_temp = true; + var bool = (function () { + if (arg.card.name != "sha" || get.attitude(player, arg.target) >= 0 || !arg.target.countCards("h")) return false; + if ( + arg.target.countCards("h") == 1 && + (!arg.target.hasSkillTag( + "freeShan", + false, + { + player: player, + card: arg.card, + }, + true + ) || + player.hasSkillTag("unequip", false, { + name: arg.card ? arg.card.name : null, + target: arg.target, + card: arg.card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: arg.card ? arg.card.name : null, + target: arg.target, + card: arg.card, + })) + ) + return true; + return ( + player.countCards("h", function (card) { + return card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) && get.value(card) <= 4 && (get.number(card) >= 11 + arg.target.countCards("h") / 2 || get.suit(card, player) == "heart"); + }) > 0 + ); + })(); + delete player._zhuandui_temp; + return bool; + }, + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && current < 0) return 0.7; + }, + }, + }, + }, + tianbian: { + audio: 2, + enable: "chooseCard", + check: function (event, player) { + var player = _status.event.player; + return !player.hasCard(function (card) { + var val = get.value(card); + return val < 0 || (val <= 4 && (get.number(card) >= 11 || get.suit(card) == "heart")); + }, "h") + ? 20 + : 0; + }, + filter: function (event) { + return event.type == "compare" && !event.directresult; + }, + onCompare: function (player) { + return game.cardsGotoOrdering(get.cards()).cards; + }, + group: "tianbian_number", + subSkill: { + number: { + trigger: { player: "compare", target: "compare" }, + filter: function (event, player) { + if (event.player == player) { + return !event.iwhile && get.suit(event.card1) == "heart"; //&&event.card1.vanishtag.includes('tianbian'); + } else { + return get.suit(event.card2) == "heart"; //&&event.card2.vanishtag.includes('tianbian'); + } + }, + silent: true, + content: function () { + game.log(player, "拼点牌点数视为", "#yK"); + if (player == trigger.player) { + trigger.num1 = 13; + } else { + trigger.num2 = 13; + } + }, + }, + }, + }, + jianzheng: { + audio: 2, + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + if (!player.countCards("h")) return false; + return event.player != player && event.card.name == "sha" && !event.targets.includes(player) && event.player.inRange(player); + }, + direct: true, + content: function () { + "step 0"; + var effect = 0; + for (var i = 0; i < trigger.targets.length; i++) { + effect -= get.effect(trigger.targets[i], trigger.card, trigger.player, player); + } + if (effect > 0) { + if (get.color(trigger.card) != "black") { + effect = 0; + } else { + effect = 1; + } + if (trigger.targets.length == 1) { + if (trigger.targets[0].hp == 1) { + effect++; + } + if (effect > 0 && trigger.targets[0].countCards("h") < player.countCards("h")) { + effect++; + } + } + if (effect > 0) { + effect += 6; + } + } + player + .chooseCard("h", get.prompt2("jianzheng", trigger.player)) + .set("ai", function (card) { + if (_status.event.effect >= 0) { + var val = get.value(card); + if (val < 0) return 10 - val; + return _status.event.effect - val; + } + return 0; + }) + .set("effect", effect) + .set("logSkill", ["jianzheng", trigger.player]); + "step 1"; + if (result.bool && result.cards) { + event.card = result.cards[0]; + trigger.targets.length = 0; + trigger.getParent().triggeredTargets1.length = 0; + } else { + event.finish(); + } + "step 2"; + if (!event.isMine()) game.delayx(); + "step 3"; + if (event.card) { + player.logSkill("jianzheng", trigger.player); + player.lose(event.card, ui.cardPile, "visible", "insert"); + player.$throw(event.card, 1000); + game.log(player, "将", card, "置于牌堆顶"); + } + "step 4"; + if (get.color(trigger.card) != "black") { + trigger.getParent().targets.push(player); + trigger.player.line(player); + game.delay(); + } + }, + ai: { + threaten: 1.1, + expose: 0.25, + }, + }, + qingxian: { + audio: 2, + group: ["qingxian_jilie", "qingxian_rouhe", "qingxian_dying"], + ai: { + threaten: 0.8, + maixie: true, + maixie_hp: true, + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (target.hp > 1 && target.hasFriend()) return 0.4; + } + }, + }, + }, + subSkill: { + dying: { + audio: "qingxian", + trigger: { global: "dyingAfter" }, + filter: function (event, player) { + return player.storage.qingxian && player.storage.qingxian > 0 && !_status.dying.length; + }, + direct: true, + content: function () { + "step 0"; + player.storage.qingxian--; + player + .chooseTarget(get.prompt("qingxian"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.isHealthy() && att > 0) return 0; + if (target.hp == 1 && att != 0) { + if (att > 0) return 9; + else return 10; + } else { + return Math.sqrt(Math.abs(att)); + } + }) + .set("prompt2", "当你回复体力后,你可以令一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你回复1点体力"); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qingxian", target); + event.insert(lib.skill.qingxian.content_choose, { + target: target, + player: player, + }); + } + "step 2"; + if (lib.skill.qingxian_dying.filter(trigger, player)) event.goto(0); + }, + }, + rouhe: { + audio: "qingxian", + trigger: { player: "recoverEnd" }, + direct: true, + content: function () { + "step 0"; + if (_status.dying.length) { + if (!player.storage.qingxian) player.storage.qingxian = 0; + player.storage.qingxian++; + event.finish(); + return; + } + player + .chooseTarget(get.prompt("qingxian"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.isHealthy() && att > 0) return 0; + if (target.hp == 1 && att != 0) { + if (att > 0) return 9; + else return 10; + } else { + return Math.sqrt(Math.abs(att)); + } + }) + .set("prompt2", "当你回复体力后,你可以令一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你回复1点体力"); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qingxian", target); + event.insert(lib.skill.qingxian.content_choose, { + target: target, + player: player, + }); + } + }, + }, + jilie: { + audio: "qingxian", + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source && event.source.isIn(); + }, + check: function (event, player) { + if (get.attitude(player, event.source) > 0 && event.source.isHealthy()) { + return false; + } + return true; + }, + logTarget: "source", + prompt2: "当你受到伤害后,你可以令伤害来源执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你回复1点体力", + content: function () { + event.insert(lib.skill.qingxian.content_choose, { + target: trigger.source, + player: player, + }); + }, + }, + }, + content_choose: function () { + "step 0"; + if (target.isHealthy()) { + event._result = { index: 0 }; + } else { + var index; + if (get.attitude(player, target) > 0) { + index = 1; + } else { + index = 0; + } + player + .chooseControlList(["令" + get.translation(target) + "失去1点体力,随机使用一张装备牌", "令" + get.translation(target) + "回复1点体力,弃置一张装备牌"], true, function (event, player) { + return _status.event.index; + }) + .set("index", index); + } + "step 1"; + if (result.index == 0) { + target.loseHp(); + event.card = get.cardPile(function (card) { + return get.type(card) == "equip" && target.canUse(card, target); + }); + if (event.card) { + target.chooseUseTarget(event.card, "nothrow", "nopopup", true); + event.goto(3); + } else { + event.finish(); + } + } else { + target.recover(); + if (target.countCards("he", { type: "equip" })) { + target + .chooseToDiscard("he", true, "弃置一张装备牌", function (card) { + return get.type(card) == "equip"; + }) + .set("ai", function (card) { + var val = -get.value(card); + if (get.suit(card) == "club") { + val += _status.event.att * 10; + } + return val; + }) + .set("att", get.sgnAttitude(target, player)); + } else { + event.finish(); + } + } + "step 2"; + if (result && result.cards) { + event.card = result.cards[0]; + } + "step 3"; + if (event.card && get.suit(event.card) == "club") { + player.draw(); + } + }, + }, + juexiang: { + audio: 2, + trigger: { player: "die" }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("juexiang"), function (card, player, target) { + return target != player; + }) + .set("forceDie", true) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) / Math.sqrt(target.hp + 1); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("juexiang", target); + target.addSkills(lib.skill.juexiang.derivation.randomGet()); + target.addTempSkill("juexiang_club", { player: "phaseZhunbeiBegin" }); + } + }, + derivation: ["juexiang_ji", "juexiang_lie", "juexiang_rou", "juexiang_he"], + subSkill: { + ji: { + audio: 1, + mark: true, + nopop: true, + intro: { + content: "info", + }, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source && event.source.isIn() && event.source != player; + }, + check: function (event, player) { + return get.attitude(player, event.source) < 0; + }, + logTarget: "source", + content: function () { + trigger.source.loseHp(); + var card = get.cardPile(function (card) { + return get.type(card) == "equip" && trigger.source.canUse(card, trigger.source); + }); + if (card) { + trigger.source.chooseUseTarget(card, "nothrow", "nopopup", true); + } + }, + ai: { + maixie_defend: true, + }, + }, + lie: { + audio: 1, + mark: true, + nopop: true, + intro: { + content: "info", + }, + trigger: { + player: "recoverEnd", + global: "dyingAfter", + }, + direct: true, + content: function () { + "step 0"; + if (_status.dying.length) { + if (event.triggername == "recoverEnd") { + if (!player.storage.juexiang_lie) player.storage.juexiang_lie = 0; + player.storage.juexiang_lie++; + } + event.finish(); + return; + } + if (event.triggername == "dyingAfter") { + if (!player.storage.juexiang_lie) { + event.finish(); + return; + } + player.storage.juexiang_lie--; + } + player + .chooseTarget(get.prompt2("juexiang_lie"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + return -get.attitude(player, target) / (1 + target.hp); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("juexiang_lie", target); + target.loseHp(); + var card = get.cardPile(function (card) { + return get.type(card) == "equip" && target.canUse(card, target); + }); + if (card) { + target.chooseUseTarget(card, true, "nothrow", "nopopup", true); + } + } + if (event.triggername == "dyingAfter" && player.storage.juexiang_lie > 0) event.goto(0); + }, + }, + rou: { + audio: 1, + mark: true, + nopop: true, + intro: { + content: "info", + }, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source && event.source.isIn() && event.source != player; + }, + check: function (event, player) { + var att = get.attitude(player, event.source); + if (player.isHealthy()) { + return att < 0; + } else { + return att > 0; + } + }, + logTarget: "source", + content: function () { + trigger.source.recover(); + if (trigger.source.countCards("he", { type: "equip" })) { + trigger.source.chooseToDiscard("he", true, "弃置一张装备牌", function (card) { + return get.type(card) == "equip"; + }); + } + }, + ai: { + maixie_defend: true, + }, + }, + he: { + audio: 1, + mark: true, + nopop: true, + intro: { + content: "info", + }, + trigger: { player: "recoverEnd" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("juexiang_he"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.isHealthy() && target.countCards("he")) { + return -att; + } else { + return (10 * att) / (1 + target.hp); + } + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("juexiang_he", target); + target.recover(); + if (target.countCards("he", { type: "equip" })) { + target.chooseToDiscard("he", true, "弃置一张装备牌", function (card) { + return get.type(card) == "equip"; + }); + } + } + }, + }, + club: { + mark: true, + nopop: true, + intro: { + content: "info", + }, + mod: { + targetEnabled: function (card, player, target) { + if (get.suit(card) == "club" && player != target) { + return false; + } + }, + }, + }, + }, + }, + bizhuan: { + audio: 2, + trigger: { + player: "useCard", + target: "useCardToTargeted", + }, + filter: function (event, player) { + if (event.name != "useCard" && event.player == event.target) return false; + if (player.getExpansions("bizhuan").length >= 4) return false; + return get.suit(event.card) == "spade"; + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + frequent: true, + locked: false, + content: function () { + player.addToExpansion(get.cards(), "gain2").gaintag.add("bizhuan"); + }, + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("bizhuan").length; + }, + }, + }, + tongbo: { + trigger: { player: "phaseDrawAfter" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("bizhuan").length > 0 && player.countCards("he") > 0; + }, + content: function () { + "step 0"; + var four = false; + var nofour = !player.hasFriend(); + var expansions = player.getExpansions("bizhuan"); + if (expansions.length == 4) { + var suits = ["club", "spade", "heart", "diamond"]; + var list = player.getCards("he").concat(expansions); + for (var i = 0; i < list.length; i++) { + suits.remove(get.suit(list[i])); + if (suits.length == 0) { + four = true; + break; + } + } + } + var next = player.chooseToMove("通博:是否交换“书”和手牌?").set("four", four).set("suits2", suits2).set("nofour", nofour); + next.set("list", [ + [get.translation(player) + "(你)的“书”", expansions], + ["你的牌", player.getCards("he")], + ]); + next.set("filterMove", function (from, to) { + return typeof to != "number"; + }); + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]), + cards2 = []; + if (_status.event.four) { + var sorted = [[], [], [], []]; + for (var i of cards) { + var index = lib.suit.indexOf(get.suit(i, false)); + if (sorted[index]) sorted[index].push(i); + } + if (_status.event.nofour) { + sorted.sort(function (a, b) { + return a.length - b.length; + }); + var cards3 = cards.slice(0).sort(function (a, b) { + return get.useful(a) - get.useful(b); + }); + cards3.removeArray(sorted[0]); + cards2 = cards3.slice(0, 4); + cards.removeArray(cards2); + } else { + for (var i of sorted) { + cards2.push(i.randomGet()); + cards.remove(cards2); + } + } + } else { + cards.sort(function (a, b) { + return get.useful(a) - get.useful(b); + }); + cards2 = cards.splice(0, player.getExpansions("bizhuan").length); + } + return [cards2, cards]; + }); + "step 1"; + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("bizhuan")); + gains.removeArray(player.getCards("he")); + if (!pushs.length || pushs.length != gains.length) { + event.finish(); + return; + } + player.logSkill("tongbo"); + player.addToExpansion(pushs, "give", player).gaintag.add("bizhuan"); + player.gain(gains, "gain2"); + } + "step 2"; + var suits2 = ["club", "spade", "heart", "diamond"]; + var expansions = player.getExpansions("bizhuan"); + for (var i = 0; i < expansions.length; i++) { + suits2.remove(get.suit(expansions[i])); + } + if (suits2.length > 0) { + event.finish(); + } + "step 3"; + event.cards = player.getExpansions("bizhuan").slice(0); + if (event.cards.length > 1) { + player.chooseCardButton("将所有“书”交给任意名其他角色", true, event.cards, [1, event.cards.length]).set("ai", function (button) { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + } else if (event.cards.length == 1) { + event._result = { links: event.cards.slice(0), bool: true }; + } else { + event.finish(); + } + "step 4"; + if (result.bool) { + for (var i = 0; i < result.links.length; i++) { + event.cards.remove(result.links[i]); + } + event.togive = result.links.slice(0); + player + .chooseTarget("将" + get.translation(result.links) + "交给一名其他角色", true, function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + } else { + event.finish(); + } + "step 5"; + if (result.targets.length) { + result.targets[0].gain(event.togive, "draw").giver = player; + player.line(result.targets[0], "green"); + game.log(result.targets[0], "获得了" + get.cnNumber(event.togive.length) + "张", "#g“书”"); + if (event.cards.length) event.goto(3); + } + }, + ai: { + combo: "bizhuan", + }, + }, + shouxi: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + direct: true, + init: function (player) { + if (!player.storage.shouxi) player.storage.shouxi = []; + }, + filter: function (event, player) { + return event.card.name == "sha" && event.player.isIn(); + }, + content: function () { + "step 0"; + var list = lib.inpile.filter(function (i) { + if (player.storage.shouxi.includes(i)) return false; + var type = get.type2(i); + if (type == "basic" || type == "trick") return true; + return false; + }); + for (var i = 0; i < list.length; i++) { + list[i] = [get.type(list[i]), "", list[i]]; + } + player.chooseButton([get.prompt("shouxi", trigger.player), [list, "vcard"]]).set("ai", function (button) { + return Math.random(); + }); + "step 1"; + if (result.bool) { + player.logSkill("shouxi"); + var name = result.links[0][2]; + event.vcard = result.links; + event.cardname = name; + player.storage.shouxi.add(name); + player.popup(name); + game.log(player, "声明了", "#y" + get.translation(name)); + } else { + event.finish(); + } + "step 2"; + var name = event.cardname; + trigger.player + .chooseToDiscard(function (card) { + return card.name == _status.event.cardname; + }) + .set("ai", function (card) { + if (_status.event.att < 0) { + return 10 - get.value(card); + } + return 0; + }) + .set("att", get.attitude(trigger.player, player)) + .set("cardname", name) + .set("dialog", ["守玺:请弃置一张【" + get.translation(name) + "】,否则此【杀】对" + get.translation(player) + "无效", [event.vcard, "vcard"]]); + "step 3"; + if (result.bool == false) { + trigger.excluded.push(player); + } else { + trigger.player.gainPlayerCard(player); + } + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && get.attitude(player, target) < 0) { + return 0.3; + } + }, + }, + }, + }, + huimin: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + check: function (event, player) { + return ( + game.countPlayer(function (current) { + if (current.countCards("h") < current.hp) { + return get.sgn(get.attitude(player, current)); + } + }) >= 0 + ); + }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h") < current.hp; + }); + }, + content: function () { + "step 0"; + event.list = game + .filterPlayer(function (current) { + return current.countCards("h") < current.hp; + }) + .sortBySeat(); + player.draw(event.list.length); + "step 1"; + player + .chooseTarget( + true, + function (card, player, target) { + var list = _status.event.list; + return list.includes(target); + }, + "选择一名角色作为分牌起点" + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att <= 0) return att; + var list = _status.event.list; + var index = list.indexOf(target); + var prev; + if (index == 0) { + prev = list[list.length - 1]; + } else { + prev = list[index - 1]; + } + if (get.attitude(player, prev) < 0) return att; + return 0; + }) + .set("list", event.list); + "step 2"; + var index = event.list.indexOf(result.targets[0]); + if (index < 0) index = 0; + var tmp = event.list.splice(index); + event.list = tmp.concat(event.list); + player.line(result.targets, "green"); + player.chooseCard("h", "选择要分配的手牌", event.list.length, true); + "step 3"; + var cards = result.cards; + player.lose(cards, ui.ordering); + event.togain = cards; + if (result.bool && cards.length) { + var dialog = ui.create.dialog("惠民", cards, true); + _status.dieClose.push(dialog); + dialog.videoId = lib.status.videoId++; + event.dialogID = dialog.videoId; + game.addVideo("cardDialog", null, ["惠民", get.cardsInfo(cards), dialog.videoId]); + game.broadcast( + function (cards, id) { + var dialog = ui.create.dialog("惠民", cards, true); + _status.dieClose.push(dialog); + dialog.videoId = id; + }, + cards, + dialog.videoId + ); + } else { + event.finish(); + } + "step 4"; + game.delay(); + "step 5"; + if (event.list.length && event.togain.length) { + event.current = event.list.shift(); + var next = event.current.chooseButton(true, function (button) { + return get.value(button.link, _status.event.player); + }); + next.set("dialog", event.dialogID); + next.set("closeDialog", false); + next.set("dialogdisplay", true); + next.set("cardFilter", event.togain.slice(0)); + next.set("filterButton", function (button) { + return _status.event.cardFilter.includes(button.link); + }); + } else { + for (var i = 0; i < ui.dialogs.length; i++) { + if (ui.dialogs[i].videoId == event.dialogID) { + var dialog = ui.dialogs[i]; + dialog.close(); + _status.dieClose.remove(dialog); + break; + } + } + if (event.togain.length) { + game.cardsDiscard(event.togain); + } + game.broadcast(function (id) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + _status.dieClose.remove(dialog); + } + }, event.dialogID); + game.addVideo("cardDialog", null, event.dialogID); + event.finish(); + } + "step 6"; + var card = result.links[0], + target = event.current; + if (card) { + target.gain(card, "gain2"); + event.togain.remove(card); + } + var capt = get.translation(target) + "选择了" + get.translation(card); + game.broadcastAll( + function (card, id, name, capt) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.content.firstChild.innerHTML = capt; + for (var i = 0; i < dialog.buttons.length; i++) { + if (dialog.buttons[i].link == card) { + dialog.buttons[i].querySelector(".info").innerHTML = name; + break; + } + } + game.addVideo("dialogCapt", null, [dialog.videoId, dialog.content.firstChild.innerHTML]); + } + }, + card, + event.dialogID, + (function (target) { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + })(target), + capt + ); + if (event.togain.length) event.goto(5); + else { + for (var i = 0; i < ui.dialogs.length; i++) { + if (ui.dialogs[i].videoId == event.dialogID) { + var dialog = ui.dialogs[i]; + dialog.close(); + _status.dieClose.remove(dialog); + break; + } + } + if (event.togain.length) { + game.cardsDiscard(event.togain); + } + game.broadcast(function (id) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + _status.dieClose.remove(dialog); + } + }, event.dialogID); + game.addVideo("cardDialog", null, event.dialogID); + event.finish(); + } + }, + }, + fuzhu: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player != player && event.player.hasSex("male") && ui.cardPile.childElementCount <= player.hp * 10; + }, + check: function (event, player) { + return get.attitude(player, event.player) < 0 && get.effect(event.player, { name: "sha" }, player, player) > 0; + }, + logTarget: "player", + skillAnimation: true, + animationColor: "wood", + onWash: function () { + _status.event.getParent("fuzhu").washed = true; + return "remove"; + }, + content: function () { + "step 0"; + event.washed = false; + lib.onwash.push(lib.skill.fuzhu.onWash); + event.total = game.players.length + game.dead.length; + "step 1"; + event.total--; + var card = get.cardPile2(function (card) { + return card.name == "sha" && player.canUse(card, trigger.player, false); + }); + if (card) { + player.useCard(card, trigger.player, false); + } + "step 2"; + if (event.total > 0 && !event.washed && ui.cardPile.childElementCount <= player.hp * 10 && trigger.player.isIn()) event.goto(1); + "step 3"; + lib.onwash.remove(lib.skill.fuzhu.onWash); + game.washCard(); + }, + ai: { + threaten: 1.5, + }, + }, + wengua: { + global: "wengua2", + audio: 2, + }, + wengua2: { + audio: "wengua", + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("wengua3")) return false; + return ( + player.countCards("he") && + game.hasPlayer(function (current) { + return current.hasSkill("wengua"); + }) + ); + }, + log: false, + delay: false, + filterCard: true, + discard: false, + lose: false, + position: "he", + prompt: function () { + var player = _status.event.player; + var list = game.filterPlayer(function (current) { + return current.hasSkill("wengua"); + }); + if (list.length == 1 && list[0] == player) return "将一张牌置于牌堆顶或是牌堆底"; + var str = "将一张牌交给" + get.translation(list); + if (list.length > 1) str += "中的一人"; + return str; + }, + check: function (card) { + if (card.name == "sha") return 5; + return 8 - get.value(card); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(function (current) { + return current.hasSkill("wengua"); + }); + if (targets.length == 1) { + event.target = targets[0]; + event.goto(2); + } else if (targets.length > 0) { + player + .chooseTarget(true, "选择【问卦】的目标", function (card, player, target) { + return _status.event.list.includes(target); + }) + .set("list", targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target); + }); + } else { + event.finish(); + } + "step 1"; + if (result.bool && result.targets.length) { + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + if (event.target) { + player.logSkill("wengua", event.target); + player.addTempSkill("wengua3", "phaseUseEnd"); + event.card = cards[0]; + if (event.target != player) { + player.give(cards, event.target); + } + } else { + event.finish(); + } + delete _status.noclearcountdown; + game.stopCountChoose(); + "step 3"; + if (event.target.getCards("he").includes(event.card)) { + event.target.chooseControlList("问卦", "将" + get.translation(event.card) + "置于牌堆顶", "将" + get.translation(event.card) + "置于牌堆底", event.target == player, function () { + if (get.attitude(event.target, player) < 0) return 2; + return 1; + }); + } else { + event.finish(); + } + "step 4"; + event.index = result.index; + if (event.index == 0 || event.index == 1) { + var next = event.target.lose(event.card, ui.cardPile); + if (event.index == 0) next.insert_card = true; + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, event.target); + } else event.finish(); + "step 5"; + game.delay(); + "step 6"; + if (event.index == 1) { + game.log(event.target, "将得到的牌置于牌堆底"); + if (ui.cardPile.childElementCount == 1 || player == event.target) { + player.draw(); + } else { + game.asyncDraw([player, target], null, null); + } + } else if (event.index == 0) { + game.log(player, "将获得的牌置于牌堆顶"); + if (ui.cardPile.childElementCount == 1 || player == event.target) { + player.draw("bottom"); + } else { + game.asyncDraw([player, target], null, null, true); + } + } + }, + ai: { + order: 2, + threaten: 1.5, + result: { + player: function (player, target) { + var target = game.findPlayer(function (current) { + return current.hasSkill("wengua"); + }); + if (target) { + return get.attitude(player, target); + } + }, + }, + }, + }, + wengua3: { charlotte: true }, + daiyan: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + init: function () { + lib.onwash.push(function () { + delete _status.daiyan_notao; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("daiyan"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0) { + if (_status.daiyan_notao) { + return 0; + } else { + if (target == player.storage.daiyan) return 0; + return (2 * att) / Math.sqrt(1 + target.hp); + } + } else { + if (_status.daiyan_notao) { + if (target == player.storage.daiyan) return -3 * att; + return -att; + } else { + return 0; + } + } + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("daiyan", target); + var tao = get.cardPile2(function (card) { + return get.suit(card) == "heart" && get.type(card) == "basic"; + }); + if (tao) { + target.gain(tao, "gain2"); + } else { + _status.daiyan_notao = true; + } + if (target == player.storage.daiyan) { + target.loseHp(); + } + player.storage.daiyan = target; + } else { + delete player.storage.daiyan; + } + }, + ai: { + threaten: 1.5, + expose: 0.2, + }, + }, + fumian: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + if (player.storage.fumian_choice == "draw") { + player.chooseControlList(get.prompt("fumian"), "摸牌阶段多摸一张牌", "使用红色牌可以多选择两个目标(限一次)", function (event, player) { + if (player.hp == 1 || player.countCards("h") <= 1) return 0; + return 1; + }); + } else if (player.storage.fumian_choice == "red") { + player.chooseControlList(get.prompt("fumian"), "摸牌阶段多摸两张牌", "使用红色牌可以多选择一个目标(限一次)", function (event, player) { + return 0; + }); + } else { + player.chooseControlList(get.prompt("fumian"), "摸牌阶段多摸一张牌", "使用红色牌可以多选择一个目标(限一次)", function (event, player) { + if (player.hp == 1 || player.countCards("h") < player.hp) return 0; + return 1; + }); + } + "step 1"; + if (player.storage.fumian_choice == "draw") { + if (result.index == 0) { + player.storage.fumian_draw = 1; + } else if (result.index == 1) { + player.storage.fumian_red = 2; + delete player.storage.fumian_choice; + } + } else if (player.storage.fumian_choice == "red") { + if (result.index == 0) { + player.storage.fumian_draw = 2; + delete player.storage.fumian_choice; + } else if (result.index == 1) { + player.storage.fumian_red = 1; + } + } else { + if (result.index == 0) { + player.storage.fumian_draw = 1; + player.storage.fumian_choice = "draw"; + } else if (result.index == 1) { + player.storage.fumian_red = 1; + player.storage.fumian_choice = "red"; + } + } + if (result.index == 0) { + player.logSkill("fumian"); + player.addTempSkill("fumian_draw"); + } else if (result.index == 1) { + player.logSkill("fumian"); + player.addTempSkill("fumian_red"); + } + }, + ai: { + threaten: 1.3, + }, + subSkill: { + draw: { + trigger: { player: "phaseDrawBegin2" }, + forced: true, + popup: false, + onremove: true, + filter: function (event, player) { + return !event.numFixed && typeof player.storage.fumian_draw == "number"; + }, + content: function () { + trigger.num += player.storage.fumian_draw; + }, + }, + red2: {}, + red: { + trigger: { player: "useCard2" }, + direct: true, + mark: true, + onremove: true, + intro: { + content: "你使用红色牌可以多选择#个目标(限一次)", + }, + filter: function (event, player) { + if (get.color(event.card) != "red") return false; + if (player.hasSkill("fumian_red2")) return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "额外指定"; + if (player.storage.fumian_red == 2) { + prompt2 += "至多两"; + } else { + prompt2 += "一"; + } + prompt2 += "名" + get.translation(trigger.card) + "的目标"; + player + .chooseTarget([1, player.storage.fumian_red], get.prompt("fumian"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + if (!event.isMine()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("fumian", event.targets); + trigger.targets.addArray(event.targets); + player.addTempSkill("fumian_red2"); + } + }, + }, + }, + }, + zhongjian: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + if (!player.countCards("h")) return false; + if (player.getStat("skill").zhongjian && !player.hasSkill("zhongjian2")) return false; + return game.hasPlayer(function (current) { + return current != player && Math.min(current.hp, current.countCards("h")) > 0; + }); + }, + filterCard: true, + check: function () { + return Math.random(); + }, + discard: false, + lose: false, + delay: false, + filterTarget: function (card, player, target) { + return target != player && target.hp > 0 && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.showCards(cards); + "step 1"; + player.choosePlayerCard(target, "h", Math.min(target.countCards("h"), target.hp), true); + "step 2"; + var hs = result.cards; + target.showCards(hs); + var colors = []; + var numbers = []; + for (var i = 0; i < cards.length; i++) { + colors.add(get.color(cards[i])); + numbers.add(get.number(cards[i])); + } + event.bool1 = false; + event.bool2 = false; + for (var i = 0; i < hs.length; i++) { + if (!event.bool1 && colors.includes(get.color(hs[i]))) event.bool1 = true; + if (!event.bool2 && numbers.includes(get.number(hs[i]))) event.bool2 = true; + } + "step 3"; + if (event.bool1) { + var filterTarget = function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }; + if ( + !game.hasPlayer(function (current) { + return filterTarget(null, player, current); + }) + ) + event._result = { bool: false }; + else + player.chooseTarget(filterTarget, "弃置一名其他角色的一张牌或摸一张牌").set("ai", function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + return 0; + }); + } else { + event.goto(5); + } + "step 4"; + if (!result.bool) player.draw(); + else { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, true, "he"); + } + "step 5"; + if (event.bool2) { + player.addTempSkill("zhongjian2"); + } + if (!event.bool1 && !event.bool2) { + player.addSkill("caishix"); + if (typeof player.storage.caishix != "number") player.storage.caishix = 0; + player.storage.caishix--; + player.markSkill("caishix"); + player.popup("杯具"); + } + }, + ai: { + order: 8, + result: { + player: function (player, target) { + return Math.min(target.hp, target.countCards("h")); + }, + }, + }, + }, + zhongjian2: {}, + caishi: { + audio: 2, + trigger: { player: "phaseDrawBegin" }, + direct: true, + content: function () { + "step 0"; + if (player.isHealthy()) { + event.type = 0; + player.chooseBool(get.prompt("caishi"), "令自己的手牌上限+1", function () { + return true; + }); + } else { + event.type = 1; + player.chooseControlList(get.prompt("caishi"), "令自己的手牌上限+1", "回复1点体力,然后本回合你的牌不能对自己使用", function () { + return 1; + }); + } + "step 1"; + if (event.type) { + if (result.control != "cancel2") { + player.logSkill("caishi"); + if (result.index == 0) { + player.addSkill("caishix"); + if (typeof player.storage.caishix != "number") player.storage.caishix = 0; + player.storage.caishix++; + player.markSkill("caishix"); + } else if (result.index == 1) { + player.recover(); + player.addTempSkill("caishi3"); + } + } + } else { + if (result.bool) { + player.logSkill("caishi"); + player.addSkill("caishix"); + if (typeof player.storage.caishix != "number") player.storage.caishix = 0; + player.storage.caishix++; + player.markSkill("caishix"); + } + } + }, + }, + caishix: { + intro: { + content: function (storage) { + if (storage > 0) return "手牌上限+" + storage; + if (storage < 0) return "手牌上限" + storage; + return "手牌上限无变化"; + }, + }, + mod: { + maxHandcard: function (player, num) { + if (typeof player.storage.caishix == "number") return num + player.storage.caishix; + }, + }, + charlotte: true, + onremove: true, + }, + caishi2: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; + }, + }, + }, + caishi3: { + mod: { + playerEnabled: function (card, player, target) { + if (player == target) return false; + }, + }, + }, + ttt: { + mod: { + targetEnabled: function (card) { + if (card.name == "tao") return false; + }, + }, + }, + jyzongshi: { + audio: 2, + audioname: ["re_jianyong"], + trigger: { + player: ["chooseToCompareAfter", "compareMultipleAfter"], + target: ["chooseToCompareAfter", "compareMultipleAfter"], + }, + filter: function (event, player) { + if (event.preserve) return false; + if (player == event.player) { + if (event.num1 > event.num2) { + return !get.owner(event.card2); + } else { + return !get.owner(event.card1); + } + } else { + if (event.num1 < event.num2) { + return !get.owner(event.card1); + } else { + return !get.owner(event.card2); + } + } + }, + check: function (event, player) { + if (player == event.player) { + if (event.num1 > event.num2) { + return event.card2.name != "du"; + } else { + return event.card1.name != "du"; + } + } else { + if (event.num1 < event.num2) { + return event.card1.name != "du"; + } else { + return event.card2.name != "du"; + } + } + }, + content: function () { + if (player == trigger.player) { + if (trigger.num1 > trigger.num2) { + player.gain(trigger.card2, "gain2", "log"); + } else { + player.gain(trigger.card1, "gain2", "log"); + } + } else { + if (trigger.num1 < trigger.num2) { + player.gain(trigger.card1, "gain2", "log"); + } else { + player.gain(trigger.card2, "gain2", "log"); + } + } + }, + }, + xinsidi: { + audio: "sidi", + trigger: { global: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + if (event.player == player || event.player.isDead()) return false; + return player.countCards("e") > 0; + }, + content: function () { + "step 0"; + var goon = true; + if (get.attitude(player, trigger.player) >= -0.8) goon = false; + else if (trigger.player.countCards("h") <= 3) goon = false; + else if (player.countCards("h", "shan") == 0) goon = false; + var es = player.getCards("e"); + var color = []; + for (var i = 0; i < es.length; i++) { + color.add(get.color(es[i])); + } + if (color.length == 2) color = "all"; + else color = color[0]; + player + .chooseToDiscard(get.prompt2("xinsidi", trigger.player), "he", function (card) { + if (get.type(card) == "basic") return false; + if (_status.event.color == "all") return true; + return get.color(card) == _status.event.color; + }) + .set("ai", function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set("goon", goon) + .set("color", color) + .set("logSkill", ["xinsidi", trigger.player]); + "step 1"; + if (result.bool) { + trigger.player.addSkill("xinsidi2"); + trigger.player.markAuto("xinsidi2", [get.color(result.cards[0], result.cards[0].original == "h" ? player : false)]); + trigger.player.storage.xinsidi4 = player; + trigger.player.syncStorage("xinsidi2"); + } + }, + ai: { + threaten: 1.5, + }, + }, + xinsidi2: { + mark: true, + group: ["xinsidi2_end"], + subSkill: { + end: { + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + audio: false, + content: function () { + "step 0"; + if ( + player.storage.xinsidi4.isIn() && + !player.getHistory("useCard", function (evt) { + return evt.card.name == "sha"; + }).length && + player.storage.xinsidi4.canUse({ name: "sha", isCard: true }, player, false) + ) { + player.storage.xinsidi4.logSkill("xinsidi", player); + player.storage.xinsidi4.useCard({ name: "sha", isCard: true }, player); + } + "step 1"; + delete player.storage.xinsidi2; + delete player.storage.xinsidi3; + delete player.storage.xinsidi4; + player.removeSkill("xinsidi2"); + }, + }, + }, + mod: { + cardEnabled: function (card, player) { + if (player.getStorage("xinsidi2").includes(get.color(card))) return false; + }, + cardRespondable: function (card, player) { + if (player.getStorage("xinsidi2").includes(get.color(card))) return false; + }, + cardSavable: function (card, player) { + if (player.getStorage("xinsidi2").includes(get.color(card))) return false; + }, + }, + intro: { + content: "不能使用或打出$的牌", + }, + }, + taoluan: { + hiddenCard: function (player, name) { + return !player.getStorage("taoluan").includes(name) && player.countCards("hes") > 0 && !player.hasSkill("taoluan3") && lib.inpile.includes(name); + }, + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + return ( + !player.hasSkill("taoluan3") && + player.hasCard(card => + lib.inpile.some(name => { + if (player.getStorage("taoluan").includes(name)) return false; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + if (event.filterCard({ name: name, isCard: true, cards: [card] }, player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if (event.filterCard({ name: name, nature: nature, isCard: true, cards: [card] }, player, event)) return true; + } + } + return false; + }, "hes") + ) > 0 + ); + }, + onremove: true, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) == "basic" || get.type(name) == "trick") { + if (player.getStorage("taoluan").includes(name)) continue; + list.push([get.translation(get.type(name)), "", name]); + if (name == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } + } + } + 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) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if (player.countCards("hes", cardx => cardx.name == card.name)) return 0; + return _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + }, + backup: function (links, player) { + return { + audio: "taoluan", + filterCard: true, + popname: true, + check: function (card) { + return 7 - get.value(card); + }, + position: "hes", + viewAs: { name: links[0][2], nature: links[0][3] }, + onuse: function (result, player) { + player.markAuto("taoluan", [result.card.name]); + }, + }; + }, + prompt: function (links, player) { + return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + save: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (!player.countCards("hes") || player.hasSkill("taoluan3")) return false; + if (tag == "respondSha" || tag == "respondShan") { + if (arg == "respond") return false; + return !player.getStorage("taoluan").includes(tag == "respondSha" ? "sha" : "shan"); + } + return !player.getStorage("taoluan").includes("tao") || (!player.getStorage("taoluan").includes("jiu") && arg == player); + }, + order: 4, + result: { + player: function (player) { + var allshown = true, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].ai.shown == 0) { + allshown = false; + } + if (players[i] != player && players[i].countCards("h") && get.attitude(player, players[i]) > 0) { + return 1; + } + } + if (allshown) return 1; + return 0; + }, + }, + threaten: 1.9, + }, + group: "taoluan2", + }, + taoluan2: { + charlotte: true, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + if (!game.hasPlayer(current => current != player)) return false; + return event.skill == "taoluan_backup"; + }, + forced: true, + popup: false, + content: function () { + "step 0"; + player + .chooseTarget( + true, + function (card, player, target) { + return target != player; + }, + '滔乱

    令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力' + ) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) { + if (get.attitude(target, player) > 0) { + return target.countCards("he"); + } + return target.countCards("he") / 2; + } + return 0; + }); + "step 1"; + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var type = get.type(trigger.card, "trick"); + target + .chooseCard('滔乱

    交给' + get.translation(player) + "一张不为" + get.translation(type) + "牌的牌,或令其失去1点体力且滔乱无效直到回合结束", "he", function (card, player, target) { + return get.type(card, "trick") != _status.event.cardType; + }) + .set("cardType", type) + .set("ai", function (card) { + if (_status.event.att) { + return 11 - get.value(card); + } + return 0; + }) + .set("att", get.attitude(target, player) > 0); + "step 2"; + var target = event.target; + if (result.bool) { + target.give(result.cards, player); + } else { + player.addTempSkill("taoluan3"); + player.loseHp(); + } + }, + }, + taoluan3: { charlotte: true }, + taoluan_backup: {}, + jishe: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.getHandcardLimit() > 0; + }, + usable: 20, + locked: false, + content: function () { + player.draw(); + player.addTempSkill("jishe2"); + player.addMark("jishe2", 1, false); + }, + ai: { + order: 10, + result: { + player: function (player) { + if (!player.needsToDiscard(1)) { + return 1; + } + return 0; + }, + }, + }, + group: ["jishe3"], + }, + jishe2: { + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("jishe2"); + }, + }, + onremove: true, + charlotte: true, + marktext: "奢", + intro: { content: "手牌上限-#" }, + }, + jishe3: { + audio: "jishe", + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + if (player.countCards("h")) return false; + return game.hasPlayer(function (current) { + return !current.isLinked(); + }); + }, + content: function () { + "step 0"; + var num = game.countPlayer(function (current) { + return !current.isLinked(); + }); + player + .chooseTarget(get.prompt("jishe"), "横置至多" + get.cnNumber(Math.min(num, player.hp)) + "名未横置的角色", [1, Math.min(num, player.hp)], function (card, player, target) { + return !target.isLinked(); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + player.logSkill("jishe", result.targets); + event.targets = result.targets; + event.num = 0; + } else { + event.finish(); + } + "step 2"; + if (event.num < event.targets.length) { + event.targets[event.num].link(); + event.num++; + event.redo(); + } + }, + ai: { + expose: 0.3, + }, + }, + lianhuo: { + audio: 2, + trigger: { player: "damageBegin3" }, + forced: true, + filter: function (event, player) { + return player.isLinked() && event.notLink() && event.hasNature("fire"); + }, + content: function () { + trigger.num++; + }, + ai: { + halfneg: true, + }, + }, + huisheng: { + audio: 2, + audioname: ["dc_huanghao"], + trigger: { player: "damageBegin4" }, + direct: true, + filter: function (event, player) { + if (!player.countCards("he")) return false; + if (!event.source || event.source == player || !event.source.isIn()) return false; + if (player.storage.huisheng && player.storage.huisheng.includes(event.source)) return false; + return true; + }, + init: function (player) { + if (player.storage.huisheng) player.storage.huisheng = []; + }, + content: function () { + "step 0"; + var att = get.attitude(player, trigger.source) > 0; + var goon = false; + if (player.hp == 1) { + goon = true; + } else { + var he = player.getCards("he"); + var num = 0; + for (var i = 0; i < he.length; i++) { + if (get.value(he[i]) < 8) { + num++; + if (num >= 2) { + goon = true; + break; + } + } + } + } + player + .chooseCard("he", [1, player.countCards("he")], get.prompt2("huisheng", trigger.source)) + .set("ai", function (card) { + if (_status.event.att) { + return 10 - get.value(card); + } + if (_status.event.goon) { + return 8 - get.value(card); + } + if (!ui.selected.cards.length) { + return 7 - get.value(card); + } + return 0; + }) + .set("goon", goon) + .set("att", att); + "step 1"; + if (result.bool) { + player.logSkill("huisheng", trigger.source); + game.delay(); + event.num = result.cards.length; + var goon = false; + if (event.num > 2 || get.attitude(trigger.source, player) >= 0) { + goon = true; + } + var forced = false; + var str = "获得其中一张牌并防止伤害"; + if (trigger.source.countCards("he") < event.num) { + forced = true; + } else { + str += ",或取消并弃置" + get.cnNumber(result.cards.length) + "张牌"; + } + trigger.source + .chooseButton([str, result.cards], forced) + .set("ai", function (button) { + if (_status.event.goon) { + return get.value(button.link); + } + return get.value(button.link) - 8; + }) + .set("goon", goon); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + var card = result.links[0]; + trigger.source.gain(card, player, "giveAuto", "bySelf"); + trigger.cancel(); + if (!player.storage.huisheng) player.storage.huisheng = []; + player.storage.huisheng.push(trigger.source); + } else { + trigger.source.chooseToDiscard(event.num, true, "he"); + } + }, + }, + qinqing: { + audio: 2, + mode: ["identity", "versus", "doudizhu"], + available: function (mode) { + if (mode == "versus" && _status.mode != "four") return false; + if (mode == "identity" && _status.mode == "purple") return false; + }, + getZhu: player => { + if (get.mode == "doudizhu") return game.findPlayer(i => i.identity == "zhu"); + return get.zhu(player); + }, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + var zhu = get.info("qinqing").getZhu(player); + if (!zhu || (get.mode != "doudizhu" && !zhu.isZhu)) return false; + return game.hasPlayer(function (current) { + return current != zhu && current.inRange(zhu); + }); + }, + content: function () { + "step 0"; + event.zhu = get.info("qinqing").getZhu(player); + player + .chooseTarget(get.prompt2("qinqing"), [1, Infinity], function (card, player, target) { + var zhu = get.event("zhu"); + if (target == zhu) return false; + return target.inRange(zhu); + }) + .set("ai", function (target) { + var he = target.countCards("he"); + var zhu = get.event("zhu"); + if (get.attitude(_status.event.player, target) > 0) { + if (he == 0) return 1; + if (target.countCards("h") > zhu.countCards("h")) return 1; + } else { + if (he > 0) return 1; + } + return 0; + }) + .set("zhu", event.zhu); + "step 1"; + if (result.bool) { + event.targets = result.targets.slice(0).sortBySeat(); + event.list = event.targets.slice(0); + player.logSkill("qinqing", event.targets); + } else { + event.finish(); + } + "step 2"; + if (event.targets.length) { + var target = event.targets.shift(); + if (target.countCards("he")) { + player.discardPlayerCard(target, "he", true); + } + target.draw(); + event.redo(); + } + "step 3"; + var num = 0; + if (event.zhu) { + var nh = event.zhu.countCards("h"); + for (var i = 0; i < event.list.length; i++) { + if (event.list[i].countCards("h") > nh) { + num++; + } + } + if (num) { + player.draw(num); + } + } + }, + ai: { + threaten: 1.2, + }, + }, + guizao: { + audio: 2, + trigger: { player: "phaseDiscardEnd" }, + direct: true, + filter: function (event, player) { + if (event.cards && event.cards.length > 1) { + var suits = []; + for (var i = 0; i < event.cards.length; i++) { + var suit = get.suit(event.cards[i]); + if (suits.includes(suit)) { + return false; + } else { + suits.push(suit); + } + } + return true; + } + return false; + }, + content: function () { + player.chooseDrawRecover(get.prompt("guizao"), "摸一张牌或回复1点体力").logSkill = "guizao"; + }, + }, + jiyu: { + audio: 2, + enable: "phaseUse", + locked: false, + filter: function (event, player) { + if (!player.getStat().skill.jiyu || !player.storage.jiyu2) return true; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + if (!player.storage.jiyu2.includes(get.suit(hs[i]))) { + return true; + } + } + return false; + }, + filterTarget: function (card, player, target) { + return target.countCards("h") && (!player.storage.jiyu || !player.storage.jiyu.includes(target)); + }, + content: function () { + "step 0"; + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse" && !evt.jiyu) { + evt.jiyu = true; + var next = game.createEvent("jiyu_clear"); + _status.event.next.remove(next); + evt.after.push(next); + next.player = player; + next.setContent(function () { + game.broadcastAll(function (player) { + delete player.storage.jiyu; + delete player.storage.jiyu2; + }, player); + }); + } + if (!player.storage.jiyu) player.storage.jiyu = []; + player.storage.jiyu.push(target); + var spade = true; + if (player.isTurnedOver() || get.attitude(target, player) > 0 || target.hp <= 2) { + spade = false; + } + target + .chooseToDiscard("h", true) + .set("ai", function (card) { + if (get.suit(card) == "spade") { + if (_status.event.spade) { + return 10 - get.value(card); + } else { + return -10 - get.value(card); + } + } + if (_status.event.getParent().player.storage.jiyu2 && _status.event.getParent().player.storage.jiyu2.includes(get.suit(card))) { + return -3 - get.value(card); + } + return -get.value(card); + }) + .set("spade", spade); + "step 1"; + if (!result.cards || !result.cards.length) return; + var card = result.cards[0]; + if (get.suit(card, target) == "spade") { + player.turnOver(); + target.loseHp(); + } + if (!player.storage.jiyu2) player.storage.jiyu2 = []; + player.storage.jiyu2.add(get.suit(card)); + }, + onremove: ["jiyu", "jiyu2"], + ai: { + order: 9, + result: { + target: function (player, target) { + if (player.isTurnedOver() || target.countCards("h") <= 3) return -1; + return 0; + }, + }, + }, + mod: { + cardEnabled: function (card, player) { + if (player.storage.jiyu2 && player.storage.jiyu2.includes(get.suit(card))) return false; + }, + cardSavable: function (card, player) { + if (player.storage.jiyu2 && player.storage.jiyu2.includes(get.suit(card))) return false; + }, + }, + }, + jiyu2: { + trigger: { player: ["phaseUseBegin", "phaseUseAfter"] }, + silent: true, + content: function () { + player.storage.jiyu = []; + player.storage.jiyu2 = []; + }, + }, + jiaozhao: { + mod: { + targetEnabled: function (card, player, target) { + if (card.storage && card.storage.jiaozhao && card.storage.jiaozhao == target) return false; + }, + }, + enable: "phaseUse", + usable: 1, + audio: 2, + check: function (card) { + return 8 - get.value(card); + }, + filter: function (event, player) { + return player.countMark("xindanxin") < 2 && player.countCards("h") > 0; + }, + filterCard: true, + discard: false, + lose: false, + delay: false, + locked: false, + content: function () { + "step 0"; + player.showCards(cards); + "step 1"; + if (player.countMark("xindanxin") > 1) { + event.target = player; + } else { + var targets = game.filterPlayer(); + targets.remove(player); + targets.sort(function (a, b) { + return Math.max(1, get.distance(player, a)) - Math.max(1, get.distance(player, b)); + }); + var distance = Math.max(1, get.distance(player, targets[0])); + for (var i = 1; i < targets.length; i++) { + if (Math.max(1, get.distance(player, targets[i])) > distance) { + targets.splice(i); + break; + } + } + player + .chooseTarget("请选择【矫诏】的目标", true, function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("targets", targets); + } + "step 2"; + if (!event.target) { + event.target = result.targets[0]; + player.line(result.targets, "green"); + } + if (!event.target) { + event.finish(); + return; + } + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if (name == "sha") { + list.push(["基本", "", "sha"]); + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + } else if (get.type(name) == "basic") list.push(["基本", "", name]); + else if (player.countMark("xindanxin") > 0 && get.type(name) == "trick") list.push(["锦囊", "", name]); + } + event.target + .chooseButton(["矫诏", [list, "vcard"]], true) + .set("ai", function (button) { + var player = _status.event.getParent().player, + card = { + name: button.link[2], + nature: button.link[3], + storage: { + jiaozhao: player, + }, + }; + return player.getUseValue(card, null, true) * _status.event.att; + }) + .set("att", get.attitude(event.target, player) > 0 ? 1 : -1); + "step 3"; + var chosen = result.links[0][2]; + var nature = result.links[0][3]; + var fakecard = { + name: chosen, + storage: { jiaozhao: player }, + }; + if (nature) fakecard.nature = nature; + event.target.showCards( + game.createCard({ + name: chosen, + nature: nature, + suit: cards[0].suit, + number: cards[0].number, + }), + get.translation(event.target) + "声明了" + get.translation(chosen) + ); + player.storage.jiaozhao = cards[0]; + player.storage.jiaozhao_card = fakecard; + game.broadcastAll( + function (name, card) { + lib.skill.jiaozhao2.viewAs = fakecard; + card.addGaintag("jiaozhao"); + }, + fakecard, + cards[0] + ); + player.addTempSkill("jiaozhao2", "phaseUseEnd"); + }, + ai: { + order: 9, + result: { + player: 1, + }, + }, + group: "jiaozhao3", + }, + jiaozhao2: { + enable: "phaseUse", + audio: "jiaozhao", + charlotte: true, + filter: function (event, player) { + if (!player.storage.jiaozhao || !lib.skill.jiaozhao2.viewAs) return false; + var name = lib.skill.jiaozhao2.viewAs.name; + return player.getCards("h").includes(player.storage.jiaozhao) && player.storage.jiaozhao.hasGaintag("jiaozhao") && game.checkMod(player.storage.jiaozhao, player, "unchanged", "cardEnabled2", player) !== false; + }, + filterCard: function (card, player) { + return card == player.storage.jiaozhao; + }, + selectCard: -1, + popname: true, + prompt: function () { + return "选择" + get.translation(lib.skill.jiaozhao2.viewAs) + "的目标"; + }, + check: function (card) { + return 8 - get.value(card); + }, + ai: { + order: 6, + }, + onremove: function (player) { + player.removeGaintag("jiaozhao"); + delete player.storage.jiaozhao; + delete player.storage.jiaozhao_card; + }, + }, + jiaozhao3: { + audio: "jiaozhao", + enable: "phaseUse", + filter: function (event, player) { + return (player.getStat("skill").jiaozhao || 0) + (player.getStat("skill").jiaozhao3 || 0) < player.countMark("xindanxin") - 1 && player.countCards("h") > 0; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of lib.inpile) { + var type = get.type(i, false); + if (type == "basic" || type == "trick") { + var card = { + name: i, + storage: { + jiaozhao: player, + }, + }; + if (event.filterCard(card, player, event)) list.push([type, "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(card, player, event)) list.push([type, "", i, j]); + } + } + } + } + if (list.length) return ui.create.dialog("矫诏", [list, "vcard"]); + return ui.create.dialog("矫诏:当前没有可用牌"); + }, + check: function (button) { + var player = _status.event.player, + card = { + name: button.link[2], + nature: button.link[3], + storage: { + jiaozhao: player, + }, + }; + return player.getUseValue(card); + }, + backup: function (links, player) { + return { + audio: "jiaozhao", + filterCard: true, + position: "h", + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + storage: { + jiaozhao: player, + }, + }, + check: function (card) { + return 8 - get.value(card); + }, + }; + }, + prompt: function (links, player) { + return "将一张牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 9, + result: { + player: 1, + }, + }, + }, + jiaozhao3_backup: { audio: "jiaozhao" }, + xindanxin: { + trigger: { player: "damageEnd" }, + frequent: true, + audio: "danxin", + content: function () { + player.draw(); + if (player.countMark("xindanxin") < 3) { + player.addMark("xindanxin", 1, false); + game.log(player, "修改了技能", "#g【矫诏】"); + } + }, + intro: { content: "【矫诏】加成等级:Lv.#" }, + ai: { + maixie: true, + effect: { + target: (card, player, target) => { + if (!get.tag(card, "damage")) return; + if (target.hp + target.hujia < 2 || player.hasSkillTag("jueqing", false, target)) return 1.8; + if (target.countMark("xindanxin") > 1) return [1, 1]; + return [1, 0.8 * target.hp - 0.5]; + }, + }, + }, + }, + danxin: { + trigger: { player: "damageEnd" }, + frequent: true, + audio: 2, + content: function () { + "step 0"; + if (player.countMark("xindanxin") >= 2) { + player.draw(); + event.finish(); + } else { + var list = ["draw_card", "更改描述"]; + var prompt; + if (player.countMark("xindanxin") == 0) { + prompt = '摸一张牌或更改矫诏的描述

    更改描述:将“选择距离最近的一名其他角色,该角色”改为“你”'; + } else { + prompt = '摸一张牌或更改矫诏的描述

    更改描述:将“基本牌”改为“基本牌或普通锦囊牌”'; + } + player + .chooseControl(list, function () { + if (!_status.event.player.hasSkill("jiaozhao")) return "draw_card"; + return "更改描述"; + }) + .set("prompt", prompt); + } + "step 1"; + if (result.control == "draw_card") { + player.draw(); + } else { + game.log(player, "更改了", "【矫诏】", "的描述"); + player.popup("更改描述"); + player.addMark("xindanxin", 1, false); + } + }, + ai: { + maixie: true, + effect: { + target: (card, player, target) => { + if (!get.tag(card, "damage")) return; + if (target.hp < 2 || player.hasSkillTag("jueqing", false, target)) return 1.5; + return [1, 1]; + }, + }, + }, + }, + zongzuo: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + audio: 2, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + var num = game.countGroup(); + player.gainMaxHp(num); + event.num = num; + "step 1"; + player.recover(event.num); + //player.update(); + }, + group: "zongzuo_lose", + subSkill: { + lose: { + trigger: { global: "dieAfter" }, + forced: true, + audio: "zongzuo", + filter: function (event, player) { + if (!lib.group.includes(event.player.group)) return false; + if ( + game.hasPlayer(function (current) { + return current.group == event.player.group; + }) + ) { + return false; + } + return true; + }, + content: function () { + player.loseMaxHp(); + }, + }, + }, + }, + zhige: { + enable: "phaseUse", + usable: 1, + audio: 2, + filter: function (event, player) { + return player.countCards("h") > player.hp; + }, + filterTarget: function (card, player, target) { + return get.distance(target, player, "attack") <= 1 && target.countCards("e") > 0; + }, + content: function () { + "step 0"; + target.chooseToUse({ name: "sha" }, "止戈:使用一张杀,或将其装备区里的一张牌交给" + get.translation(player)); + "step 1"; + if (!result.bool && target.countCards("e")) { + target.chooseCard("e", true, "将其装备区里的一张牌交给" + get.translation(player)); + } else { + event.finish(); + } + "step 2"; + if (result.bool && result.cards && result.cards.length) { + target.give(result.cards, player); + } + }, + ai: { + expose: 0.2, + order: 5, + result: { + target: -1, + player: function (player, target) { + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; + return -0.5; + }, + }, + }, + }, + kuangbi: { + enable: "phaseUse", + usable: 1, + audio: 2, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; + }, + content: function () { + "step 0"; + target.chooseCard("he", [1, 3], "匡弼:将至多三张牌置于" + get.translation(player) + "的武将牌上", true).set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { + return 7 - get.value(card); + } + return -get.value(card); + }); + "step 1"; + if (result.bool) { + player.addToExpansion(result.cards, target, "give").gaintag.add("kuangbi"); + if (!player.storage.kuangbi_draw) player.storage.kuangbi_draw = [[], []]; + player.storage.kuangbi_draw[0].push(target); + player.storage.kuangbi_draw[1].push(result.cards.length); + player.addSkill("kuangbi_draw"); + player.syncStorage("kuangbi_draw"); + player.updateMarks("kuangbi_draw"); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + delete player.storage[skill]; + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0) { + return Math.sqrt(target.countCards("he")); + } + return 0; + }, + player: 1, + }, + }, + subSkill: { + draw: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + mark: true, + charlotte: true, + audio: "kuangbi", + onremove: true, + filter: function (event, player) { + return player.getExpansions("kuangbi").length; + }, + content: function () { + player.gain(player.getExpansions("kuangbi"), "gain2"); + var storage = player.storage.kuangbi_draw; + if (storage.length) { + for (var i = 0; i < storage[0].length; i++) { + var target = storage[0][i], + num = storage[1][i]; + if (target && target.isIn()) { + player.line(target); + target.draw(num); + } + } + } + player.removeSkill("kuangbi_draw"); + }, + }, + }, + }, + fulin: { + trigger: { player: "phaseDiscardBegin" }, + audio: 2, + forced: true, + content: function () { + player.addTempSkill("fulin2", "phaseDiscardAfter"); + }, + group: ["fulin_count", "fulin_reset"], + subSkill: { + reset: { + trigger: { player: ["phaseBefore", "phaseAfter"] }, + silent: true, + priority: 10, + content: function () { + player.removeGaintag("fulin"); + }, + }, + count: { + trigger: { player: "gainBegin" }, + audio: "fulin", + forced: true, + silent: true, + filter: function (event, player) { + return _status.currentPhase == player; + }, + content: function () { + trigger.gaintag.add("fulin"); + }, + }, + }, + onremove: function (player) { + player.removeGaintag("fulin"); + }, + }, + fulin2: { + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("fulin")) { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("fulin")) { + return false; + } + }, + }, + }, + duliang: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("h") > 0; + }, + audio: 2, + content: function () { + "step 0"; + player.gainPlayerCard(target, "h", true); + "step 1"; + var name = get.translation(target); + player + .chooseControl(function () { + return Math.random() < 0.5 ? "选项一" : "选项二"; + }) + .set("prompt", "督粮") + .set("choiceList", ["令" + name + "观看牌堆顶的两张牌,然后获得其中的基本牌", "令" + name + "于下个摸牌阶段额外摸一张牌"]); + "step 2"; + if (result.control == "选项一") { + var cards = get.cards(2); + target.viewCards("督粮", cards); + event.cards2 = []; + event.tothrow = []; + for (var i = 0; i < cards.length; i++) { + if (get.type(cards[i]) == "basic") { + ui.special.appendChild(cards[i]); + event.cards2.push(cards[i]); + } else { + event.tothrow.push(cards[i]); + } + } + while (event.tothrow.length) { + ui.cardPile.insertBefore(event.tothrow.pop(), ui.cardPile.firstChild); + } + } else { + target.addSkill("duliang2"); + target.updateMarks("duliang2"); + target.storage.duliang2++; + event.finish(); + } + "step 3"; + if (event.cards2 && event.cards2.length) { + target.gain(event.cards2, "draw"); + game.log(target, "获得了" + get.cnNumber(event.cards2.length) + "张牌"); + } + game.updateRoundNumber(); + }, + ai: { + order: 4, + result: { + target: -1, + player: 0.1, + }, + }, + }, + duliang2: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + mark: true, + audio: false, + onremove: true, + charlotte: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = 0; + }, + intro: { + content: "下个摸牌阶段额外摸#张牌", + }, + content: function () { + trigger.num += player.storage.duliang2; + player.removeSkill("duliang2"); + }, + }, + xinfencheng: { + skillAnimation: "epic", + animationColor: "gray", + audio: 2, + audioname: ["re_liru"], + enable: "phaseUse", + filter: function (event, player) { + return !player.storage.xinfencheng; + }, + filterTarget: function (card, player, target) { + return player != target; + }, + unique: true, + limited: true, + selectTarget: -1, + multitarget: true, + multiline: true, + mark: true, + line: "fire", + content: function () { + "step 0"; + player.storage.xinfencheng = true; + player.awakenSkill("xinfencheng"); + event.num = 1; + event.targets = targets.slice(0); + event.targets.sort(lib.sort.seat); + "step 1"; + if (event.targets.length) { + var target = event.targets.shift(); + event.target = target; + var res = get.damageEffect(target, player, target, "fire"); + target + .chooseToDiscard("he", "弃置至少" + get.cnNumber(event.num) + "张牌或受到2点火焰伤害", [num, Infinity]) + .set("ai", function (card) { + if (ui.selected.cards.length >= _status.event.getParent().num) return -1; + if (_status.event.player.hasSkillTag("nofire")) return -1; + if (_status.event.res >= 0) return 6 - get.value(card); + if (get.type(card) != "basic") { + return 10 - get.value(card); + } + return 8 - get.value(card); + }) + .set("res", res); + } else { + event.finish(); + } + "step 2"; + if (!result.bool) { + event.target.damage(2, "fire"); + event.num = 1; + } else { + event.num = result.cards.length + 1; + } + event.goto(1); + }, + ai: { + order: 1, + result: { + player: function (player) { + var num = 0, + eff = 0, + players = game + .filterPlayer(function (current) { + return current != player; + }) + .sortBySeat(player); + for (var target of players) { + if (get.damageEffect(target, player, target, "fire") >= 0) { + num = 0; + continue; + } + var shao = false; + num++; + if ( + target.countCards("he", function (card) { + if (get.type(card) != "basic") { + return get.value(card) < 10; + } + return get.value(card) < 8; + }) < num + ) + shao = true; + if (shao) { + eff -= 4 * (get.realAttitude || get.attitude)(player, target); + num = 0; + } else eff -= (num * (get.realAttitude || get.attitude)(player, target)) / 4; + } + if (eff < 4) return 0; + return eff; + }, + }, + }, + init: function (player) { + player.storage.xinfencheng = false; + }, + intro: { + content: "limited", + }, + }, + xinjuece: { + audio: "juece", + audioname: ["dc_liru"], + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (player) { + return player.countCards("h") == 0; + }); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("xinjuece"), "对一名没有手牌的角色造成1点伤害", function (card, player, target) { + return target.countCards("h") == 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + player.logSkill("xinjuece", result.targets); + result.targets[0].damage(); + } + }, + }, + xinmieji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", { type: ["trick", "delay"], color: "black" }); + }, + filterCard: function (card) { + return get.color(card) == "black" && get.type(card, "trick") == "trick"; + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + discard: false, + delay: false, + check: function (card) { + return 8 - get.value(card); + }, + loseTo: "cardPile", + insert: true, + visible: true, + content: function () { + "step 0"; + player.showCards(cards); + "step 1"; + target.chooseToDiscard("he", true).set("prompt", "请弃置一张锦囊牌,或依次弃置两张非锦囊牌。"); + "step 2"; + if ( + (!result.cards || get.type(result.cards[0], "trick", result.cards[0].original == "h" ? target : false) != "trick") && + target.countCards("he", function (card) { + return get.type(card, "trick") != "trick"; + }) + ) { + target + .chooseToDiscard("he", true, function (card) { + return get.type(card, "trick") != "trick"; + }) + .set("prompt", "请弃置第二张非锦囊牌"); + } + }, + ai: { + order: 9, + result: { + target: -1, + }, + }, + }, + qianju: { + mod: { + globalFrom: function (from, to, distance) { + return distance - from.getDamagedHp(); + }, + }, + }, + reqianju: { + mod: { + globalFrom: function (from, to, distance) { + return distance - Math.max(1, from.getDamagedHp()); + }, + }, + }, + reqingxi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" || event.card.name == "juedou"; + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + logTarget: "target", + content: function () { + "step 0"; + var num = Math.min( + game.countPlayer(function (current) { + return player.inRange(current); + }), + player.getEquips(1).length ? 4 : 2 + ); + if (trigger.target.countCards("h") < num) { + event.directfalse = true; + } else { + trigger.target.chooseToDiscard(num, "弃置" + get.cnNumber(num) + "张手牌,或令" + get.translation(trigger.card) + "的伤害+1").set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1) { + if (get.type(card) == "basic") { + return 8 - get.value(card); + } else { + return 10 - get.value(card); + } + } else { + if (num > 2) { + return 0; + } + return 8 - get.value(card); + } + }); + } + "step 1"; + if (!event.directfalse && result.bool) { + var e1 = player.getEquips(1); + if (e1.length) { + player.discard(e1, "notBySelf"); + } + event.finish(); + } else { + var id = trigger.target.playerid; + var map = trigger.customArgs; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; + map[id].extraDamage++; + player.judge(function (card) { + if (get.color(card) == "red") return 1; + return 0; + }).judge2 = function (result) { + return result.bool; + }; + } + "step 2"; + if (result.color == "red") trigger.directHit.add(trigger.target); + }, + }, + reqingxi2: { + mod: { + cardEnabled: function (card, player) { + if ( + player.storage.reqingxi2 && + player.storage.reqingxi2.filter(function (cd) { + return get.color(cd) == get.color(card); + }).length + ) + return false; + }, + cardRespondable: function (card, player) { + if ( + player.storage.reqingxi2 && + player.storage.reqingxi2.filter(function (cd) { + return get.color(cd) == get.color(card); + }).length + ) + return false; + }, + }, + firstDo: true, + onremove: true, + trigger: { + player: ["damage", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded"], + }, + charlotte: true, + filter: function (event, player) { + return player.storage.reqingxi2 && event.card && player.storage.reqingxi2.includes(event.card); + }, + silent: true, + forced: true, + popup: false, + priority: 12, + content: function () { + player.storage.reqingxi2.remove(trigger.card); + if (!player.storage.reqingxi2.length) player.removeSkill("reqingxi2"); + }, + }, + qingxi: { + audio: 2, + trigger: { source: "damageBegin1" }, + check: function (event, player) { + return get.attitude(player, event.player) < 0; + }, + filter: function (event, player) { + return event.getParent().name == "sha" && player.getEquips(1).length > 0; + }, + content: function () { + "step 0"; + var num = player.getEquipRange(); + if (trigger.player.countCards("h") < num) { + event.directfalse = true; + } else { + trigger.player.chooseToDiscard(num, "弃置" + get.cnNumber(num) + "张手牌,或令杀的伤害+1").set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1) { + if (get.type(card) == "basic") { + return 8 - get.value(card); + } else { + return 10 - get.value(card); + } + } else { + if (num > 2) { + return 0; + } + return 8 - get.value(card); + } + }); + } + "step 1"; + if (!event.directfalse && result.bool) { + var e1 = player.getEquips(1); + if (e1.length) { + player.discard(e1, "notBySelf"); + } + } else { + trigger.num++; + } + }, + }, + jieyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; + }, + filterCard: lib.filter.cardDiscardable, + ai1: function (card) { + return 7 - get.useful(card); + }, + ai2: function (target) { + return 1 - get.attitude(_status.event.player, target); + }, + prompt: get.prompt2("jieyue"), + }); + "step 1"; + if (result.bool) { + player.logSkill("jieyue", result.targets); + player.discard(result.cards); + var target = result.targets[0]; + event.target = target; + target.chooseCard("将一张牌置于" + get.translation(player) + "的武将牌上,或令其弃置你的一张牌", "he").set("ai", function (card) { + if (card.name == "du") return 20; + var player = _status.event.player; + if (get.attitude(player, _status.event.getParent().player) > 0) { + return 8 - get.value(card); + } + var nh = player.countCards("h"); + if (nh <= 2) { + return 6 - get.value(card); + } + if (nh <= 3) { + return 2 - get.value(card); + } + return 0; + }); + } else { + event.finish(); + } + "step 2"; + if (result.bool && result.cards && result.cards.length) { + player.addToExpansion(result.cards, "give", target).gaintag.add("jieyue"); + } else if (event.target.countCards("he")) { + player.discardPlayerCard(event.target, true); + } + }, + ai: { expose: 0.1 }, + marktext: "节", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: ["jieyue_wuxie", "jieyue_shan", "jieyue_gain"], + subSkill: { + wuxie: { + audio: true, + enable: "chooseToUse", + filterCard: function (card) { + return get.color(card) == "black"; + }, + viewAsFilter: function (player) { + return player.getExpansions("jieyue").length && player.countCards("hs", { color: "black" }) > 0; + }, + position: "hs", + viewAs: { name: "wuxie" }, + prompt: "将一张黑色手牌当无懈可击使用", + check: function (card) { + return 8 - get.value(card); + }, + }, + shan: { + audio: true, + enable: ["chooseToRespond", "chooseToUse"], + filterCard: function (card) { + return get.color(card) == "red"; + }, + position: "hs", + viewAs: { name: "shan" }, + viewAsFilter: function (player) { + return player.getExpansions("jieyue").length && player.countCards("hs", { color: "red" }) > 0; + }, + prompt: "将一张红色手牌当闪使用或打出", + check: () => 1, + ai: { + respondShan: true, + skillTagFilter: function (player) { + if (!player.getExpansions("jieyue").length || !player.countCards("hs", { color: "red" })) return false; + }, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.8; + }, + }, + }, + }, + gain: { + audio: "jieyue", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getExpansions("jieyue").length; + }, + forced: true, + content: function () { + var cards = player.getExpansions("jieyue"); + if (cards.length) player.gain(cards, "gain2"); + }, + }, + }, + }, + jinjiu: { + mod: { + cardname: function (card, player) { + if (card.name == "jiu") return "sha"; + }, + }, + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", "jiu")) return false; + }, + respondSha: true, + }, + audio: 2, + trigger: { player: ["useCard1", "respond"] }, + firstDo: true, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && !event.skill && event.cards.length == 1 && event.cards[0].name == "jiu"; + }, + content: function () {}, + }, + xinxianzhen: { + audio: "xianzhen", + inherit: "xianzhen", + }, + xinxianzhen2: { + audio: "xianzhen", + audioname2: { + ol_gaoshun: "rexianzhen", + }, + mod: { + targetInRange: function (card, player, target) { + if (target == player.storage.xinxianzhen) return true; + }, + cardUsableTarget: function (card, player, target) { + if (target == player.storage.xinxianzhen) return true; + }, + }, + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (arg.target != player.storage.xinxianzhen) return false; + }, + effect: { + player: function (card, player, target, current, isLink) { + if (isLink || !player.storage.xinxianzhen) return; + if (target != player.storage.xinxianzhen && ["sha", "guohe", "shunshou", "huogong", "juedou"].includes(card.name)) { + if (get.effect(player.storage.xinxianzhen, card, player, player) > 0) { + return [1, 2]; + } + } + }, + }, + }, + trigger: { player: "useCard2" }, + filter: function (event, player) { + return player.storage.xinxianzhen && player.storage.xinxianzhen.isIn() && (event.card.name == "sha" || get.type(event.card) == "trick") && event.targets && event.targets.length == 1 && !event.targets.includes(player.storage.xinxianzhen); + }, + check: function (event, player) { + return get.effect(player.storage.xinxianzhen, event.card, player, player) > 0; + }, + logTarget: function (event, player) { + return player.storage.xinxianzhen; + }, + prompt2: (event, player) => "令" + get.translation(player.storage.decadexianzhen2) + "也成为" + get.translation(event.card) + "的目标", + content: function () { + var target = player.storage.xinxianzhen; + trigger.targets.push(target); + game.log(target, "成为了", trigger.card, "的额外目标"); + }, + }, + xinxianzhen3: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + ignoredHandcard: function (card, player) { + if (get.name(card) == "sha") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.name(card) == "sha") { + return false; + } + }, + }, + }, + xianzhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) { + player.storage[event.name] = target; + player.addTempSkill(event.name + 2); + } else { + player.addTempSkill(event.name + 3); + } + }, + ai: { + order: function (name, player) { + var cards = player.getCards("h"); + if (player.countCards("h", "sha") == 0) { + return 1; + } + for (var i = 0; i < cards.length; i++) { + if (cards[i].name != "sha" && get.number(cards[i]) > 11 && get.value(cards[i]) < 7) { + return 9; + } + } + return get.order({ name: "sha" }) - 1; + }, + result: { + player: function (player) { + if (player.countCards("h", "sha") > 0) return 0; + var num = player.countCards("h"); + if (num > player.hp) return 0; + if (num == 1) return -2; + if (num == 2) return -1; + return -0.7; + }, + target: function (player, target) { + var num = target.countCards("h"); + if (num == 1) return -1; + if (num == 2) return -0.7; + return -0.5; + }, + }, + threaten: 1.3, + }, + }, + xianzhen2: { + charlotte: true, + mod: { + targetInRange: function (card, player, target) { + if (target == player.storage.xianzhen) return true; + }, + cardUsableTarget: function (card, player, target) { + if (target == player.storage.xianzhen) return true; + }, + }, + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (arg.target != player.storage.xianzhen) return false; + }, + }, + }, + xianzhen3: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + }, + lihuo: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; + return false; + }, + audio: 2, + audioname: ["re_chengpu"], + check: function (event, player) { + return false; + }, + content: function () { + game.setNature(trigger.card, "fire"); + var next = game.createEvent("lihuo_clear"); + next.player = player; + next.card = trigger.card; + event.next.remove(next); + next.forceDie = true; + trigger.after.push(next); + next.setContent(function () { + if ( + player.isIn() && + player.getHistory("sourceDamage", function (evt) { + return evt.getParent(2) == event.parent; + }).length > 0 + ) + player.loseHp(); + game.setNature(card, [], true); + }); + }, + group: "lihuo2", + }, + lihuo2: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("lihuo"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) { + return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); + }) + .set("sourcex", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }); + "step 1"; + if (result.bool) { + if (!event.isMine() && !_status.connectMode) game.delayx(); + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + player.logSkill("lihuo", event.target); + trigger.targets.push(event.target); + }, + }, + lihuo3: { + trigger: { player: "useCardAfter" }, + vanish: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + forced: true, + audio: false, + content: function () { + player.loseHp(); + player.removeSkill("lihuo3"); + }, + }, + chunlao: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + audioname: ["xin_chengpu"], + filter: function (event, player) { + return player.countCards("h") > 0 && (_status.connectMode || player.countCards("h", "sha") > 0) && !player.getExpansions("chunlao").length; + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + content: function () { + "step 0"; + player + .chooseCard([1, Math.max(1, player.countCards("h", "sha"))], get.prompt("chunlao"), { + name: "sha", + }) + .set("ai", function () { + return 1; + }); + "step 1"; + if (result.bool) { + player.logSkill("chunlao"); + player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("chunlao"); + } + }, + ai: { + effect: { + player: function (card, player, target) { + if (_status.currentPhase != player) return; + if (card.name == "sha" && !player.needsToDiscard() && !player.getExpansions("chunlao").length && target.hp > 1) { + return "zeroplayertarget"; + } + }, + }, + threaten: 1.4, + }, + group: "chunlao2", + }, + chunlao2: { + enable: "chooseToUse", + filter: function (event, player) { + return event.type == "dying" && event.dying && event.dying.hp <= 0 && player.getExpansions("chunlao").length > 0; + }, + filterTarget: function (card, player, target) { + return target == _status.event.dying; + }, + direct: true, + clearTime: true, + delay: false, + selectTarget: -1, + content: function () { + "step 0"; + player.chooseCardButton(get.translation("chunlao"), player.getExpansions("chunlao"), true); + "step 1"; + if (result.bool) { + player.logSkill("chunlao", target); + player.loseToDiscardpile(result.links); + event.type = "dying"; + target.useCard({ name: "jiu", isCard: true }, target); + } + }, + ai: { + order: 6, + skillTagFilter: function (player) { + return player.getExpansions("chunlao").length > 0; + }, + save: true, + result: { + target: 3, + }, + threaten: 1.6, + }, + }, + chunlao2_old: { + trigger: { global: "dying" }, + //priority:6, + filter: function (event, player) { + return event.player.hp <= 0 && player.storage.chunlao.length > 0; + }, + direct: true, + content: function () { + "step 0"; + var att = get.attitude(player, trigger.player); + player + .chooseCardButton(get.prompt("chunlao", trigger.player), player.storage.chunlao) + .set("ai", function (button) { + if (_status.event.att > 0) return 1; + return 0; + }) + .set("att", att); + "step 1"; + if (result.bool) { + player.logSkill("chunlao", trigger.player); + player.$throw(result.links); + player.storage.chunlao.remove(result.links[0]); + result.links[0].discard(); + player.syncStorage("chunlao"); + trigger.player.useCard({ name: "jiu", isCard: true }, trigger.player); + if (!player.storage.chunlao.length) { + player.unmarkSkill("chunlao"); + } else { + player.markSkill("chunlao"); + } + } + }, + ai: { + expose: 0.2, + }, + }, + shenduan: { + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false) return; + var evt = event.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (get.color(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "black" && get.type(evt.cards2[i]) == "basic" && get.position(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "d") { + return true; + } + } + return false; + }, + audio: 2, + direct: true, + content: function () { + "step 0"; + var cards = []; + var evt = trigger.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (get.color(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "black" && get.type(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "basic" && get.position(evt.cards2[i]) == "d") { + cards.push(evt.cards2[i]); + } + } + if (!cards.length) { + event.finish(); + } else { + event.cards = cards; + } + "step 1"; + if (event.cards.length) { + player + .chooseTarget(get.prompt("shenduan"), "将" + get.translation(event.cards) + (event.cards.length > 1 ? "中的一张牌" : "") + "当做【兵粮寸断】对一名其他角色使用", function (card, player, target) { + var cs = _status.event.cards; + for (var i = 0; i < cs.length; i++) { + if (player.canUse({ name: "bingliang", cards: [cs[i]] }, target, false)) return true; + } + return false; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "bingliang" }, player, player); + }) + .set("cards", cards); + } else { + event.finish(); + } + "step 2"; + if (result.bool && result.targets && result.targets.length) { + event.current = result.targets[0]; + if (event.cards.length == 1) { + event.directCard = event.cards[0]; + } else { + delete event.directCard; + player + .chooseCardButton("选择一张牌当作兵断寸断使用", event.cards, true) + .set("filterButton", function (button) { + return player.canUse({ name: "bingliang", cards: [button.link] }, _status.event.target, false); + }) + .set("target", event.current); + } + } else { + event.finish(); + } + "step 3"; + var card; + if (event.directCard) { + card = event.directCard; + } else if (result.links && result.links.length && event.cards.includes(result.links[0])) { + card = result.links[0]; + } + if (card) { + event.cards.remove(card); + player.line(event.current); + player.useCard({ name: "bingliang" }, event.current, [card], "shenduan").animate = false; + event.goto(1); + } + }, + }, + reshenduan: { + audio: 2, + trigger: { + global: "loseAsyncAfter", + player: "loseAfter", + }, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false) return; + var evt = event.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (get.color(evt.cards2[i], player) == "black" && ["basic", "equip"].includes(get.type(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false)) && get.position(evt.cards2[i]) == "d") { + return true; + } + } + return false; + }, + direct: true, + content: function () { + "step 0"; + var cards = []; + var evt = trigger.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (get.color(evt.cards2[i], player) == "black" && ["basic", "equip"].includes(get.type(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false)) && get.position(evt.cards2[i]) == "d") { + cards.push(evt.cards2[i]); + } + } + if (!cards.length) { + event.finish(); + } else { + event.cards = cards; + } + "step 1"; + if (event.cards.length) { + player + .chooseTarget(get.prompt("shenduan"), "将" + get.translation(event.cards) + (event.cards.length > 1 ? "中的一张牌" : "") + "当做【兵粮寸断】对一名其他角色使用", function (card, player, target) { + var cs = _status.event.cards; + for (var i = 0; i < cs.length; i++) { + if (player.canUse({ name: "bingliang", cards: [cs[i]] }, target, false)) return true; + } + return false; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "bingliang" }, player, player); + }) + .set("cards", cards); + } else { + event.finish(); + } + "step 2"; + if (result.bool && result.targets && result.targets.length) { + event.current = result.targets[0]; + if (event.cards.length == 1) { + event.directCard = event.cards[0]; + } else { + delete event.directCard; + player + .chooseCardButton("选择一张牌当作兵断寸断使用", event.cards, true) + .set("filterButton", function (button) { + return player.canUse({ name: "bingliang", cards: [button.link] }, _status.event.target, false); + }) + .set("target", event.current); + } + } else { + event.finish(); + } + "step 3"; + var card; + if (event.directCard) { + card = event.directCard; + } else if (result.links && result.links.length && event.cards.includes(result.links[0])) { + card = result.links[0]; + } + if (card) { + event.cards.remove(card); + player.line(event.current); + player.useCard({ name: "bingliang" }, event.current, [card], "reshenduan").animate = false; + event.goto(1); + } + }, + }, + reyonglve: { + audio: 2, + trigger: { global: "phaseJudgeBegin" }, + direct: true, + filter: function (event, player) { + return event.player != player && event.player.countCards("j") > 0; + }, + content: function () { + "step 0"; + var att = get.attitude(player, trigger.player); + var nh = trigger.player.countCards("h"); + var eff = get.effect(trigger.player, { name: "sha", isCard: true }, player, player); + if (player.inRange(trigger.player) || !player.canUse({ name: "sha", isCard: true }, trigger.player, false)) eff = 0; + player + .discardPlayerCard(get.prompt("yonglve", trigger.player), trigger.player, "j") + .set("ai", function (button) { + var name = button.link.viewAs || button.link.name; + var att = _status.event.att; + var nh = _status.event.nh; + var eff = _status.event.eff; + var trigger = _status.event.getTrigger(); + if (att > 0 && eff >= 0) return 1; + if (att >= 0 && eff > 0) return 1; + if ( + att > 0 && + (trigger.player.hp >= 3 || + trigger.player.hasSkillTag("freeShan", false, { + player: _status.event.player, + card: new lib.element.VCard({ name: "sha", isCard: true }), + }) || + trigger.player.countCards("h", "shan")) + ) { + if (name == "lebu" && nh > trigger.player.hp) return 1; + if (name == "bingliang" && nh < trigger.player.hp) return 1; + } + return 0; + }) + .set("att", att) + .set("nh", nh) + .set("eff", eff) + .set("logSkill", ["reyonglve", trigger.player]); + "step 1"; + if (result.bool) { + if (!player.inRange(trigger.player) && player.canUse({ name: "sha", isCard: true }, trigger.player, false)) { + player.useCard({ name: "sha", isCard: true }, trigger.player); + } else player.draw(); + } + }, + }, + yonglve: { + trigger: { global: "phaseJudgeBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return event.player != player && event.player.countCards("j") > 0 && player.inRange(event.player); + }, + content: function () { + "step 0"; + var att = get.attitude(player, trigger.player); + var nh = trigger.player.countCards("h"); + var eff = get.effect(trigger.player, { name: "sha", isCard: true }, player, player); + if (!player.canUse({ name: "sha", isCard: true }, trigger.player)) eff = 0; + player + .discardPlayerCard(get.prompt("yonglve", trigger.player), trigger.player, "j") + .set("ai", function (button) { + var name = button.link.viewAs || button.link.name; + var att = _status.event.att; + var nh = _status.event.nh; + var eff = _status.event.eff; + var trigger = _status.event.getTrigger(); + if (att > 0 && eff >= 0) return 1; + if (att >= 0 && eff > 0) return 1; + if ( + att > 0 && + (trigger.player.hp >= 3 || + trigger.player.hasSkillTag("freeShan", false, { + player: _status.event.player, + card: new lib.element.VCard({ name: "sha", isCard: true }), + }) || + trigger.player.countCards("h", "shan")) + ) { + if (name == "lebu" && nh > trigger.player.hp) return 1; + if (name == "bingliang" && nh < trigger.player.hp) return 1; + } + return 0; + }) + .set("att", att) + .set("nh", nh) + .set("eff", eff) + .set("logSkill", ["yonglve", trigger.player]); + "step 1"; + if (result.bool) { + if (player.canUse({ name: "sha", isCard: true }, trigger.player)) { + event.related = player.useCard({ name: "sha", isCard: true }, trigger.player); + } + } else { + event.finish(); + } + "step 2"; + if ( + !event.related || + !game.hasPlayer2(function (current) { + return ( + current.getHistory("damage", function (evt) { + return evt.getParent(2) == event.related; + }).length > 0 + ); + }) + ) { + player.draw(); + } + }, + //group:'yonglve2' + }, + yonglve2: { + trigger: { source: "damage" }, + forced: true, + popup: false, + filter: function (event) { + return event.parent.skill == "yonglve"; + }, + content: function () { + player.storage.yonglve = true; + }, + }, + benxi: { + audio: 2, + trigger: { player: "useCard2" }, + forced: true, + filter: function (event, player) { + return player.isPhaseUsing(); + }, + content: function () {}, + mod: { + globalFrom: function (from, to, distance) { + if (_status.currentPhase == from) { + return distance - from.countUsed(); + } + }, + selectTarget: function (card, player, range) { + if (_status.currentPhase == player) { + if (card.name == "sha" && range[1] != -1) { + if ( + !game.hasPlayer(function (current) { + return get.distance(player, current) > 1; + }) + ) { + range[1]++; + } + } + } + }, + }, + ai: { + unequip: true, + skillTagFilter: function (player) { + if ( + game.hasPlayer(function (current) { + return get.distance(player, current) > 1; + }) + ) { + return false; + } + }, + }, + }, + sidi: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + if (event.card.name != "shan") return false; + if (event.player == player) return true; + return _status.currentPhase == player; + }, + frequent: true, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + content: function () { + player.addToExpansion(get.cards(), "gain2").gaintag.add("sidi"); + }, + group: "sidi2", + }, + sidi2: { + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + if (event.player == player || event.player.isDead()) return false; + if (!player.getExpansions("sidi").length) return false; + return true; + }, + check: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if (event.player.getEquip("zhuge")) return false; + if (event.player.hasSkill("paoxiao")) return false; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (event.player.canUse("sha", players[i]) && get.attitude(player, players[i]) > 0) break; + } + if (i == players.length) return false; + var nh = event.player.countCards("h"); + var nsha = event.player.countCards("h", "sha"); + if (nh < 2) return false; + switch (nh) { + case 2: + if (nsha) return Math.random() < 0.4; + return Math.random() < 0.2; + case 3: + if (nsha) return Math.random() < 0.8; + return Math.random() < 0.3; + case 4: + if (nsha > 1) return true; + if (nsha) return Math.random() < 0.9; + return Math.random() < 0.5; + default: + return true; + } + }, + logTarget: "player", + content: function () { + "step 0"; + var cards = player.getExpansions("sidi"); + if (cards.length == 1) { + event.directbutton = cards[0]; + } else { + player.chooseCardButton("弃置一张“司敌”牌", cards, true); + } + "step 1"; + var button; + if (event.directbutton) { + button = event.directbutton; + } else if (result.bool && result.links && result.links.length) { + button = result.links[0]; + } + if (button) { + player.loseToDiscardpile(button); + trigger.player.addTempSkill("sidi3", "phaseUseAfter"); + trigger.player.addMark("sidi3", 1, false); + } + }, + }, + sidi3: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num - player.countMark("sidi3"); + }, + }, + onremove: true, + }, + zhongyong: { + audio: 2, + trigger: { player: "shaMiss" }, + direct: true, + filter: function (event, player) { + return event.responded && get.itemtype(event.responded.cards) == "cards"; + }, + content: function () { + "step 0"; + var cards = trigger.responded.cards; + event.cards = cards; + player + .chooseTarget("忠勇:将" + get.translation(trigger.responded.cards) + "交给一名角色", function (card, player, target) { + return target != _status.event.source; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countCards("h", "shan") && target.countCards("h") >= 2) { + att /= 1.5; + } + return att; + }) + .set("source", trigger.target); + "step 1"; + if (result.bool) { + player.logSkill("zhongyong", result.targets); + result.targets[0].gain(event.cards, "gain2"); + if (result.targets[0] == player) { + event.finish(); + } + } else { + event.finish(); + } + "step 2"; + player.chooseToUse("是否对" + get.translation(trigger.target) + "再使用一张杀?", { name: "sha" }, trigger.target, -1).set("addCount", false); + }, + }, + xinzhongyong: { + trigger: { player: "useCardAfter" }, + audio: "zhongyong", + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + event.sha = trigger.cards.slice(0).filterInD(); + event.shan = []; + game.countPlayer2(function (current) { + current.getHistory("useCard", function (evt) { + if (evt.card.name == "shan" && evt.getParent(3) == trigger) event.shan.addArray(evt.cards); + }); + }); + event.shan.filterInD("d"); + if (!event.sha.length && !event.shan.length) event.finish(); + player + .chooseTarget(get.prompt2("xinzhongyong"), function (card, player, target) { + return !_status.event.source.includes(target) && target != player; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("source", trigger.targets); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xinzhongyong", target); + if (event.sha.length && event.shan.length) { + player + .chooseControl() + .set("choiceList", ["将" + get.translation(event.sha) + "交给" + get.translation(target), "将" + get.translation(event.shan) + "交给" + get.translation(target)]) + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (get.color(event.sha) != "black") return 0; + return 1; + })() + ); + } else event._result = { index: event.sha.length ? 0 : 1 }; + } else { + event.finish(); + } + "step 2"; + var cards = result.index == 0 ? event.sha : event.shan; + event.useSha = false; + target.gain(cards, "gain2"); + for (var i = 0; i < cards.length; i++) { + if (get.color(cards[i]) == "red") { + event.useSha = true; + break; + } + } + "step 3"; + if (event.useSha) { + event.target + .chooseToUse("是否使用一张杀?", { name: "sha" }) + .set("filterTarget", function (card, player, target) { + return target != _status.event.sourcex && _status.event.sourcex.inRange(target) && lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player) + .set("addCount", false); + } + }, + }, + dangxian: { + trigger: { player: "phaseBegin" }, + forced: true, + audio: 2, + audioname: ["guansuo"], + content: function () { + trigger.phaseList.splice(trigger.num, 0, "phaseUse|dangxian"); + }, + }, + longyin: { + audio: 2, + shaRelated: true, + init: player => { + game.addGlobalSkill("longyin_order"); + }, + onremove: player => { + if (!game.hasPlayer(current => current.hasSkill("longyin"), true)) game.removeGlobalSkill("longyin_order"); + }, + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countCards("he") > 0 && event.player.isPhaseUsing(); + }, + content: function () { + "step 0"; + var go = false; + if (get.attitude(player, trigger.player) > 0) { + if (get.color(trigger.card) == "red") { + go = true; + } else if (trigger.addCount === false || !trigger.player.isPhaseUsing()) go = false; + else if (!trigger.player.hasSkill("paoxiao") && !trigger.player.hasSkill("tanlin3") && !trigger.player.hasSkill("zhaxiang2") && !trigger.player.hasSkill("fengnu") && !trigger.player.getEquip("zhuge")) { + var nh = trigger.player.countCards("h"); + if (player == trigger.player) { + go = player.countCards("h", "sha") > 0; + } else if (nh >= 4) { + go = true; + } else if (player.countCards("h", "sha")) { + if (nh == 3) { + go = Math.random() < 0.8; + } else if (nh == 2) { + go = Math.random() < 0.5; + } + } else if (nh >= 3) { + if (nh == 3) { + go = Math.random() < 0.5; + } else if (nh == 2) { + go = Math.random() < 0.2; + } + } + } + } + //AI停顿 + if ( + go && + !event.isMine() && + !event.isOnline() && + player.hasCard(function (card) { + return get.value(card) < 6 && lib.filter.cardDiscardable(card, player, event.name); + }, "he") + ) { + game.delayx(); + } + var next = player.chooseToDiscard(get.prompt("longyin"), "弃置一张牌" + (get.color(trigger.card) == "red" ? "并摸一张牌" : "") + ",令" + get.translation(trigger.player) + "本次使用的【杀】不计入使用次数", "he"); + next.logSkill = ["longyin", trigger.player]; + next.set("ai", function (card) { + if (_status.event.go) { + return 6 - get.value(card); + } + return 0; + }); + next.set("go", go); + "step 1"; + if (result.bool) { + if (trigger.addCount !== false) { + trigger.addCount = false; + trigger.player.getStat().card.sha--; + } + if (get.color(trigger.card) == "red") { + player.draw(); + } + // player.logSkill('longyin',trigger.player); + } + }, + ai: { + expose: 0.2, + }, + subSkill: { + order: { + mod: { + aiOrder: (player, card, num) => { + if (num && card.name === "sha" && get.color(card) === "red") { + let gp = game.findPlayer(current => { + return current.hasSkill("longyin") && current.hasCard(i => true, "he"); + }); + if (gp) return num + 0.15 * Math.sign(get.attitude(player, gp)); + } + }, + }, + trigger: { player: "dieAfter" }, + filter: (event, player) => { + return !game.hasPlayer(current => current.hasSkill("longyin"), true); + }, + silent: true, + forceDie: true, + charlotte: true, + content: () => { + game.removeGlobalSkill("longyin_order"); + }, + }, + }, + }, + jigong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + check: function (event, player) { + var nh = player.countCards("h") - player.countCards("h", { type: "equip" }); + if (nh <= 1) return true; + if (player.countCards("h", "tao")) return false; + if (nh <= 2) return Math.random() < 0.7; + if (nh <= 3) return Math.random() < 0.4; + return false; + }, + content: function () { + player.draw(2); + player.addTempSkill("jigong2"); + }, + }, + jigong2: { + mod: { + maxHandcardBase: function (player, num) { + var damage = player.getStat().damage; + if (typeof damage == "number") return damage; + return 0; + }, + }, + }, + shifei: { + audio: 2, + audioname: ["re_guotufengji"], + enable: ["chooseToRespond", "chooseToUse"], + filter: function (event, player) { + if (!_status.currentPhase || event.shifei) return false; + if (!event.filterCard({ name: "shan", isCard: true }, player, event)) return false; + if (event.name != "chooseToUse" && !lib.filter.cardRespondable({ name: "shan", isCard: true }, player, event)) return false; + return true; + }, + delay: false, + checkx: function (player) { + if (get.attitude(player, _status.currentPhase) > 0) return true; + var nh = _status.currentPhase.countCards("h") + 1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].countCards("h") >= nh) { + if (!player.countCards("h", "shan") || get.attitude(player, players[i]) <= 0) return true; + } + } + return false; + }, + content: function () { + "step 0"; + player.line(_status.currentPhase, "green"); + _status.currentPhase.draw(); + "step 1"; + if (_status.currentPhase.isMaxHandcard(true)) { + event.finish(); + var evt = event.getParent(2); + evt.set("shifei", true); + evt.goto(0); + return; + } + var targets = game.filterPlayer(function (current) { + return current.isMaxHandcard(); + }); + if (targets.length == 1) { + event.onlytarget = targets[0]; + } else if (targets.length) { + player + .chooseTarget("选择一名角色弃置其一张牌", true, function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }) + .set("targets", targets); + } else { + event.finish(); + } + "step 2"; + var evt = event.getParent(2); + var target; + if (event.onlytarget) { + target = event.onlytarget; + } else if (result.targets && result.targets.length) { + target = result.targets[0]; + } + if (target) { + player.line(target, "green"); + player.discardPlayerCard(target, "he", true); + evt.result = { bool: true, card: { name: "shan", isCard: true }, cards: [] }; + evt.redo(); + } else { + evt.set("shifei", true); + evt.goto(0); + } + }, + ai: { + respondShan: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) { + var nh = player.countCards("h"); + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].countCards("h") > nh) return 0.4; + } + } + }, + }, + order: 8, + result: { + player: function (player) { + return lib.skill.shifei.checkx(player) ? 1 : 0; + }, + }, + }, + }, + huaiyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + delay: false, + filter: function (event, player) { + return player.countCards("h", { color: "red" }) && player.countCards("h", { color: "black" }); + }, + content: function () { + "step 0"; + player.showHandcards(); + "step 1"; + player.chooseControl("红色", "黑色").set("ai", function () { + var player = _status.event.player; + if (player.countCards("h", { color: "red" }) == 1 && player.countCards("h", { color: "black" }) > 1) return "红色"; + return "黑色"; + }); + "step 2"; + event.control = result.control; + var cards; + if (event.control == "红色") { + cards = player.getCards("h", { color: "red" }); + } else { + cards = player.getCards("h", { color: "black" }); + } + player.discard(cards); + event.num = cards.length; + "step 3"; + player + .chooseTarget("请选择至多" + get.cnNumber(event.num) + "名有牌的其他角色,获得这些角色的各一张牌。", [1, event.num], function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) + 0.5; + }); + "step 4"; + if (result.bool && result.targets) { + player.line(result.targets, "green"); + event.targets = result.targets; + event.targets.sort(lib.sort.seat); + event.gained = 0; + } else { + event.finish(); + } + "step 5"; + if (player.isIn() && event.targets.length) { + player.gainPlayerCard(event.targets.shift(), "he", true); + } else event.finish(); + "step 6"; + if (result.bool) { + event.gained += result.cards.length; + } + if (event.targets.length) event.goto(5); + "step 7"; + if (event.gained > 1) player.loseHp(); + }, + ai: { + order: function (item, player) { + if (player.countCards("h", { color: "red" }) == 1) return 10; + if (player.countCards("h", { color: "black" }) == 1) return 10; + return 1; + }, + result: { + player: 1, + }, + }, + }, + yaoming: { + audio: 2, + trigger: { player: "damageEnd", source: "damageSource" }, + direct: true, + filter: function (event, player) { + if (player.hasSkill("yaoming2")) return false; + var nh = player.countCards("h"); + return game.hasPlayer(function (current) { + return current.countCards("h") != nh; + }); + }, + content: function () { + "step 0"; + var nh = player.countCards("h"); + player + .chooseTarget(get.prompt2("yaoming"), function (card, player, target) { + return _status.event.nh != target.countCards("h"); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countCards("h") > _status.event.nh) return -att; + return att; + }) + .set("nh", nh); + "step 1"; + if (result.bool) { + player.logSkill("yaoming", result.targets); + player.addTempSkill("yaoming2"); + var target = result.targets[0]; + if (target.countCards("h") < player.countCards("h")) { + target.draw(); + } else { + target.discard(target.getCards("h").randomGet()); + } + } + }, + ai: { + expose: 0.2, + }, + }, + yaoming2: {}, + anguo: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("e") > 0; + }, + content: function () { + "step 0"; + player.choosePlayerCard(target, "e", true); + "step 1"; + if (result.links) { + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (target.inRange(players[i])) { + num++; + } + } + event.num = num; + target.gain(result.links, "gain2"); + } else { + event.finish(); + } + "step 2"; + var num2 = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (target.inRange(players[i])) { + num2++; + } + } + if (event.num > num2) { + player.draw(); + } + }, + ai: { + order: 7, + result: { + target: function (player, target) { + if (target.hasSkillTag("noe")) return 1; + if (target.getEquip(1) || target.getEquip(4)) return -1; + if (target.getEquip(2)) return -0.7; + return -0.5; + }, + }, + }, + }, + reyanzhu: { + enable: "phaseUse", + audio: 2, + usable: 1, + filterTarget: lib.filter.notMe, + derivation: ["reyanzhu_rewrite", "rexingxue_rewrite"], + prompt: function () { + return lib.translate[(_status.event.player.storage.reyanzhu ? "reyanzhu_rewrite" : "reyanzhu") + "_info"]; + }, + content: function () { + "step 0"; + if (player.storage.reyanzhu || !target.countCards("e")) event._result = { index: 1 }; + else + target + .chooseControl() + .set("prompt", get.translation(player) + "发动了【宴诛】,请选择一项") + .set("choiceList", ["将装备区内的所有牌交给" + get.translation(player) + "并令其修改技能", "弃置一张牌,并令下次受到的伤害+1直到下回合开始"]) + .set("ai", function () { + if (_status.event.player.countCards("e") >= 3) return 1; + return 0; + }); + "step 1"; + if (result.index == 0) { + target.give(target.getCards("e"), player); + player.storage.reyanzhu = true; + } else { + target.addTempSkill("reyanzhu2", { player: "phaseBegin" }); + target.addMark("reyanzhu2", 1, false); + if (!player.storage.reyanzhu && target.countCards("he") > 0) target.chooseToDiscard("he", true); + } + }, + ai: { + order: 6, + result: { + target: function (player, target) { + if (player.storage.reyanzhu) return -1; + var ne = target.countCards("e"); + if (!ne) return -2; + if (ne >= 2) return -ne; + return 0; + }, + }, + }, + }, + reyanzhu2: { + trigger: { player: "damageBegin3" }, + forced: true, + onremove: true, + content: function () { + trigger.num += player.countMark("reyanzhu2"); + game.log(player, "受到的伤害+" + player.countMark("reyanzhu2")); + player.removeSkill("reyanzhu2"); + }, + intro: { + content: "下次受到的伤害+#直到下回合开始", + }, + }, + rexingxue: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return (player.storage.reyanzhu ? player.maxHp : player.hp) > 0; + }, + content: function () { + "step 0"; + player.chooseTarget([1, player.storage.reyanzhu ? player.maxHp : player.hp], get.prompt("rexingxue"), "令所有目标角色依次摸一张牌,然后所有手牌数大于体力值的目标角色依次将一张牌置于牌堆顶").set("ai", function (target) { + var att = get.attitude(player, target); + if (target.countCards("h") == target.hp - 1) att *= 2; + return att; + }); + "step 1"; + if (result.bool) { + event.targets = result.targets.sortBySeat(); + player.logSkill("rexingxue", event.targets); + game.asyncDraw(result.targets); + } else event.finish(); + "step 2"; + game.delay(); + "step 3"; + if (event.targets.length) { + event.target = event.targets.shift(); + if (event.target.isDead()) event.redo(); + } else event.finish(); + "step 4"; + if (target.isIn() && target.countCards("h") && target.countCards("h") > target.hp) target.chooseCard("he", true, "将一张牌置于牌堆顶"); + else event.goto(3); + "step 5"; + if (result && result.cards) { + event.card = result.cards[0]; + target.lose(result.cards, ui.cardPile, "insert"); + game.log(target, "将", get.position(event.card) == "h" ? "一张牌" : event.card, "置于牌堆顶"); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, target); + } + event.goto(3); + }, + }, + rezhaofu: { + unique: true, + global: "rezhaofu2", + zhuSkill: true, + }, + rezhaofu2: { + mod: { + inRangeOf: function (from, to) { + if (from.group != "wu") return; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (from != players[i] && to != players[i] && players[i].hasZhuSkill("rezhaofu", from)) { + if (players[i].inRange(to)) return true; + } + } + }, + }, + }, + zhaofu: { + unique: true, + global: "zhaofu2", + zhuSkill: true, + locked: true, + }, + zhaofu2: { + mod: { + inRangeOf: function (from, to) { + if (from.group != "wu") return; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (from != players[i] && to != players[i] && players[i].hasZhuSkill("zhaofu", from)) { + if (get.distance(players[i], to) <= 1) return true; + } + } + }, + }, + }, + xingxue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + async content(event, trigger, player) { + var num = player.hp; + if (!player.hasSkill("yanzhu")) { + num = player.maxHp; + } + const { + result: { targets, bool }, + } = await player.chooseTarget([1, num], get.prompt2("xingxue")).set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countCards("he")) return att; + return att / 10; + }); + if (bool) { + player.logSkill("xingxue", targets); + const chooseToPutCard = async function (target) { + await target.draw(); + if (target.countCards("he")) { + const { + result: { cards, bool }, + } = await target.chooseCard("选择一张牌置于牌堆顶", "he", true); + if (bool) { + await target.lose(cards, ui.cardPile, "insert"); + } + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, target); + if (player == game.me) { + await game.asyncDelay(0.5); + } + } + }; + await game.doAsyncInOrder(targets, chooseToPutCard); + } + }, + }, + yanzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("he") > 0 && target != player; + }, + content: function () { + "step 0"; + if (target.countCards("e")) { + target.chooseBool("是否将装备区内的所有牌交给" + get.translation(player) + "?").set("ai", function () { + if (_status.event.player.countCards("e") >= 3) return false; + return true; + }); + } else { + target.chooseToDiscard(true, "he"); + event.finish(); + } + "step 1"; + if (result.bool) { + var es = target.getCards("e"); + target.give(es, player, "give"); + player.removeSkills("yanzhu"); + } else { + target.chooseToDiscard(true, "he"); + } + }, + ai: { + order: 6, + result: { + target: function (player, target) { + var ne = target.countCards("e"); + if (!ne) return -2; + if (ne >= 2) return -ne; + return 0; + }, + }, + }, + }, + shizhi: { + mod: { + cardname: function (card, player, name) { + if (card.name == "shan" && player.hp == 1) return "sha"; + }, + }, + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", "shan")) return false; + if (player.hp != 1) return false; + }, + respondSha: true, + halfneg: true, + }, + audio: 2, + audioname: ["xin_zhangyi"], + trigger: { player: ["useCard1", "respond"] }, + firstDo: true, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && !event.skill && event.cards.length == 1 && event.cards[0].name == "shan"; + }, + content: function () {}, + }, + wurong: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + return target.countCards("h") > 0 && target != player; + }, + content: function () { + "step 0"; + if (target.countCards("h") == 0 || player.countCards("h") == 0) { + event.finish(); + return; + } + "step 1"; + var sendback = function () { + if (_status.event != event) { + return function () { + event.resultOL = _status.event.resultOL; + }; + } + }; + if (player.isOnline()) { + player.wait(sendback); + event.ol = true; + player.send(function () { + game.me.chooseCard(true).set("glow_result", true).ai = function () { + return Math.random(); + }; + game.resume(); + }); + } else { + event.localPlayer = true; + player.chooseCard(true).set("glow_result", true).ai = function () { + return Math.random(); + }; + } + if (target.isOnline()) { + target.wait(sendback); + event.ol = true; + target.send(function () { + var rand = Math.random() < 0.4; + game.me.chooseCard(true).set("glow_result", true).ai = function (card) { + if (rand) return card.name == "shan" ? 1 : 0; + return card.name == "shan" ? 0 : 1; + }; + game.resume(); + }); + } else { + event.localTarget = true; + } + "step 2"; + if (event.localPlayer) { + event.card1 = result.cards[0]; + } + if (event.localTarget) { + var rand = Math.random() < 0.4; + target.chooseCard(true).set("glow_result", true).ai = function (card) { + if (rand) return card.name == "shan" ? 1 : 0; + return card.name == "shan" ? 0 : 1; + }; + } + "step 3"; + if (event.localTarget) { + event.card2 = result.cards[0]; + } + if (!event.resultOL && event.ol) { + game.pause(); + } + "step 4"; + try { + if (!event.card1) event.card1 = event.resultOL[player.playerid].cards[0]; + if (!event.card2) event.card2 = event.resultOL[target.playerid].cards[0]; + if (!event.card1 || !event.card2) { + throw "err"; + } + } catch (e) { + console.log(e); + event.finish(); + return; + } + game.broadcastAll( + function (card1, card2) { + card1.classList.remove("glow"); + card2.classList.remove("glow"); + }, + event.card1, + event.card2 + ); + "step 5"; + game.broadcastAll(function () { + ui.arena.classList.add("thrownhighlight"); + }); + game.addVideo("thrownhighlight1"); + player.$compare(event.card1, target, event.card2); + game.delay(4); + "step 6"; + var next = game.createEvent("showCards"); + next.player = player; + next.cards = [event.card1]; + next.setContent("emptyEvent"); + game.log(player, "展示了", event.card1); + "step 7"; + var next = game.createEvent("showCards"); + next.player = target; + next.cards = [event.card2]; + next.setContent("emptyEvent"); + game.log(target, "展示了", event.card2); + "step 8"; + var name1 = get.name(event.card1); + var name2 = get.name(event.card2); + if (name1 == "sha" && name2 != "shan") { + player.discard(event.card1).set("animate", false); + target.$gain2(event.card2); + var clone = event.card1.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; + clone.delete(); + game.addVideo("deletenode", player, get.cardsInfo([clone])); + } + game.broadcast(function (card) { + var clone = card.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; + clone.delete(); + } + }, event.card1); + target.damage("nocard"); + } else if (name1 != "sha" && name2 == "shan") { + player.discard(event.card1).set("animate", false); + target.$gain2(event.card2); + var clone = event.card1.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; + clone.delete(); + game.addVideo("deletenode", player, get.cardsInfo([clone])); + } + game.broadcast(function (card) { + var clone = card.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; + clone.delete(); + } + }, event.card1); + player.gainPlayerCard(target, true, "he"); + } else { + player.$gain2(event.card1); + target.$gain2(event.card2); + } + game.broadcastAll(function () { + ui.arena.classList.remove("thrownhighlight"); + }); + game.addVideo("thrownhighlight2"); + }, + ai: { + order: 6, + result: { + target: -1, + }, + }, + }, + zhanjue: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: -1, + position: "h", + filter: function (event, player) { + if (player.getStat().skill.zhanjue_draw && player.getStat().skill.zhanjue_draw >= 2) return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i = 0; i < hs.length; i++) { + var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; + } + return true; + }, + viewAs: { name: "juedou" }, + group: ["zhanjue4"], + ai: { + damage: true, + order: 1, + effect: { + player: function (card, player, target) { + if (_status.event.skill == "zhanjue") { + if ( + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) + ) + return; + if (player.countCards("h") >= 3 || target.countCards("h") >= 3) return "zeroplayertarget"; + if (player.countCards("h", "tao")) return "zeroplayertarget"; + if (target.countCards("h", "sha") > 1) return "zeroplayertarget"; + } + }, + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && player.countSkill("zhanjue_draw") < 2 && player.hasCard(card => get.name(card) != "tao", "h"); + }, + }, + }, + zhanjue2: { + audio: false, + trigger: { player: "phaseBefore" }, + silent: true, + content: function () { + player.storage.zhanjue = 0; + }, + }, + zhanjue3: { + audio: false, + trigger: { player: "damageAfter", source: "damageAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.parent.skill == "zhanjue"; + }, + content: function () { + trigger.player.addTempSkill("zhanjue5"); + }, + }, + zhanjue4: { + audio: false, + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.skill == "zhanjue"; + }, + content: function () { + "step 0"; + var stat = player.getStat().skill; + if (!stat.zhanjue_draw) stat.zhanjue_draw = 0; + stat.zhanjue_draw++; + player.draw("nodelay"); + var list = game.filterPlayer(function (current) { + if ( + current.getHistory("damage", function (evt) { + return evt.card == trigger.card; + }).length > 0 + ) { + if (current == player) { + stat.zhanjue_draw++; + } + return true; + } + return false; + }); + if (list.length) { + list.sortBySeat(); + game.asyncDraw(list); + } + "step 1"; + game.delay(); + }, + }, + zhanjue5: {}, + qinwang: { + audio: "qinwang1", + unique: true, + group: ["qinwang1"], + zhuSkill: true, + filter: function (event, player) { + if ( + !player.hasZhuSkill("qinwang") || + !game.hasPlayer(function (current) { + return current != player && current.group == "shu"; + }) || + !player.countCards("he") + ) + return false; + return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3")); + }, + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { + name: "sha", + cards: [], + suit: "none", + number: null, + isCard: true, + }, + filterCard: lib.filter.cardDiscardable, + position: "he", + check: function (card) { + var player = _status.event.player, + players = game.filterPlayer(); + if (player.hasSkill("qinwang_ai")) return false; + for (var i = 0; i < players.length; i++) { + var nh = players[i].countCards("h"); + if (players[i] != player && players[i].group == "shu" && get.attitude(players[i], player) > 2 && nh >= 3 && players[i].countCards("h", "sha")) { + return 5 - get.value(card); + } + } + return 0; + }, + ai: { + order: function () { + return get.order({ name: "sha" }) - 0.3; + }, + respondSha: true, + skillTagFilter: function (player) { + if ( + !player.hasZhuSkill("qinwang") || + !game.hasPlayer(function (current) { + return current != player && current.group == "shu"; + }) || + !player.countCards("he") + ) + return false; + }, + }, + }, + qinwang1: { + audio: 2, + trigger: { player: ["useCardBegin", "respondBegin"] }, + logTarget: "targets", + filter: function (event, player) { + return event.skill == "qinwang"; + }, + forced: true, + content: function () { + "step 0"; + delete trigger.skill; + delete trigger.card.cards; + player.discard(trigger.cards); + delete trigger.cards; + trigger.getParent().set("jijiang", true); + "step 1"; + if (event.current == undefined) event.current = player.next; + if (event.current == player) { + player.addTempSkill("jijiang3"); + player.addTempSkill("qinwang_ai"); + event.finish(); + trigger.cancel(); + trigger.getParent().goto(0); + } else if (event.current.group == "shu") { + var next = event.current.chooseToRespond("是否替" + get.translation(player) + "打出一张杀?", { name: "sha" }); + next.set("ai", function () { + var event = _status.event; + return get.attitude(event.player, event.source) - 2; + }); + next.set("source", player); + next.set("jijiang", true); + next.set("skillwarn", "替" + get.translation(player) + "打出一张杀"); + next.noOrdering = true; + next.autochoose = lib.filter.autoRespondSha; + } else { + event.current = event.current.next; + event.redo(); + } + "step 2"; + if (result.bool) { + event.current.draw(); + event.finish(); + trigger.card = result.card; + trigger.cards = result.cards; + trigger.throw = false; + if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) { + event.current.ai.shown += 0.3; + if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; + } + } else { + event.current = event.current.next; + event.goto(1); + } + }, + }, + qinwang_ai: {}, + zuoding: { + audio: 2, + audioname: ["re_zhongyao"], + trigger: { global: "useCardToPlayered" }, + filter: function (event, player) { + if (event.getParent().triggeredTargets3.length > 1) return false; + return ( + get.suit(event.card) == "spade" && + _status.currentPhase == event.player && + event.targets && + event.targets.length && + event.player != player && + game.countPlayer2(function (current) { + return current.getHistory("damage").length > 0; + }) == 0 + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("zuoding"), "令一名目标角色摸一张牌", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("targets", trigger.targets); + "step 1"; + if (result.bool) { + player.logSkill("zuoding", result.targets); + result.targets[0].draw(); + } + }, + ai: { + expose: 0.2, + }, + //group:'zuoding3' + }, + zuoding2: {}, + zuoding3: { + trigger: { global: "damage" }, + silent: true, + content: function () { + player.addTempSkill("zuoding2"); + }, + }, + huomo: { + audio: 2, + audioname: ["huzhao", "re_zhongyao"], + enable: "chooseToUse", + onChooseToUse: function (event) { + if (game.online || event.huomo_list) return; + var list = lib.skill.huomo.getUsed(event.player); + event.set("huomo_list", list); + }, + getUsed: function (player) { + var list = []; + player.getHistory("useCard", function (evt) { + if (get.type(evt.card, null, false) == "basic") list.add(evt.card.name); + }); + return list; + }, + hiddenCard: function (player, name) { + if (get.type(name) != "basic") return false; + var list = lib.skill.huomo.getUsed(player); + if (list.includes(name)) return false; + return player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "eh"); + }, + filter: function (event, player) { + if ( + event.type == "wuxie" || + !player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "eh") + ) + return false; + var list = event.huomo_list || lib.skill.huomo.getUsed(player); + for (var name of lib.inpile) { + if (get.type(name) != "basic" || list.includes(name)) continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var vcards = []; + var list = event.huomo_list || lib.skill.huomo.getUsed(player); + for (var name of lib.inpile) { + if (get.type(name) != "basic" || list.includes(name)) continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name, nature]); + } + } + } + return ui.create.dialog("活墨", [vcards, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + game.hasPlayer(function (current) { + return player.canUse(card, current) && get.effect(current, card, player, player) > 0; + }) + ) { + switch (button.link[2]) { + case "tao": + return 5; + case "jiu": + return 3.01; + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder") return 2.92; + else return 2.9; + case "shan": + return 1; + } + } + return 0; + }, + backup: function (links, player) { + return { + check: function (card) { + return 1 / Math.max(0.1, get.value(card)); + }, + filterCard: function (card) { + return get.type(card) != "basic" && get.color(card) == "black"; + }, + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, + }, + position: "he", + popname: true, + ignoreMod: true, + precontent: function () { + player.logSkill("huomo"); + var card = event.result.cards[0]; + game.log(player, "将", card, "置于牌堆顶"); + event.result.card = { + name: event.result.card.name, + nature: event.result.card.nature, + }; + event.result.cards = []; + player.loseToDiscardpile(card, ui.cardPile, "visible", "insert").log = false; + }, + }; + }, + prompt: function (links, player) { + return "将一张黑色非基本牌置于牌堆顶并视为使用一张" + get.translation(links[0][3] || "") + get.translation(links[0][2]); + }, + }, + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + var list = lib.skill.huomo.getUsed(player); + if (!list.includes("jiu") && event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0) { + return 3.1; + } + return 2.9; + }, + respondSha: true, + fireAttack: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "fireAttack") return true; + if ( + player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "he") + ) { + var list = lib.skill.huomo.getUsed(player); + if (tag == "respondSha") { + if (arg != "use") return false; + if (list.includes("sha")) return false; + } else if (tag == "respondShan") { + if (list.includes("shan")) return false; + } + } else { + return false; + } + }, + result: { + player: 1, + }, + }, + }, + // taoxi:{ + // audio:2, + // trigger:{player:'useCardToPlayered'}, + // filter:function(event,player){ + // return _status.currentPhase==player&&event.targets.length==1&& + // event.target.countCards('h')>0&&!player.hasSkill('taoxi4')&&player!=event.target; + // }, + // check:function(event,player){ + // return get.attitude(player,event.target)<0; + // }, + // intro:{ + // content:'card' + // }, + // content:function(){ + // var card=trigger.target.getCards('h').randomGet(); + // player.showCards([card]); + // player.storage.taoxi=card; + // player.storage.taoxi2=trigger.target; + // player.syncStorage('taoxi'); + // player.markSkill('taoxi'); + // player.addTempSkill('taoxi4'); + // }, + // group:['taoxi2','taoxi3'] + // }, + // taoxi2:{ + // audio:false, + // enable:'phaseUse', + // filter:function(event,player){ + // if(player.storage.taoxi&&player.storage.taoxi2&& + // get.owner(player.storage.taoxi)==player.storage.taoxi2&& + // lib.filter.filterCard(player.storage.taoxi,player,event)){ + // return true; + // } + // return false; + // }, + // filterTarget:function(card,player,target){ + // return player.canUse(player.storage.taoxi,target); + // }, + // selectTarget:function(){ + // var info=get.info(_status.event.player.storage.taoxi); + // if(info.notarget) return -1; + // return get.select(info.selectTarget); + // }, + // multitarget:true, + // multiline:true, + // content:function(){ + // 'step 0' + // var card=player.storage.taoxi; + // if(!card){ + // event.finish(); + // return; + // } + // var owner=get.owner(card); + // if(owner){ + // owner.lose(card,ui.special); + // } + // event.card=card; + // player.$throw(card); + // 'step 1' + // player.useCard(event.card,targets).animate=false; + // delete player.storage.taoxi; + // delete player.storage.taoxi2; + // player.unmarkSkill('taoxi'); + // }, + // ai:{ + // order:8, + // result:{ + // target:function(player,target){ + // return get.effect(target,player.storage.taoxi,player,target); + // }, + // player:1 + // } + // } + // }, + // taoxi3:{ + // trigger:{player:'phaseJieshuBegin'}, + // forced:true, + // popup:false, + // filter:function(event,player){ + // return player.storage.taoxi?true:false; + // }, + // content:function(){ + // if(get.owner(player.storage.taoxi)==player.storage.taoxi2){ + // player.loseHp(); + // } + // delete player.storage.taoxi; + // delete player.storage.taoxi2; + // player.unmarkSkill('taoxi'); + // } + // }, + // taoxi4:{}, + taoxi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + check: function (event, player) { + if (get.attitude(player, event.target) >= 0) return false; + var cards = event.target.getCards("h"); + if (cards.filter(card => player.hasUseTarget(card)).length >= cards.length / 2) return true; + return false; + }, + filter: function (event, player) { + return player.isPhaseUsing() && event.targets.length == 1 && event.target.countCards("h") > 0 && player != event.target && !player.hasSkill("taoxi_used"); + }, + logTarget: "target", + content: function () { + "step 0"; + player.choosePlayerCard(trigger.target, "h", true); + "step 1"; + if (result.bool) { + var card = result.links[0]; + player.showCards(card, get.translation(player) + "对" + get.translation(trigger.target) + "发动了【讨袭】"); + if (!player.storage.taoxi_list) player.storage.taoxi_list = [[], []]; + if (!player.storage.taoxi_list[1].some(i => i._cardid == card.cardid)) { + var cardx = ui.create.card(); + cardx.init(get.cardInfo(card)); + cardx._cardid = card.cardid; + player.directgains([cardx], null, "taoxi"); + player.storage.taoxi_list[0].push(trigger.target); + player.storage.taoxi_list[1].push(cardx); + player.markSkill("taoxi_list"); + player.addTempSkill("taoxi_list"); + player.addTempSkill("taoxi_use"); + player.addTempSkill("taoxi_used", "phaseUseAfter"); + } + } + }, + subSkill: { + used: {}, + use: { + trigger: { player: "useCardBefore" }, + charlotte: true, + forced: true, + popup: false, + firstDo: true, + group: "taoxi_lose", + filter: function (event, player) { + if (!player.storage.taoxi_list || !player.storage.taoxi_list.length) return false; + var list = player.storage.taoxi_list[1]; + return ( + event.cards && + event.cards.some(card => { + return list.includes(card); + }) + ); + }, + content: function () { + var cards = [], + list = player.storage.taoxi_list; + for (var card of trigger.cards) { + var bool = false; + for (var i = 0; i < list[0].length; i++) { + if (list[1][i] == card) { + var cardid = card._cardid; + var cardx = list[0][i].getCards("h", cardxx => cardxx.cardid == cardid)[0]; + if (cardx && get.position(cardx) == "h") { + cards.push(cardx); + list[0][i].$throw(cardx); + bool = true; + break; + } + } + } + if (!bool) cards.push(card); + } + trigger.cards = cards; + trigger.card.cards = cards; + trigger.throw = false; + }, + mod: { + aiOrder: function (player, card, num) { + var list = player.storage.taoxi_list; + if (!list || !list[1]) return; + if (list[1].includes(card)) return num + 0.5; + }, + cardEnabled2: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("taoxi") && _status.event.name == "chooseToRespond") return false; + }, + }, + ai: { + effect: { + player_use: function (card, player, target) { + var list = player.storage.taoxi_list; + if (!list || !list[1]) return; + if (list[1].includes(card)) return [1, 1]; + }, + }, + }, + }, + lose: { + trigger: { + global: ["loseEnd", "equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd"], + }, + charlotte: true, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + var list = player.storage.taoxi_list; + if (!list || !list[0].length) return false; + return game.hasPlayer(function (current) { + if (!list[0].includes(current)) return; + var evt = event.getl(current); + if ( + evt && + evt.hs && + evt.hs.some(card => { + return list[1].some(i => i._cardid == card.cardid); + }) + ) + return true; + return false; + }); + }, + content: function () { + var list = player.storage.taoxi_list; + var targets = game.filterPlayer(function (current) { + if (!list[0].includes(current)) return; + var evt = trigger.getl(current); + if ( + evt && + evt.hs && + evt.hs.some(card => { + return list[1].some(i => i._cardid == card.cardid); + }) + ) + return true; + return false; + }); + for (var target of targets) { + var hs = trigger.getl(target).hs; + for (var i = 0; i < list[0].length; i++) { + if (hs.some(j => j.cardid == list[1][i]._cardid)) { + if (player.isOnline2()) { + player.send( + function (list, i) { + game.me.storage.taoxi_list = list; + list[1][i].delete(); + list[0].splice(i, 1); + list[1].splice(i, 1); + }, + player.storage.taoxi_list, + i + ); + } + list[1][i].delete(); + list[0].splice(i, 1); + list[1].splice(i, 1); + i--; + } + } + } + }, + }, + list: { + trigger: { player: "phaseEnd" }, + charlotte: true, + forced: true, + onremove: function (player) { + game.broadcastAll(function (player) { + player.storage.taoxi_list[1].forEach(i => i.delete()); + delete player.storage.taoxi_list; + }, player); + }, + filter: function (event, player) { + return player.storage.taoxi_list && player.storage.taoxi_list[0].length > 0; + }, + content: function () { + player.loseHp(); + }, + }, + }, + }, + xingshuai: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + trigger: { player: "dying" }, + //priority:6, + zhuSkill: true, + filter: function (event, player) { + if (player.hp > 0) return false; + if (!player.hasZhuSkill("xingshuai")) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wei"; + }); + }, + mark: true, + unique: true, + limited: true, + content: function () { + "step 0"; + player.awakenSkill("xingshuai"); + var targets = game.filterPlayer(); + targets.remove(player); + event.targets = targets; + event.damages = []; + "step 1"; + if (event.targets.length) { + var current = event.targets.shift(); + if (current.group == "wei") { + current + .chooseBool("是否令" + get.translation(player) + "回复1点体力?") + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.target) > 2; + }) + .set("target", player); + event.current = current; + } else { + event.redo(); + } + } else { + event.goto(3); + } + "step 2"; + if (result.bool) { + event.damages.push(event.current); + event.current.line(player, "green"); + game.log(event.current, "令", player, "回复1点体力"); + player.recover(); + } + if (event.targets.length) { + event.goto(1); + } + "step 3"; + if (event.damages.length) { + var next = game.createEvent("xingshuaI_next"); + event.next.remove(next); + trigger.after.push(next); + next.targets = event.damages; + next.setContent(function () { + targets.shift().damage(); + if (targets.length) event.redo(); + }); + } + }, + }, + mingjian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target; + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + selectCard: -1, + discard: false, + lose: false, + delay: false, + content: function () { + player.give(cards, target); + target.addTempSkill("mingjian2", { player: "phaseAfter" }); + target.storage.mingjian2++; + target.updateMarks("mingjian2"); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (player.countCards("h") == player.countCards("h", "du")) return -1; + if (target.hasJudge("lebu")) return 0; + if (get.attitude(player, target) > 3) { + var basis = get.threaten(target); + if ( + player == get.zhu(player) && + player.hp <= 2 && + player.countCards("h", "shan") && + !game.hasPlayer(function (current) { + return get.attitude(current, player) > 3 && current.countCards("h", "tao") > 0; + }) + ) + return 0; + if (target.countCards("h") + player.countCards("h") > target.hp + 2) return basis * 0.8; + return basis; + } + return 0; + }, + }, + }, + }, + mingjian2: { + charlotte: true, + mark: true, + intro: { + content: "手牌上限+#,出杀次数+#", + }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = 0; + }, + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + player.storage.mingjian2; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.storage.mingjian2; + }, + }, + }, + mingjian_old: { + audio: 2, + trigger: { player: "phaseUseBefore" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + var go = Math.random() < 0.5; + player.chooseTarget(get.prompt("mingjian_old"), function (card, player, target) { + return player != target; + }).ai = function (target) { + var att = get.attitude(player, target); + if (att > 3) { + if (player.countCards("h") > player.hp) return att; + if (go) return att; + } + return 0; + }; + "step 1"; + if (result.bool) { + player.logSkill("mingjian_old", result.targets); + trigger.cancel(); + var target = result.targets[0]; + target.addSkill("mingjian2_old"); + var hs = player.getCards("h"); + player.give(hs, target); + } + }, + }, + mingjian2_old: { + audio: false, + trigger: { global: "phaseAfter" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + if (lib.config.glow_phase) { + if (_status.currentPhase) { + _status.currentPhase.classList.remove("glow_phase"); + } + player.classList.add("glow_phase"); + } + game.addVideo("phaseChange", player); + _status.currentPhase = player; + player.ai.tempIgnore = []; + player.stat.push({ card: {}, skill: {} }); + player.phaseUse(); + player.removeSkill("mingjian2_old"); + }, + }, + huituo: { + audio: 2, + audioname: ["re_caorui"], + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + var forced = event.forced === undefined ? false : event.forced; + var info = get.skillInfoTranslation("huituo", player); + var str = `###${forced ? "恢拓:请选择一名角色" : get.prompt("huituo")}###令一名角色判定。若结果为红色,其回复1点体力;若结果为黑色,其摸${get.cnNumber(trigger.num)}张牌`; + player.chooseTarget(str, event.forced).set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) { + return get.recoverEffect(target, player, player) + 1; + } + return 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("huituo", result.targets); + var target = result.targets[0]; + event.target = target; + target.judge(function (card) { + if (target.hp == target.maxHp) { + if (get.color(card) == "red") return -1; + } + if (get.color(card) == "red") return 1; + return 0; + }); + } else { + event.finish(); + } + "step 2"; + if (result.color) { + if (result.color == "red") { + if (event.target.hp < event.target.maxHp) event.target.recover(); + } else { + event.target.draw(trigger.num); + } + } + }, + ai: { + maixie: true, + maixie_hp: true, + }, + }, + duodao: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return player.countCards("he") > 0 && event.source && event.card && event.card.name == "sha"; + }, + direct: true, + //priority:5, + audio: 2, + content: function () { + "step 0"; + var prompt = "弃置一张牌"; + if (trigger.source.getEquips(1).length) prompt += ",然后获得" + get.translation(trigger.source) + "装备区中的" + get.translation(trigger.source.getEquips(1)); + var next = player.chooseToDiscard("he", get.prompt("duodao", trigger.source), prompt); + next.logSkill = ["duodao", trigger.source]; + next.set("ai", function (card) { + if (!_status.event.getTrigger().source.getEquip(1)) return 0; + if (get.attitude(_status.event.player, _status.event.getTrigger().source) <= 0) { + return 6 - get.value(card); + } + return 0; + }); + "step 1"; + if (result.bool && trigger.source.getEquips(1).length) { + player.gain(trigger.source.getEquips(1), trigger.source, "give", "bySelf"); + } + }, + ai: { + maixie_defend: true, + }, + }, + reanjian: { + trigger: { player: "useCardToPlayered" }, + forced: true, + audio: 2, + filter: function (event, player) { + return event.card.name == "sha" && !event.target.inRange(player); + }, + logTarget: "target", + content: function () { + trigger.getParent().reanjian_buffed = true; + var map = trigger.customArgs; + var id = trigger.target.playerid; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; + map[id].extraDamage++; + trigger.target.addTempSkill("reanjian2"); + trigger.target.addTempSkill("reanjian4"); + trigger.target.storage.reanjian2.add(trigger.card); + }, + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.name == "sha" && arg.target && !arg.target.inRange(player)) return true; + return false; + }, + }, + }, + reanjian2: { + firstDo: true, + ai: { unequip2: true }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + onremove: true, + trigger: { + player: ["damage", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded"], + }, + charlotte: true, + filter: function (event, player) { + return player.storage.reanjian2 && event.card && player.storage.reanjian2.includes(event.card); + }, + silent: true, + forced: true, + popup: false, + priority: 12, + content: function () { + player.storage.reanjian2.remove(trigger.card); + if (!player.storage.reanjian2.length) player.removeSkill("reanjian2"); + }, + }, + reanjian3: { + mod: { + cardSavable: function (card) { + if (card.name == "tao") return false; + }, + }, + }, + reanjian4: { + trigger: { player: "dyingBegin" }, + forced: true, + silent: true, + firstDo: true, + filter: function (event, player) { + return (event.getParent(2).reanjian_buffed = true); + }, + content: function () { + player.addTempSkill("reanjian3", { global: ["dyingEnd", "phaseEnd"] }); + }, + }, + reduodao: { + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return event.card.name == "sha" && (get.color(event.card) == "red" ? event.player.getEquips(1).length > 0 : player.countCards("he") > 0); + }, + direct: true, + audio: 2, + content: function () { + "step 0"; + var prompt = "弃置一张牌"; + if (trigger.player.getEquips(1).length) prompt += ",然后获得" + get.translation(trigger.player) + "装备区中的" + get.translation(trigger.player.getEquips(1)); + var next = player.chooseToDiscard("he", get.prompt("reduodao", trigger.player), prompt); + next.logSkill = ["reduodao", trigger.player]; + next.set("ai", function (card) { + if (!_status.event.getTrigger().player.getEquips(1).length) return 0; + if (get.attitude(_status.event.player, _status.event.getTrigger().player) * get.value(_status.event.getTrigger().player.getEquips(1)) <= 0) { + return 6 - get.value(card); + } + return 0; + }); + "step 1"; + if (result.bool && trigger.player.getEquips(1).length) { + if (!result.cards || !result.cards.length) player.logSkill("reduodao", trigger.player); + player.gain(trigger.player.getEquips(1), trigger.player, "give", "bySelf"); + } + }, + }, + anjian: { + audio: 2, + trigger: { source: "damageBegin1" }, + check: function (event, player) { + return get.attitude(player, event.player) <= 0; + }, + forced: true, + filter: function (event, player) { + return event.getParent().name == "sha" && !event.player.inRange(player); + }, + content: function () { + trigger.num++; + }, + }, + xinpojun: { + shaRelated: true, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && player.isPhaseUsing() && event.target.hp > 0 && event.target.countCards("he") > 0; + }, + audio: 2, + content: function () { + "step 0"; + player.choosePlayerCard(trigger.target, "he", [1, Math.min(trigger.target.countCards("he"), trigger.target.hp)], get.prompt("xinpojun", trigger.target)).set("forceAuto", true); + "step 1"; + if (result.bool && result.links.length) { + var target = trigger.target; + player.logSkill("xinpojun", target); + target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("xinpojun2"); + target.addSkill("xinpojun2"); + } + }, + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false; + if (tag == "directHit_ai") return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; + return false; + }, + }, + }, + xinpojun2: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("xinpojun2").length > 0; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("xinpojun2"); + player.gain(cards, "draw"); + game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌"); + "step 1"; + player.removeSkill("xinpojun2"); + }, + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("xinpojun2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + }, + }, + qiaoshi: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player != player && event.player.countCards("h") == player.countCards("h") && event.player.isIn(); + }, + check: function (event, player) { + return get.attitude(player, event.player) >= 0; + }, + logTarget: "player", + content: function () { + game.asyncDraw([trigger.player, player]); + }, + }, + yanyu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.hasCard(card => lib.skill.yanyu.filterCard(card, player), "h"); + }, + filterCard: (card, player) => get.name(card) == "sha" && player.canRecast(card), + discard: false, + lose: false, + delay: false, + content: function () { + player.recast(cards); + }, + ai: { + basic: { + order: 1, + }, + result: { + player: 1, + }, + }, + group: "yanyu2", + }, + yanyu2: { + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return ( + player.getHistory("useSkill", function (evt) { + return evt.event.getParent("phaseUse") == event && evt.skill == "yanyu"; + }).length >= 2 + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("yanyu"), "令一名男性角色摸两张牌", function (card, player, target) { + return target.hasSex("male") && target != player; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + player.logSkill("yanyu", result.targets); + result.targets[0].draw(2); + } + }, + }, + youdi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("youdi"), function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + if (target.countCards("he") == 0) return 0; + return -get.attitude(_status.event.player, target); + }) + .set("goon", player.countCards("h", "sha") <= player.countCards("h") / 3); + "step 1"; + if (result.bool) { + game.delay(); + player.logSkill("youdi", result.targets); + event.target = result.targets[0]; + event.target.discardPlayerCard(player, "he", true); + } else { + event.finish(); + } + "step 2"; + if (result.links[0].name != "sha" && event.target.countGainableCards(player, "he")) { + player.gainPlayerCard("he", event.target, true); + } + }, + ai: { + expose: 0.2, + }, + }, + fuhun: { + enable: ["chooseToUse", "chooseToRespond"], + filterCard: true, + selectCard: 2, + position: "hs", + audio: 2, + audioname: ["re_guanzhang"], + derivation: ["new_rewusheng", "olpaoxiao"], + viewAs: { name: "sha" }, + prompt: "将两张手牌当杀使用或打出", + viewAsFilter: function (player) { + return player.countCards("hs") > 1; + }, + check: function (card) { + if (_status.event.player.hasSkill("new_rewusheng") && get.color(card) == "red") return 0; + if (_status.event.name == "chooseToRespond") { + if (card.name == "sha") return 0; + return 6 - get.useful(card); + } + if (_status.event.player.countCards("hs") < 4) return 6 - get.useful(card); + return 7 - get.useful(card); + }, + ai: { + respondSha: true, + skillTagFilter: function (player) { + if (player.countCards("hs") < 2) return false; + }, + order: function (item, player) { + if (player.hasSkill("new_rewusheng") && player.hasSkill("olpaoxiao")) { + return 1; + } + if (player.countCards("hs") < 4) { + return 1; + } + return 4; + }, + }, + group: "fuhun2", + }, + fuhun2: { + audio: "fuhun", + audioname: ["re_guanzhang"], + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + if (["new_rewusheng", "olpaoxiao"].every(skill => player.hasSkill(skill, null, false, false))) return false; + return event.getParent().skill == "fuhun"; + }, + content: function () { + player.addTempSkills(["new_rewusheng", "olpaoxiao"]); + // player.addTempSkill('fuhun3'); + }, + }, + fuhun3: {}, + fencheng: { + skillAnimation: "epic", + animationColor: "gray", + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return !player.storage.fencheng; + }, + filterTarget: function (card, player, target) { + return player != target; + }, + unique: true, + limited: true, + selectTarget: -1, + mark: true, + line: "fire", + content: function () { + "step 0"; + player.storage.fencheng = true; + player.awakenSkill("fencheng"); + var res = get.damageEffect(target, player, target, "fire"); + var num = Math.max(1, target.countCards("e")); + target + .chooseToDiscard(num, "he", "弃置" + get.cnNumber(num) + "张牌或受到1点火焰伤害") + .set("ai", function (card) { + var res = _status.event.res; + var num = _status.event.num; + var player = _status.event.player; + if (res >= 0) return -1; + if (num > 2 && player.hp > 1) return -1; + if (num > 1 && player.hp > 2) return -1; + if (get.position(card) == "e") { + return 10 - get.value(card); + } + return 6 - get.value(card); + }) + .set("res", res) + .set("num", num); + "step 1"; + if (!result.bool) { + target.damage("fire"); + } + }, + ai: { + order: 1, + result: { + player: function (player) { + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (player != players[i] && get.damageEffect(players[i], player, players[i], "fire") < 0) { + var att = get.attitude(player, players[i]); + if (att > 0) { + num -= Math.max(1, players[i].countCards("e")); + } else if (att < 0) { + num += Math.max(1, players[i].countCards("e")); + } + } + } + if (players.length < 5) { + return num - 1; + } else { + return num - 2; + } + }, + }, + }, + init: function (player) { + player.storage.fencheng = false; + }, + intro: { + content: "limited", + }, + }, + mieji: { + trigger: { player: "useCard2" }, + direct: true, + audio: 2, + filter: function (event, player) { + if (get.type(event.card) != "trick" || get.color(event.card) != "black") return false; + if (!event.targets || event.targets.length != 1) return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); + }) + ) { + return true; + } + } + return false; + }, + position: "he", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("mieji"), "为" + get.translation(trigger.card) + "增加一个额外目标", function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); + }) + .set("autodelay", true) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + player.logSkill("mieji", result.targets); + trigger.targets.push(result.targets[0]); + } + }, + }, + junxing: { + enable: "phaseUse", + audio: 2, + usable: 1, + filterCard: true, + selectCard: [1, Infinity], + filter: function (event, player) { + return player.countCards("h") > 0; + }, + check: function (card) { + if (ui.selected.cards.length) return -1; + var val = get.value(card); + if (get.type(card) == "basic") return 8 - get.value(card); + return 5 - get.value(card); + }, + filterTarget: function (card, player, target) { + return player != target; + }, + content: function () { + "step 0"; + var types = []; + for (var i = 0; i < cards.length; i++) { + types.add(get.type(cards[i], "trick", player)); + } + target + .chooseToDiscard(function (card) { + return !_status.event.types.includes(get.type(card, "trick")); + }) + .set("ai", function (card) { + if (_status.event.player.isTurnedOver()) return -1; + return 8 - get.value(card); + }) + .set("types", types) + .set("dialog", ["弃置一张与" + get.translation(player) + "弃置的牌类别均不同的牌,或将武将牌翻面", "hidden", cards]); + "step 1"; + if (!result.bool) { + target.turnOver(); + target.draw(cards.length); + } + }, + ai: { + order: 2, + expose: 0.3, + threaten: 1.8, + result: { + target: function (player, target) { + if (target.hasSkillTag("noturn")) return 0; + if (target.isTurnedOver()) return 2; + return -1 / (target.countCards("h") + 1); + }, + }, + }, + }, + juece: { + audio: 2, + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + return game.hasPlayer(current => { + if (current == player || current.countCards("h")) return false; + var evt = event.getl(current); + return evt && evt.hs && evt.hs.length; + }); + }, + check: function (event, player) { + return get.damageEffect(event.player, player, player) > 0; + }, + content: function () { + "step 0"; + var targets = game.filterPlayer(current => { + if (current == player || current.countCards("h")) return false; + var evt = trigger.getl(current); + return evt && evt.hs && evt.hs.length; + }); + event.targets = targets; + "step 1"; + var target = event.targets.shift(); + event.target = target; + player.chooseBool(get.prompt2("juece", target)).set("ai", () => { + return get.damageEffect(_status.event.getParent().target, _status.event.player, _status.event.player) >= 0; + }); + "step 2"; + if (result.bool) { + player.logSkill("juece", target); + target.damage(); + } + "step 3"; + if (targets.length) event.goto(1); + }, + ai: { + threaten: 1.1, + }, + }, + jiefan: { + skillAnimation: true, + animationColor: "wood", + audio: 2, + audioname: ["re_handang"], + unique: true, + limited: true, + mark: true, + init: function (player) { + player.storage.jiefan = false; + }, + enable: "phaseUse", + filter: function (event, player) { + return !player.storage.jiefan; + }, + intro: { + content: "limited", + }, + filterTarget: true, + content: function () { + "step 0"; + player.awakenSkill("jiefan"); + player.storage.jiefan = true; + event.players = game.filterPlayer(function (current) { + return current != target && current.inRange(target); + }); + event.players.sortBySeat(target); + "step 1"; + if (event.players.length) { + event.current = event.players.shift(); + event.current.addTempClass("target"); + player.line(event.current, "green"); + if (event.current.countCards("he") && target.isIn()) { + event.current + .chooseToDiscard({ subtype: "equip1" }, "he", "弃置一张武器牌或让" + get.translation(target) + "摸一张牌") + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.target) < 0) return 7 - get.value(card); + return -1; + }) + .set("target", target); + event.tempbool = false; + } else { + event.tempbool = true; + } + } else { + event.finish(); + } + "step 2"; + if (event.tempbool || result.bool == false) { + target.draw(); + } + event.goto(1); + }, + ai: { + order: 5, + result: { + target: function (player, target) { + if (player.hp > 2) { + if (game.phaseNumber < game.players.length * 2) return 0; + } + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != target && players[i].inRange(target)) { + num++; + } + } + return num; + }, + }, + }, + }, + fuli: { + skillAnimation: true, + animationColor: "soil", + audio: 2, + unique: true, + limited: true, + enable: "chooseToUse", + init: function (player) { + player.storage.fuli = false; + }, + mark: true, + filter: function (event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; + if (player.storage.fuli) return false; + return true; + }, + content: function () { + "step 0"; + player.awakenSkill("fuli"); + player.recover(game.countGroup() - player.hp); + "step 1"; + player.turnOver(); + player.storage.fuli = true; + }, + ai: { + save: true, + skillTagFilter: function (player, arg, target) { + return player == target && player.storage.fuli != true; + }, + result: { + player: 10, + }, + threaten: function (player, target) { + if (!target.storage.fuli) return 0.9; + }, + }, + intro: { + content: "limited", + }, + }, + qianxi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + preHidden: true, + content: function () { + "step 0"; + player.draw(); + player.chooseToDiscard("he", true); + "step 1"; + if (!result.bool) { + event.finish(); + return; + } + event.color = get.color(result.cards[0], result.cards[0].original == "h" ? player : false); + player + .chooseTarget(function (card, player, target) { + return player != target && get.distance(player, target) <= 1; + }, true) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 2"; + if (result.bool && result.targets.length) { + result.targets[0].storage.qianxi2 = event.color; + result.targets[0].addTempSkill("qianxi2"); + player.line(result.targets, "green"); + game.addVideo("storage", result.targets[0], ["qianxi2", event.color]); + } + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag !== "directHit_ai" || !arg.target.hasSkill("qianxi2")) return false; + if (arg.card.name == "sha") + return ( + arg.target.storage.qianxi2 == "red" && + (!arg.target.hasSkillTag( + "freeShan", + false, + { + player: player, + card: arg.card, + }, + true + ) || + player.hasSkillTag("unequip", false, { + name: arg.card ? arg.card.name : null, + target: arg.target, + card: arg.card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: arg.card ? arg.card.name : null, + target: arg.target, + card: arg.card, + })) + ); + return arg.target.storage.qianxi2 == "black"; + }, + }, + }, + qianxi2: { + //trigger:{global:'phaseAfter'}, + forced: true, + mark: true, + audio: false, + content: function () { + player.removeSkill("qianxi2"); + delete player.storage.qianxi2; + }, + mod: { + cardEnabled2: function (card, player) { + if (get.color(card) == player.storage.qianxi2 && get.position(card) == "h") return false; + }, + }, + intro: { + content: function (color) { + return "不能使用或打出" + get.translation(color) + "的手牌"; + }, + }, + }, + zhiman: { + audio: 2, + audioname: ["guansuo"], + trigger: { source: "damageBegin2" }, + check: function (event, player) { + if (get.damageEffect(event.player, player, player) < 0) return true; + var att = get.attitude(player, event.player); + if (att > 0 && event.player.countCards("j")) return true; + if (event.num > 1) { + if (att < 0) return false; + if (att > 0) return true; + } + var cards = event.player.getGainableCards(player, "e"); + for (var i = 0; i < cards.length; i++) { + if (get.equipValue(cards[i]) >= 6) return true; + } + return false; + }, + filter: function (event, player) { + return player != event.player; + }, + logTarget: "player", + content: function () { + if (trigger.player.countGainableCards(player, "ej")) { + player.gainPlayerCard(trigger.player, "ej", true); + } + trigger.cancel(); + }, + }, + sanyao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.isMaxHp(); + }, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + check: function (card) { + return 7 - get.value(card); + }, + position: "he", + filterCard: true, + content: function () { + target.damage("nocard"); + }, + ai: { + result: { + target: function (player, target) { + if (target.countCards("j") && get.attitude(player, target) > 0) { + return 1; + } + if (target.countCards("e")) { + return -1; + } + return get.damageEffect(target, player); + }, + }, + order: 7, + }, + }, + olsanyao: { + enable: "phaseUse", + audio: "sanyao", + filter: function (event, player) { + return player.countCards("he") > 0 && (!player.hasSkill("olsanyao0") || !player.hasSkill("olsanyao1")); + }, + chooseButton: { + dialog: function (event, player) { + var list = ["选择手牌数最多的一名角色", "选择体力值最大的一名角色"]; + var choiceList = ui.create.dialog("散谣:请选择一项", "forcebutton", "hidden"); + choiceList.add([ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ]); + return choiceList; + }, + filter: function (button, player) { + return !player.hasSkill("olsanyao" + button.link); + }, + check: function (button) { + var player = _status.event.player; + if ( + game.hasPlayer( + [ + function (target) { + var num = target.countCards("h"); + return ( + !game.hasPlayer(function (current) { + return current != target && current.countCards("h") > num; + }) && get.effect(target, "sanyao", player, player) > 0 + ); + }, + function (target) { + var num = target.hp; + return ( + !game.hasPlayer(function (current) { + return current != target && current.hp > num; + }) && get.effect(target, "sanyao", player, player) > 0 + ); + }, + ][button.link] + ) + ) + return 1 + button.link; + return 0; + }, + backup: function (links) { + return { + audio: "sanyao", + filterTarget: [ + function (card, player, target) { + var num = target.countCards("h"); + return !game.hasPlayer(function (current) { + return current != target && current.countCards("h") > num; + }); + }, + function (card, player, target) { + return !game.hasPlayer(function (current) { + return current != target && current.hp > target.hp; + }); + }, + ][links[0]], + index: links[0], + filterCard: true, + check: function (card) { + return 7 - get.value(card); + }, + position: "he", + content: function () { + player.addTempSkill("olsanyao" + lib.skill[event.name].index); + target.damage("nocard"); + }, + ai: lib.skill.sanyao.ai, + }; + }, + prompt: function () { + return "请选择【散谣】的目标"; + }, + }, + ai: { + order: 7, + result: { + player: 1, + }, + }, + }, + olsanyao0: {}, + olsanyao1: {}, + rezhiman: { + audio: "zhiman", + audioname: ["guansuo", "re_masu"], + audioname2: { + dc_guansuo: "zhiman_guansuo", + }, + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return player != event.player; + }, + check: function (event, player) { + if (get.damageEffect(event.player, player, player) < 0) return true; + var att = get.attitude(player, event.player); + if (att > 0 && event.player.countCards("j")) return true; + if (event.num > 1) { + if (att < 0) return false; + if (att > 0) return true; + } + var cards = event.player.getGainableCards(player, "he"); + for (var i = 0; i < cards.length; i++) { + if (get.equipValue(cards[i]) >= 6) return true; + } + return false; + }, + logTarget: "player", + content: function () { + if (trigger.player.countGainableCards(player, "hej")) { + player.gainPlayerCard(trigger.player, "hej", true); + } + trigger.cancel(); + }, + }, + zhiman_guansuo: { audio: 2 }, + resanyao: { + audio: 2, + enable: "phaseUse", + usable: 1, + selectCard: function () { + var player = _status.event.player; + return [ + Math.max(1, ui.selected.targets.length), + game.countPlayer(function (target) { + return ( + target != player && + !game.hasPlayer(function (current) { + return current != player && current.hp > target.hp; + }) + ); + }), + ]; + }, + selectTarget: function () { + return ui.selected.cards.length; + }, + filterTarget: function (card, player, target) { + return ( + target != player && + !game.hasPlayer(function (current) { + return current != player && current.hp > target.hp; + }) + ); + }, + check: function (card) { + var player = _status.event.player; + if ( + game.countPlayer(function (target) { + return ( + target != player && + !game.hasPlayer(function (current) { + return current != player && current.hp > target.hp; + }) && + get.effect(target, "sanyao", player, player) > 0 + ); + }) <= ui.selected.cards.length + ) + return 0; + return 7 - get.value(card); + }, + position: "he", + filterCard: true, + content: function () { + target.damage("nocard"); + }, + ai: { + result: { + target: function (player, target) { + var disbool = false; + if (player.hasSkill("rezhiman")) { + if (target.countCards("j") && get.attitude(player, target) > 0) { + return 1; + } + if ( + target.countCards("he", function (card) { + return card.name == "tengjia" || get.value(card) > 0; + }) + ) { + disbool = true; + } + } + var damage = get.damageEffect(target, player); + if (disbool && get.attitude(player, target) < 0) return Math.min(-1, damage); + return damage; + }, + }, + order: 7, + }, + }, + reqiaoshui: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool) player.addTempSkill("qiaoshui3", "phaseUseEnd"); + else { + player.addTempSkill("qiaoshui4"); + event.getParent(3).skipped = true; + } + }, + ai: { + order: function (item, player) { + if ( + player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) + return 10; + return 1; + }, + result: { + target: function (player, target) { + if ( + player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) { + if (player.hasSkill("qiaoshui3")) return 0; + var nd = !player.needsToDiscard(); + if ( + player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (nd && val < 0) return true; + if (val <= 5) { + return get.number(card) >= 12; + } + if (val <= 6) { + return get.number(card) >= 13; + } + return false; + }) + ) + return -1; + return 0; + } + return -1; + }, + }, + }, + }, + qiaoshui: { + audio: 2, + audioname2: { + re_jianyong: "reqiaoshui", + xin_jianyong: "xinqiaoshui", + }, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("qiaoshui"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) / target.countCards("h"); + }); + "step 1"; + if (result.bool) { + player.logSkill("qiaoshui", result.targets[0]); + player.chooseToCompare(result.targets[0]); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.addTempSkill("qiaoshui3"); + } else { + player.addTempSkill("qiaoshui2"); + } + }, + ai: { + expose: 0.1, + }, + }, + qiaoshui2: { + mod: { + cardEnabled: function (card) { + if (get.type(card, "trick") == "trick") return false; + }, + }, + }, + qiaoshui3: { + charlotte: true, + audio: "qiaoshui", + audioname2: { + re_jianyong: "reqiaoshui", + xin_jianyong: "xinqiaoshui", + ol_jianyong: "olqiaoshui", + }, + trigger: { player: "useCard2" }, + filter: function (event, player) { + var type = get.type(event.card); + return type == "basic" || type == "trick"; + }, + direct: true, + content: function () { + "step 0"; + player.removeSkill("qiaoshui3"); + var goon = false; + var info = get.info(trigger.card); + if (trigger.targets && !info.multitarget) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (lib.filter.targetEnabled2(trigger.card, player, players[i]) && !trigger.targets.includes(players[i])) { + goon = true; + break; + } + } + } + if (goon) { + player + .chooseTarget("巧说:是否额外指定一名" + get.translation(trigger.card) + "的目标?", function (card, player, target) { + var trigger = _status.event; + if (trigger.targets.includes(target)) return false; + return lib.filter.targetEnabled2(trigger.card, _status.event.player, target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + } else { + if (!info.multitarget && trigger.targets && trigger.targets.length > 1) { + event.goto(3); + } + } + "step 1"; + if (result.bool) { + if (!event.isMine()) game.delayx(); + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + if (event.target) { + player.logSkill("qiaoshui3", event.target); + trigger.targets.add(event.target); + } + event.finish(); + "step 3"; + player + .chooseTarget("巧说:是否减少一名" + get.translation(trigger.card) + "的目标?", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + return -get.effect(target, trigger.card, trigger.player, _status.event.player); + }) + .set("targets", trigger.targets); + "step 4"; + if (result.bool) { + event.targets = result.targets; + if (event.isMine()) { + player.logSkill("qiaoshui3", event.targets); + event.finish(); + } + for (var i = 0; i < result.targets.length; i++) { + trigger.targets.remove(result.targets[i]); + } + game.delay(); + } else { + event.finish(); + } + "step 5"; + player.logSkill("qiaoshui3", event.targets); + }, + }, + qiaoshui4: { + mod: { + ignoredHandcard: function (card, player) { + if (get.type(card, "trick", player) == "trick") { + return true; + } + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.type(card, "trick", player) == "trick") { + return false; + } + }, + }, + }, + jyzongshi_old: { + audio: 2, + trigger: { target: "useCardToBegin" }, + filter: function (event, player) { + if (event.targets && event.targets.length > 1) return false; + return event.card && get.type(event.card) == "trick" && event.player != player; + }, + frequent: true, + content: function () { + player.draw(); + }, + ai: { + effect: function (card, player, target) { + if (get.type(card) == "trick") return [1, 1]; + }, + }, + }, + shenxing: { + audio: 2, + enable: "phaseUse", + position: "he", + filterCard: true, + selectCard: 2, + prompt: "弃置两张牌并摸一张牌", + check: function (card) { + var player = _status.event.player; + if (!player.hasSkill("olbingyi") || player.hasSkill("olbingyi_blocker", null, null, false)) return 4 - get.value(card); + var red = 0, + black = 0, + hs = player.getCards("h"); + for (var i of hs) { + if (ui.selected.cards.includes(i)) continue; + var color = get.color(i, player); + if (color == "red") red++; + if (color == "black") black++; + } + if (red > 2 && black > 2) return 4 - get.value(card); + if (red == 0 || black == 0) return 8 - get.value(card); + var color = get.color(card); + if (black <= red) return (color == "black" && get.position(card) == "h" ? 8 : 4) - get.value(card); + return (color == "red" && get.position(card) == "h" ? 8 : 4) - get.value(card); + }, + content: function () { + player.draw(); + }, + ai: { + order: 9, + result: { + player: function (player, target) { + if (!ui.selected.cards.length) return 1; + if (!player.hasSkill("olbingyi") || player.hasSkill("olbingyi_blocker", null, null, false)) return 1; + var red = 0, + black = 0, + hs = player.getCards("h"); + for (var i of hs) { + if (ui.selected.cards.includes(i)) continue; + var color = get.color(i); + if (color == "red") red++; + if (color == "black") black++; + } + var val = 0; + for (var i of ui.selected.cards) val += get.value(i, player); + if (red == 0 || black == 0) { + if (red + black == 0) return 0; + var num = + Math.min( + red + black, + game.countPlayer(function (current) { + return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain"); + }) + ) + 1; + if (num * 7 > val) return 1; + } + if (val < 8) return 1; + return 0; + }, + }, + }, + }, + bingyi: { + audio: 2, + audioname: ["xin_guyong"], + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterx: function (event, player) { + var cards = player.getCards("h"); + if (cards.length < 1) return false; + var color = get.color(cards[0]); + for (var i = 1; i < cards.length; i++) { + if (get.color(cards[i]) != color) return false; + } + return true; + }, + direct: true, + content: function () { + "step 0"; + if (lib.skill.bingyi.filterx(trigger, player)) { + player + .chooseTarget(get.prompt("bingyi"), "展示所有手牌,并令至多" + get.cnNumber(player.countCards("h")) + "名角色各摸一张牌", [1, player.countCards("h")], function (card, player, target) { + return true; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + } else + player.chooseBool(get.prompt("bingyi"), "展示所有手牌").ai = function () { + return false; + }; + "step 1"; + if (result.bool) { + player.logSkill("bingyi"); + player.showHandcards(get.translation(player) + "发动了【秉壹】"); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (targets && targets.length) { + player.line(targets, "green"); + targets.sortBySeat(); + game.asyncDraw(targets); + } + }, + ai: { + expose: 0.1, + }, + }, + xiantu: { + //unique:true, + audio: "xiantu1", + group: "xiantu2", + //gainable:true, + //forceunique:true, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player != player; + }, + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) < 5) return false; + if (player.maxHp - player.hp >= 2) return false; + if (player.hp == 1) return false; + if (player.hp == 2 && player.countCards("h") < 2) return false; + if (event.player.countCards("h") >= event.player.hp) return false; + return true; + }, + content: function () { + "step 0"; + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); + player.draw(2); + "step 1"; + player.chooseCard(2, "he", true, "交给" + get.translation(trigger.player) + "两张牌").set("ai", function (card) { + if (ui.selected.cards.length && card.name == ui.selected.cards[0].name) return -1; + if (get.tag(card, "damage")) return 1; + if (get.type(card) == "equip") return 1; + return 0; + }); + "step 2"; + player.give(result.cards, trigger.player); + trigger.player.addSkill("xiantu4"); + trigger.player.storage.xiantu4.push(player); + }, + ai: { + threaten: 1.1, + }, + }, + xiantu1: { audio: true }, + xiantu2: { audio: true }, + xiantu4: { + trigger: { player: "phaseUseEnd" }, + forced: true, + audio: false, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + charlotte: true, + content: function () { + while (player.storage.xiantu4.length) { + var current = player.storage.xiantu4.shift(); + if (current.isDead()) continue; + current.logSkill("xiantu2"); + current.loseHp(); + } + player.removeSkill("xiantu4"); + }, + group: "xiantu3", + }, + xiantu3: { + trigger: { source: "dieAfter" }, + forced: true, + audio: false, + content: function () { + player.removeSkill("xiantu4"); + }, + }, + qiangzhi: { + audio: 2, + audioname: ["re_zhangsong"], + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }); + }, + subfrequent: ["draw"], + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("qiangzhi"), function (card, player, target) { + return target != player && target.countCards("h") > 0; + }) + .set("ai", function () { + return Math.random(); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("qiangzhi", target); + player.choosePlayerCard(target, "h", true); + } else event.finish(); + "step 2"; + var card = result.cards[0]; + target.showCards(card, get.translation(target) + "因【强识】展示"); + player.storage.qiangzhi_draw = get.type(card, "trick"); + game.addVideo("storage", player, ["qiangzhi_draw", player.storage.qiangzhi_draw]); + player.addTempSkill("qiangzhi_draw", "phaseUseEnd"); + }, + }, + qiangzhi_draw: { + trigger: { player: "useCard" }, + frequent: true, + popup: false, + charlotte: true, + prompt: "是否执行【强识】的效果摸一张牌?", + filter: function (event, player) { + return get.type(event.card, "trick") == player.storage.qiangzhi_draw; + }, + content: function () { + player.draw(); + }, + onremove: true, + mark: true, + intro: { + content: function (type) { + return get.translation(type) + "牌"; + }, + }, + }, + dingpin: { + audio: 2, + enable: "phaseUse", + onChooseToUse: function (event) { + if (event.type != "phase" || game.online) return; + var list = [], + player = event.player; + player.getHistory("useCard", function (evt) { + list.add(get.type2(evt.card)); + }); + player.getHistory("lose", function (evt) { + if (evt.type != "discard") return; + for (var i of evt.cards2) { + list.add(get.type2(i, evt.hs.includes(i) ? player : false)); + } + }); + event.set("dingpin_types", list); + }, + filter: function (event, player) { + var list = event.dingpin_types || []; + return ( + player.countCards("he", function (card) { + return !list.includes(get.type2(card)); + }) > 0 + ); + }, + filterCard: function (card) { + var list = _status.event.dingpin_types || []; + return !list.includes(get.type2(card)); + }, + position: "he", + filterTarget: function (card, player, target) { + return !target.hasSkill("dingpin2"); + }, + content: function () { + "step 0"; + target.judge(function (card) { + var evt = _status.event.getParent("dingpin"), + color = get.color(card); + switch (color) { + case "black": + return evt.target.getDamagedHp(); + case "red": + return get.sgn(get.attitude(evt.target, evt.player)) * -3; + } + return 0; + }).judge2 = function (result) { + if (result.color == "black") return true; + return false; + }; + "step 1"; + switch (result.color) { + case "black": + if (target.getDamagedHp() > 0) target.draw(target.getDamagedHp()); + target.addTempSkill("dingpin2"); + break; + case "red": + player.turnOver(); + break; + } + }, + ai: { + order: 9, + result: { + target: function (player, target) { + if (player.isTurnedOver()) return target.getDamagedHp(); + var card = ui.cardPile.firstChild; + if (!card) return; + if (get.color(card) == "black") return target.getDamagedHp(); + return 0; + }, + }, + }, + }, + dingpin2: { charlotte: true }, + faen: { + audio: 2, + trigger: { global: ["turnOverAfter", "linkAfter"] }, + filter: function (event, player) { + if (event.name == "link") return event.player.isLinked(); + return !event.player.isTurnedOver(); + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + logTarget: "player", + content: function () { + trigger.player.draw(); + }, + ai: { + expose: 0.2, + }, + }, + jiaojin: { + audio: 2, + trigger: { player: "damageBegin3" }, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) && event.source && event.source.hasSex("male"); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard("he", "骄矜:是否弃置一张装备牌令伤害-1?", function (card, player) { + return get.type(card) == "equip"; + }); + next.set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1 || _status.event.getTrigger().num > 1) { + return 9 - get.value(card); + } + if (player.hp == 2) { + return 8 - get.value(card); + } + return 7 - get.value(card); + }); + next.logSkill = "jiaojin"; + "step 1"; + if (result.bool) { + game.delay(0.5); + trigger.num--; + } + }, + }, + chanhui: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + if (player.hasSkill("chanhui2")) return false; + if (event.targets.length > 1) return false; + var card = event.card; + if (card.name == "sha") return true; + if (get.color(card) == "black" && get.type(card) == "trick") return true; + return false; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("chanhui"), function (card, player, target) { + if (player == target) return false; + var evt = _status.event.getTrigger(); + return !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player) + 0.01; + }); + "step 1"; + if (result.bool) { + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + player.addTempSkill("chanhui2"); + player.logSkill("chanhui", event.target); + event.target.chooseCard("交给" + get.translation(player) + "一张手牌,或成为" + get.translation(trigger.card) + "的额外目标").set("ai", function (card) { + return 5 - get.value(card); + }); + "step 3"; + if (result.bool) { + target.give(result.cards, player); + trigger.untrigger(); + trigger.getParent().player = event.target; + game.log(event.target, "成为了", trigger.card, "的使用者"); + } else { + game.log(event.target, "成为了", trigger.card, "的额外目标"); + trigger.getParent().targets.push(event.target); + } + }, + }, + rechanhui: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (player.hasSkill("rechanhui2")) return false; + if (event.targets.length > 1) return false; + var card = event.card; + if (card.name == "sha" || get.type(card) == "trick") return true; + return false; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("rechanhui"), function (card, player, target) { + if (player == target) return false; + var trigger = _status.event; + return player.canUse(trigger.card, target, false) && trigger.targets.includes(target) == false; + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player) + 0.01; + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + //game.delay(0,200); + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + player.logSkill("rechanhui", event.target); + event.target.chooseCard("交给" + get.translation(player) + "一张牌,或成为" + get.translation(trigger.card) + "的额外目标", "he").set("ai", function (card) { + return 5 - get.value(card); + }); + "step 3"; + if (result.bool) { + target.give(result.cards, player); + trigger.untrigger(); + trigger.getParent().player = event.target; + game.log(event.target, "成为了", trigger.card, "的使用者"); + } else { + game.log(event.target, "成为了", trigger.card, "的额外目标"); + trigger.getParent().targets.push(event.target); + player.addTempSkill("rechanhui2"); + } + }, + }, + rechanhui2: { charlotte: true }, + rejiaojin2: { charlotte: true }, + rejiaojin: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return ( + (event.card.name == "sha" || get.type(event.card) == "trick") && + event.player != player && + player.countCards("he", function (card) { + return _status.connectMode || get.type(card) == "equip"; + }) && + !player.hasSkill("rejiaojin2") + ); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard("he", "骄矜:是否弃置一张装备牌令" + get.translation(trigger.card) + "对你无效?", function (card, player) { + return get.type(card) == "equip"; + }); + next.set("ai", function (card) { + if (_status.event.goon2) { + return 3 + _status.event.val - get.value(card); + } + return 0; + }); + next.set("val", get.value(trigger.cards.filterInD())); + next.set("goon2", get.effect(player, trigger.card, trigger.player, player) < 0); + next.logSkill = ["rejiaojin", trigger.player]; + "step 1"; + if (result.bool) { + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2", "log"); + trigger.excluded.push(player); + if (trigger.player.hasSex("female")) player.addTempSkill("rejiaojin2"); + } + }, + }, + chanhui2: {}, + quanji: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + locked: false, + notemp: true, + filter: function (event) { + return event.num > 0; + }, + content: function () { + "step 0"; + event.count = trigger.num; + "step 1"; + event.count--; + player.draw(); + "step 2"; + if (player.countCards("h")) { + player.chooseCard("将一张手牌置于武将牌上作为“权”", true); + } else { + event.goto(4); + } + "step 3"; + if (result.cards && result.cards.length) { + player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("quanji"); + } + "step 4"; + if (event.count > 0 && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) { + player.chooseBool(get.prompt2("quanji")).set("frequentSkill", event.name); + } else event.finish(); + "step 5"; + if (result.bool) { + player.logSkill("quanji"); + event.goto(1); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("quanji").length; + }, + }, + ai: { + maixie: true, + maixie_hp: true, + threaten: 0.8, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; + if (!target.hasSkill("paiyi") && target.hp > 1) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; + } + }, + }, + }, + }, + zili: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + audioname: ["re_zhonghui"], + unique: true, + juexingji: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + derivation: "paiyi", + filter: function (event, player) { + return !player.hasSkill("paiyi") && player.getExpansions("quanji").length >= 3; + }, + content: function () { + "step 0"; + player.awakenSkill("zili"); + player.chooseDrawRecover(2, true, function (event, player) { + if (player.hp == 1 && player.isDamaged()) return "recover_hp"; + return "draw_card"; + }); + "step 1"; + player.loseMaxHp(); + player.addSkills("paiyi"); + }, + ai: { + combo: "quanji", + }, + }, + paiyi: { + enable: "phaseUse", + usable: 1, + audio: 2, + audioname: ["re_zhonghui"], + filter: function (event, player) { + return player.getExpansions("quanji").length > 0; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("排异", player.getExpansions("quanji"), "hidden"); + }, + backup: function (links, player) { + return { + audio: "paiyi", + audioname: ["re_zhonghui"], + filterTarget: true, + filterCard: function () { + return false; + }, + selectCard: -1, + card: links[0], + delay: false, + content: lib.skill.paiyi.contentx, + ai: { + order: 10, + result: { + target: function (player, target) { + if (player != target) return 0; + if (player.hasSkill("requanji") || player.countCards("h") + 2 <= player.hp + player.getExpansions("quanji").length) return 1; + return 0; + }, + }, + }, + }; + }, + prompt: function () { + return "请选择〖排异〗的目标"; + }, + }, + contentx: function () { + "step 0"; + var card = lib.skill.paiyi_backup.card; + player.loseToDiscardpile(card); + "step 1"; + target.draw(2); + "step 2"; + if (target.countCards("h") > player.countCards("h")) { + target.damage(); + } + }, + ai: { + order: 1, + combo: "quanji", + result: { + player: 1, + }, + }, + }, + xianzhou: { + skillAnimation: true, + animationColor: "gray", + audio: 2, + audioname: ["xin_caifuren"], + unique: true, + limited: true, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("e") > 0; + }, + filterTarget: function (card, player, target) { + return player != target; + }, + mark: true, + delay: false, + content: function () { + "step 0"; + player.awakenSkill("xianzhou"); + var cards = player.getCards("e"); + player.give(cards, target); + event.num = cards.length; + game.delay(); + "step 1"; + target + .chooseTarget([1, event.num], "令" + get.translation(player) + "回复" + event.num + "点体力,或对攻击范围内的" + event.num + "名角色造成1点伤害", function (card, player, target2) { + return _status.event.player.inRange(target2); + }) + .set("ai", function (target2) { + var target = _status.event.player; + var player = _status.event.getParent().player; + if (get.attitude(target, player) > 0) { + if (player.hp + event.num <= player.maxHp || player.hp == 1) return -1; + } + return get.damageEffect(target2, target, target); + }); + "step 2"; + if (result.bool) { + target.line(result.targets, "green"); + event.targets = result.targets; + event.num2 = 0; + } else { + player.recover(event.num); + event.finish(); + } + "step 3"; + if (event.num2 < event.targets.length) { + event.targets[event.num2].damage(target); + event.num2++; + event.redo(); + } + }, + intro: { + content: "limited", + }, + ai: { + order: 1, + result: { + target: 1, + player: function (player) { + var bool = true, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 2 && get.attitude(players[i], player) > 2) { + bool = false; + break; + } + } + if (bool) return -10; + if (player.hp == 1) return 1; + if (game.phaseNumber < game.players.length) return -10; + if (player.countCards("e") + player.hp <= player.maxHp) return 1; + return -10; + }, + }, + }, + }, + qieting: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + if (event.player == player || !event.player.isIn()) return false; + var history = event.player.getHistory("useCard"); + for (var i = 0; i < history.length; i++) { + if (!history[i].targets) continue; + for (var j = 0; j < history[i].targets.length; j++) { + if (history[i].targets[j] != event.player) return false; + } + } + return true; + }, + direct: true, + content: function () { + "step 0"; + var next; + if ( + trigger.player.hasCard(function (card) { + return player.canEquip(card); + }, "e") + ) { + next = player + .chooseControl("移动装备", "draw_card", "cancel2", function (event, player) { + var source = _status.event.sourcex; + var att = get.attitude(player, source); + if (source.hasSkillTag("noe")) { + if (att > 0) { + return "移动装备"; + } + } else { + if ( + att <= 0 && + source.countCards("e", function (card) { + return get.value(card, source) > 0 && get.effect(player, card, player, player) > 0; + }) + ) { + return "移动装备"; + } + } + return "draw_card"; + }) + .set("sourcex", trigger.player); + } else { + next = player.chooseControl("draw_card", "cancel2", function () { + return "draw_card"; + }); + } + next.set("prompt", get.prompt("qieting", trigger.player)); + "step 1"; + if (result.control == "移动装备") { + player.logSkill("qieting", trigger.player); + player + .choosePlayerCard(trigger.player, "e", "将一张装备牌移至你的装备区", true) + .set("filterButton", function (button) { + return _status.event.player.canEquip(button.link); + }) + .set("ai", function (button) { + return get.effect(player, button.link, player, player); + }); + } else { + if (result.control == "draw_card") { + player.logSkill("qieting"); + player.draw(); + } + event.finish(); + } + "step 2"; + if (result && result.links && result.links.length) { + game.delay(2); + trigger.player.$give(result.links[0], player, false); + player.equip(result.links[0]); + player.addExpose(0.2); + } + }, + }, + oldzhuikong: { + audio: "zhuikong", + inherit: "zhuikong", + }, + zhuikong: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + check: function (event, player) { + if (get.attitude(player, event.player) < -2) { + var cards = player.getCards("h"); + if (cards.length > player.hp) return true; + for (var i = 0; i < cards.length; i++) { + var useful = get.useful(cards[i]); + if (useful < 5) return true; + if (get.number(cards[i]) > 9 && useful < 7) return true; + } + } + return false; + }, + logTarget: "player", + filter: function (event, player) { + return player.hp < player.maxHp && player.canCompare(event.player); + }, + content: function () { + "step 0"; + player.chooseToCompare(trigger.player); + "step 1"; + if (result.bool) { + if (event.name == "zhuikong") trigger.player.addTempSkill("zishou2"); + else trigger.player.skip("phaseUse"); + } else { + trigger.player.storage.zhuikong_distance = player; + trigger.player.addTempSkill("zhuikong_distance"); + } + }, + subSkill: { + distance: { + sub: true, + onremove: true, + mod: { + globalFrom: function (from, to, distance) { + if (from.storage.zhuikong_distance == to) return -Infinity; + }, + }, + }, + }, + }, + oldqiuyuan: { + audio: "qiuyuan", + inherit: "qiuyuan", + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasPlayer(function (current) { + return current != player && !event.targets.includes(current) && current.countCards("h") > 0 && lib.filter.targetEnabled(event.card, event.player, current); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("oldqiuyuan"), function (card, player, target) { + var evt = _status.event.getTrigger(); + return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled(evt.card, evt.player, target) && target.countCards("h") > 0; + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, trigger.player, player) + 0.1; + }) + .set("targets", trigger.targets) + .set("playerx", trigger.player); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("oldqiuyuan", target); + event.target = target; + target + .chooseCard("交给" + get.translation(player) + "一张牌,若此牌不为【闪】,则也成为此杀的额外目标", true) + .set("ai", function (card) { + return -get.value(card, player, "raw"); + }) + .set("sourcex", player); + game.delay(); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + target.give(result.cards, player, "give"); + if (get.name(result.cards[0]) != "shan") { + trigger.getParent().targets.push(event.target); + trigger.getParent().triggeredTargets2.push(event.target); + game.log(event.target, "成为了额外目标"); + } + game.delay(); + } + }, + }, + qiuyuan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasPlayer(function (current) { + return current != player && !event.targets.includes(current) && lib.filter.targetEnabled(event.card, event.player, current); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("qiuyuan"), function (card, player, target) { + var evt = _status.event.getTrigger(); + return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled(evt.card, evt.player, target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, trigger.player, player) + 0.1; + }) + .set("targets", trigger.targets) + .set("playerx", trigger.player); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qiuyuan", target); + event.target = target; + target + .chooseCard({ name: "shan" }, "交给" + get.translation(player) + "一张闪,或成为此杀的额外目标") + .set("ai", function (card) { + return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1; + }) + .set("sourcex", player); + game.delay(); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + target.give(result.cards, player); + game.delay(); + } else { + trigger.getParent().targets.push(event.target); + trigger.getParent().triggeredTargets2.push(event.target); + game.log(event.target, "成为了额外目标"); + } + }, + ai: { + expose: 0.2, + effect: { + target: function (card, player, target) { + if (card.name != "sha") return; + var players = game.filterPlayer(); + if (get.attitude(player, target) <= 0) { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, target) > 0 && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) < 0) { + if (target.hp == target.maxHp) return 0.3; + return 0.6; + } + } + } else { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) > 0) { + if (player.canUse(card, target2)) return; + if (target.hp == target.maxHp) return [0, 1]; + return [0, 0]; + } + } + } + }, + }, + }, + }, + gongji: { + enable: "phaseUse", + usable: 1, + audio: 2, + position: "he", + filterCard: true, + check: function (card) { + if (get.type(card) != "equip") return 0; + var player = _status.currentPhase; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); + } + return 6 - get.equipValue(card); + }, + content: function () { + "step 0"; + player.addTempSkill("gongji2"); + "step 1"; + if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") { + player + .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) { + return player != target && target.countCards("he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) < 0) { + return Math.max(0.5, get.effect(target, { name: "sha" }, player, player)); + } + return 0; + }); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + player.line(result.targets, "green"); + event.target = result.targets[0]; + player.discardPlayerCard(event.target, "he", true).ai = get.buttonValue; + } + }, + ai: { + order: 9, + result: { + player: 1, + }, + }, + }, + gongji2: { + mod: { + attackRangeBase: function () { + return Infinity; + }, + }, + }, + zhuiyi: { + audio: 2, + audioname: ["re_bulianshi"], + trigger: { player: "die" }, + direct: true, + skillAnimation: true, + animationColor: "wood", + forceDie: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("zhuiyi"), function (card, player, target) { + return player != target && _status.event.sourcex != target; + }) + .set("forceDie", true) + .set("ai", function (target) { + var num = get.attitude(_status.event.player, target); + if (num > 0) { + if (target.hp == 1) { + num += 2; + } + if (target.hp < target.maxHp) { + num += 2; + } + } + return num; + }) + .set("sourcex", trigger.source); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhuiyi", target); + player.line(target, "green"); + target.recover(); + target.draw(3); + } + }, + ai: { + expose: 0.5, + }, + }, + old_anxu: { + enable: "phaseUse", + usable: 1, + multitarget: true, + audio: "anxu", + filterTarget: function (card, player, target) { + if (player == target) return false; + var num = target.countCards("h"); + if (ui.selected.targets.length) { + return num < ui.selected.targets[0].countCards("h"); + } + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (num > players[i].countCards("h")) return true; + } + return false; + }, + selectTarget: 2, + content: function () { + "step 0"; + var gainner, giver; + if (targets[0].countCards("h") < targets[1].countCards("h")) { + gainner = targets[0]; + giver = targets[1]; + } else { + gainner = targets[1]; + giver = targets[0]; + } + gainner.gainPlayerCard(giver, true, "h", "visibleMove"); + event.gainner = gainner; + event.giver = giver; + "step 1"; + if (result.cards) { + event.bool = false; + var card = result.cards[0]; + if (get.suit(card) != "spade") event.bool = true; + } + "step 2"; + if (event.bool) { + player.draw(); + } + }, + ai: { + order: 10.5, + threaten: 2.3, + result: { + target: function (player, target) { + var num = target.countCards("h"); + var att = get.attitude(player, target); + if (ui.selected.targets.length == 0) { + if (att > 0) return -1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var num2 = players[i].countCards("h"); + var att2 = get.attitude(player, players[i]); + if (num2 < num) { + if (att2 > 0) return -3; + return -1; + } + } + return 0; + } else { + return 1; + } + }, + player: 1, + }, + }, + }, + anxu: { + enable: "phaseUse", + usable: 1, + multitarget: true, + audio: 2, + filterTarget: function (card, player, target) { + if (player == target) return false; + var num = target.countCards("h"); + if (ui.selected.targets.length) { + return num < ui.selected.targets[0].countCards("h"); + } + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (num > players[i].countCards("h")) return true; + } + return false; + }, + selectTarget: 2, + content: function () { + "step 0"; + var gainner, giver; + if (targets[0].countCards("h") < targets[1].countCards("h")) { + gainner = targets[0]; + giver = targets[1]; + } else { + gainner = targets[1]; + giver = targets[0]; + } + giver.chooseCard("选择一张手牌交给" + get.translation(gainner), true); + event.gainner = gainner; + event.giver = giver; + "step 1"; + var card = result.cards[0]; + event.giver.give(card, event.gainner); + "step 2"; + if (event.gainner.countCards("h") == event.giver.countCards("h")) { + player.chooseDrawRecover(true); + } + }, + ai: { + order: 10.5, + threaten: 1.6, + result: { + target: function (player, target) { + var num = target.countCards("h"); + var att = get.attitude(player, target); + if (ui.selected.targets.length == 0) { + if (att > 0) return -1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var num2 = players[i].countCards("h"); + var att2 = get.attitude(player, players[i]); + if (att2 >= 0 && num2 < num) return -1; + } + return 0; + } else { + return 1; + } + }, + player: 0.1, + }, + }, + }, + mingce: { + enable: "phaseUse", + usable: 1, + audio: 2, + position: "he", + filterCard: function (card) { + return get.name(card) == "sha" || get.type(card) == "equip"; + }, + filter: function (event, player) { + return player.countCards("h", "sha") > 0 || player.countCards("he", { type: "equip" }) > 0; + }, + check: function (card) { + return 8 - get.value(card); + }, + selectTarget: 2, + multitarget: true, + discard: false, + lose: false, + targetprompt: ["得到牌", "出杀目标"], + filterTarget: function (card, player, target) { + if (ui.selected.targets.length == 0) { + return player != target; + } else { + return ui.selected.targets[0].inRange(target); + } + }, + delay: false, + content: function () { + "step 0"; + player.give(cards, targets[0], "visible"); + "step 1"; + if (!lib.filter.filterTarget({ name: "sha", isCard: true }, targets[0], targets[1])) event._result = { control: "draw_card" }; + else + targets[0] + .chooseControl("draw_card", "出杀", function () { + var player = _status.event.player; + var target = _status.event.target; + if (get.effect(_status.event.target, { name: "sha" }, player, player) > 0) { + return 1; + } + return 0; + }) + .set("target", targets[1]) + .set("prompt", "对" + get.translation(targets[1]) + "使用一张杀,或摸一张牌"); + "step 2"; + if (result.control == "draw_card") { + targets[0].draw(); + } else { + targets[0].useCard({ name: "sha", isCard: true }, targets[1]); + } + }, + ai: { + result: { + player: function (player) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 1 && get.attitude(players[i], player) > 1) { + return 1; + } + } + return 0; + }, + target: function (player, target) { + if (ui.selected.targets.length) { + return -0.1; + } + return 1; + }, + }, + order: 8.5, + expose: 0.2, + }, + }, + xinxuanhuo: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + direct: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xinxuanhuo"), function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) { + if (target.countCards("h") < target.hp) att += 2; + return att - target.countCards("h") / 3; + } else { + return -1; + } + }); + "step 1"; + if (result.bool) { + trigger.changeToZero(); + player.logSkill("xinxuanhuo", result.targets); + event.target = result.targets[0]; + event.target.draw(2); + } else { + event.finish(); + } + "step 2"; + if ( + game.hasPlayer(function (current) { + return target.canUse("sha", current); + }) + ) + player + .chooseTarget("选择出杀的目标", true, function (card, player, target) { + return _status.event.target.canUse("sha", target); + }) + .set("ai", function (target) { + return get.effect(target, { name: "sha" }, _status.event.target, _status.event.player); + }) + .set("target", event.target); + "step 3"; + if (result.bool && result.targets.length) { + game.log(player, "指定的出杀目标为", result.targets); + event.target.line(result.targets); + event.target.chooseToUse("对" + get.translation(result.targets) + "使用一张杀,或令" + get.translation(player) + "获得你的两张牌", { name: "sha" }, result.targets[0], -1); + } else { + event.bool = true; + } + "step 4"; + if (event.bool || result.bool == false) { + player.gainPlayerCard("he", event.target, Math.min(2, event.target.countCards("he")), true); + } + }, + ai: { + expose: 0.2, + }, + }, + zhichi: { + audio: 2, + trigger: { player: "damageEnd" }, + audioname: ["re_chengong"], + forced: true, + filter: function (event, player) { + return _status.currentPhase != player; + }, + content: function () { + player.addTempSkill("zhichi2", ["phaseAfter", "phaseBefore"]); + }, + }, + zhichi2: { + trigger: { target: "useCardToBefore" }, + forced: true, + charlotte: true, + priority: 15, + filter: function (event, player) { + return get.type(event.card) == "trick" || event.card.name == "sha"; + }, + content: function () { + game.log(player, "发动了智迟,", trigger.card, "对", trigger.target, "失效"); + trigger.cancel(); + }, + mark: true, + intro: { + content: "杀或普通锦囊牌对你无效", + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "trick" || card.name == "sha") return "zeroplayertarget"; + }, + }, + }, + }, + zongxuan: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false) return; + var evt = event.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (get.position(evt.cards2[i]) == "d") { + return true; + } + } + return false; + }, + check: function (trigger, player) { + if ( + trigger.getParent(3).name != "phaseDiscard" || + !game.hasPlayer(function (current) { + return current.isDamaged() && get.recoverEffect(current, player, player) > 0; + }) + ) + return false; + var evt = trigger.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (get.position(evt.cards2[i], true) == "d" && get.type(evt.cards2[i], false) == "equip") { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var cards = []; + var evt = trigger.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if (get.position(evt.cards2[i], true) == "d") { + cards.push(evt.cards2[i]); + } + } + var next = player.chooseToMove("纵玄:将任意张牌置于牌堆顶", true); + next.set("list", [["本次弃置的牌", cards], ["牌堆顶"]]); + next.set("filterOk", function (moved) { + return moved[1].length > 0; + }); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0), + cards2 = cards.filter(function (i) { + return get.type(i, false) == "equip"; + }), + cards3; + if (cards2.length) { + cards3 = cards2.randomGet(); + } else cards3 = cards.randomGet(); + return [[], [cards3]]; + }); + "step 1"; + if (result.bool) { + var cards = result.moved[1]; + game.log(player, "将", cards, "置于了牌堆顶"); + while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); + } + }, + }, + zhiyan: { + audio: 2, + audioname: ["gexuan", "re_yufan"], + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("zhiyan"), "令一名角色摸一张牌并展示之。若为装备牌,则其回复1点体力").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("zhiyan", result.targets); + event.bool = false; + event.target.draw("visible"); + } else { + event.finish(); + } + "step 2"; + var card = result[0]; + if (get.type(card) == "equip") { + if (target.getCards("h").includes(card) && target.hasUseTarget(card)) { + event.target.chooseUseTarget(card, true, "nopopup"); + game.delay(); + } + event.bool = true; + } + "step 3"; + if (event.bool) target.recover(); + }, + ai: { + expose: 0.2, + threaten: 1.2, + }, + }, + miji: { + audio: 2, + audioname: ["re_wangyi"], + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (num > 0 && _status.event && _status.event.type === "phase" && get.tag(card, "recover")) { + if (player.needsToDiscard()) return num / 3; + return 0; + } + }, + }, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hp < player.maxHp; + }, + content: function () { + "step 0"; + event.num = player.getDamagedHp(); + player.draw(event.num); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + event._forcing = false; + event.aicheck = (function () { + let res = { + bool: true, + cards: [], + }, + cards = player.getCards("he"), + tars = game.filterPlayer(i => player !== i); + cards.forEach(i => { + let o = get.value(i, player), + max = o, + temp, + t; + tars.forEach(tar => { + temp = get.value(i, tar); + if (temp > max) { + max = temp; + t = tar; + } + }); + if (t) res.cards.push([i, t, max - o]); + }); + if (res.cards.length < event.num) res.bool = false; + else if (res.cards.length > event.num) + res.cards + .sort((a, b) => { + return b[2] - a[2]; + }) + .slice(0, event.num); + return res; + })(); + "step 1"; + player.chooseCardTarget({ + filterCard(card) { + return get.itemtype(card) == "card" && !card.hasGaintag("miji_tag"); + }, + filterTarget: lib.filter.notMe, + selectCard: [1, event.num], + prompt: "请选择要分配的卡牌和目标", + forced: event._forcing, + ai1(card) { + if (!_status.event.res.bool || ui.selected.cards.length) return 0; + for (let arr of _status.event.res.cards) { + if (arr[0] === card) return arr[2]; + } + return 0; + }, + ai2(target) { + let card = ui.selected.cards[0]; + for (let arr of _status.event.res.cards) { + if (arr[0] === card) return get.attitude(player, target); + } + let val = target.getUseValue(card); + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); + }, + res: event.aicheck, + }); + "step 2"; + if (result.bool) { + event._forcing = true; + var res = result.cards, + target = result.targets[0].playerid; + player.addGaintag(res, "miji_tag"); + event.num -= res.length; + if (!event.given_map[target]) event.given_map[target] = []; + event.given_map[target].addArray(res); + if (event.num > 0) event.goto(1); + } + "step 3"; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var map = [], + cards = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.18); + map.push([source, event.given_map[i]]); + cards.addArray(event.given_map[i]); + } + game.loseAsync({ + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + }, + ai: { + threaten: function (player, target) { + return 0.6 + 0.7 * target.getDamagedHp(); + }, + effect: { + target: function (card, player, target) { + if (target.hp <= 2 && get.tag(card, "damage")) { + var num = 1; + if ( + get.itemtype(player) == "player" && + player.hasSkillTag("damageBonus", false, { + target: target, + card: card, + }) && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ) + num = 2; + if (target.hp > num) return [1, 1]; + } + }, + }, + }, + }, + zhenlie: { + audio: 2, + audioname: ["re_wangyi"], + filter: function (event, player) { + return event.player != player && event.card && (event.card.name == "sha" || get.type(event.card) == "trick"); + }, + logTarget: "player", + check: function (event, player) { + if (event.getParent().excluded.includes(player)) return false; + if (get.attitude(player, event.player) > 0 || (player.hp < 2 && !get.tag(event.card, "damage"))) return false; + let evt = event.getParent(), + directHit = (evt.nowuxie && get.type(event.card, "trick") === "trick") || (evt.directHit && evt.directHit.includes(player)) || (evt.customArgs && evt.customArgs.default && evt.customArgs.default.directHit2); + if (get.tag(event.card, "respondSha")) { + if (directHit || player.countCards("h", { name: "sha" }) === 0) return true; + } else if (get.tag(event.card, "respondShan")) { + if (directHit || player.countCards("h", { name: "shan" }) === 0) return true; + } else if (get.tag(event.card, "damage")) { + if (event.card.name === "huogong") return event.player.countCards("h") > 4 - player.hp - player.hujia; + if (event.card.name === "shuiyanqijunx") return player.countCards("e") === 0; + return true; + } else if (player.hp > 2) { + if (event.card.name === "shunshou" || (event.card.name === "zhujinqiyuan" && (event.card.yingbian || get.distance(event.player, player) < 0))) return true; + } + return false; + }, + trigger: { target: "useCardToTargeted" }, + content: function () { + "step 0"; + if (get.attitude(player, trigger.player) < 0 && trigger.player.countDiscardableCards(player, "he")) player.addTempSkill("zhenlie_lose"); + player.loseHp(); + "step 1"; + player.removeSkill("zhenlie_lose"); + trigger.getParent().excluded.add(player); + "step 2"; + if (trigger.player.countCards("he")) { + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.12); + player.discardPlayerCard(trigger.player, "he", true); + } + }, + subSkill: { + lose: { + charlotte: true, + }, + }, + ai: { + filterDamage: true, + skillTagFilter: (player, tag, arg) => { + return arg && arg.jiu == true; + }, + effect: { + target: (card, player, target) => { + if (target.hp <= 0 && target.hasSkill("zhenlie_lose") && get.tag(card, "recover")) return [1, 1.2]; + }, + }, + }, + }, + //吾彦... + wuyan: { audio: 2 }, + xswuyan: { + audio: "wuyan", + trigger: { target: "useCardToBefore", player: "useCardToBefore" }, + forced: true, + check: function (event, player) { + return get.effect(event.target, event.card, event.player, player) < 0; + }, + filter: function (event, player) { + if (!event.target) return false; + if (event.player == player && event.target == player) return false; + return get.type(event.card) == "trick"; + }, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "trick" && player != target) return "zeroplayertarget"; + }, + player: function (card, player, target, current) { + if (get.type(card) == "trick" && player != target) return "zeroplayertarget"; + }, + }, + }, + }, + xinwuyan: { + audio: 2, + trigger: { source: "damageBegin2", player: "damageBegin4" }, + forced: true, + check: function (event, player) { + if (player == event.player) return true; + return false; + }, + filter: function (event, player) { + return get.type(event.card, "trick") == "trick"; + }, + content: function () { + trigger.cancel(); + }, + ai: { + notrick: true, + notricksource: true, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "trick" && get.tag(card, "damage")) { + return "zeroplayertarget"; + } + }, + player: function (card, player, target, current) { + if (get.type(card) == "trick" && get.tag(card, "damage")) { + return "zeroplayertarget"; + } + }, + }, + }, + }, + xinjujian: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return player.countCards("he") > player.countCards("he", { type: "basic" }); + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterTarget: function (card, player, target) { + return player != target; + }, + filterCard: function (card, player) { + return get.type(card) != "basic" && lib.filter.cardDiscardable(card, player); + }, + ai1: function (card) { + if (get.tag(card, "damage") && get.type(card) == "trick") { + return 20; + } + return 9 - get.value(card); + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) { + if (target.isTurnedOver()) att += 3; + if (target.hp == 1) att += 3; + } + return att; + }, + position: "he", + prompt: get.prompt2("xinjujian"), + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xinjujian", target); + player.discard(result.cards); + if (target.hp == target.maxHp && !target.isTurnedOver() && !target.isLinked()) { + target.draw(2); + event.finish(); + } else { + var controls = ["draw_card"]; + if (target.hp < target.maxHp) { + controls.push("recover_hp"); + } + if (target.isLinked() | target.isTurnedOver()) { + controls.push("reset_character"); + } + target.chooseControl(controls).ai = function () { + if (target.isTurnedOver()) { + return "reset_character"; + } else if (target.hp == 1 && target.maxHp > 2) { + return "recover_hp"; + } else if (target.hp == 2 && target.maxHp > 2 && target.countCards("h") > 1) { + return "recover_hp"; + } else { + return "draw_card"; + } + }; + } + } else { + event.finish(); + } + "step 2"; + event.control = result.control; + switch (event.control) { + case "recover_hp": + event.target.recover(); + event.finish(); + break; + case "draw_card": + event.target.draw(2); + event.finish(); + break; + case "reset_character": + if (event.target.isTurnedOver()) event.target.turnOver(); + break; + } + "step 3"; + if (event.control == "reset_character" && event.target.isLinked()) { + event.target.link(); + } + }, + ai: { + expose: 0.2, + threaten: 1.4, + }, + }, + jujian: { + enable: "phaseUse", + usable: 1, + audio: 2, + filterCard: true, + position: "he", + selectCard: [1, 3], + check: function (card) { + var player = get.owner(card); + if (get.type(card) == "trick") return 10; + if (player.countCards("h") - player.hp - ui.selected.cards.length > 0) { + return 8 - get.value(card); + } + return 4 - get.value(card); + }, + filterTarget: function (card, player, target) { + return player != target; + }, + content: function () { + target.draw(cards.length); + if (cards.length == 3) { + if (get.type(cards[0], "trick") == get.type(cards[1], "trick") && get.type(cards[0], "trick") == get.type(cards[2], "trick")) { + player.recover(); + } + } + }, + ai: { + expose: 0.2, + order: 1, + result: { + target: 1, + }, + }, + }, + yizhong: { + trigger: { target: "shaBefore" }, + forced: true, + audio: 2, + filter: function (event, player) { + if (!player.hasEmptySlot(2)) return false; + return event.card.name == "sha" && get.color(event.card) == "black"; + }, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target) { + if (player == target && get.subtypes(card).includes("equip2")) { + if (get.equipValue(card) <= 8) return 0; + } + if (!player.hasEmptySlot(2)) return; + if (card.name == "sha" && get.color(card) == "black") return "zerotarget"; + }, + }, + }, + }, + jueqing: { + trigger: { source: "damageBefore" }, + forced: true, + audio: 2, + //priority:16, + check: function () { + return false; + }, + content: function () { + trigger.cancel(); + trigger.player.loseHp(trigger.num); + }, + ai: { + jueqing: true, + }, + }, + shangshi: { + audio: 2, + trigger: { + player: ["loseAfter", "changeHp", "gainMaxHpAfter", "loseMaxHpAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + frequent: true, + filter: function (event, player) { + if (event.getl && !event.getl(player)) return false; + return player.countCards("h") < player.getDamagedHp(); + }, + content: function () { + player.draw(player.getDamagedHp() - player.countCards("h")); + }, + ai: { + noh: true, + skillTagFilter: function (player, tag) { + if (tag == "noh" && player.maxHp - player.hp < player.countCards("h")) { + return false; + } + }, + }, + }, + luoying: { + //unique:true, + //gainable:true, + group: ["luoying_discard", "luoying_judge"], + subfrequent: ["judge"], + subSkill: { + discard: { + audio: 2, + trigger: { global: "loseAfter" }, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false) return false; + var cards = event.cards.slice(0); + var evt = event.getl(player); + if (evt && evt.cards) cards.removeArray(evt.cards); + for (var i = 0; i < cards.length; i++) { + if (cards[i].original != "j" && get.suit(cards[i], event.player) == "club" && get.position(cards[i], true) == "d") { + return true; + } + } + return false; + }, + direct: true, + content: function () { + "step 0"; + if (trigger.delay == false) game.delay(); + "step 1"; + var cards = [], + cards2 = trigger.cards.slice(0), + evt = trigger.getl(player); + if (evt && evt.cards) cards2.removeArray(evt.cards); + for (var i = 0; i < cards2.length; i++) { + if (cards2[i].original != "j" && get.suit(cards2[i], trigger.player) == "club" && get.position(cards2[i], true) == "d") { + cards.push(cards2[i]); + } + } + if (cards.length) { + player.chooseButton(["落英:选择要获得的牌", cards], [1, cards.length]).set("ai", function (button) { + return get.value(button.link, _status.event.player, "raw"); + }); + } + "step 2"; + if (result.bool) { + player.logSkill(event.name); + player.gain(result.links, "gain2", "log"); + } + }, + }, + judge: { + audio: 2, + trigger: { global: "cardsDiscardAfter" }, + //frequent:'check', + direct: true, + filter: function (event, player) { + var evt = event.getParent().relatedEvent; + if (!evt || evt.name != "judge") return; + if (evt.player == player) return false; + if (get.position(event.cards[0], true) != "d") return false; + return get.suit(event.cards[0]) == "club"; + }, + content: function () { + "step 0"; + player.chooseButton(["落英:选择要获得的牌", trigger.cards], [1, trigger.cards.length]).set("ai", function (button) { + return get.value(button.link, _status.event.player, "raw"); + }); + "step 1"; + if (result.bool) { + player.logSkill(event.name); + player.gain(result.links, "gain2", "log"); + } + }, + }, + }, + }, + jiushi: { + audio: "jiushi1", + group: ["jiushi1", "jiushi2", "jiushi3"], + }, + jiushi1: { + audio: 2, + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (name == "jiu") return !player.isTurnedOver(); + return false; + }, + filter: function (event, player) { + if (player.classList.contains("turnedover")) return false; + return event.filterCard({ name: "jiu", isCard: true }, player, event); + }, + content: function () { + if (_status.event.getParent(2).type == "dying") { + event.dying = player; + event.type = "dying"; + } + player.turnOver(); + player.useCard({ name: "jiu", isCard: true }, player); + }, + ai: { + order: 5, + result: { + player: function (player) { + if (_status.event.parent.name == "phaseUse") { + if (player.countCards("h", "jiu") > 0) return 0; + if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1) return 0; + if (!player.countCards("h", "sha")) return 0; + var targets = []; + var target; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) < 0) { + if (player.canUse("sha", players[i], true, true)) { + targets.push(players[i]); + } + } + } + if (targets.length) { + target = targets[0]; + } else { + return 0; + } + var num = get.effect(target, { name: "sha" }, player, player); + for (var i = 1; i < targets.length; i++) { + var num2 = get.effect(targets[i], { name: "sha" }, player, player); + if (num2 > num) { + target = targets[i]; + num = num2; + } + } + if (num <= 0) return 0; + var e2 = target.getEquip(2); + if (e2) { + if (e2.name == "tengjia") { + if (!player.countCards("h", { name: "sha", nature: "fire" }) && !player.getEquip("zhuque")) return 0; + } + if (e2.name == "renwang") { + if (!player.countCards("h", { name: "sha", color: "red" })) return 0; + } + if (e2.name == "baiyin") return 0; + } + if (player.getEquip("guanshi") && player.countCards("he") > 2) return 1; + return target.countCards("h") > 3 ? 0 : 1; + } + if (player == _status.event.dying || player.isTurnedOver()) return 3; + }, + }, + effect: { + target: function (card, player, target) { + if (card.name == "guiyoujie") return [0, 0.5]; + if (target.isTurnedOver()) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target.hp == 1) return; + return [1, target.countCards("h") / 2]; + } + } + }, + }, + }, + }, + jiushi2: { + trigger: { player: "damageBegin3" }, + silent: true, + firstDo: true, + filter: function (event, player) { + return player.classList.contains("turnedover"); + }, + content: function () { + trigger.jiushi = true; + }, + }, + jiushi3: { + audio: "jiushi1", + trigger: { player: "damageEnd" }, + check: function (event, player) { + return player.isTurnedOver(); + }, + prompt: "是否发动【酒诗】,将武将牌翻面?", + filter: function (event, player) { + if (event.jiushi) { + return true; + } + return false; + }, + content: function () { + delete trigger.jiushi; + player.turnOver(); + }, + }, + zongshi: { + audio: 2, + mod: { + maxHandcard: function (player, num) { + return num + game.countGroup(); + }, + }, + }, + zishou: { + audio: 2, + audioname: ["re_liubiao"], + trigger: { player: "phaseDrawBegin2" }, + check: function (event, player) { + return player.countCards("h") <= (player.hasSkill("zongshi") ? player.maxHp : player.hp - 2) || player.skipList.includes("phaseUse"); + }, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + trigger.num += game.countGroup(); + player.addTempSkill("zishou2"); + }, + ai: { + threaten: 1.5, + }, + }, + zishou2: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; + }, + }, + }, + olddanshou: { + audio: "danshou", + trigger: { source: "damageSource" }, + //priority:9, + check: function (event, player) { + return get.attitude(player, event.player) <= 0; + }, + content: function () { + "step 0"; + player.draw(); + var cards = Array.from(ui.ordering.childNodes); + while (cards.length) { + cards.shift().discard(); + } + "step 1"; + var evt = _status.event.getParent("phase"); + if (evt) { + game.resetSkills(); + _status.event = evt; + _status.event.finish(); + _status.event.untrigger(true); + } + }, + ai: { + jueqing: true, + }, + }, + danshou: { + enable: "phaseUse", + filterCard: true, + position: "he", + audio: 2, + filter: function (event, player) { + var num = player.getStat().skill.danshou; + if (num) { + num++; + } else { + num = 1; + } + return player.countCards("he") >= num; + }, + check: function (card) { + if (ui.selected.cards.length >= 2) { + return 4 - get.value(card); + } + return 6 - get.value(card); + }, + selectCard: function (card) { + var num = _status.event.player.getStat().skill.danshou; + if (num) return num + 1; + return 1; + }, + filterTarget: function (card, player, target) { + if (player == target) return false; + var num = player.getStat().skill.danshou; + if (num) { + num++; + } else { + num = 1; + } + if (num <= 2 && !target.countCards("he")) return false; + return player.inRange(target); + }, + content: function () { + "step 0"; + var num = player.getStat().skill.danshou; + switch (num) { + case 1: + player.discardPlayerCard(target, true); + break; + case 2: + target.chooseCard("选择一张牌交给" + get.translation(player), "he", true); + break; + case 3: + target.damage("nocard"); + break; + default: + game.asyncDraw([player, target], 2); + } + if (num != 2) event.finish(); + "step 1"; + if (result.cards) { + target.give(result.cards, player); + } + }, + ai: { + order: 8.6, + result: { + target: function (player, target) { + var num = player.getStat().skill.danshou; + if (num) { + num++; + } else { + num = 1; + } + if (num > 3) return 0; + if (num == 3) return get.damageEffect(target, player, target); + return -1; + }, + }, + }, + }, + qice: { + audio: 2, + audioname: ["clan_xunyou"], + enable: "phaseUse", + filter: function (event, player) { + const hs = player.getCards("h"); + if (!hs.length) return false; + if ( + hs.some(card => { + const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + return mod2 === false; + }) + ) + return false; + return lib.inpile.some(name => { + if (get.type(name) != "trick") return false; + const card = get.autoViewAs({ name }, hs); + return event.filterCard(card, player, event); + }); + }, + usable: 1, + chooseButton: { + dialog: function (player) { + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + if (get.type(lib.inpile[i]) == "trick") list.push(["锦囊", "", lib.inpile[i]]); + } + return ui.create.dialog(get.translation("qice"), [list, "vcard"]); + }, + filter: function (button, player) { + const event = _status.event.getParent(), + card = get.autoViewAs( + { + name: button.link[2], + }, + player.getCards("h") + ); + return event.filterCard(card, player, event); + }, + check: function (button) { + var player = _status.event.player; + var recover = 0, + lose = 1, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].hp == 1 && get.damageEffect(players[i], player, player) > 0 && !players[i].hasSha()) { + return button.link[2] == "juedou" ? 2 : -1; + } + if (!players[i].isOut()) { + if (players[i].hp < players[i].maxHp) { + if (get.attitude(player, players[i]) > 0) { + if (players[i].hp < 2) { + lose--; + recover += 0.5; + } + lose--; + recover++; + } else if (get.attitude(player, players[i]) < 0) { + if (players[i].hp < 2) { + lose++; + recover -= 0.5; + } + lose++; + recover--; + } + } else { + if (get.attitude(player, players[i]) > 0) { + lose--; + } else if (get.attitude(player, players[i]) < 0) { + lose++; + } + } + } + } + if (lose > recover && lose > 0) return button.link[2] == "nanman" ? 1 : -1; + if (lose < recover && recover > 0) return button.link[2] == "taoyuan" ? 1 : -1; + return button.link[2] == "wuzhong" ? 1 : -1; + }, + backup: function (links, player) { + return { + audio: "qice", + audioname: ["clan_xunyou"], + filterCard: true, + selectCard: -1, + position: "h", + popname: true, + viewAs: { name: links[0][2] }, + }; + }, + prompt: function (links, player) { + return "将全部手牌当作" + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 1, + result: { + player: function (player) { + var num = 0; + var cards = player.getCards("h"); + if (cards.length >= 3 && player.hp >= 3) return 0; + for (var i = 0; i < cards.length; i++) { + num += Math.max(0, get.value(cards[i], player, "raw")); + } + num /= cards.length; + num *= Math.min(cards.length, player.hp); + return 12 - num; + }, + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && !player.getStat("skill").qice && player.hasCard(card => get.name(card) != "tao", "h"); + }, + threaten: 1.6, + }, + }, + zhiyu: { + audio: 2, + trigger: { player: "damageEnd" }, + preHidden: true, + content: function () { + "step 0"; + player.draw(); + "step 1"; + if (!player.countCards("h")) event.finish(); + else player.showHandcards(); + "step 2"; + if (!trigger.source) return; + var cards = player.getCards("h"); + var color = get.color(cards[0], player); + for (var i = 1; i < cards.length; i++) { + if (get.color(cards[i], player) != color) return; + } + trigger.source.chooseToDiscard(true); + }, + ai: { + maixie_defend: true, + threaten: 0.9, + }, + }, + xuanfeng: { + audio: 2, + audioname: ["boss_lvbu3", "re_heqi"], + trigger: { + player: ["loseAfter", "phaseDiscardEnd"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + direct: true, + filter: function (event, player) { + if (event.name == "phaseDiscard") { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt && evt.type == "discard" && evt.getParent("phaseDiscard") == event && evt.hs) cards.addArray(evt.hs); + }); + return cards.length > 1; + } else { + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; + } + }, + content: function () { + "step 0"; + event.count = 2; + event.logged = false; + "step 1"; + player + .chooseTarget(get.prompt("xuanfeng"), "弃置一名其他角色的一张牌", function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he"); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + "step 2"; + if (result.bool) { + if (!event.logged) { + player.logSkill("xuanfeng", result.targets); + event.logged = true; + } else player.line(result.targets[0], "green"); + player.discardPlayerCard(result.targets[0], "he", true); + event.count--; + } else event.finish(); + "step 3"; + if (event.count) event.goto(1); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, + reverseEquip: true, + noe: true, + }, + }, + jiangchi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + direct: true, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + "step 0"; + player.chooseControl("jiangchi_less", "jiangchi_more", "cancel2", function () { + var player = _status.event.player; + if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) { + return "jiangchi_less"; + } + if (player.countCards("h", "sha") > 2) { + return "jiangchi_less"; + } + if (player.hp - player.countCards("h") > 1) { + return "jiangchi_more"; + } + return "cancel2"; + }); + "step 1"; + if (result.control == "jiangchi_less") { + trigger.num--; + player.addTempSkill("jiangchi2", "phaseUseEnd"); + player.logSkill("jiangchi"); + } else if (result.control == "jiangchi_more") { + trigger.num++; + player.addTempSkill("jiangchi3", "phaseUseEnd"); + player.logSkill("jiangchi"); + } + }, + }, + jiangchi2: { + mod: { + targetInRange: function (card, player, target, now) { + if (card.name == "sha") return true; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + jiangchi3: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + }, + xinzhan: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h") > player.maxHp; + }, + usable: 1, + content: function () { + "step 0"; + var cards = get.cards(3); + event.cards = cards; + var next = player.chooseCardButton(cards, "选择获得的红桃牌", [1, Infinity]).set("filterButton", function (button) { + return get.suit(button.link) == "heart"; + }); + "step 1"; + if (result.bool) { + player.gain(result.links, "draw"); + } + for (var i = event.cards.length - 1; i >= 0; i--) { + if (!result.bool || !result.links.includes(event.cards[i])) { + ui.cardPile.insertBefore(event.cards[i], ui.cardPile.firstChild); + } + } + }, + ai: { + order: 11, + result: { + player: 1, + }, + }, + }, + huilei: { + audio: 2, + trigger: { player: "die" }, + forced: true, + forceDie: true, + filter: function (event) { + return event.source && event.source.isIn(); + }, + logTarget: "source", + skillAnimation: true, + animationColor: "thunder", + content: function () { + trigger.source.discard(trigger.source.getCards("he")); + }, + ai: { + threaten: 0.7, + }, + }, + xinenyuan: { + audio: 2, + group: ["xinenyuan1", "xinenyuan2"], + }, + xinenyuan1: { + audio: true, + trigger: { player: "gainEnd" }, + filter: function (event, player) { + return event.source && event.source.isIn() && event.source != player && event.cards.length >= 2; + }, + logTarget: "source", + check: function (event, player) { + return get.attitude(player, event.source) > 0; + }, + prompt2: function (event, player) { + return "令" + get.translation(event.source) + "摸一张牌"; + }, + content: function () { + trigger.source.draw(); + }, + }, + xinenyuan2: { + audio: true, + trigger: { player: "damageEnd" }, + check: function (event, player) { + var att = get.attitude(player, event.source); + var num = event.source.countCards("h"); + if (att <= 0) return true; + if (num > 2) return true; + if (num) return att < 4; + return false; + }, + filter: function (event, player) { + return event.source && event.source != player && event.num > 0 && event.source.isIn(); + }, + logTarget: "source", + prompt2: function (event, player) { + return "令" + get.translation(event.source) + "交给你一张手牌或失去1点体力"; + }, + content: function () { + "step 0"; + event.num = trigger.num; + "step 1"; + trigger.source.chooseCard("选择一张手牌交给" + get.translation(player) + ",或点“取消”失去1点体力").set("ai", function (card) { + var player = _status.event.getParent().player, + source = _status.event.player; + if (get.effect(source, { name: "losehp" }, source, source) >= 0) return 0; + if (get.attitude(player, source) > 0) return 11 - get.value(card); + return 7 - get.value(card); + }); + "step 2"; + if (result.bool) { + trigger.source.give(result.cards, player); + } else { + trigger.source.loseHp(); + } + if (event.num > 1 && player.hasSkill("xinenyuan") && trigger.source && trigger.source.isIn()) { + player.logSkill("xinenyuan", trigger.source); + event.num--; + event.goto(1); + } + }, + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; + if (!target.hasFriend()) return; + if (get.tag(card, "damage")) return [1, 0, 0, -0.7]; + }, + }, + }, + }, + enyuan: { + audio: 2, + locked: true, + group: ["enyuan1", "enyuan2"], + }, + enyuan1: { + audio: true, + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return event.source && event.source != player && event.source.isIn(); + }, + logTarget: "source", + content: function () { + "step 0"; + trigger.source + .chooseCard("选择一张红桃牌交给" + get.translation(player) + ",或点“取消”失去1点体力", function (card) { + return get.suit(card) == "heart"; + }) + .set("ai", function (card) { + var player = _status.event.getParent().player, + source = _status.event.player; + if (get.effect(source, { name: "losehp" }, source, source) >= 0) return 0; + if (get.attitude(player, source) > 0) return 11 - get.value(card); + return 7 - get.value(card); + }); + "step 1"; + if (result.bool) { + trigger.source.give(result.cards, player); + } else { + trigger.source.loseHp(); + } + }, + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (get.tag(card, "damage")) return [1, 0, 0, -1]; + }, + }, + }, + }, + enyuan2: { + audio: true, + trigger: { player: "recoverEnd" }, + forced: true, + logTarget: "source", + filter: function (event, player) { + return event.source && event.source != player && event.source.isIn(); + }, + content: function () { + "step 0"; + event.num = trigger.num; + "step 1"; + if (event.num > 0) { + player.logSkill("enyuan1", trigger.source); + trigger.source.draw(); + event.num--; + event.redo(); + } + }, + }, + xuanhuo: { + audio: 2, + enable: "phaseUse", + usable: 1, + discard: false, + lose: false, + delay: 0, + filter: function (event, player) { + return player.countCards("he", { suit: "heart" }); + }, + filterCard: function (card) { + return get.suit(card) == "heart"; + }, + filterTarget: function (card, player, target) { + if (game.countPlayer() == 2) return false; + return player != target; + }, + check: function (card) { + var player = get.owner(card); + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 3) break; + } + if (i == players.length) return -1; + return 5 - get.value(card); + }, + content: function () { + "step 0"; + player.give(cards, target); + // game.delay(); + "step 1"; + player.gainPlayerCard(target, "he", true); + "step 2"; + var source = target; + event.card = result.links[0]; + if (player.getCards("h").includes(event.card)) + player + .chooseTarget("将" + get.translation(event.card) + "交给另一名其他角色", function (card, player, target) { + return target != _status.event.sourcex && target != player; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("sourcex", target); + else event.finish(); + "step 3"; + if (result.bool) { + player.give(card, result.targets[0], "give"); + game.delay(); + } + }, + ai: { + result: { + target: -0.5, + }, + basic: { + order: 9, + }, + }, + }, + ganlu: { + enable: "phaseUse", + usable: 1, + audio: 2, + selectTarget: 2, + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + if (ui.selected.targets.length == 0) return true; + if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0) return false; + return Math.abs(ui.selected.targets[0].countCards("e") - target.countCards("e")) <= player.maxHp - player.hp; + }, + multitarget: true, + content: function () { + targets[0].swapEquip(targets[1]); + }, + ai: { + order: 10, + threaten: function (player, target) { + return 0.8 * Math.max(1 + target.maxHp - target.hp); + }, + result: { + target: function (player, target) { + var list1 = []; + var list2 = []; + var num = player.maxHp - player.hp; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 0) list1.push(players[i]); + else if (get.attitude(player, players[i]) < 0) list2.push(players[i]); + } + list1.sort(function (a, b) { + return a.countCards("e") - b.countCards("e"); + }); + list2.sort(function (a, b) { + return b.countCards("e") - a.countCards("e"); + }); + var delta; + for (var i = 0; i < list1.length; i++) { + for (var j = 0; j < list2.length; j++) { + delta = list2[j].countCards("e") - list1[i].countCards("e"); + if (delta <= 0) continue; + if (delta <= num) { + if (target == list1[i] || target == list2[j]) { + return get.attitude(player, target); + } + return 0; + } + } + } + return 0; + }, + }, + effect: { + target: function (card, player, target) { + if (target.hp == target.maxHp && get.tag(card, "damage")) return 0.2; + }, + }, + }, + }, + buyi: { + trigger: { global: "dying" }, + //priority:6, + audio: 2, + audioname: ["re_wuguotai"], + filter: function (event, player) { + return event.player.hp <= 0 && event.player.countCards("h") > 0; + }, + direct: true, + content: function () { + "step 0"; + var check; + if (trigger.player.isUnderControl(true, player)) { + check = player.hasCard(function (card) { + return get.type(card) != "basic"; + }); + } else { + check = get.attitude(player, trigger.player) > 0; + } + player + .choosePlayerCard(trigger.player, get.prompt("buyi", trigger.player), "h") + .set("ai", function (button) { + if (!_status.event.check) return 0; + if (_status.event.target.isUnderControl(true, _status.event.player)) { + if (get.type(button.link) != "basic") { + return 10 - get.value(button.link); + } + return 0; + } else { + return Math.random(); + } + }) + .set("check", check) + .set("filterButton", function (button) { + if (_status.event.player == _status.event.target) { + return lib.filter.cardDiscardable(button.link, _status.event.player); + } + return true; + }); + "step 1"; + if (result.bool) { + player.logSkill("buyi", trigger.player); + event.card = result.links[0]; + player.showCards([event.card], get.translation(player) + "展示的手牌"); + } else { + event.finish(); + } + "step 2"; + if (get.type(event.card) != "basic") { + trigger.player.recover(); + trigger.player.discard(event.card); + } + }, + ai: { + threaten: 1.4, + }, + }, + pojun: { + audio: 2, + trigger: { source: "damageSource" }, + check: function (event, player) { + if (event.player.isTurnedOver()) return get.attitude(player, event.player) > 0; + if (event.player.hp < 3) { + return get.attitude(player, event.player) < 0; + } + return get.attitude(player, event.player) > 0; + }, + filter: function (event) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.player.isIn(); + }, + logTarget: "player", + content: function () { + "step 0"; + trigger.player.draw(Math.min(5, trigger.player.hp)); + "step 1"; + trigger.player.turnOver(); + }, + }, + jingce: { + trigger: { player: "phaseUseEnd" }, + frequent: true, + filter: function (event, player) { + return player.countUsed(null, true) >= player.hp; + }, + content: function () { + player.draw(2); + }, + audio: 2, + }, + xinjingce: { + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + return player.countUsed(null, true) >= player.hp; + }, + content: function () { + player.draw(2); + }, + audio: 2, + }, + oldchengxiang: { + audio: "chengxiang", + inherit: "chengxiang", + }, + chengxiang: { + trigger: { player: "damageEnd" }, + //direct:true, + frequent: true, + audio: 2, + content: function () { + "step 0"; + event.cards = get.cards(4); + game.cardsGotoOrdering(event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards, num) { + var str; + if (player == game.me && !_status.auto) { + str = "称象:选择任意张点数不大于" + num + "的牌"; + } else { + str = "称象"; + } + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards, + event.name == "oldchengxiang" ? 12 : 13 + ); + event.time = get.utc(); + game.addVideo("showCards", player, ["称象", get.cardsInfo(event.cards)]); + game.addVideo("delay", null, 2); + "step 1"; + var next = player.chooseButton([0, 4]); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + var num = 0; + for (var i = 0; i < ui.selected.buttons.length; i++) { + num += get.number(ui.selected.buttons[i].link); + } + return num + get.number(button.link) <= _status.event.maxNum; + }); + next.set("maxNum", event.name == "oldchengxiang" ? 12 : 13); + next.set("ai", function (button) { + let player = _status.event.player, + name = get.name(button.link), + val = get.value(button.link, player); + if (name === "tao") return val + 2 * Math.min(3, 1 + player.getDamagedHp()); + if (name === "jiu" && player.hp < 3) return val + 2 * (2.8 - player.hp); + if (name === "wuxie" && player.countCards("j") && !player.hasWuxie()) return val + 5; + if (player.hp > 1 && player.hasSkill("renxin") && player.hasFriend() && get.type(button.link) === "equip") return val + 4; + return val; + }); + "step 2"; + if (result.bool && result.links) { + //player.logSkill('chengxiang'); + var cards2 = []; + for (var i = 0; i < result.links.length; i++) { + cards2.push(result.links[i]); + cards.remove(result.links[i]); + } + event.cards2 = cards2; + } else { + event.finish(); + } + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); + } + "step 3"; + game.broadcastAll("closeDialog", event.videoId); + var cards2 = event.cards2; + player.gain(cards2, "log", "gain2"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [1, 2]; + if (target.hp == 3) return [1, 1.5]; + if (target.hp == 2) return [1, 0.5]; + } + }, + }, + }, + }, + oldrenxin: { + audio: "renxin", + trigger: { global: "dying" }, + //priority:6, + filter: function (event, player) { + return event.player != player && event.player.hp <= 0 && player.countCards("h") > 0; + }, + check: function (event, player) { + if (get.attitude(player, event.player) <= 0) return false; + if (player.countCards("h", { name: ["tao", "jiu"] }) + event.player.hp < 0) return false; + return true; + }, + content: function () { + "step 0"; + player.turnOver(); + "step 1"; + player.give(player.getCards("h"), trigger.player); + "step 2"; + trigger.player.recover(); + }, + }, + renxin: { + trigger: { global: "damageBegin4" }, + audio: 2, + audioname: ["re_caochong"], + //priority:6, + filter: function (event, player) { + return event.player != player && event.player.hp == 1 && player.countCards("he", { type: "equip" }) > 0; + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt("renxin", trigger.player), "弃置一张装备牌并将武将牌翻面,然后防止" + get.translation(trigger.player) + "受到的伤害", { type: "equip" }, "he"); + next.logSkill = ["renxin", trigger.player]; + next.set("ai", function (card) { + var player = _status.event.player; + if (get.attitude(player, _status.event.getTrigger().player) > 3) { + return 11 - get.value(card); + } + return -1; + }); + "step 1"; + if (result.bool) { + player.turnOver(); + } else { + event.finish(); + } + "step 2"; + trigger.cancel(); + }, + ai: { + expose: 0.5, + }, + }, + yuce: { + audio: 2, + audioname: ["re_manchong"], + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0 && player.isDamaged(); + }, + content: function () { + "step 0"; + var next = player.chooseCard(get.prompt2("yuce")); + next.set("ai", function (card) { + if (get.type(card) == "basic") return 1; + return Math.abs(get.value(card)) + 1; + }); + "step 1"; + if (result.bool) { + player.logSkill("yuce"); + player.showCards(result.cards); + var type = get.type(result.cards[0], "trick"); + if (trigger.source) { + trigger.source + .chooseToDiscard("弃置一张不为" + get.translation(type) + "牌的牌或令" + get.translation(player) + "回复1点体力", function (card) { + return get.type(card, "trick") != _status.event.type; + }) + .set("ai", function (card) { + if (get.recoverEffect(_status.event.getParent().player, _status.event.player, _status.event.player) < 0) { + return 7 - get.value(card); + } + return 0; + }) + .set("type", type); + } else { + event.recover = true; + } + } else { + event.finish(); + } + "step 2"; + if (event.recover) { + player.recover(); + } else if (result.bool) { + //player.draw(); + } else { + player.recover(); + } + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage" && target.countCards("h"))) { + return 0.8; + } + }, + }, + }, + }, + xiansi: { + audio: 2, + audioname: ["re_liufeng"], + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget( + get.prompt2(event.name), + [1, 2], + function (card, player, target) { + return target.countCards("he") > 0; + }, + function (target) { + return -get.attitude(_status.event.player, target); + } + ); + "step 1"; + if (result.bool) { + result.targets.sortBySeat(); + player.logSkill(event.name, result.targets); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets.length) { + var target = event.targets.shift(); + event.current = target; + player.choosePlayerCard(target, true); + } else { + event.finish(); + } + "step 3"; + if (result.bool) { + player.addToExpansion(result.cards, event.current, "give").gaintag.add("xiansi"); + event.goto(2); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player) { + var cards = player.getExpansions("xiansi"); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { + threaten: 2, + }, + global: "xiansi2", + group: "xiansix", + }, + xiansix: {}, + xiansi2: { + enable: "chooseToUse", + audio: 2, + audioname2: { re_liufeng: "rexiansi" }, + viewAs: { name: "sha", isCard: true }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.hasSkill("xiansix") && current.getExpansions("xiansi").length > 1 && event.filterTarget({ name: "sha" }, player, current); + }); + }, + filterTarget: function (card, player, target) { + var bool = false; + var players = ui.selected.targets.slice(0); + for (var i = 0; i < players.length; i++) { + if (players[i].hasSkill("xiansix") && players[i].getExpansions("xiansi").length > 1) bool = true; + break; + } + if (!bool && (!target.hasSkill("xiansix") || target.getExpansions("xiansi").length <= 1)) return false; + return _status.event._backup.filterTarget.apply(this, arguments); + }, + complexSelect: true, + selectCard: -1, + filterCard: function () { + return false; + }, + forceaudio: true, + prompt: "弃置一名有【逆】的角色的两张【逆】,然后视为对包含其在内的角色使用【杀】。", + delay: false, + log: false, + precontent: function () { + "step 0"; + var targets = event.result.targets.filter(function (current) { + return current.getExpansions("xiansi").length > 1 && current.hasSkill("xiansix"); + }); + if (targets.length == 1) { + event.target = targets[0]; + event.goto(2); + } else if (targets.length > 0) { + player + .chooseTarget(true, "选择弃置【陷嗣】牌的目标", function (card, player, target) { + return _status.event.list.includes(target); + }) + .set("list", targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target); + }); + } else { + event.finish(); + } + "step 1"; + if (result.bool && result.targets.length) { + event.target = result.targets[0]; + } else { + event.finish(); + } + "step 2"; + if (event.target) { + if (event.target.getExpansions("xiansi").length == 2) { + event.directresult = event.target.getExpansions("xiansi").slice(0); + } else { + player.chooseCardButton("移去两张“逆”", 2, event.target.getExpansions("xiansi"), true); + } + } else { + event.finish(); + } + "step 3"; + if (event.directresult || result.bool) { + player.logSkill("xiansi2_log", event.target); + game.trySkillAudio("xiansi2", event.target, true); + var links = event.directresult || result.links; + target.loseToDiscardpile(links); + } + }, + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.05; + }, + }, + subSkill: { log: {} }, + }, + shibei: { + trigger: { player: "damageEnd" }, + forced: true, + audio: 2, + audioname: ["xin_jushou"], + check: function (event, player) { + return player.getHistory("damage").indexOf(event) == 0; + }, + content: function () { + if (player.getHistory("damage").indexOf(trigger) > 0) { + player.loseHp(); + } else { + player.recover(); + } + }, + subSkill: { + damaged: {}, + ai: {}, + }, + ai: { + maixie_defend: true, + threaten: 0.9, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing")) return; + if (target.hujia) return; + if (player._shibei_tmp) return; + if (target.hasSkill("shibei_ai")) return; + if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return; + if (get.tag(card, "damage")) { + if (target.getHistory("damage").length > 0) { + return [1, -2]; + } else { + if (get.attitude(player, target) > 0 && target.hp > 1) { + return 0; + } + if (get.attitude(player, target) < 0 && !player.hasSkillTag("damageBonus")) { + if (card.name == "sha") return; + var sha = false; + player._shibei_tmp = true; + var num = player.countCards("h", function (card) { + if (card.name == "sha") { + if (sha) { + return false; + } else { + sha = true; + } + } + return get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0; + }); + delete player._shibei_tmp; + if (player.hasSkillTag("damage")) { + num++; + } + if (num < 2) { + var enemies = player.getEnemies(); + if (enemies.length == 1 && enemies[0] == target && player.needsToDiscard()) { + return; + } + return 0; + } + } + } + } + }, + }, + }, + }, + shibei_old: { + audio: 2, + trigger: { player: "damageAfter" }, + forced: true, + content: function () { + "step 0"; + player.judge(function (card) { + if (player.hasSkill("shibei2")) { + if (get.color(card) == "black") return -1; + } else { + if (get.color(card) == "red") return 1; + } + return 0; + }); + "step 1"; + if (result.judge > 0) { + player.recover(); + } else if (result.judge < 0) { + player.loseHp(); + } + if (!player.hasSkill("shibei2")) { + player.addTempSkill("shibei2"); + } + }, + }, + shibei2: {}, + jianying: { + audio: 2, + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (typeof card == "object" && player.isPhaseUsing()) { + var evt = player.getLastUsed(); + if (evt && evt.card && ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || (evt.card.number && evt.card.number == get.number(card)))) { + return num + 10; + } + } + }, + }, + trigger: { player: "useCard" }, + frequent: true, + filter: function (event, player) { + var evt = player.getLastUsed(1); + if (!evt || !evt.card) return false; + if (!player.isPhaseUsing()) return false; + var evt2 = evt.getParent("phaseUse"); + if (!evt2 || evt2.name != "phaseUse" || evt2.player != player) return false; + return (get.suit(evt.card) != "none" && get.suit(evt.card) == get.suit(event.card)) || (typeof get.number(evt.card, false) == "number" && get.number(evt.card, false) == get.number(event.card)); + }, + content: function () { + player.draw(); + }, + group: "jianying_mark", + init: function (player) { + if (player.isPhaseUsing()) { + var evt = _status.event.getParent("phaseUse"); + var history = player.getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == evt; + }); + if (history.length) { + var trigger = history[history.length - 1]; + if (get.suit(trigger.card, player) == "none" || typeof get.number(trigger.card, player) != "number") return; + player.storage.jianying_mark = trigger.card; + player.markSkill("jianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML = get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); + player.when("phaseUseAfter").then(() => { + player.unmarkSkill("jianying_mark"); + delete player.storage.jianying_mark; + }); + } + } + }, + onremove: function (player) { + player.unmarkSkill("jianying_mark"); + delete player.storage.jianying_mark; + }, + subSkill: { + mark: { + charlotte: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return player.isPhaseUsing(); + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + if (get.suit(trigger.card, player) == "none" || typeof get.number(trigger.card, player) != "number") player.unmarkSkill("jianying_mark"); + else { + player.storage.jianying_mark = trigger.card; + player.markSkill("jianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML = get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); + player.when("phaseUseAfter").then(() => { + player.unmarkSkill("jianying_mark"); + delete player.storage.jianying_mark; + }); + } + }, + intro: { + markcount: function (card, player) { + var num = get.number(card, player); + var list = [1, 11, 12, 13]; + if (list.includes(num)) return ["A", "J", "Q", "K"][list.indexOf(num)]; + return parseFloat(num); + }, + content: function (card, player) { + var suit = get.suit(card, player); + var num = get.number(card, player); + var str = "
  • 上一张牌的花色:" + get.translation(suit); + str += "
  • 上一张牌的点数:"; + var list = [1, 11, 12, 13]; + if (list.includes(num)) str += ["A(1)", "J(11)", "Q(12)", "K(13)"][list.indexOf(num)]; + else str += parseFloat(num); + return str; + }, + }, + }, + }, + }, + zzhenggong: { + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return event.source && event.source.countCards("e") > 0; + }, + content: function () { + "step 0"; + var att = get.attitude(player, trigger.source); + player.gainPlayerCard("e", get.prompt("zzhenggong"), trigger.source).ai = function (button) { + if (att <= 0) { + return get.equipValue(button.link); + } + return 0; + }; + "step 1"; + if (result.bool) { + player.logSkill("zzhenggong", trigger.source); + var card = result.links[0]; + if (player.getCards("h").includes(card)) { + player.$give(card, player, false); + player.equip(card); + } + } + }, + ai: { + maixie_defend: true, + }, + }, + zquanji: { + trigger: { global: "phaseBegin" }, + //priority:15, + check: function (event, player) { + var att = get.attitude(player, event.player); + if (att < 0) { + var nh1 = event.player.countCards("h"); + var nh2 = player.countCards("h"); + return nh1 <= 2 && nh2 > nh1 + 1; + } + if (att > 0 && event.player.hasJudge("lebu") && event.player.countCards("h") > event.player.hp + 1) return true; + return false; + }, + logTarget: "player", + filter: function (event, player) { + return event.player != player && player.canCompare(event.player); + }, + content: function () { + "step 0"; + player.chooseToCompare(trigger.player); + "step 1"; + if (result.bool) { + trigger.player.skip("phaseZhunbei"); + trigger.player.skip("phaseJudge"); + } + }, + ai: { + expose: 0.2, + }, + }, + zbaijiang: { + skillAnimation: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + derivation: ["zyexin", "zzili", "zpaiyi"], + filter: function (event, player) { + return player.countCards("e") >= 2; + }, + content: function () { + player.awakenSkill("zbaijiang"); + player.gainMaxHp(); + player.changeSkills(["zyexin", "zzili"], ["zquanji", "zzhenggong"]); + }, + }, + zyexin: { + trigger: { player: "damageEnd", source: "damageSource" }, + marktext: "权", + frequent: true, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + content: function () { + player.addToExpansion("zyexin", get.cards(), "gain2").gaintag.add("zyexin"); + }, + group: "zyexin2", + }, + zyexin2: { + enable: "phaseUse", + usable: 1, + lose: false, + discard: false, + delay: false, + selectCard: [1, Infinity], + filterCard: true, + filter: function (event, player) { + return player.getExpansions("zyexin").length > 0; + }, + prompt: "用任意数量的手牌与等量的“权”交换", + content: function () { + "step 0"; + player.addToExpansion(cards, "give", player).gaintag.add("zyexin"); + "step 1"; + player.chooseCardButton(player.getExpansions("zyexin"), "选择" + get.cnNumber(cards.length) + "张牌作为手牌", cards.length, true).ai = function (button) { + return get.value(button.link); + }; + "step 2"; + player.gain(result.links, "gain2"); + }, + ai: { + order: 5, + result: { + player: 1, + }, + }, + }, + zzili: { + skillAnimation: true, + unique: true, + derivation: "zpaiyi", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getExpansions("zyexin").length >= 4; + }, + forced: true, + async content(e, t, player) { + player.awakenSkill("zzili"); + player.loseMaxHp(); + player.addSkills("zpaiyi"); + }, + // intro:{ + // content:'limited' + // } + }, + zpaiyi: { + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getExpansions("zyexin").length; + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseCardButton(get.prompt("zpaiyi"), player.getExpansions("zyexin")); + next.set("ai", function (button) { + return get.value(button.link); + }); + "step 1"; + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget(function (card, player, target) { + var card = _status.event.card; + var type = get.type(card); + switch (type) { + case "basic": + case "trick": + return true; + case "delay": + return target.canAddJudge(card); + case "equip": + return target.canEquip(card, true); + } + return true; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", card); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + var type = get.type(event.card), + target = result.targets[0]; + player.logSkill("zpaiyi", target); + switch (type) { + case "basic": + case "trick": + player.give(event.card, target, "give"); + break; + case "delay": + player.$give(event.card, target, false); + target.addJudge(event.card); + break; + case "equip": + player.$give(event.card, target, false); + target.equip(event.card); + } + if (player != result.targets[0]) { + player.chooseBool("是否摸一张牌?"); + } else event.finish(); + } else event.finish(); + "step 3"; + if (result.bool) player.draw(); + }, + ai: { + combo: "zyexin", + }, + }, +}; + +export default skills; diff --git a/character/yijiang/sort.js b/character/yijiang/sort.js new file mode 100644 index 000000000..d8dcb2459 --- /dev/null +++ b/character/yijiang/sort.js @@ -0,0 +1,27 @@ +const characterSort = { + yijiang_2011: ["caozhi", "yujin", "zhangchunhua", "xin_fazheng", "xin_masu", "xin_xushu", "xusheng", "lingtong", "wuguotai", "chengong", "gaoshun"], + yijiang_2012: ["wangyi", "xunyou", "zhonghui", "old_madai", "liaohua", "guanzhang", "bulianshi", "handang", "chengpu", "liubiao", "old_huaxiong", "caozhang"], + yijiang_2013: ["manchong", "guohuai", "caochong", "guanping", "liufeng", "jianyong", "yufan", "panzhangmazhong", "zhuran", "xin_liru", "fuhuanghou"], + yijiang_2014: ["hanhaoshihuan", "chenqun", "caozhen", "zhangsong", "wuyi", "zhoucang", "zhuhuan", "guyong", "sunluban", "yj_jushou", "caifuren"], + yijiang_2015: ["caoxiu", "caorui", "zhongyao", "xiahoushi", "liuchen", "zhangyi", "zhuzhi", "quancong", "sunxiu", "gongsunyuan", "guotufengji"], + yijiang_2016: ["guohuanghou", "sunziliufang", "huanghao", "liyan", "sundeng", "cenhun", "zhangrang", "liuyu"], + yijiang_2017: ["xinxianying", "jikang", "wuxian", "qinmi", "xuezong", "xushi", "caiyong", "caojie"], + yijiang_2022: ["lukai", "kebineng", "zhugeshang", "liwan", "wuanguo", "hanlong", "yj_sufei", "yj_qiaozhou"], + yijiang_2023: ["xiahoumao", "chenshi", "sunli", "feiyao"], + yijiang_2024: ["linghuyu", "yj_simafu", "yj_xuangongzhu", "xukun"], +}; + +const characterSortTranslate = { + yijiang_2011: "一将成名2011", + yijiang_2012: "一将成名2012", + yijiang_2013: "一将成名2013", + yijiang_2014: "一将成名2014", + yijiang_2015: "一将成名2015", + yijiang_2016: "原创设计2016", + yijiang_2017: "原创设计2017", + yijiang_2022: "原创设计2022", + yijiang_2023: "一将成名2023", + yijiang_2024: "一将成名2024", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/yijiang/translate.js b/character/yijiang/translate.js new file mode 100644 index 000000000..5f9d3d14b --- /dev/null +++ b/character/yijiang/translate.js @@ -0,0 +1,659 @@ +const translates = { + old_huaxiong: "将华雄", + old_huaxiong_prefix: "将", + yufan: "虞翻", + xushu: "旧徐庶", + xushu_prefix: "旧", + caozhi: "曹植", + zhangchunhua: "张春华", + lingtong: "凌统", + xunyou: "荀攸", + liubiao: "刘表", + zhuran: "朱然", + yujin: "于禁", + masu: "旧马谡", + masu_prefix: "旧", + xin_masu: "马谡", + xin_fazheng: "法正", + wuguotai: "吴国太", + chengong: "陈宫", + xusheng: "徐盛", + guohuai: "郭淮", + caochong: "曹冲", + bulianshi: "步练师", + handang: "韩当", + fuhuanghou: "伏寿", + caifuren: "蔡夫人", + zhonghui: "钟会", + old_zhonghui: "旧钟会", + old_zhonghui_prefix: "旧", + sunluban: "孙鲁班", + chenqun: "陈群", + zhangsong: "张松", + guyong: "顾雍", + jianyong: "简雍", + old_madai: "马岱", + gz_madai: "马岱", + xin_xushu: "徐庶", + manchong: "满宠", + liufeng: "刘封", + liru: "旧李儒", + liru_prefix: "旧", + yj_jushou: "沮授", + zhuhuan: "朱桓", + xiahoushi: "夏侯氏", + panzhangmazhong: "潘璋马忠", + caorui: "曹叡", + caoxiu: "曹休", + zhongyao: "钟繇", + liuchen: "刘谌", + zhangyi: "张嶷", + sunxiu: "孙休", + zhuzhi: "朱治", + quancong: "全琮", + gongsunyuan: "公孙渊", + guotufengji: "郭图逢纪", + zhoucang: "周仓", + guanping: "关平", + liaohua: "廖化", + caozhen: "曹真", + wuyi: "吴懿", + hanhaoshihuan: "韩浩史涣", + chengpu: "程普", + gaoshun: "高顺", + xin_liru: "李儒", + guohuanghou: "郭皇后", + liuyu: "刘虞", + sundeng: "孙登", + liyan: "李严", + sunziliufang: "孙资刘放", + huanghao: "黄皓", + zhangrang: "张让", + cenhun: "岑昏", + xinxianying: "辛宪英", + wuxian: "吴苋", + xushi: "徐氏", + caojie: "曹节", + xuezong: "薛综", + jikang: "嵇康", + qinmi: "秦宓", + caiyong: "蔡邕", + + new_qingxian: "清弦", + new_qingxian_info: "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", + new_juexiang: "绝响", + new_juexiang_info: "锁定技,当你死亡后,杀死你的角色弃置装备区内的所有牌并失去1点体力。然后,你可以令一名其他角色获得技能〖残韵〗。若该角色区域内有梅花牌,则其可以弃置其中的一张,然后其获得技能〖绝响〗。", + new_canyun: "残韵", + new_canyun_info: "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色(不能选择已经成为过〖残韵〗目标的角色)。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", + qingxian_draw: "清弦", + qingxian_draw_info: "", + zhenjun: "镇军", + zhenjun_info: "准备阶段,你可以弃置一名手牌数多于体力值的角色的X张牌(X为其手牌数和体力值之差),然后选择一项:1.你弃置等同于其中非装备牌数量的牌;2.其摸等量的牌。", + rezhenjun: "镇军", + rezhenjun_info: "准备阶段,你可以弃置一名角色的X张牌(X为其手牌数和体力值之差且至少为1),然后选择一项:1.你弃置X张牌;2.其摸X张牌。(X为其弃置的牌中非装备牌的数量)", + fenli: "奋励", + fenli_info: "若你的手牌数为全场最多,你可以跳过摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。", + pingkou: "平寇", + pingkou_info: "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。", + xinanguo: "安国", + xinanguo_info: "出牌阶段限一次,你可以选择一名其他角色,若其手牌数为全场最少,其摸一张牌;体力值为全场最低,回复1点体力;装备区内牌数为全场最少,随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。", + pindi: "品第", + pindi_info: "出牌阶段,你可以弃置一张牌并选择一名其他角色(不能弃置相同类型牌且不能指定相同的角色),然后令其执行一项:摸X张牌;弃置X张牌(X为本回合此技能发动次数)。若其已受伤,你横置。", + funan_jiexun: "诫训", + bizhuan: "辟撰", + bizhuan_bg: "书", + bizhuan_info: "当你使用黑桃牌后,或你成为其他角色使用黑桃牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”;你至多拥有四张“书”,你每有一张“书” ,手牌上限+1。", + tongbo: "通博", + tongbo_info: "摸牌阶段摸牌后,你可以用任意张牌替换等量的“书”,然后若你的“书”包含四种花色,你将所有“书”交给任意名其他角色。", + qingxian: "清弦", + qingxian_info: "当你受到伤害/回复体力后,你可以令伤害来源/一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你摸一张牌。", + juexiang: "绝响", + juexiang_info: "当你死亡后,你可以令一名角色随机获得“清弦残谱”其中一个技能,然后直到其下回合开始,其不能被选择为其他角色使用梅花牌的目标。", + juexiang_ji: "激弦", + juexiang_ji_info: "当你受到伤害后,你可以令伤害来源失去1点体力,随机使用一张装备。", + juexiang_lie: "烈弦", + juexiang_lie_info: "当你回复体力后,你可以令一名其他角色失去1点体力,随机使用一张装备。", + juexiang_rou: "柔弦", + juexiang_rou_info: "当你受到伤害后,你可以令伤害来源回复1点体力,弃置一张装备。", + juexiang_he: "和弦", + juexiang_he_info: "当你回复体力后,你可以令一名其他角色回复1点体力,弃置一张装备。", + juexiang_club: "绝响", + juexiang_club_bg: "响", + juexiang_club_info: "直到下回合开始,不能被选择为其他角色使用梅花牌的目标。", + jianzheng: "谏征", + jianzheng_info: "当一名其他角色使用【杀】指定目标时,若你在其攻击范围内且你不是目标,则你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。", + zhuandui: "专对", + zhuandui_info: "当你使用【杀】指定目标/成为【杀】的目标后,你可以与目标角色/此【杀】使用者拼点,若你赢,此杀不能被【闪】响应/对你无效。", + zhuandui_use_info: "当你使用【杀】指定目标后,你可以与目标角色拼点,若你赢,此杀不能被【闪】响应。", + zhuandui_respond_info: "当你成为【杀】的目标后,你可以与此【杀】使用者拼点,若你赢,此杀对你无效。", + tianbian: "天辩", + tianbian_info: "你拼点时,可以改为用牌堆顶的一张牌进行拼点;当你拼点的牌亮出后,若此牌花色为红桃,则此牌的点数视为K。", + funan: "复难", + funan_info: "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。", + jiexun: "诫训", + jiexun_info: "结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你失去〖诫训〗,然后你发动〖复难〗时,无须令对方获得你使用的牌。", + xinjiexun: "诫训", + xinjiexun_info: "结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你将X归零,然后你发动〖复难〗时,无须令对方获得你使用的牌。", + shouxi: "守玺", + shouxi_info: "当你成为【杀】的目标后,你可声明一种未以此法声明过的基本牌或锦囊牌的牌名。若使用者弃置一张你声明的牌,其获得你的一张牌;若否,则此【杀】对你无效。", + huimin: "惠民", + huimin_info: "结束阶段,你可以摸X张牌并展示等量手牌(X为手牌数小于其体力值的角色数),然后从你指定的一名角色开始这些角色依次选择并获得其中一张。", + wengua: "问卦", + wengua2: "问卦", + wengua_info: "其他角色/你的出牌阶段限一次,其可以交给你一张牌,(若当前回合角色为你,则跳过此步骤),你可以将此牌/一张牌置于牌堆顶或牌堆底,然后你与其/你从另一端摸一张牌。", + fuzhu: "伏诛", + fuzhu_info: "一名男性角色的结束阶段,若牌堆剩余牌数不大于你体力值的十倍,则你可以依次对其使用牌堆中所有的【杀】(不能超过游戏人数),然后洗牌。", + fumian: "福绵", + fumian_info: "准备阶段,你可以选择一项:1.摸牌阶段多摸一张牌;2.使用红色牌可以多选择一个目标(限一次)。若与你上回合选择的选项不同,则该选项数值+1并复原此技能。", + daiyan: "怠宴", + daiyan_info: "结束阶段,你可以令一名其他角色从牌堆中获得一张红桃基本牌,然后若其于上回合成为过该技能目标,则其失去1点体力。", + xinzhongjian: "忠鉴", + xinzhongjian_info: "出牌阶段限一次,你可以展示自己的一张手牌,然后展示一名其他角色的至多三张手牌。其展示的牌中:每有一张花色相同,你摸一张牌;点数相同,你对其造成1点伤害;均不同,你弃置一张手牌。", + zhongjian: "忠鉴", + zhongjian_bg: "鉴", + zhongjian3: "忠鉴", + zhongjian3_bg: "鉴", + zhongjian_info: "出牌阶段限一次,你可以展示一张手牌,然后展示一名其他角色的X张手牌(X为其体力值)。若以此法展示的牌与你展示的牌:有颜色相同的,你选择:①摸一张牌。②弃置一名其他角色的一张牌;有点数相同的,本回合此技能改为“出牌阶段限两次”;均不同,你的手牌上限-1。", + caishi: "才识", + caishix: "才识/忠鉴", + caishi_info: "摸牌阶段开始时,你可以选择一项:1.令手牌上限+1;2.回复1点体力,本回合内不能对自己使用牌。", + xincaishi: "才识", + xincaishi_info: "摸牌阶段,你可以选择一项:1.少摸一张牌,然后本回合发动〖忠鉴〗时可以多展示自己的一张牌;2.本回合手牌上限-1,然后本回合发动〖忠鉴〗时可以多展示对方的一张牌;3.多摸两张牌,本回合不能发动〖忠鉴〗。", + guizao: "瑰藻", + guizao_info: "弃牌阶段结束时,若你于此阶段弃置牌的数量不小于2且它们的花色各不相同,你可以回复1点体力或摸一张牌。", + jiyu: "讥谀", + jiyu_info: "出牌阶段限一次,你可以令一名角色弃置一张手牌。若如此做,你不能使用与之相同花色的牌,直到回合结束。若其以此法弃置的牌为黑桃,你翻面并令其失去1点体力。若你有未被〖讥谀〗限制的手牌,则你可以继续发动此技能,但不能选择本回合已经选择过的目标。", + qinqing: "寝情", + qinqing_info: "结束阶段,你可以选择任意名攻击范围内含有主公的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比主公多的角色数)。", + qinqing_info_doudizhu: "结束阶段,你可以选择任意名攻击范围内含有地主的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比地主多的角色数)。", + huisheng: "贿生", + huisheng_info: "当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张,防止此伤害,然后你不能再对其发动〖贿生〗;2.弃置等量的牌。", + jishe: "极奢", + jishe2: "极奢", + jishe_info: "①出牌阶段限20次,若你的手牌上限大于0,你可以摸一张牌,然后你本回合的手牌上限-1。②结束阶段开始时,若你没有手牌,则你可以横置至多X名角色的武将牌(X为你的体力值)。", + lianhuo: "链祸", + lianhuo_info: "锁定技,当你受到火焰伤害时,若你的武将牌处于横置状态且此伤害不为连环伤害,则此伤害+1。", + taoluan: "滔乱", + taoluan_backup: "滔乱", + taoluan_info: "你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力且〖滔乱〗无效直到回合结束。", + xintaoluan: "滔乱", + xintaoluan_backup: "滔乱", + xintaoluan_info: "若场上没有濒死的角色,则你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本回合内你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你X张与你以此法使用的牌类别不同的牌;2.你失去X点体力且滔乱无效直到回合结束(X为你本回合内发动过〖滔乱〗的次数且至多为3)。", + jiaozhao: "矫诏", + jiaozhao3: "矫诏", + jiaozhao3_backup: "矫诏", + jiaozhao2: "矫诏", + jiaozhao_info: "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌)。", + danxin: "殚心", + danxin_info: "当你受到伤害后,你可以摸一张牌,或对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。", + xindanxin: "殚心", + xindanxin_info: "当你受到伤害后,你可以摸一张牌,并对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。3.将“出牌阶段限一次”改为“出牌阶段限两次”。", + duliang: "督粮", + duliang2: "督粮", + duliang_info: "出牌阶段限一次,你可以获得一名其他角色的一张手牌,然后选择一项:1.令其观看牌堆顶的两张牌,然后获得其中的基本牌;2.令其于下个摸牌阶段额外摸一张牌。", + fulin: "腹鳞", + fulin_info: "锁定技,你于回合内得到的牌不计入你本回合的手牌上限。", + kuangbi: "匡弼", + kuangbi_info: "出牌阶段限一次,你可以选择一名有牌的其他角色,该角色将其的一至三张牌置于你的武将牌上。若如此做,你的下个准备阶段,你获得武将牌上的所有牌,然后其摸等量的牌。", + xinzhige: "止戈", + xinzhige_info: "出牌阶段限一次,你可以令一名攻击范围内含有你的其他角色交给你一张【杀】或武器牌,否则其视为对你指定的另一名其攻击范围内的角色使用了一张【杀】。", + zhige: "止戈", + zhige_info: "出牌阶段限一次,若你的手牌数大于你的体力值,你可以选择攻击范围内含有你的一名其他角色,其选择一项:1.使用一张【杀】;2.将装备区里的一张牌交给你。", + xinzongzuo: "宗祚", + xinzongzuo_info: "锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限并摸两张牌。", + zongzuo: "宗祚", + zongzuo_info: "锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限。", + xinjuece: "绝策", + xinjuece_info: "结束阶段,你可以对一名没有手牌的角色造成1点伤害。", + xinmieji: "灭计", + xinmieji_info: "出牌阶段限一次,你可以展示一张黑色锦囊牌并将之置于牌堆顶,然后令有手牌的一名其他角色选择一项:弃置一张锦囊牌;或依次弃置两张非锦囊牌。", + xinfencheng: "焚城", + xinfencheng_info: "限定技。出牌阶段,你可以令所有其他角色各选择一项:弃置至少X张牌(X为该角色的上家以此法弃置牌的数量+1);或受到你对其造成的2点火焰伤害。", + qianju: "千驹", + qianju_info: "锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值)。", + qingxi: "倾袭", + qingxi_info: "当你使用【杀】对目标角色造成伤害时,若你的装备区里有武器牌,你可以令其选择一项:1、弃置X张手牌(X为此武器牌的攻击范围),若如此做,其弃置你的此武器牌;2、令伤害值+1。", + reqianju: "千驹", + reqianju_info: "锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值且至少为1)。", + reqingxi: "倾袭", + reqingxi_info: "当你使用【杀】或【决斗】指定目标后,你可以令其选择一项:1、弃置X张手牌(X为你攻击范围内的角色数,且当你装备区内有武器牌/没有武器牌时至多为4/2),若如此做,其弃置你的此武器牌;2、令此牌的伤害值+1且你进行判定,若结果为红色,则其不能响应此牌。", + jieyue: "节钺", + jieyue_info: "①结束阶段,你可以弃置一张手牌,然后令一名其他角色选择一项:1.将一张牌置于你的武将牌上,称之为“节”;2.令你弃置其一张牌。②若你有“节”,你可以将红色/黑色手牌当作【闪】/【无懈可击】使用或打出。③准备阶段,若你有“节”,则你获得之。", + xianzhen: "陷阵", + xianzhen_info: "出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视与该角色的距离;无视该角色的防具且对其使用【杀】没有次数限制。若你没赢,你不能使用【杀】直到回合结束。", + xinxianzhen: "陷阵", + xinxianzhen_info: "出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标。若你没赢,你不能使用【杀】且你的【杀】不计入手牌上限直到回合结束。", + xinxianzhen2: "陷阵", + jinjiu: "禁酒", + jinjiu_info: "锁定技,你的【酒】均视为【杀】。", + chunlao: "醇醪", + chunlao2: "醇醪", + chunlao_info: "结束阶段开始时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】。", + lihuo: "疠火", + lihuo_info: "当你声明使用普通【杀】后,你可以将此【杀】改为火【杀】。若以此法使用的【杀】造成了伤害,则此【杀】结算后你失去1点体力;你使用火【杀】选择目标后,可以额外指定一个目标。", + shenduan: "慎断", + shenduan_info: "当你的黑色基本牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。", + yonglve: "勇略", + yonglve_info: "一名其他角色的判定阶段开始时,若其在你攻击范围内,则你可以弃置其判定区里的一张牌,视为对该角色使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。", + reshenduan: "慎断", + reshenduan_info: "当你的黑色基本牌或装备牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。", + reyonglve: "勇略", + reyonglve_info: "其他角色的判定阶段开始时,你可以弃置其判定区里的一张牌。然后若该角色在你攻击范围内,你摸一张牌。若其在你攻击范围外,视为你对其使用一张【杀】。", + benxi: "奔袭", + benxi_info: "锁定技,你的回合内,你每使用一次牌后,你的进攻距离+1直到回合结束;你的回合内,若你与所有角色的距离均为1,你无视其他角色的防具,且你使用的【杀】可额外指定一个目标。", + xinbenxi: "奔袭", + xinbenxi_info: "锁定技,当你于回合内使用牌时,你本回合计算与其他角色的距离-1。你的回合内,若你至场上所有其他角色的距离均不大于1,则当你使用【杀】或普通锦囊牌选择唯一目标后,你选择至多两项:1.为此牌多指定一个目标;2.令此牌无视防具;3.令此牌不可被抵消;4.此牌造成伤害时摸一张牌。", + sidi: "司敌", + sidi2: "司敌", + sidi3: "司敌", + sidi_info: "①当你使用或其他角色在你的回合内使用【闪】时,你可以将牌堆顶的牌置于你的武将牌上,称为“司敌”牌。②其他角色的出牌阶段开始时,你可以移去一张“司敌”牌,令其本阶段使用【杀】的次数上限-1。", + xinsidi: "司敌", + xinsidi2: "司敌", + xinsidi_info: "其他角色出牌阶段开始时,你可以弃置一张与你装备区里的牌颜色相同的非基本牌,然后该角色于此阶段内不能使用和打出与此牌颜色相同的牌。此阶段结束时,若其此阶段没有使用【杀】,视为你对其使用了【杀】。", + dangxian: "当先", + dangxian_info: "锁定技,回合开始时,你执行一个额外的出牌阶段。", + xindangxian: "当先", + xindangxian_info: "锁定技,回合开始时,你执行一个额外的出牌阶段。此阶段开始时,你失去1点体力并从牌堆/弃牌堆中获得一张【杀】(若你已发动过〖伏枥〗,则可以不发动此效果)。", + longyin: "龙吟", + longyin_info: "当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数,若此【杀】为红色,你摸一张牌。", + zhongyong: "忠勇", + zhongyong_info: "当你于出牌阶段内使用的【杀】被目标角色使用的【闪】抵消时,你可以将此【闪】交给除该角色外的一名角色。若获得此【闪】的角色不是你,你可以对相同的目标再使用一张【杀】。", + xinzhongyong: "忠勇", + xinzhongyong_info: "当你使用的【杀】结算完毕后,你可以将此【杀】或目标角色使用的【闪】交给一名该角色以外的其他角色,以此法得到红色牌的角色可以对你攻击范围内的角色使用一张【杀】。", + jigong: "急攻", + jigong_info: "出牌阶段开始时,你可以摸两张牌。若如此做,你本回合的手牌上限改为X(X为你此阶段造成的伤害点数之和)。", + shifei: "饰非", + shifei_info: "当你需要使用或打出【闪】时,你可以令当前回合角色摸一张牌。然后若其手牌数不为全场唯一最多,则你弃置全场手牌数最多(或之一)角色的一张牌,视为你使用或打出了一张【闪】。", + huaiyi: "怀异", + huaiyi_info: "出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。", + yaoming: "邀名", + yaoming_info: "每回合限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置手牌数大于你的一名角色的一张手牌;2. 令手牌数小于你的一名角色摸一张牌。", + xinyaoming: "邀名", + xinyaoming_info: "每回合每个选项限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置一名其他角色的一张手牌;2. 令一名其他角色摸一张牌;3.令一名角色弃置至多两张牌,然后摸等量的牌。", + anguo: "安国", + anguo_info: "出牌阶段限一次,你可以选择一名其他角色装备区里的一张牌,令其获得此牌。然后若该角色攻击范围内的角色数因此减少,则你摸一张牌。", + yanzhu: "宴诛", + yanzhu_info: "出牌阶段限一次,你可以令一名有牌的其他角色选择一项:令你获得其装备区里所有的牌,然后你失去技能〖宴诛〗;或弃置一张牌。", + xingxue: "兴学", + xingxue_info: "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值,若你已失去技能〖宴诛〗,则将X改为你的体力上限)。", + zhaofu: "诏缚", + zhaofu_info: "主公技,锁定技,你距离为1的角色视为在其他吴势力角色的攻击范围内。", + reyanzhu: "宴诛", + reyanzhu2: "宴诛", + reyanzhu_info: "出牌阶段限一次,你可以令一名其他角色选择一项:将装备区里的所有牌交给你并令你修改〖宴诛〗和〖兴学〗,或弃置一张牌并令下一次受到的伤害+1直到其下回合开始。", + reyanzhu_rewrite: "宴诛·改", + reyanzhu_rewrite_info: "出牌阶段限一次,你可以选择一名其他角色。该角色下一次受到的伤害+1直到其下回合开始。", + rexingxue: "兴学", + rexingxue_info: "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力值)。", + rexingxue_rewrite: "兴学·改", + rexingxue_rewrite_info: "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力上限)。", + rezhaofu: "诏缚", + rezhaofu_info: "主公技,锁定技,你攻击范围内的角色视为在其他吴势力角色的攻击范围内。", + wurong: "怃戎", + wurong_info: "出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你弃置此【杀】并对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你弃置你展示的牌并获得其一张牌。", + shizhi: "矢志", + shizhi_info: "锁定技,当你的体力值为1时,你的【闪】均视为【杀】。", + zhanjue: "战绝", + zhanjue_info: "出牌阶段,你可以将所有手牌当作【决斗】使用。此【决斗】结算后,你与以此法受到伤害的角色各摸一张牌。若你在同一阶段内以此法摸了两张或更多的牌,则此技能失效直到回合结束。", + qinwang: "勤王", + qinwang1: "勤王", + qinwang2: "勤王", + qinwang_info: "主公技,当你需要使用或打出一张【杀】时,你可以弃置一张牌,然后视为你发动了〖激将①〗。若有角色响应,则该角色打出【杀】时摸一张牌。", + huomo: "活墨", + huomo_info: "当你需要使用一张本回合内未使用过的基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。", + zuoding: "佐定", + zuoding_info: "当其他角色于其回合内使用♠牌指定目标后,若本回合内没有角色受到过伤害,则你可以令其中一名目标角色摸一张牌。", + taoxi: "讨袭", + taoxi2: "讨袭", + taoxi3: "讨袭", + taoxi_info: "出牌阶段限一次。当你使用牌指定一名其他角色为唯一目标后,你可以亮出其一张手牌直到回合结束,并且你于此回合内可以将此牌如手牌般使用。回合结束时,若此牌仍在该角色手牌区里,你失去1点体力。", + huituo: "恢拓", + huituo_info: "当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害点数)。", + mingjian: "明鉴", + mingjian2: "明鉴", + mingjian_info: "出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。", + xingshuai: "兴衰", + xingshuai_info: "主公技,限定技,当你进入濒死状态时,其他魏势力角色可依次令你回复1点体力,然后这些角色依次受到1点伤害。", + reduodao: "夺刀", + reduodao_info: "当你成为【杀】的目标后,你可以弃置一张牌。然后你获得此【杀】使用者装备区里的武器牌。", + reanjian: "暗箭", + reanjian_info: "锁定技,当你使用【杀】指定目标后,若你不在其攻击范围内,则此杀伤害+1且无视其防具。若其因执行此【杀】的效果受到伤害而进入濒死状态,则其不能使用【桃】直到此濒死事件结算结束。", + duodao: "夺刀", + duodao_info: "当你受到【杀】造成的伤害后,你可以弃置一张牌,然后获得伤害来源装备区里的武器牌。", + anjian: "暗箭", + anjian_info: "锁定技,当你使用【杀】对目标角色造成伤害时,若你不在其攻击范围内,则此杀伤害+1。", + xinpojun: "破军", + xinpojun2: "破军", + xinpojun_info: "当你于出牌阶段内使用【杀】指定一个目标后,你可以将其至多X张牌扣置于该角色的武将牌旁(X为其体力值)。若如此做,当前回合结束后,该角色获得其武将牌旁的所有牌。", + + qiaoshi: "樵拾", + qiaoshi_info: "其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。", + yanyu: "燕语", + yanyu2: "燕语", + yanyu_info: "出牌阶段,你可以重铸【杀】。出牌阶段结束时,若你于此阶段以此法重铸了至少两张【杀】,则你可以令一名男性角色摸两张牌。", + + zzhenggong: "争功", + zzhenggong_info: "当你受到伤害后,你可以获得伤害来源装备区里的一张牌并置入你的装备区。", + zquanji: "权计", + zquanji_info: "其他角色的回合开始时,你可以与该角色拼点。若你赢,该角色跳过准备阶段和判定阶段。", + zbaijiang: "拜将", + zbaijiang_info: "觉醒技。准备阶段,若你装备区里的牌数不少于两张,你加1点体力上限,失去〖权计〗和〖争功〗,获得〖野心〗和〖自立〗。", + zyexin: "野心", + zyexin2: "野心", + zyexin_info: "①当你造成或受到伤害后,你可以将牌堆顶的一张牌置于你的武将牌上,称为“权”。②出牌阶段限一次。你可以用任意数量的手牌与等量的“权”交换。", + zzili: "自立", + zzili_info: "觉醒技。准备阶段,若你的“权”数不小于4,你减1点体力上限并获得〖排异〗。", + zpaiyi: "排异", + zpaiyi_info: "结束阶段,你可以选择一张“权”,若此牌为:装备牌,你将此牌置入一名角色的装备区;延时类锦囊牌,你将此牌置入一名角色的判定区;基本牌或普通锦囊牌,你将此牌交给一名角色。然后若此牌的目标区域对应的角色不为你,你可以摸一张牌。", + shibei: "矢北", + shibei_info: "锁定技,当你受到伤害后:若此伤害是你本回合第一次受到的伤害,则你回复1点体力;否则你失去1点体力。", + jianying: "渐营", + jianying_info: "当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。", + xinenyuan: "恩怨", + xinenyuan1: "恩怨", + xinenyuan2: "恩怨", + xinenyuan_info: "当你获得一名其他角色两张或更多的牌后,你可以令其摸一张牌;当你受到1点伤害后,你可以令伤害来源选择一项:1、将一张手牌交给你;2、失去1点体力。", + xinxuanhuo: "眩惑", + xinxuanhuo_info: "摸牌阶段开始时,你可以改为令一名其他角色摸两张牌,然后该角色需对其攻击范围内你选择的另一名角色使用一张【杀】,否则你获得其两张牌。", + fuhun: "父魂", + fuhun2: "父魂", + fuhun_info: "你可以将两张手牌当做【杀】使用或打出;当你于出牌阶段以此法使用的【杀】造成伤害后,你获得〖武圣〗和〖咆哮〗直到回合结束。", + yuce: "御策", + yuce_info: "当你受到伤害后,你可以展示一张手牌,并令伤害来源选择一项:弃置一张与此牌类型不同的手牌,或令你回复1点体力。", + xiansi: "陷嗣", + xiansix: "陷嗣", + xiansi_bg: "逆", + xiansi2: "陷嗣", + xiansi_info: "准备阶段开始时,你可以将一至两名角色的各一张牌置于你的武将牌上,称为“逆”;当一名角色需要对你使用【杀】时,其可以移去两张“逆”,然后视为对你使用了一张【杀】。", + chanhui: "谮毁", + chanhui_info: "出牌阶段限一次,当你使用【杀】或黑色普通锦囊牌指定唯一目标时,你可令可以成为此牌目标的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标。", + rechanhui: "谮毁", + rechanhui_info: "当你使用【杀】或普通锦囊牌指定唯一目标时,你可令可以成为此牌目标(无距离限制)的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标且你本回合内不能再次发动〖谮毁〗。", + jiaojin: "骄矜", + jiaojin_info: "当你受到男性角色造成的伤害时,你可以弃置一张装备牌,令此伤害-1。", + rejiaojin: "骄矜", + rejiaojin_info: "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以弃置一张装备牌,令此牌对你无效并获得此牌对应的所有实体牌。若此牌的使用者为女性角色,则你令〖骄矜〗失效直到回合结束。", + shenxing: "慎行", + shenxing_info: "出牌阶段,你可以弃置两张牌,然后摸一张牌。", + bingyi: "秉壹", + bingyi_info: "结束阶段开始时,你可以展示所有手牌,若这些牌颜色均相同,则你令至多X名角色各摸一张牌(X为你的手牌数)。", + qiangzhi: "强识", + qiangzhi_draw: "强识", + qiangzhi_info: "出牌阶段开始时,你可以展示一名其他角色的一张手牌。若如此做,当你于此阶段内使用与此牌类别相同的牌时,你可以摸一张牌。", + xiantu: "献图", + xiantu2: "献图", + xiantu3: "献图", + xiantu_info: "一名其他角色的出牌阶段开始时,你可以摸两张牌,然后交给其两张牌。若如此做,此阶段结束时,若该角色未于此阶段内杀死过角色,则你失去1点体力。", + dingpin: "定品", + dingpin_info: "出牌阶段,你可以弃置一张手牌,然后令一名已受伤的角色判定,若结果为黑色,该角色摸X张牌(X为该角色已损失的体力值),然后你本回合不能再对其发动〖定品〗;若结果为红色,你翻面(你不能弃置本回合已弃置或使用过的类型的牌)。", + faen: "法恩", + faen_info: "当一名角色翻至正面或横置后,你可以令其摸一张牌。", + jyzongshi: "纵适", + jyzongshi_info: "当你拼点赢时,你可以获得对方此次拼点的牌;当你拼点没赢时,你可以收回你此次拼点的牌。", + qiaoshui: "巧说", + qiaoshui3: "巧说", + qiaoshui_info: "出牌阶段开始时,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你不能使用锦囊牌直到回合结束。", + reqiaoshui: "巧说", + reqiaoshui_info: "出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你结束出牌阶段且本回合内锦囊牌不计入手牌上限。", + junxing: "峻刑", + junxing_info: "出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面再摸X张牌(X为你以此法弃置的手牌数量)。", + xinjunxing: "峻刑", + xinjunxing_info: "出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面,然后将手牌摸至四张。", + + xswuyan: "无言", + xinwuyan: "无言", + jujian: "举荐", + xinjujian: "举荐", + luoying: "落英", + luoying_discard: "落英", + luoying_judge: "落英", + luoying_judge_noconf: "落英·判定", + jiushi: "酒诗", + jiushi1: "酒诗", + jiushi2: "酒诗", + jiushi3: "酒诗", + jueqing: "绝情", + shangshi: "伤逝", + xuanfeng: "旋风", + zhiyu: "智愚", + qice: "奇策", + qice_backup: "奇策", + jiangchi: "将驰", + jiangchi_less: "少摸一张", + jiangchi_more: "多摸一张", + zishou: "自守", + zongshi: "宗室", + danshou: "胆守", + olddanshou: "胆守", + xindanshou: "胆守", + yizhong: "毅重", + xinzhan: "心战", + xinzhan_gain: "获得", + xinzhan_place: "牌堆顶", + huilei: "挥泪", + enyuan: "恩怨", + enyuan1: "恩怨", + enyuan2: "恩怨", + xuanhuo: "眩惑", + ganlu: "甘露", + buyi: "补益", + mingce: "明策", + zhichi: "智迟", + zhichi2: "智迟", + pojun: "破军", + jingce: "精策", + xinjingce: "精策", + chengxiang: "称象", + oldchengxiang: "称象", + renxin: "仁心", + oldrenxin: "仁心", + zhenlie: "贞烈", + miji: "秘计", + miji_tag: "已分配", + zhiyan: "直言", + zongxuan: "纵玄", + anxu: "安恤", + old_anxu: "安恤", + zhuiyi: "追忆", + gongji: "弓骑", + qiuyuan: "求援", + oldqiuyuan: "求援", + zhuikong: "惴恐", + oldzhuikong: "惴恐", + qieting: "窃听", + xianzhou: "献州", + quanji: "权计", + zili: "自立", + paiyi: "排异", + paiyi_backup: "排异", + sanyao: "散谣", + olsanyao: "散谣", + olsanyao_backup: "散谣", + zhiman: "制蛮", + resanyao: "散谣", + rezhiman: "制蛮", + qianxi: "潜袭", + qianxi2: "潜袭", + qianxi2_bg: "袭", + fuli: "伏枥", + xinfuli: "伏枥", + jiefan: "解烦", + juece: "绝策", + mieji: "灭计", + fencheng: "焚城", + youdi: "诱敌", + youdi_info: "结束阶段开始时,你可以令一名其他角色弃置你的一张牌,若此牌不为【杀】,你获得该角色的一张牌。", + fencheng_info: "限定技。出牌阶段,你可令所有其他角色依次选择一项:弃置X张牌;或受到1点火焰伤害。(X为该角色装备区里牌的数量且至少为1)", + mieji_info: "当你使用黑色普通锦囊牌选择目标后,若目标数为1,则你可以额外指定一个目标。", + juece_info: "当其他角色在你回合内失去最后的手牌后,你可以对其造成1点伤害。", + jiefan_info: "限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。", + fuli_info: "限定技,当你处于濒死状态时,你可以将体力回复至与场上势力数相同,然后翻面。", + xinfuli_info: "限定技,当你处于濒死状态时,可以将体力回复至X点并将手牌摸至X张(X为场上势力数)。若X大于2,你翻面。", + qianxi_info: "准备阶段,你可以摸一张牌,并弃置一张牌,然后令一名距离为1的角色不能使用或打出与你弃置的牌颜色相同的手牌直到回合结束。", + zhiman_info: "当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其装备区或判定区的一张牌。", + sanyao_info: "出牌阶段限一次,你可以弃置一张牌并指定一名体力值最多(或之一)的角色,你对其造成1点伤害。", + olsanyao_info: "出牌阶段每项各限一次,你可以弃置一张牌并指定一名体力值或手牌数最多(或之一)的角色,并对其造成1点伤害。", + rezhiman_info: "当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其区域内的一张牌。", + resanyao_info: "出牌阶段限一次,你可以弃置任意张牌并指定等量除你外体力值最多(或之一)的其他角色。你对这些角色依次造成1点伤害。", + paiyi_info: "出牌阶段限一次,你可以移去一张“权”并选择一名角色,令其摸两张牌,然后若其手牌数大于你,你对其造成1点伤害。", + zili_info: "觉醒技,准备阶段开始时,若“权”的数量不小于3,你减1点体力上限,然后选择一项:1、回复1点体力;2、摸两张牌。然后你获得技能“排异”。", + quanji_info: "当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。", + xianzhou_info: "限定技。出牌阶段,你可以将装备区内的所有牌交给一名其他角色,然后该角色选择一项:令你回复X点体力;或对其攻击范围内的X名角色各造成1点伤害(X为你以此法交给该角色的牌的数量)。", + qieting_info: "其他角色的回合结束时,若其未于此回合内使用过指定其他角色为目标的牌,你可以选择一项:将其装备区里的一张牌移动至你装备区里的相应位置;或摸一张牌。", + zhuikong_info: "其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色本回合使用的牌不能指定除该角色外的角色为目标。若你没赢,其本回合至你的距离视为1。", + oldzhuikong_info: "其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色跳过本回合的出牌阶段。若你没赢,其本回合至你的距离视为1。", + qiuyuan_info: "当你成为【杀】的目标时,你可以令一名其他角色选择一项:①、交给你一张【闪】;②、成为此【杀】的额外目标。", + oldqiuyuan_info: "当你成为【杀】的目标时,你可以令一名有手牌的其他角色正面朝上交给你一张牌。若此牌不为【闪】,则该角色也成为此【杀】的额外目标。", + gongji_info: "出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。", + zhuiyi_info: "当你死亡时,你可以令一名其他角色(杀死你的角色除外)摸三张牌,然后其回复1点体力。", + anxu_info: "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌多的角色将一张手牌交给手牌少的角色,然后若这两名角色手牌数相等,你摸一张牌或回复1点体力。", + old_anxu_info: "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌。", + zongxuan_info: "当你的牌因弃置而进入弃牌堆后,你可以将其按任意顺序置于牌堆顶。", + zhiyan_info: "结束阶段,你可以令一名角色摸一张牌并展示之,若为装备牌,其使用此牌并回复1点体力。", + miji_info: "结束阶段,若你已受伤,则可以摸X张牌,然后可以将等量的牌交给其他角色(X为你已损失的体力值)。", + zhenlie_info: "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后弃置对方一张牌。", + chengxiang_info: "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。", + oldchengxiang_info: "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于12的牌。", + renxin_info: "当体力值为1的一名其他角色受到伤害时,你可以将武将牌翻面并弃置一张装备牌,然后防止此伤害。", + oldrenxin_info: "其他角色进入濒死状态时,你可以将所有手牌交给该角色并翻面,然后该角色回复1点体力。", + jingce_info: "出牌阶段结束时,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。", + xinjingce_info: "结束阶段,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。", + xswuyan_info: "锁定技,你使用的普通锦囊牌对其他角色无效;其他角色使用的普通锦囊牌对你无效。", + xinwuyan_info: "锁定技,当你使用锦囊牌造成伤害时,你防止此伤害;锁定技,当你受到锦囊牌对你造成的伤害时,你防止此伤害。", + jujian_info: "出牌阶段限一次,你可以弃至多三张牌,然后令一名其他角色摸等量的牌。若你以此法弃牌不少于三张且均为同一类别,你回复1点体力。", + xinjujian_info: "结束阶段开始时,你可以弃置一张非基本牌并选择一名其他角色,令其选择一项:1.摸两张牌;2.回复1点体力;3.将其武将牌翻转至正面朝上并重置之。", + luoying_info: "当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。", + jiushi_info: "当你需要使用一张【酒】时,若你的武将牌正面朝上,则你可以将武将牌翻面并视为使用了一张【酒】;当你受到伤害时,若你的武将牌背面朝上,则你可在此伤害结算后将武将牌翻回正面。", + jueqing_info: "锁定技,你即将造成的伤害均视为失去体力。", + shangshi_info: "当你的手牌数小于X时,你可以将手牌摸至X张(X为你已损失的体力值)。", + xuanfeng_info: "当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌。", + zhiyu_info: "当你受到伤害后,你可以摸一张牌,然后展示所有手牌。若颜色均相同,你令伤害来源弃置一张手牌。", + qice_info: "出牌阶段限一次,你可以将所有的手牌(至少一张)当做任意一张普通锦囊牌使用。", + jiangchi_info: "摸牌阶段摸牌时,你可以选择一项:1、额外摸一张牌,若如此做,你不能使用或打出【杀】直到回合结束。 2、少摸一张牌,若如此做,你使用【杀】无距离限制且可以多使用一张【杀】直到回合结束。", + zishou_info: "摸牌阶段,你可以额外摸X张牌(X为场上势力数)。然后你于本回合的出牌阶段内使用的牌不能指定其他角色为目标。", + zongshi_info: "锁定技,你的手牌上限+X(X为场上现存势力数)。", + danshou_info: "出牌阶段,你可以选择你攻击范围内的一名其他角色,然后弃置X张牌(X为此前你于此阶段你发动“胆守”的次数+1)。若X:为1,你弃置该角色的一张牌;为2,令该角色交给你一张牌;为3,你对该角色造成1点伤害;不小于4,你与该角色各摸两张牌。", + olddanshou_info: "当你造成伤害后,你可以摸一张牌。若如此做,终止一切结算,当前回合结束。", + xindanshou_info: "①每回合限一次,当你成为基本牌或锦囊牌的目标后,你可以摸X张牌(X为你本回合内成为过基本牌或锦囊牌的目标的次数)。②一名其他角色的结束阶段,若你本回合内没有发动过〖胆守①〗,则你可以弃置X张牌并对其造成1点伤害(X为其手牌数,无牌则不弃)。", + yizhong_info: "锁定技,当你的防具栏为空时,黑色的【杀】对你无效。", + xinzhan_info: "出牌阶段限一次,若你的手牌数大于你的体力上限,你可以观看牌堆顶的三张牌,然后展示其中任意红桃牌并获得之。", + huilei_info: "锁定技,当你死亡时,杀死你的角色弃置所有的牌。", + enyuan_info: "锁定技。①当其他角色令你回复1点体力后,该角色摸一张牌。②当其他角色对你造成伤害后,其须交给你一张♥手牌,否则失去1点体力。", + xuanhuo_info: "出牌阶段限一次,你可以将一张红桃手牌交给一名其他角色,获得该角色的一张牌,然后交给除该角色外的一名其他角色。", + ganlu_info: "出牌阶段限一次,你可以选择两名装备区内装备数之差不大于X的角色,令其交换装备区内的牌(X为你已损失的体力值)。", + buyi_info: "当有角色进入濒死状态时,你可以展示该角色的一张手牌:若此牌不为基本牌,则该角色弃置此牌并回复1点体力。", + mingce_info: "出牌阶段,你可以交给一名其他角色一张装备牌或【杀】,然后令该角色选择一项:1. 视为对其攻击范围内的另一名由你指定的角色使用一张【杀】。2. 摸一张牌。每回合限一次。", + zhichi_info: "锁定技,当你于回合外受到伤害后,所有【杀】或普通锦囊牌对你无效直到回合结束。", + zhichi2_info: "智迟已发动", + pojun_info: "当你使用【杀】造成伤害后,你可以令受伤角色摸X张牌,然后其翻面(X为该角色的体力值且至多为5)。", + shiyong: "恃勇", + shiyong_info: "锁定技,当你受到一次红色【杀】或【酒】【杀】造成的伤害后,须减1点体力上限。", + old_guanzhang: "旧关兴张苞", + old_guanzhang_prefix: "旧", + wangyi: "王异", + oldqianxi: "潜袭", + oldqianxi_info: "当你使用【杀】对距离为1的目标角色造成伤害时,你可以进行一次判定,若判定结果不为红桃,你防止此伤害,令其减1点体力上限。", + oldzhenlie: "贞烈", + oldzhenlie_info: "在你的判定牌生效前,你可以亮出牌堆顶的一张牌代替之。", + oldmiji: "秘计", + oldmiji_info: "准备/结束阶段开始时,若你已受伤,你可以判定,若判定结果为黑色,你观看牌堆顶的X张牌(X为你已损失的体力值),然后将这些牌交给一名角色。", + old_fuhun: "父魂", + old_fuhun_info: "摸牌阶段开始时,你可以放弃摸牌,改为从牌堆顶亮出两张牌并获得之,若亮出的牌颜色不同,你获得〖武圣〗和〖咆哮〗直到回合结束。", + rejueqing: "绝情", + rejueqing_info: "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力并修改〖绝情〗(X为伤害值)。", + rejueqing_1st: "绝情", + rejueqing_rewrite: "绝情·改", + rejueqing_rewrite_info: "锁定技,你即将造成的伤害均视为失去体力。", + reshangshi: "伤逝", + reshangshi_2nd: "伤逝", + reshangshi_info: "当你受到伤害时,你可以弃置一张牌。当你的手牌数小于X时,你可以将手牌摸至X张。(X为你已损失的体力值)", + rejingce: "精策", + rejingce2: "精策", + rejingce_add: "精策", + rejingce_info: "当你于一回合内首次使用某种花色的手牌时,你的手牌上限+1。出牌阶段结束时,你可以摸X张牌(X为你本阶段内使用过的牌的类型数)。", + xinkuangbi: "匡弼", + xinkuangbi_info: "出牌阶段限一次。你可以令一名其他角色交给你至多三张牌(不计入你本回合的手牌上限)。然后其于其的下回合开始时摸等量的牌。", + xinzhaofu: "诏缚", + xinzhaofu_info: "主公技,限定技。出牌阶段,你可选择至多两名其他角色。这两名角色视为在所有其他吴势力角色的攻击范围内。", + olbingyi: "秉壹", + olbingyi_info: "每阶段限一次。当你因弃置而失去牌后,你可以展示所有手牌。若这些牌的颜色均相同,则你可以与至多X名其他角色各摸一张牌(X为你的手牌数)。", + lukai: "陆凯", + lukai_spade: "♠", + lukai_spade_bg: "♠️", + lukai_heart: "♥", + lukai_heart_bg: "♥️", + lukai_club: "♣", + lukai_club_bg: "♣", + lukai_diamond: "♦", + lukai_diamond_bg: "♦️️", + lkbushi: "卜筮", + lkbushi_info: "①你使用♠牌无次数限制。②当你使用或打出♥牌后,你摸一张牌。③当你成为♣牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张♦牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。", + lkzhongzhuang: "忠壮", + lkzhongzhuang_info: "锁定技。①当你因执行【杀】的效果而造成伤害时,若你的攻击范围大于3,则此伤害+1。②当一名角色受到你因执行【杀】的效果而造成的伤害时,若你的攻击范围小于3,则此伤害改为1。", + kebineng: "轲比能", + kousheng: "寇旌", + kousheng_info: "①出牌阶段开始时,你可以选择任意张手牌,这些牌称为“寇旌”直到回合结束。②你的“寇旌”均视为【杀】且无次数限制。③当你因执行对应实体牌包含“寇旌”的【杀】的效果而造成伤害后,你展示所有“寇旌”牌,然后目标角色可以用所有手牌交换这些牌。", + zhugeshang: "诸葛尚", + sangu: "三顾", + sangu_info: "结束阶段,你可以选择至多三个{【杀】或不为notarget或singleCard的普通锦囊牌}中的牌名,然后令一名其他角色记录这些牌名。该角色的下个出牌阶段开始时,其的手牌于其需要使用牌时均视为其记录中的第一张牌直到此阶段结束,且当其使用或打出有对应实体牌的牌时,移除这些牌中的第一张牌。若你以此法选择过的牌名均为你本回合内使用过的牌名,则防止你因其以此法使用牌造成的伤害。", + yizu: "轶祖", + yizu_info: "锁定技。每回合限一次,当你成为【杀】或【决斗】的目标后,若你的体力值不大于使用者的体力值,则你回复1点体力。", + liwan: "李婉", + liandui: "联对", + liandui_info: "①当你使用牌时,若本局游戏内上一张被使用的牌的使用者不为你,你可以令其摸两张牌。②其他角色使用牌时,若本局游戏内上一张被使用的牌的使用者为你,其可以令你摸两张牌。", + biejun: "别君", + biejun_info: "①其他角色的出牌阶段限一次。其可以将一张手牌交给你。②每回合限一次。当你受到伤害时,若你手牌中没有本回合因〖别君①〗得到的牌,你可以翻面并防止此伤害。", + yj_sufei: "苏飞", + shuojian: "数谏", + shuojian_info: "出牌阶段限三次。你可以交给一名其他角色一张牌,其选择一项:1.令你摸X张牌并弃置X-1张牌;2.视为使用X张【过河拆桥】,然后此技能本回合失效(X为此技能本阶段剩余发动次数+1)。", + yj_qiaozhou: "谯周", + shiming: "识命", + shiming_info: "每轮限一次。一名角色的摸牌阶段,你可以观看牌堆顶的三张牌,并可以将其中一张置于牌堆底。然后该角色可以改为对自己造成1点伤害,然后从牌堆底摸三张牌。", + jiangxi: "将息", + jiangxi_info: "一名角色的回合结束时,若一号位于此回合内进入过濒死状态或未受到过伤害,你可以重置〖识命〗并摸一张牌;若所有角色均未受到过伤害,你可以与当前回合角色各摸一张牌。", + hanlong: "韩龙", + duwang: "独往", + duwang_info: "锁定技。①游戏开始时,你从牌堆顶将五张不为【杀】的牌置于武将牌上,称为“刺”。②若你有牌名不为【杀】“刺”,你至其他角色或其他角色至你的距离+1。", + cibei: "刺北", + cibei_info: "①当一名角色使用【杀】造成伤害且此牌对应的实体牌进入弃牌堆后,你可以将一张不为【杀】的“刺”置入弃牌堆,并将这些牌置入“刺”,然后弃置一名角色区域里的一张牌。②一名角色的回合结束时,若你的“刺”均为【杀】,你获得所有“刺”,且这些牌不能被弃置,不计入手牌上限,且当你使用对应实体牌包含这些牌的牌时无次数和距离限制。", + wuanguo: "武安国", + diezhang: "叠嶂", + diezhang_info: "转换技。①出牌阶段,你使用杀的次数上限+1。②阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用X张【杀】;阳:当其他角色使用牌被你抵消后,你可以摸X张牌,视为对其使用一张【杀】(X为1)。", + duanwan: "断腕", + duanwan_info: "限定技。当你处于濒死状态时,你可以将体力回复至2点,然后删除〖叠嶂①〗和当前转换技状态的〖叠嶂②〗分支,并将〖叠嶂〗修改为“每回合限一次”且将X修改为2。", + dcduliang: "督粮", + dcduliang2: "督粮", + dcduliang_info: "出牌阶段限一次。你可以获得一名其他角色的一张牌,然后选择一项:1.你观看牌堆顶的两张牌,然后令其获得其中的一或两张基本牌;2.令其于下回合的摸牌阶段额外摸一张牌。", + sunli: "孙礼", + kangli: "伉厉", + kangli_info: "当你造成或受到伤害后,你摸两张牌。然后你下次造成伤害时弃置这些牌。", + xiahoumao: "夏侯楙", + tongwei: "统围", + tongwei_info: "出牌阶段限一次。你可以重铸两张牌并指定一名其他角色,当其使用的下一张牌结算结束后,若此牌点数在你上次以此法重铸的牌的点数之间,你视为对其使用一张【杀】或【过河拆桥】。", + cuguo: "蹙国", + cuguo_info: "锁定技。当你于一回合使用牌首次被抵消后,你弃置一张牌,视为对此牌的目标角色使用一张该被抵消的牌。此牌结算结束后,若此牌被抵消,你失去1点体力。", + chenshi: "陈式", + qingbei: "擎北", + qingbei_info: "一轮游戏开始时,你可以选择任意种花色,你不能于本轮内使用这些花色的牌。然后当你于本轮使用一张有花色的牌结算结束后,你摸等同于你上一次〖擎北〗选择过的花色数的牌。", + feiyao: "费曜", + zhenfeng: "镇锋", + zhenfeng_info: "每回合限一次。当其他角色于其回合内使用牌时,若其手牌数不大于其体力值,你可以猜测其手牌中与此牌类别相同的牌数。若你猜对,你摸X张牌并视为对其使用一张【杀】(X为你连续猜对的次数且至多为5);若你猜错且差值大于1,其视为对你使用一张【杀】。", + linghuyu: "令狐愚", + yj_simafu: "司马孚", + yj_xuangongzhu: "宣公主", + xukun: "徐琨", + xvzhi: "蓄志", + xvzhi_info: "出牌阶段限一次,你可令两名角色各选择任意张手牌并交换这些牌,然后获得牌数较少的角色视为使用无视距离的【杀】;若获得牌数相等,你摸两张牌且可以对此阶段未以此法选择过的角色再发动一次〖蓄志〗。", + beiyu: "备预", + beiyu_info: "出牌阶段限一次,你可将手牌摸至体力上限,然后你将一种花色的所有手牌置于牌堆底。", + duchi: "督持", + duchi_info: "每回合限一次,当你成为其他角色使用牌的目标后,你可从牌堆底摸一张牌并展示所有手牌,若颜色均相同,则此牌对你无效。", + yjqimei: "齐眉", + yjqimei_info: "出牌阶段限一次,你可以选择一名其他角色,你与其各摸两张牌并弃置两张牌,然后你根据你与其弃置牌的花色总数执行以下效果:1、你依次使用这些弃置的牌中可以使用的牌;2、你与其复原武将牌;3、你与其横置武将牌;4、你与其各摸一张牌,然后你修改〖齐眉〗为“出牌阶段限两次”直到回合结束。", + yjzhuiji: "追姬", + yjzhuiji_info: "当你死亡时,你可以令一名角色从牌堆和弃牌堆中的随机使用任意装备牌直至其没有空置的装备栏。若如此做,当其失去以此法使用的装备牌后,其废除对应的装备栏。", + fazhu: "筏铸", + fazhu_info: "准备阶段,你可以重铸你的区域内的所有非伤害牌,然后将以此法获得的牌交给至多等量名角色各一张,这些角色可以依次使用一张无距离限制的【杀】。", +}; + +export default translates; diff --git a/character/yijiang/voices.js b/character/yijiang/voices.js new file mode 100644 index 000000000..956de759e --- /dev/null +++ b/character/yijiang/voices.js @@ -0,0 +1,389 @@ +export default { + "#tongwei1": "集关西诸路大军,必雪当年长坂坡之耻。", + "#tongwei2": "手织天网十万尺,欲擒飞龙落彀中。", + "#cuguo1": "身担父命,怎可蜷于宫阙。", + "#cuguo2": "体承国运,岂能缩居朝堂。", + "#xiahoumao:die": "一将无能,徒累死三军。", + "#qingbei1": "待追上那司马懿,定教他没好果子吃!", + "#qingbei2": "身若不周,吾一人可作擎北之柱。", + "#chenshi:die": "丞相、丞相!是魏延指使我的!", + "#kangli1": null, + "#kangli2": null, + "#sunli:die": null, + "#zhenfeng1": null, + "#zhenfeng2": null, + "#feiyao:die": null, + "#diezhang1": "某家这大锤,舞起来那叫一个万夫莫敌。", + "#diezhang2": "贼吕布何在?某家来取汝性命了!", + "#duanwan1": "好你个吕奉先,竟敢卸我膀子!", + "#duanwan2": "汝这匹夫,为何往手腕上招呼?", + "#wuanguo:die": "吕奉先,你给某家等着!", + "#duwang1": "此去,欲诛敌莽、杀单于。", + "#duwang2": "风萧萧兮易水寒,壮士一去兮不复还!", + "#cibei1": "匹夫一怒,流血二人,天下缟素。", + "#cibei2": "我欲效专诸、聂政之旧事,逐天狼于西北。", + "#hanlong:die": "杀轲比能者,韩龙也!", + "#shiming1": "今天命在北,我等已尽人事。", + "#shiming2": "益州国疲民敝,非人力可续之。", + "#jiangxi1": "典午忽兮,月酉没兮。", + "#jiangxi2": "周慕孔子遗风,可与刘、扬同轨。", + "#yj_qiaozhou:die": "炎汉百年之业,吾一言毁之……", + "#shuojian1": "我数荐卿而祖不用,其之失也。", + "#shuojian2": "兴霸乃当世豪杰,何患无爵。", + "#yj_sufei:die": "兴霸何在?吾命休矣……", + "#liandui1": "以句相联,抒离散之苦。", + "#liandui2": "以诗相对,颂哀怨之情。", + "#biejun1": "彼岸荼蘼远,落寞北风凉。", + "#biejun2": "此去经年,不知何时能归?", + "#liwan:die": "生不能同寝,死亦难同穴……", + "#sangu1": "思报君恩,尽父子之忠。", + "#sangu2": "欲酬三顾,竭三代之力。", + "#yizu1": "仿祖父行事,可阻敌袭。", + "#yizu2": "习先人故智,可御寇侵。", + "#zhugeshang:die": "父子荷国重恩,当尽忠以报!", + "#kousheng1": "驰马掠野,塞外称雄。", + "#kousheng2": "控弦十万,纵横漠南。", + "#kebineng:die": "草原雄鹰,折翼于此……", + "#lkbushi1": "论演玄意,以筮辄验。", + "#lkbushi2": "手不释书,好研经卷。", + "#lkzhongzhuang1": "秽尘天听,卿有不测之祸!", + "#lkzhongzhuang2": "倾乱国政,安得寿终正寝?", + "#lukai:die": "不听忠言,国将亡矣……", + "#xinxuanhuo1": "收人钱财,替人消灾。", + "#xinxuanhuo2": "哼,叫你十倍奉还!", + "#xinenyuan1": "报之以李,还之以桃。", + "#xinenyuan2": "伤了我,休想全身而退!", + "#xin_fazheng:die": "汉室复兴,我,是看不到了……", + "#fuhun1": "光复汉室,重任在肩!", + "#fuhun2": "将门虎子,承我父志!", + "#guanzhang:die": "未能手刃仇敌,愧对先父。", + "#zhenlie1": "虽是妇人,亦当奋身一搏!", + "#zhenlie2": "为雪前耻,不惜吾身!", + "#miji1": "此计,可歼敌精锐!", + "#miji2": "此举,可破敌之围!", + "#wangyi:die": "月儿,不要责怪你爹爹……", + "#new_jiangchi1": "身当矢石,驰骛四方!", + "#new_jiangchi2": "稳兵自重,静观其变!", + "#caozhang:die": "子桓,你害我!", + "#jingce1": "方策精详,有备无患。", + "#jingce2": "精兵据敌,策守如山。", + "#guohuai:die": "姜维小儿,竟然……", + "#jueqing1": "你的死活,与我何干?", + "#jueqing2": "无来无去,不悔不怨。", + "#shangshi1": "无情者伤人,有情者自伤。", + "#shangshi2": "自损八百,可伤敌一千。", + "#zhangchunhua:die": "怎能如此对我!", + "#luoying": null, + "#luoying1": "别着急扔,给我就好。", + "#luoying2": "这些都是我的。", + "#jiushi11": "置酒高殿上,亲友从我游。", + "#jiushi12": "走马行酒醴,驱车布鱼肉。", + "#caozhi:die": "本是同根生,相煎何太急。", + "#chengxiang1": "依我看,小事一桩。", + "#chengxiang2": "孰重孰轻,一称便知。", + "#renxin1": "仁者爱人,人恒爱之。", + "#renxin2": "有我在,别怕。", + "#caochong:die": "子桓哥哥……", + "#qice1": "奇策在此,谁与争锋?", + "#qice2": "倾力为国,算无遗策。", + "#zhiyu1": "大勇若怯,大智如愚。", + "#zhiyu2": "愚者既出,智者何存?", + "#xunyou:die": "主公何日再得无忧?", + "#xinwuyan1": "汝有良策,何必问我!", + "#xinwuyan2": "吾,誓不为汉贼献一策!", + "#xinjujian1": "卧龙之才,远胜于我。", + "#xinjujian2": "天下大任,望君莫辞!", + "#xin_xushu:die": "忠孝不能两全,孩儿……", + "#sanyao1": "三人成虎,事多有。", + "#sanyao2": "散谣惑敌,不攻自破!", + "#zhiman1": "丞相多虑,且看我的!", + "#zhiman2": "兵法谙熟于心,取胜千里之外!", + "#xin_masu:die": null, + "#danshou1": "以胆为守,扼敌咽喉!", + "#danshou2": "到此为止了!", + "#zhuran:die": "何人竟有如此之胆!?", + "#xinpojun1": "大军在此!汝等休想前进一步!", + "#xinpojun2": "敬请,养精蓄锐!", + "#xusheng:die": "可怜一身胆略,尽随一抔黄土……", + "#ganlu1": "男婚女嫁,须当交换文定之物。", + "#ganlu2": "此真乃吾之佳婿也。", + "#buyi1": "吾乃吴国之母,何人敢放肆?", + "#buyi2": "有老身在,汝等尽可放心。", + "#wuguotai:die": "卿等,务必用心辅佐仲谋……", + "#xuanfeng1": "伤敌于千里之外!", + "#xuanfeng2": "索命于须臾之间!", + "#lingtong:die": "大丈夫,不惧死亡……", + "#zishou1": "江河霸主,何惧之有?", + "#zishou2": "荆襄之地,固若金汤。", + "#zongshi1": "汉室百年,坚如磐石。", + "#zongshi2": "宗室子弟,尽收民心。", + "#liubiao:die": "优柔寡断,要不得啊。", + "#zhiyan1": "志节分明,折而不屈!", + "#zhiyan2": "直言劝谏,不惧祸否!", + "#zongxuan1": "依易设象,以占吉凶。", + "#zongxuan2": "世间万物,皆有定数。", + "#yufan:die": "我枉称东方朔再世……", + "#mingce1": "如此,霸业可图也。", + "#mingce2": "如此,一击可擒也。", + "#zhichi1": "如今之计,唯有退守,再做决断。", + "#zhichi2": "若吾,早知如此……", + "#chengong:die": "请出就戮!", + "#anxu1": "和鸾雍雍,万福攸同。", + "#anxu2": "君子乐胥,万邦之屏。", + "#zhuiyi1": "终其永怀,恋心殷殷。", + "#zhuiyi2": "妾心所系,如月之恒。", + "#bulianshi:die": "江之永矣,不可方思。", + "#gongji1": "吃我一箭!", + "#gongji2": "鼠辈,哪里走!", + "#jiefan1": "退后,这里交给我!", + "#jiefan2": "休想趁人之危!", + "#handang:die": "今后,只能靠你了。", + "#qiuyuan1": "逆贼逞凶,卿可灭之。", + "#qiuyuan2": "求父亲救救大汉江山吧!", + "#zhuikong1": "诚惶诚恐,夜不能寐。", + "#zhuikong2": "嘘,隔墙有耳。", + "#fuhuanghou:die": "陛下为何不救臣妾……", + "#quanji1": "这仇,我记下了。", + "#quanji2": "先让你得意几天。", + "#zili1": "欲取天下,当在此时!", + "#zili2": "时机已到,今日起兵!", + "#zhonghui:die": "伯约,让你失望了。", + "#qiaoshui1": "合则两利,斗则两伤。", + "#qiaoshui2": "君且安坐,听我一言。", + "#jyzongshi1": "买卖不成,情义还在。", + "#jyzongshi2": "此等小事,何须挂耳?", + "#jianyong:die": "两国交战……不斩……", + "#mashu": null, + "#mashu1": null, + "#mashu2": null, + "#qianxi1": "喊什么喊?我敢杀你!", + "#qianxi2": "笑什么笑?叫你得意!", + "#old_madai:die": "我怎么会死在这里……", + "#xiansi1": "袭人于不意,溃敌于无形!", + "#xiansi2": "破敌军阵,父亲定会刮目相看!", + "#liufeng:die": "父亲,为什么……", + "#junxing1": "严刑峻法,以破奸诡之胆。", + "#junxing2": "你招还是不招?", + "#yuce1": "御敌之策,成竹于胸。", + "#yuce2": "以缓制急,不战屈兵。", + "#manchong:die": "援军为何迟迟未到……", + "#pindi1": "定品寻良骥,中正探人杰。", + "#pindi2": "取才赋职,论能行赏。", + "#faen1": "礼法容情,皇恩浩荡。", + "#faen2": "法理有度,恩威并施。", + "#chenqun:die": "吾身虽陨,典律昭昭。", + "#chanhui1": "你也休想置身事外!", + "#chanhui2": "你可别不识抬举!", + "#jiaojin1": "就凭你,还想算计于我?", + "#jiaojin2": "是谁借给你的胆子?", + "#sunluban:die": "本公主,何罪之有?", + "#shenxing1": "审时度势,乃容万变。", + "#shenxing2": "此需斟酌一二。", + "#bingyi1": "公正无私,秉持如一。", + "#bingyi2": "诸君看仔细了!", + "#guyong:die": "病躯渐重,国事难安……", + "#qieting1": "想欺我蔡氏,痴心妄想!", + "#qieting2": "此人不露锋芒,断不可留!", + "#xianzhou1": "献荆襄九郡,图一世之安。", + "#xianzhou2": "丞相携天威而至,吾等安敢不降。", + "#caifuren:die": "孤儿寡母,何必赶尽杀绝呢……", + "#jianying1": "由缓至急,循循而进。", + "#jianying2": "事需缓图,欲速不达也。", + "#shibei1": "矢志于北,尽忠于国!", + "#shibei2": "命系袁氏,一心向北。", + "#yj_jushou:die": "智士凋亡,河北哀矣……", + "#qiangzhi1": "文书强识,才可博于运筹。", + "#qiangzhi2": "容我过目,即刻咏来。", + "#xiantu1": "将军莫虑,且看此图。", + "#zhangsong:die": "皇叔不听吾谏言,悔时晚矣!", + "#fenli1": "以逸待劳,坐收渔利。", + "#fenli2": "以主制客,占尽优势。", + "#pingkou1": "对敌人仁慈,就是对自己残忍。", + "#pingkou2": "反守为攻,直捣黄龙!", + "#zhuhuan:die": "我不要死在这病榻之上……", + "#qiaoshi1": "樵心遇郎君,妾心涟漪生。", + "#qiaoshi2": "樵前情窦开,君后寻迹来。", + "#yanyu1": "感君一回顾,思君朝与暮。", + "#yanyu2": "伴君一生不寂寞。", + "#xiahoushi:die": "愿有来世,不负前缘……", + "#duodao1": "这刀岂是你配用的?", + "#duodao2": "夺敌兵刃,如断其臂!", + "#anjian1": "击其懈怠,攻其不备!", + "#anjian2": "哼,你满身都是破绽!", + "#panzhangmazhong:die": "怎么可能,我明明亲手将你……", + "#zhongyong1": "驱刀飞血,直取寇首!", + "#zhongyong2": "为将军提刀携马,万死不辞!", + "#zhoucang:die": "为将军操刀牵马,此生无憾。", + "#longyin1": "破阵杀敌,愿献犬马之劳!", + "#longyin2": "虎啸既响,龙吟当附!", + "#guanping:die": "父亲快走,孩儿断后……", + "#dangxian1": "先锋就由老夫来当!", + "#dangxian2": "看我先行破敌!", + "#fuli1": "有老夫在,蜀汉就不会倒下!", + "#fuli2": "今天是个拼命的好日子,哈哈哈哈!", + "#liaohua:die": "今后,就靠你们啦……", + "#lihuo1": "将士们,引火对敌!", + "#lihuo2": "和我同归于尽吧!", + "#chunlao1": "唉,帐中不可无酒啊!", + "#chunlao2": "无碍,且饮一杯!", + "#chengpu:die": "没,没有酒了……", + "#xianzhen1": "攻无不克,战无不胜!", + "#xianzhen2": "破阵斩将,易如反掌!", + "#jinjiu1": "贬酒阙色,所以无污。", + "#jinjiu2": "避嫌远疑,所以无误。", + "#gaoshun:die": "生死有命……", + "#sidi1": "筑城固守,司敌备战。", + "#sidi2": "徒手制敌,能奈我何?", + "#caozhen:die": "秋雨凄迷,军心已乱……", + "#benxi1": "奔战万里,袭关斩将。", + "#benxi2": "袭敌千里,溃敌百步!", + "#wuyi:die": "奔波已疲,难以,再战。", + "#shenduan1": "良机虽去,尚可截资断源!", + "#shenduan2": "行军须慎,谋断当绝!", + "#yonglve1": "不必从言,自有主断!", + "#yonglve2": "非常之机,当行非常之计!", + "#hanhaoshihuan:die": "那拈弓搭箭的将军,是何人?", + "#huituo1": "富我大魏,扬我国威!", + "#huituo2": "大展宏图,就在今日!", + "#mingjian1": "孰忠孰奸,朕尚能明辨!", + "#mingjian2": "你我推心置腹,岂能相负。", + "#xingshuai1": "聚群臣而嘉勋,隆天子之气运!", + "#xingshuai2": "百年兴衰皆由人,不由天!", + "#caorui:die": "悔不该耽于逸乐,至有今日……", + "#qianju": null, + "#qianju1": null, + "#qianju2": null, + "#qingxi1": "策马疾如电,溃敌一瞬间。", + "#qingxi2": "虎豹骑岂能徒有虚名?杀!", + "#caoxiu:die": "兵行险招,终有一失。", + "#huomo1": "妙笔在手,研墨在心。", + "#huomo2": "笔墨写春秋,挥毫退万敌!", + "#zuoding1": "承君恩宠,报效国家!", + "#zuoding2": "只有忠心,没有谋略,是不够的。", + "#zhongyao:die": "墨尽,岁终。", + "#zhanjue1": "成败在此一举,杀!", + "#zhanjue2": "此刻,唯有死战,安能言降!", + "#qinwang11": "国有危难,哪位将军请战?", + "#qinwang12": "大厦倾危,谁堪栋梁!", + "#liuchen:die": "无言对百姓,有愧,见先祖……", + "#wurong": null, + "#wurong1": "兵不血刃,亦可先声夺人。", + "#wurong2": "从则安之,犯则诛之。", + "#shizhi1": null, + "#shizhi2": null, + "#zhangyi:die": "大丈夫当战死沙场,马革裹尸而还。", + "#yanzhu1": "大局已定,你还是放弃吧。", + "#yanzhu2": "不诛此权臣,朕,何以治天下?", + "#xingxue1": "文修武备,才是兴国之道。", + "#xingxue2": "汝等都是国之栋梁。", + "#zhaofu": null, + "#zhaofu1": "奉朕之诏,擒此国贼!", + "#zhaofu2": "天子震怒,贼臣授首。", + "#sunxiu:die": "崇文抑武,朕错了吗?", + "#anguo1": "止干戈,休战事。", + "#anguo2": "安邦定国,臣子分内之事。", + "#zhuzhi:die": "集毕生之力,保国泰民安。", + "#yaoming1": "民不足食,何以养军?", + "#yaoming2": "看我如何以无用之力换己所需,哈哈哈!", + "#quancong:die": "儿啊,好好报答吴王知遇之恩……", + "#huaiyi1": "一生纵横,怎可对他人称臣!", + "#huaiyi2": "此等小利,焉能安吾雄心?", + "#gongsunyuan:die": "天不容我公孙家……", + "#jigong1": "曹贼势颓,主公速击之。", + "#jigong2": "不惜一切代价,拿下此人!", + "#shifei1": "良谋失利,罪在先锋!", + "#shifei2": "计略周详,怎奈指挥不当。", + "#guotufengji:die": "大势已去,无力回天……", + "#juece1": "哼!你走投无路了。", + "#juece2": "无用之人,死!", + "#xinmieji1": "宁错杀,无放过!", + "#xinmieji2": "你能逃得出我的手掌心吗?", + "#xinfencheng1": "我得不到的,你们也别想得到!", + "#xinfencheng2": "让这一切都灰飞烟灭吧!哼哼哼哼……", + "#xin_liru:die": "如遇明主,大业必成……", + "#jiaozhao1": "诏书在此,不得放肆!", + "#jiaozhao2": "妾身也是逼不得已,方才出此下策。", + "#danxin1": "司马一族,其心可诛。", + "#danxin2": "妾身定为我大魏鞠躬尽瘁,死而后已。", + "#guohuanghou:die": "陛下,臣妾这就来见你。", + "#zhige1": "天下和而平乱,神器宁而止戈。", + "#zhige2": "刀兵纷争既止,国运福祚绵长。", + "#zongzuo1": "尽死生之力,保大厦不倾。", + "#zongzuo2": "乾坤倒,黎民苦,高祖后,岂任之?", + "#liuyu:die": "怀柔之计,终非良策。", + "#duliang1": "告诉丞相,山路难走!请宽限几天。", + "#duliang2": "粮草已到,请将军验看。", + "#fulin1": "我乃托孤重臣,却在这儿搞什么粮草!", + "#fulin2": "丞相,丞相!你们没看见我吗?", + "#liyan:die": "孔明这一走,我算是没指望了。", + "#kuangbi1": "匡人助己,辅政弼贤。", + "#kuangbi2": "兴隆大化,佐理时务。", + "#sundeng:die": "愿陛下留意听采,儿臣虽死犹生。", + "#jishe1": "孙吴正当盛世,兴些土木又何妨?", + "#jishe2": "当再建新殿,扬我国威!", + "#lianhuo1": "用那剩下的铁石,正好做些工事。", + "#lianhuo2": "筑下这铁链,江东天险牢不可破!", + "#cenhun:die": "我为主上出过力!!!呃啊!", + "#qinqing1": "陛下勿忧,大将军危言耸听。", + "#qinqing2": "陛下,莫让他人知晓此事!", + "#huisheng1": "大人,这些钱够吗?", + "#huisheng2": "劳烦大人美言几句~", + "#huanghao:die": "魏军竟然真杀来了!", + "#taoluan1": "睁开你的眼睛看看,现在是谁说了算?", + "#taoluan2": "国家承平,神器稳固,陛下勿忧。", + "#zhangrang:die": "臣等殄灭,唯陛下自爱……(跳水声)", + "#guizao1": "这都是陛下的恩泽呀。", + "#guizao2": "陛下盛宠,臣万莫敢忘。", + "#jiyu1": "陛下,此人不堪大用。", + "#jiyu2": "尔等玩忽职守,依诏降职处置。", + "#sunziliufang:die": "唉,树倒猢狲散,鼓破众人捶呀。", + "#zhongjian1": "浊世风云变幻,当以明眸洞察。", + "#zhongjian2": "心中自有明镜,可鉴奸佞忠良。", + "#caishi1": "清识难尚,至德可师。", + "#caishi2": "知书达礼,博古通今。", + "#xinxianying:die": "吾一生明鉴,竟错看于你。", + "#fumian1": "人言吾吉人天相,福寿绵绵。", + "#fumian2": "永理二子,当保大汉血脉长存。", + "#daiyan1": "汝可于宫中多留几日无妨。", + "#daiyan2": "胡氏受屈,吾亦心不安。", + "#wuxian:die": "所幸伴君半生,善始终得善终。", + "#wengua1": "阴阳相生相克,万事周而复始。", + "#wengua2": "卦不能佳,可须异日。", + "#fuzhu1": "我连做梦都在等这一天呢。", + "#fuzhu2": "既然来了,就别想走了。", + "#xushi:die": "莫问前程凶吉,但求落幕无悔。", + "#shouxi1": "天子之位,乃归刘汉!", + "#shouxi2": "吾父功盖寰区,然且不敢篡窃神器。", + "#huimin1": "悬壶济世,施医救民。", + "#huimin2": "心系百姓,惠布山阳。", + "#caojie:die": "皇天必不祚尔。", + "#bizhuan1": "无墨不成书,无识不成才。", + "#bizhuan2": "笔可抒情,亦可诛心。", + "#tongbo": null, + "#tongbo1": "读万卷书,行万里路。", + "#tongbo2": "博学而不穷,笃行而不倦。", + "#caiyong:die": "感叹世事,何罪之有?", + "#qingxian1": "抚琴拨弦,悠然自得。", + "#qingxian2": "寄情于琴,合于天地。", + "#juexiang1": "此曲不能绝矣!", + "#juexiang2": "一曲琴音,为我送别。", + "#jikang:die": "多少遗恨,俱随琴音去。", + "#jianzheng1": "天时不当,必难取胜!", + "#jianzheng2": "且慢,此仗打不得!", + "#zhuandui1": "你已无话可说了吧!", + "#zhuandui2": "黄口小儿,也敢来班门弄斧?", + "#tianbian1": "当今天子为刘,天亦姓刘!", + "#tianbian2": "阁下知其然,而未知其所以然。", + "#qinmi:die": "我竟然,也百口莫辩了……", + "#funan1": "礼尚往来,乃君子风范。", + "#funan2": "以子之矛,攻子之盾。", + "#jiexun1": "帝王应以社稷为重,以大观为主。", + "#jiexun2": "吾冒昧进谏,只求陛下思虑。", + "#xuezong:die": "尔等,竟做如此有辱斯文之事。", + "#shiyong1": "好大一股杀气啊!", + "#shiyong2": "好大一股酒气啊!", + "#old_huaxiong:die": "皮厚不挡刀啊……", + "#jieyue1": "安营驻寨,严守城防。", + "#jieyue2": "诸军严整,敌军自乱。", + "#yujin:die": "我,无颜面对丞相了……", +}; diff --git a/character/yingbian.js b/character/yingbian.js deleted file mode 100644 index 92617b8cd..000000000 --- a/character/yingbian.js +++ /dev/null @@ -1,4286 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../noname.js"; -game.import("character", function () { - return { - name: "yingbian", - connect: true, - character: { - chengjichengcui: ["male", "jin", 6, ["oltousui", "olchuming"]], - wangxiang: ["male", "jin", 3, ["bingxin"]], - jin_jiachong: ["male", "jin", 3, ["xiongshu", "jianhui"]], - xuangongzhu: ["female", "jin", 3, ["gaoling", "qimei", "ybzhuiji"], ["hiddenSkill"]], - xinchang: ["male", "jin", 3, ["canmou", "congjian"]], - yangzhi: ["female", "jin", 3, ["xinwanyi", "maihuo"]], - yangyan: ["female", "jin", 3, ["xinxuanbei", "xianwan"]], - ol_huaxin: ["male", "wei", 3, ["caozhao", "olxibing"]], - zhongyan: ["female", "jin", 3, ["bolan", "yifa"], ["clan:颍川钟氏"]], - weiguan: ["male", "jin", 3, ["zhongyun", "shenpin"]], - cheliji: ["male", "qun", 4, ["chexuan", "qiangshou"]], - simazhou: ["male", "jin", 4, ["recaiwang", "naxiang"]], - ol_lisu: ["male", "qun", 3, ["qiaoyan", "xianzhu"]], - jin_yanghuiyu: ["female", "jin", 3, ["huirong", "ciwei", "caiyuan"], ["hiddenSkill"]], - shibao: ["male", "jin", 4, ["zhuosheng"]], - jin_zhangchunhua: ["female", "jin", 3, ["huishi", "qingleng", "xuanmu"], ["hiddenSkill"]], - jin_simayi: ["male", "jin", 3, ["buchen", "smyyingshi", "xiongzhi", "xinquanbian"], ["hiddenSkill"]], - jin_wangyuanji: ["female", "jin", 3, ["shiren", "yanxi"], ["hiddenSkill"]], - jin_simazhao: ["male", "jin", 3, ["tuishi", "xinchoufa", "zhaoran", "chengwu"], ["zhu", "hiddenSkill"]], - jin_xiahouhui: ["female", "jin", 3, ["baoqie", "jyishi", "shiduo"], ["hiddenSkill"]], - jin_simashi: ["male", "jin", "3/4", ["taoyin", "yimie", "ruilve", "tairan"], ["hiddenSkill", "zhu"]], - zhanghuyuechen: ["male", "jin", 4, ["xijue"]], - duyu: ["male", "jin", 4, ["sanchen", "zhaotao"]], - }, - characterSort: { - yingbian: { - yingbian_pack1: ["jin_simayi", "jin_zhangchunhua", "ol_lisu", "simazhou", "cheliji", "ol_huaxin"], - yingbian_pack2: ["jin_simashi", "jin_xiahouhui", "zhanghuyuechen", "shibao", "jin_yanghuiyu", "chengjichengcui"], - yingbian_pack3: ["jin_simazhao", "jin_wangyuanji", "duyu", "weiguan", "xuangongzhu"], - yingbian_pack4: ["zhongyan", "xinchang", "jin_jiachong", "wangxiang"], - yingbian_pack5: ["yangyan", "yangzhi"], - }, - }, - skill: { - //二成 - oltousui: { - audio: 2, - enable: "chooseToUse", - viewAsFilter: function (player) { - return player.countCards("he"); - }, - viewAs: { - name: "sha", - suit: "none", - number: null, - isCard: true, - }, - filterCard: true, - selectCard: [1, Infinity], - position: "he", - check: function (card) { - const player = get.player(); - return 4.5 + (player.hasSkill("olchuming") ? 1 : 0) - 1.5 * ui.selected.cards.length - get.value(card); - }, - popname: true, - ignoreMod: true, - precontent: function* (event, map) { - var player = map.player; - var evt = event.getParent(); - if (evt.dialog && typeof evt.dialog == "object") evt.dialog.close(); - player.logSkill("oltousui"); - delete event.result.skill; - var cards = event.result.cards; - player.loseToDiscardpile(cards, ui.cardPile, false, "blank").log = false; - var shownCards = cards.filter(i => get.position(i) == "e"), - handcardsLength = cards.length - shownCards.length; - if (shownCards.length) { - player.$throw(shownCards, null); - game.log(player, "将", shownCards, "置于了牌堆底"); - } - if (handcardsLength > 0) { - player.$throw(handcardsLength, null); - game.log(player, "将", get.cnNumber(handcardsLength), "张牌置于了牌堆底"); - } - game.delayex(); - var viewAs = new lib.element.VCard({ name: event.result.card.name, isCard: true }); - event.result.card = viewAs; - event.result.cards = []; - event.result._apply_args = { - shanReq: cards.length, - oncard: () => { - var evt = get.event(); - for (var target of game.filterPlayer(null, null, true)) { - var id = target.playerid; - var map = evt.customArgs; - if (!map[id]) map[id] = {}; - map[id].shanRequired = evt.shanReq; - } - }, - }; - }, - ai: { - order: function (item, player) { - return get.order({ name: "sha" }) + 0.1; - }, - result: { player: 1 }, - keepdu: true, - respondSha: true, - skillTagFilter: (player, tag, arg) => { - if (tag == "respondSha" && arg != "use") return false; - }, - }, - }, - olchuming: { - audio: 2, - trigger: { - source: "damageBegin1", - player: "damageBegin3", - }, - filter: function (event, player) { - if (event.source === event.player) return false; - if (!event.card || !event.cards || !event.cards.length) return true; - let target = event[player === event.source ? "player" : "source"]; - return target && target.isIn(); - }, - forced: true, - content: function* (event, map) { - var player = map.player, - trigger = map.trigger; - if (!trigger.card || !trigger.cards || !trigger.cards.length) { - trigger.num++; - event.finish(); - return; - } else { - var target = trigger[trigger.source == player ? "player" : "source"]; - trigger._olchuming = true; - target.addTempSkill("olchuming_effect"); - } - }, - ai: { - effect: { - player: function (card, player, target) { - if (!get.tag(card, "damage")) return; - if (!lib.card[card.name] || !card.cards || !card.cards.length) return [1, 0, 1, -1]; - return [1, -1]; - }, - }, - }, - subSkill: { - effect: { - charlotte: true, - trigger: { global: "phaseEnd" }, - forced: true, - popup: false, - content: function* (event, map) { - var player = map.player; - var mapx = {}; - var history = player.getHistory("damage").concat(player.getHistory("sourceDamage")); - history.forEach(evt => { - if (!evt._olchuming) return; - var target = evt[evt.source == player ? "player" : "source"]; - if (!target.isIn()) return; - var cards = evt.cards.filterInD("d"); - if (!cards.length) return; - if (!mapx[target.playerid]) mapx[target.playerid] = []; - mapx[target.playerid].addArray(cards); - }); - var entries = Object.entries(mapx).map(entry => { - return [(_status.connectMode ? lib.playerOL : game.playerMap)[entry[0]], entry[1]]; - }); - if (!entries.length) { - event.finish(); - return; - } - player.logSkill( - "olchuming_effect", - entries.map(i => i[0]) - ); - entries.sort((a, b) => lib.sort.seat(a[0], b[0])); - for (var entry of entries) { - var current = entry[0], - cards = entry[1]; - var list = ["jiedao", "guohe"].filter(i => player.canUse(new lib.element.VCard({ name: i, cards: cards }), current, false)); - if (!list.length) return; - var result = {}; - if (list.length == 1) result = { bool: true, links: [["", "", list[0]]] }; - else - result = yield player - .chooseButton([`畜鸣:请选择要对${get.translation(current)}使用的牌`, [list, "vcard"]], true) - .set("ai", button => { - var player = get.player(); - return get.effect(get.event("currentTarget"), { name: button.link[2] }, player, player); - }) - .set("currentTarget", current); - if (result.bool) { - var card = get.autoViewAs({ name: result.links[0][2] }, cards); - if (player.canUse(card, current, false)) player.useCard(card, cards, current, false); - } - } - }, - }, - }, - }, - bingxin: { - audio: 2, - enable: "chooseToUse", - hiddenCard: function (player, name) { - if (get.type(name) == "basic" && lib.inpile.includes(name) && !player.getStorage("bingxin_count").includes(name)) return true; - }, - filter: function (event, player) { - if (event.type == "wuxie") return false; - var hs = player.getCards("h"); - if (hs.length != Math.max(0, player.hp)) return false; - if (hs.length > 1) { - var color = get.color(hs[0], player); - for (var i = 1; i < hs.length; i++) { - if (get.color(hs[i], player) != color) return false; - } - } - var storage = player.storage.bingxin_count; - for (var i of lib.inpile) { - if (get.type(i) != "basic") continue; - if (storage && storage.includes(i)) continue; - var card = { name: i, isCard: true }; - if (event.filterCard(card, player, event)) return true; - if (i == "sha") { - for (var j of lib.inpile_nature) { - card.nature = j; - if (event.filterCard(card, player, event)) return true; - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - var storage = player.storage.bingxin_count; - for (var i of lib.inpile) { - if (get.type(i) != "basic") continue; - if (storage && storage.includes(i)) continue; - var card = { name: i, isCard: true }; - if (event.filterCard(card, player, event)) list.push(["基本", "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) { - card.nature = j; - if (event.filterCard(card, player, event)) list.push(["基本", "", i, j]); - } - } - } - return ui.create.dialog("冰心", [list, "vcard"], "hidden"); - }, - check: function (button) { - if (button.link[2] == "shan") return 3; - var player = _status.event.player; - if (button.link[2] == "jiu") { - if (player.getUseValue({ name: "jiu" }) <= 0) return 0; - if (player.countCards("h", "sha")) return player.getUseValue({ name: "jiu" }); - return 0; - } - return player.getUseValue({ name: button.link[2], nature: button.link[3] }) / 4; - }, - backup: function (links, player) { - return { - selectCard: -1, - filterCard: () => false, - viewAs: { - name: links[0][2], - nature: links[0][3], - isCard: true, - }, - precontent: function () { - player.logSkill("bingxin"); - player.draw(); - delete event.result.skill; - var name = event.result.card.name; - player.addTempSkill("bingxin_count"); - player.markAuto("bingxin_count", [name]); - }, - }; - }, - prompt: function (links, player) { - var name = links[0][2]; - var nature = links[0][3]; - return "摸一张并视为使用" + (get.translation(nature) || "") + get.translation(name); - }, - }, - ai: { - order: 10, - respondShan: true, - respondSha: true, - skillTagFilter: function (player, tag, arg) { - if (arg == "respond") return false; - var hs = player.getCards("h"); - if (hs.length != Math.max(0, hs.length)) return false; - if (hs.length > 1) { - var color = get.color(hs[0], player); - for (var i = 1; i < hs.length; i++) { - if (get.color(hs[i], player) != color) return false; - } - } - var storage = player.storage.bingxin_count; - if (storage && storage.includes("s" + tag.slice(8))) return false; - }, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { count: { charlotte: true, onremove: true } }, - }, - zhefu: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - direct: true, - filter: function (event, player) { - return ( - player != _status.currentPhase && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("zhefu"), "令一名有手牌的其他角色弃置一张【" + get.translation(trigger.card.name) + "】,否则受到你造成的1点伤害。", function (card, player, target) { - return target != player && target.countCards("h") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player) / Math.sqrt(target.countCards("h")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("zhefu", target); - var name = trigger.card.name; - target - .chooseToDiscard("he", { name: name }, "弃置一张【" + get.translation(name) + "】或受到1点伤害") - .set("ai", function (card) { - var player = _status.event.player; - if (_status.event.take || (get.name(card) == "tao" && !player.hasJudge("lebu"))) return 0; - return 8 - get.value(card); - }) - .set("take", get.damageEffect(target, player, target) >= 0); - } else event.finish(); - "step 2"; - if (!result.bool) target.damage(); - }, - }, - yidu: { - audio: 2, - trigger: { player: "useCardAfter" }, - filter: function (event, player) { - return ( - (event.card.name == "sha" || (get.type(event.card, null, false) == "trick" && get.tag(event.card, "damage") > 0)) && - event.targets.some(target => { - return ( - target.countCards("h") > 0 && - !target.hasHistory("damage", function (evt) { - return evt.card == event.card; - }) - ); - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("yidu"), (card, player, target) => { - return _status.event.targets.includes(target); - }) - .set( - "targets", - trigger.targets.filter(target => { - return ( - target.countCards("h") > 0 && - !target.hasHistory("damage", function (evt) { - return evt.card == trigger.card; - }) - ); - }) - ) - .set("ai", target => { - if (target.hasSkillTag("noh")) return 0; - return -get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("yidu", target); - player - .choosePlayerCard(target, "遗毒:展示" + get.translation(target) + "的至多三张手牌", true, "h", [1, Math.min(3, target.countCards("h"))]) - .set("forceAuto", true) - .set("ai", function (button) { - if (ui.selected.buttons.length) return 0; - return 1 + Math.random(); - }); - } else event.finish(); - "step 2"; - var cards = result.cards; - player.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【遗毒】"); - var color = get.color(cards[0], target); - var bool = true; - for (var i = 1; i < cards.length; i++) { - if (get.color(cards[i], target) != color) { - bool = false; - break; - } - } - if (bool) target.discard(cards, "notBySelf").discarder = player; - }, - }, - xinwanyi: { - audio: "wanyi", - trigger: { player: "useCardToTargeted" }, - filter: function (event, player) { - return player != event.target && event.targets.length == 1 && (event.card.name == "sha" || get.type(event.card, false) == "trick") && event.target.countCards("he") > 0; - }, - locked: false, - logTarget: "target", - check: function (event, player) { - return get.effect(event.target, { name: "guohe_copy2" }, player, player) > 0; - }, - prompt2: "将该角色的一张牌置于武将牌上作为“嫕”", - content: function () { - "step 0"; - event.target = trigger.target; - player.choosePlayerCard(event.target, true, "he"); - "step 1"; - if (result.bool) { - var cards = result.cards; - player.addToExpansion(cards, target, "give").gaintag.add("xinwanyi"); - } - }, - mod: { - cardEnabled: function (card, player) { - var cards = player.getExpansions("xinwanyi"); - if (cards.length) { - var suit = get.suit(card); - if (suit == "none") return; - for (var i of cards) { - if (get.suit(i, player) == suit) return false; - } - } - }, - cardRespondable: function (card, player) { - var cards = player.getExpansions("xinwanyi"); - if (cards.length) { - var suit = get.suit(card); - if (suit == "none") return; - for (var i of cards) { - if (get.suit(i, player) == suit) return false; - } - } - }, - cardSavable: function (card, player) { - var cards = player.getExpansions("xinwanyi"); - if (cards.length) { - var suit = get.suit(card); - if (suit == "none") return; - for (var i of cards) { - if (get.suit(i, player) == suit) return false; - } - } - }, - cardDiscardable: function (card, player) { - var cards = player.getExpansions("xinwanyi"); - if (cards.length) { - var suit = get.suit(card); - if (suit == "none") return; - for (var i of cards) { - if (get.suit(i, player) == suit) return false; - } - } - }, - }, - marktext: "嫕", - intro: { - markcount: "expansion", - content: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - group: "xinwanyi_give", - subSkill: { - give: { - audio: "wanyi", - trigger: { player: ["phaseJieshuBegin", "damageEnd"] }, - forced: true, - locked: false, - filter: function (event, player) { - return player.getExpansions("xinwanyi").length > 0; - }, - content: function () { - "step 0"; - player.chooseTarget(true, "婉嫕:令一名角色获得一张“嫕”").set("ai", function (target) { - return get.attitude(_status.event.player, target); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - var cards = player.getExpansions("xinwanyi"); - if (cards.length == 1) event._result = { bool: true, links: cards }; - else player.chooseButton(["令" + get.translation(target) + "获得一张“嫕”", cards], true); - } else event.finish(); - "step 2"; - if (result.bool) { - target.gain(result.links, player, "give"); - } - }, - }, - }, - }, - xinxuanbei: { - audio: "xuanbei", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(current => lib.skill.xinxuanbei.filterTarget(null, player, current)); - }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("hej") > 0; - }, - content: function () { - "step 0"; - player.choosePlayerCard(target, "hej", true); - "step 1"; - if (result.bool) { - var card = result.cards[0]; - var cardx = get.autoViewAs({ name: "sha" }, [card]); - if ((get.position(card) != "j" && !game.checkMod(card, target, "unchanged", "cardEnabled2", target)) || !target.canUse(cardx, player, false)) event.finish(); - else { - var next = target.useCard(cardx, [card], player, false); - event.card = next.card; - } - } else event.finish(); - "step 2"; - var num = 1; - if ( - player.hasHistory("damage", function (evt) { - return evt.card == event.card; - }) - ) - num++; - player.draw(num); - }, - ai: { - order: 7, - result: { - player: function (player, target) { - return get.effect(target, { name: "guohe_copy" }, player, player) + get.effect(player, { name: "sha" }, target, player); - }, - }, - }, - }, - xiongshu: { - audio: 2, - trigger: { global: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player != event.player && event.player.countCards("h") > 0 && player.countCards("he") >= player.countMark("xiongshu_count"); - }, - content: function () { - "step 0"; - event.target = trigger.player; - var num = player.countMark("xiongshu_count"); - if (num > 0) - player - .chooseToDiscard("he", num, get.prompt("xiongshu", trigger.player), "弃置" + get.cnNumber(num) + "张牌并展示其一张手牌") - .set("goon", get.attitude(player, event.target) < 0) - .set("ai", function (card) { - if (!_status.event.goon) return 0; - return 6 - _status.event.player.countMark("xiongshu_count") - get.value(card); - }).logSkill = ["xiongshu", trigger.player]; - else - player - .chooseBool(get.prompt("xiongshu", trigger.player), "展示其一张牌") - .set("goon", get.attitude(player, event.target) < 0) - .set("ai", function (card) { - return _status.event.goon; - }); - "step 1"; - if (result.bool) { - if (!result.cards || !result.cards.length) player.logSkill("xiongshu", target); - player.addTempSkill("xiongshu_count", "roundStart"); - player.addMark("xiongshu_count", 1, false); - } - if (result.bool && target.countCards("h") > 0) { - player.choosePlayerCard(target, true, "h"); - } else event.finish(); - "step 2"; - var card = result.cards[0], - name = get.name(card), - str = get.translation(target); - player.showCards(card, get.translation(player) + "对" + str + "发动了【凶竖】"); - player.addTempSkill("xiongshu_effect", "phaseUseAfter"); - player.storage.xiongshu_effect = [card, name]; - if (Math.random() < 0.5) { - target.storage.xiongshu_ai = name; - target.addTempSkill("xiongshu_ai", "phaseUseAfter"); - } - player - .chooseControl("会使用", "不会使用") - .set("prompt", "预测:" + str + "是否会使用" + get.translation(name) + "?") - .set( - "choice", - (function () { - if (!target.hasValueTarget(card)) return 1; - return Math.random() < 0.5 ? 0 : 1; - })() - ) - .set("ai", () => _status.event.choice); - "step 3"; - player.storage.xiongshu_effect[2] = result.index == 0; - }, - ai: { expose: 0.35 }, - subSkill: { - ai: { - charlotte: true, - onremove: true, - ai: { - effect: { - player: function (card, player, target) { - if (card.name == player.storage.xiongshu_ai) return "zeroplayertarget"; - }, - }, - }, - }, - count: { - charlotte: true, - onremove: true, - }, - effect: { - trigger: { global: "phaseUseEnd" }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - var info = player.storage.xiongshu_effect; - return Array.isArray(info) && event.player.isIn(); - }, - logTarget: "player", - content: function () { - var target = trigger.player; - var info = player.storage.xiongshu_effect; - var card = info[0]; - if ( - target.hasHistory("useCard", function (evt) { - return evt.card.name == info[1] && evt.getParent("phaseUse") == trigger; - }) == info[2] - ) - target.damage(); - else { - if (target.getCards("hej").includes(card)) player.gain(card, target, "give"); - else if (get.position(card, true) == "d") player.gain(card, "gain2"); - } - }, - }, - }, - }, - jianhui: { - audio: 2, - getLastPlayer: function (evt, player) { - var history = player.getAllHistory("damage"); - if (!history.length) return null; - var i = history.indexOf(evt); - if (i == -1) i = history.length - 1; - else i--; - for (i; i >= 0; i--) { - if (history[i].source) return history[i].source; - } - return null; - }, - trigger: { player: "damageEnd" }, - forced: true, - filter: function (event, player) { - return event.source && event.source.isIn() && event.source == lib.skill.jianhui.getLastPlayer(event, player) && event.source.countCards("he") > 0; - }, - content: function () { - trigger.source.chooseToDiscard("he", true); - }, - group: "jianhui_draw", - subSkill: { - draw: { - trigger: { source: "damageSource" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - return event.player == lib.skill.jianhui.getLastPlayer(event, player); - }, - content: function () { - player.draw(); - }, - }, - }, - }, - huaiyuan: { - audio: 2, - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter: function (event, player) { - var evt = event.getl(player); - if (!evt || !evt.hs || !evt.hs.length) return false; - if (event.name == "lose") { - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("huaiyuanx")) return true; - } - return false; - } - return player.hasHistory("lose", function (evt) { - if (event != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("huaiyuanx")) return true; - } - return false; - }); - }, - forced: true, - locked: false, - content: function () { - "step 0"; - var num = 0; - if (trigger.name == "lose") { - for (var i in trigger.gaintag_map) { - if (trigger.gaintag_map[i].includes("huaiyuanx")) num++; - } - } else - player.getHistory("lose", function (evt) { - if (trigger != evt.getParent()) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("huaiyuanx")) num++; - } - return false; - }); - event.count = num; - "step 1"; - event.count--; - player.chooseTarget(true, "请选择【怀远】的目标", "令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。").set("ai", function (target) { - var player = _status.event.player, - att = get.attitude(player, target); - if (att <= 0) return 0; - if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) att *= 2.2; - if (target.needsToDiscard()) att *= 1.3; - return att * Math.sqrt(Math.max(1, 4 - target.countCards("h"))); - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "green"); - var str = get.translation(target); - player - .chooseControl() - .set("choiceList", ["令" + str + "的手牌上限+1", "令" + str + "的攻击范围+1", "令" + str + "摸一张牌"]) - .set("ai", function () { - var player = _status.event.player, - target = _status.event.getParent().target; - if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) return 1; - if (target.needsToDiscard()) return 0; - return 2; - }); - } else event.finish(); - "step 3"; - if (result.index == 2) target.draw(); - else { - target.addSkill("huaiyuan_effect" + result.index); - target.addMark("huaiyuan_effect" + result.index, 1, false); - game.log(target, "的", "#g" + ["手牌上限", "攻击范围"][result.index], "+1"); - game.delayx(); - } - if (event.count > 0) event.goto(1); - }, - group: ["huaiyuan_init", "huaiyuan_die"], - subSkill: { - init: { - audio: "huaiyuan", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - filter: function (event, player) { - return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0; - }, - content: function () { - var hs = player.getCards("h"); - if (hs.length) player.addGaintag(hs, "huaiyuanx"); - }, - }, - die: { - trigger: { player: "die" }, - direct: true, - forceDie: true, - skillAnimation: true, - animationColor: "water", - filter: function (event, player) { - return player.hasMark("huaiyuan_effect0") || player.hasMark("huaiyuan_effect1"); - }, - content: function () { - "step 0"; - var str = "令一名其他角色", - num1 = player.countMark("huaiyuan_effect0"), - num2 = player.countMark("huaiyuan_effect1"); - if (num1 > 0) { - str += "手牌上限+"; - str += num1; - if (num2 > 0) str += "且"; - } - if (num2 > 0) { - str += "攻击范围+"; - str += num2; - } - player - .chooseTarget(lib.filter.notMe, get.prompt("huaiyuan"), str) - .set("forceDie", true) - .set("ai", function (target) { - return get.attitude(_status.event.player, target) + 114514; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("huaiyuan_die", target); - var num1 = player.countMark("huaiyuan_effect0"), - num2 = player.countMark("huaiyuan_effect1"); - if (num1 > 0) { - target.addSkill("huaiyuan_effect0"); - target.addMark("huaiyuan_effect0", num1, false); - } - if (num2 > 0) { - target.addSkill("huaiyuan_effect1"); - target.addMark("huaiyuan_effect1", num2, false); - } - game.delayx(); - } - }, - }, - effect0: { - charlotte: true, - onremove: true, - mod: { - maxHandcard: function (player, num) { - return num + player.countMark("huaiyuan_effect0"); - }, - }, - marktext: "怀", - intro: { content: "手牌上限+#" }, - }, - effect1: { - charlotte: true, - onremove: true, - mod: { - attackRange: function (player, num) { - return num + player.countMark("huaiyuan_effect1"); - }, - }, - marktext: "远", - intro: { content: "攻击范围+#" }, - }, - }, - }, - chongxin: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.countCards("he") > 0 && - game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }) - ); - }, - filterCard: true, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - check: function (card) { - return 6 - get.value(card); - }, - discard: false, - lose: false, - delay: false, - position: "he", - content: function () { - "step 0"; - player.recast(cards); - "step 1"; - if (target.countCards("he") > 0) { - target.chooseCard("he", true, "请重铸一张牌", lib.filter.cardRecastable); - } else event.finish(); - "step 2"; - if (result.bool) { - target.recast(result.cards); - } - }, - ai: { - order: 6, - result: { - player: 1, - target: function (player, target) { - return 0.5 * Math.sqrt(Math.min(3, target.countCards("h"))); - }, - }, - }, - }, - dezhang: { - trigger: { player: "phaseZhunbeiBegin" }, - derivation: "weishu", - juexingji: true, - forced: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return !player.hasCard(function (card) { - return card.hasGaintag("huaiyuanx"); - }, "h"); - }, - content: function () { - player.awakenSkill("dezhang"); - player.loseMaxHp(); - player.addSkills("weishu"); - }, - }, - weishu: { - audio: 2, - trigger: { player: "gainAfter" }, - forced: true, - filter: function (event, player) { - return event.getParent().name == "draw" && event.getParent(2).name != "weishu" && event.getParent("phaseDraw").player != player; - }, - content: function () { - "step 0"; - player.chooseTarget(true, "请选择【卫戍】的目标", "令一名角色摸一张牌").set("ai", function (target) { - return get.attitude(_status.event.player, target) * Math.sqrt(Math.max(1, 4 - target.countCards("h"))); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.draw(); - } - }, - group: "weishu_discard", - subSkill: { - discard: { - trigger: { - player: "loseAfter", - global: "loseAsyncAfter", - }, - forced: true, - filter: function (event, player) { - return event.type == "discard" && event.getParent(3).name != "weishu_discard" && event.getParent("phaseDiscard").player != player && event.getl(player).cards2.length > 0 && game.hasPlayer(target => target != player && target.countDiscardableCards(player, "he") > 0); - }, - content: function () { - "step 0"; - player - .chooseTarget(true, "请选择【卫戍】的目标", "弃置一名其他角色的一张牌", function (card, player, target) { - return target != player && target.countDiscardableCards(player, "he") > 0; - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.effect(target, { name: "guohe_copy2" }, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - player.discardPlayerCard(target, "he", true); - } - }, - }, - }, - }, - gaoling: { - audio: 2, - trigger: { player: "showCharacterAfter" }, - hiddenSkill: true, - filter: function (event, player) { - return ( - event.toShow.includes("xuangongzhu") && - player != _status.currentPhase && - game.hasPlayer(function (current) { - return current.isDamaged(); - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("gaoling"), "令一名角色回复1点体力", function (card, player, target) { - return target.isDamaged(); - }) - .set("ai", function (target) { - var player = _status.event.player; - return get.recoverEffect(target, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("gaoling", target); - target.recover(); - } - }, - }, - qimei: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - direct: true, - preHidden: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("qimei"), "选择一名其他角色并获得“齐眉”效果", lib.filter.notMe) - .set("ai", function (target) { - var player = _status.event.player; - return get.attitude(player, target) / (Math.abs(player.countCards("h") + 2 - target.countCards("h")) + 1); - }) - .setHiddenSkill("qimei"); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("qimei", target); - player.storage.qimei_draw = target; - player.addTempSkill("qimei_draw", { player: "phaseBegin" }); - game.delayx(); - } - }, - subSkill: { - draw: { - audio: "qimei", - charlotte: true, - forced: true, - popup: false, - trigger: { - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "loseAfter", "addToExpansionAfter"], - }, - usable: 1, - filter: function (event, player) { - var target = player.storage.qimei_draw; - if (!target || !target.isIn()) return false; - if (player.countCards("h") != target.countCards("h")) return false; - var hasChange = function (event, player) { - var gain = 0, - lose = 0; - if (event.getg) gain = event.getg(player).length; - if (event.getl) lose = event.getl(player).hs.length; - return gain != lose; - }; - return hasChange(event, player) || hasChange(event, target); - }, - content: function () { - "step 0"; - if (trigger.delay === false) game.delayx(); - "step 1"; - var target = player.storage.qimei_draw; - player.logSkill("qimei_draw", target); - var drawer = []; - var hasChange = function (event, player) { - var gain = 0, - lose = 0; - if (event.getg) gain = event.getg(player).length; - if (event.getl) lose = event.getl(player).hs.length; - return gain != lose; - }; - if (hasChange(trigger, player)) drawer.push(target); - if (hasChange(trigger, target)) drawer.push(player); - if (drawer.length == 1) drawer[0].draw(); - else { - game.asyncDraw(drawer.sortBySeat()); - game.delayex(); - } - }, - group: "qimei_hp", - onremove: true, - mark: "character", - intro: { content: "已和$组成齐眉组合" }, - }, - hp: { - audio: "qimei", - trigger: { global: "changeHp" }, - charlotte: true, - forced: true, - logTarget: function (event, player) { - return player.storage.qimei_draw; - }, - usable: 1, - filter: function (event, player) { - var target = player.storage.qimei_draw; - if (!target || !target.isIn()) return false; - if (player != event.player && target != event.player) return false; - return player.hp == target.hp; - }, - content: function () { - game.delayx(); - (player == trigger.player ? player.storage.qimei_draw : player).draw(); - }, - }, - }, - }, - ybzhuiji: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - direct: true, - preHidden: true, - content: function () { - "step 0"; - var list = ["摸两张牌,并于出牌阶段结束时失去1点体力"]; - if (player.isDamaged()) list.push("回复1点体力,并于出牌阶段结束时弃置两张牌"); - player - .chooseControl("cancel2") - .set("choiceList", list) - .set("prompt", get.prompt("ybzhuiji")) - .set("ai", function () { - var player = _status.event.player; - if (player.isDamaged() && player.countCards("h", "tao") < player.getDamagedHp()) return 1; - return "cancel2"; - }) - .setHiddenSkill("ybzhuiji"); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("ybzhuiji"); - if (result.index == 0) player.draw(2); - else player.recover(); - player.addTempSkill("ybzhuiji_" + result.index, "phaseUseAfter"); - } - }, - subSkill: { - 0: { - trigger: { player: "phaseUseEnd" }, - forced: true, - charlotte: true, - content: function () { - player.loseHp(); - }, - }, - 1: { - trigger: { player: "phaseUseEnd" }, - forced: true, - charlotte: true, - content: function () { - player.chooseToDiscard("he", 2, true); - }, - }, - }, - }, - canmou: { - audio: 2, - trigger: { global: "useCardToPlayer" }, - direct: true, - filter: function (event, player) { - if (!event.player.isMaxHandcard(true) || !event.isFirstTarget || get.type(event.card, null, false) != "trick") return false; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, event.player, current); //&&lib.filter.targetInRange(event.card,event.player,current); - }) - ) { - return true; - } - } - return false; - }, - preHidden: true, - content: function () { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; - player - .chooseTarget(get.prompt("canmou"), function (card, player, target) { - var player = _status.event.source; - return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); //&&lib.filter.targetInRange(_status.event.card,player,target); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.source; - return get.effect(target, trigger.card, player, _status.event.player); - }) - .set("targets", trigger.targets) - .set("card", trigger.card) - .set("source", trigger.player) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill(event.name, event.targets); - trigger.targets.addArray(event.targets); - game.log(event.targets, "也成为了", trigger.card, "的目标"); - } - }, - }, - congjian: { - audio: 2, - trigger: { global: "useCardToTarget" }, - logTarget: "target", - filter: function (event, player) { - return event.target != player && event.targets.length == 1 && get.type(event.card, null, false) == "trick" && event.target.isMaxHp(true) && lib.filter.targetEnabled2(event.card, event.player, player); - }, - check: function (event, player) { - return get.effect(player, event.card, event.player, player) > 0; - }, - preHidden: true, - content: function () { - trigger.targets.push(player); - game.log(player, "也成为了", trigger.card, "的目标"); - var next = game.createEvent("congjian_draw", false); - next.player = player; - event.next.remove(next); - trigger.getParent().after.push(next); - next.setContent(function () { - if ( - player.hasHistory("damage", function (evt) { - return evt.card == event.parent.card; - }) - ) - player.draw(2); - }); - }, - }, - wanyi: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return ( - player.getStorage("wanyi2").length < 4 && - player.hasCard(function (i) { - return get.is.yingbian(i); - }, "hs") - ); - }, - chooseButton: { - dialog: function (event, player) { - var list = ["zhujinqiyuan", "chuqibuyi", "shuiyanqijunx", "dongzhuxianji"]; - list.removeArray(player.getStorage("wanyi2")); - return ui.create.dialog("婉嫕", [list, "vcard"], "hidden"); - }, - filter: function (button, player) { - return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent()); - }, - check: function (button) { - return _status.event.player.getUseValue({ name: button.link[2] }); - }, - backup: function (links) { - return { - audio: "wanyi", - popname: true, - viewAs: { - name: links[0][2], - }, - filterCard: function (card) { - return get.is.yingbian(card); - }, - check: function (card) { - return 1 / Math.max(1, get.value(card)); - }, - position: "hs", - onuse: function (links, player) { - if (!player.storage.wanyi2) player.storage.wanyi2 = []; - player.storage.wanyi2.add(links.card.name); - player.addTempSkill("wanyi2"); - }, - }; - }, - prompt: function (links) { - return "将一张应变牌当做" + get.translation(links[0][2]) + "使用"; - }, - }, - subSkill: { backup: {} }, - ai: { order: 8, result: { player: 1 } }, - }, - wanyi2: { onremove: true }, - maihuo: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - logTarget: "player", - filter: function (event, player) { - return event.card.name == "sha" && event.card.isCard && event.getParent(2).name != "maihuo_effect" && event.cards.filterInD().length > 0 && event.targets.length == 1 && event.player.isIn() && !event.player.getExpansions("maihuo_effect").length; - }, - prompt2: function (event) { - return "令" + get.translation(event.card) + "暂时对你无效"; - }, - check: function (event, player) { - return get.effect(player, event.card, event.player, player) < 0; - }, - content: function () { - trigger.excluded.add(player); - var target = trigger.player, - cards = trigger.cards.filterInD(); - target.addToExpansion("gain2", cards).gaintag.add("maihuo_effect"); - target.storage.maihuo_target = player; - target.addSkill("maihuo_effect"); - }, - group: "maihuo_damage", - subSkill: { - effect: { - trigger: { player: "phaseUseBegin" }, - forced: true, - charlotte: true, - filter: function (event, player) { - return player.getExpansions("maihuo_effect").length > 0; - }, - content: function () { - "step 0"; - var cards = player.getExpansions("maihuo_effect"), - card = cards[0]; - if (card.name != "sha") - card = get.autoViewAs( - { - name: "sha", - isCard: true, - }, - cards - ); - var target = player.storage.maihuo_target; - if (target.isIn() && player.canUse(card, target, null, true)) { - player.useCard(card, target, cards); - } - "step 1"; - player.removeSkill("maihuo_effect"); - }, - marktext: "祸", - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { threaten: 1.05 }, - }, - damage: { - trigger: { source: "damageSource" }, - forced: true, - locked: false, - filter: function (event, player) { - return event.player.hasSkill("maihuo_effect") && event.player.getExpansions("maihuo_effect").length > 0; - }, - content: function () { - trigger.player.removeSkill("maihuo_effect"); - }, - }, - }, - }, - xuanbei: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - forced: true, - locked: false, - content: function () { - var cards = []; - while (cards.length < 2) { - var card = get.cardPile2(function (i) { - return get.is.yingbian(i) && !cards.includes(i); - }); - if (!card) break; - else cards.push(card); - } - if (cards.length) player.gain(cards, "gain2"); - }, - group: "xuanbei_give", - subSkill: { - give: { - trigger: { player: "useCardAfter" }, - usable: 1, - filter: function (event, player) { - return (event.card.yingbian || get.is.yingbian(event.card)) && event.cards.filterInD().length > 0; - }, - direct: true, - content: function () { - "step 0"; - event.cards = trigger.cards.filterInD(); - player.chooseTarget(get.prompt("xuanbei"), "令一名其他角色获得" + get.translation(event.cards), lib.filter.notMe).set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (att < 3) return 0; - if (target.hasJudge("lebu")) att /= 2; - if (target.hasSkillTag("nogain")) att /= 10; - return att / (1 + get.distance(player, target, "absolute")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("xuanbei_give", target); - target.gain(cards, "gain2").giver = player; - } else player.storage.counttrigger.xuanbei_give--; - }, - ai: { expose: 0.1 }, - }, - }, - }, - xianwan: { - audio: 2, - enable: "chooseToUse", - filter: function (event, player) { - return ( - event.filterCard && - event.filterCard( - { - name: "sha" + (player.isLinked() ? "" : "n"), - isCard: true, - }, - player, - event - ) - ); - }, - viewAs: function (cards, player) { - return { - name: "sha" + (player.isLinked() ? "" : "n"), - isCard: true, - }; - }, - filterCard: () => false, - selectCard: -1, - prompt: "将武将牌重置并视为使用【杀】", - log: false, - check: () => 1, - precontent: function () { - player.logSkill("xianwan"); - player.link(); - }, - ai: { - order: 3.4, - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag) { - return tag == "respondSha" + (player.isLinked() ? "" : "n"); - }, - effect: { - target: function (card, player, target, current) { - if (get.tag(card, "respondShan") && current < 0 && !player.isLinked()) return 0.4; - }, - }, - }, - }, - recaiwang: { - audio: "caiwang", - inherit: "caiwang", - group: ["recaiwang_hand", "recaiwang_equip", "recaiwang_judge"], - }, - recaiwang_hand: { - audio: "caiwang", - enable: ["chooseToUse", "chooseToRespond"], - viewAsFilter: function (player) { - var js = player.getCards("h"); - return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player); - }, - selectCard: -1, - filterCard: true, - position: "h", - prompt: "将全部手牌当做【闪】使用", - viewAs: { name: "shan" }, - check: card => 10 - get.value(card), - ai: { - order: 1, - respondShan: true, - skillTagFilter: function (player) { - return player.countCards("h") == 1; - }, - }, - }, - recaiwang_equip: { - audio: "caiwang", - enable: ["chooseToUse", "chooseToRespond"], - viewAsFilter: function (player) { - var js = player.getCards("e"); - return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player); - }, - selectCard: -1, - filterCard: true, - check: card => 9 - get.value(card), - position: "e", - prompt: "将装备区的牌当做【无懈可击】使用", - viewAs: { name: "wuxie" }, - ai: { - order: 1, - }, - }, - recaiwang_judge: { - audio: "caiwang", - enable: ["chooseToUse", "chooseToRespond"], - viewAsFilter: function (player) { - var js = player.getCards("j"); - return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player); - }, - selectCard: -1, - filterCard: true, - position: "j", - prompt: "将判定区的牌当做【杀】使用", - viewAs: { name: "sha" }, - check: card => 1, - locked: false, - ai: { - order: 10, - respondSha: true, - skillTagFilter: function (player) { - return player.countCards("j") == 1; - }, - effect: { - target: function (card, player, target, current) { - if (card && (card.name == "shandian" || card.name == "fulei") && player == target && !target.countCards("j") && target.isPhaseUsing() && target.hasValueTarget({ name: "sha" }, null, true)) return [1, 2]; - }, - }, - }, - mod: { - aiOrder: function (player, card, num) { - if (card.name == "shandian" || card.name == "fulei") return num + 3; - }, - }, - }, - caozhao: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - if ( - player.countCards("h") == 0 || - !game.hasPlayer(function (current) { - return current != player && current.hp <= player.hp; - }) - ) - return false; - var list = player.getStorage("caozhao"); - for (var i of lib.inpile) { - if (!list.includes(i) && ["basic", "trick"].includes(get.type(i))) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = player.getStorage("caozhao"), - vcards = []; - for (var i of lib.inpile) { - if (!list.includes(i)) { - var type = get.type(i); - if (type == "basic" || type == "trick") vcards.push([type, "", i]); - } - } - return ui.create.dialog("草诏", [vcards, "vcard"]); - }, - check: function (button) { - return _status.event.player.getUseValue({ name: button.link[2], isCard: true }, null, true); - }, - backup: function (links, player) { - return { - audio: "caozhao", - cardname: links[0][2], - filterCard: true, - position: "h", - check: function (card) { - return player.getUseValue({ name: lib.skill.caozhao_backup.cardname }) - (player.getUseValue(card, null, true) + 0.1) / (get.value(card) / 6); - }, - filterTarget: function (card, player, target) { - return target != player && target.hp <= player.hp; - }, - discard: false, - lose: false, - content: function () { - "step 0"; - player.showCards(cards, get.translation(player) + "发动【草诏】,声明" + get.translation(lib.skill.caozhao_backup.cardname)); - if (!player.storage.caozhao) player.storage.caozhao = []; - player.storage.caozhao.push(lib.skill.caozhao_backup.cardname); - "step 1"; - target - .chooseControl() - .set("choiceList", ["令" + get.translation(player) + "将" + get.translation(cards[0]) + "的牌名改为" + get.translation(lib.skill.caozhao_backup.cardname), "失去1点体力"]) - .set("ai", function (event, player) { - var target = _status.event.getParent().player; - if (get.attitude(player, target) > 0) return 0; - if (player.hp > 3 || (player.hp > 1 && player.hasSkill("zhaxiang"))) return 1; - if (player.hp > 2) return Math.random() > 0.5 ? 0 : 1; - return 0; - }); - "step 2"; - if (result.index == 1) { - target.addExpose(0.2); - target.loseHp(); - event.finish(); - } else { - player.chooseTarget("是否将" + get.translation(lib.skill.caozhao_backup.cardname) + "(" + get.translation(cards[0]) + ")交给一名其他角色?", lib.filter.notMe).set("ai", () => -1); - } - "step 3"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - if (!target.storage.caozhao_info) target.storage.caozhao_info = {}; - target.storage.caozhao_info[cards[0].cardid] = lib.skill.caozhao_backup.cardname; - target.addSkill("caozhao_info"); - player.give(cards, target, "give").gaintag.add("caozhao"); - } else { - if (!player.storage.caozhao_info) player.storage.caozhao_info = {}; - player.storage.caozhao_info[cards[0].cardid] = lib.skill.caozhao_backup.cardname; - player.addGaintag(cards, "caozhao"); - player.addSkill("caozhao_info"); - } - }, - ai: { - result: { - player: 2, - target: 0.1, - }, - }, - }; - }, - prompt: function (links, player) { - return "将一张手牌声明为" + get.translation(links[0][2]); - }, - }, - ai: { - order: 1, - result: { - player: 1, - }, - }, - }, - caozhao_info: { - charlotte: true, - mod: { - cardname: function (card, player) { - var map = player.storage.caozhao_info; - if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("caozhao")) return map[card.cardid]; - }, - cardnature: function (card, player) { - var map = player.storage.caozhao_info; - if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("caozhao")) return false; - }, - }, - }, - olxibing: { - audio: 2, - trigger: { player: "damageEnd" }, - filter: function (event, player) { - return event.player && event.source && event.player != event.source && event.player.isAlive() && event.source.isAlive() && (event.player.countCards("he") > 0 || event.source.countCards("he") > 0); - }, - direct: true, - content: function () { - "step 0"; - var target = trigger.source; - event.target = target; - player - .chooseTarget(get.prompt("olxibing"), "弃置自己或" + get.translation(target) + "的两张牌,然后手牌数较少的角色摸两张牌且不能对你使用牌直到回合结束", function (card, player, target) { - if (target != player && target != _status.event.target) return false; - return target.countCards("he") > 0; - }) - .set("target", target) - .set("ai", function (targetx) { - var player = _status.event.player, - target = _status.event.target; - if (target == targetx) { - if (get.attitude(player, target) > 0) return 0; - var cards = target - .getCards("he", function (card) { - return lib.filter.canBeDiscarded(card, player, target); - }) - .sort(function (a, b) { - return get.buttonValue(b) - get.buttonValue(a); - }); - if ( - target.countCards("h") - player.countCards("h") >= - Math.max( - 0, - Math.min(2, cards.length) - - target.countCards("e", function (card) { - var index = cards.indexOf(card); - return index != -1 && index < 2; - }) - ) - ) - return 1; - return 0; - } - var cards = player - .getCards("he", function (card) { - return lib.filter.cardDiscardable(card, player, "olxibing"); - }) - .sort(function (a, b) { - return get.useful(a) - get.useful(b); - }); - if ( - player.countCards("h") - target.countCards("h") < - Math.max( - 0, - Math.min(cards.length, 2) - - player.countCards("e", function (card) { - var index = cards.indexOf(card); - return index != -1 && index < 2; - }) - ) && - (cards.length < 2 || get.value(cards[1]) < 5.5) - ) - return 0.8; - return 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("olxibing", target); - var target = result.targets[0]; - if (target == player) player.chooseToDiscard("he", 2, true); - else player.discardPlayerCard(target, "he", true, 2); - } else event.finish(); - "step 2"; - if (player.isIn() && target.isIn()) { - var hs = player.countCards("h"), - ts = target.countCards("h"); - if (hs != ts) { - var drawer = hs > ts ? target : player; - drawer.draw(2); - player.addTempSkill("olxibing2"); - player.markAuto("olxibing2", [drawer]); - } - } - }, - }, - olxibing2: { - mod: { - targetEnabled: function (card, player, target) { - if (target.getStorage("olxibing2").includes(player)) return false; - }, - cardSavable: function (card, player, target) { - if (target.getStorage("olxibing2").includes(player)) return false; - }, - }, - onremove: true, - }, - bolan: { - audio: 2, - banned: ["kotomi_chuanxiang"], - global: "bolan_g", - initList: function (player) { - var list, - skills = []; - if (get.mode() == "guozhan") { - list = []; - for (var i in lib.characterPack.mode_guozhan) { - if (lib.character[i]) list.push(i); - } - } else if (_status.connectMode) list = get.charactersOL(); - else { - list = []; - for (var i in lib.character) { - if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue; - list.push(i); - } - } - for (var i of list) { - if (i.indexOf("gz_jun") == 0) continue; - for (var j of lib.character[i][3]) { - if (j == "bolan") continue; - var skill = lib.skill[j]; - if (!skill || skill.juexingji || skill.hiddenSkill || skill.zhuSkill || skill.dutySkill || skill.chargeSkill || lib.skill.bolan.banned.includes(j)) continue; - if (skill.init || (skill.ai && (skill.ai.combo || skill.ai.notemp || skill.ai.neg))) continue; - var info = lib.translate[j + "_info"]; - if (info && info.indexOf("出牌阶段限一次") != -1) skills.add(j); - } - } - player.storage.bolan = skills; - }, - check: function (event, player) { - return true; - }, - trigger: { player: "phaseUseBegin" }, - frequent: true, - preHidden: true, - content: function () { - "step 0"; - if (player.isIn()) { - if (!player.storage.bolan) lib.skill.bolan.initList(player); - var list = player.storage.bolan.randomGets(3); - if (!list.length) { - event.finish(); - return; - } - player - .chooseControl(list) - .set( - "choiceList", - list.map(function (i) { - return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; - }) - ) - .set("displayIndex", false) - .set("prompt", "博览:请选择你要获得的技能") - .set("ai", () => { - var list = _status.event.controls.slice(); - return list.sort((a, b) => { - return get.skillRank(b, "in") - get.skillRank(a, "in"); - })[0]; - }); - } else event.finish(); - "step 1"; - player.addTempSkills(result.control, "phaseUseEnd"); - player.popup(result.control); - // game.log(player,'获得了','#g【'+get.translation(result.control)+'】'); - }, - ai: { threaten: 0.9 }, - subSkill: { - g: { - audio: "bolan", - forceaudio: true, - enable: "phaseUse", - usable: 1, - prompt: "出牌阶段限一次。你可以令一名有〖博览〗的角色从三个描述中包含“出牌阶段限一次”的技能中选择一个,你获得此技能直到此阶段结束。", - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.hasSkill("bolan"); - }); - }, - filterTarget: function (card, player, target) { - return player != target && target.hasSkill("bolan"); - }, - selectTarget: function () { - if ( - game.countPlayer(current => { - return lib.skill.bolan_g.filterTarget(null, _status.event.player, current); - }) == 1 - ) - return -1; - return 1; - }, - content: function () { - "step 0"; - player.loseHp(); - "step 1"; - if (target.isIn() && player.isIn()) { - if (!target.storage.bolan) lib.skill.bolan.initList(target); - var list = target.storage.bolan.randomGets(3); - if (!list.length) { - event.finish(); - return; - } - target - .chooseControl(list) - .set( - "choiceList", - list.map(function (i) { - return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; - }) - ) - .set("displayIndex", false) - .set("prompt", "博览:请选择令" + get.translation(player) + "获得的技能") - .set("ai", () => { - var list = _status.event.controls.slice(); - return list.sort((a, b) => { - return (get.skillRank(b, "in") - get.skillRank(a, "in")) * get.attitude(_status.event.player, _status.event.getParent().player); - })[0]; - }); - } else event.finish(); - "step 2"; - target.line(player); - player.addTempSkills(result.control, "phaseUseEnd"); - player.popup(result.control); - }, - ai: { - order: function (item, player) { - if (player.hp >= 5 || player.countCards("h") >= 10) return 10; - var list = game.filterPlayer(current => lib.skill.bolan_g.filterTarget(null, player, current)); - for (var target of list) { - if (get.attitude(target, player) > 0) return 10; - } - return 4; - }, - result: { - player: function (player, target) { - if (player.hasUnknown()) return player.hp + player.countCards("h") / 4 - 5 > 0 ? 1 : 0; - var tao = player.countCards("h", "tao"); - if (player.hp + tao > 4) return 4 + get.attitude(player, target); - if (player.hp + tao > 3) return get.attitude(player, target) - 2; - return 0; - }, - }, - }, - }, - }, - }, - yifa: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - forced: true, - logTarget: "player", - filter: function (event, player) { - return player != event.player && (event.card.name == "sha" || (get.color(event.card) == "black" && get.type(event.card) == "trick")); - }, - content: function () { - var target = trigger.player; - target.addTempSkill("yifa2", { player: "phaseEnd" }); - target.addMark("yifa2", 1, false); - }, - ai: { threaten: 0.8 }, - }, - yifa2: { - charlotte: true, - onremove: true, - intro: { content: "手牌上限-#" }, - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("yifa2"); - }, - }, - }, - buchen: { - audio: 2, - trigger: { player: "showCharacterAfter" }, - hiddenSkill: true, - filter: function (event, player) { - var target = _status.currentPhase; - return event.toShow.includes("jin_simayi") && target && target != player && target.countGainableCards(player, "he") > 0; - }, - direct: true, - content: function () { - var target = _status.currentPhase; - player.gainPlayerCard(target, "he", get.prompt("buchen", target)).set("logSkill", ["buchen", target]); - }, - }, - smyyingshi: { - audio: 2, - enable: "phaseUse", - locked: true, - filter: function (event, player) { - return Array.isArray(event.smyyingshi); - }, - onChooseToUse: function (event) { - if (game.online || !event.player.hasSkill("smyyingshi")) return; - var cards = []; - for (var i = 0; i < event.player.maxHp; i++) { - var card = ui.cardPile.childNodes[i]; - if (card) cards.push(card); - else break; - } - event.set("smyyingshi", cards); - }, - chooseButton: { - dialog: function (event) { - var dialog = ui.create.dialog("鹰视", "hidden"); - if (event.smyyingshi && event.smyyingshi.length) dialog.add(event.smyyingshi); - else dialog.addText("牌堆无牌"); - for (var i of dialog.buttons) { - i.classList.add("noclick"); - } - dialog.buttons.length = 0; - return dialog; - }, - filter: function () { - return false; - }, - }, - }, - xiongzhi: { - audio: 2, - enable: "phaseUse", - limited: true, - skillAnimation: true, - animationColor: "thunder", - content: function () { - "step 0"; - player.awakenSkill("xiongzhi"); - "step 1"; - var card = get.cards()[0]; - event.card = card; - player.showCards(card); - if (!player.hasUseTarget(card)) { - card.fix(); - ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - game.updateRoundNumber(); - event.finish(); - } - "step 2"; - var next = player.chooseUseTarget(card, true); - if (get.info(card).updateUsable == "phaseUse") next.addCount = false; - "step 3"; - if (result.bool) event.goto(1); - else { - card.fix(); - ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - game.updateRoundNumber(); - } - }, - ai: { - order: 1, - result: { - player: function (player) { - if (!player.hasSkill("smyyingshi")) return 1; - var cards = []; - for (var i = 0; i < Math.min(2, player.maxHp); i++) { - var card = ui.cardPile.childNodes[i]; - if (card) { - if (!player.hasValueTarget(card)) return 0; - } else break; - } - return 1; - }, - }, - }, - }, - quanbian: { - audio: 2, - trigger: { player: ["useCard", "respond"] }, - hasHand: function (event) { - var evts = event.player.getHistory("lose", function (evt) { - return evt.getParent() == event; - }); - return evts && evts.length == 1 && evts[0].hs.length > 0; - }, - filter: function (event, player) { - var phase = event.getParent("phaseUse"); - if (!phase || phase.player != player) return false; - var suit = get.suit(event.card); - if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false; - return ( - player.getHistory("useCard", function (evt) { - return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase; - }).length + - player.getHistory("respond", function (evt) { - return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase; - }).length == - 0 - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseControl("cancel2") - .set("prompt", get.prompt("quanbian")) - .set("choiceList", ["摸一张牌", "观看牌堆顶的" + get.cnNumber(player.maxHp) + "张牌并将其中一张置于牌堆底"]) - .set("ai", function () { - var player = _status.event.player; - var suit = get.suit(_status.event.getTrigger().card); - if ( - player.countCards("h", function (card) { - return get.suit(card) == suit && player.hasValueTarget(card, null, true); - }) - ) - return "cancel2"; - return 0; - }); - "step 1"; - if (result.control == "cancel2") { - event.finish(); - return; - } - player.addTempSkill("quanbian2"); - player.storage.quanbian2.add(get.suit(trigger.card)); - player.markSkill("quanbian2"); - if (result.index == 0) { - player.draw(); - event.finish(); - return; - } - event.cards = get.cards(player.maxHp); - player.chooseButton(["将一张牌置于牌堆底", event.cards], true); - "step 2"; - while (cards.length) { - var card = cards.pop(); - card.fix(); - if (card == result.links[0]) ui.cardPile.appendChild(card); - else ui.cardPile.insertBefore(card, ui.cardPile.firstChild); - } - game.updateRoundNumber(); - }, - }, - quanbian2: { - init: function (player, skill) { - if (!player.storage[skill]) player.storage[skill] = []; - }, - onremove: true, - mod: { - cardEnabled2: function (card, player) { - if (get.position(card) == "h" && player.storage.quanbian2.includes(get.suit(card))) return false; - }, - }, - intro: { - content: "本回合内不能使用$花色的手牌", - }, - }, - //卫瓘 - zhongyun: { - audio: 2, - trigger: { player: ["damageEnd", "recoverEnd"] }, - forced: true, - filter: function (event, player) { - return ( - player.hp == player.countCards("h") && - (player.isDamaged() || - game.hasPlayer(function (current) { - return player.inRange(current); - })) - ); - }, - usable: 1, - preHidden: ["zhongyun2"], - content: function () { - "step 0"; - var filterTarget = function (card, player, target) { - return player.inRange(target); - }; - if (game.hasPlayer(current => filterTarget("L∞pers", player, current))) { - var bool = player.isHealthy(); - player.chooseTarget("忠允:对攻击范围内的一名角色造成1点伤害" + (bool ? "" : ",或点取消回复1点体力"), filterTarget, bool).set("ai", function (target) { - var player = _status.event.player; - return get.damageEffect(target, player, player); - }); - } else event._result = { bool: false }; - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - target.damage(); - } else player.recover(); - }, - group: "zhongyun2", - }, - zhongyun2: { - audio: "zhongyun", - trigger: { - player: ["loseAfter"], - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - forced: true, - filter: function (event, player) { - var cards1 = event.getl(player).hs, - cards2 = []; - if (event.getg) cards2 = event.getg(player); - return (cards1.length > 0 || cards2.length > 0) && player.countCards("h") == player.hp; - }, - usable: 1, - content: function () { - "step 0"; - if (trigger.delay === false) game.delayx(); - var filterTarget = function (card, player, target) { - return target != player && target.countDiscardableCards(player, "he") > 0; - }; - if (!game.hasPlayer(current => filterTarget("L∞pers", player, current))) event._result = { bool: false }; - else - player.chooseTarget(filterTarget, "忠允:弃置一名其他角色的一张牌,或点取消摸一张牌").set("ai", function (target) { - var att = get.attitude(player, target); - if (att >= 0) return 0; - if ( - target.countCards("he", function (card) { - return get.value(card) > 5; - }) - ) - return -att; - return 0; - }); - "step 1"; - if (!result.bool) player.draw(); - else { - var target = result.targets[0]; - player.line(target, "green"); - player.discardPlayerCard(target, true, "he"); - } - }, - }, - shenpin: { - audio: 2, - trigger: { global: "judge" }, - filter: function (event, player) { - var color = get.color(event.player.judging[0], event.player); - return ( - player.countCards("hes", function (card) { - if (_status.connectMode && get.position(card) != "e") return true; - return get.color(card) != color; - }) > 0 - ); - }, - direct: true, - preHidden: true, - content: function () { - "step 0"; - var color = get.color(trigger.player.judging[0], trigger.player); - player - .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("shenpin"), "hes", function (card) { - if (get.color(card) == _status.event.color) return false; - var player = _status.event.player; - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 != "unchanged") return mod2; - var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); - if (mod != "unchanged") return mod; - return true; - }) - .set("ai", function (card) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - var judging = _status.event.judging; - var result = trigger.judge(card) - trigger.judge(judging); - var attitude = get.attitude(player, trigger.player); - if (attitude == 0 || result == 0) return 0; - if (attitude > 0) { - return result; - } else { - return -result; - } - }) - .set("judging", trigger.player.judging[0]) - .set("color", color) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - player.respond(result.cards, "highlight", "shenpin", "noOrdering"); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - if (trigger.player.judging[0].clone) { - trigger.player.judging[0].clone.classList.remove("thrownhighlight"); - game.broadcast(function (card) { - if (card.clone) { - card.clone.classList.remove("thrownhighlight"); - } - }, trigger.player.judging[0]); - game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0] = result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player, "的判定牌改为", result.cards[0]); - game.delay(2); - } - }, - ai: { - rejudge: true, - tag: { - rejudge: 1, - }, - }, - }, - //彻里吉 - chexuan: { - audio: 2, - enable: "phaseUse", - derivation: ["cheliji_sichengliangyu", "cheliji_tiejixuanyu", "cheliji_feilunzhanyu"], - filter: function (event, player) { - return !player.getEquips(5).length && player.countCards("he", { color: "black" }) > 0; - }, - filterCard: { color: "black" }, - position: "he", - check: function (card) { - return 5 - get.value(card); - }, - content: function () { - "step 0"; - player - .chooseButton( - [ - "请选择要装备的宝物", - [ - lib.skill.chexuan.derivation.map(function (i) { - return ["宝物", "", i]; - }), - "vcard", - ], - ], - true - ) - .set("ai", function (button) { - if (button.link[2] == "cheliji_sichengliangyu" && player.countCards("h") < player.hp) return 1; - return Math.random(); - }); - "step 1"; - var name = result.links[0][2], - card = game.createCard(name, lib.card[name].cardcolor, 5); - player.$gain2(card); - player.equip(card); - game.delay(); - }, - group: "chexuan_lose", - subfrequent: ["lose"], - ai: { - order: 6, - result: { - player: 1, - }, - }, - subSkill: { - lose: { - audio: "chexuan", - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - frequent: true, - filter: function (event, player) { - var evt = event.getl(player); - if (!evt || !evt.es || !evt.es.length) return false; - if (event.name == "equip" && event.player == player) return false; - for (var i of evt.es) { - if (get.subtype(i, false) == "equip5") return true; - } - return false; - }, - content: function () { - "step 0"; - player.judge(function (card) { - if (get.color(card) == "black") return 3; - return 0; - }); - "step 1"; - if (result.bool) { - var card = game.createCard(lib.skill.chexuan.derivation.randomGet()); - player.$gain2(card); - player.equip(card); - game.delay(); - } - }, - }, - }, - }, - qiangshou: { - mod: { - globalFrom: function (player, target, distance) { - if (player.getEquips(5).length) return distance - 1; - }, - }, - }, - cheliji_sichengliangyu: { - trigger: { global: "phaseJieshuBegin" }, - equipSkill: true, - cardcolor: "heart", - filter: function (event, player) { - return player.countCards("h") < player.hp && player.getEquip("cheliji_sichengliangyu"); - }, - content: function () { - "step 0"; - player.draw(2); - "step 1"; - var card = player.getEquip("cheliji_sichengliangyu"); - if (card) player.discard(card); - }, - }, - cheliji_tiejixuanyu: { - trigger: { global: "phaseJieshuBegin" }, - equipSkill: true, - cardcolor: "club", - filter: function (event, player) { - return player != event.player && !event.player.getHistory("sourceDamage").length && event.player.countCards("he") > 0 && player.getEquip("cheliji_tiejixuanyu"); - }, - logTarget: "player", - check: function (event, player) { - return get.attitude(player, event.player) < 0; - }, - content: function () { - "step 0"; - trigger.player.chooseToDiscard("he", 2, true); - "step 1"; - var card = player.getEquip("cheliji_tiejixuanyu"); - if (card) player.discard(card); - }, - }, - cheliji_feilunzhanyu: { - trigger: { global: "phaseJieshuBegin" }, - equipSkill: true, - cardcolor: "spade", - filter: function (event, player) { - return ( - player != event.player && - event.player.getHistory("useCard", function (card) { - return get.type(card.card) != "basic"; - }).length > 0 && - event.player.countCards("he") > 0 && - player.getEquip("cheliji_feilunzhanyu") - ); - }, - logTarget: "player", - check: function (event, player) { - return get.attitude(player, event.player) <= 0; - }, - content: function () { - "step 0"; - trigger.player.chooseCard("he", true, "将一张牌交给" + get.translation(player)); - "step 1"; - if (result.bool) trigger.player.give(result.cards, player); - "step 2"; - var card = player.getEquip("cheliji_feilunzhanyu"); - if (card) player.discard(card); - }, - }, - //司马伷和黄祖 - caiwang: { - audio: 2, - trigger: { global: ["useCard", "respond"] }, - preHidden: true, - filter: function (event, player) { - if (!Array.isArray(event.respondTo) || event.respondTo[0] == event.player || ![event.respondTo[0], event.player].includes(player)) return false; - var color = get.color(event.card); - if (color == "none" || get.color(event.respondTo[1]) != color) return false; - var target = lib.skill.caiwang.logTarget(event, player); - return target[player.getStorage("naxiang2").includes(target) ? "countGainableCards" : "countDiscardableCards"](player, "he") > 0; - }, - logTarget: function (event, player) { - return player == event.respondTo[0] ? event.player : event.respondTo[0]; - }, - prompt2: function (event, player) { - var target = lib.skill.caiwang.logTarget(event, player); - return (player.getStorage("naxiang2").includes(target) ? "获得" : "弃置") + "该角色的一张牌"; - }, - check: function (event, player) { - return get.attitude(player, lib.skill.caiwang.logTarget(event, player)) <= 0; - }, - popup: false, - content: function () { - "step 0"; - if (player != game.me && !player.isOnline()) game.delayx(); - "step 1"; - var target = lib.skill.caiwang.logTarget(trigger, player); - player.logSkill(event.name, target); - player[player.getStorage("naxiang2").includes(target) ? "gainPlayerCard" : "discardPlayerCard"](target, "he", true); - }, - }, - naxiang: { - audio: 2, - trigger: { - player: "damageEnd", - source: "damageSource", - }, - forced: true, - preHidden: true, - filter: function (event, player) { - var target = lib.skill.naxiang.logTarget(event, player); - return target && target != player && target.isAlive(); - }, - logTarget: function (event, player) { - return player == event.player ? event.source : event.player; - }, - content: function () { - player.addTempSkill("naxiang2", { player: "phaseBegin" }); - if (!player.storage.naxiang2) player.storage.naxiang2 = []; - player.storage.naxiang2.add(lib.skill.naxiang.logTarget(trigger, player)); - player.markSkill("naxiang2"); - }, - ai: { - combo: "caiwang", - }, - }, - naxiang2: { - onremove: true, - intro: { - content: "已接受$的投降;对这些角色发动【才望】时将“弃置”改为“获得”", - }, - }, - //李肃 - qiaoyan: { - trigger: { player: "damageBegin2" }, - forced: true, - filter: function (event, player) { - return player != _status.currentPhase && event.source && event.source != player; - }, - logTarget: "source", - content: function () { - "step 0"; - var cards = player.getExpansions("qiaoyan"); - if (cards.length) { - var source = trigger.source; - source.gain(cards, player, "give", "bySelf"); - event.finish(); - } else { - trigger.cancel(); - player.draw(); - } - "step 1"; - var hs = player.getCards("he"); - if (!hs.length) event.finish(); - else if (hs.length == 1) event._result = { bool: true, cards: hs }; - else player.chooseCard("he", true, "将一张牌作为“珠”置于武将牌上"); - "step 2"; - if (result.bool && result.cards && result.cards.length) { - var cards = result.cards; - player.addToExpansion(cards, player, "give").gaintag.add("qiaoyan"); - } - event.finish(); - }, - marktext: "珠", - intro: { content: "expansion", markcount: "expansion" }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - ai: { - filterDamage: true, - skillTagFilter: function (player, tag, arg) { - if (!player.getExpansions("qiaoyan").length) return false; - if (arg && arg.player) { - if (arg.player.hasSkillTag("jueqing", false, player)) return false; - } - }, - }, - }, - xianzhu: { - trigger: { player: "phaseUseBegin" }, - locked: true, - filter: function (event, player) { - return player.getExpansions("qiaoyan").length > 0; - }, - async cost(event, trigger, player) { - event.cards = player.getExpansions("qiaoyan"); - event.result = await player - .chooseTarget(true, "请选择【献珠】的目标", "将" + get.translation(event.cards) + "交给一名角色。若该角色不为你自己,则你令其视为对其攻击范围内的另一名角色使用【杀】") - .set("ai", function (target) { - var player = _status.event.player; - var eff = get.sgn(get.attitude(player, target)) * get.value(_status.event.getParent().cards[0], target); - if (player != target) - eff += Math.max.apply( - null, - game - .filterPlayer(function (current) { - if (current != target && player.inRange(current) && target.canUse("sha", current, false)) return true; - }) - .map(function (current) { - return get.effect(current, { name: "sha" }, target, player); - }) - ); - return eff; - }) - .forResult(); - }, - content: function () { - "step 0"; - event.cards = player.getExpansions("qiaoyan"); - event.target = targets[0]; - "step 1"; - player.give(cards, target, "give"); - "step 2"; - if ( - player != target && - target.isIn() && - player.isIn() && - game.hasPlayer(function (current) { - return current != target && player.inRange(current) && target.canUse("sha", current, false); - }) - ) { - var str = get.translation(target); - player - .chooseTarget(true, "选择攻击范围内的一名角色,视为" + str + "对其使用【杀】", function (card, player, target) { - var source = _status.event.target; - return player.inRange(target) && source.canUse("sha", target, false); - }) - .set("target", target) - .set("ai", function (target) { - var evt = _status.event; - return get.effect(target, { name: "sha" }, evt.target, evt.player); - }); - } else event.finish(); - "step 3"; - if (result.bool) target.useCard({ name: "sha", isCard: true }, result.targets[0], false); - }, - ai: { combo: "qiaoyan" }, - }, - huirong: { - trigger: { player: "showCharacterAfter" }, - forced: true, - filter: function (event, player) { - return ( - event.toShow && - event.toShow.includes("jin_yanghuiyu") && - game.hasPlayer(function (target) { - var num = target.countCards("h"); - return num > target.hp || num < Math.min(5, target.hp); - }) - ); - }, - hiddenSkill: true, - content: function () { - "step 0"; - player - .chooseTarget("请选择【慧容】的目标", "令一名角色将手牌数摸至/弃置至与其体力值相同(至多摸至五张)", true, function (card, player, target) { - var num = target.countCards("h"); - return num > target.hp || num < Math.min(5, target.hp); - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - var num = target.countCards("h"); - if (num > target.hp) return -att * (num - target.hp); - return att * Math.max(0, Math.min(5, target.hp) - target.countCards("h")); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - if (target.countCards("h") < target.hp) target.drawTo(Math.min(5, target.hp)); - else target.chooseToDiscard("h", true, target.countCards("h") - target.hp); - } - }, - }, - ciwei: { - init: () => { - game.addGlobalSkill("ciwei_ai"); - }, - onremove: () => { - if (!game.hasPlayer(i => i.hasSkill("ciwei"), true)) game.removeGlobalSkill("ciwei_ai"); - }, - trigger: { global: "useCard" }, - direct: true, - preHidden: true, - filter: function (event, player) { - if (event.all_excluded || event.player == player || event.player != _status.currentPhase || !player.countCards("he")) return false; - return event.player.getHistory("useCard").indexOf(event) == 1 && ["basic", "trick"].includes(get.type(event.card)); - }, - content: function () { - "step 0"; - if (player != game.me && !player.isOnline()) game.delayx(); - player - .chooseToDiscard(get.prompt("ciwei", trigger.player), "弃置一张牌,取消" + get.translation(trigger.card) + "的所有目标", "he") - .set("ai", function (card) { - return _status.event.goon / 1.4 - get.value(card); - }) - .set( - "goon", - (function () { - if (!trigger.targets.length) return -get.attitude(player, trigger.player); - var num = 0; - for (var i of trigger.targets) { - num -= get.effect(i, trigger.card, trigger.player, player); - } - return num; - })() - ) - .setHiddenSkill(event.name).logSkill = ["ciwei", trigger.player]; - "step 1"; - if (result.bool) { - trigger.targets.length = 0; - trigger.all_excluded = true; - } - }, - }, - ciwei_ai: { - mod: { - aiOrder: function (player, card, num) { - if ( - player != _status.currentPhase || - player.getHistory("useCard").length > 1 || - !game.hasPlayer(function (current) { - return current != player && (get.realAttitude || get.attitude)(current, player) < 0 && current.hasSkill("ciwei") && current.countCards("he") > 0; - }) - ) - return; - if (player.getHistory("useCard").length == 0) { - if (["basic", "trick"].includes(get.type(card))) return num + 10; - return; - } - if (!["basic", "trick"].includes(get.type(card))) return num + 10; - if (!player._ciwei_temp) { - player._ciwei_temp = true; - num /= Math.max(1, player.getUseValue(card)); - } - delete player._ciwei_temp; - return num; - }, - }, - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer(i => i.hasSkill("ciwei"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("ciwei_ai"); - }, - }, - caiyuan: { - trigger: { player: "phaseEnd" }, - forced: true, - preHidden: true, - filter: function (event, player) { - if (player.phaseNumber <= 1) return false; - const history1 = _status.globalHistory, - history2 = player.actionHistory; - for (let i = 0; i < Math.min(history1.length, history2.length); i++) { - let i1 = history1.length - 1 - i, - i2 = history2.length - 1 - i; - if (i > 0 && history2[i2].isMe) break; - if (history1[i1].changeHp.some(evt => evt.player == player && evt.num < 0)) return false; - } - return true; - }, - content: function () { - player.draw(2); - }, - }, - zhuosheng: { - audio: 2, - locked: false, - init: function (player) { - player.addSkill("zhuosheng_count"); - if (game.phaseNumber > 0) { - var hs = player.getCards("h"), - all = player.getAllHistory(), - cards = []; - for (var i = all.length - 1; i >= 0; i--) { - for (var j of all[i].gain) { - cards.addArray(j.cards); - } - if (all[i].isRound) break; - } - cards = cards.filter(function (i) { - return hs.includes(i); - }); - if (cards.length) player.addGaintag(cards, "zhuosheng"); - } - }, - onremove: function (player) { - player.removeSkill("zhuosheng_count"); - player.removeGaintag("zhuosheng"); - }, - mod: { - targetInRange: function (card, player, target) { - if (!card.cards || get.type(card) != "basic") return; - for (var i of card.cards) { - if (i.hasGaintag("zhuosheng")) return game.online ? player == _status.currentPhase : player.isPhaseUsing(); - } - }, - cardUsable: function (card, player, target) { - if (!card.cards || get.mode() == "guozhan" || get.type(card) != "basic" || !(game.online ? player == _status.currentPhase : player.isPhaseUsing())) return; - for (var i of card.cards) { - if (i.hasGaintag("zhuosheng")) return Infinity; - } - }, - aiOrder: function (player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("zhuosheng") && get.type(card) == "basic") return num - 0.1; - }, - }, - trigger: { player: "useCard2" }, - direct: true, - filterx: function (event, player) { - if (!player.isPhaseUsing()) return false; - return ( - player.getHistory("lose", function (evt) { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("zhuosheng")) return true; - } - return false; - }).length > 0 - ); - }, - filter: function (event, player) { - if (!lib.skill.zhuosheng.filterx(event, player)) return false; - if (get.type(event.card) != "trick") return false; - if (event.targets && event.targets.length > 0) return true; - var info = get.info(event.card); - if (info.allowMultiple == false) return false; - if (event.targets && !info.multitarget) { - if ( - game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); - }) - ) { - return true; - } - } - return false; - }, - content: function () { - "step 0"; - var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; - player - .chooseTarget(get.prompt("zhuosheng"), function (card, player, target) { - var player = _status.event.player; - if (_status.event.targets.includes(target)) return true; - return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); - }) - .set("prompt2", prompt2) - .set("ai", function (target) { - var trigger = _status.event.getTrigger(); - var player = _status.event.player; - return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1); - }) - .set("targets", trigger.targets) - .set("card", trigger.card); - "step 1"; - if (result.bool) { - if (!event.isMine() && !event.isOnline()) game.delayx(); - event.targets = result.targets; - } else { - event.finish(); - } - "step 2"; - if (event.targets) { - player.logSkill("zhuosheng", event.targets); - if (trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); - else trigger.targets.addArray(event.targets); - } - }, - group: ["zhuosheng_equip", "zhuosheng_silent"], - subfrequent: ["equip"], - subSkill: { - equip: { - audio: "zhuosheng", - trigger: { player: "useCard" }, - filter: function (event, player) { - return get.type(event.card) == "equip" && lib.skill.zhuosheng.filterx(event, player); - }, - frequent: true, - prompt: "是否发动【擢升】摸一张牌?", - content: function () { - player.draw(); - }, - }, - silent: { - trigger: { - player: "useCard1", - }, - silent: true, - firstDo: true, - filter: function (event, player) { - return get.mode() != "guozhan" && get.type(event.card) == "basic" && lib.skill.zhuosheng.filterx(event, player) && event.addCount !== false; - }, - content: function () { - trigger.addCount = false; - var stat = player.getStat(); - if (stat && stat.card && stat.card[trigger.card.name]) stat.card[trigger.card.name]--; - }, - }, - }, - }, - zhuosheng_count: { - trigger: { - player: "gainBegin", - global: "roundStart", - }, - silent: true, - filter: function (event, player) { - if (event.name == "gain") return event.getParent(2).name != "zhuosheng_equip"; - return game.roundNumber > 1; - }, - content: function () { - if (trigger.name == "gain") trigger.gaintag.add("zhuosheng"); - else player.removeGaintag("zhuosheng"); - }, - }, - xinquanbian: { - audio: "quanbian", - preHidden: true, - trigger: { player: ["useCard", "respond"] }, - filter: function (event, player) { - var phase = event.getParent("phaseUse"); - if (!phase || phase.player != player) return false; - var suit = get.suit(event.card); - if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false; - return ( - player.getHistory("useCard", function (evt) { - return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase; - }).length + - player.getHistory("respond", function (evt) { - return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase; - }).length == - 0 - ); - }, - content: function () { - "step 0"; - var cards = get.cards(Math.min(5, player.maxHp)); - game.cardsGotoOrdering(cards); - var suit = get.suit(trigger.card); - var next = player.chooseToMove("权变:获得一张不为" + get.translation(suit) + "花色的牌并排列其他牌"); - next.set("suit", suit); - next.set("list", [["牌堆顶", cards], ["获得"]]); - next.set("filterMove", function (from, to, moved) { - var suit = _status.event.suit; - if (moved[0].includes(from.link)) { - if (typeof to == "number") { - if (to == 1) { - if (moved[1].length) return false; - return get.suit(from.link, false) != suit; - } - return true; - } - if (moved[1].includes(to.link)) return get.suit(from.link, false) != suit; - return true; - } else { - if (typeof to == "number") return true; - return get.suit(to.link, false) != suit; - } - }); - next.set("processAI", function (list) { - var cards = list[0][1].slice(0).sort(function (a, b) { - return get.value(b) - get.value(a); - }), - gains = []; - for (var i of cards) { - if (get.suit(i, false) != _status.event.suit) { - cards.remove(i); - gains.push(i); - break; - } - } - return [cards, gains]; - }); - "step 1"; - if (result.bool) { - var list = result.moved; - if (list[1].length) player.gain(list[1], "gain2"); - while (list[0].length) { - ui.cardPile.insertBefore(list[0].pop(), ui.cardPile.firstChild); - } - game.updateRoundNumber(); - } - }, - //group:'xinquanbian_count', - init: (player, skill) => player.addSkill("xinquanbian_count"), - onremove: (player, skill) => player.removeSkill("xinquanbian_count"), - }, - xinquanbian_count: { - trigger: { - player: ["useCard0", "phaseUseBefore", "phaseUseAfter"], - }, - silent: true, - firstDo: true, - charlotte: true, - filter: function (event, player) { - if (event.name === "phaseUse") return true; - return player.isPhaseUsing() && lib.skill.quanbian.hasHand(event) && get.type(event.card) != "equip"; - }, - content: function () { - var stat = player.getStat("skill"); - if (this.trigger.name === "phaseUse") { - delete stat.xinquanbian; - } else { - if (!stat.xinquanbian) stat.xinquanbian = 0; - stat.xinquanbian++; - } - }, - mod: { - cardEnabled2: function (card, player) { - var stat = player.getStat("skill"); - if (stat.xinquanbian && stat.xinquanbian >= player.maxHp && get.position(card) == "h" && get.type(card, player) != "equip") return false; - }, - }, - }, - taoyin: { - audio: 2, - trigger: { player: "showCharacterAfter" }, - hiddenSkill: true, - logTarget: function () { - return _status.currentPhase; - }, - filter: function (event, player) { - var target = _status.currentPhase; - return target && target != player && target.isAlive(); - }, - check: function (event, player) { - return get.attitude(player, _status.currentPhase) < 0; - }, - content: function () { - _status.currentPhase.addTempSkill("taoyin2"); - _status.currentPhase.addMark("taoyin2", 2, false); - }, - ai: { - expose: 0.2, - }, - }, - taoyin2: { - onremove: true, - charlotte: true, - intro: { - content: "手牌上限-#", - }, - mod: { - maxHandcard: function (player, num) { - return num - player.countMark("taoyin2"); - }, - }, - }, - yimie: { - audio: 2, - usable: 1, - preHidden: true, - trigger: { source: "damageBegin1" }, - filter: function (event, player) { - return player != event.player && event.num < event.player.hp; - }, - check: function (event, player) { - if (event.player.hasSkillTag("nodamage")) return false; - let tj = player.countCards("hs", function (card) { - return get.name(card) === "tao" || get.name(card) === "jiu"; - }), - att = get.attitude(_status.event.player, event.player), - eff = get.damageEffect(event.player, player, _status.event.player, get.natureList(event)), - fd = event.player.hasSkillTag("filterDamage", null, { - player: player, - card: event.card, - }), - hp = player.hp + tj; - if (player.storage.tairan2) hp -= player.storage.tairan2; - if (eff <= 0 || fd || att >= -2 || Math.abs(hp) <= 1) return false; - if (hp > 2 || (eff > 0 && event.player.isLinked() && event.hasNature())) return true; - return !event.player.countCards("hs") || (event.player.hp > 2 * event.num && !event.player.hasSkillTag("maixie")); - }, - logTarget: "player", - content: function () { - player.loseHp(); - trigger.player.addTempSkill("yimie2"); - trigger.yimie_num = trigger.player.hp - trigger.num; - trigger.num = trigger.player.hp; - }, - ai: { - damageBonus: true, - skillTagFilter: function (player, tag, arg) { - return arg && arg.target && arg.target.hp > 1 && player.hp > 1 && get.attitude(player, arg.target) < -2; - }, - }, - }, - yimie2: { - trigger: { player: "damageEnd" }, - forced: true, - popup: false, - charlotte: true, - filter: function (event, player) { - return typeof event.yimie_num == "number"; - }, - content: function () { - player.recover(trigger.yimie_num); - }, - }, - ruilve: { - unique: true, - audio: 2, - global: "ruilve2", - zhuSkill: true, - }, - ruilve2: { - enable: "phaseUse", - discard: false, - lose: false, - delay: false, - line: true, - log: false, - prepare: function (cards, player, targets) { - targets[0].logSkill("ruilve"); - }, - prompt: function () { - var player = _status.event.player; - var list = game.filterPlayer(function (target) { - return target != player && target.hasZhuSkill("ruilve", player); - }); - var str = "将一张具有伤害标签的基本牌或锦囊牌交给" + get.translation(list); - if (list.length > 1) str += "中的一人"; - return str; - }, - filter: function (event, player) { - if (player.group != "jin") return false; - if (player.countCards("h", lib.skill.ruilve2.filterCard) == 0) return false; - return game.hasPlayer(function (target) { - return target != player && target.hasZhuSkill("ruilve", player) && !target.hasSkill("ruilve3"); - }); - }, - filterCard: function (card) { - if (!get.tag(card, "damage")) return false; - var type = get.type(card); - return type == "basic" || type == "trick"; - }, - visible: true, - filterTarget: function (card, player, target) { - return target != player && target.hasZhuSkill("ruilve", player) && !target.hasSkill("ruilve3"); - }, - content: function () { - player.give(cards, target); - target.addTempSkill("ruilve3", "phaseUseEnd"); - }, - ai: { - expose: 0.3, - order: 1, - result: { - target: 5, - }, - }, - }, - ruilve3: {}, - tairan: { - audio: 2, - trigger: { player: "phaseEnd" }, - forced: true, - preHidden: true, - filter: function (event, player) { - return player.hp < player.maxHp || player.countCards("h") < player.maxHp; - }, - content: function () { - "step 0"; - player.addSkill("tairan2"); - if (!player.storage.tairan2) player.storage.tairan2 = 0; - var num = player.maxHp - player.hp; - if (num > 0) { - player.storage.tairan2 = num; - player.recover(num); - } - "step 1"; - if (player.countCards("h") < player.maxHp) player.drawTo(Math.min(player.maxHp, 5 + player.countCards("h"))).gaintag = ["tairan"]; - }, - }, - tairan2: { - mod: { - aiOrder: function (player, card, num) { - if (card.hasGaintag && card.hasGaintag("tairan")) return 10 * num; - }, - aiValue: function (player, card, num) { - if (card.hasGaintag && card.hasGaintag("tairan")) { - if (card.name !== "wuxie" && (get.type(card) === "basic" || get.type(card, "trick") === "trick")) return num / 64; - return num / 8; - } - }, - aiUseful: function (player, card, num) { - return lib.skill.tairan2.mod.aiValue.apply(this, arguments); - }, - }, - audio: "tairan", - trigger: { player: "phaseUseBegin" }, - charlotte: true, - forced: true, - onremove: true, - content: function () { - var map = player.storage.tairan2; - if (map > 0) player.loseHp(map); - var hs = player.getCards("h", function (card) { - return card.hasGaintag("tairan"); - }); - if (hs.length) player.discard(hs); - player.removeSkill("tairan2"); - }, - }, - baoqie: { - audio: 2, - trigger: { player: "showCharacterAfter" }, - forced: true, - hiddenSkill: true, - filter: function (event, player) { - return event.toShow && event.toShow.includes("jin_xiahouhui"); - }, - content: function () { - "step 0"; - var card = get.cardPile(function (card) { - return get.subtype(card, false) == "equip5" && !get.cardtag(card, "gifts"); - }); - if (!card) { - event.finish(); - return; - } - event.card = card; - player.gain(card, "gain2"); - "step 1"; - if (player.getCards("h").includes(card) && get.subtype(card) == "equip5") player.chooseUseTarget(card).nopopup = true; - }, - }, - jyishi: { - audio: 2, - trigger: { - global: ["loseAfter", "loseAsyncAfter"], - }, - usable: 1, - direct: true, - preHidden: true, - filter: function (event, player) { - var target = _status.currentPhase; - if (!target || !target.isIn() || event.type != "discard" || !target.isPhaseUsing()) return false; - if (target == player) return false; - var evt = event.getl(target); - for (var i of evt.hs) { - if (get.position(i, true) == "d") return true; - } - return false; - }, - content: function () { - "step 0"; - event.target = _status.currentPhase; - event.cards = trigger.getl(event.target).hs.filterInD("d"); - var str = "是否发动【宜室】令" + get.translation(event.target) + "获得一张牌"; - if (event.cards.length > 1) str += ",然后获得其余的牌"; - str += "?"; - player - .chooseButton([str, event.cards]) - .set("ai", function (button) { - var card = button.link; - var source = _status.event.source; - if (get.attitude(player, source) > 0) return Math.max(1, source.getUseValue(card, null, true)); - var cards = _status.event.getParent().cards.slice(0); - if (cards.length == 1) return -get.value(card); - cards.remove(card); - return get.value(cards) - get.value(card) - 2; - }) - .set("source", event.target) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - player.logSkill("jyishi", target); - if (cards.length > 1) { - target.$gain2(result.links[0]); - target.gain(result.links[0], "log"); - } else trigger.player.gain(result.links[0], "gain2"); - cards.remove(result.links[0]); - if (cards.length) player.gain(cards, "gain2"); - } else player.storage.counttrigger.jyishi--; - }, - }, - jyishi2: { charlotte: true }, - shiduo: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (target) { - return player != target && player.canCompare(target); - }); - }, - filterTarget: function (card, player, target) { - return player != target && player.canCompare(target); - }, - content: function () { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool && target.isAlive()) { - var num = target.countCards("h"); - if (num > 0) player.gainPlayerCard(target, true, "h", num); - } else event.finish(); - "step 2"; - var num = Math.floor(player.countCards("h") / 2); - if (num && target.isAlive()) player.chooseCard("h", num, true, "交给" + get.translation(target) + get.cnNumber(num) + "张牌"); - else event.finish(); - "step 3"; - if (result.bool && result.cards && result.cards.length) player.give(result.cards, target); - }, - ai: { - order: 1, - result: { - target: function (player, target) { - var delta = target.countCards("h") - player.countCards("h"); - if (delta < 0) return 0; - return -1 - delta; - }, - }, - }, - }, - tuishi: { - audio: 2, - trigger: { player: "showCharacterAfter" }, - forced: true, - locked: false, - hiddenSkill: true, - filter: function (event, player) { - var target = _status.currentPhase; - return player != target && target && target.isAlive() && event.toShow && event.toShow.includes("jin_simazhao"); - }, - content: function () { - player.addTempSkill("tuishi2"); - }, - }, - tuishi2: { - trigger: { global: "phaseEnd" }, - direct: true, - charlotte: true, - filter: function (event, player) { - var target = _status.currentPhase; - return ( - target != player && - target && - target.isAlive() && - game.hasPlayer(function (current) { - return current != target && target.inRange(current); - }) - ); - }, - content: function () { - "step 0"; - var target = _status.currentPhase; - event.target = target; - player - .chooseTarget(get.prompt2("tuishi", event.target), function (card, player, target) { - var source = _status.event.source; - return source != target && source.inRange(target); - }) - .set("source", target) - .set("goon", get.damageEffect(target, player, player) > 0) - .set("ai", function (target) { - if (!_status.event.goon) return 0; - var evt = _status.event; - return get.effect(target, { name: "sha" }, evt.source, evt.player); - }); - "step 1"; - if (result.bool) { - event.target2 = result.targets[0]; - player.logSkill("tuishi"); - player.line2([target, event.target2]); - game.delayx(); - } else event.finish(); - "step 2"; - target.chooseToUse({ - preTarget: event.target2, - prompt: "请对" + get.translation(event.target2) + "使用一张【杀】,或受到来自" + get.translation(player) + "的1点伤害", - filterCard: function (card, player) { - return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); - }, - filterTarget: function (card, player, target) { - return target == _status.event.preTarget && lib.filter.filterTarget.apply(this, arguments); - }, - addCount: false, - }); - "step 3"; - if (!result.bool) target.damage(); - }, - }, - xinchoufa: { - audio: "choufa", - inherit: "choufa", - content: function () { - "step 0"; - player.choosePlayerCard(target, "h", true); - "step 1"; - player.showCards(result.cards, get.translation(player) + "对" + get.translation(target) + "发动了【筹伐】"); - var type = get.type2(result.cards[0], target), - hs = target.getCards("h", function (card) { - return card != result.cards[0] && get.type2(card, target) != type; - }); - if (hs.length) { - target.addGaintag(hs, "xinchoufa"); - target.addTempSkill("xinchoufa2", { player: "phaseAfter" }); - } - }, - }, - xinchoufa2: { - charlotte: true, - onremove: function (player) { - player.removeGaintag("xinchoufa"); - }, - mod: { - cardname: function (card) { - if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return "sha"; - }, - cardnature: function (card) { - if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return false; - }, - }, - }, - choufa: { - enable: "phaseUse", - audio: 2, - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return lib.skill.choufa.filterTarget(null, player, current); - }); - }, - filterTarget: function (card, player, target) { - return target != player && !target.hasSkill("choufa2") && target.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.choosePlayerCard(target, "h", true); - "step 1"; - player.showCards(result.cards); - var type = get.type2(result.cards[0], target); - target.storage.choufa2 = type; - target.addTempSkill("choufa2", { player: "phaseAfter" }); - }, - ai: { - order: 9, - result: { - target: function (player, target) { - return -target.countCards("h"); - }, - }, - }, - }, - choufa2: { - onremove: true, - charlotte: true, - mark: true, - intro: { content: "手牌中的非$牌均视为杀" }, - mod: { - cardname: function (card, player) { - if (get.type2(card, false) != player.storage.choufa2) return "sha"; - }, - cardnature: function (card, player) { - if (get.type2(card, false) != player.storage.choufa2) return false; - }, - }, - }, - zhaoran: { - audio: 2, - trigger: { player: "phaseUseBegin" }, - preHidden: true, - content: function () { - player.addTempSkill("zhaoran2", "phaseUseAfter"); - var cards = player.getCards("h"); - if (cards.length > 0) player.addShownCards(cards, "visible_zhaoran"); - }, - }, - zhaoran2: { - audio: "zhaoran", - group: "zhaoran3", - init: (player, skill) => { - if (!player.storage[skill]) player.storage[skill] = []; - }, - onremove: true, - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player, name) { - if (name == "gainBegin") return true; - var evt = event.getl(player); - if (!evt || !evt.hs || !evt.hs.length) return false; - var list = player.getStorage("zhaoran2"); - for (var i of evt.hs) { - var suit = get.suit(i, player); - if (!list.includes(suit) && !player.countCards("h", { suit: suit })) return true; - } - return false; - }, - content: function () { - "step 0"; - if (trigger.delay === false) game.delayx(); - "step 1"; - var list = []; - var suits = get.copy(player.storage.zhaoran2); - suits.addArray( - player.getCards("h").map(function (card) { - return get.suit(card); - }) - ); - var evt = trigger.getl(player); - for (var i of evt.hs) { - var suit = get.suit(i, player); - if (!suits.includes(suit)) list.add(suit); - } - event.count = list.length; - player.markAuto("zhaoran2", list); - "step 1"; - event.count--; - var filterTarget = function (card, player, target) { - return target != player && target.countDiscardableCards(player, "he") > 0; - }; - if ( - !game.hasPlayer(function (current) { - return filterTarget(null, player, current); - }) - ) - event._result = { bool: false }; - else - player.chooseTarget(filterTarget, "弃置一名其他角色的一张牌或摸一张牌").set("ai", function (target) { - var att = get.attitude(player, target); - if (att >= 0) return 0; - if ( - target.countCards("he", function (card) { - return get.value(card) > 5; - }) - ) - return -att; - return 0; - }); - "step 2"; - if (!result.bool) { - player.logSkill("zhaoran2"); - player.draw(); - } else { - var target = result.targets[0]; - player.logSkill("zhaoran2", target); - player.discardPlayerCard(target, true, "he"); - } - if (event.count > 0) event.goto(1); - }, - intro: { - content: "已因$牌触发过效果", - }, - }, - zhaoran3: { - trigger: { player: ["phaseUseEnd", "gainBegin"] }, - forced: true, - charlotte: true, - firstDo: true, - silent: true, - content: function () { - if (event.triggername == "gainBegin") { - trigger.gaintag.add("visible_zhaoran"); - } else { - player.hideShownCards(player.getCards("h"), "visible_zhaoran"); - } - }, - }, - chengwu: { - zhuSkill: true, - mod: { - inRange: function (from, to) { - if (!from.hasZhuSkill("chengwu") || from._chengwu) return; - from._chengwu = true; - var bool = game.hasPlayer(function (current) { - return current != from && current != to && current.group == "jin" && from.hasZhuSkill("chengwu", current) && current.inRange(to); - }); - delete from._chengwu; - if (bool) return true; - }, - }, - }, - shiren: { - trigger: { player: "showCharacterAfter" }, - hiddenSkill: true, - logTarget: function () { - return _status.currentPhase; - }, - filter: function (event, player) { - if (!event.toShow || !event.toShow.includes("jin_wangyuanji")) return false; - var target = _status.currentPhase; - return target && target != player && target.isAlive() && target.countCards("h") > 0; - }, - content: function () { - var next = game.createEvent("yanxi", false); - next.player = player; - next.target = _status.currentPhase; - next.setContent(lib.skill.yanxi.content); - }, - }, - yanxi: { - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 0; - }, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current != player && current.countCards("h") > 0; - }); - }, - content: function () { - "step 0"; - event.card = target.getCards("h").randomGet(); - var cards; - cards = get.cards(2); - event.cards = cards.concat([event.card]); - while (cards.length) { - ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); - } - if (get.mode() == "guozhan") { - var num = ui.cardPile.childElementCount; - var num1 = get.rand(1, num - 1), - num2 = get.rand(1, num - 1); - if (num1 == num2) { - if (num1 == 0) num2++; - else num1--; - } - event.cards = [event.card, ui.cardPile.childNodes[num1], ui.cardPile.childNodes[num2]]; - } - game.updateRoundNumber(); - event.cards.randomSort(); - game.log(player, "展示了", event.cards); - event.videoId = lib.status.videoId++; - var str = get.translation(player) + "对" + get.translation(target) + "发动了【宴戏】"; - game.broadcastAll( - function (str, id, cards) { - var dialog = ui.create.dialog(str, cards); - dialog.videoId = id; - }, - str, - event.videoId, - event.cards - ); - game.addVideo("showCards", player, [str, get.cardsInfo(event.cards)]); - game.delay(2); - "step 1"; - var func = function (id, target) { - var dialog = get.idDialog(id); - if (dialog) dialog.content.firstChild.innerHTML = "猜猜哪张是" + get.translation(target) + "的手牌?"; - }; - if (player == game.me) func(event.videoId, target); - else if (player.isOnline()) player.send(func, event.videoId, target); - "step 2"; - var next = player.chooseButton(true); - next.set("dialog", event.videoId); - next.set("ai", function (button) { - if (_status.event.answer) return button.link == _status.event.answer ? 1 : 0; - return get.value(button.link, _status.event.player); - }); - if (player.hasSkillTag("viewHandcard", null, target, true)) next.set("answer", card); - "step 3"; - game.broadcastAll("closeDialog", event.videoId); - player.addTempSkill("yanxi2"); - var card2 = result.links[0]; - if (card2 == card) { - player.popup("洗具"); - cards.remove(card2); - player.$gain2(cards); - player.gain(cards, "log").gaintag.add("yanxi"); - player.gain(card, target, "bySelf", "give").gaintag.add("yanxi"); - } else { - player.popup("杯具"); - player.gain(card2, "gain2").gaintag.add("yanxi"); - } - }, - ai: { - order: 6, - result: { - player: 1, - target: -0.6, - }, - }, - }, - yanxi2: { - mod: { - ignoredHandcard: function (card, player) { - if (card.hasGaintag("yanxi")) return true; - }, - cardDiscardable: function (card, player, name) { - if (name == "phaseDiscard" && card.hasGaintag("yanxi")) return false; - }, - }, - onremove: function (player) { - player.removeGaintag("yanxi"); - }, - }, - sanchen: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - var stat = player.getStat("sanchen"); - return game.hasPlayer(function (current) { - return !stat || !stat.includes(current); - }); - }, - filterTarget: function (card, player, target) { - var stat = player.getStat("sanchen"); - return !stat || !stat.includes(target); - }, - content: function () { - "step 0"; - var stat = player.getStat(); - if (!stat.sanchen) stat.sanchen = []; - stat.sanchen.push(target); - if (get.mode() != "guozhan") player.addMark("sanchen", 1, false); - target.draw(3); - "step 1"; - if (!target.countCards("he")) event._result = { bool: false }; - else - target.chooseToDiscard("he", true, 3).set("ai", function (card) { - var list = ui.selected.cards.map(function (i) { - return get.type2(i); - }); - if (!list.includes(get.type2(card))) return 7 - get.value(card); - return -get.value(card); - }); - "step 2"; - if (result.bool && result.cards && result.cards.length) { - var list = []; - for (var i of result.cards) list.add(get.type2(i)); - if (list.length == result.cards.length) { - target.draw(); - player.getStat("skill").sanchen--; - if (get.mode() == "guozhan") player.addTempSkills("pozhu"); - } - } else { - target.draw(); - player.getStat("skill").sanchen--; - if (get.mode() == "guozhan") player.addTempSkills("pozhu"); - } - }, - ai: { - order: 9, - threaten: 1.7, - result: { - target: function (player, target) { - if (target.hasSkillTag("nogain")) return 0.1; - return Math.sqrt(target.countCards("he")); - }, - }, - }, - intro: { - content: "已发动过#次技能", - }, - marktext: "陈", - }, - zhaotao: { - forbid: ["guozhan"], - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "thunder", - filter: function (event, player) { - return player.countMark("sanchen") > 2; - }, - content: function () { - player.awakenSkill("zhaotao"); - player.loseMaxHp(); - player.addSkills("pozhu"); - }, - derivation: "pozhu", - ai: { - combo: "sanchen", - }, - }, - pozhu: { - enable: "phaseUse", - viewAsFilter: function (player) { - return !player.hasSkill("pozhu3", null, null, false) && player.countCards("hs") > 0; - }, - viewAs: { name: "chuqibuyi" }, - filterCard: true, - position: "hs", - check: function (card) { - return 7 - get.value(card); - }, - group: "pozhu2", - }, - pozhu2: { - trigger: { player: "useCardAfter" }, - silent: true, - filter: function (event, player) { - return ( - event.skill == "pozhu" && - (get.mode() == "guozhan" || - !player.getHistory("sourceDamage", function (evt) { - return evt.card == event.card; - }).length) - ); - }, - content: function () { - player.addTempSkill("pozhu3"); - }, - }, - pozhu3: { charlotte: true }, - xijue: { - audio: 2, - trigger: { - global: "phaseBefore", - player: ["enterGame", "showCharacterAfter"], - }, - forced: true, - filter: function (event, player) { - if (player._xijue) return false; - if (get.mode() == "guozhan") return event.name == "showCharacter" && event.toShow && event.toShow.includes("gz_zhanghuyuechen"); - return event.name != "showCharacter" && (event.name != "phase" || game.phaseNumber == 0); - }, - content: function () { - player.addMark("xijue", 4); - player._xijue = true; - }, - intro: { - name2: "爵", - content: "mark", - }, - derivation: ["xijue_tuxi", "xijue_xiaoguo"], - group: ["xijue_gain", "xijue_tuxi", "xijue_xiaoguo"], - }, - xijue_gain: { - audio: "xijue", - trigger: { player: "phaseEnd" }, - forced: true, - filter: function (event, player) { - var stat = player.getStat(); - return stat.damage && stat.damage > 0; - }, - content: function () { - player.addMark("xijue", player.getStat().damage); - }, - }, - xijue_tuxi: { - audio: 2, - trigger: { - player: "phaseDrawBegin2", - }, - direct: true, - filter: function (event, player) { - return ( - event.num > 0 && - !event.numFixed && - player.hasMark("xijue") && - game.hasPlayer(function (target) { - return player != target && target.countCards("h") > 0; - }) - ); - }, - content: function () { - "step 0"; - var num = trigger.num; - if (get.mode() == "guozhan" && num > 2) num = 2; - player.chooseTarget( - "是否弃置一枚“爵”发动【突袭】?", - "获得至多" + get.translation(num) + "名角色的各一张手牌,然后少摸等量的牌", - [1, num], - function (card, player, target) { - return target.countCards("h") > 0 && player != target; - }, - function (target) { - var att = get.attitude(_status.event.player, target); - if (target.hasSkill("tuntian")) return att / 10; - return 1 - att; - } - ); - "step 1"; - if (result.bool) { - result.targets.sortBySeat(); - player.logSkill("xijue_tuxi", result.targets); - player.removeMark("xijue", 1); - player.gainMultiple(result.targets); - trigger.num -= result.targets.length; - } else { - event.finish(); - } - "step 2"; - if (trigger.num <= 0) game.delay(); - }, - ai: { - expose: 0.2, - }, - }, - xijue_xiaoguo: { - audio: 2, - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return ( - player.hasMark("xijue") && - event.player.isAlive() && - event.player != player && - player.countCards("h", function (card) { - if (_status.connectMode || get.mode() != "guozhan") return true; - return get.type(card) == "basic"; - }) - ); - }, - direct: true, - content: function () { - "step 0"; - var nono = - Math.abs(get.attitude(player, trigger.player)) < 3 || - trigger.player.hp > player.countMark("xijue") * 1.5 || - trigger.player.countCards("e", function (card) { - return get.value(card, trigger.player) <= 0; - }); - if (get.damageEffect(trigger.player, player, player) <= 0) { - nono = true; - } - var next = player.chooseToDiscard(`是否弃置一枚“爵”和一张${get.mode() == "guozhan" ? "基本" : "手"}牌,对${get.translation(trigger.player)}发动【骁果】?`, "h", function (card, player) { - if (get.mode() != "guozhan") return true; - return get.type(card, player) == "basic"; - }); - next.set("ai", function (card) { - if (_status.event.nono) return 0; - return 8 - get.useful(card); - }); - next.set("logSkill", ["xijue_xiaoguo", trigger.player]); - next.set("nono", nono); - "step 1"; - if (result.bool) { - player.removeMark("xijue", 1); - var nono = get.damageEffect(trigger.player, player, trigger.player) >= 0; - trigger.player - .chooseToDiscard("he", "弃置一张装备牌并令" + get.translation(player) + "摸一张牌,或受到1点伤害", { type: "equip" }) - .set("ai", function (card) { - if (_status.event.nono) { - return 0; - } - if (_status.event.player.hp == 1) return 10 - get.value(card); - return 9 - get.value(card); - }) - .set("nono", nono); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - if (get.mode() != "guozhan") player.draw(); - } else { - trigger.player.damage(); - } - }, - ai: { - expose: 0.3, - threaten: 1.3, - }, - }, - huishi: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter: function (event, player) { - return ui.cardPile.childElementCount % 10 > 0 && !event.numFixed; - }, - preHidden: true, - prompt: function () { - return get.prompt("huishi") + "(当前牌堆尾数:" + (ui.cardPile.childElementCount % 10) + ")"; - }, - check: function (event, player) { - return ui.cardPile.childElementCount % 10 > 3; - }, - content: function () { - "step 0"; - trigger.changeToZero(); - var cards = game.cardsGotoOrdering(get.cards(ui.cardPile.childElementCount % 10)).cards; - var num = Math.ceil(cards.length / 2); - var next = player.chooseToMove("慧识:将" + get.cnNumber(num) + "张牌置于牌堆底并获得其余的牌", true); - next.set("list", [["牌堆顶的展示牌", cards], ["牌堆底"]]); - next.set("filterMove", function (from, to, moved) { - if (moved[0].includes(from) && to == 1) return moved[1].length < _status.event.num; - return true; - }); - next.set("filterOk", function (moved) { - return moved[1].length == _status.event.num; - }); - next.set("num", num); - next.set("processAI", function (list) { - var cards = list[0][1].slice(0).sort(function (a, b) { - return get.value(b) - get.useful(a); - }); - return [cards, cards.splice(cards.length - _status.event.num)]; - }); - "step 1"; - if (result.bool) { - var list = result.moved; - if (list[0].length) player.gain(list[0], "gain2"); - while (list[1].length) ui.cardPile.appendChild(list[1].shift().fix()); - } - }, - }, - qingleng: { - audio: 2, - trigger: { global: "phaseEnd" }, - direct: true, - preHidden: true, - filter: function (event, player) { - var target = event.player; - return target != player && target.isIn() && !target.storage.nohp && target.hp + target.countCards("h") >= ui.cardPile.childElementCount % 10 && player.countCards("he") > 0 && player.canUse({ name: "sha", nature: "ice" }, target, false); - }, - content: function () { - "step 0"; - player - .chooseCard("he", get.prompt("qingleng", trigger.player), "将一张牌当做冰【杀】对其使用", function (card, player) { - return player.canUse(get.autoViewAs({ name: "sha", nature: "ice" }, [card]), _status.event.target, false); - }) - .set("target", trigger.player) - .set("ai", function (card) { - if (get.effect(_status.event.target, get.autoViewAs({ name: "sha", nature: "ice" }, [card]), player) <= 0) return false; - return 6 - get.value(card); - }) - .setHiddenSkill(event.name); - "step 1"; - if (result.bool) { - player.useCard(get.autoViewAs({ name: "sha", nature: "ice" }, result.cards), result.cards, false, trigger.player, "qingleng"); - if (!player.storage.qingleng || !player.storage.qingleng.includes(trigger.player)) { - player.draw(); - player.markAuto("qingleng", [trigger.player]); - player.storage.qingleng.sortBySeat(); - } - } - }, - intro: { - content: "已对$发动过此技能", - }, - }, - xuanmu: { - audio: 2, - trigger: { player: "showCharacterAfter" }, - forced: true, - hiddenSkill: true, - filter: function (event, player) { - return event.toShow.includes("jin_zhangchunhua") && player != _status.currentPhase; - }, - content: function () { - player.addTempSkill("xuanmu2"); - }, - }, - xuanmu2: { - trigger: { player: "damageBegin4" }, - forced: true, - popup: false, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target) { - if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) return "zerotarget"; - }, - }, - }, - }, - g_hidden_ai: { - charlotte: true, - ai: { - threaten: function (player, target) { - if (get.mode() != "guozhan" && target.isUnseen(2)) return 0.0001; - return 1; - }, - }, - }, - }, - card: { - cheliji_sichengliangyu: { - fullskin: true, - vanish: true, - derivation: "cheliji", - destroy: "chexuan", - type: "equip", - subtype: "equip5", - skills: ["cheliji_sichengliangyu"], - }, - cheliji_tiejixuanyu: { - fullskin: true, - vanish: true, - derivation: "cheliji", - destroy: "chexuan", - type: "equip", - subtype: "equip5", - skills: ["cheliji_tiejixuanyu"], - }, - cheliji_feilunzhanyu: { - fullskin: true, - vanish: true, - derivation: "cheliji", - destroy: "chexuan", - type: "equip", - subtype: "equip5", - skills: ["cheliji_feilunzhanyu"], - }, - }, - characterIntro: { - zhanghuyuechen: "张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。三国时期曹魏将领。名将张辽之子。官至偏将军,袭封晋阳侯,有一子张统。乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。", - duyu: "杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。", - xiahouhui: "夏侯徽(211年-234年),字媛容,沛国谯县(今安徽亳州)人,司马师第一任妻子。征南大将军夏侯尚之女,母德阳乡主为大司马曹真之妹。夏侯徽与司马师之间,生有五个女儿。夏侯徽很有见识器度,每当司马师有什么想法时,都由她从旁策划协助。当时司马师之父司马懿位居上将重位,而他的儿子们都有雄才大略。夏侯徽深知司马师绝非曹魏忠臣,而司马师对出身曹魏家族的夏侯徽也非常顾忌。青龙二年(234年),正逢“大疫”、“大病”之年,夏侯徽被司马师毒杀,时年二十四岁,死后葬于峻平陵。西晋建国后,追谥夏侯徽为景怀皇后。", - shibao: "石苞(?~273年),字仲容,渤海南皮(今河北省南皮县)人。三国时曹魏至西晋重要将领,西晋开国功臣。西晋建立后,历任大司马、侍中、司徒等职,封乐陵郡公,卒后谥号为“武”。", - simazhou: "司马伷(227年~283年6月12日),字子将,河内郡温县(今河南省温县)人。西晋宗室、将领,晋宣帝司马懿第三子,伏太妃所生。晋景帝司马师、文帝司马昭的同父异母弟,晋武帝司马炎的叔父。司马伷少有才气,在曹魏历任宁朔将军、散骑常侍、征虏将军等职,先后受封南安亭侯、东武乡侯,五等爵制建立后,改封南皮伯。西晋建立后,获封东莞郡王,入朝任尚书右仆射、抚军将军,出外拜镇东大将军。后改封琅邪王,加开府仪同三司。西晋伐吴时,率军出涂中,孙皓向他投降并奉上玉玺。战后因功拜大将军,增邑三千户。太康四年(283年),司马伷去世,享年五十七岁。谥号为武,世称“琅邪武王”。著有《周官宁朔新书》八卷,今已亡佚。", - huangzu: "黄祖(?-208年),东汉末年将领。刘表任荆州牧时,黄祖出任江夏太守。初平二年(191年),黄祖在与长沙太守孙坚交战时,其部下将孙坚射死,因此与孙家结下仇怨。之后,黄祖多次率部与东吴军队交战,射杀凌操、徐琨等人。建安十三年(208年),在与孙权的交战中,兵败被杀。", - cheliji: "彻里吉是历史小说《三国演义》中的虚构人物,西羌国王。蜀相诸葛亮伐魏,魏都督曹真驰书赴羌,国王彻里吉即命雅丹丞相与越吉元帅起羌兵一十五万、并战车直扣西平关。后军大败,越吉亡,雅丹被俘,亮将所获羌兵及车马器械,尽给还雅丹,俱放回国。彻里吉感蜀恩义,与之结盟。正史中没有关于彻里吉的记载。", - weiguan: "卫瓘(220年-291年),字伯玉。河东郡安邑县(今山西省夏县)人。三国曹魏后期至西晋初年重臣、书法家,曹魏尚书卫觊之子。卫瓘出身官宦世家,年轻时仕官于曹魏,历任尚书郎、散骑常侍、侍中、廷尉等职。后以镇西军司、监军身份参与伐蜀战争。蜀汉亡后,与钟会一道逮捕邓艾;钟会谋反时,又成功平息叛乱,命田续杀邓艾父子。回师后转任督徐州诸军事、镇东将军,封菑阳侯。西晋建立后,历任青州、幽州刺史、征东大将军等职,成功化解北方边境威胁,因功进爵菑阳公。后入朝为尚书令、侍中,又升任司空,领太子少傅。后逊位,拜太保。晋惠帝即位后,与贾皇后对立,终在政变中满门遇害,享年七十二岁。卫瓘善隶书及章草。不仅兼工各体,还能学古人之长,是颇有创意的书法家。唐朝张怀瓘《书断》中评其章草为“神品”。", - zhongyan: " 钟琰 (?—?年)颍川人,王浑之妻。生卒年不详,约魏末晋初间前后在世。王浑的妻子钟琰,是颍川人,为魏太傅钟繇的曾孙女,父亲钟徽,为黄门郎。她平时广泛阅读各种书籍,因此几岁的时候就能撰写文章。她聪慧弘雅,善于啸咏,她的礼仪法度,为中表所推崇,她写有文集五卷。", - yangyan: "杨艳(238年-274年8月25日),字琼芝,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第一任皇后,曹魏通事郎杨炳之女。自幼父母双亡,为舅舅赵俊所养,跟随继母段氏生活。聪明贤慧,善于书法,天生丽质,娴熟女红,嫁给了世子司马炎。泰始元年(265年),晋武帝即位,建立西晋。泰始二年(266年),杨艳受册为皇后,深得晋武帝宠幸,生下三子三女,包括晋惠帝司马衷。泰始十年(274年),去世,时年三十七,陪葬于峻阳陵,谥号武元皇后。", - yangzhi: "杨芷(259年-292年3月6日),字季兰,小字男胤,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第二任皇后,东汉太尉杨震幼子杨奉后裔,东汉末年东莱太守、蓩亭侯杨众曾孙女,西晋太傅杨骏与嫡妻庞氏之女,武元皇后杨艳堂妹。咸宁二年(276年),立为皇后,史称“婉嫕有妇德, 美映椒房”,得宠于晋武帝。生渤海殇王,早薨,之后再无生育。其父杨骏擅权引起皇后贾南风忌恨,贾南风联络汝南王司马亮、楚王司马玮发动政变,杀死杨骏,并唆使大臣上书状告杨芷谋反,让晋惠帝司马衷将其贬为庶人,押到金墉城居住。元康二年(292年),杨芷冻饿而死,谥号武悼皇后。", - xinchang: "辛敞(生卒年不详),字泰雍,陇西人氏,是曹魏时代官员。卫尉辛毗之子,辛宪英之弟。", - xuangongzhu: "高陵宣公主(?—?)司马氏,晋宣帝司马懿第二女。司马氏下嫁杜预。其侄司马炎登基时,司马氏已经去世。泰始年间(265年—274年)追赠高陵公主。", - jin_guohuai: "郭槐(237年-296年),字媛韶,太原阳曲(今山西太原)人,魏晋权臣贾充的妻子。父亲是曹魏城阳郡太守郭配,伯父是曹魏名将郭淮。出身太原郭氏。二十一岁时,嫁贾充作继室,生二女二子,长女贾南风,次女贾午,一子贾黎民。贾南风是西晋惠帝司马衷皇后,干预国政,专权误国,直接导致“八王之乱”和西晋亡国。", - wangxiang: "王祥(184年,一作180年-268年4月30日),字休徵。琅邪临沂(今山东省临沂市西孝友村)人。三国曹魏及西晋时大臣。王祥于东汉末隐居二十年,在曹魏,先后任县令、大司农、司空、太尉等职,封爵睢陵侯。西晋建立,拜太保,进封睢陵公。泰始四年四月戊戌日(268年4月30日)去世,年八十五(一作八十九),谥号“元”。有《训子孙遗令》一文传世。王祥侍奉后母朱氏极孝,为传统文化中二十四孝之一“卧冰求鲤”的主人翁。", - chengjichengcui: "成倅、成济(?~260年6月21日),扬州丹阳(今安徽省宣城市)人。三国时期曹魏将领。依附于司马氏家族,得到司马昭的心腹贾充指使,刺死魏帝曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。据《魏氏春秋》记载,成济兄弟不服罪,光着身子跑到屋顶,大骂司马昭,被军士从下乱箭射杀。", - }, - characterTitle: {}, - characterFilter: {}, - dynamicTranslate: {}, - perfectPair: { - jin_simayi: ["jin_zhangchunhua", "shibao", "duyu"], - jin_simazhao: ["jin_wangyuanji"], - jin_simashi: ["jin_xiahouhui", "jin_yanghuiyu"], - xuangongzhu: ["duyu"], - }, - characterReplace: { - yanghu: ["jin_yanghu", "dc_yanghu", "sp_yanghu"], - jiachong: ["dc_jiachong", "jin_jiachong", "jiachong"], - yangyan: ["yangyan", "old_yangyan"], - yangzhi: ["yangzhi", "old_yangzhi"], - zhongyan: ["zhongyan", "clan_zhongyan"], - }, - translate: { - jin_zhangchunhua: "晋张春华", - jin_zhangchunhua_prefix: "晋", - huishi: "慧识", - huishi_info: "摸牌阶段,你可以放弃摸牌,改为观看牌堆顶的X张牌,获得其中的一半(向下取整),然后将其余牌置入牌堆底。(X为牌堆数量的个位数)", - qingleng: "清冷", - qingleng_info: "一名角色的回合结束时,若其体力值与手牌数之和不小于X,则你可将一张牌当无距离限制的冰属性【杀】对其使用(X为牌堆数量的个位数)。若这是你本局游戏内首次对其发动此技能,则你摸一张牌。", - xuanmu: "宣穆", - xuanmu2: "宣穆", - xuanmu_info: "锁定技,隐匿技。你于其他角色的回合登场时,防止你受到的伤害直到回合结束。", - jin_simayi: "晋司马懿", - jin_simayi_prefix: "晋", - zhanghuyuechen: "张虎乐綝", - xijue: "袭爵", - xijue_gain: "袭爵", - xijue_info: "锁定技,游戏开始时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。", - xijue_info_guozhan: "锁定技,当你首次明置此武将牌时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。", - xijue_tuxi: "突袭", - xijue_tuxi_info: "摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。", - xijue_tuxi_info_guozhan: "摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。", - xijue_xiaoguo: "骁果", - xijue_xiaoguo_info: "其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。", - xijue_xiaoguo_info_guozhan: "其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌;2.受到你对其造成的1点伤害。", - gz_duyu: "杜预", - duyu: "晋杜预", - duyu_prefix: "晋", - sanchen: "三陈", - sanchen_info: "出牌阶段限一次。你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且〖三陈〗于此阶段内使用次数上限+1。", - sanchen_info_guozhan: "出牌阶段,你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且你获得技能〖破竹〗直到回合结束。否则你本阶段内不能再发动〖三陈〗。", - zhaotao: "诏讨", - zhaotao_info: "觉醒技,准备阶段,若你本局游戏内发动〖三陈〗的次数大于2,则你减1点体力上限并获得〖破竹〗。", - pozhu: "破竹", - pozhu_info: "出牌阶段,你可以将一张手牌当做【出其不意】使用。若你未因此牌造成过伤害,则你不能再发动〖破竹〗直到回合结束。", - pozhu_info_guozhan: "出牌阶段限一次,你可以将一张手牌当做【出其不意】使用。", - jin_wangyuanji: "晋王元姬", - jin_wangyuanji_prefix: "晋", - shiren: "识人", - shiren_info: "隐匿技。你于其他角色的回合内登场时,若其有手牌,则你可对其发动〖宴戏〗。", - yanxi: "宴戏", - yanxi2: "宴戏", - yanxi_info: "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆顶的两张牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。", - yanxi_info_guozhan: "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆中的两张随机牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。", - jin_simazhao: "晋司马昭", - jin_simazhao_prefix: "晋", - tuishi: "推弑", - tuishi_info: "隐匿技,你于其他角色A的回合内登场时,可于此回合结束时选择其攻击范围内的一名角色B。A选择一项:①对B使用一张【杀】。②你对A造成1点伤害。", - choufa: "筹伐", - choufa2: "筹伐", - choufa_info: "出牌阶段限一次,你可展示一名其他角色的一张手牌并记录其类型A。你令其原类型不为A的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。", - xinchoufa: "筹伐", - xinchoufa_info: "出牌阶段限一次,你可展示一名其他角色的一张手牌A。你令其所有类型与A不同的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。", - zhaoran: "昭然", - zhaoran2: "昭然", - zhaoran_info: "出牌阶段开始时,你可令你的手牌对其他角色可见直到出牌阶段结束。若如此做,当你于此阶段内失去一张手牌后,若你的手牌里没有与此牌花色相同的牌且你本回合内未因该花色的牌触发过此效果,则你选择一项:①摸一张牌。②弃置一名其他角色的一张牌。", - visible_zhaoran: "invisible", - chengwu: "成务", - chengwu_info: "主公技,锁定技,其他晋势力角色攻击范围内的角色视为在你的攻击范围内。", - jin_xiahouhui: "晋夏侯徽", - jin_xiahouhui_prefix: "晋", - baoqie: "宝箧", - baoqie_info: "隐匿技,锁定技。你登场后,从牌堆或弃牌堆中获得一张不为赠物的宝物牌。若此牌在你的手牌区内为宝物牌,则你可以使用此牌。", - jyishi: "宜室", - jyishi_info: "每回合限一次,当有其他角色于其出牌阶段内因弃置而失去手牌后,你可令其获得这些牌中位于弃牌堆的一张,然后你获得其余位于弃牌堆的牌。", - shiduo: "识度", - shiduo_info: "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得其所有手牌。然后你交给其X张手牌(X为你手牌数的一半,向下取整)。", - jin_simashi: "晋司马师", - jin_simashi_prefix: "晋", - taoyin: "韬隐", - taoyin2: "韬隐", - taoyin_info: "隐匿技,当你登场后,若当前回合角色存在且不是你,则你可令该角色本回合的手牌上限-2。", - yimie: "夷灭", - yimie2: "夷灭", - yimie_info: "每回合限一次,当你对其他角色造成伤害时,若伤害值X小于Y,则你可失去1点体力,将伤害值改为Y。此伤害结算结束后,其回复(Y-X)点体力(Y为其体力值)。", - ruilve: "睿略", - ruilve2: "睿略", - ruilve_info: "主公技,其他晋势力角色的出牌阶段限一次,该角色可以将一张带有伤害标签的基本牌或锦囊牌交给你。", - tairan: "泰然", - tairan2: "泰然", - tairan_info: "锁定技,回合结束时,你将体力回复至体力上限,并将手牌摸至体力上限(称为“泰然”牌,且至多摸五张)。然后你的下一个出牌阶段开始时,你失去上一次以此法回复的体力值的体力,弃置所有“泰然”牌。", - gz_jin_simayi: "司马懿", - gz_jin_zhangchunhua: "张春华", - gz_jin_simazhao: "司马昭", - gz_jin_wangyuanji: "王元姬", - gz_jin_simashi: "司马师", - gz_jin_xiahouhui: "夏侯徽", - xinquanbian: "权变", - xinquanbian_info: "出牌阶段,每当你首次使用/打出一种花色的手牌时,你可以从牌堆顶的X张牌中获得一张与此牌花色不同的牌,并将其余牌以任意顺序置于牌堆顶。出牌阶段,你至多可使用X张非装备手牌。(X为你的体力上限)", - shibao: "石苞", - zhuosheng: "擢升", - zhuosheng_info: "出牌阶段,①你使用本轮内得到的基本牌时无次数和距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。", - zhuosheng_info_guozhan: "出牌阶段,①你使用本轮内得到的基本牌时无距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。", - jin_yanghuiyu: "晋羊徽瑜", - jin_yanghuiyu_prefix: "晋", - gz_jin_yanghuiyu: "羊徽瑜", - huirong: "慧容", - huirong_info: "隐匿技,锁定技。当你登场后,你令一名角色将手牌数摸至/弃至与体力值相同(至多摸至五张)。", - ciwei: "慈威", - ciwei_info: "一名角色于其回合内使用第二张牌时,若此牌为基本牌或普通锦囊牌,则你可以弃置一张牌,取消此牌的所有目标。", - caiyuan: "才媛", - caiyuan_info: "锁定技。回合结束时,若你于你的上一个回合结束后未扣减过体力,则你摸两张牌。", - simazhou: "司马伷", - caiwang: "才望", - caiwang_info: "当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。", - naxiang: "纳降", - naxiang2: "纳降", - naxiang_info: "锁定技,当你受到其他角色造成的伤害后,或你对其他角色造成伤害后,你对其发动〖才望①〗时的“弃置”改为“获得”直到你的下回合开始。", - cheliji: "彻里吉", - chexuan: "车悬", - chexuan_info: "出牌阶段,若你的装备区里没有宝物牌,你可弃置一张黑色牌,选择一张【舆】置入你的装备区;当你失去装备区里的宝物牌后,你可进行判定,若结果为黑色,将一张随机的【舆】置入你的装备区。", - qiangshou: "羌首", - qiangshou_info: "锁定技,若你的装备区内有宝物牌,你与其他角色的距离-1。", - cheliji_sichengliangyu: "四乘粮舆", - cheliji_sichengliangyu_bg: "粮", - cheliji_sichengliangyu_info: "一名角色的回合结束时,若你的手牌数小于体力值,你可以摸两张牌,然后弃置此牌。", - cheliji_tiejixuanyu: "铁蒺玄舆", - cheliji_tiejixuanyu_bg: "蒺", - cheliji_tiejixuanyu_info: "其他角色的回合结束时,若其本回合未造成过伤害,你可以令其弃置两张牌,然后弃置此牌。", - cheliji_feilunzhanyu: "飞轮战舆", - cheliji_feilunzhanyu_bg: "轮", - cheliji_feilunzhanyu_info: "其他角色的回合结束时,若其本回合使用过非基本牌,你可以令其交给你一张牌,然后弃置此牌。", - weiguan: "卫瓘", - zhongyun: "忠允", - zhongyun2: "忠允", - zhongyun_info: "锁定技。每名角色的回合限一次,你受伤/回复体力后,若你的体力值与手牌数相等,你回复1点体力或对你攻击范围内的一名角色造成1点伤害;每名角色的回合限一次,你获得手牌或失去手牌后,若你的体力值与手牌数相等,你摸一张牌或弃置一名其他角色一张牌。", - shenpin: "神品", - shenpin_info: "当一名角色的判定牌生效前,你可以打出一张与判定牌颜色不同的牌代替之。", - zhongyan: "钟琰", - bolan: "博览", - bolan_info: "①出牌阶段开始时,你可从三个描述中带有“出牌阶段限一次”的技能中选择一个,令当前回合角色获得直至此阶段结束。②其他角色出牌阶段限一次,其可以失去1点体力,令你发动一次〖博览①〗。", - yifa: "仪法", - yifa2: "仪法", - yifa_info: "锁定技,其他角色使用【杀】或黑色普通锦囊牌指定你为目标后,其手牌上限-1直到其回合结束。", - ol_huaxin: "OL华歆", - ol_huaxin_prefix: "OL", - caozhao: "草诏", - caozhao_backup: "草诏", - caozhao_info: "出牌阶段限一次,你可展示一张手牌并声明一种未以此法声明过的基本牌或普通锦囊牌,令一名体力不大于你的其他角色选择一项:令此牌视为你声明的牌,或其失去1点体力。然后若此牌声明成功,然后你可将其交给一名其他角色。", - olxibing: "息兵", - olxibing_info: "当你受到其他角色造成的伤害后,你可弃置你或该角色两张牌,然后你们中手牌少的角色摸两张牌,以此法摸牌的角色不能使用牌指定你为目标直到回合结束。", - recaiwang: "才望", - recaiwang_info: "①当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。②若你的手牌数为1,则你可以将该手牌当做【闪】使用或打出。③若你的装备区牌数为1,则你可以将该装备当做【无懈可击】使用或打出。④若你的判定区牌数为1,则你可以将该延时锦囊牌当做【杀】使用或打出。", - recaiwang_hand: "才望", - recaiwang_equip: "才望", - recaiwang_judge: "才望", - yangyan: "杨艳", - xuanbei: "选备", - xuanbei_info: "①游戏开始时,你从牌堆中获得两张具有应变标签的牌。②每回合限一次。当你使用的具有应变标签的牌结算结束后,你可将此牌对应的所有实体牌交给一名其他角色。", - xianwan: "娴婉", - xianwan_info: "①当你需要使用【闪】时,若你的武将牌未横置,则你可以横置武将牌并视为使用【闪】。②当你需要使用【杀】时,若你的武将牌横置,则你可以重置武将牌并视为使用【杀】。", - yangzhi: "杨芷", - wanyi: "婉嫕", - wanyi_info: "每回合每项限一次。出牌阶段,你可以将一张具有应变效果的牌当做【逐近弃远】/【出其不意】/【水淹七军】/【洞烛先机】使用。", - maihuo: "埋祸", - maihuo_info: "①当你成为其他角色使用【杀】的目标后,若此【杀】不为转化牌且有对应的实体牌且其武将牌上没有“祸”且你是此牌的唯一目标,则你可以令此牌对你无效,并将此【杀】置于其武将牌上,称为“祸”。②一名其他角色的出牌阶段开始时,若其武将牌上有“祸”,则其对你使用此“祸”(有距离限制且计入次数限制,若你不是此牌的合法目标,则改为将此“祸”置入弃牌堆)。③当你对有“祸”的其他角色造成伤害后,你移去其“祸”。", - xinchang: "辛敞", - canmou: "参谋", - canmou_info: "一名角色使用普通锦囊牌指定第一个目标时,若其手牌数为全场唯一最多,则你可以为此牌增加一个额外目标。", - congjian: "从鉴", - congjian_info: "一名其他角色成为普通锦囊牌的唯一目标时,若其体力值为全场唯一最多,则你也可以成为此牌的目标。此牌结算结束后,若你受到过渠道为此牌的伤害,则你摸两张牌。", - xuangongzhu: "晋宣公主", - gz_xuangongzhu: "宣公主", - xuangongzhu_prefix: "晋", - gaoling: "高陵", - gaoling_info: "隐匿技。当你于回合外明置此武将牌时,你可以令一名角色回复1点体力。", - qimei: "齐眉", - qimei_info: "准备阶段,你可以选择一名其他角色。你获得如下效果直到下回合开始:①每回合限一次,当你或其获得牌/失去手牌后,若你与其手牌数相等,则另一名角色摸一张牌。②每回合限一次,当你或其的体力值变化后,若你与其体力值相等,则另一名角色摸一张牌。", - ybzhuiji: "追姬", - ybzhuiji_info: "出牌阶段开始时,你可选择一项:①摸两张牌,并于出牌阶段结束时失去1点体力;②回复1点体力,并于出牌阶段结束时弃置两张牌。", - jin_yanghu: "晋羊祜", - jin_yanghu_prefix: "晋", - huaiyuan: "怀远", - huaiyuanx: "绥", - huaiyuan_info: "①游戏开始时,你将你的手牌标记为“绥”。②当你失去一张“绥”后,你令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。③当你死亡时,你可令一名其他角色的手牌上限+X,且攻击范围+Y(X和Y为你自己被执行过〖怀远②〗的选项一和选项二的次数)。", - chongxin: "崇信", - chongxin_info: "出牌阶段限一次,你可重铸一张牌,且令一名有手牌的其他角色也重铸一张牌。", - dezhang: "德彰", - dezhang_info: "觉醒技。准备阶段,若你没有“绥”,则你减1点体力上限并获得〖卫戍〗。", - weishu: "卫戍", - weishu_info: "锁定技。①当你于摸牌阶段外不因〖卫戍①〗而摸牌后,你令一名角色摸一张牌。②当你于弃牌阶段外不因〖卫戍②〗而弃置牌后,你弃置一名其他角色的一张牌。", - jin_jiachong: "晋贾充", - jin_jiachong_prefix: "晋", - xiongshu: "凶竖", - xiongshu_info: "其他角色的出牌阶段开始时,你可弃置X张牌(X为你本轮内此前已发动过此技能的次数,为0则不弃)并展示其一张手牌,然后你预测“其本阶段内是否会使用与展示牌牌名相同的牌”。此阶段结束时,若你的预测正确,则你对其造成1点伤害;否则你获得展示牌。", - jianhui: "奸回", - jianhui_info: "锁定技。当你造成伤害后,若受伤角色为A,则你摸一张牌;当你受到伤害后,若伤害来源为A,则A弃置一张牌。(A为除本次伤害外最近一次对你造成过伤害的角色)", - xinxuanbei: "选备", - xinxuanbei_info: "出牌阶段限一次。你可选择一名其他角色区域内的一张牌。然后其对你使用对应实体牌为此牌的【杀】。然后若此【杀】,未对你造成过伤害,你摸一张牌;对你造成过伤害,你摸两张牌。", - xinwanyi: "婉嫕", - xinwanyi_info: "①当你使用【杀】或普通锦囊牌指定其他角色为唯一目标后,你可将其的一张牌置于你的武将牌上作为“嫕”。②你不能使用/打出/弃置与“嫕”花色相同的牌。③结束阶段或当你受到伤害后,你令一名角色获得你的一张“嫕”。", - jin_guohuai: "郭槐", - zhefu: "哲妇", - zhefu_info: "当你于回合外使用或打出牌后,你可令一名有手牌的其他角色选择一项:⒈弃置一张名称相同的牌。⒉受到你造成的1点伤害。", - yidu: "遗毒", - yidu_info: "当你使用的【杀】或伤害性锦囊牌结算结束后,你可以展示一名未受到过渠道为此牌伤害的目标角色的至多三张手牌。若这些牌颜色均相同,则你弃置这些牌。", - wangxiang: "王祥", - bingxin: "冰心", - bingxin_info: "每种牌名每回合限一次。当你需要使用基本牌时,若你的手牌数等于体力值且这些牌的颜色均相同,则你可以摸一张牌,视为使用一张基本牌。", - ol_lisu: "OL李肃", - ol_lisu_prefix: "OL", - qiaoyan: "巧言", - qiaoyan_info: "锁定技,当你于回合外受到其他角色造成的伤害时,若你:有“珠”,则你令伤害来源获得“珠”;没有“珠”,则你防止此伤害,然后摸一张牌,并将一张牌正面朝上置于武将牌上,称为“珠”。", - xianzhu: "献珠", - xianzhu_info: "锁定技,出牌阶段开始时,你令一名角色A获得“珠”。若A不为你自己,则你选择你攻击范围内的一名角色B,视为A对B使用一张【杀】。", - chengjichengcui: "成济成倅", - oltousui: "透髓", - oltousui_info: "你可以将任意张牌置于牌堆底,视为使用一张需使用等量张【闪】抵消的【杀】。", - olchuming: "畜鸣", - olchuming_info: "锁定技。当你对其他角色造成伤害时,或当你受到其他角色造成的伤害时,若此伤害的渠道不为牌或没有对应的实体牌,此伤害+1,否则其于本回合结束时将所有以此法造成伤害的牌当【借刀杀人】或【过河拆桥】对你使用。", - - yingbian_pack1: "文德武备·理", - yingbian_pack2: "文德武备·备", - yingbian_pack3: "文德武备·果", - yingbian_pack4: "文德武备·戒", - yingbian_pack5: "文德武备·约", - }, - }; -}); diff --git a/character/yingbian/card.js b/character/yingbian/card.js new file mode 100644 index 000000000..262502cad --- /dev/null +++ b/character/yingbian/card.js @@ -0,0 +1,33 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const cards = { + cheliji_sichengliangyu: { + fullskin: true, + vanish: true, + derivation: "cheliji", + destroy: "chexuan", + type: "equip", + subtype: "equip5", + skills: ["cheliji_sichengliangyu"], + }, + cheliji_tiejixuanyu: { + fullskin: true, + vanish: true, + derivation: "cheliji", + destroy: "chexuan", + type: "equip", + subtype: "equip5", + skills: ["cheliji_tiejixuanyu"], + }, + cheliji_feilunzhanyu: { + fullskin: true, + vanish: true, + derivation: "cheliji", + destroy: "chexuan", + type: "equip", + subtype: "equip5", + skills: ["cheliji_feilunzhanyu"], + }, +}; + +export default cards; diff --git a/character/yingbian/character.js b/character/yingbian/character.js new file mode 100644 index 000000000..8d8589904 --- /dev/null +++ b/character/yingbian/character.js @@ -0,0 +1,27 @@ +const characters = { + chengjichengcui: ["male", "jin", 6, ["oltousui", "olchuming"]], + wangxiang: ["male", "jin", 3, ["bingxin"]], + jin_jiachong: ["male", "jin", 3, ["xiongshu", "jianhui"]], + xuangongzhu: ["female", "jin", 3, ["gaoling", "qimei", "ybzhuiji"], ["hiddenSkill"]], + xinchang: ["male", "jin", 3, ["canmou", "congjian"]], + yangzhi: ["female", "jin", 3, ["xinwanyi", "maihuo"]], + yangyan: ["female", "jin", 3, ["xinxuanbei", "xianwan"]], + ol_huaxin: ["male", "wei", 3, ["caozhao", "olxibing"]], + zhongyan: ["female", "jin", 3, ["bolan", "yifa"], ["clan:颍川钟氏"]], + weiguan: ["male", "jin", 3, ["zhongyun", "shenpin"]], + cheliji: ["male", "qun", 4, ["chexuan", "qiangshou"]], + simazhou: ["male", "jin", 4, ["recaiwang", "naxiang"]], + ol_lisu: ["male", "qun", 3, ["qiaoyan", "xianzhu"]], + jin_yanghuiyu: ["female", "jin", 3, ["huirong", "ciwei", "caiyuan"], ["hiddenSkill"]], + shibao: ["male", "jin", 4, ["zhuosheng"]], + jin_zhangchunhua: ["female", "jin", 3, ["huishi", "qingleng", "xuanmu"], ["hiddenSkill"]], + jin_simayi: ["male", "jin", 3, ["buchen", "smyyingshi", "xiongzhi", "xinquanbian"], ["hiddenSkill"]], + jin_wangyuanji: ["female", "jin", 3, ["shiren", "yanxi"], ["hiddenSkill"]], + jin_simazhao: ["male", "jin", 3, ["tuishi", "xinchoufa", "zhaoran", "chengwu"], ["zhu", "hiddenSkill"]], + jin_xiahouhui: ["female", "jin", 3, ["baoqie", "jyishi", "shiduo"], ["hiddenSkill"]], + jin_simashi: ["male", "jin", "3/4", ["taoyin", "yimie", "ruilve", "tairan"], ["hiddenSkill", "zhu"]], + zhanghuyuechen: ["male", "jin", 4, ["xijue"]], + duyu: ["male", "jin", 4, ["sanchen", "zhaotao"]], +}; + +export default characters; diff --git a/character/yingbian/characterFilter.js b/character/yingbian/characterFilter.js new file mode 100644 index 000000000..dfc3d193c --- /dev/null +++ b/character/yingbian/characterFilter.js @@ -0,0 +1,3 @@ +const characterFilters = {}; + +export default characterFilters; diff --git a/character/yingbian/characterReplace.js b/character/yingbian/characterReplace.js new file mode 100644 index 000000000..1d71bdc94 --- /dev/null +++ b/character/yingbian/characterReplace.js @@ -0,0 +1,9 @@ +const characterReplaces = { + yanghu: ["jin_yanghu", "dc_yanghu", "sp_yanghu"], + jiachong: ["dc_jiachong", "jin_jiachong", "jiachong"], + yangyan: ["yangyan", "old_yangyan"], + yangzhi: ["yangzhi", "old_yangzhi"], + zhongyan: ["zhongyan", "clan_zhongyan"], +}; + +export default characterReplaces; diff --git a/character/yingbian/dynamicTranslate.js b/character/yingbian/dynamicTranslate.js new file mode 100644 index 000000000..cdee02b0a --- /dev/null +++ b/character/yingbian/dynamicTranslate.js @@ -0,0 +1,4 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +const dynamicTranslates = {}; +export default dynamicTranslates; diff --git a/character/yingbian/index.js b/character/yingbian/index.js new file mode 100644 index 000000000..fadefabd1 --- /dev/null +++ b/character/yingbian/index.js @@ -0,0 +1,34 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; +import characters from "./character.js"; +import cards from "./card.js"; +import pinyins from "./pinyin.js"; +import skills from "./skill.js"; +import translates from "./translate.js"; +import characterIntros from "./intro.js"; +import characterFilters from "./characterFilter.js"; +import characterReplaces from "./characterReplace.js"; +import dynamicTranslates from "./dynamicTranslate.js"; +import perfectPairs from "./perfectPairs.js"; +import voices from "./voices.js"; +import { characterSort, characterSortTranslate } from "./sort.js"; + +game.import("character", function () { + return { + name: "yingbian", + connect: true, + character: { ...characters }, + characterSort: { + yingbian: characterSort, + }, + characterFilter: { ...characterFilters }, + characterTitle: {}, + dynamicTranslate: { ...dynamicTranslates }, + characterIntro: { ...characterIntros }, + characterReplace: { ...characterReplaces }, + card: { ...cards }, + skill: { ...skills }, + perfectPair: { ...perfectPairs }, + translate: { ...translates, ...voices, ...characterSortTranslate }, + pinyins: { ...pinyins }, + }; +}); diff --git a/character/yingbian/intro.js b/character/yingbian/intro.js new file mode 100644 index 000000000..30fd91b98 --- /dev/null +++ b/character/yingbian/intro.js @@ -0,0 +1,20 @@ +const characterIntro = { + zhanghuyuechen: "张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。三国时期曹魏将领。名将张辽之子。官至偏将军,袭封晋阳侯,有一子张统。乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。", + duyu: "杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。", + xiahouhui: "夏侯徽(211年-234年),字媛容,沛国谯县(今安徽亳州)人,司马师第一任妻子。征南大将军夏侯尚之女,母德阳乡主为大司马曹真之妹。夏侯徽与司马师之间,生有五个女儿。夏侯徽很有见识器度,每当司马师有什么想法时,都由她从旁策划协助。当时司马师之父司马懿位居上将重位,而他的儿子们都有雄才大略。夏侯徽深知司马师绝非曹魏忠臣,而司马师对出身曹魏家族的夏侯徽也非常顾忌。青龙二年(234年),正逢“大疫”、“大病”之年,夏侯徽被司马师毒杀,时年二十四岁,死后葬于峻平陵。西晋建国后,追谥夏侯徽为景怀皇后。", + shibao: "石苞(?~273年),字仲容,渤海南皮(今河北省南皮县)人。三国时曹魏至西晋重要将领,西晋开国功臣。西晋建立后,历任大司马、侍中、司徒等职,封乐陵郡公,卒后谥号为“武”。", + simazhou: "司马伷(227年~283年6月12日),字子将,河内郡温县(今河南省温县)人。西晋宗室、将领,晋宣帝司马懿第三子,伏太妃所生。晋景帝司马师、文帝司马昭的同父异母弟,晋武帝司马炎的叔父。司马伷少有才气,在曹魏历任宁朔将军、散骑常侍、征虏将军等职,先后受封南安亭侯、东武乡侯,五等爵制建立后,改封南皮伯。西晋建立后,获封东莞郡王,入朝任尚书右仆射、抚军将军,出外拜镇东大将军。后改封琅邪王,加开府仪同三司。西晋伐吴时,率军出涂中,孙皓向他投降并奉上玉玺。战后因功拜大将军,增邑三千户。太康四年(283年),司马伷去世,享年五十七岁。谥号为武,世称“琅邪武王”。著有《周官宁朔新书》八卷,今已亡佚。", + huangzu: "黄祖(?-208年),东汉末年将领。刘表任荆州牧时,黄祖出任江夏太守。初平二年(191年),黄祖在与长沙太守孙坚交战时,其部下将孙坚射死,因此与孙家结下仇怨。之后,黄祖多次率部与东吴军队交战,射杀凌操、徐琨等人。建安十三年(208年),在与孙权的交战中,兵败被杀。", + cheliji: "彻里吉是历史小说《三国演义》中的虚构人物,西羌国王。蜀相诸葛亮伐魏,魏都督曹真驰书赴羌,国王彻里吉即命雅丹丞相与越吉元帅起羌兵一十五万、并战车直扣西平关。后军大败,越吉亡,雅丹被俘,亮将所获羌兵及车马器械,尽给还雅丹,俱放回国。彻里吉感蜀恩义,与之结盟。正史中没有关于彻里吉的记载。", + weiguan: "卫瓘(220年-291年),字伯玉。河东郡安邑县(今山西省夏县)人。三国曹魏后期至西晋初年重臣、书法家,曹魏尚书卫觊之子。卫瓘出身官宦世家,年轻时仕官于曹魏,历任尚书郎、散骑常侍、侍中、廷尉等职。后以镇西军司、监军身份参与伐蜀战争。蜀汉亡后,与钟会一道逮捕邓艾;钟会谋反时,又成功平息叛乱,命田续杀邓艾父子。回师后转任督徐州诸军事、镇东将军,封菑阳侯。西晋建立后,历任青州、幽州刺史、征东大将军等职,成功化解北方边境威胁,因功进爵菑阳公。后入朝为尚书令、侍中,又升任司空,领太子少傅。后逊位,拜太保。晋惠帝即位后,与贾皇后对立,终在政变中满门遇害,享年七十二岁。卫瓘善隶书及章草。不仅兼工各体,还能学古人之长,是颇有创意的书法家。唐朝张怀瓘《书断》中评其章草为“神品”。", + zhongyan: " 钟琰 (?—?年)颍川人,王浑之妻。生卒年不详,约魏末晋初间前后在世。王浑的妻子钟琰,是颍川人,为魏太傅钟繇的曾孙女,父亲钟徽,为黄门郎。她平时广泛阅读各种书籍,因此几岁的时候就能撰写文章。她聪慧弘雅,善于啸咏,她的礼仪法度,为中表所推崇,她写有文集五卷。", + yangyan: "杨艳(238年-274年8月25日),字琼芝,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第一任皇后,曹魏通事郎杨炳之女。自幼父母双亡,为舅舅赵俊所养,跟随继母段氏生活。聪明贤慧,善于书法,天生丽质,娴熟女红,嫁给了世子司马炎。泰始元年(265年),晋武帝即位,建立西晋。泰始二年(266年),杨艳受册为皇后,深得晋武帝宠幸,生下三子三女,包括晋惠帝司马衷。泰始十年(274年),去世,时年三十七,陪葬于峻阳陵,谥号武元皇后。", + yangzhi: "杨芷(259年-292年3月6日),字季兰,小字男胤,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第二任皇后,东汉太尉杨震幼子杨奉后裔,东汉末年东莱太守、蓩亭侯杨众曾孙女,西晋太傅杨骏与嫡妻庞氏之女,武元皇后杨艳堂妹。咸宁二年(276年),立为皇后,史称“婉嫕有妇德, 美映椒房”,得宠于晋武帝。生渤海殇王,早薨,之后再无生育。其父杨骏擅权引起皇后贾南风忌恨,贾南风联络汝南王司马亮、楚王司马玮发动政变,杀死杨骏,并唆使大臣上书状告杨芷谋反,让晋惠帝司马衷将其贬为庶人,押到金墉城居住。元康二年(292年),杨芷冻饿而死,谥号武悼皇后。", + xinchang: "辛敞(生卒年不详),字泰雍,陇西人氏,是曹魏时代官员。卫尉辛毗之子,辛宪英之弟。", + xuangongzhu: "高陵宣公主(?—?)司马氏,晋宣帝司马懿第二女。司马氏下嫁杜预。其侄司马炎登基时,司马氏已经去世。泰始年间(265年—274年)追赠高陵公主。", + jin_guohuai: "郭槐(237年-296年),字媛韶,太原阳曲(今山西太原)人,魏晋权臣贾充的妻子。父亲是曹魏城阳郡太守郭配,伯父是曹魏名将郭淮。出身太原郭氏。二十一岁时,嫁贾充作继室,生二女二子,长女贾南风,次女贾午,一子贾黎民。贾南风是西晋惠帝司马衷皇后,干预国政,专权误国,直接导致“八王之乱”和西晋亡国。", + wangxiang: "王祥(184年,一作180年-268年4月30日),字休徵。琅邪临沂(今山东省临沂市西孝友村)人。三国曹魏及西晋时大臣。王祥于东汉末隐居二十年,在曹魏,先后任县令、大司农、司空、太尉等职,封爵睢陵侯。西晋建立,拜太保,进封睢陵公。泰始四年四月戊戌日(268年4月30日)去世,年八十五(一作八十九),谥号“元”。有《训子孙遗令》一文传世。王祥侍奉后母朱氏极孝,为传统文化中二十四孝之一“卧冰求鲤”的主人翁。", + chengjichengcui: "成倅、成济(?~260年6月21日),扬州丹阳(今安徽省宣城市)人。三国时期曹魏将领。依附于司马氏家族,得到司马昭的心腹贾充指使,刺死魏帝曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。据《魏氏春秋》记载,成济兄弟不服罪,光着身子跑到屋顶,大骂司马昭,被军士从下乱箭射杀。", +}; + +export default characterIntro; diff --git a/character/yingbian/perfectPairs.js b/character/yingbian/perfectPairs.js new file mode 100644 index 000000000..5753687ee --- /dev/null +++ b/character/yingbian/perfectPairs.js @@ -0,0 +1,6 @@ +export default { + jin_simayi: ["jin_zhangchunhua", "shibao", "duyu"], + jin_simazhao: ["jin_wangyuanji"], + jin_simashi: ["jin_xiahouhui", "jin_yanghuiyu"], + xuangongzhu: ["duyu"], +}; diff --git a/character/yingbian/pinyin.js b/character/yingbian/pinyin.js new file mode 100644 index 000000000..bc893d3fb --- /dev/null +++ b/character/yingbian/pinyin.js @@ -0,0 +1,2 @@ +const pinyins = {}; +export default pinyins; diff --git a/character/yingbian/skill.js b/character/yingbian/skill.js new file mode 100644 index 000000000..074eaa9dc --- /dev/null +++ b/character/yingbian/skill.js @@ -0,0 +1,3972 @@ +import { lib, game, ui, get, ai, _status } from "../../noname.js"; + +/** @type { importCharacterConfig['skill'] } */ +const skills = { + //二成 + oltousui: { + audio: 2, + enable: "chooseToUse", + viewAsFilter: function (player) { + return player.countCards("he"); + }, + viewAs: { + name: "sha", + suit: "none", + number: null, + isCard: true, + }, + filterCard: true, + selectCard: [1, Infinity], + position: "he", + check: function (card) { + const player = get.player(); + return 4.5 + (player.hasSkill("olchuming") ? 1 : 0) - 1.5 * ui.selected.cards.length - get.value(card); + }, + popname: true, + ignoreMod: true, + precontent: function* (event, map) { + var player = map.player; + var evt = event.getParent(); + if (evt.dialog && typeof evt.dialog == "object") evt.dialog.close(); + player.logSkill("oltousui"); + delete event.result.skill; + var cards = event.result.cards; + player.loseToDiscardpile(cards, ui.cardPile, false, "blank").log = false; + var shownCards = cards.filter(i => get.position(i) == "e"), + handcardsLength = cards.length - shownCards.length; + if (shownCards.length) { + player.$throw(shownCards, null); + game.log(player, "将", shownCards, "置于了牌堆底"); + } + if (handcardsLength > 0) { + player.$throw(handcardsLength, null); + game.log(player, "将", get.cnNumber(handcardsLength), "张牌置于了牌堆底"); + } + game.delayex(); + var viewAs = new lib.element.VCard({ name: event.result.card.name, isCard: true }); + event.result.card = viewAs; + event.result.cards = []; + event.result._apply_args = { + shanReq: cards.length, + oncard: () => { + var evt = get.event(); + for (var target of game.filterPlayer(null, null, true)) { + var id = target.playerid; + var map = evt.customArgs; + if (!map[id]) map[id] = {}; + map[id].shanRequired = evt.shanReq; + } + }, + }; + }, + ai: { + order: function (item, player) { + return get.order({ name: "sha" }) + 0.1; + }, + result: { player: 1 }, + keepdu: true, + respondSha: true, + skillTagFilter: (player, tag, arg) => { + if (tag == "respondSha" && arg != "use") return false; + }, + }, + }, + olchuming: { + audio: 2, + trigger: { + source: "damageBegin1", + player: "damageBegin3", + }, + filter: function (event, player) { + if (event.source === event.player) return false; + if (!event.card || !event.cards || !event.cards.length) return true; + let target = event[player === event.source ? "player" : "source"]; + return target && target.isIn(); + }, + forced: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + if (!trigger.card || !trigger.cards || !trigger.cards.length) { + trigger.num++; + event.finish(); + return; + } else { + var target = trigger[trigger.source == player ? "player" : "source"]; + trigger._olchuming = true; + target.addTempSkill("olchuming_effect"); + } + }, + ai: { + effect: { + player: function (card, player, target) { + if (!get.tag(card, "damage")) return; + if (!lib.card[card.name] || !card.cards || !card.cards.length) return [1, 0, 1, -1]; + return [1, -1]; + }, + }, + }, + subSkill: { + effect: { + charlotte: true, + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + content: function* (event, map) { + var player = map.player; + var mapx = {}; + var history = player.getHistory("damage").concat(player.getHistory("sourceDamage")); + history.forEach(evt => { + if (!evt._olchuming) return; + var target = evt[evt.source == player ? "player" : "source"]; + if (!target.isIn()) return; + var cards = evt.cards.filterInD("d"); + if (!cards.length) return; + if (!mapx[target.playerid]) mapx[target.playerid] = []; + mapx[target.playerid].addArray(cards); + }); + var entries = Object.entries(mapx).map(entry => { + return [(_status.connectMode ? lib.playerOL : game.playerMap)[entry[0]], entry[1]]; + }); + if (!entries.length) { + event.finish(); + return; + } + player.logSkill( + "olchuming_effect", + entries.map(i => i[0]) + ); + entries.sort((a, b) => lib.sort.seat(a[0], b[0])); + for (var entry of entries) { + var current = entry[0], + cards = entry[1]; + var list = ["jiedao", "guohe"].filter(i => player.canUse(new lib.element.VCard({ name: i, cards: cards }), current, false)); + if (!list.length) return; + var result = {}; + if (list.length == 1) result = { bool: true, links: [["", "", list[0]]] }; + else + result = yield player + .chooseButton([`畜鸣:请选择要对${get.translation(current)}使用的牌`, [list, "vcard"]], true) + .set("ai", button => { + var player = get.player(); + return get.effect(get.event("currentTarget"), { name: button.link[2] }, player, player); + }) + .set("currentTarget", current); + if (result.bool) { + var card = get.autoViewAs({ name: result.links[0][2] }, cards); + if (player.canUse(card, current, false)) player.useCard(card, cards, current, false); + } + } + }, + }, + }, + }, + bingxin: { + audio: 2, + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (get.type(name) == "basic" && lib.inpile.includes(name) && !player.getStorage("bingxin_count").includes(name)) return true; + }, + filter: function (event, player) { + if (event.type == "wuxie") return false; + var hs = player.getCards("h"); + if (hs.length != Math.max(0, player.hp)) return false; + if (hs.length > 1) { + var color = get.color(hs[0], player); + for (var i = 1; i < hs.length; i++) { + if (get.color(hs[i], player) != color) return false; + } + } + var storage = player.storage.bingxin_count; + for (var i of lib.inpile) { + if (get.type(i) != "basic") continue; + if (storage && storage.includes(i)) continue; + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(card, player, event)) return true; + } + } + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + var storage = player.storage.bingxin_count; + for (var i of lib.inpile) { + if (get.type(i) != "basic") continue; + if (storage && storage.includes(i)) continue; + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) list.push(["基本", "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(card, player, event)) list.push(["基本", "", i, j]); + } + } + } + return ui.create.dialog("冰心", [list, "vcard"], "hidden"); + }, + check: function (button) { + if (button.link[2] == "shan") return 3; + var player = _status.event.player; + if (button.link[2] == "jiu") { + if (player.getUseValue({ name: "jiu" }) <= 0) return 0; + if (player.countCards("h", "sha")) return player.getUseValue({ name: "jiu" }); + return 0; + } + return player.getUseValue({ name: button.link[2], nature: button.link[3] }) / 4; + }, + backup: function (links, player) { + return { + selectCard: -1, + filterCard: () => false, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + precontent: function () { + player.logSkill("bingxin"); + player.draw(); + delete event.result.skill; + var name = event.result.card.name; + player.addTempSkill("bingxin_count"); + player.markAuto("bingxin_count", [name]); + }, + }; + }, + prompt: function (links, player) { + var name = links[0][2]; + var nature = links[0][3]; + return "摸一张并视为使用" + (get.translation(nature) || "") + get.translation(name); + }, + }, + ai: { + order: 10, + respondShan: true, + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + var hs = player.getCards("h"); + if (hs.length != Math.max(0, hs.length)) return false; + if (hs.length > 1) { + var color = get.color(hs[0], player); + for (var i = 1; i < hs.length; i++) { + if (get.color(hs[i], player) != color) return false; + } + } + var storage = player.storage.bingxin_count; + if (storage && storage.includes("s" + tag.slice(8))) return false; + }, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + subSkill: { count: { charlotte: true, onremove: true } }, + }, + zhefu: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + direct: true, + filter: function (event, player) { + return ( + player != _status.currentPhase && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("zhefu"), "令一名有手牌的其他角色弃置一张【" + get.translation(trigger.card.name) + "】,否则受到你造成的1点伤害。", function (card, player, target) { + return target != player && target.countCards("h") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player) / Math.sqrt(target.countCards("h")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("zhefu", target); + var name = trigger.card.name; + target + .chooseToDiscard("he", { name: name }, "弃置一张【" + get.translation(name) + "】或受到1点伤害") + .set("ai", function (card) { + var player = _status.event.player; + if (_status.event.take || (get.name(card) == "tao" && !player.hasJudge("lebu"))) return 0; + return 8 - get.value(card); + }) + .set("take", get.damageEffect(target, player, target) >= 0); + } else event.finish(); + "step 2"; + if (!result.bool) target.damage(); + }, + }, + yidu: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + (event.card.name == "sha" || (get.type(event.card, null, false) == "trick" && get.tag(event.card, "damage") > 0)) && + event.targets.some(target => { + return ( + target.countCards("h") > 0 && + !target.hasHistory("damage", function (evt) { + return evt.card == event.card; + }) + ); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yidu"), (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set( + "targets", + trigger.targets.filter(target => { + return ( + target.countCards("h") > 0 && + !target.hasHistory("damage", function (evt) { + return evt.card == trigger.card; + }) + ); + }) + ) + .set("ai", target => { + if (target.hasSkillTag("noh")) return 0; + return -get.attitude(player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("yidu", target); + player + .choosePlayerCard(target, "遗毒:展示" + get.translation(target) + "的至多三张手牌", true, "h", [1, Math.min(3, target.countCards("h"))]) + .set("forceAuto", true) + .set("ai", function (button) { + if (ui.selected.buttons.length) return 0; + return 1 + Math.random(); + }); + } else event.finish(); + "step 2"; + var cards = result.cards; + player.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【遗毒】"); + var color = get.color(cards[0], target); + var bool = true; + for (var i = 1; i < cards.length; i++) { + if (get.color(cards[i], target) != color) { + bool = false; + break; + } + } + if (bool) target.discard(cards, "notBySelf").discarder = player; + }, + }, + xinwanyi: { + audio: "wanyi", + trigger: { player: "useCardToTargeted" }, + filter: function (event, player) { + return player != event.target && event.targets.length == 1 && (event.card.name == "sha" || get.type(event.card, false) == "trick") && event.target.countCards("he") > 0; + }, + locked: false, + logTarget: "target", + check: function (event, player) { + return get.effect(event.target, { name: "guohe_copy2" }, player, player) > 0; + }, + prompt2: "将该角色的一张牌置于武将牌上作为“嫕”", + content: function () { + "step 0"; + event.target = trigger.target; + player.choosePlayerCard(event.target, true, "he"); + "step 1"; + if (result.bool) { + var cards = result.cards; + player.addToExpansion(cards, target, "give").gaintag.add("xinwanyi"); + } + }, + mod: { + cardEnabled: function (card, player) { + var cards = player.getExpansions("xinwanyi"); + if (cards.length) { + var suit = get.suit(card); + if (suit == "none") return; + for (var i of cards) { + if (get.suit(i, player) == suit) return false; + } + } + }, + cardRespondable: function (card, player) { + var cards = player.getExpansions("xinwanyi"); + if (cards.length) { + var suit = get.suit(card); + if (suit == "none") return; + for (var i of cards) { + if (get.suit(i, player) == suit) return false; + } + } + }, + cardSavable: function (card, player) { + var cards = player.getExpansions("xinwanyi"); + if (cards.length) { + var suit = get.suit(card); + if (suit == "none") return; + for (var i of cards) { + if (get.suit(i, player) == suit) return false; + } + } + }, + cardDiscardable: function (card, player) { + var cards = player.getExpansions("xinwanyi"); + if (cards.length) { + var suit = get.suit(card); + if (suit == "none") return; + for (var i of cards) { + if (get.suit(i, player) == suit) return false; + } + } + }, + }, + marktext: "嫕", + intro: { + markcount: "expansion", + content: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "xinwanyi_give", + subSkill: { + give: { + audio: "wanyi", + trigger: { player: ["phaseJieshuBegin", "damageEnd"] }, + forced: true, + locked: false, + filter: function (event, player) { + return player.getExpansions("xinwanyi").length > 0; + }, + content: function () { + "step 0"; + player.chooseTarget(true, "婉嫕:令一名角色获得一张“嫕”").set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var cards = player.getExpansions("xinwanyi"); + if (cards.length == 1) event._result = { bool: true, links: cards }; + else player.chooseButton(["令" + get.translation(target) + "获得一张“嫕”", cards], true); + } else event.finish(); + "step 2"; + if (result.bool) { + target.gain(result.links, player, "give"); + } + }, + }, + }, + }, + xinxuanbei: { + audio: "xuanbei", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(current => lib.skill.xinxuanbei.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("hej") > 0; + }, + content: function () { + "step 0"; + player.choosePlayerCard(target, "hej", true); + "step 1"; + if (result.bool) { + var card = result.cards[0]; + var cardx = get.autoViewAs({ name: "sha" }, [card]); + if ((get.position(card) != "j" && !game.checkMod(card, target, "unchanged", "cardEnabled2", target)) || !target.canUse(cardx, player, false)) event.finish(); + else { + var next = target.useCard(cardx, [card], player, false); + event.card = next.card; + } + } else event.finish(); + "step 2"; + var num = 1; + if ( + player.hasHistory("damage", function (evt) { + return evt.card == event.card; + }) + ) + num++; + player.draw(num); + }, + ai: { + order: 7, + result: { + player: function (player, target) { + return get.effect(target, { name: "guohe_copy" }, player, player) + get.effect(player, { name: "sha" }, target, player); + }, + }, + }, + }, + xiongshu: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player != event.player && event.player.countCards("h") > 0 && player.countCards("he") >= player.countMark("xiongshu_count"); + }, + content: function () { + "step 0"; + event.target = trigger.player; + var num = player.countMark("xiongshu_count"); + if (num > 0) + player + .chooseToDiscard("he", num, get.prompt("xiongshu", trigger.player), "弃置" + get.cnNumber(num) + "张牌并展示其一张手牌") + .set("goon", get.attitude(player, event.target) < 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 6 - _status.event.player.countMark("xiongshu_count") - get.value(card); + }).logSkill = ["xiongshu", trigger.player]; + else + player + .chooseBool(get.prompt("xiongshu", trigger.player), "展示其一张牌") + .set("goon", get.attitude(player, event.target) < 0) + .set("ai", function (card) { + return _status.event.goon; + }); + "step 1"; + if (result.bool) { + if (!result.cards || !result.cards.length) player.logSkill("xiongshu", target); + player.addTempSkill("xiongshu_count", "roundStart"); + player.addMark("xiongshu_count", 1, false); + } + if (result.bool && target.countCards("h") > 0) { + player.choosePlayerCard(target, true, "h"); + } else event.finish(); + "step 2"; + var card = result.cards[0], + name = get.name(card), + str = get.translation(target); + player.showCards(card, get.translation(player) + "对" + str + "发动了【凶竖】"); + player.addTempSkill("xiongshu_effect", "phaseUseAfter"); + player.storage.xiongshu_effect = [card, name]; + if (Math.random() < 0.5) { + target.storage.xiongshu_ai = name; + target.addTempSkill("xiongshu_ai", "phaseUseAfter"); + } + player + .chooseControl("会使用", "不会使用") + .set("prompt", "预测:" + str + "是否会使用" + get.translation(name) + "?") + .set( + "choice", + (function () { + if (!target.hasValueTarget(card)) return 1; + return Math.random() < 0.5 ? 0 : 1; + })() + ) + .set("ai", () => _status.event.choice); + "step 3"; + player.storage.xiongshu_effect[2] = result.index == 0; + }, + ai: { expose: 0.35 }, + subSkill: { + ai: { + charlotte: true, + onremove: true, + ai: { + effect: { + player: function (card, player, target) { + if (card.name == player.storage.xiongshu_ai) return "zeroplayertarget"; + }, + }, + }, + }, + count: { + charlotte: true, + onremove: true, + }, + effect: { + trigger: { global: "phaseUseEnd" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + var info = player.storage.xiongshu_effect; + return Array.isArray(info) && event.player.isIn(); + }, + logTarget: "player", + content: function () { + var target = trigger.player; + var info = player.storage.xiongshu_effect; + var card = info[0]; + if ( + target.hasHistory("useCard", function (evt) { + return evt.card.name == info[1] && evt.getParent("phaseUse") == trigger; + }) == info[2] + ) + target.damage(); + else { + if (target.getCards("hej").includes(card)) player.gain(card, target, "give"); + else if (get.position(card, true) == "d") player.gain(card, "gain2"); + } + }, + }, + }, + }, + jianhui: { + audio: 2, + getLastPlayer: function (evt, player) { + var history = player.getAllHistory("damage"); + if (!history.length) return null; + var i = history.indexOf(evt); + if (i == -1) i = history.length - 1; + else i--; + for (i; i >= 0; i--) { + if (history[i].source) return history[i].source; + } + return null; + }, + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return event.source && event.source.isIn() && event.source == lib.skill.jianhui.getLastPlayer(event, player) && event.source.countCards("he") > 0; + }, + content: function () { + trigger.source.chooseToDiscard("he", true); + }, + group: "jianhui_draw", + subSkill: { + draw: { + trigger: { source: "damageSource" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return event.player == lib.skill.jianhui.getLastPlayer(event, player); + }, + content: function () { + player.draw(); + }, + }, + }, + }, + huaiyuan: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("huaiyuanx")) return true; + } + return false; + } + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("huaiyuanx")) return true; + } + return false; + }); + }, + forced: true, + locked: false, + content: function () { + "step 0"; + var num = 0; + if (trigger.name == "lose") { + for (var i in trigger.gaintag_map) { + if (trigger.gaintag_map[i].includes("huaiyuanx")) num++; + } + } else + player.getHistory("lose", function (evt) { + if (trigger != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("huaiyuanx")) num++; + } + return false; + }); + event.count = num; + "step 1"; + event.count--; + player.chooseTarget(true, "请选择【怀远】的目标", "令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。").set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return 0; + if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) att *= 2.2; + if (target.needsToDiscard()) att *= 1.3; + return att * Math.sqrt(Math.max(1, 4 - target.countCards("h"))); + }); + "step 2"; + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var str = get.translation(target); + player + .chooseControl() + .set("choiceList", ["令" + str + "的手牌上限+1", "令" + str + "的攻击范围+1", "令" + str + "摸一张牌"]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) return 1; + if (target.needsToDiscard()) return 0; + return 2; + }); + } else event.finish(); + "step 3"; + if (result.index == 2) target.draw(); + else { + target.addSkill("huaiyuan_effect" + result.index); + target.addMark("huaiyuan_effect" + result.index, 1, false); + game.log(target, "的", "#g" + ["手牌上限", "攻击范围"][result.index], "+1"); + game.delayx(); + } + if (event.count > 0) event.goto(1); + }, + group: ["huaiyuan_init", "huaiyuan_die"], + subSkill: { + init: { + audio: "huaiyuan", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0; + }, + content: function () { + var hs = player.getCards("h"); + if (hs.length) player.addGaintag(hs, "huaiyuanx"); + }, + }, + die: { + trigger: { player: "die" }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "water", + filter: function (event, player) { + return player.hasMark("huaiyuan_effect0") || player.hasMark("huaiyuan_effect1"); + }, + content: function () { + "step 0"; + var str = "令一名其他角色", + num1 = player.countMark("huaiyuan_effect0"), + num2 = player.countMark("huaiyuan_effect1"); + if (num1 > 0) { + str += "手牌上限+"; + str += num1; + if (num2 > 0) str += "且"; + } + if (num2 > 0) { + str += "攻击范围+"; + str += num2; + } + player + .chooseTarget(lib.filter.notMe, get.prompt("huaiyuan"), str) + .set("forceDie", true) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) + 114514; + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("huaiyuan_die", target); + var num1 = player.countMark("huaiyuan_effect0"), + num2 = player.countMark("huaiyuan_effect1"); + if (num1 > 0) { + target.addSkill("huaiyuan_effect0"); + target.addMark("huaiyuan_effect0", num1, false); + } + if (num2 > 0) { + target.addSkill("huaiyuan_effect1"); + target.addMark("huaiyuan_effect1", num2, false); + } + game.delayx(); + } + }, + }, + effect0: { + charlotte: true, + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("huaiyuan_effect0"); + }, + }, + marktext: "怀", + intro: { content: "手牌上限+#" }, + }, + effect1: { + charlotte: true, + onremove: true, + mod: { + attackRange: function (player, num) { + return num + player.countMark("huaiyuan_effect1"); + }, + }, + marktext: "远", + intro: { content: "攻击范围+#" }, + }, + }, + }, + chongxin: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); + }, + filterCard: true, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + check: function (card) { + return 6 - get.value(card); + }, + discard: false, + lose: false, + delay: false, + position: "he", + content: function () { + "step 0"; + player.recast(cards); + "step 1"; + if (target.countCards("he") > 0) { + target.chooseCard("he", true, "请重铸一张牌", lib.filter.cardRecastable); + } else event.finish(); + "step 2"; + if (result.bool) { + target.recast(result.cards); + } + }, + ai: { + order: 6, + result: { + player: 1, + target: function (player, target) { + return 0.5 * Math.sqrt(Math.min(3, target.countCards("h"))); + }, + }, + }, + }, + dezhang: { + trigger: { player: "phaseZhunbeiBegin" }, + derivation: "weishu", + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return !player.hasCard(function (card) { + return card.hasGaintag("huaiyuanx"); + }, "h"); + }, + content: function () { + player.awakenSkill("dezhang"); + player.loseMaxHp(); + player.addSkills("weishu"); + }, + }, + weishu: { + audio: 2, + trigger: { player: "gainAfter" }, + forced: true, + filter: function (event, player) { + return event.getParent().name == "draw" && event.getParent(2).name != "weishu" && event.getParent("phaseDraw").player != player; + }, + content: function () { + "step 0"; + player.chooseTarget(true, "请选择【卫戍】的目标", "令一名角色摸一张牌").set("ai", function (target) { + return get.attitude(_status.event.player, target) * Math.sqrt(Math.max(1, 4 - target.countCards("h"))); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.draw(); + } + }, + group: "weishu_discard", + subSkill: { + discard: { + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + forced: true, + filter: function (event, player) { + return event.type == "discard" && event.getParent(3).name != "weishu_discard" && event.getParent("phaseDiscard").player != player && event.getl(player).cards2.length > 0 && game.hasPlayer(target => target != player && target.countDiscardableCards(player, "he") > 0); + }, + content: function () { + "step 0"; + player + .chooseTarget(true, "请选择【卫戍】的目标", "弃置一名其他角色的一张牌", function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, "he", true); + } + }, + }, + }, + }, + gaoling: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + hiddenSkill: true, + filter: function (event, player) { + return ( + event.toShow.includes("xuangongzhu") && + player != _status.currentPhase && + game.hasPlayer(function (current) { + return current.isDamaged(); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("gaoling"), "令一名角色回复1点体力", function (card, player, target) { + return target.isDamaged(); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.recoverEffect(target, player, player); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("gaoling", target); + target.recover(); + } + }, + }, + qimei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("qimei"), "选择一名其他角色并获得“齐眉”效果", lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target) / (Math.abs(player.countCards("h") + 2 - target.countCards("h")) + 1); + }) + .setHiddenSkill("qimei"); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qimei", target); + player.storage.qimei_draw = target; + player.addTempSkill("qimei_draw", { player: "phaseBegin" }); + game.delayx(); + } + }, + subSkill: { + draw: { + audio: "qimei", + charlotte: true, + forced: true, + popup: false, + trigger: { + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "loseAfter", "addToExpansionAfter"], + }, + usable: 1, + filter: function (event, player) { + var target = player.storage.qimei_draw; + if (!target || !target.isIn()) return false; + if (player.countCards("h") != target.countCards("h")) return false; + var hasChange = function (event, player) { + var gain = 0, + lose = 0; + if (event.getg) gain = event.getg(player).length; + if (event.getl) lose = event.getl(player).hs.length; + return gain != lose; + }; + return hasChange(event, player) || hasChange(event, target); + }, + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + "step 1"; + var target = player.storage.qimei_draw; + player.logSkill("qimei_draw", target); + var drawer = []; + var hasChange = function (event, player) { + var gain = 0, + lose = 0; + if (event.getg) gain = event.getg(player).length; + if (event.getl) lose = event.getl(player).hs.length; + return gain != lose; + }; + if (hasChange(trigger, player)) drawer.push(target); + if (hasChange(trigger, target)) drawer.push(player); + if (drawer.length == 1) drawer[0].draw(); + else { + game.asyncDraw(drawer.sortBySeat()); + game.delayex(); + } + }, + group: "qimei_hp", + onremove: true, + mark: "character", + intro: { content: "已和$组成齐眉组合" }, + }, + hp: { + audio: "qimei", + trigger: { global: "changeHp" }, + charlotte: true, + forced: true, + logTarget: function (event, player) { + return player.storage.qimei_draw; + }, + usable: 1, + filter: function (event, player) { + var target = player.storage.qimei_draw; + if (!target || !target.isIn()) return false; + if (player != event.player && target != event.player) return false; + return player.hp == target.hp; + }, + content: function () { + game.delayx(); + (player == trigger.player ? player.storage.qimei_draw : player).draw(); + }, + }, + }, + }, + ybzhuiji: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + var list = ["摸两张牌,并于出牌阶段结束时失去1点体力"]; + if (player.isDamaged()) list.push("回复1点体力,并于出牌阶段结束时弃置两张牌"); + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("prompt", get.prompt("ybzhuiji")) + .set("ai", function () { + var player = _status.event.player; + if (player.isDamaged() && player.countCards("h", "tao") < player.getDamagedHp()) return 1; + return "cancel2"; + }) + .setHiddenSkill("ybzhuiji"); + "step 1"; + if (result.control != "cancel2") { + player.logSkill("ybzhuiji"); + if (result.index == 0) player.draw(2); + else player.recover(); + player.addTempSkill("ybzhuiji_" + result.index, "phaseUseAfter"); + } + }, + subSkill: { + 0: { + trigger: { player: "phaseUseEnd" }, + forced: true, + charlotte: true, + content: function () { + player.loseHp(); + }, + }, + 1: { + trigger: { player: "phaseUseEnd" }, + forced: true, + charlotte: true, + content: function () { + player.chooseToDiscard("he", 2, true); + }, + }, + }, + }, + canmou: { + audio: 2, + trigger: { global: "useCardToPlayer" }, + direct: true, + filter: function (event, player) { + if (!event.player.isMaxHandcard(true) || !event.isFirstTarget || get.type(event.card, null, false) != "trick") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, event.player, current); //&&lib.filter.targetInRange(event.card,event.player,current); + }) + ) { + return true; + } + } + return false; + }, + preHidden: true, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("canmou"), function (card, player, target) { + var player = _status.event.source; + return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); //&&lib.filter.targetInRange(_status.event.card,player,target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.source; + return get.effect(target, trigger.card, player, _status.event.player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card) + .set("source", trigger.player) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill(event.name, event.targets); + trigger.targets.addArray(event.targets); + game.log(event.targets, "也成为了", trigger.card, "的目标"); + } + }, + }, + congjian: { + audio: 2, + trigger: { global: "useCardToTarget" }, + logTarget: "target", + filter: function (event, player) { + return event.target != player && event.targets.length == 1 && get.type(event.card, null, false) == "trick" && event.target.isMaxHp(true) && lib.filter.targetEnabled2(event.card, event.player, player); + }, + check: function (event, player) { + return get.effect(player, event.card, event.player, player) > 0; + }, + preHidden: true, + content: function () { + trigger.targets.push(player); + game.log(player, "也成为了", trigger.card, "的目标"); + var next = game.createEvent("congjian_draw", false); + next.player = player; + event.next.remove(next); + trigger.getParent().after.push(next); + next.setContent(function () { + if ( + player.hasHistory("damage", function (evt) { + return evt.card == event.parent.card; + }) + ) + player.draw(2); + }); + }, + }, + wanyi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.getStorage("wanyi2").length < 4 && + player.hasCard(function (i) { + return get.is.yingbian(i); + }, "hs") + ); + }, + chooseButton: { + dialog: function (event, player) { + var list = ["zhujinqiyuan", "chuqibuyi", "shuiyanqijunx", "dongzhuxianji"]; + list.removeArray(player.getStorage("wanyi2")); + return ui.create.dialog("婉嫕", [list, "vcard"], "hidden"); + }, + filter: function (button, player) { + return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent()); + }, + check: function (button) { + return _status.event.player.getUseValue({ name: button.link[2] }); + }, + backup: function (links) { + return { + audio: "wanyi", + popname: true, + viewAs: { + name: links[0][2], + }, + filterCard: function (card) { + return get.is.yingbian(card); + }, + check: function (card) { + return 1 / Math.max(1, get.value(card)); + }, + position: "hs", + onuse: function (links, player) { + if (!player.storage.wanyi2) player.storage.wanyi2 = []; + player.storage.wanyi2.add(links.card.name); + player.addTempSkill("wanyi2"); + }, + }; + }, + prompt: function (links) { + return "将一张应变牌当做" + get.translation(links[0][2]) + "使用"; + }, + }, + subSkill: { backup: {} }, + ai: { order: 8, result: { player: 1 } }, + }, + wanyi2: { onremove: true }, + maihuo: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + logTarget: "player", + filter: function (event, player) { + return event.card.name == "sha" && event.card.isCard && event.getParent(2).name != "maihuo_effect" && event.cards.filterInD().length > 0 && event.targets.length == 1 && event.player.isIn() && !event.player.getExpansions("maihuo_effect").length; + }, + prompt2: function (event) { + return "令" + get.translation(event.card) + "暂时对你无效"; + }, + check: function (event, player) { + return get.effect(player, event.card, event.player, player) < 0; + }, + content: function () { + trigger.excluded.add(player); + var target = trigger.player, + cards = trigger.cards.filterInD(); + target.addToExpansion("gain2", cards).gaintag.add("maihuo_effect"); + target.storage.maihuo_target = player; + target.addSkill("maihuo_effect"); + }, + group: "maihuo_damage", + subSkill: { + effect: { + trigger: { player: "phaseUseBegin" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("maihuo_effect").length > 0; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("maihuo_effect"), + card = cards[0]; + if (card.name != "sha") + card = get.autoViewAs( + { + name: "sha", + isCard: true, + }, + cards + ); + var target = player.storage.maihuo_target; + if (target.isIn() && player.canUse(card, target, null, true)) { + player.useCard(card, target, cards); + } + "step 1"; + player.removeSkill("maihuo_effect"); + }, + marktext: "祸", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { threaten: 1.05 }, + }, + damage: { + trigger: { source: "damageSource" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.player.hasSkill("maihuo_effect") && event.player.getExpansions("maihuo_effect").length > 0; + }, + content: function () { + trigger.player.removeSkill("maihuo_effect"); + }, + }, + }, + }, + xuanbei: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + locked: false, + content: function () { + var cards = []; + while (cards.length < 2) { + var card = get.cardPile2(function (i) { + return get.is.yingbian(i) && !cards.includes(i); + }); + if (!card) break; + else cards.push(card); + } + if (cards.length) player.gain(cards, "gain2"); + }, + group: "xuanbei_give", + subSkill: { + give: { + trigger: { player: "useCardAfter" }, + usable: 1, + filter: function (event, player) { + return (event.card.yingbian || get.is.yingbian(event.card)) && event.cards.filterInD().length > 0; + }, + direct: true, + content: function () { + "step 0"; + event.cards = trigger.cards.filterInD(); + player.chooseTarget(get.prompt("xuanbei"), "令一名其他角色获得" + get.translation(event.cards), lib.filter.notMe).set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att < 3) return 0; + if (target.hasJudge("lebu")) att /= 2; + if (target.hasSkillTag("nogain")) att /= 10; + return att / (1 + get.distance(player, target, "absolute")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xuanbei_give", target); + target.gain(cards, "gain2").giver = player; + } else player.storage.counttrigger.xuanbei_give--; + }, + ai: { expose: 0.1 }, + }, + }, + }, + xianwan: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + return ( + event.filterCard && + event.filterCard( + { + name: "sha" + (player.isLinked() ? "" : "n"), + isCard: true, + }, + player, + event + ) + ); + }, + viewAs: function (cards, player) { + return { + name: "sha" + (player.isLinked() ? "" : "n"), + isCard: true, + }; + }, + filterCard: () => false, + selectCard: -1, + prompt: "将武将牌重置并视为使用【杀】", + log: false, + check: () => 1, + precontent: function () { + player.logSkill("xianwan"); + player.link(); + }, + ai: { + order: 3.4, + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + return tag == "respondSha" + (player.isLinked() ? "" : "n"); + }, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0 && !player.isLinked()) return 0.4; + }, + }, + }, + }, + recaiwang: { + audio: "caiwang", + inherit: "caiwang", + group: ["recaiwang_hand", "recaiwang_equip", "recaiwang_judge"], + }, + recaiwang_hand: { + audio: "caiwang", + enable: ["chooseToUse", "chooseToRespond"], + viewAsFilter: function (player) { + var js = player.getCards("h"); + return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player); + }, + selectCard: -1, + filterCard: true, + position: "h", + prompt: "将全部手牌当做【闪】使用", + viewAs: { name: "shan" }, + check: card => 10 - get.value(card), + ai: { + order: 1, + respondShan: true, + skillTagFilter: function (player) { + return player.countCards("h") == 1; + }, + }, + }, + recaiwang_equip: { + audio: "caiwang", + enable: ["chooseToUse", "chooseToRespond"], + viewAsFilter: function (player) { + var js = player.getCards("e"); + return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player); + }, + selectCard: -1, + filterCard: true, + check: card => 9 - get.value(card), + position: "e", + prompt: "将装备区的牌当做【无懈可击】使用", + viewAs: { name: "wuxie" }, + ai: { + order: 1, + }, + }, + recaiwang_judge: { + audio: "caiwang", + enable: ["chooseToUse", "chooseToRespond"], + viewAsFilter: function (player) { + var js = player.getCards("j"); + return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player); + }, + selectCard: -1, + filterCard: true, + position: "j", + prompt: "将判定区的牌当做【杀】使用", + viewAs: { name: "sha" }, + check: card => 1, + locked: false, + ai: { + order: 10, + respondSha: true, + skillTagFilter: function (player) { + return player.countCards("j") == 1; + }, + effect: { + target: function (card, player, target, current) { + if (card && (card.name == "shandian" || card.name == "fulei") && player == target && !target.countCards("j") && target.isPhaseUsing() && target.hasValueTarget({ name: "sha" }, null, true)) return [1, 2]; + }, + }, + }, + mod: { + aiOrder: function (player, card, num) { + if (card.name == "shandian" || card.name == "fulei") return num + 3; + }, + }, + }, + caozhao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if ( + player.countCards("h") == 0 || + !game.hasPlayer(function (current) { + return current != player && current.hp <= player.hp; + }) + ) + return false; + var list = player.getStorage("caozhao"); + for (var i of lib.inpile) { + if (!list.includes(i) && ["basic", "trick"].includes(get.type(i))) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = player.getStorage("caozhao"), + vcards = []; + for (var i of lib.inpile) { + if (!list.includes(i)) { + var type = get.type(i); + if (type == "basic" || type == "trick") vcards.push([type, "", i]); + } + } + return ui.create.dialog("草诏", [vcards, "vcard"]); + }, + check: function (button) { + return _status.event.player.getUseValue({ name: button.link[2], isCard: true }, null, true); + }, + backup: function (links, player) { + return { + audio: "caozhao", + cardname: links[0][2], + filterCard: true, + position: "h", + check: function (card) { + return player.getUseValue({ name: lib.skill.caozhao_backup.cardname }) - (player.getUseValue(card, null, true) + 0.1) / (get.value(card) / 6); + }, + filterTarget: function (card, player, target) { + return target != player && target.hp <= player.hp; + }, + discard: false, + lose: false, + content: function () { + "step 0"; + player.showCards(cards, get.translation(player) + "发动【草诏】,声明" + get.translation(lib.skill.caozhao_backup.cardname)); + if (!player.storage.caozhao) player.storage.caozhao = []; + player.storage.caozhao.push(lib.skill.caozhao_backup.cardname); + "step 1"; + target + .chooseControl() + .set("choiceList", ["令" + get.translation(player) + "将" + get.translation(cards[0]) + "的牌名改为" + get.translation(lib.skill.caozhao_backup.cardname), "失去1点体力"]) + .set("ai", function (event, player) { + var target = _status.event.getParent().player; + if (get.attitude(player, target) > 0) return 0; + if (player.hp > 3 || (player.hp > 1 && player.hasSkill("zhaxiang"))) return 1; + if (player.hp > 2) return Math.random() > 0.5 ? 0 : 1; + return 0; + }); + "step 2"; + if (result.index == 1) { + target.addExpose(0.2); + target.loseHp(); + event.finish(); + } else { + player.chooseTarget("是否将" + get.translation(lib.skill.caozhao_backup.cardname) + "(" + get.translation(cards[0]) + ")交给一名其他角色?", lib.filter.notMe).set("ai", () => -1); + } + "step 3"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + if (!target.storage.caozhao_info) target.storage.caozhao_info = {}; + target.storage.caozhao_info[cards[0].cardid] = lib.skill.caozhao_backup.cardname; + target.addSkill("caozhao_info"); + player.give(cards, target, "give").gaintag.add("caozhao"); + } else { + if (!player.storage.caozhao_info) player.storage.caozhao_info = {}; + player.storage.caozhao_info[cards[0].cardid] = lib.skill.caozhao_backup.cardname; + player.addGaintag(cards, "caozhao"); + player.addSkill("caozhao_info"); + } + }, + ai: { + result: { + player: 2, + target: 0.1, + }, + }, + }; + }, + prompt: function (links, player) { + return "将一张手牌声明为" + get.translation(links[0][2]); + }, + }, + ai: { + order: 1, + result: { + player: 1, + }, + }, + }, + caozhao_info: { + charlotte: true, + mod: { + cardname: function (card, player) { + var map = player.storage.caozhao_info; + if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("caozhao")) return map[card.cardid]; + }, + cardnature: function (card, player) { + var map = player.storage.caozhao_info; + if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("caozhao")) return false; + }, + }, + }, + olxibing: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.player && event.source && event.player != event.source && event.player.isAlive() && event.source.isAlive() && (event.player.countCards("he") > 0 || event.source.countCards("he") > 0); + }, + direct: true, + content: function () { + "step 0"; + var target = trigger.source; + event.target = target; + player + .chooseTarget(get.prompt("olxibing"), "弃置自己或" + get.translation(target) + "的两张牌,然后手牌数较少的角色摸两张牌且不能对你使用牌直到回合结束", function (card, player, target) { + if (target != player && target != _status.event.target) return false; + return target.countCards("he") > 0; + }) + .set("target", target) + .set("ai", function (targetx) { + var player = _status.event.player, + target = _status.event.target; + if (target == targetx) { + if (get.attitude(player, target) > 0) return 0; + var cards = target + .getCards("he", function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }) + .sort(function (a, b) { + return get.buttonValue(b) - get.buttonValue(a); + }); + if ( + target.countCards("h") - player.countCards("h") >= + Math.max( + 0, + Math.min(2, cards.length) - + target.countCards("e", function (card) { + var index = cards.indexOf(card); + return index != -1 && index < 2; + }) + ) + ) + return 1; + return 0; + } + var cards = player + .getCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "olxibing"); + }) + .sort(function (a, b) { + return get.useful(a) - get.useful(b); + }); + if ( + player.countCards("h") - target.countCards("h") < + Math.max( + 0, + Math.min(cards.length, 2) - + player.countCards("e", function (card) { + var index = cards.indexOf(card); + return index != -1 && index < 2; + }) + ) && + (cards.length < 2 || get.value(cards[1]) < 5.5) + ) + return 0.8; + return 0; + }); + "step 1"; + if (result.bool) { + player.logSkill("olxibing", target); + var target = result.targets[0]; + if (target == player) player.chooseToDiscard("he", 2, true); + else player.discardPlayerCard(target, "he", true, 2); + } else event.finish(); + "step 2"; + if (player.isIn() && target.isIn()) { + var hs = player.countCards("h"), + ts = target.countCards("h"); + if (hs != ts) { + var drawer = hs > ts ? target : player; + drawer.draw(2); + player.addTempSkill("olxibing2"); + player.markAuto("olxibing2", [drawer]); + } + } + }, + }, + olxibing2: { + mod: { + targetEnabled: function (card, player, target) { + if (target.getStorage("olxibing2").includes(player)) return false; + }, + cardSavable: function (card, player, target) { + if (target.getStorage("olxibing2").includes(player)) return false; + }, + }, + onremove: true, + }, + bolan: { + audio: 2, + banned: ["kotomi_chuanxiang"], + global: "bolan_g", + initList: function (player) { + var list, + skills = []; + if (get.mode() == "guozhan") { + list = []; + for (var i in lib.characterPack.mode_guozhan) { + if (lib.character[i]) list.push(i); + } + } else if (_status.connectMode) list = get.charactersOL(); + else { + list = []; + for (var i in lib.character) { + if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue; + list.push(i); + } + } + for (var i of list) { + if (i.indexOf("gz_jun") == 0) continue; + for (var j of lib.character[i][3]) { + if (j == "bolan") continue; + var skill = lib.skill[j]; + if (!skill || skill.juexingji || skill.hiddenSkill || skill.zhuSkill || skill.dutySkill || skill.chargeSkill || lib.skill.bolan.banned.includes(j)) continue; + if (skill.init || (skill.ai && (skill.ai.combo || skill.ai.notemp || skill.ai.neg))) continue; + var info = lib.translate[j + "_info"]; + if (info && info.indexOf("出牌阶段限一次") != -1) skills.add(j); + } + } + player.storage.bolan = skills; + }, + check: function (event, player) { + return true; + }, + trigger: { player: "phaseUseBegin" }, + frequent: true, + preHidden: true, + content: function () { + "step 0"; + if (player.isIn()) { + if (!player.storage.bolan) lib.skill.bolan.initList(player); + var list = player.storage.bolan.randomGets(3); + if (!list.length) { + event.finish(); + return; + } + player + .chooseControl(list) + .set( + "choiceList", + list.map(function (i) { + return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; + }) + ) + .set("displayIndex", false) + .set("prompt", "博览:请选择你要获得的技能") + .set("ai", () => { + var list = _status.event.controls.slice(); + return list.sort((a, b) => { + return get.skillRank(b, "in") - get.skillRank(a, "in"); + })[0]; + }); + } else event.finish(); + "step 1"; + player.addTempSkills(result.control, "phaseUseEnd"); + player.popup(result.control); + // game.log(player,'获得了','#g【'+get.translation(result.control)+'】'); + }, + ai: { threaten: 0.9 }, + subSkill: { + g: { + audio: "bolan", + forceaudio: true, + enable: "phaseUse", + usable: 1, + prompt: "出牌阶段限一次。你可以令一名有〖博览〗的角色从三个描述中包含“出牌阶段限一次”的技能中选择一个,你获得此技能直到此阶段结束。", + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.hasSkill("bolan"); + }); + }, + filterTarget: function (card, player, target) { + return player != target && target.hasSkill("bolan"); + }, + selectTarget: function () { + if ( + game.countPlayer(current => { + return lib.skill.bolan_g.filterTarget(null, _status.event.player, current); + }) == 1 + ) + return -1; + return 1; + }, + content: function () { + "step 0"; + player.loseHp(); + "step 1"; + if (target.isIn() && player.isIn()) { + if (!target.storage.bolan) lib.skill.bolan.initList(target); + var list = target.storage.bolan.randomGets(3); + if (!list.length) { + event.finish(); + return; + } + target + .chooseControl(list) + .set( + "choiceList", + list.map(function (i) { + return '
    【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
    " + get.skillInfoTranslation(i, player) + "
    "; + }) + ) + .set("displayIndex", false) + .set("prompt", "博览:请选择令" + get.translation(player) + "获得的技能") + .set("ai", () => { + var list = _status.event.controls.slice(); + return list.sort((a, b) => { + return (get.skillRank(b, "in") - get.skillRank(a, "in")) * get.attitude(_status.event.player, _status.event.getParent().player); + })[0]; + }); + } else event.finish(); + "step 2"; + target.line(player); + player.addTempSkills(result.control, "phaseUseEnd"); + player.popup(result.control); + }, + ai: { + order: function (item, player) { + if (player.hp >= 5 || player.countCards("h") >= 10) return 10; + var list = game.filterPlayer(current => lib.skill.bolan_g.filterTarget(null, player, current)); + for (var target of list) { + if (get.attitude(target, player) > 0) return 10; + } + return 4; + }, + result: { + player: function (player, target) { + if (player.hasUnknown()) return player.hp + player.countCards("h") / 4 - 5 > 0 ? 1 : 0; + var tao = player.countCards("h", "tao"); + if (player.hp + tao > 4) return 4 + get.attitude(player, target); + if (player.hp + tao > 3) return get.attitude(player, target) - 2; + return 0; + }, + }, + }, + }, + }, + }, + yifa: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return player != event.player && (event.card.name == "sha" || (get.color(event.card) == "black" && get.type(event.card) == "trick")); + }, + content: function () { + var target = trigger.player; + target.addTempSkill("yifa2", { player: "phaseEnd" }); + target.addMark("yifa2", 1, false); + }, + ai: { threaten: 0.8 }, + }, + yifa2: { + charlotte: true, + onremove: true, + intro: { content: "手牌上限-#" }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("yifa2"); + }, + }, + }, + buchen: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + hiddenSkill: true, + filter: function (event, player) { + var target = _status.currentPhase; + return event.toShow.includes("jin_simayi") && target && target != player && target.countGainableCards(player, "he") > 0; + }, + direct: true, + content: function () { + var target = _status.currentPhase; + player.gainPlayerCard(target, "he", get.prompt("buchen", target)).set("logSkill", ["buchen", target]); + }, + }, + smyyingshi: { + audio: 2, + enable: "phaseUse", + locked: true, + filter: function (event, player) { + return Array.isArray(event.smyyingshi); + }, + onChooseToUse: function (event) { + if (game.online || !event.player.hasSkill("smyyingshi")) return; + var cards = []; + for (var i = 0; i < event.player.maxHp; i++) { + var card = ui.cardPile.childNodes[i]; + if (card) cards.push(card); + else break; + } + event.set("smyyingshi", cards); + }, + chooseButton: { + dialog: function (event) { + var dialog = ui.create.dialog("鹰视", "hidden"); + if (event.smyyingshi && event.smyyingshi.length) dialog.add(event.smyyingshi); + else dialog.addText("牌堆无牌"); + for (var i of dialog.buttons) { + i.classList.add("noclick"); + } + dialog.buttons.length = 0; + return dialog; + }, + filter: function () { + return false; + }, + }, + }, + xiongzhi: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + player.awakenSkill("xiongzhi"); + "step 1"; + var card = get.cards()[0]; + event.card = card; + player.showCards(card); + if (!player.hasUseTarget(card)) { + card.fix(); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + game.updateRoundNumber(); + event.finish(); + } + "step 2"; + var next = player.chooseUseTarget(card, true); + if (get.info(card).updateUsable == "phaseUse") next.addCount = false; + "step 3"; + if (result.bool) event.goto(1); + else { + card.fix(); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + game.updateRoundNumber(); + } + }, + ai: { + order: 1, + result: { + player: function (player) { + if (!player.hasSkill("smyyingshi")) return 1; + var cards = []; + for (var i = 0; i < Math.min(2, player.maxHp); i++) { + var card = ui.cardPile.childNodes[i]; + if (card) { + if (!player.hasValueTarget(card)) return 0; + } else break; + } + return 1; + }, + }, + }, + }, + quanbian: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + hasHand: function (event) { + var evts = event.player.getHistory("lose", function (evt) { + return evt.getParent() == event; + }); + return evts && evts.length == 1 && evts[0].hs.length > 0; + }, + filter: function (event, player) { + var phase = event.getParent("phaseUse"); + if (!phase || phase.player != player) return false; + var suit = get.suit(event.card); + if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false; + return ( + player.getHistory("useCard", function (evt) { + return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase; + }).length + + player.getHistory("respond", function (evt) { + return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase; + }).length == + 0 + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("cancel2") + .set("prompt", get.prompt("quanbian")) + .set("choiceList", ["摸一张牌", "观看牌堆顶的" + get.cnNumber(player.maxHp) + "张牌并将其中一张置于牌堆底"]) + .set("ai", function () { + var player = _status.event.player; + var suit = get.suit(_status.event.getTrigger().card); + if ( + player.countCards("h", function (card) { + return get.suit(card) == suit && player.hasValueTarget(card, null, true); + }) + ) + return "cancel2"; + return 0; + }); + "step 1"; + if (result.control == "cancel2") { + event.finish(); + return; + } + player.addTempSkill("quanbian2"); + player.storage.quanbian2.add(get.suit(trigger.card)); + player.markSkill("quanbian2"); + if (result.index == 0) { + player.draw(); + event.finish(); + return; + } + event.cards = get.cards(player.maxHp); + player.chooseButton(["将一张牌置于牌堆底", event.cards], true); + "step 2"; + while (cards.length) { + var card = cards.pop(); + card.fix(); + if (card == result.links[0]) ui.cardPile.appendChild(card); + else ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + } + game.updateRoundNumber(); + }, + }, + quanbian2: { + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + onremove: true, + mod: { + cardEnabled2: function (card, player) { + if (get.position(card) == "h" && player.storage.quanbian2.includes(get.suit(card))) return false; + }, + }, + intro: { + content: "本回合内不能使用$花色的手牌", + }, + }, + //卫瓘 + zhongyun: { + audio: 2, + trigger: { player: ["damageEnd", "recoverEnd"] }, + forced: true, + filter: function (event, player) { + return ( + player.hp == player.countCards("h") && + (player.isDamaged() || + game.hasPlayer(function (current) { + return player.inRange(current); + })) + ); + }, + usable: 1, + preHidden: ["zhongyun2"], + content: function () { + "step 0"; + var filterTarget = function (card, player, target) { + return player.inRange(target); + }; + if (game.hasPlayer(current => filterTarget("L∞pers", player, current))) { + var bool = player.isHealthy(); + player.chooseTarget("忠允:对攻击范围内的一名角色造成1点伤害" + (bool ? "" : ",或点取消回复1点体力"), filterTarget, bool).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + } else event._result = { bool: false }; + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.damage(); + } else player.recover(); + }, + group: "zhongyun2", + }, + zhongyun2: { + audio: "zhongyun", + trigger: { + player: ["loseAfter"], + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + var cards1 = event.getl(player).hs, + cards2 = []; + if (event.getg) cards2 = event.getg(player); + return (cards1.length > 0 || cards2.length > 0) && player.countCards("h") == player.hp; + }, + usable: 1, + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + var filterTarget = function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }; + if (!game.hasPlayer(current => filterTarget("L∞pers", player, current))) event._result = { bool: false }; + else + player.chooseTarget(filterTarget, "忠允:弃置一名其他角色的一张牌,或点取消摸一张牌").set("ai", function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + return 0; + }); + "step 1"; + if (!result.bool) player.draw(); + else { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, true, "he"); + } + }, + }, + shenpin: { + audio: 2, + trigger: { global: "judge" }, + filter: function (event, player) { + var color = get.color(event.player.judging[0], event.player); + return ( + player.countCards("hes", function (card) { + if (_status.connectMode && get.position(card) != "e") return true; + return get.color(card) != color; + }) > 0 + ); + }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + var color = get.color(trigger.player.judging[0], trigger.player); + player + .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("shenpin"), "hes", function (card) { + if (get.color(card) == _status.event.color) return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]) + .set("color", color) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + player.respond(result.cards, "highlight", "shenpin", "noOrdering"); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + game.delay(2); + } + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + //彻里吉 + chexuan: { + audio: 2, + enable: "phaseUse", + derivation: ["cheliji_sichengliangyu", "cheliji_tiejixuanyu", "cheliji_feilunzhanyu"], + filter: function (event, player) { + return !player.getEquips(5).length && player.countCards("he", { color: "black" }) > 0; + }, + filterCard: { color: "black" }, + position: "he", + check: function (card) { + return 5 - get.value(card); + }, + content: function () { + "step 0"; + player + .chooseButton( + [ + "请选择要装备的宝物", + [ + lib.skill.chexuan.derivation.map(function (i) { + return ["宝物", "", i]; + }), + "vcard", + ], + ], + true + ) + .set("ai", function (button) { + if (button.link[2] == "cheliji_sichengliangyu" && player.countCards("h") < player.hp) return 1; + return Math.random(); + }); + "step 1"; + var name = result.links[0][2], + card = game.createCard(name, lib.card[name].cardcolor, 5); + player.$gain2(card); + player.equip(card); + game.delay(); + }, + group: "chexuan_lose", + subfrequent: ["lose"], + ai: { + order: 6, + result: { + player: 1, + }, + }, + subSkill: { + lose: { + audio: "chexuan", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + frequent: true, + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.es || !evt.es.length) return false; + if (event.name == "equip" && event.player == player) return false; + for (var i of evt.es) { + if (get.subtype(i, false) == "equip5") return true; + } + return false; + }, + content: function () { + "step 0"; + player.judge(function (card) { + if (get.color(card) == "black") return 3; + return 0; + }); + "step 1"; + if (result.bool) { + var card = game.createCard(lib.skill.chexuan.derivation.randomGet()); + player.$gain2(card); + player.equip(card); + game.delay(); + } + }, + }, + }, + }, + qiangshou: { + mod: { + globalFrom: function (player, target, distance) { + if (player.getEquips(5).length) return distance - 1; + }, + }, + }, + cheliji_sichengliangyu: { + trigger: { global: "phaseJieshuBegin" }, + equipSkill: true, + cardcolor: "heart", + filter: function (event, player) { + return player.countCards("h") < player.hp && player.getEquip("cheliji_sichengliangyu"); + }, + content: function () { + "step 0"; + player.draw(2); + "step 1"; + var card = player.getEquip("cheliji_sichengliangyu"); + if (card) player.discard(card); + }, + }, + cheliji_tiejixuanyu: { + trigger: { global: "phaseJieshuBegin" }, + equipSkill: true, + cardcolor: "club", + filter: function (event, player) { + return player != event.player && !event.player.getHistory("sourceDamage").length && event.player.countCards("he") > 0 && player.getEquip("cheliji_tiejixuanyu"); + }, + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) < 0; + }, + content: function () { + "step 0"; + trigger.player.chooseToDiscard("he", 2, true); + "step 1"; + var card = player.getEquip("cheliji_tiejixuanyu"); + if (card) player.discard(card); + }, + }, + cheliji_feilunzhanyu: { + trigger: { global: "phaseJieshuBegin" }, + equipSkill: true, + cardcolor: "spade", + filter: function (event, player) { + return ( + player != event.player && + event.player.getHistory("useCard", function (card) { + return get.type(card.card) != "basic"; + }).length > 0 && + event.player.countCards("he") > 0 && + player.getEquip("cheliji_feilunzhanyu") + ); + }, + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) <= 0; + }, + content: function () { + "step 0"; + trigger.player.chooseCard("he", true, "将一张牌交给" + get.translation(player)); + "step 1"; + if (result.bool) trigger.player.give(result.cards, player); + "step 2"; + var card = player.getEquip("cheliji_feilunzhanyu"); + if (card) player.discard(card); + }, + }, + //司马伷和黄祖 + caiwang: { + audio: 2, + trigger: { global: ["useCard", "respond"] }, + preHidden: true, + filter: function (event, player) { + if (!Array.isArray(event.respondTo) || event.respondTo[0] == event.player || ![event.respondTo[0], event.player].includes(player)) return false; + var color = get.color(event.card); + if (color == "none" || get.color(event.respondTo[1]) != color) return false; + var target = lib.skill.caiwang.logTarget(event, player); + return target[player.getStorage("naxiang2").includes(target) ? "countGainableCards" : "countDiscardableCards"](player, "he") > 0; + }, + logTarget: function (event, player) { + return player == event.respondTo[0] ? event.player : event.respondTo[0]; + }, + prompt2: function (event, player) { + var target = lib.skill.caiwang.logTarget(event, player); + return (player.getStorage("naxiang2").includes(target) ? "获得" : "弃置") + "该角色的一张牌"; + }, + check: function (event, player) { + return get.attitude(player, lib.skill.caiwang.logTarget(event, player)) <= 0; + }, + popup: false, + content: function () { + "step 0"; + if (player != game.me && !player.isOnline()) game.delayx(); + "step 1"; + var target = lib.skill.caiwang.logTarget(trigger, player); + player.logSkill(event.name, target); + player[player.getStorage("naxiang2").includes(target) ? "gainPlayerCard" : "discardPlayerCard"](target, "he", true); + }, + }, + naxiang: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + forced: true, + preHidden: true, + filter: function (event, player) { + var target = lib.skill.naxiang.logTarget(event, player); + return target && target != player && target.isAlive(); + }, + logTarget: function (event, player) { + return player == event.player ? event.source : event.player; + }, + content: function () { + player.addTempSkill("naxiang2", { player: "phaseBegin" }); + if (!player.storage.naxiang2) player.storage.naxiang2 = []; + player.storage.naxiang2.add(lib.skill.naxiang.logTarget(trigger, player)); + player.markSkill("naxiang2"); + }, + ai: { + combo: "caiwang", + }, + }, + naxiang2: { + onremove: true, + intro: { + content: "已接受$的投降;对这些角色发动【才望】时将“弃置”改为“获得”", + }, + }, + //李肃 + qiaoyan: { + trigger: { player: "damageBegin2" }, + forced: true, + filter: function (event, player) { + return player != _status.currentPhase && event.source && event.source != player; + }, + logTarget: "source", + content: function () { + "step 0"; + var cards = player.getExpansions("qiaoyan"); + if (cards.length) { + var source = trigger.source; + source.gain(cards, player, "give", "bySelf"); + event.finish(); + } else { + trigger.cancel(); + player.draw(); + } + "step 1"; + var hs = player.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length == 1) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, "将一张牌作为“珠”置于武将牌上"); + "step 2"; + if (result.bool && result.cards && result.cards.length) { + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("qiaoyan"); + } + event.finish(); + }, + marktext: "珠", + intro: { content: "expansion", markcount: "expansion" }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (!player.getExpansions("qiaoyan").length) return false; + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; + } + }, + }, + }, + xianzhu: { + trigger: { player: "phaseUseBegin" }, + locked: true, + filter: function (event, player) { + return player.getExpansions("qiaoyan").length > 0; + }, + async cost(event, trigger, player) { + event.cards = player.getExpansions("qiaoyan"); + event.result = await player + .chooseTarget(true, "请选择【献珠】的目标", "将" + get.translation(event.cards) + "交给一名角色。若该角色不为你自己,则你令其视为对其攻击范围内的另一名角色使用【杀】") + .set("ai", function (target) { + var player = _status.event.player; + var eff = get.sgn(get.attitude(player, target)) * get.value(_status.event.getParent().cards[0], target); + if (player != target) + eff += Math.max.apply( + null, + game + .filterPlayer(function (current) { + if (current != target && player.inRange(current) && target.canUse("sha", current, false)) return true; + }) + .map(function (current) { + return get.effect(current, { name: "sha" }, target, player); + }) + ); + return eff; + }) + .forResult(); + }, + content: function () { + "step 0"; + event.cards = player.getExpansions("qiaoyan"); + event.target = targets[0]; + "step 1"; + player.give(cards, target, "give"); + "step 2"; + if ( + player != target && + target.isIn() && + player.isIn() && + game.hasPlayer(function (current) { + return current != target && player.inRange(current) && target.canUse("sha", current, false); + }) + ) { + var str = get.translation(target); + player + .chooseTarget(true, "选择攻击范围内的一名角色,视为" + str + "对其使用【杀】", function (card, player, target) { + var source = _status.event.target; + return player.inRange(target) && source.canUse("sha", target, false); + }) + .set("target", target) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.target, evt.player); + }); + } else event.finish(); + "step 3"; + if (result.bool) target.useCard({ name: "sha", isCard: true }, result.targets[0], false); + }, + ai: { combo: "qiaoyan" }, + }, + huirong: { + trigger: { player: "showCharacterAfter" }, + forced: true, + filter: function (event, player) { + return ( + event.toShow && + event.toShow.includes("jin_yanghuiyu") && + game.hasPlayer(function (target) { + var num = target.countCards("h"); + return num > target.hp || num < Math.min(5, target.hp); + }) + ); + }, + hiddenSkill: true, + content: function () { + "step 0"; + player + .chooseTarget("请选择【慧容】的目标", "令一名角色将手牌数摸至/弃置至与其体力值相同(至多摸至五张)", true, function (card, player, target) { + var num = target.countCards("h"); + return num > target.hp || num < Math.min(5, target.hp); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var num = target.countCards("h"); + if (num > target.hp) return -att * (num - target.hp); + return att * Math.max(0, Math.min(5, target.hp) - target.countCards("h")); + }); + "step 1"; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + if (target.countCards("h") < target.hp) target.drawTo(Math.min(5, target.hp)); + else target.chooseToDiscard("h", true, target.countCards("h") - target.hp); + } + }, + }, + ciwei: { + init: () => { + game.addGlobalSkill("ciwei_ai"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("ciwei"), true)) game.removeGlobalSkill("ciwei_ai"); + }, + trigger: { global: "useCard" }, + direct: true, + preHidden: true, + filter: function (event, player) { + if (event.all_excluded || event.player == player || event.player != _status.currentPhase || !player.countCards("he")) return false; + return event.player.getHistory("useCard").indexOf(event) == 1 && ["basic", "trick"].includes(get.type(event.card)); + }, + content: function () { + "step 0"; + if (player != game.me && !player.isOnline()) game.delayx(); + player + .chooseToDiscard(get.prompt("ciwei", trigger.player), "弃置一张牌,取消" + get.translation(trigger.card) + "的所有目标", "he") + .set("ai", function (card) { + return _status.event.goon / 1.4 - get.value(card); + }) + .set( + "goon", + (function () { + if (!trigger.targets.length) return -get.attitude(player, trigger.player); + var num = 0; + for (var i of trigger.targets) { + num -= get.effect(i, trigger.card, trigger.player, player); + } + return num; + })() + ) + .setHiddenSkill(event.name).logSkill = ["ciwei", trigger.player]; + "step 1"; + if (result.bool) { + trigger.targets.length = 0; + trigger.all_excluded = true; + } + }, + }, + ciwei_ai: { + mod: { + aiOrder: function (player, card, num) { + if ( + player != _status.currentPhase || + player.getHistory("useCard").length > 1 || + !game.hasPlayer(function (current) { + return current != player && (get.realAttitude || get.attitude)(current, player) < 0 && current.hasSkill("ciwei") && current.countCards("he") > 0; + }) + ) + return; + if (player.getHistory("useCard").length == 0) { + if (["basic", "trick"].includes(get.type(card))) return num + 10; + return; + } + if (!["basic", "trick"].includes(get.type(card))) return num + 10; + if (!player._ciwei_temp) { + player._ciwei_temp = true; + num /= Math.max(1, player.getUseValue(card)); + } + delete player._ciwei_temp; + return num; + }, + }, + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("ciwei"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("ciwei_ai"); + }, + }, + caiyuan: { + trigger: { player: "phaseEnd" }, + forced: true, + preHidden: true, + filter: function (event, player) { + if (player.phaseNumber <= 1) return false; + const history1 = _status.globalHistory, + history2 = player.actionHistory; + for (let i = 0; i < Math.min(history1.length, history2.length); i++) { + let i1 = history1.length - 1 - i, + i2 = history2.length - 1 - i; + if (i > 0 && history2[i2].isMe) break; + if (history1[i1].changeHp.some(evt => evt.player == player && evt.num < 0)) return false; + } + return true; + }, + content: function () { + player.draw(2); + }, + }, + zhuosheng: { + audio: 2, + locked: false, + init: function (player) { + player.addSkill("zhuosheng_count"); + if (game.phaseNumber > 0) { + var hs = player.getCards("h"), + all = player.getAllHistory(), + cards = []; + for (var i = all.length - 1; i >= 0; i--) { + for (var j of all[i].gain) { + cards.addArray(j.cards); + } + if (all[i].isRound) break; + } + cards = cards.filter(function (i) { + return hs.includes(i); + }); + if (cards.length) player.addGaintag(cards, "zhuosheng"); + } + }, + onremove: function (player) { + player.removeSkill("zhuosheng_count"); + player.removeGaintag("zhuosheng"); + }, + mod: { + targetInRange: function (card, player, target) { + if (!card.cards || get.type(card) != "basic") return; + for (var i of card.cards) { + if (i.hasGaintag("zhuosheng")) return game.online ? player == _status.currentPhase : player.isPhaseUsing(); + } + }, + cardUsable: function (card, player, target) { + if (!card.cards || get.mode() == "guozhan" || get.type(card) != "basic" || !(game.online ? player == _status.currentPhase : player.isPhaseUsing())) return; + for (var i of card.cards) { + if (i.hasGaintag("zhuosheng")) return Infinity; + } + }, + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("zhuosheng") && get.type(card) == "basic") return num - 0.1; + }, + }, + trigger: { player: "useCard2" }, + direct: true, + filterx: function (event, player) { + if (!player.isPhaseUsing()) return false; + return ( + player.getHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("zhuosheng")) return true; + } + return false; + }).length > 0 + ); + }, + filter: function (event, player) { + if (!lib.skill.zhuosheng.filterx(event, player)) return false; + if (get.type(event.card) != "trick") return false; + if (event.targets && event.targets.length > 0) return true; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current); + }) + ) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; + player + .chooseTarget(get.prompt("zhuosheng"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return true; + return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + "step 1"; + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + "step 2"; + if (event.targets) { + player.logSkill("zhuosheng", event.targets); + if (trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); + else trigger.targets.addArray(event.targets); + } + }, + group: ["zhuosheng_equip", "zhuosheng_silent"], + subfrequent: ["equip"], + subSkill: { + equip: { + audio: "zhuosheng", + trigger: { player: "useCard" }, + filter: function (event, player) { + return get.type(event.card) == "equip" && lib.skill.zhuosheng.filterx(event, player); + }, + frequent: true, + prompt: "是否发动【擢升】摸一张牌?", + content: function () { + player.draw(); + }, + }, + silent: { + trigger: { + player: "useCard1", + }, + silent: true, + firstDo: true, + filter: function (event, player) { + return get.mode() != "guozhan" && get.type(event.card) == "basic" && lib.skill.zhuosheng.filterx(event, player) && event.addCount !== false; + }, + content: function () { + trigger.addCount = false; + var stat = player.getStat(); + if (stat && stat.card && stat.card[trigger.card.name]) stat.card[trigger.card.name]--; + }, + }, + }, + }, + zhuosheng_count: { + trigger: { + player: "gainBegin", + global: "roundStart", + }, + silent: true, + filter: function (event, player) { + if (event.name == "gain") return event.getParent(2).name != "zhuosheng_equip"; + return game.roundNumber > 1; + }, + content: function () { + if (trigger.name == "gain") trigger.gaintag.add("zhuosheng"); + else player.removeGaintag("zhuosheng"); + }, + }, + xinquanbian: { + audio: "quanbian", + preHidden: true, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + var phase = event.getParent("phaseUse"); + if (!phase || phase.player != player) return false; + var suit = get.suit(event.card); + if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false; + return ( + player.getHistory("useCard", function (evt) { + return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase; + }).length + + player.getHistory("respond", function (evt) { + return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase; + }).length == + 0 + ); + }, + content: function () { + "step 0"; + var cards = get.cards(Math.min(5, player.maxHp)); + game.cardsGotoOrdering(cards); + var suit = get.suit(trigger.card); + var next = player.chooseToMove("权变:获得一张不为" + get.translation(suit) + "花色的牌并排列其他牌"); + next.set("suit", suit); + next.set("list", [["牌堆顶", cards], ["获得"]]); + next.set("filterMove", function (from, to, moved) { + var suit = _status.event.suit; + if (moved[0].includes(from.link)) { + if (typeof to == "number") { + if (to == 1) { + if (moved[1].length) return false; + return get.suit(from.link, false) != suit; + } + return true; + } + if (moved[1].includes(to.link)) return get.suit(from.link, false) != suit; + return true; + } else { + if (typeof to == "number") return true; + return get.suit(to.link, false) != suit; + } + }); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(b) - get.value(a); + }), + gains = []; + for (var i of cards) { + if (get.suit(i, false) != _status.event.suit) { + cards.remove(i); + gains.push(i); + break; + } + } + return [cards, gains]; + }); + "step 1"; + if (result.bool) { + var list = result.moved; + if (list[1].length) player.gain(list[1], "gain2"); + while (list[0].length) { + ui.cardPile.insertBefore(list[0].pop(), ui.cardPile.firstChild); + } + game.updateRoundNumber(); + } + }, + //group:'xinquanbian_count', + init: (player, skill) => player.addSkill("xinquanbian_count"), + onremove: (player, skill) => player.removeSkill("xinquanbian_count"), + }, + xinquanbian_count: { + trigger: { + player: ["useCard0", "phaseUseBefore", "phaseUseAfter"], + }, + silent: true, + firstDo: true, + charlotte: true, + filter: function (event, player) { + if (event.name === "phaseUse") return true; + return player.isPhaseUsing() && lib.skill.quanbian.hasHand(event) && get.type(event.card) != "equip"; + }, + content: function () { + var stat = player.getStat("skill"); + if (this.trigger.name === "phaseUse") { + delete stat.xinquanbian; + } else { + if (!stat.xinquanbian) stat.xinquanbian = 0; + stat.xinquanbian++; + } + }, + mod: { + cardEnabled2: function (card, player) { + var stat = player.getStat("skill"); + if (stat.xinquanbian && stat.xinquanbian >= player.maxHp && get.position(card) == "h" && get.type(card, player) != "equip") return false; + }, + }, + }, + taoyin: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + hiddenSkill: true, + logTarget: function () { + return _status.currentPhase; + }, + filter: function (event, player) { + var target = _status.currentPhase; + return target && target != player && target.isAlive(); + }, + check: function (event, player) { + return get.attitude(player, _status.currentPhase) < 0; + }, + content: function () { + _status.currentPhase.addTempSkill("taoyin2"); + _status.currentPhase.addMark("taoyin2", 2, false); + }, + ai: { + expose: 0.2, + }, + }, + taoyin2: { + onremove: true, + charlotte: true, + intro: { + content: "手牌上限-#", + }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("taoyin2"); + }, + }, + }, + yimie: { + audio: 2, + usable: 1, + preHidden: true, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return player != event.player && event.num < event.player.hp; + }, + check: function (event, player) { + if (event.player.hasSkillTag("nodamage")) return false; + let tj = player.countCards("hs", function (card) { + return get.name(card) === "tao" || get.name(card) === "jiu"; + }), + att = get.attitude(_status.event.player, event.player), + eff = get.damageEffect(event.player, player, _status.event.player, get.natureList(event)), + fd = event.player.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }), + hp = player.hp + tj; + if (player.storage.tairan2) hp -= player.storage.tairan2; + if (eff <= 0 || fd || att >= -2 || Math.abs(hp) <= 1) return false; + if (hp > 2 || (eff > 0 && event.player.isLinked() && event.hasNature())) return true; + return !event.player.countCards("hs") || (event.player.hp > 2 * event.num && !event.player.hasSkillTag("maixie")); + }, + logTarget: "player", + content: function () { + player.loseHp(); + trigger.player.addTempSkill("yimie2"); + trigger.yimie_num = trigger.player.hp - trigger.num; + trigger.num = trigger.player.hp; + }, + ai: { + damageBonus: true, + skillTagFilter: function (player, tag, arg) { + return arg && arg.target && arg.target.hp > 1 && player.hp > 1 && get.attitude(player, arg.target) < -2; + }, + }, + }, + yimie2: { + trigger: { player: "damageEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return typeof event.yimie_num == "number"; + }, + content: function () { + player.recover(trigger.yimie_num); + }, + }, + ruilve: { + unique: true, + audio: 2, + global: "ruilve2", + zhuSkill: true, + }, + ruilve2: { + enable: "phaseUse", + discard: false, + lose: false, + delay: false, + line: true, + log: false, + prepare: function (cards, player, targets) { + targets[0].logSkill("ruilve"); + }, + prompt: function () { + var player = _status.event.player; + var list = game.filterPlayer(function (target) { + return target != player && target.hasZhuSkill("ruilve", player); + }); + var str = "将一张具有伤害标签的基本牌或锦囊牌交给" + get.translation(list); + if (list.length > 1) str += "中的一人"; + return str; + }, + filter: function (event, player) { + if (player.group != "jin") return false; + if (player.countCards("h", lib.skill.ruilve2.filterCard) == 0) return false; + return game.hasPlayer(function (target) { + return target != player && target.hasZhuSkill("ruilve", player) && !target.hasSkill("ruilve3"); + }); + }, + filterCard: function (card) { + if (!get.tag(card, "damage")) return false; + var type = get.type(card); + return type == "basic" || type == "trick"; + }, + visible: true, + filterTarget: function (card, player, target) { + return target != player && target.hasZhuSkill("ruilve", player) && !target.hasSkill("ruilve3"); + }, + content: function () { + player.give(cards, target); + target.addTempSkill("ruilve3", "phaseUseEnd"); + }, + ai: { + expose: 0.3, + order: 1, + result: { + target: 5, + }, + }, + }, + ruilve3: {}, + tairan: { + audio: 2, + trigger: { player: "phaseEnd" }, + forced: true, + preHidden: true, + filter: function (event, player) { + return player.hp < player.maxHp || player.countCards("h") < player.maxHp; + }, + content: function () { + "step 0"; + player.addSkill("tairan2"); + if (!player.storage.tairan2) player.storage.tairan2 = 0; + var num = player.maxHp - player.hp; + if (num > 0) { + player.storage.tairan2 = num; + player.recover(num); + } + "step 1"; + if (player.countCards("h") < player.maxHp) player.drawTo(Math.min(player.maxHp, 5 + player.countCards("h"))).gaintag = ["tairan"]; + }, + }, + tairan2: { + mod: { + aiOrder: function (player, card, num) { + if (card.hasGaintag && card.hasGaintag("tairan")) return 10 * num; + }, + aiValue: function (player, card, num) { + if (card.hasGaintag && card.hasGaintag("tairan")) { + if (card.name !== "wuxie" && (get.type(card) === "basic" || get.type(card, "trick") === "trick")) return num / 64; + return num / 8; + } + }, + aiUseful: function (player, card, num) { + return lib.skill.tairan2.mod.aiValue.apply(this, arguments); + }, + }, + audio: "tairan", + trigger: { player: "phaseUseBegin" }, + charlotte: true, + forced: true, + onremove: true, + content: function () { + var map = player.storage.tairan2; + if (map > 0) player.loseHp(map); + var hs = player.getCards("h", function (card) { + return card.hasGaintag("tairan"); + }); + if (hs.length) player.discard(hs); + player.removeSkill("tairan2"); + }, + }, + baoqie: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + forced: true, + hiddenSkill: true, + filter: function (event, player) { + return event.toShow && event.toShow.includes("jin_xiahouhui"); + }, + content: function () { + "step 0"; + var card = get.cardPile(function (card) { + return get.subtype(card, false) == "equip5" && !get.cardtag(card, "gifts"); + }); + if (!card) { + event.finish(); + return; + } + event.card = card; + player.gain(card, "gain2"); + "step 1"; + if (player.getCards("h").includes(card) && get.subtype(card) == "equip5") player.chooseUseTarget(card).nopopup = true; + }, + }, + jyishi: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], + }, + usable: 1, + direct: true, + preHidden: true, + filter: function (event, player) { + var target = _status.currentPhase; + if (!target || !target.isIn() || event.type != "discard" || !target.isPhaseUsing()) return false; + if (target == player) return false; + var evt = event.getl(target); + for (var i of evt.hs) { + if (get.position(i, true) == "d") return true; + } + return false; + }, + content: function () { + "step 0"; + event.target = _status.currentPhase; + event.cards = trigger.getl(event.target).hs.filterInD("d"); + var str = "是否发动【宜室】令" + get.translation(event.target) + "获得一张牌"; + if (event.cards.length > 1) str += ",然后获得其余的牌"; + str += "?"; + player + .chooseButton([str, event.cards]) + .set("ai", function (button) { + var card = button.link; + var source = _status.event.source; + if (get.attitude(player, source) > 0) return Math.max(1, source.getUseValue(card, null, true)); + var cards = _status.event.getParent().cards.slice(0); + if (cards.length == 1) return -get.value(card); + cards.remove(card); + return get.value(cards) - get.value(card) - 2; + }) + .set("source", event.target) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + player.logSkill("jyishi", target); + if (cards.length > 1) { + target.$gain2(result.links[0]); + target.gain(result.links[0], "log"); + } else trigger.player.gain(result.links[0], "gain2"); + cards.remove(result.links[0]); + if (cards.length) player.gain(cards, "gain2"); + } else player.storage.counttrigger.jyishi--; + }, + }, + jyishi2: { charlotte: true }, + shiduo: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return player != target && player.canCompare(target); + }); + }, + filterTarget: function (card, player, target) { + return player != target && player.canCompare(target); + }, + content: function () { + "step 0"; + player.chooseToCompare(target); + "step 1"; + if (result.bool && target.isAlive()) { + var num = target.countCards("h"); + if (num > 0) player.gainPlayerCard(target, true, "h", num); + } else event.finish(); + "step 2"; + var num = Math.floor(player.countCards("h") / 2); + if (num && target.isAlive()) player.chooseCard("h", num, true, "交给" + get.translation(target) + get.cnNumber(num) + "张牌"); + else event.finish(); + "step 3"; + if (result.bool && result.cards && result.cards.length) player.give(result.cards, target); + }, + ai: { + order: 1, + result: { + target: function (player, target) { + var delta = target.countCards("h") - player.countCards("h"); + if (delta < 0) return 0; + return -1 - delta; + }, + }, + }, + }, + tuishi: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + forced: true, + locked: false, + hiddenSkill: true, + filter: function (event, player) { + var target = _status.currentPhase; + return player != target && target && target.isAlive() && event.toShow && event.toShow.includes("jin_simazhao"); + }, + content: function () { + player.addTempSkill("tuishi2"); + }, + }, + tuishi2: { + trigger: { global: "phaseEnd" }, + direct: true, + charlotte: true, + filter: function (event, player) { + var target = _status.currentPhase; + return ( + target != player && + target && + target.isAlive() && + game.hasPlayer(function (current) { + return current != target && target.inRange(current); + }) + ); + }, + content: function () { + "step 0"; + var target = _status.currentPhase; + event.target = target; + player + .chooseTarget(get.prompt2("tuishi", event.target), function (card, player, target) { + var source = _status.event.source; + return source != target && source.inRange(target); + }) + .set("source", target) + .set("goon", get.damageEffect(target, player, player) > 0) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.source, evt.player); + }); + "step 1"; + if (result.bool) { + event.target2 = result.targets[0]; + player.logSkill("tuishi"); + player.line2([target, event.target2]); + game.delayx(); + } else event.finish(); + "step 2"; + target.chooseToUse({ + preTarget: event.target2, + prompt: "请对" + get.translation(event.target2) + "使用一张【杀】,或受到来自" + get.translation(player) + "的1点伤害", + filterCard: function (card, player) { + return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); + }, + filterTarget: function (card, player, target) { + return target == _status.event.preTarget && lib.filter.filterTarget.apply(this, arguments); + }, + addCount: false, + }); + "step 3"; + if (!result.bool) target.damage(); + }, + }, + xinchoufa: { + audio: "choufa", + inherit: "choufa", + content: function () { + "step 0"; + player.choosePlayerCard(target, "h", true); + "step 1"; + player.showCards(result.cards, get.translation(player) + "对" + get.translation(target) + "发动了【筹伐】"); + var type = get.type2(result.cards[0], target), + hs = target.getCards("h", function (card) { + return card != result.cards[0] && get.type2(card, target) != type; + }); + if (hs.length) { + target.addGaintag(hs, "xinchoufa"); + target.addTempSkill("xinchoufa2", { player: "phaseAfter" }); + } + }, + }, + xinchoufa2: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("xinchoufa"); + }, + mod: { + cardname: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return "sha"; + }, + cardnature: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return false; + }, + }, + }, + choufa: { + enable: "phaseUse", + audio: 2, + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return lib.skill.choufa.filterTarget(null, player, current); + }); + }, + filterTarget: function (card, player, target) { + return target != player && !target.hasSkill("choufa2") && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.choosePlayerCard(target, "h", true); + "step 1"; + player.showCards(result.cards); + var type = get.type2(result.cards[0], target); + target.storage.choufa2 = type; + target.addTempSkill("choufa2", { player: "phaseAfter" }); + }, + ai: { + order: 9, + result: { + target: function (player, target) { + return -target.countCards("h"); + }, + }, + }, + }, + choufa2: { + onremove: true, + charlotte: true, + mark: true, + intro: { content: "手牌中的非$牌均视为杀" }, + mod: { + cardname: function (card, player) { + if (get.type2(card, false) != player.storage.choufa2) return "sha"; + }, + cardnature: function (card, player) { + if (get.type2(card, false) != player.storage.choufa2) return false; + }, + }, + }, + zhaoran: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + preHidden: true, + content: function () { + player.addTempSkill("zhaoran2", "phaseUseAfter"); + var cards = player.getCards("h"); + if (cards.length > 0) player.addShownCards(cards, "visible_zhaoran"); + }, + }, + zhaoran2: { + audio: "zhaoran", + group: "zhaoran3", + init: (player, skill) => { + if (!player.storage[skill]) player.storage[skill] = []; + }, + onremove: true, + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player, name) { + if (name == "gainBegin") return true; + var evt = event.getl(player); + if (!evt || !evt.hs || !evt.hs.length) return false; + var list = player.getStorage("zhaoran2"); + for (var i of evt.hs) { + var suit = get.suit(i, player); + if (!list.includes(suit) && !player.countCards("h", { suit: suit })) return true; + } + return false; + }, + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + "step 1"; + var list = []; + var suits = get.copy(player.storage.zhaoran2); + suits.addArray( + player.getCards("h").map(function (card) { + return get.suit(card); + }) + ); + var evt = trigger.getl(player); + for (var i of evt.hs) { + var suit = get.suit(i, player); + if (!suits.includes(suit)) list.add(suit); + } + event.count = list.length; + player.markAuto("zhaoran2", list); + "step 1"; + event.count--; + var filterTarget = function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }; + if ( + !game.hasPlayer(function (current) { + return filterTarget(null, player, current); + }) + ) + event._result = { bool: false }; + else + player.chooseTarget(filterTarget, "弃置一名其他角色的一张牌或摸一张牌").set("ai", function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + return 0; + }); + "step 2"; + if (!result.bool) { + player.logSkill("zhaoran2"); + player.draw(); + } else { + var target = result.targets[0]; + player.logSkill("zhaoran2", target); + player.discardPlayerCard(target, true, "he"); + } + if (event.count > 0) event.goto(1); + }, + intro: { + content: "已因$牌触发过效果", + }, + }, + zhaoran3: { + trigger: { player: ["phaseUseEnd", "gainBegin"] }, + forced: true, + charlotte: true, + firstDo: true, + silent: true, + content: function () { + if (event.triggername == "gainBegin") { + trigger.gaintag.add("visible_zhaoran"); + } else { + player.hideShownCards(player.getCards("h"), "visible_zhaoran"); + } + }, + }, + chengwu: { + zhuSkill: true, + mod: { + inRange: function (from, to) { + if (!from.hasZhuSkill("chengwu") || from._chengwu) return; + from._chengwu = true; + var bool = game.hasPlayer(function (current) { + return current != from && current != to && current.group == "jin" && from.hasZhuSkill("chengwu", current) && current.inRange(to); + }); + delete from._chengwu; + if (bool) return true; + }, + }, + }, + shiren: { + trigger: { player: "showCharacterAfter" }, + hiddenSkill: true, + logTarget: function () { + return _status.currentPhase; + }, + filter: function (event, player) { + if (!event.toShow || !event.toShow.includes("jin_wangyuanji")) return false; + var target = _status.currentPhase; + return target && target != player && target.isAlive() && target.countCards("h") > 0; + }, + content: function () { + var next = game.createEvent("yanxi", false); + next.player = player; + next.target = _status.currentPhase; + next.setContent(lib.skill.yanxi.content); + }, + }, + yanxi: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }); + }, + content: function () { + "step 0"; + event.card = target.getCards("h").randomGet(); + var cards; + cards = get.cards(2); + event.cards = cards.concat([event.card]); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); + } + if (get.mode() == "guozhan") { + var num = ui.cardPile.childElementCount; + var num1 = get.rand(1, num - 1), + num2 = get.rand(1, num - 1); + if (num1 == num2) { + if (num1 == 0) num2++; + else num1--; + } + event.cards = [event.card, ui.cardPile.childNodes[num1], ui.cardPile.childNodes[num2]]; + } + game.updateRoundNumber(); + event.cards.randomSort(); + game.log(player, "展示了", event.cards); + event.videoId = lib.status.videoId++; + var str = get.translation(player) + "对" + get.translation(target) + "发动了【宴戏】"; + game.broadcastAll( + function (str, id, cards) { + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + str, + event.videoId, + event.cards + ); + game.addVideo("showCards", player, [str, get.cardsInfo(event.cards)]); + game.delay(2); + "step 1"; + var func = function (id, target) { + var dialog = get.idDialog(id); + if (dialog) dialog.content.firstChild.innerHTML = "猜猜哪张是" + get.translation(target) + "的手牌?"; + }; + if (player == game.me) func(event.videoId, target); + else if (player.isOnline()) player.send(func, event.videoId, target); + "step 2"; + var next = player.chooseButton(true); + next.set("dialog", event.videoId); + next.set("ai", function (button) { + if (_status.event.answer) return button.link == _status.event.answer ? 1 : 0; + return get.value(button.link, _status.event.player); + }); + if (player.hasSkillTag("viewHandcard", null, target, true)) next.set("answer", card); + "step 3"; + game.broadcastAll("closeDialog", event.videoId); + player.addTempSkill("yanxi2"); + var card2 = result.links[0]; + if (card2 == card) { + player.popup("洗具"); + cards.remove(card2); + player.$gain2(cards); + player.gain(cards, "log").gaintag.add("yanxi"); + player.gain(card, target, "bySelf", "give").gaintag.add("yanxi"); + } else { + player.popup("杯具"); + player.gain(card2, "gain2").gaintag.add("yanxi"); + } + }, + ai: { + order: 6, + result: { + player: 1, + target: -0.6, + }, + }, + }, + yanxi2: { + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("yanxi")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("yanxi")) return false; + }, + }, + onremove: function (player) { + player.removeGaintag("yanxi"); + }, + }, + sanchen: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var stat = player.getStat("sanchen"); + return game.hasPlayer(function (current) { + return !stat || !stat.includes(current); + }); + }, + filterTarget: function (card, player, target) { + var stat = player.getStat("sanchen"); + return !stat || !stat.includes(target); + }, + content: function () { + "step 0"; + var stat = player.getStat(); + if (!stat.sanchen) stat.sanchen = []; + stat.sanchen.push(target); + if (get.mode() != "guozhan") player.addMark("sanchen", 1, false); + target.draw(3); + "step 1"; + if (!target.countCards("he")) event._result = { bool: false }; + else + target.chooseToDiscard("he", true, 3).set("ai", function (card) { + var list = ui.selected.cards.map(function (i) { + return get.type2(i); + }); + if (!list.includes(get.type2(card))) return 7 - get.value(card); + return -get.value(card); + }); + "step 2"; + if (result.bool && result.cards && result.cards.length) { + var list = []; + for (var i of result.cards) list.add(get.type2(i)); + if (list.length == result.cards.length) { + target.draw(); + player.getStat("skill").sanchen--; + if (get.mode() == "guozhan") player.addTempSkills("pozhu"); + } + } else { + target.draw(); + player.getStat("skill").sanchen--; + if (get.mode() == "guozhan") player.addTempSkills("pozhu"); + } + }, + ai: { + order: 9, + threaten: 1.7, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0.1; + return Math.sqrt(target.countCards("he")); + }, + }, + }, + intro: { + content: "已发动过#次技能", + }, + marktext: "陈", + }, + zhaotao: { + forbid: ["guozhan"], + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.countMark("sanchen") > 2; + }, + content: function () { + player.awakenSkill("zhaotao"); + player.loseMaxHp(); + player.addSkills("pozhu"); + }, + derivation: "pozhu", + ai: { + combo: "sanchen", + }, + }, + pozhu: { + enable: "phaseUse", + viewAsFilter: function (player) { + return !player.hasSkill("pozhu3", null, null, false) && player.countCards("hs") > 0; + }, + viewAs: { name: "chuqibuyi" }, + filterCard: true, + position: "hs", + check: function (card) { + return 7 - get.value(card); + }, + group: "pozhu2", + }, + pozhu2: { + trigger: { player: "useCardAfter" }, + silent: true, + filter: function (event, player) { + return ( + event.skill == "pozhu" && + (get.mode() == "guozhan" || + !player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length) + ); + }, + content: function () { + player.addTempSkill("pozhu3"); + }, + }, + pozhu3: { charlotte: true }, + xijue: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame", "showCharacterAfter"], + }, + forced: true, + filter: function (event, player) { + if (player._xijue) return false; + if (get.mode() == "guozhan") return event.name == "showCharacter" && event.toShow && event.toShow.includes("gz_zhanghuyuechen"); + return event.name != "showCharacter" && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + player.addMark("xijue", 4); + player._xijue = true; + }, + intro: { + name2: "爵", + content: "mark", + }, + derivation: ["xijue_tuxi", "xijue_xiaoguo"], + group: ["xijue_gain", "xijue_tuxi", "xijue_xiaoguo"], + }, + xijue_gain: { + audio: "xijue", + trigger: { player: "phaseEnd" }, + forced: true, + filter: function (event, player) { + var stat = player.getStat(); + return stat.damage && stat.damage > 0; + }, + content: function () { + player.addMark("xijue", player.getStat().damage); + }, + }, + xijue_tuxi: { + audio: 2, + trigger: { + player: "phaseDrawBegin2", + }, + direct: true, + filter: function (event, player) { + return ( + event.num > 0 && + !event.numFixed && + player.hasMark("xijue") && + game.hasPlayer(function (target) { + return player != target && target.countCards("h") > 0; + }) + ); + }, + content: function () { + "step 0"; + var num = trigger.num; + if (get.mode() == "guozhan" && num > 2) num = 2; + player.chooseTarget( + "是否弃置一枚“爵”发动【突袭】?", + "获得至多" + get.translation(num) + "名角色的各一张手牌,然后少摸等量的牌", + [1, num], + function (card, player, target) { + return target.countCards("h") > 0 && player != target; + }, + function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + } + ); + "step 1"; + if (result.bool) { + result.targets.sortBySeat(); + player.logSkill("xijue_tuxi", result.targets); + player.removeMark("xijue", 1); + player.gainMultiple(result.targets); + trigger.num -= result.targets.length; + } else { + event.finish(); + } + "step 2"; + if (trigger.num <= 0) game.delay(); + }, + ai: { + expose: 0.2, + }, + }, + xijue_xiaoguo: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + player.hasMark("xijue") && + event.player.isAlive() && + event.player != player && + player.countCards("h", function (card) { + if (_status.connectMode || get.mode() != "guozhan") return true; + return get.type(card) == "basic"; + }) + ); + }, + direct: true, + content: function () { + "step 0"; + var nono = + Math.abs(get.attitude(player, trigger.player)) < 3 || + trigger.player.hp > player.countMark("xijue") * 1.5 || + trigger.player.countCards("e", function (card) { + return get.value(card, trigger.player) <= 0; + }); + if (get.damageEffect(trigger.player, player, player) <= 0) { + nono = true; + } + var next = player.chooseToDiscard(`是否弃置一枚“爵”和一张${get.mode() == "guozhan" ? "基本" : "手"}牌,对${get.translation(trigger.player)}发动【骁果】?`, "h", function (card, player) { + if (get.mode() != "guozhan") return true; + return get.type(card, player) == "basic"; + }); + next.set("ai", function (card) { + if (_status.event.nono) return 0; + return 8 - get.useful(card); + }); + next.set("logSkill", ["xijue_xiaoguo", trigger.player]); + next.set("nono", nono); + "step 1"; + if (result.bool) { + player.removeMark("xijue", 1); + var nono = get.damageEffect(trigger.player, player, trigger.player) >= 0; + trigger.player + .chooseToDiscard("he", "弃置一张装备牌并令" + get.translation(player) + "摸一张牌,或受到1点伤害", { type: "equip" }) + .set("ai", function (card) { + if (_status.event.nono) { + return 0; + } + if (_status.event.player.hp == 1) return 10 - get.value(card); + return 9 - get.value(card); + }) + .set("nono", nono); + } else { + event.finish(); + } + "step 2"; + if (result.bool) { + if (get.mode() != "guozhan") player.draw(); + } else { + trigger.player.damage(); + } + }, + ai: { + expose: 0.3, + threaten: 1.3, + }, + }, + huishi: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { + return ui.cardPile.childElementCount % 10 > 0 && !event.numFixed; + }, + preHidden: true, + prompt: function () { + return get.prompt("huishi") + "(当前牌堆尾数:" + (ui.cardPile.childElementCount % 10) + ")"; + }, + check: function (event, player) { + return ui.cardPile.childElementCount % 10 > 3; + }, + content: function () { + "step 0"; + trigger.changeToZero(); + var cards = game.cardsGotoOrdering(get.cards(ui.cardPile.childElementCount % 10)).cards; + var num = Math.ceil(cards.length / 2); + var next = player.chooseToMove("慧识:将" + get.cnNumber(num) + "张牌置于牌堆底并获得其余的牌", true); + next.set("list", [["牌堆顶的展示牌", cards], ["牌堆底"]]); + next.set("filterMove", function (from, to, moved) { + if (moved[0].includes(from) && to == 1) return moved[1].length < _status.event.num; + return true; + }); + next.set("filterOk", function (moved) { + return moved[1].length == _status.event.num; + }); + next.set("num", num); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(b) - get.useful(a); + }); + return [cards, cards.splice(cards.length - _status.event.num)]; + }); + "step 1"; + if (result.bool) { + var list = result.moved; + if (list[0].length) player.gain(list[0], "gain2"); + while (list[1].length) ui.cardPile.appendChild(list[1].shift().fix()); + } + }, + }, + qingleng: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + preHidden: true, + filter: function (event, player) { + var target = event.player; + return target != player && target.isIn() && !target.storage.nohp && target.hp + target.countCards("h") >= ui.cardPile.childElementCount % 10 && player.countCards("he") > 0 && player.canUse({ name: "sha", nature: "ice" }, target, false); + }, + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt("qingleng", trigger.player), "将一张牌当做冰【杀】对其使用", function (card, player) { + return player.canUse(get.autoViewAs({ name: "sha", nature: "ice" }, [card]), _status.event.target, false); + }) + .set("target", trigger.player) + .set("ai", function (card) { + if (get.effect(_status.event.target, get.autoViewAs({ name: "sha", nature: "ice" }, [card]), player) <= 0) return false; + return 6 - get.value(card); + }) + .setHiddenSkill(event.name); + "step 1"; + if (result.bool) { + player.useCard(get.autoViewAs({ name: "sha", nature: "ice" }, result.cards), result.cards, false, trigger.player, "qingleng"); + if (!player.storage.qingleng || !player.storage.qingleng.includes(trigger.player)) { + player.draw(); + player.markAuto("qingleng", [trigger.player]); + player.storage.qingleng.sortBySeat(); + } + } + }, + intro: { + content: "已对$发动过此技能", + }, + }, + xuanmu: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + forced: true, + hiddenSkill: true, + filter: function (event, player) { + return event.toShow.includes("jin_zhangchunhua") && player != _status.currentPhase; + }, + content: function () { + player.addTempSkill("xuanmu2"); + }, + }, + xuanmu2: { + trigger: { player: "damageBegin4" }, + forced: true, + popup: false, + content: function () { + trigger.cancel(); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) return "zerotarget"; + }, + }, + }, + }, + g_hidden_ai: { + charlotte: true, + ai: { + threaten: function (player, target) { + if (get.mode() != "guozhan" && target.isUnseen(2)) return 0.0001; + return 1; + }, + }, + }, +}; + +export default skills; diff --git a/character/yingbian/sort.js b/character/yingbian/sort.js new file mode 100644 index 000000000..82a6e648a --- /dev/null +++ b/character/yingbian/sort.js @@ -0,0 +1,17 @@ +const characterSort = { + yingbian_pack1: ["jin_simayi", "jin_zhangchunhua", "ol_lisu", "simazhou", "cheliji", "ol_huaxin"], + yingbian_pack2: ["jin_simashi", "jin_xiahouhui", "zhanghuyuechen", "shibao", "jin_yanghuiyu", "chengjichengcui"], + yingbian_pack3: ["jin_simazhao", "jin_wangyuanji", "duyu", "weiguan", "xuangongzhu"], + yingbian_pack4: ["zhongyan", "xinchang", "jin_jiachong", "wangxiang"], + yingbian_pack5: ["yangyan", "yangzhi"], +}; + +const characterSortTranslate = { + yingbian_pack1: "文德武备·理", + yingbian_pack2: "文德武备·备", + yingbian_pack3: "文德武备·果", + yingbian_pack4: "文德武备·戒", + yingbian_pack5: "文德武备·约", +}; + +export { characterSort, characterSortTranslate }; diff --git a/character/yingbian/translate.js b/character/yingbian/translate.js new file mode 100644 index 000000000..c380ea733 --- /dev/null +++ b/character/yingbian/translate.js @@ -0,0 +1,211 @@ +const translates = { + jin_zhangchunhua: "晋张春华", + jin_zhangchunhua_prefix: "晋", + huishi: "慧识", + huishi_info: "摸牌阶段,你可以放弃摸牌,改为观看牌堆顶的X张牌,获得其中的一半(向下取整),然后将其余牌置入牌堆底。(X为牌堆数量的个位数)", + qingleng: "清冷", + qingleng_info: "一名角色的回合结束时,若其体力值与手牌数之和不小于X,则你可将一张牌当无距离限制的冰属性【杀】对其使用(X为牌堆数量的个位数)。若这是你本局游戏内首次对其发动此技能,则你摸一张牌。", + xuanmu: "宣穆", + xuanmu2: "宣穆", + xuanmu_info: "锁定技,隐匿技。你于其他角色的回合登场时,防止你受到的伤害直到回合结束。", + jin_simayi: "晋司马懿", + jin_simayi_prefix: "晋", + zhanghuyuechen: "张虎乐綝", + xijue: "袭爵", + xijue_gain: "袭爵", + xijue_info: "锁定技,游戏开始时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。", + xijue_info_guozhan: "锁定技,当你首次明置此武将牌时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。", + xijue_tuxi: "突袭", + xijue_tuxi_info: "摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。", + xijue_tuxi_info_guozhan: "摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。", + xijue_xiaoguo: "骁果", + xijue_xiaoguo_info: "其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。", + xijue_xiaoguo_info_guozhan: "其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌;2.受到你对其造成的1点伤害。", + gz_duyu: "杜预", + duyu: "晋杜预", + duyu_prefix: "晋", + sanchen: "三陈", + sanchen_info: "出牌阶段限一次。你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且〖三陈〗于此阶段内使用次数上限+1。", + sanchen_info_guozhan: "出牌阶段,你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且你获得技能〖破竹〗直到回合结束。否则你本阶段内不能再发动〖三陈〗。", + zhaotao: "诏讨", + zhaotao_info: "觉醒技,准备阶段,若你本局游戏内发动〖三陈〗的次数大于2,则你减1点体力上限并获得〖破竹〗。", + pozhu: "破竹", + pozhu_info: "出牌阶段,你可以将一张手牌当做【出其不意】使用。若你未因此牌造成过伤害,则你不能再发动〖破竹〗直到回合结束。", + pozhu_info_guozhan: "出牌阶段限一次,你可以将一张手牌当做【出其不意】使用。", + jin_wangyuanji: "晋王元姬", + jin_wangyuanji_prefix: "晋", + shiren: "识人", + shiren_info: "隐匿技。你于其他角色的回合内登场时,若其有手牌,则你可对其发动〖宴戏〗。", + yanxi: "宴戏", + yanxi2: "宴戏", + yanxi_info: "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆顶的两张牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。", + yanxi_info_guozhan: "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆中的两张随机牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。", + jin_simazhao: "晋司马昭", + jin_simazhao_prefix: "晋", + tuishi: "推弑", + tuishi_info: "隐匿技,你于其他角色A的回合内登场时,可于此回合结束时选择其攻击范围内的一名角色B。A选择一项:①对B使用一张【杀】。②你对A造成1点伤害。", + choufa: "筹伐", + choufa2: "筹伐", + choufa_info: "出牌阶段限一次,你可展示一名其他角色的一张手牌并记录其类型A。你令其原类型不为A的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。", + xinchoufa: "筹伐", + xinchoufa_info: "出牌阶段限一次,你可展示一名其他角色的一张手牌A。你令其所有类型与A不同的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。", + zhaoran: "昭然", + zhaoran2: "昭然", + zhaoran_info: "出牌阶段开始时,你可令你的手牌对其他角色可见直到出牌阶段结束。若如此做,当你于此阶段内失去一张手牌后,若你的手牌里没有与此牌花色相同的牌且你本回合内未因该花色的牌触发过此效果,则你选择一项:①摸一张牌。②弃置一名其他角色的一张牌。", + visible_zhaoran: "invisible", + chengwu: "成务", + chengwu_info: "主公技,锁定技,其他晋势力角色攻击范围内的角色视为在你的攻击范围内。", + jin_xiahouhui: "晋夏侯徽", + jin_xiahouhui_prefix: "晋", + baoqie: "宝箧", + baoqie_info: "隐匿技,锁定技。你登场后,从牌堆或弃牌堆中获得一张不为赠物的宝物牌。若此牌在你的手牌区内为宝物牌,则你可以使用此牌。", + jyishi: "宜室", + jyishi_info: "每回合限一次,当有其他角色于其出牌阶段内因弃置而失去手牌后,你可令其获得这些牌中位于弃牌堆的一张,然后你获得其余位于弃牌堆的牌。", + shiduo: "识度", + shiduo_info: "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得其所有手牌。然后你交给其X张手牌(X为你手牌数的一半,向下取整)。", + jin_simashi: "晋司马师", + jin_simashi_prefix: "晋", + taoyin: "韬隐", + taoyin2: "韬隐", + taoyin_info: "隐匿技,当你登场后,若当前回合角色存在且不是你,则你可令该角色本回合的手牌上限-2。", + yimie: "夷灭", + yimie2: "夷灭", + yimie_info: "每回合限一次,当你对其他角色造成伤害时,若伤害值X小于Y,则你可失去1点体力,将伤害值改为Y。此伤害结算结束后,其回复(Y-X)点体力(Y为其体力值)。", + ruilve: "睿略", + ruilve2: "睿略", + ruilve_info: "主公技,其他晋势力角色的出牌阶段限一次,该角色可以将一张带有伤害标签的基本牌或锦囊牌交给你。", + tairan: "泰然", + tairan2: "泰然", + tairan_info: "锁定技,回合结束时,你将体力回复至体力上限,并将手牌摸至体力上限(称为“泰然”牌,且至多摸五张)。然后你的下一个出牌阶段开始时,你失去上一次以此法回复的体力值的体力,弃置所有“泰然”牌。", + gz_jin_simayi: "司马懿", + gz_jin_zhangchunhua: "张春华", + gz_jin_simazhao: "司马昭", + gz_jin_wangyuanji: "王元姬", + gz_jin_simashi: "司马师", + gz_jin_xiahouhui: "夏侯徽", + xinquanbian: "权变", + xinquanbian_info: "出牌阶段,每当你首次使用/打出一种花色的手牌时,你可以从牌堆顶的X张牌中获得一张与此牌花色不同的牌,并将其余牌以任意顺序置于牌堆顶。出牌阶段,你至多可使用X张非装备手牌。(X为你的体力上限)", + shibao: "石苞", + zhuosheng: "擢升", + zhuosheng_info: "出牌阶段,①你使用本轮内得到的基本牌时无次数和距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。", + zhuosheng_info_guozhan: "出牌阶段,①你使用本轮内得到的基本牌时无距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。", + jin_yanghuiyu: "晋羊徽瑜", + jin_yanghuiyu_prefix: "晋", + gz_jin_yanghuiyu: "羊徽瑜", + huirong: "慧容", + huirong_info: "隐匿技,锁定技。当你登场后,你令一名角色将手牌数摸至/弃至与体力值相同(至多摸至五张)。", + ciwei: "慈威", + ciwei_info: "一名角色于其回合内使用第二张牌时,若此牌为基本牌或普通锦囊牌,则你可以弃置一张牌,取消此牌的所有目标。", + caiyuan: "才媛", + caiyuan_info: "锁定技。回合结束时,若你于你的上一个回合结束后未扣减过体力,则你摸两张牌。", + simazhou: "司马伷", + caiwang: "才望", + caiwang_info: "当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。", + naxiang: "纳降", + naxiang2: "纳降", + naxiang_info: "锁定技,当你受到其他角色造成的伤害后,或你对其他角色造成伤害后,你对其发动〖才望①〗时的“弃置”改为“获得”直到你的下回合开始。", + cheliji: "彻里吉", + chexuan: "车悬", + chexuan_info: "出牌阶段,若你的装备区里没有宝物牌,你可弃置一张黑色牌,选择一张【舆】置入你的装备区;当你失去装备区里的宝物牌后,你可进行判定,若结果为黑色,将一张随机的【舆】置入你的装备区。", + qiangshou: "羌首", + qiangshou_info: "锁定技,若你的装备区内有宝物牌,你与其他角色的距离-1。", + cheliji_sichengliangyu: "四乘粮舆", + cheliji_sichengliangyu_bg: "粮", + cheliji_sichengliangyu_info: "一名角色的回合结束时,若你的手牌数小于体力值,你可以摸两张牌,然后弃置此牌。", + cheliji_tiejixuanyu: "铁蒺玄舆", + cheliji_tiejixuanyu_bg: "蒺", + cheliji_tiejixuanyu_info: "其他角色的回合结束时,若其本回合未造成过伤害,你可以令其弃置两张牌,然后弃置此牌。", + cheliji_feilunzhanyu: "飞轮战舆", + cheliji_feilunzhanyu_bg: "轮", + cheliji_feilunzhanyu_info: "其他角色的回合结束时,若其本回合使用过非基本牌,你可以令其交给你一张牌,然后弃置此牌。", + weiguan: "卫瓘", + zhongyun: "忠允", + zhongyun2: "忠允", + zhongyun_info: "锁定技。每名角色的回合限一次,你受伤/回复体力后,若你的体力值与手牌数相等,你回复1点体力或对你攻击范围内的一名角色造成1点伤害;每名角色的回合限一次,你获得手牌或失去手牌后,若你的体力值与手牌数相等,你摸一张牌或弃置一名其他角色一张牌。", + shenpin: "神品", + shenpin_info: "当一名角色的判定牌生效前,你可以打出一张与判定牌颜色不同的牌代替之。", + zhongyan: "钟琰", + bolan: "博览", + bolan_info: "①出牌阶段开始时,你可从三个描述中带有“出牌阶段限一次”的技能中选择一个,令当前回合角色获得直至此阶段结束。②其他角色出牌阶段限一次,其可以失去1点体力,令你发动一次〖博览①〗。", + yifa: "仪法", + yifa2: "仪法", + yifa_info: "锁定技,其他角色使用【杀】或黑色普通锦囊牌指定你为目标后,其手牌上限-1直到其回合结束。", + ol_huaxin: "OL华歆", + ol_huaxin_prefix: "OL", + caozhao: "草诏", + caozhao_backup: "草诏", + caozhao_info: "出牌阶段限一次,你可展示一张手牌并声明一种未以此法声明过的基本牌或普通锦囊牌,令一名体力不大于你的其他角色选择一项:令此牌视为你声明的牌,或其失去1点体力。然后若此牌声明成功,然后你可将其交给一名其他角色。", + olxibing: "息兵", + olxibing_info: "当你受到其他角色造成的伤害后,你可弃置你或该角色两张牌,然后你们中手牌少的角色摸两张牌,以此法摸牌的角色不能使用牌指定你为目标直到回合结束。", + recaiwang: "才望", + recaiwang_info: "①当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。②若你的手牌数为1,则你可以将该手牌当做【闪】使用或打出。③若你的装备区牌数为1,则你可以将该装备当做【无懈可击】使用或打出。④若你的判定区牌数为1,则你可以将该延时锦囊牌当做【杀】使用或打出。", + recaiwang_hand: "才望", + recaiwang_equip: "才望", + recaiwang_judge: "才望", + yangyan: "杨艳", + xuanbei: "选备", + xuanbei_info: "①游戏开始时,你从牌堆中获得两张具有应变标签的牌。②每回合限一次。当你使用的具有应变标签的牌结算结束后,你可将此牌对应的所有实体牌交给一名其他角色。", + xianwan: "娴婉", + xianwan_info: "①当你需要使用【闪】时,若你的武将牌未横置,则你可以横置武将牌并视为使用【闪】。②当你需要使用【杀】时,若你的武将牌横置,则你可以重置武将牌并视为使用【杀】。", + yangzhi: "杨芷", + wanyi: "婉嫕", + wanyi_info: "每回合每项限一次。出牌阶段,你可以将一张具有应变效果的牌当做【逐近弃远】/【出其不意】/【水淹七军】/【洞烛先机】使用。", + maihuo: "埋祸", + maihuo_info: "①当你成为其他角色使用【杀】的目标后,若此【杀】不为转化牌且有对应的实体牌且其武将牌上没有“祸”且你是此牌的唯一目标,则你可以令此牌对你无效,并将此【杀】置于其武将牌上,称为“祸”。②一名其他角色的出牌阶段开始时,若其武将牌上有“祸”,则其对你使用此“祸”(有距离限制且计入次数限制,若你不是此牌的合法目标,则改为将此“祸”置入弃牌堆)。③当你对有“祸”的其他角色造成伤害后,你移去其“祸”。", + xinchang: "辛敞", + canmou: "参谋", + canmou_info: "一名角色使用普通锦囊牌指定第一个目标时,若其手牌数为全场唯一最多,则你可以为此牌增加一个额外目标。", + congjian: "从鉴", + congjian_info: "一名其他角色成为普通锦囊牌的唯一目标时,若其体力值为全场唯一最多,则你也可以成为此牌的目标。此牌结算结束后,若你受到过渠道为此牌的伤害,则你摸两张牌。", + xuangongzhu: "晋宣公主", + gz_xuangongzhu: "宣公主", + xuangongzhu_prefix: "晋", + gaoling: "高陵", + gaoling_info: "隐匿技。当你于回合外明置此武将牌时,你可以令一名角色回复1点体力。", + qimei: "齐眉", + qimei_info: "准备阶段,你可以选择一名其他角色。你获得如下效果直到下回合开始:①每回合限一次,当你或其获得牌/失去手牌后,若你与其手牌数相等,则另一名角色摸一张牌。②每回合限一次,当你或其的体力值变化后,若你与其体力值相等,则另一名角色摸一张牌。", + ybzhuiji: "追姬", + ybzhuiji_info: "出牌阶段开始时,你可选择一项:①摸两张牌,并于出牌阶段结束时失去1点体力;②回复1点体力,并于出牌阶段结束时弃置两张牌。", + jin_yanghu: "晋羊祜", + jin_yanghu_prefix: "晋", + huaiyuan: "怀远", + huaiyuanx: "绥", + huaiyuan_info: "①游戏开始时,你将你的手牌标记为“绥”。②当你失去一张“绥”后,你令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。③当你死亡时,你可令一名其他角色的手牌上限+X,且攻击范围+Y(X和Y为你自己被执行过〖怀远②〗的选项一和选项二的次数)。", + chongxin: "崇信", + chongxin_info: "出牌阶段限一次,你可重铸一张牌,且令一名有手牌的其他角色也重铸一张牌。", + dezhang: "德彰", + dezhang_info: "觉醒技。准备阶段,若你没有“绥”,则你减1点体力上限并获得〖卫戍〗。", + weishu: "卫戍", + weishu_info: "锁定技。①当你于摸牌阶段外不因〖卫戍①〗而摸牌后,你令一名角色摸一张牌。②当你于弃牌阶段外不因〖卫戍②〗而弃置牌后,你弃置一名其他角色的一张牌。", + jin_jiachong: "晋贾充", + jin_jiachong_prefix: "晋", + xiongshu: "凶竖", + xiongshu_info: "其他角色的出牌阶段开始时,你可弃置X张牌(X为你本轮内此前已发动过此技能的次数,为0则不弃)并展示其一张手牌,然后你预测“其本阶段内是否会使用与展示牌牌名相同的牌”。此阶段结束时,若你的预测正确,则你对其造成1点伤害;否则你获得展示牌。", + jianhui: "奸回", + jianhui_info: "锁定技。当你造成伤害后,若受伤角色为A,则你摸一张牌;当你受到伤害后,若伤害来源为A,则A弃置一张牌。(A为除本次伤害外最近一次对你造成过伤害的角色)", + xinxuanbei: "选备", + xinxuanbei_info: "出牌阶段限一次。你可选择一名其他角色区域内的一张牌。然后其对你使用对应实体牌为此牌的【杀】。然后若此【杀】,未对你造成过伤害,你摸一张牌;对你造成过伤害,你摸两张牌。", + xinwanyi: "婉嫕", + xinwanyi_info: "①当你使用【杀】或普通锦囊牌指定其他角色为唯一目标后,你可将其的一张牌置于你的武将牌上作为“嫕”。②你不能使用/打出/弃置与“嫕”花色相同的牌。③结束阶段或当你受到伤害后,你令一名角色获得你的一张“嫕”。", + jin_guohuai: "郭槐", + zhefu: "哲妇", + zhefu_info: "当你于回合外使用或打出牌后,你可令一名有手牌的其他角色选择一项:⒈弃置一张名称相同的牌。⒉受到你造成的1点伤害。", + yidu: "遗毒", + yidu_info: "当你使用的【杀】或伤害性锦囊牌结算结束后,你可以展示一名未受到过渠道为此牌伤害的目标角色的至多三张手牌。若这些牌颜色均相同,则你弃置这些牌。", + wangxiang: "王祥", + bingxin: "冰心", + bingxin_info: "每种牌名每回合限一次。当你需要使用基本牌时,若你的手牌数等于体力值且这些牌的颜色均相同,则你可以摸一张牌,视为使用一张基本牌。", + ol_lisu: "OL李肃", + ol_lisu_prefix: "OL", + qiaoyan: "巧言", + qiaoyan_info: "锁定技,当你于回合外受到其他角色造成的伤害时,若你:有“珠”,则你令伤害来源获得“珠”;没有“珠”,则你防止此伤害,然后摸一张牌,并将一张牌正面朝上置于武将牌上,称为“珠”。", + xianzhu: "献珠", + xianzhu_info: "锁定技,出牌阶段开始时,你令一名角色A获得“珠”。若A不为你自己,则你选择你攻击范围内的一名角色B,视为A对B使用一张【杀】。", + chengjichengcui: "成济成倅", + oltousui: "透髓", + oltousui_info: "你可以将任意张牌置于牌堆底,视为使用一张需使用等量张【闪】抵消的【杀】。", + olchuming: "畜鸣", + olchuming_info: "锁定技。当你对其他角色造成伤害时,或当你受到其他角色造成的伤害时,若此伤害的渠道不为牌或没有对应的实体牌,此伤害+1,否则其于本回合结束时将所有以此法造成伤害的牌当【借刀杀人】或【过河拆桥】对你使用。", +}; + +export default translates; diff --git a/character/yingbian/voices.js b/character/yingbian/voices.js new file mode 100644 index 000000000..800b3a600 --- /dev/null +++ b/character/yingbian/voices.js @@ -0,0 +1,142 @@ +export default { + "#oltousui1": "区区黄口孺帝,能有何作为?", + "#oltousui2": "昔年沙场茹血,今欲饮帝血!", + "#olchuming1": "明公为何如此待我兄弟?", + "#olchuming2": "栖佳木之良禽,其鸣亦哀乎?", + "#chengjichengcui:die": "今为贼子贾充所害!", + "#bingxin1": "思鸟黄雀至,卧冰鱼自跃。", + "#bingxin2": "夜静向寒月,卧冰求鲤鱼。", + "#wangxiang:die": "夫生之有死,自然之理也。", + "#xiongshu1": "怀志拥权,谁敢不服?", + "#xiongshu2": "天下凶凶,由我一人。", + "#jianhui1": "一箭之仇,十年不忘!", + "#jianhui2": "此仇不报,怨恨难消!", + "#jin_jiachong:die": "任元褒,吾与汝势不两立!", + "#gaoling1": "天家贵胄,福泽四海。", + "#gaoling2": "宣王之女,恩惠八方。", + "#qimei1": "辅车相依,比翼双飞。", + "#qimei2": "情投意合,相濡以沫。", + "#ybzhuiji1": "不过是些微代价罢了。", + "#ybzhuiji2": "哼,以为这就能难倒我吗?", + "#xuangongzhu:die": "元凯,我去也……", + "#canmou1": "兢兢业业,竭心筹划。", + "#canmou2": "欲设此法,计谋二人。", + "#congjian1": "为人臣属,安可不随?", + "#congjian2": "主公有难,吾当从之。", + "#xinchang:die": "宪英,救我!", + "#wanyi1": "天性婉嫕,易以道御。", + "#wanyi2": "婉嫕利珍,为后攸行。", + "#maihuo1": "祸根未决,转而滋蔓。", + "#maihuo2": "无德之亲,终为祸根。", + "#yangzhi:die": "贾氏……构陷……", + "#xuanbei1": "博选良家,以充后宫。", + "#xuanbei2": "非良家,不可选也。", + "#xianwan1": "婉而从物,不竞不争。", + "#xianwan2": "娴婉恭谨,重贤加礼。", + "#yangyan:die": "一旦殂损,痛悼伤怀……", + "#caozhao1": "草诏所宣,密勿从事。", + "#caozhao2": "惩恶扬功,四方之纲。", + "#olxibing1": "讲信修睦,息兵不功。", + "#olxibing2": "天时未至,周武还师。", + "#ol_huaxin:die": "死国,甚无谓也!", + "#bolan1": "博览群书,融会贯通。", + "#bolan2": "博览于文,约之以礼。", + "#yifa1": "仪法不明,则实不称名。", + "#yifa2": "仪法明晰,则长治久安。", + "#zhongyan:die": "嗟尔姜任,邈不我留。", + "#zhongyun1": "秉公行事,无所亲疏。", + "#zhongyun2": "明晰法理,通晓人情。", + "#shenpin1": "考其遗法,肃若神明。", + "#shenpin2": "气韵生动,出于天成。", + "#weiguan:die": "辞荣善终,不可求……", + "#chexuan1": "兵车疾动,以悬敌首!", + "#chexuan2": "层层布设,以多胜强!", + "#qiangshou": null, + "#qiangshou1": null, + "#qiangshou2": null, + "#cheliji:die": "元气已伤,不如归去……", + "#caiwang1": "干虽静退,性乖恒理。", + "#caiwang2": "绥怀之称,监守邺城。", + "#naxiang1": "奉命伐吴,得胜纳降。", + "#naxiang2": "进军逼江,震慑吴贼。", + "#simazhou:die": "恩赐重物,病身难消受……", + "#qiaoyan": null, + "#qiaoyan1": "此事不宜迟,在于速决。", + "#qiaoyan2": "公若到彼,贵不可言。", + "#xianzhu": null, + "#xianzhu1": "馈珠之恩,望将军莫忘。", + "#xianzhu2": "愿以珠为礼,与卿交好,而休刀兵。", + "#ol_lisu:die": "忘恩负义之徒!", + "#huirong": null, + "#huirong1": "红尘洗练,慧容不改。", + "#huirong2": "花貌易改,福惠长存。", + "#ciwei": null, + "#ciwei1": "乃家乃邦,是则是效。", + "#ciwei2": "其慈有威,不舒不暴。", + "#caiyuan": null, + "#caiyuan1": "柳絮轻舞,撷芳赋诗。", + "#caiyuan2": "秀媛才德,知书达理。", + "#jin_yanghuiyu:die": "韶华易老,佳容不再……", + "#zhuosheng1": "才经世务,干用之绩。", + "#zhuosheng2": "器量之远,当至公辅。", + "#shibao:die": "寒门出身,难以擢升。", + "#huishi1": "你的想法,我已知晓。", + "#huishi2": "妾身慧眼,已看透太多。", + "#qingleng1": "冷冷清清,寂落沉沉。", + "#qingleng2": "冷月葬情,深雪埋伤。", + "#xuanmu1": "四门穆穆,八面莹澈。", + "#xuanmu2": "天色澄穆,心明清静。", + "#jin_zhangchunhua:die": "冷眸残情,孤苦为一人。", + "#buchen1": "螟蛉之光,安敢同日月争辉?", + "#buchen2": "巍巍隐帝,岂可为臣?", + "#smyyingshi1": "鹰扬千里,明察秋毫。", + "#smyyingshi2": "鸢飞戾天,目入百川。", + "#xiongzhi1": "烈士雄心,志存高远。", + "#xiongzhi2": "乱世之中,唯我司马!", + "#quanbian1": "筹权谋变,步步为营。", + "#quanbian2": "随机应变,谋国窃权。", + "#jin_simayi:die": "虎入骷冢,司马难兴。", + "#shiren": null, + "#shiren1": "宠过必乱,不可大任。", + "#shiren2": "开卷有益,识人有法", + "#yanxi": null, + "#yanxi1": "宴会嬉趣,其乐融融。", + "#yanxi2": "宴中趣玩,得遇知己。", + "#jin_wangyuanji:die": "祖父已逝,哀凄悲戚。", + "#tuishi1": "此僚怀异,召汝讨贼。", + "#tuishi2": "推令既出,焉敢不从?", + "#choufa1": "秣马厉兵,筹伐不臣!", + "#choufa2": "枕戈待旦,秣马征平。", + "#zhaoran1": "行昭然于世,赦众贼以威。", + "#zhaoran2": "吾之心思,路人皆知。", + "#chengwu": null, + "#chengwu1": "令行禁止,政通无虞。", + "#chengwu2": "上下一体,大业可筹。", + "#jin_simazhao:die": "司马三代,一梦成空……", + "#baoqie1": "宝箧藏玺,时局变动。", + "#baoqie2": "曹亡宝箧,尽露锋芒。", + "#jyishi1": "家庭和顺,夫妻和睦。", + "#jyishi2": "之子于归,宜其室家。", + "#shiduo1": "鉴识得体,气度雅涵。", + "#shiduo2": "宽容体谅,宽人益己。", + "#jin_xiahouhui:die": "夫君,你怎么对我如此狠心……", + "#taoyin1": "司马氏善谋、善忍,善置汝于绝境!", + "#taoyin2": "隐忍数载,亦不坠青云之志!", + "#yimie1": "汝大逆不道,当死无赦!", + "#yimie2": "斩草除根,灭其退路!", + "#ruilve1": "司马当兴,其兴在吾。", + "#ruilve2": "吾承父志,故知军事、通谋略。", + "#tairan1": "撼山易,撼我司马氏难。", + "#tairan2": "云卷云舒,处之泰然。", + "#jin_simashi:die": "子上,这是为兄给你打下的江山……", + "#xijue1": "承爵于父,安能辱之!", + "#xijue2": "虎父安有犬子乎?", + "#zhanghuyuechen:die": "儿有辱……父亲威名……", + "#sanchen": null, + "#sanchen1": "陈书弼国,当一而再、再而三。", + "#sanchen2": "勘除弼事,三陈而就。", + "#zhaotao": null, + "#zhaotao1": "奉诏伐吴,定鼎东南!", + "#zhaotao2": "三陈方得诏,一股下孙吴!", + "#duyu:die": "金瓯尚缺,死难瞑目……", +}; diff --git a/game/config.js b/game/config.js index 88307e503..7f52cea4a 100644 --- a/game/config.js +++ b/game/config.js @@ -130,7 +130,7 @@ window.config = { cards: ["standard", "extra"], characters: ["standard", "shenhua", "sp", "sp2", "yijiang", "refresh", "xinghuoliaoyuan", "mobile", "extra", "yingbian", "sb", "tw", "offline", "clan", "collab", "xianding", "huicui", "shiji", "jsrg", "onlyOL"], - moderned_chracters: ["key"], + moderned_chracters: ["standard", "shenhua", "sp", "sp2", "yijiang", "refresh", "xinghuoliaoyuan", "mobile", "extra", "yingbian", "sb", "tw", "offline", "clan", "collab", "xianding", "huicui", "shiji", "onlyOL", "jsrg", "old", "diy", "ddd", "key"], connect_characters: ["diy"], connect_cards: ["huanlekapai", "guozhan", "sp", "zhulu", "yingbian", "yongjian"], plays: [], diff --git a/noname/library/index.js b/noname/library/index.js index 45e38c623..bb22a84e9 100644 --- a/noname/library/index.js +++ b/noname/library/index.js @@ -13675,4 +13675,4 @@ setAllPropertiesEnumerable(lib.element.GameEvent.prototype); setAllPropertiesEnumerable(lib.element.Dialog.prototype); setAllPropertiesEnumerable(lib.element.Control.prototype); setAllPropertiesEnumerable(lib.element.Client.prototype); -setAllPropertiesEnumerable(lib.element.NodeWS.prototype); \ No newline at end of file +setAllPropertiesEnumerable(lib.element.NodeWS.prototype);